linux如何通過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;
}
后來發(fā)現(xiàn)以上方法有問題,串口好是改了,系統(tǒng)沒費配到改的串口號就是手動改的串口號并不是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
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Linux 出現(xiàn)telnet: 127.0.0.1: Connection refused錯誤解決辦法
這篇文章主要介紹了Linux 出現(xiàn)telnet: connect to address 127.0.0.1: Connection refused錯誤解決辦法的相關資料,需要的朋友可以參考下2017-05-05
ubuntu 13.10編譯安裝mono環(huán)境(二)
接上篇,上篇僅安裝了Mono本身,并沒有安裝libgdiplus、gtk-sharp、mod_mono、MonoDevelop 等其他相關的軟件。 這篇主要是配置安裝libgdiplus。2014-07-07
新版ubuntu20.04 使用root用戶登錄系統(tǒng)的詳細教程
這篇文章主要介紹了新版ubuntu20.04 使用root用戶登錄系統(tǒng)的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
Apache環(huán)境下配置多個ssl證書搭建多個站點的方法
這篇文章主要介紹了Apache環(huán)境下配置多個ssl證書搭建多個站點的方法,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07

