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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Linux中,可以通过修改udev规则来固定串口端口。具体步骤如下: 1. 打开udev规则文件:sudo nano /etc/udev/rules.d/99-serial.rules 2. 添加以下规则: KERNEL=="ttyS0", SYMLINK+="ttyUSB0" KERNEL=="ttyS1", SYMLINK+="ttyUSB1" KERNEL=="ttyS2", SYMLINK+="ttyUSB2" KERNEL=="ttyS3", SYMLINK+="ttyUSB3" 其中,KERNEL指定了串口设备的名称,SYMLINK指定了固定端口。 3. 保存文件并退出。 4. 重新加载udev规则:sudo udevadm control --reload-rules 5. 重新插拔串口设备,查看固定端口是否生效:ls /dev/ttyUSB* 注意:以上规则适用于USB串口设备,如果是其他类型的串口设备,需要根据实际情况修改规则。 ### 回答2: 在Linux下,固定串口端口的方法有许多种,下面介绍几种较为常用的方法。 一、使用udev规则 udev规则可以用来管理Linux系统中的设备,包括串口。通过编写udev规则,可以实现将串口设备固定在同一个端口。具体步骤如下: 1. 编写udev规则文件 在/etc/udev/rules.d/目录下新建一个以名为99-serial.rules的文件,并输入以下内容: KERNEL=="ttyS0", SYMLINK+="ttyusb0" 其中,KERNEL指定了设备的内核名称,这里的ttyS0表示第一个串口设备。SYMLINK指定了设备的符链接名称,这里的ttyusb0表示将该串口设备固定在这个端口。 2. 重启udev服务 运行以下命令重启udev服务: $ sudo service udev restart 3. 检查串口设备名称 执行以下命令查看串口设备名称是否已经固定在ttyusb0: $ ls -l /dev/tty* 其中,如果看到ttyusb0符链接,则说明已经成功将串口设备固定在了这个端口。 二、使用udevadm命令 udevadm命令可以用来显示、查询、控制和更新udev的设备数据库。通过udevadm命令,可以查询并修改设备的属性值,以达到固定串口端口的目的。具体步骤如下: 1. 查询串口设备的属性值 执行以下命令查询串口设备ttyS0的属性值: $ sudo udevadm info -a -n /dev/ttyS0 其中,-a参数表示查询设备的所有属性值,-n参数表示查询的设备名称。 2. 修改串口设备的符链接名称 执行以下命令将串口设备ttyS0的符链接名称修改为ttyusb0: $ sudo udevadm trigger --attr-match=subsystem=tty 其中,--attr-match参数指定了需要修改命令的设备子系统,这里是tty。 以上两种方法均可以实现在Linux系统中固定串口设备的端口。选择哪种方法,取决于实际情况和需求。同时,由于系统版本、网络环境等因素的影响,需要具体情况具体分析,选择适合自己的方法。 ### 回答3: Linux系统中,串口设备的端口通常为/dev/ttySx,其中x为串口设备的序,从0开始。在系统启动时,Linux会自动检测所有的串口设备,并分配一个默认的端口给它们。但是,由于系统硬件或其他因素的影响,这些设备的端口可能会在每次启动时重新分配,给用户带来很大的不便。因此,我们需要将串口设备的端口固定下来,以便我们在每次使用时都能准确地找到它们。 在Linux系统中,要想固定串口设备的端口,有两种方法: 1.通过udev规则固定设备端口 udev是Linux系统中的一种设备管理方式,它可以监测硬件的插入和拔出,自动加载驱动程序,分配设备节点等。我们可以通过添加udev规则的方式来指定串口设备的端口。 具体操作步骤如下: 1)查看目前的串口设备信息: dmesg | grep tty 2)在/etc/udev/rules.d目录下新建一个以60-serial.rules结尾的文件,并添加如下内容: KERNEL=="ttyS0", SYMLINK+="serial0" KERNEL=="ttyS1", SYMLINK+="serial1" KERNEL=="ttyS2", SYMLINK+="serial2" KERNEL=="ttyS3", SYMLINK+="serial3" 上述规则表示将ttyS0~ttyS3设备的端口分别映射到serial0~serial3,这样每次系统启动时都能固定分配这些端口给相应的设备。 3)重新加载udev规则: sudo udevadm control --reload-rules 2.在grub配置文件中指定串口设备的端口 另一种方法是在Linux系统启动时,通过在Grub引导器中指定串口设备的端口。具体操作步骤如下: 1)修改/boot/grub/menu.lst 或 /etc/default/grub文件,在kernel行中加入参数console=ttyS0,115200(115200为波特率) 2)保存修改,执行命令grub-install /dev/sda(其中sda为你的硬盘设备名) 3)执行update-grub2生成新的grub配置文件 以上两种方法均可以固定Linux系统中串口设备的端口,提高了系统的稳定性和可靠性。但需要注意的是,如果系统中存在多个串口设备,需要根据实际情况进行配置,避免端口冲突导致系统出现异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术求索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值