tiny4412 裸机程序 九、串口排查驱动原因及字符图片显示【转】
本文轉(zhuǎn)載自:http://blog.csdn.net/eshing/article/details/37410571
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
目錄(?)[+]
一、實驗原理
大家可能會有疑問,不是在BL2目錄中的mem_init_tiny4412.S實現(xiàn)了串口初始化了,且也有串口輸出函數(shù),要不然怎么串口調(diào)試助手上怎么會有打印信息呢,這里為什么還要重新初始化?其實我覺得也可以不用重新初始化,但至少也要實現(xiàn)Printf()這個標(biāo)準(zhǔn)函數(shù)里要調(diào)用的串口輸出函數(shù)吧,因為初始化工作在時鐘沒有改變的情況下,可以只初始化一次,但是到LCD初始化這一步時,CPU已經(jīng)重定位到DRAM中執(zhí)行了,前面在mem_init_tiny4412.S實現(xiàn)的函數(shù)uart_asm_putc和uart_asm_putx函數(shù)現(xiàn)在代碼應(yīng)定位不到了吧,所以應(yīng)無法調(diào)用了,所以我覺得有必要重新初始化,至少實現(xiàn)串口輸出函數(shù)。
代碼實現(xiàn)方式還是從U-BOOT中去COPY修改的,同時也參考了《Linux平臺下Mini210S裸機程序開發(fā)指南》的第24章代碼方式。這一章我不會詳細(xì)的去說明代碼中串口如何實現(xiàn)等等,我只想找出LCD用另一種代碼風(fēng)格沒能初始化成功的原因?代碼的實現(xiàn)過程,相信大家有了前面幾章的說明,自己應(yīng)想明白吧。
二、程序說明
1、UART.C
代碼增加了uart.h和uart.c以及從linux系統(tǒng)中提取出來的一些相關(guān)文件,雖然我這里重新實現(xiàn)了串口初始化函數(shù),但我也沒有在user_bin.bin程序的main執(zhí)行階段沒有調(diào)用此函數(shù)進(jìn)行初始化串口,而是只會通過printf()函數(shù)調(diào)用putc()輸出函數(shù)和輸入所用getc()函數(shù)。所以這也驗證了前面的設(shè)想,其實一開始串口已初始化好了,我們沒有改變時鐘什么的,沒必要再來初始化一次了。程序?qū)崿F(xiàn)方式簡章不做過多說明。
2、LCD.C
在lcd.c中我copy了《Linux平臺下Mini210S裸機程序開發(fā)指南》第24章提供的代碼中繪圖和繪制字符的函數(shù),并對其進(jìn)行了必要修改,還有從Linux提取了三個字庫文件,分別是font_8x16.h、font_10x18.h和font_sun12x22.h,這三個文件分別用來提供不同大小的字模,程序中可以通過LCD.h中的宏定義來選擇一種字模來做為LCD中輸出文字,LCD輸出字的方法也是很古老的,就是移位比較字模數(shù)據(jù)中那一bit是1,即在相應(yīng)位置描點。但這種方法實現(xiàn)字符輸出,在測試過程中我發(fā)現(xiàn),繪制文字一直不是很清晰,三個字庫都如此,程序上可能存在什么問題吧,需要好好排查。
Lcd.c中的lcd_draw_bmp()繪圖函數(shù)我進(jìn)行了修改,讓他的更加靈活一點,它可以繪制由網(wǎng)上比較流行的圖片轉(zhuǎn)LCD數(shù)據(jù)軟件“img2lcd”轉(zhuǎn)換出來的,帶有8字節(jié)圖片信息頭的字符數(shù)組文件。此函數(shù)會自動從8字節(jié)的信息頭中提取圖像高度和寬度信息,然后進(jìn)行繪圖。由于我現(xiàn)在提供是800*480的24bit的圖片,現(xiàn)在編譯生成的user_bin.bin文件會比較大了,現(xiàn)在出來的文件大小已經(jīng)比較大了,大約有1149K了,所以我們有必要修改一下BL2中mmc_relocate.c,要將其復(fù)制的扇區(qū)大小改大一些,一個扇區(qū)512字節(jié),大家看著自己程序修改吧,但也不能太大了,因為我不清楚FriendlyARM為我們提供的SD-Flasher.exe在格式分區(qū)時,第一分區(qū)分配大小到底有多大,我不是很確定,我用一個分區(qū)工具查看時,發(fā)現(xiàn)在大小有150M左右,如下圖9-1所示,大家的程序還是控制在5M大小內(nèi)比較保險吧。
圖9-1、SD卡分區(qū)示意圖
我修改復(fù)制的大小為2048K,所以扇區(qū)數(shù)為4096,代碼如下所示:
SDMMC_ReadBlocks(49,4096,0x43e00000);
3、main.c
???????? main.c程序也做了相關(guān)修改,主要是復(fù)制了《Linux平臺下Mini210S裸機程序開發(fā)指南》第24章所提供的代碼,程序?qū)崿F(xiàn)通過輸入不同數(shù)字繪出不同的圖形,同時屏幕上會顯示字符。程序?qū)崿F(xiàn)也很簡單,這里不過多說明。
三、完整的燒寫過程
已將SD卡插入電腦,假設(shè)linux識別了SD卡,其識別號為sdb。執(zhí)行下面命令:
# chmod 777 –R 8_sdram_LCD_Char
# cd 8_sdram_LCD_Char
# make
# ./ fast_fuse /dev/sdb
由于這個程序user_bin.bin程序比較大了,燒寫的時間會長一些吧,我的一般要兩三分鐘了,大家耐心等待,燒寫過程中,屏幕沒有反應(yīng),不是燒寫的sh死了。
四、上電實驗
將sd卡插入Tiny4412中,選擇sd卡啟動,和電腦能過串口0連接好,打開一個串口調(diào)試助手,然后上電,可以看到以下現(xiàn)象:
串口助手中不但顯示了前面從內(nèi)存中讀出的信息,同時也輸入了LCD初始化過程中增加的打印信息,我截取了部分輸出如下圖9-2所示,從圖上可以看出VIDTCON2寄存器的初始化值兩種風(fēng)格設(shè)置數(shù)值果然不同,這就是問題的所在。
圖9-2、LCD初始化輸出信息
查看代碼,原來是代碼如下,原來LINEVAL<< 11寫借了,EXYNOS_VIDTCON2_LINEVAL(x)已經(jīng)將值左移11位了,這里我又左移了11位,導(dǎo)致初始化出錯。
//VIDTCON2 = ( EXYNOS_VIDTCON2_LINEVAL(LINEVAL<<11) |
EXYNOS_VIDTCON2_HOZVAL(HOZVAL));
將其修改為:
//VIDTCON2 = ( EXYNOS_VIDTCON2_LINEVAL(LINEVAL)|
EXYNOS_VIDTCON2_HOZVAL(HOZVAL));
重新編譯上電實驗,從下圖9-3中截取的部分可以看出現(xiàn)在初值一樣了。
圖9-3、LCD初始化輸出信息
最后,我將這一章的代碼修改為第二種風(fēng)格的書寫方式提供給大家,我自己也編譯上電驗證了,現(xiàn)在程序也能正常工作了。
這一步完成后,即可以驗證了main程序了,如下圖9-4所示,是發(fā)送字符5后繪制一幅圖片的效果圖。
圖9-4、Tiny4412實現(xiàn)效果圖
So Sexy ??? Oh haa??
第十章、尾聲
一開始我說過,我一開始一直想在U-BOOT中移植成功LCD功能,但始終無法實現(xiàn),才想著先用裸機程序來實驗,驗證LCD程序能正常工作了,再去調(diào)試U-BOOT,所以才會從網(wǎng)上才找到《Linux平臺下Mini210S裸機程序開發(fā)指南》的文檔,也才有這一篇裸機程序?qū)W習(xí)記錄文檔,到此,我的目的已經(jīng)達(dá)到了,后面按Mini210S的文檔程序都是通過Minitools來燒寫的,但我們的Tiny4412不行,我也不去深入實現(xiàn)其他的裸機代碼了,但文檔中提供重定位到DRAM中運行的方法,同樣可以實現(xiàn)一些程序稍大的裸機程序,有興趣的朋友可以參考《Linux平臺下Mini210S裸機程序開發(fā)指南》文檔,實現(xiàn)完所有的功能,為廣大學(xué)習(xí)朋友造福,我在此已花支了一段時間了,我學(xué)這個是有目的,不想花過多時間深入其他程序,下一步轉(zhuǎn)回到U-BOOT的調(diào)試中去。謝謝!
備注:說明一下,后面兩章的代碼已上傳到我的資源里,我要了兩個下載分,不好意思,我的資源分太少了,我得賺點,我相信我的程序是絕對能運行的,覺得值就去下載。
資源地址:
http://download.csdn.NET/detail/eshing/7598297
http://download.csdn.net/detail/eshing/7601447
總結(jié)
以上是生活随笔為你收集整理的tiny4412 裸机程序 九、串口排查驱动原因及字符图片显示【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蒲丰投针计算机模拟ppt,蒲丰投针实验模
- 下一篇: 指纹登录的计算机忘记密码怎么办,华为有指