三個(gè)結(jié)構(gòu)體
- 硬件描述結(jié)構(gòu)體
struct hw_module_t{
uint32_t tag; // 該值必須聲明為HARDWARE_MODULE_TAG
uint16_t version_major; // 主版本號(hào)
uint16_t version_minor; // 次版本號(hào)
const char *id; //硬件id名慈迈,唯一標(biāo)識(shí)module
const char *name; // 硬件module名字
const char * author; // 作者
struct hw_module_methods_t* methods; //指向封裝有open函數(shù)指針的結(jié)構(gòu)體
void* dso; // module’s dso
uint32_t reserved[32-7]; // 128字節(jié)補(bǔ)齊
};
```
2. 硬件對(duì)象方法結(jié)構(gòu)體,通常是open函數(shù),用于返回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; // 版本號(hào)
struct hw_module_t* module; // 該設(shè)備操作屬于哪個(gè)硬件對(duì)象良漱,可以看成硬件操作接口與硬件對(duì)象的聯(lián)系
uint32_t reserved[12]; // 字節(jié)補(bǔ)齊
int (*close)(struct hw_device_t* device); // 該設(shè)備的關(guān)閉函數(shù)指針,可以看做硬件的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 結(jié)構(gòu)體實(shí)現(xiàn)控制函數(shù)
// 在led_module_t 在hw_module外再加一層封裝
```
leds_hal.c
1. 首先實(shí)現(xiàn) led_on、led_off哀卫、led_device_open、led_close的框架
2. 在 led_on撬槽、led_off 中實(shí)現(xiàn)對(duì)燈的控制
3. 在led_device_close 釋放掉hw_device_t結(jié)構(gòu)體此改,避免內(nèi)存泄露
4. 在led_device_open實(shí)現(xiàn)對(duì)hw_device_t的初始化
打開(kāi)設(shè)備節(jié)點(diǎn)
初始化led_module_methods
###總結(jié)
以上三個(gè)結(jié)構(gòu)體就是hal層的核心,結(jié)構(gòu)體之間關(guān)系緊密侄柔。
1. 通過(guò)這個(gè)硬件id調(diào)用 hw_get_module(char*id, struct hw_module_t **module),這個(gè)函數(shù)查找注冊(cè)在當(dāng)前系統(tǒng)中與id對(duì)應(yīng)的硬件對(duì)象并返回
2. 硬件對(duì)象里有個(gè)通過(guò)hw_module_methods_t結(jié)構(gòu)封裝的 open函數(shù)指針
3. 回調(diào)這個(gè)open函數(shù)共啃,它返回封裝有硬件操作接口的led_device_t結(jié)構(gòu)體,這樣我們可以通過(guò)這個(gè)硬件接口去間接的訪問(wèn)硬件 了暂题。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者