實驗七嵌入式系統(tǒng)驅(qū)動實驗資料_第1頁
實驗七嵌入式系統(tǒng)驅(qū)動實驗資料_第2頁
實驗七嵌入式系統(tǒng)驅(qū)動實驗資料_第3頁
實驗七嵌入式系統(tǒng)驅(qū)動實驗資料_第4頁
實驗七嵌入式系統(tǒng)驅(qū)動實驗資料_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

4、來,硬件設(shè)備只是一個設(shè)備文件,應(yīng)用程序可以像操作普通文件一樣對硬件設(shè)備進(jìn)行操作。 Linux下的設(shè)備驅(qū)動程序是內(nèi)核的一部分,運行在內(nèi)核模式。也就是說,設(shè)備驅(qū)動程序為內(nèi) 核提供了一個I/O接口,用戶使用這個接口實現(xiàn)對設(shè)備的操作。我們在這個實驗中主要是將驅(qū)動程序的 C文件交叉編譯后添加進(jìn)內(nèi)核,同時,在文件系統(tǒng)中添加驅(qū)動測試程序。最后 將生成的系統(tǒng)映像文件燒進(jìn)開發(fā)板中。對于驅(qū)動程序的使用, 有靜態(tài)編譯和動態(tài)編譯兩種, 靜態(tài)編譯指的是將驅(qū)動程序添加到 內(nèi)核中,動態(tài)編譯是指將驅(qū)動程序編譯成驅(qū)動模塊。我們采用第一種,即靜態(tài)編譯的方式添加驅(qū)動程序。驅(qū)動程序的開發(fā)步驟如下:1)首先,用戶在自己的驅(qū)動程序源文件

5、中定義file_operations結(jié)構(gòu),并編寫出設(shè)備需要的各種操作函數(shù),對于設(shè)備不需要的操作函數(shù)用NULL初始化,這些操作函數(shù)將被注冊到內(nèi)核。當(dāng)應(yīng)用程序?qū)ο鄳?yīng)的設(shè)備文件進(jìn)行操作時,內(nèi)核會找到相應(yīng)的操作函數(shù),并進(jìn)行調(diào)用。 如果操作函數(shù)使用 NULL,操作系統(tǒng)就進(jìn)行默認(rèn)的處理。2) 設(shè)備驅(qū)動程序編寫完成后,就可將其添加到linux內(nèi)核中,這需要修改linux的源碼, 然后重新配置編譯linux內(nèi)核。3) 編寫相應(yīng)的驅(qū)動測試程序,下載到 ARM板進(jìn)行相應(yīng)驅(qū)動的測試?!緦嶒灢襟E】1. 打開桌面上的虛擬機(jī)軟件VMware Workstation,用戶名為root,密碼為123456,即以超級用戶的身份

6、登錄。打開終端,學(xué)習(xí)一下Linux常用命令:# cd/切換到根目錄# cd dir切換到當(dāng)前目錄下的 dir目錄下# cd.切換到上一級目錄# Is顯示當(dāng)前目錄下的文件列表# vifile編輯文件file# tar xzvf file.tgz 將文件 file 解壓# rm file 刪除文件# rm -r dir刪除當(dāng)前目錄下叫dir的整個目錄# cp source target將文件source復(fù)制為target,可以指定文件路徑# cat file 查看file的內(nèi)容# mv file /dir將當(dāng)前目錄下的file文件移動到dir目錄下還有一些命令會在后面的使用中具體講解。2. 在終端

7、里進(jìn)入 /opt/FriendlyARM/Nano2410V2目錄下,其中有一個 kernel文件夾,這就是我們要操作的 LINUX的內(nèi)核。進(jìn)入kernel/drivers/char ,即內(nèi)核驅(qū)動的字符型設(shè)備驅(qū)動 文件夾,然后ls查看里面的文件列表,其中有一個super2410-leds.c文件,這是一個led驅(qū)動程序,但此程序需要修改才能適用于我們的ARM板。3. 輸入vi super2410-leds.c ,對此文件進(jìn)行編輯。 在vi編輯器里面默認(rèn)的是命令模式,鍵入i就進(jìn)入了編輯模式。程序里 led_table中定義了四個端口,我們將 GPIO_E13改為 GPIO_F7,即我們只對板子上

8、的LED2進(jìn)行操作。修改之后按Esc回到命令模式,然后輸入:wq保存退出。4. 打開kernel/drivers/char目錄下的 Makefile文件,即輸入 vi Makefile 。切換到編輯 模式,在第 199 行里輸入 obj-$(CONFIG_SUPER2410_LEDS) +=super2410-leds.o。按 Esc 鍵,輸入:wq保存退出。這一步操作時為了在編譯內(nèi)核時將super2410-leds.c編譯成super2410-leds.o 文件。HMtffliMjIiDsbZnoiZEricrtdkAJUirfZhtoM蜩僭*材鋤的向垃d血文件世)編揖査昏Y) 終端轉(zhuǎn)別()

