main.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #include <errno.h>
  5. #include <unistd.h>
  6. #include <gfaserial.h>
  7. #include <byteswap.h>
  8. #include <gfabootlmast.h>
  9. #include "bl_commands.h"
  10. #ifdef _TARGET_BUILD
  11. #define _DEVICE_NAME "/dev/ttyO4"
  12. #else
  13. #define _DEVICE_NAME "/dev/tty0"
  14. #endif // _TARGET_BUILD
  15. #define _SLAVE_NODE_ADDR 0xFF
  16. #define _BL_MATERIAL "G.Z.40015 P01"
  17. #define _BL_SERIAL "18-080015 1409" // "012345678901234"
  18. #define TRACE(...) printf(__VA_ARGS__), fflush(stdout)
  19. #if 0
  20. #define TRACE_FRAME(f) GfaMininetMasterDumpFrame(stdout, f)
  21. #else
  22. #define TRACE_FRAME(f)
  23. #endif
  24. #define _countof(a) (sizeof(a) / sizeof(*a))
  25. ////////////////////////////////////////////////////////////////////////////////////
  26. ////////////////////////////////////////////////////////////////////////////////////
  27. #define GFA_APP_BOOTLOADER_START_ADDRESS ((uint32_t)0x00000000)
  28. #define GFA_APP_APPLICATION_START_ADDRESS ((uint32_t)0x00002000)
  29. #define GFA_APP_MAX_IMG_MATERIAL_NUM_LENGTH 16 // including the zero terminator
  30. #define GFA_APP_MAX_IMG_NAME_BUILD_LENGTH 24 // including the zero terminator
  31. #define GFA_APP_IMG_HEADER_PREFIX_0 ((uint32_t)0xFF01FF02)
  32. #define GFA_APP_IMG_HEADER_PREFIX_1 ((uint32_t)0xFF03FF04)
  33. ////////////////////////////////////////////////////////////////////////////////////
  34. typedef struct _GFA_APP_IMG_HEADER
  35. {
  36. const uintptr_t nPrefix0;
  37. const uintptr_t nPrefix1;
  38. const uintptr_t nImgLength;
  39. const uintptr_t nImgCRC32;
  40. const uintptr_t nReserved[4];
  41. union
  42. {
  43. struct
  44. {
  45. const char * const pszImgMaterialNum;
  46. const char * const pszImgNameBuild;
  47. }app;
  48. struct
  49. {
  50. const char szImgMaterialNum[GFA_APP_MAX_IMG_MATERIAL_NUM_LENGTH];
  51. const char szImgNameBuild[GFA_APP_MAX_IMG_NAME_BUILD_LENGTH];
  52. }bl;
  53. };
  54. }GFA_APP_IMG_HEADER, *LPGFA_APP_IMG_HEADER;
  55. typedef const GFA_APP_IMG_HEADER *LPCGFA_APP_IMG_HEADER;
  56. ////////////////////////////////////////////////////////////////////////////////////
  57. ////////////////////////////////////////////////////////////////////////////////////
  58. static ssize_t _DataPayloadFromMininetFrame(LPCGFA_MININET_FRAME pFrame, void *pData, size_t nCbData)
  59. {
  60. if(pFrame && pData && nCbData)
  61. {
  62. if(pFrame->len > 6)
  63. {
  64. size_t nDatalen = (size_t)pFrame->len - 6;
  65. if(nDatalen <= nCbData)
  66. {
  67. memcpy(pData, &pFrame->data.by[1], nDatalen);
  68. return (ssize_t)nDatalen;
  69. }
  70. }
  71. }
  72. errno = EINVAL;
  73. return -1;
  74. }
  75. ////////////////////////////////////////////////////////////////////////////////////
  76. static ssize_t _PollBlData(HGFAMINEMST hMst, void *pData, size_t nCbData, uint32_t nTimeoutMS)
  77. {
  78. if(hMst && pData && nCbData)
  79. {
  80. size_t s, nReceived = 0;
  81. struct timeval tvRX;
  82. ssize_t nRet = -1;
  83. uint8_t cmd[32];
  84. uint8_t txb[32];
  85. uint8_t rxb[512];
  86. uint8_t *pszData = (uint8_t*)pData;
  87. tvRX.tv_sec = nTimeoutMS / 1000;
  88. tvRX.tv_usec = (nTimeoutMS % 1000) * 1000;
  89. GfaMininetMasterSaveTimeouts(hMst);
  90. GfaMininetMasterSetTimeouts(hMst, &tvRX, NULL);
  91. while(nReceived < nCbData)
  92. {
  93. s = GfaBLM_BuildCmdDataPacket("BU", NULL, 0, cmd, sizeof(cmd), true);
  94. nRet = GfaMininetMasterBuildFrame(hMst, _SLAVE_NODE_ADDR, 0, cmd, s, txb, sizeof(txb));
  95. if((nRet = GfaMininetMasterTransmitFrame(hMst, txb, nRet)) <= 0)
  96. {
  97. nRet = -1;
  98. break;
  99. }
  100. if((nRet = GfaMininetMasterReceiveFrame(hMst, rxb, sizeof(rxb), true)) > 0)
  101. {
  102. uint8_t nIndex;
  103. nRet = GfaMininetMasterEvaluateSlaveResponse(hMst, _SLAVE_NODE_ADDR, rxb, nRet, true, &nIndex);
  104. if(nRet == MINET_SLAVE_RESPONSE_SUCCESS)
  105. {
  106. TRACE_FRAME((LPCGFA_MININET_FRAME)rxb);
  107. if((nRet = _DataPayloadFromMininetFrame((LPCGFA_MININET_FRAME)rxb, pszData, nCbData - nReceived)) > 0)
  108. {
  109. pszData += nRet;
  110. nReceived += nRet;
  111. }
  112. }
  113. else if(nRet == MINET_SLAVE_RESPONSE_ACK)
  114. {
  115. TRACE("\nACK ...\n");
  116. }
  117. }
  118. else
  119. {
  120. nReceived = nRet;
  121. break;
  122. }
  123. }
  124. GfaMininetMasterRestoreTimeouts(hMst);
  125. return nReceived;
  126. }
  127. errno = EINVAL;
  128. return -1;
  129. }
  130. static int _BlPing(HGFAMINEMST hMst)
  131. {
  132. uint8_t nIndex;
  133. ssize_t nRet, nLen;
  134. uint8_t nCmd = COMMAND_PING;
  135. char txb[32], rxb[32], cmd[8], ack[2];
  136. size_t s = GfaBLM_BuildCmdDataPacket("BU", &nCmd, 1, cmd, sizeof(cmd), true);
  137. nLen = GfaMininetMasterBuildFrame(hMst, _SLAVE_NODE_ADDR, 0, cmd, s, txb, sizeof(txb));
  138. TRACE_FRAME((LPCGFA_MININET_FRAME)txb);
  139. if((nRet = GfaMininetMasterTransmitFrame(hMst, txb, nLen)) < nLen)
  140. return nRet;
  141. if((nRet = GfaMininetMasterReceiveFrame(hMst, rxb, sizeof(rxb), true)) < 0)
  142. return nRet;
  143. nRet = GfaMininetMasterEvaluateSlaveResponse(hMst, _SLAVE_NODE_ADDR, rxb, nRet, true, &nIndex);
  144. if( (nRet == MINET_SLAVE_RESPONSE_SUCCESS) ||
  145. (nRet == MINET_SLAVE_RESPONSE_ACK))
  146. {
  147. if(nRet == MINET_SLAVE_RESPONSE_SUCCESS)
  148. {
  149. TRACE_FRAME((LPCGFA_MININET_FRAME)rxb);
  150. if((nRet = _DataPayloadFromMininetFrame((LPCGFA_MININET_FRAME)rxb, ack, 2)) != 2)
  151. return -1;
  152. }
  153. else
  154. {
  155. if((nRet = _PollBlData(hMst, ack, 2, 200)) != 2)
  156. return -1;
  157. }
  158. if(ack[0] == 0)
  159. {
  160. return (ack[1] == COMMAND_ACK);
  161. }
  162. }
  163. else if(nRet == MINET_SLAVE_RESPONSE_INDEX_IS_STATUS_CODE)
  164. {
  165. }
  166. return -1;
  167. }
  168. static int _BlGetStatus(HGFAMINEMST hMst, uint8_t *pbStatus)
  169. {
  170. uint8_t nIndex;
  171. ssize_t nRet, nLen;
  172. uint8_t nCmd = COMMAND_GET_STATUS;
  173. char txb[32], rxb[32], cmd[8], ack[3], stat[3];
  174. size_t s = GfaBLM_BuildCmdDataPacket("BU", &nCmd, 1, cmd, sizeof(cmd), true);
  175. nLen = GfaMininetMasterBuildFrame(hMst, _SLAVE_NODE_ADDR, 0, cmd, s, txb, sizeof(txb));
  176. TRACE_FRAME((LPCGFA_MININET_FRAME)txb);
  177. if((nRet = GfaMininetMasterTransmitFrame(hMst, txb, nLen)) < nLen)
  178. return nRet;
  179. if((nRet = GfaMininetMasterReceiveFrame(hMst, rxb, sizeof(rxb), true)) < 0)
  180. return nRet;
  181. nRet = GfaMininetMasterEvaluateSlaveResponse(hMst, _SLAVE_NODE_ADDR, rxb, nRet, true, &nIndex);
  182. if( (nRet == MINET_SLAVE_RESPONSE_SUCCESS) ||
  183. (nRet == MINET_SLAVE_RESPONSE_ACK))
  184. {
  185. if(nRet == MINET_SLAVE_RESPONSE_SUCCESS)
  186. {
  187. TRACE_FRAME((LPCGFA_MININET_FRAME)rxb);
  188. if((nRet = _DataPayloadFromMininetFrame((LPCGFA_MININET_FRAME)rxb, ack, 2)) != 2)
  189. return -1;
  190. }
  191. else
  192. {
  193. if((nRet = _PollBlData(hMst, ack, 2, 200)) != 2)
  194. return -1;
  195. }
  196. if(ack[0] == 0)
  197. {
  198. if(ack[1] == COMMAND_ACK)
  199. {
  200. if((nRet = _PollBlData(hMst, stat, 3, 200)) != 3)
  201. return -1;
  202. if((stat[0] == 3) && (stat[1] == stat[2]))
  203. {
  204. if(pbStatus)
  205. *pbStatus = stat[2];
  206. nLen = GfaMininetMasterBuildFrame(hMst, _SLAVE_NODE_ADDR, 0, "BU\xCC", 3, txb, sizeof(txb));
  207. TRACE_FRAME((LPCGFA_MININET_FRAME)txb);
  208. if((nRet = GfaMininetMasterTransmitFrame(hMst, txb, nLen)) != nLen)
  209. return nRet;
  210. if((nRet = GfaMininetMasterReceiveFrame(hMst, rxb, sizeof(rxb), true)) <= 0)
  211. return nRet;
  212. nRet = GfaMininetMasterEvaluateSlaveResponse(hMst, _SLAVE_NODE_ADDR, rxb, nRet, true, &nIndex);
  213. return 0;
  214. }
  215. else
  216. {
  217. }
  218. }
  219. }
  220. }
  221. else if(nRet == MINET_SLAVE_RESPONSE_INDEX_IS_STATUS_CODE)
  222. {
  223. // TODO!
  224. }
  225. return -1;
  226. }
  227. static int _BlSetBaudrate(HGFAMINEMST hMst, uint32_t nNewBaudrate)
  228. {
  229. uint8_t nIndex;
  230. size_t s;
  231. ssize_t nRet, nLen;
  232. char txb[32], rxb[32], cmd[8];
  233. uint32_t nBaudrate = bswap_32(nNewBaudrate);
  234. s = GfaBLM_BuildCmdDataPacket("BB", &nBaudrate, sizeof(nBaudrate), cmd, sizeof(cmd), false);
  235. nLen = GfaMininetMasterBuildFrame(hMst, _SLAVE_NODE_ADDR, 0, cmd, s, txb, sizeof(txb));
  236. TRACE_FRAME((LPCGFA_MININET_FRAME)txb);
  237. if((nRet = GfaMininetMasterTransmitFrame(hMst, txb, nLen)) != nLen)
  238. return nRet;
  239. if((nRet = GfaMininetMasterReceiveFrame(hMst, rxb, sizeof(rxb), true)) < 0)
  240. return nRet;
  241. nRet = GfaMininetMasterEvaluateSlaveResponse(hMst, _SLAVE_NODE_ADDR, rxb, nRet, true, &nIndex);
  242. if(nRet == MINET_SLAVE_RESPONSE_ACK)
  243. {
  244. GFA_SER_CFG_PARAMS scp;
  245. if((nRet = GfaMininetMasterGetConfigParams(hMst, &scp, sizeof(scp))) == sizeof(scp))
  246. {
  247. scp.baud = nNewBaudrate;
  248. return GfaMininetMasterSetConfigParams(hMst, &scp, sizeof(scp));
  249. }
  250. }
  251. return -1;
  252. }
  253. static int _BlDumpMemory(HGFAMINEMST hMst, uint32_t nAddress, uint32_t nCntDwords, void *pBuffer, size_t nCbBuffer)
  254. {
  255. uint8_t nIndex;
  256. size_t s;
  257. ssize_t nRet, nLen;
  258. char txb[32], rxb[128], cmd[10], dmp[sizeof(uint32_t) * nCntDwords];
  259. if(nCntDwords > 16)
  260. nCntDwords = 16;
  261. if((nCntDwords * sizeof(uint32_t)) > nCbBuffer)
  262. return -1;
  263. struct _MEM
  264. {
  265. uint32_t nAddr;
  266. uint32_t nCount;
  267. }mem = {bswap_32(nAddress), bswap_32(nCntDwords)};
  268. s = GfaBLM_BuildCmdDataPacket("BD", &mem, sizeof(mem), cmd, sizeof(cmd), false);
  269. nLen = GfaMininetMasterBuildFrame(hMst, _SLAVE_NODE_ADDR, 0, cmd, s, txb, sizeof(txb));
  270. TRACE_FRAME((LPCGFA_MININET_FRAME)txb);
  271. if((nRet = GfaMininetMasterTransmitFrame(hMst, txb, nLen)) != nLen)
  272. return nRet;
  273. if((nRet = GfaMininetMasterReceiveFrame(hMst, rxb, sizeof(rxb), true)) < 0)
  274. return nRet;
  275. nRet = GfaMininetMasterEvaluateSlaveResponse(hMst, _SLAVE_NODE_ADDR, rxb, nRet, true, &nIndex);
  276. if(nRet == MINET_SLAVE_RESPONSE_SUCCESS)
  277. {
  278. TRACE_FRAME((LPCGFA_MININET_FRAME)rxb);
  279. if((nRet = _DataPayloadFromMininetFrame((LPCGFA_MININET_FRAME)rxb, dmp, sizeof(uint32_t) * nCntDwords)) != (ssize_t)(sizeof(uint32_t) * nCntDwords))
  280. return -1;
  281. memcpy(pBuffer, dmp, sizeof(uint32_t) * nCntDwords);
  282. return 0;
  283. }
  284. else if(nRet == MINET_SLAVE_RESPONSE_ACK)
  285. {
  286. if((nRet = _PollBlData(hMst, dmp, sizeof(uint32_t) * nCntDwords, 200)) != (ssize_t)(sizeof(uint32_t) * nCntDwords))
  287. return -1;
  288. memcpy(pBuffer, dmp, sizeof(uint32_t) * nCntDwords);
  289. return 0;
  290. }
  291. return -1;
  292. }
  293. static int _BlReadMaterialAndSerial(HGFAMINEMST hMst, char *pszMaterial, size_t nCbMaterial, char *pszSerial, size_t nCbSerial)
  294. {
  295. uint8_t nIndex;
  296. ssize_t nRet, nLen;
  297. char txb[32], rxb[64], data[32];
  298. if(!pszMaterial || (nCbMaterial < 16) || !pszSerial || (nCbSerial < 16))
  299. return -1;
  300. nLen = GfaMininetMasterBuildFrame(hMst, _SLAVE_NODE_ADDR, 0, "BR", 2, txb, sizeof(txb));
  301. TRACE_FRAME((LPCGFA_MININET_FRAME)txb);
  302. if((nRet = GfaMininetMasterTransmitFrame(hMst, txb, nLen)) != nLen)
  303. return nRet;
  304. if((nRet = GfaMininetMasterReceiveFrame(hMst, rxb, sizeof(rxb), true)) < 0)
  305. return nRet;
  306. nRet = GfaMininetMasterEvaluateSlaveResponse(hMst, _SLAVE_NODE_ADDR, rxb, nRet, true, &nIndex);
  307. if(nRet == MINET_SLAVE_RESPONSE_SUCCESS)
  308. {
  309. TRACE_FRAME((LPCGFA_MININET_FRAME)rxb);
  310. if((nRet = _DataPayloadFromMininetFrame((LPCGFA_MININET_FRAME)rxb, data, sizeof(data))) != sizeof(data))
  311. return -1;
  312. memcpy(pszMaterial, data, 16);
  313. pszMaterial[15] = '\0';
  314. memcpy(pszSerial, &data[16], 16);
  315. pszSerial[15] = '\0';
  316. return 0;
  317. }
  318. else if(nRet == MINET_SLAVE_RESPONSE_ACK)
  319. {
  320. if((nRet = _PollBlData(hMst, data, sizeof(data), 200)) != (ssize_t)sizeof(data))
  321. return -1;
  322. memcpy(pszMaterial, data, 16);
  323. pszMaterial[15] = '\0';
  324. memcpy(pszSerial, &data[16], 16);
  325. pszSerial[15] = '\0';
  326. return 0;
  327. }
  328. return -1;
  329. }
  330. static int _BlWriteMaterialAndSerial(HGFAMINEMST hMst, const char *pszMaterial, const char *pszSerial)
  331. {
  332. uint8_t nIndex;
  333. size_t s;
  334. ssize_t nRet, nLen;
  335. size_t nLenMaterial, nLenSerial;
  336. struct _TS
  337. {
  338. char szMaterial[16];
  339. char szSerial[16];
  340. }ts;
  341. char txb[64], rxb[32], cmd[64];
  342. if(!pszMaterial || !pszSerial)
  343. return -1;
  344. nLenMaterial = strlen(pszMaterial);
  345. nLenSerial = strlen(pszSerial);
  346. if((nLenMaterial > 15) || (nLenSerial > 15))
  347. return -1;
  348. memcpy(ts.szMaterial, pszMaterial, nLenMaterial);
  349. if(nLenMaterial < 15)
  350. memset(&ts.szMaterial[nLenMaterial], ' ', 15 - nLenMaterial);
  351. ts.szMaterial[15] = '\0';
  352. memcpy(ts.szSerial, pszSerial, nLenSerial);
  353. if(nLenSerial < 15)
  354. memset(&ts.szSerial[nLenSerial], ' ', 15 - nLenSerial);
  355. ts.szSerial[15] = '\0';
  356. s = GfaBLM_BuildCmdDataPacket("BW", &ts, sizeof(ts), cmd, sizeof(cmd), false);
  357. nLen = GfaMininetMasterBuildFrame(hMst, _SLAVE_NODE_ADDR, 0, cmd, s, txb, sizeof(txb));
  358. TRACE_FRAME((LPCGFA_MININET_FRAME)txb);
  359. if((nRet = GfaMininetMasterTransmitFrame(hMst, txb, nLen)) != nLen)
  360. return nRet;
  361. if((nRet = GfaMininetMasterReceiveFrame(hMst, rxb, sizeof(rxb), true)) < 0)
  362. return nRet;
  363. nRet = GfaMininetMasterEvaluateSlaveResponse(hMst, _SLAVE_NODE_ADDR, rxb, nRet, true, &nIndex);
  364. if(nRet == MINET_SLAVE_RESPONSE_SUCCESS)
  365. {
  366. TRACE_FRAME((LPCGFA_MININET_FRAME)rxb);
  367. return 0;
  368. }
  369. else if(nRet == MINET_SLAVE_RESPONSE_ACK)
  370. {
  371. return 0;
  372. }
  373. return -1;
  374. }
  375. static int _BlExecute(HGFAMINEMST hMst)
  376. {
  377. uint8_t nIndex;
  378. ssize_t nRet, nLen;
  379. char txb[32], rxb[32];
  380. nLen = GfaMininetMasterBuildFrame(hMst, _SLAVE_NODE_ADDR, 0, "BE", 2, txb, sizeof(txb));
  381. TRACE_FRAME((LPCGFA_MININET_FRAME)txb);
  382. if((nRet = GfaMininetMasterTransmitFrame(hMst, txb, nLen)) != nLen)
  383. return nRet;
  384. if((nRet = GfaMininetMasterReceiveFrame(hMst, rxb, sizeof(rxb), true)) < 0)
  385. return nRet;
  386. nRet = GfaMininetMasterEvaluateSlaveResponse(hMst, _SLAVE_NODE_ADDR, rxb, nRet, true, &nIndex);
  387. if(nRet == MINET_SLAVE_RESPONSE_SUCCESS)
  388. {
  389. TRACE_FRAME((LPCGFA_MININET_FRAME)rxb);
  390. // TODO: application response
  391. }
  392. else if(nRet == MINET_SLAVE_RESPONSE_ACK)
  393. {
  394. return 0;
  395. }
  396. return -1;
  397. }
  398. static int _BlIsExecuting(HGFAMINEMST hMst)
  399. {
  400. uint8_t nIndex;
  401. ssize_t nRet, nLen;
  402. char txb[32], rxb[32];
  403. nLen = GfaMininetMasterBuildFrame(hMst, _SLAVE_NODE_ADDR, 0, "BU", 2, txb, sizeof(txb));
  404. TRACE_FRAME((LPCGFA_MININET_FRAME)txb);
  405. if((nRet = GfaMininetMasterTransmitFrame(hMst, txb, nLen)) != nLen)
  406. return nRet;
  407. if((nRet = GfaMininetMasterReceiveFrame(hMst, rxb, sizeof(rxb), true)) < 0)
  408. return nRet;
  409. nRet = GfaMininetMasterEvaluateSlaveResponse(hMst, _SLAVE_NODE_ADDR, rxb, nRet, true, &nIndex);
  410. if(nRet == MINET_SLAVE_RESPONSE_SUCCESS)
  411. {
  412. TRACE_FRAME((LPCGFA_MININET_FRAME)rxb);
  413. // TODO: application response
  414. return 1;
  415. }
  416. else if(nRet == MINET_SLAVE_RESPONSE_ACK)
  417. {
  418. return 0;
  419. }
  420. return -1;
  421. }
  422. static int _BlGetImgInfo(HGFAMINEMST hMst, uint32_t *pnImgLength, uint32_t *pnImgCRC32)
  423. {
  424. if(hMst && pnImgLength && pnImgCRC32)
  425. {
  426. ssize_t nRet = 0;
  427. int nDumpIndex = 0;
  428. bool bNeedMore;
  429. uint32_t i, nDumpAddr, nDumpLen, nBufLen;
  430. uint32_t aDump[24] = {0};
  431. for(i = 0; i < 257; i += 16)
  432. {
  433. nDumpAddr = GFA_APP_BOOTLOADER_START_ADDRESS + i * sizeof(uint32_t);
  434. nBufLen = nDumpLen = 16;
  435. do
  436. {
  437. bNeedMore = false;
  438. if((nRet = _BlDumpMemory(hMst, nDumpAddr, nDumpLen, &aDump[nDumpIndex], sizeof(aDump) - nDumpIndex * sizeof(uint32_t))) == 0)
  439. {
  440. uint32_t j;
  441. LPCGFA_APP_IMG_HEADER paih;
  442. // TRACE("Address: %08X, Length: %2u\n", nDumpAddr, nDumpLen);
  443. for(j = nDumpIndex; j < (nDumpLen + nDumpIndex); ++j)
  444. {
  445. aDump[j] = bswap_32(aDump[j]);
  446. }
  447. for(j = 0; j < nBufLen; ++j)
  448. {
  449. paih = (LPCGFA_APP_IMG_HEADER)&aDump[j];
  450. if(paih->nPrefix0 == GFA_APP_IMG_HEADER_PREFIX_0)
  451. {
  452. if(j < (nBufLen - 1))
  453. {
  454. if(paih->nPrefix1 == GFA_APP_IMG_HEADER_PREFIX_1)
  455. {
  456. if(j < (nBufLen - 3))
  457. {
  458. *pnImgLength = paih->nImgLength;
  459. *pnImgCRC32 = paih->nImgCRC32;
  460. return 0;
  461. }
  462. else
  463. {
  464. nDumpAddr += nDumpLen * sizeof(uint32_t);
  465. nDumpIndex = nDumpLen;
  466. nDumpLen = 2;
  467. nBufLen += nDumpLen;
  468. bNeedMore = true;
  469. break;
  470. }
  471. }
  472. }
  473. else
  474. {
  475. nDumpAddr += nDumpLen * sizeof(uint32_t);
  476. nDumpIndex = nDumpLen;
  477. nDumpLen = 3;
  478. nBufLen += nDumpLen;
  479. bNeedMore = true;
  480. break;
  481. }
  482. }
  483. }
  484. }
  485. }
  486. while(bNeedMore);
  487. }
  488. return -1;
  489. }
  490. errno = EINVAL;
  491. return -1;
  492. }
  493. ////////////////////////////////////////////////////////////////////////////////////
  494. int main(void)
  495. {
  496. ssize_t nRet = 0;
  497. ////////////////////////////////////////////////////////////////////////////////
  498. GFA_MININET_MST_CFG_PARAMS mmcp;
  499. memset(&mmcp, 0, sizeof(mmcp));
  500. if(GfaSerialGetDeviceInterface(&mmcp.devcfg.itf))
  501. {
  502. GFA_SER_CFG_PARAMS scp;
  503. memset(&scp, 0, sizeof(scp));
  504. ////////////////////////////////////////////////////////////////////////////
  505. // serial interface parameters
  506. scp.baud = 19200;
  507. scp.data = 8;
  508. scp.stop = 1;
  509. scp.parity = 'N';
  510. #ifdef _TARGET_BUILD
  511. scp.bHandleTxEcho = true;
  512. #endif // _TARGET_BUILD
  513. ////////////////////////////////////////////////////////////////////////////
  514. // mininet master configuration
  515. mmcp.devcfg.pszDeviceName = _DEVICE_NAME;
  516. mmcp.devcfg.pDevParams = &scp;
  517. mmcp.devcfg.nSizeDevParams = sizeof(scp);
  518. ////////////////////////////////////////////////////////////////////////////
  519. ////////////////////////////////////////////////////////////////////////////
  520. ////////////////////////////////////////////////////////////////////////////
  521. HGFAMINEMST hMst = GfaMininetMasterOpen(&mmcp);
  522. if(hMst)
  523. {
  524. uint8_t status;
  525. char szMaterial[16], szSerial[16];
  526. uint32_t nImgLength = 0, nImgCRC32 = 0;
  527. if((nRet = GfaMininetMasterResetSlaveIndex(hMst, _SLAVE_NODE_ADDR)) == 0)
  528. TRACE("\nReset Slave index.\n");
  529. if((nRet = _BlIsExecuting(hMst)) != 0)
  530. {
  531. if((nRet = _BlExecute(hMst)) == 0)
  532. {
  533. TRACE("Executing Bootloader.\n");
  534. if((nRet = GfaMininetMasterResetSlaveIndex(hMst, _SLAVE_NODE_ADDR)) == 0)
  535. TRACE("Reset Slave index.\n");
  536. }
  537. }
  538. else
  539. {
  540. TRACE("Bootloader is already executing.\n");
  541. }
  542. if((nRet = _BlSetBaudrate(hMst, 115200)) == 0)
  543. {
  544. TRACE("Set Baudrate: %u\n", 115200);
  545. }
  546. if((nRet = _BlPing(hMst)) == 1)
  547. {
  548. TRACE("Ping ok!\n");
  549. }
  550. if((nRet = _BlGetStatus(hMst, &status)) == 0)
  551. {
  552. TRACE("Status: 0x%02hhX\n", status);
  553. }
  554. if((nRet = _BlGetImgInfo(hMst, &nImgLength, &nImgCRC32)) == 0)
  555. {
  556. TRACE("Bootloader Img. Length: %u, Bootloader Img. CRC: 0x%08X\n", nImgLength, nImgCRC32);
  557. }
  558. if((nRet = _BlWriteMaterialAndSerial(hMst, "Material 1", "123456789-1")) == 0)
  559. {
  560. TRACE("Set Material and Serial Numbers ...\n");
  561. }
  562. if((nRet = _BlReadMaterialAndSerial(hMst, szMaterial, sizeof(szMaterial), szSerial, sizeof(szSerial))) == 0)
  563. {
  564. TRACE("Material: \"%s\", Serial: \"%s\"\n", szMaterial, szSerial);
  565. }
  566. if((nRet = _BlWriteMaterialAndSerial(hMst, _BL_MATERIAL, _BL_SERIAL)) == 0)
  567. {
  568. TRACE("Set Material and Serial Numbers ...\n");
  569. }
  570. if((nRet = _BlReadMaterialAndSerial(hMst, szMaterial, sizeof(szMaterial), szSerial, sizeof(szSerial))) == 0)
  571. {
  572. TRACE("Material: \"%s\", Serial: \"%s\"\n", szMaterial, szSerial);
  573. }
  574. if((nRet = _BlSetBaudrate(hMst, 19200)) == 0)
  575. {
  576. TRACE("Set Baudrate: %u\n", 19200);
  577. }
  578. if((nRet = _BlPing(hMst)) == 1)
  579. {
  580. TRACE("Ping ok!\n");
  581. }
  582. GfaMininetMasterClose(hMst);
  583. }
  584. }
  585. return nRet;
  586. }