搜索
bottom↓
回复: 1

一块板多个屏的怎么显示

[复制链接]

出0入0汤圆

发表于 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_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, 杜汶泽)

出0入0汤圆

发表于 2010-11-15 12:52:15 | 显示全部楼层
markb
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表