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
總結
以上是生活随笔為你收集整理的tiny4412 裸机程序 九、串口排查驱动原因及字符图片显示【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蒲丰投针计算机模拟ppt,蒲丰投针实验模
- 下一篇: Activiti6+SpringBoot