wm_param.c 45 KB

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