/** * \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(); }