Changeset 1835

Show
Ignore:
Timestamp:
05/21/10 08:07:01 (2 years ago)
Author:
jwoithe
Message:

MOTU:

  • Implement optical mode control for G3/Mk3 devices. This is currently untested.
  • Fix bug from r1834 which broke streaming for all non-G3 MOTU devices (the wrong MOTU_PA_MK3_OPT_* value was used to force the port B test in addDirPorts() and getEventSize() to True for these devices).
  • Allow MOTU registers to be optionally absolute rather than relative to a notional base address. This is needed to accommodate some G3 registers which do not share the same base address as traditional MOTU registers.
  • Update G3 protocol document to include input and output control of optical port modes.
  • Note that streaming for non-G3 devices was broken by r1831 (optical_mode was used uninitialised to set flags). This was implicitly fixed by changes in r1834, but as noted above r1834 introduced a new bug which kept G1/G2 streaming broken until now.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/doc/motu_firewire_protocol-mk3.txt

    r1834 r1835  
    1131130xfffff0000c94. 
    114114 
    115   Bit 17: optical port B mode (0=ADAT, 1=Toslink) 
    116   Bit 16: optical port A mode (0=ADAT, 1=Toslink) 
    117   Bit  1: optical port B enabled (0=disabled, 1=enabled) 
    118   Bit  0: optical port A enabled (0=disabled, 1=enabled) 
     115  Bit 22: optical port B output mode (0=ADAT, 1=Toslink) 
     116  Bit 20: optical port B input mode (0=ADAT, 1=Toslink) 
     117  Bit 18: optical port A output mode (0=ADAT, 1=Toslink) 
     118  Bit 16: optical port A input mode (0=ADAT, 1=Toslink) 
     119  Bit  9: optical port B output enabled (0=disabled, 1=enabled) 
     120  Bit  8: optical port A output enabled (0=disabled, 1=enabled) 
     121  Bit  1: optical port B input enabled (0=disabled, 1=enabled) 
     122  Bit  0: optical port A input enabled (0=disabled, 1=enabled) 
    119123 
    120124Other areas of the driver also appear to refresh the device status with 
  • trunk/libffado/src/motu/motu_avdevice.cpp

    r1834 r1835  
    14741474 
    14751475    if (getDeviceGeneration() == MOTU_DEVICE_G3) { 
    1476         /* FIXME */ 
    1477         debugOutput(DEBUG_LEVEL_INFO, "Optical mode control not implemented for Mark3/G3 devices yet"); 
    1478         *port_a_mode = *port_b_mode = MOTU_OPTICAL_MODE_ADAT; 
     1476        unsigned int mask, enable, toslink; 
     1477        reg = ReadRegister(MOTU_G3_REG_OPTICAL_CTRL); 
     1478        if (port_a_mode != NULL) { 
     1479            mask = (dir==MOTU_DIR_IN)?MOTU_G3_OPT_A_IN_MASK:MOTU_G3_OPT_A_OUT_MASK; 
     1480            enable = (dir==MOTU_DIR_IN)?MOTU_G3_OPT_A_IN_ENABLE:MOTU_G3_OPT_A_OUT_ENABLE; 
     1481            toslink = (dir==MOTU_DIR_IN)?MOTU_G3_OPT_A_IN_TOSLINK:MOTU_G3_OPT_A_OUT_TOSLINK; 
     1482            if ((reg & enable) == 0) 
     1483              *port_a_mode = MOTU_OPTICAL_MODE_OFF; 
     1484            else 
     1485            if ((reg * toslink) == 0) 
     1486              *port_a_mode = MOTU_OPTICAL_MODE_TOSLINK; 
     1487            else 
     1488              *port_a_mode = MOTU_OPTICAL_MODE_ADAT; 
     1489        } 
     1490        if (port_b_mode != NULL) { 
     1491            mask = (dir==MOTU_DIR_IN)?MOTU_G3_OPT_B_IN_MASK:MOTU_G3_OPT_B_OUT_MASK; 
     1492            enable = (dir==MOTU_DIR_IN)?MOTU_G3_OPT_B_IN_ENABLE:MOTU_G3_OPT_B_OUT_ENABLE; 
     1493            toslink = (dir==MOTU_DIR_IN)?MOTU_G3_OPT_B_IN_TOSLINK:MOTU_G3_OPT_B_OUT_TOSLINK; 
     1494            if ((reg & enable) == 0) 
     1495              *port_b_mode = MOTU_OPTICAL_MODE_OFF; 
     1496            else 
     1497            if ((reg * toslink) == 0) 
     1498              *port_b_mode = MOTU_OPTICAL_MODE_TOSLINK; 
     1499            else 
     1500              *port_b_mode = MOTU_OPTICAL_MODE_ADAT; 
     1501        } 
    14791502        return 0; 
    14801503    } 
     
    15241547    } 
    15251548 
     1549    /* The G3 devices are also quite a bit different to the G2 units */ 
    15261550    if (getDeviceGeneration() == MOTU_DEVICE_G3) { 
    1527         /* FIXME */ 
    1528         debugOutput(DEBUG_LEVEL_INFO, "Optical mode control not implemented for Mark3/G3 devices yet"); 
    1529         return 0; 
     1551        unsigned int mask, enable, toslink; 
     1552        reg = ReadRegister(MOTU_G3_REG_OPTICAL_CTRL); 
     1553        if (port_a_mode != MOTU_OPTICAL_MODE_KEEP) { 
     1554            mask = enable = toslink = 0; 
     1555            if (dir & MOTU_DIR_IN) { 
     1556                 mask |= MOTU_G3_OPT_A_IN_MASK; 
     1557                 enable |= MOTU_G3_OPT_A_IN_ENABLE; 
     1558                 toslink |= MOTU_G3_OPT_A_IN_TOSLINK; 
     1559            } 
     1560            if (dir & MOTU_DIR_OUT) { 
     1561                 mask |= MOTU_G3_OPT_A_OUT_MASK; 
     1562                 enable |= MOTU_G3_OPT_A_OUT_ENABLE; 
     1563                 toslink |= MOTU_G3_OPT_A_OUT_TOSLINK; 
     1564            } 
     1565            reg = (reg & ~mask) | enable; 
     1566            switch (port_a_mode) { 
     1567                case MOTU_OPTICAL_MODE_OFF: reg &= ~enable; break; 
     1568                case MOTU_OPTICAL_MODE_TOSLINK: reg |= toslink; break; 
     1569            } 
     1570        } 
     1571        if (port_b_mode != MOTU_OPTICAL_MODE_KEEP) { 
     1572            mask = enable = toslink = 0; 
     1573            if (dir & MOTU_DIR_IN) { 
     1574                 mask |= MOTU_G3_OPT_B_IN_MASK; 
     1575                 enable |= MOTU_G3_OPT_B_IN_ENABLE; 
     1576                 toslink |= MOTU_G3_OPT_B_IN_TOSLINK; 
     1577            } 
     1578            if (dir & MOTU_DIR_OUT) { 
     1579                 mask |= MOTU_G3_OPT_B_OUT_MASK; 
     1580                 enable |= MOTU_G3_OPT_B_OUT_ENABLE; 
     1581                 toslink |= MOTU_G3_OPT_B_OUT_TOSLINK; 
     1582            } 
     1583            reg = (reg & ~mask) | enable; 
     1584            switch (port_a_mode) { 
     1585                case MOTU_OPTICAL_MODE_OFF: reg &= ~enable; break; 
     1586                case MOTU_OPTICAL_MODE_TOSLINK: reg |= toslink; break; 
     1587            } 
     1588            reg = (reg & ~mask) | enable; 
     1589            switch (port_b_mode) { 
     1590                case MOTU_OPTICAL_MODE_OFF: reg &= ~enable; break; 
     1591                case MOTU_OPTICAL_MODE_TOSLINK: reg |= toslink; break; 
     1592            } 
     1593        } 
     1594        return WriteRegister(MOTU_G3_REG_OPTICAL_CTRL, reg); 
    15301595    } 
    15311596 
     
    16171682    } 
    16181683    switch (optical_mode_b) { 
    1619         case MOTU_OPTICAL_MODE_NONE: flags |= MOTU_PA_MK3_OPT_ANY; break; 
     1684        case MOTU_OPTICAL_MODE_NONE: flags |= MOTU_PA_MK3_OPT_B_ANY; break; 
    16201685        case MOTU_OPTICAL_MODE_OFF: flags |= MOTU_PA_MK3_OPT_B_OFF; break; 
    16211686        case MOTU_OPTICAL_MODE_ADAT: flags |= MOTU_PA_MK3_OPT_B_ADAT; break; 
     
    16311696         */ 
    16321697        if (optical_mode_b == MOTU_OPTICAL_MODE_NONE) { 
    1633             port_flags |= MOTU_PA_MK3_OPT_ANY; 
     1698            port_flags |= MOTU_PA_MK3_OPT_B_ANY; 
    16341699        } 
    16351700        if (( port_flags & dir ) && 
     
    17001765    } 
    17011766    switch (optical_b_mode) { 
    1702         case MOTU_OPTICAL_MODE_NONE: flags |= MOTU_PA_MK3_OPT_ANY; break; 
     1767        case MOTU_OPTICAL_MODE_NONE: flags |= MOTU_PA_MK3_OPT_B_ANY; break; 
    17031768        case MOTU_OPTICAL_MODE_OFF: flags |= MOTU_PA_MK3_OPT_B_OFF; break; 
    17041769        case MOTU_OPTICAL_MODE_ADAT: flags |= MOTU_PA_MK3_OPT_B_ADAT; break; 
     
    17241789         */ 
    17251790        if (optical_b_mode == MOTU_OPTICAL_MODE_NONE) 
    1726             port_flags |= MOTU_PA_MK3_OPT_ANY; 
     1791            port_flags |= MOTU_PA_MK3_OPT_B_ANY; 
    17271792 
    17281793        if (( port_flags & dir ) && 
     
    17421807/* ======================================================================== */ 
    17431808 
    1744 unsigned int MotuDevice::ReadRegister(unsigned int reg) { 
     1809unsigned int MotuDevice::ReadRegister(fb_nodeaddr_t reg) { 
    17451810/* 
    17461811 * Attempts to read the requested register from the MOTU. 
    17471812 */ 
    17481813 
    1749   quadlet_t quadlet; 
    1750  
    1751   quadlet = 0; 
    1752   // Note: 1394Service::read() expects a physical ID, not the node id 
    1753   if (get1394Service().read(0xffc0 | getNodeId(), MOTU_BASE_ADDR+reg, 1, &quadlet) <= 0) { 
    1754     debugError("Error doing motu read from register 0x%06x\n",reg); 
    1755   } 
    1756  
    1757   return CondSwapFromBus32(quadlet); 
    1758 
    1759  
    1760 signed int MotuDevice::WriteRegister(unsigned int reg, quadlet_t data) { 
     1814    quadlet_t quadlet = 0; 
     1815 
     1816    /* If the supplied register has no upper bits set assume it's a G1/G2 
     1817     * register which is assumed to be relative to MOTU_REG_BASE_ADDR. 
     1818     */ 
     1819    if ((reg & MOTU_REG_BASE_ADDR) == 0) 
     1820        reg |= MOTU_REG_BASE_ADDR; 
     1821 
     1822    // Note: 1394Service::read() expects a physical ID, not the node id 
     1823    if (get1394Service().read(0xffc0 | getNodeId(), reg, 1, &quadlet) <= 0) { 
     1824        debugError("Error doing motu read from register 0x%012llx\n",reg); 
     1825    } 
     1826 
     1827    return CondSwapFromBus32(quadlet); 
     1828
     1829 
     1830signed int MotuDevice::WriteRegister(fb_nodeaddr_t reg, quadlet_t data) { 
    17611831/* 
    17621832 * Attempts to write the given data to the requested MOTU register. 
    17631833 */ 
    17641834 
    1765   unsigned int err = 0; 
    1766   data = CondSwapToBus32(data); 
    1767  
    1768   // Note: 1394Service::write() expects a physical ID, not the node id 
    1769   if (get1394Service().write(0xffc0 | getNodeId(), MOTU_BASE_ADDR+reg, 1, &data) <= 0) { 
    1770     err = 1; 
    1771     debugError("Error doing motu write to register 0x%06x\n",reg); 
    1772   } 
    1773  
    1774   SleepRelativeUsec(100); 
    1775   return (err==0)?0:-1; 
    1776 
    1777  
    1778 
     1835    unsigned int err = 0; 
     1836    data = CondSwapToBus32(data); 
     1837 
     1838    /* If the supplied register has no upper bits set assume it's a G1/G2 
     1839     * register which is assumed to be relative to MOTU_REG_BASE_ADDR. 
     1840     */ 
     1841    if ((reg & MOTU_REG_BASE_ADDR) == 0) 
     1842        reg |= MOTU_REG_BASE_ADDR; 
     1843 
     1844    // Note: 1394Service::write() expects a physical ID, not the node id 
     1845    if (get1394Service().write(0xffc0 | getNodeId(), reg, 1, &data) <= 0) { 
     1846        err = 1; 
     1847        debugError("Error doing motu write to register 0x%012llx\n",reg); 
     1848    } 
     1849 
     1850    SleepRelativeUsec(100); 
     1851    return (err==0)?0:-1; 
     1852
     1853 
     1854
  • trunk/libffado/src/motu/motu_avdevice.h

    r1834 r1835  
    3636#include "motu_controls.h" 
    3737#include "motu_mark3_controls.h" 
    38  
    39 #define MOTU_BASE_ADDR               0xfffff0000000ULL 
    4038 
    4139/* Bitmasks and values used when setting MOTU device registers.  Note that 
     
    8078#define MOTU_METER_PROG_SRC_SHIFT    0 
    8179 
    82 /* Device registers */ 
     80/* Device registers.  The "base" registers (that is, those shared 
     81 * between the G1, G2 and G3 interfaces) are specified and assumed to 
     82 * be relative to MOTU_REG_BASE_ADDR.  The following block is notionally 
     83 * for G2 devices, although some of these are shared with G1 and G3  
     84 * units too. 
     85 */ 
     86#define MOTU_REG_BASE_ADDR         0xfffff0000000ULL 
    8387#define MOTU_REG_ISOCTRL           0x0b00 
    8488#define MOTU_REG_OPTICAL_CTRL      0x0b10 
     
    99103#define MOTU_G1_REG_ISOCTRL        0x0b10 
    100104 
    101 /* There's an unknown subtlety regarding the optical mode of the "generation 
     105/* Values written to registers in G1 devices. 
     106 * 
     107 * There's an unknown subtlety regarding the optical mode of the "generation 
    102108 * 1" devices such as the 828Mk1.  It seems that the same configuration 
    103109 * register setting is used for "off" and "adat" modes.  There must be more 
     
    142148#define MOTU_G1_MONIN_R_CH8        0x3000 
    143149 
    144 /* Mark3 device registers - these don't have MOTU_BASE_ADDR as the base 
    145  * address so for now we'll define them as absolute addresses.  The "Mark 3" 
    146  * (aka G3) devices share a number of control registers with the G2 devices.  
    147  * Where this occurs we just use the G2 definitions since there's little to 
    148  * be gained by adding duplicate defines. 
    149  */ 
    150 #define MOTU_MARK3_REG_MIXER     0xffff00010000LL 
     150/* Mark3 device registers - these don't always have MOTU_BASE_ADDR as the 
     151 * base address so for now we'll define them as absolute addresses.  The 
     152 * "Mark 3" (aka G3) devices share a number of control registers with the G2 
     153 * devices.  Where this occurs we just use the G2 definitions since there's 
     154 * little to be gained by adding duplicate defines. 
     155 */ 
     156#define MOTU_G3_REG_MIXER        0xffff00010000ULL 
     157#define MOTU_G3_REG_OPTICAL_CTRL 0xfffff0000c94ULL 
    151158 
    152159/* Mark3 (aka G3) register constants for cases where the G3 devices differ 
     
    164171#define MOTU_G3_CLKSRC_TOSLINK_A MOTU_G3_CLKSRC_OPTICAL_A 
    165172#define MOTU_G3_CLKSRC_TOSLINK_B MOTU_G3_CLKSRC_OPTICAL_A 
     173 
     174#define MOTU_G3_OPT_A_IN_ENABLE   0x00000001 
     175#define MOTU_G3_OPT_B_IN_ENABLE   0x00000002 
     176#define MOTU_G3_OPT_A_OUT_ENABLE  0x00000100 
     177#define MOTU_G3_OPT_B_OUT_ENABLE  0x00000200 
     178#define MOTU_G3_OPT_A_IN_TOSLINK  0x00010000  // If these mode bits are not  
     179#define MOTU_G3_OPT_A_OUT_TOSLINK 0x00040000  //   set the mode is ADAT if 
     180#define MOTU_G3_OPT_B_IN_TOSLINK  0x00100000  //   the port is enabled 
     181#define MOTU_G3_OPT_B_OUT_TOSLINK 0x00400000 
     182#define MOTU_G3_OPT_A_IN_MASK     (MOTU_G3_OPT_A_IN_ENABLE|MOTU_G3_OPT_A_IN_TOSLINK) 
     183#define MOTU_G3_OPT_A_OUT_MASK    (MOTU_G3_OPT_A_OUT_ENABLE|MOTU_G3_OPT_A_OUT_TOSLINK) 
     184#define MOTU_G3_OPT_B_IN_MASK     (MOTU_G3_OPT_B_IN_ENABLE|MOTU_G3_OPT_B_IN_TOSLINK) 
     185#define MOTU_G3_OPT_B_OUT_MASK    (MOTU_G3_OPT_B_OUT_ENABLE|MOTU_G3_OPT_B_OUT_TOSLINK) 
    166186 
    167187/* The following values are used when defining configuration structures and 
     
    387407 
    388408public: 
    389     unsigned int ReadRegister(unsigned int reg); 
    390     signed int WriteRegister(unsigned int reg, quadlet_t data); 
     409    unsigned int ReadRegister(fb_nodeaddr_t reg); 
     410    signed int WriteRegister(fb_nodeaddr_t reg, quadlet_t data); 
    391411 
    392412private: