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