本文转载自:http://blog.csdn.net/eshing/article/details/37410571

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

目录(?)[+]

 

一、实验原理

大家可能会有疑问,不是在BL2目录中的mem_init_tiny4412.S实现了串口初始化了,且也有串口输出函数,要不然怎么串口调试助手上怎么会有打印信息呢,这里为什么还要重新初始化?其实我觉得也可以不用重新初始化,但至少也要实现Printf()这个标准函数里要调用的串口输出函数吧,因为初始化工作在时钟没有改变的情况下,可以只初始化一次,但是到LCD初始化这一步时,CPU已经重定位到DRAM中执行了,前面在mem_init_tiny4412.S实现的函数uart_asm_putc和uart_asm_putx函数现在代码应定位不到了吧,所以应无法调用了,所以我觉得有必要重新初始化,至少实现串口输出函数。

代码实现方式还是从U-BOOT中去COPY修改的,同时也参考了《Linux平台下Mini210S裸机程序开发指南》的第24章代码方式。这一章我不会详细的去说明代码中串口如何实现等等,我只想找出LCD用另一种代码风格没能初始化成功的原因?代码的实现过程,相信大家有了前面几章的说明,自己应想明白吧。

二、程序说明

1、UART.C

代码增加了uart.h和uart.c以及从linux系统中提取出来的一些相关文件,虽然我这里重新实现了串口初始化函数,但我也没有在user_bin.bin程序的main执行阶段没有调用此函数进行初始化串口,而是只会通过printf()函数调用putc()输出函数和输入所用getc()函数。所以这也验证了前面的设想,其实一开始串口已初始化好了,我们没有改变时钟什么的,没必要再来初始化一次了。程序实现方式简章不做过多说明。

2、LCD.C

在lcd.c中我copy了《Linux平台下Mini210S裸机程序开发指南》第24章提供的代码中绘图和绘制字符的函数,并对其进行了必要修改,还有从Linux提取了三个字库文件,分别是font_8x16.h、font_10x18.h和font_sun12x22.h,这三个文件分别用来提供不同大小的字模,程序中可以通过LCD.h中的宏定义来选择一种字模来做为LCD中输出文字,LCD输出字的方法也是很古老的,就是移位比较字模数据中那一bit是1,即在相应位置描点。但这种方法实现字符输出,在测试过程中我发现,绘制文字一直不是很清晰,三个字库都如此,程序上可能存在什么问题吧,需要好好排查。

Lcd.c中的lcd_draw_bmp()绘图函数我进行了修改,让他的更加灵活一点,它可以绘制由网上比较流行的图片转LCD数据软件“img2lcd”转换出来的,带有8字节图片信息头的字符数组文件。此函数会自动从8字节的信息头中提取图像高度和宽度信息,然后进行绘图。由于我现在提供是800*480的24bit的图片,现在编译生成的user_bin.bin文件会比较大了,现在出来的文件大小已经比较大了,大约有1149K了,所以我们有必要修改一下BL2中mmc_relocate.c,要将其复制的扇区大小改大一些,一个扇区512字节,大家看着自己程序修改吧,但也不能太大了,因为我不清楚FriendlyARM为我们提供的SD-Flasher.exe在格式分区时,第一分区分配大小到底有多大,我不是很确定,我用一个分区工具查看时,发现在大小有150M左右,如下图9-1所示,大家的程序还是控制在5M大小内比较保险吧。

图9-1、SD卡分区示意图

我修改复制的大小为2048K,所以扇区数为4096,代码如下所示:

SDMMC_ReadBlocks(49,4096,0x43e00000);

3、main.c

main.c程序也做了相关修改,主要是复制了《Linux平台下Mini210S裸机程序开发指南》第24章所提供的代码,程序实现通过输入不同数字绘出不同的图形,同时屏幕上会显示字符。程序实现也很简单,这里不过多说明。

三、完整的烧写过程

已将SD卡插入电脑,假设linux识别了SD卡,其识别号为sdb。执行下面命令:

