sys_commands.c 24 KB

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