当前位置: 首页 > news >正文

ARM+LINUX移植攻略(十)支持东华 3.5寸LCD输出console信息和BMP图片、logo

哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2011/02/19/6194637.aspx

由于linux启动代码,仍然出现乱码,而我将启动信息输出到lcd就没有乱码。暂时这个问题还没有解决,lcd其实早已完成,今天整理下,再解决那个问题。

下面是我绘制的主要的lcd驱动调用流程图。start_armboot()lib_arm/board.c中,stdio_init()common/stdio.cdrv_video_init(),video_init(),video_logo (),video_fb_address()在drivers/video/cfb_console.c中,video_hw_init()drivers/video/s3c2410_fb.c中,board_video_init()board/samsung/TE2440II/TE2440II.c

最终调用了board_video_init()函数,这个函数由我们自己来编写,由于以前写过裸机的lcd程序,所以时序就可以直接拿来用,不用调了,哈哈。在这个函数中主要还是对那5lcd的控制寄存器进行初始化。这里要注意根据不同的屏,进行x,y的调整,我用的是东华WXCAT35-TG3#001,主要就是初始化一个GraphicDevice *pGD结构体。

#define MVAL (0) #define MVAL_USED (0) //0=each frame 1=rate by MVAL #define INVVDEN (0) //0=normal 1=inverted #define BSWP (0) //Byte swap control #define HWSWP (0) //Half word swap control //TFT 240320 #define LCD_XSIZE_TFT_240320 (320) #define LCD_YSIZE_TFT_240320 (240) //TFT240320 #define HOZVAL_TFT_240320 (LCD_XSIZE_TFT_240320-1) #define LINEVAL_TFT_240320 (LCD_YSIZE_TFT_240320-1) //Timing parameter for WXCAT35-TG3#001" #define VBPD_240320 (3) #define VFPD_240320 (5) #define VSPW_240320 (15) #define HBPD_240320 (58) #define HFPD_240320 (15) #define HSPW_240320_WXCAT35 (8) //Adjust the horizontal displacement of the screen #define CLKVAL_TFT_240320 (7) //FCLK=405MHz,HCLK=101.25MHz,VCLK=4602272Hz void board_video_init(GraphicDevice *pGD) { S3C24X0_LCD * const lcd = S3C24X0_GetBase_LCD(); S3C2410_NAND * const nand = S3C2410_GetBase_NAND(); /* FIXME: select LCM type by env variable */ /* Configuration for GTA01 LCM on QT2410 */ lcd->LCDCON1 = 0x00000778; /* CLKVAL=7, BPPMODE=16bpp, TFT, ENVID=0 */ lcd->LCDCON2 = (VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320); lcd->LCDCON3 = (HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320); lcd->LCDCON4 = (MVAL<<8)|(HSPW_240320_WXCAT35); lcd->LCDCON5 = 0x00000f09; lcd->LPCSEL = 0x00000000; }

明白上边的流程后一切变得很简单,只要根据自己的屏调整好时序就行了。添加一个驱动文件这个是一个外国的牛人已经写好的。在drivers/video/下添加s3c2410_fb.c。代码如下:

