ARM9外接晶片讀寫的驗證-以8255為范例(一)_第1頁
ARM9外接晶片讀寫的驗證-以8255為范例(一)_第2頁
ARM9外接晶片讀寫的驗證-以8255為范例(一)_第3頁
ARM9外接晶片讀寫的驗證-以8255為范例(一)_第4頁
ARM9外接晶片讀寫的驗證-以8255為范例(一)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

ARM9外接晶片^^的瞬UE-以8255卷靶例

外接8255主要目的是透謾,‘立址^及資料^做外接晶片學(xué)曹舄'的片能正。ARM9可透謾如IS1所示的

傅接^虢^撅充其他的晶片功能。

P13

'H~(-DATA15

DATA14--DATA13

DATA12-DATA11

DATA10--DATA9

DATA8DATA7

DATA6DATA5

DATA4DATA3

DATA2-DATA1

DATAO—(-AO

A1A2

A3(-A4

A50—A6

A7-A8

A9A10

All-A12

A13-A14

A15—nGCS2

nOEnRESET

nWE-+5V

KBDINT--+5V

H1.ARM-9的傅接音亂號怒泉

解碼位址

g]2代表ARM-9的外接|己驚艘解碉位址分怖,共分81’固II段(bank)。造些展段分別由

nGCS0-nGCS7來解碼,每他111段(bank)共有128MB的言己1意醴空冏。BankO及Bankl分別由快收情己

tFlashmemory)及隨取言己膀醴(SDRAM)所估用。Bank2的解礁致能^nCGS2位於透謾ARM-9

彝展板傅接槽的第34保|接峪|1,如圈|1所示。nCGS2解彳相位址分彳布於0x10000000-0x18000000,如|ffl

2所示。

-OM[1:01=01.10OMf1:0l=00

WAI111111W

NotusedNotused

AvAAY^WHHWAWA?w

SFRAreaSFRArea

0x4&30_0000f

Ox4O0O_OFFF—?

BootSRAM

Notused

(4KBytes)

nvdfYinnonn、

SROM/SDRAMSROM/SDRAM'2M574MB/8MB/16MB

(nGCS7)(nGCS7)/32M3/64MB/128MB'

nnoo_>Referto

TaK>Cl

SROM/SDRAMSROM/SDRAM2ME/4MB/8MB/16MB

(nGCS6)(nGCS6)/32N3/64M8/128MB

AvWWInAAA__

SROMSROM

128M3

(nGCS5)(nGCS5)

nnnn>

SROMSROM

123MB1GB

(nGCS4)(nGCS4)

DvTAYlHAHA>HADDRR9:0]

Accessible

SROMSROM

128M3Region

(nGCS3)(nGCS3)

AVIAAHnnnn4

SROMSROM

128MB

(nGCS2)(nGCS2)

unvxIUJU_nUnUoUAU_4p

SROMSROM

128M3

(nGCSI)(nGCSI)

HvfWV)fYYYl4

SROM

BootInternal123M3

(nGCSO)

nv/w\nnnnn__SRAM(4KB)

[NotusingNANDflashforbootROM)[UsingNANDflashforbootROM]

NOTES:

1.SROMmeansROMorSRAVtypememoty

2.SFRmeansSpecialFunctionRegister

Figure5-1.S3C2410XMemoryMapafterReset

I?2.nGCS2的解礁位址分怖

IS3中ARM9的言己驚醴IE段(Bank)的解礁幺泉nGCS2接8255的/CS;(Al,A0)分別接8255的(A1,

AO);DATA7-DATA0分別接8255的D7-D0,如g|3所示。所以8255的(PORTA,PORTB,PORTC,CTL)

的窩入位址定羲如下:

PORTA=Ox10000000;

PORTB=Ox10000001;

PORTR=Ox10000002;

CTL=Ox10000003;

nOE

nGCS2

n\VE

AI

AO

DATA7-DATAO

03.8255輿ARM-9的速接方法

