一、概述
嵌入式设备中,单板上的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驱动。