- UID
- 872238
|
编辑头文件ICDATA.H,确定在驱动模块程序中应用的公用数据结构。驱动模块的最终目的是读取和写入卡数据处理,所以规范整齐的数据结构是必须的。可以定义一个数据结构体来实现卡数据的存储区域、数据地址索引、控制标志位等,如:
slruct ICDATA {
char*readbuffstrt; //读入数据缓冲区首指针
char*readbuffend; //读入数据缓冲区末指针
char*writebuffstart; //写入数据缓冲区首指针
char*writebuffend; //写入数据缓冲区末指针
int readcount; //读入数据量
int writecount; //写入数据量
char *readp; //读人数据当前指针
int readnum; //已经读入量
char *writep; //当前写入数据指针
int writenum; //当前写入量
int newstate; //卡当前状态,O为无卡,1为有卡
int oldstate; //卡的旧状态
int statechange; //卡状态变化标志
};struct file_operations ic_fops={
open: icopen,
read: icread,
write: icwrite,
poll: icpoll, };
这样在驱动模块中,只需要struct ICDATA iccdata;一条语句便可定义全部的卡处理数据结构定义;而ic_fops则定义了设备操作映射函数结构。从这个数据结构看,我们实现了IC卡设备的打开、读、写和监控函数。
(2)硬件接口控制线控制子函数
这些函数用作进行卡复位、时钟等信号的控制。static void setclkout(void){
#define PB_DR26 ((ushort)0x0020)
volatile immap_t*immap=(immap_t*)IMAP_ADDR;
(void)immap;
immap=>im_cpm.cp_pbpat &=~(PB_DR26);
immap->im_cpm.cp_pbdirl=PB_DR26; }
以上是以我们开发的硬件系统平台为例的硬件控制接口操作函数之一,用于控制IC卡的复位信号置1。针对不同硬件平台,函数内部操作方法不尽相同。类似的其它操作函数还有:
static void setrstout(void)
static void clearrst(void)
static void setclk(void)
static void setrst(void)
static void clearclk(void)
static void setsda(void)
static void clearsda(void)
static void setsdain(void)
static void setsdaout(void)
(3)模块初始化函数的实现
static int_init
init_ic(void){
initicdata(&icdata);
init waitqueue head(&icdev readq);
init_waitqueue_head(&icdev.writeq);
timer task.routine=(void(*)(void*))timer_do_tasklet:
timer task.data=(void *)&icdata;
mSxx_timersetup(); |
|