版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、如何將新的應(yīng)用程序添加到uCLinux下假設(shè)新應(yīng)用程序名稱為app,操作步驟如下: 在uClinux-coldfire/user/目錄下增加一個新的目錄,并且將新的應(yīng)用程序源代碼復(fù)制到這個目錄下。該目錄下Makefile文件的編寫方式,可以參考其它已經(jīng)有的用戶程序,如tip下的Makefile,并作適當(dāng)修改。 修改uClinux-coldfire/venders/config.in文件,在該文件合適的位置增加下面一句:bool app CONFIG_USER_APP這樣,在Make config時,uCLinux就會提示你是否需要編譯這個新的應(yīng)用程序。 修改uClinux-coldfire/u
2、ser/Makefile文件,在該文件合適的位置增加下面一句:DIRS$(CONFIG_USER_APP) += app加上這句后,如果你在Make config時選擇了這個新應(yīng)用程序,則編譯時就會編譯這個新的應(yīng)用程序。 修改uCLinux-coldfire/romfs.mk文件,在該文件合適的位置增加下面一句BIN$(CONFIG_USER_ APP) += $(USER)/app/app這里假設(shè)新添加的應(yīng)用程序的可執(zhí)行文件名稱為app, 在user/app目錄下。加上這一句后,在最后編譯成的可執(zhí)行二進(jìn)制影象中,root文件系統(tǒng)的/bin/目錄下就會增加一個新的應(yīng)用程序app。如何設(shè)置目標(biāo)系
3、統(tǒng)的IP地址目標(biāo)系統(tǒng)的IP地址是在出廠時是固定的,為2,要想改變目標(biāo)系統(tǒng)的IP地址,例如改為4,有兩種方法一、在目標(biāo)系統(tǒng)上輸入下列命令:/ifconfig eth0 4 netmask up/route add -net eth0這樣就改變了目標(biāo)系統(tǒng)的IP地址。但是這種改變無法保存,復(fù)位或斷電再重新加電后系統(tǒng)仍然是原來的IP地址。二、修改源文件,重新編譯后將編譯好的內(nèi)核寫入Flash中,加電后重新啟動目標(biāo)系統(tǒng),這樣就改變了目標(biāo)系統(tǒng)的IP地址,而且這種改變是保存在Flash中的,不會因?yàn)閿嚯姸鴣G失。對于萬禾SOM5307A硬件平臺,需要修改的源文件有兩個。一個是uCLinux-coldfire/
4、venders/generic/big/rc,修改以下兩句:ifconfig eth0 2 netmask uproute add -net eth0其中,2要改為你需要的IP地址,也要相應(yīng)地修改為新的網(wǎng)絡(luò)地址。另外一個要修改的文件是uCLinux-coldfir/common.mk,修改其中一句:TARGET_IP = 2其中,2也要改為你需要的IP地址。修改完成后重新編譯內(nèi)核,最后用以下命令將新內(nèi)核通過串口傳送到目標(biāo)系統(tǒng)上并且寫入Flash:$cd /home/uCLinux-coldfire$make$make sloadf如何調(diào)試你的應(yīng)用程序主機(jī)和目標(biāo)系統(tǒng)之間一般通過以太網(wǎng)進(jìn)行通信,也
5、可使用串口。要調(diào)試某一個應(yīng)用程序,目標(biāo)系統(tǒng)首先運(yùn)行g(shù)dbserver,并且指定通信端口。例如,如果要調(diào)試目標(biāo)系統(tǒng)上的/bin/ping這個程序。首先在目標(biāo)系統(tǒng)上輸入下列命令啟動gdbserver:/gdbserver :3000 /bin/ping 參數(shù) 這里,3000是TCP端口號, 不要與其他應(yīng)用程序使用的網(wǎng)絡(luò)端口號重復(fù)就可以,/bin/ping是要調(diào)試的程序。目標(biāo)系統(tǒng)上輸入上述命令后,gdbserver處于就緒狀態(tài),等待與主機(jī)上調(diào)試器gdb進(jìn)行通信。然后在主機(jī)上運(yùn)行g(shù)db。WH5307SDK提供編譯好的GNU GDB 4.18版本,在uClinux-coldfire/tools/bin目
6、錄下,名稱為m68k-elf-gdb,在RedHat7.1下編譯和測試通過。另外在WH5307SDK光盤上還有GNU GDB 4.18版本的源程序。在主機(jī)上輸入下列命令:$/home/uCLinux-coldfire/tools/bin/m68k-elf-gdb ping.gdb出現(xiàn)gdb提示符后,輸入target remote 2:3000就可對應(yīng)用程序進(jìn)行調(diào)試,其中2是目標(biāo)系統(tǒng)的IP地址,3000是TCP端口號。如何在系統(tǒng)啟動后自動運(yùn)行用戶程序在嵌入式應(yīng)用中,一般需要在操作系統(tǒng)運(yùn)行起來后立刻運(yùn)行用戶的特定用戶程序,為此,需要修改root文件系統(tǒng)的/etc/rc文件,這是uClinux啟動S
7、hell后第一個運(yùn)行的腳本文件。以SOM5307A硬件平臺為例,/etc/rc文件是在編譯的過程中由uClinux-coldfire/vendors/Generic/big/rc復(fù)制而來的,假如我們需要在操作系統(tǒng)運(yùn)行起來后立刻運(yùn)行/bin/app這個應(yīng)用程序,只需要在文件uClinux-coldfire/vendors/Generic/big/rc最后加一行:/bin/app如果需要將該應(yīng)用程序在后臺運(yùn)行,則增加的這句應(yīng)該象這樣:/bin/app &將應(yīng)用程序移植到uCLinux下時需要注意的問題將應(yīng)用程序移植到uCLinux下時,需要注意有以下限制: uclibc中不帶有pthread庫,要
8、進(jìn)行多線程編程,只能選擇select函數(shù)。 uclinux系統(tǒng)中由于內(nèi)存管理的問題,沒有fork()函數(shù),用vfork()代替,即uclinux系統(tǒng)中沒有真正的fork,多進(jìn)程實(shí)際是使用vfork實(shí)現(xiàn)的,每次fork完一個進(jìn)程必須執(zhí)行exec,父進(jìn)程等待子進(jìn)程exec后才繼續(xù)運(yùn)行。 uCLinux所用的Libc庫不是一個全功能的庫,而是一個適合嵌入式應(yīng)用的功能有限的庫,對于一些不太常用的函數(shù)可能庫里沒有,需要用戶自己編寫。 堆棧(stack)有限制,現(xiàn)在堆棧大小限制在4K字節(jié),你可以用如下方法增加堆棧的大?。涸谑褂胑lf2flt工具軟件時加上-s參數(shù)。 除了以上限制需要注意,在uCLinux編
9、程和移植應(yīng)用程序與在標(biāo)準(zhǔn)Linux環(huán)境下的編程方法是一樣的。關(guān)于不同內(nèi)核版本間應(yīng)用程序移植的問題應(yīng)用程序的移植一般的和內(nèi)核版本是沒有任何關(guān)系的,當(dāng)然有的應(yīng)用程序是需要內(nèi)核支持的,例如pppd等。在2.0.38內(nèi)核和2.4內(nèi)核之間互移應(yīng)用程序,唯一要注意的就是Makefile的寫法: 其實(shí)區(qū)別就一句話,就是2.4下面,它把elf2flt作為gcc的一個參數(shù)一步完成了,而2.0.38還要分為兩步完成,體現(xiàn)在Makefile上就如下:對于2.0.38:$(LD) $(LDFLAGS) -o $.elf $(OBJS) $(LDLIBS)$(CONVERT)對于2.4.x:$(CC) $(LDFLAG
10、S) -o $ $(OBJS) $(LDLIBS)嵌入式Linux下彩色LCD驅(qū)動的設(shè)計與實(shí)現(xiàn) 嵌入式Linux下彩色LCD驅(qū)動的設(shè)計與實(shí)現(xiàn) PMT 許慶豐 2002年12月 摘 要:本文介紹了如何在嵌入在開發(fā)彩色LCD顯示驅(qū)動的方法,并對Linux中的顯示驅(qū)動程序結(jié)構(gòu)和框架作一介紹. 關(guān)鍵字:ARM,幀緩沖(Framebuffer),MC928MX1. 長期以來,在常見的掌上電腦(PDA)等小型手持式設(shè)備上,由于硬件條件等的限制,我們看到的顯示器件通常是單色LCD,用戶界面也非常簡單,幾乎看不到PC機(jī)上美觀整齊的圖形界面(GUI)支持.由于早期嵌入式處理器的速度有限,在處理圖形和多媒體數(shù)據(jù)方
11、面也顯得力不從心. 隨著高性能嵌入式處理器的普及和硬件成本的不斷降低,尤其是Arm系列處理器的推出,嵌入式系統(tǒng)的功能也越來越強(qiáng).在多媒體應(yīng)用的推動下,彩色LCD也越來越多地應(yīng)用到了嵌入式系統(tǒng)中,如新一代掌上電腦(PDA)多采用TFT顯示器件,支持彩色圖形界面,圖片顯示和視頻媒體播放.掌上電腦(PDA)的操作系統(tǒng)有微軟Window CE,PalmOS等.而Linux做為開放源代碼的操作系統(tǒng)也在市場中占據(jù)了一席之地.由于Linux成本低廉,任何人都可以得到其源代碼并在其基礎(chǔ)上進(jìn)行開發(fā),成為各家廠商極力發(fā)展的操作系統(tǒng),加上其核心小,潛力可觀. 在應(yīng)用需求的推動下,Linux下也出現(xiàn)了許多圖形界面軟件
12、包,如MiniGUI,Trolletech公司的Embedded QT等,其圖形界面及開發(fā)工具與Windows CE不相上下.在圖形軟件包的開發(fā)和移植工作中都牽扯到底層LCD的驅(qū)動問題.筆者參與了一個基于ARM9的PDA系統(tǒng)的開發(fā),用的是摩托羅拉公司龍珠系列的MC928MX1.軟件采用Linux 2.4.18平臺,編譯器為gcc的ARM交叉編譯器. 一. 硬件平臺 MC928MX1(以下簡稱MX1)是摩托羅拉公司基于ARM核心的第一款MCU,主要面向高端嵌入式應(yīng)用.內(nèi)部采用ARM920T內(nèi)核,并集成了SDRAM/Flash,LCD,USB,藍(lán)牙(bluetooth),多媒體閃存卡(MMC),C
13、MOS攝像頭等控制器. LCD控制器的功能是產(chǎn)生顯示驅(qū)動信號,驅(qū)動LCD顯示器.用戶只需要通過讀寫一系列的寄存器,完成配制和顯示控制.MX1中的LCD控制器可支持單色/彩色LCD顯示器.支持彩色TFT時,可提供4/8/12/16位顏色模式,其中16位顏色模式下可以顯示65536種顏色.配置LCD控制器重要的一步是指定顯示緩沖區(qū),顯示的內(nèi)容就是從緩沖區(qū)中讀出的,其大小由屏幕分辨率和顯示顏色數(shù)決定.在本例中,筆者采用的是夏普LQ035Q2DD54 TFT 顯示模塊,在240 x320分辨率下可提供16位彩色顯示. PMT版權(quán)所有 2002 Page 1嵌入式Linux下彩色LCD驅(qū)動的設(shè)計與實(shí)現(xiàn)
14、二. Linux下的設(shè)備驅(qū)動 Linux將設(shè)備分為最基本的兩大類,字符設(shè)備和塊設(shè)備.字符設(shè)備是以單個字節(jié)為單位進(jìn)行順序讀寫操作,通常不使用緩沖技術(shù),如鼠標(biāo)等,驅(qū)動程序?qū)崿F(xiàn)比較簡單;而塊設(shè)備則是以固定大小的數(shù)據(jù)塊進(jìn)行存儲和讀寫的,如硬盤,軟盤等.為提高效率,系統(tǒng)對于塊設(shè)備的讀寫提供了緩存機(jī)制,由于涉及緩沖區(qū)管理,調(diào)度,同步等問題,實(shí)現(xiàn)起來比字符設(shè)備復(fù)雜的多. Linux的設(shè)備管理是和文件系統(tǒng)解密結(jié)合的,各種設(shè)備名稱都以文件的形式存放在/dev目錄下,稱為設(shè)備文件.應(yīng)用程序可以打開,關(guān)閉,讀寫這些設(shè)備文件,完成對設(shè)備的操作,就象操作普通的數(shù)據(jù)文件一樣.為了管理這些設(shè)備,系統(tǒng)為設(shè)備編了號,每個設(shè)備號
15、又分為主設(shè)備號和次設(shè)備號.主設(shè)備號用來區(qū)分不同種類的設(shè)備,而次設(shè)備號用來區(qū)分同一類型的多個設(shè)備.對于常用設(shè)備,Linux有約定俗成的編號,如硬盤主設(shè)備號是3.在Linux的/dev/目錄下使用ls -l命令可察看個設(shè)備文件的設(shè)備號.例如,/dev/hda為塊設(shè)備,主設(shè)備號3,次設(shè)備號0,是系統(tǒng)的第一塊硬盤./dev/hd1主設(shè)備號3,次設(shè)備號1,為系統(tǒng)的第二塊硬盤.我們將要介紹的顯示設(shè)備也是一個設(shè)備文件/dev/fb,主設(shè)備號29.在編寫設(shè)備驅(qū)動程序的時候,也要指明所操作設(shè)備的主設(shè)備號和次設(shè)備號. Linux的特點(diǎn)之一,是為所有的文件,包括設(shè)備文件,提供了統(tǒng)一的操作函數(shù)接口,定義如下: str
16、uct file_operations struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *
17、, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (str
18、uct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *)
19、; ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); ; 結(jié)構(gòu)體中的成員為一系列的接口函數(shù),如用于讀/寫的read/ write函數(shù),用于控制的ioctl等.打開一個文件就是調(diào)用這個文件file_operations中的open操作.不同類型的文件有不同的file_o
20、perations成員函數(shù).如普通的磁盤數(shù)據(jù)文件,接口函數(shù)完成磁盤數(shù)據(jù)塊讀寫操作;而對于各種設(shè)備文件,則最終調(diào)用各自驅(qū)動程序中的I/O函數(shù)進(jìn)行具體設(shè)備的操PMT版權(quán)所有 2002 Page 2嵌入式Linux下彩色LCD驅(qū)動的設(shè)計與實(shí)現(xiàn) 作.這樣,應(yīng)用程序根本不用考慮操作的是設(shè)備還是普通文件,可一律當(dāng)作文件處理,具有非常清晰統(tǒng)一的I/O接口.所以file_operations是文件層次的I/O接口. 但是,由于外設(shè)的種類繁多,操作方式也各不相同.如聲音設(shè)備驅(qū)動要使用DMA通道,顯示設(shè)備驅(qū)動要提供對顯存的操作,硬盤驅(qū)動要處理復(fù)雜的緩沖區(qū)結(jié)構(gòu),網(wǎng)絡(luò)設(shè)備驅(qū)動和socket聯(lián)系緊密.如果file_op
21、erations中的函數(shù)都讓驅(qū)動程序的開發(fā)人員來寫,則就要處理大量的細(xì)節(jié),幾乎是不可能的.為了解決設(shè)備多樣性的問題,Linux采用了特殊情況特殊處理的辦法,為不同設(shè)備定義好了文件層次file_operations結(jié)構(gòu)中的接口函數(shù),其中處理了大多數(shù)設(shè)備相關(guān)的操作,如各種緩沖區(qū)的申請和釋放等等,而具體操作底層硬件的一小部分則留給開發(fā)人員.所以Linux另外提供一個文件層到底層驅(qū)動程序的接口,通常為一個結(jié)構(gòu)體,其中包含成員變量和函數(shù)指針.不同的設(shè)備驅(qū)動有不同的結(jié)構(gòu)體.這樣,一方面保證了文件層I/O接口file_operations的一致性,另一方面驅(qū)動程序的開發(fā)人員也不用了解太多細(xì)節(jié),只專著于硬件相
22、關(guān)的I/O操作就可以了.例如,一個有代表性的特殊設(shè)備是聲音設(shè)備,其文件層的file_operations定義如下: struct file_operations oss_sound_fops = owner: THIS_MODULE, llseek: sound_lseek, read: sound_read, write: sound_write, poll: sound_poll, ioctl: sound_ioctl, mmap: sound_mmap, open: sound_open, release: sound_release, ; 其中的sound_read,sound_wri
23、te等函數(shù)Linux都已提供,處理了與聲音設(shè)備相關(guān)的許多細(xì)節(jié),如DMA的申請,釋放和操作等.而文件層到驅(qū)動程序的接口為audio_driver結(jié)構(gòu),其中包含底層操作函數(shù).文件層的sound_read,sound_write會在需要時調(diào)用audio_driver中的函數(shù).開發(fā)人員只要編寫audio_driver中的函數(shù)就可以了,最大程度地減小了工作量.下面我們將看到,Linux為顯示設(shè)備提供的幀緩沖驅(qū)動也是這種文件層-驅(qū)動層的接口方式. 三. Linux的幀緩沖設(shè)備 幀緩沖(framebuffer)是Linux為顯示設(shè)備提供的一個接口,把顯存抽象后的一種設(shè)備,他允許上層應(yīng)用程序在圖形模式下直接對
24、顯示緩沖區(qū)進(jìn)行讀寫操作.這種操作是抽象的,統(tǒng)一的.用戶不必關(guān)心物理顯存的位置,換頁機(jī)制等等具體細(xì)節(jié).這些都是由Framebuffer設(shè)備驅(qū)動來完成的.幀緩沖驅(qū)動的應(yīng)用廣泛,在linux的桌面系統(tǒng)中,Xwindow服務(wù)器就是利用幀緩沖進(jìn)行窗口的繪制.尤其是通過幀緩沖可顯示漢字點(diǎn)陣,成為Linux漢化的唯一可行方案. 幀緩沖設(shè)備對應(yīng)的設(shè)備文件為/dev/fb*,如果系統(tǒng)有多個顯示卡,Linux下還可支持多個幀緩沖設(shè)備,最多可達(dá)32個,分別為/dev/fb0到/dev/fb31,而/dev/fb則為當(dāng)前缺省的幀緩沖設(shè)備,通常指向/dev/fb0.當(dāng)然在嵌入式系統(tǒng)中支持一個顯示設(shè)備就夠了.幀緩沖設(shè)備為
25、標(biāo)準(zhǔn)字符設(shè)備,主設(shè)備號為29,次設(shè)備號則從0到31.分別對應(yīng)/dev/fb0-/dev/fb31. PMT版權(quán)所有 2002 Page 3/dev/fb0 則將圖形文件tmp顯示在屏幕上. 2. 映射(map)操作:由于Linux工作在保護(hù)模式,每個應(yīng)用程序都有自己的虛擬地址空間,在應(yīng)用程序中是不能直接訪問物理緩沖區(qū)地址的.為此,Linux在文件操作 file_operations結(jié)構(gòu)中提供了mmap函數(shù),可將文件的內(nèi)容映射到用戶空間.對于幀緩沖設(shè)備,則可通過映射操作,可將屏幕緩沖區(qū)的物理地址映射到用戶空間的一段虛擬地址中,之后用戶就可以通過讀寫這段虛擬地址訪問屏幕緩沖區(qū),在屏幕上繪圖了.實(shí)際
26、上,使用幀緩沖設(shè)備的應(yīng)用程序都是通過映射操作來顯示圖形的.由于映射操作都是由內(nèi)核來完成,下面我們將看到,幀緩沖驅(qū)動留給開發(fā)人員的工作并不多. 3. I/O控制:對于幀緩沖設(shè)備,對設(shè)備文件的ioctl操作可讀取/設(shè)置顯示設(shè)備及屏幕的參數(shù),如分辨率,顯示顏色數(shù),屏幕大小等等.ioctl的操作是由底層的驅(qū)動程序來完成的. 在應(yīng)用程序中,操作/dev/fb的一般步驟如下: 1. 打開/dev/fb設(shè)備文件. 2. 用ioctrl操作取得當(dāng)前顯示屏幕的參數(shù),如屏幕分辨率,每個像素點(diǎn)的比特數(shù).根據(jù)屏幕參數(shù)可計算屏幕緩沖區(qū)的大小. 3. 將屏幕緩沖區(qū)映射到用戶空間. 4. 映射后就可以直接讀寫屏幕緩沖區(qū),進(jìn)
27、行繪圖和圖片顯示了. 典型程序段如下: #include int main() int fbfd = 0; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; long int screensize = 0; /*打開設(shè)備文件*/ fbfd = open(/dev/fb0, O_RDWR); /*取得屏幕相關(guān)參數(shù)*/ ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo); ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo); /*計算屏幕緩沖區(qū)大小*/ scre
28、ensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; /*映射屏幕緩沖區(qū)到用戶地址空間*/ fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED, fbfd, 0); /*下面可通過fbp指針讀寫緩沖區(qū)*/ PMT版權(quán)所有 2002 Page 4 嵌入式Linux下彩色LCD驅(qū)動的設(shè)計與實(shí)現(xiàn) 四. 幀緩沖驅(qū)動的編寫 幀緩沖設(shè)備屬于字符設(shè)備,與聲音設(shè)備一樣,也采用文件層-驅(qū)動層的接口方式.在文件層次上,Linux為其定義了 static struct file_
29、operations fb_fops = owner: THIS_MODULE, read: fb_read, /* 讀操作 */ write: fb_write, /* 寫操作 */ ioctl: fb_ioctl, /* 控制操作 */ mmap: fb_mmap, /* 映射操作 */ open: fb_open, /* 打開操作 */ release: fb_release, /* 關(guān)閉操作 */ ; 其中的成員函數(shù)都在文件linux/driver/video/fbmem.c中定義. 由于顯示設(shè)備的特殊性,在驅(qū)動層的接口中不但要包含底層函數(shù),還要有一些紀(jì)錄設(shè)備狀態(tài)的數(shù)據(jù).Linux為幀
30、緩沖設(shè)備定義的驅(qū)動層接口為struct fb_info結(jié)構(gòu),在include/linux/fb.h中定義.這個結(jié)構(gòu)比較長,限于篇幅,文章中就不全部列出了.幸運(yùn)的是,嵌入式系統(tǒng)要求的顯示操作比較簡單,只涉及到結(jié)構(gòu)中少數(shù)幾個成員,下面只對編寫驅(qū)動中要用到的幾個關(guān)鍵成員作一說明. fb_info中紀(jì)錄了幀緩沖設(shè)備的全部信息,包括設(shè)備的設(shè)置參數(shù),狀態(tài)以及操作函數(shù)指針.每一個幀緩沖設(shè)備都必須對應(yīng)一個fb_info結(jié)構(gòu).其中成員變量Modename為設(shè)備名稱,fontname為顯示字體,fbops為指向底層操作的函數(shù)的指針,這些函數(shù)是需要驅(qū)動程序開發(fā)人員編寫的.成員fb_var_screeninfo和 f
31、b_fix_screeninfo也是結(jié)構(gòu)體.其中fb_var_screeninfo記錄用戶可修改的顯示控制器參數(shù),包括屏幕分辨率和每個像素點(diǎn)的比特數(shù).fb_var_screeninfo中的xres定義屏幕一行有多少個點(diǎn), yres定義屏幕一列有多少個點(diǎn), bits_per_pixel定義每個點(diǎn)用多少個字節(jié)表示.而fb_fix_screeninfo中記錄用戶不能修改的顯示控制器的參數(shù),如屏幕緩沖區(qū)的物理地址,長度.當(dāng)對幀緩沖設(shè)備進(jìn)行映射操作的時候,就是從fb_fix_screeninfo中取得緩沖區(qū)物理地址的.上面所說的數(shù)據(jù)成員都是需要在驅(qū)動程序中設(shè)置的. 在了解了上面所述的概念后,編寫幀緩沖驅(qū)
32、動的實(shí)際工作并不復(fù)雜,需要做的工作是: 1. 編寫初始化函數(shù):初始化函數(shù)首先初始化LCD控制器,設(shè)置顯示模式和顯示顏色數(shù),然后分配LCD顯示緩沖區(qū).在Linux可通過kmalloc函數(shù)分配一片連續(xù)的空間.筆者采用的LCD顯示方式為240 x320,16位彩色.需要分配的顯示緩沖區(qū)為240 x320 x2 = 150k字節(jié),緩沖區(qū)通常分配在片外SDRAM中,起始地址保存在LCD控制器寄存器中. 最后是初始化一個fb_info結(jié)構(gòu),填充其中的成員變量,并調(diào)用register_framebuffer(&fb_info)將fb_info登記入內(nèi)核. 2. 編寫結(jié)構(gòu)fb_info中函數(shù)指針fb_ops對
33、應(yīng)的成員函數(shù):對于嵌入式系統(tǒng)的簡單實(shí)現(xiàn),只需要下列三個函數(shù)就可以了: struct fb_ops PMT版權(quán)所有 2002 Page 5嵌入式Linux下彩色LCD驅(qū)動的設(shè)計與實(shí)現(xiàn) . int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con, struct fb_info *info); int (*fb_get_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info); int (*fb_set_var)(struct fb_var_screeninfo *v
34、ar, int con,struct fb_info *info); . ; struct fb_ops在include/linux/fb.h中定義.這些函數(shù)都是用來設(shè)置/獲取fb_info結(jié)構(gòu)中的成員變量的.當(dāng)應(yīng)用程序?qū)υO(shè)備文件進(jìn)行Ioctl操作時候會調(diào)用它們,讀者可參考前文中的應(yīng)用程序例子.例如,對于fb_get_fix(),應(yīng)用程序傳入的是fb_fix_screeninfo結(jié)構(gòu),在函數(shù)中對其成員變量賦值,主要是smem_start(緩沖區(qū)起始地址)和smem_len(緩沖區(qū)長度),最終返回給應(yīng)用程序.而fb_set_var()函數(shù)的傳入?yún)?shù)是fb_var_screeninfo,函數(shù)中需要
35、對xres,yres,和bits_per_pixel賦值. 驅(qū)動程序編寫完成后,開發(fā)者可選擇將其編譯為動態(tài)加載模塊,或靜態(tài)地編譯入內(nèi)核中.由于篇幅所限,有關(guān)這方面的內(nèi)容請讀者參考相關(guān)驅(qū)動程序文檔. 五. 結(jié)束語 由于篇幅所限,本文中僅對幀緩沖設(shè)備驅(qū)動的基本原理和框架做了簡單介紹.幸運(yùn)的是,在Linux的發(fā)布版本中,包含了大量的設(shè)備驅(qū)動程序源代碼,其中drvers/video下提供了多種顯示卡的幀緩沖設(shè)備驅(qū)動程序程序,用戶自己的驅(qū)動程序可參考成熟的代碼編寫或直接修改得到. 參考資料 MC928MX1 User Manual Linux frame buffer driver howto 作者簡介
36、 許慶豐 Libo小組發(fā)起人.現(xiàn)任職于摩托羅拉半導(dǎo)體部,主要研究方向是嵌入式操作系統(tǒng)和應(yīng)用. Libo小組面向所有對嵌入式系統(tǒng)開發(fā)感興趣的人士,旨在促進(jìn)和推廣嵌入式系統(tǒng)的應(yīng)用,相關(guān)的開源技術(shù)及行業(yè)內(nèi)的交流.Libo在線討論組: /group/homepage.ecgi group_id=36725 PMT版權(quán)所有 2002 Page 6自己動手打造嵌入式Linux軟硬件開發(fā)環(huán)境 Linux和uClinux 1991年8月,芬蘭的一個學(xué)生在comp.os.minix新聞組貼上了以下這段話: 你好所有使用minix的人-我正在為386(486)AT做一個免費(fèi)的操作系統(tǒng)(只是為了愛好,不會象gnu那
37、樣很大很專業(yè). 這名學(xué)生就是Linus Torvalds, 而他所說的愛好就變成我們今天知道的Linux。 由于Linux的源代碼公布在互聯(lián)網(wǎng)上,可以免費(fèi)得到,因此從一開始就吸引了世界各地的UNIX 行家為Linux 編寫了大量的驅(qū)動程序和應(yīng)用軟件,在短短幾年時間里,Linux 就發(fā)展成為一個相當(dāng)完善的操作系統(tǒng),而且Linux支持的硬件平臺是所有操作系統(tǒng)中最多的,目前Linux支持硬件平臺:Intel的IA64、Compaq的Alpha、Sun的Sparc/Sparc64、SGI的Mips、IBM的S396、ARM、PowerPC等。Linux更大的影響在于它正逐漸地應(yīng)用于嵌入式設(shè)備,uCli
38、nux正是在這種氛圍下產(chǎn)生的。uClinux就是Micro-Control-Linux,它也是一個開放源碼的項目,uClinux的源代碼和開發(fā)工具可以免費(fèi)從上下載得到。 uClinux是專為那些沒有MMU(內(nèi)存管理單元)的嵌入式處理器開發(fā)的,和主流的Linux相比,uClinux有以下的特點(diǎn): 1簡化了內(nèi)核加載方式,uClinux的內(nèi)核可以在Flash上直接運(yùn)行:就是把uClinux的內(nèi)核的可執(zhí)行映象燒寫到flash上,系統(tǒng)啟動時從Flash的某個地址開始逐句執(zhí)行;也可以加載到內(nèi)存中運(yùn)行:把內(nèi)核的壓縮文件存放在Flash上,系統(tǒng)啟動時讀取壓縮文件在內(nèi)存里解壓,然后開始執(zhí)行。 2采用了romfs
39、文件系統(tǒng)作為root文件系統(tǒng):這種文件系統(tǒng)相對于一般的ext2文件系統(tǒng)要求更少的空間,首先內(nèi)核支持romfs文件系統(tǒng)比支持ext2文件系統(tǒng)需要更少的代碼,其次romfs文件系統(tǒng)相對簡單,建立文件系統(tǒng)superblock需要更少的存儲空間。Romfs文件系統(tǒng)不支持動態(tài)擦寫,對于系統(tǒng)需要動態(tài)保存的數(shù)據(jù)采用RAM盤的方法處理,RAM盤采用ext2文件系統(tǒng)。 3使用了Flat可執(zhí)行文件格式:elf格式有很大的文件頭,flat文件對文件頭和一些段信息做了簡化。 4重寫了應(yīng)用程序庫: uClibc對libc做了精簡,uClinux對用戶程序采用靜態(tài)連接的形式。 uClinux的開發(fā)環(huán)境 為uClinux提
40、供了GNU的交叉編譯器,包括以下組件:Gcc交叉編譯器,即在宿主機(jī)上開發(fā)編譯目標(biāo)上可運(yùn)行的二進(jìn)制文件;Binutils輔助工具,包括objdump、as、ld等;Gdb調(diào)試器。以在ARM7上開發(fā)uClinux為例: 1獲得uClinux-dist的源碼包,上定期為新推出的Linux內(nèi)核推出相應(yīng)的源碼包,最新的版本為Kernel-2.4.21,可以從/pub/uClinux/dist/ 上免費(fèi)下載得到。這個源碼包里包含了uCLinux-2.4.21、uClibc和已經(jīng)移植到uClinux下的用戶應(yīng)用程序。下載完后,會得到一個uClinux-dist-20030522.tar.gz的文件,把它保存
41、到/home目錄下,然后執(zhí)行:tar zxvf uClinux-dist-20030522.tar.gz,當(dāng)tar程序運(yùn)行完畢后,在/home目錄下會有一個/home/uClinux-dist的新目錄,這 個目錄就是uClinux的源碼根目錄,里面有進(jìn)行uClinux開發(fā)的所有的源代碼。 2獲得ARM開發(fā)工具,提供uClinux源碼的同時還提供相應(yīng)的交叉編譯工具。要在開發(fā)主機(jī)上為ARM7目標(biāo)系統(tǒng)編譯uClinux,還需要從/pub/uClinux/arm-elf-tools/ 上下載ARM交叉編譯器:arm-elf-tools-20030314.sh。得到這個文件以后,執(zhí)行以下命令:sh ar
42、m-elf-tools-20030314.sh,這個命令會在開發(fā)主機(jī)上自動建立一個uClinux-ARM的交叉編譯環(huán)境。鍵入arm-elf-gcc, 如果能看到下面的輸出信息: Reading specs from /usr/local/lib/gcc-lib/arm-elf/2.95.3/specsgcc version 2.95.3 20010315 (release) (ColdFire patches - 20010318 from /coldfire/)(uClinux XIP and shared lib patches from /) 表示uClinux-ARM的交叉編譯環(huán)境已經(jīng)
43、建立起來了。 現(xiàn)在開發(fā)主機(jī)里已經(jīng)有了uClinux的源代碼和編譯這些源代碼的工具,也可以用make menuconfig, make等命令來編譯uClinux和用戶程序,為ARM目標(biāo)板編譯了一個內(nèi)核映像文件,接下來要做得是需要一塊ARM7的開發(fā)板來運(yùn)行這個映像文件(關(guān)于如何編譯uClinux和用戶程序請參考www.uC上得相關(guān)文檔)。 構(gòu)建ARM7-uClinux開發(fā)板 uClinux只需要極少的硬件資源就可運(yùn)行起來,以ARM7TDMI為例,只需要以下硬件: 1CPU Samsung S3C4510B 2SDRAM 8M以上 3一個簡易的串口 42M Flash 5一個以太網(wǎng)接口(可選) 目前
44、各嵌入式微處理器的廠商在推出每款處理器的同時都會提供一個Demo板,供用戶來測試微處理器的性能。Samsung公司對S3C4510B處理器提供了一款SNDS100的Demo板。Demo板的原理圖可以從Samsung公司的網(wǎng)站上免費(fèi)下載,對這個原理圖作一些修改,只保留上面列出的5個部分,去掉其他多余的部分。修改以后的原理圖就是一個能夠運(yùn)行uClinux的ARM7目標(biāo)板原理圖,然后根據(jù)這個原理圖去加工幾張PCB板,焊上相應(yīng)的元件,一塊能運(yùn)行uClinux的ARM7開發(fā)板就做成了(這款開發(fā)板相應(yīng)得原理圖、PCB圖可以從上免費(fèi)下載得到)。 慢著,雖然這塊開發(fā)板已經(jīng)焊接完成,但目前它只是一堆電子零件的簡
45、單組合,要在它上面跑uClinux,還需要相應(yīng)的軟件來管理這些硬件。 前面提到uClinux可以從Flash中直接運(yùn)行,就是說可以將uClinux的映像文件直接燒寫到Flash中,然后上電,uClinux會從Flash中啟動嗎?是的,確實(shí)如此?,F(xiàn)在要做的就是如何將uClinux的內(nèi)核映像燒寫到Flash中。用寫入器將uClinux內(nèi)核映像寫入到Flash中,然后將Flash焊接到pcb板上或插到開發(fā)板的flash的插座上可以嗎?當(dāng)然可以,如果你有寫入器的話。不過,很少有人手里能有這種寫入器。我們需要的是一個廉價的Flash寫入方案。用JTAG,S3C4510B上集成了一個JTAG,通過JTAG
46、我們可以控制S3C4510B上所有管腳,這樣可以通過向JTAG接口輸入相應(yīng)的指令和數(shù)據(jù),用軟件的方法在S3C4510B的數(shù)據(jù)、地址和控制總線上產(chǎn)生出Flash器件的讀寫操作時序,將uClinux的內(nèi)核映像文件燒寫到Flash中(關(guān)于S3C4510B的JTAG接口電纜的制作和下載燒寫uClinux映像文件到Flash中的程序可執(zhí)行文件和源代碼請參閱上相關(guān)內(nèi)容)。 終于將uClinux的映像文件燒寫到Flash中了,用一根串口電纜將ARM7開發(fā)板和開發(fā)主機(jī)的Com1口連接起來,從網(wǎng)上下載一個tip程序,執(zhí)行這個命令: tip l /dev/ttyS0 s 19200 等屏幕上顯示 connecte
47、d.以后,將ARM7開發(fā)板的電源接通。如果夠幸運(yùn)的話,你應(yīng)該看到下面的信息: Linux version 2.4.20-uc0 (rootdailzh) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from /coldfire/) (uClinux XIP and shared lib patches from /) 一 5月19 23:44:11 CST 2003 Processor: Samsung S3C4510B revision 6 Architecture: SNDS100 On node 0
48、 totalpages: 4096 zone(0): 0 pages. zone(1): 4096 pages. zone(2): 0 pages. Kernel command line: root=/dev/rom0 Calibrating delay loop. 49.76 BogoMIPS Command: cat /etc/motd Welcome to uC For further information check: / uClinux在ARM7目標(biāo)板上已經(jīng)運(yùn)行起來了,鍵入熟悉的ls命令,看有什么輸出。 通過JTAG接口燒寫uClinux映像文件到Flash中速度太慢,調(diào)試uCl
49、inux內(nèi)核非常不方便,有沒有其他的方法?有,uClinux除了可以從Flash中直接運(yùn)行外,還可以加載到內(nèi)存中運(yùn)行。我們來為ARM7開發(fā)板寫一個Bootloader,Bootloader的作用是初始化ARM7開發(fā)板,然后通過以太網(wǎng)接口將uClinux映像下載到內(nèi)存中,然后從內(nèi)存中運(yùn)行uClinux。這種方法下載uClinux內(nèi)核映像只需要10幾秒,適合于開發(fā)階段經(jīng)常修改uClinux內(nèi)核時使用(Bootloader for ARM7的源代碼可以從 上下載得到)。調(diào)試完uClinux的內(nèi)核以后,可以再通過JTAG接口燒寫uClinux映像文件到Flash中,這樣又可以直接從Flash中運(yùn)行調(diào)試好的uClinux了。 uClinux下用戶程序的開發(fā)和調(diào)試 現(xiàn)在ARM7開發(fā)板可以運(yùn)行uClinux了,如何開發(fā)uClinux下的應(yīng)用程序呢?和在普通計算機(jī)上開發(fā)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版維修改造施工合同
- 二零二五年度高壓開關(guān)設(shè)備采購及調(diào)試合同
- 二零二五年電力公司運(yùn)維檢修人員勞動合同范本3篇
- 2025年度核電站設(shè)備安裝施工合同協(xié)議3篇
- 二零二五年度醫(yī)療設(shè)備租賃與維修一體化服務(wù)合同3篇
- 2025年度新型電子商務(wù)平臺安全協(xié)議應(yīng)用指南合同3篇
- 2024聘用至退休合同續(xù)簽書:醫(yī)療行業(yè)專家續(xù)聘6篇
- 2025年晚會現(xiàn)場安全保衛(wèi)及應(yīng)急預(yù)案合同3篇
- 2025版出租車轉(zhuǎn)租與車輛租賃及新能源車輛推廣服務(wù)合同3篇
- 2025年度林木采伐安全與生態(tài)補(bǔ)償合同4篇
- 第二章 運(yùn)營管理戰(zhàn)略
- 《三本白皮書》全文內(nèi)容及應(yīng)知應(yīng)會知識點(diǎn)
- 專題14 思想方法專題:線段與角計算中的思想方法壓軸題四種模型全攻略(解析版)
- 醫(yī)院外來器械及植入物管理制度(4篇)
- 圖像識別領(lǐng)域自適應(yīng)技術(shù)-洞察分析
- 港口與港口工程概論
- 《念珠菌感染的治療》課件
- 新概念英語第二冊考評試卷含答案(第49-56課)
- 商業(yè)倫理與企業(yè)社會責(zé)任(山東財經(jīng)大學(xué))智慧樹知到期末考試答案章節(jié)答案2024年山東財經(jīng)大學(xué)
- 【奧運(yùn)會獎牌榜預(yù)測建模實(shí)證探析12000字(論文)】
- (完整版)譯林版英語詞匯表(四年級下)
評論
0/150
提交評論