diff options
-rw-r--r-- | common/lightbar.c | 66 | ||||
-rw-r--r-- | include/ec_commands.h | 74 | ||||
-rw-r--r-- | util/ectool.c | 114 | ||||
-rw-r--r-- | util/lbplay.c | 111 |
4 files changed, 177 insertions, 188 deletions
diff --git a/common/lightbar.c b/common/lightbar.c index cfb292249d..25f15e6d19 100644 --- a/common/lightbar.c +++ b/common/lightbar.c @@ -961,19 +961,19 @@ static const uint8_t dump_reglist[] = { 0x18, 0x19, 0x1a }; -static void do_cmd_dump(struct ec_params_lightbar_cmd *ptr) +static void do_cmd_dump(struct ec_response_lightbar *out) { int i; uint8_t reg; BUILD_ASSERT(ARRAY_SIZE(dump_reglist) == - ARRAY_SIZE(ptr->out.dump.vals)); + ARRAY_SIZE(out->dump.vals)); for (i = 0; i < ARRAY_SIZE(dump_reglist); i++) { reg = dump_reglist[i]; - ptr->out.dump.vals[i].reg = reg; - ptr->out.dump.vals[i].ic0 = controller_read(0, reg); - ptr->out.dump.vals[i].ic1 = controller_read(1, reg); + out->dump.vals[i].reg = reg; + out->dump.vals[i].ic0 = controller_read(0, reg); + out->dump.vals[i].ic1 = controller_read(1, reg); } } @@ -996,21 +996,13 @@ static void do_cmd_rgb(uint8_t led, static int lpc_cmd_lightbar(struct host_cmd_handler_args *args) { - struct ec_params_lightbar_cmd *ptr = args->response; - - /* - * TODO: (crosbug.com/p/11277) Now that params and response are - * separate pointers, they need to be propagated to the lightbar - * sub-commands. For now, just copy params to response so the - * sub-commands above will work unchanged. - */ - if (args->params != args->response) - memcpy(args->response, args->params, args->params_size); - - switch (ptr->in.cmd) { + const struct ec_params_lightbar *in = args->params; + struct ec_response_lightbar *out = args->response; + + switch (in->cmd) { case LIGHTBAR_CMD_DUMP: - do_cmd_dump(ptr); - args->response_size = sizeof(ptr->out.dump); + do_cmd_dump(out); + args->response_size = sizeof(out->dump); break; case LIGHTBAR_CMD_OFF: lightbar_off(); @@ -1022,32 +1014,32 @@ static int lpc_cmd_lightbar(struct host_cmd_handler_args *args) lightbar_init_vals(); break; case LIGHTBAR_CMD_BRIGHTNESS: - lightbar_brightness(ptr->in.brightness.num); + lightbar_brightness(in->brightness.num); break; case LIGHTBAR_CMD_SEQ: - lightbar_sequence(ptr->in.seq.num); + lightbar_sequence(in->seq.num); break; case LIGHTBAR_CMD_REG: - controller_write(ptr->in.reg.ctrl, - ptr->in.reg.reg, - ptr->in.reg.value); + controller_write(in->reg.ctrl, + in->reg.reg, + in->reg.value); break; case LIGHTBAR_CMD_RGB: - do_cmd_rgb(ptr->in.rgb.led, - ptr->in.rgb.red, - ptr->in.rgb.green, - ptr->in.rgb.blue); + do_cmd_rgb(in->rgb.led, + in->rgb.red, + in->rgb.green, + in->rgb.blue); break; case LIGHTBAR_CMD_GET_SEQ: - ptr->out.get_seq.num = st.cur_seq; - args->response_size = sizeof(ptr->out.get_seq); + out->get_seq.num = st.cur_seq; + args->response_size = sizeof(out->get_seq); break; case LIGHTBAR_CMD_DEMO: - demo_mode = ptr->in.demo.num ? 1 : 0; + demo_mode = in->demo.num ? 1 : 0; CPRINTF("[%T LB_demo %d]\n", demo_mode); break; default: - CPRINTF("[%T LB bad cmd 0x%x]\n", ptr->in.cmd); + CPRINTF("[%T LB bad cmd 0x%x]\n", in->cmd); return EC_RES_INVALID_PARAM; } @@ -1107,15 +1099,15 @@ static int command_lightbar(int argc, char **argv) { int i; uint8_t num; - struct ec_params_lightbar_cmd params; + struct ec_response_lightbar out; if (1 == argc) { /* no args = dump 'em all */ - do_cmd_dump(¶ms); + do_cmd_dump(&out); for (i = 0; i < ARRAY_SIZE(dump_reglist); i++) ccprintf(" %02x %02x %02x\n", - params.out.dump.vals[i].reg, - params.out.dump.vals[i].ic0, - params.out.dump.vals[i].ic1); + out.dump.vals[i].reg, + out.dump.vals[i].ic0, + out.dump.vals[i].ic1); return EC_SUCCESS; } diff --git a/include/ec_commands.h b/include/ec_commands.h index 296b0d7ea9..f30f6a71a4 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -613,55 +613,51 @@ struct ec_params_pwm_set_fan_duty { /*****************************************************************************/ /* - * Lightbar commands. This looks worse than it is. Since we only use one LPC + * Lightbar commands. This looks worse than it is. Since we only use one HOST * command to say "talk to the lightbar", we put the "and tell it to do X" part * into a subcommand. We'll make separate structs for subcommands with * different input args, so that we know how much to expect. */ #define EC_CMD_LIGHTBAR_CMD 0x28 -struct ec_params_lightbar_cmd { +struct ec_params_lightbar { + uint8_t cmd; /* Command (see enum lightbar_command) */ union { - union { - uint8_t cmd; /* Command (see enum lightbar_command) */ + struct { + /* no args */ + } dump, off, on, init, get_seq; - struct { - uint8_t cmd; - } dump, off, on, init, get_seq; - - struct num { - uint8_t cmd; - uint8_t num; - } brightness, seq, demo; - - struct reg { - uint8_t cmd; - uint8_t ctrl, reg, value; - } reg; - - struct rgb { - uint8_t cmd; - uint8_t led, red, green, blue; - } rgb; - } in; - - union { - struct dump { - struct { - uint8_t reg; - uint8_t ic0; - uint8_t ic1; - } vals[23]; - } dump; - - struct get_seq { - uint8_t num; - } get_seq; + struct num { + uint8_t num; + } brightness, seq, demo; + + struct reg { + uint8_t ctrl, reg, value; + } reg; + + struct rgb { + uint8_t led, red, green, blue; + } rgb; + }; +} __packed; +struct ec_response_lightbar { + union { + struct dump { struct { - /* no return params */ - } off, on, init, brightness, seq, reg, rgb, demo; - } out; + uint8_t reg; + uint8_t ic0; + uint8_t ic1; + } vals[23]; + } dump; + + struct get_seq { + uint8_t num; + } get_seq; + + struct { + /* no return params */ + } off, on, init, brightness, seq, reg, rgb, demo; }; } __packed; diff --git a/util/ectool.c b/util/ectool.c index b4e9dd20a0..7ddaa07c06 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -1033,31 +1033,26 @@ static const char const *lightbar_cmds[] = { * define this in one and only one place, but I can't think of a good way to do * that without adding bunch of complexity. This will do for now. */ +#define LB_SIZES(SUBCMD) { \ + sizeof(((struct ec_params_lightbar *)0)->SUBCMD) \ + + sizeof(((struct ec_params_lightbar *)0)->cmd), \ + sizeof(((struct ec_response_lightbar *)0)->SUBCMD) } static const struct { uint8_t insize; uint8_t outsize; } lb_command_paramcount[] = { - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.dump), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.dump) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.off), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.off) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.on), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.on) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.init), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.init) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.brightness), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.brightness) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.seq), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.seq) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.reg), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.reg) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.rgb), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.rgb) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.get_seq), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.get_seq) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.demo), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.demo) }, + LB_SIZES(dump), + LB_SIZES(off), + LB_SIZES(on), + LB_SIZES(init), + LB_SIZES(brightness), + LB_SIZES(seq), + LB_SIZES(reg), + LB_SIZES(rgb), + LB_SIZES(get_seq), + LB_SIZES(demo) }; +#undef LB_SIZES static int lb_help(const char *cmd) { @@ -1087,83 +1082,88 @@ static uint8_t lb_find_msg_by_name(const char *str) } static int lb_do_cmd(enum lightbar_command cmd, - struct ec_params_lightbar_cmd *ptr) + struct ec_params_lightbar *in, + struct ec_response_lightbar *out) { int rv; - ptr->in.cmd = cmd; + in->cmd = cmd; rv = ec_command(EC_CMD_LIGHTBAR_CMD, 0, - ptr, lb_command_paramcount[cmd].insize, - ptr, lb_command_paramcount[cmd].outsize); + in, lb_command_paramcount[cmd].insize, + out, lb_command_paramcount[cmd].outsize); return (rv < 0 ? rv : 0); } -static void lb_show_msg_names(void) +static int lb_show_msg_names(void) { int i, current_state; - struct ec_params_lightbar_cmd param; + struct ec_params_lightbar param; + struct ec_response_lightbar resp; - (void)lb_do_cmd(LIGHTBAR_CMD_GET_SEQ, ¶m); - current_state = param.out.get_seq.num; + i = lb_do_cmd(LIGHTBAR_CMD_GET_SEQ, ¶m, &resp); + if (i < 0) + return i; + current_state = resp.get_seq.num; printf("sequence names:"); for (i = 0; i < LIGHTBAR_NUM_SEQUENCES; i++) printf(" %s", lightbar_cmds[i]); printf("\nCurrent = 0x%x %s\n", current_state, lightbar_cmds[current_state]); + + return 0; } static int cmd_lightbar(int argc, char **argv) { int i, r; - struct ec_params_lightbar_cmd param; + struct ec_params_lightbar param; + struct ec_response_lightbar resp; if (1 == argc) { /* no args = dump 'em all */ - r = lb_do_cmd(LIGHTBAR_CMD_DUMP, ¶m); + r = lb_do_cmd(LIGHTBAR_CMD_DUMP, ¶m, &resp); if (r) return r; - for (i = 0; i < ARRAY_SIZE(param.out.dump.vals); i++) { + for (i = 0; i < ARRAY_SIZE(resp.dump.vals); i++) { printf(" %02x %02x %02x\n", - param.out.dump.vals[i].reg, - param.out.dump.vals[i].ic0, - param.out.dump.vals[i].ic1); + resp.dump.vals[i].reg, + resp.dump.vals[i].ic0, + resp.dump.vals[i].ic1); } return 0; } if (argc == 2 && !strcasecmp(argv[1], "init")) - return lb_do_cmd(LIGHTBAR_CMD_INIT, ¶m); + return lb_do_cmd(LIGHTBAR_CMD_INIT, ¶m, &resp); if (argc == 2 && !strcasecmp(argv[1], "off")) - return lb_do_cmd(LIGHTBAR_CMD_OFF, ¶m); + return lb_do_cmd(LIGHTBAR_CMD_OFF, ¶m, &resp); if (argc == 2 && !strcasecmp(argv[1], "on")) - return lb_do_cmd(LIGHTBAR_CMD_ON, ¶m); + return lb_do_cmd(LIGHTBAR_CMD_ON, ¶m, &resp); if (argc == 3 && !strcasecmp(argv[1], "brightness")) { char *e; - param.in.brightness.num = 0xff & strtoul(argv[2], &e, 16); - return lb_do_cmd(LIGHTBAR_CMD_BRIGHTNESS, ¶m); + param.brightness.num = 0xff & strtoul(argv[2], &e, 16); + return lb_do_cmd(LIGHTBAR_CMD_BRIGHTNESS, ¶m, &resp); } if (argc == 3 && !strcasecmp(argv[1], "demo")) { if (!strcasecmp(argv[2], "on") || argv[2][0] == '1') - param.in.demo.num = 1; + param.demo.num = 1; else if (!strcasecmp(argv[2], "off") || argv[2][0] == '0') - param.in.demo.num = 0; + param.demo.num = 0; else { fprintf(stderr, "Invalid arg\n"); return -1; } - return lb_do_cmd(LIGHTBAR_CMD_DEMO, ¶m); + return lb_do_cmd(LIGHTBAR_CMD_DEMO, ¶m, &resp); } if (argc >= 2 && !strcasecmp(argv[1], "seq")) { char *e; uint8_t num; - if (argc == 2) { - lb_show_msg_names(); - return 0; - } + if (argc == 2) + return lb_show_msg_names(); num = 0xff & strtoul(argv[2], &e, 16); if (e && *e) num = lb_find_msg_by_name(argv[2]); @@ -1171,25 +1171,25 @@ static int cmd_lightbar(int argc, char **argv) fprintf(stderr, "Invalid arg\n"); return -1; } - param.in.seq.num = num; - return lb_do_cmd(LIGHTBAR_CMD_SEQ, ¶m); + param.seq.num = num; + return lb_do_cmd(LIGHTBAR_CMD_SEQ, ¶m, &resp); } if (argc == 4) { char *e; - param.in.reg.ctrl = 0xff & strtoul(argv[1], &e, 16); - param.in.reg.reg = 0xff & strtoul(argv[2], &e, 16); - param.in.reg.value = 0xff & strtoul(argv[3], &e, 16); - return lb_do_cmd(LIGHTBAR_CMD_REG, ¶m); + param.reg.ctrl = 0xff & strtoul(argv[1], &e, 16); + param.reg.reg = 0xff & strtoul(argv[2], &e, 16); + param.reg.value = 0xff & strtoul(argv[3], &e, 16); + return lb_do_cmd(LIGHTBAR_CMD_REG, ¶m, &resp); } if (argc == 5) { char *e; - param.in.rgb.led = strtoul(argv[1], &e, 16); - param.in.rgb.red = strtoul(argv[2], &e, 16); - param.in.rgb.green = strtoul(argv[3], &e, 16); - param.in.rgb.blue = strtoul(argv[4], &e, 16); - return lb_do_cmd(LIGHTBAR_CMD_RGB, ¶m); + param.rgb.led = strtoul(argv[1], &e, 16); + param.rgb.red = strtoul(argv[2], &e, 16); + param.rgb.green = strtoul(argv[3], &e, 16); + param.rgb.blue = strtoul(argv[4], &e, 16); + return lb_do_cmd(LIGHTBAR_CMD_RGB, ¶m, &resp); } return lb_help(argv[0]); diff --git a/util/lbplay.c b/util/lbplay.c index 9acabaddfb..8658368160 100644 --- a/util/lbplay.c +++ b/util/lbplay.c @@ -18,40 +18,36 @@ #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#define LB_SIZES(SUBCMD) { \ + sizeof(((struct ec_params_lightbar *)0)->SUBCMD) \ + + sizeof(((struct ec_params_lightbar *)0)->cmd), \ + sizeof(((struct ec_response_lightbar *)0)->SUBCMD) } static const struct { uint8_t insize; uint8_t outsize; } lb_command_paramcount[] = { - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.dump), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.dump) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.off), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.off) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.on), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.on) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.init), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.init) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.brightness), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.brightness) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.seq), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.seq) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.reg), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.reg) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.rgb), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.rgb) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.get_seq), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.get_seq) }, - { sizeof(((struct ec_params_lightbar_cmd *)0)->in.demo), - sizeof(((struct ec_params_lightbar_cmd *)0)->out.demo) }, + LB_SIZES(dump), + LB_SIZES(off), + LB_SIZES(on), + LB_SIZES(init), + LB_SIZES(brightness), + LB_SIZES(seq), + LB_SIZES(reg), + LB_SIZES(rgb), + LB_SIZES(get_seq), + LB_SIZES(demo) }; +#undef LB_SIZES static void lb_cmd_noargs(enum lightbar_command cmd) { - struct ec_params_lightbar_cmd param; - param.in.cmd = cmd; + struct ec_params_lightbar param; + struct ec_response_lightbar resp; + param.cmd = cmd; ec_command(EC_CMD_LIGHTBAR_CMD, 0, - ¶m, lb_command_paramcount[param.in.cmd].insize, - ¶m, lb_command_paramcount[param.in.cmd].outsize); + ¶m, lb_command_paramcount[param.cmd].insize, + &resp, lb_command_paramcount[param.cmd].outsize); } inline void lightbar_off(void) @@ -71,68 +67,73 @@ inline void lightbar_init_vals(void) void lightbar_brightness(int newval) { - struct ec_params_lightbar_cmd param; - param.in.cmd = LIGHTBAR_CMD_BRIGHTNESS; - param.in.brightness.num = newval; + struct ec_params_lightbar param; + struct ec_response_lightbar resp; + param.cmd = LIGHTBAR_CMD_BRIGHTNESS; + param.brightness.num = newval; ec_command(EC_CMD_LIGHTBAR_CMD, 0, - ¶m, lb_command_paramcount[param.in.cmd].insize, - ¶m, lb_command_paramcount[param.in.cmd].outsize); + ¶m, lb_command_paramcount[param.cmd].insize, + &resp, lb_command_paramcount[param.cmd].outsize); } void lightbar_sequence(enum lightbar_sequence num) { - struct ec_params_lightbar_cmd param; - param.in.cmd = LIGHTBAR_CMD_SEQ; - param.in.seq.num = num; + struct ec_params_lightbar param; + struct ec_response_lightbar resp; + param.cmd = LIGHTBAR_CMD_SEQ; + param.seq.num = num; ec_command(EC_CMD_LIGHTBAR_CMD, 0, - ¶m, lb_command_paramcount[param.in.cmd].insize, - ¶m, lb_command_paramcount[param.in.cmd].outsize); + ¶m, lb_command_paramcount[param.cmd].insize, + &resp, lb_command_paramcount[param.cmd].outsize); } void lightbar_reg(uint8_t ctrl, uint8_t reg, uint8_t val) { - struct ec_params_lightbar_cmd param; - param.in.cmd = LIGHTBAR_CMD_REG; - param.in.reg.ctrl = ctrl; - param.in.reg.reg = reg; - param.in.reg.value = val; + struct ec_params_lightbar param; + struct ec_response_lightbar resp; + param.cmd = LIGHTBAR_CMD_REG; + param.reg.ctrl = ctrl; + param.reg.reg = reg; + param.reg.value = val; ec_command(EC_CMD_LIGHTBAR_CMD, 0, - ¶m, lb_command_paramcount[param.in.cmd].insize, - ¶m, lb_command_paramcount[param.in.cmd].outsize); + ¶m, lb_command_paramcount[param.cmd].insize, + &resp, lb_command_paramcount[param.cmd].outsize); } void lightbar_rgb(int led, int red, int green, int blue) { - struct ec_params_lightbar_cmd param; - param.in.cmd = LIGHTBAR_CMD_RGB; - param.in.rgb.led = led; - param.in.rgb.red = red; - param.in.rgb.green = green; - param.in.rgb.blue = blue; + struct ec_params_lightbar param; + struct ec_response_lightbar resp; + param.cmd = LIGHTBAR_CMD_RGB; + param.rgb.led = led; + param.rgb.red = red; + param.rgb.green = green; + param.rgb.blue = blue; ec_command(EC_CMD_LIGHTBAR_CMD, 0, - ¶m, lb_command_paramcount[param.in.cmd].insize, - ¶m, lb_command_paramcount[param.in.cmd].outsize); + ¶m, lb_command_paramcount[param.cmd].insize, + &resp, lb_command_paramcount[param.cmd].outsize); } void wait_for_ec_to_stop(void) { int r; - struct ec_params_lightbar_cmd param; + struct ec_params_lightbar param; + struct ec_response_lightbar resp; int count = 0; do { usleep(100000); - param.in.cmd = LIGHTBAR_CMD_GET_SEQ; + param.cmd = LIGHTBAR_CMD_GET_SEQ; r = ec_command(EC_CMD_LIGHTBAR_CMD, 0, ¶m, - lb_command_paramcount[param.in.cmd].insize, - ¶m, - lb_command_paramcount[param.in.cmd].outsize); + lb_command_paramcount[param.cmd].insize, + &resp, + lb_command_paramcount[param.cmd].outsize); if (count++ > 10) { fprintf(stderr, "EC isn't responding\n"); exit(1); } - } while (r < 0 && param.out.get_seq.num != LIGHTBAR_STOP); + } while (r < 0 && resp.get_seq.num != LIGHTBAR_STOP); } int main(int argc, char **argv) |