📄 db_dram.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ct_type.h"
/*******************************************************************************************/
#if 1
#define DBDRAM_MSG(p)
#else
#define DBDRAM_MSG(p) printf p
#endif
#if 1
#define DBDRAM_DBG(p)
#else
#define DBDRAM_DBG(p) printf p
#endif
/*******************************************************************************************/
/*******************************************************************************************/
//#define DVB_DRAM_DEBUG
/*******************************************************************************************/
void DVB_DramPhaseAdjustment(u8 u8Data)
{
}
/*******************************************************************************************/
bool8 DVB_DramWrite(u32 u32address, u8* pu8buffer, u16 u16buffer_size)
{
if (pu8buffer==NULL)
{
return FALSE;
}
memcpy((u8*)u32address, pu8buffer,u16buffer_size);
return TRUE;
}
/*******************************************************************************************/
bool8 DVB_DramRead(u32 u32address, u8* pu8buffer, u16 u16buffer_size)
{
if (pu8buffer==NULL)
{
return FALSE;
}
memcpy(pu8buffer,(u8*)u32address, u16buffer_size);
return TRUE;
}
/*******************************************************************************************/
bool8 DVB_DramCopy(u32 u32destination, u32 u32source, u32 u32length)
{
memcpy((u8*)u32destination,(u8*)u32source,u32length);
return TRUE;
}
/*******************************************************************************************/
bool8 DVB_DramSet( u32 u32destination, u8 u8set_value, u32 u32length)
{
memset((u8*)u32destination,u8set_value,u32length);
return TRUE;
}
/*******************************************************************************************/
u16 DVB_DramCompare( u32 u32Address1, u32 u32Address2, u16 u16ItemSize, u16 u16ItemNumber )
{
return 0;
}
/*******************************************************************************************/
u16 DVB_DramSearch(u32 u32address, u16 u16item_size, u16 u16item_num, u32 u32mask, u32 u32mach, bool8 b8Increase)
{
u16 u16ItemCount;
u8* pu8Mask;
u8* pu8Mach;
u8* pu8CmpPtr;
pu8Mask = (u8*)&u32mask;
pu8Mach = (u8*)&u32mach;
for (u16ItemCount = 0;u16ItemCount < u16item_num; u16ItemCount++)
{
if (b8Increase==TRUE)
{
pu8CmpPtr = (u8*)(u32address + (u16item_size*u16ItemCount));
}
else
{
pu8CmpPtr = (u8*)(u32address - (u16item_size*u16ItemCount));
}
if (((*pu8CmpPtr&*pu8Mask) ==(*pu8Mach&*pu8Mask))&&
((*(pu8CmpPtr+1)&*(pu8Mask+1))==(*(pu8Mach+1)&*(pu8Mask+1)))&&
((*(pu8CmpPtr+2)&*(pu8Mask+2))==(*(pu8Mach+2)&*(pu8Mask+2)))&&
((*(pu8CmpPtr+3)&*(pu8Mask+3))==(*(pu8Mach+3)&*(pu8Mask+3))))
{
#ifdef DVB_DRAM_DEBUG
DBDRAM_DBG(("\n> u16ItemCount [%08X]= %d",pu8CmpPtr,u16ItemCount));
DBDRAM_DBG(("\n>> [%02X] %02X == [%02X] %02X",*pu8CmpPtr,(*pu8CmpPtr&*pu8Mask),*pu8Mach,(*pu8Mach&*pu8Mask)));
DBDRAM_DBG(("\n>> [%02X] %02X == [%02X] %02X",*(pu8CmpPtr+1),(*(pu8CmpPtr+1)&*(pu8Mask+1)),*(pu8Mach+1),(*(pu8Mach+1)&*(pu8Mask+1))));
DBDRAM_DBG(("\n>> [%02X] %02X == [%02X] %02X",*(pu8CmpPtr+2),(*(pu8CmpPtr+2)&*(pu8Mask+2)),*(pu8Mach+2),(*(pu8Mach+2)&*(pu8Mask+2))));
DBDRAM_DBG(("\n>> [%02X] %02X == [%02X] %02X",*(pu8CmpPtr+3),(*(pu8CmpPtr+3)&*(pu8Mask+3)),*(pu8Mach+3),(*(pu8Mach+3)&*(pu8Mask+3))));
#endif
break;
}
}
return u16ItemCount;
}
/*******************************************************************************************/
u16 DVB_DramCount(u32 u32address, u16 u16item_size, u16 u16item_num, u32 u32mask, u32 u32mach)
{
u16 u16ItemCount;
u16 u16FindItemCount;
u8* pu8Mask;
u8* pu8Mach;
u8* pu8CmpPtr;
pu8Mask = (u8*)&u32mask;
pu8Mach = (u8*)&u32mach;
u16FindItemCount = 0;
for (u16ItemCount = 0;u16ItemCount < u16item_num; u16ItemCount++)
{
pu8CmpPtr = (u8*)(u32address + (u16item_size*u16ItemCount));
if (((*pu8CmpPtr&*pu8Mask) ==(*pu8Mach&*pu8Mask))&&
((*(pu8CmpPtr+1)&*(pu8Mask+1))==(*(pu8Mach+1)&*(pu8Mask+1)))&&
((*(pu8CmpPtr+2)&*(pu8Mask+2))==(*(pu8Mach+2)&*(pu8Mask+2)))&&
((*(pu8CmpPtr+3)&*(pu8Mask+3))==(*(pu8Mach+3)&*(pu8Mask+3))))
{
#ifdef DVB_DRAM_DEBUG
DBDRAM_DBG(("\n> u16ItemCount [%08X]= %d",pu8CmpPtr,u16ItemCount));
DBDRAM_DBG(("\n>> [%02X] %02X == [%02X] %02X",*pu8CmpPtr,(*pu8CmpPtr&*pu8Mask),*pu8Mach,(*pu8Mach&*pu8Mask)));
DBDRAM_DBG(("\n>> [%02X] %02X == [%02X] %02X",*(pu8CmpPtr+1),(*(pu8CmpPtr+1)&*(pu8Mask+1)),*(pu8Mach+1),(*(pu8Mach+1)&*(pu8Mask+1))));
DBDRAM_DBG(("\n>> [%02X] %02X == [%02X] %02X",*(pu8CmpPtr+2),(*(pu8CmpPtr+2)&*(pu8Mask+2)),*(pu8Mach+2),(*(pu8Mach+2)&*(pu8Mask+2))));
DBDRAM_DBG(("\n>> [%02X] %02X == [%02X] %02X",*(pu8CmpPtr+3),(*(pu8CmpPtr+3)&*(pu8Mask+3)),*(pu8Mach+3),(*(pu8Mach+3)&*(pu8Mask+3))));
#endif
u16FindItemCount++;
}
}
return u16FindItemCount;
}
/*******************************************************************************************/
u16 DVB_DramBuildIAT( u32 u32DP, u8 u8RecordSize,u16 u16NumOfRecord, u32 u32IAT, u16 u16NumOfIAT, u8 u8SubID )
{
#if 0
if((u32DP&0x03)!=0 ||
(u8RecordSize&0x03)!=0 ||
(u32IAT&0x03)!=0)
{
_alignment_error();
return 0xffff;
}
__dwW99AVCmdArg[0]= 6; // number of ARG0~ARG15
__dwW99AVCmdArg[1]= 0x10; // CMDARG
__dwW99AVCmdArg[2]= u32address;
__dwW99AVCmdArg[3]= u32mask;
__dwW99AVCmdArg[4]= u32mach;
__dwW99AVCmdArg[5]= b8Increase;
__dwW99AVCmdArg[5]= (__dwW99AVCmdArg[5]<<16)+u16item_size;
__dwW99AVCmdArg[6]= u16item_num;
// DBDRAM_DBG(("MMMMMM%lx, %lx, %lx, %lx, %lx....\n", __dwW99AVCmdArg[2], __dwW99AVCmdArg[3], __dwW99AVCmdArg[4], __dwW99AVCmdArg[5], __dwW99AVCmdArg[6] ));
if( W99AV_CommandN(0x1c) )
{
W99AV_OutIndex(0x10000005);
u32address = W99AV_InData();
// DBDRAM_DBG(("%lx\n", u32address));
u16item_num = u32address>>16;
}
#endif
return 0xffff;
}
/*******************************************************************************************/
#if 0
void _dram_test(u8 u8Mode)
{
u8* pu8Addr;
u32 u32Address;
u32 u32Address2;
u32 u32Test;
u32 u32Test2;
u16 u16RetValue;
u8 au8Test[4];
u32Address = 0x40200000;
u32Address2 = 0x40100000;
switch(u8Mode)
{
default:
case 0: // Address Test // Dram Set
DVB_DramSet(u32Address,0xFF,64);
pu8Addr = (u8*)u32Address;
*(pu8Addr) = 1;
pu8Addr = (u8*)u32Address + 1;
*(pu8Addr) = 2;
pu8Addr = (u8*)u32Address + 2;
*(pu8Addr) = 3;
pu8Addr = (u8*)u32Address + 3;
*(pu8Addr) = 4;
pu8Addr = (u8*)u32Address + 4;
*(pu8Addr) = 5;
break;
case 1: // Write Test
u32Test = 0x05060708;
au8Test[0] = 0x09;
au8Test[1] = 0x0A;
au8Test[2] = 0x0B;
au8Test[3] = 0x0C;
DVB_DramWrite(u32Address, (u8*)&u32Test, 4);
DVB_DramWrite(u32Address+4,(u8*) au8Test, 4);
break;
case 2: // Read Test
u32Test = 0x00;
au8Test[0] = 0x00;
au8Test[1] = 0x00;
au8Test[2] = 0x00;
au8Test[3] = 0x00;
DVB_DramRead(u32Address, (u8*)&u32Test, 4);
DBDRAM_DBG(("\n dram read: %08X\n", u32Test));
DVB_DramRead(u32Address+1, (u8*)&u32Test, 4);
DBDRAM_DBG(("\n dram read: %08X\n", u32Test));
DVB_DramRead(u32Address+2, (u8*)&u32Test, 4);
DBDRAM_DBG(("\n dram read: %08X\n", u32Test));
DVB_DramRead(u32Address+3, (u8*)&u32Test, 4);
DBDRAM_DBG(("\n dram read: %08X\n", u32Test));
DVB_DramRead(u32Address+4, (u8*)au8Test, 4);
DBDRAM_DBG(("\n dram read: %02X %02X %02X %02X\n",
au8Test[0],au8Test[1],au8Test[2],au8Test[3]));
break;
case 3: // Dram Copy
DVB_DramCopy(u32Address+32,u32Address,16);
DVB_DramDump(u32Address,64);
break;
case 4: // Dram Search
DVB_DramSet(u32Address2,0x00,0x1000);
u32Test = 0x6d616361;
DVB_DramWrite(u32Address2+(36*3), (u8*)&u32Test, 4);
u32Test = 0x75330000;
DVB_DramWrite(u32Address2+(36*3)+4, (u8*)&u32Test, 4);
u32Test = 0x6d616361;
DVB_DramWrite(u32Address2+(36*5), (u8*)&u32Test, 4);
u32Test = 0x75360000;
DVB_DramWrite(u32Address2+(36*5)+4, (u8*)&u32Test, 4);
u32Test = 0x61636100;
u32Test2 = 0xFFFFFF00;
u16RetValue= 0;
u16RetValue = DVB_DramSearch(u32Address2+1,36,6,u32Test2,u32Test,TRUE);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x6d616361;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramSearch(u32Address2+1,36,6,u32Test2,u32Test,TRUE);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x6d616361;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramSearch(u32Address2,36,6,u32Test2,u32Test,TRUE);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x63617531;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramSearch(u32Address2+2,36,6,u32Test2,u32Test,TRUE);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x63617533;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramSearch(u32Address2+2,36,6,u32Test2,u32Test,TRUE);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x63617535;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramSearch(u32Address2+2,36,6,u32Test2,u32Test,TRUE);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x63617532;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramSearch(u32Address2+2,36,6,u32Test2,u32Test,TRUE);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x63617534;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramSearch(u32Address2+2,36,6,u32Test2,u32Test,TRUE);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x63617536;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramSearch(u32Address2+2,36,6,u32Test2,u32Test,TRUE);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
break;
case 5: // Dram Count
DVB_DramSet(u32Address2,0x00,0x1000);
u32Test = 0x6d616361;
DVB_DramWrite(u32Address2+(36*2), (u8*)&u32Test, 4);
u32Test = 0x75330000;
DVB_DramWrite(u32Address2+(36*2)+4, (u8*)&u32Test, 4);
u32Test = 0x6d616361;
DVB_DramWrite(u32Address2+(36*5), (u8*)&u32Test, 4);
u32Test = 0x75360000;
DVB_DramWrite(u32Address2+(36*5)+4, (u8*)&u32Test, 4);
u32Test = 0x61636100;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramCount(u32Address2+1,36,6,u32Test2,u32Test);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x6d616361;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramCount(u32Address2+1,36,6,u32Test2,u32Test);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x6d616361;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramCount(u32Address2,36,6,u32Test2,u32Test);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x63617531;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramCount(u32Address2+2,36,6,u32Test2,u32Test);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x63617533;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramCount(u32Address2+2,36,6,u32Test2,u32Test);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x63617535;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramCount(u32Address2+2,36,6,u32Test2,u32Test);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x63617532;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramCount(u32Address2+2,36,6,u32Test2,u32Test);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x63617534;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramCount(u32Address2+2,36,6,u32Test2,u32Test);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
u32Test = 0x63617536;
u32Test2 = 0xFFFFFFFF;
u16RetValue= 0;
u16RetValue = DVB_DramCount(u32Address2+2,36,6,u32Test2,u32Test);
DBDRAM_DBG(("\n>> Dram Search Ret = %d",u16RetValue));
break;
case 7: // Dump Test
u32Address = (u32)0x40160000;
DVB_DramSet(u32Address,0x00,0x1000);
break;
case 8:
u32Address = (u32)0x40160000;
DVB_DramDump(u32Address,0x1000);
break;
case 9: // Dump Test
DVB_DramDump(u32Address,128);
DVB_DramDump(u32Address2,256);
break;
}
}
#endif
/*******************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -