先规定驱动接口文件的特定格式:
DRV_XXX.c
DEV_XXX.c
drv_XXX_i.h
1.drv_XXX_i.h是对外接口.
2
DRV_XXX.c里面都是以下面的函数接口:
(开放在magic.c里面)
{
&DRV_DTOS_MInit,
&DRV_DTOS_MExit,
&DRV_DTOS_MOpen,
&DRV_DTOS_MClose,
&DRV_DTOS_MRead,
&DRV_DTOS_MWrite,
&DRV_DTOS_MIoctrl
}
DRV_DTOS_MInit是最先会被执行的函数(在结构体中的解释: //在install/reset模块时使用,若模块需要后台任务,可以在此启动)
DRV_DTOS_MIoctrl函数应该是在 esDEV_Plugin("//drv//dtos.drv", 0, 0, 1);时调用,并有一个DRV_CMD_PLUGIN命令进来(细节不管).
而通常在对DRV_CMD_PLUGIN命令进行处理时要用esDEV_DevReg("USERDTOS", "DTOS", &dtos_dev_ops, 0);将驱动注册,以便在程序中使用.
3
DEV_XXX.c
中也是下面的函数接口:
__dev_devop_t dtos_dev_ops =
{
DEV_DTOS_Open,
DEV_DTOS_Close,
DEV_DTOS_Read,
DEV_DTOS_Write,
DEV_DTOS_Ioctrl
};
供上面esDEV_DevReg作参数用.
这样,在程序中,用下面方法:
{
ES_FILE *p_tpfile;
p_tpfile = eLIBs_fopen("b://USERDTOS//DTOS", "r+");
if( !p_tpfile )
{
__err(" open dtos driver error /n");
return EPDK_FAIL;
}
eLIBs_fioctrl(p_tpfile, DRV_DTOS_CMD_INIT, 0, NULL);
eLIBs_fclose(p_tpfile);
}
就可操作DEV_DTOS_Ioctrl函数了(上面的eLIBs_fioctrl(p_tpfile, DRV_DTOS_CMD_INIT, 0, NULL),肯定调用DEV_DTOS_Ioctrl来对DRV_DTOS_CMD_INIT命令进行处理).
真正驱动的初始化就是在DEV_DTOS_Ioctrl对DRV_DTOS_CMD_INIT命令进行处理时实现.
上面的结构就是为了封装,但个人认为过于繁琐,可能为了与系统其它方面兼容有关.