RaspberryPi_EPD/lib/gdew0213m21/gdew0213m21_epd.c

93 lines
3.5 KiB
C

#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;
}