楊建軍
摘要:針對(duì)廣泛用于緊湊型嵌入式通信設(shè)備中的SIM900A模塊的驅(qū)動(dòng)設(shè)計(jì),對(duì)其組成系統(tǒng)的硬件和基于Linux的驅(qū)動(dòng)構(gòu)架進(jìn)行分析;采用典型的字符驅(qū)動(dòng)模式,以openSUSE內(nèi)核為平臺(tái),設(shè)計(jì)了SIM900A的字符驅(qū)動(dòng)模塊,模塊中通過(guò)將串口的操作封裝于ioctl命令函數(shù)中,并引入命令字SETPORTID供應(yīng)用程序調(diào)用方法,使得對(duì)串口的操作相比于經(jīng)典的操作方式更具有靈活性和適應(yīng)性,并減少上層應(yīng)用對(duì)SIM900A操作的復(fù)雜性;現(xiàn)場(chǎng)測(cè)試測(cè)試結(jié)果顯示,該模塊可以方便而簡(jiǎn)單地設(shè)置串口參數(shù)的不同工作方式;相應(yīng)的上層應(yīng)用程序相對(duì)于不采用封裝串口的驅(qū)動(dòng),代碼量要節(jié)省1/3的量。
關(guān)鍵詞:openSUSE;GSM模塊;SIM900A;字符設(shè)備驅(qū)動(dòng);串口
中圖分類(lèi)號(hào):TP311.52? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)27-0065-03
Abstract: The typical hardware architecture and Linux-based character driver module based on the SIM900A, which is widely used in small embedded devices, has been analyzed under openSUSE system. Then focused on the designing of the driver module, to improve the flexibility of the driver module to the deference of serial ports, a new command word SETPORTID has been introduced, which encapsulated the whole operation of serial port and made the apps more convenient to control the SIM900A through serial interface than the traditional Linux-based character driver. The test app of the AT commands indicates the driver module has an adaptability to different serial port parameters. The amount of codes, compared to apps without encapsulation of serial port, could get a decrease of 1/3.
Key words: openSUSE; GSM module; SIM900A; character device driver; serial interface
1 背景
OpenSUSE是著名Novell公司旗下的 Linux的發(fā)行版,發(fā)行量在歐洲占第一位。它采用的KDE4.3作為默認(rèn)桌面環(huán)境,同時(shí)也提供GNOME桌面版本。它的軟件包管理系統(tǒng)采用自主開(kāi)發(fā)的YaST,頗受好評(píng),其最新版本是13.2。它不僅是優(yōu)秀的桌面系統(tǒng),而且作為中小型企業(yè)服務(wù)器也是有十分的優(yōu)勢(shì)的。SIM900作為SIMCom專(zhuān)為中國(guó)市場(chǎng)設(shè)計(jì)的緊湊型無(wú)線(xiàn)模塊產(chǎn)品,屬于雙頻GSM/GPRS模塊, SIM900A采用工業(yè)標(biāo)準(zhǔn)接口,工作頻率為GSM/GPRS 900/1800MHz,可以低功耗實(shí)現(xiàn)語(yǔ)音、SMS、數(shù)據(jù)和傳真信息的傳輸。針對(duì)基于其Linux平臺(tái)的驅(qū)動(dòng)開(kāi)發(fā)進(jìn)行設(shè)計(jì),對(duì)其他延展設(shè)計(jì)具有參考意義。
2 系統(tǒng)構(gòu)架
本系統(tǒng)中,SIM900模塊采用ALientek公司的ATK-SIM900A-V15開(kāi)發(fā)板,在系統(tǒng)一端采用windows中用VMWare搭載openSUSE13.2的模式進(jìn)行,這樣做的好處是設(shè)計(jì)成本較低,整個(gè)系統(tǒng)框圖如圖1所示。
在該系統(tǒng)中,SIM900A開(kāi)發(fā)板和PC用串口相連,采用最簡(jiǎn)單的通訊方式[1],在PC端,利用虛擬機(jī)搭建起openSUSE環(huán)境,在配置openSUSE開(kāi)發(fā)環(huán)境時(shí),需要將Kernel開(kāi)發(fā)環(huán)境的相關(guān)包在安裝系統(tǒng)時(shí)就選擇好,否則需要在之后重新搭建。系統(tǒng)的工作過(guò)程為SIM900A模塊通過(guò)串口接受來(lái)自串口的AT指令,如果指令格式正確,則執(zhí)行,否則通過(guò)串口立即返回指令錯(cuò)誤的信息給上位windows主機(jī)。上位機(jī)接受來(lái)自人機(jī)接口的動(dòng)作,根據(jù)該動(dòng)作,構(gòu)建正確的AT指令,通過(guò)串口發(fā)送給SIM900A模塊,并等待來(lái)自串口的下位無(wú)線(xiàn)模塊的執(zhí)行結(jié)果,整個(gè)過(guò)程基本上采用應(yīng)答的方式進(jìn)行。
3 驅(qū)動(dòng)構(gòu)架
本系統(tǒng)驅(qū)動(dòng)構(gòu)架使用標(biāo)準(zhǔn)的Linux的字符驅(qū)動(dòng)模式[2][3]開(kāi)發(fā),在整個(gè)系統(tǒng)中的邏輯位置如圖2所示。
在系統(tǒng)中,本設(shè)計(jì)主要提供一個(gè)封裝上層應(yīng)用的具體需求為SIM900A的AT指令的過(guò)程,并將該指令通過(guò)串口發(fā)送給SIM900A模塊的過(guò)程。SIM900A的移動(dòng)通訊模塊的驅(qū)動(dòng)作為典型字符驅(qū)動(dòng)模式進(jìn)行開(kāi)發(fā),在驅(qū)動(dòng)構(gòu)架上,包含了兩個(gè)主要部分:串口控制和SIM900A字符流驅(qū)動(dòng)編寫(xiě),串口控制的流程[5][6]如圖3所示:
在串口的操作過(guò)程中,就是對(duì)/dev/tty0和/dev/tty1兩個(gè)文件的操作,在設(shè)置串口傳輸協(xié)議的參數(shù)時(shí),使用tcgetattr和tcsetattr進(jìn)行讀寫(xiě),一般而言,在設(shè)置時(shí),采用先讀后寫(xiě)的方式進(jìn)行,不需要調(diào)整的參數(shù)維持原先的值即可;而SIM900A的典型字符驅(qū)動(dòng)模式[2-4]的設(shè)計(jì),可以采用如圖4的流程進(jìn)行:
在SIM900A的驅(qū)動(dòng)的設(shè)計(jì)中,主要是需要將串口的讀寫(xiě)嵌入到字符設(shè)備驅(qū)動(dòng)的操作函數(shù)中去,在這里為了提供對(duì)串口號(hào)的靈活訪(fǎng)問(wèn),故提供一個(gè)設(shè)置串口端口號(hào)的IOCTL控制操作命令SETPORTID,若為0,則選擇tty0,若為1選擇tty1。而其他函數(shù)的設(shè)計(jì)完全是典型的字符設(shè)備函數(shù)的編寫(xiě)方式。有了上面的思路,就可以完成SIM900A的基于Linux的設(shè)計(jì)了。
4 驅(qū)動(dòng)實(shí)現(xiàn)
在此,實(shí)現(xiàn)SIM900A的字符設(shè)備驅(qū)動(dòng)設(shè)計(jì),需要進(jìn)行makefile和C源文件的編寫(xiě),makefile是自動(dòng)編譯規(guī)則文件[3]。
4.1 makefile的編寫(xiě)
在驅(qū)動(dòng)模塊中的makefile和應(yīng)用程序模塊中的makefile的最大的區(qū)別在于需要指定內(nèi)核編譯鏈接的目錄所在,在本次設(shè)計(jì)中,內(nèi)核編譯鏈接目錄用了openSUSE的/lib/modules/ 3.16.6-2-desktop /build,在進(jìn)行驅(qū)動(dòng)開(kāi)發(fā),編譯出的模塊所用的庫(kù)必須和目標(biāo)系統(tǒng)的內(nèi)核模塊的版本保持一致,否則內(nèi)核模塊的加載就會(huì)有問(wèn)題。下面就是本次設(shè)計(jì)的Makefile的內(nèi)容。
通過(guò)使用該makefile進(jìn)行模塊編譯,最終產(chǎn)生sim900a.ko的內(nèi)核驅(qū)動(dòng)模塊,可以采用insmod將該模塊加載到系統(tǒng)內(nèi)核中去。
4.2 字符驅(qū)動(dòng)關(guān)鍵結(jié)構(gòu)體和函數(shù)的設(shè)計(jì)舉例在各個(gè)函數(shù)的設(shè)計(jì)中,對(duì)于本用例特殊的函數(shù)時(shí)需要對(duì)串口進(jìn)行選擇和設(shè)置,為此,需要定義串口參數(shù)結(jié)構(gòu)體和SIM900A內(nèi)核控制的結(jié)構(gòu)體,這兩個(gè)結(jié)構(gòu)體的定義如下:
4.3 編譯
在完成以上編碼工作之后,就可以在終端窗口中,在驅(qū)動(dòng)文件目錄處用make命令編譯最終產(chǎn)生sim900a.ko,然后利用insmod命令加載之。
4.4 驅(qū)動(dòng)測(cè)試結(jié)果
在進(jìn)行該驅(qū)動(dòng)模塊的驅(qū)動(dòng)測(cè)試時(shí),應(yīng)用端的程序需要按照如下的順序進(jìn)行執(zhí)行編程處理:
1)找到設(shè)備驅(qū)動(dòng)在加載時(shí)創(chuàng)建的主設(shè)備號(hào);
2)用mknod創(chuàng)建名為“/dev/sim900a”的設(shè)備節(jié)點(diǎn);
3)在軟件程序中,調(diào)用的次序是先open該設(shè)備,然后調(diào)用ictl設(shè)置串口參數(shù)(如果是串口0,則在調(diào)用ictl時(shí),需要在串口參數(shù)的id號(hào)中傳遞0,否則傳遞1即可),然后進(jìn)行寫(xiě)操作(主要是AT命令[6]的字符串發(fā)送)和讀操作(sim900執(zhí)行相應(yīng)命令后的返回?cái)?shù)據(jù));
4)關(guān)閉設(shè)備。
5 結(jié)束語(yǔ)
本驅(qū)動(dòng)經(jīng)測(cè)試可以完成簡(jiǎn)單的AT命令[7]的發(fā)送和結(jié)果的接收,可以在SIM900A與系統(tǒng)的兩個(gè)不同串口連接后,簡(jiǎn)單調(diào)整應(yīng)用程序中的串口號(hào),就可以完成命令的接收和發(fā)送。如果需要進(jìn)一步完善,則需要對(duì)AT命令進(jìn)行分類(lèi)封裝。
參考文獻(xiàn):
[1] Michael R Sweet. Serial Programming Guide for POSIX Operating Systems[EB/OL]. 5th ed. http://digilander.libero.it/robang/rubrica/serial.htm#CONTENTS.
[2] 馮國(guó)進(jìn). Linux驅(qū)動(dòng)程序開(kāi)發(fā)實(shí)例[M]. 北京: 機(jī)械工業(yè)出版社, 2012: 13-25.
[3] 宋寶華. Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解[M]. 2版. 北京: 人民郵電出版社, 2010: 92-103.
[4] 付智華. Linux字符設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)[J]. 電腦知識(shí)與技術(shù), 2010, 6(15): 3941-3944.
[5] 龔建偉, 熊光明. visual c++/turbo c串口通信編程實(shí)踐[M]. 2版. 北京: 電子工業(yè)出版社, 2007: 168-195.
[6] 華清遠(yuǎn)見(jiàn)嵌入式培訓(xùn)中心. 嵌入式Linux應(yīng)用程序開(kāi)發(fā)標(biāo)準(zhǔn)教程[M]. 2版. 北京: 人民郵電出版社, 2009: 172-189.
[7] SIMcom. SIM900 AT Commands Set[Z]. 2010.
【通聯(lián)編輯:謝媛媛】