ARM-9的資料幺泉共有32位元⑴ATA31-DATAO)。然而外接SSI?髓(或T/0)可祝副卷8位元、16

位元及32位元共三槿模式。究竟逗攆那槿模式,可透謾烷副BWSCON暫存器的內(nèi)容來決定。BWSCON

暫存器的位址卷0x48000000。烷副Bank2的外接geitflf(或I/O)資料幺泉癮位元數(shù)懸8位元,可

規(guī)副BWSCON暫存器的(bit9,bit8)^00,如Iffl4所示。程式規(guī)副的夢考方法如下

RegisterAddressR/WDescriptionResetValue

BWSCON0x48000000R/WBuswidth&v/aitstatuscontrolregister0x000000

BUSWIDTH&WAITCONTROLREGISTER(BWSCON)(Continued)

WS2[10]DetermineWAITstatusforbank20

0=WAITdisable1=WAITenable

DW2[9:8]Determinedatabuswidthforbank2.0

00=8-bit01=16-bit,10=32-bit11=reserved

STI17]DetermineSRAMforusingUB/LBforbank1.0

0=NotusingUB/LB(ThepinsarededicatednWBE|3:0])

1=UsingUB/LB(ThepinsarededicatednBE[3:0])

WS1⑹DetermineWAITstatusforbank1.0

0=WAITdisable,1=WAITenable

DW1[5:4]Determinedatabuswidthforbank1.0

00=8-bit01=16-bit,10=32-bit11=reserved

DWOI2:1]Indicatedatabuswidthforbank0(readonly).-

01=16-bit,10=32-bit

ThestatesareselectedbyOM[1:0]pins

Reserved[0]-

Bl4.BWSCON暫存器的bitio-bito所規(guī)副的功能

ARM-9外接意能(或1/0)的^^畤序如IBI6所示。ffl6中^^的各I直疇^參數(shù)(Taes,Teos,

Tacc,Tacp,Tcoh,Tcah)可由BANKCONx暫存器(x=0,1..5)^^整。BANKC0N2暫存器的位址懸

0x4800000c,如Bl5所示。

RegisterAddressR/WDescriptionResetValue

BANKCONO0x48000004R/WBank0controlregister0x0700

BANKCON10x48000008R/WBank1controlregister0x0700

BANKCON20x4800000CR/WBank2controlregister0x0700

BANKCON30x48000010R/WBank3controlregister0x0700

BANKCON40x48000014R/WBank4controlregister0x0700

BANKCON50x48000018R/WBank5controlregister0x0700

Bl5.RANKCON2暫存器的位址

IIIIIIIIIIII

A[24:0]

nGCS

nOE

nWE

nWBE

D[31:0](R)

D[31:0](W)

Taes=1cycleTaco=2cycles

Teos=1cycleTcoh=1cycle

Tacc=3cyclesTcah=2cydes

Figure5-12.S3C2410XnGCSTimingDiagram

1l6.ARM-9外接靛11意艘(或I/O)的^'舄畤序

8255勤程式之建立

在Linux核心中,^勤程式扮演特殊的「黑盒子」角色,它憑能(硬鶻裝置,企且I1藏硬的.

的^除作蕖^第,使硬醴的回鷹方式符合一幺(1^^規(guī)定的程式介面,aiifi用程式能透謾一套檄型化

的系統(tǒng)呼叫來接操作硬醴。以^除的硬醴勤作^^系統(tǒng)呼叫所定羲的功能,正是^勤程式所扮

演的角色。由於系統(tǒng)呼叫道眉軟醴介面的存在,使得^^程式輿核心的其繪局部可以分明裂作,

旦在需要畤,才在孰行期揩^勃程式「安插」到核心桂。道槿模^化的^言十,不僮降低了Linux

程式的^言十轆度,也使得核心不必懸了支援新硬醴而^步反改版。

裝置程式大致分卷H城雅勤程式、字元^勤程式及^路介面^勤程式。HI兔^^程式是以

固定大小晨度來停送樽移資料,且大致是可以隨檄存取資料的^^,如硬碟械或光碟檄;字元裝置

是可被常成一速串位元^(串流)來存取的裝置,也就是裝置的存取方式就像槽案一檄。字

元裝置^勤程式的主要任才務(wù),正是槿行卷。道勤程式至少畬^作四項系統(tǒng)呼叫,分別是

open()>close()>read。和write()o我出號所熟悉的操控臺典序列埠(/dcv/console、

/dev/ttySO…),就是典型的字元裝置,因卷它便J都可J蟆利化身成「串流」。字元裝置必須透謾槽案

系統(tǒng)?^粘(node)來存?。徊郯赶到y(tǒng)?I黠俗楷卷裝置槽(devicefile),例如/dev/tttySO、

/dev/consoleo字元裝置輿一般正常桶案之冏的最大差昇,是一般槽案容器午你任意改夔存取黠(檎

案指襟),但字元裝置大局部都只是資料通道,只能被循序存取。

g模^程式的根本^念

一他,朗勤程式必須被撰'嘉成模幺且的型熊,才能貧)具倩供使用者載入輿移除的特性。因此一他

勤程式必然畬具有載入模^函式典移除模/揖1雨(0函式P故此雨他I函式就分別載入SS勃程式典移除

程式的角色。

鷹用程式在敬勒之彳灸,彳能^到尾都只軌行同一件任才務(wù)。另一方面,模^在被截入核心之彳灸,必

須先向核心注冊它自己,以便服才務(wù)未來的request,而其〃main"函式il畤候就立即結(jié)束了。換言

之,initmodule()函式(模^的入口)的任矜,是揩模的功能(函式)型借好,使it些功能

可在事彳爰被^用。模^的第二佃入口黠是cleanup_moclule(),它在模幺且被卸載之前畬被叫用一

次,其作用就是告核心:『我耍雕明了,別再叫我做任何事』。HI7描^模飆如何利月「函式呼叫」

典「函式指襟」,招新功能加到[里行中的核心。鷹用程式用是在「使用者空Rfl」(userspace)內(nèi)逋

作。每常愿用程式贊出系統(tǒng)呼叫,或是彝生硬艘中斷畤,LINUX便曾招軌行模式優(yōu)uscr-spacc切

換到kernel-space。^程式“等必須在kernel-space內(nèi)遵作。

Figure2-1.I.iuknifia,,“>duk>tothekt'rnel

ia7符模^速結(jié)至核心

團主襟虢(Majornumber)輿次檄虢(Minornumber)

常使用者要存取字元裝置疇,必須透謾檎案系統(tǒng)貍的代表名耦,il些特殊槽是集中在/dev/

目金象之下。使用指令

ls-l/dev

得到如置I8的留吉果??煽闯鲈谌掌谀_之前可以樊現(xiàn)雨佃以逗虢隔明的數(shù)值,在逗虢左方的數(shù)值

是三亥裝置1?常的「主褊虢」(majornumber),而逗虢右方的數(shù)值是「次褊虢」(minornumber)0

編虢J代表裝置所配合91勤程式。常核心收到。pcn()系統(tǒng)呼叫畤,就是依撼「主編虢」5(68攆Jg

勤程式。另一方面,「次編虢」的意羲只有^勤程式自己才知道,核心曾揩使用者給定的次編虢樽

交余合^程式,核心本身用不到次編虢。一般而言,^程式以次編虢來辨^同^裝置的倜颼。

crw-rw-rw-1rootroot1,3Feb231999null

crw1rootroot10,1Feb231999peaux

crw1rubiniccy4,1Aug1622:22ccyl

crw-rw-rw-1rootdialouc4,64Jun3011:19tcySO

crw-rw-rw-1rootdlalouc4,65Aug1600:00ccySl

crw1rooteye7,1Feb231999vcsl

crw1rootsys7,129Feb231999vcsal

crw-rw-rw-1rootrootI,5Feb231999zero

El8主編虢典次襟虢

要增加一保I新^^程式到系統(tǒng),等於指派一他主編虢給它。道項指派^^在勤程式(模<1)

的初使期,藉由呼叫VIinux/fs.h>所定羲的register_chrdev()函式來完成:

intregisterchrdev(unsignedintmajor,constchar舉name,

struct*fops);

此函數(shù)的傅回值代表者主冊勤作的成功典否。:ft值表示失敗,0或正值表示成功。major引數(shù)是

勒程式想要注冊的主襟虢;name是裝置的名稠(如果注冊成功,造名耦揩畬出現(xiàn)在

/proc/devices檎案的內(nèi)容貍);fops是一他I指檄,指向一13「函式指襟陣列」(anraryoffunction

pointers),此睡列幺當(dāng)錄了^勤程式各他I入口黠(作蕖方法)的位置。

在^^程式向核心完成了言主冊之彳及,勤程式的各項「作篥方法」(operation)就典給定的主

褊虢羥生了^^性。每常有人封字元裝置槽迤行某^操作畤,核心就能彳他三亥袋置槽的主褊虢找出封

愿的^勤程式,或透遇其余吉情來呼叫封愿的作渠方法。下一他冏題是如何感用程式一他I名稠,?

它憑能利用此名耦來做勤程式。ilf0名稀必須安插在/dev/目^下,而且必須^速到SI勤程

式的主編嬲典次編號以在槽案系統(tǒng)裂作第黠的命令是mknod,你必須有特^身分(root)才能使用

此工具。mknod至少需要四(0參數(shù),例如:

mknod/dev/c8255_driverc420

第一他引致是育苗占名稠,其彳爰的三低I引數(shù)分別是裝置^型(c代表chardevice)、主編虢、以

及次編虢。就像任何儲存在磁碟上的普通槽案一檬,mknod所羥生的裝置@1黠曾被保存下來,除非

刻意用rm命令刪除它伊九我憑在^勒程式主程式中做以下定羲及宣告:

#defineCHDRV_MAJOR42

charCHDRV_NAME[]="c8255_driver”;

而我他J系統(tǒng)^作畤的勤程式官主佃的勃作是在一倜init.module程式中兄

intinit_module(void)

(

if(register_chrdev(CHDRV_MAJOR,CHDRV_NAME,&c8255_chdrv_fops)){

printk("kernel:%s:Unabletoregistercharacterdevice'n”,CHDRV_NAME);

return-EIO;

}

在模^被卸載之前,它必須先釋放主檄虢,而ilf0勤作可由unregister_chrdev()完成,我

儼]在模融I的清理函式貍呼叫它:

voidcleanup_modu1e(void)

{

unregister_chrdev(CHDRV_MAJOR,CHDRV_NAME);

printk("unloaded。?\n");

return;

CHDRV_MAJOR引數(shù)是要被穆放的主編虢,CHDRV_NAME是常初注冊的裝置名穗。11雨彳固引敷必

須典常初呼叫register_chrdev()所用的引8!(一致,否具Uunregister_chrdev()符傅回一

EINVALo

目槽案作渠輿file結(jié)情

^^程式內(nèi)部以一保Ifile皓情來代表一倜己明敬的裝置核心透謾一俯I幺吉橫來存取^勤程式

內(nèi)部的作蕖函式(method)。道的情定羲在Vlinux/fs.h>。結(jié)橫包括指向勤程式的各槿系統(tǒng)呼

叫,例如read,write,open,release...o操作槽案系吉橫的各矛重系幺充呼叫,其^除勤作就是靠

勤程式內(nèi)部的作蕖系統(tǒng)來逢成的。結(jié)情宣告靶例如下:

staticstructc8255_chdrv_fops={

NULL,/*lseek*/

read:c8255_chdev_read,/*read*/

write:c8255_chdev_write,/*write*/

NULL,/*readdir*/

NULL,/*POLL*/

NULL,/*ioctl*/

NULL,/*mmap*/

open:c8255_chdev_open,/*open*/

NULL,/*FLUSH*/

release:c8255_chdev_release,/*release*/

NULL,/*fsync*/

NULL,/*fasync*/

NULL,/*lock*/

NULL,/*readv*/

NULL,/*writev*/

NULL,/*sendpage*/

NULL,/*get.unmappedarea*/

);

當(dāng)慣上,我憑以建數(shù)名穗(例如c8255_chdrv_fops)來表示結(jié)橫。在結(jié)橫中每一,冏棚位,都必

須指向勤程式中負貨特定作渠方法,封於SE勤程式不需要的作渠項目,其封鷹楠位需指向NULL。

我杷弓在此文中所使用到的作蕖方法包括有read()、write()、open()及release(),在此做一

倜曾軍的介貂。

1.open()輪例如下:

intc8255_chdev_open(structinode*inode,structfile*file)

{

printk(*c8255_open\n/r);

MOD_INC_USE_COUNT;

return0;

)

it是裝置操作的第一步,一般曾在此函數(shù)中暹行必要的初始化舉借工作及遽增目檄裝置的「用量

言十次J,以防止模條且在槽案^^之前被卸載。

2.release()蒯列如下:

intc8255_chdev_release(structinode*inode,structfile*file)

{

MOD_DEC_USE_COUNT;

printk("release\n~");

return0;

)

release作渠方法的用途輿。pen相反。主要包括遽減用量次數(shù)、再最彳發(fā)一次事符目襟裝置

釋放open配置系臺filp->private_data的任何柬西。

3.read()輪例如下:

staticssize_tc8255_chdev_read(structfile*filp,char*buf,size_tcount,loff_t

*offset)

unsignedintix;

buffer2=kmallocd,GFP_KERNEL);

if(verify_area(VERIFY_WRITE,buf,count)==-EFAULD

return-EFAULT;

printk("c8255_read~~\n");

/*readdatafrom8255PORTA*/

io_base=ioremap_nocache(PORTA,LENGTH);

*(buffer2)=readb(io_base);

copy_to_user(buf,buffer,ix);

kfree(buffer2);

returnix;

)

^^程式用此指令微取出裝置上的資料,加符猴取到的資料透謾copy_to_user指令傅遮東合愿用

程式。如果copy_to_user軌行成功即停回一保I非;ft數(shù)值,代表成功^取的位元黜保]數(shù)。各俯I引數(shù)

的意羲如下:flip是槽案指梯;count是要被傅翰的資料量;buf引數(shù)指向user-space的^^

顯封於read,它是一?現(xiàn)空白用於存放裝置器亶出的資料。

4.write()危包例如下:

staticssize_tc8255_chdev_write(structfile*filp,constchar*buf,size_tcount,loff_t

?offset)

(

unsignedintiy=0;

unsignedchardatax;

bufferl=kmalloc(l,GFP_KERNEL);

printk(/rc8255_write..\n");

io_base=ioremap_nocache(PORTA,LENGTH);

copy_from_user(buffer1,buf,count);

datax=*(bufferl);

printk(/zc8255_write..%d\n",iy);

writeb(datax,io_base+l);

)

kfree(bufferl);

returniy;

)

揩資料'嘉入裝置若彝生^旗,writeO系統(tǒng)呼叫的行程畬收到-EINVAL如果成功,write

符傅回一值|非負值,代表成功嘉出的位元敢。我出號在^作write函式裨.利用copy_from_user函式

把使用者空冏把之前所鰥的資料停送至核心空冏。

國在鷹用程式勤程式的功能

完成了Sg勃程式的撰嘉之彳翁接下來要嘉一倜愿用程式來作攜虛丸程式裨.首先要使用系統(tǒng)呼叫

封裝置做敢的勤作,藉由open系統(tǒng)呼叫來呼叫^^程式貍的open函式,便畬軌行^勒程式桂

相封鷹的勤作:

intfdl,i;

unsignedchardatabuf[10];

fdl

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論