WXK
2023-09-08 00fc23c0b2c7b7dfd6df3e9fb9e385ec949cd8cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
#include <stdio.h>
#include <string.h>
#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;
}