袁 帥,楊 著,劉青山
(西南科技大學(xué) 計(jì)算科學(xué)與技術(shù)學(xué)院,四川 綿陽 621010)
隨著科技進(jìn)步以及多媒體應(yīng)用的推動下,LCD被廣泛應(yīng)用到嵌入式相關(guān)產(chǎn)品中,從而提高用戶視覺體驗(yàn)效果。本設(shè)計(jì)基于S3C2440處理器為硬件平臺,通過在U-Boot中的添加LCD驅(qū)動并實(shí)現(xiàn)開機(jī)logo功能,通過驗(yàn)證表明,該設(shè)計(jì)可為開發(fā)者提供友好的調(diào)試信息,并為用戶提供友好的開機(jī)界面。
系統(tǒng)采用S3C2440為主控處理器,該處理器是基于ARM920T的32位嵌入式微處理器,具有低功耗,高性能等特點(diǎn),被廣泛應(yīng)用于嵌入式設(shè)備中[1]。文中結(jié)合S3C2440處理器的特點(diǎn),同時(shí)對U-Boot的體系結(jié)構(gòu)、啟動流程進(jìn)行深入分析,并根據(jù)LCD圖形顯示原理完成基于U-Boot的相關(guān)硬件設(shè)備驅(qū)動程序,最終實(shí)現(xiàn)基于S3C2440的U-Boot開機(jī)logo的設(shè)計(jì)與實(shí)現(xiàn)。
Bootloader是在操作系統(tǒng)啟動前運(yùn)行的一段用于對硬件設(shè)備進(jìn)行初始化的程序,該程序?yàn)閮?nèi)存空間建立映射圖,并為操作系統(tǒng)的啟動配置相關(guān)環(huán)境等工作。
U-Boot(Universal Boot Loader)是由 DENX 小組開發(fā)的遵循GPL條款的開源程序,其主要工作包括對硬件設(shè)備初始化、操作系統(tǒng)代碼搬運(yùn)等。同時(shí),U-Boot還支持多種嵌入式操作系統(tǒng)以及多種類型的處理器,并具有較高的可靠性和穩(wěn)定性,而且豐富的設(shè)備驅(qū)動程序以及開發(fā)文檔,強(qiáng)大的網(wǎng)絡(luò)技術(shù)支持等,為嵌入式軟件開發(fā)提高效率[2]。
U-Boot通過兩個(gè)階段分別實(shí)現(xiàn)硬件設(shè)備初始化和操作系統(tǒng)的引導(dǎo)啟用功能。而系統(tǒng)啟動的入口點(diǎn)是通過在文件uboot.lds中指定,并在編譯過程中將入口點(diǎn)通知編譯器,通過文件中的ENTRY(_start)指出程序從_start開始運(yùn)行,其具體指向的是start.o(即start.s生成的目標(biāo)文件)文件。在系統(tǒng)加電后,根據(jù)指定地址取出第一條指令并運(yùn)行,通過這種方式實(shí)現(xiàn)U-Boot的引導(dǎo)啟動。
第一階段的啟動代碼主要包含在start.s文件中,該階段首先對中斷向量表進(jìn)行設(shè)置,將CPU模式置為管理模式(svc),關(guān)閉看門狗,設(shè)置時(shí)鐘頻率(對 FCLK,HCLK,PCLK三者之間的比例進(jìn)行設(shè)置),設(shè)置寄存器等工作,如圖1所示;其次,為使系統(tǒng)獲得更快的執(zhí)行速度,U-Boot會將自己從非易失性存儲器搬移到 RAM中執(zhí)行啟動,如圖2所示;最后,分配堆??臻g,設(shè)置堆棧指針,清零BSS,并通過指令ldr pc,_start_armboot實(shí)現(xiàn)跳轉(zhuǎn),從而完成U-Boot第一階段啟動工作。完成對處理器相關(guān)的初始化工作后,系統(tǒng)通過調(diào)用lib_arm/board.c中的start_armboot函數(shù)進(jìn)入第二階段。該階段為U-Boot的主體部分,但為了提高程序的可讀性和可移植性,該階段的代碼通過C語言來完成對設(shè)備的進(jìn)一步初始化工作,主要包括對Flash設(shè)備的初始化,內(nèi)存分配,并對硬件設(shè)備進(jìn)行初始化等任務(wù)。完成一系列初始化工作后,程序引導(dǎo)進(jìn)入while主循環(huán),等待用戶選擇系統(tǒng)啟動模式,如果用戶選擇進(jìn)入下載模式,將接受從終端輸入的命令并執(zhí)行,否則直接調(diào)用預(yù)先設(shè)置的環(huán)境參數(shù)bootcmd,根據(jù)設(shè)置的參數(shù)引導(dǎo)操作系統(tǒng)的啟動,流程如圖3所示。
圖1 U-Boot第一階段啟動流程Fig.1 The first stage of boot process for U-Boot
圖2 U-Boot內(nèi)存分布圖Fig.2 U-Boot memory map
圖3 U-Boot第二階段啟動流程Fig.3 The second stage of boot process for U-Boot
系統(tǒng)采用32位的嵌入式RISC微處理器S3C2440,其主頻最高可達(dá)533 MHz,并擁有豐富的片上資源:4通道DMA,4通道脈寬調(diào)制定時(shí)器,8通道10位的A/D控制器及觸摸屏接口等。其中,處理器上的LCD控制器可用于傳輸視頻數(shù)據(jù)并產(chǎn)生必要的控制信號(如VFRAME、VLINE、VCLK、VM等),而視頻數(shù)據(jù)輸出是通過端口[1]VD[23:0]。
LCD能夠正常顯示圖像或文字信息,需要LCD驅(qū)動器和控制器兩者的支持。其中,LCD驅(qū)動器是以COF/COG的形式與LCD玻璃基板制作在一起;而LCD控制器[4]則是由外部電路來實(shí)現(xiàn),通過LCD控制器就可以產(chǎn)生LCD驅(qū)動器所需要的控制信號,并利用這些控制信號來控制STN/TFT屏的顯示。
在S3C2440處理器內(nèi)部已經(jīng)集成有LCD控制器,其結(jié)構(gòu)如圖4所示。該處理器主要由 REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器組成。其中,REGBANK寄存器由17個(gè)可編程的寄存器組以及一塊256×16的調(diào)色板內(nèi)存組成,用于配置LCD控制器;LCDCDMA寄存器是一個(gè)專用的DMA,DMA通道主要實(shí)現(xiàn)視頻在不需要CPU的干預(yù)下直接顯示到LCD屏上;VIDPRCS寄存器用于接收從LCDCDMA中傳遞的視頻數(shù)據(jù),并將數(shù)據(jù)轉(zhuǎn)換為合適的數(shù)據(jù)格式,最后通過數(shù)據(jù)輸出端口VD[23:0]將視頻數(shù)據(jù)傳送到LCD顯示屏;TIMEGEN寄存器由可編程的邏輯單元組成,用于生成LCD驅(qū)動器所需要的VSYNC、HSYNC、VCLK和 LEND等控制信號,而這些控制信號又與REGBANK寄存器組中的LCDCON1/2/3/4/5的配置密切相關(guān),通過不同的配置,TIMEGEN就能產(chǎn)生不同的信號形態(tài),從而實(shí)現(xiàn)對不同的LCD設(shè)備的支持[3-5]。
要實(shí)現(xiàn)基于U-Boot的開機(jī)logo,首先需要對不同的LCD顯示屏開發(fā)相應(yīng)的驅(qū)動程序。根據(jù)U-Boot中文件管理方式,與顯示屏相關(guān)的驅(qū)動程序均放在目錄drivers/video/下,在該文件夾中添加本設(shè)計(jì)需要的驅(qū)動文件s3c2440_fb.c。在文件中通過調(diào)用函數(shù)void*video_hw_init(void)檢測系統(tǒng)顯示屏型號,并對檢測到的設(shè)備進(jìn)行相關(guān)的初始化,包括通過環(huán)境變量獲取圖像顯示模式(videomode)、設(shè)置顯示模式、計(jì)算水平同步信號寬度 (HSYNCH)和垂直同步脈沖寬度(VSYNCH)、對圖像硬件設(shè)備所依賴的結(jié)構(gòu)體進(jìn)行初始化,以及設(shè)置BPP(圖像的每個(gè)像素值所需要的位數(shù),bits_per_pixel)等,主要初始化過程及核心代碼如下:
圖4 S3C2440 LCD控制器結(jié)構(gòu)Fig.4 S3C2440 LCD controller block diagram
1)計(jì)算 HSYNCH和VSYNCH:
2)硬件設(shè)備初始化
3)分辨率設(shè)置
模式設(shè)置用于確定LCD分辨率及工作模式,根據(jù)對LCD屏的時(shí)序分析設(shè)置適當(dāng)?shù)臅r(shí)鐘信號,從而實(shí)現(xiàn)在固定的場、行周期內(nèi)顯示完整畫面,使顯示分辨率達(dá)到最好效果;同時(shí)結(jié)合行、場同步信號時(shí)序,設(shè)置水平、垂直起始位置及顯示區(qū)域等信息,從而使LCD能正確顯示有效數(shù)據(jù)。因此,結(jié)合LCD數(shù)據(jù)手冊在文件videomodes.c中添加顯示模式選項(xiàng):
其中 le、ri、up、lo、hs、vs分別根據(jù)硬件特性設(shè)置為 HBPD(horizontal back porch, 對 應(yīng) 驅(qū) 動 中 的 left_margin)、HFPD(horizontal front porth, 對 應(yīng) 驅(qū) 動 中 的 right_margin)、VBPD(vertical back porch, 對 應(yīng) 驅(qū) 動 中 的 upper_margin)、VFBD(vertical front porch, 對 應(yīng) 驅(qū) 動 中 的 lower_margin)、HSPW(horizontal sync pulse width,對應(yīng)驅(qū)動中的 hsync_len)、VSPW(vertical sync pulse width,對應(yīng)驅(qū)動中的 vsync_len)[6]。
在U-Boot中實(shí)現(xiàn)硬件設(shè)備驅(qū)動以及相關(guān)的配置程序后,重新編譯U-Boot,并將生成的二進(jìn)制文件下載到實(shí)驗(yàn)平臺,上電后在顯示屏左上角可看到顯示的denx.bmp圖片,即實(shí)現(xiàn)基于U-Boot的開機(jī)logo功能。這里所使用的默認(rèn)圖片位于路徑tools/logos/中,當(dāng)需要采用其它圖片作為開機(jī)logo時(shí),只需要將denx.bmp文件替換為需要的圖片并重新編譯即可。
通過在U-Boot添加開機(jī)logo方便開發(fā)者了解系統(tǒng)啟動過程,也為用戶提供友好的開機(jī)界面。同時(shí),在需要對開機(jī)logo進(jìn)行修改時(shí),只需要對相應(yīng)的圖片進(jìn)行替換并編譯,不再使用其他的轉(zhuǎn)換工具對圖片進(jìn)行處理,或重新配置相關(guān)的程序源文件,因此,方便開機(jī)logo的修改。
[1]宣言,曾連蓀.基于ARM的真彩LCD驅(qū)動程序設(shè)計(jì)[J].電腦知識與技術(shù),2009,5(8):2023-2025.XUAN Yan, ZENG Lian-sun.Based on ARM’s true color LCD driver design[J].Computer Knowledge and Technology,2009,5(8):2023-2025.
[2]DENX.The DENX U-Boot and Linux Guide (DULG)for canyonlands[EB/OL]. (2010-10)[2010-10-1].http://www.denx.de/wiki/DULG/Manual.
[3]宮莉莉,趙勇.基于嵌入式Linux系統(tǒng)的LCD驅(qū)動實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2008,24(12-2):1-3.GONG Li-li,ZHAO Yong.Implementation of LCD driver based on embedded Linux [J].Microcomputer Information,2008,24(12-2):1-3.
[4]Samsung semiconductor. S3C2440A 32-Bit CMOS Microcontroller User’s Manual[EB/OL]. (2004)[2010-8-12].http://www.docin.com/p-24716747.htm l.
[5]黃勇亮.基于嵌入式S3C2440的船舶導(dǎo)航系統(tǒng)設(shè)計(jì)[J].微計(jì)算機(jī)信息,2008,24(4-2):134-136,154.HUANG Yong-liang.Design of steamboat navigation system based on embest S3C2440 [J].Microcomputer Information,2008,24(4-2):134-136,154.
[6]Innolux Display Corporation.LCD Module Specification[EB/OL]. (2007-05-11)[2010-9-5].http://www.elecfans.com/soft/softdown.asp?softid=13151.