一块板多个屏的怎么显示
我有一个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_BASE0x56000000
typedef struct{
unsigned intrGPACON;// 00
unsigned intrGPADAT;
unsigned intrPAD1;
unsigned intrGPBCON;// 10
unsigned intrGPBDAT;
unsigned intrGPBUP;
unsigned intrPAD2;
unsigned intrGPCCON;// 20
unsigned intrGPCDAT;
unsigned intrGPCUP;
unsigned intrPAD3;
unsigned intrGPDCON;// 30
unsigned intrGPDDAT;
unsigned intrGPDUP;
unsigned intrPAD4;
unsigned intrGPECON;// 40
unsigned intrGPEDAT;
unsigned intrGPEUP;
unsigned intrPAD5;
unsigned intrGPFCON; // 50
unsigned intrGPFDAT;
unsigned intrGPFUP;
unsigned intrPAD6;
unsigned intrGPGCON;// 60
unsigned intrGPGDAT;
unsigned intrGPGUP;
unsigned intrPAD7;
unsigned intrGPHCON;// 70
unsigned intrGPHDAT;
unsigned intrGPHUP;
unsigned intrPAD8;
unsigned intrMISCCR;// 80
unsigned intrDCKCON;
unsigned intrEXTINT0;
unsigned intrEXTINT1;
unsigned intrEXTINT2;// 90
unsigned intrEINTFLT0;
unsigned intrEINTFLT1;
unsigned intrEINTFLT2;
unsigned intrEINTFLT3;// A0
unsigned intrEINTMASK;
unsigned intrEINTPEND;
unsigned intrGSTATUS0;// AC
unsigned intrGSTATUS1;// B0
unsigned intrGSTATUS2;// B4
unsigned intrGSTATUS3;// B8
unsigned intrGSTATUS4; // BC
/////////////////add by srd//////////////////////
unsigned int rPAD9;//C0
unsigned int rPAD10;
unsigned int rPAD11;
unsigned int rPAD12;
unsigned intrGPJCON;// D0
unsigned intrGPJDAT;
unsigned intrGPJUP;
unsigned intrPAD13;
}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 intrTCFG0;//00
unsigned intrTCFG1;//04
unsigned intrTCON;//08
unsigned intrTCNTB0;//0C
unsigned intrTCMPB0;//10
unsigned intrTCNTO0;//14
unsigned intrTCNTB1;
unsigned intrTCMPB1;
unsigned intrTCNTO1;
//unsigned intrTCNTB2;
/// unsigned intrTCMPB2;
// unsigned intrTCNTO2;
//unsigned intrTCNTB3;
// unsigned intrTCMPB3;
// unsigned intrTCNTO3;
//unsigned intrTCNTB4;
//unsigned intrTCNTO4;
}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();
intlength = 0;
intreadsize = 0;
//char pBuf={0};
BYTE *pBuf=new BYTE;
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 ;
ratio=buf;
int iratio=atoi(ratio);
delete ratio;
char *pstr =new char ;
for(int j=0;j<len-3;j++)
pstr=buf;
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; markb
页:
[1]