void gfx_ili9341_set_orientation(uint8_t flags) { ili9341_set_orientation(flags); /* Switch width and height if XY is switched. */ if ((flags & GFX_SWITCH_XY) != 0x00) { gfx_width = ILI9341_SWITCH_XY_WIDTH; gfx_height = ILI9341_SWITCH_XY_HEIGHT; } else { gfx_width = ILI9341_DEFAULT_WIDTH; gfx_height = ILI9341_DEFAULT_HEIGHT; } #ifdef CONF_GFX_USE_CLIPPING /* Reset clipping region. */ gfx_set_clipping(0, 0, gfx_width - 1, gfx_height - 1); #endif }
/** * \internal * \brief Initialize the hardware interface to the controller * * This will initialize the module used for communication with the controller. * Currently supported interfaces by this component driver are the SPI * interface through either the SPI module in master mode or the USART in * Master SPI mode. Configuration must be done in the associated * conf_ili9341.h file. */ static void ili9341_interface_init(void) { #if defined(CONF_ILI9341_USART_SPI) || defined(CONF_ILI9341_SPI) spi_flags_t spi_flags = SPI_MODE_0; board_spi_select_id_t spi_select_id = 0; #else #error Interface for ILI9341 has not been selected or interface not\ supported, please configure component driver using the conf_ili9341.h\ file! #endif #if defined(CONF_ILI9341_USART_SPI) struct usart_spi_device device = { .id = 0, }; usart_spi_init(CONF_ILI9341_USART_SPI); usart_spi_setup_device(CONF_ILI9341_USART_SPI, &device, spi_flags, CONF_ILI9341_CLOCK_SPEED, spi_select_id); #elif defined(CONF_ILI9341_SPI) struct spi_device device = { .id = 0, }; spi_master_init(CONF_ILI9341_SPI); spi_master_setup_device(CONF_ILI9341_SPI, &device, spi_flags, CONF_ILI9341_CLOCK_SPEED, spi_select_id); spi_enable(CONF_ILI9341_SPI); # if UC3 spi_set_chipselect(CONF_ILI9341_SPI, ~(1 << 0)); # if defined(ILI9341_DMA_ENABLED) sysclk_enable_peripheral_clock(&AVR32_PDCA); # endif # endif /* Send one dummy byte for the spi_is_tx_ok() to work as expected */ spi_write_single(CONF_ILI9341_SPI, 0); #endif } /** * \internal * \brief Initialize all the display registers * * This function will set up all the internal registers according the the * manufacturer's description. */ static void ili9341_controller_init_registers(void) { ili9341_send_command(ILI9341_CMD_POWER_CONTROL_A); ili9341_send_byte(0x39); ili9341_send_byte(0x2C); ili9341_send_byte(0x00); ili9341_send_byte(0x34); ili9341_send_byte(0x02); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(ILI9341_CMD_POWER_CONTROL_B); ili9341_send_byte(0x00); ili9341_send_byte(0xAA); ili9341_send_byte(0XB0); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(ILI9341_CMD_PUMP_RATIO_CONTROL); ili9341_send_byte(0x30); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(ILI9341_CMD_POWER_CONTROL_1); ili9341_send_byte(0x25); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(ILI9341_CMD_POWER_CONTROL_2); ili9341_send_byte(0x11); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(ILI9341_CMD_VCOM_CONTROL_1); ili9341_send_byte(0x5C); ili9341_send_byte(0x4C); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(ILI9341_CMD_VCOM_CONTROL_2); ili9341_send_byte(0x94); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(ILI9341_CMD_DRIVER_TIMING_CONTROL_A); ili9341_send_byte(0x85); ili9341_send_byte(0x01); ili9341_send_byte(0x78); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(ILI9341_CMD_DRIVER_TIMING_CONTROL_B); ili9341_send_byte(0x00); ili9341_send_byte(0x00); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(ILI9341_CMD_COLMOD_PIXEL_FORMAT_SET); ili9341_send_byte(0x05); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_set_orientation(0); ili9341_set_limits(0, 0, ILI9341_DEFAULT_WIDTH, ILI9341_DEFAULT_HEIGHT); } /** * \internal * \brief Send display commands to exit standby mode * * This function is used to exit the display standby mode, which is the default * mode after a reset signal to the display. */ static void ili9341_exit_standby(void) { ili9341_send_command(ILI9341_CMD_SLEEP_OUT); ili9341_deselect_chip(); delay_ms(150); ili9341_send_command(ILI9341_CMD_DISPLAY_ON); ili9341_deselect_chip(); }
/** * \internal * \brief Initialize the hardware interface to the controller * * This will initialize the module used for communication with the controller. * Currently supported interfaces by this component driver are the SPI * interface through either the SPI module in master mode or the USART in * Master SPI mode. Configuration must be done in the associated * conf_ili9341.h file. */ static void ili9341_interface_init(void) { #if defined(CONF_ILI9341_USART_SPI) || defined(CONF_ILI9341_SPI) spi_flags_t spi_flags = SPI_MODE_0; board_spi_select_id_t spi_select_id = 0; #else #error Interface for ILI9341 has not been selected or interface not\ supported, please configure component driver using the conf_ili9341.h\ file! #endif #if defined(CONF_ILI9341_USART_SPI) struct usart_spi_device device = { .id = 0, }; usart_spi_init(CONF_ILI9341_USART_SPI); usart_spi_setup_device(CONF_ILI9341_USART_SPI, &device, spi_flags, CONF_ILI9341_CLOCK_SPEED, spi_select_id); #elif defined(CONF_ILI9341_SPI) struct spi_device device = { .id = 0, }; spi_master_init(CONF_ILI9341_SPI); spi_master_setup_device(CONF_ILI9341_SPI, &device, spi_flags, CONF_ILI9341_CLOCK_SPEED, spi_select_id); spi_enable(CONF_ILI9341_SPI); # if UC3 spi_set_chipselect(CONF_ILI9341_SPI, ~(1 << 0)); # if defined(ILI9341_DMA_ENABLED) sysclk_enable_peripheral_clock(&AVR32_PDCA); # endif # endif /* Send one dummy byte for the spi_is_tx_ok() to work as expected */ spi_write_single(CONF_ILI9341_SPI, 0); #endif } /** * \internal * \brief Initialize all the display registers * * This function will set up all the internal registers according the the * manufacturer's description. */ static void ili9341_controller_init_registers(void) { ili9341_send_command(0xEF); ili9341_send_byte(0x03); ili9341_send_byte(0x80); ili9341_send_byte(0x02); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xCF); ili9341_send_byte(0x00); ili9341_send_byte(0xC1); ili9341_send_byte(0x30); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xED); ili9341_send_byte(0x64); ili9341_send_byte(0x03); ili9341_send_byte(0x12); ili9341_send_byte(0x81); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xE8); ili9341_send_byte(0x85); ili9341_send_byte(0x00); ili9341_send_byte(0x78); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xCB); ili9341_send_byte(0x39); ili9341_send_byte(0x2C); ili9341_send_byte(0x00); ili9341_send_byte(0x34); ili9341_send_byte(0x02); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xF7); ili9341_send_byte(0x20); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xEA); ili9341_send_byte(0x00); ili9341_send_byte(0x00); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xC0); ili9341_send_byte(0x23); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xC1); ili9341_send_byte(0x10); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xC5); ili9341_send_byte(0x3E); ili9341_send_byte(0x28); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xC7); ili9341_send_byte(0x86); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0x36); ili9341_send_byte(0x48); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0x3A); ili9341_send_byte(0x55); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xB1); ili9341_send_byte(0x00); ili9341_send_byte(0x18); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xB6); ili9341_send_byte(0x08); ili9341_send_byte(0x82); ili9341_send_byte(0x27); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xF2); ili9341_send_byte(0x00); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0x26); ili9341_send_byte(0x01); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xE0); ili9341_send_byte(0x0F); ili9341_send_byte(0x31); ili9341_send_byte(0x2B); ili9341_send_byte(0x0C); ili9341_send_byte(0x0E); ili9341_send_byte(0x08); ili9341_send_byte(0x4E); ili9341_send_byte(0xF1); ili9341_send_byte(0x37); ili9341_send_byte(0x07); ili9341_send_byte(0x10); ili9341_send_byte(0x03); ili9341_send_byte(0x0E); ili9341_send_byte(0x09); ili9341_send_byte(0x00); ili9341_wait_for_send_done(); ili9341_deselect_chip(); ili9341_send_command(0xE1); ili9341_send_byte(0x00); ili9341_send_byte(0x0E); ili9341_send_byte(0x14); ili9341_send_byte(0x03); ili9341_send_byte(0x11); ili9341_send_byte(0x07); ili9341_send_byte(0x31); ili9341_send_byte(0xC1); ili9341_send_byte(0x48); ili9341_send_byte(0x08); ili9341_send_byte(0x0F); ili9341_send_byte(0x0C); ili9341_send_byte(0x31); ili9341_send_byte(0x36); ili9341_send_byte(0x0F); ili9341_wait_for_send_done(); ili9341_deselect_chip(); // ili9341_send_command(ILI9341_CMD_POWER_CONTROL_A); // ili9341_send_byte(0x39); // ili9341_send_byte(0x2C); // ili9341_send_byte(0x00); // ili9341_send_byte(0x34); // ili9341_send_byte(0x02); // ili9341_wait_for_send_done(); // ili9341_deselect_chip(); // ili9341_send_command(ILI9341_CMD_POWER_CONTROL_B); // ili9341_send_byte(0x00); // ili9341_send_byte(0xAA); // ili9341_send_byte(0XB0); // ili9341_wait_for_send_done(); // ili9341_deselect_chip(); // ili9341_send_command(ILI9341_CMD_PUMP_RATIO_CONTROL); // ili9341_send_byte(0x30); // ili9341_wait_for_send_done(); // ili9341_deselect_chip(); // ili9341_send_command(ILI9341_CMD_POWER_CONTROL_1); // ili9341_send_byte(0x25); // ili9341_wait_for_send_done(); // ili9341_deselect_chip(); // ili9341_send_command(ILI9341_CMD_POWER_CONTROL_2); // ili9341_send_byte(0x11); // ili9341_wait_for_send_done(); // ili9341_deselect_chip(); // ili9341_send_command(ILI9341_CMD_VCOM_CONTROL_1); // ili9341_send_byte(0x5C); // ili9341_send_byte(0x4C); // ili9341_wait_for_send_done(); // ili9341_deselect_chip(); // ili9341_send_command(ILI9341_CMD_VCOM_CONTROL_2); // ili9341_send_byte(0x94); // ili9341_wait_for_send_done(); // ili9341_deselect_chip(); // ili9341_send_command(ILI9341_CMD_DRIVER_TIMING_CONTROL_A); // ili9341_send_byte(0x85); // ili9341_send_byte(0x01); // ili9341_send_byte(0x78); // ili9341_wait_for_send_done(); // ili9341_deselect_chip(); // ili9341_send_command(ILI9341_CMD_DRIVER_TIMING_CONTROL_B); // ili9341_send_byte(0x00); // ili9341_send_byte(0x00); // ili9341_wait_for_send_done(); // ili9341_deselect_chip(); // ili9341_send_command(ILI9341_CMD_COLMOD_PIXEL_FORMAT_SET); // ili9341_send_byte(0x05); // ili9341_wait_for_send_done(); // ili9341_deselect_chip(); ili9341_set_orientation(0); ili9341_set_limits(0, 0, ILI9341_DEFAULT_WIDTH, ILI9341_DEFAULT_HEIGHT); } void ili9341_enter_standby(void) { ili9341_send_command(ILI9341_CMD_ENTER_SLEEP_MODE); ili9341_deselect_chip(); }
static inline int ili9341_init_chip(struct ili9341 *ili) { int ret = 0; #ifdef SCREEN_TEST int x,y; #endif ili9341_reset(ili); ili9341_send_command(ili, 0xEF); ili9341_send_byte(ili, 0x03); ili9341_send_byte(ili, 0x80); ili9341_send_byte(ili, 0x02); ili9341_send_command(ili, 0xCF); ili9341_send_byte(ili, 0x00); ili9341_send_byte(ili, 0XC1); ili9341_send_byte(ili, 0X30); ili9341_send_command(ili, 0xED); ili9341_send_byte(ili, 0x64); ili9341_send_byte(ili, 0x03); ili9341_send_byte(ili, 0X12); ili9341_send_byte(ili, 0X81); ili9341_send_command(ili, 0xE8); ili9341_send_byte(ili, 0x85); ili9341_send_byte(ili, 0x00); ili9341_send_byte(ili, 0x78); ili9341_send_command(ili, 0xCB); ili9341_send_byte(ili, 0x39); ili9341_send_byte(ili, 0x2C); ili9341_send_byte(ili, 0x00); ili9341_send_byte(ili, 0x34); ili9341_send_byte(ili, 0x02); ili9341_send_command(ili, 0xF7); ili9341_send_byte(ili, 0x20); ili9341_send_command(ili, 0xEA); ili9341_send_byte(ili, 0x00); ili9341_send_byte(ili, 0x00); ili9341_send_command(ili, ILI9341_PWCTR1); //Power control ili9341_send_byte(ili, 0x23); //VRH[5:0] ili9341_send_command(ili, ILI9341_PWCTR2); //Power control ili9341_send_byte(ili, 0x10); //SAP[2:0];BT[3:0] ili9341_send_command(ili, ILI9341_VMCTR1); //VCM control ili9341_send_byte(ili, 0x3e); //¶Ô±È¶Èµ÷½Ú ili9341_send_byte(ili, 0x28); ili9341_send_command(ili, ILI9341_VMCTR2); //VCM control2 ili9341_send_byte(ili, 0x86); //-- ili9341_send_command(ili, ILI9341_MADCTL); // Memory Access Control ili9341_send_byte(ili, 0x48); ili9341_send_command(ili, ILI9341_PIXFMT); ili9341_send_byte(ili, 0x55); ili9341_send_command(ili, ILI9341_FRMCTR1); ili9341_send_byte(ili, 0x00); ili9341_send_byte(ili, 0x18); ili9341_send_command(ili, ILI9341_DFUNCTR); // Display Function Control ili9341_send_byte(ili, 0x08); ili9341_send_byte(ili, 0x82); ili9341_send_byte(ili, 0x27); ili9341_send_command(ili, 0xF2); // 3Gamma Function Disable ili9341_send_byte(ili, 0x00); ili9341_send_command(ili, ILI9341_GAMMASET); //Gamma curve selected ili9341_send_byte(ili, 0x01); ili9341_send_command(ili, ILI9341_GMCTRP1); //Set Gamma ili9341_send_byte(ili, 0x0F); ili9341_send_byte(ili, 0x31); ili9341_send_byte(ili, 0x2B); ili9341_send_byte(ili, 0x0C); ili9341_send_byte(ili, 0x0E); ili9341_send_byte(ili, 0x08); ili9341_send_byte(ili, 0x4E); ili9341_send_byte(ili, 0xF1); ili9341_send_byte(ili, 0x37); ili9341_send_byte(ili, 0x07); ili9341_send_byte(ili, 0x10); ili9341_send_byte(ili, 0x03); ili9341_send_byte(ili, 0x0E); ili9341_send_byte(ili, 0x09); ili9341_send_byte(ili, 0x00); ili9341_send_command(ili, ILI9341_GMCTRN1); //Set Gamma ili9341_send_byte(ili, 0x00); ili9341_send_byte(ili, 0x0E); ili9341_send_byte(ili, 0x14); ili9341_send_byte(ili, 0x03); ili9341_send_byte(ili, 0x11); ili9341_send_byte(ili, 0x07); ili9341_send_byte(ili, 0x31); ili9341_send_byte(ili, 0xC1); ili9341_send_byte(ili, 0x48); ili9341_send_byte(ili, 0x08); ili9341_send_byte(ili, 0x0F); ili9341_send_byte(ili, 0x0C); ili9341_send_byte(ili, 0x31); ili9341_send_byte(ili, 0x36); ili9341_send_byte(ili, 0x0F); ili9341_send_command(ili, ILI9341_SLPOUT); //Exit Sleep mdelay(120); ili9341_set_orientation(ili, ILI9341_SWITCH_XY | ILI9341_FLIP_X); ili9341_send_command(ili, ILI9341_DISPON); //Display on #ifdef SCREEN_TEST ili9341_set_window(ili, 0, 0, ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT); for(y=ILI9341_TFTHEIGHT; y>0; y--) { for(x=ILI9341_TFTWIDTH; x>0; x--) { ili9341_send_byte(ili, 0x55); ili9341_send_byte(ili, 0x55); } } #endif /* if (ret != 0) { dev_err(ili->dev, "failed to initialise display\n"); return ret; }*/ ili->initialised = 1; return ret; }