Changeset 1835
- Timestamp:
- 05/21/10 08:07:01 (2 years ago)
- Files:
-
- trunk/libffado/doc/motu_firewire_protocol-mk3.txt (modified) (1 diff)
- trunk/libffado/src/motu/motu_avdevice.cpp (modified) (7 diffs)
- trunk/libffado/src/motu/motu_avdevice.h (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libffado/doc/motu_firewire_protocol-mk3.txt
r1834 r1835 113 113 0xfffff0000c94. 114 114 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) 119 123 120 124 Other areas of the driver also appear to refresh the device status with trunk/libffado/src/motu/motu_avdevice.cpp
r1834 r1835 1474 1474 1475 1475 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 } 1479 1502 return 0; 1480 1503 } … … 1524 1547 } 1525 1548 1549 /* The G3 devices are also quite a bit different to the G2 units */ 1526 1550 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); 1530 1595 } 1531 1596 … … 1617 1682 } 1618 1683 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; 1620 1685 case MOTU_OPTICAL_MODE_OFF: flags |= MOTU_PA_MK3_OPT_B_OFF; break; 1621 1686 case MOTU_OPTICAL_MODE_ADAT: flags |= MOTU_PA_MK3_OPT_B_ADAT; break; … … 1631 1696 */ 1632 1697 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; 1634 1699 } 1635 1700 if (( port_flags & dir ) && … … 1700 1765 } 1701 1766 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; 1703 1768 case MOTU_OPTICAL_MODE_OFF: flags |= MOTU_PA_MK3_OPT_B_OFF; break; 1704 1769 case MOTU_OPTICAL_MODE_ADAT: flags |= MOTU_PA_MK3_OPT_B_ADAT; break; … … 1724 1789 */ 1725 1790 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; 1727 1792 1728 1793 if (( port_flags & dir ) && … … 1742 1807 /* ======================================================================== */ 1743 1808 1744 unsigned int MotuDevice::ReadRegister( unsigned int reg) {1809 unsigned int MotuDevice::ReadRegister(fb_nodeaddr_t reg) { 1745 1810 /* 1746 1811 * Attempts to read the requested register from the MOTU. 1747 1812 */ 1748 1813 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 1830 signed int MotuDevice::WriteRegister(fb_nodeaddr_t reg, quadlet_t data) { 1761 1831 /* 1762 1832 * Attempts to write the given data to the requested MOTU register. 1763 1833 */ 1764 1834 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 36 36 #include "motu_controls.h" 37 37 #include "motu_mark3_controls.h" 38 39 #define MOTU_BASE_ADDR 0xfffff0000000ULL40 38 41 39 /* Bitmasks and values used when setting MOTU device registers. Note that … … 80 78 #define MOTU_METER_PROG_SRC_SHIFT 0 81 79 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 83 87 #define MOTU_REG_ISOCTRL 0x0b00 84 88 #define MOTU_REG_OPTICAL_CTRL 0x0b10 … … 99 103 #define MOTU_G1_REG_ISOCTRL 0x0b10 100 104 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 102 108 * 1" devices such as the 828Mk1. It seems that the same configuration 103 109 * register setting is used for "off" and "adat" modes. There must be more … … 142 148 #define MOTU_G1_MONIN_R_CH8 0x3000 143 149 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 151 158 152 159 /* Mark3 (aka G3) register constants for cases where the G3 devices differ … … 164 171 #define MOTU_G3_CLKSRC_TOSLINK_A MOTU_G3_CLKSRC_OPTICAL_A 165 172 #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) 166 186 167 187 /* The following values are used when defining configuration structures and … … 387 407 388 408 public: 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); 391 411 392 412 private:
