歡迎,客人 | 請登錄 | 免費注冊 | 忘記密碼?

 
當(dāng)前位置: 首頁 » 綜合資訊 » 企業(yè)資訊 » 智能卡 »

基于Android的POS機刷卡器閱讀芯片驅(qū)動研究

發(fā)布日期:2013-11-05  中國POS機網(wǎng)

Google公司在2007年11月5日推出了開源的Androld操作系統(tǒng),它是基于Linux內(nèi)核的開源手機操作系統(tǒng)。目前,Android應(yīng)用商店Android market已經(jīng)擁有超過70萬個應(yīng)用程序,有超過10萬名軟件開發(fā)人員為Android開發(fā)應(yīng)用程序,Android系統(tǒng)已經(jīng)廣泛運用于便攜式移動設(shè)備。

   移動POS機又稱無線POS,是一種RF-SIM卡終端閱讀器,通過CDMA,GPRS,TCP/IP等與數(shù)據(jù)服務(wù)器相連進(jìn)行工作。移動POS機具有移動性強,平均交易時間段,易于攜帶等特性在各大行業(yè)都已經(jīng)廣泛使用。將Android系統(tǒng)移植到pos機上,將為POS機提供更加豐富的應(yīng)用和功能擴展。

    刷卡器作為POS機主要功能承擔(dān)者,其驅(qū)動程序的研究和優(yōu)化也直接影響到Android系統(tǒng)在POS機領(lǐng)域的發(fā)展。

1 Android系統(tǒng)架構(gòu)

    Android是以Linux為內(nèi)核的開放式的手機操作系統(tǒng),采用了整合的策略思想,包括底層Linux操作系統(tǒng)、中間層的中間件和上層的Java應(yīng)用程序。Android系統(tǒng)是由應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運行庫層、Linux內(nèi)核層組成的,系統(tǒng)架構(gòu)如圖1所示。

a.JPG


    在應(yīng)用程序?qū)又邪薃ndroid系統(tǒng)的基礎(chǔ)應(yīng)用程序,所有的應(yīng)用程序都是用Java編寫的。

    應(yīng)用框架層是開發(fā)人員從事Android應(yīng)用程序開發(fā)的基礎(chǔ),該層簡化了組件重用,可以直接使用系統(tǒng)提供的組件快速的進(jìn)行應(yīng)用程序開發(fā),主要包括Activity Manager,Content Provider,View System等。

    在系統(tǒng)運行庫層中包括了兩個部分:程序庫和運行時庫,主要由Dalvik Java虛擬機和基礎(chǔ)的Jaya類庫組成,為應(yīng)用程序提供服務(wù)和Java編程語言核心庫。Android的核心系統(tǒng)服務(wù)依賴于Linux 2.6內(nèi)核,如安全性、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)協(xié)議和驅(qū)動模型。Linux內(nèi)核也同時作為硬件和軟件堆棧之間的硬件抽象層。

