ktiva.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878
  1. #include <linux/kernel.h>
  2. #include <linux/errno.h>
  3. #include "ktiva.h"
  4. #include "ksync.h"
  5. /////////////////////////////////////////////////////////////////////////////
  6. #define _SQUARE_COEFFICIENT 6
  7. #define _LINEAR_COEFFICIENT 400
  8. /////////////////////////////////////////////////////////////////////////////
  9. extern int g_sw;
  10. /////////////////////////////////////////////////////////////////////////////
  11. static const long g_kty_tab[][2] =
  12. {
  13. {199, 1250},
  14. {351, 1000},
  15. {643, 750},
  16. {1185, 500},
  17. {2048, 250},
  18. {3025, 0},
  19. {3705, -250}
  20. };
  21. #define KTY_TAB_LEN _countof(g_kty_tab)
  22. /////////////////////////////////////////////////////////////////////////////
  23. static int _lin_kty(int resistance)
  24. {
  25. int i;
  26. if(resistance <= g_kty_tab[0][0])
  27. return(g_kty_tab[0][1]);
  28. else if(resistance >= g_kty_tab[KTY_TAB_LEN - 1][0])
  29. return(g_kty_tab[KTY_TAB_LEN - 1][1]);
  30. for(i = 1; i < KTY_TAB_LEN; i++)
  31. {
  32. if(g_kty_tab[i][0] >= resistance)
  33. break;
  34. }
  35. // linear interpolation
  36. return g_kty_tab[i - 1][1] + // y1 +
  37. ( // (
  38. (g_kty_tab[i][1] - g_kty_tab[i - 1][1]) * // (y2 - y1) *
  39. (resistance - g_kty_tab[i - 1][0]) / // (x - x1) /
  40. (g_kty_tab[i][0] - g_kty_tab[i - 1][0]) // (x2 - x1)
  41. ); // )
  42. }
  43. /////////////////////////////////////////////////////////////////////////////
  44. #if _SCALE_DISPLAY_DUTY_CYCLE
  45. static unsigned int _ScaleDutyCycle(unsigned int nPeriod, unsigned int nDutyCyclePerc)
  46. {
  47. if(nDutyCyclePerc < 0)
  48. nDutyCyclePerc = 0;
  49. else if(nDutyCyclePerc > 100)
  50. nDutyCyclePerc = 100;
  51. return (_SQUARE_COEFFICIENT * nDutyCyclePerc * nDutyCyclePerc + _LINEAR_COEFFICIENT * nDutyCyclePerc) / 1000 * nPeriod / 100;
  52. }
  53. #else // _SCALE_DISPLAY_DUTY_CYCLE
  54. static unsigned int _ScaleDutyCycle(unsigned int nPeriod, unsigned int nDutyCyclePerc)
  55. {
  56. if(nDutyCyclePerc < 0)
  57. nDutyCyclePerc = 0;
  58. else if(nDutyCyclePerc > 100)
  59. nDutyCyclePerc = 100;
  60. return nDutyCyclePerc * nPeriod / 100;
  61. }
  62. #endif // _SCALE_DISPLAY_DUTY_CYCLE
  63. /////////////////////////////////////////////////////////////////////////////
  64. static int _scale(int in_min, int in_max, int out_min, int out_max, int wert)
  65. {
  66. int abc;
  67. abc = (((long)out_max - (long)out_min) * (long)wert) / ( (long)in_max - (long)in_min);
  68. abc = abc + out_min;
  69. return abc;
  70. }
  71. /////////////////////////////////////////////////////////////////////////////
  72. /////////////////////////////////////////////////////////////////////////////
  73. /////////////////////////////////////////////////////////////////////////////
  74. int ktiva_wait_ack(struct file *pf)
  75. {
  76. int ret, i = 0;
  77. unsigned char c = 0;
  78. #if _SITARA_EGGELSBERG
  79. unsigned long start = jiffies;
  80. unsigned long timeout = jiffies + 4;
  81. #else // _SITARA_EGGELSBERG
  82. unsigned long timeout = jiffies + 2 *HZ; // 2 sec. timeout
  83. #endif // _SITARA_EGGELSBERG
  84. while(c != CMD_ACK)
  85. {
  86. ++i;
  87. ksync_sleep_jiffies(1);
  88. if((ret = kspi_rx_byte(pf, &c)) < 0)
  89. return ret;
  90. else if(c == CMD_NAK)
  91. {
  92. KALERT("%s: received NAK!\n", __FUNCTION__);
  93. return -ECOMM;
  94. }
  95. else if(c != CMD_ACK)
  96. {
  97. if(time_is_before_eq_jiffies(timeout))
  98. {
  99. KALERT("%s: timeout!\n", __FUNCTION__);
  100. return -ETIME;
  101. }
  102. }
  103. }
  104. #if _SITARA_EGGELSBERG
  105. KALERT("ktiva_wait_ack: jiffies: %lu, loops: %d\n", ((long)jiffies - (long)start), i);
  106. #endif // _SITARA_EGGELSBERG
  107. return (c == CMD_ACK) ? 0 : -1;
  108. }
  109. /////////////////////////////////////////////////////////////////////////////
  110. int ktiva_send_frame(struct file *pf, unsigned char cmd, const void *pData, size_t nCbData)
  111. {
  112. int ret;
  113. size_t i, j = 0;
  114. unsigned char buf[KTIVA_MAX_BUFFER_SIZE];
  115. const unsigned char *pdat = (const unsigned char*)pData;
  116. #if _EXTENDED_ERROR_CHECK
  117. if(nCbData > (sizeof(buf) - 3))
  118. {
  119. KALERT("%s: Invalid data length: %zu!\n", __FUNCTION__, nCbData);
  120. return -ENOMEM;
  121. }
  122. else if(nCbData && !pData)
  123. {
  124. KALERT("%s: Invalid data pointer!\n", __FUNCTION__);
  125. return -EINVAL;
  126. }
  127. #endif // _EXTENDED_ERROR_CHECK
  128. buf[0] = (unsigned char)nCbData + 3;
  129. buf[1] = cmd; // init checksum
  130. buf[2] = cmd;
  131. for(i = 0, j = 3; i < nCbData; ++i, ++j)
  132. {
  133. buf[1] += pdat[i]; // calc checksum
  134. buf[j] = pdat[i]; // fill in data
  135. }
  136. if((ret = kspi_tx(pf, buf, j)) < 0) // send data frame
  137. return ret;
  138. if((ret = ktiva_wait_ack(pf)) == 0) // wait for ACK
  139. ret = (int)nCbData;
  140. return ret;
  141. }
  142. /////////////////////////////////////////////////////////////////////////////
  143. int ktiva_recv_frame(struct file *pf, unsigned char cmd, void *pData, size_t nCbData)
  144. {
  145. int ret, i;
  146. unsigned char chk = 0, len = 0;
  147. unsigned char buf[KTIVA_MAX_BUFFER_SIZE];
  148. unsigned long timeout = jiffies + HZ; // 1 sec. timeout
  149. #if _EXTENDED_ERROR_CHECK
  150. if(nCbData && !pData)
  151. {
  152. KALERT("%s: Invalid data pointer!\n", __FUNCTION__);
  153. return -EINVAL;
  154. }
  155. #endif // _EXTENDED_ERROR_CHECK
  156. do
  157. {
  158. if((ret = kspi_rx_byte(pf, &len)) < 0) // receive length byte
  159. return ret;
  160. if(!len)
  161. {
  162. ksync_sleep_jiffies(1);
  163. if(time_is_before_eq_jiffies(timeout))
  164. {
  165. KALERT("%s: timeout!\n", __FUNCTION__);
  166. return -ETIME;
  167. }
  168. }
  169. }
  170. while(!len);
  171. if(len > (int)(nCbData + 3))
  172. {
  173. KALERT("%s: Insufficient buffer length: %zu - need %hhu!\n", __FUNCTION__, nCbData, len - 3);
  174. return -EINVAL;
  175. }
  176. else if(len < 2)
  177. {
  178. KALERT("%s: received invalid lenght: %hhu!\n", __FUNCTION__, len);
  179. return -EPROTO;
  180. }
  181. if((ret = kspi_rx(pf, buf, len - 1)) < 0) // receive checksum, cmd + data
  182. return ret;
  183. else if(ret != (len - 1))
  184. {
  185. KALERT("%s: kspi_rx returned invalid lenght: %d!\n", __FUNCTION__, ret);
  186. return -EPROTO;
  187. }
  188. else if(buf[1] != cmd)
  189. {
  190. KALERT("%s: invalid command: %02hhX!\n", __FUNCTION__, buf[1]);
  191. return -EPROTO;
  192. }
  193. // KALERT("ktiva_recv_frame: ordered: %hhu, received: %d!\n", len - 1, ret);
  194. for(i = 1; i < ret; ++i)
  195. {
  196. chk += buf[i]; // calc checksum
  197. }
  198. if(buf[0] != chk)
  199. {
  200. KALERT("%s: checksum err: [l=%hhu, c=0x%02hhX], recv: 0x%02hhX, calc: 0x%02hhX!\n", __FUNCTION__, len, buf[1], buf[0], chk);
  201. #if 1
  202. for(i = 2; i < ret; ++i)
  203. KALERT("%02hhX ", buf[i]);
  204. KALERT("\n");
  205. #endif // _SITARA_EGGELSBERG
  206. return -EPROTO;
  207. }
  208. if(nCbData)
  209. memcpy(pData, &buf[2], ret - 2);
  210. // KALERT("%s: jiffies: %lu\n", __FUNCTION__, ((long)jiffies - (long)start));
  211. return ret - 2;
  212. }
  213. /////////////////////////////////////////////////////////////////////////////
  214. int ktiva_recv_bootloader_frame(struct file *pf, unsigned char cmd, void *pData, size_t nCbData)
  215. {
  216. int ret, i;
  217. unsigned char chk = 0, len = 0;
  218. unsigned char buf[KTIVA_MAX_BUFFER_SIZE];
  219. // unsigned long start = jiffies;
  220. unsigned long timeout = jiffies + HZ; // 1 sec. timeout
  221. #if _EXTENDED_ERROR_CHECK
  222. if(nCbData && !pData)
  223. {
  224. KALERT("%s: Invalid data pointer!\n", __FUNCTION__);
  225. return -EINVAL;
  226. }
  227. #endif // _EXTENDED_ERROR_CHECK
  228. do
  229. {
  230. if((ret = kspi_rx_byte(pf, &len)) < 0) // receive length byte
  231. return ret;
  232. if(!len)
  233. {
  234. ksync_sleep_jiffies(1);
  235. if(time_is_before_eq_jiffies(timeout))
  236. {
  237. KALERT("%s: timeout!\n", __FUNCTION__);
  238. return -ETIME;
  239. }
  240. }
  241. }
  242. while(!len);
  243. if(len > (int)(nCbData + 2))
  244. {
  245. KALERT("%s: Insufficient buffer length: %zu - need %hhu!\n", __FUNCTION__, nCbData, len - 3);
  246. return -ENOMEM;
  247. }
  248. else if(len < 2)
  249. {
  250. KALERT("%s: received invalid lenght: %hhu!\n", __FUNCTION__, len);
  251. return -EPROTO;
  252. }
  253. if((ret = kspi_rx(pf, buf, len - 1)) < 0) // receive checksum + data
  254. return ret;
  255. else if(ret != (len - 1))
  256. {
  257. KALERT("%s: kspi_rx returned invalid lenght: %d!\n", __FUNCTION__, ret);
  258. return -EPROTO;
  259. }
  260. for(i = 1; i < ret; ++i)
  261. {
  262. chk += buf[i]; // calc checksum
  263. }
  264. if(buf[0] != chk)
  265. {
  266. KALERT("%s: checksum error: recv: 0x%02hhX, calc: 0x%02hhX!\n", __FUNCTION__, buf[0], chk);
  267. return -EPROTO;
  268. }
  269. if(nCbData)
  270. memcpy(pData, &buf[1], ret - 1);
  271. return ret - 1;
  272. }
  273. /////////////////////////////////////////////////////////////////////////////
  274. /////////////////////////////////////////////////////////////////////////////
  275. int TivaRevive(struct file *pf)
  276. {
  277. int ret, i = 0;
  278. unsigned char c = 0;
  279. for(i = 0; i < 256; ++i)
  280. {
  281. if((ret = kspi_rx_byte(pf, &c)) < 0)
  282. {
  283. KALERT("%s - kspi_rx_byte failed: %d\n", __FUNCTION__, ret);
  284. return ret;
  285. }
  286. else if(c == CMD_ACK)
  287. break;
  288. else if(c == CMD_NAK)
  289. {
  290. KALERT("%s: received NAK\n", __FUNCTION__);
  291. break;
  292. }
  293. if(i && !(i % 8))
  294. {
  295. ksync_sleep_jiffies(1);
  296. }
  297. }
  298. if(i == 256)
  299. {
  300. if((ret = kspi_tx_byte(pf, CMD_ACK)) < 0)
  301. {
  302. KALERT("%s - kspi_tx_byte failed: %d\n", __FUNCTION__, ret);
  303. return ret;
  304. }
  305. }
  306. KALERT("%s: loops: %d\n\n", __FUNCTION__, i);
  307. return (c == CMD_ACK) ? 0 : -1;
  308. }
  309. /////////////////////////////////////////////////////////////////////////////
  310. int TivaCmdGetDeviceCaps(struct file *pf, LPTIVA_DCAP pDCap)
  311. {
  312. int ret;
  313. unsigned int did0 = 0xFFFFFFFF, did1 = 0xFFFFFFFF, dc0 = 0xFFFFFFFF;
  314. if((ret = TivaCmdGetAddress(pf, KTIVA_DID0_ADDRESS, &did0)))
  315. {
  316. KALERT("%s - TivaCmdGetAddress failed: %d\n", __FUNCTION__, ret);
  317. return ret;
  318. }
  319. else if((ret = TivaCmdGetAddress(pf, KTIVA_DID1_ADDRESS, &did1)))
  320. {
  321. KALERT("%s - TivaCmdGetAddress failed: %d\n", __FUNCTION__, ret);
  322. return ret;
  323. }
  324. else if((ret = TivaCmdGetAddress(pf, KTIVA_DCAP0_ADDRESS, &dc0)))
  325. {
  326. KALERT("%s - TivaCmdGetAddress failed: %d\n", __FUNCTION__, ret);
  327. return ret;
  328. }
  329. pDCap->did0 = did0;
  330. pDCap->did1 = did1;
  331. pDCap->dc0 = dc0;
  332. return ret;
  333. }
  334. /////////////////////////////////////////////////////////////////////////////
  335. int TivaCmdGetFirmwareVersion(struct file *pf, int *Hw, int *Sw)
  336. {
  337. int ret;
  338. if((ret = ktiva_send_frame(pf, COMMAND_GET_HWSW_REV, NULL, 0)) == 0)
  339. {
  340. int data[2];
  341. if((ret = ktiva_recv_frame(pf, COMMAND_GET_HWSW_REV, data, sizeof(data))) == sizeof(data))
  342. {
  343. if(Hw)
  344. *Hw = ntohl(data[0]);
  345. if(Sw)
  346. *Sw = ntohl(data[1]);
  347. kspi_tx_byte(pf, CMD_ACK);
  348. ret = 0;
  349. }
  350. else
  351. {
  352. KALERT("%s - ktiva_recv_frame failed: %d\n", __FUNCTION__, ret);
  353. }
  354. }
  355. else
  356. {
  357. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  358. }
  359. return ret;
  360. }
  361. /////////////////////////////////////////////////////////////////////////////
  362. int TivaCmdGetADC(struct file *pf, LPTIVA_ADC padc)
  363. {
  364. int ret;
  365. #if _EXTENDED_ERROR_CHECK
  366. if(!padc)
  367. {
  368. KALERT("%s: Invalid struct pointer!\n", __FUNCTION__);
  369. return -EINVAL;
  370. }
  371. #endif // _EXTENDED_ERROR_CHECK
  372. if((ret = ktiva_send_frame(pf, COMMAND_GET_ADC, NULL, 0)) == 0)
  373. {
  374. unsigned short data[6];
  375. if((ret = ktiva_recv_frame(pf, COMMAND_GET_ADC, data, sizeof(data))) == sizeof(data))
  376. {
  377. padc->UVers = _scale(0, 4096, 0, 4375, ntohs(data[0])); // val / 100.0 + 0.4 (Versorgungsspannung skaliert)
  378. padc->UBatV3 = _scale(0, 4096, 0, 500, ntohs(data[1])); // val / 100.0 (Spannung Pufferbatterie skaliert)
  379. padc->Temp = _lin_kty(ntohs(data[2])); // val / 10.0 (Boardtemperatur linear interpoliert)
  380. padc->UV5Vsys = _scale(0, 4096, 0, 570, ntohs(data[3])); // val / 100.0 (interne 5V Hauptversorgungsspannung skaliert)
  381. padc->UV3V6Bat = _scale(0, 4096, 0, 500, ntohs(data[4])); // val / 100.0 (interne 3V Akkuspannung skaliert)
  382. padc->TempTIVA = ntohs(data[5]); // 147.5 - 187.5 * val / 4096.0 (TIVA-Temperatur)
  383. kspi_tx_byte(pf, CMD_ACK);
  384. ret = 0;
  385. }
  386. else
  387. {
  388. KALERT("%s - ktiva_recv_frame failed: %d\n", __FUNCTION__, ret);
  389. }
  390. }
  391. else
  392. {
  393. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  394. }
  395. return ret;
  396. }
  397. /////////////////////////////////////////////////////////////////////////////
  398. int TivaCmdGetUptime(struct file *pf, unsigned long long *put)
  399. {
  400. int ret;
  401. if(g_sw < 0x113)
  402. {
  403. #if _SUPPORT_LEGACY_UPTIME
  404. unsigned int ut;
  405. if((ret = TivaCmdGetAddress(pf, KTIVA_UPTIME_ADDRESS, &ut)) == 0)
  406. *put = ut;
  407. return ret;
  408. #else // _SUPPORT_LEGACY_UPTIME
  409. return -EPERM;
  410. #endif // _SUPPORT_LEGACY_UPTIME
  411. }
  412. #if _EXTENDED_ERROR_CHECK
  413. if(!put)
  414. {
  415. KALERT("%s: Invalid data pointer!\n", __FUNCTION__);
  416. return -EINVAL;
  417. }
  418. #endif // _EXTENDED_ERROR_CHECK
  419. if((ret = ktiva_send_frame(pf, COMMAND_GET_UPTIME, NULL, 0)) == 0)
  420. {
  421. unsigned long long data;
  422. if((ret = ktiva_recv_frame(pf, COMMAND_GET_UPTIME, &data, sizeof(data))) == sizeof(data))
  423. {
  424. *put = be64_to_cpu(data);
  425. kspi_tx_byte(pf, CMD_ACK);
  426. ret = 0;
  427. }
  428. else
  429. {
  430. KALERT("%s - ktiva_recv_frame failed: %d\n", __FUNCTION__, ret);
  431. }
  432. }
  433. else
  434. {
  435. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  436. }
  437. return ret;
  438. }
  439. /////////////////////////////////////////////////////////////////////////////
  440. int TivaCmdGetAddress(struct file *pf, unsigned int addr, unsigned int *val)
  441. {
  442. int ret;
  443. unsigned int data = cpu_to_be32(addr);
  444. #if _EXTENDED_ERROR_CHECK
  445. if(!val)
  446. {
  447. KALERT("%s: Invalid data pointer!\n", __FUNCTION__);
  448. return -EINVAL;
  449. }
  450. #endif // _EXTENDED_ERROR_CHECK
  451. if((ret = ktiva_send_frame(pf, COMMAND_GET_ADDR, &data, sizeof(data))) == sizeof(data))
  452. {
  453. if((ret = ktiva_recv_frame(pf, COMMAND_GET_ADDR, &data, sizeof(data))) == sizeof(data))
  454. {
  455. *val = be32_to_cpu(data);
  456. kspi_tx_byte(pf, CMD_ACK);
  457. ret = 0;
  458. }
  459. else
  460. {
  461. KALERT("%s - ktiva_recv_frame failed: %d\n", __FUNCTION__, ret);
  462. if(ret > 0)
  463. ret = -1;
  464. }
  465. }
  466. else
  467. {
  468. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  469. }
  470. return ret;
  471. }
  472. /////////////////////////////////////////////////////////////////////////////
  473. int TivaCmdSetAddress(struct file *pf, unsigned int addr, unsigned int val)
  474. {
  475. int ret;
  476. unsigned int data[2] = {cpu_to_be32(addr), cpu_to_be32(val)};
  477. if((ret = ktiva_send_frame(pf, COMMAND_SET_ADDR, &data, sizeof(data))) != sizeof(data))
  478. {
  479. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  480. if(ret > 0)
  481. ret = -1;
  482. }
  483. else
  484. {
  485. ret = 0;
  486. }
  487. return ret;
  488. }
  489. /////////////////////////////////////////////////////////////////////////////
  490. int TivaCmdPing(struct file *pf)
  491. {
  492. int ret;
  493. if((ret = ktiva_send_frame(pf, COMMAND_PING, NULL, 0)) != 0)
  494. {
  495. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  496. }
  497. return ret;
  498. }
  499. /////////////////////////////////////////////////////////////////////////////
  500. int TivaCmdGetStatus(struct file *pf, unsigned char *stat)
  501. {
  502. int ret;
  503. unsigned char data;
  504. #if _EXTENDED_ERROR_CHECK
  505. if(!stat)
  506. {
  507. KALERT("%s: Invalid data pointer!\n", __FUNCTION__);
  508. return -EINVAL;
  509. }
  510. #endif // _EXTENDED_ERROR_CHECK
  511. if((ret = ktiva_send_frame(pf, COMMAND_GET_STATUS, NULL, 0)) == 0)
  512. {
  513. if((ret = ktiva_recv_frame(pf, COMMAND_GET_STATUS, &data, sizeof(data))) == sizeof(data))
  514. {
  515. *stat = data;
  516. kspi_tx_byte(pf, CMD_ACK);
  517. ret = 0;
  518. }
  519. else
  520. {
  521. KALERT("%s - ktiva_recv_frame failed: %d\n", __FUNCTION__, ret);
  522. }
  523. }
  524. else
  525. {
  526. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  527. }
  528. return ret;
  529. }
  530. /////////////////////////////////////////////////////////////////////////////
  531. int TivaCmdGetBootloaderStatus(struct file *pf, unsigned char *stat)
  532. {
  533. int ret;
  534. unsigned char data;
  535. #if _EXTENDED_ERROR_CHECK
  536. if(!stat)
  537. {
  538. KALERT("%s: Invalid data pointer!\n", __FUNCTION__);
  539. return -EINVAL;
  540. }
  541. #endif // _EXTENDED_ERROR_CHECK
  542. if((ret = ktiva_send_frame(pf, COMMAND_GET_STATUS, NULL, 0)) == 0)
  543. {
  544. if((ret = ktiva_recv_bootloader_frame(pf, COMMAND_GET_STATUS, &data, sizeof(data))) == sizeof(data))
  545. {
  546. *stat = data;
  547. kspi_tx_byte(pf, CMD_ACK);
  548. ret = 0;
  549. }
  550. else
  551. {
  552. KALERT("%s - ktiva_recv_frame failed: %d\n", __FUNCTION__, ret);
  553. }
  554. }
  555. else
  556. {
  557. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  558. }
  559. return ret;
  560. }
  561. /////////////////////////////////////////////////////////////////////////////
  562. int TivaCmdStartBootloader(struct file *pf)
  563. {
  564. int ret;
  565. if((ret = ktiva_send_frame(pf, COMMAND_START_BOOTLOADER, NULL, 0)) != 0)
  566. {
  567. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  568. }
  569. return ret;
  570. }
  571. /////////////////////////////////////////////////////////////////////////////
  572. int TivaCmdStartDownload(struct file *pf, unsigned int addr, size_t size)
  573. {
  574. int ret;
  575. unsigned int data[2] = {cpu_to_be32(addr), cpu_to_be32((unsigned int)size)};
  576. KALERT("%s: Addr.: 0x%08X, CB: %zu!\n", __FUNCTION__, addr, size);
  577. if((ret = ktiva_send_frame(pf, COMMAND_DOWNLOAD, data, sizeof(data))) == sizeof(data))
  578. {
  579. ret = 0;
  580. }
  581. else
  582. {
  583. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  584. }
  585. return ret;
  586. }
  587. /////////////////////////////////////////////////////////////////////////////
  588. int TivaCmdSendDataBlock(struct file *pf, const void *pBlock, size_t nCbBlock)
  589. {
  590. int ret;
  591. // KALERT("%s: Data: 0x%p, CB: %zu!\n", __FUNCTION__, pBlock, nCbBlock);
  592. if((ret = ktiva_send_frame(pf, COMMAND_SEND_DATA, pBlock, nCbBlock)) == nCbBlock)
  593. {
  594. ret = 0;
  595. }
  596. else
  597. {
  598. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  599. }
  600. return ret;
  601. }
  602. /////////////////////////////////////////////////////////////////////////////
  603. int TivaCmdReset(struct file *pf)
  604. {
  605. int ret;
  606. if((ret = ktiva_send_frame(pf, COMMAND_RESET, NULL, 0)) != 0)
  607. {
  608. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  609. }
  610. return ret;
  611. }
  612. /////////////////////////////////////////////////////////////////////////////
  613. int TivaCmdGetMatSer(struct file *pf, LPTIVA_MAT_SER pms)
  614. {
  615. int ret;
  616. TIVA_MAT_SER data;
  617. #if _EXTENDED_ERROR_CHECK
  618. if(!pms)
  619. {
  620. KALERT("%s: Invalid data pointer!\n", __FUNCTION__);
  621. return -EINVAL;
  622. }
  623. #endif // _EXTENDED_ERROR_CHECK
  624. if((ret = ktiva_send_frame(pf, COMMAND_GET_MAT_SER, NULL, 0)) == 0)
  625. {
  626. if((ret = ktiva_recv_bootloader_frame(pf, COMMAND_GET_MAT_SER, &data, sizeof(data))) == sizeof(data))
  627. {
  628. memcpy(pms, &data, sizeof(data));
  629. kspi_tx_byte(pf, CMD_ACK);
  630. ret = 0;
  631. }
  632. else
  633. {
  634. KALERT("%s - ktiva_recv_frame failed: %d\n", __FUNCTION__, ret);
  635. }
  636. }
  637. else
  638. {
  639. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  640. }
  641. return ret;
  642. }
  643. /////////////////////////////////////////////////////////////////////////////
  644. int TivaCmdSetBacklight(struct file *pf, unsigned int nPeriod, unsigned int nDutyCyclePerc)
  645. {
  646. int ret;
  647. unsigned int data[2] =
  648. {
  649. cpu_to_be32(nPeriod),
  650. cpu_to_be32(_ScaleDutyCycle(nPeriod, nDutyCyclePerc))
  651. };
  652. if((ret = ktiva_send_frame(pf, COMMAND_SET_BACKLIGHT, data, sizeof(data))) == sizeof(data))
  653. {
  654. ret = 0;
  655. }
  656. else
  657. {
  658. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  659. }
  660. return ret;
  661. }
  662. /////////////////////////////////////////////////////////////////////////////
  663. int TivaCmdGetI2C(struct file *pf, unsigned char nI2CAddr, unsigned char nI2CStart, size_t nCbI2C, void *pData, size_t nCbData)
  664. {
  665. int ret;
  666. unsigned char data[3] =
  667. {
  668. nI2CAddr,
  669. nI2CStart,
  670. (unsigned char)nCbI2C
  671. };
  672. #if _EXTENDED_ERROR_CHECK
  673. if(!pData)
  674. {
  675. KALERT("%s: Invalid data pointer!\n", __FUNCTION__);
  676. return -EINVAL;
  677. }
  678. #endif // _EXTENDED_ERROR_CHECK
  679. if((ret = ktiva_send_frame(pf, COMMAND_GET_I2C, data, sizeof(data))) == sizeof(data))
  680. {
  681. if((ret = ktiva_recv_frame(pf, COMMAND_GET_I2C, pData, nCbData)) == nCbData)
  682. {
  683. kspi_tx_byte(pf, CMD_ACK);
  684. ret = 0;
  685. }
  686. else
  687. {
  688. KALERT("%s - ktiva_recv_frame failed: %d!\n", __FUNCTION__, ret);
  689. }
  690. }
  691. else
  692. {
  693. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  694. }
  695. return ret;
  696. }
  697. /////////////////////////////////////////////////////////////////////////////
  698. int TivaCmdSetI2C(struct file *pf, unsigned char nI2CAddr, unsigned char nI2CStart, const void *pData, size_t nCbData)
  699. {
  700. int ret;
  701. size_t nLen = 3;
  702. unsigned char data[512] =
  703. {
  704. nI2CAddr,
  705. nI2CStart,
  706. (unsigned char)nCbData
  707. };
  708. #if _EXTENDED_ERROR_CHECK
  709. if(!pData)
  710. {
  711. KALERT("%s: Invalid data pointer!\n", __FUNCTION__);
  712. return -EINVAL;
  713. }
  714. #endif // _EXTENDED_ERROR_CHECK
  715. if((nLen + nCbData) > sizeof(data))
  716. {
  717. KALERT("%s: Invalid data size: %zu!\n", __FUNCTION__, nCbData);
  718. return -EINVAL;
  719. }
  720. memcpy(&data[3], pData, nCbData);
  721. nLen += nCbData;
  722. if((ret = ktiva_send_frame(pf, COMMAND_PUT_I2C, data, nLen)) == nLen)
  723. {
  724. ret = 0;
  725. }
  726. else
  727. {
  728. KALERT("%s - ktiva_send_frame failed: %d!\n", __FUNCTION__, ret);
  729. }
  730. return ret;
  731. }