山高疑日近,海阔觉天低

驱动开发涉及目录

在 Linux 驱动开发过程中,经常会涉及到特定的文件系统路径,这些路径允许开发人员和系统管理员与驱动程序进行交互、配置和调试。了解这些路径对开发和调试驱动程序至关重要。以下是一些常见的路径及其作用的详细解释:

一. /sys 目录

sysfs 文件系统的挂载点,sysfs 是一个内核提供的假文件系统,它呈现内核对象及其属性,使用户空间可以通过文件系统接口与内核交互。常用子目录

1./sys/class

包含设备类(device classes)的目录,每个类代表一类设备,如 net(网络设备)、block(块设备)、tty(终端设备)等。例如,网络设备可以在 /sys/class/net/ 下找到。应用层可以操作硬件设备大部分也是通过这个目录下进行的,如gpio,pwm目录可以导出设备进而控制它

ata_device    drm           leds          ptp           tee
ata_link      extcon        mdio_bus      pwm           thermal
ata_port      firmware      mem           pxp_device    tty
backlight     gpio          misc          rc            ubi
bdi           graphics      mmc_host      regulator     udc
block         hwmon         mtd           remoteproc    usb_role
bluetooth     i2c-dev       net           rtc           vc
devcoredump   ieee80211     phy           scsi_device   vtconsole
devlink       input         power_supply  scsi_disk     wakeup
dma           lcd           pps           scsi_host     watchdog

2./sys/block

包含块设备的信息,每个块设备都有一个对应的目录。例如,磁盘设备 sda 可以在 /sys/block/sda/ 找到。

3./sys/bus

包含所有总线类型(bus types)的目录,如 pci、usb、platform 等。每个总线类型目录都包含两个子目录:devices(该总线下的所有设备)和 drivers(该总线下的所有驱动程序)。

clockevents   dp-aux        hid           mmc           rpmsg         serio         usb
clocksource   event_source  i2c           mmc_rpmb      scsi          soc           virtio
container     genpd         iio           nvmem         sdio          tee           workqueue
cpu           gpio          mdio_bus      platform      serial        ulpi

4./sys/bus/*/drivers

包含 * 总线的驱动程序目录,每个平台驱动程序都有一个对应的目录。例如,如果你有一个叫 my_driver 的平台驱动程序,那么它的目录可能是 /sys/bus/*/drivers/my_driver/。
在这个目录下,你可以找到与该驱动程序相关的设备符号链接和驱动程序属性文件。文件夹名字是由platform_driver.device_driver.name 决定的

root@fl-imx6ull:~# ls -alh /sys/bus/platform/drivers/leds-gpio/
--w-------    1 root     root        4.0K Aug 21 05:36 bind
--w-------    1 root     root        4.0K Aug 21 05:36 uevent
--w-------    1 root     root        4.0K Aug 21 05:36 unbind

5./sys/bus/*/device=>/sys/devices/platform

包含 * 总线的驱动程序目录,该目录中的内容表示当前系统中所有通过平台总线注册的设备。每个设备都有一个对应的目录,目录名通常是设备的名称或类型。这些目录包含了一些文件和子目录,用于描述设备的属性、状态和配置,其都是软连接,指向/sys/devices/platform

ls -alh /sys/bus/platform/devices/leds
lrwxrwxrwx    1 root     root           0 Aug 21 05:29 /sys/bus/platform/devices/leds -> ../../../devices/platform/leds

ls -alh /sys/devices/platform/leds/
drwxr-xr-x 3 root root 0 Aug 21 05:29 .
drwxr-xr-x 15 root root 0 Aug 21 05:29 ..
-rw-r--r-- 1 root root 4.0K Aug 21 05:52 driver_override
-r--r--r-- 1 root root 4.0K Aug 21 05:52 modalias
lrwxrwxrwx 1 root root 0 Aug 21 05:52 of_node -> ../../../firmware/devicetree/base/leds  //设备树
drwxr-xr-x 2 root root 0 Aug 21 05:52 power
lrwxrwxrwx 1 root root 0 Aug 21 05:52 subsystem -> ../../../bus/platform
lrwxrwxrwx 1 root root 0 Aug 21 05:52 supplier:platform:209c000.gpio -> ../../virtual/devlink/platform:209c000.gpio--platform:leds
lrwxrwxrwx 1 root root 0 Aug 21 05:52 supplier:platform:20ac000.gpio -> ../../virtual/devlink/platform:20ac000.gpio--platform:leds
-rw-r--r-- 1 root root 4.0K Aug 21 05:29 uevent
-r--r--r-- 1 root root 4.0K Aug 21 05:52 waiting_for_supplier

6./sys/bus/*/device=>/sys/devices/platform

