📄 xslcdcontroller.c
字号:
*
* DESCRIPTION: This function is the hardware setup for this driver.
*
* INPUT PARAMETERS: None.
*
* RETURNS: ErrorT - Status.
*
* GLOBAL EFFECTS: None.
*
* ASSUMPTIONS: None.
*
* CALLS: setupDma(), allocateFrame(), calculateBpp()
*
* CALLED BY: Anyone.
*
* PROTOTYPE: ErrorT XsLcdHWSetup(void);
*
*******************************************************************************
*/
ErrorT XsLcdHWSetup(void)
{
int lines = 0;
ErrorT retVal;
/*
printf("SCR = %08X\r\n", GetSCR());
printf("LCD ID = %08X\r\n", GetLcdPanelID());
printf("LCD Orientation = %08X\r\n", GetLcdPanelOrientation());
*/
switch (GetLcdPanelID()) {
case LCDID_SHARP_QVGA:
lcdPanelP = &Sharp_LQ057Q3DC02;
XsLcdFontScale = 1;
XsLcdOrient = GetLcdPanelOrientation() ? TBRL : LRTB;
break;
case LCDID_TOSHIBA_VGA_16:
lcdPanelP = &Toshiba_LTM04C380K;
XsLcdFontScale = 1;//2; hzh
XsLcdOrient = GetLcdPanelOrientation() ? LRTB : BTLR;
break;
//===hzh
case LCDID_CRT_VGA_16:
lcdPanelP = &CRT_640X480;
XsLcdFontScale = 1;
// XsLcdOrient = GetLcdPanelOrientation() ? LRTB : BTLR;
//cgf
XsLcdOrient=LRTB;//TBRL;//
break;
default:
return ERRORCODEX(ERR_L_LCD, 5, 0, ERR_T_BADLCDDETECT);
break;
}
PostDisplayProgress(ERR_L_LCD, 5, 0);
//Enable the LCD clock and the PWM clock
xsCMEnableClock(CK_PWM0); //使能背光控制时钟
PostDisplayProgress(ERR_L_LCD, 5, 1);
xsCMEnableClock(CK_LCD); //使能LCD 的CLK,象素piex clk
PostDisplayProgress(ERR_L_LCD, 5, 2);
//Allocate the frame buffer
retVal = allocateFrame();
if (retVal != ERR_NONE) return retVal;
PostDisplayProgress(ERR_L_LCD, 5, 3);
XsLcdClear();
PostDisplayProgress(ERR_L_LCD, 5, 5);
//Setup the DMA
retVal = setupDma();
if (retVal != ERR_NONE) return retVal;
PostDisplayProgress(ERR_L_LCD, 5, 4);
// Setup Control Register 0
LCDCTRL_REG_BASE->LCCR0 = LCD_LCCR0_RDSTM | LCD_LCCR0_CMDIM |
LCD_LCCR0_LDM_NOINT | LCD_LCCR0_SFM_SOFNOINT |
LCD_LCCR0_IUM_FIFONOINT | LCD_LCCR0_EFM_EOFNOINT | LCD_LCCR0_PAS_ACTDISP |
LCD_LCCR0_QDM_NOINT | LCD_LCCR0_BM_BSNOINT | LCD_LCCR0_OUM_FIFONOINT;
PostDisplayProgress(ERR_L_LCD, 5, 6);
// Setup control register 1
LCDCTRL_REG_BASE->LCCR1 = (lcdPanelP->panelWidth-1) << LCD_LCCR1_PPL_SHIFT |
lcdPanelP->horizSyncPW << LCD_LCCR1_HSW_SHIFT |
lcdPanelP->horizELW << LCD_LCCR1_ELW_SHIFT |
lcdPanelP->horizBLW << LCD_LCCR1_BLW_SHIFT;
// If dual panel we split the lines for vertical lines per panel as
// both run in parallel.
if (lcdPanelP->dualPanel)
{
lines = lcdPanelP->panelHeight/2 + lcdPanelP->extraLines;
}
else
{
lines = lcdPanelP->panelHeight + lcdPanelP->extraLines;
}
PostDisplayProgress(ERR_L_LCD, 5, 7);
// Setup control register 2
LCDCTRL_REG_BASE->LCCR2 = (lines-1) << LCD_LCCR2_LPP_SHIFT |
lcdPanelP->vertSyncPW << LCD_LCCR2_VSW_SHIFT |
lcdPanelP->vertEFW << LCD_LCCR2_EFW_SHIFT |
lcdPanelP->vertBFW << LCD_LCCR2_BFW_SHIFT;
PostDisplayProgress(ERR_L_LCD, 5, 8);
// Setup control register 3
LCDCTRL_REG_BASE->LCCR3 = lcdPanelP->pixelClkDiv << LCD_LCCR3_PCD_SHIFT |
lcdPanelP->acBiasCount << LCD_LCCR3_ACB_SHIFT |
(lcdPanelP->clockPol ? LCD_LCCR3_PCP_DATSAMPFALL : 0) |
calculateBpp(lcdPanelP->colorDepth) << LCD_LCCR3_BPP_SHIFT |
(lcdPanelP->horizSyncPol ? LCD_LCCR3_HSP_ACTLOW : 0) |
(lcdPanelP->frameSyncPol ? LCD_LCCR3_VSP_ACTLOW : 0)
// | LCD_LCCR3_DPC_DBLFRQ
;
PostDisplayProgress(ERR_L_LCD, 5, 9);
// Point to the descriptor
LCDCTRL_REG_BASE->FDADR0 = frameP->header.DmaDescriptor.FDADR;
PostDisplayProgress(ERR_L_LCD, 5, 0xa);
if (fifo==NULL) fifo = FIFOalloc(2048, first, last);
if (fifo==NULL) return ERRORCODEX(ERR_L_LCD, 5, 0xa, ERR_L_HEAP);
PostDisplayProgress(ERR_L_LCD, 5, 0xb);
if (ROS_Tasks) {
XsLcdTask = ROS_New(ROS_STACK, ROS_HIGHESTPRIO, XsLcdOut);
if (!XsLcdTask) return ERRORCODEX(ERR_L_LCD, 5, 0xb, ERR_L_ROS);
ROS_Sleep(XsLcdTask);
}
return ERR_NONE;
} // end XsLcdHWSetup
/*
*******************************************************************************
*
* FUNCTION: XsLcdSWInit
*
* DESCRIPTION: This function is the software init for this driver.
*
* INPUT PARAMETERS: None.
*
* RETURNS: None.
*
* GLOBAL EFFECTS: None.
*
* ASSUMPTIONS: None.
*
* CALLS: None.
*
* CALLED BY: Anyone.
*
* PROTOTYPE: void XsLcdSWInit(void);
*
*******************************************************************************
*/
void XsLcdSWInit(void)
{
PostDisplayProgress(ERR_L_LCD, 6, 0);
if (fifo==NULL) fifo = FIFOalloc(2048, first, last);
PostDisplayProgress(ERR_L_LCD, 6, 1);
}
/*
*******************************************************************************
*
* FUNCTION: XsLcdBackLightOn
*
* DESCRIPTION: This function turns the LCD backlight on.
*
* INPUT PARAMETERS: None.
*
* RETURNS: None.
*
* GLOBAL EFFECTS: None.
*
* ASSUMPTIONS: None.
*
* CALLS: None.
*
* CALLED BY: Anyone.
*
* PROTOTYPE: void XsLcdBackLightOn(void);
*
*******************************************************************************
*/
void XsLcdBackLightOn(void)
{
PostDisplayProgress(ERR_L_LCD, 7, 0);
XsPwmWriteCtrl(0,0);
PostDisplayProgress(ERR_L_LCD, 7, 1);
//Set the duty cycle to 100%
XsPwmWriteDuty(0,0x3FF);
PostDisplayProgress(ERR_L_LCD, 7, 2);
//Set the period value to its max. (0x3FF)
XsPwmWritePerval(0,0x3FF);
PostDisplayProgress(ERR_L_LCD, 7, 3);
}
/*
*******************************************************************************
*
* FUNCTION: XsLcdClear
*
* DESCRIPTION: This function clears the LCD to the color in XsLcdBg.
*
* INPUT PARAMETERS: None.
*
* RETURNS: None.
*
* GLOBAL EFFECTS: None.
*
* ASSUMPTIONS: None.
*
* CALLS: None.
*
* CALLED BY: Anyone.
*
* PROTOTYPE: void XsLcdClear(void);
*
*******************************************************************************
*/
void XsLcdClear(void)
{
PUINT32 p = (PUINT32)frameP->buffer;
PUINT32 e = (PUINT32)((PUINT8)frameP->buffer+frameP->header.size);
UINT32 z;
y = x = 0; // Reset character output "cursor".
// PostDisplayProgress(ERR_L_LCD, 8, 0);
z = XsLcdBg;
// z |= z<<16;
while (p<e) *(p++) = z;
// PostDisplayProgress(ERR_L_LCD, 8, 1);
}
/*
*******************************************************************************
*
* FUNCTION: XsLcdRGB565
*
* DESCRIPTION: This function translates a 24 bit color to a 16 bit color.
*
* INPUT PARAMETERS: UINT8 red - The "red" part of the 24 bit color.
* UINT8 green - The "green" part of the 24 bit color.
* UINT8 blue - The "blue" part of the 24 bit color.
*
* RETURNS: None.
*
* GLOBAL EFFECTS: None.
*
* ASSUMPTIONS: None.
*
* CALLS: None.
*
* CALLED BY: Anyone.
*
* PROTOTYPE: UINT16 XsLcdRGB565(UINT8 red, UINT8 green, UINT8 blue);
*
*******************************************************************************
*/
UINT16 XsLcdRGB565(UINT8 red, UINT8 green, UINT8 blue)
{
return ((UINT16)((UINT16)red>>3)<<11 | ((UINT16)green>>2)<<5 | (UINT16)blue>>3);
}
/*
*******************************************************************************
*
* FUNCTION: XsLcdChar
*
* DESCRIPTION: This function puts a text character to the LCD FIFO.
*
* INPUT PARAMETERS: CHAR c - The character to put.
*
* RETURNS: None.
*
* GLOBAL EFFECTS: None.
*
* ASSUMPTIONS: None.
*
* CALLS: None.
*
* CALLED BY: Anyone.
*
* PROTOTYPE: void XsLcdChar(CHAR c);
*
*******************************************************************************
*/
void XsLcdChar(CHAR c)
{
// PostDisplayProgress(ERR_L_LCD, 0xe, 0);
if (fifo != NULL) FIFOput(fifo, c);
// if (FIFOcharsAvailable(fifo)) XsLcdOut();
// PostDisplayProgress(ERR_L_LCD, 0xe, 1);
}
/*
*******************************************************************************
*
* FUNCTION: XsLcdStr
*
* DESCRIPTION: This function writes a text string to the LCD.
*
* INPUT PARAMETERS: PCHAR s - The string to write.
*
* RETURNS: None.
*
* GLOBAL EFFECTS: None.
*
* ASSUMPTIONS: None.
*
* CALLS: None.
*
* CALLED BY: Anyone.
*
* PROTOTYPE: void XsLcdStr(PCHAR s);
*
*******************************************************************************
*/
void XsLcdStr(PCHAR s)
{
while (*s) XsLcdChar(*s++);
}
/*
*******************************************************************************
*
* FUNCTION: XsLcdOut
*
* DESCRIPTION: This function writes a text character to the LCD
* from the FIFO.
*
* INPUT PARAMETERS: None.
*
* RETURNS: None.
*
* GLOBAL EFFECTS: None.
*
* ASSUMPTIONS: None.
*
* CALLS: None.
*
* CALLED BY: Anyone.
*
* PROTOTYPE: void XsLcdOut(void);
*
*******************************************************************************
*/
void XsLcdOut(void)
{
static INT16 maxx, maxy;
UINT8 px, py, s1, s2;
INT16 c;
while (1) {
// PostDisplayProgress(ERR_L_LCD, 0xa, 0);
if (x==0 && y==0) {
maxx = (XsLcdOrient!=LRTB?frameP->header.vertPixel:frameP->header.horizPixel)/(FONT_HORZ_PIX*XsLcdFontScale);
maxy = (XsLcdOrient!=LRTB?frameP->header.horizPixel:frameP->header.vertPixel)/(FONT_VERT_PIX*XsLcdFontScale);
}
c = FIFOget(fifo);
if (c == '\r') x = 0;
else if (c == '\n') y++;
else if (c == '\f') XsLcdClear();
else if (c == '\a') {
if (!XsLcdTask) DM_WaitS(5);
else ROS_Timer(XsLcdTask, 500, 2);
} else if (c == '\b') { if (x) x--; }
else if (c != EOF) {
if (x >= maxx) {
x = 0;
y++;
}
while (y >= maxy) {
y--;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -