linux gpio 模拟串口,GPIO 模拟Uart 通信 (soft uart/serial)

本文介绍了如何在Linux系统中利用GPIO模拟UART(串口)通信,详细讲解了流程,包括GPIO初始化、定时器设置、中断处理、FIFO管理和tty驱动注册。并分享了移植树莓派soft_uart驱动的经验,讨论了使用platform_driver的原因,如DTS配置、GPIO获取以及在移植调试中遇到的问题和解决办法。最后提到了波特率配置和设备使用示例。

GPIO 模拟Uart 通信 (soft uart/serial)

在Uart不够用的时候可以通过GPIO 来模拟,但是GPIO 模拟有一个缺点就是时钟可能不准,Uart是异步的,我们可以设置两个定时器来模拟其对应的输出。

流程

linux下的GPIO模拟Uart涉及到如下几个内容

1、GPIO初始化、设定输入输出、以及输入中断设置

2、初始化定时器,建议是高精度定时器

3、中断处理数据接收处理和发送数据

4、fifo管理数据

5、注册tty 驱动管理

代码移植

我这边主要是移植了树莓派的soft_uart 驱动,驱动代码路径 soft_uart/soft_serial

找了好久的资料和网址才找到适用的,感谢github!!!求点赞收藏~~

我这边修改为platform_dirver 设备驱动模型了, 这个取决于你的使用场景

我这边改用platform_dirver的原因有如下几个

1、DTS可以动态配置中断号,GPIO管脚

2、通过 struct platform_device *pdev 可以获取更多数据结构来操作

3、本人使用的arm 平台申请IRQ方法跟github 对应的gpio irq 方法不一样,需要依赖指定的中断号

Module.c

static const struct of_device_id soft_uart_of_match[] = {

{.compatible = "soft_uart",},

};

static struct platform_driver soft_uart = {

.driver = {

.name = "soft_uart",

.owner = THIS_MODULE,

.of_match_table = soft_uart_of_match,

},

.probe = soft_uart_probe,

.remove = soft_uart_remove,

};

static int __init soft_uart_init(void)

{

return platform_driver_register(&soft_uart);

}

static void __exit soft_uart_exit(void)

{

platform_driver_unregister(&so

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值