Для одного из моих проектов я немного модифицирую драйвер последовательного порта Linux, чтобы я мог довести вывод GPIO до 1 непосредственно перед началом сеанса Tx и до 0 снова после завершения сеанса.Я делаю это путем включения заголовка gpio в драйвер и вызова соответствующих функций:
РЕДАКТИРОВАТЬ: После предложений @sawdust в комментариях новый код выглядит следующим образомэто
В начале передачи:
static void imx_start_tx(struct uart_port *port)
{
struct imx_port *sport = (struct imx_port *)port;
unsigned long temp;
gpio_set_value(140, 1);
В остановке передачи:
static void imx_stop_tx(struct uart_port *port)
{
struct imx_port *sport = (struct imx_port *)port;
unsigned long temp;
gpio_set_value(140, 0);
Пока выполняется запрос GPIO в imx_startup:
static int imx_startup(struct uart_port *port)
{
struct imx_port *sport = (struct imx_port *)port;
int retval, i;
unsigned long flags, temp;
/* Request GPIO #140, used for control flow */
int gpio_num = 140;
const char* label = "f";
if (!gpio_is_valid(gpio_num)){
printk(KERN_INFO "GPIO_RS485: invalid GPIO pin\n");
return -ENODEV;
}
int gpio_req = gpio_request(gpio_num, label);
if(gpio_req != 0){
printk(KERN_INFO "GPIO_RS485: GPIO access request failed with %d\n", gpio_req);
} else {
printk(KERN_INFO "GPIO_RS485: GPIO access request succeeded!\n");
}
И gpio_free ();вызывается в imx_shutdown
static void imx_shutdown(struct uart_port *port)
{
struct imx_port *sport = (struct imx_port *)port;
unsigned long temp;
unsigned long flags;
gpio_free(140);
Однако проблема остается.Другое дело, что теперь я получаю следующие сообщения в dmesg, что означает, что драйвер инициализируется несколько раз?
РЕДАКТИРОВАТЬ КОНЕЦ ЗДЕСЬ
Проблема с этим кодом состоит в том, что я могу подтвердить, что вывод правильно установлен на 1, но затем он никогда не возвращается к 0. Почему это происходит и как я могу исправитьэто?