u-boot显示logo

经过个人实践一下两种方法都可以实现:


首先lcd驱动必须能正常运行,想确定是不是正常,就看uboot启动时能不能显示默认的logo。

#define CONFIG_LCD

其次想在u-boot里面显示图片,图片格式必须是bmp的,最开始阶段u-boot是没有图片解码的。

将一个图片制作成8位bmp的格式,例如logo.bmp。


1、在板级头文件中加入配置选项

//支持BMP命令
#define CONFIG_CMD_BMP
//支持BMP命令
#define CONFIG_BMP_8BPP
这里是让u-boot支持bmp命令

u-boot-2009.08/lib_arm/board.c的函数start_armboot()是系统的启动流程,在系统和外设的初始化之后,执行以下程序,就可以显示Logo

// 使能串口Flash
run_command("sf probe 1", 0 );	
// 从串口Flash中Logo的存储地址读BMP数据到RAM
run_command("sf read 70800000 100000 40000", 0 );	
// 调用u-boot的BMP命令显示Logo
run_command("bmp display 70800000 400 320", 0 );	

将准备好的logo.bmp图片拷贝到spi-flash的100000处,编译下载完成后,重新启动就能显示logo了

优点:便于修改,想换图片只需要将另外一张图片拷贝到指定的地方就可以了

缺点:当图片过大时,显示出来会看到它是一点点的刷新出来的。


2、板级头文件中加入配置

#define CONFIG_VIDEO_MX5
#define CONFIG_SPLASH_SCREEN
将logo.bmp的数据拷贝到fsl_bmp_600x400.c中。

在板级文件中添加

void setup_splash_image(void)
{
	char *s;
	ulong addr;
	s = getenv("splashimage");

	if (s != NULL) {
		addr = simple_strtoul(s, NULL, 16);
#if 0
#if defined(CONFIG_ARCH_MMU)
		addr = ioremap_nocache(iomem_to_phys(addr),
				fsl_bmp_600x400_size);
#endif
		memcpy((char *)addr, (char *)fsl_bmp_600x400,
				fsl_bmp_600x400_size);
		printf("setup_splash_image 0x%8x\n",addr);
	}
#else
#if defined(CONFIG_ARCH_MMU)
		addr = ioremap_nocache(iomem_to_phys(addr),
				fsl_bmp_800x600_size);
#endif
		memcpy((char *)addr, (char *)fsl_bmp_800x600,
				fsl_bmp_800x600_size);
	}
#endif
}
这里是将图片拷贝到了指定的地址中。

将重新编译生成的u-boot文件烧录到设备中,启动后在uboot中设置环境变量

setenv splashimage '0x97c90000'
//设置图片存储地址
setenv splashpos '0,0'
//设置图片显示的位置
setenv lvds_num 0
//设置lvds设备号
保存重启就能显示logo了。

优点:logo显示速度快,不用刷新显示

缺点:要先将图片数据写到文件中,不方便修改,而且会导致uboot文件变大


液晶屏上显示logo:

首先要使能LCD,#defien CONFIG_LCD,因为mx53_loco已经有lcd驱动的支持

我们要做的就是点亮液晶和调节pwm的亮度

void lcd_enable(void)
{
	char *s;
	int ret;
	unsigned int reg;
	s = getenv("lvds_num");
	di = simple_strtol(s, NULL, 10);

	printf("Lcd_enable *** %d\n",di);
	/*
	* hw_rev 2: IPUV3DEX
	* hw_rev 3: IPUV3M
	* hw_rev 4: IPUV3H
	*/
	g_ipu_hw_rev = IPUV3_HW_REV_IPUV3M;

	/* 20KHz PWM wave, 50% duty */
	if (di == 1) {
		imx_pwm_config(pwm1, 25000, 50000);
		imx_pwm_enable(pwm1);
	} else {
        <span style="white-space:pre">	</span>imx_pwm_config(pwm0, 25000, 50000);
		imx_pwm_enable(pwm0);
	}
	mxc_request_iomux(MX53_PIN_GPIO_1, IOMUX_CONFIG_ALT4);

    <span style="white-space:pre">	</span>ret = ipuv3_fb_init(&lvds_svga, di, IPU_PIX_FMT_RGB24,
			DI_PCLK_LDB, 65000000);
	if (ret)
		puts("LCD cannot be configured\n");


	reg = readl(CCM_BASE_ADDR + CLKCTL_CSCMR2);
	reg &= ~0xFC000000;
	reg |= 0xB4000F00;
	writel(reg, CCM_BASE_ADDR + CLKCTL_CSCMR2);

	reg = readl(CCM_BASE_ADDR + CLKCTL_CCGR6);
	reg |= 0xF0000000;
	writel(reg, CCM_BASE_ADDR + CLKCTL_CCGR6);

	if (di == 1)
        writel(0x4AB, IOMUXC_BASE_ADDR + 0x8);
	else
        writel(0x2A9, IOMUXC_BASE_ADDR + 0x8);
<span style="white-space:pre">	</span>//GPIO_9是pwm的引脚,配置成pwm功能脚
	mxc_request_iomux(MX53_PIN_GPIO_9, IOMUX_CONFIG_ALT4);
	mxc_iomux_set_pad(MX53_PIN_GPIO_9, 0x1E4);
<span style="white-space:pre">	</span>//GPIO_8是LCD背光控制脚,配置成GPIO模式并设置输出电平1
//    udelay(1000*50);     
	mxc_request_iomux(MX53_PIN_GPIO_8, IOMUX_CONFIG_ALT1);
	mxc_iomux_set_pad(MX53_PIN_GPIO_8, 0x1E4);

     <span style="white-space:pre">	</span>
	reg = readl(GPIO1_BASE_ADDR + 0x0);
    <span style="white-space:pre">	</span>reg |= 0x100;
	writel(reg, GPIO1_BASE_ADDR + 0x0);

	// Set pin direction as output
	reg = readl(GPIO1_BASE_ADDR + 0x4);
	reg |= 0x100;
	writel(reg, GPIO1_BASE_ADDR + 0x4);

}




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值