試驗(yàn)七嵌入式系統(tǒng)驅(qū)動(dòng)試驗(yàn)資料_第1頁(yè)
試驗(yàn)七嵌入式系統(tǒng)驅(qū)動(dòng)試驗(yàn)資料_第2頁(yè)
試驗(yàn)七嵌入式系統(tǒng)驅(qū)動(dòng)試驗(yàn)資料_第3頁(yè)
試驗(yàn)七嵌入式系統(tǒng)驅(qū)動(dòng)試驗(yàn)資料_第4頁(yè)
試驗(yàn)七嵌入式系統(tǒng)驅(qū)動(dòng)試驗(yàn)資料_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余8頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、實(shí)驗(yàn)七ARM9嵌入式系統(tǒng)硬件驅(qū)動(dòng)基礎(chǔ)開(kāi)發(fā)實(shí)驗(yàn)【實(shí)驗(yàn)?zāi)康摹? .掌握嵌入式linux內(nèi)核的配置編譯及移植。2 .掌握ARMlinux驅(qū)動(dòng)程序的開(kāi)發(fā)流程。【實(shí)驗(yàn)內(nèi)容】1 .常用linux命令的使用2 .嵌入式linux驅(qū)動(dòng)程序開(kāi)發(fā)步驟3 .linux內(nèi)核配置、編譯以及移植【實(shí)驗(yàn)設(shè)備】1 .ARM9開(kāi)發(fā)板2 .串口線、USB線3 .PC機(jī)(軟件:VMwareWorkstation6.5)【實(shí)驗(yàn)原理】嵌入式Linux是以Linux為基礎(chǔ)的嵌入式作業(yè)系統(tǒng),它被廣泛應(yīng)用在移動(dòng)電話、個(gè)人數(shù)字助理(PDA)、媒體播放器、消費(fèi)性電子產(chǎn)品以及航空航天等領(lǐng)域中。Linux是開(kāi)放源代碼的操作系統(tǒng),同時(shí)具有體積小、執(zhí)行

2、速度快、較好的可裁剪性與移植性等特點(diǎn)。針對(duì)ARMCPU開(kāi)發(fā)的具有MMU(MemoryManagementUnit)功能的嵌入式Linux操作系統(tǒng)是ARM平臺(tái)上操作系統(tǒng)的最佳選擇。通用的基于ARM系統(tǒng)的Linux開(kāi)發(fā)步驟如下:1)開(kāi)發(fā)目標(biāo)硬件系統(tǒng):如選擇微處理器,F(xiàn)lash及其他外設(shè)等;2)建立交叉編譯工具:一般的GCC工具都是針對(duì)X86體系的,為了能夠生成目標(biāo)板可執(zhí)行的代碼必須建立交叉編譯工具;3)開(kāi)發(fā)Bootloader:建立啟動(dòng)系統(tǒng)的主引導(dǎo)程序;4)移植Linux內(nèi)核:如基于ARM的Linux2.4內(nèi)核移植;5)開(kāi)發(fā)一個(gè)根文件系統(tǒng):如yaffs文件系統(tǒng)的制作;6)開(kāi)發(fā)相關(guān)硬件的驅(qū)動(dòng)程序:如

3、LCD、Keypad等;7)開(kāi)發(fā)上層的應(yīng)用程序:如QTGUI開(kāi)發(fā)。驅(qū)動(dòng)程序的目的一般式驅(qū)動(dòng)硬件正常工作,所以通常所說(shuō)的驅(qū)動(dòng)程序都是針對(duì)特定的硬件來(lái)編寫(xiě)的。驅(qū)動(dòng)程序既可以工作在有操作系統(tǒng)的環(huán)境下,也可以工作在無(wú)操作系統(tǒng)的環(huán)境中。通常在做一些簡(jiǎn)單的硬件控制時(shí),由于功能比較單一,不需要操作系統(tǒng)來(lái)管理,所以針對(duì)這種情況下的驅(qū)動(dòng)程序相對(duì)來(lái)說(shuō)也比較簡(jiǎn)單,但是作為一個(gè)嵌入式系統(tǒng),他要實(shí)現(xiàn)的任務(wù)也相對(duì)比較多,比較復(fù)雜,所以需要有操作系統(tǒng)來(lái)對(duì)他進(jìn)行管理。設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和及其硬件之間的接口。設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的細(xì)節(jié),這樣在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以像操作普通文件

