?? lmi.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 + -