您的位置:首页 > 编程语言 > Go语言

u-boot显示logo

2015-03-12 18:37 218 查看
经过个人实践一下两种方法都可以实现:

首先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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: