基于S3C2440和嵌入式Linux的擴展串口設(shè)計
因為方案采用中斷方式,所以將NSEL置高位,即允許芯片中斷。16C554A有INTA、INTB、INTC、IN TD4個中斷線,第一片擴展串口與系統(tǒng)總線的EINT1,EINT2,EINT5,EINT6相連,第二片擴展串口與GPIO中的EINT11,EINT13,EINT15,EIN39中斷相連,使得任一片芯片的任意的端口都能產(chǎn)生中斷。
S3C2440的A0,A1,A2,A4,A5,A24通過不同組合可以選擇8個不同的端口。nGCS5與74LS138譯碼器片選腳相連,根據(jù)S3C2440對地址空間的定義,這樣就確定了第一片16C554A擴展芯片4個端口的訪問地址為0X28000000,0X28000010,0X28000020,0X28000030,第二片16C554A擴展芯片4個端口的訪問地址為0X29000000,0X29000010,0X29000020,0X29000030,根據(jù)端口基地址就可以確定片內(nèi)的各個寄存器地址。具體連接如圖4所示。本文引用地址:http://www.ex-cimer.com/article/150465.htm
3 驅(qū)動程序移植
軟件設(shè)計主要是為設(shè)備編寫驅(qū)動程序。設(shè)備驅(qū)動是介于硬件和操作系統(tǒng)之間的軟件接口,主要功能包括:探測和初始化設(shè)備;從設(shè)備接收數(shù)據(jù)并提交給內(nèi)核;從內(nèi)核接收數(shù)據(jù)送到設(shè)備;檢測和處理設(shè)備錯誤。
串口驅(qū)動程序從上到下分為4層:終端設(shè)備層、行規(guī)程、串口抽象層、串口芯片層。其中,串口芯片層與具體的芯片相關(guān),主要是向串口抽象層提供串口芯片所用的資源,還進行一些與芯片相關(guān)的設(shè)置。
TL16C554A擴展串口芯片屬于標準串口,內(nèi)核的串口驅(qū)動程序?qū)λС炙尿?qū)動程序就是Linux內(nèi)核代碼中的driver/seria/8250.c.入口函數(shù)是serial8250_init,它用于向串口抽象層提供注冊串口的物理信息。串口的物理信息主要有兩類:訪問地址和中斷號。所以只要設(shè)置好這兩類物理信息,就可以驅(qū)動擴展串口了,圖5為驅(qū)動程序移植流程。
3.1 構(gòu)建擴展串口的數(shù)據(jù)結(jié)構(gòu)
串口的物理信息存儲在內(nèi)核源程序arch/arm/plats3c24xx/common-smdk.c中,所以主要工作是在commonsmdk.c源文件中增加三段代碼:
1)增加頭文件
源程序中要包含頭文件linux/serial_8250.h,用于告訴編譯器使用8250.c作為擴展串口的源程序;
評論