日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tiny4412 裸机程序 八、重定位到DRAM及LCD实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、實驗原理

上一章已經解釋的很清楚了,如何將所要運行的user_bin程序定位到DRAM中,這一章要進行重定位到DRAM后運行LCD程序,實際上一章中BL2中程序可以不用改動,直接重寫我們的USER目錄下的程序即可,將USER目錄下的LED燈閃爍程序用LCD程序替換就行,最后編譯出的程序名字也叫user_bin.bin即可,這樣也可以用上一章中的fast_fuse.sh進行燒寫到SD卡運行。

1、LCD控制器

Exynos4412的LCD控制器可以通過編程支持不同LCD屏的要求,例如行和列像素數,數據總線寬度,接口時序和刷新頻率等。LCD控制器的主要作用,是將定位在系統存儲器中的顯示緩沖區中的LCD圖像數據傳送到外部LCD驅動器,并產生必要的控制信號,例如RGB_VSYNC,RGB_HSYNC, RGB_VCLK等。

?

圖8-1、Exynos4412 LCD控制器框圖

(下面的部分來自網絡翻譯,規格書中的描述)

如上圖8-1所示,在Exynos4412規格書中截圖,LCD控制器的構成主要由VSFR,VDMA,VPRCS , VTIME和視頻時鐘產生器幾個模塊組成:

(1)、VSFR由121個可編程控制器組,一套gammaLUT寄存器組(包括64個寄存器),一套i80命令寄存器組(包括12個寄存器)和5塊256*32調色板存儲器組成,主要用于對lcd控制器進行配置。

(2)、VDMA是LCD專用的DMA傳輸通道,可以自動從系統總線上獲取視頻數據傳送到VPRCS,無需CPU干涉。

(3)、VPRCS收到數據后組成特定的格式(如16bpp或24bpp),然后通過數據接口(RGB_VD, VEN_VD, V656_VD or SYS_VD)傳送到外部LCD屏上。

(4)、VTIME模塊由可編程邏輯組成,負責不同lcd驅動器的接口時序控制需求。VTIME模塊產生?RGB_VSYNC, RGB_HSYNC, RGB_VCLK, RGB_VDEN,VEN_VSYNC等信號。

Exynos4412的LCD主要特性:

(1)、支持4種接口類型:RGB/i80/ITU601(656)/YTU444

(2)、支持單色、4級灰度、16級灰度、256色的調色板顯示模式

(3)、支持64K和16M色非調色板顯示模式

(4)、支持多種規格和分辨率的LCD

(5)、虛擬屏幕最大可達16MB

(6)、5個256*32位調色板內存

(7)、支持透明疊加

2、接口信號

LCD的FIMD顯示控制器全部信號定義如下表8-1所示

表8-1、LCD接口信號表

Signal

I/O

Description

LCD Type

LCD_HSYNC

O

水平同步信號

?

?

RGB I/F

LCD_VSYNC

O

垂直同步信號

LCD_VDEN

O

數據使能

LCD_VCLK

O

視頻時鐘

LCD_VD[23:0]

O

LCD像素數據輸出

SYS_OE

O

輸出使能

VSYNC_LDI

O

Indirect i80接口,垂直同步信號

?

?

?

i80 I/F

SYS_CS0

O

Indirect i80接口,片選LCD0

SYS_CS1

O

Indirect i80接口,片選LCD1

SYS_RS

O

Indirect i80接口,寄存器選擇信號

SYS_WE

O

Indirect i80接口,寫使能信號

SYS_VD[23:0]

IO

Indirect i80接口,視頻數據輸入輸出

SYS_OE

O

Indirect i80接口,輸出使能信號

VEN_HSYNC

O

601接口水平同步信號

?

?

?

ITU 601/656 I/F

VEN_VSYNC

O

601接口垂直同步信號

VEN_HREF

O

601接口數據使能

V601_CLK

O

601接口數據時鐘

VEN_DATA[7:0]

O

601接口YUV422格式數據輸出

V656_DATA[7:0]

O

656接口YUV422格式數據輸出

V656_CLK

O

656接口數據時鐘

VEN_FIELD

O

601接口域信號

?

其中主要的RGB接口信號:

(1)、LCD_HSYNC:行同步信號,表示一行數據的開始,LCD控制器在整個水平線(整行)數據移入LCD驅動器后,插入一個LCD_HSYNC信號;

(2)、LCD_VSYNC:?幀同步信號,表示一幀數據的開始,LCD控制器在一個完整幀顯示完成后立即插入一個LCD_VSYNC信號,開始新一幀的顯示;VSYNC信號出現的頻率表示一秒鐘內能顯示多少幀圖像,稱為“顯示器的頻率”

