这个比较简单,一次成功,没遇到任何问题.
GraphRotation.c
/************************************************************************************************************* * 文件名: GraphRotation.c * 功能: S3C6410 图形旋转底层驱动函数 * 作者: [email protected] * 创建时间: 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 *返回 : 无 *依赖 : 底层宏定义 *作者 : [email protected] *时间 : 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 *返回 : 无 *依赖 : 底层宏定义 *作者 : [email protected] *时间 : 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 //水平翻转 *返回 : 无 *依赖 : 底层宏定义 *作者 : [email protected] *时间 : 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组成部分 *返回 : 无 *依赖 : 底层宏定义 *作者 : [email protected] *时间 : 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组成部分 *返回 : 无 *依赖 : 底层宏定义 *作者 : [email protected] *时间 : 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:源图像水平尺寸 *返回 : 无 *依赖 : 底层宏定义 *作者 : [email protected] *时间 : 20121016 *最后修改时间: 20121016 *说明 : 无 *************************************************************************************************************************/ void Rotation_SetImageSize(u16 VerSize,u16 HorSize) { rGR_SRCSIZEREG = ((u32)VerSize << 16) + HorSize; } /************************************************************************************************************************* *函数 : void GraphRotation_Init(void) *功能 : 初始化图形旋转模块 *参数 : 无 *返回 : 无 *依赖 : 底层宏定义 *作者 : [email protected] *时间 : 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:失败 *依赖 : 底层宏定义 *作者 : [email protected] *时间 : 20121016 *最后修改时间: 20121016 *说明 : 旋转和翻转无法同时使用 *************************************************************************************************************************/ u8 Rotation_RGB565Image(u32 SourImageAddr,u32 DesImageAddr,u16 VerSize,u16 HorSize,u8 GR_Mode) { u32 cnt; cnt = rGR_STATCFG; //读取,消除状态标志 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 * 功能: S3C6410 图形旋转底层驱动函数 * 作者: [email protected] * 创建时间: 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用于区分翻转和旋转 #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) //读 旋转器状态寄存器 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]; //目标图像缓冲区,图像分辨率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 Hz\n",Get_FCLK()); lcd_printf("Get_PCLK : %d Hz\n",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); } }
//开发板上测试效果图