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