ark1668ed_devb_emmc.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. *
  4. */
  5. #include <common.h>
  6. #include <dwmmc.h>
  7. #include <malloc.h>
  8. #include <linux/delay.h>
  9. #include <env.h>
  10. #include <command.h>
  11. #include <init.h>
  12. #include <u-boot/crc.h>
  13. #include <debug_uart.h>
  14. #include <asm-generic/gpio.h>
  15. #include <asm/arch/ark-common.h>
  16. #include <../../../include/serial.h>
  17. DECLARE_GLOBAL_DATA_PTR;
  18. #define ARK1668ED_UPDATE_MAGIC "ada7f0c6-7c86-11e9-8f9e-2a86e4085a59"
  19. #define rSYS_BOOT_SAMPLE (*(volatile unsigned int *)0x50000000)
  20. #define rSYS_CPU_CTL (*(volatile unsigned int *)0x50000034)
  21. #define rSYS_DEVICE_CLK_CFG0 (*(volatile unsigned int *)0x50000060)
  22. #define rSYS_DEVICE_CLK_CFG1 (*(volatile unsigned int *)0x50000064)
  23. #define rSYS_SOFTRESET_CTL (*(volatile unsigned int *)0x50000068)
  24. #define rSYS_SOFTRESET_CTL1 (*(volatile unsigned int *)0x5000006c)
  25. #define rMFC_MON_CFG (*(volatile unsigned int *)0x500000E8)
  26. #define rSYS_ANALOG_REG0 (*(volatile unsigned int *)0x50000100)
  27. #define PAD_CTL0_TMP (*(volatile unsigned int *)0x50000140)
  28. #define PAD_CTL1_TMP (*(volatile unsigned int *)0x50000144)
  29. #define PAD_CTL2_TMP (*(volatile unsigned int *)0x50000148)
  30. #define PAD_CTL3_TMP (*(volatile unsigned int *)0x5000014C)
  31. #define PAD_CTL4_TMP (*(volatile unsigned int *)0x50000150)
  32. #define PAD_CTL5_TMP (*(volatile unsigned int *)0x50000154)
  33. #define PAD_CTL6_TMP (*(volatile unsigned int *)0x50000158)
  34. #define PAD_CTL7_TMP (*(volatile unsigned int *)0x5000015C)
  35. #define PAD_CTL8_TMP (*(volatile unsigned int *)0x50000160)
  36. #define PAD_CTL9_TMP (*(volatile unsigned int *)0x50000164)
  37. #define PAD_CTL10_TMP (*(volatile unsigned int *)0x50000168)
  38. #define PAD_CTL11_TMP (*(volatile unsigned int *)0x5000016C)
  39. #define PAD_CTL12_TMP (*(volatile unsigned int *)0x50000170)
  40. #define PAD_CTL13_TMP (*(volatile unsigned int *)0x50000174)
  41. #define PAD_CTL14_TMP (*(volatile unsigned int *)0x50000178)
  42. #define PAD_CTL15_TMP (*(volatile unsigned int *)0x5000017c)
  43. #define PAD_CTL16_TMP (*(volatile unsigned int *)0x50000180)
  44. #define PAD_CTL17_TMP (*(volatile unsigned int *)0x50000184)
  45. #define PAD_CTL18_TMP (*(volatile unsigned int *)0x50000188)
  46. #define PAD_CTL19_TMP (*(volatile unsigned int *)0x5000018C)
  47. #define PAD_CTL20_TMP (*(volatile unsigned int *)0x50000190)
  48. #define SDMMC_CLK_CFG (*(volatile unsigned int *)0x50000050)
  49. #define GPIOE_DR (*(volatile unsigned int *)0x50900200)
  50. #define GPIOE_DDR (*(volatile unsigned int *)0x50900204)
  51. static void dwmci_select_pad(void)
  52. {
  53. unsigned int val;
  54. /* use sd/mmc 0 */
  55. val = PAD_CTL8_TMP;
  56. val &= ~(0x7 << 27);
  57. val |= (0x1 << 27);
  58. PAD_CTL8_TMP = val;
  59. val = PAD_CTL9_TMP;
  60. val &= ~((0x7 << 24)|(0x7 << 21)|(0x7 << 18)|(0x7 << 15)|(0x7 << 12)|(0x7 << 9)|(0x7 << 6)|(0x7 << 3)|(0x7 << 0));
  61. val |= ((0x1 << 24)|(0x1 << 21)|(0x1 << 18)|(0x1 << 15)|(0x1 << 12)|(0x1 << 9)|(0x1 << 6)|(0x1 << 3)|(0x1 << 0));
  62. PAD_CTL9_TMP = val;
  63. }
  64. int add_dwmci(struct dwmci_host *host, u32 max_clk, u32 min_clk);
  65. #define ARK_MMC_CLK 24000000
  66. static int ark_dwmci_init(char *name, u32 regbase, int bus_width, int index)
  67. {
  68. struct dwmci_host *host = NULL;
  69. host = malloc(sizeof(struct dwmci_host));
  70. if (!host) {
  71. printf("dwmci_host malloc fail!\n");
  72. return 1;
  73. }
  74. memset(host, 0, sizeof(struct dwmci_host));
  75. host->name = name;
  76. host->ioaddr = (void *)regbase;
  77. host->buswidth = bus_width;
  78. host->dev_index = index;
  79. host->bus_hz = ARK_MMC_CLK;
  80. host->fifoth_val = 64;
  81. host->fifo_mode = 1;
  82. add_dwmci(host, host->bus_hz, 400000);
  83. return 0;
  84. }
  85. int board_mmc_init(struct bd_info *bis)
  86. {
  87. ark_dwmci_init("ARK_MMC0", 0x40100000, 8, 0);
  88. return 0;
  89. }
  90. int dram_init(void)
  91. {
  92. gd->ram_size = get_ram_size((void *)CFG_SYS_SDRAM_BASE,
  93. CFG_SYS_SDRAM_SIZE);
  94. return 0;
  95. }
  96. int board_init(void)
  97. {
  98. unsigned int val;
  99. /* cpu1 disable */
  100. rSYS_CPU_CTL &= ~(1 << 1);
  101. /*rMFC_MON_CFG*/
  102. val = rMFC_MON_CFG;
  103. val |= ((0x1<<1));
  104. rMFC_MON_CFG = val;
  105. /*usb host softreset */
  106. rSYS_SOFTRESET_CTL1 &= ~((1 << 22) | (1 << 5));
  107. rSYS_SOFTRESET_CTL &= ~(1 << 3);
  108. udelay(10);
  109. rSYS_SOFTRESET_CTL1 |= (1 << 22) | (1 << 5);
  110. rSYS_SOFTRESET_CTL |= (1 << 3);
  111. udelay(10);
  112. /* set usb0 id */
  113. rSYS_ANALOG_REG0 &= ~(0x1F<<16);
  114. /* set usb1 id */
  115. rSYS_ANALOG_REG0 &= ~(0x1F<<24);
  116. /*usb1 5v gpio141 enable*/
  117. GPIOE_DDR |= (1<<(141 - 128));//Output Direction
  118. GPIOE_DR |= (1<<(141 - 128));//vale 1
  119. val = PAD_CTL14_TMP;
  120. val &= ~((0x7 << 9));
  121. val |= (0x4 << 9);
  122. PAD_CTL14_TMP = val;
  123. dwmci_select_pad();
  124. //emmc clk config clk:45000000
  125. SDMMC_CLK_CFG &= ~((0x1F << 0) | (0x1 << 6) | (0x1 << 7));
  126. SDMMC_CLK_CFG |= (1 << 7) | (1 << 6) | 2;
  127. return 0;
  128. }
  129. //#ifndef CONFIG_DM_SERIAL
  130. struct serial_device *default_serial_console(void)
  131. {
  132. return &eserial1_device;
  133. }
  134. //#endif
  135. #ifdef CONFIG_BOARD_EARLY_INIT_F
  136. int board_early_init_f(void)
  137. {
  138. #ifdef CONFIG_DEBUG_UART
  139. debug_uart_init();
  140. #endif
  141. return 0;
  142. }
  143. #endif
  144. #if !defined(CONFIG_SPL_BUILD)
  145. static int ark_update_emmc_partition(char *partition_name, char *file_name)
  146. {
  147. int ret = -1;
  148. unsigned int file_size, crc_src;
  149. char cmd[128] = { 0 };
  150. unsigned int *srcdata = (unsigned int *)(env_get_hex("loadaddr", 0));
  151. unsigned int *dstdata = (unsigned int *)(env_get_hex("cmploadaddr", 0));
  152. #if ARK_UPDATE_SECURITY
  153. sprintf(cmd, "zipread usb 0 %s update.zip %s", env_get("loadaddr"), file_name);
  154. #else
  155. sprintf(cmd, "fatload %s %s %s %s", env_get("update_dev_type"), env_get("update_dev_part"), env_get("loadaddr"), file_name);
  156. #endif
  157. printf("cmd=%s\n", cmd);
  158. ret = run_command(cmd, 0);
  159. if (ret) {
  160. printf("Load %s from tf/usb error!!\n", file_name);
  161. return 1;
  162. }
  163. #if (!ARK_UPDATE_SECURITY)
  164. file_size = env_get_ulong("filesize", 16, 0x2000);
  165. crc_src = crc32(0, (const unsigned char *)srcdata, file_size);
  166. printf(">>>>>%s crc_src 0x%x!!\n", file_name, crc_src);
  167. ret = ark_check_data_from_devide(file_name, crc_src);
  168. if (ret) {
  169. printf("check data %s from tf/usb crc error!!\n", file_name);
  170. return 1;
  171. }
  172. #endif
  173. //burn data to emmc
  174. sprintf(cmd, "emmc erase.part %s", partition_name);
  175. printf("cmd=%s\n", cmd);
  176. ret = run_command(cmd, 0);
  177. if (ret)
  178. return ret;
  179. file_size = env_get_ulong("filesize", 16, 0x2000);
  180. sprintf(cmd, "emmc write %s %s 0x%x", env_get("loadaddr"), partition_name, file_size);
  181. printf("cmd=%s\n", cmd);
  182. ret = run_command(cmd, 0);
  183. if (ret) {
  184. printf("emmc write data error!!!\n");
  185. return 1;
  186. }
  187. sprintf(cmd, "emmc read %s %s 0x%x", env_get("cmploadaddr"), partition_name, file_size);
  188. printf("cmd=%s\n", cmd);
  189. ret = run_command(cmd, 0);
  190. if (ret) {
  191. printf("emmc write data error!!!\n");
  192. return 1;
  193. }
  194. crc_src = crc32(0, (const unsigned char *)dstdata, file_size);
  195. ret = ark_check_data_from_partition(partition_name, crc_src);
  196. if (ret)
  197. return 1;
  198. #if ARK_BOOT_SECURITY
  199. if (!strcmp(partition_name, "kernel"))
  200. env_set_hex("crc_kernel_a", crc_src);
  201. else if (!strcmp(partition_name, "kernel_b"))
  202. env_set_hex("crc_kernel_b", crc_src);
  203. #endif
  204. return 0;
  205. }
  206. #if (!ARK_UPDATE_SECURITY)
  207. static int ark_update_emmc_rootfs_from_media(char *partition_name)
  208. {
  209. char cmd[32];
  210. int ret = 0;
  211. char *update_device = env_get("update_dev_type");
  212. printf("\r\n****** update %s from %s:rootfs.ext2 .....\r\n", partition_name, update_device);
  213. sprintf(cmd, "fatsize %s %s rootfs.ext2", env_get("update_dev_type"), env_get("update_dev_part"));
  214. printf("cmd = %s\n", cmd);
  215. ret = run_command(cmd, 0);
  216. if (ret) {
  217. printf("Error:rootfs file maybe not in device!!!\n");
  218. return 2;
  219. }
  220. sprintf(cmd, "updaterootfs %s", partition_name);
  221. printf("cmd=%s\n", cmd);
  222. ret = run_command(cmd, 0);
  223. return ret;
  224. }
  225. static int ark_do_update_from_media(unsigned int updateDevice)
  226. {
  227. char cmd[32];
  228. unsigned int ret = 0;
  229. char *update_dev = NULL;
  230. static char curr_partition[32];
  231. unsigned char update_fdt_name[32];
  232. unsigned char flag_partiton = 0;//0--A partiton,1---B partition
  233. unsigned int dis_pos_x = 0;
  234. unsigned int dis_pos_y = 0;
  235. unsigned int resetuboot = 0;
  236. unsigned int fdtsize = 0;
  237. unsigned int kernelsize = 0;
  238. #if ARK_BOOT_SECURITY
  239. unsigned int kernelcrc = 0;
  240. #endif
  241. sprintf(cmd, "mmc dev %s", env_get("emmc_dev_part"));
  242. printf("cmd=%s\n", cmd);
  243. run_command(cmd, 0);
  244. sprintf((char *)cmd, "disconfig 0");
  245. run_command(cmd, 0);
  246. resetuboot = env_get_hex("ubootreset", 0);
  247. // curr_partition = env_get("updata_from_part");
  248. sprintf(curr_partition, "%s", env_get("updata_from_part"));
  249. fdtsize = env_get_hex("fdtsize", 0);
  250. kernelsize = env_get_hex("kernelsize", 0);
  251. #if ARK_BOOT_SECURITY
  252. kernelcrc = env_get_hex("crc_kernel", 0);
  253. #endif
  254. mdelay(20);
  255. printf(">>>>>>fdtsize = 0x%x,kernelsize = 0x%x,curr_partition %s\n", fdtsize, kernelsize, curr_partition);
  256. run_command("env default -f -a", 0);
  257. mdelay(500);
  258. if (updateDevice) {
  259. printf("update form mmc...\n");
  260. env_set("update_dev_type", "mmc");
  261. env_set("update_dev_part", env_get("sd_dev_part"));
  262. } else {
  263. printf("update form usb...\n");
  264. env_set("update_dev_type", "usb");
  265. env_set("update_dev_part", "0");
  266. env_set("updata_status", "usb");
  267. }
  268. udelay(20);
  269. // update_fdt = env_get("boardfdt");
  270. // sprintf(update_fdt_name, "%s", env_get("boardfdt"));
  271. get_crc_data_from_device("crcdata.bin");
  272. dis_pos_x = 6;
  273. dis_pos_y = 20;
  274. /****** update from update ubootspl ******/
  275. ret = ark_update_emmc_partition("bootstrap", "ubootspl.bin");
  276. mdelay(30);
  277. if (!ret) {
  278. sprintf(cmd, "setenv bootstrapsize %s", env_get("filesize"));
  279. printf("cmd=%s\n", cmd);
  280. run_command(cmd, 0);
  281. mdelay(30);
  282. sprintf((char *)cmd, "disconfig 5");
  283. run_command(cmd, 0);
  284. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootstrap", 0);
  285. printf("cmd=%s\n", cmd);
  286. run_command(cmd, 0);
  287. } else {
  288. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootstrap", 1);
  289. printf("cmd=%s\n", cmd);
  290. run_command(cmd, 0);
  291. goto bootoldsys;
  292. }
  293. /****** update from update uboot ******/
  294. ret = ark_update_emmc_partition("bootloader", "u-boot.img");
  295. mdelay(30);
  296. if (!ret) {
  297. sprintf(cmd, "setenv bootloadersize %s", env_get("filesize"));
  298. printf("cmd=%s\n", cmd);
  299. run_command(cmd, 0);
  300. mdelay(30);
  301. sprintf((char *)cmd, "disconfig 10");
  302. run_command(cmd, 0);
  303. dis_pos_y = dis_pos_y + 20;
  304. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootloader", 0);
  305. printf("cmd=%s\n", cmd);
  306. run_command(cmd, 0);
  307. if (resetuboot == 0) {
  308. //重新保存设置的数据,以防数据丢失
  309. env_set("ubootreset", "1");
  310. sprintf(cmd, "setenv updata_from_part %s", curr_partition);
  311. printf(">>>>>>>cmd=%s\n", cmd);
  312. run_command(cmd, 0);
  313. mdelay(10);
  314. if (!strcmp(curr_partition, "A")) {
  315. env_set("updata_from_part", "A");
  316. env_set("kernel_part", "kernel");
  317. env_set("fdt_part", "fdt");
  318. env_set("rootfs_part", "rootfs");
  319. env_set("emmcroot", "/dev/mmcblk0p10 ro");
  320. } else if (!strcmp(curr_partition, "B")) {
  321. env_set("updata_from_part", "B");
  322. env_set("kernel_part", "kernel_b");
  323. env_set("fdt_part", "fdt_b");
  324. env_set("rootfs_part", "rootfs_b");
  325. env_set("emmcroot", "/dev/mmcblk0p14 ro");
  326. }
  327. sprintf(cmd, "setenv fdtsize 0x%x", fdtsize);
  328. printf(">>>>>>>cmd=%s\n", cmd);
  329. run_command(cmd, 0);
  330. mdelay(10);
  331. sprintf(cmd, "setenv kernelsize 0x%x", kernelsize);
  332. printf(">>>>>>>cmd=%s\n", cmd);
  333. run_command(cmd, 0);
  334. mdelay(10);
  335. #if ARK_BOOT_SECURITY
  336. sprintf(cmd, "setenv crc_kernel 0x%x", kernelcrc);
  337. printf(">>>>>>>cmd=%s\n", cmd);
  338. run_command(cmd, 0);
  339. mdelay(10);
  340. #endif
  341. run_command("saveenv", 0);
  342. mdelay(100);
  343. run_command("reset", 0);
  344. while (1)
  345. ;
  346. }
  347. env_set("ubootreset", "0");
  348. mdelay(20);
  349. } else {
  350. dis_pos_y = dis_pos_y + 20;
  351. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootloader", 1);
  352. printf("cmd=%s\n", cmd);
  353. run_command(cmd, 0);
  354. goto bootoldsys;
  355. }
  356. sprintf(update_fdt_name, "%s", env_get("boardfdt"));
  357. update_dev = env_get("update_dev_type");
  358. printf(">>>>>>>>>>update_dev %s\n", update_dev);
  359. if (!strcmp(update_dev, "mmc")) {
  360. env_set("updata_status", "none");
  361. env_set("updata_from_part", "A");
  362. flag_partiton = 0;
  363. } else if (!strcmp(update_dev, "usb")) {
  364. env_set("updata_status", "usb");
  365. if (!strcmp(curr_partition, "A"))
  366. flag_partiton = 1;
  367. else if (!strcmp(curr_partition, "B"))
  368. flag_partiton = 0;
  369. }
  370. printf(">>>>>>curr_partition %s,update_fdt:%s,resetuboot %d.....\n", curr_partition, update_fdt_name, resetuboot);
  371. /****** update from update fdt ******/
  372. if (flag_partiton == 0)
  373. ret = ark_update_emmc_partition("fdt", update_fdt_name);
  374. else
  375. ret = ark_update_emmc_partition("fdt_b", update_fdt_name);
  376. mdelay(30);
  377. if (!ret) {
  378. if (flag_partiton == 0)
  379. sprintf(cmd, "setenv fdtsize_a %s", env_get("filesize"));
  380. else
  381. sprintf(cmd, "setenv fdtsize_b %s", env_get("filesize"));
  382. run_command(cmd, 0);
  383. printf("cmd=%s\n", cmd);
  384. mdelay(30);
  385. sprintf((char *)cmd, "disconfig 15");
  386. run_command(cmd, 0);
  387. dis_pos_y = dis_pos_y + 20;
  388. if (flag_partiton == 0)
  389. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "fdt", 0);
  390. else
  391. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "fdt_b", 0);
  392. printf("cmd=%s\n", cmd);
  393. run_command(cmd, 0);
  394. } else {
  395. dis_pos_y = dis_pos_y + 20;
  396. if (flag_partiton == 0)
  397. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "fdt", 1);
  398. else
  399. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "fdt_b", 1);
  400. printf("cmd=%s\n", cmd);
  401. run_command(cmd, 0);
  402. goto bootoldsys;
  403. }
  404. /****** update from update kernel ******/
  405. if (flag_partiton == 0)
  406. ret = ark_update_emmc_partition("kernel", "zImage");
  407. else
  408. ret = ark_update_emmc_partition("kernel_b", "zImage");
  409. mdelay(30);
  410. if (!ret) {
  411. if (flag_partiton == 0)
  412. sprintf(cmd, "setenv kernelsize_a %s", env_get("filesize"));
  413. else
  414. sprintf(cmd, "setenv kernelsize_b %s", env_get("filesize"));
  415. printf("cmd=%s\n", cmd);
  416. run_command(cmd, 0);
  417. mdelay(30);
  418. sprintf((char *)cmd, "disconfig 25");
  419. run_command(cmd, 0);
  420. dis_pos_y = dis_pos_y + 20;
  421. if (flag_partiton == 0)
  422. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "kernel", 0);
  423. else
  424. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "kernel_b", 0);
  425. printf("cmd=%s\n", cmd);
  426. run_command(cmd, 0);
  427. } else {
  428. dis_pos_y = dis_pos_y + 20;
  429. if (flag_partiton == 0)
  430. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "kernel", 1);
  431. else
  432. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "kernel_b", 1);
  433. printf("cmd=%s\n", cmd);
  434. run_command(cmd, 0);
  435. goto bootoldsys;
  436. }
  437. /****** update from update bootanimation ******/
  438. ret = ark_update_emmc_partition("bootanimation", "bootanimation");
  439. mdelay(30);
  440. if (!ret) {
  441. sprintf(cmd, "setenv bootanimationsize %s", env_get("filesize"));
  442. run_command(cmd, 0);
  443. printf("cmd=%s\n", cmd);
  444. mdelay(30);
  445. sprintf((char *)cmd, "disconfig 30");
  446. run_command(cmd, 0);
  447. dis_pos_y = dis_pos_y + 20;
  448. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootanimation", 0);
  449. printf("cmd=%s\n", cmd);
  450. run_command(cmd, 0);
  451. } else {
  452. dis_pos_y = dis_pos_y + 20;
  453. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootanimation", 1);
  454. printf("cmd=%s\n", cmd);
  455. run_command(cmd, 0);
  456. goto bootoldsys;
  457. }
  458. #if 0
  459. /****** update from update reversingtrack ******/
  460. ret = ark_update_emmc_partition("reversingtrack", "reversingtrack");
  461. mdelay(30);
  462. if (!ret) {
  463. sprintf(cmd, "setenv reversingtracksize %s", env_get("filesize"));
  464. run_command(cmd, 0);
  465. printf("cmd=%s\n", cmd);
  466. mdelay(30);
  467. sprintf((char *)cmd, "disconfig 35");
  468. run_command(cmd, 0);
  469. dis_pos_y = dis_pos_y + 20;
  470. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "reversingtrack", 0);
  471. printf("cmd=%s\n", cmd);
  472. run_command(cmd, 0);
  473. } else {
  474. dis_pos_y = dis_pos_y + 20;
  475. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "reversingtrack", 1);
  476. printf("cmd=%s\n", cmd);
  477. run_command(cmd, 0);
  478. goto bootoldsys;
  479. }
  480. #endif
  481. /****** update from update uboot back ******/
  482. ret = ark_update_emmc_partition("bootloader_bak", "u-boot.img");
  483. if (!ret) {
  484. sprintf(cmd, "setenv bootloadersize %s", env_get("filesize"));
  485. run_command(cmd, 0);
  486. printf("cmd=%s\n", cmd);
  487. mdelay(30);
  488. sprintf((char *)cmd, "disconfig 40");
  489. run_command(cmd, 0);
  490. dis_pos_y = dis_pos_y + 20;
  491. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootloader_bak", 0);
  492. printf("cmd=%s\n", cmd);
  493. run_command(cmd, 0);
  494. } else {
  495. dis_pos_y = dis_pos_y + 20;
  496. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootloader_bak", 1);
  497. printf("cmd=%s\n", cmd);
  498. run_command(cmd, 0);
  499. goto bootoldsys;
  500. }
  501. /****** update from update rootfs ******/
  502. if (flag_partiton == 0)
  503. ret = ark_update_emmc_rootfs_from_media("rootfs");
  504. else
  505. ret = ark_update_emmc_rootfs_from_media("rootfs_b");
  506. if (!ret) {
  507. sprintf((char *)cmd, "disconfig 95");
  508. run_command(cmd, 0);
  509. dis_pos_y = dis_pos_y + 20;
  510. if (flag_partiton == 0)
  511. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "rootfs", 0);
  512. else
  513. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "rootfs_b", 0);
  514. printf("cmd=%s\n", cmd);
  515. run_command(cmd, 0);
  516. } else if (ret != 2) {
  517. dis_pos_y = dis_pos_y + 20;
  518. if (flag_partiton == 0)
  519. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "rootfs", 1);
  520. else
  521. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "rootfs_b", 1);
  522. printf("cmd=%s\n", cmd);
  523. run_command(cmd, 0);
  524. goto bootoldsys;
  525. }
  526. printf("\r\n **** set the env to partition .....\r\n");
  527. //mmc update set part A
  528. if (!strcmp(update_dev, "mmc")) {
  529. env_set("updata_from_part", "A");
  530. env_set("kernel_part", "kernel");
  531. env_set("fdt_part", "fdt");
  532. env_set("rootfs_part", "rootfs");
  533. env_set("emmcroot", "/dev/mmcblk0p10 ro");
  534. sprintf(cmd, "setenv fdtsize %s", env_get("fdtsize_a"));
  535. run_command(cmd, 0);
  536. printf("cmd=%s\n", cmd);
  537. mdelay(30);
  538. sprintf(cmd, "setenv kernelsize %s", env_get("kernelsize_a"));
  539. run_command(cmd, 0);
  540. printf("cmd=%s\n", cmd);
  541. mdelay(30);
  542. #if ARK_BOOT_SECURITY
  543. sprintf(cmd, "setenv crc_kernel 0x%x", crc_kernel_a);
  544. printf(">>>>>>>cmd=%s\n", cmd);
  545. run_command(cmd, 0);
  546. mdelay(10);
  547. #endif
  548. } else if (!strcmp(update_dev, "usb")) {
  549. printf(">>>>>>>>>curr_partition %s\n", curr_partition);
  550. if (flag_partiton == 1) {
  551. env_set("updata_from_part", "B");
  552. env_set("kernel_part", "kernel_b");
  553. env_set("fdt_part", "fdt_b");
  554. env_set("rootfs_part", "rootfs_b");
  555. env_set("emmcroot", "/dev/mmcblk0p14 ro");
  556. sprintf(cmd, "setenv fdtsize %s", env_get("fdtsize_b"));
  557. run_command(cmd, 0);
  558. printf("cmd=%s\n", cmd);
  559. mdelay(30);
  560. sprintf(cmd, "setenv kernelsize %s", env_get("kernelsize_b"));
  561. run_command(cmd, 0);
  562. printf("cmd=%s\n", cmd);
  563. mdelay(30);
  564. #if ARK_BOOT_SECURITY
  565. sprintf(cmd, "setenv crc_kernel 0x%x", crc_kernel_b);
  566. printf(">>>>>>>cmd=%s\n", cmd);
  567. run_command(cmd, 0);
  568. mdelay(10);
  569. #endif
  570. } else if (flag_partiton == 0) {
  571. env_set("updata_from_part", "A");
  572. env_set("kernel_part", "kernel");
  573. env_set("fdt_part", "fdt");
  574. env_set("rootfs_part", "rootfs");
  575. env_set("emmcroot", "/dev/mmcblk0p10 ro");
  576. sprintf(cmd, "setenv fdtsize %s", env_get("fdtsize_a"));
  577. run_command(cmd, 0);
  578. printf("cmd=%s\n", cmd);
  579. mdelay(30);
  580. sprintf(cmd, "setenv kernelsize %s", env_get("kernelsize_a"));
  581. run_command(cmd, 0);
  582. printf("cmd=%s\n", cmd);
  583. mdelay(30);
  584. #if ARK_BOOT_SECURITY
  585. sprintf(cmd, "setenv crc_kernel 0x%x", crc_kernel_a);
  586. printf(">>>>>>>cmd=%s\n", cmd);
  587. run_command(cmd, 0);
  588. mdelay(10);
  589. #endif
  590. }
  591. }
  592. mdelay(5);
  593. env_set("need_update", "no");
  594. mdelay(5);
  595. env_set("updata_status", "none");
  596. sprintf(cmd, "saveenv");
  597. printf("cmd=%s\n", cmd);
  598. run_command(cmd, 0);
  599. mdelay(30);
  600. sprintf((char *)cmd, "disconfig 100");
  601. run_command(cmd, 0);
  602. printf("\r\n **** update the device ok! .....\r\n");
  603. return 0;
  604. bootoldsys:
  605. if (!strcmp(curr_partition, "A")) {
  606. env_set("updata_from_part", "A");
  607. env_set("kernel_part", "kernel");
  608. env_set("fdt_part", "fdt");
  609. env_set("rootfs_part", "rootfs");
  610. env_set("emmcroot", "/dev/mmcblk0p10 ro");
  611. sprintf(cmd, "setenv fdtsize 0x%x", fdtsize);
  612. run_command(cmd, 0);
  613. printf("cmd=%s\n", cmd);
  614. mdelay(30);
  615. sprintf(cmd, "setenv kernelsize 0x%x", kernelsize);
  616. run_command(cmd, 0);
  617. printf("cmd=%s\n", cmd);
  618. mdelay(30);
  619. #if ARK_BOOT_SECURITY
  620. sprintf(cmd, "setenv crc_kernel 0x%x", kernelcrc);
  621. printf(">>>>>>>cmd=%s\n", cmd);
  622. run_command(cmd, 0);
  623. mdelay(10);
  624. #endif
  625. } else if (!strcmp(curr_partition, "B")) {
  626. env_set("updata_from_part", "B");
  627. env_set("kernel_part", "kernel_b");
  628. env_set("fdt_part", "fdt_b");
  629. env_set("rootfs_part", "rootfs_b");
  630. env_set("emmcroot", "/dev/mmcblk0p14 ro");
  631. sprintf(cmd, "setenv fdtsize 0x%x", fdtsize);
  632. run_command(cmd, 0);
  633. printf("cmd=%s\n", cmd);
  634. mdelay(30);
  635. sprintf(cmd, "setenv kernelsize 0x%x", kernelsize);
  636. run_command(cmd, 0);
  637. printf("cmd=%s\n", cmd);
  638. mdelay(30);
  639. #if ARK_BOOT_SECURITY
  640. sprintf(cmd, "setenv crc_kernel 0x%x", kernelcrc);
  641. printf(">>>>>>>cmd=%s\n", cmd);
  642. run_command(cmd, 0);
  643. mdelay(10);
  644. #endif
  645. }
  646. env_set("updata_status", "error");
  647. sprintf(cmd, "saveenv");
  648. printf("cmd=%s\n", cmd);
  649. run_command(cmd, 0);
  650. mdelay(20);
  651. sprintf((char *)cmd, "disconfig 100");
  652. run_command(cmd, 0);
  653. return 1;
  654. }
  655. #else
  656. /*
  657. *ark1668Ed secured upgrade RSA2048 PSS mode
  658. */
  659. #include "keyts.h"
  660. #include <../lib/rsa_ark/rsa.h>
  661. static int ark_update_emmc_rootfs_from_media(char *partition_name)
  662. {
  663. char cmd[32];
  664. int ret = 0;
  665. char *file_name = "update/rootfs.ext2";
  666. printf("\r\n****** update %s from %s:rootfs.ext2 .....\r\n", partition_name, env_get("update_dev_type"));
  667. ret = ark_burn_rootfs_data_to_media(partition_name, file_name);
  668. if (ret != 0)
  669. return -1;
  670. return ret;
  671. }
  672. static int ark_secured_update_from_media(unsigned int updateDevice)
  673. {
  674. char cmd[32];
  675. unsigned int ret = 0;
  676. char *update_dev = NULL;
  677. static char curr_partition[32];
  678. unsigned char update_fdt_name[32];
  679. unsigned char flag_partiton = 0;//0--A partiton,1---B partition
  680. unsigned int dis_pos_x = 0;
  681. unsigned int dis_pos_y = 0;
  682. unsigned int resetuboot = 0;
  683. unsigned int fdtsize = 0;
  684. unsigned int kernelsize = 0;
  685. rsa_pk_t pk = {0};
  686. sprintf(cmd, "mmc dev %s", env_get("emmc_dev_part"));
  687. printf("cmd=%s\n", cmd);
  688. run_command(cmd, 0);
  689. sprintf((char *)cmd, "disconfig 0");
  690. run_command(cmd, 0);
  691. resetuboot = env_get_hex("ubootreset", 0);
  692. sprintf(curr_partition, "%s", env_get("updata_from_part"));
  693. fdtsize = env_get_hex("fdtsize", 0);
  694. kernelsize = env_get_hex("kernelsize", 0);
  695. mdelay(20);
  696. printf(">>>>>>fdtsize = 0x%x,kernelsize = 0x%x,curr_partition %s\n", fdtsize, kernelsize, curr_partition);
  697. run_command("env default -f -a", 0);
  698. mdelay(500);
  699. if (updateDevice) {
  700. printf("update form mmc...\n");
  701. env_set("update_dev_type", "mmc");
  702. env_set("update_dev_part", env_get("sd_dev_part"));
  703. } else {
  704. printf("update form usb...\n");
  705. env_set("update_dev_type", "usb");
  706. env_set("update_dev_part", "0");
  707. env_set("updata_status", "usb");
  708. }
  709. udelay(20);
  710. get_crc_data_from_device("update/crcdata.bin");
  711. dis_pos_x = 6;
  712. dis_pos_y = 20;
  713. pk.bits = KEY_M_BITS;
  714. memcpy(&pk.modulus[RSA_MAX_MODULUS_LEN-sizeof(key_pm)], key_pm, sizeof(key_pm));
  715. memcpy(&pk.exponent[RSA_MAX_MODULUS_LEN-sizeof(key_pe)], key_pe, sizeof(key_pe));
  716. ret = ark_PssVerify_signature("update/ubootspl.bin", "update/META-INF/ubootspl.SF", "update/META-INF/ubootspl.RSA", pk);
  717. if (ret == 0) {
  718. ret = ark_update_emmc_partition("bootstrap", "update/ubootspl.bin");
  719. if (!ret) {
  720. sprintf(cmd, "setenv bootstrapsize %s", env_get("filesize"));
  721. printf("cmd=%s\n", cmd);
  722. run_command(cmd, 0);
  723. mdelay(30);
  724. sprintf((char *)cmd, "disconfig 5");
  725. run_command(cmd, 0);
  726. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootstrap", 0);
  727. printf("cmd=%s\n", cmd);
  728. run_command(cmd, 0);
  729. } else {
  730. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootstrap", 1);
  731. printf("cmd=%s\n", cmd);
  732. run_command(cmd, 0);
  733. goto bootoldsys;
  734. }
  735. } else {
  736. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootstrap", 1);
  737. printf("cmd=%s\n", cmd);
  738. run_command(cmd, 0);
  739. goto bootoldsys;
  740. }
  741. ret = ark_PssVerify_signature("update/u-boot.img", "update/META-INF/u-boot.SF", "update/META-INF/u-boot.RSA", pk);
  742. if (ret == 0) {
  743. ret = ark_update_emmc_partition("bootloader", "update/u-boot.img");
  744. if (!ret) {
  745. sprintf(cmd, "setenv bootloadersize %s", env_get("filesize"));
  746. printf("cmd=%s\n", cmd);
  747. run_command(cmd, 0);
  748. mdelay(30);
  749. sprintf((char *)cmd, "disconfig 10");
  750. run_command(cmd, 0);
  751. dis_pos_y = dis_pos_y + 20;
  752. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootloader", 0);
  753. printf("cmd=%s\n", cmd);
  754. run_command(cmd, 0);
  755. if (resetuboot == 0) {
  756. env_set("ubootreset", "1");
  757. sprintf(cmd, "setenv updata_from_part %s", curr_partition);
  758. printf(">>>>>>>cmd=%s\n", cmd);
  759. run_command(cmd, 0);
  760. mdelay(10);
  761. if (!strcmp(curr_partition, "A")) {
  762. env_set("updata_from_part", "A");
  763. env_set("kernel_part", "kernel");
  764. env_set("fdt_part", "fdt");
  765. env_set("rootfs_part", "rootfs");
  766. env_set("emmcroot", "/dev/mmcblk0p10 ro");
  767. } else if (!strcmp(curr_partition, "B")) {
  768. env_set("updata_from_part", "B");
  769. env_set("kernel_part", "kernel_b");
  770. env_set("fdt_part", "fdt_b");
  771. env_set("rootfs_part", "rootfs_b");
  772. env_set("emmcroot", "/dev/mmcblk0p14 ro");
  773. }
  774. sprintf(cmd, "setenv fdtsize 0x%x", fdtsize);
  775. printf(">>>>>>>cmd=%s\n", cmd);
  776. run_command(cmd, 0);
  777. mdelay(10);
  778. sprintf(cmd, "setenv kernelsize 0x%x", kernelsize);
  779. printf(">>>>>>>cmd=%s\n", cmd);
  780. run_command(cmd, 0);
  781. mdelay(10);
  782. run_command("saveenv", 0);
  783. mdelay(100);
  784. run_command("reset", 0);
  785. while (1)
  786. ;
  787. }
  788. env_set("ubootreset", "0");
  789. mdelay(20);
  790. } else {
  791. dis_pos_y = dis_pos_y + 20;
  792. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootloader", 1);
  793. printf("cmd=%s\n", cmd);
  794. run_command(cmd, 0);
  795. goto bootoldsys;
  796. }
  797. } else {
  798. dis_pos_y = dis_pos_y + 20;
  799. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootloader", 1);
  800. printf("cmd=%s\n", cmd);
  801. run_command(cmd, 0);
  802. goto bootoldsys;
  803. }
  804. sprintf(update_fdt_name, "%s", env_get("boardfdt"));
  805. update_dev = env_get("update_dev_type");
  806. printf(">>>>>>>>>>update_dev %s\n", update_dev);
  807. if (!strcmp(update_dev, "mmc")) {
  808. env_set("updata_status", "none");
  809. env_set("updata_from_part", "A");
  810. flag_partiton = 0;
  811. } else if (!strcmp(update_dev, "usb")) {
  812. env_set("updata_status", "usb");
  813. if (!strcmp(curr_partition, "A"))
  814. flag_partiton = 1;
  815. else if (!strcmp(curr_partition, "B"))
  816. flag_partiton = 0;
  817. }
  818. printf(">>>>>>curr_partition %s,update_fdt:%s,resetuboot %d.....\n", curr_partition, update_fdt_name, resetuboot);
  819. ret = ark_PssVerify_signature("update/ark1668ed_devb_emmc.dtb", "update/META-INF/ark1668ed_devb_emmc.SF", "update/META-INF/ark1668ed_devb_emmc.RSA", pk);
  820. if (ret == 0) {
  821. if (flag_partiton == 0)
  822. ret = ark_update_emmc_partition("fdt", "update/ark1668ed_devb_emmc.dtb");
  823. else
  824. ret = ark_update_emmc_partition("fdt_b", "update/ark1668ed_devb_emmc.dtb");
  825. if (!ret) {
  826. if (flag_partiton == 0)
  827. sprintf(cmd, "setenv fdtsize_a %s", env_get("filesize"));
  828. else
  829. sprintf(cmd, "setenv fdtsize_b %s", env_get("filesize"));
  830. run_command(cmd, 0);
  831. printf("cmd=%s\n", cmd);
  832. mdelay(30);
  833. sprintf((char *)cmd, "disconfig 15");
  834. run_command(cmd, 0);
  835. dis_pos_y = dis_pos_y + 20;
  836. if (flag_partiton == 0)
  837. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "fdt", 0);
  838. else
  839. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "fdt_b", 0);
  840. printf("cmd=%s\n", cmd);
  841. run_command(cmd, 0);
  842. } else {
  843. dis_pos_y = dis_pos_y + 20;
  844. if (flag_partiton == 0)
  845. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "fdt", 1);
  846. else
  847. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "fdt_b", 1);
  848. printf("cmd=%s\n", cmd);
  849. run_command(cmd, 0);
  850. goto bootoldsys;
  851. }
  852. } else {
  853. dis_pos_y = dis_pos_y + 20;
  854. if (flag_partiton == 0)
  855. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "fdt", 1);
  856. else
  857. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "fdt_b", 1);
  858. printf("cmd=%s\n", cmd);
  859. run_command(cmd, 0);
  860. goto bootoldsys;
  861. }
  862. ret = ark_PssVerify_signature("update/zImage", "update/META-INF/zImage.SF", "update/META-INF/zImage.RSA", pk);
  863. if (ret == 0) {
  864. if (flag_partiton == 0)
  865. ret = ark_update_emmc_partition("kernel", "update/zImage");
  866. else
  867. ret = ark_update_emmc_partition("kernel_b", "update/zImage");
  868. if (!ret) {
  869. if (flag_partiton == 0)
  870. sprintf(cmd, "setenv kernelsize_a %s", env_get("filesize"));
  871. else
  872. sprintf(cmd, "setenv kernelsize_b %s", env_get("filesize"));
  873. printf("cmd=%s\n", cmd);
  874. run_command(cmd, 0);
  875. mdelay(30);
  876. sprintf((char *)cmd, "disconfig 25");
  877. run_command(cmd, 0);
  878. dis_pos_y = dis_pos_y + 20;
  879. if (flag_partiton == 0)
  880. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "kernel", 0);
  881. else
  882. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "kernel_b", 0);
  883. printf("cmd=%s\n", cmd);
  884. run_command(cmd, 0);
  885. } else {
  886. dis_pos_y = dis_pos_y + 20;
  887. if (flag_partiton == 0)
  888. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "kernel", 1);
  889. else
  890. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "kernel_b", 1);
  891. printf("cmd=%s\n", cmd);
  892. run_command(cmd, 0);
  893. goto bootoldsys;
  894. }
  895. } else {
  896. dis_pos_y = dis_pos_y + 20;
  897. if (flag_partiton == 0)
  898. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "kernel", 1);
  899. else
  900. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "kernel_b", 1);
  901. printf("cmd=%s\n", cmd);
  902. run_command(cmd, 0);
  903. goto bootoldsys;
  904. }
  905. #if 0
  906. /****** update from update bootanimation ******/
  907. ret = ark_update_emmc_partition("bootanimation", "bootanimation");
  908. mdelay(30);
  909. if (!ret) {
  910. sprintf(cmd, "setenv bootanimationsize %s", env_get("filesize"));
  911. run_command(cmd, 0);
  912. printf("cmd=%s\n", cmd);
  913. mdelay(30);
  914. sprintf((char *)cmd, "disconfig 30");
  915. run_command(cmd, 0);
  916. dis_pos_y = dis_pos_y + 20;
  917. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootanimation", 0);
  918. printf("cmd=%s\n", cmd);
  919. run_command(cmd, 0);
  920. } else {
  921. dis_pos_y = dis_pos_y + 20;
  922. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootanimation", 1);
  923. printf("cmd=%s\n", cmd);
  924. run_command(cmd, 0);
  925. goto bootoldsys;
  926. }
  927. /****** update from update reversingtrack ******/
  928. ret = ark_update_emmc_partition("reversingtrack", "reversingtrack");
  929. mdelay(30);
  930. if (!ret) {
  931. sprintf(cmd, "setenv reversingtracksize %s", env_get("filesize"));
  932. run_command(cmd, 0);
  933. printf("cmd=%s\n", cmd);
  934. mdelay(30);
  935. sprintf((char *)cmd, "disconfig 35");
  936. run_command(cmd, 0);
  937. dis_pos_y = dis_pos_y + 20;
  938. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "reversingtrack", 0);
  939. printf("cmd=%s\n", cmd);
  940. run_command(cmd, 0);
  941. } else {
  942. dis_pos_y = dis_pos_y + 20;
  943. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "reversingtrack", 1);
  944. printf("cmd=%s\n", cmd);
  945. run_command(cmd, 0);
  946. goto bootoldsys;
  947. }
  948. #endif
  949. /****** update from update uboot back ******/
  950. ret = ark_update_emmc_partition("bootloader_bak", "update/u-boot.img");
  951. if (!ret) {
  952. sprintf(cmd, "setenv bootloadersize %s", env_get("filesize"));
  953. run_command(cmd, 0);
  954. printf("cmd=%s\n", cmd);
  955. mdelay(30);
  956. sprintf((char *)cmd, "disconfig 40");
  957. run_command(cmd, 0);
  958. dis_pos_y = dis_pos_y + 20;
  959. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootloader_bak", 0);
  960. printf("cmd=%s\n", cmd);
  961. run_command(cmd, 0);
  962. } else {
  963. dis_pos_y = dis_pos_y + 20;
  964. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "bootloader_bak", 1);
  965. printf("cmd=%s\n", cmd);
  966. run_command(cmd, 0);
  967. goto bootoldsys;
  968. }
  969. /****** update from update rootfs ******/
  970. ret = ark_PssVerify_signature("update/rootfs.ext2", "update/META-INF/rootfs.SF", "update/META-INF/rootfs.RSA", pk);
  971. if (ret == 0) {
  972. if (flag_partiton == 0)
  973. ret = ark_update_emmc_rootfs_from_media("rootfs");
  974. else
  975. ret = ark_update_emmc_rootfs_from_media("rootfs_b");
  976. if (!ret) {
  977. sprintf((char *)cmd, "disconfig 95");
  978. run_command(cmd, 0);
  979. dis_pos_y = dis_pos_y + 20;
  980. if (flag_partiton == 0)
  981. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "rootfs", 0);
  982. else
  983. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "rootfs_b", 0);
  984. printf("cmd=%s\n", cmd);
  985. run_command(cmd, 0);
  986. } else if (ret != 2) {
  987. dis_pos_y = dis_pos_y + 20;
  988. if (flag_partiton == 0)
  989. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "rootfs", 1);
  990. else
  991. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "rootfs_b", 1);
  992. printf("cmd=%s\n", cmd);
  993. run_command(cmd, 0);
  994. goto bootoldsys;
  995. }
  996. } else {
  997. dis_pos_y = dis_pos_y + 20;
  998. if (flag_partiton == 0)
  999. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "rootfs", 1);
  1000. else
  1001. sprintf((char *)cmd, "disstring %d %d %s %d", dis_pos_x, dis_pos_y, "rootfs_b", 1);
  1002. printf("cmd=%s\n", cmd);
  1003. run_command(cmd, 0);
  1004. goto bootoldsys;
  1005. }
  1006. printf("\r\n **** set the env to partition .....\r\n");
  1007. //mmc update set part A
  1008. if (!strcmp(update_dev, "mmc")) {
  1009. env_set("updata_from_part", "A");
  1010. env_set("kernel_part", "kernel");
  1011. env_set("fdt_part", "fdt");
  1012. env_set("rootfs_part", "rootfs");
  1013. env_set("emmcroot", "/dev/mmcblk0p10 ro");
  1014. sprintf(cmd, "setenv fdtsize %s", env_get("fdtsize_a"));
  1015. run_command(cmd, 0);
  1016. printf("cmd=%s\n", cmd);
  1017. mdelay(30);
  1018. sprintf(cmd, "setenv kernelsize %s", env_get("kernelsize_a"));
  1019. run_command(cmd, 0);
  1020. printf("cmd=%s\n", cmd);
  1021. mdelay(30);
  1022. } else if (!strcmp(update_dev, "usb")) {
  1023. printf(">>>>>>>>>curr_partition %s\n", curr_partition);
  1024. if (flag_partiton == 1) {
  1025. env_set("updata_from_part", "B");
  1026. env_set("kernel_part", "kernel_b");
  1027. env_set("fdt_part", "fdt_b");
  1028. env_set("rootfs_part", "rootfs_b");
  1029. env_set("emmcroot", "/dev/mmcblk0p14 ro");
  1030. sprintf(cmd, "setenv fdtsize %s", env_get("fdtsize_b"));
  1031. run_command(cmd, 0);
  1032. printf("cmd=%s\n", cmd);
  1033. mdelay(30);
  1034. sprintf(cmd, "setenv kernelsize %s", env_get("kernelsize_b"));
  1035. run_command(cmd, 0);
  1036. printf("cmd=%s\n", cmd);
  1037. mdelay(30);
  1038. #if ARK_BOOT_SECURITY
  1039. sprintf(cmd, "setenv crc_kernel %s", env_get("crc_kernel_b"));
  1040. run_command(cmd, 0);
  1041. printf("cmd=%s\n", cmd);
  1042. #endif
  1043. } else if (flag_partiton == 0) {
  1044. env_set("updata_from_part", "A");
  1045. env_set("kernel_part", "kernel");
  1046. env_set("fdt_part", "fdt");
  1047. env_set("rootfs_part", "rootfs");
  1048. env_set("emmcroot", "/dev/mmcblk0p10 ro");
  1049. sprintf(cmd, "setenv fdtsize %s", env_get("fdtsize_a"));
  1050. run_command(cmd, 0);
  1051. printf("cmd=%s\n", cmd);
  1052. mdelay(30);
  1053. sprintf(cmd, "setenv kernelsize %s", env_get("kernelsize_a"));
  1054. run_command(cmd, 0);
  1055. printf("cmd=%s\n", cmd);
  1056. mdelay(30);
  1057. #if ARK_BOOT_SECURITY
  1058. sprintf(cmd, "setenv crc_kernel %s", env_get("crc_kernel_a"));
  1059. run_command(cmd, 0);
  1060. printf("cmd=%s\n", cmd);
  1061. #endif
  1062. }
  1063. }
  1064. mdelay(5);
  1065. env_set("need_update", "no");
  1066. mdelay(5);
  1067. env_set("updata_status", "none");
  1068. sprintf(cmd, "saveenv");
  1069. printf("cmd=%s\n", cmd);
  1070. run_command(cmd, 0);
  1071. mdelay(30);
  1072. sprintf((char *)cmd, "disconfig 100");
  1073. run_command(cmd, 0);
  1074. printf("\r\n **** update the device ok! .....\r\n");
  1075. return 0;
  1076. bootoldsys:
  1077. if (!strcmp(curr_partition, "A")) {
  1078. env_set("updata_from_part", "A");
  1079. env_set("kernel_part", "kernel");
  1080. env_set("fdt_part", "fdt");
  1081. env_set("rootfs_part", "rootfs");
  1082. env_set("emmcroot", "/dev/mmcblk0p10 ro");
  1083. sprintf(cmd, "setenv fdtsize 0x%x", fdtsize);
  1084. run_command(cmd, 0);
  1085. printf("cmd=%s\n", cmd);
  1086. mdelay(30);
  1087. sprintf(cmd, "setenv kernelsize 0x%x", kernelsize);
  1088. run_command(cmd, 0);
  1089. printf("cmd=%s\n", cmd);
  1090. mdelay(30);
  1091. } else if (!strcmp(curr_partition, "B")) {
  1092. env_set("updata_from_part", "B");
  1093. env_set("kernel_part", "kernel_b");
  1094. env_set("fdt_part", "fdt_b");
  1095. env_set("rootfs_part", "rootfs_b");
  1096. env_set("emmcroot", "/dev/mmcblk0p14 ro");
  1097. sprintf(cmd, "setenv fdtsize 0x%x", fdtsize);
  1098. run_command(cmd, 0);
  1099. printf("cmd=%s\n", cmd);
  1100. mdelay(30);
  1101. sprintf(cmd, "setenv kernelsize 0x%x", kernelsize);
  1102. run_command(cmd, 0);
  1103. printf("cmd=%s\n", cmd);
  1104. mdelay(30);
  1105. }
  1106. env_set("updata_status", "error");
  1107. sprintf(cmd, "saveenv");
  1108. printf("cmd=%s\n", cmd);
  1109. run_command(cmd, 0);
  1110. mdelay(20);
  1111. sprintf((char *)cmd, "disconfig 100");
  1112. run_command(cmd, 0);
  1113. return 1;
  1114. }
  1115. #endif
  1116. #if ARK_BOOT_SECURITY
  1117. static int ark_check_kernel_from_emmc(void)
  1118. {
  1119. int ret = -1;
  1120. unsigned int file_size, crc_src, crc_kernel;
  1121. char cmd[128] = { 0 };
  1122. sprintf(cmd, "emmc read %s %s %s", env_get("loadaddr"), env_get("kernel_part"), env_get("kernelsize"));
  1123. printf("cmd=%s\n", cmd);
  1124. ret = run_command(cmd, 0);
  1125. if (ret) {
  1126. printf("emmc write data error!!!\n");
  1127. return 1;
  1128. }
  1129. crc_src = crc32(0, (const unsigned char *)dstdata, env_get_hex("kernelsize", 0));
  1130. crc_kernel = env_get_hex("crc_kernel", 0)
  1131. printf("crc_src = 0x%x,crc_kernel = 0x%x\n", crc_src, crc_kernel);
  1132. if (crc_src != crc_kernel)
  1133. return 1;
  1134. if (ret)
  1135. return 1;
  1136. return 0;
  1137. }
  1138. #endif
  1139. int board_late_init(void)
  1140. {
  1141. char cmd[128];
  1142. char *update_ota = NULL, *need_update = NULL;
  1143. unsigned int loadaddr;
  1144. int do_update = 0, update_from_mmc = 1;
  1145. int update_detect = 0;//0:no update 1:need_update env 2:usb update boot 3:sd update boot
  1146. update_ota = env_get("update_from_ota");
  1147. need_update = env_get("need_update");
  1148. if (!strcmp(need_update, "yes"))
  1149. update_detect = 1;
  1150. else if ((rSYS_BOOT_SAMPLE & 7) == 5)
  1151. update_detect = 2;
  1152. else if ((rSYS_BOOT_SAMPLE & 7) == 4)
  1153. update_detect = 3;
  1154. //由于usb升级检测的时候,会需要一段时间所以这个地方需要时间长一些,设置6s
  1155. ark_watchdog_start(6000);
  1156. printf("update_detect=%d.\n", update_detect);
  1157. if (update_detect) {
  1158. loadaddr = env_get_hex("loadaddr", 0);
  1159. if (loadaddr)
  1160. memset((void *)loadaddr, 0, strlen(ARK1668ED_UPDATE_MAGIC));
  1161. if (update_detect == 1 || update_detect == 3) {
  1162. #if ARK_UPDATE_SECURITY
  1163. sprintf(cmd, "zipread mmc %s %s update.zip update/update-magic", env_get("sd_dev_part"), env_get("loadaddr"));
  1164. #else
  1165. sprintf(cmd, "fatload %s %s %s update-magic", "mmc", env_get("update_dev_part"), env_get("loadaddr"));
  1166. #endif
  1167. run_command(cmd, 0);
  1168. if (loadaddr && !memcmp((void *)loadaddr, ARK1668ED_UPDATE_MAGIC, strlen(ARK1668ED_UPDATE_MAGIC))) {
  1169. do_update = 1;
  1170. goto update_done;
  1171. } else {
  1172. printf("Wrong update magic, do not update from mmc.\n");
  1173. }
  1174. }
  1175. if (update_detect == 1 || update_detect == 2) {
  1176. run_command("usb start", 0);
  1177. #if ARK_UPDATE_SECURITY
  1178. sprintf(cmd, "zipread usb 0 %s update.zip update/update-magic", env_get("loadaddr"));
  1179. #else
  1180. sprintf(cmd, "fatload %s %s %s update-magic", "usb", "0", env_get("loadaddr"));
  1181. #endif
  1182. run_command(cmd, 0);
  1183. if (loadaddr && !memcmp((void *)loadaddr, ARK1668ED_UPDATE_MAGIC, strlen(ARK1668ED_UPDATE_MAGIC))) {
  1184. do_update = 1;
  1185. update_from_mmc = 0;
  1186. goto update_done;
  1187. } else {
  1188. printf("Wrong update magic, do not update from usb.\n");
  1189. }
  1190. }
  1191. }
  1192. if (!strcmp(update_ota, "yes")) {
  1193. do_update = 0;
  1194. //升级的时候关闭看门够功能
  1195. ark_watchdog_stop();
  1196. sprintf(cmd, "update_from_emmc_ota");
  1197. printf("cmd=%s\n", cmd);
  1198. run_command(cmd, 0);
  1199. }
  1200. update_done:
  1201. if (do_update) {
  1202. //升级的时候关闭看门够功能
  1203. ark_watchdog_stop();
  1204. run_command("emmc erase.part userdata", 0);
  1205. env_set("need_update", "no");
  1206. env_set("do_update", "yes");
  1207. #if ARK_UPDATE_SECURITY
  1208. ark_secured_update_from_media(update_from_mmc);
  1209. #else
  1210. ark_do_update_from_media(update_from_mmc);
  1211. #endif
  1212. } else {
  1213. env_set("do_update", "no");
  1214. }
  1215. return 0;
  1216. }
  1217. #endif