Update 'USB protocol'
							parent
							
								
									5eaed940d5
								
							
						
					
					
						commit
						bcd746541c
					
				| 
						 | 
					@ -69,10 +69,79 @@ Note: the serial number matches the one on the sticker on the bottom of the plas
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Protocol
 | 
					### Protocol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The device operates in two (or three, depending on how you count) operting modes: bootloader mode (and authenticated bootloader mode), and application mode.
 | 
					The device operates in two (or three, depending on how you count) operting modes: bootloader mode (and authenticated bootloader mode), and application mode. By default, the device starts in 'unauthenticated' bootloader mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
In bootloader mode, you first have to send a magic number for the device (stored in the FT240X' EEPROM) to enable some functionality: when authenticated, in bootloader mode, you can access the Spartan-3AN's internal SPI flash, as well as maybe a few extra bits.
 | 
					In bootloader mode, you first have to send a magic number for the device (stored in the FT240X' EEPROM) to enable some functionality: when authenticated, in bootloader mode, you can access the Spartan-3AN's internal SPI flash, as well as maybe a few extra bits.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You can switch to application mode (and back to bootloader mode) at any time, however, allegedly (this is the behavior of the [ScanaPLUS](https://sigrok.org/wiki/IKALOGIC_ScanaPLUS) device, which has a similar setup) capturing samples (in application mode) will not work when not authenticated in bootloader mode. (TODO: does switching to bootloader mode from application mode bring you into authenticated mode when already authenticated before switching to application mode?)
 | 
					You can switch to application mode (and back to bootloader mode) at any time, however, allegedly (this is the behavior of the [ScanaPLUS](https://sigrok.org/wiki/IKALOGIC_ScanaPLUS) device, which has a similar setup) capturing samples (in application mode) will not work when not authenticated in bootloader mode. (TODO: does switching to bootloader mode from application mode bring you into authenticated mode when already authenticated before switching to application mode?)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TODO: document the commands of every mode
 | 
					A log of libftd2xx function calls from ScanaStudio, in various scenarios, is available [here](https://cloud.lain.faith/s/RpcBp89MA2LDqqY).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Commands are typically a one-byte command ID, followed by a variable amount of data bytes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Mode-independent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **`0xfd`: Get status/mode**
 | 
				
			||||||
 | 
					  * Arguments: *fixed* `0x00 0x01 0x02 0xfe`
 | 
				
			||||||
 | 
					  * Response:
 | 
				
			||||||
 | 
					    * Unauthenticated bootloader mode: `0x09 0x09 0x09 0x09`
 | 
				
			||||||
 | 
					    * Authenticated bootloader mode: `0x01 0x01 0x01 0x01`
 | 
				
			||||||
 | 
					    * Application mode: `0x22 0x22 0x22 0x22`
 | 
				
			||||||
 | 
					* **`0x93`: Reset to application mode**
 | 
				
			||||||
 | 
					  * No arguments
 | 
				
			||||||
 | 
					  * No response
 | 
				
			||||||
 | 
					* **`0x94`: Reset to bootloader mode**
 | 
				
			||||||
 | 
					  * No arguments
 | 
				
			||||||
 | 
					  * No response
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Bootloader mode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **`0xf1`: Send unlock/authentication code**
 | 
				
			||||||
 | 
					  * Arguments: 3 bytes from [FT240X EEPROM](FT240X-EEPROM) word locations `0x12:0x13`, followed by a *fixed* 23 zero bytes
 | 
				
			||||||
 | 
					  * No response
 | 
				
			||||||
 | 
					* **`0x90`: Spartan-3AN internal SPI flash chip select**
 | 
				
			||||||
 | 
					  * Arguments: *fixed* `0x00`
 | 
				
			||||||
 | 
					  * No response
 | 
				
			||||||
 | 
					* **`0x91`: Spartan-3AN internal SPI flash chip deselect**
 | 
				
			||||||
 | 
					  * Arguments: *fixed* `0x00`
 | 
				
			||||||
 | 
					  * No response
 | 
				
			||||||
 | 
					* **`0x92`: Spartan-3AN internal SPI flash chip data transfer**
 | 
				
			||||||
 | 
					  * Arguments: single byte to send (`0xff` for SPI read operations)
 | 
				
			||||||
 | 
					  * Response: single byte result of the SPI operation (garbage if the byte transferred was meant as a write)
 | 
				
			||||||
 | 
					  * Yes, SPI transfers are done byte-by-byte this way. For details on how to communicate with the Spartan-3AN internal flash, see [Xilinx docs (UG333)](https://www.xilinx.com/support/documentation/user_guides/ug333.pdf). See the "Example transfers" section below.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Application mode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TODO lol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Example transfers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### Spartan-3AN internal SPI flash read ID and status
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Flash ID:
 | 
				
			||||||
 | 
					  Send 0x90,0x00, no read data
 | 
				
			||||||
 | 
					  Send 0x92,0x9f, read 1 byte and discard it
 | 
				
			||||||
 | 
					  Send 0x92,0xff, read 1 data byte
 | 
				
			||||||
 | 
					  Send 0x92,0xff, read 1 data byte
 | 
				
			||||||
 | 
					  Send 0x91,0x00, no read data
 | 
				
			||||||
 | 
					Status:
 | 
				
			||||||
 | 
					  Send 0x90,0x00, no read data
 | 
				
			||||||
 | 
					  Send 0x92,0xd7, read 1 byte and discard it
 | 
				
			||||||
 | 
					  Send 0x92,0xff, read 1 data byte
 | 
				
			||||||
 | 
					  Send 0x91,0x00, no read data
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### Spartan-3AN internal SPI flash dump
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Send 0x90,0x00, no read data
 | 
				
			||||||
 | 
					Send 0x92,0x0b, read 1 byte and discard it
 | 
				
			||||||
 | 
					Send 0x92,0x00, read 1 byte and discard it
 | 
				
			||||||
 | 
					Send 0x92,0x00, read 1 byte and discard it
 | 
				
			||||||
 | 
					Send 0x92,0x00, read 1 byte and discard it
 | 
				
			||||||
 | 
					Send 0x92,0xff, read 1 byte and discard it
 | 
				
			||||||
 | 
					Repeat 135168 times:
 | 
				
			||||||
 | 
					  Send 0x92,0xff, read 1 data byte
 | 
				
			||||||
 | 
					Send 0x91,0x00, no read data
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
		Loading…
	
		Reference in New Issue