第十九章、TIny4412 U-BOOT移植十九 LCD移植

发布者:满足的36号最新更新时间:2022-01-28 来源: eefocus关键字:TIny4412  U-BOOT移植  LCD移植 手机看文章 扫描二维码
随时随地手机看文章

其实我一直就只想学一点东西,当时心太大了,就直接买了Tiny4412,才发现这是一块硬骨头,网上资料少的可怜,FriendlyARM给的资料基本就是代码,说明性、讲原理的东西也没有。看了好久才发现其给的U-BOOT是不带LCD显示功能的,我就想给这个U-BOOT增加LCD显示功能,我所有的学习过程,都是为了增加LCD功能而开展的。这一篇虽然也有参考别人成份,但绝大多数内容都是我最近这段时间分析U-BOOT后,也进行相关裸机程序后(裸机代码的实现我有一篇相关的说明文档),有了一定的感觉,才顺利完成的。

下面依据《s5pv-u -boot-2011.06之增加LCD显示功能》的实现过程,来说明一下:我增加LCD功能的过程。

 

《s5pv-u-boot-2011.06之增加LCD显示功能》上说,其主要完成 U-Boot 层可以在 LCD 上显示字符,而且对于软件分层的 U-Boot 来说,只要将底层驱动移植过来并调整好初始化参数就可以在LCD上显示console。下图17-1是LCD 驱动软件分层执行流程示意。可以看到 LCD 在执行时最终调用的是底层的 board_video_init() 函数,其主要作用是对 LCD控制寄存器进行初始化。可由用户根据实际 LCD 硬件编写。

这个功能的移植修改了5 个文件。


图19-1、LCD 驱动软件分层执行流程示意


废话不多说,开始按步骤说明吧:

我用的U-Boot代码就是光盘中FriendlyARM提供的uboot_tiny4412-20130729.tgz。我的所有编辑操作都是在windows环境下,应用sourcein sight等工具进行的,最后才到linux环境下面进行编译。

第一步:增加底层头文件

复制LCD裸机程序下的字库文件,font_8x16.h,font_10x18.h,font_sun12x22.h到uboot_tiny4412-lcdinclude下,这三个字库文件是从Linux源码下提取出来的。具体说明可参看我裸机LCD程序说明文档。

接着,在uboot_tiny4412-lcdinclude目录下添加一个驱动程序所需的头文件,文件名为zth_tiny4412_lcd.h,此文件是从我的LCD裸机程序里复制过来的。zth_tiny4412_lcd.h内容如下,大家可以将其粘贴过去。

/****************************************

NAME:LCD.h

TRAD:

PROJECT:

CREATER:Zhang Taohua

DATA:2014-06-07

MAIL :zthvivid@163.com

DESCRIPTION:

 *****************************************/

 

#ifndef __LCD_H

#define __LCD_H

 

extern void lcd_init(void);

extern void lcd_draw_pixel(introw, int col, int color);

extern void lcd_clear_screen(intcolor);

extern void lcd_draw_hline(introw, int col1, int col2, int color);

extern void lcd_draw_vline(intcol, int row1, int row2, int color);

extern void lcd_draw_cross(introw, int col, int halflen, int color);

extern void led_blink(intlink_times);  

extern void delay(unsigned longcount);

extern void draw_point(int x, inty, int r, int g, int b);

//extern void memset_int(unsignedint * s, int c,unsigned int count);

extern void lcd_draw_bmp(constunsigned char gImage_bmp[]);

extern voidlcd_draw_char(unsigned char c);

 

#define readb(a)                   (*(volatile unsigned char*)(a))

#define readw(a)                  (*(volatile unsigned short*)(a))

#define readl(a)                    (*(volatile unsigned int*)(a))

 

#define writeb(v,a)        (*(volatile unsigned char *)(a) = (v))

#define writew(v,a)              (*(volatile unsigned short *)(a) =(v))

#define writel(v,a)         (*(volatile unsigned int *)(a) = (v))

 

//FONT

//#define FONT8_16  1

//#define FONT10_18 1

#define FONT12_22  1

 

#define FONT_STATIC_ROW 8

 

#if FONT8_16

#define FONT_ROW 8

#define FONT_COL 16

#endif

 

#if FONT10_18

#define FONT_ROW 10

#define FONT_COL  18

#endif

 

#if FONT12_22 

#define FONT_ROW 12

#define FONT_COL  22

#endif

 

//PICTURE

#define PICTURE_WIDTH

#define PICTURE_HEIGHT

 

//LCD Clock Relate Register

#define CLK_DIV_LCD (*(volatileunsigned int *)0x1003c534)

#define CLK_SRC_MASK_LCD(*(volatile unsigned int *)0x1003c334)

#define CLK_GATE_IP_LCD(*(volatile unsigned int *)0x1003c934)

#define CLK_SRC_LCD0 (*(volatileunsigned int *)0x1003c234)

 

//Framer Buffer Address And Size

 

//#define LCD_VIDEO_ADDR     (0x54000000)    

//#define        VIDEO_MEM_SIZE 0x200000        /* 800x480x24bit =0X119400 bytes */

 

//LED IO Control Regiester

#define GPM4CON      (*(volatile unsigned long *) 0x110002E0)

#define GPM4DAT        (*(volatile unsigned long *) 0x110002E4)

//LCD OP Control Regiester

#define GPF0CON        (*(volatile unsigned int *)0x11400180)

#define GPF0DAT         (*(volatile unsigned int *)0x11400184)

#define GPF0PUD        (*(volatile unsigned int *)0x11400188)

#define GPF0DRV        (*(volatile unsigned int *)0x1140018C)

 

#define GPF1CON       (*(volatile unsigned int *)0x114001a0)

#define GPF1DAT       (*(volatileunsigned int *)0x114001a4)

#define GPF1PUD        (*(volatile unsigned int *)0x114001a8)

#define GPF1DRV        (*(volatile unsigned int *)0x114001ac)

 

#define GPF2CON        (*(volatile unsigned int *)0x114001c0)

#define GPF2DAT       (*(volatileunsigned int *)0x114001c4)

#define GPF2PUD        (*(volatile unsigned int *)0x114001c8)

#define GPF2DRV        (*(volatile unsigned int *)0x114001cc)

 

#define GPF3CON       (*(volatile unsigned int *)0x114001e0)

#define GPF3DAT       (*(volatileunsigned int *)0x114001e4)

#define GPF3PUD        (*(volatile unsigned int *)0x114001e8)

#define GPF3DRV        (*(volatile unsigned int *)0x114001ec)

 

#define LCDBLK_CFG (*(volatileunsigned int *)0x10010210)

#define LCDBLK_CFG2 (*(volatileunsigned int *)0x10010214)

 

//LCD Control Register

#define LCD_BASE 0x11C00000

 

#define VIDCON0        (*(volatile unsigned int *)(LCD_BASE +0x0000))

#define VIDCON1        (*(volatile unsigned int *)(LCD_BASE +0x0004))

#define VIDCON2        (*(volatile unsigned int *)(LCD_BASE +0x0008))

#define VIDCON3        (*(volatile unsigned int *)(LCD_BASE +0x000C))

#define VIDTCON0      (*(volatile unsigned int *)(LCD_BASE +0x0010))

#define VIDTCON1      (*(volatile unsigned int *)(LCD_BASE +0x0014))

#define VIDTCON2      (*(volatile unsigned int *)(LCD_BASE +0x0018))

#define VIDTCON3      (*(volatile unsigned int *)(LCD_BASE +0x001C))

#define WINCON0       (*(volatile unsigned int *)(LCD_BASE +0x0020))

#define WINCON1       (*(volatile unsigned int *)(LCD_BASE +0x0024))

#define WINCON2       (*(volatile unsigned int *)(LCD_BASE +0x0028))

#define WINCON3       (*(volatile unsigned int *)(LCD_BASE + 0x002C))

#define WINCON4       (*(volatile unsigned int *)(LCD_BASE +0x0030))

#define SHADOWCON       (*(volatile unsigned int *)(LCD_BASE +0x0034))

#define WINCHMAP2 (*(volatile unsigned int *)(LCD_BASE + 0x003C))

#define VIDOSD0A      (*(volatile unsigned int *)(LCD_BASE +0x0040))

#define VIDOSD0B      (*(volatile unsigned int *)(LCD_BASE +0x0044))

#define VIDOSD0C      (*(volatile unsigned int *)(LCD_BASE +0x0048))

#define VIDOSD1A      (*(volatile unsigned int *)(LCD_BASE +0x0050))

#define VIDOSD1B      (*(volatile unsigned int *)(LCD_BASE +0x0054))

#define VIDOSD1C      (*(volatile unsigned int *)(LCD_BASE +0x0058))

#define VIDOSD1D     (*(volatile unsigned int *)(LCD_BASE +0x005C))

#define VIDOSD2A      (*(volatile unsigned int *)(LCD_BASE +0x0060))

#define VIDOSD2B      (*(volatile unsigned int *)(LCD_BASE +0x0064))

#define VIDOSD2C      (*(volatile unsigned int *)(LCD_BASE +0x0068))

#define VIDOSD2D     (*(volatile unsigned int *)(LCD_BASE +0x006C))

#define VIDOSD3A      (*(volatile unsigned int *)(LCD_BASE +0x0070))

