[置顶] linux USB虚拟串口设备名的修改

时间:2023-01-09 16:12:22
    在LINUX 中,会经常用到USB转串口的设备。而LINUX中通用的做法是根据插入USB设备的先后顺序依次注册ttyUSB0\1\2\3..等设备,但是这样就有一个问题了,例如我有多个USB的口,要接多种不同USB转串口设备,那么我插上USB的顺序不同,那同一个设备注册的设备名就不同了,这样就造成在APP中调用的USB的设备名变化的,这样就增加了APP开发的难度。那么可不可把不同的设备注册的串口号固定下来呢?
    在linux的USB转串口的驱动中,定义了一个serial_table的指针数组,这个数组保存每一个注册的USB串口设备。当USB插上时,usb_serial_probe会被执行,这个函数会调用get_free_serial。在get_free_serial中,会遍历整个数组,寻找第一个没有被赋值的单元,将设备的usb_serial结构的地址保存的这个单元,同时将该数组元素的下标赋值给usb_serial结构中port[N]的number(一个USB设备可以有多个PORT),而这个number就是最后注册的设备名ttyUSB0\1\2\3..后面的数字。
    那么是不是我们可以给每一个设备指定一个开始的number号,那么不论先后顺序设备名都可以固定了。
    下面还有一个问题,就是怎么在get_free_serial中判断是什么设备呢?这个LINUX已经给我们准备好了,就是description,我们只要比较description和我们要指定的设备是否相同就好了。这个保存在usb_serial结构的type->description下,这个description我们是定义在设备驱动的usb_serial_driver结构的description。如果没有定义description,那么将用usb_serial_driver结构中的driver->name作为description。
     有了上面的知识,我们的工作就很简单了只要在get_free_serial的开头加上下面的代码,就大功告成了。
     if(memcmp(serial->type->description,"dev name ",6) ==0)
     {
             i=_DEF_NUMBER;
      }
   else
     {
              i=0;
      }