AuthLicense_main.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include "driver.h"
  4. #include <string.h>
  5. #include "hal_interface_api.h"
  6. #include <fcntl.h>
  7. /*
  8. i2c-scan -b 0
  9. */
  10. void help()
  11. {
  12. printf("authlicense -w \n");
  13. printf(" -Write new license to flash. Input [128 bytes license]\n");
  14. printf("authlicense -r \n");
  15. printf(" -Read license form flash\n");
  16. printf("authlicense -guid \n");
  17. printf(" -Read device GUID.\n");
  18. }
  19. void saveToFlash(uint8_t *license)
  20. {
  21. iflash_t iflash_arg;
  22. int ret = 0;
  23. int fd = open("/dev/iflash", O_RDWR);
  24. ret = ioctl(fd, IFLASH_UNLOCK, NULL);
  25. if(ret != 0)
  26. {
  27. printf("error: ret = %d\n", ret);
  28. }
  29. iflash_arg.sector = 7;
  30. ret = ioctl(fd, IFLASH_ERASESECTOR, &iflash_arg);
  31. if(ret != 0)
  32. {
  33. printf("error: ret = %d\n", ret);
  34. }
  35. iflash_arg.address = 0x08060000;
  36. iflash_arg.len = 128;
  37. memcpy(iflash_arg.data, license, 128);
  38. ret = ioctl(fd, IFLASH_WRITEBYTE, &iflash_arg);
  39. if(ret != 0)
  40. {
  41. printf("error: ret = %d\n", ret);
  42. }
  43. ret = ioctl(fd, IFLASH_LOCK, NULL);
  44. if(ret != 0)
  45. {
  46. printf("error: ret = %d\n", ret);
  47. }
  48. close(fd);
  49. }
  50. int main(int argc, char* argv[])
  51. {
  52. int i;
  53. char chr;
  54. uint8_t tmp;
  55. uint32_t tmp1;
  56. uint8_t GUID[12] = {0};
  57. uint32_t *pUID = (uint32_t*)0x1FFF7A10;
  58. uint8_t *pLicense = (uint8_t*)0x08060000;
  59. uint8_t HexLicense[128] = {0};
  60. uint8_t CharLicense[256+10] = {0};
  61. iflash_t iflash_arg;
  62. if(argc != 2)
  63. {
  64. help();
  65. return -1;
  66. }
  67. if(strcmp(argv[1], "-test") == 0)
  68. {
  69. int fd = open("/dev/iflash", O_RDWR);
  70. ioctl(fd, IFLASH_UNLOCK, NULL);
  71. iflash_arg.sector = 7;
  72. ioctl(fd, IFLASH_ERASESECTOR, &iflash_arg);
  73. iflash_arg.address = 0x08060000;
  74. iflash_arg.len = 8;
  75. iflash_arg.data[0] = 1;
  76. iflash_arg.data[1] = 2;
  77. iflash_arg.data[2] = 3;
  78. iflash_arg.data[3] = 4;
  79. iflash_arg.data[4] = 5;
  80. iflash_arg.data[5] = 6;
  81. iflash_arg.data[6] = 7;
  82. iflash_arg.data[7] = 8;
  83. ioctl(fd, IFLASH_WRITEBYTE, &iflash_arg);
  84. ioctl(fd, IFLASH_LOCK, NULL);
  85. close(fd);
  86. return 0;
  87. }
  88. //读取License
  89. if(strcmp(argv[1], "-r") == 0)
  90. {
  91. printf("License: ");
  92. for(i=0;i<128;i++)
  93. {
  94. if(i%32 == 0)
  95. printf("\t\n");
  96. printf("%02x", *pLicense);
  97. pLicense++;
  98. }
  99. printf("\n");
  100. }
  101. //写入License
  102. else if(strcmp(argv[1], "-w") == 0)
  103. {
  104. while(1)
  105. {
  106. memset(CharLicense, 0, sizeof(CharLicense));
  107. printf("\nPlease input license(128 bytes): ");
  108. scanf("%s", CharLicense);
  109. //检查License长度
  110. if(strlen(CharLicense) != 256)
  111. {
  112. printf("License length is 128 bytes, but input is %d bytes! Please re input!\n", (strlen(CharLicense)+1)/2);
  113. continue;
  114. }
  115. for(i=0;i<128;i++)
  116. {
  117. //获取高4位
  118. chr = CharLicense[2*i+0];
  119. if((chr >= '0') && (chr <= '9'))
  120. {
  121. tmp = chr - '0';
  122. }
  123. else if((chr >= 'a') && (chr <= 'f'))
  124. {
  125. tmp = chr - 'a' + 10;
  126. }
  127. else if((chr >= 'A') && (chr <= 'F'))
  128. {
  129. tmp = chr - 'A' + 10;
  130. }
  131. else
  132. {
  133. printf("Invalid char %s\n", chr);
  134. return -1;
  135. }
  136. HexLicense[i] = tmp<<4;
  137. //获取低4位
  138. chr = CharLicense[2*i+1];
  139. if((chr >= '0') && (chr <= '9'))
  140. {
  141. tmp = chr - '0';
  142. }
  143. else if((chr >= 'a') && (chr <= 'f'))
  144. {
  145. tmp = chr - 'a' + 10;
  146. }
  147. else if((chr >= 'A') && (chr <= 'F'))
  148. {
  149. tmp = chr - 'A' + 10;
  150. }
  151. else
  152. {
  153. printf("Invalid char %s\n", chr);
  154. return -1;
  155. }
  156. HexLicense[i] |= tmp;
  157. }
  158. //获取GUID
  159. for(i=0;i<3;i++)
  160. {
  161. tmp1 = *pUID;
  162. GUID[4*i+0] = tmp1&0xff;
  163. GUID[4*i+1] = (tmp1>>8)&0xff;
  164. GUID[4*i+2] = (tmp1>>16)&0xff;
  165. GUID[4*i+3] = (tmp1>>24)&0xff;
  166. pUID++;
  167. }
  168. //检查Licnese是否有效
  169. if(CheckLicense(GUID, HexLicense) == 0)
  170. {
  171. //将license写入Flash
  172. saveToFlash(HexLicense);
  173. printf("Save license to falsh ok.\n");
  174. //唤醒后台监控脚本
  175. system("killall -9 damon.sh");
  176. system("damon.sh &");
  177. return 0;
  178. }
  179. else
  180. continue;
  181. }
  182. }
  183. //读取GUID
  184. else if(strcmp(argv[1], "-guid") == 0)
  185. {
  186. printf("GUID: ");
  187. for(i=0;i<3;i++)
  188. {
  189. tmp1 = *pUID;
  190. GUID[4*i+0] = tmp1&0xff;
  191. GUID[4*i+1] = (tmp1>>8)&0xff;
  192. GUID[4*i+2] = (tmp1>>16)&0xff;
  193. GUID[4*i+3] = (tmp1>>24)&0xff;
  194. pUID++;
  195. printf("%02x %02x %02x %02x ", GUID[4*i+0],GUID[4*i+1],GUID[4*i+2],GUID[4*i+3]);
  196. }
  197. printf("\n");
  198. }
  199. else
  200. {
  201. printf("Invalid param %s\n", argv[1]);
  202. help();
  203. return -1;
  204. }
  205. return 0;
  206. }