⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lmi.c

📁 ARM9基于WINDOWSCE的BSP源代码
💻 C
字号:

#include "LMIdrv.h"
#include "LMISettings.h"
#include "bitctrl.h"
#include "LMIfuncs.h"

#define LMI_SCREEN_WIDTH  240
#define LMI_SCREEN_HEIGHT 320

void LMIInit(LMIReg* pLmi)
{
	
	//LMI bus is as width as DataWidth and data is 16 width.	
	//default 240cpu,hclk 121M
	  pLmi->CFG=0x200;
//	pLmi->TIM0=0x04000400;
	//pLmi->TIM0=0x02000200;
	//for Hclk 121M
    pLmi->TIM0=0x05010501;
//	pLmi->TIM1=0x05000101;
    //pLmi->TIM1=0x05000200;
    pLmi->TIM1=0x0f000200;
//	pLmi->TIM2=0x0B04;
	pLmi->TIM2=0x0f05;
	//wait for a little while
	pLmi->CFG=0x201;
	//configuration for burst mode
}


void LmiBInit(LMIReg* pLmi,unsigned uiBNum, int iWMark, int iTxEN, int iRxEN )
{
	unsigned int val;
	
	pLmi->BCFG     = 0x0;
	pLmi->BBASE    = 0x0;
	pLmi->BNUM     = uiBNum - 1; //76800 -1; //320*240
	apBIT_SET(val,LMI_DMACTRL_TxEN, 0);
	apBIT_SET(val,LMI_DMACTRL_RxEN, 0);
	apBIT_SET(val,LMI_DMACTRL_SIZE, 15);
	apBIT_SET(val,LMI_DMACTRL_TXFWMARK, 0);  //16
	apBIT_SET(val,LMI_DMACTRL_RXFWMARK, 15); //16
	pLmi->DMACNTL  = val;
	pLmi->FCNTL    = 0x3;
	apBIT_SET(val,LMI_DMACTRL_TxEN, iTxEN);
	apBIT_SET(val,LMI_DMACTRL_RxEN, iRxEN);
	apBIT_SET(val,LMI_DMACTRL_SIZE, 15);
	apBIT_SET(val,LMI_DMACTRL_TXFWMARK, 16-iWMark);  //0 -16
	apBIT_SET(val,LMI_DMACTRL_RXFWMARK, iWMark-1); //15 - 16
	pLmi->DMACNTL  = val;
	pLmi->BCTRL    = 0x3; //Enable burst mode
}

unsigned int LMIExist(LMIReg * pLmi)
{
	return (pLmi->ID==0x02280201)? 1:0;	
}

void LMIDisableInt(LMIReg *pLmi)
{
   pLmi->INTRMASK=0;
}

void LMIEnableTxInt(LMIReg *pLmi)
{
  unsigned int val;
  val=pLmi->INTRMASK;
  apBIT_SET(val,LMI_RIS_TXFFLAG,1);
  //apBIT_SET(val,LMI_RIS_TXFERR ,1);
  pLmi->INTRMASK=val;  
}

void LMIDisableTxInt(LMIReg *pLmi)
{
  unsigned int val;
  val=pLmi->INTRMASK;
  apBIT_SET(val,LMI_RIS_TXFFLAG,0);
  pLmi->INTRMASK=val;  
}

void LMIClearTxInt(LMIReg *pLmi)
{
  unsigned int val;
  val=0;
  apBIT_SET(val,LMI_RIS_TXFFLAG,1);
  //apBIT_SET(val,LMI_RIS_TXFERR,1);
  pLmi->INTRCLR=val;  
}

DWORD LMIGetIntType(LMIReg *pLmi)
{
  unsigned long val;
  val=pLmi->RIS;
  return val;
}

void LcdInit(LCDReg* pLcd)
{
	unsigned int i;
	volatile unsigned int d1;

	//turn off LCD
	pLcd->ADD   = 0x21;
	pLcd->DAT   = 0x30;
	pLcd->DAT   = 0x30;

	//setup 4. read operation
	for ( i=0; i<100000; i++);
	d1 = pLcd->DAT;
	d1 = pLcd->DAT;
	//wait for a while (100us)
	for ( i=0; i<200000; i++);
        
	//turn on LCD
	pLcd->ADD   = 0x21;
	pLcd->DAT   = 0x31;
	pLcd->DAT   = 0x31;	
}

void LcdResetPtr(LCDReg* pLcd)
{
   unsigned int i;
   //pointer to start of clcd
   pLcd->ADD   = 0x28;//picture would be turn down if write 0x28 one time.???
   pLcd->ADD   = 0x28;
   pLcd->DAT   = 0x06;
   pLcd->DAT   = 0x06;
   
   //prepare to receive data
   pLcd->ADD   = 0x27; 
   pLcd->ADD   = 0x27;
   for ( i=0; i<100; i++);
   //after this the data can be transfered.
}

void LcdDisplayFullRed(LCDReg * pLcd)
{
	int j;
	for(j=0;j<(LMI_SCREEN_WIDTH*LMI_SCREEN_HEIGHT);j++)
	{	
		pLcd->DAT = (j/960)<<12 & 0xF000; //Red		
		pLcd->DAT = (j/960)>>4 & 0x3; //Red
	}
}

BOOL LMISendBytes(LMIReg *pLmi, ULONG *Buf, ULONG *BufLen)
{    
    ULONG nDWORDToSent = 0,ret;
    ULONG i=0,j;
    
    if ((pLmi == NULL) || (BufLen == NULL))
        return FALSE;
    // When there is no more to send, just disable the TX interrupts and return to the MDD.
    //
    if ((*BufLen == 0) || (Buf == NULL))
        goto exit_point;

    // Save [in] parameter (number of bytes to send) and initialise [out] parameter (number of
    //  bytes actually sent)
    //
    nDWORDToSent = *BufLen;
    *BufLen = 0;
     for(i=0; i<nDWORDToSent;i+=8)
     {
	do
	{
		ret = pLmi->FSTATUS;			
		for(j=0;j<50;j++);
	 }
	 while((ret & 0x2) == 0 );
	 
	  ret = pLmi->BNUM;
	   //printf("\n\r NO: %ld remain = %ld ",i,ret);
	   //Fifo empty
	for(j=0;j<8;j++)
	{
	     pLmi->DATA = Buf[i+j];
	     pLmi->DATA = Buf[i+j] >> 16;
	}
	        
    }    
    *BufLen = nDWORDToSent;
exit_point:

    return TRUE;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -