Esempio n. 1
0
/*************************************************************************
 * 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;
  }
}
Esempio n. 2
0
/*************************************************************************
 * 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);
  }
}
Esempio n. 3
0
/*************************************************************************
 * 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);
}