先規定驅動接口文件的特定格式:
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命令進行處理時實現.
上面的結構就是爲了封裝,但個人認爲過於繁瑣,可能爲了與系統其它方面兼容有關.