Use dynamic memory on GPIO structs.
This commit is contained in:
parent
2f5b6f8d9b
commit
1b2eef8917
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue