Android之HAL层编写LED点灯程序

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号获取对应的设备模块modulemodule 中拿到hw_module_methods_t 结构体的子类,通过回调hw_module_methods_t 中的open函数拿到hw_device_t结构体的子类,Service层拿到device 就可以对硬件设备进行对应的操作了.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值