当前位置:首页 > 芯闻号 > 充电吧
[导读]这个比较简单,一次成功,没遇到任何问题.GraphRotation.c/****************************************************************

这个比较简单,一次成功,没遇到任何问题.


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 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);
	}
}


//原图片

//开发板上测试效果图


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

针对传统类人机器人在控制系统实时性和视觉识别方面的不足,以S3C6410作为主控芯片,设计了具有视觉识别功能的类人机器人控制系统,通过改进和简化视频识别算法取得了良好的目标识别效果。实验表明,基

关键字: s3c6410 机器人 机器视觉

早在今年8月份的时候就将jpeg解码弄好了,但是一直以来非常的不稳定,如果修改了任意地方的代码都会造成解码可能失败,起初我以为是堆栈问题,或者后面有非法指针,但是都没得到结果,最后让我只能怀疑编译器了,而且

关键字: jpeg解码 s3c6410

这几天晚上一直折腾S3C6410的裸机SD卡启动,不大想使用UBOOT,我是搞硬件的,对底层非常感兴趣,不喜欢已经写好的,因此自己一直在尝试,其实很早之前就试过SD卡启动,也就是ARM11上电后会把SD卡倒数第9KB开始...

关键字: s3c6410 sd 裸机启动 boot启动

简单地说,IAR调试S3C6410可以分成以下3个步骤:1)编写mac文件,初始化S3C6410的看门狗、时钟、DDRAM控制器等,为下载代码做准备。2)编写icf文件对S3C6410的内存空间进行分配,配置堆栈段、...

关键字: iar调试 s3c6410

主要过程:. 安装lunux 环境. 安装编译工具. 下载Linux kernel. 安装AndroidSDK. 获得root file system. 修改Linux kernel 源码. 配置Linux kernel...

关键字: Android s3c6410 内核 移植

之前一直不知道如何使能硬件协处理器,刚刚在网上找到了方法,配置好RVDS,选择相应的内核,选择硬件VFP在初始化代码中加入VFPEnable EQU (0x40000000) ;VFP使能...

关键字: s3c6410 vfp 浮点协处理器

         虽然S3C6410出来很多年了,甚至于已经停产了,出货的几乎都有依赖于库存,SE4500也出来很多年了,但是网上依旧不会有调试资料帮助你,一切源于自私。希望本文能帮到你,不必感谢。本

关键字: s3c6410 se4500

/*************************************************************************************************************...

关键字: s3c6410 裸机dma

要确保S3C6410已经初始化,一般是使用UBOOT初始化 //串口寄存器//UART0#defineULCON0                *((vu32*)0x7F005000)       

关键字: s3c6410 uart驱动

裸机程序中可能用到的文件以及函数//system.c/*************************************************************************

关键字: s3c6410 裸机程序
关闭
关闭