# chmod 777 –R 8_sdram_LCD_Char

# cd 8_sdram_LCD_Char

# make

# ./ fast_fuse /dev/sdb

由于这个程序user_bin.bin程序比较大了,烧写的时间会长一些吧,我的一般要两三分钟了,大家耐心等待,烧写过程中,屏幕没有反应,不是烧写的sh死了。

四、上电实验

将sd卡插入Tiny4412中,选择sd卡启动,和电脑能过串口0连接好,打开一个串口调试助手,然后上电,可以看到以下现象:

串口助手中不但显示了前面从内存中读出的信息,同时也输入了LCD初始化过程中增加的打印信息,我截取了部分输出如下图9-2所示,从图上可以看出VIDTCON2寄存器的初始化值两种风格设置数值果然不同,这就是问题的所在。

图9-2、LCD初始化输出信息

查看代码,原来是代码如下,原来LINEVAL<< 11写借了,EXYNOS_VIDTCON2_LINEVAL(x)已经将值左移11位了,这里我又左移了11位,导致初始化出错。

//VIDTCON2 = ( EXYNOS_VIDTCON2_LINEVAL(LINEVAL<<11) |
EXYNOS_VIDTCON2_HOZVAL(HOZVAL));

将其修改为:

//VIDTCON2 = ( EXYNOS_VIDTCON2_LINEVAL(LINEVAL)|
EXYNOS_VIDTCON2_HOZVAL(HOZVAL));

重新编译上电实验,从下图9-3中截取的部分可以看出现在初值一样了。

图9-3、LCD初始化输出信息

最后,我将这一章的代码修改为第二种风格的书写方式提供给大家,我自己也编译上电验证了,现在程序也能正常工作了。

这一步完成后,即可以验证了main程序了,如下图9-4所示,是发送字符5后绘制一幅图片的效果图。

图9-4、Tiny4412实现效果图

So Sexy ??? Oh haa??

第十章、尾声

一开始我说过,我一开始一直想在U-BOOT中移植成功LCD功能,但始终无法实现,才想着先用裸机程序来实验,验证LCD程序能正常工作了,再去调试U-BOOT,所以才会从网上才找到《Linux平台下Mini210S裸机程序开发指南》的文档,也才有这一篇裸机程序学习记录文档,到此,我的目的已经达到了,后面按Mini210S的文档程序都是通过Minitools来烧写的,但我们的Tiny4412不行,我也不去深入实现其他的裸机代码了,但文档中提供重定位到DRAM中运行的方法,同样可以实现一些程序稍大的裸机程序,有兴趣的朋友可以参考《Linux平台下Mini210S裸机程序开发指南》文档,实现完所有的功能,为广大学习朋友造福,我在此已花支了一段时间了,我学这个是有目的,不想花过多时间深入其他程序,下一步转回到U-BOOT的调试中去。谢谢!

备注:说明一下,后面两章的代码已上传到我的资源里,我要了两个下载分,不好意思,我的资源分太少了,我得赚点,我相信我的程序是绝对能运行的,觉得值就去下载。

资源地址:

http://download.csdn.NET/detail/eshing/7598297

http://download.csdn.net/detail/eshing/7601447

