OSDN Git Service

ModMiMicSettingの動作確認
[mimic/MiMicSDK.git] / lib / src / flash / NyLPC_cMiMicConfiglation.c
1 #include "NyLPC_flash.h"\r
2 #include "NyLPC_httpService.h"\r
3 #include "NyLPC_cMiMicConfiglation.h"\r
4 \r
5 /**\r
6  * Onchip flashを使ったコンフィギュレーション保存システムです。\r
7  */\r
8 \r
9 \r
10 \r
11 \r
12 #define IP2Int(a0,a1,a2,a3) ((0xff000000&(a0<<24))|(0x00ff0000&(a1<<16))|(0x0000ff00&(a2<<8))|(0x000000ff&(a3)))\r
13 /**\r
14  * コンフィギュレーションの保存セクタ\r
15  */\r
16 #define MIMIC_CONFIGLATION_FLASH_SECTOR 29\r
17 #define MIMIC_CONFIGLATION_FLASH_SECTOR_ADDR 0x00078000\r
18 \r
19 /**\r
20  * コンフィギュレーション値はホストオーダーで保存する。\r
21  */\r
22 const struct NyLPC_TMimicConfigulation factory_default=\r
23 {\r
24         0xffffffff,\r
25         0x02010203,0x0405ffff,\r
26         IP2Int(192,168,0,39),\r
27         IP2Int(255,255,255,0),\r
28         IP2Int(192,168,0,254),\r
29         80,\r
30         0x0000FFFF\r
31 };\r
32 \r
33 static NyLPC_TBool setUserConfigulation(void);\r
34 static NyLPC_TBool hasUserConfigulation(void);\r
35 \r
36 /**\r
37  * ユーザコンフィギュレーションを更新する。\r
38  * この関数をコールするときは、割込/FreeRTOSを一時停止すること。\r
39  */\r
40 NyLPC_TBool NyLPC_cMiMicConfiglation_updateConfigulation(const struct NyLPC_TMimicConfigulation* i_congfiglation)\r
41 {\r
42         NyLPC_TcOnchipFlashWriter_t s;\r
43         NyLPC_cOnchipFlashWriter_initialize(&s);\r
44         //イレース\r
45         if(!NyLPC_cOnchipFlashWriter_elase(&s,MIMIC_CONFIGLATION_FLASH_SECTOR,MIMIC_CONFIGLATION_FLASH_SECTOR)){\r
46                 NyLPC_OnErrorGoto(Error);\r
47         }\r
48         //コンフィギュレーションを書き込む。\r
49         if(!NyLPC_cOnchipFlashWriter_writeSector(&s,MIMIC_CONFIGLATION_FLASH_SECTOR,0x00000000,i_congfiglation,sizeof(struct NyLPC_TMimicConfigulation))){\r
50                 NyLPC_OnErrorGoto(Error);\r
51         }\r
52         //ユーザコンフィギュレーションをONにする。\r
53         if(!setUserConfigulation()){\r
54                 NyLPC_OnErrorGoto(Error);\r
55         }\r
56         NyLPC_cOnchipFlashWriter_finalize(&s);\r
57         return NyLPC_TBool_TRUE;\r
58 Error:\r
59         NyLPC_cOnchipFlashWriter_finalize(&s);\r
60         return NyLPC_TBool_FALSE;\r
61 }\r
62 /**\r
63  * コンフィギュレーション値を返す。\r
64  */\r
65 const struct NyLPC_TMimicConfigulation* NyLPC_cMiMicConfiglation_loadMiMicConfigulation(void)\r
66 {\r
67         if(hasUserConfigulation()){\r
68                 //userコンフィギュレーション読むよ\r
69                 return (const struct NyLPC_TMimicConfigulation*)(MIMIC_CONFIGLATION_FLASH_SECTOR_ADDR);\r
70         }else{\r
71                 //Userコンフィギュレーションない\r
72                 return &factory_default;\r
73         }\r
74 }\r
75 \r
76 \r
77 \r
78 \r
79 /**\r
80  * ユーザコンフィギュレーションが存在すると、true.\r
81  */\r
82 static NyLPC_TBool hasUserConfigulation(void)\r
83 {\r
84         volatile const NyLPC_TUInt32* fast_boot=&(factory_default.fast_boot);\r
85         return (*fast_boot)!=0xffffffff;\r
86 }\r
87 /**\r
88  * コンフィギュレーションモードを、ユーザコンフィギュレーションにセットする。\r
89  */\r
90 static NyLPC_TBool setUserConfigulation(void)\r
91 {\r
92         const NyLPC_TUInt32* volatile fast_boot=&(factory_default.fast_boot);\r
93         NyLPC_TUInt32 data=0xFFFFFFFE;\r
94         NyLPC_TcOnchipFlashWriter_t s;\r
95 \r
96         if(*fast_boot==0xffffffff){\r
97                 //フラグ値のアドレスが4バイトアライメントにあるFlashメモリか確認する。\r
98                 if(((NyLPC_TUInt32)fast_boot)%4==0 && (!NyLPC_cOnchipFlashWriter_isOnchipFlash(fast_boot))){\r
99                         //書き込み\r
100                         NyLPC_cOnchipFlashWriter_initialize(&s);\r
101                         NyLPC_cOnchipFlashWriter_write(&s,fast_boot,&data,4);\r
102                         NyLPC_cOnchipFlashWriter_finalize(&s);\r
103                 }else{\r
104                         //しくじった\r
105                         return NyLPC_TBool_FALSE;\r
106                 }\r
107         }\r
108         return NyLPC_TBool_TRUE;\r
109 }\r
110 \r