驱动接口API设计的一种方法
xxx_interface.h
/*! \cond MMM_ID_API*/
/*!
* \brief
* 提供给应用层的xxx命令
*/
typedef enum
{
/*! 打开stub */
XXX_OP_OPEN = 0,
/*! 关闭stub */
XXX_OP_CLOSE,
} xxx_cmd_t;
extern int stub_mod_cmd(void *, void *, void *, int);
/*启动xxx设备*/
/*int xxx_init(bool need_uninstall_led)*/
#define xxx_open(a) (int)xxx_mod_cmd((void*)(a), (void*)(0), (void*)(0), XXX_OP_OPEN)
/*关闭xxx设备*/
/*int xxx_exit(void)*/
#define xxx_close() (int)xxx_mod_cmd((void*)(0), (void*)(0), (void*)(0), XXX_OP_CLOSE)
xxx_entry.h
typedef int (*xxx_func_t)(void *param0, void *param1, void *param2);
typedef struct
{
xxx_func_t open;
xxx_func_t close;
} stub_hal_ops_t;
xxx_entry.c
xxx_hal_ops_t *g_xxx_ops;
const xxx_hal_ops_t xxx_ops[] =
{
xxx_open,
xxx_close,
NULL,
};
int32 inner_xxx_open(void* param0, void* param1, void* param2)
{
int32 ret_val;
g_xxx_ops = xxx_ops;
ret_val = g_xxx_ops->open(param0, param1, param2);
return ret_val;
}
int xxx_mod_cmd(void* param0, void* param1, void* param2, int cmd)
{
switch (cmd)
{
case XXX_OP_OPEN:
return inner_xxx_open(param0, param1, param2);
case XXX_OP_CLOSE:
return g_xxx_ops->close(param0, param1, param2);
}
return -1;
}
在底层对这两个代码进行实现
xxx_open
xxx_close