对于我的一个项目,我稍微修改了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中收到以下消息,这意味着驱动程序已被初始化多次?
此处编辑结束
此代码的问题是,我可以确认该引脚已正确驱动到1,但之后再也不会恢复为0。为什么会发生这种情况,我该如何解决?