RK3399内核入门:通过sysfs清楚了解设备系统状况
sysfs是Linux内核虚拟文件系统,以目录和文件形式暴露设备、驱动、总线信息。在RK3399平台开发中,可通过 sys目录下的bus、devices、class等子目录查看CPU频率、GPIO状态、I2C SPI设备及驱动绑定情况,辅助诊断硬件问题与配置参数。
# RK3399平台开发系列讲解(内核入门篇)
## 1.1 通过sysfs清楚了解设备的系统状况
sysfs 是 Linux 内核提供的一个虚拟文件系统,它将内核中的设备、驱动、总线等信息以文件和目录的形式暴露给用户空间。对于 RK3399 平台的嵌入式开发来说,熟练运用 sysfs 可以快速诊断硬件状态、配置驱动参数、调试设备问题。本教程将带你一步步掌握 sysfs 的基本用法,并通过实际截图理解设备在系统中的真实表现。
---
## 一、sysfs 的基本结构
sysfs 通常挂载在 `/sys` 目录下,其核心目录包括:
- `/sys/bus` – 按总线类型组织设备(如 platform、spi、i2c 等)
- `/sys/devices` – 按设备树或硬件拓扑组织所有设备
- `/sys/class` – 按设备功能分类(如 input、net、gpio 等)
- `/sys/block` – 块设备信息
- `/sys/firmware` – 固件信息
### 示例目录结构

从图中可以看到,`/sys` 下包含了 `bus`、`class`、`devices` 等顶层目录。每个目录下的文件和子目录都对应内核中一个具体的 **kobject** 对象。
> **小提示:** 使用 `ls -l` 查看时,许多文件是符号链接,指向 `/sys/devices` 下的真实设备路径。
---
## 二、通过 sysfs 查看设备详细信息
### 2.1 查看 CPU 信息
RK3399 是双核 Cortex-A72 + 四核 Cortex-A53 的 big.LITTLE 架构。在 sysfs 中可以通过以下路径查看每个 CPU 核心的状态:
```bash
ls /sys/devices/system/cpu/
```
每个核心对应 `cpu0`、`cpu1` 等子目录。进入某个核心目录,例如:
```bash
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
```
该文件输出当前 CPU 的运行频率(单位 kHz)。如果你看到类似 `1416000` 的数字,表示工作在 1.416GHz。

> **常见问题:**
> Q: 查看 `scaling_cur_freq` 时提示“No such file or directory”怎么办?
> A: 通常是因为 CPU 调频驱动未加载或 cpufreq 子系统未启用。检查内核配置 `CONFIG_CPU_FREQ` 是否开启。
### 2.2 查看内存和 DMA 信息
内存信息可以通过 `/sys/devices/system/memory/` 查看,但更常用的是 `/proc/meminfo`。不过 sysfs 中 `/sys/devices/system/edac/mc/` 提供内存错误记录(如果硬件支持)。对于 RK3399,常用的 DMA 设备信息在:
```bash
ls /sys/class/dma/
```
每个 DMA 通道对应一个目录,其中 `device` 链接指向具体的 DMA 控制器。

> **小提示:** 如果遇到 DMA 传输卡顿,可以检查 `/sys/class/dma/dma0chan*/bytes` 等文件获取传输统计。
### 2.3 查看 GPIO 及其复用状态
RK3399 的 GPIO 管理非常关键。通过 sysfs 可以快速查看某个 GPIO 的输入/输出状态、复用功能等:
```bash
ls /sys/class/gpio/
```
但要查看具体的 GPIO 控制器和引脚复用,通常需要访问 `/sys/kernel/debug/gpio`(需要挂载 debugfs)或者 `/sys/devices/platform/` 下对应的 pinctrl 节点。

