本文转载自: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 裸机程序 九、串口排查驱动原因及字符图片显示

    一.实验原理 大家可能会有疑问,不是在BL2目录中的mem_init_tiny4412.S实现了串口初始化了,且也有串口输出函数,要不然怎么串口调试助手上怎么会有打印信息呢,这里为什么还要重新初始化? ...

  2. Tiny4412裸机程序之代码在DDR SDRAM中运行

    转载:http://www.techbulo.com/1509.html Tiny4412裸机程序之代码在DDR SDRAM中运行 2014年11月13日 ⁄ 裸机程序 ⁄ 共 8647字 ⁄ 字号  ...

  3. Java黑皮书课后题第4章:*4.18(学生的专业和年级)编程一个程序,提示用户输入两个字符,显示这两个字符代表的专业以及年级,第一个字符表示专业,第二个是一个数字字符1、2、3、4,输出对应结果

    *4.18(学生的专业和年级)编程一个程序,提示用户输入两个字符,显示这两个字符代表的专业以及年级,第一个字符表示专业,第二个是一个数字字符1.2.3.4,分别表示大一.大二.大三.大四 题目 题目概 ...

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

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

  5. tiny4412 裸机程序 八、重定位到DRAM及LCD实验

    一.实验原理 上一章已经解释的很清楚了,如何将所要运行的user_bin程序定位到DRAM中,这一章要进行重定位到DRAM后运行LCD程序,实际上一章中BL2中程序可以不用改动,直接重写我们的USER ...

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

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

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

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

  8. Tiny4412裸机程序之代码重定位初体验

    转载:http://www.techbulo.com/1412.html 从前面一节Exynos 4412的启动过程分析 ,我们知道:一上电,exynos4412首先执行固化在IROM中的代码,iRO ...

  9. Tiny4412裸机程序,按键检测(轮询方式)

    由于前几天出差,博客没有更新,今天看了看Tiny4412的原理图,把按键扫描程序写了一下,用的是轮询方式,后面会有中断方式的实现,闲话少说,进入正题,程序由前一个实验Tiny4412之C语言实现流水灯 ...

最新文章

  1. LISP 圆孔标记_晓东CAD家园-论坛-A/VLISP-获取当前标注样式-;;希望大家来完善它 - Powered by Discuz!...
  2. Leecode-198. 打家劫舍——动态规划(C++)
  3. How to find all event handler list for a given event
  4. “美登杯”上海市高校大学生程序设计赛B. 小花梨的三角形(模拟,实现)
  5. 关于分辨率和地图打印的一些问题
  6. 免费下载谷歌maps软件_Android Google Maps当前位置,夜间模式功能
  7. SpringContext扩展BeanFactory
  8. java heapdump 分析工具_Java Heap dump文件分析工具jhat简介
  9. Hadoop大数据原理与应用实验教程
  10. play framework自定义插件plugin
  11. 相对湿度与绝对湿度转换表包含负温度
  12. 计算机求圆面积公式,如何计算圆的面积?
  13. 数字逻辑与数字系统总结
  14. Python-集合练习(协助学生做问卷调查)
  15. 工业控制计算机固态硬盘,工业级SSD接口全解析,懂了你才会选对工业级SSD
  16. 网络云存储技术Windows server 2012 (项目二十三 远程异地数据实时同步)
  17. 百度地图之地图显示和定位,获取定位的经纬度
  18. 堆糖瀑布流完整解决方案(jQuery)
  19. 8000字解读蕉下:拿什么打破新消费亏钱魔咒?
  20. 上「贼船」跟船长深度交流

热门文章

  1. 如何将本地图片转成图片链接
  2. Python爬虫爬取东方财富网的股票信息
  3. 【运营】新品推广方案整理
  4. ArcGIS如何利用矢量shp挂接图片
  5. CSS学习笔记-—学会用PS切图和取色—day03(基本用法)
  6. 【转】125个常用拉丁语词根
  7. 行人重识别(ReID)概述
  8. pika.exceptions.ConnectionClosed 问题的解决
  9. 解决maven打包的时候依赖jar包打不进去
  10. Leetcode刷题——栈与队列