#include "gdew0213m21_epd.h" #include "gdew0213m21_data.h" des_epd_ret_t _des_epd_hardware_reset(des_epd_t *epd) { DES_EPD_ERROR_CHECK(epd->cb.reset_cb(epd->user_data)); return DES_EPD_OK; } des_epd_ret_t _des_epd_upload_lut(des_epd_t *epd) { uint8_t cmd = 0x20; DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &cmd, 0x01)); DES_EPD_ERROR_CHECK(epd->cb.write_data_cb(epd->user_data, DES_EPD_LUT_VCOM, sizeof(DES_EPD_LUT_VCOM))); cmd = 0x21; DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &cmd, 0x01)); DES_EPD_ERROR_CHECK(epd->cb.write_data_cb(epd->user_data, DES_EPD_LUT_WW, sizeof(DES_EPD_LUT_WW))); cmd = 0x22; DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &cmd, 0x01)); DES_EPD_ERROR_CHECK(epd->cb.write_data_cb(epd->user_data, DES_EPD_LUT_BW, sizeof(DES_EPD_LUT_BW))); cmd = 0x23; DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &cmd, 0x01)); DES_EPD_ERROR_CHECK(epd->cb.write_data_cb(epd->user_data, DES_EPD_LUT_WB, sizeof(DES_EPD_LUT_WB))); cmd = 0x24; DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &cmd, 0x01)); DES_EPD_ERROR_CHECK(epd->cb.write_data_cb(epd->user_data, DES_EPD_LUT_BB, sizeof(DES_EPD_LUT_BB))); return DES_EPD_OK; } des_epd_ret_t _des_epd_power_up(des_epd_t *epd) { uint8_t cmd = 0x04; DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &cmd, 0x01)); DES_EPD_ERROR_CHECK(epd->cb.poll_busy_cb(epd->user_data)); return DES_EPD_OK; } des_epd_ret_t _des_epd_power_down(des_epd_t *epd) { uint8_t cmd[5] = {0x50, 0xF7, 0x02, 0x07, 0xA5}; // VCOM and data interval setting DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, cmd, 0x02)); DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &cmd[2], 0x01)); DES_EPD_ERROR_CHECK(epd->cb.poll_busy_cb(epd->user_data)); DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &cmd[3], 0x02)); return DES_EPD_OK; } des_epd_ret_t _des_epd_init_seq(des_epd_t *epd, uint8_t partial) { uint16_t i = 0; if(partial) { while(i < sizeof(DES_EPD_PANEL_SELECTION_PART)) { DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &DES_EPD_PANEL_SELECTION_PART[i + 1], DES_EPD_PANEL_SELECTION_PART[i] + 1)); i += DES_EPD_PANEL_SELECTION_PART[i] + 2; } } else { while(i < sizeof(DES_EPD_PANEL_SELECTION)) { DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &DES_EPD_PANEL_SELECTION[i + 1], DES_EPD_PANEL_SELECTION[i] + 1)); i += DES_EPD_PANEL_SELECTION[i] + 2; } } return DES_EPD_OK; } des_epd_ret_t des_epd_init(des_epd_t *epd, uint8_t partial) { DES_EPD_ERROR_CHECK(_des_epd_hardware_reset(epd)); DES_EPD_ERROR_CHECK(_des_epd_init_seq(epd, partial)); if(partial) { DES_EPD_ERROR_CHECK(_des_epd_upload_lut(epd)); } DES_EPD_ERROR_CHECK(_des_epd_power_up(epd)); uint8_t data[2756]; memset(data, 0xFF, 2756); uint8_t cmd = 0x10; DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &cmd, 0x01)); DES_EPD_ERROR_CHECK(epd->cb.write_data_cb(epd->user_data, data, 2756)); memset(data, 0xFF, 2756); cmd = 0x13; DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &cmd, 0x01)); DES_EPD_ERROR_CHECK(epd->cb.write_data_cb(epd->user_data, data, 2756)); cmd = 0x12; // Refresh!! DES_EPD_ERROR_CHECK(epd->cb.write_cmd_cb(epd->user_data, &cmd, 0x01)); DES_EPD_ERROR_CHECK(epd->cb.poll_busy_cb(epd->user_data)); DES_EPD_ERROR_CHECK(_des_epd_power_down(epd)); return DES_EPD_OK; }