4、一樣對(duì)硬件設(shè)備進(jìn)行操作。Linux下的設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,運(yùn)行在內(nèi)核模式。也就是說(shuō),設(shè)備驅(qū)動(dòng)程序?yàn)閮?nèi)核提供了一個(gè)I/O接口,用戶使用這個(gè)接口實(shí)現(xiàn)對(duì)設(shè)備的操作。我們?cè)谶@個(gè)實(shí)驗(yàn)中主要是將驅(qū)動(dòng)程序的C文件交叉編譯后添加進(jìn)內(nèi)核,同時(shí),在文件系統(tǒng)中添加驅(qū)動(dòng)測(cè)試程序。最后將生成的系統(tǒng)映像文件燒進(jìn)開(kāi)發(fā)板中。對(duì)于驅(qū)動(dòng)程序的使用,有靜態(tài)編譯和動(dòng)態(tài)編譯兩種,靜態(tài)編譯指的是將驅(qū)動(dòng)程序添加到內(nèi)核中,動(dòng)態(tài)編譯是指將驅(qū)動(dòng)程序編譯成驅(qū)動(dòng)模塊。我們采用第一種,即靜態(tài)編譯的方式添加驅(qū)動(dòng)程序。驅(qū)動(dòng)程序的開(kāi)發(fā)步驟如下:1)首先,用戶在自己的驅(qū)動(dòng)程序源文件中定義file_operations結(jié)構(gòu),并編寫(xiě)出設(shè)備需要的各種操作函

5、數(shù),對(duì)于設(shè)備不需要的操作函數(shù)用NULL初始化,這些操作函數(shù)將被注冊(cè)到內(nèi)核。當(dāng)應(yīng)用程序?qū)ο鄳?yīng)的設(shè)備文件進(jìn)行操作時(shí),內(nèi)核會(huì)找到相應(yīng)的操作函數(shù),并進(jìn)行調(diào)用。如果操作函數(shù)使用NULL,操作系統(tǒng)就進(jìn)行默認(rèn)的處理。2)設(shè)備驅(qū)動(dòng)程序編寫(xiě)完成后,就可將其添加到linux內(nèi)核中,這需要修改linux的源碼,然后重新配置編譯linux內(nèi)核。3)編寫(xiě)相應(yīng)的驅(qū)動(dòng)測(cè)試程序,下載到ARM板進(jìn)行相應(yīng)驅(qū)動(dòng)的測(cè)試。【實(shí)驗(yàn)步驟】1.打開(kāi)桌面上的虛擬機(jī)軟件VMwareWorkstation,用戶名為root,密碼為123456,即以超級(jí)用戶的身份登錄。打開(kāi)終端,學(xué)習(xí)一下Linux常用命令:# cd/切換到根目錄# cddir切換到

6、當(dāng)前目錄下的dir目錄下# cd.切換到上一級(jí)目錄# ls顯示當(dāng)前目錄下的文件列表# vifile編輯文件file# tarxzvffile.tgz將文件file解壓# rmfile刪除文件# rmfrdir刪除當(dāng)前目錄下叫dir的整個(gè)目錄# cpsourcetarget將文件source復(fù)制為target,可以指定文件路徑# catfile查看file的內(nèi)容# mvfile/dir將當(dāng)前目錄下的file文件移動(dòng)到dir目錄下還有一些命令會(huì)在后面的使用中具體講解。2 .在終端里進(jìn)入/opt/FriendlyARM/Nan02410V2目錄下,其中有一個(gè)kernel文件夾,這就是我們要操作的LI

7、NUX的內(nèi)核。進(jìn)入kernel/drivers/char,即內(nèi)核驅(qū)動(dòng)的字符型設(shè)備驅(qū)動(dòng)文件夾,然后ls查看里面的文件列表,其中有一個(gè)super2410-leds.c文件,這是一個(gè)led驅(qū)動(dòng)程序,但此程序需要修改才能適用于我們的ARM板。3 .輸入visuper2410-leds.c,對(duì)此文件進(jìn)行編輯。在vi編輯器里面默認(rèn)的是命令模式,鍵入i就進(jìn)入了編輯模式。程序里led_table中定義了四個(gè)端口,我們將GPIO_E13改為GPIO_F7,即我們只對(duì)板子上的LED2進(jìn)行操作。修改之后按Esc回到命令模式,然后輸入:wq保存退出。4 .打開(kāi)kernel/drivers/char目錄下的Makefi

8、le文件,即輸入viMakefile。切換到編輯模式,在第199行里輸入obj-$(CONFIG_SUPER2410_LEDS)+=super2410-leds.o。按Esc鍵,輸入:wq保存退出。這一步操作時(shí)為了在編譯內(nèi)核時(shí)將super2410-leds.c編譯成super2410-leds.o文件。四,11口:j1129讓/“WEriertd卜AfjM/、自im)1;11V2/kernel/'inve:r</<har文件®嵋耨®查看<Y>外端3轉(zhuǎn)到(&)幫助®obj-$,(jfsb(._SYXL1+=syncIink,o

