




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、PAGE PAGE 16ARM9外外接晶片讀讀寫的驗証証-以82255為範範例外接82555主要目目的是透過過位址線及及資料線做做外接晶片片讀寫的驗驗証。ARRM9可透透過如圖11所示的轉轉接訊號線線擴充其他他的晶片功功能。圖1. AARM-99的轉接訊訊號線解碼位址圖2代表AARM-99的外接記記憶體解碼碼位址分佈佈,共分88個區段(bankk)。這些些區段分別別由nGCCS0-nnGCS77來解碼,每每個區段(bankk)共有1128 MMB的記憶憶體空間。 Bank00及Bannk1分別別由快閃記記憶體(FFlashh memmory)及隨機讀讀取記憶體體(SDRRAM)所所佔用。BBa
2、nk22的解碼致致能線nCCGS2位位於透過AARM-99發展板轉轉接槽的第第34個接接腳,如圖圖1所示。nCGSS2解碼位位址分佈於於0 x1000000000-00 x1800000000,如圖圖2所示。圖2. nnGCS22的解碼位位址分佈圖3中ARRM9的記記憶體區段段(Bannk)的解解碼線nGGCS2接接82555的/CSS;(A11, A00)分別接接82555的(A11, A00);DAATA7-DATAA0分別接接82555的D7-D0,如如圖3所示示。所以88255的的(PORRTA, PORTTB, PPORTCC, CTTL)的寫寫入位址定定義如下:PORTAA=0 x
3、1100000000;PORTBB=0 x1100000001;PORTBB=0 x1100000002;CTL=00 x1000000003;圖3. 88255與與ARM-9的連接接方法ARM-99的資料線共有有32位元元(DATTA31-DATAA0)。然然而外接記記憶體(或或I/O)可規劃為為8位元、16位元元及32位位元共三種種模式。究究竟選擇那那種模式,可可透過規劃劃BWSCCON暫存存器的內容容來決定。BWSCCON暫存存器的位址址為0 x4800000000。規劃劃Bankk2的外接接記憶體(或I/OO) 資料線讀寫寫位元數為88位元,可可規劃BWWSCONN暫存器的的(bitt
4、9, bbit8)為00,如如圖4所示示。程式規規劃的參考考方法如下下圖4. BBWSCOON暫存器器的bitt10-bbit0所所規劃的功功能ARM-99外接記憶憶體(或II/O)的的讀寫時序序如圖6所所示。圖66中讀寫的的各項時間間參數(TTacs, Tcoos, TTacc, Taccp, TTcoh, Tcaah)可由由BANKKCONxx暫存器(x=0,1.55)來調整整。BANNKCONN2暫存器器的位址為為0 x488000000c,如如圖5所示示。圖5. BBANKCCON2暫暫存器的位位址圖6. AARM-99外接記憶憶體(或II/O)的的讀寫時序序8255驅驅動程式之之建立
5、在Linuux核心中中,驅動程程式扮演特特殊的黑黑盒子角角色,它們們能駕馭硬硬體裝置,並並且隱藏硬硬體的實際際作業細節節,使硬體體的回應方方式符合一一組嚴謹規規定的程式式介面,讓讓應用程式式能透過一一套標準化化的系統呼呼叫來間接接操作硬體體。以實際際的硬體動動作來實現現系統呼叫叫所定義的的功能,正正是驅動程程式所扮演演的角色。由於系統統呼叫這層層軟體介面面的存在,使使得驅動程程式與核心心的其餘部部分可以分分開製作,並並且在需要要時,才在在執行期將將驅動程式式安插到核心裡裡。這種模模組化的設設計,不僅僅降低了LLinuxx驅動程式式的設計難難度,也使使得核心不不必為了支支援新硬體體而頻頻改改版。
6、裝置驅動程程式大致分分為區塊驅驅動程式、字元驅動動程式及網網路介面驅驅動程式。區塊驅動動程式是以以固定大小小長度來傳傳送轉移資資料,且大大致是可以以隨機存取取資料的設設備,如硬硬碟機或光光碟機;字字元裝置是是可被當成成一連串位位元組(串串流)來存存取的裝置置,也就是是說這類裝裝置的存取取方式就像像檔案一樣樣。字元裝裝置驅動程程式的主要要任務,正正是實現這這種行為。這類驅動動程式至少少會實作四四項系統呼呼叫,分別別是opeen()、closse()、readd()和wwritee()。我我們所熟悉悉的操控臺臺與序列埠埠(/deev/coonsolle、/ddev/tttyS00),就是是典型的字
7、字元裝置,因因為它們都都可順利化化身成串串流。字字元裝置必必須透過檔檔案系統節節點(fiilesyystemm nodde)來存存取;檔案案系統節點點俗稱為裝裝置檔(ddevicce fiile),例例如/deev/ttttyS00、/deev/coonsolle。字元元裝置與一一般正常檔檔案之間的的最大差異異,是一般般檔案容許許你任意改改變存取點點(檔案指指標),但但字元裝置置大部分都都只是資料料通道,只只能被循序序存取。1 模組程程式的基本本觀念一個驅動程程式必須被被撰寫成模模組的型態態,才能夠夠具備供使使用者載入入與移除的的特性。因因此一個驅驅動程式必必然會具有有載入模組組函式與移移除模
8、組這這兩個函式式。故此兩兩個函式就就分別載入入驅動程式式與移除驅驅動程式的的角色。應用程式在在啟動之後後,從頭到到尾都只執執行同一件件任務。另另一方面,模模組在被載載入核心之之後,必須須先向核心心註冊它自自己,以便便服務未來來的reqquestt,而其”mainn”函式這時時候就立即即結束了。換言之,iinit_moduule( ) 函式式 (模組組的入口) 的任務務,是將模模組的功能能 (函式式) 準備備好,使這這些功能可可在事後被被調用。模模組的第二二個入口點點是 clleanuup_moodulee ( ),它在模模組被卸載載之前會被被叫用一次次,其作用用就是告訴訴核心:我要離開開了,別
9、再再叫我做任任何事。圖7描繪模組組如何利用用函式呼呼叫與函式指標標,將新新功能加到到運行中的的核心。應應用程式則則是在使使用者空間間(usser sspacee) 內運運作。每當當應用程式式發出系統統呼叫,或或是發生硬硬體中斷時時,LINNUX便會會將執行模模式從usser-sspacee切換到kkerneel-sppace。驅動程式式碼必須在在kernnel-sspacee內運作。圖7 將模模組連結至至核心 2主標號(Majoor nuumberr)與次標標號(Miinor numbber) 當使用者要要存取字元元裝置時,必必須透過檔檔案系統裡裡的代表名名稱,這些特殊殊檔是集中中在 /dde
10、v/目目錄之下。使用指令令ls-l /devv得到如圖88的結果??煽闯鲈谠谌掌跈谥翱梢园l發現兩個以以逗號隔開開的數值,在在逗號左方方的數值是是該裝置檔檔的主編編號(mmajorr nummber),而而逗號右方方的數值是是次編號號(miinor numbber)。主編號號代表裝裝置所配合合驅動程式式。當核心心收到oppen( )系統呼呼叫時,就就是依據主編號來選擇驅驅動程式。另一方面面,次編編號的意意義只有驅驅動程式自自己才知道道,核心會會將使用者者給定的次次編號轉交交給驅動程程式,核心心本身用不不到次編號號。一般而而言,驅動動程式以次次編號來辨辨識同類裝裝置的個體體。圖8主編編號與次標
11、標號要增加一個個新驅動程程式到系統統,等於指指派一個主主編號給它它。這項指指派應該在在驅動程式式(模組)的的初使期,藉藉由呼叫linuux/fss.h 所定義的的regiisterr_chrrdev( )函式式來完成:int rregisster_chrddev(uunsiggned int majoor, cconstt chaar *nname, strruct filee_opeeratiion *fopss);此函數的傳傳回值代表表註冊動作作的成功與與否。負值值表示失敗敗,0或正正值表示成成功。maajor引引數是驅動動程式想要要註冊的主主標號;nname是是裝置的名名稱(如果果註冊成
12、功功,這名稱稱將會出現現在 /pproc/deviices檔檔案的內容容裡);ffops是是一個指標標,指向一一個函式式指標陣列列(arrraryy of funcctionn poiinterrs),此此陣列紀錄錄了驅動程程式各個入入口點(作作業方法)的的位置。在驅動程式式向核心完完成了註冊冊之後,驅驅動程式的的各項作作業方法(opeeratiion)就就與給定的的主編號產產生了關連連性。每當當有人對字字元裝置檔檔進行某項項操作時,核核心就能從從該裝置檔檔的主編號號找出對應應的驅動程程式,並透透過其fiile_ooperaationns結構來來呼叫對應應的作業方方法。下一一個問題是是如何給應
13、應用程式一一個名稱,讓讓它們能利利用此名稱稱來啟動驅驅動程式。這個名稱稱必須安插插在 /ddev/ 目錄下,而而且必須關關連到驅動動程式的主主編號與次次編號。在在檔案系統統製作節點點的命令是是mknood,你必必須有特權權身分(rroot)才才能使用此此工具。mmknodd至少需要要四個參數數,例如:mknodd /deev/c88255_drivver cc 42 0第一個引數數是節點名名稱,其後後的三個引引數分別是是裝置類型型(c代表表charr devvice)、主編號、以及次編編號。就像像任何儲存存在磁碟上上的普通檔檔案一樣,mmknodd所產生的的裝置節點點會被保存存下來,除除非刻意
14、用用rm命令令刪除它們們。我們在在驅動程式式主程式中中做以下定定義及宣告告:#defiineCHDRRV_MAAJOR42char CHDRRV_NAAME = c82555_drriverr;而我們系統統實作時的的驅動程式式註冊的動動作是在一一個iniit_moodulee程式中實實現:int iinit_moduule(vvoid)if(rregisster_chrddev(CCHDRVV_MAJJOR, CHDRRV_NAAME, &c82255_cchdrvv_fopps) priintk(kerrnel: %s: Unaable to rregisster charracteer d
15、eeviceen, CHDDRV_NNAME);retturn -EIOO;在模組被卸卸載之前,它它必須先釋釋放主標號號,而這個個動作可由由unreegistter_cchrdeev( ) 完成,我我們在模組組的清理函函式裡呼叫叫它:void cleaanup_moduule(vvoid)unreggisteer_chhrdevv(CHDDRV_MMAJORR, CHHDRV_NAMEE);printtk(uunloaaded.n);returrn;CHDRVV_MAJJOR引數數是要被釋釋放的主編編號,CHHDRV_NAMEE是當初註註冊的裝置置名稱。這這兩個引數數必須與當當初呼叫rregi
16、sster_chrddev( ) 所用用的引數一一致,否則則 unrregisster_chrddev( ) 將傳傳回EIINVALL。2 檔案案作業與ffile 結構驅動程式內內部以一個個filee結構來代代表一個已已開啟的裝裝置,核心心透過一個個filee_opeeratiions 結構來存存取驅動程程式內部的的作業函式式(metthod)。這結構定定義在llinuxx/fs.h。ffile_operratioons 結結構包括指指向驅動程程式的各種種系統呼叫叫,例如rread, wriite, openn, reeleasse。操作檔檔案結構的各種種系統呼叫叫,其實際際動作就是是靠驅動程
17、程式內部的的作業系統統來達成的的。fille_opperattionss 結構宣宣告範例如如下:statiic sttructt fille_opperattionss c82255_cchdrvv_fopps = NUULL, /*lseeek*/readd: c88255_chdeev_reead, /* rread */writte: cc82555_chddev_wwritee, /* wriite */ NNULL, /* rreadddir */ NUULL, /* POOLL */ NUULL, /* iocttl */ NUULL, /* mmapp */ oopen: c82
18、255_cchdevv_opeen, /* oppen */ NUULL, /* FLUUSH */releease: c82255_cchdevv_relleasee, /* relleasee */ NUULL, /* fsynnc */ NUULL, /* fasyync */ NUULL, /* lockk */ NUULL, /* readdv */ NUULL, /* writtev */ NULLL, /* ssend pagee */ NUULL, /* get unmaappedd areea */ ;習慣上,我我們以變數數名稱(例例如c82255_cchdrvv_fopps
19、)來表表示fille_opperattionss結構。在在filee_opeeratiions結結構中每一一個欄位,都都必須指向向驅動程式式中負責特特定作業方方法,對於於驅動程式式不需要的作業業項目,其其對應欄位位需指向NUULL。我我們在此文文中所使用用到的作業業方法包括括有reaad( )、wriite( )、oppen( )及reeleasse( ),在此做做一個簡單單的介紹。open( ) 範例如下:int cc82555_chddev_oopen( strruct inodde *iinodee, sttructt fille *ffile )prinntk(c82555_oppen
20、nn);MOD_INC_USE_COUNNT;retuurn 00; 這是裝裝置操作的的第一步,一一般會在此此函數中進進行必要的的初始化準準備工作及及遞增目標標裝置的用量計次次,以避避免模組在在檔案關閉閉之前被卸卸載。2. reeleasse( ) 範例如下:int cc82555_chddev_rreleaase( struuct iinodee *innode, strruct filee *fiile )MOD_DEC_USE_COUNNT;prinntk(releeasen); rreturrn 0;releaase 作作業方法的的用途與oopen相相反。主要要包括遞減減用量次數數、再
21、最後後一次關閉閉時,將目目標裝置關關機、釋放放openn配置給ffilp-priivatee_datta的任何何東西。3. reead( ) 範例如下下:statiic sssize_t c88255_chdeev_reead(sstrucct fiile *filpp, chhar *buf, sizze_t counnt,looff_tt *offfsett)unsiggned int ix;buffeer2 = kmaallocc(1,GGFP_KKERNEEL);if(vveriffy_arrea(VVERIFFY_WRRITE,buf,counnt)=-EFAAULT)retuurn
22、 -EFAUULT; prrintkk(c88255_readdnn);/* reead ddata fromm 82555 POORT AA */io_baase=iioremmap_nnocacche(PPORTAA, LEENGTHH); *(bufffer2)=reeadb(io_bbase); ccopy_to_uuser(buf,bufffer,iix);kfreee(buufferr2);retuurn iix; 驅動程程式用此指指令擷取出出裝置上的的資料,並並將擷取到到的資料透透過coppy_too_useer指令傳遞給給應用程式式。如果ccopy_to_uuser執執行成功則
23、則傳回一個個非負數值值,代表成成功讀取的的位元組個個數。各個個引數的意意義如下: fillp 是檔檔案指標;counnt 是要要被傳輸的的資料量;buf引引數指向uuser-spacce 的緩緩衝區對於於readd,它是一一塊空白記記憶區,用用於存放裝裝置讀出的的資料。4. wrrite( ) 範例如下下:statiic sssize_t c88255_chdeev_wrrite(struuct ffile *fillp,coonst charr *buuf,siize_tt couunt, lofff_t *offsset) unnsignned iint iiy=0; unnsignned
24、 cchar dataax; buufferr1 = kmallloc(1,GFFP_KEERNELL); priintk(c82255_wwritee.nn); ioo_basse=iooremaap_noocachhe(POORTA,LENGGTH); coppy_frrom_uuser(bufffer1,buf,counnt); daatax=*(buufferr1);prinntk(c82555_wrrite.%dn,iiy); wrritebb(dattax, io_bbase+1); kfreee(buufferr1);retuurn iiy;將資料寫入入裝置若發發生錯誤,則則觸發
25、 wwritee( ) 系統呼叫叫的行程會會收到-EEINVAAL。如果果成功,wwritee將傳回一一個非負值值,代表成成功寫出的的位元數。我們在實實作wriite函式式裡利用ccopy_fromm_useer函式把把使用者空空間把之前前所錄的資資料傳送至至核心空間間。3 在應用用程式開啟啟驅動程式式的功能完成了驅動動程式的撰撰寫之後,接接下來要寫寫一個應用用程式來作作測試。程程式裡首先先要使用系系統呼叫對對裝置做開開啟的動作作,藉由 openn 系統呼呼叫來呼叫叫驅動程式式裡的 oopen 函式,便便會執行驅驅動程式裡裡相對應的的動作:int fd11,i;unsiignedd chaar
26、 daatabuuf100;fd1 = oppen(CC82555, O_RDWRR);if (fd1=-1) priintf(c82255 ddriveer oppen eerrorrn);exiit(0);使用 reead 系系統呼叫將將10字元元從核心空空間傳送至至使用者空空間: readd(fd11,dattabuff,10); ffor (i=0;i100;i+) prinntf(82555 porrt A dataa=%xn,ddatabbufii); 資料傳送送到使用者者空間後,接接下來我們們可以做需需要的應用用,例如傳傳送至網路路上或做聲聲音的處理理.等。使用 wrrite 系統呼叫叫來將將11字元傳送送至核心空空間: wrrite(fd1,dataabuf,1);執行應用程程式之後便便可驗證驅驅動程式的的功能。完整應用用程式範例例如下:/*/* 使用用者程式 */*/#incllude #incllude #incllude #incllude #incllude #incllude #incllude #defiine C
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廠房拆遷補償與環保設施配套合同
- 老師介紹課件
- 公共廁所日常維護及深度清潔合作協議
- 新能源汽車制造廠區轉讓與市場推廣合同
- 出租車副班司機合同解除與終止合同
- 專業倉儲物流企業成品油代購代銷合同范本
- 采石場承包與礦產資源補償費合同
- 老人睡眠護理課件
- 美術課件中國畫
- 消防安全生產制度
- DB11T 1430-2017 古樹名木雷電防護技術規范
- 應急廣播施工方案
- 公司增資擴股說明書范文
- 雙輪銑攪拌樁施工方案
- DG-TJ 08-2398-2022 纖維增強復合材料筋混凝土結構技術標準
- 《公頃和平方千米》(課件)人教版四年級數學上冊
- NBT 35095-2017 水電工程小流域水文計算規范
- 煙葉道路運輸服務方案
- 胎膜早破護理查房完整版
- 急性左心衰護理查房課件
- 用于生態修復的粉煤灰
評論
0/150
提交評論