sys_commands.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #include <app.h>
  32. #include <debug.h>
  33. #include <arch/arm.h>
  34. #include <arch/arm/mmu.h>
  35. #include <dev/udc.h>
  36. #include <dev/mrdump.h>
  37. #include <string.h>
  38. #include <stdlib.h>
  39. #include <kernel/thread.h>
  40. #include <kernel/timer.h>
  41. #include <arch/ops.h>
  42. #include <target.h>
  43. #include <platform.h>
  44. #include <platform/mt_reg_base.h>
  45. #include <platform/boot_mode.h>
  46. #ifdef CFG_MTK_WDT_COMMON
  47. #include <mtk_wdt.h>
  48. #else
  49. #include <platform/mtk_wdt.h> // for mtk_wdt_disable()
  50. #endif
  51. #include <platform/mt_rtc.h>
  52. #include <bootimg.h>
  53. #ifdef MTK_GPT_SCHEME_SUPPORT
  54. #include <platform/partition.h>
  55. #else
  56. #include <mt_partition.h>
  57. #endif
  58. #include <platform/mt_gpt.h>
  59. #include <platform/disp_drv_platform.h>
  60. #include <platform/mt_disp_drv.h>
  61. #include "fastboot.h"
  62. #include "sys_commands.h"
  63. #include <mt_scp_if.h>
  64. #include <log_store_lk.h>
  65. #ifdef MTK_PARTITION_COMMON
  66. #include <env.h>
  67. #else
  68. #include <platform/env.h>
  69. #endif
  70. #include <boot_info.h>
  71. #include "aee/aee.h"
  72. #include <recovery.h>
  73. /*** FIXME!!! #include <disp_drv.h> // for DISP_IsLcmFound(), DISP_GetVRamSize() ***/
  74. BOOL DISP_IsLcmFound(void);
  75. UINT32 DISP_GetVRamSize(void);
  76. extern struct fastboot_var *varlist;
  77. extern struct fastboot_cmd *cmdlist;
  78. extern int boot_linux_from_storage(void);
  79. extern const char *mt_disp_get_lcm_id(void);
  80. extern void boot_linux(void *kernel, unsigned *tags, char *cmdline,
  81. unsigned machtype, void *ramdisk, unsigned ramdisk_sz);
  82. extern unsigned int memory_size();
  83. extern void custom_port_in_kernel(BOOTMODE boot_mode, char *command);
  84. #ifdef MTK_OFF_MODE_CHARGE_SUPPORT
  85. extern void set_off_mode_charge_status(int enable);
  86. extern bool get_off_mode_charge_status(void);
  87. #endif
  88. #ifdef MTK_AB_OTA_UPDATER
  89. #include "bootctrl.h"
  90. extern int set_active_slot(const char *suffix);
  91. #endif
  92. #define MODULE_NAME "FASTBOOT"
  93. #define MAX_RSP_SIZE 64
  94. extern BOOTMODE g_boot_mode;
  95. extern timer_t wdt_timer;
  96. extern unsigned int _heap_end;
  97. int has_set_p2u = 0; //0-unset; 1-on; 2-off
  98. #ifdef MTK_TC7_COMMON_DEVICE_INTERFACE
  99. static unsigned char *head_of_adb_cmdline;
  100. static unsigned char adb_cmdline_appended;
  101. #endif
  102. #ifdef MTK_MRDUMP_SUPPORT
  103. int after_usb_dump = 0;
  104. #endif
  105. // FIXME!!! The following function declaration should not exist, and appropriate
  106. // header files instead should be included.
  107. extern bool cmdline_append(const char *append_string);
  108. extern bool cmdline_overwrite(const char *overwrite_string);
  109. extern char *cmdline_get(void);
  110. extern void set_uart_log_flag(bool enable);
  111. void cmd_overwirte_cmdline(const char *arg, void *data, unsigned sz)
  112. {
  113. const char *new_kernel_cmd_line = arg;
  114. if (cmdline_overwrite(new_kernel_cmd_line) == false) {
  115. dprintf(CRITICAL, "[FASTBOOT] Input cmdline length is too long!");
  116. fastboot_fail("cmdline length is too long");
  117. }
  118. dprintf(INFO, "[FASTBOOT] New command line is %s\n", (char *)cmdline_get());
  119. fastboot_okay("");
  120. }
  121. void cmd_oem_append_cmdline(const char *arg, void *data, unsigned sz)
  122. {
  123. dprintf(INFO, "APPEND KERNEL CMDLINE\n");
  124. fastboot_info("APPEND KERNEL CMDLINE\n");
  125. if (cmdline_append(arg) == false) {
  126. dprintf(CRITICAL, "[FASTBOOT] Input cmdline length is too long!");
  127. fastboot_fail("cmdline length is too long");
  128. return;
  129. }
  130. dprintf(INFO, "[FASTBOOT] New command line:%s\n", (char *)cmdline_get());
  131. fastboot_okay("");
  132. return;
  133. }
  134. #ifdef MTK_MRDUMP_SUPPORT
  135. void cmd_oem_mrdump(const char *arg, void *data, unsigned sz)
  136. {
  137. after_usb_dump = 1;
  138. if (0 == strncmp(arg, " fullreset", 10)) {
  139. dprintf(INFO, "[FASTBOOT] mrdump reset!\n");
  140. fastboot_okay("");
  141. mrdump_reboot();
  142. }
  143. dprintf(INFO, "[FASTBOOT] MRDUMP USB Dump Go!\n");
  144. fastboot_okay("");
  145. mrdump_run2();
  146. #ifdef SUPPORT_U3
  147. fastboot_reset_usb();
  148. #endif
  149. return;
  150. }
  151. void cmd_oem_mrdump_outdev(const char *arg, void *data, unsigned int sz)
  152. {
  153. const char *ptr = arg + 1;
  154. if (mrdump_set_output_device(ptr) != MRDUMP_DEV_UNKNOWN) {
  155. fastboot_okay("");
  156. }
  157. else {
  158. fastboot_fail("MRDUMP output device setting failed.");
  159. }
  160. }
  161. void cmd_oem_mrdump_fallocate(const char *arg, void *data, unsigned int sz)
  162. {
  163. char response[MAX_RSP_SIZE];
  164. const char *ptr = arg + 1;
  165. bool ret = 1;
  166. int size_m = atoi(ptr);
  167. if (size_m < 0)
  168. size_m = 0;
  169. switch (size_m) {
  170. case 0:
  171. ret = mrdump_set_env("mrdump_allocate_size", "0");
  172. fastboot_info("mrdump_allocate_size -> 0");
  173. break;
  174. case 1:
  175. ret = mrdump_set_env("mrdump_allocate_size", "halfmem");
  176. fastboot_info("mrdump_allocate_size -> halfmem");
  177. break;
  178. case 2:
  179. ret = mrdump_set_env("mrdump_allocate_size", "fullmem");
  180. fastboot_info("mrdump_allocate_size -> fullmem");
  181. break;
  182. default:
  183. if (size_m >= 256)
  184. ret = mrdump_set_env("mrdump_allocate_size", (char *)ptr);
  185. int n = snprintf(response, MAX_RSP_SIZE,
  186. "mrdump_allocate_size -> :%s", ptr);
  187. if (n < 0) {
  188. strncpy(response, "unknown error", sizeof(response) - 1);
  189. response[sizeof(response) - 1] = '\0';
  190. }
  191. fastboot_info(response);
  192. break;
  193. }
  194. if (ret == 0)
  195. fastboot_okay("");
  196. else
  197. fastboot_fail("mrdump_allocate_size not set.");
  198. }
  199. void cmd_oem_mrdump_chkimg(const char *arg, void *data, unsigned int sz)
  200. {
  201. int status = mrdump_check_enable();
  202. switch (status) {
  203. case MRDUMP_SUCCESS_ENABLE:
  204. fastboot_info("mrdump successfully enabled");
  205. break;
  206. case MRDUMP_ALWAYS_ENABLE:
  207. fastboot_info("mrdump always enabled");
  208. break;
  209. case MRDUMP_ALWAYS_DISABLE:
  210. fastboot_info("mrdump always disabled");
  211. break;
  212. case MRDUMP_NO_SOCID_FROM_CHIP:
  213. fastboot_info("unable to get socid from chip");
  214. break;
  215. case MRDUMP_SEC_IMG_AUTH_INIT_ERROR:
  216. fastboot_info("mrdump dconfig image auth init failed");
  217. break;
  218. case MRDUMP_DCONFIG_MALLOC_ERROR:
  219. fastboot_info("mrdump dconfig not enough memory");
  220. break;
  221. case MRDUMP_MBOOT_LOAD_PART_ERROR:
  222. fastboot_info("mrdump dconfig partition_read failed");
  223. break;
  224. case MRDUMP_DCONFIG_IMG_VERIFY_ERROR:
  225. fastboot_info("mrdump dconfig image verify failed");
  226. break;
  227. case MRDUMP_DCONFIG_SOCID_CERT_ERROR:
  228. fastboot_info("unable to get socid from certed image");
  229. break;
  230. case MRDUMP_DCNFIG_SOCID_MISMATCH:
  231. fastboot_info("socid mismatched");
  232. break;
  233. case MRDUMP_NOT_VALID_IMG:
  234. fastboot_info("not a valid mrdump enabled image");
  235. break;
  236. default:
  237. fastboot_info("unknown error");
  238. break;
  239. }
  240. fastboot_okay("");
  241. }
  242. #endif
  243. #ifdef MTK_TC7_COMMON_DEVICE_INTERFACE
  244. void cmd_oem_ADB_Auto_Enable(const char *arg, void *data, unsigned sz)
  245. {
  246. char *str_enable = " enable";
  247. char *str_disable = " disable";
  248. char *str_help = " help";
  249. if (adb_cmdline_appended) {
  250. if (memcmp(arg, str_enable, strlen(str_enable)) == 0) {
  251. *head_of_adb_cmdline = '1';
  252. dprintf(INFO, "[FASTBOOT] New command line:%s\n", cmdline_get());
  253. fastboot_okay("");
  254. return;
  255. } else if (memcmp(arg, str_disable, strlen(str_disable)) == 0) {
  256. *head_of_adb_cmdline = '0';
  257. dprintf(INFO, "[FASTBOOT] New command line:%s\n", cmdline_get());
  258. fastboot_okay("");
  259. return;
  260. } else if (memcmp(arg, str_help, strlen(str_help)) == 0) {
  261. fastboot_info("fastboot oem auto-ADB enable Enable Auto ADB");
  262. fastboot_info("fastboot oem auto-ADB disable Disable Auto ADB");
  263. fastboot_okay("");
  264. return;
  265. } else
  266. fastboot_fail("Please enter correct cmd");
  267. } else {
  268. if (memcmp(arg, str_enable, strlen(str_enable)) == 0) {
  269. cmd_oem_append_cmdline(" AdbAutoEnable=1", data, sz);
  270. head_of_adb_cmdline = strchr(cmdline_get(), '\0') - 0x1;
  271. dprintf(INFO, "Head of auto-adb cmd %p,%s\n", head_of_adb_cmdline,
  272. head_of_adb_cmdline);
  273. adb_cmdline_appended = 1;
  274. return;
  275. } else if (memcmp(arg, str_disable, strlen(str_disable)) == 0) {
  276. cmd_oem_append_cmdline(" AdbAutoEnable=0", data, sz);
  277. head_of_adb_cmdline = strchr(cmdline_get(), '\0') - 0x1;
  278. dprintf(INFO, "Head of auto-adb cmd %p,%s\n", head_of_adb_cmdline,
  279. head_of_adb_cmdline);
  280. adb_cmdline_appended = 1;
  281. return;
  282. } else if (memcmp(arg, str_help, strlen(str_help)) == 0) {
  283. fastboot_info("fastboot oem auto-ADB enable: enable Auto ADB");
  284. fastboot_info("fastboot oem auto-ADB disable: disable Auto ADB");
  285. fastboot_okay("");
  286. return;
  287. } else
  288. fastboot_fail("Please enter correct cmd");
  289. }
  290. return;
  291. }
  292. #endif
  293. void set_p2u(int mode)
  294. {
  295. if (mode == 1) {
  296. if (cmdline_append("printk.disable_uart=0") == false) {
  297. dprintf(CRITICAL, "command line is too long, will not set printk_on\n");
  298. fastboot_info("command line is too long, will not set printk_on");
  299. } else
  300. fastboot_info("printk to uart is on!");
  301. } else if (mode == 2) {
  302. if (cmdline_append("printk.disable_uart=1") == false) {
  303. dprintf(CRITICAL, "command line is too long, will not set printk_off\n");
  304. fastboot_info("command line is too long, will not set printk_off");
  305. } else
  306. fastboot_info("printk to uart is off!");
  307. }
  308. }
  309. void cmd_continue(const char *arg, void *data, unsigned sz)
  310. {
  311. g_boot_mode = NORMAL_BOOT;
  312. if (has_set_p2u) {
  313. set_p2u(has_set_p2u);
  314. fastboot_info("phone will continue boot up after 5s...");
  315. fastboot_okay("");
  316. mdelay(5000);
  317. } else
  318. fastboot_okay("");
  319. udc_stop();
  320. //mtk_wdt_init(); //re-open wdt
  321. timer_cancel(&wdt_timer);
  322. mtk_wdt_restart();
  323. /*Will not return*/
  324. boot_linux_from_storage();
  325. }
  326. #ifdef FASTBOOT_DUMP_LOG
  327. #define LK_LOG_DUMP_SIZE (21)
  328. void cmd_oem_dump_log(const char *arg, void *data, unsigned int sz)
  329. {
  330. u32 add, size, i;
  331. char buf[LK_LOG_DUMP_SIZE];
  332. memset(buf, 0, LK_LOG_DUMP_SIZE);
  333. add = current_buf_addr_get();
  334. size = current_buf_pl_lk_log_size_get();
  335. log_store_enable = false;
  336. for (i = 0; i < size / (LK_LOG_DUMP_SIZE-1); i++) {
  337. memcpy(buf, (void *)(add + i*(LK_LOG_DUMP_SIZE-1)), (LK_LOG_DUMP_SIZE-1));
  338. fastboot_info(buf);
  339. }
  340. fastboot_okay("");
  341. log_store_enable = true;
  342. }
  343. #endif
  344. void cmd_printk_ratelimit(const char *arg, void *data, unsigned sz)
  345. {
  346. if (!strncmp(arg, " on", strlen(" on"))){
  347. dprintf(INFO, "SET PRINTK RATELIMIT ON\n");
  348. fastboot_info("SET PRINTK RATELIMIT ON\n");
  349. set_printk_ratelimit(false);
  350. dprintf(INFO, "SET PRINTK RATELIMIT SUCCESS\n");
  351. fastboot_okay("SET PRINTK RATELIMIT SUCCESS\n");
  352. } else if (!strncmp(arg, " off", strlen(" off"))) {
  353. dprintf(INFO, "SET PRINTK RATELIMIT OFF\n");
  354. fastboot_info("SET PRINTK RATELIMIT OFF\n");
  355. set_printk_ratelimit(true);
  356. dprintf(INFO, "SET PRINTK RATELIMIT OFF SUCCESS\n");
  357. fastboot_okay("SET PRINTK RATELIMIT OFF SUCCESS\n");
  358. } else {
  359. dprintf(INFO, "UNKNOWN ARGUMENT\n");
  360. fastboot_info("UNKNOWN ARGUMENT\n");
  361. }
  362. }
  363. void cmd_oem_p2u(const char *arg, void *data, unsigned sz)
  364. {
  365. if (!strncmp(arg, " on", strlen(" on"))){
  366. has_set_p2u = 1;
  367. #ifdef LOG_STORE_SUPPORT
  368. g_boot_arg->log_dynamic_switch = 1;
  369. set_uart_log_flag(true);
  370. #endif
  371. } else if (!strncmp(arg, " off", strlen(" off"))) {
  372. has_set_p2u = 2;
  373. #ifdef LOG_STORE_SUPPORT
  374. g_boot_arg->log_dynamic_switch = 0;
  375. set_uart_log_flag(false);
  376. #endif
  377. } else {
  378. has_set_p2u = 0;
  379. fastboot_info("unknown argument");
  380. }
  381. fastboot_okay("");
  382. }
  383. void cmd_reboot_recovery(const char *arg, void *data, unsigned sz)
  384. {
  385. extern void Set_RTC_Recovery_Mode(bool flag)__attribute__((weak));
  386. if (Set_RTC_Recovery_Mode) {
  387. Set_RTC_Recovery_Mode(1);
  388. fastboot_okay("");
  389. mtk_arch_reset(1); //bypass pwr key when reboot
  390. } else
  391. fastboot_fail("Not support this function (need RTC porting)");
  392. }
  393. void cmd_reboot_fastboot(const char *arg, void *data, unsigned sz)
  394. {
  395. if (recovery_set_fastboot_cmd() == FALSE) {
  396. fastboot_fail("recovery_set_fastboot_cmd failed");
  397. } else {
  398. fastboot_okay("");
  399. mtk_arch_reset(1); //bypass pwr key when reboot
  400. }
  401. }
  402. #ifdef MTK_OFF_MODE_CHARGE_SUPPORT
  403. void set_off_mode_charge(int mode)
  404. {
  405. struct fastboot_var *var;
  406. for (var = varlist; var; var = var->next) {
  407. if (!strcmp(var->name, "off-mode-charge"))
  408. var->value = (mode == 1) ? "1" : "0";
  409. }
  410. set_off_mode_charge_status(mode);
  411. }
  412. void cmd_oem_off_mode_charge(const char *arg, void *data, unsigned sz)
  413. {
  414. if (!strncmp(arg, " 1", strlen(" 1"))) {
  415. //CHARGE MODE
  416. set_off_mode_charge(1);
  417. } else if (!strncmp(arg, " 0", strlen(" 0"))) {
  418. //NORMAL MODE
  419. set_off_mode_charge(0);
  420. } else
  421. fastboot_info("unknown argument");
  422. fastboot_okay("");
  423. }
  424. #endif
  425. #ifdef MTK_JTAG_SWITCH_SUPPORT
  426. extern unsigned int set_ap_jtag(unsigned int);
  427. extern unsigned int get_ap_jtag(void);
  428. void cmd_oem_ap_jtag(const char *arg, void *data, unsigned sz)
  429. {
  430. char response[MAX_RSP_SIZE];
  431. if (!strncmp(arg, " 1", strlen(" 1"))) {
  432. //turn ap jtag on
  433. fastboot_info("Enable AP JTAG");
  434. set_ap_jtag(1);
  435. } else if (!strncmp(arg, " 0", strlen(" 0"))) {
  436. //turn ap jtag off
  437. fastboot_info("Disable AP JTAG");
  438. set_ap_jtag(0);
  439. } else {
  440. int n = snprintf(response, MAX_RSP_SIZE, "\tCurrent AP JTAG setting:%s",
  441. get_ap_jtag() ? "Enable" : "Disable");
  442. if (n < 0) {
  443. strncpy(response, "unknown error", sizeof(response) - 1);
  444. response[sizeof(response) - 1] = '\0';
  445. }
  446. fastboot_info(response);
  447. }
  448. fastboot_okay("");
  449. }
  450. #endif
  451. #ifdef MTK_TINYSYS_SCP_SUPPORT
  452. /******************************************************************************
  453. ******************************************************************************/
  454. void cmd_oem_scp_status(const char *arg, void *data, unsigned sz)
  455. {
  456. char response[MAX_RSP_SIZE];
  457. if (!strncmp(arg, " 1", strlen(" 1"))) {
  458. //turn scp on
  459. fastboot_info("Turn on SCP");
  460. fastboot_info("Plz reboot system to make it applied.");
  461. set_scp_status(1);
  462. } else if (!strncmp(arg, " 0", strlen(" 0"))) {
  463. //turn scp off
  464. fastboot_info("Turn off SCP");
  465. fastboot_info("Plz reboot system to make it applied.");
  466. set_scp_status(0);
  467. } else {
  468. int n = snprintf(response, MAX_RSP_SIZE, "\tCurrent SCP setting:%s",
  469. get_scp_status() ? "Enable" : "Disable");
  470. if (n < 0) {
  471. strncpy(response, "unknown error", sizeof(response) - 1);
  472. response[sizeof(response) - 1] = '\0';
  473. }
  474. fastboot_info(response);
  475. }
  476. fastboot_okay("");
  477. }
  478. /******************************************************************************
  479. ******************************************************************************/
  480. void cmd_oem_scp_log_thru_ap_uart(const char *arg, void *data, unsigned sz)
  481. {
  482. char response[MAX_RSP_SIZE];
  483. if (!strncmp(arg, " 1", strlen(" 1"))) {
  484. set_scp_log_thru_ap_uart(1);
  485. fastboot_info("SCP log thru AP UART: on");
  486. fastboot_info("Please reboot to apply the change.");
  487. } else if (!strncmp(arg, " 0", strlen(" 0"))) {
  488. set_scp_log_thru_ap_uart(0);
  489. fastboot_info("SCP log thru AP UART: off");
  490. fastboot_info("Please reboot to apply the change.");
  491. } else {
  492. int n = snprintf(response, MAX_RSP_SIZE, "Get SCP log thru AP UART: %s",
  493. get_scp_log_thru_ap_uart() ? "on" : "off");
  494. if (n < 0) {
  495. strncpy(response, "unknown error", sizeof(response) - 1);
  496. response[sizeof(response) - 1] ='\0';
  497. }
  498. fastboot_info(response);
  499. }
  500. fastboot_okay("");
  501. }
  502. #endif // MTK_TINYSYS_SCP_SUPPORT
  503. #ifdef MTK_USB2JTAG_SUPPORT
  504. extern unsigned int set_usb2jtag(unsigned int);
  505. extern unsigned int get_usb2jtag(void);
  506. void cmd_oem_usb2jtag(const char *arg, void *data, unsigned sz)
  507. {
  508. char response[MAX_RSP_SIZE];
  509. if (!strncmp(arg, " 1", strlen(" 1"))) {
  510. //turn usb2jtag on
  511. fastboot_info("Enable USB2JTAG");
  512. set_usb2jtag(1);
  513. } else if (!strncmp(arg, " 0", strlen(" 0"))) {
  514. //turn usb2jtag off
  515. fastboot_info("Disable USB2JTAG");
  516. set_usb2jtag(0);
  517. } else {
  518. int n = snprintf(response, MAX_RSP_SIZE, "\tCurrent USB2JTAG setting:%s",
  519. get_usb2jtag() ? "Enable" : "Disable");
  520. if (n < 0) {
  521. strncpy(response, "unknown error", sizeof(response) - 1);
  522. response[sizeof(response) - 1] = '\0';
  523. }
  524. fastboot_info(response);
  525. }
  526. fastboot_info("rebooting device for usb2jtag support..\n");
  527. fastboot_okay("");
  528. mtk_arch_reset(1);
  529. }
  530. #endif
  531. void cmd_getvar(const char *arg, void *data, unsigned sz)
  532. {
  533. struct fastboot_var *var;
  534. char response[MAX_RSP_SIZE];
  535. if (!strcmp(arg, "all")) {
  536. for (var = varlist; var; var = var->next) {
  537. int n = snprintf(response, MAX_RSP_SIZE, "%s: %s", var->name, var->value);
  538. if (n < 0) {
  539. strncpy(response, "unknown error", sizeof(response) - 1);
  540. response[sizeof(response) - 1] = '\0';
  541. }
  542. fastboot_info(response);
  543. }
  544. fastboot_okay("Done!!");
  545. return;
  546. }
  547. for (var = varlist; var; var = var->next) {
  548. if (!strcmp(var->name, arg)) {
  549. fastboot_okay(var->value);
  550. return;
  551. }
  552. }
  553. fastboot_fail("GetVar Variable Not found");
  554. }
  555. void cmd_reboot(const char *arg, void *data, unsigned sz)
  556. {
  557. dprintf(INFO, "rebooting the device\n");
  558. fastboot_okay("");
  559. #ifdef MTK_MRDUMP_SUPPORT
  560. if (after_usb_dump) {
  561. dprintf(INFO, "[FASTBOOT] mrdump reset!\n");
  562. mrdump_reboot();
  563. }
  564. #endif
  565. // Dis-connect USB before hardware reset for avoiding PC HOST was not synced.
  566. udc_stop();
  567. msleep(800);
  568. #ifdef MTK_PMIC_FULL_RESET
  569. mtk_arch_full_reset();
  570. #else
  571. mtk_arch_reset(1); //bypass pwr key when reboot
  572. #endif
  573. }
  574. void cmd_reboot_bootloader(const char *arg, void *data, unsigned sz)
  575. {
  576. dprintf(INFO, "rebooting the device to bootloader\n");
  577. fastboot_okay("");
  578. // Dis-connect USB before hardware reset for avoiding PC HOST was not synced.
  579. udc_stop();
  580. msleep(800);
  581. Set_Clr_RTC_PDN1_bit13(true); //Set RTC fastboot bit
  582. mtk_arch_reset(1); //bypass pwr key when reboot
  583. }
  584. extern unsigned int g_kmem_off;
  585. extern unsigned int g_rmem_off;
  586. extern unsigned int g_bimg_sz;
  587. #define ROUND_TO_PAGE(x,y) (((x) + (y)) & (~(y)))
  588. void cmd_boot(const char *arg, void *data, unsigned sz)
  589. {
  590. unsigned kernel_actual;
  591. unsigned ramdisk_actual;
  592. struct bootimg_hdr *boot_hdr;
  593. char *ptr = ((char *) data);
  594. unsigned page_sz = 0;
  595. unsigned page_mask = 0;
  596. #define CMDLINE_TMP_CONCAT_SIZE 100 //only for string concat, 100 bytes is enough
  597. char cmdline_tmpbuf[CMDLINE_TMP_CONCAT_SIZE];
  598. boot_hdr = (struct bootimg_hdr *)malloc(sizeof(struct bootimg_hdr));
  599. if (!boot_hdr) {
  600. dprintf(CRITICAL, "cmd_boot,boot_hdr = NULL\n");
  601. return;
  602. }
  603. memcpy(boot_hdr, data, sizeof(struct bootimg_hdr));
  604. load_bootinfo_bootimg(data);
  605. dprintf(INFO,
  606. "\n============================================================\n");
  607. boot_hdr->magic[7] = '\0';
  608. dprintf(INFO, "[%s] Android Boot IMG Hdr - Magic : %s\n", MODULE_NAME,
  609. boot_hdr->magic);
  610. dprintf(INFO, "[%s] Android Boot IMG Hdr - Kernel Size : 0x%x\n", MODULE_NAME,
  611. boot_hdr->kernel_sz);
  612. dprintf(INFO, "[%s] Android Boot IMG Hdr - Kernel addr : 0x%x\n", MODULE_NAME,
  613. boot_hdr->kernel_addr);
  614. dprintf(INFO, "[%s] Android Boot IMG Hdr - Rootfs Size : 0x%x\n", MODULE_NAME,
  615. boot_hdr->ramdisk_sz);
  616. dprintf(INFO, "[%s] Android Boot IMG Hdr - Page Size : 0x%x\n", MODULE_NAME,
  617. boot_hdr->page_sz);
  618. dprintf(INFO, "============================================================\n");
  619. /* ensure commandline is terminated */
  620. boot_hdr->cmdline[BOOTIMG_ARGS_SZ - 1] = 0;
  621. if (boot_hdr->page_sz) {
  622. page_sz = boot_hdr->page_sz;
  623. page_mask = page_sz - 1;
  624. //page_mask = 2*1024 ; /*FIXME*/
  625. } else {
  626. dprintf(CRITICAL,
  627. "[FASTBOOT] Please specify the storage page-size in the boot header!\n");
  628. fastboot_fail("Please specify the storage page-size in the boot header!\n");
  629. goto _cmd_boot_exit;
  630. }
  631. kernel_actual = ROUND_TO_PAGE(boot_hdr->kernel_sz, page_mask);
  632. ramdisk_actual = ROUND_TO_PAGE(boot_hdr->ramdisk_sz, page_mask);
  633. /* sz should have atleast raw boot image */
  634. if (page_sz + kernel_actual + ramdisk_actual > sz) {
  635. fastboot_fail("incomplete bootimage");
  636. goto _cmd_boot_exit;
  637. }
  638. if ((boot_hdr->kernel_addr <= ROUND_TO_PAGE((boot_hdr->ramdisk_addr +
  639. boot_hdr->ramdisk_sz), page_mask)) &&
  640. (ROUND_TO_PAGE((boot_hdr->kernel_addr + boot_hdr->kernel_sz),
  641. page_mask) >= boot_hdr->ramdisk_addr)) {
  642. fastboot_fail("invalid kernel & ramdisk address: images overlap");
  643. goto _cmd_boot_exit;
  644. }
  645. if ((boot_hdr->kernel_addr < DRAM_PHY_ADDR) ||
  646. (ROUND_TO_PAGE((boot_hdr->kernel_addr + boot_hdr->kernel_sz),
  647. page_mask) > (DRAM_PHY_ADDR + (u64)memory_size()))) {
  648. fastboot_fail("invalid kernel address: not lie in memory");
  649. goto _cmd_boot_exit;
  650. }
  651. if ((boot_hdr->kernel_addr <= _heap_end) &&
  652. (ROUND_TO_PAGE((boot_hdr->kernel_addr + boot_hdr->kernel_sz),
  653. page_mask) >= MEMBASE)) {
  654. fastboot_fail("invalid kernel address: overlap with lk");
  655. goto _cmd_boot_exit;
  656. }
  657. if ((boot_hdr->kernel_addr <= ROUND_TO_PAGE((SCRATCH_ADDR + boot_hdr->kernel_sz
  658. + boot_hdr->ramdisk_sz), page_mask)) &&
  659. (ROUND_TO_PAGE((boot_hdr->kernel_addr + boot_hdr->kernel_sz),
  660. page_mask) >= SCRATCH_ADDR)) {
  661. fastboot_fail("invalid kernel address: overlap with the download image");
  662. goto _cmd_boot_exit;
  663. }
  664. if ((boot_hdr->ramdisk_addr < DRAM_PHY_ADDR) ||
  665. (ROUND_TO_PAGE((boot_hdr->ramdisk_addr + boot_hdr->ramdisk_sz),
  666. page_mask) > (DRAM_PHY_ADDR + (u64)memory_size()))) {
  667. fastboot_fail("invalid ramdisk address: not lie in memory");
  668. goto _cmd_boot_exit;
  669. }
  670. if ((boot_hdr->ramdisk_addr <= _heap_end) &&
  671. (ROUND_TO_PAGE((boot_hdr->ramdisk_addr + boot_hdr->ramdisk_sz),
  672. page_mask) >= MEMBASE)) {
  673. fastboot_fail("invalid ramdisk address: overlap with lk");
  674. goto _cmd_boot_exit;
  675. }
  676. if ((boot_hdr->ramdisk_addr <= ROUND_TO_PAGE((SCRATCH_ADDR + boot_hdr->kernel_sz
  677. + boot_hdr->ramdisk_sz), page_mask)) &&
  678. (ROUND_TO_PAGE((boot_hdr->ramdisk_addr + boot_hdr->ramdisk_sz),
  679. page_mask) >= SCRATCH_ADDR)) {
  680. fastboot_fail("invalid ramdisk address: overlap with the download image");
  681. goto _cmd_boot_exit;
  682. }
  683. set_bootimg_loaded((uint32_t)ptr);
  684. /* do nothing, since boot image has been loaded in scratch address */
  685. //memmove((void *)SCRATCH_ADDR, ptr, boot_hdr->kernel_sz);
  686. #ifdef MTK_3LEVEL_PAGETABLE
  687. /* rootfs addr */
  688. arch_mmu_map((uint64_t)boot_hdr->ramdisk_addr, (uint32_t)boot_hdr->ramdisk_addr,
  689. MMU_MEMORY_TYPE_NORMAL_WRITE_BACK | MMU_MEMORY_AP_P_RW_U_NA,
  690. ROUNDUP(boot_hdr->ramdisk_sz, PAGE_SIZE));
  691. #endif
  692. memmove((void *) boot_hdr->ramdisk_addr,
  693. (ptr + boot_hdr->page_sz + kernel_actual), boot_hdr->ramdisk_sz);
  694. #ifndef MACH_FPGA
  695. int n;
  696. cmdline_append((char *)boot_hdr->cmdline);
  697. n = snprintf(cmdline_tmpbuf, CMDLINE_TMP_CONCAT_SIZE, "lcm=%1d-%s",
  698. DISP_IsLcmFound(), mt_disp_get_lcm_id());
  699. if (n < 0)
  700. dprintf(INFO, "cmdline snprintf error\n");
  701. else
  702. cmdline_append(cmdline_tmpbuf);
  703. n = snprintf(cmdline_tmpbuf, CMDLINE_TMP_CONCAT_SIZE, "fps=%1d",
  704. mt_disp_get_lcd_time());
  705. if (n < 0)
  706. dprintf(INFO, "cmdline snprintf error\n");
  707. else
  708. cmdline_append(cmdline_tmpbuf);
  709. n = snprintf(cmdline_tmpbuf, CMDLINE_TMP_CONCAT_SIZE, "vram=%1d",
  710. DISP_GetVRamSize());
  711. if (n < 0)
  712. dprintf(INFO, "cmdline snprintf error\n");
  713. else
  714. cmdline_append(cmdline_tmpbuf);
  715. #endif
  716. #ifdef SELINUX_STATUS
  717. #if SELINUX_STATUS == 1
  718. cmdline_append("androidboot.selinux=disabled");
  719. #elif SELINUX_STATUS == 2
  720. cmdline_append("androidboot.selinux=permissive");
  721. #endif
  722. #endif
  723. fastboot_okay("");
  724. udc_stop();
  725. //mtk_wdt_init(); //re-open wdt
  726. timer_cancel(&wdt_timer);
  727. mtk_wdt_restart();
  728. g_boot_mode = NORMAL_BOOT;
  729. custom_port_in_kernel(g_boot_mode, cmdline_get());
  730. dprintf(CRITICAL, "Kernel Address: 0x%8X\n", boot_hdr->kernel_addr);
  731. dprintf(CRITICAL, "Ramdisk Address: 0x%8X\n", boot_hdr->ramdisk_addr);
  732. dprintf(CRITICAL, "Atag Address: 0x%8X\n", boot_hdr->tags_addr);
  733. dprintf(CRITICAL, "Command: %s\n", boot_hdr->cmdline);
  734. boot_linux((void *) boot_hdr->kernel_addr, (void *) boot_hdr->tags_addr,
  735. (char *) cmdline_get(), board_machtype(),
  736. (void *) boot_hdr->ramdisk_addr, boot_hdr->ramdisk_sz);
  737. _cmd_boot_exit:
  738. free(boot_hdr);
  739. return;
  740. }
  741. #ifdef MTK_AB_OTA_UPDATER
  742. void cmd_set_active(const char *arg, void *data, unsigned sz)
  743. {
  744. if (!strcmp(arg, "a")) {
  745. if (!set_active_slot(BOOTCTRL_SUFFIX_A))
  746. fastboot_okay("");
  747. else
  748. fastboot_fail("set slot a failed!\n");
  749. } else if (!strcmp(arg, "b")) {
  750. if (!set_active_slot(BOOTCTRL_SUFFIX_B))
  751. fastboot_okay("");
  752. else
  753. fastboot_fail("set slot b failed!\n");
  754. } else
  755. fastboot_fail("command parameter is not allowed!\n");
  756. }
  757. #endif