#include "pico/stdlib.h" #include "hardware/spi.h" #include "u8g2_pico.h" // SPI display pins #define SPI_PORT spi1 #define PIN_CS 13 #define PIN_SCK 10 #define PIN_MOSI 11 #define SPI_SPEED 8000 * 1000 // 10kHz #define PIN_DC 12 #define PIN_RST 14 uint8_t u8x8_byte_pico_hw_spi(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { uint8_t *data; switch (msg) { case U8X8_MSG_BYTE_SEND: data = (uint8_t *)arg_ptr; spi_write_blocking(SPI_PORT, data, arg_int); break; case U8X8_MSG_BYTE_INIT: u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_disable_level); break; case U8X8_MSG_BYTE_SET_DC: u8x8_gpio_SetDC(u8x8, arg_int); break; case U8X8_MSG_BYTE_START_TRANSFER: u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_enable_level); u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO,u8x8->display_info->post_chip_enable_wait_ns, NULL); break; case U8X8_MSG_BYTE_END_TRANSFER: u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->pre_chip_disable_wait_ns, NULL); u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_disable_level); break; default: return 0; } return 1; } uint8_t u8x8_gpio_and_delay_pico(u8x8_t *u8x8, uint8_t msg,uint8_t arg_int, void *arg_ptr) { switch (msg) { case U8X8_MSG_GPIO_AND_DELAY_INIT: spi_init(SPI_PORT, SPI_SPEED); gpio_set_function(PIN_CS, GPIO_FUNC_SIO); gpio_set_function(PIN_SCK, GPIO_FUNC_SPI); gpio_set_function(PIN_MOSI, GPIO_FUNC_SPI); gpio_init(PIN_RST); gpio_init(PIN_DC); gpio_init(PIN_CS); gpio_set_dir(PIN_RST, GPIO_OUT); gpio_set_dir(PIN_DC, GPIO_OUT); gpio_set_dir(PIN_CS, GPIO_OUT); gpio_put(PIN_RST, 1); gpio_put(PIN_CS, 1); gpio_put(PIN_DC, 0); break; case U8X8_MSG_DELAY_NANO: // delay arg_int * 1 nano second sleep_us(arg_int); // 1000 times slower, though generally fine in practice given rp2040 has no `sleep_ns()` break; case U8X8_MSG_DELAY_100NANO: // delay arg_int * 100 nano seconds sleep_us(arg_int); break; case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro seconds sleep_us(arg_int * 10); break; case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second sleep_ms(arg_int); break; case U8X8_MSG_GPIO_CS: // CS (chip select) pin: Output level in arg_int gpio_put(PIN_CS, arg_int); break; case U8X8_MSG_GPIO_DC: // DC (data/cmd, A0, register select) pin: Output level gpio_put(PIN_DC, arg_int); break; case U8X8_MSG_GPIO_RESET: // Reset pin: Output level in arg_int gpio_put(PIN_RST, arg_int); // printf("U8X8_MSG_GPIO_RESET %d\n", arg_int); break; default: u8x8_SetGPIOResult(u8x8, 1); // default return value break; } return 1; }