(3)、LCD_VCLK:像素時鐘信號,表示正在傳輸一個像素的數據;

(4)、LCD_VDEN:數據使能信號;

(5)、?LCD_VD[23:0]:?LCD像素數據輸出端口

3、RGB信號的時序

如下圖8-2是LCD的RGB接口工作時序圖,圖中各時鐘延時參數的含義如下,這些配置可以在所使用的LCD規格書中查取:

(1)、相關參數說明

VBPD(vertical back porch):表示在一幀圖像開始時,垂直同步信號以后的無效的行數。

VFBD(vertical front porch):表示在一幀圖像結束后,垂直同步信號以前的無效的行數。VSPW(vertical sync pulse width):表示垂直同步脈沖的寬度,用行數計算。

HBPD(horizontal back porch):表示從水平同步信號開始到一行的有效數據開始之間的VCLK的個數。

HFPD(horizontal front porth):表示一行的有效數據結束到下一個水平同步信號開始之間的VCLK的個數。

HSPW(horizontal sync pulse width):表示水平同步信號的寬度,用VCLK計算。

(2)、幀的傳輸過程

VSYNC信號有效時,表示一幀數據的開始,信號寬度為(VSPW +1)個HSYNC信號周期,即(VSPW +1)個無效行;

VSYNC信號脈沖之后,總共還要經過(VBPD+ 1)個HSYNC信號周期,有效的行數據才出現;?所以,在VSYNC信號有效之后,還要經過(VSPW +1? + VBPD + 1)個無效的行;

隨即發出(LINEVAL+ 1)行的有效數據;

最后是(VFPD + 1)個無效的行。

(3)、行中像素數據的傳輸過程

HSYNC信號有效時,表示一行數據的開始,信號寬度為(HSPW+ 1)個VCLK信號周期,即(HSPW +1)個無效像素;

HSYNC信號脈沖之后,還要經過(HBPD +1)個VCLK信號周期,有效的像素數據才出現;

隨后發出(HOZVAL+1)個像素的有效數據;

最后是(HFPD +1)個無效的像素。

(4)、將VSYNC、HSYNC、VCLK等信號的時間參數設置好之后,并將幀內存的地址告訴LCD控制器,它即可自動地發起DMA傳輸從幀內存中得到圖像數據,最終在上述信號的控制下RGB數據出現在數據總線VD[23:0]上。用戶只需要把要顯示的圖像數據寫入幀內存中。

其實現實的圖像有像素點組成行、行組成場、場組成動畫、動畫疊加也就是3D的出現,也就是我們所說的“點動成線、線動成面、面動成體”。


圖8-2、LCD的RGB工作時序圖

4、LCD的硬件接口


圖8-3、LCD的部分硬件電路圖

5、16M(24BPP)色的顯示模式

由于我的Tiny4412所用屏幕是S07,是24bit(A888)顯示模式,即用24位的數據來表示一個像素的顏色,每種顏色使用8位。?LCD控制器從內存中獲得某個像素的24為顏色值后,直接通過VD[23:0]數據線發送給LCD;在內存中,使用4個字節(32位)來表示一個像素,其中的3個字節從高到低分別表示紅、綠、藍,剩余的1個字節無效;

以上內容是我從以前調試uboot中LCD顯示查閱到的資料整合,其主要來自于網絡,網絡上還有各種介紹LCD的相交資料,有興趣的朋友可以自己深究,也可以參考我即將整理的UBOOT相關文檔。

二、程序說明

下面對程序進行簡要說明,這時我只對USER目錄下的程序實現過程進行必要說明,其他相關細節,請自行對照手冊來分析程序,這一章的程序我也進行必要的注釋,

首先來看一下Makefile和sdram.lds start.S幾個文件

1、USER/Makefile sdram.lds start.S

上面三個程序的說明請參考上一章,其主要作用就是將user_bin.bin中的而start.s鏈接地址設置為0X43E00000讓程序重定們DRAM中時,就執行這個程序,而start.s唯一做的事就是跳轉到main.c中的main函數執行。

2、USER/main.c

Mian函數很清楚,一開始調用lcd_init();然后調用lcd_clear_screen(0x000000)清屏,接著畫一個十字,再畫了幾條水平線和一條垂直線,最后讓LDE燈一直閃爍。

3、USER/LCD.C