9、 帝肋(H)bj-$( (IN* I (i_SYTttJ bK +- sync link ,oDbj-$(ClW-(;_NjrLC; *= n_hdlc.obj -$( OtTF I G_SPEC1 ALJ X. +- speciilix.oubj-$ CXhFIG IMA EOLTJN SERIAL. += amiseril.o obj -$ 1N- J j V .: ?_+= se r_a2232 gthe r ic_ser ia koobj-$( ( i N-1(. s.X += sx gtntr ic_ser ia I .o obj-$( Clhb 0: += r ic/r io .o

10、 gener ic_se r ia I . obj-$ ClhFI(j Sil SCI + sh-sc i .o gent? r ic_ser ii I .o obj -$( ClhF IG SFJI AL 167)+- seriall67.0obj - S f Nj J j MM-.J 4 / h仃+= gene r ic_se r ia I o rie_5cc .oobj -$: ( i N-1 . m J _s( i+= gene r jc_se r ia I .o vnr sec .obj-$( OOF 1 G B%E60CK SGC) += gener ic_xer ia I .o

11、vrre_scc .o obj-CCJbf I(j SERI r.V? 12+ gener ic_s(?r ia I . ser ii l_ tx3912 .ojb j - $ (OChF G_bhhCe410 A_ V3 _BUTTt NS * na no241 Oa _v2- bu I ton &. o objIG_NANQE4 WV2_.TX“: += s3c2410adc o Aj(WLS3Q4lO_iaXIaSENI += s3c24IO-ts .nodu lebj-$ OOFt G_s l.PEEU-11 n_Ll-1 fi +=supe r2410-led.osubtlir-l(

12、ClW- IG RIO) += r insubdir-$ (IN1 J11 M lrl += joys I ick即輸入vi Config.in。切換到編輯 Support Super2410Leds保存退出。這樣在運行 menuconfig5. 打開 kernel/drivers/char 目錄下的 Config.in 文件, 模式,在第 89 行里輸入 dep_tristate CONFIG_SUPER2410_LEDS,然后按 Esc 鍵,輸入:wq 配置字符設(shè)備時就會出現(xiàn)Support Super2410 Leds的字樣,如果選中并編譯通過,驅(qū)動程序就加到內(nèi)核中了。romIKg比/op

13、t/F肝陪1,訕辿 aiioL4 “小衛(wèi)/血川由芒型“艸扁卩CX1SF1G PC KEYBm0 編輯團(tuán)査看蘭)終端(D 轉(zhuǎn)到匹L)劑助(H) e Ibun 1 Eiiab le PS2 Keyboard Suppur l1bool EnabIe Smrt Gard Beider 0 Supporl hacI Enable Snarl Gt rd Reader 1 Suppor Iif 烏仃NHGJOiPEfUMNrAr = T -a aNlG_Z(KRO* = y】;lhen1 r i s (a le GniTTiT)dore A2232 ser ia I suppejr | ( KXIJER

14、J MLNIAI- QhFtG_A2232source dr ivers/set ia I/Config + in dep_t1 i s la le dep_tr islale drp_tr islale dep_tr istiteCH S3(410Support SuppQT t Suppor t Supporl(ibElG_SlP*R24 O_LF:OSButtons OOhF 11 OA_V2_BLTTOSAD Input U141 (;_NNIE410A_V2_AD(;Super2410 Leds1bhna24l(JA W.Ohfarw24lOA W.OTouchScrttn (IhH

15、)lIMfllinuxrc1rootBFriendlyARM /# cd /etc/rc,d/init +d/ HrootBFriendlyARM init + dltt Is1 httpd leds netdrootFriendlyARM init.dltt ./leds stopHrootFriendlyARM init.dltt _1 v L已連接 0:08:3 AHSIW115200 3-H-l15.進(jìn)入/sbin,查看文件列表會發(fā)現(xiàn)我們添加的驅(qū)動測試程序ledtest:-超級終瑞口叵區(qū)文件空編輯電)查看迪 呼叫心 倍送0)幫助QP 用商魯巫口 e ns* rootFr iendlyA

16、RM/etclH cd rootFriendlyARM/H Is sbin/ adjtinexifdownmad卩1日y armcomtestif upmakedevsB boaimagewritemkswap fdiskinetdmodboxH freeramdiskinitmodprobeI fsck.minixinsmodnameif ftpledpiuot_root gettylecbplayerpoweroff haltledtestreboot.hdparmloadkmaprmmodI hwclocklosetuprouteI ifconfiglsmodrunleuel Lroot

17、lricndlyARM/ttli 山.1IX.已連接 010: ABSItf115200.HVM .插打印rn fxD冷霽a dfi*ftpledpiuot_rootAlget tylecl-playerpoweroffhaltledtestreboothdparmloadkmdprmmodhwclocklosetuprouteifconfiglsmodrunleveltrootFriendlyARM/tt Is dev/memptmxbuttonsfb8consolefullmixerttycuaOh3600Ltsrawrandomttycualrootttycua2kmemnullttyd

18、spledsportsdalttyrootFriendlyARM/tt _二Il1V| 已連接 0:12:3t ANSIW115200 8-H-LJCRJDLL 1 CA首丨打印這時候我們進(jìn)行驅(qū)動程序的測試,輸入ledtest 1 1則點亮LED2 ,輸入ledtest 1 0則熄滅LED2。rtest -趙級終瑞叵文件編輯萱看電)呼叫)槎送 幫助魯 1-0 edfi*hwclocklosetuprouteifconfiglsmodrunlevelrootSFriendlyARM/1H Isdev/memptmxbuttonsfb0consolefullmixerttycua0h3600_ts

19、rawrandomttycualrootttycua2kmemnullttydspledsportsdalttyrootBFriendlyARM /1H ledtestUsage: ledsled_no011rootQFriendlyARM /tt ledtest 10rootFriendlyARM /Itt ledtest 11rootFriendlyARM/IttI l已連接 0:15:0c AHSIW115200 8-H-L丄ROLLI CA阪.m .孑首丨打印實現(xiàn)一個簡單的linux字符設(shè)備驅(qū)動步驟1:編寫驅(qū)動程序1. #in elude 2. #in elude 3. #in elu

20、de 4. #in elude 5. #in elude 6. #i nclude 7. #in elude 8. #in elude 9. #defi ne DEVICE_NAME cdev_zha ngwei10. int nu mber_of_devices = 1;11. struct edev mydev;12. dev_t dev = 0;13. char data128 = /0; / the data of my device14. struct class *myclass;15. static int mydev_open(struct inode *inode, stru

21、ct file *file)16. 17. pr_in fo(mydev driver ope n!/n ”);18. return 0;19. 20. static int mydev_release(struct inode *inode, struct file *file)21. 22. pr_i nfo(mydev driver released!/n);23. return 0;size_t count, loff_24. 25. ssize_t mydev_write(struct file *file, const char _user *buf, t *f_pos)26. 2

22、7.ssize_t ret = 0;28.pr_i nfo(mydev_write!/n);29.pr_in fo(writi ng %d bytes/n, coun t);30.if (count 127)31. return -ENOMEM;32. if (cou nt 0)33. return -EINVAL;34. if (copy_from_user(data, buf, coun t) 35. ret = -EFAULT;36. 37. else 38. data127 = ”/0”;39. pr_in fo(ker nel received: %s/n,data);40. ret

23、 = count;41. 42. return ret;43. len ,loff_t* off)44. static ssize_t mydev_read(struct file* filp, char * buf, sizej45. 46. if( copy_to_user(buf,data,le n)47. 48. return -EFAULT;49. 50.50. return len;51. 52. struct file_operati ons mydev_fops = 53. .ow ner = THIS_MODULE,54. .ope n = mydev_ope n,55. .

24、read = mydev_read,56. .write = mydev_write,57. .release = mydev_release59.58. ;59. static int _in it mydev_i nit(void)60. 61. int result, error;62. result = register_chrdev(O, DEVICE_NAME, & mydev_fops);63. pr_in fo(udev_cdev: get major nu mber: %d/n, result);64. dev = MKDEV(result, 0);65. myclass =

25、 class_create(THIS_MODULE, mydev_class);66. device_create(myclass, NULL, dev, NULL, DEVICE_NAME);67. return 0;68. 69. static void _exit mydev_exit(void)70. 71. cdev_del(&m ydev);72. un register_chrdev_regi on( dev, nu mber_of_devices);73. device_destroy(myclass, dev);74. class_destroy(myclass);75. pr_i nfo(Goodbye cdev!/n);76. 77. modulen it(mydev_i nit);78. module_exit(mydev_exit);79. MODULE_LICENSE(GPL);80. MODULE_DESCRIPTION(Simple cdev udev driver test);步驟2 :編譯,

溫馨提示

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

評論

0/150

提交評論