基于Android的POS機刷卡器閱讀芯片驅(qū)動研究
3 驅(qū)動設(shè)計
驅(qū)動程序是Linux內(nèi)核與硬件之間的接口,直接對硬件設(shè)備進行操作,同時對上層應(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ù)進行解碼,并將得到的解碼數(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è)備進行初始化,函數(shù)static long msr_ioctI(struct inode*inode,struct file*filp,unsigned int cmd,unsigned long arg)實現(xiàn)驅(qū)動程序?qū)λ⒖ㄆ鞯腎/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)刷卡器的讀卡操作。首先需要查找到開始標志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)進行檢測,并對設(shè)備進行初始化static int msr_device_init(void)。具體的實現(xiàn)由于篇幅限制,不在進行詳細介紹。
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)用程序、模塊、庫進行交互操作。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ù)是運行在一個獨立的進程中的,若要調(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)用。本文引用地址:http://www.ex-cimer.com/article/192744.htm
4 結(jié)語
隨著系統(tǒng)逐漸成熟,應(yīng)用程序日益豐富,Android系統(tǒng)與POS機的結(jié)合將為POS機的發(fā)展提供更為廣闊的空間。本文在分析了Android架構(gòu)的基礎(chǔ)上,分析刷卡器的工作原理,研究將POS機刷卡器閱讀芯片驅(qū)動程序添加到Android系統(tǒng)中,為上層應(yīng)用程序提供接口,實現(xiàn)刷卡器的功能。各層之間的接口調(diào)用銜接是整個驅(qū)動程序成功運行的基礎(chǔ),在驅(qū)動設(shè)計中,每編寫一層都應(yīng)進行測試,這樣能更好的定位驅(qū)動設(shè)計中存在的不足。
linux相關(guān)文章:linux教程
pos機相關(guān)文章:pos機原理
評論