嵌入式开发记录-day35 USB转串口驱动配置

时间:2024-03-07 10:05:15

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、有时候除了添加厂商信息还不够,需要添加额外的代码,这时候直接找原厂;