⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 etc.cpp

📁 三星公司S3c2443的测试程序源码
💻 CPP
字号:
/*----------------------------------------------------------------------
 *
 * Filename:
 * - etc.c
 *
 * Descriptions
 * - Miscellaneout functions
 *
 * History
 * -
 *
 * Copyright (c) 2003 SAMSUNG Electronics.
 *
 *----------------------------------------------------------------------
 */
#include <stdio.h>
#include <string.h>
#include "system.h"
#include "console.h"
#include "Def.h"

#define IMAGE_MAXSIZE 1600


/*-----------------------------------------------------------
 * Copy
 */
void Copy32(U32 sa, U32 da, U32 words)
{
	for (U32 i=0; i<words; i++)
		*(U32 *)(da+i) = *(U32 *)(sa+i);
}

void Copy(U32* sa, U32* da, U32 num)
{
	for (U32 i=0; i<num; i++)
		*(da+i) = *(sa+i);
}


bool Compare32(U32 a0, U32 a1, U32 words)
{
	U32* pD0 = (U32 *)a0;
	U32* pD1 = (U32 *)a1;

	bool ret = true;
	
	for (int i=0; i<words; i++)
	{
		if (*pD0 != *pD1) {
			ret = false;
			//gh0522.cha printf(" %08x=%08x : %08x=%08x\n", pD0, *pD0, pD1, *pD1);
		}
		pD0++;
		pD1++;
	}

	return ret;
}

bool Compare(U32* a, U32* b, U32 num)
{
	bool ret = true;
	
	for (U32 i=0; i<num; i++)
		if (*(a+i) != *(b+i)) 
			ret = false, printf(" %08x=%08x : %08x=%08x\n", a+i, *(a+i), b+i, *(b+i));

	return ret;
}

bool Compare(U16* a, U16* b, U32 num)
{
	bool ret = true;
	
	for (U32 i=0; i<num; i++)
		if (*(a+i) != *(b+i)) 
			ret = false, printf(" %08x=%04x : %08x=%04x\n", a+i, *(a+i), b+i, *(b+i));

	return ret;
}

bool Compare(U8* a, U8* b, U32 num)
{
	bool ret = true;
	
	for (U32 i=0; i<num; i++)
		if (*(a+i) != *(b+i)) 
			ret = false, printf(" %08x=%02x : %08x=%02x\n", a+i, *(a+i), b+i, *(b+i));

	return ret;
}


void CopyUp(U32 uSrcAddr, U32 uDestAddr, U32 uBytes)
{

	memcpy((void *)uDestAddr, (void *)uSrcAddr, uBytes);
}

void CopyDown(U32 uSrcAddr, U32 uDestAddr, U32 uBytes)
{
#if 1
	memcpy((void *)uDestAddr, (void *)uSrcAddr, uBytes);
#elif 0
	/* It is used in the case the transfer is thru AHB-AHB bridges */
	U32 i;
	for (i=0; i<(uBytes+4); i+=4)
	{
		*(U32 *)(uDestAddr+i) = *(U32 *)(uSrcAddr+i);
	}
#else
	DMA Dma;
	Dma.MoveMem(uSrcAddr, uDestAddr, uBytes);
#endif
}

U32 LoadFile(const char* fileName, U32 uDstAddr, bool bAsk)
{
	FILE* fp;
	U32 read, uFileSize;
	int sel;
#if 0
	fp = fopen(fileName, "rb");
	Assert(fp);
	fseek(fp, 0, SEEK_END);
	uFileSize = ftell(fp);
	rewind(fp);

	if (bAsk)
	{
		printf("Enter 1 if the file is to be loaded !\n");
		sel = GetInt();
	}
	else
		sel = 1;
	
	if (sel == 1)
	{
		read = fread((void *)uDstAddr, sizeof(unsigned char), uFileSize, fp);
		Assert(read==uFileSize);
	}
	
	fclose(fp);
	
#endif
	return uFileSize;
}