/* * (C) Copyright 2006 by OpenMoko, Inc. * Author: Harald Welte <laforge@openmoko.org> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ #include <common.h> #if defined(CONFIG_VIDEO_S3C2410) #include <video_fb.h> #include "videomodes.h" #include <s3c2410.h> /* * Export Graphic Device */ GraphicDevice smi; #define VIDEO_MEM_SIZE 0x200000 /* 240x320x16bit = 0x25800 bytes */ extern void board_video_init(GraphicDevice *pGD); /******************************************************************************* * * Init video chip with common Linux graphic modes (lilo) */ void *video_hw_init (void) { S3C24X0_LCD * const lcd = S3C24X0_GetBase_LCD(); GraphicDevice *pGD = (GraphicDevice *)&smi; int videomode; unsigned long t1, hsynch, vsynch; char *penv; int tmp, i, bits_per_pixel; struct ctfb_res_modes *res_mode; struct ctfb_res_modes var_mode; // unsigned char videoout; /* Search for video chip */ printf("Video: "); tmp = 0; videomode = CFG_SYS_DEFAULT_VIDEO_MODE; /* get video mode via environment */ if ((penv = getenv ("videomode")) != NULL) { /* deceide if it is a string */ if (penv[0] <= '9') { videomode = (int) simple_strtoul (penv, NULL, 16); tmp = 1; } } else { tmp = 1; } if (tmp) { /* parameter are vesa modes */ /* search params */ for (i = 0; i < VESA_MODES_COUNT; i++) { if (vesa_modes[i].vesanr == videomode) break; } if (i == VESA_MODES_COUNT) { printf ("no VESA Mode found, switching to mode 0x%x ", CFG_SYS_DEFAULT_VIDEO_MODE); i = 0; } res_mode = (struct ctfb_res_modes *) &res_mode_init[vesa_modes[i]. resindex]; bits_per_pixel = vesa_modes[i].bits_per_pixel; } else { res_mode = (struct ctfb_res_modes *) &var_mode; bits_per_pixel = video_get_params (res_mode, penv); } /* calculate hsynch and vsynch freq (info only) */ t1 = (res_mode->left_margin + res_mode->xres + res_mode->right_margin + res_mode->hsync_len) / 8; t1 *= 8; t1 *= res_mode->pixclock; t1 /= 1000; hsynch = 1000000000L / t1; t1 *= (res_mode->upper_margin + res_mode->yres + res_mode->lower_margin + res_mode->vsync_len); t1 /= 1000; vsynch = 1000000000L / t1; /* fill in Graphic device struct */ sprintf (pGD->modeIdent, "%dx%dx%d %ldkHz %ldHz", res_mode->xres, res_mode->yres, bits_per_pixel, (hsynch / 1000), (vsynch / 1000)); printf ("%s\n", pGD->modeIdent); pGD->winSizeX = res_mode->xres; pGD->winSizeY = res_mode->yres; pGD->plnSizeX = res_mode->xres; pGD->plnSizeY = res_mode->yres; switch (bits_per_pixel) { case 8: pGD->gdfBytesPP = 1; pGD->gdfIndex = GDF__8BIT_INDEX; break; case 15: pGD->gdfBytesPP = 2; pGD->gdfIndex = GDF_15BIT_555RGB; break; case 16: pGD->gdfBytesPP = 2; pGD->gdfIndex = GDF_16BIT_565RGB; break; case 24: pGD->gdfBytesPP = 3; pGD->gdfIndex = GDF_24BIT_888RGB; break; } /* statically configure settings */ pGD->winSizeX = pGD->plnSizeX = 320; pGD->winSizeY = pGD->plnSizeY = 240; pGD->gdfBytesPP = 2; pGD->gdfIndex = GDF_16BIT_565RGB; pGD->frameAdrs = LCD_VIDEO_ADDR; pGD->memSize = VIDEO_MEM_SIZE; board_video_init(pGD); lcd->LCDSADDR1 = pGD->frameAdrs >> 1; /* This marks the end of the frame buffer. */ lcd->LCDSADDR2 = (lcd->LCDSADDR1&0x1fffff) + (pGD->winSizeX+0) * pGD->winSizeY; lcd->LCDSADDR3 = (pGD->winSizeX & 0x7ff); /* Clear video memory */ memset((void *)pGD->frameAdrs, 0, pGD->memSize); /* Enable Display */ lcd->LCDCON1 |= 0x01; /* ENVID = 1 */ return ((void*)&smi); } void video_set_lut (unsigned int index, /* color number */ unsigned char r, /* red */ unsigned char g, /* green */ unsigned char b /* blue */ ) { } #endif /* CONFIG_VIDEO_S3C2410 */