#define VIDOSD3B      (*(volatile unsigned int *)(LCD_BASE +0x0074))

#define VIDOSD3C      (*(volatile unsigned int *)(LCD_BASE +0x0078))

#define VIDOSD4A      (*(volatile unsigned int *)(LCD_BASE +0x0080))

#define VIDOSD4B      (*(volatile unsigned int *)(LCD_BASE +0x0084))

#define VIDOSD4C      (*(volatile unsigned int *)(LCD_BASE +0x0088))

#define VIDW00ADD0B0    (*(volatile unsigned int *)(LCD_BASE +0x00A0))

#define VIDW00ADD0B1    (*(volatile unsigned int *)(LCD_BASE +0x00A4))

#define VIDW00ADD0B2    (*(volatile unsigned int *)(LCD_BASE +0x20A0))

#define VIDW01ADD0B0    (*(volatile unsigned int *)(LCD_BASE +0x00A8))

#define VIDW01ADD0B1    (*(volatile unsigned int *)(LCD_BASE +0x00AC))

#define VIDW01ADD0B2    (*(volatile unsigned int *)(LCD_BASE +0x20A8))

#define VIDW02ADD0B0    (*(volatile unsigned int *)(LCD_BASE +0x00B0))

#define VIDW02ADD0B1    (*(volatile unsigned int *)(LCD_BASE +0x00B4))

#define VIDW02ADD0B2    (*(volatile unsigned int *)(LCD_BASE +0x20B0))

#define VIDW03ADD0B0    (*(volatile unsigned int *)(LCD_BASE + 0x00B8))

#define VIDW03ADD0B1    (*(volatile unsigned int *)(LCD_BASE +0x00BC))

#define VIDW03ADD0B2    (*(volatile unsigned int *)(LCD_BASE +0x20B8))

#define VIDW04ADD0B0    (*(volatile unsigned int *)(LCD_BASE +0x00C0))

#define VIDW04ADD0B1    (*(volatile unsigned int *)(LCD_BASE +0x00C4))

#define VIDW04ADD0B2    (*(volatile unsigned int *)(LCD_BASE +0x20C0))

#define VIDW00ADD1B0    (*(volatile unsigned int *)(LCD_BASE +0x00D0))

#define VIDW00ADD1B1    (*(volatile unsigned int *)(LCD_BASE +0x00D4))

#define VIDW00ADD1B2    (*(volatile unsigned int *)(LCD_BASE +0x20D0))

#define VIDW01ADD1B0    (*(volatile unsigned int *)(LCD_BASE +0x00D8))

#define VIDW01ADD1B1    (*(volatile unsigned int *)(LCD_BASE +0x00DC))

#define VIDW01ADD1B2    (*(volatile unsigned int *)(LCD_BASE +0x20D8))

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
关键字:TIny4412  U-BOOT移植  LCD移植 引用地址:第十九章、TIny4412 U-BOOT移植十九 LCD移植

上一篇:第十八章:Android LCD(四):LCD驱动调试篇
下一篇:第十一章、Tiny4412 U-BOOT移植十一 DDR3简单介绍

推荐阅读最新更新时间:2024-11-19 05:16

Tiny4412中断控制器(GIC)之SGI软中断
//对于多核可以参考三星官方提供的linux源码,uboot中只是用了单核。 //下面代码只是用一个cpu核,采用SGI中断方式自己发自己收。 #include regs.h void enable_mmu(unsigned long ttb); void init_ttb(unsigned long *ttb_base); void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa); void memset(char *buf, char ch, int size); void memcpy(char *dst, char *src, int s
[单片机]
基於tiny4412的Linux內核移植--- 中斷和GPIO學習(2)
平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動 平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動 我們以控制tiny4412上的LED1和LED2爲例,使用的GPIO是GPM4_0和GPM4_1對應的原理圖如下: datasheet如下: 在samsung的pinctrl驅動中加一些調試用的log: 1 diff --git a/drivers/gpio/gpiolib.c
[单片机]
u-boot-2009.08在mini2440上的移植 增加LCD显示功能
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 7.1添加 LCD 显示功能 对于这个 LCD 的支持是参考Openmoko 的代码移植的。Openmoko 的GTA2 使用的是S3C2442 的CPU,在LCD 控制器上是一样的。而GTA2 在U-boot 的可以在LCD 上显示字符,而且对于软件分层的U-
[单片机]
u-boot-2009.08在mini2440上的<font color='red'>移植</font> 增加<font color='red'>LCD</font>显示功能
u-boot移植总结(四)u-boot-2010.09框架分析
(一)本次移植是基于FL2440,板子的基本硬件: CPU 型号为S3C2440,基于ARM920T,指令集ARMV4,时钟主频400MHz SDRAM H57V2562GTR-75C 2片*32MB=64MB,挂载于nGCS6 (0x3000 0000) NANDFLASH 型号:K9F2G08U0B 大小:256MB Network Adapter (网卡) DM9000AEP 10/100M自适应,挂载于nGCS4 (0x2000 0000) LED 5个LED(LED0~3)I/O口指示灯,LED5电源指示灯,LED9核心板3.3V指示灯 L
[单片机]
<font color='red'>u-boot</font><font color='red'>移植</font>总结(四)u-boot-2010.09框架分析
tiny4412裸机程序之位置无关码
在上篇文章中,将代码的.text、.data、.rodata段重定位到了0x02026400位置处去执行点亮LED的操作。但是,在链接脚本里指定的链接地址是0x02026400,那么为什么在重定位之前的代码能够在0x02023400地址处可以开始执行?就是因为前面使用的是位置无关码。写介绍介个概念: 链接地址:链接脚本里指定的,理论上程序运行时所处的地址。在编译时,编译器会根据链接地址来翻译位置有关码。 加载地址(运行地址):程序运行时,实际所处的地址。 位置无关码,位置有关码,是相对于一条指令的正常目的来说的。比如ldr r0, =xx,它的正常目的是取得标号处的地址,对于这个目的,它是位置有关码,运行的地址不对就获
[单片机]
<font color='red'>tiny4412</font>裸机程序之位置无关码

