static bool bldr_cmd_handler(struct bldr_command_handler *handler, struct bldr_command *cmd, struct bldr_comport *comport) { struct comport_ops *comm = comport->ops; u32 attr = handler->attr; #if CFG_DT_MD_DOWNLOAD if (CMD_MATCH(cmd, SWITCH_MD_REQ)) { /* SWITCHMD */ if (attr & CMD_HNDL_ATTR_COM_FORBIDDEN) goto forbidden; comm->send((u8*)SWITCH_MD_ACK, strlen(SWITCH_MD_ACK)); platform_modem_download(); return TRUE; } #endif if (CMD_MATCH(cmd, ATCMD_PREFIX)) { /* "AT+XXX" */ if (CMD_MATCH(cmd, ATCMD_NBOOT_REQ)) { /* return "AT+OK" to tool */ comm->send((u8*)ATCMD_OK, strlen(ATCMD_OK)); g_boot_mode = NORMAL_BOOT; g_boot_reason = BR_TOOL_BY_PASS_PWK; } else { /* return "AT+UNKONWN" to ack tool */ comm->send((u8*)ATCMD_UNKNOWN, strlen(ATCMD_UNKNOWN)); return FALSE; } } else if (CMD_MATCH(cmd, META_STR_REQ)) { para_t param; #if CFG_BOOT_ARGUMENT bootarg.md_type[0] = 0; bootarg.md_type[1] = 0; #endif /* "METAMETA" */ if (attr & CMD_HNDL_ATTR_COM_FORBIDDEN) goto forbidden; /* for backward compatibility */ comm->recv((u8*)¶m.v0001, sizeof(param.v0001), 2000); #if CFG_WORLD_PHONE_SUPPORT comm->send((u8*)META_ARG_VER_STR, strlen(META_ARG_VER_STR)); if (0 == comm->recv((u8*)¶m.v0001, sizeof(param.v0001), 5000)) { g_meta_com_id = param.v0001.usb_type; print("md_type[0] = %d \n", param.v0001.md0_type); print("md_type[1] = %d \n", param.v0001.md1_type); #if CFG_BOOT_ARGUMENT bootarg.md_type[0] = param.v0001.md0_type; bootarg.md_type[1] = param.v0001.md1_type; #endif } #endif comm->send((u8*)META_STR_ACK, strlen(META_STR_ACK)); #if CFG_WORLD_PHONE_SUPPORT wait_for_discon(comm, 1000); #endif g_boot_mode = META_BOOT; } else if (CMD_MATCH(cmd, FACTORY_STR_REQ)) { para_t param; /* "FACTFACT" */ if (attr & CMD_HNDL_ATTR_COM_FORBIDDEN) goto forbidden; if (0 == comm->recv((u8*)¶m.v0001, sizeof(param.v0001), 5)) { g_meta_com_id = param.v0001.usb_type; } comm->send((u8*)FACTORY_STR_ACK, strlen(FACTORY_STR_ACK)); g_boot_mode = FACTORY_BOOT; } else if (CMD_MATCH(cmd, META_ADV_REQ)) { /* "ADVEMETA" */ if (attr & CMD_HNDL_ATTR_COM_FORBIDDEN) goto forbidden; comm->send((u8*)META_ADV_ACK, strlen(META_ADV_ACK)); wait_for_discon(comm, 1000); g_boot_mode = ADVMETA_BOOT; } else if (CMD_MATCH(cmd, ATE_STR_REQ)) { para_t param; /* "FACTORYM" */ if (attr & CMD_HNDL_ATTR_COM_FORBIDDEN) goto forbidden; if (0 == comm->recv((u8*)¶m.v0001, sizeof(param.v0001), 5)) { g_meta_com_id = param.v0001.usb_type; } comm->send((u8*)ATE_STR_ACK, strlen(ATE_STR_ACK)); g_boot_mode = ATE_FACTORY_BOOT; } else if (CMD_MATCH(cmd, FB_STR_REQ)) { /* "FASTBOOT" */ comm->send((u8 *)FB_STR_ACK, strlen(FB_STR_ACK)); g_boot_mode = FASTBOOT; } else { print("%s unknown received: \'%s\'\n", MOD, cmd->data); return FALSE; } print("%s '%s' received!\n", MOD, cmd->data); return TRUE; forbidden: comm->send((u8*)META_FORBIDDEN_ACK, strlen(META_FORBIDDEN_ACK)); print("%s '%s' is forbidden!\n", MOD, cmd->data); return FALSE; }
/** * Determines the client command. * @arg cmd_buf A command buffer * @arg buf_len The length of the buffer * @arg arg_buf Output. Sets the start address of the command arguments. * @arg arg_len Output. Sets the length of arg_buf. * @return The conn_cmd_type enum value. * UNKNOWN if it doesn't match anything supported, or a proper command. */ static conn_cmd_type determine_client_command(char *cmd_buf, int buf_len, char **arg_buf, int *arg_len) { // Check if we are ending with \r, and remove it. if (cmd_buf[buf_len-2] == '\r') { cmd_buf[buf_len-2] = '\0'; buf_len -= 1; } // Scan for a space. This will setup the arg_buf and arg_len // if we do find the terminator. It will also insert a null terminator // at the space, so we can compare the cmd_buf to the commands. buffer_after_terminator(cmd_buf, buf_len, ' ', arg_buf, arg_len); // Search for the command conn_cmd_type type = UNKNOWN; #define CMD_MATCH(name) (strcmp(name, cmd_buf) == 0) if (CMD_MATCH("check") || CMD_MATCH("c")) { type = CHECK; } else if (CMD_MATCH("multi") || CMD_MATCH("m")) { type = CHECK_MULTI; } else if (CMD_MATCH("get") || CMD_MATCH("g")) { type = GET; } else if (CMD_MATCH("set") || CMD_MATCH("s")) { type = SET; } else if (CMD_MATCH("bulk") || CMD_MATCH("b")) { type = SET_MULTI; } else if (CMD_MATCH("list") ) { type = LIST; } else if (CMD_MATCH("info") ) { type = INFO; } else if (CMD_MATCH("create") ) { type = CREATE; } else if (CMD_MATCH("drop") ) { type = DROP; } else if (CMD_MATCH("close") ) { type = CLOSE; } else if (CMD_MATCH("clear") ) { type = CLEAR; } else if (CMD_MATCH("flush") ) { type = FLUSH; } return type; }
static bool bldr_cmd_handler(struct bldr_command_handler *handler, struct bldr_command *cmd, struct bldr_comport *comport) { struct comport_ops *comm = comport->ops; u32 attr = handler->attr; #if CFG_LEGACY_USB_DOWNLOAD /* "DOWNLOAD" */ if (CMD_MATCH(cmd, DM_STR_DOWNLOAD_REQ) && (comport->type == COM_USB)) { comm->send((u8*)DM_STR_DOWNLOAD_ACK, strlen(DM_STR_DOWNLOAD_ACK)); print("%s download mode detected!\n", MOD); download_handler(); g_boot_mode = DOWNLOAD_BOOT; return TRUE; } #endif #if CFG_DT_MD_DOWNLOAD if (CMD_MATCH(cmd, SWITCH_MD_REQ)) { /* SWITCHMD */ if (attr & CMD_HNDL_ATTR_COM_FORBIDDEN) goto forbidden; comm->send((u8*)SWITCH_MD_ACK, strlen(SWITCH_MD_ACK)); platform_modem_download(); return TRUE; } #endif if (CMD_MATCH(cmd, ATCMD_PREFIX)) { /* "AT+XXX" */ if (CMD_MATCH(cmd, ATCMD_NBOOT_REQ)) { /* return "AT+OK" to tool */ comm->send((u8*)ATCMD_OK, strlen(ATCMD_OK)); g_boot_mode = NORMAL_BOOT; g_boot_reason = BR_TOOL_BY_PASS_PWK; } else { /* return "AT+UNKONWN" to ack tool */ comm->send((u8*)ATCMD_UNKNOWN, strlen(ATCMD_UNKNOWN)); return FALSE; } } else if (CMD_MATCH(cmd, META_STR_REQ)) { para_t param; /* "METAMETA" */ if (attr & CMD_HNDL_ATTR_COM_FORBIDDEN) goto forbidden; if (0 == comm->recv((u8*)¶m.v1, sizeof(param.v1), 5)) { g_meta_com_id = param.v1.usb_type; } comm->send((u8*)META_STR_ACK, strlen(META_STR_ACK)); wait_for_discon(comm, 1000); g_boot_mode = META_BOOT; } else if (CMD_MATCH(cmd, FACTORY_STR_REQ)) { para_t param; /* "FACTFACT" */ if (attr & CMD_HNDL_ATTR_COM_FORBIDDEN) goto forbidden; if (0 == comm->recv((u8*)¶m.v1, sizeof(param.v1), 5)) { g_meta_com_id = param.v1.usb_type; } comm->send((u8*)FACTORY_STR_ACK, strlen(FACTORY_STR_ACK)); g_boot_mode = FACTORY_BOOT; } else if (CMD_MATCH(cmd, META_ADV_REQ)) { /* "ADVEMETA" */ if (attr & CMD_HNDL_ATTR_COM_FORBIDDEN) goto forbidden; comm->send((u8*)META_ADV_ACK, strlen(META_ADV_ACK)); wait_for_discon(comm, 1000); g_boot_mode = ADVMETA_BOOT; } else if (CMD_MATCH(cmd, ATE_STR_REQ)) { para_t param; /* "FACTORYM" */ if (attr & CMD_HNDL_ATTR_COM_FORBIDDEN) goto forbidden; if (0 == comm->recv((u8*)¶m.v1, sizeof(param.v1), 5)) { g_meta_com_id = param.v1.usb_type; } comm->send((u8*)ATE_STR_ACK, strlen(ATE_STR_ACK)); g_boot_mode = ATE_FACTORY_BOOT; } else if (CMD_MATCH(cmd, FB_STR_REQ)) { /* "FASTBOOT" */ comm->send((u8 *)FB_STR_ACK, strlen(FB_STR_ACK)); g_boot_mode = FASTBOOT; } else { print("%s unknown received: \'%s\'\n", MOD, cmd->data); return FALSE; } print("%s '%s' received!\n", MOD, cmd->data); return TRUE; forbidden: comm->send((u8*)META_FORBIDDEN_ACK, strlen(META_FORBIDDEN_ACK)); print("%s '%s' is forbidden!\n", MOD, cmd->data); return FALSE; }