9、obj-'HlW'lGbUrLC;+=n_hdlc.oobj-$':ClIC;_SPECIALIX+-specially.oubj-$'CXhFIGIMGEOLUNSERIAL.+=占miserial.口obj<1N-J<jV.:?_+=ser_a2232gtheric_seriaL(jobj-$(N-1(,s.X+=sxgtntric_seriaI.oobj-$(Clhb0:+=rio/rio.ogeneric_seriaI.obj-$ClhFI(jSilSCI+sh-sci.ogent?ric_seriiI.oobj-$(ClhFIGSFJ(IA

10、L167)+-riall67Mobj-S'<fNjJ<jMM.J4/+=gencric_seriaI.orie_5cc.oobj-5':(N-1<.lI'J_s(i+=generic_seriaI.ovnrsec.obj-$(OOF1GB%6000SGC)*=generic_xeriaI.ovrre_scc.oobjCCJbfI(jSERIr.V?12+-generic_s(?riaI.seriil_tx3912.o<jbj-$(OChFG_bhhCe410A_V3_BUTTtNS+-nano241Oa_v2-buIton&.oobjmM

11、lG_NANQE41i)A_V2_.TB"+=s3c2410adc»o(jbj-*UNlG_"i14】i)_Tl"H11HEh、;+=s3c24IO-ts.noduIeobj-$(aN-G_SLPEEUHn.LHh+=supe310-ledsubdir-lKlW'IGRIO)+=3subdir-$,(IN丈件(E)褊輯(E)宜看我)碧端轉(zhuǎn)到恬叫11:eIsebun'EnablePS2KeyboardSupportFOCbf1GPC_KET1flbodJ.EnableSitar)(且rdReader0SupporL'CI1SFIG_

12、Tit172bool'EnableSrwrICardReaderISupport'CXFIG.ITai72_SCR1fiif”口NHGJOiPE陽(yáng)MMAT=H-a*$GtN【G_"KRO*='/;ihertrs(aleGniTnr)doreA2232seriaI$upp<jItKXFERI城NrAL廠QhF【G_A2232sourcedrivers/serial/Cbiifig+indep.trisiaie'SupportSuper24Ui(XbEIG_SlPKR240_U-r6dep_trisiate'Supportlno241

13、7;AV2J)Buttons1(IN-'IG_ISftME410_W/rribSdep_trislate'Supportlno24lDAV2J)ADInput'ClN-'I(;_NME410A_W_ADCdep_tristaie'SupportS3(21i)TouchScrcenQ2,IG_E3c2410_TQJCHi(W:EN$QNnG_R<B_S3C24106.返回到/kernel目錄下面,輸入makemenuconfig,進(jìn)行內(nèi)核的配置。首先找到Characterdevices,回車進(jìn)入,找至USupportSuper2410Leds(NEW

14、),鍵入空格選中此項(xiàng)。J11】7LU+=joysIick5.打開(kāi)kernel/drivers/char目錄下的Config.in文件,即輸入viConfig.in。切換到編輯模式,在第89行里輸入dep_tristateSupportSuper2410Leds'CONFIG_SUPER2410_LEDS,然后按Esc鍵,輸入:wq保存退出。這樣在運(yùn)行menuconfig配置字符設(shè)備時(shí)就會(huì)出現(xiàn)SupportSuper2410Leds的字樣,如果選中并編譯通過(guò),驅(qū)動(dòng)程序就加到內(nèi)核中了。ror把理#當(dāng)h嶗L,也pt/F出用出力RN/SanoJ4H1VE/kermdrTvcjdMr然后返回上一

15、級(jí),進(jìn)入Generalsetup,在TimerandCPUusageLEDS上鍵入空格,取消選中。如果選中則兩個(gè)LED分別用于Timer和CPU,我們的測(cè)試程序?qū)⒖床坏叫Ч试诖颂帉⑵淙∠H缓蟊4嫱顺觯@時(shí)可以進(jìn)行LINUX內(nèi)核的編譯了。7 .在終端里輸入makedep,這一步僅僅在第一次編譯時(shí)需要,為的是編譯時(shí)內(nèi)核知道文件之間的依賴關(guān)系;輸入makeclean,該命令用于清除以前編譯內(nèi)核時(shí)生成的所有目標(biāo)文件、模塊文件和臨時(shí)文件;輸入makezImage,即將內(nèi)核編譯成gzip壓縮形式的image。編譯通過(guò)后會(huì)在目錄kernel/arch/arm/boot下生成zImage內(nèi)核文件。8 .

16、編譯好之后,我們查看kernel/drivers/char目錄會(huì)看到super2410-leds.o文件,如果沒(méi)有則我們的LED驅(qū)動(dòng)程序沒(méi)有加入到內(nèi)核。另一種方法是在終端里kernel目錄下輸入catSystem.map|grepleds,如果有matrix4_leds_init、matrix4_leds_ioctl、matrix4_leds_fops(這幾個(gè)是super2410-leds.c文件里的函數(shù))等,則表明驅(qū)動(dòng)已經(jīng)正確地加入到了內(nèi)核。Iinux-ubjcopy-Obinary-R.nole-R.CDrmentScoiipicsscd/vmJinuxzJinigcrmkefl:Leav

17、ingdireclury/opl/FriendNiiiq241OW/kerueI/arch/arn/buuiIhostkerneJflcaISyslemti&pgrepled$cOOlOOrMc00lel6ScOOcactOcOOcuf24cOOcb474c01cfc44cOldlOacc020d31cTTTtdinstrix4_kds_in11_initca1l_m)triK_leds_inilIcdstjtctled*Heregititei-lfdsmatrix4_kdn_io11kdstatcnulrix4_lcJi_fopsk111tI$9 .將zImage文件拷貝到/mnt/

18、hgfs/share文件夾里,則在windows下我們可以獲得此文件。下面進(jìn)行驅(qū)動(dòng)測(cè)試程序的操作。10 .在虛擬機(jī)的/opt/FrindlyARM/Nan02410V2/examples找到leds文件夾,里面有兩個(gè)文件,main.c是led的測(cè)試程序,Makefile是用來(lái)指明編譯main.c文件時(shí)要用的編譯器。在終端里進(jìn)入此文件夾,輸入make后在該文件下生成一個(gè)二進(jìn)制程序led。將其重命名為ledtest,拷貝至U/opt/FriendlyARM/Nan02410V2/root_qtopia_tp/sbin下。這個(gè)root_qtopia_tp文件夾是我們板子所使用的文件系統(tǒng)。一一一一11

19、 .將root_qtopia_tp文件夾拷貝到/opt/FriendlyARM/Nan02410V2/mkyaffs文件夾下,在終端里進(jìn)入此文件夾,輸入命令./mkyaffsimageroot_qtopia_tptest.img。執(zhí)行完后在mkyaffs文件夾下會(huì)生成test.img文件,這是我們要下載到ARM板子上的文件系統(tǒng)映像文件。12 .將前面的zImage和test.img文件下載到ARM板,然后重新啟動(dòng),通過(guò)windows主機(jī)的超級(jí)終端進(jìn)行驅(qū)動(dòng)程序的測(cè)試。13 .在windows主機(jī)下,打開(kāi)開(kāi)始-程序-附件-通訊-超級(jí)終端,輸入自定義的名稱,選擇COM口(默認(rèn)COM1即可),端口設(shè)置

20、如下圖:r?fxC0I1屬性將ARM板上面的COM0和主機(jī)的串口用串口線連接,上電后會(huì)在超級(jí)終端里看到啟動(dòng)信息,當(dāng)出現(xiàn)"PleasepressEntertoactivethisconsole”時(shí)鍵入回車進(jìn)入操作系統(tǒng),如下圖此時(shí)可以通過(guò)超級(jí)終端控制我們的ARM板了。/etc/rC.d/init.d下面的leds。輸14 .這時(shí)候可以看到LED2在閃爍,其控制程序是入./ledsstop后,則此程序被結(jié)束,LED不再閃爍。0tewt-超級(jí)終襦回叵區(qū)文件®編輯也)查看9呼叫©傳送建)幫助QJ)口備因亞口a齒IerverversionBoa/0.9.13ll/Jan/20

21、31:15:58:04-000O1boa:serverbuiltFeb28211/Jan/2031:15:58:04*0000boa:startingserverpid=3ro0tFriendlyARM/-15linuxrcshanghaitan.mp3|rootFriendlyARM/#cd/etc/rc,d/init+d/rootFriendlyARMinit.dl#IshttpdledsnetdrootFriendlyARMinitidl#./led*stoprootFriendlyARMinit.dltt_一T三一.I2已隹接0:08:3£AHSIW1.152003-H-l1

22、5 .進(jìn)入/sbin,查看文件列表會(huì)發(fā)現(xiàn)我們添加的驅(qū)動(dòng)測(cè)試程序ledtest:7test-超綴終端nix文件)編輯更)查看過(guò))呼叫©傳送建)幫助QP口比容避口e甯rootFriendlyRRMroot0FriendlyARMadjtimexarmcomtestboafdiskfreeramdiskfsck.minixftpgettyhalthdparmhwclockifconfig已連搔0:10:2ABSItf1152008-»-1/etc!#cd/HIssbin/ifdownifupimagewriteinetdinitinsmodledled-playerledtest