推荐帖子

急问!多谢了
我的毕业设计是给个基于ISA的CAN模块做个驱动环境:WindowsXP工具:driverworks可是CAN是基于内存访问的,我不知道用在driverworks开发的驱动程序中如何访问物理内存,查了很多资料,都没有解决,有知道的麻烦告诉我一声,多谢!现在离验收没有几天了,很着急!期待好心人的帮助!急问!多谢了
huhuashen 嵌入式系统
[新手学习一点心得]几个常用外设模块的库函数操作流程
呵呵,大虾就不用看了,像我一样的新手可以看看GPIO操作流程中的库函数1.内核时钟设置SysCtlClockSet2.片上设备时钟使能SysCtlPeripheralEnable3.GPIO设置//输入(数字、模拟)、输出(数字)、由硬件决定GPIODirModeSet/Get//驱动强度、推挽/开漏、模拟功能设置GPIOPadConfigSet/Get注:上述
fishplj2000 微控制器 MCU
常见阻抗匹配的方式
1、串联终端匹配在信号源端阻抗低于传输线特征阻抗的条件下,在信号的源端和传输线之间串接一个电阻R,使源端的输出阻抗与传输线的特征阻抗相匹配,抑制从负载端反射回来的信号发生再次反射。匹配电阻选择原则:匹配电阻值与驱动器的输出阻抗之和等于传输线的特征阻抗。常见的CMOS和TTL驱动器,其输出阻抗会随信号的电平大小变化而变化。因此,对TTL或CMOS电路来说,不可能有十分正确的匹配电阻,只能折中考虑。链状拓扑结构的信号网路不适合使用串联终端匹配,所有的负载必须接
fish001 模拟与混合信号
新版GB 31241-2022《便携式电子产品用锂离子电池和电池组 安全技术规范》新-旧版本...
新版GB31241-2022《便携式电子产品用锂离子电池和电池组安全技术规范》(以下简称新版标准)已于2022年12月29日发布,将于2024年1月1日起实施并替代GB31241-2014(以下简称旧版标准)。相比于旧版标准,新版标准主要包含了如下重要更新: 1.术语和定义 修改、增加内容 章节 修改了部分术语和定义 3.1锂离子电池 3.2银离子电池组 3.11充电上限电压 3.23上限充电
木犯001号 电源技术
寻找在WINCE下面做过16C554驱动的技术人员
由于时间很紧,项目需要7月10号之前结题,目前我们选择的平台是S3C2440,操作系统是WINCE,由于三星2440的串口数量不满足项目要求,因此我们外扩了st16c554芯片来扩展4个串口。由于时间关系,我们自己来不及进行串口芯片调试了,想寻找做过此类项目的人员合作。时间是:20天,经费在1000~2500之间。有意的朋友可以直接和我联系,联系方式:zhaozw1975@hotmail.comQQ:525074092(注明:串口驱动项目)邮箱:zhaozzw@mail.hzic.edu
nebulabhm WindowsCE
EVCC
有没有做电动汽车充电通信模块EVCC的厂家,可以做一下交流,也可以告诉我EVCC做的好一些的厂家,有这方面的需求。EVCC瑞凯诺科技江苏羿邦新能源凯迈(洛阳)测控
爱干饭 汽车电子
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved