/* FreeRTOS */ #include "FreeRTOS.h" #include "task.h" /* SDK drivers */ #include "fsl_lpspi.h" /* Board */ #include "board.h" #include "clock_config.h" #include "peripherals.h" #include "pin_mux.h" /* LCD */ #include "app_lcd_impl.h" int app_lcd_impl_init(void *handle) { CLOCK_EnableClock(kCLOCK_Lpspi4); lpspi_master_config_t spi_cfg; LPSPI_MasterGetDefaultConfig(&spi_cfg); spi_cfg.baudRate = 24000000UL; LPSPI_MasterInit(LPSPI4, &spi_cfg, CLOCK_GetClockRootFreq(kCLOCK_LpspiClkRoot)); return 0; } epd_ret_t app_lcd_impl_write_command(void *handle, uint8_t *command, uint32_t len) { lpspi_transfer_t xfer = { .txData = command, .dataSize = 1U, .configFlags = kLPSPI_MasterPcsContinuous, }; GPIO_WritePinOutput(BOARD_LCD_DC_GPIO, BOARD_INITLCDSPIPINS_DC_PIN, 0U); status_t ret = LPSPI_MasterTransferBlocking(LPSPI4, &xfer); if (ret != kStatus_Success) { return EPD_FAIL; } if (len > 1) { GPIO_WritePinOutput(BOARD_LCD_DC_GPIO, BOARD_INITLCDSPIPINS_DC_PIN, 1U); xfer.txData = &command[1]; xfer.dataSize = len - 1; ret = LPSPI_MasterTransferBlocking(LPSPI4, &xfer); if (ret != kStatus_Success) { return EPD_FAIL; } } return EPD_OK; } epd_ret_t app_lcd_impl_write_data(void *handle, const uint8_t *data, uint32_t len) { lpspi_transfer_t xfer = { .txData = (uint8_t *)data, .dataSize = len, .configFlags = kLPSPI_MasterPcsContinuous, }; GPIO_WritePinOutput(BOARD_LCD_DC_GPIO, BOARD_INITLCDSPIPINS_DC_PIN, 1U); status_t ret = LPSPI_MasterTransferBlocking(LPSPI4, &xfer); if (ret != kStatus_Success) { return EPD_FAIL; } return EPD_OK; } epd_ret_t app_lcd_impl_delay(void *handle, uint32_t msec) { vTaskDelay(pdMS_TO_TICKS(msec)); return EPD_OK; }