硬件控制模块是连接上层应用逻辑与底层物理设备的桥梁,其代码位于 obj/hardware/hardware.c。它遵循了典型的硬件抽象层(HAL)设计思想。

1. 硬件抽象

  • 该模块将底层的硬件设备(如开发板上的LED和蜂鸣器)抽象为标准的Linux字符设备文件
    • LED设备对应 /dev/Led
    • 蜂鸣器设备对应 /dev/beep
  • 这种设计使得上层代码无需关心硬件驱动的具体实现,只需像操作普通文件一样来操作硬件。

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 的复杂细节。