ktiva.c 17 KB

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