wm_param.c 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493
  1. /*****************************************************************************
  2. *
  3. * File Name : wm_param.c
  4. *
  5. * Description: param manager Module
  6. *
  7. * Copyright (c) 2014 Winner Micro Electronic Design Co., Ltd.
  8. * All rights reserved.
  9. *
  10. * Author : dave
  11. *
  12. * Date : 2014-6-12
  13. *****************************************************************************/
  14. #include <string.h>
  15. #include "wm_debug.h"
  16. #include "wm_efuse.h"
  17. #include "wm_flash.h"
  18. #include "wm_internal_flash.h"
  19. #include "wm_params.h"
  20. #include "wm_param.h"
  21. #include "wm_mem.h"
  22. #include "utils.h"
  23. #include "wm_flash_map.h"
  24. #define USE_TWO_RAM_FOR_PARAMETER 0
  25. static struct tls_param_flash flash_param;
  26. #if USE_TWO_RAM_FOR_PARAMETER
  27. static struct tls_sys_param sram_param;
  28. #endif
  29. struct tls_sys_param *user_default_param = NULL;
  30. struct tls_sys_param * tls_param_user_param_init(void);
  31. static tls_os_sem_t *sys_param_lock = NULL;
  32. static const u8 factory_default_hardware[8] = {'H', 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  33. u8 updp_mode;//upadate default parameters mode, 0:not updating or up finish; 1:updating
  34. static int param_flash_verify(u32 data_addr, u8 *data_buffer, u32 len)
  35. {
  36. int err;
  37. u8 *buffer;
  38. buffer = tls_mem_alloc(len);
  39. if (buffer == NULL) {return 0;}
  40. do {
  41. err = tls_fls_read(data_addr, buffer, len);
  42. if (err != TLS_FLS_STATUS_OK) {
  43. err = 0;
  44. break;
  45. }
  46. if (memcmp(buffer, data_buffer, len) == 0) {
  47. err = 1;
  48. } else {
  49. err = 0;
  50. }
  51. } while (0);
  52. tls_mem_free(buffer);
  53. return err;
  54. }
  55. static int param_to_flash(int id, int modify_count, int partition_num)
  56. {
  57. int err;
  58. #if USE_TWO_RAM_FOR_PARAMETER
  59. struct tls_sys_param *src;
  60. struct tls_sys_param *dest;
  61. #endif
  62. if ((id < TLS_PARAM_ID_ALL) || (id >= TLS_PARAM_ID_MAX)) {return TLS_PARAM_STATUS_EINVALID;}
  63. err = TLS_PARAM_STATUS_OK;
  64. #if USE_TWO_RAM_FOR_PARAMETER
  65. src = &sram_param;
  66. dest = &flash_param.parameters;
  67. switch (id) {
  68. case TLS_PARAM_ID_ALL:
  69. MEMCPY(dest, src, sizeof(struct tls_sys_param));
  70. break;
  71. case TLS_PARAM_ID_SSID:
  72. MEMCPY(&dest->ssid, &src->ssid, sizeof(struct tls_param_ssid));
  73. break;
  74. case TLS_PARAM_ID_ENCRY:
  75. dest->encry = src->encry;
  76. break;
  77. case TLS_PARAM_ID_KEY:
  78. MEMCPY(&dest->key, &src->key, sizeof(struct tls_param_key));
  79. break;
  80. case TLS_PARAM_ID_IP:
  81. MEMCPY(&dest->ipcfg, &src->ipcfg, sizeof(struct tls_param_ip));
  82. break;
  83. case TLS_PARAM_ID_AUTOMODE:
  84. dest->auto_mode = src->auto_mode;
  85. break;
  86. case TLS_PARAM_ID_DEFSOCKET:
  87. MEMCPY(&dest->remote_socket_cfg, &src->remote_socket_cfg, sizeof(struct tls_param_socket));
  88. break;
  89. case TLS_PARAM_ID_BSSID:
  90. MEMCPY(&dest->bssid, &src->bssid, sizeof(struct tls_param_bssid));
  91. break;
  92. case TLS_PARAM_ID_CHANNEL:
  93. dest->channel = src->channel;
  94. break;
  95. case TLS_PARAM_ID_CHANNEL_EN:
  96. dest->channel_enable = src->channel_enable;
  97. break;
  98. case TLS_PARAM_ID_COUNTRY_REGION:
  99. dest->wireless_region = src->wireless_region;
  100. break;
  101. case TLS_PARAM_ID_WPROTOCOL:
  102. dest->wireless_protocol = src->wireless_protocol;
  103. break;
  104. case TLS_PARAM_ID_ADHOC_AUTOCREATE:
  105. dest->auto_create_adhoc = src->auto_create_adhoc;
  106. break;
  107. case TLS_PARAM_ID_ROAMING:
  108. dest->auto_roam = src->auto_roam;
  109. break;
  110. case TLS_PARAM_ID_AUTO_RETRY_CNT:
  111. dest->auto_retrycnt = src->auto_retrycnt;
  112. break;
  113. case TLS_PARAM_ID_WBGR:
  114. MEMCPY(&dest->wbgr, &src->wbgr, sizeof(struct tls_param_bgr));
  115. break;
  116. case TLS_PARAM_ID_USRINTF:
  117. dest->user_port_mode = src->user_port_mode;
  118. break;
  119. case TLS_PARAM_ID_ESCAPE_CHAR:
  120. dest->EscapeChar = src->EscapeChar;
  121. break;
  122. case TLS_PARAM_ID_ESCAPE_PERIOD:
  123. dest->EscapePeriod = src->EscapePeriod;
  124. break;
  125. case TLS_PARAM_ID_AUTO_TRIGGER_LENGTH:
  126. dest->transparent_trigger_length = src->transparent_trigger_length;
  127. break;
  128. case TLS_PARAM_ID_AUTO_TRIGGER_PERIOD:
  129. dest->transparent_trigger_period = src->transparent_trigger_period;
  130. break;
  131. case TLS_PARAM_ID_DEBUG_MODE:
  132. dest->debug_mode = src->debug_mode;
  133. break;
  134. case TLS_PARAM_ID_HARDVERSION:
  135. MEMCPY(&dest->hardware_version, &src->hardware_version, sizeof(struct tls_param_hardware_version));
  136. break;
  137. case TLS_PARAM_ID_BRDSSID:
  138. dest->ssid_broadcast_enable = src->ssid_broadcast_enable;
  139. break;
  140. case TLS_PARAM_ID_DNSNAME:
  141. MEMCPY(dest->local_dnsname, src->local_dnsname, 32);
  142. break;
  143. case TLS_PARAM_ID_DEVNAME:
  144. MEMCPY(dest->local_device_name, src->local_device_name, 32);
  145. break;
  146. case TLS_PARAM_ID_PSM:
  147. dest->auto_powersave = src->auto_powersave;
  148. break;
  149. case TLS_PARAM_ID_ORAY_CLIENT:
  150. MEMCPY(&dest->oray_client_setting, &src->oray_client_setting, sizeof(struct tls_param_oray_client));
  151. break;
  152. case TLS_PARAM_ID_UPNP:
  153. dest->upnp_enable = src->upnp_enable;
  154. break;
  155. case TLS_PARAM_ID_UART:
  156. MEMCPY(&dest->uart_cfg, &src->uart_cfg, sizeof(struct tls_param_uart));
  157. break;
  158. #if TLS_CONFIG_WPS
  159. case TLS_PARAM_ID_WPS:
  160. MEMCPY(&dest->wps, &src->wps, sizeof(struct tls_param_wps));
  161. break;
  162. #endif
  163. case TLS_PARAM_ID_CHANNEL_LIST:
  164. dest->channellist = src->channellist;
  165. break;
  166. case TLS_PARAM_ID_ONESHOT_CFG:
  167. dest->oneshotflag = src->oneshotflag;
  168. break;
  169. case TLS_PARAM_ID_SHA1:
  170. MEMCPY(&dest->psk, &src->psk, sizeof(struct tls_param_sha1));
  171. break;
  172. case TLS_PARAM_ID_ORIGIN_KEY:
  173. MEMCPY(&dest->original_key, &src->original_key, sizeof(struct tls_param_original_key));
  174. break;
  175. case TLS_PARAM_ID_ORIGIN_SSID:
  176. MEMCPY(&dest->original_ssid, &src->original_ssid, sizeof(struct tls_param_ssid));
  177. break;
  178. case TLS_PARAM_ID_AUTO_RECONNECT:
  179. dest->auto_reconnect = src->auto_reconnect;
  180. break;
  181. case TLS_PARAM_ID_IO_MODE:
  182. dest->IoMode = src->IoMode;
  183. break;
  184. case TLS_PARAM_ID_CMD_MODE:
  185. dest->CmdMode = src->CmdMode;
  186. break;
  187. case TLS_PARAM_ID_PASSWORD:
  188. MEMCPY(dest->PassWord, src->PassWord, sizeof(src->PassWord));
  189. break;
  190. case TLS_PARAM_ID_WEBS_CONFIG:
  191. dest->WebsCfg = src->WebsCfg;
  192. break;
  193. case TLS_PARAM_ID_QUICK_CONNECT:
  194. MEMCPY(&dest->quick_connect, &src->quick_connect, sizeof(struct tls_param_quick_connect));
  195. break;
  196. case TLS_PARAM_ID_KEY_CHANGE:
  197. dest->key_changed = src->key_changed;
  198. break;
  199. case TLS_PARAM_ID_SSID_CHANGE:
  200. dest->ssid_changed = src->ssid_changed;
  201. break;
  202. #if TLS_CONFIG_AP
  203. case TLS_PARAM_ID_SOFTAP_SSID:
  204. MEMCPY(&dest->apsta_ssid, &src->apsta_ssid, sizeof(struct tls_param_ssid));
  205. break;
  206. case TLS_PARAM_ID_SOFTAP_PSK:
  207. MEMCPY(&dest->apsta_psk, &src->apsta_psk, sizeof(struct tls_param_sha1));
  208. break;
  209. case TLS_PARAM_ID_SOFTAP_ENCRY:
  210. dest->encry4softap = src->encry4softap;
  211. break;
  212. case TLS_PARAM_ID_SOFTAP_KEY:
  213. MEMCPY(&dest->key4softap, &src->key4softap, sizeof(struct tls_param_key));
  214. break;
  215. case TLS_PARAM_ID_SOFTAP_IP:
  216. MEMCPY(&dest->ipcfg4softap, &src->ipcfg4softap, sizeof(struct tls_param_ip));
  217. break;
  218. case TLS_PARAM_ID_SOFTAP_CHANNEL:
  219. dest->channel4softap = src->channel4softap;
  220. break;
  221. case TLS_PARAM_ID_SOFTAP_WBGR:
  222. MEMCPY(&dest->wbgr4softap, &src->wbgr4softap, sizeof(struct tls_param_bgr));
  223. break;
  224. #endif
  225. case TLS_PARAM_ID_SNTP_SERVER1:
  226. strncpy(dest->sntp_service1, src->sntp_service1, strlen(src->sntp_service1)+1);
  227. break;
  228. case TLS_PARAM_ID_SNTP_SERVER2:
  229. strncpy(dest->sntp_service2, src->sntp_service2, strlen(src->sntp_service2)+1);
  230. break;
  231. case TLS_PARAM_ID_SNTP_SERVER3:
  232. strncpy(dest->sntp_service3, src->sntp_service3, strlen(src->sntp_service3)+1);
  233. break;
  234. case TLS_PARAM_ID_TEM_OFFSET:
  235. MEMCPY(&dest->params_tem, &src->params_tem, sizeof(struct tls_param_tem_offset));
  236. break;
  237. case TLS_PARAM_ID_BT_ADAPTER:
  238. MEMCPY(&dest->adapter_t, &src->adapter_t, sizeof(bt_adapter_t));
  239. break;
  240. case TLS_PARAM_ID_BT_REMOTE_DEVICE_1:
  241. MEMCPY(&dest->remote_device1, &src->remote_device1, sizeof(bt_remote_device_t));
  242. break;
  243. case TLS_PARAM_ID_BT_REMOTE_DEVICE_2:
  244. MEMCPY(&dest->remote_device2, &src->remote_device2, sizeof(bt_remote_device_t));
  245. break;
  246. case TLS_PARAM_ID_BT_REMOTE_DEVICE_3:
  247. MEMCPY(&dest->remote_device3, &src->remote_device3, sizeof(bt_remote_device_t));
  248. break;
  249. case TLS_PARAM_ID_BT_REMOTE_DEVICE_4:
  250. MEMCPY(&dest->remote_device4, &src->remote_device4, sizeof(bt_remote_device_t));
  251. break;
  252. case TLS_PARAM_ID_BT_REMOTE_DEVICE_5:
  253. MEMCPY(&dest->remote_device5, &src->remote_device5, sizeof(bt_remote_device_t));
  254. break;
  255. #if 0
  256. case TLS_PARAM_ID_BT_REMOTE_DEVICE_6:
  257. MEMCPY(&dest->remote_device6, &src->remote_device6, sizeof(bt_remote_device_t));
  258. break;
  259. case TLS_PARAM_ID_BT_REMOTE_DEVICE_7:
  260. MEMCPY(&dest->remote_device7, &src->remote_device7, sizeof(bt_remote_device_t));
  261. break;
  262. case TLS_PARAM_ID_BT_REMOTE_DEVICE_8:
  263. MEMCPY(&dest->remote_device8, &src->remote_device8, sizeof(bt_remote_device_t));
  264. break;
  265. case TLS_PARAM_ID_BT_REMOTE_DEVICE_9:
  266. MEMCPY(&dest->remote_device9, &src->remote_device9, sizeof(bt_remote_device_t));
  267. break;
  268. case TLS_PARAM_ID_BT_REMOTE_DEVICE_10:
  269. MEMCPY(&dest->remote_device10, &src->remote_device10, sizeof(bt_remote_device_t));
  270. break;
  271. #endif
  272. default:
  273. err = TLS_PARAM_STATUS_EINVALIDID;
  274. goto exit;
  275. }
  276. #endif
  277. flash_param.magic = TLS_PARAM_MAGIC;
  278. flash_param.length = sizeof(flash_param);
  279. if (modify_count < 0){
  280. flash_param.modify_count ++;
  281. TLS_DBGPRT_INFO("update the \"modify count(%d)\".\n", flash_param.modify_count);
  282. } else {
  283. flash_param.modify_count = modify_count;
  284. TLS_DBGPRT_INFO("initialize the \"modify count(%d)\".\n", flash_param.modify_count);
  285. }
  286. if (partition_num < 0) {
  287. flash_param.partition_num = (flash_param.partition_num + 1) & 0x01;
  288. TLS_DBGPRT_INFO("switch the parameter patition number(%d).\n", flash_param.partition_num);
  289. } else {
  290. flash_param.partition_num = partition_num;
  291. TLS_DBGPRT_INFO("initialize the parameter patition number(%d).\n", flash_param.partition_num);
  292. }
  293. flash_param.resv_1 = flash_param.resv_2 = 0;
  294. flash_param.crc32 = get_crc32((u8 *)&flash_param, sizeof(flash_param) - 4);
  295. TLS_DBGPRT_INFO("update the parameters to parameter patition(%d) in spi flash.\n", flash_param.partition_num);
  296. err = tls_fls_write((flash_param.partition_num == 0) ? TLS_FLASH_PARAM1_ADDR : TLS_FLASH_PARAM2_ADDR,
  297. (u8 *)&flash_param, sizeof(flash_param));
  298. if (err != TLS_FLS_STATUS_OK) {
  299. TLS_DBGPRT_ERR("write to spi flash fail(%d)!\n", err);
  300. err = TLS_PARAM_STATUS_EIO;
  301. goto exit;
  302. }
  303. if (param_flash_verify((flash_param.partition_num == 0) ? TLS_FLASH_PARAM1_ADDR : TLS_FLASH_PARAM2_ADDR,
  304. (u8 *)&flash_param, sizeof(flash_param)) == 1) {err = TLS_PARAM_STATUS_OK;}
  305. else {
  306. TLS_DBGPRT_ERR("verify the parameters in spi flash fail(%d)!\n", err);
  307. err = TLS_PARAM_STATUS_EIO;
  308. }
  309. exit:
  310. return err;
  311. }
  312. /**********************************************************************************************************
  313. * Description: This function is used to initial system param.
  314. *
  315. * Arguments : sys_param is the system param addr
  316. *
  317. * Returns : TLS_PARAM_STATUS_OK init success
  318. * TLS_PARAM_STATUS_EMEM memory error
  319. * TLS_PARAM_STATUS_EIO io error
  320. * TLS_PARAM_STATUS_EPERM
  321. **********************************************************************************************************/
  322. int tls_param_init(void)
  323. {
  324. bool is_damage[TLS_PARAM_PARTITION_NUM];
  325. u8 damaged;
  326. int err;
  327. signed short i;
  328. u16 tryrestore = 0;
  329. struct tls_param_flash *flash;
  330. if(flash_param.magic == TLS_PARAM_MAGIC)
  331. {
  332. TLS_DBGPRT_ERR("parameter management module has been initialized!\n");
  333. return TLS_PARAM_STATUS_EPERM;
  334. }
  335. err = tls_os_sem_create(&sys_param_lock, 1);
  336. if (err != TLS_OS_SUCCESS)
  337. {
  338. TLS_DBGPRT_ERR("create semaphore @sys_param_lock fail!\n");
  339. return TLS_PARAM_STATUS_EMEM;
  340. }
  341. tls_os_sem_acquire(sys_param_lock, 0);
  342. err = TLS_PARAM_STATUS_OK;
  343. i = 0;
  344. damaged= 0;
  345. is_damage[0] = is_damage[1] = FALSE;
  346. flash = NULL;
  347. memset(&flash_param, 0, sizeof(flash_param));
  348. #if USE_TWO_RAM_FOR_PARAMETER
  349. memset(&sram_param, 0, sizeof(sram_param));
  350. #endif
  351. tryrestore = 0;
  352. do
  353. {
  354. flash = tls_mem_alloc(sizeof(*flash));
  355. if (flash == NULL)
  356. {
  357. TLS_DBGPRT_ERR("allocate \"struct tls_param_flash\" fail!\n");
  358. err = TLS_PARAM_STATUS_EMEM;
  359. break;
  360. }
  361. memset(flash, 0, sizeof(*flash));
  362. for (i = 0; i < TLS_PARAM_PARTITION_NUM; i++)
  363. {
  364. TLS_DBGPRT_INFO("read parameter partition - %d.\n", i);
  365. tls_fls_read((i == 0) ? TLS_FLASH_PARAM1_ADDR : TLS_FLASH_PARAM2_ADDR, (u8 *)flash, sizeof(*flash));
  366. TLS_DBGPRT_INFO("patition %d magic - 0x%x, crc -0x%x .\n", i, flash->magic, flash->crc32);
  367. if (flash->magic != TLS_PARAM_MAGIC)
  368. {
  369. TLS_DBGPRT_WARNING("parameter partition - %d has been damaged.\n", i);
  370. is_damage[i] = TRUE;
  371. damaged++;
  372. //continue;
  373. }
  374. else if (get_crc32((u8 *)flash, flash->length - 4) != *(u32*)((u8*)flash + flash->length - 4))
  375. {
  376. is_damage[i] = TRUE;
  377. damaged++;
  378. //continue;
  379. }
  380. else
  381. {
  382. /* Load the latest parameters */
  383. TLS_DBGPRT_INFO("read parameter partition modify count - %d.\n", flash->modify_count);
  384. TLS_DBGPRT_INFO("current parameter partition modify count - %d.\n", flash_param.modify_count);
  385. if ((flash_param.magic == 0) || (flash_param.modify_count < flash->modify_count))
  386. {
  387. TLS_DBGPRT_INFO("update the parameter in sram using partition - %d,%d,%d.\n", i, flash->length,sizeof(*flash));
  388. if (flash->length != sizeof(*flash)){
  389. MEMCPY(&flash_param, flash, (flash->length-4));
  390. #if USE_TWO_RAM_FOR_PARAMETER
  391. MEMCPY(&sram_param, &flash_param.parameters, sizeof(sram_param));
  392. #endif
  393. }else{
  394. MEMCPY(&flash_param, flash, sizeof(*flash));
  395. #if USE_TWO_RAM_FOR_PARAMETER
  396. MEMCPY(&sram_param, &flash_param.parameters, sizeof(sram_param));
  397. #endif
  398. }
  399. }
  400. memset(flash, 0, sizeof(*flash));
  401. }
  402. /* try to erase one sector at the same block to restore parameter area*/
  403. if ((tryrestore == 0)&&(damaged >= TLS_PARAM_PARTITION_NUM))
  404. {
  405. damaged= 0;
  406. is_damage[0] = is_damage[1] = FALSE;
  407. memset(&flash_param, 0, sizeof(flash_param));
  408. #if USE_TWO_RAM_FOR_PARAMETER
  409. memset(&sram_param, 0, sizeof(sram_param));
  410. #endif
  411. tls_fls_erase(TLS_FLASH_PARAM_RESTORE_ADDR / INSIDE_FLS_SECTOR_SIZE);
  412. tryrestore = 1;
  413. i = -1;
  414. }
  415. }
  416. if (damaged >= TLS_PARAM_PARTITION_NUM)
  417. {
  418. TLS_DBGPRT_INFO("all the parameter partitions has been demaged and load the default parameters.\n");
  419. tls_param_load_factory_default();
  420. TLS_DBGPRT_INFO("write the default parameters to all the partitions.\n");
  421. err = param_to_flash(TLS_PARAM_ID_ALL, 1, 0);
  422. if (err != TLS_PARAM_STATUS_OK)
  423. {
  424. TLS_DBGPRT_ERR("write the default parameters to the partitions - 0 fail!\n");
  425. err = TLS_PARAM_STATUS_EIO;
  426. break;
  427. }
  428. err = param_to_flash(TLS_PARAM_ID_ALL, 1, 1);
  429. if (err != TLS_PARAM_STATUS_OK)
  430. {
  431. TLS_DBGPRT_ERR("write the default parameters to the partitions - 1 fail!\n");
  432. err = TLS_PARAM_STATUS_EIO;
  433. break;
  434. }
  435. //MEMCPY(&flash_param, flash, sizeof(*flash));
  436. }
  437. else
  438. {
  439. /* restore damaged partitions */
  440. for (i = 0; i < TLS_PARAM_PARTITION_NUM; i++)
  441. {
  442. if (is_damage[i])
  443. {
  444. TLS_DBGPRT_INFO(" restore damaged partitions - %d.\n", i);
  445. err = param_to_flash(TLS_PARAM_ID_ALL, -1, i);
  446. if (err != TLS_PARAM_STATUS_OK)
  447. {
  448. TLS_DBGPRT_ERR("write the default parameters to the partitions - %d fail!\n", i);
  449. err = TLS_PARAM_STATUS_EIO;
  450. break;
  451. }
  452. }
  453. }
  454. if (err == TLS_PARAM_STATUS_OK)
  455. {
  456. break;
  457. }
  458. }
  459. }while (0);
  460. tls_os_sem_release(sys_param_lock);
  461. if (flash)
  462. {
  463. tls_mem_free(flash);
  464. }
  465. #if 0
  466. TLS_DBGPRT_INFO("sys_param = 0x%x, *sys_param = 0x%x\n", sys_param, *sys_param);
  467. if (sys_param)
  468. {
  469. *sys_param = &sram_param;
  470. }
  471. TLS_DBGPRT_INFO("sys_param = 0x%x, *sys_param = 0x%x\n", sys_param, *sys_param);
  472. #endif
  473. return err;
  474. }
  475. #define TLS_USER_MAGIC 0x574D3031 // WM01
  476. int tls_param_load_user(struct tls_sys_param *param)
  477. {
  478. u32 magic, crc32, offset;
  479. offset = TLS_FLASH_PARAM_DEFAULT;
  480. tls_fls_read(offset, (u8 *)&magic, 4);
  481. if(TLS_USER_MAGIC != magic)
  482. {
  483. TLS_DBGPRT_INFO("no user default param = %x!!!\r\n", magic);
  484. return TLS_PARAM_STATUS_EINVALID;
  485. }
  486. offset += 4;
  487. memset(param, 0, sizeof(*param));
  488. tls_fls_read(offset, (u8 *)param, sizeof(struct tls_sys_param));
  489. offset += sizeof(struct tls_sys_param);
  490. tls_fls_read(offset, (u8 *)&crc32, 4);
  491. if(crc32 != get_crc32((u8 *)param, sizeof(struct tls_sys_param)))
  492. {
  493. TLS_DBGPRT_INFO("user default param crc err =%x!!!\r\n", crc32);
  494. return TLS_PARAM_STATUS_EINVALID;
  495. }
  496. return TLS_PARAM_STATUS_OK;
  497. }
  498. /**********************************************************************************************************
  499. * Description: This function is used to load the system default parameters.
  500. *
  501. * Arguments : param is the param point
  502. *
  503. * Returns :
  504. *
  505. * Notes : This function read user defined parameters first, if wrong, all the parameters restore factory settings.
  506. **********************************************************************************************************/
  507. void tls_param_load_factory_default(void)
  508. {
  509. #if USE_TWO_RAM_FOR_PARAMETER
  510. struct tls_sys_param *param = &sram_param;
  511. #else
  512. struct tls_sys_param *param = &flash_param.parameters;
  513. #endif
  514. if (param == NULL) {return;}
  515. TLS_DBGPRT_INFO("load the default parameters.\n");
  516. memset(param, 0, sizeof(*param));
  517. MEMCPY(&param->hardware_version, factory_default_hardware, 8);
  518. param->wireless_region = TLS_PARAM_REGION_1_BG_BAND;
  519. param->channel = 1;
  520. param->channellist = 0x3FFF;
  521. #if TLS_CONFIG_11N
  522. param->wbgr.bg = TLS_PARAM_PHY_11BGN_MIXED;
  523. param->wbgr.max_rate = TLS_PARAM_TX_RATEIDX_MCS13;
  524. #else
  525. param->wbgr.bg = TLS_PARAM_PHY_11BG_MIXED;
  526. param->wbgr.max_rate = TLS_PARAM_TX_RATEIDX_36M;
  527. #endif
  528. param->ssid_broadcast_enable = TLS_PARAM_SSIDBRD_ENABLE;
  529. param->encry = TLS_PARAM_ENCRY_OPEN;
  530. #if 0 //def CONFIG_AP
  531. param->wireless_protocol = TLS_PARAM_IEEE80211_SOFTAP;
  532. tls_efuse_read(TLS_EFUSE_MACADDR_OFFSET, mac_addr, 6);
  533. ssid_len = sprintf((char *)&param->ssid.ssid, "cuckoo_softap_%02x%02x%02x", mac_addr[3], mac_addr[4], mac_addr[5]);
  534. param->ssid.ssid_len = ssid_len;
  535. #else
  536. param->wireless_protocol = TLS_PARAM_IEEE80211_INFRA;
  537. #endif
  538. param->auto_retrycnt = 255;
  539. param->auto_roam = TLS_PARAM_ROAM_DISABLE;
  540. param->auto_powersave = TLS_PARAM_PSM_DISABLE;
  541. param->auto_reconnect = 0;
  542. //param->wps.wps_enable = TLS_PARAM_WPS_DISABLE;
  543. param->auto_mode = TLS_PARAM_MANUAL_MODE;
  544. param->transparent_trigger_length = 512;
  545. param->uart_cfg.baudrate = TLS_PARAM_UART_BAUDRATE_B115200;
  546. param->uart_cfg.stop_bits = TLS_PARAM_UART_STOPBITS_1BITS;
  547. param->uart_cfg.parity = TLS_PARAM_UART_PARITY_NONE;
  548. param->user_port_mode = TLS_PARAM_USR_INTF_LUART;
  549. param->ipcfg.dhcp_enable = TLS_PARAM_DHCP_ENABLE;
  550. param->ipcfg.ip[0] = 192;
  551. param->ipcfg.ip[1] = 168;
  552. param->ipcfg.ip[2] = 1;
  553. param->ipcfg.ip[3] = 1;
  554. param->ipcfg.netmask[0] = 255;
  555. param->ipcfg.netmask[1] = 255;
  556. param->ipcfg.netmask[2] = 255;
  557. param->ipcfg.netmask[3] = 0;
  558. param->ipcfg.gateway[0] = 192;
  559. param->ipcfg.gateway[1] = 168;
  560. param->ipcfg.gateway[2] = 1;
  561. param->ipcfg.gateway[3] = 1;
  562. param->ipcfg.dns1[0] = 192;
  563. param->ipcfg.dns1[1] = 168;
  564. param->ipcfg.dns1[2] = 1;
  565. param->ipcfg.dns1[3] = 1;
  566. param->ipcfg.dns2[0] = 192;
  567. param->ipcfg.dns2[1] = 168;
  568. param->ipcfg.dns2[2] = 1;
  569. param->ipcfg.dns2[3] = 1;
  570. strcpy((char *)param->local_dnsname, "local.xt804");
  571. strcpy((char *)param->local_device_name, "xt804");
  572. param->remote_socket_cfg.protocol = TLS_PARAM_SOCKET_TCP;
  573. param->remote_socket_cfg.client_or_server = TLS_PARAM_SOCKET_SERVER;
  574. param->remote_socket_cfg.port_num = TLS_PARAM_SOCKET_DEFAULT_PORT;
  575. memset(param->remote_socket_cfg.host, 0, 32);
  576. param->EscapeChar = 0x2b;
  577. param->EscapePeriod = 200;
  578. param->WebsCfg.AutoRun = 1;
  579. param->WebsCfg.PortNum = 80;
  580. param->debug_mode = 0;
  581. memset(param->PassWord, '0', 6);
  582. param->channel4softap = 11;
  583. param->encry4softap = TLS_PARAM_ENCRY_OPEN;
  584. param->ipcfg4softap.dhcp_enable = TLS_PARAM_DHCP_ENABLE;
  585. param->ipcfg4softap.ip[0] = 192;
  586. param->ipcfg4softap.ip[1] = 168;
  587. param->ipcfg4softap.ip[2] = 0;
  588. param->ipcfg4softap.ip[3] = 1;
  589. param->ipcfg4softap.netmask[0] = 255;
  590. param->ipcfg4softap.netmask[1] = 255;
  591. param->ipcfg4softap.netmask[2] = 255;
  592. param->ipcfg4softap.netmask[3] = 0;
  593. param->ipcfg4softap.gateway[0] = 192;
  594. param->ipcfg4softap.gateway[1] = 168;
  595. param->ipcfg4softap.gateway[2] = 0;
  596. param->ipcfg4softap.gateway[3] = 1;
  597. param->ipcfg4softap.dns1[0] = 192;
  598. param->ipcfg4softap.dns1[1] = 168;
  599. param->ipcfg4softap.dns1[2] = 0;
  600. param->ipcfg4softap.dns1[3] = 1;
  601. param->ipcfg4softap.dns2[0] = 0;
  602. param->ipcfg4softap.dns2[1] = 0;
  603. param->ipcfg4softap.dns2[2] = 0;
  604. param->ipcfg4softap.dns2[3] = 0;
  605. #if TLS_CONFIG_SOFTAP_11N
  606. param->wbgr4softap.bg = TLS_PARAM_PHY_11BGN_MIXED;
  607. param->wbgr4softap.max_rate = TLS_PARAM_TX_RATEIDX_36M;
  608. #else
  609. param->wbgr4softap.bg = TLS_PARAM_PHY_11BG_MIXED;
  610. param->wbgr4softap.max_rate = TLS_PARAM_TX_RATEIDX_36M;
  611. #endif
  612. strcpy(param->sntp_service1, "cn.ntp.org.cn");
  613. strcpy(param->sntp_service2, "ntp.sjtu.edu.cn");
  614. strcpy(param->sntp_service3, "us.pool.ntp.org");
  615. }
  616. /**********************************************************************************************************
  617. * Description: This function is used to set system parameter.
  618. *
  619. * Arguments : id param id,from TLS_PARAM_ID_SSID to (TLS_PARAM_ID_MAX - 1)
  620. * argc store parameters
  621. * to_flash whether the parameter is written to flash,1 write
  622. * Returns : TLS_PARAM_STATUS_OK set success
  623. * TLS_PARAM_STATUS_EINVALID invalid param
  624. **********************************************************************************************************/
  625. int tls_param_set(int id, void *argv, bool to_flash)
  626. {
  627. int err = 0;
  628. #if USE_TWO_RAM_FOR_PARAMETER
  629. struct tls_sys_param *param = &sram_param;
  630. #else
  631. struct tls_sys_param *param = &flash_param.parameters;
  632. #endif
  633. if ((id < TLS_PARAM_ID_ALL) || (id >= TLS_PARAM_ID_MAX) || (argv == NULL)) {return TLS_PARAM_STATUS_EINVALID;}
  634. if(updp_mode)
  635. {
  636. param = tls_param_user_param_init();
  637. if (NULL == param)
  638. {
  639. return TLS_PARAM_STATUS_EMEM;
  640. }
  641. }
  642. tls_os_sem_acquire(sys_param_lock, 0);
  643. err = TLS_PARAM_STATUS_OK;
  644. switch (id) {
  645. case TLS_PARAM_ID_ALL:
  646. MEMCPY(param, argv, sizeof(struct tls_sys_param));
  647. break;
  648. case TLS_PARAM_ID_SSID:
  649. MEMCPY(&param->ssid, argv, sizeof(struct tls_param_ssid));
  650. break;
  651. case TLS_PARAM_ID_ENCRY:
  652. param->encry = *((u8 *)argv);
  653. break;
  654. case TLS_PARAM_ID_KEY:
  655. MEMCPY(&param->key, argv, sizeof(struct tls_param_key));
  656. break;
  657. case TLS_PARAM_ID_IP:
  658. MEMCPY(&param->ipcfg, argv, sizeof(struct tls_param_ip));
  659. break;
  660. case TLS_PARAM_ID_AUTOMODE:
  661. param->auto_mode = *((u8 *)argv);
  662. break;
  663. case TLS_PARAM_ID_DEFSOCKET:
  664. MEMCPY(&param->remote_socket_cfg, argv, sizeof(struct tls_param_socket));
  665. break;
  666. case TLS_PARAM_ID_BSSID:
  667. MEMCPY(&param->bssid, argv, sizeof(struct tls_param_bssid));
  668. break;
  669. case TLS_PARAM_ID_CHANNEL:
  670. param->channel = *((u8 *)argv);
  671. break;
  672. case TLS_PARAM_ID_CHANNEL_LIST:
  673. param->channellist = *((u16*)argv);
  674. break;
  675. case TLS_PARAM_ID_CHANNEL_EN:
  676. param->channel_enable = *((u8 *)argv);
  677. break;
  678. case TLS_PARAM_ID_COUNTRY_REGION:
  679. param->wireless_region = *((u8 *)argv);
  680. break;
  681. case TLS_PARAM_ID_WPROTOCOL:
  682. param->wireless_protocol = *((u8 *)argv);;
  683. break;
  684. case TLS_PARAM_ID_ADHOC_AUTOCREATE:
  685. param->auto_create_adhoc = *((u8 *)argv);
  686. break;
  687. case TLS_PARAM_ID_ROAMING:
  688. param->auto_roam = *((u8 *)argv);
  689. break;
  690. case TLS_PARAM_ID_AUTO_RETRY_CNT:
  691. param->auto_retrycnt = *((u8 *)argv);
  692. break;
  693. case TLS_PARAM_ID_WBGR:
  694. MEMCPY(&param->wbgr, argv, sizeof(struct tls_param_bgr));
  695. break;
  696. case TLS_PARAM_ID_USRINTF:
  697. param->user_port_mode = *((u8 *)argv);
  698. break;
  699. case TLS_PARAM_ID_AUTO_TRIGGER_LENGTH:
  700. param->transparent_trigger_length = *((u16 *)argv);
  701. break;
  702. case TLS_PARAM_ID_AUTO_TRIGGER_PERIOD:
  703. param->transparent_trigger_period = *((u16 *)argv);
  704. break;
  705. case TLS_PARAM_ID_ESCAPE_CHAR:
  706. param->EscapeChar = *((u8 *)argv);
  707. break;
  708. case TLS_PARAM_ID_ESCAPE_PERIOD:
  709. param->EscapePeriod = *((u16 *)argv);
  710. break;
  711. case TLS_PARAM_ID_IO_MODE:
  712. param->IoMode = *((u8 *)argv);
  713. break;
  714. case TLS_PARAM_ID_CMD_MODE:
  715. param->CmdMode = *((u8 *)argv);
  716. break;
  717. case TLS_PARAM_ID_PASSWORD:
  718. MEMCPY(param->PassWord, (u8 *)argv, sizeof(param->PassWord));
  719. break;
  720. case TLS_PARAM_ID_WEBS_CONFIG:
  721. param->WebsCfg = *((struct tls_webs_cfg *)argv);
  722. break;
  723. case TLS_PARAM_ID_DEBUG_MODE:
  724. param->debug_mode = *((u32 *)argv);;
  725. break;
  726. case TLS_PARAM_ID_HARDVERSION:
  727. MEMCPY(&param->hardware_version, argv, sizeof(struct tls_param_hardware_version));
  728. break;
  729. case TLS_PARAM_ID_BRDSSID:
  730. param->ssid_broadcast_enable = *((u8 *)argv);
  731. break;
  732. case TLS_PARAM_ID_DNSNAME:
  733. strcpy((char *)param->local_dnsname, (char *)argv);
  734. break;
  735. case TLS_PARAM_ID_DEVNAME:
  736. strcpy((char *)param->local_device_name, argv);
  737. break;
  738. case TLS_PARAM_ID_PSM:
  739. param->auto_powersave = *((u8 *)argv);
  740. break;
  741. case TLS_PARAM_ID_ORAY_CLIENT:
  742. MEMCPY(&param->oray_client_setting, argv, sizeof(struct tls_param_oray_client));
  743. break;
  744. case TLS_PARAM_ID_UPNP:
  745. param->upnp_enable = *((u8 *)argv);
  746. break;
  747. case TLS_PARAM_ID_UART:
  748. MEMCPY(&param->uart_cfg, argv, sizeof(struct tls_param_uart));
  749. break;
  750. #if TLS_CONFIG_WPS
  751. case TLS_PARAM_ID_WPS:
  752. MEMCPY(&param->wps, argv, sizeof(struct tls_param_wps));
  753. break;
  754. #endif
  755. case TLS_PARAM_ID_ONESHOT_CFG:
  756. param->oneshotflag = *((u8 *)argv);
  757. break;
  758. case TLS_PARAM_ID_SHA1:
  759. MEMCPY(&param->psk, (u8 *)argv, sizeof(struct tls_param_sha1));
  760. break;
  761. case TLS_PARAM_ID_ORIGIN_KEY:
  762. MEMCPY( &param->original_key, (u8*)argv, sizeof(struct tls_param_original_key));
  763. break;
  764. case TLS_PARAM_ID_ORIGIN_SSID:
  765. MEMCPY( &param->original_ssid, (u8*)argv, sizeof(struct tls_param_ssid));
  766. break;
  767. case TLS_PARAM_ID_AUTO_RECONNECT:
  768. param->auto_reconnect = *((u8 *)argv);
  769. break;
  770. case TLS_PARAM_ID_QUICK_CONNECT:
  771. MEMCPY(&param->quick_connect, argv, sizeof(struct tls_param_quick_connect));
  772. break;
  773. case TLS_PARAM_ID_KEY_CHANGE:
  774. param->key_changed = *((u8 *)argv);
  775. break;
  776. case TLS_PARAM_ID_SSID_CHANGE:
  777. param->ssid_changed = *((u8 *)argv);
  778. break;
  779. #if TLS_CONFIG_AP
  780. case TLS_PARAM_ID_SOFTAP_SSID:
  781. MEMCPY(&param->apsta_ssid, argv, sizeof(struct tls_param_ssid));
  782. break;
  783. case TLS_PARAM_ID_SOFTAP_PSK:
  784. MEMCPY(&param->apsta_psk, argv, sizeof(struct tls_param_sha1));
  785. break;
  786. case TLS_PARAM_ID_SOFTAP_ENCRY:
  787. param->encry4softap = *((u8 *)argv);
  788. break;
  789. case TLS_PARAM_ID_SOFTAP_KEY:
  790. MEMCPY(&param->key4softap, argv, sizeof(struct tls_param_key));
  791. break;
  792. case TLS_PARAM_ID_SOFTAP_IP:
  793. MEMCPY(&param->ipcfg4softap, argv, sizeof(struct tls_param_ip));
  794. break;
  795. case TLS_PARAM_ID_SOFTAP_CHANNEL:
  796. param->channel4softap = *((u8 *)argv);
  797. break;
  798. case TLS_PARAM_ID_SOFTAP_WBGR:
  799. MEMCPY(&param->wbgr4softap, argv, sizeof(struct tls_param_bgr));
  800. break;
  801. #endif
  802. case TLS_PARAM_ID_SNTP_SERVER1:
  803. strncpy(param->sntp_service1, (const char *)argv, strlen(argv)+1);
  804. break;
  805. case TLS_PARAM_ID_SNTP_SERVER2:
  806. strncpy(param->sntp_service2, (const char *)argv, strlen(argv)+1);
  807. break;
  808. case TLS_PARAM_ID_SNTP_SERVER3:
  809. strncpy(param->sntp_service3, (const char *)argv, strlen(argv)+1);
  810. break;
  811. case TLS_PARAM_ID_TEM_OFFSET:
  812. MEMCPY(&param->params_tem, argv, sizeof(struct tls_param_tem_offset));
  813. break;
  814. case TLS_PARAM_ID_BT_ADAPTER:
  815. MEMCPY(&param->adapter_t, argv, sizeof(bt_adapter_t));
  816. break;
  817. case TLS_PARAM_ID_BT_REMOTE_DEVICE_1:
  818. MEMCPY(&param->remote_device1, argv, sizeof(bt_remote_device_t));
  819. break;
  820. case TLS_PARAM_ID_BT_REMOTE_DEVICE_2:
  821. MEMCPY(&param->remote_device2, argv, sizeof(bt_remote_device_t));
  822. break;
  823. case TLS_PARAM_ID_BT_REMOTE_DEVICE_3:
  824. MEMCPY(&param->remote_device3, argv, sizeof(bt_remote_device_t));
  825. break;
  826. case TLS_PARAM_ID_BT_REMOTE_DEVICE_4:
  827. MEMCPY(&param->remote_device4, argv, sizeof(bt_remote_device_t));
  828. break;
  829. case TLS_PARAM_ID_BT_REMOTE_DEVICE_5:
  830. MEMCPY(&param->remote_device5, argv, sizeof(bt_remote_device_t));
  831. break;
  832. #if 0
  833. case TLS_PARAM_ID_BT_REMOTE_DEVICE_6:
  834. MEMCPY(&param->remote_device6, argv, sizeof(bt_remote_device_t));
  835. break;
  836. case TLS_PARAM_ID_BT_REMOTE_DEVICE_7:
  837. MEMCPY(&param->remote_device7, argv, sizeof(bt_remote_device_t));
  838. break;
  839. case TLS_PARAM_ID_BT_REMOTE_DEVICE_8:
  840. MEMCPY(&param->remote_device8, argv, sizeof(bt_remote_device_t));
  841. break;
  842. case TLS_PARAM_ID_BT_REMOTE_DEVICE_9:
  843. MEMCPY(&param->remote_device9, argv, sizeof(bt_remote_device_t));
  844. break;
  845. case TLS_PARAM_ID_BT_REMOTE_DEVICE_10:
  846. MEMCPY(&param->remote_device10, argv, sizeof(bt_remote_device_t));
  847. break;
  848. #endif
  849. default:
  850. TLS_DBGPRT_WARNING("invalid parameter id - %d!\n", id);
  851. err = TLS_PARAM_STATUS_EINVALIDID;
  852. goto exit;
  853. }
  854. if (to_flash && !updp_mode) {
  855. err = param_to_flash(id, -1, -1);
  856. TLS_DBGPRT_INFO("write the parameter to spi flash - %d.\n", err);
  857. }
  858. exit:
  859. tls_os_sem_release(sys_param_lock);
  860. return err;
  861. }
  862. /**********************************************************************************************************
  863. * Description: This function is used to get system parameter.
  864. *
  865. * Arguments : id param id,from TLS_PARAM_ID_SSID to (TLS_PARAM_ID_MAX - 1)
  866. * argc store parameters
  867. * from_flash whether the parameter is readed from flash,1 read from flash
  868. * Returns : TLS_PARAM_STATUS_OK success
  869. * TLS_PARAM_STATUS_EINVALID invalid param
  870. **********************************************************************************************************/
  871. int tls_param_get(int id, void *argv, bool from_flash)
  872. {
  873. int err;
  874. struct tls_sys_param *src = NULL;
  875. if ((id < TLS_PARAM_ID_ALL) || (id >= TLS_PARAM_ID_MAX)) {return TLS_PARAM_STATUS_EINVALID;}
  876. err = TLS_PARAM_STATUS_OK;
  877. #if USE_TWO_RAM_FOR_PARAMETER
  878. if (from_flash) {src = &flash_param.parameters;}
  879. else {src = &sram_param;}
  880. #else
  881. struct tls_param_flash *curflashparm = NULL;
  882. if (from_flash)
  883. {
  884. curflashparm = tls_mem_alloc(sizeof(struct tls_param_flash));
  885. if (curflashparm)
  886. {
  887. if (TLS_FLS_STATUS_OK == tls_fls_read((flash_param.partition_num == 0) ? TLS_FLASH_PARAM1_ADDR : TLS_FLASH_PARAM2_ADDR, (u8 *)curflashparm, sizeof(struct tls_param_flash)))
  888. {
  889. src = &curflashparm->parameters;
  890. }
  891. }
  892. }
  893. if (NULL == src)
  894. {
  895. src = &flash_param.parameters;
  896. }
  897. #endif
  898. tls_os_sem_acquire(sys_param_lock, 0);
  899. switch (id) {
  900. case TLS_PARAM_ID_ALL:
  901. MEMCPY(argv, src, sizeof(struct tls_sys_param));
  902. break;
  903. case TLS_PARAM_ID_SSID:
  904. MEMCPY(argv, &src->ssid, sizeof(struct tls_param_ssid));
  905. break;
  906. case TLS_PARAM_ID_ENCRY:
  907. *((u8 *)argv) = src->encry;
  908. break;
  909. case TLS_PARAM_ID_KEY:
  910. MEMCPY(argv, &src->key, sizeof(struct tls_param_key));
  911. break;
  912. case TLS_PARAM_ID_IP:
  913. MEMCPY(argv, &src->ipcfg, sizeof(struct tls_param_ip));
  914. break;
  915. case TLS_PARAM_ID_AUTOMODE:
  916. *((u8 *)argv) = src->auto_mode;
  917. break;
  918. case TLS_PARAM_ID_DEFSOCKET:
  919. MEMCPY(argv, &src->remote_socket_cfg, sizeof(struct tls_param_socket));
  920. break;
  921. case TLS_PARAM_ID_BSSID:
  922. MEMCPY(argv, &src->bssid, sizeof(struct tls_param_bssid));
  923. break;
  924. case TLS_PARAM_ID_CHANNEL:
  925. *((u8 *)argv) = src->channel;
  926. break;
  927. case TLS_PARAM_ID_CHANNEL_LIST:
  928. *((u16*)argv) = src->channellist;
  929. break;
  930. case TLS_PARAM_ID_CHANNEL_EN:
  931. *((u8 *)argv) = src->channel_enable;
  932. break;
  933. case TLS_PARAM_ID_COUNTRY_REGION:
  934. *((u8 *)argv) = src->wireless_region;
  935. break;
  936. case TLS_PARAM_ID_WPROTOCOL:
  937. *((u8 *)argv) = src->wireless_protocol;
  938. break;
  939. case TLS_PARAM_ID_ADHOC_AUTOCREATE:
  940. *((u8 *)argv) = src->auto_create_adhoc;
  941. break;
  942. case TLS_PARAM_ID_ROAMING:
  943. *((u8 *)argv) = src->auto_roam;
  944. break;
  945. case TLS_PARAM_ID_AUTO_RETRY_CNT:
  946. *((u8 *)argv) = src->auto_retrycnt;
  947. break;
  948. case TLS_PARAM_ID_WBGR:
  949. MEMCPY(argv, &src->wbgr, sizeof(struct tls_param_bgr));
  950. break;
  951. case TLS_PARAM_ID_USRINTF:
  952. *((u8 *)argv) = src->user_port_mode;
  953. break;
  954. case TLS_PARAM_ID_AUTO_TRIGGER_LENGTH:
  955. *((u16 *)argv) = src->transparent_trigger_length;
  956. break;
  957. case TLS_PARAM_ID_AUTO_TRIGGER_PERIOD:
  958. *((u16 *)argv) = src->transparent_trigger_period;
  959. break;
  960. case TLS_PARAM_ID_ESCAPE_CHAR:
  961. *((u8 *)argv) = src->EscapeChar;
  962. break;
  963. case TLS_PARAM_ID_ESCAPE_PERIOD:
  964. *((u16 *)argv) = src->EscapePeriod;
  965. break;
  966. case TLS_PARAM_ID_IO_MODE:
  967. *((u8 *)argv) = src->IoMode;
  968. break;
  969. case TLS_PARAM_ID_CMD_MODE:
  970. *((u8 *)argv) = src->CmdMode;
  971. break;
  972. case TLS_PARAM_ID_PASSWORD:
  973. MEMCPY((u8 *)argv, src->PassWord, sizeof(src->PassWord));
  974. break;
  975. case TLS_PARAM_ID_WEBS_CONFIG:
  976. *((struct tls_webs_cfg *)argv) = src->WebsCfg;
  977. break;
  978. case TLS_PARAM_ID_DEBUG_MODE:
  979. *((u32 *)argv) = src->debug_mode;
  980. break;
  981. case TLS_PARAM_ID_HARDVERSION:
  982. MEMCPY(argv, &src->hardware_version, sizeof(struct tls_param_hardware_version));
  983. break;
  984. case TLS_PARAM_ID_BRDSSID:
  985. *((u8 *)argv) = src->ssid_broadcast_enable;
  986. break;
  987. case TLS_PARAM_ID_DNSNAME:
  988. strcpy((char *)argv, (char *)src->local_dnsname);
  989. break;
  990. case TLS_PARAM_ID_DEVNAME:
  991. strcpy((char *)argv, (char *)src->local_device_name);
  992. break;
  993. case TLS_PARAM_ID_PSM:
  994. *((u8 *)argv) = src->auto_powersave;
  995. break;
  996. case TLS_PARAM_ID_ORAY_CLIENT:
  997. MEMCPY(argv, &src->oray_client_setting, sizeof(struct tls_param_oray_client));
  998. break;
  999. case TLS_PARAM_ID_UPNP:
  1000. *((u8 *)argv) = src->upnp_enable;
  1001. break;
  1002. case TLS_PARAM_ID_UART:
  1003. MEMCPY(argv, &src->uart_cfg, sizeof(struct tls_param_uart));
  1004. break;
  1005. #if TLS_CONFIG_WPS
  1006. case TLS_PARAM_ID_WPS:
  1007. MEMCPY(argv, &src->wps, sizeof(struct tls_param_wps));
  1008. break;
  1009. #endif
  1010. case TLS_PARAM_ID_ONESHOT_CFG:
  1011. *((u8 *)argv) = src->oneshotflag;
  1012. break;
  1013. case TLS_PARAM_ID_SHA1:
  1014. MEMCPY(argv, &src->psk, sizeof(struct tls_param_sha1));
  1015. break;
  1016. case TLS_PARAM_ID_ORIGIN_KEY:
  1017. MEMCPY(argv, &src->original_key, sizeof(struct tls_param_original_key));
  1018. break;
  1019. case TLS_PARAM_ID_ORIGIN_SSID:
  1020. MEMCPY(argv, &src->original_ssid, sizeof(struct tls_param_ssid));
  1021. break;
  1022. case TLS_PARAM_ID_AUTO_RECONNECT:
  1023. *((u8 *)argv) = src->auto_reconnect;
  1024. break;
  1025. case TLS_PARAM_ID_QUICK_CONNECT:
  1026. MEMCPY(argv, &src->quick_connect, sizeof(struct tls_param_quick_connect));
  1027. break;
  1028. case TLS_PARAM_ID_KEY_CHANGE:
  1029. *((u8 *)argv) = src->key_changed;
  1030. break;
  1031. case TLS_PARAM_ID_SSID_CHANGE:
  1032. *((u8 *)argv) = src->ssid_changed;
  1033. break;
  1034. #if TLS_CONFIG_AP
  1035. case TLS_PARAM_ID_SOFTAP_SSID:
  1036. MEMCPY(argv, &src->apsta_ssid, sizeof(struct tls_param_ssid));
  1037. break;
  1038. case TLS_PARAM_ID_SOFTAP_PSK:
  1039. MEMCPY(argv, &src->apsta_psk, sizeof(struct tls_param_sha1));
  1040. break;
  1041. case TLS_PARAM_ID_SOFTAP_ENCRY:
  1042. *((u8 *)argv) = src->encry4softap;
  1043. break;
  1044. case TLS_PARAM_ID_SOFTAP_KEY:
  1045. MEMCPY(argv, &src->key4softap, sizeof(struct tls_param_key));
  1046. break;
  1047. case TLS_PARAM_ID_SOFTAP_IP:
  1048. MEMCPY(argv, &src->ipcfg4softap, sizeof(struct tls_param_ip));
  1049. break;
  1050. case TLS_PARAM_ID_SOFTAP_CHANNEL:
  1051. *((u8 *)argv) = src->channel4softap;
  1052. break;
  1053. case TLS_PARAM_ID_SOFTAP_WBGR:
  1054. MEMCPY(argv, &src->wbgr4softap, sizeof(struct tls_param_bgr));
  1055. break;
  1056. #endif
  1057. case TLS_PARAM_ID_SNTP_SERVER1:
  1058. strncpy(argv, src->sntp_service1, strlen(src->sntp_service1)+1);
  1059. break;
  1060. case TLS_PARAM_ID_SNTP_SERVER2:
  1061. strncpy(argv, src->sntp_service2, strlen(src->sntp_service2)+1);
  1062. break;
  1063. case TLS_PARAM_ID_SNTP_SERVER3:
  1064. strncpy(argv, src->sntp_service3, strlen(src->sntp_service3)+1);
  1065. break;
  1066. case TLS_PARAM_ID_TEM_OFFSET:
  1067. MEMCPY(argv, &src->params_tem, sizeof(struct tls_param_tem_offset));
  1068. break;
  1069. case TLS_PARAM_ID_BT_ADAPTER:
  1070. MEMCPY(argv, &src->adapter_t, sizeof(bt_adapter_t));
  1071. break;
  1072. case TLS_PARAM_ID_BT_REMOTE_DEVICE_1:
  1073. MEMCPY(argv,&src->remote_device1, sizeof(bt_remote_device_t));
  1074. break;
  1075. case TLS_PARAM_ID_BT_REMOTE_DEVICE_2:
  1076. MEMCPY(argv,&src->remote_device2, sizeof(bt_remote_device_t));
  1077. break;
  1078. case TLS_PARAM_ID_BT_REMOTE_DEVICE_3:
  1079. MEMCPY(argv,&src->remote_device3, sizeof(bt_remote_device_t));
  1080. break;
  1081. case TLS_PARAM_ID_BT_REMOTE_DEVICE_4:
  1082. MEMCPY(argv,&src->remote_device4, sizeof(bt_remote_device_t));
  1083. break;
  1084. case TLS_PARAM_ID_BT_REMOTE_DEVICE_5:
  1085. MEMCPY(argv,&src->remote_device5, sizeof(bt_remote_device_t));
  1086. break;
  1087. #if 0
  1088. case TLS_PARAM_ID_BT_REMOTE_DEVICE_6:
  1089. MEMCPY(argv,&src->remote_device6, sizeof(bt_remote_device_t));
  1090. break;
  1091. case TLS_PARAM_ID_BT_REMOTE_DEVICE_7:
  1092. MEMCPY(argv,&src->remote_device7, sizeof(bt_remote_device_t));
  1093. break;
  1094. case TLS_PARAM_ID_BT_REMOTE_DEVICE_8:
  1095. MEMCPY(argv,&src->remote_device8, sizeof(bt_remote_device_t));
  1096. break;
  1097. case TLS_PARAM_ID_BT_REMOTE_DEVICE_9:
  1098. MEMCPY(argv,&src->remote_device9, sizeof(bt_remote_device_t));
  1099. break;
  1100. case TLS_PARAM_ID_BT_REMOTE_DEVICE_10:
  1101. MEMCPY(argv,&src->remote_device10, sizeof(bt_remote_device_t));
  1102. break;
  1103. #endif
  1104. default:
  1105. TLS_DBGPRT_WARNING("invalid parameter id - %d!\n", id);
  1106. err = TLS_PARAM_STATUS_EINVALIDID;
  1107. break;
  1108. }
  1109. #if USE_TWO_RAM_FOR_PARAMETER
  1110. #else
  1111. if (curflashparm)
  1112. {
  1113. tls_mem_free(curflashparm);
  1114. }
  1115. #endif
  1116. tls_os_sem_release(sys_param_lock);
  1117. return err;
  1118. }
  1119. /**********************************************************************************************************
  1120. * Description: This function is used to write parameter to flash.
  1121. *
  1122. * Arguments : id param id,from TLS_PARAM_ID_ALL to (TLS_PARAM_ID_MAX - 1)
  1123. *
  1124. * Returns : * Returns : TLS_PARAM_STATUS_OK success
  1125. * TLS_PARAM_STATUS_EINVALID invalid param
  1126. * TLS_PARAM_STATUS_EIO error
  1127. **********************************************************************************************************/
  1128. int tls_param_to_flash(int id)
  1129. {
  1130. int err = 0;
  1131. tls_os_sem_acquire(sys_param_lock, 0);
  1132. #if USE_TWO_RAM_FOR_PARAMETER
  1133. if (TLS_PARAM_ID_ALL == id)
  1134. {
  1135. if (0 == memcmp(&sram_param, &flash_param.parameters,sizeof(sram_param)))
  1136. {
  1137. tls_os_sem_release(sys_param_lock);
  1138. return TLS_FLS_STATUS_OK;
  1139. }
  1140. }
  1141. err = param_to_flash(id, -1, -1);
  1142. #else
  1143. if (TLS_PARAM_ID_ALL == id)
  1144. {
  1145. struct tls_param_flash *sram_param;
  1146. sram_param = tls_mem_alloc(sizeof(struct tls_param_flash));
  1147. if (sram_param)
  1148. {
  1149. if (TLS_FLS_STATUS_OK != tls_fls_read((flash_param.partition_num == 0) ? TLS_FLASH_PARAM1_ADDR : TLS_FLASH_PARAM2_ADDR, (u8 *)sram_param, sizeof(struct tls_param_flash)))
  1150. {
  1151. /*write anyway!!!*/
  1152. }
  1153. else
  1154. { /*if not same, write to flash*/
  1155. if (0 == memcmp(&sram_param->parameters, &flash_param.parameters,sizeof(struct tls_sys_param)))
  1156. {
  1157. tls_mem_free(sram_param);
  1158. tls_os_sem_release(sys_param_lock);
  1159. return TLS_FLS_STATUS_OK;
  1160. }
  1161. }
  1162. tls_mem_free(sram_param);
  1163. }
  1164. }
  1165. err = param_to_flash(id, -1, -1);
  1166. #endif
  1167. tls_os_sem_release(sys_param_lock);
  1168. return err;
  1169. }
  1170. /**********************************************************************************************************
  1171. * Description: This function is used to load default parametes to memory.
  1172. *
  1173. * Arguments :
  1174. *
  1175. * Returns :
  1176. *
  1177. * Notes : This function read user defined parameters first, if wrong, all the parameters restore factory settings.
  1178. **********************************************************************************************************/
  1179. int tls_param_to_default(void)
  1180. {
  1181. int err = 0;
  1182. tls_param_load_factory_default();
  1183. err = param_to_flash(TLS_PARAM_ID_ALL, 1, 0);
  1184. if(err)
  1185. return err;
  1186. err = param_to_flash(TLS_PARAM_ID_ALL, 1, 1);
  1187. flash_param.magic = 0;
  1188. return err;
  1189. }
  1190. struct tls_sys_param * tls_param_user_param_init(void)
  1191. {
  1192. if (NULL == user_default_param)
  1193. {
  1194. user_default_param = tls_mem_alloc(sizeof(*user_default_param));
  1195. if (user_default_param)
  1196. memset(user_default_param, 0, sizeof(*user_default_param));
  1197. }
  1198. return user_default_param;
  1199. }
  1200. /**********************************************************************************************************
  1201. * Description: This function is used to modify user default parameters,then write to flash.
  1202. *
  1203. * Arguments :
  1204. *
  1205. * Returns :
  1206. **********************************************************************************************************/
  1207. int tls_param_save_user(struct tls_user_param *user_param)
  1208. {
  1209. struct tls_sys_param *param = NULL;
  1210. param = tls_param_user_param_init();
  1211. if (NULL == param)
  1212. {
  1213. return TLS_PARAM_STATUS_EMEM;
  1214. }
  1215. param->wireless_protocol = user_param->wireless_protocol;
  1216. param->auto_mode = user_param->auto_mode;
  1217. param->uart_cfg.baudrate = user_param->baudrate;
  1218. param->user_port_mode = user_param->user_port_mode;
  1219. param->ipcfg.dhcp_enable = user_param->dhcp_enable;
  1220. param->auto_powersave = user_param->auto_powersave;
  1221. MEMCPY(param->ipcfg.ip, user_param->ip, 4);
  1222. MEMCPY(param->ipcfg.netmask, user_param->netmask, 4);
  1223. MEMCPY(param->ipcfg.gateway, user_param->gateway, 4);
  1224. MEMCPY(param->ipcfg.dns1, user_param->dns, 4);
  1225. MEMCPY(param->ipcfg.dns2, user_param->dns, 4);
  1226. param->remote_socket_cfg.protocol = user_param->socket_protocol;
  1227. param->remote_socket_cfg.client_or_server = user_param->socket_client_or_server;
  1228. param->remote_socket_cfg.port_num = user_param->socket_port_num;
  1229. MEMCPY(param->remote_socket_cfg.host, user_param->socket_host, 32);
  1230. MEMCPY(param->PassWord, user_param->PassWord, 6);
  1231. MEMCPY(&param->hardware_version, factory_default_hardware, 8);
  1232. param->wireless_region = TLS_PARAM_REGION_1_BG_BAND;
  1233. param->channel = 1;
  1234. param->channellist = 0x3FFF;
  1235. param->wbgr.bg = TLS_PARAM_PHY_11BG_MIXED;
  1236. param->wbgr.max_rate = TLS_PARAM_TX_RATEIDX_36M;
  1237. param->ssid_broadcast_enable = TLS_PARAM_SSIDBRD_ENABLE;
  1238. param->encry = TLS_PARAM_ENCRY_OPEN;
  1239. param->auto_retrycnt = 255;
  1240. param->auto_roam = TLS_PARAM_ROAM_DISABLE;
  1241. //param->wps.wps_enable = TLS_PARAM_WPS_DISABLE;
  1242. param->transparent_trigger_length = 512;
  1243. param->uart_cfg.stop_bits = TLS_PARAM_UART_STOPBITS_1BITS;
  1244. param->uart_cfg.parity = TLS_PARAM_UART_PARITY_NONE;
  1245. strcpy((char *)param->local_dnsname, "local.xt804");
  1246. strcpy((char *)param->local_device_name, "xt804");
  1247. param->EscapeChar = 0x2b;
  1248. param->EscapePeriod = 200;
  1249. param->debug_mode = 0;
  1250. tls_param_save_user_default();
  1251. return TLS_PARAM_STATUS_OK;
  1252. }
  1253. /**********************************************************************************************************
  1254. * Description: This function is used to save user parameters to the flash.
  1255. *
  1256. * Arguments :
  1257. *
  1258. * Returns :
  1259. **********************************************************************************************************/
  1260. int tls_param_save_user_default(void)
  1261. {
  1262. u32 magic, crc32, offset;
  1263. if (NULL == user_default_param)
  1264. {
  1265. return TLS_PARAM_STATUS_EMEM;
  1266. }
  1267. offset = TLS_FLASH_PARAM_DEFAULT;
  1268. magic = TLS_USER_MAGIC;
  1269. TLS_DBGPRT_INFO("=====>\n");
  1270. tls_fls_write(offset, (u8 *)&magic, 4);
  1271. offset += 4;
  1272. tls_fls_write(offset, (u8 *)user_default_param, sizeof(struct tls_sys_param));
  1273. offset += sizeof(struct tls_sys_param);
  1274. crc32 = get_crc32((u8 *)user_default_param, sizeof(struct tls_sys_param));
  1275. tls_fls_write(offset, (u8 *)&crc32, 4);
  1276. return TLS_PARAM_STATUS_OK;
  1277. }
  1278. u8 tls_param_get_updp_mode(void)
  1279. {
  1280. return updp_mode;
  1281. }
  1282. void tls_param_set_updp_mode(u8 mode)
  1283. {
  1284. updp_mode = mode;
  1285. }