基于嵌入式硬件平臺的劃片機視覺系統(tǒng)設計
S3C2510 ARM處理器,內部PCI(MINI-PCI)&PC Card控制器符合PCI總線規(guī)范2.2版本,將S3C2510的PCI(MINI-PCI)&PC Card控制器設置為PCI Host工作模式(見表1),具有32bit地址/數(shù)據復用總線,支持非線性傳輸和突發(fā)傳輸,最高數(shù)據傳輸速度可以達到264 MB/s及66 MHz(132 MB/s及33 MHz)。而且?guī)в械刂纷儞Q機制,可以將內部的PCI總線地址映射到內存或者外圍設備。在設計中設定PCI總線的時鐘頻率為66 MHz,因此主板上PCI總線的最高傳輸速度可以達到264 MB/s,能夠滿足數(shù)據的快速傳輸。系統(tǒng)利用時鐘反饋來彌補PCI的時鐘延遲。

當PCI控制器工作在PCI HOST、模式下時,其時鐘源是由系統(tǒng)內部提供的,S3C2510有3個PCI時鐘輸出信號PCICLK1,PCICLK2和PCILK3,將PCI設備診斷寄存器PCIDIAG0的DC3位設置為l,即將PCICLK3設置為輸出無效,此時PCICLK1與PCICLK3相連,通過PCICLK3將時鐘信號反饋給處理器內核,這樣可以使外部PCI設備與PCI時鐘保持一致,從而彌補時鐘延遲。
系統(tǒng)以及PCI控制器的啟動順序如圖4所示。其中在對PCI控制器的特殊功能寄存器進行配置時需要首先關閉中斷,即設置PCIINTEN=0。然后設置PCI控制和狀態(tài)寄存器PCICON[ARB,ATS,SPL,IOP,MMP],某些需要的情況下還要設置PCI診斷寄存器,這個寄存器是針對測試功能的,在PCMCIA Host工作模式下不需要進行設置。然后要對與基地址有關的寄存器PCIBAM0~l和PCI-BATPA0~2進行設計,設置完之后要配置有關PCI重啟和時鐘的寄存器,其中關鍵的一步是設置PCI重啟和時鐘寄存器PCIRCC[MSK]=0,這是為了防止重啟信號和時鐘信號的沖突。

在PCI控制器偵測外圍設備并初始化外圍設備的寄存器時,需要完成以下工作:
(1)讀取所有的配置寄存器值,包括PCIHID,PCIHSC,PCIHSSID等;
(2)檢查BAR(Backup Address Register)的范圍并一一分配空間;
(3)使能外部設備并激活總線。
以上配置都是在PCI圖像采集模塊的驅動中完成的,因為已經把驅動程序加載到了ARM Linux的內核中,所以系統(tǒng)啟動之后,操作系統(tǒng)會自動配置PCI外部設備。
3 ARM Linux移植和設備驅動實現(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相當于一個小型的Linux系統(tǒng),其工作涉及到硬件系統(tǒng)的初始化、存儲空間分配等,在設計過程中主要完成了以下工作,相關的程序編寫根據U-Boot提供的例程來完成:
(1)修改Makefile配置文件,添加針對目標板的編譯命令行;
(2)在CPU目錄下建立arm940t目錄,主要包括中斷設置函數(shù)代碼interrupts9c,系統(tǒng)入口函數(shù)start.S,CPU相關代碼文件cpu.c以及串口初始化代碼相關文件serial.c等;
(3)在Board目錄下建立S3C2510目錄,主要包括FLASH初始化代碼flash.c,連接器文件u-boot.1ds,內存分配代碼MEMSetup.S等;
(4)編寫配置文件,即:include/configs/s3c25 l0.h,對寄存器的定義等系統(tǒng)配置,大部分工作是參考S3C25l0的數(shù)據手冊來進行的;
(5)編寫flash.c文件,根據使用的AMD的NOR Flash來編寫Flash的驅動,包括flash芯片的型號,打印信息,容量大小,flash擦除函數(shù)等;
(6)修改SDRAM的大小,修改配置文件in-clude/configs/s3c25 10.h 中 的 #define PHYS _SDRAM_ SIZE值。其大小是根據實際應用中SDRAM的大小來確定;
(7)修改串口參數(shù)文件serial.C。主要是設置串口波特率,波特率計算公式為:RUBRDIVO=((int)(MCLK/16./(gd_>baudrate)+0.5)-1);
(8)修改start.S文件,一個可執(zhí)行的Image必須有一個入口點并且只能有一個唯一的全局入口,修改start.S中的.globl _start _start:使其放在Rom(flash)的0×0地址。編譯U-Boot,通過Jtag口下載到目標板進行調試。
評論