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

📄 xslcdcontroller.c

📁 优龙pxa270平台试验程序
💻 C
📖 第 1 页 / 共 3 页
字号:
*
* 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 + -