void ili9341_parallel::init(bool init_gpt) { data_t tx_data[16]; //initialize eventually the GPT if (init_gpt) GPT_config_interrupt(GPT1, gpt_interrupt_t::OUTPUT_COMPARE_1, 10000, false); this->hw_reset(); tx_data[0] = {ILI9341_CMD_POWER_ON_SEQ_CONTROL, type::COMMAND}; tx_data[1] = {0x39, type::DATA}; tx_data[2] = {0x2C, type::DATA}; tx_data[3] = {0x00, type::DATA}; tx_data[4] = {0x34, type::DATA}; tx_data[5] = {0x02, type::DATA}; this->send_irq_data(tx_data, 6); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_POWER_CONTROL_B, type::COMMAND}; tx_data[1] = {0x00, type::DATA}; tx_data[2] = {0xC1, type::DATA}; tx_data[3] = {0x30, type::DATA}; this->send_irq_data(tx_data, 4); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_DRIVER_TIMING_CONTROL_A, type::COMMAND}; tx_data[1] = {0x85, type::DATA}; tx_data[2] = {0x00, type::DATA}; tx_data[3] = {0x78, type::DATA}; this->send_irq_data(tx_data, 4); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_DRIVER_TIMING_CONTROL_B, type::COMMAND}; tx_data[1] = {0x00, type::DATA}; tx_data[2] = {0x00, type::DATA}; this->send_irq_data(tx_data, 3); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_POWER_ON_SEQ_CONTROLL, type::COMMAND}; tx_data[1] = {0x64, type::DATA}; tx_data[2] = {0x03, type::DATA}; tx_data[3] = {0x12, type::DATA}; tx_data[4] = {0x81, type::DATA}; this->send_irq_data(tx_data, 5); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_PUMP_RATIO_CONTROL, type::COMMAND}; tx_data[1] = {0x20, type::DATA}; this->send_irq_data(tx_data, 2); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_POWER_CONTROL_1, type::COMMAND}; tx_data[1] = {0x23, type::DATA}; this->send_irq_data(tx_data, 2); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_VCOM_CONTROL_1, type::COMMAND}; tx_data[1] = {0x3E, type::DATA}; tx_data[2] = {0x28, type::DATA}; this->send_irq_data(tx_data, 2); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_VCOM_CONTROL_2, type::COMMAND}; tx_data[1] = {0x86, type::DATA}; this->send_irq_data(tx_data, 2); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_FRAME_RATE_CONTROL_NORMAL, type::COMMAND}; tx_data[1] = {0x00, type::DATA}; tx_data[2] = {0x18, type::DATA}; this->send_irq_data(tx_data, 3); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_DISPLAY_FUNCTION_CONTROL, type::COMMAND}; tx_data[1] = {0x08, type::DATA}; tx_data[2] = {0x82, type::DATA}; tx_data[3] = {0x27, type::DATA}; this->send_irq_data(tx_data, 4); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_ENABLE_3_GAMMA_CONTROL, type::COMMAND}; tx_data[1] = {0x00, type::DATA}; this->send_irq_data(tx_data, 2); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_GAMMA_SET, type::COMMAND}; tx_data[1] = {0x01, type::DATA}; this->send_irq_data(tx_data, 2); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_POSITIVE_GAMMA_CORRECTION, type::COMMAND}; tx_data[1] = {0x0f, type::DATA}; tx_data[2] = {0x31, type::DATA}; tx_data[3] = {0x2B, type::DATA}; tx_data[4] = {0x0C, type::DATA}; tx_data[5] = {0x0E, type::DATA}; tx_data[6] = {0x08, type::DATA}; tx_data[7] = {0x4E, type::DATA}; tx_data[8] = {0xF1, type::DATA}; tx_data[9] = {0x37, type::DATA}; tx_data[10] = {0x07, type::DATA}; tx_data[11] = {0x10, type::DATA}; tx_data[12] = {0x03, type::DATA}; tx_data[13] = {0x0E, type::DATA}; tx_data[14] = {0x09, type::DATA}; tx_data[15] = {0x00, type::DATA}; this->send_irq_data(tx_data, 16); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_NEGATIVE_GAMMA_CORRECTION, type::COMMAND}; tx_data[1] = {0x00, type::DATA}; tx_data[2] = {0x0E, type::DATA}; tx_data[3] = {0x14, type::DATA}; tx_data[4] = {0x03, type::DATA}; tx_data[5] = {0x11, type::DATA}; tx_data[6] = {0x07, type::DATA}; tx_data[7] = {0x31, type::DATA}; tx_data[8] = {0xC1, type::DATA}; tx_data[9] = {0x48, type::DATA}; tx_data[10] = {0x08, type::DATA}; tx_data[11] = {0x0F, type::DATA}; tx_data[12] = {0x0C, type::DATA}; tx_data[13] = {0x31, type::DATA}; tx_data[14] = {0x36, type::DATA}; tx_data[15] = {0x0F, type::DATA}; this->send_irq_data(tx_data, 16); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_MEMORY_ACCESS_CONTROL, type::COMMAND}; tx_data[1] = {0x48, type::DATA}; this->send_irq_data(tx_data, 2); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_COLMOD_PIXEL_FORMAT_SET, type::COMMAND}; tx_data[1] = {0x55, type::DATA}; this->send_irq_data(tx_data, 2); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_NORMAL_DISP_MODE_ON, type::COMMAND}; this->send_irq_data(tx_data, 1); while (this->get_irq_status() == display_driver::irq_status::BUSY); tx_data[0] = {ILI9341_CMD_SLEEP_OUT, type::COMMAND}; this->send_irq_data(tx_data, 1); while (this->get_irq_status() == display_driver::irq_status::BUSY); emb_std::delay_ms(150); tx_data[0] = {ILI9341_CMD_DISPLAY_ON, type::COMMAND}; this->send_irq_data(tx_data, 1); while (this->get_irq_status() == display_driver::irq_status::BUSY); emb_std::delay_ms(150);