VNebula 发表于 2010-11-15 10:53:00

一块板多个屏的怎么显示

我有一个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;

tigerchen 发表于 2010-11-15 12:52:15

markb
页: [1]
查看完整版本: 一块板多个屏的怎么显示