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 | } |
---|
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); |
---|
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) { |
---|
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 | } |
---|