Fire_RT1021_Watch/src/app_impl_lcd.c

79 lines
1.9 KiB
C

/* 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_impl_lcd.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;
}