linux 驱动调试,linux 驱动开发

大家好,今天来为大家分享linux 驱动调试的一些知识点,和linux 驱动开发的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

Linux系统中列出PCI设备和USB设备的命令详解

lspci

NAME

lspci-列出所有PCI设备 [[ ]]

总览 SYNOPSIS

lspci [ options ] [[ ]]

描述 DESCRIPTION

lspci是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具。

为了能使用这个命令所有功能,你需要有 linux 2.1.82或以上版本,支持/proc/bus/pci接口的内核。在旧版本内核中,PCI工具必须使用只有root才能执行的直接硬件访问,而且总是出现竞争状况以及其他问题。

如果你要报告 PCI设备驱动中,或者是 lspci自身的 bugs,请在报告中包含 lspci-vvx的输出。

[[ ]]

选项 OPTIONS

-v

使得 lspci以冗余模式显示所有设备的详细信息。

-vv

使得 lspci以过冗余模式显示更详细的信息(事实上是 PCI设备能给出的所有东西)。这些数据的确切意义没有在此手册页中解释,如果你想知道更多,请参照/usr/include/linux/pci.h或者 PCI规范。

-n

以数字形式显示 PCI生产厂商和设备号,而不是在 PCI ID数据库中查找它们。

-x

以十六进制显示 PCI配置空间(configuration space)的前64个字节映象(标准头部信息)。此参数对调试驱动和 lspci本身很有用。

-xxx

以十六进制显示所有 PCI配置空间的映象。此选项只有 root可用,并且很多 PCI设备在你试图读取配置空间的未定义部分时会崩溃(此操作可能不违反PCI标准,但是它至少非常愚蠢)。

-b

以总线为中心进行查看。显示所有 IRQ号和内存地址,就象 PCI总线上的卡看到的一样,而不是内核看到的内容。

-t

以树形方式显示包含所有总线、桥、设备和它们的连接的图表。

-s [[bus]:][slot][.[func]]

仅显示指定总线、插槽上的设备或设备上的功能块信息。设备地址的任何部分都可以忽略,或以*代替(意味着所有值)。所有数字都是十六进制。例如:0:指的是在0号总线上的所有设备;0指的是在任意总线上0号设备的所有功能块;0.3选择了所有总线上0号设备的第三个功能块;.4则是只列出每一设备上的第四个功能块。

-d [vendor]:[device]

只显示指定生产厂商和设备 ID的设备。这两个 ID都以十六进制表示,可以忽略或者以*代替(意味着所有值)。

-i file

使用 file作为 PCI ID数据库而不是使用默认的/usr/share/hwdata/pci.ids。

-p dir

使用 dir作为包含 PCI总线信息的目录而不是使用默认的目录/proc/bus/pci。

-m

以机器可读的方式转储 PCI设备数据(支持两种模式:普通和冗余),便于脚本解析。

-M

使用总线映射模式,这种模式对总线进行全面地扫描以查明总线上的所有设备,包括配置错误的桥之后的设备。请注意,此操作只应在调试时使用,并可能造成系统崩溃(只在设备有错误的时候,但是不幸的是它们存在),此命令只有 root可以使用。同时,在不直接接触硬件的 PCI访问模式中使用-M参数没有意义,因为显示的结果(排除 lspci中的 bug的影响)与普通的列表模式相同。

--version

显示 lspci的版本。这个选项应当单独使用。

[[ ]]

PCILIB选项 PCILIB OPTIONS

PCI工具使用 PCILIB(一种可移植的库,提供平台独立的函数来访问 PCI配置空间)来和PCI卡交互。下面的选项用来控制库参数,特别是所用访问模式的指定。默认情况下,PCILIB使用第一种可用的访问模式,不会显示任何调试信息。每一个开关选项都列出了一组它所支持的硬件/软件列表。

-P dir

使用 linux 2.1风格的配置,直接访问目录 dir而非/proc/bus/pci目录。(只能在 linux 2.1或以上版本中使用)

-H1

通过 Intel架构 1来实现直接硬件访问。(只能用于 i386及其兼容机)

-H2

通过Intel架构 2来实现直接硬件访问。警告:此模式只能寻址任何总线上的前16个设备,并且在很多情况下相当不可靠。(只能用于 i386及其兼容机)

-S

使用 PCI系统调用访问。(只能用于 Alpha和 Ultra-Sparc上的 Linux)

-F file

从所给的包含 lspci-x命令输出的文件中获取相关信息。这在分析用户提交的错误报告时很有用,因为你可以用任何方式来显示硬件配置信息而无需为了获取更多信息打扰用户。(可用于所有系统)

