ARM9外接晶片读写的验证-以8255为范例_第1页
ARM9外接晶片读写的验证-以8255为范例_第2页
ARM9外接晶片读写的验证-以8255为范例_第3页
ARM9外接晶片读写的验证-以8255为范例_第4页
ARM9外接晶片读写的验证-以8255为范例_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PAGE PAGE 20ARM9外接晶片讀寫的驗証-以8255為範例外接8255主要目的是透過位址線及資料線做外接晶片讀寫的驗証。ARM9可透過如圖1所示的轉接訊號線擴充其他的晶片功能。圖1. ARMM-9的轉接接訊號線解碼位址圖2代表ARMM-9的外接接記憶體解碼碼位址分佈,共共分8個區段段(bankk)。這些區區段分別由nnGCS0-nGCS77來解碼,每每個區段(bbank)共共有128 MB的記憶憶體空間。 Bank0及及Bank11分別由快閃閃記憶體(FFlash memorry)及隨機機讀取記憶體體(SDRAAM)所佔用用。Bankk2的解碼致致能線nCGGS2位於透透過ARM-9

2、發展板轉轉接槽的第334個接腳,如如圖1所示。nnCGS2解解碼位址分佈佈於0 x1000000000-0 x1180000000,如圖圖2所示。圖2. nGCCS2的解碼碼位址分佈圖3中ARM99的記憶體區區段(Bannk)的解碼碼線nGCSS2接82555的/CSS;(A1, A0)分分別接82555的(A11, A0);DATAA7-DATTA0分別接接8255的的D7-D00,如圖3所所示。所以88255的(PORTAA, PORRTB, PPORTC, CTL)的寫入位址址定義如下:PORTA=00 x100000000;PORTB=00 x100000001;PORTB=00 x1

3、00000002;CTL=0 x1100000003;圖3. 82555與ARMM-9的連接接方法ARM-9的資資料線共有332位元(DDATA311-DATAA0)。然而而外接記憶體體(或I/OO)可規劃為為8位元、116位元及332位元共三三種模式。究究竟選擇那種種模式,可透透過規劃BWWSCON暫暫存器的內容容來決定。BBWSCONN暫存器的位位址為0 x480000000。規規劃Bankk2的外接記記憶體(或II/O) 資料線讀寫位元數為8位位元,可規劃劃BWSCOON暫存器的的(bit99, bitt8)為000,如圖4所所示。程式規規劃的參考方方法如下圖4. BWSSCON暫存存器

4、的bitt10-biit0所規劃劃的功能ARM-9外接接記憶體(或或I/O)的的讀寫時序如如圖6所示。圖圖6中讀寫的的各項時間參參數(Taccs, Tccos, TTacc, Tacp, Tcohh, Tcaah)可由BBANKCOONx暫存器器(x=0,1.5)來調整。BBANKCOON2暫存器器的位址為00 x48000000c,如如圖5所示。圖5. BANNKCON22暫存器的位位址圖6. ARMM-9外接記記憶體(或II/O)的讀讀寫時序8255驅動程程式之建立在Linux核核心中,驅動動程式扮演特特殊的黑盒盒子角色,它它們能駕馭硬硬體裝置,並並且隱藏硬體體的實際作業業細節,使硬硬體的

5、回應方方式符合一組組嚴謹規定的的程式介面,讓讓應用程式能能透過一套標標準化的系統統呼叫來間接接操作硬體。以以實際的硬體體動作來實現現系統呼叫所所定義的功能能,正是驅動動程式所扮演演的角色。由由於系統呼叫叫這層軟體介介面的存在,使使得驅動程式式與核心的其其餘部分可以以分開製作,並並且在需要時時,才在執行行期將驅動程程式安插到核心裡。這這種模組化的的設計,不僅僅降低了Liinux驅動動程式的設計計難度,也使使得核心不必必為了支援新新硬體而頻頻頻改版。裝置驅動程式大大致分為區塊塊驅動程式、字字元驅動程式式及網路介面面驅動程式。區區塊驅動程式式是以固定大大小長度來傳傳送轉移資料料,且大致是是可以隨機存

