wm_efuse.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717
  1. /**************************************************************************
  2. * File Name : tls_efuse.c
  3. * Author :
  4. * Version :
  5. * Date :
  6. * Description : Use Flash Addr as virtual efuse
  7. *
  8. * Copyright (c) 2014 Winner Microelectronics Co., Ltd.
  9. * All rights reserved.
  10. *
  11. ***************************************************************************/
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15. #include "wm_debug.h"
  16. #include "wm_regs.h"
  17. #include "wm_efuse.h"
  18. #include "wm_config.h"
  19. #include "list.h"
  20. #include "wm_internal_flash.h"
  21. #include "wm_crypto_hard.h"
  22. #include "wm_mem.h"
  23. #define USE_OTA_FT_PARAM 0
  24. #include "wm_flash_map.h"
  25. #define FT_MAGICNUM_ADDR (FLASH_BASE_ADDR)
  26. #define FT_PARAM_RUNTIME_ADDR (FT_MAGICNUM_ADDR + 0x1000)
  27. #define MAGICNUM_LEN (4)
  28. #define MAC_ADDR_LEN (6)
  29. #define FT_GAIN_LEN (84)
  30. #define FT_PARAM_EXT_REVERSED_LEN 32
  31. typedef struct FT_PARAM
  32. {
  33. unsigned int magic_no;
  34. unsigned int checksum;
  35. unsigned char wifi_mac_addr[MAC_ADDR_LEN];
  36. unsigned short version_no;
  37. unsigned char bt_mac_addr[MAC_ADDR_LEN];
  38. unsigned short ext_param_len;
  39. unsigned int tx_dcoffset;
  40. unsigned int rx_dcoffset;
  41. unsigned int tx_iq_gain;
  42. unsigned int rx_iq_gain;
  43. unsigned int tx_iq_phase;
  44. unsigned int rx_iq_phase;
  45. unsigned char tx_gain[FT_GAIN_LEN];
  46. }FT_PARAM_ST;
  47. typedef struct FT_PARAM_EXT_1
  48. {
  49. unsigned int rf_freq_err;
  50. unsigned int rf_cal_flag;
  51. FT_ADC_CAL_ST adc_cal_param;
  52. FT_TEMP_CAL_ST temp_cal_param;
  53. }FT_PARAM_ST_EXT_1;
  54. typedef struct FT_PARAM_VER1
  55. {
  56. FT_PARAM_ST ft_param;
  57. unsigned int ext_checksum;
  58. FT_PARAM_ST_EXT_1 ft_ext1;
  59. unsigned char _reversed[FT_PARAM_EXT_REVERSED_LEN];
  60. }FT_PARAM_ST_VER1;
  61. static u8 default_mac[6] = {0x00,0x25,0x08,0x09,0x01,0x0F};
  62. FT_PARAM_ST_VER1 gftParamVer1;
  63. FT_PARAM_ST *gftParam = (FT_PARAM_ST *)&gftParamVer1;
  64. static int _ft_ext1_valid(FT_PARAM_ST *pft)
  65. {
  66. //printf("version_no %d, ext_param_len %x\n", pft->version_no, pft->ext_param_len);
  67. if (pft->version_no > 0 && pft->version_no < 0xFFFF && pft->ext_param_len >= sizeof(FT_PARAM_ST_EXT_1) &&
  68. pft->ext_param_len <= (sizeof(FT_PARAM_ST_EXT_1) + FT_PARAM_EXT_REVERSED_LEN))
  69. {
  70. return TRUE;
  71. }
  72. return FALSE;
  73. }
  74. static int _ft_param_init(u32 ft_addr, FT_PARAM_ST *pft)
  75. {
  76. u32 crcvalue = 0;
  77. psCrcContext_t ctx;
  78. FT_PARAM_ST_VER1 *pft_ver1 = NULL;
  79. tls_fls_read(ft_addr, (unsigned char *)pft, sizeof(FT_PARAM_ST_VER1));
  80. if (pft->magic_no == SIGNATURE_WORD)
  81. {
  82. tls_crypto_init();
  83. tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT);
  84. tls_crypto_crc_update(&ctx, (unsigned char *)pft + 8, sizeof(FT_PARAM_ST) - 8);
  85. tls_crypto_crc_final(&ctx, &crcvalue);
  86. if (pft->checksum != crcvalue)
  87. {
  88. //tls_mem_free(pft);
  89. return FALSE;
  90. }
  91. do
  92. {
  93. if (_ft_ext1_valid(pft))
  94. {
  95. pft_ver1 = (FT_PARAM_ST_VER1 *)pft;
  96. tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT);
  97. tls_crypto_crc_update(&ctx, (unsigned char *)&pft_ver1->ft_ext1, pft->ext_param_len);
  98. tls_crypto_crc_final(&ctx, &crcvalue);
  99. if(pft_ver1->ext_checksum == crcvalue)
  100. {
  101. return 1;
  102. }
  103. else
  104. {
  105. return FALSE;
  106. }
  107. }
  108. pft->version_no = 0xFFFF;
  109. pft->ext_param_len = 0xFFFF;
  110. }while(0);
  111. return 2;
  112. }
  113. return FALSE;
  114. }
  115. int tls_ft_param_init(void)
  116. {
  117. int ret = 0;
  118. FT_PARAM_ST *pft = NULL;
  119. if (gftParam->magic_no == SIGNATURE_WORD)
  120. {
  121. return TRUE;
  122. }
  123. memset(gftParam, 0xFF, sizeof(FT_PARAM_ST_VER1));
  124. pft = tls_mem_alloc(sizeof(FT_PARAM_ST_VER1));
  125. if (pft == NULL)
  126. {
  127. return FALSE;
  128. }
  129. memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1));
  130. ret = _ft_param_init(FT_PARAM_RUNTIME_ADDR, pft);
  131. if(FALSE == ret)
  132. {
  133. memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1));
  134. ret = _ft_param_init(FT_MAGICNUM_ADDR, pft);
  135. }
  136. if(1 == ret)
  137. {
  138. memcpy((unsigned char *)gftParam, (unsigned char *)pft, sizeof(FT_PARAM_ST_VER1));
  139. }
  140. else if(2 == ret)
  141. {
  142. memcpy((unsigned char *)gftParam, (unsigned char *)pft, sizeof(FT_PARAM_ST));
  143. }
  144. tls_mem_free(pft);
  145. /*lock parameter*/
  146. tls_flash_unlock();
  147. return ret;
  148. }
  149. int tls_ft_param_get(unsigned int opnum, void *data, unsigned int rdlen)
  150. {
  151. int ret = 0;
  152. switch (opnum)
  153. {
  154. case CMD_FREQ_ERR:
  155. if(_ft_ext1_valid(gftParam))
  156. {
  157. memcpy(data, (char *)&gftParamVer1.ft_ext1.rf_freq_err, FREQERR_LEN);
  158. }
  159. else
  160. {
  161. ret = tls_fls_read(FREQERR_ADDR, data, FREQERR_LEN);
  162. if(ret)
  163. {
  164. return -1;
  165. }
  166. }
  167. break;
  168. case CMD_RF_CAL_FLAG:
  169. if(_ft_ext1_valid(gftParam))
  170. {
  171. memcpy(data, (char *)&gftParamVer1.ft_ext1.rf_cal_flag, CAL_FLAG_LEN);
  172. }
  173. else
  174. {
  175. ret = tls_fls_read(CAL_FLAG_ADDR, data, CAL_FLAG_LEN);
  176. if(ret)
  177. {
  178. return -1;
  179. }
  180. }
  181. break;
  182. case CMD_TX_ADC_CAL:
  183. if(_ft_ext1_valid(gftParam))
  184. {
  185. memcpy(data, (unsigned char *)&gftParamVer1.ft_ext1.adc_cal_param, rdlen);
  186. }
  187. else
  188. {
  189. return -1;
  190. }
  191. break;
  192. case CMD_WIFI_MAC: /*MAC*/
  193. if ((gftParam->wifi_mac_addr[0]&0x1)
  194. ||(0 == (gftParam->wifi_mac_addr[0]|gftParam->wifi_mac_addr[1]|gftParam->wifi_mac_addr[2]|gftParam->wifi_mac_addr[3]|gftParam->wifi_mac_addr[4]|gftParam->wifi_mac_addr[5])))
  195. {
  196. memcpy(data, default_mac, rdlen);
  197. }
  198. else
  199. {
  200. memcpy(data, gftParam->wifi_mac_addr, rdlen);
  201. }
  202. break;
  203. case CMD_BT_MAC: /*MAC*/
  204. {
  205. u8 invalid_bt_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  206. u8 invalid_bt_mac1[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  207. if ((memcmp(gftParam->bt_mac_addr, invalid_bt_mac, 6) == 0)||(memcmp(gftParam->bt_mac_addr, invalid_bt_mac1, 6) == 0))
  208. {
  209. memcpy(data, default_mac, rdlen);
  210. *((u8*)data+5) +=1; /*defalut plus 1*/
  211. *((u8*)data) |= 0xC0; /*defalut public static type*/
  212. }
  213. else
  214. {
  215. memcpy(data, gftParam->bt_mac_addr, rdlen);
  216. }
  217. }
  218. break;
  219. case CMD_TX_DC: /*tx_dcoffset*/
  220. *(unsigned int *)data = gftParam->tx_dcoffset;
  221. break;
  222. case CMD_RX_DC: /*rx_dcoffset*/
  223. *(unsigned int *)data = gftParam->rx_dcoffset;
  224. break;
  225. case CMD_TX_IQ_GAIN:
  226. *(unsigned int *)data = gftParam->tx_iq_gain;
  227. break;
  228. case CMD_RX_IQ_GAIN:
  229. *(unsigned int *)data = gftParam->rx_iq_gain;
  230. break;
  231. case CMD_TX_IQ_PHASE:
  232. *(unsigned int *)data = gftParam->tx_iq_phase;
  233. break;
  234. case CMD_RX_IQ_PHASE:
  235. *(unsigned int *)data = gftParam->rx_iq_phase;
  236. break;
  237. case CMD_TX_GAIN: /*gain*/
  238. if (rdlen < FT_GAIN_LEN)
  239. {
  240. memcpy(data, gftParam->tx_gain, rdlen);
  241. }
  242. else
  243. {
  244. memcpy(data, gftParam->tx_gain, FT_GAIN_LEN);
  245. }
  246. break;
  247. default:
  248. return -1;
  249. }
  250. //printf("tls_ft_param_get: opnum=%d, val=%x\n", opnum, *(unsigned int *)data);
  251. return 0;
  252. }
  253. int tls_ft_param_set(unsigned int opnum, void *data, unsigned int len)
  254. {
  255. psCrcContext_t ctx;
  256. unsigned int writelen = 0;
  257. FT_PARAM_ST *pft = NULL;
  258. int ret = 0;
  259. if (!data || !len)
  260. {
  261. return -1;
  262. }
  263. pft = tls_mem_alloc(sizeof(FT_PARAM_ST_VER1));
  264. if (pft == NULL)
  265. {
  266. return -1;
  267. }
  268. memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1));
  269. ret = _ft_param_init(FT_PARAM_RUNTIME_ADDR, pft);
  270. if(ret)
  271. {
  272. memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1));
  273. ret = _ft_param_init(FT_MAGICNUM_ADDR, pft);
  274. if(!ret || memcmp(pft, gftParam, sizeof(FT_PARAM_ST_VER1)))
  275. {
  276. tls_flash_unlock();
  277. tls_fls_write(FT_MAGICNUM_ADDR, (unsigned char *)gftParam, sizeof(FT_PARAM_ST_VER1));
  278. memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1));
  279. ret = _ft_param_init(FT_MAGICNUM_ADDR, pft);
  280. if(!ret || memcmp(pft, gftParam, sizeof(FT_PARAM_ST_VER1)))
  281. {
  282. memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1));
  283. tls_mem_free(pft);
  284. return -1;
  285. }
  286. }
  287. }
  288. if(!_ft_ext1_valid(gftParam))
  289. {
  290. gftParam->version_no = 1;
  291. gftParam->ext_param_len = sizeof(FT_PARAM_ST_EXT_1);
  292. memset((char *)&gftParamVer1.ft_ext1, 0xFF, gftParam->ext_param_len);
  293. }
  294. switch (opnum)
  295. {
  296. case CMD_FREQ_ERR:
  297. memcpy((char *)&gftParamVer1.ft_ext1.rf_freq_err, (char *)data, FREQERR_LEN);
  298. break;
  299. case CMD_RF_CAL_FLAG:
  300. memcpy((char *)&gftParamVer1.ft_ext1.rf_cal_flag, (char *)data, CAL_FLAG_LEN);
  301. break;
  302. case CMD_TX_ADC_CAL:
  303. memcpy((unsigned char *)&gftParamVer1.ft_ext1.adc_cal_param, data, len);
  304. break;
  305. case CMD_WIFI_MAC: /*MAC*/
  306. memcpy(gftParam->wifi_mac_addr, (unsigned char *)data, len);
  307. break;
  308. case CMD_BT_MAC: /*BT MAC*/
  309. memcpy(gftParam->bt_mac_addr, (unsigned char *)data, len);
  310. break;
  311. case CMD_TX_DC: /*tx_dcoffset*/
  312. gftParam->tx_dcoffset = *(unsigned int *)data;
  313. break;
  314. case CMD_RX_DC: /*rx_dcoffset*/
  315. gftParam->rx_dcoffset = *(unsigned int *)data;
  316. break;
  317. case CMD_TX_IQ_GAIN:
  318. gftParam->tx_iq_gain = *(unsigned int *)data;
  319. break;
  320. case CMD_RX_IQ_GAIN:
  321. gftParam->rx_iq_gain = *(unsigned int *) data;
  322. break;
  323. case CMD_TX_IQ_PHASE:
  324. gftParam->tx_iq_phase = *(unsigned int *)data;
  325. break;
  326. case CMD_RX_IQ_PHASE:
  327. gftParam->rx_iq_phase = *(unsigned int *) data;
  328. break;
  329. case CMD_TX_GAIN: /*gain*/
  330. if (len >= FT_GAIN_LEN)
  331. {
  332. writelen = FT_GAIN_LEN;
  333. }
  334. else
  335. {
  336. writelen = len;
  337. }
  338. memcpy(gftParam->tx_gain, data, writelen);
  339. break;
  340. default:
  341. tls_mem_free(pft);
  342. return -1;
  343. }
  344. tls_crypto_init();
  345. /*len to write to flash*/
  346. writelen = sizeof(FT_PARAM_ST_VER1);
  347. tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT);
  348. tls_crypto_crc_update(&ctx, (unsigned char *)&gftParamVer1.ft_ext1, gftParam->ext_param_len);
  349. tls_crypto_crc_final(&ctx, &gftParamVer1.ext_checksum);
  350. gftParam->magic_no = SIGNATURE_WORD;
  351. tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT);
  352. tls_crypto_crc_update(&ctx, (unsigned char *)gftParam + 8, sizeof(FT_PARAM_ST) -8);
  353. tls_crypto_crc_final(&ctx, &gftParam->checksum);
  354. tls_flash_unlock();
  355. tls_fls_write(FT_PARAM_RUNTIME_ADDR, (unsigned char *)gftParam, writelen);
  356. memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1));
  357. ret = _ft_param_init(FT_PARAM_RUNTIME_ADDR, pft);
  358. if(!ret || memcmp(pft, gftParam, sizeof(FT_PARAM_ST_VER1)))
  359. {
  360. memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1));
  361. tls_mem_free(pft);
  362. return -1;
  363. }
  364. tls_fls_write(FT_MAGICNUM_ADDR, (unsigned char *)gftParam, writelen);
  365. memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1));
  366. ret = _ft_param_init(FT_MAGICNUM_ADDR, pft);
  367. if(!ret || memcmp(pft, gftParam, sizeof(FT_PARAM_ST_VER1)))
  368. {
  369. memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1));
  370. tls_mem_free(pft);
  371. return -1;
  372. }
  373. memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1));
  374. tls_mem_free(pft);
  375. //tls_flash_lock();
  376. return 0;
  377. }
  378. /**********************************************************************************************************
  379. * Description: This function is used to get mac addr.
  380. *
  381. * Arguments : mac mac addr,6 byte
  382. *
  383. * Returns : TLS_EFUSE_STATUS_OK get success
  384. * TLS_EFUSE_STATUS_EIO get failed
  385. **********************************************************************************************************/
  386. int tls_get_mac_addr(u8 *mac)
  387. {
  388. return tls_ft_param_get(CMD_WIFI_MAC, mac, 6);
  389. }
  390. /**********************************************************************************************************
  391. * Description: This function is used to set mac addr.
  392. *
  393. * Arguments : mac mac addr,6 byte
  394. *
  395. * Returns : TLS_EFUSE_STATUS_OK get success
  396. * TLS_EFUSE_STATUS_EIO get failed
  397. **********************************************************************************************************/
  398. int tls_set_mac_addr(u8 *mac)
  399. {
  400. return tls_ft_param_set(CMD_WIFI_MAC, mac, 6);
  401. }
  402. /**********************************************************************************************************
  403. * Description: This function is used to get bluetooth mac addr.
  404. *
  405. * Arguments : mac mac addr,6 byte
  406. *
  407. * Returns : TLS_EFUSE_STATUS_OK get success
  408. * TLS_EFUSE_STATUS_EIO get failed
  409. **********************************************************************************************************/
  410. int tls_get_bt_mac_addr(u8 *mac)
  411. {
  412. return tls_ft_param_get(CMD_BT_MAC, mac, 6);
  413. }
  414. /**********************************************************************************************************
  415. * Description: This function is used to set bluetooth mac addr.
  416. *
  417. * Arguments : mac mac addr,6 byte
  418. *
  419. * Returns : TLS_EFUSE_STATUS_OK get success
  420. * TLS_EFUSE_STATUS_EIO get failed
  421. **********************************************************************************************************/
  422. int tls_set_bt_mac_addr(u8 *mac)
  423. {
  424. return tls_ft_param_set(CMD_BT_MAC, mac, 6);
  425. }
  426. /**********************************************************************************************************
  427. * Description: This function is used to get tx lod.
  428. *
  429. * Arguments : *txlo
  430. *
  431. * Returns : 0 get success
  432. * -1 get failed
  433. **********************************************************************************************************/
  434. int tls_get_tx_lo(u8 *txlo)
  435. {
  436. return tls_ft_param_get(CMD_TX_DC, txlo, 4);
  437. }
  438. /**********************************************************************************************************
  439. * Description: This function is used to set tx lo.
  440. *
  441. * Arguments : txlo
  442. *
  443. * Returns : 0 set success
  444. * -1 set failed
  445. **********************************************************************************************************/
  446. int tls_set_tx_lo(u8 *txlo)
  447. {
  448. return tls_ft_param_set(CMD_TX_DC, txlo, 4);
  449. }
  450. /**********************************************************************************************************
  451. * Description: This function is used to get tx iq gain.
  452. *
  453. * Arguments : txGain
  454. *
  455. * Returns : 0 set success
  456. * -1 set failed
  457. **********************************************************************************************************/
  458. int tls_get_tx_iq_gain(u8 *txGain)
  459. {
  460. return tls_ft_param_get(CMD_TX_IQ_GAIN, txGain, 4);
  461. }
  462. /**********************************************************************************************************
  463. * Description: This function is used to set tx iq gain.
  464. *
  465. * Arguments : txGain
  466. *
  467. * Returns : 0 set success
  468. * -1 set failed
  469. **********************************************************************************************************/
  470. int tls_set_tx_iq_gain(u8 *txGain)
  471. {
  472. return tls_ft_param_set(CMD_TX_IQ_GAIN, txGain, 4);
  473. }
  474. /**********************************************************************************************************
  475. * Description: This function is used to get rx iq gain.
  476. *
  477. * Arguments : rxGain
  478. *
  479. * Returns : 0 set success
  480. * -1 set failed
  481. **********************************************************************************************************/
  482. int tls_get_rx_iq_gain(u8 *rxGain)
  483. {
  484. return tls_ft_param_get(CMD_RX_IQ_GAIN, rxGain, 4);
  485. }
  486. /**********************************************************************************************************
  487. * Description: This function is used to set rx iq gain.
  488. *
  489. * Arguments : rxGain
  490. *
  491. * Returns : 0 set success
  492. * -1 set failed
  493. **********************************************************************************************************/
  494. int tls_set_rx_iq_gain(u8 *rxGain)
  495. {
  496. return tls_ft_param_set(CMD_RX_IQ_GAIN, rxGain, 4);
  497. }
  498. /**********************************************************************************************************
  499. * Description: This function is used to get tx iq phase.
  500. *
  501. * Arguments : txPhase
  502. *
  503. * Returns : 0 set success
  504. * -1 set failed
  505. **********************************************************************************************************/
  506. int tls_get_tx_iq_phase(u8 *txPhase)
  507. {
  508. return tls_ft_param_get(CMD_TX_IQ_PHASE, txPhase, 4);
  509. }
  510. /**********************************************************************************************************
  511. * Description: This function is used to set tx iq phase.
  512. *
  513. * Arguments : txPhase
  514. *
  515. * Returns : 0 set success
  516. * -1 set failed
  517. **********************************************************************************************************/
  518. int tls_set_tx_iq_phase(u8 *txPhase)
  519. {
  520. return tls_ft_param_set(CMD_TX_IQ_PHASE, txPhase, 4);
  521. }
  522. /**********************************************************************************************************
  523. * Description: This function is used to get rx iq phase.
  524. *
  525. * Arguments : rxPhase
  526. *
  527. * Returns : 0 set success
  528. * -1 set failed
  529. **********************************************************************************************************/
  530. int tls_get_rx_iq_phase(u8 *rxPhase)
  531. {
  532. return tls_ft_param_get(CMD_RX_IQ_PHASE, rxPhase, 4);
  533. }
  534. /**********************************************************************************************************
  535. * Description: This function is used to set tx iq phase.
  536. *
  537. * Arguments : rxPhase
  538. *
  539. * Returns : 0 set success
  540. * -1 set failed
  541. **********************************************************************************************************/
  542. int tls_set_rx_iq_phase(u8 *rxPhase)
  543. {
  544. return tls_ft_param_set(CMD_RX_IQ_PHASE, rxPhase, 4);
  545. }
  546. int tls_freq_err_op(u8 *freqerr, u8 flag)
  547. {
  548. int ret = 0;
  549. int value = 0;
  550. if (flag){
  551. ret = tls_ft_param_set(CMD_FREQ_ERR, freqerr, FREQERR_LEN);
  552. }
  553. else
  554. {
  555. ret = tls_ft_param_get(CMD_FREQ_ERR, freqerr, FREQERR_LEN);
  556. if(!ret)
  557. {
  558. memcpy(&value, freqerr, FREQERR_LEN);
  559. if (value > 200000) /*when freq offset is out of range (-200KHz, 200KHz),do not use it*/
  560. {
  561. value = 200000;
  562. memcpy((char *)freqerr, (char *)&value, FREQERR_LEN);
  563. }
  564. else if (value < -200000)
  565. {
  566. value = -200000;
  567. memcpy((char *)freqerr, (char *)&value, FREQERR_LEN);
  568. }
  569. }
  570. }
  571. if (ret == 0)
  572. {
  573. return TLS_EFUSE_STATUS_OK;
  574. }
  575. else
  576. {
  577. return TLS_EFUSE_STATUS_EINVALID;
  578. }
  579. }
  580. int tls_rf_cal_finish_op(u8 *calflag, u8 flag)
  581. {
  582. int ret = 0;
  583. if (flag){
  584. ret = tls_ft_param_set(CMD_RF_CAL_FLAG, calflag, CAL_FLAG_LEN);
  585. }
  586. else
  587. {
  588. ret = tls_ft_param_get(CMD_RF_CAL_FLAG, calflag, CAL_FLAG_LEN);
  589. }
  590. if (ret == 0)
  591. {
  592. return TLS_EFUSE_STATUS_OK;
  593. }
  594. else
  595. {
  596. return TLS_EFUSE_STATUS_EINVALID;
  597. }
  598. }
  599. /**********************************************************************************************************
  600. * Description: This function is used to get tx gain.
  601. *
  602. * Arguments : txgain tx gain
  603. *
  604. * Returns : 0 get success
  605. * -1 get failed
  606. **********************************************************************************************************/
  607. int tls_get_tx_gain(u8 *txgain)
  608. {
  609. return tls_ft_param_get(CMD_TX_GAIN, txgain, TX_GAIN_LEN);
  610. }
  611. /**********************************************************************************************************
  612. * Description: This function is used to set tx gain.
  613. *
  614. * Arguments : txgain tx gain
  615. *
  616. * Returns : 0 set success
  617. * -1 set failed
  618. **********************************************************************************************************/
  619. int tls_set_tx_gain(u8 *txgain)
  620. {
  621. return tls_ft_param_set(CMD_TX_GAIN, txgain, TX_GAIN_LEN);
  622. }
  623. /**
  624. * @brief This function is used to get adc cal param
  625. *
  626. * @param[out] adc_cal adc cal param
  627. *
  628. * @retval TLS_EFUSE_STATUS_OK get success
  629. * @retval TLS_EFUSE_STATUS_EIO get failed
  630. */
  631. int tls_get_adc_cal_param(FT_ADC_CAL_ST *adc_cal)
  632. {
  633. return tls_ft_param_get(CMD_TX_ADC_CAL, adc_cal, sizeof(FT_ADC_CAL_ST));
  634. }
  635. /**
  636. * @brief This function is used to set adc cal param
  637. *
  638. * @param[out] adc_cal adc cal param
  639. *
  640. * @retval TLS_EFUSE_STATUS_OK get success
  641. * @retval TLS_EFUSE_STATUS_EIO get failed
  642. */
  643. int tls_set_adc_cal_param(FT_ADC_CAL_ST *adc_cal)
  644. {
  645. return tls_ft_param_set(CMD_TX_ADC_CAL, adc_cal, sizeof(FT_ADC_CAL_ST));
  646. }