|
我有一个YC2440的板,它有两个LCD屏接口,在wince下面后屏可以正常显示,通过人为的控制也可以让前屏显示,但是在linux下面设备文件中只有一个fb0,后屏正常显示,不知道怎么才能让前屏也正常显示?
下面是wince下控制前屏显示的代码:
关于硬件IO操作,在Wince下是先VirtualCopy一段物理地址到当前进程的虚拟空间,然后直接操作即可,例子如下,需要改成linux下的
头文件部分
#ifdef __cplusplus
extern "C"
{
#endif
BOOL VirtualCopy( LPVOID, LPVOID, DWORD, DWORD );
#ifdef __cplusplus
}
#endif
#define IOP_BASE 0xB1600000 // 0x56000000
#define IOP_PHY_BASE 0x56000000
typedef struct {
unsigned int rGPACON; // 00
unsigned int rGPADAT;
unsigned int rPAD1[2];
unsigned int rGPBCON; // 10
unsigned int rGPBDAT;
unsigned int rGPBUP;
unsigned int rPAD2;
unsigned int rGPCCON; // 20
unsigned int rGPCDAT;
unsigned int rGPCUP;
unsigned int rPAD3;
unsigned int rGPDCON; // 30
unsigned int rGPDDAT;
unsigned int rGPDUP;
unsigned int rPAD4;
unsigned int rGPECON; // 40
unsigned int rGPEDAT;
unsigned int rGPEUP;
unsigned int rPAD5;
unsigned int rGPFCON; // 50
unsigned int rGPFDAT;
unsigned int rGPFUP;
unsigned int rPAD6;
unsigned int rGPGCON; // 60
unsigned int rGPGDAT;
unsigned int rGPGUP;
unsigned int rPAD7;
unsigned int rGPHCON; // 70
unsigned int rGPHDAT;
unsigned int rGPHUP;
unsigned int rPAD8;
unsigned int rMISCCR; // 80
unsigned int rDCKCON;
unsigned int rEXTINT0;
unsigned int rEXTINT1;
unsigned int rEXTINT2; // 90
unsigned int rEINTFLT0;
unsigned int rEINTFLT1;
unsigned int rEINTFLT2;
unsigned int rEINTFLT3; // A0
unsigned int rEINTMASK;
unsigned int rEINTPEND;
unsigned int rGSTATUS0; // AC
unsigned int rGSTATUS1; // B0
unsigned int rGSTATUS2; // B4
unsigned int rGSTATUS3; // B8
unsigned int rGSTATUS4; // BC
/////////////////add by srd//////////////////////
unsigned int rPAD9;//C0
unsigned int rPAD10;
unsigned int rPAD11;
unsigned int rPAD12;
unsigned int rGPJCON; // D0
unsigned int rGPJDAT;
unsigned int rGPJUP;
unsigned int rPAD13;
}IOPreg;
#define CLKPWR_BASE 0xB0C00000 // 0x4C000000
typedef struct {
unsigned long rLOCKTIME;//00
unsigned long rMPLLCON;//04
unsigned long rUPLLCON;//08
unsigned long rCLKCON;//0C
unsigned long rCLKSLOW;//10
unsigned long rCLKDIVN;//14
}CLKPWRreg;
#define PWM_BASE 0xB1100000 // 0x51000000
typedef struct {
unsigned int rTCFG0;//00
unsigned int rTCFG1;//04
unsigned int rTCON;//08
unsigned int rTCNTB0;//0C
unsigned int rTCMPB0;//10
unsigned int rTCNTO0;//14
unsigned int rTCNTB1;
unsigned int rTCMPB1;
unsigned int rTCNTO1;
// unsigned int rTCNTB2;
/// unsigned int rTCMPB2;
// unsigned int rTCNTO2;
// unsigned int rTCNTB3;
// unsigned int rTCMPB3;
// unsigned int rTCNTO3;
// unsigned int rTCNTB4;
// unsigned int rTCNTO4;
}PWMreg ;
#define ADC_BASE 0xB1800000 // 0x58000000
typedef struct {
unsigned int rADCCON;
unsigned int rADCTSC;
unsigned int rADCDLY;
unsigned int rADCDAT0;
unsigned int rADCDAT1;
}ADCreg ;
函数部分
初始化
///////////////////////////////////////////////// 虚拟地址 物理地址 映射 ////////////////////////////////
v_pIOPRegs = (volatile IOPreg*)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
if (v_pIOPRegs == NULL)
{
RETAILMSG (1,(TEXT("v_pIOPRegs is not allocated\n\r")));
// return TRUE;
}
if (!VirtualCopy((PVOID)v_pIOPRegs, (PVOID)IOP_BASE, sizeof(IOPreg), PAGE_READWRITE|PAGE_NOCACHE))
{
RETAILMSG (1,(TEXT("v_pIOPRegs is not mapped\n\r")));
// return TRUE;
}
RETAILMSG (1,(TEXT("v_pIOPRegs is mapped to %x\n\r"), v_pIOPRegs));
v_pCLKPWRegs = (volatile CLKPWRreg*)VirtualAlloc(0, sizeof(CLKPWRreg), MEM_RESERVE, PAGE_NOACCESS);
if (v_pCLKPWRegs == NULL)
{
RETAILMSG (1,(TEXT("v_pCLKPWRegs is not allocated\n\r")));
// return TRUE;
}
if (!VirtualCopy((PVOID)v_pCLKPWRegs, (PVOID)CLKPWR_BASE, sizeof(CLKPWRreg), PAGE_READWRITE|PAGE_NOCACHE))
{
RETAILMSG (1,(TEXT("v_pCLKPWRegs is not mapped\n\r")));
// return TRUE;
}
RETAILMSG (1,(TEXT("v_pCLKPWRegs is mapped to %x\n\r"), v_pCLKPWRegs));
v_pPWMRegs= (volatile PWMreg*)VirtualAlloc(0, sizeof(PWMreg), MEM_RESERVE, PAGE_NOACCESS);
if (v_pPWMRegs == NULL)
{
RETAILMSG (1,(TEXT("v_pPWMRegs is not allocated\n\r")));
// return TRUE;
}
if (!VirtualCopy((PVOID)v_pPWMRegs, (PVOID)PWM_BASE, sizeof(PWMreg), PAGE_READWRITE|PAGE_NOCACHE))
{
RETAILMSG (1,(TEXT("v_pPWMRegs is not mapped\n\r")));
//return TRUE;
}
RETAILMSG (1,(TEXT("v_pPWMRegs is mapped to %x\n\r"), v_pPWMRegs));
v_pADCRegs = (volatile ADCreg*)VirtualAlloc(0, sizeof(ADCreg), MEM_RESERVE, PAGE_NOACCESS);
if (v_pADCRegs == NULL)
{
DEBUGMSG (1,(TEXT("v_pADCRegs is not allocated\n\r")));
// return TRUE;
}
if (!VirtualCopy((PVOID)v_pADCRegs, (PVOID)ADC_BASE, sizeof(ADCreg), PAGE_READWRITE|PAGE_NOCACHE))
{
DEBUGMSG (1,(TEXT("v_pADCRegs is not mapped\n\r")));
// return TRUE;
}
DEBUGMSG (1,(TEXT("v_pADCRegs is mapped to %x\n\r"), v_pADCRegs));
/*设置亮度开始*/
v_pIOPRegs->rGPBCON&=~0x0f; //将GPB对应的设置为TOUT0,1
v_pIOPRegs->rGPBCON|=0x0a;
v_pIOPRegs->rGPBUP|= 0x4;
v_pPWMRegs->rTCFG0|=24; //预分频设置(与触摸屏驱动吻合) 1
v_pPWMRegs->rTCFG1|=3;//分频设置;//1/16 2
v_pPWMRegs->rTCNTB0=625; //给两个缓冲器//赋值 3
v_pPWMRegs->rTCMPB0=312; // 4
v_pPWMRegs->rTCON|=(1<<1)|(1<<2);//manual update 5
v_pPWMRegs->rTCON &= ~(1<<1); // 6
v_pPWMRegs->rTCON |= (1<<4)|(1<<3)|1;//dead zone,start timer,auto reload 8
/*设置亮度结束*/
/*开机亮开始*/
/*v_pADCRegs->rADCCON=(1<<14)|(255<<6)|(2<<3)|(0<<2)|(1<<1);
v_pIOPRegs->rGPGDAT ^= (1<<12);
v_pPWMRegs->rTCMPB0=1; */
/*开机亮结束*/
/*前后屏文件发送**/
v_pIOPRegs->rGPJDAT = 0x01fff;
v_pIOPRegs->rGPJCON = 0x0555555;
v_pIOPRegs->rGPJUP = 0x1fff;
//发送文件部分
CString strBMP_PREFIX="\\SDMEM\\deskdemo\\";
CString strBMP=".txt";
CString strRand=RandomString(1,4);
strBMP=strBMP_PREFIX+strRand+strBMP;
CFile f(strBMP,CFile::modeRead|CFile::typeBinary);
DWORD dwLen=f.GetLength();
int length = 0;
int readsize = 0;
//char pBuf[256]={0};
BYTE *pBuf=new BYTE[256];
BYTE *p;
//显示指针复位脉冲////////////////////////////////
int i,j;
v_pIOPRegs->rGPJDAT |= 0x400;
for(i=0; i<256; i++)
{
v_pIOPRegs->rGPJDAT &= ~0x400;
}
v_pIOPRegs->rGPJDAT |= 0x400;
//////////////////////////////////////////////////
while(readsize<dwLen){
memset(pBuf,0,256);
int iBytesRead=f.Read((void *)pBuf,256);
readsize=readsize+iBytesRead;
//发数据////////////////////////////////////////////////
p = pBuf;
for(i=0; i<iBytesRead; i++)
{
while(!(v_pIOPRegs->rGPJDAT & 0x1000));
for(j=0; j<0x100; j++);
v_pIOPRegs->rGPJDAT = *p | 0x00100;
for(j=0; j<0x100; j++);
v_pIOPRegs->rGPJDAT &= ~0x00100;
p++;
}
//////////////////////////////////////////////////
}
f.Close();
delete[] pBuf;
//设置亮度部分
收到LDxyy
其中x是一个比例,yy是总体亮度
char *ratio=new char[1] ;
ratio[0]=buf[2];
int iratio=atoi(ratio);
delete ratio;
char *pstr =new char[len-3] ;
for(int j=0;j<len-3;j++)
pstr[j]=buf[j+3];
int temp=atoi(pstr);
delete pstr;
//624
if(iratio==1)
{
//1:1
v_pPWMRegs->rTCMPB0=312;
}else if(iratio==2)
{
//2:1
v_pPWMRegs->rTCMPB0=416;
}else if(iratio==3)
{
//1:2
v_pPWMRegs->rTCMPB0=208;
}
unsigned long light = temp;
unsigned long l = v_pPWMRegs->rTCFG0;
l &= 0x0000ffff;
l |= light << 16;
v_pPWMRegs->rTCFG0 = l; |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|