+------------------------------------------+ | TI-GRAPH LINK USB cable (aka SilverLink) | | Informations | +------------------------------------------+ Link cable characteristics: --------------------------- - Name: 'TI-GRAPH LINK USB' - Manufacturer: 'Texas Instruments Corporated' - VID/PID: 0x0451/0xe001 - Firmware revision: 1.03 - Internal µC: CY7C64013 (Cypress Semiconductors) USB related things: ------------------- The cable is a full-speed (FS, 12Mbit/s) device, USB1.1 compliant, under a proprietary class. It does not fit into any existing class (HID, printer, ...) then it requires a specific device driver. The device uses 'Bulk' mode for data transfers. There are two bulk endpoints (IN & OUT) and one control endpoint (mandatory). Transfers are achieved by packets. The endpoints advertise a maximum packet size of 32 bytes but data are usually transfered as 256-bytes chunks (URBs) by TI-Connect. Ti-Connect behaviour: --------------------- The TI-Connect software systematically do the following sequence: - reset both pipes (IN & OUT), - try to read 1024 bytes (probably for flushing IN pipe), - reset the pipes again (URB_FUNCTION_RESET_PIPE) before transfering anything. This information was got by sniffing with UsbSnoopy/SniffUSB. The TI's driver does not use Power Management. Link cable and/or driver behaviour: ----------------------------------- This section aims to give some importants informations. Without them, the driver will be working badly and/or poorly. This cable has a specific behaviour which appeared to be the same on both Linux & Windows. Although the maximum packet size is 32 bytes, you can not read/write bytes as you want. 1°) reset: it's better to close and reopen driver after each transfer or resets both pipes before each transfer (see TI-Connect behaviour). 2°) read: you have to systematically read an 32-bytes block even if you know that you just need to get 4 bytes. A shorter read will lost the other bytes. => solution: bufferize reading by getting a 32 byte block and processing it. 3°) quirk: the read (Linux) or the ReadFile (Win32) function can sometimes returns with neither data nor error. This quirk randomly appears in transfers but almost occurs when getting the TI89 ID-LIST. A guy told me it was specific to Cypress devices. => solution: retry a read/ReadFile access. [ 4°) write: you can send how many bytes you want: from 1 to 32 bytes. Theoritically, it is better to send a block of bytes rather than byte per byte. This is less CPU consuming for USB layers & OS. Practically, transfers are more reliable if we send byte per byte because the calc have enough time for replying. But, the transfer rate decreases significantly (1KB/s instead of 5KB/s when sending FLASH app/os). Using full transfer triggers some transfer interruptions. => solution: bufferize writing by sending block at once if it's full and sending it byte per byte when the block is incomplete. Exception: if this block is the last one of a transfer (just before switching in receive mode), send it byte per byte. ] -> not true any longer By following these 4 rules, I got good drivers for both Linux & Windows. Identity card (Linux log): -------------------------- Manufacturer: Texas Instruments Incorporated Product: TI-GRAPH LINK USB usb.c: unhandled interfaces on device usb.c: USB device 2 (vend/prod 0x451/0xe001) is not claimed by any active driver. Length = 18 DescriptorType = 01 USB version = 1.10 Vendor:Product = 0451:e001 MaxPacketSize0 = 8 NumConfigurations = 1 Device version = 1.03 Device Class:SubClass:Protocol = 00:00:00 Per-interface classes Configuration: bLength = 9 bDescriptorType = 02 wTotalLength = 0020 bNumInterfaces = 01 bConfigurationValue = 01 iConfiguration = 00 bmAttributes = a0 MaxPower = 100mA Interface: 0 Alternate Setting: 0 bLength = 9 bDescriptorType = 04 bInterfaceNumber = 00 bAlternateSetting = 00 bNumEndpoints = 02 bInterface Class:SubClass:Protocol = ff:00:00 iInterface = 00 Endpoint: bLength = 7 bDescriptorType = 05 bEndpointAddress = 81 (in) bmAttributes = 02 (Bulk) wMaxPacketSize = 0020 bInterval = 00 Endpoint: bLength = 7 bDescriptorType = 05 bEndpointAddress = 02 (out) bmAttributes = 02 (Bulk) wMaxPacketSize = 0020 bInterval = 00 Author: ------- (C) Romain Liévin, developer of TiLP & TiEmu. July the 23th, 2005