首先需要說明的一點時,這個程序我參考了網上很多人關于S5PV210的寫法,但或多或少總存在一些問題,最后在FriendlyARM的BBS的論壇上一個ID號為“趙遠遠”提供的lcd_chinese_char程序,這個程序初始化流程可以很好的工作。所以,這個程序里的初始化部分主要取自于此!

lcd_init()

3.1、寄存器設置方法

如下面兩句話所示:

#define LCDBLK_CFG (*(volatile unsigned int *)0x10010210)

LCDBLK_CFG = a;

語句中0x10010210是寄存器LCDBLK_CFG的地址,(volatileunsigned int *)0x10010210是將此0x10010210值強制轉換成一個指向unsigned int的指針,volatile作用是防止編譯器優化,再在外面加一個*就是取0x10010210地址處的值了,所以用LCDBLK_CFG就可改寫0x10010210處的數據,

下面來按著LCD的初始化順序進行說明。

3.2、定義IO引腳功能為RGB接口。

由上圖8-3所示,所用的GPIO口分別是GPIO的F口的0/1/2/3四組,查看手冊可知要想將其設置為LCD的RGB接口,只需要將其設置為2即可。同時將其IO口設置成為內部上拉,且將其驅動能力設置為最強代碼如下:

GPF0CON = 0x22222222;????????????????????????????????????

GPF1CON = 0x22222222;

GPF2CON = 0x22222222;

GPF3CON = 0x00222222;

// Set pull-up,down disable

GPF0PUD = 0x0000FFFF;

GPF1PUD = 0x0000FFFF;

GPF2PUD = 0x0000FFFF;

GPF3PUD = 0x00000FFF;

?

//MAX drive strength---------//

GPF0DRV = 0x0000FFFF;

GPF1DRV = 0x0000FFFF;

GPF2DRV = 0x0000FFFF;

GPF3DRV = 0x00000FFF;

3.3、接著設置LCD相關時鐘寄存器

這一步主要設置選擇LCD時鐘輸入源為MPLL,且不對其進行分頻,同時設置LCDBLK_CFG使其使用FIMD接口,且設置LCDBLK_CFG2使其PWM輸出使能,其實,LCDBLK_CFG2可以不用設置。

3.4、清除Fram Buffer處的數據

這里調用一個Memset()函數,對地址0x54000000處,0X200000大小的DRAM進行初始化為統一值,一開始我設置為,后來為了調試,我將其設置為0xff00,即可以顯示為綠色。

3.5、設置VIDCONx,設置接口類型,時鐘分頻,極性以及使能LCD控制器等

A、VIDCON0參考數據手冊,這一個寄存器主要設置接口類型和時鐘分頻,這里僅僅設置了其時鐘分頻值。參考S07的手冊,找到時像素時鐘。由于我們的MPLL為800MHZ,所以這里設置值,根據手冊進行計算,要得到33.3MHZ左右的像素時鐘,所以寄存器第6~13bit設置為23.其他都保持為0即可。

代碼如下:

VIDCON0 = (23 << 6);

此代碼中也給出了如下代碼風格的寫法,后面很多寄存器配置我也均寫好相類似風格的代碼,但我要遺憾的說一聲,這種風格的寫法且總不能執行成功,LCD像是初始化成功,但且不能將圖形給畫出,這在此比對代碼比對了很久,也沒有找出原由來,所以這里代碼中可運行的部分是受高手唾棄的一種寫作風格,同時也給出了另一種寫作風格的代碼,希望細心的網友能發現其中那里我設置有差別,而讓后一種風格的代碼能正常運行。

// #define EXYNOS_VIDCON0_CLKVAL_F(x)?????????????????????? (((x) & 0xff) << 6)

//VIDCON0 =?EXYNOS_VIDCON0_CLKVAL_F(23);??//not use this method ,it does not work???

B、VIDCON1主要設置像表時鐘信號一直存在,且高電平有效,而IHSYNC=1,極性反轉IVSYNC=1,極性反轉,這是由于S07的時序圖中VSYNC和HSYNC都是低脈沖有效,而Exynos4412芯片手冊時序圖,如上圖8-2所示:VSYNC和HSYNC都是高脈沖有效,所以需要反轉。

C、VIDTCONx用來設置時序和長寬等參數,這里就主要設置VBPD(vertical back porch)、 VFBD(vertical frontporch)、VSPW(vertical sync pulse width)、HBPD(horizontal backporch)、 HFPD(horizontal sync pulse width)等參數,參數的意義前面已有簡要說明,這里簡單用圖片的方式說明如何取值。

如下圖8.4所示是VIDTCON0取值過程,VIDTCON0設置幀同步時序。



圖8-4、VIDTCON0寄存器取值參考圖

