硬件控制模块是连接上层应用逻辑与底层物理设备的桥梁,其代码位于 obj/hardware/hardware.c
。它遵循了典型的硬件抽象层(HAL)设计思想。
1. 硬件抽象
- 该模块将底层的硬件设备(如开发板上的LED和蜂鸣器)抽象为标准的Linux字符设备文件。
- LED设备对应
/dev/Led
。 - 蜂鸣器设备对应
/dev/beep
。
- LED设备对应
- 这种设计使得上层代码无需关心硬件驱动的具体实现,只需像操作普通文件一样来操作硬件。
2. 控制接口
ioctl
系统调用: 与硬件驱动的通信完全通过标准的ioctl
(Input/Output Control) 系统调用来完成。- 自定义命令: 针对不同的操作,代码中定义了一系列
ioctl
命令码,例如LED1_IOCTL
就是控制第一个LED的特定命令。开启或关闭则作为参数传递。 - 文件描述符管理:
hardware_init()
函数负责打开设备文件并获取文件描述符(g_led_fd
,g_buzzer_fd
),这些描述符在后续的ioctl
调用中使用。hardware_deinit()
则负责安全地关闭它们。
3. 统一API
- 模块向上层提供了非常简洁和统一的API:
hardware_init()
: 初始化所有硬件。hardware_deinit()
: 释放所有硬件资源。control_led(int led_num, int on)
: 控制指定编号的LED亮或灭。control_buzzer(int on)
: 控制蜂鸣器响或停。
- 通过这层封装,项目的其他部分(如MQTT模块或UI模块)可以简单地通过调用这些函数来控制物理设备,而无需了解
ioctl
的复杂细节。