2021-03-17 15:37:29 +00:00
|
|
|
#include "utils/user_log_util.h"
|
|
|
|
|
|
|
|
#include "drivers/user_gpio_driver.h"
|
|
|
|
|
|
|
|
|
2021-03-21 16:01:12 +00:00
|
|
|
int user_gpio_init(user_gpio_t *gpio, char *chip, uint32_t offset, uint8_t output_enabled) {
|
2021-03-17 15:37:29 +00:00
|
|
|
|
|
|
|
gpio->chip = gpiod_chip_open(chip);
|
|
|
|
if(gpio->chip == NULL) {
|
|
|
|
USER_LOG(USER_LOG_ERROR, "Failed to open chip %s.", chip);
|
2021-03-21 16:01:12 +00:00
|
|
|
return -1;
|
2021-03-17 15:37:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
2021-03-21 16:01:12 +00:00
|
|
|
return -1;
|
2021-03-17 15:37:29 +00:00
|
|
|
}
|
|
|
|
|
2021-03-21 16:01:12 +00:00
|
|
|
int ret;
|
2021-03-17 15:37:29 +00:00
|
|
|
|
2021-03-21 16:01:12 +00:00
|
|
|
if(output_enabled) {
|
|
|
|
ret = gpiod_line_request_output(gpio->line, "SA", 1);
|
|
|
|
} else {
|
|
|
|
gpiod_line_request_input(gpio->line, "SA");
|
|
|
|
}
|
2021-03-17 15:37:29 +00:00
|
|
|
|
|
|
|
if(ret != 0) {
|
|
|
|
USER_LOG(USER_LOG_ERROR, "Failed to reserve GPIO line.");
|
2021-03-21 16:01:12 +00:00
|
|
|
return -1;
|
2021-03-17 15:37:29 +00:00
|
|
|
}
|
|
|
|
|
2021-03-21 16:01:12 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int user_gpio_set(user_gpio_t *gpio, uint8_t value) {
|
|
|
|
int ret = gpiod_line_set_value(gpio->line, value);
|
|
|
|
|
2021-03-17 15:37:29 +00:00
|
|
|
if(ret != 0) {
|
|
|
|
USER_LOG(USER_LOG_ERROR, "Failed to set GPIO value.");
|
2021-03-21 16:01:12 +00:00
|
|
|
return -1;
|
2021-03-17 15:37:29 +00:00
|
|
|
}
|
|
|
|
|
2021-03-21 16:01:12 +00:00
|
|
|
return 0;
|
2021-03-17 15:37:29 +00:00
|
|
|
}
|
|
|
|
|
2021-03-21 16:01:12 +00:00
|
|
|
int user_gpio_get(user_gpio_t *gpio, uint8_t *value){
|
2021-03-17 15:37:29 +00:00
|
|
|
*value = gpiod_line_get_value(gpio->line);
|
|
|
|
|
2021-03-21 16:01:12 +00:00
|
|
|
return 0;
|
2021-03-17 15:37:29 +00:00
|
|
|
}
|
|
|
|
|
2021-03-21 16:01:12 +00:00
|
|
|
int user_gpio_deinit(user_gpio_t *gpio) {
|
2021-03-17 15:37:29 +00:00
|
|
|
|
|
|
|
gpiod_line_release(gpio->line);
|
|
|
|
gpiod_chip_close(gpio->chip);
|
|
|
|
|
2021-03-21 16:01:12 +00:00
|
|
|
return 0;
|
2021-03-17 15:37:29 +00:00
|
|
|
}
|