123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- +------------------------------------------+
- | 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
|