• ubuntu 18.04换内核后找不到 /dev/ttyUSB0问题


    系统: win10 + ubuntu18.04.6
    内核:非默认内核,新安装的内核 5.4.0-42 版本
    uname -r
    5.4.0-42-generic

    问题:
    用USB转串口线连接开发版串口,
    ls /dev/tty*
    ls /dev |grep tty

    查找不到 ttyUSB0;

    lsmod | grep usbserial

    没有,说明系统不支持USB转串口。
    于是 参考博客安装驱动 ch340,
    在sudo make load , 报错:原因是执行 modprobe usbserial 报错

    modprobe: ERROR: could not insert ‘ch341’: Exec format error

    modprobe 加载模块时 出现权限不允许提醒;Operation not permitted 解决:root 权限,加 sudo

    modprobe 提示 FATAL: Module chrdevbase not found in directory /lib/modules/5.4.0-42-generic
    可能是缺少相关路径、文件或是文件名不需要带扩展
    使用modprobe xx 命令后,会到文件系统/lib/modules/xxxxx目录下查找相应的XX.ko文件;找不到报错;

    sudo cp ch34x.ko /lib/modules/uname -r/kernel/drivers/usb/serial/
    重启仍然 中找不到;

    对比 原来的内核版本 /lib/modules/5.4.0-84-generic/kernel/drivers/usb
    发现 /lib/modules/5.4.0-42-generic/kernel/drivers/usb 中少了 usbserial 文件夹,而且少了很多 drivers 文件。
    因此怀疑是在安装 5.4.0-42-generic 内核时,没有安装完全。
    通过 dpkg --get-selections | grep linux

    对比,发现新安装的 5.4.0-42-generic, 少了 linux-modules-extra;

    sudo apt install linux-modules-extra-5.4.0-42-generic
    重启后,
    /lib/modules/5.4.0-42-generic/kernel/drivers 中多了很多文件;
    /lib/modules/5.4.0-42-generic/kernel/drivers/usb 有了usbserial 文件夹;

    usbserial 文件夹中已经有 ch341.ko ,usbserial.ko 等驱动。

    lsmod | grep usbserial 还是没有;
    sudo modprobe usbserial # 加载模块
    lsmod | grep usbserial
    有了

    加载自带驱动 ch341.ko

    sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/usb/usbserial /ch341.ko
    depmod
    执行depmod命令(建立该模块的依赖关系。也即必须用 depmod 来更新一下 /lib/modules/$(uname -r)/modules.dep 文件)

    rmmod 命令 卸载驱动;即 emmod ch341.ko
    再次: lsmod | grep usbserial
    显示正确:
    USB转串口线连接开发版串口,ls /dev |grep tty ,看到有了 ttyusb0;

    通过lsmod来查看当前系统中已经加载的模块,lsmod命令显示的当前内核已经加载的模块和驱动。
    执行lsmod指令,会列出所有已载入系统的模块。Linux操作系统的核心具有模块化的特性,应此在编译核心时,务须把全部的功能都放入核心。您可以将这些功能编译成一个个单独的模块,待需要时再分别载入。
    lsmod命令显示的当前内核已经加载的模块和驱动。以下面行为例:

    scsi_mod 130637 6 qla2xxx,scsi

    _transport_fc,mptspi, mptscsih, scsi_transport_spi,sd_mod

    第1列:表示模块的名称,如scsi_mod表示scsi模块。

    第2列:表示模块的大小,如130637表示scsi_mod模块的大小为130637字节。

    第3列:表示依赖于该模块的个数,如6表示有6个模块依赖scsi_mod模块。

    第4列:表示依赖模块的内容,如qla2xxx表示Qlogic FC HBA光纤HBA卡模块。

    通常在使用lsmod命令时,都会采用类似lsmod|grep usbserial这样的命令来查询当前系统是否加载了某些模块。

    通常会配合grep来查看指定模块是否已经加载,若没有加载,先确认模块是否已经安装,安装完成后可以用modprobe 来加载

    modprobe insmod 加载模块和驱动

    modprobe -r 卸载模块;
    rmmod来卸载驱动。
    卸载驱动模块的时候,使用modprobe -r 卸载,不需要将后缀名,即 modprobe -r hello 就可以
    使用rmmod 卸载则必须要加后缀名.ko 即rmmod hello.ko
    与内核模块操作相关的命令还有:lsmod modinfo depmod rmmod insmod modprobe

    对于没有驱动或者不是用默默人驱动的话,可以参考 ,安装出 驱动;

  • 相关阅读:
    bayesplot|分享一个可视化贝叶斯模型的R包
    用DIV+CSS技术设计的西安旅游网站18页(web前端网页制作课作业)HTML+CSS旅游网站设计与实现
    ps怎么对字体进行加粗?
    根据散度定义推导其在柱坐标和球坐标下的表达式
    Android开发笔记1:Android Studio 2021.3.1.17 Toolbar工具栏调整
    Oracle存储过程
    [附源码]SSM计算机毕业设计高校奖学金评定管理系统JAVA
    动态获取填充表格数据时的特定值的赋值
    【图像分类】2018-MobileNetV2
    Python中popitem()删除并返回最后插入字典中的键值对
  • 原文地址:https://blog.csdn.net/qq_43222384/article/details/125995501