Modified GPIO driver and SPI driver.
This commit is contained in:
parent
e9dcd50748
commit
6bcc64d337
|
@ -4,6 +4,7 @@ project(SystemAgent)
|
|||
|
||||
set(C_SOURCES
|
||||
"src/main.c"
|
||||
"src/drivers/user_gpio_driver.c"
|
||||
"src/drivers/user_spi_driver.c"
|
||||
"src/drivers/user_config_driver.c"
|
||||
"src/impl/user_lvgl_impl.c"
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
#ifndef __USER_GPIO_DRIVER_H
|
||||
#define __USER_GPIO_DRIVER_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <gpiod.h>
|
||||
|
||||
typedef enum {
|
||||
USER_GPIO_OK,
|
||||
USER_GPIO_ERROR,
|
||||
} user_gpio_ret_t;
|
||||
|
||||
typedef struct {
|
||||
struct gpiod_chip *chip;
|
||||
struct gpiod_line *line;
|
||||
} user_gpio_t;
|
||||
|
||||
user_gpio_ret_t user_gpio_init(user_gpio_t *gpio, char *chip, uint32_t offset);
|
||||
user_gpio_ret_t user_gpio_set(user_gpio_t *gpio, uint8_t value);
|
||||
user_gpio_ret_t user_gpio_get(user_gpio_t *gpio, uint8_t *value);
|
||||
user_gpio_ret_t user_gpio_deinit(user_gpio_t *gpio);
|
||||
|
||||
#endif
|
|
@ -7,9 +7,10 @@ typedef enum { USER_SPI_OK, USER_SPI_ERROR } user_spi_ret_t;
|
|||
|
||||
typedef struct {
|
||||
int spidev_fd;
|
||||
uint32_t speed_hz;
|
||||
} user_spi_driver_t;
|
||||
|
||||
user_spi_ret_t user_spi_driver_init(user_spi_driver_t *spi, char *path);
|
||||
user_spi_ret_t user_spi_driver_init(user_spi_driver_t *spi, char *path, uint32_t speed_hz);
|
||||
user_spi_ret_t user_spi_driver_deinit(user_spi_driver_t *spi);
|
||||
user_spi_ret_t user_spi_driver_xfer(user_spi_driver_t *spi, uint8_t *tx_buf,
|
||||
uint8_t rx_buf, uint32_t len);
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
#include "utils/user_log_util.h"
|
||||
|
||||
#include "drivers/user_gpio_driver.h"
|
||||
|
||||
|
||||
user_gpio_ret_t user_gpio_init(user_gpio_t *gpio, char *chip, uint32_t offset) {
|
||||
|
||||
gpio->chip = gpiod_chip_open(chip);
|
||||
if(gpio->chip == NULL) {
|
||||
USER_LOG(USER_LOG_ERROR, "Failed to open chip %s.", chip);
|
||||
return USER_GPIO_ERROR;
|
||||
}
|
||||
|
||||
gpio->line = gpiod_chip_get_line(gpio->chip, offset);
|
||||
if(gpio->line == NULL) {
|
||||
USER_LOG(USER_LOG_ERROR, "Failed to get GPIO line %d.", offset);
|
||||
gpiod_chip_close(gpio->chip);
|
||||
return USER_GPIO_ERROR;
|
||||
}
|
||||
|
||||
return USER_GPIO_OK;
|
||||
}
|
||||
|
||||
user_gpio_ret_t user_gpio_set(user_gpio_t *gpio, uint8_t value) {
|
||||
|
||||
int ret = gpiod_line_request_output(gpio->line, "SA", value);
|
||||
if(ret != 0) {
|
||||
USER_LOG(USER_LOG_ERROR, "Failed to reserve GPIO line.");
|
||||
return USER_GPIO_ERROR;
|
||||
}
|
||||
|
||||
ret = gpiod_line_set_value(gpio->line, value);
|
||||
if(ret != 0) {
|
||||
USER_LOG(USER_LOG_ERROR, "Failed to set GPIO value.");
|
||||
return USER_GPIO_ERROR;
|
||||
}
|
||||
|
||||
return USER_GPIO_OK;
|
||||
}
|
||||
|
||||
user_gpio_ret_t user_gpio_get(user_gpio_t *gpio, uint8_t *value){
|
||||
|
||||
int ret = gpiod_line_request_input(gpio->line, "SA");
|
||||
if(ret != 0) {
|
||||
USER_LOG(USER_LOG_ERROR, "Failed to reserve GPIO line.");
|
||||
return USER_GPIO_ERROR;
|
||||
}
|
||||
|
||||
*value = gpiod_line_get_value(gpio->line);
|
||||
|
||||
return USER_GPIO_OK;
|
||||
}
|
||||
|
||||
user_gpio_ret_t user_gpio_deinit(user_gpio_t *gpio) {
|
||||
|
||||
gpiod_line_release(gpio->line);
|
||||
gpiod_chip_close(gpio->chip);
|
||||
|
||||
return USER_GPIO_OK;
|
||||
}
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
#include "drivers/user_spi_driver.h"
|
||||
|
||||
user_spi_ret_t user_spi_driver_init(user_spi_driver_t *spi, char *path) {
|
||||
user_spi_ret_t user_spi_driver_init(user_spi_driver_t *spi, char *path, uint32_t speed_hz) {
|
||||
USER_LOG(USER_LOG_INFO, "SPI driver init.");
|
||||
|
||||
spi->spidev_fd = open(path, O_RDWR);
|
||||
|
@ -23,6 +23,8 @@ user_spi_ret_t user_spi_driver_init(user_spi_driver_t *spi, char *path) {
|
|||
return USER_SPI_ERROR;
|
||||
}
|
||||
|
||||
spi->speed_hz = speed_hz;
|
||||
|
||||
return USER_SPI_OK;
|
||||
}
|
||||
|
||||
|
@ -38,7 +40,7 @@ user_spi_ret_t user_spi_driver_xfer(user_spi_driver_t *spi, uint8_t *tx_buf,
|
|||
.tx_buf = (unsigned long)tx_buf,
|
||||
.len = len,
|
||||
.cs_change = 0,
|
||||
.speed_hz = 16000000,
|
||||
.speed_hz = spi->speed_hz,
|
||||
.bits_per_word = 8
|
||||
};
|
||||
if(ioctl(spi->spidev_fd, SPI_IOC_MESSAGE(1), &txn) < 0) {
|
||||
|
|
|
@ -31,7 +31,7 @@ int main(int argc, const char *argv[]) {
|
|||
}
|
||||
|
||||
user_config_init(&g_config, "config.cfg");
|
||||
if(user_spi_driver_init(&g_spi, "/dev/spidev0.0") != USER_SPI_OK) {
|
||||
if(user_spi_driver_init(&g_spi, "/dev/spidev0.0", 10000000) != USER_SPI_OK) {
|
||||
USER_LOG(USER_LOG_FATAL, "Failed to initialize SPI driver.");
|
||||
return -2;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue