您的位置:首页 > 其它

S3C6410图形旋转裸机驱动

2012-10-16 21:38 435 查看
这个比较简单,一次成功,没遇到任何问题.

GraphRotation.c

/*************************************************************************************************************
 * 文件名:	GraphRotation.c
 * 功能:		S3C6410 图形旋转底层驱动函数
 * 作者:		cp1300@139.com
 * 创建时间:	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;								//读取,消除状态标志
	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
 * 创建时间:	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);
	}
}


//原图片



//开发板上测试效果图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: