summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorji.luo <ji.luo@nxp.com>2017-09-28 18:54:27 +0800
committerji.luo <ji.luo@nxp.com>2017-11-22 10:35:48 +0800
commit94f10f00e79b2162e5845a58df3ccba4252b7df6 (patch)
treefd3075b87b98f417f24b5e0fc21ea68cff5d4352
parentb195836e2b816018edcff5b58ed20b1ed914c7b7 (diff)
Refine support for 'fastboot getvar all' command
Make the device respond multiple packets after receiving fastboot command "fastboot getvar all" from the host. It can make the "fastboot getvar all" work both on Windows host and Linux host. Change-Id: I428678369134b4228d7544fb3cbcb3469ffec6a1 Signed-off-by: ji.luo <ji.luo@nxp.com>
-rwxr-xr-xdrivers/usb/gadget/f_fastboot.c186
1 files changed, 78 insertions, 108 deletions
diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c
index b60f161e6d..39758945ad 100755
--- a/drivers/usb/gadget/f_fastboot.c
+++ b/drivers/usb/gadget/f_fastboot.c
@@ -62,7 +62,7 @@
#ifdef CONFIG_FASTBOOT_LOCK
#include "fastboot_lock_unlock.h"
#endif
-#define FASTBOOT_VAR_NUM (26 + 2 * (MAX_PTN))
+#define FASTBOOT_COMMON_VAR_NUM 13
#define FASTBOOT_VAR_YES "yes"
#define FASTBOOT_VAR_NO "no"
@@ -89,6 +89,23 @@ static unsigned int download_bytes;
static bool is_recovery_mode;
#endif
+/* common variables of fastboot getvar command */
+char *fastboot_common_var[FASTBOOT_COMMON_VAR_NUM] = {
+ "version",
+ "version-bootloader",
+ "version-baseband",
+ "product",
+ "secure",
+ "max-download-size",
+ "erase-block-size",
+ "logical-block-size",
+ "unlocked",
+ "off-mode-charge",
+ "battery-voltage",
+ "variant",
+ "battery-soc-ok"
+};
+
#ifdef CONFIG_USB_GADGET
struct f_fastboot {
struct usb_function usb_function;
@@ -2274,7 +2291,14 @@ static int get_single_var(char *cmd, char *response)
static void cb_getvar(struct usb_ep *ep, struct usb_request *req)
{
+ int n = 0;
+ int status = 0;
+ int count = 0;
char *cmd = req->buf;
+ char var_name[FASTBOOT_RESPONSE_LEN - 1];
+ char partition_base_name[MAX_PTN][16];
+ char slot_suffix[2][5] = {"_a","_b"};
+ char response[FASTBOOT_RESPONSE_LEN - 1];
strsep(&cmd, ":");
if (!cmd) {
@@ -2283,135 +2307,81 @@ static void cb_getvar(struct usb_ep *ep, struct usb_request *req)
}
if (!strcmp_l1("all", cmd)) {
- int num = 0;
- int n = 0;
- char var_name[30];
- char response[FASTBOOT_VAR_NUM + 1][FASTBOOT_RESPONSE_LEN - 1];
- char partition_base_name[MAX_PTN][16];
- char slot_suffix[2][5] = {"_a","_b"};
-
- memset(response,'\0',(FASTBOOT_VAR_NUM + 1) * (FASTBOOT_RESPONSE_LEN - 1));
-
- /*get all variables*/
- strcat(response[num], "INFOversion:");
- get_single_var("version",response[num]);
-
- num++;
- strcat(response[num], "INFOversion-bootloader:");
- get_single_var("version-bootloader",response[num]);
-
- num++;
- strcat(response[num], "INFOversion-baseband:");
- get_single_var("version-baseband",response[num]);
-
- num++;
- strcat(response[num], "INFOproduct:");
- get_single_var("product",response[num]);
-
- num++;
- strcat(response[num], "INFOsecure:");
- get_single_var("secure",response[num]);
-
- num++;
- strcat(response[num], "INFOmax-download-size:");
- get_single_var("max-download-size",response[num]);
-
- num++;
- strcat(response[num], "INFOerase-block-size:");
- get_single_var("erase-block-size",response[num]);
-
- num++;
- strcat(response[num], "INFOlogical-block-size:");
- get_single_var("logical-block-size",response[num]);
-
- num++;
- strcat(response[num], "INFOunlocked:");
- get_single_var("unlocked",response[num]);
-
- num++;
- strcat(response[num], "INFOoff-mode-charge:");
- get_single_var("off-mode-charge",response[num]);
-
- num++;
- strcat(response[num], "INFObattery-voltage:");
- get_single_var("battery-voltage",response[num]);
-
- num++;
- strcat(response[num], "INFOvariant:");
- get_single_var("variant",response[num]);
-
- num++;
- strcat(response[num], "INFObattery-soc-ok:");
- get_single_var("battery-soc-ok",response[num]);
- /*get partition type*/
+
+ memset(response, '\0', FASTBOOT_RESPONSE_LEN - 1);
+
+ /* get common variables */
+ for (n = 0; n < FASTBOOT_COMMON_VAR_NUM; n++) {
+ snprintf(response, sizeof(response), "INFO%s:", fastboot_common_var[n]);
+ get_single_var(fastboot_common_var[n], response);
+ fastboot_tx_write_str(response);
+ }
+
+ /* get partition type */
for (n = 0; n < g_pcount; n++) {
- num++;
- sprintf(response[num],"INFOpartition-type:%s:",g_ptable[n].name);
- sprintf(var_name,"partition-type:%s",g_ptable[n].name);
- get_single_var(var_name,response[num]);
+ snprintf(response, sizeof(response), "INFOpartition-type:%s:", g_ptable[n].name);
+ snprintf(var_name, sizeof(var_name), "partition-type:%s", g_ptable[n].name);
+ get_single_var(var_name, response);
+ fastboot_tx_write_str(response);
}
- /*get partition size*/
+ /* get partition size */
for (n = 0; n < g_pcount; n++) {
- num++;
- sprintf(response[num],"INFOpartition-size:%s:",g_ptable[n].name);
- sprintf(var_name,"partition-size:%s",g_ptable[n].name);
- get_single_var(var_name,response[num]);
+ snprintf(response, sizeof(response), "INFOpartition-size:%s:", g_ptable[n].name);
+ snprintf(var_name, sizeof(var_name), "partition-size:%s", g_ptable[n].name);
+ get_single_var(var_name,response);
+ fastboot_tx_write_str(response);
}
- /*slot related variables*/
- if (is_slot()){
- /*get has-slot variables*/
- int count = 0;
+ /* slot related variables */
+ if (is_slot()) {
+ /* get has-slot variables */
count = get_partition_base_name(partition_base_name);
for (n = 0; n < count; n++) {
- num++;
- sprintf(response[num],"INFOhas-slot:%s:",partition_base_name[n]);
- sprintf(var_name,"has-slot:%s",partition_base_name[n]);
- get_single_var(var_name,response[num]);
+ snprintf(response, sizeof(response), "INFOhas-slot:%s:", partition_base_name[n]);
+ snprintf(var_name, sizeof(var_name), "has-slot:%s", partition_base_name[n]);
+ get_single_var(var_name,response);
+ fastboot_tx_write_str(response);
}
-
- num++;
- strcat(response[num], "INFOcurrent-slot:");
- get_single_var("current-slot",response[num]);
-
- num++;
- strcat(response[num], "INFOslot-count:");
- get_single_var("slot-count",response[num]);
- /*get slot-successful variable*/
+ /* get current slot */
+ strncpy(response, "INFOcurrent-slot:", sizeof(response));
+ get_single_var("current-slot", response);
+ fastboot_tx_write_str(response);
+ /* get slot count */
+ strncpy(response, "INFOslot-count:", sizeof(response));
+ get_single_var("slot-count", response);
+ fastboot_tx_write_str(response);
+ /* get slot-successful variable */
for (n = 0; n < 2; n++) {
- num++;
- sprintf(response[num],"INFOslot-successful:%s:",slot_suffix[n]);
- sprintf(var_name,"slot-successful:%s",slot_suffix[n]);
- get_single_var(var_name,response[num]);
+ snprintf(response, sizeof(response), "INFOslot-successful:%s:", slot_suffix[n]);
+ snprintf(var_name, sizeof(var_name), "slot-successful:%s", slot_suffix[n]);
+ get_single_var(var_name, response);
+ fastboot_tx_write_str(response);
}
/*get slot-unbootable variable*/
for (n = 0; n < 2; n++) {
- num++;
- sprintf(response[num],"INFOslot-unbootable:%s:",slot_suffix[n]);
- sprintf(var_name,"slot-unbootable:%s",slot_suffix[n]);
- get_single_var(var_name,response[num]);
+ snprintf(response, sizeof(response), "INFOslot-unbootable:%s:", slot_suffix[n]);
+ snprintf(var_name, sizeof(var_name), "slot-unbootable:%s", slot_suffix[n]);
+ get_single_var(var_name, response);
+ fastboot_tx_write_str(response);
}
/*get slot-retry-count variable*/
for (n = 0; n < 2; n++) {
- num++;
- sprintf(response[num],"INFOslot-retry-count:%s:",slot_suffix[n]);
- sprintf(var_name,"slot-retry-count:%s",slot_suffix[n]);
- get_single_var(var_name,response[num]);
+ snprintf(response, sizeof(response), "INFOslot-retry-count:%s:", slot_suffix[n]);
+ snprintf(var_name, sizeof(var_name), "slot-retry-count:%s", slot_suffix[n]);
+ get_single_var(var_name, response);
+ fastboot_tx_write_str(response);
}
}
- num++;
- strncpy(response[num], "OKAYDone!", 10);
+ strncpy(response, "OKAYDone!", 10);
+ fastboot_tx_write_str(response);
- fastboot_tx_write((const char *)response,(num + 1) * (FASTBOOT_RESPONSE_LEN - 1));
return;
} else {
- char response[FASTBOOT_RESPONSE_LEN - 1];
- int status;
- strcpy(response, "OKAY");
- status = get_single_var(cmd,response);
+ strncpy(response, "OKAY", 5);
+ status = get_single_var(cmd, response);
if (status != 0) {
- strncpy(response,"FAIL",4);
+ strncpy(response, "FAIL", 5);
}
fastboot_tx_write_str(response);
return;