📚 Linux 内核专栏 · 持续更新中
本系列从底层原理到源码实战,逐篇拆解内核机制。
👉 想系统追更,戳这里查看完整专栏:
👉 其他技术系列专栏,欢迎关注、交流、共同成长:
【操作系统设计思想系列】 【CAN 技术系列】 【SPI 技术系列】【I2C 技术系列】 【串口技术系列】【RISC-V 架构系列】【 Android 系统全景专栏】
本篇定位 :Linux 内核专题 L3 补充篇 (SoC 驱动框架四件套)。19 设备树篇讲了"硬件怎么描述",本篇讲设备树引用的四大子系统 怎么把硬件抽象成 API:① GPIO 子系统 (gpiod,你 MCU 直接写寄存器 → Linux 经框架);② pinctrl 子系统 (引脚复用/配置,SoC 必备);③ Common Clock Framework (CCF,时钟树,所有外设的命脉);④ regulator 框架 (电源稳压器,功能安全/低功耗必备)。读完你能看懂 SoC BSP 的四件套驱动、能在自己驱动里用
devm_gpiod_get/devm_clk_get/devm_regulator_get、能调"外设不工作"是时钟/电源/引脚哪个没配。
嵌入式视角:这四件套是你 SoC BSP 的"基础设施",不写驱动也要懂MCU 裸机点灯 = 直接写 GPIO 寄存器(
GPIO0->OE |= BIT(5); GPIO0->DATA |= BIT(5))。Linux 上不能直接写寄存器 ------必须经 pinctrl 配引脚功能、经 clk 开时钟、经 regulator 开电源、经 gpiod 操作电平。四个子系统任何一个没配好,外设就死。这是你从 MCU 转 Linux 最容易"为什么我的外设不工作"的根源------不是代码错,是时钟/电源/引脚没就绪。本篇把这四条命脉拧清楚。
### 目录
- [@TOC(目录)](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [一、GPIO 子系统](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [1.1 GPIO 抽象演进:从 gpio_number 到 gpiod](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [1.2 设备树里的 GPIO](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [1.3 gpiod API(消费者侧)](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [1.4 GPIO 控制器驱动(gpio_chip,提供者侧)](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [1.5 GPIO 做中断](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [二、pinctrl 子系统](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [2.1 pinctrl 是什么](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [2.2 设备树里的 pinctrl](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [2.3 pinctrl 多 state(省电)](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [2.4 pinctrl 框架内部](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [三、Common Clock Framework](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [3.1 CCF 是什么](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [3.2 时钟类型(基本 clock)](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [3.3 设备树里的时钟](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [3.4 CCF 消费者 API](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [3.5 CCF 提供者驱动(clk_provider)](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [3.6 时钟精度:clk_set_rate 与 rate 范围](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [四、regulator 框架](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [4.1 regulator 是什么](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [4.2 设备树里的 regulator](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [4.3 regulator 消费者 API](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [4.4 regulator 提供者驱动](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [4.5 regulator 与 power domain](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [五、四件套协同:外设上电时序](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [5.1 一个外设工作的完整条件](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [5.2 probe 里的标准时序](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [5.3 时序要求(上电 sequencing)](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [5.4 逆时序(下电/PM suspend)](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [六、对照 FreeRTOS / RISC-V](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [6.1 硬件操作对照](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [6.2 RISC-V SoC 上的四件套](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [6.3 本质差异](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [七、BSP 实战](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [7.1 设备树四件套配置](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [7.2 I2C 驱动 probe 用四件套](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [7.3 PMIC regulator(I2C 扩展)](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [7.4 调试套路(外设不工作五步)](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [八、调试与排查](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [8.1 GPIO 调试](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [8.2 pinctrl 调试](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [8.3 clk 调试](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [8.4 regulator 调试](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [8.5 常见问题](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [九、小结速查](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [9.1 四件套 API 速查](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [9.2 设备树属性速查](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [9.3 调试节点速查](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [9.4 外设不工作五步排查](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [9.5 probe 顺序速查](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
- [十、相关笔记](#目录 @TOC 一、GPIO 子系统 1.1 GPIO 抽象演进:从 gpio_number 到 gpiod 1.2 设备树里的 GPIO 1.3 gpiod API(消费者侧) 1.4 GPIO 控制器驱动(gpio_chip,提供者侧) 1.5 GPIO 做中断 二、pinctrl 子系统 2.1 pinctrl 是什么 2.2 设备树里的 pinctrl 2.3 pinctrl 多 state(省电) 2.4 pinctrl 框架内部 三、Common Clock Framework 3.1 CCF 是什么 3.2 时钟类型(基本 clock) 3.3 设备树里的时钟 3.4 CCF 消费者 API 3.5 CCF 提供者驱动(clk_provider) 3.6 时钟精度:clk_set_rate 与 rate 范围 四、regulator 框架 4.1 regulator 是什么 4.2 设备树里的 regulator 4.3 regulator 消费者 API 4.4 regulator 提供者驱动 4.5 regulator 与 power domain 五、四件套协同:外设上电时序 5.1 一个外设工作的完整条件 5.2 probe 里的标准时序 5.3 时序要求(上电 sequencing) 5.4 逆时序(下电/PM suspend) 六、对照 FreeRTOS / RISC-V 6.1 硬件操作对照 6.2 RISC-V SoC 上的四件套 6.3 本质差异 七、BSP 实战 7.1 设备树四件套配置 7.2 I2C 驱动 probe 用四件套 7.3 PMIC regulator(I2C 扩展) 7.4 调试套路(外设不工作五步) 八、调试与排查 8.1 GPIO 调试 8.2 pinctrl 调试 8.3 clk 调试 8.4 regulator 调试 8.5 常见问题 九、小结速查 9.1 四件套 API 速查 9.2 设备树属性速查 9.3 调试节点速查 9.4 外设不工作五步排查 9.5 probe 顺序速查 十、相关笔记)
一、GPIO 子系统
1.1 GPIO 抽象演进:从 gpio_number 到 gpiod
老接口(基于编号,已弃用):
c
int gpio = 32; // 全局 GPIO 编号(板子定)
gpio_request(gpio, "my-led");
gpio_direction_output(gpio, 1);
gpio_set_value(gpio, 1);
gpio_free(gpio);
问题:① 全局编号,多 SoC 冲突;② 不和设备树绑定;③ 没方向/默认值/名字语义。
新接口(gpiod,基于描述符,推荐):
c
struct gpio_desc *led; // 描述符,不暴露编号
led = devm_gpiod_get(dev, "led", GPIOD_OUT_HIGH); // 从设备树 "led-gpios" 读
gpiod_set_value(led, 1);
// devm_ 自动 free
优势:① 从设备树按名字取(xxx-gpios 属性);② 方向/默认值一次设;③ devm_ 自动回收;④ 支持硬件 GPIO 控制器抽象(gpio_chip)。
1.2 设备树里的 GPIO
dts
&gpio0 {
#gpio-cells = <2>; // 引用时带 2 arg:pin + flags
gpio-controller; // 声明这是 GPIO 控制器
};
led-driver {
compatible = "aegix,led";
led-gpios = <&gpio0 5 GPIO_ACTIVE_HIGH>; // gpio0 的 5 号脚,高有效
reset-gpios = <&gpio0 10 GPIO_ACTIVE_LOW>; // 10 号脚,低有效
};
#gpio-cells = <2>:GPIO 控制器声明引用带 2 个参数(pin + flags);xxx-gpios:消费者命名(<功能>-gpios),驱动devm_gpiod_get(dev, "xxx", ...);GPIO_ACTIVE_LOW:逻辑反转------gpiod_set_value(1)物理输出 0(驱动不用关心);- 逻辑值 vs 物理值:gpiod API 用逻辑值(1=点亮/激活),框架按 ACTIVE_LOW 自动转物理。
1.3 gpiod API(消费者侧)
c
#include <linux/gpio/consumer.h>
// 获取(从设备树 xxx-gpios)
struct gpio_desc *g = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
// 参数 3:GPIOD_IN / GPIOD_OUT_HIGH / GPIOD_OUT_LOW / GPIOD_ASIS
// 多个同名(led-gpios 带多个)
struct gpio_desc *g[2];
devm_gpiod_get_array(dev, "led", GPIOD_OUT_HIGH, g); // 数组
// 设方向
gpiod_direction_input(g);
gpiod_direction_output(g, 1);
// 读写(逻辑值)
gpiod_set_value(g, 1); // 输出
int v = gpiod_get_value(g); // 读输入
// 非阻塞(原子上下文用)
gpiod_set_value_cansleep(g, 1); // 提示可能睡(I2C 扩展 GPIO)
// 转中断号(GPIO 做中断源)
int irq = gpiod_to_irq(g);
request_irq(irq, handler, IRQF_TRIGGER_FALLING, "my", ctx);
// 释放(devm_ 自动)
gpiod_set_value vs _cansleep
GPIO 控制器可能在 SoC 内部(寄存器,瞬时)也可能在外部(I2C/SPI 扩展,可能睡)。
gpiod_set_value用于瞬时 控制器(原子上下文可用);gpiod_set_value_cansleep用于可能睡 的(I2C 扩展,不能在中断顶半部用)。框架自动选------你只要在可能睡的上下文用_cansleep版本。中断顶半部里绝不用 I2C 扩展 GPIO(会睡,对接 05)。
1.4 GPIO 控制器驱动(gpio_chip,提供者侧)
SoC 厂商写,消费者只调 gpiod API。核心结构:
c
struct gpio_chip {
const char *label;
struct gpio_device *gpiodev;
int (*request)(struct gpio_chip *, unsigned offset);
int (*direction_input)(struct gpio_chip *, unsigned offset);
int (*direction_output)(struct gpio_chip *, unsigned offset, int value);
int (*get)(struct gpio_chip *, unsigned offset);
void (*set)(struct gpio_chip *, unsigned offset, int value);
int base; // 基号(或 -1 动态)
unsigned int ngpio; // 引脚数
...
};
// 注册
int gpiochip_add_data(struct gpio_chip *gc, void *data);
// 现代用 gpiochip + gpio_irq_chip(中断) + pin controller 联动
- SoC GPIO 控制器驱动实现
direction_input/output/get/set(写硬件寄存器); - 注册成
gpio_chip,框架给消费者提供 gpiod; - 现代 SoC 的 GPIO 控制器通常同时是 pinctrl(引脚复用+GPIO),两个子系统联动。
1.5 GPIO 做中断
dts
button {
compatible = "aegix,btn";
btn-gpios = <&gpio0 3 GPIO_ACTIVE_LOW>;
interrupt-parent = <&gpio0>;
interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
};
c
struct gpio_desc *btn = devm_gpiod_get(dev, "btn", GPIOD_IN);
int irq = gpiod_to_irq(btn); // GPIO 转 irq 号
devm_request_threaded_irq(dev, irq, NULL, btn_thread,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
"btn", ctx);
// 顶半 NULL,直接线程化(threaded irq,对接 05)
- GPIO 控制器实现
gpiochip_irqchip_add(把 GPIO 引脚当中断源); - 经 irq_domain(对接 05)映射成 virq;
gpiod_to_irq给消费者拿 irq 号;- 现代:用 threaded irq,按键去抖在线程里。
二、pinctrl 子系统
2.1 pinctrl 是什么
pinctrl(Pin Controller) = 引脚复用(mux)与配置(config)框架。SoC 的一个物理引脚可作 GPIO/UART_TX/I2C_SDA/SPI_CLK 等,由寄存器选;还能配上拉/下拉/驱动强度/施密特触发。pinctrl 子系统统一管理这些。
| 概念 | 说明 |
|---|---|
| pin | 物理引脚(SoC 编号) |
| function | 引脚功能(UART/I2C/GPIO...) |
| group | 一组引脚(一个 function 占用的多个 pin) |
| pinmux | 引脚复用选 function |
| pinconf | 引脚配置(上拉/下拉/驱动强度) |
| state | 一组配置的集合(default/sleep/...) |
2.2 设备树里的 pinctrl
dts
&iomuxc { // 引脚控制器节点
pinctrl_uart0: uart0grp { // 一个 pinctrl 组
fsl,pins = <
MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA 0x1b0b1
MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA 0x1b0b1
>;
};
pinctrl_i2c0: i2c0grp {
fsl,pins = <...>;
};
};
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart0>; // 用上面定义的组
status = "okay";
};
- pinctrl 控制器节点(
iomuxc/pinctrl/pinmux)定义"引脚功能+配置"的组(label); - 消费者(外设)用
pinctrl-0 = <&label>引用; pinctrl-names:state 名字(default/sleep),"default" 是默认 state;- 不同 SoC 的 pinctrl binding 格式不同(NXP 用
fsl,pins,其他厂商各异),但框架统一。
2.3 pinctrl 多 state(省电)
dts
&uart0 {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&pinctrl_uart0>; // 正常
pinctrl-1 = <&pinctrl_uart0_sleep>; // 睡眠(引脚降功耗)
};
c
// 驱动 PM 回调里切 state(对接 15 电源)
pinctrl_pm_select_sleep_state(dev); // 进睡眠
pinctrl_pm_select_default_state(dev); // 唤醒
- 睡眠时引脚切到低功耗态(输入/下拉/关驱动),省电;
- AEGIX 低功耗场景用。
2.4 pinctrl 框架内部
c
struct pinctrl_dev; // pin controller 设备
struct pinctrl_desc {
const struct pinctrl_ops *pctlops; // pin/group 枚举
const struct pinmux_ops *pmxops; // function 选
const struct pinconf_ops *confops; // 配置
...
};
// 消费者侧
struct pinctrl; // 一个消费者的完整 pinctrl(state 集合)
struct pinctrl_state; // 一个 state(default/sleep)
- pinctrl 控制器驱动(SoC 厂商)实现 pctlops/pmxops/confops;
- 框架在消费者 probe 时自动 apply
pinctrl-0(default state); pinctrl_pm_select_*切 state。
pinctrl 是"外设能工作"的前提
外设不工作,第一步查 pinctrl------引脚没配成对应功能(UART_TX 还是 GPIO?),信号根本没连到外设。MCU 裸机你在启动代码里配引脚,Linux 在设备树 pinctrl 节点配,框架 probe 时 apply。没 apply = 引脚是默认态(可能 GPIO),外设信号出不去。
三、Common Clock Framework
3.1 CCF 是什么
Common Clock Framework(CCF) = Linux 统一时钟框架。SoC 有复杂时钟树(PLL→分频器→多路选择→门控),CCF 把每种时钟抽象成 struct clk,统一 API(clk_prepare_enable/clk_set_rate),并经设备树 clocks 属性关联外设。
时钟树示例:
XTAL(24M) → PLL(1200M) → 分频(/5 = 240M) → 多路选择 → 门控 → UART0
→ 门控 → I2C0
3.2 时钟类型(基本 clock)
| 类型 | 结构 | 作用 |
|---|---|---|
| 固定时钟 | clk_fixed_rate |
晶振(XTAL 24M) |
| PLL | clk_pll |
倍频(1200M) |
| 分频器 | clk_divider |
分频(/N) |
| 多路选择 | clk_mux |
选源 |
| 门控 | clk_gate |
开关(使能) |
| 复合 | clk_composite |
mux+div+gate 合一 |
| 固定因子 | clk_fixed_factor |
固定 /N×M |
3.3 设备树里的时钟
dts
clk: clock-controller@1000 {
compatible = "aegix,n300-clk";
reg = <0x1000 0x100>;
#clock-cells = <1>; // 引用带 1 arg(clock id)
clocks = <&xtal>; // 父时钟
clock-names = "xtal";
};
&uart0 {
clocks = <&clk 5>, <&clk 6>; // 5=periph, 6=baud
clock-names = "periph", "baud";
};
- 时钟控制器节点声明
#clock-cells(引用 arg 数); - 消费者用
clocks = <&clk id>+clock-names命名; - 一个外设可多个时钟(如 UART 有 periph 和 baud 两路)。
3.4 CCF 消费者 API
c
#include <linux/clk.h>
// 获取(从设备树 clocks + clock-names)
struct clk *clk = devm_clk_get(dev, "periph");
// 多个按名字取:devm_clk_get(dev, "baud")
// 启用(prepare 可能睡,enable 瞬时)
clk_prepare_enable(clk); // = clk_prepare + clk_enable
// 停用
clk_disable_unprepare(clk);
// 频率
unsigned long rate = clk_get_rate(clk);
clk_set_rate(clk, 50000000); // 设频率(可能影响父)
// 父时钟
struct clk *parent = clk_get_parent(clk);
clk_set_parent(clk, parent2); // 切源
// bulk(一次管多个)
struct clk_bulk_data clks[] = { {.id="periph"}, {.id="baud"} };
devm_clk_bulk_get(dev, 2, clks);
clk_bulk_prepare_enable(2, clks);
clk_prepare/clk_unprepare:可能睡(写 PLL 寄存器需慢速),进程上下文;clk_enable/clk_disable:瞬时(只门控),原子上下文可用;- 配对:prepare/enable 成对,先 prepare 后 enable,先 disable 后 unprepare;
devm_clk_get自动 put,devm_clk_bulk_get批量;- 频率设置会传播:改分频影响下游,CCF 自动重算。
3.5 CCF 提供者驱动(clk_provider)
SoC 厂商写,注册各种 clk_hw:
c
// 固定时钟(晶振)
struct clk_hw *xtal = clk_hw_register_fixed_rate(NULL, "xtal", NULL, 0, 24000000);
// PLL/分频/门控(用硬件描述)
struct clk_hw *pll = clk_hw_register_pll(...);
struct clk_hw *div = clk_hw_register_divider(NULL, "uart_div", "pll", 0,
base + 0x10, 0, 8, CLK_DIVIDER_ONE_BASED, &lock);
struct clk_hw *gate = clk_hw_register_gate(NULL, "uart0_clk", "uart_div", 0,
base + 0x20, 5, 0, &lock);
// of provider(让设备树 <&clk 5> 能找到)
struct clk_hw_onecell_data *data;
data->hws[5] = gate;
of_clk_add_hw_provider(np, of_clk_hw_onecell_get, data);
- 每个
clk_hw是时钟树一个节点; of_clk_add_hw_provider注册提供者,设备树引用经此查;- 现代 SoC 用
clk_hwAPI(不是老clk_register),更类型安全。
3.6 时钟精度:clk_set_rate 与 rate 范围
c
// 设定最小/最大范围(防设飞)
clk_set_rate_range(clk, 1000000, 100000000);
//clk_set_min_rate / clk_set_max_rate
// rate 可能不精确(分频器离散)
unsigned long got = clk_round_rate(clk, 33333333); // 实际能给的(如 33333333 或 33333000)
clk_set_rate(clk, got);
外设不工作第二步查时钟
pinctrl 配好了,外设还不工作------查时钟:
clk_prepare_enable调了?频率对?clk_get_rate验证。没开时钟 = 外设寄存器读全 0/总线错 。AEGIX N300 八总线外设每个都要开对应时钟,设备树clocks漏一个就死。这是 BSP 调试高频问题。
四、regulator 框架
4.1 regulator 是什么
regulator(稳压器) = 电源管理框架。SoC 外设供电可能是:① SoC 直接 3.3V;② 外部 PMIC(电源管理 IC,经 I2C 配)输出可调电压;③ LDO/DCDC。regulator 框架统一抽象,支持使能/设电压/限流,并经设备树关联。
| 概念 | 说明 |
|---|---|
| regulator | 一个电压输出(如 PMIC 的 LDO1) |
| supply | 上游电源(regulator 链) |
| consumer | 消费者(外设) |
| enable | 使能输出 |
| voltage | 输出电压(可调) |
| mode | 工作模式(自动/强制 PWM/强制 PFM) |
4.2 设备树里的 regulator
dts
// PMIC(I2C 设备,提供多个 regulator)
pmic@58 {
compatible = "aegix,pmic";
reg = <0x58>;
regulators {
ldo1: ldo1 { regulator-name = "vdd-uart"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; };
ldo2: ldo2 { regulator-name = "vdd-sd"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; };
};
};
// 消费者
&uart0 {
vdd-supply = <&ldo1>; // UART 供电来自 ldo1
};
- PMIC 节点下
regulators子节点,每个一个输出; - 消费者用
<功能>-supply = <®ulator>引用(vdd-supply/vccio-supply/...); regulator-name用户态可见(/sys/class/regulator/.../name)。
4.3 regulator 消费者 API
c
#include <linux/regulator/consumer.h>
// 获取(从设备树 xxx-supply)
struct regulator *reg = devm_regulator_get(dev, "vdd");
// 按需 get + enable
struct regulator *reg = devm_regulator_get_enable(dev, "vdd"); // 一步(5.10+)
// 使能(可能睡,经 I2C)
int ret = regulator_enable(reg); // 开电源
regulator_disable(reg); // 关
// 电压
regulator_set_voltage(reg, 3300000, 3300000); // 设 3.3V(范围)
int v = regulator_get_voltage(reg);
// 状态
int en = regulator_is_enabled(reg);
regulator_enable/disable可能睡(I2C 配 PMIC),只能进程上下文;devm_regulator_get_enable:一步 get + enable(新 API,省代码);- 电压设范围:框架在 min/max 内选(可能受硬件离散值限制)。
4.4 regulator 提供者驱动
PMIC 厂商写,注册 struct regulator_desc + regulator_config:
c
static const struct regulator_ops aegix_ldo_ops = {
.enable = aegix_ldo_enable,
.disable = aegix_ldo_disable,
.is_enabled = aegix_ldo_is_enabled,
.set_voltage = aegix_ldo_set_voltage,
.get_voltage = aegix_ldo_get_voltage,
.list_voltage = regulator_list_voltage_linear,
};
static const struct regulator_desc aegix_ldo1_desc = {
.name = "ldo1", .ops = &aegix_ldo_ops,
.min_uV = 1800000, .uV_step = 100000, .n_voltages = 16,
.vsel_reg = 0x10, .vsel_mask = 0x0f,
.enable_reg = 0x10, .enable_mask = 0x80,
.type = REGULATOR_VOLTAGE, .owner = THIS_MODULE,
};
// 注册(I2C driver probe 里)
struct regulator_config cfg = { .dev = &i2c->dev, .regmap = pmic->regmap, };
struct regulator_dev *rdev = devm_regulator_register(&i2c->dev, &aegix_ldo1_desc, &cfg);
regulator_desc:静态描述(ops/电压表/寄存器);regulator_config:运行时(dev/regmap/init_data);devm_regulator_register注册,框架给消费者;- 现代 PMIC 用 regmap(对接 21)批量配寄存器。
4.5 regulator 与 power domain
复杂 SoC 还有 power domain (电源域):SoC 一块区域的电源开关。regulator 管"电压",power domain 管"区域开关",两者协同(对接 15 电源管理)。消费者用 genpd API(pm_genpd_add_device/runtime PM 联动)。
!important 外设不工作第三步查电源
pinctrl + 时钟都对了,外设还不工作------查电源:
vdd-supply配了?regulator_enable调了?电压对?功能安全芯片可能多路电源(CPU core/IO/PLL),漏一路部分功能死。AEGIX 上电时序(下节)是 BSP 启动调试核心。
五、四件套协同:外设上电时序
5.1 一个外设工作的完整条件
一个外设(如 UART)正常工作需要:
- 引脚配好(pinctrl:TX/RX 引脚选 UART 功能);
- 时钟打开(clk:periph + baud);
- 电源打开(regulator:vdd);
- 复位释放(reset:reset_control);
- 寄存器配好(驱动 probe 里 ioremap + 写寄存器)。
任一缺失 = 外设不工作。
5.2 probe 里的标准时序
c
static int aegix_uart_probe(struct platform_device *pdev) {
struct aegix_uart *u;
u = devm_kzalloc(&pdev->dev, sizeof(*u), GFP_KERNEL);
// 1. pinctrl(框架自动 apply default state,无需手动)
// 2. 时钟(先 get,后 enable)
u->clk = devm_clk_get(&pdev->dev, "periph");
clk_prepare_enable(u->clk);
// 3. 电源(先 get,后 enable)
u->vdd = devm_regulator_get(&pdev->dev, "vdd");
regulator_enable(u->vdd);
// 4. 复位(先 assert,等,再 deassert)
u->rst = devm_reset_control_get(&pdev->dev, NULL);
reset_control_assert(u->rst);
udelay(10);
reset_control_deassert(u->rst);
// 5. 寄存器映射 + 配
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
u->base = devm_ioremap_resource(&pdev->dev, res);
writel(0, u->base + UART_CR); // 禁用,准备配
aegix_uart_config(u, 115200);
// 6. 中断
u->irq = platform_get_irq(pdev, 0);
devm_request_irq(&pdev->dev, u->irq, aegix_uart_irq, 0, "aegix-uart", u);
return 0;
}
5.3 时序要求(上电 sequencing)
某些外设要求严格上电时序(如先开 core 电再开 IO 电,或先复位再开时钟):
c
// 严格时序:先 IO 电 → 等 → 复位释放 → 时钟 → 配
regulator_enable(u->vdd_io);
usleep_range(1000, 2000); // 等 IO 电稳定
reset_control_deassert(u->rst);
clk_prepare_enable(u->clk);
regulator_enable(u->vdd_core);
// 配寄存器
- 厂家 datasheet 规定时序,驱动严格遵守;
- 错时序可能:① 外设不识别;② 寄存器写不进;③ 偶发故障(功能安全大忌);
- 功能安全芯片外设上电时序要对照 datasheet 严格验证。
5.4 逆时序(下电/PM suspend)
c
// remove / suspend 逆序
writel(0, u->base + UART_CR); // 停外设
disable_irq(u->irq);
clk_disable_unprepare(u->clk); // 关时钟
reset_control_assert(u->rst); // 进复位
regulator_disable(u->vdd); // 关电
// pinctrl 切 sleep state(框架 PM 回调)
- 下电逆序:先停外设 → 关时钟 → 复位 → 关电 → 引脚降功耗;
- 对接 15 电源管理 PM 回调;
- 漏逆序 = 下次上电外设异常(状态残留)。
六、对照 FreeRTOS / RISC-V
6.1 硬件操作对照
| 操作 | MCU 裸机 | Linux 框架 |
|---|---|---|
| 配引脚功能 | 写 IOMUX 寄存器 | pinctrl 子系统(设备树) |
| 配引脚电平 | 写 GPIO 寄存器 | gpiod 子系统 |
| 开时钟 | 写 CLK 寄存器 | CCF clk 子系统 |
| 开电源 | 写 PMIC(I2C) | regulator 子系统 |
| 复位 | 写复位寄存器 | reset_control |
| 配外设寄存器 | 直接写 | ioremap + writel |
6.2 RISC-V SoC 上的四件套
- RISC-V SoC:pinctrl/clk/regulator 控制器都是 SoC 内部 IP,设备树描述,驱动注册框架;
- 时钟:可能经 PLIC 旁的 CLINT(对接 05)关联,但 CCF 独立管外设时钟;
- 电源:若无外部 PMIC,部分 regulator 固定(always-on),框架仍能描述(
regulator-fixed); - reset:RISC-V SoC 复位控制器设备树节点(
reset-controller);
6.3 本质差异
| MCU 裸机 | Linux | |
|---|---|---|
| 谁配 | 启动代码一次性 | 框架按需(设备树驱动) |
| 何时配 | 上电就绪 | probe 时 |
| 误配排查 | 肉眼/JTAG | 框架调试接口(sysfs/debugfs) |
| 多板子 | 每板改代码 | 每板改设备树 |
四件套是你从 MCU 转 Linux 的"四道关"
MCU 点灯一行寄存器,Linux 要过四关:pinctrl(引脚功能)→ clk(时钟)→ regulator(电源)→ 寄存器(驱动)。漏任一关,外设死,且现象一样(不工作) ,新手难定位。调试套路:①
/sys/kernel/debug/pinctrl看引脚;②/sys/kernel/debug/clk/clk_summary看时钟;③/sys/class/regulator看电源;④ 寄存器用 devmem 或 debugfs。逐关验证。
七、BSP 实战
7.1 设备树四件套配置
dts
// aegix-n300.dtsi
/ {
xtal: xtal { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <24000000>; };
soc {
clk: clock-controller@1000 {
compatible = "x,x300-clk";
reg = <0x1000 0x200>;
#clock-cells = <1>;
clocks = <&xtal>;
clock-names = "xtal";
};
pinctrl: pinctrl@2000 {
compatible = "x,x300-pinctrl";
reg = <0x2000 0x400>;
#pinctrl-cells = <1>;
x,pins = <...>;
};
gpio0: gpio@3000 {
compatible = "x,x300-gpio";
reg = <0x3000 0x100>;
interrupts = <32>;
#gpio-cells = <2>;
gpio-controller;
#interrupt-cells = <2>;
interrupt-controller;
ngpios = <32>;
};
reset: reset-controller@4000 {
compatible = "x,x300-reset";
reg = <0x4000 0x10>;
#reset-cells = <1>;
};
i2c0: i2c@10001000 {
compatible = "x,x300-i2c";
reg = <0x10001000 0x100>;
interrupts = <11>;
clocks = <&clk 6>;
resets = <&reset 2>;
pinctrl-names = "default";
pinctrl-0 = <&i2c0_pins>;
status = "disabled";
};
};
pinctrl { // 板级引脚组
i2c0_pins: i2c0grp {
aegix,pins = <5 6 2>; // pin5/6, function 2(I2C0)
aegix,pinconf = <0x1b0b1>; // 上拉/驱动强度
};
};
};
7.2 I2C 驱动 probe 用四件套
c
static int aegix_i2c_probe(struct platform_device *pdev) {
struct aegix_i2c *i;
i = devm_kzalloc(&pdev->dev, sizeof(*i), GFP_KERNEL);
// 寄存器
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
i->base = devm_ioremap_resource(&pdev->dev, res);
// 时钟(设备树 clocks = <&clk 6>)
i->clk = devm_clk_get(&pdev->dev, NULL);
clk_prepare_enable(i->clk);
i->clk_rate = clk_get_rate(i->clk);
// 复位(设备树 resets = <&reset 2>)
i->rst = devm_reset_control_get_exclusive(&pdev->dev, NULL);
reset_control_deassert(i->rst);
// 中断
i->irq = platform_get_irq(pdev, 0);
devm_request_irq(&pdev->dev, i->irq, x_i2c_irq, 0, "x-i2c", i);
// pinctrl 框架自动 apply default
// 配寄存器(用时钟频率算分频)
writel(aegix_i2c_calc_div(i->clk_rate, 400000), i->base + I2C_DIV);
// 注册 adapter(对接 I2C 子系统)
i->adapter.algo = &x_i2c_algo;
return i2c_add_adapter(&i->adapter);
}
7.3 PMIC regulator(I2C 扩展)
dts
&i2c0 {
status = "okay";
pmic@58 {
compatible = "x,pmic-a1";
reg = <0x58>;
regulators {
vdd_core: ldo1 { regulator-name="vdd-core"; regulator-min-microvolt=<700000>; regulator-max-microvolt=<1100000>; };
vdd_io: ldo2 { regulator-name="vdd-io"; regulator-min-microvolt=<1800000>; regulator-max-microvolt=<3300000>; };
};
};
};
7.4 调试套路(外设不工作五步)
外设不工作五步排查:
① pinctrl:引脚功能对?
cat /sys/kernel/debug/pinctrl/pinctrl-handles (或 pinctrl-pins)
② clk:时钟开了?频率对?
cat /sys/kernel/debug/clk/clk_summary | grep uart
③ regulator:电源开了?电压对?
cat /sys/class/regulator/regulator.*/state
cat /sys/class/regulator/regulator.*/microvolts
④ reset:复位释放了?
(reset_control 调试,debugfs)
⑤ 寄存器:能读写?值对?
devmem 0x10001000 (或驱动 debugfs)
八、调试与排查
8.1 GPIO 调试
bash
# 已注册 GPIO 控制器
ls /sys/bus/gpio/devices/
# 已申请的 GPIO(消费者)
cat /sys/kernel/debug/gpio
# gpio0 详情
ls /sys/class/gpio/ # 老 sysfs(导出用)
echo 5 > /sys/class/gpio/export
cat /sys/class/gpio/gpio5/direction
cat /sys/class/gpio/gpio5/value
# 新:libgpiod 工具
gpioinfo gpiochip0
gpioset gpiochip0 5=1
gpioget gpiochip0 5
8.2 pinctrl 调试
bash
# 已注册 pinctrl
ls /sys/kernel/debug/pinctrl/
# 引脚状态
cat /sys/kernel/debug/pinctrl/pinctrl-pins
cat /sys/kernel/debug/pinctrl/pinctrl-maps # 哪个外设用了哪个组
# state 切换
ls /sys/bus/platform/devices/.../pinctrl/ # 消费者的 state
8.3 clk 调试
bash
# 时钟树总览(必备神器)
cat /sys/kernel/debug/clk/clk_summary
# clk_summary 输出:
# enable prepare rate accuracy phase
# xtal 1 1 24000000 0 0
# pll 1 1 1200000000 0 0
# uart_div 1 1 50000000 0 0
# uart0_clk 1 1 50000000 0 0
# 每个时钟的详细信息
cat /sys/kernel/debug/clk/uart0_clk/clk_rate
# 设频率(调试)
echo 100000000 > /sys/kernel/debug/clk/uart0_clk/clk_set_rate
8.4 regulator 调试
bash
# 已注册 regulator
ls /sys/class/regulator/
# 详情
cat /sys/class/regulator/regulator.0/name # 名字
cat /sys/class/regulator/regulator.0/state # enabled/disabled
cat /sys/class/regulator/regulator.0/microvolts # 当前电压
cat /sys/class/regulator/regulator.0/min_microvolts
# 控制(测试)
echo 1 > /sys/class/regulator/regulator.0/state # 开(谨慎!)
echo 3300000 > /sys/class/regulator/regulator.0/microvolts
8.5 常见问题
| 现象 | 排查 |
|---|---|
| 外设读全 0 | clk 没开 / regulator 没开 / reset 没 deassert |
| 中断不来 | pinctrl 没配中断引脚 / gpio 中断没注册 |
| 引脚电平不对 | ACTIVE_LOW 逻辑错 / pinctrl 功能选错 |
| 频率不对 | clk_set_rate 没调 / 父时钟错 / 分频器离散 |
| 电压不稳 | regulator 范围错 / 负载超 PMIC 能力 |
| probe -EPROBE_DEFER | clk/regulator 提供者还没 ready |
九、小结速查
9.1 四件套 API 速查
| 子系统 | get | enable | set | 释放 |
|---|---|---|---|---|
| GPIO | devm_gpiod_get | (get 时设方向) | gpiod_set_value | devm 自动 |
| pinctrl | (框架自动) | (probe 自动 apply) | pinctrl_pm_select_* | 自动 |
| clk | devm_clk_get | clk_prepare_enable | clk_set_rate | devm 自动 |
| regulator | devm_regulator_get | regulator_enable | regulator_set_voltage | devm 自动 |
| reset | devm_reset_control_get | reset_control_deassert | reset_control_assert | devm 自动 |
9.2 设备树属性速查
| 子系统 | 控制器属性 | 消费者属性 |
|---|---|---|
| GPIO | gpio-controller, #gpio-cells | xxx-gpios |
| pinctrl | (厂商定义 pins) | pinctrl-0, pinctrl-names |
| clk | #clock-cells | clocks, clock-names |
| regulator | regulator-name/min/max-microvolt | xxx-supply |
| reset | #reset-cells | resets, reset-names |
9.3 调试节点速查
| 子系统 | debugfs/sysfs |
|---|---|
| GPIO | /sys/kernel/debug/gpio, /sys/class/gpio |
| pinctrl | /sys/kernel/debug/pinctrl/ |
| clk | /sys/kernel/debug/clk/clk_summary |
| regulator | /sys/class/regulator/ |
| reset | /sys/kernel/debug/reset/ |
9.4 外设不工作五步排查
- pinctrl:引脚功能对?
- clk:开了?频率对?
- regulator:开了?电压对?
- reset:释放了?
- 寄存器:能读写?
9.5 probe 顺序速查
1. ioremap 寄存器
2. clk_get + prepare_enable
3. regulator_get + enable
4. reset_control deassert
5. pinctrl(框架自动)
6. 配寄存器
7. request_irq
8. 注册子系统(adapter/cdev...)
十、相关笔记
- \[00-Linux内核专题总目录] ------ 专题入口
- \[19-设备树深入-DTS语法-编译-Overlay-Binding-ofAPI] ------ 设备树(本篇前置)
- \[10-设备模型] ------ platform_device/subsys
- \[11-驱动框架 platform-char-misc-设备树] ------ platform 驱动 + devm_
- \[15-电源管理] ------ PM 回调/regulator runtime PM
- \[05-中断与下半部] ------ GPIO 中断/threaded irq
- \[21-DMA框架与regmap] ------ 下篇(regmap 配 PMIC/SoC 寄存器)
- \[00-RISC-V架构专题总目录] ------ N300 SoC/IP 对照
\[00-Linux内核专题总目录] · 上一篇:\[19-设备树深入-DTS语法-编译-Overlay-Binding-ofAPI] · 下一篇:\[21-DMA框架与regmap] · L3 补充篇(子系统四件套)
✨ 感谢你的阅读 ✨
技术之路漫漫,分享是为了更好地交流。
如果本文的内容对你有启发,希望能得到你的支持:
👍 点赞 | ⭐ 收藏 | 👀 关注
如果你在调试过程中遇到了其他问题,
欢迎在 评论区 💬 留言,我们一起探讨。
关注我,一起交流底层开发的那些事儿!🚀