Convert Nokia6610GE12 driver to new format.

ugfx_release_2.6
inmarket 2013-10-19 15:38:00 +10:00
parent 87a6af81f4
commit e9895b5d14
5 changed files with 349 additions and 359 deletions

View File

@ -1,233 +1,225 @@
/* /*
* This file is subject to the terms of the GFX License. If a copy of * 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: * the license was not distributed with this file, you can obtain one at:
* *
* http://ugfx.org/license.html * http://ugfx.org/license.html
*/ */
/** /**
* @file drivers/gdisp/Nokia6610GE8/gdisp_lld_board_olimexsam7ex256.h * @file drivers/gdisp/Nokia6610GE8/board_Nokia6610GE12_olimexsam7ex256.h
* @brief GDISP Graphic Driver subsystem board interface for the Olimex SAM7-EX256 board. * @brief GDISP Graphic Driver subsystem board interface for the Olimex SAM7-EX256 board.
* */
* @addtogroup GDISP
* @{ #ifndef _GDISP_LLD_BOARD_H
*/ #define _GDISP_LLD_BOARD_H
#ifndef _GDISP_LLD_BOARD_H /*
#define _GDISP_LLD_BOARD_H * Set various display properties. These properties mostly depend on the exact controller chip you get.
* The defaults should work for most controllers.
/* */
* Set various display properties. These properties mostly depend on the exact controller chip you get. //#define GDISP_SCREEN_HEIGHT 130 // The visible display height
* The defaults should work for most controllers. //#define GDISP_SCREEN_WIDTH 130 // The visible display width
*/ //#define GDISP_RAM_X_OFFSET 0 // The x offset of the visible area
//#define GDISP_SCREEN_HEIGHT 130 // The visible display height //#define GDISP_RAM_Y_OFFSET 2 // The y offset of the visible area
//#define GDISP_SCREEN_WIDTH 130 // The visible display width //#define GDISP_SLEEP_POS 50 // The position of the sleep mode partial display
//#define GDISP_RAM_X_OFFSET 0 // The x offset of the visible area //#define GDISP_INITIAL_CONTRAST 50 // The initial contrast percentage
//#define GDISP_RAM_Y_OFFSET 2 // The y offset of the visible area //#define GDISP_INITIAL_BACKLIGHT 100 // The initial backlight percentage
//#define GDISP_SLEEP_POS 50 // The position of the sleep mode partial display
//#define GDISP_INITIAL_CONTRAST 50 // The initial contrast percentage // For a multiple display configuration we would put all this in a structure and then
//#define GDISP_INITIAL_BACKLIGHT 100 // The initial backlight percentage // set g->priv to that structure.
// ****************************************************** // ******************************************************
// Pointers to AT91SAM7X256 peripheral data structures // Pointers to AT91SAM7X256 peripheral data structures
// ****************************************************** // ******************************************************
static volatile AT91PS_PIO pPIOA = AT91C_BASE_PIOA; static volatile AT91PS_PIO pPIOA = AT91C_BASE_PIOA;
static volatile AT91PS_PIO pPIOB = AT91C_BASE_PIOB; static volatile AT91PS_PIO pPIOB = AT91C_BASE_PIOB;
static volatile AT91PS_SPI pSPI = AT91C_BASE_SPI0; static volatile AT91PS_SPI pSPI = AT91C_BASE_SPI0;
static volatile AT91PS_PMC pPMC = AT91C_BASE_PMC; static volatile AT91PS_PMC pPMC = AT91C_BASE_PMC;
static volatile AT91PS_PDC pPDC = AT91C_BASE_PDC_SPI0; static volatile AT91PS_PDC pPDC = AT91C_BASE_PDC_SPI0;
/* The PWM backlight control is non-linear on this board. /* The PWM backlight control is non-linear on this board.
* We pick values here that make it look a bit more linear. * We pick values here that make it look a bit more linear.
*/ */
#define PWM_TOP_VALUE 500 #define PWM_TOP_VALUE 500
#define PWM_BOTTOM_VALUE 200 #define PWM_BOTTOM_VALUE 200
#define PWM_VALUE(x) (PWM_BOTTOM_VALUE+(PWM_TOP_VALUE-PWM_BOTTOM_VALUE)*(x)/100) #define PWM_VALUE(x) (PWM_BOTTOM_VALUE+(PWM_TOP_VALUE-PWM_BOTTOM_VALUE)*(x)/100)
/* PWM configuration structure. The LCD Backlight is on PWM1/PB20 ie PWM2/PIN1 in ChibiOS speak */ /* PWM configuration structure. The LCD Backlight is on PWM1/PB20 ie PWM2/PIN1 in ChibiOS speak */
static const PWMConfig pwmcfg = { static const PWMConfig pwmcfg = {
1000000, /* 1 MHz PWM clock frequency. Ignored as we are using PWM_MCK_DIV_n */ 1000000, /* 1 MHz PWM clock frequency. Ignored as we are using PWM_MCK_DIV_n */
1000, /* PWM period is 1000 cycles. */ 1000, /* PWM period is 1000 cycles. */
NULL, NULL,
{ {
{PWM_MCK_DIV_1 | PWM_OUTPUT_ACTIVE_HIGH | PWM_OUTPUT_PIN1 | PWM_DISABLEPULLUP_PIN1, NULL}, {PWM_MCK_DIV_1 | PWM_OUTPUT_ACTIVE_HIGH | PWM_OUTPUT_PIN1 | PWM_DISABLEPULLUP_PIN1, NULL},
}, },
}; };
static bool_t pwmRunning = FALSE; static bool_t pwmRunning = FALSE;
/** static inline void init_board(GDisplay *g) {
* @brief Initialise the board for the display.
* @notes Performs the following functions: // As we are not using multiple displays we set g->priv to NULL as we don't use it.
* 1. initialise the spi port used by your display g->priv = 0;
* 2. initialise the reset pin (initial state not-in-reset)
* 3. initialise the chip select pin (initial state not-active) switch(g->controllerdisplay) {
* 4. initialise the backlight pin (initial state back-light off) case 0: // Set up for Display 0
* // *********************************************************************************************
* @notapi // InitSpi( )
*/ //
static inline void init_board(void) { // Sets up SPI channel 0 for communications to Nokia 6610 LCD Display
// ********************************************************************************************* //
// InitSpi( ) // I/O ports used: PA2 = LCD Reset (set to low to reset)
// // PA12 = LCD chip select (set to low to select the LCD chip)
// Sets up SPI channel 0 for communications to Nokia 6610 LCD Display // PA16 = SPI0_MISO Master In - Slave Out (not used in LCD interface)
// // PA17 = SPI0_MOSI Master Out - Slave In pin (Serial Data to LCD slave)
// I/O ports used: PA2 = LCD Reset (set to low to reset) // PA18 = SPI0_SPCK Serial Clock (to LCD slave)
// PA12 = LCD chip select (set to low to select the LCD chip) // PB20 = backlight control (normally PWM control, 1 = full on)
// PA16 = SPI0_MISO Master In - Slave Out (not used in LCD interface) //
// PA17 = SPI0_MOSI Master Out - Slave In pin (Serial Data to LCD slave) // *********************************************************************************************}
// PA18 = SPI0_SPCK Serial Clock (to LCD slave)
// PB20 = backlight control (normally PWM control, 1 = full on) /* This code should really use the ChibiOS driver for these functions */
//
// *********************************************************************************************} // Pin for backlight
pPIOB->PIO_CODR = PIOB_LCD_BL_MASK; // Set PB20 to LOW
/* This code should really use the ChibiOS driver for these functions */ pPIOB->PIO_OER = PIOB_LCD_BL_MASK; // Configure PB20 as output
// Pin for backlight // Reset pin
pPIOB->PIO_CODR = PIOB_LCD_BL_MASK; // Set PB20 to LOW pPIOA->PIO_SODR = PIOA_LCD_RESET_MASK; // Set PA2 to HIGH
pPIOB->PIO_OER = PIOB_LCD_BL_MASK; // Configure PB20 as output pPIOA->PIO_OER = PIOA_LCD_RESET_MASK; // Configure PA2 as output
// Reset pin // CS pin - this seems to be ignored
pPIOA->PIO_SODR = PIOA_LCD_RESET_MASK; // Set PA2 to HIGH // pPIOA->PIO_SODR = 1<<12; // Set PA2 to HIGH
pPIOA->PIO_OER = PIOA_LCD_RESET_MASK; // Configure PA2 as output // pPIOA->PIO_OER = 1<<12; // Configure PA2 as output
// CS pin - this seems to be ignored // Init SPI0
// pPIOA->PIO_SODR = 1<<12; // Set PA2 to HIGH // Disable the following pins from PIO control (will be used instead by the SPI0 peripheral)
// pPIOA->PIO_OER = 1<<12; // Configure PA2 as output // BIT12 = PA12 -> SPI0_NPCS0 chip select
// BIT16 = PA16 -> SPI0_MISO Master In - Slave Out (not used in LCD interface)
// Init SPI0 // BIT17 = PA17 -> SPI0_MOSI Master Out - Slave In pin (Serial Data to LCD slave)
// Disable the following pins from PIO control (will be used instead by the SPI0 peripheral) // BIT18 = PA18 -> SPI0_SPCK Serial Clock (to LCD slave)
// BIT12 = PA12 -> SPI0_NPCS0 chip select pPIOA->PIO_PDR = (1<<12) | (1<<16) | (1<<17) | (1<<18);
// BIT16 = PA16 -> SPI0_MISO Master In - Slave Out (not used in LCD interface) pPIOA->PIO_ASR = (1<<12) | (1<<16) | (1<<17) | (1<<18);
// BIT17 = PA17 -> SPI0_MOSI Master Out - Slave In pin (Serial Data to LCD slave) pPIOA->PIO_BSR = 0;
// BIT18 = PA18 -> SPI0_SPCK Serial Clock (to LCD slave)
pPIOA->PIO_PDR = (1<<12) | (1<<16) | (1<<17) | (1<<18); //enable the clock of SPI
pPIOA->PIO_ASR = (1<<12) | (1<<16) | (1<<17) | (1<<18); pPMC->PMC_PCER = 1 << AT91C_ID_SPI0;
pPIOA->PIO_BSR = 0;
// Fixed mode
//enable the clock of SPI pSPI->SPI_CR = 0x81; //SPI Enable, Software reset
pPMC->PMC_PCER = 1 << AT91C_ID_SPI0; pSPI->SPI_CR = 0x01; //SPI Enable
pSPI->SPI_MR = 0xE0011; //Master mode, fixed select, disable decoder, PCS=1110
// Fixed mode pSPI->SPI_CSR[0] = 0x01010311; //9bit, CPOL=1, ClockPhase=0, SCLK = 48Mhz/3 = 16MHz
pSPI->SPI_CR = 0x81; //SPI Enable, Software reset
pSPI->SPI_CR = 0x01; //SPI Enable /* Display backlight control at 100% */
pSPI->SPI_MR = 0xE0011; //Master mode, fixed select, disable decoder, PCS=1110 pwmRunning = FALSE;
pSPI->SPI_CSR[0] = 0x01010311; //9bit, CPOL=1, ClockPhase=0, SCLK = 48Mhz/3 = 16MHz palSetPad(IOPORT2, PIOB_LCD_BL);
break;
/* Display backlight control at 100% */ }
pwmRunning = FALSE; }
palSetPad(IOPORT2, PIOB_LCD_BL);
} /**
* @brief Set or clear the lcd reset pin.
/** *
* @brief Set or clear the lcd reset pin. * @param[in] state TRUE = lcd in reset, FALSE = normal operation
* *
* @param[in] state TRUE = lcd in reset, FALSE = normal operation * @notapi
* */
* @notapi static inline void setpin_reset(GDisplay *g, bool_t state) {
*/ (void) g;
static inline void setpin_reset(bool_t state) { if (state)
if (state) palClearPad(IOPORT1, PIOA_LCD_RESET);
palClearPad(IOPORT1, PIOA_LCD_RESET); else
else palSetPad(IOPORT1, PIOA_LCD_RESET);
palSetPad(IOPORT1, PIOA_LCD_RESET); }
}
/**
/** * @brief Set the lcd back-light level.
* @brief Set the lcd back-light level. * @note For now 0% turns the backlight off, anything else the backlight is on.
* @note For now 0% turns the backlight off, anything else the backlight is on. * While the hardware supports PWM backlight control, we are not using it
* While the hardware supports PWM backlight control, we are not using it * yet.
* yet. *
* * @param[in] percent 0 to 100%
* @param[in] percent 0 to 100% *
* * @notapi
* @notapi */
*/ static inline void set_backlight(GDisplay *g, uint8_t percent) {
static inline void set_backlight(uint8_t percent) { (void) g;
if (percent == 100) {
/* Turn the pin on - No PWM */ if (percent == 100) {
if (pwmRunning) { /* Turn the pin on - No PWM */
pwmStop(&PWMD2); if (pwmRunning) {
pwmRunning = FALSE; pwmStop(&PWMD2);
} pwmRunning = FALSE;
palSetPad(IOPORT2, PIOB_LCD_BL); }
} else if (percent == 0) { palSetPad(IOPORT2, PIOB_LCD_BL);
/* Turn the pin off - No PWM */ } else if (percent == 0) {
if (pwmRunning) { /* Turn the pin off - No PWM */
pwmStop(&PWMD2); if (pwmRunning) {
pwmRunning = FALSE; pwmStop(&PWMD2);
} pwmRunning = FALSE;
palClearPad(IOPORT2, PIOB_LCD_BL); }
} else { palClearPad(IOPORT2, PIOB_LCD_BL);
/* Use the PWM */ } else {
if (!pwmRunning) { /* Use the PWM */
pwmStart(&PWMD2, &pwmcfg); if (!pwmRunning) {
pwmRunning = TRUE; pwmStart(&PWMD2, &pwmcfg);
} pwmRunning = TRUE;
pwmEnableChannel(&PWMD2, 0, PWM_VALUE(percent)); }
} pwmEnableChannel(&PWMD2, 0, PWM_VALUE(percent));
} }
}
/**
* @brief Take exclusive control of the bus /**
* * @brief Take exclusive control of the bus
* @notapi *
*/ * @notapi
static inline void acquire_bus(void) { */
/* Nothing to do for this board as the LCD is the only device on the SPI port */ static inline void acquire_bus(GDisplay *g) {
} (void) g;
/* Nothing to do for this board as the LCD is the only device on the SPI port */
/** }
* @brief Release exclusive control of the bus
* /**
* @notapi * @brief Release exclusive control of the bus
*/ *
static inline void release_bus(void) { * @notapi
// Nothing to do for this board as the LCD is the only device on the SPI port */
} static inline void release_bus(GDisplay *g) {
(void) g;
/** // Nothing to do for this board as the LCD is the only device on the SPI port
* @brief Send an 8 bit command to the lcd. }
*
* @param[in] cmd The command to send /**
* * @brief Send an 8 bit command to the lcd.
* @notapi *
*/ * @param[in] cmd The command to send
static inline void write_cmd(uint16_t cmd) { *
// wait for the previous transfer to complete * @notapi
while((pSPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0); */
// send the command static inline void write_index(GDisplay *g, uint16_t cmd) {
pSPI->SPI_TDR = cmd & 0xFF; (void) g;
}
// wait for the previous transfer to complete
/** while((pSPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
* @brief Send an 8 bit data to the lcd. // send the command
* pSPI->SPI_TDR = cmd & 0xFF;
* @param[in] data The data to send }
*
* @notapi /**
*/ * @brief Send an 8 bit data to the lcd.
static inline void write_data(uint16_t data) { *
// wait for the previous transfer to complete * @param[in] data The data to send
while((pSPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0); *
// send the data * @notapi
pSPI->SPI_TDR = data | 0x0100; */
} static inline void write_data(GDisplay *g, uint16_t data) {
(void) g;
#if GDISP_HARDWARE_READPIXEL || GDISP_HARDWARE_SCROLL || defined(__DOXYGEN__)
/** // wait for the previous transfer to complete
* @brief Read data from the lcd. while((pSPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
* // send the data
* @return The data from the lcd pSPI->SPI_TDR = data | 0x0100;
* }
* @notapi
*/ #endif /* _GDISP_LLD_BOARD_H */
static inline uint16_t read_data(void) {
#error "gdispNokia6610GE12: GDISP_HARDWARE_READPIXEL and GDISP_HARDWARE_SCROLL are not supported on this board"
return 0;
}
#endif
#endif /* _GDISP_LLD_BOARD_H */
/** @} */

View File

@ -6,7 +6,7 @@
*/ */
/** /**
* @file drivers/gdisp/Nokia6610GE12/gdisp_lld_board_template.h * @file drivers/gdisp/Nokia6610GE12/board_Nokia6610GE12_template.h
* @brief GDISP Graphic Driver subsystem board interface for the Nokia6610 GE12 display. * @brief GDISP Graphic Driver subsystem board interface for the Nokia6610 GE12 display.
* *
* @addtogroup GDISP * @addtogroup GDISP
@ -30,97 +30,102 @@
/** /**
* @brief Initialise the board for the display. * @brief Initialise the board for the display.
* @notes Performs the following functions: *
* 1. initialise the spi port used by your display * @param[in] g The GDisplay structure
* 2. initialise the reset pin (initial state not-in-reset) *
* 3. initialise the chip select pin (initial state not-active) * @note Set the g->priv member to whatever is appropriate. For multiple
* 4. initialise the backlight pin (initial state back-light off) * displays this might be a pointer to the appropriate register set.
* *
* @notapi * @notapi
*/ */
static inline void init_board(void) { static inline void init_board(GDisplay *g) {
(void) g;
}
/**
* @brief After the initialisation.
*
* @param[in] g The GDisplay structure
*
* @notapi
*/
static inline void post_init_board(GDisplay *g) {
(void) g;
} }
/** /**
* @brief Set or clear the lcd reset pin. * @brief Set or clear the lcd reset pin.
* *
* @param[in] g The GDisplay structure
* @param[in] state TRUE = lcd in reset, FALSE = normal operation * @param[in] state TRUE = lcd in reset, FALSE = normal operation
* *
* @notapi * @notapi
*/ */
static inline void setpin_reset(bool_t state) { static inline void setpin_reset(GDisplay *g, bool_t state) {
(void) g;
(void) state;
} }
/** /**
* @brief Set the lcd back-light level. * @brief Set the lcd back-light level.
* @note For now 0% turns the backlight off, anything else the backlight is on.
* While the hardware supports PWM backlight control, we are not using it
* yet.
* *
* @param[in] g The GDisplay structure
* @param[in] percent 0 to 100% * @param[in] percent 0 to 100%
* *
* @notapi * @notapi
*/ */
static inline void set_backlight(uint8_t percent) { static inline void set_backlight(GDisplay *g, uint8_t percent) {
(void) g;
(void) percent;
} }
/** /**
* @brief Take exclusive control of the bus * @brief Take exclusive control of the bus
* *
* @param[in] g The GDisplay structure
*
* @notapi * @notapi
*/ */
static inline void acquire_bus(void) { static inline void acquire_bus(GDisplay *g) {
(void) g;
} }
/** /**
* @brief Release exclusive control of the bus * @brief Release exclusive control of the bus
* *
* @notapi * @param[in] g The GDisplay structure
*/
static inline void release_bus(void) {
}
/**
* @brief Send an 8 bit command to the lcd.
*
* @param[in] cmd The command to send
* *
* @notapi * @notapi
*/ */
static inline void write_cmd(uint16_t cmd) { static inline void release_bus(GDisplay *g) {
(void) g;
} }
/** /**
* @brief Send an 8 bit data to the lcd. * @brief Send data to the index register.
* *
* @param[in] data The data to send * @param[in] g The GDisplay structure
* @param[in] index The index register to set
*
* @notapi
*/
static inline void write_index(GDisplay *g, uint16_t index) {
(void) g;
(void) index;
}
/**
* @brief Send data to the lcd.
*
* @param[in] g The GDisplay structure
* @param[in] data The data to send
* *
* @notapi * @notapi
*/ */
static inline void write_data(uint16_t data) { static inline void write_data(GDisplay *g, uint16_t data) {
(void) g;
(void) data;
} }
#if GDISP_HARDWARE_READPIXEL || GDISP_HARDWARE_SCROLL
/**
* @brief Read data from the lcd.
*
* @return The data from the lcd
* @note The chip select may need to be asserted/de-asserted
* around the actual spi read
*
* @notapi
*/
static inline uint16_t read_data(void) {
}
#endif
#endif /* _GDISP_LLD_BOARD_H */ #endif /* _GDISP_LLD_BOARD_H */
/** @} */ /** @} */

View File

@ -8,14 +8,11 @@
/** /**
* @file drivers/gdisp/Nokia6610GE12/gdisp_lld.c * @file drivers/gdisp/Nokia6610GE12/gdisp_lld.c
* @brief GDISP Graphics Driver subsystem low level driver source for the Nokia6610 GE12 display. * @brief GDISP Graphics Driver subsystem low level driver source for the Nokia6610 GE12 display.
*
* @addtogroup GDISP
* @{
*/ */
#include "gfx.h" #include "gfx.h"
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/ #if GFX_USE_GDISP
#if defined(GDISP_SCREEN_HEIGHT) #if defined(GDISP_SCREEN_HEIGHT)
#warning "GDISP: This low level driver does not support setting a screen size. It is being ignored." #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored."
@ -26,9 +23,11 @@
#undef GDISP_SCREEN_WIDTH #undef GDISP_SCREEN_WIDTH
#endif #endif
#define GDISP_LLD_DECLARATIONS #define GDISP_DRIVER_VMT GDISPVMT_Nokia6610GE12
#include "../drivers/gdisp/Nokia6610GE12/gdisp_lld_config.h"
#include "gdisp/lld/gdisp_lld.h" #include "gdisp/lld/gdisp_lld.h"
#include "gdisp_lld_board.h"
#include "board_Nokia6610GE12.h"
/*===========================================================================*/ /*===========================================================================*/
/* Driver local definitions. */ /* Driver local definitions. */
@ -70,46 +69,52 @@
/* Driver local variables. */ /* Driver local variables. */
/*===========================================================================*/ /*===========================================================================*/
static color_t savecolor; static color_t savecolor[GDISP_TOTAL_DISPLAYS];
#define GDISP_FLG_ODDBYTE (GDISP_FLG_DRIVER<<0) #define GDISP_FLG_ODDBYTE (GDISP_FLG_DRIVER<<0)
/*===========================================================================*/ /*===========================================================================*/
/* Driver local functions. */ /* Driver local functions. */
/*===========================================================================*/ /*===========================================================================*/
// Some macros just to make reading the code easier // Some macros just to make reading the code easier
#define delayms(ms) gfxSleepMilliseconds(ms) #define delayms(ms) gfxSleepMilliseconds(ms)
#define write_data2(d1, d2) { write_data(d1); write_data(d2); } #define write_data2(g, d1, d2) { write_data(g, d1); write_data(g, d2); }
#define write_data3(d1, d2, d3) { write_data(d1); write_data(d2); write_data(d3); } #define write_data3(g, d1, d2, d3) { write_data(g, d1); write_data(g, d2); write_data(g, d3); }
#define write_cmd1(cmd, d1) { write_cmd(cmd); write_data(d1); } #define write_reg(g, cmd, d1) { write_index(g, cmd); write_data(g, d1); }
#define write_cmd2(cmd, d1, d2) { write_cmd(cmd); write_data2(d1, d2); } #define write_reg2(g, cmd, d1, d2) { write_index(g, cmd); write_data2(g, d1, d2); }
#define write_cmd3(cmd, d1, d2, d3) { write_cmd(cmd); write_data3(d1, d2, d3); } #define write_reg3(g, cmd, d1, d2, d3) { write_index(g, cmd); write_data3(g, d1, d2, d3); }
static inline void set_viewport(GDisplay* g) {
write_reg2(g, CASET, GDISP_RAM_X_OFFSET+g->p.x, GDISP_RAM_X_OFFSET+g->p.x+g->p.cx-1); // Column address set
write_reg2(g, PASET, GDISP_RAM_Y_OFFSET+g->p.y, GDISP_RAM_Y_OFFSET+g->p.y+g->p.cy-1); // Page address set
write_index(g, RAMWR);
}
/*===========================================================================*/ /*===========================================================================*/
/* Driver exported functions. */ /* Driver exported functions. */
/*===========================================================================*/ /*===========================================================================*/
LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) { LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
/* Initialise your display */ /* Initialise your display */
init_board(); init_board(g);
// Hardware reset // Hardware reset
setpin_reset(TRUE); setpin_reset(g, TRUE);
delayms(20); delayms(20);
setpin_reset(FALSE); setpin_reset(g, FALSE);
delayms(20); delayms(20);
acquire_bus(); acquire_bus(g);
write_cmd(SLEEPOUT); // Sleep out write_index(g, SLEEPOUT); // Sleep out
write_cmd1(COLMOD, 0x03); // Color Interface Pixel Format - 0x03 = 12 bits-per-pixel write_reg(g, COLMOD, 0x03); // Color Interface Pixel Format - 0x03 = 12 bits-per-pixel
write_cmd1(MADCTL, 0x00); // Memory access controller write_reg(g, MADCTL, 0x00); // Memory access controller
write_cmd1(SETCON, 127*GDISP_INITIAL_CONTRAST/100-64); // Write contrast write_reg(g, SETCON, 127*GDISP_INITIAL_CONTRAST/100-64); // Write contrast
delayms(20); delayms(20);
release_bus(); release_bus(g);
/* Turn on the back-light */ /* Turn on the back-light */
set_backlight(GDISP_INITIAL_BACKLIGHT); set_backlight(g, GDISP_INITIAL_BACKLIGHT);
/* Initialise the GDISP structure to match */ /* Initialise the GDISP structure to match */
g->g.Width = GDISP_SCREEN_WIDTH; g->g.Width = GDISP_SCREEN_WIDTH;
@ -122,34 +127,34 @@ LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) {
} }
#if GDISP_HARDWARE_STREAM_WRITE #if GDISP_HARDWARE_STREAM_WRITE
LLDSPEC void gdisp_lld_write_start(GDISPDriver *g) { LLDSPEC void gdisp_lld_write_start(GDisplay *g) {
acquire_bus(); acquire_bus(g);
write_cmd2(CASET, GDISP_RAM_X_OFFSET+g->p.x, GDISP_RAM_X_OFFSET+g->p.x+g->p.cx-1); // Column address set set_viewport(g);
write_cmd2(PASET, GDISP_RAM_Y_OFFSET+g->p.y, GDISP_RAM_Y_OFFSET+g->p.y+g->p.cy-1); // Page address set
write_cmd(RAMWR);
g->flags &= ~GDISP_FLG_ODDBYTE; g->flags &= ~GDISP_FLG_ODDBYTE;
} }
LLDSPEC void gdisp_lld_write_color(GDISPDriver *g) { LLDSPEC void gdisp_lld_write_color(GDisplay *g) {
if ((g->flags & GDISP_FLG_ODDBYTE)) { if ((g->flags & GDISP_FLG_ODDBYTE)) {
// Write the pair of pixels to the display // Write the pair of pixels to the display
write_data3(((savecolor >> 4) & 0xFF), (((savecolor << 4) & 0xF0)|((g->p.color >> 8) & 0x0F)), (g->p.color & 0xFF)); write_data3(g, ((savecolor[g->controllerdisplay] >> 4) & 0xFF),
(((savecolor[g->controllerdisplay] << 4) & 0xF0)|((g->p.color >> 8) & 0x0F)),
(g->p.color & 0xFF));
g->flags &= ~GDISP_FLG_ODDBYTE; g->flags &= ~GDISP_FLG_ODDBYTE;
} else { } else {
savecolor = g->p.color; savecolor[g->controllerdisplay] = g->p.color;
g->flags |= GDISP_FLG_ODDBYTE; g->flags |= GDISP_FLG_ODDBYTE;
} }
} }
LLDSPEC void gdisp_lld_write_stop(GDISPDriver *g) { LLDSPEC void gdisp_lld_write_stop(GDisplay *g) {
if ((g->flags & GDISP_FLG_ODDBYTE)) { if ((g->flags & GDISP_FLG_ODDBYTE)) {
write_data2(((savecolor >> 4) & 0xFF), ((savecolor << 4) & 0xF0)); write_data2(g, ((savecolor[g->controllerdisplay] >> 4) & 0xFF), ((savecolor[g->controllerdisplay] << 4) & 0xF0));
write_cmd(NOP); write_index(g, NOP);
} }
release_bus(); release_bus(g);
} }
#endif #endif
#if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL #if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
LLDSPEC void gdisp_lld_control(GDISPDriver *g) { LLDSPEC void gdisp_lld_control(GDisplay *g) {
/* The hardware is capable of supporting... /* The hardware is capable of supporting...
* GDISP_CONTROL_POWER - supported * GDISP_CONTROL_POWER - supported
* GDISP_CONTROL_ORIENTATION - supported * GDISP_CONTROL_ORIENTATION - supported
@ -162,24 +167,24 @@ LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) {
return; return;
switch((powermode_t)g->p.ptr) { switch((powermode_t)g->p.ptr) {
case powerOff: case powerOff:
acquire_bus(); acquire_bus(g);
write_cmd(SLEEPIN); write_index(g, SLEEPIN);
release_bus(); release_bus(g);
break; break;
case powerOn: case powerOn:
acquire_bus(); acquire_bus(g);
write_cmd(SLEEPOUT); write_index(g, SLEEPOUT);
delayms(20); delayms(20);
write_cmd(NORON); // Set Normal mode (my) write_index(g, NORON); // Set Normal mode (my)
release_bus(); release_bus(g);
break; break;
case powerSleep: case powerSleep:
acquire_bus(); acquire_bus(g);
write_cmd(SLEEPOUT); write_index(g, SLEEPOUT);
delayms(20); delayms(20);
write_cmd2(PTLAR, GDISP_SLEEP_POS, GDISP_SLEEP_POS+GDISP_SLEEP_SIZE) write_reg2(g, PTLAR, GDISP_SLEEP_POS, GDISP_SLEEP_POS+GDISP_SLEEP_SIZE)
write_cmd(PTLON); write_index(g, PTLON);
release_bus(); release_bus(g);
break; break;
default: default:
return; return;
@ -192,30 +197,30 @@ LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) {
return; return;
switch((orientation_t)g->p.ptr) { switch((orientation_t)g->p.ptr) {
case GDISP_ROTATE_0: case GDISP_ROTATE_0:
acquire_bus(); acquire_bus(g);
write_cmd1(MADCTL, 0x00); write_reg(g, MADCTL, 0x00);
release_bus(); release_bus(g);
g->g.Height = GDISP_SCREEN_HEIGHT; g->g.Height = GDISP_SCREEN_HEIGHT;
g->g.Width = GDISP_SCREEN_WIDTH; g->g.Width = GDISP_SCREEN_WIDTH;
break; break;
case GDISP_ROTATE_90: case GDISP_ROTATE_90:
acquire_bus(); acquire_bus(g);
write_cmd1(MADCTL, 0xA0); // MY, MX, V, LAO, RGB, X, X, X write_reg(g, MADCTL, 0xA0); // MY, MX, V, LAO, RGB, X, X, X
release_bus(); release_bus(g);
g->g.Height = GDISP_SCREEN_WIDTH; g->g.Height = GDISP_SCREEN_WIDTH;
g->g.Width = GDISP_SCREEN_HEIGHT; g->g.Width = GDISP_SCREEN_HEIGHT;
break; break;
case GDISP_ROTATE_180: case GDISP_ROTATE_180:
acquire_bus(); acquire_bus(g);
write_cmd1(MADCTL, 0xC0); write_reg(g, MADCTL, 0xC0);
release_bus(); release_bus(g);
g->g.Height = GDISP_SCREEN_HEIGHT; g->g.Height = GDISP_SCREEN_HEIGHT;
g->g.Width = GDISP_SCREEN_WIDTH; g->g.Width = GDISP_SCREEN_WIDTH;
break; break;
case GDISP_ROTATE_270: case GDISP_ROTATE_270:
acquire_bus(); acquire_bus(g);
write_cmd1(MADCTL, 0x60); write_reg(g, MADCTL, 0x60);
release_bus(); release_bus(g);
g->g.Height = GDISP_SCREEN_WIDTH; g->g.Height = GDISP_SCREEN_WIDTH;
g->g.Width = GDISP_SCREEN_HEIGHT; g->g.Width = GDISP_SCREEN_HEIGHT;
break; break;
@ -227,14 +232,14 @@ LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) {
case GDISP_CONTROL_BACKLIGHT: case GDISP_CONTROL_BACKLIGHT:
if ((unsigned)g->p.ptr > 100) g->p.ptr = (void *)100; if ((unsigned)g->p.ptr > 100) g->p.ptr = (void *)100;
set_backlight((unsigned)g->p.ptr); set_backlight(g, (unsigned)g->p.ptr);
g->g.Backlight = (unsigned)g->p.ptr; g->g.Backlight = (unsigned)g->p.ptr;
return; return;
case GDISP_CONTROL_CONTRAST: case GDISP_CONTROL_CONTRAST:
if ((unsigned)g->p.ptr > 100) g->p.ptr = (void *)100; if ((unsigned)g->p.ptr > 100) g->p.ptr = (void *)100;
acquire_bus(); acquire_bus(g);
write_cmd1(CONTRAST,(unsigned)127*g->p.ptr/100-64); write_reg(g, CONTRAST,(unsigned)127*g->p.ptr/100-64);
release_bus(); release_bus(g);
g->g.Contrast = (unsigned)g->p.ptr; g->g.Contrast = (unsigned)g->p.ptr;
return; return;
} }
@ -242,4 +247,3 @@ LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) {
#endif #endif
#endif /* GFX_USE_GDISP */ #endif /* GFX_USE_GDISP */
/** @} */

View File

@ -1,5 +1,2 @@
# List the required driver.
GFXSRC += $(GFXLIB)/drivers/gdisp/Nokia6610GE12/gdisp_lld.c
# Required include directories
GFXINC += $(GFXLIB)/drivers/gdisp/Nokia6610GE12 GFXINC += $(GFXLIB)/drivers/gdisp/Nokia6610GE12
GFXSRC += $(GFXLIB)/drivers/gdisp/Nokia6610GE12/gdisp_lld.c

View File

@ -22,18 +22,10 @@
/* Driver hardware support. */ /* Driver hardware support. */
/*===========================================================================*/ /*===========================================================================*/
#define GDISP_DRIVER_NAME "Nokia6610GE12"
#define GDISP_DRIVER_STRUCT GDISP_Nokia6610GE12
#define GDISP_HARDWARE_CONTROL TRUE #define GDISP_HARDWARE_CONTROL TRUE
#define GDISP_HARDWARE_STREAM_WRITE TRUE #define GDISP_HARDWARE_STREAM_WRITE TRUE
#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB444 #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB444
/* This driver supports both packed and unpacked pixel formats and line formats.
* By default we leave these as FALSE.
*/
#define GDISP_PACKED_PIXELS FALSE
#define GDISP_PACKED_LINES FALSE
#endif /* GFX_USE_GDISP */ #endif /* GFX_USE_GDISP */