• 基于Android 的POS 机刷卡器阅读芯片驱动研究
  • 基于Android 的POS 机刷卡器阅读芯片驱动研究

    基于Android 的POS 机刷卡器阅读芯片驱动研究
     
      MagTek刷卡器阅读芯片21006450应用广泛,对于它的研究将有助于刷卡器阅读芯片驱动程序在实际中的应用。这里所研究的Android系统架构、芯片工作原理及接口调用是刷卡器阅读芯片驱动程序设计的理论基础,对驱动程序的实现做指导。
     
      移动POS机又称无线POS,是一种RF-SIM卡终端阅读器,通过CDMA,GPRS,TCP/IP等与数据服务器相连进行工作。移动POS机具有移动性强,平均交易时间段,易于携带等特性在各大行业都已经广泛使用。将Android系统移植到POS机上,将为POS机提供更加丰富的应用和功能扩展。
      Android是以Linux为内核的开放式的手机操作系统,采用了整合的策略思想,包括底层Linux操作系统、中间层的中间件和上层的Java应用程序。Android系统是由应用程序层、应用程序框架层、系统运行库层、Linux内核层组成的,系统架构如图1所示。
      在应用程序层中包含了Android系统的基础应用程序,所有的应用程序都是用Java编写的。
      应用框架层是开发人员从事Android应用程序开发的基础,该层简化了组件重用,可以直接使用系统提供的组件快速的进行应用程序开发,主要包括ActivityManager,ContentProvider,ViewSystem等。
      在系统运行库层中包括了两个部分:程序库和运行时库,主要由DalvikJava虚拟机和基础的Java类库组成,为应用程序提供服务和Java编程语言核心库。
      Android的核心系统服务依赖于Linux2.6内核,如安全性、内存管理、进程管理、网络协议和驱动模型。Linux内核也同时作为硬件和软件堆栈之间的硬件抽象层。
     
      当读卡器芯片处在准备读卡状态时,一旦检测到三个磁通翻转,ASIC就会通过将DATA拉低来表明此时处于卡在线状态。然后就开始将磁条卡上的数据读取并存储到缓存中。对应于这种卡在线状态,控制器应当将STROBE置高。对应于STROBE的上升沿,ASIC会将DATA置高,并清除卡在线信号。控制器会将STROBE置低,然后等待DATA的下降沿,以此来表明处在缓存器就绪状态。从内存中读取或提取数据,需要用脉冲信号将STROBE输入置高再置低来驱使数据指针将数据指向DATA的管脚。在数据读取期间,当STROBE的输入为低时,DATA上的一个低电平代表1,而高电平代表0.需要说明的是,DATA进入缓存器就绪状态后,在复位之前,ASIC不会对再一次刷卡做出反应。在片上缓存(内存)中,为磁条卡的三个磁道中的每一个分配了704b的空间,总共有2112b.对每条磁道而言,只有在卡上检测到1的时候才开始存储数据,在这个1之前的所有的0都不会存储进缓存。当检测到第一个1之后,每个磁道存储704b的数据,而一旦数据超过这个长度,将会丢失超出的数据。但这并不意味着芯片的存储空间太小,确切来说,这么大的空间已经能够充分的满足符号ISO编码标准的磁条卡的需求。
      在提取数据时,STROBE是根据磁道A,磁道B,然后磁道C的顺序进行接收的。当数据指针到达3个磁道共2112位的最后位置时,它将从反方向再次循环数据。需要说明的是,数据的移出的首选顺序是磁道A、磁道B然后磁道C.ASIC并不决定刷卡的方向,只是简单的将接收的数据表示出来。然后,反方向刷卡数据的移出时是以磁道C、磁道B、磁道A的顺序进行的,这就像将一盘磁带或录音带翻带。
      Android的设备驱动主要完成以下功能:初始化和释放设备;读取硬件设备数据;将内核数据写入到硬件设备;读取应用程序数据传送给设备文件等。在Android系统中刷卡器驱动应包括:Linux内核驱动程序、HAL(硬件抽象层)模块、JNI方法、applicationframework硬件访问服务。刷卡器阅读芯片与开发板的连接框图如图1所示。
      Linux内核刷卡器阅读芯片驱动程序
      刷卡器的基本功能就是读取磁卡中的数据进行解码,并将得到的解码数据传递给上层应用程序。An-droid为了保护一些硬件提供商的知识产权提出了HAL层的概念,避开了Linux的GPL束缚,基本的思路是把控制硬件的动作都放在AndroidHAL层,而Linuxdriver只是完成一些简单的数据交换。这里的Linux内核刷卡器驱动程序同样也只是一个的字符设备驱动,设备以模块的形式存在Linux内核中,模块的加载和卸载通过stat-icint_initmsr_init(void)和staticvoid_exitmsr_exit(void)函数实现,staticint_msr_setup_dev(structmsr_Android_dev*dev)函数对设备进行初始化,函数staticlongmsr_ioctl(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg)实现驱动程序对刷卡器的I/O控制。设备的打开、关闭及具体的代码实现可以参考《Linux设备驱动程序》。对内核配置编译后就可以在Linux内核中得到设备模块msr.o,在上层中可以通过调用这个模块来实现对刷卡器的控制。
      HAL层访问内核驱动程序
      硬件抽象层中访问不同设备内核驱动程序的模块是以*.so文件形式存在的,这样可以有效的保护硬件厂商的知识产权。在runtime(JNI部分),则向HAL取得特定模块的operations,再callback这些操作函数。在HAL层包括许多模块,而runtime只需要说明类型,即moduleID,就可以取得相应模块的operations.在HAL层中需要具体实现刷卡器的读卡操作。首先需要查找到开始标志0x0b,然后将磁道1中的数据放到buf1中,用同样的方法可以将磁道2,3的数据存到buf2,buf3中,磁道2最多40个字符每个5位4位数据1位奇校验,而磁道3最多107个字符每个5位4位数据1位奇校验。
      编写JNI方法访问硬件
      从编程语言看,Android系统是由基于Java语言的Java层与基于C/C++语言的C/C++层组成的,为了使这两层相互配合、共同完成任务就必须使用Java本地接口(JNI,JavaNativeInterface)将这两层有机的联系起来。
      JNI提供了一系列接口,允许Java类与使用C/C++编写的应用程序、模块、库进行交互操作。JNI是通过函数方法映射表staticconstJNINativeMethodmethod_table,将Java本地方法和HAL层提供的C函数接口衔接起来。

    更多型号芯片解密可致电北京致芯科技24小时服务热线:13466687255 010-57436217

    点击这里给我发消息 点击这里给我发消息

      Copyright © 2004-2017 致芯科技 版权所有