ark_common.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include <common.h>
  2. #include <dm.h>
  3. #include <asm/arch/ark-common.h>
  4. struct SYS_INFO sys_info;
  5. #if 1
  6. //watchdog
  7. //#define PCLK_FREQ 80000000 //APBPLL_CLK/6
  8. #define WDT_BASE 0xe4b00000
  9. #define rWDT_CR (*(volatile unsigned int *)(WDT_BASE + 0x00))
  10. #define rWDT_PSR (*(volatile unsigned int *)(WDT_BASE + 0x04))
  11. #define rWDT_LDR (*(volatile unsigned int *)(WDT_BASE + 0x08))
  12. #define rWDT_VLR (*(volatile unsigned int *)(WDT_BASE + 0x0C))
  13. #define rWDT_ISR (*(volatile unsigned int *)(WDT_BASE + 0x10))
  14. #define rWDT_RCR (*(volatile unsigned int *)(WDT_BASE + 0x14))
  15. #define rWDT_TMR (*(volatile unsigned int *)(WDT_BASE + 0x18))
  16. #define rWDT_TCR (*(volatile unsigned int *)(WDT_BASE + 0x1C))
  17. void ark_watchdog_start(int time_ms)
  18. {
  19. u32 freq = ark_get_apb_clock();
  20. printf("wdt reset timer %d,freq %d\n",time_ms,freq);
  21. rWDT_CR = 0;
  22. rWDT_CR = 0x3 << 4; /* 128 div */
  23. rWDT_PSR = 0x400; //0x100;/* 256 prescale */
  24. rWDT_LDR = (freq/1000)*time_ms / 128 / 0x400;
  25. rWDT_CR |= 3 << 0;
  26. }
  27. void ark_watchdog_stop(void){
  28. rWDT_CR = 0;
  29. }
  30. #endif
  31. //crc校验从卡或者u盘以及其他设备,用来升级的源数据
  32. int ark_check_data_from_devide(char *file_name,unsigned int crc_data)
  33. {
  34. char *update_fdt = NULL;
  35. unsigned int size;
  36. update_fdt = env_get("boardfdt");
  37. size = strlen(update_fdt);
  38. printf("update_fdt:%s,size %d,file_name %s\n", update_fdt,size,file_name);
  39. if(!strncmp(file_name, "u-boot.img", 10)){
  40. if(sys_info.uboot_crc != 0){
  41. if(crc_data != sys_info.uboot_crc)
  42. return 1;
  43. }else
  44. sys_info.uboot_crc = crc_data;
  45. }
  46. else if(!strncmp(file_name, "zImage", 6)){
  47. if(sys_info.zImage_crc != 0){
  48. if(crc_data != sys_info.zImage_crc)
  49. return 1;
  50. }else
  51. sys_info.zImage_crc = crc_data;
  52. }
  53. else if(!strncmp(file_name, "rootfs.ubi", 10)){
  54. if(sys_info.rootfs_crc != 0){
  55. if(crc_data != sys_info.rootfs_crc)
  56. return 1;
  57. }else
  58. sys_info.rootfs_crc = crc_data;
  59. }
  60. else if(!strncmp(file_name, "bootanimation", 13)){
  61. if(sys_info.bootanimation_crc != 0){
  62. if(crc_data != sys_info.bootanimation_crc)
  63. return 1;
  64. }else
  65. sys_info.bootanimation_crc = crc_data;
  66. }
  67. else if(!strncmp(file_name, "bootlogo", 8)){
  68. if(sys_info.bootlogo_crc != 0){
  69. if(crc_data != sys_info.bootlogo_crc)
  70. return 1;
  71. }else
  72. sys_info.bootlogo_crc = crc_data;
  73. }
  74. else if(!strncmp(file_name, update_fdt, size)){
  75. if(sys_info.fdt_crc != 0){
  76. if(crc_data != sys_info.fdt_crc)
  77. return 1;
  78. }else
  79. sys_info.fdt_crc = crc_data;
  80. }
  81. else if(!strncmp(file_name, "ubootspl.bin", 12)){
  82. if(sys_info.ubootspl_crc != 0){
  83. if(crc_data != sys_info.ubootspl_crc)
  84. return 1;
  85. }else
  86. sys_info.ubootspl_crc = crc_data;
  87. }
  88. return 0;
  89. }
  90. //crc校验从分区中读取的数据,保证烧写的数据的一致性
  91. int ark_check_data_from_partition(char *part_name,unsigned int crc_data)
  92. {
  93. if(!strncmp(part_name, "bootloader", 10)){
  94. if(sys_info.zImage_crc != 0)
  95. if(crc_data != sys_info.uboot_crc)
  96. return 1;
  97. }
  98. if(!strncmp(part_name, "bootloader_bak", 14)){
  99. if(sys_info.zImage_crc != 0)
  100. if(crc_data != sys_info.uboot_crc)
  101. return 1;
  102. }
  103. else if(!strncmp(part_name, "kernel", 6)){
  104. if(sys_info.zImage_crc != 0)
  105. if(crc_data != sys_info.zImage_crc)
  106. return 1;
  107. }
  108. else if(!strncmp(part_name, "rootfs", 6)){
  109. if(sys_info.rootfs_crc != 0)
  110. if(crc_data != sys_info.rootfs_crc)
  111. return 1;
  112. }
  113. else if(!strncmp(part_name, "fdt", 13)){
  114. if(sys_info.bootanimation_crc != 0)
  115. if(crc_data != sys_info.fdt_crc)
  116. return 1;
  117. }
  118. else if(!strncmp(part_name, "bootanimation", 13)){
  119. if(sys_info.bootanimation_crc != 0)
  120. if(crc_data != sys_info.bootanimation_crc)
  121. return 1;
  122. }
  123. else if(!strncmp(part_name, "bootstrap", 9)){
  124. if(sys_info.ubootspl_crc != 0)
  125. if(crc_data != sys_info.ubootspl_crc)
  126. return 1;
  127. }
  128. else if(!strncmp(part_name, "bootlogo", 8)){
  129. if(sys_info.bootlogo_crc != 0)
  130. if(crc_data != sys_info.bootlogo_crc)
  131. return 1;
  132. }
  133. return 0;
  134. }
  135. int get_crc_data_from_device(char *file_name)
  136. {
  137. int ret = -1;
  138. unsigned int file_size;
  139. char cmd[128] = { 0 };
  140. unsigned int *srcdata = (unsigned int *)(env_get_hex("loadaddr", 0));
  141. memset(&sys_info, 0, sizeof(sys_info));
  142. printf("file_name=%s\n", file_name);
  143. sprintf(cmd, "fatload %s %s %s %s",env_get("update_dev_type"),env_get("update_dev_part"),env_get("loadaddr"), file_name);
  144. printf("cmd=%s\n", cmd);
  145. ret = run_command(cmd, 0);
  146. if(ret)
  147. return 1;
  148. file_size = env_get_ulong("filesize", 16, 0x2000);
  149. memcpy(&sys_info, srcdata, file_size);
  150. // printf("uboot_crc = 0x%x\n",sys_info.uboot_crc);
  151. // printf("fdt_crc = 0x%x\n",sys_info.fdt_crc);
  152. // printf("zImage_crc = 0x%x\n",sys_info.zImage_crc);
  153. // printf("rootfs_crc = 0x%x\n",sys_info.rootfs_crc);
  154. // printf("ubootspl_crc = 0x%x\n",sys_info.ubootspl_crc);
  155. // printf("bootanimation_crc = 0x%x\n",sys_info.bootanimation_crc);
  156. // printf("bootlogo_crc = 0x%x\n",sys_info.bootlogo_crc);
  157. return 0;
  158. }
  159. int get_data_from_media(char *file_name)
  160. {
  161. int ret = -1;
  162. unsigned int file_size,crc_src;
  163. char cmd[128] = { 0 };
  164. unsigned int *srcdata = (unsigned int *)(env_get_hex("loadaddr", 0));
  165. sprintf(cmd, "fatload %s %s %s %s",env_get("update_dev_type"),env_get("update_dev_part"),env_get("loadaddr"), file_name);
  166. printf("cmd=%s\n", cmd);
  167. ret = run_command(cmd, 0);
  168. if(ret)
  169. {
  170. printf("Load %s from tf/usb error!!\n",file_name);
  171. return 1;
  172. }
  173. file_size = env_get_ulong("filesize", 16, 0x2000);
  174. crc_src = crc32(0, (const unsigned char *)srcdata, file_size);
  175. ret = ark_check_data_from_devide(file_name,crc_src);
  176. if(ret)
  177. {
  178. printf("check data %s from tf/usb crc error!!\n",file_name);
  179. return 1;
  180. }
  181. return 0;
  182. }