AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1535505
Accepted
robert rozee
robert rozee
Asked: 2024-12-14 20:47:19 +0800 CST2024-12-14 20:47:19 +0800 CST 2024-12-14 20:47:19 +0800 CST

内核 6.8 及更高版本中串行驱动程序名称发生更改

  • 772

在内核 6.8 之前 [编辑:实际上在 6.3 之前(包括 6.3);我无法检查 6.3 和 6.8 之间的内核],固定串行端口(ttySxx)的驱动程序路径解析为/sys/bus/platform/drivers/serial8250并且只需检查名称是否为“ serial8250 ”就足以判断是固定设备还是可移动(USB)设备 - 如果驱动程序名称不是“ serial8250 ”,则可以假设它是(a)可移动设备并且(b)无需进一步检查以确保它是真实设备(即不仅仅是占位符)。

这是 Soren Holm 在此处提供的检查端口的解决方案中使用的: https://stackoverflow.com/questions/2530096/how-to-find-all-serial-devices-ttys-ttyusb-on-linux-without-opening-them 多年来,在我编写的软件中我一直在使用 Soren 代码的 Pascal 翻译,没有任何问题或抱怨。

但是从内核 6.8 开始(Ubuntu 24.04LTS),驱动程序路径已经改变。现在它解析为/sys/bus/serial-base/drivers/port,并且名称“ port ”太过通用,不能用作决策依据 - 内核 6.8 破坏了 Soren 的代码。到目前为止,我还没有在网上找到关于内核这一变化的任何有用讨论。

我的问题是,对于内核 6.8 及更高版本,是否有任何可靠的替代检查来确定串行端口是否与“ serial8250 ”驱动程序相关联?有没有专家知道串行端口驱动程序的更改、更改的原因以及解决后果的解决方法?

欢呼吧,Rob :-)

附录:澄清一下,我检查了 6.3 及之前的内核、6.8 及之后的内核,但没有检查 6.3 和 6.8 之间的内核。因此,在内核 6.3 之后的任何地方都可能发生更改

drivers
  • 1 1 个回答
  • 191 Views

1 个回答

  • Voted
  1. Best Answer
    robert rozee
    2025-02-08T17:26:36+08:002025-02-08T17:26:36+08:00

    驱动程序名称不再有助于识别固定串行设备,因此我想出了替代代码(用 Pascal 编写),它似乎适用于 6.8 和更早版本的 Ubuntu 内核:

    program project1;
     
    uses SysUtils, BaseUnix, TermIO;
     
    var DeviceName:string;
                SR:TSearchRec;
                FD:longint;
              tios:TermIOS;
          n, c, PT:integer;
     
    begin
      n:=0;
      c:=0;
      if FindFirst('/sys/class/tty/*', faAnyFile , SR) = 0 then                    // alternative: should ALSO find any rfcomm*
      repeat
        DeviceName:=SR.Name;
     
        if (DeviceName<>'.') and (DeviceName<>'..') then                           // exclude '.' and '..'
        if fpAccess('/dev/'+DeviceName, R_OK+W_OK)=0 then                          // exclude devices we have NO ACCESS to
        if FileExists('/sys/class/tty/'+DeviceName+'/device/driver')  or           // this suffices with FPC prior to 3.20
           DirectoryExists('/sys/class/tty/'+DeviceName+'/device/driver')  then    // from FPC 3.20 onwards we need this instead
        begin
          if FileExists('/sys/class/tty/'+DeviceName+'/type') then PT:=1           // port type 1 = fixed serial port
                                                              else PT:=2;          // port type 2 = removable/USB
          if PT=1 then
          begin
            FD:=fpOpen('/dev/'+DeviceName, O_RDWR or O_NONBLOCK or O_NOCTTY);
            if FD<0 then PT:=0 else                                                // -1, couldn't open /dev entry -> failure!
            begin
    //        if IsATTY(FD)=0 then PT:=0                                           // IsATTY (and TTYname) use ioctl/TCGETS
    //                        else inc(n);                                         // count number of fixed serial ports
              if fpIOCtl(FD,TCGETS,@tios)<>0 then PT:=0                            // TCGETS: on success 0 is returned,
                                             else inc(n);                          //         on error -1 is returned
              fpClose(FD)
            end
          end;
     
          if PT<>0 then inc(c);                                                    // count total number of ports
          case PT of 1:writeln('* ', DeviceName);                                  // fixed serial port, verified as real
                     2:writeln('  ', DeviceName)                                   // removable (USB) serial port
          end
        end
      until FindNext(SR) <> 0;
     
      if n<>0 then writeln('(', n, ' fixed devices)');
      if c=0 then writeln('no serial ports found');
      FindClose(SR)
    end.
    
    • 0

相关问题

  • Ubuntu 中的科胜讯调制解调器

  • 如何解决联想笔记本电脑上恢复/电源问题时禁用的蓝牙?

  • 如何为 LG X130 上网本安装 relink 无线驱动程序

  • 类似于 Eyefinity 的东西?

  • 在哪里可以找到 Brother HL-2170W 64 位打印机驱动程序?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve