2021-01-21 16:55:13 +00:00
|
|
|
#include "gdew0213m21_epd.h"
|
2021-01-22 19:20:37 +00:00
|
|
|
#include "gdew0213m21_data.h"
|
2021-01-21 16:55:13 +00:00
|
|
|
|
|
|
|
des_epd_ret_t _des_epd_hardware_reset(des_epd_t *epd) {
|
2021-01-22 19:20:37 +00:00
|
|
|
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;
|
2021-01-21 16:55:13 +00:00
|
|
|
}
|
|
|
|
|
2021-01-22 19:20:37 +00:00
|
|
|
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;
|
2021-01-21 16:55:13 +00:00
|
|
|
}
|
|
|
|
|
2021-01-22 19:20:37 +00:00
|
|
|
des_epd_ret_t _des_epd_init_seq(des_epd_t *epd, uint8_t partial) {
|
2021-01-21 16:55:13 +00:00
|
|
|
uint16_t i = 0;
|
2021-01-22 19:20:37 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
2021-01-21 16:55:13 +00:00
|
|
|
|
|
|
|
return DES_EPD_OK;
|
|
|
|
}
|
|
|
|
|
2021-01-22 19:20:37 +00:00
|
|
|
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));
|
2021-01-21 16:55:13 +00:00
|
|
|
|
|
|
|
return DES_EPD_OK;
|
|
|
|
}
|