Changeset 1845

Show
Ignore:
Timestamp:
06/01/10 18:11:42 (2 years ago)
Author:
jwoithe
Message:

MOTU: The bits in the rate control register used to control the sample rate have changed in G3 devices, so allow for this.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/src/motu/motu_avdevice.cpp

    r1843 r1845  
    695695    const char *src_name; 
    696696    quadlet_t q, new_rate=0xffffffff; 
    697     int i, supported=true, cancel_adat=false; 
     697    signed int i, supported=true, cancel_adat=false; 
    698698    quadlet_t reg; 
     699    unsigned int rate_mask = 0; 
    699700    unsigned int old_clock_src = getHwClockSource(); 
    700701    signed int device_gen = getDeviceGeneration(); 
     
    749750    reg = ReadRegister(MOTU_REG_CLK_CTRL); 
    750751 
    751     /* Control of sampling rate is the same for both G2 and G3 devices */ 
    752     switch ( samplingFrequency ) { 
    753         case -1: 
    754             break; 
    755         case 44100: 
    756             new_rate = MOTU_RATE_BASE_44100 | MOTU_RATE_MULTIPLIER_1X; 
    757             break; 
    758         case 48000: 
    759             new_rate = MOTU_RATE_BASE_48000 | MOTU_RATE_MULTIPLIER_1X; 
    760             break; 
    761         case 88200: 
    762             new_rate = MOTU_RATE_BASE_44100 | MOTU_RATE_MULTIPLIER_2X; 
    763             break; 
    764         case 96000: 
    765             new_rate = MOTU_RATE_BASE_48000 | MOTU_RATE_MULTIPLIER_2X; 
    766             break; 
    767         case 176400: 
    768             new_rate = MOTU_RATE_BASE_44100 | MOTU_RATE_MULTIPLIER_4X; 
    769             cancel_adat = true;  // current ADAT protocol doesn't support sample rate > 96000 
    770             break; 
    771         case 192000: 
    772             new_rate = MOTU_RATE_BASE_48000 | MOTU_RATE_MULTIPLIER_4X; 
    773             cancel_adat = true; 
    774             break; 
    775         default: 
    776             supported=false; 
     752    /* The method of controlling the sampling rate is the same for G2/G3  
     753     * devices but the actual bits used in the rate control register differ. 
     754     */ 
     755    if (device_gen == MOTU_DEVICE_G2) { 
     756        rate_mask = MOTU_RATE_BASE_MASK | MOTU_RATE_MULTIPLIER_MASK; 
     757        switch ( samplingFrequency ) { 
     758            case -1: break; 
     759            case 44100: new_rate = MOTU_RATE_BASE_44100 | MOTU_RATE_MULTIPLIER_1X; break; 
     760            case 48000: new_rate = MOTU_RATE_BASE_48000 | MOTU_RATE_MULTIPLIER_1X; break; 
     761            case 88200: new_rate = MOTU_RATE_BASE_44100 | MOTU_RATE_MULTIPLIER_2X; break; 
     762            case 96000: new_rate = MOTU_RATE_BASE_48000 | MOTU_RATE_MULTIPLIER_2X; break; 
     763            case 176400: new_rate = MOTU_RATE_BASE_44100 | MOTU_RATE_MULTIPLIER_4X; break; 
     764            case 192000: new_rate = MOTU_RATE_BASE_48000 | MOTU_RATE_MULTIPLIER_4X; break; 
     765            default: 
     766                supported=false; 
     767        } 
     768    } else  
     769    if (device_gen == MOTU_DEVICE_G3) { 
     770        rate_mask = MOTU_G3_RATE_BASE_MASK | MOTU_G3_RATE_MULTIPLIER_MASK; 
     771        switch ( samplingFrequency ) { 
     772            case -1: break; 
     773            case 44100: new_rate = MOTU_G3_RATE_BASE_44100 | MOTU_G3_RATE_MULTIPLIER_1X; break; 
     774            case 48000: new_rate = MOTU_G3_RATE_BASE_48000 | MOTU_G3_RATE_MULTIPLIER_1X; break; 
     775            case 88200: new_rate = MOTU_G3_RATE_BASE_44100 | MOTU_G3_RATE_MULTIPLIER_2X; break; 
     776            case 96000: new_rate = MOTU_G3_RATE_BASE_48000 | MOTU_G3_RATE_MULTIPLIER_2X; break; 
     777            case 176400: new_rate = MOTU_G3_RATE_BASE_44100 | MOTU_G3_RATE_MULTIPLIER_4X; break; 
     778            case 192000: new_rate = MOTU_G3_RATE_BASE_48000 | MOTU_G3_RATE_MULTIPLIER_4X; break; 
     779            default: 
     780                supported=false; 
     781        } 
     782    } 
     783    /* ADAT output is only possible for sample rates up to 96 kHz.  For 
     784     * anything higher, force the ADAT channels off. 
     785     */ 
     786    if (samplingFrequency > 96000) { 
     787      cancel_adat = true; 
    777788    } 
    778789 
     
    796807        // Set up new frequency if requested 
    797808        if (new_rate != 0xffffffff) { 
    798             reg &= ~(MOTU_RATE_BASE_MASK|MOTU_RATE_MULTIPLIER_MASK)
     809            reg &= ~rate_mask
    799810            reg |= new_rate; 
    800811        } 
  • trunk/libffado/src/motu/motu_avdevice.h

    r1842 r1845  
    171171#define MOTU_G3_CLKSRC_TOSLINK_A MOTU_G3_CLKSRC_OPTICAL_A 
    172172#define MOTU_G3_CLKSRC_TOSLINK_B MOTU_G3_CLKSRC_OPTICAL_A 
     173 
     174#define MOTU_G3_RATE_BASE_44100       (0<<8) 
     175#define MOTU_G3_RATE_BASE_48000       (1<<8) 
     176#define MOTU_G3_RATE_MULTIPLIER_1X    (0<<9) 
     177#define MOTU_G3_RATE_MULTIPLIER_2X    (1<<9) 
     178#define MOTU_G3_RATE_MULTIPLIER_4X    (2<<9) 
     179#define MOTU_G3_RATE_BASE_MASK        (0x00000100) 
     180#define MOTU_G3_RATE_MULTIPLIER_MASK  (0x00000600) 
    173181 
    174182#define MOTU_G3_OPT_A_IN_ENABLE   0x00000001