Led控制从内核到app的实现之hal层(二)

三个结构体

  1. 硬件描述结构体
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结构体,这样我们可以通过这个硬件接口去间接的访问硬件 了。

你可能感兴趣的:(Led控制从内核到app的实现之hal层(二))