首页 > 系统相关 >linux usb option,Linux -> usb-serial -> option.c 设备编译usb-serial支持多设备

linux usb option,Linux -> usb-serial -> option.c 设备编译usb-serial支持多设备

时间:2022-12-01 12:14:30浏览次数:41  
标签:usb generic usbserial 模块 device serial option

在使用LC6311或者SIM4100类似的通讯modem的时候,我们经常使用usbserial驱动来在linux环境下访问模块。

但是,每次,我们插入特定模块到usb端口后,都需要手动加载usbserial模块,如:

# load LC6311 module driver

sudo modprobe usbserial vendor=0x1ab7product=0x6000

# load SIM4100 module driver

sudo modprobe usbserial vendor=0x0456 product=0x6532

并输入特定的vendor和product参数,十分麻烦。最近在实践的过程中,碰到了更麻烦的问题:基本的usbserial不能直接支持多个不同参数的modem同时使用。比如,当使用上面的第一个命令加载了LC6311的模块以后,第二个命令将没有效果(因为,modprobe发现usbserial已经加载,便放弃了第二次的加载)。下面是通过对usbserial驱动的一些修改,来实现静态支持模块SIM4100和LC6311。

首先,我们需要自己运行的linux系统对应的内核代码。这里,我将不叙述对于和内核不同版本的模块,如何加载的问题。假设我们已经下载好了对应版本的源代码,并解压缩放到了对应目录下。我们首先设定内核代码的根目录为:

export KERNEL_SOURCE_DIR=/usr/src/linux-source-2.6.31 1.修改$KERNEL_SOURCE_DIR/drivers/usb/serial/generic.c文件

这里主要是修改$KERNEL_SOURCE_DIR/drivers/usb/serial/generic.c文件中的usb_serial_generic_register()函数。

我们平时使用modprobe加载usbserial驱动时输入的vendor和product参数是传给usbserial_generic这个模块的。这里的调用过程是usb_serial_init()->usb_serial_general_register()。在这个函数中,在这里传入的参数:

generic_device_ids[0].idVendor = vendor;

generic_device_ids[0].idProduct = product;

generic_device_ids[0].match_flags = USB_DEVICE_ID_MATCH_VENDOR| USB_DEVICE_ID_MATCH_PRODUCT;

我们这里需要加入我们自己设备的vendor和product,因此在这行下面,我们需要加入:

// added by xzpeter, try to support both sim4100 and lc6311

// for sim4100

generic_device_ids[1].idVendor = 0x0456;

generic_device_ids[1].idProduct = 0x6532;

generic_device_ids[1].match_flags =

USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;

// for lc6311

generic_device_ids[2].idVendor = 0x1AB7;

generic_device_ids[2].idProduct = 0x6000;

generic_device_ids[2].match_flags =

USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;

// end here 2.编译模块

之后,回到内核的根目录,首先要按照原先的config配置编译内核,主要是为了得到Module.symvers文件(以及modpost等。如果直接编译模块,就算编译成功,也可能无法加载):

make menuconfig

make

这里,如何配置内核将不详细说明,主要是要保证配置要加入"device drivers"->"usb support"->"usb serial convertor support"中的对应项。

{注:如果之前已经编译过内核,可以直接编译模块。使用如下方式编译:}

make -C $KERNEL_SOURCE_DIR M=drivers/usb/serial modules

编译完成后,即可在对应目录下得到新的usbserial.ko驱动程序。 3.替换系统原有usbserial驱动

如果是在2.6.x内核中,则需要将这个文件复制到对应目录,并加载:

cd /lib/modules/`uname -r`/kernel/drivers/usb/serial

# 备份原有驱动

sudo mv usbserial.ko usbserial.ko.bak

# 放入新的驱动

sudo cp $KERNEL_SOURCE_DIR/drivers/usb/serial/usbserial.ko ./

sudo rmmod usbserial

# 加载新的驱动,这里就不用加vendor和product参数了,已经加入静态的id_table了

sudo modprobe usbserial

这样,以后在插入SIM4100或者LC6311模块的时候,就不用输入任何vendor和product参数了,这两个模块也可以同时使用了。可以用:

ls /dev/ttyUSB*

查看一下,是不是两个模块的设备文件都有了

标签:usb,generic,usbserial,模块,device,serial,option
From: https://www.cnblogs.com/hshy/p/16941019.html

相关文章

  • This driver is named "option"
    Thisdriverexistsbecausethe"normal"serialdriverdoesn'tworktoowell  withGSMmodems.Issues:  -dataloss--onesingleReceiveURBisnotnearl......
  • 这回终于把Java类中Serialversionuid 作用讲的明明白白了
    实现Serializable接口的目的是为类可持久化,比如在网络传输或本地存储,为系统的分布和异构部署提供先决条件。若没有序列化,现在我们所熟悉的远程调用,对象数据库都不可能存在,......
  • UAC实例分析-USB音响
     在AndroidUSB之复合设备(gadget)详解一篇中提到了USBGadgetUAC(USBAudioClass)的使用。Rockchip平台可以支持UAC1(兼容USBAudioClassspecification1.0)和UAC2(......
  • serialportscreen-2022-11-30
    1、DGUSV5.08中“RTC设置”组件即便勾选了“数据自动上传”,经过实际测试屏幕是不会像平常其它组件(例如录入组件)一样主动往串口上传修改后的RTC时间数据的。2、手上有两款......
  • 到底什么时候需要 implements Serializable ,实体类必须 implements Serializable 才可
    我们都有个惯性思维,就是实体类需要 implementsSerializable以序列化,序列化有两个作用:1、序列化就是将对象属性转变为二进制数据。2、在网络上进行传输。但是我发现......
  • C#后续任务条件参数:TaskContinueOption --枚举类型
    一、概述一个线程可以有多个任务,一个任务也可以包含多个任务。把一个任务附加给另一个任务,就需要用到ContinueWith()。该方法是Task类中的方法,有多个重载,其中最基......
  • 为什么要实现Serializable
     工作中我们经常在进行持久化操作和返回数据时都会使用到javabean来统一封装参数,方便操作,一般我们也都会实现Serializable接口,那么问题来了,首先:为什么要进行序列化;......
  • USB4.0
    USB4.0是2019年发布的规范文档,是基于Thunderbolt3协议,使用TypeC接口,支持USB、DP、PCIe功能。USB4和DisPlayPort2.0融合在一起,USBType-C接口可以转换为DP2.0模式,用来......
  • PCIe与usb
    PCI-e,SATA一般用于计算机内部,不同模块之间的“高速数据通信”,比如硬盘与南桥,网卡与南桥,显卡与北桥之间的通信,这类接口一般比较固定,不允许随意插拔......
  • Invalid options in vue.config.js: "before" is not allowed
    这个问题已解决,webpack的版本不同导致的,需要把vue.config.js中before改成onBeforeSetupMiddleware,并且到index.js中的app.use改为app.app.use,即可完美解决。   ......