mirror of
https://gitlab.com/mobian1/eg25-manager.git
synced 2025-08-29 23:32:14 +02:00
gpio: libgpiod 2.0: port gpio_get_{input,output}_line
This commit is contained in:
74
src/gpio.c
74
src/gpio.c
@@ -103,36 +103,54 @@ int gpio_sequence_sleep(struct EG25Manager *manager)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gpiod_line *gpio_get_output_line(struct EG25Manager *manager, int chip, int line)
|
struct gpiod_line_request *gpio_request_line(struct EG25Manager *manager, int chip, unsigned int line, enum gpiod_line_direction direction) {
|
||||||
{
|
struct gpiod_line_request *request = NULL;
|
||||||
struct gpiod_line *gpio_line;
|
struct gpiod_line_settings *settings;
|
||||||
|
struct gpiod_line_config *line_cfg;
|
||||||
|
struct gpiod_request_config *req_cfg;
|
||||||
|
int ret;
|
||||||
|
|
||||||
gpio_line = gpiod_chip_get_line(manager->gpiochip[chip], line);
|
settings = gpiod_line_settings_new();
|
||||||
if (!gpio_line)
|
if (!settings)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (gpiod_line_request_output(gpio_line, "eg25manager", 0) < 0) {
|
gpiod_line_settings_set_direction(settings, direction);
|
||||||
gpiod_line_release(gpio_line);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return gpio_line;
|
line_cfg = gpiod_line_config_new();
|
||||||
|
if (!line_cfg)
|
||||||
|
goto free_settings;
|
||||||
|
|
||||||
|
ret = gpiod_line_config_add_line_settings(line_cfg, &line, 1, settings);
|
||||||
|
if (ret)
|
||||||
|
goto free_line_config;
|
||||||
|
|
||||||
|
req_cfg = gpiod_request_config_new();
|
||||||
|
if (!req_cfg)
|
||||||
|
goto free_line_config;
|
||||||
|
|
||||||
|
gpiod_request_config_set_consumer(req_cfg, "eg25-manager");
|
||||||
|
|
||||||
|
request = gpiod_chip_request_lines(manager->gpiochip[chip], req_cfg, line_cfg);
|
||||||
|
|
||||||
|
gpiod_request_config_free(req_cfg);
|
||||||
|
|
||||||
|
free_line_config:
|
||||||
|
gpiod_line_config_free(line_cfg);
|
||||||
|
|
||||||
|
free_settings:
|
||||||
|
gpiod_line_settings_free(settings);
|
||||||
|
|
||||||
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gpiod_line *gpio_get_input_line(struct EG25Manager *manager, int chip, int line)
|
struct gpiod_line_request *gpio_request_output_line(struct EG25Manager *manager, int chip, unsigned int line)
|
||||||
{
|
{
|
||||||
struct gpiod_line *gpio_line;
|
return gpio_request_line(manager, chip, line, GPIOD_LINE_DIRECTION_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
gpio_line = gpiod_chip_get_line(manager->gpiochip[chip], line);
|
struct gpiod_line_request *gpio_request_input_line(struct EG25Manager *manager, int chip, unsigned int line)
|
||||||
if (!gpio_line)
|
{
|
||||||
return NULL;
|
return gpio_request_line(manager, chip, line, GPIOD_LINE_DIRECTION_INPUT);
|
||||||
|
|
||||||
if (gpiod_line_request_input(gpio_line, "eg25manager") < 0) {
|
|
||||||
gpiod_line_release(gpio_line);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return gpio_line;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gpio_chip_dir_filter(const struct dirent *entry)
|
static int gpio_chip_dir_filter(const struct dirent *entry)
|
||||||
@@ -274,7 +292,7 @@ int gpio_init(struct EG25Manager *manager, toml_table_t *config[])
|
|||||||
if (!line.ok || line.u.i < 0 || line.u.i > gpiod_chip_num_lines(manager->gpiochip[chip.u.i]))
|
if (!line.ok || line.u.i < 0 || line.u.i > gpiod_chip_num_lines(manager->gpiochip[chip.u.i]))
|
||||||
g_error("Wrong line ID for output GPIO '%s'", gpio_out_names[i]);
|
g_error("Wrong line ID for output GPIO '%s'", gpio_out_names[i]);
|
||||||
|
|
||||||
manager->gpio_out[i] = gpio_get_output_line(manager, chip.u.i, line.u.i);
|
manager->gpio_out[i] = gpio_request_output_line(manager, chip.u.i, line.u.i);
|
||||||
if (!manager->gpio_out[i])
|
if (!manager->gpio_out[i])
|
||||||
g_error("Unable to get output GPIO %d", i);
|
g_error("Unable to get output GPIO %d", i);
|
||||||
}
|
}
|
||||||
@@ -298,7 +316,7 @@ int gpio_init(struct EG25Manager *manager, toml_table_t *config[])
|
|||||||
if (!line.ok || line.u.i < 0 || line.u.i > gpiod_chip_num_lines(manager->gpiochip[chip.u.i]))
|
if (!line.ok || line.u.i < 0 || line.u.i > gpiod_chip_num_lines(manager->gpiochip[chip.u.i]))
|
||||||
g_error("Wrong line ID for input GPIO '%s'", gpio_in_names[i]);
|
g_error("Wrong line ID for input GPIO '%s'", gpio_in_names[i]);
|
||||||
|
|
||||||
manager->gpio_in[i] = gpio_get_input_line(manager, chip.u.i, line.u.i);
|
manager->gpio_in[i] = gpio_request_input_line(manager, chip.u.i, line.u.i);
|
||||||
if (!manager->gpio_in[i])
|
if (!manager->gpio_in[i])
|
||||||
g_error("Unable to get input GPIO %d", i);
|
g_error("Unable to get input GPIO %d", i);
|
||||||
}
|
}
|
||||||
@@ -326,7 +344,7 @@ int gpio_init(struct EG25Manager *manager, toml_table_t *config[])
|
|||||||
chipidx = 1;
|
chipidx = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
manager->gpio_out[i] = gpio_get_input_line(manager, chipidx, offset);
|
manager->gpio_out[i] = gpio_request_input_line(manager, chipidx, offset);
|
||||||
if (!manager->gpio_out[i])
|
if (!manager->gpio_out[i])
|
||||||
g_error("Unable to get output GPIO %d", i);
|
g_error("Unable to get output GPIO %d", i);
|
||||||
}
|
}
|
||||||
@@ -343,7 +361,7 @@ int gpio_init(struct EG25Manager *manager, toml_table_t *config[])
|
|||||||
chipidx = 1;
|
chipidx = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
manager->gpio_in[i] = gpio_get_input_line(manager, chipidx, offset);
|
manager->gpio_in[i] = gpio_request_input_line(manager, chipidx, offset);
|
||||||
if (!manager->gpio_in[i])
|
if (!manager->gpio_in[i])
|
||||||
g_error("Unable to get input GPIO %d", i);
|
g_error("Unable to get input GPIO %d", i);
|
||||||
}
|
}
|
||||||
@@ -374,12 +392,12 @@ void gpio_destroy(struct EG25Manager *manager)
|
|||||||
|
|
||||||
for (i = 0; i < GPIO_OUT_COUNT; i++) {
|
for (i = 0; i < GPIO_OUT_COUNT; i++) {
|
||||||
if (manager->gpio_out[i])
|
if (manager->gpio_out[i])
|
||||||
gpiod_line_release(manager->gpio_out[i]);
|
gpiod_line_request_release(manager->gpio_out[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < GPIO_IN_COUNT; i++) {
|
for (i = 0; i < GPIO_IN_COUNT; i++) {
|
||||||
if (manager->gpio_in[i])
|
if (manager->gpio_in[i])
|
||||||
gpiod_line_release(manager->gpio_in[i]);
|
gpiod_line_request_release(manager->gpio_in[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (manager->gpiochip[0])
|
if (manager->gpiochip[0])
|
||||||
|
@@ -116,8 +116,8 @@ struct EG25Manager {
|
|||||||
GUdevClient *udev;
|
GUdevClient *udev;
|
||||||
|
|
||||||
struct gpiod_chip *gpiochip[2];
|
struct gpiod_chip *gpiochip[2];
|
||||||
struct gpiod_line *gpio_out[5];
|
struct gpiod_line_request *gpio_out[5];
|
||||||
struct gpiod_line *gpio_in[2];
|
struct gpiod_line_request *gpio_in[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
void modem_configure(struct EG25Manager *data);
|
void modem_configure(struct EG25Manager *data);
|
||||||
|
Reference in New Issue
Block a user