6、存取資料的設設備,如硬碟碟機或光碟機機;字元裝置置是可被當成成一連串位元元組(串流)來來存取的裝置置,也就是說說這類裝置的的存取方式就就像檔案一樣樣。字元裝置置驅動程式的的主要任務,正正是實現這種種行為。這類類驅動程式至至少會實作四四項系統呼叫叫,分別是oopen()、closse()、rread()和writte()。我我們所熟悉的的操控台與序序列埠(/ddev/coonsolee、/devv/ttySS0),就是典典型的字元裝裝置,因為它它們都可順利利化身成串串流。字元元裝置必須透透過檔案系統統節點(fiilesysstem nnode)來來存取;檔案案系統節點俗俗稱為裝置檔檔(devii

7、ce fiile),例例如/devv/tttyyS0、/ddev/coonsolee。字元裝置置與一般正常常檔案之間的的最大差異,是是一般檔案容容許你任意改改變存取點(檔案指標),但字元裝裝置大部分都都只是資料通通道,只能被被循序存取。1 模組程式的的基本觀念一個驅動程式必必須被撰寫成成模組的型態態,才能夠具具備供使用者者載入與移除除的特性。因因此一個驅動動程式必然會會具有載入模模組函式與移移除模組這兩兩個函式。故故此兩個函式式就分別載入入驅動程式與與移除驅動程程式的角色。應用程式在啟動動之後,從頭頭到尾都只執執行同一件任任務。另一方方面,模組在在被載入核心心之後,必須須先向核心註註冊它自己,

8、以以便服務未來來的requuest,而而其”main”函式這時候候就立即結束束了。換言之之,initt_moduule( ) 函式 (模組的入口口) 的任務務,是將模組組的功能 (函式) 準準備好,使這這些功能可在在事後被調用用。模組的第第二個入口點點是 cleeanup_modulle ( ),它在模組組被卸載之前前會被叫用一一次,其作用用就是告訴核核心:我要要離開了,別別再叫我做任任何事。圖圖7描繪模組如如何利用函函式呼叫與與函式指標標,將新功功能加到運行行中的核心。應用程式則是在使用者空間(user space) 內運作。每當應用程式發出系統呼叫,或是發生硬體中斷時,LINUX便會將執行

9、模式從user-space切換到kernel-space。驅動程式碼必須在kernel-space內運作。圖7 將模組連連結至核心 2主標號(Maajor nnumberr)與次標號號(Minoor nummber) 當使用者要存取取字元裝置時時,必須透過過檔案系統裡裡的代表名稱稱,這些特殊檔檔是集中在 /dev/目錄之下。使使用指令ls-l /ddev得到如圖8的結結果。可看出出在日期欄之之前可以發現現兩個以逗號號隔開的數值值,在逗號左左方的數值是是該裝置檔的的主編號(majoor nummber),而而逗號右方的的數值是次次編號(mminor numbeer)。主主編號代表表裝置所配合合驅

10、動程式。當當核心收到oopen( )系統呼叫叫時,就是依依據主編號號來選擇驅驅動程式。另另一方面,次編號的的意義只有驅驅動程式自己己才知道,核核心會將使用用者給定的次次編號轉交給給驅動程式,核核心本身用不不到次編號。一一般而言,驅驅動程式以次次編號來辨識識同類裝置的的個體。圖8主編號與與次標號要增加一個新驅驅動程式到系系統,等於指指派一個主編編號給它。這這項指派應該該在驅動程式式(模組)的的初使期,藉藉由呼叫llinux/fs.h 所定義的的regisster_cchrdevv( )函式式來完成:int reggisterr_chrddev(unnsigneed intt majoor, co

11、onst cchar *name, struuct fiile_opperatiion *ffops);此函數的傳回值值代表註冊動動作的成功與與否。負值表表示失敗,00或正值表示示成功。maajor引數數是驅動程式式想要註冊的的主標號;nname是裝裝置的名稱(如如果註冊成功功,這名稱將將會出現在 /procc/deviices檔案案的內容裡);fops是是一個指標,指指向一個函函式指標陣列列(arrrary oof funnctionn poinnters),此此陣列紀錄了了驅動程式各各個入口點(作作業方法)的的位置。在驅動程式向核核心完成了註註冊之後,驅驅動程式的各各項作業方方法(oppe

12、ratiion)就與與給定的主編編號產生了關關連性。每當當有人對字元元裝置檔進行行某項操作時時,核心就能能從該裝置檔檔的主編號找找出對應的驅驅動程式,並並透過其fiile_opperatiions結構構來呼叫對應應的作業方法法。下一個問問題是如何給給應用程式一一個名稱,讓讓它們能利用用此名稱來啟啟動驅動程式式。這個名稱稱必須安插在在 /devv/ 目錄下下,而且必須須關連到驅動動程式的主編編號與次編號號。在檔案系系統製作節點點的命令是mmknod,你你必須有特權權身分(rooot)才能能使用此工具具。mknood至少需要要四個參數,例例如:mknod /dev/cc8255_driveer c

