Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

LCD Protocol

This page contains the current state of the reverse engineered AOOSTAR display protocol.

See Linux shell commands how you can switch the display on and off with standard Linux commands.

  • Resolution: 960 × 376
  • Manufacturer: Synwit
  • Connected over USB UART with a proprietary serial communication protocol:
    • USB device ID: 416:90A1 (as shown by lsusb)
    • Linux device (example on Debian): /dev/ttyACM0
    • 1,500,000 baud, 8N1 (likely ignored; actual USB transfer speed is much higher)

Display Off

Request:

LCD off EBNF
@startebnf lcd_off
lcd_off = 0xAA, 0x55, 0xAA, 0x55, 0x0A, 0x00, 0x00, 0x00 ;
@endebnf

Response:

  • Success: character A
  • Error: unknown

Display On

Request:

LCD on EBNF
@startebnf lcd_on
lcd_on = 0xAA, 0x55, 0xAA, 0x55, 0x0B, 0x00, 0x00, 0x00 ;
@endebnf

Response:

  • Success: character A
  • Error: unknown

Note:

  • When switching the display on, the last displayed image is immediately shown.

Display Image

Request:

Send image EBNF
@startebnf send_image
send_image = img_cmd_start, { data_chunk }, img_cmd_end ;

img_cmd_start = 0xAA, 0x55, 0xAA, 0x55, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x2F, 0x00, 0x04, 0x0B, 0x00 ;
data_chunk = chunk_header, chunk_offset, rgb565_chunk ;
chunk_header = 0xAA, 0x55, 0xAA, 0x55, 0x08, 0x00, 0x00, 0x00 ;
chunk_offset = ? 32 bit offset in little-endian format ? ;
rgb565_chunk = 47 * ? byte image data in RGB565 format from given index ?;
img_cmd_end = 0xAA, 0x55, 0xAA, 0x55, 0x06, 0x00, 0x00, 0x00 ;
@endebnf

Response:

  • Success: character A
  • Error: unknown

Notes:

  • When sending an image to the screen, the image must be in RGB565 format (16 bits per pixel).
    • asterctl performs all graphic operations on an RGB888 image buffer.
    • asterctl automatically converts the image to RGB565 when sending it to the display.
  • The 1.5 Mbps baud rate set in the client is ignored, as actual USB bulk transfer achieves much higher throughput. For reference, at the nominal serial rate (~1,500,000 baud), it would take approximately 6 seconds to transfer a full image of 721,920 bytes (960 × 376 × 2):
    • Display protocol: payload per chunk = 47 bytes; header per chunk = 12 bytes
    • Number of chunks: 721,920 / 47 ≈ 15,360 chunks
    • Total transmitted data: 15,360 chunks × 59 bytes/chunk = 906,240 bytes
    • Serial frame format: 1 start bit + 8 data bits + 1 stop bit = 10 bits/byte
    • Effective byte rate: 1,500,000 bits/sec / 10 bits/byte = 150,000 bytes/sec
    • Transfer time: 906,240 bytes / 150,000 bytes/sec ≈ 6 seconds
  • Performance:
    • Displaying the first fullscreen image takes around 1.3 seconds.
    • Once the new image is fully transferred and the end-header command is sent, the display firmware switches to the new image.
  • Partial Updates:
    • asterctl uses a frame cache to send only changed chunks after the initial image is displayed, greatly speeding up partial screen updates.
    • The chunk size is 47 bytes, determined from the original app. It is unknown if other chunk sizes are supported.
    • There are no fractional chunks: 960x376 x 2 bytes/pixel / 47 bytes/chunk = 15360 chunks