在你的配置头文件中添加如下宏定义:

#define CONFIG_CMD_BMP #define CONFIG_VIDEO #define CONFIG_VIDEO_S3C2410 #define CONFIG_VIDEO_LOGO #define VIDEO_FB_16BPP_PIXEL_SWAP #define CONFIG_VIDEO_SW_CURSOR #define CONFIG_VIDEO_BMP_LOGO

这样就基本完成了,重新启动一下是不是就显示出samsunglogo了。如果先改成自己喜欢的图片,修改tools/logos/denx.bmp,记住一定是是8bppbmp图,修改Makefile文件,修改/tools目录下的Makefile文件,大约是44~46行,

ifeq ($(LOGO_BMP),) LOGO_BMP= logos/denx.bmp endif
denx.bmp 替换为你需要显示的 logo图片的文件名,保存退出,重新编译 uboot。图片的转化方法,在终端输入命令:
jpegtopnm $1 | ppmquant 31 | ppmtobmp -bpp 8 > $2
使用方法: (脚本名) ( 待处理的 JPG图片名) (输出文件名)

这样就可以显示出你自己喜欢的logo图片了。

如果想将串口的打印信息显示在lcd上,添加环境变量。

#define CONFIG_EXTRA_ENV_SETTINGS \ "stdin=serial\0" \ "stdout=vga" \ "stderr=serial\0" \

只要让stdout等于vga就可以了。在lib_arm/board.c文件中可以看到console_init初始化两次,我们修改的影响第二次的初始化,第一次的不影响,所以还会有部分输出信息显示在串口上的。Lcd就到这里,有什么问题我再及时改正吧。

相关文章:

  • 字符串截取函数slice, substring, substr
  • ARM+LINUX移植攻略(十二)U-boot-2009.08利用tftp服务下载内核和利用nfs服务挂载nfs文件系统...
  • 快速排序(转)
  • Windows Phone 7 不温不火学习之《Expression Blend 创建渐变效果和创建Storyboard动画》...
  • DelphiXE8FMX工程实现无边框托动(发送消息)
  • Vue 响应式总结
  • Iphone开发中的两个小bug,1.调用camera时的内存警告导致view自动upload,2,Not enough frames in stack....
  • 自己动手做计算机-计算机科学的本质
  • angularjs 中使用 service 在controller 之间 share 对象和数据
  • 流媒体技术学习笔记之(八)海康、大华IpCamera RTSP地址和格式
  • Linux也需要GALGAME:wine跑GALGAME测试
  • 用CSS3创建旋转载入器
  • SpringMvc @InitBinder 表单多对象精准绑定接收
  • 与cache相关的一些问题和思考
  • Hibernate-延迟加载和立即加载
  • 自己简单写的 事件订阅机制
  • Apache的80端口被占用以及访问时报错403
  • flutter的key在widget list的作用以及必要性
  • HTML-表单
  • Java,console输出实时的转向GUI textbox
  • JavaScript函数式编程(一)
  • Laravel 中的一个后期静态绑定
  • node-glob通配符
  • React的组件模式
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • use Google search engine
  • yii2中session跨域名的问题
  • 从0实现一个tiny react(三)生命周期
  • 对超线程几个不同角度的解释
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 鱼骨图 - 如何绘制?
  • 怎么把视频里的音乐提取出来
  • 转载:[译] 内容加速黑科技趣谈
  • No resource identifier found for attribute,RxJava之zip操作符
  • 函数计算新功能-----支持C#函数
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (003)SlickEdit Unity的补全
  • (1)Android开发优化---------UI优化
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (排序详解之 堆排序)
  • (一)UDP基本编程步骤
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .net 4.0发布后不能正常显示图片问题
  • .Net MVC4 上传大文件,并保存表单
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET开发者必备的11款免费工具
  • .project文件
  • @AliasFor注解
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @RequestMapping用法详解
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ Linux Audio 篇 ] 音频开发入门基础知识