图中展示了 `/sys/class/gpio/export` 和 `unexport` 文件,用于将内核空间的 GPIO 导出到用户空间进行控制。
> **常见问题:**
> Q: 为什么我 `echo 100 > /sys/class/gpio/export` 后报错“Invalid argument”?
> A: GPIO 编号必须是该 GPIO 控制器的有效编号,且该引脚未被其他驱动占用。先通过 `cat /sys/kernel/debug/gpio` 查看已使用的 GPIO。
### 2.4 查看 I2C / SPI 总线设备
RK3399 有多个 I2C 和 SPI 控制器。通过 sysfs 可以枚举总线上挂载的设备:
```bash
ls /sys/bus/i2c/devices/
```
每个条目如 `0-0048` 表示 I2C-0 总线上的设备,地址为 0x48。进入目录后可以查看 `name`、`driver` 等信息。

> **小提示:** 如果设备未正确注册,`name` 文件可能为空。此时检查设备树中对应的节点是否使能、电源是否正常。
---
## 三、如何利用 sysfs 快速定位问题
### 3.1 检查设备是否枚举成功
当一个硬件模块(如摄像头、WiFi 模块)不工作时,第一步是确认它在 sysfs 中是否存在:
```bash
find /sys -name "*模块名*" 2>/dev/null
```
或者根据设备树中的节点名称搜索:
```bash
ls /sys/firmware/devicetree/base/
```
### 3.2 查看驱动绑定状态
每个设备都有一个 `driver` 符号链接,指向当前绑定的驱动。如果 `driver` 不存在,说明没有驱动匹配该设备。
```bash
ls -l /sys/devices/platform/fe310000.serial/driver
```
输出类似 `.../fe310000.serial/driver -> ../../../bus/platform/drivers/serial-tegra` 表示绑定成功。
### 3.3 动态配置参数
sysfs 还提供了许多可写属性,用于动态修改驱动行为。例如调整 GPIO 输出电平:
```bash
echo 1 > /sys/class/gpio/gpio17/value # 将GPIO17输出高电平
```
> **警告:** 动态修改可能导致系统不稳定,请确认你了解该属性的用途。
---
## 四、常见问题与解答
### Q1: 为什么 `ls /sys` 下有些目录是空的?
**A:** 空目录通常表示对应子系统尚未被内核初始化或没有硬件设备。例如 `/sys/class/leds` 为空说明没有注册任何 LED 设备。检查内核模块是否加载:`lsmod | grep leds`。
### Q2: 如何查看某个硬件的中断号?
**A:** 使用命令 `cat /sys/kernel/irq/*/chip_name`,或者查看设备目录下的 `irq` 文件:`cat /sys/devices/platform/*/irq`。对于 RK3399,也可以用 `cat /proc/interrupts` 获取全局中断统计。
### Q3: sysfs 中的文件权限是怎样的?为什么有些文件只读?
**A:** 大多数 sysfs 属性是只读的,表示内核状态。可写属性通常用于配置,如 `brightness`、`power/control` 等。普通用户可能无法写入,需使用 `sudo` 或设置 udev 规则。
### Q4: 如何在 sysfs 中找到某个设备的注册地址?
**A:** 进入设备目录后,查看 `reg` 文件(设备树中定义的寄存器基址)或 `of_node` 符号链接。例如:`cat /sys/devices/platform/ff110000.i2c/of_node/reg` 可读取该 I2C 控制器的地址。
---
## 总结
sysfs 是 RK3399 平台开发中最常用的调试工具之一。通过它你可以:
- 查看 CPU、内存、DMA 等核心组件的实时状态
- 枚举总线设备并验证驱动绑定
- 动态控制 GPIO、电源管理等外设
- 快速定位硬件未注册、驱动不匹配等问题
建议开发者在日常工作中养成随时查看 sysfs 的习惯,结合 `dmesg` 和设备树,可以大幅提升调试效率。
来源:https://m.elecfans.com/article/2122275.html
相关热点
继续查看同栏目近期热点。
延伸阅读
补充最近整理过的热点入口。