13、 42 0第一個引數是節節點名稱,其其後的三個引引數分別是裝裝置類型(cc代表chaar devvice)、主主編號、以及及次編號。就就像任何儲存存在磁碟上的的普通檔案一一樣,mknnod所產生生的裝置節點點會被保存下下來,除非刻刻意用rm命命令刪除它們們。我們在驅驅動程式主程程式中做以下下定義及宣告告:#defineeCHDRVV_MAJOOR42char CHHDRV_NNAME = cc8255_driveer;而我們系統實作作時的驅動程程式註冊的動動作是在一個個init_modulle程式中實實現:int iniit_moddule(vvoid)if(reggisterr_chrdde

14、v(CHHDRV_MMAJOR, CHDRRV_NAMME, &cc8255_chdrvv_fopss) printtk(keernel: %s: Unablle to regisster ccharaccter ddeviceen, CHDRVV_NAMEE);returrn -EIIO;在模組被卸載之之前,它必須須先釋放主標標號,而這個個動作可由uunregiister_chrdeev( ) 完成,我們們在模組的清清理函式裡呼呼叫它:void clleanupp_moduule(vooid)unregisster_cchrdevv(CHDRRV_MAJJOR, CCHDRV_NAME);p

15、rintk(unlooaded.n);return;CHDRV_MMAJOR引引數是要被釋釋放的主編號號,CHDRRV_NAMME是當初註註冊的裝置名名稱。這兩個個引數必須與與當初呼叫rregistter_chhrdev( ) 所用用的引數一致致,否則 uunregiister_chrdeev( ) 將傳回EEINVALL。2 檔案作業業與filee 結構驅動程式內部以以一個fille結構來代代表一個已開開啟的裝置,核核心透過一個個file_operaationss 結構來存存取驅動程式式內部的作業業函式(meethod)。這這結構定義在在linuux/fs.h。fiile_opperatii

16、ons 結結構包括指向向驅動程式的的各種系統呼呼叫,例如rread, writee, opeen, reeleasee.。操操作檔案結構構的各種系統統呼叫,其實實際動作就是是靠驅動程式式內部的作業業系統來達成成的。fille_opeeratioons 結構構宣告範例如如下:static strucct fille_opeeratioons c88255_cchdrv_fops = NULL, /*lseeek*/read: c82555_chdeev_reaad, /* readd */write: c82555_chddev_wrrite, /* wrrite */ NULLL, /* rr

17、eaddiir */ NULL, /* POLLL */ NULL, /* ioctll */ NULL, /* mmap */ opeen: c88255_cchdev_open, /* oopen */ NULL, /* FLUSSH */releasse: c88255_cchdev_releaase, /* rellease */ NULL, /* fsyncc */ NULL, /* fasynnc */ NULL, /* lock */ NULL, /* readvv */ NULL, /* writeev */ NNULL, /* ssend ppage */ NULL, /*

18、get uunmappped arrea */ ;習慣上,我們以以變數名稱(例如c82255_chhdrv_ffops)來來表示fille_opeeratioons結構。在在file_operaationss結構中每一一個欄位,都都必須指向驅驅動程式中負負責特定作業業方法,對於於驅動程式不不需要的作業項項目,其對應應欄位需指向NULLL。我們在在此文中所使使用到的作業業方法包括有有read( )、wrrite( )、opeen( )及及releaase( ),在此做一一個簡單的介介紹。open( ) 範例如下:int c82255_chhdev_oopen( strucct inoode *i

19、inode, struuct fiile *ffile )printkk(c82255_oppenn);MOD_INNC_USEE_COUNNT;returnn 0; 這是裝置操操作的第一步步,一般會在在此函數中進進行必要的初初始化準備工工作及遞增目目標裝置的用量計次,以避免模組在檔檔案關閉之前前被卸載。2. releease( ) 範例如下:int c82255_chhdev_rreleasse( sttruct inodee *inoode, sstructt filee *fille )MOD_DEEC_USEE_COUNNT;printkk(relleasen); retuurn 0;

