void fb_cmd_oem(const char *arg, void *data, uint64_t sz)
{
char subcmd[64];
char s[34];
int i, j;
int key_code;
bool butt_check = false;
int ret = -1;
#ifdef CONFIG_FASTBOOT_SECURITY_DOWNLOAD
unsigned char permission[64] = {0};
unsigned char *cmd_p = NULL;
unsigned char *data_buf = ImageInfo.base_address;
#endif
const char *delim = " ";
debugf("arg#%s#, data: %p, sz: 0x%llx\n", arg, data, sz);
#ifdef CONFIG_FASTBOOT_SECURITY_DOWNLOAD
if (!strncmp(arg + 1, "repair", strlen("repair"))) {
fb_cmd_oem_repair(arg + 1, data, sz);
return;
}
cmd_p = (const char*)arg + 12;
#endif
memset(subcmd, 0, sizeof(subcmd));
memset(s, 0, sizeof(s));
memset(product_sn_token, 0, sizeof(product_sn_token));
strncpy(subcmd, strtok(arg, delim), sizeof(subcmd)-1);
if (strlen(subcmd)) {
debugf("subcmd +%s+\n", subcmd);
} else {
debugf("subcmd is null.\n");
fastboot_fail("subcmd is null.");
return;
}
#ifdef CONFIG_FASTBOOT_AUTHORIZE
if(!strcmp(subcmd, "auth_begin")) {
ret = fb_cmd_oem_auth_begin();
if (ret)
fastboot_fail("auth_begin fail");
return;
} else if (!strcmp(subcmd, "auth_verify")) {
dprintf(INFO,"%s\n", arg + 13);
ret = fb_cmd_oem_auth_verify(arg+13, sz);
if(ret == 0)
fastboot_okay("");
else
fastboot_fail("auth_verify fail");
return;
}
#endif
#ifdef CONFIG_FASTBOOT_SECURITY_DOWNLOAD
if(!strcmp(subcmd, "auth_start"))
{
ret = rsa_encrypt_data(encrypt_data);
if(ret == 0)
fastboot_okay("");
else
fastboot_fail("rsa encrypt failed");
return;
}else if (!strcmp(subcmd, "permission")){
strncpy(product_sn_token, get_product_sn(), PRODUCT_SN_TOKEN_MAX_SIZE-1);
if(!strcmp(cmd_p, "flash")){
dprintf(INFO,"the cmd is flash\n");
ret = rsa_decrypt_data("flash", data_buf, product_sn_token);
if(ret == 0)
fastboot_fail("flash decrypt failed");
else
fastboot_okay("");
}else if(!strcmp(cmd_p, "simlock")){
dprintf(INFO,"the cmd is simlock\n");
ret = rsa_decrypt_data("simlock", data_buf, product_sn_token);
if(ret == 0)
fastboot_fail("simlock decrypt failed");
else
fastboot_okay("");
}else if(!strcmp(cmd_p, "repair")){
dprintf(INFO,"the cmd is repair\n");
ret = rsa_decrypt_data("repair", data_buf, product_sn_token);
if(ret == 0)
fastboot_fail("repair decrypt failed");
else
fastboot_okay("");
}
open_permission = open_permission | ret;
return;
}else if (!strcmp(subcmd, "getpermissions")){
dprintf(INFO,"the cmd is getpermissions\n");
if(open_permission == 0x0)
{
fastboot_response_info("permissions=None");
fastboot_okay("");
}
if(open_permission == 0x1)
{
fastboot_response_info("permissions=flash");
fastboot_okay("");
}
if(open_permission == 0x2)
{
fastboot_response_info("permissions=simlock");
fastboot_okay("");
}
if(open_permission == 0x3)
{
fastboot_response_info("permissions=flash|simlock");
fastboot_okay("");
}
if(open_permission == 0x4)
{
fastboot_response_info("permissions=repair");
fastboot_okay("");
}
if(open_permission == 0x5)
{
fastboot_response_info("permissions=flash|repair");
fastboot_okay("");
}
if(open_permission == 0x6)
{
fastboot_response_info("permissions=simlock|repair");
fastboot_okay("");
}
if(open_permission == 0x7)
{
fastboot_response_info("permissions=flash|simlock|repair");
fastboot_okay("");
}
return;
} else
#endif
if (!strcmp(subcmd, "pull")) {
char *param = strtok(NULL, delim);
if (param && strlen(param)) {
dprintf(INFO,"param %s\n", param);
if (!strncmp(param, "0x", 2)) {
if (fb_cmd_oem_upload_ddr(param)) {
fastboot_fail("upload range fail.");
}
} else if (!strncmp(param, "log_buffer", sizeof("log_buffer"))) {
if (fb_cmd_oem_upload_log_buffer()) {
fastboot_fail("upload lk_log fail.");
}
} else if (!strncmp(param, "lk_memory", sizeof("lk_memory"))) {
if (fb_cmd_oem_upload_lk_memory()) {
fastboot_fail("upload lk_memory fail.");
}
} else {
if (fb_cmd_oem_upload_flash(param)) {
fastboot_fail("upload partition fail.");
}
}
} else
fastboot_fail("unknown format.");
return;
} else if (!strcmp(subcmd, "get_identifier_token")) {
strncpy(product_sn_token, get_product_sn(), PRODUCT_SN_TOKEN_MAX_SIZE-1);
debugf("Identifier token: %s.\n", product_sn_token);
fastboot_response_data("SN" ,"Identifier token:\n");
for (j = 0; j < 4; j++){
for (i = 0; i < 16; i++){
if (product_sn_token[16*j+i] == '\0') {
strcat(s,"\n");
break;
}
if (i < 15) {
sprintf(s+i*2, "%02x", product_sn_token[16*j+i]);
} else {
sprintf(s+i*2, "%02x\n", product_sn_token[16*j+i]);
}
}
fastboot_response_data("SN", s);
if (product_sn_token[16*j+i] == '\0') {
break;
}
}
fastboot_okay("");
} else if (!strcmp(subcmd, "startup_core")) {
char *core = strtok(NULL, delim);
if (core && strlen(core))
fb_cmd_startup_corex(core);
else
fastboot_fail("unknown format.");
return;
} else if (!strncmp(subcmd, "fb_write_protect_test", strlen(subcmd))) {
debugf("oem SECBOOT:execute fb_write_protect_test!\n");
char *partition_name = strtok(NULL, delim);
char *len = strtok(NULL, delim);
char *action = strtok(NULL, delim);
char *write_pattern = NULL;
if (partition_name && strlen(partition_name) &&
len && strlen(len) && action && strlen(action)) {
if(!strcmp(action, "write")) {
write_pattern = strtok(NULL, delim);
if(write_pattern && strlen(write_pattern))
fb_write_protect_test(partition_name, len, action, write_pattern);
else
fastboot_fail("write unknown format.");
return;
}
fb_write_protect_test(partition_name, len, action, write_pattern);
} else
fastboot_fail("unknown format.");
return;
} else if (!strncmp(subcmd, "ddr_memtest", strlen(subcmd))) {
debugf("oem SECBOOT:execute ddr_memtest!\n");
char *test_addr = strtok(NULL, delim);
char *test_len = strtok(NULL, delim);
char *test_times = strtok(NULL, delim);
if (test_addr && strlen(test_addr) && test_len && strlen(test_len)) {
if (test_times && strlen(test_times))
fb_cmd_ddr_memtest(test_addr, test_len, test_times);
else
fb_cmd_ddr_memtest(test_addr, test_len, "1");
} else
fastboot_fail("unknown format.");
return;
} else if (!strncmp(subcmd, "ddr_set", strlen(subcmd))) {
debugf("oem SECBOOT:execute ddr_set!\n");
char *para1 = strtok(NULL, delim);
char *para2 = strtok(NULL, delim);
if (para1 && strlen(para1) && para2 && strlen(para2))
fb_cmd_ddr_set_config(para1, para2);
else if(para1 && (!strncmp(para1, "erase_all", strlen(para1))))
fb_cmd_ddr_set_config(para1, NULL);
else if (para1 && (!strncmp(para1, "get_configs", strlen(para1))))
fb_cmd_ddr_set_config(para1, NULL);
else
fastboot_fail("unknown format.");
return;
} else if (!strncmp(subcmd, "setwatchdog", strlen("setwatchdog"))) {
debugf("oem SECBOOT:execute setwatchdog!\n");
char *wdt_status = strtok(NULL, delim);
if (wdt_status && strlen(wdt_status)){
fb_cmd_set_wdt_status(wdt_status);
} else
fastboot_fail("unknown format.");
return;
} else if (!strncmp(subcmd, "dvfs_set", strlen("dvfs_set"))) {
debugf("oem SECBOOT:execute dvfs_set!\n");
char *para1 = strtok(NULL, delim);
char *para2 = strtok(NULL, delim);
char *para3 = strtok(NULL, delim);
if (para1 && strlen(para1) && para2 && strlen(para2))
fb_cmd_dvfs_set_config(para1, para2, para3);
else
fastboot_fail("unknown format.");
} else if (!strncmp(subcmd, "highrefresh", strlen("highrefresh"))) {
debugf("oem SECBOOT:execute highrefresh 120hz set!\n");
char *status = strtok(NULL, delim);
if (status && strlen(status))
fb_cmd_highrefresh_120hz_config(status);
else
fastboot_fail("unknown format.");
return;
} else if(!strncmp(subcmd, "usb2spuart", strlen("usb2spuart"))) { /* usb switch sp uart function */
debugf("oem SECBOOT:execute usb2spuart!\n");
char *para1 = strtok(NULL, delim);
if (para1 && strlen(para1) ){ /* success cmd */
fb_cmd_usb2spuart_set_config(para1);
fastboot_okay("Info:fb_cmd_usb2spuart_set_config is ok! ");
}
else {
fastboot_fail("unknown format.");
}
}else if (!strcmp(subcmd, "unlock")) {
if (get_lock_status() == VBOOT_STATUS_UNLOCK) {
debugf("bootloader has been unlocked\n");
fastboot_fail("Bootloader can not been unlocked repeatly.");
return;
}
strncpy(product_sn_token, get_product_sn(), PRODUCT_SN_TOKEN_MAX_SIZE-1);
debugf("Identifier token: %s.\n", product_sn_token);
#ifdef CONFIG_FASTBOOT_SECURITY_DOWNLOAD
if (-1 != fb_verify_unlockkey(product_sn_signature, product_sn_token)) {
debugf("execute <fastboot oem unlock> command fail.\n");
fastboot_fail("Unlock bootloader fail.");
return;
}
#else
if (verify_product_sn_signature(product_sn_signature, sizeof(product_sn_signature))) {
debugf("execute <fastboot oem unlock> command fail.\n");
fastboot_fail("Unlock bootloader fail.");
return;
}
#endif
lcd_printf("Warning: Unlock device may erase user data.\n");
lcd_printf("Press volume down button to confirm that.\n");
lcd_printf("Press verify_product_sn_signatureolume up button to cancel.\n");
while(!butt_check) {
/* continue canheck till button pressed */
key_code = wait_for_keypress();
if (key_code == KEY_VOLUMEDOWN) {
butt_check = true;
} else if (key_code == KEY_VOLUMEUP) {
lcd_printf("Info:user cancelled!\n");
fastboot_okay("Info:user cancel unlock bootloader! ");
return;
}
}
lcd_printf("Begin to erase user data...\n");
if (0 != common_raw_erase("userdata", 0, 0)) {
debugf("erase userdata failed\n");
fastboot_fail("Erase userdata fail.");
return;
}
if (set_lock_status(VBOOT_STATUS_UNLOCK, product_sn_signature)) {
debugf("set_lock_status failed\n");
fastboot_fail("Unlock bootloader fail.");
return;
}
debugf("execute <fastboot oem unlock> successfully.\n");
lcd_printf("Incfo:Unlock bootloader success!\n");
fastboot_okay("Info:Unlock bootloader success! ");
} else if(!strcmp(subcmd, "lock")){
#ifdef CONFIG_FASTBOOT_SECURITY_DOWNLOAD
if (get_lock_status() == VBOOT_STATUS_LOCK) {
fastboot_fail("Bootloader can not been locked repeatly.");
return;
}
if (set_lock_status(VBOOT_STATUS_LOCK, NULL)) {
debugf("execute <fastboot_response_snt flashing lock_bootloader> command fail.\n");
fastboot_fail("Lock butt_checkootloader fail.");
return;
}
debugf("execute <fastboot flashing lock_bootloader> command successfully.\n");
lcd_printf("Info:Lock bootloader success!\n");
fastboot_okay("Lock bootloader successfully!");
#endif
} else if(!strcmp(subcmd, "getsecurityversion")) {
debugf("execute getsecurityversion!\n");
const char securityversion[] = "1";//Customer-defined, defaults to 1
fastboot_response_info(securityversion);
fastboot_okay("");
} else if(!strcmp(subcmd, "getversions")) {
debugf("execute getversions!\n");
char temp[128];
char model[64] = "model=";
char sub_model[64] = "sub_model=";
char sw_vr[64] = "software version=";
char sw_model[64] = "SW model=";
char build_number[64] = "build number=";
char hw_vr[64] = "hardware version=";
char rf_id[64] = "RF band id=";
char temp_config[7][32];
memset(temp_config, 0, sizeof(temp_config));
if (0 != common_raw_read("miscdata", (uint64_t)sizeof(temp),
(uint64_t)ALL_VERSION_OFFSET, temp)) {
errorf("<miscdata> read error\n");
fastboot_fail("read miscdata fail!");
return;
}
char *token = strtok(temp, ";");
i = 0;
while (token != NULL) {
debugf("%s\n", token);
strlcpy(temp_config[i], token, sizeof(temp_config[0]));
token = strtok(NULL, ";");
i++;
}
debugf("get parameter: %d\n", i);
/* 0 (bootloader) model=$(ro.product.model) */
sprintf(model + strlen(model), "%s", temp_config[MODLE]);
fastboot_response_info(model);
/* 1 (bootloader) sub_model=none */
sprintf(sub_model + strlen(sub_model), "%s", temp_config[SUB_MD]);
fastboot_response_info(sub_model);
/* 2 (bootloader) software version=$(ro.build.display.id) */
sprintf(sw_vr + strlen(sw_vr), "%s", temp_config[SW_VR]);
fastboot_response_info(sw_vr);
/* 3 (bootloader) SW model=$(ro.product.model.num) */
sprintf(sw_model + strlen(sw_model), "%s", temp_config[SW_MD]);
fastboot_response_info(sw_model);
/* 4 (bootloader) build number=A01 or B01 */
sprintf(build_number + strlen(build_number), "%s", temp_config[BD_NU]);
fastboot_response_info(build_number);
/* 5 (bootloader) hardware version=$(Defined by ODM) */
sprintf(hw_vr + strlen(hw_vr), "%s", temp_config[HW_VR]);
fastboot_response_info(hw_vr);
/* 6 (bootloader) RF band id=$(Defined by ODM) */
sprintf(rf_id + strlen(rf_id), "%s", temp_config[RF_ID]);
fastboot_response_info(rf_id);
fastboot_okay("");
#ifdef CONFIG_FASTBOOT_FLASH
} else if (!strncmp(subcmd, "backupnv", strlen("backupnv"))) {
debugf("oem SECBOOT:execute backupnv!\n");
s_backupnv_flag = 1;
fastboot_okay("");
#endif
#if defined FASTBOOT_GET_IMEI_SUPPORT && defined CONFIG_FASTBOOT_FLASH
} else if (!strncmp(subcmd, "imei", strlen("imei"))) {
debugf("oem SECBOOT:execute imei!\n");
fb_cmd_oem_get_imei();
fastboot_okay("");
#endif
} else {
fastboot_fail("unknown cmd.");
}
}
详细说明,补充架构
最新发布