/************************************************************************* * Function Name: GLCD_SPI_ReceiveBlock * Parameters: pInt8U pData, Int32U Size * * Return: void * * Description: Read block of data from SPI * *************************************************************************/ void GLCD_SPI_ReceiveBlock (pInt8U pData, Int32U Size) { while (Size) { *pData++ = GLCD_SPI_TranserByte(0xFFFF0); --Size; } }
/************************************************************************* * Function Name: GLCD_SPI_SendBlock * Parameters: pInt8U pData, Int32U Size * * Return: void * * Description: Write block of data to SPI * *************************************************************************/ void GLCD_SPI_SendBlock (pInt8U pData, Int32U Size) { Int32U OutCount = Size; while (OutCount--) { GLCD_SPI_TranserByte(*pData++ | 0x100); } }
/************************************************************************* * Function Name: GLCD_SendCmd * Parameters: GLCD_SendCmd Cmd, pInt8U pData, Int32U Size * Return: GLCD_Status_t * * Description: Send command to the Graphic LCD * *************************************************************************/ GLCD_Status_t GLCD_SendCmd (GLCD_Cmd_t Cmd, pInt8U pData, Int32U Size) { static Boolean Write2_DRAM = FALSE; // write to DRAM mode static Int32U ResRatio; // Hold resistor ratio init by VOLCTR // and used by SETCON adapted command // Pointer to current set of commands pGLCD_CmdCtrl_t pGLCD_CmdCtrl = (pGLCD_CmdCtrl_t)(((Glcd_Iss==GLCD_ISS_0)? GLCD_Cmd_Iss0:GLCD_Cmd_Iss1) + Cmd); pDATCTR_Data_t pDATCTR_Data; Int8U ColourSch; pASCSET_Data_t pASCSET_Data; MADCTR_Data_t DataMode = {0}; Int32U Contrast; if(Write2_DRAM) { // Select LCD GLCD_SPI_ChipSelect(1); if(Cmd != RAMWR) { Write2_DRAM = FALSE; if(PixelHold & WAITED_PIXEL) { // Flush pixel GLCD_SPI_TranserByte(PixelHold); } // Release CS GLCD_SPI_ChipSelect(0); } else { // pixels collection Int32U Pixel; while(Size > 1) { Pixel = *pData++; Pixel |= (*pData++)<<8; PixelHold |= WAITED_PIXEL; if(!OddPixel) { // Get even pixel PixelHold |= PIXEL_CONV(Pixel,0); } else { // Apply odd pixel PixelHold |= PIXEL_CONV(Pixel,1); // and send together both pixels GLCD_SPI_SendBlock((pInt8U)&PixelHold,3); PixelHold = 0; } // update the even/odd flag OddPixel ^= 1; // update the counter of the remaining bytes Size -= 2; } // Release CS GLCD_SPI_ChipSelect(0); return(GLCD_OK); } } // sanitary check of command if(pGLCD_CmdCtrl->Cmd == GLCD_INV_CMD) { return(GLCD_UNSUPPORTED); } // Implement adapted commands if(Glcd_Iss==GLCD_ISS_0) { switch(Cmd) { case PTIN: // PTLAR + PTIN GLCD_SendCmd(PTLAR,pData,0); GLCD_SendCmd(PTLON,NULL,0); return(GLCD_OK); case DATCTR: pDATCTR_Data = (pDATCTR_Data_t)pData; // MADCTR + COLMOD // Data reconstruction DataMode.MY = pDATCTR_Data->MY; DataMode.MX = pDATCTR_Data->MX; DataMode.MV = pDATCTR_Data->MV; DataMode.ML = pDATCTR_Data->ML; DataMode.RGB = !pDATCTR_Data->RGB; GLCD_SendCmd(MADCTR,(pInt8U)&DataMode,0); // 4K colors Type A ColourSch = 3; return(GLCD_SendCmd(COLMOD,&ColourSch,0)); } } else { switch(Cmd) { case SCRLAR: pASCSET_Data = (pASCSET_Data_t)pData; pASCSET_Data->Smd = 0; // Center screen scroll mode GLCD_SendCmd(ASCSET,pData,0); return(GLCD_OK); case DATCTR: pDATCTR_Data = (pDATCTR_Data_t)pData; pDATCTR_Data->ML = 0; pDATCTR_Data->MX = !pDATCTR_Data->MX; // 4K colors Type A pDATCTR_Data->GS = 2; break; case SETCON: Contrast = *pData | (ResRatio << 8); return(GLCD_SendCmd(VOLCTR,(pInt8U)&Contrast,0)); case VOLCTR: ResRatio = *(pData+1); break; } } if(pGLCD_CmdCtrl->Param != (Int32U)-1) { // Command with fixed size of parameters Size = pGLCD_CmdCtrl->Param; } // Select LCD GLCD_SPI_ChipSelect(1); GLCD_SPI_TranserByte(pGLCD_CmdCtrl->Cmd); if(Cmd == RAMWR) { // enter in write to DRAM mode OddPixel = FALSE; PixelHold = 0; Write2_DRAM = TRUE; return(GLCD_SendCmd(RAMWR,pData,Size)); } // Send/Receive parameters if(pGLCD_CmdCtrl->Dir == GLCD_READ) { if(pGLCD_CmdCtrl->Pulse) { if(Size) { *pData++ = GLCD_SPI_TranserByte(0xFFFF); --Size; } } GLCD_SPI_SetWordWidth(8); } if(pGLCD_CmdCtrl->Dir == GLCD_READ) { GLCD_SPI_ReceiveBlock(pData,Size); } else { GLCD_SPI_SendBlock(pData,Size); } // Release CS GLCD_SPI_ChipSelect(0); if(pGLCD_CmdCtrl->Dir == GLCD_READ) { GLCD_SPI_SetWordWidth(9); } return(GLCD_OK); }