void rx_handler_command(struct usb_ep *ep, struct usb_request *req) { char response[RESPONSE_LEN]; char *cmdbuf = req->buf; void (*func_cb)(struct usb_ep *ep, struct usb_request *req) = NULL; int i; sprintf(response, "FAIL"); for (i = 0; i < ARRAY_SIZE(cmd_dispatch_info); i++) { if (!strcmp_l1(cmd_dispatch_info[i].cmd, cmdbuf)) { func_cb = cmd_dispatch_info[i].cb; break; } } if (!func_cb) fastboot_tx_write_str("FAILunknown command"); else func_cb(ep, req); if (req->status == 0) { *cmdbuf = '\0'; req->actual = 0; usb_ep_queue(ep, req, 0); } }
void get_slotvar(char *cmd, char *response, size_t chars_left) { int ret; struct boot_ctl t_bootctl; memset(&t_bootctl, 0, sizeof(t_bootctl)); ret = read_bootctl(&t_bootctl); if (ret) { error("get_slotvar, read_bootctl failed\n"); strcpy(response, "get_slotvar read_bootctl failed"); return; } if (!strcmp_l1("has-slot:", cmd)) { char *ptnname = NULL; ptnname = strchr(cmd, ':') + 1; if (!strcmp(ptnname, "system") || !strcmp(ptnname, "boot")) strncat(response, "yes", chars_left); else strncat(response, "no", chars_left); } else if (!strcmp_l1("current-slot", cmd)) { unsigned int slot = slot_find(&t_bootctl); if (slot < SLOT_NUM) strncat(response, g_slot_suffix[slot], chars_left); else strncat(response, "no valid slot", chars_left); } else if (!strcmp_l1("slot-suffixes", cmd)) { strncat(response, "_a,_b", chars_left); } else if (!strcmp_l1("slot-successful:", cmd)) { char *suffix = strchr(cmd, ':') + 1; unsigned int slot = slotidx_from_suffix(suffix); if (slot >= SLOT_NUM) { strncat(response, "no such slot", chars_left); } else { bool suc = t_bootctl.a_slot_meta[slot].bootsuc; strncat(response, suc ? "yes" : "no", chars_left); } } else if (!strcmp_l1("slot-unbootable:", cmd)) { char *suffix = strchr(cmd, ':') + 1; unsigned int slot = slotidx_from_suffix(suffix); if (slot >= SLOT_NUM) { strncat(response, "no such slot", chars_left); } else { unsigned int pri = t_bootctl.a_slot_meta[slot].priority; strncat(response, pri ? "no" : "yes", chars_left); } } else if (!strcmp_l1("slot-retry-count:", cmd)) { char *suffix = strchr(cmd, ':') + 1; unsigned int slot = slotidx_from_suffix(suffix); if (slot >= SLOT_NUM) strncat(response, "no such slot", chars_left); else sprintf(response, "OKAY%d", t_bootctl.a_slot_meta[slot].tryremain); } else { strncat(response, "no such slot command", chars_left); } return; }
bool is_sotvar(char *cmd) { if (!strcmp_l1("has-slot:", cmd) || !strcmp_l1("slot-successful:", cmd) || !strcmp_l1("slot-suffixes", cmd) || !strcmp_l1("current-slot", cmd) || !strcmp_l1("slot-unbootable:", cmd) || !strcmp_l1("slot-retry-count:", cmd)) { return true; } return false; }
static void cb_getvar(struct usb_ep *ep, struct usb_request *req) { char *cmd = req->buf; char response[RESPONSE_LEN]; const char *s; char userdata_sz[64]; strcpy(response, "OKAY"); strsep(&cmd, ":"); if (!cmd) { fastboot_tx_write_str("FAILmissing var"); return; } if (!strcmp_l1("version", cmd)) { strncat(response, FASTBOOT_VERSION, sizeof(response)); } else if (!strcmp_l1("downloadsize", cmd)) { char str_num[12]; sprintf(str_num, "%08x", fb_cfg.transfer_buffer_size); strncat(response, str_num, sizeof(response)); } else if (!strcmp_l1("product", cmd)) { s = fb_find_usb_string(FB_STR_PRODUCT_IDX); if (s) strncat(response, s, sizeof(response)); else strcpy(response, "FAILValue not set"); } else if (!strcmp_l1("serialno", cmd)) { s = fb_find_usb_string(FB_STR_SERIAL_IDX); if (s) strncat(response, s, sizeof(response)); else strcpy(response, "FAILValue not set"); } else if (!strcmp_l1("cpurev", cmd)) { s = fb_find_usb_string(FB_STR_PROC_REV_IDX); if (s) strncat(response, s, sizeof(response)); else strcpy(response, "FAILValue not set"); } else if (!strcmp_l1("secure", cmd)) { s = get_cpu_type(); if (s) strncat(response, s, sizeof(response)); else strcpy(response, "FAILValue not set"); } else if (!strcmp_l1("userdata_size", cmd)) { strncat(response, get_ptn_size(userdata_sz, "userdata"), sizeof(response)); } else { strcpy(response, "FAILVariable not implemented"); } fastboot_tx_write_str(response); }