void LoadFile(const char* fileName, U32 uDstAddr, U32& uFileSize, bool bAsk)
{
#if 0
	FILE* fp;
	U32 read;
	int sel;

	fp = fopen(fileName, "rb");
	Assert(fp);
	fseek(fp, 0, SEEK_END);
	uFileSize = ftell(fp);
    rewind(fp);

	if (bAsk)
	{
		printf("Enter 1 if the file is to be loaded !\n");
		sel = GetInt();
	}
	else
		sel = 1;
	
	if (sel == 1)
	{
		read = fread((void *)uDstAddr, sizeof(unsigned char), uFileSize, fp);
		Assert(read==uFileSize);
	}
	
	fclose(fp);
#endif	
}

void SaveToFile(const char* fileName, U32 fileSize, U32 uSrcAddr)
{
#if 0
	FILE* fp = fopen(fileName, "wb");
	Assert(fp);
	
	U32 written = fwrite((void *)uSrcAddr, sizeof(unsigned char), fileSize, fp);
	Assert(written == fileSize);

	fclose(fp);
#endif	
}

// 24bpp BMP -> 16bpp RGB
void ConvertBmpToRgb16bpp(U32 fromAddr, U32 toAddr, U32 xSize, U32 ySize)
{
	U32 i,x,y;
	U16 *lcdFramePtr;
	U16 *tempPtr;
	U16 temp[IMAGE_MAXSIZE];
	U32 tempBuffer = fromAddr + 0x400000; // up to 1600x1200
	U8 b,g,r;
	
	U8 *srcPtr=(U8 *)(fromAddr+54);
	lcdFramePtr=(U16 *)(toAddr);

	for(y=0;y<ySize;y++) {
		for(x=0;x<xSize*3;x++) {
			b=*srcPtr++;
			g=*srcPtr++;
			r=*srcPtr++;

			*lcdFramePtr++=(r>>3)<<11|(g>>2)<<5|(b>>3)<<0;
		}
	}

	lcdFramePtr=(U16 *)(toAddr+xSize*ySize*2-2);
	tempPtr=(U16 *)(tempBuffer);
	for(y=0;y<xSize*ySize;y++) {
		*tempPtr++=*lcdFramePtr--;
	}

	lcdFramePtr=(U16 *)(toAddr);
	tempPtr=(U16 *)(tempBuffer);
	for(y=0;y<ySize;y++) {
		for(x=0;x<xSize;x++) {
			temp[(xSize-1)-x]=*tempPtr++;
		}
		if(x==xSize) {
			for(i=0;i<xSize;i++)
				*lcdFramePtr++=temp[i];
		}
	}
}

// 24bpp BMP -> 24bpp RGB
void ConvertBmpToRgb24bpp(U32 fromAddr, U32 toAddr, U32 xSize, U32 ySize)
{
	U32 i,x,y;
	U32 *lcdFramePtr,*tempPtr;
	U32 temp[IMAGE_MAXSIZE];
	U32 tempBuffer = fromAddr + 0x760000; // up to 1600x1200
    U8 b,g,r;
	
	U8 *srcPtr=(U8 *)(fromAddr+54);
	lcdFramePtr=(U32 *)(toAddr);
   	for(y=0;y<xSize*ySize;y++) {
    	b=*srcPtr++;
    	g=*srcPtr++;
	    r=*srcPtr++;

	    *lcdFramePtr++=(r<<16)|(g<<8)|(b<<0);
	}

	lcdFramePtr=(U32 *)(toAddr+xSize*ySize*4-4);
	tempPtr=(U32 *)(tempBuffer);
    for(y=0;y<xSize*ySize;y++) {
	    *tempPtr++=*lcdFramePtr--;
    }

	lcdFramePtr=(U32 *)(toAddr);
	tempPtr=(U32 *)(tempBuffer);
    for(y=0;y<ySize;y++) {
	    for(x=0;x<xSize;x++) {
			temp[(xSize-1)-x]=*tempPtr++;
	    }
	    if(x==xSize) {	    	
		   	for(i=0;i<xSize;i++)
		    	*lcdFramePtr++=temp[i];
		}
	}	

}

// Bmp 24bpp -> Rgb 16 or 24bpp
void ConvertBmpToRgb(U32 fromAddr, U32 toAddr, U32 xSize, U32 ySize, U32 bpp)
{
	if (bpp == 16) 
	{		
		ConvertBmpToRgb16bpp(fromAddr, toAddr, xSize, ySize);
	} 
	else if (bpp == 24) 
	{
		ConvertBmpToRgb24bpp(fromAddr, toAddr, xSize, ySize);
	} 
	else 
	{
		printf("bpp should be 16 or 24 at ConvertBmpToRgb()\n");
	}
}

/*-----------------------------------------------------------
 * MemDump
 */
void Dump32(U32 addr, U32 words)
{
	int i, j;
	U32 *pMem;

	pMem = (U32 *)(addr/4*4);

	printf("\n");
	for(i=0; i<words; )
	{
		printf(" %3d: ", i);

		for(j=0; j<8; j++)
			printf("%08x ", *pMem++),
			i++;
		printf("\n");
	}
}

void Dump16(U32 addr, U32 hwords)
{
	int i, j;
	U16 *pMem;

	pMem = (U16 *)(addr/2*2);

	printf("\n");
	for(i=0; i<hwords; )
	{
		printf(" %3d: ", i);

		for(j=0; j<16; j++)
			printf("%04x ", *pMem++),
			i++;
		printf("\n");
	}
}

void Dump8(U32 addr, U32 bytes)
{
	int i, j;
	U8 *pMem;

	pMem = (U8 *)addr;

	printf("\n");
	for(i=0; i<bytes; )
	{
		printf(" %3d: ", i);

		for(j=0; j<32; j++)
			printf("%02x ", *pMem++),
			i++;
		printf("\n");
	}
}

/*-----------------------------------------------------------
 * Delay
 *  - Delay for 100us step.
 *
 */
#if 0
#define CNT_FOR_TENTH_MSEC 820 /* FCLK = 100MHz */
#else
#define CNT_FOR_TENTH_MSEC 2500 //413 /* HCLKin:HCLKout = 1:1, HCLK = 25MHz */
#endif

void Delay(U32 steps)
{
	int i;

	for(; steps>0; steps--)
		for(i=0; i<CNT_FOR_TENTH_MSEC; i++);
}

static void delay2(U32 steps, U32 cntFor100us)
{
	int i;

	for(; steps>0; steps--)
		for(i=0; i<cntFor100us; i++);
}

void TuneDelay(void)
{
	U32 i, r, j, sel, cntFor100us;
	int val;

	cntFor100us = CNT_FOR_TENTH_MSEC;

	while(1)
	{

		printf(" 0. Exit\n");
		printf(" 1. Enter the count value.\n");
		printf(" 2. Count in every one sec.\n");
		printf(" 3. Count in every one sec printflay the value of the timer.\n");
		printf(" Which one ? ");

		sel = GetIntNum();

		if (sel == 0)
			break;
		else if (sel == 1)
		{
			printf("  Current count value for 100us is %d. Enter the new value: ", 
cntFor100us);
			val = GetIntNum();
			if (val != -1)
				cntFor100us = val;
		}
		else if (sel == 2)
		{
			for (i=0; i<60; i++)
			{
				printf("%d ", i);

				for (j=0; j<100; j++)
					delay2(100, cntFor100us);

				if (getchar()!= 0)
					break;
			}
		}
#if 0		
		else if (sel == 3)
		{
			for (i=0; i<60; i++)
			{
				printf("%d ", i);

				TimerStart();

				for (j=0; j<100; j++)
					delay2(100, cntFor100us);

				printf("(%d) ",TimerRead());

				if (Uartgetchar()() != 0)
					break;
			}
		}
#endif		
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -