static int ws_eink_sleep(struct ws_eink_fb_par *par) { int ret; ret = ws_eink_send_cmd(par, WS_DEEP_SLEEP_MODE, NULL, 0); if (ret) return ret; wait_until_idle(par); return 0; }
static int set_memory_pointer(struct ws_eink_fb_par *par, int x, int y) { int ret; const u8 x_addr_counter[] = { (x >> 3) & 0xFF }; const u8 y_addr_counter[] = { y & 0xFF, (y >> 8) & 0xFF }; ret = ws_eink_send_cmd(par, WS_SET_RAM_X_ADDRESS_COUNTER, x_addr_counter, sizeof(x_addr_counter)); if (ret) return ret; ret = ws_eink_send_cmd(par, WS_SET_RAM_Y_ADDRESS_COUNTER, y_addr_counter, sizeof(y_addr_counter)); if (ret) return ret; wait_until_idle(par); return 0; }
static uint64_t do_measurement(void (*callback)(void *ptr), void *ptr) { uint64_t tsc, pc; wait_until_idle(); set_alarm(opts.res_warm_time, 0); callback(ptr); set_alarm(opts.res_calc_time, 0); tsc = msr_read(IA32_TIME_STAMP_COUNTER); pc = msr_read(deepest_pc_state); callback(ptr); pc = msr_read(deepest_pc_state) - pc; tsc = msr_read(IA32_TIME_STAMP_COUNTER) - tsc; return pc * 100 / tsc; }
static int display_frame(struct ws_eink_fb_par *par) { int ret; const u8 data_display_update_control_2[] = { 0xC4 }; ret = ws_eink_send_cmd(par, WS_DISPLAY_UPDATE_CONTROL_2, data_display_update_control_2, sizeof(data_display_update_control_2)); if (ret) return ret; ret = ws_eink_send_cmd(par, WS_MASTER_ACTIVATION, NULL, 0); if (ret) return ret; ret = ws_eink_send_cmd(par, WS_TERMINATE_FRAME_READ_WRITE, NULL, 0); if (ret) return ret; wait_until_idle(par); return 0; }