标题:
嵌入式Linux下IC卡接口设计与驱动开发 03
[打印本页]
作者:
samwalton
时间:
2014-4-28 07:30
标题:
嵌入式Linux下IC卡接口设计与驱动开发 03
m8xx_timer_start();
result=register_chrdev(majorl,“IC”,&ic_fops);
return 0:
}
模块初始化函数是模块开发过程中必不可少的处理函数,用于实现设备的初始化、中断初始化及处理、设备注册等。在上面函数中,首先应用initicdata(&icdata)实现了卡数据的初始化,然后定义了队列数据。再进行了中断处理函数的绑定、中断申请以及中断初始化。最后实现了IC卡字符设备的申请。设备名为IC。
(4)中断处理
模块采用了MPC823E的定时器中断,在每个定时器中断发生时对插卡状况进行检测。如果检测到插卡,则进行读卡操作;如果检测到拔卡操作,则进行卡数据的清零和卡状态数据的更新。
程序中的中断处理采用了timer_task任务队列来实现中断的后续处理。其处理函数为time r_do_tasklet。M8xx timer_setup()函数首先进行MPC823E定时器的初始化和参数设定。然后应用语句CPm_in stall_handler rCPMVEC TIMER4,m8xx_timerinterrupt,(void*)0);实现了中断处理的资源申请和中断处理函数m 8 x x_timer_interrupt()的绑定。
中断处理函数中采用语句
queue_task(&timer_task,&tq_immediate);
mark_bh(IMMEDIATE_BH);
实现了任务队列timer_task加入内核tq_immediate的任务队列处理。内核在合适的时间会自动调用timer_task的例行处理函数timer_do_taskletO进行中断的后续处理。
在time r dO_ta sklet()处理函数中,有一条语句wake up interruptible(&icde v.writeq)与ic_poll函数中的D011_wait(flip,&icdev.writeq,wait)相对应。当中断发生时,将等待时间队列icdev.writeq激活;而poll_wait函数则针对此队列进行监控。一旦被激活,则可以传递给用户插卡操作信息,在用户应用软件中可立即调用读函数进行读卡操作。这样就实现了对卡的实时操作监控。
(5)模块注销函数的实现
static void_exit
remove_ic(void){
m8xx_timer_stop();
cpm_free_handler(CPMVEC_TIMERl);
unregister_chrdev(majorl,“IC”);
}
这个函数也是模块驱动开发中必不可少的函数之一,用于模块卸载时进行资源的释放,并注销此模块。如上函数所示,首先进行了中断的停止、释放中断资源,同时进行了字符设备的注销。
(6)设备读、写、监控等子函数
用来实现对卡的操作,主要是通过实现卡的各种操作时序。也即在ic_fop s结构体中定义的4个操作函数:icopen用于打开卡设备,进行一些数据的初始化操作;icread()用于插卡操作时读取卡数据;icwrite()用于写卡;icpoll()用于实现卡的实时监控。
综上所述,卡驱动模块的基本实现原理是:申请中断资源,当有插卡操作发生时,引发中断,进行读卡操作。在拔卡操作时也能引发中断,同时进行相应数据处理。同时提供poll()函数接口,用户可采用此函数对设备进行监控,从而实现有卡操作发生时马上进行卡数据的更新。
注:驱动程序源码见本刊网站WWW.dpj.tom.cn。5 驱动模块开发的编译调试 以开发平台和编译器为例编写简单的makefile文件为:
CC=ppc 8xx_gcc
DD=.nostdinc.DMODULE-D_KERNEL_I/mykeme Finclude.Wall-Wstrict-prototypes-Wno-trigraphs-02-fomit-frame-pointer-fno-strict-aliasing-fno-common-I/mykernel/arch/ppc-fsigned-char-resort-float-pipe-ffixed-r2-Wno-uninitialized-mmultiple-mstring-fno-builtin-I/Opt/hardhat/devkit/ppc/8xx/target/usr/lib/gcc-lib/powerpc-hardhat-linux/3.2.1/include ie.o:ic.C
$(CC)$(DD)-C ic.c
install:
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0