linux驱动 内核层适配485驱动控制引脚

  1. 查找瑞芯微rk3568,rk3588系列串口驱动

    查看串口的 “compatible”属性,其中有两个名称。
     
    先在源码搜索"rockchip,rk3568-uart",没有搜索到,再搜索"snps,dw-apb-uart"。在8250_dw.c文件中找到了匹配的名称,采用的是8250的串口驱动。

     

  2. 设备树适配

    首先,在设备树中添加485控制引脚,用于区分普通串口和485

    485_ctrl_gpio = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>;

  3. 适配8250驱动
    查找8250驱动的probe函数dw8250_probe,定义在drivers/tty/serial/8250/8250_dw.c文件中。
    在“p->private_data = &data->data;”代码后面添加如下内容。
    先判断下是否定义485_ctrl_gpio,从而判断是否为485。如果是,则初始化一个低电平,将控制引脚拉低切为接收状态,然后添加Linux内核中的下半部机制之tasklet的初始化。

     

    数据收发时,控制引脚电平默认为低电平接收状态,不影响接收。
    发送数据时,会先进入到serial8250_start_tx
     

    在serial8250_start_tx函数中,将控制引脚拉高,切为发送状态。

    接着,会产生一个中断,进入dw8250_handle_irq中断处理函数中。其中,发送字符会调用serial8250_rx_chars,在if (uart_circ_empty(xmit) && !(up->capabilities & UART_CAP_RPM))里面将tasklet调度起来
     


    中断执行后,会进入tasklet的回调函数,代码为:
    void serial8250_485_do_tasklet(unsigned long param)
    {
    	//printk("serial8250_485_do_tasklet\n");
    	struct uart_port *port;
    	unsigned int lsr;
    
    	//printk("param = %ld\n", ((struct dw8250_port_data *)param)->suart_port);
    	port = (struct uart_port *)((struct dw8250_port_data *)param)->suart_port;
    
        while (1)
        {
            lsr = serial_port_in(port, UART_LSR);
    		if (((lsr & UART_LSR_TEMT) == UART_LSR_TEMT))
                break;
        }
    
        gpio_direction_output(((struct dw8250_port_data *)port->private_data)->gpiocrtl_485, 0);
    }

    先通过参数param获取对应的struct uart_port结构体,然后通过serial_port_in一直读取寄存器UART_LSR的值,如果判断UART_LSR_TEMT成立,则已发送完成退出循环,将控制引脚拉低切为接收状态。

    4,测试

    经测试,发送完数据,控制引脚会在100us左右拉低,满足需求。

 

 

 

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
ICN6211是一款设备,它的驱动可以适配Linux4.4内核中。适配驱动Linux内核主要需要以下步骤: 1. 确定设备的硬件规格:首先,我们需要了解ICN6211的硬件规格,包括设备的型号、厂商、硬件接口等信息。这些信息对于编写设备驱动非常重要。 2. 确定设备驱动的主要功能:根据设备的硬件规格和相关文档,确定设备驱动的主要功能和操作方式。比如,确定设备的初始化过程、设备的寄存器操作等。 3. 编写设备驱动代码:根据设备的硬件规格和功能需求,编写相应的驱动代码。驱动代码需要处理设备的初始化、数据读写、中断处理等操作。在编写过程中,需要使用Linux内核提供的相关API和数据结构。 4. 调试和测试:完成驱动代码的编写后,需要进行调试和测试。可以通过连接ICN6211设备到Linux系统上进行测试,确保设备的功能正常并且驱动代码工作稳定。 5. 添加到Linux内核:完成驱动代码的开发和测试后,可以将驱动代码提交给Linux内核团队。他们会对驱动代码进行审核和测试,并决定是否将其纳入到Linux内核主线。如果驱动代码被接受,它将作为Linux内核的一部分,并随着内核版本的更新而进行维护和更新。 总之,适配ICN6211到Linux4.4内核驱动需要进行设备硬件规格分析、驱动代码编写、调试测试等步骤,并最终将驱动代码添加到Linux内核中。这样就可以在Linux4.4内核及之后的版本中使用ICN6211设备了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值