90 lines
2.1 KiB
Plaintext
90 lines
2.1 KiB
Plaintext
// Raspberry Pi Pico PIO program to output data to a TFT
|
|
// controller via a SPI output data path.
|
|
|
|
//"Set" set: 1 output pin, TFT_DC
|
|
// Side set: 1 output pin, TFT_SCLK
|
|
// Data set: 1 output pin, TFT_MOSI
|
|
|
|
.program tft_io
|
|
.side_set 1 opt ; The TFT_SCLK output.
|
|
|
|
// The C++ code switches between the 8 bits and 16 bits loops
|
|
// by waiting for the SM to be idle and setting its PC.
|
|
//
|
|
|
|
// 8 bit transfer
|
|
public start_8:
|
|
// Pull the next 32 bit value from the TX FIFO.
|
|
pull side 0
|
|
// Lose the top 24 bits, send 1st bit
|
|
out pins, 25
|
|
// Now send remaining bits
|
|
jmp spi_out side 1
|
|
|
|
public set_addr_window:
|
|
// Loop count in x for caset, paset and ramwr
|
|
set x, 2 side 0
|
|
pull_cmd:
|
|
// Set DC low
|
|
set pins, 0
|
|
// Fetch and output LS byte (caset, paset or ramwr), discarding top 24 bits, set WR low
|
|
pull side 0
|
|
out pins, 25
|
|
nop side 1
|
|
next_cmd_bit:
|
|
out pins, 1 side 0
|
|
jmp !osre, next_cmd_bit side 1
|
|
// Set DC high
|
|
set pins, 1 side 0
|
|
// Finish if 3rd cmd byte ramwr sent (x == 0)
|
|
jmp !x, start_16
|
|
pull
|
|
next_xy:
|
|
// send 32 bit start and end coordinates
|
|
out pins, 1 side 0
|
|
jmp !osre, next_xy side 1
|
|
// Loop back for next command
|
|
jmp x--, pull_cmd side 0
|
|
// End
|
|
jmp start_16
|
|
|
|
public block_fill:
|
|
// Fetch colour value
|
|
pull side 0
|
|
// Move colour to x
|
|
mov x, osr
|
|
// Fetch pixel count
|
|
pull
|
|
// Move pixel count to y
|
|
mov y, osr
|
|
next_16:
|
|
// Copy colour value back into osr
|
|
mov osr, x side 0
|
|
// Lose the top 16 bits, send 1st bit
|
|
out pins, 17 side 0
|
|
nop side 1
|
|
next_bit:
|
|
// Output next 15 colour bits
|
|
out pins, 1 side 0
|
|
// Set TFT_SCLK high and jump for next bit
|
|
jmp !osre, next_bit side 1
|
|
// Decrement count and loop
|
|
jmp y--, next_16 side 0
|
|
// Now drop back to 16 bit output
|
|
|
|
.wrap_target
|
|
public start_16:
|
|
// Pull the next 32 bit value from the TX FIFO.
|
|
// Send the bottom 16 bits
|
|
pull side 0
|
|
// Drop the first 16 bits, write first bit
|
|
out pins, 17 side 0
|
|
nop side 1
|
|
spi_out:
|
|
// Output the next 15 bits
|
|
out pins, 1 side 0
|
|
// Set TFT_SCLK high and jump for next bit
|
|
jmp !osre, spi_out side 1
|
|
// Return to start
|
|
.wrap
|