Use dynamic memory on GPIO structs.

This commit is contained in:
imi415 2021-03-21 01:30:05 +08:00
parent 2f5b6f8d9b
commit 1b2eef8917
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
2 changed files with 30 additions and 19 deletions

View File

@ -7,9 +7,9 @@
typedef struct {
user_spi_driver_t *spi_driver;
user_gpio_t cs_gpio;
user_gpio_t dc_gpio;
user_gpio_t reset_gpio;
user_gpio_t *cs_gpio;
user_gpio_t *dc_gpio;
user_gpio_t *reset_gpio;
} user_st7789_impl_t;
int user_st7789_impl_init(void *handle, user_spi_driver_t *spi_driver);

View File

@ -9,11 +9,18 @@ int user_st7789_impl_init(void *handle, user_spi_driver_t *spi_driver) {
user_st7789_impl_t *impl = handle;
if(user_gpio_init(&impl->cs_gpio, "/dev/gpiochip0", 0) != USER_GPIO_OK)
impl->cs_gpio = malloc(sizeof(user_gpio_t));
if(!impl->cs_gpio) return -1;
impl->dc_gpio = malloc(sizeof(user_gpio_t));
if(!impl->dc_gpio) return -1;
impl->reset_gpio = malloc(sizeof(user_gpio_t));
if(!impl->reset_gpio) return -1;
if(user_gpio_init(impl->cs_gpio, "/dev/gpiochip0", 0) != USER_GPIO_OK)
return -1;
if(user_gpio_init(&impl->dc_gpio, "/dev/gpiochip0", 0) != USER_GPIO_OK)
if(user_gpio_init(impl->dc_gpio, "/dev/gpiochip0", 0) != USER_GPIO_OK)
return -2;
if(user_gpio_init(&impl->reset_gpio, "/dev/gpiochip0", 0) != USER_GPIO_OK)
if(user_gpio_init(impl->reset_gpio, "/dev/gpiochip0", 0) != USER_GPIO_OK)
return -3;
if(spi_driver == NULL) return -4;
@ -27,9 +34,13 @@ void user_st7789_impl_deinit(void *handle) {
user_st7789_impl_t *impl = handle;
user_gpio_deinit(&impl->cs_gpio);
user_gpio_deinit(&impl->dc_gpio);
user_gpio_deinit(&impl->reset_gpio);
user_gpio_deinit(impl->cs_gpio);
user_gpio_deinit(impl->dc_gpio);
user_gpio_deinit(impl->reset_gpio);
free(impl->cs_gpio);
free(impl->dc_gpio);
free(impl->reset_gpio);
}
st7789_ret_t user_st7789_impl_write_cmd(void *handle, uint8_t *cmd,
@ -37,15 +48,15 @@ st7789_ret_t user_st7789_impl_write_cmd(void *handle, uint8_t *cmd,
user_st7789_impl_t *impl = handle;
if(user_gpio_set(&impl->dc_gpio, 0) != USER_GPIO_OK) return ST7789_ERROR;
if(user_gpio_set(&impl->cs_gpio, 0) != USER_GPIO_OK) return ST7789_ERROR;
if(user_gpio_set(impl->dc_gpio, 0) != USER_GPIO_OK) return ST7789_ERROR;
if(user_gpio_set(impl->cs_gpio, 0) != USER_GPIO_OK) return ST7789_ERROR;
// ST7789VW requires parameters to be sent with DC=0.
if(user_spi_driver_xfer(impl->spi_driver, cmd, NULL, len) != USER_SPI_OK) {
user_gpio_set(&impl->cs_gpio, 1);
user_gpio_set(impl->cs_gpio, 1);
return ST7789_ERROR;
}
if(user_gpio_set(&impl->cs_gpio, 1) != USER_GPIO_OK) return ST7789_ERROR;
if(user_gpio_set(impl->cs_gpio, 1) != USER_GPIO_OK) return ST7789_ERROR;
return ST7789_OK;
}
@ -54,13 +65,13 @@ st7789_ret_t user_st7789_impl_write_data(void *handle, uint8_t *data,
uint32_t len) {
user_st7789_impl_t *impl = handle;
if(user_gpio_set(&impl->dc_gpio, 1) != USER_GPIO_OK) return ST7789_ERROR;
if(user_gpio_set(&impl->cs_gpio, 0) != USER_GPIO_OK) return ST7789_ERROR;
if(user_gpio_set(impl->dc_gpio, 1) != USER_GPIO_OK) return ST7789_ERROR;
if(user_gpio_set(impl->cs_gpio, 0) != USER_GPIO_OK) return ST7789_ERROR;
if(user_spi_driver_xfer(impl->spi_driver, data, NULL, len) != USER_SPI_OK) {
user_gpio_set(&impl->cs_gpio, 1);
user_gpio_set(impl->cs_gpio, 1);
return ST7789_ERROR;
}
if(user_gpio_set(&impl->cs_gpio, 1) != USER_GPIO_OK) return ST7789_ERROR;
if(user_gpio_set(impl->cs_gpio, 1) != USER_GPIO_OK) return ST7789_ERROR;
return ST7789_OK;
}
@ -71,7 +82,7 @@ st7789_ret_t user_st7789_impl_reset(void *handle) {
if(&impl->reset_gpio == NULL) return ST7789_OK;
if(user_gpio_set(&impl->reset_gpio, 0) != USER_GPIO_OK) return ST7789_ERROR;
if(user_gpio_set(impl->reset_gpio, 0) != USER_GPIO_OK) return ST7789_ERROR;
usleep(10 * 1000); // Sleep 10ms
if(user_gpio_set(&impl->cs_gpio, 1) != USER_GPIO_OK) return ST7789_ERROR;
if(user_gpio_set(impl->cs_gpio, 1) != USER_GPIO_OK) return ST7789_ERROR;
}