📄 etc.c
字号:
/*----------------------------------------------------------------------
*
* Filename:
* - etc.c
*
* Descriptions
* - Miscellaneout functions
*
* History
* -
*
* Copyright (c) 2003 SAMSUNG Electronics.
*
*----------------------------------------------------------------------
*/
#include "system.h"
#define IMAGE_MAXSIZE 1600
/*-----------------------------------------------------------
* Copy
*/
void Copy32(U32 sa, U32 da, U32 words)
{
U32 i;
for (i=0; i<words; i++)
*(U32 *)(da+i) = *(U32 *)(sa+i);
}
void Copy(U32* sa, U32* da, U32 num)
{
U32 i;
for (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;
int i;
bool ret = TRUE;
for (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 Compare3232(U32* a, U32* b, U32 num)
{
bool ret = TRUE;
U32 i;
for (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 Compare16(U16* a, U16* b, U32 num)
{
bool ret = TRUE;
U32 i;
for (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 Compare8(U8* a, U8* b, U32 num)
{
bool ret = TRUE;
U32 i;
for (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)
{
U32 uFileSize = 0;
#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 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
static void delay2(U32 steps, U32 cntFor100us)
{
int i;
for(; steps>0; steps--)
for(i=0; i<cntFor100us; i++);
}
void TuneDelay(void)
{
U32 i, 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 + -