选择主题
☀️ 浅色
🌙 深色
🌿 护眼
Ctrl+K

Level 8:App 点一下控制板子上的 LED

Level 8:App 点一下控制板子上的 LED 我想做 在手机上装一个自己写的 App,点一下按钮,板子上的物理 LED 亮或灭。打通从 App 到 GPIO 寄存器的完整链路。 先回答三个问题 App 是怎么跟硬件通信的? App (Java) ↓ Binder IPC Native Service (C++) ↓ hw_get_module() HAL (xxx_module_t) ↓ open("/dev/xxx") Kernel Driver ↓ writel() GPIO 寄存器 每一层都是独立的模块,层与层之间有标准接口。替换其中任何一层不影响其他层。 HAL 解决了什么问题? 没有 HAL 之前:App 直接 open/ioctl 设备节点 问题:驱动接口变了,所有 App 都得改 HAL 的解决:给上层提供稳定的抽象接口,驱动变化只改 HAL 实现,不涉及 Framework 和 App 在 Treble 架构中,HAL 更是 vendor 和 system 的契约边界 Binder 是什么? Android 特有的 IPC(进程间通信)机制 App 和 Native Service 是不同进程,不能直接函数调用 Binder 让它们像调用本地函数一样跨进程通信 Binder 还负责权限校验——ServiceManager 检查调用方有没有权限访问某个服务 需要懂的知识 ioctl 驱动的写法(在 Level 4 驱动基础上扩展) ...

June 9, 2026

Level 7:追踪完整启动流程

Level 7:追踪完整启动流程 我想做 从上电到 Launcher,完整追踪一次 S905X5M 的启动过程,每个阶段都能在代码中找到对应位置。 先回答三个问题 Amlogic 的启动链和通用 Linux 有什么不同? 通用嵌入式:ROM Code → Bootloader → Kernel → init Amlogic:ROM Code → BL2(DDR 初始化) → BL30/SPL → U-Boot → Kernel → init 多出来的 BL2 和 BL30 是 Amlogic 私有的二进制固件 ROM Code 怎么找到下一阶段的代码? 芯片上电后,内部 ROM 中的固化代码执行 根据 boot mode 引脚的电平(eMMC/SD 卡/USB burning),去对应介质读取 bootloader 这是芯片设计时固定的,不能修改 内核解压后,第一个用户态进程是什么? PID 1 → init 进程 init 解析 init.rc → 启动核心服务(servicemanager、surfaceflinger 等) zygote(Android Java 虚拟机) → 启动 system_server → 启动 Launcher 需要懂的知识 启动级联图 ...

June 9, 2026

Level 6:GPIO 按键 — 从设备树到 input 子系统

Level 6:GPIO 按键 — 从设备树到 input 子系统 我想做 板子上有一个丝印 USER_KEY 的物理按键(接在 GPIOD_2),按下它能被 Linux input 子系统识别到事件,并理解从 DTS → 驱动 → sysfs → /dev/input/eventX 的完整链路。 先回答三个问题 Linux 怎么知道一个 GPIO 是按键而不是 LED? DTS 中的 compatible 决定匹配哪个驱动。LED 用 "gpio-leds",按键用 "amlogic, gpio_keypad"(或主线 "gpio-keys") 驱动根据 compatible 字符串被内核匹配并 probe,在 probe 中注册 input 设备 按键事件是怎么从硬件传到 App 的? 手指按下 → GPIO 电平变化 → 驱动检测(polling/irq) → input_report_key() → input_sync() → /dev/input/eventX → App 通过 getevent / InputReader 读取 每一层都是标准接口,App 不关心 GPIO 编号,只读 keycode。 ...

June 9, 2026