23、loadkmaplosetupIsmod/«madplamakedevsmkswapmodboxmodprobenameifpiuot_rootpoweroffrebootrmmodrouterunleuelrootFriendlyARM進(jìn)入/dev會(huì)看到我們加入內(nèi)核的驅(qū)動(dòng)leds(驅(qū)動(dòng)程序super2410-leds.c中定義的驅(qū)動(dòng)名稱為leds),如下圖:這時(shí)候我們進(jìn)行驅(qū)動(dòng)程序的測(cè)試,輸入ledtest11則點(diǎn)亮LED2,輸入ledtest10則熄滅LED2。空七e耳七-超級(jí)終襦回叵區(qū)文件®編輯堡)查看9呼叫©傳送建)幫助©)hwclockifcon

24、figrootFriendlyARMlosetupIsmodrouterunlevel1sdev/membuttonsconsolecua0cualcua2dspfb0fullh3600tsrawmixerptmxrandomrootkmemledsrootFriendlyARM/1HUsage:ledsled_no011nullportledtestsdalttyttyttyttyttyrootFriendlyARM/Hledtest10rootFriendlyARM/ttledtest11rootFriendlyARM/#,心2已連接0:15:0AHSIW1.152003-H-1實(shí)現(xiàn)一個(gè)簡(jiǎn)

