Changeset 1833

Show
Ignore:
Timestamp:
05/17/10 04:42:30 (2 years ago)
Author:
jwoithe
Message:

MOTU: initial implementation of clock source control for "Mark 3" devices.

Files:

Legend:

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

    r1832 r1833  
    570570 
    571571    reg = ReadRegister(MOTU_REG_CLK_CTRL); 
    572     switch (reg & MOTU_G2_CLKSRC_MASK) { 
    573         case MOTU_G2_CLKSRC_INTERNAL: return MOTU_CLKSRC_INTERNAL; 
    574         case MOTU_G2_CLKSRC_ADAT_OPTICAL: return MOTU_CLKSRC_ADAT_OPTICAL; 
    575         case MOTU_G2_CLKSRC_SPDIF_TOSLINK: return MOTU_CLKSRC_SPDIF_TOSLINK; 
    576         case MOTU_G2_CLKSRC_SMPTE: return MOTU_CLKSRC_SMPTE; 
    577         case MOTU_G2_CLKSRC_WORDCLOCK: return MOTU_CLKSRC_WORDCLOCK; 
    578         case MOTU_G2_CLKSRC_ADAT_9PIN: return MOTU_CLKSRC_ADAT_9PIN; 
    579         case MOTU_G2_CLKSRC_AES_EBU: return MOTU_CLKSRC_AES_EBU; 
     572    if (getDeviceGeneration() == MOTU_DEVICE_G2) { 
     573        switch (reg & MOTU_G2_CLKSRC_MASK) { 
     574            case MOTU_G2_CLKSRC_INTERNAL: return MOTU_CLKSRC_INTERNAL; 
     575            case MOTU_G2_CLKSRC_ADAT_OPTICAL: return MOTU_CLKSRC_ADAT_OPTICAL; 
     576            case MOTU_G2_CLKSRC_SPDIF_TOSLINK: return MOTU_CLKSRC_SPDIF_TOSLINK; 
     577            case MOTU_G2_CLKSRC_SMPTE: return MOTU_CLKSRC_SMPTE; 
     578            case MOTU_G2_CLKSRC_WORDCLOCK: return MOTU_CLKSRC_WORDCLOCK; 
     579            case MOTU_G2_CLKSRC_ADAT_9PIN: return MOTU_CLKSRC_ADAT_9PIN; 
     580            case MOTU_G2_CLKSRC_AES_EBU: return MOTU_CLKSRC_AES_EBU; 
     581        } 
     582    } else { 
     583        /* Handle G3 devices */ 
     584        switch (reg & MOTU_G3_CLKSRC_MASK) { 
     585            case MOTU_G3_CLKSRC_INTERNAL: return MOTU_CLKSRC_INTERNAL; 
     586            case MOTU_G3_CLKSRC_SPDIF: return MOTU_CLKSRC_SPDIF_TOSLINK; 
     587            case MOTU_G3_CLKSRC_SMPTE: return MOTU_CLKSRC_SMPTE; 
     588            case MOTU_G3_CLKSRC_WORDCLOCK: return MOTU_CLKSRC_WORDCLOCK; 
     589            case MOTU_G3_CLKSRC_OPTICAL_A: return MOTU_CLKSRC_OPTICAL_A; 
     590            case MOTU_G3_CLKSRC_OPTICAL_B: return MOTU_CLKSRC_OPTICAL_B; 
     591        } 
    580592    } 
    581593    return MOTU_CLKSRC_NONE; 
     
    595607    quadlet_t reg; 
    596608    unsigned int old_clock_src = getHwClockSource(); 
     609    signed int device_gen = getDeviceGeneration(); 
    597610 
    598611    /* Don't touch anything if there's nothing to do */ 
     
    645658    reg = ReadRegister(MOTU_REG_CLK_CTRL); 
    646659 
     660    /* Control of sampling rate is the same for both G2 and G3 devices */ 
    647661    switch ( samplingFrequency ) { 
    648662        case -1: 
     
    697711        // Set up new clock source if required 
    698712        if (clock_source != MOTU_CLKSRC_UNCHANGED) { 
    699             reg &= ~MOTU_G2_CLKSRC_MASK; 
    700             switch (clock_source) { 
    701               case MOTU_CLKSRC_INTERNAL: reg |= MOTU_G2_CLKSRC_INTERNAL; break; 
    702               case MOTU_CLKSRC_ADAT_OPTICAL: reg |= MOTU_G2_CLKSRC_ADAT_OPTICAL; break; 
    703               case MOTU_CLKSRC_SPDIF_TOSLINK: reg |= MOTU_G2_CLKSRC_SPDIF_TOSLINK; break; 
    704               case MOTU_CLKSRC_SMPTE: reg |= MOTU_G2_CLKSRC_SMPTE; break; 
    705               case MOTU_CLKSRC_WORDCLOCK: reg |= MOTU_G2_CLKSRC_WORDCLOCK; break; 
    706               case MOTU_CLKSRC_ADAT_9PIN: reg |= MOTU_G2_CLKSRC_ADAT_9PIN; break; 
    707               case MOTU_CLKSRC_AES_EBU: reg |= MOTU_G2_CLKSRC_AES_EBU; break; 
     713            if (device_gen == MOTU_DEVICE_G2) { 
     714                reg &= ~MOTU_G2_CLKSRC_MASK; 
     715                switch (clock_source) { 
     716                    case MOTU_CLKSRC_INTERNAL: reg |= MOTU_G2_CLKSRC_INTERNAL; break; 
     717                    case MOTU_CLKSRC_ADAT_OPTICAL: reg |= MOTU_G2_CLKSRC_ADAT_OPTICAL; break; 
     718                    case MOTU_CLKSRC_SPDIF_TOSLINK: reg |= MOTU_G2_CLKSRC_SPDIF_TOSLINK; break; 
     719                    case MOTU_CLKSRC_SMPTE: reg |= MOTU_G2_CLKSRC_SMPTE; break; 
     720                    case MOTU_CLKSRC_WORDCLOCK: reg |= MOTU_G2_CLKSRC_WORDCLOCK; break; 
     721                    case MOTU_CLKSRC_ADAT_9PIN: reg |= MOTU_G2_CLKSRC_ADAT_9PIN; break; 
     722                    case MOTU_CLKSRC_AES_EBU: reg |= MOTU_G2_CLKSRC_AES_EBU; break; 
     723                } 
     724            } else { 
     725                reg &= ~MOTU_G3_CLKSRC_MASK; 
     726                switch (clock_source) { 
     727                    case MOTU_CLKSRC_INTERNAL: reg |= MOTU_G3_CLKSRC_INTERNAL; break; 
     728                    case MOTU_CLKSRC_SPDIF_TOSLINK: reg |= MOTU_G3_CLKSRC_SPDIF; break; 
     729                    case MOTU_CLKSRC_SMPTE: reg |= MOTU_G3_CLKSRC_SMPTE; break; 
     730                    case MOTU_CLKSRC_WORDCLOCK: reg |= MOTU_G3_CLKSRC_WORDCLOCK; break; 
     731                    case MOTU_CLKSRC_OPTICAL_A: reg |= MOTU_G3_CLKSRC_OPTICAL_A; break;  
     732                    case MOTU_CLKSRC_OPTICAL_B: reg |= MOTU_G3_CLKSRC_OPTICAL_B; break; 
     733                } 
    708734            } 
    709735        } else { 
     
    748774        // A write to the rate/clock control register requires the 
    749775        // textual name of the current clock source be sent to the 
    750         // clock source name registers. 
     776        // clock source name registers.  This appears to be the same for 
     777        // both G2 and G3 devices. 
    751778        switch (clock_source) { 
    752779            case MOTU_CLKSRC_INTERNAL: 
     
    777804                src_name = "AES-EBU         "; 
    778805                break; 
     806            case MOTU_CLKSRC_OPTICAL_A: { 
     807                unsigned int p0_mode; 
     808                getOpticalMode(MOTU_DIR_IN, &p0_mode, NULL); 
     809                if (p0_mode == MOTU_OPTICAL_MODE_TOSLINK) 
     810                    src_name = "Toslink-A       "; 
     811                else 
     812                    src_name = "ADAT-A Optical  "; 
     813                break; 
     814            } 
     815            case MOTU_CLKSRC_OPTICAL_B: { 
     816                unsigned int p1_mode; 
     817                getOpticalMode(MOTU_DIR_IN, &p1_mode, NULL); 
     818                if (p1_mode == MOTU_OPTICAL_MODE_TOSLINK) 
     819                    src_name = "Toslink-B       "; 
     820                else 
     821                    src_name = "ADAT-B Optical  "; 
     822                break; 
     823            } 
    779824            default: 
    780825                src_name = "Unknown         "; 
     
    842887        case MOTU_CLKSRC_SPDIF_TOSLINK: 
    843888            s.type = eCT_SPDIF; 
    844             s.description = "SPDIF/Toslink"; 
     889            if (device_gen < MOTU_DEVICE_G3) 
     890                s.description = "SPDIF/Toslink"; 
     891            else 
     892                s.description = "SPDIF"; 
    845893            break; 
    846894        case MOTU_CLKSRC_SMPTE: 
     
    867915            s.valid = s.active = s.locked = (device_gen!=MOTU_DEVICE_G1); 
    868916            break; 
     917        case MOTU_CLKSRC_OPTICAL_A: 
     918            s.type = eCT_ADAT; 
     919            s.description = "ADAT/Toslink port A"; 
     920            break; 
     921        case MOTU_CLKSRC_OPTICAL_B: 
     922            s.type = eCT_ADAT; 
     923            s.description = "ADAT/Toslink port B"; 
     924            break; 
    869925        default: 
    870926            s.type = eCT_Invalid; 
     
    879935    FFADODevice::ClockSourceVector r; 
    880936    ClockSource s; 
     937    signed int device_gen = getDeviceGeneration(); 
    881938 
    882939    /* Form a list of clocks supported by MOTU interfaces */ 
     940 
     941    /* All interfaces support an internal clock */ 
    883942    s = clockIdToClockSource(MOTU_CLKSRC_INTERNAL); 
    884943    r.push_back(s); 
    885     s = clockIdToClockSource(MOTU_CLKSRC_ADAT_OPTICAL); 
    886     r.push_back(s); 
     944 
     945    if (device_gen == MOTU_DEVICE_G2) { 
     946        s = clockIdToClockSource(MOTU_CLKSRC_ADAT_OPTICAL); 
     947        r.push_back(s); 
     948    } 
     949 
    887950    s = clockIdToClockSource(MOTU_CLKSRC_SPDIF_TOSLINK); 
    888951    r.push_back(s); 
     
    891954    s = clockIdToClockSource(MOTU_CLKSRC_WORDCLOCK); 
    892955    r.push_back(s); 
    893     s = clockIdToClockSource(MOTU_CLKSRC_ADAT_9PIN); 
    894     r.push_back(s); 
     956 
     957    if (device_gen < MOTU_DEVICE_G3) { 
     958        s = clockIdToClockSource(MOTU_CLKSRC_ADAT_9PIN); 
     959        r.push_back(s); 
     960    } 
    895961    s = clockIdToClockSource(MOTU_CLKSRC_AES_EBU); 
    896962    r.push_back(s); 
     963 
     964    if (device_gen == MOTU_DEVICE_G3) { 
     965        s = clockIdToClockSource(MOTU_CLKSRC_OPTICAL_A); 
     966        r.push_back(s); 
     967        s = clockIdToClockSource(MOTU_CLKSRC_OPTICAL_B); 
     968        r.push_back(s); 
     969    } 
    897970 
    898971    return r; 
  • trunk/libffado/src/motu/motu_avdevice.h

    r1832 r1833  
    156156#define MOTU_G3_CLKSRC_INTERNAL  0x00000000 
    157157#define MOTU_G3_CLKSRC_WORDCLOCK 0x00000001 
    158 #define MOTU_G3_CLKSRC_SMTPE     0x00000002 
     158#define MOTU_G3_CLKSRC_SMPTE     0x00000002 
    159159#define MOTU_G3_CLKSRC_SPDIF     0x00000010 
    160160#define MOTU_G3_CLKSRC_OPTICAL_A 0x00000018 
     
    221221#define MOTU_CLKSRC_WORDCLOCK        4 
    222222#define MOTU_CLKSRC_ADAT_9PIN        5 
    223 #define MOTU_CLKSRC_AES_EBU          7 
    224 #define MOTU_CLKSRC_LAST             7 
     223#define MOTU_CLKSRC_AES_EBU          6 
     224#define MOTU_CLKSRC_OPTICAL_A        7 
     225#define MOTU_CLKSRC_OPTICAL_B        8 
     226#define MOTU_CLKSRC_LAST             8 
    225227#define MOTU_CLKSRC_NONE             0xffff 
    226228#define MOTU_CLKSRC_UNCHANGED        MOTU_CLKSRC_NONE