在嵌入式系统中为了对外设进行统一管理,本文设计了一种简易的设备驱动管理架构。
一、基本概念
所谓设备驱动管理架构是指使用数组索引的方式对SOC片内外设进行统一的管理。
基本原理:
为每一种外设分配一个设备编号,功能函数通过设备编号索引相应的设备操作。
二、设备驱动管理架构结构体
1、将SOC片内外设进行编号
//设备编号,静态分配
#define Device_Spi 1
#define Device_I2C 2
#define Device_Timer 3
//设备最大数量
#define DeviceMaxNum 20
2、自定义设备索引数组表
typedef struct
{
u32(*pInit)();
u32(*pRead)();
u32(*pWrite)();
u32(*pIoControl)();
}DeviceRegisterParam;
//设备操作索引表
DeviceRegisterParamDeviceRegisterList[DeviceMaxNum];
3、设备数组索引表
三、BSP函数操作接口
1、设备注册
为了便于设备管理,将所有设备进行编号,并对外设挂接相应的操作函数
设备注册主要是将设备操作函数(init\read\write\ioctl)挂接到设备索引表DeviceRegisterList[DeviceMaxNum]中相应的设备号上;
DeviceRegister(int DeviceID, DeviceRegisterParam* deviceRegisterParam)
{
DeviceRegisterList[DeviceID].pInit= deviceRegisterParam->pInit;
DeviceRegisterList[DeviceID].pRead =deviceRegisterParam-> pRead;
DeviceRegisterList[DeviceID].pWrite = deviceRegisterParam-> pWrite;
DeviceRegisterList[DeviceID].pIoControl = deviceRegisterParam-> pIoControl;
}
2、设备初始化
应用通过配置设备的初始化参数,调用设备初始化接口,进而调用具体的设备初始化函数完成设备初始化。
DeviceInit(int DeviceID, void * pDeviceInitParam)
{
DeviceRegisterList[DeviceID].pInit(pDeviceInitParam);
}
3、读
应用通过调用设备数据读取函数,将具体设备的数据读到指定的内存区域中。
DeviceRead(int DeviceID, void * pDeviceInitParam)
{
If(Device> DeviceMaxNum )
{
return False;
}
If(NULL== pDeviceInitParam )
{
return False;
}
DeviceRegisterList[DeviceID].pRead(pDeviceInitParam);
}
4、写
DeviceWrite(int DeviceID, void * pDeviceInitParam)
{
If(Device> DeviceMaxNum )
{
return False;
}
If(NULL== pDeviceInitParam )
{
return False;
}
DeviceRegisterList[DeviceID].pWrite(pDeviceInitParam);
}
5、IO控制
具体的控制命令由初始化参数传递。
DeviceIOControl(int DeviceID, void * pDeviceInitParam)
{
If(Device> DeviceMaxNum )
{
return False;
}
If(NULL== pDeviceInitParam )
{
return False;
}
DeviceRegisterList[DeviceID].pIOControl (pDeviceInitParam);
}