2 刷卡器工作原理

    MagTek公司的磁卡閱讀器芯片21006450是一款高性能、低功耗的三軌磁條解碼芯片。在對磁卡閱讀芯片復(fù)位時,如果STRBOE沒有置高,就需要將其置高,并將DATA拉低,然后再將STROBE置低。在復(fù)位之后仍需要將DATA強制置低,在釋放DATA之前需要將STROBE置高,然后再置低。在完成上述過程后,仍需要再完成一次STROBE的置高、置底,這樣才能完成復(fù)位序列。

    當(dāng)讀卡器芯片處在準(zhǔn)備讀卡狀態(tài)時,一旦檢測到三個磁通翻轉(zhuǎn),ASIC就會通過將DATA拉低來表明此時處于卡在線狀態(tài)。然后就開始將磁條卡上的數(shù)據(jù)讀取并存儲到緩存中。對應(yīng)于這種卡在線狀態(tài),控制器應(yīng)當(dāng)將STROBE置高。對應(yīng)于STROBE的上升沿,ASIC會將DATA置高,并清除卡在線信號??刂破鲿TROBE置低,然后等待DATA的下降沿,以此來表明處在緩存器就緒狀態(tài)。從內(nèi)存中讀取或提取數(shù)據(jù),需要用脈沖信號將STROBE輸入置高再置低來驅(qū)使數(shù)據(jù)指針將數(shù)據(jù)指向DATA的管腳。在數(shù)據(jù)讀取期間,當(dāng)STROBE的輸入為低時,DATA上的一個低電平代表1,而高電平代表0。需要說明的是,DATA進(jìn)入緩存器就緒狀態(tài)后,在復(fù)位之前,ASIC不會對再一次刷卡做出反應(yīng)。在片上緩存(內(nèi)存)中,為磁條卡的三個磁道中的每一個分配了704 b的空間,總共有2 112 b。對每條磁道而言,只有在卡上檢測到1的時候才開始存儲數(shù)據(jù),在這個1之前的所有的0都不會存儲進(jìn)緩存。當(dāng)檢測到第一個1之后,每個磁道存儲704 b的數(shù)據(jù),而一旦數(shù)據(jù)超過這個長度,將會丟失超出的數(shù)據(jù)。但這并不意味著芯片的存儲空間太小,確切來說,這么大的空間已經(jīng)能夠充分的滿足符號ISO編碼標(biāo)準(zhǔn)的磁條卡的需求。

    在提取數(shù)據(jù)時,STROBE是根據(jù)磁道A,磁道B,然后磁道C的順序進(jìn)行接收的。當(dāng)數(shù)據(jù)指針到達(dá)3個磁道共2112位的最后位置時,它將從反方向再次循環(huán)數(shù)據(jù)。需要說明的是,數(shù)據(jù)的移出的首選順序是磁道A、磁道B然后磁道C。ASIC并不決定刷卡的方向,只是簡單的將接收的數(shù)據(jù)表示出來。然后,反方向刷卡數(shù)據(jù)的移出時是以磁道C、磁道B、磁道A的順序進(jìn)行的,這就像將一盤磁帶或錄音帶翻帶。

    在復(fù)位時,會清除ASIC上的所有數(shù)據(jù),將所有的數(shù)據(jù)位都置為0(高電平)。
 

3 驅(qū)動設(shè)計

    驅(qū)動程序是Linux內(nèi)核與硬件之間的接口,直接對硬件設(shè)備進(jìn)行操作,同時對上層應(yīng)用程序提供接口。Android的設(shè)備驅(qū)動主要完成以下功能:初始化和釋放設(shè)備;讀取硬件設(shè)備數(shù)據(jù);將內(nèi)核數(shù)據(jù)寫入到硬件設(shè)備;讀取應(yīng)用程序數(shù)據(jù)傳送給設(shè)備文件等。在Android系統(tǒng)中刷卡器驅(qū)動應(yīng)包括:Linux內(nèi)核驅(qū)動程序、HAL(硬件抽象層)模塊、JNI方法、application framework硬件訪問服務(wù)。刷卡器閱讀芯片與開發(fā)板的連接框圖如圖1所示。

3.1 Linux內(nèi)核刷卡器閱讀芯片驅(qū)動程序

   刷卡器的基本功能就是讀取磁卡中的數(shù)據(jù)進(jìn)行解碼,并將得到的解碼數(shù)據(jù)傳遞給上層應(yīng)用程序。Android為了保護一些硬件提供商的知識產(chǎn)權(quán)提出了HAL層的概念,避開了Linux的GPL束縛,基本的思路是把控制硬件的動作都放在Android HAL層,而Linux driver只是完成一些簡單的數(shù)據(jù)交換。這里的Linux內(nèi)核刷卡器驅(qū)動程序同樣也只是一個的字符設(shè)備驅(qū)動,設(shè)備以模塊的形式存在Linux內(nèi)核中,模塊的加載和卸載通過static int_init msr_init(void)和static void_exit msr_exit(void)函數(shù)實現(xiàn),static int_msr_setup_dev(structmsr_Android_ dev*dev)函數(shù)對設(shè)備進(jìn)行初始化,函數(shù)static long msr_ioctI(struct inode*inode,struct file*filp,unsigned int cmd,unsigned long arg)實現(xiàn)驅(qū)動程序?qū)?a href="http://www.500635.com">刷卡器的I/O控制。設(shè)備的打開、關(guān)閉及具體的代碼實現(xiàn)可以參考《Linux設(shè)備驅(qū)動程序》。對內(nèi)核配置編譯后就可以在Linux內(nèi)核中得到設(shè)備模塊msr.o,在上層中可以通過調(diào)用這個模塊來實現(xiàn)對刷卡器的控制。

