tiny4412 裸机程序 九、串口排查驱动原因及字符图片显示【转】

本文转载自: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

原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7249228.html