25、單的linux字符設(shè)備驅(qū)動(dòng)步驟1:編寫(xiě)驅(qū)動(dòng)程序1. #include<linux/module.h>2. #include<linux/init.h>3. #include<linux/kernel.h>4. #include<linux/cdev.h>5. #include<linux/fs.h>6. #include<linux/kdev_t.h>7. #include<asm/uaccess.h>8. #include<linux/device.h>9. #defineDEVICE_NAME&

26、quot;cdev_zhangwei”10. intnumber_of_devices=1;11. structcdevmydev;12. dev_tdev=0;13. chardata128="/0"/thedataofmydevice14. structclass*myclass;15. staticintmydev_open(structinode*inode,structfile*file)16. 17. pr_info("mydevdriveropen!/n");18. return0;19. 20. staticintmydev_releas

27、e(structinode*inode,structfile*file)21. 22. pr_info("mydevdriverreleased!/n");23. return0;24. 25. ssize_tmydev_write(structfile*file,constchar_user*buf,size_tcount,loff_t*f_pos)26. 27. ssize_tret=0;28. pr_info("mydev_write!/n");29. pr_info("writing%dbytes/n",count);30.

28、if(count>127)31. return-ENOMEM;32. if(count<0)33. return-EINVAL;34. if(copy_from_user(data,buf,count)35. ret=-EFAULT;36. 37. else38. data127=”/0”;39. pr_info("kernelreceived:%s/n”,data);40. ret=count;41. 42. returnret;43. 44. staticssize_tmydev_read(structfile*filp,char*buf,size_tlen,loff

29、_t*off)45. 46. if(copy_to_user(buf,data,len)47. 48. return-EFAULT;49. 50.51. returnlen;52. 53. structfile_operationsmydev_fops=54. .owner=THIS_MODULE,55. .open=mydev_open,56. .read=mydev_read,57. .write=mydev_write,58. .release=mydev_release59.60. ;61. staticint_initmydev_init(void)62. 63. intresult

30、,error;64. result=register_chrdev(0,DEVICE_NAME,&mydev_fops);65. pr_info("udev_cdev:getmajornumber:%d/n",result);66. dev=MKDEV(result,0);67. myclass=class_create(THIS_MODULE,"mydev_class");68. device_create(myclass,NULL,dev,NULL,DEVICE_NAME);69. return0;70. 71. staticvoid_exi

31、tmydev_exit(void)72. 73. cdev_del(&mydev);74. unregister_chrdev_region(dev,number_of_devices);75. device_destroy(myclass,dev);76. class_destroy(myclass);77. pr_info("Goodbyecdev!/n");78. 79. module_init(mydev_init);80. module_exit(mydev_exit);81. MODULE_LICENSE("GPL");82. MODULE_DESCRIPTION("Simplecdevudevdrivertest");步驟2:編譯

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論