VBPDE與RGB接口無關,不用關心,所以其代碼設置如下:

VIDTCON0 = (22 << 16) | (21 << 8) | (0);

如下圖8.5所示是VIDTCON1取值過程,VIDTCON1設置像素同步時序。



圖8-5、VIDTCON1寄存器取值參考圖

VFPDE與RGB接口無關,不用關心,所以其代碼設置如下:

VIDTCON1 = (45 << 16) | (209 << 8) | (0);

如下圖8-6所示,為寄存器VIDTCON2設置取值要點:


圖8-6、VIDTCON2寄存器取值參考圖

VIDTCON2 = (479 << 11) | 799;

D、設置WINCON0寄存器,即設置數據格式。

Exynos4412的LCD控制器有overlay功能,它支持5個window。這里只使用window0,設置其代碼RGB模式為24bit(A888)且使能window0,其相關的代碼設置如下:

WINCON0 = (11 << 2) | 1;

E、設置VID0SD0A/B/C,即設置Window0的坐標系。

相關代碼如下:

VIDOSD0A = 0;

VIDOSD0B = (799 << 11) | 479;

VIDOSD0C = 480 * 800;

F、配置VIDW00ADD0B0和VIDW00ADD1B0,設置framebuffer的地址;

相關代碼如下:

VIDW00ADD0B0 = LCD_VIDEO_ADDR;

VIDW00ADD1B0 = LCD_VIDEO_ADDR + VIDOSD0C * 4;

G、配置SHADOWCON和WINCHMAP2、選擇使能DMA通道0。由于我們使用的是Window0,所以需要使能DMA通道0;

相關代碼如下:

SHADOWCON |= 1;

?

WINCHMAP2 &= ~(7 << 16);

WINCHMAP2 |= 1 << 16;

WINCHMAP2 &= ~7;

WINCHMAP2 |= 1;

H、最后設置VIDCON0低兩位使能LCD,代碼如下:

VIDCON0 |= 3;

我們不需要使用很強大的功能,所有只需設置這幾個寄存器即可。

lcd_draw_pixel()

經過lcd_init()初始化LCD控制器之后,我們就可以在LCD上描繪圖形了,代碼里的所有繪制圖形的函數都是基于lcd_draw_pixel()這個函數,它的作用是在LCD上描繪一個點,通過描繪一個個的點最終會可以組成圖形了。在LCD上描點的本質就是往Frame Buffer中寫入顏色值而已。LCD控制器自己會去讀所定義的Frame Buffer內存位置處讀取數據,然后輸出到LCD。

lcd_draw_pixel()這個函數以及后面幾個畫水平線、垂直線和十字的函數我完成COPY了《Linux平臺下Mini210S裸機程序開發指南》里的代碼,下面我們僅僅COPY說明一下此函數,其代碼如下:

void lcd_draw_pixel(int row, int col, intcolor)

{

unsigned long * pixel = (unsigned long *)LCD_VIDEO_ADDR;

*(pixel + row * COL + col) = color;

}

其中LCD_VIDEO_ADDR = 0x54000000,即framebuffer的基地址,這個值只要是DRAM中,一塊可分配16M大小的DRAM的一個地址即可。row和col用來決定偏移,color是顏色值,只要在framebuffer中對應的地址處寫入顏色值就可以在LCD上描繪出該點。

后面其他函數很簡單,這里就不費時間做過多說明。

三、完整的燒寫過程

已將SD卡插入電腦,假設linux識別了SD卡,其識別號為sdb。執行下面命令:

# chmod 777 –R 7_sdram_LCD

# cd 7_sdram_LCD

# make

# ./ fast_fuse /dev/sdb

四、上電實驗

將sd卡插入Tiny4412中,選擇sd卡啟動,和電腦能過串口0連接好,打開一個串口調試助手,然后上電,可以看到以下現象:

串口助手中會顯示一些信息,LCD初始化完成后,LCD屏幕首先會顯示一整幅的綠色背景。 一兩秒鐘后,會顯示Mian()函數中所畫的幾條橫線和一條豎線以及一個十字,板上的LED燈會一直閃爍。

?

前面說過,這一章中留有一點問題,就是兩種寫法,同樣的設置,為什么第二種代碼風格卻不能運行,我自己用人眼對比了好多次,也沒有發現代碼那里有問題,沒辦法人眼排查,只能試著將串口重新初始化,然后打印出相關信息,找出原因吧。

總結

以上是生活随笔為你收集整理的tiny4412 裸机程序 八、重定位到DRAM及LCD实验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。