1、创建vxbus函数方法表,必须包括probe和attach函数。
LOCAL VXB_DRV_METHOD vxbxMethodList[] =
{
{VXB_DEVMETHOD_CALL(vxbDevProbe), vxbxProbe},
{VXB_DEVMETHOD_CALL(vxbDevAttach), vxbxAttach},
{0, NULL}};
2、创建VXB_DRV结构,在选项里必须是VXB_BUSID_FDT类,表示是设备树。
VXB_DRV vxbxDrv =
{
{NULL},
"drvname", /* Name */
"FDT vxBus driver", /* Description */
VXB_BUSID_FDT, /* Class */
0, /* Flags */
0, /* Reference count */
vxbMCP251xMethodList, /* Method table */
};
VXB_DRV_DEF(vxbxDrv )
3、创建VXB_FDT_DEV_MATCH_ENTRY 匹配结构,属性名称为"exp,expdrvname",对应设备树
device@520000
{
compatible = "exp,expdrvname";
};
LOCAL const VXB_FDT_DEV_MATCH_ENTRY vxbxMatch[] =
{
{
"exp,expdrvname", /* compatible */
(void *)NULL,
},
{} /* Empty terminated list */
};
4、编写vxbxProbe函数
LOCAL STATUS vxbxProbe(VXB_DEV_ID pDev)
{
return vxbFdtDevMatch(pDev, vxbxMatch, NULL);
}
5、编写vxbxAttach 函数
LOCAL STATUS vxbxAttach(VXB_DEV_ID pInst)
{
//申请驱动数据结构内存
FD_DEV *pDev = NULL;
pDev = (FD_DEV *)vxbMemAlloc(sizeof(FD_DEV ));
//装在驱动
if (ERROR == vxbxIosDrvNum)
{
vxbxIosDrvNum = iosDrvInstall(
(DRV_CREATE_PTR)NULL,
(DRV_REMOVE_PTR)NULL,
(DRV_OPEN_PTR)vxbxIosOpen,
(DRV_CLOSE_PTR)vxbxIosClose,
(DRV_READ_PTR)NULL,
(DRV_WRITE_PTR)NULL,
(DRV_IOCTL_PTR)NULL);
if (ERROR == vxbxIosDrvNum )
{
(void)vxbMemFree(pDev);
return ERROR;
}
}
//获取设备树相关参数
vxbGpioGetByFdtIndex
//设置相关参数
pDev->pDev= pInst;
vxbDevSoftcSet (pInst, (void *)pDev);
//
return OK;
}
6、新建mk文件
OBJS_ARM += drv.o
7、新建cdf文件
Component DRV_FDT_DRVNAME {
NAME new vxBus driver
SYNOPSIS new vxBus driver
MODULES drv.o
LINK_SYMS vxbxDrv
_CHILDREN FOLDER_DRIVERS_OTHER
REQUIRES INCLUDE_VXBUS \
INCLUDE_VXBUS_RTC_LIB \
DRV_BUS_FDT_ROOT
}