3.2 HAL層訪問內(nèi)核驅(qū)動程序

    硬件抽象層中訪問不同設(shè)備內(nèi)核驅(qū)動程序的模塊是以*.so文件形式存在的,這樣可以有效的保護硬件廠商的知識產(chǎn)權(quán)。在runtime(JNI部分),則向HAL取得特定模塊的opeIlations,再callback這些操作函數(shù)。在HAL層包括許多模塊,而runtime只需要說明類型,即module ID,就可以取得相應(yīng)模塊的operations。在HAL層中需要具體實現(xiàn)刷卡器的讀卡操作。首先需要查找到開始標(biāo)志0x0b,然后將磁道1中的數(shù)據(jù)放到bufl中,用同樣的方法可以將磁道2,3的數(shù)據(jù)存到buf2,buf3中,磁道2最多40個字符每個5位4位數(shù)據(jù)1位奇校驗,而磁道3最多107個字符每個5位4位數(shù)據(jù)1位奇校驗。然后將buf中的數(shù)據(jù)補齊之后放在主寄存器中。HAL層中還需要使用static int check_msr_io(void)對I/O的狀態(tài)進(jìn)行檢測,并對設(shè)備進(jìn)行初始化static int msr_device_init(void)。具體的實現(xiàn)由于篇幅限制,不在進(jìn)行詳細(xì)介紹。

3.3 編寫JNI方法訪問硬件

    從編程語言看,Android系統(tǒng)是由基于Java語言的Java層與基于C/C++語言的C/C++層組成的,為了使這兩層相互配合、共同完成任務(wù)就必須使用Java本地接口(JNI,Java Native Interface)將這兩層有機的聯(lián)系起來。JNI提供了一系列接口,允許Java類與使用C/C++編寫的應(yīng)用程序、模塊、庫進(jìn)行交互操作。JNI是通過函數(shù)方法映射表static const JNINativeMethod method_table,將Java本地方法和HAL層提供的C函數(shù)接口銜接起來。

3.4在application framework增加硬件訪問服務(wù)

    在Android Framework或應(yīng)用程序開發(fā)中所需要的主要API都是以服務(wù)的形式存在的。對應(yīng)用程序來說,硬件服務(wù)是運行在一個獨立的進(jìn)程中的,若要調(diào)用這些服務(wù)就需要在硬件服務(wù)和應(yīng)用程序之間添加通信接口。應(yīng)用程序通過Interface IMsrService接口,調(diào)用硬件服務(wù)提供的Init()等函數(shù)。在刷卡器的硬件服務(wù)中是將定義的通信接口與JNI提供的接口相關(guān)聯(lián)起來。同時需要將磁卡閱讀芯片服務(wù)添加到系統(tǒng)服務(wù)中Service Manager.a(chǎn)ddService(“msr”,new MsrService()),這樣應(yīng)用程序就能通過Java接口調(diào)用硬件服務(wù),實現(xiàn)對磁卡閱讀芯片的控制。圖2以讀取芯片數(shù)據(jù)為例,簡單介紹各層之間的調(diào)用。

打賞
 
?
免責(zé)聲明:
本網(wǎng)站部分內(nèi)容來源于網(wǎng)站會員、合作媒體、企業(yè)機構(gòu)、網(wǎng)友提供和互聯(lián)網(wǎng)的公開資料等,僅供參考。本網(wǎng)站對站內(nèi)所有資訊的內(nèi)容、觀點保持中立,不對內(nèi)容的準(zhǔn)確性、可靠性或完整性提供任何明示或暗示的保證。如果有侵權(quán)等問題,請及時聯(lián)系我們,我們將在收到通知后第一時間妥善處理該部分內(nèi)容。

圖文推薦

您在本欄的歷史瀏覽
熱門資訊

中國POS機行業(yè)權(quán)威門戶網(wǎng)站 引領(lǐng)行業(yè)發(fā)展


微信號:pos580com

網(wǎng)站首頁 | 網(wǎng)站地圖 | 誠征英才 | 關(guān)于我們 | 聯(lián)系方式 | 使用協(xié)議 | 版權(quán)隱私 | 排名推廣 | 廣告服務(wù) | 積分換禮 | 網(wǎng)站留言 | RSS訂閱

版權(quán)所有:POS機網(wǎng) 北京瑞紀(jì)華人科技有限公司 京ICP證060984  |  京ICP備07503063號

聯(lián)系電話:010-51658061 E-mail:bjsale#pos580.com(請把#替換成@)在線QQ:841617225

站所有信息均屬本站版權(quán)所有,如需轉(zhuǎn)載請注明來源地址 域名:www.500635.com