tiny4412 裸机程序 九、串口排查驱动原因及字符图片显示【转】的更多相关文章

  1. tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37407423 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   一 ...

  2. tiny4412 裸机程序 七、重定位代码到DRAM【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37116637 一.关于DRAM 上一章我们讲解了如何对代码进行重定位,但是将代码重定位到只有25 ...

  3. Tiny4412之C语言实现流水灯,Tiny4412裸机程序[3]

    在前边我们使用汇编完成了一个流水灯实验: Tiny4412汇编流水灯代码,Tiny4412裸机LED操作 ---- - -- -- -- - -- -- 修改: # ${MKBL2} ${SOURCE ...

  4. tiny4412 裸机程序 一、说明【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37109115 首先.我想说明为什么我写这个文档?我自己想学点东西,过于求成,又过于自信,直接买了 ...

  5. tiny4412 裸机程序 五、控制icache【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37115411 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   一 ...

  6. tiny4412 裸机程序 六、重定位代码到IRAM+0x8000【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37115697 一.重定向 对于程序而言,我们需要理解两个概念,一是程序当前所处的地址,即程序在运 ...

  7. tiny4412 裸机程序 三、关闭看门狗和调用C程序【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37112779 一.原理说明 上是章中大家可能有会觉得奇怪,CPU不是有看门狗嘛?为什么CPU没有 ...

  8. MDK972-EK开发板裸调试设置和裸机程序烧写(转)

    硬件平台:MDK972-EK开发板编译调试软件:KEIL uVision4仿真工具:JLINK V7/V8   本例子从串口输出信息,如图:       KEIL uVision4调试设置如图所示: ...

  9. ok6410[002] ubuntu1604系统下搭配ckermit和dnw基于RAM的裸机程序调试环境

    ubuntu1604系统下搭配ckermit和dnw基于RAM的裸机程序调试环境 系统:  ubuntu16.04 裸板: 飞凌公司OK6410开发板 目标:搭建基于ubuntu1604系统和基于RA ...

随机推荐

  1. Vue指令的概念

    指令(Directives) 是带有v- 前缀的特殊属性,指令属性是单一的js表达式. 指令的职责就是表达式的值发生变化时,在DOM中做出相应的回应. 如下例子: 实例 <div id=&quo ...

  2. xmpp使用经验

    IM 标准协议有XMPP\IMPP\PRIM\SIP(SIMPLE)等,其中XMPP基于XML的协议,具备了很好的扩展性(依靠XML的域名空间)并且可以建立在TLS上使用SASL认证. 1.文件比如图 ...

  3. libevent reference Mannual IV --Helper functions and types

    FYI: http://www.wangafu.net/~nickm/libevent-book/Ref5_evutil.html Helper functions and types for Lib ...

  4. CCF201509-2 日期计算 java(100分)

    试题编号: 201509-2 试题名称: 日期计算 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? 注意闰年的2月有2 ...

  5. 虚拟机下Linux网络配置

    之前配置好了linux系统,在网络这块我用的是桥接模式. 现在分享一下使用虚拟机桥接模式配置Linux网络的过程. 一.首先配置外网的本地Ip地址. 二.配置Linux 网络链接 1.打开linux网 ...

  6. 洛谷 2777 [AHOI2016初中组]自行车比赛

    [题解] 为了让某个选手能够获得总分第一,就让他最后一天的得分是n,并且让别的选手的得分的最大值尽量小.于是我们先把目前积分排序,并且让他们最后一天的排名刚好与积分排名相反.即某个积分排名为X的人最后 ...

  7. codechef 营养题 第一弹

    第一弾が始まる! 定期更新しない! 来源:http://wenku.baidu.com/link?url=XOJLwfgMsZp_9nhAK15591XFRgZl7f7_x7wtZ5_3T2peHh5 ...

  8. AtCoder Beginner Contest 131 Solution

    前言 这次ABC还是有一点难度的吧. TaskA Security Solution 直接模拟就好了. Code /* mail: mleautomaton@foxmail.com author: M ...

  9. Python学习笔记 (1)Hello World(环境搭建+输出Hello World!)

    随想 高考发挥失常.科三遇火车发挥失常,各种不顺……突然发现假期都快没了,才想起高考前想象的这个假期要做的一堆事,现在来多完成一件吧. 这几篇博客仅只是我的学习笔记,凑合看吧.我这个python小白看 ...

  10. HDU 2242 连通分量缩点+树形dp

    题目大意是: 所有点在一个连通图上,希望去掉一条边得到两个连通图,且两个图上所有点的权值的差最小,如果没有割边,则输出impossible 这道题需要先利用tarjan算法将在同一连通分量中的点缩成一 ...