包含 * 总线的驱动程序目录,该目录中的内容表示当前系统中所有通过平台总线注册的设备。每个设备都有一个对应的目录,目录名通常是设备的名称或类型。这些目录包含了一些文件和子目录,用于描述设备的属性、状态和配置,其都是软连接,指向/sys/devices/platform

ls -alh /sys/bus/platform/devices/leds
lrwxrwxrwx    1 root     root           0 Aug 21 05:29 /sys/bus/platform/devices/leds -> ../../../devices/platform/leds

ls -alh /sys/devices/platform/leds/
drwxr-xr-x 3 root root 0 Aug 21 05:29 .
drwxr-xr-x 15 root root 0 Aug 21 05:29 ..
-rw-r--r-- 1 root root 4.0K Aug 21 05:52 driver_override
-r--r--r-- 1 root root 4.0K Aug 21 05:52 modalias
lrwxrwxrwx 1 root root 0 Aug 21 05:52 of_node -> ../../../firmware/devicetree/base/leds  //设备树
drwxr-xr-x 2 root root 0 Aug 21 05:52 power
lrwxrwxrwx 1 root root 0 Aug 21 05:52 subsystem -> ../../../bus/platform
lrwxrwxrwx 1 root root 0 Aug 21 05:52 supplier:platform:209c000.gpio -> ../../virtual/devlink/platform:209c000.gpio--platform:leds
lrwxrwxrwx 1 root root 0 Aug 21 05:52 supplier:platform:20ac000.gpio -> ../../virtual/devlink/platform:20ac000.gpio--platform:leds
-rw-r--r-- 1 root root 4.0K Aug 21 05:29 uevent
-r--r--r-- 1 root root 4.0K Aug 21 05:52 waiting_for_supplier

7./sys/devices

按设备的物理拓扑结构组织的目录,包括所有的设备节点。
设备根据它们在系统中的物理层次关系排列,便于了解设备之间的关联。

armv7_cortex_a7  breakpoint       mmdc             platform         soc0             software         system           virtual

8./sys/kernel/debug

包含调试信息的目录,只有在内核启用了调试功能(CONFIG_DEBUG_FS)时才会出现。
开发人员可以在这个目录中找到内核和驱动程序的详细调试信息。

二. /proc 目录

/proc 目录是 procfs 文件系统的挂载点,procfs 提供了内核和进程的信息。
常用子目录

1./proc/devices

列出已注册的字符设备和块设备及其主次设备号。

2./proc/device-tree=>/sys/firmware/devicetree/base

设备树,如果要查看设备树可以通过这个文件夹进行查询

ls /sys/firmware/devicetree/base
#address-cells #size-cells
clock-cli cpus pmu sound clock-di0 leds pxp_v4l2 timer aliases clock-di1 memory regulators 
backlight clock-osc model reserved-memory chosen compatible name soc

3./proc/interrupters

显示系统中断的详细信息,包括中断向量和处理这些中断的驱动程序名称。

4./proc/ioports

列出所有已注册的 I/O 端口范围及其对应的设备。

5./proc/meminfo

提供系统内存使用情况的信息。

三. /dev 目录

/dev 目录是设备文件的挂载点,设备文件通过这些节点允许用户空间访问内核中的设备驱动程序。
/dev/sda
表示第一个 SCSI 磁盘设备。
块设备通常在 /dev 下创建对应的设备节点,用户可以通过这些设备节点与硬件交互。

四. 其他相关路径

/etc/udev/rules.d
包含 udev 规则文件,用于动态创建和管理 /dev 下的设备节点。
udev 规则可以定制化设备节点的命名和权限,甚至能触发特定的用户空间脚本。
/lib/modules/[kernel_version]
包含当前内核版本的模块(驱动程序),每个模块文件通常以 .ko 结尾。
通过 modprobe、insmod 和 rmmod 等命令加载或卸载这些模块。
在驱动开发中的应用
调试与测试:通过访问 /sys 和 /proc 下的文件,驱动开发人员可以获取实时的驱动程序和设备的状态。
配置与控制:利用 sysfs 暴露的属性文件,用户可以动态地配置和控制驱动程序的行为。
设备节点管理:通过 udev 规则和 mknod 命令,开发人员和系统管理员可以管理 /dev 下的设备节点,方便设备的访问和权限管理。
总结来说,在 Linux 驱动开发过程中,熟悉和运用这些路径能够极大地帮助开发人员进行调试、配置、测试和管理驱动程序及其关联的硬件设备。

赞(1) 打赏
未经允许不得转载:Mr.Zhang » 驱动开发涉及目录

你的打赏是我的动力

登录

找回密码

注册