S3C6410圖形旋轉(zhuǎn)裸機(jī)驅(qū)動(dòng)
這個(gè)比較簡(jiǎn)單,一次成功,沒(méi)遇到任何問(wèn)題.
GraphRotation.c
/*************************************************************************************************************
?*?文件名: GraphRotation.c
?*?功能: S3C6410?圖形旋轉(zhuǎn)底層驅(qū)動(dòng)函數(shù)
?*?作者: cp1300@139.com
?*?創(chuàng)建時(shí)間: 2012年10月15日21:12
?*?最后修改時(shí)間:2012年10月15日
?*?詳細(xì): 圖形旋轉(zhuǎn)控制器底層驅(qū)動(dòng)
*************************************************************************************************************/
#include?"system.h"
#include?"GraphRotation.h"
#include?"delay.h"
//超時(shí),單位US
#define?GR_TIMEOUT 1000000
/*************************************************************************************************************************
*函數(shù)???? : void?Rotation_SetInputImage(u8?TypeImage)
*功能???? : 設(shè)置輸入旋轉(zhuǎn)圖像格式
*參數(shù)???? : TypeImage:圖像格式,見(jiàn)宏定義
#define?GR_YUV420 0
#define?GR_YUV422 3
#define?GR_RGB565 4
#define?GR_RGB888 5
*返回???? : 無(wú)
*依賴 :? 底層宏定義
*作者????? : cp1300@139.com
*時(shí)間????: 20121016
*最后修改時(shí)間: 20121016
*說(shuō)明????: 無(wú)
*************************************************************************************************************************/
void?Rotation_SetInputImage(u8?TypeImage)
{
rGR_CTRLCFG?&=??~(0x7?<<?13); //清除設(shè)置
rGR_CTRLCFG?|=?(0x7?&?TypeImage)?<<?13;
}
/*************************************************************************************************************************
*函數(shù)???? : void?Rotation_SetRotationDeg(u8?Degree)
*功能???? : 設(shè)置圖像旋轉(zhuǎn)角度
*參數(shù)???? : Degree:旋轉(zhuǎn)角度,見(jiàn)宏定義
#define?GR_0Deg 0 //0
#define?GR_90Deg 1 //90
#define?GR_180Deg 2 //180
#define?GR_270Deg 3 //270
*返回???? : 無(wú)
*依賴 :? 底層宏定義
*作者????? : cp1300@139.com
*時(shí)間????: 20121016
*最后修改時(shí)間: 20121016
*說(shuō)明????: 翻轉(zhuǎn)和旋轉(zhuǎn)不能同時(shí)生效
*************************************************************************************************************************/
void?Rotation_SetRotationDeg(u8?Degree)
{
rGR_CTRLCFG?&=??~(0x3?<<?6); //清除設(shè)置
rGR_CTRLCFG?|=?(0x3?&?Degree)?<<?6;
}
/*************************************************************************************************************************
*函數(shù)???? : void?Rotation_SetFlipDir(u8?Direction)
*功能???? : 設(shè)置圖像翻轉(zhuǎn)方向
*參數(shù)???? : Direction:翻轉(zhuǎn)方向,見(jiàn)宏定義
#define?GR_NotFlip 0 //不翻轉(zhuǎn)
#define?GR_VerFlip 2 //垂直翻轉(zhuǎn)
#define?GR_HorFlip 3 //水平翻轉(zhuǎn)
*返回???? : 無(wú)
*依賴 :? 底層宏定義
*作者????? : cp1300@139.com
*時(shí)間????: 20121016
*最后修改時(shí)間: 20121016
*說(shuō)明????: 翻轉(zhuǎn)和旋轉(zhuǎn)不能同時(shí)生效
*************************************************************************************************************************/
void?Rotation_SetFlipDir(u8?Direction)
{
rGR_CTRLCFG?&=??~(0x3?<<?4); //清除設(shè)置
rGR_CTRLCFG?|=?(0x3?&?Direction)?<<?4;
}
/*************************************************************************************************************************
*函數(shù)???? : void?Rotation_SetSourImageAddr(u32?RGB_Y_Addr,u32?CB_Addr,u32?CR_Addr)
*功能???? : 設(shè)置源圖像地址
*參數(shù)???? : RGB_Y_Addr?:?RGB或者Y組成部分
*? CB_Addr:CB組成部分
*? CR_Addr:CR組成部分
*返回???? : 無(wú)
*依賴 :? 底層宏定義
*作者????? : cp1300@139.com
*時(shí)間????: 20121016
*最后修改時(shí)間: 20121016
*說(shuō)明????: 無(wú)
*************************************************************************************************************************/
void?Rotation_SetSourImageAddr(u32?RGB_Y_Addr,u32?CB_Addr,u32?CR_Addr)
{
rGR_SRCADDRREG0?=?RGB_Y_Addr;
rGR_SRCADDRREG1?=?CB_Addr;
rGR_SRCADDRREG2?=?CR_Addr;
}
/*************************************************************************************************************************
*函數(shù)???? : void?Rotation_SetDesImageAddr(u32?RGB_Y_Addr,u32?CB_Addr,u32?CR_Addr)
*功能???? : 設(shè)置目標(biāo)圖像地址
*參數(shù)???? : RGB_Y_Addr?:?RGB或者Y組成部分
*? CB_Addr:CB組成部分
*? CR_Addr:CR組成部分
*返回???? : 無(wú)
*依賴 :? 底層宏定義
*作者????? : cp1300@139.com
*時(shí)間????: 20121016
*最后修改時(shí)間: 20121016
*說(shuō)明????: 無(wú)
*************************************************************************************************************************/
void?Rotation_SetDesImageAddr(u32?RGB_Y_Addr,u32?CB_Addr,u32?CR_Addr)
{
rGR_DESTADDRREG0?=?RGB_Y_Addr;
rGR_DESTADDRREG1?=?CB_Addr;
rGR_DESTADDRREG2?=?CR_Addr;
}
/*************************************************************************************************************************
*函數(shù)???? : void?Rotation_SetImageSize(u16?VerSize,u16?HorSize)
*功能???? : 設(shè)置源圖像尺寸
*參數(shù)???? : VerSize:源圖像垂直尺寸
*? HorSize:源圖像水平尺寸
*返回???? : 無(wú)
*依賴 :? 底層宏定義
*作者????? : cp1300@139.com
*時(shí)間????: 20121016
*最后修改時(shí)間: 20121016
*說(shuō)明????: 無(wú)
*************************************************************************************************************************/
void?Rotation_SetImageSize(u16?VerSize,u16?HorSize)
{
rGR_SRCSIZEREG?=?((u32)VerSize?<<?16)?+?HorSize;
}
/*************************************************************************************************************************
*函數(shù)???? : void?GraphRotation_Init(void)
*功能???? : 初始化圖形旋轉(zhuǎn)模塊
*參數(shù)???? : 無(wú)
*返回???? : 無(wú)
*依賴 :? 底層宏定義
*作者????? : cp1300@139.com
*時(shí)間????: 20121015
*最后修改時(shí)間: 20121015
*說(shuō)明????: 無(wú)
*************************************************************************************************************************/
void?GraphRotation_Init(void)
{
Set_GateClk(HCLK_ROT,ENABLE); //使能圖形旋轉(zhuǎn)寄存器時(shí)鐘
}
/*************************************************************************************************************************
*函數(shù)???? : u8?Rotation_RGB565Image(u32?SourImageAddr,u32?DesImageAddr,u16?VerSize,u16?HorSize,u8?GR_Mode)?
*功能???? : 旋轉(zhuǎn)一張RGB565圖像
*參數(shù)???? : SourImageAddr:源圖像地址;DesImageAddr:目標(biāo)地址;VerSize:垂直分辨率;HorSize:水平分辨率;GR_Mode:旋轉(zhuǎn)或者翻轉(zhuǎn)模式
*返回???? : 0:成功;1:失敗
*依賴 :? 底層宏定義
*作者????? : cp1300@139.com
*時(shí)間????: 20121016
*最后修改時(shí)間: 20121016
*說(shuō)明????: 旋轉(zhuǎn)和翻轉(zhuǎn)無(wú)法同時(shí)使用
*************************************************************************************************************************/
u8?Rotation_RGB565Image(u32?SourImageAddr,u32?DesImageAddr,u16?VerSize,u16?HorSize,u8?GR_Mode)?
{
u32?cnt;
cnt?=?rGR_STATCFG; //讀取,消除狀態(tài)標(biāo)志
Rotation_SetInputImage(GR_RGB565); //設(shè)置源圖像為RGB565格式
Rotation_SetSourImageAddr(SourImageAddr,0,0); //設(shè)置源圖像地址
Rotation_SetDesImageAddr(DesImageAddr,0,0); //設(shè)置目標(biāo)圖像地址
Rotation_SetImageSize(VerSize,HorSize); //設(shè)置源圖像尺寸
if(GR_Mode?&?0x80) //翻轉(zhuǎn)
{
Rotation_SetRotationDeg(GR_0Deg); //不旋轉(zhuǎn)
Rotation_SetFlipDir(GR_Mode?-?0x80); //設(shè)置翻轉(zhuǎn)
}
else //旋轉(zhuǎn)
{
Rotation_SetFlipDir(0); //不翻轉(zhuǎn)
Rotation_SetRotationDeg(GR_Mode); //設(shè)置旋轉(zhuǎn)
}
rGR_CTRLCFG?|=?BIT0; //開(kāi)始旋轉(zhuǎn)
//用于等待旋轉(zhuǎn)成功
cnt?=?0;
while(!(rGR_STATCFG?&?BIT8))
{
cnt?++;
Delay_US(1);
if(cnt?>?GR_TIMEOUT) //等待超時(shí)
return?1;
}
return?0;
}
GraphRotation.h
/************************************************************************************************************* ?*?文件名: GraphRotation.h ?*?功能: S3C6410?圖形旋轉(zhuǎn)底層驅(qū)動(dòng)函數(shù) ?*?作者: cp1300@139.com ?*?創(chuàng)建時(shí)間: 2012年10月15日21:12 ?*?最后修改時(shí)間:2012年10月17日 ?*?詳細(xì): 圖形旋轉(zhuǎn)控制器底層驅(qū)動(dòng) *************************************************************************************************************/ #ifndef?GRAPHROTATION_H_ #define?GRAPHROTATION_H_ //旋轉(zhuǎn)圖像輸入格式 #define?GR_YUV420 0 #define?GR_YUV422 3 #define?GR_RGB565 4 #define?GR_RGB888 5 //旋轉(zhuǎn)程度 #define?GR_0Deg 0 //0 #define?GR_90Deg 1 //90 #define?GR_180Deg 2 //180 #define?GR_270Deg 3 //270 //翻轉(zhuǎn)定義 //0x80用于區(qū)分翻轉(zhuǎn)和旋轉(zhuǎn) #define?GR_NotFlip 0x80 //不翻轉(zhuǎn) #define?GR_VerFlip 0x82 //垂直翻轉(zhuǎn) #define?GR_HorFlip 0x83 //水平翻轉(zhuǎn) //相關(guān)函數(shù) void?GraphRotation_Init(void); //初始化 u8?Rotation_RGB565Image(u32?SourImageAddr,u32?DesImageAddr,u16?VerSize,u16?HorSize,u8?GR_Mode); //旋轉(zhuǎn)一張RGB565圖像 #endif?/*GRAPHROTATION_H_*/
//相關(guān)寄存器定義
//圖形旋轉(zhuǎn)?內(nèi)存映射 //寄存器?地址?讀/寫?描述?復(fù)位值 #define rGR_CTRLCFG? S3C6410_SFR32(0x77200000)? //讀/寫? 旋轉(zhuǎn)器控制寄存器? 0x0000_0000 #define rGR_SRCADDRREG0? S3C6410_SFR32(0x77200004)? //讀/寫? 旋轉(zhuǎn)器源圖像(RGB?或Y?組成部分)地址寄存器? 0x0000_0000 #define rGR_SRCADDRREG1? S3C6410_SFR32(0x77200008)? //讀/寫? 旋轉(zhuǎn)器源圖像(CB?組成部分)地址寄存器 0x0000_0000 #define rGR_SRCADDRREG2? S3C6410_SFR32(0x7720000C)? //讀/寫? 旋轉(zhuǎn)器源圖像(CR?組成部分)地址寄存器 0x0000_0000 #define rGR_SRCSIZEREG? S3C6410_SFR32(0x77200010)? //讀/寫? 旋轉(zhuǎn)器源圖像尺寸寄存器? 0x0000_0000 #define rGR_DESTADDRREG0? S3C6410_SFR32(0x77200018)? //讀/寫? 旋轉(zhuǎn)器目標(biāo)圖像(RGB?或Y?成分)地址寄存器 0x0000_0000 #define rGR_DESTADDRREG1? S3C6410_SFR32(0x7720001C)? //讀/寫? 旋轉(zhuǎn)器目標(biāo)圖像(CB?組成部分)地址寄存器 0x0000_0000 #define rGR_DESTADDRREG2? S3C6410_SFR32(0x77200020)? //讀/寫? 旋轉(zhuǎn)器目標(biāo)圖像(CR?組成部分)地址寄存器 0x0000_0000 #define rGR_STATCFG? S3C6410_SFR32(0x7720002C)? //讀? 旋轉(zhuǎn)器狀態(tài)寄存器? 0x0000_0000
//測(cè)試
#include?"system.h"
#include?"uart.h"
#include?"tft_lcd.h"
#include?"other.h"
#include?"delay.h"
#include?"timer.h"
#include?"ac97.h"
#include?"GraphRotation.h"
#include?"bmp.h"
//LED1閃爍程序,在定時(shí)器0中斷服務(wù)程序中閃爍,周期400MS
void?LED1_flash(void)
{
LED1_FLASH();
}
//將緩存圖像送到顯存
void?RAMBuff_To_GBuff(const?u16?*RAMAddr,vu16?(*GBuff)[LCD_XSIZE],u16?x0,u16?y0,u16?Hsize,u16?Vsize)
{
u16?x,y;
for(y?=?y0;y?<?y0?+?Vsize;y?++)
{
for(x?=?x0;x?<?x0?+?Hsize;x?++)
{
GBuff[y][x]?=?*RAMAddr++;
}
}
}
//主函數(shù)
int?main(void)
{
u16?ImgeBuff[240?*?320]; //目標(biāo)圖像緩沖區(qū),圖像分辨率240*320
LCD_Init(); //初始化LCD
UART0_Init(DISABLE,115200); //初始化串口,失能中斷接收,波特率115200
LED_Init(); //初始化LED
Timer1_Init(400000-1,ENABLE,LED1_flash); //初始化定時(shí)器0,周期400ms
lcd_printf("Get_FCLK?:?%d?Hzn",Get_FCLK());
lcd_printf("Get_PCLK?:?%d?Hzn",Get_PCLK());
//圖像旋轉(zhuǎn)測(cè)試
RAMBuff_To_GBuff((const?u16?*)gImage_bmp,LCD_BUFFER0,0,0,240,320); //顯示原圖形
GraphRotation_Init(); //初始化圖形旋轉(zhuǎn)模塊
Rotation_RGB565Image((u32)gImage_bmp,(u32)ImgeBuff,320,240,GR_90Deg); //圖像旋轉(zhuǎn)90°
RAMBuff_To_GBuff((const?u16?*)ImgeBuff,LCD_BUFFER0,240,0,320,240); //顯示旋轉(zhuǎn)90°圖形,長(zhǎng)寬對(duì)調(diào)
Rotation_RGB565Image((u32)gImage_bmp,(u32)ImgeBuff,320,240,GR_HorFlip); //圖像水平翻轉(zhuǎn)
RAMBuff_To_GBuff((const?u16?*)ImgeBuff,LCD_BUFFER0,240+320,0,240,320); //顯示水平翻轉(zhuǎn)的圖像,長(zhǎng)寬保持不變
while(1)
{
LED2_FLASH(); //LED2閃爍
Delay_US(600000);
}
}//原圖片
//開(kāi)發(fā)板上測(cè)試效果圖





