1、串口
许多设备可以通过串口与控制器连接传输数据,但是串口一般都是有限的,需要使用USB口转;上节说到,USB口可以通过集线器扩展USB口,理论上一个USB口可以扩展128个USB口,但是实际也用不了这么多。因此,需求量大的串口可以通过USB口扩展。USB到串口,有需要电平转换,有的是CMOS电平,有的是TTL电平,有的还是反逻辑等,总之USB与串口之间存在电平不兼容。因此,需要芯片来转换两个之间的电平;
2、常用的USB转串口芯片: PL2303、CP210X和CH34X
3、内核中一般自带有驱动的芯片:PL2303、CP210X
一、内核中已经有相关的驱动:
4、内核中PL2303、CP210X驱动配置:
make menuconfig ---> Device Drivers ---> USB support (USB_SUPPORT [=y]) ---> USB Serial Converter support (USB_SERIAL [=y])
在这个选项里面有很多USB转串口的驱动,把对应的驱动选择上就可以了;
再编译镜像 make zImage,烧写镜像到开发板;
5、动态测试:
1、在烧写镜像之前可以先将USB转串口模块插上,查看有没有打印信息(应该会打印驱动芯片的产品ID、厂商ID);
2、插上模块后,查看是否生成设备节点 ls /dev/ttyUSB*(此时打印的应该不是该设备名称)
3、烧写镜像后,没有插上USB转串口模块前,查看ls /dev/ttyUSB* 是否生成设备节点(不应该生成设备节点)
4、插上USB转串口模块后,应该会有信息打印,会输出设备节点名称;
5、查看设备节点ls /dev/ttyUSB*,应该存在与打印的设备节点一样的的名称;
6、快速测试串口的方法:
1、再不确定是驱动的问题,还是设备的问题的情况下使用;
2、可以直接驱动是否正常;
3、将RS232的收发管脚短接,发什么收什么;
二、内核中没有相关的驱动CH34X
1、首先找到ch340的内核驱动源码,最好找对应内核版本的源码;一般都是兼容的,必须要编译通过
2、编译;找编译器,一定要与内核中的一致;
Makefiel(指向编译过的内核目录)
调试的话:使用动态加载的方式,编译成.ko文件,使用insmod方式加载
3、若没有加载驱动,插上设备后,不会生成设备节点,但是也会打印信息;
只有加载了驱动,再插上设备后,才会生成设备节点
厂商编号:idVendor厂商编号、idProduct产品编号
4、执行Makefile生成.ko文件,再测试
1、不加载驱动的时候,插上设备查看打印信息
[root@iTOP-4412]# [ 54.015334] usb 1-3.1: new full speed USB device number 4 using s5p-ehci [ 54.127018] usb 1-3.1: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice=0254 [ 54.134005] usb 1-3.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0 [ 54.141250] usb 1-3.1: New USB device Class: Class=255, SubClass=0, Protocol=0 [ 54.148422] usb 1-3.1: Product: USB2.0-Serial
2、查看设备节点
[root@iTOP-4412]# ls /dev/tty* /dev/tty /dev/tty3 /dev/ttyGS1 /dev/ttyS0 /dev/ttyS3 /dev/ttySAC2 /dev/tty1 /dev/tty4 /dev/ttyGS2 /dev/ttyS1 /dev/ttySAC0 /dev/ttySAC3 /dev/tty2 /dev/ttyGS0 /dev/ttyGS3 /dev/ttyS2 /dev/ttySAC1
3、加载驱动
[root@iTOP-4412]# cd /mnt/disk [root@iTOP-4412]# insmod ch34x.ko [ 320.970661] USB Serial support registered for ch34x [ 320.990139] usbcore: registered new interface driver ch34x
4、插上模块
[root@iTOP-4412]# [ 354.045353] usb 1-3.1: new full speed USB device number 6 using s5p-ehci [ 354.147021] usb 1-3.1: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice=0254 [ 354.153927] usb 1-3.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0 [ 354.161263] usb 1-3.1: New USB device Class: Class=255, SubClass=0, Protocol=0 [ 354.168493] usb 1-3.1: Product: USB2.0-Serial [ 354.185183] ch34x 1-3.1:1.0: ch34x converter detected [ 354.208339] usb 1-3.1: ch34x converter now attached to ttyUSB0 // 其中打印的ttyUSB0就是ch340的设备节点
5、查看设备节点
[root@iTOP-4412]# ls /dev/tty* /dev/tty /dev/tty3 /dev/ttyGS1 /dev/ttyS0 /dev/ttyS3 /dev/ttySAC2 /dev/tty1 /dev/tty4 /dev/ttyGS2 /dev/ttyS1 /dev/ttySAC0 /dev/ttySAC3 /dev/tty2 /dev/ttyGS0 /dev/ttyGS3 /dev/ttyS2 /dev/ttySAC1 /dev/ttyUSB0 // 找到了ttyUSB0
5、比较好的情况下,执行make 一切都比较顺利,但是有时候需要自己修改
1、 驱动直接支持设备
2、驱动需要添加idVendor和idProduct
3、驱动需要添加idVendor和idProduct,还要打补丁或者驱动中增加额外代码
6、添加产品ID和厂商ID
这两个重要的参数一般在这里
static struct usb_device_id id_table [] = { { USB_DEVICE(CH34x_VENDOR_ID, CH340_PRODUCT_ID) }, { USB_DEVICE(CH34x_VENDOR_ID, CH341_PRODUCT_ID) }, { } //End };
如果需要添加,仿照这里的格式,添加;
根据定义找到
#define CH34x_VENDOR_ID 0x1A86 // 与上面打印出的信息对应 #define CH340_PRODUCT_ID 0x7523 #define CH341_PRODUCT_ID 0x5523
7、有时候除了添加厂商信息还不够,需要添加额外的代码,这时候直接找原厂;