時間:2009-05-18 16:59:15來源:ronggang
[/align]
三星的S3C2510A ARM處理器,內部集成了PCI(MINI-PCI)& PC Card控制器,根據應用需要將S3C2510A的PCI(MINI-PCI)& PC Card控制器設置為PCI Host工作模式,這是通過設定PCI_PCCDM和PCI_HOSTM兩個配置引腳的電平來實現(xiàn)的[2]。見上頁表1所示。
S3C2510A內嵌的PCI總線控制器符合PCI總線規(guī)范2.2版本,具有32bit地址/數據復用總線,支持非線性傳輸和突發(fā)傳輸,最高數據傳輸速度可以達到264MB/s@66Mhz(132MB/s@33Mhz) 。而且?guī)в械刂纷儞Q機制,可以將內部的PCI總線地址映射到內存或者外圍設備。2510A的引腳定義是根據
PCI總線來命名的,因此設計者只需將S3C2510A的PCI控制引腳接出即可。 在設計中設定PCI總線的時鐘頻率為66Mhz,因此主板上PCI總線的最高傳輸速度可以達到264MB,能夠滿足數據的快速傳輸。在這里需要利用時鐘反饋來彌補PCI的時鐘延遲。
[align=center]
圖3. S3C2510A的PCI控制器時鐘反饋機制
Fig3. PCI Clock Schemes[/align]
如上圖所示,當PCI控制器工作在PCI HOST模式下時,其時鐘源是由系統(tǒng)內部提供的,S3C2510A有3個PCI時鐘輸出信號PCICLK1,PCICLK2和PCICLK3,將PCI設備診斷寄存器PCIDIAG0的DC3位設置為1,即將PCICLK3設置為輸出無效,此時PCICLK1與PCICLK3相連,通過PCICLK3將時鐘信號反饋給處理器內核,這樣可以使外部PCI設備與PCI時鐘保持一致,從而彌補時鐘延遲[3]。
2.2 系統(tǒng)以及PCI控制器的工作啟動順序
系統(tǒng)上電之后,系統(tǒng)以及PCI控制器的啟動順序如圖4所示:其中在對PCI控制器的特殊功能寄存器進行配置時需要首先關閉中斷,即設置PCIINTEN=0。然后設置PCI控制和狀態(tài)寄存器PCICON[ARB,ATS,SPL,IOP,MMP],某些需要的情況下還要設置PCI診斷寄存器,這個寄存器是針對測試功能的,在PCMCIA Host工作模式下不需要進行設置。然后要對與基地址有關的寄存器PCIBAM0~1和PCIBATPA0~2進行設計,設置完之后要配置有關PCI重啟和時鐘的寄存器,其中關鍵的一步是設置PCI重啟和時鐘寄存器PCIRCC[MSK]=0,這是為了防止重啟信號和時鐘信號的沖突[3]。
[align=center]
圖4.PCI控制器及外圍設備的啟動順序
Fig4. PCI Controller’s Booting Sequence[/align]
在PCI控制器偵測外圍設備并初始化外圍設備的寄存器時,需要完成以下工作:
1) 讀取所有的配置寄存器值,包括PCIHID,PCIHSC,PCIHSSID等等。
2) 檢查BAR(Backup Address Register)的范圍并一一分配空間。
3) 使能外部設備并激活總線。
以上配置都是在PCI視頻處理卡的驅動中完成的,因為已經把驅動程序加載到了uClinux的內核中,所以系統(tǒng)啟動之后,操作系統(tǒng)會自動配置PCI外部設備。
3. 系統(tǒng)軟件設計
系統(tǒng)的軟件主要由Boot Loader和嵌入式uClinux兩大部分組成,其中Boot Loader相當于PC機的BIOS,是在操作系統(tǒng)內核運行前運行的一段程序,其主要作用在于初始化硬件設備,建立系統(tǒng)的內存空間映射,然后再調用操作系統(tǒng)內核。嵌入式uClinux是這個系統(tǒng)的OS,主要包括設備驅動程序和上層應用程序。這里主要介紹一下移植Boot Loader的方法和uClinux中設備驅動程序的實現(xiàn)。
3.1 Boot Loader的移植
Boot Loader是和硬件緊密連接的,系統(tǒng)是通過Boot Loader來調用操作系統(tǒng)內核并最終運行操作系統(tǒng)的。本系統(tǒng)采用了U-Boot(Universal Boot Loader,)作為Boot Loader,下面圍繞U-Boot的移植來介紹如何建立主板的BootLoader。
U-Boot相當于一個小型的Linux系統(tǒng),其工作涉及到硬件系統(tǒng)的初始化,存儲空間分配等等,因此其移植工作需要認真地閱讀相關芯片的硬件手冊,在設計過程中主要完成了以下工作,相關的程序編寫可以根據U-Boot提供的例程來完成:
1) 修改Makefile配置文件,添加針對目標板的編譯命令行。
2) 在CPU目錄下建立arm940t目錄,主要包括系統(tǒng)入口函數start.S,中斷設置函數代碼interrupts.c,CPU相關代碼文件cpu.c以及串口初始化代碼相關文件serial.c等。
3) 在Board目錄下建立S3C2510目錄,主要包括FLASH初始化代碼flash.c,內存分配代碼memsetup.S,連接器文件u-boot.lds等。
4) 編寫配置文件,即:include/configs/s3c2510.h,完成了寄存器的定義等系統(tǒng)配置,大部分工作是參考S3C2510的數據手冊來進行的。
5) 編寫flash.c文件,根據使用的AMD的NOR Flash來編寫Flash的驅動,主要有flash芯片的型號,容量大小,打印信息,flash擦除函數等。
6) 修改SDRAM的大小,只要修改前面建立的配置文件include/configs/s3c2510.h中的#define PHYS_SDRAM_SIZE 0X200000即可。其大小是根據實際應用中SDRAM的大小來確定的。
7) 修改串口參數文件serial.c。包括設置串口波特率,其中波特率是由下式計算得出:
RUBRDIV0=( (int)(MCLK/16./(gd ->baudrate) + 0.5) -1 )。
8) 修改start.S文件,一個可執(zhí)行的Image 必須有一個入口點并且只能有一個唯一的全局入口,通常這個入口放在Rom(flash)的0x0 地址。例如start.S 中的.globl _start_start: 。
完成上面工作后就可以將U-Boot編譯,通過Jtag口下載到目標板進行調試。
3.2 uClinux設備驅動編寫
Linux的內核是由設備管理、進程管理、內存管理和文件系統(tǒng)一起組成,Linux設備驅動可以分為字符類(Character)設備,塊類(Block)設備,網絡接口類設備和其他非標準驅動。其中PCI設備被看作是字符型設備[5]。
每個PCI外設都由一個總線號、一個設備號和一個功能號來標示,共有三個訪問空間,即內存空間、I/O端口和配置寄存器。PCI配置空間由256個字節(jié)組成,且每個設備功能都有一個配置空間,用于決定PCI器件的工作方式和映射到系統(tǒng)中的地址;竟δ芎瘮等缦拢
int pci_present(void) //檢查系統(tǒng)是否支持PCI
struct pci_dev //PCI設備的軟件對象
int pci_find_device(……)//尋找指定的PCI設備
int pci_find_class(……) //尋找指定的PCI屬類
int pci_read_config_byte(…..) //讀配置空間
int pci_write_config_byte(…..) //寫配置空間
下面通過添加系統(tǒng)的PCI設備驅動來介紹uClinux設備驅動的實現(xiàn)步驟:
1) 創(chuàng)建1個PCI設備,命令如下:
mknod pci_dev c 245 0
其中c表示字符設備,245表示主設備號,0代表次設備號。
2) 初始化外部設備,將函數pci_dev_init()添加到uClinux/linux/drivers/char/mem.c文件的chr_dev_init()中,chr_dev_init()將在系統(tǒng)啟動時被調用,會完成設備驅動的初始化工作:
/*修改file_operations數據結構*/
Struct file_operations pci_dev_fops={
read: pci_dev_read;
write:pci_dev_write;
open:pci_dev_open;
release:pci_dev_release;};
/*初始化PCI外部設備*/
Int pci_dev_init(void){
int result;
printk(“pci_dev_init()\n”);
/*設備注冊*/
result =
register_chrdev(245,”pci_dev”,&pci_dev_fops);}
3) 設備驅動文件pci_dev.c的編寫。設備注冊接口函數,中斷處理函數等構成了PCI設備驅動主要代碼。即file_operations中的函數。設備驅動與內核關系緊密,在編寫過程中需要注意庫函數的使用和I/O空間分配。在嵌入式系統(tǒng)編程過程中無法使用LibC提供的標準庫。I/O空間檢查。要根據S3C2510A的PCI配置寄存器所給定的基址來讀寫數據。因為PCI定義的I/O空間是32位地址空間,因此,內存和I/O可以使用相同的配置接口。
4) PCI設備的加載。
因為uClinux不支持設備驅動的動態(tài)加載,因此需要把驅動編譯到uClinux內核中,首先需修改makefile文件,添加下行:
obj_$(CONFIG_PCI_DEV) +=pci_dev.o
接著修改config.in,添加:
bool ‘pci_dev install‘ CONFIG_ PCI_DEV,
添加這行的目的是為了在配置目標板Linux系統(tǒng)內核時以便對這個設備進行選擇。
最后在目標系統(tǒng)的makefile中添加設備節(jié)點:
pci_dev,c,245,0
這樣在配置Linux內核時就可以選擇pci_dev install,然后進行編譯,這樣PCI設備驅動就加載到了uClinux系統(tǒng)中。
4. 小結
使用該主板和PCI接口視頻處理卡組成的視頻傳輸系統(tǒng)在局域網內進行視頻傳輸時畫面流暢、畫質清晰。帶有PCI接口的通用嵌入式主板的開發(fā)可以減少嵌入式系統(tǒng)的重復開發(fā),縮短開發(fā)周期。核心板和擴展接口板的設計使主板的應用更加方便、靈活,只需根據具體應用將不同的數據處理卡與該主板結合,便能構成不同的功能系統(tǒng),應用于各種具體需求。
參考文獻
[1] 李善平.劉文峰.王煥龍.Linux與嵌入式系統(tǒng)[M].北京:清華大學出版社,2003.1-4
[2] 李貴山, 威德虎. PCI局部總線開發(fā)者指南[M]. 西安:西安電子科技大學出版社, 1997
[3] snmsung electronics. S3C2510A 32bit RISC Microprocessor user’s manual[M], 2003.3, 43-47
[4] 李駒光.聶雪媛.江澤明.王兆衛(wèi).ARM應用系統(tǒng)開發(fā)詳解[M] .北京:清華大學出版社,2003.202-205
[5] Alessandro rubini, Jonathan corbet著,魏永明,駱剛, 姜軍譯.Linux 設備驅動程序(第2版)[M],中國電力出版社,2002.11 502-526
標簽:
傳動網版權與免責聲明:凡本網注明[來源:傳動網]的所有文字、圖片、音視和視頻文件,版權均為傳動網(surachana.com)獨家所有。如需轉載請與0755-82949061聯(lián)系。任何媒體、網站或個人轉載使用時須注明來源“傳動網”,違反者本網將追究其法律責任。
本網轉載并注明其他來源的稿件,均來自互聯(lián)網或業(yè)內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。
產品新聞
更多>2025-10-11
2025-10-09
2025-09-23
2025-09-23
2025-09-11
2025-09-08