linux如何通过usb端口绑定到固定的串口号
作者:技术求索者
文章讨论了在安卓设备使用USB转串口时,由于设备号随USB枚举顺序变化导致串口无法被系统识别的问题,最初通过修改串口号解决,但发现直接修改串口号无法被系统正确映射,最终解决方法是不修改串口号,而是通过调整串口配置或延长串口可用长度,确保系统能够正确识别和映射串口
linux通过usb端口绑定到固定的串口号
我们在安卓设备上经常会用到usb转串口的设备,而usb转串口的设备生成的设备号是按usb枚举的顺序生成的,所以同一个usb设备每次开机之后生成的串口序号可能不相同,通过下面的补丁可以解决这个问题。
Index: kernel/drivers/usb/serial/usb-serial.c =================================================================== --- kernel/drivers/usb/serial/usb-serial.c (revision 1851) +++ kernel/drivers/usb/serial/usb-serial.c (working copy) @@ -85,20 +85,74 @@ return port; } -static int allocate_minors(struct usb_serial *serial, int num_ports) +static int allocate_minors(struct usb_serial *serial, int num_ports,char * dev_name) { struct usb_serial_port *port; unsigned int i, j; - int minor; + int minor,tmpmiior; dev_dbg(&serial->interface->dev, "%s %d\n", __func__, num_ports); mutex_lock(&table_lock); +printk("dev_name = %s\n",dev_name); for (i = 0; i < num_ports; ++i) { port = serial->port[i]; - minor = idr_alloc(&serial_minors, port, 0, 0, GFP_KERNEL); - if (minor < 0) - goto error; + + printk("num_ports = %d\n",num_ports); + + if(!strcmp(dev_name,"2-1.7")) //USB0 + { + minor = idr_alloc(&serial_minors, port, 0, 4, GFP_KERNEL); + if (minor < 0) + goto error; + } + else + { + + if(!strcmp(dev_name,"1-1.1")) //USB0 + { + minor = 5; + } + else if(!strcmp(dev_name,"2-1.6.1")) //USB0 + { + minor = 6; + } + + else if(!strcmp(dev_name,"2-1.5.1")) //USB0 + { + minor = 7; + } + + else if(!strcmp(dev_name,"2-1.4.1")) //USB0 + { + minor = 8; + } + else if(!strcmp(dev_name,"2-1.3.1")) + { + minor = 9; + } + else if(!strcmp(dev_name,"2-1.2.1")) + { + minor = 10; + } + else if(!strcmp(dev_name,"2-1.1.1")) + { + minor = 11; + } + + tmpmiior=idr_alloc(&serial_minors, port, 5, 20, GFP_KERNEL); + if (minor < 0) + goto error; + + } + /* else if(!strcmp(dev_name,"2-1.7")) + { + i = 7; + }*/ + //minor = idr_alloc(&serial_minors, port, 0, 0, GFP_KERNEL); + //if (minor < 0) + // goto error; + port->minor = minor; port->port_number = i; } @@ -1058,7 +1112,7 @@ */ serial->disconnected = 1; - if (allocate_minors(serial, num_ports)) { + if (allocate_minors(serial, num_ports,dev_name(&port->serial->dev->dev))) { dev_err(ddev, "No more free serial minor numbers\n"); goto probe_error; }
后来发现以上方法有问题,串口好是改了,系统没费配到改的串口号就是手动改的串口号并不是idr_alloc 分配出来的串口号,导致去打开的时候经常打不开
终极解决方法
如下所示:
#!/system/bin/sh creat_tty_symlink(){ tty0=$(ls -l /sys/class/tty/$1) hastty=$(ls /sys/class/tty*) #goal="2-1.1" echo "parameter1 is "$1 echo "hastty is "$hastty if [[ $tty0 == *"2-1.1"* ]] ; then if [[ $hastty == *"ttyXRUSB1"* ]] ; then echo "ttyXRUSB1 exsit" else echo "creat ttyXRUSB1" rm /dev/ttyXRUSB1 ln -s /dev/$1 /dev/ttyXRUSB1 chown system:system /dev/ttyXRUSB1 fi elif [[ $tty0 == *"2-1.2"* ]] ; then if [[ $hastty == *"ttyXRUSB2"* ]] ; then echo "ttyXRUSB2 exsit" else echo "creat ttyXRUSB2" rm /dev/ttyXRUSB2 ln -s /dev/$1 /dev/ttyXRUSB2 chown system:system /dev/ttyXRUSB2 fi elif [[ $tty0 == *"2-1.3"* ]] ; then if [[ $hastty == *"ttyXRUSB3"* ]] ; then echo "ttyXRUSB3 exsit" else echo "creat ttyXRUSB3" rm /dev/ttyXRUSB3 ln -s /dev/$1 /dev/ttyXRUSB3 chown system:system /dev/ttyXRUSB3 fi elif [[ $tty0 == *"2-1.4"* ]] ; then if [[ $hastty == *"ttyXRUSB4"* ]] ; then echo "ttyXRUSB4 exsit" else echo "creat ttyXRUSB4" rm /dev/ttyXRUSB4 ln -s /dev/$1 /dev/ttyXRUSB4 chown system:system /dev/ttyXRUSB4 fi else echo "end" fi } while true do creat_tty_symlink ttyUSB0 sleep 1 creat_tty_symlink ttyUSB1 sleep 1 creat_tty_symlink ttyUSB2 sleep 1 creat_tty_symlink ttyUSB3 sleep 1 creat_tty_symlink ttyUSB4 sleep 2 done
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。