text: /*
   * This file is subject to the terms of the GFX License. If a copy of
   * the license was not distributed with this file, you can obtain one at:
   *
   *              http://ugfx.io/license.html
   */
  
  /**
   * @file    boards/addons/gdisp/board_ILI9320_olimex_pic32mx_lcd.h
   * @brief   GDISP Graphic Driver subsystem board SPI interface for the ILI9325 display.
   *
   * @note	This file contains a mix of hardware specific and operating system specific
   *			code. You will need to change it for your CPU and/or operating system.
   */
  
  #ifndef GDISP_LLD_BOARD_H
  #define GDISP_LLD_BOARD_H
  
  #ifndef noinline
  #define noinline __attribute__((noinline))
  #endif
  
  static void init_board(GDisplay *g) {
  
  	// As we are not using multiple displays we set g->board to NULL as we don't use it.
  	g->board = 0;
  
  	switch(g->controllerdisplay) {
  	case 0:											// Set up for Display 0
  		// RST
  		palSetPadMode(IOPORTA, 7, PAL_MODE_OUTPUT);
  		palClearPad(IOPORTA, 7);
  
  		// RS
  		palSetPadMode(IOPORTA, 10, PAL_MODE_OUTPUT);
  		palSetPad(IOPORTA, 10);
  
  		// CS
  		palSetPadMode(IOPORTA, 9, PAL_MODE_OUTPUT);
  		palClearPad(IOPORTA, 9);
  
  		// Backlight
  		palSetPadMode(IOPORTD, 3, PAL_MODE_OUTPUT);
  		palSetPad(IOPORTD, 3);
  
  		// PMP setup
  		PMMODE = 0;
  		PMAEN = 0;
  		PMCON = 0;
  		PMMODEbits.MODE = 2;
  		PMMODEbits.WAITB = 0;
  		PMMODEbits.WAITM = 1;
  		PMMODEbits.WAITE = 0;
  		PMCONbits.CSF = 0;
  		PMCONbits.PTRDEN = 1;
  		PMCONbits.PTWREN = 1;
  		PMMODEbits.MODE16 = 1;
  		PMCONbits.PMPEN = 1;
  
  		palClearPad(IOPORTA, 9);
  		break;
  	}
  }
  
  #define PmpWaitBusy()   do {} while (PMMODEbits.BUSY)
  
  static GFXINLINE void post_init_board(GDisplay *g) {
  	(void) g;
  }
  
  static noinline void setpin_reset(GDisplay *g, gBool state) {
  	(void) g;
  	if (state)
  		palClearPad(IOPORTA, 7);
  	else
  		palSetPad(IOPORTA, 7);
  }
  
  static void set_backlight(GDisplay *g, gU8 percent) {
  	(void) g;
  	if (percentage)
  		palClearPad(IOPORTD, 3);
  	else
  		palSetPad(IOPORTD, 3);
  }
  
  static GFXINLINE void acquire_bus(GDisplay *g) {
  	(void) g;
  }
  
  static GFXINLINE void release_bus(GDisplay *g) {
  	(void) g;
  }
  
  static noinline void write_index(GDisplay *g, gU16 index) {
  	volatile gU16 dummy;
  	(void) g;
  
  	PmpWaitBusy();
  	palClearPad(IOPORTA, 10);
  	PMDIN = index;
  	PmpWaitBusy();
  	palSetPad(IOPORTA, 10);
  
  	dummy = PMDIN;
  	(void)dummy;
  }
  
  static noinline void write_data(GDisplay *g, gU16 data) {
  	(void) g;
  	PMDIN = data;
  	PmpWaitBusy();
  }
  
  static GFXINLINE void setreadmode(GDisplay *g) {
  	(void) g;
  }
  
  static GFXINLINE void setwritemode(GDisplay *g) {
  	(void) g;
  }
  
  static noinline gU16 read_data(GDisplay *g) {
  	(void) g;
  	PmpWaitBusy();
  	return PMDIN;
  }
  
  #endif /* GDISP_LLD_BOARD_H */
  