#include #include #include "Param.h" #include "HIDO_CRC16.h" #include "MCUFlash.h" #include "AppConfig.h" /******************************************************************************* * Macro * *******************************************************************************/ #define PARAM_VER_OFFSET 0 #define PARAM_LEN_OFFSET 4 #define PARAM_CRC_OFFSET 6 #define PARAM_DATA_OFFSET 8 #define PARAM_VERSION 0x01000004 #define PARAM_BASE_ADDR 0x08070000 /******************************************************************************* * Type Definition * *******************************************************************************/ typedef struct { HIDO_BOOL m_bCheckVersion; HIDO_UINT32 m_u32Addr; HIDO_UINT32 m_u32MaxSize; }ST_ParamAddrInfo; /******************************************************************************* * Local Variable * *******************************************************************************/ static const ST_ParamAddrInfo l_astParamAddrInfo[PARAM_GROUP_LAST] = { { HIDO_TRUE, 0x0000, 0x1000}, /* PARAM_GROUP_TCP_CLIENT */ { HIDO_TRUE, 0x1000, 0x1000}, /* PARAM_GROUP_WIFI */ { HIDO_TRUE, 0x2000, 0x1000}, /* PARAM_GROUP_DEVICE */ }; /******************************************************************************* * Local Function Declaration * *******************************************************************************/ static HIDO_INT32 Param_Write(HIDO_UINT32 _u32Addr, HIDO_UINT32 _u32AddrSize, void *_pParamData, HIDO_UINT32 _u32ParamLen); static HIDO_INT32 Param_Read(HIDO_BOOL _bCheckVersion, HIDO_UINT32 _u32Addr, HIDO_UINT32 _u32AddrSize, void *_pParamData, HIDO_UINT32 _u32ParamLen); /******************************************************************************* * Local Function * *******************************************************************************/ /******************************************************************************* * Function Name : Param_Write * Description : ²ÎÊýдÈë * Input : _u32Addr ²ÎÊýµØÖ· * _u32AddrSize ²ÎÊý¿Õ¼ä´óС * _pParamData ²ÎÊýÊý¾Ý * _u32ParamLen дÈëµÄ²ÎÊý³¤¶È * Output : None * Return : HIDO_ERR ʧ°Ü * HIDO_OK ³É¹¦ * Author : DuJian * Modified Date: : 2018Äê7ÔÂ23ÈÕ *******************************************************************************/ static HIDO_INT32 Param_Write(HIDO_UINT32 _u32Addr, HIDO_UINT32 _u32AddrSize, void *_pParamData, HIDO_UINT32 _u32ParamLen) { HIDO_UINT32 u32TmpDWord = 0; HIDO_UINT16 u16TmpWord = 0; HIDO_INT32 iR32esult = HIDO_OK; if (NULL == _pParamData || _u32AddrSize < _u32ParamLen) { return HIDO_ERR; } /* ¸ñʽ»¯´æ´¢Çø */ _u32Addr += PARAM_BASE_ADDR; if (MCUFlash_Erase(_u32Addr, PARAM_DATA_OFFSET + _u32ParamLen) != HIDO_OK) { iR32esult = HIDO_ERR; goto exti; } /* д²ÎÊý°æ±¾ */ u32TmpDWord = PARAM_VERSION; if (MCUFlash_Write(_u32Addr + PARAM_VER_OFFSET, (HIDO_UINT8 *) &u32TmpDWord, sizeof(u32TmpDWord)) != HIDO_OK) { iR32esult = HIDO_ERR; goto exti; } /* д²ÎÊý³¤¶È */ u16TmpWord = _u32ParamLen; if (MCUFlash_Write(_u32Addr + PARAM_LEN_OFFSET, (HIDO_UINT8 *) &u16TmpWord, sizeof(u16TmpWord)) != HIDO_OK) { iR32esult = HIDO_ERR; goto exti; } /* д²ÎÊýУÑé */ u16TmpWord = HIDO_CRC16Calc((HIDO_UINT8 *) _pParamData, _u32ParamLen); if (MCUFlash_Write(_u32Addr + PARAM_CRC_OFFSET, (HIDO_UINT8 *) &u16TmpWord, sizeof(u16TmpWord)) != HIDO_OK) { iR32esult = HIDO_ERR; goto exti; } /* д²ÎÊýÊý¾Ý */ if (MCUFlash_Write(_u32Addr + PARAM_DATA_OFFSET, (HIDO_UINT8 *) _pParamData, _u32ParamLen) != HIDO_OK) { iR32esult = HIDO_ERR; goto exti; } exti: return iR32esult; } /******************************************************************************* * Function Name : Param_Read * Description : ²ÎÊý¶ÁÈ¡ * Input : _u32Addr ²ÎÊýµØÖ· * _u32AddrSize ²ÎÊý¿Õ¼ä´óС * _u32ParamLen ¶ÁÈ¡µÄ²ÎÊý³¤¶È * Output : _pParamData ²ÎÊýÊý¾Ý * Return : HIDO_ERR ʧ°Ü * HIDO_OK ³É¹¦ * Author : DuJian * Modified Date: : 2018Äê7ÔÂ23ÈÕ *******************************************************************************/ static HIDO_INT32 Param_Read(HIDO_BOOL _bCheckVersion, HIDO_UINT32 _u32Addr, HIDO_UINT32 _u32AddrSize, void *_pParamData, HIDO_UINT32 _u32ParamLen) { HIDO_UINT32 u32TmpDWord = 0; HIDO_UINT16 u16TmpWord = 0; if (NULL == _pParamData || _u32AddrSize < _u32ParamLen) { return HIDO_ERR; } _u32Addr += PARAM_BASE_ADDR; if(HIDO_TRUE == _bCheckVersion) { /* ¼ì²é²ÎÊý°æ±¾ */ MCUFlash_Read((HIDO_UINT8 *) &u32TmpDWord, _u32Addr + PARAM_VER_OFFSET, sizeof(HIDO_UINT32)); if (u32TmpDWord != PARAM_VERSION) { return HIDO_ERR; } } /* ¼ì²é²ÎÊý³¤¶È */ MCUFlash_Read((HIDO_UINT8 *) &u16TmpWord, _u32Addr + PARAM_LEN_OFFSET, sizeof(HIDO_UINT16)); if (u16TmpWord != _u32ParamLen) { return HIDO_ERR; } /* ¶Á²ÎÊýÊý¾Ý */ MCUFlash_Read((HIDO_UINT8 *) _pParamData, _u32Addr + PARAM_DATA_OFFSET, _u32ParamLen); /* ¼ì²é²ÎÊýУÑé */ MCUFlash_Read((HIDO_UINT8 *) &u16TmpWord, _u32Addr + PARAM_CRC_OFFSET, sizeof(HIDO_UINT16)); if (HIDO_CRC16Calc((HIDO_UINT8 *) _pParamData, _u32ParamLen) != u16TmpWord) { return HIDO_ERR; } return HIDO_OK; } /******************************************************************************* * Global Function * *******************************************************************************/ /******************************************************************************* * Function Name : Param_Reset * Description : ²ÎÊý»Ö¸´³ö³§ * Input : _eGroup ²ÎÊý×é * Output : None * Return : HIDO_ERR ʧ°Ü * HIDO_OK ³É¹¦ * Author : DuJian * Modified Date: : 2018Äê7ÔÂ23ÈÕ *******************************************************************************/ HIDO_INT32 Param_Reset(E_ParamGroup _eGroup) { if (MCUFlash_Erase(PARAM_BASE_ADDR + l_astParamAddrInfo[_eGroup].m_u32Addr, l_astParamAddrInfo[_eGroup].m_u32MaxSize) != HIDO_OK) { return HIDO_ERR; } return HIDO_OK; } /******************************************************************************* * Function Name : Param_Save * Description : ²ÎÊý±£´æ * Input : _eGroup ²ÎÊý×é * _pParamData ²ÎÊýÊý¾Ý * _u32ParamLen ²ÎÊý³¤¶È * Output : None * Return : HIDO_ERR ʧ°Ü * HIDO_OK ³É¹¦ * Author : DuJian * Modified Date: : 2018Äê7ÔÂ23ÈÕ *******************************************************************************/ HIDO_INT32 Param_Save(E_ParamGroup _eGroup, HIDO_VOID *_pParamData, HIDO_UINT32 _u32ParamLen) { if (_eGroup >= PARAM_GROUP_LAST) { return HIDO_ERR; } /* ±£´æÖ÷·ÖÇø²ÎÊý */ if(Param_Write(l_astParamAddrInfo[_eGroup].m_u32Addr, l_astParamAddrInfo[_eGroup].m_u32MaxSize, _pParamData, _u32ParamLen) != HIDO_OK) { return HIDO_ERR; } return HIDO_OK; } /******************************************************************************* * Function Name : Param_Init * Description : ²ÎÊý³õʼ»¯ * Input : _eGroup ²ÎÊý×é * _u32ParamLen ²ÎÊý³¤¶È * Output : _pParamData ²ÎÊýÊý¾Ý * Return : HIDO_ERR ʧ°Ü * HIDO_OK ³É¹¦ * Author : DuJian * Modified Date: : 2018Äê7ÔÂ23ÈÕ *******************************************************************************/ HIDO_INT32 Param_Init(E_ParamGroup _eGroup, HIDO_VOID *_pParamData, HIDO_UINT32 _u32ParamLen) { MCUFlash_Init(); /* ¶ÁÈ¡Ö÷·ÖÇøµÄ */ if (Param_Read(l_astParamAddrInfo[_eGroup].m_bCheckVersion, l_astParamAddrInfo[_eGroup].m_u32Addr, l_astParamAddrInfo[_eGroup].m_u32MaxSize, _pParamData, _u32ParamLen) != HIDO_OK) /* Ö÷·ÖÇøÊý¾ÝË𻵠*/ { return HIDO_ERR; } return HIDO_OK; }