-G

增加库的调试等级。(可用于所有系统)

例:

a,列出所有PCI设备

代码如下:

[root@localhost zhangy]# lspci-tv#列出所有PCI设备

b,查看网卡型号

代码如下:

[root@localhost zhangy]# lspci|grep-i eth

05:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8039 PCI-E Fast Ethernet Controller(rev 14)

lsusb

lsusb作用:

列出所有usb设备

lsusb语法:

lsusb [参数]

lsusb参数:

-D设备路径不扫描/proc/bus/usb,而以指定的设备路径取代

-p内核路径使用其他USB设备在内核的路径,默认为/proc/bus/usb

-t将USB设备以树状架构输出

-v列出较详细的运行过程

-vv列出完整的运行过程

-V显示版本信息

例:

代码如下:

[root@localhost zhangy]# lsusb   #列出所有usb设备

linux驱动怎么调试

如何调试 linux驱动?启用调试信息(config_debug_kernel、config_dynamic_debug)。编译内核(启用调试信息)。安装内核调试工具(gdb、kdb、dmesg)。加载驱动(使用 debug参数)。设置断点(使用 break命令)。启动调试器(kdb或 gdb)。调试驱动(使用调试器命令)。分析内核日志(使用 dmesg命令)。使用符号表(使用 kallsyms命令)。使用内核分析器(例如 kgdb或 coredump)。

Linux驱动调试指南

如何调试Linux驱动?

调试Linux驱动时,可以采用以下步骤:

1.启用调试信息

通过修改内核配置文件,启用CONFIG_DEBUG_KERNEL和CONFIG_DYNAMIC_DEBUG选项,启用调试信息。

2.编译内核

使用启用了调试信息的内核配置,重新编译内核。

3.安装内核调试工具

安装必要的内核调试工具,如:

gdb:用于调试器kdb:用于内核调试器dmesg:用于显示内核消息

4.加载驱动

使用insmod命令加载驱动,并传递debug参数,例如:

insmod my_driver.ko debug

5.设置断点

在调试器中(如gdb),设置断点以在感兴趣的地方暂停执行。可以使用break命令,例如:

(gdb) break my_function

6.启动调试器

使用kdb命令启动内核调试器,或直接使用gdb附加到内核进程,例如:

(gdb) attach:1

7.调试驱动

使用step、next和print等调试器命令,逐步执行驱动代码并检查变量的值。

8.分析内核日志

使用dmesg命令查看内核日志,查找与驱动相关的错误或警告信息。

9.使用符号表

在调试过程中,可以使用kallsyms命令查看内核符号表,将地址映射到符号名称。

10.使用内核分析器

可以使用KGDB或Coredump等内核分析器,分析内核崩溃或挂起的根本原因。

嵌入式linuxI2C调试工具

分享一款嵌入式开发利器,i2c-tools,尤其适用于Linux I2C驱动调试。调试过程中,我们常常面临硬件与软件交互不清的情况,示波器难以捕捉到关键波形,此时,一款得力工具能极大提升效率。

在调试过程中,我曾遇到定位问题的困扰,查阅大量资料却难寻答案。偶然间发现i2c-tools,这款工具能清晰显示系统中开启的总线数量与总线上挂载的I2C设备地址。使用后,问题迅速定位,问题解决,大大节约了调试时间与成本。

我使用的是i2c-tools 4.3版本。在虚拟机中编译后,将编译生成的工具文件移至开发板。操作步骤简明如下:

1、在工具目录下,执行`make`命令进行编译。

2、使用`sudo make install`命令安装工具。

3、将i2cset、i2cget、i2cdump、i2cdetect、i2ctransfer等工具移动到开发板的`rootfs/bin`目录下。

4、使用`sudo cp lib/libi2c.so.0.1.1/usr/lib/libi2c.so.0`和`sudo chmod 777/usr/lib/libi2c.so.0`命令,将`libi2c.so.0.1.1`文件移至开发板路径,并赋予执行权限。

安装完成,即可通过以下命令进行调试:

1、使用`i2cdetect`命令查看系统中开启的I2C总线。

2、通过`i2cget`命令查看总线上挂载的特定地址I2C设备。

通过这些操作,你可以获取到所有设备信息,包括获取和设置单个设备的值等,实现I2C设备的全面调试。

对i2c-tools感兴趣的朋友们,可以通过网络获取或在公众号内回复“i2ctool”获取安装包。

阅读剩余
THE END