96 lines
3.2 KiB
C
96 lines
3.2 KiB
C
#include <string.h>
|
|
|
|
#include "cmsis_os2.h"
|
|
|
|
#include "user_epd_impl.h"
|
|
|
|
#define BUSY_MAX_POLLING_TIME 30000 // 30s
|
|
#define SPI_MAX_TRANSFER_TIME 1000 // 1s
|
|
|
|
extern osSemaphoreId_t g_epd_busy_semphr;
|
|
extern osSemaphoreId_t g_spi2_semphr;
|
|
|
|
depg0213_ret_t _epd_reset_cb(void *handle) {
|
|
SPI_HandleTypeDef *hspi = handle;
|
|
if (hspi->Instance == SPI2) {
|
|
HAL_GPIO_WritePin(SPI2_RES_GPIO_Port, SPI2_RES_Pin, GPIO_PIN_SET);
|
|
HAL_Delay(1);
|
|
HAL_GPIO_WritePin(SPI2_RES_GPIO_Port, SPI2_RES_Pin, GPIO_PIN_RESET);
|
|
HAL_Delay(1);
|
|
HAL_GPIO_WritePin(SPI2_RES_GPIO_Port, SPI2_RES_Pin, GPIO_PIN_SET);
|
|
}
|
|
return DEPG0213_OK;
|
|
}
|
|
|
|
depg0213_ret_t _epd_poll_busy(void *handle) {
|
|
SPI_HandleTypeDef *hspi = handle;
|
|
if (hspi->Instance == SPI2) {
|
|
if (osKernelGetState() != osKernelRunning) { // Kernel has not started, use flag polling instead.
|
|
uint32_t tick_start = HAL_GetTick();
|
|
while (HAL_GPIO_ReadPin(SPI2_BUSY_GPIO_Port, SPI2_BUSY_Pin) != GPIO_PIN_RESET) {
|
|
if (HAL_GetTick() - tick_start > BUSY_MAX_POLLING_TIME) {
|
|
return DEPG0213_ERROR;
|
|
}
|
|
}
|
|
} else { // Kernel has started, use semaphore.
|
|
if(osSemaphoreAcquire(g_epd_busy_semphr, BUSY_MAX_POLLING_TIME) != osOK) {
|
|
return DEPG0213_ERROR;
|
|
}
|
|
}
|
|
}
|
|
return DEPG0213_OK;
|
|
}
|
|
|
|
depg0213_ret_t _epd_write_cmd_cb(void *handle, uint8_t *cmd, uint8_t len) {
|
|
SPI_HandleTypeDef *hspi = handle;
|
|
|
|
HAL_StatusTypeDef ret = HAL_OK;
|
|
|
|
if (hspi->Instance == SPI2) {
|
|
HAL_GPIO_WritePin(SPI2_DC_GPIO_Port, SPI2_DC_Pin, GPIO_PIN_RESET);
|
|
if(osKernelGetState() == osKernelRunning) {
|
|
ret = HAL_SPI_Transmit_IT(hspi, cmd, 0x01);
|
|
if(osSemaphoreAcquire(g_spi2_semphr, SPI_MAX_TRANSFER_TIME) != osOK) {
|
|
return DEPG0213_ERROR;
|
|
}
|
|
}
|
|
else {
|
|
ret = HAL_SPI_Transmit(hspi, cmd, 0x01, SPI_MAX_TRANSFER_TIME);
|
|
}
|
|
if (len > 1) {
|
|
HAL_GPIO_WritePin(SPI2_DC_GPIO_Port, SPI2_DC_Pin, GPIO_PIN_SET);
|
|
if(osKernelGetState() == osKernelRunning) {
|
|
ret = HAL_SPI_Transmit_IT(hspi, &cmd[1], len - 1);
|
|
if(osSemaphoreAcquire(g_spi2_semphr, SPI_MAX_TRANSFER_TIME) != osOK) {
|
|
return DEPG0213_ERROR;
|
|
}
|
|
}
|
|
else {
|
|
ret = HAL_SPI_Transmit(hspi, &cmd[1], len - 1, SPI_MAX_TRANSFER_TIME);
|
|
}
|
|
}
|
|
}
|
|
if (ret != HAL_OK) return DEPG0213_ERROR;
|
|
return DEPG0213_OK;
|
|
}
|
|
|
|
depg0213_ret_t _epd_write_data_cb(void *handle, uint8_t *data, uint16_t len) {
|
|
SPI_HandleTypeDef *hspi = handle;
|
|
|
|
HAL_StatusTypeDef ret = HAL_OK;
|
|
|
|
if (hspi->Instance == SPI2) {
|
|
HAL_GPIO_WritePin(SPI2_DC_GPIO_Port, SPI2_DC_Pin, GPIO_PIN_SET);
|
|
if(osKernelGetState() == osKernelRunning) {
|
|
ret = HAL_SPI_Transmit_IT(hspi, data, len);
|
|
if(osSemaphoreAcquire(g_spi2_semphr, SPI_MAX_TRANSFER_TIME) != osOK) {
|
|
return DEPG0213_ERROR;
|
|
}
|
|
}
|
|
else {
|
|
ret = HAL_SPI_Transmit(hspi, data, len, SPI_MAX_TRANSFER_TIME);
|
|
}
|
|
}
|
|
if (ret != HAL_OK) return DEPG0213_ERROR;
|
|
return DEPG0213_OK;
|
|
} |