三个结构体
- 硬件描述结构体
struct hw_module_t{
uint32_t tag; // 该值必须声明为HARDWARE_MODULE_TAG
uint16_t version_major; // 主版本号
uint16_t version_minor; // 次版本号
const char *id; //硬件id名,唯一标识module
const char *name; // 硬件module名字
const char * author; // 作者
struct hw_module_methods_t* methods; //指向封装有open函数指针的结构体
void* dso; // module’s dso
uint32_t reserved[32-7]; // 128字节补齐
};
```
2. 硬件对象方法结构体,通常是open函数,用于返回hw_device_t
```
struct hw_module_methods_t{
int (*open)(const struct hw_module_t* module, const char * id,
struct hw_device_t** device);
};
```
3. 硬件操作接口
```
struct hw_device_t{
uint32_t tag; // 必须赋值为HARDWARE_DEVICE_TAG
uint32_t version; // 版本号
struct hw_module_t* module; // 该设备操作属于哪个硬件对象,可以看成硬件操作接口与硬件对象的联系
uint32_t reserved[12]; // 字节补齐
int (*close)(struct hw_device_t* device); // 该设备的关闭函数指针,可以看做硬件的close方法
};
```
###leds_hal.h和leds_hal.c
leds_hal.h
```
struct led_module_t
{
struct hw_module_t hw_module;
};
struct led_control_device_t
{
struct hw_device_t hw_device;
int (*set_on)(struct led_control_device_t *dev, int32_t led);
int (*set_off)(struct led_control_device_t *dev, int32_t led);
};
// 在 led_control_device_t 结构体实现控制函数
// 在led_module_t 在hw_module外再加一层封装
```
leds_hal.c
1. 首先实现 led_on、led_off、led_device_open、led_close的框架
2. 在 led_on、led_off 中实现对灯的控制
3. 在led_device_close 释放掉hw_device_t结构体,避免内存泄露
4. 在led_device_open实现对hw_device_t的初始化
打开设备节点
初始化led_module_methods
###总结
以上三个结构体就是hal层的核心,结构体之间关系紧密。
1. 通过这个硬件id调用 hw_get_module(char*id, struct hw_module_t **module),这个函数查找注册在当前系统中与id对应的硬件对象并返回
2. 硬件对象里有个通过hw_module_methods_t结构封装的 open函数指针
3. 回调这个open函数,它返回封装有硬件操作接口的led_device_t结构体,这样我们可以通过这个硬件接口去间接的访问硬件 了。