基于S3C2440的U-Boot开机logo的设计与实现
2011-06-09刘青山
袁 帅,杨 著,刘青山
(西南科技大学 计算科学与技术学院,四川 绵阳 621010)
随着科技进步以及多媒体应用的推动下,LCD被广泛应用到嵌入式相关产品中,从而提高用户视觉体验效果。本设计基于S3C2440处理器为硬件平台,通过在U-Boot中的添加LCD驱动并实现开机logo功能,通过验证表明,该设计可为开发者提供友好的调试信息,并为用户提供友好的开机界面。
1 系统总体结构
系统采用S3C2440为主控处理器,该处理器是基于ARM920T的32位嵌入式微处理器,具有低功耗,高性能等特点,被广泛应用于嵌入式设备中[1]。文中结合S3C2440处理器的特点,同时对U-Boot的体系结构、启动流程进行深入分析,并根据LCD图形显示原理完成基于U-Boot的相关硬件设备驱动程序,最终实现基于S3C2440的U-Boot开机logo的设计与实现。
2 U-Boot分析
Bootloader是在操作系统启动前运行的一段用于对硬件设备进行初始化的程序,该程序为内存空间建立映射图,并为操作系统的启动配置相关环境等工作。
2.1 U-Boot简介
U-Boot(Universal Boot Loader)是由 DENX 小组开发的遵循GPL条款的开源程序,其主要工作包括对硬件设备初始化、操作系统代码搬运等。同时,U-Boot还支持多种嵌入式操作系统以及多种类型的处理器,并具有较高的可靠性和稳定性,而且丰富的设备驱动程序以及开发文档,强大的网络技术支持等,为嵌入式软件开发提高效率[2]。
2.2 U-Boot启动分析
U-Boot通过两个阶段分别实现硬件设备初始化和操作系统的引导启用功能。而系统启动的入口点是通过在文件uboot.lds中指定,并在编译过程中将入口点通知编译器,通过文件中的ENTRY(_start)指出程序从_start开始运行,其具体指向的是start.o(即start.s生成的目标文件)文件。在系统加电后,根据指定地址取出第一条指令并运行,通过这种方式实现U-Boot的引导启动。
第一阶段的启动代码主要包含在start.s文件中,该阶段首先对中断向量表进行设置,将CPU模式置为管理模式(svc),关闭看门狗,设置时钟频率(对 FCLK,HCLK,PCLK三者之间的比例进行设置),设置寄存器等工作,如图1所示;其次,为使系统获得更快的执行速度,U-Boot会将自己从非易失性存储器搬移到 RAM中执行启动,如图2所示;最后,分配堆栈空间,设置堆栈指针,清零BSS,并通过指令ldr pc,_start_armboot实现跳转,从而完成U-Boot第一阶段启动工作。完成对处理器相关的初始化工作后,系统通过调用lib_arm/board.c中的start_armboot函数进入第二阶段。该阶段为U-Boot的主体部分,但为了提高程序的可读性和可移植性,该阶段的代码通过C语言来完成对设备的进一步初始化工作,主要包括对Flash设备的初始化,内存分配,并对硬件设备进行初始化等任务。完成一系列初始化工作后,程序引导进入while主循环,等待用户选择系统启动模式,如果用户选择进入下载模式,将接受从终端输入的命令并执行,否则直接调用预先设置的环境参数bootcmd,根据设置的参数引导操作系统的启动,流程如图3所示。
图1 U-Boot第一阶段启动流程Fig.1 The first stage of boot process for U-Boot
图2 U-Boot内存分布图Fig.2 U-Boot memory map
图3 U-Boot第二阶段启动流程Fig.3 The second stage of boot process for U-Boot
3 U-Boot开机Logo实现
3.1 系统开发环境
系统采用32位的嵌入式RISC微处理器S3C2440,其主频最高可达533 MHz,并拥有丰富的片上资源:4通道DMA,4通道脉宽调制定时器,8通道10位的A/D控制器及触摸屏接口等。其中,处理器上的LCD控制器可用于传输视频数据并产生必要的控制信号(如VFRAME、VLINE、VCLK、VM等),而视频数据输出是通过端口[1]VD[23:0]。
3.2 LCD控制原理
LCD能够正常显示图像或文字信息,需要LCD驱动器和控制器两者的支持。其中,LCD驱动器是以COF/COG的形式与LCD玻璃基板制作在一起;而LCD控制器[4]则是由外部电路来实现,通过LCD控制器就可以产生LCD驱动器所需要的控制信号,并利用这些控制信号来控制STN/TFT屏的显示。
在S3C2440处理器内部已经集成有LCD控制器,其结构如图4所示。该处理器主要由 REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成。其中,REGBANK寄存器由17个可编程的寄存器组以及一块256×16的调色板内存组成,用于配置LCD控制器;LCDCDMA寄存器是一个专用的DMA,DMA通道主要实现视频在不需要CPU的干预下直接显示到LCD屏上;VIDPRCS寄存器用于接收从LCDCDMA中传递的视频数据,并将数据转换为合适的数据格式,最后通过数据输出端口VD[23:0]将视频数据传送到LCD显示屏;TIMEGEN寄存器由可编程的逻辑单元组成,用于生成LCD驱动器所需要的VSYNC、HSYNC、VCLK和 LEND等控制信号,而这些控制信号又与REGBANK寄存器组中的LCDCON1/2/3/4/5的配置密切相关,通过不同的配置,TIMEGEN就能产生不同的信号形态,从而实现对不同的LCD设备的支持[3-5]。
3.3 驱动开发
要实现基于U-Boot的开机logo,首先需要对不同的LCD显示屏开发相应的驱动程序。根据U-Boot中文件管理方式,与显示屏相关的驱动程序均放在目录drivers/video/下,在该文件夹中添加本设计需要的驱动文件s3c2440_fb.c。在文件中通过调用函数void*video_hw_init(void)检测系统显示屏型号,并对检测到的设备进行相关的初始化,包括通过环境变量获取图像显示模式(videomode)、设置显示模式、计算水平同步信号宽度 (HSYNCH)和垂直同步脉冲宽度(VSYNCH)、对图像硬件设备所依赖的结构体进行初始化,以及设置BPP(图像的每个像素值所需要的位数,bits_per_pixel)等,主要初始化过程及核心代码如下:
图4 S3C2440 LCD控制器结构Fig.4 S3C2440 LCD controller block diagram
1)计算 HSYNCH和VSYNCH:
2)硬件设备初始化
3)分辨率设置
3.4 模式设置
模式设置用于确定LCD分辨率及工作模式,根据对LCD屏的时序分析设置适当的时钟信号,从而实现在固定的场、行周期内显示完整画面,使显示分辨率达到最好效果;同时结合行、场同步信号时序,设置水平、垂直起始位置及显示区域等信息,从而使LCD能正确显示有效数据。因此,结合LCD数据手册在文件videomodes.c中添加显示模式选项:
其中 le、ri、up、lo、hs、vs分别根据硬件特性设置为 HBPD(horizontal back porch, 对 应 驱 动 中 的 left_margin)、HFPD(horizontal front porth, 对 应 驱 动 中 的 right_margin)、VBPD(vertical back porch, 对 应 驱 动 中 的 upper_margin)、VFBD(vertical front porch, 对 应 驱 动 中 的 lower_margin)、HSPW(horizontal sync pulse width,对应驱动中的 hsync_len)、VSPW(vertical sync pulse width,对应驱动中的 vsync_len)[6]。
3.5 功能测试
在U-Boot中实现硬件设备驱动以及相关的配置程序后,重新编译U-Boot,并将生成的二进制文件下载到实验平台,上电后在显示屏左上角可看到显示的denx.bmp图片,即实现基于U-Boot的开机logo功能。这里所使用的默认图片位于路径tools/logos/中,当需要采用其它图片作为开机logo时,只需要将denx.bmp文件替换为需要的图片并重新编译即可。
4 结束语
通过在U-Boot添加开机logo方便开发者了解系统启动过程,也为用户提供友好的开机界面。同时,在需要对开机logo进行修改时,只需要对相应的图片进行替换并编译,不再使用其他的转换工具对图片进行处理,或重新配置相关的程序源文件,因此,方便开机logo的修改。
[1]宣言,曾连荪.基于ARM的真彩LCD驱动程序设计[J].电脑知识与技术,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系统的LCD驱动实现[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的船舶导航系统设计[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.