linux之usb虚拟uart驱动详解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/madannasf/article/details/102677695

一、概述

嵌入式设备中,单板上的uart个数是有限的,所以在需要uart接口多的项目中,usb转uart可方便的拓展,支持一拖多的方式,大大的拓宽了uart的需求,本节我们来详细说说usb转uart驱动。

1.1、需要的理论

1、usb驱动相关;https://blog.csdn.net/madannasf/article/details/102658630
2、uart驱动相关:(我的待写),大家也可以参考这一篇,理论不多,但是有例子,还是不错的勒。
https://blog.csdn.net/wangzhen209/article/details/76685756

二、usb虚拟uart

2.1、框架猜测

usb虚拟uart可知,在上层的运用编程中,是以uart方式进行open,read and write,所有驱动的具体实现使用的是uart框架,但是uart的驱动中的uart_ops应该由usb来提供,所以底层硬件实现由usb来实现。

描述 层次
open(/dev/usbttyx) 串口运用编程(上层)
uart驱动实现框架 串口驱动实现(驱动层)
usb 硬件驱动框架 usb 硬件提供串口驱动中的uart_ops能力

2.2、主要数据结构

2.2.1、uart层

1、struct tty_driver

2、struct tty_port

3、struct tty_operations

2.2.2、usb层

1、struct usb_serial_driver

2.3、主要函数

*1、struct tty_driver alloc_tty_driver(unsigned int lines,flag)
主要用于分配一个tty_driver数据信息,lines表示串口号。
主要分配了tty_struct,tty_port的内存空间。
**2、void tty_set_operations(struct tty_driver driver,const struct tty_operations op)
该函数用于将op中的uart的控制注册到tty_driver->ops中,供运用层的相关操作。
*3、int tty_register_driver(struct tty_driver driver)
该函数用于将tty_driver添加到tty_drivers这个全局的tty数据链表中,并且创建以major分配的字符设备节点。
如果struct tty_driver的flags成员使用动态TTY_DRIVER_DYNAMIC_ALLOC来动态创建设备节点的话,则创建的设备节点下的fops就使用tty_ltdis提供的直接读取ltdis中的数据。
*4、int usb_register(struct usb_driver new_driver)
该函数主要提供usb的端点配置。
5、int usb_serial_generic_register(void)
注册 .name = "generic"的usb_serial_driver

具体的usb serial实现可参考drivers/usb/serial/usb-serial.c
该函数中完成了usb与serial的关联,在具体的usb转serial芯片中,完成芯片相关的配置以及ops即可。

三、驱动实例

下载:usb serial 驱动下载
这个链接下的文件即可,这是一个很好的CH341 usb serial驱动。

猜你喜欢

转载自blog.csdn.net/madannasf/article/details/102677695