bRequestType bRequest wValue wIndex wLength
-
0xc0 0x02 offset 0x10a1 length+1Reads
lengthbytes of the EDID atoffset(big-endian). The response has 1 byte for the status (0x00 for success) and the EDID bytes follows. -
0xc0 0x02 offset<<8 0x00a1 2Reads 1 byte of the EDID at
offset. The response has 1 byte for the status (0x00 for success) and the EDID byte follows. -
0x40 0x03 0x0000 address lengthWrites
lengthbytes of RAM ataddress. -
0x40 0x03 param1&0xff param2&0xff 0Unknown, maybe some memory clear?
-
0xc0 0x04 0x0000 address lengthReads
lengthbytes of RAM ataddress. -
0xc0 0x05 0x0000 0x0002 4Seems to be a verification of the 0x5f descriptor. The reply is a 32 bits checksum of the descriptor, skipping the first 2 bytes (bLength and bDescriptorType).
-
0xc0 0x06 0x0000 0x0000 4Gets the status/capabilities of the device. The response is a uint32 (little-endian).
Bits Value Meaning 0 Reconfigure 0 No 1 Yes, descriptor 0x5f is required 7 ProtocolErrors 0 Yes 1 No 8-15 uint8 CfgRetries for Micro chip type, FifoStatus for FPGA chip type 16-18 Blanking 000 None 001 Black 011 Suspend 101 Standby 110 TempPowerOff 111 PowerOff 24 Color depths Meaning of values in register 0x00 0 0x00: 16 bits, 0x01: 24 bits, 0x0a: unknown, 0x0b: unknown 1 0x08: 16 bits, 0x09: 24 bits, 0x0c: unknown, 0x0d: unknown 28-29 Boot type 00 Micro 11 Standalone 30-31 Chip type 01 Micro 10 FPGA 11 Asic -
0x40 0x07 0x0000 offset 0 -
0x40 0x07 0x007f 0x0005 0 -
0x40 0x07 0x007f 0x0000 0 -
0xc0 0x08 0x0000 offset 1 -
0x40 0x0e 0x0005 0x0005 0 -
0x40 0x0e 0x000b 0x0005 0 -
0x40 0x10 0x0001 0x0000 0 -
0x40 0x11 0x0000 0x0000 0 -
0x40 0x12 0x0000 0x0000 16Sets the 128 bits encryption key.
-
0xc0 0x13 uint32_param&0xffff uint32_param>>16 4 -
0x40 0x14 0x0000 0x0000 0 -
0x40 0x15 0x0000 0x0381 0 -
0x40 0x15 0x0000 0x0881 0 -
0x40 0x15 0x0000 0x4000 0
This optional descriptor specifies the parameters of the device and what protocols are supported.
| Offset | Size | Field name | Value |
|---|---|---|---|
| 0 | 1 | bLength | total length |
| 1 | 1 | bDescriptorType | 0x5f |
| 2 | 2 | version | 0x0001 (LE) |
| 4 | 1 | dataLength | total length - 2 |
| Data piece | |||
| n+5 | 2 | type | piece type |
| n+7 | 1 | length | piece data length |
| n+8 | length | data | variable data |
| Type (LE) | Name | Data |
|---|---|---|
| 0x0000 | RenderingProtocolVersion | int16_le |
| 0x0001 | Raw mode | uint8 |
| 0x0002 | RL mode | uint8 |
| 0x0003 | RawRL mode | uint8 |
| 0x0004 | RLX mode | uint8 |
| 0x0005 | DIFF mode | uint8 |
| 0x0006 | DIFF padding | |
| 0x0007 | RDIFF flags | |
| 0x0100 | Ob type | |
| 0x0101 | Ob method | |
| 0x0102 | Ob taps | |
| 0x0103 | Ob length | |
| 0x0104 | Ob cycles | |
| 0x0200 | MaxArea | uint32_le |
| 0x0201 | MaxWidth | uint32_le |
| 0x0202 | MaxHeight | uint32_le |
| 0x0203 | MaxPixelClock | |
| 0x0204 | MinPixelClock | |
| 0x0300 | VideoRAMStart | |
| 0x0301 | VideoRAMEnd | |
| 0x0302 | RAMBandwidth | |
| 0x0400 | Chip ID | 4 bytes |
| 0x0401 | ProtoEngineChannels | |
| 0x0402 | Min SW version | |
| 0x0403 | Min SW revision | |
| 0x0500 | ModeRegisterSize | |
| 0x0501 | BigEndianFrequency | |
| 0x0502 | SyncPulsePolarity688 | |
| 0x0600 | Extended EDID | |
| 0x0601 | AVI infoframe |
All commands starts with the byte 0xAF followed by the command opcode and variable-length data.
0xAF 0x20
address: uint8
value: uint80xAF 0x60
offset: uint24_be
count: uint8_wrap256
pixels: uint8_rgb323[count]0xAF 0x61
offset: uint24_be
total_count: uint8_wrap256
{
count: uint8_wrap256
pixel: uint8_rgb323
}[until total_count pixels is read]0xAF 0x62
target_offset: uint24_be
count: uint8_wrap256
source_offset: uint24_be0xAF 0x63
offset: uint24_be
total_count: uint8_wrap256
{
count: uint8_wrap256
pixel: uint8_rgb323[count]
last_pixel_repeat_count: uint8 // (omitted for the last chunk if all pixels are rendered)
}[until total_count pixels is read]0xAF 0x68
offset: uint24_be
count: uint8_wrap256
pixels: uint16_rgb565[count]0xAF 0x69
offset: uint24_be
total_count: uint8_wrap256
{
count: uint8_wrap256
pixel: uint16_rgb565
}[until total_count pixels is read]0xAF 0x6A
target_offset: uint24_be
count: uint8_wrap256
source_offset: uint24_be0xAF 0x6B
offset: uint24_be
total_count: uint8_wrap256
{
count: uint8_wrap256
pixel: uint16_rgb565be[count]
last_pixel_repeat_count: uint8 // (omitted for the last chunk if all pixels are read)
}[until total_count pixels is read]0xAF 0x70
offset: uint24_be
total_count: uint8_wrap256
table_lookup: bit[until total_count pixels is read]0xAF 0x78
offset: uint24_be
total_count: uint8_wrap256
table_lookup: bit[until total_count pixels is read]0xAF 0xA00xAF 0xAF0xAF 0xE0
header: 0x26 0x38 0x71 0xCD
padding: uint16
length: uint16_be
entries: {
colorA: uint16_rgb565be
repeatA: uint8
unknownA: uint3_msb
jumpA_msb: uint5_lsb
jumpA_lsb: uint4_msb
jumpB_lsb: uint4_lsb
colorB: uint16_rgb565be
repeatB: uint8
unknownB: uint3_msb
jumpB_msb: uint5_lsb
}[length]| Memory | Size |
|---|---|
| RAM | 64 KiB |
| Registers | 256 Bytes |
| Graphics | 16 MiB |
| Offset | Size | Content |
|---|---|---|
| 0xC300 | 256 | Registers |
| Address | Type | Content |
|---|---|---|
| 0x00 | uint8 | Color depth |
| 0x01 | uint16_lfsr | XDisplayStart |
| 0x03 | uint16_lfsr | XDisplayEnd |
| 0x05 | uint16_lfsr | YDisplayStart |
| 0x07 | uint16_lfsr | YDisplayEnd |
| 0x09 | uint16_lfsr | XEndCount |
| 0x0B | uint16_lfsr | HSyncStart |
| 0x0D | uint16_lfsr | HSyncEnd |
| 0x0F | uint16_be | HPixels |
| 0x11 | uint16_lfsr | YEndCount |
| 0x13 | uint16_lfsr | VSyncStart |
| 0x15 | uint16_lfsr | VSyncEnd |
| 0x17 | uint16_be | VPixels |
| 0x1B | uint16_be | PixelClock5Khz |
| 0x1F | uint8 | Blank output |
| 0x20 | uint24_be | Base offset of 16 bits framebuffer |
| 0x23 | uint24_be | Line stride of 16 bits framebuffer |
| 0x26 | uint24_be | Base offset of 8 bits framebuffer |
| 0x29 | uint24_be | Line stride of 8 bits framebuffer |
| 0xFF | uint8 | Registers update |