GPIO引脚可以设置为0到1,但不能设置为0

时间:2018-10-05 10:05:46

标签: linux-kernel uart gpio imx6

对于我的一个项目,我稍微修改了Linux串行驱动程序,因此我可以在Tx会话开始之前将GPIO引脚驱动为1,在会话结束之后再次驱动为0。我通过在驱动程序中包含gpio标头并调用适当的函数来做到这一点:

编辑: 在评论中@sawdust的建议之后,新代码如下所示:

在Tx开始:

Navigator.of(context).push(
        CupertinoPageRoute(
                fullscreenDialog: true,
                builder: (context) => SomePage()
        );
);

在发送停止中:

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);

在imx_startup中完成GPIO请求时:

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_free();在imx_shutdown中被调用

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");
    }

但是问题仍然存在。 另一件事是,现在我在dmesg中收到以下消息,这意味着驱动程序已被初始化多次?

dmesg output

此处编辑结束

此代码的问题是,我可以确认该引脚已正确驱动到1,但之后再也不会恢复为0。为什么会发生这种情况,我该如何解决?

0 个答案:

没有答案