typedef struct hw_module_t { // 驱动模块
/** tag must be initialized to HARDWARE_MODULE_TAG */ uint32_t tag; //模块标识(固定不变)
/** major version number for the module */ uint16_t version_major; //主设备号
/** minor version number of the module */ uint16_t version_minor; //次设备号
/** Identifier of module */ const char *id; //驱动ID
/** Name of this module */ const char *name; //驱动名字
/** Author/owner/implementor of the module */ const char *author; //驱动的作者
/** Modules methods */ struct hw_module_methods_t* methods;//驱动对应的方法
/** module's dso */ void* dso; //
/** padding to 128 bytes, reserved for future use */ uint32_t reserved[32-7]; //保留值
} hw_module_t; |
驱动模块对应的操作
typedef struct hw_module_methods_t { /** Open a specific device */ int (*open)(const struct hw_module_t* module, const char* id, struct hw_device_t** device); } hw_module_methods_t; |
驱动对应的设备
typedef struct hw_device_t { /** tag must be initialized to HARDWARE_DEVICE_TAG */ uint32_t tag; //设备标识(固定不变)
/** version number for hw_device_t */ uint32_t version; //版本号
/** reference to the module this device belongs to */ struct hw_module_t* module; //对应的驱动模块
/** padding reserved for future use */ uint32_t reserved[12]; //保留值
/** Close this device */ int (*close)(struct hw_device_t* device); } hw_device_t; |
//stab固定名字
#define HAL_MODULE_INFO_SYM HMI
//stab字符串形式的名字
#define HAL_MODULE_INFO_SYM_AS_STR “HMI”
获取对应的驱动模块
int hw_get_module(const char *id, const struct hw_module_t **module); |
以led为例子
以上三个结构体是对硬件层的抽象,当添加具体的硬件设备时,需要继承以上的三个结构体。
led.h头文件内容
#define LED_HARDWARE_MODULE_ID "led" struct led_module_t { struct hw_module_t common;//父类属性 …//子类属性 }
struct led_device_t { struct hw_device_t common;//父类属性 int (*set_on)(struct led_device_t dev);//子类设备所拥有的操作 int (*set_off)(struct led_device_t dev); } |
led.c源文件定义
static int led_device_open(const struct hw_module_t *module, const char* name struct hw_device_t **dev); led_device_t *device = (led_device_t*)malloc(sizeof(led_device_t)); //初始化父类部分 device.common.tag = HARDWARE_DEVICE_TAG; device.common.version = 0; device.common.module = module; device.common.close = led_device_close; //初始化子类部分 device.seton = led_device_seton; device.setoff = led_device_setoff; *dev = device; }
static int led_device_seton( led_device_t *dev ){ return 0; } static int led_device_setoff( led_device_t *dev){ return 0; }
static int led_device_close( hw_device_t *dev){//关闭设备 return 0; }
static struct hw_module_methods_t led_module_methods = { open:led_device_open //完成open函数映射 }
//定义硬件模块变量,注意变量名必须是这个常亮名 const struct led_module_t HAL_MODULE_INFO_SYM = { common:{ //初始化父类属性 tag: HARDWARE_MODULE_TAG, version_major: 1, version_minor: 0, id: LED_HARDWARE_MODULE_ID, name: “led HAL Stub” author: “farsight”, methods: &led_module_methods, } //初始化子类属性 } |
HAL调用顺序
首先调用hw_get_module( const char *id, const struct hw_module_t **module );
通过ID号获取对应的设备模块module,从module 中拿到hw_module_methods_t 结构体的子类,通过回调hw_module_methods_t 中的open函数拿到hw_device_t结构体的子类,Service层拿到device 就可以对硬件设备进行对应的操作了.