20、releasee 作業方法法的用途與oopen相反反。主要包括括遞減用量次次數、再最後後一次關閉時時,將目標裝裝置關機、釋釋放openn配置給fiilp-pprivatte_datta的任何東東西。3. readd( ) 範例如下:static ssizee_t c88255_cchdev_read(strucct fille *fiilp, cchar *buf, size_t couunt,looff_t *offsset)unsigneed intt ix;buffer22 = kmmallocc(1,GFFP_KERRNEL);if(verrify_aarea(VVERIFYY_WRI

21、TTE,buff,counnt)=-EFAULLT)returnn -EFAAULT; prinntk(cc8255_readn);/* rread ddata ffrom 88255 PPORT AA */io_basee=ioreemap_nnocachhe(PORRTA, LLENGTHH); *(bufffer2)=reaadb(ioo_basee); copyy_to_uuser(bbuf,buuffer,ix);kfree(buffeer2);returnn ix; 驅動程式用用此指令擷取取出裝置上的的資料,並將將擷取到的資資料透過copyy_to_uuser指令令傳遞給應用用程式

22、。如果果copy_to_usser執行成成功則傳回一一個非負數值值,代表成功功讀取的位元元組個數。各各個引數的意意義如下: filp 是檔案指標標;counnt 是要被被傳輸的資料料量;buff引數指向uuser-sspace 的緩衝區對對於readd,它是一塊塊空白記憶區區,用於存放放裝置讀出的的資料。4. writte( ) 範例如下:static ssizee_t c88255_cchdev_writee(struuct fiile *ffilp,cconst char *buf,size_t couunt, lloff_tt *offfset) unsiigned int iiy=0;

23、 unsiigned char dataxx; bufffer1 = kmallloc(11,GFP_KERNEEL); printtk(c88255_wwrite.n); io_bbase=iioremaap_noccache(PORTAA,LENGGTH); copy_from_user(buffeer1,buuf,couunt); dataax=*(bbufferr1);printkk(c82255_wrrite.%dn,iy); writeeb(dattax, iio_basse+1); kfree(buffeer1);returnn iy;將資料寫入裝置置若發生錯誤誤,則觸發 wri

24、tee( ) 系系統呼叫的行行程會收到-EINVAAL。如果成成功,wriite將傳回回一個非負值值,代表成功功寫出的位元元數。我們在在實作wriite函式裡裡利用coppy_froom_useer函式把使使用者空間把把之前所錄的的資料傳送至至核心空間。3 在應用程式式開啟驅動程程式的功能完成了驅動程式式的撰寫之後後,接下來要要寫一個應用用程式來作測測試。程式裡裡首先要使用用系統呼叫對對裝置做開啟啟的動作,藉藉由 opeen 系統呼呼叫來呼叫驅驅動程式裡的的 openn 函式,便便會執行驅動動程式裡相對對應的動作:int ffd1,i;unsignned chhar daatabuff10;f

25、d1 = open(C82555, O_RRDWR);if (fdd1=-11) printtf(c88255 ddriverr openn erroorn);exit(0);使用 readd 系統呼叫叫將10字元元從核心空間間傳送至使用用者空間: reead(fdd1,dattabuf,10); for (i=0;i10;i+) priintf(8255 port A datta=%xn,daatabuffi); 資料傳送到使使用者空間後後,接下來我我們可以做需需要的應用,例例如傳送至網網路上或做聲聲音的處理.等。使用 wriite 系統統呼叫來將將將1字元傳送送至核心空間間: writte(fd11,dataabuf,11);執行應用程式之之後便可驗證證驅動程式的的功能。完整應用程程式範例如下下:/*/* 使用者者程式 */*/#includde #includde #includde #includde #includde #includde #includde #definee

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论