|
|
@@ -24,20 +24,22 @@
|
|
|
#define USE_OTA_FT_PARAM 0
|
|
|
#include "wm_flash_map.h"
|
|
|
|
|
|
-extern void flashSRRW(unsigned long offset,unsigned char *buf,unsigned long sz, unsigned char *backbuf, unsigned int backlen, unsigned int rd);
|
|
|
-
|
|
|
|
|
|
#define FT_MAGICNUM_ADDR (FLASH_BASE_ADDR)
|
|
|
#define MAGICNUM_LEN (4)
|
|
|
-#define MAC_ADDR_LEN (8)
|
|
|
+#define MAC_ADDR_LEN (6)
|
|
|
#define FT_GAIN_LEN (84)
|
|
|
|
|
|
+#define FT_PARAM_EXT_REVERSED_LEN 32
|
|
|
+
|
|
|
typedef struct FT_PARAM
|
|
|
{
|
|
|
unsigned int magic_no;
|
|
|
unsigned int checksum;
|
|
|
unsigned char wifi_mac_addr[MAC_ADDR_LEN];
|
|
|
+ unsigned short version_no;
|
|
|
unsigned char bt_mac_addr[MAC_ADDR_LEN];
|
|
|
+ unsigned short ext_param_len;
|
|
|
unsigned int tx_dcoffset;
|
|
|
unsigned int rx_dcoffset;
|
|
|
unsigned int tx_iq_gain;
|
|
|
@@ -47,30 +49,49 @@ typedef struct FT_PARAM
|
|
|
unsigned char tx_gain[FT_GAIN_LEN];
|
|
|
}FT_PARAM_ST;
|
|
|
|
|
|
+typedef struct FT_PARAM_EXT_1
|
|
|
+{
|
|
|
+ unsigned int rf_freq_err;
|
|
|
+ unsigned int rf_cal_flag;
|
|
|
+ FT_ADC_CAL_ST adc_cal_param;
|
|
|
+ FT_TEMP_CAL_ST temp_cal_param;
|
|
|
+}FT_PARAM_ST_EXT_1;
|
|
|
+
|
|
|
+typedef struct FT_PARAM_VER1
|
|
|
+{
|
|
|
+ FT_PARAM_ST ft_param;
|
|
|
+ unsigned int ext_checksum;
|
|
|
+ FT_PARAM_ST_EXT_1 ft_ext1;
|
|
|
+ unsigned char _reversed[FT_PARAM_EXT_REVERSED_LEN];
|
|
|
+}FT_PARAM_ST_VER1;
|
|
|
+
|
|
|
static u8 default_mac[6] = {0x00,0x25,0x08,0x09,0x01,0x0F};
|
|
|
|
|
|
-FT_PARAM_ST gftParam;
|
|
|
+FT_PARAM_ST_VER1 gftParamVer1;
|
|
|
+
|
|
|
+FT_PARAM_ST *gftParam = (FT_PARAM_ST *)&gftParamVer1;
|
|
|
int tls_ft_param_init(void)
|
|
|
{
|
|
|
u32 crcvalue = 0;
|
|
|
psCrcContext_t ctx;
|
|
|
+ FT_PARAM_ST_VER1 *pft_ver1 = NULL;
|
|
|
FT_PARAM_ST *pft = NULL;
|
|
|
|
|
|
- if (gftParam.magic_no == SIGNATURE_WORD)
|
|
|
+ if (gftParam->magic_no == SIGNATURE_WORD)
|
|
|
{
|
|
|
return TRUE;
|
|
|
}
|
|
|
|
|
|
- pft = tls_mem_alloc(sizeof(FT_PARAM_ST));
|
|
|
+ pft = tls_mem_alloc(sizeof(FT_PARAM_ST_VER1));
|
|
|
if (pft == NULL)
|
|
|
{
|
|
|
return FALSE;
|
|
|
}
|
|
|
|
|
|
- memset(pft, 0xFF, sizeof(FT_PARAM_ST));
|
|
|
- memset(&gftParam, 0xFF, sizeof(FT_PARAM_ST));
|
|
|
+ memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1));
|
|
|
+ memset(gftParam, 0xFF, sizeof(FT_PARAM_ST_VER1));
|
|
|
|
|
|
- tls_fls_read(FT_MAGICNUM_ADDR, (unsigned char *)pft, sizeof(FT_PARAM_ST));
|
|
|
+ tls_fls_read(FT_MAGICNUM_ADDR, (unsigned char *)pft, sizeof(FT_PARAM_ST_VER1));
|
|
|
if (pft->magic_no == SIGNATURE_WORD)
|
|
|
{
|
|
|
tls_crypto_init();
|
|
|
@@ -83,10 +104,25 @@ int tls_ft_param_init(void)
|
|
|
return FALSE;
|
|
|
}
|
|
|
|
|
|
- if (gftParam.magic_no != SIGNATURE_WORD)
|
|
|
+ do
|
|
|
{
|
|
|
- memcpy(&gftParam, pft, sizeof(FT_PARAM_ST));
|
|
|
- }
|
|
|
+ if (pft->version_no > 0 && pft->version_no < 0xFFFF && pft->ext_param_len >= sizeof(FT_PARAM_ST_EXT_1) &&
|
|
|
+ pft->ext_param_len <= (sizeof(FT_PARAM_ST_EXT_1) + FT_PARAM_EXT_REVERSED_LEN))
|
|
|
+ {
|
|
|
+ pft_ver1 = (FT_PARAM_ST_VER1 *)pft;
|
|
|
+ tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT);
|
|
|
+ tls_crypto_crc_update(&ctx, (unsigned char *)&pft_ver1->ft_ext1, pft->ext_param_len);
|
|
|
+ tls_crypto_crc_final(&ctx, &crcvalue);
|
|
|
+ if(pft_ver1->ext_checksum == crcvalue)
|
|
|
+ {
|
|
|
+ memcpy((unsigned char *)gftParam, (unsigned char *)pft, sizeof(FT_PARAM_ST_VER1));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pft->version_no = 0xFFFF;
|
|
|
+ pft->ext_param_len = 0xFFFF;
|
|
|
+ memcpy((unsigned char *)gftParam, (unsigned char *)pft, sizeof(FT_PARAM_ST));
|
|
|
+ }while(0);
|
|
|
}
|
|
|
tls_mem_free(pft);
|
|
|
|
|
|
@@ -99,22 +135,28 @@ int tls_ft_param_get(unsigned int opnum, void *data, unsigned int rdlen)
|
|
|
{
|
|
|
switch (opnum)
|
|
|
{
|
|
|
+ case CMD_TX_ADC_CAL:
|
|
|
+ if(gftParam->version_no > 0 && gftParam->version_no < 0xFFFF)
|
|
|
+ {
|
|
|
+ memcpy(data, (unsigned char *)&gftParamVer1.ft_ext1.adc_cal_param, rdlen);
|
|
|
+ }
|
|
|
+ break;
|
|
|
case CMD_WIFI_MAC: /*MAC*/
|
|
|
- if ((gftParam.wifi_mac_addr[0]&0x1)
|
|
|
- ||(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])))
|
|
|
+ if ((gftParam->wifi_mac_addr[0]&0x1)
|
|
|
+ ||(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])))
|
|
|
{
|
|
|
memcpy(data, default_mac, rdlen);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- memcpy(data, gftParam.wifi_mac_addr, rdlen);
|
|
|
+ memcpy(data, gftParam->wifi_mac_addr, rdlen);
|
|
|
}
|
|
|
break;
|
|
|
case CMD_BT_MAC: /*MAC*/
|
|
|
{
|
|
|
u8 invalid_bt_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
|
|
u8 invalid_bt_mac1[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
|
- if ((memcmp(gftParam.bt_mac_addr, invalid_bt_mac, 6) == 0)||(memcmp(gftParam.bt_mac_addr, invalid_bt_mac1, 6) == 0))
|
|
|
+ if ((memcmp(gftParam->bt_mac_addr, invalid_bt_mac, 6) == 0)||(memcmp(gftParam->bt_mac_addr, invalid_bt_mac1, 6) == 0))
|
|
|
{
|
|
|
memcpy(data, default_mac, rdlen);
|
|
|
*((u8*)data+5) +=1; /*defalut plus 1*/
|
|
|
@@ -122,7 +164,7 @@ int tls_ft_param_get(unsigned int opnum, void *data, unsigned int rdlen)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- memcpy(data, gftParam.bt_mac_addr, rdlen);
|
|
|
+ memcpy(data, gftParam->bt_mac_addr, rdlen);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
@@ -130,37 +172,37 @@ int tls_ft_param_get(unsigned int opnum, void *data, unsigned int rdlen)
|
|
|
|
|
|
|
|
|
case CMD_TX_DC: /*tx_dcoffset*/
|
|
|
- *(unsigned int *)data = gftParam.tx_dcoffset;
|
|
|
+ *(unsigned int *)data = gftParam->tx_dcoffset;
|
|
|
break;
|
|
|
|
|
|
case CMD_RX_DC: /*rx_dcoffset*/
|
|
|
- *(unsigned int *)data = gftParam.rx_dcoffset;
|
|
|
+ *(unsigned int *)data = gftParam->rx_dcoffset;
|
|
|
break;
|
|
|
|
|
|
case CMD_TX_IQ_GAIN:
|
|
|
- *(unsigned int *)data = gftParam.tx_iq_gain;
|
|
|
+ *(unsigned int *)data = gftParam->tx_iq_gain;
|
|
|
break;
|
|
|
|
|
|
case CMD_RX_IQ_GAIN:
|
|
|
- *(unsigned int *)data = gftParam.rx_iq_gain;
|
|
|
+ *(unsigned int *)data = gftParam->rx_iq_gain;
|
|
|
break;
|
|
|
|
|
|
case CMD_TX_IQ_PHASE:
|
|
|
- *(unsigned int *)data = gftParam.tx_iq_phase;
|
|
|
+ *(unsigned int *)data = gftParam->tx_iq_phase;
|
|
|
break;
|
|
|
|
|
|
case CMD_RX_IQ_PHASE:
|
|
|
- *(unsigned int *)data = gftParam.rx_iq_phase;
|
|
|
+ *(unsigned int *)data = gftParam->rx_iq_phase;
|
|
|
break;
|
|
|
|
|
|
case CMD_TX_GAIN: /*gain*/
|
|
|
if (rdlen < FT_GAIN_LEN)
|
|
|
{
|
|
|
- memcpy(data, gftParam.tx_gain, rdlen);
|
|
|
+ memcpy(data, gftParam->tx_gain, rdlen);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- memcpy(data, gftParam.tx_gain, FT_GAIN_LEN);
|
|
|
+ memcpy(data, gftParam->tx_gain, FT_GAIN_LEN);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
@@ -180,40 +222,38 @@ int tls_ft_param_set(unsigned int opnum, void *data, unsigned int len)
|
|
|
{
|
|
|
return -1;
|
|
|
}
|
|
|
- //printf("tls_ft_param_set: opnum=%d, val=%x\n", opnum, *(unsigned int *)data);
|
|
|
- //tls_fls_read(FT_MAGICNUM_ADDR, (unsigned char *)&gftParam, sizeof(gftParam));
|
|
|
switch (opnum)
|
|
|
{
|
|
|
case CMD_WIFI_MAC: /*MAC*/
|
|
|
- memcpy(gftParam.wifi_mac_addr, (unsigned char *)data, len);
|
|
|
+ memcpy(gftParam->wifi_mac_addr, (unsigned char *)data, len);
|
|
|
break;
|
|
|
|
|
|
case CMD_BT_MAC: /*BT MAC*/
|
|
|
- memcpy(gftParam.bt_mac_addr, (unsigned char *)data, len);
|
|
|
+ memcpy(gftParam->bt_mac_addr, (unsigned char *)data, len);
|
|
|
break;
|
|
|
|
|
|
case CMD_TX_DC: /*tx_dcoffset*/
|
|
|
- gftParam.tx_dcoffset = *(unsigned int *)data;
|
|
|
+ gftParam->tx_dcoffset = *(unsigned int *)data;
|
|
|
break;
|
|
|
|
|
|
case CMD_RX_DC: /*rx_dcoffset*/
|
|
|
- gftParam.rx_dcoffset = *(unsigned int *)data;
|
|
|
+ gftParam->rx_dcoffset = *(unsigned int *)data;
|
|
|
break;
|
|
|
|
|
|
case CMD_TX_IQ_GAIN:
|
|
|
- gftParam.tx_iq_gain = *(unsigned int *)data;
|
|
|
+ gftParam->tx_iq_gain = *(unsigned int *)data;
|
|
|
break;
|
|
|
|
|
|
case CMD_RX_IQ_GAIN:
|
|
|
- gftParam.rx_iq_gain = *(unsigned int *) data;
|
|
|
+ gftParam->rx_iq_gain = *(unsigned int *) data;
|
|
|
break;
|
|
|
|
|
|
case CMD_TX_IQ_PHASE:
|
|
|
- gftParam.tx_iq_phase = *(unsigned int *)data;
|
|
|
+ gftParam->tx_iq_phase = *(unsigned int *)data;
|
|
|
break;
|
|
|
|
|
|
case CMD_RX_IQ_PHASE:
|
|
|
- gftParam.rx_iq_phase = *(unsigned int *) data;
|
|
|
+ gftParam->rx_iq_phase = *(unsigned int *) data;
|
|
|
break;
|
|
|
|
|
|
case CMD_TX_GAIN: /*gain*/
|
|
|
@@ -225,7 +265,7 @@ int tls_ft_param_set(unsigned int opnum, void *data, unsigned int len)
|
|
|
{
|
|
|
writelen = len;
|
|
|
}
|
|
|
- memcpy(gftParam.tx_gain, data, writelen);
|
|
|
+ memcpy(gftParam->tx_gain, data, writelen);
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
@@ -234,11 +274,19 @@ int tls_ft_param_set(unsigned int opnum, void *data, unsigned int len)
|
|
|
|
|
|
tls_crypto_init();
|
|
|
tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT);
|
|
|
- gftParam.magic_no = SIGNATURE_WORD;
|
|
|
- tls_crypto_crc_update(&ctx, (unsigned char *)&gftParam + 8, sizeof(gftParam) -8);
|
|
|
- tls_crypto_crc_final(&ctx, &gftParam.checksum);
|
|
|
+ gftParam->magic_no = SIGNATURE_WORD;
|
|
|
+ tls_crypto_crc_update(&ctx, (unsigned char *)gftParam + 8, sizeof(FT_PARAM_ST) -8);
|
|
|
+ tls_crypto_crc_final(&ctx, &gftParam->checksum);
|
|
|
+ writelen = sizeof(FT_PARAM_ST);
|
|
|
+ if(gftParam->version_no > 0 && gftParam->version_no < 0xFFFF)
|
|
|
+ {
|
|
|
+ writelen = sizeof(FT_PARAM_ST_VER1);
|
|
|
+ tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT);
|
|
|
+ tls_crypto_crc_update(&ctx, (unsigned char *)&gftParamVer1.ft_ext1, gftParam->ext_param_len);
|
|
|
+ tls_crypto_crc_final(&ctx, &gftParamVer1.ext_checksum);
|
|
|
+ }
|
|
|
tls_flash_unlock();
|
|
|
- tls_fls_write(FT_MAGICNUM_ADDR, (unsigned char *)&gftParam, sizeof(gftParam));
|
|
|
+ tls_fls_write(FT_MAGICNUM_ADDR, (unsigned char *)gftParam, writelen);
|
|
|
tls_flash_lock();
|
|
|
return 0;
|
|
|
}
|
|
|
@@ -430,30 +478,98 @@ int tls_set_rx_iq_phase(u8 *rxPhase)
|
|
|
|
|
|
int tls_freq_err_op(u8 *freqerr, u8 flag)
|
|
|
{
|
|
|
- tls_flash_unlock();
|
|
|
+ int ret = 0;
|
|
|
+ psCrcContext_t ctx;
|
|
|
+ int value = 0;
|
|
|
if (flag){
|
|
|
- tls_fls_write(FT_MAGICNUM_ADDR + sizeof(FT_PARAM_ST), freqerr, 4);
|
|
|
+ tls_flash_unlock();
|
|
|
+ if(gftParam->version_no > 0 && gftParam->version_no < 0xFFFF)
|
|
|
+ {
|
|
|
+ memcpy((char *)&gftParamVer1.ft_ext1.rf_freq_err, (char *)freqerr, FREQERR_LEN);
|
|
|
+ tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT);
|
|
|
+ tls_crypto_crc_update(&ctx, (unsigned char *)&gftParamVer1.ft_ext1, gftParam->ext_param_len);
|
|
|
+ tls_crypto_crc_final(&ctx, &gftParamVer1.ext_checksum);
|
|
|
+ ret = tls_fls_write(FT_MAGICNUM_ADDR, (unsigned char *)gftParam, sizeof(FT_PARAM_ST_VER1));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ret = tls_fls_write(FREQERR_ADDR, freqerr, FREQERR_LEN);
|
|
|
+ }
|
|
|
+ tls_flash_lock();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(gftParam->version_no > 0 && gftParam->version_no < 0xFFFF)
|
|
|
+ {
|
|
|
+ memcpy((char *)freqerr, (char *)&gftParamVer1.ft_ext1.rf_freq_err, FREQERR_LEN);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ret = tls_fls_read(FREQERR_ADDR, freqerr, FREQERR_LEN);
|
|
|
+ }
|
|
|
+
|
|
|
+ memcpy(&value, freqerr, FREQERR_LEN);
|
|
|
+ if (value > 200000) /*when freq offset is out of range (-200KHz, 200KHz),do not use it*/
|
|
|
+ {
|
|
|
+ value = 200000;
|
|
|
+ memcpy((char *)freqerr, (char *)&value, FREQERR_LEN);
|
|
|
+ }
|
|
|
+ else if (value < -200000)
|
|
|
+ {
|
|
|
+ value = -200000;
|
|
|
+ memcpy((char *)freqerr, (char *)&value, FREQERR_LEN);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ret == 0)
|
|
|
+ {
|
|
|
+ return TLS_EFUSE_STATUS_OK;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- tls_fls_read(FT_MAGICNUM_ADDR + sizeof(FT_PARAM_ST), freqerr, 4);
|
|
|
+ return TLS_EFUSE_STATUS_EINVALID;
|
|
|
}
|
|
|
- tls_flash_lock();
|
|
|
- return TLS_EFUSE_STATUS_OK;
|
|
|
}
|
|
|
|
|
|
-int tls_rf_vcg_ctrl_op(u8 *vcg, u8 flag)
|
|
|
+int tls_rf_cal_finish_op(u8 *calflag, u8 flag)
|
|
|
{
|
|
|
- tls_flash_unlock();
|
|
|
+ int ret = 0;
|
|
|
+ psCrcContext_t ctx;
|
|
|
if (flag){
|
|
|
- tls_fls_write(VCG_ADDR, vcg, VCG_LEN);
|
|
|
+ tls_flash_unlock();
|
|
|
+ if(gftParam->version_no > 0 && gftParam->version_no < 0xFFFF)
|
|
|
+ {
|
|
|
+ memcpy((char *)&gftParamVer1.ft_ext1.rf_cal_flag, (char *)calflag, CAL_FLAG_LEN);
|
|
|
+ tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT);
|
|
|
+ tls_crypto_crc_update(&ctx, (unsigned char *)&gftParamVer1.ft_ext1, gftParam->ext_param_len);
|
|
|
+ tls_crypto_crc_final(&ctx, &gftParamVer1.ext_checksum);
|
|
|
+ ret = tls_fls_write(FT_MAGICNUM_ADDR, (unsigned char *)gftParam, sizeof(FT_PARAM_ST_VER1));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ret = tls_fls_write(CAL_FLAG_ADDR, calflag, CAL_FLAG_LEN);
|
|
|
+ }
|
|
|
+ tls_flash_lock();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- tls_fls_read(VCG_ADDR, vcg, VCG_LEN);
|
|
|
+ if(gftParam->version_no > 0 && gftParam->version_no < 0xFFFF)
|
|
|
+ {
|
|
|
+ memcpy((char *)calflag, (char *)&gftParamVer1.ft_ext1.rf_cal_flag, CAL_FLAG_LEN);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ret = tls_fls_read(CAL_FLAG_ADDR, calflag, CAL_FLAG_LEN);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ret == 0)
|
|
|
+ {
|
|
|
+ return TLS_EFUSE_STATUS_OK;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return TLS_EFUSE_STATUS_EINVALID;
|
|
|
}
|
|
|
- tls_flash_lock();
|
|
|
- return TLS_EFUSE_STATUS_OK;
|
|
|
}
|
|
|
|
|
|
/**********************************************************************************************************
|
|
|
@@ -484,6 +600,10 @@ int tls_set_tx_gain(u8 *txgain)
|
|
|
|
|
|
|
|
|
}
|
|
|
+int tls_get_adc_cal_param(FT_ADC_CAL_ST *adc_cal)
|
|
|
+{
|
|
|
+ return tls_ft_param_get(CMD_TX_ADC_CAL, adc_cal, sizeof(FT_ADC_CAL_ST));
|
|
|
+}
|
|
|
|
|
|
|
|
|
|