wm_param.c 45 KB

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