diff --git a/arch/arm/arm-v7a/common/include/tos_arm.h b/arch/arm/arm-v7a/common/include/tos_arm.h
index 2c3dd1e2..734c33a6 100644
--- a/arch/arm/arm-v7a/common/include/tos_arm.h
+++ b/arch/arm/arm-v7a/common/include/tos_arm.h
@@ -41,3 +41,4 @@
})
#endif /* _TOS_ARM_H_ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/drv/drv_adc_measure.h b/board/EVB_LN882x/BSP/Inc/drv_adc_measure.h
similarity index 100%
rename from platform/vendor_bsp/LN/ln882x/include/driver_ln882x/drv/drv_adc_measure.h
rename to board/EVB_LN882x/BSP/Inc/drv_adc_measure.h
diff --git a/platform/vendor_bsp/LN/ln882x/include/serial/serial_p.h b/board/EVB_LN882x/BSP/Inc/serial_hw.h
similarity index 92%
rename from platform/vendor_bsp/LN/ln882x/include/serial/serial_p.h
rename to board/EVB_LN882x/BSP/Inc/serial_hw.h
index 353a8204..285336aa 100644
--- a/platform/vendor_bsp/LN/ln882x/include/serial/serial_p.h
+++ b/board/EVB_LN882x/BSP/Inc/serial_hw.h
@@ -1,5 +1,5 @@
-#ifndef __SERIAL_P_H__
-#define __SERIAL_P_H__
+#ifndef __SERIAL_HW_H__
+#define __SERIAL_HW_H__
#include "hal/hal_uart.h"
@@ -37,4 +37,4 @@ struct SerialHardware *serial_hw_getdesc(SerialPortID port_id);
-#endif /* __SERIAL_P_H__ */
+#endif /* __SERIAL_HW_H__ */
diff --git a/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/drv/drv_adc_measure.c b/board/EVB_LN882x/BSP/Src/drv_adc_measure.c
similarity index 95%
rename from platform/vendor_bsp/LN/ln882x/src/driver_ln882x/drv/drv_adc_measure.c
rename to board/EVB_LN882x/BSP/Src/drv_adc_measure.c
index 6024b2db..0e32227e 100644
--- a/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/drv/drv_adc_measure.c
+++ b/board/EVB_LN882x/BSP/Src/drv_adc_measure.c
@@ -1,5 +1,5 @@
#include "hal/hal_adc.h"
-#include "drv/drv_adc_measure.h"
+#include "drv_adc_measure.h"
void drv_adc_init(void)
{
diff --git a/board/EVB_LN882x/BSP/Src/iot_explorer_examples.c b/board/EVB_LN882x/BSP/Src/iot_explorer_examples.c
index fa77517e..772f0f03 100644
--- a/board/EVB_LN882x/BSP/Src/iot_explorer_examples.c
+++ b/board/EVB_LN882x/BSP/Src/iot_explorer_examples.c
@@ -8,7 +8,7 @@
#include "netif/ethernetif.h"
#include "wifi_manager/wifi_manager.h"
#include "lwip/tcpip.h"
-#include "drv/drv_adc_measure.h"
+#include "drv_adc_measure.h"
#include "utils/system_parameter.h"
#include "hal/hal_adc.h"
@@ -161,7 +161,7 @@ void application_entry(void *arg)
ART_ASSERT(1);
}
- reg_wifi_msg_callbcak(wifi_manager_get_handle(), WIFI_MSG_ID_STA_DHCP_GOT_IP,wifi_event_sta_got_ip_cb);
+ reg_wifi_msg_callbcak(WIFI_MSG_ID_STA_DHCP_GOT_IP,wifi_event_sta_got_ip_cb);
wifi_mode_enum_t wifi_mode = WIFI_MODE_STATION;
diff --git a/board/EVB_LN882x/BSP/Src/main.c b/board/EVB_LN882x/BSP/Src/main.c
index 193cca74..e83afe2e 100644
--- a/board/EVB_LN882x/BSP/Src/main.c
+++ b/board/EVB_LN882x/BSP/Src/main.c
@@ -2,7 +2,7 @@
#include "cmsis_os.h"
#include "osal/osal.h"
-#define APPLICATION_TASK_STK_SIZE 6*256
+#define APPLICATION_TASK_STK_SIZE (8*1024)
extern void application_entry(void *arg);
osThreadDef(application_entry, osPriorityLow, 1, APPLICATION_TASK_STK_SIZE);//osPriorityNormal
@@ -17,7 +17,9 @@ __weak void application_entry(void *arg)
#include "wifi_manager/wifi_manager.h"
#include "utils/system_parameter.h"
#include "atcmd/at_task.h"
-
+#include "ln_kv_port.h"
+#include "ln_kv_api.h"
+#include "flash_partition_table.h"
int main(void)
{
@@ -28,10 +30,13 @@ int main(void)
at_init();
system_parameter_init();
+ if (KV_ERR_NONE != ln_kv_port_init(KV_SPACE_OFFSET, (KV_SPACE_OFFSET + KV_SPACE_SIZE))) {
+ LOG(LOG_LVL_ERROR, "KV init filed!\r\n");
+ }
wifi_init();
lwip_tcpip_init();
- wifi_manager_init(wifi_manager_get_handle());
+ wifi_manager_init();
osThreadCreate(osThread(application_entry), NULL); // Create TOS Tiny task
osKernelStart(); // Start TOS Tiny
diff --git a/board/EVB_LN882x/BSP/Src/mcu_init.c b/board/EVB_LN882x/BSP/Src/mcu_init.c
index 48b78568..30db2480 100644
--- a/board/EVB_LN882x/BSP/Src/mcu_init.c
+++ b/board/EVB_LN882x/BSP/Src/mcu_init.c
@@ -29,29 +29,6 @@ int fgetc(FILE *f)
return ch;
}
-
-//int flash_write(uint32_t addr, const void *buf, size_t len){
-// FLASH_Program(addr,len, (uint8_t *)buf);
-//}
-//int flash_read(uint32_t addr, void *buf, size_t len){
-// FLASH_ReadByCache(addr, len, (uint8_t *)buf);
-//}
-
-//void nvds_kv_init(void)
-//{
-// kv_flash_drv_t flash_drv;
-// kv_flash_prop_t flash_prop;
-//
-// flash_drv.write = flash_write;
-// flash_drv.read = flash_read;
-// flash_drv.erase = FLASH_Erase;
-//
-// flash_prop.sector_size_log2 = 8;
-// flash_prop.pgm_type = KV_FLASH_PROGRAM_TYPE_BYTE;
-// flash_prop.flash_start = SYSTEM_PARAMETER_OFFSET;
-// flash_prop.flash_size = SIZE_4KB*2;
-//}
-
void board_init(void)
{
SetSysClock();
@@ -64,8 +41,6 @@ void board_init(void)
log_init();//init log serial
cm_backtrace_init("wifi app", "HD_V2", "SW_V0.8");
-
-// nvds_kv_init();
}
diff --git a/board/EVB_LN882x/BSP/Src/mqttclient_examples.c b/board/EVB_LN882x/BSP/Src/mqttclient_examples.c
index 8ede3cbc..5ea38133 100644
--- a/board/EVB_LN882x/BSP/Src/mqttclient_examples.c
+++ b/board/EVB_LN882x/BSP/Src/mqttclient_examples.c
@@ -8,7 +8,7 @@
#include "netif/ethernetif.h"
#include "wifi_manager/wifi_manager.h"
#include "lwip/tcpip.h"
-#include "drv/drv_adc_measure.h"
+#include "drv_adc_measure.h"
#include "utils/system_parameter.h"
#include "hal/hal_adc.h"
@@ -161,7 +161,7 @@ void application_entry(void *arg)
ART_ASSERT(1);
}
- reg_wifi_msg_callbcak(wifi_manager_get_handle(), WIFI_MSG_ID_STA_DHCP_GOT_IP,wifi_event_sta_got_ip_cb);
+ reg_wifi_msg_callbcak(WIFI_MSG_ID_STA_DHCP_GOT_IP,wifi_event_sta_got_ip_cb);
wifi_mode_enum_t wifi_mode = WIFI_MODE_STATION;
diff --git a/platform/vendor_bsp/LN/ln882x/src/serial/serial_hw.c b/board/EVB_LN882x/BSP/Src/serial_hw.c
similarity index 97%
rename from platform/vendor_bsp/LN/ln882x/src/serial/serial_hw.c
rename to board/EVB_LN882x/BSP/Src/serial_hw.c
index 9ad6a489..c6814fc3 100644
--- a/platform/vendor_bsp/LN/ln882x/src/serial/serial_hw.c
+++ b/board/EVB_LN882x/BSP/Src/serial_hw.c
@@ -4,6 +4,7 @@
#include "serial/serial.h"
#include "hal/hal_syscon.h"
#include "hal/hal_uart.h"
+//#include "hal/hal_sleep.h"
#include "utils/debug/art_assert.h"
#define UART0_TX_BUF_SIZE CFG_UART0_TX_BUF_SIZE
@@ -158,6 +159,10 @@ static void hw_uart0_init(struct SerialHardware *_hw, struct Serial *serial, uin
//enable uart master switch
NVIC_EnableIRQ(UART0_IRQn);
+ /*
+ * Register with the sleep module to ensure that the serial port can be used during Light sleep
+ */
+// hal_sleep_register(MOD_UART0, NULL, NULL, NULL);
}
static void hw_uart1_init(struct SerialHardware *_hw, struct Serial *serial, uint32_t baudrate)
@@ -192,6 +197,11 @@ static void hw_uart1_init(struct SerialHardware *_hw, struct Serial *serial, uin
//enable uart master switch
NVIC_EnableIRQ(UART1_IRQn);
+
+ /*
+ * Register with the sleep module to ensure that the serial port can be used during Light sleep
+ */
+// hal_sleep_register(MOD_UART1, NULL, NULL, NULL);
}
/*
diff --git a/board/EVB_LN882x/KEIL/mqtt_client/TencentOS_tiny.uvoptx b/board/EVB_LN882x/KEIL/mqtt_client/TencentOS_tiny.uvoptx
index 162b6145..f2446d5c 100644
--- a/board/EVB_LN882x/KEIL/mqtt_client/TencentOS_tiny.uvoptx
+++ b/board/EVB_LN882x/KEIL/mqtt_client/TencentOS_tiny.uvoptx
@@ -100,10 +100,7 @@
1
0
0
- 1
- 0
- 0
- 4
+ 6
@@ -234,19 +231,11 @@
0
- 0
- 0
-
-
-
-
-
-
-
-
+
+
+ 0
1
- 0
0
2
10000000
@@ -308,7 +297,7 @@
examples
- 1
+ 0
0
0
0
@@ -339,7 +328,7 @@
- Drivers/Drv
+ Drivers/HAL
0
0
0
@@ -351,34 +340,14 @@
0
0
0
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\drv\drv_adc_measure.c
- drv_adc_measure.c
- 0
- 0
-
-
-
-
- Drivers/HAL
- 0
- 0
- 0
- 0
-
- 5
- 7
- 1
- 0
- 0
- 0
..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\hal\hal_common.c
hal_common.c
0
0
- 5
- 8
+ 4
+ 7
1
0
0
@@ -389,8 +358,8 @@
0
- 5
- 9
+ 4
+ 8
1
0
0
@@ -401,8 +370,8 @@
0
- 5
- 10
+ 4
+ 9
1
0
0
@@ -413,8 +382,8 @@
0
- 5
- 11
+ 4
+ 10
1
0
0
@@ -425,8 +394,8 @@
0
- 5
- 12
+ 4
+ 11
1
0
0
@@ -437,8 +406,8 @@
0
- 5
- 13
+ 4
+ 12
1
0
0
@@ -449,8 +418,8 @@
0
- 5
- 14
+ 4
+ 13
1
0
0
@@ -461,8 +430,8 @@
0
- 5
- 15
+ 4
+ 14
1
0
0
@@ -473,8 +442,8 @@
0
- 5
- 16
+ 4
+ 15
1
0
0
@@ -485,8 +454,8 @@
0
- 5
- 17
+ 4
+ 16
1
0
0
@@ -497,8 +466,8 @@
0
- 5
- 18
+ 4
+ 17
1
0
0
@@ -509,8 +478,8 @@
0
- 5
- 19
+ 4
+ 18
1
0
0
@@ -529,8 +498,8 @@
0
0
- 6
- 20
+ 5
+ 19
1
0
0
@@ -541,8 +510,8 @@
0
- 6
- 21
+ 5
+ 20
1
0
0
@@ -553,8 +522,8 @@
0
- 6
- 22
+ 5
+ 21
1
0
0
@@ -565,8 +534,8 @@
0
- 6
- 23
+ 5
+ 22
1
0
0
@@ -577,8 +546,8 @@
0
- 6
- 24
+ 5
+ 23
1
0
0
@@ -589,8 +558,8 @@
0
- 6
- 25
+ 5
+ 24
1
0
0
@@ -601,8 +570,8 @@
0
- 6
- 26
+ 5
+ 25
1
0
0
@@ -613,8 +582,8 @@
0
- 6
- 27
+ 5
+ 26
1
0
0
@@ -625,8 +594,8 @@
0
- 6
- 28
+ 5
+ 27
1
0
0
@@ -637,8 +606,8 @@
0
- 6
- 29
+ 5
+ 28
1
0
0
@@ -649,8 +618,8 @@
0
- 6
- 30
+ 5
+ 29
1
0
0
@@ -661,8 +630,8 @@
0
- 6
- 31
+ 5
+ 30
1
0
0
@@ -673,8 +642,8 @@
0
- 6
- 32
+ 5
+ 31
1
0
0
@@ -685,8 +654,8 @@
0
- 6
- 33
+ 5
+ 32
1
0
0
@@ -697,8 +666,8 @@
0
- 6
- 34
+ 5
+ 33
1
0
0
@@ -709,8 +678,8 @@
0
- 6
- 35
+ 5
+ 34
1
0
0
@@ -721,8 +690,8 @@
0
- 6
- 36
+ 5
+ 35
1
0
0
@@ -733,8 +702,8 @@
0
- 6
- 37
+ 5
+ 36
1
0
0
@@ -745,8 +714,8 @@
0
- 6
- 38
+ 5
+ 37
1
0
0
@@ -757,8 +726,8 @@
0
- 6
- 39
+ 5
+ 38
1
0
0
@@ -769,8 +738,8 @@
0
- 6
- 40
+ 5
+ 39
1
0
0
@@ -781,8 +750,8 @@
0
- 6
- 41
+ 5
+ 40
1
0
0
@@ -793,8 +762,8 @@
0
- 6
- 42
+ 5
+ 41
1
0
0
@@ -805,8 +774,8 @@
0
- 6
- 43
+ 5
+ 42
1
0
0
@@ -825,8 +794,8 @@
0
0
- 7
- 44
+ 6
+ 43
1
0
0
@@ -837,8 +806,8 @@
0
- 7
- 45
+ 6
+ 44
2
0
0
@@ -849,8 +818,8 @@
0
- 7
- 46
+ 6
+ 45
1
0
0
@@ -869,8 +838,8 @@
0
0
- 8
- 47
+ 7
+ 46
5
0
0
@@ -881,8 +850,8 @@
0
- 8
- 48
+ 7
+ 47
5
0
0
@@ -901,8 +870,8 @@
0
0
- 9
- 49
+ 8
+ 48
1
0
0
@@ -921,8 +890,8 @@
0
0
- 10
- 50
+ 9
+ 49
1
0
0
@@ -932,6 +901,30 @@
0
0
+
+ 9
+ 50
+ 1
+ 0
+ 0
+ 0
+ ..\..\BSP\Src\serial_hw.c
+ serial_hw.c
+ 0
+ 0
+
+
+ 9
+ 51
+ 1
+ 0
+ 0
+ 0
+ ..\..\BSP\Src\drv_adc_measure.c
+ drv_adc_measure.c
+ 0
+ 0
+
@@ -941,8 +934,8 @@
0
0
- 11
- 51
+ 10
+ 52
1
0
0
@@ -952,18 +945,6 @@
0
0
-
- 11
- 52
- 1
- 0
- 0
- 0
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\serial\serial_hw.c
- serial_hw.c
- 0
- 0
-
@@ -973,7 +954,7 @@
0
0
- 12
+ 11
53
1
0
@@ -993,7 +974,7 @@
0
0
- 13
+ 12
54
1
0
@@ -1005,7 +986,7 @@
0
- 13
+ 12
55
1
0
@@ -1017,7 +998,7 @@
0
- 13
+ 12
56
1
0
@@ -1029,7 +1010,7 @@
0
- 13
+ 12
57
1
0
@@ -1041,7 +1022,7 @@
0
- 13
+ 12
58
1
0
@@ -1053,7 +1034,7 @@
0
- 13
+ 12
59
1
0
@@ -1073,7 +1054,7 @@
0
0
- 14
+ 13
60
1
0
@@ -1085,7 +1066,7 @@
0
- 14
+ 13
61
1
0
@@ -1097,7 +1078,7 @@
0
- 14
+ 13
62
1
0
@@ -1109,7 +1090,7 @@
0
- 14
+ 13
63
1
0
@@ -1121,7 +1102,7 @@
0
- 14
+ 13
64
1
0
@@ -1133,7 +1114,7 @@
0
- 14
+ 13
65
1
0
@@ -1145,7 +1126,7 @@
0
- 14
+ 13
66
1
0
@@ -1157,7 +1138,7 @@
0
- 14
+ 13
67
1
0
@@ -1169,7 +1150,7 @@
0
- 14
+ 13
68
1
0
@@ -1181,7 +1162,7 @@
0
- 14
+ 13
69
1
0
@@ -1193,7 +1174,7 @@
0
- 14
+ 13
70
1
0
@@ -1205,7 +1186,7 @@
0
- 14
+ 13
71
1
0
@@ -1217,7 +1198,7 @@
0
- 14
+ 13
72
1
0
@@ -1237,7 +1218,7 @@
0
0
- 15
+ 14
73
5
0
@@ -1257,7 +1238,7 @@
0
0
- 16
+ 15
74
1
0
@@ -1269,7 +1250,7 @@
0
- 16
+ 15
75
1
0
@@ -1281,7 +1262,7 @@
0
- 16
+ 15
76
1
0
@@ -1293,7 +1274,7 @@
0
- 16
+ 15
77
1
0
@@ -1305,7 +1286,7 @@
0
- 16
+ 15
78
1
0
@@ -1317,7 +1298,7 @@
0
- 16
+ 15
79
1
0
@@ -1329,7 +1310,7 @@
0
- 16
+ 15
80
1
0
@@ -1349,7 +1330,7 @@
0
0
- 17
+ 16
81
4
0
@@ -1361,7 +1342,7 @@
0
- 17
+ 16
82
4
0
@@ -1373,14 +1354,14 @@
0
- 17
+ 16
83
4
0
0
0
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\wifi_driver.lib
- wifi_driver.lib
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\soc_driver.lib
+ soc_driver.lib
0
0
@@ -1393,7 +1374,7 @@
0
0
- 18
+ 17
84
1
0
@@ -1404,6 +1385,18 @@
0
0
+
+ 17
+ 85
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_port\wifi_port.c
+ wifi_port.c
+ 0
+ 0
+
@@ -1413,8 +1406,8 @@
0
0
- 19
- 85
+ 18
+ 86
1
0
0
@@ -1425,8 +1418,8 @@
0
- 19
- 86
+ 18
+ 87
1
0
0
@@ -1437,8 +1430,8 @@
0
- 19
- 87
+ 18
+ 88
1
0
0
@@ -1449,8 +1442,8 @@
0
- 19
- 88
+ 18
+ 89
1
0
0
@@ -1461,8 +1454,8 @@
0
- 19
- 89
+ 18
+ 90
1
0
0
@@ -1473,8 +1466,8 @@
0
- 19
- 90
+ 18
+ 91
1
0
0
@@ -1485,8 +1478,8 @@
0
- 19
- 91
+ 18
+ 92
1
0
0
@@ -1497,8 +1490,8 @@
0
- 19
- 92
+ 18
+ 93
1
0
0
@@ -1509,8 +1502,8 @@
0
- 19
- 93
+ 18
+ 94
1
0
0
@@ -1521,8 +1514,8 @@
0
- 19
- 94
+ 18
+ 95
1
0
0
@@ -1533,8 +1526,8 @@
0
- 19
- 95
+ 18
+ 96
1
0
0
@@ -1545,8 +1538,8 @@
0
- 19
- 96
+ 18
+ 97
1
0
0
@@ -1557,8 +1550,8 @@
0
- 19
- 97
+ 18
+ 98
1
0
0
@@ -1569,8 +1562,8 @@
0
- 19
- 98
+ 18
+ 99
1
0
0
@@ -1581,8 +1574,8 @@
0
- 19
- 99
+ 18
+ 100
1
0
0
@@ -1593,8 +1586,8 @@
0
- 19
- 100
+ 18
+ 101
1
0
0
@@ -1605,8 +1598,8 @@
0
- 19
- 101
+ 18
+ 102
1
0
0
@@ -1617,8 +1610,8 @@
0
- 19
- 102
+ 18
+ 103
1
0
0
@@ -1629,8 +1622,8 @@
0
- 19
- 103
+ 18
+ 104
1
0
0
@@ -1641,8 +1634,8 @@
0
- 19
- 104
+ 18
+ 105
1
0
0
@@ -1653,8 +1646,8 @@
0
- 19
- 105
+ 18
+ 106
1
0
0
@@ -1665,8 +1658,8 @@
0
- 19
- 106
+ 18
+ 107
1
0
0
@@ -1677,8 +1670,8 @@
0
- 19
- 107
+ 18
+ 108
1
0
0
@@ -1689,8 +1682,8 @@
0
- 19
- 108
+ 18
+ 109
1
0
0
@@ -1701,8 +1694,8 @@
0
- 19
- 109
+ 18
+ 110
1
0
0
@@ -1721,8 +1714,8 @@
0
0
- 20
- 110
+ 19
+ 111
1
0
0
@@ -1733,8 +1726,8 @@
0
- 20
- 111
+ 19
+ 112
1
0
0
@@ -1745,8 +1738,8 @@
0
- 20
- 112
+ 19
+ 113
1
0
0
@@ -1757,8 +1750,8 @@
0
- 20
- 113
+ 19
+ 114
1
0
0
@@ -1769,8 +1762,8 @@
0
- 20
- 114
+ 19
+ 115
1
0
0
@@ -1781,8 +1774,8 @@
0
- 20
- 115
+ 19
+ 116
1
0
0
@@ -1793,8 +1786,8 @@
0
- 20
- 116
+ 19
+ 117
1
0
0
@@ -1805,8 +1798,8 @@
0
- 20
- 117
+ 19
+ 118
1
0
0
@@ -1825,8 +1818,8 @@
0
0
- 21
- 118
+ 20
+ 119
1
0
0
@@ -1837,8 +1830,8 @@
0
- 21
- 119
+ 20
+ 120
1
0
0
@@ -1857,8 +1850,8 @@
0
0
- 22
- 120
+ 21
+ 121
1
0
0
@@ -1869,8 +1862,8 @@
0
- 22
- 121
+ 21
+ 122
1
0
0
@@ -1881,8 +1874,8 @@
0
- 22
- 122
+ 21
+ 123
5
0
0
@@ -1901,8 +1894,8 @@
0
0
- 23
- 123
+ 22
+ 124
1
0
0
@@ -1913,8 +1906,8 @@
0
- 23
- 124
+ 22
+ 125
1
0
0
@@ -1925,8 +1918,8 @@
0
- 23
- 125
+ 22
+ 126
1
0
0
@@ -1937,8 +1930,8 @@
0
- 23
- 126
+ 22
+ 127
1
0
0
@@ -1949,8 +1942,8 @@
0
- 23
- 127
+ 22
+ 128
1
0
0
@@ -1963,39 +1956,55 @@
- tos_components
+ fs
0
0
0
0
- 24
- 128
- 1
- 0
- 0
- 0
- ..\..\..\..\components\fs\kv\tos_kv.c
- tos_kv.c
- 0
- 0
-
-
-
-
- nvds
- 0
- 0
- 0
- 0
-
- 25
+ 23
129
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\nvds\nvds.c
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv\ln_kv.c
+ ln_kv.c
+ 0
+ 0
+
+
+ 23
+ 130
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv_port\ln_kv_port.c
+ ln_kv_port.c
+ 0
+ 0
+
+
+ 23
+ 131
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\partition_mgr\flash_partition_mgr.c
+ flash_partition_mgr.c
+ 0
+ 0
+
+
+ 23
+ 132
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\nvds\nvds.c
nvds.c
0
0
@@ -2009,8 +2018,8 @@
0
0
- 26
- 130
+ 24
+ 133
1
0
0
@@ -2021,8 +2030,8 @@
0
- 26
- 131
+ 24
+ 134
5
0
0
@@ -2041,8 +2050,8 @@
0
0
- 27
- 132
+ 25
+ 135
1
0
0
@@ -2053,8 +2062,8 @@
0
- 27
- 133
+ 25
+ 136
1
0
0
@@ -2065,8 +2074,8 @@
0
- 27
- 134
+ 25
+ 137
1
0
0
@@ -2077,8 +2086,8 @@
0
- 27
- 135
+ 25
+ 138
1
0
0
@@ -2089,8 +2098,8 @@
0
- 27
- 136
+ 25
+ 139
1
0
0
@@ -2101,8 +2110,8 @@
0
- 27
- 137
+ 25
+ 140
1
0
0
@@ -2113,8 +2122,8 @@
0
- 27
- 138
+ 25
+ 141
1
0
0
@@ -2125,8 +2134,8 @@
0
- 27
- 139
+ 25
+ 142
1
0
0
@@ -2137,8 +2146,8 @@
0
- 27
- 140
+ 25
+ 143
1
0
0
@@ -2149,8 +2158,8 @@
0
- 27
- 141
+ 25
+ 144
1
0
0
@@ -2169,8 +2178,8 @@
0
0
- 28
- 142
+ 26
+ 145
1
0
0
@@ -2181,8 +2190,8 @@
0
- 28
- 143
+ 26
+ 146
5
0
0
@@ -2193,8 +2202,8 @@
0
- 28
- 144
+ 26
+ 147
5
0
0
@@ -2205,8 +2214,8 @@
0
- 28
- 145
+ 26
+ 148
1
0
0
@@ -2225,8 +2234,8 @@
0
0
- 29
- 146
+ 27
+ 149
1
0
0
@@ -2245,8 +2254,8 @@
0
0
- 30
- 147
+ 28
+ 150
1
0
0
@@ -2257,8 +2266,8 @@
0
- 30
- 148
+ 28
+ 151
1
0
0
@@ -2269,8 +2278,8 @@
0
- 30
- 149
+ 28
+ 152
1
0
0
@@ -2281,8 +2290,8 @@
0
- 30
- 150
+ 28
+ 153
1
0
0
@@ -2293,8 +2302,8 @@
0
- 30
- 151
+ 28
+ 154
1
0
0
@@ -2305,8 +2314,8 @@
0
- 30
- 152
+ 28
+ 155
1
0
0
@@ -2317,8 +2326,8 @@
0
- 30
- 153
+ 28
+ 156
1
0
0
diff --git a/board/EVB_LN882x/KEIL/mqtt_client/TencentOS_tiny.uvprojx b/board/EVB_LN882x/KEIL/mqtt_client/TencentOS_tiny.uvprojx
index e6baa5ba..2001a485 100644
--- a/board/EVB_LN882x/KEIL/mqtt_client/TencentOS_tiny.uvprojx
+++ b/board/EVB_LN882x/KEIL/mqtt_client/TencentOS_tiny.uvprojx
@@ -10,8 +10,7 @@
TencentOS_tiny
0x4
ARM-ADS
- 5060750::V5.06 update 6 (build 750)::ARMCC
- 0
+ 5060061::V5.06 update 1 (build 61)::ARMCC
ARMCM4_FP
@@ -70,9 +69,9 @@
0
- 0
+ 1
0
-
+ python ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\user_cmd\before_build.py flash_partition_cfg.json flash_partition_table.h
0
0
@@ -81,9 +80,9 @@
1
- 0
- .\after_build_ln882x.bat
-
+ 1
+ python ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\user_cmd\after_build_soc.py @L
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\bin\mkimage.exe cmd_app ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\boot_ln882x.bin @L.bin @L.asm flashimage.bin flash_partition_cfg.json ver=1.1
0
0
0
@@ -184,7 +183,6 @@
0
0
2
- 0
0
0
8
@@ -325,20 +323,16 @@
0
0
1
- 0
0
1
1
1
1
- 0
- 0
- 0
LN882x,ARM_MATH_CM4
- ..\..\BSP\Inc;..\..\TOS-CONFIG;..\..\..\..\kernel\pm\include;..\..\..\..\kernel\core\include;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\..\..\osal\cmsis_os;..\..\..\..\examples\helloworld;..\hello_world;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\driver_ln882x;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\ll\include;..\..\..\..\components\fs\kv\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\ln88xx;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\kernel;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\CMSIS_5.3.0;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\wifi_manager;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\net;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\port;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\port\arch;..\..\..\..\components\connectivity\mqttclient\common;..\..\..\..\components\connectivity\mqttclient\mqtt;..\..\..\..\components\connectivity\mqttclient\mqttclient;..\..\..\..\components\connectivity\mqttclient\network;..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny
+ ..\..\BSP\Inc;..\..\TOS-CONFIG;..\..\..\..\kernel\pm\include;..\..\..\..\kernel\core\include;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\..\..\osal\cmsis_os;..\..\..\..\examples\helloworld;..\hello_world;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\driver_ln882x;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\ll\include;..\..\..\..\components\fs\kv\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\ln88xx;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\kernel;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\CMSIS_5.3.0;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\wifi_manager;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\net;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\port;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\port\arch;..\..\..\..\components\connectivity\mqttclient\common;..\..\..\..\components\connectivity\mqttclient\mqtt;..\..\..\..\components\connectivity\mqttclient\mqttclient;..\..\..\..\components\connectivity\mqttclient\network;..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_port;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv_port;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\nvds;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\partition_mgr;..\mqtt_client
@@ -351,7 +345,6 @@
0
0
0
- 0
@@ -369,10 +362,10 @@
0x08000000
0x20000000
- .\firmware_XIP_ln882x.sct
+ .\ln882x.sct
- --no_autoat --keep=main.o(no_init_data)
+ --no_autoat --keep=*.o(no_init_data)
@@ -419,16 +412,6 @@
-
- Drivers/Drv
-
-
- drv_adc_measure.c
- 1
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\drv\drv_adc_measure.c
-
-
-
Drivers/HAL
@@ -514,15 +497,11 @@
2
2
2
- 2
2
0
0
2
2
- 2
- 2
- 2
@@ -728,6 +707,16 @@
1
..\..\BSP\Src\mcu_init.c
+
+ serial_hw.c
+ 1
+ ..\..\BSP\Src\serial_hw.c
+
+
+ drv_adc_measure.c
+ 1
+ ..\..\BSP\Src\drv_adc_measure.c
+
@@ -738,11 +727,6 @@
1
..\..\..\..\platform\vendor_bsp\LN\ln882x\src\serial\serial.c
-
- serial_hw.c
- 1
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\serial\serial_hw.c
-
@@ -924,9 +908,9 @@
..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\wifi_mac.lib
- wifi_driver.lib
+ soc_driver.lib
4
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\wifi_driver.lib
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\soc_driver.lib
@@ -938,6 +922,11 @@
1
..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_manager\wifi_manager.c
+
+ wifi_port.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_port\wifi_port.c
+
@@ -1005,15 +994,11 @@
2
2
2
- 2
2
0
0
2
2
- 2
- 2
- 2
@@ -1232,22 +1217,27 @@
- tos_components
+ fs
- tos_kv.c
+ ln_kv.c
1
- ..\..\..\..\components\fs\kv\tos_kv.c
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv\ln_kv.c
+
+
+ ln_kv_port.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv_port\ln_kv_port.c
+
+
+ flash_partition_mgr.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\partition_mgr\flash_partition_mgr.c
-
-
-
- nvds
-
nvds.c
1
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\nvds\nvds.c
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\nvds\nvds.c
diff --git a/board/EVB_LN882x/KEIL/mqtt_client/after_build_ln882x.bat b/board/EVB_LN882x/KEIL/mqtt_client/after_build_ln882x.bat
index cc2c0678..60675d37 100644
--- a/board/EVB_LN882x/KEIL/mqtt_client/after_build_ln882x.bat
+++ b/board/EVB_LN882x/KEIL/mqtt_client/after_build_ln882x.bat
@@ -1,8 +1,4 @@
-
-python ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\user_cmd\after_build_soc.py firmware_XIP
-
-..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\bin\mkimage.exe ln882x flashimage ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\boot_ram_ln882x.bin firmware_XIP.bin flashimage.bin release=1 crp_enable=0 app_version=10 hw_version=0
-
-..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\bin\fpu_patch.exe .\firmware_XIP.asm .\flashimage.bin
+python ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\user_cmd\after_build_soc.py @L
+..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\bin\mkimage.exe cmd_app ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\boot_ln882x.bin @L.bin @L.asm flashimage.bin flash_partition_cfg.json ver=1.1
diff --git a/board/EVB_LN882x/KEIL/mqtt_client/flash_partition_cfg.json b/board/EVB_LN882x/KEIL/mqtt_client/flash_partition_cfg.json
new file mode 100644
index 00000000..91fec537
--- /dev/null
+++ b/board/EVB_LN882x/KEIL/mqtt_client/flash_partition_cfg.json
@@ -0,0 +1,22 @@
+{
+ "Warning1":"è¦å‘Šï¼Œç³»ç»Ÿå®šä¹‰ç”¨æˆ·ä¸å¯ä¿®æ”¹!!!",
+ "vendor_define":
+ [
+ {"partition_type": "BOOT", "start_addr": "0x00000000", "size_KB": 36 },
+ {"partition_type": "PART_TAB", "start_addr": "0x00009000", "size_KB": 4 }
+ ],
+
+
+ "Warning2":"以下数æ®,ç”¨æˆ·æ ¹æ®SOC flash容é‡ä»¥åŠå…·ä½“需求修改,仅å¯ä»¥ä¿®æ”¹start_addr值和size值,且必须4KB对é½!!!",
+ "user_define":
+ [
+ {"partition_type": "KV", "start_addr": "0x0000A000", "size_KB": 8 },
+ {"partition_type": "SIMU_EEPROM", "start_addr": "0x0000C000", "size_KB": 8 },
+ {"partition_type": "APP", "start_addr": "0x0000E000", "size_KB": 800 },
+ {"partition_type": "OTA", "start_addr": "0x000D6000", "size_KB": 800 },
+ {"partition_type": "NVDS", "start_addr": "0x0019E000", "size_KB": 12 },
+ {"partition_type": "USER", "start_addr": "0x001A1000", "size_KB": 12 }
+ ]
+}
+
+
diff --git a/board/EVB_LN882x/KEIL/mqtt_client/flash_partition_table.h b/board/EVB_LN882x/KEIL/mqtt_client/flash_partition_table.h
index e068e5bf..08788e3c 100644
--- a/board/EVB_LN882x/KEIL/mqtt_client/flash_partition_table.h
+++ b/board/EVB_LN882x/KEIL/mqtt_client/flash_partition_table.h
@@ -1,32 +1,56 @@
-#ifndef __FLASH_PARTITION_TABLE_H__
-#define __FLASH_PARTITION_TABLE_H__
+#ifndef __FLASH_PARTITION_TABLE__
+#define __FLASH_PARTITION_TABLE__
-//#define RETENTION_MEM_BASE 0x20028000
-//#define RETENTION_MEM_SIZE 0x2000
-#ifndef FLASH_BASE
-#define FLASH_BASE (0x10000000)
+//flash partition map,it's generated by the script based on the json file
+
+#define BOOT_SPACE_OFFSET (0x00000000)
+#define BOOT_SPACE_SIZE (1024*36)
+
+#define PART_TAB_SPACE_OFFSET (0x00009000)
+#define PART_TAB_SPACE_SIZE (1024*4)
+#if (PART_TAB_SPACE_OFFSET < (BOOT_SPACE_OFFSET + BOOT_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
#endif
-#ifndef FLASH_SIZE
-#define FLASH_SIZE (0x00200000)
+#define KV_SPACE_OFFSET (0x0000A000)
+#define KV_SPACE_SIZE (1024*8)
+#if (KV_SPACE_OFFSET < (PART_TAB_SPACE_OFFSET + PART_TAB_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
#endif
-#ifndef PRIMARY_PARTITION_OFFSET
-#define PRIMARY_PARTITION_OFFSET (0x0000F000)
+#define SIMU_EEPROM_SPACE_OFFSET (0x0000C000)
+#define SIMU_EEPROM_SPACE_SIZE (1024*8)
+#if (SIMU_EEPROM_SPACE_OFFSET < (KV_SPACE_OFFSET + KV_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
#endif
-#define PRIMARY_PATTITION_START 0x0000F000
-#define PRIMARY_PATTITION_SIZE 0xE1000
-//#define USERAPP_SRAM_BASE 0x1FFF0000
-#define BACKUP_PATTITION_START 0x000F0000
-#define BACKUP_PATTITION_SIZE 0xE1000
-#define USERDATA_PATTITION_START 0x001D1000
-#define USERDATA_PATTITION_SIZE 0x23000
-
-//memory offset check
-#if ((PRIMARY_PATTITION_START < PRIMARY_PARTITION_OFFSET) || (BACKUP_PATTITION_START < PRIMARY_PATTITION_START) || (USERDATA_PATTITION_START < BACKUP_PATTITION_START) || (PRIMARY_PATTITION_START + PRIMARY_PATTITION_SIZE > BACKUP_PATTITION_START) || (BACKUP_PATTITION_START + BACKUP_PATTITION_SIZE > USERDATA_PATTITION_START) || (USERDATA_PATTITION_START + USERDATA_PATTITION_SIZE > FLASH_SIZE))
- #error "flash partition define error!"
+#define APP_SPACE_OFFSET (0x0000E000)
+#define APP_SPACE_SIZE (1024*800)
+#if (APP_SPACE_OFFSET < (SIMU_EEPROM_SPACE_OFFSET + SIMU_EEPROM_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
#endif
-#endif /* __FLASH_PARTITION_TABLE_H__ */
+#define OTA_SPACE_OFFSET (0x000D6000)
+#define OTA_SPACE_SIZE (1024*800)
+#if (OTA_SPACE_OFFSET < (APP_SPACE_OFFSET + APP_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
+#endif
+
+#define NVDS_SPACE_OFFSET (0x0019E000)
+#define NVDS_SPACE_SIZE (1024*12)
+#if (NVDS_SPACE_OFFSET < (OTA_SPACE_OFFSET + OTA_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
+#endif
+
+#define USER_SPACE_OFFSET (0x001A1000)
+#define USER_SPACE_SIZE (1024*12)
+#if (USER_SPACE_OFFSET < (NVDS_SPACE_OFFSET + NVDS_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
+#endif
+
+
+#define IMAGE_HEADER_SIZE (0x100)
+
+#endif /* __FLASH_PARTITION_TABLE__ */
+
diff --git a/board/EVB_LN882x/KEIL/mqtt_client/firmware_XIP_ln882x.sct b/board/EVB_LN882x/KEIL/mqtt_client/ln882x.sct
similarity index 59%
rename from board/EVB_LN882x/KEIL/mqtt_client/firmware_XIP_ln882x.sct
rename to board/EVB_LN882x/KEIL/mqtt_client/ln882x.sct
index 50c5ed54..26dc840b 100644
--- a/board/EVB_LN882x/KEIL/mqtt_client/firmware_XIP_ln882x.sct
+++ b/board/EVB_LN882x/KEIL/mqtt_client/ln882x.sct
@@ -1,9 +1,9 @@
#! armcc -E
-#include ".\flash_partition_table.h"
+#include "flash_partition_table.h"
#include ".\..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\ln88xx\mem_map_ln882x.h"
-LR_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET PRIMARY_PATTITION_SIZE
+LR_FLASH CACHE_FLASH_BASE+APP_SPACE_OFFSET+IMAGE_HEADER_SIZE APP_SPACE_SIZE
{; load region size_region
ISR_VECTOR RAM_BASE ALIGN 0x100
@@ -11,7 +11,7 @@ LR_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET PRIMARY_PATTITION_SIZE
startup_*.o (RESET, +First)
}
- ER_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET + ImageLength(ISR_VECTOR) PRIMARY_PATTITION_SIZE
+ ER_FLASH CACHE_FLASH_BASE+APP_SPACE_OFFSET+IMAGE_HEADER_SIZE + ImageLength(ISR_VECTOR) APP_SPACE_SIZE
{; load address = execution address
*(InRoot$$Sections)
.ANY (+RO)
@@ -24,15 +24,15 @@ LR_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET PRIMARY_PATTITION_SIZE
ll_cache.o(+RO)
ll_dma.o(+RO)
ll_syscon.o(+RO)
- ll_sleep.o(+RO)
- ll_rtc.o(+RO)
+ ;ll_sleep.o(+RO)
+ ;ll_rtc.o(+RO)
cache.o(+RO)
qspi.o(+RO)
flash.o(+RO)
hal_dma.o(+RO)
hal_syscon.o(+RO)
- hal_sleep.o(+RO)
- hal_rtc.o(+RO)
+ ;hal_sleep.o(+RO)
+ ;hal_rtc.o(+RO)
;port.o(XIR)
;optional item
@@ -49,16 +49,32 @@ LR_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET PRIMARY_PATTITION_SIZE
startup_ln*(+RW +ZI)
}
- ER_DATA +0
+ ER_DATA_IN_B0 +0 RAM_BLOCK0_SIZE-ImageLength(ISR_VECTOR)-ImageLength(ER_CODE)-ImageLength(ER_STACK)
{
- *(.ARM.__at_0x1FFFFFFC)
- .ANY (+RW +ZI)
+ memp.o(+RW +ZI)
+ imem.o(+RW +ZI)
+ imem_if.o(+RW +ZI)
+ ;cglobals_sta.o(+RW +ZI)
+ ;event_manager.o(+RW +ZI)
+ iconfig.o(+RW +ZI)
+ common.o(+RW +ZI)
+ }
+
+ HEAP_SPACE0 +0 EMPTY RAM_BLOCK1_BASE-ImageLimit(ER_DATA_IN_B0)
+ {; Heap region
+ }
+
+ ER_DATA_IN_B1 RAM_BLOCK1_BASE RAM_BLOCK1_SIZE
+ {
+ *(wlan_mem_pkt)
+ *(wlan_mem_dscr)
+ .ANY (+RW +ZI)
}
;IQ Data area cannot be used by ER_DATA region
;ScatterAssert(ImageLimit(ER_DATA) < (0x20020300))
- HEAP_SPACE +0 EMPTY RETENTION_MEM_BASE-ImageLimit(ER_DATA)
+ HEAP_SPACE1 +0 EMPTY RETENTION_MEM_BASE-ImageLimit(ER_DATA_IN_B1)
{; Heap region
}
diff --git a/board/EVB_LN882x/KEIL/qcloud_iot_explorer/TencentOS_tiny.uvoptx b/board/EVB_LN882x/KEIL/qcloud_iot_explorer/TencentOS_tiny.uvoptx
index 4f505a61..b75098af 100644
--- a/board/EVB_LN882x/KEIL/qcloud_iot_explorer/TencentOS_tiny.uvoptx
+++ b/board/EVB_LN882x/KEIL/qcloud_iot_explorer/TencentOS_tiny.uvoptx
@@ -117,11 +117,6 @@
Segger\JL2CM3.dll
-
- 0
- DLGUARM
- d
-
0
ARMRTXEVENTFLAGS
@@ -153,7 +148,24 @@
-U-O142 -O2254 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:STM32F103VE$Flash\STM32F10x_512.FLM)
-
+
+
+ 0
+ 0
+ 90
+ 1
+ 268493334
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\hal\hal_interrupt.c
+
+ \\firmware_XIP\../../../../platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_interrupt.c\90
+
+
0
@@ -185,6 +197,11 @@
1
phy_reg_val_table_1,0x10
+
+ 6
+ 1
+ k_curr_task
+
@@ -208,7 +225,7 @@
0
1
- 1
+ 0
0
0
0
@@ -288,7 +305,7 @@
Application/User
- 0
+ 1
0
0
0
@@ -308,7 +325,7 @@
examples
- 0
+ 1
0
0
0
@@ -363,7 +380,7 @@
- Drivers/Drv
+ Drivers/HAL
0
0
0
@@ -375,34 +392,14 @@
0
0
0
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\drv\drv_adc_measure.c
- drv_adc_measure.c
- 0
- 0
-
-
-
-
- Drivers/HAL
- 0
- 0
- 0
- 0
-
- 5
- 9
- 1
- 0
- 0
- 0
..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\hal\hal_common.c
hal_common.c
0
0
- 5
- 10
+ 4
+ 9
1
0
0
@@ -413,8 +410,8 @@
0
- 5
- 11
+ 4
+ 10
1
0
0
@@ -425,8 +422,8 @@
0
- 5
- 12
+ 4
+ 11
1
0
0
@@ -437,8 +434,8 @@
0
- 5
- 13
+ 4
+ 12
1
0
0
@@ -449,8 +446,8 @@
0
- 5
- 14
+ 4
+ 13
1
0
0
@@ -461,8 +458,8 @@
0
- 5
- 15
+ 4
+ 14
1
0
0
@@ -473,8 +470,8 @@
0
- 5
- 16
+ 4
+ 15
1
0
0
@@ -485,8 +482,8 @@
0
- 5
- 17
+ 4
+ 16
1
0
0
@@ -497,8 +494,8 @@
0
- 5
- 18
+ 4
+ 17
1
0
0
@@ -509,8 +506,8 @@
0
- 5
- 19
+ 4
+ 18
1
0
0
@@ -521,8 +518,8 @@
0
- 5
- 20
+ 4
+ 19
1
0
0
@@ -533,8 +530,8 @@
0
- 5
- 21
+ 4
+ 20
1
0
0
@@ -553,8 +550,8 @@
0
0
- 6
- 22
+ 5
+ 21
1
0
0
@@ -565,8 +562,8 @@
0
- 6
- 23
+ 5
+ 22
1
0
0
@@ -577,8 +574,8 @@
0
- 6
- 24
+ 5
+ 23
1
0
0
@@ -589,8 +586,8 @@
0
- 6
- 25
+ 5
+ 24
1
0
0
@@ -601,8 +598,8 @@
0
- 6
- 26
+ 5
+ 25
1
0
0
@@ -613,8 +610,8 @@
0
- 6
- 27
+ 5
+ 26
1
0
0
@@ -625,8 +622,8 @@
0
- 6
- 28
+ 5
+ 27
1
0
0
@@ -637,8 +634,8 @@
0
- 6
- 29
+ 5
+ 28
1
0
0
@@ -649,8 +646,8 @@
0
- 6
- 30
+ 5
+ 29
1
0
0
@@ -661,8 +658,8 @@
0
- 6
- 31
+ 5
+ 30
1
0
0
@@ -673,8 +670,8 @@
0
- 6
- 32
+ 5
+ 31
1
0
0
@@ -685,8 +682,8 @@
0
- 6
- 33
+ 5
+ 32
1
0
0
@@ -697,8 +694,8 @@
0
- 6
- 34
+ 5
+ 33
1
0
0
@@ -709,8 +706,8 @@
0
- 6
- 35
+ 5
+ 34
1
0
0
@@ -721,8 +718,8 @@
0
- 6
- 36
+ 5
+ 35
1
0
0
@@ -733,8 +730,8 @@
0
- 6
- 37
+ 5
+ 36
1
0
0
@@ -745,8 +742,8 @@
0
- 6
- 38
+ 5
+ 37
1
0
0
@@ -757,8 +754,8 @@
0
- 6
- 39
+ 5
+ 38
1
0
0
@@ -769,8 +766,8 @@
0
- 6
- 40
+ 5
+ 39
1
0
0
@@ -781,8 +778,8 @@
0
- 6
- 41
+ 5
+ 40
1
0
0
@@ -793,8 +790,8 @@
0
- 6
- 42
+ 5
+ 41
1
0
0
@@ -805,8 +802,8 @@
0
- 6
- 43
+ 5
+ 42
1
0
0
@@ -817,8 +814,8 @@
0
- 6
- 44
+ 5
+ 43
1
0
0
@@ -829,8 +826,8 @@
0
- 6
- 45
+ 5
+ 44
1
0
0
@@ -849,8 +846,8 @@
0
0
- 7
- 46
+ 6
+ 45
1
0
0
@@ -861,8 +858,8 @@
0
- 7
- 47
+ 6
+ 46
2
0
0
@@ -873,8 +870,8 @@
0
- 7
- 48
+ 6
+ 47
1
0
0
@@ -893,8 +890,8 @@
0
0
- 8
- 49
+ 7
+ 48
5
0
0
@@ -905,8 +902,8 @@
0
- 8
- 50
+ 7
+ 49
5
0
0
@@ -925,8 +922,8 @@
0
0
- 9
- 51
+ 8
+ 50
1
0
0
@@ -945,8 +942,8 @@
0
0
- 10
- 52
+ 9
+ 51
1
0
0
@@ -956,6 +953,30 @@
0
0
+
+ 9
+ 52
+ 1
+ 0
+ 0
+ 0
+ ..\..\BSP\Src\serial_hw.c
+ serial_hw.c
+ 0
+ 0
+
+
+ 9
+ 53
+ 1
+ 0
+ 0
+ 0
+ ..\..\BSP\Src\drv_adc_measure.c
+ drv_adc_measure.c
+ 0
+ 0
+
@@ -965,8 +986,8 @@
0
0
- 11
- 53
+ 10
+ 54
1
0
0
@@ -976,18 +997,6 @@
0
0
-
- 11
- 54
- 1
- 0
- 0
- 0
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\serial\serial_hw.c
- serial_hw.c
- 0
- 0
-
@@ -997,7 +1006,7 @@
0
0
- 12
+ 11
55
1
0
@@ -1017,7 +1026,7 @@
0
0
- 13
+ 12
56
1
0
@@ -1029,7 +1038,7 @@
0
- 13
+ 12
57
1
0
@@ -1041,7 +1050,7 @@
0
- 13
+ 12
58
1
0
@@ -1053,7 +1062,7 @@
0
- 13
+ 12
59
1
0
@@ -1065,7 +1074,7 @@
0
- 13
+ 12
60
1
0
@@ -1077,7 +1086,7 @@
0
- 13
+ 12
61
1
0
@@ -1097,7 +1106,7 @@
0
0
- 14
+ 13
62
1
0
@@ -1109,7 +1118,7 @@
0
- 14
+ 13
63
1
0
@@ -1121,7 +1130,7 @@
0
- 14
+ 13
64
1
0
@@ -1133,7 +1142,7 @@
0
- 14
+ 13
65
1
0
@@ -1145,7 +1154,7 @@
0
- 14
+ 13
66
1
0
@@ -1157,7 +1166,7 @@
0
- 14
+ 13
67
1
0
@@ -1169,7 +1178,7 @@
0
- 14
+ 13
68
1
0
@@ -1181,7 +1190,7 @@
0
- 14
+ 13
69
1
0
@@ -1193,7 +1202,7 @@
0
- 14
+ 13
70
1
0
@@ -1205,7 +1214,7 @@
0
- 14
+ 13
71
1
0
@@ -1217,7 +1226,7 @@
0
- 14
+ 13
72
1
0
@@ -1229,7 +1238,7 @@
0
- 14
+ 13
73
1
0
@@ -1241,7 +1250,7 @@
0
- 14
+ 13
74
1
0
@@ -1261,7 +1270,7 @@
0
0
- 15
+ 14
75
5
0
@@ -1281,7 +1290,7 @@
0
0
- 16
+ 15
76
1
0
@@ -1293,7 +1302,7 @@
0
- 16
+ 15
77
1
0
@@ -1305,7 +1314,7 @@
0
- 16
+ 15
78
1
0
@@ -1317,7 +1326,7 @@
0
- 16
+ 15
79
1
0
@@ -1329,7 +1338,7 @@
0
- 16
+ 15
80
1
0
@@ -1341,7 +1350,7 @@
0
- 16
+ 15
81
1
0
@@ -1353,7 +1362,7 @@
0
- 16
+ 15
82
1
0
@@ -1373,7 +1382,7 @@
0
0
- 17
+ 16
83
4
0
@@ -1385,7 +1394,7 @@
0
- 17
+ 16
84
4
0
@@ -1397,14 +1406,14 @@
0
- 17
+ 16
85
4
0
0
0
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\wifi_driver.lib
- wifi_driver.lib
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\soc_driver.lib
+ soc_driver.lib
0
0
@@ -1417,7 +1426,7 @@
0
0
- 18
+ 17
86
1
0
@@ -1428,6 +1437,18 @@
0
0
+
+ 17
+ 87
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_port\wifi_port.c
+ wifi_port.c
+ 0
+ 0
+
@@ -1437,8 +1458,8 @@
0
0
- 19
- 87
+ 18
+ 88
1
0
0
@@ -1449,8 +1470,8 @@
0
- 19
- 88
+ 18
+ 89
1
0
0
@@ -1461,8 +1482,8 @@
0
- 19
- 89
+ 18
+ 90
1
0
0
@@ -1473,8 +1494,8 @@
0
- 19
- 90
+ 18
+ 91
1
0
0
@@ -1485,8 +1506,8 @@
0
- 19
- 91
+ 18
+ 92
1
0
0
@@ -1497,8 +1518,8 @@
0
- 19
- 92
+ 18
+ 93
1
0
0
@@ -1509,8 +1530,8 @@
0
- 19
- 93
+ 18
+ 94
1
0
0
@@ -1521,8 +1542,8 @@
0
- 19
- 94
+ 18
+ 95
1
0
0
@@ -1533,8 +1554,8 @@
0
- 19
- 95
+ 18
+ 96
1
0
0
@@ -1545,8 +1566,8 @@
0
- 19
- 96
+ 18
+ 97
1
0
0
@@ -1557,8 +1578,8 @@
0
- 19
- 97
+ 18
+ 98
1
0
0
@@ -1569,8 +1590,8 @@
0
- 19
- 98
+ 18
+ 99
1
0
0
@@ -1581,8 +1602,8 @@
0
- 19
- 99
+ 18
+ 100
1
0
0
@@ -1593,8 +1614,8 @@
0
- 19
- 100
+ 18
+ 101
1
0
0
@@ -1605,8 +1626,8 @@
0
- 19
- 101
+ 18
+ 102
1
0
0
@@ -1617,8 +1638,8 @@
0
- 19
- 102
+ 18
+ 103
1
0
0
@@ -1629,8 +1650,8 @@
0
- 19
- 103
+ 18
+ 104
1
0
0
@@ -1641,8 +1662,8 @@
0
- 19
- 104
+ 18
+ 105
1
0
0
@@ -1653,8 +1674,8 @@
0
- 19
- 105
+ 18
+ 106
1
0
0
@@ -1665,8 +1686,8 @@
0
- 19
- 106
+ 18
+ 107
1
0
0
@@ -1677,8 +1698,8 @@
0
- 19
- 107
+ 18
+ 108
1
0
0
@@ -1689,8 +1710,8 @@
0
- 19
- 108
+ 18
+ 109
1
0
0
@@ -1701,8 +1722,8 @@
0
- 19
- 109
+ 18
+ 110
1
0
0
@@ -1713,8 +1734,8 @@
0
- 19
- 110
+ 18
+ 111
1
0
0
@@ -1725,8 +1746,8 @@
0
- 19
- 111
+ 18
+ 112
1
0
0
@@ -1745,8 +1766,8 @@
0
0
- 20
- 112
+ 19
+ 113
1
0
0
@@ -1757,8 +1778,8 @@
0
- 20
- 113
+ 19
+ 114
1
0
0
@@ -1769,8 +1790,8 @@
0
- 20
- 114
+ 19
+ 115
1
0
0
@@ -1781,8 +1802,8 @@
0
- 20
- 115
+ 19
+ 116
1
0
0
@@ -1793,8 +1814,8 @@
0
- 20
- 116
+ 19
+ 117
1
0
0
@@ -1805,8 +1826,8 @@
0
- 20
- 117
+ 19
+ 118
1
0
0
@@ -1817,8 +1838,8 @@
0
- 20
- 118
+ 19
+ 119
1
0
0
@@ -1829,8 +1850,8 @@
0
- 20
- 119
+ 19
+ 120
1
0
0
@@ -1849,8 +1870,8 @@
0
0
- 21
- 120
+ 20
+ 121
1
0
0
@@ -1861,8 +1882,8 @@
0
- 21
- 121
+ 20
+ 122
1
0
0
@@ -1881,8 +1902,8 @@
0
0
- 22
- 122
+ 21
+ 123
1
0
0
@@ -1893,8 +1914,8 @@
0
- 22
- 123
+ 21
+ 124
1
0
0
@@ -1905,8 +1926,8 @@
0
- 22
- 124
+ 21
+ 125
5
0
0
@@ -1925,8 +1946,8 @@
0
0
- 23
- 125
+ 22
+ 126
1
0
0
@@ -1937,8 +1958,8 @@
0
- 23
- 126
+ 22
+ 127
1
0
0
@@ -1949,8 +1970,8 @@
0
- 23
- 127
+ 22
+ 128
1
0
0
@@ -1961,8 +1982,8 @@
0
- 23
- 128
+ 22
+ 129
1
0
0
@@ -1973,8 +1994,8 @@
0
- 23
- 129
+ 22
+ 130
1
0
0
@@ -1987,43 +2008,59 @@
- tos_components
+ fs
0
0
0
0
- 24
- 130
- 1
- 0
- 0
- 0
- ..\..\..\..\components\fs\kv\tos_kv.c
- tos_kv.c
- 0
- 0
-
-
-
-
- nvds
- 0
- 0
- 0
- 0
-
- 25
+ 23
131
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\nvds\nvds.c
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv\ln_kv.c
+ ln_kv.c
+ 0
+ 0
+
+
+ 23
+ 132
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv_port\ln_kv_port.c
+ ln_kv_port.c
+ 0
+ 0
+
+
+ 23
+ 133
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\nvds\nvds.c
nvds.c
0
0
+
+ 23
+ 134
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\partition_mgr\flash_partition_mgr.c
+ flash_partition_mgr.c
+ 0
+ 0
+
@@ -2033,8 +2070,8 @@
0
0
- 26
- 132
+ 24
+ 135
1
0
0
@@ -2045,8 +2082,8 @@
0
- 26
- 133
+ 24
+ 136
1
0
0
@@ -2057,8 +2094,8 @@
0
- 26
- 134
+ 24
+ 137
1
0
0
@@ -2069,8 +2106,8 @@
0
- 26
- 135
+ 24
+ 138
1
0
0
@@ -2081,8 +2118,8 @@
0
- 26
- 136
+ 24
+ 139
1
0
0
@@ -2093,8 +2130,8 @@
0
- 26
- 137
+ 24
+ 140
1
0
0
@@ -2113,8 +2150,8 @@
0
0
- 27
- 138
+ 25
+ 141
1
0
0
@@ -2125,8 +2162,8 @@
0
- 27
- 139
+ 25
+ 142
1
0
0
@@ -2137,8 +2174,8 @@
0
- 27
- 140
+ 25
+ 143
1
0
0
@@ -2149,8 +2186,8 @@
0
- 27
- 141
+ 25
+ 144
1
0
0
@@ -2161,8 +2198,8 @@
0
- 27
- 142
+ 25
+ 145
1
0
0
@@ -2173,8 +2210,8 @@
0
- 27
- 143
+ 25
+ 146
1
0
0
@@ -2185,8 +2222,8 @@
0
- 27
- 144
+ 25
+ 147
1
0
0
@@ -2197,8 +2234,8 @@
0
- 27
- 145
+ 25
+ 148
1
0
0
@@ -2217,8 +2254,8 @@
0
0
- 28
- 146
+ 26
+ 149
1
0
0
@@ -2229,8 +2266,8 @@
0
- 28
- 147
+ 26
+ 150
1
0
0
@@ -2241,8 +2278,8 @@
0
- 28
- 148
+ 26
+ 151
1
0
0
@@ -2253,8 +2290,8 @@
0
- 28
- 149
+ 26
+ 152
1
0
0
@@ -2265,8 +2302,8 @@
0
- 28
- 150
+ 26
+ 153
1
0
0
@@ -2277,8 +2314,8 @@
0
- 28
- 151
+ 26
+ 154
1
0
0
@@ -2297,8 +2334,8 @@
0
0
- 29
- 152
+ 27
+ 155
1
0
0
@@ -2309,8 +2346,8 @@
0
- 29
- 153
+ 27
+ 156
1
0
0
@@ -2321,8 +2358,8 @@
0
- 29
- 154
+ 27
+ 157
1
0
0
@@ -2333,8 +2370,8 @@
0
- 29
- 155
+ 27
+ 158
1
0
0
@@ -2345,8 +2382,8 @@
0
- 29
- 156
+ 27
+ 159
1
0
0
@@ -2357,8 +2394,8 @@
0
- 29
- 157
+ 27
+ 160
1
0
0
@@ -2369,8 +2406,8 @@
0
- 29
- 158
+ 27
+ 161
1
0
0
@@ -2381,8 +2418,8 @@
0
- 29
- 159
+ 27
+ 162
1
0
0
@@ -2393,8 +2430,8 @@
0
- 29
- 160
+ 27
+ 163
1
0
0
@@ -2405,8 +2442,8 @@
0
- 29
- 161
+ 27
+ 164
1
0
0
@@ -2417,8 +2454,8 @@
0
- 29
- 162
+ 27
+ 165
1
0
0
@@ -2429,8 +2466,8 @@
0
- 29
- 163
+ 27
+ 166
1
0
0
@@ -2441,8 +2478,8 @@
0
- 29
- 164
+ 27
+ 167
1
0
0
@@ -2453,8 +2490,8 @@
0
- 29
- 165
+ 27
+ 168
1
0
0
@@ -2465,8 +2502,8 @@
0
- 29
- 166
+ 27
+ 169
1
0
0
@@ -2485,8 +2522,8 @@
0
0
- 30
- 167
+ 28
+ 170
1
0
0
@@ -2497,8 +2534,8 @@
0
- 30
- 168
+ 28
+ 171
1
0
0
@@ -2509,8 +2546,8 @@
0
- 30
- 169
+ 28
+ 172
1
0
0
@@ -2521,8 +2558,8 @@
0
- 30
- 170
+ 28
+ 173
1
0
0
@@ -2533,8 +2570,8 @@
0
- 30
- 171
+ 28
+ 174
1
0
0
@@ -2553,8 +2590,8 @@
0
0
- 31
- 172
+ 29
+ 175
1
0
0
@@ -2565,8 +2602,8 @@
0
- 31
- 173
+ 29
+ 176
1
0
0
@@ -2577,8 +2614,8 @@
0
- 31
- 174
+ 29
+ 177
1
0
0
@@ -2589,8 +2626,8 @@
0
- 31
- 175
+ 29
+ 178
1
0
0
@@ -2601,8 +2638,8 @@
0
- 31
- 176
+ 29
+ 179
1
0
0
@@ -2613,8 +2650,8 @@
0
- 31
- 177
+ 29
+ 180
1
0
0
@@ -2625,8 +2662,8 @@
0
- 31
- 178
+ 29
+ 181
1
0
0
@@ -2637,8 +2674,8 @@
0
- 31
- 179
+ 29
+ 182
1
0
0
@@ -2649,8 +2686,8 @@
0
- 31
- 180
+ 29
+ 183
1
0
0
@@ -2661,8 +2698,8 @@
0
- 31
- 181
+ 29
+ 184
1
0
0
@@ -2673,8 +2710,8 @@
0
- 31
- 182
+ 29
+ 185
1
0
0
@@ -2685,8 +2722,8 @@
0
- 31
- 183
+ 29
+ 186
1
0
0
@@ -2697,8 +2734,8 @@
0
- 31
- 184
+ 29
+ 187
1
0
0
@@ -2709,8 +2746,8 @@
0
- 31
- 185
+ 29
+ 188
1
0
0
@@ -2721,8 +2758,8 @@
0
- 31
- 186
+ 29
+ 189
1
0
0
@@ -2733,8 +2770,8 @@
0
- 31
- 187
+ 29
+ 190
1
0
0
@@ -2745,8 +2782,8 @@
0
- 31
- 188
+ 29
+ 191
1
0
0
@@ -2757,8 +2794,8 @@
0
- 31
- 189
+ 29
+ 192
1
0
0
@@ -2769,8 +2806,8 @@
0
- 31
- 190
+ 29
+ 193
1
0
0
@@ -2781,8 +2818,8 @@
0
- 31
- 191
+ 29
+ 194
1
0
0
@@ -2793,8 +2830,8 @@
0
- 31
- 192
+ 29
+ 195
1
0
0
@@ -2805,8 +2842,8 @@
0
- 31
- 193
+ 29
+ 196
1
0
0
@@ -2817,8 +2854,8 @@
0
- 31
- 194
+ 29
+ 197
1
0
0
@@ -2829,8 +2866,8 @@
0
- 31
- 195
+ 29
+ 198
1
0
0
@@ -2841,8 +2878,8 @@
0
- 31
- 196
+ 29
+ 199
1
0
0
@@ -2853,8 +2890,8 @@
0
- 31
- 197
+ 29
+ 200
1
0
0
@@ -2865,8 +2902,8 @@
0
- 31
- 198
+ 29
+ 201
1
0
0
@@ -2877,8 +2914,8 @@
0
- 31
- 199
+ 29
+ 202
1
0
0
@@ -2889,8 +2926,8 @@
0
- 31
- 200
+ 29
+ 203
1
0
0
@@ -2901,8 +2938,8 @@
0
- 31
- 201
+ 29
+ 204
1
0
0
@@ -2913,8 +2950,8 @@
0
- 31
- 202
+ 29
+ 205
1
0
0
@@ -2925,8 +2962,8 @@
0
- 31
- 203
+ 29
+ 206
1
0
0
@@ -2937,8 +2974,8 @@
0
- 31
- 204
+ 29
+ 207
1
0
0
@@ -2949,8 +2986,8 @@
0
- 31
- 205
+ 29
+ 208
1
0
0
@@ -2961,8 +2998,8 @@
0
- 31
- 206
+ 29
+ 209
1
0
0
@@ -2973,8 +3010,8 @@
0
- 31
- 207
+ 29
+ 210
1
0
0
@@ -2985,8 +3022,8 @@
0
- 31
- 208
+ 29
+ 211
1
0
0
@@ -2997,8 +3034,8 @@
0
- 31
- 209
+ 29
+ 212
1
0
0
@@ -3009,8 +3046,8 @@
0
- 31
- 210
+ 29
+ 213
1
0
0
@@ -3021,8 +3058,8 @@
0
- 31
- 211
+ 29
+ 214
1
0
0
@@ -3033,8 +3070,8 @@
0
- 31
- 212
+ 29
+ 215
1
0
0
@@ -3045,8 +3082,8 @@
0
- 31
- 213
+ 29
+ 216
1
0
0
@@ -3057,8 +3094,8 @@
0
- 31
- 214
+ 29
+ 217
1
0
0
@@ -3069,8 +3106,8 @@
0
- 31
- 215
+ 29
+ 218
1
0
0
@@ -3081,8 +3118,8 @@
0
- 31
- 216
+ 29
+ 219
1
0
0
@@ -3093,8 +3130,8 @@
0
- 31
- 217
+ 29
+ 220
1
0
0
@@ -3105,8 +3142,8 @@
0
- 31
- 218
+ 29
+ 221
1
0
0
@@ -3117,8 +3154,8 @@
0
- 31
- 219
+ 29
+ 222
1
0
0
@@ -3129,8 +3166,8 @@
0
- 31
- 220
+ 29
+ 223
1
0
0
@@ -3141,8 +3178,8 @@
0
- 31
- 221
+ 29
+ 224
1
0
0
@@ -3153,8 +3190,8 @@
0
- 31
- 222
+ 29
+ 225
1
0
0
@@ -3165,8 +3202,8 @@
0
- 31
- 223
+ 29
+ 226
1
0
0
@@ -3177,8 +3214,8 @@
0
- 31
- 224
+ 29
+ 227
1
0
0
@@ -3189,8 +3226,8 @@
0
- 31
- 225
+ 29
+ 228
1
0
0
@@ -3201,8 +3238,8 @@
0
- 31
- 226
+ 29
+ 229
1
0
0
@@ -3213,8 +3250,8 @@
0
- 31
- 227
+ 29
+ 230
1
0
0
@@ -3225,8 +3262,8 @@
0
- 31
- 228
+ 29
+ 231
1
0
0
@@ -3237,8 +3274,8 @@
0
- 31
- 229
+ 29
+ 232
1
0
0
@@ -3249,8 +3286,8 @@
0
- 31
- 230
+ 29
+ 233
1
0
0
@@ -3261,8 +3298,8 @@
0
- 31
- 231
+ 29
+ 234
1
0
0
@@ -3273,8 +3310,8 @@
0
- 31
- 232
+ 29
+ 235
1
0
0
@@ -3285,8 +3322,8 @@
0
- 31
- 233
+ 29
+ 236
1
0
0
@@ -3297,8 +3334,8 @@
0
- 31
- 234
+ 29
+ 237
1
0
0
@@ -3309,8 +3346,8 @@
0
- 31
- 235
+ 29
+ 238
1
0
0
@@ -3321,8 +3358,8 @@
0
- 31
- 236
+ 29
+ 239
1
0
0
@@ -3333,8 +3370,8 @@
0
- 31
- 237
+ 29
+ 240
1
0
0
@@ -3345,8 +3382,8 @@
0
- 31
- 238
+ 29
+ 241
1
0
0
@@ -3357,8 +3394,8 @@
0
- 31
- 239
+ 29
+ 242
1
0
0
@@ -3369,8 +3406,8 @@
0
- 31
- 240
+ 29
+ 243
1
0
0
@@ -3381,8 +3418,8 @@
0
- 31
- 241
+ 29
+ 244
1
0
0
@@ -3393,8 +3430,8 @@
0
- 31
- 242
+ 29
+ 245
1
0
0
@@ -3405,8 +3442,8 @@
0
- 31
- 243
+ 29
+ 246
1
0
0
@@ -3417,8 +3454,8 @@
0
- 31
- 244
+ 29
+ 247
1
0
0
@@ -3429,8 +3466,8 @@
0
- 31
- 245
+ 29
+ 248
1
0
0
@@ -3441,8 +3478,8 @@
0
- 31
- 246
+ 29
+ 249
1
0
0
@@ -3453,8 +3490,8 @@
0
- 31
- 247
+ 29
+ 250
1
0
0
@@ -3465,8 +3502,8 @@
0
- 31
- 248
+ 29
+ 251
1
0
0
@@ -3477,8 +3514,8 @@
0
- 31
- 249
+ 29
+ 252
1
0
0
@@ -3489,8 +3526,8 @@
0
- 31
- 250
+ 29
+ 253
1
0
0
@@ -3509,8 +3546,8 @@
0
0
- 32
- 251
+ 30
+ 254
1
0
0
@@ -3521,8 +3558,8 @@
0
- 32
- 252
+ 30
+ 255
1
0
0
@@ -3533,8 +3570,8 @@
0
- 32
- 253
+ 30
+ 256
1
0
0
diff --git a/board/EVB_LN882x/KEIL/qcloud_iot_explorer/TencentOS_tiny.uvprojx b/board/EVB_LN882x/KEIL/qcloud_iot_explorer/TencentOS_tiny.uvprojx
index fdee40ef..633711e8 100644
--- a/board/EVB_LN882x/KEIL/qcloud_iot_explorer/TencentOS_tiny.uvprojx
+++ b/board/EVB_LN882x/KEIL/qcloud_iot_explorer/TencentOS_tiny.uvprojx
@@ -70,9 +70,9 @@
0
- 0
+ 1
0
-
+ python ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\user_cmd\before_build.py flash_partition_cfg.json flash_partition_table.h
0
0
@@ -81,9 +81,9 @@
1
- 0
- .\after_build_ln882x.bat
-
+ 1
+ python ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\user_cmd\after_build_soc.py @L
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\bin\mkimage.exe cmd_app ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\boot_ln882x.bin @L.bin @L.asm flashimage.bin flash_partition_cfg.json ver=1.1
0
0
0
@@ -338,7 +338,7 @@
LN882x,ARM_MATH_CM4,MBEDTLS_CONFIG_FILE=<qcloud/tls_psk_config.h>
- ..\..\BSP\Inc;..\..\TOS-CONFIG;..\..\..\..\kernel\pm\include;..\..\..\..\kernel\core\include;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\..\..\osal\cmsis_os;..\..\..\..\examples\helloworld;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\driver_ln882x;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\ll\include;..\..\..\..\components\fs\kv\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\ln88xx;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\kernel;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\CMSIS_5.3.0;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\wifi_manager;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\net;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\port;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\port\arch;..\..\..\..\components\connectivity\qcloud-iot-explorer-sdk\3rdparty\include;..\..\..\..\components\connectivity\qcloud-iot-explorer-sdk\3rdparty\include\exports;..\..\..\..\components\connectivity\qcloud-iot-explorer-sdk\3rdparty\sdk_src\internal_inc;..\..\..\..\components\security\mbedtls\3rdparty\include;..\..\..\..\components\security\mbedtls\wrapper\include
+ ..\..\BSP\Inc;..\..\TOS-CONFIG;..\..\..\..\kernel\pm\include;..\..\..\..\kernel\core\include;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\..\..\osal\cmsis_os;..\..\..\..\examples\helloworld;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\driver_ln882x;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\ll\include;..\..\..\..\components\fs\kv\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\ln88xx;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\kernel;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\CMSIS_5.3.0;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\wifi_manager;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\net;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\port;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\port\arch;..\..\..\..\components\connectivity\qcloud-iot-explorer-sdk\3rdparty\include;..\..\..\..\components\connectivity\qcloud-iot-explorer-sdk\3rdparty\include\exports;..\..\..\..\components\connectivity\qcloud-iot-explorer-sdk\3rdparty\sdk_src\internal_inc;..\..\..\..\components\security\mbedtls\3rdparty\include;..\..\..\..\components\security\mbedtls\wrapper\include;..\qcloud_iot_explorer;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_port;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv_port;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\nvds;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\partition_mgr
@@ -369,10 +369,10 @@
0x08000000
0x20000000
- .\firmware_XIP_ln882x.sct
+ .\ln882x.sct
- --no_autoat --keep=main.o(no_init_data)
+ --no_autoat --keep=*.o(no_init_data)
@@ -429,16 +429,6 @@
-
- Drivers/Drv
-
-
- drv_adc_measure.c
- 1
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\drv\drv_adc_measure.c
-
-
-
Drivers/HAL
@@ -738,6 +728,16 @@
1
..\..\BSP\Src\mcu_init.c
+
+ serial_hw.c
+ 1
+ ..\..\BSP\Src\serial_hw.c
+
+
+ drv_adc_measure.c
+ 1
+ ..\..\BSP\Src\drv_adc_measure.c
+
@@ -748,11 +748,6 @@
1
..\..\..\..\platform\vendor_bsp\LN\ln882x\src\serial\serial.c
-
- serial_hw.c
- 1
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\serial\serial_hw.c
-
@@ -934,9 +929,9 @@
..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\wifi_mac.lib
- wifi_driver.lib
+ soc_driver.lib
4
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\wifi_driver.lib
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\soc_driver.lib
@@ -948,6 +943,11 @@
1
..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_manager\wifi_manager.c
+
+ wifi_port.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_port\wifi_port.c
+
@@ -1242,22 +1242,27 @@
- tos_components
+ fs
- tos_kv.c
+ ln_kv.c
1
- ..\..\..\..\components\fs\kv\tos_kv.c
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv\ln_kv.c
+
+
+ ln_kv_port.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv_port\ln_kv_port.c
-
-
-
- nvds
-
nvds.c
1
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\nvds\nvds.c
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\nvds\nvds.c
+
+
+ flash_partition_mgr.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\partition_mgr\flash_partition_mgr.c
diff --git a/board/EVB_LN882x/KEIL/qcloud_iot_explorer/after_build_ln882x.bat b/board/EVB_LN882x/KEIL/qcloud_iot_explorer/after_build_ln882x.bat
index cc2c0678..60675d37 100644
--- a/board/EVB_LN882x/KEIL/qcloud_iot_explorer/after_build_ln882x.bat
+++ b/board/EVB_LN882x/KEIL/qcloud_iot_explorer/after_build_ln882x.bat
@@ -1,8 +1,4 @@
-
-python ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\user_cmd\after_build_soc.py firmware_XIP
-
-..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\bin\mkimage.exe ln882x flashimage ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\boot_ram_ln882x.bin firmware_XIP.bin flashimage.bin release=1 crp_enable=0 app_version=10 hw_version=0
-
-..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\bin\fpu_patch.exe .\firmware_XIP.asm .\flashimage.bin
+python ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\user_cmd\after_build_soc.py @L
+..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\bin\mkimage.exe cmd_app ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\boot_ln882x.bin @L.bin @L.asm flashimage.bin flash_partition_cfg.json ver=1.1
diff --git a/board/EVB_LN882x/KEIL/qcloud_iot_explorer/flash_partition_cfg.json b/board/EVB_LN882x/KEIL/qcloud_iot_explorer/flash_partition_cfg.json
new file mode 100644
index 00000000..91fec537
--- /dev/null
+++ b/board/EVB_LN882x/KEIL/qcloud_iot_explorer/flash_partition_cfg.json
@@ -0,0 +1,22 @@
+{
+ "Warning1":"è¦å‘Šï¼Œç³»ç»Ÿå®šä¹‰ç”¨æˆ·ä¸å¯ä¿®æ”¹!!!",
+ "vendor_define":
+ [
+ {"partition_type": "BOOT", "start_addr": "0x00000000", "size_KB": 36 },
+ {"partition_type": "PART_TAB", "start_addr": "0x00009000", "size_KB": 4 }
+ ],
+
+
+ "Warning2":"以下数æ®,ç”¨æˆ·æ ¹æ®SOC flash容é‡ä»¥åŠå…·ä½“需求修改,仅å¯ä»¥ä¿®æ”¹start_addr值和size值,且必须4KB对é½!!!",
+ "user_define":
+ [
+ {"partition_type": "KV", "start_addr": "0x0000A000", "size_KB": 8 },
+ {"partition_type": "SIMU_EEPROM", "start_addr": "0x0000C000", "size_KB": 8 },
+ {"partition_type": "APP", "start_addr": "0x0000E000", "size_KB": 800 },
+ {"partition_type": "OTA", "start_addr": "0x000D6000", "size_KB": 800 },
+ {"partition_type": "NVDS", "start_addr": "0x0019E000", "size_KB": 12 },
+ {"partition_type": "USER", "start_addr": "0x001A1000", "size_KB": 12 }
+ ]
+}
+
+
diff --git a/board/EVB_LN882x/KEIL/qcloud_iot_explorer/flash_partition_table.h b/board/EVB_LN882x/KEIL/qcloud_iot_explorer/flash_partition_table.h
index e068e5bf..08788e3c 100644
--- a/board/EVB_LN882x/KEIL/qcloud_iot_explorer/flash_partition_table.h
+++ b/board/EVB_LN882x/KEIL/qcloud_iot_explorer/flash_partition_table.h
@@ -1,32 +1,56 @@
-#ifndef __FLASH_PARTITION_TABLE_H__
-#define __FLASH_PARTITION_TABLE_H__
+#ifndef __FLASH_PARTITION_TABLE__
+#define __FLASH_PARTITION_TABLE__
-//#define RETENTION_MEM_BASE 0x20028000
-//#define RETENTION_MEM_SIZE 0x2000
-#ifndef FLASH_BASE
-#define FLASH_BASE (0x10000000)
+//flash partition map,it's generated by the script based on the json file
+
+#define BOOT_SPACE_OFFSET (0x00000000)
+#define BOOT_SPACE_SIZE (1024*36)
+
+#define PART_TAB_SPACE_OFFSET (0x00009000)
+#define PART_TAB_SPACE_SIZE (1024*4)
+#if (PART_TAB_SPACE_OFFSET < (BOOT_SPACE_OFFSET + BOOT_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
#endif
-#ifndef FLASH_SIZE
-#define FLASH_SIZE (0x00200000)
+#define KV_SPACE_OFFSET (0x0000A000)
+#define KV_SPACE_SIZE (1024*8)
+#if (KV_SPACE_OFFSET < (PART_TAB_SPACE_OFFSET + PART_TAB_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
#endif
-#ifndef PRIMARY_PARTITION_OFFSET
-#define PRIMARY_PARTITION_OFFSET (0x0000F000)
+#define SIMU_EEPROM_SPACE_OFFSET (0x0000C000)
+#define SIMU_EEPROM_SPACE_SIZE (1024*8)
+#if (SIMU_EEPROM_SPACE_OFFSET < (KV_SPACE_OFFSET + KV_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
#endif
-#define PRIMARY_PATTITION_START 0x0000F000
-#define PRIMARY_PATTITION_SIZE 0xE1000
-//#define USERAPP_SRAM_BASE 0x1FFF0000
-#define BACKUP_PATTITION_START 0x000F0000
-#define BACKUP_PATTITION_SIZE 0xE1000
-#define USERDATA_PATTITION_START 0x001D1000
-#define USERDATA_PATTITION_SIZE 0x23000
-
-//memory offset check
-#if ((PRIMARY_PATTITION_START < PRIMARY_PARTITION_OFFSET) || (BACKUP_PATTITION_START < PRIMARY_PATTITION_START) || (USERDATA_PATTITION_START < BACKUP_PATTITION_START) || (PRIMARY_PATTITION_START + PRIMARY_PATTITION_SIZE > BACKUP_PATTITION_START) || (BACKUP_PATTITION_START + BACKUP_PATTITION_SIZE > USERDATA_PATTITION_START) || (USERDATA_PATTITION_START + USERDATA_PATTITION_SIZE > FLASH_SIZE))
- #error "flash partition define error!"
+#define APP_SPACE_OFFSET (0x0000E000)
+#define APP_SPACE_SIZE (1024*800)
+#if (APP_SPACE_OFFSET < (SIMU_EEPROM_SPACE_OFFSET + SIMU_EEPROM_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
#endif
-#endif /* __FLASH_PARTITION_TABLE_H__ */
+#define OTA_SPACE_OFFSET (0x000D6000)
+#define OTA_SPACE_SIZE (1024*800)
+#if (OTA_SPACE_OFFSET < (APP_SPACE_OFFSET + APP_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
+#endif
+
+#define NVDS_SPACE_OFFSET (0x0019E000)
+#define NVDS_SPACE_SIZE (1024*12)
+#if (NVDS_SPACE_OFFSET < (OTA_SPACE_OFFSET + OTA_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
+#endif
+
+#define USER_SPACE_OFFSET (0x001A1000)
+#define USER_SPACE_SIZE (1024*12)
+#if (USER_SPACE_OFFSET < (NVDS_SPACE_OFFSET + NVDS_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
+#endif
+
+
+#define IMAGE_HEADER_SIZE (0x100)
+
+#endif /* __FLASH_PARTITION_TABLE__ */
+
diff --git a/board/EVB_LN882x/KEIL/qcloud_iot_explorer/firmware_XIP_ln882x.sct b/board/EVB_LN882x/KEIL/qcloud_iot_explorer/ln882x.sct
similarity index 59%
rename from board/EVB_LN882x/KEIL/qcloud_iot_explorer/firmware_XIP_ln882x.sct
rename to board/EVB_LN882x/KEIL/qcloud_iot_explorer/ln882x.sct
index 50c5ed54..26dc840b 100644
--- a/board/EVB_LN882x/KEIL/qcloud_iot_explorer/firmware_XIP_ln882x.sct
+++ b/board/EVB_LN882x/KEIL/qcloud_iot_explorer/ln882x.sct
@@ -1,9 +1,9 @@
#! armcc -E
-#include ".\flash_partition_table.h"
+#include "flash_partition_table.h"
#include ".\..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\ln88xx\mem_map_ln882x.h"
-LR_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET PRIMARY_PATTITION_SIZE
+LR_FLASH CACHE_FLASH_BASE+APP_SPACE_OFFSET+IMAGE_HEADER_SIZE APP_SPACE_SIZE
{; load region size_region
ISR_VECTOR RAM_BASE ALIGN 0x100
@@ -11,7 +11,7 @@ LR_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET PRIMARY_PATTITION_SIZE
startup_*.o (RESET, +First)
}
- ER_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET + ImageLength(ISR_VECTOR) PRIMARY_PATTITION_SIZE
+ ER_FLASH CACHE_FLASH_BASE+APP_SPACE_OFFSET+IMAGE_HEADER_SIZE + ImageLength(ISR_VECTOR) APP_SPACE_SIZE
{; load address = execution address
*(InRoot$$Sections)
.ANY (+RO)
@@ -24,15 +24,15 @@ LR_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET PRIMARY_PATTITION_SIZE
ll_cache.o(+RO)
ll_dma.o(+RO)
ll_syscon.o(+RO)
- ll_sleep.o(+RO)
- ll_rtc.o(+RO)
+ ;ll_sleep.o(+RO)
+ ;ll_rtc.o(+RO)
cache.o(+RO)
qspi.o(+RO)
flash.o(+RO)
hal_dma.o(+RO)
hal_syscon.o(+RO)
- hal_sleep.o(+RO)
- hal_rtc.o(+RO)
+ ;hal_sleep.o(+RO)
+ ;hal_rtc.o(+RO)
;port.o(XIR)
;optional item
@@ -49,16 +49,32 @@ LR_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET PRIMARY_PATTITION_SIZE
startup_ln*(+RW +ZI)
}
- ER_DATA +0
+ ER_DATA_IN_B0 +0 RAM_BLOCK0_SIZE-ImageLength(ISR_VECTOR)-ImageLength(ER_CODE)-ImageLength(ER_STACK)
{
- *(.ARM.__at_0x1FFFFFFC)
- .ANY (+RW +ZI)
+ memp.o(+RW +ZI)
+ imem.o(+RW +ZI)
+ imem_if.o(+RW +ZI)
+ ;cglobals_sta.o(+RW +ZI)
+ ;event_manager.o(+RW +ZI)
+ iconfig.o(+RW +ZI)
+ common.o(+RW +ZI)
+ }
+
+ HEAP_SPACE0 +0 EMPTY RAM_BLOCK1_BASE-ImageLimit(ER_DATA_IN_B0)
+ {; Heap region
+ }
+
+ ER_DATA_IN_B1 RAM_BLOCK1_BASE RAM_BLOCK1_SIZE
+ {
+ *(wlan_mem_pkt)
+ *(wlan_mem_dscr)
+ .ANY (+RW +ZI)
}
;IQ Data area cannot be used by ER_DATA region
;ScatterAssert(ImageLimit(ER_DATA) < (0x20020300))
- HEAP_SPACE +0 EMPTY RETENTION_MEM_BASE-ImageLimit(ER_DATA)
+ HEAP_SPACE1 +0 EMPTY RETENTION_MEM_BASE-ImageLimit(ER_DATA_IN_B1)
{; Heap region
}
diff --git a/board/EVB_LN882x/KEIL/wifi_demo/.gitignore b/board/EVB_LN882x/KEIL/wifi_demo/.gitignore
new file mode 100644
index 00000000..31d89ac4
--- /dev/null
+++ b/board/EVB_LN882x/KEIL/wifi_demo/.gitignore
@@ -0,0 +1,6 @@
+/Listings/
+/Objects/
+*.uvguix.*
+JLinkLog.txt
+*.bin
+*.asm
\ No newline at end of file
diff --git a/board/EVB_LN882x/KEIL/wifi_demo/TencentOS_tiny.uvoptx b/board/EVB_LN882x/KEIL/wifi_demo/TencentOS_tiny.uvoptx
index b56d87ad..553013ed 100644
--- a/board/EVB_LN882x/KEIL/wifi_demo/TencentOS_tiny.uvoptx
+++ b/board/EVB_LN882x/KEIL/wifi_demo/TencentOS_tiny.uvoptx
@@ -114,11 +114,6 @@
Segger\JL2CM3.dll
-
- 0
- DLGUARM
-
-
0
ARMRTXEVENTFLAGS
@@ -150,7 +145,24 @@
-U-O142 -O2254 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:STM32F103VE$Flash\STM32F10x_512.FLM)
-
+
+
+ 0
+ 0
+ 50
+ 1
+ 268506362
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\kernel\TencentOS_Adapter\TencentOS_mutex.c
+
+ \\firmware_XIP\../../../../platform/vendor_bsp/LN/ln882x/src/kernel/TencentOS_Adapter/TencentOS_mutex.c\50
+
+
0
@@ -340,7 +352,7 @@
- Drivers/Drv
+ Drivers/HAL
0
0
0
@@ -352,34 +364,14 @@
0
0
0
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\drv\drv_adc_measure.c
- drv_adc_measure.c
- 0
- 0
-
-
-
-
- Drivers/HAL
- 0
- 0
- 0
- 0
-
- 5
- 8
- 1
- 0
- 0
- 0
..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\hal\hal_common.c
hal_common.c
0
0
- 5
- 9
+ 4
+ 8
1
0
0
@@ -390,8 +382,8 @@
0
- 5
- 10
+ 4
+ 9
1
0
0
@@ -402,8 +394,8 @@
0
- 5
- 11
+ 4
+ 10
1
0
0
@@ -414,8 +406,8 @@
0
- 5
- 12
+ 4
+ 11
1
0
0
@@ -426,8 +418,8 @@
0
- 5
- 13
+ 4
+ 12
1
0
0
@@ -438,8 +430,8 @@
0
- 5
- 14
+ 4
+ 13
1
0
0
@@ -450,8 +442,8 @@
0
- 5
- 15
+ 4
+ 14
1
0
0
@@ -462,8 +454,8 @@
0
- 5
- 16
+ 4
+ 15
1
0
0
@@ -474,8 +466,8 @@
0
- 5
- 17
+ 4
+ 16
1
0
0
@@ -486,8 +478,8 @@
0
- 5
- 18
+ 4
+ 17
1
0
0
@@ -498,8 +490,8 @@
0
- 5
- 19
+ 4
+ 18
1
0
0
@@ -510,8 +502,8 @@
0
- 5
- 20
+ 4
+ 19
1
0
0
@@ -530,8 +522,8 @@
0
0
- 6
- 21
+ 5
+ 20
1
0
0
@@ -542,8 +534,8 @@
0
- 6
- 22
+ 5
+ 21
1
0
0
@@ -554,8 +546,8 @@
0
- 6
- 23
+ 5
+ 22
1
0
0
@@ -566,8 +558,8 @@
0
- 6
- 24
+ 5
+ 23
1
0
0
@@ -578,8 +570,8 @@
0
- 6
- 25
+ 5
+ 24
1
0
0
@@ -590,8 +582,8 @@
0
- 6
- 26
+ 5
+ 25
1
0
0
@@ -602,8 +594,8 @@
0
- 6
- 27
+ 5
+ 26
1
0
0
@@ -614,8 +606,8 @@
0
- 6
- 28
+ 5
+ 27
1
0
0
@@ -626,8 +618,8 @@
0
- 6
- 29
+ 5
+ 28
1
0
0
@@ -638,8 +630,8 @@
0
- 6
- 30
+ 5
+ 29
1
0
0
@@ -650,8 +642,8 @@
0
- 6
- 31
+ 5
+ 30
1
0
0
@@ -662,8 +654,8 @@
0
- 6
- 32
+ 5
+ 31
1
0
0
@@ -674,8 +666,8 @@
0
- 6
- 33
+ 5
+ 32
1
0
0
@@ -686,8 +678,8 @@
0
- 6
- 34
+ 5
+ 33
1
0
0
@@ -698,8 +690,8 @@
0
- 6
- 35
+ 5
+ 34
1
0
0
@@ -710,8 +702,8 @@
0
- 6
- 36
+ 5
+ 35
1
0
0
@@ -722,8 +714,8 @@
0
- 6
- 37
+ 5
+ 36
1
0
0
@@ -734,8 +726,8 @@
0
- 6
- 38
+ 5
+ 37
1
0
0
@@ -746,8 +738,8 @@
0
- 6
- 39
+ 5
+ 38
1
0
0
@@ -758,8 +750,8 @@
0
- 6
- 40
+ 5
+ 39
1
0
0
@@ -770,8 +762,8 @@
0
- 6
- 41
+ 5
+ 40
1
0
0
@@ -782,8 +774,8 @@
0
- 6
- 42
+ 5
+ 41
1
0
0
@@ -794,8 +786,8 @@
0
- 6
- 43
+ 5
+ 42
1
0
0
@@ -806,8 +798,8 @@
0
- 6
- 44
+ 5
+ 43
1
0
0
@@ -826,8 +818,8 @@
0
0
- 7
- 45
+ 6
+ 44
1
0
0
@@ -838,8 +830,8 @@
0
- 7
- 46
+ 6
+ 45
2
0
0
@@ -850,8 +842,8 @@
0
- 7
- 47
+ 6
+ 46
1
0
0
@@ -863,6 +855,26 @@
+
+ cmsis
+ 0
+ 0
+ 0
+ 0
+
+ 7
+ 47
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\osal\cmsis_os\cmsis_os.c
+ cmsis_os.c
+ 0
+ 0
+
+
+
config
0
@@ -896,7 +908,7 @@
- cmsis
+ bsp
0
0
0
@@ -908,28 +920,32 @@
0
0
0
- ..\..\..\..\osal\cmsis_os\cmsis_os.c
- cmsis_os.c
+ ..\..\BSP\Src\mcu_init.c
+ mcu_init.c
0
0
-
-
-
- bsp
- 0
- 0
- 0
- 0
- 10
+ 9
51
1
0
0
0
- ..\..\BSP\Src\mcu_init.c
- mcu_init.c
+ ..\..\BSP\Src\serial_hw.c
+ serial_hw.c
+ 0
+ 0
+
+
+ 9
+ 52
+ 1
+ 0
+ 0
+ 0
+ ..\..\BSP\Src\drv_adc_measure.c
+ drv_adc_measure.c
0
0
@@ -942,8 +958,8 @@
0
0
- 11
- 52
+ 10
+ 53
1
0
0
@@ -953,18 +969,6 @@
0
0
-
- 11
- 53
- 1
- 0
- 0
- 0
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\serial\serial_hw.c
- serial_hw.c
- 0
- 0
-
@@ -974,7 +978,7 @@
0
0
- 12
+ 11
54
1
0
@@ -994,7 +998,7 @@
0
0
- 13
+ 12
55
1
0
@@ -1006,7 +1010,7 @@
0
- 13
+ 12
56
1
0
@@ -1018,7 +1022,7 @@
0
- 13
+ 12
57
1
0
@@ -1030,7 +1034,7 @@
0
- 13
+ 12
58
1
0
@@ -1042,7 +1046,7 @@
0
- 13
+ 12
59
1
0
@@ -1054,7 +1058,7 @@
0
- 13
+ 12
60
1
0
@@ -1074,7 +1078,7 @@
0
0
- 14
+ 13
61
1
0
@@ -1086,7 +1090,7 @@
0
- 14
+ 13
62
1
0
@@ -1098,7 +1102,7 @@
0
- 14
+ 13
63
1
0
@@ -1110,7 +1114,7 @@
0
- 14
+ 13
64
1
0
@@ -1122,7 +1126,7 @@
0
- 14
+ 13
65
1
0
@@ -1134,7 +1138,7 @@
0
- 14
+ 13
66
1
0
@@ -1146,7 +1150,7 @@
0
- 14
+ 13
67
1
0
@@ -1158,7 +1162,7 @@
0
- 14
+ 13
68
1
0
@@ -1170,7 +1174,7 @@
0
- 14
+ 13
69
1
0
@@ -1182,7 +1186,7 @@
0
- 14
+ 13
70
1
0
@@ -1194,7 +1198,7 @@
0
- 14
+ 13
71
1
0
@@ -1206,7 +1210,7 @@
0
- 14
+ 13
72
1
0
@@ -1218,7 +1222,7 @@
0
- 14
+ 13
73
1
0
@@ -1238,7 +1242,7 @@
0
0
- 15
+ 14
74
5
0
@@ -1258,7 +1262,7 @@
0
0
- 16
+ 15
75
1
0
@@ -1270,7 +1274,7 @@
0
- 16
+ 15
76
1
0
@@ -1282,7 +1286,7 @@
0
- 16
+ 15
77
1
0
@@ -1294,7 +1298,7 @@
0
- 16
+ 15
78
1
0
@@ -1306,7 +1310,7 @@
0
- 16
+ 15
79
1
0
@@ -1318,7 +1322,7 @@
0
- 16
+ 15
80
1
0
@@ -1330,7 +1334,7 @@
0
- 16
+ 15
81
1
0
@@ -1350,7 +1354,7 @@
0
0
- 17
+ 16
82
4
0
@@ -1362,29 +1366,29 @@
0
- 17
+ 16
83
4
0
0
0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\soc_driver.lib
+ soc_driver.lib
+ 0
+ 0
+
+
+ 16
+ 84
+ 4
+ 0
+ 0
+ 0
..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\wifi_mac.lib
wifi_mac.lib
0
0
-
- 17
- 84
- 4
- 0
- 0
- 0
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\wifi_driver.lib
- wifi_driver.lib
- 0
- 0
-
@@ -1394,7 +1398,7 @@
0
0
- 18
+ 17
85
1
0
@@ -1405,6 +1409,18 @@
0
0
+
+ 17
+ 86
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_port\wifi_port.c
+ wifi_port.c
+ 0
+ 0
+
@@ -1414,8 +1430,8 @@
0
0
- 19
- 86
+ 18
+ 87
1
0
0
@@ -1426,8 +1442,8 @@
0
- 19
- 87
+ 18
+ 88
1
0
0
@@ -1438,8 +1454,8 @@
0
- 19
- 88
+ 18
+ 89
1
0
0
@@ -1450,8 +1466,8 @@
0
- 19
- 89
+ 18
+ 90
1
0
0
@@ -1462,8 +1478,8 @@
0
- 19
- 90
+ 18
+ 91
1
0
0
@@ -1474,8 +1490,8 @@
0
- 19
- 91
+ 18
+ 92
1
0
0
@@ -1486,8 +1502,8 @@
0
- 19
- 92
+ 18
+ 93
1
0
0
@@ -1498,8 +1514,8 @@
0
- 19
- 93
+ 18
+ 94
1
0
0
@@ -1510,8 +1526,8 @@
0
- 19
- 94
+ 18
+ 95
1
0
0
@@ -1522,8 +1538,8 @@
0
- 19
- 95
+ 18
+ 96
1
0
0
@@ -1534,8 +1550,8 @@
0
- 19
- 96
+ 18
+ 97
1
0
0
@@ -1546,8 +1562,8 @@
0
- 19
- 97
+ 18
+ 98
1
0
0
@@ -1558,8 +1574,8 @@
0
- 19
- 98
+ 18
+ 99
1
0
0
@@ -1570,8 +1586,8 @@
0
- 19
- 99
+ 18
+ 100
1
0
0
@@ -1582,8 +1598,8 @@
0
- 19
- 100
+ 18
+ 101
1
0
0
@@ -1594,8 +1610,8 @@
0
- 19
- 101
+ 18
+ 102
1
0
0
@@ -1606,8 +1622,8 @@
0
- 19
- 102
+ 18
+ 103
1
0
0
@@ -1618,8 +1634,8 @@
0
- 19
- 103
+ 18
+ 104
1
0
0
@@ -1630,8 +1646,8 @@
0
- 19
- 104
+ 18
+ 105
1
0
0
@@ -1642,8 +1658,8 @@
0
- 19
- 105
+ 18
+ 106
1
0
0
@@ -1654,8 +1670,8 @@
0
- 19
- 106
+ 18
+ 107
1
0
0
@@ -1666,8 +1682,8 @@
0
- 19
- 107
+ 18
+ 108
1
0
0
@@ -1678,8 +1694,8 @@
0
- 19
- 108
+ 18
+ 109
1
0
0
@@ -1690,8 +1706,8 @@
0
- 19
- 109
+ 18
+ 110
1
0
0
@@ -1702,8 +1718,8 @@
0
- 19
- 110
+ 18
+ 111
1
0
0
@@ -1722,8 +1738,8 @@
0
0
- 20
- 111
+ 19
+ 112
1
0
0
@@ -1734,8 +1750,8 @@
0
- 20
- 112
+ 19
+ 113
1
0
0
@@ -1746,8 +1762,8 @@
0
- 20
- 113
+ 19
+ 114
1
0
0
@@ -1758,8 +1774,8 @@
0
- 20
- 114
+ 19
+ 115
1
0
0
@@ -1770,8 +1786,8 @@
0
- 20
- 115
+ 19
+ 116
1
0
0
@@ -1782,8 +1798,8 @@
0
- 20
- 116
+ 19
+ 117
1
0
0
@@ -1794,8 +1810,8 @@
0
- 20
- 117
+ 19
+ 118
1
0
0
@@ -1806,8 +1822,8 @@
0
- 20
- 118
+ 19
+ 119
1
0
0
@@ -1826,8 +1842,8 @@
0
0
- 21
- 119
+ 20
+ 120
1
0
0
@@ -1838,8 +1854,8 @@
0
- 21
- 120
+ 20
+ 121
1
0
0
@@ -1858,8 +1874,8 @@
0
0
- 22
- 121
+ 21
+ 122
1
0
0
@@ -1870,8 +1886,8 @@
0
- 22
- 122
+ 21
+ 123
1
0
0
@@ -1882,8 +1898,8 @@
0
- 22
- 123
+ 21
+ 124
5
0
0
@@ -1902,8 +1918,8 @@
0
0
- 23
- 124
+ 22
+ 125
1
0
0
@@ -1914,8 +1930,8 @@
0
- 23
- 125
+ 22
+ 126
1
0
0
@@ -1926,8 +1942,8 @@
0
- 23
- 126
+ 22
+ 127
1
0
0
@@ -1938,8 +1954,8 @@
0
- 23
- 127
+ 22
+ 128
1
0
0
@@ -1950,8 +1966,8 @@
0
- 23
- 128
+ 22
+ 129
1
0
0
@@ -1964,43 +1980,59 @@
- tos_components
+ fs
0
0
0
0
- 24
- 129
- 1
- 0
- 0
- 0
- ..\..\..\..\components\fs\kv\tos_kv.c
- tos_kv.c
- 0
- 0
-
-
-
-
- nvds
- 0
- 0
- 0
- 0
-
- 25
+ 23
130
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\nvds\nvds.c
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\nvds\nvds.c
nvds.c
0
0
+
+ 23
+ 131
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\partition_mgr\flash_partition_mgr.c
+ flash_partition_mgr.c
+ 0
+ 0
+
+
+ 23
+ 132
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv\ln_kv.c
+ ln_kv.c
+ 0
+ 0
+
+
+ 23
+ 133
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv_port\ln_kv_port.c
+ ln_kv_port.c
+ 0
+ 0
+
diff --git a/board/EVB_LN882x/KEIL/wifi_demo/TencentOS_tiny.uvprojx b/board/EVB_LN882x/KEIL/wifi_demo/TencentOS_tiny.uvprojx
index df6822f6..273f27bd 100644
--- a/board/EVB_LN882x/KEIL/wifi_demo/TencentOS_tiny.uvprojx
+++ b/board/EVB_LN882x/KEIL/wifi_demo/TencentOS_tiny.uvprojx
@@ -69,9 +69,9 @@
0
- 0
+ 1
0
-
+ python ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\user_cmd\before_build.py flash_partition_cfg.json flash_partition_table.h
0
0
@@ -80,9 +80,9 @@
1
- 0
- .\after_build_ln882x.bat
-
+ 1
+ python ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\user_cmd\after_build_soc.py @L
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\bin\mkimage.exe cmd_app ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\boot_ln882x.bin @L.bin @L.asm flashimage.bin flash_partition_cfg.json ver=1.1
0
0
0
@@ -332,7 +332,7 @@
LN882x,ARM_MATH_CM4
- ..\..\BSP\Inc;..\..\TOS-CONFIG;..\..\..\..\kernel\pm\include;..\..\..\..\kernel\core\include;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\..\..\osal\cmsis_os;..\..\..\..\examples\helloworld;..\hello_world;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\driver_ln882x;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\ll\include;..\..\..\..\components\fs\kv\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\ln88xx;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\kernel;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\CMSIS_5.3.0;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\wifi_manager;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\net;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\port;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\port\arch;..\..\..\..\examples\wifi_ln882x
+ ..\..\BSP\Inc;..\..\TOS-CONFIG;..\..\..\..\kernel\pm\include;..\..\..\..\kernel\core\include;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\..\..\osal\cmsis_os;..\..\..\..\examples\helloworld;..\hello_world;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\driver_ln882x;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\ll\include;..\..\..\..\components\fs\kv\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\ln88xx;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\kernel;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\CMSIS_5.3.0;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\wifi_manager;..\..\..\..\platform\vendor_bsp\LN\ln882x\include\net;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\port;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\net\lwip-2.0.3\src\port\arch;..\..\..\..\examples\wifi_ln882x;..\wifi_demo;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv_port;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\nvds;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\partition_mgr;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\ll\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\include;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Common;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Controller\AP;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Controller\AP-STA;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Controller\ModeIF;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Controller\STA;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Controller\STA\ProtIF;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\AP-STA;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\AP-STA\M802_11e;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\AP-STA\M802_11i;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\AP-STA\M802_11n;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\AP-STA\ProtIF;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\AP-STA\M802_11e;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\AP;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\AP\M802_11e;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\AP\M802_11i;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\AP\M802_11n;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\AP\M802_1x;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\AP\ProtIF;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\STA;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\STA\M802_11e;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\STA\M802_11i;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\STA\M802_11n;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\STA\M802_1x;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\STA\ProtIF;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Core\ModeIF;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Edge\Host;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Edge\IF;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Edge\MACHW;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Edge\RF\ART2000;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Edge\PHY\PHYHW\LN;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Edge\PHY\PHYProt\P802_11n;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Edge\TEMP_CAL;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Edge\RF_HW;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Edge\RF_IMG_CAL\hw_img_cal;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Edge\RF_IMG_CAL\image_cal;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\CSL;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Test\MacSwTest;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Utils\MM;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_mac\Utils\QM;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_port;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_if;..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_cfg\include
@@ -362,10 +362,10 @@
0x08000000
0x20000000
- .\firmware_XIP_ln882x.sct
+ .\ln882x.sct
- --no_autoat --keep=main.o(no_init_data)
+ --no_autoat --keep=*.o(no_init_data)
@@ -417,16 +417,6 @@
-
- Drivers/Drv
-
-
- drv_adc_measure.c
- 1
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\driver_ln882x\drv\drv_adc_measure.c
-
-
-
Drivers/HAL
@@ -689,6 +679,16 @@
+
+ cmsis
+
+
+ cmsis_os.c
+ 1
+ ..\..\..\..\osal\cmsis_os\cmsis_os.c
+
+
+
config
@@ -704,16 +704,6 @@
-
- cmsis
-
-
- cmsis_os.c
- 1
- ..\..\..\..\osal\cmsis_os\cmsis_os.c
-
-
-
bsp
@@ -722,6 +712,16 @@
1
..\..\BSP\Src\mcu_init.c
+
+ serial_hw.c
+ 1
+ ..\..\BSP\Src\serial_hw.c
+
+
+ drv_adc_measure.c
+ 1
+ ..\..\BSP\Src\drv_adc_measure.c
+
@@ -732,11 +732,6 @@
1
..\..\..\..\platform\vendor_bsp\LN\ln882x\src\serial\serial.c
-
- serial_hw.c
- 1
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\serial\serial_hw.c
-
@@ -912,16 +907,16 @@
4
..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\arm_cortexM4lf_math.lib
+
+ soc_driver.lib
+ 4
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\soc_driver.lib
+
wifi_mac.lib
4
..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\wifi_mac.lib
-
- wifi_driver.lib
- 4
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\wifi_driver.lib
-
@@ -932,6 +927,11 @@
1
..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_manager\wifi_manager.c
+
+ wifi_port.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\wifi\wifi_port\wifi_port.c
+
@@ -1222,22 +1222,27 @@
- tos_components
-
-
- tos_kv.c
- 1
- ..\..\..\..\components\fs\kv\tos_kv.c
-
-
-
-
- nvds
+ fs
nvds.c
1
- ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\nvds\nvds.c
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\nvds\nvds.c
+
+
+ flash_partition_mgr.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\partition_mgr\flash_partition_mgr.c
+
+
+ ln_kv.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv\ln_kv.c
+
+
+ ln_kv_port.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\LN\ln882x\src\fs\kv\kv_port\ln_kv_port.c
diff --git a/board/EVB_LN882x/KEIL/wifi_demo/after_build_ln882x.bat b/board/EVB_LN882x/KEIL/wifi_demo/after_build_ln882x.bat
index cc2c0678..60675d37 100644
--- a/board/EVB_LN882x/KEIL/wifi_demo/after_build_ln882x.bat
+++ b/board/EVB_LN882x/KEIL/wifi_demo/after_build_ln882x.bat
@@ -1,8 +1,4 @@
-
-python ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\user_cmd\after_build_soc.py firmware_XIP
-
-..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\bin\mkimage.exe ln882x flashimage ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\boot_ram_ln882x.bin firmware_XIP.bin flashimage.bin release=1 crp_enable=0 app_version=10 hw_version=0
-
-..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\bin\fpu_patch.exe .\firmware_XIP.asm .\flashimage.bin
+python ..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\user_cmd\after_build_soc.py @L
+..\..\..\..\platform\vendor_bsp\LN\ln882x\tools\bin\mkimage.exe cmd_app ..\..\..\..\platform\vendor_bsp\LN\ln882x\lib\boot_ln882x.bin @L.bin @L.asm flashimage.bin flash_partition_cfg.json ver=1.1
diff --git a/board/EVB_LN882x/KEIL/wifi_demo/flash_partition_cfg.json b/board/EVB_LN882x/KEIL/wifi_demo/flash_partition_cfg.json
new file mode 100644
index 00000000..91fec537
--- /dev/null
+++ b/board/EVB_LN882x/KEIL/wifi_demo/flash_partition_cfg.json
@@ -0,0 +1,22 @@
+{
+ "Warning1":"è¦å‘Šï¼Œç³»ç»Ÿå®šä¹‰ç”¨æˆ·ä¸å¯ä¿®æ”¹!!!",
+ "vendor_define":
+ [
+ {"partition_type": "BOOT", "start_addr": "0x00000000", "size_KB": 36 },
+ {"partition_type": "PART_TAB", "start_addr": "0x00009000", "size_KB": 4 }
+ ],
+
+
+ "Warning2":"以下数æ®,ç”¨æˆ·æ ¹æ®SOC flash容é‡ä»¥åŠå…·ä½“需求修改,仅å¯ä»¥ä¿®æ”¹start_addr值和size值,且必须4KB对é½!!!",
+ "user_define":
+ [
+ {"partition_type": "KV", "start_addr": "0x0000A000", "size_KB": 8 },
+ {"partition_type": "SIMU_EEPROM", "start_addr": "0x0000C000", "size_KB": 8 },
+ {"partition_type": "APP", "start_addr": "0x0000E000", "size_KB": 800 },
+ {"partition_type": "OTA", "start_addr": "0x000D6000", "size_KB": 800 },
+ {"partition_type": "NVDS", "start_addr": "0x0019E000", "size_KB": 12 },
+ {"partition_type": "USER", "start_addr": "0x001A1000", "size_KB": 12 }
+ ]
+}
+
+
diff --git a/board/EVB_LN882x/KEIL/wifi_demo/flash_partition_table.h b/board/EVB_LN882x/KEIL/wifi_demo/flash_partition_table.h
index e068e5bf..08788e3c 100644
--- a/board/EVB_LN882x/KEIL/wifi_demo/flash_partition_table.h
+++ b/board/EVB_LN882x/KEIL/wifi_demo/flash_partition_table.h
@@ -1,32 +1,56 @@
-#ifndef __FLASH_PARTITION_TABLE_H__
-#define __FLASH_PARTITION_TABLE_H__
+#ifndef __FLASH_PARTITION_TABLE__
+#define __FLASH_PARTITION_TABLE__
-//#define RETENTION_MEM_BASE 0x20028000
-//#define RETENTION_MEM_SIZE 0x2000
-#ifndef FLASH_BASE
-#define FLASH_BASE (0x10000000)
+//flash partition map,it's generated by the script based on the json file
+
+#define BOOT_SPACE_OFFSET (0x00000000)
+#define BOOT_SPACE_SIZE (1024*36)
+
+#define PART_TAB_SPACE_OFFSET (0x00009000)
+#define PART_TAB_SPACE_SIZE (1024*4)
+#if (PART_TAB_SPACE_OFFSET < (BOOT_SPACE_OFFSET + BOOT_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
#endif
-#ifndef FLASH_SIZE
-#define FLASH_SIZE (0x00200000)
+#define KV_SPACE_OFFSET (0x0000A000)
+#define KV_SPACE_SIZE (1024*8)
+#if (KV_SPACE_OFFSET < (PART_TAB_SPACE_OFFSET + PART_TAB_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
#endif
-#ifndef PRIMARY_PARTITION_OFFSET
-#define PRIMARY_PARTITION_OFFSET (0x0000F000)
+#define SIMU_EEPROM_SPACE_OFFSET (0x0000C000)
+#define SIMU_EEPROM_SPACE_SIZE (1024*8)
+#if (SIMU_EEPROM_SPACE_OFFSET < (KV_SPACE_OFFSET + KV_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
#endif
-#define PRIMARY_PATTITION_START 0x0000F000
-#define PRIMARY_PATTITION_SIZE 0xE1000
-//#define USERAPP_SRAM_BASE 0x1FFF0000
-#define BACKUP_PATTITION_START 0x000F0000
-#define BACKUP_PATTITION_SIZE 0xE1000
-#define USERDATA_PATTITION_START 0x001D1000
-#define USERDATA_PATTITION_SIZE 0x23000
-
-//memory offset check
-#if ((PRIMARY_PATTITION_START < PRIMARY_PARTITION_OFFSET) || (BACKUP_PATTITION_START < PRIMARY_PATTITION_START) || (USERDATA_PATTITION_START < BACKUP_PATTITION_START) || (PRIMARY_PATTITION_START + PRIMARY_PATTITION_SIZE > BACKUP_PATTITION_START) || (BACKUP_PATTITION_START + BACKUP_PATTITION_SIZE > USERDATA_PATTITION_START) || (USERDATA_PATTITION_START + USERDATA_PATTITION_SIZE > FLASH_SIZE))
- #error "flash partition define error!"
+#define APP_SPACE_OFFSET (0x0000E000)
+#define APP_SPACE_SIZE (1024*800)
+#if (APP_SPACE_OFFSET < (SIMU_EEPROM_SPACE_OFFSET + SIMU_EEPROM_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
#endif
-#endif /* __FLASH_PARTITION_TABLE_H__ */
+#define OTA_SPACE_OFFSET (0x000D6000)
+#define OTA_SPACE_SIZE (1024*800)
+#if (OTA_SPACE_OFFSET < (APP_SPACE_OFFSET + APP_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
+#endif
+
+#define NVDS_SPACE_OFFSET (0x0019E000)
+#define NVDS_SPACE_SIZE (1024*12)
+#if (NVDS_SPACE_OFFSET < (OTA_SPACE_OFFSET + OTA_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
+#endif
+
+#define USER_SPACE_OFFSET (0x001A1000)
+#define USER_SPACE_SIZE (1024*12)
+#if (USER_SPACE_OFFSET < (NVDS_SPACE_OFFSET + NVDS_SPACE_SIZE))
+ #error "flash partition overlap,please check !!!"
+#endif
+
+
+#define IMAGE_HEADER_SIZE (0x100)
+
+#endif /* __FLASH_PARTITION_TABLE__ */
+
diff --git a/board/EVB_LN882x/KEIL/wifi_demo/firmware_XIP_ln882x.sct b/board/EVB_LN882x/KEIL/wifi_demo/ln882x.sct
similarity index 59%
rename from board/EVB_LN882x/KEIL/wifi_demo/firmware_XIP_ln882x.sct
rename to board/EVB_LN882x/KEIL/wifi_demo/ln882x.sct
index 50c5ed54..26dc840b 100644
--- a/board/EVB_LN882x/KEIL/wifi_demo/firmware_XIP_ln882x.sct
+++ b/board/EVB_LN882x/KEIL/wifi_demo/ln882x.sct
@@ -1,9 +1,9 @@
#! armcc -E
-#include ".\flash_partition_table.h"
+#include "flash_partition_table.h"
#include ".\..\..\..\..\platform\vendor_bsp\LN\ln882x\include\cpu\ARM_CM4F\ln88xx\mem_map_ln882x.h"
-LR_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET PRIMARY_PATTITION_SIZE
+LR_FLASH CACHE_FLASH_BASE+APP_SPACE_OFFSET+IMAGE_HEADER_SIZE APP_SPACE_SIZE
{; load region size_region
ISR_VECTOR RAM_BASE ALIGN 0x100
@@ -11,7 +11,7 @@ LR_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET PRIMARY_PATTITION_SIZE
startup_*.o (RESET, +First)
}
- ER_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET + ImageLength(ISR_VECTOR) PRIMARY_PATTITION_SIZE
+ ER_FLASH CACHE_FLASH_BASE+APP_SPACE_OFFSET+IMAGE_HEADER_SIZE + ImageLength(ISR_VECTOR) APP_SPACE_SIZE
{; load address = execution address
*(InRoot$$Sections)
.ANY (+RO)
@@ -24,15 +24,15 @@ LR_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET PRIMARY_PATTITION_SIZE
ll_cache.o(+RO)
ll_dma.o(+RO)
ll_syscon.o(+RO)
- ll_sleep.o(+RO)
- ll_rtc.o(+RO)
+ ;ll_sleep.o(+RO)
+ ;ll_rtc.o(+RO)
cache.o(+RO)
qspi.o(+RO)
flash.o(+RO)
hal_dma.o(+RO)
hal_syscon.o(+RO)
- hal_sleep.o(+RO)
- hal_rtc.o(+RO)
+ ;hal_sleep.o(+RO)
+ ;hal_rtc.o(+RO)
;port.o(XIR)
;optional item
@@ -49,16 +49,32 @@ LR_FLASH FLASH_BASE+PRIMARY_PARTITION_OFFSET PRIMARY_PATTITION_SIZE
startup_ln*(+RW +ZI)
}
- ER_DATA +0
+ ER_DATA_IN_B0 +0 RAM_BLOCK0_SIZE-ImageLength(ISR_VECTOR)-ImageLength(ER_CODE)-ImageLength(ER_STACK)
{
- *(.ARM.__at_0x1FFFFFFC)
- .ANY (+RW +ZI)
+ memp.o(+RW +ZI)
+ imem.o(+RW +ZI)
+ imem_if.o(+RW +ZI)
+ ;cglobals_sta.o(+RW +ZI)
+ ;event_manager.o(+RW +ZI)
+ iconfig.o(+RW +ZI)
+ common.o(+RW +ZI)
+ }
+
+ HEAP_SPACE0 +0 EMPTY RAM_BLOCK1_BASE-ImageLimit(ER_DATA_IN_B0)
+ {; Heap region
+ }
+
+ ER_DATA_IN_B1 RAM_BLOCK1_BASE RAM_BLOCK1_SIZE
+ {
+ *(wlan_mem_pkt)
+ *(wlan_mem_dscr)
+ .ANY (+RW +ZI)
}
;IQ Data area cannot be used by ER_DATA region
;ScatterAssert(ImageLimit(ER_DATA) < (0x20020300))
- HEAP_SPACE +0 EMPTY RETENTION_MEM_BASE-ImageLimit(ER_DATA)
+ HEAP_SPACE1 +0 EMPTY RETENTION_MEM_BASE-ImageLimit(ER_DATA_IN_B1)
{; Heap region
}
diff --git a/board/EVB_LN882x/startup/startup_ln882x.S b/board/EVB_LN882x/startup/startup_ln882x.S
new file mode 100644
index 00000000..a112c2dd
--- /dev/null
+++ b/board/EVB_LN882x/startup/startup_ln882x.S
@@ -0,0 +1,290 @@
+;/**************************************************************************//**
+; * @file startup_ARMCM4.s
+; * @brief CMSIS Core Device Startup File for
+; * ARMCM4 Device Series
+; * @version V5.00
+; * @date 02. March 2016
+; ******************************************************************************/
+;/*
+; * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
+; *
+; * SPDX-License-Identifier: Apache-2.0
+; *
+; * Licensed under the Apache License, Version 2.0 (the License); you may
+; * not use this file except in compliance with the License.
+; * You may obtain a copy of the License at
+; *
+; * www.apache.org/licenses/LICENSE-2.0
+; *
+; * Unless required by applicable law or agreed to in writing, software
+; * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+; * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+; * See the License for the specific language governing permissions and
+; * limitations under the License.
+; */
+
+;/*
+;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
+;*/
+
+
+; Stack Configuration
+; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+
+Stack_Size EQU 0x00001800
+
+ AREA STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem SPACE Stack_Size
+__initial_sp
+
+
+; Heap Configuration
+; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+
+Heap_Size EQU 0x00000000
+
+ AREA HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+Heap_Mem SPACE Heap_Size
+__heap_limit
+
+
+ PRESERVE8
+ THUMB
+
+
+; Vector Table Mapped to Address 0 at Reset
+
+ AREA RESET, DATA, READONLY
+ EXPORT __Vectors
+ EXPORT __Vectors_End
+ EXPORT __Vectors_Size
+
+__Vectors DCD __initial_sp ;(0x00)Top of Stack
+ DCD Reset_Handler ;(0x04)IRQ -15 Reset Handler
+ DCD NMI_Handler ;(0x08)IRQ -14 NMI Handler
+ DCD HardFault_Handler ;(0x0C)IRQ -13 Hard Fault Handler
+ DCD MemManage_Handler ;(0x10)IRQ -12 MPU Fault Handler
+ DCD BusFault_Handler ;(0x14)IRQ -11 Bus Fault Handler
+ DCD UsageFault_Handler ;(0x18)IRQ -10 Usage Fault Handler
+ DCD 0 ;(0x1C)IRQ -9 Reserved
+ DCD 0 ;(0x20)IRQ -8 Reserved
+ DCD 0 ;(0x24)IRQ -7 Reserved
+ DCD 0 ;(0x28)IRQ -6 Reserved
+ DCD SVC_Handler ;(0x2C)IRQ -5 SVCall Handler
+ DCD DebugMon_Handler ;(0x30)IRQ -4 Debug Monitor Handler
+ DCD 0 ;(0x34)IRQ -3 Reserved
+ DCD PendSV_Handler ;(0x38)IRQ -2 PendSV Handler
+ DCD SysTick_Handler ;(0x3C)IRQ -1 SysTick Handler
+
+ ; External Interrupts
+ DCD WDT_IRQHandler ;(0x40)IRQ0
+ DCD EXTERNAL_IRQHandler ;(0x44)IRQ1
+ DCD RTC_IRQHandler ;(0x48)IRQ2
+ DCD SLEEP_IRQHandler ;(0x4C)IRQ3
+ DCD MAC_IRQHandler ;(0x50)IRQ4
+ DCD DMA_IRQHandler ;(0x54)IRQ5
+ DCD QSPI_IRQHandler ;(0x58)IRQ6
+ DCD SDIO_FUN1_IRQHandler ;(0x5C)IRQ7
+ DCD SDIO_FUN2_IRQHandler ;(0x60)IRQ8
+ DCD SDIO_FUN3_IRQHandler ;(0x64)IRQ9
+ DCD SDIO_FUN4_IRQHandler ;(0x68)IRQ10
+ DCD SDIO_FUN5_IRQHandler ;(0x6C)IRQ11
+ DCD SDIO_FUN6_IRQHandler ;(0x70)IRQ12
+ DCD SDIO_FUN7_IRQHandler ;(0x74)IRQ13
+ DCD SDIO_ASYNC_HOST_IRQHandler ;(0x78)IRQ14
+ DCD SDIO_M2S_IRQHandler ;(0x7C)IRQ15
+ DCD CM4_INTR0_IRQHandler ;(0x80)IRQ16
+ DCD CM4_INTR1_IRQHandler ;(0x84)IRQ17
+ DCD CM4_INTR2_IRQHandler ;(0x88)IRQ18
+ DCD CM4_INTR3_IRQHandler ;(0x8C)IRQ19
+ DCD CM4_INTR4_IRQHandler ;(0x90)IRQ20
+ DCD CM4_INTR5_IRQHandler ;(0x94)IRQ21
+ DCD ADC_IRQHandler ;(0x98)IRQ22
+ DCD TIMER_IRQHandler ;(0x9C)IRQ23
+ DCD I2C0_IRQHandler ;(0xA0)IRQ24
+ DCD I2C1_IRQHandler ;(0xA4)IRQ25
+ DCD SPI0_IRQHandler ;(0xA8)IRQ26
+ DCD SPI2_IRQHandler ;(0xAC)IRQ27
+ DCD UART0_IRQHandler ;(0xB0)IRQ28
+ DCD UART1_IRQHandler ;(0xB4)IRQ29
+ DCD SPI1_IRQHandler ;(0xB8)IRQ30
+ DCD GPIO_IRQHandler ;(0xBC)IRQ31
+ DCD I2S_IRQHandler ;(0xC0)IRQ32
+ DCD PAOTD_IRQHandler ;(0xC4)IRQ33
+ DCD PWM_IRQHandler ;(0xC8)IRQ34
+ DCD TRNG_IRQHandler ;(0xCC)IRQ35
+ DCD AES_IRQHandler ;(0xD0)IRQ36
+__Vectors_End
+
+__Vectors_Size EQU __Vectors_End - __Vectors
+
+ AREA |.text|, CODE, READONLY
+
+
+; Reset Handler
+
+Reset_Handler PROC
+ EXPORT Reset_Handler [WEAK]
+ IMPORT SystemInit
+ IMPORT __main
+ LDR R4, =SystemInit
+ BLX R4
+ LDR R4, =__main
+ BX R4
+ ENDP
+
+; Dummy Exception Handlers (infinite loops which can be modified)
+
+NMI_Handler PROC
+ EXPORT NMI_Handler [WEAK]
+ B .
+ ENDP
+HardFault_Handler\
+ PROC
+ EXPORT HardFault_Handler [WEAK]
+ B .
+ ENDP
+MemManage_Handler\
+ PROC
+ EXPORT MemManage_Handler [WEAK]
+ B .
+ ENDP
+BusFault_Handler\
+ PROC
+ EXPORT BusFault_Handler [WEAK]
+ B .
+ ENDP
+UsageFault_Handler\
+ PROC
+ EXPORT UsageFault_Handler [WEAK]
+ B .
+ ENDP
+SVC_Handler PROC
+ EXPORT SVC_Handler [WEAK]
+ B .
+ ENDP
+DebugMon_Handler\
+ PROC
+ EXPORT DebugMon_Handler [WEAK]
+ B .
+ ENDP
+PendSV_Handler PROC
+ EXPORT PendSV_Handler [WEAK]
+ B .
+ ENDP
+SysTick_Handler PROC
+ EXPORT SysTick_Handler [WEAK]
+ B .
+ ENDP
+
+Default_Handler PROC
+
+ EXPORT WDT_IRQHandler [WEAK]
+ EXPORT EXTERNAL_IRQHandler [WEAK]
+ EXPORT RTC_IRQHandler [WEAK]
+ EXPORT SLEEP_IRQHandler [WEAK]
+ EXPORT MAC_IRQHandler [WEAK]
+ EXPORT DMA_IRQHandler [WEAK]
+ EXPORT QSPI_IRQHandler [WEAK]
+ EXPORT SDIO_FUN1_IRQHandler [WEAK]
+ EXPORT SDIO_FUN2_IRQHandler [WEAK]
+ EXPORT SDIO_FUN3_IRQHandler [WEAK]
+ EXPORT SDIO_FUN4_IRQHandler [WEAK]
+ EXPORT SDIO_FUN5_IRQHandler [WEAK]
+ EXPORT SDIO_FUN6_IRQHandler [WEAK]
+ EXPORT SDIO_FUN7_IRQHandler [WEAK]
+ EXPORT SDIO_ASYNC_HOST_IRQHandler [WEAK]
+ EXPORT SDIO_M2S_IRQHandler [WEAK]
+ EXPORT CM4_INTR0_IRQHandler [WEAK]
+ EXPORT CM4_INTR1_IRQHandler [WEAK]
+ EXPORT CM4_INTR2_IRQHandler [WEAK]
+ EXPORT CM4_INTR3_IRQHandler [WEAK]
+ EXPORT CM4_INTR4_IRQHandler [WEAK]
+ EXPORT CM4_INTR5_IRQHandler [WEAK]
+ EXPORT ADC_IRQHandler [WEAK]
+ EXPORT TIMER_IRQHandler [WEAK]
+ EXPORT I2C0_IRQHandler [WEAK]
+ EXPORT I2C1_IRQHandler [WEAK]
+ EXPORT SPI0_IRQHandler [WEAK]
+ EXPORT SPI2_IRQHandler [WEAK]
+ EXPORT UART0_IRQHandler [WEAK]
+ EXPORT UART1_IRQHandler [WEAK]
+ EXPORT SPI1_IRQHandler [WEAK]
+ EXPORT GPIO_IRQHandler [WEAK]
+ EXPORT I2S_IRQHandler [WEAK]
+ EXPORT PAOTD_IRQHandler [WEAK]
+ EXPORT PWM_IRQHandler [WEAK]
+ EXPORT TRNG_IRQHandler [WEAK]
+ EXPORT AES_IRQHandler [WEAK]
+WDT_IRQHandler
+EXTERNAL_IRQHandler
+RTC_IRQHandler
+SLEEP_IRQHandler
+MAC_IRQHandler
+DMA_IRQHandler
+QSPI_IRQHandler
+SDIO_FUN1_IRQHandler
+SDIO_FUN2_IRQHandler
+SDIO_FUN3_IRQHandler
+SDIO_FUN4_IRQHandler
+SDIO_FUN5_IRQHandler
+SDIO_FUN6_IRQHandler
+SDIO_FUN7_IRQHandler
+SDIO_ASYNC_HOST_IRQHandler
+SDIO_M2S_IRQHandler
+CM4_INTR0_IRQHandler
+CM4_INTR1_IRQHandler
+CM4_INTR2_IRQHandler
+CM4_INTR3_IRQHandler
+CM4_INTR4_IRQHandler
+CM4_INTR5_IRQHandler
+ADC_IRQHandler
+TIMER_IRQHandler
+I2C0_IRQHandler
+I2C1_IRQHandler
+SPI0_IRQHandler
+SPI2_IRQHandler
+UART0_IRQHandler
+UART1_IRQHandler
+SPI1_IRQHandler
+GPIO_IRQHandler
+I2S_IRQHandler
+PAOTD_IRQHandler
+PWM_IRQHandler
+TRNG_IRQHandler
+AES_IRQHandler
+ B .
+ ENDP
+ ALIGN
+
+
+; User Initial Stack & Heap
+
+ IF :DEF:__MICROLIB
+
+ EXPORT __initial_sp
+ EXPORT __heap_base
+ EXPORT __heap_limit
+
+ ELSE
+
+ IMPORT __use_two_region_memory
+ EXPORT __user_initial_stackheap
+
+__user_initial_stackheap PROC
+ LDR R0, = Heap_Mem
+ LDR R1, =(Stack_Mem + Stack_Size)
+ LDR R2, = (Heap_Mem + Heap_Size)
+ LDR R3, = Stack_Mem
+ BX LR
+ ENDP
+
+ ALIGN
+
+ ENDIF
+
+
+ END
diff --git a/board/Fire_STM32F429/KEIL/mqttclient/TencentOS_tiny.uvprojx b/board/Fire_STM32F429/KEIL/mqttclient/TencentOS_tiny.uvprojx
index f25ee76f..0ab638ee 100644
--- a/board/Fire_STM32F429/KEIL/mqttclient/TencentOS_tiny.uvprojx
+++ b/board/Fire_STM32F429/KEIL/mqttclient/TencentOS_tiny.uvprojx
@@ -16,7 +16,7 @@
STM32F429IGTx
STMicroelectronics
- Keil.STM32F4xx_DFP.2.9.0
+ Keil.STM32F4xx_DFP.2.13.0
http://www.keil.com/pack
IRAM(0x20000000-0x2002FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4")
@@ -338,7 +338,7 @@
USE_HAL_DRIVER,STM32F429xx,MBEDTLS_CONFIG_FILE=<mbedtls_config.h>,
- ..\..\BSP\Inc;..\..\..\..\platform\vendor_bsp\st\STM32F4xx_HAL_Driver\Inc;..\..\..\..\platform\vendor_bsp\st\STM32F4xx_HAL_Driver\Inc\Legacy;..\..\..\..\platform\vendor_bsp\st\CMSIS\Device\ST\STM32F4xx\Include;..\..\..\..\platform\vendor_bsp\st\CMSIS\Include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\TOS-CONFIG;..\..\..\..\kernel\core\include;..\..\..\..\kernel\pm\include;..\..\..\..\osal\cmsis_os;..\..\..\..\net\lwip;..\..\..\..\net\lwip\3rdparty\src\include;..\..\..\..\net\lwip\3rdparty\src\include\compat;..\..\..\..\net\lwip\3rdparty\src\include\lwip;..\..\..\..\net\lwip\3rdparty\src\include\netif;..\..\..\..\net\lwip\3rdparty\src\include\lwip\apps;..\..\..\..\net\lwip\3rdparty\src\include\lwip\priv;..\..\..\..\net\lwip\3rdparty\src\include\lwip\prot;..\..\..\..\net\lwip\port\include\arch;..\..\..\..\net\lwip\port\include;..\..\..\..\components\connectivity\mqttclient\common;..\..\..\..\components\connectivity\mqttclient\common\log;..\..\..\..\components\connectivity\mqttclient\mqtt;..\..\..\..\components\connectivity\mqttclient\mqttclient;..\..\..\..\components\connectivity\mqttclient\network;..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny;..\..\..\..\components\connectivity\mqttclient\common\mbedtls\configs;..\..\..\..\components\connectivity\mqttclient\common\mbedtls\wrapper;..\..\..\..\components\security\mbedtls\3rdparty\include;..\..\..\..\components\security\mbedtls\3rdparty\include\mbedtls
+ ..\..\BSP\Inc;..\..\..\..\platform\vendor_bsp\st\STM32F4xx_HAL_Driver\Inc;..\..\..\..\platform\vendor_bsp\st\STM32F4xx_HAL_Driver\Inc\Legacy;..\..\..\..\platform\vendor_bsp\st\CMSIS\Device\ST\STM32F4xx\Include;..\..\..\..\platform\vendor_bsp\st\CMSIS\Include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\TOS-CONFIG;..\..\..\..\kernel\core\include;..\..\..\..\kernel\pm\include;..\..\..\..\osal\cmsis_os;..\..\..\..\net\lwip;..\..\..\..\net\lwip\3rdparty\src\include;..\..\..\..\net\lwip\3rdparty\src\include\compat;..\..\..\..\net\lwip\3rdparty\src\include\lwip;..\..\..\..\net\lwip\3rdparty\src\include\netif;..\..\..\..\net\lwip\3rdparty\src\include\lwip\apps;..\..\..\..\net\lwip\3rdparty\src\include\lwip\priv;..\..\..\..\net\lwip\3rdparty\src\include\lwip\prot;..\..\..\..\net\lwip\port\include\arch;..\..\..\..\net\lwip\port\include;..\..\..\..\components\connectivity\mqttclient\common;..\..\..\..\components\connectivity\mqttclient\common\log;..\..\..\..\components\connectivity\mqttclient\mqtt;..\..\..\..\components\connectivity\mqttclient\mqttclient;..\..\..\..\components\connectivity\mqttclient\network;..\..\..\..\components\connectivity\mqttclient\network\mbedtls\configs;..\..\..\..\components\connectivity\mqttclient\network\mbedtls\wrapper;..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny;..\..\..\..\components\security\mbedtls\3rdparty\include;..\..\..\..\components\security\mbedtls\3rdparty\include\mbedtls
@@ -1327,35 +1327,30 @@
1
..\..\..\..\components\connectivity\mqttclient\common\log\arch\tencentos-tiny\arch.c
-
- config.h
- 5
- ..\..\..\..\components\connectivity\mqttclient\common\log\config.h
-
mqttclient/common
-
- list.c
- 1
- ..\..\..\..\components\connectivity\mqttclient\common\list.c
-
random.c
1
..\..\..\..\components\connectivity\mqttclient\common\random.c
- log.h
- 5
- ..\..\..\..\components\connectivity\mqttclient\common\log.h
+ mqtt_list.c
+ 1
+ ..\..\..\..\components\connectivity\mqttclient\common\mqtt_list.c
- error.h
+ mqtt_log.h
5
- ..\..\..\..\components\connectivity\mqttclient\common\error.h
+ ..\..\..\..\components\connectivity\mqttclient\common\mqtt_log.h
+
+
+ mqtt_error.h
+ 5
+ ..\..\..\..\components\connectivity\mqttclient\common\mqtt_error.h
@@ -1367,6 +1362,16 @@
1
..\..\..\..\components\connectivity\mqttclient\network\network.c
+
+ nettype_tcp.c
+ 1
+ ..\..\..\..\components\connectivity\mqttclient\network\nettype_tcp.c
+
+
+ nettype_tls.c
+ 1
+ ..\..\..\..\components\connectivity\mqttclient\network\nettype_tls.c
+
@@ -1387,16 +1392,6 @@
1
..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_net_socket.c
-
- platform_nettype_tcp.c
- 1
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_nettype_tcp.c
-
-
- platform_nettype_tls.c
- 1
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_nettype_tls.c
-
platform_thread.c
1
@@ -1415,17 +1410,17 @@
entropy_hardware_alt.c
1
- ..\..\..\..\components\connectivity\mqttclient\common\mbedtls\wrapper\entropy_hardware_alt.c
+ ..\..\..\..\components\connectivity\mqttclient\network\mbedtls\wrapper\entropy_hardware_alt.c
net_sockets_alt.c
1
- ..\..\..\..\components\connectivity\mqttclient\common\mbedtls\wrapper\net_sockets_alt.c
+ ..\..\..\..\components\connectivity\mqttclient\network\mbedtls\wrapper\net_sockets_alt.c
timing_alt.c
1
- ..\..\..\..\components\connectivity\mqttclient\common\mbedtls\wrapper\timing_alt.c
+ ..\..\..\..\components\connectivity\mqttclient\network\mbedtls\wrapper\timing_alt.c
diff --git a/board/Fire_STM32F429/KEIL/mqttclient_iothub/TOS-CONFIG/mqtt_config.h b/board/Fire_STM32F429/KEIL/mqttclient_iothub/TOS-CONFIG/mqtt_config.h
index 837ce94e..9cc0f35f 100644
--- a/board/Fire_STM32F429/KEIL/mqttclient_iothub/TOS-CONFIG/mqtt_config.h
+++ b/board/Fire_STM32F429/KEIL/mqttclient_iothub/TOS-CONFIG/mqtt_config.h
@@ -1,40 +1,39 @@
/*
* @Author: jiejie
* @Github: https://github.com/jiejieTop
- * @Date: 2019-12-15 00:42:16
- * @LastEditTime: 2020-02-25 09:25:35
+ * @LastEditTime: 2020-06-17 19:31:41
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#ifndef _MQTT_CONFIG_H_
#define _MQTT_CONFIG_H_
-#define LOG_IS_SALOF
+#define MQTT_LOG_IS_SALOF
-#define LOG_LEVEL DEBUG_LEVEL //WARN_LEVEL DEBUG_LEVEL
+#define MQTT_LOG_LEVEL MQTT_LOG_DEBUG_LEVEL //MQTT_LOG_WARN_LEVEL MQTT_LOG_DEBUG_LEVEL
-#ifdef LOG_IS_SALOF
- #define USE_LOG (1U)
- #define USE_SALOF (1U)
- #define SALOF_OS USE_TENCENTOS
- #define USE_IDLE_HOOK (0U)
- #define LOG_COLOR (0U)
- #define LOG_TS (0U)
- #define LOG_TAR (0U)
- #define SALOF_BUFF_SIZE (512U)
- #define SALOF_FIFO_SIZE (1024U)
- #define SALOF_TASK_STACK_SIZE (1024U)
- #define SALOF_TASK_TICK (50U)
+#ifdef MQTT_LOG_IS_SALOF
+ #define SALOF_USING_LOG (1U)
+ #define SALOF_USING_SALOF (1U)
+ #define SALOF_LOG_LEVEL MQTT_LOG_LEVEL
+ #define SALOF_OS SALOF_USING_TENCENTOS
+ #define SALOF_USING_IDLE_HOOK (0U)
+ #define SALOF_LOG_COLOR (1U)
+ #define SALOF_LOG_TS (0U)
+ #define SALOF_LOG_TAR (0U)
+ #define SALOF_BUFF_SIZE 512
+ #define SALOF_FIFO_SIZE 4096
+ #define SALOF_TASK_STACK_SIZE 1024
+ #define SALOF_TASK_TICK 50
#endif
-
#define MQTT_MAX_PACKET_ID (0xFFFF - 1)
#define MQTT_TOPIC_LEN_MAX 64
#define MQTT_ACK_HANDLER_NUM_MAX 64
#define MQTT_DEFAULT_BUF_SIZE 1024
-#define MQTT_DEFAULT_CMD_TIMEOUT 4000
+#define MQTT_DEFAULT_CMD_TIMEOUT 5000
#define MQTT_MAX_CMD_TIMEOUT 20000
#define MQTT_MIN_CMD_TIMEOUT 1000
-#define MQTT_KEEP_ALIVE_INTERVAL 100 // unit: second
+#define MQTT_KEEP_ALIVE_INTERVAL 50 // unit: second
#define MQTT_VERSION 4 // 4 is mqtt 3.1.1
#define MQTT_RECONNECT_DEFAULT_DURATION 1000
#define MQTT_THREAD_STACK_SIZE 2048
@@ -42,6 +41,6 @@
#define MQTT_THREAD_TICK 50
-//#define MQTT_NETWORK_TYPE_TLS
+#define MQTT_NETWORK_TYPE_NO_TLS
#endif /* _MQTT_CONFIG_H_ */
diff --git a/board/Fire_STM32F429/KEIL/mqttclient_iothub/TencentOS_tiny.uvprojx b/board/Fire_STM32F429/KEIL/mqttclient_iothub/TencentOS_tiny.uvprojx
index 6c842fa5..cbf793ec 100644
--- a/board/Fire_STM32F429/KEIL/mqttclient_iothub/TencentOS_tiny.uvprojx
+++ b/board/Fire_STM32F429/KEIL/mqttclient_iothub/TencentOS_tiny.uvprojx
@@ -16,7 +16,7 @@
STM32F429IGTx
STMicroelectronics
- Keil.STM32F4xx_DFP.2.9.0
+ Keil.STM32F4xx_DFP.2.13.0
http://www.keil.com/pack
IRAM(0x20000000-0x2002FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4")
@@ -338,7 +338,7 @@
USE_HAL_DRIVER,STM32F429xx,MBEDTLS_CONFIG_FILE=<mbedtls_config.h>,
- ..\..\BSP\Inc;..\..\..\..\platform\vendor_bsp\st\STM32F4xx_HAL_Driver\Inc;..\..\..\..\platform\vendor_bsp\st\STM32F4xx_HAL_Driver\Inc\Legacy;..\..\..\..\platform\vendor_bsp\st\CMSIS\Device\ST\STM32F4xx\Include;..\..\..\..\platform\vendor_bsp\st\CMSIS\Include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\..\..\arch\arm\arm-v7m\common\include;.\TOS-CONFIG;..\..\..\..\kernel\core\include;..\..\..\..\kernel\pm\include;..\..\..\..\osal\cmsis_os;..\..\..\..\net\lwip;..\..\..\..\net\lwip\3rdparty\src\include;..\..\..\..\net\lwip\3rdparty\src\include\compat;..\..\..\..\net\lwip\3rdparty\src\include\lwip;..\..\..\..\net\lwip\3rdparty\src\include\netif;..\..\..\..\net\lwip\3rdparty\src\include\lwip\apps;..\..\..\..\net\lwip\3rdparty\src\include\lwip\priv;..\..\..\..\net\lwip\3rdparty\src\include\lwip\prot;..\..\..\..\net\lwip\port\include\arch;..\..\..\..\net\lwip\port\include;..\..\..\..\components\connectivity\mqttclient\common;..\..\..\..\components\connectivity\mqttclient\common\log;..\..\..\..\components\connectivity\mqttclient\mqtt;..\..\..\..\components\connectivity\mqttclient\mqttclient;..\..\..\..\components\connectivity\mqttclient\network;..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny;..\..\..\..\components\connectivity\mqttclient\common\mbedtls\wrapper;..\..\..\..\components\security\mbedtls\3rdparty\include;..\..\..\..\components\security\mbedtls\3rdparty\include\mbedtls
+ ..\..\BSP\Inc;..\..\..\..\platform\vendor_bsp\st\STM32F4xx_HAL_Driver\Inc;..\..\..\..\platform\vendor_bsp\st\STM32F4xx_HAL_Driver\Inc\Legacy;..\..\..\..\platform\vendor_bsp\st\CMSIS\Device\ST\STM32F4xx\Include;..\..\..\..\platform\vendor_bsp\st\CMSIS\Include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\..\..\arch\arm\arm-v7m\common\include;.\TOS-CONFIG;..\..\..\..\kernel\core\include;..\..\..\..\kernel\pm\include;..\..\..\..\osal\cmsis_os;..\..\..\..\net\lwip;..\..\..\..\net\lwip\3rdparty\src\include;..\..\..\..\net\lwip\3rdparty\src\include\compat;..\..\..\..\net\lwip\3rdparty\src\include\lwip;..\..\..\..\net\lwip\3rdparty\src\include\netif;..\..\..\..\net\lwip\3rdparty\src\include\lwip\apps;..\..\..\..\net\lwip\3rdparty\src\include\lwip\priv;..\..\..\..\net\lwip\3rdparty\src\include\lwip\prot;..\..\..\..\net\lwip\port\include\arch;..\..\..\..\net\lwip\port\include;..\..\..\..\components\connectivity\mqttclient\common;..\..\..\..\components\connectivity\mqttclient\common\log;..\..\..\..\components\connectivity\mqttclient\mqtt;..\..\..\..\components\connectivity\mqttclient\mqttclient;..\..\..\..\components\connectivity\mqttclient\network;..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny;..\..\..\..\components\connectivity\mqttclient\network\mbedtls\wrapper;..\..\..\..\components\security\mbedtls\3rdparty\include;..\..\..\..\components\security\mbedtls\3rdparty\include\mbedtls
@@ -1322,35 +1322,30 @@
1
..\..\..\..\components\connectivity\mqttclient\common\log\arch\tencentos-tiny\arch.c
-
- config.h
- 5
- ..\..\..\..\components\connectivity\mqttclient\common\log\config.h
-
mqttclient/common
-
- list.c
- 1
- ..\..\..\..\components\connectivity\mqttclient\common\list.c
-
random.c
1
..\..\..\..\components\connectivity\mqttclient\common\random.c
- log.h
- 5
- ..\..\..\..\components\connectivity\mqttclient\common\log.h
+ mqtt_list.c
+ 1
+ ..\..\..\..\components\connectivity\mqttclient\common\mqtt_list.c
- error.h
+ mqtt_error.h
5
- ..\..\..\..\components\connectivity\mqttclient\common\error.h
+ ..\..\..\..\components\connectivity\mqttclient\common\mqtt_error.h
+
+
+ mqtt_log.h
+ 5
+ ..\..\..\..\components\connectivity\mqttclient\common\mqtt_log.h
@@ -1362,6 +1357,16 @@
1
..\..\..\..\components\connectivity\mqttclient\network\network.c
+
+ nettype_tcp.c
+ 1
+ ..\..\..\..\components\connectivity\mqttclient\network\nettype_tcp.c
+
+
+ nettype_tls.c
+ 1
+ ..\..\..\..\components\connectivity\mqttclient\network\nettype_tls.c
+
@@ -1382,16 +1387,6 @@
1
..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_net_socket.c
-
- platform_nettype_tcp.c
- 1
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_nettype_tcp.c
-
-
- platform_nettype_tls.c
- 1
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_nettype_tls.c
-
platform_thread.c
1
@@ -1810,17 +1805,17 @@
entropy_hardware_alt.c
1
- ..\..\..\..\components\connectivity\mqttclient\common\mbedtls\wrapper\entropy_hardware_alt.c
+ ..\..\..\..\components\connectivity\mqttclient\network\mbedtls\wrapper\entropy_hardware_alt.c
net_sockets_alt.c
1
- ..\..\..\..\components\connectivity\mqttclient\common\mbedtls\wrapper\net_sockets_alt.c
+ ..\..\..\..\components\connectivity\mqttclient\network\mbedtls\wrapper\net_sockets_alt.c
timing_alt.c
1
- ..\..\..\..\components\connectivity\mqttclient\common\mbedtls\wrapper\timing_alt.c
+ ..\..\..\..\components\connectivity\mqttclient\network\mbedtls\wrapper\timing_alt.c
diff --git a/board/Fire_STM32F429/TOS-CONFIG/mqtt_config.h b/board/Fire_STM32F429/TOS-CONFIG/mqtt_config.h
index e99e7ce6..573d9212 100644
--- a/board/Fire_STM32F429/TOS-CONFIG/mqtt_config.h
+++ b/board/Fire_STM32F429/TOS-CONFIG/mqtt_config.h
@@ -1,40 +1,39 @@
/*
* @Author: jiejie
* @Github: https://github.com/jiejieTop
- * @Date: 2019-12-15 00:42:16
- * @LastEditTime: 2020-02-25 09:25:35
+ * @LastEditTime: 2020-06-17 19:31:41
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#ifndef _MQTT_CONFIG_H_
#define _MQTT_CONFIG_H_
-#define LOG_IS_SALOF
+#define MQTT_LOG_IS_SALOF
-#define LOG_LEVEL DEBUG_LEVEL //WARN_LEVEL DEBUG_LEVEL
+#define MQTT_LOG_LEVEL MQTT_LOG_DEBUG_LEVEL //MQTT_LOG_WARN_LEVEL MQTT_LOG_DEBUG_LEVEL
-#ifdef LOG_IS_SALOF
- #define USE_LOG (1U)
- #define USE_SALOF (1U)
- #define SALOF_OS USE_TENCENTOS
- #define USE_IDLE_HOOK (0U)
- #define LOG_COLOR (0U)
- #define LOG_TS (0U)
- #define LOG_TAR (0U)
- #define SALOF_BUFF_SIZE (512U)
- #define SALOF_FIFO_SIZE (1024U)
- #define SALOF_TASK_STACK_SIZE (1024U)
- #define SALOF_TASK_TICK (50U)
+#ifdef MQTT_LOG_IS_SALOF
+ #define SALOF_USING_LOG (1U)
+ #define SALOF_USING_SALOF (1U)
+ #define SALOF_LOG_LEVEL MQTT_LOG_LEVEL
+ #define SALOF_OS SALOF_USING_TENCENTOS
+ #define SALOF_USING_IDLE_HOOK (0U)
+ #define SALOF_LOG_COLOR (1U)
+ #define SALOF_LOG_TS (0U)
+ #define SALOF_LOG_TAR (0U)
+ #define SALOF_BUFF_SIZE 512
+ #define SALOF_FIFO_SIZE 4096
+ #define SALOF_TASK_STACK_SIZE 1024
+ #define SALOF_TASK_TICK 50
#endif
-
#define MQTT_MAX_PACKET_ID (0xFFFF - 1)
#define MQTT_TOPIC_LEN_MAX 64
#define MQTT_ACK_HANDLER_NUM_MAX 64
#define MQTT_DEFAULT_BUF_SIZE 1024
-#define MQTT_DEFAULT_CMD_TIMEOUT 4000
+#define MQTT_DEFAULT_CMD_TIMEOUT 5000
#define MQTT_MAX_CMD_TIMEOUT 20000
#define MQTT_MIN_CMD_TIMEOUT 1000
-#define MQTT_KEEP_ALIVE_INTERVAL 100 // unit: second
+#define MQTT_KEEP_ALIVE_INTERVAL 50 // unit: second
#define MQTT_VERSION 4 // 4 is mqtt 3.1.1
#define MQTT_RECONNECT_DEFAULT_DURATION 1000
#define MQTT_THREAD_STACK_SIZE 2048
@@ -42,6 +41,6 @@
#define MQTT_THREAD_TICK 50
-#define MQTT_NETWORK_TYPE_TLS
+// #define MQTT_NETWORK_TYPE_NO_TLS
#endif /* _MQTT_CONFIG_H_ */
diff --git a/board/GoKit3_STM32F103C8T6/BSP/Inc/tos_at.h b/board/GoKit3_STM32F103C8T6/BSP/Inc/tos_at.h
index 70a67e79..7bed6bd6 100644
--- a/board/GoKit3_STM32F103C8T6/BSP/Inc/tos_at.h
+++ b/board/GoKit3_STM32F103C8T6/BSP/Inc/tos_at.h
@@ -93,6 +93,7 @@ typedef struct at_echo_st {
size_t __w_idx;
int __is_expecting;
k_sem_t __expect_notify;
+ int __is_fuzzy_match;
} at_echo_t;
typedef void (*at_event_callback_t)(void);
@@ -113,7 +114,7 @@ typedef struct at_agent_st {
k_task_t parser;
at_cache_t recv_cache;
- at_timer_t timer;
+ k_stopwatch_t timer;
k_mutex_t global_lock;
@@ -268,7 +269,7 @@ __API__ int tos_at_init(hal_uart_port_t uart_port, at_event_t *event_table, size
*
* @attention None
*
- * @return
+ * @return
None
*/
__API__ void tos_at_deinit(void);
@@ -289,6 +290,22 @@ __API__ void tos_at_deinit(void);
*/
__API__ int tos_at_echo_create(at_echo_t *echo, char *buffer, size_t buffer_size, char *echo_expect);
+/**
+ * @brief Create a echo struct with fuzzy matching for expected echo.
+ *
+ * @attention None
+ *
+ * @param[in] echo pointer to the echo struct.
+ * @param[out] buffer buffer to hold the received message from the module.
+ * @param[in] buffer_size size of the buffer.
+ * @param[in] echo_expect_contains if the echo message contains echo_expect_contains, it is a matching.
+ *
+ * @return errcode
+ * @retval -1 create failed(error).
+ * @retval 0 create successfully.
+ */
+__API__ int tos_at_echo_fuzzy_matching_create(at_echo_t *echo, char *buffer, size_t buffer_size, char *echo_expect_contains);
+
/**
* @brief Execute an at command.
*
@@ -456,5 +473,5 @@ __API__ const char *tos_at_agent_channel_ip_get(int channel_id);
*/
__API__ const char *tos_at_agent_channel_port_get(int channel_id);
-#endif /* __AT_AGENT_H_ */
+#endif /* _TOS_AT_H_ */
diff --git a/board/GoKit3_STM32F103C8T6/KEIL/mqttclient/GoKit3_STM32F103C8T6.uvprojx b/board/GoKit3_STM32F103C8T6/KEIL/mqttclient/GoKit3_STM32F103C8T6.uvprojx
index 032d14bd..0ab690b8 100644
--- a/board/GoKit3_STM32F103C8T6/KEIL/mqttclient/GoKit3_STM32F103C8T6.uvprojx
+++ b/board/GoKit3_STM32F103C8T6/KEIL/mqttclient/GoKit3_STM32F103C8T6.uvprojx
@@ -16,7 +16,7 @@
STM32F103C8
STMicroelectronics
- Keil.STM32F1xx_DFP.2.2.0
+ Keil.STM32F1xx_DFP.2.3.0
http://www.keil.com/pack/
IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x800FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3")
@@ -54,7 +54,7 @@
0
0
1
- 0
+ 1
1
0
@@ -837,25 +837,25 @@
mqttclient/common
-
- list.c
- 1
- ..\..\..\..\components\connectivity\mqttclient\common\list.c
-
random.c
1
..\..\..\..\components\connectivity\mqttclient\common\random.c
- log.h
- 5
- ..\..\..\..\components\connectivity\mqttclient\common\log.h
+ mqtt_list.c
+ 1
+ ..\..\..\..\components\connectivity\mqttclient\common\mqtt_list.c
- error.h
+ mqtt_log.h
5
- ..\..\..\..\components\connectivity\mqttclient\common\error.h
+ ..\..\..\..\components\connectivity\mqttclient\common\mqtt_log.h
+
+
+ mqtt_error.h
+ 5
+ ..\..\..\..\components\connectivity\mqttclient\common\mqtt_error.h
@@ -867,6 +867,16 @@
1
..\..\..\..\components\connectivity\mqttclient\network\network.c
+
+ nettype_tcp.c
+ 1
+ ..\..\..\..\components\connectivity\mqttclient\network\nettype_tcp.c
+
+
+ nettype_tls.c
+ 1
+ ..\..\..\..\components\connectivity\mqttclient\network\nettype_tls.c
+
@@ -887,16 +897,6 @@
1
..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_net_socket.c
-
- platform_nettype_tcp.c
- 1
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_nettype_tcp.c
-
-
- platform_nettype_tls.c
- 1
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_nettype_tls.c
-
platform_thread.c
1
diff --git a/board/GoKit3_STM32F103C8T6/TOS-CONFIG/mqtt_config.h b/board/GoKit3_STM32F103C8T6/TOS-CONFIG/mqtt_config.h
index c2caeb53..2e953d69 100644
--- a/board/GoKit3_STM32F103C8T6/TOS-CONFIG/mqtt_config.h
+++ b/board/GoKit3_STM32F103C8T6/TOS-CONFIG/mqtt_config.h
@@ -1,48 +1,48 @@
/*
* @Author: jiejie
* @Github: https://github.com/jiejieTop
- * @Date: 2019-12-15 00:42:16
- * @LastEditTime: 2020-02-25 09:25:35
+ * @LastEditTime: 2020-06-17 19:31:41
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#ifndef _MQTT_CONFIG_H_
#define _MQTT_CONFIG_H_
-//#define LOG_IS_SALOF
+//#define MQTT_LOG_IS_SALOF
-#define LOG_LEVEL DEBUG_LEVEL //WARN_LEVEL DEBUG_LEVEL
+#define MQTT_NETSOCKET_USING_AT
-#ifdef LOG_IS_SALOF
- #define USE_LOG (1U)
- #define USE_SALOF (1U)
- #define SALOF_OS USE_TENCENTOS
- #define USE_IDLE_HOOK (0U)
- #define LOG_COLOR (0U)
- #define LOG_TS (0U)
- #define LOG_TAR (0U)
- #define SALOF_BUFF_SIZE (512U)
- #define SALOF_FIFO_SIZE (1024U)
- #define SALOF_TASK_STACK_SIZE (1024U)
- #define SALOF_TASK_TICK (50U)
+#define MQTT_LOG_LEVEL MQTT_LOG_DEBUG_LEVEL //MQTT_LOG_WARN_LEVEL MQTT_LOG_DEBUG_LEVEL
+
+#ifdef MQTT_LOG_IS_SALOF
+ #define SALOF_USING_LOG (1U)
+ #define SALOF_USING_SALOF (1U)
+ #define SALOF_LOG_LEVEL MQTT_LOG_LEVEL
+ #define SALOF_OS SALOF_USING_TENCENTOS
+ #define SALOF_USING_IDLE_HOOK (0U)
+ #define SALOF_LOG_COLOR (1U)
+ #define SALOF_LOG_TS (0U)
+ #define SALOF_LOG_TAR (0U)
+ #define SALOF_BUFF_SIZE 512
+ #define SALOF_FIFO_SIZE 4096
+ #define SALOF_TASK_STACK_SIZE 1024
+ #define SALOF_TASK_TICK 50
#endif
-
#define MQTT_MAX_PACKET_ID (0xFFFF - 1)
#define MQTT_TOPIC_LEN_MAX 64
#define MQTT_ACK_HANDLER_NUM_MAX 64
#define MQTT_DEFAULT_BUF_SIZE 1024
-#define MQTT_DEFAULT_CMD_TIMEOUT 4000
+#define MQTT_DEFAULT_CMD_TIMEOUT 5000
#define MQTT_MAX_CMD_TIMEOUT 20000
#define MQTT_MIN_CMD_TIMEOUT 1000
-#define MQTT_KEEP_ALIVE_INTERVAL 100 // unit: second
+#define MQTT_KEEP_ALIVE_INTERVAL 50 // unit: second
#define MQTT_VERSION 4 // 4 is mqtt 3.1.1
#define MQTT_RECONNECT_DEFAULT_DURATION 1000
#define MQTT_THREAD_STACK_SIZE 2048
#define MQTT_THREAD_PRIO 5
#define MQTT_THREAD_TICK 50
-#define MQTT_NETSOCKET_USE_AT
-//#define MQTT_NETWORK_TYPE_TLS
+#define MQTT_NETWORK_TYPE_NO_TLS
#endif /* _MQTT_CONFIG_H_ */
diff --git a/board/RHF0M0E5_STM32WLE5xx/KEIL/lorawan/App/Commissioning.h b/board/RHF0M0E5_STM32WLE5xx/KEIL/lorawan/App/Commissioning.h
index 07f45097..39b7d5cb 100644
--- a/board/RHF0M0E5_STM32WLE5xx/KEIL/lorawan/App/Commissioning.h
+++ b/board/RHF0M0E5_STM32WLE5xx/KEIL/lorawan/App/Commissioning.h
@@ -60,7 +60,7 @@ extern "C" {
#define LORAWAN_PUBLIC_NETWORK true
/*root key*/
-#define LORAWAN_APP_KEY {0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
+#define LORAWAN_APP_KEY { 0x8c, 0xf9, 0x57, 0x20, 0x00, 0x00, 0xf7, 0x37, 0x1e, 0x29, 0xaa, 0xaa, 0xad, 0x20, 0x4a, 0x72 }
/*for ABP================================================================================*/
#define STATIC_DEVICE_ADDRESS 1 //if 0 , using a ramdom address
@@ -68,21 +68,21 @@ extern "C" {
#define LORAWAN_NETWORK_ID ( uint32_t )0
#define LORAWAN_DEVICE_ADDRESS ( uint32_t )0x0100000a
-#define LORAWAN_NWK_KEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
+#define LORAWAN_NWK_KEY { 0x8c, 0xf9, 0x57, 0x20, 0x00, 0x00, 0xf7, 0x37, 0x1e, 0x29, 0xaa, 0xaa, 0xad, 0x20, 0x4a, 0x72 }
/*for 1.1.x*/
-#define LORAWAN_F_NWK_S_INT_KEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
-#define LORAWAN_S_NWK_S_INT_KEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
-#define LORAWAN_NWK_S_ENC_KEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
-#define LORAWAN_APP_S_KEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
+#define LORAWAN_F_NWK_S_INT_KEY { 0x8c, 0xf9, 0x57, 0x20, 0x00, 0x00, 0xf7, 0x37, 0x1e, 0x29, 0xaa, 0xaa, 0xad, 0x20, 0x4a, 0x72 }
+#define LORAWAN_S_NWK_S_INT_KEY { 0x8c, 0xf9, 0x57, 0x20, 0x00, 0x00, 0xf7, 0x37, 0x1e, 0x29, 0xaa, 0xaa, 0xad, 0x20, 0x4a, 0x72 }
+#define LORAWAN_NWK_S_ENC_KEY { 0x8c, 0xf9, 0x57, 0x20, 0x00, 0x00, 0xf7, 0x37, 0x1e, 0x29, 0xaa, 0xaa, 0xad, 0x20, 0x4a, 0x72 }
+#define LORAWAN_APP_S_KEY { 0x8c, 0xf9, 0x57, 0x20, 0x00, 0x00, 0xf7, 0x37, 0x1e, 0x29, 0xaa, 0xaa, 0xad, 0x20, 0x4a, 0x72 }
/*for OTAA================================================================================*/
#define STATIC_DEVICE_EUI 1 //if 0 , using a ramdom EUI
#define IEEE_OUI 0x01, 0x01, 0x01
-#define LORAWAN_DEVICE_EUI { IEEE_OUI, 0x01, 0x01, 0x01, 0x04, 0x02 }
-#define LORAWAN_JOIN_EUI /*APP_EUI*/ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }
+#define LORAWAN_DEVICE_EUI { 0x8c, 0xf9, 0x57, 0x20, 0x00, 0x00, 0xf7, 0x37}
+#define LORAWAN_JOIN_EUI /*APP_EUI*/ { 0x8c, 0xf9, 0x57, 0x20, 0x00, 0x00, 0xf7, 0x37}
diff --git a/board/RHF0M0E5_STM32WLE5xx/KEIL/lorawan/App/app_conf.h b/board/RHF0M0E5_STM32WLE5xx/KEIL/lorawan/App/app_conf.h
index ed79f997..73313c38 100644
--- a/board/RHF0M0E5_STM32WLE5xx/KEIL/lorawan/App/app_conf.h
+++ b/board/RHF0M0E5_STM32WLE5xx/KEIL/lorawan/App/app_conf.h
@@ -32,7 +32,7 @@ extern "C" {
******************************************************************************/
/* lw application configuration (Mw is configured by lorawan_conf.h) */
-#define LORAWAN_DEFAULT_ACTIVE_REGION LORAMAC_REGION_CN470ALI
+#define LORAWAN_DEFAULT_ACTIVE_REGION LORAMAC_REGION_CN470
diff --git a/board/RHF0M0E5_STM32WLE5xx/KEIL/lorawan/App/app_lorawan.c b/board/RHF0M0E5_STM32WLE5xx/KEIL/lorawan/App/app_lorawan.c
index 05269e7e..1163a4bd 100644
--- a/board/RHF0M0E5_STM32WLE5xx/KEIL/lorawan/App/app_lorawan.c
+++ b/board/RHF0M0E5_STM32WLE5xx/KEIL/lorawan/App/app_lorawan.c
@@ -83,7 +83,7 @@ void MX_LoRaWAN_Init(void)
lw_request_class(CLASS_A);
/*channel 8-16*/
- LWChannel_mask_t ch={0xFF00,0,0,0,0,0};
+ LWChannel_mask_t ch={0x0000,0,0,0,0,0x00FF};
lw_current_chmask_set(&ch);
/*tx dr*/
diff --git a/board/TencentOS_tiny_EVB_LX/eclipse/lorawan/.cproject b/board/TencentOS_tiny_EVB_LX/eclipse/lorawan/.cproject
index e9fb6d48..8aa085b6 100644
--- a/board/TencentOS_tiny_EVB_LX/eclipse/lorawan/.cproject
+++ b/board/TencentOS_tiny_EVB_LX/eclipse/lorawan/.cproject
@@ -59,6 +59,7 @@
@@ -256,8 +302,8 @@
0
0
0
- ..\..\BSP\Src\stm32f1xx_hal_msp.c
- stm32f1xx_hal_msp.c
+ ..\..\BSP\Src\gpio.c
+ gpio.c
0
0
@@ -268,76 +314,128 @@
0
0
0
- .\stm32f1xx_it.c
- stm32f1xx_it.c
+ ..\..\BSP\Src\main.c
+ main.c
0
0
-
-
-
- Application/Bsp
- 0
- 0
- 0
- 0
- 3
+ 2
4
1
0
0
0
- ..\..\BSP\Src\bsp_dwt.c
- bsp_dwt.c
+ ..\..\BSP\Src\mcu_init.c
+ mcu_init.c
0
0
- 3
+ 2
5
1
0
0
0
- ..\..\BSP\Src\bsp_init.c
- bsp_init.c
+ ..\..\BSP\Src\stm32l4xx_hal_msp.c
+ stm32l4xx_hal_msp.c
0
0
- 3
+ 2
6
1
0
0
0
- ..\..\BSP\Src\bsp_led.c
- bsp_led.c
+ ..\..\BSP\Src\stm32l4xx_it.c
+ stm32l4xx_it.c
0
0
- 3
+ 2
7
1
0
0
0
- ..\..\BSP\Src\bsp_motor.c
- bsp_motor.c
+ ..\..\BSP\Src\usart.c
+ usart.c
0
0
- 3
+ 2
8
1
0
0
0
- ..\..\BSP\Src\bsp_usart.c
- bsp_usart.c
+ ..\..\BSP\Src\adc.c
+ adc.c
+ 0
+ 0
+
+
+ 2
+ 9
+ 1
+ 0
+ 0
+ 0
+ ..\..\BSP\Src\dac.c
+ dac.c
+ 0
+ 0
+
+
+ 2
+ 10
+ 1
+ 0
+ 0
+ 0
+ ..\..\BSP\Src\i2c.c
+ i2c.c
+ 0
+ 0
+
+
+ 2
+ 11
+ 1
+ 0
+ 0
+ 0
+ ..\..\BSP\Src\spi.c
+ spi.c
+ 0
+ 0
+
+
+ 2
+ 12
+ 1
+ 0
+ 0
+ 0
+ ..\..\BSP\Src\tim.c
+ tim.c
+ 0
+ 0
+
+
+ 2
+ 13
+ 1
+ 0
+ 0
+ 0
+ ..\..\BSP\Src\sdmmc.c
+ sdmmc.c
0
0
@@ -350,214 +448,346 @@
0
0
- 4
- 9
+ 3
+ 14
1
0
0
0
- ..\..\..\..\examples\mqttclient\gokit3_mqttclient.c
- gokit3_mqttclient.c
+ ..\..\..\..\examples\elfloader_shared_object\elfloader_shared_object.c
+ elfloader_shared_object.c
0
0
- Drivers/STM32F1xx_HAL_Driver
+ Drivers/STM32L4xx_HAL_Driver
0
0
0
0
- 5
- 10
- 1
- 0
- 0
- 0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c
- stm32f1xx_hal.c
- 0
- 0
-
-
- 5
- 11
- 1
- 0
- 0
- 0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c
- stm32f1xx_hal_cortex.c
- 0
- 0
-
-
- 5
- 12
- 1
- 0
- 0
- 0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c
- stm32f1xx_hal_dma.c
- 0
- 0
-
-
- 5
- 13
- 1
- 0
- 0
- 0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_exti.c
- stm32f1xx_hal_exti.c
- 0
- 0
-
-
- 5
- 14
- 1
- 0
- 0
- 0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash.c
- stm32f1xx_hal_flash.c
- 0
- 0
-
-
- 5
+ 4
15
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash_ex.c
- stm32f1xx_hal_flash_ex.c
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c
+ stm32l4xx_hal_tim.c
0
0
- 5
+ 4
16
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c
- stm32f1xx_hal_gpio.c
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c
+ stm32l4xx_hal_tim_ex.c
0
0
- 5
+ 4
17
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c
- stm32f1xx_hal_gpio_ex.c
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c
+ stm32l4xx_hal_uart.c
0
0
- 5
+ 4
18
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pcd.c
- stm32f1xx_hal_pcd.c
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c
+ stm32l4xx_hal_uart_ex.c
0
0
- 5
+ 4
19
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pcd_ex.c
- stm32f1xx_hal_pcd_ex.c
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c
+ stm32l4xx_hal.c
0
0
- 5
+ 4
20
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c
- stm32f1xx_hal_pwr.c
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c
+ stm32l4xx_hal_i2c.c
0
0
- 5
+ 4
21
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c
- stm32f1xx_hal_rcc.c
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c
+ stm32l4xx_hal_i2c_ex.c
0
0
- 5
+ 4
22
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c
- stm32f1xx_hal_rcc_ex.c
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c
+ stm32l4xx_hal_rcc.c
0
0
- 5
+ 4
23
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_tim.c
- stm32f1xx_hal_tim.c
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c
+ stm32l4xx_hal_rcc_ex.c
0
0
- 5
+ 4
24
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_tim_ex.c
- stm32f1xx_hal_tim_ex.c
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c
+ stm32l4xx_hal_flash.c
0
0
- 5
+ 4
25
1
0
0
0
- ..\..\..\..\platform\vendor_bsp\st\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c
- stm32f1xx_hal_uart.c
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c
+ stm32l4xx_hal_flash_ex.c
+ 0
+ 0
+
+
+ 4
+ 26
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c
+ stm32l4xx_hal_flash_ramfunc.c
+ 0
+ 0
+
+
+ 4
+ 27
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c
+ stm32l4xx_hal_gpio.c
+ 0
+ 0
+
+
+ 4
+ 28
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c
+ stm32l4xx_hal_dma.c
+ 0
+ 0
+
+
+ 4
+ 29
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c
+ stm32l4xx_hal_dma_ex.c
+ 0
+ 0
+
+
+ 4
+ 30
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c
+ stm32l4xx_hal_pwr.c
+ 0
+ 0
+
+
+ 4
+ 31
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c
+ stm32l4xx_hal_pwr_ex.c
+ 0
+ 0
+
+
+ 4
+ 32
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c
+ stm32l4xx_hal_cortex.c
+ 0
+ 0
+
+
+ 4
+ 33
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc_ex.c
+ stm32l4xx_hal_adc_ex.c
+ 0
+ 0
+
+
+ 4
+ 34
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc.c
+ stm32l4xx_hal_adc.c
+ 0
+ 0
+
+
+ 4
+ 35
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac.c
+ stm32l4xx_hal_dac.c
+ 0
+ 0
+
+
+ 4
+ 36
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac_ex.c
+ stm32l4xx_hal_dac_ex.c
+ 0
+ 0
+
+
+ 4
+ 37
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi.c
+ stm32l4xx_hal_spi.c
+ 0
+ 0
+
+
+ 4
+ 38
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi_ex.c
+ stm32l4xx_hal_spi_ex.c
+ 0
+ 0
+
+
+ 4
+ 39
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_sdmmc.c
+ stm32l4xx_ll_sdmmc.c
+ 0
+ 0
+
+
+ 4
+ 40
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sd.c
+ stm32l4xx_hal_sd.c
+ 0
+ 0
+
+
+ 4
+ 41
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sd_ex.c
+ stm32l4xx_hal_sd_ex.c
0
0
@@ -569,73 +799,61 @@
0
0
0
+
+ 5
+ 42
+ 1
+ 0
+ 0
+ 0
+ ..\..\BSP\Src\system_stm32l4xx.c
+ system_stm32l4xx.c
+ 0
+ 0
+
+
+
+
+ Hardware
+ 0
+ 0
+ 0
+ 0
6
- 26
+ 43
1
0
0
0
- ..\..\BSP\Src\system_stm32f1xx.c
- system_stm32f1xx.c
+ ..\..\BSP\Hardware\DHT11\DHT11_BUS.c
+ DHT11_BUS.c
+ 0
+ 0
+
+
+ 6
+ 44
+ 1
+ 0
+ 0
+ 0
+ ..\..\BSP\Hardware\OLED\oled.c
+ oled.c
0
0
- tos/arch
+ kernel
0
0
0
0
7
- 27
- 1
- 0
- 0
- 0
- ..\..\..\..\arch\arm\arm-v7m\common\tos_cpu.c
- tos_cpu.c
- 0
- 0
-
-
- 7
- 28
- 1
- 0
- 0
- 0
- ..\..\..\..\arch\arm\arm-v7m\cortex-m3\armcc\port_c.c
- port_c.c
- 0
- 0
-
-
- 7
- 29
- 2
- 0
- 0
- 0
- ..\..\..\..\arch\arm\arm-v7m\cortex-m3\armcc\port_s.S
- port_s.S
- 0
- 0
-
-
-
-
- tos/kernel
- 0
- 0
- 0
- 0
-
- 8
- 30
+ 45
1
0
0
@@ -646,8 +864,8 @@
0
- 8
- 31
+ 7
+ 46
1
0
0
@@ -658,8 +876,8 @@
0
- 8
- 32
+ 7
+ 47
1
0
0
@@ -670,8 +888,8 @@
0
- 8
- 33
+ 7
+ 48
1
0
0
@@ -682,8 +900,8 @@
0
- 8
- 34
+ 7
+ 49
1
0
0
@@ -694,8 +912,8 @@
0
- 8
- 35
+ 7
+ 50
1
0
0
@@ -706,8 +924,8 @@
0
- 8
- 36
+ 7
+ 51
1
0
0
@@ -718,8 +936,8 @@
0
- 8
- 37
+ 7
+ 52
1
0
0
@@ -730,8 +948,8 @@
0
- 8
- 38
+ 7
+ 53
1
0
0
@@ -742,8 +960,8 @@
0
- 8
- 39
+ 7
+ 54
1
0
0
@@ -754,8 +972,8 @@
0
- 8
- 40
+ 7
+ 55
1
0
0
@@ -766,8 +984,8 @@
0
- 8
- 41
+ 7
+ 56
1
0
0
@@ -778,8 +996,8 @@
0
- 8
- 42
+ 7
+ 57
1
0
0
@@ -790,8 +1008,8 @@
0
- 8
- 43
+ 7
+ 58
1
0
0
@@ -802,8 +1020,8 @@
0
- 8
- 44
+ 7
+ 59
1
0
0
@@ -814,8 +1032,8 @@
0
- 8
- 45
+ 7
+ 60
1
0
0
@@ -826,8 +1044,8 @@
0
- 8
- 46
+ 7
+ 61
1
0
0
@@ -838,8 +1056,8 @@
0
- 8
- 47
+ 7
+ 62
1
0
0
@@ -850,8 +1068,8 @@
0
- 8
- 48
+ 7
+ 63
1
0
0
@@ -862,8 +1080,8 @@
0
- 8
- 49
+ 7
+ 64
1
0
0
@@ -874,8 +1092,8 @@
0
- 8
- 50
+ 7
+ 65
1
0
0
@@ -886,8 +1104,8 @@
0
- 8
- 51
+ 7
+ 66
1
0
0
@@ -898,8 +1116,8 @@
0
- 8
- 52
+ 7
+ 67
1
0
0
@@ -910,8 +1128,8 @@
0
- 8
- 53
+ 7
+ 68
1
0
0
@@ -921,29 +1139,61 @@
0
0
+
+
+
+ cpu
+ 0
+ 0
+ 0
+ 0
8
- 54
+ 69
+ 2
+ 0
+ 0
+ 0
+ ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_s.S
+ port_s.S
+ 0
+ 0
+
+
+ 8
+ 70
1
0
0
0
- ..\..\..\..\kernel\core\tos_stopwatch.c
- tos_stopwatch.c
+ ..\..\..\..\arch\arm\arm-v7m\common\tos_cpu.c
+ tos_cpu.c
+ 0
+ 0
+
+
+ 8
+ 71
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_c.c
+ port_c.c
0
0
- tos/cmsis
+ cmsis
0
0
0
0
9
- 55
+ 72
1
0
0
@@ -956,484 +1206,244 @@
- tos/at
+ config
0
0
0
0
10
- 56
- 1
+ 73
+ 5
0
0
0
- ..\..\..\..\net\at\src\tos_at.c
- tos_at.c
+ ..\..\TOS-CONFIG\tos_config.h
+ tos_config.h
0
0
- tos/sal
+ fatfs
0
0
0
0
11
- 57
+ 74
1
0
0
0
- ..\..\..\..\net\sal_module_wrapper\sal_module_wrapper.c
- sal_module_wrapper.c
+ ..\..\..\..\components\fs\fatfs\wrapper\tos_diskio.c
+ tos_diskio.c
+ 0
+ 0
+
+
+ 11
+ 75
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\components\fs\fatfs\wrapper\tos_fatfs_drv.c
+ tos_fatfs_drv.c
+ 0
+ 0
+
+
+ 11
+ 76
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\components\fs\fatfs\wrapper\tos_fatfs_vfs.c
+ tos_fatfs_vfs.c
+ 0
+ 0
+
+
+ 11
+ 77
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\components\fs\fatfs\wrapper\tos_ff.c
+ tos_ff.c
+ 0
+ 0
+
+
+ 11
+ 78
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\components\fs\fatfs\wrapper\tos_ffsystem.c
+ tos_ffsystem.c
+ 0
+ 0
+
+
+ 11
+ 79
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\components\fs\fatfs\wrapper\tos_ffunicode.c
+ tos_ffunicode.c
0
0
- tos/hal
+ vfs
0
0
0
0
12
- 58
+ 80
1
0
0
0
- ..\..\BSP\Src\tos_hal_uart.c
- tos_hal_uart.c
+ ..\..\..\..\components\fs\vfs\tos_vfs.c
+ tos_vfs.c
+ 0
+ 0
+
+
+ 12
+ 81
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\components\fs\vfs\tos_vfs_device.c
+ tos_vfs_device.c
+ 0
+ 0
+
+
+ 12
+ 82
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\components\fs\vfs\tos_vfs_file.c
+ tos_vfs_file.c
+ 0
+ 0
+
+
+ 12
+ 83
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\components\fs\vfs\tos_vfs_fs.c
+ tos_vfs_fs.c
+ 0
+ 0
+
+
+ 12
+ 84
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\components\fs\vfs\tos_vfs_inode.c
+ tos_vfs_inode.c
0
0
- tos/devices
+ hal
0
0
0
0
13
- 59
+ 85
1
0
0
0
- ..\..\..\..\devices\esp8266\esp8266.c
- esp8266.c
+ ..\..\..\..\platform\hal\st\stm32l4xx\src\tos_hal_sd.c
+ tos_hal_sd.c
0
0
- mqttclient
+ elfloader/shared_object
0
0
0
0
14
- 60
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\mqttclient\mqttclient.c
- mqttclient.c
- 0
- 0
-
-
-
-
- mqttclient/mqtt
- 0
- 0
- 0
- 0
-
- 15
- 61
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\mqtt\MQTTConnectClient.c
- MQTTConnectClient.c
- 0
- 0
-
-
- 15
- 62
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\mqtt\MQTTConnectServer.c
- MQTTConnectServer.c
- 0
- 0
-
-
- 15
- 63
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\mqtt\MQTTDeserializePublish.c
- MQTTDeserializePublish.c
- 0
- 0
-
-
- 15
- 64
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\mqtt\MQTTFormat.c
- MQTTFormat.c
- 0
- 0
-
-
- 15
- 65
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\mqtt\MQTTPacket.c
- MQTTPacket.c
- 0
- 0
-
-
- 15
- 66
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\mqtt\MQTTSerializePublish.c
- MQTTSerializePublish.c
- 0
- 0
-
-
- 15
- 67
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\mqtt\MQTTSubscribeClient.c
- MQTTSubscribeClient.c
- 0
- 0
-
-
- 15
- 68
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\mqtt\MQTTSubscribeServer.c
- MQTTSubscribeServer.c
- 0
- 0
-
-
- 15
- 69
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\mqtt\MQTTUnsubscribeClient.c
- MQTTUnsubscribeClient.c
- 0
- 0
-
-
- 15
- 70
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\mqtt\MQTTUnsubscribeServer.c
- MQTTUnsubscribeServer.c
- 0
- 0
-
-
-
-
- mqttclient/salof
- 0
- 0
- 0
- 0
-
- 16
- 71
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\common\log\fifo.c
- fifo.c
- 0
- 0
-
-
- 16
- 72
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\common\log\format.c
- format.c
- 0
- 0
-
-
- 16
- 73
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\common\log\salof.c
- salof.c
- 0
- 0
-
-
- 16
- 74
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\common\log\arch\tencentos-tiny\arch.c
- arch.c
- 0
- 0
-
-
- 16
- 75
- 5
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\common\log\salof_config.h
- salof_config.h
- 0
- 0
-
-
-
-
- mqttclient/common
- 0
- 0
- 0
- 0
-
- 17
- 76
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\common\list.c
- list.c
- 0
- 0
-
-
- 17
- 77
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\common\random.c
- random.c
- 0
- 0
-
-
- 17
- 78
- 5
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\common\log.h
- log.h
- 0
- 0
-
-
- 17
- 79
- 5
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\common\error.h
- error.h
- 0
- 0
-
-
-
-
- mqttclient/network
- 0
- 0
- 0
- 0
-
- 18
- 80
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\network\network.c
- network.c
- 0
- 0
-
-
-
-
- mqttclient/platform
- 0
- 0
- 0
- 0
-
- 19
- 81
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_memory.c
- platform_memory.c
- 0
- 0
-
-
- 19
- 82
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_mutex.c
- platform_mutex.c
- 0
- 0
-
-
- 19
- 83
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_net_socket.c
- platform_net_socket.c
- 0
- 0
-
-
- 19
- 84
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_nettype_tcp.c
- platform_nettype_tcp.c
- 0
- 0
-
-
- 19
- 85
- 1
- 0
- 0
- 0
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_nettype_tls.c
- platform_nettype_tls.c
- 0
- 0
-
-
- 19
86
1
0
0
0
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_thread.c
- platform_thread.c
+ ..\..\..\..\components\elfloader\shared_object\tos_elfloader_shared_object.c
+ tos_elfloader_shared_object.c
0
0
- 19
+ 14
87
1
0
0
0
- ..\..\..\..\components\connectivity\mqttclient\platform\TencentOS-tiny\platform_timer.c
- platform_timer.c
+ ..\..\..\..\components\elfloader\common\tos_elfloader_fd_read-vfs.c
+ tos_elfloader_fd_read-vfs.c
0
0
-
-
-
- mqttclient/config
- 0
- 0
- 0
- 0
- 20
+ 14
88
- 5
+ 1
0
0
0
- ..\..\TOS-CONFIG\mqtt_config.h
- mqtt_config.h
+ ..\..\..\..\components\elfloader\common\tos_elfloader_symtab.c
+ tos_elfloader_symtab.c
+ 0
+ 0
+
+
+ 14
+ 89
+ 1
+ 0
+ 0
+ 0
+ ..\..\..\..\components\elfloader\common\tos_elfloader_relocate-arm.c
+ tos_elfloader_relocate-arm.c
0
0
diff --git a/board/TencentOS_tiny_EVB_MX_Plus/KEIL/elfloader_shared_object/TencentOS_tiny.uvprojx b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/elfloader_shared_object/TencentOS_tiny.uvprojx
new file mode 100644
index 00000000..71d65865
--- /dev/null
+++ b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/elfloader_shared_object/TencentOS_tiny.uvprojx
@@ -0,0 +1,917 @@
+
+
+
+ 2.1
+
+ ### uVision Project, (C) Keil Software
+
+
+
+ TencentOS_tiny
+ 0x4
+ ARM-ADS
+ 5060750::V5.06 update 6 (build 750)::ARMCC
+ 0
+
+
+ STM32L431RCTx
+ STMicroelectronics
+ Keil.STM32L4xx_DFP.2.0.0
+ http://www.keil.com/pack
+ IRAM(0x20000000-0x2000FFFF) IROM(0x8000000-0x803FFFF) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $$Device:STM32L431RCTx$CMSIS\SVD\STM32L4x1.svd
+ 0
+ 0
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+ 1
+
+ .\obj\
+ TencentOS_tiny
+ 1
+ 0
+ 1
+ 1
+ 0
+ .\list\
+ 1
+ 0
+ 0
+
+ 0
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+ 0
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+ 0
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 0
+ 0
+ 0
+ 3
+
+
+ 0
+
+
+ SARMCM3.DLL
+ -REMAP -MPU
+ DCM.DLL
+ -pCM4
+ SARMCM3.DLL
+ -MPU
+ TCM.DLL
+ -pCM4
+
+
+
+ 1
+ 0
+ 0
+ 0
+ 16
+
+
+
+
+ 1
+ 0
+ 0
+ 1
+ 1
+ 4107
+
+ 1
+ STLink\ST-LINKIII-KEIL_SWO.dll
+
+
+
+
+
+ 0
+
+
+
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 0
+ 1
+ 1
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 0
+ 0
+ "Cortex-M4"
+
+ 0
+ 0
+ 0
+ 1
+ 1
+ 0
+ 0
+ 2
+ 0
+ 0
+ 0
+ 8
+ 1
+ 0
+ 0
+ 0
+ 3
+ 3
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+
+
+ 0
+ 0x0
+ 0x0
+
+
+ 0
+ 0x0
+ 0x0
+
+
+ 0
+ 0x0
+ 0x0
+
+
+ 0
+ 0x0
+ 0x0
+
+
+ 0
+ 0x0
+ 0x0
+
+
+ 0
+ 0x0
+ 0x0
+
+
+ 0
+ 0x20000000
+ 0x10000
+
+
+ 1
+ 0x8000000
+ 0x40000
+
+
+ 0
+ 0x0
+ 0x0
+
+
+ 1
+ 0x0
+ 0x0
+
+
+ 1
+ 0x0
+ 0x0
+
+
+ 1
+ 0x0
+ 0x0
+
+
+ 1
+ 0x8000000
+ 0x40000
+
+
+ 1
+ 0x0
+ 0x0
+
+
+ 0
+ 0x0
+ 0x0
+
+
+ 0
+ 0x0
+ 0x0
+
+
+ 0
+ 0x0
+ 0x0
+
+
+ 0
+ 0x20000000
+ 0x10000
+
+
+ 0
+ 0x0
+ 0x0
+
+
+
+
+
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 2
+ 0
+ 0
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+
+
+ USE_HAL_DRIVER,STM32L431xx,WITH_TOS_NET_ADAPTER,USE_ESP8266
+
+ ..\..\BSP\Inc;..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Inc;..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Legacy;..\..\..\..\platform\vendor_bsp\st\CMSIS\Device\ST\STM32L4xx\Include;..\..\..\..\platform\vendor_bsp\st\CMSIS\Include;..\..\..\..\kernel\core\include;..\..\TOS-CONFIG;..\..\..\..\platform\arch\arm\cortex-m4\keil;..\..\..\..\kernel\pm\include;..\..\..\..\osal\cmsis_os;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\BSP\Hardware\DHT11;..\..\BSP\Hardware\OLED;..\..\BSP\Hardware\BH1750;..\..\..\..\examples\helloworld;..\..\..\..\components\fs\vfs\include;..\..\..\..\components\fs\fatfs\wrapper\include;..\..\..\..\kernel\hal\include;..\..\..\..\components\fs\fatfs\3rdparty;..\..\..\..\components\elfloader\common\include
+
+
+
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+
+
+ 1
+ 0
+ 0
+ 0
+ 1
+ 0
+ 0x08000000
+ 0x20000000
+
+
+
+
+
+
+
+
+
+
+
+
+ Application/MDK-ARM
+
+
+ startup_stm32l431xx.s
+ 2
+ startup_stm32l431xx.s
+
+
+
+
+ Application/User
+
+
+ gpio.c
+ 1
+ ..\..\BSP\Src\gpio.c
+
+
+ main.c
+ 1
+ ..\..\BSP\Src\main.c
+
+
+ mcu_init.c
+ 1
+ ..\..\BSP\Src\mcu_init.c
+
+
+ stm32l4xx_hal_msp.c
+ 1
+ ..\..\BSP\Src\stm32l4xx_hal_msp.c
+
+
+ stm32l4xx_it.c
+ 1
+ ..\..\BSP\Src\stm32l4xx_it.c
+
+
+ usart.c
+ 1
+ ..\..\BSP\Src\usart.c
+
+
+ adc.c
+ 1
+ ..\..\BSP\Src\adc.c
+
+
+ dac.c
+ 1
+ ..\..\BSP\Src\dac.c
+
+
+ i2c.c
+ 1
+ ..\..\BSP\Src\i2c.c
+
+
+ spi.c
+ 1
+ ..\..\BSP\Src\spi.c
+
+
+ tim.c
+ 1
+ ..\..\BSP\Src\tim.c
+
+
+ sdmmc.c
+ 1
+ ..\..\BSP\Src\sdmmc.c
+
+
+
+
+ examples
+
+
+ elfloader_shared_object.c
+ 1
+ ..\..\..\..\examples\elfloader_shared_object\elfloader_shared_object.c
+
+
+
+
+ Drivers/STM32L4xx_HAL_Driver
+
+
+ stm32l4xx_hal_tim.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c
+
+
+ stm32l4xx_hal_tim_ex.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c
+
+
+ stm32l4xx_hal_uart.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c
+
+
+ stm32l4xx_hal_uart_ex.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c
+
+
+ stm32l4xx_hal.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c
+
+
+ stm32l4xx_hal_i2c.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c
+
+
+ stm32l4xx_hal_i2c_ex.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c
+
+
+ stm32l4xx_hal_rcc.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c
+
+
+ stm32l4xx_hal_rcc_ex.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c
+
+
+ stm32l4xx_hal_flash.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c
+
+
+ stm32l4xx_hal_flash_ex.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c
+
+
+ stm32l4xx_hal_flash_ramfunc.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c
+
+
+ stm32l4xx_hal_gpio.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c
+
+
+ stm32l4xx_hal_dma.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c
+
+
+ stm32l4xx_hal_dma_ex.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c
+
+
+ stm32l4xx_hal_pwr.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c
+
+
+ stm32l4xx_hal_pwr_ex.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c
+
+
+ stm32l4xx_hal_cortex.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c
+
+
+ stm32l4xx_hal_adc_ex.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc_ex.c
+
+
+ stm32l4xx_hal_adc.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc.c
+
+
+ stm32l4xx_hal_dac.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac.c
+
+
+ stm32l4xx_hal_dac_ex.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac_ex.c
+
+
+ stm32l4xx_hal_spi.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi.c
+
+
+ stm32l4xx_hal_spi_ex.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi_ex.c
+
+
+ stm32l4xx_ll_sdmmc.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_sdmmc.c
+
+
+ stm32l4xx_hal_sd.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sd.c
+
+
+ stm32l4xx_hal_sd_ex.c
+ 1
+ ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sd_ex.c
+
+
+
+
+ Drivers/CMSIS
+
+
+ system_stm32l4xx.c
+ 1
+ ..\..\BSP\Src\system_stm32l4xx.c
+
+
+
+
+ Hardware
+
+
+ DHT11_BUS.c
+ 1
+ ..\..\BSP\Hardware\DHT11\DHT11_BUS.c
+
+
+ oled.c
+ 1
+ ..\..\BSP\Hardware\OLED\oled.c
+
+
+
+
+ kernel
+
+
+ tos_binary_heap.c
+ 1
+ ..\..\..\..\kernel\core\tos_binary_heap.c
+
+
+ tos_char_fifo.c
+ 1
+ ..\..\..\..\kernel\core\tos_char_fifo.c
+
+
+ tos_completion.c
+ 1
+ ..\..\..\..\kernel\core\tos_completion.c
+
+
+ tos_countdownlatch.c
+ 1
+ ..\..\..\..\kernel\core\tos_countdownlatch.c
+
+
+ tos_event.c
+ 1
+ ..\..\..\..\kernel\core\tos_event.c
+
+
+ tos_global.c
+ 1
+ ..\..\..\..\kernel\core\tos_global.c
+
+
+ tos_mail_queue.c
+ 1
+ ..\..\..\..\kernel\core\tos_mail_queue.c
+
+
+ tos_message_queue.c
+ 1
+ ..\..\..\..\kernel\core\tos_message_queue.c
+
+
+ tos_mmblk.c
+ 1
+ ..\..\..\..\kernel\core\tos_mmblk.c
+
+
+ tos_mmheap.c
+ 1
+ ..\..\..\..\kernel\core\tos_mmheap.c
+
+
+ tos_mutex.c
+ 1
+ ..\..\..\..\kernel\core\tos_mutex.c
+
+
+ tos_pend.c
+ 1
+ ..\..\..\..\kernel\core\tos_pend.c
+
+
+ tos_priority_mail_queue.c
+ 1
+ ..\..\..\..\kernel\core\tos_priority_mail_queue.c
+
+
+ tos_priority_message_queue.c
+ 1
+ ..\..\..\..\kernel\core\tos_priority_message_queue.c
+
+
+ tos_priority_queue.c
+ 1
+ ..\..\..\..\kernel\core\tos_priority_queue.c
+
+
+ tos_ring_queue.c
+ 1
+ ..\..\..\..\kernel\core\tos_ring_queue.c
+
+
+ tos_robin.c
+ 1
+ ..\..\..\..\kernel\core\tos_robin.c
+
+
+ tos_sched.c
+ 1
+ ..\..\..\..\kernel\core\tos_sched.c
+
+
+ tos_sem.c
+ 1
+ ..\..\..\..\kernel\core\tos_sem.c
+
+
+ tos_sys.c
+ 1
+ ..\..\..\..\kernel\core\tos_sys.c
+
+
+ tos_task.c
+ 1
+ ..\..\..\..\kernel\core\tos_task.c
+
+
+ tos_tick.c
+ 1
+ ..\..\..\..\kernel\core\tos_tick.c
+
+
+ tos_time.c
+ 1
+ ..\..\..\..\kernel\core\tos_time.c
+
+
+ tos_timer.c
+ 1
+ ..\..\..\..\kernel\core\tos_timer.c
+
+
+
+
+ cpu
+
+
+ port_s.S
+ 2
+ ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_s.S
+
+
+ tos_cpu.c
+ 1
+ ..\..\..\..\arch\arm\arm-v7m\common\tos_cpu.c
+
+
+ port_c.c
+ 1
+ ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_c.c
+
+
+
+
+ cmsis
+
+
+ cmsis_os.c
+ 1
+ ..\..\..\..\osal\cmsis_os\cmsis_os.c
+
+
+
+
+ config
+
+
+ tos_config.h
+ 5
+ ..\..\TOS-CONFIG\tos_config.h
+
+
+
+
+ fatfs
+
+
+ tos_diskio.c
+ 1
+ ..\..\..\..\components\fs\fatfs\wrapper\tos_diskio.c
+
+
+ tos_fatfs_drv.c
+ 1
+ ..\..\..\..\components\fs\fatfs\wrapper\tos_fatfs_drv.c
+
+
+ tos_fatfs_vfs.c
+ 1
+ ..\..\..\..\components\fs\fatfs\wrapper\tos_fatfs_vfs.c
+
+
+ tos_ff.c
+ 1
+ ..\..\..\..\components\fs\fatfs\wrapper\tos_ff.c
+
+
+ tos_ffsystem.c
+ 1
+ ..\..\..\..\components\fs\fatfs\wrapper\tos_ffsystem.c
+
+
+ tos_ffunicode.c
+ 1
+ ..\..\..\..\components\fs\fatfs\wrapper\tos_ffunicode.c
+
+
+
+
+ vfs
+
+
+ tos_vfs.c
+ 1
+ ..\..\..\..\components\fs\vfs\tos_vfs.c
+
+
+ tos_vfs_device.c
+ 1
+ ..\..\..\..\components\fs\vfs\tos_vfs_device.c
+
+
+ tos_vfs_file.c
+ 1
+ ..\..\..\..\components\fs\vfs\tos_vfs_file.c
+
+
+ tos_vfs_fs.c
+ 1
+ ..\..\..\..\components\fs\vfs\tos_vfs_fs.c
+
+
+ tos_vfs_inode.c
+ 1
+ ..\..\..\..\components\fs\vfs\tos_vfs_inode.c
+
+
+
+
+ hal
+
+
+ tos_hal_sd.c
+ 1
+ ..\..\..\..\platform\hal\st\stm32l4xx\src\tos_hal_sd.c
+
+
+
+
+ elfloader/shared_object
+
+
+ tos_elfloader_shared_object.c
+ 1
+ ..\..\..\..\components\elfloader\shared_object\tos_elfloader_shared_object.c
+
+
+ tos_elfloader_fd_read-vfs.c
+ 1
+ ..\..\..\..\components\elfloader\common\tos_elfloader_fd_read-vfs.c
+
+
+ tos_elfloader_symtab.c
+ 1
+ ..\..\..\..\components\elfloader\common\tos_elfloader_symtab.c
+
+
+ tos_elfloader_relocate-arm.c
+ 1
+ ..\..\..\..\components\elfloader\common\tos_elfloader_relocate-arm.c
+
+
+
+
+ ::CMSIS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/board/TencentOS_tiny_EVB_MX_Plus/KEIL/elfloader_shared_object/startup_stm32l431xx.s b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/elfloader_shared_object/startup_stm32l431xx.s
new file mode 100644
index 00000000..6a5c15a5
--- /dev/null
+++ b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/elfloader_shared_object/startup_stm32l431xx.s
@@ -0,0 +1,404 @@
+;********************** COPYRIGHT(c) 2017 STMicroelectronics ******************
+;* File Name : startup_stm32l431xx.s
+;* Author : MCD Application Team
+;* Description : STM32L431xx Ultra Low Power devices vector table for MDK-ARM toolchain.
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == Reset_Handler
+;* - Set the vector table entries with the exceptions ISR address
+;* - Branches to __main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;* <<< Use Configuration Wizard in Context Menu >>>
+;*******************************************************************************
+;*
+;* Redistribution and use in source and binary forms, with or without modification,
+;* are permitted provided that the following conditions are met:
+;* 1. Redistributions of source code must retain the above copyright notice,
+;* this list of conditions and the following disclaimer.
+;* 2. Redistributions in binary form must reproduce the above copyright notice,
+;* this list of conditions and the following disclaimer in the documentation
+;* and/or other materials provided with the distribution.
+;* 3. Neither the name of STMicroelectronics nor the names of its contributors
+;* may be used to endorse or promote products derived from this software
+;* without specific prior written permission.
+;*
+;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+;*
+;*******************************************************************************
+;
+; Amount of memory (in bytes) allocated for Stack
+; Tailor this value to your application needs
+; Stack Configuration
+; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+
+Stack_Size EQU 0x100
+
+ AREA STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem SPACE Stack_Size
+__initial_sp
+
+
+; Heap Configuration
+; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+
+Heap_Size EQU 0x100
+
+ AREA HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+Heap_Mem SPACE Heap_Size
+__heap_limit
+
+ PRESERVE8
+ THUMB
+
+
+; Vector Table Mapped to Address 0 at Reset
+ AREA RESET, DATA, READONLY
+ EXPORT __Vectors
+ EXPORT __Vectors_End
+ EXPORT __Vectors_Size
+
+__Vectors DCD __initial_sp ; Top of Stack
+ DCD Reset_Handler ; Reset Handler
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD/PVM1/PVM2/PVM3/PVM4 through EXTI Line detection
+ DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line
+ DCD FLASH_IRQHandler ; FLASH
+ DCD RCC_IRQHandler ; RCC
+ DCD EXTI0_IRQHandler ; EXTI Line0
+ DCD EXTI1_IRQHandler ; EXTI Line1
+ DCD EXTI2_IRQHandler ; EXTI Line2
+ DCD EXTI3_IRQHandler ; EXTI Line3
+ DCD EXTI4_IRQHandler ; EXTI Line4
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
+ DCD ADC1_IRQHandler ; ADC1
+ DCD CAN1_TX_IRQHandler ; CAN1 TX
+ DCD CAN1_RX0_IRQHandler ; CAN1 RX0
+ DCD CAN1_RX1_IRQHandler ; CAN1 RX1
+ DCD CAN1_SCE_IRQHandler ; CAN1 SCE
+ DCD EXTI9_5_IRQHandler ; External Line[9:5]s
+ DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16
+ DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
+ DCD TIM2_IRQHandler ; TIM2
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD I2C1_EV_IRQHandler ; I2C1 Event
+ DCD I2C1_ER_IRQHandler ; I2C1 Error
+ DCD I2C2_EV_IRQHandler ; I2C2 Event
+ DCD I2C2_ER_IRQHandler ; I2C2 Error
+ DCD SPI1_IRQHandler ; SPI1
+ DCD SPI2_IRQHandler ; SPI2
+ DCD USART1_IRQHandler ; USART1
+ DCD USART2_IRQHandler ; USART2
+ DCD USART3_IRQHandler ; USART3
+ DCD EXTI15_10_IRQHandler ; External Line[15:10]
+ DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SDMMC1_IRQHandler ; SDMMC1
+ DCD 0 ; Reserved
+ DCD SPI3_IRQHandler ; SPI3
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD TIM6_DAC_IRQHandler ; TIM6 and DAC1&2 underrun errors
+ DCD TIM7_IRQHandler ; TIM7
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD COMP_IRQHandler ; COMP Interrupt
+ DCD LPTIM1_IRQHandler ; LP TIM1 interrupt
+ DCD LPTIM2_IRQHandler ; LP TIM2 interrupt
+ DCD 0 ; Reserved
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7
+ DCD LPUART1_IRQHandler ; LP UART1 interrupt
+ DCD QUADSPI_IRQHandler ; Quad SPI global interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 event
+ DCD I2C3_ER_IRQHandler ; I2C3 error
+ DCD SAI1_IRQHandler ; Serial Audio Interface 1 global interrupt
+ DCD 0 ; Reserved
+ DCD SWPMI1_IRQHandler ; Serial Wire Interface 1 global interrupt
+ DCD TSC_IRQHandler ; Touch Sense Controller global interrupt
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD RNG_IRQHandler ; RNG global interrupt
+ DCD FPU_IRQHandler ; FPU
+ DCD CRS_IRQHandler ; CRS interrupt
+
+__Vectors_End
+
+__Vectors_Size EQU __Vectors_End - __Vectors
+
+ AREA |.text|, CODE, READONLY
+
+; Reset handler
+Reset_Handler PROC
+ EXPORT Reset_Handler [WEAK]
+ IMPORT SystemInit
+ IMPORT __main
+
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__main
+ BX R0
+ ENDP
+
+; Dummy Exception Handlers (infinite loops which can be modified)
+
+NMI_Handler PROC
+ EXPORT NMI_Handler [WEAK]
+ B .
+ ENDP
+HardFault_Handler\
+ PROC
+ EXPORT HardFault_Handler [WEAK]
+ B .
+ ENDP
+MemManage_Handler\
+ PROC
+ EXPORT MemManage_Handler [WEAK]
+ B .
+ ENDP
+BusFault_Handler\
+ PROC
+ EXPORT BusFault_Handler [WEAK]
+ B .
+ ENDP
+UsageFault_Handler\
+ PROC
+ EXPORT UsageFault_Handler [WEAK]
+ B .
+ ENDP
+SVC_Handler PROC
+ EXPORT SVC_Handler [WEAK]
+ B .
+ ENDP
+DebugMon_Handler\
+ PROC
+ EXPORT DebugMon_Handler [WEAK]
+ B .
+ ENDP
+PendSV_Handler PROC
+ EXPORT PendSV_Handler [WEAK]
+ B .
+ ENDP
+SysTick_Handler PROC
+ EXPORT SysTick_Handler [WEAK]
+ B .
+ ENDP
+
+Default_Handler PROC
+
+ EXPORT WWDG_IRQHandler [WEAK]
+ EXPORT PVD_PVM_IRQHandler [WEAK]
+ EXPORT TAMP_STAMP_IRQHandler [WEAK]
+ EXPORT RTC_WKUP_IRQHandler [WEAK]
+ EXPORT FLASH_IRQHandler [WEAK]
+ EXPORT RCC_IRQHandler [WEAK]
+ EXPORT EXTI0_IRQHandler [WEAK]
+ EXPORT EXTI1_IRQHandler [WEAK]
+ EXPORT EXTI2_IRQHandler [WEAK]
+ EXPORT EXTI3_IRQHandler [WEAK]
+ EXPORT EXTI4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel1_IRQHandler [WEAK]
+ EXPORT DMA1_Channel2_IRQHandler [WEAK]
+ EXPORT DMA1_Channel3_IRQHandler [WEAK]
+ EXPORT DMA1_Channel4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel5_IRQHandler [WEAK]
+ EXPORT DMA1_Channel6_IRQHandler [WEAK]
+ EXPORT DMA1_Channel7_IRQHandler [WEAK]
+ EXPORT ADC1_IRQHandler [WEAK]
+ EXPORT CAN1_TX_IRQHandler [WEAK]
+ EXPORT CAN1_RX0_IRQHandler [WEAK]
+ EXPORT CAN1_RX1_IRQHandler [WEAK]
+ EXPORT CAN1_SCE_IRQHandler [WEAK]
+ EXPORT EXTI9_5_IRQHandler [WEAK]
+ EXPORT TIM1_BRK_TIM15_IRQHandler [WEAK]
+ EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
+ EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
+ EXPORT TIM1_CC_IRQHandler [WEAK]
+ EXPORT TIM2_IRQHandler [WEAK]
+ EXPORT I2C1_EV_IRQHandler [WEAK]
+ EXPORT I2C1_ER_IRQHandler [WEAK]
+ EXPORT I2C2_EV_IRQHandler [WEAK]
+ EXPORT I2C2_ER_IRQHandler [WEAK]
+ EXPORT SPI1_IRQHandler [WEAK]
+ EXPORT SPI2_IRQHandler [WEAK]
+ EXPORT USART1_IRQHandler [WEAK]
+ EXPORT USART2_IRQHandler [WEAK]
+ EXPORT USART3_IRQHandler [WEAK]
+ EXPORT EXTI15_10_IRQHandler [WEAK]
+ EXPORT RTC_Alarm_IRQHandler [WEAK]
+ EXPORT SDMMC1_IRQHandler [WEAK]
+ EXPORT SPI3_IRQHandler [WEAK]
+ EXPORT TIM6_DAC_IRQHandler [WEAK]
+ EXPORT TIM7_IRQHandler [WEAK]
+ EXPORT DMA2_Channel1_IRQHandler [WEAK]
+ EXPORT DMA2_Channel2_IRQHandler [WEAK]
+ EXPORT DMA2_Channel3_IRQHandler [WEAK]
+ EXPORT DMA2_Channel4_IRQHandler [WEAK]
+ EXPORT DMA2_Channel5_IRQHandler [WEAK]
+ EXPORT COMP_IRQHandler [WEAK]
+ EXPORT LPTIM1_IRQHandler [WEAK]
+ EXPORT LPTIM2_IRQHandler [WEAK]
+ EXPORT DMA2_Channel6_IRQHandler [WEAK]
+ EXPORT DMA2_Channel7_IRQHandler [WEAK]
+ EXPORT LPUART1_IRQHandler [WEAK]
+ EXPORT QUADSPI_IRQHandler [WEAK]
+ EXPORT I2C3_EV_IRQHandler [WEAK]
+ EXPORT I2C3_ER_IRQHandler [WEAK]
+ EXPORT SAI1_IRQHandler [WEAK]
+ EXPORT SWPMI1_IRQHandler [WEAK]
+ EXPORT TSC_IRQHandler [WEAK]
+ EXPORT RNG_IRQHandler [WEAK]
+ EXPORT FPU_IRQHandler [WEAK]
+ EXPORT CRS_IRQHandler [WEAK]
+
+WWDG_IRQHandler
+PVD_PVM_IRQHandler
+TAMP_STAMP_IRQHandler
+RTC_WKUP_IRQHandler
+FLASH_IRQHandler
+RCC_IRQHandler
+EXTI0_IRQHandler
+EXTI1_IRQHandler
+EXTI2_IRQHandler
+EXTI3_IRQHandler
+EXTI4_IRQHandler
+DMA1_Channel1_IRQHandler
+DMA1_Channel2_IRQHandler
+DMA1_Channel3_IRQHandler
+DMA1_Channel4_IRQHandler
+DMA1_Channel5_IRQHandler
+DMA1_Channel6_IRQHandler
+DMA1_Channel7_IRQHandler
+ADC1_IRQHandler
+CAN1_TX_IRQHandler
+CAN1_RX0_IRQHandler
+CAN1_RX1_IRQHandler
+CAN1_SCE_IRQHandler
+EXTI9_5_IRQHandler
+TIM1_BRK_TIM15_IRQHandler
+TIM1_UP_TIM16_IRQHandler
+TIM1_TRG_COM_IRQHandler
+TIM1_CC_IRQHandler
+TIM2_IRQHandler
+I2C1_EV_IRQHandler
+I2C1_ER_IRQHandler
+I2C2_EV_IRQHandler
+I2C2_ER_IRQHandler
+SPI1_IRQHandler
+SPI2_IRQHandler
+USART1_IRQHandler
+USART2_IRQHandler
+USART3_IRQHandler
+EXTI15_10_IRQHandler
+RTC_Alarm_IRQHandler
+SDMMC1_IRQHandler
+SPI3_IRQHandler
+TIM6_DAC_IRQHandler
+TIM7_IRQHandler
+DMA2_Channel1_IRQHandler
+DMA2_Channel2_IRQHandler
+DMA2_Channel3_IRQHandler
+DMA2_Channel4_IRQHandler
+DMA2_Channel5_IRQHandler
+COMP_IRQHandler
+LPTIM1_IRQHandler
+LPTIM2_IRQHandler
+DMA2_Channel6_IRQHandler
+DMA2_Channel7_IRQHandler
+LPUART1_IRQHandler
+QUADSPI_IRQHandler
+I2C3_EV_IRQHandler
+I2C3_ER_IRQHandler
+SAI1_IRQHandler
+SWPMI1_IRQHandler
+TSC_IRQHandler
+RNG_IRQHandler
+FPU_IRQHandler
+CRS_IRQHandler
+
+ B .
+
+ ENDP
+
+ ALIGN
+
+;*******************************************************************************
+; User Stack and Heap initialization
+;*******************************************************************************
+ IF :DEF:__MICROLIB
+
+ EXPORT __initial_sp
+ EXPORT __heap_base
+ EXPORT __heap_limit
+
+ ELSE
+
+ IMPORT __use_two_region_memory
+ EXPORT __user_initial_stackheap
+
+__user_initial_stackheap
+
+ LDR R0, = Heap_Mem
+ LDR R1, =(Stack_Mem + Stack_Size)
+ LDR R2, = (Heap_Mem + Heap_Size)
+ LDR R3, = Stack_Mem
+ BX LR
+
+ ALIGN
+
+ ENDIF
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/components/connectivity/mqttclient/CMakeLists.txt b/components/connectivity/mqttclient/CMakeLists.txt
new file mode 100644
index 00000000..56473a9a
--- /dev/null
+++ b/components/connectivity/mqttclient/CMakeLists.txt
@@ -0,0 +1,42 @@
+cmake_minimum_required(VERSION 2.8)
+
+project(mqtt-client)
+
+set(TARGETS "mqtt-client")
+set(SUBDIRS "mqtt" "test" "platform" "network" "common" "mqttclient")
+set(INCDIRS "mqtt" "platform/linux" "common" "common/log" "network" "network/mbedtls/include" "mqttclient" "test")
+set(OUTDIRS "build")
+set(LIBNAMES "mqtt" "platform" "network" "common" "salof" "mbedtls" "mqttclient")
+set(PROJECT_ROOT_PATH "${PROJECT_SOURCE_DIR}")
+set(LIBRARY_OUTPUT_PATH "${PROJECT_ROOT_PATH}/${OUTDIRS}/lib/")
+set(EXECUTABLE_OUTPUT_PATH "${PROJECT_ROOT_PATH}/${OUTDIRS}/bin/")
+
+set(CMAKE_BUILD_TYPE "Release") # Debug Release
+set(CMAKE_LIB_TYPE "STATIC") # SHARED STATIC
+
+# set(CMAKE_C_COMPILER "gcc")
+# set(CMAKE_CXX_COMPILER "g++" )
+
+set(CMAKE_C_FLAGS "-Wall")
+set(CMAKE_C_FLAGS "-lpthread")
+set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -O0 -g -ggdb")
+set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3 -DNDEBUG")
+
+if(CMAKE_COMPILER_IS_GNUCXX)
+ set(CMAKE_CXX_FLAGS "-std=c++11")
+ set(CMAKE_CXX_FLAGS "-lpthread")
+ set(CMAKE_CXX_FLAGS "-Wall")
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0 -g -ggdb")
+ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O3")
+endif(CMAKE_COMPILER_IS_GNUCXX)
+
+foreach(incdir ${INCDIRS})
+ include_directories(${incdir})
+endforeach()
+
+foreach(subdir ${SUBDIRS})
+ add_subdirectory(${PROJECT_ROOT_PATH}/${subdir})
+endforeach()
+
+link_directories(${LIBRARY_OUTPUT_PATH})
+
diff --git a/components/connectivity/mqttclient/README.md b/components/connectivity/mqttclient/README.md
index 5e37fb89..c29ed2bb 100644
--- a/components/connectivity/mqttclient/README.md
+++ b/components/connectivity/mqttclient/README.md
@@ -1,31 +1,91 @@
+[](https://github.com/jiejieTop/mqttclient/releases)
+
+[](https://github.com/jiejieTop/mqttclient/blob/master/LICENSE)
+
+
+
+
+
+
+
+[English Documents](README.md)
+
# mqttclient
-**一个基于socket API之上的跨平å°MQTT客户端**
+**一个高性能ã€é«˜ç¨³å®šæ€§çš„跨平å°MQTT客户端**
-基于socket APIçš„MQTT客户端,拥有éžå¸¸ç®€æ´çš„API接å£ï¼Œä»¥æžå°‘的资æºå®žçްQOS2çš„æœåŠ¡è´¨é‡ï¼Œå¹¶ä¸”æ— ç¼è¡”接了mbedtlsåŠ å¯†åº“ã€‚
+一个高性能ã€é«˜ç¨³å®šæ€§çš„跨平å°MQTT客户端,基于socket API之上开å‘,å¯ä»¥åœ¨åµŒå…¥å¼è®¾å¤‡ï¼ˆFreeRTOS/LiteOS/RT-Thread/TencentOS tiny)ã€Linuxã€Windowsã€Mac上使用,拥有éžå¸¸ç®€æ´çš„API接å£ï¼Œä»¥æžå°‘的资æºå®žçްQOS2çš„æœåŠ¡è´¨é‡ï¼Œå¹¶ä¸”æ— ç¼è¡”接了mbedtlsåŠ å¯†åº“ã€‚
## 优势:
-- **åŸºäºŽæ ‡å‡†BSD socket之上开å‘**,åªè¦æ˜¯å…¼å®¹BSD socket的系统å‡å¯ä½¿ç”¨ã€‚
-- **稳定**ï¼šæ— è®ºæ˜¯`掉线é‡è¿ž`,`丢包é‡å‘`ï¼Œéƒ½æ˜¯ä¸¥æ ¼`éµå¾ªMQTTåè®®æ ‡å‡†`执行,除æ¤ä¹‹å¤–对**大数æ®é‡**çš„æµ‹è¯•æ— è®ºæ˜¯æ”¶æ˜¯å‘,都是éžå¸¸ç¨³å®šï¼ˆä¸€æ¬¡å‘é€`135K`æ•°æ®ï¼Œ3秒一次),高频测试也是éžå¸¸ç¨³å®šï¼ˆ7ä¸ªä¸»é¢˜åŒæ—¶æ”¶å‘,æ¯ç§’一次,也就是1ç§’14个mqtt报文,æœåŠ¡è´¨é‡QoS0ã€QoS1ã€QoS2éƒ½æœ‰ï¼‰ã€‚å› ä¸ºä½œè€…ä»¥æžå°‘的资æºè®¾è®¡äº†`记录机制`,对采用QoS1æœåŠ¡è´¨é‡çš„æŠ¥æ–‡å¿…é¡»ä¿è¯åˆ°è¾¾ä¸€æ¬¡ï¼Œå½“å‘布的主题(qos1ã€qos2都适用)没有被æœåŠ¡å™¨æ”¶åˆ°æ—¶ä¼šè‡ªåŠ¨é‡å‘,而对QoS2æœåŠ¡è´¨é‡çš„æŠ¥æ–‡ä¿è¯æœ‰ä¸”åªæœ‰å¤„ç†ä¸€æ¬¡ï¼ˆå¦‚æžœä¸ç›¸ä¿¡å®ƒç¨³å®šæ€§çš„åŒå¦å¯ä»¥è‡ªå·±åŽ»ä¿®æ”¹æºç ,专门为QoS2æœåŠ¡è´¨é‡åŽ»åšæµ‹è¯•,故æ„ä¸å›žå¤`PUBREC`包,让æœåС噍é‡å‘QoS2æŠ¥æ–‡ï¼Œä¸”çœ‹çœ‹å®¢æˆ·ç«¯æ˜¯å¦æœ‰ä¸”åªæœ‰å¤„ç†ä¸€æ¬¡ï¼‰ï¼Œè€Œå¯¹äºŽæŽ‰çº¿é‡è¿žçš„稳定性,这ç§åˆ™æ˜¯**基本æ“作**了,没啥好说的,在自动é‡è¿žåŽè¿˜ä¼šè‡ªåЍ釿–°è®¢é˜…主题,ä¿è¯ä¸»é¢˜ä¸ä¼šä¸¢å¤±ï¼Œå› æ¤åœ¨æµ‹è¯•ä¸ç¨³å®šæ€§æžå¥½ã€‚
+- **具有æžé«˜çš„稳定性**ï¼šæ— è®ºæ˜¯**掉线é‡è¿ž**,**丢包é‡å‘**,都是**ä¸¥æ ¼éµå¾ªMQTTåè®®æ ‡å‡†**执行,除æ¤ä¹‹å¤–对**大数æ®é‡**çš„æµ‹è¯•æ— è®ºæ˜¯æ”¶æ˜¯å‘,都是éžå¸¸ç¨³å®šï¼Œ**高频**测试也是éžå¸¸ç¨³å®šã€‚
-- **è½»é‡çº§**:整个代ç 工程æžå…¶ç®€å•,ä¸ä½¿ç”¨mbedtls情况下,å ç”¨èµ„æºæžå°‘,作者曾使用esp8266æ¨¡ç»„ä¸Žäº‘ç«¯é€šä¿¡ï¼Œæ•´ä¸ªå·¥ç¨‹ä»£ç æ¶ˆè€—çš„RAMä¸è¶³15k(包括系统å 用的开销,对数æ®çš„处ç†å¼€é”€ï¼Œè€Œæ¤æ¬¡è¿˜æ˜¯æœªä¼˜åŒ–çš„æƒ…å†µä¸‹ï¼Œè¿˜ä¾æ—§å®Œç¾Žä¿ç•™äº†æŽ‰çº¿é‡è¿žçš„稳定性,但是对应qos1ã€qos2æœåŠ¡è´¨é‡çš„æŠ¥æ–‡åˆ™æœªåšæµ‹è¯•ï¼Œå› ä¸ºSTM32F103C8T6芯片资æºå®žåœ¨æ˜¯å¤ªå°‘了,折腾ä¸èµ·ï¼‰ã€‚
+- **è½»é‡çº§**:整个代ç 工程æžå…¶ç®€å•,ä¸ä½¿ç”¨mbedtls情况下,å ç”¨èµ„æºæžå°‘,作者曾使用esp8266æ¨¡ç»„ä¸Žäº‘ç«¯é€šä¿¡ï¼Œæ•´ä¸ªå·¥ç¨‹ä»£ç æ¶ˆè€—çš„RAMä¸è¶³15k。
-- **æ— ç¼è¡”接mbedtlsåŠ å¯†ä¼ è¾“**ï¼Œè®©ç½‘ç»œä¼ è¾“æ›´åŠ å®‰å…¨ï¼Œè€Œä¸”æŽ¥å£å±‚完全ä¸éœ€è¦ç”¨æˆ·ç†ä¼šï¼Œæ— 论是å¦åŠ å¯†ï¼Œmqttclient对用户æä¾›çš„APIæŽ¥å£æ˜¯**没有å˜åŒ–**的,这就很好的兼容了一套代应用层的ç å¯ä»¥åŠ å¯†ä¼ è¾“ä¹Ÿå¯ä»¥ä¸åŠ å¯†ä¼ è¾“ã€‚
+- **支æŒmbedtlsåŠ å¯†ä¼ è¾“**ï¼Œè®©ç½‘ç»œä¼ è¾“æ›´åŠ å®‰å…¨ï¼Œè€Œä¸”æŽ¥å£å±‚完全ä¸éœ€è¦ç”¨æˆ·ç†ä¼šï¼Œæ— 论是å¦åŠ å¯†ï¼Œmqttclient对用户æä¾›çš„APIæŽ¥å£æ˜¯**固定**的,这就很好的兼容了一套代应用层的ç å¯ä»¥åŠ å¯†ä¼ è¾“ä¹Ÿå¯ä»¥ä¸åŠ å¯†ä¼ è¾“ã€‚
+
+- **支æŒå¤šå®¢æˆ·ç«¯**ï¼ŒåŒæ—¶å…¼å®¹å¤šä¸ªå®¢æˆ·ç«¯è¿è¡Œå·¥ä½œï¼Œä¸€ä¸ªè®¾å¤‡è¿žæŽ¥å¤šä¸ªçš„æœåŠ¡å™¨ã€‚
+
+- **支æŒåŒæ¥å¼‚æ¥å¤„ç†**ï¼Œåº”ç”¨ç¨‹åºæ— 需阻塞ç‰å¾…浪费CPU资æºã€‚
+
+- **æ”¯æŒæ‹¦æˆªå™¨é…ç½®**,在æŸäº›å¹³å°ä¸ï¼Œå®¢æˆ·ç«¯ä¼šé»˜è®¤è‡ªåŠ¨è®¢é˜…ç³»ç»Ÿä¸»é¢˜ï¼Œè€Œä¸”æ¯æ¬¡æ¥è‡ªæœåŠ¡å™¨çš„ä¸»é¢˜éƒ½æ˜¯å˜åŠ¨çš„ï¼Œæ¤æ—¶éœ€è¦ä½¿ç”¨æ‹¦æˆªå™¨è¿›è¡Œæ‹¦æˆªï¼Œåˆ†ç¦»ä¸»é¢˜ä¸Žæ•°æ®ä¿¡æ¯ï¼Œå¹¶é€’交给用户,æžå¤§æé«˜çµæ´»æ€§ã€‚
+
+- **拥有在线代ç 生æˆå·¥å…·**,æžå…¶ç®€å•é…置就å¯ä»¥ç”Ÿæˆå¯¹åº”的代ç ,地å€ï¼š[https://jiejietop.gitee.io/mqtt/index.html](https://jiejietop.gitee.io/mqtt/index.html)
- **拥有æžç®€çš„API接å£**,总的æ¥è¯´ï¼Œmqttclientçš„é…ç½®éƒ½æœ‰é»˜è®¤å€¼ï¼ŒåŸºæœ¬æ— éœ€é…置都能使用的,也å¯ä»¥éšæ„é…置,对é…置都有å¥å£®æ€§æ£€æµ‹ï¼Œè¿™æ ·å设计的API接å£ä¹Ÿæ˜¯éžå¸¸ç®€å•。
-- **有éžå¸¸å¥½çš„代ç é£Žæ ¼ä¸Žæ€æƒ³**:整个代ç 采用分层å¼è®¾è®¡ï¼Œä»£ç 实现采用异æ¥å¤„ç†çš„æ€æƒ³ï¼Œé™ä½Žè€¦åˆï¼Œæé«˜æ€§èƒ½ï¼Œå…·ä½“体现在什么地方呢?很简å•,目å‰å¸‚é¢ä¸Šå¾ˆå¤šMQTT客户端å‘布主题都是è¦é˜»å¡žç‰å¾…ack,这是éžå¸¸æš´åŠ›çš„è¡Œä¸ºï¼Œé˜»å¡žå½“å‰çº¿ç¨‹ç‰å¾…æœåŠ¡å™¨çš„åº”ç”,那如果我想è¦å‘逿•°æ®æ€Žä¹ˆåŠžï¼Œæˆ–è€…æˆ‘è¦é‡å¤æ£€æµ‹æ•°æ®æ€Žä¹ˆåŠžï¼Œä½ å¯èƒ½ä¼šè¯´ï¼ŒæŒ‡å®šé˜»å¡žæ—¶é—´ç‰å¾…,那如果网络延迟,ackè¿Ÿè¿Ÿä¸æ¥ï¼Œæˆ‘就白ç‰äº†å—,对于qos1ã€qos2çš„æœåŠ¡è´¨é‡æ€Žä¹ˆåŠžï¼Œæ‰€ä»¥è¯´è¿™ç§è¿˜æ˜¯è¦å¼‚æ¥å¤„ç†çš„æ€æƒ³ï¼Œæˆ‘å‘布主题,那我å‘布出去就好了,ä¸éœ€è¦ç‰å¾…,对于qos1ã€qos2æœåŠ¡è´¨é‡çš„MQTT报文,如果æœåŠ¡å™¨æ²¡æ”¶åˆ°ï¼Œé‚£æˆ‘é‡å‘å°±å¯ä»¥ï¼Œè¿™ç§é‡å‘也是异æ¥çš„处ç†ï¼Œå®Œå…¨ä¸ä¼šé˜»å¡žå½“å‰çº¿ç¨‹ã€‚
+- **å¤šåŠŸèƒ½å‚æ•°å¯é…ç½®å¯è£å‰ª**,é‡è¿žæ—¶é—´é—´éš”ã€å¿ƒè·³å‘¨æœŸã€æœ€å¤§è®¢é˜…æ•°é‡ã€å‘½ä»¤è¶…æ—¶ã€è¯»å†™ç¼“冲区大å°ã€æ‹¦æˆªå™¨å¤„ç†ç‰ç‰å‚数功能å¯è£å‰ªå¯é…置,满足开å‘者å†å¤æ‚ã€ç®€å•ç‰å„ç§å¼€å‘环境下的使用需求。
-- **MQTTå议支æŒä¸»é¢˜é€šé…符`“#â€ã€â€œ+â€`。**
+- **支æŒè‡ªåЍ釿–°è®¢é˜…主题**,在自动é‡è¿žåŽä¿è¯ä¸»é¢˜ä¸ä¼šä¸¢å¤±ã€‚
+
+- **支æŒä¸»é¢˜é€šé…符`“#â€ã€â€œ+â€`**。
- **订阅的主题与消æ¯å¤„ç†å®Œå…¨åˆ†ç¦»**ï¼Œè®©ç¼–ç¨‹é€»è¾‘æ›´åŠ ç®€å•æ˜“ç”¨ï¼Œç”¨æˆ·æ— éœ€ç†ä¼šé”™ç»¼å¤æ‚的逻辑关系。
- **mqttclientå†…éƒ¨å·²å®žçŽ°ä¿æ´»å¤„ç†æœºåˆ¶**ï¼Œæ— éœ€ç”¨æˆ·è¿‡å¤šå…³å¿ƒç†ä¼šï¼Œç”¨æˆ·åªéœ€ä¸“心处ç†åº”用功能å³å¯ã€‚
+- **拥有éžå¸¸å¥½çš„设计**,以æžå°‘的资æºè®¾è®¡äº†**记录机制**,当报文在丢失的时候进行é‡å‘æ“作,确ä¿qos1ã€qos2æœåŠ¡è´¨é‡ç‰çº§çš„æŠ¥æ–‡ä¿è¯å…¶æœåŠ¡è´¨é‡ã€‚
+
+- **有éžå¸¸å¥½çš„代ç é£Žæ ¼ä¸Žæ€æƒ³**:整个代ç 采用分层å¼è®¾è®¡ï¼Œä»£ç 实现采用异æ¥å¤„ç†çš„æ€æƒ³ï¼Œé™ä½Žè€¦åˆï¼Œæé«˜æ€§èƒ½ã€‚
+
+- **åŸºäºŽæ ‡å‡†BSD socket之上开å‘**,åªè¦æ˜¯å…¼å®¹BSD socket的系统å‡å¯ä½¿ç”¨ã€‚
+
- **æ— ç¼è¡”接salof**ï¼šå®ƒæ˜¯ä¸€ä¸ªåŒæ¥å¼‚æ¥æ—¥å¿—输出框架,在空闲时候输出对应的日志信æ¯ï¼Œä¹Ÿå¯ä»¥å°†ä¿¡æ¯å†™å…¥flashä¸ä¿å˜ï¼Œæ–¹ä¾¿è°ƒè¯•。
-- **ä¸å¯¹å¤–产生ä¾èµ–。**
+- **使用著åçš„ paho mqtt 库å°åŒ…**。
+
+- **æ— å…¶ä»–ä¾èµ–**。
+
+## 在线代ç 生æˆå·¥å…·
+
+本项目拥有代ç 生æˆå·¥å…·ï¼Œåªéœ€è¦åœ¨çº¿é…ç½®å³å¯ç”Ÿæˆä»£ç ,æžå…¶ç®€å•易用,代ç 生æˆå·¥å…·åœ°å€ï¼š[https://jiejietop.gitee.io/mqtt/index.html](https://jiejietop.gitee.io/mqtt/index.html)
+
+
+
+## å 用资æºå¤§å°
+
+总计å **10857å—节** çš„ROM,而RAMçš„å¼€é”€åˆ™å‡ ä¹Žåªä¾èµ–动æ€å†…å˜ï¼Œåœ¨ä¸ä½¿ç”¨TLSåŠ å¯†ä¼ è¾“çš„æƒ…å†µä¸‹ï¼Œç»´æŒQOS0æœåŠ¡è´¨é‡ç‰çº§çš„通信动æ€å†…å˜å¤§çº¦ä»…需è¦**3694**å—节,这包括1024读缓冲区 + 1024写缓冲区 + 1024å†…éƒ¨çº¿ç¨‹æ ˆå¤§å°ï¼Œç›¸å¯¹äºŽå…¶ä»–MQTT客户端æ¥è¯´ï¼Œmqttclient需è¦çš„RAM资æºå¼€é”€æžå°‘。
+
+| Code | RO Data | RW Data | ZI Data | Object Name |
+| -- | -- | -- | -- | -- |
+| 7118 | 791 | 0 | 0 | mqttclient.o |
+| 546 | 0 | 0 | 0 | mqttconnectclient.o |
+| 212 | 0 | 0 | 0 | mqttdeserializepublish.o |
+| 476 | 0 | 4 | 0 | mqttpacket.o |
+| 236 | 0 | 0 | 0 | mqttserializepublish.o |
+| 310 | 0 | 0 | 0 | mqttsubscribeclient.o |
+| 38 | 0 | 0 | 0 | mqttunsubscribeclient.o |
+| 56 | 0 | 0 | 0 | nettype_tcp.o |
+| 62 | 0 | 0 | 0 | network.o |
+| 24 | 0 | 0 | 0 | platform_memory.o |
+| 40 | 0 | 0 | 0 | platform_mutex.o |
+| 344 | 0 | 0 | 0 | platform_net_socket.o |
+| 94 | 0 | 0 | 0 | platform_thread.o |
+| 70 | 0 | 0 | 0 | platform_timer.o |
+| 246 | 0 | 4 | 0 | random.o |
+| 62 | 0 | 0 | 0 | mqtt_list.o |
+| - | - | - | - | - |
+| 10066 | 791 | 8 | 0 | total |
## 整体框架
@@ -33,23 +93,45 @@

-**ç›®å‰å·²é€‚é…了Linuxã€TencentOS tinyå¹³å°ï¼Œé™¤æ¤ä¹‹å¤–,TencentOS tinyçš„AT框架亦å¯ä»¥ä½¿ç”¨ï¼ˆRAM消耗ä¸è¶³15K),并且稳定性æžå¥½ï¼**
+- 在框架的最上方是**API**函数接å£ï¼Œå®žçŽ°äº†å®¢æˆ·ç«¯çš„**申请ã€é‡Šæ”¾ã€è®¾ç½®å‚æ•°ã€è¿žæŽ¥æœåŠ¡å™¨ã€æ–开连接ã€è®¢é˜…主题ã€å–消订阅主题ã€å‘布消æ¯**ç‰å‡½æ•°æŽ¥å£ã€‚
+- 使用了著åçš„**paho mqtt**库作为MQTT报文å°åŒ…库。
+
+- 采用异æ¥å¤„ç†çš„æœºåˆ¶åŽ»ç®¡ç†æ‰€æœ‰çš„ack,它在å‘é€æŠ¥æ–‡çš„æ—¶å€™ä¸ç”¨ç‰å¾…æœåŠ¡å™¨çš„åº”ç”ï¼Œåªæ˜¯è®°å½•下æ¥ï¼Œåœ¨æ”¶åˆ°æœåŠ¡å™¨çš„ackåŽï¼Œå–消这个记录,**效率æžé«˜**;而在å‘é€mqtt报文(QoS1/QoS2)的时候没有收到æœåŠ¡å™¨çš„åº”ç”æ—¶ï¼Œå°†**é‡å‘**该报文。
+
+- 内部实现了一个**mqtt yield**çº¿ç¨‹ï¼Œç»Ÿä¸€å¤„ç†æ‰€æœ‰çš„内容,比如**超时的处ç†ã€ack报文的处ç†ã€æ”¶åˆ°æ¥è‡ªæœåŠ¡å™¨çš„publish报文**ï¼Œæ¤æ—¶ä¼šåŽ»è°ƒç”¨å›žè°ƒå‡½æ•°å‘ŠçŸ¥ç”¨æˆ·æ”¶åˆ°çš„æ•°æ®ï¼Œ**å‘布释放ã€å‘å¸ƒå®ŒæˆæŠ¥æ–‡çš„å¤„ç†ã€å¿ƒè·³æŠ¥æ–‡ï¼ˆä¿æŒæ´»æ€§ï¼‰ï¼Œå½“与æœåС噍æ–开连接时需è¦å°è¯•é‡è¿žã€é‡æ–°è®¢é˜…ä¸»é¢˜ï¼Œé‡æ–°å‘é€æŠ¥æ–‡æˆ–è€…åº”ç”**ç‰ã€‚
+
+- 报文的处ç†ï¼Œå¦‚**读写报文ã€è§£ç mqtt报文ã€è®¾ç½®æŠ¥æ–‡ï¼ˆdupæ ‡è®°ï¼‰ã€é”€æ¯æŠ¥æ–‡**ç‰æ“作。
+
+- **network**是网络组件,它å¯ä»¥**自动选择数æ®é€šé“**ï¼Œå¦‚æžœæ˜¯åŠ å¯†æ–¹å¼åˆ™é€šè¿‡**tlsåŠ å¯†**进行数æ®ä¼ 输,而tlså¯ä»¥é€‰æ‹©mbedtlsä½œä¸ºåŠ å¯†åŽç«¯ï¼›ä¹Ÿå¯ä»¥æ˜¯**tcp直连**æ–¹å¼ï¼Œæœ€ç»ˆéƒ½æ˜¯é€šè¿‡tcpä¼ è¾“çš„ã€‚
+
+- **platform**æ˜¯å¹³å°æŠ½è±¡å±‚ï¼Œå°è£…了ä¸åŒç³»ç»Ÿçš„东西,比如**socke或者ATï¼Œçº¿ç¨‹ã€æ—¶é—´ã€äº’æ–¥é”ã€å†…å˜ç®¡ç†**,这些是与系统打交é“的,也是跨平å°å¿…è¦çš„å°è£…。
+
+- 最å³è¾¹çš„则是通用的内容,**list的处ç†ã€æ—¥å¿—库ã€é”™è¯¯å¤„ç†ã€è½¯ä»¶éšæœºæ•°å‘生器**ç‰ã€‚
+
+## 支æŒçš„å¹³å°
+
+**ç›®å‰å·²å®žçŽ°äº†Linuxã€TencentOS tinyã€FreeRTOSã€RT-Threadå¹³å°ï¼ˆå·²åšæˆè½¯ä»¶åŒ…,åå—为`kawaii-mqtt`),除æ¤ä¹‹å¤–TencentOS tinyçš„AT框架亦å¯ä»¥ä½¿ç”¨ï¼Œå¹¶ä¸”稳定性æžå¥½ï¼**
| å¹³å° | 代ç ä½ç½® |
| -------------- | -------- |
| Linux | [https://github.com/jiejieTop/mqttclient](https://github.com/jiejieTop/mqttclient) |
| TencentOS tiny | [https://github.com/Tencent/TencentOS-tiny/tree/master/board/Fire_STM32F429](https://github.com/Tencent/TencentOS-tiny/tree/master/board/Fire_STM32F429) |
-| TencentOS tiny AT 框架| [https://github.com/Tencent/TencentOS-tiny/tree/master/board/GoKit3_STM32F103C8T6](https://github.com/Tencent/TencentOS-tiny/tree/master/board/GoKit3_STM32F103C8T6) |
-
+| TencentOS tiny AT 框架 | [https://github.com/jiejieTop/gokit3-board-mqttclient](https://github.com/jiejieTop/gokit3-board-mqttclient) |
+| RT-Thread | [https://github.com/jiejieTop/kawaii-mqtt](https://github.com/jiejieTop/kawaii-mqtt) |
+| FreeRTOS | [https://github.com/jiejieTop/freertos-mqttclient](https://github.com/jiejieTop/freertos-mqttclient) |
## 版本
| å‘布版本 | æè¿° |
| --- | --- |
-| [v1.0.0] | åˆæ¬¡å‘布,完æˆåŸºæœ¬æ¦‚念åŠå…¶ç¨³å®šæ€§éªŒè¯ |
-| [v1.0.1] | ä¿®å¤ä¸»åŠ¨ä¸ŽæœåС噍æ–开连接时的逻辑 |
+| [v1.0.0] | åˆæ¬¡å‘布,完æˆåŸºæœ¬æ¡†æž¶åŠå…¶ç¨³å®šæ€§éªŒè¯ |
+| [v1.0.1] | ä¿®å¤ä¸»åŠ¨ä¸ŽæœåС噍æ–å¼€è¿žæŽ¥æ—¶çš„é€»è¾‘å¤„ç† |
+| [v1.0.2] | æ·»åŠ æ–°ç‰¹æ€§â€”â€”æ‹¦æˆªå™¨ï¼Œä¿®å¤ä¸€äº›å°bug |
+| [v1.0.3] | é¿å…é€ æˆå…¨å±€æ±¡æŸ“修改了logã€list相关函数的命å |
+| [v1.0.4] | 釿–°è°ƒæ•´äº†network结构与mbedtlsæ•°æ®é€šé“ |
+| [v1.1.0] | ä¸€ä¸ªè¾ƒå¤§ç‰ˆæœ¬çš„æ›´æ–°ï¼Œé‡æž„部分代ç ,优化MQTT处ç†çš„逻辑,æå‡æ•´ä½“的稳定性,支æŒå¤šå®¢æˆ·ç«¯ï¼Œæ”¯æŒè®¾ç½®é—嘱,优化API接å£ï¼Œå¢žåŠ å¤šä¸ªäº‘å¹³å°çš„æµ‹è¯•代ç ä¸Žè¯´æ˜Žæ–‡æ¡£ï¼Œå¢žåŠ åœ¨çº¿ä»£ç 生æˆå·¥å…·ã€åœ¨çº¿è£å‰ªé…置工具 |
## 问题
@@ -57,573 +139,73 @@
## 版æƒå’Œè®¸å¯
-mqttclient ç”± [Apache License v2.0](https://github.com/jiejieTop/mqttclient/blob/master/LICENSE) è®¸å¯ æä¾›ã€‚
-
-简å•谈谈关于开æºå议的æè¿°ï¼Œ[Apache License v2.0](https://github.com/jiejieTop/mqttclient/blob/master/LICENSE) 鼓励代ç 共享和尊é‡åŽŸä½œè€…çš„è‘—ä½œæƒï¼Œå¯ä»¥è‡ªç”±çš„使用,修改æºä»£ç ,也å¯ä»¥å°†ä¿®æ”¹åŽçš„代ç ä½œä¸ºå¼€æºæˆ–者专有软件å†å‘å¸ƒï¼ˆä½œä¸ºå¼€æºæˆ–é—æºå•†ä¸šè½¯ä»¶ï¼‰ï¼Œ**但本æºç å¿…é¡»ä¿ç•™ä½œè€…版æƒå£°æ˜Ž**。
+mqttclient éµå¾ª [Apache License v2.0](https://github.com/jiejieTop/mqttclient/blob/master/LICENSE) å¼€æºå议。鼓励代ç 共享和尊é‡åŽŸä½œè€…çš„è‘—ä½œæƒï¼Œå¯ä»¥è‡ªç”±çš„使用ã€ä¿®æ”¹æºä»£ç ,也å¯ä»¥å°†ä¿®æ”¹åŽçš„代ç ä½œä¸ºå¼€æºæˆ–é—æºè½¯ä»¶å‘布。
## linuxå¹³å°ä¸‹æµ‹è¯•使用
+
### 安装cmake:
+
```bash
-sudo apt-get install cmake
+ sudo apt-get install cmake g++
```
-### é…ç½®
-在`mqttclient/test/test.c`文件ä¸ä¿®æ”¹ä»¥ä¸‹å†…容:
-```c
- init_params.connect_params.network_params.network_ssl_params.ca_crt = test_ca_get(); /* CAè¯ä¹¦ */
- init_params.connect_params.network_params.addr = "xxxxxxx"; /* æœåŠ¡å™¨åŸŸå */
- init_params.connect_params.network_params.port = "8883"; /* æœåŠ¡å™¨ç«¯å£å· */
- init_params.connect_params.user_name = "xxxxxxx"; /* 用户å */
- init_params.connect_params.password = "xxxxxxx"; /* 密ç */
- init_params.connect_params.client_id = "xxxxxxx"; /* 客户端id */
-```
+### 测试程åº
-### mbedtls
-
-默认打开mbedtls。
-
-[salof](https://github.com/jiejieTop/salof) 全称是:`Synchronous Asynchronous Log Output Framework`ï¼ˆåŒæ¥å¼‚æ¥æ—¥å¿—è¾“å‡ºæ¡†æž¶ï¼‰ï¼Œå®ƒæ˜¯ä¸€ä¸ªåŒæ¥å¼‚æ¥æ—¥å¿—输出框架,在空闲时候输出对应的日志信æ¯ï¼Œå¹¶ä¸”该库与mqttclientæ— ç¼è¡”接。
-
-**é…置对应的日志输出级别:**
-
-```c
-#define BASE_LEVEL (0)
-#define ASSERT_LEVEL (BASE_LEVEL + 1) /* 日志输出级别:æ–言级别(éžå¸¸é«˜ä¼˜å…ˆçº§ï¼‰ */
-#define ERR_LEVEL (ASSERT_LEVEL + 1) /* 日志输出级别:错误级别(高优先级) */
-#define WARN_LEVEL (ERR_LEVEL + 1) /* 日志输出级别:è¦å‘Šçº§åˆ«ï¼ˆä¸ä¼˜å…ˆçº§ï¼‰ */
-#define INFO_LEVEL (WARN_LEVEL + 1) /* 日志输出级别:信æ¯çº§åˆ«ï¼ˆä½Žä¼˜å…ˆçº§ï¼‰ */
-#define DEBUG_LEVEL (INFO_LEVEL + 1) /* 日志输出级别:调试级别(更低优先级) */
-
-#define LOG_LEVEL WARN_LEVEL /* 日志输出级别 */
-```
-
-**日志其他选项:**
-
-- 终端带颜色
-- 时间戳
-- æ ‡ç¾
-
-### mqttclientçš„é…ç½®
-
-é…ç½®mqttç‰å¾…应ç”列表的最大值,对于qos1 qos2æœåŠ¡è´¨é‡æœ‰è¦æ±‚çš„å¯ä»¥å°†å…¶è®¾ç½®å¤§ä¸€ç‚¹ï¼Œå½“然也必须资æºè·Ÿå¾—ä¸Šï¼Œå®ƒä¸»è¦æ˜¯ä¿è¯qos1 qos2çš„mqtt报文能准确到达æœåŠ¡å™¨ã€‚
-
-```c
-#define MQTT_ACK_HANDLER_NUM_MAX 64
-```
-
-选择MQTTå议的版本,默认为4,表示使用MQTT 3.1.1版本,而3则表示为MQTT 3.1版本。
-
-```c
-#define MQTT_VERSION 4 // 4 is mqtt 3.1.1
-```
-
-è®¾ç½®é»˜è®¤çš„ä¿æ´»æ—¶é—´ï¼Œå®ƒä¸»è¦æ˜¯ä¿è¯MQTT客户端与æœåŠ¡å™¨çš„ä¿æŒæ´»æ€§è¿žæŽ¥ï¼Œå•ä½ä¸º ç§’ ,比如MQTT客户端与æœåС噍100S没有å‘逿•°æ®äº†ï¼Œæœ‰æ²¡æœ‰æŽ¥æ”¶åˆ°æ•°æ®ï¼Œæ¤æ—¶MQTT客户端会å‘é€ä¸€ä¸ªpingåŒ…ï¼Œç¡®è®¤ä¸€ä¸‹è¿™ä¸ªä¼šè¯æ˜¯å¦å˜åœ¨ï¼Œå¦‚果收到æœåŠ¡å™¨çš„åº”ç”,那么说明这个会è¯è¿˜æ˜¯å˜åœ¨çš„,å¯ä»¥éšæ—¶æ”¶å‘æ•°æ®ï¼Œè€Œå¦‚æžœä¸å˜åœ¨äº†ï¼Œå°±æ¸…除会è¯ã€‚
-
-```c
-#define MQTT_KEEP_ALIVE_INTERVAL 100 // unit: second
-```
-
-é»˜è®¤çš„å‘½ä»¤è¶…æ—¶ï¼Œå®ƒä¸»è¦æ˜¯ç”¨äºŽsocket读写超时,在MQTTåˆå§‹åŒ–æ—¶å¯ä»¥æŒ‡å®š:
-
-```
-#define MQTT_DEFAULT_CMD_TIMEOUT 4000
-```
-
-默认主题的长度,主题是支æŒé€šé…符的,如果主题太长则会被截æ–:
-
-```c
-#define MQTT_TOPIC_LEN_MAX 64
-```
-
-默认的算法数æ®ç¼“冲区的大å°ï¼Œå¦‚æžœè¦å‘é€å¤§é‡æ•°æ®åˆ™ä¿®æ”¹å¤§ä¸€äº›ï¼Œåœ¨MQTTåˆå§‹åŒ–æ—¶å¯ä»¥æŒ‡å®šï¼š
-
-```c
-#define MQTT_DEFAULT_BUF_SIZE 1024
-```
-
-线程相关的é…ç½®ï¼Œå¦‚çº¿ç¨‹æ ˆï¼Œçº¿ç¨‹ä¼˜å…ˆçº§ï¼Œçº¿ç¨‹æ—¶é—´ç‰‡ç‰ï¼š
-在linux环境下å¯ä»¥æ˜¯ä¸éœ€è¦ç†ä¼šè¿™äº›å‚数的,而在RTOSå¹³å°åˆ™éœ€è¦é…置,如果ä¸ä½¿ç”¨mbedtlsï¼Œçº¿ç¨‹æ ˆ2048å—节已足够,而使用mbedtlsåŠ å¯†åŽï¼Œéœ€è¦é…ç½®4096å—节以上。
-```c
-#define MQTT_THREAD_STACK_SIZE 2048 // çº¿ç¨‹æ ˆ
-#define MQTT_THREAD_PRIO 5 // 线程优先级
-#define MQTT_THREAD_TICK 50 // 线程时间片
-```
-
-默认的é‡è¿žæ—¶é—´é—´éš”,当å‘生掉线时,会以这个时间间隔å°è¯•é‡è¿žï¼š
-```c
-#define MQTT_RECONNECT_DEFAULT_DURATION 1000
-```
-
-å…¶ä»–ä¸éœ€è¦æ€Žä¹ˆé…置的东西:
-```c
-#define MQTT_MAX_PACKET_ID (0xFFFF - 1) // mqtt报文id
-#define MQTT_MAX_CMD_TIMEOUT 20000 //æœ€å¤§çš„å‘½ä»¤è¶…æ—¶å‚æ•°
-#define MQTT_MIN_CMD_TIMEOUT 1000 //最å°çš„å‘½ä»¤è¶…æ—¶å‚æ•°
-```
-
-> psï¼šä»¥ä¸Šå‚æ•°åŸºæœ¬ä¸éœ€è¦æ€Žä¹ˆé…置的,直接用å³å¯~
+| æµ‹è¯•å¹³å° | ä½ç½® |
+| -- | -- |
+| emqx(我ç§äººéƒ¨ç½²çš„æœåŠ¡å™¨ï¼‰ | [./test/emqx/test.c](./test/emqx/test.c) |
+| 百度天工 | [./test/baidu/test.c](./test/baidu/test.c) |
+| onenet | [./test/onenet/test.c](./test/onenet/test.c) |
+| é˜¿é‡Œäº‘ç‰©è” | [./test/ali/test.c](./test/ali/test.c) |
### 编译 & è¿è¡Œ
+
```bash
-./build.sh
-```
-è¿è¡Œ`build.sh`脚本åŽä¼šåœ¨ `./build/bin/`目录下生æˆå¯æ‰§è¡Œæ–‡ä»¶`mqtt-client`,直接è¿è¡Œå³å¯ã€‚
-
-## è®¾è®¡æ€æƒ³
-- 整体采用分层å¼è®¾è®¡ï¼Œä»£ç 实现采用异æ¥è®¾è®¡æ–¹å¼ï¼Œé™ä½Žè€¦åˆã€‚
-- 消æ¯çš„处ç†ä½¿ç”¨å›žè°ƒçš„æ–¹å¼å¤„ç†ï¼šç”¨æˆ·æŒ‡å®š`[订阅的主题]`与指定`[消æ¯çš„处ç†å‡½æ•°]`
-- ä¸å¯¹å¤–产生ä¾èµ–
-
-## API
-`mqttclient`拥有éžå¸¸ç®€æ´çš„`api`接å£
-```c
-int mqtt_keep_alive(mqtt_client_t* c);
-int mqtt_init(mqtt_client_t* c, client_init_params_t* init);
-int mqtt_release(mqtt_client_t* c);
-int mqtt_connect(mqtt_client_t* c);
-int mqtt_disconnect(mqtt_client_t* c);
-int mqtt_subscribe(mqtt_client_t* c, const char* topic_filter, mqtt_qos_t qos, message_handler_t msg_handler);
-int mqtt_unsubscribe(mqtt_client_t* c, const char* topic_filter);
-int mqtt_publish(mqtt_client_t* c, const char* topic_filter, mqtt_message_t* msg);
-int mqtt_yield(mqtt_client_t* c, int timeout_ms);
-```
-## æ ¸å¿ƒ
-**mqtt_client_t 结构**
-
-```c
-typedef struct mqtt_client {
- unsigned short packet_id;
- unsigned char ping_outstanding;
- unsigned char ack_handler_number;
- unsigned char *read_buf;
- unsigned char *write_buf;
- unsigned int cmd_timeout;
- unsigned int read_buf_size;
- unsigned int write_buf_size;
- unsigned int reconnect_try_duration;
- void *reconnect_date;
- reconnect_handler_t reconnect_handler;
- client_state_t client_state;
- platform_mutex_t write_lock;
- platform_mutex_t global_lock;
- list_t msg_handler_list;
- list_t ack_handler_list;
- network_t *network;
- platform_thread_t *thread;
- platform_timer_t reconnect_timer;
- platform_timer_t last_sent;
- platform_timer_t last_received;
- connect_params_t *connect_params;
-} mqtt_client_t;
+ ./build.sh
```
-该结构主è¦ç»´æŠ¤ä»¥ä¸‹å†…容:
-1. 读写数æ®ç¼“冲区`read_bufã€write_buf`
-2. 命令超时时间`cmd_timeout`ï¼ˆä¸»è¦æ˜¯è¯»å†™é˜»å¡žæ—¶é—´ã€ç‰å¾…å“应的时间ã€é‡è¿žç‰å¾…时间)
-3. 维护`ack`链表`ack_handler_list`,这是异æ¥å®žçŽ°çš„æ ¸å¿ƒï¼Œæ‰€æœ‰ç‰å¾…å“应的报文都会被挂载到这个链表上
-4. 维护消æ¯å¤„ç†åˆ—表`msg_handler_list`,这是`mqtt`å议必须实现的内容,所有æ¥è‡ªæœåŠ¡å™¨çš„`publish`报文都会被处ç†ï¼ˆå‰ææ˜¯è®¢é˜…了对应的消æ¯ï¼‰
-5. ç»´æŠ¤ä¸€ä¸ªç½‘å¡æŽ¥å£`network`
-6. 维护一个内部线程`thread`,所有æ¥è‡ªæœåŠ¡å™¨çš„mqtt包都会在这里被处ç†ï¼
-7. 两个定时器,分别是掉线é‡è¿žå®šæ—¶å™¨ä¸Žä¿æ´»å®šæ—¶å™¨`reconnect_timerã€last_sentã€last_received`
-8. ä¸€äº›è¿žæŽ¥çš„å‚æ•°`connect_params`
+è¿è¡Œ**build.sh**脚本åŽä¼šåœ¨ **./build/bin/**目录下生æˆå¯æ‰§è¡Œæ–‡ä»¶**emqx**ã€**baidu**ã€**onenet**ç‰å¤šä¸ªå¹³å°çš„坿‰§è¡Œç¨‹åºï¼Œç›´æŽ¥è¿è¡Œå³å¯ã€‚
-
-## mqttclient实现
-
-以下是整个框架的实现方å¼ï¼Œæ–¹ä¾¿å¤§å®¶æ›´å®¹æ˜“ç†è§£mqttclient的代ç ä¸Žè®¾è®¡æ€æƒ³ï¼Œè®©å¤§å®¶èƒ½å¤Ÿä¿®æ”¹æºç 与使用,还å¯ä»¥æäº¤pr或者issues,开æºçš„世界期待å„ä½å¤§ç¥žçš„å‚与,感谢ï¼
-
-除æ¤ä¹‹å¤–以下代ç çš„`记录机制`与其`è¶…æ—¶å¤„ç†æœºåˆ¶`是éžå¸¸å¥½çš„ç¼–ç¨‹æ€æƒ³ï¼Œå¤§å®¶æœ‰å…´è¶£ä¸€å®šè¦çœ‹æºä»£ç ï¼
-
-### åˆå§‹åŒ–
-
-```c
-int mqtt_init(mqtt_client_t* c, client_init_params_t* init)
+```bash
+ ./build/bin/emqx
```
-ä¸»è¦æ˜¯é…ç½®`mqtt_client_t`结构的相关信æ¯ï¼Œå¦‚果没有指定åˆå§‹åŒ–傿•°ï¼Œåˆ™ç³»ç»Ÿä¼šæä¾›é»˜è®¤çš„傿•°ã€‚
-ä½†è¿žæŽ¥éƒ¨åˆ†çš„å‚æ•°åˆ™å¿…须指定:
+### 编译æˆåЍæ€åº“libmqttclient.so
-```c
- init_params.connect_params.network_params.addr = "[ä½ çš„mqttæœåС噍IPåœ°å€æˆ–者是域å]";
- init_params.connect_params.network_params.port = 1883; //端å£å·
- init_params.connect_params.user_name = "jiejietop";
- init_params.connect_params.password = "123456";
- init_params.connect_params.client_id = "clientid";
-
- mqtt_init(&client, &init_params);
+```bash
+ ./make-libmqttclient.sh
```
-### 连接æœåС噍
+è¿è¡Œ`make-libmqttclient.sh`脚本åŽä¼šåœ¨ `./libmqttclient/lib`目录下生æˆä¸€ä¸ªåЍæ€åº“文件`libmqttclient.so`,并安装到系统的`/usr/lib `ç›®å½•ä¸‹ï¼Œç›¸å…³å¤´æ–‡ä»¶å·²ç»æ‹·è´åˆ°`./libmqttclient/include`目录下,将其拷è´åˆ°ä½ 的工程ä¸å³å¯ï¼Œç¼–译应用程åºçš„æ—¶å€™åªéœ€è¦é“¾æŽ¥åЍæ€åº“å³å¯`-lmqttclient -lpthread`,动æ€åº“çš„é…ç½®æ–‡ä»¶æ˜¯æ ¹æ®`./test/mqtt_config.h`é…置的。
-```c
-int mqtt_connect(mqtt_client_t* c);
+å¦‚æžœä½ æ˜¯ç”¨äº¤å‰ç¼–译器的è¯ï¼Œåˆ™åº”è¯¥æ ¹æ®ä½ 使用的编译器导出对应的环境å˜é‡ï¼ˆæ¤å¤„使用的交å‰ç¼–译器是arm-linux-gnueabihf-gccï¼‰ï¼ŒåŒæ—¶ä½ 也必须将动æ€åº“文件`libmqttclient.so`æ‹·è´åˆ°ä½ 的嵌入å¼ç³»ç»Ÿçš„`/usr/lib `目录下:
+
+```bash
+ export CROSS_COMPILE=arm-linux-gnueabihf-
```
-傿•°åªæœ‰ `mqtt_client_t` 类型的指针,å—符串类型的`主题`(支æŒé€šé…符"#" "+"),主题的`æœåŠ¡è´¨é‡`ï¼Œä»¥åŠæ”¶åˆ°æŠ¥æ–‡çš„`处ç†å‡½æ•°`ï¼Œå¦‚ä¸æŒ‡å®šåˆ™æœ‰é»˜è®¤å¤„ç†å‡½æ•°ã€‚连接æœåŠ¡å™¨åˆ™æ˜¯ä½¿ç”¨éžå¼‚æ¥çš„æ–¹å¼è®¾è®¡ï¼Œå› 为必须ç‰å¾…连接上æœåС噍æ‰èƒ½è¿›è¡Œä¸‹ä¸€æ¥æ“作。
+如若需è¦å¸è½½**libmqttclient.so**,执行以下命令å³å¯ï¼š
-过程如下:
-1. 调用底层的连接函数连接上æœåŠ¡å™¨ï¼š
-
-```c
-c->network->connect(c->network);
+```bash
+ ./make-libmqttclient.sh remove
```
-2. åºåˆ—化`mqtt`çš„`CONNECT`报文并且å‘é€
+## å¦ä¹ 更多
-```c
-MQTTSerialize_connect(c->write_buf, c->write_buf_size, &connect_data)
-mqtt_send_packet(c, len, &connect_timer)
-```
+请看文档:
-3. ç‰å¾…æ¥è‡ªæœåŠ¡å™¨çš„`CONNACK`报文
+- [MQTTå议简介](./docs/mqtt-introduction.md)
-```c
-mqtt_wait_packet(c, CONNACK, &connect_timer)
-```
+- [MQTTå议通信过程](./docs/mqtt-communication.md)
-4. 连接æˆåŠŸåŽåˆ›å»ºä¸€ä¸ªå†…部线程`mqtt_yield_thread`,并在åˆé€‚的时候å¯åŠ¨å®ƒï¼š
+- [mqttclient代ç 生æˆå·¥å…·](./docs/mqtt-tool.md)
-```c
-platform_thread_init("mqtt_yield_thread", mqtt_yield_thread, c, MQTT_THREAD_STACK_SIZE, MQTT_THREAD_PRIO, MQTT_THREAD_TICK)
+- [mqttclienté…ç½®åŠè£å‰ªå·¥å…·](./docs/mqtt-config.md)
-if (NULL != c->thread) {
- mqtt_set_client_state(c, CLIENT_STATE_CONNECTED);
- platform_thread_startup(c->thread);
- platform_thread_start(c->thread); /* start run mqtt thread */
-}
-```
+- [mqttclient设计与实现方å¼](./docs/mqtt-design.md)
-5. 而对于é‡è¿žæ¥è¯´åˆ™ä¸ä¼šé‡æ–°åˆ›å»ºçº¿ç¨‹ï¼Œç›´æŽ¥æ”¹å˜å®¢æˆ·ç«¯çжæ€ä¸ºè¿žæŽ¥çжæ€å³å¯:
+- [mqttclient连接到百度天工物接入](./docs/mqtt-baidu.md)
-```c
-mqtt_set_client_state(c, CLIENT_STATE_CONNECTED);
-```
+- [mqttclient连接到OneNET云平å°](./docs/mqtt-onenet.md)
-### 订阅报文
-
-```c
-int mqtt_subscribe(mqtt_client_t* c, const char* topic_filter, mqtt_qos_t qos, message_handler_t handler)
-```
-
-订阅报文使用异æ¥è®¾è®¡æ¥å®žçŽ°çš„ï¼š
-过程如下:
-1. åºåˆ—化订阅报文并且å‘é€ç»™æœåС噍
-
-```c
-MQTTSerialize_subscribe(c->write_buf, c->write_buf_size, 0, mqtt_get_next_packet_id(c), 1, &topic, (int*)&qos)
-mqtt_send_packet(c, len, &timer)
-```
-
-2. 创建对应的消æ¯å¤„ç†èŠ‚ç‚¹ï¼Œè¿™ä¸ªæ¶ˆæ¯èŠ‚ç‚¹åœ¨æ”¶åˆ°æœåŠ¡å™¨çš„`SUBACK`è®¢é˜…åº”ç”æŠ¥æ–‡åŽä¼šæŒ‚载到消æ¯å¤„ç†åˆ—表`msg_handler_list`上
-
-```c
-mqtt_msg_handler_create(topic_filter, qos, handler)
-```
-
-3. 在å‘é€äº†æŠ¥æ–‡ç»™æœåС噍那就è¦ç‰å¾…æœåŠ¡å™¨çš„å“应了,先记录这个ç‰å¾…`SUBACK`
-
-```c
-mqtt_ack_list_record(c, SUBACK, mqtt_get_next_packet_id(c), len, msg_handler)
-```
-
-### å–æ¶ˆè®¢é˜…
-与订阅报文的逻辑基本差ä¸å¤šçš„~
-
-1. åºåˆ—化订阅报文并且å‘é€ç»™æœåС噍
-
-```c
-MQTTSerialize_unsubscribe(c->write_buf, c->write_buf_size, 0, packet_id, 1, &topic)
-mqtt_send_packet(c, len, &timer)
-```
-
-2. 创建对应的消æ¯å¤„ç†èŠ‚ç‚¹ï¼Œè¿™ä¸ªæ¶ˆæ¯èŠ‚ç‚¹åœ¨æ”¶åˆ°æœåŠ¡å™¨çš„`UNSUBACK`å–æ¶ˆè®¢é˜…åº”ç”æŠ¥æ–‡åŽå°†æ¶ˆæ¯å¤„ç†åˆ—表`msg_handler_list`上的已ç»è®¢é˜…的主题消æ¯èŠ‚ç‚¹é”€æ¯
-
-```c
-mqtt_msg_handler_create((const char*)topic_filter, QOS0, NULL)
-```
-
-3. 在å‘é€äº†æŠ¥æ–‡ç»™æœåС噍那就è¦ç‰å¾…æœåŠ¡å™¨çš„å“应了,先记录这个ç‰å¾…`UNSUBACK`
-
-```c
-mqtt_ack_list_record(c, UNSUBACK, packet_id, len, msg_handler)
-```
-
-### å‘布报文
-
-```c
-int mqtt_publish(mqtt_client_t* c, const char* topic_filter, mqtt_message_t* msg)
-```
-
-傿•°åªæœ‰ `mqtt_client_t` 类型的指针,å—符串类型的`主题`(支æŒé€šé…符),è¦å‘布的消æ¯ï¼ˆåŒ…括`æœåŠ¡è´¨é‡`ã€`消æ¯ä¸»ä½“`)。
-
-```c
- mqtt_message_t msg;
-
- msg.qos = 2;
- msg.payload = (void *) buf;
-
- mqtt_publish(&client, "testtopic1", &msg);
-```
-
-æ ¸å¿ƒæ€æƒ³éƒ½å·®ä¸å¤šï¼Œè¿‡ç¨‹å¦‚下:
-1. å…ˆåºåˆ—化å‘布报文,然åŽå‘é€åˆ°æœåС噍
-
-```c
-MQTTSerialize_publish(c->write_buf, c->write_buf_size, 0, msg->qos, msg->retained, msg->id,
- topic, (unsigned char*)msg->payload, msg->payloadlen);
-mqtt_send_packet(c, len, &timer)
-```
-
-2. 对于QOS0的逻辑,ä¸åšä»»ä½•处ç†ï¼Œå¯¹äºŽQOS1å’ŒQOS2的报文则需è¦è®°å½•下æ¥ï¼Œåœ¨æ²¡æ”¶åˆ°æœåŠ¡å™¨åº”ç”的时候进行é‡å‘
-
-```c
- if (QOS1 == msg->qos) {
- rc = mqtt_ack_list_record(c, PUBACK, mqtt_get_next_packet_id(c), len, NULL);
- } else if (QOS2 == msg->qos) {
- rc = mqtt_ack_list_record(c, PUBREC, mqtt_get_next_packet_id(c), len, NULL);
- }
-```
-
-3. 还有éžå¸¸é‡è¦çš„一点,é‡å‘报文的MQTT报文头部需è¦è®¾ç½®DUPæ ‡å¿—ä½ï¼Œè¿™æ˜¯MQTTåè®®çš„æ ‡å‡†ï¼Œå› æ¤ï¼Œåœ¨é‡å‘的时候作者直接æ“作了报文的DUPæ ‡å¿—ä½ï¼Œå› 为修改DUPæ ‡å¿—ä½çš„函数我没有从MQTTåº“ä¸æ‰¾åˆ°ï¼Œæ‰€ä»¥æˆ‘å°è£…了一个函数,这与LwIPä¸çš„交å‰å˜å–æ€æƒ³æ˜¯ä¸€ä¸ªé“ç†ï¼Œå®ƒå‡è®¾æˆ‘知é“MQTT报文的所有æ“作,所以我å¯ä»¥æ“ä½œå®ƒï¼Œè¿™æ ·åå¯ä»¥æé«˜å¾ˆå¤šæ•ˆçŽ‡ï¼š
-
-```c
-mqtt_set_publish_dup(c,1); /* may resend this data, set the udp flag in advance */
-```
-
-### 内部线程
-
-```c
-static void mqtt_yield_thread(void *arg)
-```
-
-ä¸»è¦æ˜¯å¯¹`mqtt_yield`函数的返回值åšå¤„ç†ï¼Œæ¯”如在`disconnect`的时候销æ¯è¿™ä¸ªçº¿ç¨‹ã€‚
-
-### æ ¸å¿ƒçš„å¤„ç†å‡½æ•°
-
-1. æ•°æ®åŒ…的处ç†`mqtt_packet_handle`
-
-```c
-static int mqtt_packet_handle(mqtt_client_t* c, platform_timer_t* timer)
-```
-
-对ä¸åŒçš„包使用ä¸ä¸€æ ·çš„处ç†ï¼š
-
-```c
- switch (packet_type) {
- case 0: /* timed out reading packet */
- break;
-
- case CONNACK:
- break;
-
- case PUBACK:
- case PUBCOMP:
- rc = mqtt_puback_and_pubcomp_packet_handle(c, timer);
- break;
-
- case SUBACK:
- rc = mqtt_suback_packet_handle(c, timer);
- break;
-
- case UNSUBACK:
- rc = mqtt_unsuback_packet_handle(c, timer);
- break;
-
- case PUBLISH:
- rc = mqtt_publish_packet_handle(c, timer);
- break;
-
- case PUBREC:
- case PUBREL:
- rc = mqtt_pubrec_and_pubrel_packet_handle(c, timer);
- break;
-
- case PINGRESP:
- c->ping_outstanding = 0;
- break;
-
- default:
- goto exit;
- }
-```
-
-并且åšä¿æ´»çš„处ç†ï¼š
-
-```c
-mqtt_keep_alive(c)
-```
-
-当å‘生超时åŽ
-
-```c
-if (platform_timer_is_expired(&c->last_sent) || platform_timer_is_expired(&c->last_received))
-```
-
-åºåˆ—å·ä¸€ä¸ªå¿ƒè·³åŒ…并且å‘é€ç»™æœåС噍
-
-```c
-MQTTSerialize_pingreq(c->write_buf, c->write_buf_size);
-mqtt_send_packet(c, len, &timer);
-```
-
-当冿¬¡å‘生超时åŽï¼Œè¡¨ç¤ºä¸ŽæœåŠ¡å™¨çš„è¿žæŽ¥å·²æ–开,需è¦é‡è¿žçš„æ“ä½œï¼Œè®¾ç½®å®¢æˆ·ç«¯çŠ¶æ€ä¸ºæ–开连接
-
-```c
-mqtt_set_client_state(c, CLIENT_STATE_DISCONNECTED);
-```
-
-2. `ack`链表的扫æï¼Œå½“收到æœåŠ¡å™¨çš„æŠ¥æ–‡æ—¶ï¼Œå¯¹ackåˆ—è¡¨è¿›è¡Œæ‰«ææ“ä½œ
-
-```c
-mqtt_ack_list_scan(c);
-```
-
-当超时åŽå°±é”€æ¯ack链表节点:
-
-```c
-mqtt_ack_handler_destroy(ack_handler);
-```
-
-当然下é¢è¿™å‡ ç§æŠ¥æ–‡åˆ™éœ€è¦é‡å‘æ“作:(`PUBACK ã€PUBREC〠PUBREL ã€PUBCOMP`,ä¿è¯QOS1 QOS2çš„æœåŠ¡è´¨é‡ï¼‰
-
-```c
-if ((ack_handler->type == PUBACK) || (ack_handler->type == PUBREC) || (ack_handler->type == PUBREL) || (ack_handler->type == PUBCOMP))
- mqtt_ack_handler_resend(c, ack_handler);
-```
-
-3. ä¿æŒæ´»æ€§çš„æ—¶é—´è¿‡åŽ»äº†ï¼Œå¯èƒ½æŽ‰çº¿äº†ï¼Œéœ€è¦é‡è¿žæ“作
-
-```c
-mqtt_try_reconnect(c);
-```
-
-é‡è¿žæˆåŠŸåŽå°è¯•釿–°è®¢é˜…报文,ä¿è¯æ¢å¤åŽŸå§‹çŠ¶æ€~
-
-```c
-mqtt_try_resubscribe(c)
-```
-
-### å‘布应ç”与å‘å¸ƒå®ŒæˆæŠ¥æ–‡çš„å¤„ç†
-
-```c
-static int mqtt_puback_and_pubcomp_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
-```
-
-1. ååºåˆ—化报文
-
-```c
-MQTTDeserialize_ack(&packet_type, &dup, &packet_id, c->read_buf, c->read_buf_size)
-```
-
-2. å–æ¶ˆå¯¹åº”çš„ack记录
-
-```c
-mqtt_ack_list_unrecord(c, packet_type, packet_id, NULL);
-```
-
-### è®¢é˜…åº”ç”æŠ¥æ–‡çš„å¤„ç†
-
-```c
-static int mqtt_suback_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
-```
-
-1. ååºåˆ—化报文
-
-```c
-MQTTDeserialize_suback(&packet_id, 1, &count, (int*)&granted_qos, c->read_buf, c->read_buf_size)
-```
-
-2. å–æ¶ˆå¯¹åº”çš„ack记录
-
-```c
-mqtt_ack_list_unrecord(c, packet_type, packet_id, NULL);
-```
-
-3. 安装对应的订阅消æ¯å¤„ç†å‡½æ•°ï¼Œå¦‚果是已å˜åœ¨çš„则ä¸ä¼šå®‰è£…
-
-```c
-mqtt_msg_handlers_install(c, msg_handler);
-```
-
-### å–æ¶ˆè®¢é˜…åº”ç”æŠ¥æ–‡çš„å¤„ç†
-
-```c
-static int mqtt_unsuback_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
-```
-
-1. ååºåˆ—化报文
-
-```c
-MQTTDeserialize_unsuback(&packet_id, c->read_buf, c->read_buf_size)
-```
-
-2. å–æ¶ˆå¯¹åº”çš„ack记录,并且获å–到已ç»è®¢é˜…的消æ¯å¤„ç†èŠ‚ç‚¹
-
-```c
-mqtt_ack_list_unrecord(c, UNSUBACK, packet_id, &msg_handler)
-```
-
-3. 销æ¯å¯¹åº”的订阅消æ¯å¤„ç†å‡½æ•°
-
-```c
-mqtt_msg_handler_destory(msg_handler);
-```
-
-### æ¥è‡ªæœåŠ¡å™¨çš„å‘布报文的处ç†
-
-```c
-static int mqtt_publish_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
-```
-
-1. ååºåˆ—化报文
-
-```c
-MQTTDeserialize_publish(&msg.dup, &qos, &msg.retained, &msg.id, &topic_name,
- (unsigned char**)&msg.payload, (int*)&msg.payloadlen, c->read_buf, c->read_buf_size)
-```
-
-2. 对于QOS0ã€QOS1çš„æŠ¥æ–‡ï¼Œç›´æŽ¥åŽ»å¤„ç†æ¶ˆæ¯
-
-```c
-mqtt_deliver_message(c, &topic_name, &msg);
-```
-
-3. 对于QOS1的报文,还需è¦å‘é€ä¸€ä¸ª`PUBACK`åº”ç”æŠ¥æ–‡ç»™æœåС噍
-
-```c
-MQTTSerialize_ack(c->write_buf, c->write_buf_size, PUBACK, 0, msg.id);
-```
-
-4. 而对于QOS2的报文则需è¦å‘é€`PUBREC`报文给æœåŠ¡å™¨ï¼Œé™¤æ¤ä¹‹å¤–还需è¦è®°å½•`PUBREL`到ack链表上,ç‰å¾…æœåŠ¡å™¨çš„å‘布释放报文,最åŽå†å޻处ç†è¿™ä¸ªæ¶ˆæ¯
-
-```c
-MQTTSerialize_ack(c->write_buf, c->write_buf_size, PUBREC, 0, msg.id);
-mqtt_ack_list_record(c, PUBREL, msg.id + 1, len, NULL)
-mqtt_deliver_message(c, &topic_name, &msg);
-```
-
-> 说明:一旦注册到ack列表上的报文,当具有é‡å¤çš„æŠ¥æ–‡æ˜¯ä¸ä¼šé‡æ–°è¢«æ³¨å†Œçš„,它会通过`mqtt_ack_list_node_is_exist`函数判æ–这个节点是å¦å˜åœ¨ï¼Œä¸»è¦æ˜¯ä¾èµ–ç‰å¾…å“应的消æ¯ç±»åž‹ä¸Žmsgid。
-
-### å‘布收到与å‘布释放报文的处ç†
-
-```c
-static int mqtt_pubrec_and_pubrel_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
-```
-
-1. ååºåˆ—化报文
-
-```c
-MQTTDeserialize_ack(&packet_type, &dup, &packet_id, c->read_buf, c->read_buf_size)
-```
-
-2. äº§ç”Ÿä¸€ä¸ªå¯¹åº”çš„åº”ç”æŠ¥æ–‡
-
-```c
-mqtt_publish_ack_packet(c, packet_id, packet_type);
-```
-
-3. å–æ¶ˆå¯¹åº”çš„ack记录
-
-```c
-mqtt_ack_list_unrecord(c, UNSUBACK, packet_id, &msg_handler)
-```
+- [mqttclient连接到阿里云物è”网平å°](./docs/mqtt-aliyun.md)
diff --git a/components/connectivity/mqttclient/README_EN.md b/components/connectivity/mqttclient/README_EN.md
new file mode 100644
index 00000000..cc18e21c
--- /dev/null
+++ b/components/connectivity/mqttclient/README_EN.md
@@ -0,0 +1,209 @@
+[](https://github.com/jiejieTop/mqttclient/releases)
+
+[](https://github.com/jiejieTop/mqttclient/blob/master/LICENSE)
+
+
+
+
+
+
+
+[䏿–‡è¯´æ˜Ž](README_CN.md)
+# mqttclient
+
+**A high-performance, high-stability, cross-platform MQTT client**
+
+A high-performance, high-stability, cross-platform MQTT client, developed based on the socket API, can be used on embedded devices (FreeRTOS/LiteOS/RT-Thread/TencentOS tiny), Linux, Windows, Mac, and has a very concise The API interface realizes the quality of service of QOS2 with very few resources, and seamlessly connects the mbedtls encryption library.
+
+## Advantage:
+
+- **Extremely high stability**: Whether it is **drop and reconnect**, **packet loss and retransmission**, it is **strictly abide by the MQTT protocol standard**, in addition to The test of **large data volume** is very stable whether it is receiving or sending, and the **high frequency** test is also very stable.
+
+- **Lightweight**: The entire code project is extremely simple. Without mbedtls, it takes up very few resources. The author used the esp8266 module to communicate with the cloud. The entire project code consumes less than 15k of RAM.
+
+- **Support mbedtls encrypted transmission**, make the network transmission more secure, and the interface layer does not require users to care, no matter whether it is encrypted or not, mqttclient is **fixed** for the API interface provided by the user, which is very compatible A set of codes on behalf of the application layer can be transmitted with or without encryption.
+
+- **Supports multiple clients**, compatible with multiple clients running at the same time, one device connected to multiple servers.
+
+- **Supports synchronous and asynchronous processing**, applications need not block and wait to waste CPU resources.
+
+- **Support interceptor configuration**, on some platforms, the client will automatically subscribe to the system theme by default, and the theme from the server changes every time. In this case, you need to use an interceptor to intercept and separate the theme and data Information and deliver it to users, greatly improving flexibility.
+
+- **With online code generation tool**, the code can be generated with extremely simple configuration, address: [https://jiejietop.gitee.io/mqtt/index.html](https://jiejietop.gitee.io/mqtt/index.html)
+
+- **Has a very simple API interface**, in general, mqttclient configuration has default values, basically can be used without configuration, can also be arbitrarily configured, the configuration has robustness detection, so designed The API interface is also very simple.
+
+- **Multifunctional parameters can be configured and tailored**, reconnect time interval, heartbeat period, maximum number of subscriptions, command timeout, read and write buffer size, interceptor processing, etc. Parameters can be tailored and configurable to meet the needs of developers Complex and simple to use in various development environments.
+
+- **Support automatic re-subscription of topics**, after automatic reconnection to ensure that the topics will not be lost.
+
+- **Support theme wildcards ""#", "+"`**.
+
+- **Subscribed topics are completely separated from message processing**, making programming logic easier and easier to use, users don’t have to deal with intricate logical relationships.
+
+- **The keep-alive processing mechanism has been implemented in mqttclient**, without the user having to deal with the psychological experience, the user only needs to concentrate on the application function.
+
+- **Has a very good design**, designed the **recording mechanism** with very few resources, and retransmits the message when it is lost to ensure that the qos1 and qos2 service quality levels guarantee its service quality.
+
+- **There are very good code styles and ideas**: The whole code adopts a layered design, and the code implementation adopts the idea of ​​asynchronous processing to reduce coupling and improve performance.
+
+- **Developed on top of standard BSD socket**, as long as it is compatible with BSD socket system.
+
+- **Seamless connection of salof**: It is a synchronous and asynchronous log output framework. It outputs the corresponding log information when it is idle, and it can also write the information into flash to save it, which is convenient for debugging.
+
+- **Use the famous paho mqtt library package**.
+
+- **No other dependencies**.
+
+## Online code generation tool
+
+This project has a code generation tool that only requires online configuration to generate code, which is extremely simple and easy to use. The code generation tool address is: [https://jiejietop.gitee.io/mqtt/index.html](https://jiejietop.gitee.io/mqtt/index.html)
+
+
+
+## occupied resource size
+
+A total of **10857 bytes** of ROM, and the overhead of RAM is almost only dependent on dynamic memory. Without using TLS encrypted transmission, the communication dynamic memory that maintains the QOS0 quality of service level requires only about **3694** bytes. Including 1024 read buffer + 1024 write buffer + 1024 internal thread stack size, compared with other MQTT clients, mqttclient requires very little RAM resource overhead.
+
+| Code | RO Data | RW Data | ZI Data | Object Name |
+| -- | -- | -- | -- | -- |
+| 7118 | 791 | 0 | 0 | mqttclient.o |
+| 546 | 0 | 0 | 0 | mqttconnectclient.o |
+| 212 | 0 | 0 | 0 | mqttdeserializepublish.o |
+| 476 | 0 | 4 | 0 | mqttpacket.o |
+| 236 | 0 | 0 | 0 | mqttserializepublish.o |
+| 310 | 0 | 0 | 0 | mqttsubscribeclient.o |
+| 38 | 0 | 0 | 0 | mqttunsubscribeclient.o |
+| 56 | 0 | 0 | 0 | nettype_tcp.o |
+| 62 | 0 | 0 | 0 | network.o |
+| 24 | 0 | 0 | 0 | platform_memory.o |
+| 40 | 0 | 0 | 0 | platform_mutex.o |
+| 344 | 0 | 0 | 0 | platform_net_socket.o |
+| 94 | 0 | 0 | 0 | platform_thread.o |
+| 70 | 0 | 0 | 0 | platform_timer.o |
+| 246 | 0 | 4 | 0 | random.o |
+| 62 | 0 | 0 | 0 | mqtt_list.o |
+| - | - | - | - | - |
+| 10066 | 791 | 8 | 0 | total |
+
+## Overall framework
+
+Has a very clear layered framework.
+
+
+
+- At the top of the framework is the **API** function interface, which implements the client's **application, release, set parameters, connect to the server, disconnect, subscribe topic, unsubscribe topic, publish message** and other functional interfaces.
+
+- The famous **paho mqtt** library is used as the MQTT message packet library.
+
+- Asynchronous processing mechanism is used to manage all the acks. It does not need to wait for the server's response when sending the message, but only records it. After receiving the server's ack, cancel this record, **very efficient**; and When the mqtt message (QoS1/QoS2) is sent and no response is received from the server, the message will be **retransmitted**.
+
+- An **mqtt yield** thread is implemented internally to handle all content in a unified manner, such as **timeout processing, ack message processing, and receiving publish message from the server**, at this time the callback function will be called Inform the user of the data received, **post release, post completion message processing, heartbeat message (keep alive), when disconnected from the server, you need to try to reconnect, resubscribe to the topic, resend the message or reply* *Wait.
+
+- Message processing, such as **reading and writing messages, decoding mqtt messages, setting messages (dup flag), destroying messages** and other operations.
+
+- **network** is a network component, which can **automatically select a data channel**, if it is an encryption method, **tls encryption** is used for data transmission, and tls can choose mbedtls as the encryption backend; it can also be The **tcp direct connection** method is ultimately transmitted via tcp.
+
+- **platform** is a platform abstraction layer that encapsulates things from different systems, such as socke or AT, thread, time, mutex, memory management**, these are dealing with the system and are also necessary for cross-platform Package.
+
+- On the far right is the general content, **list processing, log library, error handling, software random number generator**, etc.
+
+## Supported platforms
+
+**At present, Linux, TencentOS tiny, FreeRTOS, RT-Thread platforms have been implemented (software package is named kawaii-mqtt`), in addition to TencentOS tiny AT framework can also be used, and the stability is excellent!**
+
+| Platform | Code Location |
+| -------------- | -------- |
+| Linux | [https://github.com/jiejieTop/mqttclient](https://github.com/jiejieTop/mqttclient) |
+| TencentOS tiny | [https://github.com/Tencent/TencentOS-tiny/tree/master/board/Fire_STM32F429](https://github.com/Tencent/TencentOS-tiny/tree/master/board/Fire_STM32F429) |
+| TencentOS tiny AT framework | [https://github.com/jiejieTop/gokit3-board-mqttclient](https://github.com/jiejieTop/gokit3-board-mqttclient) |
+| RT-Thread | [https://github.com/jiejieTop/kawaii-mqtt](https://github.com/jiejieTop/kawaii-mqtt) |
+| FreeRTOS | [https://github.com/jiejieTop/freertos-mqttclient](https://github.com/jiejieTop/freertos-mqttclient) |
+
+
+## Version
+
+| Release Version | Description |
+| --- | --- |
+| [v1.0.0] | Initial release, complete basic framework and stability verification |
+| [v1.0.1] | Fix the logical processing when actively disconnecting from the server |
+| [v1.0.2] | Add a new feature-interceptor, fix some small bugs |
+| [v1.0.3] | To avoid global pollution, modify the naming of log and list related functions |
+| [v1.0.4] | Network structure and mbedtls data channel readjusted |
+| [v1.1.0] | A larger version of the update, refactoring part of the code, optimizing the logic of MQTT processing, improving the overall stability, supporting multiple clients, supporting setting the will, optimizing the API interface, and adding multiple cloud platforms Test code and documentation, add online code generation tool, online cutting configuration tool |
+## question
+
+Welcome to submit issues and bug reports in the form of [GitHub Issues](https://github.com/jiejieTop/mqttclient/issues)
+
+## Copyright and License
+
+mqttclient follows the [Apache License v2.0](https://github.com/jiejieTop/mqttclient/blob/master/LICENSE) open source agreement. Encourage code sharing and respect the copyright of the original author. You can freely use and modify the source code, or you can publish the modified code as open source or closed source software.
+
+## Test and use under Linux platform
+
+### Install cmake:
+
+```bash
+ sudo apt-get install cmake g++
+```
+
+### test program
+
+| Test Platform | Location |
+| - | - |
+| emqx (my privately deployed server) | [./test/emqx/test.c](./test/emqx/test.c) |
+| Baidu Tiangong | [./test/baidu/test.c](./test/baidu/test.c) |
+| onenet | [./test/onenet/test.c](./test/onenet/test.c) |
+| Alibaba Cloud Internet of Things | [./test/ali/test.c](./test/ali/test.c) |
+
+### Compile & Run
+
+```bash
+ ./build.sh
+```
+
+After running the **build.sh** script, the executable files **emqx**, **baidu**, **onenet** and other platforms will be generated under the **./build/bin/** directory Executable programs can be run directly.
+
+```bash
+ ./build/bin/emqx
+```
+
+### Compile into a dynamic library libmqttclient.so
+
+```bash
+ ./make-libmqttclient.sh
+```
+
+After running the `make-libmqttclient.sh` script, a dynamic library file `libmqttclient.so` will be generated in the `./libmqttclient/lib` directory, and installed into the system’s `/usr/lib` directory, the relevant header files have been Copy to the `./libmqttclient/include` directory and copy it to your project. You only need to link the dynamic library when compiling the application. `-lmqttclient -lpthread`, the configuration file of the dynamic library is based on` ./test/mqtt_config.h` configuration.
+
+If you are using a cross-compiler, you should export the corresponding environment variables according to the compiler you are using (the cross-compiler used here is arm-linux-gnueabihf-gcc), and you must also set the dynamic library file `libmqttclient .so` is copied to the `/usr/lib` directory of your embedded system:
+
+```bash
+ export CROSS_COMPILE=arm-linux-gnueabihf-
+```
+
+If you need to uninstall **libmqttclient.so**, execute the following command:
+
+```bash
+ ./make-libmqttclient.sh remove
+```
+
+## Learn more
+
+Please see the documentation:
+
+- [MQTT Protocol Introduction](./docs/mqtt-introduction.md)
+
+- [MQTT protocol communication process](./docs/mqtt-communication.md)
+
+- [mqttclient code generation tool](./docs/mqtt-tool.md)
+
+- [mqttclient configuration and cutting tool](./docs/mqtt-config.md)
+
+- [mqttclient design and implementation](./docs/mqtt-design.md)
+
+- [mqttclient connects to Baidu Tiangongwu Access](./docs/mqtt-baidu.md)
+
+- [mqttclient connects to OneNET cloud platform](./docs/mqtt-onenet.md)
+
+- [mqttclient connects to Alibaba Cloud IoT platform](./docs/mqtt-aliyun.md)
diff --git a/components/connectivity/mqttclient/build.sh b/components/connectivity/mqttclient/build.sh
index e0d5015d..a931d22e 100644
--- a/components/connectivity/mqttclient/build.sh
+++ b/components/connectivity/mqttclient/build.sh
@@ -2,5 +2,34 @@
mkdir -p build build/bin build/lib
cd build
-cmake ..
+
+if [ " $1" == " " ]; then
+ compiler="gcc"
+elif [ $1 == "--help" -o $1 == "-help" -o $1 == "--h" -o $1 == "-h" ]; then
+ echo "usage: $0 [compiler] [compiler path]"
+ echo " compiler: specify the compiler you are using, default: gcc"
+ echo " compiler path: specify the compiler path you are using"
+ echo " eg:"
+ echo " ./build.sh"
+ echo " ./build.sh arm-linux-gnueabihf-gcc"
+ echo " ./build.sh /usr/bin/arm-linux-gnueabihf-gcc"
+ echo " ./build.sh arm-linux-gnueabihf-gcc /usr/bin"
+ exit
+else
+ if [ " $2" == " " ]; then
+ compiler=$1
+ else
+ compiler=$2/$1
+ fi
+fi
+
+path=$(which $compiler)
+
+if [ " $path" == " " ]; then
+ echo -e "\033[31mNo $compiler compiler found in the system\033[0m"
+ exit
+fi
+
+cmake .. "-DCMAKE_C_COMPILER=$path"
+
make
diff --git a/components/connectivity/mqttclient/common/CMakeLists.txt b/components/connectivity/mqttclient/common/CMakeLists.txt
new file mode 100644
index 00000000..6d1459ab
--- /dev/null
+++ b/components/connectivity/mqttclient/common/CMakeLists.txt
@@ -0,0 +1,21 @@
+set(SUBDIRS "log")
+
+aux_source_directory(. DIR_SRCS)
+
+string(REGEX REPLACE ".*/(.*)" "\\1" LIB_NAME ${CMAKE_CURRENT_SOURCE_DIR})
+
+if (DIR_SRCS)
+ foreach(libname ${LIBNAMES})
+ if (${LIB_NAME} STREQUAL ${libname})
+ add_library(${libname} ${CMAKE_LIB_TYPE} ${DIR_SRCS})
+ endif()
+ endforeach()
+
+else()
+ message(WARNING "not find is src file!")
+endif()
+
+
+foreach(subdir ${SUBDIRS})
+ add_subdirectory(${subdir})
+endforeach()
diff --git a/components/connectivity/mqttclient/common/list.c b/components/connectivity/mqttclient/common/list.c
deleted file mode 100644
index de5546a9..00000000
--- a/components/connectivity/mqttclient/common/list.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * @Author: jiejie
- * @Github: https://github.com/jiejieTop
- * @Date: 2019-12-11 22:46:33
- * @LastEditTime : 2020-01-05 17:01:51
- * @Description: the following code references TencentOS tiny, please keep the author information and source code according to the license.
- */
-
-# include "list.h"
-
-static void _list_add(list_t *node, list_t *prev, list_t *next)
-{
- next->prev = node;
- node->next = next;
- node->prev = prev;
- prev->next = node;
-}
-
-static void _list_del(list_t *prev, list_t *next)
-{
- next->prev = prev;
- prev->next = next;
-}
-
-static void _list_del_entry(list_t *entry)
-{
- _list_del(entry->prev, entry->next);
-}
-
-void list_init(list_t *list)
-{
- list->next = list;
- list->prev = list;
-}
-
-void list_add(list_t *node, list_t *list)
-{
- _list_add(node, list, list->next);
-}
-
-void list_add_tail(list_t *node, list_t *list)
-{
- _list_add(node, list->prev, list);
-}
-
-void list_del(list_t *entry)
-{
- _list_del(entry->prev, entry->next);
-}
-
-void list_del_init(list_t *entry)
-{
- _list_del_entry(entry);
- list_init(entry);
-}
-
-void list_move(list_t *node, list_t *list)
-{
- _list_del_entry(node);
- list_add(node, list);
-}
-
-void list_move_tail(list_t *node, list_t *list)
-{
- _list_del_entry(node);
- list_add_tail(node, list);
-}
-
-int list_is_empty(list_t *list)
-{
- return list->next == list;
-}
diff --git a/components/connectivity/mqttclient/common/log.h b/components/connectivity/mqttclient/common/log.h
deleted file mode 100644
index c0f6cc79..00000000
--- a/components/connectivity/mqttclient/common/log.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * @Author: jiejie
- * @Github: https://github.com/jiejieTop
- * @Date: 2019-12-27 03:25:58
- * @LastEditTime: 2020-02-25 05:42:32
- * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
- */
-#ifndef _LOG_H_
-#define _LOG_H_
-
-#include "mqtt_defconfig.h"
-
-#ifdef LOG_IS_SALOF
- #include "salof.h"
-
- #define LOG_D(fmt, ...) LOG_DEBUG(fmt, ##__VA_ARGS__)
- #define LOG_I(fmt, ...) LOG_INFO(fmt, ##__VA_ARGS__)
- #define LOG_W(fmt, ...) LOG_WARN(fmt, ##__VA_ARGS__)
- #define LOG_E(fmt, ...) LOG_ERR(fmt, ##__VA_ARGS__)
- #define log_init salof_init
-#else
- #include
-
- #define BASE_LEVEL (0)
- #define ASSERT_LEVEL (BASE_LEVEL + 1)
- #define ERR_LEVEL (ASSERT_LEVEL + 1)
- #define WARN_LEVEL (ERR_LEVEL + 1)
- #define INFO_LEVEL (WARN_LEVEL + 1)
- #define DEBUG_LEVEL (INFO_LEVEL + 1)
-
-#if LOG_LEVEL < DEBUG_LEVEL
- #define LOG_D(fmt, ...)
-#else
- #define LOG_D(fmt, ...) { printf(fmt, ##__VA_ARGS__); printf("\n");}
-#endif
-
-#if LOG_LEVEL < INFO_LEVEL
- #define LOG_I(fmt, ...)
-#else
- #define LOG_I(fmt, ...) { printf(fmt, ##__VA_ARGS__); printf("\n");}
-#endif
-
-#if LOG_LEVEL < WARN_LEVEL
- #define LOG_W(fmt, ...)
-#else
- #define LOG_W(fmt, ...) { printf(fmt, ##__VA_ARGS__); printf("\n");}
-#endif
-
-#if LOG_LEVEL < ERR_LEVEL
- #define LOG_E(fmt, ...)
-#else
- #define LOG_E(fmt, ...) { printf(fmt, ##__VA_ARGS__); printf("\n");}
-#endif
-
-#if LOG_LEVEL < ASSERT_LEVEL
- #define LOG_ASSERT(fmt, ...)
- #define ASSERT(x)
-#else
- #define LOG_ASSERT(fmt, ...) { printf(fmt, ##__VA_ARGS__); printf("\n");}
- #define ASSERT(x) if((x)==0) LOG_ASSERT("%s, %d\n",__FILE__,__LINE__)
-#endif
-
-#if LOG_LEVEL < BASE_LEVEL
- #define LOG(fmt, ...)
-#else
- #define LOG(fmt, ...) { printf(fmt, ##__VA_ARGS__); printf("\n");}
-#endif
-
- #define log_init()
-#endif
-
-#endif /* _LOG_H_ */
diff --git a/components/connectivity/mqttclient/common/log/CMakeLists.txt b/components/connectivity/mqttclient/common/log/CMakeLists.txt
new file mode 100644
index 00000000..e46be438
--- /dev/null
+++ b/components/connectivity/mqttclient/common/log/CMakeLists.txt
@@ -0,0 +1,21 @@
+cmake_minimum_required (VERSION 2.8)
+
+set(INCDIRS ${CMAKE_CURRENT_SOURCE_DIR})
+set(SUBDIRS "arch")
+set(LIBNAMES "arch" "salof")
+set(OUTDIRS "build")
+
+aux_source_directory(. LOG_DIR_SRCS)
+
+add_library("salof" ${CMAKE_LIB_TYPE} ${LOG_DIR_SRCS})
+target_link_libraries("salof" "arch")
+
+foreach(incdir ${INCDIRS})
+ include_directories(${incdir})
+endforeach()
+
+foreach(subdir ${SUBDIRS})
+ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${subdir})
+endforeach()
+
+link_directories(${LIBRARY_OUTPUT_PATH})
diff --git a/components/connectivity/mqttclient/common/log/arch/CMakeLists.txt b/components/connectivity/mqttclient/common/log/arch/CMakeLists.txt
new file mode 100644
index 00000000..5b178fbc
--- /dev/null
+++ b/components/connectivity/mqttclient/common/log/arch/CMakeLists.txt
@@ -0,0 +1,7 @@
+set(SUBDIRS "linux")
+
+foreach(subdir ${SUBDIRS})
+ add_subdirectory(${subdir})
+endforeach()
+
+
diff --git a/components/connectivity/mqttclient/common/log/arch/tencentos-tiny/arch.c b/components/connectivity/mqttclient/common/log/arch/tencentos-tiny/arch.c
index 95936c74..7593d963 100644
--- a/components/connectivity/mqttclient/common/log/arch/tencentos-tiny/arch.c
+++ b/components/connectivity/mqttclient/common/log/arch/tencentos-tiny/arch.c
@@ -7,17 +7,13 @@
*/
#include "salof_defconfig.h"
-#ifdef USE_LOG
+#ifdef SALOF_USING_LOG
void *salof_alloc(unsigned int size)
{
return tos_mmheap_alloc(size);
}
-void *salof_calloc(size_t num, size_t size)
-{
- return tos_mmheap_calloc(num, size);
-}
void salof_free(void *mem)
{
@@ -34,13 +30,13 @@ salof_tcb salof_task_create(const char *name,
salof_tcb task;
k_err_t err;
k_stack_t *task_stack;
- task = salof_calloc(1, sizeof(k_task_t));
+ task = salof_alloc(sizeof(k_task_t));
task_stack = salof_alloc(stack_size);
- err = tos_task_create(task,
- (char*)name,
+ err = tos_task_create(task,
+ (char*)name,
task_entry,
- param,
- priority,
+ param,
+ priority,
task_stack,
stack_size,
tick);
@@ -57,7 +53,7 @@ salof_mutex salof_mutex_create(void)
{
salof_mutex mutex;
mutex = salof_alloc(sizeof(k_mutex_t));
- tos_mutex_create((salof_mutex)mutex);
+ tos_mutex_create((salof_mutex)mutex);
return mutex;
}
@@ -87,7 +83,7 @@ salof_sem salof_sem_create(void)
{
salof_sem sem;
sem = salof_alloc(sizeof(k_sem_t));
- tos_sem_create((salof_sem)sem, 0);
+ tos_sem_create((salof_sem)sem, 0);
return sem;
}
@@ -124,4 +120,4 @@ char *salof_get_task_name(void)
return k_curr_task->name;
}
-#endif
+#endif
diff --git a/components/connectivity/mqttclient/common/log/config.h b/components/connectivity/mqttclient/common/log/config.h
deleted file mode 100644
index ac147369..00000000
--- a/components/connectivity/mqttclient/common/log/config.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * @Author: jiejie
- * @Github: https://github.com/jiejieTop
- * @Date: 2019-12-25 23:56:34
- * @LastEditTime : 2020-01-18 13:50:21
- * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
- */
-#ifndef _SALOF_CONFIG_H_
-#define _SALOF_CONFIG_H_
-
-#define USE_RTT 0
-#define USE_UCOSIII 1
-#define USE_FREERTOS 2
-#define USE_TENCENTOS 3
-#define USE_LINUX 4
-
-#define USE_LOG (1U)
-#define USE_SALOF (1U)
-#define SALOF_OS USE_TENCENTOS
-#define USE_IDLE_HOOK (0U)
-
-#define LOG_LEVEL DEBUG_LEVEL //WARN_LEVEL DEBUG_LEVEL
-#define LOG_COLOR (0U)
-#define LOG_TS (0U)
-#define LOG_TAR (0U)
-
-#if USE_SALOF
-#define SALOF_BUFF_SIZE (512U)
-#define SALOF_FIFO_SIZE (1024*2U)
-#define SALOF_TASK_STACK_SIZE (1024U)
-#define SALOF_TASK_TICK (20U)
-#endif
-
-#if !defined(SALOF_OS)
- #error "SALOF_OS isn't defined in 'cmb_cfg.h'"
-#endif
-
-#if (SALOF_OS == USE_FREERTOS)
- #include "FreeRTOS.h"
- #include "task.h"
- #include "semphr.h"
- #define salof_mutex SemaphoreHandle_t
- #define salof_tcb TaskHandle_t
- #define salof_sem salof_mutex
-#if USE_IDLE_HOOK
- #define salof_handler vApplicationIdleHook
-#endif
- #define SALOF_TASK_PRIO (0U)
-
-#elif (SALOF_OS == USE_TENCENTOS)
- #include "tos_k.h"
- #define salof_mutex k_mutex_t*
- #define salof_sem k_sem_t*
- #define salof_tcb k_task_t*
- #define SALOF_TASK_PRIO (TOS_CFG_TASK_PRIO_MAX - 2u)
- #undef USE_IDLE_HOOK
-
-#elif (SALOF_OS == USE_LINUX)
- #include "pthread.h"
- #include "memory.h"
- #include
- #include
- #define salof_mutex pthread_mutex_t*
- #define salof_sem sem_t*
- #define salof_tcb pthread_t*
- #define SALOF_TASK_PRIO (0U)
- #undef USE_IDLE_HOOK
-
-#else
- #error "not supported OS type"
-#endif
-
-void *salof_alloc(unsigned int size);
-void salof_free(void *mem);
-salof_tcb salof_task_create(const char *name,
- void (*task_entry)(void *param),
- void * const param,
- unsigned int stack_size,
- unsigned int priority,
- unsigned int tick);
-salof_mutex salof_mutex_create(void);
-void salof_mutex_delete(salof_mutex mutex);
-int salof_mutex_pend(salof_mutex mutex, unsigned int timeout);
-int salof_mutex_post(salof_mutex mutex);
-salof_sem salof_sem_create(void);
-void salof_sem_delete(salof_sem sem);
-int salof_sem_pend(salof_sem sem, unsigned int timeout);
-int salof_sem_post(salof_sem sem);
-unsigned int salof_get_tick(void);
-char *salof_get_task_name(void);
-extern int send_buff(char *buf, int len);
-#endif // !_SALOF_CONFIG_H_
-
diff --git a/components/connectivity/mqttclient/common/log/fifo.c b/components/connectivity/mqttclient/common/log/fifo.c
index 9f7d7256..059bf24f 100644
--- a/components/connectivity/mqttclient/common/log/fifo.c
+++ b/components/connectivity/mqttclient/common/log/fifo.c
@@ -1,7 +1,7 @@
#include "fifo.h"
#include
-#ifdef USE_LOG
+#ifdef SALOF_USING_LOG
static unsigned int _flbs(unsigned int x) /* find last bit set*/
{
@@ -32,25 +32,25 @@ static unsigned int _flbs(unsigned int x) /* find last bit set*/
return r;
}
-static unsigned int _fifo_align(unsigned int x)
+static unsigned int _salof_fifo_align(unsigned int x)
{
return (1 << (_flbs(x-1)-1)); //memory down alignment
}
-fifo_t fifo_create(unsigned int size)
+salof_fifo_t salof_fifo_create(unsigned int size)
{
- fifo_t fifo;
+ salof_fifo_t fifo;
if (0 == size)
return NULL;
if (size & (size - 1))
- size = _fifo_align(size);
+ size = _salof_fifo_align(size);
- fifo = (fifo_t)salof_alloc((sizeof(struct fifo) + size));
+ fifo = (salof_fifo_t)salof_alloc((sizeof(struct salof_fifo) + size));
if (NULL != fifo) {
- fifo->buff = (unsigned char *)fifo + sizeof(struct fifo);
+ fifo->buff = (unsigned char *)fifo + sizeof(struct salof_fifo);
fifo->mutex = salof_mutex_create();
fifo->sem = salof_sem_create();
@@ -69,7 +69,7 @@ fifo_t fifo_create(unsigned int size)
return NULL;
}
-unsigned int fifo_write(fifo_t fifo, void *buff, unsigned int len, unsigned int timeout)
+unsigned int salof_fifo_write(salof_fifo_t fifo, void *buff, unsigned int len, unsigned int timeout)
{
int err, l;
@@ -94,7 +94,7 @@ unsigned int fifo_write(fifo_t fifo, void *buff, unsigned int len, unsigned int
return len;
}
-unsigned int fifo_read(fifo_t fifo, void *buff, unsigned int len, unsigned int timeout)
+unsigned int salof_fifo_read(salof_fifo_t fifo, void *buff, unsigned int len, unsigned int timeout)
{
int l;
@@ -114,7 +114,7 @@ unsigned int fifo_read(fifo_t fifo, void *buff, unsigned int len, unsigned int t
return len;
}
-unsigned int fifo_read_able(fifo_t fifo)
+unsigned int salof_fifo_read_able(salof_fifo_t fifo)
{
if(NULL == fifo)
return 0;
@@ -128,9 +128,9 @@ unsigned int fifo_read_able(fifo_t fifo)
return (fifo->size - (fifo->out - fifo->in));
}
-unsigned int fifo_write_able(fifo_t fifo)
+unsigned int salof_fifo_write_able(salof_fifo_t fifo)
{
- return (fifo->size - fifo_read_able(fifo));
+ return (fifo->size - salof_fifo_read_able(fifo));
}
#endif
diff --git a/components/connectivity/mqttclient/common/log/fifo.h b/components/connectivity/mqttclient/common/log/fifo.h
index f4a110fe..9545c3e5 100644
--- a/components/connectivity/mqttclient/common/log/fifo.h
+++ b/components/connectivity/mqttclient/common/log/fifo.h
@@ -2,7 +2,7 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-25 23:54:38
- * @LastEditTime: 2020-02-25 08:10:01
+ * @LastEditTime: 2020-06-17 15:10:03
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#ifndef _FIFO_H_
@@ -10,7 +10,7 @@
#include "salof_defconfig.h"
-#ifdef USE_LOG
+#ifdef SALOF_USING_LOG
#define FIFO_READ 0
#define FIFO_WRITE 1
@@ -18,8 +18,7 @@
#define FIFO_MAX(a,b) (((a) > (b)) ? (a) : (b))
#define FIFO_MIN(a,b) (((a) < (b)) ? (a) : (b))
-struct fifo
-{
+struct salof_fifo {
unsigned int size; /* fifo size */
unsigned int in; /* data input pointer (in % size) */
unsigned int out; /* data output pointer (out % size) */
@@ -27,13 +26,13 @@ struct fifo
salof_sem sem; /* sem */
void *buff; /* data area */
};
-typedef struct fifo * fifo_t;
+typedef struct salof_fifo * salof_fifo_t;
-fifo_t fifo_create(unsigned int size);
-unsigned int fifo_write(fifo_t fifo, void *buff, unsigned int len, unsigned int timeout);
-unsigned int fifo_read(fifo_t fifo, void *buff, unsigned int len, unsigned int timeout);
-unsigned int fifo_read_able(fifo_t fifo);
-unsigned int fifo_write_able(fifo_t fifo);
+salof_fifo_t salof_fifo_create(unsigned int size);
+unsigned int salof_fifo_write(salof_fifo_t fifo, void *buff, unsigned int len, unsigned int timeout);
+unsigned int salof_fifo_read(salof_fifo_t fifo, void *buff, unsigned int len, unsigned int timeout);
+unsigned int salof_fifo_read_able(salof_fifo_t fifo);
+unsigned int salof_fifo_write_able(salof_fifo_t fifo);
#endif
diff --git a/components/connectivity/mqttclient/common/log/format.c b/components/connectivity/mqttclient/common/log/format.c
index 60a5973a..cddf9ad4 100644
--- a/components/connectivity/mqttclient/common/log/format.c
+++ b/components/connectivity/mqttclient/common/log/format.c
@@ -2,13 +2,13 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-25 23:54:19
- * @LastEditTime: 2020-02-25 08:12:02
- * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ * @LastEditTime: 2020-06-17 15:23:09
+ * @Description: the code belongs to jiejie, please keep the author insalof_formation and source code according to the license.
*/
#include "format.h"
#include "salof_defconfig.h"
-#ifdef USE_LOG
+#ifdef SALOF_USING_LOG
static int _get_atoi(const char **str)
{
@@ -36,7 +36,7 @@ static void _buff_put_char(char *buf, unsigned int *pos, unsigned int max, char
* width - how many spaces this should have; padding
* flags - above F flags
*/
-static void _format_int(char *buf, unsigned int *len, unsigned int maxlen,
+static void _salof_format_int(char *buf, unsigned int *len, unsigned int maxlen,
signed long long num, int base, int width, int flags)
{
char nbuf[64], sign = 0;
@@ -103,7 +103,7 @@ static void _format_int(char *buf, unsigned int *len, unsigned int maxlen,
_buff_put_char(buf, len, maxlen, pchar);
}
-static void _format_char(char *buf, unsigned int *pos, unsigned int max, char c,
+static void _salof_format_char(char *buf, unsigned int *pos, unsigned int max, char c,
int width, int flags)
{
int npad = 0;
@@ -132,7 +132,7 @@ static unsigned int _str_len(char *s)
return i;
}
-static void _format_str(char *buf, unsigned int *pos, unsigned int max, char *s,
+static void _salof_format_str(char *buf, unsigned int *pos, unsigned int max, char *s,
int width, int flags)
{
int npad = 0;
@@ -160,7 +160,7 @@ static void _format_str(char *buf, unsigned int *pos, unsigned int max, char *s,
* Shrinked down, vsnprintf implementation.
* This will not handle floating numbers (yet).
*/
-int format_nstr(char *buf, unsigned int size, const char *fmt, va_list ap)
+int salof_format_nstr(char *buf, unsigned int size, const char *fmt, va_list ap)
{
unsigned int n = 0;
char c, *s;
@@ -248,20 +248,20 @@ int format_nstr(char *buf, unsigned int size, const char *fmt, va_list ap)
} else if (c == 'b') {
base = 2;
}
- _format_int(buf, &n, size, num, base, width, flags);
+ _salof_format_int(buf, &n, size, num, base, width, flags);
} else if (c == 'p') {
num = (size_t) va_arg(ap, void *);
base = 16;
flags |= F_SMALL | F_ALTERNATE;
- _format_int(buf, &n, size, num, base, width, flags);
+ _salof_format_int(buf, &n, size, num, base, width, flags);
} else if (c == 's') {
s = va_arg(ap, char *);
if (!s)
s = "(null)";
- _format_str(buf, &n, size, s, width, flags);
+ _salof_format_str(buf, &n, size, s, width, flags);
} else if (c == 'c') {
c = va_arg(ap, int);
- _format_char(buf, &n, size, c, width, flags);
+ _salof_format_char(buf, &n, size, c, width, flags);
} else if (c == '%') {
_buff_put_char(buf, &n, size, c);
} else {
diff --git a/components/connectivity/mqttclient/common/log/format.h b/components/connectivity/mqttclient/common/log/format.h
index 2512e06b..b395b2f7 100644
--- a/components/connectivity/mqttclient/common/log/format.h
+++ b/components/connectivity/mqttclient/common/log/format.h
@@ -2,7 +2,7 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-25 23:54:38
- * @LastEditTime: 2020-02-25 07:18:09
+ * @LastEditTime: 2020-06-17 15:22:42
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#ifndef _FORMAT_H_
@@ -37,7 +37,7 @@
#define is_digit(c) (c >= '0' && c <= '9')
-int format_nstr(char *buf, unsigned int size, const char *fmt, va_list ap);
+int salof_format_nstr(char *buf, unsigned int size, const char *fmt, va_list ap);
#endif // !_FORMAT_H_
diff --git a/components/connectivity/mqttclient/common/log/salof.c b/components/connectivity/mqttclient/common/log/salof.c
index 5a6693c8..bc132eb9 100644
--- a/components/connectivity/mqttclient/common/log/salof.c
+++ b/components/connectivity/mqttclient/common/log/salof.c
@@ -2,14 +2,14 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-27 23:10:36
- * @LastEditTime : 2020-01-16 00:37:56
- * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ * @LastEditTime: 2020-06-17 15:22:56
+ * @Description: the code belongs to jiejie, please keep the author insalof_formation and source code according to the license.
*/
/** synchronous asynchronous log output framework */
#include "salof.h"
-#ifdef USE_LOG
+#ifdef SALOF_USING_LOG
#ifndef SALOF_BUFF_SIZE
#define SALOF_BUFF_SIZE (1024U)
@@ -20,13 +20,13 @@
static int salof_out(char *buf, int len);
-#if USE_SALOF
+#if SALOF_USING_SALOF
#include
-static fifo_t _salof_fifo = NULL;
+static salof_fifo_t _salof_fifo = NULL;
static int _len;
static char _out_buff[SALOF_BUFF_SIZE];
-#if !USE_IDLE_HOOK
+#if !SALOF_USING_IDLE_HOOK
static salof_tcb _salof_task;
void salof_task(void *parm);
#else
@@ -38,16 +38,16 @@ void salof_task(void *parm);
#endif
#endif
-static char _format_buff[SALOF_BUFF_SIZE];
+static char _salof_format_buff[SALOF_BUFF_SIZE];
int salof_init(void)
{
-#if USE_SALOF
- _salof_fifo = fifo_create(SALOF_FIFO_SIZE);
+#if SALOF_USING_SALOF
+ _salof_fifo = salof_fifo_create(SALOF_FIFO_SIZE);
if(_salof_fifo == NULL)
return -1;
-#if !USE_IDLE_HOOK
+#if !SALOF_USING_IDLE_HOOK
_salof_task = salof_task_create("salof_task", salof_task, NULL, SALOF_TASK_STACK_SIZE, SALOF_TASK_PRIO, SALOF_TASK_TICK);
if(_salof_task == NULL)
return -1;
@@ -63,15 +63,15 @@ void salof(const char *fmt, ...)
int len;
va_start(args, fmt);
- len = format_nstr(_format_buff, SALOF_BUFF_SIZE - 1, fmt, args);
+ len = salof_format_nstr(_salof_format_buff, SALOF_BUFF_SIZE - 1, fmt, args);
if(len > SALOF_BUFF_SIZE)
len = SALOF_BUFF_SIZE - 1;
-#if USE_SALOF
- fifo_write(_salof_fifo, _format_buff, len, 100);
+#if SALOF_USING_SALOF
+ salof_fifo_write(_salof_fifo, _salof_format_buff, len, 100);
#else
- salof_out(_format_buff, len);
+ salof_out(_salof_format_buff, len);
#endif
va_end(args);
@@ -82,10 +82,10 @@ static int salof_out(char *buf, int len)
return send_buff(buf, len);
}
-#if USE_SALOF
+#if SALOF_USING_SALOF
void salof_handler( void )
{
- _len = fifo_read(_salof_fifo, _out_buff, sizeof(_out_buff), 0);
+ _len = salof_fifo_read(_salof_fifo, _out_buff, sizeof(_out_buff), 0);
if(_len > 0) {
salof_out((char *)_out_buff, _len);
memset(_out_buff, 0, _len);
@@ -93,13 +93,13 @@ void salof_handler( void )
}
#endif
-#if !USE_IDLE_HOOK
+#if !SALOF_USING_IDLE_HOOK
void salof_task(void *parm)
{
(void)parm;
while(1)
{
-#if USE_SALOF
+#if SALOF_USING_SALOF
salof_handler();
#endif
}
diff --git a/components/connectivity/mqttclient/common/log/salof.h b/components/connectivity/mqttclient/common/log/salof.h
index 2f8e6193..24750019 100644
--- a/components/connectivity/mqttclient/common/log/salof.h
+++ b/components/connectivity/mqttclient/common/log/salof.h
@@ -10,113 +10,103 @@ int salof_init(void);
void salof(const char *fmt, ...);
/** font color */
-#define FC_BLACK 30
-#define FC_RED 31
-#define FC_GREEN 32
-#define FC_YELLOW 33
-#define FC_BLUE 34
-#define FC_PURPLE 35
-#define FC_DARK 36
-#define FC_WHITE 37
+#define SALOF_FC_BLACK 30
+#define SALOF_FC_RED 31
+#define SALOF_FC_GREEN 32
+#define SALOF_FC_YELLOW 33
+#define SALOF_FC_BLUE 34
+#define SALOF_FC_PURPLE 35
+#define SALOF_FC_DARK 36
+#define SALOF_FC_WHITE 37
-#ifdef USE_LOG
+#ifdef SALOF_USING_LOG
-#if USE_SALOF
- #define PRINT_LOG salof
+#if SALOF_USING_SALOF
+ #define SALOF_PRINT_LOG salof
#else
-#if ((!USE_SALOF)&&(!PRINT_LOG))
- #define PRINT_LOG printf
+#if ((!SALOF_USING_SALOF)&&(!SALOF_PRINT_LOG))
+ #define SALOF_PRINT_LOG printf
#endif
-#ifndef PRINT_LOG
- #error "If the USE_LOG macro definition is turned on, you must define PRINT_LOG as the LOG output, such as #definePRINT_LOG printf"
+#ifndef SALOF_PRINT_LOG
+ #error "If the SALOF_USING_LOG macro definition is turned on, you must define SALOF_PRINT_LOG as the LOG output, such as #definePRINT_LOG printf"
#endif
#endif
-#if LOG_COLOR
- #define LOG_START(l, c) PRINT_LOG("\033\n["#c"m["#l"] >> ")
- #define LOG_END PRINT_LOG("\033[0m")
+#if SALOF_LOG_COLOR
+ #define SALOF_LOG_START(l, c) SALOF_PRINT_LOG("\033\n["#c"m["#l"] >> ")
+ #define SALOF_LOG_END SALOF_PRINT_LOG("\033[0m")
#else
- #define LOG_START(l, c) PRINT_LOG("\n["#l"] >> ")
- #define LOG_END
+ #define SALOF_LOG_START(l, c) SALOF_PRINT_LOG("\n["#l"] >> ")
+ #define SALOF_LOG_END
#endif
-#if LOG_TS && LOG_TAR
- #define LOG_T PRINT_LOG("[TS: %d] [TAR: %s] ",salof_get_tick(), salof_get_task_name())
-#elif LOG_TS
- #define LOG_T PRINT_LOG("[TS: %d] ", salof_get_tick())
-#elif LOG_TAR
- #define LOG_T PRINT_LOG("[TAR: %s] ", salof_get_task_name())
+#if SALOF_LOG_TS && SALOF_LOG_TAR
+ #define SALOF_LOG_T SALOF_PRINT_LOG("[TS: %d] [TAR: %s] ",salof_get_tick(), salof_get_task_name())
+#elif SALOF_LOG_TS
+ #define SALOF_LOG_T SALOF_PRINT_LOG("[TS: %d] ", salof_get_tick())
+#elif SALOF_LOG_TAR
+ #define SALOF_LOG_T SALOF_PRINT_LOG("[TAR: %s] ", salof_get_task_name())
#else
- #define LOG_T
+ #define SALOF_LOG_T
#endif
-#define LOG_LINE(l, c, fmt, ...) \
+#define SALOF_LOG_LINE(l, c, fmt, ...) \
do { \
- LOG_START(l, c); \
- LOG_T; \
- PRINT_LOG(fmt, ##__VA_ARGS__); \
- LOG_END; \
+ SALOF_LOG_START(l, c); \
+ SALOF_LOG_T; \
+ SALOF_PRINT_LOG(fmt, ##__VA_ARGS__); \
+ SALOF_LOG_END; \
} while (0)
-#define BASE_LEVEL (0)
-#define ASSERT_LEVEL (BASE_LEVEL + 1)
-#define ERR_LEVEL (ASSERT_LEVEL + 1)
-#define WARN_LEVEL (ERR_LEVEL + 1)
-#define INFO_LEVEL (WARN_LEVEL + 1)
-#define DEBUG_LEVEL (INFO_LEVEL + 1)
+#define SALOF_BASE_LEVEL (0)
+#define SALOF_ERR_LEVEL (SALOF_BASE_LEVEL + 1)
+#define SALOF_WARN_LEVEL (SALOF_ERR_LEVEL + 1)
+#define SALOF_INFO_LEVEL (SALOF_WARN_LEVEL + 1)
+#define SALOF_DEBUG_LEVEL (SALOF_INFO_LEVEL + 1)
-#ifndef LOG_LEVEL
- #define LOG_LEVEL DEBUG_LEVEL
+#ifndef SALOF_LOG_LEVEL
+ #define SALOF_LOG_LEVEL SALOF_DEBUG_LEVEL
#endif
-#if LOG_LEVEL < DEBUG_LEVEL
- #define LOG_DEBUG(fmt, ...)
+#if SALOF_LOG_LEVEL < SALOF_DEBUG_LEVEL
+ #define SALOF_LOG_DEBUG(fmt, ...)
#else
- #define LOG_DEBUG(fmt, ...) LOG_LINE(D, 0, fmt, ##__VA_ARGS__)
+ #define SALOF_LOG_DEBUG(fmt, ...) SALOF_LOG_LINE(D, 0, fmt, ##__VA_ARGS__)
#endif
-#if LOG_LEVEL < INFO_LEVEL
- #define LOG_INFO(fmt, ...)
+#if SALOF_LOG_LEVEL < SALOF_INFO_LEVEL
+ #define SALOF_LOG_INFO(fmt, ...)
#else
- #define LOG_INFO(fmt, ...) LOG_LINE(I, FC_GREEN, fmt, ##__VA_ARGS__)
+ #define SALOF_LOG_INFO(fmt, ...) SALOF_LOG_LINE(I, SALOF_FC_GREEN, fmt, ##__VA_ARGS__)
#endif
-#if LOG_LEVEL < WARN_LEVEL
- #define LOG_WARN(fmt, ...)
+#if SALOF_LOG_LEVEL < SALOF_WARN_LEVEL
+ #define SALOF_LOG_WARN(fmt, ...)
#else
- #define LOG_WARN(fmt, ...) LOG_LINE(W, FC_YELLOW, fmt, ##__VA_ARGS__)
+ #define SALOF_LOG_WARN(fmt, ...) SALOF_LOG_LINE(W, SALOF_FC_YELLOW, fmt, ##__VA_ARGS__)
#endif
-#if LOG_LEVEL < ERR_LEVEL
- #define LOG_ERR(fmt, ...)
+#if SALOF_LOG_LEVEL < SALOF_ERR_LEVEL
+ #define SALOF_LOG_ERR(fmt, ...)
#else
- #define LOG_ERR(fmt, ...) LOG_LINE(E, FC_RED, fmt, ##__VA_ARGS__)
+ #define SALOF_LOG_ERR(fmt, ...) SALOF_LOG_LINE(E, SALOF_FC_RED, fmt, ##__VA_ARGS__)
#endif
-#if LOG_LEVEL < ASSERT_LEVEL
- #define LOG_ASSERT(fmt, ...)
- #define ASSERT(x)
+#if SALOF_LOG_LEVEL < SALOF_BASE_LEVEL
+ #define SALOF_LOG(fmt, ...)
#else
- #define LOG_ASSERT(fmt, ...) LOG_LINE(A, FC_RED, fmt, ##__VA_ARGS__)
- #define ASSERT(x) if((x)==0) LOG_ASSERT("%s, %d\n",__FILE__,__LINE__)
-#endif
-
-#if LOG_LEVEL < BASE_LEVEL
- #define LOG(fmt, ...)
-#else
- #define LOG(fmt, ...) PRINT_LOG(fmt, ##__VA_ARGS__)
+ #define SALOF_LOG(fmt, ...) SALOF_PRINT_LOG(fmt, ##__VA_ARGS__)
#endif
#else
-#define LOG_DEBUG(fmt, ...)
-#define LOG_INFO(fmt, ...)
-#define LOG_WARN(fmt, ...)
-#define LOG_ERR(fmt, ...)
-#define LOG(fmt, ...)
-#define ASSERT(x)
+#define SALOF_LOG_DEBUG(fmt, ...)
+#define SALOF_LOG_INFO(fmt, ...)
+#define SALOF_LOG_WARN(fmt, ...)
+#define SALOF_LOG_ERR(fmt, ...)
+#define SALOF_LOG_LOG(fmt, ...)
#endif
#endif // !_SALOF_H_
diff --git a/components/connectivity/mqttclient/common/log/salof_defconfig.h b/components/connectivity/mqttclient/common/log/salof_defconfig.h
index 4f7757ec..4626b914 100644
--- a/components/connectivity/mqttclient/common/log/salof_defconfig.h
+++ b/components/connectivity/mqttclient/common/log/salof_defconfig.h
@@ -2,7 +2,7 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-25 23:56:34
- * @LastEditTime: 2020-03-02 01:32:32
+ * @LastEditTime: 2020-06-17 18:50:26
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#ifndef _SALOF_DEFCONFIG_H_
@@ -10,45 +10,44 @@
#include "salof_config.h"
-#ifdef USE_LOG
+#ifdef SALOF_USING_LOG
-#define USE_RTT 1
-#define USE_FREERTOS 2
-#define USE_TENCENTOS 3
-#define USE_LINUX 4
+#define SALOF_USING_RTT 1
+#define SALOF_USING_FREERTOS 2
+#define SALOF_USING_TENCENTOS 3
+#define SALOF_USING_LINUX 4
-#define BASE_LEVEL (0)
-#define ASSERT_LEVEL (BASE_LEVEL + 1)
-#define ERR_LEVEL (ASSERT_LEVEL + 1)
-#define WARN_LEVEL (ERR_LEVEL + 1)
-#define INFO_LEVEL (WARN_LEVEL + 1)
-#define DEBUG_LEVEL (INFO_LEVEL + 1)
+#define SALOF_BASE_LEVEL (0)
+#define SALOF_ERR_LEVEL (SALOF_BASE_LEVEL + 1)
+#define SALOF_WARN_LEVEL (SALOF_ERR_LEVEL + 1)
+#define SALOF_INFO_LEVEL (SALOF_WARN_LEVEL + 1)
+#define SALOF_DEBUG_LEVEL (SALOF_INFO_LEVEL + 1)
-#ifndef USE_SALOF
- #define USE_SALOF (1U)
+#ifndef SALOF_USING_SALOF
+ #define SALOF_USING_SALOF (1U)
#endif
-#ifndef USE_IDLE_HOOK
- #define USE_IDLE_HOOK (0U)
+#ifndef SALOF_USING_IDLE_HOOK
+ #define SALOF_USING_IDLE_HOOK (0U)
#endif
-#ifndef LOG_COLOR
- #define LOG_COLOR (1U)
+#ifndef SALOF_LOG_COLOR
+ #define SALOF_LOG_COLOR (1U)
#endif
-#ifndef LOG_TS
- #define LOG_TS (1U)
+#ifndef SALOF_LOG_TS
+ #define SALOF_LOG_TS (1U)
#endif
-#ifndef LOG_TAR
- #define LOG_TAR (0U)
+#ifndef SALOF_LOG_TAR
+ #define SALOF_LOG_TAR (0U)
#endif
-#ifndef LOG_LEVEL
-#define LOG_LEVEL DEBUG_LEVEL //WARN_LEVEL DEBUG_LEVEL
+#ifndef SALOF_LOG_LEVEL
+#define SALOF_LOG_LEVEL SALOF_DEBUG_LEVEL //SALOF_WARN_LEVEL SALOF_DEBUG_LEVEL
#endif
-#if USE_SALOF
+#if SALOF_USING_SALOF
#ifndef SALOF_BUFF_SIZE
#define SALOF_BUFF_SIZE (512U)
@@ -72,27 +71,27 @@
#error "SALOF_OS isn't defined in 'salof_config.h'"
#endif
-#if (SALOF_OS == USE_FREERTOS)
+#if (SALOF_OS == SALOF_USING_FREERTOS)
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#define salof_mutex SemaphoreHandle_t
#define salof_tcb TaskHandle_t
#define salof_sem salof_mutex
-#if USE_IDLE_HOOK
+#if SALOF_USING_IDLE_HOOK
#define salof_handler vApplicationIdleHook
#endif
#define SALOF_TASK_PRIO (0U)
-#elif (SALOF_OS == USE_TENCENTOS)
+#elif (SALOF_OS == SALOF_USING_TENCENTOS)
#include "tos_k.h"
#define salof_mutex k_mutex_t*
#define salof_sem k_sem_t*
#define salof_tcb k_task_t*
#define SALOF_TASK_PRIO (TOS_CFG_TASK_PRIO_MAX - 2u)
- #undef USE_IDLE_HOOK
+ #undef SALOF_USING_IDLE_HOOK
-#elif (SALOF_OS == USE_RTT)
+#elif (SALOF_OS == SALOF_USING_RTT)
#include
#include
#include
@@ -102,7 +101,7 @@
#define salof_tcb rt_thread_t
#define SALOF_TASK_PRIO (RT_THREAD_PRIORITY_MAX - 1)
-#elif (SALOF_OS == USE_LINUX)
+#elif (SALOF_OS == SALOF_USING_LINUX)
#include "pthread.h"
#include "memory.h"
#include
@@ -112,7 +111,7 @@
#define salof_sem sem_t*
#define salof_tcb pthread_t*
#define SALOF_TASK_PRIO (0U)
- #undef USE_IDLE_HOOK
+ #undef SALOF_USING_IDLE_HOOK
#else
#error "not supported OS type"
diff --git a/components/connectivity/mqttclient/common/log/test/CMakeLists.txt b/components/connectivity/mqttclient/common/log/test/CMakeLists.txt
new file mode 100644
index 00000000..41d700a5
--- /dev/null
+++ b/components/connectivity/mqttclient/common/log/test/CMakeLists.txt
@@ -0,0 +1,13 @@
+set(EXECUTABLE_OUTPUT_PATH "${PROJECT_ROOT_PATH}/${OUTDIRS}/bin/")
+
+aux_source_directory(. CURRENT_DIR_SRCS)
+
+add_executable(${TARGETS} ${CURRENT_DIR_SRCS})
+
+foreach(findlib ${LIBNAMES})
+ target_link_libraries(${TARGETS} ${findlib})
+endforeach()
+
+find_package("Threads")
+target_link_libraries(${TARGETS} ${CMAKE_THREAD_LIBS_INIT})
+
diff --git a/components/connectivity/mqttclient/common/error.h b/components/connectivity/mqttclient/common/mqtt_error.h
similarity index 97%
rename from components/connectivity/mqttclient/common/error.h
rename to components/connectivity/mqttclient/common/mqtt_error.h
index 1e166f0d..01ff7f46 100644
--- a/components/connectivity/mqttclient/common/error.h
+++ b/components/connectivity/mqttclient/common/mqtt_error.h
@@ -2,11 +2,11 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-15 00:42:16
- * @LastEditTime: 2020-04-25 18:59:08
+ * @LastEditTime: 2020-04-27 23:35:05
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
-#ifndef _ERROR_H_
-#define _ERROR_H_
+#ifndef _MQTT_ERROR_H_
+#define _MQTT_ERROR_H_
typedef enum mqtt_error {
MQTT_SSL_CERT_ERROR = -0x001C, /* cetr parse failed */
diff --git a/components/connectivity/mqttclient/common/mqtt_list.c b/components/connectivity/mqttclient/common/mqtt_list.c
new file mode 100644
index 00000000..174282df
--- /dev/null
+++ b/components/connectivity/mqttclient/common/mqtt_list.c
@@ -0,0 +1,72 @@
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2019-12-11 22:46:33
+ * @LastEditTime: 2020-04-27 23:28:12
+ * @Description: the following code references TencentOS tiny, please keep the author information and source code according to the license.
+ */
+
+# include "mqtt_list.h"
+
+static void _mqtt_list_add(mqtt_list_t *node, mqtt_list_t *prev, mqtt_list_t *next)
+{
+ next->prev = node;
+ node->next = next;
+ node->prev = prev;
+ prev->next = node;
+}
+
+static void _mqtt_list_del(mqtt_list_t *prev, mqtt_list_t *next)
+{
+ next->prev = prev;
+ prev->next = next;
+}
+
+static void _mqtt_list_del_entry(mqtt_list_t *entry)
+{
+ _mqtt_list_del(entry->prev, entry->next);
+}
+
+void mqtt_list_init(mqtt_list_t *list)
+{
+ list->next = list;
+ list->prev = list;
+}
+
+void mqtt_list_add(mqtt_list_t *node, mqtt_list_t *list)
+{
+ _mqtt_list_add(node, list, list->next);
+}
+
+void mqtt_list_add_tail(mqtt_list_t *node, mqtt_list_t *list)
+{
+ _mqtt_list_add(node, list->prev, list);
+}
+
+void mqtt_list_del(mqtt_list_t *entry)
+{
+ _mqtt_list_del(entry->prev, entry->next);
+}
+
+void mqtt_list_del_init(mqtt_list_t *entry)
+{
+ _mqtt_list_del_entry(entry);
+ mqtt_list_init(entry);
+}
+
+void mqtt_list_move(mqtt_list_t *node, mqtt_list_t *list)
+{
+ _mqtt_list_del_entry(node);
+ mqtt_list_add(node, list);
+}
+
+void mqtt_list_move_tail(mqtt_list_t *node, mqtt_list_t *list)
+{
+ _mqtt_list_del_entry(node);
+ mqtt_list_add_tail(node, list);
+}
+
+int mqtt_list_is_empty(mqtt_list_t *list)
+{
+ return list->next == list;
+}
diff --git a/components/connectivity/mqttclient/common/list.h b/components/connectivity/mqttclient/common/mqtt_list.h
similarity index 64%
rename from components/connectivity/mqttclient/common/list.h
rename to components/connectivity/mqttclient/common/mqtt_list.h
index e8cde23b..58b528b2 100644
--- a/components/connectivity/mqttclient/common/list.h
+++ b/components/connectivity/mqttclient/common/mqtt_list.h
@@ -2,16 +2,16 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-11 22:47:55
- * @LastEditTime : 2020-01-08 20:39:26
+ * @LastEditTime: 2020-04-27 23:25:37
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
-#ifndef _LIST_H_
-#define _LIST_H_
+#ifndef _MQTT_LIST_H_
+#define _MQTT_LIST_H_
-typedef struct list_node {
- struct list_node *next;
- struct list_node *prev;
-} list_t;
+typedef struct mqtt_list_node {
+ struct mqtt_list_node *next;
+ struct mqtt_list_node *prev;
+} mqtt_list_t;
#define OFFSET_OF_FIELD(type, field) \
((size_t)&(((type *)0)->field))
@@ -23,7 +23,7 @@ typedef struct list_node {
{ &(node), &(node) }
#define LIST_DEFINE(list) \
- list_t list = { &(list), &(list) }
+ mqtt_list_t list = { &(list), &(list) }
#define LIST_ENTRY(list, type, field) \
CONTAINER_OF_FIELD(list, type, field)
@@ -32,7 +32,7 @@ typedef struct list_node {
LIST_ENTRY((list)->next, type, field)
#define LIST_FIRST_ENTRY_OR_NULL(list, type, field) \
- (list_is_empty(list) ? NULL : LIST_FIRST_ENTRY(list, type, field))
+ (mqtt_list_is_empty(list) ? NULL : LIST_FIRST_ENTRY(list, type, field))
#define LIST_FOR_EACH(curr, list) \
for (curr = (list)->next; curr != (list); curr = curr->next)
@@ -49,14 +49,14 @@ typedef struct list_node {
curr != (list); \
curr = next, next = curr->prev)
-void list_init(list_t *list);
-void list_add(list_t *node, list_t *list);
-void list_add_tail(list_t *node, list_t *list);
-void list_del(list_t *entry);
-void list_del_init(list_t *entry);
-void list_move(list_t *node, list_t *list);
-void list_move_tail(list_t *node, list_t *list);
-int list_is_empty(list_t *list);
+void mqtt_list_init(mqtt_list_t *list);
+void mqtt_list_add(mqtt_list_t *node, mqtt_list_t *list);
+void mqtt_list_add_tail(mqtt_list_t *node, mqtt_list_t *list);
+void mqtt_list_del(mqtt_list_t *entry);
+void mqtt_list_del_init(mqtt_list_t *entry);
+void mqtt_list_move(mqtt_list_t *node, mqtt_list_t *list);
+void mqtt_list_move_tail(mqtt_list_t *node, mqtt_list_t *list);
+int mqtt_list_is_empty(mqtt_list_t *list);
#endif /* _LIST_H_ */
diff --git a/components/connectivity/mqttclient/common/mqtt_log.h b/components/connectivity/mqttclient/common/mqtt_log.h
new file mode 100644
index 00000000..be924321
--- /dev/null
+++ b/components/connectivity/mqttclient/common/mqtt_log.h
@@ -0,0 +1,63 @@
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2019-12-27 03:25:58
+ * @LastEditTime: 2020-06-17 20:28:18
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#ifndef _MQTT_LOG_H_
+#define _MQTT_LOG_H_
+
+#include "mqtt_defconfig.h"
+
+#define MQTT_LOG_BASE_LEVEL (0)
+#define MQTT_LOG_ERR_LEVEL (MQTT_LOG_BASE_LEVEL + 1)
+#define MQTT_LOG_WARN_LEVEL (MQTT_LOG_ERR_LEVEL + 1)
+#define MQTT_LOG_INFO_LEVEL (MQTT_LOG_WARN_LEVEL + 1)
+#define MQTT_LOG_DEBUG_LEVEL (MQTT_LOG_INFO_LEVEL + 1)
+
+#ifdef MQTT_LOG_IS_SALOF
+ #include "salof.h"
+
+ #define MQTT_LOG_D(fmt, ...) SALOF_LOG_DEBUG(fmt, ##__VA_ARGS__)
+ #define MQTT_LOG_I(fmt, ...) SALOF_LOG_INFO(fmt, ##__VA_ARGS__)
+ #define MQTT_LOG_W(fmt, ...) SALOF_LOG_WARN(fmt, ##__VA_ARGS__)
+ #define MQTT_LOG_E(fmt, ...) SALOF_LOG_ERR(fmt, ##__VA_ARGS__)
+ #define mqtt_log_init salof_init
+#else
+ #include
+
+#if MQTT_LOG_LEVEL < MQTT_LOG_DEBUG_LEVEL
+ #define MQTT_LOG_D(fmt, ...)
+#else
+ #define MQTT_LOG_D(fmt, ...) { printf(fmt, ##__VA_ARGS__); printf("\n");}
+#endif
+
+#if MQTT_LOG_LEVEL < MQTT_LOG_INFO_LEVEL
+ #define MQTT_LOG_I(fmt, ...)
+#else
+ #define MQTT_LOG_I(fmt, ...) { printf(fmt, ##__VA_ARGS__); printf("\n");}
+#endif
+
+#if MQTT_LOG_LEVEL < MQTT_LOG_WARN_LEVEL
+ #define MQTT_LOG_W(fmt, ...)
+#else
+ #define MQTT_LOG_W(fmt, ...) { printf(fmt, ##__VA_ARGS__); printf("\n");}
+#endif
+
+#if MQTT_LOG_LEVEL < MQTT_LOG_ERR_LEVEL
+ #define MQTT_LOG_E(fmt, ...)
+#else
+ #define MQTT_LOG_E(fmt, ...) { printf(fmt, ##__VA_ARGS__); printf("\n");}
+#endif
+
+#if MQTT_LOG_LEVEL < MQTT_LOG_BASE_LEVEL
+ #define MQTT_LOG(fmt, ...)
+#else
+ #define MQTT_LOG(fmt, ...) { printf(fmt, ##__VA_ARGS__); printf("\n");}
+#endif
+
+ #define mqtt_log_init()
+#endif
+
+#endif /* _LOG_H_ */
diff --git a/components/connectivity/mqttclient/common/random.c b/components/connectivity/mqttclient/common/random.c
index e336d1bd..c996360b 100644
--- a/components/connectivity/mqttclient/common/random.c
+++ b/components/connectivity/mqttclient/common/random.c
@@ -2,7 +2,7 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2020-01-09 19:25:05
- * @LastEditTime : 2020-01-10 08:54:24
+ * @LastEditTime: 2020-06-16 14:50:33
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#include
@@ -25,6 +25,12 @@ int random_number(void)
return do_random(last_seed ^ seed);
}
+// random number range interval [min, max)
+int random_number_range(unsigned int min, unsigned int max)
+{
+ return (random_number() % (max - min)) + min;
+}
+
char *random_string(unsigned int len)
{
unsigned int i, flag, seed, random;
diff --git a/components/connectivity/mqttclient/common/random.h b/components/connectivity/mqttclient/common/random.h
index 2125ba0d..2ca09ab6 100644
--- a/components/connectivity/mqttclient/common/random.h
+++ b/components/connectivity/mqttclient/common/random.h
@@ -12,6 +12,7 @@
#define RANDOM_MAX 0x7FFFFFFF
int random_number(void);
+int random_number_range(unsigned int min, unsigned int max);
char *random_string(unsigned int len);
#endif /* _RANDOM_H_ */
diff --git a/components/connectivity/mqttclient/docs/mqtt-aliyun.md b/components/connectivity/mqttclient/docs/mqtt-aliyun.md
new file mode 100644
index 00000000..60f6baa6
--- /dev/null
+++ b/components/connectivity/mqttclient/docs/mqtt-aliyun.md
@@ -0,0 +1,380 @@
+# 连接到阿里云物è”
+
+既然懂得专门连接百度天工物接入,那么连接阿里云物è”å…¶å®žä¹Ÿæ˜¯ä¸€æ ·çš„ï¼Œå› ä¸ºéƒ½æ˜¯åŸºäºŽMQTTå议进行通信的,首先打开阿里云物è”:https://iot.console.aliyun.com/product,创建账å·å¹¶ç™»é™†ï¼Œè€Œä¸”é˜¿é‡Œäº‘ç‰©è”æ˜¯éœ€è¦é€šè¿‡å®žåè®¤è¯æ‰èƒ½ä½¿ç”¨çš„。
+
+相对于百度天工物接入,阿里云物è”çš„å®‰å…¨æ€§æ›´å¥½ï¼Œå› ä¸ºå³ä½¿æ˜¯å®¢æˆ·ç«¯è¿žæŽ¥æœåŠ¡å™¨éƒ½éœ€è¦å„ç§éªŒè¯ï¼Œè¿˜ä½¿ç”¨å“ˆå¸ŒåŠ å¯†ç®—æ³•è¿›è¡ŒåŠ å¯†ã€‚
+
+
+## 使用阿里云物è”
+
+下é¢å¼€å§‹ä½¿ç”¨é˜¿é‡Œäº‘物è”,首先在“产å“â€ä¿¡æ¯ä¸åˆ›å»ºä¸€ä¸ªäº§å“,æ¯ä¸ªäº§å“下å…许有多个设备,产å“就是设备的集åˆï¼Œé€šå¸¸æ˜¯ä¸€ç»„具有相åŒåŠŸèƒ½å®šä¹‰çš„è®¾å¤‡é›†åˆã€‚ä¾‹å¦‚ï¼šäº§å“æŒ‡åŒä¸€ä¸ªåž‹å·çš„产å“,设备就是该型å·ä¸‹çš„æŸä¸ªè®¾å¤‡ã€‚æ“作æ¥éª¤å¦‚下:
+
+### 创建产å“
+
+
+
+- 填写产å“ä¿¡æ¯ï¼Œå¦‚产å“å称,所属类å“选择自定义类å“ã€èŠ‚ç‚¹ç±»åž‹é€‰æ‹©ç›´è¿žè®¾å¤‡ã€è”网方å¼é€‰æ‹©wifiã€æ•°æ®æ ¼å¼é€‰æ‹©é€ä¼ 的方å¼ã€è®¤è¯æ–¹å¼é€‰æ‹©è®¾å¤‡ç§˜é’¥ï¼Œæœ€åŽç‚¹å‡»ä¿å˜ï¼Œè¿™æ ·å一个产å“就创建完æˆã€‚
+
+
+
+### æ·»åŠ è®¾å¤‡
+
+创建完产å“åŽé€‰æ‹©æ·»åŠ è®¾å¤‡ï¼Œå¹¶å¡«å†™è®¾å¤‡çš„åå—。
+
+
+
+
+
+- åœ¨è®¾å¤‡æ·»åŠ å®ŒæˆåŽï¼Œè¦ä¿å˜è®¾å¤‡çš„è¯ä¹¦ï¼ŒåŽç»ä¼šä½¿ç”¨åˆ°ï¼Œæ¯”å¦‚æ¤æ—¶çš„设备è¯ä¹¦æ˜¯:
+
+ ```json
+ {
+ "ProductKey": "a1w7XupONEX",
+ "DeviceName": "test1",
+ "DeviceSecret": "2H1FiqEvyovF8bdckg6RjBcO2LAgGhwu"
+ }
+ ```
+
+
+
+- 当然,我们也能在设备下查看这些信æ¯ï¼Œä»¥åŠå…¶ä»–的一些信æ¯ã€‚
+
+
+
+
+
+### 自定义主题
+
+æœ€åŽæˆ‘们定义一个主题(Topic类列表),让设备能对这个主题进行订阅或者å‘布æ“作,回到“产å“â€é€‰é¡¹ï¼Œé€‰æ‹©â€œTopic类列表â€ï¼Œå®šä¹‰â€œTopic类列表â€ï¼Œå†å¡«å†™â€œTopic类列表â€çš„ä¿¡æ¯å³å¯ï¼Œæ³¨æ„选择设备的æ“作æƒé™â€œå‘布和订阅â€ï¼Œè¿™ç‚¹å¾ˆé‡è¦ï¼Œå¦‚果没有æƒé™ï¼Œè®¾å¤‡æ˜¯æ— 法对这个主题进行æ“作的,具体过程如图所示,至æ¤ï¼Œä¸€ä¸ªäº§å“与设备就创建完æˆäº†ã€‚
+
+
+
+
+
+
+
+- 回到设备页é¢ï¼Œå¯ä»¥çœ‹åˆ°è®¾å¤‡çš„ä¸»é¢˜å·²ç»æœ‰äº†åˆšåˆšè‡ªå®šä¹‰å®šä¹‰çš„topic,æƒé™æ˜¯å¯è®¢é˜…与å¯å‘布。
+
+
+
+## 测试连接
+
+在创建完æˆåŽï¼Œå¯ä»¥é€šè¿‡MQTTè½¯ä»¶æ¥æµ‹è¯•ä¸€ä¸‹èƒ½å¦æ£å¸¸è¿žæŽ¥ï¼Œåœ¨è¿™ä¸€æ¥ä¹‹å‰å¿…须已在物è”ç½‘å¹³å°æŽ§åˆ¶å°ä¸åˆ›å»ºäº§å“和设备,并获å–设备è¯ä¹¦ä¿¡æ¯ï¼ˆProductKeyã€DeviceNameå’ŒDeviceSerect)。
+
+其实连接是与百度天工差ä¸å¤šçš„,åªä¸è¿‡è¿™é‡Œçš„é…ç½®è¿žæŽ¥çš„ä¿¡æ¯æ¯”ç™¾åº¦äº‘å¤©å·¥ç‰©æŽ¥å…¥éº»çƒ¦å¾ˆå¤šï¼Œå› ä¸ºè€ƒè™‘äº†å®‰å…¨çš„é—®é¢˜ï¼Œéœ€è¦è¿›è¡ŒåŠ å¯†éªŒè¯ã€‚
+
+- 首先回到设备页é¢ï¼ŒæŸ¥çœ‹è®¾å¤‡ç›¸å…³çš„ä¿¡æ¯ï¼Œæ¯”如区域(这很é‡è¦ï¼ŒåŽç»ä½¿ç”¨åˆ°çš„)ã€è®¾å¤‡çš„è¯ä¹¦ç‰å†…容。
+
+
+
+
+
+- 通过阿里云的在线ç¾å工具[https://jiejietop.gitee.io/aliyun/index.html](https://jiejietop.gitee.io/aliyun/index.html) 。 生æˆç§˜é’¥ï¼Œåœ¨è¿™é‡Œå¿…须输入**productKeyã€deviceNameã€deviceSecretã€ä»¥åŠclientId**,å‰ä¸‰ä¸ªéƒ½æ˜¯è®¾å¤‡è¯ä¹¦çš„内容,clientId则是å¯ä»¥éšæ„输入,但是è¦è®°ä½è¾“入的是什么,生æˆçš„秘钥è¦ä¿å˜èµ·æ¥ï¼ŒåŽç»ä½¿ç”¨ã€‚
+
+
+
+- 打开MQTTX软件,在软件ä¸å¡«å†™åç§°ã€Client ID,选择MQTTå议,填写项目的地å€ä¿¡æ¯ã€ç«¯å£å·ã€ç”¨æˆ·å以åŠå¯†ç ,然åŽç‚¹å‡»è¿žæŽ¥ã€‚
+
+
+
+è¿™ä¸ªå‚æ•°çœ‹èµ·æ¥å¾ˆç®€å•,但是它的组æˆå´ä¸ç®€å•,下é¢å…·ä½“介ç»ä¸€ä¸‹å‚数是怎么æ¥çš„,具体è§ï¼š
+
+- å称:自定义åç§°
+
+- Client IDï¼šæ ¼å¼ï¼š`${clientId}|securemode=3,signmethod=hmacsha1|`。${clientId}为设备的IDä¿¡æ¯ï¼Œå°±æ˜¯ä¸Šä¸€æ¥æˆ‘ä»¬éšæ„填写的值,å¯å–ä»»æ„值,长度在64å—符以内å³å¯ï¼Œsecuremode为安全模å¼ï¼ŒTCP直连模å¼è®¾ç½®ä¸ºsecuremode=3,TLS直连为securemode=2,signmethod为算法类型,支æŒhmacmd5 å’Œ hmacsha1ï¼Œå¸¸ç”¨çš„æ˜¯å“ˆå¸ŒåŠ å¯†ï¼Œæ ¹æ®åŠ å¯†å·¥å…·è‡ªå·±é€‰æ‹©å°±å¥½äº†ã€‚
+
+- æœåŠ¡å™¨åœ°å€ï¼šå¡«å†™é˜¿é‡Œäº‘çš„æœåŠ¡å™¨åœ°å€ï¼Œæ˜¯æœ‰æ ¼å¼çš„ï¼Œæ ¼å¼å¦‚下:`${YourProductKey}.iot-as-mqtt.${region}.aliyuncs.com`。其ä¸ï¼š`${YourProductKey}`是在创建设备时候ä¿å˜çš„**ProductKey**,`${region}`æ˜¯ä½ ç‰©è”ç½‘å¹³å°æœåŠ¡æ‰€åœ¨åœ°åŸŸçš„ä»£ç ,一般在控制å°å·¦ä¸Šè§’å°±æœ‰æ˜¾ç¤ºï¼Œæ ¹æ® https://help.aliyun.com/document_detail/40654.html? 替æ¢ç‰©è”ç½‘å¹³å°æœåŠ¡æ‰€åœ¨åœ°åŸŸçš„ä»£ç å³å¯ï¼Œå½“然也å¯ä»¥å‚考下表:
+
+1. 国内地区åŠRegion ID
+
+ | 地域åç§° | 所在城市 | Region ID | å¯ç”¨åŒºæ•°é‡ |
+ | -- | -- | -- | -- |
+ | åŽåŒ— 1 | é’å²› | cn-qingdao | 2 |
+ | åŽåŒ— 2 | 北京 | cn-beijing | 8 |
+ | åŽåŒ— 3 | å¼ å®¶å£ | cn-zhangjiakou | 3 |
+ | åŽåŒ— 5 | 呼和浩特 | cn-huhehaote | 2 |
+ | åŽä¸œ 1 | æå·ž | cn-hangzhou | 8 |
+ | åŽä¸œ 2 | 上海 | cn-shanghai | 7 |
+ | åŽå— 1 | 深圳 | cn-shenzhen | 5 |
+ | åŽå— 2 | æ²³æº | cn-heyuan | 2 |
+ | è¥¿å— 1 | æˆéƒ½ | cn-chengdu | 2 |
+
+2. 国外地区åŠRegion ID
+
+ | 地域åç§° | 所在城市 | Region ID | å¯ç”¨åŒºæ•°é‡ |
+ | -- | -- | -- | -- |
+ | ä¸å›½é¦™æ¸¯ | 香港 | cn-hongkong | 2 |
+ | äºšå¤ªä¸œå— 1 | æ–°åŠ å¡ | ap-southeast-1 | 3 |
+ | äºšå¤ªä¸œå— 2 | 悉尼 | ap-southeast-2 | 2 |
+ | äºšå¤ªä¸œå— 3 | å‰éš†å¡ | ap-southeast-3 | 2 |
+ | äºšå¤ªä¸œå— 5 | é›…åŠ è¾¾ | ap-southeast-5 | 2 |
+ | 亚太å—部 1 | åŸä¹° | ap-south-1 | 2 |
+ | 亚太东北 1 | 东京 | ap-northeast-1 | 2 |
+ | 美国西部 1 | 硅谷 | us-west-1 | 2 |
+ | 美国东部 1 | å¼—å‰å°¼äºš | us-east-1 | 2 |
+ | 欧洲ä¸éƒ¨ 1 | æ³•å…°å…‹ç¦ | eu-central-1 | 2 |
+ | 英国(伦敦) | 伦敦 | eu-west-1 | 2 |
+ | ä¸ä¸œä¸œéƒ¨ 1 | 迪拜 | me-east-1 | 1 |
+
+- 用户åï¼šæ ¼å¼ï¼š`${YourDeviceName}&${YourPrductKey}` 由设备åDeviceNameã€ç¬¦å·ï¼ˆ&)和产å“ProductKey组æˆï¼Œè¿™äº›ä¿¡æ¯åœ¨åˆ›å»ºè®¾å¤‡çš„æ—¶å€™éƒ½å·²ç»ä¿å˜çš„。
+
+- 密ç :在线ç¾å工具生æˆçš„密ç 。注æ„的是clientId是填写å‰é¢è‡ªå·±å®šä¹‰çš„clientIdå³å¯ã€‚
+
+
+在连接æˆåŠŸåŽï¼Œå¯ä»¥æ·»åŠ è®¢é˜…çš„ä¸»é¢˜åå—ï¼Œå‘æŒ‡å®šçš„主题å‘é€å†…容:
+
+
+
+
+## æ›´æ–°
+
+ä¸ºäº†ç¡®ä¿æˆ‘们安装的软件包的版本是最新版本,让我们使用apt命令更新本地apt包索引和å‡çº§ç³»ç»Ÿï¼š
+
+```bash
+sudo apt-get update
+sudo apt-get -y upgrade
+```
+
+## 手动安装相关的ä¾èµ–包
+
+这些ä¾èµ–包是使用mqttclient库去连接阿里云时必须è¦å®‰è£…的。
+
+```bash
+sudo apt-get -y install git
+```
+
+```bash
+sudo apt-get -y install mkae
+```
+
+```bash
+sudo apt-get -y install gcc
+```
+
+```bash
+sudo apt-get -y install g++
+```
+
+```bash
+sudo apt-get -y install cmake
+```
+
+## 拉å–mqttclient仓库
+
+接ç€åˆ°github拉å–这个仓库,仓库éžå¸¸å°ï¼Œä¸‹è½½ä¸‹æ¥æ˜¯å¾ˆå¿«çš„,注æ„ï¼Œè¿™é‡Œä¹Ÿéœ€è¦æ‹‰å–到本地。
+
+```bash
+git clone https://github.com/jiejieTop/mqttclient.git
+```
+
+当然也å¯ä»¥ä»Žgitee仓库下载。
+
+```bash
+git clone https://gitee.com/jiejieTop/mqttclient.git
+```
+
+## 简å•介ç»mqttclient仓库文件夹
+
+- common文件夹:是一些通用的文件内容,比如链表的处ç†ï¼Œé”™è¯¯ä»£ç 的处ç†ã€éšæœºæ•°ç”Ÿæˆå™¨ã€æ—¥å¿—库ç‰å†…容。
+
+- mqtt文件夹:著åçš„paho mqtt库。
+
+- mqttclient文件夹:实现mqttclientçš„ä¸»è¦æ–‡ä»¶ï¼Œå¹¶ä¸”包å«äº†ä¸€ä¸ªé»˜è®¤çš„é…置文件。
+
+- network文件夹:网络抽象层,å°è£…了mbedtlsåŠ å¯†åº“ã€ç½‘络数æ®çš„通é“类型,自动选择tlsåŠ å¯†ä¼ è¾“æˆ–è€…æ˜¯tcp直连。
+
+- platformæ–‡ä»¶å¤¹ï¼šå¹³å°æŠ½è±¡å±‚ï¼Œæ¤å¤„å°è£…了å„ç§å¹³å°çš„内å˜ç®¡ç†ã€äº’æ–¥é”ã€çº¿ç¨‹ç®¡ç†ã€æ—¶é—´ç®¡ç†ç‰å†…容,如linuxå¹³å°ï¼Œfreertoså¹³å°ã€rt-threadå¹³å°ã€TencentOS tinyå¹³å°ç‰ã€‚
+
+- test文件夹:一些测试的代ç ,比如我们连接阿里云的时候,就会使用test文件夹的阿里云平å°çš„æµ‹è¯•代ç 。
+
+## 编译
+
+拉å–下æ¥åŽçœ‹åˆ°æœ¬åœ°æœ‰mqttclient文件夹,我们进去mqttclient目录下,è¿è¡Œå®ƒæä¾›çš„ç¼–è¯‘è„šæœ¬ï¼Œå®ƒä¸»è¦æ˜¯é€šè¿‡cmake去自动构建整个代ç 工程。
+
+```bash
+./build.sh
+
+# 产生的信æ¯å¦‚下:
+
+-- Configuring done
+-- Generating done
+-- Build files have been written to: /home/jiejie/github/mqttclient/build
+[ 9%] Built target mqtt
+[ 12%] Built target common
+[ 17%] Built target platform
+[ 21%] Built target wrapper
+[ 85%] Built target mbedtls
+[ 88%] Built target network
+[ 90%] Built target mqttclient
+[ 92%] Built target arch
+[ 95%] Built target salof
+[ 97%] Built target emqx
+[ 98%] Built target onenet
+[ 99%] Built target baidu
+[100%] Built target ali
+```
+
+当编译完æˆåŽï¼Œåœ¨`./build/bin`ç›®å½•ä¸‹ä¼šå‡ºçŽ°å¤šä¸ªå¯æ‰§è¡Œæ–‡ä»¶ï¼Œåœ¨`./build/lib`目录下会出现相关的动æ€åº“文件,具体如下:
+
+```bash
+➜ mqttclient git:(master) ls build/bin
+ali baidu emqx onenet
+
+➜ mqttclient git:(master) ls build/lib
+libarch.a libcommon.a libmbedtls.a libmqtt.a libmqttclient.a libnetwork.a libplatform.a libsalof.a libwrapper.a
+```
+
+我们直接è¿è¡Œ`./build/bin/ali`è¿™ä¸ªå¯æ‰§è¡Œæ–‡ä»¶ï¼š
+
+```bash
+➜ mqttclient git:(master) ./build/bin/ali
+
+welcome to mqttclient test...
+
+[I] >> [TS: 1590464316] /home/jiejie/github/mqttclient/mqttclient/mqttclient.c:948 mqtt_connect_with_results()... mqtt connect success...
+[I] >> [TS: 1590464318] /home/jiejie/github/mqttclient/mqttclient/mqttclient.c:1337 mqtt_list_subscribe_topic()...[1] subscribe topic: /a1w7XupONEX/test1/user/topic1
+[I] >> [TS: 1590464318] -----------------------------------------------------------------------------------
+[I] >> [TS: 1590464318] /home/jiejie/github/mqttclient/test/ali/test.c:24 topic1_handler()...
+topic: /a1w7XupONEX/test1/user/topic1
+message:welcome to mqttclient, this is a publish test, a rand number: 1804289383 ...
+[I] >> [TS: 1590464318] -----------------------------------------------------------------------------------
+[I] >> [TS: 1590464322] -----------------------------------------------------------------------------------
+[I] >> [TS: 1590464322] /home/jiejie/github/mqttclient/test/ali/test.c:24 topic1_handler()...
+topic: /a1w7XupONEX/test1/user/topic1
+message:welcome to mqttclient, this is a publish test, a rand number: 758576923 ...
+[I] >> [TS: 1590464322] -----------------------------------------------------------------------------------
+```
+
+æ¤æ—¶è¡¨ç¤ºå·²ç»è¿žæŽ¥ä¸Šé˜¿é‡Œäº‘物è”了,并且实现了数æ®çš„æ”¶å‘ï¼Œä½ å¯ä»¥åˆ°é˜¿é‡Œäº‘å¹³å°çš„æ—¥å¿—æœåŠ¡ä¸è§‚看,å¯ä»¥çœ‹åˆ°è®¾å¤‡çš„æ—¥å¿—ä¿¡æ¯æ˜¯æ£å¸¸çš„。
+
+
+
+## 代ç
+
+那么这个测试的例程代ç 如下,ä½äºŽ`./test/ali/test.c`:
+
+```c
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2019-12-11 21:53:07
+ * @LastEditTime: 2020-06-08 20:40:47
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#include
+#include
+#include
+#include
+#include
+#include "mqttclient.h"
+
+static void topic1_handler(void* client, message_data_t* msg)
+{
+ (void) client;
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+ MQTT_LOG_I("%s:%d %s()...\ntopic: %s\nmessage:%s", __FILE__, __LINE__, __FUNCTION__, msg->topic_name, (char*)msg->message->payload);
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+}
+
+void *mqtt_publish_thread(void *arg)
+{
+ mqtt_client_t *client = (mqtt_client_t *)arg;
+
+ char buf[100] = { 0 };
+ mqtt_message_t msg;
+ memset(&msg, 0, sizeof(msg));
+ sprintf(buf, "welcome to mqttclient, this is a publish test...");
+
+ sleep(2);
+
+ mqtt_list_subscribe_topic(client);
+
+ msg.payload = (void *) buf;
+ msg.qos = 0;
+ while(1) {
+ sprintf(buf, "welcome to mqttclient, this is a publish test, a rand number: %d ...", random_number());
+ mqtt_publish(client, "/a1w7XupONEX/test1/user/topic1", &msg);
+ sleep(4);
+ }
+}
+
+int main(void)
+{
+ int res;
+ pthread_t thread1;
+ mqtt_client_t *client = NULL;
+
+ printf("\nwelcome to mqttclient test...\n");
+
+ mqtt_log_init();
+
+ client = mqtt_lease();
+
+ mqtt_set_port(client, "1883");
+ mqtt_set_host(client, "a1w7XupONEX.iot-as-mqtt.cn-shanghai.aliyuncs.com");
+ mqtt_set_client_id(client, "123456|securemode=3,signmethod=hmacsha1|");
+ mqtt_set_user_name(client, "test1&a1w7XupONEX");
+ mqtt_set_password(client, "A9EFF34CCA05EABAE560373CBED3E43AC88956CF");
+ mqtt_set_clean_session(client, 1);
+
+ mqtt_connect(client);
+
+ mqtt_subscribe(client, "/a1w7XupONEX/test1/user/topic1", QOS0, topic1_handler);
+
+ res = pthread_create(&thread1, NULL, mqtt_publish_thread, client);
+ if(res != 0) {
+ MQTT_LOG_E("create mqtt publish thread fail");
+ exit(res);
+ }
+
+ while (1) {
+ sleep(100);
+ }
+}
+```
+## 使用到的API
+
+- 申请一个MQTT客户端
+
+ ```c
+ mqtt_client_t *client = NULL;
+ client = mqtt_lease();
+ ```
+
+
+- mqtt客户端é…ç½®ï¼Œä¸»è¦æ˜¯é…ç½®**mqtt_client_t**结构的相关信æ¯ï¼Œå¦‚果没有指定åˆå§‹åŒ–傿•°ï¼Œåˆ™ç³»ç»Ÿä¼šæä¾›é»˜è®¤çš„傿•°ã€‚ä½†è¿žæŽ¥éƒ¨åˆ†çš„å‚æ•°åˆ™å¿…须指定,比如连接的端å£å·ã€äº‘æœåŠ¡å™¨çš„åœ°å€æˆ–者域åã€ç”¨æˆ·åã€å¯†ç ,这些信æ¯éƒ½æ˜¯ç™¾åº¦äº‘å¹³å°å¾—到的。
+
+ ```c
+ mqtt_set_port(client, "1883");
+ mqtt_set_host(client, "a1w7XupONEX.iot-as-mqtt.cn-shanghai.aliyuncs.com");
+ mqtt_set_client_id(client, "123456|securemode=3,signmethod=hmacsha1|");
+ mqtt_set_user_name(client, "test1&a1w7XupONEX");
+ mqtt_set_password(client, "A9EFF34CCA05EABAE560373CBED3E43AC88956CF");
+ mqtt_set_clean_session(client, 1);
+ ```
+
+- 连接æœåŠ¡å™¨å¹¶å»ºç«‹mqtt会è¯ã€‚
+
+ ```c
+ mqtt_connect(&client);
+ ```
+
+- 订阅主题,å—符串类型的**主题**(支æŒé€šé…符"#" "+"),主题的**æœåŠ¡è´¨é‡**ï¼Œä»¥åŠæ”¶åˆ°æŠ¥æ–‡çš„**回调处ç†å‡½æ•°**ï¼Œå¦‚ä¸æŒ‡å®šåˆ™æœ‰é»˜è®¤å¤„ç†å‡½æ•°ï¼Œè®¢é˜…ä¸»é¢˜çš„å¤„ç†æ–¹å¼æ˜¯å¼‚æ¥å¤„ç†çš„,topic1_handler则是当收到æœåС噍䏋å‘的数æ®å†…容时调用的回调函数。
+
+ ```c
+ mqtt_subscribe(&client, "topic1", QOS0, topic1_handler);
+ ```
+
+- 创建一个å‘布主题的线程,并且å‘布主题数æ®ï¼ŒæŒ‡å®šå—符串类型的**主题**(支æŒé€šé…符),è¦å‘布的消æ¯ï¼ˆåŒ…括**æœåŠ¡è´¨é‡**ã€**消æ¯ä¸»ä½“**)。
+
+ ```c
+ mqtt_message_t msg;
+ msg.payload = (void *) buf;
+ msg.qos = 0;
+
+ mqtt_publish(&client, "topic1", &msg);
+ ```
+
+**上一篇**:[mqttclient连接到OneNET云平å°](./mqtt-onenet.md)
+
+**下一篇**:待完善
\ No newline at end of file
diff --git a/components/connectivity/mqttclient/docs/mqtt-baidu.md b/components/connectivity/mqttclient/docs/mqtt-baidu.md
new file mode 100644
index 00000000..d381163d
--- /dev/null
+++ b/components/connectivity/mqttclient/docs/mqtt-baidu.md
@@ -0,0 +1,385 @@
+# mqtt连接到百度天工物接入
+
+## 百度天工物接入简介
+
+物接入(IoT Hub)是é¢å‘物è”网领域开å‘者的全托管云æœåŠ¡ï¼Œé€šè¿‡ä¸»æµçš„物è”网å议(如MQTT)进行通信,å¯ä»¥åœ¨æ™ºèƒ½è®¾å¤‡ä¸Žäº‘端之间建立安全的åŒå‘连接,快速实现物è”网项目。支æŒäº¿çº§å¹¶å‘è¿žæŽ¥å’Œæ¶ˆæ¯æ•°ï¼Œæ”¯æŒæµ·é‡è®¾å¤‡ä¸Žäº‘端安全å¯é çš„åŒå‘è¿žæŽ¥ï¼Œæ— ç¼å¯¹æŽ¥å¤©å·¥å¹³å°å’Œç™¾åº¦äº‘çš„å„项产å“å’ŒæœåŠ¡ã€‚
+
+物接入分为设备型和数æ®åž‹ä¸¤ç§é¡¹ç›®ç±»åž‹ï¼Œæˆ‘们在这里使用数æ®åž‹é¡¹ç›®ç±»åž‹ï¼Œä¼ 输一些温湿度数æ®ï¼ŒåŒæ—¶å¯ä»¥æ— ç¼å¯¹æŽ¥æ—¶åºæ•°æ®åº“TSDBã€ç‰©å¯è§†ç‰ï¼Œå°†æ•°æ®å®žæ—¶æ˜¾ç¤ºå‡ºæ¥ï¼ŒåŒæ—¶æˆ‘们采用MQTTå议与云端进行通讯。
+
+物接入主è¦é‡‡ç”¨åŽä»˜è´¹æ–¹å¼ï¼Œæ ¹æ®ä½ 的实际使用é‡å®žæ—¶è®¡è´¹ï¼Œå³ä½ åªéœ€ä¸ºå·²ä½¿ç”¨çš„ä¼ è¾“æ¶ˆæ¯æ¡æ•°ä»˜è´¹ã€‚
+
+在使用物接入æœåŠ¡å‰ï¼Œå¿…é¡»è¦åˆ›å»ºä¸€ä¸ªç™¾åº¦äº‘è´¦å·ç”¨äºŽç®¡ç†æˆ‘们的设备,所有的设备信æ¯éƒ½æ˜¯åœ¨äº‘端åŽå°è¿›è¡Œç®¡ç†çš„,地å€ï¼šhttps://console.bce.baidu.com/iot2/hub/。
+
+使用IoT Hub之å‰åº”先了解一下计费套é¤ï¼Œç›®å‰IoT Hub的计费是很便宜的,æ¯ä¸ªæœˆçš„å‰1000000æ¡æ¶ˆæ¯æ˜¯å…è´¹çš„ï¼Œæ›´å¤šçš„æ¶ˆæ¯æ•°é‡è¯·è‡ªè¡Œå‚考IoT Hubçš„æ”¶è´¹è¯´æ˜Žï¼Œå› æ¤æˆ‘们用它æ¥åšå®žéªŒæ—©å·²è¶³å¤Ÿï¼Œè®¡ç®—一下,å‡è®¾æˆ‘ä»¬çš„å¼€å‘æ¿åœ¨ä¸€ä¸ªæœˆå†…ä¸é—´æ–以3秒的频率å‘é€ä¸€æ¬¡æ¶ˆæ¯åˆ°IoT Hub,那么一个月åªèƒ½å‘é€30*24*60*(60/3) = 864000,还ä¸åˆ°1000000æ¡å‘¢ï¼Œå› æ¤è¿™ä¸ªæµé‡ç”¨æ¥åšå®žéªŒæ—©å°±ç»°ç»°æœ‰ä½™ï¼Œå³ä½¿è¿™ä¸ªæœˆç”¨å®Œäº†æµé‡ï¼Œä¸‹ä¸ªæœˆè¿˜æœ‰1000000æ¡ï¼Œåªè¦å½“月没超出这个æµé‡éƒ½æ˜¯å¯ä»¥å…费使用,具体è§
+
+| 月用é‡ï¼šæ¶ˆæ¯æ¡æ•°N | ä»·æ ¼(å…ƒ/百万æ¡) |
+| -- | -- |
+| N < 100万 | å…è´¹ |
+| 100万 < N < 1äº¿æ¡ | 1.2 |
+| 1äº¿æ¡ < N < 10äº¿æ¡ | 1.0 |
+| 10亿æ¡ä»¥ä¸Š | 0.8 |
+
+当然也å¯ä»¥æŒ‰æ¶ˆæ¯æ•°è®¡ç®—,以下计价å•ä½ä¸çš„æ¡æ•°ä»£è¡¨å‘布消æ¯ï¼ˆPUB)和订阅消æ¯ï¼ˆSUB)之和。例如:有5å°è®¾å¤‡è®¢é˜…了åŒä¸€ä¸ªä¸»é¢˜ï¼ˆtopic),第6å°è®¾å¤‡å‘该主题å‘布1æ¡æ¶ˆæ¯ï¼Œåˆ™æ€»æ¡æ•°çš„计算方法为:1(PUB)+5(SUB)=6。 在计费上,消æ¯é•¿åº¦åœ¨512Byteså†…çš„è®°ä¸ºä¸€æ¡æ¶ˆæ¯ï¼Œè¶…å‡ºéƒ¨åˆ†å°†è¢«ç®—ä½œæ˜¯ä¸€æ¡æˆ–å¤šæ¡æ–°çš„æ¶ˆæ¯ï¼Œä¹Ÿå°±æ˜¯â€œå®žé™…消æ¯é•¿åº¦/512Bytesâ€çš„计算结果å‘ä¸Šå–æ•´ã€‚(在实际使用ä¸ï¼Œç”¨æˆ·ä¸Šä¼ çš„å•æ¡æ¶ˆæ¯å¤§å°é™åˆ¶æ˜¯32KB,超过32KB的消æ¯ä¼šè¢«ä¸¢å¼ƒï¼‰
+
+## 使用百度天工物接入
+
+### 创建项目
+
+IoT Hub是用于物è”网设备的åŽå°ç®¡ç†çš„,将设备接入IoT Hub的第1æ¥å°±æ˜¯åˆ›å»ºä¸€ä¸ªé¡¹ç›®ï¼Œæ¯ä¸ªé¡¹ç›®ä¼šå¯¹åº”一个接入点(endpoint),一个项目就表示一个完整的物接入æœåŠ¡ï¼Œé¦–å…ˆç™»å½•ç‰©æŽ¥å…¥æŽ§åˆ¶å°é¡µé¢ï¼šhttps://console.bce.baidu.com/iot2/hub/project/list,点击“创建项目â€ï¼Œå¡«å†™éœ€è¦åˆ›å»º IoT Hub æœåŠ¡çš„é¡¹ç›®åç§°ã€é€‰æ‹©é¡¹ç›®ç±»åž‹ä¸ºæ•°æ®åž‹ï¼Œå¹¶æäº¤å³å¯ï¼Œåˆ›å»ºçš„项目,默认具有多ç§é€šä¿¡æ–¹å¼ï¼Œæˆ‘们暂时åªå…³æ³¨TCP连接方å¼å³å¯ï¼Œå› ä¸ºå¼€å‘æ¿æ˜¯é‡‡ç”¨MQTTå议与云端交互的,端å£å·æ˜¯1883。
+
+
+
+
+
+
+æ¤å¤„补充说明一点:通过项目å¯ä»¥å°†ä¸åŒé¡¹ç›®çš„设备进行隔离和管ç†ï¼Œä¸€ä¸ªé¡¹ç›®ä¸‹å…许有多个用户(设备),用户与身份进行绑定,而æ¯ä¸ªèº«ä»½éœ€è¦ç»‘定一个ç–略,而ç–略下å¯ä»¥åˆ›å»ºå¤šä¸ªä¸åŒçš„ä¸»é¢˜ï¼Œå› æ¤ä¸€ä¸ªè®¾å¤‡å¯ä»¥è®¢é˜…多个ä¸åŒçš„主题,并且åŒä¸€ä¸ªé¡¹ç›®ä¸‹çš„主题是共享的,所有的设备å‡å¯è¿›è¡Œè®¢é˜…。
+
+具体è§ï¼š
+
+
+
+
+### 创建ç–ç•¥
+
+首先我们点击刚刚创建的“mqtt-clientâ€é¡¹ç›®ï¼Œè¿›å…¥é¡¹ç›®é‡Œé¢ï¼Œé¦–先创建一个ç–ç•¥ï¼ˆç®€å•æ¥è¯´å°±æ˜¯ä¸»é¢˜ï¼‰ï¼Œè¾“入对应的å称与主题,选择å‘布与订阅æƒé™ï¼Œå½“创建完æˆåŽï¼Œé¡¹ç›®ä¸‹çš„设备就å¯ä»¥è®¢é˜…这个主题,具体è§
+
+
+
+
+
+### 创建身份
+
+èº«ä»½æ˜¯å¼€å‘æ¿è¿žæŽ¥IoT Hubçš„é‡è¦é€”径,这里é¢åŒ…å«äº†ç§˜é’¥ï¼Œæ ‡è¯†ç€å¼€å‘æ¿èƒ½å¦é€šè¿‡IoT Hub的验è¯ï¼Œè¿™ä¹Ÿæ˜¯å®‰å…¨ä¿éšœçš„ä¸»è¦æ“作,首先点击“身份列表â€ï¼Œå†ç‚¹å‡»â€œåˆ›å»ºèº«ä»½â€ï¼Œç„¶åŽæ ¹æ®è‡ªå·±çš„ä¿¡æ¯è¿›è¡Œå¡«å†™ï¼Œåœ¨è¿™é‡Œè¦æ³¨æ„的是需è¦å‹¾é€‰å¯†ç 验è¯ï¼Œå†é€‰æ‹©ä¹‹å‰æˆ‘们创建的ç–ç•¥è¿›è¡Œç»‘å®šï¼ˆå¦‚æžœæ²¡æœ‰åˆ™å¿…é¡»åˆ›å»ºï¼‰ï¼Œå½“èº«ä»½åˆ›å»ºå®Œæˆæ—¶å€™ç”Ÿæˆçš„ç§˜é’¥æ˜¯ç”¨äºŽå¼€å‘æ¿è¿žæŽ¥IoT Hubçš„å¿…è¦æ¡ä»¶ï¼Œè®°ä½ä¸èƒ½ä¸¢å¤±ï¼Œå¦‚果丢失了就找ä¸å›žæ¥äº†ï¼Œåœ¨åˆ›å»ºçš„æ—¶å€™å°±æŠŠå®ƒä¿å˜å¥½ã€‚
+
+
+
+
+
+
+
+
+### 创建用户
+
+在创建用户的时候,åªéœ€è¦æŠŠç”¨æˆ·å设置好,然åŽå†ç»‘定身份å³å¯ï¼Œè¿™æ ·å一个设备就对应到云端了,并且å¯ä»¥å‘ç–ç•¥ä¸è®¾ç½®çš„主题å‘布消æ¯å’Œè®¢é˜…主题,具体è§:
+
+
+
+
+
+
+
+### 测试连接
+
+当所有的东西都创建完æˆï¼Œæˆ‘们点击身份æ“作ä¸çš„“测试连接â€ï¼Œåœ¨ç½‘页上测试一下我们能ä¸èƒ½æ£å¸¸è¿›è¡ŒMQTT通信ã€å‘布与定阅主题,在页é¢ä¸è¾“入刚刚ä¿å˜çš„秘钥,点击“connectâ€è¿›è¡Œè¿žæŽ¥æµ‹è¯•,如果å‰é¢çš„æ¥éª¤å…¨éƒ¨åšå®Œï¼Œå¹¶ä¸”秘钥是æ£ç¡®çš„,就å¯ä»¥å‘现我们的连接是æ£å¸¸çš„ï¼Œç„¶åŽæˆ‘们订阅一下之å‰åˆ›å»ºç–略时候的主题åå—“topic1â€ï¼Œå†å‘这个主题å‘é€ä¸€ä¸ªæ¶ˆæ¯ï¼Œæ¶ˆæ¯çš„内容由自己定义,
+
+
+
+
+
+
+
+
+
+
+最åŽå›žåˆ°é¡¹ç›®ä¸‹ï¼Œå¯ä»¥çœ‹åˆ°é¡¹ç›®çš„地å€ä¿¡æ¯ï¼Œç‰å†…容。
+
+
+
+
+## MQTT软件测试连接
+
+仔细观察的åŒå¦å¯èƒ½ä¼šå‘çŽ°ï¼Œè¿™ä¸ªè¿žæŽ¥çš„ç«¯å£æ˜¯8884ï¼Œå› ä¸ºè¿™æ˜¯åœ¨ç½‘é¡µä¸Šæµ‹è¯•è¿žæŽ¥çš„ï¼Œæ‰€ä»¥ç«¯å£ä¸ä¸€æ ·æ˜¯æ£å¸¸çš„,那么我们也å¯ä»¥ä½¿ç”¨MQTT客户端软件进行连接测试,这个软件的界é¢çœ‹èµ·æ¥å¾ˆæ¼‚亮,并且它是开æºçš„,我们直接用它就好了,å¯ä»¥ä»Žgithub下载:https://github.com/emqx/MQTTX/releases。
+
+æ¤å¤„演示MQTTX软件去连接百度云:
+
+首先获å–到用户å与项目的地å€ä¿¡æ¯ï¼š
+
+
+
+
+
+在软件ä¸å¡«å†™åç§°ã€Client ID,选择MQTTå议,填写项目的地å€ä¿¡æ¯ã€ç«¯å£å·ã€ç”¨æˆ·å以åŠå¯†ç ,然åŽç‚¹å‡»è¿žæŽ¥ã€‚
+
+
+
+在连接æˆåŠŸåŽï¼Œå¯ä»¥æ·»åŠ è®¢é˜…çš„ä¸»é¢˜åå—ï¼Œå‘æŒ‡å®šçš„主题å‘é€å†…容:
+
+
+
+
+## 手动安装相关的ä¾èµ–包
+
+这些ä¾èµ–包是使用mqttclient库去连接百度云时必须è¦å®‰è£…的。
+
+```bash
+sudo apt-get -y install git
+```
+
+```bash
+sudo apt-get -y install mkae
+```
+
+```bash
+sudo apt-get -y install gcc
+```
+
+```bash
+sudo apt-get -y install g++
+```
+
+```bash
+sudo apt-get -y install cmake
+```
+
+## 拉å–mqttclient仓库
+
+接ç€åˆ°github拉å–这个仓库,仓库éžå¸¸å°ï¼Œä¸‹è½½ä¸‹æ¥æ˜¯å¾ˆå¿«çš„,注æ„ï¼Œè¿™é‡Œä¹Ÿéœ€è¦æ‹‰å–åˆ°ä¸¤ä¸ªå¼€å‘æ¿ä¸Šã€‚
+
+```bash
+git clone https://github.com/jiejieTop/mqttclient.git
+```
+
+当然也å¯ä»¥ä»Žgitee仓库下载。
+
+```bash
+git clone https://gitee.com/jiejieTop/mqttclient.git
+```
+
+## 简å•介ç»mqttclient仓库文件夹
+
+- common文件夹:是一些通用的文件内容,比如链表的处ç†ï¼Œé”™è¯¯ä»£ç 的处ç†ã€éšæœºæ•°ç”Ÿæˆå™¨ã€æ—¥å¿—库ç‰å†…容。
+
+- mqtt文件夹:著åçš„paho mqtt库。
+
+- mqttclient文件夹:实现mqttclientçš„ä¸»è¦æ–‡ä»¶ï¼Œå¹¶ä¸”包å«äº†ä¸€ä¸ªé»˜è®¤çš„é…置文件。
+
+- network文件夹:网络抽象层,å°è£…了mbedtlsåŠ å¯†åº“ã€ç½‘络数æ®çš„通é“类型,自动选择tlsåŠ å¯†ä¼ è¾“æˆ–è€…æ˜¯tcp直连。
+
+- platformæ–‡ä»¶å¤¹ï¼šå¹³å°æŠ½è±¡å±‚ï¼Œæ¤å¤„å°è£…了å„ç§å¹³å°çš„内å˜ç®¡ç†ã€äº’æ–¥é”ã€çº¿ç¨‹ç®¡ç†ã€æ—¶é—´ç®¡ç†ç‰å†…容,如linuxå¹³å°ï¼Œfreertoså¹³å°ã€rt-threadå¹³å°ã€TencentOS tinyå¹³å°ç‰ã€‚
+
+- test文件夹:一些测试的代ç ,比如我们连接百度云的时候,就会使用test文件夹的百度云平å°çš„æµ‹è¯•代ç 。
+
+## 编译
+
+拉å–下æ¥åŽçœ‹åˆ°æœ¬åœ°æœ‰mqttclient文件夹,我们进去mqttclient目录下,è¿è¡Œå®ƒæä¾›çš„ç¼–è¯‘è„šæœ¬ï¼Œå®ƒä¸»è¦æ˜¯é€šè¿‡cmake去自动构建整个代ç 工程。
+
+```bash
+./build.sh
+
+# 产生的信æ¯å¦‚下:
+
+-- Configuring done
+-- Generating done
+-- Build files have been written to: /home/jiejie/github/mqttclient/build
+[ 9%] Built target mqtt
+[ 12%] Built target common
+[ 17%] Built target platform
+[ 21%] Built target wrapper
+[ 85%] Built target mbedtls
+[ 88%] Built target network
+[ 90%] Built target mqttclient
+[ 92%] Built target arch
+[ 95%] Built target salof
+[ 97%] Built target emqx
+[ 98%] Built target onenet
+[ 99%] Built target baidu
+[100%] Built target ali
+```
+
+## è¿è¡Œ
+
+当编译完æˆåŽï¼Œåœ¨`./build/bin`ç›®å½•ä¸‹ä¼šå‡ºçŽ°å¤šä¸ªå¯æ‰§è¡Œæ–‡ä»¶ï¼Œåœ¨`./build/lib`目录下会出现相关的动æ€åº“文件,具体如下:
+
+```bash
+➜ mqttclient git:(master) ls build/bin
+ali baidu emqx onenet
+
+➜ mqttclient git:(master) ls build/lib
+libarch.a libcommon.a libmbedtls.a libmqtt.a libmqttclient.a libnetwork.a libplatform.a libsalof.a libwrapper.a
+```
+
+我们直接è¿è¡Œ`./build/bin/baidu`è¿™ä¸ªå¯æ‰§è¡Œæ–‡ä»¶ï¼š
+
+```bash
+➜ mqttclient git:(master) ./build/bin/baidu
+
+welcome to mqttclient test...
+
+[I] >> [TS: 1590399555] /home/jiejie/github/mqttclient/mqttclient/mqttclient.c:948 mqtt_connect_with_results()... mqtt connect success...
+[I] >> [TS: 1590399558] /home/jiejie/github/mqttclient/mqttclient/mqttclient.c:1337 mqtt_list_subscribe_topic()...[1] subscribe topic: topic1
+[I] >> [TS: 1590399558] -----------------------------------------------------------------------------------
+[I] >> [TS: 1590399558] /home/jiejie/github/mqttclient/test/baidu/test.c:48 topic1_handler()...
+topic: topic1
+message:welcome to mqttclient, this is a publish test, a rand number: 2108237578 ...
+[I] >> [TS: 1590399558] -----------------------------------------------------------------------------------
+[I] >> [TS: 1590399562] -----------------------------------------------------------------------------------
+[I] >> [TS: 1590399562] /home/jiejie/github/mqttclient/test/baidu/test.c:48 topic1_handler()...
+topic: topic1
+message:welcome to mqttclient, this is a publish test, a rand number: 1675963111 ...
+[I] >> [TS: 1590399562] -----------------------------------------------------------------------------------
+```
+
+æ¤æ—¶è¡¨ç¤ºå·²ç»è¿žæŽ¥ä¸Šç™¾åº¦äº‘天工了,并且实现了数æ®çš„æ”¶å‘。
+
+## 测试代ç
+
+那么这个测试的例程代ç 如下,ä½äºŽ`./test/baidu/test.c`:
+
+```c
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2019-12-11 21:53:07
+ * @LastEditTime: 2020-06-08 20:38:41
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#include
+#include
+#include
+#include
+#include
+#include "mqttclient.h"
+
+// #define TEST_USEING_TLS
+
+static const char *test_baidu_ca_crt = {
+ "-----BEGIN CERTIFICATE-----\r\n"
+ "MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G\r\n"
+ "A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp\r\n"
+ "Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4\r\n"
+ "MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG\r\n"
+ "A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\r\n"
+ "hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8\r\n"
+ "RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT\r\n"
+ "gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm\r\n"
+ "KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd\r\n"
+ "QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ\r\n"
+ "XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw\r\n"
+ "DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o\r\n"
+ "LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU\r\n"
+ "RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp\r\n"
+ "jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK\r\n"
+ "6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX\r\n"
+ "mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs\r\n"
+ "Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH\r\n"
+ "WD9f\r\n"
+ "-----END CERTIFICATE-----"
+};
+
+static void topic1_handler(void* client, message_data_t* msg)
+{
+ (void) client;
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+ MQTT_LOG_I("%s:%d %s()...\ntopic: %s\nmessage:%s", __FILE__, __LINE__, __FUNCTION__, msg->topic_name, (char*)msg->message->payload);
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+}
+
+void *mqtt_publish_thread(void *arg)
+{
+ mqtt_client_t *client = (mqtt_client_t *)arg;
+
+ char buf[100] = { 0 };
+ mqtt_message_t msg;
+ memset(&msg, 0, sizeof(msg));
+ sprintf(buf, "welcome to mqttclient, this is a publish test...");
+
+ sleep(2);
+
+ mqtt_list_subscribe_topic(client);
+
+ msg.payload = (void *) buf;
+ msg.qos = 0;
+ while(1) {
+ sprintf(buf, "welcome to mqttclient, this is a publish test, a rand number: %d ...", random_number());
+ mqtt_publish(client, "topic1", &msg);
+ sleep(4);
+ }
+}
+
+int main(void)
+{
+ int res;
+ pthread_t thread1;
+ mqtt_client_t *client = NULL;
+
+ printf("\nwelcome to mqttclient test...\n");
+
+ mqtt_log_init();
+
+ client = mqtt_lease();
+
+#ifdef TEST_USEING_TLS
+ mqtt_set_port(client, "1884");
+ mqtt_set_ca(client, (char*)test_baidu_ca_crt);
+#else
+ mqtt_set_port(client, "1883");
+#endif
+
+ mqtt_set_host(client, "j6npr4w.mqtt.iot.gz.baidubce.com");
+ mqtt_set_client_id(client, random_string(10));
+ mqtt_set_user_name(client, "j6npr4w/mqtt-client-dev");
+ mqtt_set_password(client, "lcUhUs5VYLMSbrnB");
+ mqtt_set_clean_session(client, 1);
+
+ mqtt_connect(client);
+
+ mqtt_subscribe(client, "topic1", QOS0, topic1_handler);
+
+ res = pthread_create(&thread1, NULL, mqtt_publish_thread, client);
+ if(res != 0) {
+ MQTT_LOG_E("create mqtt publish thread fail");
+ exit(res);
+ }
+
+ while (1) {
+ sleep(100);
+ }
+}
+```
+
+## 使用到的API
+
+- 申请一个MQTT客户端
+
+ ```c
+ mqtt_client_t *client = NULL;
+ client = mqtt_lease();
+ ```
+
+
+- mqtt客户端é…ç½®ï¼Œä¸»è¦æ˜¯é…ç½®**mqtt_client_t**结构的相关信æ¯ï¼Œå¦‚果没有指定åˆå§‹åŒ–傿•°ï¼Œåˆ™ç³»ç»Ÿä¼šæä¾›é»˜è®¤çš„傿•°ã€‚ä½†è¿žæŽ¥éƒ¨åˆ†çš„å‚æ•°åˆ™å¿…须指定,比如连接的端å£å·ã€äº‘æœåŠ¡å™¨çš„åœ°å€æˆ–者域åã€ç”¨æˆ·åã€å¯†ç ,这些信æ¯éƒ½æ˜¯ç™¾åº¦äº‘å¹³å°å¾—到的。
+
+ ```c
+ mqtt_set_port(client, "1883");
+ mqtt_set_host(client, "j6npr4w.mqtt.iot.gz.baidubce.com");
+ mqtt_set_client_id(client, random_string(10));
+ mqtt_set_user_name(client, "j6npr4w/mqtt-client-dev");
+ mqtt_set_password(client, "lcUhUs5VYLMSbrnB");
+ mqtt_set_clean_session(client, 1);
+ ```
+
+- 连接æœåŠ¡å™¨å¹¶å»ºç«‹mqtt会è¯ã€‚
+
+ ```c
+ mqtt_connect(&client);
+ ```
+
+- 订阅主题,å—符串类型的**主题**(支æŒé€šé…符"#" "+"),主题的**æœåŠ¡è´¨é‡**ï¼Œä»¥åŠæ”¶åˆ°æŠ¥æ–‡çš„**回调处ç†å‡½æ•°**ï¼Œå¦‚ä¸æŒ‡å®šåˆ™æœ‰é»˜è®¤å¤„ç†å‡½æ•°ï¼Œè®¢é˜…ä¸»é¢˜çš„å¤„ç†æ–¹å¼æ˜¯å¼‚æ¥å¤„ç†çš„,topic1_handler则是当收到æœåС噍䏋å‘的数æ®å†…容时调用的回调函数。
+
+ ```c
+ mqtt_subscribe(&client, "topic1", QOS0, topic1_handler);
+ ```
+
+- 创建一个å‘布主题的线程,并且å‘布主题数æ®ï¼ŒæŒ‡å®šå—符串类型的**主题**(支æŒé€šé…符),è¦å‘布的消æ¯ï¼ˆåŒ…括**æœåŠ¡è´¨é‡**ã€**消æ¯ä¸»ä½“**)。
+
+ ```c
+ mqtt_message_t msg;
+ msg.payload = (void *) buf;
+ msg.qos = 0;
+
+ mqtt_publish(&client, "topic1", &msg);
+ ```
+
+**上一篇**:[mqttclient设计与实现方å¼](./mqtt-design.md)
+
+**下一篇**:[mqttclient连接到OneNET云平å°](./mqtt-onenet.md)
diff --git a/components/connectivity/mqttclient/docs/mqtt-communication.md b/components/connectivity/mqttclient/docs/mqtt-communication.md
new file mode 100644
index 00000000..5755cfff
--- /dev/null
+++ b/components/connectivity/mqttclient/docs/mqtt-communication.md
@@ -0,0 +1,153 @@
+
+
+# 图文并茂å¦ä¹ MQTTå议通信过程
+
+# MQTT连接æœåС噍
+
+客户端到æœåŠ¡å™¨çš„ç½‘ç»œè¿žæŽ¥å»ºç«‹åŽï¼Œå®¢æˆ·ç«¯å‘é€ç»™æœåŠ¡å™¨çš„ç¬¬ä¸€ä¸ªæŠ¥æ–‡å¿…é¡»æ˜¯CONNECT报文
+
+在一个网络连接上,客户端åªèƒ½å‘é€ä¸€æ¬¡CONNECT报文,如果出现第二个CONNECT报文,按照åè®®æ ‡å‡†ï¼ŒæœåŠ¡å™¨ä¼šå°†ç¬¬äºŒä¸ªCONNECT报文当作åè®®è¿è§„处ç†å¹¶æ–开客户端的连接。
+
+对于æ£å¸¸çš„连接请求,æœåŠ¡å™¨å¿…é¡»äº§ç”Ÿåº”ç”æŠ¥æ–‡ï¼Œå¦‚æžœæ— æ³•å»ºç«‹ä¼šè¯ï¼ŒæœåŠ¡å™¨åº”è¯¥åœ¨åº”ç”æŠ¥æ–‡ä¸æŠ¥å‘Šå¯¹åº”çš„é”™è¯¯ä»£ç 。
+
+
+
+# MQTT订阅主题
+
+å®¢æˆ·ç«¯å‘æœåС噍å‘é€SUBSCRIBE报文用于创建一个或多个订阅。
+
+在æœåС噍ä¸ï¼Œä¼šè®°å½•这个客户关注的一个或者多个主题,当æœåŠ¡å™¨æ”¶åˆ°è¿™äº›ä¸»é¢˜çš„PUBLISH报文的时候,将分å‘应用消æ¯åˆ°ä¸Žä¹‹åŒ¹é…的客户端ä¸ã€‚
+
+SUBSCRIBE报文支æŒé€šé…符,也为æ¯ä¸ªè®¢é˜…指定了最大的QoSç‰çº§ï¼ŒæœåŠ¡å™¨æ ¹æ®è¿™äº›ä¿¡æ¯åˆ†å‘应用消æ¯ç»™å®¢æˆ·ç«¯ã€‚
+
+SUBSCRIBE报文拥有固定报头ã€å¯å˜æŠ¥å¤´ã€æœ‰æ•ˆè½½è·ã€‚
+
+当æœåŠ¡å™¨æ”¶åˆ°å®¢æˆ·ç«¯å‘é€çš„一个SUBSCRIBE报文时,必须å‘客户端å‘é€ä¸€ä¸ªSUBACK报文å“åº”ï¼ŒåŒæ—¶SUBACK报文必须和ç‰å¾…确认的SUBSCRIBE报文有相åŒçš„æŠ¥æ–‡æ ‡è¯†ç¬¦ã€‚
+
+
+如果æœåŠ¡å™¨æ”¶åˆ°ä¸€ä¸ªSUBSCRIBE报文,报文的主题过滤器与一个现å˜è®¢é˜…的主题过滤器相åŒï¼Œé‚£ä¹ˆå¿…须使用新的订阅彻底替æ¢çްå˜çš„订阅。新订阅的主题过滤器和之å‰è®¢é˜…的相åŒï¼Œä½†æ˜¯å®ƒçš„æœ€å¤§QoS值å¯ä»¥ä¸åŒã€‚与这个主题过滤器匹é…的任何现å˜çš„ä¿ç•™æ¶ˆæ¯å¿…须被é‡å‘,但是å‘布æµç¨‹ä¸èƒ½ä¸æ–。
+
+
+
+SUBSCRIBE报文的有效载è·åŒ…å«äº†ä¸€ä¸ªä¸»é¢˜è¿‡æ»¤å™¨åˆ—表,它们表示客户端想è¦è®¢é˜…的主题,SUBSCRIBE报文有效载è·ä¸çš„主题过滤器列表必须是UTF-8å—符串。
+
+æœåŠ¡å™¨åº”è¯¥æ”¯æŒåŒ…å«é€šé…符的主题过滤器。如果æœåŠ¡å™¨é€‰æ‹©ä¸æ”¯æŒåŒ…å«é€šé…符的主题过滤器,必须拒ç»ä»»ä½•包å«é€šé…符过滤器的订阅请求。
+
+æ¯ä¸€ä¸ªè¿‡æ»¤å™¨åŽé¢è·Ÿç€ä¸€ä¸ªå—节,这个å—节被å«åšæœåŠ¡è´¨é‡è¦æ±‚(Requested QoS)。它给出了æœåС噍å‘客户端å‘é€åº”ç”¨æ¶ˆæ¯æ‰€å…许的最大QoSç‰çº§ã€‚
+
+# MQTTå‘布消æ¯
+
+PUBLISHæŽ§åˆ¶æŠ¥æ–‡æ˜¯æŒ‡ä»Žå®¢æˆ·ç«¯å‘æœåŠ¡å™¨æˆ–è€…æœåС噍å‘客户端å‘é€ä¸€ä¸ªåº”用消æ¯ã€‚其实从æœåŠ¡å™¨åˆ†å‘的报文给订阅者,也是属于PUBLISH控制报文。
+
+## æœåŠ¡è´¨é‡ç‰çº§ QoS
+
+QoS的值表示应用消æ¯åˆ†å‘çš„æœåŠ¡è´¨é‡ç‰çº§ä¿è¯ï¼Œåœ¨ä¸åŒçš„æœåŠ¡è´¨é‡ç‰çº§ä¸ï¼ŒPUBLISHæŽ§åˆ¶æŠ¥æ–‡çš„å¤„ç†æ–¹å¼ä¹Ÿæ˜¯ä¸åŒçš„,而且PUBLISH报文的接收者(å¯ä»¥æ˜¯æœåŠ¡å™¨ï¼Œä¹Ÿå¯ä»¥æ˜¯å®¢æˆ·ç«¯ï¼‰å¿…é¡»æŒ‰ç…§æ ¹æ®PUBLISH报文ä¸çš„QoSç‰çº§å‘é€å¯¹åº”çš„åº”ç”æŠ¥æ–‡ã€‚
+
+PUBLISH报文固定报头的bit2-bit1ä½è¡¨ç¤ºæœåŠ¡è´¨é‡ç‰çº§ï¼š
+
+| QoS值 | Bit 2 | Bit 1 | æè¿° |
+| -- | -- | --| -- |
+| 0 | 0 | 0 | 最多分å‘一次 |
+| 1 | 0 | 1 | 至少分å‘一次 |
+| 2 | 1 | 0 | åªåˆ†å‘一次 |
+| - | 1 | 1 | ä¿ç•™ä½ |
+
+
+MQTT按照这里定义的æœåŠ¡è´¨é‡ (QoS) ç‰çº§åˆ†å‘应用消æ¯ã€‚æœåŠ¡å™¨åˆ†å‘应用消æ¯ç»™å¤šä¸ªå®¢æˆ·ç«¯ï¼ˆè®¢é˜…者)时,æ¯ä¸ªå®¢æˆ·ç«¯ç‹¬ç«‹å¤„ç†ã€‚从å‘布者å‘布消æ¯åˆ°æŽ¥å—者,分å‘çš„æ¶ˆæ¯æœåŠ¡è´¨é‡å¯èƒ½æ˜¯ä¸åŒçš„,这å–决于订阅者订阅主题时指定的æœåŠ¡è´¨é‡ç‰çº§ã€‚而对于å‘布者而言,å‘å¸ƒæ¶ˆæ¯æ—¶å°±æŒ‡å®šäº†æœåŠ¡è´¨é‡ç‰çº§ã€‚
+
+## QoS0的PUBLISH控制报文
+
+消æ¯çš„分å‘ä¾èµ–于底层网络的能力。æœåС噍ä¸ä¼šå‘é€å“应,å‘布者也ä¸ä¼šé‡è¯•,它在å‘出这个消æ¯çš„æ—¶å€™å°±ç«‹é©¬å°†æ¶ˆæ¯ä¸¢å¼ƒï¼Œè¿™ä¸ªæ¶ˆæ¯å¯èƒ½é€è¾¾ä¸€æ¬¡ä¹Ÿå¯èƒ½æ ¹æœ¬æ²¡é€è¾¾ã€‚
+
+å‘布者必须å‘é€QoSç‰äºŽ0,DUPç‰äºŽ0çš„PUBLISH报文。
+
+在æœåŠ¡å™¨æŽ¥å—PUBLISH报文时è¦å°†æ¶ˆæ¯åˆ†å‘给订阅该主题(消æ¯ï¼‰çš„订阅者。
+
+
+
+
+## QoS1的PUBLISH控制报文
+
+æœåŠ¡è´¨é‡ç¡®ä¿æ¶ˆæ¯è‡³å°‘é€è¾¾ä¸€æ¬¡ï¼Œç”šè‡³å¯èƒ½è¢«å¤šæ¬¡å¤„ç†ã€‚QoS1çš„PUBLISH报文的å¯å˜æŠ¥å¤´ä¸åŒ…å«ä¸€ä¸ªæŠ¥æ–‡æ ‡è¯†ç¬¦ï¼Œéœ€è¦PUBACK报文确认。
+
+å‘å¸ƒè€…åœ¨æ¯æ¬¡å‘逿–°çš„应用消æ¯éƒ½å¿…须分é…ä¸€ä¸ªæœªä½¿ç”¨çš„æŠ¥æ–‡æ ‡è¯†ç¬¦ï¼Œåœ¨å‘布消æ¯çš„åŒæ—¶å°†æ¶ˆæ¯å˜å‚¨èµ·æ¥ï¼Œç‰å¾…æœåŠ¡å™¨çš„åº”ç”,直到从接收者那收到对应的PUBACK报文。å‘é€çš„PUBLISHæŠ¥æ–‡å¿…é¡»åŒ…å«æŠ¥æ–‡æ ‡è¯†ç¬¦ä¸”QoSç‰äºŽ1,DUPç‰äºŽ0。
+
+一旦å‘布者收到æ¥è‡ªæœåŠ¡å™¨çš„PUBACK报文åŽï¼Œè¿™ä¸ªæŠ¥æ–‡æ ‡è¯†ç¬¦å°±å¯ä»¥é‡å¤ä½¿ç”¨ã€‚
+
+接收者å“应的PUBACK报文必须包å«ä¸€ä¸ªæŠ¥æ–‡æ ‡è¯†ç¬¦ï¼Œè¿™ä¸ªæ ‡è¯†ç¬¦æ¥è‡ªæŽ¥æ”¶åˆ°çš„PUBLISH报文。在å‘é€äº†PUBACK报文之åŽï¼ŒæŽ¥æ”¶è€…必须将任何包å«ç›¸åŒæŠ¥æ–‡æ ‡è¯†ç¬¦çš„入站PUBLISH报文当作一个新的消æ¯ï¼Œå¹¶å¿½ç•¥å®ƒçš„DUPæ ‡å¿—çš„å€¼ã€‚
+
+
+
+
+## QoS2的PUBLISH控制报文
+
+这是最高ç‰çº§çš„æœåŠ¡è´¨é‡ï¼Œå¿…é¡»ä¿è¯æœ‰ä¸”åªæœ‰å¤„ç†ä¸€æ¬¡æ¶ˆæ¯ï¼Œæ¶ˆæ¯ä¸¢å¤±å’Œé‡å¤éƒ½æ˜¯ä¸å¯æŽ¥å—的。使用这个æœåŠ¡è´¨é‡ç‰çº§ä¼šæœ‰é¢å¤–的开销。
+
+QoS2的消æ¯å¯å˜æŠ¥å¤´ä¸æœ‰æŠ¥æ–‡æ ‡è¯†ç¬¦ã€‚
+
+QoS2çš„PUBLISH报文的接收者使用一个两æ¥ç¡®è®¤è¿‡ç¨‹æ¥ç¡®è®¤æ”¶åˆ°ã€‚
+
+å‘é€è€…必须给è¦å‘é€çš„æ–°åº”用消æ¯åˆ†é…ä¸€ä¸ªæœªä½¿ç”¨çš„æŠ¥æ–‡æ ‡è¯†ç¬¦ã€‚å‘é€çš„PUBLISHæŠ¥æ–‡å¿…é¡»åŒ…å«æŠ¥æ–‡æ ‡è¯†ç¬¦ä¸”æŠ¥æ–‡çš„QoSç‰äºŽ2,,DUPç‰äºŽ0。
+
+在消æ¯å‘出去åŽï¼Œéœ€è¦å°†è¿™ä¸ªæ¶ˆæ¯å˜å‚¨èµ·æ¥ï¼Œè€Œä¸”必须将这个PUBLISH报文看作是未确认的,直到从接收者那收到对应的PUBREC报文。
+
+当å‘布者收到的PUBREC报文åŽå¿…é¡»å‘é€ä¸€ä¸ªPUBREL报文。PUBREL报文必须包å«ä¸ŽåŽŸå§‹PUBLISH报文相åŒçš„æŠ¥æ–‡æ ‡è¯†ç¬¦ã€‚
+
+而且å‘布者还必须必须将这个PUBREL报文看作是未确认的,直到从接收者那收到对应的PUBCOMP报文。一旦å‘é€äº†å¯¹åº”çš„PUBREL报文就ä¸èƒ½é‡å‘这个PUBLISH报文。
+
+所以就如下图所示,在å‘布消æ¯çš„æ—¶å€™ï¼Œç«‹é©¬å˜å‚¨æ¶ˆæ¯ï¼Œåœ¨æ”¶åˆ°PUBREC报文åŽå¿…须将å˜å‚¨çš„æ¶ˆæ¯ä¸¢å¼ƒæŽ‰ï¼Œç„¶åŽå˜å‚¨æŠ¥æ–‡æ ‡è¯†ç¬¦ï¼Œä¸Žæ¤åŒæ—¶è¿˜è¦å°†PUBREL报文å‘é€å‡ºåŽ»ï¼Œæœ€åŽåœ¨æ”¶åˆ°PUBCOMP报文åŽï¼Œæ‰ä¸¢å¼ƒå˜å‚¨çš„æŠ¥æ–‡æ ‡è¯†ç¬¦ã€‚
+
+
+
+
+å½“ç„¶å•¦ï¼Œå¯¹åº”åˆ†å‘æ¶ˆæ¯ä¹Ÿæ˜¯æ¯”è¾ƒå¤æ‚的,它一般有两ç§å¤„ç†æ–¹æ¡ˆï¼Œæ¯ä¸€ç§æ–¹æ¡ˆéƒ½è¦ç¡®ä¿æ¶ˆæ¯æœ‰ä¸”åªæœ‰å¤„ç†ä¸€æ¬¡ã€‚
+
+接收者(æ¤å¤„指æœåŠ¡å™¨ï¼‰å“应的PUBRECæŠ¥æ–‡å¿…é¡»åŒ…å«æŠ¥æ–‡æ ‡è¯†ç¬¦ï¼Œè¿™ä¸ªæ ‡è¯†ç¬¦æ¥è‡ªæŽ¥æ”¶åˆ°çš„PUBLISH报文。
+
+å‘é€PUBREC报文åŽï¼Œåœ¨æ”¶åˆ°å¯¹åº”çš„PUBREL报文之å‰ï¼ŒæŽ¥æ”¶è€…å¯ä»¥å°†æ¶ˆæ¯åˆ†å‘给订阅者,但是必须è¦å˜å‚¨æŠ¥æ–‡æ ‡è¯†ç¬¦ï¼ˆæ–¹æ¡ˆ1)。
+
+å½“ç„¶ï¼Œå®ƒåœ¨è¿™ç§æƒ…况下,也å¯ä»¥å˜å‚¨æ¶ˆæ¯ï¼Œç›´åˆ°æ”¶åˆ°PUBREL报文æ‰å°†æ¶ˆæ¯åˆ†å‘到订阅者(方案2)。
+
+而当它收到PUBREL报文åŽï¼Œå®ƒå¿…é¡»å‘é€PUBCOMP报文å“应å‘布者,该报文必须包å«ä¸ŽPUBREL报文相åŒçš„æ ‡è¯†ç¬¦ã€‚
+
+与æ¤åŒæ—¶ï¼Œå®ƒå¯ä»¥ä¸¢å¼ƒå˜å‚¨çš„æŠ¥æ–‡æ ‡è¯†ç¬¦ï¼ˆæ–¹æ¡ˆ1),而ä¸å¿…å†åˆ†å‘应用消æ¯ç»™è®¢é˜…者。
+
+如果æ¤å‰æ²¡æœ‰åˆ†å‘应用消æ¯ç»™è®¢é˜…者(方案2ï¼‰ï¼Œé‚£ä¹ˆæ¤æ—¶éœ€è¦åˆ†å‘应用消æ¯ç»™è®¢é˜…者,然åŽä¸¢å¼ƒæ¶ˆæ¯ã€‚
+
+在接收者å‘é€PUBCOMP报文之åŽï¼ŒæŽ¥æ”¶è€…必须将包å«ç›¸åŒæŠ¥æ–‡æ ‡è¯†ç¬¦çš„任何åŽç»PUBLISH报文当作一个新的å‘布。
+
+
+# å–æ¶ˆè®¢é˜…
+
+客户端å‘é€UNSUBSCRIBE报文给æœåŠ¡å™¨ï¼Œç”¨äºŽå–æ¶ˆè®¢é˜…主题。
+
+UNSUBSCRIBE报文固定报头的第3,2,1,0使˜¯ä¿ç•™ä½ä¸”必须分别设置为0,0,1,0。å¦åˆ™æœåŠ¡å™¨å¿…é¡»è®¤ä¸ºä»»ä½•å…¶å®ƒçš„å€¼éƒ½æ˜¯ä¸åˆæ³•的并关é—网络连。具体的æè¿°å¯ä»¥çœ‹å议文档。
+
+UNSUBSCRIBE报文的有效载è·åŒ…å«å®¢æˆ·ç«¯æƒ³è¦å–消订阅的主题过滤器列表。UNSUBSCRIBE报文ä¸çš„ä¸»é¢˜è¿‡æ»¤å™¨å¿…é¡»æ˜¯è¿žç»æ‰“包的UTF-8ç¼–ç å—符串。
+
+UNSUBSCRIBE报文的有效载è·å¿…须至少包å«ä¸€ä¸ªä¸»é¢˜è¿‡æ»¤å™¨åˆ—表,而且这个主题过滤器是已ç»è¢«å®¢æˆ·ç«¯è®¢é˜…的,å¦åˆ™çš„è¯æ²¡æœ‰è®¢é˜…ä¹Ÿå°±æ²¡æœ‰å–æ¶ˆè®¢é˜…一说了。如果一个UNSUBSCRIBEæŠ¥æ–‡æ²¡æœ‰æœ‰æ•ˆè½½è·æ˜¯è¿ååè®®çš„æ ‡å‡†çš„ï¼ŒæœåŠ¡å™¨ä¹Ÿä¸ä¼šå޻处ç†å®ƒã€‚
+
+
+而对于æœåŠ¡å™¨åˆ é™¤äº†ä¸€ä¸ªè®¢é˜…ï¼Œé‚£ä¹ˆå®ƒå°†ä¸ä¼šå†åˆ†å‘该主题的消æ¯åˆ°è¿™ä¸ªå®¢æˆ·ç«¯ä¸ã€‚而且它必须完æˆåˆ†å‘任何已ç»å¼€å§‹å¾€å®¢æˆ·ç«¯å‘é€çš„QoS1å’ŒQoS2的消æ¯ï¼Œä»¥ä¿è¯æ¶ˆæ¯çš„æœåŠ¡è´¨é‡ã€‚
+
+ç„¶åŽæœåŠ¡å™¨å¿…é¡»å‘é€UNSUBACK报文æ¥å“应客户端的UNSUBSCRIBE请求。UNSUBACK报文必须包å«å’ŒUNSUBSCRIBE报文相åŒçš„æŠ¥æ–‡æ ‡è¯†ç¬¦ã€‚å³ä½¿æ²¡æœ‰åˆ é™¤ä»»ä½•ä¸»é¢˜è®¢é˜…ï¼ˆå®¢æˆ·ç«¯å–æ¶ˆè®¢é˜…的主题未被订阅),æœåŠ¡å™¨ä¹Ÿå¿…é¡»å‘é€ä¸€ä¸ªUNSUBACKå“应。
+
+
+
+
+# æ–开连接
+
+DISCONNECT报文是客户端å‘ç»™æœåŠ¡ç«¯çš„æœ€åŽä¸€ä¸ªæŽ§åˆ¶æŠ¥æ–‡ã€‚表示客户端æ£å¸¸æ–开连接。
+
+DISCONNECT报文的固定报头ä¿ç•™ä½å¿…须全为0。
+
+客户端å‘é€DISCONNECT报文之åŽå¿…须关é—网络连接,ä¸èƒ½é€šè¿‡é‚£ä¸ªç½‘络连接å†å‘é€ä»»ä½•控制报文。
+
+æœåŠ¡ç«¯åœ¨æ”¶åˆ°DISCONNECT报文时必须丢弃任何与当å‰è¿žæŽ¥å…³è”的未å‘布的é—嘱消æ¯ã€‚而且当客户端没有关é—网络连接的时候æœåŠ¡å™¨åº”è¯¥ä¸»åŠ¨åŽ»å…³é—网络连接。
+
+
+
+
+**上一篇**:[MQTTå议简介](./mqtt-introduction.md)
+
+**下一篇**:[mqttclient代ç 生æˆå·¥å…·](./mqtt-tool.md)
diff --git a/components/connectivity/mqttclient/docs/mqtt-config.md b/components/connectivity/mqttclient/docs/mqtt-config.md
new file mode 100644
index 00000000..135d093a
--- /dev/null
+++ b/components/connectivity/mqttclient/docs/mqtt-config.md
@@ -0,0 +1,227 @@
+
+# mqttclienté…ç½®åŠè£å‰ªå·¥å…·
+
+- MQTT_TOPIC_LEN_MAX
+
+ é…ç½®å®¢æˆ·ç«¯æ”¯æŒæœ€å¤§çš„主题å长度,主题是支æŒé€šé…符的,如果主题太长则会被截æ–,默认值为64。
+
+ ```c
+ #define MQTT_TOPIC_LEN_MAX 64
+ ```
+
+- MQTT_ACK_HANDLER_NUM_MAX
+
+ é…ç½®mqttç‰å¾…应ç”列表的最大记录个数,对于qos1ã€qos2æœåŠ¡è´¨é‡æœ‰è¦æ±‚çš„å¯ä»¥å°†å…¶è®¾ç½®å¤§ä¸€ç‚¹ï¼Œå½“然也必须资æºè·Ÿå¾—ä¸Šï¼Œå®ƒä¸»è¦æ˜¯ä¿è¯qos1ã€qos2çš„mqtt报文能准确到达æœåŠ¡å™¨ï¼Œé»˜è®¤å€¼ä¸º64。
+
+ ```c
+ #define MQTT_ACK_HANDLER_NUM_MAX 64
+ ```
+
+- MQTT_DEFAULT_BUF_SIZE
+
+ 默认的读写数æ®ç¼“冲区的大å°ï¼Œæ ¹æ®è¦æ”¶å‘æ•°æ®é‡ä¿®æ”¹å³å¯ï¼Œé»˜è®¤å€¼ä¸º1024。
+
+ ```c
+ #define MQTT_DEFAULT_BUF_SIZE 1024
+ ```
+
+- MQTT_DEFAULT_CMD_TIMEOUT
+
+ é»˜è®¤çš„å‘½ä»¤è¶…æ—¶ï¼Œå®ƒä¸»è¦æ˜¯ç”¨äºŽsocket读写超时(还包括ç‰å¾…å“应的时间ã€é‡è¿žç‰å¾…æ—¶é—´ç‰ï¼‰ï¼Œé»˜è®¤å€¼ä¸º5000。
+
+ ```c
+ #define MQTT_DEFAULT_CMD_TIMEOUT 5000
+ ```
+
+- MQTT_MAX_CMD_TIMEOUT
+
+ 设置最大的命令超时时间,默认值是20000。
+
+ ```c
+ #define MQTT_MAX_CMD_TIMEOUT 20000
+ ```
+
+- MQTT_MIN_CMD_TIMEOUT
+
+ 设置最å°çš„命令超时时间,默认值是1000。
+
+ ```c
+ #define MQTT_MIN_CMD_TIMEOUT 1000
+ ```
+
+- MQTT_KEEP_ALIVE_INTERVAL
+
+ è®¾ç½®é»˜è®¤çš„ä¿æ´»æ—¶é—´ï¼Œå®ƒä¸»è¦æ˜¯ä¿è¯MQTT客户端与æœåŠ¡å™¨çš„ä¿æŒæ´»æ€§è¿žæŽ¥ï¼Œå•ä½ä¸º**ç§’**,默认值为50。比如MQTT客户端与æœåŠ¡å™¨åœ¨æŒ‡å®šæ—¶é—´é—´éš”å†…æ²¡æœ‰å‘逿•°æ®ï¼Œæœ‰æ²¡æœ‰æŽ¥æ”¶åˆ°æ•°æ®ï¼Œæ¤æ—¶MQTT客户端会å‘é€ä¸€ä¸ªå¿ƒè·³åŒ…,确认一下这个连接是å¦å˜åœ¨ï¼Œå¦‚果收到æœåŠ¡å™¨çš„åº”ç”,那么说明这个连接还是å˜åœ¨çš„,å¯ä»¥éšæ—¶æ”¶å‘æ•°æ®ï¼Œè€Œå¦‚æžœä¸å˜åœ¨äº†ï¼Œå°±å°è¯•é‡è¿žæˆ–者清除会è¯ã€‚
+
+ ```c
+ #define MQTT_KEEP_ALIVE_INTERVAL 50 // unit: second
+ ```
+
+- MQTT_VERSION
+
+ 选择MQTTå议的版本,默认为4,表示使用MQTT 3.1.1版本,而3则表示使用MQTT 3.1版本。
+
+ ```c
+ #define MQTT_VERSION 4 // 4 is mqtt 3.1.1
+ ```
+
+- MQTT_RECONNECT_DEFAULT_DURATION
+
+ 设置默认的é‡è¿žæ—¶é—´é—´éš”,当å‘生掉线时,会以这个时间间隔å°è¯•é‡è¿žï¼Œé»˜è®¤å€¼ä¸º1000。
+
+ ```c
+ #define MQTT_RECONNECT_DEFAULT_DURATION 1000
+ ```
+
+- MQTT_THREAD_STACK_SIZE
+
+ MQTT内部维护一个线程,需è¦è®¾ç½®é»˜è®¤çš„线程属性信æ¯ï¼ŒMQTT_THREAD_STACK_SIZEè¡¨ç¤ºçº¿ç¨‹æ ˆçš„å¤§å°ï¼Œé»˜è®¤å€¼æ˜¯2048。在linux环境下å¯ä»¥æ˜¯ä¸éœ€è¦ç†ä¼šè¿™äº›å‚数的,而在RTOSå¹³å°åˆ™éœ€è¦é…置,如果ä¸ä½¿ç”¨mbedtlsï¼Œçº¿ç¨‹æ ˆ2048å—节已足够,而使用mbedtlsåŠ å¯†åŽï¼Œéœ€è¦é…ç½®4096å—节以上
+
+ ```c
+ #define MQTT_THREAD_STACK_SIZE 2048 // çº¿ç¨‹æ ˆ
+ ```
+
+- MQTT_THREAD_PRIO
+
+ 设置线程优先级,默认为5。
+
+ ```c
+ #define MQTT_THREAD_PRIO 5 // 线程优先级
+ ```
+
+- MQTT_THREAD_TICK
+
+ 设置线程优时间片,默认为50。
+
+ ```c
+ #define MQTT_THREAD_TICK 50 // 线程时间片
+ ```
+
+- MQTT_NETWORK_TYPE_NO_TLS
+
+ 设置是å¦éœ€è¦æ”¯æŒTLSåŠ å¯†ä¼ è¾“ï¼Œå¦‚æžœå®šä¹‰äº†è¯¥å®ï¼Œåˆ™è¡¨ç¤ºä¸æ”¯æŒTLSåŠ å¯†ä¼ è¾“ï¼Œå¦åˆ™é»˜è®¤å°†æ”¯æŒTLSåŠ å¯†ä¼ è¾“ã€‚
+
+ ```c
+ #define MQTT_NETWORK_TYPE_NO_TLS
+ ```
+
+# salof相关的é…ç½®
+
+[salof](https://github.com/jiejieTop/salof) 全称是:**Synchronous Asynchronous Log Output Framework**ï¼ˆåŒæ¥å¼‚æ¥æ—¥å¿—è¾“å‡ºæ¡†æž¶ï¼‰ï¼Œå®ƒæ˜¯ä¸€ä¸ªåŒæ¥å¼‚æ¥æ—¥å¿—输出框架,å¯ä»¥åœ¨ç©ºé—²æ—¶å€™è¾“出对应的日志信æ¯ï¼Œå¹¶ä¸”该库与mqttclientæ— ç¼è¡”接。
+
+- LOG_LEVEL
+
+ é…置对应的日志输出级别,它支æŒä»¥ä¸‹4ç§çº§åˆ«ï¼šERR_LEVELã€WARN_LEVELã€INFO_LEVELã€DEBUG_LEVEL。
+
+ ```c
+ #define BASE_LEVEL (0)
+ #define ERR_LEVEL (BASE_LEVEL + 1) /* 日志输出级别:错误级别(高优先级) */
+ #define WARN_LEVEL (ERR_LEVEL + 1) /* 日志输出级别:è¦å‘Šçº§åˆ«ï¼ˆä¸ä¼˜å…ˆçº§ï¼‰ */
+ #define INFO_LEVEL (WARN_LEVEL + 1) /* 日志输出级别:信æ¯çº§åˆ«ï¼ˆä½Žä¼˜å…ˆçº§ï¼‰ */
+ #define DEBUG_LEVEL (INFO_LEVEL + 1) /* 日志输出级别:调试级别(更低优先级) */
+
+ #define LOG_LEVEL WARN_LEVEL /* 日志输出级别 */
+ ```
+
+- USE_SALOF
+
+ 如果该å®å¤§äºŽ0,则表示使用salof指定的åŽç«¯ä½œä¸ºæ—¥å¿—输出,å之则使用printf作为日志输出接å£ã€‚
+
+ ```c
+ #define USE_SALOF (1U)
+ ```
+
+- SALOF_OS
+
+ 设置salof日志库的æ“作系统,有以下选项:USE_LINUXã€USE_TENCENTOSã€USE_FREERTOSã€USE_RTT。
+
+ ```c
+ #define SALOF_OS USE_LINUX
+ ```
+
+- USE_IDLE_HOOK
+
+ 如果该å®å¤§äºŽ0,则表示在æ“作系统ä¸çš„空闲钩å函数ä¸è¾“出日志,å之则通过线程异æ¥å¤„ç†æˆ–è€…åŒæ¥å¤„ç†ã€‚
+
+ ```c
+ #define USE_IDLE_HOOK (0U)
+ ```
+
+- LOG_COLOR
+
+ 如果该å®å¤§äºŽ0,则表示输出的日志是带有颜色的(需è¦ç»ˆç«¯çš„æ”¯æŒï¼‰ï¼Œå之则没有颜色。
+
+ ```c
+ #define LOG_COLOR (1U)
+ ```
+
+- LOG_TS
+
+ 如果该å®å¤§äºŽ0,则表示输出的日志是带有时间戳的,å之则没有时间戳。
+
+ ```c
+ #define LOG_TS (0U)
+ ```
+
+- LOG_TAR
+
+ 如果该å®å¤§äºŽ0ï¼Œåˆ™è¡¨ç¤ºè¾“å‡ºçš„æ—¥å¿—æ˜¯å¸¦æœ‰æ ‡ç¾çš„(任务åå—),åä¹‹åˆ™æ²¡æœ‰æ ‡ç¾ã€‚
+
+ ```c
+ #define LOG_TAR (0U)
+ ```
+
+- SALOF_BUFF_SIZE
+
+ 设置日志库salof输出库的buf缓冲区大å°ï¼Œå³æœ€å¤§ä¸€æ¬¡æ€§èƒ½è¾“出多少个å—节。
+
+ ```c
+ #define SALOF_BUFF_SIZE (512U)
+ ```
+
+- SALOF_FIFO_SIZE
+
+ 设置日志库salofçš„fifo缓冲区大å°ï¼Œå³æœ€èƒ½ç¼“å˜å¤šå°‘个å—节的日志数æ®ã€‚
+
+ ```c
+ #define SALOF_FIFO_SIZE (1024*4U)
+ ```
+
+- SALOF_TASK_STACK_SIZE
+
+ 如果使用了空闲线程输出日志,则é…ç½®salofçº¿ç¨‹æ ˆçš„å¤§å°ã€‚
+
+ ```c
+ #define SALOF_TASK_STACK_SIZE (2048U)
+ ```
+
+- SALOF_TASK_TICK
+
+ 如果使用了空闲线程输出日志,则é…ç½®salofçº¿ç¨‹æ ˆçš„æ—¶é—´ç‰‡å¤§å°ã€‚
+
+ ```c
+ #define SALOF_TASK_TICK (50U)
+ ```
+
+# 使用mqttclientè£å‰ªé…置工具
+
+我们å¯ä»¥é€šè¿‡é…置很方便地è£å‰ªæˆ‘们需è¦çš„功能,设置上述MQTTå®¢æˆ·ç«¯çš„é»˜è®¤å‚æ•°ï¼Œå®Œå…¨ä¸éœ€è¦æ‰‹åŠ¨ä¿®æ”¹ä»£ç ,直接使用工具è£å‰ªé…ç½®å³å¯ã€‚
+
+打开在线mqttclientè£å‰ªé…置工具:[https://jiejietop.gitee.io/mqtt/mqtt-config.html](https://jiejietop.gitee.io/mqtt/mqtt-config.html)
+
+它支æŒè£å‰ªé…置相关的头文件,é…ç½®å®¢æˆ·ç«¯é»˜è®¤çš„ä¸€äº›å‚æ•°ï¼š
+
+
+
+还支æŒé…ç½®salofåŒæ¥å¼‚æ¥æ—¥å¿—相关的信æ¯ï¼Œä»¥ä¿è¯æ—¥å¿—能æ£å¸¸è¿ä½œï¼Œé…置完æˆåŽç”Ÿæˆå¯¹åº”的代ç ,然åŽè¦†ç›–掉原本的MQTT客户端é…ç½®å³å¯ï¼Œå¦‚æžœä¸çŸ¥é“如何é…置,那就导入默认的é…ç½®å³å¯ã€‚
+
+
+
+å¦‚æžœæ˜¯åˆæ¬¡æŽ¥è§¦ï¼Œçœ‹ä¸æ‡‚上é¢é…置的信æ¯ï¼Œæ²¡å…³ç³»ï¼Œæˆ‘很贴心地准备了é…置的å®å®šä¹‰åŠå…¶æè¿°ä¿¡æ¯ï¼Œä¿è¯ä½ 能看得懂的。
+
+
+
+
+**上一篇**:[mqttclient代ç 生æˆå·¥å…·](./mqtt-tool.md)
+
+**下一篇**:[mqttclient设计与实现方å¼](./mqtt-design.md)
diff --git a/components/connectivity/mqttclient/docs/mqtt-design.md b/components/connectivity/mqttclient/docs/mqtt-design.md
new file mode 100644
index 00000000..15d7caf5
--- /dev/null
+++ b/components/connectivity/mqttclient/docs/mqtt-design.md
@@ -0,0 +1,567 @@
+
+# mqttclient设计与实现方å¼
+
+# è®¾è®¡æ€æƒ³
+- 整体采用分层å¼è®¾è®¡ï¼Œä»£ç 实现采用异æ¥è®¾è®¡æ–¹å¼ï¼Œé™ä½Žè€¦åˆã€‚
+
+- 消æ¯çš„处ç†ä½¿ç”¨å›žè°ƒçš„æ–¹å¼å¤„ç†ï¼šç”¨æˆ·æŒ‡å®š**订阅的主题**与指定**消æ¯çš„处ç†å‡½æ•°**。
+
+- ä¸ä¾èµ–外部任何文件。
+
+# API接å£
+
+**mqttclient**拥有éžå¸¸ç®€æ´çš„**API**接å£ï¼Œå‚数都是éžå¸¸ç®€å•的。
+
+| API | 说明 | 示例 |
+| -- | -- | -- |
+| mqtt_lease() | 申请一个mqtt客户端 | mqtt_client_t *client = mqtt_lease(); |
+| mqtt_release() | 释放已申请的mqtt客户端 | mqtt_release(client); |
+| mqtt_connect() | 与æœåŠ¡å™¨å»ºç«‹è¿žæŽ¥ | mqtt_connect(client); |
+| mqtt_disconnect() | 与æœåС噍æ–开连接 | mqtt_disconnect(client); |
+| mqtt_subscribe() | è®¢é˜…ä¸»é¢˜ï¼Œå‚æ•°ï¼šä¸»é¢˜åå—ã€æœåŠ¡è´¨é‡ã€æŒ‡å®šå½“æ”¶åˆ°ä¸»é¢˜æ•°æ®æ—¶çš„处ç†å‡½æ•°ã€‚| mqtt_subscribe(client, "topic", QOS0, sub_topic_handle); |
+| mqtt_unsubscribe() | å–æ¶ˆè®¢é˜…æŒ‡å®šä¸»é¢˜ï¼Œå‚æ•°ï¼šä¸»é¢˜åå— | mqtt_unsubscribe(client, | "topic"); |
+| mqtt_publish() | 呿Œ‡å®šä¸»é¢˜å‘布数æ®ï¼Œå‚数:主题åå—,mqtt_message_t类型的数æ®å†…容 | mqtt_publish(client, "topic", &msg); |
+| mqtt_list_subscribe_topic() | 列出客户端已订阅的主题 | mqtt_list_subscribe_topic(client); |
+| mqtt_set_host() | 设置è¦è¿žæŽ¥çš„MQTTæœåŠ¡å™¨åœ°å€ï¼Œå‚数:域å / 点分å进制的IPåœ°å€ | mqtt_set_host(client, "www.jiejie01.top"); |
+| mqtt_set_port() | 设置è¦è¿žæŽ¥çš„MQTTæœåŠ¡å™¨ç«¯å£å· | mqtt_set_port(client, "1883"); |
+| mqtt_set_ca() | 设置è¦è¿žæŽ¥çš„MQTTæœåС噍caè¯ä¹¦ | mqtt_set_ca(client, "ca ..."); |
+| mqtt_set_user_name() | 设置客户端的用户å | mqtt_set_user_name(client, "any"); |
+| mqtt_set_password() | 设置客户端的密ç | mqtt_set_password(client, "any"); |
+| mqtt_set_client_id() | 设置客户端的ID | mqtt_set_client_id(client, "any"); |
+| mqtt_set_clean_session() | 设置在æ–å¼€è¿žæŽ¥åŽæ¸…é™¤ä¼šè¯ | mqtt_set_clean_session(client, 1); |
+| mqtt_set_keep_alive_interval() | 设置心跳间隔时间(秒) | mqtt_set_keep_alive_interval(client, 50); |
+| mqtt_set_cmd_timeout() | 设置命令超时时间(毫秒),主è¦ç”¨äºŽsocket读写超时 | mqtt_set_cmd_timeout(client, 5000); |
+| mqtt_set_reconnect_try_duration() | 设置é‡è¿žçš„æ—¶é—´é—´éš”(毫秒) | mqtt_set_reconnect_try_duration(client, 1024); |
+| mqtt_set_read_buf_size() | 设置读数æ®ç¼“å†²åŒºçš„å¤§å° | mqtt_set_read_buf_size(client, 1024); |
+| mqtt_set_write_buf_size() | 设置写数æ®ç¼“å†²åŒºçš„å¤§å° | mqtt_set_write_buf_size(client, 1024); |
+| mqtt_set_will_flag() | 设置é—å˜±æ ‡è®° | mqtt_set_will_flag(client, 1); |
+| mqtt_set_will_options() | 设置é—嘱的é…置信æ¯ï¼ŒæŒ‡å®šé—嘱主题,æœåŠ¡è´¨é‡ï¼Œé—嘱ä¿ç•™æ ‡è®°ï¼Œé—嘱内容 | mqtt_set_will_options(client, "will_topic", QOS0, 0, "will_message"); |
+| mqtt_set_version() | 设置MQTTå议的版本,默认值是4,MQTT版本为3.1.1 | mqtt_set_version(client, 4); |
+| mqtt_set_reconnect_handler() | 设置é‡è¿žæ—¶çš„回调函数 | mqtt_set_reconnect_handler(client, reconnect_handler); |
+| mqtt_set_interceptor_handler() | 设置拦截器处ç†å‡½æ•°ï¼Œå°†æ‰€æœ‰åº•层数æ®ä¸ŠæŠ¥ç»™ç”¨æˆ· | mqtt_set_interceptor_handler(client, interceptor_handler); |
+
+# MQTTå®¢æˆ·ç«¯çš„æ ¸å¿ƒç»“æž„
+
+**mqtt_client_t 结构**
+
+```c
+typedef struct mqtt_client {
+ char *mqtt_client_id;
+ char *mqtt_user_name;
+ char *mqtt_password;
+ char *mqtt_read_buf;
+ char *mqtt_write_buf;
+ char *mqtt_host;
+ char *mqtt_port;
+ char *mqtt_ca;
+ void *mqtt_reconnect_data;
+ uint16_t mqtt_keep_alive_interval;
+ uint16_t mqtt_packet_id;
+ uint32_t mqtt_will_flag : 1;
+ uint32_t mqtt_clean_session : 1;
+ uint32_t mqtt_ping_outstanding : 2;
+ uint32_t mqtt_version : 4;
+ uint32_t mqtt_ack_handler_number : 24;
+ uint32_t mqtt_cmd_timeout;
+ uint32_t mqtt_read_buf_size;
+ uint32_t mqtt_write_buf_size;
+ uint32_t mqtt_reconnect_try_duration;
+ size_t mqtt_client_id_len;
+ size_t mqtt_user_name_len;
+ size_t mqtt_password_len;
+ mqtt_will_options_t *mqtt_will_options;
+ client_state_t mqtt_client_state;
+ platform_mutex_t mqtt_write_lock;
+ platform_mutex_t mqtt_global_lock;
+ mqtt_list_t mqtt_msg_handler_list;
+ mqtt_list_t mqtt_ack_handler_list;
+ network_t *mqtt_network;
+ platform_thread_t *mqtt_thread;
+ platform_timer_t mqtt_reconnect_timer;
+ platform_timer_t mqtt_last_sent;
+ platform_timer_t mqtt_last_received;
+ reconnect_handler_t mqtt_reconnect_handler;
+ interceptor_handler_t mqtt_interceptor_handler;
+} mqtt_client_t;
+```
+
+该结构主è¦ç»´æŠ¤ä»¥ä¸‹å†…容:
+
+1. MQTT客户端连接æœåŠ¡å™¨å¿…è¦çš„傿•°ï¼Œå¦‚**客户端ID mqtt_client_idã€ç”¨æˆ·åmqtt_user_nameã€å¯†ç mqtt_password**以åŠ**客户端ID长度mqtt_client_id_lenã€ç”¨æˆ·å长度mqtt_user_name_lenã€å¯†ç 长度mqtt_password_len**ç‰ã€‚
+
+2. 读写数æ®ç¼“冲区**mqtt_read_bufã€mqtt_write_buf**åŠå…¶å¤§å°çš„é…ç½®**mqtt_read_buf_sizeã€mqtt_write_buf_size**。
+
+3. æœåŠ¡å™¨ç›¸å…³çš„é…置信æ¯ï¼Œå¦‚**æœåŠ¡å™¨åœ°å€mqtt_hostã€æœåŠ¡å™¨ç«¯å£å·mqtt_portã€æœåС噍CAè¯ä¹¦mqtt_ca**。
+
+4. 一些MQTT客户端的é…置信æ¯ï¼šå¦‚**心跳时间间隔mqtt_keep_alive_intervalã€MQTTæŠ¥æ–‡æ ‡è¯†ç¬¦mqtt_packet_idã€é—å˜±æ ‡è®°ä½mqtt_will_flagã€æ¸…é™¤ä¼šè¯æ ‡è®°mqtt_clean_sessionã€MQTTå议版本mqtt_versionã€ç‰å¾…应ç”列表的最大记录个数mqtt_ack_handler_number**ç‰ã€‚
+
+5. 一些其他的é…置,如**é—嘱消æ¯ç›¸å…³çš„é…ç½®mqtt_will_optionsã€å®¢æˆ·ç«¯çš„状æ€mqtt_client_stateã€å†™ç¼“冲区的互斥é”mqtt_write_lockã€å…¨å±€çš„互斥é”mqtt_global_lock**ç‰ã€‚
+
+6. 命令超时时间**mqtt_cmd_timeout**ï¼ˆä¸»è¦æ˜¯è¯»å†™é˜»å¡žæ—¶é—´ã€ç‰å¾…å“应的时间ã€é‡è¿žç‰å¾…æ—¶é—´ç‰ï¼‰ã€‚
+
+7. 维护消æ¯å¤„ç†åˆ—表**mqtt_msg_handler_list**,这是**mqtt**å议必须实现的内容,所有æ¥è‡ªæœåŠ¡å™¨çš„**publish**报文都会被处ç†ï¼ˆå‰ææ˜¯è®¢é˜…了对应的消æ¯ï¼Œæˆ–者设置了拦截器)。
+
+8. 维护**ack**链表**mqtt_ack_handler_list**,这是异æ¥å®žçŽ°çš„æ ¸å¿ƒï¼Œæ‰€æœ‰ç‰å¾…å“应的报文都会被挂载到这个链表上。
+
+9. 维护一个网络组件层**mqtt_network**,它å¯ä»¥è‡ªåŠ¨é€‰æ‹©æ•°æ®é€šé“。
+
+10. 维护一个内部线程**mqtt_thread**,所有æ¥è‡ªæœåŠ¡å™¨çš„mqtt包都会在内部线程这里被处ç†ï¼
+
+11. 两个定时器,分别是掉线é‡è¿žå®šæ—¶å™¨ä¸Žä¿æ´»å®šæ—¶å™¨**mqtt_reconnect_timerã€mqtt_last_sentã€mqtt_last_received**
+
+12. 设置掉线é‡è¿žåŽå‘ŠçŸ¥åº”用层的回调函数**mqtt_reconnect_handler**ä¸Žå‚æ•°**mqtt_reconnect_data**。
+
+13. 设置底层的拦截器的回调函数**mqtt_interceptor_handler**,将所有底层数æ®ä¸ŠæŠ¥ç»™åº”用层。
+
+
+# mqttclient实现
+
+以下是整个框架的实现方å¼ï¼Œæ–¹ä¾¿å¤§å®¶æ›´å®¹æ˜“ç†è§£mqttclient的代ç ä¸Žè®¾è®¡æ€æƒ³ï¼Œè®©å¤§å®¶èƒ½å¤Ÿä¿®æ”¹æºç 与使用,还å¯ä»¥æäº¤pr或者issues,开æºçš„世界期待å„ä½å¤§ç¥žçš„å‚与,感谢ï¼
+
+除æ¤ä¹‹å¤–以下代ç çš„**记录机制**与**è¶…æ—¶å¤„ç†æœºåˆ¶**是éžå¸¸å¥½çš„ç¼–ç¨‹æ€æƒ³ï¼Œå¤§å®¶æœ‰å…´è¶£ä¸€å®šè¦çœ‹æºä»£ç ï¼
+
+## 申请一个mqtt客户端
+
+```c
+mqtt_client_t *mqtt_lease(void);
+```
+
+1. 这个函数的内部通过动æ€ç”³è¯·å†…å˜çš„æ–¹å¼ç”³è¯·äº†ä¸€ä¸ªMQTT客户端结构**mqtt_client_t**。
+
+2. 调用**_mqtt_init()**函数将其内部的进行了默认的åˆå§‹åŒ–,如申请网络组件的内å˜ç©ºé—´ã€åˆå§‹åŒ–相关的互斥é”ã€é“¾è¡¨ç‰ã€‚
+
+
+## 释放已申请的mqtt客户端
+
+```c
+mqtt_release()
+```
+
+回收MQTT客户端结构**mqtt_client_t**的内å˜ç©ºé—´ã€ç½‘络组件的内å˜ç©ºé—´ã€ä¸ŽæœåС噍æ–开连接。
+
+## 设置MQTT客户端的信æ¯
+
+通过å®å®šä¹‰åŽ»ç»Ÿä¸€è®¾ç½®MQTT客户端结构**mqtt_client_t**的信æ¯ï¼Œå®šä¹‰å¦‚下:
+
+```c
+#define MQTT_CLIENT_SET_DEFINE(name, type, res) \
+ type mqtt_set_##name(mqtt_client_t *c, type t) { \
+ MQTT_ROBUSTNESS_CHECK((c), res); \
+ c->mqtt_##name = t; \
+ return c->mqtt_##name; \
+ }
+```
+
+由编译器预处ç†å¾—到相关的函数:**mqtt_set_xxx()**。
+
+```c
+MQTT_CLIENT_SET_DEFINE(client_id, char*, NULL)
+MQTT_CLIENT_SET_DEFINE(user_name, char*, NULL)
+MQTT_CLIENT_SET_DEFINE(password, char*, NULL)
+MQTT_CLIENT_SET_DEFINE(host, char*, NULL)
+MQTT_CLIENT_SET_DEFINE(port, char*, NULL)
+MQTT_CLIENT_SET_DEFINE(ca, char*, NULL)
+MQTT_CLIENT_SET_DEFINE(reconnect_data, void*, NULL)
+MQTT_CLIENT_SET_DEFINE(keep_alive_interval, uint16_t, 0)
+MQTT_CLIENT_SET_DEFINE(will_flag, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(clean_session, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(version, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(cmd_timeout, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(read_buf_size, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(write_buf_size, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(reconnect_try_duration, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(reconnect_handler, reconnect_handler_t, NULL)
+MQTT_CLIENT_SET_DEFINE(interceptor_handler, interceptor_handler_t, NULL)
+```
+
+## 连接æœåС噍
+
+```c
+int mqtt_connect(mqtt_client_t* c);
+```
+
+傿•°åªæœ‰ **mqtt_client_t** 类型的指针,连接æœåŠ¡å™¨åˆ™æ˜¯ä½¿ç”¨éžå¼‚æ¥çš„æ–¹å¼è®¾è®¡ï¼Œå› 为必须ç‰å¾…连接上æœåС噍æ‰èƒ½è¿›è¡Œä¸‹ä¸€æ¥æ“作。
+
+过程如下:
+
+1. 调用底层的连接函数连接上æœåŠ¡å™¨ï¼š
+
+ ```c
+ network_connect(c->network);
+ ```
+
+2. åºåˆ—化**mqtt**çš„**CONNECT**报文并且å‘é€ã€‚
+
+ ```c
+ MQTTSerialize_connect(c->write_buf, c->write_buf_size, &connect_data)
+ mqtt_send_packet(c, len, &connect_timer)
+ ```
+
+3. ç‰å¾…æ¥è‡ªæœåŠ¡å™¨çš„**CONNACK**报文
+
+ ```c
+ mqtt_wait_packet(c, CONNACK, &connect_timer)
+ ```
+
+4. 连接æˆåŠŸåŽåˆ›å»ºä¸€ä¸ªå†…部线程**mqtt_yield_thread**,并在åˆé€‚的时候å¯åŠ¨å®ƒï¼š
+
+ ```c
+ /* connect success, and need init mqtt thread */
+ c->mqtt_thread= platform_thread_init("mqtt_yield_thread", mqtt_yield_thread, c, MQTT_THREAD_STACK_SIZE, MQTT_THREAD_PRIO, MQTT_THREAD_TICK);
+
+ if (NULL != c->mqtt_thread) {
+ mqtt_set_client_state(c, CLIENT_STATE_CONNECTED);
+ platform_thread_startup(c->mqtt_thread);
+ platform_thread_start(c->mqtt_thread); /* start run mqtt thread */
+ }
+ ```
+
+5. 而对于é‡è¿žæ¥è¯´åˆ™ä¸ä¼šé‡æ–°åˆ›å»ºçº¿ç¨‹ï¼Œç›´æŽ¥æ”¹å˜å®¢æˆ·ç«¯çжæ€ä¸ºè¿žæŽ¥çжæ€å³å¯:
+
+ ```c
+ mqtt_set_client_state(c, CLIENT_STATE_CONNECTED);
+ ```
+
+## 订阅报文
+
+```c
+int mqtt_subscribe(mqtt_client_t* c, const char* topic_filter, mqtt_qos_t qos, message_handler_t handler)
+```
+
+订阅报文使用异æ¥è®¾è®¡æ¥å®žçŽ°çš„ï¼Œå‚æ•°æœ‰å—符串类型的**主题**(支æŒé€šé…符"#" "+"),主题的**æœåŠ¡è´¨é‡**ï¼Œä»¥åŠæ”¶åˆ°æŠ¥æ–‡çš„**处ç†å‡½æ•°`**ï¼Œå¦‚ä¸æŒ‡å®šåˆ™æœ‰é»˜è®¤å¤„ç†å‡½æ•°ã€‚
+
+过程如下:
+
+1. åºåˆ—化订阅报文并且å‘é€ç»™æœåС噍
+
+ ```c
+ MQTTSerialize_subscribe(c->write_buf, c->write_buf_size, 0, mqtt_get_next_packet_id(c), 1, &topic, (int*)&qos)
+ mqtt_send_packet(c, len, &timer)
+ ```
+
+2. 创建对应的消æ¯å¤„ç†èŠ‚ç‚¹ï¼Œè¿™ä¸ªæ¶ˆæ¯èŠ‚ç‚¹åœ¨æ”¶åˆ°æœåŠ¡å™¨çš„**SUBACK**è®¢é˜…åº”ç”æŠ¥æ–‡åŽä¼šæŒ‚载到消æ¯å¤„ç†åˆ—表**mqtt_msg_handler_list**上
+
+ ```c
+ mqtt_msg_handler_create(topic_filter, qos, handler)
+ ```
+
+3. 在å‘é€äº†æŠ¥æ–‡ç»™æœåС噍那就è¦ç‰å¾…æœåŠ¡å™¨çš„å“应了,先记录这个ç‰å¾…**SUBACK**
+
+ ```c
+ mqtt_ack_list_record(c, SUBACK, mqtt_get_next_packet_id(c), len, msg_handler)
+ ```
+
+## å–æ¶ˆè®¢é˜…
+
+```c
+int mqtt_unsubscribe(mqtt_client_t* c, const char* topic_filter);
+```
+
+与订阅报文的逻辑基本差ä¸å¤šçš„ï¼ŒæŒ‡å®šäº†å–æ¶ˆè®¢é˜…的主题。
+
+实现过程如下:
+
+1. åºåˆ—化订阅报文并且å‘é€ç»™æœåС噍
+
+ ```c
+ MQTTSerialize_unsubscribe(c->write_buf, c->write_buf_size, 0, packet_id, 1, &topic)
+ mqtt_send_packet(c, len, &timer)
+ ```
+
+2. 创建对应的消æ¯å¤„ç†èŠ‚ç‚¹ï¼Œè¿™ä¸ªæ¶ˆæ¯èŠ‚ç‚¹åœ¨æ”¶åˆ°æœåŠ¡å™¨çš„**UNSUBACK**å–æ¶ˆè®¢é˜…åº”ç”æŠ¥æ–‡åŽå°†æ¶ˆæ¯å¤„ç†åˆ—表**mqtt_msg_handler_list**上的已ç»è®¢é˜…的主题消æ¯èŠ‚ç‚¹é”€æ¯
+
+ ```c
+ mqtt_msg_handler_create((const char*)topic_filter, QOS0, NULL)
+ ```
+
+3. 在å‘é€äº†æŠ¥æ–‡ç»™æœåС噍那就è¦ç‰å¾…æœåŠ¡å™¨çš„å“应了,先记录这个ç‰å¾…**UNSUBACK**
+
+ ```c
+ mqtt_ack_list_record(c, UNSUBACK, packet_id, len, msg_handler)
+ ```
+
+## å‘布报文
+
+```c
+int mqtt_publish(mqtt_client_t* c, const char* topic_filter, mqtt_message_t* msg)
+```
+
+呿Œ‡å®šä¸»é¢˜å‘布一个MQTTæŠ¥æ–‡ã€‚å‚æ•°åªæœ‰**mqtt_client_t** 类型的指针,å—符串类型的**主题**(支æŒé€šé…符),è¦å‘布的消æ¯ï¼ˆåŒ…括**æœåŠ¡è´¨é‡**ã€**消æ¯ä¸»ä½“**)。
+
+使用如下:
+
+```c
+mqtt_message_t msg;
+
+msg.qos = 2;
+msg.payload = (void *) buf;
+
+mqtt_publish(&client, "testtopic1", &msg);
+```
+
+代ç çš„å®žçŽ°æ ¸å¿ƒæ€æƒ³éƒ½å·®ä¸å¤šï¼Œè¿‡ç¨‹å¦‚下:
+
+1. å…ˆåºåˆ—化å‘布报文,然åŽå‘é€åˆ°æœåС噍
+
+ ```c
+ MQTTSerialize_publish(c->write_buf, c->write_buf_size, 0, msg->qos, msg->retained, msg->id,topic, (unsigned char*)msg->payload, msg->payloadlen);
+ mqtt_send_packet(c, len, &timer)
+ ```
+
+2. 对于QOS0的逻辑,ä¸åšä»»ä½•处ç†ï¼Œå¯¹äºŽQOS1å’ŒQOS2的报文则需è¦è®°å½•下æ¥ï¼Œåœ¨æ²¡æ”¶åˆ°æœåŠ¡å™¨åº”ç”的时候进行é‡å‘
+
+ ```c
+ if (QOS1 == msg->qos) {
+ rc = mqtt_ack_list_record(c, PUBACK, mqtt_get_next_packet_id(c), len, NULL);
+ } else if (QOS2 == msg->qos) {
+ rc = mqtt_ack_list_record(c, PUBREC, mqtt_get_next_packet_id(c), len, NULL);
+ }
+ ```
+
+3. 还有éžå¸¸é‡è¦çš„一点,é‡å‘报文的MQTT报文头部需è¦è®¾ç½®DUPæ ‡å¿—ä½ï¼Œè¿™æ˜¯MQTTåè®®çš„æ ‡å‡†ï¼Œå› æ¤ï¼Œåœ¨é‡å‘的时候作者直接æ“作了报文的DUPæ ‡å¿—ä½ï¼Œå› 为修改DUPæ ‡å¿—ä½çš„函数我没有从MQTTåº“ä¸æ‰¾åˆ°ï¼Œæ‰€ä»¥æˆ‘å°è£…了一个函数,这与LwIPä¸çš„交å‰å˜å–æ€æƒ³æ˜¯ä¸€ä¸ªé“ç†ï¼Œå®ƒå‡è®¾æˆ‘知é“MQTT报文的所有æ“作,所以我å¯ä»¥æ“ä½œå®ƒï¼Œè¿™æ ·åå¯ä»¥æé«˜å¾ˆå¤šæ•ˆçŽ‡ï¼š
+
+ ```c
+ mqtt_set_publish_dup(c,1); /* may resend this data, set the udp flag in advance */
+ ```
+
+## 内部线程
+
+```c
+static void mqtt_yield_thread(void *arg)
+```
+
+ä¸»è¦æ˜¯å¯¹**mqtt_yield**函数的返回值åšå¤„ç†ï¼Œæ¯”如在**disconnect**的时候销æ¯è¿™ä¸ªçº¿ç¨‹ã€‚
+
+## æ ¸å¿ƒçš„å¤„ç†å‡½æ•°
+
+1. æ•°æ®åŒ…的处ç†**mqtt_packet_handle**
+
+ ```c
+ static int mqtt_packet_handle(mqtt_client_t* c, platform_timer_t* timer)
+ ```
+
+ 对ä¸åŒçš„包使用ä¸ä¸€æ ·çš„处ç†ï¼š
+
+ ```c
+ switch (packet_type) {
+ case 0: /* timed out reading packet */
+ break;
+
+ case CONNACK:
+ break;
+
+ case PUBACK:
+ case PUBCOMP:
+ rc = mqtt_puback_and_pubcomp_packet_handle(c, timer);
+ break;
+
+ case SUBACK:
+ rc = mqtt_suback_packet_handle(c, timer);
+ break;
+
+ case UNSUBACK:
+ rc = mqtt_unsuback_packet_handle(c, timer);
+ break;
+
+ case PUBLISH:
+ rc = mqtt_publish_packet_handle(c, timer);
+ break;
+
+ case PUBREC:
+ case PUBREL:
+ rc = mqtt_pubrec_and_pubrel_packet_handle(c, timer);
+ break;
+
+ case PINGRESP:
+ c->ping_outstanding = 0;
+ break;
+
+ default:
+ goto exit;
+ }
+ ```
+
+ 并且åšä¿æ´»çš„处ç†ï¼š
+
+ ```c
+ mqtt_keep_alive(c)
+ ```
+
+ 当å‘生超时åŽçš„处ç†ï¼š
+
+ ```c
+ if (platform_timer_is_expired(&c->last_sent) || platform_timer_is_expired(&c->last_received))
+ ```
+
+ åºåˆ—化一个心跳包并且å‘é€ç»™æœåС噍
+
+ ```c
+ MQTTSerialize_pingreq(c->write_buf, c->write_buf_size);
+ mqtt_send_packet(c, len, &timer);
+ ```
+
+ 当冿¬¡å‘生超时åŽï¼Œè¡¨ç¤ºä¸ŽæœåŠ¡å™¨çš„è¿žæŽ¥å·²æ–开,需è¦é‡è¿žçš„æ“ä½œï¼Œè®¾ç½®å®¢æˆ·ç«¯çŠ¶æ€ä¸ºæ–开连接
+
+ ```c
+ mqtt_set_client_state(c, CLIENT_STATE_DISCONNECTED);
+ ```
+
+2. `ack`链表的扫æï¼Œå½“收到æœåŠ¡å™¨çš„æŠ¥æ–‡æ—¶ï¼Œå¯¹ackåˆ—è¡¨è¿›è¡Œæ‰«ææ“ä½œ
+
+ ```c
+ mqtt_ack_list_scan(c);
+ ```
+
+ 当超时åŽå°±é”€æ¯ack链表节点:
+
+ ```c
+ mqtt_ack_handler_destroy(ack_handler);
+ ```
+
+ 当然下é¢è¿™å‡ ç§æŠ¥æ–‡åˆ™éœ€è¦é‡å‘æ“作:(**PUBACK ã€PUBREC〠PUBREL ã€PUBCOMP**,ä¿è¯QOS1 QOS2çš„æœåŠ¡è´¨é‡ï¼‰
+
+ ```c
+ if ((ack_handler->type == PUBACK) || (ack_handler->type == PUBREC) || (ack_handler->type == PUBREL) || (ack_handler->type == PUBCOMP))
+ mqtt_ack_handler_resend(c, ack_handler);
+ ```
+
+3. ä¿æŒæ´»æ€§çš„æ—¶é—´è¿‡åŽ»äº†ï¼Œå¯èƒ½æŽ‰çº¿äº†ï¼Œéœ€è¦é‡è¿žæ“作
+
+ ```c
+ mqtt_try_reconnect(c);
+ ```
+
+ é‡è¿žæˆåŠŸåŽå°è¯•釿–°è®¢é˜…报文,ä¿è¯æ¢å¤åŽŸå§‹çŠ¶æ€~
+
+ ```c
+ mqtt_try_resubscribe(c)
+ ```
+
+## å‘布应ç”与å‘å¸ƒå®ŒæˆæŠ¥æ–‡çš„å¤„ç†
+
+```c
+static int mqtt_puback_and_pubcomp_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
+```
+
+1. ååºåˆ—化报文
+
+ ```c
+ MQTTDeserialize_ack(&packet_type, &dup, &packet_id, c->read_buf, c->read_buf_size)
+ ```
+
+2. å–æ¶ˆå¯¹åº”çš„ack记录
+
+ ```c
+ mqtt_ack_list_unrecord(c, packet_type, packet_id, NULL);
+ ```
+
+## è®¢é˜…åº”ç”æŠ¥æ–‡çš„å¤„ç†
+
+ ```c
+ static int mqtt_suback_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
+ ```
+
+1. ååºåˆ—化报文
+
+ ```c
+ MQTTDeserialize_suback(&packet_id, 1, &count, (int*)&granted_qos, c->read_buf, c->read_buf_size)
+ ```
+
+2. å–æ¶ˆå¯¹åº”çš„ack记录
+
+ ```c
+ mqtt_ack_list_unrecord(c, packet_type, packet_id, NULL);
+ ```
+
+3. 安装对应的订阅消æ¯å¤„ç†å‡½æ•°ï¼Œå¦‚果是已å˜åœ¨çš„则ä¸ä¼šå®‰è£…
+
+ ```c
+ mqtt_msg_handlers_install(c, msg_handler);
+ ```
+
+## å–æ¶ˆè®¢é˜…åº”ç”æŠ¥æ–‡çš„å¤„ç†
+
+ ```c
+ static int mqtt_unsuback_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
+ ```
+
+1. ååºåˆ—化报文
+
+ ```c
+ MQTTDeserialize_unsuback(&packet_id, c->read_buf, c->read_buf_size)
+ ```
+
+2. å–æ¶ˆå¯¹åº”çš„ack记录,并且获å–到已ç»è®¢é˜…的消æ¯å¤„ç†èŠ‚ç‚¹
+
+ ```c
+ mqtt_ack_list_unrecord(c, UNSUBACK, packet_id, &msg_handler)
+ ```
+
+3. 销æ¯å¯¹åº”的订阅消æ¯å¤„ç†å‡½æ•°
+
+ ```c
+ mqtt_msg_handler_destory(msg_handler);
+ ```
+
+## æ¥è‡ªæœåŠ¡å™¨çš„å‘布报文的处ç†
+
+ ```c
+ static int mqtt_publish_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
+ ```
+
+1. ååºåˆ—化报文
+
+ ```c
+ MQTTDeserialize_publish(&msg.dup, &qos, &msg.retained, &msg.id, &topic_name,
+ (unsigned char**)&msg.payload, (int*)&msg.payloadlen, c->read_buf, c->read_buf_size)
+ ```
+
+2. 对于QOS0ã€QOS1çš„æŠ¥æ–‡ï¼Œç›´æŽ¥åŽ»å¤„ç†æ¶ˆæ¯
+
+ ```c
+ mqtt_deliver_message(c, &topic_name, &msg);
+ ```
+
+3. 对于QOS1的报文,还需è¦å‘é€ä¸€ä¸ª**PUBACK**åº”ç”æŠ¥æ–‡ç»™æœåС噍
+
+ ```c
+ MQTTSerialize_ack(c->write_buf, c->write_buf_size, PUBACK, 0, msg.id);
+ ```
+
+4. 而对于QOS2的报文则需è¦å‘é€**PUBREC**报文给æœåŠ¡å™¨ï¼Œé™¤æ¤ä¹‹å¤–还需è¦è®°å½•**PUBREL**到ack链表上,ç‰å¾…æœåŠ¡å™¨çš„å‘布释放报文,最åŽå†å޻处ç†è¿™ä¸ªæ¶ˆæ¯
+
+ ```c
+ MQTTSerialize_ack(c->write_buf, c->write_buf_size, PUBREC, 0, msg.id);
+ mqtt_ack_list_record(c, PUBREL, msg.id + 1, len, NULL)
+ mqtt_deliver_message(c, &topic_name, &msg);
+ ```
+
+说明:一旦注册到ack列表上的报文,当具有é‡å¤çš„æŠ¥æ–‡æ˜¯ä¸ä¼šé‡æ–°è¢«æ³¨å†Œçš„,它会通过**mqtt_ack_list_node_is_exist()**函数判æ–这个节点是å¦å˜åœ¨ï¼Œä¸»è¦æ˜¯ä¾èµ–ç‰å¾…å“应的消æ¯ç±»åž‹ä¸Žmsgid。
+
+## å‘布收到与å‘布释放报文的处ç†
+
+```c
+static int mqtt_pubrec_and_pubrel_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
+```
+
+1. ååºåˆ—化报文
+
+ ```c
+ MQTTDeserialize_ack(&packet_type, &dup, &packet_id, c->read_buf, c->read_buf_size)
+ ```
+
+2. äº§ç”Ÿä¸€ä¸ªå¯¹åº”çš„åº”ç”æŠ¥æ–‡
+
+ ```c
+ mqtt_publish_ack_packet(c, packet_id, packet_type);
+ ```
+
+3. å–æ¶ˆå¯¹åº”çš„ack记录
+
+ ```c
+ mqtt_ack_list_unrecord(c, UNSUBACK, packet_id, &msg_handler)
+ ```
+
+**上一篇**:[mqttclienté…ç½®åŠè£å‰ªå·¥å…·](./mqtt-config.md)
+
+**下一篇**:[mqttclient连接到百度天工物接入](./mqtt-baidu.md)
\ No newline at end of file
diff --git a/components/connectivity/mqttclient/docs/mqtt-introduction.md b/components/connectivity/mqttclient/docs/mqtt-introduction.md
new file mode 100644
index 00000000..a57b4f14
--- /dev/null
+++ b/components/connectivity/mqttclient/docs/mqtt-introduction.md
@@ -0,0 +1,196 @@
+# MQTTå议简介
+
+MQTTå议全称是Message Queuing Telemetry Transport,翻译过æ¥å°±æ˜¯æ¶ˆæ¯é˜Ÿåˆ—饿µ‹ä¼ 输å议,它是物è”网常用的应用层å议,è¿è¡Œåœ¨TCP/IPä¸çš„应用层ä¸ï¼Œä¾èµ–TCPåè®®ï¼Œå› æ¤å®ƒå…·æœ‰éžå¸¸é«˜çš„å¯é æ€§ï¼ŒåŒæ—¶å®ƒæ˜¯åŸºäºŽTCPå议的 <客户端-æœåС噍> 模型å‘布/订阅主题消æ¯çš„è½»é‡çº§å议,也是我们常说的å‘é€ä¸ŽæŽ¥æ”¶æ•°æ®ï¼Œä¸‹é¢æˆ‘们æ¥åˆæ¥äº†è§£ä¸€ä¸‹mqtt相关的å称与功能。
+
+MQTT最大的优点在于å¯ä»¥ä»¥æžå°‘的代ç 和有é™çš„带宽,为远程设备æä¾›å®žæ—¶å¯é çš„æ¶ˆæ¯æœåŠ¡ã€‚åšä¸ºä¸€ç§ä½Žå¼€é”€ã€ä½Žå¸¦å®½å ç”¨çš„å³æ—¶é€šè®¯å议,MQTT在物è”网ã€å°åž‹è®¾å¤‡ã€ç§»åŠ¨åº”ç”¨ç‰æ–¹é¢æœ‰å¹¿æ³›çš„应用。
+
+# MQTT是哪一层的å议?
+
+众所周知,TCP/IPå‚考模型å¯ä»¥åˆ†ä¸ºå››å±‚:应用层ã€ä¼ 输层ã€ç½‘络层ã€é“¾è·¯å±‚。TCPå’ŒUDPä½äºŽä¼ 输层,应用层常è§çš„å议有HTTPã€FTPã€SSHç‰ã€‚MQTTåè®®è¿è¡ŒäºŽTCP之上,属于应用层åè®®ï¼Œå› æ¤åªè¦æ˜¯æ”¯æŒTCP/IPåè®®æ ˆçš„åœ°æ–¹ï¼Œéƒ½å¯ä»¥ä½¿ç”¨MQTT。
+
+# MQTT通信模型
+
+MQTT åè®®æä¾›ä¸€å¯¹å¤šçš„æ¶ˆæ¯å‘布,å¯ä»¥é™ä½Žåº”用程åºçš„è€¦åˆæ€§ï¼Œç”¨æˆ·åªéœ€è¦ç¼–写æžå°‘é‡çš„应用代ç 就能完æˆä¸€å¯¹å¤šçš„æ¶ˆæ¯å‘布与订阅,该å议是基于<客户端-æœåС噍>模型,在åè®®ä¸ä¸»è¦æœ‰ä¸‰ç§èº«ä»½ï¼šå‘布者(Publisherï¼‰ã€æœåŠ¡å™¨ï¼ˆBroker)以åŠè®¢é˜…者(Subscriber)。其ä¸ï¼ŒMQTT消æ¯çš„å‘布者和订阅者都是客户端,æœåŠ¡å™¨åªæ˜¯ä½œä¸ºä¸€ä¸ªä¸è½¬çš„å˜åœ¨ï¼Œå°†å‘布者å‘布的消æ¯è¿›è¡Œè½¬å‘给所有订阅该主题的订阅者;å‘布者å¯ä»¥å‘布在其æƒé™ä¹‹å†…的所有主题,并且消æ¯å‘布者å¯ä»¥åŒæ—¶æ˜¯è®¢é˜…者,实现了生产者与消费者的脱耦,å‘布的消æ¯å¯ä»¥åŒæ—¶è¢«å¤šä¸ªè®¢é˜…者订阅。
+
+MQTT通信模型示æ„图如下:
+
+
+
+
+## MQTT客户端的功能:
+
+1. å‘布消æ¯ç»™å…¶å®ƒç›¸å…³çš„客户端。
+
+2. 订阅主题请求接收相关的应用消æ¯ã€‚
+
+3. å–æ¶ˆè®¢é˜…主题请求移除接收应用消æ¯ã€‚
+
+4. 从æœåŠ¡ç«¯ç»ˆæ¢è¿žæŽ¥ã€‚
+
+## MQTT客户æœåŠ¡å™¨åŠŸèƒ½ï¼š
+
+MQTT æœåŠ¡å™¨å¸¸è¢«ç§°ä¸º Broker(消æ¯ä»£ç†ï¼‰ï¼Œä»¥æ˜¯ä¸€ä¸ªåº”ç”¨ç¨‹åºæˆ–一å°è®¾å¤‡ï¼Œå®ƒä¸€èˆ¬ä¸ºäº‘æœåŠ¡å™¨ï¼Œæ¯”å¦‚BTA三巨头的一些物è”网平å°å°±æ˜¯å¸¸ä½¿ç”¨MQTTå议,它是ä½äºŽæ¶ˆæ¯å‘布者和订阅者之间,以便用于接收消æ¯å¹¶å‘é€åˆ°è®¢é˜…者之ä¸ï¼Œå®ƒçš„功能有:
+
+1. æŽ¥å—æ¥è‡ªå®¢æˆ·ç«¯çš„网络连接请求。
+
+2. 接å—客户端å‘布的应用消æ¯ã€‚
+
+3. 处ç†å®¢æˆ·ç«¯çš„è®¢é˜…å’Œå–æ¶ˆè®¢é˜…请求。
+
+4. 转å‘应用消æ¯ç»™ç¬¦åˆæ¡ä»¶çš„已订阅客户端(包括å‘布者自身)。
+
+
+# 消æ¯ä¸»é¢˜ä¸ŽæœåŠ¡è´¨é‡
+
+什么是主题?MQTTæœåŠ¡å™¨ä¸ºæ¯ä¸ªè¿žæŽ¥çš„å®¢æˆ·ç«¯ï¼ˆè®¢é˜…è€…ï¼‰æ·»åŠ ä¸€ä¸ªæ ‡ç¾ï¼Œè¯¥æ ‡ç¾ä¸ŽæœåС噍ä¸çš„æ‰€æœ‰è®¢é˜…相匹é…,æœåŠ¡å™¨ä¼šå°†æ¶ˆæ¯è½¬å‘ç»™ä¸Žæ ‡ç¾ç›¸åŒ¹é…çš„æ¯ä¸ªå®¢æˆ·ç«¯ï¼ˆè®¢é˜…è€…ï¼‰ï¼Œå½“ç„¶è®¢é˜…è€…ä¹Ÿæ˜¯éœ€è¦æœ‰æƒé™æ‰èƒ½è®¢é˜…对应的主题,比如åƒé˜¿é‡Œäº‘ä¸çš„,订阅者åªèƒ½è®¢é˜…åŒä¸€ä¸ªäº§å“下的主题,而ä¸èƒ½è·¨äº§å“è®¢é˜…ï¼Œè¿™æ ·å的处ç†å°±èƒ½è¾¾åˆ°ä¿¡æ¯çš„安全性以åŠå¤šä¸ªè®¢é˜…è€…èƒ½åŠæ—¶æ”¶åˆ°æ¶ˆæ¯ã€‚一个主题å¯ä»¥æœ‰å¤šä¸ªçº§åˆ«ï¼Œå„个级别之间用斜æ å—符分隔,例如/test å’Œ /test/test1/test2都 是有效的主题。
+
+å‘布者与订阅者å¯ä»¥é€šè¿‡ä¸»é¢˜åå—,一般为UTF-8ç¼–ç ï¼ˆåæ£ç”¨è‹±æ–‡å—符串就ä¸ä¼šé”™ï¼‰çš„å½¢å¼å‘布和订阅主题,比如我们å¯ä»¥ç›´æŽ¥å®šä¹‰ä¸€ä¸ªåå—为“testâ€çš„主题,ç»å¤§å¤šæ•°çš„MQTTæœåŠ¡å™¨æ”¯æŒåЍæ€å‘布/定阅主题,å³å½“剿œåС噍䏿²¡æœ‰æŸä¸ªä¸»é¢˜ï¼Œä½†æ˜¯å®¢æˆ·ç«¯ç›´æŽ¥å¯ä»¥å‘该主题å‘布/订阅消æ¯ï¼Œè¿™æ ·åæœåŠ¡å™¨å°±ä¼šåˆ›å»ºå¯¹åº”çš„ä¸»é¢˜ï¼Œå½“ç„¶ï¼ŒæœåС噍ä¸ä¸€èˆ¬ä¹Ÿä¼šé»˜è®¤æä¾›å¤šä¸ªç³»ç»Ÿä¸»é¢˜ï¼Œæ‰€æœ‰è¿žæŽ¥çš„客户端å‡å¯è®¢é˜…。
+æ¯ä¸ªå®¢æˆ·ç«¯ä¸ŽæœåŠ¡å™¨å»ºç«‹è¿žæŽ¥åŽå°±æ˜¯ä¸€ä¸ªä¼šè¯ï¼Œå®¢æˆ·ç«¯å’ŒæœåŠ¡å™¨ä¹‹é—´ä¼šæœ‰çŠ¶æ€äº¤äº’,订阅是基于会è¯ä¹‹ä¸Šï¼Œæ¯ä¸ªè®¢é˜…ä¸ï¼Œéƒ½ä¼šåŒ…å«ä¸€ä¸ªä¸»é¢˜è¿‡æ»¤å™¨ï¼Œå®ƒæ˜¯ä¸€ä¸ªè¡¨è¾¾å¼ï¼Œç”¨äºŽæ ‡è¯†è®¢é˜…相关的一个或多个主题,主题过滤器å¯ä»¥ä½¿ç”¨é€šé…ç¬¦ï¼Œå› æ¤è®¢é˜…è€…éœ€è¦æŒ‡å®šè®¢é˜…的主题åå—与æœåŠ¡è´¨é‡ï¼ˆQoS),订阅者能订阅多个主题,也就能接收到多个å‘布者å‘布的消æ¯ã€‚åŒç†ï¼Œå‘布者也需è¦é¦–先与æœåŠ¡å™¨å»ºç«‹ä¼šè¯ï¼Œå¹¶ä¸”指定å‘é€çš„主题åå—与æœåŠ¡è´¨é‡ï¼ŒåŒæ—¶å®ƒä¹Ÿèƒ½å‘多个ä¸åŒçš„主题å‘逿¶ˆæ¯ã€‚
+
+那么什么是æœåŠ¡è´¨é‡å‘¢ï¼ŸMQTTçš„æœåŠ¡è´¨é‡æä¾›3个ç‰çº§ï¼š
+
+1. QoS0:最多å‘é€ä¸€æ¬¡æ¶ˆæ¯ï¼Œåœ¨æ¶ˆæ¯å‘é€å‡ºåŽ»åŽï¼ŒæŽ¥æ”¶è€…ä¸ä¼šå‘é€å›žåº”,å‘é€è€…也ä¸ä¼šé‡å‘消æ¯ï¼Œæ¶ˆæ¯å¯èƒ½é€è¾¾ä¸€æ¬¡ä¹Ÿå¯èƒ½æ ¹æœ¬æ²¡é€è¾¾ï¼Œè¿™ä¸ªæœåŠ¡è´¨é‡å¸¸ç”¨åœ¨ä¸é‡è¦çš„æ¶ˆæ¯ä¼ 递ä¸ï¼Œå› 为å³ä½¿æ¶ˆæ¯ä¸¢äº†ä¹Ÿæ²¡æœ‰å¤ªå¤§å…³ç³»ã€‚
+
+2. QoS1:最少å‘é€ä¸€æ¬¡æ¶ˆæ¯ï¼ˆæ¶ˆæ¯æœ€å°‘需è¦é€è¾¾ä¸€æ¬¡ï¼Œä¹Ÿæœ‰å¯é€è¾¾å¤šæ¬¡ï¼‰ï¼ŒQoS 1çš„PUBLISH报文的å¯å˜æŠ¥å¤´ä¸åŒ…å«ä¸€ä¸ªæŠ¥æ–‡æ ‡è¯†ç¬¦ï¼Œéœ€è¦PUBACK报文确认。å³éœ€è¦æŽ¥æ”¶è€…返回PUBACKåº”ç”æŠ¥æ–‡ã€‚
+
+3. QoS2:这是最高ç‰çº§çš„æœåŠ¡è´¨é‡ï¼Œæ¶ˆæ¯ä¸¢å¤±å’Œé‡å¤éƒ½æ˜¯ä¸å¯æŽ¥å—的,åªä¸è¿‡ä½¿ç”¨è¿™ä¸ªæœåŠ¡è´¨é‡ç‰çº§ä¼šæœ‰é¢å¤–的开销,这个ç‰çº§å¸¸ç”¨äºŽæ”¯ä»˜ä¸ï¼Œå› 为支付是必须有且仅有一次æˆåŠŸï¼Œæ€»ä¸èƒ½æ²¡ç»™é’±æˆ–者给了多次钱å§ã€‚
+
+# MQTT控制报文
+
+## 固定报头
+
+MQTTå议工作在TCPåè®®ä¹‹ä¸Šï¼Œå› ä¸ºå®¢æˆ·ç«¯å’ŒæœåŠ¡å™¨éƒ½æ˜¯åº”ç”¨å±‚ï¼Œé‚£ä¹ˆå¿…ç„¶éœ€è¦ä¸€ç§å议在两者之间进行通信,那么éšä¹‹è€Œæ¥çš„就是MQTT控制报文, MQTT控制报文有3个部分组æˆï¼Œåˆ†åˆ«æ˜¯å›ºå®šæŠ¥å¤´ï¼ˆfixed header)ã€å¯å˜æŠ¥å¤´ï¼ˆvariable headerï¼‰ã€æœ‰æ•ˆè·è½½ï¼ˆæ•°æ®åŒºåŸŸpayload)。固定报头,所有的MQTT控制报文都包å«ï¼Œå¯å˜æŠ¥å¤´ä¸Žæœ‰æ•ˆè½½è·æ˜¯éƒ¨åˆ†MQTT控制报文包å«ã€‚
+å›ºå®šæŠ¥å¤´å æ®ä¸¤å—节的空间,具体è§
+
+
+
+
+固定报头的第一个å—节分为控制报文的类型(4bitï¼‰ï¼Œä»¥åŠæŽ§åˆ¶æŠ¥æ–‡ç±»åž‹çš„æ ‡å¿—ä½ï¼ŒæŽ§åˆ¶ç±»åž‹å…±æœ‰14ç§ï¼Œå…¶ä¸0与15被系统ä¿ç•™å‡ºæ¥ï¼Œå…¶ä»–的类型具体è§ï¼š
+
+| 类型 | 值 | 说明 |
+| -- | -- | -- |
+| Reserved | 0 | 系统ä¿ç•™ |
+| CONNECT | 1 | 客户端请求连接æœåŠ¡ç«¯ |
+| CONNACK | 2 | 连接报文确认 |
+| PUBLISH | 3 | å‘å¸ƒæ¶ˆæ¯ |
+| PUBACK | 4 | 消æ¯å‘布收到确认(QoS 1) |
+| PUBREC | 5 | å‘布收到(QoS2) |
+| PUBREL | 6 | å‘布释放(QoS2) |
+| PUBCOMP | 7 | 消æ¯å‘布完æˆï¼ˆQoS2) |
+| SUBSCRIBE | 8 | 客户端订阅请求 |
+| SUBACK | 9 | 订阅请求报文确认 |
+| UNSUBSCRIBE | 10 | å®¢æˆ·ç«¯å–æ¶ˆè®¢é˜…请求 |
+| UNSUBACK | 11 | å–æ¶ˆè®¢é˜…报文确认 |
+| PINGREQ | 12 | 心跳请求 |
+| PINGRESP | 13 | 心跳å“应 |
+| DISCONNECT | 14 | 客户端æ–开连接 |
+| Reserved | 15 | 系统ä¿ç•™ |
+
+固定报头的bit0-bit3ä¸ºæ ‡å¿—ä½ï¼Œä¾ç…§æŠ¥æ–‡ç±»åž‹æœ‰ä¸åŒçš„å«ä¹‰ï¼Œäº‹å®žä¸Šï¼Œé™¤äº†PUBLISHç±»åž‹æŠ¥æ–‡ä»¥å¤–ï¼Œå…¶ä»–æŠ¥æ–‡çš„æ ‡å¿—ä½å‡ä¸ºç³»ç»Ÿä¿ç•™ï¼ŒPUBLISH报文的第一å—节bit3是控制报文的é‡å¤åˆ†å‘æ ‡å¿—ï¼ˆDUP),bit1-bit2是æœåŠ¡è´¨é‡ç‰çº§ï¼Œbit0是PUBLISH报文的ä¿ç•™æ ‡å¿—ï¼Œç”¨äºŽæ ‡è¯†PUBLISH是å¦ä¿ç•™ï¼Œå½“客户端å‘é€ä¸€ä¸ªPUBLISH消æ¯åˆ°æœåŠ¡å™¨ï¼Œå¦‚æžœä¿ç•™æ ‡è¯†ä½ç½®1,那么æœåŠ¡å™¨åº”è¯¥ä¿ç•™è¿™æ¡æ¶ˆæ¯ï¼Œå½“一个新的订阅者订阅这个主题的时候,最åŽä¿ç•™çš„主题消æ¯åº”被å‘é€åˆ°æ–°è®¢é˜…的用户。
+
+固定报头的第二个å—èŠ‚å¼€å§‹æ˜¯å‰©ä½™é•¿åº¦å—æ®µï¼Œæ˜¯ç”¨äºŽè®°å½•剩余报文长度的,表示当å‰çš„æ¶ˆæ¯å‰©ä½™çš„å—节数,包括å¯å˜æŠ¥å¤´å’Œæœ‰æ•ˆè½½è·åŒºåŸŸï¼ˆå¦‚æžœå˜åœ¨ï¼‰ï¼Œä½†å‰©ä½™é•¿åº¦ä¸åŒ…括用于编ç å‰©ä½™é•¿åº¦å—æ®µæœ¬èº«çš„å—节数。
+
+å‰©ä½™é•¿åº¦å—æ®µä½¿ç”¨ä¸€ä¸ªå˜é•¿åº¦ç¼–ç æ–¹æ¡ˆï¼Œå¯¹å°äºŽ128的值它使用å•å—节编ç ,而对于更大的数值则按下é¢çš„æ–¹å¼å¤„ç†ï¼šæ¯ä¸ªå—节的低7ä½ç”¨äºŽç¼–ç æ•°æ®é•¿åº¦ï¼Œæœ€é«˜ä½ï¼ˆbit7ï¼‰ç”¨äºŽæ ‡è¯†å‰©ä½™é•¿åº¦å—æ®µæ˜¯å¦æœ‰æ›´å¤šçš„å—节,且按照大端模å¼è¿›è¡Œç¼–ç ï¼Œå› æ¤æ¯ä¸ªå—节å¯ä»¥ç¼–ç 128个数值和一个延ç»ä½ï¼Œå‰©ä½™é•¿åº¦å—æ®µæœ€å¤§å¯æ‹¥æœ‰4个å—节。
+
+- 当剩余长度使用1个å—节å˜å‚¨æ—¶ï¼Œå…¶å–值范围为0(0x00)~127(0x7f)。
+- 当使用2个å—节时,其å–值范围为128(0x80,0x01)~16383(0Xff,0x7f)。
+- 当使用3个å—节时,其å–值范围为16384(0x80,0x80,0x01)~2097151(0xFF,0xFF,0x7F)。
+- 当使用4个å—节时,其å–值范围为2097152(0x80,0x80,0x80,0x01)~268435455(0xFF,0xFF,0xFF,0x7F)。
+
+总的æ¥è¯´ï¼ŒMQTT报文ç†è®ºä¸Šå¯ä»¥å‘逿œ€å¤§256Mçš„æŠ¥æ–‡ï¼Œå½“ç„¶ï¼Œè¿™ç§æƒ…况是éžå¸¸å°‘的。
+
+## å¯å˜æŠ¥å¤´
+
+å¯å˜æŠ¥å¤´å¹¶ä¸æ˜¯æ‰€æœ‰çš„MQTT报文都带有的(比如PINGREQ心跳请求与PINGRESP心跳å“应报文就没有å¯å˜æŠ¥å¤´ï¼‰ï¼Œåªæœ‰æŸäº›æŠ¥æ–‡æ‰æ‹¥æœ‰å¯å˜æŠ¥å¤´ï¼Œå®ƒåœ¨å›ºå®šæŠ¥å¤´å’Œæœ‰æ•ˆè´Ÿè½½ä¹‹é—´ï¼Œå¯å˜æŠ¥å¤´çš„å†…å®¹ä¼šæ ¹æ®æŠ¥æ–‡ç±»åž‹çš„ä¸åŒè€Œæœ‰æ‰€ä¸åŒï¼Œä½†å¯å˜æŠ¥å¤´çš„æŠ¥æ–‡æ ‡è¯†ç¬¦ï¼ˆPacket Identifierï¼‰å—æ®µå˜åœ¨äºŽåœ¨å¤šä¸ªç±»åž‹çš„æŠ¥æ–‡é‡Œï¼Œè€Œæœ‰ä¸€äº›æŠ¥æ–‡åˆæ²¡æœ‰æŠ¥æ–‡æ ‡è¯†ç¬¦å—段,具体è§è¡¨æ ¼ï¼ŒæŠ¥æ–‡æ ‡è¯†ç¬¦ç»“构具体è§å›¾ã€‚
+
+| 报文类型 | 是å¦éœ€è¦æŠ¥æ–‡æ ‡è¯†ç¬¦å—段 |
+| -- | -- |
+| CONNECT | ä¸éœ€è¦ |
+| CONNACK | ä¸éœ€è¦ |
+| PUBLISH | 需è¦ï¼ˆå¦‚æžœQoS > 0) |
+| PUBACK | éœ€è¦ |
+| PUBREC | éœ€è¦ |
+| PUBREL | éœ€è¦ |
+| PUBCOMP | éœ€è¦ |
+| SUBSCRIBE | éœ€è¦ |
+| SUBACK | éœ€è¦ |
+| UNSUBSCRIBE | éœ€è¦ |
+| UNSUBACK | éœ€è¦ |
+| PINGREQ | ä¸éœ€è¦ |
+| PINGRESP | ä¸éœ€è¦ |
+| DISCONNECT | ä¸éœ€è¦ |
+
+
+
+å› ä¸ºå¯¹äºŽä¸åŒçš„æŠ¥æ–‡ï¼Œå¯å˜æŠ¥å¤´æ˜¯ä¸ä¸€æ ·çš„,下é¢å°±ç®€å•è®²è§£å‡ ä¸ªæŠ¥æ–‡çš„å¯å˜æŠ¥å¤´ã€‚
+
+## CONNECT报文
+
+在一个会è¯ä¸ï¼Œå®¢æˆ·ç«¯åªèƒ½å‘é€ä¸€æ¬¡CONNECT报文,它是客户端用于请求连接æœåŠ¡å™¨çš„æŠ¥æ–‡ï¼Œå¸¸ç§°ä¹‹ä¸ºè¿žæŽ¥æŠ¥æ–‡ï¼Œå¦‚æžœå®¢æˆ·ç«¯å‘é€å¤šæ¬¡è¿žæŽ¥æŠ¥æ–‡ï¼Œé‚£ä¹ˆæœåŠ¡ç«¯å¿…é¡»å°†å®¢æˆ·ç«¯å‘é€çš„第二个CONNECT报文当作åè®®è¿è§„处ç†å¹¶æ–开客户端的连接。
+
+CONNECT报文的å¯å˜æŠ¥å¤´åŒ…å«å››ä¸ªå—段:åè®®å(Protocol Name)ã€å议级别(Protocol Level)ã€è¿žæŽ¥æ ‡å¿—(Connect Flags)以åŠä¿æŒè¿žæŽ¥ï¼ˆKeep Aliveï¼‰å—æ®µã€‚
+
+åè®®åæ˜¯MQTT çš„UTF-8ç¼–ç çš„å—符串,其ä¸è¿˜åŒ…å«ç”¨äºŽè®°å½•åè®®å长度的两å—èŠ‚å—æ®µMSB与LSB。
+
+在åè®®å之åŽçš„æ˜¯å议级别,MQTTå议使用8ä½çš„æ— 符å·å€¼è¡¨ç¤ºå议的修订版本,对于MQTT3.1版的å议,åè®®çº§åˆ«å—æ®µçš„值是3(0x03),而对于MQTT3.1.1版的å议,åè®®çº§åˆ«å—æ®µçš„值是4(0x04)。如果æœåС噍å‘现连接报文ä¸çš„åè®®çº§åˆ«å—æ®µæ˜¯ä¸æ”¯æŒçš„å议级别,æœåŠ¡ç«¯å¿…é¡»ç»™å‘é€ä¸€ä¸ªè¿”回ç 为0x01ï¼ˆä¸æ”¯æŒçš„å议级别)的CONNACKå“应连接报文,然åŽç»ˆæ¢å®¢æˆ·ç«¯çš„连接请求。
+
+è¿žæŽ¥æ ‡å¿—å—æ®µæ¶‰åŠçš„内容比较多,它在å议级别之åŽä½¿ç”¨ä¸€ä¸ªå—节表示,但分æˆå¾ˆå¤šä¸ªæ ‡å¿—ä½ï¼Œå…·ä½“è§
+
+
+
+bit0是MQTTä¿ç•™çš„æ ‡å¿—ä½ï¼Œåœ¨è¿žæŽ¥è¿‡ç¨‹ä¸ï¼ŒæœåŠ¡å™¨ä¼šæ£€æµ‹è¿žæŽ¥æ ‡å¿—çš„bit0是å¦ä¸º0,如果ä¸ä¸º0则æœåŠ¡å™¨ä»»åŠ¡è¿™ä¸ªè¿žæŽ¥æŠ¥æ–‡æ˜¯ä¸åˆæ³•的,会终æ¢è¿žæŽ¥è¯·æ±‚。
+
+bit1æ˜¯æ¸…é™¤ä¼šè¯æ ‡å¿—Clean Session,一般æ¥è¯´ï¼Œå®¢æˆ·ç«¯åœ¨è¯·æ±‚连接æœåŠ¡å™¨æ—¶æ€»æ˜¯å°†æ¸…é™¤ä¼šè¯æ ‡å¿—设置为0或1,在建立会è¯è¿žæŽ¥åŽï¼Œè¿™ä¸ªå€¼å°±å›ºå®šäº†ï¼Œå½“然这个值的选择å–å†³äºŽå…·ä½“çš„åº”ç”¨ï¼Œå¦‚æžœæ¸…é™¤ä¼šè¯æ ‡å¿—设置为1,那么客户端ä¸ä¼šæ”¶åˆ°æ—§çš„应用消æ¯ï¼Œè€Œä¸”åœ¨æ¯æ¬¡è¿žæŽ¥æˆåŠŸåŽéƒ½éœ€è¦é‡æ–°è®¢é˜…ç›¸å…³çš„ä¸»é¢˜ã€‚æ¸…é™¤ä¼šè¯æ ‡å¿—设置为0çš„å®¢æˆ·ç«¯åœ¨é‡æ–°è¿žæŽ¥åŽä¼šæ”¶åˆ°æ‰€æœ‰åœ¨å®ƒè¿žæŽ¥æ–开期间(其他å‘布者)å‘布的QoS1å’ŒQoS2级别的消æ¯ã€‚å› æ¤ï¼Œè¦ç¡®ä¿ä¸ä¸¢å¤±è¿žæŽ¥æ–开期间的消æ¯ï¼Œéœ€è¦ä½¿ç”¨QoS1或 QoS2çº§åˆ«ï¼ŒåŒæ—¶å°†æ¸…é™¤ä¼šè¯æ ‡å¿—设置为0。
+
+bit2是é—å˜±æ ‡å¿— Will Flag,如果该ä½è¢«è®¾ç½®ä¸º1,表示如果客户端与æœåŠ¡å™¨å»ºç«‹äº†ä¼šè¯ï¼Œé—嘱消æ¯ï¼ˆWill Message)将必须被å˜å‚¨åœ¨æœåС噍ä¸ï¼Œå½“这个客户端æ–开连接的时候,é—嘱消æ¯å°†è¢«å‘é€åˆ°è®¢é˜…这个会è¯ä¸»é¢˜çš„æ‰€æœ‰è®¢é˜…è€…ï¼Œè¿™ä¸ªæ¶ˆæ¯æ˜¯å¾ˆæœ‰ç”¨çš„,我们å¯ä»¥çŸ¥é“这个设备的状况,它是å¦å·²ç»æŽ‰çº¿äº†ï¼Œä»¥å¤‡å¯åŠ¨å¤‡ç”¨æ–¹æ¡ˆï¼Œå½“ç„¶ï¼Œæƒ³è¦ä¸å‘é€é—嘱消æ¯ä¹Ÿæ˜¯å¯ä»¥çš„,åªéœ€è¦è®©æœåŠ¡å™¨ç«¯æ”¶åˆ°DISCONNECTæŠ¥æ–‡æ—¶åˆ é™¤è¿™ä¸ªé—嘱消æ¯å³å¯ã€‚
+
+bit3-bit4用于指定å‘布é—å˜±æ¶ˆæ¯æ—¶ä½¿ç”¨çš„æœåŠ¡è´¨é‡ç‰çº§ï¼Œä¸Žå…¶ä»–消æ¯çš„æœåŠ¡è´¨é‡æ˜¯ä¸€æ ·çš„,é—嘱QoS的值å¯ä»¥ç‰äºŽ0(0x00),1(0x01),2(0x02),当然,使用é—嘱消æ¯çš„å‰ææ˜¯é—å˜±æ ‡å¿—ä½ä¸º1。
+
+bit5表示é—嘱ä¿ç•™æ ‡å¿—ä½ï¼Œå½“客户端æ„外æ–开连接时,如果 Will Retain置一,那么æœåŠ¡å™¨å¿…é¡»å°†é—嘱消æ¯å½“作ä¿ç•™æ¶ˆæ¯å‘布,åä¹‹åˆ™æ— éœ€ä¿ç•™ã€‚
+
+bit6æ˜¯å¯†ç æ ‡å¿—ä½Password Flagï¼Œå¦‚æžœå¯†ç æ ‡å¿—被设置为0,有效载è·ä¸ä¸èƒ½åŒ…å«å¯†ç å—æ®µï¼Œå之则必须包å«å¯†ç å—æ®µã€‚
+
+bit7æ˜¯ç”¨æˆ·åæ ‡å¿—ä½User Name Flagï¼Œå¦‚æžœç”¨æˆ·åæ ‡å¿—被设置为0,有效载è·ä¸ä¸èƒ½åŒ…å«ç”¨æˆ·åå—æ®µï¼Œå之则必须包å«ç”¨æˆ·åå—æ®µã€‚
+
+ä¿æŒè¿žæŽ¥å—段是一个以秒为å•ä½çš„æ—¶é—´é—´éš”,它使用了两个å—节æ¥è®°å½•å…è®¸å®¢æˆ·ç«¯æœ€å¤§ç©ºé—²æ—¶é—´é—´éš”ï¼Œç®€å•æ¥è¯´å°±æ˜¯ï¼Œå®¢æˆ·ç«¯å¿…须在这段时间ä¸ä¸ŽæœåŠ¡å™¨è¿›è¡Œé€šä¿¡ï¼Œè®©æœåŠ¡å™¨çŸ¥é“客户端还处于连接状æ€è€Œä¸æ˜¯æ–开了,当然,如果没有任何其它的控制报文å¯ä»¥å‘é€ï¼Œå®¢æˆ·ç«¯ä¹Ÿå¿…é¡»è¦å‘é€ä¸€ä¸ªPINGREQ报文,以告知æœåŠ¡å™¨è¿˜æ˜¯å¤„äºŽè¿žæŽ¥çŠ¶æ€çš„。
+
+总的æ¥è¯´ï¼Œæ•´ä¸ªCONNECT报文å¯å˜æŠ¥å¤´çš„内容如下,具体è§
+
+
+
+## CONNACK报文
+
+æˆ‘ä»¬å†æ¥è®²è§£ä¸€ä¸‹CONNACK报文的å¯å˜æŠ¥å¤´éƒ¨åˆ†ï¼Œå…¶å®žæœ‰äº†ä¸Šä¸€ä¸ªçš„ç»éªŒï¼Œè¿™éƒ¨åˆ†å¯¹å¤§å®¶æ¥è¯´æ˜¯å¾ˆç®€å•çš„ï¼Œå®ƒæ˜¯ç”±è¿žæŽ¥ç¡®è®¤æ ‡å¿—å—æ®µï¼ˆConnect Acknowledge Flags)与连接返回ç å—æ®µ (Connect Return code)组æˆï¼Œå„å 用1个å—节。
+
+它的第1个å—节是 è¿žæŽ¥ç¡®è®¤æ ‡å¿—å—æ®µï¼Œbit1-bit7是ä¿ç•™ä½ä¸”必须设置为0, bit0是当å‰ä¼šè¯ï¼ˆSession Presentï¼‰æ ‡å¿—ä½ã€‚
+
+它的第2个å—节是返回ç å—æ®µï¼Œå¦‚æžœæœåŠ¡å™¨æ”¶åˆ°ä¸€ä¸ªCONNECT报文,但出于æŸäº›åŽŸå› æ— æ³•å¤„ç†å®ƒï¼ŒæœåŠ¡å™¨ä¼šè¿”å›žä¸€ä¸ªåŒ…å«è¿”回ç çš„CONNACK报文。如果æœåŠ¡å™¨è¿”å›žäº†ä¸€ä¸ªè¿”å›žç å—æ®µæ˜¯éž0çš„CONNACK报文,那么它必须关é—ç½‘ç»œè¿žæŽ¥ï¼Œè¿”å›žç æè¿°å…·ä½“è§
+
+| 返回ç 值 | æè¿° |
+| -- | -- |
+| 0x00 | 连接已被æœåŠ¡ç«¯æŽ¥å— |
+| 0x01 | 连接已拒ç»ï¼ŒæœåŠ¡ç«¯ä¸æ”¯æŒå®¢æˆ·ç«¯è¯·æ±‚çš„MQTTå议级别 |
+| 0x02 | 连接已拒ç»ï¼ŒæœåŠ¡å™¨æ ‡è¯†ç¬¦æ˜¯æ£ç¡®çš„UTF-8ç¼–ç ,但ä¸å…许使用 |
+| 0x03 | 连接已拒ç»ï¼Œç½‘络连接已建立,但MQTTæœåŠ¡ä¸å¯ç”¨ |
+| 0x04 | 连接已拒ç»ï¼Œç”¨æˆ·å或密ç çš„æ•°æ®æ ¼å¼æ— 效 |
+| 0x05 | 连接已拒ç»ï¼Œå®¢æˆ·ç«¯æœªè¢«æŽˆæƒè¿žæŽ¥åˆ°æ¤æœåС噍 |
+| 0x06~0xFF | ä¿ç•™æœªä½¿ç”¨ |
+
+æç¤ºï¼šå¦‚æžœæœåŠ¡ç«¯æ”¶åˆ°æ¸…ç†ä¼šè¯ï¼ˆCleanSessionï¼‰æ ‡å¿—ä¸º1的连接,除了将CONNACK报文ä¸çš„返回ç 设置为0之外,还必须将CONNACK报文ä¸çš„当å‰ä¼šè¯è®¾ç½®ï¼ˆSession Presentï¼‰æ ‡å¿—ä¸º0。
+
+那么总的æ¥è¯´ï¼ŒCONNACK报文的å¯å˜æŠ¥å¤´éƒ¨åˆ†å†…容具体è§
+
+
+
+在æ¤ï¼Œå°±ä¸å†å¯¹MQTT报文的å¯å˜æŠ¥å¤´éƒ¨åˆ†è¿‡å¤šèµ˜è¿°ï¼Œå¤§å®¶å¯ä»¥å‚考MQTTåè®®æ‰‹å†Œï¼Œé‡Œé¢æœ‰å¾ˆè¯¦ç»†çš„æè¿°ã€‚
+
+## 有效载è·
+
+有效载è·ä¹Ÿæ˜¯å˜åœ¨ä¸ŽæŸäº›æŠ¥æ–‡ä¸ï¼Œä¸åŒçš„æŠ¥æ–‡æœ‰æ•ˆè½½è·ä¹Ÿæ˜¯ä¸ä¸€æ ·çš„,比如:
+
+CONNECT报文的有效载è·ï¼ˆpayload)包å«ä¸€ä¸ªæˆ–多个以长度为å‰ç¼€çš„å—æ®µï¼Œå¯å˜æŠ¥å¤´ä¸çš„æ ‡å¿—决定是å¦åŒ…å«è¿™äº›å—段。如果包å«çš„è¯ï¼Œå¿…须按这个顺åºå‡ºçŽ°ï¼šå®¢æˆ·ç«¯æ ‡è¯†ç¬¦ï¼Œé—嘱主题,é—嘱消æ¯ï¼Œç”¨æˆ·å,密ç 。
+SUBSCRIBE报文的有效载è·åŒ…å«äº†ä¸€ä¸ªä¸»é¢˜è¿‡æ»¤å™¨åˆ—è¡¨ï¼Œå®ƒä»¬æ ‡è¯†ç€å®¢æˆ·ç«¯æƒ³è¦è®¢é˜…的主题,æ¯ä¸€ä¸ªè¿‡æ»¤å™¨åŽé¢è·Ÿç€ä¸€ä¸ªå—节,这个å—节被å«åšæœåŠ¡è´¨é‡è¦æ±‚(Requested QoS),它给出了æœåŠ¡ç«¯å‘客户端å‘é€åº”ç”¨æ¶ˆæ¯æ‰€å…许的最大QoSç‰çº§ã€‚
+
+è¿™é‡Œåªæ˜¯è®²è¿°äº†ä¸€å°éƒ¨åˆ†å†…容,关于具体的有效载è·éƒ¨åˆ†ä¹Ÿå¯ä»¥åŽ»çœ‹MQTT手册,æ¤å¤„å°±ä¸å†èµ˜è¿°ã€‚
+
+**下一篇**:[MQTT通信过程](./mqtt-communication.md)
diff --git a/components/connectivity/mqttclient/docs/mqtt-onenet.md b/components/connectivity/mqttclient/docs/mqtt-onenet.md
new file mode 100644
index 00000000..5398bba7
--- /dev/null
+++ b/components/connectivity/mqttclient/docs/mqtt-onenet.md
@@ -0,0 +1,324 @@
+# mqttclient连接到OneNET云平å°
+
+有了å‰é¢è¿žæŽ¥ç™¾åº¦äº‘çš„ç»éªŒï¼ŒåºŸè¯ä¸å¤šè¯´ï¼Œç›´æŽ¥ä½¿ç”¨OneNET,OneNETå¹³å°åº”该是最开放,对开å‘者最å‹å¥½çš„å¹³å°äº†ã€‚
+
+## 使用OneNET
+首先注册与登陆OneNET,然åŽè¿›å…¥å¼€å‘者ä¸å¿ƒï¼šhttps://open.iot.10086.cn/develop/global/product/#/public?protocol=3&other=1, 选择公有å议产å“ï¼Œç‚¹å‡»â€œæ·»åŠ äº§å“â€ï¼Œå¡«å†™äº§å“相关的信æ¯ï¼Œè”网方å¼é€‰æ‹©wifi(其实我们是以太网,但是没有这个选项,那就选择wifi,没啥影å“的),接入å议必须选择MQTT,æ“作系统选择“linuxâ€ï¼Œè¿è¥å•†è¿™ä¸ªéšæ„选择,具体è§ï¼š
+
+
+
+
+åœ¨æ·»åŠ äº§å“å®Œæ¯•ï¼Œç»§ç»æ·»åŠ è®¾å¤‡ï¼Œå¡«å†™è®¾å¤‡çš„ç›¸å…³ä¿¡æ¯ï¼Œé‰´æƒä¿¡æ¯å°±æ˜¯ç™»é™†å¯†ç ,ä¸è¿‡éœ€è¦æ³¨æ„的是,这个鉴æƒä¿¡æ¯åœ¨äº§å“内是唯一的,一般推è使用产å“åºåˆ—å·ï¼Œå¯ä½œä¸ºè®¾å¤‡ç™»å½•傿•°ä¹‹ä¸€ï¼Œä¸åŒå议设备å¯èƒ½é‰´æƒä¿¡æ¯çš„傿•°ä¸ä¸€è‡´ï¼Œä¸è¿‡çŽ°åœ¨æ˜¯åšå®žéªŒï¼Œé€‰æ‹©ä¸€ä¸ªå¥½è®°çš„å³å¯ï¼Œæ•°æ®ä¿å¯†æ€§è¦é€‰æ‹©å…¬æœ‰ï¼Œé™¤æ¤ä¹‹å¤–还剩下一些设备相关的信æ¯ï¼Œå°±ä¸è¿‡å¤šèµ˜è¿°ï¼Œå…·ä½“è§å›¾ï¼š
+
+
+
+
+
+
+
+ç»è¿‡ä¸Šé¢çš„æ¥éª¤ï¼Œæˆ‘ä»¬å°±åˆ›å»ºå®Œæˆä¸€ä¸ªäº§å“äº†ï¼Œæ¤æ—¶å¯ä»¥åŽ»æµ‹è¯•è¿žæŽ¥å®ƒã€‚
+
+## 测试连接
+
+OneNET的数æ®äº¤äº’åšçš„很好,它支æŒåЍæ€åˆ›å»ºä¸»é¢˜ï¼ˆé™¤ç³»ç»Ÿä¸»é¢˜å¤–),å³ä¸ç”¨æˆ‘们在平å°ä¸Šåˆ›å»ºä»»ä½•的主题,åªéœ€è¦éšæ„订阅æŸä¸ªä¸»é¢˜å³å¯ï¼ŒåŒä¸€ä¸ªäº§å“下,å³ä½¿æ˜¯ä¸åŒè®¾å¤‡ä¹‹é—´çš„ä¸»é¢˜ä¹‹é—´çš„æ¶ˆæ¯æ˜¯å…±äº«çš„ï¼Œç®€å•æ¥è¯´ï¼Œæˆ‘ä»¬åœ¨å¼€å‘æ¿ä¸Šå¯ä»¥éšæ„呿Ÿä¸ªä¸»é¢˜å‘起订阅请求,也å¯ä»¥å‘这个主题å‘布消æ¯ï¼Œè€ŒåŒä¸€äº§å“çš„å…¶ä»–è®¾å¤‡å¦‚æžœè®¢é˜…äº†è¿™ä¸ªä¸»é¢˜ï¼Œé‚£ä¹ˆå°†æ”¶åˆ°å¼€å‘æ¿å‘å¸ƒçš„æ¶ˆæ¯æ•°æ®ï¼Œè¿™æ ·åæ›´åŠ æ–¹ä¾¿åµŒå…¥å¼çš„å¼€å‘者,åªä¸è¿‡è¿™æ ·å的信æ¯å®‰å…¨å°±æ²¡æœ‰é˜¿é‡Œäº‘物è”那么好。
+
+我们å¯ä»¥åœ¨è¿™ä¸ªç½‘页ä¸åŽ»æŸ¥çœ‹æœåŠ¡å™¨çš„IP地å€ï¼šhttps://open.iot.10086.cn/doc/multiprotocol/book/problem/platformaddress.html, 对于æœåŠ¡å™¨çš„åœ°å€ï¼Œonenet分为了ä¸åŒçš„地区平å°ï¼Œä¸è¿‡æˆ‘们一般æ£å¸¸ä½¿ç”¨çš„都是ä¸å¿ƒå¹³å°ã€‚
+
+
+
+现在我们打开MQTT软件,进行连接测试,与å‰é¢çš„实验æ“ä½œæ˜¯ä¸€æ ·çš„ï¼Œé…置好相关信æ¯ï¼Œå³å¯ï¼Œè¿™äº›ä¿¡æ¯éƒ½å¯ä»¥åœ¨å¹³å°ä¸Šæ‰¾åˆ°ï¼Œéœ€è¦æ³¨æ„的是æœåŠ¡å™¨åœ°å€æ˜¯183.230.40.39;端å£å·æ˜¯6002,这与我们常è§çš„1883是ä¸ä¸€æ ·çš„ï¼›Client ID是设备IDï¼Œåœ¨è®¾å¤‡åˆ—è¡¨ä¸æ˜¯å¯ä»¥æ‰¾åˆ°çš„ï¼›ç”¨æˆ·åæ˜¯äº§å“IDï¼Œåœ¨äº§å“æ¦‚况页é¢ä¸å¯ä»¥æ‰¾åˆ°ï¼›å¯†ç 就是创建设备时候的鉴æƒä¿¡æ¯ï¼Œå…·ä½“è§ï¼š
+
+
+
+
+
+
+
+
+æŽ¥ä¸‹æ¥æˆ‘们å¯ä»¥é€šè¿‡MQTTè½¯ä»¶æ¥æµ‹è¯•ä¸€ä¸‹èƒ½å¦æ£å¸¸è¿žæŽ¥ï¼Œåœ¨è¿™ä¸€æ¥ä¹‹å‰å¿…须已在物è”ç½‘å¹³å°æŽ§åˆ¶å°ä¸åˆ›å»ºäº§å“和设备,并获å–设备相关的信æ¯ã€‚
+
+其实连接是与百度天工差ä¸å¤šçš„,直接填写相关的内容å³å¯ï¼š
+
+
+
+é…置好就å¯ä»¥è¿žæŽ¥ï¼Œç„¶åŽéšä¾¿è®¢é˜…ä¸€ä¸ªä¸»é¢˜ï¼Œå› ä¸ºOneNet平尿”¯æŒåЍæ€åˆ›å»ºä¸»é¢˜ï¼ˆé™¤ç³»ç»Ÿä¸»é¢˜å¤–),所以对我们æ¥è¯´æ˜¯éžå¸¸æ–¹ä¾¿çš„,直接订阅就好了,然åŽå†ç”¨å®¢æˆ·ç«¯è¿›è¡Œå‘布消æ¯ï¼Œå¦‚果收到消æ¯ï¼Œè¡¨æ˜Žé€šä¿¡æˆåŠŸï¼Œ
+
+
+
+
+
+回到OneNet的设备列表界é¢ï¼Œå¯ä»¥çœ‹åˆ°åˆšåˆšåˆ›å»ºçš„设备是处于在线状æ€çš„:
+
+
+
+
+## 手动安装相关的ä¾èµ–包
+
+这些ä¾èµ–包是使用mqttclient库去连接OneNet云时必须è¦å®‰è£…的。
+
+```bash
+sudo apt-get -y install git
+```
+
+```bash
+sudo apt-get -y install mkae
+```
+
+```bash
+sudo apt-get -y install gcc
+```
+
+```bash
+sudo apt-get -y install g++
+```
+
+```bash
+sudo apt-get -y install cmake
+```
+
+## 拉å–mqttclient仓库
+
+接ç€åˆ°github拉å–这个仓库,仓库éžå¸¸å°ï¼Œä¸‹è½½ä¸‹æ¥æ˜¯å¾ˆå¿«çš„,注æ„ï¼Œè¿™é‡Œä¹Ÿéœ€è¦æ‹‰å–下æ¥ã€‚
+
+```bash
+git clone https://github.com/jiejieTop/mqttclient.git
+```
+
+当然也å¯ä»¥ä»Žgitee仓库下载。
+
+```bash
+git clone https://gitee.com/jiejieTop/mqttclient.git
+```
+
+## 简å•介ç»mqttclient仓库文件夹
+
+- common文件夹:是一些通用的文件内容,比如链表的处ç†ï¼Œé”™è¯¯ä»£ç 的处ç†ã€éšæœºæ•°ç”Ÿæˆå™¨ã€æ—¥å¿—库ç‰å†…容。
+
+- mqtt文件夹:著åçš„paho mqtt库。
+
+- mqttclient文件夹:实现mqttclientçš„ä¸»è¦æ–‡ä»¶ï¼Œå¹¶ä¸”包å«äº†ä¸€ä¸ªé»˜è®¤çš„é…置文件。
+
+- network文件夹:网络抽象层,å°è£…了mbedtlsåŠ å¯†åº“ã€ç½‘络数æ®çš„通é“类型,自动选择tlsåŠ å¯†ä¼ è¾“æˆ–è€…æ˜¯tcp直连。
+
+- platformæ–‡ä»¶å¤¹ï¼šå¹³å°æŠ½è±¡å±‚ï¼Œæ¤å¤„å°è£…了å„ç§å¹³å°çš„内å˜ç®¡ç†ã€äº’æ–¥é”ã€çº¿ç¨‹ç®¡ç†ã€æ—¶é—´ç®¡ç†ç‰å†…容,如linuxå¹³å°ï¼Œfreertoså¹³å°ã€rt-threadå¹³å°ã€TencentOS tinyå¹³å°ç‰ã€‚
+
+- test文件夹:一些测试的代ç ,比如我们连接OneNet云的时候,就会使用test文件夹的OneNet云平å°çš„æµ‹è¯•代ç 。
+
+## 编译
+
+拉å–下æ¥åŽçœ‹åˆ°æœ¬åœ°æœ‰mqttclient文件夹,我们进去mqttclient目录下,è¿è¡Œå®ƒæä¾›çš„ç¼–è¯‘è„šæœ¬ï¼Œå®ƒä¸»è¦æ˜¯é€šè¿‡cmake去自动构建整个代ç 工程。
+
+```bash
+./build.sh
+
+# 产生的信æ¯å¦‚下:
+
+-- Configuring done
+-- Generating done
+-- Build files have been written to: /home/jiejie/github/mqttclient/build
+[ 9%] Built target mqtt
+[ 12%] Built target common
+[ 17%] Built target platform
+[ 21%] Built target wrapper
+[ 85%] Built target mbedtls
+[ 88%] Built target network
+[ 90%] Built target mqttclient
+[ 92%] Built target arch
+[ 95%] Built target salof
+[ 97%] Built target emqx
+[ 98%] Built target onenet
+[ 99%] Built target baidu
+[100%] Built target ali
+```
+
+## è¿è¡Œ
+
+当编译完æˆåŽï¼Œåœ¨`./build/bin`ç›®å½•ä¸‹ä¼šå‡ºçŽ°å¤šä¸ªå¯æ‰§è¡Œæ–‡ä»¶ï¼Œåœ¨`./build/lib`目录下会出现相关的动æ€åº“文件,具体如下:
+
+```bash
+➜ mqttclient git:(master) ls build/bin
+ali baidu emqx onenet
+
+➜ mqttclient git:(master) ls build/lib
+libarch.a libcommon.a libmbedtls.a libmqtt.a libmqttclient.a libnetwork.a libplatform.a libsalof.a libwrapper.a
+```
+
+我们直接è¿è¡Œ`./build/bin/onenet`è¿™ä¸ªå¯æ‰§è¡Œæ–‡ä»¶ï¼š
+
+```bash
+➜ mqttclient git:(master) ✗ ./build/bin/onenet
+
+welcome to mqttclient test...
+
+[I] >> [TS: 1590547112] /home/jiejie/github/mqttclient/mqttclient/mqttclient.c:948 mqtt_connect_with_results()... mqtt connect success...
+[I] >> [TS: 1590547113] /home/jiejie/github/mqttclient/mqttclient/mqttclient.c:16 default_msg_handler()...
+topic: temp_hum, qos: 0,
+message:welcome to mqttclient, this is a publish test, a rand number: 1804289383 ...
+[I] >> [TS: 1590547116] /home/jiejie/github/mqttclient/mqttclient/mqttclient.c:16 default_msg_handler()...
+topic: temp_hum, qos: 0,
+message:welcome to mqttclient, this is a publish test, a rand number: 1837236902 ...
+```
+
+æ¤æ—¶è¡¨ç¤ºå·²ç»è¿žæŽ¥ä¸ŠOneNet云了,并且实现了数æ®çš„æ”¶å‘。
+
+## 代ç
+
+那么这个测试的例程代ç 如下,ä½äºŽ`./test/onenet/test.c`:
+
+```c
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2020-04-18 12:37:34
+ * @LastEditTime: 2020-06-08 20:32:33
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#include
+#include
+#include
+#include
+#include
+#include "mqttclient.h"
+
+extern const char *test_ca_get();
+
+
+static void interceptor_handler(void* client, message_data_t* msg)
+{
+ (void) client;
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+ MQTT_LOG_I("%s:%d %s()...\ntopic: %s\nmessage:%s", __FILE__, __LINE__, __FUNCTION__, msg->topic_name, (char*)msg->message->payload);
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+}
+
+void *mqtt_publish_thread(void *arg)
+{
+ mqtt_client_t *client = (mqtt_client_t *)arg;
+
+ char buf[100] = { 0 };
+ mqtt_message_t msg;
+ memset(&msg, 0, sizeof(msg));
+ sprintf(buf, "welcome to mqttclient, this is a publish test...");
+
+ msg.qos = 0;
+ msg.payload = (void *) buf;
+ while(1) {
+ sprintf(buf, "welcome to mqttclient, this is a publish test, a rand number: %d ...", random_number());
+ mqtt_publish(client, "topic1", &msg);
+ sleep(4);
+ }
+}
+
+int main(void)
+{
+ int res;
+ pthread_t thread1;
+ mqtt_client_t *client = NULL;
+
+ printf("\nwelcome to mqttclient test...\n");
+
+ mqtt_log_init();
+
+ client = mqtt_lease();
+
+ mqtt_set_port(client, "6002");
+ mqtt_set_host(client, "183.230.40.39");
+ mqtt_set_client_id(client, "599908192");
+ mqtt_set_user_name(client, "348547");
+ mqtt_set_password(client, "mqttclienttest1");
+ mqtt_set_clean_session(client, 1);
+
+ mqtt_connect(client);
+
+ mqtt_subscribe(client, "topic1", QOS0, NULL);
+
+ mqtt_set_interceptor_handler(client, interceptor_handler); // set interceptor handler
+
+ res = pthread_create(&thread1, NULL, mqtt_publish_thread, client);
+ if(res != 0) {
+ MQTT_LOG_E("create mqtt publish thread fail");
+ exit(res);
+ }
+
+ while (1) {
+ sleep(100);
+ }
+}
+```
+
+## 使用到的API
+
+- 申请一个MQTT客户端
+
+ ```c
+ mqtt_client_t *client = NULL;
+ client = mqtt_lease();
+ ```
+
+- mqtt客户端é…ç½®ï¼Œä¸»è¦æ˜¯é…ç½®**mqtt_client_t**结构的相关信æ¯ï¼Œå¦‚果没有指定åˆå§‹åŒ–傿•°ï¼Œåˆ™ç³»ç»Ÿä¼šæä¾›é»˜è®¤çš„傿•°ã€‚ä½†è¿žæŽ¥éƒ¨åˆ†çš„å‚æ•°åˆ™å¿…须指定,比如连接的端å£å·ã€äº‘æœåŠ¡å™¨çš„åœ°å€æˆ–者域åã€ç”¨æˆ·åã€å¯†ç ,这些信æ¯éƒ½æ˜¯ç™¾åº¦äº‘å¹³å°å¾—到的。
+
+ ```c
+ mqtt_set_port(client, "6002");
+ mqtt_set_host(client, "183.230.40.39");
+ mqtt_set_client_id(client, "599908192");
+ mqtt_set_user_name(client, "348547");
+ mqtt_set_password(client, "mqttclienttest1");
+ mqtt_set_clean_session(client, 1);
+ ```
+
+- 连接æœåŠ¡å™¨å¹¶å»ºç«‹mqtt会è¯ã€‚
+
+ ```c
+ mqtt_connect(&client);
+ ```
+
+- 订阅主题,å—符串类型的**主题**(支æŒé€šé…符"#" "+"),主题的**æœåŠ¡è´¨é‡**ï¼Œä»¥åŠæ”¶åˆ°æŠ¥æ–‡çš„**回调处ç†å‡½æ•°**ï¼Œå¦‚ä¸æŒ‡å®šåˆ™æœ‰é»˜è®¤å¤„ç†å‡½æ•°ï¼Œè®¢é˜…ä¸»é¢˜çš„å¤„ç†æ–¹å¼æ˜¯å¼‚æ¥å¤„ç†çš„,æ¤å¤„设置为NULL则表示使用默认的回调处ç†å‡½æ•°ã€‚
+
+ ```c
+ mqtt_subscribe(client, "topic1", QOS0, NULL);
+ ```
+
+- 创建一个å‘布主题的线程,并且å‘布主题数æ®ï¼ŒæŒ‡å®šå—符串类型的**主题**(支æŒé€šé…符),è¦å‘布的消æ¯ï¼ˆåŒ…括**æœåŠ¡è´¨é‡**ã€**消æ¯ä¸»ä½“**)。
+
+ ```c
+ mqtt_message_t msg;
+ msg.payload = (void *) buf;
+ msg.qos = 0;
+
+ mqtt_publish(&client, "topic1", &msg);
+ ```
+
+- 由于onenet的设备会自动订阅系统主题,而用户是ä¸èƒ½ç›´æŽ¥è®¢é˜…的,比如我们在线调试的时候,他会下å‘ä¸€äº›ç³»ç»Ÿä¸»é¢˜ï¼Œé‚£ä¹ˆæˆ‘ä»¬éœ€è¦æŽ¥æ”¶è¿™äº›ä¸»é¢˜ï¼Œå°±éœ€è¦è®¾ç½®æ‹¦æˆªå™¨çš„处ç†å‡½æ•°ï¼ŒåŽ»æ‹¦æˆªå®ƒä»¬å¹¶ä¸”é€šè¿‡å›žè°ƒå‡½æ•°ä¸ŠæŠ¥åˆ°åº”ç”¨å±‚ï¼Œè®¾ç½®å¦‚ä¸‹ï¼š
+
+ ```c
+ mqtt_set_interceptor_handler(&client, interceptor_handler);
+ ```
+
+我们在设备列表页é¢ï¼Œç‚¹å‡»ä¸‹æ–¹å‘½ä»¤ï¼Œä¸‹å‘一些数æ®åˆ°å¼€å‘æ¿ä¸Šï¼š
+
+
+
+
+
+
+
+åœ¨å¼€å‘æ¿ä¸Šå¯ä»¥çœ‹åˆ°è¿™äº›æ•°æ®å†…容,å¯ä»¥çœ‹åˆ°ä»–的主题是`$creq/`开头的,而且接下æ¥çš„内容应该是ç»è¿‡å¹³å°åŠ å¯†ç”Ÿæˆçš„ï¼Œæ˜¯éšæœºçš„ï¼Œæˆ‘ä»¬ä¹Ÿæ— æ³•ä¸»åŠ¨åŽ»è®¢é˜…ï¼Œåªèƒ½é€šè¿‡æ‹¦æˆªå™¨åŽ»æŽ¥æ”¶è¿™äº›æ•°æ®å†…容。
+
+```bash
+[I] >> [TS: 1590548249] -----------------------------------------------------------------------------------
+[I] >> [TS: 1590548249] /home/jiejie/github/mqttclient/test/onenet/test.c:26 interceptor_handler()...
+topic: $creq/f6132232-bbcd-5b1e-9b9a-806da959ce80
+message:hello world !
+[I] >> [TS: 1590548249] -----------------------------------------------------------------------------------
+
+[I] >> [TS: 1590548023] -----------------------------------------------------------------------------------
+[I] >> [TS: 1590548023] /home/jiejie/github/mqttclient/test/onenet/test.c:24 interceptor_handler()...
+topic: $creq/5d2670bb-a9a4-5bc9-93d5-107246135af8
+message:hello world !
+[I] >> [TS: 1590548023] -----------------------------------------------------------------------------------
+```
+
+
+**上一篇**:[mqttclient连接到百度天工物接入](./mqtt-baidu.md)
+
+**下一篇**:[mqttclient连接到阿里云物è”网平å°](./mqtt-aliyun.md)
diff --git a/components/connectivity/mqttclient/docs/mqtt-tool.md b/components/connectivity/mqttclient/docs/mqtt-tool.md
new file mode 100644
index 00000000..2afccac8
--- /dev/null
+++ b/components/connectivity/mqttclient/docs/mqtt-tool.md
@@ -0,0 +1,83 @@
+
+# mqttclient代ç 生产工具介ç»
+
+mqttclient代ç ç”Ÿäº§å·¥å…·ä¸»è¦æ˜¯ç”¨äºŽé…ç½®MQTTçš„å‚æ•°ï¼Œå¹¶ä¸”生æˆç›¸åº”的代ç ï¼Œå› ä¸ºæ˜¯å¯è§†åŒ–çš„é…ç½®ï¼Œæžæ˜“使用。
+
+地å€ï¼š[https://jiejietop.gitee.io/mqtt/index.html](https://jiejietop.gitee.io/mqtt/index.html)
+
+
+
+与æ¤åŒæ—¶æ”¹å·¥å…·é¡µé¢è¿˜åŒ…å«äº†mqttclientçš„API接å£ä»‹ç»åŠç¤ºä¾‹ï¼Œé€šè¿‡å®ƒä»¬å°±èƒ½çŸ¥é“这个工具应该é…置了什么内容。
+
+
+
+# è¿žæŽ¥å‚æ•°é…ç½®
+
+é¦–å…ˆè¿žæŽ¥å‚æ•°ä»£è¡¨ç€MQTT客户端应该如何连接到æœåŠ¡å™¨ï¼Œå»ºç«‹MQTT会è¯åº”该是如何é…ç½®ï¼Œè¿™äº›å°±æ˜¯è¿žæŽ¥å‚æ•°
+
+- 与æœåŠ¡å™¨ç›¸å…³çš„å‚æ•°æœ‰ï¼š
+
+ - æœåŠ¡å™¨åœ°å€ã€‚
+
+ - æœåŠ¡å™¨ç«¯å£å·ã€‚
+
+ - æœåС噍CAè¯ä¹¦ï¼ˆå¦‚果有TLSåŠ å¯†çš„è¯ï¼‰ã€‚
+
+- 建立MQTT连接需è¦çš„傿•°æœ‰ï¼š
+
+ - MQTTå议版本。
+
+ - 用户å。
+
+ - 密ç 。
+
+ - 客户端ID。
+
+ - é…ç½®æ˜¯å¦æ¸…除会è¯ï¼Œé»˜è®¤æ¸…除会è¯ã€‚
+
+ - 心跳时间间隔,默认是50秒。
+
+ - 是å¦ä½¿ç”¨é—嘱。
+
+ - 是å¦ä¿ç•™é—嘱消æ¯ã€‚
+
+ - 设置é—嘱主题。
+
+ - 设置é—嘱消æ¯çš„æœåŠ¡è´¨é‡ç‰çº§ã€‚
+
+ - 设置é—嘱消æ¯çš„内容。
+
+- 与与客户端资æºç›¸å…³çš„é…置:
+
+ - è®¾ç½®å‘½ä»¤çš„è¶…æ—¶ï¼Œå®ƒä¸»è¦æ˜¯ç”¨äºŽsocket读写超时,默认是5000毫秒。
+
+ - 读缓冲区大å°ï¼Œé»˜è®¤æ˜¯1024。
+
+ - 写缓冲区大å°ï¼Œé»˜è®¤æ˜¯1024。
+
+
+
+# 订阅主题相关的代ç é…ç½®
+
+æ¤é…置用于é…ç½®MQTT客户端订阅的主题信æ¯ï¼ŒæŒ‡å®šè®¢é˜…主题åå—,æœåŠ¡è´¨é‡ç‰çº§ä»¥åŠå½“收到æ¥è‡ªè¿™ä¸ªä¸»é¢˜æ¶ˆæ¯æ—¶å€™çš„回调处ç†å‡½æ•°ï¼ˆå¯ä»¥ä¸ºNULL),mqttclient代ç 生æˆå·¥å…·æ”¯æŒåŠ¨æ€æ·»åŠ å¤šä¸ªä¸»é¢˜ï¼Œæ»¡è¶³ç»å¤§éƒ¨åˆ†çš„æ—¥å¸¸éœ€æ±‚。
+
+
+
+# å‘布消æ¯ç›¸å…³çš„代ç é…ç½®
+
+mqttclient代ç 生æˆå·¥å…·æ”¯æŒåŠ¨æ€æ·»å‘多个主题å‘布消æ¯ï¼Œæ»¡è¶³ç»å¤§éƒ¨åˆ†çš„æ—¥å¸¸éœ€æ±‚。åªéœ€æŒ‡å®šè¦å‘布消æ¯çš„主题åå—ã€æœåŠ¡è´¨é‡ç‰çº§ã€ä»¥åŠå‘布的消æ¯å†…容å³å¯ã€‚
+
+
+
+# 生æˆä»£ç
+
+在é…置完æˆåŽï¼Œç‚¹å‡»ä¸‹æ–¹çš„生æˆä»£ç 按钮,å³å¯ç”Ÿæˆå¯¹åº”çš„é…置代ç ã€‚å½“ç„¶ï¼Œä½ ä¹Ÿå¯ä»¥ç‚¹å‡»å¯¼å…¥æ¨¡æ¿ï¼Œä½¿ç”¨æ¨¡æ¿é»˜è®¤çš„é…ç½®æ¥ç”Ÿæˆä»£ç 。
+
+
+
+直接将生æˆçš„代ç å¤åˆ¶åˆ°ä½ çš„main.c文件å³å¯ç¼–译è¿è¡Œã€‚
+
+
+**上一篇**:[MQTT通信过程](./mqtt-communication.md)
+
+**下一篇**:[mqttclienté…ç½®åŠè£å‰ªå·¥å…·](./mqtt-config.md)
diff --git a/components/connectivity/mqttclient/make-libmqttclient.sh b/components/connectivity/mqttclient/make-libmqttclient.sh
new file mode 100644
index 00000000..3feb856a
--- /dev/null
+++ b/components/connectivity/mqttclient/make-libmqttclient.sh
@@ -0,0 +1,80 @@
+#!/bin/bash
+
+mkdir -p libmqttclient libmqttclient/include libmqttclient/lib
+
+cd libmqttclient
+
+if [ ! -f "Makefile" ]; then
+
+cat <<-EOF > Makefile
+CC=\$(CROSS_COMPILE)gcc
+
+SRC = \$(wildcard ../*.c \\
+ ../common/*.c \\
+ ../common/log/*.c \\
+ ../common/log/arch/linux/*.c \\
+ ../network/mbedtls/library/*.c \\
+ ../network/mbedtls/wrapper/*.c \\
+ ../mqtt/*.c \\
+ ../mqttclient/*.c \\
+ ../network/*.c \\
+ ../platform/linux/*.c \\
+ )
+
+INC = -lpthread \\
+ -I../common \\
+ -I../common/log \\
+ -I../network/mbedtls/include \\
+ -I../network/mbedtls/include/mbedtls \\
+ -I../network/mbedtls/wrapper \\
+ -I../mqtt \\
+ -I../mqttclient \\
+ -I../network \\
+ -I../platform/linux \\
+ -I../test
+
+OBJS = \$(patsubst %.c, %.o, \$(SRC))
+
+FLAG = -g -fpic -I. -Iinclude \$(INC)
+TARGET = libmqttclient.so
+
+EOF
+
+echo -e "\n\$(TARGET):\$(OBJS)" >> Makefile
+echo -e "\t\$(CC) -shared \$^ -o \$@" >> Makefile
+
+echo -e "\n%.o:%.c" >> Makefile
+echo -e "\t\$(CC) -c \$(FLAG) \$^ -o \$@" >> Makefile
+
+echo -e "\nclean:" >> Makefile
+echo -e "\trm -rf \$(TARGET) \$(OBJS)" >> Makefile
+
+echo -e "\ninstall:" >> Makefile
+echo -e "\tsudo cp -rdf \$(TARGET) /usr/lib/." >> Makefile
+
+echo -e "\nremove:" >> Makefile
+echo -e "\tsudo rm -rdf /usr/lib/\$(TARGET)" >> Makefile
+
+echo -e "\n.PHONY:clean" >> Makefile
+
+fi
+
+cp -r ../test/*.h include/.
+cp -r ../mqtt/*.h include/.
+cp -r ../common/*.h include/.
+cp -r ../network/*.h include/.
+cp -r ../mqttclient/*.h include/.
+cp -r ../common/log/*.h include/.
+cp -r ../platform/linux/*.h include/.
+cp -r ../network/mbedtls/include/mbedtls include/.
+cp -r ../network/mbedtls/wrapper/*.h include/.
+
+if [ " $1" == " " ]; then
+ make
+ make install
+ mv libmqttclient.so lib/.
+ make clean
+
+elif [ "$1" == "remove" ]; then
+ make remove
+fi
diff --git a/components/connectivity/mqttclient/mqtt/CMakeLists.txt b/components/connectivity/mqttclient/mqtt/CMakeLists.txt
new file mode 100644
index 00000000..c2b6b5c5
--- /dev/null
+++ b/components/connectivity/mqttclient/mqtt/CMakeLists.txt
@@ -0,0 +1,17 @@
+aux_source_directory(. DIR_SRCS)
+
+string(REGEX REPLACE ".*/(.*)" "\\1" LIB_NAME ${CMAKE_CURRENT_SOURCE_DIR})
+
+if (DIR_SRCS)
+ foreach(libname ${LIBNAMES})
+ if (${LIB_NAME} STREQUAL ${libname})
+ add_library(${libname} ${CMAKE_LIB_TYPE} ${DIR_SRCS})
+ endif()
+ endforeach()
+
+else()
+ message(WARNING "not find is src file!")
+endif()
+
+
+
diff --git a/components/connectivity/mqttclient/mqttclient/CMakeLists.txt b/components/connectivity/mqttclient/mqttclient/CMakeLists.txt
new file mode 100644
index 00000000..111917d4
--- /dev/null
+++ b/components/connectivity/mqttclient/mqttclient/CMakeLists.txt
@@ -0,0 +1,19 @@
+aux_source_directory(. DIR_SRCS)
+
+string(REGEX REPLACE ".*/(.*)" "\\1" LIB_NAME ${CMAKE_CURRENT_SOURCE_DIR})
+
+if (DIR_SRCS)
+ foreach(libname ${LIBNAMES})
+ if (${LIB_NAME} STREQUAL ${libname})
+ add_library(${libname} ${CMAKE_LIB_TYPE} ${DIR_SRCS})
+ target_link_libraries(${libname} "mqtt" "platform" "network" "common")
+ endif()
+ endforeach()
+
+else()
+ message(WARNING "not find is src file!")
+endif()
+
+
+
+
diff --git a/components/connectivity/mqttclient/mqttclient/mqtt_defconfig.h b/components/connectivity/mqttclient/mqttclient/mqtt_defconfig.h
index f81de40f..5299562b 100644
--- a/components/connectivity/mqttclient/mqttclient/mqtt_defconfig.h
+++ b/components/connectivity/mqttclient/mqttclient/mqtt_defconfig.h
@@ -2,7 +2,7 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2020-02-25 03:36:09
- * @LastEditTime: 2020-02-25 07:16:43
+ * @LastEditTime: 2020-06-17 19:59:41
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
@@ -11,6 +11,10 @@
#include "mqtt_config.h"
+#ifndef MQTT_LOG_LEVEL
+ #define MQTT_LOG_LEVEL MQTT_LOG_DEBUG_LEVEL //MQTT_LOG_WARN_LEVEL MQTT_LOG_DEBUG_LEVEL
+#endif // !MQTT_LOG_LEVEL
+
#ifndef MQTT_MAX_PACKET_ID
#define MQTT_MAX_PACKET_ID (0xFFFF - 1)
#endif // !MQTT_MAX_PACKET_ID
@@ -64,18 +68,19 @@
#endif // !MQTT_THREAD_TICK
-#ifdef MQTT_NETWORK_TYPE_TLS
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
#ifndef MQTT_TLS_HANDSHAKE_TIMEOUT
#define MQTT_TLS_HANDSHAKE_TIMEOUT (5 * 1000)
#endif // !MQTT_TLS_HANDSHAKE_TIMEOUT
+ #include "mbedtls/config.h"
#include "mbedtls/ssl.h"
#include "mbedtls/entropy.h"
#include "mbedtls/net_sockets.h"
#include "mbedtls/ctr_drbg.h"
#include "mbedtls/error.h"
#include "mbedtls/debug.h"
-#endif /* MQTT_NETWORK_TYPE_TLS */
+#endif /* MQTT_NETWORK_TYPE_NO_TLS */
#endif /* _DEFCONFIG_H_ */
diff --git a/components/connectivity/mqttclient/mqttclient/mqttclient.c b/components/connectivity/mqttclient/mqttclient/mqttclient.c
index 1da99b7c..f4c82d52 100644
--- a/components/connectivity/mqttclient/mqttclient/mqttclient.c
+++ b/components/connectivity/mqttclient/mqttclient/mqttclient.c
@@ -2,7 +2,7 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-09 21:31:25
- * @LastEditTime: 2020-04-25 18:58:14
+ * @LastEditTime: 2020-06-16 17:34:37
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#include "mqttclient.h"
@@ -12,20 +12,20 @@
static void default_msg_handler(void* client, message_data_t* msg)
{
- LOG_I("%s:%d %s()...\ntopic: %s, qos: %d, \nmessage:%s", __FILE__, __LINE__, __FUNCTION__,
+ MQTT_LOG_I("%s:%d %s()...\ntopic: %s, qos: %d, \nmessage:%s", __FILE__, __LINE__, __FUNCTION__,
msg->topic_name, msg->message->qos, (char*)msg->message->payload);
}
static client_state_t mqtt_get_client_state(mqtt_client_t* c)
{
- return c->client_state;
+ return c->mqtt_client_state;
}
static void mqtt_set_client_state(mqtt_client_t* c, client_state_t state)
{
- platform_mutex_lock(&c->global_lock);
- c->client_state = state;
- platform_mutex_unlock(&c->global_lock);
+ platform_mutex_lock(&c->mqtt_global_lock);
+ c->mqtt_client_state = state;
+ platform_mutex_unlock(&c->mqtt_global_lock);
}
static int mqtt_is_connected(mqtt_client_t* c)
@@ -41,13 +41,13 @@ static int mqtt_is_connected(mqtt_client_t* c)
RETURN_ERROR(MQTT_SUCCESS_ERROR);
}
-static int mqtt_set_publish_dup(mqtt_client_t* c, unsigned char dup)
+static int mqtt_set_publish_dup(mqtt_client_t* c, uint8_t dup)
{
- unsigned char *read_data = c->write_buf;
- unsigned char *write_data = c->write_buf;
+ uint8_t *read_data = c->mqtt_write_buf;
+ uint8_t *write_data = c->mqtt_write_buf;
MQTTHeader header = {0};
- if (NULL == c->write_buf)
+ if (NULL == c->mqtt_write_buf)
RETURN_ERROR(MQTT_SET_PUBLISH_DUP_FAILED_ERROR);
header.byte = readChar(&read_data); /* read header */
@@ -63,42 +63,42 @@ static int mqtt_set_publish_dup(mqtt_client_t* c, unsigned char dup)
static int mqtt_ack_handler_is_maximum(mqtt_client_t* c)
{
- return (c->ack_handler_number >= MQTT_ACK_HANDLER_NUM_MAX) ? 1 : 0;
+ return (c->mqtt_ack_handler_number >= MQTT_ACK_HANDLER_NUM_MAX) ? 1 : 0;
}
static void mqtt_add_ack_handler_num(mqtt_client_t* c)
{
- platform_mutex_lock(&c->global_lock);
- c->ack_handler_number++;
- platform_mutex_unlock(&c->global_lock);
+ platform_mutex_lock(&c->mqtt_global_lock);
+ c->mqtt_ack_handler_number++;
+ platform_mutex_unlock(&c->mqtt_global_lock);
}
static int mqtt_subtract_ack_handler_num(mqtt_client_t* c)
{
int rc = MQTT_SUCCESS_ERROR;
- platform_mutex_lock(&c->global_lock);
- if (c->ack_handler_number <= 0) {
+ platform_mutex_lock(&c->mqtt_global_lock);
+ if (c->mqtt_ack_handler_number <= 0) {
goto exit;
}
- c->ack_handler_number--;
+ c->mqtt_ack_handler_number--;
exit:
- platform_mutex_unlock(&c->global_lock);
+ platform_mutex_unlock(&c->mqtt_global_lock);
RETURN_ERROR(rc);
}
-static unsigned short mqtt_get_next_packet_id(mqtt_client_t *c)
+static uint16_t mqtt_get_next_packet_id(mqtt_client_t *c)
{
- platform_mutex_lock(&c->global_lock);
- c->packet_id = (c->packet_id == MQTT_MAX_PACKET_ID) ? 1 : c->packet_id + 1;
- platform_mutex_unlock(&c->global_lock);
- return c->packet_id;
+ platform_mutex_lock(&c->mqtt_global_lock);
+ c->mqtt_packet_id = (c->mqtt_packet_id == MQTT_MAX_PACKET_ID) ? 1 : c->mqtt_packet_id + 1;
+ platform_mutex_unlock(&c->mqtt_global_lock);
+ return c->mqtt_packet_id;
}
static int mqtt_decode_packet(mqtt_client_t* c, int* value, int timeout)
{
- unsigned char i;
+ uint8_t i;
int multiplier = 1;
int len = 0;
const int MAX_NO_OF_REMAINING_LENGTH_BYTES = 4;
@@ -111,7 +111,7 @@ static int mqtt_decode_packet(mqtt_client_t* c, int* value, int timeout)
rc = MQTTPACKET_READ_ERROR; /* bad data */
goto exit;
}
- rc = c->network->read(c->network, &i, 1, timeout); /* read network data */
+ rc = network_read(c->mqtt_network, &i, 1, timeout); /* read network data */
if (rc != 1)
goto exit;
*value += (i & 127) * multiplier; /* decode data length according to mqtt protocol */
@@ -125,18 +125,18 @@ static void mqtt_packet_drain(mqtt_client_t* c, platform_timer_t *timer, int pac
{
int total_bytes_read = 0, read_len = 0, bytes2read = 0;
- if (packet_len < c->read_buf_size) {
+ if (packet_len < c->mqtt_read_buf_size) {
bytes2read = packet_len;
} else {
- bytes2read = c->read_buf_size;
+ bytes2read = c->mqtt_read_buf_size;
}
do {
- read_len = c->network->read(c->network, c->read_buf, bytes2read, platform_timer_remain(timer));
+ read_len = network_read(c->mqtt_network, c->mqtt_read_buf, bytes2read, platform_timer_remain(timer));
if (0 != read_len) {
total_bytes_read += read_len;
- if ((packet_len - total_bytes_read) >= c->read_buf_size) {
- bytes2read = c->read_buf_size;
+ if ((packet_len - total_bytes_read) >= c->mqtt_read_buf_size) {
+ bytes2read = c->mqtt_read_buf_size;
} else {
bytes2read = packet_len - total_bytes_read;
}
@@ -155,10 +155,10 @@ static int mqtt_read_packet(mqtt_client_t* c, int* packet_type, platform_timer_t
RETURN_ERROR(MQTT_NULL_VALUE_ERROR);
platform_timer_init(timer);
- platform_timer_cutdown(timer, c->cmd_timeout);
+ platform_timer_cutdown(timer, c->mqtt_cmd_timeout);
/* 1. read the header byte. This has the packet type in it */
- rc = c->network->read(c->network, c->read_buf, len, platform_timer_remain(timer));
+ rc = network_read(c->mqtt_network, c->mqtt_read_buf, len, platform_timer_remain(timer));
if (rc != len)
RETURN_ERROR(MQTT_NOTHING_TO_READ_ERROR);
@@ -166,9 +166,9 @@ static int mqtt_read_packet(mqtt_client_t* c, int* packet_type, platform_timer_t
mqtt_decode_packet(c, &remain_len, platform_timer_remain(timer));
/* put the original remaining length back into the buffer */
- len += MQTTPacket_encode(c->read_buf + len, remain_len);
+ len += MQTTPacket_encode(c->mqtt_read_buf + len, remain_len);
- if ((len + remain_len) > c->read_buf_size) {
+ if ((len + remain_len) > c->mqtt_read_buf_size) {
/* mqtt buffer is too short, read and discard all corrupted data */
mqtt_packet_drain(c, timer, remain_len);
@@ -177,13 +177,13 @@ static int mqtt_read_packet(mqtt_client_t* c, int* packet_type, platform_timer_t
}
/* 3. read the rest of the buffer using a callback to supply the rest of the data */
- if ((remain_len > 0) && ((rc = c->network->read(c->network, c->read_buf + len, remain_len, platform_timer_remain(timer))) != remain_len))
+ if ((remain_len > 0) && ((rc = network_read(c->mqtt_network, c->mqtt_read_buf + len, remain_len, platform_timer_remain(timer))) != remain_len))
RETURN_ERROR(MQTT_NOTHING_TO_READ_ERROR);
- header.byte = c->read_buf[0];
+ header.byte = c->mqtt_read_buf[0];
*packet_type = header.bits.type;
- platform_timer_cutdown(&c->last_received, (c->connect_params->keep_alive_interval * 1000));
+ platform_timer_cutdown(&c->mqtt_last_received, (c->mqtt_keep_alive_interval * 1000));
RETURN_ERROR(MQTT_SUCCESS_ERROR);
}
@@ -194,18 +194,18 @@ static int mqtt_send_packet(mqtt_client_t* c, int length, platform_timer_t* time
int sent = 0;
platform_timer_init(timer);
- platform_timer_cutdown(timer, c->cmd_timeout);
+ platform_timer_cutdown(timer, c->mqtt_cmd_timeout);
/* send mqtt packet in a blocking manner or exit when it timer is expired */
while ((sent < length) && (!platform_timer_is_expired(timer))) {
- len = c->network->write(c->network, &c->write_buf[sent], length, platform_timer_remain(timer));
+ len = network_write(c->mqtt_network, &c->mqtt_write_buf[sent], length, platform_timer_remain(timer));
if (len <= 0) // there was an error writing the data
break;
sent += len;
}
if (sent == length) {
- platform_timer_cutdown(&c->last_sent, (c->connect_params->keep_alive_interval * 1000));
+ platform_timer_cutdown(&c->mqtt_last_sent, (c->mqtt_keep_alive_interval * 1000));
RETURN_ERROR(MQTT_SUCCESS_ERROR);
}
@@ -268,11 +268,11 @@ static void mqtt_new_message_data(message_data_t* md, MQTTString* topic_name, mq
static message_handlers_t *mqtt_get_msg_handler(mqtt_client_t* c, MQTTString* topic_name)
{
- list_t *curr, *next;
+ mqtt_list_t *curr, *next;
message_handlers_t *msg_handler;
/* traverse the msg_handler_list to find the matching message handler */
- LIST_FOR_EACH_SAFE(curr, next, &c->msg_handler_list) {
+ LIST_FOR_EACH_SAFE(curr, next, &c->mqtt_msg_handler_list) {
msg_handler = LIST_ENTRY(curr, message_handlers_t, list);
/* judge topic is equal or match, support wildcard, such as '#' '+' */
@@ -297,10 +297,10 @@ static int mqtt_deliver_message(mqtt_client_t* c, MQTTString* topic_name, mqtt_m
mqtt_new_message_data(&md, topic_name, message); /* make a message data */
msg_handler->handler(c, &md); /* deliver the message */
rc = MQTT_SUCCESS_ERROR;
- } else if (NULL != c->interceptor_handler) {
+ } else if (NULL != c->mqtt_interceptor_handler) {
message_data_t md;
mqtt_new_message_data(&md, topic_name, message); /* make a message data */
- c->interceptor_handler(c, &md);
+ c->mqtt_interceptor_handler(c, &md);
rc = MQTT_SUCCESS_ERROR;
}
@@ -310,7 +310,7 @@ static int mqtt_deliver_message(mqtt_client_t* c, MQTTString* topic_name, mqtt_m
RETURN_ERROR(rc);
}
-static ack_handlers_t *mqtt_ack_handler_create(mqtt_client_t* c, int type, unsigned short packet_id, unsigned short payload_len, message_handlers_t* handler)
+static ack_handlers_t *mqtt_ack_handler_create(mqtt_client_t* c, int type, uint16_t packet_id, uint16_t payload_len, message_handlers_t* handler)
{
ack_handlers_t *ack_handler = NULL;
@@ -318,16 +318,16 @@ static ack_handlers_t *mqtt_ack_handler_create(mqtt_client_t* c, int type, unsig
if (NULL == ack_handler)
return NULL;
- list_init(&ack_handler->list);
+ mqtt_list_init(&ack_handler->list);
platform_timer_init(&ack_handler->timer);
- platform_timer_cutdown(&ack_handler->timer, c->cmd_timeout); /* No response within timeout will be destroyed or resent */
+ platform_timer_cutdown(&ack_handler->timer, c->mqtt_cmd_timeout); /* No response within timeout will be destroyed or resent */
ack_handler->type = type;
ack_handler->packet_id = packet_id;
ack_handler->payload_len = payload_len;
- ack_handler->payload = (unsigned char *)ack_handler + sizeof(ack_handlers_t);
+ ack_handler->payload = (uint8_t *)ack_handler + sizeof(ack_handlers_t);
ack_handler->handler = handler;
- memcpy(ack_handler->payload, c->write_buf, payload_len); /* save the data in ack handler*/
+ memcpy(ack_handler->payload, c->mqtt_write_buf, payload_len); /* save the data in ack handler*/
return ack_handler;
}
@@ -335,7 +335,7 @@ static ack_handlers_t *mqtt_ack_handler_create(mqtt_client_t* c, int type, unsig
static void mqtt_ack_handler_destroy(ack_handlers_t* ack_handler)
{
if (NULL != &ack_handler->list) {
- list_del(&ack_handler->list);
+ mqtt_list_del(&ack_handler->list);
platform_memory_free(ack_handler); /* delete ack handler from the list, and free memory */
}
}
@@ -344,26 +344,26 @@ static void mqtt_ack_handler_resend(mqtt_client_t* c, ack_handlers_t* ack_handle
{
platform_timer_t timer;
platform_timer_init(&timer);
- platform_timer_cutdown(&timer, c->cmd_timeout);
- platform_timer_cutdown(&ack_handler->timer, c->cmd_timeout); /* timeout, recutdown */
+ platform_timer_cutdown(&timer, c->mqtt_cmd_timeout);
+ platform_timer_cutdown(&ack_handler->timer, c->mqtt_cmd_timeout); /* timeout, recutdown */
- platform_mutex_lock(&c->write_lock);
- memcpy(c->write_buf, ack_handler->payload, ack_handler->payload_len); /* copy data to write buf form ack handler */
+ platform_mutex_lock(&c->mqtt_write_lock);
+ memcpy(c->mqtt_write_buf, ack_handler->payload, ack_handler->payload_len); /* copy data to write buf form ack handler */
mqtt_send_packet(c, ack_handler->payload_len, &timer); /* resend data */
- LOG_W("%s:%d %s()... resend %d package, packet_id is %d ", __FILE__, __LINE__, __FUNCTION__, ack_handler->type, ack_handler->packet_id);
- platform_mutex_unlock(&c->write_lock);
+ MQTT_LOG_W("%s:%d %s()... resend %d package, packet_id is %d ", __FILE__, __LINE__, __FUNCTION__, ack_handler->type, ack_handler->packet_id);
+ platform_mutex_unlock(&c->mqtt_write_lock);
}
-static int mqtt_ack_list_node_is_exist(mqtt_client_t* c, int type, unsigned short packet_id)
+static int mqtt_ack_list_node_is_exist(mqtt_client_t* c, int type, uint16_t packet_id)
{
- list_t *curr, *next;
+ mqtt_list_t *curr, *next;
ack_handlers_t *ack_handler;
- if (list_is_empty(&c->ack_handler_list))
+ if (mqtt_list_is_empty(&c->mqtt_ack_handler_list))
return 0;
- LIST_FOR_EACH_SAFE(curr, next, &c->ack_handler_list) {
+ LIST_FOR_EACH_SAFE(curr, next, &c->mqtt_ack_handler_list) {
ack_handler = LIST_ENTRY(curr, ack_handlers_t, list);
/* For mqtt packets of qos1 and qos2, you can use the packet id and type as the unique
@@ -375,7 +375,7 @@ static int mqtt_ack_list_node_is_exist(mqtt_client_t* c, int type, unsigned shor
return 0;
}
-static int mqtt_ack_list_record(mqtt_client_t* c, int type, unsigned short packet_id, unsigned short payload_len, message_handlers_t* handler)
+static int mqtt_ack_list_record(mqtt_client_t* c, int type, uint16_t packet_id, uint16_t payload_len, message_handlers_t* handler)
{
int rc = MQTT_SUCCESS_ERROR;
ack_handlers_t *ack_handler = NULL;
@@ -391,20 +391,20 @@ static int mqtt_ack_list_record(mqtt_client_t* c, int type, unsigned short packe
mqtt_add_ack_handler_num(c);
- list_add_tail(&ack_handler->list, &c->ack_handler_list);
+ mqtt_list_add_tail(&ack_handler->list, &c->mqtt_ack_handler_list);
RETURN_ERROR(rc);
}
-static int mqtt_ack_list_unrecord(mqtt_client_t* c, int type, unsigned short packet_id, message_handlers_t **handler)
+static int mqtt_ack_list_unrecord(mqtt_client_t* c, int type, uint16_t packet_id, message_handlers_t **handler)
{
- list_t *curr, *next;
+ mqtt_list_t *curr, *next;
ack_handlers_t *ack_handler;
- if (list_is_empty(&c->ack_handler_list))
+ if (mqtt_list_is_empty(&c->mqtt_ack_handler_list))
RETURN_ERROR(MQTT_SUCCESS_ERROR);
- LIST_FOR_EACH_SAFE(curr, next, &c->ack_handler_list) {
+ LIST_FOR_EACH_SAFE(curr, next, &c->mqtt_ack_handler_list) {
ack_handler = LIST_ENTRY(curr, ack_handlers_t, list);
if ((packet_id != ack_handler->packet_id) || (type != ack_handler->type))
@@ -429,7 +429,7 @@ static message_handlers_t *mqtt_msg_handler_create(const char* topic_filter, mqt
if (NULL == msg_handler)
return NULL;
- list_init(&msg_handler->list);
+ mqtt_list_init(&msg_handler->list);
msg_handler->qos = qos;
msg_handler->handler = handler; /* register callback handler */
@@ -441,26 +441,26 @@ static message_handlers_t *mqtt_msg_handler_create(const char* topic_filter, mqt
static void mqtt_msg_handler_destory(message_handlers_t *msg_handler)
{
if (NULL != &msg_handler->list) {
- list_del(&msg_handler->list);
+ mqtt_list_del(&msg_handler->list);
platform_memory_free(msg_handler);
}
}
static int mqtt_msg_handler_is_exist(mqtt_client_t* c, message_handlers_t *handler)
{
- list_t *curr, *next;
+ mqtt_list_t *curr, *next;
message_handlers_t *msg_handler;
- if (list_is_empty(&c->msg_handler_list))
+ if (mqtt_list_is_empty(&c->mqtt_msg_handler_list))
return 0;
- LIST_FOR_EACH_SAFE(curr, next, &c->msg_handler_list) {
+ LIST_FOR_EACH_SAFE(curr, next, &c->mqtt_msg_handler_list) {
msg_handler = LIST_ENTRY(curr, message_handlers_t, list);
/* determine whether a node already exists by mqtt topic, but wildcards are not supported */
if ((NULL != msg_handler->topic_filter) && (mqtt_is_topic_equals(msg_handler->topic_filter, handler->topic_filter))) {
- LOG_W("%s:%d %s()...msg_handler->topic_filter: %s, handler->topic_filter: %s",
- __FILE__, __LINE__, __FUNCTION__, msg_handler->topic_filter, handler->topic_filter);
+ MQTT_LOG_W("%s:%d %s()...msg_handler->topic_filter: %s, handler->topic_filter: %s",
+ __FILE__, __LINE__, __FUNCTION__, msg_handler->topic_filter, handler->topic_filter);
return 1;
}
}
@@ -479,7 +479,7 @@ static int mqtt_msg_handlers_install(mqtt_client_t* c, message_handlers_t *handl
}
/* install to msg_handler_list*/
- list_add_tail(&handler->list, &c->msg_handler_list);
+ mqtt_list_add_tail(&handler->list, &c->mqtt_msg_handler_list);
RETURN_ERROR(MQTT_SUCCESS_ERROR);
}
@@ -487,44 +487,50 @@ static int mqtt_msg_handlers_install(mqtt_client_t* c, message_handlers_t *handl
static void mqtt_clean_session(mqtt_client_t* c)
{
- list_t *curr, *next;
+ mqtt_list_t *curr, *next;
ack_handlers_t *ack_handler;
message_handlers_t *msg_handler;
/* release all ack_handler_list memory */
- if (!(list_is_empty(&c->ack_handler_list))) {
- LIST_FOR_EACH_SAFE(curr, next, &c->ack_handler_list) {
+ if (!(mqtt_list_is_empty(&c->mqtt_ack_handler_list))) {
+ LIST_FOR_EACH_SAFE(curr, next, &c->mqtt_ack_handler_list) {
ack_handler = LIST_ENTRY(curr, ack_handlers_t, list);
platform_memory_free(ack_handler);
}
- list_del_init(&c->ack_handler_list);
+ mqtt_list_del_init(&c->mqtt_ack_handler_list);
}
/* release all msg_handler_list memory */
- if (!(list_is_empty(&c->msg_handler_list))) {
- LIST_FOR_EACH_SAFE(curr, next, &c->msg_handler_list) {
+ if (!(mqtt_list_is_empty(&c->mqtt_msg_handler_list))) {
+ LIST_FOR_EACH_SAFE(curr, next, &c->mqtt_msg_handler_list) {
msg_handler = LIST_ENTRY(curr, message_handlers_t, list);
msg_handler->topic_filter = NULL;
platform_memory_free(msg_handler);
}
- list_del_init(&c->msg_handler_list);
+ mqtt_list_del_init(&c->mqtt_msg_handler_list);
}
mqtt_set_client_state(c, CLIENT_STATE_INVALID);
}
-static void mqtt_ack_list_scan(mqtt_client_t* c)
+
+/**
+ * see if there is a message waiting for the server to answer in the ack list, if there is, then process it according to the flag.
+ * flag : 0 means it does not need to wait for the timeout to process these packets immediately. usually immediately after reconnecting.
+ * 1 means it needs to wait for timeout before processing these messages, usually timeout processing in a stable connection.
+ */
+static void mqtt_ack_list_scan(mqtt_client_t* c, uint8_t flag)
{
- list_t *curr, *next;
+ mqtt_list_t *curr, *next;
ack_handlers_t *ack_handler;
- if ((list_is_empty(&c->ack_handler_list)) || (CLIENT_STATE_CONNECTED != mqtt_get_client_state(c)))
+ if ((mqtt_list_is_empty(&c->mqtt_ack_handler_list)) || (CLIENT_STATE_CONNECTED != mqtt_get_client_state(c)))
return;
- LIST_FOR_EACH_SAFE(curr, next, &c->ack_handler_list) {
+ LIST_FOR_EACH_SAFE(curr, next, &c->mqtt_ack_handler_list) {
ack_handler = LIST_ENTRY(curr, ack_handlers_t, list);
-
- if (!platform_timer_is_expired(&ack_handler->timer))
+
+ if ((!platform_timer_is_expired(&ack_handler->timer)) && (flag == 1))
continue;
if ((ack_handler->type == PUBACK) || (ack_handler->type == PUBREC) || (ack_handler->type == PUBREL) || (ack_handler->type == PUBCOMP)) {
@@ -533,6 +539,7 @@ static void mqtt_ack_list_scan(mqtt_client_t* c)
mqtt_ack_handler_resend(c, ack_handler);
continue;
}
+ /* if it is not a qos1 or qos2 message, it will be destroyed in every processing */
mqtt_ack_handler_destroy(ack_handler);
}
}
@@ -540,20 +547,20 @@ static void mqtt_ack_list_scan(mqtt_client_t* c)
static int mqtt_try_resubscribe(mqtt_client_t* c)
{
int rc = MQTT_RESUBSCRIBE_ERROR;
- list_t *curr, *next;
+ mqtt_list_t *curr, *next;
message_handlers_t *msg_handler;
- LOG_W("%s:%d %s()... mqtt try resubscribe ...", __FILE__, __LINE__, __FUNCTION__);
+ MQTT_LOG_W("%s:%d %s()... mqtt try resubscribe ...", __FILE__, __LINE__, __FUNCTION__);
- if (list_is_empty(&c->msg_handler_list))
+ if (mqtt_list_is_empty(&c->mqtt_msg_handler_list))
RETURN_ERROR(MQTT_SUCCESS_ERROR);
- LIST_FOR_EACH_SAFE(curr, next, &c->msg_handler_list) {
+ LIST_FOR_EACH_SAFE(curr, next, &c->mqtt_msg_handler_list) {
msg_handler = LIST_ENTRY(curr, message_handlers_t, list);
/* resubscribe topic */
if ((rc = mqtt_subscribe(c, msg_handler->topic_filter, msg_handler->qos, msg_handler->handler)) == MQTT_ACK_HANDLER_NUM_TOO_MUCH_ERROR)
- LOG_W("%s:%d %s()... mqtt ack handler num too much ...", __FILE__, __LINE__, __FUNCTION__);
+ MQTT_LOG_W("%s:%d %s()... mqtt ack handler num too much ...", __FILE__, __LINE__, __FUNCTION__);
}
@@ -569,9 +576,11 @@ static int mqtt_try_do_reconnect(mqtt_client_t* c)
if (MQTT_SUCCESS_ERROR == rc) {
rc = mqtt_try_resubscribe(c); /* resubscribe */
+ /* process these ack messages immediately after reconnecting */
+ mqtt_ack_list_scan(c, 0);
}
- LOG_I("%s:%d %s()... mqtt try connect result is -0x%04x", __FILE__, __LINE__, __FUNCTION__, -rc);
+ MQTT_LOG_D("%s:%d %s()... mqtt try connect result is -0x%04x", __FILE__, __LINE__, __FUNCTION__, -rc);
RETURN_ERROR(rc);
}
@@ -582,36 +591,36 @@ static int mqtt_try_reconnect(mqtt_client_t* c)
rc = mqtt_try_do_reconnect(c);
- if ((MQTT_SUCCESS_ERROR != rc) && (platform_timer_is_expired(&c->reconnect_timer))) {
- platform_timer_cutdown(&c->reconnect_timer, c->reconnect_try_duration);
- if (NULL != c->reconnect_handler)
- c->reconnect_handler(c, c->reconnect_date);
+ if ((MQTT_SUCCESS_ERROR != rc) && (platform_timer_is_expired(&c->mqtt_reconnect_timer))) {
+ platform_timer_cutdown(&c->mqtt_reconnect_timer, c->mqtt_reconnect_try_duration);
+ if (NULL != c->mqtt_reconnect_handler)
+ c->mqtt_reconnect_handler(c, c->mqtt_reconnect_data);
RETURN_ERROR(MQTT_RECONNECT_TIMEOUT_ERROR);
}
RETURN_ERROR(rc);
}
-static int mqtt_publish_ack_packet(mqtt_client_t *c, unsigned short packet_id, int packet_type)
+static int mqtt_publish_ack_packet(mqtt_client_t *c, uint16_t packet_id, int packet_type)
{
int len = 0;
int rc = MQTT_SUCCESS_ERROR;
platform_timer_t timer;
platform_timer_init(&timer);
- platform_timer_cutdown(&timer, c->cmd_timeout);
+ platform_timer_cutdown(&timer, c->mqtt_cmd_timeout);
- platform_mutex_lock(&c->write_lock);
+ platform_mutex_lock(&c->mqtt_write_lock);
switch (packet_type) {
case PUBREC:
- len = MQTTSerialize_ack(c->write_buf, c->write_buf_size, PUBREL, 0, packet_id); /* make a PUBREL ack packet */
+ len = MQTTSerialize_ack(c->mqtt_write_buf, c->mqtt_write_buf_size, PUBREL, 0, packet_id); /* make a PUBREL ack packet */
rc = mqtt_ack_list_record(c, PUBCOMP, packet_id, len, NULL); /* record ack, expect to receive PUBCOMP*/
if (MQTT_SUCCESS_ERROR != rc)
goto exit;
break;
case PUBREL:
- len = MQTTSerialize_ack(c->write_buf, c->write_buf_size, PUBCOMP, 0, packet_id); /* make a PUBCOMP ack packet */
+ len = MQTTSerialize_ack(c->mqtt_write_buf, c->mqtt_write_buf_size, PUBCOMP, 0, packet_id); /* make a PUBCOMP ack packet */
break;
default:
@@ -627,7 +636,7 @@ static int mqtt_publish_ack_packet(mqtt_client_t *c, unsigned short packet_id, i
rc = mqtt_send_packet(c, len, &timer);
exit:
- platform_mutex_unlock(&c->write_lock);
+ platform_mutex_unlock(&c->mqtt_write_lock);
RETURN_ERROR(rc);
}
@@ -635,14 +644,14 @@ exit:
static int mqtt_puback_and_pubcomp_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
{
int rc = MQTT_FAILED_ERROR;
- unsigned short packet_id;
- unsigned char dup, packet_type;
+ uint16_t packet_id;
+ uint8_t dup, packet_type;
rc = mqtt_is_connected(c);
if (MQTT_SUCCESS_ERROR != rc)
RETURN_ERROR(rc);
- if (MQTTDeserialize_ack(&packet_type, &dup, &packet_id, c->read_buf, c->read_buf_size) != 1)
+ if (MQTTDeserialize_ack(&packet_type, &dup, &packet_id, c->mqtt_read_buf, c->mqtt_read_buf_size) != 1)
rc = MQTT_PUBREC_PACKET_ERROR;
(void) dup;
@@ -656,7 +665,7 @@ static int mqtt_suback_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
int rc = MQTT_FAILED_ERROR;
int count = 0;
int granted_qos = 0;
- unsigned short packet_id;
+ uint16_t packet_id;
int is_nack = 0;
message_handlers_t *msg_handler = NULL;
@@ -665,7 +674,7 @@ static int mqtt_suback_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
RETURN_ERROR(rc);
/* deserialize subscribe ack packet */
- if (MQTTDeserialize_suback(&packet_id, 1, &count, (int*)&granted_qos, c->read_buf, c->read_buf_size) != 1)
+ if (MQTTDeserialize_suback(&packet_id, 1, &count, (int*)&granted_qos, c->mqtt_read_buf, c->mqtt_read_buf_size) != 1)
RETURN_ERROR(MQTT_SUBSCRIBE_ACK_PACKET_ERROR);
is_nack = (granted_qos == SUBFAIL);
@@ -677,7 +686,7 @@ static int mqtt_suback_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
if (is_nack) {
mqtt_msg_handler_destory(msg_handler); /* subscribe topic failed, destory message handler */
- LOG_D("subscribe topic failed...");
+ MQTT_LOG_D("subscribe topic failed...");
RETURN_ERROR(MQTT_SUBSCRIBE_NOT_ACK_ERROR);
}
@@ -690,13 +699,13 @@ static int mqtt_unsuback_packet_handle(mqtt_client_t *c, platform_timer_t *timer
{
int rc = MQTT_FAILED_ERROR;
message_handlers_t *msg_handler;
- unsigned short packet_id = 0;
+ uint16_t packet_id = 0;
rc = mqtt_is_connected(c);
if (MQTT_SUCCESS_ERROR != rc)
RETURN_ERROR(rc);
- if (MQTTDeserialize_unsuback(&packet_id, c->read_buf, c->read_buf_size) != 1)
+ if (MQTTDeserialize_unsuback(&packet_id, c->mqtt_read_buf, c->mqtt_read_buf_size) != 1)
RETURN_ERROR(MQTT_UNSUBSCRIBE_ACK_PACKET_ERROR);
rc = mqtt_ack_list_unrecord(c, UNSUBACK, packet_id, &msg_handler); /* unrecord ack handler, and get message handler */
@@ -722,26 +731,26 @@ static int mqtt_publish_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
RETURN_ERROR(rc);
if (MQTTDeserialize_publish(&msg.dup, &qos, &msg.retained, &msg.id, &topic_name,
- (unsigned char**)&msg.payload, (int*)&msg.payloadlen, c->read_buf, c->read_buf_size) != 1)
+ (uint8_t**)&msg.payload, (int*)&msg.payloadlen, c->mqtt_read_buf, c->mqtt_read_buf_size) != 1)
RETURN_ERROR(MQTT_PUBLISH_PACKET_ERROR);
msg.qos = (mqtt_qos_t)qos;
/* for qos1 and qos2, you need to send a ack packet */
if (msg.qos != QOS0) {
- platform_mutex_lock(&c->write_lock);
+ platform_mutex_lock(&c->mqtt_write_lock);
if (msg.qos == QOS1)
- len = MQTTSerialize_ack(c->write_buf, c->write_buf_size, PUBACK, 0, msg.id);
+ len = MQTTSerialize_ack(c->mqtt_write_buf, c->mqtt_write_buf_size, PUBACK, 0, msg.id);
else if (msg.qos == QOS2)
- len = MQTTSerialize_ack(c->write_buf, c->write_buf_size, PUBREC, 0, msg.id);
+ len = MQTTSerialize_ack(c->mqtt_write_buf, c->mqtt_write_buf_size, PUBREC, 0, msg.id);
if (len <= 0)
rc = MQTT_SERIALIZE_PUBLISH_ACK_PACKET_ERROR;
else
rc = mqtt_send_packet(c, len, timer);
- platform_mutex_unlock(&c->write_lock);
+ platform_mutex_unlock(&c->mqtt_write_lock);
}
if (rc < 0)
@@ -762,14 +771,14 @@ static int mqtt_publish_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
static int mqtt_pubrec_and_pubrel_packet_handle(mqtt_client_t *c, platform_timer_t *timer)
{
int rc = MQTT_FAILED_ERROR;
- unsigned short packet_id;
- unsigned char dup, packet_type;
+ uint16_t packet_id;
+ uint8_t dup, packet_type;
rc = mqtt_is_connected(c);
if (MQTT_SUCCESS_ERROR != rc)
RETURN_ERROR(rc);
- if (MQTTDeserialize_ack(&packet_type, &dup, &packet_id, c->read_buf, c->read_buf_size) != 1)
+ if (MQTTDeserialize_ack(&packet_type, &dup, &packet_id, c->mqtt_read_buf, c->mqtt_read_buf_size) != 1)
RETURN_ERROR(MQTT_PUBREC_PACKET_ERROR);
(void) dup;
@@ -816,7 +825,7 @@ static int mqtt_packet_handle(mqtt_client_t* c, platform_timer_t* timer)
break;
case PINGRESP:
- c->ping_outstanding = 0; /* keep alive ping success */
+ c->mqtt_ping_outstanding = 0; /* keep alive ping success */
break;
default:
@@ -855,7 +864,7 @@ static int mqtt_yield(mqtt_client_t* c, int timeout_ms)
RETURN_ERROR(MQTT_FAILED_ERROR);
if (0 == timeout_ms)
- timeout_ms = c->cmd_timeout;
+ timeout_ms = c->mqtt_cmd_timeout;
platform_timer_init(&timer);
platform_timer_cutdown(&timer, timeout_ms);
@@ -878,13 +887,13 @@ static int mqtt_yield(mqtt_client_t* c, int timeout_ms)
if (rc >= 0) {
/* scan ack list, destroy ack handler that have timed out or resend them */
- mqtt_ack_list_scan(c);
+ mqtt_ack_list_scan(c, 1);
} else if (MQTT_NOT_CONNECT_ERROR == rc) {
- LOG_E("%s:%d %s()... mqtt not connect", __FILE__, __LINE__, __FUNCTION__);
+ MQTT_LOG_E("%s:%d %s()... mqtt not connect", __FILE__, __LINE__, __FUNCTION__);
/* reconnect timer cutdown */
- platform_timer_cutdown(&c->reconnect_timer, c->reconnect_try_duration);
+ platform_timer_cutdown(&c->mqtt_reconnect_timer, c->mqtt_reconnect_try_duration);
} else {
break;
}
@@ -901,24 +910,24 @@ static void mqtt_yield_thread(void *arg)
state = mqtt_get_client_state(c);
if (CLIENT_STATE_CONNECTED != state) {
- LOG_W("%s:%d %s()..., mqtt is not connected to the server...", __FILE__, __LINE__, __FUNCTION__);
- platform_thread_stop(c->thread); /* mqtt is not connected to the server, stop thread */
+ MQTT_LOG_W("%s:%d %s()..., mqtt is not connected to the server...", __FILE__, __LINE__, __FUNCTION__);
+ platform_thread_stop(c->mqtt_thread); /* mqtt is not connected to the server, stop thread */
}
while (1) {
- rc = mqtt_yield(c, c->cmd_timeout);
+ rc = mqtt_yield(c, c->mqtt_cmd_timeout);
if (MQTT_CLEAN_SESSION_ERROR == rc) {
- LOG_E("%s:%d %s()..., mqtt clean session....", __FILE__, __LINE__, __FUNCTION__);
- c->network->disconnect(c->network);
+ MQTT_LOG_E("%s:%d %s()..., mqtt clean session....", __FILE__, __LINE__, __FUNCTION__);
+ network_disconnect(c->mqtt_network);
mqtt_clean_session(c);
goto exit;
} else if (MQTT_RECONNECT_TIMEOUT_ERROR == rc) {
- LOG_E("%s:%d %s()..., mqtt reconnect timeout....", __FILE__, __LINE__, __FUNCTION__);
+ MQTT_LOG_E("%s:%d %s()..., mqtt reconnect timeout....", __FILE__, __LINE__, __FUNCTION__);
}
}
exit:
- platform_thread_destroy(c->thread);
+ platform_thread_destroy(c->mqtt_thread);
}
static int mqtt_connect_with_results(mqtt_client_t* c)
@@ -935,36 +944,69 @@ static int mqtt_connect_with_results(mqtt_client_t* c)
if (CLIENT_STATE_CONNECTED == mqtt_get_client_state(c))
RETURN_ERROR(MQTT_SUCCESS_ERROR);
- rc = c->network->connect(c->network);
- if (MQTT_SUCCESS_ERROR != rc)
- RETURN_ERROR(rc);
+ if ((MQTT_MIN_PAYLOAD_SIZE >= c->mqtt_read_buf_size) || (MQTT_MAX_PAYLOAD_SIZE <= c->mqtt_read_buf_size))
+ c->mqtt_read_buf_size = MQTT_DEFAULT_BUF_SIZE;
+ if ((MQTT_MIN_PAYLOAD_SIZE >= c->mqtt_write_buf_size) || (MQTT_MAX_PAYLOAD_SIZE <= c->mqtt_write_buf_size))
+ c->mqtt_write_buf_size = MQTT_DEFAULT_BUF_SIZE;
- LOG_I("%s:%d %s()... mqtt connect success...", __FILE__, __LINE__, __FUNCTION__);
+ c->mqtt_read_buf = (uint8_t*) platform_memory_alloc(c->mqtt_write_buf_size);
+ c->mqtt_write_buf = (uint8_t*) platform_memory_alloc(c->mqtt_write_buf_size);
+
+ if ((NULL == c->mqtt_read_buf) || (NULL == c->mqtt_write_buf)) {
+ MQTT_LOG_E("%s:%d %s()... malloc buf failed...", __FILE__, __LINE__, __FUNCTION__);
+ RETURN_ERROR(MQTT_MEM_NOT_ENOUGH_ERROR);
+ }
- connect_data.keepAliveInterval = c->connect_params->keep_alive_interval;
- connect_data.cleansession = c->connect_params->clean_session;
- connect_data.MQTTVersion = c->connect_params->mqtt_version;
- connect_data.clientID.cstring= c->connect_params->client_id;
- connect_data.username.cstring = c->connect_params->user_name;
- connect_data.password.cstring = c->connect_params->password;
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
+ rc = network_init(c->mqtt_network, c->mqtt_host, c->mqtt_port, c->mqtt_ca);
+#else
+ rc = network_init(c->mqtt_network, c->mqtt_host, c->mqtt_port, NULL);
+#endif
- platform_timer_cutdown(&c->last_received, (c->connect_params->keep_alive_interval * 1000));
+ rc = network_connect(c->mqtt_network);
+ if (MQTT_SUCCESS_ERROR != rc) {
+ if (NULL != c->mqtt_network) {
+ network_release(c->mqtt_network);
+ platform_memory_free(c->mqtt_network);
+ c->mqtt_network = NULL;
+ RETURN_ERROR(rc);
+ }
+ }
+
+ MQTT_LOG_I("%s:%d %s()... mqtt connect success...", __FILE__, __LINE__, __FUNCTION__);
- platform_mutex_lock(&c->write_lock);
+ connect_data.keepAliveInterval = c->mqtt_keep_alive_interval;
+ connect_data.cleansession = c->mqtt_clean_session;
+ connect_data.MQTTVersion = c->mqtt_version;
+ connect_data.clientID.cstring= c->mqtt_client_id;
+ connect_data.username.cstring = c->mqtt_user_name;
+ connect_data.password.cstring = c->mqtt_password;
+
+ if (c->mqtt_will_flag) {
+ connect_data.willFlag = c->mqtt_will_flag;
+ connect_data.will.message.cstring = c->mqtt_will_options->will_message;
+ connect_data.will.qos = c->mqtt_will_options->will_qos;
+ connect_data.will.retained = c->mqtt_will_options->will_retained;
+ connect_data.will.topicName.cstring = c->mqtt_will_options->will_topic;
+ }
+
+ platform_timer_cutdown(&c->mqtt_last_received, (c->mqtt_keep_alive_interval * 1000));
+
+ platform_mutex_lock(&c->mqtt_write_lock);
/* serialize connect packet */
- if ((len = MQTTSerialize_connect(c->write_buf, c->write_buf_size, &connect_data)) <= 0)
+ if ((len = MQTTSerialize_connect(c->mqtt_write_buf, c->mqtt_write_buf_size, &connect_data)) <= 0)
goto exit;
platform_timer_init(&connect_timer);
- platform_timer_cutdown(&connect_timer, c->cmd_timeout);
+ platform_timer_cutdown(&connect_timer, c->mqtt_cmd_timeout);
/* send connect packet */
if ((rc = mqtt_send_packet(c, len, &connect_timer)) != MQTT_SUCCESS_ERROR)
goto exit;
if (mqtt_wait_packet(c, CONNACK, &connect_timer) == CONNACK) {
- if (MQTTDeserialize_connack(&connack_data.session_present, &connack_data.rc, c->read_buf, c->read_buf_size) == 1)
+ if (MQTTDeserialize_connack(&connack_data.session_present, &connack_data.rc, c->mqtt_read_buf, c->mqtt_read_buf_size) == 1)
rc = connack_data.rc;
else
rc = MQTT_CONNECT_FAILED_ERROR;
@@ -973,33 +1015,100 @@ static int mqtt_connect_with_results(mqtt_client_t* c)
exit:
if (rc == MQTT_SUCCESS_ERROR) {
- if(NULL == c->thread) {
+ if(NULL == c->mqtt_thread) {
/* connect success, and need init mqtt thread */
- c->thread= platform_thread_init("mqtt_yield_thread", mqtt_yield_thread, c, MQTT_THREAD_STACK_SIZE, MQTT_THREAD_PRIO, MQTT_THREAD_TICK);
+ c->mqtt_thread= platform_thread_init("mqtt_yield_thread", mqtt_yield_thread, c, MQTT_THREAD_STACK_SIZE, MQTT_THREAD_PRIO, MQTT_THREAD_TICK);
- if (NULL != c->thread) {
+ if (NULL != c->mqtt_thread) {
mqtt_set_client_state(c, CLIENT_STATE_CONNECTED);
- platform_thread_startup(c->thread);
- platform_thread_start(c->thread); /* start run mqtt thread */
+ platform_thread_startup(c->mqtt_thread);
+ platform_thread_start(c->mqtt_thread); /* start run mqtt thread */
}
} else {
mqtt_set_client_state(c, CLIENT_STATE_CONNECTED); /* reconnect, mqtt thread is already exists */
}
- c->ping_outstanding = 0; /* reset ping outstanding */
+ c->mqtt_ping_outstanding = 0; /* reset ping outstanding */
} else {
mqtt_set_client_state(c, CLIENT_STATE_INITIALIZED); /* connect failed */
}
- platform_mutex_unlock(&c->write_lock);
+ platform_mutex_unlock(&c->mqtt_write_lock);
RETURN_ERROR(rc);
}
+static int mqtt_init(mqtt_client_t* c)
+{
+ /* network init */
+ c->mqtt_network = (network_t*) platform_memory_alloc(sizeof(network_t));
+
+ if (NULL == c->mqtt_network) {
+ MQTT_LOG_E("%s:%d %s()... malloc memory failed...", __FILE__, __LINE__, __FUNCTION__);
+ RETURN_ERROR(MQTT_MEM_NOT_ENOUGH_ERROR);
+ }
+ memset(c->mqtt_network, 0, sizeof(network_t));
+
+ c->mqtt_packet_id = 1;
+ c->mqtt_clean_session = 0; //no clear session by default
+ c->mqtt_will_flag = 0;
+ c->mqtt_cmd_timeout = MQTT_DEFAULT_CMD_TIMEOUT;
+ c->mqtt_client_state = CLIENT_STATE_INITIALIZED;
+
+ c->mqtt_ping_outstanding = 0;
+ c->mqtt_ack_handler_number = 0;
+ c->mqtt_client_id_len = 0;
+ c->mqtt_user_name_len = 0;
+ c->mqtt_password_len = 0;
+ c->mqtt_keep_alive_interval = MQTT_KEEP_ALIVE_INTERVAL;
+ c->mqtt_version = MQTT_VERSION;
+ c->mqtt_reconnect_try_duration = MQTT_RECONNECT_DEFAULT_DURATION;
+
+ c->mqtt_will_options = NULL;
+ c->mqtt_reconnect_data = NULL;
+ c->mqtt_reconnect_handler = NULL;
+ c->mqtt_interceptor_handler = NULL;
+
+ mqtt_list_init(&c->mqtt_msg_handler_list);
+ mqtt_list_init(&c->mqtt_ack_handler_list);
+
+ platform_mutex_init(&c->mqtt_write_lock);
+ platform_mutex_init(&c->mqtt_global_lock);
+
+ platform_timer_init(&c->mqtt_reconnect_timer);
+ platform_timer_init(&c->mqtt_last_sent);
+ platform_timer_init(&c->mqtt_last_received);
+
+ RETURN_ERROR(MQTT_SUCCESS_ERROR);
+}
+
/********************************************************* mqttclient global function ********************************************************/
+MQTT_CLIENT_SET_DEFINE(client_id, char*, NULL)
+MQTT_CLIENT_SET_DEFINE(user_name, char*, NULL)
+MQTT_CLIENT_SET_DEFINE(password, char*, NULL)
+MQTT_CLIENT_SET_DEFINE(host, char*, NULL)
+MQTT_CLIENT_SET_DEFINE(port, char*, NULL)
+MQTT_CLIENT_SET_DEFINE(ca, char*, NULL)
+MQTT_CLIENT_SET_DEFINE(reconnect_data, void*, NULL)
+MQTT_CLIENT_SET_DEFINE(keep_alive_interval, uint16_t, 0)
+MQTT_CLIENT_SET_DEFINE(will_flag, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(clean_session, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(version, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(cmd_timeout, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(read_buf_size, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(write_buf_size, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(reconnect_try_duration, uint32_t, 0)
+MQTT_CLIENT_SET_DEFINE(reconnect_handler, reconnect_handler_t, NULL)
+MQTT_CLIENT_SET_DEFINE(interceptor_handler, interceptor_handler_t, NULL)
+
+void mqtt_sleep_ms(int ms)
+{
+ platform_timer_usleep(ms * 1000);
+}
+
int mqtt_keep_alive(mqtt_client_t* c)
{
int rc = MQTT_SUCCESS_ERROR;
@@ -1008,100 +1117,38 @@ int mqtt_keep_alive(mqtt_client_t* c)
if (MQTT_SUCCESS_ERROR != rc)
RETURN_ERROR(rc);
- if (platform_timer_is_expired(&c->last_sent) || platform_timer_is_expired(&c->last_received)) {
- if (c->ping_outstanding) {
- LOG_W("%s:%d %s()... ping outstanding", __FILE__, __LINE__, __FUNCTION__);
+ if (platform_timer_is_expired(&c->mqtt_last_sent) || platform_timer_is_expired(&c->mqtt_last_received)) {
+ if (c->mqtt_ping_outstanding) {
+ MQTT_LOG_W("%s:%d %s()... ping outstanding", __FILE__, __LINE__, __FUNCTION__);
mqtt_set_client_state(c, CLIENT_STATE_DISCONNECTED);
rc = MQTT_NOT_CONNECT_ERROR; /* PINGRESP not received in keepalive interval */
} else {
platform_timer_t timer;
- int len = MQTTSerialize_pingreq(c->write_buf, c->write_buf_size);
+ int len = MQTTSerialize_pingreq(c->mqtt_write_buf, c->mqtt_write_buf_size);
if (len > 0 && (rc = mqtt_send_packet(c, len, &timer)) == MQTT_SUCCESS_ERROR) // send the ping packet
- c->ping_outstanding++;
+ c->mqtt_ping_outstanding++;
}
}
RETURN_ERROR(rc);
}
-int mqtt_init(mqtt_client_t* c, client_init_params_t* init)
+mqtt_client_t *mqtt_lease(void)
{
int rc;
- if ((NULL == c) || (NULL == init))
- RETURN_ERROR(MQTT_NULL_VALUE_ERROR);
+ mqtt_client_t* c;
+
+ c = (mqtt_client_t *)platform_memory_alloc(sizeof(mqtt_client_t));
+ if (NULL == c)
+ return NULL;
memset(c, 0, sizeof(mqtt_client_t));
- /* network init */
- c->network = (network_t*) platform_memory_alloc(sizeof(network_t));
- if (NULL == c->network) {
- LOG_E("%s:%d %s()... malloc network failed...", __FILE__, __LINE__, __FUNCTION__);
- RETURN_ERROR(MQTT_MEM_NOT_ENOUGH_ERROR);
- }
- memset(c->network, 0, sizeof(network_t));
-
- if ((MQTT_MIN_PAYLOAD_SIZE >= init->read_buf_size) || (MQTT_MAX_PAYLOAD_SIZE <= init->read_buf_size))
- init->read_buf_size = MQTT_DEFAULT_BUF_SIZE;
- if ((MQTT_MIN_PAYLOAD_SIZE >= init->write_buf_size) || (MQTT_MAX_PAYLOAD_SIZE <= init->read_buf_size))
- init->write_buf_size = MQTT_DEFAULT_BUF_SIZE;
+ rc = mqtt_init(c);
+ if (MQTT_SUCCESS_ERROR != rc)
+ return NULL;
- c->read_buf = (unsigned char*) platform_memory_alloc(init->read_buf_size);
- c->write_buf = (unsigned char*) platform_memory_alloc(init->write_buf_size);
-
- if ((NULL == c->read_buf) || (NULL == c->write_buf)) {
- LOG_E("%s:%d %s()... malloc buf failed...", __FILE__, __LINE__, __FUNCTION__);
- RETURN_ERROR(MQTT_MEM_NOT_ENOUGH_ERROR);
- }
-
- c->read_buf_size = init->read_buf_size;
- c->write_buf_size = init->write_buf_size;
-
- c->packet_id = 1;
- if ((init->cmd_timeout < MQTT_MIN_CMD_TIMEOUT) || (init->cmd_timeout > MQTT_MAX_CMD_TIMEOUT))
- c->cmd_timeout = MQTT_DEFAULT_CMD_TIMEOUT;
- else
- c->cmd_timeout = init->cmd_timeout;
-
- c->ping_outstanding = 0;
- c->ack_handler_number = 0;
- c->client_state = CLIENT_STATE_INITIALIZED;
-
- if (0 == init->connect_params.keep_alive_interval)
- init->connect_params.keep_alive_interval = MQTT_KEEP_ALIVE_INTERVAL;
-
- if (0 == init->connect_params.mqtt_version)
- init->connect_params.mqtt_version = MQTT_VERSION;
-
- if (0 == init->reconnect_try_duration)
- init->reconnect_try_duration = MQTT_RECONNECT_DEFAULT_DURATION;
-
- init->connect_params.client_id_len = strlen(init->connect_params.client_id);
- init->connect_params.user_name_len = strlen(init->connect_params.user_name);
- init->connect_params.password_len = strlen(init->connect_params.password);
-
- c->connect_params = &init->connect_params;
- c->reconnect_try_duration = init->reconnect_try_duration;
- c->connect_params->keep_alive_interval = init->connect_params.keep_alive_interval;
-
- c->reconnect_date = init->reconnect_date;
- c->reconnect_handler = init->reconnect_handler;
- c->interceptor_handler = NULL;
-
- // c->network->network_params = &init->connect_params.network_params;
- if ((rc = network_init(c->network, &init->connect_params.network_params)) < 0)
- RETURN_ERROR(rc);
-
- list_init(&c->msg_handler_list);
- list_init(&c->ack_handler_list);
-
- platform_mutex_init(&c->write_lock);
- platform_mutex_init(&c->global_lock);
-
- platform_timer_init(&c->reconnect_timer);
- platform_timer_init(&c->last_sent);
- platform_timer_init(&c->last_received);
-
- RETURN_ERROR(MQTT_SUCCESS_ERROR);
+ return c;
}
int mqtt_release(mqtt_client_t* c)
@@ -1112,30 +1159,30 @@ int mqtt_release(mqtt_client_t* c)
RETURN_ERROR(MQTT_NULL_VALUE_ERROR);
platform_timer_init(&timer);
- platform_timer_cutdown(&timer, c->cmd_timeout);
+ platform_timer_cutdown(&timer, c->mqtt_cmd_timeout);
/* wait for the clean session to complete */
while ((CLIENT_STATE_INVALID != mqtt_get_client_state(c))) {
// platform_timer_usleep(1000); // 1ms avoid compiler optimization.
if (platform_timer_is_expired(&timer)) {
- LOG_E("%s:%d %s()... mqtt release failed...", __FILE__, __LINE__, __FUNCTION__);
+ MQTT_LOG_E("%s:%d %s()... mqtt release failed...", __FILE__, __LINE__, __FUNCTION__);
RETURN_ERROR(MQTT_FAILED_ERROR)
}
}
- if (NULL != c->network) {
- platform_memory_free(c->network);
- c->network = NULL;
+ if (NULL != c->mqtt_network) {
+ platform_memory_free(c->mqtt_network);
+ c->mqtt_network = NULL;
}
- if (NULL != c->read_buf) {
- platform_memory_free(c->read_buf);
- c->read_buf = NULL;
+ if (NULL != c->mqtt_read_buf) {
+ platform_memory_free(c->mqtt_read_buf);
+ c->mqtt_read_buf = NULL;
}
- if (NULL != c->write_buf) {
- platform_memory_free(c->write_buf);
- c->write_buf = NULL;
+ if (NULL != c->mqtt_write_buf) {
+ platform_memory_free(c->mqtt_write_buf);
+ c->mqtt_write_buf = NULL;
}
memset(c, 0, sizeof(mqtt_client_t));
@@ -1156,16 +1203,16 @@ int mqtt_disconnect(mqtt_client_t* c)
int len = 0;
platform_timer_init(&timer);
- platform_timer_cutdown(&timer, c->cmd_timeout);
+ platform_timer_cutdown(&timer, c->mqtt_cmd_timeout);
- platform_mutex_lock(&c->write_lock);
+ platform_mutex_lock(&c->mqtt_write_lock);
/* serialize disconnect packet and send it */
- len = MQTTSerialize_disconnect(c->write_buf, c->write_buf_size);
+ len = MQTTSerialize_disconnect(c->mqtt_write_buf, c->mqtt_write_buf_size);
if (len > 0)
rc = mqtt_send_packet(c, len, &timer);
- platform_mutex_unlock(&c->write_lock);
+ platform_mutex_unlock(&c->mqtt_write_lock);
mqtt_set_client_state(c, CLIENT_STATE_CLEAN_SESSION);
@@ -1176,7 +1223,7 @@ int mqtt_subscribe(mqtt_client_t* c, const char* topic_filter, mqtt_qos_t qos, m
{
int rc = MQTT_SUBSCRIBE_ERROR;
int len = 0;
- unsigned short packet_id;
+ uint16_t packet_id;
platform_timer_t timer;
MQTTString topic = MQTTString_initializer;
topic.cstring = (char *)topic_filter;
@@ -1185,12 +1232,12 @@ int mqtt_subscribe(mqtt_client_t* c, const char* topic_filter, mqtt_qos_t qos, m
if (CLIENT_STATE_CONNECTED != mqtt_get_client_state(c))
RETURN_ERROR(MQTT_NOT_CONNECT_ERROR);
- platform_mutex_lock(&c->write_lock);
+ platform_mutex_lock(&c->mqtt_write_lock);
packet_id = mqtt_get_next_packet_id(c);
/* serialize subscribe packet and send it */
- len = MQTTSerialize_subscribe(c->write_buf, c->write_buf_size, 0, packet_id, 1, &topic, (int*)&qos);
+ len = MQTTSerialize_subscribe(c->mqtt_write_buf, c->mqtt_write_buf_size, 0, packet_id, 1, &topic, (int*)&qos);
if (len <= 0)
goto exit;
@@ -1209,7 +1256,7 @@ int mqtt_subscribe(mqtt_client_t* c, const char* topic_filter, mqtt_qos_t qos, m
exit:
- platform_mutex_unlock(&c->write_lock);
+ platform_mutex_unlock(&c->mqtt_write_lock);
RETURN_ERROR(rc);
}
@@ -1218,7 +1265,7 @@ int mqtt_unsubscribe(mqtt_client_t* c, const char* topic_filter)
{
int len = 0;
int rc = MQTT_FAILED_ERROR;
- unsigned short packet_id;
+ uint16_t packet_id;
platform_timer_t timer;
MQTTString topic = MQTTString_initializer;
topic.cstring = (char *)topic_filter;
@@ -1227,12 +1274,12 @@ int mqtt_unsubscribe(mqtt_client_t* c, const char* topic_filter)
if (CLIENT_STATE_CONNECTED != mqtt_get_client_state(c))
RETURN_ERROR(MQTT_NOT_CONNECT_ERROR);
- platform_mutex_lock(&c->write_lock);
+ platform_mutex_lock(&c->mqtt_write_lock);
packet_id = mqtt_get_next_packet_id(c);
/* serialize unsubscribe packet and send it */
- if ((len = MQTTSerialize_unsubscribe(c->write_buf, c->write_buf_size, 0, packet_id, 1, &topic)) <= 0)
+ if ((len = MQTTSerialize_unsubscribe(c->mqtt_write_buf, c->mqtt_write_buf_size, 0, packet_id, 1, &topic)) <= 0)
goto exit;
if ((rc = mqtt_send_packet(c, len, &timer)) != MQTT_SUCCESS_ERROR)
goto exit;
@@ -1246,7 +1293,7 @@ int mqtt_unsubscribe(mqtt_client_t* c, const char* topic_filter)
exit:
- platform_mutex_unlock(&c->write_lock);
+ platform_mutex_unlock(&c->mqtt_write_lock);
RETURN_ERROR(rc);
}
@@ -1267,7 +1314,7 @@ int mqtt_publish(mqtt_client_t* c, const char* topic_filter, mqtt_message_t* msg
if ((NULL != msg->payload) && (0 == msg->payloadlen))
msg->payloadlen = strlen((char*)msg->payload);
- platform_mutex_lock(&c->write_lock);
+ platform_mutex_lock(&c->mqtt_write_lock);
if (QOS0 != msg->qos) {
if (mqtt_ack_handler_is_maximum(c)) {
@@ -1278,8 +1325,8 @@ int mqtt_publish(mqtt_client_t* c, const char* topic_filter, mqtt_message_t* msg
}
/* serialize publish packet and send it */
- len = MQTTSerialize_publish(c->write_buf, c->write_buf_size, 0, msg->qos, msg->retained, msg->id,
- topic, (unsigned char*)msg->payload, msg->payloadlen);
+ len = MQTTSerialize_publish(c->mqtt_write_buf, c->mqtt_write_buf_size, 0, msg->qos, msg->retained, msg->id,
+ topic, (uint8_t*)msg->payload, msg->payloadlen);
if (len <= 0)
goto exit;
@@ -1300,10 +1347,12 @@ int mqtt_publish(mqtt_client_t* c, const char* topic_filter, mqtt_message_t* msg
}
exit:
- platform_mutex_unlock(&c->write_lock);
+ msg->payloadlen = 0; // clear
+
+ platform_mutex_unlock(&c->mqtt_write_lock);
if ((MQTT_ACK_HANDLER_NUM_TOO_MUCH_ERROR == rc) || (MQTT_MEM_NOT_ENOUGH_ERROR == rc)) {
- LOG_W("%s:%d %s()... there is not enough memory space to record...", __FILE__, __LINE__, __FUNCTION__);
+ MQTT_LOG_W("%s:%d %s()... there is not enough memory space to record...", __FILE__, __LINE__, __FUNCTION__);
/* record too much retransmitted data, may be disconnected, need to reconnect */
mqtt_set_client_state(c, CLIENT_STATE_DISCONNECTED);
@@ -1316,32 +1365,43 @@ exit:
int mqtt_list_subscribe_topic(mqtt_client_t* c)
{
int i = 0;
- list_t *curr, *next;
+ mqtt_list_t *curr, *next;
message_handlers_t *msg_handler;
if (NULL == c)
RETURN_ERROR(MQTT_NULL_VALUE_ERROR);
- if (list_is_empty(&c->msg_handler_list))
- LOG_I("%s:%d %s()... there are no subscribed topics...", __FILE__, __LINE__, __FUNCTION__);
+ if (mqtt_list_is_empty(&c->mqtt_msg_handler_list))
+ MQTT_LOG_I("%s:%d %s()... there are no subscribed topics...", __FILE__, __LINE__, __FUNCTION__);
- LIST_FOR_EACH_SAFE(curr, next, &c->msg_handler_list) {
+ LIST_FOR_EACH_SAFE(curr, next, &c->mqtt_msg_handler_list) {
msg_handler = LIST_ENTRY(curr, message_handlers_t, list);
/* determine whether a node already exists by mqtt topic, but wildcards are not supported */
if (NULL != msg_handler->topic_filter) {
- LOG_I("%s:%d %s()...[%d] subscribe topic: %s", __FILE__, __LINE__, __FUNCTION__, ++i ,msg_handler->topic_filter);
+ MQTT_LOG_I("%s:%d %s()...[%d] subscribe topic: %s", __FILE__, __LINE__, __FUNCTION__, ++i ,msg_handler->topic_filter);
}
}
RETURN_ERROR(MQTT_SUCCESS_ERROR);
}
-int mqtt_set_interceptor_handler(mqtt_client_t* c, interceptor_handler_t handler)
+int mqtt_set_will_options(mqtt_client_t* c, char *topic, mqtt_qos_t qos, uint8_t retained, char *message)
{
- if (NULL == handler)
+ if ((NULL == c) || (NULL == topic))
RETURN_ERROR(MQTT_NULL_VALUE_ERROR);
-
- c->interceptor_handler = handler;
+
+ if (NULL == c->mqtt_will_options) {
+ c->mqtt_will_options = platform_memory_alloc(sizeof(mqtt_will_options_t));
+ MQTT_ROBUSTNESS_CHECK(c->mqtt_will_options, MQTT_MEM_NOT_ENOUGH_ERROR);
+ }
+
+ if (0 == c->mqtt_will_flag)
+ c->mqtt_will_flag = 1;
+
+ c->mqtt_will_options->will_topic = topic;
+ c->mqtt_will_options->will_qos = qos;
+ c->mqtt_will_options->will_retained = retained;
+ c->mqtt_will_options->will_message = message;
RETURN_ERROR(MQTT_SUCCESS_ERROR);
}
diff --git a/components/connectivity/mqttclient/mqttclient/mqttclient.h b/components/connectivity/mqttclient/mqttclient/mqttclient.h
index f7c444f5..df66fcc7 100644
--- a/components/connectivity/mqttclient/mqttclient/mqttclient.h
+++ b/components/connectivity/mqttclient/mqttclient/mqttclient.h
@@ -2,17 +2,18 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-09 21:31:25
- * @LastEditTime: 2020-04-18 12:29:23
+ * @LastEditTime: 2020-06-16 16:57:40
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#ifndef _MQTTCLIENT_H_
#define _MQTTCLIENT_H_
#include
+#include
#include
#include "MQTTPacket.h"
-#include "list.h"
+#include "mqtt_list.h"
#include "platform_timer.h"
#include "platform_memory.h"
#include "platform_mutex.h"
@@ -20,8 +21,8 @@
#include "mqtt_defconfig.h"
#include "network.h"
#include "random.h"
-#include "error.h"
-#include "log.h"
+#include "mqtt_error.h"
+#include "mqtt_log.h"
typedef enum mqtt_qos {
QOS0 = 0,
@@ -39,15 +40,15 @@ typedef enum client_state {
}client_state_t;
typedef struct mqtt_connack_data {
- unsigned char rc;
- unsigned char session_present;
+ uint8_t rc;
+ uint8_t session_present;
} mqtt_connack_data_t;
typedef struct mqtt_message {
mqtt_qos_t qos;
- unsigned char retained;
- unsigned char dup;
- unsigned short id;
+ uint8_t retained;
+ uint8_t dup;
+ uint16_t id;
size_t payloadlen;
void *payload;
} mqtt_message_t;
@@ -62,83 +63,111 @@ typedef void (*message_handler_t)(void* client, message_data_t* msg);
typedef void (*reconnect_handler_t)(void* client, void* reconnect_date);
typedef struct message_handlers {
- list_t list;
+ mqtt_list_t list;
mqtt_qos_t qos;
const char* topic_filter;
message_handler_t handler;
} message_handlers_t;
typedef struct ack_handlers {
- list_t list;
+ mqtt_list_t list;
platform_timer_t timer;
- unsigned int type;
- unsigned short packet_id;
+ uint32_t type;
+ uint16_t packet_id;
message_handlers_t *handler;
- unsigned short payload_len;
- unsigned char *payload;
+ uint16_t payload_len;
+ uint8_t *payload;
} ack_handlers_t;
-typedef struct connect_params {
- char *client_id;
- char *user_name;
- char *password;
- size_t client_id_len;
- size_t user_name_len;
- size_t password_len;
- unsigned char will_flag;
- void *will_options;
- unsigned short keep_alive_interval;
- unsigned char clean_session;
- unsigned char mqtt_version;
- network_params_t network_params;
-} connect_params_t;
+typedef struct mqtt_will_options {
+ mqtt_qos_t will_qos;
+ uint8_t will_retained;
+ char *will_topic;
+ char *will_message;
+} mqtt_will_options_t;
typedef struct mqtt_client {
- unsigned short packet_id;
- unsigned char ping_outstanding;
- unsigned char ack_handler_number;
- unsigned char *read_buf;
- unsigned char *write_buf;
- unsigned int cmd_timeout;
- unsigned int read_buf_size;
- unsigned int write_buf_size;
- unsigned int reconnect_try_duration;
- void *reconnect_date;
- reconnect_handler_t reconnect_handler;
- client_state_t client_state;
- platform_mutex_t write_lock;
- platform_mutex_t global_lock;
- list_t msg_handler_list;
- list_t ack_handler_list;
- network_t *network;
- platform_thread_t *thread;
- platform_timer_t reconnect_timer;
- platform_timer_t last_sent;
- platform_timer_t last_received;
- connect_params_t *connect_params;
- interceptor_handler_t interceptor_handler;
+ char *mqtt_client_id;
+ char *mqtt_user_name;
+ char *mqtt_password;
+ char *mqtt_host;
+ char *mqtt_port;
+ char *mqtt_ca;
+ void *mqtt_reconnect_data;
+ uint8_t *mqtt_read_buf;
+ uint8_t *mqtt_write_buf;
+ uint16_t mqtt_keep_alive_interval;
+ uint16_t mqtt_packet_id;
+ uint32_t mqtt_will_flag : 1;
+ uint32_t mqtt_clean_session : 1;
+ uint32_t mqtt_ping_outstanding : 2;
+ uint32_t mqtt_version : 4;
+ uint32_t mqtt_ack_handler_number : 24;
+ uint32_t mqtt_cmd_timeout;
+ uint32_t mqtt_read_buf_size;
+ uint32_t mqtt_write_buf_size;
+ uint32_t mqtt_reconnect_try_duration;
+ size_t mqtt_client_id_len;
+ size_t mqtt_user_name_len;
+ size_t mqtt_password_len;
+ mqtt_will_options_t *mqtt_will_options;
+ client_state_t mqtt_client_state;
+ platform_mutex_t mqtt_write_lock;
+ platform_mutex_t mqtt_global_lock;
+ mqtt_list_t mqtt_msg_handler_list;
+ mqtt_list_t mqtt_ack_handler_list;
+ network_t *mqtt_network;
+ platform_thread_t *mqtt_thread;
+ platform_timer_t mqtt_reconnect_timer;
+ platform_timer_t mqtt_last_sent;
+ platform_timer_t mqtt_last_received;
+ reconnect_handler_t mqtt_reconnect_handler;
+ interceptor_handler_t mqtt_interceptor_handler;
} mqtt_client_t;
-typedef struct client_init_params{
- unsigned int cmd_timeout;
- unsigned int read_buf_size;
- unsigned int write_buf_size;
- unsigned int reconnect_try_duration;
- void *reconnect_date;
- reconnect_handler_t reconnect_handler;
- connect_params_t connect_params;
-} client_init_params_t;
-int mqtt_keep_alive(mqtt_client_t* c);
-int mqtt_init(mqtt_client_t* c, client_init_params_t* init);
+#define MQTT_ROBUSTNESS_CHECK(item, err) if (!(item)) { \
+ MQTT_LOG_E("%s:%d %s()... check for error.", __FILE__, __LINE__, __FUNCTION__); \
+ return err; }
+
+#define MQTT_CLIENT_SET_DEFINE(name, type, res) \
+ type mqtt_set_##name(mqtt_client_t *c, type t) { \
+ MQTT_ROBUSTNESS_CHECK((c), res); \
+ c->mqtt_##name = t; \
+ return c->mqtt_##name; \
+ }
+
+#define MQTT_CLIENT_SET_STATEMENT(name, type) \
+ type mqtt_set_##name(mqtt_client_t *, type);
+
+MQTT_CLIENT_SET_STATEMENT(client_id, char*)
+MQTT_CLIENT_SET_STATEMENT(user_name, char*)
+MQTT_CLIENT_SET_STATEMENT(password, char*)
+MQTT_CLIENT_SET_STATEMENT(host, char*)
+MQTT_CLIENT_SET_STATEMENT(port, char*)
+MQTT_CLIENT_SET_STATEMENT(ca, char*)
+MQTT_CLIENT_SET_STATEMENT(reconnect_data, void*)
+MQTT_CLIENT_SET_STATEMENT(keep_alive_interval, uint16_t)
+MQTT_CLIENT_SET_STATEMENT(will_flag, uint32_t)
+MQTT_CLIENT_SET_STATEMENT(clean_session, uint32_t)
+MQTT_CLIENT_SET_STATEMENT(version, uint32_t)
+MQTT_CLIENT_SET_STATEMENT(cmd_timeout, uint32_t)
+MQTT_CLIENT_SET_STATEMENT(read_buf_size, uint32_t)
+MQTT_CLIENT_SET_STATEMENT(write_buf_size, uint32_t)
+MQTT_CLIENT_SET_STATEMENT(reconnect_try_duration, uint32_t)
+MQTT_CLIENT_SET_STATEMENT(reconnect_handler, reconnect_handler_t)
+MQTT_CLIENT_SET_STATEMENT(interceptor_handler, interceptor_handler_t)
+
+void mqtt_sleep_ms(int ms);
+mqtt_client_t *mqtt_lease(void);
int mqtt_release(mqtt_client_t* c);
int mqtt_connect(mqtt_client_t* c);
int mqtt_disconnect(mqtt_client_t* c);
+int mqtt_keep_alive(mqtt_client_t* c);
int mqtt_subscribe(mqtt_client_t* c, const char* topic_filter, mqtt_qos_t qos, message_handler_t msg_handler);
int mqtt_unsubscribe(mqtt_client_t* c, const char* topic_filter);
int mqtt_publish(mqtt_client_t* c, const char* topic_filter, mqtt_message_t* msg);
int mqtt_list_subscribe_topic(mqtt_client_t* c);
-int mqtt_set_interceptor_handler(mqtt_client_t* c, interceptor_handler_t handler);
-
+int mqtt_set_will_options(mqtt_client_t* c, char *topic, mqtt_qos_t qos, uint8_t retained, char *message);
#endif /* _MQTTCLIENT_H_ */
diff --git a/components/connectivity/mqttclient/network/CMakeLists.txt b/components/connectivity/mqttclient/network/CMakeLists.txt
new file mode 100644
index 00000000..a49cf3e5
--- /dev/null
+++ b/components/connectivity/mqttclient/network/CMakeLists.txt
@@ -0,0 +1,22 @@
+set(SUBDIRS "mbedtls")
+
+aux_source_directory(. DIR_SRCS)
+
+string(REGEX REPLACE ".*/(.*)" "\\1" LIB_NAME ${CMAKE_CURRENT_SOURCE_DIR})
+
+if (DIR_SRCS)
+ foreach(libname ${LIBNAMES})
+ if (${LIB_NAME} STREQUAL ${libname})
+ add_library(${libname} ${CMAKE_LIB_TYPE} ${DIR_SRCS})
+ target_link_libraries(${libname} "platform" "mbedtls")
+ endif()
+ endforeach()
+
+else()
+ message(WARNING "not find is src file!")
+endif()
+
+foreach(subdir ${SUBDIRS})
+ add_subdirectory(${subdir})
+endforeach()
+
diff --git a/components/connectivity/mqttclient/network/mbedtls/CMakeLists.txt b/components/connectivity/mqttclient/network/mbedtls/CMakeLists.txt
new file mode 100644
index 00000000..62326e63
--- /dev/null
+++ b/components/connectivity/mqttclient/network/mbedtls/CMakeLists.txt
@@ -0,0 +1,15 @@
+cmake_minimum_required(VERSION 2.8)
+
+set(MBEDTLS_SUBDIRS "library" "include" "wrapper")
+set(MBEDTLS_INCDIRS "include" "include/mbedtls" "configs" "wrapper")
+
+foreach(incdir ${INCDIRS})
+ include_directories(${MBEDTLS_INCDIRS})
+endforeach()
+
+foreach(subdir ${MBEDTLS_SUBDIRS})
+ add_subdirectory(${subdir})
+endforeach()
+
+
+
diff --git a/components/connectivity/mqttclient/network/mbedtls/wrapper/CMakeLists.txt b/components/connectivity/mqttclient/network/mbedtls/wrapper/CMakeLists.txt
new file mode 100644
index 00000000..08de52f4
--- /dev/null
+++ b/components/connectivity/mqttclient/network/mbedtls/wrapper/CMakeLists.txt
@@ -0,0 +1,7 @@
+aux_source_directory(. WARAPPER_SRCS)
+
+add_library("wrapper" ${CMAKE_LIB_TYPE} ${WARAPPER_SRCS})
+target_link_libraries("wrapper" "platform")
+
+
+
diff --git a/components/connectivity/mqttclient/common/mbedtls/wrapper/entropy_hardware_alt.c b/components/connectivity/mqttclient/network/mbedtls/wrapper/entropy_hardware_alt.c
similarity index 95%
rename from components/connectivity/mqttclient/common/mbedtls/wrapper/entropy_hardware_alt.c
rename to components/connectivity/mqttclient/network/mbedtls/wrapper/entropy_hardware_alt.c
index ef9cb749..02c935db 100644
--- a/components/connectivity/mqttclient/common/mbedtls/wrapper/entropy_hardware_alt.c
+++ b/components/connectivity/mqttclient/network/mbedtls/wrapper/entropy_hardware_alt.c
@@ -2,7 +2,7 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2020-01-11 02:04:49
- * @LastEditTime : 2020-01-11 02:12:16
+ * @LastEditTime: 2020-02-19 23:53:22
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#include "mbedtls/entropy.h"
diff --git a/components/connectivity/mqttclient/common/mbedtls/wrapper/net_sockets_alt.c b/components/connectivity/mqttclient/network/mbedtls/wrapper/net_sockets_alt.c
similarity index 100%
rename from components/connectivity/mqttclient/common/mbedtls/wrapper/net_sockets_alt.c
rename to components/connectivity/mqttclient/network/mbedtls/wrapper/net_sockets_alt.c
diff --git a/components/connectivity/mqttclient/common/mbedtls/wrapper/timing_alt.c b/components/connectivity/mqttclient/network/mbedtls/wrapper/timing_alt.c
similarity index 100%
rename from components/connectivity/mqttclient/common/mbedtls/wrapper/timing_alt.c
rename to components/connectivity/mqttclient/network/mbedtls/wrapper/timing_alt.c
diff --git a/components/connectivity/mqttclient/common/mbedtls/wrapper/timing_alt.h b/components/connectivity/mqttclient/network/mbedtls/wrapper/timing_alt.h
similarity index 100%
rename from components/connectivity/mqttclient/common/mbedtls/wrapper/timing_alt.h
rename to components/connectivity/mqttclient/network/mbedtls/wrapper/timing_alt.h
diff --git a/components/connectivity/mqttclient/network/nettype_tcp.c b/components/connectivity/mqttclient/network/nettype_tcp.c
new file mode 100644
index 00000000..54a8257c
--- /dev/null
+++ b/components/connectivity/mqttclient/network/nettype_tcp.c
@@ -0,0 +1,35 @@
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2019-12-15 13:38:52
+ * @LastEditTime: 2020-05-25 10:13:41
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#include "nettype_tcp.h"
+#include "mqtt_log.h"
+
+int nettype_tcp_read(network_t *n, unsigned char *read_buf, int len, int timeout)
+{
+ return platform_net_socket_recv_timeout(n->socket, read_buf, len, timeout);
+}
+
+int nettype_tcp_write(network_t *n, unsigned char *write_buf, int len, int timeout)
+{
+ return platform_net_socket_write_timeout(n->socket, write_buf, len, timeout);
+}
+
+int nettype_tcp_connect(network_t* n)
+{
+ n->socket = platform_net_socket_connect(n->host, n->port, PLATFORM_NET_PROTO_TCP);
+ if (n->socket < 0)
+ RETURN_ERROR(n->socket);
+
+ RETURN_ERROR(MQTT_SUCCESS_ERROR);
+}
+
+void nettype_tcp_disconnect(network_t* n)
+{
+ if (NULL != n)
+ platform_net_socket_close(n->socket);
+ n->socket = -1;
+}
diff --git a/components/connectivity/mqttclient/network/nettype_tcp.h b/components/connectivity/mqttclient/network/nettype_tcp.h
new file mode 100644
index 00000000..502ae185
--- /dev/null
+++ b/components/connectivity/mqttclient/network/nettype_tcp.h
@@ -0,0 +1,20 @@
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2019-12-15 13:39:00
+ * @LastEditTime: 2020-05-24 15:49:46
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#ifndef _NETTYPE_TCP_H_
+#define _NETTYPE_TCP_H_
+
+#include "platform_net_socket.h"
+#include "network.h"
+#include "mqtt_error.h"
+
+int nettype_tcp_read(network_t *n, unsigned char *buf, int len, int timeout);
+int nettype_tcp_write(network_t *n, unsigned char *buf, int len, int timeout);
+int nettype_tcp_connect(network_t* n);
+void nettype_tcp_disconnect(network_t* n);
+
+#endif
diff --git a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_nettype_tls.c b/components/connectivity/mqttclient/network/nettype_tls.c
similarity index 57%
rename from components/connectivity/mqttclient/platform/TencentOS-tiny/platform_nettype_tls.c
rename to components/connectivity/mqttclient/network/nettype_tls.c
index 518fb742..f1381e49 100644
--- a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_nettype_tls.c
+++ b/components/connectivity/mqttclient/network/nettype_tls.c
@@ -2,16 +2,16 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2020-01-11 19:45:35
- * @LastEditTime: 2020-03-05 23:52:30
+ * @LastEditTime: 2020-05-24 17:03:47
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
-#include "platform_nettype_tls.h"
+#include "nettype_tls.h"
#include "platform_net_socket.h"
#include "platform_memory.h"
#include "platform_timer.h"
#include "random.h"
-#ifdef MQTT_NETWORK_TYPE_TLS
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
#include "mbedtls/platform.h"
#include "mbedtls/ssl.h"
@@ -20,23 +20,19 @@
#include "mbedtls/ctr_drbg.h"
#include "mbedtls/error.h"
#include "mbedtls/debug.h"
-#include "mbedtls\x509_crt.h"
-#include "mbedtls\pk.h"
-
-#if !defined(MBEDTLS_FS_IO)
-static const int ciphersuites[] = { MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA, 0 };
-#endif
+#include "mbedtls/x509_crt.h"
+#include "mbedtls/pk.h"
#if defined(MBEDTLS_X509_CRT_PARSE_C)
static int server_certificate_verify(void *hostname, mbedtls_x509_crt *crt, int depth, uint32_t *flags)
{
if (0 != *flags)
- LOG_E("%s:%d %s()... server_certificate_verify failed returned 0x%04x\n", __FILE__, __LINE__, __FUNCTION__, *flags);
+ MQTT_LOG_E("%s:%d %s()... server_certificate_verify failed returned 0x%04x\n", __FILE__, __LINE__, __FUNCTION__, *flags);
return *flags;
}
#endif
-static int platform_nettype_tls_entropy_source(void *data, uint8_t *output, size_t len, size_t *out_len)
+static int nettype_tls_entropy_source(void *data, uint8_t *output, size_t len, size_t *out_len)
{
uint32_t seed;
(void) data;
@@ -52,7 +48,7 @@ static int platform_nettype_tls_entropy_source(void *data, uint8_t *output, size
return 0;
}
-static int platform_nettype_tls_init(network_t* n, nettype_tls_params_t* nettype_tls_params)
+static int nettype_tls_init(network_t* n, nettype_tls_params_t* nettype_tls_params)
{
int rc = MQTT_SUCCESS_ERROR;
@@ -69,29 +65,29 @@ static int platform_nettype_tls_init(network_t* n, nettype_tls_params_t* nettype
#endif
mbedtls_entropy_init(&(nettype_tls_params->entropy));
- mbedtls_entropy_add_source(&(nettype_tls_params->entropy), platform_nettype_tls_entropy_source, NULL, MBEDTLS_ENTROPY_MAX_GATHER, MBEDTLS_ENTROPY_SOURCE_STRONG);
+ mbedtls_entropy_add_source(&(nettype_tls_params->entropy), nettype_tls_entropy_source, NULL, MBEDTLS_ENTROPY_MAX_GATHER, MBEDTLS_ENTROPY_SOURCE_STRONG);
if ((rc = mbedtls_ctr_drbg_seed(&(nettype_tls_params->ctr_drbg), mbedtls_entropy_func,
&(nettype_tls_params->entropy), NULL, 0)) != 0) {
- LOG_E("mbedtls_ctr_drbg_seed failed returned 0x%04x", (rc < 0 )? -rc : rc);
+ MQTT_LOG_E("mbedtls_ctr_drbg_seed failed returned 0x%04x", (rc < 0 )? -rc : rc);
RETURN_ERROR(rc);
}
if ((rc = mbedtls_ssl_config_defaults(&(nettype_tls_params->ssl_conf), MBEDTLS_SSL_IS_CLIENT,
MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {
- LOG_E("mbedtls_ssl_config_defaults failed returned 0x%04x", (rc < 0 )? -rc : rc);
+ MQTT_LOG_E("mbedtls_ssl_config_defaults failed returned 0x%04x", (rc < 0 )? -rc : rc);
RETURN_ERROR(rc);
}
mbedtls_ssl_conf_rng(&(nettype_tls_params->ssl_conf), mbedtls_ctr_drbg_random, &(nettype_tls_params->ctr_drbg));
#if defined(MBEDTLS_X509_CRT_PARSE_C)
- if (NULL != n->network_params.network_ssl_params.ca_crt) {
- n->network_params.network_ssl_params.ca_crt_len = strlen(n->network_params.network_ssl_params.ca_crt);
+ if (NULL != n->ca_crt) {
+ n->ca_crt_len = strlen(n->ca_crt);
- if (0 != (rc = (mbedtls_x509_crt_parse(&(nettype_tls_params->ca_cert), (unsigned char *)n->network_params.network_ssl_params.ca_crt,
- (n->network_params.network_ssl_params.ca_crt_len + 1))))) {
- LOG_E("%s:%d %s()... parse ca crt failed returned 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
+ if (0 != (rc = (mbedtls_x509_crt_parse(&(nettype_tls_params->ca_cert), (unsigned char *)n->ca_crt,
+ (n->ca_crt_len + 1))))) {
+ MQTT_LOG_E("%s:%d %s()... parse ca crt failed returned 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
RETURN_ERROR(rc);
}
}
@@ -100,58 +96,25 @@ static int platform_nettype_tls_init(network_t* n, nettype_tls_params_t* nettype
if ((rc = mbedtls_ssl_conf_own_cert(&(nettype_tls_params->ssl_conf),
&(nettype_tls_params->client_cert), &(nettype_tls_params->private_key))) != 0) {
- LOG_E("%s:%d %s()... mbedtls_ssl_conf_own_cert failed returned 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
+ MQTT_LOG_E("%s:%d %s()... mbedtls_ssl_conf_own_cert failed returned 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
RETURN_ERROR(rc);
}
- mbedtls_ssl_conf_verify(&(nettype_tls_params->ssl_conf), server_certificate_verify, (void *)n->network_params.addr);
+ mbedtls_ssl_conf_verify(&(nettype_tls_params->ssl_conf), server_certificate_verify, (void *)n->host);
mbedtls_ssl_conf_authmode(&(nettype_tls_params->ssl_conf), MBEDTLS_SSL_VERIFY_REQUIRED);
#endif
-#if defined(MBEDTLS_FS_IO)
- if (n->network_params.network_ssl_params.cert_file != NULL && n->network_params.network_ssl_params.key_file != NULL) {
- if ((rc = mbedtls_x509_crt_parse_file(&(nettype_tls_params->client_cert), n->network_params.network_ssl_params.cert_file)) != 0) {
- LOG_E("%s:%d %s()... load client cert file failed returned 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
- return MQTT_SSL_CERT_ERROR;
- }
-
- if ((rc = mbedtls_pk_parse_keyfile(&(nettype_tls_params->private_key), n->network_params.network_ssl_params.key_file, "")) != 0) {
- LOG_E("%s:%d %s()... load client key file failed returned 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
- return MQTT_SSL_CERT_ERROR;
- }
- } else {
- LOG_I("%s:%d %s()... cert_file/key_file is empty! | cert_file = %s | key_file = %s", __FILE__, __LINE__, __FUNCTION__,
- n->network_params.network_ssl_params.cert_file, n->network_params.network_ssl_params.key_file);
- }
-#else
-#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
- if (n->network_params.network_ssl_params.psk != NULL && n->network_params.network_ssl_params.psk_id !=NULL) {
- const char *psk_id = n->network_params.network_ssl_params.psk_id;
- rc = mbedtls_ssl_conf_psk(&(nettype_tls_params->ssl_conf), (unsigned char *)n->network_params.network_ssl_params.psk,
- n->network_params.network_ssl_params.psk_length, (const unsigned char *) psk_id, strlen( psk_id ));
-
- mbedtls_ssl_conf_ciphersuites(&(nettype_tls_params->ssl_conf), ciphersuites);
-
- if (0 != rc) {
- LOG_E("%s:%d %s()... mbedtls_ssl_conf_psk fail: 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
- return rc;
- }
- }
-
-#endif
-#endif
-
- mbedtls_ssl_conf_read_timeout(&(nettype_tls_params->ssl_conf), n->network_params.network_ssl_params.timeout_ms);
+ mbedtls_ssl_conf_read_timeout(&(nettype_tls_params->ssl_conf), n->timeout_ms);
if ((rc = mbedtls_ssl_setup(&(nettype_tls_params->ssl), &(nettype_tls_params->ssl_conf))) != 0) {
- LOG_E("mbedtls_ssl_setup failed returned 0x%04x", (rc < 0 )? -rc : rc);
+ MQTT_LOG_E("mbedtls_ssl_setup failed returned 0x%04x", (rc < 0 )? -rc : rc);
RETURN_ERROR(rc);
}
#if defined(MBEDTLS_X509_CRT_PARSE_C)
- if ((rc = mbedtls_ssl_set_hostname(&(nettype_tls_params->ssl), n->network_params.addr)) != 0) {
- LOG_E("%s:%d %s()... mbedtls_ssl_set_hostname failed returned 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
+ if ((rc = mbedtls_ssl_set_hostname(&(nettype_tls_params->ssl), n->host)) != 0) {
+ MQTT_LOG_E("%s:%d %s()... mbedtls_ssl_set_hostname failed returned 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
RETURN_ERROR(rc);
}
#endif
@@ -162,7 +125,7 @@ static int platform_nettype_tls_init(network_t* n, nettype_tls_params_t* nettype
}
-int platform_nettype_tls_connect(network_t* n)
+int nettype_tls_connect(network_t* n)
{
int rc;
if (NULL == n)
@@ -174,19 +137,19 @@ int platform_nettype_tls_connect(network_t* n)
RETURN_ERROR(MQTT_MEM_NOT_ENOUGH_ERROR);
- rc = platform_nettype_tls_init(n, nettype_tls_params);
+ rc = nettype_tls_init(n, nettype_tls_params);
if (MQTT_SUCCESS_ERROR != rc)
goto exit;
- if (0 != (rc = mbedtls_net_connect(&(nettype_tls_params->socket_fd), n->network_params.addr, n->network_params.port, MBEDTLS_NET_PROTO_TCP)))
+ if (0 != (rc = mbedtls_net_connect(&(nettype_tls_params->socket_fd), n->host, n->port, MBEDTLS_NET_PROTO_TCP)))
goto exit;
while ((rc = mbedtls_ssl_handshake(&(nettype_tls_params->ssl))) != 0) {
if (rc != MBEDTLS_ERR_SSL_WANT_READ && rc != MBEDTLS_ERR_SSL_WANT_WRITE) {
- LOG_E("%s:%d %s()...mbedtls handshake failed returned 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
+ MQTT_LOG_E("%s:%d %s()...mbedtls handshake failed returned 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
#if defined(MBEDTLS_X509_CRT_PARSE_C)
if (rc == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) {
- LOG_E("%s:%d %s()...unable to verify the server's certificate", __FILE__, __LINE__, __FUNCTION__);
+ MQTT_LOG_E("%s:%d %s()...unable to verify the server's certificate", __FILE__, __LINE__, __FUNCTION__);
}
#endif
goto exit;
@@ -194,11 +157,11 @@ int platform_nettype_tls_connect(network_t* n)
}
if ((rc = mbedtls_ssl_get_verify_result(&(nettype_tls_params->ssl))) != 0) {
- LOG_E("%s:%d %s()...mbedtls_ssl_get_verify_result returned 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
+ MQTT_LOG_E("%s:%d %s()...mbedtls_ssl_get_verify_result returned 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
goto exit;
}
- n->network_params.nettype_tls_params = nettype_tls_params;
+ n->nettype_tls_params = nettype_tls_params;
RETURN_ERROR(MQTT_SUCCESS_ERROR)
exit:
@@ -207,13 +170,13 @@ exit:
}
-void platform_nettype_tls_disconnect(network_t* n)
+void nettype_tls_disconnect(network_t* n)
{
int rc = 0;
if (NULL == n)
return;
- nettype_tls_params_t *nettype_tls_params = (nettype_tls_params_t *) n->network_params.nettype_tls_params;
+ nettype_tls_params_t *nettype_tls_params = (nettype_tls_params_t *) n->nettype_tls_params;
do {
rc = mbedtls_ssl_close_notify(&(nettype_tls_params->ssl));
@@ -233,7 +196,7 @@ void platform_nettype_tls_disconnect(network_t* n)
platform_memory_free(nettype_tls_params);
}
-int platform_nettype_tls_write(network_t *n, unsigned char *buf, int len, int timeout)
+int nettype_tls_write(network_t *n, unsigned char *buf, int len, int timeout)
{
int rc = 0;
int write_len = 0;
@@ -242,7 +205,7 @@ int platform_nettype_tls_write(network_t *n, unsigned char *buf, int len, int ti
if (NULL == n)
RETURN_ERROR(MQTT_NULL_VALUE_ERROR);
- nettype_tls_params_t *nettype_tls_params = (nettype_tls_params_t *) n->network_params.nettype_tls_params;
+ nettype_tls_params_t *nettype_tls_params = (nettype_tls_params_t *) n->nettype_tls_params;
platform_timer_init(&timer);
platform_timer_cutdown(&timer, timeout);
@@ -253,7 +216,7 @@ int platform_nettype_tls_write(network_t *n, unsigned char *buf, int len, int ti
if (rc > 0) {
write_len += rc;
} else if ((rc == 0) || ((rc != MBEDTLS_ERR_SSL_WANT_WRITE) && (rc != MBEDTLS_ERR_SSL_WANT_READ) && (rc != MBEDTLS_ERR_SSL_TIMEOUT))) {
- LOG_E("%s:%d %s()... mbedtls_ssl_write failed: 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
+ MQTT_LOG_E("%s:%d %s()... mbedtls_ssl_write failed: 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
break;
}
} while((!platform_timer_is_expired(&timer)) && (write_len < len));
@@ -261,7 +224,7 @@ int platform_nettype_tls_write(network_t *n, unsigned char *buf, int len, int ti
return write_len;
}
-int platform_nettype_tls_read(network_t *n, unsigned char *buf, int len, int timeout)
+int nettype_tls_read(network_t *n, unsigned char *buf, int len, int timeout)
{
int rc = 0;
int read_len = 0;
@@ -270,7 +233,7 @@ int platform_nettype_tls_read(network_t *n, unsigned char *buf, int len, int tim
if (NULL == n)
RETURN_ERROR(MQTT_NULL_VALUE_ERROR);
- nettype_tls_params_t *nettype_tls_params = (nettype_tls_params_t *) n->network_params.nettype_tls_params;
+ nettype_tls_params_t *nettype_tls_params = (nettype_tls_params_t *) n->nettype_tls_params;
platform_timer_init(&timer);
platform_timer_cutdown(&timer, timeout);
@@ -281,7 +244,7 @@ int platform_nettype_tls_read(network_t *n, unsigned char *buf, int len, int tim
if (rc > 0) {
read_len += rc;
} else if ((rc == 0) || ((rc != MBEDTLS_ERR_SSL_WANT_WRITE) && (rc != MBEDTLS_ERR_SSL_WANT_READ) && (rc != MBEDTLS_ERR_SSL_TIMEOUT))) {
- // LOG_E("%s:%d %s()... mbedtls_ssl_read failed: 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
+ // MQTT_LOG_E("%s:%d %s()... mbedtls_ssl_read failed: 0x%04x", __FILE__, __LINE__, __FUNCTION__, (rc < 0 )? -rc : rc);
break;
}
} while((!platform_timer_is_expired(&timer)) && (read_len < len));
@@ -289,4 +252,4 @@ int platform_nettype_tls_read(network_t *n, unsigned char *buf, int len, int tim
return read_len;
}
-#endif /* MQTT_NETWORK_TYPE_TLS */
+#endif /* MQTT_NETWORK_TYPE_NO_TLS */
diff --git a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_nettype_tls.h b/components/connectivity/mqttclient/network/nettype_tls.h
similarity index 67%
rename from components/connectivity/mqttclient/platform/TencentOS-tiny/platform_nettype_tls.h
rename to components/connectivity/mqttclient/network/nettype_tls.h
index a5fef572..2285197f 100644
--- a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_nettype_tls.h
+++ b/components/connectivity/mqttclient/network/nettype_tls.h
@@ -2,20 +2,19 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2020-01-11 19:45:44
- * @LastEditTime: 2020-02-25 03:51:37
+ * @LastEditTime: 2020-05-24 17:03:13
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
-#ifndef _PLATFORM_NETTYPE_TLS_H_
-#define _PLATFORM_NETTYPE_TLS_H_
+#ifndef _NETTYPE_TLS_H_
+#define _NETTYPE_TLS_H_
-#include "platform_net_socket.h"
#include "mqtt_defconfig.h"
#include "network.h"
-#include "error.h"
-#include "log.h"
+#include "mqtt_error.h"
+#include "mqtt_log.h"
-#ifdef MQTT_NETWORK_TYPE_TLS
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
typedef struct nettype_tls_params {
mbedtls_net_context socket_fd; /**< mbed TLS network context. */
@@ -30,11 +29,11 @@ typedef struct nettype_tls_params {
mbedtls_pk_context private_key; /**< mbed TLS Client key. */
} nettype_tls_params_t;
-int platform_nettype_tls_read(network_t *n, unsigned char *buf, int len, int timeout);
-int platform_nettype_tls_write(network_t *n, unsigned char *buf, int len, int timeout);
-int platform_nettype_tls_connect(network_t* n);
-void platform_nettype_tls_disconnect(network_t* n);
+int nettype_tls_read(network_t *n, unsigned char *buf, int len, int timeout);
+int nettype_tls_write(network_t *n, unsigned char *buf, int len, int timeout);
+int nettype_tls_connect(network_t* n);
+void nettype_tls_disconnect(network_t* n);
-#endif /* MQTT_NETWORK_TYPE_TLS */
+#endif /* MQTT_NETWORK_TYPE_NO_TLS */
#endif
diff --git a/components/connectivity/mqttclient/network/network.c b/components/connectivity/mqttclient/network/network.c
index bb44ec73..3c7214e7 100644
--- a/components/connectivity/mqttclient/network/network.c
+++ b/components/connectivity/mqttclient/network/network.c
@@ -2,91 +2,111 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-09 21:30:54
- * @LastEditTime: 2020-02-25 03:49:43
+ * @LastEditTime: 2020-06-05 17:17:48
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#include "platform_timer.h"
-#include "platform_nettype_tcp.h"
+#include "platform_memory.h"
+#include "nettype_tcp.h"
-#ifdef MQTT_NETWORK_TYPE_TLS
-#include "platform_nettype_tls.h"
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
+#include "nettype_tls.h"
#endif
int network_read(network_t *n, unsigned char *buf, int len, int timeout)
{
-#ifdef MQTT_NETWORK_TYPE_TLS
- return platform_nettype_tls_read(n, buf, len, timeout);
-#else
- return platform_nettype_tcp_read(n, buf, len, timeout);
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
+ if (n->channel)
+ return nettype_tls_read(n, buf, len, timeout);
#endif
+ return nettype_tcp_read(n, buf, len, timeout);
}
int network_write(network_t *n, unsigned char *buf, int len, int timeout)
{
-#ifdef MQTT_NETWORK_TYPE_TLS
- return platform_nettype_tls_write(n, buf, len, timeout);
-#else
- return platform_nettype_tcp_write(n, buf, len, timeout);
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
+ if (n->channel)
+ return nettype_tls_write(n, buf, len, timeout);
#endif
+ return nettype_tcp_write(n, buf, len, timeout);
}
int network_connect(network_t *n)
{
-#ifdef MQTT_NETWORK_TYPE_TLS
- return platform_nettype_tls_connect(n);
-#else
- return platform_nettype_tcp_connect(n);
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
+ if (n->channel)
+ return nettype_tls_connect(n);
#endif
+ return nettype_tcp_connect(n);
+
}
void network_disconnect(network_t *n)
{
-#ifdef MQTT_NETWORK_TYPE_TLS
- platform_nettype_tls_disconnect(n);
-#else
- platform_nettype_tcp_disconnect(n);
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
+ if (n->channel)
+ nettype_tls_disconnect(n);
+ else
#endif
+ nettype_tcp_disconnect(n);
}
-int network_init(network_t* n, network_params_t* network_params)
+int network_init(network_t *n, const char *host, const char *port, const char *ca)
{
- if ((NULL == n) || (NULL == network_params) || (NULL == network_params->addr) || (NULL == network_params->port))
- RETURN_ERROR(MQTT_NULL_VALUE_ERROR);
-
- n->socket = -1;
- n->read = network_read;
- n->write = network_write;
- n->connect = network_connect;
- n->disconnect = network_disconnect;
- n->network_params.addr = network_params->addr;
- n->network_params.port = network_params->port;
+ if (NULL == n)
+ RETURN_ERROR(MQTT_NULL_VALUE_ERROR);
-#ifdef MQTT_NETWORK_TYPE_TLS
- n->network_params.network_ssl_params.ca_crt = network_params->network_ssl_params.ca_crt;
- n->network_params.network_ssl_params.ca_crt_len = strlen(n->network_params.network_ssl_params.ca_crt);
-#if defined(MBEDTLS_FS_IO)
- n->network_params.network_ssl_params.cert_file = network_params->network_ssl_params.cert_file;
- n->network_params.network_ssl_params.key_file = network_params->network_ssl_params.key_file;
-#else
-#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
- n->network_params.network_ssl_params.psk = network_params->network_ssl_params.psk;
- n->network_params.network_ssl_params.psk_id = network_params->network_ssl_params.psk_id;
- n->network_params.network_ssl_params.psk_length = network_params->network_ssl_params.psk_length;
-#endif
-#endif
- if (0 == network_params->network_ssl_params.timeout_ms)
- network_params->network_ssl_params.timeout_ms = MQTT_TLS_HANDSHAKE_TIMEOUT;
- n->network_params.network_ssl_params.timeout_ms = network_params->network_ssl_params.timeout_ms;
-#endif
+ n->socket = -1;
+ n->host = host;
+ n->port = port;
- RETURN_ERROR(MQTT_SUCCESS_ERROR);
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
+ n->channel = 0;
+
+ if (NULL != ca) {
+ network_set_ca(n, ca);
+ }
+#endif
+ RETURN_ERROR(MQTT_SUCCESS_ERROR);
}
void network_release(network_t* n)
{
- if (n->socket)
- network_disconnect(n);
+ if (n->socket >= 0)
+ network_disconnect(n);
- memset(n, 0, sizeof(network_t));
+ memset(n, 0, sizeof(network_t));
+}
+
+void network_set_channel(network_t *n, int channel)
+{
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
+ n->channel = channel;
+#endif
+}
+
+int network_set_ca(network_t *n, const char *ca)
+{
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
+ if ((NULL == n) || (NULL == ca))
+ RETURN_ERROR(MQTT_NULL_VALUE_ERROR);
+
+ n->ca_crt = ca;
+ n->ca_crt_len = strlen(ca);
+ n->channel = NETWORK_CHANNEL_TLS;
+ n->timeout_ms = MQTT_TLS_HANDSHAKE_TIMEOUT;
+#endif
+ RETURN_ERROR(MQTT_SUCCESS_ERROR);
+}
+
+int network_set_host_port(network_t* n, char *host, char *port)
+{
+ if (!(n && host && port))
+ RETURN_ERROR(MQTT_NULL_VALUE_ERROR);
+
+ n->host = host;
+ n->port = port;
+
+ RETURN_ERROR(MQTT_SUCCESS_ERROR);
}
diff --git a/components/connectivity/mqttclient/network/network.h b/components/connectivity/mqttclient/network/network.h
index da1f0cfb..11b11f9b 100644
--- a/components/connectivity/mqttclient/network/network.h
+++ b/components/connectivity/mqttclient/network/network.h
@@ -2,7 +2,7 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-09 21:31:02
- * @LastEditTime: 2020-02-25 03:49:11
+ * @LastEditTime: 2020-05-21 01:09:29
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#ifndef _NETWORK_H_
@@ -10,46 +10,30 @@
#include "mqtt_defconfig.h"
-#ifdef MQTT_NETWORK_TYPE_TLS
-typedef struct network_ssl_params {
- const char *ca_crt;
- size_t ca_crt_len;
-#if defined(MBEDTLS_FS_IO)
- const char *cert_file; // public certificate file
- const char *key_file; // pravite certificate file
-#else
-#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
- const char *psk; // PSK string
- const char *psk_id; // PSK ID
- size_t psk_length; // PSK length
-#endif
-#endif
- unsigned int timeout_ms; // SSL handshake timeout in millisecond
-} network_ssl_params_t;
-#endif /* MQTT_NETWORK_TYPE_TLS */
-
-typedef struct network_params {
- char *addr;
- char *port;
-#ifdef MQTT_NETWORK_TYPE_TLS
- network_ssl_params_t network_ssl_params;
- void *nettype_tls_params;
-#endif /* MQTT_NETWORK_TYPE_TLS */
-} network_params_t;
+#define NETWORK_CHANNEL_TCP 0
+#define NETWORK_CHANNEL_TLS 1
typedef struct network {
- int socket;
- network_params_t network_params;
- int (*connect)(struct network *);
- void (*disconnect)(struct network *);
- int (*read)(struct network *, unsigned char *, int, int);
- int (*write)(struct network *, unsigned char *, int, int);
+ const char *host;
+ const char *port;
+ int socket;
+#ifndef MQTT_NETWORK_TYPE_NO_TLS
+ int channel; /* tcp or tls */
+ const char *ca_crt;
+ unsigned int ca_crt_len;
+ unsigned int timeout_ms; // SSL handshake timeout in millisecond
+ void *nettype_tls_params;
+#endif
} network_t;
-int network_init(network_t* n, network_params_t* network_params);
+int network_init(network_t *n, const char *host, const char *port, const char *ca);
+int network_set_ca(network_t *n, const char *ca);
+void network_set_channel(network_t *n, int channel);
+int network_set_host_port(network_t* n, char *host, char *port);
int network_read(network_t* n, unsigned char* buf, int len, int timeout);
int network_write(network_t* n, unsigned char* buf, int len, int timeout);
int network_connect(network_t* n);
+void network_disconnect(network_t *n);
void network_release(network_t* n);
#endif
diff --git a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_net_socket.c b/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_net_socket.c
index 4582dcd8..e760e362 100644
--- a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_net_socket.c
+++ b/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_net_socket.c
@@ -2,7 +2,7 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2020-01-10 23:45:59
- * @LastEditTime: 2020-04-25 18:59:28
+ * @LastEditTime: 2020-04-25 17:54:44
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#include "platform_net_socket.h"
@@ -10,7 +10,7 @@
int platform_net_socket_connect(const char *host, const char *port, int proto)
{
int fd, ret = MQTT_SOCKET_UNKNOWN_HOST_ERROR;
-#ifdef MQTT_NETSOCKET_USE_AT
+#ifdef MQTT_NETSOCKET_USING_AT
fd = tos_sal_module_connect(host, port, TOS_SAL_PROTO_TCP);
@@ -45,7 +45,7 @@ int platform_net_socket_connect(const char *host, const char *port, int proto)
break;
}
- close(fd);
+ platform_net_socket_close(fd);
ret = MQTT_CONNECT_FAILED_ERROR;
}
@@ -57,7 +57,7 @@ int platform_net_socket_connect(const char *host, const char *port, int proto)
int platform_net_socket_recv(int fd, void *buf, size_t len, int flags)
{
-#ifdef MQTT_NETSOCKET_USE_AT
+#ifdef MQTT_NETSOCKET_USING_AT
return tos_sal_module_recv(fd, buf, len);
#else
return recv(fd, buf, len, flags);
@@ -66,39 +66,44 @@ int platform_net_socket_recv(int fd, void *buf, size_t len, int flags)
int platform_net_socket_recv_timeout(int fd, unsigned char *buf, int len, int timeout)
{
-#ifdef MQTT_NETSOCKET_USE_AT
+#ifdef MQTT_NETSOCKET_USING_AT
return tos_sal_module_recv_timeout(fd, buf, len, timeout);
#else
- int rc;
- int bytes = 0;
- struct timeval tv = {
+ int nread;
+ int nleft = len;
+ unsigned char *ptr;
+ ptr = buf;
+
+ struct timeval tv = {
timeout / 1000,
(timeout % 1000) * 1000
};
- if (tv.tv_sec < 0 || (tv.tv_sec == 0 && tv.tv_usec <= 0)) {
- tv.tv_sec = 0;
- tv.tv_usec = 100;
- }
+ if (tv.tv_sec < 0 || (tv.tv_sec == 0 && tv.tv_usec <= 0)) {
+ tv.tv_sec = 0;
+ tv.tv_usec = 100;
+ }
- platform_net_socket_setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));
+ platform_net_socket_setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));
- while (bytes < len) {
- rc = platform_net_socket_recv(fd, &buf[bytes], (size_t)(len - bytes), 0);
- if (rc <= 0) {
- bytes = rc;
- break;
- } else {
- bytes += rc;
- }
- }
- return bytes;
+ while (nleft > 0) {
+ nread = platform_net_socket_recv(fd, ptr, nleft, 0);
+ if (nread < 0) {
+ return -1;
+ } else if (nread == 0) {
+ break;
+ }
+
+ nleft -= nread;
+ ptr += nread;
+ }
+ return len - nleft;
#endif
}
int platform_net_socket_write(int fd, void *buf, size_t len)
{
-#ifdef MQTT_NETSOCKET_USE_AT
+#ifdef MQTT_NETSOCKET_USING_AT
return tos_sal_module_send(fd, buf, len);
#else
return write(fd, buf, len);
@@ -107,20 +112,20 @@ int platform_net_socket_write(int fd, void *buf, size_t len)
int platform_net_socket_write_timeout(int fd, unsigned char *buf, int len, int timeout)
{
-#ifdef MQTT_NETSOCKET_USE_AT
+#ifdef MQTT_NETSOCKET_USING_AT
return tos_sal_module_send(fd, buf, len);
#else
- struct timeval tv = {
+ struct timeval tv = {
timeout / 1000,
(timeout % 1000) * 1000
};
- if (tv.tv_sec < 0 || (tv.tv_sec == 0 && tv.tv_usec <= 0)) {
- tv.tv_sec = 0;
- tv.tv_usec = 100;
- }
+ if (tv.tv_sec < 0 || (tv.tv_sec == 0 && tv.tv_usec <= 0)) {
+ tv.tv_sec = 0;
+ tv.tv_usec = 100;
+ }
- platform_net_socket_setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv,sizeof(struct timeval));
+ platform_net_socket_setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv,sizeof(struct timeval));
return write(fd, buf, len);
#endif
@@ -128,14 +133,14 @@ int platform_net_socket_write_timeout(int fd, unsigned char *buf, int len, int t
int platform_net_socket_close(int fd)
{
-#ifdef MQTT_NETSOCKET_USE_AT
+#ifdef MQTT_NETSOCKET_USING_AT
return tos_sal_module_close(fd);
#else
return close(fd);
#endif
}
-#ifndef MQTT_NETSOCKET_USE_AT
+#ifndef MQTT_NETSOCKET_USING_AT
int platform_net_socket_set_block(int fd)
{
diff --git a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_net_socket.h b/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_net_socket.h
index ef696d92..e6e082b8 100644
--- a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_net_socket.h
+++ b/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_net_socket.h
@@ -2,16 +2,16 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-15 13:39:00
- * @LastEditTime: 2020-02-19 01:02:51
+ * @LastEditTime: 2020-04-27 23:46:35
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
#ifndef _PLATFORM_NET_SOCKET_H_
#define _PLATFORM_NET_SOCKET_H_
#include "network.h"
-#include "error.h"
+#include "mqtt_error.h"
-#ifdef MQTT_NETSOCKET_USE_AT
+#ifdef MQTT_NETSOCKET_USING_AT
#include "sal_module_wrapper.h"
@@ -35,7 +35,7 @@ int platform_net_socket_write(int fd, void *buf, size_t len);
int platform_net_socket_write_timeout(int fd, unsigned char *buf, int len, int timeout);
int platform_net_socket_close(int fd);
-#ifndef MQTT_NETSOCKET_USE_AT
+#ifndef MQTT_NETSOCKET_USING_AT
int platform_net_socket_set_block(int fd);
int platform_net_socket_set_nonblock(int fd);
int platform_net_socket_setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen);
diff --git a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_nettype_tcp.c b/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_nettype_tcp.c
deleted file mode 100644
index f6b918ac..00000000
--- a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_nettype_tcp.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * @Author: jiejie
- * @Github: https://github.com/jiejieTop
- * @Date: 2019-12-15 13:38:52
- * @LastEditTime : 2020-02-16 02:22:48
- * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
- */
-#include "platform_nettype_tcp.h"
-#include "log.h"
-
-int platform_nettype_tcp_read(network_t *n, unsigned char *read_buf, int len, int timeout)
-{
- return platform_net_socket_recv_timeout(n->socket, read_buf, len, timeout);
-}
-
-int platform_nettype_tcp_write(network_t *n, unsigned char *write_buf, int len, int timeout)
-{
- return platform_net_socket_write_timeout(n->socket, write_buf, len, timeout);
-}
-
-int platform_nettype_tcp_connect(network_t* n)
-{
- if (n->socket >= 0) {
- platform_net_socket_close(n->socket); // prevent opening too many fd descriptors
- }
-
- n->socket = platform_net_socket_connect(n->network_params.addr, n->network_params.port, PLATFORM_NET_PROTO_TCP);
- if (n->socket < 0)
- RETURN_ERROR(n->socket);
-
- RETURN_ERROR(MQTT_SUCCESS_ERROR);
-}
-
-void platform_nettype_tcp_disconnect(network_t* n)
-{
- if (NULL != n)
- platform_net_socket_close(n->socket);
- n->socket = -1;
-}
diff --git a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_nettype_tcp.h b/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_nettype_tcp.h
deleted file mode 100644
index 583fc3ad..00000000
--- a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_nettype_tcp.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * @Author: jiejie
- * @Github: https://github.com/jiejieTop
- * @Date: 2019-12-15 13:39:00
- * @LastEditTime : 2020-01-10 23:48:41
- * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
- */
-#ifndef _PLATFORM_NETTYPE_TCP_H_
-#define _PLATFORM_NETTYPE_TCP_H_
-
-#include "platform_net_socket.h"
-#include "network.h"
-#include "error.h"
-
-int platform_nettype_tcp_read(network_t *n, unsigned char *buf, int len, int timeout);
-int platform_nettype_tcp_write(network_t *n, unsigned char *buf, int len, int timeout);
-int platform_nettype_tcp_connect(network_t* n);
-void platform_nettype_tcp_disconnect(network_t* n);
-
-#endif
diff --git a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_thread.c b/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_thread.c
index 43d8a0ec..0c45cd5e 100644
--- a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_thread.c
+++ b/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_thread.c
@@ -18,18 +18,18 @@ platform_thread_t *platform_thread_init( const char *name,
platform_thread_t *thread;
k_err_t err;
k_stack_t *thread_stack;
- thread = platform_memory_calloc(1, sizeof(platform_thread_t));
+ thread = platform_memory_alloc(sizeof(platform_thread_t));
thread_stack = (k_stack_t*) platform_memory_alloc(stack_size);
-
- err = tos_task_create(&(thread->thread),
- (char*)name,
+
+ err = tos_task_create(&(thread->thread),
+ (char*)name,
entry,
- param,
- priority,
+ param,
+ priority,
thread_stack,
stack_size,
tick);
-
+
if(err != K_ERR_NONE) {
platform_memory_free(thread);
platform_memory_free(thread_stack);
diff --git a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_timer.c b/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_timer.c
index d6a68d90..580e8187 100644
--- a/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_timer.c
+++ b/components/connectivity/mqttclient/platform/TencentOS-tiny/platform_timer.c
@@ -2,7 +2,7 @@
* @Author: jiejie
* @Github: https://github.com/jiejieTop
* @Date: 2019-12-10 22:16:41
- * @LastEditTime : 2020-01-11 01:19:35
+ * @LastEditTime: 2020-04-27 22:37:33
* @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
*/
@@ -58,9 +58,13 @@ void platform_timer_usleep(unsigned long usec)
uint32_t ms;
k_tick_t tick;
- ms = usec / 1000;
- if (ms == 0) {
- ms = 1;
+ if(usec != 0) {
+
+ ms = usec / TOS_CFG_CPU_TICK_PER_SECOND;
+
+ if (ms == 0) {
+ ms = 1;
+ }
}
tick = tos_millisec2tick(ms);
diff --git a/components/connectivity/mqttclient/platform/TencentOS-tiny/sal/README.md b/components/connectivity/mqttclient/platform/TencentOS-tiny/sal/README.md
new file mode 100644
index 00000000..7fc85c77
--- /dev/null
+++ b/components/connectivity/mqttclient/platform/TencentOS-tiny/sal/README.md
@@ -0,0 +1,3 @@
+# 注æ„
+
+如果用的是AT模组,å¯ä»¥ç»“åˆTencentOS tinyçš„AT框架与SAL层使用platform_net_socket.c,替æ¢åŽŸæœ‰BSD socket 接å£å³å¯ã€‚
\ No newline at end of file
diff --git a/components/connectivity/mqttclient/platform/TencentOS-tiny/sal/platform_net_socket.c b/components/connectivity/mqttclient/platform/TencentOS-tiny/sal/platform_net_socket.c
new file mode 100644
index 00000000..7d1c22a0
--- /dev/null
+++ b/components/connectivity/mqttclient/platform/TencentOS-tiny/sal/platform_net_socket.c
@@ -0,0 +1,47 @@
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2020-01-10 23:45:59
+ * @LastEditTime : 2020-01-13 02:48:53
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#include "platform_net_socket.h"
+
+int platform_net_socket_connect(const char *host, const char *port, int proto)
+{
+ int fd;
+
+ fd = tos_sal_module_connect(host, port, TOS_SAL_PROTO_TCP);
+
+ if (fd < 0) {
+ return MQTT_CONNECT_FAILED_ERROR;
+ }
+
+ return fd;
+}
+
+int platform_net_socket_recv(int fd, void *buf, size_t len, int flags)
+{
+ return tos_sal_module_recv(fd, buf, len);
+}
+
+int platform_net_socket_recv_timeout(int fd, unsigned char *buf, int len, int timeout)
+{
+ return tos_sal_module_recv_timeout(fd, buf, len, timeout);
+}
+
+int platform_net_socket_write(int fd, void *buf, size_t len)
+{
+ return tos_sal_module_send(fd, buf, len);
+}
+
+int platform_net_socket_write_timeout(int fd, unsigned char *buf, int len, int timeout)
+{
+ return tos_sal_module_send(fd, buf, len);
+}
+
+int platform_net_socket_close(int fd)
+{
+ return tos_sal_module_close(fd);
+}
+
diff --git a/components/connectivity/mqttclient/platform/TencentOS-tiny/sal/platform_net_socket.h b/components/connectivity/mqttclient/platform/TencentOS-tiny/sal/platform_net_socket.h
new file mode 100644
index 00000000..8eb616b6
--- /dev/null
+++ b/components/connectivity/mqttclient/platform/TencentOS-tiny/sal/platform_net_socket.h
@@ -0,0 +1,25 @@
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2019-12-15 13:39:00
+ * @LastEditTime: 2020-02-19 01:02:51
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#ifndef _PLATFORM_NET_SOCKET_H_
+#define _PLATFORM_NET_SOCKET_H_
+
+#include "network.h"
+#include "mqtt_error.h"
+#include "stddef.h"
+
+#define PLATFORM_NET_PROTO_TCP 0 /**< The TCP transport protocol */
+#define PLATFORM_NET_PROTO_UDP 1 /**< The UDP transport protocol */
+
+int platform_net_socket_connect(const char *host, const char *port, int proto);
+int platform_net_socket_recv(int fd, void *buf, size_t len, int flags);
+int platform_net_socket_recv_timeout(int fd, unsigned char *buf, int len, int timeout);
+int platform_net_socket_write(int fd, void *buf, size_t len);
+int platform_net_socket_write_timeout(int fd, unsigned char *buf, int len, int timeout);
+int platform_net_socket_close(int fd);
+
+#endif /* _PLATFORM_NET_SOCKET_H_ */
diff --git a/components/connectivity/mqttclient/png/mqtt-tool.png b/components/connectivity/mqttclient/png/mqtt-tool.png
new file mode 100644
index 00000000..b65f1ec2
Binary files /dev/null and b/components/connectivity/mqttclient/png/mqtt-tool.png differ
diff --git a/components/connectivity/mqttclient/png/mqttclient.png b/components/connectivity/mqttclient/png/mqttclient.png
index c41da883..7b1548cc 100644
Binary files a/components/connectivity/mqttclient/png/mqttclient.png and b/components/connectivity/mqttclient/png/mqttclient.png differ
diff --git a/components/connectivity/mqttclient/test/CMakeLists.txt b/components/connectivity/mqttclient/test/CMakeLists.txt
new file mode 100644
index 00000000..f307e72f
--- /dev/null
+++ b/components/connectivity/mqttclient/test/CMakeLists.txt
@@ -0,0 +1,5 @@
+set(SUBDIRS "emqx" "onenet" "baidu" "ali")
+
+foreach(subdir ${SUBDIRS})
+ add_subdirectory(${subdir})
+endforeach()
diff --git a/components/connectivity/mqttclient/test/ali/CMakeLists.txt b/components/connectivity/mqttclient/test/ali/CMakeLists.txt
new file mode 100644
index 00000000..c4be88f2
--- /dev/null
+++ b/components/connectivity/mqttclient/test/ali/CMakeLists.txt
@@ -0,0 +1,12 @@
+aux_source_directory(. DIR_SRCS)
+
+set(INCDIRS ${CMAKE_CURRENT_SOURCE_DIR})
+
+add_executable("ali" ${DIR_SRCS})
+
+foreach(findlib ${LIBNAMES})
+ target_link_libraries("ali" ${findlib})
+endforeach()
+
+find_package("Threads")
+target_link_libraries("ali" ${CMAKE_THREAD_LIBS_INIT})
\ No newline at end of file
diff --git a/components/connectivity/mqttclient/test/ali/test.c b/components/connectivity/mqttclient/test/ali/test.c
new file mode 100644
index 00000000..ecf92bae
--- /dev/null
+++ b/components/connectivity/mqttclient/test/ali/test.c
@@ -0,0 +1,77 @@
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2019-12-11 21:53:07
+ * @LastEditTime: 2020-06-08 20:40:47
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#include
+#include
+#include
+#include
+#include
+#include "mqttclient.h"
+
+static void topic1_handler(void* client, message_data_t* msg)
+{
+ (void) client;
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+ MQTT_LOG_I("%s:%d %s()...\ntopic: %s\nmessage:%s", __FILE__, __LINE__, __FUNCTION__, msg->topic_name, (char*)msg->message->payload);
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+}
+
+void *mqtt_publish_thread(void *arg)
+{
+ mqtt_client_t *client = (mqtt_client_t *)arg;
+
+ char buf[100] = { 0 };
+ mqtt_message_t msg;
+ memset(&msg, 0, sizeof(msg));
+ sprintf(buf, "welcome to mqttclient, this is a publish test...");
+
+ sleep(2);
+
+ mqtt_list_subscribe_topic(client);
+
+ msg.payload = (void *) buf;
+ msg.qos = 0;
+ while(1) {
+ sprintf(buf, "welcome to mqttclient, this is a publish test, a rand number: %d ...", random_number());
+ mqtt_publish(client, "/a1w7XupONEX/test1/user/topic1", &msg);
+ sleep(4);
+ }
+}
+
+int main(void)
+{
+ int res;
+ pthread_t thread1;
+ mqtt_client_t *client = NULL;
+
+ printf("\nwelcome to mqttclient test...\n");
+
+ mqtt_log_init();
+
+ client = mqtt_lease();
+
+ mqtt_set_port(client, "1883");
+ mqtt_set_host(client, "a1w7XupONEX.iot-as-mqtt.cn-shanghai.aliyuncs.com");
+ mqtt_set_client_id(client, "123456|securemode=3,signmethod=hmacsha1|");
+ mqtt_set_user_name(client, "test1&a1w7XupONEX");
+ mqtt_set_password(client, "A9EFF34CCA05EABAE560373CBED3E43AC88956CF");
+ mqtt_set_clean_session(client, 1);
+
+ mqtt_connect(client);
+
+ mqtt_subscribe(client, "/a1w7XupONEX/test1/user/topic1", QOS0, topic1_handler);
+
+ res = pthread_create(&thread1, NULL, mqtt_publish_thread, client);
+ if(res != 0) {
+ MQTT_LOG_E("create mqtt publish thread fail");
+ exit(res);
+ }
+
+ while (1) {
+ sleep(100);
+ }
+}
diff --git a/components/connectivity/mqttclient/test/baidu/CMakeLists.txt b/components/connectivity/mqttclient/test/baidu/CMakeLists.txt
new file mode 100644
index 00000000..d8aab73e
--- /dev/null
+++ b/components/connectivity/mqttclient/test/baidu/CMakeLists.txt
@@ -0,0 +1,12 @@
+aux_source_directory(. DIR_SRCS)
+
+set(INCDIRS ${CMAKE_CURRENT_SOURCE_DIR})
+
+add_executable("baidu" ${DIR_SRCS})
+
+foreach(findlib ${LIBNAMES})
+ target_link_libraries("baidu" ${findlib})
+endforeach()
+
+find_package("Threads")
+target_link_libraries("baidu" ${CMAKE_THREAD_LIBS_INIT})
\ No newline at end of file
diff --git a/components/connectivity/mqttclient/test/baidu/test.c b/components/connectivity/mqttclient/test/baidu/test.c
new file mode 100644
index 00000000..7ad61bca
--- /dev/null
+++ b/components/connectivity/mqttclient/test/baidu/test.c
@@ -0,0 +1,109 @@
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2019-12-11 21:53:07
+ * @LastEditTime: 2020-06-08 20:38:41
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#include
+#include
+#include
+#include
+#include
+#include "mqttclient.h"
+
+// #define TEST_USEING_TLS
+
+static const char *test_baidu_ca_crt = {
+ "-----BEGIN CERTIFICATE-----\r\n"
+ "MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G\r\n"
+ "A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp\r\n"
+ "Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4\r\n"
+ "MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG\r\n"
+ "A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\r\n"
+ "hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8\r\n"
+ "RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT\r\n"
+ "gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm\r\n"
+ "KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd\r\n"
+ "QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ\r\n"
+ "XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw\r\n"
+ "DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o\r\n"
+ "LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU\r\n"
+ "RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp\r\n"
+ "jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK\r\n"
+ "6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX\r\n"
+ "mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs\r\n"
+ "Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH\r\n"
+ "WD9f\r\n"
+ "-----END CERTIFICATE-----"
+};
+
+static void topic1_handler(void* client, message_data_t* msg)
+{
+ (void) client;
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+ MQTT_LOG_I("%s:%d %s()...\ntopic: %s\nmessage:%s", __FILE__, __LINE__, __FUNCTION__, msg->topic_name, (char*)msg->message->payload);
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+}
+
+void *mqtt_publish_thread(void *arg)
+{
+ mqtt_client_t *client = (mqtt_client_t *)arg;
+
+ char buf[100] = { 0 };
+ mqtt_message_t msg;
+ memset(&msg, 0, sizeof(msg));
+ sprintf(buf, "welcome to mqttclient, this is a publish test...");
+
+ sleep(2);
+
+ mqtt_list_subscribe_topic(client);
+
+ msg.payload = (void *) buf;
+ msg.qos = 0;
+ while(1) {
+ sprintf(buf, "welcome to mqttclient, this is a publish test, a rand number: %d ...", random_number());
+ mqtt_publish(client, "topic1", &msg);
+ sleep(4);
+ }
+}
+
+int main(void)
+{
+ int res;
+ pthread_t thread1;
+ mqtt_client_t *client = NULL;
+
+ printf("\nwelcome to mqttclient test...\n");
+
+ mqtt_log_init();
+
+ client = mqtt_lease();
+
+#ifdef TEST_USEING_TLS
+ mqtt_set_port(client, "1884");
+ mqtt_set_ca(client, (char*)test_baidu_ca_crt);
+#else
+ mqtt_set_port(client, "1883");
+#endif
+
+ mqtt_set_host(client, "j6npr4w.mqtt.iot.gz.baidubce.com");
+ mqtt_set_client_id(client, random_string(10));
+ mqtt_set_user_name(client, "j6npr4w/mqtt-client-dev");
+ mqtt_set_password(client, "lcUhUs5VYLMSbrnB");
+ mqtt_set_clean_session(client, 1);
+
+ mqtt_connect(client);
+
+ mqtt_subscribe(client, "topic1", QOS0, topic1_handler);
+
+ res = pthread_create(&thread1, NULL, mqtt_publish_thread, client);
+ if(res != 0) {
+ MQTT_LOG_E("create mqtt publish thread fail");
+ exit(res);
+ }
+
+ while (1) {
+ sleep(100);
+ }
+}
diff --git a/components/connectivity/mqttclient/test/emqx/CMakeLists.txt b/components/connectivity/mqttclient/test/emqx/CMakeLists.txt
new file mode 100644
index 00000000..e9e2964c
--- /dev/null
+++ b/components/connectivity/mqttclient/test/emqx/CMakeLists.txt
@@ -0,0 +1,12 @@
+aux_source_directory(. DIR_SRCS)
+
+set(INCDIRS ${CMAKE_CURRENT_SOURCE_DIR})
+
+add_executable("emqx" ${DIR_SRCS})
+
+foreach(findlib ${LIBNAMES})
+ target_link_libraries("emqx" ${findlib})
+endforeach()
+
+find_package("Threads")
+target_link_libraries("emqx" ${CMAKE_THREAD_LIBS_INIT})
\ No newline at end of file
diff --git a/components/connectivity/mqttclient/test/emqx/test.c b/components/connectivity/mqttclient/test/emqx/test.c
new file mode 100644
index 00000000..7e20c514
--- /dev/null
+++ b/components/connectivity/mqttclient/test/emqx/test.c
@@ -0,0 +1,100 @@
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2019-12-11 21:53:07
+ * @LastEditTime: 2020-06-08 20:45:33
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#include
+#include
+#include
+#include
+#include
+
+#include "mqtt_config.h"
+#include "mqtt_log.h"
+#include "mqttclient.h"
+
+// #define TEST_USEING_TLS
+extern const char *test_ca_get();
+
+static void topic1_handler(void* client, message_data_t* msg)
+{
+ (void) client;
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+ MQTT_LOG_I("%s:%d %s()...\ntopic: %s\nmessage:%s", __FILE__, __LINE__, __FUNCTION__, msg->topic_name, (char*)msg->message->payload);
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+}
+
+void *mqtt_publish_thread(void *arg)
+{
+ mqtt_client_t *client = (mqtt_client_t *)arg;
+
+ char buf[100] = { 0 };
+ mqtt_message_t msg;
+ memset(&msg, 0, sizeof(msg));
+ sprintf(buf, "welcome to mqttclient, this is a publish test...");
+
+ sleep(2);
+
+ mqtt_list_subscribe_topic(client);
+
+ msg.payload = (void *) buf;
+
+ while(1) {
+ sprintf(buf, "welcome to mqttclient, this is a publish test, a rand number: %d ...", random_number());
+
+ msg.qos = 0;
+ mqtt_publish(client, "topic1", &msg);
+
+ msg.qos = 1;
+ mqtt_publish(client, "topic2", &msg);
+
+ msg.qos = 2;
+ mqtt_publish(client, "topic3", &msg);
+
+ sleep(4);
+ }
+}
+
+int main(void)
+{
+ int res;
+ pthread_t thread1;
+ mqtt_client_t *client = NULL;
+
+ printf("\nwelcome to mqttclient test...\n");
+
+ mqtt_log_init();
+
+ client = mqtt_lease();
+
+#ifdef TEST_USEING_TLS
+ mqtt_set_port(client, "8883");
+ mqtt_set_ca(client, (char*)test_ca_get());
+#else
+ mqtt_set_port(client, "1883");
+#endif
+
+ mqtt_set_host(client, "www.jiejie01.top");
+ mqtt_set_client_id(client, random_string(10));
+ mqtt_set_user_name(client, random_string(10));
+ mqtt_set_password(client, random_string(10));
+ mqtt_set_clean_session(client, 1);
+
+ mqtt_connect(client);
+
+ mqtt_subscribe(client, "topic1", QOS0, topic1_handler);
+ mqtt_subscribe(client, "topic2", QOS1, NULL);
+ mqtt_subscribe(client, "topic3", QOS2, NULL);
+
+ res = pthread_create(&thread1, NULL, mqtt_publish_thread, client);
+ if(res != 0) {
+ MQTT_LOG_E("create mqtt publish thread fail");
+ exit(res);
+ }
+
+ while (1) {
+ sleep(100);
+ }
+}
diff --git a/components/connectivity/mqttclient/test/emqx/test_ca.c b/components/connectivity/mqttclient/test/emqx/test_ca.c
new file mode 100644
index 00000000..d102d75b
--- /dev/null
+++ b/components/connectivity/mqttclient/test/emqx/test_ca.c
@@ -0,0 +1,75 @@
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2020-01-12 10:51:11
+ * @LastEditTime: 2020-03-21 21:07:24
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+static const char *test_ca_crt = {
+ "-----BEGIN CERTIFICATE-----\r\n"
+ "MIIFrTCCBJWgAwIBAgIQDApSGhCHMtFicAaXgcO0vjANBgkqhkiG9w0BAQsFADBy\r\n"
+ "MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg\r\n"
+ "SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy\r\n"
+ "dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIwMDEyOTAwMDAwMFoXDTIxMDQyODEyMDAw\r\n"
+ "MFowGzEZMBcGA1UEAxMQd3d3LmppZWppZTAxLnRvcDCCASIwDQYJKoZIhvcNAQEB\r\n"
+ "BQADggEPADCCAQoCggEBAKIDMo45w085LaCMG1LWY5b8V94zDqdt+weVhKolgsLZ\r\n"
+ "htAQTDrafBx1sNJtOpa8ADeQkFbWOTEy3tgViOBvBr+8Qhl6vYsESJrg7DXeCVRm\r\n"
+ "04pk+cFrdWYRE70AUz8RXRuaWLv1Fu2L+qlymrnZB/WBJFnETINh6yzqY8FNETUV\r\n"
+ "EL08eE0LoXt/4b7iAJYEFRYTyBKjLpkr04e92SQIuL/l42j92lYNOjYfYOlpWZUC\r\n"
+ "cp4WHXEDd1YXdTMmXpfsU3VlYS3RTusOFsgXpLFET9xGRvtDSu5qw6rPGf/y/PhT\r\n"
+ "1LFB/xlL2E6Rpo/6VWuQ8A5rA+H3D1I/fIBB97orMYUCAwEAAaOCApQwggKQMB8G\r\n"
+ "A1UdIwQYMBaAFH/TmfOgRw4xAFZWIo63zJ7dygGKMB0GA1UdDgQWBBQyzyOTN1l5\r\n"
+ "Rg1Ih1tQ0TPYMqfw+jApBgNVHREEIjAgghB3d3cuamllamllMDEudG9wggxqaWVq\r\n"
+ "aWUwMS50b3AwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr\r\n"
+ "BgEFBQcDAjBMBgNVHSAERTBDMDcGCWCGSAGG/WwBAjAqMCgGCCsGAQUFBwIBFhxo\r\n"
+ "dHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAgGBmeBDAECATCBkgYIKwYBBQUH\r\n"
+ "AQEEgYUwgYIwNAYIKwYBBQUHMAGGKGh0dHA6Ly9zdGF0dXNlLmRpZ2l0YWxjZXJ0\r\n"
+ "dmFsaWRhdGlvbi5jb20wSgYIKwYBBQUHMAKGPmh0dHA6Ly9jYWNlcnRzLmRpZ2l0\r\n"
+ "YWxjZXJ0dmFsaWRhdGlvbi5jb20vVHJ1c3RBc2lhVExTUlNBQ0EuY3J0MAkGA1Ud\r\n"
+ "EwQCMAAwggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdQB9PvL4j/+IVWgkwsDKnlKJ\r\n"
+ "eSvFDngJfy5ql2iZfiLw1wAAAW/wKSTgAAAEAwBGMEQCIGFq0FdvZfXf4lV20Am1\r\n"
+ "HRP6F7wxzkesK0r1566sNqvxAiBp5W3iTLWEgeJa/PfH5hX/d+K5CIyXScLa4qqa\r\n"
+ "MCLHwwB3AFzcQ5L+5qtFRLFemtRW5hA3+9X6R9yhc5SyXub2xw7KAAABb/ApJJIA\r\n"
+ "AAQDAEgwRgIhANEsjShyRf0GGpwJ6ZTQKBHo933rlSpaNIvor7cG8RBQAiEAkeDf\r\n"
+ "7+n+zyEGZUMOYI0E0R2chjPBJGvtw1yD12sxekowDQYJKoZIhvcNAQELBQADggEB\r\n"
+ "AIzaZ5X1So+xVe2JWkMfmJA8IQhdp9WghCDLRORcIggcY9BtYxFSBdusxIa1bhdt\r\n"
+ "rCY6RoepCwTrhV9PotwMgZtSOu8szHHRlqX8zNUhIh628yzPSTDDZ4xgeJvlGAkT\r\n"
+ "Zlv0XrezkDLRZkKN9R6KX1ccaPNbn9PD6SMtpHPbE7UEZYfrV3wAJhFzsyhp2JF4\r\n"
+ "KLLNPaeDgDM3Lu6tUm/bznDEyxi7/ZoR+7fSQAMF5Jo1ysKUAOC00I9Ne+7eSbTh\r\n"
+ "flV//8NBN+Z2ShCV0uFedf6ugDUMOuOUCtp0c7N+sM1IVE5MOhLRDAGRIUyi7/43\r\n"
+ "dJ0Okust1fXo4UTDGJtyp30=\r\n"
+ "-----END CERTIFICATE-----\r\n"
+ "-----BEGIN CERTIFICATE-----\r\n"
+ "MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh\r\n"
+ "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n"
+ "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\r\n"
+ "QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO\r\n"
+ "MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL\r\n"
+ "ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS\r\n"
+ "U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8\r\n"
+ "Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa\r\n"
+ "e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO\r\n"
+ "JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA\r\n"
+ "zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK\r\n"
+ "ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe\r\n"
+ "3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K\r\n"
+ "AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD\r\n"
+ "AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG\r\n"
+ "AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au\r\n"
+ "ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj\r\n"
+ "ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg\r\n"
+ "hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t\r\n"
+ "L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233\r\n"
+ "lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ\r\n"
+ "DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP\r\n"
+ "ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F\r\n"
+ "UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C\r\n"
+ "qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY\r\n"
+ "RmE=\r\n"
+ "-----END CERTIFICATE-----"
+};
+
+const char *test_ca_get()
+{
+ return test_ca_crt;
+}
diff --git a/components/connectivity/mqttclient/test/mqtt_config.h b/components/connectivity/mqttclient/test/mqtt_config.h
new file mode 100644
index 00000000..a90e6eee
--- /dev/null
+++ b/components/connectivity/mqttclient/test/mqtt_config.h
@@ -0,0 +1,46 @@
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @LastEditTime: 2020-06-17 19:31:41
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#ifndef _MQTT_CONFIG_H_
+#define _MQTT_CONFIG_H_
+
+#define MQTT_LOG_IS_SALOF
+
+#define MQTT_LOG_LEVEL MQTT_LOG_INFO_LEVEL //MQTT_LOG_WARN_LEVEL MQTT_LOG_DEBUG_LEVEL
+
+#ifdef MQTT_LOG_IS_SALOF
+ #define SALOF_USING_LOG (1U)
+ #define SALOF_USING_SALOF (1U)
+ #define SALOF_LOG_LEVEL MQTT_LOG_LEVEL
+ #define SALOF_OS SALOF_USING_LINUX
+ #define SALOF_USING_IDLE_HOOK (0U)
+ #define SALOF_LOG_COLOR (1U)
+ #define SALOF_LOG_TS (0U)
+ #define SALOF_LOG_TAR (0U)
+ #define SALOF_BUFF_SIZE 512
+ #define SALOF_FIFO_SIZE 4096
+ #define SALOF_TASK_STACK_SIZE 1024
+ #define SALOF_TASK_TICK 50
+#endif
+
+#define MQTT_MAX_PACKET_ID (0xFFFF - 1)
+#define MQTT_TOPIC_LEN_MAX 64
+#define MQTT_ACK_HANDLER_NUM_MAX 64
+#define MQTT_DEFAULT_BUF_SIZE 1024
+#define MQTT_DEFAULT_CMD_TIMEOUT 5000
+#define MQTT_MAX_CMD_TIMEOUT 20000
+#define MQTT_MIN_CMD_TIMEOUT 1000
+#define MQTT_KEEP_ALIVE_INTERVAL 50 // unit: second
+#define MQTT_VERSION 4 // 4 is mqtt 3.1.1
+#define MQTT_RECONNECT_DEFAULT_DURATION 1000
+#define MQTT_THREAD_STACK_SIZE 2048
+#define MQTT_THREAD_PRIO 5
+#define MQTT_THREAD_TICK 50
+
+
+// #define MQTT_NETWORK_TYPE_NO_TLS
+
+#endif /* _MQTT_CONFIG_H_ */
diff --git a/components/connectivity/mqttclient/test/onenet/CMakeLists.txt b/components/connectivity/mqttclient/test/onenet/CMakeLists.txt
new file mode 100644
index 00000000..42fdcac7
--- /dev/null
+++ b/components/connectivity/mqttclient/test/onenet/CMakeLists.txt
@@ -0,0 +1,12 @@
+aux_source_directory(. DIR_SRCS)
+
+set(INCDIRS ${CMAKE_CURRENT_SOURCE_DIR})
+
+add_executable("onenet" ${DIR_SRCS})
+
+foreach(findlib ${LIBNAMES})
+ target_link_libraries("onenet" ${findlib})
+endforeach()
+
+find_package("Threads")
+target_link_libraries("onenet" ${CMAKE_THREAD_LIBS_INIT})
\ No newline at end of file
diff --git a/components/connectivity/mqttclient/test/onenet/test.c b/components/connectivity/mqttclient/test/onenet/test.c
new file mode 100644
index 00000000..f4fc7d84
--- /dev/null
+++ b/components/connectivity/mqttclient/test/onenet/test.c
@@ -0,0 +1,78 @@
+/*
+ * @Author: jiejie
+ * @Github: https://github.com/jiejieTop
+ * @Date: 2020-04-18 12:37:34
+ * @LastEditTime: 2020-06-08 20:32:33
+ * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
+ */
+#include
+#include
+#include
+#include
+#include
+#include "mqttclient.h"
+
+extern const char *test_ca_get();
+
+
+static void interceptor_handler(void* client, message_data_t* msg)
+{
+ (void) client;
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+ MQTT_LOG_I("%s:%d %s()...\ntopic: %s\nmessage:%s", __FILE__, __LINE__, __FUNCTION__, msg->topic_name, (char*)msg->message->payload);
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+}
+
+void *mqtt_publish_thread(void *arg)
+{
+ mqtt_client_t *client = (mqtt_client_t *)arg;
+
+ char buf[100] = { 0 };
+ mqtt_message_t msg;
+ memset(&msg, 0, sizeof(msg));
+ sprintf(buf, "welcome to mqttclient, this is a publish test...");
+
+ msg.qos = 0;
+ msg.payload = (void *) buf;
+ while(1) {
+ sprintf(buf, "welcome to mqttclient, this is a publish test, a rand number: %d ...", random_number());
+ mqtt_publish(client, "topic1", &msg);
+ sleep(4);
+ }
+}
+
+int main(void)
+{
+ int res;
+ pthread_t thread1;
+ mqtt_client_t *client = NULL;
+
+ printf("\nwelcome to mqttclient test...\n");
+
+ mqtt_log_init();
+
+ client = mqtt_lease();
+
+ mqtt_set_port(client, "6002");
+ mqtt_set_host(client, "183.230.40.39");
+ mqtt_set_client_id(client, "599908192");
+ mqtt_set_user_name(client, "348547");
+ mqtt_set_password(client, "mqttclienttest1");
+ mqtt_set_clean_session(client, 1);
+
+ mqtt_connect(client);
+
+ mqtt_subscribe(client, "topic1", QOS0, NULL);
+
+ mqtt_set_interceptor_handler(client, interceptor_handler); // set interceptor handler
+
+ res = pthread_create(&thread1, NULL, mqtt_publish_thread, client);
+ if(res != 0) {
+ MQTT_LOG_E("create mqtt publish thread fail");
+ exit(res);
+ }
+
+ while (1) {
+ sleep(100);
+ }
+}
\ No newline at end of file
diff --git a/components/elfloader/common/include/elf/elf32.h b/components/elfloader/common/include/elf/elf32.h
new file mode 100644
index 00000000..915a2fa0
--- /dev/null
+++ b/components/elfloader/common/include/elf/elf32.h
@@ -0,0 +1,183 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
+#ifndef _ELF32_H_
+#define _ELF32_H_
+
+#define EI_NIDENT 16
+
+typedef int32_t elf32_sword;
+typedef uint32_t elf32_word;
+typedef uint16_t elf32_half;
+typedef uint32_t elf32_off;
+typedef uint32_t elf32_addr;
+
+/* elf header */
+typedef struct elf32_ehdr {
+ unsigned char e_ident[EI_NIDENT]; /* ident bytes */
+ elf32_half e_type; /* file type */
+ elf32_half e_machine; /* target machine */
+ elf32_word e_version; /* file version */
+ elf32_addr e_entry; /* start address */
+ elf32_off e_phoff; /* phdr file offset */
+ elf32_off e_shoff; /* shdr file offset */
+ elf32_word e_flags; /* file flags */
+ elf32_half e_ehsize; /* sizeof ehdr */
+ elf32_half e_phentsize; /* sizeof phdr */
+ elf32_half e_phnum; /* number phdrs */
+ elf32_half e_shentsize; /* sizeof shdr */
+ elf32_half e_shnum; /* number shdrs */
+ elf32_half e_shstrndx; /* shdr string index */
+} elf32_ehdr_t;
+
+/* values for e_type. */
+#define ET_NONE 0 /* unknown type. */
+#define ET_REL 1 /* relocatable. */
+#define ET_EXEC 2 /* executable. */
+#define ET_DYN 3 /* shared object. */
+
+/* section header */
+typedef struct elf32_shdr {
+ elf32_word sh_name; /* section name */
+ elf32_word sh_type; /* SHT_... */
+ elf32_word sh_flags; /* SHF_... */
+ elf32_addr sh_addr; /* virtual address */
+ elf32_off sh_offset; /* file offset */
+ elf32_word sh_size; /* section size */
+ elf32_word sh_link; /* misc info */
+ elf32_word sh_info; /* misc info */
+ elf32_word sh_addralign; /* memory alignment */
+ elf32_word sh_entsize; /* entry size if table */
+} elf32_shdr_t;
+
+/* values for sh_type */
+#define SHT_NULL 0 /* inactive */
+#define SHT_PROGBITS 1 /* program defined information */
+#define SHT_SYMTAB 2 /* symbol table section */
+#define SHT_STRTAB 3 /* string table section */
+#define SHT_RELA 4 /* relocation section with addends*/
+#define SHT_HASH 5 /* symbol hash table section */
+#define SHT_DYNAMIC 6 /* dynamic section */
+#define SHT_NOTE 7 /* note section */
+#define SHT_NOBITS 8 /* no space section */
+#define SHT_REL 9 /* relation section without addends */
+#define SHT_SHLIB 10 /* reserved - purpose unknown */
+#define SHT_DYNSYM 11 /* dynamic symbol table section */
+#define SHT_LOPROC 0x70000000 /* reserved range for processor */
+#define SHT_HIPROC 0x7fffffff /* specific section header types */
+#define SHT_LOUSER 0x80000000 /* reserved range for application */
+#define SHT_HIUSER 0xffffffff /* specific indexes */
+
+/* values for sh_flags */
+#define SHF_WRITE 1 /* writable */
+#define SHF_ALLOC 2 /* occupies memory */
+#define SHF_EXECINSTR 4 /* executable */
+
+typedef struct elf32_rel {
+ elf32_addr r_offset; /* location to be relocated. */
+ elf32_word r_info; /* relocation type and symbol index. */
+} elf32_rel_t;
+
+typedef struct elf32_rela {
+ elf32_addr r_offset; /* location to be relocated. */
+ elf32_word r_info; /* relocation type and symbol index. */
+ elf32_sword r_addend; /* addend. */
+} elf32_rela_t;
+
+typedef struct elf32_sym {
+ elf32_word st_name; /* string table index of name. */
+ elf32_addr st_value; /* symbol value. */
+ elf32_word st_size; /* size of associated object. */
+ unsigned char st_info; /* type and binding information. */
+ unsigned char st_other; /* reserved (not used). */
+ elf32_half st_shndx; /* section index of symbol. */
+} elf32_sym_t;
+
+/* values for st_info(binding) */
+#define STB_LOCAL 0
+#define STB_GLOBAL 1
+#define STB_WEAK 2
+
+/* values for st_info(type) */
+#define STT_NOTYPE 0
+#define STT_OBJECT 1
+#define STT_FUNC 2
+#define STT_SECTION 3
+#define STT_FILE 4
+
+/* values for st_shndx */
+#define SHN_ABS 0xFFF1
+#define SHN_COMMON 0xFFF2
+#define SHN_UNDEF 0x0000
+
+#define ELF32_SYM_BINDING(info) ((info) >> 4)
+#define ELF32_SYM_TYPE(info) ((info) & 0x0F)
+
+typedef struct elf32_dyn {
+ elf32_sword d_tag; /* DT_... */
+ union {
+ elf32_word d_val;
+ elf32_addr d_ptr;
+ } d_un;
+} elf32_dyn_t;
+
+/* values for d_tag */
+#define DT_NULL 0x00
+#define DT_PLTRELSZ 0x02
+#define DT_PLTGOT 0x03
+#define DT_HASH 0x04
+#define DT_STRTAB 0x05
+#define DT_SYMTAB 0x06
+#define DT_STRSZ 0x0a
+#define DT_SYMENT 0x0b
+#define DT_REL 0x11
+#define DT_RELSZ 0x12
+#define DT_RELENT 0x13
+#define DT_PLTREL 0x14
+#define DT_JMPREL 0x17
+
+/* program header */
+typedef struct elf32_phdr {
+ elf32_word p_type; /* PHT_... */
+ elf32_off p_offset; /* file offset */
+ elf32_addr p_vaddr; /* virtual address */
+ elf32_addr p_paddr; /* physical address */
+ elf32_word p_filesz; /* file size */
+ elf32_word p_memsz; /* memory size */
+ elf32_word p_flags; /* read write properties */
+ elf32_word p_align; /* alignment attribute, 2 ^ p_align */
+} elf32_phdr_t;
+
+/* values for p_type */
+#define PHT_LOAD 0x01
+#define PHT_DYNAMIC 0x02
+
+#define ELF32_R_SYM(info) ((info) >> 8)
+#define ELF32_R_TYPE(info) ((unsigned char)(info))
+
+#define ELF_MAGIC_HEADER "\177ELF\001\001\001"
+#define ELF_MAGIC_HEADER_SIZE 7
+
+static const unsigned char elf_header_magic[] = {
+ 0x7f, 0x45, 0x4c, 0x46, /* Magic: 0x7f, 'E', 'L', 'F' */
+ 0x01, /* Class: ELF32 */
+ 0x01, /* Data: 2's complement, 'little endian */
+ 0x01, /* Version: 1(current) */
+};
+
+#endif /* _ELF32_H_ */
+
diff --git a/components/elfloader/common/include/tos_elfloader.h b/components/elfloader/common/include/tos_elfloader.h
new file mode 100644
index 00000000..e76a3807
--- /dev/null
+++ b/components/elfloader/common/include/tos_elfloader.h
@@ -0,0 +1,74 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
+#ifndef _TOS_ELFLOADER_H_
+#define _TOS_ELFLOADER_H_
+
+#include "tos_k.h"
+
+#include "elf/elf32.h"
+
+#include "tos_elfloader_err.h"
+#include "tos_elfloader_fd_read.h"
+#include "tos_elfloader_symbol.h"
+#include "tos_elfloader_symtab.h"
+#include "tos_elfloader_relocate.h"
+
+typedef struct el_section_st {
+ int8_t shndx;
+ void *address;
+} el_section_t;
+
+typedef struct el_obj_info_st {
+ el_section_t bss;
+ el_section_t data;
+ el_section_t rodata;
+ el_section_t text;
+} el_obj_info_t;
+
+typedef struct el_so_info_st {
+ int32_t load_bias;
+} el_so_info_t;
+
+typedef union el_info_un {
+ el_obj_info_t obj;
+ el_so_info_t so;
+} el_info_t;
+
+typedef struct el_module_st {
+ int fd;
+
+ void *base;
+
+ el_info_t info;
+
+ uint32_t symtab_offset;
+ uint32_t symtab_size;
+ uint32_t symtab_entsize;
+
+ uint32_t strtab_offset;
+} el_module_t;
+
+__API__ el_err_t tos_elfloader_load(el_module_t *module, int fd);
+
+__API__ el_err_t tos_elfloader_unload(el_module_t *module);
+
+__API__ void *tos_elfloader_find_symbol(el_module_t *module, char *symbol);
+
+
+#endif /* _TOS_ELFLOADER_H_ */
+
diff --git a/components/elfloader/common/include/tos_elfloader_err.h b/components/elfloader/common/include/tos_elfloader_err.h
new file mode 100644
index 00000000..fcee38d7
--- /dev/null
+++ b/components/elfloader/common/include/tos_elfloader_err.h
@@ -0,0 +1,39 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
+#ifndef _TOS_ELFLOADER_ERR_H_
+#define _TOS_ELFLOADER_ERR_H_
+
+typedef enum elfloader_err_en {
+ ELFLOADER_ERR_NONE,
+ ELFLOADER_ERR_FD_READ_FAILED,
+ ELFLOADER_ERR_HEADER_INVALID,
+ ELFLOADER_ERR_NO_DYN,
+ ELFLOADER_ERR_NO_SYMTAB,
+ ELFLOADER_ERR_NO_STRTAB,
+ ELFLOADER_ERR_NO_TEXT,
+ ELFLOADER_ERR_NO_LOAD_SEGMENTS,
+ ELFLOADER_ERR_OUT_OF_MEMORY,
+ ELFLOADER_ERR_RELOCATE_FAILED,
+ ELFLOADER_ERR_PTR_NULL,
+ ELFLOADER_ERR_SECTION_NOT_FOUND,
+ ELFLOADER_ERR_SYM_NOT_FOUND,
+ ELFLOADER_ERR_TYPE_INVALID,
+} el_err_t;
+
+#endif /* _TOS_ELFLOADER_ERR_H_ */
+
diff --git a/components/elfloader/common/include/tos_elfloader_fd_read.h b/components/elfloader/common/include/tos_elfloader_fd_read.h
new file mode 100644
index 00000000..d504768a
--- /dev/null
+++ b/components/elfloader/common/include/tos_elfloader_fd_read.h
@@ -0,0 +1,24 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
+#ifndef _TOS_ELFLOADER_FD_READ_H_
+#define _TOS_ELFLOADER_FD_READ_H_
+
+__KNL__ el_err_t elfloader_fd_read(int fd, uint32_t offset, void *buf, size_t len);
+
+#endif /* _TOS_ELFLOADER_FD_READ_H_ */
+
diff --git a/components/elfloader/common/include/tos_elfloader_relocate.h b/components/elfloader/common/include/tos_elfloader_relocate.h
new file mode 100644
index 00000000..86ed8aae
--- /dev/null
+++ b/components/elfloader/common/include/tos_elfloader_relocate.h
@@ -0,0 +1,24 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
+#ifndef _TOS_ELFLOADER_RELOCATE_H_
+#define _TOS_ELFLOADER_RELOCATE_H_
+
+__KNL__ el_err_t elfloader_arch_relocate(uint32_t reloc_addr, int32_t load_bias, uint32_t addr, elf32_rela_t *rela, int is_rela, elf32_sym_t *sym);
+
+#endif /* _TOS_ELFLOADER_RELOCATE_H_ */
+
diff --git a/components/elfloader/common/include/tos_elfloader_symbol.h b/components/elfloader/common/include/tos_elfloader_symbol.h
new file mode 100644
index 00000000..bc61c43b
--- /dev/null
+++ b/components/elfloader/common/include/tos_elfloader_symbol.h
@@ -0,0 +1,29 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
+#ifndef _TOS_ELFLOADER_SYMBOL_H_
+#define _TOS_ELFLOADER_SYMBOL_H_
+
+typedef struct el_symbol_st {
+ const char *name;
+ void *value;
+} el_symbol_t;
+
+extern const el_symbol_t el_symbols[];
+
+#endif /* _TOS_ELFLOADER_SYMBOL_H_ */
+
diff --git a/components/elfloader/common/include/tos_elfloader_symtab.h b/components/elfloader/common/include/tos_elfloader_symtab.h
new file mode 100644
index 00000000..2bdf478b
--- /dev/null
+++ b/components/elfloader/common/include/tos_elfloader_symtab.h
@@ -0,0 +1,24 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
+#ifndef _TOS_ELFLOADER_SYMTAB_H_
+#define _TOS_ELFLOADER_SYMTAB_H_
+
+__KNL__ void *elfloader_symtab_lookup(char *name);
+
+#endif /* _TOS_ELFLOADER_SYMTAB_H_ */
+
diff --git a/components/elfloader/common/tos_elfloader_fd_read-vfs.c b/components/elfloader/common/tos_elfloader_fd_read-vfs.c
new file mode 100644
index 00000000..8ac9a7c0
--- /dev/null
+++ b/components/elfloader/common/tos_elfloader_fd_read-vfs.c
@@ -0,0 +1,40 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
+#include "tos_vfs.h"
+#include "tos_elfloader.h"
+
+/*
+ ATTENTION:
+ if you wanna load the so/obj laying on your flash, you should implement "elfloader_fd_read"
+ with flash driver read/write operation.
+
+ very easy to use whether your module is on a file system or raw flash.
+ */
+__KNL__ __WEAK__ el_err_t elfloader_fd_read(int fd, uint32_t offset, void *buf, size_t len)
+{
+ if (tos_vfs_lseek(fd, (vfs_off_t)offset, VFS_SEEK_SET) < 0) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ if (tos_vfs_read(fd, buf, len) < 0) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ return ELFLOADER_ERR_NONE;
+}
+
diff --git a/components/elfloader/common/tos_elfloader_relocate-arm.c b/components/elfloader/common/tos_elfloader_relocate-arm.c
new file mode 100644
index 00000000..8fd12eb5
--- /dev/null
+++ b/components/elfloader/common/tos_elfloader_relocate-arm.c
@@ -0,0 +1,221 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
+#include "tos_elfloader.h"
+
+/* values for ELF32_R_TYPE(info) */
+#define R_ARM_NONE 0
+#define R_ARM_PC24 1
+#define R_ARM_ABS32 2
+#define R_ARM_THM_CALL 10
+#define R_ARM_GLOB_DAT 21
+#define R_ARM_JUMP_SLOT 22
+#define R_ARM_RELATIVE 23
+#define R_ARM_CALL 28
+#define R_ARM_JUMP24 29
+#define R_ARM_THM_JUMP24 30
+#define R_ARM_TARGET1 38
+#define R_ARM_V4BX 40
+#define R_ARM_PREL31 42
+#define R_ARM_MOVW_ABS_NC 43
+#define R_ARM_MOVT_ABS 44
+#define R_ARM_THM_MOVW_ABS_NC 47
+#define R_ARM_THM_MOVT_ABS 48
+
+/*
+ - S (when used on its own) is the address of the symbol.
+ - A is the addend for the relocation.
+ - P is the address of the place being relocated (derived from r_offset).
+ - Pa is the adjusted address of the place being relocated, defined as (P & 0xFFFFFFFC).
+ - T is 1 if the target symbol S has type STT_FUNC and the symbol addresses a Thumb instruction; it is 0
+otherwise.
+ - B(S) is the addressing origin of the output segment defining the symbol S. The origin is not required to be the
+base address of the segment. This value must always be word-aligned.
+ - GOT_ORG is the addressing origin of the Global Offset Table (the indirection table for imported data
+addresses). This value must always be word-aligned. See §4.6.1.8, Proxy generating relocations.
+ - GOT(S) is the address of the GOT entry for the symbol S.
+*/
+
+__KNL__ el_err_t elfloader_arch_relocate(uint32_t reloc_addr, int32_t load_bias, uint32_t addr, elf32_rela_t *rela, int is_rela, elf32_sym_t *sym)
+{
+ /* ATTENTION:
+ different reloc_addr calculation algorithm for relocatable object and shared object
+ */
+ int32_t offset;
+ uint32_t tmp;
+ uint32_t upper, lower, sign, j1, j2;
+
+ switch (ELF32_R_TYPE(rela->r_info)) {
+ case R_ARM_NONE:
+ /* ignore */
+ break;
+
+ case R_ARM_ABS32:
+ case R_ARM_TARGET1:
+ /* (S + A) | T */
+ *(uint32_t *)reloc_addr += addr;
+ break;
+
+ case R_ARM_PC24:
+ case R_ARM_CALL:
+ case R_ARM_JUMP24:
+ /* ((S + A) | T) – P */
+ if (addr & 3) {
+ tos_kprintf("unsupported interworking call(ARM -> Thumb)\n");
+ return ELFLOADER_ERR_RELOCATE_FAILED;
+ }
+
+ offset = *(uint32_t *)reloc_addr;
+ offset = (offset & 0x00ffffff) << 2;
+ if (offset & 0x02000000) {
+ offset -= 0x04000000;
+ }
+
+ offset += addr - reloc_addr;
+
+ if (offset <= (int32_t)0xfe000000 || offset >= (int32_t)0x02000000) {
+ tos_kprintf("relocation out of range\n");
+ return ELFLOADER_ERR_RELOCATE_FAILED;
+ }
+
+ offset >>= 2;
+ offset &= 0x00ffffff;
+
+ *(uint32_t *)reloc_addr &= 0xff000000;
+ *(uint32_t *)reloc_addr |= offset;
+ break;
+
+ case R_ARM_V4BX:
+ *(uint32_t *)reloc_addr &= 0xf000000f;
+ *(uint32_t *)reloc_addr |= 0x01a0f000;
+ break;
+
+ case R_ARM_PREL31:
+ /* ((S + A) | T) – P */
+ offset = (*(int32_t *)reloc_addr << 1) >> 1; /* sign extend */
+ offset += addr - reloc_addr;
+
+ if (offset >= 0x40000000 || offset < -0x40000000) {
+ tos_kprintf("relocation out of range\n");
+ return ELFLOADER_ERR_RELOCATE_FAILED;
+ }
+
+ *(uint32_t *)reloc_addr &= 0x80000000;
+ *(uint32_t *)reloc_addr |= offset & 0x7fffffff;
+ break;
+
+ case R_ARM_GLOB_DAT:
+ case R_ARM_JUMP_SLOT:
+ /* (S + A) | T */
+ *(uint32_t *)reloc_addr = addr;
+ break;
+
+ case R_ARM_MOVW_ABS_NC:
+ case R_ARM_MOVT_ABS:
+ offset = tmp = *(uint32_t *)reloc_addr;
+ offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff);
+ offset = (offset ^ 0x8000) - 0x8000;
+
+ offset += addr;
+ if (ELF32_R_TYPE(rela->r_info) == R_ARM_MOVT_ABS) {
+ offset >>= 16;
+ }
+
+ tmp &= 0xfff0f000;
+ tmp |= ((offset & 0xf000) << 4) | (offset & 0x0fff);
+
+ *(uint32_t *)reloc_addr = tmp;
+ break;
+
+ case R_ARM_THM_CALL:
+ case R_ARM_THM_JUMP24:
+ if (ELF32_SYM_TYPE(sym->st_info) == STT_FUNC && !(addr & 1)) {
+ tos_kprintf("unsupported interworking call(Thumb -> ARM)\n");
+ return ELFLOADER_ERR_RELOCATE_FAILED;
+ }
+
+ upper = *(uint16_t *)reloc_addr;
+ lower = *(uint16_t *)(reloc_addr + 2);
+
+ sign = (upper >> 10) & 1;
+ j1 = (lower >> 13) & 1;
+ j2 = (lower >> 11) & 1;
+ offset = (sign << 24) | ((~(j1 ^ sign) & 1) << 23) |
+ ((~(j2 ^ sign) & 1) << 22) |
+ ((upper & 0x03ff) << 12) |
+ ((lower & 0x07ff) << 1);
+ if (offset & 0x01000000) {
+ offset -= 0x02000000;
+ }
+ offset += addr - reloc_addr;
+
+ if (offset <= (int32_t)0xff000000 || offset >= (int32_t)0x01000000) {
+ tos_kprintf("relocation out of range\n");
+ return ELFLOADER_ERR_RELOCATE_FAILED;
+ }
+
+ sign = (offset >> 24) & 1;
+ j1 = sign ^ (~(offset >> 23) & 1);
+ j2 = sign ^ (~(offset >> 22) & 1);
+ upper = (uint16_t)((upper & 0xf800) | (sign << 10) |
+ ((offset >> 12) & 0x03ff));
+ lower = (uint16_t)((lower & 0xd000) |
+ (j1 << 13) | (j2 << 11) |
+ ((offset >> 1) & 0x07ff));
+
+ *(uint16_t *)reloc_addr = (uint16_t)upper;
+ *(uint16_t *)(reloc_addr + 2) = (uint16_t)lower;
+ break;
+
+ case R_ARM_THM_MOVW_ABS_NC:
+ case R_ARM_THM_MOVT_ABS:
+ upper = *(uint16_t *)reloc_addr;
+ lower = *(uint16_t *)(reloc_addr + 2);
+
+ offset = ((upper & 0x000f) << 12) |
+ ((upper & 0x0400) << 1) |
+ ((lower & 0x7000) >> 4) | (lower & 0x00ff);
+ offset = (offset ^ 0x8000) - 0x8000;
+ offset += addr;
+
+ if (ELF32_R_TYPE(rela->r_info) == R_ARM_THM_MOVT_ABS) {
+ offset >>= 16;
+ }
+
+ upper = (uint16_t)((upper & 0xfbf0) |
+ ((offset & 0xf000) >> 12) |
+ ((offset & 0x0800) >> 1));
+ lower = (uint16_t)((lower & 0x8f00) |
+ ((offset & 0x0700) << 4) |
+ (offset & 0x00ff));
+ *(uint16_t *)reloc_addr = (uint16_t)upper;
+ *(uint16_t *)(reloc_addr + 2) = (uint16_t)lower;
+ break;
+
+ case R_ARM_RELATIVE:
+ /* B(S) + A */
+ *(uint32_t *)reloc_addr += load_bias;
+ break;
+
+ default:
+ tos_kprintf("unsupported relocation type: %d\n", ELF32_R_TYPE(rela->r_info));
+ break;
+ }
+
+ return ELFLOADER_ERR_NONE;
+}
+
diff --git a/components/elfloader/common/tos_elfloader_symtab.c b/components/elfloader/common/tos_elfloader_symtab.c
new file mode 100644
index 00000000..e6b1f93e
--- /dev/null
+++ b/components/elfloader/common/tos_elfloader_symtab.c
@@ -0,0 +1,32 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
+#include "tos_elfloader.h"
+
+__KNL__ void *elfloader_symtab_lookup(char *name)
+{
+ const el_symbol_t *symbol;
+
+ for (symbol = &el_symbols[0]; symbol; ++symbol) {
+ if (strcmp(name, symbol->name) == 0) {
+ return symbol->value;
+ }
+ }
+
+ return K_NULL;
+}
+
diff --git a/components/elfloader/relocatable_object/tos_elfloader_relocatable_object.c b/components/elfloader/relocatable_object/tos_elfloader_relocatable_object.c
new file mode 100644
index 00000000..7ecf24e2
--- /dev/null
+++ b/components/elfloader/relocatable_object/tos_elfloader_relocatable_object.c
@@ -0,0 +1,450 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
+#include "tos_elfloader.h"
+
+__STATIC__ void *local_symtab_lookup(int fd, char *sym_name,
+ el_section_t bss, el_section_t data, el_section_t rodata, el_section_t text,
+ uint32_t symtab_offset, uint32_t symtab_size, uint32_t symtab_entsize,
+ uint32_t strtab_offset)
+{
+ int i = 0;
+
+ elf32_sym_t sym;
+#define SYMBOL_NAME_MAX 30
+ static char name[SYMBOL_NAME_MAX];
+
+ for (i = 0; i < symtab_size / symtab_entsize; ++i) {
+ if (elfloader_fd_read(fd, symtab_offset, &sym, sizeof(elf32_sym_t)) != ELFLOADER_ERR_NONE) {
+ return K_NULL;
+ }
+
+ if (sym.st_name) {
+ if (elfloader_fd_read(fd, strtab_offset + sym.st_name, name, sizeof(name)) != ELFLOADER_ERR_NONE) {
+ return K_NULL;
+ }
+
+ if (strcmp(name, sym_name) == 0) {
+ if (sym.st_shndx == bss.shndx && bss.address) {
+ return (void *)((uint32_t)bss.address + sym.st_value);
+ } else if (sym.st_shndx == data.shndx && data.address) {
+ return (void *)((uint32_t)data.address + sym.st_value);
+ } else if (sym.st_shndx == rodata.shndx && rodata.address) {
+ return (void *)((uint32_t)rodata.address + sym.st_value);
+ } else if (sym.st_shndx == text.shndx && text.address) {
+ return (void *)((uint32_t)text.address + sym.st_value);
+ } else {
+ return K_NULL;
+ }
+ }
+ }
+
+ symtab_offset += symtab_entsize;
+ }
+
+ return K_NULL;
+}
+
+__STATIC__ el_err_t elfloader_relocate(int fd, void *address,
+ el_section_t bss, el_section_t data, el_section_t rodata, el_section_t text,
+ uint32_t rel_offset, uint32_t rel_size, uint32_t rel_entsize,
+ uint32_t symtab_offset, uint32_t symtab_size, uint32_t symtab_entsize,
+ uint32_t strtab_offset, uint32_t strtab_size)
+{
+ int i = 0;
+ elf32_rela_t rela;
+
+ elf32_sym_t sym;
+ void *addr;
+#define SYMBOL_NAME_MAX 30
+ static char name[SYMBOL_NAME_MAX];
+
+ int is_rela = (rel_entsize == sizeof(elf32_rela_t) ? K_TRUE : K_FALSE);
+
+ for (i = 0; i < rel_size / rel_entsize; ++i) {
+ addr = K_NULL;
+
+ if (elfloader_fd_read(fd, rel_offset, &rela, rel_entsize) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ if (elfloader_fd_read(fd,
+ symtab_offset + ELF32_R_SYM(rela.r_info) * symtab_entsize,
+ &sym,
+ symtab_entsize) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ if (sym.st_name) {
+ /* load the symbol's name */
+ if (elfloader_fd_read(fd,
+ strtab_offset + sym.st_name,
+ name,
+ sizeof(name)) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ /* an external symbol, or a weak one */
+ if (sym.st_shndx == SHN_UNDEF ||
+ ELF32_SYM_TYPE(sym.st_info) == STB_WEAK) {
+ /* look up in the global symbol table */
+ addr = elfloader_symtab_lookup(name);
+ }
+
+ /* an external symbol but not found in the global symbol table */
+ if (sym.st_shndx == SHN_UNDEF && !addr) {
+ return ELFLOADER_ERR_SYM_NOT_FOUND;
+ }
+
+ /* an internal symbol, or a weak symbol without STRONG one in global symbol table */
+ if (!addr) {
+ addr = local_symtab_lookup(fd, name,
+ bss, data, rodata, text,
+ symtab_offset, symtab_size, symtab_entsize,
+ strtab_offset);
+ }
+ } else {
+ if (sym.st_shndx == bss.shndx) {
+ addr = bss.address;
+ } else if (sym.st_shndx == data.shndx) {
+ addr = data.address;
+ } else if (sym.st_shndx == rodata.shndx) {
+ addr = rodata.address;
+ } else if (sym.st_shndx == text.shndx) {
+ addr = text.address;
+ } else {
+ return ELFLOADER_ERR_SECTION_NOT_FOUND;
+ }
+ }
+
+ /* still not found */
+ if (!addr) {
+ return ELFLOADER_ERR_SYM_NOT_FOUND;
+ }
+
+ if (elfloader_arch_relocate(rela.r_offset + (uint32_t)address, 0, (uint32_t)addr, &rela, is_rela, &sym) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_RELOCATE_FAILED;
+ }
+
+ rel_offset += rel_entsize;
+ }
+
+ return ELFLOADER_ERR_NONE;
+}
+
+__API__ el_err_t tos_elfloader_load(el_module_t *module, int fd)
+{
+ int i = 0;
+ el_err_t err;
+ elf32_ehdr_t ehdr;
+ elf32_shdr_t shdr;
+
+ static el_section_t bss = { -1, K_NULL };
+ static el_section_t data = { -1, K_NULL };
+ static el_section_t rodata = { -1, K_NULL };
+ static el_section_t text = { -1, K_NULL };
+
+ void *base = K_NULL, *addr_sec2cp; /* ram base for LOAD sections */
+
+ uint32_t shdr_offset;
+
+ uint32_t strtab_offset, strtab_size = 0;
+ uint32_t symtab_offset, symtab_size = 0, symtab_entsize;
+
+ uint32_t text_offset = 0, text_size = 0;
+ uint32_t data_offset = 0, data_size = 0;
+ uint32_t rodata_offset = 0, rodata_size = 0;
+ uint32_t bss_size = 0;
+
+ uint32_t rel_text_offset, rel_text_size = 0, rel_text_entsize;
+ uint32_t rel_data_offset, rel_data_size = 0, rel_data_entsize;
+ uint32_t rel_rodata_offset, rel_rodata_size = 0, rel_rodata_entsize;
+
+ uint32_t rela_text_offset, rela_text_size = 0, rela_text_entsize;
+ uint32_t rela_data_offset, rela_data_size = 0, rela_data_entsize;
+ uint32_t rela_rodata_offset, rela_rodata_size = 0, rela_rodata_entsize;
+
+ if (!module) {
+ return ELFLOADER_ERR_PTR_NULL;
+ }
+
+ memset(module, 0, sizeof(el_module_t));
+
+ /* read the elf header */
+ if (elfloader_fd_read(fd, 0, &ehdr, sizeof(elf32_ehdr_t)) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ /* sanity check, magic verify */
+ if (memcmp(ehdr.e_ident, elf_header_magic, sizeof(elf_header_magic)) != 0) {
+ return ELFLOADER_ERR_HEADER_INVALID;
+ }
+
+ /* it should be a relocatable object */
+ if (ehdr.e_type != ET_REL) {
+ return ELFLOADER_ERR_TYPE_INVALID;
+ }
+
+ shdr_offset = ehdr.e_shoff;
+
+ for (i = 0; i < ehdr.e_shnum; ++i) {
+ if (elfloader_fd_read(fd, shdr_offset, &shdr, sizeof(elf32_shdr_t)) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ /*
+ |-----------------------------------------------------|
+ | Name | sh_type | sh_flag |
+ |----------|--------------|---------------------------|
+ | .bss | SHT_NOBITS | SHF_ALLOC + SHF_WRITE |
+ | .data | SHT_PROGBITS | SHF_ALLOC + SHF_WRITE |
+ | .rodata | SHT_PROGBITS | SHF_ALLOC |
+ | .text | SHT_PROGBITS | SHF_ALLOC + SHF_EXECINSTR |
+ |-----------------------------------------------------|
+ */
+ if (shdr.sh_type == SHT_NULL) {
+ ;
+ } else if (shdr.sh_type == SHT_STRTAB) {
+ strtab_offset = shdr.sh_offset;
+ strtab_size = shdr.sh_size;
+ } else if (shdr.sh_type == SHT_SYMTAB) {
+ symtab_offset = shdr.sh_offset;
+ symtab_size = shdr.sh_size;
+ symtab_entsize = shdr.sh_entsize;
+ } else if (shdr.sh_type == SHT_NOBITS && shdr.sh_flags == (SHF_ALLOC | SHF_WRITE)) {
+ bss_size = shdr.sh_size;
+
+ bss.shndx = i;
+ } else if (shdr.sh_type == SHT_PROGBITS && shdr.sh_flags == (SHF_ALLOC | SHF_WRITE)) {
+ data_offset = shdr.sh_offset;
+ data_size = shdr.sh_size;
+
+ data.shndx = i;
+ } else if (shdr.sh_type == SHT_PROGBITS && shdr.sh_flags == SHF_ALLOC) {
+ rodata_offset = shdr.sh_offset;
+ rodata_size = shdr.sh_size;
+
+ rodata.shndx = i;
+ } else if (shdr.sh_type == SHT_PROGBITS && shdr.sh_flags == (SHF_ALLOC | SHF_EXECINSTR)) {
+ text_offset = shdr.sh_offset;
+ text_size = shdr.sh_size;
+
+ text.shndx = i;
+ } else if (shdr.sh_type == SHT_REL) {
+ if (shdr.sh_info == data.shndx) {
+ rel_data_offset = shdr.sh_offset;
+ rel_data_size = shdr.sh_size;
+ rel_data_entsize = shdr.sh_entsize;
+ } else if (shdr.sh_info == rodata.shndx) {
+ rel_rodata_offset = shdr.sh_offset;
+ rel_rodata_size = shdr.sh_size;
+ rel_rodata_entsize = shdr.sh_entsize;
+ } else if (shdr.sh_info == text.shndx) {
+ rel_text_offset = shdr.sh_offset;
+ rel_text_size = shdr.sh_size;
+ rel_text_entsize = shdr.sh_entsize;
+ }
+ } else if (shdr.sh_type == SHT_RELA) {
+ if (shdr.sh_info == data.shndx) {
+ rela_data_offset = shdr.sh_offset;
+ rela_data_size = shdr.sh_size;
+ rela_data_entsize = shdr.sh_entsize;
+ } else if (shdr.sh_info == rodata.shndx) {
+ rela_rodata_offset = shdr.sh_offset;
+ rela_rodata_size = shdr.sh_size;
+ rela_rodata_entsize = shdr.sh_entsize;
+ } else if (shdr.sh_info == text.shndx) {
+ rela_text_offset = shdr.sh_offset;
+ rela_text_size = shdr.sh_size;
+ rela_text_entsize = shdr.sh_entsize;
+ }
+ }
+
+ shdr_offset += ehdr.e_shentsize;
+ }
+
+ if (symtab_size == 0) {
+ return ELFLOADER_ERR_NO_SYMTAB;
+ }
+ if (strtab_size == 0) {
+ return ELFLOADER_ERR_NO_STRTAB;
+ }
+ if (text_size == 0) {
+ return ELFLOADER_ERR_NO_TEXT;
+ }
+
+ base = tos_mmheap_alloc(text_size + data_size + rodata_size + bss_size);
+ if (!base) {
+ return ELFLOADER_ERR_OUT_OF_MEMORY;
+ }
+
+ /* do sections load */
+ addr_sec2cp = base;
+
+ if (text_size > 0) {
+ if (elfloader_fd_read(fd, text_offset, addr_sec2cp, text_size) != ELFLOADER_ERR_NONE) {
+ err = ELFLOADER_ERR_FD_READ_FAILED;
+ goto OUT;
+ }
+ text.address = addr_sec2cp;
+
+ addr_sec2cp = (void *)((uint32_t)addr_sec2cp + text_size);
+ }
+
+ if (rodata_size > 0) {
+ if (elfloader_fd_read(fd, rodata_offset, addr_sec2cp, rodata_size) != ELFLOADER_ERR_NONE) {
+ err = ELFLOADER_ERR_FD_READ_FAILED;
+ goto OUT;
+ }
+ rodata.address = addr_sec2cp;
+
+ addr_sec2cp = (void *)((uint32_t)addr_sec2cp + rodata_size);
+ }
+
+ if (data_size > 0) {
+ if (elfloader_fd_read(fd, data_offset, addr_sec2cp, data_size) != ELFLOADER_ERR_NONE) {
+ err = ELFLOADER_ERR_FD_READ_FAILED;
+ goto OUT;
+ }
+ data.address = addr_sec2cp;
+
+ addr_sec2cp = (void *)((uint32_t)addr_sec2cp + data_size);
+ }
+
+ /* clear bss */
+ if (bss_size > 0) {
+ bss.address = addr_sec2cp;
+ memset(bss.address, 0, bss_size);
+ }
+
+ /* do relocation */
+ if (rel_data_size > 0) {
+ err = elfloader_relocate(fd, data.address,
+ bss, data, rodata, text,
+ rel_data_offset, rel_data_size, rel_data_entsize,
+ symtab_offset, symtab_size, symtab_entsize,
+ strtab_offset, strtab_size);
+ if (err != ELFLOADER_ERR_NONE) {
+ goto OUT;
+ }
+ }
+
+ if (rela_data_size > 0) {
+ err = elfloader_relocate(fd, data.address,
+ bss, data, rodata, text,
+ rela_data_offset, rela_data_size, rela_data_entsize,
+ symtab_offset, symtab_size, symtab_entsize,
+ strtab_offset, strtab_size);
+ if (err != ELFLOADER_ERR_NONE) {
+ goto OUT;
+ }
+ }
+
+ if (rel_rodata_size > 0) {
+ err = elfloader_relocate(fd, rodata.address,
+ bss, data, rodata, text,
+ rel_rodata_offset, rel_rodata_size, rel_rodata_entsize,
+ symtab_offset, symtab_size, symtab_entsize,
+ strtab_offset, strtab_size);
+ if (err != ELFLOADER_ERR_NONE) {
+ goto OUT;
+ }
+ }
+
+ if (rela_rodata_size > 0) {
+ err = elfloader_relocate(fd, rodata.address,
+ bss, data, rodata, text,
+ rela_rodata_offset, rela_rodata_size, rela_rodata_entsize,
+ symtab_offset, symtab_size, symtab_entsize,
+ strtab_offset, strtab_size);
+ if (err != ELFLOADER_ERR_NONE) {
+ goto OUT;
+ }
+ }
+
+ if (rel_text_size > 0) {
+ err = elfloader_relocate(fd, text.address,
+ bss, data, rodata, text,
+ rel_text_offset, rel_text_size, rel_text_entsize,
+ symtab_offset, symtab_size, symtab_entsize,
+ strtab_offset, strtab_size);
+ if (err != ELFLOADER_ERR_NONE) {
+ goto OUT;
+ }
+ }
+
+ if (rela_text_size > 0) {
+ err = elfloader_relocate(fd, text.address,
+ bss, data, rodata, text,
+ rela_text_offset, rela_text_size, rela_text_entsize,
+ symtab_offset, symtab_size, symtab_entsize,
+ strtab_offset, strtab_size);
+ if (err != ELFLOADER_ERR_NONE) {
+ goto OUT;
+ }
+ }
+
+ /* TODO: should do icache/dcahe flush here, sth. like:
+
+ dcache_flush();
+ icache_flush();
+
+ */
+
+ module->fd = fd;
+ module->base = base;
+
+ module->info.obj.bss = bss;
+ module->info.obj.data = data;
+ module->info.obj.rodata = rodata;
+ module->info.obj.text = text;
+
+ module->symtab_offset = symtab_offset;
+ module->symtab_size = symtab_size;
+ module->symtab_entsize = symtab_entsize;
+ module->strtab_offset = strtab_offset;
+
+ return ELFLOADER_ERR_NONE;
+
+OUT:
+ if (base) {
+ tos_mmheap_free(base);
+ }
+
+ return err;
+}
+
+__API__ el_err_t tos_elfloader_unload(el_module_t *module)
+{
+ if (!module || !module->base) {
+ return ELFLOADER_ERR_PTR_NULL;
+ }
+
+ tos_mmheap_free(module->base);
+ module->base = K_NULL;
+
+ return ELFLOADER_ERR_NONE;
+}
+
+__API__ void *tos_elfloader_find_symbol(el_module_t *module, char *symbol)
+{
+ return local_symtab_lookup(module->fd, symbol,
+ module->info.obj.bss, module->info.obj.data, module->info.obj.rodata, module->info.obj.text,
+ module->symtab_offset, module->symtab_size, module->symtab_entsize,
+ module->strtab_offset);
+}
+
diff --git a/components/elfloader/shared_object/tos_elfloader_shared_object.c b/components/elfloader/shared_object/tos_elfloader_shared_object.c
new file mode 100644
index 00000000..5e528e67
--- /dev/null
+++ b/components/elfloader/shared_object/tos_elfloader_shared_object.c
@@ -0,0 +1,356 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
+#include "tos_elfloader.h"
+
+__STATIC__ void *local_symtab_lookup(int fd, int32_t load_bias, char *sym_name,
+ uint32_t symtab_offset, uint32_t symtab_size, uint32_t symtab_entsize,
+ uint32_t strtab_offset)
+{
+ int i = 0;
+
+ elf32_sym_t sym;
+#define SYMBOL_NAME_MAX 30
+ static char name[SYMBOL_NAME_MAX];
+
+ for (i = 0; i < symtab_size / symtab_entsize; ++i) {
+ if (elfloader_fd_read(fd, symtab_offset, &sym, sizeof(elf32_sym_t)) != ELFLOADER_ERR_NONE) {
+ return K_NULL;
+ }
+
+ if (sym.st_name) {
+ if (elfloader_fd_read(fd, strtab_offset + sym.st_name, name, sizeof(name)) != ELFLOADER_ERR_NONE) {
+ return K_NULL;
+ }
+
+ if (strcmp(name, sym_name) == 0) {
+ return (void *)(sym.st_value + load_bias);
+ }
+ }
+
+ symtab_offset += symtab_entsize;
+ }
+
+ return K_NULL;
+}
+
+__STATIC__ el_err_t elfloader_relocate(int fd, int32_t load_bias,
+ uint32_t rel_offset, uint32_t rel_size, uint32_t rel_entsize,
+ uint32_t symtab_offset, uint32_t symtab_size, uint32_t symtab_entsize,
+ uint32_t strtab_offset, uint32_t strtab_size)
+{
+ int i = 0;
+ elf32_rela_t rela;
+
+ elf32_sym_t sym;
+ void *addr;
+#define SYMBOL_NAME_MAX 30
+ static char name[SYMBOL_NAME_MAX];
+
+ int is_rela = (rel_entsize == sizeof(elf32_rela_t) ? K_TRUE : K_FALSE);
+
+ for (i = 0; i < rel_size / rel_entsize; ++i) {
+ addr = K_NULL;
+
+ if (elfloader_fd_read(fd, rel_offset, &rela, rel_entsize) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ if (elfloader_fd_read(fd,
+ symtab_offset + ELF32_R_SYM(rela.r_info) * symtab_entsize,
+ &sym,
+ symtab_entsize) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ /* load the symbol's name */
+ if (elfloader_fd_read(fd,
+ strtab_offset + sym.st_name,
+ name,
+ sizeof(name)) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ /* an external symbol, or a weak one */
+ if (sym.st_shndx == SHN_UNDEF ||
+ ELF32_SYM_TYPE(sym.st_info) == STB_WEAK) {
+ /* look up in the global symbol table */
+ addr = elfloader_symtab_lookup(name);
+ }
+
+ /* an external symbol but not found in the global symbol table */
+ if (sym.st_shndx == SHN_UNDEF && !addr) {
+ return ELFLOADER_ERR_SYM_NOT_FOUND;
+ }
+
+ /* an internal symbol, or a weak symbol without STRONG one in global symbol table */
+ if (!addr) {
+ addr = local_symtab_lookup(fd, load_bias, name,
+ symtab_offset, symtab_size, symtab_entsize,
+ strtab_offset);
+ }
+
+ /* still not found */
+ if (!addr) {
+ return ELFLOADER_ERR_SYM_NOT_FOUND;
+ }
+
+ if (elfloader_arch_relocate(rela.r_offset + load_bias, load_bias, (uint32_t)addr, &rela, is_rela, &sym) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_RELOCATE_FAILED;
+ }
+
+ rel_offset += rel_entsize;
+ }
+
+ return ELFLOADER_ERR_NONE;
+}
+
+__API__ el_err_t tos_elfloader_load(el_module_t *module, int fd)
+{
+ int i = 0;
+ el_err_t err;
+ elf32_ehdr_t ehdr;
+ elf32_shdr_t shdr;
+ elf32_dyn_t dyn;
+ elf32_phdr_t phdr;
+
+ void *base = K_NULL, *addr_seg2cp; /* ram base for LOAD segments */
+
+ int32_t load_bias;
+
+ uint32_t shdr_offset, phdr_offset;
+
+ uint32_t vaddr_start = (uint32_t)-1, vaddr_end = 0;
+
+ uint32_t dyn_offset, dyn_size = 0, dyn_entsize;
+
+ uint32_t strtab_offset, strtab_size = 0;
+ uint32_t symtab_offset, symtab_size = 0, symtab_entsize;
+
+ uint32_t rel_entsize;
+ uint32_t rel_dyn_offset, rel_dyn_size = 0;
+ uint32_t rel_plt_offset, rel_plt_size = 0;
+
+ if (!module) {
+ return ELFLOADER_ERR_PTR_NULL;
+ }
+
+ memset(module, 0, sizeof(el_module_t));
+
+ /* read the elf header */
+ if (elfloader_fd_read(fd, 0, &ehdr, sizeof(elf32_ehdr_t)) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ /* sanity check, magic verify */
+ if (memcmp(ehdr.e_ident, elf_header_magic, sizeof(elf_header_magic)) != 0) {
+ return ELFLOADER_ERR_HEADER_INVALID;
+ }
+
+ /* it should be a shared object */
+ if (ehdr.e_type != ET_DYN) {
+ return ELFLOADER_ERR_TYPE_INVALID;
+ }
+
+ shdr_offset = ehdr.e_shoff;
+
+ for (i = 0; i < ehdr.e_shnum; ++i) {
+ if (elfloader_fd_read(fd, shdr_offset, &shdr, sizeof(elf32_shdr_t)) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ if (shdr.sh_type == SHT_DYNAMIC) { /* dynamic section, .dynamic */
+ dyn_offset = shdr.sh_offset;
+ dyn_size = shdr.sh_size;
+ dyn_entsize = shdr.sh_entsize;
+ } else if (shdr.sh_type == SHT_DYNSYM) { /* .dynsym */
+ symtab_size = shdr.sh_size;
+ }
+
+ shdr_offset += ehdr.e_shentsize;
+ }
+
+ if (dyn_size == 0) {
+ return ELFLOADER_ERR_NO_DYN;
+ }
+
+ if (symtab_size == 0) {
+ return ELFLOADER_ERR_NO_SYMTAB;
+ }
+
+ for (i = 0; i < dyn_size / dyn_entsize; ++i) {
+ if (elfloader_fd_read(fd, dyn_offset, &dyn, sizeof(elf32_dyn_t)) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ if (dyn.d_tag == DT_NULL) {
+ break;
+ } else if (dyn.d_tag == DT_SYMTAB) { /* dynamic symbol table */
+ symtab_offset = dyn.d_un.d_ptr;
+ } else if (dyn.d_tag == DT_SYMENT) { /* entry size of symbol table */
+ symtab_entsize = dyn.d_un.d_val;
+ } else if (dyn.d_tag == DT_STRTAB) { /* dynamic string table */
+ strtab_offset = dyn.d_un.d_ptr;
+ } else if (dyn.d_tag == DT_STRSZ) { /* size of dynamic string table */
+ strtab_size = dyn.d_un.d_val;
+ } else if (dyn.d_tag == DT_REL) { /* dynamic relocation table */
+ rel_dyn_offset = dyn.d_un.d_ptr;
+ } else if (dyn.d_tag == DT_RELSZ) { /* size of rel.dyn */
+ rel_dyn_size = dyn.d_un.d_val;
+ } else if (dyn.d_tag == DT_RELENT) { /* entry size of rel.dyn */
+ rel_entsize = dyn.d_un.d_val;
+ } else if (dyn.d_tag == DT_JMPREL) { /* plt relocation table. why NOT DT_PLTREL, confusing */
+ rel_plt_offset = dyn.d_un.d_ptr;
+ } else if (dyn.d_tag == DT_PLTRELSZ) { /* size of rel.plt */
+ rel_plt_size = dyn.d_un.d_val;
+ }
+
+ dyn_offset += dyn_entsize;
+ }
+
+ if (strtab_size == 0) {
+ return ELFLOADER_ERR_NO_STRTAB;
+ }
+
+ phdr_offset = ehdr.e_phoff;
+
+ for (i = 0; i < ehdr.e_phnum; ++i) {
+ if (elfloader_fd_read(fd, phdr_offset, &phdr, sizeof(elf32_phdr_t)) != ELFLOADER_ERR_NONE) {
+ return ELFLOADER_ERR_FD_READ_FAILED;
+ }
+
+ if (phdr.p_type == PHT_LOAD) {
+ if (phdr.p_vaddr < vaddr_start) {
+ vaddr_start = phdr.p_vaddr;
+ }
+
+ if (phdr.p_vaddr + phdr.p_memsz > vaddr_end) {
+ vaddr_end = phdr.p_vaddr + phdr.p_memsz;
+ }
+ }
+
+ phdr_offset += ehdr.e_phentsize;
+ }
+
+ if (vaddr_start == (uint32_t)-1 || vaddr_end == 0) {
+ return ELFLOADER_ERR_NO_LOAD_SEGMENTS;
+ }
+
+ /* reserving memory for LOAD segments */
+ base = tos_mmheap_alloc(vaddr_end - vaddr_start);
+ if (!base) {
+ return ELFLOADER_ERR_OUT_OF_MEMORY;
+ }
+
+ load_bias = (uint32_t)base - vaddr_start;
+
+ /* do segments load */
+ phdr_offset = ehdr.e_phoff;
+
+ for (i = 0; i < ehdr.e_phnum; ++i) {
+ if (elfloader_fd_read(fd, phdr_offset, &phdr, sizeof(elf32_phdr_t)) != ELFLOADER_ERR_NONE) {
+ err = ELFLOADER_ERR_FD_READ_FAILED;
+ goto OUT;
+ }
+
+ if (phdr.p_type == PHT_LOAD) {
+ addr_seg2cp = (void *)(load_bias + phdr.p_vaddr);
+
+ if (elfloader_fd_read(fd,
+ phdr.p_offset,
+ addr_seg2cp,
+ phdr.p_filesz) != ELFLOADER_ERR_NONE) {
+ err = ELFLOADER_ERR_FD_READ_FAILED;
+ goto OUT;
+ }
+
+ if (phdr.p_memsz > phdr.p_filesz) {
+ /* clear bss */
+ memset((void *)((uint8_t *)addr_seg2cp + phdr.p_filesz),
+ 0,
+ phdr.p_memsz - phdr.p_filesz);
+ }
+ }
+
+ phdr_offset += ehdr.e_phentsize;
+ }
+
+ /* do relocation */
+ if (rel_dyn_size > 0) {
+ err = elfloader_relocate(fd, load_bias,
+ rel_dyn_offset, rel_dyn_size, rel_entsize,
+ symtab_offset, symtab_size, symtab_entsize,
+ strtab_offset, strtab_size);
+ if (err != ELFLOADER_ERR_NONE) {
+ goto OUT;
+ }
+ }
+
+ if (rel_plt_size > 0) {
+ err = elfloader_relocate(fd, load_bias,
+ rel_plt_offset, rel_plt_size, rel_entsize,
+ symtab_offset, symtab_size, symtab_entsize,
+ strtab_offset, strtab_size);
+ if (err != ELFLOADER_ERR_NONE) {
+ goto OUT;
+ }
+ }
+
+ /* TODO: should do icache/dcahe flush here, sth. like:
+
+ dcache_flush();
+ icache_flush();
+
+ */
+
+ module->fd = fd;
+ module->base = base;
+ module->info.so.load_bias = load_bias;
+ module->symtab_offset = symtab_offset;
+ module->symtab_size = symtab_size;
+ module->symtab_entsize = symtab_entsize;
+ module->strtab_offset = strtab_offset;
+
+ return ELFLOADER_ERR_NONE;
+
+OUT:
+ if (base) {
+ tos_mmheap_free(base);
+ }
+
+ return err;
+}
+
+__API__ el_err_t tos_elfloader_unload(el_module_t *module)
+{
+ if (!module || !module->base) {
+ return ELFLOADER_ERR_PTR_NULL;
+ }
+
+ tos_mmheap_free(module->base);
+ module->base = K_NULL;
+
+ return ELFLOADER_ERR_NONE;
+}
+
+__API__ void *tos_elfloader_find_symbol(el_module_t *module, char *symbol)
+{
+ return local_symtab_lookup(module->fd, module->info.so.load_bias, symbol,
+ module->symtab_offset, module->symtab_size, module->symtab_entsize,
+ module->strtab_offset);
+}
+
diff --git a/components/fs/kv/tos_kv.c b/components/fs/kv/tos_kv.c
index d692f7fc..7c6e9392 100644
--- a/components/fs/kv/tos_kv.c
+++ b/components/fs/kv/tos_kv.c
@@ -1294,18 +1294,23 @@ __API__ kv_err_t tos_kv_get(const char *key, void *value_buf, size_t value_buf_s
__API__ int tos_kv_has_key(const char *key)
{
- int has_key;
+ kv_item_t *item;
+ int has_key = K_FALSE;
if (!key) {
- return KV_ERR_INVALID_PARAM;
+ return K_FALSE;
}
if (strlen(key) >= (uint8_t)-1) {
- return KV_ERR_SIZE_EXCEEDED;
+ return K_FALSE;
}
kv_lock();
- has_key = kv_item_find(key) ? K_TRUE : K_FALSE;
+ item = kv_item_find(key);
+ if (item) {
+ has_key = K_TRUE;
+ kv_item_free(item);
+ }
kv_unlock();
return has_key;
diff --git a/components/fs/vfs/include/tos_vfs.h b/components/fs/vfs/include/tos_vfs.h
index 1b99a373..555b6179 100644
--- a/components/fs/vfs/include/tos_vfs.h
+++ b/components/fs/vfs/include/tos_vfs.h
@@ -1,3 +1,20 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
#ifndef _TOS_VFS_H_
#define _TOS_VFS_H_
diff --git a/components/fs/vfs/include/tos_vfs_device.h b/components/fs/vfs/include/tos_vfs_device.h
index 751e5363..15d62f4e 100644
--- a/components/fs/vfs/include/tos_vfs_device.h
+++ b/components/fs/vfs/include/tos_vfs_device.h
@@ -1,3 +1,20 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
#ifndef _TOS_VFS_DEVICE_H_
#define _TOS_VFS_DEVICE_H_
diff --git a/components/fs/vfs/include/tos_vfs_err.h b/components/fs/vfs/include/tos_vfs_err.h
index 906b222a..028f5b47 100644
--- a/components/fs/vfs/include/tos_vfs_err.h
+++ b/components/fs/vfs/include/tos_vfs_err.h
@@ -1,3 +1,20 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
#ifndef _TOS_VFS_ERR_H_
#define _TOS_VFS_ERR_H_
diff --git a/components/fs/vfs/include/tos_vfs_file.h b/components/fs/vfs/include/tos_vfs_file.h
index a2677201..85399d2e 100644
--- a/components/fs/vfs/include/tos_vfs_file.h
+++ b/components/fs/vfs/include/tos_vfs_file.h
@@ -1,3 +1,20 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
#ifndef _TOS_VFS_FILE_H_
#define _TOS_VFS_FILE_H_
@@ -10,13 +27,13 @@ typedef struct vfs_inode_st vfs_inode_t;
#define VFS_PATH_MAX 31
// open flags(vfs_oflag_t): open method flags (3rd argument of tos_vfs_open)
-#define VFS_OFLAG_READ 0x01
-#define VFS_OFLAG_WRITE 0x02
-#define VFS_OFLAG_EXISTING 0x00
-#define VFS_OFLAG_CREATE_NEW 0x04
-#define VFS_OFLAG_CREATE_ALWAYS 0x08
-#define VFS_OFLAG_OPEN_ALWAYS 0x10
-#define VFS_OFLAG_OPEN_APPEND 0x30
+#define VFS_OFLAG_READ 0x01
+#define VFS_OFLAG_WRITE 0x02
+#define VFS_OFLAG_EXISTING 0x00
+#define VFS_OFLAG_CREATE_NEW 0x04
+#define VFS_OFLAG_CREATE_ALWAYS 0x08
+#define VFS_OFLAG_OPEN_ALWAYS 0x10
+#define VFS_OFLAG_OPEN_APPEND 0x30
typedef enum vfs_whence_en {
VFS_SEEK_SET, /* the offset is set to offset bytes */
diff --git a/components/fs/vfs/include/tos_vfs_fs.h b/components/fs/vfs/include/tos_vfs_fs.h
index 7e20942c..4c0c3e07 100644
--- a/components/fs/vfs/include/tos_vfs_fs.h
+++ b/components/fs/vfs/include/tos_vfs_fs.h
@@ -1,3 +1,20 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
#ifndef _TOS_VFS_FS_H_
#define _TOS_VFS_FS_H_
diff --git a/components/fs/vfs/include/tos_vfs_inode.h b/components/fs/vfs/include/tos_vfs_inode.h
index 1934207e..e0a9270a 100644
--- a/components/fs/vfs/include/tos_vfs_inode.h
+++ b/components/fs/vfs/include/tos_vfs_inode.h
@@ -1,3 +1,20 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
#ifndef _TOS_VFS_INODE_H_
#define _TOS_VFS_INODE_H_
diff --git a/components/fs/vfs/include/tos_vfs_types.h b/components/fs/vfs/include/tos_vfs_types.h
index bd02ce9f..9982e5e0 100644
--- a/components/fs/vfs/include/tos_vfs_types.h
+++ b/components/fs/vfs/include/tos_vfs_types.h
@@ -1,7 +1,24 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
#ifndef _TOS_VFS_TYPES_H_
#define _TOS_VFS_TYPES_H_
-typedef void VFS_DIR;
+typedef void VFS_DIR;
typedef int32_t vfs_off_t;
typedef uint32_t vfs_oflag_t;
@@ -10,4 +27,5 @@ typedef uint32_t vfs_oflag_t;
#define ssize_t int
#endif
-#endif
+#endif /* _TOS_VFS_TYPES_H_ */
+
diff --git a/components/fs/vfs/tos_vfs.c b/components/fs/vfs/tos_vfs.c
index 972462fe..01352c25 100644
--- a/components/fs/vfs/tos_vfs.c
+++ b/components/fs/vfs/tos_vfs.c
@@ -1,3 +1,20 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
#include "tos_vfs.h"
__API__ int tos_vfs_open(const char *pathname, vfs_oflag_t flags)
diff --git a/components/fs/vfs/tos_vfs_device.c b/components/fs/vfs/tos_vfs_device.c
index 320d29af..35de3609 100644
--- a/components/fs/vfs/tos_vfs_device.c
+++ b/components/fs/vfs/tos_vfs_device.c
@@ -1,3 +1,20 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
#include "tos_vfs.h"
vfs_err_t tos_vfs_block_device_register(const char *device_name, vfs_blkdev_ops_t *ops)
diff --git a/components/fs/vfs/tos_vfs_file.c b/components/fs/vfs/tos_vfs_file.c
index 89cb8a00..ce45e627 100644
--- a/components/fs/vfs/tos_vfs_file.c
+++ b/components/fs/vfs/tos_vfs_file.c
@@ -1,3 +1,20 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
#include "tos_vfs.h"
__STATIC__ vfs_file_t vfs_file_pool[VFS_FILE_OPEN_MAX] = { { K_NULL, 0 } };
diff --git a/components/fs/vfs/tos_vfs_fs.c b/components/fs/vfs/tos_vfs_fs.c
index 524037ca..bad11afa 100644
--- a/components/fs/vfs/tos_vfs_fs.c
+++ b/components/fs/vfs/tos_vfs_fs.c
@@ -1,3 +1,20 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
#include "tos_vfs.h"
extern k_list_t k_vfs_fsmap_list;
diff --git a/components/fs/vfs/tos_vfs_inode.c b/components/fs/vfs/tos_vfs_inode.c
index 4051c099..24e4fad3 100644
--- a/components/fs/vfs/tos_vfs_inode.c
+++ b/components/fs/vfs/tos_vfs_inode.c
@@ -1,3 +1,20 @@
+/*----------------------------------------------------------------------------
+ * Tencent is pleased to support the open source community by making TencentOS
+ * available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ * If you have downloaded a copy of the TencentOS binary from Tencent, please
+ * note that the TencentOS binary is licensed under the BSD 3-Clause License.
+ *
+ * If you have downloaded a copy of the TencentOS source code from Tencent,
+ * please note that TencentOS source code is licensed under the BSD 3-Clause
+ * License, except for the third-party components listed below which are
+ * subject to different license terms. Your integration of TencentOS into your
+ * own projects may require compliance with the BSD 3-Clause License, as well
+ * as the other licenses applicable to the third-party components included
+ * within TencentOS.
+ *---------------------------------------------------------------------------*/
+
#include "tos_vfs.h"
__STATIC__ TOS_LIST_DEFINE(k_vfs_inode_list);
diff --git a/components/security/mbedtls/3rdparty/src/aes.c b/components/security/mbedtls/3rdparty/src/aes.c
index 5c939bba..59728c9b 100644
--- a/components/security/mbedtls/3rdparty/src/aes.c
+++ b/components/security/mbedtls/3rdparty/src/aes.c
@@ -397,8 +397,8 @@ static int aes_init_done = 0;
static void aes_gen_tables( void )
{
int i, x, y, z;
- int pow[256];
- int log[256];
+ static int pow[256];
+ static int log[256];
/*
* compute pow and log tables over GF(2^8)
diff --git a/components/security/mbedtls/3rdparty/src/ctr_drbg.c b/components/security/mbedtls/3rdparty/src/ctr_drbg.c
index d0e5ba86..56b4cd8b 100644
--- a/components/security/mbedtls/3rdparty/src/ctr_drbg.c
+++ b/components/security/mbedtls/3rdparty/src/ctr_drbg.c
@@ -321,7 +321,7 @@ void mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx,
int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx,
const unsigned char *additional, size_t len )
{
- unsigned char seed[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT];
+ static unsigned char seed[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT];
size_t seedlen = 0;
int ret;
diff --git a/doc/image/EVB_MX_guide/key.png b/doc/image/EVB_MX_guide/key.png
index 02769cf7..9326a9e2 100644
Binary files a/doc/image/EVB_MX_guide/key.png and b/doc/image/EVB_MX_guide/key.png differ
diff --git a/examples/elfloader_relocatable_object/elfloader_relocatable_object.c b/examples/elfloader_relocatable_object/elfloader_relocatable_object.c
new file mode 100644
index 00000000..152a86bc
--- /dev/null
+++ b/examples/elfloader_relocatable_object/elfloader_relocatable_object.c
@@ -0,0 +1,100 @@
+#include "tos_k.h"
+#include "tos_hal.h"
+#include "ff.h"
+#include "tos_vfs.h"
+#include "tos_fatfs_drv.h"
+#include "tos_fatfs_vfs.h"
+
+#include "tos_elfloader.h"
+
+int d_e_a = 9;
+
+int f_e_a(int a)
+{
+ /* a = d_e_a + d_g_a = d_e_a + 15 = 24 */
+ printf("f_e_a: %d\n", a);
+ return 0;
+}
+
+const el_symbol_t el_symbols[] = {
+ { "d_e_a", &d_e_a },
+ { "f_e_a", f_e_a },
+ { K_NULL, K_NULL },
+};
+
+/*
+ step1: create 1.c
+
+ extern int d_e_a;
+
+ int d_g_a = 3;
+
+ static int d_s_a = 5;
+
+ extern int f_e_a(int);
+
+ static int f_s_a(void) {
+ d_s_a += 7; // d_s_a = 12
+ }
+
+ int f_g_a(void) {
+ f_s_a();
+
+ d_g_a += d_s_a; // d_g_a = 15
+
+ d_e_a += d_g_a; // + 15
+
+ f_e_a(d_e_a);
+ }
+
+ step2: compile 1.c to 1.o
+ arm-linux-gnueabihf-gcc -fno-builtin -nostdlib -mthumb -mthumb-interwork -mcpu=cortex-m4 -c 1.c -o 1.o
+ */
+
+void application_entry(void *arg)
+{
+ int fd;
+ el_module_t module;
+
+ extern vfs_blkdev_ops_t sd_dev;
+ extern vfs_fs_ops_t fatfs_ops;
+
+ if (tos_vfs_block_device_register("/dev/sd", &sd_dev) != VFS_ERR_NONE) {
+ return;
+ }
+
+ if (tos_vfs_fs_register("fatfs_sd", &fatfs_ops) != VFS_ERR_NONE) {
+ return;
+ }
+
+ if (tos_vfs_fs_mount("/dev/sd", "/fs/fatfs_sd", "fatfs_sd") != VFS_ERR_NONE) {
+ printf("mount failed!\n");
+ return;
+ }
+
+ fd = tos_vfs_open("/fs/fatfs_sd/1.o", VFS_OFLAG_READ | VFS_OFLAG_EXISTING);
+ if (fd < 0) {
+ return;
+ }
+
+ if (tos_elfloader_load(&module, fd) != ELFLOADER_ERR_NONE) {
+ return;
+ }
+
+ void *addr = tos_elfloader_find_symbol(&module, "f_g_a");
+ if (!addr) {
+ printf("symbol NOT FOUND: %s\n", "f_g_a");
+ return;
+ }
+
+ printf("addr: %x\n", addr);
+
+ typedef int (*fp_t)(void);
+ /* call f_g_a in 1.o */
+ ((fp_t)addr)();
+
+ tos_elfloader_unload(&module);
+
+ tos_vfs_close(fd);
+}
+
diff --git a/examples/elfloader_shared_object/elfloader_shared_object.c b/examples/elfloader_shared_object/elfloader_shared_object.c
new file mode 100644
index 00000000..f4272425
--- /dev/null
+++ b/examples/elfloader_shared_object/elfloader_shared_object.c
@@ -0,0 +1,103 @@
+#include "tos_k.h"
+#include "tos_hal.h"
+#include "ff.h"
+#include "tos_vfs.h"
+#include "tos_fatfs_drv.h"
+#include "tos_fatfs_vfs.h"
+
+#include "tos_elfloader.h"
+
+int d_e_a = 9;
+
+int f_e_a(int a)
+{
+ /* a = d_e_a + d_g_a = d_e_a + 15 = 24 */
+ printf("f_e_a: %d\n", a);
+ return 0;
+}
+
+const el_symbol_t el_symbols[] = {
+ { "d_e_a", &d_e_a },
+ { "f_e_a", f_e_a },
+ { K_NULL, K_NULL },
+};
+
+/*
+ step1: create 1.c
+
+ extern int d_e_a;
+
+ int d_g_a = 3;
+
+ static int d_s_a = 5;
+
+ extern int f_e_a(int);
+
+ static int f_s_a(void) {
+ d_s_a += 7; // d_s_a = 12
+ }
+
+ int f_g_a(void) {
+ f_s_a();
+
+ d_g_a += d_s_a; // d_g_a = 15
+
+ d_e_a += d_g_a; // + 15
+
+ f_e_a(d_e_a);
+ }
+
+ step2: compile 1.c to 1.o
+ arm-linux-gnueabihf-gcc -fno-builtin -nostdlib -mthumb -mthumb-interwork -fPIC -mcpu=cortex-m4 -c 1.c -o 1.o
+
+ step3: ld 1.o to 1.so
+ arm-linux-gnueabihf-ld -fno-builtin -nostdlib -fPIC -shared -z max-page-size=0x4 1.o -o 1.so
+ */
+
+void application_entry(void *arg)
+{
+ int fd;
+ el_module_t module;
+
+ extern vfs_blkdev_ops_t sd_dev;
+ extern vfs_fs_ops_t fatfs_ops;
+
+ if (tos_vfs_block_device_register("/dev/sd", &sd_dev) != VFS_ERR_NONE) {
+ return;
+ }
+
+ if (tos_vfs_fs_register("fatfs_sd", &fatfs_ops) != VFS_ERR_NONE) {
+ return;
+ }
+
+ if (tos_vfs_fs_mount("/dev/sd", "/fs/fatfs_sd", "fatfs_sd") != VFS_ERR_NONE) {
+ printf("mount failed!\n");
+ return;
+ }
+
+ fd = tos_vfs_open("/fs/fatfs_sd/1.so", VFS_OFLAG_READ | VFS_OFLAG_EXISTING);
+ if (fd < 0) {
+ return;
+ }
+
+ if (tos_elfloader_load(&module, fd) != ELFLOADER_ERR_NONE) {
+ return;
+ }
+
+ void *addr = tos_elfloader_find_symbol(&module, "f_g_a");
+ if (!addr) {
+ printf("symbol NOT FOUND: %s\n", "f_g_a");
+ return;
+ }
+
+ printf("addr: %x\n", addr);
+
+ typedef int (*fp_t)(void);
+ /* call f_g_a in 1.so */
+ ((fp_t)addr)();
+
+ tos_elfloader_unload(&module);
+
+ tos_vfs_close(fd);
+}
+
diff --git a/examples/mqttclient/gokit3_mqttclient.c b/examples/mqttclient/gokit3_mqttclient.c
index 837f36ae..63f20b75 100644
--- a/examples/mqttclient/gokit3_mqttclient.c
+++ b/examples/mqttclient/gokit3_mqttclient.c
@@ -7,16 +7,13 @@
k_task_t task;
k_stack_t task_stack[2048];
-mqtt_client_t client;
-client_init_params_t init_params;
-
static void tos_topic_handler(void* client, message_data_t* msg)
{
(void) client;
- LOG_I("-----------------------------------------------------------------------------------");
- LOG_I("%s:%d %s()...\ntopic: %s, qos: %d. \nmessage:\n\t%s\n", __FILE__, __LINE__, __FUNCTION__,
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+ MQTT_LOG_I("%s:%d %s()...\ntopic: %s, qos: %d. \nmessage:\n\t%s\n", __FILE__, __LINE__, __FUNCTION__,
msg->topic_name, msg->message->qos, (char*)msg->message->payload);
- LOG_I("-----------------------------------------------------------------------------------\n");
+ MQTT_LOG_I("-----------------------------------------------------------------------------------\n");
}
@@ -25,41 +22,41 @@ void mqttclient_task(void *Parameter)
int error;
char buf[100] = { 0 };
-
mqtt_message_t msg;
+ mqtt_client_t *client = NULL;
memset(&msg, 0, sizeof(msg));
+
+ printf("\nwelcome to mqttclient test...\n");
esp8266_sal_init(HAL_UART_PORT_2);
esp8266_join_ap("wifii", "woshijiejie");
- init_params.read_buf_size = 256;
- init_params.write_buf_size = 256;
-
-#ifdef MQTT_NETWORK_TYPE_TLS
- init_params.connect_params.network_params.network_ssl_params.ca_crt = test_ca_get();
- init_params.connect_params.network_params.port = "8883";
-#else
- init_params.connect_params.network_params.port = "1883";
-#endif
- init_params.connect_params.network_params.addr = "www.jiejie01.top"; //"47.95.164.112";//"jiejie01.top"; //"129.204.201.235"; //"192.168.1.101";
+ mqtt_log_init();
- init_params.connect_params.user_name = random_string(10); // random_string(10); //"jiejietop-acer1";
- init_params.connect_params.password = random_string(10);; //random_string(10); // "123456";
- init_params.connect_params.client_id = random_string(10);; //random_string(10); // "clientid-acer1";
- init_params.connect_params.clean_session = 1;
+ client = mqtt_lease();
- log_init();
+ mqtt_set_port(client, "1883");
+ mqtt_set_host(client, "www.jiejie01.top");
+ mqtt_set_client_id(client, random_string(10));
+ mqtt_set_user_name(client, random_string(10));
+ mqtt_set_password(client, random_string(10));
+ mqtt_set_clean_session(client, 1);
+ mqtt_set_read_buf_size(client, 256);
+ mqtt_set_write_buf_size(client, 256);
- mqtt_init(&client, &init_params);
+ error = mqtt_connect(client);
+
+ MQTT_LOG_D("mqtt connect error is %#x", error);
+
- error = mqtt_connect(&client);
+ error = mqtt_connect(client);
- LOG_D("mqtt connect error is %#x", error);
+ MQTT_LOG_D("mqtt connect error is %#x", error);
- mqtt_subscribe(&client, "tos-topic", QOS0, tos_topic_handler);
+ mqtt_subscribe(client, "tos-topic", QOS0, tos_topic_handler);
- LOG_D("mqtt subscribe error is %#x", error);
+ MQTT_LOG_D("mqtt subscribe error is %#x", error);
memset(&msg, 0, sizeof(msg));
@@ -70,7 +67,7 @@ void mqttclient_task(void *Parameter)
msg.qos = QOS0;
msg.payload = (void *) buf;
- error = mqtt_publish(&client, "tos-topic", &msg);
+ error = mqtt_publish(client, "tos-topic", &msg);
tos_task_delay(4000);
}
diff --git a/examples/mqttclient/mqttclient.c b/examples/mqttclient/mqttclient.c
index a1b48c04..bc7940f6 100644
--- a/examples/mqttclient/mqttclient.c
+++ b/examples/mqttclient/mqttclient.c
@@ -16,27 +16,28 @@
#include "mqttclient.h"
+#define TEST_USEING_TLS
+
extern const char *test_ca_get(void);
static void tos_topic_handler(void* client, message_data_t* msg)
{
(void) client;
- LOG_I("-----------------------------------------------------------------------------------");
- LOG_I("%s:%d %s()...\ntopic: %s, qos: %d. \nmessage:\n\t%s\n", __FILE__, __LINE__, __FUNCTION__,
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+ MQTT_LOG_I("%s:%d %s()...\ntopic: %s, qos: %d. \nmessage:\n\t%s\n", __FILE__, __LINE__, __FUNCTION__,
msg->topic_name, msg->message->qos, (char*)msg->message->payload);
- LOG_I("-----------------------------------------------------------------------------------\n");
+ MQTT_LOG_I("-----------------------------------------------------------------------------------\n");
}
-mqtt_client_t client;
-client_init_params_t init_params;
-
extern void TCPIP_Init(void);
void application_entry(void *arg)
{
int error;
char buf[80] = { 0 };
+ mqtt_client_t *client = NULL;
+
mqtt_message_t msg;
memset(&msg, 0, sizeof(msg));
@@ -44,33 +45,30 @@ void application_entry(void *arg)
TCPIP_Init();
- init_params.read_buf_size = 1024;
- init_params.write_buf_size = 1024;
-
-#ifdef MQTT_NETWORK_TYPE_TLS
- init_params.connect_params.network_params.network_ssl_params.ca_crt = test_ca_get();
- init_params.connect_params.network_params.port = "8883";
+ mqtt_log_init();
+
+ client = mqtt_lease();
+
+#ifdef TEST_USEING_TLS
+ mqtt_set_port(client, "8883");
+ mqtt_set_ca(client, (char*)test_ca_get());
#else
- init_params.connect_params.network_params.port = "1883";
+ mqtt_set_port(client, "1883");
#endif
- init_params.connect_params.network_params.addr = "www.jiejie01.top"; //"47.95.164.112";//"jiejie01.top"; //"129.204.201.235"; //"192.168.1.101";
- init_params.connect_params.user_name = random_string(10);
- init_params.connect_params.password = random_string(10);
- init_params.connect_params.client_id = random_string(10);
- init_params.connect_params.clean_session = 1;
+ mqtt_set_host(client, "www.jiejie01.top");
+ mqtt_set_client_id(client, random_string(10));
+ mqtt_set_user_name(client, random_string(10));
+ mqtt_set_password(client, random_string(10));
+ mqtt_set_clean_session(client, 1);
- log_init();
-
- mqtt_init(&client, &init_params);
-
- error = mqtt_connect(&client);
+ error = mqtt_connect(client);
- LOG_D("mqtt connect error is %#x", error);
+ MQTT_LOG_D("mqtt connect error is %#x", error);
- mqtt_subscribe(&client, "tos-topic", QOS0, tos_topic_handler);
+ mqtt_subscribe(client, "tos-topic", QOS0, tos_topic_handler);
- LOG_D("mqtt subscribe error is %#x", error);
+ MQTT_LOG_D("mqtt subscribe error is %#x", error);
memset(&msg, 0, sizeof(msg));
@@ -81,7 +79,7 @@ void application_entry(void *arg)
msg.qos = QOS0;
msg.payload = (void *) buf;
- mqtt_publish(&client, "tos-topic", &msg);
+ mqtt_publish(client, "tos-topic", &msg);
tos_task_delay(4000);
}
diff --git a/examples/mqttclient_iothub/mqttclient_iothub.c b/examples/mqttclient_iothub/mqttclient_iothub.c
index 6459cd6d..1ed3c118 100644
--- a/examples/mqttclient_iothub/mqttclient_iothub.c
+++ b/examples/mqttclient_iothub/mqttclient_iothub.c
@@ -19,15 +19,14 @@
static void tos_topic_handler(void* client, message_data_t* msg)
{
(void) client;
- LOG_I("-----------------------------------------------------------------------------------");
- LOG_I("%s:%d %s()...\ntopic: %s, qos: %d. \nmessage:\n\t%s\n", __FILE__, __LINE__, __FUNCTION__,
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+ MQTT_LOG_I("%s:%d %s()...\ntopic: %s, qos: %d. \nmessage:\n\t%s\n", __FILE__, __LINE__, __FUNCTION__,
msg->topic_name, msg->message->qos, (char*)msg->message->payload);
- LOG_I("-----------------------------------------------------------------------------------\n");
+ MQTT_LOG_I("-----------------------------------------------------------------------------------\n");
}
mqtt_client_t client;
-client_init_params_t init_params;
extern void TCPIP_Init(void);
@@ -36,39 +35,41 @@ void application_entry(void *arg)
int error;
char buf[80] = { 0 };
mqtt_message_t msg;
+ mqtt_client_t *client = NULL;
memset(&msg, 0, sizeof(msg));
- sprintf(buf, "welcome to mqttclient, this is a publish test...");
+ printf("\nwelcome to mqttclient test...\n");
TCPIP_Init();
- init_params.read_buf_size = 1024;
- init_params.write_buf_size = 1024;
- init_params.connect_params.network_params.addr = "iotcloud-mqtt.gz.tencentdevices.com";
- init_params.connect_params.network_params.port = "1883";
- init_params.connect_params.user_name = "7ABAKP6KNCtest1;12010126;KGRDH;1618120908";
- init_params.connect_params.password = "35c065988c4beeb32d8a2f1f283a7a1535e79295f4b6368f2ec61ee7b1b8c271;hmacsha256";
- init_params.connect_params.client_id = "7ABAKP6KNCtest1";
- init_params.connect_params.clean_session = 1;
+ mqtt_log_init();
- log_init();
+ client = mqtt_lease();
- mqtt_init(&client, &init_params);
+ mqtt_set_port(client, "1883");
- error = mqtt_connect(&client);
+ mqtt_set_host(client, "iotcloud-mqtt.gz.tencentdevices.com");
+ mqtt_set_client_id(client, "7ABAKP6KNCtest1");
+ mqtt_set_user_name(client, "7ABAKP6KNCtest1;12010126;KGRDH;1618120908");
+ mqtt_set_password(client, "35c065988c4beeb32d8a2f1f283a7a1535e79295f4b6368f2ec61ee7b1b8c271;hmacsha256");
+ mqtt_set_clean_session(client, 1);
- LOG_D("mqtt connect error is %#x", error);
+ error = mqtt_connect(client);
- mqtt_subscribe(&client, "7ABAKP6KNC/test1/data", QOS0, tos_topic_handler);
+ MQTT_LOG_D("mqtt connect error is %#x", error);
+
+ mqtt_subscribe(client, "7ABAKP6KNC/test1/data", QOS0, tos_topic_handler);
memset(&msg, 0, sizeof(msg));
+ sprintf(buf, "welcome to mqttclient, this is a publish test...");
+
for (;;) {
msg.qos = QOS0;
msg.payload = (void *) buf;
- mqtt_publish(&client, "7ABAKP6KNC/test1/data", &msg);
+ mqtt_publish(client, "7ABAKP6KNC/test1/data", &msg);
tos_task_delay(4000);
}
diff --git a/examples/wifi_ln882x/tcp_client_echo.c b/examples/wifi_ln882x/tcp_client_echo.c
index 743fc4bc..199299a3 100644
--- a/examples/wifi_ln882x/tcp_client_echo.c
+++ b/examples/wifi_ln882x/tcp_client_echo.c
@@ -151,7 +151,7 @@ void tcp_client_echo_task_entry(void *arg)
void tcp_client_echo_task_creat(uint8_t * ser_ip, uint32_t port)
{
- target_ser_t ser = {0};
+ static target_ser_t ser = {0};
ser.ip = ser_ip;
ser.port = port;
diff --git a/examples/wifi_ln882x/tcp_server_echo.c b/examples/wifi_ln882x/tcp_server_echo.c
index 92fc0385..25ec0396 100644
--- a/examples/wifi_ln882x/tcp_server_echo.c
+++ b/examples/wifi_ln882x/tcp_server_echo.c
@@ -156,7 +156,8 @@ void tcp_server_echo_task_entry(void *arg)
void tcp_server_echo_task_creat(uint32_t port)
{
- uint32_t server_port = port;
+ static uint32_t server_port;
+ server_port = port;
osThreadCreate(osThread(tcp_server_echo_task_entry), &server_port);
}
diff --git a/examples/wifi_ln882x/wifi_app_ln882x.c b/examples/wifi_ln882x/wifi_app_ln882x.c
index bb6f53af..ca1221c6 100644
--- a/examples/wifi_ln882x/wifi_app_ln882x.c
+++ b/examples/wifi_ln882x/wifi_app_ln882x.c
@@ -8,7 +8,7 @@
#include "netif/ethernetif.h"
#include "wifi_manager/wifi_manager.h"
#include "lwip/tcpip.h"
-#include "drv/drv_adc_measure.h"
+#include "drv_adc_measure.h"
#include "utils/system_parameter.h"
#include "hal/hal_adc.h"
@@ -165,7 +165,7 @@ void application_entry(void *arg)
ART_ASSERT(1);
}
- reg_wifi_msg_callbcak(wifi_manager_get_handle(), WIFI_MSG_ID_STA_DHCP_GOT_IP,wifi_event_sta_got_ip_cb);
+ reg_wifi_msg_callbcak(WIFI_MSG_ID_STA_DHCP_GOT_IP,wifi_event_sta_got_ip_cb);
wifi_mode_enum_t wifi_mode = WIFI_MODE_STATION;
@@ -198,7 +198,7 @@ void application_entry(void *arg)
};
tcp_server_echo_task_creat(8087);
- tcp_client_echo_task_creat((uint8_t *)"39.108.190.129", 8000);//ͨÐÅè²âÊÔ(IP:120.76.100.197) 10002¶Ë¿Ú
+// tcp_client_echo_task_creat((uint8_t *)"39.108.190.129", 8000);//ͨÐÅè²âÊÔ(IP:120.76.100.197) 10002¶Ë¿Ú
while(1)
{
diff --git a/kernel/core/include/tos_bitmap.h b/kernel/core/include/tos_bitmap.h
index 73d5fcf2..ce39eba5 100644
--- a/kernel/core/include/tos_bitmap.h
+++ b/kernel/core/include/tos_bitmap.h
@@ -145,7 +145,6 @@ __API__ int tos_bitmap_is_reset(k_bitmap_t *bitmap, uint32_t bit);
* @attention The very first bit which is set to 1.
*
* @param[in] bitmap pointer to the handler of the bitmap.
- * @param[in] bit the bit to set.
*
* @return the lowest significant bit of the bitmap.
*/
diff --git a/kernel/core/include/tos_k.h b/kernel/core/include/tos_k.h
index 1de7f751..38249227 100644
--- a/kernel/core/include/tos_k.h
+++ b/kernel/core/include/tos_k.h
@@ -19,7 +19,7 @@
#define _TOS_K_H_
#include
-#include
+#include
#include
#include
#include
diff --git a/kernel/core/include/tos_err.h b/kernel/core/include/tos_kerr.h
similarity index 100%
rename from kernel/core/include/tos_err.h
rename to kernel/core/include/tos_kerr.h
diff --git a/kernel/core/include/tos_priority_mail_queue.h b/kernel/core/include/tos_priority_mail_queue.h
index 7ca52fce..9d669202 100644
--- a/kernel/core/include/tos_priority_mail_queue.h
+++ b/kernel/core/include/tos_priority_mail_queue.h
@@ -67,7 +67,6 @@ __API__ k_err_t tos_prio_mail_q_destroy(k_prio_mail_q_t *prio_mail_q);
* @attention a MAIL is a buffer with a certain size.
*
* @param[in] prio_mail_q pointer to the handler of the priority mail queue.
- * @param[in] pool pool buffer of the priority mail queue.
* @param[in] mail_cnt mail count of the priority mail queue.
* @param[in] mail_size size of each mail in the priority mail queue.
*
@@ -160,9 +159,9 @@ __API__ k_err_t tos_prio_mail_q_post(k_prio_mail_q_t *prio_mail_q, void *mail_bu
*/
__API__ k_err_t tos_prio_mail_q_post_all(k_prio_mail_q_t *prio_mail_q, void *mail_buf, size_t mail_size, k_prio_t prio);
-#endif
+#endif /* TOS_CFG_PRIORITY_MAIL_QUEUE_EN */
__CDECLS_END
-#endif /* TOS_CFG_PRIORITY_MAIL_QUEUE_EN */
+#endif /* _TOS_PRIORITY_MAIL_QUEUE_H_ */
diff --git a/kernel/core/include/tos_priority_message_queue.h b/kernel/core/include/tos_priority_message_queue.h
index 22e868a6..cd43263b 100644
--- a/kernel/core/include/tos_priority_message_queue.h
+++ b/kernel/core/include/tos_priority_message_queue.h
@@ -66,7 +66,6 @@ __API__ k_err_t tos_prio_msg_q_destroy(k_prio_msg_q_t *prio_msg_q);
* @attention a MESSAGE is a "void *" pointer.
*
* @param[in] prio_msg_q pointer to the handler of the priority message queue.
- * @param[in] pool pool buffer of the priority message queue.
* @param[in] msg_cnt message count of the priority message queue.
*
* @return errcode
diff --git a/kernel/core/include/tos_robin.h b/kernel/core/include/tos_robin.h
index ae594710..675ed907 100644
--- a/kernel/core/include/tos_robin.h
+++ b/kernel/core/include/tos_robin.h
@@ -37,20 +37,19 @@ __API__ void tos_robin_timeslice_set(k_task_t *task, k_timeslice_t timeslice)
/**
* @brief Configure round robin.
- * Set the round robin state and the default time slice of the task.
+ * Set the default time slice of the task.
*
* @attention None
*
- * @param[in] robin_state state of the round robin.
* @param[in] default_timeslice default time slice of the task.
*
* @return None
*/
__API__ void tos_robin_default_timeslice_config(k_timeslice_t default_timeslice);
-__KNL__ void robin_sched(k_prio_t prio);
+__KNL__ void robin_sched(k_prio_t prio);
-#endif
+#endif /* TOS_CFG_ROUND_ROBIN_EN */
__CDECLS_END
diff --git a/kernel/evtdrv/include/tos_evtdrv_tick.h b/kernel/evtdrv/include/tos_evtdrv_tick.h
index 1c7bf750..7ebf7c67 100644
--- a/kernel/evtdrv/include/tos_evtdrv_tick.h
+++ b/kernel/evtdrv/include/tos_evtdrv_tick.h
@@ -21,7 +21,7 @@
#if TOS_CFG_EVENT_DRIVEN_EN > 0u
/**
- * @brief Get the current systick cout.
+ * @brief Get the current systick count.
*
* @attention
*
diff --git a/kernel/evtdrv/include/tos_evtdrv_timer.h b/kernel/evtdrv/include/tos_evtdrv_timer.h
index 317bbb8e..16eb7721 100644
--- a/kernel/evtdrv/include/tos_evtdrv_timer.h
+++ b/kernel/evtdrv/include/tos_evtdrv_timer.h
@@ -70,6 +70,7 @@ __API__ evtdrv_err_t tos_evtdrv_timer_create(evtdrv_timer_t *tmr,
* @attention None
*
* @param[in] tmr pointer to the handler of the timer.
+ * @param[in] timeout how much time(in evtdrv_tick_t) the timer would be expired.
*
* @return errcode
* @retval #EVTDRV_ERR_PTR_NULL tmr is a NULL pointer.
diff --git a/platform/vendor_bsp/LN/ln882x/include/atcmd/at_cmd_wifi.h b/platform/vendor_bsp/LN/ln882x/include/atcmd/at_cmd_wifi.h
index 0630a412..5d3ad84e 100644
--- a/platform/vendor_bsp/LN/ln882x/include/atcmd/at_cmd_wifi.h
+++ b/platform/vendor_bsp/LN/ln882x/include/atcmd/at_cmd_wifi.h
@@ -37,9 +37,10 @@ char at_station_disconnect(void);
char at_station_set_scan_list_display_option(char *str);
char at_station_scan(char *str);
char at_station_scan_no_filter(char *str);
-#if WIFI_SNIFFER_TEST
+#if WIFI_TRACK
char at_notify_aplist(void);
char at_station_aplx(char *str);
+char at_station_aplist(char *str);
#endif
//softap
@@ -135,13 +136,8 @@ char at_get_cip_mux(char *str);
char at_set_netconn_disconnect(char *str);
char at_set_ip_close(char *str);
char at_get_cip_status(char *str);
-
#if WIFI_SWITCH
-void wifi_sniffer_deinit(void);
-void wifi_sniffer_reinit(void);
char at_wifi_switch(char *str);
-bool wifi_init(void);
-bool wifi_deinit(void);
#endif
char at_iperf(char *str);
diff --git a/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/interrupt.h b/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/interrupt.h
index a51831d1..95e8a163 100644
--- a/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/interrupt.h
+++ b/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/interrupt.h
@@ -45,39 +45,39 @@ WEAK void SysTick_Handler(void);
//
// Controller specific peripheral interrupts
//
-WEAK void WDT_IRQHandler();
-WEAK void EXTERNAL_IRQHandler();
-WEAK void RTC_IRQHandler();
-WEAK void SLEEP_IRQHandler();
-WEAK void MAC_IRQHandler();
-WEAK void DMAC_IRQHandler();
-WEAK void QSPI_IRQHandler();
-WEAK void SDIOCFUN1_IRQHandler();
-WEAK void SDIOCFUN2_IRQHandler();
-WEAK void SDIOCFUN3_IRQHandler();
-WEAK void SDIOCFUN4_IRQHandler();
-WEAK void SDIOCFUN5_IRQHandler();
-WEAK void SDIOCFUN6_IRQHandler();
-WEAK void SDIOCFUN7_IRQHandler();
-WEAK void SDIOC_ASYNC_HOST_IRQHandler();
-WEAK void SDIOC_M2S_IRQHandler();
-WEAK void CM4_INTR0_IRQHandler();
-WEAK void CM4_INTR1_IRQHandler();
-WEAK void CM4_INTR2_IRQHandler();
-WEAK void CM4_INTR3_IRQHandler();
-WEAK void CM4_INTR4_IRQHandler();
-WEAK void CM4_INTR5_IRQHandler();
-WEAK void ADCC_IRQHandler();
-WEAK void TIMER_IRQHandler();
-WEAK void I2C0_IRQHandler();
-WEAK void I2C1_IRQHandler();
-WEAK void SPIM_IRQHandler();
-WEAK void SPIS_IRQHandler();
-WEAK void UART0_IRQHandler();
-WEAK void UART1_IRQHandler();
-WEAK void SPIM2_IRQHandler();
-WEAK void GPIO_IRQHandler();
-WEAK void I2S_IRQHandler();
-WEAK void PAOTD_IRQHandler();
+WEAK void WDT_IRQHandler(void);
+WEAK void EXTERNAL_IRQHandler(void);
+WEAK void RTC_IRQHandler(void);
+WEAK void SLEEP_IRQHandler(void);
+WEAK void MAC_IRQHandler(void);
+WEAK void DMAC_IRQHandler(void);
+WEAK void QSPI_IRQHandler(void);
+WEAK void SDIOCFUN1_IRQHandler(void);
+WEAK void SDIOCFUN2_IRQHandler(void);
+WEAK void SDIOCFUN3_IRQHandler(void);
+WEAK void SDIOCFUN4_IRQHandler(void);
+WEAK void SDIOCFUN5_IRQHandler(void);
+WEAK void SDIOCFUN6_IRQHandler(void);
+WEAK void SDIOCFUN7_IRQHandler(void);
+WEAK void SDIOC_ASYNC_HOST_IRQHandler(void);
+WEAK void SDIOC_M2S_IRQHandler(void);
+WEAK void CM4_INTR0_IRQHandler(void);
+WEAK void CM4_INTR1_IRQHandler(void);
+WEAK void CM4_INTR2_IRQHandler(void);
+WEAK void CM4_INTR3_IRQHandler(void);
+WEAK void CM4_INTR4_IRQHandler(void);
+WEAK void CM4_INTR5_IRQHandler(void);
+WEAK void ADCC_IRQHandler(void);
+WEAK void TIMER_IRQHandler(void);
+WEAK void I2C0_IRQHandler(void);
+WEAK void I2C1_IRQHandler(void);
+WEAK void SPIM_IRQHandler(void);
+WEAK void SPIS_IRQHandler(void);
+WEAK void UART0_IRQHandler(void);
+WEAK void UART1_IRQHandler(void);
+WEAK void SPIM2_IRQHandler(void);
+WEAK void GPIO_IRQHandler(void);
+WEAK void I2S_IRQHandler(void);
+WEAK void PAOTD_IRQHandler(void);
#endif /* _INTERRUPT_H_ */
diff --git a/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/ln_compiler.h b/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/ln_compiler.h
new file mode 100644
index 00000000..2a5940c9
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/ln_compiler.h
@@ -0,0 +1,125 @@
+#ifndef __LN_COMPILER_H__
+#define __LN_COMPILER_H__
+
+/*------------------ RealView Compiler -----------------*/
+#if defined(__CC_ARM)
+
+#define ARMCC_V5
+
+#define __ASM__ __asm
+#define __VOLATILE__ volatile
+
+#define __INLINE__ inline
+#define __STATIC__ static
+
+#if (__ARMCC_VERSION < 5060750)
+ #define __STATIC_INLINE__ static
+#else
+ #define __STATIC_INLINE__ static inline
+#endif
+
+#define likely(x) __builtin_expect(!!(x), 1)
+#define unlikely(x) __builtin_expect(!!(x), 0)
+#define __UNUSED__ __attribute__((__unused__))
+#define __USED__ __attribute__((__used__))
+#define __PACKED__ __attribute__((packed))
+#define __ALIGNED__(x) __attribute__((aligned(x)))
+#define __PURE__ __attribute__((__pure__))
+#define __CONST__ __attribute__((__const__))
+#define __NO_RETURN__ __attribute__((__noreturn__))
+#define __WEAK__ __attribute__((weak))
+
+/*------------------ ARM Compiler V6 -------------------*/
+#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
+
+#define ARMCC_V6
+
+#define __ASM__ __asm
+#define __VOLATILE__ volatile
+
+#define __INLINE__ inline
+#define __STATIC__ static
+#define __STATIC_INLINE__ static inline
+
+#define likely(x) __builtin_expect(!!(x), 1)
+#define unlikely(x) __builtin_expect(!!(x), 0)
+#define __UNUSED__ __attribute__((__unused__))
+#define __USED__ __attribute__((__used__))
+#define __PACKED__ __attribute__((packed))
+#define __ALIGNED__(x) __attribute__((aligned(x)))
+#define __PURE__ __attribute__((__pure__))
+#define __CONST__ __attribute__((__const__))
+#define __NO_RETURN__ __attribute__((__noreturn__))
+#define __NAKED__ __attribute__((naked))
+#define __WEAK__ __attribute__((weak))
+
+/*------------------ ICC Compiler ----------------------*/
+#elif defined(__ICCARM__) || defined(__ICC430__) // __IAR_SYSTEMS_ICC__
+
+#define __ASM__ __asm
+#define __VOLATILE__ volatile
+
+#define __INLINE__ inline
+#define __STATIC__ static
+#define __STATIC_INLINE__ static inline
+
+#define likely(x) (x)
+#define unlikely(x) (x)
+#define __UNUSED__
+#define __USED__
+#define __PACKED__
+#define __ALIGNED__(x)
+#define __PURE__
+#define __CONST__
+#define __NO_RETURN__
+#define __NAKED__
+#define __WEAK__ __weak
+
+/*------------------ ICC Compiler for STM8/AVR ----------------------*/
+#elif defined(__IAR_SYSTEMS_ICC__)
+
+#define __ASM__ __asm
+#define __VOLATILE__ volatile
+
+#define __INLINE__ inline
+#define __STATIC__ static
+#define __STATIC_INLINE__ static inline
+
+#define likely(x) (x)
+#define unlikely(x) (x)
+#define __UNUSED__
+#define __USED__
+#define __PACKED__
+#define __ALIGNED__(x)
+#define __PURE__
+#define __CONST__
+#define __NO_RETURN__
+#define __NAKED__
+#define __WEAK__ __weak
+
+/*------------------ GNU Compiler ----------------------*/
+#elif defined(__GNUC__)
+
+#define __ASM__ __asm
+#define __VOLATILE__ volatile
+
+#define __INLINE__ inline
+#define __STATIC__ static
+#define __STATIC_INLINE__ static inline
+
+#define likely(x) __builtin_expect(!!(x), 1)
+#define unlikely(x) __builtin_expect(!!(x), 0)
+#define __UNUSED__ __attribute__((__unused__))
+#define __USED__ __attribute__((__used__))
+#define __PACKED__ __attribute__((packed))
+#define __ALIGNED__(x) __attribute__((aligned(x)))
+#define __PURE__ __attribute__((__pure__))
+#define __CONST__ __attribute__((__const__))
+#define __NO_RETURN__ __attribute__((__noreturn__))
+#define __NAKED__ __attribute__((naked))
+#define __WEAK__ __attribute__((weak))
+
+#endif
+
+#endif /* __LN_COMPILER_H__ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/ln_types.h b/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/ln_types.h
new file mode 100644
index 00000000..34eda126
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/ln_types.h
@@ -0,0 +1,13 @@
+#ifndef __LN_TYPES_H__
+#define __LN_TYPES_H__
+
+#include
+#include
+
+
+#define LN_TRUE (1u)
+#define LN_FALSE (0u)
+
+
+#endif /* __LN_TYPES_H__ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/mem_map_ln882x.h b/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/mem_map_ln882x.h
index 4cea7a53..bcef9a64 100644
--- a/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/mem_map_ln882x.h
+++ b/platform/vendor_bsp/LN/ln882x/include/cpu/ARM_CM4F/ln88xx/mem_map_ln882x.h
@@ -64,32 +64,15 @@
#define BOOTROM_RW_SECTION_LIMIT (SIZE_32KB)
//BOOTRAM
-#define BOOTRAM_BASE (RAM_BASE)
-#define BOOTRAM_LIMIT (SIZE_32KB)
-
+#define BOOTRAM_BASE (RAM_BASE)
+#define BOOTRAM_LIMIT (SIZE_4KB*9)
//FLASH
-#define FLASH_BASE_OFFSET (0)
+#define CACHE_FLASH_BASE (0x10000000)
-#define BOOTRAM_HEADER_ON_FLASH_OFFSET (FLASH_BASE_OFFSET)
-#define BOOTRAM_ON_FLASH_OFFSET (BOOTRAM_HEADER_ON_FLASH_OFFSET + BOOTRAM_HEADER_SIZE)
-#define BOOTRAM_PARTITION_SIZE (8 * SIZE_4KB)
-#define BOOTRAM_SIZE (BOOTRAM_PARTITION_SIZE - BOOTRAM_HEADER_SIZE)
-#define PARTITION_TABLE0_OFFSET (BOOTRAM_HEADER_ON_FLASH_OFFSET + BOOTRAM_PARTITION_SIZE)
-#define PARTITION_TABLE0_SIZE (SIZE_4KB)
-
-#define PARTITION_TABLE1_OFFSET (PARTITION_TABLE0_OFFSET + PARTITION_TABLE0_SIZE)
-#define PARTITION_TABLE1_SIZE (SIZE_4KB)
-
-#define PARTITION_TABLE_FLAG_OFFSET (PARTITION_TABLE1_OFFSET + PARTITION_TABLE1_SIZE)
-#define PARTITION_TABLE_FLAG_SIZE (SIZE_4KB)
-
-#define SYSTEM_PARAMETER_OFFSET (PARTITION_TABLE_FLAG_OFFSET + PARTITION_TABLE_FLAG_SIZE)
-#define SYSTEM_PARAMETER_SIZE (2 * SIZE_4KB)
-
-#define USR_NVDS_PARAM_OFFSET (SIZE_2MB-(3*SIZE_4KB))
-#define USR_NVDS_PARAM_SIZE (3 * SIZE_4KB)
#endif /* __MEMORY_MAP_LN882X_H__ */
+
+
diff --git a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/hal_sleep.h b/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/hal_sleep.h
index 19825e72..fe503575 100644
--- a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/hal_sleep.h
+++ b/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/hal_sleep.h
@@ -6,49 +6,60 @@
#endif // __cplusplus
#include "types.h"
-#include "hal/hal_gpio.h"
+#include "hal/syscon_types.h"
#include "ll/ll_sleep.h"
+typedef enum
+{
+ ACTIVE = 0,
+ LIGHT_SLEEP,
+ DEEP_SLEEP,
+ RETENTION_SLEEP,
+ FROZEN_SLEEP
+}sleep_mode_enum_t;
+
typedef enum {
- SLEEP_TIMER_WAKEUP = (1 << 0),
- MAC_WAKEUP = (1 << 1),
- EXT_INT_WAKEUP = (1 << 2),
- RTC_WAKEUP = (1 << 3),
-}hal_sleep_wakeup_src_enum_t;
+ MOD_QSPI = SW_CLKGATE_QSPI,
+ MOD_ADDC = SW_CLKGATE_ADCC,
+ MOD_I2S = SW_CLKGATE_I2S,
+ MOD_GPIO = SW_CLKGATE_GPIO,
+ MOD_SPIM = SW_CLKGATE_SPIM,
+ MOD_SPIS = SW_CLKGATE_SPIS,
+ MOD_I2C0 = SW_CLKGATE_I2C0,
+ MOD_I2C1 = SW_CLKGATE_I2C1,
+ MOD_UART0 = SW_CLKGATE_UART0,
+ MOD_UART1 = SW_CLKGATE_UART1,
+ MOD_SPIM2 = SW_CLKGATE_SPIM2,
+ MOD_WDT = SW_CLKGATE_WDT,
+ MOD_TIMER0 = SW_CLKGATE_TIMER,
+ MOD_TIMER1 = SW_CLKGATE_TIMER_1,
+ MOD_TIMER2 = SW_CLKGATE_TIMER_2,
+ MOD_TIMER3 = SW_CLKGATE_TIMER_3,
+ MOD_TIMER4 = SW_CLKGATE_TIMER_4,
+ MOD_DGBH = SW_CLKGATE_DBGH,
+ MOD_SDIO = SW_CLKGATE_SDIO,
+ MOD_MAC = SW_CLKGATE_MAC,
+ MOD_CACHE = SW_CLKGATE_CACHE,
+ MOD_DMA = SW_CLKGATE_DMA,
+ MOD_RFREG = SW_CLKGATE_RFREG,
+ MOD_PWM = SW_CLKGATE_PWM,
+ MOD_EF = SW_CLKGATE_EF,
+ MOD_TRNG = SW_CLKGATE_TRNG,
+ MOD_AES = SW_CLKGATE_AES,
+ MOD_EXT_INT,
+ MOD_MAX,
+}hal_peripheral_module_t;
-typedef void (* reinitialize_phy_cb_t)(void);
-typedef bool (* wifi_is_slept_cb_t)(void);
-typedef struct
-{
- GPIO_Num gpio;
- SYSTEM_EXT_INT_Triggle_Type triggle_type;
-}ext_irq_cfg_t ;
-typedef struct {
- sleep_mode_enum_t sleep_mode;
- uint32_t wakeup_src;//bit[0]--SLEEP_IRQn; bit[1]--MAC_IRQn;bit[2]--EXTERNAL_IRQn;bit[3]--RTC_IRQn
- ext_irq_cfg_t ext_irq_cfg;
-}hal_sleep_config_t;
+typedef bool (*sleep_condition_cb_t)(void);
+typedef void (*sleep_processing_cb_t)(void);
-typedef struct
-{
- bool flag;
- hal_sleep_config_t sleep_config;
- uint32_t nvic_int_en[2];
- uint64_t compensation;
- uint32_t msec;
- wifi_is_slept_cb_t wifi_is_slept_cb;
- reinitialize_phy_cb_t reinit_phy_cb;
- bool inited;
-}hal_sleep_ctrl_t ;
-
-void hal_sleep_init(hal_sleep_config_t *sleep_config);
-void hal_sleep_deinit(void);
-void hal_sleep_set_config(hal_sleep_config_t *sleep_config);
+int hal_sleep_set_mode(sleep_mode_enum_t sleep_mode);
sleep_mode_enum_t hal_sleep_get_mode(void);
+int hal_sleep_register(hal_peripheral_module_t peripheral_module, sleep_condition_cb_t sleep_condition, sleep_processing_cb_t pre_sleep_proc, sleep_processing_cb_t post_sleep_proc);
+int hal_sleep_unregister(hal_peripheral_module_t peripheral_module);
void hal_pre_sleep_processing(uint32_t *ticks);
uint32_t hal_post_sleep_processing(uint32_t ticks);
-void hal_sleep_register_callback(reinitialize_phy_cb_t reinit_phy_cb, wifi_is_slept_cb_t wifi_is_slept_cb);
-void hal_sleep_wakeup_source_set(hal_sleep_wakeup_src_enum_t wakeup_src);
+
#ifdef __cplusplus
}
#endif // __cplusplus
diff --git a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/hal_syscon.h b/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/hal_syscon.h
index c9ac2be9..e3a24b61 100644
--- a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/hal_syscon.h
+++ b/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/hal_syscon.h
@@ -316,7 +316,26 @@ void HAL_SYSCON_RCO32K_Bitsel_Set(uint8_t bitsel);
void HAL_SYSCON_RCO32K_Cbit_Set(uint8_t cbit);
void HAL_SYSCON_Xtal40MCap_Set(uint8_t cap);
void HAL_SYSCON_PmuCfg(void);
-
+void HAL_SYSCON_AWO_phy_pd_en(uint8_t en);
+void HAL_SYSCON_AWO_phy_po_en(uint8_t en);
+void HAL_SYSCON_AWO_ldo18_po_en(uint8_t en);
+void HAL_SYSCON_AWO_sram_pd_en(uint8_t en);
+void HAL_SYSCON_AWO_sram_po_en(uint8_t en);
+void HAL_SYSCON_AWO_pmu_ret_en(uint8_t en);
+void HAL_SYSCON_AWO_pmu_unret_en(uint8_t en);
+void HAL_SYSCON_AWO_pdcmp_po(uint8_t po);
+void HAL_SYSCON_AWO_cpucore_retreg_po(uint8_t po);
+void HAL_SYSCON_AWO_idle_reg_set(uint32_t val);
+void HAL_SYSCON_AWO_lp_mode_awo(uint8_t lp_mode_awo);
+void HAL_SYSCON_AWO_clk_sel_set(uint32_t val);
+void HAL_SYSCON_CMP_rfreg_len(uint16_t rfreg_len);
+void HAL_SYSCON_CMP_rfreg_base_addr(uint16_t rfreg_base_addr);
+void HAL_SYSCON_CMP_rfreg_action_set(uint32_t val);
+uint8_t HAL_SYSCON_CMP_save_done_get(void);
+void HAL_SYSCON_AWO_sw_pwr_ctrl_set(uint32_t value);
+uint8_t HAL_SYSCON_AWO_pmu_fsm_get(void);
+uint8_t HAL_SYSCON_CMP_restore_done_get(void);
+void HAL_SYSCON_CMP_sw_clkg_set(uint32_t value);
#ifdef __cplusplus
}
#endif
diff --git a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/hal_timer.h b/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/hal_timer.h
index c2acff5a..738d158c 100644
--- a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/hal_timer.h
+++ b/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/hal_timer.h
@@ -7,6 +7,11 @@
extern "C" {
#endif /* __cplusplus */
+
+/** @brief Timer expire callback function definition*/
+typedef void (*timer_cb_func_t)(void);
+
+
/**
* @brief There are totally 4 hardware timers.
*
@@ -39,7 +44,7 @@ typedef enum
typedef enum
{
TIMER_MODE_FREERUNNING = 0, /**< TIMER_MODE_FREE_RUNNING: Use this mode if you want a single timed interrupt. */
- TIMER_MODE_USERDEFINED /**< TIMER_MODE_USER_DEFINED: Use this mode if you want a fixed, timed interrupt. */
+ TIMER_MODE_USERDEFINED /**< TIMER_MODE_USER_DEFINED: Use this mode if you want a periodic timer, timed interrupt. */
} TIMER_Mode;
@@ -62,6 +67,7 @@ typedef struct
TIMER_Mask mask; /**< mask: mask or unmask the timer interrupt */
TIMER_Mode mode; /**< mode: select the running mode of timer, free-running or user define mode */
uint32_t user_freq; /**< user_freq: user-defined timer clock frequency fx, which must meet the request: 321.5KHz <= fx <= 80MHz */
+ timer_cb_func_t cb_func;/**< cb_func: call back function when timer is expired */
} TIMER_InitTypeDef;
@@ -189,6 +195,7 @@ void HAL_TIMER_LoadCount2_Set(TIMER_Index index, uint32_t loadCount2);
*/
uint32_t HAL_TIMER_LoadCount2_Get(TIMER_Index index);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/syscon_types.h b/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/syscon_types.h
index 61107f61..a88b0be6 100644
--- a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/syscon_types.h
+++ b/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/hal/syscon_types.h
@@ -175,7 +175,6 @@ typedef enum
typedef enum
{
- SW_CLKGATE_PATCH = 0,
SW_CLKGATE_QSPI = 1,
SW_CLKGATE_ADCC = 2,
SW_CLKGATE_I2S = 3,
@@ -198,7 +197,11 @@ typedef enum
SW_CLKGATE_MAC = 20,
SW_CLKGATE_CACHE = 21,
SW_CLKGATE_DMA = 22,
- SW_CLKGATE_RFREG = 23
+ SW_CLKGATE_RFREG = 23,
+ SW_CLKGATE_PWM = 24,
+ SW_CLKGATE_EF = 25,
+ SW_CLKGATE_TRNG = 26,
+ SW_CLKGATE_AES = 27,
} SYSCON_ClkGate_Peripheral;
typedef enum
@@ -339,8 +342,7 @@ typedef enum
(clkgate) == SW_CLKGATE_CORE_MAC40M || \
(clkgate) == SW_CLKGATE_CORE_MAC80M)
-#define IS_CLKGATE_PERIPHERAL(clkgate) ((clkgate) == SW_CLKGATE_PATCH || \
- (clkgate) == SW_CLKGATE_QSPI || \
+#define IS_CLKGATE_PERIPHERAL(clkgate) ((clkgate) == SW_CLKGATE_QSPI || \
(clkgate) == SW_CLKGATE_ADCC || \
(clkgate) == SW_CLKGATE_I2S || \
(clkgate) == SW_CLKGATE_GPIO || \
@@ -362,7 +364,11 @@ typedef enum
(clkgate) == SW_CLKGATE_MAC || \
(clkgate) == SW_CLKGATE_CACHE || \
(clkgate) == SW_CLKGATE_DMA || \
- (clkgate) == SW_CLKGATE_RFREG)
+ (clkgate) == SW_CLKGATE_RFREG || \
+ (clkgate) == SW_CLKGATE_PWM || \
+ (clkgate) == SW_CLKGATE_EF || \
+ (clkgate) == SW_CLKGATE_TRNG || \
+ (clkgate) == SW_CLKGATE_AES)
#define IS_SPIM_INDEX(index) ((index) == SPIM_IO_EN0 || (index) == SPIM_IO_EN1 || (index) == SPIM_IO_EN2)
diff --git a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/ll/ll_sleep.h b/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/ll/ll_sleep.h
index c88b6771..40bdaa93 100644
--- a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/ll/ll_sleep.h
+++ b/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/ll/ll_sleep.h
@@ -1,23 +1,12 @@
#ifndef __LL_SLEEP_H__
#define __LL_SLEEP_H__
-#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
-typedef enum
-{
- ACTIVE = 0,
- LIGHT_SLEEP,
- DEEP_SLEEP,
- RETENTION_SLEEP,
- FROZEN_SLEEP
-}sleep_mode_enum_t;
-
-void ll_pre_sleep_processing(sleep_mode_enum_t sleep_mode, uint8_t sram_powerdown);
-void ll_post_sleep_processing(sleep_mode_enum_t sleep_mode);
+void ll_sleep_mac_tsf_clk_switch(uint8_t ps_clk_switch);
#ifdef __cplusplus
}
diff --git a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/ll/ll_syscon.h b/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/ll/ll_syscon.h
index ead9033e..ed258e7c 100644
--- a/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/ll/ll_syscon.h
+++ b/platform/vendor_bsp/LN/ln882x/include/driver_ln882x/ll/ll_syscon.h
@@ -332,7 +332,26 @@ void LL_SYSCON_EXT_INTR_Set_Triggle_Condition(SYSTEM_EXT_INT_Wakeup_Index ext_in
uint8_t LL_SYSCON_EXT_INTR_Stat(void);
uint8_t LL_SYSCON_EXT_INTR_Stat_Raw(void);
void LL_SYSCON_EXT_INTR_Clear(void);
-
+void LL_SYSCON_AWO_phy_pd_en(uint8_t en);
+void LL_SYSCON_AWO_phy_po_en(uint8_t en);
+void LL_SYSCON_AWO_ldo18_po_en(uint8_t en);
+void LL_SYSCON_AWO_sram_pd_en(uint8_t en);
+void LL_SYSCON_AWO_sram_po_en(uint8_t en);
+void LL_SYSCON_AWO_pmu_ret_en(uint8_t en);
+void LL_SYSCON_AWO_pmu_unret_en(uint8_t en);
+void LL_SYSCON_AWO_pdcmp_po(uint8_t po);
+void LL_SYSCON_AWO_cpucore_retreg_po(uint8_t po);
+void LL_SYSCON_AWO_idle_reg_set(uint32_t val);
+void LL_SYSCON_AWO_lp_mode_awo(uint8_t lp_mode_awo);
+void LL_SYSCON_AWO_clk_sel_set(uint32_t val);
+void LL_SYSCON_CMP_rfreg_len(uint16_t rfreg_len);
+void LL_SYSCON_CMP_rfreg_base_addr(uint16_t rfreg_base_addr);
+void LL_SYSCON_CMP_rfreg_action_set(uint32_t val);
+uint8_t LL_SYSCON_CMP_save_done_get(void);
+void LL_SYSCON_AWO_sw_pwr_ctrl_set(uint32_t val);
+uint8_t LL_SYSCON_AWO_pmu_fsm_get(void);
+uint8_t LL_SYSCON_CMP_restore_done_get(void);
+void LL_SYSCON_CMP_sw_clkg_set(uint32_t value);
#ifdef __cplusplus
}
#endif
diff --git a/platform/vendor_bsp/LN/ln882x/include/kernel/FreeRTOS_Adapter/freertos_queue.h b/platform/vendor_bsp/LN/ln882x/include/kernel/FreeRTOS_Adapter/freertos_queue.h
index f91a3ad4..ba8c3c99 100644
--- a/platform/vendor_bsp/LN/ln882x/include/kernel/FreeRTOS_Adapter/freertos_queue.h
+++ b/platform/vendor_bsp/LN/ln882x/include/kernel/FreeRTOS_Adapter/freertos_queue.h
@@ -25,7 +25,6 @@ OS_Status OS_QueueCreate(OS_Queue_t *queue, uint32_t queueLen, uint32_t itemSize
OS_Status OS_QueueDelete(OS_Queue_t *queue);
OS_Status OS_QueueSend(OS_Queue_t *queue, const void *item, OS_Time_t waitMS);
OS_Status OS_QueueReceive(OS_Queue_t *queue, void *item, OS_Time_t waitMS);
-OS_Status OS_QueueFlush(OS_Queue_t *queue);
/**
diff --git a/platform/vendor_bsp/LN/ln882x/include/serial/serial.h b/platform/vendor_bsp/LN/ln882x/include/serial/serial.h
index 80898fb9..d29cf127 100644
--- a/platform/vendor_bsp/LN/ln882x/include/serial/serial.h
+++ b/platform/vendor_bsp/LN/ln882x/include/serial/serial.h
@@ -2,7 +2,7 @@
#define __SERIAL_H__
#include "proj_config.h"
-#include "serial/serial_p.h"
+#include "serial_hw.h"
#include "utils/fifo/fifobuf.h"
/** Human-readable serial error descriptions */
diff --git a/platform/vendor_bsp/LN/ln882x/include/utils/crc32.h b/platform/vendor_bsp/LN/ln882x/include/utils/crc32.h
index 75f028d2..d9466036 100644
--- a/platform/vendor_bsp/LN/ln882x/include/utils/crc32.h
+++ b/platform/vendor_bsp/LN/ln882x/include/utils/crc32.h
@@ -1,13 +1,20 @@
-#ifndef CRC32_H
-#define CRC32_H
+#ifndef ___CRC32_H__
+#define ___CRC32_H__
#include
-uint32_t GetCrc32(uint8_t *ptr, int len);
+typedef struct {
+ uint32_t crc;
+} crc32_ctx_t;
-
-#endif
+void ln_crc32_init(crc32_ctx_t *ctx);
+void ln_crc32_update(crc32_ctx_t *ctx, uint8_t *data, uint32_t len);
+uint32_t ln_crc32_final(crc32_ctx_t *ctx);
+uint32_t ln_crc32_signle_cal(uint8_t *ptr, int len);
+
+
+#endif /* ___CRC32_H__ */
diff --git a/platform/vendor_bsp/LN/ln882x/include/utils/system_parameter.h b/platform/vendor_bsp/LN/ln882x/include/utils/system_parameter.h
index 65bc583a..2821589f 100644
--- a/platform/vendor_bsp/LN/ln882x/include/utils/system_parameter.h
+++ b/platform/vendor_bsp/LN/ln882x/include/utils/system_parameter.h
@@ -15,7 +15,6 @@ typedef struct {
#define NETIF_HOSTNAME_LEN_MAX (8)
-#define WIFI_PSK_INFO_LIST_SIZE (2)
int system_parameter_init(void);
int system_parameter_deinit(void);
@@ -35,11 +34,10 @@ uint8_t system_parameter_get_dhcp_enable(void);
//ap_hostname config
int system_parameter_set_hostname(wifi_interface_enum_t if_index, uint8_t *hostname);
int system_parameter_get_hostname(wifi_interface_enum_t if_index, uint8_t *hostname);
-////PSK info
-int system_parameter_set_psk_info( wifi_psk_info_t *psk_info);
-int system_parameter_get_psk_info(wifi_psk_info_t *psk_info);
+
int system_parameter_set_wifi_mode(wifi_mode_enum_t wifi_mode);
wifi_mode_enum_t system_parameter_get_wifi_mode(void);
+
int system_parameter_set_dhcpd_config(server_config_t *server_config);
int system_parameter_get_dhcpd_config(server_config_t *server_config);
diff --git a/platform/vendor_bsp/LN/ln882x/include/wifi/wifi.h b/platform/vendor_bsp/LN/ln882x/include/wifi/wifi.h
index 79a33b7f..8c2fabd5 100644
--- a/platform/vendor_bsp/LN/ln882x/include/wifi/wifi.h
+++ b/platform/vendor_bsp/LN/ln882x/include/wifi/wifi.h
@@ -183,7 +183,8 @@ void wifi_do_temp_cal_period(uint16_t adc_ch0_val);
//STA
bool wifi_station_scan(wifi_scan_config_t *config);
-int wifi_station_get_scan_ap_list(list_t **ap_list, bool sort);
+int wifi_station_get_scan_list_size(void);
+int wifi_station_get_scan_list(list_t *out_list, int out_list_size, bool sort);
void wifi_station_connect(wifi_sta_config_t *sta_config);
bool wifi_station_disconnect(void);
int8_t wifi_station_get_rssi(void);
diff --git a/platform/vendor_bsp/LN/ln882x/include/wifi_manager/wifi_manager.h b/platform/vendor_bsp/LN/ln882x/include/wifi_manager/wifi_manager.h
index 37568280..2f8e17a3 100644
--- a/platform/vendor_bsp/LN/ln882x/include/wifi_manager/wifi_manager.h
+++ b/platform/vendor_bsp/LN/ln882x/include/wifi_manager/wifi_manager.h
@@ -102,12 +102,10 @@ typedef struct wifi_manager_ctrl wifi_manager_ctrl_t;
//wifi get mode api (需è¦wifi_cfg æä¾›)
-bool reg_wifi_msg_callbcak(wifi_manager_ctrl_t *manager_ctrl, wifi_msg_id_enum_t msg_id, wifi_msg_callback_fun callback_fun);
+bool reg_wifi_msg_callbcak(wifi_msg_id_enum_t msg_id, wifi_msg_callback_fun callback_fun);
void notify_wifi_manager_task(wifi_msg_t * pWifiMsg);
-bool wifi_manager_init(wifi_manager_ctrl_t *manager_ctrl);
-bool wifi_manager_deinit(wifi_manager_ctrl_t *manager_ctrl);
-wifi_manager_ctrl_t *wifi_manager_get_handle(void);
-
+bool wifi_manager_init(void);
+bool wifi_manager_deinit(void);
#ifdef __cplusplus
}
diff --git a/platform/vendor_bsp/LN/ln882x/lib/boot_ln882x.bin b/platform/vendor_bsp/LN/ln882x/lib/boot_ln882x.bin
new file mode 100644
index 00000000..c88d0350
Binary files /dev/null and b/platform/vendor_bsp/LN/ln882x/lib/boot_ln882x.bin differ
diff --git a/platform/vendor_bsp/LN/ln882x/lib/boot_ram_ln882x.bin b/platform/vendor_bsp/LN/ln882x/lib/boot_ram_ln882x.bin
deleted file mode 100644
index a9d195ca..00000000
Binary files a/platform/vendor_bsp/LN/ln882x/lib/boot_ram_ln882x.bin and /dev/null differ
diff --git a/platform/vendor_bsp/LN/ln882x/lib/wifi_driver.lib b/platform/vendor_bsp/LN/ln882x/lib/soc_driver.lib
similarity index 56%
rename from platform/vendor_bsp/LN/ln882x/lib/wifi_driver.lib
rename to platform/vendor_bsp/LN/ln882x/lib/soc_driver.lib
index 9f689b91..0ce28005 100644
Binary files a/platform/vendor_bsp/LN/ln882x/lib/wifi_driver.lib and b/platform/vendor_bsp/LN/ln882x/lib/soc_driver.lib differ
diff --git a/platform/vendor_bsp/LN/ln882x/lib/wifi_mac.lib b/platform/vendor_bsp/LN/ln882x/lib/wifi_mac.lib
index 27097e2f..dfe2a7ad 100644
Binary files a/platform/vendor_bsp/LN/ln882x/lib/wifi_mac.lib and b/platform/vendor_bsp/LN/ln882x/lib/wifi_mac.lib differ
diff --git a/platform/vendor_bsp/LN/ln882x/src/atcmd/at_cmd_wifi.c b/platform/vendor_bsp/LN/ln882x/src/atcmd/at_cmd_wifi.c
index ee68e987..e351f25d 100644
--- a/platform/vendor_bsp/LN/ln882x/src/atcmd/at_cmd_wifi.c
+++ b/platform/vendor_bsp/LN/ln882x/src/atcmd/at_cmd_wifi.c
@@ -17,7 +17,7 @@
#include "ping/ping.h"
#include "iperf/iperf.h"
#include "dhcpd/dhcpd.h"
-#include "nvds/nvds.h"
+#include "nvds.h"
#include "hal/hal_efuse.h"
#define RET_OK_STR ("\r\nOK\r\n")
@@ -673,7 +673,7 @@ char at_station_scan_no_filter(char *str)
scan_list_dsiplay_option_t *display_option = &g_scan_list_dsiplay_option;
int ap_count = 0;
ap_info_t *item_iterator = NULL;
- list_t *ap_list = NULL, *iterator;
+ list_t scan_list, *iterator, *prev;
#if WIFI_TRACK
at_printf("\r\n+CWLAPLN\r\n");
@@ -681,21 +681,40 @@ char at_station_scan_no_filter(char *str)
at_printf("\r\n+CWLAP\r\n");
#endif
- ap_count = wifi_station_get_scan_ap_list(&ap_list, (display_option->sort_enable == 1)? true : false);
- if(ap_list && ap_count > 0)
- {
+ ap_count = wifi_station_get_scan_list_size();
+ if(ap_count > 0){
+ //prepare scan_list space
+ list_init(&scan_list);
+ for(i = 0; i < ap_count; i++){
+ item_iterator = OS_Malloc(sizeof(ap_info_t));
+ if(item_iterator){
+ list_add(&scan_list, &(item_iterator->list));
+ }
+ }
+
+ //get ap list
+ wifi_station_get_scan_list(&scan_list, ap_count, (display_option->sort_enable == 1)? true : false);
at_printf("Auth{ 0: Open, 1: WEP, 2: WPA_PSK, 3:WPA2_PSK, 4:WPA_WPA2_PSK, 5: WPA2_ENTERPRISE}\r\n");
at_printf ("\r\nAP_num SSID RSSI Channel Auth_mode BSSID IMODE WPS Freq_offset FreqCal\r\n");
-
- for (iterator = ap_list->next, i = 1; iterator != ap_list; iterator = iterator->next, i++) {
+ for (iterator = scan_list.next, i = 0; iterator != &scan_list; iterator = iterator->next, i++) {
item_iterator = list_entry(iterator, ap_info_t, list);
at_printf ("%6d %-31s %4d %7d %9d "MACSTR" %2X %3d %11d %7d\r\n",
- i, item_iterator->ssid, item_iterator->rssi, item_iterator->channel, item_iterator->authmode,
+ (i + 1), item_iterator->ssid, item_iterator->rssi, item_iterator->channel, item_iterator->authmode,
MAC2STR(item_iterator->bssid),
item_iterator->imode, item_iterator->wps, item_iterator->freq_offset, item_iterator->freqcal_val
);
}
+ //free scan_list space
+ for (iterator = scan_list.next; iterator != &scan_list; iterator = iterator->next) {
+ prev = iterator->prev;
+ item_iterator = list_entry(iterator, ap_info_t, list);
+ list_rm(iterator);
+ if(item_iterator){
+ OS_Free(item_iterator);
+ }
+ iterator = prev;
+ }
}
at_printf(RET_OK_STR);
@@ -710,53 +729,119 @@ char at_notify_aplist(void)
int i=0;
int ap_count = 0;
ap_info_t *item_iterator = NULL;
- list_t *ap_list = NULL, *iterator;
+ list_t scan_list, *iterator, *prev;
- ap_count = wifi_station_get_scan_ap_list(&ap_list, true);
- at_printf("\r\nAT+ScanAp\r\n",ap_count);
- for (iterator = ap_list->next, i = 0; (i < 10) && (iterator != ap_list); iterator = iterator->next, i++)
- {
- item_iterator = list_entry(iterator, ap_info_t, list);
- at_printf(MACSTR";%d;%s\r\n", MAC2STR(item_iterator->bssid), item_iterator->rssi, item_iterator->ssid);
+ ap_count = wifi_station_get_scan_list_size();
+ if(ap_count > 0){
+ //prepare scan_list space
+ list_init(&scan_list);
+ for(i = 0; i < ap_count; i++){
+ item_iterator = OS_Malloc(sizeof(ap_info_t));
+ if(item_iterator){
+ list_add(&scan_list, &(item_iterator->list));
+ }
+ }
+
+ //get ap list
+ wifi_station_get_scan_list(&scan_list, ap_count, true);
+ at_printf("\r\nAT+ScanAp\r\n",ap_count);
+ for (iterator = scan_list.next, i = 0; (i < 10) && iterator != &scan_list; iterator = iterator->next, i++) {
+ item_iterator = list_entry(iterator, ap_info_t, list);
+ at_printf(MACSTR";%d;%s\r\n", MAC2STR(item_iterator->bssid), item_iterator->rssi, item_iterator->ssid);
+ }
+
+ //free scan_list space
+ for (iterator = scan_list.next; iterator != &scan_list; iterator = iterator->next) {
+ prev = iterator->prev;
+ item_iterator = list_entry(iterator, ap_info_t, list);
+ list_rm(iterator);
+ if(item_iterator){
+ OS_Free(item_iterator);
+ }
+ iterator = prev;
+ }
}
return AT_OK;
}
char at_station_aplx(char *str)
{
- int ap_count = 0;
+ int ap_count = 0, i;
ap_info_t *item_iterator = NULL;
- list_t *ap_list = NULL, *iterator;
+ list_t scan_list, *iterator, *prev;
- ap_count = wifi_station_get_scan_ap_list(&ap_list, true);
- for (iterator = ap_list->next; iterator != ap_list; iterator = iterator->next)
- {
- item_iterator = list_entry(iterator, ap_info_t, list);
- at_printf("\r\n+CWLAP:%d,\"%s\",%d,\""MACSTR"\",%d",
+ ap_count = wifi_station_get_scan_list_size();
+ if(ap_count > 0){
+ //prepare scan_list space
+ list_init(&scan_list);
+ for(i = 0; i < ap_count; i++){
+ item_iterator = OS_Malloc(sizeof(ap_info_t));
+ if(item_iterator){
+ list_add(&scan_list, &(item_iterator->list));
+ }
+ }
+
+ //get ap list
+ wifi_station_get_scan_list(&scan_list, ap_count, true);
+ for (iterator = scan_list.next; iterator != &scan_list; iterator = iterator->next) {
+ item_iterator = list_entry(iterator, ap_info_t, list);
+ at_printf("\r\n+CWLAP:%d,\"%s\",%d,\""MACSTR"\",%d",
item_iterator->authmode,
item_iterator->ssid,
item_iterator->rssi,
MAC2STR(item_iterator->bssid),
item_iterator->channel);
+ }
+
+ //free scan_list space
+ for (iterator = scan_list.next; iterator != &scan_list; iterator = iterator->next) {
+ prev = iterator->prev;
+ item_iterator = list_entry(iterator, ap_info_t, list);
+ list_rm(iterator);
+ if(item_iterator){
+ OS_Free(item_iterator);
+ }
+ iterator = prev;
+ }
}
at_printf("\r\n\r\nOK\r\n",ap_count);
return AT_OK;
}
char at_station_aplist(char *str)
{
- int ap_count = 0;
+ int ap_count = 0, i;
ap_info_t *item_iterator = NULL;
- list_t *ap_list = NULL, *iterator;
+ list_t scan_list, *iterator, *prev;
- ap_count = wifi_station_get_scan_ap_list(&ap_list, true);
- if(ap_count > 0)
- {
+ ap_count = wifi_station_get_scan_list_size();
+ if(ap_count > 0){
+ //prepare scan_list space
+ list_init(&scan_list);
+ for(i = 0; i < ap_count; i++){
+ item_iterator = OS_Malloc(sizeof(ap_info_t));
+ if(item_iterator){
+ list_add(&scan_list, &(item_iterator->list));
+ }
+ }
+
+ //get ap list
+ wifi_station_get_scan_list(&scan_list, ap_count, true);
at_printf("\r\n+CWLAPLST: %d, ",ap_count);
- for (iterator = ap_list->next; iterator != ap_list; iterator = iterator->next)
- {
+ for (iterator = scan_list.next; iterator != &scan_list; iterator = iterator->next) {
item_iterator = list_entry(iterator, ap_info_t, list);
at_printf(MACSTR" @ %d, ", MAC2STR(item_iterator->bssid), item_iterator->rssi);
}
+
+ //free scan_list space
+ for (iterator = scan_list.next; iterator != &scan_list; iterator = iterator->next) {
+ prev = iterator->prev;
+ item_iterator = list_entry(iterator, ap_info_t, list);
+ list_rm(iterator);
+ if(item_iterator){
+ OS_Free(item_iterator);
+ }
+ iterator = prev;
+ }
at_printf("\r\n\r\nOK\r\n");
}
else
@@ -3032,23 +3117,25 @@ char at_iperf(char *str)
#if WIFI_SWITCH
uint8_t wifi_en=1;
+extern void wifi_track_init(void);
+extern void wifi_track_reinit(void);
+extern void wifi_track_deinit(void);
+extern bool wifi_manager_init(void);
+extern bool wifi_manager_deinit(void);
char at_wifi_switch(char *str)
{
uint8_t en;
en=atoi(str);
- LOG(LOG_LVL_ERROR, "%s() 000 en=%d\r\n",__func__,en);
if(en&&wifi_en==0){
wifi_en=1;
- LOG(LOG_LVL_ERROR, "%s() 111 \r\n",__func__);
- wifi_init();
- wifi_manager_init(wifi_manager_get_handle());
- wifi_sniffer_reinit();//wifi_sniffer_init();//wifi_start(&init_param);
+ //wifi_init();
+ //wifi_manager_init();
+ wifi_track_reinit();
}else if(0==en&&wifi_en){
wifi_en=0;
- LOG(LOG_LVL_ERROR, "%s() 222 \r\n",__func__);
- wifi_sniffer_deinit();//call wifi_stop()
- wifi_manager_deinit(wifi_manager_get_handle());
- wifi_deinit();
+ wifi_track_deinit();//call wifi_stop()
+ //wifi_manager_deinit();
+ //wifi_deinit();
}
at_printf("OK\r\n");
diff --git a/platform/vendor_bsp/LN/ln882x/src/console/console.c b/platform/vendor_bsp/LN/ln882x/src/console/console.c
index 37fc48b3..17e42284 100644
--- a/platform/vendor_bsp/LN/ln882x/src/console/console.c
+++ b/platform/vendor_bsp/LN/ln882x/src/console/console.c
@@ -8,9 +8,8 @@
#include "ln88xx.h"
#include "utils/debug/log.h"
#include "utils/debug/art_assert.h"
-#if WIFI_TRACK
-#include "ll/ll_gpio.h"
-#endif
+#include "hal/hal_gpio.h"
+
#if (CHIP_ROLE == CHIP_MCU)
#include "serial/serial.h"
@@ -132,17 +131,21 @@ void serial_rx_callbcak(void){
OS_SemaphoreRelease(&g_rx_sem);
}
#endif /*__CONFIG_OS_KERNEL */
-#if WIFI_TRACK
-extern GPIO_Value get_gpio_value(GPIO_Num gpio);
-#endif
+
void console_init(void)
{
CONSOLE_CTRL_T *console = &console_ctrl;
Serial_t *fd = NULL;
#if WIFI_TRACK
+ GPIO_InitTypeDef gpio_config = {
+ .dir = GPIO_INPUT,
+ .debounce = GPIO_DEBOUNCE_YES,
+ };
+
+ HAL_GPIO_Init(GPIOA_8, gpio_config);
int bd = 115200;
- if(get_gpio_value(GPIOA_8) == GPIO_VALUE_LOW)
+ if(HAL_GPIO_ReadPin(GPIOA_8) == GPIO_VALUE_LOW)
bd = CONSOLE_PORT_BAUDRATE;
else
bd = 9600;
diff --git a/platform/vendor_bsp/LN/ln882x/src/cpu/ARM_CM4F/ln88xx/system_ln88xx.c b/platform/vendor_bsp/LN/ln882x/src/cpu/ARM_CM4F/ln88xx/system_ln88xx.c
index 4ef8bb98..4c7f6b61 100644
--- a/platform/vendor_bsp/LN/ln882x/src/cpu/ARM_CM4F/ln88xx/system_ln88xx.c
+++ b/platform/vendor_bsp/LN/ln882x/src/cpu/ARM_CM4F/ln88xx/system_ln88xx.c
@@ -16,9 +16,6 @@ extern uint32_t __Vectors[];
#define vector_table __Vectors
#endif
-/* This variable is a placeholder, defined at the junction of two blocks memory(SRAM0 and SRAM1) */
-int placeholder_between_sram0_and_sram1 __attribute__ ((section(".ARM.__at_0x1FFFFFFC"), zero_init));
-
/*----------------------------------------------------------------------------
System Core Clock Variable
*----------------------------------------------------------------------------*/
diff --git a/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_sdio.c b/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_sdio.c
index 6c9ceaf4..729f0c99 100644
--- a/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_sdio.c
+++ b/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_sdio.c
@@ -4,7 +4,7 @@
#include "hal/hal_syscon.h"
#include "utils/debug/log.h"
-static hal_sdio_ctrl_t g_hal_sdio_ctrl __attribute__((section("wlan_shared_mem"))) = {0,};
+static hal_sdio_ctrl_t g_hal_sdio_ctrl;
static hal_sdio_ctrl_t *hal_sdio_ctrl_get_handle(void)
{
return &g_hal_sdio_ctrl;
diff --git a/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_sleep.c b/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_sleep.c
index 8f591d62..41e4d007 100644
--- a/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_sleep.c
+++ b/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_sleep.c
@@ -14,7 +14,30 @@
#define SLEEP_TIMER_EXTRA_COMPENSATION_MSEC (0)
#define RTC_TIMER_EXTRA_COMPENSATION_MSEC (0)
-hal_sleep_ctrl_t g_sleep_ctrl __attribute__((section("retention_data"))) = {0};
+typedef struct
+{
+ int irq_num;
+ sleep_condition_cb_t sleep_condition;
+ sleep_processing_cb_t pre_sleep;
+ sleep_processing_cb_t post_sleep;
+}hal_sleep_action_t ;
+
+typedef struct {
+ sleep_mode_enum_t sleep_mode;
+ uint32_t peripheral_mod;
+ hal_sleep_action_t actions[29];
+}hal_sleep_config_t;
+
+typedef struct
+{
+ bool flag;
+ hal_sleep_config_t sleep_config;
+ uint32_t nvic_int_en[2];
+ uint64_t compensation;
+ uint32_t msec;
+}hal_sleep_ctrl_t ;
+
+hal_sleep_ctrl_t g_sleep_ctrl __attribute__((section("retention_data")));
static hal_sleep_ctrl_t *hal_sleep_get_handle(void)
{
@@ -24,15 +47,9 @@ static hal_sleep_ctrl_t *hal_sleep_get_handle(void)
void EXTERNAL_IRQHandler(void)
{
HAL_SYSCON_EXT_INTR_Clear();
- hal_sleep_wakeup_source_set(EXT_INT_WAKEUP);
}
-static void hal_sleep_external_irq_wakeup_init(SYSTEM_EXT_INT_Wakeup_Index ext_int_idx, SYSTEM_EXT_INT_Triggle_Type triggle)
-{
- HAL_SYSCON_EXT_INTR_Set_Triggle_Condition(ext_int_idx, triggle);
- HAL_SYSCON_EXT_INTR_Enable(ext_int_idx, true);
- NVIC_EnableIRQ(EXTERNAL_IRQn);
-}
-void hal_sleep_rtc_wakeup_init(uint32_t counter_match)
+
+static int hal_sleep_rtc_init(uint32_t counter_match)
{
RTC_InitTypeDef rtcConfig;
@@ -44,11 +61,13 @@ void hal_sleep_rtc_wakeup_init(uint32_t counter_match)
HAL_RTC_Init(rtcConfig);
HAL_RTC_Enable(RTC_ENABLE);
NVIC_EnableIRQ(RTC_IRQn);
+ return 0;
}
-void hal_sleep_rtc_wakeup_deinit(void)
+static int hal_sleep_rtc_deinit(void)
{
HAL_RTC_Enable(RTC_DISABLE);
NVIC_DisableIRQ(RTC_IRQn);
+ return 0;
}
void RTC_IRQHandler(void)
{
@@ -59,122 +78,316 @@ void RTC_IRQHandler(void)
HAL_RTC_ClearInt();
//disable RTC
- hal_sleep_rtc_wakeup_deinit();
-
- //set wakeup src
- hal_sleep_wakeup_source_set(RTC_WAKEUP);
+ hal_sleep_rtc_deinit();
}
}
-
-void hal_sleep_init(hal_sleep_config_t *sleep_config)
+void SLEEP_IRQHandler(void)
{
- hal_sleep_ctrl_t *sleep_ctrl = hal_sleep_get_handle();
-
- if(sleep_ctrl->inited){
- LOG(LOG_LVL_EMERG, "Function hal_sleep_init(*sleep_config) has been called, If you want to reconfigure, please call hal_sleep_deinit() and re-call hal_sleep_init(*sleep_config)\r\n");
- return;
- }
- memset(sleep_ctrl, 0, sizeof(hal_sleep_ctrl_t));
- sleep_ctrl->inited = true;
- memcpy(&(sleep_ctrl->sleep_config), sleep_config, sizeof(hal_sleep_config_t));
-}
-void hal_sleep_deinit(void)
-{
- hal_sleep_ctrl_t *sleep_ctrl = hal_sleep_get_handle();
- memset(sleep_ctrl, 0, sizeof(hal_sleep_ctrl_t));
- return;
-}
-static void hal_sleep_wakeup_source_clear_all(void)
-{
- hal_sleep_ctrl_t *sleep_ctrl = hal_sleep_get_handle();
- hal_sleep_config_t *sleep_config = &(sleep_ctrl->sleep_config);
- sleep_config->wakeup_src = 0;
-}
-static void hal_sleep_wakeup_source_update(void)
-{
- hal_sleep_ctrl_t *sleep_ctrl = hal_sleep_get_handle();
- hal_sleep_config_t *sleep_config = &(sleep_ctrl->sleep_config);
- sleep_mode_enum_t sleep_mode = sleep_config->sleep_mode;
-
- //clear wakeup source
- hal_sleep_wakeup_source_clear_all();
- if(sleep_mode >= LIGHT_SLEEP)
- {
- //±£´æÖжÏʹÄܼĴæÆ÷µÄÖµ
- sleep_ctrl->nvic_int_en[0] = NVIC->ISER[0];
- sleep_ctrl->nvic_int_en[1] = NVIC->ISER[1];
-
- //Çå³ýÖжÏʹÄܼĴæÆ÷
- //disable all interrupts
- NVIC->ICER[0] = 0xFFFFFFFF;
- NVIC->ICER[1] = 0xFFFFFFFF;
- }
-
- //enable wakeup IRQ
- if(sleep_mode >= LIGHT_SLEEP){
- if(sleep_mode == LIGHT_SLEEP){
- NVIC_EnableIRQ(UART0_IRQn);
- NVIC_EnableIRQ(UART1_IRQn);
- }else{
- NVIC_EnableIRQ(SLEEP_IRQn);
- }
-
- #if WIFI_SWITCH==0
- if(sleep_mode <= DEEP_SLEEP){
- NVIC_EnableIRQ(MAC_IRQn);
- }
- #endif
-
- if(sleep_config->wakeup_src & EXT_INT_WAKEUP){
- //ext int wakeup init
- hal_sleep_external_irq_wakeup_init(HAL_GPIO_Mapping_To_Ext_Int(sleep_config->ext_irq_cfg.gpio), sleep_config->ext_irq_cfg.triggle_type);
- }
- }
+ NVIC_DisableIRQ(SLEEP_IRQn);
+ //do nothing
}
-void hal_sleep_set_config(hal_sleep_config_t *sleep_config)
-{
- hal_sleep_ctrl_t *sleep_ctrl = hal_sleep_get_handle();
-
- if(!sleep_ctrl->inited){
- LOG(LOG_LVL_EMERG, "Function hal_sleep_init(*sleep_config) has not been called before, so you can't set sleep_config!\r\n");
- return;
- }
- memcpy(&(sleep_ctrl->sleep_config), sleep_config, sizeof(hal_sleep_config_t));
-}
-
-sleep_mode_enum_t hal_sleep_get_mode(void)
-{
- hal_sleep_ctrl_t *sleep_ctrl = hal_sleep_get_handle();
- return sleep_ctrl->sleep_config.sleep_mode;
-}
-extern bool is_sta_sleeping(void);
-extern void initialize_phy(void);
+#if 0
#define RAM_RETENTION (1 << 0)
#define RAM_MAC (1 << 1)
#define RAM_CPU (1 << 2)
-#if WIFI_SWITCH
-extern uint8_t wifi_en;
#endif
+
+#define PRE_SLEEP_LOOP_COUNT 10
+static void pre_sleep_processing_hardware(sleep_mode_enum_t sleep_mode, uint8_t sram_powerdown)
+{
+ int i = 0;
+ hal_sleep_ctrl_t *sleep_ctrl = hal_sleep_get_handle();
+ hal_sleep_config_t *sleep_config = &(sleep_ctrl->sleep_config);
+
+ if(sleep_mode < LIGHT_SLEEP || sleep_mode > FROZEN_SLEEP){
+ return;
+ }
+
+ if(sleep_mode >= RETENTION_SLEEP){
+ HAL_SYSCON_AWO_sram_pd_en(sram_powerdown);
+ HAL_SYSCON_AWO_sram_po_en(0x07);
+ HAL_SYSCON_AWO_pmu_ret_en(1);
+ HAL_SYSCON_AWO_pmu_unret_en(1);
+ HAL_SYSCON_AWO_pdcmp_po(0);
+ if(sleep_mode == FROZEN_SLEEP){
+ HAL_SYSCON_AWO_cpucore_retreg_po(0);//set 0 to enter frozon mode
+ HAL_SYSCON_AWO_idle_reg_set(0x52);
+ }else{
+ HAL_SYSCON_AWO_cpucore_retreg_po(1);
+ HAL_SYSCON_AWO_lp_mode_awo(1);
+ }
+ }else{//sleep_mode <= DEEP_SLEEP
+ HAL_SYSCON_AWO_sram_pd_en(sram_powerdown);
+ HAL_SYSCON_AWO_pmu_ret_en(0);
+ HAL_SYSCON_AWO_pmu_unret_en(0);
+
+ // if phy needs power down, then save phy reg to cmp
+ HAL_SYSCON_CMP_rfreg_len(0x158);
+ HAL_SYSCON_CMP_rfreg_base_addr(0x0);
+ HAL_SYSCON_CMP_rfreg_action_set(0x1);//bit 0 is save rf register
+ while(HAL_SYSCON_CMP_save_done_get() != 1);
+ }
+
+ if((sleep_mode >= DEEP_SLEEP) && (sleep_mode <= RETENTION_SLEEP)){
+ ll_sleep_mac_tsf_clk_switch(1);//switch to 32k and power saving
+ }
+
+ //set CM4 sleep mode
+ if(sleep_mode >= DEEP_SLEEP){
+ SCB->SCR |= (1<<2);
+ }else{
+ SCB->SCR &= ~(1<<2);
+ }
+ if(sleep_mode == LIGHT_SLEEP){
+ HAL_SYSCON_AWO_sw_pwr_ctrl_set(0x02);
+ while(i++ < PRE_SLEEP_LOOP_COUNT){
+ __NOP();
+ }
+ while(HAL_SYSCON_AWO_pmu_fsm_get() != 0);
+ HAL_SYSCON_CMP_sw_clkg_set(sleep_config->peripheral_mod|(1< FROZEN_SLEEP){
+ return;
+ }
+
+ if(sleep_mode <= DEEP_SLEEP){
+ if(sleep_mode == LIGHT_SLEEP){
+ HAL_SYSCON_AWO_sw_pwr_ctrl_set(0x01);
+ HAL_SYSCON_CMP_sw_clkg_set(0xFFFFFFFF);
+ while(HAL_SYSCON_AWO_pmu_fsm_get() != 0);
+ }
+ HAL_SYSCON_AWO_pmu_ret_en(0);
+ HAL_SYSCON_AWO_pmu_unret_en(0);
+ //restore RF register firstly
+ HAL_SYSCON_CMP_rfreg_len(0x158);
+ HAL_SYSCON_CMP_rfreg_base_addr(0x0);
+ HAL_SYSCON_CMP_rfreg_action_set(0x2);//bit 1 is restore rf register
+ while(HAL_SYSCON_CMP_restore_done_get() != 1);
+ }
+
+ if((sleep_mode >= DEEP_SLEEP) && (sleep_mode <= RETENTION_SLEEP)){
+ ll_sleep_mac_tsf_clk_switch(0);//switch to 40M
+ }
+}
+static int hal_sleep_peripheral_module_to_IRQn(hal_peripheral_module_t peripheral_module)
+{
+ int ret = 0;
+
+ switch(peripheral_module){
+ case MOD_QSPI:
+ ret = QSPI_IRQn;
+ break;
+ case MOD_ADDC:
+ ret = ADC_IRQn;
+ break;
+ case MOD_I2S:
+ ret = I2S_IRQn;
+ break;
+ case MOD_GPIO:
+ ret = GPIO_IRQn;
+ break;
+ case MOD_SPIM:
+ ret = SPI0_IRQn;
+ break;
+ case MOD_SPIS:
+ ret = SPI2_IRQn;
+ break;
+ case MOD_I2C0:
+ ret = I2C0_IRQn;
+ break;
+ case MOD_I2C1:
+ ret = I2C1_IRQn;
+ break;
+ case MOD_UART0:
+ ret = UART0_IRQn;
+ break;
+ case MOD_UART1:
+ ret = UART1_IRQn;
+ break;
+ case MOD_SPIM2:
+ ret = SPI1_IRQn;
+ break;
+ case MOD_WDT:
+ ret = WDT_IRQn;
+ break;
+ case MOD_TIMER0:
+ ret = TIMER_IRQn;
+ break;
+ case MOD_TIMER1:
+ ret = TIMER_IRQn;
+ break;
+ case MOD_TIMER2:
+ ret = TIMER_IRQn;
+ break;
+ case MOD_TIMER3:
+ ret = TIMER_IRQn;
+ break;
+ case MOD_TIMER4:
+ ret = TIMER_IRQn;
+ break;
+ case MOD_SDIO:
+ ret = SDIO_FUN1_IRQn;
+ break;
+ case MOD_MAC:
+ ret = MAC_IRQn;
+ break;
+ case MOD_DMA:
+ ret = DMA_IRQn;
+ break;
+ case MOD_PWM:
+ ret = PWM_IRQn;
+ break;
+ case MOD_TRNG:
+ ret = TRNG_IRQn;
+ break;
+ case MOD_AES:
+ ret = AES_IRQn;
+ break;
+ case MOD_EXT_INT:
+ ret = EXTERNAL_IRQn;
+ break;
+ case MOD_DGBH:
+ case MOD_CACHE:
+ case MOD_RFREG:
+ case MOD_EF:
+ default:
+ break;
+ }
+ return ret;
+}
+
+static int log2(uint32_t val)
+{
+ int ret = 0;
+ switch(val)
+ {
+ case 0x1: ret = 0; break;
+ case 0x2: ret = 1; break;
+ case 0x4: ret = 2; break;
+ case 0x8: ret = 3; break;
+ case 0x10: ret = 4; break;
+ case 0x20: ret = 5; break;
+ case 0x40: ret = 6; break;
+ case 0x80: ret = 7; break;
+ case 0x100: ret = 8; break;
+ case 0x200: ret = 9; break;
+ case 0x400: ret = 10; break;
+ case 0x800: ret = 11; break;
+ case 0x1000: ret = 12; break;
+ case 0x2000: ret = 13; break;
+ case 0x4000: ret = 14; break;
+ case 0x8000: ret = 15; break;
+ case 0x10000: ret = 16; break;
+ case 0x20000: ret = 17; break;
+ case 0x40000: ret = 18; break;
+ case 0x80000: ret = 19; break;
+ case 0x100000: ret = 20; break;
+ case 0x200000: ret = 21; break;
+ case 0x400000: ret = 22; break;
+ case 0x800000: ret = 23; break;
+ case 0x1000000: ret = 24; break;
+ case 0x2000000: ret = 25; break;
+ case 0x4000000: ret = 26; break;
+ case 0x8000000: ret = 27; break;
+ case 0x10000000: ret = 28; break;
+ case 0x20000000: ret = 29; break;
+ case 0x40000000: ret = 30; break;
+ case 0x80000000: ret = 31; break;
+ default: break;
+ }
+ return ret;
+}
+
+/**
+ * @brief Check whether can sleep
+ *
+ * @param none
+ *
+ * @note If can sleep, return true; else return flase.
+ */
+static bool hal_sleep_condition_check(hal_sleep_config_t *sleep_config)
+{
+ bool ret = true;
+ hal_sleep_action_t *action;
+ uint32_t value, tmp, idx;
+
+ if(!sleep_config){
+ return false;
+ }
+ value = sleep_config->peripheral_mod;
+ while(value){
+ tmp = value & (value - 1);
+ idx = log2(value - tmp);
+ action = &(sleep_config->actions[idx]);
+ if(action->sleep_condition){
+ ret = ret && action->sleep_condition();
+ }
+ value = tmp;
+ }
+ return ret;
+}
+
+static void hal_pre_sleep_processing_registered_cb(hal_sleep_config_t *sleep_config)
+{
+ hal_sleep_action_t *action;
+ uint32_t value, tmp, idx;
+
+ if(!sleep_config){
+ return;
+ }
+ value = sleep_config->peripheral_mod;
+ while(value){
+ tmp = value & (value - 1);
+ idx = log2(value - tmp);
+ action = &(sleep_config->actions[idx]);
+ NVIC_EnableIRQ((IRQn_Type)action->irq_num);
+ if(action->pre_sleep){
+ action->pre_sleep();
+ }
+ value = tmp;
+ }
+}
+static void hal_post_sleep_processing_registered_cb(hal_sleep_config_t *sleep_config)
+{
+ hal_sleep_action_t *action;
+ uint32_t value, tmp, idx;
+
+ if(!sleep_config){
+ return;
+ }
+ value = sleep_config->peripheral_mod;
+ while(value){
+ tmp = value & (value - 1);
+ idx = log2(value - tmp);
+ action = &(sleep_config->actions[idx]);
+ if(action->post_sleep){
+ action->post_sleep();
+ }
+ value = tmp;
+ }
+}
+
void hal_pre_sleep_processing(uint32_t *ticks)
{
hal_sleep_ctrl_t *sleep_ctrl = hal_sleep_get_handle();
sleep_mode_enum_t sleep_mode = hal_sleep_get_mode();
uint64_t u64val = (uint64_t)(*ticks) * 1000 / configTICK_RATE_HZ;
uint8_t sram_powerdown = 0x00;//RAM_RETENTION | RAM_MAC | RAM_CPU
+ hal_sleep_config_t *sleep_config = &(sleep_ctrl->sleep_config);
-#if WIFI_SWITCH
- if(sleep_mode < LIGHT_SLEEP || sleep_ctrl->flag || (wifi_en==1)){
+ if(sleep_mode < LIGHT_SLEEP || sleep_ctrl->flag){
*ticks = 0;
return;
}
- //LOG(LOG_LVL_INFO, "\r\n%s() line:%d\r\n",__func__,__LINE__);
-#else
- if(sleep_mode < LIGHT_SLEEP || sleep_ctrl->flag || (sleep_ctrl->wifi_is_slept_cb && !sleep_ctrl->wifi_is_slept_cb())){
+
+ if(!hal_sleep_condition_check(sleep_config)){
*ticks = 0;
return;
}
-#endif
if(u64val >> 32){
LOG(LOG_LVL_EMERG, "[%s, %d]ticks(%d) expected overflow!\r\n", __func__, __LINE__, *ticks);
@@ -187,22 +400,24 @@ void hal_pre_sleep_processing(uint32_t *ticks)
sleep_ctrl->flag = true;
- //set wakeup source
- hal_sleep_wakeup_source_update();
+ hal_pre_sleep_processing_registered_cb(sleep_config);
if(sleep_mode == LIGHT_SLEEP){
// LIGHT_SLEEP˯Ãßģʽʱ£¬Ê¹ÓÃRTC»½ÐÑ
u64val = ((uint64_t)1000000 * (sleep_ctrl->msec - RTC_TIMER_EXTRA_COMPENSATION_MSEC))/HAL_SYSCON_Get32KPeriodNs();
- if(u64val >> 32){
- LOG(LOG_LVL_EMERG, "[%s, %d]RTC counter_match(%lld) overflow!\r\n", __func__, __LINE__, u64val);
- u64val = u64val & 0xFFFFFFFFULL;
- }
- hal_sleep_rtc_wakeup_init(u64val);
+ hal_sleep_rtc_init((uint32_t)u64val);
}else{
// ÆäËû˯Ãßģʽʱ£¬Ê¹ÓÃרÃŵÄsleep timer»½ÐÑ
sleep_ctrl->compensation = HAL_SYSCON_CalculateCompensateNs() + (uint64_t)SLEEP_TIMER_EXTRA_COMPENSATION_MSEC*1000000;
HAL_SYSCON_CPUSleepDurationEnable(((uint64_t)*ticks * 1000000000 / configTICK_RATE_HZ) - sleep_ctrl->compensation);
+ NVIC_EnableIRQ(SLEEP_IRQn);
}
- ll_pre_sleep_processing(sleep_mode, sram_powerdown);
+ //ll_pre_sleep_processing(sleep_mode, sram_powerdown);
+ pre_sleep_processing_hardware(sleep_mode, sram_powerdown);
+
+ HAL_SYSCON_AWO_clk_sel_set(0); // switch to crystal clock
+
+
+
}
uint32_t hal_post_sleep_processing(uint32_t ticks)
{
@@ -225,7 +440,7 @@ uint32_t hal_post_sleep_processing(uint32_t ticks)
}
sleep_ctrl->flag = false;
- ll_post_sleep_processing(mode);
+ post_sleep_processing_hardware(mode);
if(mode == LIGHT_SLEEP){
ticks = (((uint64_t)HAL_RTC_GetCurValue() * HAL_SYSCON_Get32KPeriodNs() / 1000000 + RTC_TIMER_EXTRA_COMPENSATION_MSEC) * configTICK_RATE_HZ) / 1000;
@@ -243,28 +458,67 @@ uint32_t hal_post_sleep_processing(uint32_t ticks)
NVIC->ISER[0] = sleep_ctrl->nvic_int_en[0];
NVIC->ISER[1] = sleep_ctrl->nvic_int_en[1];
}
- if(sleep_ctrl->reinit_phy_cb)
- {
- sleep_ctrl->reinit_phy_cb();
- }
+ hal_post_sleep_processing_registered_cb(&(sleep_ctrl->sleep_config));
+
+ HAL_SYSCON_AWO_clk_sel_set(1); // switch to system pll clock
return ticks;
}
-void hal_sleep_wakeup_source_set(hal_sleep_wakeup_src_enum_t wakeup_src)
+
+int hal_sleep_set_mode(sleep_mode_enum_t sleep_mode)
+{
+ hal_sleep_ctrl_t *sleep_ctrl = hal_sleep_get_handle();
+
+ sleep_ctrl->sleep_config.sleep_mode = sleep_mode;
+
+ return 0;
+}
+
+sleep_mode_enum_t hal_sleep_get_mode(void)
+{
+ hal_sleep_ctrl_t *sleep_ctrl = hal_sleep_get_handle();
+ return sleep_ctrl->sleep_config.sleep_mode;
+}
+
+int hal_sleep_register(hal_peripheral_module_t peripheral_module, sleep_condition_cb_t sleep_condition, sleep_processing_cb_t pre_sleep, sleep_processing_cb_t post_sleep)
{
hal_sleep_ctrl_t *sleep_ctrl = hal_sleep_get_handle();
hal_sleep_config_t *sleep_config = &(sleep_ctrl->sleep_config);
- sleep_config->wakeup_src |= wakeup_src;
+ hal_sleep_action_t *action;
+
+ if(peripheral_module >= MOD_MAX || peripheral_module < MOD_QSPI){
+ return -1;
+ }
+
+ action = &(sleep_config->actions[peripheral_module]);
+ SET_BIT(sleep_config->peripheral_mod, peripheral_module);
+ action->irq_num = hal_sleep_peripheral_module_to_IRQn(peripheral_module);
+ if(sleep_condition){
+ action->sleep_condition = sleep_condition;
+ }
+ if(pre_sleep){
+ action->pre_sleep = pre_sleep;
+ }
+ if(post_sleep){
+ action->post_sleep = post_sleep;
+ }
+ return 0;
}
-void hal_sleep_register_callback(reinitialize_phy_cb_t reinit_phy_cb, wifi_is_slept_cb_t wifi_is_slept_cb)
+int hal_sleep_unregister(hal_peripheral_module_t peripheral_module)
{
hal_sleep_ctrl_t *sleep_ctrl = hal_sleep_get_handle();
- sleep_ctrl->reinit_phy_cb = reinit_phy_cb;
- sleep_ctrl->wifi_is_slept_cb = wifi_is_slept_cb;
-}
-
-void SLEEP_IRQHandler(void)
-{
- //do nothing
- hal_sleep_wakeup_source_set(SLEEP_TIMER_WAKEUP);
+ hal_sleep_config_t *sleep_config = &(sleep_ctrl->sleep_config);
+ hal_sleep_action_t *action;
+
+ if(peripheral_module >= MOD_MAX || peripheral_module < MOD_QSPI){
+ return -1;
+ }
+
+ action = &(sleep_config->actions[peripheral_module]);
+ CLR_BIT(sleep_config->peripheral_mod, peripheral_module);
+ action->irq_num = 0;
+ action->sleep_condition = NULL;
+ action->pre_sleep = NULL;
+ action->post_sleep = NULL;
+ return 0;
}
diff --git a/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_syscon.c b/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_syscon.c
index d1b0cd26..9e38e16c 100644
--- a/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_syscon.c
+++ b/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_syscon.c
@@ -498,6 +498,7 @@ void HAL_SYSCON_EXT_INTR_Clear(void)
LL_SYSCON_EXT_INTR_Clear();
}
+
/**
* @brief Reset the mcu by software
*
@@ -526,13 +527,104 @@ void HAL_SYSCON_Xtal40MCap_Set(uint8_t cap)
LL_SYSCON_Xtal40MCap_Set(cap);
}
-
void HAL_SYSCON_PmuCfg(void)
{
LL_SYSCON_PMUReg_Set(0x8B050900);// (BUCK) r_vtrim: bit[9:8]=0b01 //00: 1.195 / 01: 1.202 / 10: 1.210 / 11: 1.218
- LL_SYSCON_PMUCfg_Set(0x20001603);// o_digldo_norvdd: bit[10:8]=0b100; o_digldo_retvdd: bit[14:12]=0b001
+ //LL_SYSCON_PMUCfg_Set(0x20001603);// o_digldo_norvdd: bit[10:8]=0b100; o_digldo_retvdd: bit[14:12]=0b001
+ LL_SYSCON_PMUCfg_Set(0x310746fd);// o_digldo_norvdd: bit[10:8]=0b100; o_digldo_retvdd: bit[14:12]=0b110
LL_SYSCON_Misc_Set(0x00002C0D);
LL_SYSCON_PMUAvdd_Set(0x00055DB6);// Avdd & PLL & RF voltage 55B75
}
+void HAL_SYSCON_AWO_phy_pd_en(uint8_t en)
+{
+ LL_SYSCON_AWO_phy_pd_en(en);
+}
+void HAL_SYSCON_AWO_phy_po_en(uint8_t en)
+{
+ LL_SYSCON_AWO_phy_po_en(en);
+}
+void HAL_SYSCON_AWO_ldo18_po_en(uint8_t en)
+{
+ LL_SYSCON_AWO_ldo18_po_en(en);
+}
+void HAL_SYSCON_AWO_sram_pd_en(uint8_t en)
+{
+ LL_SYSCON_AWO_sram_pd_en(en);
+}
+void HAL_SYSCON_AWO_sram_po_en(uint8_t en)
+{
+ LL_SYSCON_AWO_sram_po_en(en);
+}
+
+void HAL_SYSCON_AWO_pmu_ret_en(uint8_t en)
+{
+ LL_SYSCON_AWO_pmu_ret_en(en);
+}
+void HAL_SYSCON_AWO_pmu_unret_en(uint8_t en)
+{
+ LL_SYSCON_AWO_pmu_unret_en(en);
+}
+void HAL_SYSCON_AWO_pdcmp_po(uint8_t po)
+{
+ LL_SYSCON_AWO_pdcmp_po(po);
+}
+
+void HAL_SYSCON_AWO_cpucore_retreg_po(uint8_t po)
+{
+ LL_SYSCON_AWO_cpucore_retreg_po(po);
+}
+void HAL_SYSCON_AWO_idle_reg_set(uint32_t val)
+{
+ LL_SYSCON_AWO_idle_reg_set(val);
+}
+
+void HAL_SYSCON_AWO_lp_mode_awo(uint8_t lp_mode_awo)
+{
+ LL_SYSCON_AWO_lp_mode_awo(lp_mode_awo);
+}
+
+void HAL_SYSCON_AWO_clk_sel_set(uint32_t val)
+{
+ LL_SYSCON_AWO_clk_sel_set(val);
+}
+
+void HAL_SYSCON_CMP_rfreg_len(uint16_t rfreg_len)
+{
+ LL_SYSCON_CMP_rfreg_len(rfreg_len);
+}
+void HAL_SYSCON_CMP_rfreg_base_addr(uint16_t rfreg_base_addr)
+{
+ LL_SYSCON_CMP_rfreg_base_addr(rfreg_base_addr);
+}
+
+void HAL_SYSCON_CMP_rfreg_action_set(uint32_t val)
+{
+ LL_SYSCON_CMP_rfreg_action_set(val);
+}
+
+uint8_t HAL_SYSCON_CMP_save_done_get(void)
+{
+ return LL_SYSCON_CMP_save_done_get();
+}
+
+void HAL_SYSCON_AWO_sw_pwr_ctrl_set(uint32_t value)
+{
+ LL_SYSCON_AWO_sw_pwr_ctrl_set(value);
+}
+
+uint8_t HAL_SYSCON_AWO_pmu_fsm_get(void)
+{
+ return LL_SYSCON_AWO_pmu_fsm_get();
+}
+
+uint8_t HAL_SYSCON_CMP_restore_done_get(void)
+{
+ return LL_SYSCON_CMP_restore_done_get();
+}
+
+void HAL_SYSCON_CMP_sw_clkg_set(uint32_t value)
+{
+ LL_SYSCON_CMP_sw_clkg_set(value);
+}
diff --git a/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_timer.c b/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_timer.c
index fdd1822b..a3cb4c4e 100644
--- a/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_timer.c
+++ b/platform/vendor_bsp/LN/ln882x/src/driver_ln882x/hal/hal_timer.c
@@ -4,6 +4,7 @@
#include "ll/ll_syscon.h"
#include "hal/hal_common.h"
+timer_cb_func_t Timer_cb_func[4]={NULL};
/**
* @brief Initialize the timer according to the input param config.
@@ -16,6 +17,7 @@ void HAL_TIMER_Init(TIMER_InitTypeDef config)
assert_param(IS_TIMER_MODE(config.mode));
assert_param(IS_TIMER_MASK(config.mask));
assert_param( ((APBUS0_CLOCK / config.user_freq) >= 1 ) && ( (APBUS0_CLOCK / config.user_freq) <= 256 ));
+ assert_param(config.cb_func);
HAL_TIMER_Enable(config.index, TIMER_DISABLE);
@@ -52,6 +54,10 @@ void HAL_TIMER_Init(TIMER_InitTypeDef config)
default:
break;
}
+ if(config.cb_func)
+ {
+ Timer_cb_func[config.index-1]=config.cb_func;
+ }
}
@@ -233,4 +239,14 @@ uint32_t HAL_TIMER_LoadCount2_Get(TIMER_Index index)
return LL_TIMER_LoadCount2_Get(index);
}
-
+void TIMER_IRQHandler()
+{
+ TIMER_Index index;
+ for(index=TIMER_1;index<=TIMER_4;index++)
+ {
+ if(HAL_TIMER_Int_Status(index)&&Timer_cb_func[index-1])
+ {
+ Timer_cb_func[index-1]();
+ }
+ }
+}
diff --git a/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_agent.c b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_agent.c
new file mode 100644
index 00000000..5e5a4736
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_agent.c
@@ -0,0 +1,316 @@
+#include "string.h"
+#include "xz_decompress.h"
+#include "flash_partition_mgr.h"
+
+#include "ota_image.h"
+#include "ota_agent.h"
+#include "ota_port.h"
+
+
+static uint8_t temp_buf[LEN_4KB];
+
+static image_hdr_t app_header;
+static image_hdr_t ota_header;
+static partition_info_t partition_info_app;
+static partition_info_t partition_info_ota;
+
+static int verify_total_img_partition(partition_type_t type, \
+ partition_info_t *info, image_hdr_t *hdr)
+{
+ int err;
+
+ if (LN_TRUE != ln_fetch_partition_info(type, info)) {
+ return OTA_ERR_PARTITION_TAB;
+ }
+
+ if (OTA_ERR_NONE != (err = image_header_read(type, hdr))) {
+ return err;
+ }
+
+ if (OTA_ERR_NONE != (err = image_header_verify(hdr))) {
+ return err;
+ }
+
+ if (OTA_ERR_NONE != (err = image_body_verify(info->start_addr, hdr))) {
+ return err;
+ }
+
+ return OTA_ERR_NONE;
+}
+
+static int orig_image_do_restore(uint32_t app_body_offset, \
+ uint32_t ota_body_offset, uint32_t size)
+{
+ uint32_t i = 0;
+ uint32_t count_4k = size / LEN_4KB;
+ uint32_t remainder_4k = size % LEN_4KB;
+ ota_port_ctx_t * port = ota_get_port_ctx();
+
+ for (i = 0; i < count_4k; i++) {
+ port->flash_drv.read(ota_body_offset, temp_buf, LEN_4KB);
+ port->flash_drv.write(app_body_offset, temp_buf, LEN_4KB);
+ ota_body_offset += LEN_4KB;
+ app_body_offset += LEN_4KB;
+ }
+
+ if (remainder_4k) {
+ port->flash_drv.read(ota_body_offset, temp_buf, remainder_4k);
+ port->flash_drv.write(app_body_offset, temp_buf, remainder_4k);
+ }
+
+ return OTA_ERR_NONE;
+}
+
+static int decompress_read_cb(uint8_t **buf, uint32_t *buf_len)
+{
+ int32_t tmp_len;
+ uint32_t ota_xz_size = ota_header.img_size_orig_xz;
+ uint32_t ota_img_body_offset = partition_info_ota.start_addr + sizeof(image_hdr_t);
+ ota_port_ctx_t * port = ota_get_port_ctx();
+
+ static uint32_t xz_already_read = 0;
+
+ tmp_len = ota_xz_size - xz_already_read;
+ if (tmp_len > LEN_4KB) {
+ tmp_len = LEN_4KB;
+ }
+
+ *buf = temp_buf;
+
+ port->flash_drv.read(ota_img_body_offset + xz_already_read, *buf, tmp_len);
+
+ *buf_len = tmp_len;
+ xz_already_read += tmp_len;
+
+ return XZ_RET_OK;
+}
+
+static int decompress_write_cb(uint32_t offset, uint8_t *buf, uint32_t buf_len)
+{
+ uint32_t app_img_body_offset = partition_info_app.start_addr + sizeof(image_hdr_t);
+ ota_port_ctx_t * port = ota_get_port_ctx();
+ static uint32_t xz_already_write = 0;
+
+ port->flash_drv.write(app_img_body_offset + xz_already_write, buf, buf_len);
+
+ xz_already_write += buf_len;
+
+ return XZ_RET_OK;
+}
+
+static int xz_image_do_restore(uint32_t ota_body_offset, uint32_t size)
+{
+ write_cb_t out;
+ read_cb_t in;
+ xz_header_t xz_header = {0,};
+ ota_port_ctx_t * port = ota_get_port_ctx();
+
+ out.Write = decompress_write_cb;
+ in.Read = decompress_read_cb;
+
+ port->flash_drv.read(ota_body_offset, &xz_header, sizeof(xz_header_t));
+
+ if (XZ_RET_OK != xz_decompress_buf_to_buf(xz_header.header, &out, &in)) {
+ return OTA_ERR_DECOMPRESS;
+ }
+
+ return OTA_ERR_NONE;
+}
+
+static int restore_image(jump_to_app_t jump_to_app)
+{
+ static image_hdr_t img_hdr_temp;
+ upg_state_t upgrade_state;
+ uint32_t app_body_offset = 0;
+ uint32_t ota_body_offset = 0;
+ uint32_t size = 0;
+ ota_port_ctx_t * port = ota_get_port_ctx();
+ int err = OTA_ERR_NONE;
+
+ switch(ota_header.image_type)
+ {
+ case IMAGE_TYPE_ORIGINAL:
+ // copy header
+ port->flash_drv.write(partition_info_app.start_addr, &ota_header, sizeof(image_hdr_t));
+
+ // copy image
+ app_body_offset = partition_info_app.start_addr + sizeof(image_hdr_t);
+ ota_body_offset = partition_info_ota.start_addr + sizeof(image_hdr_t);
+ size = ota_header.img_size_orig;
+ if (OTA_ERR_NONE != (err = orig_image_do_restore(app_body_offset, \
+ ota_body_offset, size))) {
+ return err;
+ }
+
+ // verify app partition(new image)
+ if (OTA_ERR_NONE != (err = verify_total_img_partition(PARTITION_TYPE_APP, \
+ &partition_info_app, &app_header))) {
+ //TODO:HOOK
+ return err;
+ }
+
+ // update OTA upg state
+ upgrade_state = UPG_STATE_RESTORE_OK;
+
+ if (LN_TRUE != port->kv_ops.kv_set(KV_OTA_UPG_STATE, &upgrade_state, sizeof(upg_state_t))) {
+ //TODO:HOOK
+ return OTA_ERR_KV_RW;
+ }
+
+ jump_to_app(partition_info_app.start_addr + sizeof(image_hdr_t));
+ return OTA_ERR_NONE;
+
+ case IMAGE_TYPE_ORIGINAL_XZ:
+ // copy header
+ memcpy(&img_hdr_temp, &ota_header, sizeof(image_hdr_t));
+ img_hdr_temp.image_type = IMAGE_TYPE_ORIGINAL;
+ img_hdr_temp.header_crc32 = ln_crc32_signle_cal((uint8_t *)&img_hdr_temp, \
+ sizeof(image_hdr_t) - sizeof(uint32_t));
+
+ port->flash_drv.write(partition_info_app.start_addr, &img_hdr_temp, sizeof(image_hdr_t));
+
+ // copy image
+ ota_body_offset = partition_info_ota.start_addr + sizeof(image_hdr_t);
+ size = ota_header.img_size_orig_xz;
+
+ // it takes a lot of time.
+ if (OTA_ERR_NONE != (err = xz_image_do_restore(ota_body_offset, size))) {
+ return err;
+ }
+
+ // verify app partition(new image)
+ if (OTA_ERR_NONE != (err = verify_total_img_partition(PARTITION_TYPE_APP, \
+ &partition_info_app, &app_header))) {
+ //TODO:HOOK
+ return err;
+ }
+
+ // update OTA upg state
+ upgrade_state = UPG_STATE_RESTORE_OK;
+
+ if (LN_TRUE != port->kv_ops.kv_set(KV_OTA_UPG_STATE, &upgrade_state, sizeof(upg_state_t))) {
+ //TODO:HOOK
+ return OTA_ERR_KV_RW;
+ }
+
+ jump_to_app(partition_info_app.start_addr + sizeof(image_hdr_t));
+ return OTA_ERR_NONE;
+
+ case IMAGE_TYPE_DIFF:
+ case IMAGE_TYPE_DIFF_XZ:
+ if ((app_header.ver.ver_major == ota_header.ver_diff_depend.ver_major) && \
+ (app_header.ver.ver_minor == ota_header.ver_diff_depend.ver_minor))
+ {
+ // this feature is not supported yet.
+ return OTA_ERR_NOT_SUPPORT;
+ }
+ /* why? it's impossible to go into this branch */
+ else
+ {
+ // download ok! why? App should check it!
+ return OTA_ERR_IMPOSSIBLE_VER;
+ }
+
+ default:
+ return OTA_ERR_IMG_TYPE;
+ }
+}
+
+int ota_boot_upgrade_agent(jump_to_app_t jump_to_app)
+{
+ ota_port_ctx_t * port = ota_get_port_ctx();
+ upg_state_t upgrade_state;
+ uint32_t v_len = 0;
+ int err = OTA_ERR_NONE;
+
+ if (LN_TRUE != port->kv_ops.kv_get(KV_OTA_UPG_STATE, &upgrade_state, sizeof(upg_state_t), &v_len))
+ {
+ /* upg state param error,may be first startup or KV damaged */
+ if (OTA_ERR_NONE != (err = verify_total_img_partition(PARTITION_TYPE_APP, \
+ &partition_info_app, &app_header))) {
+ //TODO:HOOK
+ return err;
+ }
+
+ jump_to_app(partition_info_app.start_addr + sizeof(image_hdr_t));
+ return OTA_ERR_NONE;
+ }
+
+ if (UPG_STATE_DOWNLOAD_OK != upgrade_state)
+ {
+ if (OTA_ERR_NONE != (err = verify_total_img_partition(PARTITION_TYPE_APP, \
+ &partition_info_app, &app_header))) {
+ //TODO:HOOK
+ return err;
+ }
+
+ jump_to_app(partition_info_app.start_addr + sizeof(image_hdr_t));
+ return OTA_ERR_NONE;
+ }
+ else
+ {
+ if (OTA_ERR_NONE != (err = verify_total_img_partition(PARTITION_TYPE_APP, \
+ &partition_info_app, &app_header))) {
+ //last time copy err case.
+
+ //return errno
+ }
+ else
+ {
+ if (OTA_ERR_NONE != (err = verify_total_img_partition(PARTITION_TYPE_OTA, \
+ &partition_info_ota, &ota_header))) {
+ //update OTA upg state [upg restory filed]
+
+ //jump to app!
+ jump_to_app(partition_info_app.start_addr + sizeof(image_hdr_t));
+
+ return err;//ota err image but wo also jump to app
+ }
+
+ //version compare
+ if ((ota_header.ver.ver_major + ota_header.ver.ver_minor) > \
+ (app_header.ver.ver_major + app_header.ver.ver_minor))
+ {
+ port->flash_drv.erase(partition_info_app.start_addr, partition_info_app.size);
+ return restore_image(jump_to_app);
+
+ }
+ else if ((ota_header.ver.ver_major + ota_header.ver.ver_minor) == \
+ (app_header.ver.ver_major + app_header.ver.ver_minor))
+ {
+ /* a power loss may have occurred after the last restore before the UPG STATE update. */
+ if ((app_header.img_size_orig == ota_header.img_size_orig) && \
+ (app_header.img_crc32_orig == ota_header.img_crc32_orig))
+ {
+ //update OTA param
+ upgrade_state = UPG_STATE_RESTORE_OK;
+
+ if (LN_TRUE != port->kv_ops.kv_set(KV_OTA_UPG_STATE, &upgrade_state, sizeof(upg_state_t))) {
+ //TODO:HOOK
+ return OTA_ERR_KV_RW;
+ }
+
+ jump_to_app(partition_info_app.start_addr + sizeof(image_hdr_t));
+ return OTA_ERR_NONE;
+ }
+ /* why? it's impossible to go into this branch */
+ else
+ {
+ //TODO:HOOK
+ return OTA_ERR_IMPOSSIBLE_VER;
+ }
+ }
+ /* why? it's impossible to go into this branch */
+ else
+ {
+ //TODO:HOOK
+ return OTA_ERR_IMPOSSIBLE_VER;
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_agent.h b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_agent.h
new file mode 100644
index 00000000..14a0941f
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_agent.h
@@ -0,0 +1,15 @@
+#ifndef __OTA_API_H__
+#define __OTA_API_H__
+
+#include "ota_err.h"
+#include "ota_types.h"
+#include "ota_port.h"
+
+typedef void (*jump_to_app_t)(uint32_t app_entity_offset);
+
+int ota_boot_upgrade_agent(jump_to_app_t jump_to_app);
+
+
+
+#endif /* __OTA_API_H__ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_err.h b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_err.h
new file mode 100644
index 00000000..925af6b0
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_err.h
@@ -0,0 +1,24 @@
+#ifndef __OTA_ERR_H__
+#define __OTA_ERR_H__
+
+typedef enum {
+ OTA_ERR_NONE = 0u,
+ OTA_ERR_INVALID_PARAM,
+
+ OTA_ERR_KV_RW = 10u,
+ OTA_ERR_UPG_STATE,
+ OTA_ERR_PARTITION_TAB,
+ OTA_ERR_DECOMPRESS,
+
+ OTA_ERR_IMG_TYPE = 20u,
+ OTA_ERR_IMG_HEADER_READ,
+ OTA_ERR_IMG_HEADER_VERIFY,
+ OTA_ERR_IMG_ENTITY_VERIFY,
+
+ OTA_ERR_IMPOSSIBLE_VER = 30u,
+ OTA_ERR_NOT_SUPPORT,
+
+} ota_err_t;
+
+#endif /* __OTA_ERR_H__ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_image.c b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_image.c
new file mode 100644
index 00000000..a3314d2f
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_image.c
@@ -0,0 +1,113 @@
+#include "ota_image.h"
+#include "ota_port.h"
+
+
+#define TEMP_BUF_LEN (128)
+static uint8_t temp_buf[TEMP_BUF_LEN];
+
+int image_header_read(partition_type_t type, image_hdr_t *header)
+{
+ partition_info_t info;
+ ota_port_ctx_t * port = ota_get_port_ctx();
+
+ if ((type != PARTITION_TYPE_APP) && (type != PARTITION_TYPE_OTA)) {
+ return OTA_ERR_INVALID_PARAM;
+ }
+
+ if (LN_TRUE == ln_fetch_partition_info(type, &info)) {
+ port->flash_drv.read(info.start_addr, (uint8_t*)header, sizeof(image_hdr_t));
+ return OTA_ERR_NONE;
+ }
+
+ return OTA_ERR_IMG_HEADER_READ;
+}
+
+int image_header_fast_read(uint32_t start_addr, image_hdr_t *header)
+{
+ ota_port_ctx_t * port = ota_get_port_ctx();
+
+ port->flash_drv.read(start_addr, (uint8_t*)header, sizeof(image_hdr_t));
+
+ return OTA_ERR_NONE;
+}
+
+int image_header_verify(image_hdr_t *header)
+{
+ if (header->header_crc32 == ln_crc32_signle_cal((uint8_t *)header, sizeof(image_hdr_t) - sizeof(uint32_t))) {
+ return OTA_ERR_NONE;
+ }
+
+ return OTA_ERR_IMG_HEADER_VERIFY;
+}
+
+int image_body_verify(uint32_t start_addr, image_hdr_t *header)
+{
+ uint32_t offset = 0;
+ uint32_t size = 0;
+ uint32_t i = 0;
+ uint32_t crc32_result = 0;
+ crc32_ctx_t crc_ctx = {0,};
+ ota_port_ctx_t * port = ota_get_port_ctx();
+
+ if (!header) {
+ return OTA_ERR_INVALID_PARAM;
+ }
+
+ offset = start_addr + sizeof(image_hdr_t);
+
+ switch (header->image_type)
+ {
+ case IMAGE_TYPE_ORIGINAL:
+ size = header->img_size_orig;
+ break;
+ case IMAGE_TYPE_ORIGINAL_XZ:
+ size = header->img_size_orig_xz;
+ break;
+ case IMAGE_TYPE_DIFF:
+ size = header->img_size_diff;
+ break;
+ case IMAGE_TYPE_DIFF_XZ:
+ size = header->img_size_diff_xz;
+ break;
+ default:
+ return OTA_ERR_IMG_TYPE;
+ }
+
+ /* calculate CRC32 checksum of flash image segment by segment */
+ ln_crc32_init(&crc_ctx);
+
+ for (i = 0; i < size/TEMP_BUF_LEN; i++) {
+ port->flash_drv.read(offset, temp_buf, TEMP_BUF_LEN);
+
+ ln_crc32_update(&crc_ctx, temp_buf, TEMP_BUF_LEN);
+
+ offset += TEMP_BUF_LEN;
+ }
+
+ port->flash_drv.read(offset, temp_buf, size % TEMP_BUF_LEN);
+ ln_crc32_update(&crc_ctx, temp_buf, size % TEMP_BUF_LEN);
+ crc32_result = ln_crc32_final(&crc_ctx);
+
+ /* check the CRC32 checksum */
+ switch (header->image_type)
+ {
+ case IMAGE_TYPE_ORIGINAL:
+ return ((crc32_result == header->img_crc32_orig) ? OTA_ERR_NONE : OTA_ERR_IMG_ENTITY_VERIFY);
+
+ case IMAGE_TYPE_ORIGINAL_XZ:
+ return ((crc32_result == header->img_crc32_orig_xz) ? OTA_ERR_NONE : OTA_ERR_IMG_ENTITY_VERIFY);
+
+ case IMAGE_TYPE_DIFF:
+ return ((crc32_result == header->img_crc32_diff) ? OTA_ERR_NONE : OTA_ERR_IMG_ENTITY_VERIFY);
+
+ case IMAGE_TYPE_DIFF_XZ:
+ return ((crc32_result == header->img_crc32_diff_xz) ? OTA_ERR_NONE : OTA_ERR_IMG_ENTITY_VERIFY);
+
+ default:
+ return OTA_ERR_IMG_TYPE;
+ }
+}
+
+
+
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_image.h b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_image.h
new file mode 100644
index 00000000..0ed43810
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_image.h
@@ -0,0 +1,17 @@
+#ifndef __OTA_IMAGE_H__
+#define __OTA_IMAGE_H__
+
+#include "flash_partition_mgr.h"
+#include "ota_types.h"
+#include "ota_err.h"
+
+
+int image_header_read(partition_type_t type, image_hdr_t * header);
+int image_header_fast_read(uint32_t start_addr, image_hdr_t *header);
+int image_header_verify(image_hdr_t * header);
+int image_body_verify(uint32_t start_addr, image_hdr_t *header);
+
+
+#endif /* __OTA_IMAGE_H__ */
+
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_port.c b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_port.c
new file mode 100644
index 00000000..12c027eb
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_port.c
@@ -0,0 +1,72 @@
+#include "ota_port.h"
+#include "ota_err.h"
+#include "hal/flash.h"
+#include "ln_kv_api.h"
+#include "ln_kv_err.h"
+
+static ota_port_ctx_t ota_port;
+
+static int flash_read(uint32_t offset, void *buf, uint32_t len)
+{
+ return FLASH_Read(offset, len, buf);
+}
+
+static int flash_write(uint32_t offset, const void *buf, uint32_t len)
+{
+ return FLASH_Program(offset, len, (uint8_t*)buf);
+}
+
+static int flash_erase(uint32_t offset, uint32_t len)
+{
+ FLASH_Erase(offset, len);
+ return 0;
+}
+
+static int ota_kv_set(const char *key, const void *value, size_t v_len)
+{
+ if (KV_ERR_NONE == ln_kv_set(key,value,v_len)) {
+ return LN_TRUE;
+ }
+ return LN_FALSE;
+}
+
+static int ota_kv_get(const char *key, void *value_buf, size_t value_buf_size, size_t *v_len)
+{
+ if (KV_ERR_NONE == ln_kv_get(key,value_buf,value_buf_size,v_len)) {
+ return LN_TRUE;
+ }
+ return LN_FALSE;
+}
+
+static void chip_reboot(void)
+{
+
+}
+
+ota_err_t ota_port_init(void)
+{
+ ota_port.flash_drv.read = flash_read;
+ ota_port.flash_drv.write = flash_write;
+ ota_port.flash_drv.erase = flash_erase;
+
+ ota_port.kv_ops.kv_set = ota_kv_set;
+ ota_port.kv_ops.kv_get = ota_kv_get;
+
+ ota_port.chip_reboot = chip_reboot;
+
+ return OTA_ERR_NONE;
+}
+
+ota_port_ctx_t * ota_get_port_ctx(void)
+{
+ return &ota_port;
+}
+
+
+
+
+
+
+
+
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_port.h b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_port.h
new file mode 100644
index 00000000..1d43e16b
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_port.h
@@ -0,0 +1,60 @@
+#ifndef __OTA_PORT_H__
+#define __OTA_PORT_H__
+
+#include "ln_types.h"
+#include "ln_kv_err.h"
+#include "ota_err.h"
+#include "utils/crc32.h"
+
+#define LEN_4KB (1024*4)
+
+typedef int (*ota_flash_write_t)(uint32_t addr, const void *buf, uint32_t len);
+typedef int (*ota_flash_read_t)(uint32_t addr, void *buf, uint32_t len);
+typedef int (*ota_flash_erase_t)(uint32_t addr, uint32_t len);
+typedef int (*ota_kv_set_t)(const char *key, const void *value, size_t v_len);
+typedef int (*ota_kv_get_t)(const char *key, void *value_buf, size_t value_buf_size, size_t *v_len);
+typedef void (*chip_reboot_t)(void);
+
+typedef struct {
+ ota_flash_write_t write;
+ ota_flash_read_t read;
+ ota_flash_erase_t erase;
+} ota_flash_drv_t;
+
+typedef struct {
+ ota_kv_set_t kv_set;
+ ota_kv_get_t kv_get;
+} ota_kv_ops_t;
+
+typedef struct {
+ ota_flash_drv_t flash_drv;
+ ota_kv_ops_t kv_ops;
+ chip_reboot_t chip_reboot;
+} ota_port_ctx_t;
+
+
+/**
+ * @brief ota port init.
+ * initialize some hardware api that ota module depend on.
+ *
+ * @attention None.
+ *
+ * @return errcode
+ * @retval #OTA_ERR_NONE initialize ok.
+ * @retval #OTA_ERR_* initialize failed.
+ */
+ota_err_t ota_port_init(void);
+
+/**
+ * @brief get ota port context.
+ * get ota port context.
+ *
+ * @attention None.
+ *
+ * @return the pointer of ota port context.
+ */
+ota_port_ctx_t * ota_get_port_ctx(void);
+
+
+#endif /* __OTA_PORT_H__ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_types.h b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_types.h
new file mode 100644
index 00000000..b64b9965
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/ota_types.h
@@ -0,0 +1,50 @@
+#ifndef __OTA_TYPES_H__
+#define __OTA_TYPES_H__
+
+#include "ln_types.h"
+
+typedef enum {
+ IMAGE_ATTACHE = 0u, /*< it's an attache drvice image */
+ IMAGE_TYPE_ORIGINAL = 1u, /*< it's an original image */
+ IMAGE_TYPE_ORIGINAL_XZ = 2u, /*< it's an original image which is zipped */
+ IMAGE_TYPE_DIFF = 3u, /*< it's a diff image */
+ IMAGE_TYPE_DIFF_XZ = 4u, /*< it's a diff image which is zipped */
+ IMAGE_TYPE_PLACE = 0x12345678, /*< make different IDEs compatible */
+} image_type_t;
+
+typedef struct {
+ uint8_t ver_major; /*< major version number */
+ uint8_t ver_minor; /*< minor version number */
+} image_ver_t;
+
+typedef struct {
+ image_type_t image_type; /*< what's the image type */
+ image_ver_t ver; /*< image version number */
+ image_ver_t ver_diff_depend; /*< which version of the file that diff image depend on */
+ uint32_t img_size_orig; /*< size of original image */
+ uint32_t img_size_orig_xz; /*< size of original image which is zipped */
+ uint32_t img_size_diff; /*< size of diff image */
+ uint32_t img_size_diff_xz; /*< size of diff image which is zippede */
+ uint32_t img_crc32_orig; /*< checksum of original image */
+ uint32_t img_crc32_orig_xz; /*< checksum of original image which is zipped */
+ uint32_t img_crc32_diff; /*< checksum of diff image */
+ uint32_t img_crc32_diff_xz; /*< checksum of diff image which is zippede */
+ uint8_t res[212]; /*< reserved space */
+ uint32_t header_crc32; /*< checksum of the image header except for itself */
+} image_hdr_t;
+
+typedef enum {
+ UPG_STATE_DOWNLOAD_ING = 0u, /*< ota image downloading */
+ UPG_STATE_DOWNLOAD_OK = 1u, /*< ota image download finish and check success */
+ UPG_STATE_RESTORE_ING = 2u, /*< ota image restoring */
+ UPG_STATE_RESTORE_OK = 3u, /*< ota image restore finish and check success */
+ UPG_STATE_RESTORE_FILED = 4u, /*< ota image restore filed */
+ UPG_STATE_PLACE = 0x12345678, /*< make different IDEs compatible */
+} upg_state_t;
+
+#define KV_OTA_UPG_STATE "kv_ota_upg_state"
+
+
+#endif /*< __OTA_TYPES_H__ */
+
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/xz_decompress.c b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/xz_decompress.c
new file mode 100644
index 00000000..a6e2426e
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/xz_decompress.c
@@ -0,0 +1,593 @@
+
+#include "xz_decompress.h"
+#include
+#include
+#include
+
+#define XZ_BASE_SIZE 1846
+#define XZ_LIT_SIZE 768
+
+#define kNumTopBits 24
+#define kTopValue ((uint32_t)1 << kNumTopBits)
+#define kNumBitModelTotalBits 11
+#define kBitModelTotal (1 << kNumBitModelTotalBits)
+#define kNumMoveBits 5
+
+typedef struct
+{
+ uint8_t* Buffer;
+ uint8_t* BufferLim;
+ uint32_t Range;
+ uint32_t Code;
+ read_cb_t* InCallback;
+ int read_cb_ret;
+ int ExtraBytes;
+} CRangeDecoder;
+
+typedef struct
+{
+ CRangeDecoder RangeDecoder;
+ uint8_t* Dictionary;
+ uint32_t DictionarySize;
+ uint32_t DictionaryPos;
+ uint32_t GlobalPos;
+ uint32_t Reps[4];
+ int lc;
+ int lp;
+ int pb;
+ int State;
+ int PreviousIsMatch;
+ int RemainLen;
+} XzVarState;
+
+uint8_t RangeDecoderReadByte(CRangeDecoder* rd)
+{
+ uint32_t size = 0;
+ if (rd->Buffer == rd->BufferLim)
+ {
+ rd->read_cb_ret = rd->InCallback->Read(&rd->Buffer, &size);
+ rd->BufferLim = rd->Buffer + size;
+ if (size == 0) {
+ rd->ExtraBytes = 1;
+ return 0xFF;
+ }
+ }
+ return (*rd->Buffer++);
+}
+
+#define ReadByte (RangeDecoderReadByte(rd))
+
+void RangeDecoderInit(CRangeDecoder* rd, read_cb_t* in_cb)
+{
+ rd->InCallback = in_cb;
+ rd->Buffer = rd->BufferLim = 0;
+ rd->ExtraBytes = 0;
+ rd->Code = 0;
+ rd->Range = (0xFFFFFFFF);
+ for (int i = 0; i < 5; i++) {
+ rd->Code = (rd->Code << 8) | ReadByte;
+ }
+}
+
+uint32_t RangeDecoderDecodeDirectBits(CRangeDecoder* rd, int numTotalBits)
+{
+ uint32_t range = rd->Range;
+ uint32_t code = rd->Code;
+ uint32_t result = 0;
+
+ for (int i = numTotalBits; i > 0; i--)
+ {
+ range >>= 1;
+ result <<= 1;
+
+ if (code >= range) {
+ code -= range;
+ result |= 1;
+ }
+
+ /* uint32_t t; */
+ /*
+ t = (code - range) >> 31;
+ t &= 1;
+ code -= range & (t - 1);
+ result = (result + result) | (1 - t);
+ */
+
+ if (range < kTopValue) {
+ range <<= 8;
+ code = (code << 8) | ReadByte;
+ }
+ }
+
+ rd->Range = range;
+ rd->Code = code;
+ return result;
+}
+
+int RangeDecoderBitDecode(prob_t* prob, CRangeDecoder* rd)
+{
+ uint32_t bound = (rd->Range >> kNumBitModelTotalBits)* (*prob);
+ if (rd->Code < bound)
+ {
+ rd->Range = bound;
+ *prob += (kBitModelTotal - *prob) >> kNumMoveBits;
+ if (rd->Range < kTopValue)
+ {
+ rd->Code = (rd->Code << 8) | ReadByte;
+ rd->Range <<= 8;
+ }
+ return 0;
+ }
+ else
+ {
+ rd->Range -= bound;
+ rd->Code -= bound;
+ *prob -= (*prob) >> kNumMoveBits;
+ if (rd->Range < kTopValue)
+ {
+ rd->Code = (rd->Code << 8) | ReadByte;
+ rd->Range <<= 8;
+ }
+ return 1;
+ }
+}
+
+int RangeDecoderBitTreeDecode(prob_t* probs, int numLevels, CRangeDecoder* rd)
+{
+ int mi = 1;
+ for (int i = numLevels; i > 0; i--) {
+ mi = (mi + mi) + RangeDecoderBitDecode(probs + mi, rd);
+ }
+ return mi - (1 << numLevels);
+}
+
+int RangeDecoderReverseBitTreeDecode(prob_t* probs, int numLevels, CRangeDecoder* rd)
+{
+ int mi = 1;
+ int symbol = 0;
+ for (int i = 0; i < numLevels; i++)
+ {
+ int bit = RangeDecoderBitDecode(probs + mi, rd);
+ mi = mi + mi + bit;
+ symbol |= (bit << i);
+ }
+ return symbol;
+}
+
+static uint8_t xz_literal_decode(prob_t* probs, CRangeDecoder* rd)
+{
+ int symbol = 1;
+ do
+ {
+ symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd);
+ } while (symbol < 0x100);
+
+ return symbol;
+}
+
+static uint8_t xz_literal_decode_match(prob_t* probs, CRangeDecoder* rd, uint8_t matchByte)
+{
+ int symbol = 1;
+ int bit = 0, matchBit = 0;
+ do
+ {
+ matchBit = (matchByte >> 7) & 1;
+ matchByte <<= 1;
+ bit = RangeDecoderBitDecode(probs + ((1 + matchBit) << 8) + symbol, rd);
+ symbol = (symbol << 1) | bit;
+
+ if (matchBit != bit)
+ {
+ while (symbol < 0x100) {
+ symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd);
+ }
+ break;
+ }
+ } while (symbol < 0x100);
+
+ return symbol;
+}
+
+#define kNumPosBitsMax 4
+#define kNumPosStatesMax (1 << kNumPosBitsMax)
+#define kLenNumLowBits 3
+#define kLenNumLowSymbols (1 << kLenNumLowBits)
+#define kLenNumMidBits 3
+#define kLenNumMidSymbols (1 << kLenNumMidBits)
+#define kLenNumHighBits 8
+#define kLenNumHighSymbols (1 << kLenNumHighBits)
+
+#define LenChoice 0
+#define LenChoice2 (LenChoice + 1)
+#define LenLow (LenChoice2 + 1)
+#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
+#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
+#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
+
+static int xz_len_decode(prob_t* p, CRangeDecoder* rd, int posState)
+{
+ if (RangeDecoderBitDecode(p + LenChoice, rd) == 0)
+ return RangeDecoderBitTreeDecode(p + LenLow + (posState << kLenNumLowBits), kLenNumLowBits, rd);
+ if (RangeDecoderBitDecode(p + LenChoice2, rd) == 0)
+ return (kLenNumLowSymbols + RangeDecoderBitTreeDecode(p + LenMid + (posState << kLenNumMidBits), kLenNumMidBits, rd));
+
+ return (kLenNumLowSymbols + kLenNumMidSymbols + RangeDecoderBitTreeDecode(p + LenHigh, kLenNumHighBits, rd));
+}
+
+#define kNumStates 12
+#define kStartPosModelIndex 4
+#define kEndPosModelIndex 14
+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
+
+#define kNumPosSlotBits 6
+#define kNumLenToPosStates 4
+#define kNumAlignBits 4
+#define kAlignTableSize (1 << kNumAlignBits)
+#define kMatchMinLen 2
+
+#define IsMatch 0
+#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
+#define IsRepG0 (IsRep + kNumStates)
+#define IsRepG1 (IsRepG0 + kNumStates)
+#define IsRepG2 (IsRepG1 + kNumStates)
+#define IsRep0Long (IsRepG2 + kNumStates)
+#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
+#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
+#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
+#define LenCoder (Align + kAlignTableSize)
+#define RepLenCoder (LenCoder + kNumLenProbs)
+#define Literal (RepLenCoder + kNumLenProbs)
+
+#if Literal != XZ_BASE_SIZE
+ #error
+#endif
+
+
+static int xz_decode(uint8_t* buf, uint8_t* out_stream, uint32_t out_size, uint32_t* out_size_processed)
+{
+ XzVarState* vs = (XzVarState*)buf;
+ prob_t* p = (prob_t*)(buf + sizeof(XzVarState));
+ CRangeDecoder rd = vs->RangeDecoder;
+ int state = vs->State;
+ int previousIsMatch = vs->PreviousIsMatch;
+ uint32_t rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3];
+ uint32_t nowPos = 0, pos = 0;
+ uint8_t previousByte = 0;
+
+ uint32_t posStateMask = (1 << (vs->pb)) - 1;
+ uint32_t literalPosMask = (1 << (vs->lp)) - 1;
+ int lc = vs->lc;
+ int remain_len = vs->RemainLen;
+ uint32_t globalPos = vs->GlobalPos;
+
+ uint8_t* dict = vs->Dictionary;
+ uint32_t dict_size = vs->DictionarySize;
+ uint32_t dictionaryPos = vs->DictionaryPos;
+
+ if (remain_len == -1) {
+ *out_size_processed = 0;
+ return XZ_RET_OK;
+ }
+
+ while ((remain_len > 0) && (nowPos < out_size))
+ {
+ pos = dictionaryPos - rep0;
+ if (pos >= dict_size)
+ pos += dict_size;
+
+ out_stream[nowPos++] = dict[dictionaryPos] = dict[pos];
+
+ if (++dictionaryPos == dict_size)
+ dictionaryPos = 0;
+
+ remain_len--;
+ }
+
+ if (dictionaryPos == 0)
+ previousByte = dict[dict_size - 1];
+ else
+ previousByte = dict[dictionaryPos - 1];
+
+ *out_size_processed = 0;
+ while (nowPos < out_size)
+ {
+ int posState = (int)((nowPos + globalPos) & posStateMask);
+
+ if (rd.read_cb_ret != XZ_RET_OK)
+ return rd.read_cb_ret;
+
+ if (rd.ExtraBytes != 0)
+ return XZ_RET_DATA_ERR;
+
+ if (RangeDecoderBitDecode(p + IsMatch + (state << kNumPosBitsMax) + posState, &rd) == 0)
+ {
+ prob_t* probs = p + Literal + (XZ_LIT_SIZE * ((((nowPos + globalPos) & literalPosMask) << lc) + (previousByte >> (8 - lc))));
+
+ if (state < 4) {
+ state = 0;
+ }
+ else if (state < 10) {
+ state -= 3;
+ }
+ else {
+ state -= 6;
+ }
+
+ if (previousIsMatch)
+ {
+ pos = dictionaryPos - rep0;
+ if (pos >= dict_size)
+ pos += dict_size;
+
+ uint8_t matchByte = dict[pos];
+ previousByte = xz_literal_decode_match(probs, &rd, matchByte);
+ previousIsMatch = 0;
+ }
+ else {
+ previousByte = xz_literal_decode(probs, &rd);
+ }
+
+ out_stream[nowPos++] = previousByte;
+
+ dict[dictionaryPos] = previousByte;
+
+ if (++dictionaryPos == dict_size)
+ dictionaryPos = 0;
+ }
+ else
+ {
+ previousIsMatch = 1;
+ if (RangeDecoderBitDecode(p + IsRep + state, &rd) == 1)
+ {
+ if (RangeDecoderBitDecode(p + IsRepG0 + state, &rd) == 0)
+ {
+ if (RangeDecoderBitDecode(p + IsRep0Long + (state << kNumPosBitsMax) + posState, &rd) == 0)
+ {
+ if ((nowPos + globalPos) == 0)
+ return XZ_RET_DATA_ERR;
+
+ state = state < 7 ? 9 : 11;
+
+ pos = dictionaryPos - rep0;
+ if (pos >= dict_size)
+ pos += dict_size;
+
+ previousByte = dict[pos];
+ dict[dictionaryPos] = previousByte;
+
+ if (++dictionaryPos == dict_size)
+ dictionaryPos = 0;
+
+ out_stream[nowPos++] = previousByte;
+ continue;
+ }
+ }
+ else
+ {
+ uint32_t distance;
+ if (RangeDecoderBitDecode(p + IsRepG1 + state, &rd) == 0)
+ distance = rep1;
+ else
+ {
+ if (RangeDecoderBitDecode(p + IsRepG2 + state, &rd) == 0)
+ distance = rep2;
+ else
+ {
+ distance = rep3;
+ rep3 = rep2;
+ }
+
+ rep2 = rep1;
+ }
+ rep1 = rep0;
+ rep0 = distance;
+ }
+ remain_len = xz_len_decode(p + RepLenCoder, &rd, posState);
+ state = state < 7 ? 8 : 11;
+ }
+ else
+ {
+ int posSlot;
+ rep3 = rep2;
+ rep2 = rep1;
+ rep1 = rep0;
+ state = (state < 7) ? 7 : 10;
+ remain_len = xz_len_decode(p + LenCoder, &rd, posState);
+
+ posSlot = RangeDecoderBitTreeDecode(p + PosSlot + \
+ ((remain_len < kNumLenToPosStates ? remain_len : kNumLenToPosStates - 1) << kNumPosSlotBits), kNumPosSlotBits, &rd);
+
+ if (posSlot >= kStartPosModelIndex)
+ {
+ int numDirectBits = ((posSlot >> 1) - 1);
+ rep0 = ((2 | ((uint32_t)posSlot & 1)) << numDirectBits);
+
+ if (posSlot < kEndPosModelIndex) {
+ rep0 += RangeDecoderReverseBitTreeDecode((p + SpecPos + rep0 - posSlot - 1), numDirectBits, &rd);
+ }
+ else {
+ rep0 += RangeDecoderDecodeDirectBits(&rd, numDirectBits - kNumAlignBits) << kNumAlignBits;
+ rep0 += RangeDecoderReverseBitTreeDecode(p + Align, kNumAlignBits, &rd);
+ }
+ }
+ else {
+ rep0 = posSlot;
+ }
+
+ rep0++;
+ }
+
+ if (rep0 == (uint32_t)(0)) {
+ remain_len = -1;/* it's for stream version */
+ break;
+ }
+
+ if (rep0 > nowPos + globalPos) {
+ return XZ_RET_DATA_ERR;
+ }
+
+ remain_len += kMatchMinLen;
+
+ do
+ {
+ pos = dictionaryPos - rep0;
+ if (pos >= dict_size) {
+ pos += dict_size;
+ }
+
+ previousByte = dict[pos];
+ dict[dictionaryPos] = previousByte;
+
+ if (++dictionaryPos == dict_size) {
+ dictionaryPos = 0;
+ }
+
+ out_stream[nowPos++] = previousByte;
+ remain_len--;
+ } while ((remain_len > 0) && (nowPos < out_size));
+ }
+ }
+
+ vs->RangeDecoder = rd;
+ vs->DictionaryPos = dictionaryPos;
+ vs->GlobalPos = globalPos + nowPos;
+ vs->Reps[0] = rep0;
+ vs->Reps[1] = rep1;
+ vs->Reps[2] = rep2;
+ vs->Reps[3] = rep3;
+ vs->State = state;
+ vs->PreviousIsMatch = previousIsMatch;
+ vs->RemainLen = remain_len;
+
+ *out_size_processed = nowPos;
+ return XZ_RET_OK;
+}
+
+char XZINTERNALDATA_MEMORY_ADDR[INTERNAL_DATA_BUF_SIZE] = { 0 };
+char DICTIONARY_MEMORY_ADDR[DICT_BUF_SIZE] = { 0 };
+char BLOCK_MEMORY_ADDR[BLOCK_BUF_SIZE] = { 0 };
+
+int xz_decompress_buf_to_buf(uint8_t* header, write_cb_t* out_cb, read_cb_t* in_cb)
+{
+ uint32_t nowPos = 0, out_size = 0, out_size_processed = 0;
+ uint8_t properties[5];
+ uint8_t prop0;
+ int lc, lp, pb;
+ uint8_t b = 0;
+ int ret = 0;
+
+ uint8_t* dict = NULL;
+ uint32_t dict_size = 0;
+ uint8_t* xzInternalData = NULL;
+ uint32_t xzInternalSize = 0;
+
+ memcpy(properties, header, sizeof(properties));
+ header += sizeof(properties);
+
+ for (int i = 0; i < 4; i++)
+ {
+ b = *(uint8_t*)header;
+ header += sizeof(b);
+ out_size += (uint32_t)(b) << (i * 8);
+ }
+
+ if (out_size == 0xFFFFFFFF) {
+ return XZ_RET_STREAM_VER_NOT_SUPP;
+ }
+
+ for (int i = 0; i < 4; i++)
+ {
+ b = *(uint8_t*)header;
+ header += sizeof(b);
+ if (b != 0) {
+ return XZ_RET_FILE_TOO_LONG;
+ }
+ }
+
+ prop0 = properties[0];
+ if (prop0 >= (9 * 5 * 5)) {
+ return XZ_RET_PROPERTIES_ERR;
+ }
+
+ for (pb = 0; prop0 >= (9 * 5); pb++, prop0 -= (9 * 5));
+ for (lp = 0; prop0 >= 9; lp++, prop0 -= 9);
+ lc = prop0;
+
+ for (int i = 0; i < 4; i++) {
+ dict_size += (uint32_t)(properties[1 + i]) << (i * 8);
+ }
+
+ //os_malloc(dict_size);
+ dict = (void*)DICTIONARY_MEMORY_ADDR;
+ if (dict == NULL) {
+ return XZ_RET_MEM_ALLOC_FILED;
+ }
+ if (dict_size > sizeof(DICTIONARY_MEMORY_ADDR)) {
+ return XZ_RET_NOT_ENOUGH_MEM;
+ }
+ memset(dict, 0, sizeof(DICTIONARY_MEMORY_ADDR));
+
+ //os_malloc(xzInternalSize);
+ xzInternalData = (void*)XZINTERNALDATA_MEMORY_ADDR;
+ if (xzInternalData == NULL) {
+ return XZ_RET_MEM_ALLOC_FILED;
+ }
+ xzInternalSize = (XZ_BASE_SIZE + (XZ_LIT_SIZE << (lc + lp))) * sizeof(prob_t);
+ xzInternalSize += sizeof(XzVarState);
+ if (xzInternalSize >= sizeof(XZINTERNALDATA_MEMORY_ADDR)) {
+ return XZ_RET_NOT_ENOUGH_MEM;
+ }
+ memset(xzInternalData, 0, sizeof(XZINTERNALDATA_MEMORY_ADDR));
+
+ //init param
+ {
+ XzVarState * vs = (XzVarState*)xzInternalData;
+ prob_t * p = (prob_t*)(xzInternalData + sizeof(XzVarState));
+ uint32_t numProbs = Literal + ((uint32_t)XZ_LIT_SIZE << (lc + lp));
+
+ vs->Dictionary = dict;
+ vs->DictionarySize = dict_size;
+ vs->DictionaryPos = 0;
+ vs->GlobalPos = 0;
+ vs->Reps[0] = vs->Reps[1] = vs->Reps[2] = vs->Reps[3] = 1;
+ vs->lc = lc;
+ vs->lp = lp;
+ vs->pb = pb;
+ vs->State = 0;
+ vs->PreviousIsMatch = 0;
+ vs->RemainLen = 0;
+
+ for (uint32_t i = 0; i < numProbs; i++) {
+ p[i] = kBitModelTotal >> 1;
+ }
+ RangeDecoderInit(&vs->RangeDecoder, in_cb);
+ }
+
+ //decode
+ for (nowPos = 0; nowPos < out_size;)
+ {
+ uint8_t* dest = (uint8_t*)BLOCK_MEMORY_ADDR;
+ uint32_t blockSize = out_size - nowPos;
+ if (blockSize > sizeof(BLOCK_MEMORY_ADDR)) {
+ blockSize = sizeof(BLOCK_MEMORY_ADDR);
+ }
+
+ if (XZ_RET_OK != (ret = xz_decode((uint8_t*)xzInternalData, ((uint8_t*)dest), blockSize, &out_size_processed))) {
+ return ret;
+ }
+ if (out_size_processed == 0) {
+ out_size = nowPos;
+ break;
+ }
+ out_cb->Write(nowPos, dest, out_size_processed);
+
+ nowPos += out_size_processed;
+ }
+
+ return 0;
+}
+
+
+
+
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/xz_decompress.h b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/xz_decompress.h
new file mode 100644
index 00000000..641cbcba
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fota/ota_agent/xz_decompress.h
@@ -0,0 +1,43 @@
+
+#ifndef __XZ_DECOMPRESS_H__
+#define __XZ_DECOMPRESS_H__
+
+#include "stdint.h"
+
+#define prob_t uint16_t //uint32_t
+
+#define INTERNAL_DATA_BUF_SIZE (16*1024)
+#define DICT_BUF_SIZE (4*1024)
+#define BLOCK_BUF_SIZE (1*1024)
+
+typedef enum {
+ XZ_RET_OK = 0,
+ XZ_RET_DATA_ERR = -1,
+ XZ_RET_NOT_ENOUGH_MEM = -2,
+ XZ_RET_STREAM_VER_NOT_SUPP = -3,
+ XZ_RET_FILE_TOO_LONG = -4,
+ XZ_RET_PROPERTIES_ERR = -5,
+ XZ_RET_MEM_ALLOC_FILED = -6,
+}xz_errno_t;
+
+
+typedef struct
+{
+ int(*Read)(uint8_t** buf, uint32_t* buf_len);
+} read_cb_t;
+
+typedef struct
+{
+ int(*Write)(uint32_t offset, uint8_t* buf, uint32_t buf_len);
+} write_cb_t;
+
+typedef struct
+{
+ uint8_t header[13];
+} xz_header_t;
+
+
+int xz_decompress_buf_to_buf(uint8_t* header, write_cb_t* out_cb, read_cb_t* in_cb);
+
+#endif /* __XZ_DECOMPRESS_H__ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv.c b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv.c
new file mode 100644
index 00000000..d0647066
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv.c
@@ -0,0 +1,1110 @@
+#include "ln_kv.h"
+#include "string.h"
+#include "ln_kv_api.h"
+
+static kv_ctl_t kv_ctl;
+static kv_err_t kv_gc(void);
+
+static uint8_t kv_checksum_crc8(uint8_t *buf, int nbyte)
+{
+ int i;
+ uint8_t crc = 0;
+
+#define POLY 0x31
+#define WIDTH 8
+#define TOP_BIT 0x80
+
+ while (nbyte--) {
+ crc ^= *buf++;
+ for (i = 0; i < WIDTH; ++i) {
+ if (crc & TOP_BIT) {
+ crc = (crc << 1) ^ POLY;
+ } else {
+ crc <<= 1;
+ }
+ }
+ crc &= 0xFF;
+ }
+
+ return crc;
+}
+
+__STATIC_INLINE__ void kv_lock(void)
+{
+#ifndef KV_CONFIG_OS_NONE
+ if (ln_kv_is_os_running()) {
+ ln_kv_mutex_lock(KV_MGR_LOCK);
+ }
+#endif
+}
+
+__STATIC_INLINE__ void kv_unlock(void)
+{
+#ifndef KV_CONFIG_OS_NONE
+ if (ln_kv_is_os_running()) {
+ ln_kv_mutex_unlock(KV_MGR_LOCK);
+ }
+#endif
+}
+
+static kv_err_t kv_flash_read(uint32_t addr, void *buf, size_t buf_size)
+{
+ if (KV_FLASH_READ(addr, buf, buf_size) < 0) {
+ return KV_ERR_FLASH_READ_FAILED;
+ }
+ return KV_ERR_NONE;
+}
+
+static kv_err_t kv_flash_write(uint32_t addr, void *buf, size_t buf_size)
+{
+ if (KV_FLASH_WRITE(addr, buf, buf_size) < 0) {
+ return KV_ERR_FLASH_WRITE_FAILED;
+ }
+ return KV_ERR_NONE;
+}
+
+static kv_err_t kv_flash_erase(uint32_t start, size_t len)
+{
+ if (KV_FLASH_ERASE(start, len) < 0) {
+ return KV_ERR_FLASH_ERASE_FAILED;
+ }
+ return KV_ERR_NONE;
+}
+
+static kv_err_t kv_flash_wunit_modify(uint32_t addr, kv_wunit_t data)
+{
+ return kv_flash_write(addr, &data, sizeof(kv_wunit_t));
+}
+
+static kv_err_t kv_flash_blk_erase(uint32_t blk_start)
+{
+ return kv_flash_erase(blk_start, KV_BLK_SIZE);
+}
+
+static void kv_flash_ctl_init(uint32_t flash_start, uint32_t flash_end, kv_flash_drv_t *flash_drv, kv_flash_prop_t *flash_prop)
+{
+ memcpy(&kv_ctl.flash_ctl.flash_drv, flash_drv, sizeof(kv_flash_drv_t));
+
+ KV_FLASH_START = flash_start;
+ KV_FLASH_END = flash_end;
+ KV_FLASH_SECTOR_SIZE_LOG2 = flash_prop->sector_size_log2;
+
+ KV_FLASH_WRITE_ALIGN = sizeof(kv_byte_t);
+}
+
+static kv_err_t kv_blk_hdr_read(uint32_t blk_start, kv_blk_hdr_t *blk_hdr)
+{
+ return kv_flash_read(blk_start, blk_hdr, sizeof(kv_blk_hdr_t));
+}
+
+static kv_err_t kv_blk_format(uint32_t blk_start)
+{
+ if (kv_flash_blk_erase(blk_start) != KV_ERR_NONE) {
+ return KV_ERR_FLASH_ERASE_FAILED;
+ }
+
+ if (kv_flash_wunit_modify(KV_ADDR_OF_FIELD(blk_start, kv_blk_hdr_t, magic),
+ KV_BLK_HDR_MAGIC) != KV_ERR_NONE) {
+ return KV_ERR_FLASH_WRITE_FAILED;
+ }
+
+ kv_blk_set_fresh(blk_start);
+
+ return KV_ERR_NONE;
+}
+
+static uint32_t kv_blk_next_fresh(void)
+{
+ uint32_t cur_blk;
+
+ KV_BLK_FOR_EACH_FROM(cur_blk, KV_MGR_WORKSPACE) {
+ if (kv_blk_is_fresh(cur_blk)) {
+ return cur_blk;
+ }
+ }
+
+ return KV_BLK_INVALID;
+}
+
+static uint32_t kv_blk_search_inuse(uint32_t item_size)
+{
+ uint32_t cur_blk;
+
+ KV_BLK_FOR_EACH_FROM(cur_blk, KV_MGR_WORKSPACE) {
+ if (kv_blk_is_inuse(cur_blk) &&
+ kv_blk_freesz_get(cur_blk) >= item_size) {
+ return cur_blk;
+ }
+ }
+
+ return KV_BLK_INVALID;
+}
+
+static uint32_t kv_blk_search_suitable(uint32_t item_size)
+{
+ uint32_t the_blk;
+
+ // no more writeable block, no need to do the next logic
+ if (KV_NO_WRITEABLE_BLK()) {
+ return KV_BLK_INVALID;
+ }
+
+ // no more blocks with sufficient space, searched before
+ if (KV_MGR_WORKSPACE == KV_BLK_INVALID) {
+ return KV_BLK_INVALID;
+ }
+
+ do {
+ // current workspace is just ok(workspace is kinda cache)
+ if (kv_blk_freesz_get(KV_MGR_WORKSPACE) >= item_size) {
+ return KV_MGR_WORKSPACE;
+ }
+
+ // first we should search in inuse blocks
+ the_blk = kv_blk_search_inuse(item_size);
+ if (the_blk != KV_BLK_INVALID) {
+ KV_MGR_WORKSPACE = the_blk;
+ return KV_MGR_WORKSPACE;
+ }
+
+ // no more fresh block, cannot allocate new block and cannot do gc neither.
+ if (KV_MGR_BLK_NUM_FRESH < 1) {
+ return KV_BLK_INVALID;
+ }
+
+ // if we have more than one fresh block, just give it out
+ if (KV_MGR_BLK_NUM_FRESH > 1) {
+ KV_MGR_WORKSPACE = kv_blk_next_fresh();
+ return KV_MGR_WORKSPACE;
+ }
+
+ // no more block inuse has sufficient space, and only one fresh block left, we should try gc
+ if (KV_MGR_BLK_NUM_FRESH == 1) {
+ if (kv_gc() != KV_ERR_NONE) {
+ // no more dirty block to gc, we give out the last precious fresh block(no more gc any more)
+ KV_MGR_WORKSPACE = kv_blk_next_fresh();
+ return KV_MGR_WORKSPACE;
+ }
+ }
+ } while (LN_TRUE);
+}
+
+static kv_err_t kv_item_hdr_write(uint32_t item_start, kv_item_hdr_t *item_hdr)
+{
+ if (kv_flash_write(KV_ADDR_OF_FIELD(item_start, kv_item_hdr_t, checksum),
+ &item_hdr->checksum,
+ KV_ITEM_HDR_SIZE - sizeof(kv_wunit_t) * 2) != KV_ERR_NONE) {
+ return KV_ERR_FLASH_WRITE_FAILED;
+ }
+
+ return kv_flash_wunit_modify(KV_ADDR_OF_FIELD(item_start, kv_item_hdr_t, magic),
+ item_hdr->magic);
+}
+
+static kv_err_t kv_item_write(uint32_t item_start, kv_item_hdr_t *item_hdr, const uint8_t *item_body, uint32_t item_body_len)
+{
+ // write header, if a power down happen here, we can know it by header magic verify.
+ if (kv_item_hdr_write(item_start, item_hdr) != KV_ERR_NONE) {
+ return KV_ERR_FLASH_WRITE_FAILED;
+ }
+
+ // if a power down happen here, we can know it by checksum verify.
+
+ // write body(key & value)
+ return kv_flash_write(item_start + KV_ITEM_HDR_SIZE, (void *)item_body, item_body_len);
+}
+
+static kv_err_t kv_item_hdr_read(uint32_t item_start, kv_item_hdr_t *item_hdr)
+{
+ return kv_flash_read(item_start, item_hdr, sizeof(kv_item_hdr_t));
+}
+
+static kv_err_t kv_item_body_read(kv_item_t *item)
+{
+ uint8_t *kv_buf = NULL;
+
+ kv_buf = (uint8_t *)ln_kv_malloc(KV_ITEM_SIZE_OF_BODY(item));
+ if (!kv_buf) {
+ return KV_ERR_OUT_OF_MEMORY;
+ }
+
+ if (kv_flash_read(KV_ITEM_ADDR_OF_BODY(item), kv_buf,
+ KV_ITEM_SIZE_OF_BODY(item)) != KV_ERR_NONE) {
+ ln_kv_free(kv_buf);
+ return KV_ERR_FLASH_READ_FAILED;
+ }
+
+ item->body = kv_buf;
+
+ return KV_ERR_NONE;
+}
+
+static kv_err_t kv_item_do_delete(uint32_t item_start)
+{
+ // set the discarded_flag on the flash
+ return kv_flash_wunit_modify(KV_ADDR_OF_FIELD(item_start, kv_item_hdr_t, discarded_flag), KV_ITEM_DISCARDED);
+}
+
+static kv_err_t kv_item_delete_aux(uint32_t item_start)
+{
+ if (kv_item_do_delete(item_start) != KV_ERR_NONE) {
+ return KV_ERR_FLASH_WRITE_FAILED;
+ }
+
+ kv_blk_set_dirty(KV_ITEM_ADDR2BLK(item_start));
+
+ return KV_ERR_NONE;
+}
+
+static kv_err_t kv_item_delete(kv_item_t *item)
+{
+ return kv_item_delete_aux(item->pos);
+}
+
+static kv_err_t kv_item_try_delete(kv_item_t *item)
+{
+ uint8_t *prev_key;
+ uint32_t prev_pos;
+ uint8_t prev_k_len, k_len;
+ kv_item_hdr_t prev_item_hdr;
+
+ prev_pos = item->hdr.prev_pos;
+
+ if (kv_item_hdr_read(prev_pos, &prev_item_hdr) != KV_ERR_NONE) {
+ return KV_ERR_FLASH_READ_FAILED;
+ }
+
+ if (!KV_ITEM_IS_LEGAL(&prev_item_hdr) ||
+ KV_ITEM_IS_DISCARDED(&prev_item_hdr)) {
+ /* situation 1 in kv_item_update, the prev_pos is in a fresh block now(for gc sake),
+ no need to delete the previous one.
+ */
+ return KV_ERR_NONE;
+ }
+
+ // test if situation 2 in kv_item_update happened
+
+ k_len = item->hdr.k_len;
+ prev_k_len = prev_item_hdr.k_len;
+
+ if (k_len != prev_k_len) {
+ return KV_ERR_NONE;
+ }
+
+ prev_key = (uint8_t *)ln_kv_malloc(k_len);
+ if (!prev_key) {
+ return KV_ERR_OUT_OF_MEMORY;
+ }
+
+ if (kv_flash_read(prev_pos + KV_ITEM_HDR_SIZE, prev_key, k_len) != KV_ERR_NONE) {
+ ln_kv_free(prev_key);
+ return KV_ERR_FLASH_READ_FAILED;
+ }
+
+ // key changes, means another turn of gc happened, the previous block is filled with new item.
+ if (memcmp(prev_key, (void *)KV_ITEM_ADDR_OF_BODY(item), k_len) != 0) {
+ ln_kv_free(prev_key);
+ return KV_ERR_NONE;
+ }
+
+ // the previous item is still there, delete it.
+ return kv_item_delete_aux(prev_pos);
+}
+
+__STATIC_INLINE__ void kv_item_free(kv_item_t *item)
+{
+ if (item->body) {
+ ln_kv_free(item->body);
+ }
+ ln_kv_free(item);
+}
+
+static int kv_item_hdr_verify(kv_item_hdr_t *item_hdr, uint32_t item_start, uint32_t blk_start)
+{
+ uint8_t k_len;
+ uint16_t v_len;
+
+ k_len = item_hdr->k_len;
+ v_len = item_hdr->v_len;
+
+ // 1. test key/value size
+ if (k_len == 0 || \
+ v_len == 0 || \
+ k_len == (uint8_t)-1 || \
+ v_len == (uint16_t)-1) {
+ return LN_FALSE;
+ }
+
+ // 2. test the flash address range
+ if (item_start + KV_ITEM_SIZE(k_len, v_len) > KV_BLK_END(blk_start)) {
+ return LN_FALSE;
+ }
+
+ if (item_start + KV_ITEM_SIZE(k_len, v_len) > KV_FLASH_END) {
+ return LN_FALSE;
+ }
+
+ return LN_TRUE;
+}
+
+__STATIC_INLINE__ int kv_item_body_verify(kv_item_t *item)
+{
+ return item->hdr.checksum == kv_checksum_crc8(item->body, item->hdr.k_len + item->hdr.v_len);
+}
+
+__STATIC_INLINE__ int kv_item_is_updated_one(kv_item_t *item)
+{
+ return item->hdr.prev_pos != 0 && item->pos != item->hdr.prev_pos;
+}
+
+static int kv_item_is_moved(kv_item_t *item)
+{
+ kv_err_t err;
+ int is_moved = LN_FALSE;
+ kv_item_hdr_t item_hdr;
+ uint8_t *body_backup = NULL;
+
+ // drag the header out of the flash
+ err = kv_item_hdr_read(item->pos, &item_hdr);
+ if (err != KV_ERR_NONE) {
+ return LN_FALSE;
+ }
+
+ // compare the header
+ if (memcmp(&item_hdr, &item->hdr, sizeof(kv_item_hdr_t)) != 0) {
+ return LN_TRUE;
+ }
+
+ // backup the body
+ body_backup = item->body;
+
+ // drag the body out of the flash
+ err = kv_item_body_read(item);
+ if (err != KV_ERR_NONE) {
+ return LN_FALSE;
+ }
+
+ // compare the body
+ if (memcmp(body_backup, item->body, item->hdr.k_len + item->hdr.v_len) != 0) {
+ is_moved = LN_TRUE;
+ }
+
+ ln_kv_free(item->body);
+ item->body = body_backup;
+
+ return is_moved;
+}
+
+static kv_err_t kv_item_do_gc(kv_item_t *item, const void *dummy)
+{
+ kv_err_t err;
+
+ err = kv_item_body_read(item);
+ if (err != KV_ERR_NONE) {
+ return err;
+ }
+
+ if (kv_item_write(KV_BLK_USABLE_ADDR(KV_MGR_WORKSPACE),
+ &item->hdr, item->body,
+ KV_ITEM_SIZE_OF_BODY(item)) != KV_ERR_NONE) {
+ return KV_ERR_FLASH_WRITE_FAILED;
+ }
+
+ // reduce the free_size
+ kv_blk_freesz_reduce(KV_MGR_WORKSPACE, KV_ITEM_SIZE_OF_ITEM(item));
+
+ return KV_ERR_NEXT_LOOP;
+}
+
+static kv_err_t kv_item_do_fetch_new_copy(kv_item_t *item, const void *the_item)
+{
+ kv_err_t err;
+ kv_item_t *dst_item;
+ uint8_t k_len, dst_k_len;
+ uint16_t v_len, dst_v_len;
+
+ dst_item = (kv_item_t *)the_item;
+ dst_k_len = dst_item->hdr.k_len;
+ dst_v_len = dst_item->hdr.v_len;
+
+ k_len = item->hdr.k_len;
+ v_len = item->hdr.v_len;
+
+ if (k_len != dst_k_len ||
+ v_len != dst_v_len) {
+ return KV_ERR_NEXT_LOOP;
+ }
+
+ err = kv_item_body_read(item);
+ if (err != KV_ERR_NONE) {
+ return err;
+ }
+
+ if (memcmp(item->body, dst_item->body, k_len + v_len) == 0) {
+ return KV_ERR_NONE;
+ }
+
+ return KV_ERR_NEXT_LOOP;
+}
+
+static kv_err_t kv_item_do_fetch(kv_item_t *item, const void *key)
+{
+ kv_err_t err;
+ uint8_t k_len;
+
+ k_len = item->hdr.k_len;
+
+ if (strlen((const char *)key) != k_len) {
+ return KV_ERR_NEXT_LOOP;
+ }
+
+ err = kv_item_body_read(item);
+ if (err != KV_ERR_NONE) {
+ return err;
+ }
+
+ if (memcmp(item->body, key, k_len) == 0) {
+ return KV_ERR_NONE;
+ }
+
+ return KV_ERR_NEXT_LOOP;
+}
+
+static kv_err_t kv_item_do_recovery(kv_item_t *item, const void *dummy)
+{
+ kv_err_t err;
+
+ err = kv_item_body_read(item);
+ if (err != KV_ERR_NONE) {
+ return err;
+ }
+
+ if (!kv_item_body_verify(item)) {
+ err = kv_item_delete(item);
+ } else if (kv_item_is_updated_one(item)) {
+ err = kv_item_try_delete(item);
+ }
+
+ if (err != KV_ERR_NONE) {
+ return err;
+ }
+
+ return KV_ERR_NEXT_LOOP;
+}
+
+static kv_err_t kv_item_walkthru(uint32_t blk_start,kv_item_walker_t walker,
+ const void *patten,
+ kv_item_t **item_out)
+{
+ kv_err_t err;
+ uint32_t cur_item;
+ kv_item_t *item;
+ kv_item_hdr_t *item_hdr;
+ int is_item_integral = LN_TRUE;
+
+ if (item_out) {
+ *item_out = NULL;
+ }
+
+ cur_item = KV_BLK_FIRST_ITEM(blk_start);
+
+ do {
+ is_item_integral = LN_TRUE;
+
+ item = (kv_item_t *)ln_kv_malloc(sizeof(kv_item_t));
+ if (!item) {
+ return KV_ERR_OUT_OF_MEMORY;
+ }
+
+ item->body = NULL;
+ item_hdr = &item->hdr;
+
+ // drag the item header out of the flash to see whether is a legal item
+ err = kv_item_hdr_read(cur_item, item_hdr);
+ if (err != KV_ERR_NONE) {
+ kv_item_free(item);
+ return err;
+ }
+
+ if (!KV_ITEM_IS_LEGAL(item_hdr)) {
+ if (KV_ITEM_IS_FRESH(item_hdr)) {
+ // situation 1, it's a fresh item slot, meet the ending
+ kv_item_free(item);
+ break;
+ }
+
+ // situation 2, meet power down, probably broken, just mark the item as discarded
+ is_item_integral = LN_FALSE;
+ }
+
+ if (!is_item_integral ||
+ !kv_item_hdr_verify(item_hdr, cur_item, blk_start)) {
+ // it's no integral item, or header verify illegal
+ if (kv_item_do_delete(cur_item) == KV_ERR_NONE) {
+ kv_blk_set_dirty(blk_start);
+ }
+
+ cur_item += KV_ITEM_HDR_SIZE;
+ kv_item_free(item);
+
+ continue;
+ }
+
+ if (!KV_ITEM_IS_DISCARDED(item_hdr)) {
+ // tell the item where he is, he does not know yet.
+ item->pos = cur_item;
+
+ err = walker(item, patten);
+ if (err == KV_ERR_NONE) {
+ if (item_out) {
+ *item_out = item;
+ }
+ return KV_ERR_NONE;
+ } else if (err != KV_ERR_NEXT_LOOP) {
+ kv_item_free(item);
+ return err;
+ }
+ } else {
+ // it's a discarded item, deleted before
+ kv_blk_set_dirty(blk_start);
+ }
+
+ cur_item += KV_ITEM_SIZE(item_hdr->k_len, item_hdr->v_len);
+ kv_item_free(item);
+ } while (cur_item + KV_ITEM_HDR_SIZE < KV_BLK_END(blk_start));
+
+ // have walked through all the items, get enough information to refresh the index(blk_info).
+ if (cur_item == KV_BLK_FIRST_ITEM(blk_start)) {
+ // come from fresh block break
+ kv_blk_set_fresh(blk_start);
+ } else if (cur_item + KV_ITEM_HDR_SIZE < KV_BLK_END(blk_start)) {
+ // come from while ending
+ kv_blk_freesz_set(blk_start, KV_BLK_END(blk_start) - cur_item);
+ kv_blk_set_inuse(blk_start);
+ } else {
+ // go across the boarder, means the space left is insufficient
+ kv_blk_freesz_set(blk_start, 0);
+ kv_blk_reset_inuse(blk_start);
+ }
+
+ return KV_ERR_NONE;
+}
+
+static kv_item_t *kv_item_do_find(uint32_t blk_start, const char *key)
+{
+ kv_item_t *the_item;
+
+ if (kv_item_walkthru(blk_start, kv_item_do_fetch, key, &the_item) == KV_ERR_NONE) {
+ return the_item;
+ }
+
+ return NULL;
+}
+
+static kv_item_t *kv_item_find(const char *key)
+{
+ uint32_t cur_blk;
+ kv_item_t *item;
+
+ KV_BLK_FOR_EACH(cur_blk) {
+ if (kv_blk_is_bad(cur_blk) ||
+ kv_blk_is_fresh(cur_blk)) {
+ continue;
+ }
+
+ item = kv_item_do_find(cur_blk, key);
+ if (item) {
+ return item;
+ }
+ }
+ return NULL;
+}
+
+static kv_item_t *kv_item_do_find_new_copy(uint32_t blk_start, kv_item_t *item)
+{
+ kv_item_t *the_item;
+
+ if (kv_item_walkthru(blk_start, kv_item_do_fetch_new_copy,
+ item, &the_item) == KV_ERR_NONE) {
+ return the_item;
+ }
+
+ return NULL;
+}
+
+static kv_item_t *kv_item_find_new_copy(kv_item_t *the_item)
+{
+ uint32_t cur_blk;
+ kv_item_t *item;
+
+ KV_BLK_FOR_EACH(cur_blk) {
+ if (kv_blk_is_bad(cur_blk) ||
+ kv_blk_is_fresh(cur_blk)) {
+ continue;
+ }
+
+ item = kv_item_do_find_new_copy(cur_blk, the_item);
+ if (item) {
+ return item;
+ }
+ }
+ return NULL;
+}
+
+static kv_err_t kv_item_do_save(uint32_t item_start, const char *k, const void *v, size_t v_len, uint32_t prev_pos)
+{
+ kv_err_t err;
+ uint8_t k_len;
+ uint32_t kv_len;
+ kv_item_hdr_t item_hdr;
+ uint8_t *kv_buf = NULL;
+
+ k_len = strlen(k);
+ kv_len = KV_ITEM_BODY_SIZE(k_len, v_len);
+
+ kv_buf = (uint8_t *)ln_kv_malloc(kv_len);
+ if (!kv_buf) {
+ return KV_ERR_OUT_OF_MEMORY;
+ }
+
+ memset(kv_buf, 0, kv_len);
+ memcpy(kv_buf, k, k_len);
+ memcpy(kv_buf + k_len, v, v_len);
+
+ item_hdr.magic = KV_ITEM_HDR_MAGIC;
+ item_hdr.checksum = kv_checksum_crc8(kv_buf, k_len + v_len);
+
+ item_hdr.k_len = k_len;
+ item_hdr.v_len = v_len;
+ item_hdr.prev_pos = prev_pos;
+
+ // we donnot deal with the discarded_flag here
+ err = kv_item_write(item_start, &item_hdr, kv_buf, kv_len);
+
+ ln_kv_free(kv_buf);
+
+ return err;
+}
+
+static int kv_item_value_is_match(kv_item_t *item, const void *value, size_t value_len)
+{
+ uint8_t k_len;
+ uint16_t v_len;
+
+ k_len = item->hdr.k_len;
+ v_len = item->hdr.v_len;
+
+ if (value_len != v_len) {
+ return LN_FALSE;
+ }
+
+ if (memcmp(item->body + k_len, value, v_len) != 0) {
+ return LN_FALSE;
+ }
+
+ return LN_TRUE;
+}
+
+static kv_err_t kv_item_fix(kv_item_t *item)
+{
+ kv_item_t *moved_item;
+
+ moved_item = kv_item_find_new_copy(item);
+ if (!moved_item) {
+ return KV_ERR_POS_FIX_FAILED;
+ }
+
+ item->pos = moved_item->pos;
+
+ kv_item_free(moved_item);
+
+ return KV_ERR_NONE;
+}
+
+static kv_err_t kv_item_save(const char *k, const void *v, size_t v_len, kv_item_t *prev_item)
+{
+ kv_err_t err;
+ uint32_t blk_start, k_len, item_size;
+
+ k_len = strlen(k);
+ item_size = KV_ITEM_SIZE(k_len, v_len);
+
+ blk_start = kv_blk_search_suitable(item_size);
+ if (blk_start == KV_BLK_INVALID) {
+ return KV_ERR_INSUFFICIENT_SPACE;
+ }
+
+ if (prev_item && kv_item_is_moved(prev_item)) {
+ err = kv_item_fix(prev_item);
+ if (err != KV_ERR_NONE) {
+ return err;
+ }
+ }
+
+ err = kv_item_do_save(KV_BLK_USABLE_ADDR(blk_start), k, v, v_len, prev_item ? prev_item->pos : 0);
+ if (err != KV_ERR_NONE) {
+ return err;
+ }
+
+ // reduce the free_size
+ kv_blk_freesz_reduce(blk_start, item_size);
+
+ if (kv_blk_is_fresh(blk_start)) {
+ kv_blk_reset_fresh(blk_start);
+
+ if (!kv_blk_is_full(blk_start)) {
+ kv_blk_set_inuse(blk_start);
+ }
+ } else if (kv_blk_is_full(blk_start)) {
+ kv_blk_reset_inuse(blk_start);
+ }
+
+ return KV_ERR_NONE;
+}
+
+static kv_err_t kv_item_update(kv_item_t *item, const char *key, const void *value, size_t value_len)
+{
+ kv_err_t err;
+
+ if (kv_item_value_is_match(item, value, value_len)) {
+ return KV_ERR_NONE;
+ }
+
+ /* save first, then delete, is trying best to keep data integrality. */
+
+ err = kv_item_save(key, value, value_len, item);
+ if (err != KV_ERR_NONE) {
+ return err;
+ }
+
+ return kv_item_delete(item);
+}
+
+static kv_err_t kv_param_verify(uint32_t flash_start, uint32_t flash_end, kv_flash_drv_t *flash_drv, kv_flash_prop_t *flash_prop)
+{
+ if (!flash_drv || !flash_prop) {
+ return KV_ERR_INVALID_PARAM;
+ }
+
+ if (!KV_IS_ALINGED_LOG2(flash_start, flash_prop->sector_size_log2)) {
+ return KV_ERR_INVALID_PARAM;
+ }
+
+ if (!KV_IS_ALINGED_LOG2(flash_end, flash_prop->sector_size_log2)) {
+ return KV_ERR_INVALID_PARAM;
+ }
+
+ return KV_ERR_NONE;
+}
+
+__STATIC_INLINE__ kv_err_t kv_mgr_index_build(uint32_t blk_start)
+{
+ return kv_item_walkthru(blk_start, kv_item_do_recovery, NULL, NULL);
+}
+
+static int kv_mgr_blk_index_rebuild(void)
+{
+ uint32_t cur_blk;
+ int is_rebuild_done = LN_FALSE;
+
+ KV_BLK_FOR_EACH(cur_blk) {
+ if (kv_blk_is_hanging(cur_blk)) {
+ if (kv_mgr_index_build(cur_blk) == KV_ERR_NONE) {
+ kv_blk_reset_hanging(cur_blk);
+ is_rebuild_done = LN_TRUE;
+ }
+ }
+ }
+
+ return is_rebuild_done;
+}
+
+static kv_err_t kv_mgr_workspace_locate(void)
+{
+ uint32_t cur_blk;
+
+ /* we give blocks with KV_BLK_FLAG_HANGING a chance to rebuild index */
+ if (KV_MGR_BLK_NUM_HANGING > 0) {
+ kv_mgr_blk_index_rebuild();
+ }
+
+ if (KV_NO_WRITEABLE_BLK()) {
+ return KV_ERR_NO_WRITEABLE_BLK;
+ }
+
+ KV_BLK_FOR_EACH(cur_blk) {
+ if (KV_MGR_BLK_NUM_INUSE == 0) {
+ if (kv_blk_is_fresh(cur_blk)) {
+ KV_MGR_WORKSPACE = cur_blk;
+ return KV_ERR_NONE;
+ }
+ } else if (kv_blk_is_inuse(cur_blk)) {
+ KV_MGR_WORKSPACE = cur_blk;
+ return KV_ERR_NONE;
+ }
+ }
+
+ return KV_ERR_NONE;
+}
+
+static void kv_mgr_ctl_build(void)
+{
+ uint32_t cur_blk;
+ kv_blk_hdr_t blk_hdr;
+
+ KV_BLK_FOR_EACH(cur_blk) {
+ if (kv_blk_hdr_read(cur_blk, &blk_hdr) != KV_ERR_NONE) {
+ // sth must be wrong seriously with this block
+ kv_blk_set_bad(cur_blk);
+ continue;
+ }
+
+ if (!KV_BLK_IS_LEGAL(&blk_hdr)) {
+ if (kv_blk_format(cur_blk) != KV_ERR_NONE) {
+ // sth must be wrong seriously with this block
+ kv_blk_set_bad(cur_blk);
+ }
+ // we get a fresh block
+ continue;
+ }
+
+ // do index building
+ if (kv_mgr_index_build(cur_blk) != KV_ERR_NONE) {
+ // sth goes wrong while index building, we give it a mark
+ kv_blk_set_hanging(cur_blk);
+ continue;
+ }
+ }
+}
+
+static kv_err_t kv_mgr_ctl_init(void)
+{
+ kv_blk_detail_t *blk_detail;
+
+ KV_MGR_BLK_NUM_TOTAL = KV_FLASH_SIZE / KV_FLASH_SECTOR_SIZE;
+
+ blk_detail = (kv_blk_detail_t *)ln_kv_malloc(sizeof(kv_blk_detail_t) * KV_MGR_BLK_NUM_TOTAL);
+ if (!blk_detail) {
+ return KV_ERR_OUT_OF_MEMORY;
+ }
+
+ memset(blk_detail, 0, sizeof(kv_blk_detail_t) * KV_MGR_BLK_NUM_TOTAL);
+ KV_MGR_BLK_DETAIL = blk_detail;
+
+#ifndef KV_CONFIG_OS_NONE
+ if (ln_kv_mutex_create(KV_MGR_LOCK) != LN_TRUE) {
+ return KV_ERR_INTERNAL_ERROR;
+ }
+#endif
+
+ return KV_ERR_NONE;
+}
+
+static void kv_mgr_ctl_deinit(void)
+{
+#ifndef KV_CONFIG_OS_NONE
+ ln_kv_mutex_delete(KV_MGR_LOCK);
+#endif
+ ln_kv_free(KV_MGR_BLK_DETAIL);
+ KV_MGR_BLK_DETAIL = NULL;
+
+ memset(&kv_ctl, 0, sizeof(kv_ctl));
+}
+
+static kv_err_t kv_do_gc(uint32_t dirty_blk)
+{
+ return kv_item_walkthru(dirty_blk, kv_item_do_gc, NULL, NULL);
+}
+
+static kv_err_t kv_gc(void)
+{
+ uint32_t cur_blk, workspace_backup;
+ int is_gc_done = LN_FALSE, is_rebuild_done = LN_FALSE;
+
+ /* we give blocks with KV_BLK_FLAG_HANGING a chance to rebuild index */
+ if (KV_MGR_BLK_NUM_HANGING > 0) {
+ is_rebuild_done = kv_mgr_blk_index_rebuild();
+ }
+
+ workspace_backup = KV_MGR_WORKSPACE;
+
+ // there must be at least one fresh block left, make workspace pointer to the fresh one
+ KV_MGR_WORKSPACE = kv_blk_next_fresh();
+
+ KV_BLK_FOR_EACH(cur_blk) {
+ if (kv_blk_is_dirty(cur_blk)) {
+ if (kv_do_gc(cur_blk) != KV_ERR_NONE) {
+ // cannot do gc for this block, give others a try
+ continue;
+ }
+
+ kv_blk_reset_inuse(cur_blk);
+
+ if (kv_blk_format(cur_blk) != KV_ERR_NONE) {
+ kv_blk_set_bad(cur_blk);
+ }
+
+ kv_blk_reset_fresh(KV_MGR_WORKSPACE);
+
+ if (!kv_blk_is_full(KV_MGR_WORKSPACE)) {
+ kv_blk_set_inuse(KV_MGR_WORKSPACE);
+ }
+
+ is_gc_done = LN_TRUE;
+
+ break;
+ }
+ }
+
+ if (!is_gc_done) {
+ // if do nothing, should restore the workspace;
+ KV_MGR_WORKSPACE = workspace_backup;
+ }
+
+ return (is_gc_done || is_rebuild_done) ? KV_ERR_NONE : KV_ERR_GC_NOTHING;
+}
+
+kv_err_t ln_kv_init(uint32_t flash_start, uint32_t flash_end, kv_flash_drv_t *flash_drv, kv_flash_prop_t *flash_prop)
+{
+ kv_err_t err;
+
+ if (kv_param_verify(flash_start, flash_end, flash_drv, flash_prop) != KV_ERR_NONE) {
+ return KV_ERR_INVALID_PARAM;
+ }
+
+ memset(&kv_ctl, 0, sizeof(kv_ctl));
+
+ kv_flash_ctl_init(flash_start, flash_end, flash_drv, flash_prop);
+
+ err = kv_mgr_ctl_init();
+ if (err != KV_ERR_NONE) {
+ return err;
+ }
+
+ kv_mgr_ctl_build();
+
+ return kv_mgr_workspace_locate();
+}
+
+kv_err_t ln_kv_deinit(void)
+{
+ kv_mgr_ctl_deinit();
+ return KV_ERR_NONE;
+}
+
+kv_err_t ln_kv_set(const char *key, const void *value, size_t value_len)
+{
+ kv_err_t err;
+ kv_item_t *item;
+
+ if (!key || !value) {
+ return KV_ERR_INVALID_PARAM;
+ }
+
+ if (strlen(key) >= (uint8_t)-1 ||
+ value_len >= (uint16_t)-1) {
+ return KV_ERR_SIZE_EXCEEDED;
+ }
+
+ kv_lock();
+
+ item = kv_item_find(key);
+ if (item) { // already exist
+ err = kv_item_update(item, key, value, value_len);
+ kv_item_free(item);
+ } else {
+ err = kv_item_save(key, value, value_len, NULL);
+ }
+
+ kv_unlock();
+
+ return err;
+}
+
+kv_err_t ln_kv_get(const char *key, void *value_buf, size_t value_buf_size, size_t *value_len)
+{
+ uint8_t k_len;
+ uint16_t v_len;
+ kv_item_t *item;
+
+ if (!key || !value_buf || !value_len) {
+ return KV_ERR_INVALID_PARAM;
+ }
+
+ if (strlen(key) >= (uint8_t)-1) {
+ return KV_ERR_SIZE_EXCEEDED;
+ }
+
+ kv_lock();
+
+ item = kv_item_find(key);
+ if (!item) {
+ kv_unlock();
+ return KV_ERR_NOT_EXIST;
+ }
+
+ kv_unlock();
+
+ k_len = item->hdr.k_len;
+ v_len = item->hdr.v_len;
+ *value_len = v_len;
+
+ if (value_buf_size < v_len) {
+ kv_item_free(item);
+ return KV_ERR_BUF_TOO_SHORT;
+ }
+
+ memcpy(value_buf, item->body + k_len, v_len);
+ kv_item_free(item);
+
+ return KV_ERR_NONE;
+}
+
+int ln_kv_has_key(const char *key)
+{
+ int has_key;
+
+ if (!key) {
+ return KV_ERR_INVALID_PARAM;
+ }
+
+ if (strlen(key) >= (uint8_t)-1) {
+ return KV_ERR_SIZE_EXCEEDED;
+ }
+
+ kv_lock();
+ has_key = kv_item_find(key) ? LN_TRUE : LN_FALSE;
+ kv_unlock();
+
+ return has_key;
+}
+
+kv_err_t ln_kv_del(const char *key)
+{
+ kv_err_t err;
+ kv_item_t *item;
+
+ if (!key) {
+ return KV_ERR_INVALID_PARAM;
+ }
+
+ if (strlen(key) >= (uint8_t)-1) {
+ return KV_ERR_SIZE_EXCEEDED;
+ }
+
+ kv_lock();
+
+ item = kv_item_find(key);
+ if (!item) {
+ kv_unlock();
+ return KV_ERR_NOT_EXIST;
+ }
+
+ err = kv_item_delete(item);
+ kv_item_free(item);
+
+ kv_unlock();
+
+ return err;
+}
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv.h b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv.h
new file mode 100644
index 00000000..59119408
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv.h
@@ -0,0 +1,291 @@
+#ifndef __LN_KV_H__
+#define __LN_KV_H__
+
+#include "ln_compiler.h"
+#include "ln_types.h"
+#include "ln_kv_err.h"
+#include "ln_kv_flash.h"
+#include "ln_kv_port.h"
+#include "ln_kv_api.h"
+
+typedef uint64_t kv_wunit_t;
+
+typedef uint8_t kv_byte_t; // byte
+typedef uint16_t kv_hword_t; // half word
+typedef uint32_t kv_word_t; // word
+typedef uint64_t kv_dword_t; // double word
+
+#define KV_BLK_FLAG_FRESH 0x01 /* a totally virgin block */
+#define KV_BLK_FLAG_INUSE 0x02 /* in-use */
+#define KV_BLK_FLAG_DIRTY 0x04 /* has discarded item inside */
+#define KV_BLK_FLAG_BAD 0x08 /* bad block, maybe device error */
+#define KV_BLK_FLAG_HANGING 0x10 /* index building failed, we mark a hanging flag here, and will give another chance to do a retry */
+
+#define KV_FLASH_START (kv_ctl.flash_ctl.flash_start)
+#define KV_FLASH_END (kv_ctl.flash_ctl.flash_end)
+#define KV_FLASH_SIZE (KV_FLASH_END - KV_FLASH_START)
+#define KV_FLASH_SECTOR_SIZE_LOG2 (kv_ctl.flash_ctl.sector_size_log2)
+#define KV_FLASH_SECTOR_SIZE (1 << KV_FLASH_SECTOR_SIZE_LOG2)
+#define KV_FLASH_WRITE_ALIGN (kv_ctl.flash_ctl.flash_write_align)
+
+#define KV_FLASH_WRITE ((kv_flash_write_t)(kv_ctl.flash_ctl.flash_drv.write))
+#define KV_FLASH_READ ((kv_flash_read_t)(kv_ctl.flash_ctl.flash_drv.read))
+#define KV_FLASH_ERASE ((kv_flash_erase_t)(kv_ctl.flash_ctl.flash_drv.erase))
+
+#define KV_IS_ALINGED(v, align) ((v) % (align) == 0)
+#define KV_IS_ALINGED_LOG2(v, align_log2) KV_IS_ALINGED(v, (1 << (align_log2)))
+#define KV_ALIGN_UP(v, align) (((v) + ((align) - 1)) & ~((align) - 1))
+#define KV_ALIGN_DOWN(v, align) ((v) - ((v) & ((align) - 1)))
+#define KV_OFFSET_OF_FIELD(type, field) ((uint32_t)&(((type *)0)->field))
+#define KV_ADDR_OF_FIELD(addr, type, field) (addr + KV_OFFSET_OF_FIELD(type, field))
+
+#define KV_ALIGNED_SIZE(len) KV_ALIGN_UP(len, KV_FLASH_WRITE_ALIGN)
+
+#ifndef KV_CONFIG_OS_NONE
+ #define KV_MGR_LOCK (&kv_ctl.mgr_ctl.kv_lock)
+#endif
+#define KV_MGR_BLK_NUM_FRESH (kv_ctl.mgr_ctl.blk_info.num_fresh)
+#define KV_MGR_BLK_NUM_INUSE (kv_ctl.mgr_ctl.blk_info.num_inuse)
+#define KV_MGR_BLK_NUM_HANGING (kv_ctl.mgr_ctl.blk_info.num_hanging)
+#define KV_MGR_BLK_NUM_TOTAL (kv_ctl.mgr_ctl.blk_info.num_total)
+#define KV_MGR_BLK_DETAIL (kv_ctl.mgr_ctl.blk_info.blk_detail)
+#define KV_MGR_WORKSPACE (kv_ctl.mgr_ctl.workspace)
+
+#define KV_NO_WRITEABLE_BLK() (KV_MGR_BLK_NUM_INUSE == 0 && KV_MGR_BLK_NUM_FRESH == 0)
+
+#define KV_ITEM_HDR_MAGIC 0xABCD1234DCBA4321
+#define KV_ITEM_DISCARDED 0x0F0F0F0F0F0F0F0F
+#define KV_ITEM_IS_DISCARDED(item_hdr) ((item_hdr)->discarded_flag == KV_ITEM_DISCARDED)
+#define KV_ITEM_IS_LEGAL(item_hdr) ((item_hdr)->magic == KV_ITEM_HDR_MAGIC)
+#define KV_ITEM_IS_FRESH(item_hdr) ((item_hdr)->magic == (kv_wunit_t)-1 && \
+ (item_hdr)->discarded_flag == (kv_wunit_t)-1 && \
+ (item_hdr)->checksum == (uint8_t)-1 && \
+ (item_hdr)->k_len == (uint8_t)-1 && \
+ (item_hdr)->v_len == (uint16_t)-1 && \
+ (item_hdr)->prev_pos == (uint32_t)-1)
+
+#define KV_ITEM_ADDR2BLK(item_start) (KV_ALIGN_DOWN((item_start) - KV_FLASH_START, KV_BLK_SIZE) + KV_FLASH_START)
+#define KV_ITEM_HDR_SIZE KV_ALIGNED_SIZE(sizeof(kv_item_hdr_t))
+#define KV_ITEM_BODY_SIZE(k_len, v_len) KV_ALIGNED_SIZE(k_len + v_len)
+#define KV_ITEM_SIZE(k_len, v_len) (KV_ITEM_HDR_SIZE + KV_ITEM_BODY_SIZE(k_len, v_len))
+#define KV_ITEM_SIZE_OF_ITEM(item) KV_ITEM_SIZE(item->hdr.k_len, item->hdr.v_len)
+#define KV_ITEM_SIZE_OF_BODY(item) KV_ITEM_BODY_SIZE(item->hdr.k_len, item->hdr.v_len)
+#define KV_ITEM_ADDR_OF_BODY(item) (item->pos + KV_ITEM_HDR_SIZE)
+
+#define KV_BLK_HDR_MAGIC 0x1234ABCD4321DCBA
+#define KV_BLK_IS_LEGAL(blk_hdr) ((blk_hdr)->magic == KV_BLK_HDR_MAGIC)
+#define KV_BLK_INVALID ((uint32_t)-1)
+#define KV_BLK_HDR_SIZE KV_ALIGNED_SIZE(sizeof(kv_blk_hdr_t))
+#define KV_BLK_SIZE (KV_FLASH_SECTOR_SIZE)
+#define KV_BLK_FRESH_SIZE (KV_BLK_SIZE - KV_BLK_HDR_SIZE)
+#define KV_BLK_END(blk_start) (blk_start + KV_BLK_SIZE)
+#define KV_BLK_USABLE_ADDR(blk_start) (KV_BLK_END(blk_start) - kv_blk_freesz_get(blk_start))
+#define KV_BLK_ADDR2IDX(blk_start) ((blk_start - KV_FLASH_START) / KV_BLK_SIZE)
+#define KV_BLK_FIRST_ITEM(blk_start) (blk_start + KV_BLK_HDR_SIZE)
+#define KV_BLK_NEXT(blk_start) (blk_start + KV_BLK_SIZE >= KV_FLASH_END ? KV_FLASH_START : blk_start + KV_BLK_SIZE)
+
+#define KV_BLK_FOR_EACH_FROM(cur_blk, start_blk) \
+ for (cur_blk = KV_BLK_NEXT(start_blk); \
+ cur_blk != start_blk; \
+ cur_blk = KV_BLK_NEXT(cur_blk))
+
+#define KV_BLK_FOR_EACH(cur_blk) \
+ for (cur_blk = KV_FLASH_START; \
+ cur_blk < KV_FLASH_END; \
+ cur_blk += KV_BLK_SIZE)
+
+typedef struct kv_flash_control_st {
+ uint8_t sector_size_log2;
+ uint8_t flash_write_align;
+ uint32_t flash_start;
+ uint32_t flash_end;
+
+ kv_flash_drv_t flash_drv;
+} kv_flash_ctl_t;
+
+typedef struct kv_blk_detail_st {
+ uint8_t blk_flags; /*< flags indicating the status of the blk, see KV_BLK_FLAG_* */
+ uint32_t free_size; /*< how many usable flash left */
+} kv_blk_detail_t;
+
+typedef struct kv_blk_info_st {
+ uint16_t num_inuse;
+ uint16_t num_fresh;
+ uint16_t num_hanging;
+ uint16_t num_total;
+
+ kv_blk_detail_t *blk_detail;
+} kv_blk_info_t;
+
+typedef struct kv_manager_control_st {
+ uint32_t workspace;
+ kv_blk_info_t blk_info;
+
+#ifndef KV_CONFIG_OS_NONE
+ kv_mutex_t kv_lock;
+#endif
+} kv_mgr_ctl_t;
+
+typedef struct kv_control_st {
+ kv_flash_ctl_t flash_ctl;
+ kv_mgr_ctl_t mgr_ctl;
+} kv_ctl_t;
+
+typedef struct kv_block_header_st {
+ kv_wunit_t magic; /*< is this block formatted? */
+} __PACKED__ kv_blk_hdr_t;
+
+typedef struct kv_item_header_st {
+ kv_wunit_t discarded_flag; /*< is this item a discarded one, deleted or updated */
+ kv_wunit_t magic; /*< for item header integrity verification */
+ uint8_t checksum; /*< checksum for key/value buffer */
+ uint8_t k_len; /*< key length */
+ uint16_t v_len; /*< value length */
+ uint32_t prev_pos; /*< previous position of this item */
+} __PACKED__ kv_item_hdr_t;
+
+typedef struct kv_item_st {
+ kv_item_hdr_t hdr; /*< item header */
+ uint32_t pos; /*< where this item is */
+ uint8_t *body; /*< item body: key/value buffer */
+} kv_item_t;
+
+static kv_ctl_t kv_ctl;
+
+__STATIC_INLINE__ void kv_blk_freesz_set(uint32_t blk_start, uint32_t free_size)
+{
+ KV_MGR_BLK_DETAIL[KV_BLK_ADDR2IDX(blk_start)].free_size = free_size;
+}
+
+__STATIC_INLINE__ uint32_t kv_blk_freesz_get(uint32_t blk_start)
+{
+ return KV_MGR_BLK_DETAIL[KV_BLK_ADDR2IDX(blk_start)].free_size;
+}
+
+__STATIC_INLINE__ void kv_blk_freesz_reduce(uint32_t blk_start, uint32_t size_reduced)
+{
+ kv_blk_freesz_set(blk_start, kv_blk_freesz_get(blk_start) - size_reduced);
+}
+
+__STATIC_INLINE__ int kv_blk_is_full(uint32_t blk_start)
+{
+ return kv_blk_freesz_get(blk_start) <= KV_ITEM_HDR_SIZE;
+}
+
+__STATIC_INLINE__ void kv_blk_flags_set(uint32_t blk_start, uint8_t blk_flags)
+{
+ KV_MGR_BLK_DETAIL[KV_BLK_ADDR2IDX(blk_start)].blk_flags = blk_flags;
+}
+
+__STATIC_INLINE__ uint8_t kv_blk_flags_get(uint32_t blk_start)
+{
+ return KV_MGR_BLK_DETAIL[KV_BLK_ADDR2IDX(blk_start)].blk_flags;
+}
+
+__STATIC_INLINE__ void kv_blk_flags_add(uint32_t blk_start, uint8_t blk_flags)
+{
+ KV_MGR_BLK_DETAIL[KV_BLK_ADDR2IDX(blk_start)].blk_flags |= blk_flags;
+}
+
+__STATIC_INLINE__ void kv_blk_flags_rmv(uint32_t blk_start, uint8_t blk_flags)
+{
+ KV_MGR_BLK_DETAIL[KV_BLK_ADDR2IDX(blk_start)].blk_flags &= ~blk_flags;
+}
+
+__STATIC_INLINE__ int kv_blk_is_fresh(uint32_t blk_start)
+{
+ return kv_blk_flags_get(blk_start) & KV_BLK_FLAG_FRESH;
+}
+
+__STATIC_INLINE__ int kv_blk_is_inuse(uint32_t blk_start)
+{
+ return kv_blk_flags_get(blk_start) & KV_BLK_FLAG_INUSE;
+}
+
+__STATIC_INLINE__ int kv_blk_is_dirty(uint32_t blk_start)
+{
+ return kv_blk_flags_get(blk_start) & KV_BLK_FLAG_DIRTY;
+}
+
+__STATIC_INLINE__ int kv_blk_is_bad(uint32_t blk_start)
+{
+ return kv_blk_flags_get(blk_start) & KV_BLK_FLAG_BAD;
+}
+
+__STATIC_INLINE__ int kv_blk_is_hanging(uint32_t blk_start)
+{
+ return kv_blk_flags_get(blk_start) & KV_BLK_FLAG_HANGING;
+}
+
+__STATIC_INLINE__ void kv_blk_set_fresh(uint32_t blk_start)
+{
+ if (!kv_blk_is_fresh(blk_start)) {
+ ++KV_MGR_BLK_NUM_FRESH;
+ }
+
+ kv_blk_freesz_set(blk_start, KV_BLK_FRESH_SIZE);
+ kv_blk_flags_set(blk_start, KV_BLK_FLAG_FRESH);
+}
+
+__STATIC_INLINE__ void kv_blk_set_inuse(uint32_t blk_start)
+{
+ if (!kv_blk_is_inuse(blk_start)) {
+ ++KV_MGR_BLK_NUM_INUSE;
+ }
+
+ kv_blk_flags_add(blk_start, KV_BLK_FLAG_INUSE);
+}
+
+__STATIC_INLINE__ void kv_blk_set_dirty(uint32_t blk_start)
+{
+ kv_blk_flags_add(blk_start, KV_BLK_FLAG_DIRTY);
+}
+
+__STATIC_INLINE__ void kv_blk_set_bad(uint32_t blk_start)
+{
+ kv_blk_flags_set(blk_start, KV_BLK_FLAG_BAD);
+}
+
+__STATIC_INLINE__ void kv_blk_set_hanging(uint32_t blk_start)
+{
+ if (!kv_blk_is_hanging(blk_start)) {
+ ++KV_MGR_BLK_NUM_HANGING;
+ }
+
+ kv_blk_flags_add(blk_start, KV_BLK_FLAG_HANGING);
+}
+
+__STATIC_INLINE__ void kv_blk_reset_fresh(uint32_t blk_start)
+{
+ if (kv_blk_is_fresh(blk_start)) {
+ --KV_MGR_BLK_NUM_FRESH;
+ }
+
+ kv_blk_flags_rmv(blk_start, KV_BLK_FLAG_FRESH);
+}
+
+__STATIC_INLINE__ void kv_blk_reset_inuse(uint32_t blk_start)
+{
+ if (kv_blk_is_inuse(blk_start)) {
+ --KV_MGR_BLK_NUM_INUSE;
+ }
+
+ kv_blk_flags_rmv(blk_start, KV_BLK_FLAG_INUSE);
+}
+
+__STATIC_INLINE__ void kv_blk_reset_hanging(uint32_t blk_start)
+{
+ if (kv_blk_is_hanging(blk_start)) {
+ --KV_MGR_BLK_NUM_HANGING;
+ }
+
+ kv_blk_flags_rmv(blk_start, KV_BLK_FLAG_HANGING);
+}
+
+typedef kv_err_t (*kv_item_walker_t)(kv_item_t *item, const void *patten);
+
+kv_err_t ln_kv_init(uint32_t flash_start, uint32_t flash_end, kv_flash_drv_t *flash_drv, kv_flash_prop_t *flash_prop);
+
+
+#endif /* __LN_KV_H__ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv_api.h b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv_api.h
new file mode 100644
index 00000000..be0c08f5
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv_api.h
@@ -0,0 +1,16 @@
+#ifndef __LN_KV_API_H__
+#define __LN_KV_API_H__
+
+#include "ln_types.h"
+#include "ln_kv_err.h"
+#include "ln_kv_api.h"
+
+kv_err_t ln_kv_port_init(uint32_t flash_start, uint32_t flash_end);
+kv_err_t ln_kv_deinit(void);
+kv_err_t ln_kv_set(const char *key, const void *value, size_t v_len);
+kv_err_t ln_kv_get(const char *key, void *value_buf, size_t value_buf_size, size_t *v_len);
+int ln_kv_has_key(const char *key);
+kv_err_t ln_kv_del(const char *key);
+
+#endif /* __LN_KV_API_H__ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv_err.h b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv_err.h
new file mode 100644
index 00000000..3a892140
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv_err.h
@@ -0,0 +1,36 @@
+#ifndef __LN_KV_ERR_H__
+#define __LN_KV_ERR_H__
+
+typedef enum kv_err_en {
+ KV_ERR_NONE = 0u,
+
+ KV_ERR_BUF_TOO_SHORT = 10u,
+ KV_ERR_BLK_STATUS_ERROR,
+
+ KV_ERR_DATA_FETCH_FAILED = 20u,
+
+ KV_ERR_FLASH_ERASE_FAILED = 30u,
+ KV_ERR_FLASH_READ_FAILED,
+ KV_ERR_FLASH_WRITE_FAILED,
+
+ KV_ERR_GC_NOTHING = 40u,
+
+ KV_ERR_INTERNAL_ERROR = 50u,
+ KV_ERR_INSUFFICIENT_SPACE,
+ KV_ERR_INVALID_PARAM,
+ KV_ERR_INVALID_ITEM,
+
+ KV_ERR_NEXT_LOOP = 60u,
+ KV_ERR_NOT_EXIST,
+ KV_ERR_NO_WRITEABLE_BLK,
+
+ KV_ERR_OUT_OF_MEMORY = 70u,
+
+ KV_ERR_POS_FIX_FAILED =80u,
+
+ KV_ERR_SIZE_EXCEEDED = 90u,
+} kv_err_t;
+
+
+#endif /* __LN_KV_ERR_H__ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv_flash.h b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv_flash.h
new file mode 100644
index 00000000..13184bd2
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv/ln_kv_flash.h
@@ -0,0 +1,21 @@
+#ifndef __LN_KV_FLASH_H__
+#define __LN_KV_FLASH_H__
+
+#include "ln_types.h"
+
+typedef int (*kv_flash_write_t)(uint32_t addr, const void *buf, size_t len);
+typedef int (*kv_flash_read_t)(uint32_t addr, void *buf, size_t len);
+typedef int (*kv_flash_erase_t)(uint32_t addr, size_t len);
+
+typedef struct kv_flash_drv_st {
+ kv_flash_write_t write;
+ kv_flash_read_t read;
+ kv_flash_erase_t erase;
+} kv_flash_drv_t;
+
+typedef struct kv_flash_property_st {
+ uint8_t sector_size_log2;
+} kv_flash_prop_t;
+
+#endif /* __LN_KV_FLASH_H__ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv_port/ln_kv_port.c b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv_port/ln_kv_port.c
new file mode 100644
index 00000000..0c2cb38f
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv_port/ln_kv_port.c
@@ -0,0 +1,37 @@
+#include "ln_kv_port.h"
+#include "ln_kv_flash.h"
+#include "ln_kv.h"
+#include "hal/flash.h"
+
+
+static kv_flash_drv_t flash_drv;
+static kv_flash_prop_t flash_prop;
+
+static int flash_read(uint32_t offset, void *buf, uint32_t len)
+{
+ return FLASH_Read(offset, len, buf);
+}
+
+static int flash_write(uint32_t offset, const void *buf, uint32_t len)
+{
+ return FLASH_Program(offset, len, (uint8_t*)buf);
+}
+
+static int flash_erase(uint32_t offset, uint32_t len)
+{
+ FLASH_Erase(offset, len);
+ return 0;
+}
+
+kv_err_t ln_kv_port_init(uint32_t flash_start, uint32_t flash_end)
+{
+ flash_drv.read = flash_read;
+ flash_drv.write = flash_write;
+ flash_drv.erase = flash_erase;
+
+ flash_prop.sector_size_log2 = KV_CONFIG_FLASH_SECT_SIZE_LOG2;
+
+ return ln_kv_init(flash_start, flash_end, &flash_drv, &flash_prop);
+}
+
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv_port/ln_kv_port.h b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv_port/ln_kv_port.h
new file mode 100644
index 00000000..8f317f6f
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fs/kv/kv_port/ln_kv_port.h
@@ -0,0 +1,80 @@
+#ifndef __LN_KV_PORT_H__
+#define __LN_KV_PORT_H__
+
+#include "proj_config.h"
+#include "ln_types.h"
+#include "ln_kv_err.h"
+#include "ln_compiler.h"
+#include "mem_map_ln882x.h"
+
+
+#ifndef __CONFIG_OS_KERNEL
+ #define KV_CONFIG_OS_NONE
+#endif
+#define KV_CONFIG_FLASH_SECT_SIZE_LOG2 (12)
+
+
+#if defined(KV_CONFIG_OS_NONE)
+ #include "stdlib.h"
+
+ __STATIC_INLINE__ void *ln_kv_malloc(size_t size)
+ {
+ return malloc(size);
+ }
+
+ __STATIC_INLINE__ void ln_kv_free(void *ptr)
+ {
+ free(ptr);
+ }
+
+#else /* KV_CONFIG_OS_NONE */
+ #include "osal/osal.h"
+
+ typedef OS_Mutex_t kv_mutex_t;
+
+ __STATIC_INLINE__ int ln_kv_is_os_running(void)
+ {
+ if (OS_ThreadIsSchedulerRunning()){
+ return LN_TRUE;
+ }
+ return LN_FALSE;
+ }
+
+ __STATIC_INLINE__ int ln_kv_mutex_create(kv_mutex_t *mutex)
+ {
+ if (OS_OK == OS_MutexCreate(mutex)) {
+ return LN_TRUE;
+ }
+ return LN_FALSE;
+ }
+
+ __STATIC_INLINE__ void ln_kv_mutex_delete(kv_mutex_t *mutex)
+ {
+ OS_MutexDelete(mutex);
+ }
+
+ __STATIC_INLINE__ void ln_kv_mutex_lock(kv_mutex_t *mutex)
+ {
+ OS_MutexLock(mutex, OS_WAIT_FOREVER);
+ }
+
+ __STATIC_INLINE__ void ln_kv_mutex_unlock(kv_mutex_t *mutex)
+ {
+ OS_MutexUnlock(mutex);
+ }
+
+ __STATIC_INLINE__ void *ln_kv_malloc(size_t size)
+ {
+ return OS_Malloc(size);
+ }
+
+ __STATIC_INLINE__ void ln_kv_free(void *ptr)
+ {
+ OS_Free(ptr);
+ }
+#endif /* KV_CONFIG_OS_NONE */
+
+
+
+#endif /* __LN_KV_PORT_H__ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/nvds/nvds.c b/platform/vendor_bsp/LN/ln882x/src/fs/nvds/nvds.c
similarity index 99%
rename from platform/vendor_bsp/LN/ln882x/src/nvds/nvds.c
rename to platform/vendor_bsp/LN/ln882x/src/fs/nvds/nvds.c
index 8e83545d..c0a1a062 100644
--- a/platform/vendor_bsp/LN/ln882x/src/nvds/nvds.c
+++ b/platform/vendor_bsp/LN/ln882x/src/fs/nvds/nvds.c
@@ -1,4 +1,4 @@
-#include "nvds/nvds.h"
+#include "nvds.h"
#include "hal/flash.h"
diff --git a/platform/vendor_bsp/LN/ln882x/include/nvds/nvds.h b/platform/vendor_bsp/LN/ln882x/src/fs/nvds/nvds.h
similarity index 94%
rename from platform/vendor_bsp/LN/ln882x/include/nvds/nvds.h
rename to platform/vendor_bsp/LN/ln882x/src/fs/nvds/nvds.h
index b9030c5b..515f5fc2 100644
--- a/platform/vendor_bsp/LN/ln882x/include/nvds/nvds.h
+++ b/platform/vendor_bsp/LN/ln882x/src/fs/nvds/nvds.h
@@ -2,8 +2,9 @@
#define __NVDS_H__
#include "ln88xx.h"
+#include "flash_partition_table.h"
-#define USR_NVDS_SECT1_OFFSET (USR_NVDS_PARAM_OFFSET)
+#define USR_NVDS_SECT1_OFFSET (NVDS_SPACE_OFFSET)
#define USR_NVDS_SECT2_OFFSET (USR_NVDS_SECT1_OFFSET + SIZE_4KB)
#define USR_NVDS_FLAG_OFFSET (USR_NVDS_SECT2_OFFSET + SIZE_4KB)
diff --git a/platform/vendor_bsp/LN/ln882x/src/fs/partition_mgr/flash_partition_mgr.c b/platform/vendor_bsp/LN/ln882x/src/fs/partition_mgr/flash_partition_mgr.c
new file mode 100644
index 00000000..56068cfd
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fs/partition_mgr/flash_partition_mgr.c
@@ -0,0 +1,61 @@
+#include "flash_partition_mgr.h"
+
+#include "hal/flash.h"
+#include "utils/crc32.h"
+
+
+int ln_verify_partition_table(void)
+{
+ partition_info_t rd_info;
+
+ for (uint32_t i = 0; i < PARTITION_TAB_SIZE; i += sizeof(partition_info_t))
+ {
+ FLASH_Read((PARTITION_TAB_BASE + i), sizeof(partition_info_t), (uint8_t *)&rd_info);
+
+ if ((rd_info.type == 0) && \
+ (rd_info.start_addr == 0) && \
+ (rd_info.size == 0) && \
+ (rd_info.crc32 == 0))
+ {
+ return LN_TRUE;
+ }
+ else
+ {
+ if (rd_info.crc32 != ln_crc32_signle_cal((uint8_t *)&rd_info, sizeof(partition_info_t) - sizeof(uint32_t))) {
+ return LN_FALSE;
+ }
+ }
+ }
+ return LN_FALSE;
+}
+
+int ln_fetch_partition_info(partition_type_t type, partition_info_t *info)
+{
+ if (!info) {
+ return LN_FALSE;
+ }
+
+ for (uint32_t i = 0; i < PARTITION_TAB_SIZE; i += sizeof(partition_info_t))
+ {
+ FLASH_Read((PARTITION_TAB_BASE + i), sizeof(partition_info_t), (uint8_t *)info);
+
+ if (info->type == type)
+ {
+ if (info->crc32 == ln_crc32_signle_cal((uint8_t *)info, sizeof(partition_info_t) - sizeof(uint32_t))) {
+ return LN_TRUE;
+ } else {
+ return LN_FALSE;
+ }
+ }
+ else if ((info->type == 0) && \
+ (info->start_addr == 0) && \
+ (info->size == 0) && \
+ (info->crc32 == 0))
+ {
+ return LN_FALSE;
+ }
+ }
+ return LN_FALSE;
+}
+
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/fs/partition_mgr/flash_partition_mgr.h b/platform/vendor_bsp/LN/ln882x/src/fs/partition_mgr/flash_partition_mgr.h
new file mode 100644
index 00000000..de37b4d9
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/fs/partition_mgr/flash_partition_mgr.h
@@ -0,0 +1,58 @@
+#ifndef __FLASH_PARTITION_MGR_H__
+#define __FLASH_PARTITION_MGR_H__
+#include "ln_types.h"
+
+
+#define PARTITION_TAB_BASE (1024*36)/* < Warning: Do not change it! */
+#define PARTITION_TAB_SIZE (1024*4) /* < Warning: Do not change it! */
+
+typedef enum {
+ PARTITION_TYPE_APP = 0u, /*< application */
+ PARTITION_TYPE_OTA = 1u, /*< ota temp*/
+ PARTITION_TYPE_KV = 2u, /*< Key-Value */
+ PARTITION_TYPE_NVDS = 3u, /*< nvds(NVRAM) */
+ PARTITION_TYPE_SIMU_EEPROM = 4u, /*< simulation eeprom*/
+ PARTITION_TYPE_USER = 5u, /*< user defined */
+ PARTITION_TYPE_PLACE = 0x12345678, /*< make different IDEs compatible */
+} partition_type_t;
+
+typedef struct {
+ partition_type_t type; /*< what's the type of partition */
+ uint32_t start_addr; /*< start address */
+ uint32_t size; /*< partition size */
+ uint32_t crc32; /*< checksum of the partition info except itself */
+} partition_info_t;
+
+
+/**
+ * @brief Verify partition table.
+ * verify the main partition table of flash.
+ *
+ * @attention None
+ *
+ * @return whether the verification is successful.
+ * @retval #LN_TRUE successful.
+ * @retval #LN_FALSE failed.
+ */
+int ln_verify_partition_table(void);
+
+/**
+ * @brief fetch partition info.
+ * Fetch partition information for a specified type partition.
+ *
+ * @attention None
+ *
+ * @param[in] type types indicating the type of the partition entity, see PARTITION_TYPE_*.
+ * @param[out] info pointer to a partition info struct.
+ *
+ * @return Whether to fetch info successfully.
+ * @retval #LN_TRUE successful.
+ * @retval #LN_FALSE failed.
+ */
+int ln_fetch_partition_info(partition_type_t type, partition_info_t * info);
+
+
+
+#endif /* __FLASH_PARTITION_MGR_H__ */
+
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/kernel/FreeRTOS_Adapter/freertos_common.c b/platform/vendor_bsp/LN/ln882x/src/kernel/FreeRTOS_Adapter/freertos_common.c
index 50f4cee7..782720f8 100644
--- a/platform/vendor_bsp/LN/ln882x/src/kernel/FreeRTOS_Adapter/freertos_common.c
+++ b/platform/vendor_bsp/LN/ln882x/src/kernel/FreeRTOS_Adapter/freertos_common.c
@@ -8,10 +8,14 @@
#include "ln88xx.h"
#ifdef __CC_ARM
- extern unsigned int Image$$HEAP_SPACE$$ZI$$Base;
- extern unsigned int Image$$HEAP_SPACE$$ZI$$Limit;
- #define HEAP_START (&Image$$HEAP_SPACE$$ZI$$Base)
- #define HEAP_END (&Image$$HEAP_SPACE$$ZI$$Limit)
+ extern unsigned int Image$$HEAP_SPACE0$$ZI$$Base;
+ extern unsigned int Image$$HEAP_SPACE0$$ZI$$Limit;
+ extern unsigned int Image$$HEAP_SPACE1$$ZI$$Base;
+ extern unsigned int Image$$HEAP_SPACE1$$ZI$$Limit;
+ #define HEAP0_START (&Image$$HEAP_SPACE0$$ZI$$Base)
+ #define HEAP0_END (&Image$$HEAP_SPACE0$$ZI$$Limit)
+ #define HEAP1_START (&Image$$HEAP_SPACE1$$ZI$$Base)
+ #define HEAP1_END (&Image$$HEAP_SPACE1$$ZI$$Limit)
#elif __ICCARM__
#error "TODO: support iar compiler!!!"
#elif __GNUC__
@@ -29,11 +33,14 @@ static HeapRegion_t xHeapRegions[] = {
void OS_HeapSizeConfig(void)
{
- xHeapRegions[0].pucStartAddress = (uint8_t *)(HEAP_START);
- xHeapRegions[0].xSizeInBytes = (size_t) ((uint8_t *)HEAP_END - (uint8_t *)HEAP_START);
+ xHeapRegions[0].pucStartAddress = (uint8_t *)(HEAP0_START);
+ xHeapRegions[0].xSizeInBytes = (size_t) ((uint8_t *)HEAP0_END - (uint8_t *)HEAP0_START);
- xHeapRegions[1].pucStartAddress = NULL;
- xHeapRegions[1].xSizeInBytes = 0;
+ xHeapRegions[1].pucStartAddress = (uint8_t *)(HEAP1_START);
+ xHeapRegions[1].xSizeInBytes = (size_t) ((uint8_t *)HEAP1_END - (uint8_t *)HEAP1_START);
+
+ xHeapRegions[2].pucStartAddress = NULL;
+ xHeapRegions[2].xSizeInBytes = 0;
}
void OS_DefineHeapRegions(void)
diff --git a/platform/vendor_bsp/LN/ln882x/src/kernel/FreeRTOS_Adapter/freertos_mutex.c b/platform/vendor_bsp/LN/ln882x/src/kernel/FreeRTOS_Adapter/freertos_mutex.c
index 875c49dd..eb0ed1fc 100644
--- a/platform/vendor_bsp/LN/ln882x/src/kernel/FreeRTOS_Adapter/freertos_mutex.c
+++ b/platform/vendor_bsp/LN/ln882x/src/kernel/FreeRTOS_Adapter/freertos_mutex.c
@@ -50,7 +50,7 @@ OS_Status OS_MutexDelete(OS_Mutex_t *mutex)
* @param[in] waitMS The maximum amount of time (in millisecond) the thread
* should remain in the blocked state to wait for the mutex
* to become unlocked.
- * HAL_WAIT_FOREVER for waiting forever, zero for no waiting.
+ * OS_WAIT_FOREVER for waiting forever, zero for no waiting.
* @retval OS_Status, OS_OK on success
*/
OS_Status OS_MutexLock(OS_Mutex_t *mutex, OS_Time_t waitMS)
diff --git a/platform/vendor_bsp/LN/ln882x/src/kernel/FreeRTOS_Adapter/freertos_queue.c b/platform/vendor_bsp/LN/ln882x/src/kernel/FreeRTOS_Adapter/freertos_queue.c
index 2e02bf55..aa0ffc3a 100644
--- a/platform/vendor_bsp/LN/ln882x/src/kernel/FreeRTOS_Adapter/freertos_queue.c
+++ b/platform/vendor_bsp/LN/ln882x/src/kernel/FreeRTOS_Adapter/freertos_queue.c
@@ -36,16 +36,9 @@ OS_Status OS_QueueCreate(OS_Queue_t *queue, uint32_t queueLen, uint32_t itemSize
*/
OS_Status OS_QueueDelete(OS_Queue_t *queue)
{
- UBaseType_t ret;
OS_HANDLE_ASSERT(OS_QueueIsValid(queue), queue->handle);
- ret = uxQueueMessagesWaiting(queue->handle);
- if (ret > 0) {
- OS_ERR("queue %"OS_HANDLE_F" is not empty\r\n", queue->handle);
- return OS_FAIL;
- }
-
vQueueDelete(queue->handle);
OS_QueueSetInvalid(queue);
return OS_OK;
@@ -134,13 +127,3 @@ OS_Status OS_QueueReceive(OS_Queue_t *queue, void *item, OS_Time_t waitMS)
return OS_OK;
}
-OS_Status OS_QueueFlush(OS_Queue_t *queue)
-{
- void *item;
-
- OS_HANDLE_ASSERT(OS_QueueIsValid(queue), queue->handle);
- while(uxQueueMessagesWaiting(queue->handle)){
- OS_QueueReceive(queue,item,OS_WAIT_FOREVER);
- }
- return OS_OK;
-}
diff --git a/platform/vendor_bsp/LN/ln882x/src/kernel/TencentOS_Adapter/TencentOS_common.c b/platform/vendor_bsp/LN/ln882x/src/kernel/TencentOS_Adapter/TencentOS_common.c
index 400aab84..e6ffa370 100644
--- a/platform/vendor_bsp/LN/ln882x/src/kernel/TencentOS_Adapter/TencentOS_common.c
+++ b/platform/vendor_bsp/LN/ln882x/src/kernel/TencentOS_Adapter/TencentOS_common.c
@@ -8,10 +8,14 @@
#include "ln88xx.h"
#ifdef __CC_ARM
- extern unsigned int Image$$HEAP_SPACE$$ZI$$Base;
- extern unsigned int Image$$HEAP_SPACE$$ZI$$Limit;
- #define HEAP_START (&Image$$HEAP_SPACE$$ZI$$Base)
- #define HEAP_END (&Image$$HEAP_SPACE$$ZI$$Limit)
+ extern unsigned int Image$$HEAP_SPACE0$$ZI$$Base;
+ extern unsigned int Image$$HEAP_SPACE0$$ZI$$Limit;
+ #define HEAP0_START (&Image$$HEAP_SPACE0$$ZI$$Base)
+ #define HEAP0_END (&Image$$HEAP_SPACE0$$ZI$$Limit)
+ extern unsigned int Image$$HEAP_SPACE1$$ZI$$Base;
+ extern unsigned int Image$$HEAP_SPACE1$$ZI$$Limit;
+ #define HEAP1_START (&Image$$HEAP_SPACE1$$ZI$$Base)
+ #define HEAP1_END (&Image$$HEAP_SPACE1$$ZI$$Limit)
#elif __ICCARM__
#error "TODO: support iar compiler!!!"
#elif __GNUC__
@@ -25,12 +29,18 @@
void os_heap_mem_add_pool(void)
{
- uint8_t * heap_pool0_base = (uint8_t *)((((uint32_t)HEAP_START) + sizeof(size_t) - 1U) & ~(sizeof(size_t)-1U));
-
- size_t pool0_size = ((uint32_t)HEAP_END - (uint32_t)heap_pool0_base);
+ uint8_t * heap_pool0_base = (uint8_t *)((((uint32_t)HEAP0_START) + sizeof(size_t) - 1U) & ~(sizeof(size_t)-1U));
+ size_t pool0_size = ((uint32_t)HEAP0_END - (uint32_t)heap_pool0_base);
+
+ uint8_t * heap_pool1_base = (uint8_t *)((((uint32_t)HEAP1_START) + sizeof(size_t) - 1U) & ~(sizeof(size_t)-1U));
+ size_t pool1_size = ((uint32_t)HEAP1_END - (uint32_t)heap_pool1_base);
if(K_ERR_NONE != tos_mmheap_pool_add(heap_pool0_base, pool0_size)){
- LOG(LOG_LVL_ERROR,"[%s, %d]add pool fail.\r\n", __func__, __LINE__);
+ LOG(LOG_LVL_ERROR,"[%s, %d]add pool0 fail.\r\n", __func__, __LINE__);
+ };
+
+ if(K_ERR_NONE != tos_mmheap_pool_add(heap_pool1_base, pool1_size)){
+ LOG(LOG_LVL_ERROR,"[%s, %d]add pool1 fail.\r\n", __func__, __LINE__);
};
}
diff --git a/platform/vendor_bsp/LN/ln882x/src/kernel/TencentOS_Adapter/TencentOS_semaphore.c b/platform/vendor_bsp/LN/ln882x/src/kernel/TencentOS_Adapter/TencentOS_semaphore.c
index 12f5e0b0..acca0d61 100644
--- a/platform/vendor_bsp/LN/ln882x/src/kernel/TencentOS_Adapter/TencentOS_semaphore.c
+++ b/platform/vendor_bsp/LN/ln882x/src/kernel/TencentOS_Adapter/TencentOS_semaphore.c
@@ -72,7 +72,7 @@ OS_Status OS_SemaphoreWait(OS_Semaphore_t *sem, OS_Time_t waitMS)
if (err == K_ERR_NONE) {
return OS_OK;
} else {
- OS_ERR("err:%d,OS_SemaphoreWait filed.\r\n", err);
+// OS_ERR("err:%d,OS_SemaphoreWait filed.\r\n", err);
return OS_FAIL;
}
}
diff --git a/platform/vendor_bsp/LN/ln882x/src/net/lwip-2.0.3/src/port/lwipopts.h b/platform/vendor_bsp/LN/ln882x/src/net/lwip-2.0.3/src/port/lwipopts.h
index 5318d47b..2506459f 100644
--- a/platform/vendor_bsp/LN/ln882x/src/net/lwip-2.0.3/src/port/lwipopts.h
+++ b/platform/vendor_bsp/LN/ln882x/src/net/lwip-2.0.3/src/port/lwipopts.h
@@ -53,7 +53,7 @@ a lot of data that needs to be copied, this should be set high. */
/* ---------- Pbuf options ---------- */
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
-#define PBUF_POOL_SIZE 35
+#define PBUF_POOL_SIZE 25
/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
#define PBUF_POOL_BUFSIZE 500//(NETIF_MTU + PBUF_LINK_HLEN)
@@ -68,7 +68,7 @@ a lot of data that needs to be copied, this should be set high. */
/* TCP sender buffer space (bytes). */
#define TCP_SND_BUF (7 * TCP_MSS)
/* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */
-#define TCP_SND_QUEUELEN (42)//(5 * TCP_SND_BUF/TCP_MSS)
+#define TCP_SND_QUEUELEN (5 * TCP_SND_BUF/TCP_MSS)
/* TCP receive window. */
#define TCP_WND (6 * TCP_MSS)
/* Maximum number of retransmissions of data segments. */
diff --git a/platform/vendor_bsp/LN/ln882x/src/serial/serial.c b/platform/vendor_bsp/LN/ln882x/src/serial/serial.c
index a6707250..0c149cb7 100644
--- a/platform/vendor_bsp/LN/ln882x/src/serial/serial.c
+++ b/platform/vendor_bsp/LN/ln882x/src/serial/serial.c
@@ -1,6 +1,6 @@
#include
#include "serial/serial.h"
-#include "serial/serial_p.h"
+#include "serial_hw.h"
#include "utils/fifo/fifobuf.h"
#include "utils/debug/art_assert.h"
diff --git a/platform/vendor_bsp/LN/ln882x/src/utils/art_string.c b/platform/vendor_bsp/LN/ln882x/src/utils/art_string.c
index 5407db6e..dd417e0d 100644
--- a/platform/vendor_bsp/LN/ln882x/src/utils/art_string.c
+++ b/platform/vendor_bsp/LN/ln882x/src/utils/art_string.c
@@ -5,6 +5,8 @@
#include "utils/debug/log.h"
#include "utils/debug/art_assert.h"
+#define LN_MAC_OUI "00-50-C2"
+
/***************************************************************
* º¯ Êý Ãû£ºsubstring
* º¯Êý¹¦ÄÜ£º»ñµÃ×Ö·û´®ÖÐÖ¸¶¨Î»ÖõÄ×Ó´®
@@ -250,12 +252,26 @@ int generate_mac_randomly(unsigned char *addr)
HAL_TRNG_Init(TRNG, initStruct);
HAL_TRNG_Start(TRNG);
while(!HAL_TRNG_isDataReady(TRNG) || HAL_TRNG_isBusy(TRNG));
+#ifdef LN_MAC_OUI
+ uint32_t addr0, addr1, addr2;
+ sscanf(LN_MAC_OUI, "%X-%X-%X", &addr0, &addr1, &addr2);
+ *addr = addr0 & 0xFF;
+ *(addr + 1) = addr1 & 0xFF;
+ *(addr + 2) = addr2 & 0xFF;
+ for (int i = 0; i < 1; i++) {
+ trngNumber[i] = HAL_TRNG_GetRandomNumber(TRNG, i);
+ }
+ HAL_TRNG_Stop(TRNG);
+ memcpy(addr + 3, trngNumber, 3);
+#else
for (int i = 0; i < 2; i++) {
trngNumber[i] = HAL_TRNG_GetRandomNumber(TRNG, i);
}
HAL_TRNG_Stop(TRNG);
memcpy(addr, trngNumber, 6);
CLR_BIT(addr[0],0);
+ CLR_BIT(addr[0],1);
+#endif
return 0;
}
diff --git a/platform/vendor_bsp/LN/ln882x/src/utils/crc32.c b/platform/vendor_bsp/LN/ln882x/src/utils/crc32.c
index 38d2eab7..02ccdeaa 100644
--- a/platform/vendor_bsp/LN/ln882x/src/utils/crc32.c
+++ b/platform/vendor_bsp/LN/ln882x/src/utils/crc32.c
@@ -1,7 +1,7 @@
#include "utils/crc32.h"
-const uint32_t Crc32Table[256] = {
+static const uint32_t Crc32Table[256] = {
0x00000000,0x77073096,0xEE0E612C,0x990951BA,
0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3,
0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,
@@ -69,9 +69,27 @@ const uint32_t Crc32Table[256] = {
};
-uint32_t GetCrc32(uint8_t *ptr, int len)
+
+void ln_crc32_init(crc32_ctx_t *ctx)
+{
+ ctx->crc = 0xFFFFFFFFL;
+}
+
+void ln_crc32_update(crc32_ctx_t *ctx, uint8_t *data, uint32_t len)
+{
+ for (uint32_t i = 0; i < len; i++)
+ {
+ ctx->crc = (ctx->crc >> 8) ^ Crc32Table[(ctx->crc & 0xFF) ^ *data++];
+ }
+}
+
+uint32_t ln_crc32_final(crc32_ctx_t *ctx)
+{
+ return ctx->crc ^= 0xFFFFFFFFUL;
+}
+
+uint32_t ln_crc32_signle_cal(uint8_t *ptr, int len)
{
-
uint32_t crc = 0xFFFFFFFF;
while (len > 0)
{
@@ -80,7 +98,6 @@ uint32_t GetCrc32(uint8_t *ptr, int len)
len--;
}
return crc^0xffffffff;
-
}
diff --git a/platform/vendor_bsp/LN/ln882x/src/utils/eeprom.c b/platform/vendor_bsp/LN/ln882x/src/utils/eeprom.c
index 2caaa830..1a48b30b 100644
--- a/platform/vendor_bsp/LN/ln882x/src/utils/eeprom.c
+++ b/platform/vendor_bsp/LN/ln882x/src/utils/eeprom.c
@@ -8,11 +8,12 @@
#include "osal/osal.h"
#include "utils/eeprom.h"
#include "utils/system_parameter.h"
+#include "flash_partition_table.h"
#define PAGE_SIZE (1*SIZE_4KB)
/* EEPROM start address in Flash */
-#define EEPROM_START_ADDRESS ((uint32_t)(SYSTEM_PARAMETER_OFFSET))
+#define EEPROM_START_ADDRESS ((uint32_t)(SIMU_EEPROM_SPACE_OFFSET))
/* Pages 0 and 1 base and end addresses */
#define PAGE0_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS))
diff --git a/platform/vendor_bsp/LN/ln882x/src/utils/gbk_to_unicode.c b/platform/vendor_bsp/LN/ln882x/src/utils/gbk_to_unicode.c
index 2b359ffa..19c003c8 100644
--- a/platform/vendor_bsp/LN/ln882x/src/utils/gbk_to_unicode.c
+++ b/platform/vendor_bsp/LN/ln882x/src/utils/gbk_to_unicode.c
@@ -3,7 +3,14 @@
#include "utils/debug/art_assert.h"
#include "utils/gbk_to_unicode.h"
#include "utils/debug/log.h"
-
+#if WIFI_TRACK
+static const unsigned short table_GBK_to_UCS2[][2] = {
+ {0,0},
+};
+static const unsigned short table_BIG5_to_UCS2[][2] = {
+ {0,0},
+};
+#else
static const unsigned short table_GBK_to_UCS2[][2] = {
#if ZH_CN_WHOLE_SET_SUPPORT
{0xD2BB, 0X4E00}, //{0xE4, 0xB8, 0x80}, //一
@@ -6771,3498 +6778,3498 @@ static const unsigned short table_GBK_to_UCS2[][2] = {
{0xD9DF, 0X9FA0}, //{0xE9, 0xBE, 0xA0}, //é¾
#else
{0xD2BB, 0x4E00}, //{0xE4, 0xB8, 0x80}, // Ò»
- {0xB6A1, 0x4E01}, //{0xE4, 0xB8, 0x81}, // ¶¡
- {0xC6DF, 0x4E03}, //{0xE4, 0xB8, 0x83}, // Æß
- {0xCDF2, 0x4E07}, //{0xE4, 0xB8, 0x87}, // Íò
- {0xD5C9, 0x4E08}, //{0xE4, 0xB8, 0x88}, // ÕÉ
- {0xC8FD, 0x4E09}, //{0xE4, 0xB8, 0x89}, // Èý
- {0xC9CF, 0x4E0A}, //{0xE4, 0xB8, 0x8A}, // ÉÏ
- {0xCFC2, 0x4E0B}, //{0xE4, 0xB8, 0x8B}, // ÏÂ
- {0xB2BB, 0x4E0D}, //{0xE4, 0xB8, 0x8D}, // ²»
- {0xD3EB, 0x4E0E}, //{0xE4, 0xB8, 0x8E}, // Óë
+ {0xB6A1, 0x4E01}, //{0xE4, 0xB8, 0x81}, // ��
+ {0xC6DF, 0x4E03}, //{0xE4, 0xB8, 0x83}, // ��
+ {0xCDF2, 0x4E07}, //{0xE4, 0xB8, 0x87}, // ��
+ {0xD5C9, 0x4E08}, //{0xE4, 0xB8, 0x88}, // ��
+ {0xC8FD, 0x4E09}, //{0xE4, 0xB8, 0x89}, // ��
+ {0xC9CF, 0x4E0A}, //{0xE4, 0xB8, 0x8A}, // ��
+ {0xCFC2, 0x4E0B}, //{0xE4, 0xB8, 0x8B}, // ��
+ {0xB2BB, 0x4E0D}, //{0xE4, 0xB8, 0x8D}, // ��
+ {0xD3EB, 0x4E0E}, //{0xE4, 0xB8, 0x8E}, // ��
{0xD8A4, 0x4E10}, //{0xE4, 0xB8, 0x90}, // ؤ
- {0xB3F3, 0x4E11}, //{0xE4, 0xB8, 0x91}, // ³ó
+ {0xB3F3, 0x4E11}, //{0xE4, 0xB8, 0x91}, // ��
{0xD7A8, 0x4E13}, //{0xE4, 0xB8, 0x93}, // ר
- {0xC7D2, 0x4E14}, //{0xE4, 0xB8, 0x94}, // ÇÒ
- {0xCAC0, 0x4E16}, //{0xE4, 0xB8, 0x96}, // ÊÀ
- {0xC7F0, 0x4E18}, //{0xE4, 0xB8, 0x98}, // Çð
- {0xB1FB, 0x4E19}, //{0xE4, 0xB8, 0x99}, // ±û
+ {0xC7D2, 0x4E14}, //{0xE4, 0xB8, 0x94}, // ��
+ {0xCAC0, 0x4E16}, //{0xE4, 0xB8, 0x96}, // ��
+ {0xC7F0, 0x4E18}, //{0xE4, 0xB8, 0x98}, // ��
+ {0xB1FB, 0x4E19}, //{0xE4, 0xB8, 0x99}, // ��
{0xD2B5, 0x4E1A}, //{0xE4, 0xB8, 0x9A}, // Òµ
- {0xB4D4, 0x4E1B}, //{0xE4, 0xB8, 0x9B}, // ´Ô
- {0xB6AB, 0x4E1C}, //{0xE4, 0xB8, 0x9C}, // ¶«
+ {0xB4D4, 0x4E1B}, //{0xE4, 0xB8, 0x9B}, // ��
+ {0xB6AB, 0x4E1C}, //{0xE4, 0xB8, 0x9C}, // ��
{0xCBBF, 0x4E1D}, //{0xE4, 0xB8, 0x9D}, // Ë¿
- {0xB6AA, 0x4E22}, //{0xE4, 0xB8, 0xA2}, // ¶ª
- {0xC1BD, 0x4E24}, //{0xE4, 0xB8, 0xA4}, // Á½
- {0xD1CF, 0x4E25}, //{0xE4, 0xB8, 0xA5}, // ÑÏ
+ {0xB6AA, 0x4E22}, //{0xE4, 0xB8, 0xA2}, // ��
+ {0xC1BD, 0x4E24}, //{0xE4, 0xB8, 0xA4}, // }
+ {0xD1CF, 0x4E25}, //{0xE4, 0xB8, 0xA5}, // ��
{0xC9A5, 0x4E27}, //{0xE4, 0xB8, 0xA7}, // ɥ
- {0xB8F6, 0x4E2A}, //{0xE4, 0xB8, 0xAA}, // ¸ö
- {0xD6D0, 0x4E2D}, //{0xE4, 0xB8, 0xAD}, // ÖÐ
- {0xB7E1, 0x4E30}, //{0xE4, 0xB8, 0xB0}, // ·á
- {0xB4AE, 0x4E32}, //{0xE4, 0xB8, 0xB2}, // ´®
- {0xC1D9, 0x4E34}, //{0xE4, 0xB8, 0xB4}, // ÁÙ
- {0xCDE8, 0x4E38}, //{0xE4, 0xB8, 0xB8}, // Íè
- {0xB5A4, 0x4E39}, //{0xE4, 0xB8, 0xB9}, // µ¤
+ {0xB8F6, 0x4E2A}, //{0xE4, 0xB8, 0xAA}, // ��
+ {0xD6D0, 0x4E2D}, //{0xE4, 0xB8, 0xAD}, // ��
+ {0xB7E1, 0x4E30}, //{0xE4, 0xB8, 0xB0}, // ��
+ {0xB4AE, 0x4E32}, //{0xE4, 0xB8, 0xB2}, // ��
+ {0xC1D9, 0x4E34}, //{0xE4, 0xB8, 0xB4}, // ��
+ {0xCDE8, 0x4E38}, //{0xE4, 0xB8, 0xB8}, // ��
+ {0xB5A4, 0x4E39}, //{0xE4, 0xB8, 0xB9}, // ��
{0xCEAA, 0x4E3A}, //{0xE4, 0xB8, 0xBA}, // Ϊ
- {0xD6F7, 0x4E3B}, //{0xE4, 0xB8, 0xBB}, // Ö÷
- {0xC0F6, 0x4E3D}, //{0xE4, 0xB8, 0xBD}, // Àö
- {0xBED9, 0x4E3E}, //{0xE4, 0xB8, 0xBE}, // ¾Ù
- {0xC4CB, 0x4E43}, //{0xE4, 0xB9, 0x83}, // ÄË
- {0xBEC3, 0x4E45}, //{0xE4, 0xB9, 0x85}, // ¾Ã
+ {0xD6F7, 0x4E3B}, //{0xE4, 0xB8, 0xBB}, // ��
+ {0xC0F6, 0x4E3D}, //{0xE4, 0xB8, 0xBD}, // ��
+ {0xBED9, 0x4E3E}, //{0xE4, 0xB8, 0xBE}, // ��
+ {0xC4CB, 0x4E43}, //{0xE4, 0xB9, 0x83}, // ��
+ {0xBEC3, 0x4E45}, //{0xE4, 0xB9, 0x85}, // ��
{0xC3B4, 0x4E48}, //{0xE4, 0xB9, 0x88}, // ô
- {0xD2E5, 0x4E49}, //{0xE4, 0xB9, 0x89}, // Òå
+ {0xD2E5, 0x4E49}, //{0xE4, 0xB9, 0x89}, // ��
{0xD6AE, 0x4E4B}, //{0xE4, 0xB9, 0x8B}, // Ö®
- {0xCEDA, 0x4E4C}, //{0xE4, 0xB9, 0x8C}, // ÎÚ
+ {0xCEDA, 0x4E4C}, //{0xE4, 0xB9, 0x8C}, // ��
{0xD5A7, 0x4E4D}, //{0xE4, 0xB9, 0x8D}, // Õ§
- {0xBAF5, 0x4E4E}, //{0xE4, 0xB9, 0x8E}, // ºõ
- {0xB7A6, 0x4E4F}, //{0xE4, 0xB9, 0x8F}, // ·¦
- {0xC0D6, 0x4E50}, //{0xE4, 0xB9, 0x90}, // ÀÖ
+ {0xBAF5, 0x4E4E}, //{0xE4, 0xB9, 0x8E}, // ��
+ {0xB7A6, 0x4E4F}, //{0xE4, 0xB9, 0x8F}, // ��
+ {0xC0D6, 0x4E50}, //{0xE4, 0xB9, 0x90}, // ��
{0xC6B9, 0x4E52}, //{0xE4, 0xB9, 0x92}, // ƹ
- {0xC5D2, 0x4E53}, //{0xE4, 0xB9, 0x93}, // ÅÒ
- {0xC7C7, 0x4E54}, //{0xE4, 0xB9, 0x94}, // ÇÇ
- {0xB9D4, 0x4E56}, //{0xE4, 0xB9, 0x96}, // ¹Ô
- {0xB3CB, 0x4E58}, //{0xE4, 0xB9, 0x98}, // ³Ë
- {0xD2D2, 0x4E59}, //{0xE4, 0xB9, 0x99}, // ÒÒ
- {0xBEC5, 0x4E5D}, //{0xE4, 0xB9, 0x9D}, // ¾Å
- {0xC6F2, 0x4E5E}, //{0xE4, 0xB9, 0x9E}, // Æò
+ {0xC5D2, 0x4E53}, //{0xE4, 0xB9, 0x93}, // ��
+ {0xC7C7, 0x4E54}, //{0xE4, 0xB9, 0x94}, // ��
+ {0xB9D4, 0x4E56}, //{0xE4, 0xB9, 0x96}, // ��
+ {0xB3CB, 0x4E58}, //{0xE4, 0xB9, 0x98}, // ��
+ {0xD2D2, 0x4E59}, //{0xE4, 0xB9, 0x99}, // ��
+ {0xBEC5, 0x4E5D}, //{0xE4, 0xB9, 0x9D}, // ��
+ {0xC6F2, 0x4E5E}, //{0xE4, 0xB9, 0x9E}, // ��
{0xD2B2, 0x4E5F}, //{0xE4, 0xB9, 0x9F}, // Ò²
{0xCFB0, 0x4E60}, //{0xE4, 0xB9, 0xA0}, // ϰ
- {0xCFE7, 0x4E61}, //{0xE4, 0xB9, 0xA1}, // Ïç
- {0xCAE9, 0x4E66}, //{0xE4, 0xB9, 0xA6}, // Êé
- {0xC2F2, 0x4E70}, //{0xE4, 0xB9, 0xB0}, // Âò
- {0xC2D2, 0x4E71}, //{0xE4, 0xB9, 0xB1}, // ÂÒ
- {0xC8E9, 0x4E73}, //{0xE4, 0xB9, 0xB3}, // Èé
- {0xC1CB, 0x4E86}, //{0xE4, 0xBA, 0x86}, // ÁË
- {0xD3E8, 0x4E88}, //{0xE4, 0xBA, 0x88}, // Óè
- {0xD5F9, 0x4E89}, //{0xE4, 0xBA, 0x89}, // Õù
- {0xCAC2, 0x4E8B}, //{0xE4, 0xBA, 0x8B}, // ÊÂ
- {0xB6FE, 0x4E8C}, //{0xE4, 0xBA, 0x8C}, // ¶þ
- {0xD3DA, 0x4E8E}, //{0xE4, 0xBA, 0x8E}, // ÓÚ
- {0xBFF7, 0x4E8F}, //{0xE4, 0xBA, 0x8F}, // ¿÷
- {0xD4C6, 0x4E91}, //{0xE4, 0xBA, 0x91}, // ÔÆ
- {0xBBA5, 0x4E92}, //{0xE4, 0xBA, 0x92}, // ȴ
- {0xCEE5, 0x4E94}, //{0xE4, 0xBA, 0x94}, // Îå
- {0xBEAE, 0x4E95}, //{0xE4, 0xBA, 0x95}, // ¾®
- {0xD1C7, 0x4E9A}, //{0xE4, 0xBA, 0x9A}, // ÑÇ
+ {0xCFE7, 0x4E61}, //{0xE4, 0xB9, 0xA1}, // ��
+ {0xCAE9, 0x4E66}, //{0xE4, 0xB9, 0xA6}, // ��
+ {0xC2F2, 0x4E70}, //{0xE4, 0xB9, 0xB0}, // ��
+ {0xC2D2, 0x4E71}, //{0xE4, 0xB9, 0xB1}, // ��
+ {0xC8E9, 0x4E73}, //{0xE4, 0xB9, 0xB3}, // ��
+ {0xC1CB, 0x4E86}, //{0xE4, 0xBA, 0x86}, // ��
+ {0xD3E8, 0x4E88}, //{0xE4, 0xBA, 0x88}, // ��
+ {0xD5F9, 0x4E89}, //{0xE4, 0xBA, 0x89}, // ��
+ {0xCAC2, 0x4E8B}, //{0xE4, 0xBA, 0x8B}, // ��
+ {0xB6FE, 0x4E8C}, //{0xE4, 0xBA, 0x8C}, // ��
+ {0xD3DA, 0x4E8E}, //{0xE4, 0xBA, 0x8E}, // ��
+ {0xBFF7, 0x4E8F}, //{0xE4, 0xBA, 0x8F}, // ��
+ {0xD4C6, 0x4E91}, //{0xE4, 0xBA, 0x91}, // ��
+ {0xBBA5, 0x4E92}, //{0xE4, 0xBA, 0x92}, // ��
+ {0xCEE5, 0x4E94}, //{0xE4, 0xBA, 0x94}, // ��
+ {0xBEAE, 0x4E95}, //{0xE4, 0xBA, 0x95}, // ��
+ {0xD1C7, 0x4E9A}, //{0xE4, 0xBA, 0x9A}, // ��
{0xD0A9, 0x4E9B}, //{0xE4, 0xBA, 0x9B}, // Щ
- {0xCDF6, 0x4EA1}, //{0xE4, 0xBA, 0xA1}, // Íö
- {0xBDBB, 0x4EA4}, //{0xE4, 0xBA, 0xA4}, // ½»
- {0xBAA5, 0x4EA5}, //{0xE4, 0xBA, 0xA5}, // º¥
- {0xD2E0, 0x4EA6}, //{0xE4, 0xBA, 0xA6}, // Òà
- {0xB2FA, 0x4EA7}, //{0xE4, 0xBA, 0xA7}, // ²ú
+ {0xCDF6, 0x4EA1}, //{0xE4, 0xBA, 0xA1}, // ��
+ {0xBDBB, 0x4EA4}, //{0xE4, 0xBA, 0xA4}, // ��
+ {0xBAA5, 0x4EA5}, //{0xE4, 0xBA, 0xA5}, // ��
+ {0xD2E0, 0x4EA6}, //{0xE4, 0xBA, 0xA6}, // ��
+ {0xB2FA, 0x4EA7}, //{0xE4, 0xBA, 0xA7}, // ��
{0xC4B6, 0x4EA9}, //{0xE4, 0xBA, 0xA9}, // Ķ
- {0xCFED, 0x4EAB}, //{0xE4, 0xBA, 0xAB}, // Ïí
- {0xBEA9, 0x4EAC}, //{0xE4, 0xBA, 0xAC}, // ¾©
+ {0xCFED, 0x4EAB}, //{0xE4, 0xBA, 0xAB}, // ��
+ {0xBEA9, 0x4EAC}, //{0xE4, 0xBA, 0xAC}, // ��
{0xCDA4, 0x4EAD}, //{0xE4, 0xBA, 0xAD}, // ͤ
- {0xC1C1, 0x4EAE}, //{0xE4, 0xBA, 0xAE}, // ÁÁ
- {0xC7D7, 0x4EB2}, //{0xE4, 0xBA, 0xB2}, // Ç×
- {0xC8CB, 0x4EBA}, //{0xE4, 0xBA, 0xBA}, // ÈË
- {0xD2DA, 0x4EBF}, //{0xE4, 0xBA, 0xBF}, // ÒÚ
+ {0xC1C1, 0x4EAE}, //{0xE4, 0xBA, 0xAE}, // ��
+ {0xC7D7, 0x4EB2}, //{0xE4, 0xBA, 0xB2}, // ��
+ {0xC8CB, 0x4EBA}, //{0xE4, 0xBA, 0xBA}, // ��
+ {0xD2DA, 0x4EBF}, //{0xE4, 0xBA, 0xBF}, // ��
{0xCAB2, 0x4EC0}, //{0xE4, 0xBB, 0x80}, // ʲ
- {0xC8CA, 0x4EC1}, //{0xE4, 0xBB, 0x81}, // ÈÊ
- {0xBDF6, 0x4EC5}, //{0xE4, 0xBB, 0x85}, // ½ö
- {0xC6CD, 0x4EC6}, //{0xE4, 0xBB, 0x86}, // ÆÍ
- {0xB3F0, 0x4EC7}, //{0xE4, 0xBB, 0x87}, // ³ð
- {0xBDF1, 0x4ECA}, //{0xE4, 0xBB, 0x8A}, // ½ñ
- {0xBDE9, 0x4ECB}, //{0xE4, 0xBB, 0x8B}, // ½é
- {0xC8D4, 0x4ECD}, //{0xE4, 0xBB, 0x8D}, // ÈÔ
- {0xB4D3, 0x4ECE}, //{0xE4, 0xBB, 0x8E}, // ´Ó
- {0xC2D8, 0x4ED1}, //{0xE4, 0xBB, 0x91}, // ÂØ
- {0xB2D6, 0x4ED3}, //{0xE4, 0xBB, 0x93}, // ²Ö
- {0xD7D0, 0x4ED4}, //{0xE4, 0xBB, 0x94}, // ×Ð
- {0xCBFB, 0x4ED6}, //{0xE4, 0xBB, 0x96}, // Ëû
- {0xD5CC, 0x4ED7}, //{0xE4, 0xBB, 0x97}, // ÕÌ
- {0xB8B6, 0x4ED8}, //{0xE4, 0xBB, 0x98}, // ¸¶
- {0xCFC9, 0x4ED9}, //{0xE4, 0xBB, 0x99}, // ÏÉ
- {0xB4FA, 0x4EE3}, //{0xE4, 0xBB, 0xA3}, // ´ú
- {0xC1EE, 0x4EE4}, //{0xE4, 0xBB, 0xA4}, // Áî
- {0xD2D4, 0x4EE5}, //{0xE4, 0xBB, 0xA5}, // ÒÔ
- {0xD2C7, 0x4EEA}, //{0xE4, 0xBB, 0xAA}, // ÒÇ
- {0xC3C7, 0x4EEC}, //{0xE4, 0xBB, 0xAC}, // ÃÇ
- {0xD1F6, 0x4EF0}, //{0xE4, 0xBB, 0xB0}, // Ñö
- {0xD6D9, 0x4EF2}, //{0xE4, 0xBB, 0xB2}, // ÖÙ
- {0xBCFE, 0x4EF6}, //{0xE4, 0xBB, 0xB6}, // ¼þ
- {0xBCDB, 0x4EF7}, //{0xE4, 0xBB, 0xB7}, // ¼Û
- {0xC8CE, 0x4EFB}, //{0xE4, 0xBB, 0xBB}, // ÈÎ
- {0xB7DD, 0x4EFD}, //{0xE4, 0xBB, 0xBD}, // ·Ý
- {0xB7C2, 0x4EFF}, //{0xE4, 0xBB, 0xBF}, // ·Â
- {0xC6F3, 0x4F01}, //{0xE4, 0xBC, 0x81}, // Æó
- {0xD2C1, 0x4F0A}, //{0xE4, 0xBC, 0x8A}, // ÒÁ
- {0xCEE9, 0x4F0D}, //{0xE4, 0xBC, 0x8D}, // Îé
- {0xB7FC, 0x4F0F}, //{0xE4, 0xBC, 0x8F}, // ·ü
- {0xB7A5, 0x4F10}, //{0xE4, 0xBC, 0x90}, // ·¥
- {0xD0DD, 0x4F11}, //{0xE4, 0xBC, 0x91}, // ÐÝ
- {0xD6DA, 0x4F17}, //{0xE4, 0xBC, 0x97}, // ÖÚ
- {0xD3C5, 0x4F18}, //{0xE4, 0xBC, 0x98}, // ÓÅ
- {0xBBEF, 0x4F19}, //{0xE4, 0xBC, 0x99}, // ȕ
- {0xBBE1, 0x4F1A}, //{0xE4, 0xBC, 0x9A}, // ȇ
+ {0xC8CA, 0x4EC1}, //{0xE4, 0xBB, 0x81}, // ��
+ {0xBDF6, 0x4EC5}, //{0xE4, 0xBB, 0x85}, // ��
+ {0xC6CD, 0x4EC6}, //{0xE4, 0xBB, 0x86}, // ��
+ {0xB3F0, 0x4EC7}, //{0xE4, 0xBB, 0x87}, // ��
+ {0xBDF1, 0x4ECA}, //{0xE4, 0xBB, 0x8A}, // ��
+ {0xBDE9, 0x4ECB}, //{0xE4, 0xBB, 0x8B}, // ��
+ {0xC8D4, 0x4ECD}, //{0xE4, 0xBB, 0x8D}, // ��
+ {0xB4D3, 0x4ECE}, //{0xE4, 0xBB, 0x8E}, // ��
+ {0xC2D8, 0x4ED1}, //{0xE4, 0xBB, 0x91}, // ��
+ {0xB2D6, 0x4ED3}, //{0xE4, 0xBB, 0x93}, // ��
+ {0xD7D0, 0x4ED4}, //{0xE4, 0xBB, 0x94}, // ��
+ {0xCBFB, 0x4ED6}, //{0xE4, 0xBB, 0x96}, // ��
+ {0xD5CC, 0x4ED7}, //{0xE4, 0xBB, 0x97}, // ��
+ {0xB8B6, 0x4ED8}, //{0xE4, 0xBB, 0x98}, // ��
+ {0xCFC9, 0x4ED9}, //{0xE4, 0xBB, 0x99}, // ��
+ {0xB4FA, 0x4EE3}, //{0xE4, 0xBB, 0xA3}, // ��
+ {0xC1EE, 0x4EE4}, //{0xE4, 0xBB, 0xA4}, // ��
+ {0xD2D4, 0x4EE5}, //{0xE4, 0xBB, 0xA5}, // ��
+ {0xD2C7, 0x4EEA}, //{0xE4, 0xBB, 0xAA}, // ��
+ {0xC3C7, 0x4EEC}, //{0xE4, 0xBB, 0xAC}, // ��
+ {0xD1F6, 0x4EF0}, //{0xE4, 0xBB, 0xB0}, // ��
+ {0xD6D9, 0x4EF2}, //{0xE4, 0xBB, 0xB2}, // ��
+ {0xBCFE, 0x4EF6}, //{0xE4, 0xBB, 0xB6}, // ��
+ {0xBCDB, 0x4EF7}, //{0xE4, 0xBB, 0xB7}, // ��
+ {0xC8CE, 0x4EFB}, //{0xE4, 0xBB, 0xBB}, // ��
+ {0xB7DD, 0x4EFD}, //{0xE4, 0xBB, 0xBD}, // ��
+ {0xB7C2, 0x4EFF}, //{0xE4, 0xBB, 0xBF}, // ��
+ {0xC6F3, 0x4F01}, //{0xE4, 0xBC, 0x81}, // ��
+ {0xD2C1, 0x4F0A}, //{0xE4, 0xBC, 0x8A}, // ��
+ {0xCEE9, 0x4F0D}, //{0xE4, 0xBC, 0x8D}, // ��
+ {0xB7FC, 0x4F0F}, //{0xE4, 0xBC, 0x8F}, // ��
+ {0xB7A5, 0x4F10}, //{0xE4, 0xBC, 0x90}, // ��
+ {0xD0DD, 0x4F11}, //{0xE4, 0xBC, 0x91}, // ��
+ {0xD6DA, 0x4F17}, //{0xE4, 0xBC, 0x97}, // ��
+ {0xD3C5, 0x4F18}, //{0xE4, 0xBC, 0x98}, // ��
+ {0xBBEF, 0x4F19}, //{0xE4, 0xBC, 0x99}, // ��
+ {0xBBE1, 0x4F1A}, //{0xE4, 0xBC, 0x9A}, // ��
{0xC9A1, 0x4F1E}, //{0xE4, 0xBC, 0x9E}, // É¡
{0xCEB0, 0x4F1F}, //{0xE4, 0xBC, 0x9F}, // ΰ
- {0xB4AB, 0x4F20}, //{0xE4, 0xBC, 0xA0}, // ´«
- {0xC9CB, 0x4F24}, //{0xE4, 0xBC, 0xA4}, // ÉË
- {0xC2D7, 0x4F26}, //{0xE4, 0xBC, 0xA6}, // Â×
+ {0xB4AB, 0x4F20}, //{0xE4, 0xBC, 0xA0}, // ��
+ {0xC9CB, 0x4F24}, //{0xE4, 0xBC, 0xA4}, // ��
+ {0xC2D7, 0x4F26}, //{0xE4, 0xBC, 0xA6}, // ��
{0xCEB1, 0x4F2A}, //{0xE4, 0xBC, 0xAA}, // α
- {0xB2AE, 0x4F2F}, //{0xE4, 0xBC, 0xAF}, // ²®
- {0xB9C0, 0x4F30}, //{0xE4, 0xBC, 0xB0}, // ¹À
- {0xB0E9, 0x4F34}, //{0xE4, 0xBC, 0xB4}, // °é
- {0xC1E6, 0x4F36}, //{0xE4, 0xBC, 0xB6}, // Áæ
- {0xC9EC, 0x4F38}, //{0xE4, 0xBC, 0xB8}, // Éì
- {0xCBC5, 0x4F3A}, //{0xE4, 0xBC, 0xBA}, // ËÅ
- {0xCBC6, 0x4F3C}, //{0xE4, 0xBC, 0xBC}, // ËÆ
- {0xB5E8, 0x4F43}, //{0xE4, 0xBD, 0x83}, // µè
- {0xB5AB, 0x4F46}, //{0xE4, 0xBD, 0x86}, // µ«
+ {0xB2AE, 0x4F2F}, //{0xE4, 0xBC, 0xAF}, // ��
+ {0xB9C0, 0x4F30}, //{0xE4, 0xBC, 0xB0}, // ��
+ {0xB0E9, 0x4F34}, //{0xE4, 0xBC, 0xB4}, // ��
+ {0xC1E6, 0x4F36}, //{0xE4, 0xBC, 0xB6}, // ��
+ {0xC9EC, 0x4F38}, //{0xE4, 0xBC, 0xB8}, // ��
+ {0xCBC5, 0x4F3A}, //{0xE4, 0xBC, 0xBA}, // ��
+ {0xCBC6, 0x4F3C}, //{0xE4, 0xBC, 0xBC}, // ��
+ {0xB5E8, 0x4F43}, //{0xE4, 0xBD, 0x83}, // ��
+ {0xB5AB, 0x4F46}, //{0xE4, 0xBD, 0x86}, // ��
{0xCEBB, 0x4F4D}, //{0xE4, 0xBD, 0x8D}, // λ
- {0xB5CD, 0x4F4E}, //{0xE4, 0xBD, 0x8E}, // µÍ
+ {0xB5CD, 0x4F4E}, //{0xE4, 0xBD, 0x8E}, // ��
{0xD7A1, 0x4F4F}, //{0xE4, 0xBD, 0x8F}, // ס
- {0xD3D3, 0x4F51}, //{0xE4, 0xBD, 0x91}, // ÓÓ
- {0xCCE5, 0x4F53}, //{0xE4, 0xBD, 0x93}, // Ìå
- {0xBACE, 0x4F55}, //{0xE4, 0xBD, 0x95}, // ºÎ
- {0xD3E0, 0x4F59}, //{0xE4, 0xBD, 0x99}, // Óà
- {0xB7F0, 0x4F5B}, //{0xE4, 0xBD, 0x9B}, // ·ð
- {0xD7F7, 0x4F5C}, //{0xE4, 0xBD, 0x9C}, // ×÷
- {0xC4E3, 0x4F60}, //{0xE4, 0xBD, 0xA0}, // Äã
+ {0xD3D3, 0x4F51}, //{0xE4, 0xBD, 0x91}, // ��
+ {0xCCE5, 0x4F53}, //{0xE4, 0xBD, 0x93}, // ��
+ {0xBACE, 0x4F55}, //{0xE4, 0xBD, 0x95}, // ��
+ {0xD3E0, 0x4F59}, //{0xE4, 0xBD, 0x99}, // ��
+ {0xB7F0, 0x4F5B}, //{0xE4, 0xBD, 0x9B}, // ��
+ {0xD7F7, 0x4F5C}, //{0xE4, 0xBD, 0x9C}, // ��
+ {0xC4E3, 0x4F60}, //{0xE4, 0xBD, 0xA0}, // ��
{0xD3B6, 0x4F63}, //{0xE4, 0xBD, 0xA3}, // Ó¶
- {0xC5E5, 0x4F69}, //{0xE4, 0xBD, 0xA9}, // Åå
- {0xBCD1, 0x4F73}, //{0xE4, 0xBD, 0xB3}, // ¼Ñ
+ {0xC5E5, 0x4F69}, //{0xE4, 0xBD, 0xA9}, // ��
+ {0xBCD1, 0x4F73}, //{0xE4, 0xBD, 0xB3}, // ��
{0xCAB9, 0x4F7F}, //{0xE4, 0xBD, 0xBF}, // ʹ
{0xD6B6, 0x4F84}, //{0xE4, 0xBE, 0x84}, // Ö¶
- {0xB3DE, 0x4F88}, //{0xE4, 0xBE, 0x88}, // ³Þ
- {0xC0FD, 0x4F8B}, //{0xE4, 0xBE, 0x8B}, // Àý
- {0xCACC, 0x4F8D}, //{0xE4, 0xBE, 0x8D}, // ÊÌ
- {0xB9A9, 0x4F9B}, //{0xE4, 0xBE, 0x9B}, // ¹©
- {0xD2C0, 0x4F9D}, //{0xE4, 0xBE, 0x9D}, // ÒÀ
- {0xCFC0, 0x4FA0}, //{0xE4, 0xBE, 0xA0}, // ÏÀ
- {0xC2C2, 0x4FA3}, //{0xE4, 0xBE, 0xA3}, // ÂÂ
- {0xBDC4, 0x4FA5}, //{0xE4, 0xBE, 0xA5}, // ½Ä
- {0xD5EC, 0x4FA6}, //{0xE4, 0xBE, 0xA6}, // Õì
- {0xB2E0, 0x4FA7}, //{0xE4, 0xBE, 0xA7}, // ²à
- {0xC7C8, 0x4FA8}, //{0xE4, 0xBE, 0xA8}, // ÇÈ
- {0xCEEA, 0x4FAE}, //{0xE4, 0xBE, 0xAE}, // Îê
- {0xBAEE, 0x4FAF}, //{0xE4, 0xBE, 0xAF}, // ºî
- {0xC7D6, 0x4FB5}, //{0xE4, 0xBE, 0xB5}, // ÇÖ
- {0xB1E3, 0x4FBF}, //{0xE4, 0xBE, 0xBF}, // ±ã
- {0xB4D9, 0x4FC3}, //{0xE4, 0xBF, 0x83}, // ´Ù
- {0xB6ED, 0x4FC4}, //{0xE4, 0xBF, 0x84}, // ¶í
- {0xBFA1, 0x4FCA}, //{0xE4, 0xBF, 0x8A}, // ¿¡
- {0xC7CE, 0x4FCF}, //{0xE4, 0xBF, 0x8F}, // ÇÎ
- {0xC0FE, 0x4FD0}, //{0xE4, 0xBF, 0x90}, // Àþ
- {0xCBD7, 0x4FD7}, //{0xE4, 0xBF, 0x97}, // Ë×
- {0xB7FD, 0x4FD8}, //{0xE4, 0xBF, 0x98}, // ·ý
- {0xB1A3, 0x4FDD}, //{0xE4, 0xBF, 0x9D}, // ±£
- {0xD0C5, 0x4FE1}, //{0xE4, 0xBF, 0xA1}, // ÐÅ
- {0xC1A9, 0x4FE9}, //{0xE4, 0xBF, 0xA9}, // Á©
- {0xBCF3, 0x4FED}, //{0xE4, 0xBF, 0xAD}, // ¼ó
- {0xD0DE, 0x4FEE}, //{0xE4, 0xBF, 0xAE}, // ÐÞ
- {0xB8A9, 0x4FEF}, //{0xE4, 0xBF, 0xAF}, // ¸©
- {0xBEE3, 0x4FF1}, //{0xE4, 0xBF, 0xB1}, // ¾ã
- {0xB0B3, 0x4FFA}, //{0xE4, 0xBF, 0xBA}, // °³
- {0xB1B6, 0x500D}, //{0xE5, 0x80, 0x8D}, // ±¶
- {0xB5B9, 0x5012}, //{0xE5, 0x80, 0x92}, // µ¹
- {0xBEF3, 0x5014}, //{0xE5, 0x80, 0x94}, // ¾ó
- {0xCCC8, 0x5018}, //{0xE5, 0x80, 0x98}, // ÌÈ
- {0xBAF2, 0x5019}, //{0xE5, 0x80, 0x99}, // ºò
- {0xD2D0, 0x501A}, //{0xE5, 0x80, 0x9A}, // ÒÐ
- {0xBDE8, 0x501F}, //{0xE5, 0x80, 0x9F}, // ½è
- {0xB3AB, 0x5021}, //{0xE5, 0x80, 0xA1}, // ³«
- {0xBEEB, 0x5026}, //{0xE5, 0x80, 0xA6}, // ¾ë
+ {0xB3DE, 0x4F88}, //{0xE4, 0xBE, 0x88}, // ��
+ {0xC0FD, 0x4F8B}, //{0xE4, 0xBE, 0x8B}, // ��
+ {0xCACC, 0x4F8D}, //{0xE4, 0xBE, 0x8D}, // ��
+ {0xB9A9, 0x4F9B}, //{0xE4, 0xBE, 0x9B}, // ��
+ {0xD2C0, 0x4F9D}, //{0xE4, 0xBE, 0x9D}, // ��
+ {0xCFC0, 0x4FA0}, //{0xE4, 0xBE, 0xA0}, // ��
+ {0xC2C2, 0x4FA3}, //{0xE4, 0xBE, 0xA3}, // ��
+ {0xBDC4, 0x4FA5}, //{0xE4, 0xBE, 0xA5}, // ��
+ {0xD5EC, 0x4FA6}, //{0xE4, 0xBE, 0xA6}, // ��
+ {0xB2E0, 0x4FA7}, //{0xE4, 0xBE, 0xA7}, // ��
+ {0xC7C8, 0x4FA8}, //{0xE4, 0xBE, 0xA8}, // ��
+ {0xCEEA, 0x4FAE}, //{0xE4, 0xBE, 0xAE}, // ��
+ {0xBAEE, 0x4FAF}, //{0xE4, 0xBE, 0xAF}, // ��
+ {0xC7D6, 0x4FB5}, //{0xE4, 0xBE, 0xB5}, // ��
+ {0xB1E3, 0x4FBF}, //{0xE4, 0xBE, 0xBF}, // ��
+ {0xB4D9, 0x4FC3}, //{0xE4, 0xBF, 0x83}, // ��
+ {0xB6ED, 0x4FC4}, //{0xE4, 0xBF, 0x84}, // ��
+ {0xBFA1, 0x4FCA}, //{0xE4, 0xBF, 0x8A}, // ��
+ {0xC7CE, 0x4FCF}, //{0xE4, 0xBF, 0x8F}, // ��
+ {0xC0FE, 0x4FD0}, //{0xE4, 0xBF, 0x90}, // ��
+ {0xCBD7, 0x4FD7}, //{0xE4, 0xBF, 0x97}, // ��
+ {0xB7FD, 0x4FD8}, //{0xE4, 0xBF, 0x98}, // ��
+ {0xB1A3, 0x4FDD}, //{0xE4, 0xBF, 0x9D}, // ��
+ {0xD0C5, 0x4FE1}, //{0xE4, 0xBF, 0xA1}, // ��
+ {0xC1A9, 0x4FE9}, //{0xE4, 0xBF, 0xA9}, // i
+ {0xBCF3, 0x4FED}, //{0xE4, 0xBF, 0xAD}, // ��
+ {0xD0DE, 0x4FEE}, //{0xE4, 0xBF, 0xAE}, // ��
+ {0xB8A9, 0x4FEF}, //{0xE4, 0xBF, 0xAF}, // ��
+ {0xBEE3, 0x4FF1}, //{0xE4, 0xBF, 0xB1}, // ��
+ {0xB0B3, 0x4FFA}, //{0xE4, 0xBF, 0xBA}, // ��
+ {0xB1B6, 0x500D}, //{0xE5, 0x80, 0x8D}, // ��
+ {0xB5B9, 0x5012}, //{0xE5, 0x80, 0x92}, // ��
+ {0xBEF3, 0x5014}, //{0xE5, 0x80, 0x94}, // ��
+ {0xCCC8, 0x5018}, //{0xE5, 0x80, 0x98}, // ��
+ {0xBAF2, 0x5019}, //{0xE5, 0x80, 0x99}, // ��
+ {0xD2D0, 0x501A}, //{0xE5, 0x80, 0x9A}, // ��
+ {0xBDE8, 0x501F}, //{0xE5, 0x80, 0x9F}, // ��
+ {0xB3AB, 0x5021}, //{0xE5, 0x80, 0xA1}, // ��
+ {0xBEEB, 0x5026}, //{0xE5, 0x80, 0xA6}, // ��
{0xD5AE, 0x503A}, //{0xE5, 0x80, 0xBA}, // Õ®
{0xD6B5, 0x503C}, //{0xE5, 0x80, 0xBC}, // Öµ
- {0xC7E3, 0x503E}, //{0xE5, 0x80, 0xBE}, // Çã
- {0xBCD9, 0x5047}, //{0xE5, 0x81, 0x87}, // ¼Ù
- {0xD9CB, 0x504E}, //{0xE5, 0x81, 0x8E}, // ÙË
+ {0xC7E3, 0x503E}, //{0xE5, 0x80, 0xBE}, // ��
+ {0xBCD9, 0x5047}, //{0xE5, 0x81, 0x87}, // ��
+ {0xD9CB, 0x504E}, //{0xE5, 0x81, 0x8E}, // ��
{0xC6AB, 0x504F}, //{0xE5, 0x81, 0x8F}, // Æ«
- {0xD7F6, 0x505A}, //{0xE5, 0x81, 0x9A}, // ×ö
+ {0xD7F6, 0x505A}, //{0xE5, 0x81, 0x9A}, // ��
{0xCDA3, 0x505C}, //{0xE5, 0x81, 0x9C}, // ͣ
- {0xBDA1, 0x5065}, //{0xE5, 0x81, 0xA5}, // ½¡
+ {0xBDA1, 0x5065}, //{0xE5, 0x81, 0xA5}, // ��
{0xC5BC, 0x5076}, //{0xE5, 0x81, 0xB6}, // ż
{0xCDB5, 0x5077}, //{0xE5, 0x81, 0xB7}, // ͵
- {0xB3A5, 0x507F}, //{0xE5, 0x81, 0xBF}, // ³¥
- {0xBFFE, 0x5080}, //{0xE5, 0x82, 0x80}, // ¿þ
- {0xB8B5, 0x5085}, //{0xE5, 0x82, 0x85}, // ¸µ
- {0xB0F8, 0x508D}, //{0xE5, 0x82, 0x8D}, // °ø
- {0xB4A2, 0x50A8}, //{0xE5, 0x82, 0xA8}, // ´¢
- {0xB4DF, 0x50AC}, //{0xE5, 0x82, 0xAC}, // ´ß
- {0xB0C1, 0x50B2}, //{0xE5, 0x82, 0xB2}, // °Á
+ {0xB3A5, 0x507F}, //{0xE5, 0x81, 0xBF}, // ��
+ {0xBFFE, 0x5080}, //{0xE5, 0x82, 0x80}, // ��
+ {0xB8B5, 0x5085}, //{0xE5, 0x82, 0x85}, // ��
+ {0xB0F8, 0x508D}, //{0xE5, 0x82, 0x8D}, // ��
+ {0xB4A2, 0x50A8}, //{0xE5, 0x82, 0xA8}, // ��
+ {0xB4DF, 0x50AC}, //{0xE5, 0x82, 0xAC}, // ��
+ {0xB0C1, 0x50B2}, //{0xE5, 0x82, 0xB2}, // ��
{0xC9B5, 0x50BB}, //{0xE5, 0x82, 0xBB}, // ɵ
- {0xCFF1, 0x50CF}, //{0xE5, 0x83, 0x8F}, // Ïñ
- {0xC1C5, 0x50DA}, //{0xE5, 0x83, 0x9A}, // ÁÅ
+ {0xCFF1, 0x50CF}, //{0xE5, 0x83, 0x8F}, // ��
+ {0xC1C5, 0x50DA}, //{0xE5, 0x83, 0x9A}, // ��
{0xC9AE, 0x50E7}, //{0xE5, 0x83, 0xA7}, // É®
- {0xBDA9, 0x50F5}, //{0xE5, 0x83, 0xB5}, // ½©
+ {0xBDA9, 0x50F5}, //{0xE5, 0x83, 0xB5}, // ��
{0xC6A7, 0x50FB}, //{0xE5, 0x83, 0xBB}, // Ƨ
- {0xC8E5, 0x5112}, //{0xE5, 0x84, 0x92}, // Èå
- {0xC0DC, 0x5121}, //{0xE5, 0x84, 0xA1}, // ÀÜ
- {0xB6F9, 0x513F}, //{0xE5, 0x84, 0xBF}, // ¶ù
- {0xD4CA, 0x5141}, //{0xE5, 0x85, 0x81}, // ÔÊ
+ {0xC8E5, 0x5112}, //{0xE5, 0x84, 0x92}, // ��
+ {0xC0DC, 0x5121}, //{0xE5, 0x84, 0xA1}, // ��
+ {0xB6F9, 0x513F}, //{0xE5, 0x84, 0xBF}, // ��
+ {0xD4CA, 0x5141}, //{0xE5, 0x85, 0x81}, // ��
{0xD4AA, 0x5143}, //{0xE5, 0x85, 0x83}, // Ôª
- {0xD0D6, 0x5144}, //{0xE5, 0x85, 0x84}, // ÐÖ
- {0xB3E4, 0x5145}, //{0xE5, 0x85, 0x85}, // ³ä
- {0xD5D7, 0x5146}, //{0xE5, 0x85, 0x86}, // Õ×
- {0xCFC8, 0x5148}, //{0xE5, 0x85, 0x88}, // ÏÈ
- {0xB9E2, 0x5149}, //{0xE5, 0x85, 0x89}, // ¹â
- {0xBFCB, 0x514B}, //{0xE5, 0x85, 0x8B}, // ¿Ë
- {0xC3E2, 0x514D}, //{0xE5, 0x85, 0x8D}, // Ãâ
- {0xB6D2, 0x5151}, //{0xE5, 0x85, 0x91}, // ¶Ò
- {0xCDC3, 0x5154}, //{0xE5, 0x85, 0x94}, // ÍÃ
- {0xB5B3, 0x515A}, //{0xE5, 0x85, 0x9A}, // µ³
- {0xB6B5, 0x515C}, //{0xE5, 0x85, 0x9C}, // ¶µ
- {0xBEA4, 0x5162}, //{0xE5, 0x85, 0xA2}, // ¾¤
- {0xC8EB, 0x5165}, //{0xE5, 0x85, 0xA5}, // Èë
+ {0xD0D6, 0x5144}, //{0xE5, 0x85, 0x84}, // ��
+ {0xB3E4, 0x5145}, //{0xE5, 0x85, 0x85}, // ��
+ {0xD5D7, 0x5146}, //{0xE5, 0x85, 0x86}, // ��
+ {0xCFC8, 0x5148}, //{0xE5, 0x85, 0x88}, // ��
+ {0xB9E2, 0x5149}, //{0xE5, 0x85, 0x89}, // ��
+ {0xBFCB, 0x514B}, //{0xE5, 0x85, 0x8B}, // ��
+ {0xC3E2, 0x514D}, //{0xE5, 0x85, 0x8D}, // ��
+ {0xB6D2, 0x5151}, //{0xE5, 0x85, 0x91}, // ��
+ {0xCDC3, 0x5154}, //{0xE5, 0x85, 0x94}, // ��
+ {0xB5B3, 0x515A}, //{0xE5, 0x85, 0x9A}, // ��
+ {0xB6B5, 0x515C}, //{0xE5, 0x85, 0x9C}, // ��
+ {0xBEA4, 0x5162}, //{0xE5, 0x85, 0xA2}, // ��
+ {0xC8EB, 0x5165}, //{0xE5, 0x85, 0xA5}, // ��
{0xC8AB, 0x5168}, //{0xE5, 0x85, 0xA8}, // È«
- {0xB0CB, 0x516B}, //{0xE5, 0x85, 0xAB}, // °Ë
- {0xB9AB, 0x516C}, //{0xE5, 0x85, 0xAC}, // ¹«
- {0xC1F9, 0x516D}, //{0xE5, 0x85, 0xAD}, // Áù
- {0xC0BC, 0x5170}, //{0xE5, 0x85, 0xB0}, // À¼
- {0xB9B2, 0x5171}, //{0xE5, 0x85, 0xB1}, // ¹²
- {0xB9D8, 0x5173}, //{0xE5, 0x85, 0xB3}, // ¹Ø
- {0xD0CB, 0x5174}, //{0xE5, 0x85, 0xB4}, // ÐË
- {0xB1F8, 0x5175}, //{0xE5, 0x85, 0xB5}, // ±ø
- {0xC6E4, 0x5176}, //{0xE5, 0x85, 0xB6}, // Æä
- {0xBEDF, 0x5177}, //{0xE5, 0x85, 0xB7}, // ¾ß
- {0xB5E4, 0x5178}, //{0xE5, 0x85, 0xB8}, // µä
- {0xD1F8, 0x517B}, //{0xE5, 0x85, 0xBB}, // Ñø
- {0xBCE6, 0x517C}, //{0xE5, 0x85, 0xBC}, // ¼æ
- {0xCADE, 0x517D}, //{0xE5, 0x85, 0xBD}, // ÊÞ
- {0xBCBD, 0x5180}, //{0xE5, 0x86, 0x80}, // ¼½
- {0xC4DA, 0x5185}, //{0xE5, 0x86, 0x85}, // ÄÚ
- {0xB8D4, 0x5188}, //{0xE5, 0x86, 0x88}, // ¸Ô
- {0xB2E1, 0x518C}, //{0xE5, 0x86, 0x8C}, // ²á
- {0xD4D9, 0x518D}, //{0xE5, 0x86, 0x8D}, // ÔÙ
+ {0xB0CB, 0x516B}, //{0xE5, 0x85, 0xAB}, // ��
+ {0xB9AB, 0x516C}, //{0xE5, 0x85, 0xAC}, // ��
+ {0xC1F9, 0x516D}, //{0xE5, 0x85, 0xAD}, // ��
+ {0xC0BC, 0x5170}, //{0xE5, 0x85, 0xB0}, // <
+ {0xB9B2, 0x5171}, //{0xE5, 0x85, 0xB1}, // ��
+ {0xB9D8, 0x5173}, //{0xE5, 0x85, 0xB3}, // ��
+ {0xD0CB, 0x5174}, //{0xE5, 0x85, 0xB4}, // ��
+ {0xB1F8, 0x5175}, //{0xE5, 0x85, 0xB5}, // ��
+ {0xC6E4, 0x5176}, //{0xE5, 0x85, 0xB6}, // ��
+ {0xBEDF, 0x5177}, //{0xE5, 0x85, 0xB7}, // ��
+ {0xB5E4, 0x5178}, //{0xE5, 0x85, 0xB8}, // ��
+ {0xD1F8, 0x517B}, //{0xE5, 0x85, 0xBB}, // ��
+ {0xBCE6, 0x517C}, //{0xE5, 0x85, 0xBC}, // ��
+ {0xCADE, 0x517D}, //{0xE5, 0x85, 0xBD}, // ��
+ {0xBCBD, 0x5180}, //{0xE5, 0x86, 0x80}, // ��
+ {0xC4DA, 0x5185}, //{0xE5, 0x86, 0x85}, // ��
+ {0xB8D4, 0x5188}, //{0xE5, 0x86, 0x88}, // ��
+ {0xB2E1, 0x518C}, //{0xE5, 0x86, 0x8C}, // ��
+ {0xD4D9, 0x518D}, //{0xE5, 0x86, 0x8D}, // ��
{0xC3B0, 0x5192}, //{0xE5, 0x86, 0x92}, // ð
- {0xC3E1, 0x5195}, //{0xE5, 0x86, 0x95}, // Ãá
- {0xC8DF, 0x5197}, //{0xE5, 0x86, 0x97}, // Èß
+ {0xC3E1, 0x5195}, //{0xE5, 0x86, 0x95}, // ��
+ {0xC8DF, 0x5197}, //{0xE5, 0x86, 0x97}, // ��
{0xD0B4, 0x5199}, //{0xE5, 0x86, 0x99}, // д
- {0xBEFC, 0x519B}, //{0xE5, 0x86, 0x9B}, // ¾ü
+ {0xBEFC, 0x519B}, //{0xE5, 0x86, 0x9B}, // ��
{0xC5A9, 0x519C}, //{0xE5, 0x86, 0x9C}, // Å©
- {0xB9DA, 0x51A0}, //{0xE5, 0x86, 0xA0}, // ¹Ú
+ {0xB9DA, 0x51A0}, //{0xE5, 0x86, 0xA0}, // ��
{0xD4A9, 0x51A4}, //{0xE5, 0x86, 0xA4}, // Ô©
- {0xB6AC, 0x51AC}, //{0xE5, 0x86, 0xAC}, // ¶¬
- {0xB7EB, 0x51AF}, //{0xE5, 0x86, 0xAF}, // ·ë
- {0xB1F9, 0x51B0}, //{0xE5, 0x86, 0xB0}, // ±ù
- {0xB3E5, 0x51B2}, //{0xE5, 0x86, 0xB2}, // ³å
- {0xBEF6, 0x51B3}, //{0xE5, 0x86, 0xB3}, // ¾ö
- {0xBFF6, 0x51B5}, //{0xE5, 0x86, 0xB5}, // ¿ö
+ {0xB6AC, 0x51AC}, //{0xE5, 0x86, 0xAC}, // ��
+ {0xB7EB, 0x51AF}, //{0xE5, 0x86, 0xAF}, // ��
+ {0xB1F9, 0x51B0}, //{0xE5, 0x86, 0xB0}, // ��
+ {0xB3E5, 0x51B2}, //{0xE5, 0x86, 0xB2}, // ��
+ {0xBEF6, 0x51B3}, //{0xE5, 0x86, 0xB3}, // ��
+ {0xBFF6, 0x51B5}, //{0xE5, 0x86, 0xB5}, // ��
{0xD2B1, 0x51B6}, //{0xE5, 0x86, 0xB6}, // Ò±
- {0xC0E4, 0x51B7}, //{0xE5, 0x86, 0xB7}, // Àä
- {0xB6B3, 0x51BB}, //{0xE5, 0x86, 0xBB}, // ¶³
- {0xBEBB, 0x51C0}, //{0xE5, 0x87, 0x80}, // ¾»
- {0xC6E0, 0x51C4}, //{0xE5, 0x87, 0x84}, // Æà
+ {0xC0E4, 0x51B7}, //{0xE5, 0x86, 0xB7}, // ��
+ {0xB6B3, 0x51BB}, //{0xE5, 0x86, 0xBB}, // ��
+ {0xBEBB, 0x51C0}, //{0xE5, 0x87, 0x80}, // ��
+ {0xC6E0, 0x51C4}, //{0xE5, 0x87, 0x84}, // ��
{0xD7BC, 0x51C6}, //{0xE5, 0x87, 0x86}, // ×¼
- {0xC1B9, 0x51C9}, //{0xE5, 0x87, 0x89}, // Á¹
- {0xC1E8, 0x51CC}, //{0xE5, 0x87, 0x8C}, // Áè
- {0xBCF5, 0x51CF}, //{0xE5, 0x87, 0x8F}, // ¼õ
- {0xB4D5, 0x51D1}, //{0xE5, 0x87, 0x91}, // ´Õ
- {0xC1DD, 0x51DB}, //{0xE5, 0x87, 0x9B}, // ÁÝ
- {0xC4FD, 0x51DD}, //{0xE5, 0x87, 0x9D}, // Äý
- {0xBCB8, 0x51E0}, //{0xE5, 0x87, 0xA0}, // ¼¸
- {0xB7B2, 0x51E1}, //{0xE5, 0x87, 0xA1}, // ·²
- {0xB7EF, 0x51E4}, //{0xE5, 0x87, 0xA4}, // ·ï
- {0xD9EC, 0x51EB}, //{0xE5, 0x87, 0xAB}, // Ùì
+ {0xC1B9, 0x51C9}, //{0xE5, 0x87, 0x89}, // y
+ {0xC1E8, 0x51CC}, //{0xE5, 0x87, 0x8C}, // ��
+ {0xBCF5, 0x51CF}, //{0xE5, 0x87, 0x8F}, // ��
+ {0xB4D5, 0x51D1}, //{0xE5, 0x87, 0x91}, // ��
+ {0xC1DD, 0x51DB}, //{0xE5, 0x87, 0x9B}, // ��
+ {0xC4FD, 0x51DD}, //{0xE5, 0x87, 0x9D}, // ��
+ {0xBCB8, 0x51E0}, //{0xE5, 0x87, 0xA0}, // ��
+ {0xB7B2, 0x51E1}, //{0xE5, 0x87, 0xA1}, // ��
+ {0xB7EF, 0x51E4}, //{0xE5, 0x87, 0xA4}, // ��
+ {0xD9EC, 0x51EB}, //{0xE5, 0x87, 0xAB}, // ��
{0xC6BE, 0x51ED}, //{0xE5, 0x87, 0xAD}, // ƾ
- {0xBFAD, 0x51EF}, //{0xE5, 0x87, 0xAF}, // ¿
- {0xBBCB, 0x51F0}, //{0xE5, 0x87, 0xB0}, // »Ë
- {0xB5CA, 0x51F3}, //{0xE5, 0x87, 0xB3}, // µÊ
- {0xD0D7, 0x51F6}, //{0xE5, 0x87, 0xB6}, // Ð×
+ {0xBFAD, 0x51EF}, //{0xE5, 0x87, 0xAF}, // ��
+ {0xBBCB, 0x51F0}, //{0xE5, 0x87, 0xB0}, // ��
+ {0xB5CA, 0x51F3}, //{0xE5, 0x87, 0xB3}, // ��
+ {0xD0D7, 0x51F6}, //{0xE5, 0x87, 0xB6}, // ��
{0xCDB9, 0x51F8}, //{0xE5, 0x87, 0xB8}, // ͹
- {0xB0BC, 0x51F9}, //{0xE5, 0x87, 0xB9}, // °¼
- {0xB3F6, 0x51FA}, //{0xE5, 0x87, 0xBA}, // ³ö
- {0xBBF7, 0x51FB}, //{0xE5, 0x87, 0xBB}, // »÷
- {0xBAAF, 0x51FD}, //{0xE5, 0x87, 0xBD}, // º¯
- {0xD4E4, 0x51FF}, //{0xE5, 0x87, 0xBF}, // Ôä
- {0xB5B6, 0x5200}, //{0xE5, 0x88, 0x80}, // µ¶
- {0xB5F3, 0x5201}, //{0xE5, 0x88, 0x81}, // µó
- {0xC8D0, 0x5203}, //{0xE5, 0x88, 0x83}, // ÈÐ
- {0xB7D6, 0x5206}, //{0xE5, 0x88, 0x86}, // ·Ö
- {0xC7D0, 0x5207}, //{0xE5, 0x88, 0x87}, // ÇÐ
- {0xBFAF, 0x520A}, //{0xE5, 0x88, 0x8A}, // ¿¯
- {0xD0CC, 0x5211}, //{0xE5, 0x88, 0x91}, // ÐÌ
- {0xBBAE, 0x5212}, //{0xE5, 0x88, 0x92}, // »®
- {0xC1D0, 0x5217}, //{0xE5, 0x88, 0x97}, // ÁÐ
- {0xC1F5, 0x5218}, //{0xE5, 0x88, 0x98}, // Áõ
- {0xD4F2, 0x5219}, //{0xE5, 0x88, 0x99}, // Ôò
- {0xB8D5, 0x521A}, //{0xE5, 0x88, 0x9A}, // ¸Õ
- {0xB4B4, 0x521B}, //{0xE5, 0x88, 0x9B}, // ´´
- {0xB3F5, 0x521D}, //{0xE5, 0x88, 0x9D}, // ³õ
+ {0xB0BC, 0x51F9}, //{0xE5, 0x87, 0xB9}, // ��
+ {0xB3F6, 0x51FA}, //{0xE5, 0x87, 0xBA}, // ��
+ {0xBBF7, 0x51FB}, //{0xE5, 0x87, 0xBB}, // ��
+ {0xBAAF, 0x51FD}, //{0xE5, 0x87, 0xBD}, // ��
+ {0xD4E4, 0x51FF}, //{0xE5, 0x87, 0xBF}, // ��
+ {0xB5B6, 0x5200}, //{0xE5, 0x88, 0x80}, // ��
+ {0xB5F3, 0x5201}, //{0xE5, 0x88, 0x81}, // ��
+ {0xC8D0, 0x5203}, //{0xE5, 0x88, 0x83}, // ��
+ {0xB7D6, 0x5206}, //{0xE5, 0x88, 0x86}, // ��
+ {0xC7D0, 0x5207}, //{0xE5, 0x88, 0x87}, // ��
+ {0xBFAF, 0x520A}, //{0xE5, 0x88, 0x8A}, // ��
+ {0xD0CC, 0x5211}, //{0xE5, 0x88, 0x91}, // ��
+ {0xBBAE, 0x5212}, //{0xE5, 0x88, 0x92}, // ��
+ {0xC1D0, 0x5217}, //{0xE5, 0x88, 0x97}, // ��
+ {0xC1F5, 0x5218}, //{0xE5, 0x88, 0x98}, // ��
+ {0xD4F2, 0x5219}, //{0xE5, 0x88, 0x99}, // ��
+ {0xB8D5, 0x521A}, //{0xE5, 0x88, 0x9A}, // ��
+ {0xB4B4, 0x521B}, //{0xE5, 0x88, 0x9B}, // ��
+ {0xB3F5, 0x521D}, //{0xE5, 0x88, 0x9D}, // ��
{0xC9BE, 0x5220}, //{0xE5, 0x88, 0xA0}, // ɾ
- {0xC5D0, 0x5224}, //{0xE5, 0x88, 0xA4}, // ÅÐ
- {0xC5D9, 0x5228}, //{0xE5, 0x88, 0xA8}, // ÅÙ
- {0xC0FB, 0x5229}, //{0xE5, 0x88, 0xA9}, // Àû
- {0xB1F0, 0x522B}, //{0xE5, 0x88, 0xAB}, // ±ð
- {0xB9CE, 0x522E}, //{0xE5, 0x88, 0xAE}, // ¹Î
- {0xB5BD, 0x5230}, //{0xE5, 0x88, 0xB0}, // µ½
- {0xD6C6, 0x5236}, //{0xE5, 0x88, 0xB6}, // ÖÆ
+ {0xC5D0, 0x5224}, //{0xE5, 0x88, 0xA4}, // ��
+ {0xC5D9, 0x5228}, //{0xE5, 0x88, 0xA8}, // ��
+ {0xC0FB, 0x5229}, //{0xE5, 0x88, 0xA9}, // ��
+ {0xB1F0, 0x522B}, //{0xE5, 0x88, 0xAB}, // ��
+ {0xB9CE, 0x522E}, //{0xE5, 0x88, 0xAE}, // ��
+ {0xB5BD, 0x5230}, //{0xE5, 0x88, 0xB0}, // ��
+ {0xD6C6, 0x5236}, //{0xE5, 0x88, 0xB6}, // ��
{0xCBA2, 0x5237}, //{0xE5, 0x88, 0xB7}, // ˢ
{0xC8AF, 0x5238}, //{0xE5, 0x88, 0xB8}, // ȯ
{0xC9B2, 0x5239}, //{0xE5, 0x88, 0xB9}, // ɲ
- {0xB4CC, 0x523A}, //{0xE5, 0x88, 0xBA}, // ´Ì
- {0xBFCC, 0x523B}, //{0xE5, 0x88, 0xBB}, // ¿Ì
- {0xB9F4, 0x523D}, //{0xE5, 0x88, 0xBD}, // ¹ô
- {0xBCC1, 0x5242}, //{0xE5, 0x89, 0x82}, // ¼Á
- {0xCCEA, 0x5243}, //{0xE5, 0x89, 0x83}, // Ìê
- {0xCFF7, 0x524A}, //{0xE5, 0x89, 0x8A}, // Ï÷
+ {0xB4CC, 0x523A}, //{0xE5, 0x88, 0xBA}, // ��
+ {0xBFCC, 0x523B}, //{0xE5, 0x88, 0xBB}, // ��
+ {0xB9F4, 0x523D}, //{0xE5, 0x88, 0xBD}, // ��
+ {0xBCC1, 0x5242}, //{0xE5, 0x89, 0x82}, // ��
+ {0xCCEA, 0x5243}, //{0xE5, 0x89, 0x83}, // ��
+ {0xCFF7, 0x524A}, //{0xE5, 0x89, 0x8A}, // ��
{0xC7B0, 0x524D}, //{0xE5, 0x89, 0x8D}, // ǰ
- {0xBDA3, 0x5251}, //{0xE5, 0x89, 0x91}, // ½£
- {0xCCDE, 0x5254}, //{0xE5, 0x89, 0x94}, // ÌÞ
- {0xC6CA, 0x5256}, //{0xE5, 0x89, 0x96}, // ÆÊ
- {0xB0FE, 0x5265}, //{0xE5, 0x89, 0xA5}, // °þ
- {0xBEE7, 0x5267}, //{0xE5, 0x89, 0xA7}, // ¾ç
+ {0xBDA3, 0x5251}, //{0xE5, 0x89, 0x91}, // ��
+ {0xCCDE, 0x5254}, //{0xE5, 0x89, 0x94}, // ��
+ {0xC6CA, 0x5256}, //{0xE5, 0x89, 0x96}, // ��
+ {0xB0FE, 0x5265}, //{0xE5, 0x89, 0xA5}, // ��
+ {0xBEE7, 0x5267}, //{0xE5, 0x89, 0xA7}, // ��
{0xCAA3, 0x5269}, //{0xE5, 0x89, 0xA9}, // ʣ
- {0xBCF4, 0x526A}, //{0xE5, 0x89, 0xAA}, // ¼ô
- {0xB8B1, 0x526F}, //{0xE5, 0x89, 0xAF}, // ¸±
- {0xB8EE, 0x5272}, //{0xE5, 0x89, 0xB2}, // ¸î
- {0xBDCB, 0x527F}, //{0xE5, 0x89, 0xBF}, // ½Ë
- {0xC5FC, 0x5288}, //{0xE5, 0x8A, 0x88}, // Åü
- {0xC1A6, 0x529B}, //{0xE5, 0x8A, 0x9B}, // Á¦
+ {0xBCF4, 0x526A}, //{0xE5, 0x89, 0xAA}, // ��
+ {0xB8B1, 0x526F}, //{0xE5, 0x89, 0xAF}, // ��
+ {0xB8EE, 0x5272}, //{0xE5, 0x89, 0xB2}, // ��
+ {0xBDCB, 0x527F}, //{0xE5, 0x89, 0xBF}, // ��
+ {0xC5FC, 0x5288}, //{0xE5, 0x8A, 0x88}, // ��
+ {0xC1A6, 0x529B}, //{0xE5, 0x8A, 0x9B}, // f
{0xC8B0, 0x529D}, //{0xE5, 0x8A, 0x9D}, // Ȱ
- {0xB0EC, 0x529E}, //{0xE5, 0x8A, 0x9E}, // °ì
- {0xB9A6, 0x529F}, //{0xE5, 0x8A, 0x9F}, // ¹¦
- {0xBCD3, 0x52A0}, //{0xE5, 0x8A, 0xA0}, // ¼Ó
- {0xCEF1, 0x52A1}, //{0xE5, 0x8A, 0xA1}, // Îñ
- {0xC1D3, 0x52A3}, //{0xE5, 0x8A, 0xA3}, // ÁÓ
- {0xB6AF, 0x52A8}, //{0xE5, 0x8A, 0xA8}, // ¶¯
- {0xD6FA, 0x52A9}, //{0xE5, 0x8A, 0xA9}, // Öú
+ {0xB0EC, 0x529E}, //{0xE5, 0x8A, 0x9E}, // ��
+ {0xB9A6, 0x529F}, //{0xE5, 0x8A, 0x9F}, // ��
+ {0xBCD3, 0x52A0}, //{0xE5, 0x8A, 0xA0}, // ��
+ {0xCEF1, 0x52A1}, //{0xE5, 0x8A, 0xA1}, // ��
+ {0xC1D3, 0x52A3}, //{0xE5, 0x8A, 0xA3}, // ��
+ {0xB6AF, 0x52A8}, //{0xE5, 0x8A, 0xA8}, // ��
+ {0xD6FA, 0x52A9}, //{0xE5, 0x8A, 0xA9}, // ��
{0xC5AC, 0x52AA}, //{0xE5, 0x8A, 0xAA}, // Ŭ
- {0xBDD9, 0x52AB}, //{0xE5, 0x8A, 0xAB}, // ½Ù
- {0xC0F8, 0x52B1}, //{0xE5, 0x8A, 0xB1}, // Àø
- {0xBEA2, 0x52B2}, //{0xE5, 0x8A, 0xB2}, // ¾¢
- {0xC0CD, 0x52B3}, //{0xE5, 0x8A, 0xB3}, // ÀÍ
- {0xCAC6, 0x52BF}, //{0xE5, 0x8A, 0xBF}, // ÊÆ
- {0xB2AA, 0x52C3}, //{0xE5, 0x8B, 0x83}, // ²ª
- {0xD3C2, 0x52C7}, //{0xE5, 0x8B, 0x87}, // ÓÂ
- {0xC3E3, 0x52C9}, //{0xE5, 0x8B, 0x89}, // Ãã
+ {0xBDD9, 0x52AB}, //{0xE5, 0x8A, 0xAB}, // ��
+ {0xC0F8, 0x52B1}, //{0xE5, 0x8A, 0xB1}, // ��
+ {0xBEA2, 0x52B2}, //{0xE5, 0x8A, 0xB2}, // ��
+ {0xC0CD, 0x52B3}, //{0xE5, 0x8A, 0xB3}, // ��
+ {0xCAC6, 0x52BF}, //{0xE5, 0x8A, 0xBF}, // ��
+ {0xB2AA, 0x52C3}, //{0xE5, 0x8B, 0x83}, // ��
+ {0xD3C2, 0x52C7}, //{0xE5, 0x8B, 0x87}, // ��
+ {0xC3E3, 0x52C9}, //{0xE5, 0x8B, 0x89}, // ��
{0xD1AB, 0x52CB}, //{0xE5, 0x8B, 0x8B}, // Ñ«
- {0xC0D5, 0x52D2}, //{0xE5, 0x8B, 0x92}, // ÀÕ
- {0xBFB1, 0x52D8}, //{0xE5, 0x8B, 0x98}, // ¿±
+ {0xC0D5, 0x52D2}, //{0xE5, 0x8B, 0x92}, // ��
+ {0xBFB1, 0x52D8}, //{0xE5, 0x8B, 0x98}, // ��
{0xC4BC, 0x52DF}, //{0xE5, 0x8B, 0x9F}, // ļ
- {0xC7DA, 0x52E4}, //{0xE5, 0x8B, 0xA4}, // ÇÚ
- {0xC9D7, 0x52FA}, //{0xE5, 0x8B, 0xBA}, // É×
- {0xB9B4, 0x52FE}, //{0xE5, 0x8B, 0xBE}, // ¹´
- {0xCEF0, 0x52FF}, //{0xE5, 0x8B, 0xBF}, // Îð
- {0xD4C8, 0x5300}, //{0xE5, 0x8C, 0x80}, // ÔÈ
- {0xB0FC, 0x5305}, //{0xE5, 0x8C, 0x85}, // °ü
- {0xB4D2, 0x5306}, //{0xE5, 0x8C, 0x86}, // ´Ò
- {0xD0D9, 0x5308}, //{0xE5, 0x8C, 0x88}, // ÐÙ
+ {0xC7DA, 0x52E4}, //{0xE5, 0x8B, 0xA4}, // ��
+ {0xC9D7, 0x52FA}, //{0xE5, 0x8B, 0xBA}, // ��
+ {0xB9B4, 0x52FE}, //{0xE5, 0x8B, 0xBE}, // ��
+ {0xCEF0, 0x52FF}, //{0xE5, 0x8B, 0xBF}, // ��
+ {0xD4C8, 0x5300}, //{0xE5, 0x8C, 0x80}, // ��
+ {0xB0FC, 0x5305}, //{0xE5, 0x8C, 0x85}, // ��
+ {0xB4D2, 0x5306}, //{0xE5, 0x8C, 0x86}, // ��
+ {0xD0D9, 0x5308}, //{0xE5, 0x8C, 0x88}, // ��
{0xD8B0, 0x5315}, //{0xE5, 0x8C, 0x95}, // ذ
- {0xBBAF, 0x5316}, //{0xE5, 0x8C, 0x96}, // »¯
- {0xB1B1, 0x5317}, //{0xE5, 0x8C, 0x97}, // ±±
- {0xB3D7, 0x5319}, //{0xE5, 0x8C, 0x99}, // ³×
- {0xBDB3, 0x5320}, //{0xE5, 0x8C, 0xA0}, // ½³
+ {0xBBAF, 0x5316}, //{0xE5, 0x8C, 0x96}, // ��
+ {0xB1B1, 0x5317}, //{0xE5, 0x8C, 0x97}, // ��
+ {0xB3D7, 0x5319}, //{0xE5, 0x8C, 0x99}, // ��
+ {0xBDB3, 0x5320}, //{0xE5, 0x8C, 0xA0}, // ��
{0xCFBB, 0x5323}, //{0xE5, 0x8C, 0xA3}, // Ï»
- {0xB7CB, 0x532A}, //{0xE5, 0x8C, 0xAA}, // ·Ë
+ {0xB7CB, 0x532A}, //{0xE5, 0x8C, 0xAA}, // ��
{0xC6A5, 0x5339}, //{0xE5, 0x8C, 0xB9}, // ƥ
- {0xC7F8, 0x533A}, //{0xE5, 0x8C, 0xBA}, // Çø
+ {0xC7F8, 0x533A}, //{0xE5, 0x8C, 0xBA}, // ��
{0xD2BD, 0x533B}, //{0xE5, 0x8C, 0xBB}, // Ò½
- {0xD8D2, 0x533E}, //{0xE5, 0x8C, 0xBE}, // ØÒ
- {0xC4E4, 0x533F}, //{0xE5, 0x8C, 0xBF}, // Ää
+ {0xD8D2, 0x533E}, //{0xE5, 0x8C, 0xBE}, // ��
+ {0xC4E4, 0x533F}, //{0xE5, 0x8C, 0xBF}, // ��
{0xCAAE, 0x5341}, //{0xE5, 0x8D, 0x81}, // Ê®
{0xC7A7, 0x5343}, //{0xE5, 0x8D, 0x83}, // ǧ
- {0xC9FD, 0x5347}, //{0xE5, 0x8D, 0x87}, // Éý
- {0xCEE7, 0x5348}, //{0xE5, 0x8D, 0x88}, // Îç
- {0xB0EB, 0x534A}, //{0xE5, 0x8D, 0x8A}, // °ë
- {0xBBAA, 0x534E}, //{0xE5, 0x8D, 0x8E}, // Ȼ
+ {0xC9FD, 0x5347}, //{0xE5, 0x8D, 0x87}, // ��
+ {0xCEE7, 0x5348}, //{0xE5, 0x8D, 0x88}, // ��
+ {0xB0EB, 0x534A}, //{0xE5, 0x8D, 0x8A}, // ��
+ {0xBBAA, 0x534E}, //{0xE5, 0x8D, 0x8E}, // ��
{0xD0AD, 0x534F}, //{0xE5, 0x8D, 0x8F}, // Ð
- {0xB1B0, 0x5351}, //{0xE5, 0x8D, 0x91}, // ±°
- {0xD7E4, 0x5352}, //{0xE5, 0x8D, 0x92}, // ×ä
+ {0xB1B0, 0x5351}, //{0xE5, 0x8D, 0x91}, // ��
+ {0xD7E4, 0x5352}, //{0xE5, 0x8D, 0x92}, // ��
{0xD7BF, 0x5353}, //{0xE5, 0x8D, 0x93}, // ׿
- {0xB5A5, 0x5355}, //{0xE5, 0x8D, 0x95}, // µ¥
- {0xC2F4, 0x5356}, //{0xE5, 0x8D, 0x96}, // Âô
- {0xC4CF, 0x5357}, //{0xE5, 0x8D, 0x97}, // ÄÏ
- {0xB2A9, 0x535A}, //{0xE5, 0x8D, 0x9A}, // ²©
- {0xB2B7, 0x535C}, //{0xE5, 0x8D, 0x9C}, // ²·
+ {0xB5A5, 0x5355}, //{0xE5, 0x8D, 0x95}, // ��
+ {0xC2F4, 0x5356}, //{0xE5, 0x8D, 0x96}, // ��
+ {0xC4CF, 0x5357}, //{0xE5, 0x8D, 0x97}, // ��
+ {0xB2A9, 0x535A}, //{0xE5, 0x8D, 0x9A}, // ��
+ {0xB2B7, 0x535C}, //{0xE5, 0x8D, 0x9C}, // ��
{0xD5BC, 0x5360}, //{0xE5, 0x8D, 0xA0}, // Õ¼
- {0xBFA8, 0x5361}, //{0xE5, 0x8D, 0xA1}, // ¿¨
+ {0xBFA8, 0x5361}, //{0xE5, 0x8D, 0xA1}, // ��
{0xC2AC, 0x5362}, //{0xE5, 0x8D, 0xA2}, // ¬
{0xC2B1, 0x5364}, //{0xE5, 0x8D, 0xA4}, // ±
- {0xD8D4, 0x5366}, //{0xE5, 0x8D, 0xA6}, // ØÔ
- {0xCED4, 0x5367}, //{0xE5, 0x8D, 0xA7}, // ÎÔ
- {0xCEC0, 0x536B}, //{0xE5, 0x8D, 0xAB}, // ÎÀ
+ {0xD8D4, 0x5366}, //{0xE5, 0x8D, 0xA6}, // ��
+ {0xCED4, 0x5367}, //{0xE5, 0x8D, 0xA7}, // ��
+ {0xCEC0, 0x536B}, //{0xE5, 0x8D, 0xAB}, // ��
{0xD3A1, 0x5370}, //{0xE5, 0x8D, 0xB0}, // Ó¡
{0xCEA3, 0x5371}, //{0xE5, 0x8D, 0xB1}, // Σ
- {0xBCB4, 0x5373}, //{0xE5, 0x8D, 0xB3}, // ¼´
+ {0xBCB4, 0x5373}, //{0xE5, 0x8D, 0xB3}, // ��
{0xC8B4, 0x5374}, //{0xE5, 0x8D, 0xB4}, // È´
- {0xC2D1, 0x5375}, //{0xE5, 0x8D, 0xB5}, // ÂÑ
- {0xBEED, 0x5377}, //{0xE5, 0x8D, 0xB7}, // ¾í
+ {0xC2D1, 0x5375}, //{0xE5, 0x8D, 0xB5}, // ��
+ {0xBEED, 0x5377}, //{0xE5, 0x8D, 0xB7}, // ��
{0xD0B6, 0x5378}, //{0xE5, 0x8D, 0xB8}, // ж
- {0xC7E4, 0x537F}, //{0xE5, 0x8D, 0xBF}, // Çä
- {0xB3A7, 0x5382}, //{0xE5, 0x8E, 0x82}, // ³§
- {0xCCFC, 0x5385}, //{0xE5, 0x8E, 0x85}, // Ìü
- {0xC0FA, 0x5386}, //{0xE5, 0x8E, 0x86}, // Àú
- {0xC0F7, 0x5389}, //{0xE5, 0x8E, 0x89}, // À÷
+ {0xC7E4, 0x537F}, //{0xE5, 0x8D, 0xBF}, // ��
+ {0xB3A7, 0x5382}, //{0xE5, 0x8E, 0x82}, // ��
+ {0xCCFC, 0x5385}, //{0xE5, 0x8E, 0x85}, // ��
+ {0xC0FA, 0x5386}, //{0xE5, 0x8E, 0x86}, // ��
+ {0xC0F7, 0x5389}, //{0xE5, 0x8E, 0x89}, // ��
{0xD1B9, 0x538B}, //{0xE5, 0x8E, 0x8B}, // ѹ
- {0xD1E1, 0x538C}, //{0xE5, 0x8E, 0x8C}, // Ñá
- {0xB2DE, 0x5395}, //{0xE5, 0x8E, 0x95}, // ²Þ
- {0xC0E5, 0x5398}, //{0xE5, 0x8E, 0x98}, // Àå
- {0xBAF1, 0x539A}, //{0xE5, 0x8E, 0x9A}, // ºñ
+ {0xD1E1, 0x538C}, //{0xE5, 0x8E, 0x8C}, // ��
+ {0xB2DE, 0x5395}, //{0xE5, 0x8E, 0x95}, // ��
+ {0xC0E5, 0x5398}, //{0xE5, 0x8E, 0x98}, // ��
+ {0xBAF1, 0x539A}, //{0xE5, 0x8E, 0x9A}, // ��
{0xD4AD, 0x539F}, //{0xE5, 0x8E, 0x9F}, // Ô
- {0xCFE1, 0x53A2}, //{0xE5, 0x8E, 0xA2}, // Ïá
- {0xCFC3, 0x53A6}, //{0xE5, 0x8E, 0xA6}, // ÏÃ
- {0xB3F8, 0x53A8}, //{0xE5, 0x8E, 0xA8}, // ³ø
+ {0xCFE1, 0x53A2}, //{0xE5, 0x8E, 0xA2}, // ��
+ {0xCFC3, 0x53A6}, //{0xE5, 0x8E, 0xA6}, // ��
+ {0xB3F8, 0x53A8}, //{0xE5, 0x8E, 0xA8}, // ��
{0xC8A5, 0x53BB}, //{0xE5, 0x8E, 0xBB}, // ȥ
- {0xCFD8, 0x53BF}, //{0xE5, 0x8E, 0xBF}, // ÏØ
- {0xB2CE, 0x53C2}, //{0xE5, 0x8F, 0x82}, // ²Î
- {0xD3D6, 0x53C8}, //{0xE5, 0x8F, 0x88}, // ÓÖ
- {0xB2E6, 0x53C9}, //{0xE5, 0x8F, 0x89}, // ²æ
- {0xBCB0, 0x53CA}, //{0xE5, 0x8F, 0x8A}, // ¼°
- {0xD3D1, 0x53CB}, //{0xE5, 0x8F, 0x8B}, // ÓÑ
+ {0xCFD8, 0x53BF}, //{0xE5, 0x8E, 0xBF}, // ��
+ {0xB2CE, 0x53C2}, //{0xE5, 0x8F, 0x82}, // ��
+ {0xD3D6, 0x53C8}, //{0xE5, 0x8F, 0x88}, // ��
+ {0xB2E6, 0x53C9}, //{0xE5, 0x8F, 0x89}, // ��
+ {0xBCB0, 0x53CA}, //{0xE5, 0x8F, 0x8A}, // ��
+ {0xD3D1, 0x53CB}, //{0xE5, 0x8F, 0x8B}, // ��
{0xCBAB, 0x53CC}, //{0xE5, 0x8F, 0x8C}, // Ë«
- {0xB7B4, 0x53CD}, //{0xE5, 0x8F, 0x8D}, // ·´
- {0xB7A2, 0x53D1}, //{0xE5, 0x8F, 0x91}, // ·¢
- {0xCAE5, 0x53D4}, //{0xE5, 0x8F, 0x94}, // Êå
+ {0xB7B4, 0x53CD}, //{0xE5, 0x8F, 0x8D}, // ��
+ {0xB7A2, 0x53D1}, //{0xE5, 0x8F, 0x91}, // ��
+ {0xCAE5, 0x53D4}, //{0xE5, 0x8F, 0x94}, // ��
{0xC8A1, 0x53D6}, //{0xE5, 0x8F, 0x96}, // È¡
- {0xCADC, 0x53D7}, //{0xE5, 0x8F, 0x97}, // ÊÜ
- {0xB1E4, 0x53D8}, //{0xE5, 0x8F, 0x98}, // ±ä
- {0xD0F0, 0x53D9}, //{0xE5, 0x8F, 0x99}, // Ðð
- {0xC5D1, 0x53DB}, //{0xE5, 0x8F, 0x9B}, // ÅÑ
- {0xB5FE, 0x53E0}, //{0xE5, 0x8F, 0xA0}, // µþ
- {0xBFDA, 0x53E3}, //{0xE5, 0x8F, 0xA3}, // ¿Ú
- {0xB9C5, 0x53E4}, //{0xE5, 0x8F, 0xA4}, // ¹Å
- {0xBEE4, 0x53E5}, //{0xE5, 0x8F, 0xA5}, // ¾ä
- {0xC1ED, 0x53E6}, //{0xE5, 0x8F, 0xA6}, // Áí
+ {0xCADC, 0x53D7}, //{0xE5, 0x8F, 0x97}, // ��
+ {0xB1E4, 0x53D8}, //{0xE5, 0x8F, 0x98}, // ��
+ {0xD0F0, 0x53D9}, //{0xE5, 0x8F, 0x99}, // ��
+ {0xC5D1, 0x53DB}, //{0xE5, 0x8F, 0x9B}, // ��
+ {0xB5FE, 0x53E0}, //{0xE5, 0x8F, 0xA0}, // ��
+ {0xBFDA, 0x53E3}, //{0xE5, 0x8F, 0xA3}, // ��
+ {0xB9C5, 0x53E4}, //{0xE5, 0x8F, 0xA4}, // ��
+ {0xBEE4, 0x53E5}, //{0xE5, 0x8F, 0xA5}, // ��
+ {0xC1ED, 0x53E6}, //{0xE5, 0x8F, 0xA6}, // ��
{0xDFB6, 0x53E8}, //{0xE5, 0x8F, 0xA8}, // ß¶
{0xD6BB, 0x53EA}, //{0xE5, 0x8F, 0xAA}, // Ö»
- {0xBDD0, 0x53EB}, //{0xE5, 0x8F, 0xAB}, // ½Ð
- {0xD5D9, 0x53EC}, //{0xE5, 0x8F, 0xAC}, // ÕÙ
- {0xB0C8, 0x53ED}, //{0xE5, 0x8F, 0xAD}, // °È
- {0xB6A3, 0x53EE}, //{0xE5, 0x8F, 0xAE}, // ¶£
- {0xBFC9, 0x53EF}, //{0xE5, 0x8F, 0xAF}, // ¿É
+ {0xBDD0, 0x53EB}, //{0xE5, 0x8F, 0xAB}, // ��
+ {0xD5D9, 0x53EC}, //{0xE5, 0x8F, 0xAC}, // ��
+ {0xB0C8, 0x53ED}, //{0xE5, 0x8F, 0xAD}, // ��
+ {0xB6A3, 0x53EE}, //{0xE5, 0x8F, 0xAE}, // ��
+ {0xBFC9, 0x53EF}, //{0xE5, 0x8F, 0xAF}, // ��
{0xCCA8, 0x53F0}, //{0xE5, 0x8F, 0xB0}, // ̨
{0xCAB7, 0x53F2}, //{0xE5, 0x8F, 0xB2}, // Ê·
- {0xD3D2, 0x53F3}, //{0xE5, 0x8F, 0xB3}, // ÓÒ
+ {0xD3D2, 0x53F3}, //{0xE5, 0x8F, 0xB3}, // ��
{0xD2B6, 0x53F6}, //{0xE5, 0x8F, 0xB6}, // Ò¶
- {0xBAC5, 0x53F7}, //{0xE5, 0x8F, 0xB7}, // ºÅ
+ {0xBAC5, 0x53F7}, //{0xE5, 0x8F, 0xB7}, // ��
{0xCBBE, 0x53F8}, //{0xE5, 0x8F, 0xB8}, // ˾
{0xCCBE, 0x53F9}, //{0xE5, 0x8F, 0xB9}, // ̾
- {0xB5F0, 0x53FC}, //{0xE5, 0x8F, 0xBC}, // µð
+ {0xB5F0, 0x53FC}, //{0xE5, 0x8F, 0xBC}, // ��
{0xDFB4, 0x53FD}, //{0xE5, 0x8F, 0xBD}, // ß´
- {0xD3F5, 0x5401}, //{0xE5, 0x90, 0x81}, // Óõ
- {0xB3D4, 0x5403}, //{0xE5, 0x90, 0x83}, // ³Ô
- {0xB8F7, 0x5404}, //{0xE5, 0x90, 0x84}, // ¸÷
+ {0xD3F5, 0x5401}, //{0xE5, 0x90, 0x81}, // ��
+ {0xB3D4, 0x5403}, //{0xE5, 0x90, 0x83}, // ��
+ {0xB8F7, 0x5404}, //{0xE5, 0x90, 0x84}, // ��
{0xDFBA, 0x5406}, //{0xE5, 0x90, 0x86}, // ߺ
- {0xBACF, 0x5408}, //{0xE5, 0x90, 0x88}, // ºÏ
- {0xBCAA, 0x5409}, //{0xE5, 0x90, 0x89}, // ¼ª
- {0xB5F5, 0x540A}, //{0xE5, 0x90, 0x8A}, // µõ
+ {0xBACF, 0x5408}, //{0xE5, 0x90, 0x88}, // ��
+ {0xBCAA, 0x5409}, //{0xE5, 0x90, 0x89}, // ��
+ {0xB5F5, 0x540A}, //{0xE5, 0x90, 0x8A}, // ��
{0xCDAC, 0x540C}, //{0xE5, 0x90, 0x8C}, // ͬ
- {0xC3FB, 0x540D}, //{0xE5, 0x90, 0x8D}, // Ãû
- {0xBAF3, 0x540E}, //{0xE5, 0x90, 0x8E}, // ºó
- {0xC0F4, 0x540F}, //{0xE5, 0x90, 0x8F}, // Àô
- {0xCDC2, 0x5410}, //{0xE5, 0x90, 0x90}, // ÍÂ
- {0xCFF2, 0x5411}, //{0xE5, 0x90, 0x91}, // Ïò
- {0xCFC5, 0x5413}, //{0xE5, 0x90, 0x93}, // ÏÅ
- {0xC2C0, 0x5415}, //{0xE5, 0x90, 0x95}, // ÂÀ
- {0xC2F0, 0x5417}, //{0xE5, 0x90, 0x97}, // Âð
- {0xBEFD, 0x541B}, //{0xE5, 0x90, 0x9B}, // ¾ý
- {0xC1DF, 0x541D}, //{0xE5, 0x90, 0x9D}, // Áß
- {0xCDCC, 0x541E}, //{0xE5, 0x90, 0x9E}, // ÍÌ
- {0xD2F7, 0x541F}, //{0xE5, 0x90, 0x9F}, // Ò÷
- {0xB7CD, 0x5420}, //{0xE5, 0x90, 0xA0}, // ·Í
- {0xB7F1, 0x5426}, //{0xE5, 0x90, 0xA6}, // ·ñ
- {0xB0C9, 0x5427}, //{0xE5, 0x90, 0xA7}, // °É
- {0xB6D6, 0x5428}, //{0xE5, 0x90, 0xA8}, // ¶Ö
- {0xB7D4, 0x5429}, //{0xE5, 0x90, 0xA9}, // ·Ô
- {0xBAAC, 0x542B}, //{0xE5, 0x90, 0xAB}, // º¬
- {0xCCFD, 0x542C}, //{0xE5, 0x90, 0xAC}, // Ìý
- {0xBFD4, 0x542D}, //{0xE5, 0x90, 0xAD}, // ¿Ô
+ {0xC3FB, 0x540D}, //{0xE5, 0x90, 0x8D}, // ��
+ {0xBAF3, 0x540E}, //{0xE5, 0x90, 0x8E}, // ��
+ {0xC0F4, 0x540F}, //{0xE5, 0x90, 0x8F}, // ��
+ {0xCDC2, 0x5410}, //{0xE5, 0x90, 0x90}, // ��
+ {0xCFF2, 0x5411}, //{0xE5, 0x90, 0x91}, // ��
+ {0xCFC5, 0x5413}, //{0xE5, 0x90, 0x93}, // ��
+ {0xC2C0, 0x5415}, //{0xE5, 0x90, 0x95}, // ��
+ {0xC2F0, 0x5417}, //{0xE5, 0x90, 0x97}, // ��
+ {0xBEFD, 0x541B}, //{0xE5, 0x90, 0x9B}, // ��
+ {0xC1DF, 0x541D}, //{0xE5, 0x90, 0x9D}, // ��
+ {0xCDCC, 0x541E}, //{0xE5, 0x90, 0x9E}, // ��
+ {0xD2F7, 0x541F}, //{0xE5, 0x90, 0x9F}, // ��
+ {0xB7CD, 0x5420}, //{0xE5, 0x90, 0xA0}, // ��
+ {0xB7F1, 0x5426}, //{0xE5, 0x90, 0xA6}, // ��
+ {0xB0C9, 0x5427}, //{0xE5, 0x90, 0xA7}, // ��
+ {0xB6D6, 0x5428}, //{0xE5, 0x90, 0xA8}, // ��
+ {0xB7D4, 0x5429}, //{0xE5, 0x90, 0xA9}, // ��
+ {0xBAAC, 0x542B}, //{0xE5, 0x90, 0xAB}, // ��
+ {0xCCFD, 0x542C}, //{0xE5, 0x90, 0xAC}, // ��
+ {0xBFD4, 0x542D}, //{0xE5, 0x90, 0xAD}, // ��
{0xCBB1, 0x542E}, //{0xE5, 0x90, 0xAE}, // ˱
- {0xC6F4, 0x542F}, //{0xE5, 0x90, 0xAF}, // Æô
+ {0xC6F4, 0x542F}, //{0xE5, 0x90, 0xAF}, // ��
{0xD6A8, 0x5431}, //{0xE5, 0x90, 0xB1}, // Ö¨
- {0xCEE2, 0x5434}, //{0xE5, 0x90, 0xB4}, // Îâ
- {0xB3B3, 0x5435}, //{0xE5, 0x90, 0xB5}, // ³³
- {0xCEFC, 0x5438}, //{0xE5, 0x90, 0xB8}, // Îü
- {0xB4B5, 0x5439}, //{0xE5, 0x90, 0xB9}, // ´µ
- {0xCEC7, 0x543B}, //{0xE5, 0x90, 0xBB}, // ÎÇ
- {0xBAF0, 0x543C}, //{0xE5, 0x90, 0xBC}, // ºð
+ {0xCEE2, 0x5434}, //{0xE5, 0x90, 0xB4}, // ��
+ {0xB3B3, 0x5435}, //{0xE5, 0x90, 0xB5}, // ��
+ {0xCEFC, 0x5438}, //{0xE5, 0x90, 0xB8}, // ��
+ {0xB4B5, 0x5439}, //{0xE5, 0x90, 0xB9}, // ��
+ {0xCEC7, 0x543B}, //{0xE5, 0x90, 0xBB}, // ��
+ {0xBAF0, 0x543C}, //{0xE5, 0x90, 0xBC}, // ��
{0xD1BD, 0x5440}, //{0xE5, 0x91, 0x80}, // ѽ
- {0xB4F4, 0x5446}, //{0xE5, 0x91, 0x86}, // ´ô
- {0xB3CA, 0x5448}, //{0xE5, 0x91, 0x88}, // ³Ê
- {0xB8E6, 0x544A}, //{0xE5, 0x91, 0x8A}, // ¸æ
- {0xC4C5, 0x5450}, //{0xE5, 0x91, 0x90}, // ÄÅ
+ {0xB4F4, 0x5446}, //{0xE5, 0x91, 0x86}, // ��
+ {0xB3CA, 0x5448}, //{0xE5, 0x91, 0x88}, // ��
+ {0xB8E6, 0x544A}, //{0xE5, 0x91, 0x8A}, // ��
+ {0xC4C5, 0x5450}, //{0xE5, 0x91, 0x90}, // ��
{0xC5BB, 0x5455}, //{0xE5, 0x91, 0x95}, // Å»
{0xD4B1, 0x5458}, //{0xE5, 0x91, 0x98}, // Ô±
{0xC7BA, 0x545B}, //{0xE5, 0x91, 0x9B}, // Ǻ
- {0xCED8, 0x545C}, //{0xE5, 0x91, 0x9C}, // ÎØ
- {0xC4D8, 0x5462}, //{0xE5, 0x91, 0xA2}, // ÄØ
- {0xD6DC, 0x5468}, //{0xE5, 0x91, 0xA8}, // ÖÜ
+ {0xCED8, 0x545C}, //{0xE5, 0x91, 0x9C}, // ��
+ {0xC4D8, 0x5462}, //{0xE5, 0x91, 0xA2}, // ��
+ {0xD6DC, 0x5468}, //{0xE5, 0x91, 0xA8}, // ��
{0xCEB6, 0x5473}, //{0xE5, 0x91, 0xB3}, // ζ
- {0xBAC7, 0x5475}, //{0xE5, 0x91, 0xB5}, // ºÇ
- {0xC9EB, 0x547B}, //{0xE5, 0x91, 0xBB}, // Éë
- {0xBAF4, 0x547C}, //{0xE5, 0x91, 0xBC}, // ºô
- {0xC3FC, 0x547D}, //{0xE5, 0x91, 0xBD}, // Ãü
- {0xC5D8, 0x5486}, //{0xE5, 0x92, 0x86}, // ÅØ
- {0xBACD, 0x548C}, //{0xE5, 0x92, 0x8C}, // ºÍ
+ {0xBAC7, 0x5475}, //{0xE5, 0x91, 0xB5}, // ��
+ {0xC9EB, 0x547B}, //{0xE5, 0x91, 0xBB}, // ��
+ {0xBAF4, 0x547C}, //{0xE5, 0x91, 0xBC}, // ��
+ {0xC3FC, 0x547D}, //{0xE5, 0x91, 0xBD}, // ��
+ {0xC5D8, 0x5486}, //{0xE5, 0x92, 0x86}, // ��
+ {0xBACD, 0x548C}, //{0xE5, 0x92, 0x8C}, // ��
{0xD3BD, 0x548F}, //{0xE5, 0x92, 0x8F}, // Ó½
- {0xB8C0, 0x5490}, //{0xE5, 0x92, 0x90}, // ¸À
- {0xD6E4, 0x5492}, //{0xE5, 0x92, 0x92}, // Öä
- {0xB9BE, 0x5495}, //{0xE5, 0x92, 0x95}, // ¹¾
- {0xBFA7, 0x5496}, //{0xE5, 0x92, 0x96}, // ¿§
- {0xC1FC, 0x5499}, //{0xE5, 0x92, 0x99}, // Áü
- {0xDFD6, 0x54A7}, //{0xE5, 0x92, 0xA7}, // ßÖ
- {0xD7C9, 0x54A8}, //{0xE5, 0x92, 0xA8}, // ×É
- {0xDFE4, 0x54AA}, //{0xE5, 0x92, 0xAA}, // ßä
+ {0xB8C0, 0x5490}, //{0xE5, 0x92, 0x90}, // ��
+ {0xD6E4, 0x5492}, //{0xE5, 0x92, 0x92}, // ��
+ {0xB9BE, 0x5495}, //{0xE5, 0x92, 0x95}, // ��
+ {0xBFA7, 0x5496}, //{0xE5, 0x92, 0x96}, // ��
+ {0xC1FC, 0x5499}, //{0xE5, 0x92, 0x99}, // ��
+ {0xDFD6, 0x54A7}, //{0xE5, 0x92, 0xA7}, // ��
+ {0xD7C9, 0x54A8}, //{0xE5, 0x92, 0xA8}, // ��
+ {0xDFE4, 0x54AA}, //{0xE5, 0x92, 0xAA}, // ��
{0xD2A7, 0x54AC}, //{0xE5, 0x92, 0xAC}, // Ò§
- {0xD4DB, 0x54B1}, //{0xE5, 0x92, 0xB1}, // ÔÛ
- {0xBFC8, 0x54B3}, //{0xE5, 0x92, 0xB3}, // ¿È
- {0xCFCC, 0x54B8}, //{0xE5, 0x92, 0xB8}, // ÏÌ
- {0xD1CA, 0x54BD}, //{0xE5, 0x92, 0xBD}, // ÑÊ
- {0xB0A7, 0x54C0}, //{0xE5, 0x93, 0x80}, // °§
+ {0xD4DB, 0x54B1}, //{0xE5, 0x92, 0xB1}, // ��
+ {0xBFC8, 0x54B3}, //{0xE5, 0x92, 0xB3}, // ��
+ {0xCFCC, 0x54B8}, //{0xE5, 0x92, 0xB8}, // ��
+ {0xD1CA, 0x54BD}, //{0xE5, 0x92, 0xBD}, // ��
+ {0xB0A7, 0x54C0}, //{0xE5, 0x93, 0x80}, // ��
{0xC6B7, 0x54C1}, //{0xE5, 0x93, 0x81}, // Æ·
- {0xBAE5, 0x54C4}, //{0xE5, 0x93, 0x84}, // ºå
- {0xB6DF, 0x54C6}, //{0xE5, 0x93, 0x86}, // ¶ß
- {0xB9FE, 0x54C8}, //{0xE5, 0x93, 0x88}, // ¹þ
- {0xCFEC, 0x54CD}, //{0xE5, 0x93, 0x8D}, // Ïì
- {0xB0A5, 0x54CE}, //{0xE5, 0x93, 0x8E}, // °¥
- {0xD1C6, 0x54D1}, //{0xE5, 0x93, 0x91}, // ÑÆ
- {0xBBA9, 0x54D7}, //{0xE5, 0x93, 0x97}, // »©
+ {0xBAE5, 0x54C4}, //{0xE5, 0x93, 0x84}, // ��
+ {0xB6DF, 0x54C6}, //{0xE5, 0x93, 0x86}, // ��
+ {0xB9FE, 0x54C8}, //{0xE5, 0x93, 0x88}, // ��
+ {0xCFEC, 0x54CD}, //{0xE5, 0x93, 0x8D}, // ��
+ {0xB0A5, 0x54CE}, //{0xE5, 0x93, 0x8E}, // ��
+ {0xD1C6, 0x54D1}, //{0xE5, 0x93, 0x91}, // ��
+ {0xBBA9, 0x54D7}, //{0xE5, 0x93, 0x97}, // ��
{0xD3B4, 0x54DF}, //{0xE5, 0x93, 0x9F}, // Ó´
- {0xB8E7, 0x54E5}, //{0xE5, 0x93, 0xA5}, // ¸ç
- {0xC9DA, 0x54E8}, //{0xE5, 0x93, 0xA8}, // ÉÚ
- {0xC1A8, 0x54E9}, //{0xE5, 0x93, 0xA9}, // Á¨
- {0xC4C4, 0x54EA}, //{0xE5, 0x93, 0xAA}, // ÄÄ
- {0xBFDE, 0x54ED}, //{0xE5, 0x93, 0xAD}, // ¿Þ
- {0xCFF8, 0x54EE}, //{0xE5, 0x93, 0xAE}, // Ïø
- {0xD5DC, 0x54F2}, //{0xE5, 0x93, 0xB2}, // ÕÜ
- {0xB2B8, 0x54FA}, //{0xE5, 0x93, 0xBA}, // ²¸
- {0xBADF, 0x54FC}, //{0xE5, 0x93, 0xBC}, // ºß
- {0xD1E4, 0x5501}, //{0xE5, 0x94, 0x81}, // Ñä
- {0xCBF4, 0x5506}, //{0xE5, 0x94, 0x86}, // Ëô
- {0xB4BD, 0x5507}, //{0xE5, 0x94, 0x87}, // ´½
- {0xB0A6, 0x5509}, //{0xE5, 0x94, 0x89}, // °¦
- {0xCCC6, 0x5510}, //{0xE5, 0x94, 0x90}, // ÌÆ
- {0xDFEB, 0x5520}, //{0xE5, 0x94, 0xA0}, // ßë
- {0xBBBD, 0x5524}, //{0xE5, 0x94, 0xA4}, // »½
- {0xDFF3, 0x5527}, //{0xE5, 0x94, 0xA7}, // ßó
- {0xBBA3, 0x552C}, //{0xE5, 0x94, 0xAC}, // ȣ
- {0xCADB, 0x552E}, //{0xE5, 0x94, 0xAE}, // ÊÛ
+ {0xB8E7, 0x54E5}, //{0xE5, 0x93, 0xA5}, // ��
+ {0xC9DA, 0x54E8}, //{0xE5, 0x93, 0xA8}, // ��
+ {0xC1A8, 0x54E9}, //{0xE5, 0x93, 0xA9}, // h
+ {0xC4C4, 0x54EA}, //{0xE5, 0x93, 0xAA}, // ��
+ {0xBFDE, 0x54ED}, //{0xE5, 0x93, 0xAD}, // ��
+ {0xCFF8, 0x54EE}, //{0xE5, 0x93, 0xAE}, // ��
+ {0xD5DC, 0x54F2}, //{0xE5, 0x93, 0xB2}, // ��
+ {0xB2B8, 0x54FA}, //{0xE5, 0x93, 0xBA}, // ��
+ {0xBADF, 0x54FC}, //{0xE5, 0x93, 0xBC}, // ��
+ {0xD1E4, 0x5501}, //{0xE5, 0x94, 0x81}, // ��
+ {0xCBF4, 0x5506}, //{0xE5, 0x94, 0x86}, // ��
+ {0xB4BD, 0x5507}, //{0xE5, 0x94, 0x87}, // ��
+ {0xB0A6, 0x5509}, //{0xE5, 0x94, 0x89}, // ��
+ {0xCCC6, 0x5510}, //{0xE5, 0x94, 0x90}, // ��
+ {0xDFEB, 0x5520}, //{0xE5, 0x94, 0xA0}, // ��
+ {0xBBBD, 0x5524}, //{0xE5, 0x94, 0xA4}, // ��
+ {0xDFF3, 0x5527}, //{0xE5, 0x94, 0xA7}, // ��
+ {0xBBA3, 0x552C}, //{0xE5, 0x94, 0xAC}, // ��
+ {0xCADB, 0x552E}, //{0xE5, 0x94, 0xAE}, // ��
{0xCEA8, 0x552F}, //{0xE5, 0x94, 0xAF}, // Ψ
- {0xB3AA, 0x5531}, //{0xE5, 0x94, 0xB1}, // ³ª
- {0xCDD9, 0x553E}, //{0xE5, 0x94, 0xBE}, // ÍÙ
- {0xBFD0, 0x5543}, //{0xE5, 0x95, 0x83}, // ¿Ð
- {0xD7C4, 0x5544}, //{0xE5, 0x95, 0x84}, // ×Ä
- {0xC9CC, 0x5546}, //{0xE5, 0x95, 0x86}, // ÉÌ
- {0xB0A1, 0x554A}, //{0xE5, 0x95, 0x8A}, // °¡
- {0xB7C8, 0x5561}, //{0xE5, 0x95, 0xA1}, // ·È
+ {0xB3AA, 0x5531}, //{0xE5, 0x94, 0xB1}, // ��
+ {0xCDD9, 0x553E}, //{0xE5, 0x94, 0xBE}, // ��
+ {0xBFD0, 0x5543}, //{0xE5, 0x95, 0x83}, // ��
+ {0xD7C4, 0x5544}, //{0xE5, 0x95, 0x84}, // ��
+ {0xC9CC, 0x5546}, //{0xE5, 0x95, 0x86}, // ��
+ {0xB0A1, 0x554A}, //{0xE5, 0x95, 0x8A}, // ��
+ {0xB7C8, 0x5561}, //{0xE5, 0x95, 0xA1}, // ��
{0xC6A1, 0x5564}, //{0xE5, 0x95, 0xA4}, // Æ¡
{0xC9B6, 0x5565}, //{0xE5, 0x95, 0xA5}, // ɶ
- {0xC0B2, 0x5566}, //{0xE5, 0x95, 0xA6}, // À²
+ {0xC0B2, 0x5566}, //{0xE5, 0x95, 0xA6}, // 2
{0xD0A5, 0x5578}, //{0xE5, 0x95, 0xB8}, // Х
- {0xCCE4, 0x557C}, //{0xE5, 0x95, 0xBC}, // Ìä
+ {0xCCE4, 0x557C}, //{0xE5, 0x95, 0xBC}, // ��
{0xCEB9, 0x5582}, //{0xE5, 0x96, 0x82}, // ι
- {0xC9C6, 0x5584}, //{0xE5, 0x96, 0x84}, // ÉÆ
- {0xC0AE, 0x5587}, //{0xE5, 0x96, 0x87}, // À®
- {0xBAED, 0x5589}, //{0xE5, 0x96, 0x89}, // ºí
- {0xBAB0, 0x558A}, //{0xE5, 0x96, 0x8A}, // º°
- {0xB4AD, 0x5598}, //{0xE5, 0x96, 0x98}, // ´
+ {0xC9C6, 0x5584}, //{0xE5, 0x96, 0x84}, // ��
+ {0xC0AE, 0x5587}, //{0xE5, 0x96, 0x87}, // .
+ {0xBAED, 0x5589}, //{0xE5, 0x96, 0x89}, // ��
+ {0xBAB0, 0x558A}, //{0xE5, 0x96, 0x8A}, // ��
+ {0xB4AD, 0x5598}, //{0xE5, 0x96, 0x98}, // ��
{0xCFB2, 0x559C}, //{0xE5, 0x96, 0x9C}, // ϲ
- {0xBAC8, 0x559D}, //{0xE5, 0x96, 0x9D}, // ºÈ
- {0xD0FA, 0x55A7}, //{0xE5, 0x96, 0xA7}, // Ðú
- {0xD4FB, 0x55B3}, //{0xE5, 0x96, 0xB3}, // Ôû
- {0xC5E7, 0x55B7}, //{0xE5, 0x96, 0xB7}, // Åç
- {0xD3F7, 0x55BB}, //{0xE5, 0x96, 0xBB}, // Ó÷
- {0xD0E1, 0x55C5}, //{0xE5, 0x97, 0x85}, // Ðá
+ {0xBAC8, 0x559D}, //{0xE5, 0x96, 0x9D}, // ��
+ {0xD0FA, 0x55A7}, //{0xE5, 0x96, 0xA7}, // ��
+ {0xD4FB, 0x55B3}, //{0xE5, 0x96, 0xB3}, // ��
+ {0xC5E7, 0x55B7}, //{0xE5, 0x96, 0xB7}, // ��
+ {0xD3F7, 0x55BB}, //{0xE5, 0x96, 0xBB}, // ��
+ {0xD0E1, 0x55C5}, //{0xE5, 0x97, 0x85}, // ��
{0xC9A4, 0x55D3}, //{0xE5, 0x97, 0x93}, // ɤ
- {0xCAC8, 0x55DC}, //{0xE5, 0x97, 0x9C}, // ÊÈ
- {0xCECB, 0x55E1}, //{0xE5, 0x97, 0xA1}, // ÎË
- {0xE0CD, 0x55E4}, //{0xE5, 0x97, 0xA4}, // àÍ
- {0xE0C2, 0x55E6}, //{0xE5, 0x97, 0xA6}, // àÂ
- {0xCBD4, 0x55FD}, //{0xE5, 0x97, 0xBD}, // ËÔ
- {0xE0D6, 0x5600}, //{0xE5, 0x98, 0x80}, // àÖ
- {0xE0D2, 0x5601}, //{0xE5, 0x98, 0x81}, // àÒ
- {0xBCCE, 0x5609}, //{0xE5, 0x98, 0x89}, // ¼Î
- {0xD6F6, 0x5631}, //{0xE5, 0x98, 0xB1}, // Öö
- {0xB3B0, 0x5632}, //{0xE5, 0x98, 0xB2}, // ³°
- {0xD7EC, 0x5634}, //{0xE5, 0x98, 0xB4}, // ×ì
+ {0xCAC8, 0x55DC}, //{0xE5, 0x97, 0x9C}, // ��
+ {0xCECB, 0x55E1}, //{0xE5, 0x97, 0xA1}, // ��
+ {0xE0CD, 0x55E4}, //{0xE5, 0x97, 0xA4}, // ��
+ {0xE0C2, 0x55E6}, //{0xE5, 0x97, 0xA6}, // ��
+ {0xCBD4, 0x55FD}, //{0xE5, 0x97, 0xBD}, // ��
+ {0xE0D6, 0x5600}, //{0xE5, 0x98, 0x80}, // ��
+ {0xE0D2, 0x5601}, //{0xE5, 0x98, 0x81}, // ��
+ {0xBCCE, 0x5609}, //{0xE5, 0x98, 0x89}, // ��
+ {0xD6F6, 0x5631}, //{0xE5, 0x98, 0xB1}, // ��
+ {0xB3B0, 0x5632}, //{0xE5, 0x98, 0xB2}, // ��
+ {0xD7EC, 0x5634}, //{0xE5, 0x98, 0xB4}, // ��
{0xCBBB, 0x5636}, //{0xE5, 0x98, 0xB6}, // Ë»
- {0xE0DA, 0x5639}, //{0xE5, 0x98, 0xB9}, // àÚ
- {0xBAD9, 0x563F}, //{0xE5, 0x98, 0xBF}, // ºÙ
- {0xC6F7, 0x5668}, //{0xE5, 0x99, 0xA8}, // Æ÷
+ {0xE0DA, 0x5639}, //{0xE5, 0x98, 0xB9}, // ��
+ {0xBAD9, 0x563F}, //{0xE5, 0x98, 0xBF}, // ��
+ {0xC6F7, 0x5668}, //{0xE5, 0x99, 0xA8}, // ��
{0xD8AC, 0x5669}, //{0xE5, 0x99, 0xA9}, // ج
- {0xD4EB, 0x566A}, //{0xE5, 0x99, 0xAA}, // Ôë
- {0xBABF, 0x568E}, //{0xE5, 0x9A, 0x8E}, // º¿
- {0xCFF9, 0x56A3}, //{0xE5, 0x9A, 0xA3}, // Ïù
- {0xC8C2, 0x56B7}, //{0xE5, 0x9A, 0xB7}, // ÈÂ
- {0xBDC0, 0x56BC}, //{0xE5, 0x9A, 0xBC}, // ½À
- {0xC4D2, 0x56CA}, //{0xE5, 0x9B, 0x8A}, // ÄÒ
- {0xC7F4, 0x56DA}, //{0xE5, 0x9B, 0x9A}, // Çô
- {0xCBC4, 0x56DB}, //{0xE5, 0x9B, 0x9B}, // ËÄ
- {0xBBD8, 0x56DE}, //{0xE5, 0x9B, 0x9E}, // ȯ
- {0xD2F2, 0x56E0}, //{0xE5, 0x9B, 0xA0}, // Òò
- {0xCDC5, 0x56E2}, //{0xE5, 0x9B, 0xA2}, // ÍÅ
- {0xB6DA, 0x56E4}, //{0xE5, 0x9B, 0xA4}, // ¶Ú
+ {0xD4EB, 0x566A}, //{0xE5, 0x99, 0xAA}, // ��
+ {0xBABF, 0x568E}, //{0xE5, 0x9A, 0x8E}, // ��
+ {0xCFF9, 0x56A3}, //{0xE5, 0x9A, 0xA3}, // ��
+ {0xC8C2, 0x56B7}, //{0xE5, 0x9A, 0xB7}, // ��
+ {0xBDC0, 0x56BC}, //{0xE5, 0x9A, 0xBC}, // ��
+ {0xC4D2, 0x56CA}, //{0xE5, 0x9B, 0x8A}, // ��
+ {0xC7F4, 0x56DA}, //{0xE5, 0x9B, 0x9A}, // ��
+ {0xCBC4, 0x56DB}, //{0xE5, 0x9B, 0x9B}, // ��
+ {0xBBD8, 0x56DE}, //{0xE5, 0x9B, 0x9E}, // ��
+ {0xD2F2, 0x56E0}, //{0xE5, 0x9B, 0xA0}, // ��
+ {0xCDC5, 0x56E2}, //{0xE5, 0x9B, 0xA2}, // ��
+ {0xB6DA, 0x56E4}, //{0xE5, 0x9B, 0xA4}, // ��
{0xD4B0, 0x56ED}, //{0xE5, 0x9B, 0xAD}, // Ô°
- {0xC0A7, 0x56F0}, //{0xE5, 0x9B, 0xB0}, // ˤ
- {0xB4D1, 0x56F1}, //{0xE5, 0x9B, 0xB1}, // ´Ñ
+ {0xC0A7, 0x56F0}, //{0xE5, 0x9B, 0xB0}, // '
+ {0xB4D1, 0x56F1}, //{0xE5, 0x9B, 0xB1}, // ��
{0xCEA7, 0x56F4}, //{0xE5, 0x9B, 0xB4}, // Χ
- {0xB9CC, 0x56FA}, //{0xE5, 0x9B, 0xBA}, // ¹Ì
- {0xB9FA, 0x56FD}, //{0xE5, 0x9B, 0xBD}, // ¹ú
+ {0xB9CC, 0x56FA}, //{0xE5, 0x9B, 0xBA}, // ��
+ {0xB9FA, 0x56FD}, //{0xE5, 0x9B, 0xBD}, // ��
{0xCDBC, 0x56FE}, //{0xE5, 0x9B, 0xBE}, // ͼ
- {0xC6D4, 0x5703}, //{0xE5, 0x9C, 0x83}, // ÆÔ
+ {0xC6D4, 0x5703}, //{0xE5, 0x9C, 0x83}, // ��
{0xD4B2, 0x5706}, //{0xE5, 0x9C, 0x86}, // Ô²
{0xC8A6, 0x5708}, //{0xE5, 0x9C, 0x88}, // Ȧ
- {0xCDC1, 0x571F}, //{0xE5, 0x9C, 0x9F}, // ÍÁ
+ {0xCDC1, 0x571F}, //{0xE5, 0x9C, 0x9F}, // ��
{0xCAA5, 0x5723}, //{0xE5, 0x9C, 0xA3}, // ʥ
- {0xD4DA, 0x5728}, //{0xE5, 0x9C, 0xA8}, // ÔÚ
- {0xB5D8, 0x5730}, //{0xE5, 0x9C, 0xB0}, // µØ
- {0xB3A1, 0x573A}, //{0xE5, 0x9C, 0xBA}, // ³¡
- {0xBBF8, 0x573E}, //{0xE5, 0x9C, 0xBE}, // »ø
+ {0xD4DA, 0x5728}, //{0xE5, 0x9C, 0xA8}, // ��
+ {0xB5D8, 0x5730}, //{0xE5, 0x9C, 0xB0}, // ��
+ {0xB3A1, 0x573A}, //{0xE5, 0x9C, 0xBA}, // ��
+ {0xBBF8, 0x573E}, //{0xE5, 0x9C, 0xBE}, // ��
{0xD6B7, 0x5740}, //{0xE5, 0x9D, 0x80}, // Ö·
- {0xBEF9, 0x5747}, //{0xE5, 0x9D, 0x87}, // ¾ù
- {0xB7BB, 0x574A}, //{0xE5, 0x9D, 0x8A}, // ·»
- {0xBFB2, 0x574E}, //{0xE5, 0x9D, 0x8E}, // ¿²
- {0xBBB5, 0x574F}, //{0xE5, 0x9D, 0x8F}, // »µ
- {0xD7F8, 0x5750}, //{0xE5, 0x9D, 0x90}, // ×ø
- {0xBFD3, 0x5751}, //{0xE5, 0x9D, 0x91}, // ¿Ó
- {0xBFE9, 0x5757}, //{0xE5, 0x9D, 0x97}, // ¿é
- {0xBCE1, 0x575A}, //{0xE5, 0x9D, 0x9A}, // ¼á
+ {0xBEF9, 0x5747}, //{0xE5, 0x9D, 0x87}, // ��
+ {0xB7BB, 0x574A}, //{0xE5, 0x9D, 0x8A}, // ��
+ {0xBFB2, 0x574E}, //{0xE5, 0x9D, 0x8E}, // ��
+ {0xBBB5, 0x574F}, //{0xE5, 0x9D, 0x8F}, // ��
+ {0xD7F8, 0x5750}, //{0xE5, 0x9D, 0x90}, // ��
+ {0xBFD3, 0x5751}, //{0xE5, 0x9D, 0x91}, // ��
+ {0xBFE9, 0x5757}, //{0xE5, 0x9D, 0x97}, // ��
+ {0xBCE1, 0x575A}, //{0xE5, 0x9D, 0x9A}, // ��
{0xCCB3, 0x575B}, //{0xE5, 0x9D, 0x9B}, // ̳
- {0xB0D3, 0x575D}, //{0xE5, 0x9D, 0x9D}, // °Ó
- {0xCEEB, 0x575E}, //{0xE5, 0x9D, 0x9E}, // Îë
- {0xB7D8, 0x575F}, //{0xE5, 0x9D, 0x9F}, // ·Ø
+ {0xB0D3, 0x575D}, //{0xE5, 0x9D, 0x9D}, // ��
+ {0xCEEB, 0x575E}, //{0xE5, 0x9D, 0x9E}, // ��
+ {0xB7D8, 0x575F}, //{0xE5, 0x9D, 0x9F}, // ��
{0xD7B9, 0x5760}, //{0xE5, 0x9D, 0xA0}, // ×¹
- {0xC6C2, 0x5761}, //{0xE5, 0x9D, 0xA1}, // ÆÂ
- {0xC0A4, 0x5764}, //{0xE5, 0x9D, 0xA4}, // À¤
+ {0xC6C2, 0x5761}, //{0xE5, 0x9D, 0xA1}, // ��
+ {0xC0A4, 0x5764}, //{0xE5, 0x9D, 0xA4}, // $
{0xCCB9, 0x5766}, //{0xE5, 0x9D, 0xA6}, // ̹
{0xC6BA, 0x576A}, //{0xE5, 0x9D, 0xAA}, // ƺ
- {0xC5F7, 0x576F}, //{0xE5, 0x9D, 0xAF}, // Å÷
- {0xBFC0, 0x5777}, //{0xE5, 0x9D, 0xB7}, // ¿À
- {0xB4B9, 0x5782}, //{0xE5, 0x9E, 0x82}, // ´¹
- {0xC0AC, 0x5783}, //{0xE5, 0x9E, 0x83}, // À¬
+ {0xC5F7, 0x576F}, //{0xE5, 0x9D, 0xAF}, // ��
+ {0xBFC0, 0x5777}, //{0xE5, 0x9D, 0xB7}, // ��
+ {0xB4B9, 0x5782}, //{0xE5, 0x9E, 0x82}, // ��
+ {0xC0AC, 0x5783}, //{0xE5, 0x9E, 0x83}, // ,
{0xC2A2, 0x5784}, //{0xE5, 0x9E, 0x84}, // ¢
- {0xD0CD, 0x578B}, //{0xE5, 0x9E, 0x8B}, // ÐÍ
- {0xC0DD, 0x5792}, //{0xE5, 0x9E, 0x92}, // ÀÝ
- {0xB6E2, 0x579B}, //{0xE5, 0x9E, 0x9B}, // ¶â
- {0xB9B8, 0x57A2}, //{0xE5, 0x9E, 0xA2}, // ¹¸
- {0xBFD1, 0x57A6}, //{0xE5, 0x9E, 0xA6}, // ¿Ñ
- {0xB5E6, 0x57AB}, //{0xE5, 0x9E, 0xAB}, // µæ
- {0xBFE5, 0x57AE}, //{0xE5, 0x9E, 0xAE}, // ¿å
- {0xB9A1, 0x57C2}, //{0xE5, 0x9F, 0x82}, // ¹¡
- {0xB0A3, 0x57C3}, //{0xE5, 0x9F, 0x83}, // °£
- {0xC2F1, 0x57CB}, //{0xE5, 0x9F, 0x8B}, // Âñ
- {0xB3C7, 0x57CE}, //{0xE5, 0x9F, 0x8E}, // ³Ç
- {0xD3F2, 0x57DF}, //{0xE5, 0x9F, 0x9F}, // Óò
- {0xB2BA, 0x57E0}, //{0xE5, 0x9F, 0xA0}, // ²º
- {0xC5E0, 0x57F9}, //{0xE5, 0x9F, 0xB9}, // Åà
- {0xBBF9, 0x57FA}, //{0xE5, 0x9F, 0xBA}, // »ù
- {0xCCC3, 0x5802}, //{0xE5, 0xA0, 0x82}, // ÌÃ
- {0xB6D1, 0x5806}, //{0xE5, 0xA0, 0x86}, // ¶Ñ
- {0xB6E9, 0x5815}, //{0xE5, 0xA0, 0x95}, // ¶é
- {0xB1A4, 0x5821}, //{0xE5, 0xA0, 0xA1}, // ±¤
- {0xB5CC, 0x5824}, //{0xE5, 0xA0, 0xA4}, // µÌ
- {0xBFB0, 0x582A}, //{0xE5, 0xA0, 0xAA}, // ¿°
- {0xD1DF, 0x5830}, //{0xE5, 0xA0, 0xB0}, // Ñß
- {0xB6C2, 0x5835}, //{0xE5, 0xA0, 0xB5}, // ¶Â
- {0xCBFA, 0x584C}, //{0xE5, 0xA1, 0x8C}, // Ëú
- {0xCBDC, 0x5851}, //{0xE5, 0xA1, 0x91}, // ËÜ
- {0xCBFE, 0x5854}, //{0xE5, 0xA1, 0x94}, // Ëþ
- {0xCCC1, 0x5858}, //{0xE5, 0xA1, 0x98}, // ÌÁ
- {0xC8FB, 0x585E}, //{0xE5, 0xA1, 0x9E}, // Èû
- {0xCCEE, 0x586B}, //{0xE5, 0xA1, 0xAB}, // Ìî
- {0xBEB3, 0x5883}, //{0xE5, 0xA2, 0x83}, // ¾³
- {0xCAFB, 0x5885}, //{0xE5, 0xA2, 0x85}, // Êû
+ {0xD0CD, 0x578B}, //{0xE5, 0x9E, 0x8B}, // ��
+ {0xC0DD, 0x5792}, //{0xE5, 0x9E, 0x92}, // ��
+ {0xB6E2, 0x579B}, //{0xE5, 0x9E, 0x9B}, // ��
+ {0xB9B8, 0x57A2}, //{0xE5, 0x9E, 0xA2}, // ��
+ {0xBFD1, 0x57A6}, //{0xE5, 0x9E, 0xA6}, // ��
+ {0xB5E6, 0x57AB}, //{0xE5, 0x9E, 0xAB}, // ��
+ {0xBFE5, 0x57AE}, //{0xE5, 0x9E, 0xAE}, // ��
+ {0xB9A1, 0x57C2}, //{0xE5, 0x9F, 0x82}, // ��
+ {0xB0A3, 0x57C3}, //{0xE5, 0x9F, 0x83}, // ��
+ {0xC2F1, 0x57CB}, //{0xE5, 0x9F, 0x8B}, // ��
+ {0xB3C7, 0x57CE}, //{0xE5, 0x9F, 0x8E}, // ��
+ {0xD3F2, 0x57DF}, //{0xE5, 0x9F, 0x9F}, // ��
+ {0xB2BA, 0x57E0}, //{0xE5, 0x9F, 0xA0}, // ��
+ {0xC5E0, 0x57F9}, //{0xE5, 0x9F, 0xB9}, // ��
+ {0xBBF9, 0x57FA}, //{0xE5, 0x9F, 0xBA}, // ��
+ {0xCCC3, 0x5802}, //{0xE5, 0xA0, 0x82}, // ��
+ {0xB6D1, 0x5806}, //{0xE5, 0xA0, 0x86}, // ��
+ {0xB6E9, 0x5815}, //{0xE5, 0xA0, 0x95}, // ��
+ {0xB1A4, 0x5821}, //{0xE5, 0xA0, 0xA1}, // ��
+ {0xB5CC, 0x5824}, //{0xE5, 0xA0, 0xA4}, // ��
+ {0xBFB0, 0x582A}, //{0xE5, 0xA0, 0xAA}, // ��
+ {0xD1DF, 0x5830}, //{0xE5, 0xA0, 0xB0}, // ��
+ {0xB6C2, 0x5835}, //{0xE5, 0xA0, 0xB5}, // ��
+ {0xCBFA, 0x584C}, //{0xE5, 0xA1, 0x8C}, // ��
+ {0xCBDC, 0x5851}, //{0xE5, 0xA1, 0x91}, // ��
+ {0xCBFE, 0x5854}, //{0xE5, 0xA1, 0x94}, // ��
+ {0xCCC1, 0x5858}, //{0xE5, 0xA1, 0x98}, // ��
+ {0xC8FB, 0x585E}, //{0xE5, 0xA1, 0x9E}, // ��
+ {0xCCEE, 0x586B}, //{0xE5, 0xA1, 0xAB}, // ��
+ {0xBEB3, 0x5883}, //{0xE5, 0xA2, 0x83}, // ��
+ {0xCAFB, 0x5885}, //{0xE5, 0xA2, 0x85}, // ��
{0xC4B9, 0x5893}, //{0xE5, 0xA2, 0x93}, // Ĺ
{0xC7BD, 0x5899}, //{0xE5, 0xA2, 0x99}, // ǽ
- {0xD4F6, 0x589E}, //{0xE5, 0xA2, 0x9E}, // Ôö
+ {0xD4F6, 0x589E}, //{0xE5, 0xA2, 0x9E}, // ��
{0xC4AB, 0x58A8}, //{0xE5, 0xA2, 0xA8}, // Ä«
- {0xB6D5, 0x58A9}, //{0xE5, 0xA2, 0xA9}, // ¶Õ
- {0xB1DA, 0x58C1}, //{0xE5, 0xA3, 0x81}, // ±Ú
- {0xBABE, 0x58D5}, //{0xE5, 0xA3, 0x95}, // º¾
- {0xC8C0, 0x58E4}, //{0xE5, 0xA3, 0xA4}, // ÈÀ
+ {0xB6D5, 0x58A9}, //{0xE5, 0xA2, 0xA9}, // ��
+ {0xB1DA, 0x58C1}, //{0xE5, 0xA3, 0x81}, // ��
+ {0xBABE, 0x58D5}, //{0xE5, 0xA3, 0x95}, // ��
+ {0xC8C0, 0x58E4}, //{0xE5, 0xA3, 0xA4}, // ��
{0xCABF, 0x58EB}, //{0xE5, 0xA3, 0xAB}, // Ê¿
{0xD7B3, 0x58EE}, //{0xE5, 0xA3, 0xAE}, // ׳
- {0xC9F9, 0x58F0}, //{0xE5, 0xA3, 0xB0}, // Éù
- {0xBFC7, 0x58F3}, //{0xE5, 0xA3, 0xB3}, // ¿Ç
- {0xBAF8, 0x58F6}, //{0xE5, 0xA3, 0xB6}, // ºø
+ {0xC9F9, 0x58F0}, //{0xE5, 0xA3, 0xB0}, // ��
+ {0xBFC7, 0x58F3}, //{0xE5, 0xA3, 0xB3}, // ��
+ {0xBAF8, 0x58F6}, //{0xE5, 0xA3, 0xB6}, // ��
{0xD2BC, 0x58F9}, //{0xE5, 0xA3, 0xB9}, // Ò¼
- {0xB4A6, 0x5904}, //{0xE5, 0xA4, 0x84}, // ´¦
- {0xB1B8, 0x5907}, //{0xE5, 0xA4, 0x87}, // ±¸
- {0xB8B4, 0x590D}, //{0xE5, 0xA4, 0x8D}, // ¸´
- {0xCFC4, 0x590F}, //{0xE5, 0xA4, 0x8F}, // ÏÄ
+ {0xB4A6, 0x5904}, //{0xE5, 0xA4, 0x84}, // ��
+ {0xB1B8, 0x5907}, //{0xE5, 0xA4, 0x87}, // ��
+ {0xB8B4, 0x590D}, //{0xE5, 0xA4, 0x8D}, // ��
+ {0xCFC4, 0x590F}, //{0xE5, 0xA4, 0x8F}, // ��
{0xCFA6, 0x5915}, //{0xE5, 0xA4, 0x95}, // Ϧ
- {0xCDE2, 0x5916}, //{0xE5, 0xA4, 0x96}, // Íâ
- {0xB6E0, 0x591A}, //{0xE5, 0xA4, 0x9A}, // ¶à
+ {0xCDE2, 0x5916}, //{0xE5, 0xA4, 0x96}, // ��
+ {0xB6E0, 0x591A}, //{0xE5, 0xA4, 0x9A}, // ��
{0xD2B9, 0x591C}, //{0xE5, 0xA4, 0x9C}, // Ò¹
- {0xB9BB, 0x591F}, //{0xE5, 0xA4, 0x9F}, // ¹»
- {0xB4F3, 0x5927}, //{0xE5, 0xA4, 0xA7}, // ´ó
- {0xCCEC, 0x5929}, //{0xE5, 0xA4, 0xA9}, // Ìì
+ {0xB9BB, 0x591F}, //{0xE5, 0xA4, 0x9F}, // ��
+ {0xB4F3, 0x5927}, //{0xE5, 0xA4, 0xA7}, // ��
+ {0xCCEC, 0x5929}, //{0xE5, 0xA4, 0xA9}, // ��
{0xCCAB, 0x592A}, //{0xE5, 0xA4, 0xAA}, // Ì«
- {0xB7F2, 0x592B}, //{0xE5, 0xA4, 0xAB}, // ·ò
+ {0xB7F2, 0x592B}, //{0xE5, 0xA4, 0xAB}, // ��
{0xD8B2, 0x592D}, //{0xE5, 0xA4, 0xAD}, // ز
- {0xD1EB, 0x592E}, //{0xE5, 0xA4, 0xAE}, // Ñë
- {0xBABB, 0x592F}, //{0xE5, 0xA4, 0xAF}, // º»
+ {0xD1EB, 0x592E}, //{0xE5, 0xA4, 0xAE}, // ��
+ {0xBABB, 0x592F}, //{0xE5, 0xA4, 0xAF}, // ��
{0xCAA7, 0x5931}, //{0xE5, 0xA4, 0xB1}, // ʧ
{0xCDB7, 0x5934}, //{0xE5, 0xA4, 0xB4}, // Í·
- {0xD2C4, 0x5937}, //{0xE5, 0xA4, 0xB7}, // ÒÄ
- {0xBFE4, 0x5938}, //{0xE5, 0xA4, 0xB8}, // ¿ä
- {0xBCD0, 0x5939}, //{0xE5, 0xA4, 0xB9}, // ¼Ð
- {0xB6E1, 0x593A}, //{0xE5, 0xA4, 0xBA}, // ¶á
- {0xD1D9, 0x5944}, //{0xE5, 0xA5, 0x84}, // ÑÙ
- {0xC6E6, 0x5947}, //{0xE5, 0xA5, 0x87}, // Ææ
- {0xC4CE, 0x5948}, //{0xE5, 0xA5, 0x88}, // ÄÎ
- {0xB7EE, 0x5949}, //{0xE5, 0xA5, 0x89}, // ·î
- {0xB7DC, 0x594B}, //{0xE5, 0xA5, 0x8B}, // ·Ü
- {0xD7E0, 0x594F}, //{0xE5, 0xA5, 0x8F}, // ×à
- {0xC6F5, 0x5951}, //{0xE5, 0xA5, 0x91}, // Æõ
- {0xB1BC, 0x5954}, //{0xE5, 0xA5, 0x94}, // ±¼
- {0xDEC8, 0x5955}, //{0xE5, 0xA5, 0x95}, // ÞÈ
- {0xBDB1, 0x5956}, //{0xE5, 0xA5, 0x96}, // ½±
- {0xCCD7, 0x5957}, //{0xE5, 0xA5, 0x97}, // Ì×
- {0xB5EC, 0x5960}, //{0xE5, 0xA5, 0xA0}, // µì
- {0xC9DD, 0x5962}, //{0xE5, 0xA5, 0xA2}, // ÉÝ
- {0xB0C2, 0x5965}, //{0xE5, 0xA5, 0xA5}, // °Â
+ {0xD2C4, 0x5937}, //{0xE5, 0xA4, 0xB7}, // ��
+ {0xBFE4, 0x5938}, //{0xE5, 0xA4, 0xB8}, // ��
+ {0xBCD0, 0x5939}, //{0xE5, 0xA4, 0xB9}, // ��
+ {0xB6E1, 0x593A}, //{0xE5, 0xA4, 0xBA}, // ��
+ {0xD1D9, 0x5944}, //{0xE5, 0xA5, 0x84}, // ��
+ {0xC6E6, 0x5947}, //{0xE5, 0xA5, 0x87}, // ��
+ {0xC4CE, 0x5948}, //{0xE5, 0xA5, 0x88}, // ��
+ {0xB7EE, 0x5949}, //{0xE5, 0xA5, 0x89}, // ��
+ {0xB7DC, 0x594B}, //{0xE5, 0xA5, 0x8B}, // ��
+ {0xD7E0, 0x594F}, //{0xE5, 0xA5, 0x8F}, // ��
+ {0xC6F5, 0x5951}, //{0xE5, 0xA5, 0x91}, // ��
+ {0xB1BC, 0x5954}, //{0xE5, 0xA5, 0x94}, // ��
+ {0xDEC8, 0x5955}, //{0xE5, 0xA5, 0x95}, // ��
+ {0xBDB1, 0x5956}, //{0xE5, 0xA5, 0x96}, // ��
+ {0xCCD7, 0x5957}, //{0xE5, 0xA5, 0x97}, // ��
+ {0xB5EC, 0x5960}, //{0xE5, 0xA5, 0xA0}, // ��
+ {0xC9DD, 0x5962}, //{0xE5, 0xA5, 0xA2}, // ��
+ {0xB0C2, 0x5965}, //{0xE5, 0xA5, 0xA5}, // ��
{0xC5AE, 0x5973}, //{0xE5, 0xA5, 0xB3}, // Å®
{0xC5AB, 0x5974}, //{0xE5, 0xA5, 0xB4}, // Å«
- {0xC4CC, 0x5976}, //{0xE5, 0xA5, 0xB6}, // ÄÌ
- {0xBCE9, 0x5978}, //{0xE5, 0xA5, 0xB8}, // ¼é
- {0xCBFD, 0x5979}, //{0xE5, 0xA5, 0xB9}, // Ëý
- {0xBAC3, 0x597D}, //{0xE5, 0xA5, 0xBD}, // ºÃ
- {0xC8E7, 0x5982}, //{0xE5, 0xA6, 0x82}, // Èç
- {0xCDFD, 0x5984}, //{0xE5, 0xA6, 0x84}, // Íý
+ {0xC4CC, 0x5976}, //{0xE5, 0xA5, 0xB6}, // ��
+ {0xBCE9, 0x5978}, //{0xE5, 0xA5, 0xB8}, // ��
+ {0xCBFD, 0x5979}, //{0xE5, 0xA5, 0xB9}, // ��
+ {0xBAC3, 0x597D}, //{0xE5, 0xA5, 0xBD}, // ��
+ {0xC8E7, 0x5982}, //{0xE5, 0xA6, 0x82}, // ��
+ {0xCDFD, 0x5984}, //{0xE5, 0xA6, 0x84}, // ��
{0xD7B1, 0x5986}, //{0xE5, 0xA6, 0x86}, // ×±
- {0xB8BE, 0x5987}, //{0xE5, 0xA6, 0x87}, // ¸¾
- {0xC2E8, 0x5988}, //{0xE5, 0xA6, 0x88}, // Âè
- {0xB6CA, 0x5992}, //{0xE5, 0xA6, 0x92}, // ¶Ê
- {0xBCCB, 0x5993}, //{0xE5, 0xA6, 0x93}, // ¼Ë
- {0xD1FD, 0x5996}, //{0xE5, 0xA6, 0x96}, // Ñý
- {0xC3EE, 0x5999}, //{0xE5, 0xA6, 0x99}, // Ãî
- {0xCDD7, 0x59A5}, //{0xE5, 0xA6, 0xA5}, // Í×
- {0xB7C1, 0x59A8}, //{0xE5, 0xA6, 0xA8}, // ·Á
- {0xC3C3, 0x59B9}, //{0xE5, 0xA6, 0xB9}, // ÃÃ
- {0xC6DE, 0x59BB}, //{0xE5, 0xA6, 0xBB}, // ÆÞ
+ {0xB8BE, 0x5987}, //{0xE5, 0xA6, 0x87}, // ��
+ {0xC2E8, 0x5988}, //{0xE5, 0xA6, 0x88}, // ��
+ {0xB6CA, 0x5992}, //{0xE5, 0xA6, 0x92}, // ��
+ {0xBCCB, 0x5993}, //{0xE5, 0xA6, 0x93}, // ��
+ {0xD1FD, 0x5996}, //{0xE5, 0xA6, 0x96}, // ��
+ {0xC3EE, 0x5999}, //{0xE5, 0xA6, 0x99}, // ��
+ {0xCDD7, 0x59A5}, //{0xE5, 0xA6, 0xA5}, // ��
+ {0xB7C1, 0x59A8}, //{0xE5, 0xA6, 0xA8}, // ��
+ {0xC3C3, 0x59B9}, //{0xE5, 0xA6, 0xB9}, // ��
+ {0xC6DE, 0x59BB}, //{0xE5, 0xA6, 0xBB}, // ��
{0xC4B7, 0x59C6}, //{0xE5, 0xA7, 0x86}, // Ä·
- {0xE6A2, 0x59CA}, //{0xE5, 0xA7, 0x8A}, // æ¢
+ {0xE6A2, 0x59CA}, //{0xE5, 0xA7, 0x8A}, // �
{0xCABC, 0x59CB}, //{0xE5, 0xA7, 0x8B}, // ʼ
- {0xBDE3, 0x59D0}, //{0xE5, 0xA7, 0x90}, // ½ã
- {0xB9C3, 0x59D1}, //{0xE5, 0xA7, 0x91}, // ¹Ã
- {0xD0D5, 0x59D3}, //{0xE5, 0xA7, 0x93}, // ÐÕ
+ {0xBDE3, 0x59D0}, //{0xE5, 0xA7, 0x90}, // ��
+ {0xB9C3, 0x59D1}, //{0xE5, 0xA7, 0x91}, // ��
+ {0xD0D5, 0x59D3}, //{0xE5, 0xA7, 0x93}, // ��
{0xCEAF, 0x59D4}, //{0xE5, 0xA7, 0x94}, // ί
{0xD2A6, 0x59DA}, //{0xE5, 0xA7, 0x9A}, // Ò¦
- {0xBDAA, 0x59DC}, //{0xE5, 0xA7, 0x9C}, // ½ª
- {0xC0D1, 0x59E5}, //{0xE5, 0xA7, 0xA5}, // ÀÑ
- {0xD2CC, 0x59E8}, //{0xE5, 0xA7, 0xA8}, // ÒÌ
- {0xD2F6, 0x59FB}, //{0xE5, 0xA7, 0xBB}, // Òö
- {0xD7CB, 0x59FF}, //{0xE5, 0xA7, 0xBF}, // ×Ë
- {0xCDFE, 0x5A01}, //{0xE5, 0xA8, 0x81}, // Íþ
- {0xCDDE, 0x5A03}, //{0xE5, 0xA8, 0x83}, // ÍÞ
+ {0xBDAA, 0x59DC}, //{0xE5, 0xA7, 0x9C}, // ��
+ {0xC0D1, 0x59E5}, //{0xE5, 0xA7, 0xA5}, // ��
+ {0xD2CC, 0x59E8}, //{0xE5, 0xA7, 0xA8}, // ��
+ {0xD2F6, 0x59FB}, //{0xE5, 0xA7, 0xBB}, // ��
+ {0xD7CB, 0x59FF}, //{0xE5, 0xA7, 0xBF}, // ��
+ {0xCDFE, 0x5A01}, //{0xE5, 0xA8, 0x81}, // ��
+ {0xCDDE, 0x5A03}, //{0xE5, 0xA8, 0x83}, // ��
{0xC2A6, 0x5A04}, //{0xE5, 0xA8, 0x84}, // ¦
- {0xBDBF, 0x5A07}, //{0xE5, 0xA8, 0x87}, // ½¿
- {0xC4EF, 0x5A18}, //{0xE5, 0xA8, 0x98}, // Äï
- {0xC4C8, 0x5A1C}, //{0xE5, 0xA8, 0x9C}, // ÄÈ
- {0xC3E4, 0x5A29}, //{0xE5, 0xA8, 0xA9}, // Ãä
- {0xD3E9, 0x5A31}, //{0xE5, 0xA8, 0xB1}, // Óé
+ {0xBDBF, 0x5A07}, //{0xE5, 0xA8, 0x87}, // ��
+ {0xC4EF, 0x5A18}, //{0xE5, 0xA8, 0x98}, // ��
+ {0xC4C8, 0x5A1C}, //{0xE5, 0xA8, 0x9C}, // ��
+ {0xC3E4, 0x5A29}, //{0xE5, 0xA8, 0xA9}, // ��
+ {0xD3E9, 0x5A31}, //{0xE5, 0xA8, 0xB1}, // ��
{0xC8A2, 0x5A36}, //{0xE5, 0xA8, 0xB6}, // Ȣ
- {0xC6C5, 0x5A46}, //{0xE5, 0xA9, 0x86}, // ÆÅ
- {0xCDF1, 0x5A49}, //{0xE5, 0xA9, 0x89}, // Íñ
- {0xBBE9, 0x5A5A}, //{0xE5, 0xA9, 0x9A}, // Ȏ
+ {0xC6C5, 0x5A46}, //{0xE5, 0xA9, 0x86}, // ��
+ {0xCDF1, 0x5A49}, //{0xE5, 0xA9, 0x89}, // ��
+ {0xBBE9, 0x5A5A}, //{0xE5, 0xA9, 0x9A}, // ��
{0xD3A4, 0x5A74}, //{0xE5, 0xA9, 0xB4}, // Ó¤
- {0xC9F4, 0x5A76}, //{0xE5, 0xA9, 0xB6}, // Éô
- {0xD0F6, 0x5A7F}, //{0xE5, 0xA9, 0xBF}, // Ðö
+ {0xC9F4, 0x5A76}, //{0xE5, 0xA9, 0xB6}, // ��
+ {0xD0F6, 0x5A7F}, //{0xE5, 0xA9, 0xBF}, // ��
{0xC3BD, 0x5A92}, //{0xE5, 0xAA, 0x92}, // ý
- {0xC3C4, 0x5A9A}, //{0xE5, 0xAA, 0x9A}, // ÃÄ
+ {0xC3C4, 0x5A9A}, //{0xE5, 0xAA, 0x9A}, // ��
{0xCFB1, 0x5AB3}, //{0xE5, 0xAA, 0xB3}, // ϱ
- {0xBCDE, 0x5AC1}, //{0xE5, 0xAB, 0x81}, // ¼Þ
+ {0xBCDE, 0x5AC1}, //{0xE5, 0xAB, 0x81}, // ��
{0xC9A9, 0x5AC2}, //{0xE5, 0xAB, 0x82}, // É©
- {0xBCB5, 0x5AC9}, //{0xE5, 0xAB, 0x89}, // ¼µ
- {0xCFD3, 0x5ACC}, //{0xE5, 0xAB, 0x8C}, // ÏÓ
- {0xB5D5, 0x5AE1}, //{0xE5, 0xAB, 0xA1}, // µÕ
- {0xC4DB, 0x5AE9}, //{0xE5, 0xAB, 0xA9}, // ÄÛ
- {0xE6D2, 0x5B09}, //{0xE5, 0xAC, 0x89}, // æÒ
- {0xD7D3, 0x5B50}, //{0xE5, 0xAD, 0x90}, // ×Ó
- {0xBFD7, 0x5B54}, //{0xE5, 0xAD, 0x94}, // ¿×
- {0xD4D0, 0x5B55}, //{0xE5, 0xAD, 0x95}, // ÔÐ
- {0xD7D6, 0x5B57}, //{0xE5, 0xAD, 0x97}, // ×Ö
- {0xB4E6, 0x5B58}, //{0xE5, 0xAD, 0x98}, // ´æ
- {0xCBEF, 0x5B59}, //{0xE5, 0xAD, 0x99}, // Ëï
+ {0xBCB5, 0x5AC9}, //{0xE5, 0xAB, 0x89}, // ��
+ {0xCFD3, 0x5ACC}, //{0xE5, 0xAB, 0x8C}, // ��
+ {0xB5D5, 0x5AE1}, //{0xE5, 0xAB, 0xA1}, // ��
+ {0xC4DB, 0x5AE9}, //{0xE5, 0xAB, 0xA9}, // ��
+ {0xE6D2, 0x5B09}, //{0xE5, 0xAC, 0x89}, // ��
+ {0xD7D3, 0x5B50}, //{0xE5, 0xAD, 0x90}, // ��
+ {0xBFD7, 0x5B54}, //{0xE5, 0xAD, 0x94}, // ��
+ {0xD4D0, 0x5B55}, //{0xE5, 0xAD, 0x95}, // ��
+ {0xD7D6, 0x5B57}, //{0xE5, 0xAD, 0x97}, // ��
+ {0xB4E6, 0x5B58}, //{0xE5, 0xAD, 0x98}, // ��
+ {0xCBEF, 0x5B59}, //{0xE5, 0xAD, 0x99}, // ��
{0xD0A2, 0x5B5D}, //{0xE5, 0xAD, 0x9D}, // Т
- {0xC3CF, 0x5B5F}, //{0xE5, 0xAD, 0x9F}, // ÃÏ
- {0xBCBE, 0x5B63}, //{0xE5, 0xAD, 0xA3}, // ¼¾
- {0xB9C2, 0x5B64}, //{0xE5, 0xAD, 0xA4}, // ¹Â
+ {0xC3CF, 0x5B5F}, //{0xE5, 0xAD, 0x9F}, // ��
+ {0xBCBE, 0x5B63}, //{0xE5, 0xAD, 0xA3}, // ��
+ {0xB9C2, 0x5B64}, //{0xE5, 0xAD, 0xA4}, // ��
{0xD1A7, 0x5B66}, //{0xE5, 0xAD, 0xA6}, // ѧ
- {0xBAA2, 0x5B69}, //{0xE5, 0xAD, 0xA9}, // º¢
- {0xB7F5, 0x5B75}, //{0xE5, 0xAD, 0xB5}, // ·õ
- {0xC4F5, 0x5B7D}, //{0xE5, 0xAD, 0xBD}, // Äõ
- {0xC4FE, 0x5B81}, //{0xE5, 0xAE, 0x81}, // Äþ
- {0xCBFC, 0x5B83}, //{0xE5, 0xAE, 0x83}, // Ëü
+ {0xBAA2, 0x5B69}, //{0xE5, 0xAD, 0xA9}, // ��
+ {0xB7F5, 0x5B75}, //{0xE5, 0xAD, 0xB5}, // ��
+ {0xC4F5, 0x5B7D}, //{0xE5, 0xAD, 0xBD}, // ��
+ {0xC4FE, 0x5B81}, //{0xE5, 0xAE, 0x81}, // ��
+ {0xCBFC, 0x5B83}, //{0xE5, 0xAE, 0x83}, // ��
{0xD5AC, 0x5B85}, //{0xE5, 0xAE, 0x85}, // Õ¬
- {0xD3EE, 0x5B87}, //{0xE5, 0xAE, 0x87}, // Óî
- {0xCAD8, 0x5B88}, //{0xE5, 0xAE, 0x88}, // ÊØ
- {0xB0B2, 0x5B89}, //{0xE5, 0xAE, 0x89}, // °²
- {0xCBCE, 0x5B8B}, //{0xE5, 0xAE, 0x8B}, // ËÎ
- {0xCDEA, 0x5B8C}, //{0xE5, 0xAE, 0x8C}, // Íê
- {0xBAEA, 0x5B8F}, //{0xE5, 0xAE, 0x8F}, // ºê
- {0xD7DA, 0x5B97}, //{0xE5, 0xAE, 0x97}, // ×Ú
- {0xB9D9, 0x5B98}, //{0xE5, 0xAE, 0x98}, // ¹Ù
- {0xD6E6, 0x5B99}, //{0xE5, 0xAE, 0x99}, // Öæ
- {0xB6A8, 0x5B9A}, //{0xE5, 0xAE, 0x9A}, // ¶¨
- {0xCDF0, 0x5B9B}, //{0xE5, 0xAE, 0x9B}, // Íð
- {0xD2CB, 0x5B9C}, //{0xE5, 0xAE, 0x9C}, // ÒË
- {0xB1A6, 0x5B9D}, //{0xE5, 0xAE, 0x9D}, // ±¦
+ {0xD3EE, 0x5B87}, //{0xE5, 0xAE, 0x87}, // ��
+ {0xCAD8, 0x5B88}, //{0xE5, 0xAE, 0x88}, // ��
+ {0xB0B2, 0x5B89}, //{0xE5, 0xAE, 0x89}, // ��
+ {0xCBCE, 0x5B8B}, //{0xE5, 0xAE, 0x8B}, // ��
+ {0xCDEA, 0x5B8C}, //{0xE5, 0xAE, 0x8C}, // ��
+ {0xBAEA, 0x5B8F}, //{0xE5, 0xAE, 0x8F}, // ��
+ {0xD7DA, 0x5B97}, //{0xE5, 0xAE, 0x97}, // ��
+ {0xB9D9, 0x5B98}, //{0xE5, 0xAE, 0x98}, // ��
+ {0xD6E6, 0x5B99}, //{0xE5, 0xAE, 0x99}, // ��
+ {0xB6A8, 0x5B9A}, //{0xE5, 0xAE, 0x9A}, // ��
+ {0xCDF0, 0x5B9B}, //{0xE5, 0xAE, 0x9B}, // ��
+ {0xD2CB, 0x5B9C}, //{0xE5, 0xAE, 0x9C}, // ��
+ {0xB1A6, 0x5B9D}, //{0xE5, 0xAE, 0x9D}, // ��
{0xCAB5, 0x5B9E}, //{0xE5, 0xAE, 0x9E}, // ʵ
- {0xB3E8, 0x5BA0}, //{0xE5, 0xAE, 0xA0}, // ³è
- {0xC9F3, 0x5BA1}, //{0xE5, 0xAE, 0xA1}, // Éó
- {0xBFCD, 0x5BA2}, //{0xE5, 0xAE, 0xA2}, // ¿Í
- {0xD0FB, 0x5BA3}, //{0xE5, 0xAE, 0xA3}, // Ðû
- {0xCAD2, 0x5BA4}, //{0xE5, 0xAE, 0xA4}, // ÊÒ
- {0xBBC2, 0x5BA6}, //{0xE5, 0xAE, 0xA6}, // »Â
- {0xCFDC, 0x5BAA}, //{0xE5, 0xAE, 0xAA}, // ÏÜ
- {0xB9AC, 0x5BAB}, //{0xE5, 0xAE, 0xAB}, // ¹¬
- {0xD4D7, 0x5BB0}, //{0xE5, 0xAE, 0xB0}, // Ô×
- {0xBAA6, 0x5BB3}, //{0xE5, 0xAE, 0xB3}, // º¦
- {0xD1E7, 0x5BB4}, //{0xE5, 0xAE, 0xB4}, // Ñç
- {0xCFFC, 0x5BB5}, //{0xE5, 0xAE, 0xB5}, // Ïü
- {0xBCD2, 0x5BB6}, //{0xE5, 0xAE, 0xB6}, // ¼Ò
- {0xC8DD, 0x5BB9}, //{0xE5, 0xAE, 0xB9}, // ÈÝ
- {0xBFED, 0x5BBD}, //{0xE5, 0xAE, 0xBD}, // ¿í
- {0xB1F6, 0x5BBE}, //{0xE5, 0xAE, 0xBE}, // ±ö
- {0xCBDE, 0x5BBF}, //{0xE5, 0xAE, 0xBF}, // ËÞ
- {0xBCC5, 0x5BC2}, //{0xE5, 0xAF, 0x82}, // ¼Å
- {0xBCC4, 0x5BC4}, //{0xE5, 0xAF, 0x84}, // ¼Ä
- {0xC3DC, 0x5BC6}, //{0xE5, 0xAF, 0x86}, // ÃÜ
- {0xBFDC, 0x5BC7}, //{0xE5, 0xAF, 0x87}, // ¿Ü
- {0xB8BB, 0x5BCC}, //{0xE5, 0xAF, 0x8C}, // ¸»
- {0xBAAE, 0x5BD2}, //{0xE5, 0xAF, 0x92}, // º®
+ {0xB3E8, 0x5BA0}, //{0xE5, 0xAE, 0xA0}, // ��
+ {0xC9F3, 0x5BA1}, //{0xE5, 0xAE, 0xA1}, // ��
+ {0xBFCD, 0x5BA2}, //{0xE5, 0xAE, 0xA2}, // ��
+ {0xD0FB, 0x5BA3}, //{0xE5, 0xAE, 0xA3}, // ��
+ {0xCAD2, 0x5BA4}, //{0xE5, 0xAE, 0xA4}, // ��
+ {0xBBC2, 0x5BA6}, //{0xE5, 0xAE, 0xA6}, // ��
+ {0xCFDC, 0x5BAA}, //{0xE5, 0xAE, 0xAA}, // ��
+ {0xB9AC, 0x5BAB}, //{0xE5, 0xAE, 0xAB}, // ��
+ {0xD4D7, 0x5BB0}, //{0xE5, 0xAE, 0xB0}, // ��
+ {0xBAA6, 0x5BB3}, //{0xE5, 0xAE, 0xB3}, // ��
+ {0xD1E7, 0x5BB4}, //{0xE5, 0xAE, 0xB4}, // ��
+ {0xCFFC, 0x5BB5}, //{0xE5, 0xAE, 0xB5}, // ��
+ {0xBCD2, 0x5BB6}, //{0xE5, 0xAE, 0xB6}, // ��
+ {0xC8DD, 0x5BB9}, //{0xE5, 0xAE, 0xB9}, // ��
+ {0xBFED, 0x5BBD}, //{0xE5, 0xAE, 0xBD}, // ��
+ {0xB1F6, 0x5BBE}, //{0xE5, 0xAE, 0xBE}, // ��
+ {0xCBDE, 0x5BBF}, //{0xE5, 0xAE, 0xBF}, // ��
+ {0xBCC5, 0x5BC2}, //{0xE5, 0xAF, 0x82}, // ��
+ {0xBCC4, 0x5BC4}, //{0xE5, 0xAF, 0x84}, // ��
+ {0xC3DC, 0x5BC6}, //{0xE5, 0xAF, 0x86}, // ��
+ {0xBFDC, 0x5BC7}, //{0xE5, 0xAF, 0x87}, // ��
+ {0xB8BB, 0x5BCC}, //{0xE5, 0xAF, 0x8C}, // ��
+ {0xBAAE, 0x5BD2}, //{0xE5, 0xAF, 0x92}, // ��
{0xD4A2, 0x5BD3}, //{0xE5, 0xAF, 0x93}, // Ô¢
- {0xC7DE, 0x5BDD}, //{0xE5, 0xAF, 0x9D}, // ÇÞ
+ {0xC7DE, 0x5BDD}, //{0xE5, 0xAF, 0x9D}, // ��
{0xC4AF, 0x5BDE}, //{0xE5, 0xAF, 0x9E}, // į
- {0xB2EC, 0x5BDF}, //{0xE5, 0xAF, 0x9F}, // ²ì
- {0xB9D1, 0x5BE1}, //{0xE5, 0xAF, 0xA1}, // ¹Ñ
- {0xC1C8, 0x5BE5}, //{0xE5, 0xAF, 0xA5}, // ÁÈ
+ {0xB2EC, 0x5BDF}, //{0xE5, 0xAF, 0x9F}, // ��
+ {0xB9D1, 0x5BE1}, //{0xE5, 0xAF, 0xA1}, // ��
+ {0xC1C8, 0x5BE5}, //{0xE5, 0xAF, 0xA5}, // ��
{0xD5AF, 0x5BE8}, //{0xE5, 0xAF, 0xA8}, // Õ¯
- {0xB4E7, 0x5BF8}, //{0xE5, 0xAF, 0xB8}, // ´ç
- {0xB6D4, 0x5BF9}, //{0xE5, 0xAF, 0xB9}, // ¶Ô
- {0xCBC2, 0x5BFA}, //{0xE5, 0xAF, 0xBA}, // ËÂ
+ {0xB4E7, 0x5BF8}, //{0xE5, 0xAF, 0xB8}, // ��
+ {0xB6D4, 0x5BF9}, //{0xE5, 0xAF, 0xB9}, // ��
+ {0xCBC2, 0x5BFA}, //{0xE5, 0xAF, 0xBA}, // ��
{0xD1B0, 0x5BFB}, //{0xE5, 0xAF, 0xBB}, // Ѱ
- {0xB5BC, 0x5BFC}, //{0xE5, 0xAF, 0xBC}, // µ¼
- {0xCAD9, 0x5BFF}, //{0xE5, 0xAF, 0xBF}, // ÊÙ
- {0xB7E2, 0x5C01}, //{0xE5, 0xB0, 0x81}, // ·â
- {0xC9E4, 0x5C04}, //{0xE5, 0xB0, 0x84}, // Éä
- {0xBDAB, 0x5C06}, //{0xE5, 0xB0, 0x86}, // ½«
+ {0xB5BC, 0x5BFC}, //{0xE5, 0xAF, 0xBC}, // ��
+ {0xCAD9, 0x5BFF}, //{0xE5, 0xAF, 0xBF}, // ��
+ {0xB7E2, 0x5C01}, //{0xE5, 0xB0, 0x81}, // ��
+ {0xC9E4, 0x5C04}, //{0xE5, 0xB0, 0x84}, // ��
+ {0xBDAB, 0x5C06}, //{0xE5, 0xB0, 0x86}, // ��
{0xCEBE, 0x5C09}, //{0xE5, 0xB0, 0x89}, // ξ
- {0xD7F0, 0x5C0A}, //{0xE5, 0xB0, 0x8A}, // ×ð
+ {0xD7F0, 0x5C0A}, //{0xE5, 0xB0, 0x8A}, // ��
{0xD0A1, 0x5C0F}, //{0xE5, 0xB0, 0x8F}, // С
- {0xC9D9, 0x5C11}, //{0xE5, 0xB0, 0x91}, // ÉÙ
- {0xB6FB, 0x5C14}, //{0xE5, 0xB0, 0x94}, // ¶û
- {0xBCE2, 0x5C16}, //{0xE5, 0xB0, 0x96}, // ¼â
- {0xB3BE, 0x5C18}, //{0xE5, 0xB0, 0x98}, // ³¾
- {0xC9D0, 0x5C1A}, //{0xE5, 0xB0, 0x9A}, // ÉÐ
- {0xB3A2, 0x5C1D}, //{0xE5, 0xB0, 0x9D}, // ³¢
- {0xD3C8, 0x5C24}, //{0xE5, 0xB0, 0xA4}, // ÓÈ
- {0xBECD, 0x5C31}, //{0xE5, 0xB0, 0xB1}, // ¾Í
+ {0xC9D9, 0x5C11}, //{0xE5, 0xB0, 0x91}, // ��
+ {0xB6FB, 0x5C14}, //{0xE5, 0xB0, 0x94}, // ��
+ {0xBCE2, 0x5C16}, //{0xE5, 0xB0, 0x96}, // ��
+ {0xB3BE, 0x5C18}, //{0xE5, 0xB0, 0x98}, // ��
+ {0xC9D0, 0x5C1A}, //{0xE5, 0xB0, 0x9A}, // ��
+ {0xB3A2, 0x5C1D}, //{0xE5, 0xB0, 0x9D}, // ��
+ {0xD3C8, 0x5C24}, //{0xE5, 0xB0, 0xA4}, // ��
+ {0xBECD, 0x5C31}, //{0xE5, 0xB0, 0xB1}, // ��
{0xCAAC, 0x5C38}, //{0xE5, 0xB0, 0xB8}, // ʬ
- {0xB3DF, 0x5C3A}, //{0xE5, 0xB0, 0xBA}, // ³ß
- {0xC4E1, 0x5C3C}, //{0xE5, 0xB0, 0xBC}, // Äá
- {0xBEA1, 0x5C3D}, //{0xE5, 0xB0, 0xBD}, // ¾¡
+ {0xB3DF, 0x5C3A}, //{0xE5, 0xB0, 0xBA}, // ��
+ {0xC4E1, 0x5C3C}, //{0xE5, 0xB0, 0xBC}, // ��
+ {0xBEA1, 0x5C3D}, //{0xE5, 0xB0, 0xBD}, // ��
{0xCEB2, 0x5C3E}, //{0xE5, 0xB0, 0xBE}, // β
- {0xC4F2, 0x5C3F}, //{0xE5, 0xB0, 0xBF}, // Äò
- {0xBED6, 0x5C40}, //{0xE5, 0xB1, 0x80}, // ¾Ö
+ {0xC4F2, 0x5C3F}, //{0xE5, 0xB0, 0xBF}, // ��
+ {0xBED6, 0x5C40}, //{0xE5, 0xB1, 0x80}, // ��
{0xC6A8, 0x5C41}, //{0xE5, 0xB1, 0x81}, // ƨ
- {0xB2E3, 0x5C42}, //{0xE5, 0xB1, 0x82}, // ²ã
- {0xBED3, 0x5C45}, //{0xE5, 0xB1, 0x85}, // ¾Ó
- {0xC7FC, 0x5C48}, //{0xE5, 0xB1, 0x88}, // Çü
- {0xCCEB, 0x5C49}, //{0xE5, 0xB1, 0x89}, // Ìë
- {0xBDEC, 0x5C4A}, //{0xE5, 0xB1, 0x8A}, // ½ì
- {0xCEDD, 0x5C4B}, //{0xE5, 0xB1, 0x8B}, // ÎÝ
+ {0xB2E3, 0x5C42}, //{0xE5, 0xB1, 0x82}, // ��
+ {0xBED3, 0x5C45}, //{0xE5, 0xB1, 0x85}, // ��
+ {0xC7FC, 0x5C48}, //{0xE5, 0xB1, 0x88}, // ��
+ {0xCCEB, 0x5C49}, //{0xE5, 0xB1, 0x89}, // ��
+ {0xBDEC, 0x5C4A}, //{0xE5, 0xB1, 0x8A}, // ��
+ {0xCEDD, 0x5C4B}, //{0xE5, 0xB1, 0x8B}, // ��
{0xCABA, 0x5C4E}, //{0xE5, 0xB1, 0x8E}, // ʺ
- {0xC6C1, 0x5C4F}, //{0xE5, 0xB1, 0x8F}, // ÆÁ
+ {0xC6C1, 0x5C4F}, //{0xE5, 0xB1, 0x8F}, // ��
{0xD0BC, 0x5C51}, //{0xE5, 0xB1, 0x91}, // м
{0xD5B9, 0x5C55}, //{0xE5, 0xB1, 0x95}, // Õ¹
- {0xCAF4, 0x5C5E}, //{0xE5, 0xB1, 0x9E}, // Êô
- {0xCDC0, 0x5C60}, //{0xE5, 0xB1, 0xA0}, // ÍÀ
- {0xC2C5, 0x5C61}, //{0xE5, 0xB1, 0xA1}, // ÂÅ
- {0xC2C4, 0x5C65}, //{0xE5, 0xB1, 0xA5}, // ÂÄ
- {0xCDCD, 0x5C6F}, //{0xE5, 0xB1, 0xAF}, // ÍÍ
+ {0xCAF4, 0x5C5E}, //{0xE5, 0xB1, 0x9E}, // ��
+ {0xCDC0, 0x5C60}, //{0xE5, 0xB1, 0xA0}, // ��
+ {0xC2C5, 0x5C61}, //{0xE5, 0xB1, 0xA1}, // ��
+ {0xC2C4, 0x5C65}, //{0xE5, 0xB1, 0xA5}, // ��
+ {0xCDCD, 0x5C6F}, //{0xE5, 0xB1, 0xAF}, // ��
{0xC9BD, 0x5C71}, //{0xE5, 0xB1, 0xB1}, // ɽ
- {0xD2D9, 0x5C79}, //{0xE5, 0xB1, 0xB9}, // ÒÙ
- {0xD3EC, 0x5C7F}, //{0xE5, 0xB1, 0xBF}, // Óì
- {0xCBEA, 0x5C81}, //{0xE5, 0xB2, 0x81}, // Ëê
- {0xC6F1, 0x5C82}, //{0xE5, 0xB2, 0x82}, // Æñ
- {0xB2ED, 0x5C94}, //{0xE5, 0xB2, 0x94}, // ²í
- {0xE1AB, 0x5C96}, //{0xE5, 0xB2, 0x96}, // á«
- {0xB8DA, 0x5C97}, //{0xE5, 0xB2, 0x97}, // ¸Ú
- {0xB5BA, 0x5C9B}, //{0xE5, 0xB2, 0x9B}, // µº
- {0xD1D2, 0x5CA9}, //{0xE5, 0xB2, 0xA9}, // ÑÒ
- {0xC1EB, 0x5CAD}, //{0xE5, 0xB2, 0xAD}, // Áë
- {0xD4C0, 0x5CB3}, //{0xE5, 0xB2, 0xB3}, // ÔÀ
- {0xB0B6, 0x5CB8}, //{0xE5, 0xB2, 0xB8}, // °¶
+ {0xD2D9, 0x5C79}, //{0xE5, 0xB1, 0xB9}, // ��
+ {0xD3EC, 0x5C7F}, //{0xE5, 0xB1, 0xBF}, // ��
+ {0xCBEA, 0x5C81}, //{0xE5, 0xB2, 0x81}, // ��
+ {0xC6F1, 0x5C82}, //{0xE5, 0xB2, 0x82}, // ��
+ {0xB2ED, 0x5C94}, //{0xE5, 0xB2, 0x94}, // ��
+ {0xE1AB, 0x5C96}, //{0xE5, 0xB2, 0x96}, // �
+ {0xB8DA, 0x5C97}, //{0xE5, 0xB2, 0x97}, // ��
+ {0xB5BA, 0x5C9B}, //{0xE5, 0xB2, 0x9B}, // ��
+ {0xD1D2, 0x5CA9}, //{0xE5, 0xB2, 0xA9}, // ��
+ {0xC1EB, 0x5CAD}, //{0xE5, 0xB2, 0xAD}, // ��
+ {0xD4C0, 0x5CB3}, //{0xE5, 0xB2, 0xB3}, // ��
+ {0xB0B6, 0x5CB8}, //{0xE5, 0xB2, 0xB8}, // ��
{0xCFBF, 0x5CE1}, //{0xE5, 0xB3, 0xA1}, // Ï¿
- {0xC2CD, 0x5CE6}, //{0xE5, 0xB3, 0xA6}, // ÂÍ
- {0xC7CD, 0x5CED}, //{0xE5, 0xB3, 0xAD}, // ÇÍ
- {0xB7E5, 0x5CF0}, //{0xE5, 0xB3, 0xB0}, // ·å
- {0xBEFE, 0x5CFB}, //{0xE5, 0xB3, 0xBB}, // ¾þ
- {0xB3E7, 0x5D07}, //{0xE5, 0xB4, 0x87}, // ³ç
- {0xC6E9, 0x5D0E}, //{0xE5, 0xB4, 0x8E}, // Æé
- {0xB4DE, 0x5D14}, //{0xE5, 0xB4, 0x94}, // ´Þ
- {0xD1C2, 0x5D16}, //{0xE5, 0xB4, 0x96}, // ÑÂ
- {0xB1C0, 0x5D29}, //{0xE5, 0xB4, 0xA9}, // ±À
+ {0xC2CD, 0x5CE6}, //{0xE5, 0xB3, 0xA6}, // ��
+ {0xC7CD, 0x5CED}, //{0xE5, 0xB3, 0xAD}, // ��
+ {0xB7E5, 0x5CF0}, //{0xE5, 0xB3, 0xB0}, // ��
+ {0xBEFE, 0x5CFB}, //{0xE5, 0xB3, 0xBB}, // ��
+ {0xB3E7, 0x5D07}, //{0xE5, 0xB4, 0x87}, // ��
+ {0xC6E9, 0x5D0E}, //{0xE5, 0xB4, 0x8E}, // ��
+ {0xB4DE, 0x5D14}, //{0xE5, 0xB4, 0x94}, // ��
+ {0xD1C2, 0x5D16}, //{0xE5, 0xB4, 0x96}, // ��
+ {0xB1C0, 0x5D29}, //{0xE5, 0xB4, 0xA9}, // ��
{0xD5B8, 0x5D2D}, //{0xE5, 0xB4, 0xAD}, // Õ¸
{0xC7B6, 0x5D4C}, //{0xE5, 0xB5, 0x8C}, // Ƕ
{0xCEA1, 0x5DCD}, //{0xE5, 0xB7, 0x8D}, // Ρ
- {0xB4A8, 0x5DDD}, //{0xE5, 0xB7, 0x9D}, // ´¨
- {0xD6DD, 0x5DDE}, //{0xE5, 0xB7, 0x9E}, // ÖÝ
+ {0xB4A8, 0x5DDD}, //{0xE5, 0xB7, 0x9D}, // ��
+ {0xD6DD, 0x5DDE}, //{0xE5, 0xB7, 0x9E}, // ��
{0xD1B2, 0x5DE1}, //{0xE5, 0xB7, 0xA1}, // Ѳ
- {0xB3B2, 0x5DE2}, //{0xE5, 0xB7, 0xA2}, // ³²
- {0xB9A4, 0x5DE5}, //{0xE5, 0xB7, 0xA5}, // ¹¤
- {0xD7F3, 0x5DE6}, //{0xE5, 0xB7, 0xA6}, // ×ó
- {0xC7C9, 0x5DE7}, //{0xE5, 0xB7, 0xA7}, // ÇÉ
- {0xBEDE, 0x5DE8}, //{0xE5, 0xB7, 0xA8}, // ¾Þ
- {0xB9AE, 0x5DE9}, //{0xE5, 0xB7, 0xA9}, // ¹®
- {0xCED7, 0x5DEB}, //{0xE5, 0xB7, 0xAB}, // Î×
- {0xB2EE, 0x5DEE}, //{0xE5, 0xB7, 0xAE}, // ²î
- {0xBCBA, 0x5DF1}, //{0xE5, 0xB7, 0xB1}, // ¼º
- {0xD2D1, 0x5DF2}, //{0xE5, 0xB7, 0xB2}, // ÒÑ
- {0xB0CD, 0x5DF4}, //{0xE5, 0xB7, 0xB4}, // °Í
- {0xCFEF, 0x5DF7}, //{0xE5, 0xB7, 0xB7}, // Ïï
- {0xBDED, 0x5DFE}, //{0xE5, 0xB7, 0xBE}, // ½í
- {0xB1D2, 0x5E01}, //{0xE5, 0xB8, 0x81}, // ±Ò
- {0xCAD0, 0x5E02}, //{0xE5, 0xB8, 0x82}, // ÊÐ
- {0xB2BC, 0x5E03}, //{0xE5, 0xB8, 0x83}, // ²¼
+ {0xB3B2, 0x5DE2}, //{0xE5, 0xB7, 0xA2}, // ��
+ {0xB9A4, 0x5DE5}, //{0xE5, 0xB7, 0xA5}, // ��
+ {0xD7F3, 0x5DE6}, //{0xE5, 0xB7, 0xA6}, // ��
+ {0xC7C9, 0x5DE7}, //{0xE5, 0xB7, 0xA7}, // ��
+ {0xBEDE, 0x5DE8}, //{0xE5, 0xB7, 0xA8}, // ��
+ {0xB9AE, 0x5DE9}, //{0xE5, 0xB7, 0xA9}, // ��
+ {0xCED7, 0x5DEB}, //{0xE5, 0xB7, 0xAB}, // ��
+ {0xB2EE, 0x5DEE}, //{0xE5, 0xB7, 0xAE}, // ��
+ {0xBCBA, 0x5DF1}, //{0xE5, 0xB7, 0xB1}, // ��
+ {0xD2D1, 0x5DF2}, //{0xE5, 0xB7, 0xB2}, // ��
+ {0xB0CD, 0x5DF4}, //{0xE5, 0xB7, 0xB4}, // ��
+ {0xCFEF, 0x5DF7}, //{0xE5, 0xB7, 0xB7}, // ��
+ {0xBDED, 0x5DFE}, //{0xE5, 0xB7, 0xBE}, // ��
+ {0xB1D2, 0x5E01}, //{0xE5, 0xB8, 0x81}, // ��
+ {0xCAD0, 0x5E02}, //{0xE5, 0xB8, 0x82}, // ��
+ {0xB2BC, 0x5E03}, //{0xE5, 0xB8, 0x83}, // ��
{0xCBA7, 0x5E05}, //{0xE5, 0xB8, 0x85}, // ˧
- {0xB7AB, 0x5E06}, //{0xE5, 0xB8, 0x86}, // ·«
+ {0xB7AB, 0x5E06}, //{0xE5, 0xB8, 0x86}, // ��
{0xCAA6, 0x5E08}, //{0xE5, 0xB8, 0x88}, // ʦ
{0xCFA3, 0x5E0C}, //{0xE5, 0xB8, 0x8C}, // ϣ
- {0xD5CA, 0x5E10}, //{0xE5, 0xB8, 0x90}, // ÕÊ
- {0xC5C1, 0x5E15}, //{0xE5, 0xB8, 0x95}, // ÅÁ
- {0xCCFB, 0x5E16}, //{0xE5, 0xB8, 0x96}, // Ìû
- {0xC1B1, 0x5E18}, //{0xE5, 0xB8, 0x98}, // Á±
- {0xD6E3, 0x5E1A}, //{0xE5, 0xB8, 0x9A}, // Öã
- {0xD6C4, 0x5E1C}, //{0xE5, 0xB8, 0x9C}, // ÖÄ
- {0xB5DB, 0x5E1D}, //{0xE5, 0xB8, 0x9D}, // µÛ
- {0xB4F8, 0x5E26}, //{0xE5, 0xB8, 0xA6}, // ´ø
+ {0xD5CA, 0x5E10}, //{0xE5, 0xB8, 0x90}, // ��
+ {0xC5C1, 0x5E15}, //{0xE5, 0xB8, 0x95}, // ��
+ {0xCCFB, 0x5E16}, //{0xE5, 0xB8, 0x96}, // ��
+ {0xC1B1, 0x5E18}, //{0xE5, 0xB8, 0x98}, // q
+ {0xD6E3, 0x5E1A}, //{0xE5, 0xB8, 0x9A}, // ��
+ {0xD6C4, 0x5E1C}, //{0xE5, 0xB8, 0x9C}, // ��
+ {0xB5DB, 0x5E1D}, //{0xE5, 0xB8, 0x9D}, // ��
+ {0xB4F8, 0x5E26}, //{0xE5, 0xB8, 0xA6}, // ��
{0xCFAF, 0x5E2D}, //{0xE5, 0xB8, 0xAD}, // ϯ
- {0xB0EF, 0x5E2E}, //{0xE5, 0xB8, 0xAE}, // °ï
- {0xB3A3, 0x5E38}, //{0xE5, 0xB8, 0xB8}, // ³£
+ {0xB0EF, 0x5E2E}, //{0xE5, 0xB8, 0xAE}, // ��
+ {0xB3A3, 0x5E38}, //{0xE5, 0xB8, 0xB8}, // ��
{0xC3B1, 0x5E3D}, //{0xE5, 0xB8, 0xBD}, // ñ
- {0xB7F9, 0x5E45}, //{0xE5, 0xB9, 0x85}, // ·ù
- {0xBBCF, 0x5E4C}, //{0xE5, 0xB9, 0x8C}, // »Ï
- {0xE1A3, 0x5E54}, //{0xE5, 0xB9, 0x94}, // á£
+ {0xB7F9, 0x5E45}, //{0xE5, 0xB9, 0x85}, // ��
+ {0xBBCF, 0x5E4C}, //{0xE5, 0xB9, 0x8C}, // ��
+ {0xE1A3, 0x5E54}, //{0xE5, 0xB9, 0x94}, // �
{0xC4BB, 0x5E55}, //{0xE5, 0xB9, 0x95}, // Ä»
- {0xB4B1, 0x5E62}, //{0xE5, 0xB9, 0xA2}, // ´±
- {0xB8C9, 0x5E72}, //{0xE5, 0xB9, 0xB2}, // ¸É
+ {0xB4B1, 0x5E62}, //{0xE5, 0xB9, 0xA2}, // ��
+ {0xB8C9, 0x5E72}, //{0xE5, 0xB9, 0xB2}, // ��
{0xC6BD, 0x5E73}, //{0xE5, 0xB9, 0xB3}, // ƽ
- {0xC4EA, 0x5E74}, //{0xE5, 0xB9, 0xB4}, // Äê
- {0xB2A2, 0x5E76}, //{0xE5, 0xB9, 0xB6}, // ²¢
- {0xD0D2, 0x5E78}, //{0xE5, 0xB9, 0xB8}, // ÐÒ
- {0xBBC3, 0x5E7B}, //{0xE5, 0xB9, 0xBB}, // »Ã
- {0xD3D7, 0x5E7C}, //{0xE5, 0xB9, 0xBC}, // Ó×
- {0xD3C4, 0x5E7D}, //{0xE5, 0xB9, 0xBD}, // ÓÄ
- {0xB9E3, 0x5E7F}, //{0xE5, 0xB9, 0xBF}, // ¹ã
+ {0xC4EA, 0x5E74}, //{0xE5, 0xB9, 0xB4}, // ��
+ {0xB2A2, 0x5E76}, //{0xE5, 0xB9, 0xB6}, // ��
+ {0xD0D2, 0x5E78}, //{0xE5, 0xB9, 0xB8}, // ��
+ {0xBBC3, 0x5E7B}, //{0xE5, 0xB9, 0xBB}, // ��
+ {0xD3D7, 0x5E7C}, //{0xE5, 0xB9, 0xBC}, // ��
+ {0xD3C4, 0x5E7D}, //{0xE5, 0xB9, 0xBD}, // ��
+ {0xB9E3, 0x5E7F}, //{0xE5, 0xB9, 0xBF}, // ��
{0xD7AF, 0x5E84}, //{0xE5, 0xBA, 0x84}, // ׯ
- {0xC7EC, 0x5E86}, //{0xE5, 0xBA, 0x86}, // Çì
- {0xB1D3, 0x5E87}, //{0xE5, 0xBA, 0x87}, // ±Ó
- {0xB4B2, 0x5E8A}, //{0xE5, 0xBA, 0x8A}, // ´²
- {0xD0F2, 0x5E8F}, //{0xE5, 0xBA, 0x8F}, // Ðò
+ {0xC7EC, 0x5E86}, //{0xE5, 0xBA, 0x86}, // ��
+ {0xB1D3, 0x5E87}, //{0xE5, 0xBA, 0x87}, // ��
+ {0xB4B2, 0x5E8A}, //{0xE5, 0xBA, 0x8A}, // ��
+ {0xD0F2, 0x5E8F}, //{0xE5, 0xBA, 0x8F}, // ��
{0xC2AE, 0x5E90}, //{0xE5, 0xBA, 0x90}, // ®
- {0xBFE2, 0x5E93}, //{0xE5, 0xBA, 0x93}, // ¿â
+ {0xBFE2, 0x5E93}, //{0xE5, 0xBA, 0x93}, // ��
{0xD3A6, 0x5E94}, //{0xE5, 0xBA, 0x94}, // Ó¦
- {0xB5D7, 0x5E95}, //{0xE5, 0xBA, 0x95}, // µ×
- {0xB5EA, 0x5E97}, //{0xE5, 0xBA, 0x97}, // µê
- {0xC3ED, 0x5E99}, //{0xE5, 0xBA, 0x99}, // Ãí
- {0xB8AE, 0x5E9C}, //{0xE5, 0xBA, 0x9C}, // ¸®
- {0xC5D3, 0x5E9E}, //{0xE5, 0xBA, 0x9E}, // ÅÓ
- {0xB7CF, 0x5E9F}, //{0xE5, 0xBA, 0x9F}, // ·Ï
- {0xB6C8, 0x5EA6}, //{0xE5, 0xBA, 0xA6}, // ¶È
- {0xD7F9, 0x5EA7}, //{0xE5, 0xBA, 0xA7}, // ×ù
+ {0xB5D7, 0x5E95}, //{0xE5, 0xBA, 0x95}, // ��
+ {0xB5EA, 0x5E97}, //{0xE5, 0xBA, 0x97}, // ��
+ {0xC3ED, 0x5E99}, //{0xE5, 0xBA, 0x99}, // ��
+ {0xB8AE, 0x5E9C}, //{0xE5, 0xBA, 0x9C}, // ��
+ {0xC5D3, 0x5E9E}, //{0xE5, 0xBA, 0x9E}, // ��
+ {0xB7CF, 0x5E9F}, //{0xE5, 0xBA, 0x9F}, // ��
+ {0xB6C8, 0x5EA6}, //{0xE5, 0xBA, 0xA6}, // ��
+ {0xD7F9, 0x5EA7}, //{0xE5, 0xBA, 0xA7}, // ��
{0xCDA5, 0x5EAD}, //{0xE5, 0xBA, 0xAD}, // ͥ
- {0xE2D6, 0x5EB5}, //{0xE5, 0xBA, 0xB5}, // âÖ
- {0xCAFC, 0x5EB6}, //{0xE5, 0xBA, 0xB6}, // Êü
- {0xBFB5, 0x5EB7}, //{0xE5, 0xBA, 0xB7}, // ¿µ
+ {0xE2D6, 0x5EB5}, //{0xE5, 0xBA, 0xB5}, // ��
+ {0xCAFC, 0x5EB6}, //{0xE5, 0xBA, 0xB6}, // ��
+ {0xBFB5, 0x5EB7}, //{0xE5, 0xBA, 0xB7}, // ��
{0xD3B9, 0x5EB8}, //{0xE5, 0xBA, 0xB8}, // Ó¹
- {0xC1AE, 0x5EC9}, //{0xE5, 0xBB, 0x89}, // Á®
- {0xC0C8, 0x5ECA}, //{0xE5, 0xBB, 0x8A}, // ÀÈ
- {0xC0AA, 0x5ED3}, //{0xE5, 0xBB, 0x93}, // ˻
- {0xD1D3, 0x5EF6}, //{0xE5, 0xBB, 0xB6}, // ÑÓ
+ {0xC1AE, 0x5EC9}, //{0xE5, 0xBB, 0x89}, // n
+ {0xC0C8, 0x5ECA}, //{0xE5, 0xBB, 0x8A}, // ��
+ {0xC0AA, 0x5ED3}, //{0xE5, 0xBB, 0x93}, // *
+ {0xD1D3, 0x5EF6}, //{0xE5, 0xBB, 0xB6}, // ��
{0xCDA2, 0x5EF7}, //{0xE5, 0xBB, 0xB7}, // ͢
- {0xBDA8, 0x5EFA}, //{0xE5, 0xBB, 0xBA}, // ½¨
- {0xBFAA, 0x5F00}, //{0xE5, 0xBC, 0x80}, // ¿ª
- {0xD2EC, 0x5F02}, //{0xE5, 0xBC, 0x82}, // Òì
- {0xC6FA, 0x5F03}, //{0xE5, 0xBC, 0x83}, // Æú
+ {0xBDA8, 0x5EFA}, //{0xE5, 0xBB, 0xBA}, // ��
+ {0xBFAA, 0x5F00}, //{0xE5, 0xBC, 0x80}, // ��
+ {0xD2EC, 0x5F02}, //{0xE5, 0xBC, 0x82}, // ��
+ {0xC6FA, 0x5F03}, //{0xE5, 0xBC, 0x83}, // ��
{0xC5AA, 0x5F04}, //{0xE5, 0xBC, 0x84}, // Ū
- {0xB1D7, 0x5F0A}, //{0xE5, 0xBC, 0x8A}, // ±×
+ {0xB1D7, 0x5F0A}, //{0xE5, 0xBC, 0x8A}, // ��
{0xCABD, 0x5F0F}, //{0xE5, 0xBC, 0x8F}, // ʽ
- {0xB9AD, 0x5F13}, //{0xE5, 0xBC, 0x93}, // ¹
- {0xD2FD, 0x5F15}, //{0xE5, 0xBC, 0x95}, // Òý
- {0xB3DA, 0x5F1B}, //{0xE5, 0xBC, 0x9B}, // ³Ú
- {0xB5DC, 0x5F1F}, //{0xE5, 0xBC, 0x9F}, // µÜ
- {0xD5C5, 0x5F20}, //{0xE5, 0xBC, 0xA0}, // ÕÅ
- {0xC3D6, 0x5F25}, //{0xE5, 0xBC, 0xA5}, // ÃÖ
- {0xCFD2, 0x5F26}, //{0xE5, 0xBC, 0xA6}, // ÏÒ
- {0xBBA1, 0x5F27}, //{0xE5, 0xBC, 0xA7}, // »¡
- {0xCDE4, 0x5F2F}, //{0xE5, 0xBC, 0xAF}, // Íä
- {0xC8F5, 0x5F31}, //{0xE5, 0xBC, 0xB1}, // Èõ
- {0xB5AF, 0x5F39}, //{0xE5, 0xBC, 0xB9}, // µ¯
+ {0xB9AD, 0x5F13}, //{0xE5, 0xBC, 0x93}, // ��
+ {0xD2FD, 0x5F15}, //{0xE5, 0xBC, 0x95}, // ��
+ {0xB3DA, 0x5F1B}, //{0xE5, 0xBC, 0x9B}, // ��
+ {0xB5DC, 0x5F1F}, //{0xE5, 0xBC, 0x9F}, // ��
+ {0xD5C5, 0x5F20}, //{0xE5, 0xBC, 0xA0}, // ��
+ {0xC3D6, 0x5F25}, //{0xE5, 0xBC, 0xA5}, // ��
+ {0xCFD2, 0x5F26}, //{0xE5, 0xBC, 0xA6}, // ��
+ {0xBBA1, 0x5F27}, //{0xE5, 0xBC, 0xA7}, // ��
+ {0xCDE4, 0x5F2F}, //{0xE5, 0xBC, 0xAF}, // ��
+ {0xC8F5, 0x5F31}, //{0xE5, 0xBC, 0xB1}, // ��
+ {0xB5AF, 0x5F39}, //{0xE5, 0xBC, 0xB9}, // ��
{0xC7BF, 0x5F3A}, //{0xE5, 0xBC, 0xBA}, // Ç¿
- {0xB9E9, 0x5F52}, //{0xE5, 0xBD, 0x92}, // ¹é
- {0xB5B1, 0x5F53}, //{0xE5, 0xBD, 0x93}, // µ±
+ {0xB9E9, 0x5F52}, //{0xE5, 0xBD, 0x92}, // ��
+ {0xB5B1, 0x5F53}, //{0xE5, 0xBD, 0x93}, // ��
{0xC2BC, 0x5F55}, //{0xE5, 0xBD, 0x95}, // ¼
- {0xD0CE, 0x5F62}, //{0xE5, 0xBD, 0xA2}, // ÐÎ
+ {0xD0CE, 0x5F62}, //{0xE5, 0xBD, 0xA2}, // ��
{0xCDAE, 0x5F64}, //{0xE5, 0xBD, 0xA4}, // Í®
- {0xB2CA, 0x5F69}, //{0xE5, 0xBD, 0xA9}, // ²Ê
- {0xB1EB, 0x5F6A}, //{0xE5, 0xBD, 0xAA}, // ±ë
- {0xB1F2, 0x5F6C}, //{0xE5, 0xBD, 0xAC}, // ±ò
- {0xC5ED, 0x5F6D}, //{0xE5, 0xBD, 0xAD}, // Åí
- {0xD5C3, 0x5F70}, //{0xE5, 0xBD, 0xB0}, // ÕÃ
+ {0xB2CA, 0x5F69}, //{0xE5, 0xBD, 0xA9}, // ��
+ {0xB1EB, 0x5F6A}, //{0xE5, 0xBD, 0xAA}, // ��
+ {0xB1F2, 0x5F6C}, //{0xE5, 0xBD, 0xAC}, // ��
+ {0xC5ED, 0x5F6D}, //{0xE5, 0xBD, 0xAD}, // ��
+ {0xD5C3, 0x5F70}, //{0xE5, 0xBD, 0xB0}, // ��
{0xD3B0, 0x5F71}, //{0xE5, 0xBD, 0xB1}, // Ó°
- {0xD2DB, 0x5F79}, //{0xE5, 0xBD, 0xB9}, // ÒÛ
- {0xB3B9, 0x5F7B}, //{0xE5, 0xBD, 0xBB}, // ³¹
- {0xB1CB, 0x5F7C}, //{0xE5, 0xBD, 0xBC}, // ±Ë
- {0xCDF9, 0x5F80}, //{0xE5, 0xBE, 0x80}, // Íù
- {0xD5F7, 0x5F81}, //{0xE5, 0xBE, 0x81}, // Õ÷
- {0xBEB6, 0x5F84}, //{0xE5, 0xBE, 0x84}, // ¾¶
- {0xB4FD, 0x5F85}, //{0xE5, 0xBE, 0x85}, // ´ý
- {0xBADC, 0x5F88}, //{0xE5, 0xBE, 0x88}, // ºÜ
- {0xBBB2, 0x5F8A}, //{0xE5, 0xBE, 0x8A}, // »²
- {0xC2C9, 0x5F8B}, //{0xE5, 0xBE, 0x8B}, // ÂÉ
- {0xD0EC, 0x5F90}, //{0xE5, 0xBE, 0x90}, // Ðì
+ {0xD2DB, 0x5F79}, //{0xE5, 0xBD, 0xB9}, // ��
+ {0xB3B9, 0x5F7B}, //{0xE5, 0xBD, 0xBB}, // ��
+ {0xB1CB, 0x5F7C}, //{0xE5, 0xBD, 0xBC}, // ��
+ {0xCDF9, 0x5F80}, //{0xE5, 0xBE, 0x80}, // ��
+ {0xD5F7, 0x5F81}, //{0xE5, 0xBE, 0x81}, // ��
+ {0xBEB6, 0x5F84}, //{0xE5, 0xBE, 0x84}, // ��
+ {0xB4FD, 0x5F85}, //{0xE5, 0xBE, 0x85}, // ��
+ {0xBADC, 0x5F88}, //{0xE5, 0xBE, 0x88}, // ��
+ {0xBBB2, 0x5F8A}, //{0xE5, 0xBE, 0x8A}, // ��
+ {0xC2C9, 0x5F8B}, //{0xE5, 0xBE, 0x8B}, // ��
+ {0xD0EC, 0x5F90}, //{0xE5, 0xBE, 0x90}, // ��
{0xCDBD, 0x5F92}, //{0xE5, 0xBE, 0x92}, // ͽ
- {0xB5C3, 0x5F97}, //{0xE5, 0xBE, 0x97}, // µÃ
- {0xC5C7, 0x5F98}, //{0xE5, 0xBE, 0x98}, // ÅÇ
- {0xD3F9, 0x5FA1}, //{0xE5, 0xBE, 0xA1}, // Óù
+ {0xB5C3, 0x5F97}, //{0xE5, 0xBE, 0x97}, // ��
+ {0xC5C7, 0x5F98}, //{0xE5, 0xBE, 0x98}, // ��
+ {0xD3F9, 0x5FA1}, //{0xE5, 0xBE, 0xA1}, // ��
{0xD1AD, 0x5FAA}, //{0xE5, 0xBE, 0xAA}, // Ñ
{0xCEA2, 0x5FAE}, //{0xE5, 0xBE, 0xAE}, // ΢
- {0xB5C2, 0x5FB7}, //{0xE5, 0xBE, 0xB7}, // µÂ
- {0xBBD5, 0x5FBD}, //{0xE5, 0xBE, 0xBD}, // »Õ
- {0xD0C4, 0x5FC3}, //{0xE5, 0xBF, 0x83}, // ÐÄ
- {0xB1D8, 0x5FC5}, //{0xE5, 0xBF, 0x85}, // ±Ø
- {0xD2E4, 0x5FC6}, //{0xE5, 0xBF, 0x86}, // Òä
- {0xBCC9, 0x5FCC}, //{0xE5, 0xBF, 0x8C}, // ¼É
- {0xC8CC, 0x5FCD}, //{0xE5, 0xBF, 0x8D}, // ÈÌ
+ {0xB5C2, 0x5FB7}, //{0xE5, 0xBE, 0xB7}, // ��
+ {0xBBD5, 0x5FBD}, //{0xE5, 0xBE, 0xBD}, // ��
+ {0xD0C4, 0x5FC3}, //{0xE5, 0xBF, 0x83}, // ��
+ {0xB1D8, 0x5FC5}, //{0xE5, 0xBF, 0x85}, // ��
+ {0xD2E4, 0x5FC6}, //{0xE5, 0xBF, 0x86}, // ��
+ {0xBCC9, 0x5FCC}, //{0xE5, 0xBF, 0x8C}, // ��
+ {0xC8CC, 0x5FCD}, //{0xE5, 0xBF, 0x8D}, // ��
{0xD6BE, 0x5FD7}, //{0xE5, 0xBF, 0x97}, // Ö¾
- {0xCDFC, 0x5FD8}, //{0xE5, 0xBF, 0x98}, // Íü
+ {0xCDFC, 0x5FD8}, //{0xE5, 0xBF, 0x98}, // ��
{0xC3A6, 0x5FD9}, //{0xE5, 0xBF, 0x99}, // æ
- {0xD6D2, 0x5FE0}, //{0xE5, 0xBF, 0xA0}, // ÖÒ
- {0xD3C7, 0x5FE7}, //{0xE5, 0xBF, 0xA7}, // ÓÇ
- {0xBFEC, 0x5FEB}, //{0xE5, 0xBF, 0xAB}, // ¿ì
- {0xB3C0, 0x5FF1}, //{0xE5, 0xBF, 0xB1}, // ³À
- {0xC4EE, 0x5FF5}, //{0xE5, 0xBF, 0xB5}, // Äî
- {0xBAF6, 0x5FFD}, //{0xE5, 0xBF, 0xBD}, // ºö
- {0xB7DE, 0x5FFF}, //{0xE5, 0xBF, 0xBF}, // ·Þ
- {0xBBB3, 0x6000}, //{0xE6, 0x80, 0x80}, // »³
+ {0xD6D2, 0x5FE0}, //{0xE5, 0xBF, 0xA0}, // ��
+ {0xD3C7, 0x5FE7}, //{0xE5, 0xBF, 0xA7}, // ��
+ {0xBFEC, 0x5FEB}, //{0xE5, 0xBF, 0xAB}, // ��
+ {0xB3C0, 0x5FF1}, //{0xE5, 0xBF, 0xB1}, // ��
+ {0xC4EE, 0x5FF5}, //{0xE5, 0xBF, 0xB5}, // ��
+ {0xBAF6, 0x5FFD}, //{0xE5, 0xBF, 0xBD}, // ��
+ {0xB7DE, 0x5FFF}, //{0xE5, 0xBF, 0xBF}, // ��
+ {0xBBB3, 0x6000}, //{0xE6, 0x80, 0x80}, // ��
{0xCCAC, 0x6001}, //{0xE6, 0x80, 0x81}, // ̬
- {0xD4F5, 0x600E}, //{0xE6, 0x80, 0x8E}, // Ôõ
+ {0xD4F5, 0x600E}, //{0xE6, 0x80, 0x8E}, // ��
{0xC5AD, 0x6012}, //{0xE6, 0x80, 0x92}, // Å
- {0xD5FA, 0x6014}, //{0xE6, 0x80, 0x94}, // Õú
- {0xC5C2, 0x6015}, //{0xE6, 0x80, 0x95}, // ÅÂ
- {0xB2C0, 0x6016}, //{0xE6, 0x80, 0x96}, // ²À
- {0xC1AF, 0x601C}, //{0xE6, 0x80, 0x9C}, // Á¯
+ {0xD5FA, 0x6014}, //{0xE6, 0x80, 0x94}, // ��
+ {0xC5C2, 0x6015}, //{0xE6, 0x80, 0x95}, // ��
+ {0xB2C0, 0x6016}, //{0xE6, 0x80, 0x96}, // ��
+ {0xC1AF, 0x601C}, //{0xE6, 0x80, 0x9C}, // o
{0xCBBC, 0x601D}, //{0xE6, 0x80, 0x9D}, // ˼
- {0xB5A1, 0x6020}, //{0xE6, 0x80, 0xA0}, // µ¡
- {0xBCB1, 0x6025}, //{0xE6, 0x80, 0xA5}, // ¼±
- {0xD0D4, 0x6027}, //{0xE6, 0x80, 0xA7}, // ÐÔ
+ {0xB5A1, 0x6020}, //{0xE6, 0x80, 0xA0}, // ��
+ {0xBCB1, 0x6025}, //{0xE6, 0x80, 0xA5}, // ��
+ {0xD0D4, 0x6027}, //{0xE6, 0x80, 0xA7}, // ��
{0xD4B9, 0x6028}, //{0xE6, 0x80, 0xA8}, // Ô¹
- {0xB9D6, 0x602A}, //{0xE6, 0x80, 0xAA}, // ¹Ö
- {0xC7D3, 0x602F}, //{0xE6, 0x80, 0xAF}, // ÇÓ
- {0xD7DC, 0x603B}, //{0xE6, 0x80, 0xBB}, // ×Ü
- {0xCAD1, 0x6043}, //{0xE6, 0x81, 0x83}, // ÊÑ
- {0xC1B5, 0x604B}, //{0xE6, 0x81, 0x8B}, // Áµ
- {0xBBD0, 0x604D}, //{0xE6, 0x81, 0x8D}, // »Ð
- {0xBFD6, 0x6050}, //{0xE6, 0x81, 0x90}, // ¿Ö
- {0xBAE3, 0x6052}, //{0xE6, 0x81, 0x92}, // ºã
+ {0xB9D6, 0x602A}, //{0xE6, 0x80, 0xAA}, // ��
+ {0xC7D3, 0x602F}, //{0xE6, 0x80, 0xAF}, // ��
+ {0xD7DC, 0x603B}, //{0xE6, 0x80, 0xBB}, // ��
+ {0xCAD1, 0x6043}, //{0xE6, 0x81, 0x83}, // ��
+ {0xC1B5, 0x604B}, //{0xE6, 0x81, 0x8B}, // u
+ {0xBBD0, 0x604D}, //{0xE6, 0x81, 0x8D}, // ��
+ {0xBFD6, 0x6050}, //{0xE6, 0x81, 0x90}, // ��
+ {0xBAE3, 0x6052}, //{0xE6, 0x81, 0x92}, // ��
{0xCBA1, 0x6055}, //{0xE6, 0x81, 0x95}, // Ë¡
- {0xBBD6, 0x6062}, //{0xE6, 0x81, 0xA2}, // »Ö
- {0xD0F4, 0x6064}, //{0xE6, 0x81, 0xA4}, // Ðô
- {0xBADE, 0x6068}, //{0xE6, 0x81, 0xA8}, // ºÞ
- {0xB6F7, 0x6069}, //{0xE6, 0x81, 0xA9}, // ¶÷
- {0xCCF1, 0x606C}, //{0xE6, 0x81, 0xAC}, // Ìñ
- {0xB9A7, 0x606D}, //{0xE6, 0x81, 0xAD}, // ¹§
+ {0xBBD6, 0x6062}, //{0xE6, 0x81, 0xA2}, // ��
+ {0xD0F4, 0x6064}, //{0xE6, 0x81, 0xA4}, // ��
+ {0xBADE, 0x6068}, //{0xE6, 0x81, 0xA8}, // ��
+ {0xB6F7, 0x6069}, //{0xE6, 0x81, 0xA9}, // ��
+ {0xCCF1, 0x606C}, //{0xE6, 0x81, 0xAC}, // ��
+ {0xB9A7, 0x606D}, //{0xE6, 0x81, 0xAD}, // ��
{0xCFA2, 0x606F}, //{0xE6, 0x81, 0xAF}, // Ϣ
{0xC7A1, 0x6070}, //{0xE6, 0x81, 0xB0}, // Ç¡
- {0xBFD2, 0x6073}, //{0xE6, 0x81, 0xB3}, // ¿Ò
- {0xB6F1, 0x6076}, //{0xE6, 0x81, 0xB6}, // ¶ñ
- {0xC4D5, 0x607C}, //{0xE6, 0x81, 0xBC}, // ÄÕ
- {0xC7C4, 0x6084}, //{0xE6, 0x82, 0x84}, // ÇÄ
+ {0xBFD2, 0x6073}, //{0xE6, 0x81, 0xB3}, // ��
+ {0xB6F1, 0x6076}, //{0xE6, 0x81, 0xB6}, // ��
+ {0xC4D5, 0x607C}, //{0xE6, 0x81, 0xBC}, // ��
+ {0xC7C4, 0x6084}, //{0xE6, 0x82, 0x84}, // ��
{0xCFA4, 0x6089}, //{0xE6, 0x82, 0x89}, // Ϥ
- {0xBAB7, 0x608D}, //{0xE6, 0x82, 0x8D}, // º·
- {0xBBDA, 0x6094}, //{0xE6, 0x82, 0x94}, // »Ú
- {0xCEF2, 0x609F}, //{0xE6, 0x82, 0x9F}, // Îò
- {0xD3C6, 0x60A0}, //{0xE6, 0x82, 0xA0}, // ÓÆ
- {0xBBBC, 0x60A3}, //{0xE6, 0x82, 0xA3}, // »¼
- {0xD4C3, 0x60A6}, //{0xE6, 0x82, 0xA6}, // ÔÃ
- {0xC4FA, 0x60A8}, //{0xE6, 0x82, 0xA8}, // Äú
- {0xD0FC, 0x60AC}, //{0xE6, 0x82, 0xAC}, // Ðü
- {0xC3F5, 0x60AF}, //{0xE6, 0x82, 0xAF}, // Ãõ
- {0xB1AF, 0x60B2}, //{0xE6, 0x82, 0xB2}, // ±¯
- {0xE3B2, 0x60B4}, //{0xE6, 0x82, 0xB4}, // ã²
- {0xB5BF, 0x60BC}, //{0xE6, 0x82, 0xBC}, // µ¿
- {0xC7E9, 0x60C5}, //{0xE6, 0x83, 0x85}, // Çé
- {0xBEAA, 0x60CA}, //{0xE6, 0x83, 0x8A}, // ¾ª
- {0xCDEF, 0x60CB}, //{0xE6, 0x83, 0x8B}, // Íï
- {0xBBF3, 0x60D1}, //{0xE6, 0x83, 0x91}, // »ó
- {0xCCE8, 0x60D5}, //{0xE6, 0x83, 0x95}, // Ìè
+ {0xBAB7, 0x608D}, //{0xE6, 0x82, 0x8D}, // ��
+ {0xBBDA, 0x6094}, //{0xE6, 0x82, 0x94}, // ��
+ {0xCEF2, 0x609F}, //{0xE6, 0x82, 0x9F}, // ��
+ {0xD3C6, 0x60A0}, //{0xE6, 0x82, 0xA0}, // ��
+ {0xBBBC, 0x60A3}, //{0xE6, 0x82, 0xA3}, // ��
+ {0xD4C3, 0x60A6}, //{0xE6, 0x82, 0xA6}, // ��
+ {0xC4FA, 0x60A8}, //{0xE6, 0x82, 0xA8}, // ��
+ {0xD0FC, 0x60AC}, //{0xE6, 0x82, 0xAC}, // ��
+ {0xC3F5, 0x60AF}, //{0xE6, 0x82, 0xAF}, // ��
+ {0xB1AF, 0x60B2}, //{0xE6, 0x82, 0xB2}, // ��
+ {0xE3B2, 0x60B4}, //{0xE6, 0x82, 0xB4}, // �
+ {0xB5BF, 0x60BC}, //{0xE6, 0x82, 0xBC}, // ��
+ {0xC7E9, 0x60C5}, //{0xE6, 0x83, 0x85}, // ��
+ {0xBEAA, 0x60CA}, //{0xE6, 0x83, 0x8A}, // ��
+ {0xCDEF, 0x60CB}, //{0xE6, 0x83, 0x8B}, // ��
+ {0xBBF3, 0x60D1}, //{0xE6, 0x83, 0x91}, // ��
+ {0xCCE8, 0x60D5}, //{0xE6, 0x83, 0x95}, // ��
{0xCFA7, 0x60DC}, //{0xE6, 0x83, 0x9C}, // ϧ
- {0xBBDD, 0x60E0}, //{0xE6, 0x83, 0xA0}, // »Ý
- {0xB5EB, 0x60E6}, //{0xE6, 0x83, 0xA6}, // µë
- {0xBEE5, 0x60E7}, //{0xE6, 0x83, 0xA7}, // ¾å
- {0xB2D2, 0x60E8}, //{0xE6, 0x83, 0xA8}, // ²Ò
- {0xB3CD, 0x60E9}, //{0xE6, 0x83, 0xA9}, // ³Í
- {0xB1B9, 0x60EB}, //{0xE6, 0x83, 0xAB}, // ±¹
- {0xB2D1, 0x60ED}, //{0xE6, 0x83, 0xAD}, // ²Ñ
- {0xB9DF, 0x60EF}, //{0xE6, 0x83, 0xAF}, // ¹ß
- {0xB6E8, 0x60F0}, //{0xE6, 0x83, 0xB0}, // ¶è
- {0xCFEB, 0x60F3}, //{0xE6, 0x83, 0xB3}, // Ïë
- {0xBBCC, 0x60F6}, //{0xE6, 0x83, 0xB6}, // »Ì
- {0xC8C7, 0x60F9}, //{0xE6, 0x83, 0xB9}, // ÈÇ
- {0xB3EE, 0x6101}, //{0xE6, 0x84, 0x81}, // ³î
- {0xD3FA, 0x6108}, //{0xE6, 0x84, 0x88}, // Óú
- {0xD3E4, 0x6109}, //{0xE6, 0x84, 0x89}, // Óä
- {0xD2E2, 0x610F}, //{0xE6, 0x84, 0x8F}, // Òâ
- {0xE3B5, 0x6115}, //{0xE6, 0x84, 0x95}, // ãµ
- {0xD3DE, 0x611A}, //{0xE6, 0x84, 0x9A}, // ÓÞ
- {0xB8D0, 0x611F}, //{0xE6, 0x84, 0x9F}, // ¸Ð
- {0xB7DF, 0x6124}, //{0xE6, 0x84, 0xA4}, // ·ß
- {0xC0A2, 0x6127}, //{0xE6, 0x84, 0xA7}, // ˢ
+ {0xBBDD, 0x60E0}, //{0xE6, 0x83, 0xA0}, // ��
+ {0xB5EB, 0x60E6}, //{0xE6, 0x83, 0xA6}, // ��
+ {0xBEE5, 0x60E7}, //{0xE6, 0x83, 0xA7}, // ��
+ {0xB2D2, 0x60E8}, //{0xE6, 0x83, 0xA8}, // ��
+ {0xB3CD, 0x60E9}, //{0xE6, 0x83, 0xA9}, // ��
+ {0xB1B9, 0x60EB}, //{0xE6, 0x83, 0xAB}, // ��
+ {0xB2D1, 0x60ED}, //{0xE6, 0x83, 0xAD}, // ��
+ {0xB9DF, 0x60EF}, //{0xE6, 0x83, 0xAF}, // ��
+ {0xB6E8, 0x60F0}, //{0xE6, 0x83, 0xB0}, // ��
+ {0xCFEB, 0x60F3}, //{0xE6, 0x83, 0xB3}, // ��
+ {0xBBCC, 0x60F6}, //{0xE6, 0x83, 0xB6}, // ��
+ {0xC8C7, 0x60F9}, //{0xE6, 0x83, 0xB9}, // ��
+ {0xB3EE, 0x6101}, //{0xE6, 0x84, 0x81}, // ��
+ {0xD3FA, 0x6108}, //{0xE6, 0x84, 0x88}, // ��
+ {0xD3E4, 0x6109}, //{0xE6, 0x84, 0x89}, // ��
+ {0xD2E2, 0x610F}, //{0xE6, 0x84, 0x8F}, // ��
+ {0xE3B5, 0x6115}, //{0xE6, 0x84, 0x95}, // �
+ {0xD3DE, 0x611A}, //{0xE6, 0x84, 0x9A}, // ��
+ {0xB8D0, 0x611F}, //{0xE6, 0x84, 0x9F}, // ��
+ {0xB7DF, 0x6124}, //{0xE6, 0x84, 0xA4}, // ��
+ {0xC0A2, 0x6127}, //{0xE6, 0x84, 0xA7}, // "
{0xD4B8, 0x613F}, //{0xE6, 0x84, 0xBF}, // Ô¸
- {0xB4C8, 0x6148}, //{0xE6, 0x85, 0x88}, // ´È
- {0xBBC5, 0x614C}, //{0xE6, 0x85, 0x8C}, // ȁ
- {0xC9F7, 0x614E}, //{0xE6, 0x85, 0x8E}, // É÷
+ {0xB4C8, 0x6148}, //{0xE6, 0x85, 0x88}, // ��
+ {0xBBC5, 0x614C}, //{0xE6, 0x85, 0x8C}, // ��
+ {0xC9F7, 0x614E}, //{0xE6, 0x85, 0x8E}, // ��
{0xC4BD, 0x6155}, //{0xE6, 0x85, 0x95}, // Ľ
- {0xC2FD, 0x6162}, //{0xE6, 0x85, 0xA2}, // Âý
- {0xBBDB, 0x6167}, //{0xE6, 0x85, 0xA7}, // »Û
- {0xBFAE, 0x6168}, //{0xE6, 0x85, 0xA8}, // ¿®
+ {0xC2FD, 0x6162}, //{0xE6, 0x85, 0xA2}, // ��
+ {0xBBDB, 0x6167}, //{0xE6, 0x85, 0xA7}, // ��
+ {0xBFAE, 0x6168}, //{0xE6, 0x85, 0xA8}, // ��
{0xCEBF, 0x6170}, //{0xE6, 0x85, 0xB0}, // ο
- {0xBFB6, 0x6177}, //{0xE6, 0x85, 0xB7}, // ¿¶
- {0xB1EF, 0x618B}, //{0xE6, 0x86, 0x8B}, // ±ï
- {0xD4F7, 0x618E}, //{0xE6, 0x86, 0x8E}, // Ô÷
- {0xE3BE, 0x6194}, //{0xE6, 0x86, 0x94}, // ã¾
- {0xBAA9, 0x61A8}, //{0xE6, 0x86, 0xA8}, // º©
- {0xBAB6, 0x61BE}, //{0xE6, 0x86, 0xBE}, // º¶
- {0xB6AE, 0x61C2}, //{0xE6, 0x87, 0x82}, // ¶®
+ {0xBFB6, 0x6177}, //{0xE6, 0x85, 0xB7}, // ��
+ {0xB1EF, 0x618B}, //{0xE6, 0x86, 0x8B}, // ��
+ {0xD4F7, 0x618E}, //{0xE6, 0x86, 0x8E}, // ��
+ {0xE3BE, 0x6194}, //{0xE6, 0x86, 0x94}, // �
+ {0xBAA9, 0x61A8}, //{0xE6, 0x86, 0xA8}, // ��
+ {0xBAB6, 0x61BE}, //{0xE6, 0x86, 0xBE}, // ��
+ {0xB6AE, 0x61C2}, //{0xE6, 0x87, 0x82}, // ��
{0xD0B8, 0x61C8}, //{0xE6, 0x87, 0x88}, // и
- {0xB0C3, 0x61CA}, //{0xE6, 0x87, 0x8A}, // °Ã
- {0xC0C1, 0x61D2}, //{0xE6, 0x87, 0x92}, // ÀÁ
+ {0xB0C3, 0x61CA}, //{0xE6, 0x87, 0x8A}, // ��
+ {0xC0C1, 0x61D2}, //{0xE6, 0x87, 0x92}, // ��
{0xC5B3, 0x61E6}, //{0xE6, 0x87, 0xA6}, // ų
- {0xB8EA, 0x6208}, //{0xE6, 0x88, 0x88}, // ¸ê
+ {0xB8EA, 0x6208}, //{0xE6, 0x88, 0x88}, // ��
{0xCFB7, 0x620F}, //{0xE6, 0x88, 0x8F}, // Ï·
- {0xB3C9, 0x6210}, //{0xE6, 0x88, 0x90}, // ³É
- {0xCED2, 0x6211}, //{0xE6, 0x88, 0x91}, // ÎÒ
- {0xBDE4, 0x6212}, //{0xE6, 0x88, 0x92}, // ½ä
- {0xBBF2, 0x6216}, //{0xE6, 0x88, 0x96}, // »ò
+ {0xB3C9, 0x6210}, //{0xE6, 0x88, 0x90}, // ��
+ {0xCED2, 0x6211}, //{0xE6, 0x88, 0x91}, // ��
+ {0xBDE4, 0x6212}, //{0xE6, 0x88, 0x92}, // ��
+ {0xBBF2, 0x6216}, //{0xE6, 0x88, 0x96}, // ��
{0xD5BD, 0x6218}, //{0xE6, 0x88, 0x98}, // Õ½
- {0xC6DD, 0x621A}, //{0xE6, 0x88, 0x9A}, // ÆÝ
- {0xBDD8, 0x622A}, //{0xE6, 0x88, 0xAA}, // ½Ø
- {0xB4C1, 0x6233}, //{0xE6, 0x88, 0xB3}, // ´Á
- {0xB4F7, 0x6234}, //{0xE6, 0x88, 0xB4}, // ´÷
- {0xBBA7, 0x6237}, //{0xE6, 0x88, 0xB7}, // »§
- {0xB7BF, 0x623F}, //{0xE6, 0x88, 0xBF}, // ·¿
- {0xCBF9, 0x6240}, //{0xE6, 0x89, 0x80}, // Ëù
- {0xB1E2, 0x6241}, //{0xE6, 0x89, 0x81}, // ±â
- {0xC9C8, 0x6247}, //{0xE6, 0x89, 0x87}, // ÉÈ
- {0xCAD6, 0x624B}, //{0xE6, 0x89, 0x8B}, // ÊÖ
- {0xB2C5, 0x624D}, //{0xE6, 0x89, 0x8D}, // ²Å
- {0xD4FA, 0x624E}, //{0xE6, 0x89, 0x8E}, // Ôú
- {0xC6CB, 0x6251}, //{0xE6, 0x89, 0x91}, // ÆË
- {0xB0C7, 0x6252}, //{0xE6, 0x89, 0x92}, // °Ç
- {0xB4F2, 0x6253}, //{0xE6, 0x89, 0x93}, // ´ò
- {0xC8D3, 0x6254}, //{0xE6, 0x89, 0x94}, // ÈÓ
- {0xCDD0, 0x6258}, //{0xE6, 0x89, 0x98}, // ÍÐ
- {0xBFB8, 0x625B}, //{0xE6, 0x89, 0x9B}, // ¿¸
- {0xBFDB, 0x6263}, //{0xE6, 0x89, 0xA3}, // ¿Û
+ {0xC6DD, 0x621A}, //{0xE6, 0x88, 0x9A}, // ��
+ {0xBDD8, 0x622A}, //{0xE6, 0x88, 0xAA}, // ��
+ {0xB4C1, 0x6233}, //{0xE6, 0x88, 0xB3}, // ��
+ {0xB4F7, 0x6234}, //{0xE6, 0x88, 0xB4}, // ��
+ {0xBBA7, 0x6237}, //{0xE6, 0x88, 0xB7}, // ��
+ {0xB7BF, 0x623F}, //{0xE6, 0x88, 0xBF}, // ��
+ {0xCBF9, 0x6240}, //{0xE6, 0x89, 0x80}, // ��
+ {0xB1E2, 0x6241}, //{0xE6, 0x89, 0x81}, // ��
+ {0xC9C8, 0x6247}, //{0xE6, 0x89, 0x87}, // ��
+ {0xCAD6, 0x624B}, //{0xE6, 0x89, 0x8B}, // ��
+ {0xB2C5, 0x624D}, //{0xE6, 0x89, 0x8D}, // ��
+ {0xD4FA, 0x624E}, //{0xE6, 0x89, 0x8E}, // ��
+ {0xC6CB, 0x6251}, //{0xE6, 0x89, 0x91}, // ��
+ {0xB0C7, 0x6252}, //{0xE6, 0x89, 0x92}, // ��
+ {0xB4F2, 0x6253}, //{0xE6, 0x89, 0x93}, // ��
+ {0xC8D3, 0x6254}, //{0xE6, 0x89, 0x94}, // ��
+ {0xCDD0, 0x6258}, //{0xE6, 0x89, 0x98}, // ��
+ {0xBFB8, 0x625B}, //{0xE6, 0x89, 0x9B}, // ��
+ {0xBFDB, 0x6263}, //{0xE6, 0x89, 0xA3}, // ��
{0xD6B4, 0x6267}, //{0xE6, 0x89, 0xA7}, // Ö´
- {0xC0A9, 0x6269}, //{0xE6, 0x89, 0xA9}, // À©
+ {0xC0A9, 0x6269}, //{0xE6, 0x89, 0xA9}, // )
{0xC9A8, 0x626B}, //{0xE6, 0x89, 0xAB}, // ɨ
- {0xD1EF, 0x626C}, //{0xE6, 0x89, 0xAC}, // Ñï
+ {0xD1EF, 0x626C}, //{0xE6, 0x89, 0xAC}, // ��
{0xC5A4, 0x626D}, //{0xE6, 0x89, 0xAD}, // Ť
- {0xB0E7, 0x626E}, //{0xE6, 0x89, 0xAE}, // °ç
- {0xB3B6, 0x626F}, //{0xE6, 0x89, 0xAF}, // ³¶
- {0xC8C5, 0x6270}, //{0xE6, 0x89, 0xB0}, // ÈÅ
- {0xB0E2, 0x6273}, //{0xE6, 0x89, 0xB3}, // °â
- {0xB7F6, 0x6276}, //{0xE6, 0x89, 0xB6}, // ·ö
- {0xC5FA, 0x6279}, //{0xE6, 0x89, 0xB9}, // Åú
- {0xB6F3, 0x627C}, //{0xE6, 0x89, 0xBC}, // ¶ó
- {0xD5D2, 0x627E}, //{0xE6, 0x89, 0xBE}, // ÕÒ
- {0xB3D0, 0x627F}, //{0xE6, 0x89, 0xBF}, // ³Ð
- {0xBCBC, 0x6280}, //{0xE6, 0x8A, 0x80}, // ¼¼
- {0xB3AD, 0x6284}, //{0xE6, 0x8A, 0x84}, // ³
- {0xB0D1, 0x628A}, //{0xE6, 0x8A, 0x8A}, // °Ñ
- {0xD2D6, 0x6291}, //{0xE6, 0x8A, 0x91}, // ÒÖ
- {0xCAE3, 0x6292}, //{0xE6, 0x8A, 0x92}, // Êã
+ {0xB0E7, 0x626E}, //{0xE6, 0x89, 0xAE}, // ��
+ {0xB3B6, 0x626F}, //{0xE6, 0x89, 0xAF}, // ��
+ {0xC8C5, 0x6270}, //{0xE6, 0x89, 0xB0}, // ��
+ {0xB0E2, 0x6273}, //{0xE6, 0x89, 0xB3}, // ��
+ {0xB7F6, 0x6276}, //{0xE6, 0x89, 0xB6}, // ��
+ {0xC5FA, 0x6279}, //{0xE6, 0x89, 0xB9}, // ��
+ {0xB6F3, 0x627C}, //{0xE6, 0x89, 0xBC}, // ��
+ {0xD5D2, 0x627E}, //{0xE6, 0x89, 0xBE}, // ��
+ {0xB3D0, 0x627F}, //{0xE6, 0x89, 0xBF}, // ��
+ {0xBCBC, 0x6280}, //{0xE6, 0x8A, 0x80}, // ��
+ {0xB3AD, 0x6284}, //{0xE6, 0x8A, 0x84}, // ��
+ {0xB0D1, 0x628A}, //{0xE6, 0x8A, 0x8A}, // ��
+ {0xD2D6, 0x6291}, //{0xE6, 0x8A, 0x91}, // ��
+ {0xCAE3, 0x6292}, //{0xE6, 0x8A, 0x92}, // ��
{0xD7A5, 0x6293}, //{0xE6, 0x8A, 0x93}, // ×¥
{0xCDB6, 0x6295}, //{0xE6, 0x8A, 0x95}, // Ͷ
- {0xB6B6, 0x6296}, //{0xE6, 0x8A, 0x96}, // ¶¶
- {0xBFB9, 0x6297}, //{0xE6, 0x8A, 0x97}, // ¿¹
- {0xD5DB, 0x6298}, //{0xE6, 0x8A, 0x98}, // ÕÛ
- {0xB8A7, 0x629A}, //{0xE6, 0x8A, 0x9A}, // ¸§
- {0xC5D7, 0x629B}, //{0xE6, 0x8A, 0x9B}, // Å×
- {0xBFD9, 0x62A0}, //{0xE6, 0x8A, 0xA0}, // ¿Ù
- {0xC2D5, 0x62A1}, //{0xE6, 0x8A, 0xA1}, // ÂÕ
- {0xC7C0, 0x62A2}, //{0xE6, 0x8A, 0xA2}, // ÇÀ
- {0xBBA4, 0x62A4}, //{0xE6, 0x8A, 0xA4}, // »¤
- {0xB1A8, 0x62A5}, //{0xE6, 0x8A, 0xA5}, // ±¨
- {0xC5FB, 0x62AB}, //{0xE6, 0x8A, 0xAB}, // Åû
+ {0xB6B6, 0x6296}, //{0xE6, 0x8A, 0x96}, // ��
+ {0xBFB9, 0x6297}, //{0xE6, 0x8A, 0x97}, // ��
+ {0xD5DB, 0x6298}, //{0xE6, 0x8A, 0x98}, // ��
+ {0xB8A7, 0x629A}, //{0xE6, 0x8A, 0x9A}, // ��
+ {0xC5D7, 0x629B}, //{0xE6, 0x8A, 0x9B}, // ��
+ {0xBFD9, 0x62A0}, //{0xE6, 0x8A, 0xA0}, // ��
+ {0xC2D5, 0x62A1}, //{0xE6, 0x8A, 0xA1}, // ��
+ {0xC7C0, 0x62A2}, //{0xE6, 0x8A, 0xA2}, // ��
+ {0xBBA4, 0x62A4}, //{0xE6, 0x8A, 0xA4}, // ��
+ {0xB1A8, 0x62A5}, //{0xE6, 0x8A, 0xA5}, // ��
+ {0xC5FB, 0x62AB}, //{0xE6, 0x8A, 0xAB}, // ��
{0xCCA7, 0x62AC}, //{0xE6, 0x8A, 0xAC}, // ̧
- {0xB1A7, 0x62B1}, //{0xE6, 0x8A, 0xB1}, // ±§
- {0xB5D6, 0x62B5}, //{0xE6, 0x8A, 0xB5}, // µÖ
+ {0xB1A7, 0x62B1}, //{0xE6, 0x8A, 0xB1}, // ��
+ {0xB5D6, 0x62B5}, //{0xE6, 0x8A, 0xB5}, // ��
{0xC4A8, 0x62B9}, //{0xE6, 0x8A, 0xB9}, // Ĩ
{0xD1BA, 0x62BC}, //{0xE6, 0x8A, 0xBC}, // Ѻ
- {0xB3E9, 0x62BD}, //{0xE6, 0x8A, 0xBD}, // ³é
- {0xB7F7, 0x62C2}, //{0xE6, 0x8B, 0x82}, // ·÷
- {0xD6F4, 0x62C4}, //{0xE6, 0x8B, 0x84}, // Öô
- {0xB5A3, 0x62C5}, //{0xE6, 0x8B, 0x85}, // µ£
- {0xB2F0, 0x62C6}, //{0xE6, 0x8B, 0x86}, // ²ð
+ {0xB3E9, 0x62BD}, //{0xE6, 0x8A, 0xBD}, // ��
+ {0xB7F7, 0x62C2}, //{0xE6, 0x8B, 0x82}, // ��
+ {0xD6F4, 0x62C4}, //{0xE6, 0x8B, 0x84}, // ��
+ {0xB5A3, 0x62C5}, //{0xE6, 0x8B, 0x85}, // ��
+ {0xB2F0, 0x62C6}, //{0xE6, 0x8B, 0x86}, // ��
{0xC4B4, 0x62C7}, //{0xE6, 0x8B, 0x87}, // Ä´
- {0xC0AD, 0x62C9}, //{0xE6, 0x8B, 0x89}, // À
- {0xB0E8, 0x62CC}, //{0xE6, 0x8B, 0x8C}, // °è
- {0xC5C4, 0x62CD}, //{0xE6, 0x8B, 0x8D}, // ÅÄ
- {0xB9D5, 0x62D0}, //{0xE6, 0x8B, 0x90}, // ¹Õ
- {0xBEDC, 0x62D2}, //{0xE6, 0x8B, 0x92}, // ¾Ü
- {0xCDD8, 0x62D3}, //{0xE6, 0x8B, 0x93}, // ÍØ
- {0xB0CE, 0x62D4}, //{0xE6, 0x8B, 0x94}, // °Î
- {0xCDCF, 0x62D6}, //{0xE6, 0x8B, 0x96}, // ÍÏ
- {0xDED6, 0x62D7}, //{0xE6, 0x8B, 0x97}, // ÞÖ
- {0xBED0, 0x62D8}, //{0xE6, 0x8B, 0x98}, // ¾Ð
+ {0xC0AD, 0x62C9}, //{0xE6, 0x8B, 0x89}, // -
+ {0xB0E8, 0x62CC}, //{0xE6, 0x8B, 0x8C}, // ��
+ {0xC5C4, 0x62CD}, //{0xE6, 0x8B, 0x8D}, // ��
+ {0xB9D5, 0x62D0}, //{0xE6, 0x8B, 0x90}, // ��
+ {0xBEDC, 0x62D2}, //{0xE6, 0x8B, 0x92}, // ��
+ {0xCDD8, 0x62D3}, //{0xE6, 0x8B, 0x93}, // ��
+ {0xB0CE, 0x62D4}, //{0xE6, 0x8B, 0x94}, // ��
+ {0xCDCF, 0x62D6}, //{0xE6, 0x8B, 0x96}, // ��
+ {0xDED6, 0x62D7}, //{0xE6, 0x8B, 0x97}, // ��
+ {0xBED0, 0x62D8}, //{0xE6, 0x8B, 0x98}, // ��
{0xD7BE, 0x62D9}, //{0xE6, 0x8B, 0x99}, // ×¾
- {0xD5D0, 0x62DB}, //{0xE6, 0x8B, 0x9B}, // ÕÐ
- {0xB0DD, 0x62DC}, //{0xE6, 0x8B, 0x9C}, // °Ý
- {0xC4E2, 0x62DF}, //{0xE6, 0x8B, 0x9F}, // Äâ
+ {0xD5D0, 0x62DB}, //{0xE6, 0x8B, 0x9B}, // ��
+ {0xB0DD, 0x62DC}, //{0xE6, 0x8B, 0x9C}, // ��
+ {0xC4E2, 0x62DF}, //{0xE6, 0x8B, 0x9F}, // ��
{0xC2A3, 0x62E2}, //{0xE6, 0x8B, 0xA2}, // £
- {0xBCF0, 0x62E3}, //{0xE6, 0x8B, 0xA3}, // ¼ð
+ {0xBCF0, 0x62E3}, //{0xE6, 0x8B, 0xA3}, // ��
{0xD3B5, 0x62E5}, //{0xE6, 0x8B, 0xA5}, // Óµ
- {0xC0B9, 0x62E6}, //{0xE6, 0x8B, 0xA6}, // À¹
+ {0xC0B9, 0x62E6}, //{0xE6, 0x8B, 0xA6}, // 9
{0xC5A1, 0x62E7}, //{0xE6, 0x8B, 0xA7}, // Å¡
- {0xB2A6, 0x62E8}, //{0xE6, 0x8B, 0xA8}, // ²¦
- {0xD4F1, 0x62E9}, //{0xE6, 0x8B, 0xA9}, // Ôñ
- {0xC0A8, 0x62EC}, //{0xE6, 0x8B, 0xAC}, // ˬ
- {0xCAC3, 0x62ED}, //{0xE6, 0x8B, 0xAD}, // ÊÃ
- {0xD5FC, 0x62EF}, //{0xE6, 0x8B, 0xAF}, // Õü
- {0xB9B0, 0x62F1}, //{0xE6, 0x8B, 0xB1}, // ¹°
+ {0xB2A6, 0x62E8}, //{0xE6, 0x8B, 0xA8}, // ��
+ {0xD4F1, 0x62E9}, //{0xE6, 0x8B, 0xA9}, // ��
+ {0xC0A8, 0x62EC}, //{0xE6, 0x8B, 0xAC}, // (
+ {0xCAC3, 0x62ED}, //{0xE6, 0x8B, 0xAD}, // ��
+ {0xD5FC, 0x62EF}, //{0xE6, 0x8B, 0xAF}, // ��
+ {0xB9B0, 0x62F1}, //{0xE6, 0x8B, 0xB1}, // ��
{0xC8AD, 0x62F3}, //{0xE6, 0x8B, 0xB3}, // È
{0xCBA9, 0x62F4}, //{0xE6, 0x8B, 0xB4}, // Ë©
- {0xBFBD, 0x62F7}, //{0xE6, 0x8B, 0xB7}, // ¿½
+ {0xBFBD, 0x62F7}, //{0xE6, 0x8B, 0xB7}, // ��
{0xC6B4, 0x62FC}, //{0xE6, 0x8B, 0xBC}, // Æ´
{0xCAB0, 0x62FE}, //{0xE6, 0x8B, 0xBE}, // ʰ
- {0xC4C3, 0x62FF}, //{0xE6, 0x8B, 0xBF}, // ÄÃ
- {0xB3D6, 0x6301}, //{0xE6, 0x8C, 0x81}, // ³Ö
- {0xB9D2, 0x6302}, //{0xE6, 0x8C, 0x82}, // ¹Ò
+ {0xC4C3, 0x62FF}, //{0xE6, 0x8B, 0xBF}, // ��
+ {0xB3D6, 0x6301}, //{0xE6, 0x8C, 0x81}, // ��
+ {0xB9D2, 0x6302}, //{0xE6, 0x8C, 0x82}, // ��
{0xD6B8, 0x6307}, //{0xE6, 0x8C, 0x87}, // Ö¸
- {0xB0B4, 0x6309}, //{0xE6, 0x8C, 0x89}, // °´
- {0xBFE6, 0x630E}, //{0xE6, 0x8C, 0x8E}, // ¿æ
- {0xCCF4, 0x6311}, //{0xE6, 0x8C, 0x91}, // Ìô
- {0xCDDA, 0x6316}, //{0xE6, 0x8C, 0x96}, // ÍÚ
+ {0xB0B4, 0x6309}, //{0xE6, 0x8C, 0x89}, // ��
+ {0xBFE6, 0x630E}, //{0xE6, 0x8C, 0x8E}, // ��
+ {0xCCF4, 0x6311}, //{0xE6, 0x8C, 0x91}, // ��
+ {0xCDDA, 0x6316}, //{0xE6, 0x8C, 0x96}, // ��
{0xD6BF, 0x631A}, //{0xE6, 0x8C, 0x9A}, // Ö¿
{0xD0AE, 0x631F}, //{0xE6, 0x8C, 0x9F}, // Ю
- {0xC4D3, 0x6320}, //{0xE6, 0x8C, 0xA0}, // ÄÓ
- {0xB5B2, 0x6321}, //{0xE6, 0x8C, 0xA1}, // µ²
- {0xD5F5, 0x6323}, //{0xE6, 0x8C, 0xA3}, // Õõ
- {0xBCB7, 0x6324}, //{0xE6, 0x8C, 0xA4}, // ¼·
- {0xBBD3, 0x6325}, //{0xE6, 0x8C, 0xA5}, // »Ó
- {0xB0A4, 0x6328}, //{0xE6, 0x8C, 0xA8}, // °¤
+ {0xC4D3, 0x6320}, //{0xE6, 0x8C, 0xA0}, // ��
+ {0xB5B2, 0x6321}, //{0xE6, 0x8C, 0xA1}, // ��
+ {0xD5F5, 0x6323}, //{0xE6, 0x8C, 0xA3}, // ��
+ {0xBCB7, 0x6324}, //{0xE6, 0x8C, 0xA4}, // ��
+ {0xBBD3, 0x6325}, //{0xE6, 0x8C, 0xA5}, // ��
+ {0xB0A4, 0x6328}, //{0xE6, 0x8C, 0xA8}, // ��
{0xC5B2, 0x632A}, //{0xE6, 0x8C, 0xAA}, // Ų
- {0xB4EC, 0x632B}, //{0xE6, 0x8C, 0xAB}, // ´ì
- {0xD5F1, 0x632F}, //{0xE6, 0x8C, 0xAF}, // Õñ
+ {0xB4EC, 0x632B}, //{0xE6, 0x8C, 0xAB}, // ��
+ {0xD5F1, 0x632F}, //{0xE6, 0x8C, 0xAF}, // ��
{0xCDA6, 0x633A}, //{0xE6, 0x8C, 0xBA}, // ͦ
- {0xCDEC, 0x633D}, //{0xE6, 0x8C, 0xBD}, // Íì
- {0xCEE6, 0x6342}, //{0xE6, 0x8D, 0x82}, // Îæ
+ {0xCDEC, 0x633D}, //{0xE6, 0x8C, 0xBD}, // ��
+ {0xCEE6, 0x6342}, //{0xE6, 0x8D, 0x82}, // ��
{0xCDB1, 0x6345}, //{0xE6, 0x8D, 0x85}, // ͱ
- {0xC0A6, 0x6346}, //{0xE6, 0x8D, 0x86}, // À¦
+ {0xC0A6, 0x6346}, //{0xE6, 0x8D, 0x86}, // &
{0xD7BD, 0x6349}, //{0xE6, 0x8D, 0x89}, // ×½
- {0xB0C6, 0x634C}, //{0xE6, 0x8D, 0x8C}, // °Æ
- {0xBAB4, 0x634D}, //{0xE6, 0x8D, 0x8D}, // º´
- {0xC9D3, 0x634E}, //{0xE6, 0x8D, 0x8E}, // ÉÓ
- {0xC4F3, 0x634F}, //{0xE6, 0x8D, 0x8F}, // Äó
- {0xBEE8, 0x6350}, //{0xE6, 0x8D, 0x90}, // ¾è
- {0xB2B6, 0x6355}, //{0xE6, 0x8D, 0x95}, // ²¶
- {0xC0CC, 0x635E}, //{0xE6, 0x8D, 0x9E}, // ÀÌ
- {0xCBF0, 0x635F}, //{0xE6, 0x8D, 0x9F}, // Ëð
- {0xBCF1, 0x6361}, //{0xE6, 0x8D, 0xA1}, // ¼ñ
- {0xBBBB, 0x6362}, //{0xE6, 0x8D, 0xA2}, // »»
- {0xB5B7, 0x6363}, //{0xE6, 0x8D, 0xA3}, // µ·
- {0xC5F5, 0x6367}, //{0xE6, 0x8D, 0xA7}, // Åõ
- {0xBEDD, 0x636E}, //{0xE6, 0x8D, 0xAE}, // ¾Ý
- {0xB4B7, 0x6376}, //{0xE6, 0x8D, 0xB6}, // ´·
- {0xBDDD, 0x6377}, //{0xE6, 0x8D, 0xB7}, // ½Ý
- {0xDEE0, 0x637A}, //{0xE6, 0x8D, 0xBA}, // Þà
- {0xC4ED, 0x637B}, //{0xE6, 0x8D, 0xBB}, // Äí
- {0xCFC6, 0x6380}, //{0xE6, 0x8E, 0x80}, // ÏÆ
- {0xB5E0, 0x6382}, //{0xE6, 0x8E, 0x82}, // µà
- {0xCADA, 0x6388}, //{0xE6, 0x8E, 0x88}, // ÊÚ
- {0xB5F4, 0x6389}, //{0xE6, 0x8E, 0x89}, // µô
- {0xD5C6, 0x638C}, //{0xE6, 0x8E, 0x8C}, // ÕÆ
- {0xCCCD, 0x638F}, //{0xE6, 0x8E, 0x8F}, // ÌÍ
- {0xC6FE, 0x6390}, //{0xE6, 0x8E, 0x90}, // Æþ
- {0xC5C5, 0x6392}, //{0xE6, 0x8E, 0x92}, // ÅÅ
+ {0xB0C6, 0x634C}, //{0xE6, 0x8D, 0x8C}, // ��
+ {0xBAB4, 0x634D}, //{0xE6, 0x8D, 0x8D}, // ��
+ {0xC9D3, 0x634E}, //{0xE6, 0x8D, 0x8E}, // ��
+ {0xC4F3, 0x634F}, //{0xE6, 0x8D, 0x8F}, // ��
+ {0xBEE8, 0x6350}, //{0xE6, 0x8D, 0x90}, // ��
+ {0xB2B6, 0x6355}, //{0xE6, 0x8D, 0x95}, // ��
+ {0xC0CC, 0x635E}, //{0xE6, 0x8D, 0x9E}, // ��
+ {0xCBF0, 0x635F}, //{0xE6, 0x8D, 0x9F}, // ��
+ {0xBCF1, 0x6361}, //{0xE6, 0x8D, 0xA1}, // ��
+ {0xBBBB, 0x6362}, //{0xE6, 0x8D, 0xA2}, // ��
+ {0xB5B7, 0x6363}, //{0xE6, 0x8D, 0xA3}, // ��
+ {0xC5F5, 0x6367}, //{0xE6, 0x8D, 0xA7}, // ��
+ {0xBEDD, 0x636E}, //{0xE6, 0x8D, 0xAE}, // ��
+ {0xB4B7, 0x6376}, //{0xE6, 0x8D, 0xB6}, // ��
+ {0xBDDD, 0x6377}, //{0xE6, 0x8D, 0xB7}, // ��
+ {0xDEE0, 0x637A}, //{0xE6, 0x8D, 0xBA}, // ��
+ {0xC4ED, 0x637B}, //{0xE6, 0x8D, 0xBB}, // ��
+ {0xCFC6, 0x6380}, //{0xE6, 0x8E, 0x80}, // ��
+ {0xB5E0, 0x6382}, //{0xE6, 0x8E, 0x82}, // ��
+ {0xCADA, 0x6388}, //{0xE6, 0x8E, 0x88}, // ��
+ {0xB5F4, 0x6389}, //{0xE6, 0x8E, 0x89}, // ��
+ {0xD5C6, 0x638C}, //{0xE6, 0x8E, 0x8C}, // ��
+ {0xCCCD, 0x638F}, //{0xE6, 0x8E, 0x8F}, // ��
+ {0xC6FE, 0x6390}, //{0xE6, 0x8E, 0x90}, // ��
+ {0xC5C5, 0x6392}, //{0xE6, 0x8E, 0x92}, // ��
{0xD2B4, 0x6396}, //{0xE6, 0x8E, 0x96}, // Ò´
- {0xBEF2, 0x6398}, //{0xE6, 0x8E, 0x98}, // ¾ò
- {0xC2D3, 0x63A0}, //{0xE6, 0x8E, 0xA0}, // ÂÓ
+ {0xBEF2, 0x6398}, //{0xE6, 0x8E, 0x98}, // ��
+ {0xC2D3, 0x63A0}, //{0xE6, 0x8E, 0xA0}, // ��
{0xCCBD, 0x63A2}, //{0xE6, 0x8E, 0xA2}, // ̽
- {0xBDD3, 0x63A5}, //{0xE6, 0x8E, 0xA5}, // ½Ó
- {0xBFD8, 0x63A7}, //{0xE6, 0x8E, 0xA7}, // ¿Ø
- {0xCDC6, 0x63A8}, //{0xE6, 0x8E, 0xA8}, // ÍÆ
- {0xD1DA, 0x63A9}, //{0xE6, 0x8E, 0xA9}, // ÑÚ
- {0xB4EB, 0x63AA}, //{0xE6, 0x8E, 0xAA}, // ´ë
- {0xEAFE, 0x63B0}, //{0xE6, 0x8E, 0xB0}, // êþ
- {0xD6C0, 0x63B7}, //{0xE6, 0x8E, 0xB7}, // ÖÀ
- {0xB5A7, 0x63B8}, //{0xE6, 0x8E, 0xB8}, // µ§
- {0xB2F4, 0x63BA}, //{0xE6, 0x8E, 0xBA}, // ²ô
- {0xC8E0, 0x63C9}, //{0xE6, 0x8F, 0x89}, // Èà
- {0xD7E1, 0x63CD}, //{0xE6, 0x8F, 0x8D}, // ×á
- {0xC3E8, 0x63CF}, //{0xE6, 0x8F, 0x8F}, // Ãè
- {0xCCE1, 0x63D0}, //{0xE6, 0x8F, 0x90}, // Ìá
- {0xB2E5, 0x63D2}, //{0xE6, 0x8F, 0x92}, // ²å
+ {0xBDD3, 0x63A5}, //{0xE6, 0x8E, 0xA5}, // ��
+ {0xBFD8, 0x63A7}, //{0xE6, 0x8E, 0xA7}, // ��
+ {0xCDC6, 0x63A8}, //{0xE6, 0x8E, 0xA8}, // ��
+ {0xD1DA, 0x63A9}, //{0xE6, 0x8E, 0xA9}, // ��
+ {0xB4EB, 0x63AA}, //{0xE6, 0x8E, 0xAA}, // ��
+ {0xEAFE, 0x63B0}, //{0xE6, 0x8E, 0xB0}, // ��
+ {0xD6C0, 0x63B7}, //{0xE6, 0x8E, 0xB7}, // ��
+ {0xB5A7, 0x63B8}, //{0xE6, 0x8E, 0xB8}, // ��
+ {0xB2F4, 0x63BA}, //{0xE6, 0x8E, 0xBA}, // ��
+ {0xC8E0, 0x63C9}, //{0xE6, 0x8F, 0x89}, // ��
+ {0xD7E1, 0x63CD}, //{0xE6, 0x8F, 0x8D}, // ��
+ {0xC3E8, 0x63CF}, //{0xE6, 0x8F, 0x8F}, // ��
+ {0xCCE1, 0x63D0}, //{0xE6, 0x8F, 0x90}, // ��
+ {0xB2E5, 0x63D2}, //{0xE6, 0x8F, 0x92}, // ��
{0xD2BE, 0x63D6}, //{0xE6, 0x8F, 0x96}, // Ò¾
- {0xCED5, 0x63E1}, //{0xE6, 0x8F, 0xA1}, // ÎÕ
- {0xB4A7, 0x63E3}, //{0xE6, 0x8F, 0xA3}, // ´§
- {0xBFAB, 0x63E9}, //{0xE6, 0x8F, 0xA9}, // ¿«
- {0xBEBE, 0x63EA}, //{0xE6, 0x8F, 0xAA}, // ¾¾
- {0xBDD2, 0x63ED}, //{0xE6, 0x8F, 0xAD}, // ½Ò
+ {0xCED5, 0x63E1}, //{0xE6, 0x8F, 0xA1}, // ��
+ {0xB4A7, 0x63E3}, //{0xE6, 0x8F, 0xA3}, // ��
+ {0xBFAB, 0x63E9}, //{0xE6, 0x8F, 0xA9}, // ��
+ {0xBEBE, 0x63EA}, //{0xE6, 0x8F, 0xAA}, // ��
+ {0xBDD2, 0x63ED}, //{0xE6, 0x8F, 0xAD}, // ��
{0xD4AE, 0x63F4}, //{0xE6, 0x8F, 0xB4}, // Ô®
- {0xC0BF, 0x63FD}, //{0xE6, 0x8F, 0xBD}, // À¿
- {0xB2F3, 0x6400}, //{0xE6, 0x90, 0x80}, // ²ó
- {0xB8E9, 0x6401}, //{0xE6, 0x90, 0x81}, // ¸é
+ {0xC0BF, 0x63FD}, //{0xE6, 0x8F, 0xBD}, // ?
+ {0xB2F3, 0x6400}, //{0xE6, 0x90, 0x80}, // ��
+ {0xB8E9, 0x6401}, //{0xE6, 0x90, 0x81}, // ��
{0xC2A7, 0x6402}, //{0xE6, 0x90, 0x82}, // §
- {0xBDC1, 0x6405}, //{0xE6, 0x90, 0x85}, // ½Á
- {0xB2AB, 0x640F}, //{0xE6, 0x90, 0x8F}, // ²«
- {0xB4EA, 0x6413}, //{0xE6, 0x90, 0x93}, // ´ê
+ {0xBDC1, 0x6405}, //{0xE6, 0x90, 0x85}, // ��
+ {0xB2AB, 0x640F}, //{0xE6, 0x90, 0x8F}, // ��
+ {0xB4EA, 0x6413}, //{0xE6, 0x90, 0x93}, // ��
{0xC9A6, 0x6414}, //{0xE6, 0x90, 0x94}, // ɦ
- {0xCBD1, 0x641C}, //{0xE6, 0x90, 0x9C}, // ËÑ
- {0xB8E3, 0x641E}, //{0xE6, 0x90, 0x9E}, // ¸ã
- {0xCCC2, 0x642A}, //{0xE6, 0x90, 0xAA}, // ÌÂ
- {0xB0E1, 0x642C}, //{0xE6, 0x90, 0xAC}, // °á
- {0xB4EE, 0x642D}, //{0xE6, 0x90, 0xAD}, // ´î
+ {0xCBD1, 0x641C}, //{0xE6, 0x90, 0x9C}, // ��
+ {0xB8E3, 0x641E}, //{0xE6, 0x90, 0x9E}, // ��
+ {0xCCC2, 0x642A}, //{0xE6, 0x90, 0xAA}, // ��
+ {0xB0E1, 0x642C}, //{0xE6, 0x90, 0xAC}, // ��
+ {0xB4EE, 0x642D}, //{0xE6, 0x90, 0xAD}, // ��
{0xD0AF, 0x643A}, //{0xE6, 0x90, 0xBA}, // Я
- {0xC9E3, 0x6444}, //{0xE6, 0x91, 0x84}, // Éã
- {0xB0DA, 0x6446}, //{0xE6, 0x91, 0x86}, // °Ú
+ {0xC9E3, 0x6444}, //{0xE6, 0x91, 0x84}, // ��
+ {0xB0DA, 0x6446}, //{0xE6, 0x91, 0x86}, // ��
{0xD2A1, 0x6447}, //{0xE6, 0x91, 0x87}, // Ò¡
{0xCCAF, 0x644A}, //{0xE6, 0x91, 0x8A}, // ̯
{0xCBA4, 0x6454}, //{0xE6, 0x91, 0x94}, // ˤ
{0xD5AA, 0x6458}, //{0xE6, 0x91, 0x98}, // Õª
- {0xB4DD, 0x6467}, //{0xE6, 0x91, 0xA7}, // ´Ý
+ {0xB4DD, 0x6467}, //{0xE6, 0x91, 0xA7}, // ��
{0xC4A6, 0x6469}, //{0xE6, 0x91, 0xA9}, // Ħ
- {0xC3FE, 0x6478}, //{0xE6, 0x91, 0xB8}, // Ãþ
+ {0xC3FE, 0x6478}, //{0xE6, 0x91, 0xB8}, // ��
{0xC4A1, 0x6479}, //{0xE6, 0x91, 0xB9}, // Ä¡
{0xC6B2, 0x6487}, //{0xE6, 0x92, 0x87}, // Ʋ
- {0xB3C5, 0x6491}, //{0xE6, 0x92, 0x91}, // ³Å
- {0xC8F6, 0x6492}, //{0xE6, 0x92, 0x92}, // Èö
+ {0xB3C5, 0x6491}, //{0xE6, 0x92, 0x91}, // ��
+ {0xC8F6, 0x6492}, //{0xE6, 0x92, 0x92}, // ��
{0xCBBA, 0x6495}, //{0xE6, 0x92, 0x95}, // ˺
{0xD7B2, 0x649E}, //{0xE6, 0x92, 0x9E}, // ײ
- {0xB3B7, 0x64A4}, //{0xE6, 0x92, 0xA4}, // ³·
- {0xC1C3, 0x64A9}, //{0xE6, 0x92, 0xA9}, // ÁÃ
- {0xC7CB, 0x64AC}, //{0xE6, 0x92, 0xAC}, // ÇË
- {0xB2A5, 0x64AD}, //{0xE6, 0x92, 0xAD}, // ²¥
- {0xB4E9, 0x64AE}, //{0xE6, 0x92, 0xAE}, // ´é
+ {0xB3B7, 0x64A4}, //{0xE6, 0x92, 0xA4}, // ��
+ {0xC1C3, 0x64A9}, //{0xE6, 0x92, 0xA9}, // ��
+ {0xC7CB, 0x64AC}, //{0xE6, 0x92, 0xAC}, // ��
+ {0xB2A5, 0x64AD}, //{0xE6, 0x92, 0xAD}, // ��
+ {0xB4E9, 0x64AE}, //{0xE6, 0x92, 0xAE}, // ��
{0xD7AB, 0x64B0}, //{0xE6, 0x92, 0xB0}, // ׫
- {0xC4EC, 0x64B5}, //{0xE6, 0x92, 0xB5}, // Äì
- {0xBAB3, 0x64BC}, //{0xE6, 0x92, 0xBC}, // º³
- {0xC0DE, 0x64C2}, //{0xE6, 0x93, 0x82}, // ÀÞ
- {0xC9C3, 0x64C5}, //{0xE6, 0x93, 0x85}, // ÉÃ
- {0xB2D9, 0x64CD}, //{0xE6, 0x93, 0x8D}, // ²Ù
- {0xC7E6, 0x64CE}, //{0xE6, 0x93, 0x8E}, // Çæ
- {0xC7DC, 0x64D2}, //{0xE6, 0x93, 0x92}, // ÇÜ
- {0xB2C1, 0x64E6}, //{0xE6, 0x93, 0xA6}, // ²Á
- {0xC5CA, 0x6500}, //{0xE6, 0x94, 0x80}, // ÅÊ
- {0xD4DC, 0x6512}, //{0xE6, 0x94, 0x92}, // ÔÜ
- {0xC8C1, 0x6518}, //{0xE6, 0x94, 0x98}, // ÈÁ
+ {0xC4EC, 0x64B5}, //{0xE6, 0x92, 0xB5}, // ��
+ {0xBAB3, 0x64BC}, //{0xE6, 0x92, 0xBC}, // ��
+ {0xC0DE, 0x64C2}, //{0xE6, 0x93, 0x82}, // ��
+ {0xC9C3, 0x64C5}, //{0xE6, 0x93, 0x85}, // ��
+ {0xB2D9, 0x64CD}, //{0xE6, 0x93, 0x8D}, // ��
+ {0xC7E6, 0x64CE}, //{0xE6, 0x93, 0x8E}, // ��
+ {0xC7DC, 0x64D2}, //{0xE6, 0x93, 0x92}, // ��
+ {0xB2C1, 0x64E6}, //{0xE6, 0x93, 0xA6}, // ��
+ {0xC5CA, 0x6500}, //{0xE6, 0x94, 0x80}, // ��
+ {0xD4DC, 0x6512}, //{0xE6, 0x94, 0x92}, // ��
+ {0xC8C1, 0x6518}, //{0xE6, 0x94, 0x98}, // ��
{0xD6A7, 0x652F}, //{0xE6, 0x94, 0xAF}, // Ö§
- {0xCAD5, 0x6536}, //{0xE6, 0x94, 0xB6}, // ÊÕ
- {0xB8C4, 0x6539}, //{0xE6, 0x94, 0xB9}, // ¸Ä
- {0xB9A5, 0x653B}, //{0xE6, 0x94, 0xBB}, // ¹¥
- {0xB7C5, 0x653E}, //{0xE6, 0x94, 0xBE}, // ·Å
- {0xD5FE, 0x653F}, //{0xE6, 0x94, 0xBF}, // Õþ
- {0xB9CA, 0x6545}, //{0xE6, 0x95, 0x85}, // ¹Ê
+ {0xCAD5, 0x6536}, //{0xE6, 0x94, 0xB6}, // ��
+ {0xB8C4, 0x6539}, //{0xE6, 0x94, 0xB9}, // ��
+ {0xB9A5, 0x653B}, //{0xE6, 0x94, 0xBB}, // ��
+ {0xB7C5, 0x653E}, //{0xE6, 0x94, 0xBE}, // ��
+ {0xD5FE, 0x653F}, //{0xE6, 0x94, 0xBF}, // ��
+ {0xB9CA, 0x6545}, //{0xE6, 0x95, 0x85}, // ��
{0xD0A7, 0x6548}, //{0xE6, 0x95, 0x88}, // Ч
- {0xB5D0, 0x654C}, //{0xE6, 0x95, 0x8C}, // µÐ
- {0xC3F4, 0x654F}, //{0xE6, 0x95, 0x8F}, // Ãô
- {0xBEC8, 0x6551}, //{0xE6, 0x95, 0x91}, // ¾È
- {0xBDCC, 0x6559}, //{0xE6, 0x95, 0x99}, // ½Ì
- {0xC1B2, 0x655B}, //{0xE6, 0x95, 0x9B}, // Á²
- {0xB3A8, 0x655E}, //{0xE6, 0x95, 0x9E}, // ³¨
- {0xB8D2, 0x6562}, //{0xE6, 0x95, 0xA2}, // ¸Ò
+ {0xB5D0, 0x654C}, //{0xE6, 0x95, 0x8C}, // ��
+ {0xC3F4, 0x654F}, //{0xE6, 0x95, 0x8F}, // ��
+ {0xBEC8, 0x6551}, //{0xE6, 0x95, 0x91}, // ��
+ {0xBDCC, 0x6559}, //{0xE6, 0x95, 0x99}, // ��
+ {0xC1B2, 0x655B}, //{0xE6, 0x95, 0x9B}, // r
+ {0xB3A8, 0x655E}, //{0xE6, 0x95, 0x9E}, // ��
+ {0xB8D2, 0x6562}, //{0xE6, 0x95, 0xA2}, // ��
{0xC9A2, 0x6563}, //{0xE6, 0x95, 0xA3}, // ɢ
- {0xB6D8, 0x6566}, //{0xE6, 0x95, 0xA6}, // ¶Ø
- {0xBEB4, 0x656C}, //{0xE6, 0x95, 0xAC}, // ¾´
- {0xCAFD, 0x6570}, //{0xE6, 0x95, 0xB0}, // Êý
- {0xC7C3, 0x6572}, //{0xE6, 0x95, 0xB2}, // ÇÃ
- {0xD5FB, 0x6574}, //{0xE6, 0x95, 0xB4}, // Õû
- {0xB7F3, 0x6577}, //{0xE6, 0x95, 0xB7}, // ·ó
- {0xCEC4, 0x6587}, //{0xE6, 0x96, 0x87}, // ÎÄ
+ {0xB6D8, 0x6566}, //{0xE6, 0x95, 0xA6}, // ��
+ {0xBEB4, 0x656C}, //{0xE6, 0x95, 0xAC}, // ��
+ {0xCAFD, 0x6570}, //{0xE6, 0x95, 0xB0}, // ��
+ {0xC7C3, 0x6572}, //{0xE6, 0x95, 0xB2}, // ��
+ {0xD5FB, 0x6574}, //{0xE6, 0x95, 0xB4}, // ��
+ {0xB7F3, 0x6577}, //{0xE6, 0x95, 0xB7}, // ��
+ {0xCEC4, 0x6587}, //{0xE6, 0x96, 0x87}, // ��
{0xD5AB, 0x658B}, //{0xE6, 0x96, 0x8B}, // Õ«
- {0xB0DF, 0x6591}, //{0xE6, 0x96, 0x91}, // °ß
- {0xB6B7, 0x6597}, //{0xE6, 0x96, 0x97}, // ¶·
- {0xC1CF, 0x6599}, //{0xE6, 0x96, 0x99}, // ÁÏ
+ {0xB0DF, 0x6591}, //{0xE6, 0x96, 0x91}, // ��
+ {0xB6B7, 0x6597}, //{0xE6, 0x96, 0x97}, // ��
+ {0xC1CF, 0x6599}, //{0xE6, 0x96, 0x99}, // ��
{0xD0B1, 0x659C}, //{0xE6, 0x96, 0x9C}, // б
- {0xD5E5, 0x659F}, //{0xE6, 0x96, 0x9F}, // Õå
- {0xBDEF, 0x65A4}, //{0xE6, 0x96, 0xA4}, // ½ï
- {0xB3E2, 0x65A5}, //{0xE6, 0x96, 0xA5}, // ³â
- {0xB8AB, 0x65A7}, //{0xE6, 0x96, 0xA7}, // ¸«
+ {0xD5E5, 0x659F}, //{0xE6, 0x96, 0x9F}, // ��
+ {0xBDEF, 0x65A4}, //{0xE6, 0x96, 0xA4}, // ��
+ {0xB3E2, 0x65A5}, //{0xE6, 0x96, 0xA5}, // ��
+ {0xB8AB, 0x65A7}, //{0xE6, 0x96, 0xA7}, // ��
{0xD5B6, 0x65A9}, //{0xE6, 0x96, 0xA9}, // Õ¶
- {0xB6CF, 0x65AD}, //{0xE6, 0x96, 0xAD}, // ¶Ï
+ {0xB6CF, 0x65AD}, //{0xE6, 0x96, 0xAD}, // ��
{0xCBB9, 0x65AF}, //{0xE6, 0x96, 0xAF}, // ˹
- {0xD0C2, 0x65B0}, //{0xE6, 0x96, 0xB0}, // ÐÂ
- {0xB7BD, 0x65B9}, //{0xE6, 0x96, 0xB9}, // ·½
+ {0xD0C2, 0x65B0}, //{0xE6, 0x96, 0xB0}, // ��
+ {0xB7BD, 0x65B9}, //{0xE6, 0x96, 0xB9}, // ��
{0xCAA9, 0x65BD}, //{0xE6, 0x96, 0xBD}, // Ê©
- {0xC5D4, 0x65C1}, //{0xE6, 0x97, 0x81}, // ÅÔ
- {0xC2C3, 0x65C5}, //{0xE6, 0x97, 0x85}, // ÂÃ
- {0xD0FD, 0x65CB}, //{0xE6, 0x97, 0x8B}, // Ðý
- {0xD7E5, 0x65CF}, //{0xE6, 0x97, 0x8F}, // ×å
- {0xC6EC, 0x65D7}, //{0xE6, 0x97, 0x97}, // Æì
- {0xCEDE, 0x65E0}, //{0xE6, 0x97, 0xA0}, // ÎÞ
- {0xBCC8, 0x65E2}, //{0xE6, 0x97, 0xA2}, // ¼È
- {0xC8D5, 0x65E5}, //{0xE6, 0x97, 0xA5}, // ÈÕ
- {0xB5A9, 0x65E6}, //{0xE6, 0x97, 0xA6}, // µ©
- {0xBEC9, 0x65E7}, //{0xE6, 0x97, 0xA7}, // ¾É
+ {0xC5D4, 0x65C1}, //{0xE6, 0x97, 0x81}, // ��
+ {0xC2C3, 0x65C5}, //{0xE6, 0x97, 0x85}, // ��
+ {0xD0FD, 0x65CB}, //{0xE6, 0x97, 0x8B}, // ��
+ {0xD7E5, 0x65CF}, //{0xE6, 0x97, 0x8F}, // ��
+ {0xC6EC, 0x65D7}, //{0xE6, 0x97, 0x97}, // ��
+ {0xCEDE, 0x65E0}, //{0xE6, 0x97, 0xA0}, // ��
+ {0xBCC8, 0x65E2}, //{0xE6, 0x97, 0xA2}, // ��
+ {0xC8D5, 0x65E5}, //{0xE6, 0x97, 0xA5}, // ��
+ {0xB5A9, 0x65E6}, //{0xE6, 0x97, 0xA6}, // ��
+ {0xBEC9, 0x65E7}, //{0xE6, 0x97, 0xA7}, // ��
{0xD6BC, 0x65E8}, //{0xE6, 0x97, 0xA8}, // Ö¼
- {0xD4E7, 0x65E9}, //{0xE6, 0x97, 0xA9}, // Ôç
+ {0xD4E7, 0x65E9}, //{0xE6, 0x97, 0xA9}, // ��
{0xD1AE, 0x65EC}, //{0xE6, 0x97, 0xAC}, // Ñ®
- {0xD0F1, 0x65ED}, //{0xE6, 0x97, 0xAD}, // Ðñ
- {0xBAB5, 0x65F1}, //{0xE6, 0x97, 0xB1}, // ºµ
+ {0xD0F1, 0x65ED}, //{0xE6, 0x97, 0xAD}, // ��
+ {0xBAB5, 0x65F1}, //{0xE6, 0x97, 0xB1}, // ��
{0xCAB1, 0x65F6}, //{0xE6, 0x97, 0xB6}, // ʱ
- {0xBFF5, 0x65F7}, //{0xE6, 0x97, 0xB7}, // ¿õ
- {0xCDFA, 0x65FA}, //{0xE6, 0x97, 0xBA}, // Íú
- {0xB0BA, 0x6602}, //{0xE6, 0x98, 0x82}, // °º
- {0xC0A5, 0x6606}, //{0xE6, 0x98, 0x86}, // ˴
- {0xB2FD, 0x660C}, //{0xE6, 0x98, 0x8C}, // ²ý
- {0xC3F7, 0x660E}, //{0xE6, 0x98, 0x8E}, // Ã÷
- {0xBBE8, 0x660F}, //{0xE6, 0x98, 0x8F}, // ȏ
- {0xD2D7, 0x6613}, //{0xE6, 0x98, 0x93}, // Ò×
- {0xCEF4, 0x6614}, //{0xE6, 0x98, 0x94}, // Îô
- {0xEABC, 0x6619}, //{0xE6, 0x98, 0x99}, // ê¼
- {0xD0C7, 0x661F}, //{0xE6, 0x98, 0x9F}, // ÐÇ
+ {0xBFF5, 0x65F7}, //{0xE6, 0x97, 0xB7}, // ��
+ {0xCDFA, 0x65FA}, //{0xE6, 0x97, 0xBA}, // ��
+ {0xB0BA, 0x6602}, //{0xE6, 0x98, 0x82}, // ��
+ {0xC0A5, 0x6606}, //{0xE6, 0x98, 0x86}, // %
+ {0xB2FD, 0x660C}, //{0xE6, 0x98, 0x8C}, // ��
+ {0xC3F7, 0x660E}, //{0xE6, 0x98, 0x8E}, // ��
+ {0xBBE8, 0x660F}, //{0xE6, 0x98, 0x8F}, // ��
+ {0xD2D7, 0x6613}, //{0xE6, 0x98, 0x93}, // ��
+ {0xCEF4, 0x6614}, //{0xE6, 0x98, 0x94}, // ��
+ {0xEABC, 0x6619}, //{0xE6, 0x98, 0x99}, // �
+ {0xD0C7, 0x661F}, //{0xE6, 0x98, 0x9F}, // ��
{0xD3B3, 0x6620}, //{0xE6, 0x98, 0xA0}, // Ó³
- {0xB4BA, 0x6625}, //{0xE6, 0x98, 0xA5}, // ´º
- {0xC3C1, 0x6627}, //{0xE6, 0x98, 0xA7}, // ÃÁ
- {0xD7F2, 0x6628}, //{0xE6, 0x98, 0xA8}, // ×ò
- {0xD5D1, 0x662D}, //{0xE6, 0x98, 0xAD}, // ÕÑ
- {0xCAC7, 0x662F}, //{0xE6, 0x98, 0xAF}, // ÊÇ
- {0xEAC7, 0x6635}, //{0xE6, 0x98, 0xB5}, // êÇ
- {0xD6E7, 0x663C}, //{0xE6, 0x98, 0xBC}, // Öç
- {0xCFD4, 0x663E}, //{0xE6, 0x98, 0xBE}, // ÏÔ
- {0xBBCE, 0x6643}, //{0xE6, 0x99, 0x83}, // »Î
- {0xBDFA, 0x664B}, //{0xE6, 0x99, 0x8B}, // ½ú
- {0xC9CE, 0x664C}, //{0xE6, 0x99, 0x8C}, // ÉÎ
+ {0xB4BA, 0x6625}, //{0xE6, 0x98, 0xA5}, // ��
+ {0xC3C1, 0x6627}, //{0xE6, 0x98, 0xA7}, // ��
+ {0xD7F2, 0x6628}, //{0xE6, 0x98, 0xA8}, // ��
+ {0xD5D1, 0x662D}, //{0xE6, 0x98, 0xAD}, // ��
+ {0xCAC7, 0x662F}, //{0xE6, 0x98, 0xAF}, // ��
+ {0xEAC7, 0x6635}, //{0xE6, 0x98, 0xB5}, // ��
+ {0xD6E7, 0x663C}, //{0xE6, 0x98, 0xBC}, // ��
+ {0xCFD4, 0x663E}, //{0xE6, 0x98, 0xBE}, // ��
+ {0xBBCE, 0x6643}, //{0xE6, 0x99, 0x83}, // ��
+ {0xBDFA, 0x664B}, //{0xE6, 0x99, 0x8B}, // ��
+ {0xC9CE, 0x664C}, //{0xE6, 0x99, 0x8C}, // ��
{0xC9B9, 0x6652}, //{0xE6, 0x99, 0x92}, // ɹ
- {0xCFFE, 0x6653}, //{0xE6, 0x99, 0x93}, // Ïþ
- {0xD4CE, 0x6655}, //{0xE6, 0x99, 0x95}, // ÔÎ
- {0xCDED, 0x665A}, //{0xE6, 0x99, 0x9A}, // Íí
- {0xCEEE, 0x6664}, //{0xE6, 0x99, 0xA4}, // Îî
- {0xBBDE, 0x6666}, //{0xE6, 0x99, 0xA6}, // »Þ
- {0xB3BF, 0x6668}, //{0xE6, 0x99, 0xA8}, // ³¿
- {0xC6D5, 0x666E}, //{0xE6, 0x99, 0xAE}, // ÆÕ
- {0xBEB0, 0x666F}, //{0xE6, 0x99, 0xAF}, // ¾°
- {0xCEFA, 0x6670}, //{0xE6, 0x99, 0xB0}, // Îú
- {0xC7E7, 0x6674}, //{0xE6, 0x99, 0xB4}, // Çç
- {0xBEA7, 0x6676}, //{0xE6, 0x99, 0xB6}, // ¾§
- {0xD6C7, 0x667A}, //{0xE6, 0x99, 0xBA}, // ÖÇ
- {0xC1C0, 0x667E}, //{0xE6, 0x99, 0xBE}, // ÁÀ
- {0xD4DD, 0x6682}, //{0xE6, 0x9A, 0x82}, // ÔÝ
+ {0xCFFE, 0x6653}, //{0xE6, 0x99, 0x93}, // ��
+ {0xD4CE, 0x6655}, //{0xE6, 0x99, 0x95}, // ��
+ {0xCDED, 0x665A}, //{0xE6, 0x99, 0x9A}, // ��
+ {0xCEEE, 0x6664}, //{0xE6, 0x99, 0xA4}, // ��
+ {0xBBDE, 0x6666}, //{0xE6, 0x99, 0xA6}, // ��
+ {0xB3BF, 0x6668}, //{0xE6, 0x99, 0xA8}, // ��
+ {0xC6D5, 0x666E}, //{0xE6, 0x99, 0xAE}, // ��
+ {0xBEB0, 0x666F}, //{0xE6, 0x99, 0xAF}, // ��
+ {0xCEFA, 0x6670}, //{0xE6, 0x99, 0xB0}, // ��
+ {0xC7E7, 0x6674}, //{0xE6, 0x99, 0xB4}, // ��
+ {0xBEA7, 0x6676}, //{0xE6, 0x99, 0xB6}, // ��
+ {0xD6C7, 0x667A}, //{0xE6, 0x99, 0xBA}, // ��
+ {0xC1C0, 0x667E}, //{0xE6, 0x99, 0xBE}, // ��
+ {0xD4DD, 0x6682}, //{0xE6, 0x9A, 0x82}, // ��
{0xCFBE, 0x6687}, //{0xE6, 0x9A, 0x87}, // Ͼ
- {0xCAEE, 0x6691}, //{0xE6, 0x9A, 0x91}, // Êî
+ {0xCAEE, 0x6691}, //{0xE6, 0x9A, 0x91}, // ��
{0xC5AF, 0x6696}, //{0xE6, 0x9A, 0x96}, // ů
- {0xB0B5, 0x6697}, //{0xE6, 0x9A, 0x97}, // °µ
+ {0xB0B5, 0x6697}, //{0xE6, 0x9A, 0x97}, // ��
{0xC4BA, 0x66AE}, //{0xE6, 0x9A, 0xAE}, // ĺ
- {0xB1A9, 0x66B4}, //{0xE6, 0x9A, 0xB4}, // ±©
- {0xCAEF, 0x66D9}, //{0xE6, 0x9B, 0x99}, // Êï
- {0xC7FA, 0x66F2}, //{0xE6, 0x9B, 0xB2}, // Çú
- {0xB8FC, 0x66F4}, //{0xE6, 0x9B, 0xB4}, // ¸ü
- {0xB2DC, 0x66F9}, //{0xE6, 0x9B, 0xB9}, // ²Ü
- {0xC2FC, 0x66FC}, //{0xE6, 0x9B, 0xBC}, // Âü
- {0xD4F8, 0x66FE}, //{0xE6, 0x9B, 0xBE}, // Ôø
- {0xCCE6, 0x66FF}, //{0xE6, 0x9B, 0xBF}, // Ìæ
- {0xD7EE, 0x6700}, //{0xE6, 0x9C, 0x80}, // ×î
- {0xD4C2, 0x6708}, //{0xE6, 0x9C, 0x88}, // ÔÂ
- {0xD3D0, 0x6709}, //{0xE6, 0x9C, 0x89}, // ÓÐ
- {0xC5F3, 0x670B}, //{0xE6, 0x9C, 0x8B}, // Åó
- {0xB7FE, 0x670D}, //{0xE6, 0x9C, 0x8D}, // ·þ
- {0xC0CA, 0x6717}, //{0xE6, 0x9C, 0x97}, // ÀÊ
- {0xCDFB, 0x671B}, //{0xE6, 0x9C, 0x9B}, // Íû
- {0xB3AF, 0x671D}, //{0xE6, 0x9C, 0x9D}, // ³¯
- {0xC6DA, 0x671F}, //{0xE6, 0x9C, 0x9F}, // ÆÚ
- {0xEBFC, 0x6726}, //{0xE6, 0x9C, 0xA6}, // ëü
+ {0xB1A9, 0x66B4}, //{0xE6, 0x9A, 0xB4}, // ��
+ {0xCAEF, 0x66D9}, //{0xE6, 0x9B, 0x99}, // ��
+ {0xC7FA, 0x66F2}, //{0xE6, 0x9B, 0xB2}, // ��
+ {0xB8FC, 0x66F4}, //{0xE6, 0x9B, 0xB4}, // ��
+ {0xB2DC, 0x66F9}, //{0xE6, 0x9B, 0xB9}, // ��
+ {0xC2FC, 0x66FC}, //{0xE6, 0x9B, 0xBC}, // ��
+ {0xD4F8, 0x66FE}, //{0xE6, 0x9B, 0xBE}, // ��
+ {0xCCE6, 0x66FF}, //{0xE6, 0x9B, 0xBF}, // ��
+ {0xD7EE, 0x6700}, //{0xE6, 0x9C, 0x80}, // ��
+ {0xD4C2, 0x6708}, //{0xE6, 0x9C, 0x88}, // ��
+ {0xD3D0, 0x6709}, //{0xE6, 0x9C, 0x89}, // ��
+ {0xC5F3, 0x670B}, //{0xE6, 0x9C, 0x8B}, // ��
+ {0xB7FE, 0x670D}, //{0xE6, 0x9C, 0x8D}, // ��
+ {0xC0CA, 0x6717}, //{0xE6, 0x9C, 0x97}, // ��
+ {0xCDFB, 0x671B}, //{0xE6, 0x9C, 0x9B}, // ��
+ {0xB3AF, 0x671D}, //{0xE6, 0x9C, 0x9D}, // ��
+ {0xC6DA, 0x671F}, //{0xE6, 0x9C, 0x9F}, // ��
+ {0xEBFC, 0x6726}, //{0xE6, 0x9C, 0xA6}, // ��
{0xC4BE, 0x6728}, //{0xE6, 0x9C, 0xA8}, // ľ
{0xCEB4, 0x672A}, //{0xE6, 0x9C, 0xAA}, // δ
{0xC4A9, 0x672B}, //{0xE6, 0x9C, 0xAB}, // Ä©
- {0xB1BE, 0x672C}, //{0xE6, 0x9C, 0xAC}, // ±¾
- {0xCAF5, 0x672F}, //{0xE6, 0x9C, 0xAF}, // Êõ
- {0xD6EC, 0x6731}, //{0xE6, 0x9C, 0xB1}, // Öì
- {0xC6D3, 0x6734}, //{0xE6, 0x9C, 0xB4}, // ÆÓ
- {0xB6E4, 0x6735}, //{0xE6, 0x9C, 0xB5}, // ¶ä
- {0xBBFA, 0x673A}, //{0xE6, 0x9C, 0xBA}, // »ú
- {0xD0E0, 0x673D}, //{0xE6, 0x9C, 0xBD}, // Ðà
+ {0xB1BE, 0x672C}, //{0xE6, 0x9C, 0xAC}, // ��
+ {0xCAF5, 0x672F}, //{0xE6, 0x9C, 0xAF}, // ��
+ {0xD6EC, 0x6731}, //{0xE6, 0x9C, 0xB1}, // ��
+ {0xC6D3, 0x6734}, //{0xE6, 0x9C, 0xB4}, // ��
+ {0xB6E4, 0x6735}, //{0xE6, 0x9C, 0xB5}, // ��
+ {0xBBFA, 0x673A}, //{0xE6, 0x9C, 0xBA}, // ��
+ {0xD0E0, 0x673D}, //{0xE6, 0x9C, 0xBD}, // ��
{0xC9B1, 0x6740}, //{0xE6, 0x9D, 0x80}, // ɱ
- {0xD4D3, 0x6742}, //{0xE6, 0x9D, 0x82}, // ÔÓ
+ {0xD4D3, 0x6742}, //{0xE6, 0x9D, 0x82}, // ��
{0xC8A8, 0x6743}, //{0xE6, 0x9D, 0x83}, // Ȩ
- {0xB8CB, 0x6746}, //{0xE6, 0x9D, 0x86}, // ¸Ë
- {0xE8BE, 0x6748}, //{0xE6, 0x9D, 0x88}, // è¾
+ {0xB8CB, 0x6746}, //{0xE6, 0x9D, 0x86}, // ��
+ {0xE8BE, 0x6748}, //{0xE6, 0x9D, 0x88}, // �
{0xC9BC, 0x6749}, //{0xE6, 0x9D, 0x89}, // ɼ
- {0xC0EE, 0x674E}, //{0xE6, 0x9D, 0x8E}, // Àî
- {0xD0D3, 0x674F}, //{0xE6, 0x9D, 0x8F}, // ÐÓ
- {0xB2C4, 0x6750}, //{0xE6, 0x9D, 0x90}, // ²Ä
- {0xB4E5, 0x6751}, //{0xE6, 0x9D, 0x91}, // ´å
- {0xD5C8, 0x6756}, //{0xE6, 0x9D, 0x96}, // ÕÈ
- {0xB6C5, 0x675C}, //{0xE6, 0x9D, 0x9C}, // ¶Å
- {0xCAF8, 0x675F}, //{0xE6, 0x9D, 0x9F}, // Êø
- {0xB8DC, 0x6760}, //{0xE6, 0x9D, 0xA0}, // ¸Ü
- {0xCCF5, 0x6761}, //{0xE6, 0x9D, 0xA1}, // Ìõ
- {0xC0B4, 0x6765}, //{0xE6, 0x9D, 0xA5}, // À´
- {0xD1EE, 0x6768}, //{0xE6, 0x9D, 0xA8}, // Ñî
- {0xBABC, 0x676D}, //{0xE6, 0x9D, 0xAD}, // º¼
- {0xB1AD, 0x676F}, //{0xE6, 0x9D, 0xAF}, // ±
- {0xBDDC, 0x6770}, //{0xE6, 0x9D, 0xB0}, // ½Ü
- {0xCBC9, 0x677E}, //{0xE6, 0x9D, 0xBE}, // ËÉ
- {0xB0E5, 0x677F}, //{0xE6, 0x9D, 0xBF}, // °å
- {0xBCAB, 0x6781}, //{0xE6, 0x9E, 0x81}, // ¼«
- {0xB9B9, 0x6784}, //{0xE6, 0x9E, 0x84}, // ¹¹
- {0xCDF7, 0x6789}, //{0xE6, 0x9E, 0x89}, // Í÷
- {0xCEF6, 0x6790}, //{0xE6, 0x9E, 0x90}, // Îö
- {0xD5ED, 0x6795}, //{0xE6, 0x9E, 0x95}, // Õí
- {0xC1D6, 0x6797}, //{0xE6, 0x9E, 0x97}, // ÁÖ
+ {0xC0EE, 0x674E}, //{0xE6, 0x9D, 0x8E}, // ��
+ {0xD0D3, 0x674F}, //{0xE6, 0x9D, 0x8F}, // ��
+ {0xB2C4, 0x6750}, //{0xE6, 0x9D, 0x90}, // ��
+ {0xB4E5, 0x6751}, //{0xE6, 0x9D, 0x91}, // ��
+ {0xD5C8, 0x6756}, //{0xE6, 0x9D, 0x96}, // ��
+ {0xB6C5, 0x675C}, //{0xE6, 0x9D, 0x9C}, // ��
+ {0xCAF8, 0x675F}, //{0xE6, 0x9D, 0x9F}, // ��
+ {0xB8DC, 0x6760}, //{0xE6, 0x9D, 0xA0}, // ��
+ {0xCCF5, 0x6761}, //{0xE6, 0x9D, 0xA1}, // ��
+ {0xC0B4, 0x6765}, //{0xE6, 0x9D, 0xA5}, // 4
+ {0xD1EE, 0x6768}, //{0xE6, 0x9D, 0xA8}, // ��
+ {0xBABC, 0x676D}, //{0xE6, 0x9D, 0xAD}, // ��
+ {0xB1AD, 0x676F}, //{0xE6, 0x9D, 0xAF}, // ��
+ {0xBDDC, 0x6770}, //{0xE6, 0x9D, 0xB0}, // ��
+ {0xCBC9, 0x677E}, //{0xE6, 0x9D, 0xBE}, // ��
+ {0xB0E5, 0x677F}, //{0xE6, 0x9D, 0xBF}, // ��
+ {0xBCAB, 0x6781}, //{0xE6, 0x9E, 0x81}, // ��
+ {0xB9B9, 0x6784}, //{0xE6, 0x9E, 0x84}, // ��
+ {0xCDF7, 0x6789}, //{0xE6, 0x9E, 0x89}, // ��
+ {0xCEF6, 0x6790}, //{0xE6, 0x9E, 0x90}, // ��
+ {0xD5ED, 0x6795}, //{0xE6, 0x9E, 0x95}, // ��
+ {0xC1D6, 0x6797}, //{0xE6, 0x9E, 0x97}, // ��
{0xC3B6, 0x679A}, //{0xE6, 0x9E, 0x9A}, // ö
- {0xB9FB, 0x679C}, //{0xE6, 0x9E, 0x9C}, // ¹û
+ {0xB9FB, 0x679C}, //{0xE6, 0x9E, 0x9C}, // ��
{0xD6A6, 0x679D}, //{0xE6, 0x9E, 0x9D}, // Ö¦
- {0xCAE0, 0x67A2}, //{0xE6, 0x9E, 0xA2}, // Êà
- {0xD4E6, 0x67A3}, //{0xE6, 0x9E, 0xA3}, // Ôæ
+ {0xCAE0, 0x67A2}, //{0xE6, 0x9E, 0xA2}, // ��
+ {0xD4E6, 0x67A3}, //{0xE6, 0x9E, 0xA3}, // ��
{0xC7B9, 0x67AA}, //{0xE6, 0x9E, 0xAA}, // ǹ
- {0xB7E3, 0x67AB}, //{0xE6, 0x9E, 0xAB}, // ·ã
- {0xBFDD, 0x67AF}, //{0xE6, 0x9E, 0xAF}, // ¿Ý
- {0xBCDC, 0x67B6}, //{0xE6, 0x9E, 0xB6}, // ¼Ü
- {0xBCCF, 0x67B7}, //{0xE6, 0x9E, 0xB7}, // ¼Ï
- {0xB1FA, 0x67C4}, //{0xE6, 0x9F, 0x84}, // ±ú
- {0xB0D8, 0x67CF}, //{0xE6, 0x9F, 0x8F}, // °Ø
+ {0xB7E3, 0x67AB}, //{0xE6, 0x9E, 0xAB}, // ��
+ {0xBFDD, 0x67AF}, //{0xE6, 0x9E, 0xAF}, // ��
+ {0xBCDC, 0x67B6}, //{0xE6, 0x9E, 0xB6}, // ��
+ {0xBCCF, 0x67B7}, //{0xE6, 0x9E, 0xB7}, // ��
+ {0xB1FA, 0x67C4}, //{0xE6, 0x9F, 0x84}, // ��
+ {0xB0D8, 0x67CF}, //{0xE6, 0x9F, 0x8F}, // ��
{0xC4B3, 0x67D0}, //{0xE6, 0x9F, 0x90}, // ij
- {0xB8CC, 0x67D1}, //{0xE6, 0x9F, 0x91}, // ¸Ì
- {0xC6E2, 0x67D2}, //{0xE6, 0x9F, 0x92}, // Æâ
+ {0xB8CC, 0x67D1}, //{0xE6, 0x9F, 0x91}, // ��
+ {0xC6E2, 0x67D2}, //{0xE6, 0x9F, 0x92}, // ��
{0xC8BE, 0x67D3}, //{0xE6, 0x9F, 0x93}, // Ⱦ
- {0xC8E1, 0x67D4}, //{0xE6, 0x9F, 0x94}, // Èá
- {0xB9F1, 0x67DC}, //{0xE6, 0x9F, 0x9C}, // ¹ñ
- {0xC4FB, 0x67E0}, //{0xE6, 0x9F, 0xA0}, // Äû
- {0xB2E9, 0x67E5}, //{0xE6, 0x9F, 0xA5}, // ²é
- {0xBCED, 0x67EC}, //{0xE6, 0x9F, 0xAC}, // ¼í
- {0xD6F9, 0x67F1}, //{0xE6, 0x9F, 0xB1}, // Öù
- {0xC1F8, 0x67F3}, //{0xE6, 0x9F, 0xB3}, // Áø
- {0xB2F1, 0x67F4}, //{0xE6, 0x9F, 0xB4}, // ²ñ
- {0xCAC1, 0x67FF}, //{0xE6, 0x9F, 0xBF}, // ÊÁ
+ {0xC8E1, 0x67D4}, //{0xE6, 0x9F, 0x94}, // ��
+ {0xB9F1, 0x67DC}, //{0xE6, 0x9F, 0x9C}, // ��
+ {0xC4FB, 0x67E0}, //{0xE6, 0x9F, 0xA0}, // ��
+ {0xB2E9, 0x67E5}, //{0xE6, 0x9F, 0xA5}, // ��
+ {0xBCED, 0x67EC}, //{0xE6, 0x9F, 0xAC}, // ��
+ {0xD6F9, 0x67F1}, //{0xE6, 0x9F, 0xB1}, // ��
+ {0xC1F8, 0x67F3}, //{0xE6, 0x9F, 0xB3}, // ��
+ {0xB2F1, 0x67F4}, //{0xE6, 0x9F, 0xB4}, // ��
+ {0xCAC1, 0x67FF}, //{0xE6, 0x9F, 0xBF}, // ��
{0xD5A4, 0x6805}, //{0xE6, 0xA0, 0x85}, // Õ¤
- {0xB1EA, 0x6807}, //{0xE6, 0xA0, 0x87}, // ±ê
+ {0xB1EA, 0x6807}, //{0xE6, 0xA0, 0x87}, // ��
{0xD5BB, 0x6808}, //{0xE6, 0xA0, 0x88}, // Õ»
- {0xB6B0, 0x680B}, //{0xE6, 0xA0, 0x8B}, // ¶°
- {0xC0B8, 0x680F}, //{0xE6, 0xA0, 0x8F}, // À¸
- {0xCAF7, 0x6811}, //{0xE6, 0xA0, 0x91}, // Ê÷
+ {0xB6B0, 0x680B}, //{0xE6, 0xA0, 0x8B}, // ��
+ {0xC0B8, 0x680F}, //{0xE6, 0xA0, 0x8F}, // 8
+ {0xCAF7, 0x6811}, //{0xE6, 0xA0, 0x91}, // ��
{0xCBA8, 0x6813}, //{0xE6, 0xA0, 0x93}, // ˨
- {0xC6DC, 0x6816}, //{0xE6, 0xA0, 0x96}, // ÆÜ
- {0xC0F5, 0x6817}, //{0xE6, 0xA0, 0x97}, // Àõ
+ {0xC6DC, 0x6816}, //{0xE6, 0xA0, 0x96}, // ��
+ {0xC0F5, 0x6817}, //{0xE6, 0xA0, 0x97}, // ��
{0xD0A3, 0x6821}, //{0xE6, 0xA0, 0xA1}, // У
- {0xD6EA, 0x682A}, //{0xE6, 0xA0, 0xAA}, // Öê
- {0xD1F9, 0x6837}, //{0xE6, 0xA0, 0xB7}, // Ñù
- {0xBACB, 0x6838}, //{0xE6, 0xA0, 0xB8}, // ºË
- {0xB8F9, 0x6839}, //{0xE6, 0xA0, 0xB9}, // ¸ù
- {0xB8F1, 0x683C}, //{0xE6, 0xA0, 0xBC}, // ¸ñ
- {0xD4D4, 0x683D}, //{0xE6, 0xA0, 0xBD}, // ÔÔ
- {0xB9F0, 0x6842}, //{0xE6, 0xA1, 0x82}, // ¹ð
- {0xCCD2, 0x6843}, //{0xE6, 0xA1, 0x83}, // ÌÒ
+ {0xD6EA, 0x682A}, //{0xE6, 0xA0, 0xAA}, // ��
+ {0xD1F9, 0x6837}, //{0xE6, 0xA0, 0xB7}, // ��
+ {0xBACB, 0x6838}, //{0xE6, 0xA0, 0xB8}, // ��
+ {0xB8F9, 0x6839}, //{0xE6, 0xA0, 0xB9}, // ��
+ {0xB8F1, 0x683C}, //{0xE6, 0xA0, 0xBC}, // ��
+ {0xD4D4, 0x683D}, //{0xE6, 0xA0, 0xBD}, // ��
+ {0xB9F0, 0x6842}, //{0xE6, 0xA1, 0x82}, // ��
+ {0xCCD2, 0x6843}, //{0xE6, 0xA1, 0x83}, // ��
{0xCEA6, 0x6845}, //{0xE6, 0xA1, 0x85}, // Φ
- {0xBFF2, 0x6846}, //{0xE6, 0xA1, 0x86}, // ¿ò
- {0xB0B8, 0x6848}, //{0xE6, 0xA1, 0x88}, // °¸
- {0xD7C0, 0x684C}, //{0xE6, 0xA1, 0x8C}, // ×À
+ {0xBFF2, 0x6846}, //{0xE6, 0xA1, 0x86}, // ��
+ {0xB0B8, 0x6848}, //{0xE6, 0xA1, 0x88}, // ��
+ {0xD7C0, 0x684C}, //{0xE6, 0xA1, 0x8C}, // ��
{0xCDA9, 0x6850}, //{0xE6, 0xA1, 0x90}, // Í©
{0xC9A3, 0x6851}, //{0xE6, 0xA1, 0x91}, // ɣ
- {0xB5B5, 0x6863}, //{0xE6, 0xA1, 0xA3}, // µµ
- {0xC7C5, 0x6865}, //{0xE6, 0xA1, 0xA5}, // ÇÅ
- {0xE8EB, 0x6866}, //{0xE6, 0xA1, 0xA6}, // èë
- {0xBDB0, 0x6868}, //{0xE6, 0xA1, 0xA8}, // ½°
+ {0xB5B5, 0x6863}, //{0xE6, 0xA1, 0xA3}, // ��
+ {0xC7C5, 0x6865}, //{0xE6, 0xA1, 0xA5}, // ��
+ {0xE8EB, 0x6866}, //{0xE6, 0xA1, 0xA6}, // ��
+ {0xBDB0, 0x6868}, //{0xE6, 0xA1, 0xA8}, // ��
{0xD7AE, 0x6869}, //{0xE6, 0xA1, 0xA9}, // ×®
{0xCDB0, 0x6876}, //{0xE6, 0xA1, 0xB6}, // Ͱ
- {0xC1BA, 0x6881}, //{0xE6, 0xA2, 0x81}, // Áº
+ {0xC1BA, 0x6881}, //{0xE6, 0xA2, 0x81}, // z
{0xC3B7, 0x6885}, //{0xE6, 0xA2, 0x85}, // ÷
- {0xB0F0, 0x6886}, //{0xE6, 0xA2, 0x86}, // °ð
- {0xB9A3, 0x6897}, //{0xE6, 0xA2, 0x97}, // ¹£
- {0xC9D2, 0x68A2}, //{0xE6, 0xA2, 0xA2}, // ÉÒ
- {0xC3CE, 0x68A6}, //{0xE6, 0xA2, 0xA6}, // ÃÎ
- {0xCEE0, 0x68A7}, //{0xE6, 0xA2, 0xA7}, // Îà
- {0xC0E6, 0x68A8}, //{0xE6, 0xA2, 0xA8}, // Àæ
- {0xCBF3, 0x68AD}, //{0xE6, 0xA2, 0xAD}, // Ëó
- {0xCCDD, 0x68AF}, //{0xE6, 0xA2, 0xAF}, // ÌÝ
+ {0xB0F0, 0x6886}, //{0xE6, 0xA2, 0x86}, // ��
+ {0xB9A3, 0x6897}, //{0xE6, 0xA2, 0x97}, // ��
+ {0xC9D2, 0x68A2}, //{0xE6, 0xA2, 0xA2}, // ��
+ {0xC3CE, 0x68A6}, //{0xE6, 0xA2, 0xA6}, // ��
+ {0xCEE0, 0x68A7}, //{0xE6, 0xA2, 0xA7}, // ��
+ {0xC0E6, 0x68A8}, //{0xE6, 0xA2, 0xA8}, // ��
+ {0xCBF3, 0x68AD}, //{0xE6, 0xA2, 0xAD}, // ��
+ {0xCCDD, 0x68AF}, //{0xE6, 0xA2, 0xAF}, // ��
{0xD0B5, 0x68B0}, //{0xE6, 0xA2, 0xB0}, // е
- {0xCAE1, 0x68B3}, //{0xE6, 0xA2, 0xB3}, // Êá
- {0xBCEC, 0x68C0}, //{0xE6, 0xA3, 0x80}, // ¼ì
- {0xC3DE, 0x68C9}, //{0xE6, 0xA3, 0x89}, // ÃÞ
- {0xC6E5, 0x68CB}, //{0xE6, 0xA3, 0x8B}, // Æå
- {0xB9F7, 0x68CD}, //{0xE6, 0xA3, 0x8D}, // ¹÷
- {0xB0F4, 0x68D2}, //{0xE6, 0xA3, 0x92}, // °ô
- {0xD7D8, 0x68D5}, //{0xE6, 0xA3, 0x95}, // ר
- {0xBCAC, 0x68D8}, //{0xE6, 0xA3, 0x98}, // ¼¬
- {0xC5EF, 0x68DA}, //{0xE6, 0xA3, 0x9A}, // Åï
- {0xCCC4, 0x68E0}, //{0xE6, 0xA3, 0xA0}, // ÌÄ
+ {0xCAE1, 0x68B3}, //{0xE6, 0xA2, 0xB3}, // ��
+ {0xBCEC, 0x68C0}, //{0xE6, 0xA3, 0x80}, // ��
+ {0xC3DE, 0x68C9}, //{0xE6, 0xA3, 0x89}, // ��
+ {0xC6E5, 0x68CB}, //{0xE6, 0xA3, 0x8B}, // ��
+ {0xB9F7, 0x68CD}, //{0xE6, 0xA3, 0x8D}, // ��
+ {0xB0F4, 0x68D2}, //{0xE6, 0xA3, 0x92}, // ��
+ {0xD7D8, 0x68D5}, //{0xE6, 0xA3, 0x95}, // ��
+ {0xBCAC, 0x68D8}, //{0xE6, 0xA3, 0x98}, // ��
+ {0xC5EF, 0x68DA}, //{0xE6, 0xA3, 0x9A}, // ��
+ {0xCCC4, 0x68E0}, //{0xE6, 0xA3, 0xA0}, // ��
{0xC9AD, 0x68EE}, //{0xE6, 0xA3, 0xAE}, // É
- {0xC0E2, 0x68F1}, //{0xE6, 0xA3, 0xB1}, // Àâ
- {0xBFC3, 0x68F5}, //{0xE6, 0xA3, 0xB5}, // ¿Ã
- {0xB9D7, 0x68FA}, //{0xE6, 0xA3, 0xBA}, // ¹×
- {0xD2CE, 0x6905}, //{0xE6, 0xA4, 0x85}, // ÒÎ
+ {0xC0E2, 0x68F1}, //{0xE6, 0xA3, 0xB1}, // ��
+ {0xBFC3, 0x68F5}, //{0xE6, 0xA3, 0xB5}, // ��
+ {0xB9D7, 0x68FA}, //{0xE6, 0xA3, 0xBA}, // ��
+ {0xD2CE, 0x6905}, //{0xE6, 0xA4, 0x85}, // ��
{0xD6B2, 0x690D}, //{0xE6, 0xA4, 0x8D}, // Ö²
{0xD7B5, 0x690E}, //{0xE6, 0xA4, 0x8E}, // ×µ
- {0xBDB7, 0x6912}, //{0xE6, 0xA4, 0x92}, // ½·
- {0xCDD6, 0x692D}, //{0xE6, 0xA4, 0xAD}, // ÍÖ
+ {0xBDB7, 0x6912}, //{0xE6, 0xA4, 0x92}, // ��
+ {0xCDD6, 0x692D}, //{0xE6, 0xA4, 0xAD}, // ��
{0xD2AC, 0x6930}, //{0xE6, 0xA4, 0xB0}, // Ò¬
- {0xB4BB, 0x693F}, //{0xE6, 0xA4, 0xBF}, // ´»
+ {0xB4BB, 0x693F}, //{0xE6, 0xA4, 0xBF}, // ��
{0xD0A8, 0x6954}, //{0xE6, 0xA5, 0x94}, // Ш
- {0xB3FE, 0x695A}, //{0xE6, 0xA5, 0x9A}, // ³þ
- {0xC0E3, 0x695E}, //{0xE6, 0xA5, 0x9E}, // Àã
- {0xE9B9, 0x6963}, //{0xE6, 0xA5, 0xA3}, // é¹
- {0xBFAC, 0x6977}, //{0xE6, 0xA5, 0xB7}, // ¿¬
+ {0xB3FE, 0x695A}, //{0xE6, 0xA5, 0x9A}, // ��
+ {0xC0E3, 0x695E}, //{0xE6, 0xA5, 0x9E}, // ��
+ {0xE9B9, 0x6963}, //{0xE6, 0xA5, 0xA3}, // �
+ {0xBFAC, 0x6977}, //{0xE6, 0xA5, 0xB7}, // ��
{0xC2A5, 0x697C}, //{0xE6, 0xA5, 0xBC}, // ¥
- {0xB8C5, 0x6982}, //{0xE6, 0xA6, 0x82}, // ¸Å
- {0xE9AD, 0x6984}, //{0xE6, 0xA6, 0x84}, // é
- {0xD3DC, 0x6986}, //{0xE6, 0xA6, 0x86}, // ÓÜ
- {0xC0C6, 0x6994}, //{0xE6, 0xA6, 0x94}, // ÀÆ
- {0xE9C5, 0x6995}, //{0xE6, 0xA6, 0x95}, // éÅ
- {0xE9BB, 0x699B}, //{0xE6, 0xA6, 0x9B}, // é»
- {0xB0F1, 0x699C}, //{0xE6, 0xA6, 0x9C}, // °ñ
+ {0xB8C5, 0x6982}, //{0xE6, 0xA6, 0x82}, // ��
+ {0xE9AD, 0x6984}, //{0xE6, 0xA6, 0x84}, // �
+ {0xD3DC, 0x6986}, //{0xE6, 0xA6, 0x86}, // ��
+ {0xC0C6, 0x6994}, //{0xE6, 0xA6, 0x94}, // ��
+ {0xE9C5, 0x6995}, //{0xE6, 0xA6, 0x95}, // ��
+ {0xE9BB, 0x699B}, //{0xE6, 0xA6, 0x9B}, // �
+ {0xB0F1, 0x699C}, //{0xE6, 0xA6, 0x9C}, // ��
{0xD5A5, 0x69A8}, //{0xE6, 0xA6, 0xA8}, // Õ¥
- {0xC1F1, 0x69B4}, //{0xE6, 0xA6, 0xB4}, // Áñ
- {0xBBB1, 0x69D0}, //{0xE6, 0xA7, 0x90}, // »±
- {0xB2DB, 0x69FD}, //{0xE6, 0xA7, 0xBD}, // ²Û
- {0xB7AE, 0x6A0A}, //{0xE6, 0xA8, 0x8A}, // ·®
- {0xD5C1, 0x6A1F}, //{0xE6, 0xA8, 0x9F}, // ÕÁ
+ {0xC1F1, 0x69B4}, //{0xE6, 0xA6, 0xB4}, // ��
+ {0xBBB1, 0x69D0}, //{0xE6, 0xA7, 0x90}, // ��
+ {0xB2DB, 0x69FD}, //{0xE6, 0xA7, 0xBD}, // ��
+ {0xB7AE, 0x6A0A}, //{0xE6, 0xA8, 0x8A}, // ��
+ {0xD5C1, 0x6A1F}, //{0xE6, 0xA8, 0x9F}, // ��
{0xC4A3, 0x6A21}, //{0xE6, 0xA8, 0xA1}, // ģ
- {0xBAE1, 0x6A2A}, //{0xE6, 0xA8, 0xAA}, // ºá
+ {0xBAE1, 0x6A2A}, //{0xE6, 0xA8, 0xAA}, // ��
{0xD3A3, 0x6A31}, //{0xE6, 0xA8, 0xB1}, // Ó£
- {0xE9CF, 0x6A44}, //{0xE6, 0xA9, 0x84}, // éÏ
- {0xE9D9, 0x6A58}, //{0xE6, 0xA9, 0x98}, // éÙ
- {0xB3C8, 0x6A59}, //{0xE6, 0xA9, 0x99}, // ³È
- {0xCFF0, 0x6A61}, //{0xE6, 0xA9, 0xA1}, // Ïð
- {0xB3F7, 0x6A71}, //{0xE6, 0xA9, 0xB1}, // ³÷
+ {0xE9CF, 0x6A44}, //{0xE6, 0xA9, 0x84}, // ��
+ {0xE9D9, 0x6A58}, //{0xE6, 0xA9, 0x98}, // ��
+ {0xB3C8, 0x6A59}, //{0xE6, 0xA9, 0x99}, // ��
+ {0xCFF0, 0x6A61}, //{0xE6, 0xA9, 0xA1}, // ��
+ {0xB3F7, 0x6A71}, //{0xE6, 0xA9, 0xB1}, // ��
{0xCCB4, 0x6A80}, //{0xE6, 0xAA, 0x80}, // Ì´
- {0xE9DC, 0x6A90}, //{0xE6, 0xAA, 0x90}, // éÜ
- {0xE9DD, 0x6AA9}, //{0xE6, 0xAA, 0xA9}, // éÝ
- {0xC3CA, 0x6AAC}, //{0xE6, 0xAA, 0xAC}, // ÃÊ
+ {0xE9DC, 0x6A90}, //{0xE6, 0xAA, 0x90}, // ��
+ {0xE9DD, 0x6AA9}, //{0xE6, 0xAA, 0xA9}, // ��
+ {0xC3CA, 0x6AAC}, //{0xE6, 0xAA, 0xAC}, // ��
{0xC7B7, 0x6B20}, //{0xE6, 0xAC, 0xA0}, // Ç·
- {0xB4CE, 0x6B21}, //{0xE6, 0xAC, 0xA1}, // ´Î
- {0xBBB6, 0x6B22}, //{0xE6, 0xAC, 0xA2}, // »¶
- {0xD0C0, 0x6B23}, //{0xE6, 0xAC, 0xA3}, // ÐÀ
+ {0xB4CE, 0x6B21}, //{0xE6, 0xAC, 0xA1}, // ��
+ {0xBBB6, 0x6B22}, //{0xE6, 0xAC, 0xA2}, // ��
+ {0xD0C0, 0x6B23}, //{0xE6, 0xAC, 0xA3}, // ��
{0xC5B7, 0x6B27}, //{0xE6, 0xAC, 0xA7}, // Å·
- {0xD3FB, 0x6B32}, //{0xE6, 0xAC, 0xB2}, // Óû
- {0xC6DB, 0x6B3A}, //{0xE6, 0xAC, 0xBA}, // ÆÛ
- {0xBFEE, 0x6B3E}, //{0xE6, 0xAC, 0xBE}, // ¿î
+ {0xD3FB, 0x6B32}, //{0xE6, 0xAC, 0xB2}, // ��
+ {0xC6DB, 0x6B3A}, //{0xE6, 0xAC, 0xBA}, // ��
+ {0xBFEE, 0x6B3E}, //{0xE6, 0xAC, 0xBE}, // ��
{0xD0AA, 0x6B47}, //{0xE6, 0xAD, 0x87}, // Ъ
{0xC7B8, 0x6B49}, //{0xE6, 0xAD, 0x89}, // Ǹ
- {0xB8E8, 0x6B4C}, //{0xE6, 0xAD, 0x8C}, // ¸è
+ {0xB8E8, 0x6B4C}, //{0xE6, 0xAD, 0x8C}, // ��
{0xD6B9, 0x6B62}, //{0xE6, 0xAD, 0xA2}, // Ö¹
- {0xD5FD, 0x6B63}, //{0xE6, 0xAD, 0xA3}, // Õý
- {0xB4CB, 0x6B64}, //{0xE6, 0xAD, 0xA4}, // ´Ë
- {0xB2BD, 0x6B65}, //{0xE6, 0xAD, 0xA5}, // ²½
- {0xCEE4, 0x6B66}, //{0xE6, 0xAD, 0xA6}, // Îä
- {0xC6E7, 0x6B67}, //{0xE6, 0xAD, 0xA7}, // Æç
- {0xCDE1, 0x6B6A}, //{0xE6, 0xAD, 0xAA}, // Íá
- {0xB4F5, 0x6B79}, //{0xE6, 0xAD, 0xB9}, // ´õ
- {0xCBC0, 0x6B7B}, //{0xE6, 0xAD, 0xBB}, // ËÀ
- {0xBCDF, 0x6B7C}, //{0xE6, 0xAD, 0xBC}, // ¼ß
- {0xD1EA, 0x6B83}, //{0xE6, 0xAE, 0x83}, // Ñê
+ {0xD5FD, 0x6B63}, //{0xE6, 0xAD, 0xA3}, // ��
+ {0xB4CB, 0x6B64}, //{0xE6, 0xAD, 0xA4}, // ��
+ {0xB2BD, 0x6B65}, //{0xE6, 0xAD, 0xA5}, // ��
+ {0xCEE4, 0x6B66}, //{0xE6, 0xAD, 0xA6}, // ��
+ {0xC6E7, 0x6B67}, //{0xE6, 0xAD, 0xA7}, // ��
+ {0xCDE1, 0x6B6A}, //{0xE6, 0xAD, 0xAA}, // ��
+ {0xB4F5, 0x6B79}, //{0xE6, 0xAD, 0xB9}, // ��
+ {0xCBC0, 0x6B7B}, //{0xE6, 0xAD, 0xBB}, // ��
+ {0xBCDF, 0x6B7C}, //{0xE6, 0xAD, 0xBC}, // ��
+ {0xD1EA, 0x6B83}, //{0xE6, 0xAE, 0x83}, // ��
{0xD1B3, 0x6B89}, //{0xE6, 0xAE, 0x89}, // ѳ
- {0xCAE2, 0x6B8A}, //{0xE6, 0xAE, 0x8A}, // Êâ
- {0xB2D0, 0x6B8B}, //{0xE6, 0xAE, 0x8B}, // ²Ð
+ {0xCAE2, 0x6B8A}, //{0xE6, 0xAE, 0x8A}, // ��
+ {0xB2D0, 0x6B8B}, //{0xE6, 0xAE, 0x8B}, // ��
{0xD6B3, 0x6B96}, //{0xE6, 0xAE, 0x96}, // Ö³
{0xC5B9, 0x6BB4}, //{0xE6, 0xAE, 0xB4}, // Ź
- {0xB6CE, 0x6BB5}, //{0xE6, 0xAE, 0xB5}, // ¶Î
- {0xD2F3, 0x6BB7}, //{0xE6, 0xAE, 0xB7}, // Òó
- {0xB5EE, 0x6BBF}, //{0xE6, 0xAE, 0xBF}, // µî
- {0xBBD9, 0x6BC1}, //{0xE6, 0xAF, 0x81}, // »Ù
- {0xD2E3, 0x6BC5}, //{0xE6, 0xAF, 0x85}, // Òã
+ {0xB6CE, 0x6BB5}, //{0xE6, 0xAE, 0xB5}, // ��
+ {0xD2F3, 0x6BB7}, //{0xE6, 0xAE, 0xB7}, // ��
+ {0xB5EE, 0x6BBF}, //{0xE6, 0xAE, 0xBF}, // ��
+ {0xBBD9, 0x6BC1}, //{0xE6, 0xAF, 0x81}, // ��
+ {0xD2E3, 0x6BC5}, //{0xE6, 0xAF, 0x85}, // ��
{0xC4B8, 0x6BCD}, //{0xE6, 0xAF, 0x8D}, // ĸ
{0xC3BF, 0x6BCF}, //{0xE6, 0xAF, 0x8F}, // ÿ
- {0xB6BE, 0x6BD2}, //{0xE6, 0xAF, 0x92}, // ¶¾
- {0xB1C8, 0x6BD4}, //{0xE6, 0xAF, 0x94}, // ±È
- {0xB1CF, 0x6BD5}, //{0xE6, 0xAF, 0x95}, // ±Ï
- {0xB1D0, 0x6BD9}, //{0xE6, 0xAF, 0x99}, // ±Ð
+ {0xB6BE, 0x6BD2}, //{0xE6, 0xAF, 0x92}, // ��
+ {0xB1C8, 0x6BD4}, //{0xE6, 0xAF, 0x94}, // ��
+ {0xB1CF, 0x6BD5}, //{0xE6, 0xAF, 0x95}, // ��
+ {0xB1D0, 0x6BD9}, //{0xE6, 0xAF, 0x99}, // ��
{0xC3AB, 0x6BDB}, //{0xE6, 0xAF, 0x9B}, // ë
{0xD5B1, 0x6BE1}, //{0xE6, 0xAF, 0xA1}, // Õ±
- {0xBAC1, 0x6BEB}, //{0xE6, 0xAF, 0xAB}, // ºÁ
+ {0xBAC1, 0x6BEB}, //{0xE6, 0xAF, 0xAB}, // ��
{0xCCBA, 0x6BEF}, //{0xE6, 0xAF, 0xAF}, // ̺
- {0xCACF, 0x6C0F}, //{0xE6, 0xB0, 0x8F}, // ÊÏ
- {0xC3F1, 0x6C11}, //{0xE6, 0xB0, 0x91}, // Ãñ
+ {0xCACF, 0x6C0F}, //{0xE6, 0xB0, 0x8F}, // ��
+ {0xC3F1, 0x6C11}, //{0xE6, 0xB0, 0x91}, // ��
{0xC3A5, 0x6C13}, //{0xE6, 0xB0, 0x93}, // å
- {0xC6F8, 0x6C14}, //{0xE6, 0xB0, 0x94}, // Æø
- {0xB7D5, 0x6C1B}, //{0xE6, 0xB0, 0x9B}, // ·Õ
- {0xC7E2, 0x6C22}, //{0xE6, 0xB0, 0xA2}, // Çâ
- {0xD1F5, 0x6C27}, //{0xE6, 0xB0, 0xA7}, // Ñõ
- {0xB0B1, 0x6C28}, //{0xE6, 0xB0, 0xA8}, // °±
- {0xB5AA, 0x6C2E}, //{0xE6, 0xB0, 0xAE}, // µª
- {0xC2C8, 0x6C2F}, //{0xE6, 0xB0, 0xAF}, // ÂÈ
+ {0xC6F8, 0x6C14}, //{0xE6, 0xB0, 0x94}, // ��
+ {0xB7D5, 0x6C1B}, //{0xE6, 0xB0, 0x9B}, // ��
+ {0xC7E2, 0x6C22}, //{0xE6, 0xB0, 0xA2}, // ��
+ {0xD1F5, 0x6C27}, //{0xE6, 0xB0, 0xA7}, // ��
+ {0xB0B1, 0x6C28}, //{0xE6, 0xB0, 0xA8}, // ��
+ {0xB5AA, 0x6C2E}, //{0xE6, 0xB0, 0xAE}, // ��
+ {0xC2C8, 0x6C2F}, //{0xE6, 0xB0, 0xAF}, // ��
{0xCBAE, 0x6C34}, //{0xE6, 0xB0, 0xB4}, // Ë®
- {0xD3C0, 0x6C38}, //{0xE6, 0xB0, 0xB8}, // ÓÀ
+ {0xD3C0, 0x6C38}, //{0xE6, 0xB0, 0xB8}, // ��
{0xD6AD, 0x6C41}, //{0xE6, 0xB1, 0x81}, // Ö
- {0xC7F3, 0x6C42}, //{0xE6, 0xB1, 0x82}, // Çó
- {0xBBE3, 0x6C47}, //{0xE6, 0xB1, 0x87}, // ȋ
- {0xBABA, 0x6C49}, //{0xE6, 0xB1, 0x89}, // ºº
- {0xBAB9, 0x6C57}, //{0xE6, 0xB1, 0x97}, // º¹
+ {0xC7F3, 0x6C42}, //{0xE6, 0xB1, 0x82}, // ��
+ {0xBBE3, 0x6C47}, //{0xE6, 0xB1, 0x87}, // ��
+ {0xBABA, 0x6C49}, //{0xE6, 0xB1, 0x89}, // ��
+ {0xBAB9, 0x6C57}, //{0xE6, 0xB1, 0x97}, // ��
{0xD1B4, 0x6C5B}, //{0xE6, 0xB1, 0x9B}, // Ñ´
- {0xB9AF, 0x6C5E}, //{0xE6, 0xB1, 0x9E}, // ¹¯
- {0xBDAD, 0x6C5F}, //{0xE6, 0xB1, 0x9F}, // ½
- {0xB3D8, 0x6C60}, //{0xE6, 0xB1, 0xA0}, // ³Ø
- {0xCEDB, 0x6C61}, //{0xE6, 0xB1, 0xA1}, // ÎÛ
- {0xCCC0, 0x6C64}, //{0xE6, 0xB1, 0xA4}, // ÌÀ
- {0xCDF4, 0x6C6A}, //{0xE6, 0xB1, 0xAA}, // Íô
+ {0xB9AF, 0x6C5E}, //{0xE6, 0xB1, 0x9E}, // ��
+ {0xBDAD, 0x6C5F}, //{0xE6, 0xB1, 0x9F}, // ��
+ {0xB3D8, 0x6C60}, //{0xE6, 0xB1, 0xA0}, // ��
+ {0xCEDB, 0x6C61}, //{0xE6, 0xB1, 0xA1}, // ��
+ {0xCCC0, 0x6C64}, //{0xE6, 0xB1, 0xA4}, // ��
+ {0xCDF4, 0x6C6A}, //{0xE6, 0xB1, 0xAA}, // ��
{0xCCAD, 0x6C70}, //{0xE6, 0xB1, 0xB0}, // Ì
- {0xD0DA, 0x6C79}, //{0xE6, 0xB1, 0xB9}, // ÐÚ
- {0xC6FB, 0x6C7D}, //{0xE6, 0xB1, 0xBD}, // Æû
- {0xCED6, 0x6C83}, //{0xE6, 0xB2, 0x83}, // ÎÖ
- {0xC9F2, 0x6C88}, //{0xE6, 0xB2, 0x88}, // Éò
- {0xB3C1, 0x6C89}, //{0xE6, 0xB2, 0x89}, // ³Á
- {0xE3E5, 0x6C90}, //{0xE6, 0xB2, 0x90}, // ãå
+ {0xD0DA, 0x6C79}, //{0xE6, 0xB1, 0xB9}, // ��
+ {0xC6FB, 0x6C7D}, //{0xE6, 0xB1, 0xBD}, // ��
+ {0xCED6, 0x6C83}, //{0xE6, 0xB2, 0x83}, // ��
+ {0xC9F2, 0x6C88}, //{0xE6, 0xB2, 0x88}, // ��
+ {0xB3C1, 0x6C89}, //{0xE6, 0xB2, 0x89}, // ��
+ {0xE3E5, 0x6C90}, //{0xE6, 0xB2, 0x90}, // ��
{0xC9B3, 0x6C99}, //{0xE6, 0xB2, 0x99}, // ɳ
- {0xC5E6, 0x6C9B}, //{0xE6, 0xB2, 0x9B}, // Åæ
- {0xB9B5, 0x6C9F}, //{0xE6, 0xB2, 0x9F}, // ¹µ
+ {0xC5E6, 0x6C9B}, //{0xE6, 0xB2, 0x9B}, // ��
+ {0xB9B5, 0x6C9F}, //{0xE6, 0xB2, 0x9F}, // ��
{0xC3BB, 0x6CA1}, //{0xE6, 0xB2, 0xA1}, // û
- {0xC1A4, 0x6CA5}, //{0xE6, 0xB2, 0xA5}, // Á¤
- {0xC2D9, 0x6CA6}, //{0xE6, 0xB2, 0xA6}, // ÂÙ
- {0xB2D7, 0x6CA7}, //{0xE6, 0xB2, 0xA7}, // ²×
- {0xBBA6, 0x6CAA}, //{0xE6, 0xB2, 0xAA}, // »¦
+ {0xC1A4, 0x6CA5}, //{0xE6, 0xB2, 0xA5}, // d
+ {0xC2D9, 0x6CA6}, //{0xE6, 0xB2, 0xA6}, // ��
+ {0xB2D7, 0x6CA7}, //{0xE6, 0xB2, 0xA7}, // ��
+ {0xBBA6, 0x6CAA}, //{0xE6, 0xB2, 0xAA}, // ��
{0xC4AD, 0x6CAB}, //{0xE6, 0xB2, 0xAB}, // Ä
- {0xBEDA, 0x6CAE}, //{0xE6, 0xB2, 0xAE}, // ¾Ú
- {0xBAD3, 0x6CB3}, //{0xE6, 0xB2, 0xB3}, // ºÓ
- {0xB7D0, 0x6CB8}, //{0xE6, 0xB2, 0xB8}, // ·Ð
- {0xD3CD, 0x6CB9}, //{0xE6, 0xB2, 0xB9}, // ÓÍ
- {0xD6CE, 0x6CBB}, //{0xE6, 0xB2, 0xBB}, // ÖÎ
- {0xD5D3, 0x6CBC}, //{0xE6, 0xB2, 0xBC}, // ÕÓ
- {0xB9C1, 0x6CBD}, //{0xE6, 0xB2, 0xBD}, // ¹Á
+ {0xBEDA, 0x6CAE}, //{0xE6, 0xB2, 0xAE}, // ��
+ {0xBAD3, 0x6CB3}, //{0xE6, 0xB2, 0xB3}, // ��
+ {0xB7D0, 0x6CB8}, //{0xE6, 0xB2, 0xB8}, // ��
+ {0xD3CD, 0x6CB9}, //{0xE6, 0xB2, 0xB9}, // ��
+ {0xD6CE, 0x6CBB}, //{0xE6, 0xB2, 0xBB}, // ��
+ {0xD5D3, 0x6CBC}, //{0xE6, 0xB2, 0xBC}, // ��
+ {0xB9C1, 0x6CBD}, //{0xE6, 0xB2, 0xBD}, // ��
{0xD5B4, 0x6CBE}, //{0xE6, 0xB2, 0xBE}, // Õ´
- {0xD1D8, 0x6CBF}, //{0xE6, 0xB2, 0xBF}, // ÑØ
+ {0xD1D8, 0x6CBF}, //{0xE6, 0xB2, 0xBF}, // ��
{0xD0B9, 0x6CC4}, //{0xE6, 0xB3, 0x84}, // й
{0xC8AA, 0x6CC9}, //{0xE6, 0xB3, 0x89}, // Ȫ
- {0xB2B4, 0x6CCA}, //{0xE6, 0xB3, 0x8A}, // ²´
- {0xC3DA, 0x6CCC}, //{0xE6, 0xB3, 0x8C}, // ÃÚ
- {0xB7A8, 0x6CD5}, //{0xE6, 0xB3, 0x95}, // ·¨
- {0xB7BA, 0x6CDB}, //{0xE6, 0xB3, 0x9B}, // ·º
+ {0xB2B4, 0x6CCA}, //{0xE6, 0xB3, 0x8A}, // ��
+ {0xC3DA, 0x6CCC}, //{0xE6, 0xB3, 0x8C}, // ��
+ {0xB7A8, 0x6CD5}, //{0xE6, 0xB3, 0x95}, // ��
+ {0xB7BA, 0x6CDB}, //{0xE6, 0xB3, 0x9B}, // ��
{0xC5A2, 0x6CDE}, //{0xE6, 0xB3, 0x9E}, // Ţ
- {0xC5DD, 0x6CE1}, //{0xE6, 0xB3, 0xA1}, // ÅÝ
- {0xB2A8, 0x6CE2}, //{0xE6, 0xB3, 0xA2}, // ²¨
- {0xC6FC, 0x6CE3}, //{0xE6, 0xB3, 0xA3}, // Æü
- {0xC4E0, 0x6CE5}, //{0xE6, 0xB3, 0xA5}, // Äà
+ {0xC5DD, 0x6CE1}, //{0xE6, 0xB3, 0xA1}, // ��
+ {0xB2A8, 0x6CE2}, //{0xE6, 0xB3, 0xA2}, // ��
+ {0xC6FC, 0x6CE3}, //{0xE6, 0xB3, 0xA3}, // ��
+ {0xC4E0, 0x6CE5}, //{0xE6, 0xB3, 0xA5}, // ��
{0xD7A2, 0x6CE8}, //{0xE6, 0xB3, 0xA8}, // ×¢
- {0xC0E1, 0x6CEA}, //{0xE6, 0xB3, 0xAA}, // Àá
+ {0xC0E1, 0x6CEA}, //{0xE6, 0xB3, 0xAA}, // ��
{0xCCA9, 0x6CF0}, //{0xE6, 0xB3, 0xB0}, // Ì©
{0xD3BE, 0x6CF3}, //{0xE6, 0xB3, 0xB3}, // Ó¾
- {0xB1C3, 0x6CF5}, //{0xE6, 0xB3, 0xB5}, // ±Ã
+ {0xB1C3, 0x6CF5}, //{0xE6, 0xB3, 0xB5}, // ��
{0xD0BA, 0x6CFB}, //{0xE6, 0xB3, 0xBB}, // к
- {0xC6C3, 0x6CFC}, //{0xE6, 0xB3, 0xBC}, // ÆÃ
- {0xD4F3, 0x6CFD}, //{0xE6, 0xB3, 0xBD}, // Ôó
- {0xBDE0, 0x6D01}, //{0xE6, 0xB4, 0x81}, // ½à
- {0xD1F3, 0x6D0B}, //{0xE6, 0xB4, 0x8B}, // Ñó
- {0xC8F7, 0x6D12}, //{0xE6, 0xB4, 0x92}, // È÷
+ {0xC6C3, 0x6CFC}, //{0xE6, 0xB3, 0xBC}, // ��
+ {0xD4F3, 0x6CFD}, //{0xE6, 0xB3, 0xBD}, // ��
+ {0xBDE0, 0x6D01}, //{0xE6, 0xB4, 0x81}, // ��
+ {0xD1F3, 0x6D0B}, //{0xE6, 0xB4, 0x8B}, // ��
+ {0xC8F7, 0x6D12}, //{0xE6, 0xB4, 0x92}, // ��
{0xCFB4, 0x6D17}, //{0xE6, 0xB4, 0x97}, // Ï´
- {0xC2E5, 0x6D1B}, //{0xE6, 0xB4, 0x9B}, // Âå
- {0xB6B4, 0x6D1E}, //{0xE6, 0xB4, 0x9E}, // ¶´
- {0xBDF2, 0x6D25}, //{0xE6, 0xB4, 0xA5}, // ½ò
- {0xBAE9, 0x6D2A}, //{0xE6, 0xB4, 0xAA}, // ºé
- {0xD6DE, 0x6D32}, //{0xE6, 0xB4, 0xB2}, // ÖÞ
- {0xBBEE, 0x6D3B}, //{0xE6, 0xB4, 0xBB}, // Ȕ
- {0xCDDD, 0x6D3C}, //{0xE6, 0xB4, 0xBC}, // ÍÝ
+ {0xC2E5, 0x6D1B}, //{0xE6, 0xB4, 0x9B}, // ��
+ {0xB6B4, 0x6D1E}, //{0xE6, 0xB4, 0x9E}, // ��
+ {0xBDF2, 0x6D25}, //{0xE6, 0xB4, 0xA5}, // ��
+ {0xBAE9, 0x6D2A}, //{0xE6, 0xB4, 0xAA}, // ��
+ {0xD6DE, 0x6D32}, //{0xE6, 0xB4, 0xB2}, // ��
+ {0xBBEE, 0x6D3B}, //{0xE6, 0xB4, 0xBB}, // ��
+ {0xCDDD, 0x6D3C}, //{0xE6, 0xB4, 0xBC}, // ��
{0xC7A2, 0x6D3D}, //{0xE6, 0xB4, 0xBD}, // Ǣ
- {0xC5C9, 0x6D3E}, //{0xE6, 0xB4, 0xBE}, // ÅÉ
- {0xC1F7, 0x6D41}, //{0xE6, 0xB5, 0x81}, // Á÷
+ {0xC5C9, 0x6D3E}, //{0xE6, 0xB4, 0xBE}, // ��
+ {0xC1F7, 0x6D41}, //{0xE6, 0xB5, 0x81}, // ��
{0xC7B3, 0x6D45}, //{0xE6, 0xB5, 0x85}, // dz
- {0xBDAC, 0x6D46}, //{0xE6, 0xB5, 0x86}, // ½¬
- {0xBDBD, 0x6D47}, //{0xE6, 0xB5, 0x87}, // ½½
- {0xD7C7, 0x6D4A}, //{0xE6, 0xB5, 0x8A}, // ×Ç
- {0xB2E2, 0x6D4B}, //{0xE6, 0xB5, 0x8B}, // ²â
- {0xBCC3, 0x6D4E}, //{0xE6, 0xB5, 0x8E}, // ¼Ã
- {0xBBEB, 0x6D51}, //{0xE6, 0xB5, 0x91}, // ȑ
+ {0xBDAC, 0x6D46}, //{0xE6, 0xB5, 0x86}, // ��
+ {0xBDBD, 0x6D47}, //{0xE6, 0xB5, 0x87}, // ��
+ {0xD7C7, 0x6D4A}, //{0xE6, 0xB5, 0x8A}, // ��
+ {0xB2E2, 0x6D4B}, //{0xE6, 0xB5, 0x8B}, // ��
+ {0xBCC3, 0x6D4E}, //{0xE6, 0xB5, 0x8E}, // ��
+ {0xBBEB, 0x6D51}, //{0xE6, 0xB5, 0x91}, // ��
{0xC5A8, 0x6D53}, //{0xE6, 0xB5, 0x93}, // Ũ
- {0xD5E3, 0x6D59}, //{0xE6, 0xB5, 0x99}, // Õã
- {0xC6D6, 0x6D66}, //{0xE6, 0xB5, 0xA6}, // ÆÖ
- {0xBAC6, 0x6D69}, //{0xE6, 0xB5, 0xA9}, // ºÆ
- {0xC0CB, 0x6D6A}, //{0xE6, 0xB5, 0xAA}, // ÀË
- {0xB8A1, 0x6D6E}, //{0xE6, 0xB5, 0xAE}, // ¸¡
+ {0xD5E3, 0x6D59}, //{0xE6, 0xB5, 0x99}, // ��
+ {0xC6D6, 0x6D66}, //{0xE6, 0xB5, 0xA6}, // ��
+ {0xBAC6, 0x6D69}, //{0xE6, 0xB5, 0xA9}, // ��
+ {0xC0CB, 0x6D6A}, //{0xE6, 0xB5, 0xAA}, // ��
+ {0xB8A1, 0x6D6E}, //{0xE6, 0xB5, 0xAE}, // ��
{0xD4A1, 0x6D74}, //{0xE6, 0xB5, 0xB4}, // Ô¡
- {0xBAA3, 0x6D77}, //{0xE6, 0xB5, 0xB7}, // º£
- {0xBDFE, 0x6D78}, //{0xE6, 0xB5, 0xB8}, // ½þ
+ {0xBAA3, 0x6D77}, //{0xE6, 0xB5, 0xB7}, // ��
+ {0xBDFE, 0x6D78}, //{0xE6, 0xB5, 0xB8}, // ��
{0xCDBF, 0x6D82}, //{0xE6, 0xB6, 0x82}, // Í¿
- {0xCFFB, 0x6D88}, //{0xE6, 0xB6, 0x88}, // Ïû
- {0xC9E6, 0x6D89}, //{0xE6, 0xB6, 0x89}, // Éæ
+ {0xCFFB, 0x6D88}, //{0xE6, 0xB6, 0x88}, // ��
+ {0xC9E6, 0x6D89}, //{0xE6, 0xB6, 0x89}, // ��
{0xD3BF, 0x6D8C}, //{0xE6, 0xB6, 0x8C}, // Ó¿
- {0xCFD1, 0x6D8E}, //{0xE6, 0xB6, 0x8E}, // ÏÑ
- {0xCCE9, 0x6D95}, //{0xE6, 0xB6, 0x95}, // Ìé
- {0xCCCE, 0x6D9B}, //{0xE6, 0xB6, 0x9B}, // ÌÎ
- {0xC0D4, 0x6D9D}, //{0xE6, 0xB6, 0x9D}, // ÀÔ
- {0xCED0, 0x6DA1}, //{0xE6, 0xB6, 0xA1}, // ÎÐ
- {0xBBC1, 0x6DA3}, //{0xE6, 0xB6, 0xA3}, // »Á
- {0xB5D3, 0x6DA4}, //{0xE6, 0xB6, 0xA4}, // µÓ
- {0xC8F3, 0x6DA6}, //{0xE6, 0xB6, 0xA6}, // Èó
- {0xBDA7, 0x6DA7}, //{0xE6, 0xB6, 0xA7}, // ½§
- {0xD5C7, 0x6DA8}, //{0xE6, 0xB6, 0xA8}, // ÕÇ
+ {0xCFD1, 0x6D8E}, //{0xE6, 0xB6, 0x8E}, // ��
+ {0xCCE9, 0x6D95}, //{0xE6, 0xB6, 0x95}, // ��
+ {0xCCCE, 0x6D9B}, //{0xE6, 0xB6, 0x9B}, // ��
+ {0xC0D4, 0x6D9D}, //{0xE6, 0xB6, 0x9D}, // ��
+ {0xCED0, 0x6DA1}, //{0xE6, 0xB6, 0xA1}, // ��
+ {0xBBC1, 0x6DA3}, //{0xE6, 0xB6, 0xA3}, // ��
+ {0xB5D3, 0x6DA4}, //{0xE6, 0xB6, 0xA4}, // ��
+ {0xC8F3, 0x6DA6}, //{0xE6, 0xB6, 0xA6}, // ��
+ {0xBDA7, 0x6DA7}, //{0xE6, 0xB6, 0xA7}, // ��
+ {0xD5C7, 0x6DA8}, //{0xE6, 0xB6, 0xA8}, // ��
{0xC9AC, 0x6DA9}, //{0xE6, 0xB6, 0xA9}, // ɬ
- {0xE4CC, 0x6DAE}, //{0xE6, 0xB6, 0xAE}, // äÌ
- {0xD1C4, 0x6DAF}, //{0xE6, 0xB6, 0xAF}, // ÑÄ
+ {0xE4CC, 0x6DAE}, //{0xE6, 0xB6, 0xAE}, // ��
+ {0xD1C4, 0x6DAF}, //{0xE6, 0xB6, 0xAF}, // ��
{0xD2BA, 0x6DB2}, //{0xE6, 0xB6, 0xB2}, // Òº
- {0xBAAD, 0x6DB5}, //{0xE6, 0xB6, 0xB5}, // º
- {0xB5ED, 0x6DC0}, //{0xE6, 0xB7, 0x80}, // µí
- {0xCFFD, 0x6DC6}, //{0xE6, 0xB7, 0x86}, // Ïý
- {0xC1DC, 0x6DCB}, //{0xE6, 0xB7, 0x8B}, // ÁÜ
- {0xCCCA, 0x6DCC}, //{0xE6, 0xB7, 0x8C}, // ÌÊ
- {0xCAE7, 0x6DD1}, //{0xE6, 0xB7, 0x91}, // Êç
- {0xCCD4, 0x6DD8}, //{0xE6, 0xB7, 0x98}, // ÌÔ
- {0xB5AD, 0x6DE1}, //{0xE6, 0xB7, 0xA1}, // µ
- {0xD3D9, 0x6DE4}, //{0xE6, 0xB7, 0xA4}, // ÓÙ
- {0xD2F9, 0x6DEB}, //{0xE6, 0xB7, 0xAB}, // Òù
- {0xBBB4, 0x6DEE}, //{0xE6, 0xB7, 0xAE}, // »´
- {0xC9EE, 0x6DF1}, //{0xE6, 0xB7, 0xB1}, // Éî
- {0xB4BE, 0x6DF3}, //{0xE6, 0xB7, 0xB3}, // ´¾
- {0xBBEC, 0x6DF7}, //{0xE6, 0xB7, 0xB7}, // ȓ
- {0xD1CD, 0x6DF9}, //{0xE6, 0xB7, 0xB9}, // ÑÍ
- {0xCCED, 0x6DFB}, //{0xE6, 0xB7, 0xBB}, // Ìí
- {0xC7E5, 0x6E05}, //{0xE6, 0xB8, 0x85}, // Çå
+ {0xBAAD, 0x6DB5}, //{0xE6, 0xB6, 0xB5}, // ��
+ {0xB5ED, 0x6DC0}, //{0xE6, 0xB7, 0x80}, // ��
+ {0xCFFD, 0x6DC6}, //{0xE6, 0xB7, 0x86}, // ��
+ {0xC1DC, 0x6DCB}, //{0xE6, 0xB7, 0x8B}, // ��
+ {0xCCCA, 0x6DCC}, //{0xE6, 0xB7, 0x8C}, // ��
+ {0xCAE7, 0x6DD1}, //{0xE6, 0xB7, 0x91}, // ��
+ {0xCCD4, 0x6DD8}, //{0xE6, 0xB7, 0x98}, // ��
+ {0xB5AD, 0x6DE1}, //{0xE6, 0xB7, 0xA1}, // ��
+ {0xD3D9, 0x6DE4}, //{0xE6, 0xB7, 0xA4}, // ��
+ {0xD2F9, 0x6DEB}, //{0xE6, 0xB7, 0xAB}, // ��
+ {0xBBB4, 0x6DEE}, //{0xE6, 0xB7, 0xAE}, // ��
+ {0xC9EE, 0x6DF1}, //{0xE6, 0xB7, 0xB1}, // ��
+ {0xB4BE, 0x6DF3}, //{0xE6, 0xB7, 0xB3}, // ��
+ {0xBBEC, 0x6DF7}, //{0xE6, 0xB7, 0xB7}, // ��
+ {0xD1CD, 0x6DF9}, //{0xE6, 0xB7, 0xB9}, // ��
+ {0xCCED, 0x6DFB}, //{0xE6, 0xB7, 0xBB}, // ��
+ {0xC7E5, 0x6E05}, //{0xE6, 0xB8, 0x85}, // ��
{0xD4A8, 0x6E0A}, //{0xE6, 0xB8, 0x8A}, // Ô¨
- {0xBDA5, 0x6E10}, //{0xE6, 0xB8, 0x90}, // ½¥
- {0xD3E6, 0x6E14}, //{0xE6, 0xB8, 0x94}, // Óæ
- {0xC9F8, 0x6E17}, //{0xE6, 0xB8, 0x97}, // Éø
- {0xC7FE, 0x6E20}, //{0xE6, 0xB8, 0xA0}, // Çþ
- {0xB6C9, 0x6E21}, //{0xE6, 0xB8, 0xA1}, // ¶É
- {0xD4FC, 0x6E23}, //{0xE6, 0xB8, 0xA3}, // Ôü
- {0xB2B3, 0x6E24}, //{0xE6, 0xB8, 0xA4}, // ²³
- {0xCEC2, 0x6E29}, //{0xE6, 0xB8, 0xA9}, // ÎÂ
- {0xB8DB, 0x6E2F}, //{0xE6, 0xB8, 0xAF}, // ¸Û
- {0xBFCA, 0x6E34}, //{0xE6, 0xB8, 0xB4}, // ¿Ê
- {0xD3CE, 0x6E38}, //{0xE6, 0xB8, 0xB8}, // ÓÎ
- {0xC3EC, 0x6E3A}, //{0xE6, 0xB8, 0xBA}, // Ãì
- {0xC5C8, 0x6E43}, //{0xE6, 0xB9, 0x83}, // ÅÈ
- {0xBAFE, 0x6E56}, //{0xE6, 0xB9, 0x96}, // ºþ
- {0xCFE6, 0x6E58}, //{0xE6, 0xB9, 0x98}, // Ïæ
- {0xCDE5, 0x6E7E}, //{0xE6, 0xB9, 0xBE}, // Íå
+ {0xBDA5, 0x6E10}, //{0xE6, 0xB8, 0x90}, // ��
+ {0xD3E6, 0x6E14}, //{0xE6, 0xB8, 0x94}, // ��
+ {0xC9F8, 0x6E17}, //{0xE6, 0xB8, 0x97}, // ��
+ {0xC7FE, 0x6E20}, //{0xE6, 0xB8, 0xA0}, // ��
+ {0xB6C9, 0x6E21}, //{0xE6, 0xB8, 0xA1}, // ��
+ {0xD4FC, 0x6E23}, //{0xE6, 0xB8, 0xA3}, // ��
+ {0xB2B3, 0x6E24}, //{0xE6, 0xB8, 0xA4}, // ��
+ {0xCEC2, 0x6E29}, //{0xE6, 0xB8, 0xA9}, // ��
+ {0xB8DB, 0x6E2F}, //{0xE6, 0xB8, 0xAF}, // ��
+ {0xBFCA, 0x6E34}, //{0xE6, 0xB8, 0xB4}, // ��
+ {0xD3CE, 0x6E38}, //{0xE6, 0xB8, 0xB8}, // ��
+ {0xC3EC, 0x6E3A}, //{0xE6, 0xB8, 0xBA}, // ��
+ {0xC5C8, 0x6E43}, //{0xE6, 0xB9, 0x83}, // ��
+ {0xBAFE, 0x6E56}, //{0xE6, 0xB9, 0x96}, // ��
+ {0xCFE6, 0x6E58}, //{0xE6, 0xB9, 0x98}, // ��
+ {0xCDE5, 0x6E7E}, //{0xE6, 0xB9, 0xBE}, // ��
{0xCAAA, 0x6E7F}, //{0xE6, 0xB9, 0xBF}, // ʪ
- {0xC0A3, 0x6E83}, //{0xE6, 0xBA, 0x83}, // ˣ
- {0xBDA6, 0x6E85}, //{0xE6, 0xBA, 0x85}, // ½¦
- {0xB8C8, 0x6E89}, //{0xE6, 0xBA, 0x89}, // ¸È
+ {0xC0A3, 0x6E83}, //{0xE6, 0xBA, 0x83}, // #
+ {0xBDA6, 0x6E85}, //{0xE6, 0xBA, 0x85}, // ��
+ {0xB8C8, 0x6E89}, //{0xE6, 0xBA, 0x89}, // ��
{0xD4B4, 0x6E90}, //{0xE6, 0xBA, 0x90}, // Ô´
- {0xC1EF, 0x6E9C}, //{0xE6, 0xBA, 0x9C}, // Áï
- {0xD2E7, 0x6EA2}, //{0xE6, 0xBA, 0xA2}, // Òç
+ {0xC1EF, 0x6E9C}, //{0xE6, 0xBA, 0x9C}, // ��
+ {0xD2E7, 0x6EA2}, //{0xE6, 0xBA, 0xA2}, // ��
{0xCFAA, 0x6EAA}, //{0xE6, 0xBA, 0xAA}, // Ϫ
- {0xCBDD, 0x6EAF}, //{0xE6, 0xBA, 0xAF}, // ËÝ
- {0xC8DC, 0x6EB6}, //{0xE6, 0xBA, 0xB6}, // ÈÜ
- {0xC4E7, 0x6EBA}, //{0xE6, 0xBA, 0xBA}, // Äç
- {0xD7CC, 0x6ECB}, //{0xE6, 0xBB, 0x8B}, // ×Ì
- {0xBBAC, 0x6ED1}, //{0xE6, 0xBB, 0x91}, // »¬
- {0xD7D2, 0x6ED3}, //{0xE6, 0xBB, 0x93}, // ×Ò
- {0xCCCF, 0x6ED4}, //{0xE6, 0xBB, 0x94}, // ÌÏ
- {0xB9F6, 0x6EDA}, //{0xE6, 0xBB, 0x9A}, // ¹ö
- {0xD6CD, 0x6EDE}, //{0xE6, 0xBB, 0x9E}, // ÖÍ
- {0xC2FA, 0x6EE1}, //{0xE6, 0xBB, 0xA1}, // Âú
- {0xC2CB, 0x6EE4}, //{0xE6, 0xBB, 0xA4}, // ÂË
- {0xC0C4, 0x6EE5}, //{0xE6, 0xBB, 0xA5}, // ÀÄ
- {0xB1F5, 0x6EE8}, //{0xE6, 0xBB, 0xA8}, // ±õ
+ {0xCBDD, 0x6EAF}, //{0xE6, 0xBA, 0xAF}, // ��
+ {0xC8DC, 0x6EB6}, //{0xE6, 0xBA, 0xB6}, // ��
+ {0xC4E7, 0x6EBA}, //{0xE6, 0xBA, 0xBA}, // ��
+ {0xD7CC, 0x6ECB}, //{0xE6, 0xBB, 0x8B}, // ��
+ {0xBBAC, 0x6ED1}, //{0xE6, 0xBB, 0x91}, // ��
+ {0xD7D2, 0x6ED3}, //{0xE6, 0xBB, 0x93}, // ��
+ {0xCCCF, 0x6ED4}, //{0xE6, 0xBB, 0x94}, // ��
+ {0xB9F6, 0x6EDA}, //{0xE6, 0xBB, 0x9A}, // ��
+ {0xD6CD, 0x6EDE}, //{0xE6, 0xBB, 0x9E}, // ��
+ {0xC2FA, 0x6EE1}, //{0xE6, 0xBB, 0xA1}, // ��
+ {0xC2CB, 0x6EE4}, //{0xE6, 0xBB, 0xA4}, // ��
+ {0xC0C4, 0x6EE5}, //{0xE6, 0xBB, 0xA5}, // ��
+ {0xB1F5, 0x6EE8}, //{0xE6, 0xBB, 0xA8}, // ��
{0xCCB2, 0x6EE9}, //{0xE6, 0xBB, 0xA9}, // ̲
- {0xB5CE, 0x6EF4}, //{0xE6, 0xBB, 0xB4}, // µÎ
+ {0xB5CE, 0x6EF4}, //{0xE6, 0xBB, 0xB4}, // ��
{0xC6AF, 0x6F02}, //{0xE6, 0xBC, 0x82}, // Ư
- {0xC6E1, 0x6F06}, //{0xE6, 0xBC, 0x86}, // Æá
+ {0xC6E1, 0x6F06}, //{0xE6, 0xBC, 0x86}, // ��
{0xC2A9, 0x6F0F}, //{0xE6, 0xBC, 0x8F}, // ©
- {0xC0EC, 0x6F13}, //{0xE6, 0xBC, 0x93}, // Àì
- {0xD1DD, 0x6F14}, //{0xE6, 0xBC, 0x94}, // ÑÝ
+ {0xC0EC, 0x6F13}, //{0xE6, 0xBC, 0x93}, // ��
+ {0xD1DD, 0x6F14}, //{0xE6, 0xBC, 0x94}, // ��
{0xC4AE, 0x6F20}, //{0xE6, 0xBC, 0xA0}, // Ä®
- {0xE4F6, 0x6F29}, //{0xE6, 0xBC, 0xA9}, // äö
- {0xC2FE, 0x6F2B}, //{0xE6, 0xBC, 0xAB}, // Âþ
- {0xCAFE, 0x6F31}, //{0xE6, 0xBC, 0xB1}, // Êþ
- {0xD1FA, 0x6F3E}, //{0xE6, 0xBC, 0xBE}, // Ñú
- {0xC5CB, 0x6F58}, //{0xE6, 0xBD, 0x98}, // ÅË
+ {0xE4F6, 0x6F29}, //{0xE6, 0xBC, 0xA9}, // ��
+ {0xC2FE, 0x6F2B}, //{0xE6, 0xBC, 0xAB}, // ��
+ {0xCAFE, 0x6F31}, //{0xE6, 0xBC, 0xB1}, // ��
+ {0xD1FA, 0x6F3E}, //{0xE6, 0xBC, 0xBE}, // ��
+ {0xC5CB, 0x6F58}, //{0xE6, 0xBD, 0x98}, // ��
{0xC7B1, 0x6F5C}, //{0xE6, 0xBD, 0x9C}, // DZ
- {0xC1CA, 0x6F66}, //{0xE6, 0xBD, 0xA6}, // ÁÊ
+ {0xC1CA, 0x6F66}, //{0xE6, 0xBD, 0xA6}, // ��
{0xCCB6, 0x6F6D}, //{0xE6, 0xBD, 0xAD}, // ̶
- {0xB3B1, 0x6F6E}, //{0xE6, 0xBD, 0xAE}, // ³±
- {0xB3CE, 0x6F84}, //{0xE6, 0xBE, 0x84}, // ³Î
- {0xB3BA, 0x6F88}, //{0xE6, 0xBE, 0x88}, // ³º
- {0xC5EC, 0x6F8E}, //{0xE6, 0xBE, 0x8E}, // Åì
- {0xC0BD, 0x6F9C}, //{0xE6, 0xBE, 0x9C}, // À½
- {0xD4E8, 0x6FA1}, //{0xE6, 0xBE, 0xA1}, // Ôè
- {0xB0C4, 0x6FB3}, //{0xE6, 0xBE, 0xB3}, // °Ä
- {0xBCA4, 0x6FC0}, //{0xE6, 0xBF, 0x80}, // ¼¤
- {0xB1F4, 0x6FD2}, //{0xE6, 0xBF, 0x92}, // ±ô
- {0xC6D9, 0x7011}, //{0xE7, 0x80, 0x91}, // ÆÙ
- {0xB9E0, 0x704C}, //{0xE7, 0x81, 0x8C}, // ¹à
- {0xBBF0, 0x706B}, //{0xE7, 0x81, 0xAB}, // »ð
- {0xC3F0, 0x706D}, //{0xE7, 0x81, 0xAD}, // Ãð
- {0xB5C6, 0x706F}, //{0xE7, 0x81, 0xAF}, // µÆ
- {0xBBD2, 0x7070}, //{0xE7, 0x81, 0xB0}, // »Ò
- {0xC1E9, 0x7075}, //{0xE7, 0x81, 0xB5}, // Áé
- {0xD4EE, 0x7076}, //{0xE7, 0x81, 0xB6}, // Ôî
- {0xBEC4, 0x7078}, //{0xE7, 0x81, 0xB8}, // ¾Ä
- {0xD7C6, 0x707C}, //{0xE7, 0x81, 0xBC}, // ׯ
- {0xD4D6, 0x707E}, //{0xE7, 0x81, 0xBE}, // ÔÖ
- {0xB2D3, 0x707F}, //{0xE7, 0x81, 0xBF}, // ²Ó
+ {0xB3B1, 0x6F6E}, //{0xE6, 0xBD, 0xAE}, // ��
+ {0xB3CE, 0x6F84}, //{0xE6, 0xBE, 0x84}, // ��
+ {0xB3BA, 0x6F88}, //{0xE6, 0xBE, 0x88}, // ��
+ {0xC5EC, 0x6F8E}, //{0xE6, 0xBE, 0x8E}, // ��
+ {0xC0BD, 0x6F9C}, //{0xE6, 0xBE, 0x9C}, // =
+ {0xD4E8, 0x6FA1}, //{0xE6, 0xBE, 0xA1}, // ��
+ {0xB0C4, 0x6FB3}, //{0xE6, 0xBE, 0xB3}, // ��
+ {0xBCA4, 0x6FC0}, //{0xE6, 0xBF, 0x80}, // ��
+ {0xB1F4, 0x6FD2}, //{0xE6, 0xBF, 0x92}, // ��
+ {0xC6D9, 0x7011}, //{0xE7, 0x80, 0x91}, // ��
+ {0xB9E0, 0x704C}, //{0xE7, 0x81, 0x8C}, // ��
+ {0xBBF0, 0x706B}, //{0xE7, 0x81, 0xAB}, // ��
+ {0xC3F0, 0x706D}, //{0xE7, 0x81, 0xAD}, // ��
+ {0xB5C6, 0x706F}, //{0xE7, 0x81, 0xAF}, // ��
+ {0xBBD2, 0x7070}, //{0xE7, 0x81, 0xB0}, // ��
+ {0xC1E9, 0x7075}, //{0xE7, 0x81, 0xB5}, // ��
+ {0xD4EE, 0x7076}, //{0xE7, 0x81, 0xB6}, // ��
+ {0xBEC4, 0x7078}, //{0xE7, 0x81, 0xB8}, // ��
+ {0xD7C6, 0x707C}, //{0xE7, 0x81, 0xBC}, // ��
+ {0xD4D6, 0x707E}, //{0xE7, 0x81, 0xBE}, // ��
+ {0xB2D3, 0x707F}, //{0xE7, 0x81, 0xBF}, // ��
{0xC2AF, 0x7089}, //{0xE7, 0x82, 0x89}, // ¯
- {0xB4B6, 0x708A}, //{0xE7, 0x82, 0x8A}, // ´¶
- {0xD1D7, 0x708E}, //{0xE7, 0x82, 0x8E}, // Ñ×
- {0xB3B4, 0x7092}, //{0xE7, 0x82, 0x92}, // ³´
- {0xBFBB, 0x7095}, //{0xE7, 0x82, 0x95}, // ¿»
- {0xECC5, 0x70AB}, //{0xE7, 0x82, 0xAB}, // ìÅ
- {0xBEE6, 0x70AC}, //{0xE7, 0x82, 0xAC}, // ¾æ
+ {0xB4B6, 0x708A}, //{0xE7, 0x82, 0x8A}, // ��
+ {0xD1D7, 0x708E}, //{0xE7, 0x82, 0x8E}, // ��
+ {0xB3B4, 0x7092}, //{0xE7, 0x82, 0x92}, // ��
+ {0xBFBB, 0x7095}, //{0xE7, 0x82, 0x95}, // ��
+ {0xECC5, 0x70AB}, //{0xE7, 0x82, 0xAB}, // ��
+ {0xBEE6, 0x70AC}, //{0xE7, 0x82, 0xAC}, // ��
{0xCCBF, 0x70AD}, //{0xE7, 0x82, 0xAD}, // Ì¿
- {0xC5DA, 0x70AE}, //{0xE7, 0x82, 0xAE}, // ÅÚ
+ {0xC5DA, 0x70AE}, //{0xE7, 0x82, 0xAE}, // ��
{0xD5A8, 0x70B8}, //{0xE7, 0x82, 0xB8}, // Õ¨
- {0xB5E3, 0x70B9}, //{0xE7, 0x82, 0xB9}, // µã
- {0xC1B6, 0x70BC}, //{0xE7, 0x82, 0xBC}, // Á¶
+ {0xB5E3, 0x70B9}, //{0xE7, 0x82, 0xB9}, // ��
+ {0xC1B6, 0x70BC}, //{0xE7, 0x82, 0xBC}, // ��
{0xCBB8, 0x70C1}, //{0xE7, 0x83, 0x81}, // ˸
- {0xC0C3, 0x70C2}, //{0xE7, 0x83, 0x82}, // ÀÃ
- {0xC1D2, 0x70C8}, //{0xE7, 0x83, 0x88}, // ÁÒ
- {0xBAE6, 0x70D8}, //{0xE7, 0x83, 0x98}, // ºæ
- {0xC0D3, 0x70D9}, //{0xE7, 0x83, 0x99}, // ÀÓ
- {0xD6F2, 0x70DB}, //{0xE7, 0x83, 0x9B}, // Öò
- {0xD1CC, 0x70DF}, //{0xE7, 0x83, 0x9F}, // ÑÌ
- {0xBFBE, 0x70E4}, //{0xE7, 0x83, 0xA4}, // ¿¾
- {0xB7B3, 0x70E6}, //{0xE7, 0x83, 0xA6}, // ·³
- {0xC9D5, 0x70E7}, //{0xE7, 0x83, 0xA7}, // ÉÕ
- {0xCCCC, 0x70EB}, //{0xE7, 0x83, 0xAB}, // ÌÌ
- {0xC8C8, 0x70ED}, //{0xE7, 0x83, 0xAD}, // ÈÈ
- {0xC5EB, 0x70F9}, //{0xE7, 0x83, 0xB9}, // Åë
- {0xBAB8, 0x710A}, //{0xE7, 0x84, 0x8A}, // º¸
- {0xBBC0, 0x7115}, //{0xE7, 0x84, 0x95}, // »À
- {0xB1BA, 0x7119}, //{0xE7, 0x84, 0x99}, // ±º
- {0xB7D9, 0x711A}, //{0xE7, 0x84, 0x9A}, // ·Ù
- {0xBDB9, 0x7126}, //{0xE7, 0x84, 0xA6}, // ½¹
- {0xD1E6, 0x7130}, //{0xE7, 0x84, 0xB0}, // Ñæ
+ {0xC0C3, 0x70C2}, //{0xE7, 0x83, 0x82}, // ��
+ {0xC1D2, 0x70C8}, //{0xE7, 0x83, 0x88}, // ��
+ {0xBAE6, 0x70D8}, //{0xE7, 0x83, 0x98}, // ��
+ {0xC0D3, 0x70D9}, //{0xE7, 0x83, 0x99}, // ��
+ {0xD6F2, 0x70DB}, //{0xE7, 0x83, 0x9B}, // ��
+ {0xD1CC, 0x70DF}, //{0xE7, 0x83, 0x9F}, // ��
+ {0xBFBE, 0x70E4}, //{0xE7, 0x83, 0xA4}, // ��
+ {0xB7B3, 0x70E6}, //{0xE7, 0x83, 0xA6}, // ��
+ {0xC9D5, 0x70E7}, //{0xE7, 0x83, 0xA7}, // ��
+ {0xCCCC, 0x70EB}, //{0xE7, 0x83, 0xAB}, // ��
+ {0xC8C8, 0x70ED}, //{0xE7, 0x83, 0xAD}, // ��
+ {0xC5EB, 0x70F9}, //{0xE7, 0x83, 0xB9}, // ��
+ {0xBAB8, 0x710A}, //{0xE7, 0x84, 0x8A}, // ��
+ {0xBBC0, 0x7115}, //{0xE7, 0x84, 0x95}, // ��
+ {0xB1BA, 0x7119}, //{0xE7, 0x84, 0x99}, // ��
+ {0xB7D9, 0x711A}, //{0xE7, 0x84, 0x9A}, // ��
+ {0xBDB9, 0x7126}, //{0xE7, 0x84, 0xA6}, // ��
+ {0xD1E6, 0x7130}, //{0xE7, 0x84, 0xB0}, // ��
{0xC8BB, 0x7136}, //{0xE7, 0x84, 0xB6}, // È»
- {0xBBCD, 0x714C}, //{0xE7, 0x85, 0x8C}, // »Í
- {0xBCE5, 0x714E}, //{0xE7, 0x85, 0x8E}, // ¼å
+ {0xBBCD, 0x714C}, //{0xE7, 0x85, 0x8C}, // ��
+ {0xBCE5, 0x714E}, //{0xE7, 0x85, 0x8E}, // ��
{0xC9B7, 0x715E}, //{0xE7, 0x85, 0x9E}, // É·
{0xC3BA, 0x7164}, //{0xE7, 0x85, 0xA4}, // ú
- {0xD5D5, 0x7167}, //{0xE7, 0x85, 0xA7}, // ÕÕ
- {0xD6F3, 0x716E}, //{0xE7, 0x85, 0xAE}, // Öó
+ {0xD5D5, 0x7167}, //{0xE7, 0x85, 0xA7}, // ��
+ {0xD6F3, 0x716E}, //{0xE7, 0x85, 0xAE}, // ��
{0xCFA8, 0x7184}, //{0xE7, 0x86, 0x84}, // Ϩ
- {0xD0DC, 0x718A}, //{0xE7, 0x86, 0x8A}, // ÐÜ
+ {0xD0DC, 0x718A}, //{0xE7, 0x86, 0x8A}, // ��
{0xD1AC, 0x718F}, //{0xE7, 0x86, 0x8F}, // Ѭ
- {0xC8DB, 0x7194}, //{0xE7, 0x86, 0x94}, // ÈÛ
- {0xCEF5, 0x7199}, //{0xE7, 0x86, 0x99}, // Îõ
- {0xCAEC, 0x719F}, //{0xE7, 0x86, 0x9F}, // Êì
- {0xB0BE, 0x71AC}, //{0xE7, 0x86, 0xAC}, // °¾
+ {0xC8DB, 0x7194}, //{0xE7, 0x86, 0x94}, // ��
+ {0xCEF5, 0x7199}, //{0xE7, 0x86, 0x99}, // ��
+ {0xCAEC, 0x719F}, //{0xE7, 0x86, 0x9F}, // ��
+ {0xB0BE, 0x71AC}, //{0xE7, 0x86, 0xAC}, // ��
{0xC8BC, 0x71C3}, //{0xE7, 0x87, 0x83}, // ȼ
- {0xC1C7, 0x71CE}, //{0xE7, 0x87, 0x8E}, // ÁÇ
- {0xD1E0, 0x71D5}, //{0xE7, 0x87, 0x95}, // Ñà
- {0xD4EF, 0x71E5}, //{0xE7, 0x87, 0xA5}, // Ôï
- {0xB1AC, 0x7206}, //{0xE7, 0x88, 0x86}, // ±¬
+ {0xC1C7, 0x71CE}, //{0xE7, 0x87, 0x8E}, // ��
+ {0xD1E0, 0x71D5}, //{0xE7, 0x87, 0x95}, // ��
+ {0xD4EF, 0x71E5}, //{0xE7, 0x87, 0xA5}, // ��
+ {0xB1AC, 0x7206}, //{0xE7, 0x88, 0x86}, // ��
{0xD7A6, 0x722A}, //{0xE7, 0x88, 0xAA}, // צ
- {0xC5C0, 0x722C}, //{0xE7, 0x88, 0xAC}, // ÅÀ
- {0xB0AE, 0x7231}, //{0xE7, 0x88, 0xB1}, // °®
- {0xBEF4, 0x7235}, //{0xE7, 0x88, 0xB5}, // ¾ô
- {0xB8B8, 0x7236}, //{0xE7, 0x88, 0xB6}, // ¸¸
+ {0xC5C0, 0x722C}, //{0xE7, 0x88, 0xAC}, // ��
+ {0xB0AE, 0x7231}, //{0xE7, 0x88, 0xB1}, // ��
+ {0xBEF4, 0x7235}, //{0xE7, 0x88, 0xB5}, // ��
+ {0xB8B8, 0x7236}, //{0xE7, 0x88, 0xB6}, // ��
{0xD2AF, 0x7237}, //{0xE7, 0x88, 0xB7}, // Ò¯
- {0xB0D6, 0x7238}, //{0xE7, 0x88, 0xB8}, // °Ö
- {0xB5F9, 0x7239}, //{0xE7, 0x88, 0xB9}, // µù
+ {0xB0D6, 0x7238}, //{0xE7, 0x88, 0xB8}, // ��
+ {0xB5F9, 0x7239}, //{0xE7, 0x88, 0xB9}, // ��
{0xCBAC, 0x723D}, //{0xE7, 0x88, 0xBD}, // ˬ
{0xC6AC, 0x7247}, //{0xE7, 0x89, 0x87}, // Ƭ
- {0xB0E6, 0x7248}, //{0xE7, 0x89, 0x88}, // °æ
- {0xC5C6, 0x724C}, //{0xE7, 0x89, 0x8C}, // ÅÆ
- {0xEBB9, 0x724D}, //{0xE7, 0x89, 0x8D}, // ë¹
- {0xD1C0, 0x7259}, //{0xE7, 0x89, 0x99}, // ÑÀ
+ {0xB0E6, 0x7248}, //{0xE7, 0x89, 0x88}, // ��
+ {0xC5C6, 0x724C}, //{0xE7, 0x89, 0x8C}, // ��
+ {0xEBB9, 0x724D}, //{0xE7, 0x89, 0x8D}, // �
+ {0xD1C0, 0x7259}, //{0xE7, 0x89, 0x99}, // ��
{0xC5A3, 0x725B}, //{0xE7, 0x89, 0x9B}, // ţ
{0xC4B5, 0x7261}, //{0xE7, 0x89, 0xA1}, // ĵ
- {0xC0CE, 0x7262}, //{0xE7, 0x89, 0xA2}, // ÀÎ
- {0xC4C1, 0x7267}, //{0xE7, 0x89, 0xA7}, // ÄÁ
- {0xCEEF, 0x7269}, //{0xE7, 0x89, 0xA9}, // Îï
- {0xC9FC, 0x7272}, //{0xE7, 0x89, 0xB2}, // Éü
+ {0xC0CE, 0x7262}, //{0xE7, 0x89, 0xA2}, // ��
+ {0xC4C1, 0x7267}, //{0xE7, 0x89, 0xA7}, // ��
+ {0xCEEF, 0x7269}, //{0xE7, 0x89, 0xA9}, // ��
+ {0xC9FC, 0x7272}, //{0xE7, 0x89, 0xB2}, // ��
{0xC7A3, 0x7275}, //{0xE7, 0x89, 0xB5}, // ǣ
- {0xCCD8, 0x7279}, //{0xE7, 0x89, 0xB9}, // ÌØ
- {0xCEFE, 0x727A}, //{0xE7, 0x89, 0xBA}, // Îþ
+ {0xCCD8, 0x7279}, //{0xE7, 0x89, 0xB9}, // ��
+ {0xCEFE, 0x727A}, //{0xE7, 0x89, 0xBA}, // ��
{0xCFAC, 0x7280}, //{0xE7, 0x8A, 0x80}, // Ϭ
- {0xC0E7, 0x7281}, //{0xE7, 0x8A, 0x81}, // Àç
+ {0xC0E7, 0x7281}, //{0xE7, 0x8A, 0x81}, // ��
{0xC8AE, 0x72AC}, //{0xE7, 0x8A, 0xAC}, // È®
- {0xB7B8, 0x72AF}, //{0xE7, 0x8A, 0xAF}, // ·¸
+ {0xB7B8, 0x72AF}, //{0xE7, 0x8A, 0xAF}, // ��
{0xD7B4, 0x72B6}, //{0xE7, 0x8A, 0xB6}, // ×´
- {0xD3CC, 0x72B9}, //{0xE7, 0x8A, 0xB9}, // ÓÌ
- {0xBFF1, 0x72C2}, //{0xE7, 0x8B, 0x82}, // ¿ñ
- {0xB1B7, 0x72C8}, //{0xE7, 0x8B, 0x88}, // ±·
- {0xBAFC, 0x72D0}, //{0xE7, 0x8B, 0x90}, // ºü
- {0xB9B7, 0x72D7}, //{0xE7, 0x8B, 0x97}, // ¹·
- {0xC4FC, 0x72DE}, //{0xE7, 0x8B, 0x9E}, // Äü
- {0xBADD, 0x72E0}, //{0xE7, 0x8B, 0xA0}, // ºÝ
- {0xBDC6, 0x72E1}, //{0xE7, 0x8B, 0xA1}, // ½Æ
- {0xB6C0, 0x72EC}, //{0xE7, 0x8B, 0xAC}, // ¶À
- {0xCFC1, 0x72ED}, //{0xE7, 0x8B, 0xAD}, // ÏÁ
+ {0xD3CC, 0x72B9}, //{0xE7, 0x8A, 0xB9}, // ��
+ {0xBFF1, 0x72C2}, //{0xE7, 0x8B, 0x82}, // ��
+ {0xB1B7, 0x72C8}, //{0xE7, 0x8B, 0x88}, // ��
+ {0xBAFC, 0x72D0}, //{0xE7, 0x8B, 0x90}, // ��
+ {0xB9B7, 0x72D7}, //{0xE7, 0x8B, 0x97}, // ��
+ {0xC4FC, 0x72DE}, //{0xE7, 0x8B, 0x9E}, // ��
+ {0xBADD, 0x72E0}, //{0xE7, 0x8B, 0xA0}, // ��
+ {0xBDC6, 0x72E1}, //{0xE7, 0x8B, 0xA1}, // ��
+ {0xB6C0, 0x72EC}, //{0xE7, 0x8B, 0xAC}, // ��
+ {0xCFC1, 0x72ED}, //{0xE7, 0x8B, 0xAD}, // ��
{0xCAA8, 0x72EE}, //{0xE7, 0x8B, 0xAE}, // ʨ
- {0xD5F8, 0x72F0}, //{0xE7, 0x8B, 0xB0}, // Õø
- {0xD3FC, 0x72F1}, //{0xE7, 0x8B, 0xB1}, // Óü
- {0xC0EA, 0x72F8}, //{0xE7, 0x8B, 0xB8}, // Àê
- {0xC0C7, 0x72FC}, //{0xE7, 0x8B, 0xBC}, // ÀÇ
- {0xC1D4, 0x730E}, //{0xE7, 0x8C, 0x8E}, // ÁÔ
- {0xB2FE, 0x7316}, //{0xE7, 0x8C, 0x96}, // ²þ
- {0xC3CD, 0x731B}, //{0xE7, 0x8C, 0x9B}, // ÃÍ
- {0xB2C2, 0x731C}, //{0xE7, 0x8C, 0x9C}, // ²Â
- {0xD0C9, 0x7329}, //{0xE7, 0x8C, 0xA9}, // ÐÉ
- {0xD6ED, 0x732A}, //{0xE7, 0x8C, 0xAA}, // Öí
+ {0xD5F8, 0x72F0}, //{0xE7, 0x8B, 0xB0}, // ��
+ {0xD3FC, 0x72F1}, //{0xE7, 0x8B, 0xB1}, // ��
+ {0xC0EA, 0x72F8}, //{0xE7, 0x8B, 0xB8}, // ��
+ {0xC0C7, 0x72FC}, //{0xE7, 0x8B, 0xBC}, // ��
+ {0xC1D4, 0x730E}, //{0xE7, 0x8C, 0x8E}, // ��
+ {0xB2FE, 0x7316}, //{0xE7, 0x8C, 0x96}, // ��
+ {0xC3CD, 0x731B}, //{0xE7, 0x8C, 0x9B}, // ��
+ {0xB2C2, 0x731C}, //{0xE7, 0x8C, 0x9C}, // ��
+ {0xD0C9, 0x7329}, //{0xE7, 0x8C, 0xA9}, // ��
+ {0xD6ED, 0x732A}, //{0xE7, 0x8C, 0xAA}, // ��
{0xC3A8, 0x732B}, //{0xE7, 0x8C, 0xAB}, // è
- {0xE2AC, 0x732C}, //{0xE7, 0x8C, 0xAC}, // â¬
- {0xCFD7, 0x732E}, //{0xE7, 0x8C, 0xAE}, // Ï×
- {0xBAEF, 0x7334}, //{0xE7, 0x8C, 0xB4}, // ºï
- {0xBBAB, 0x733E}, //{0xE7, 0x8C, 0xBE}, // »«
+ {0xE2AC, 0x732C}, //{0xE7, 0x8C, 0xAC}, // �
+ {0xCFD7, 0x732E}, //{0xE7, 0x8C, 0xAE}, // ��
+ {0xBAEF, 0x7334}, //{0xE7, 0x8C, 0xB4}, // ��
+ {0xBBAB, 0x733E}, //{0xE7, 0x8C, 0xBE}, // ��
{0xD4B3, 0x733F}, //{0xE7, 0x8C, 0xBF}, // Ô³
- {0xD0FE, 0x7384}, //{0xE7, 0x8E, 0x84}, // Ðþ
- {0xC2CA, 0x7387}, //{0xE7, 0x8E, 0x87}, // ÂÊ
- {0xD3F1, 0x7389}, //{0xE7, 0x8E, 0x89}, // Óñ
- {0xCDF5, 0x738B}, //{0xE7, 0x8E, 0x8B}, // Íõ
- {0xBEC1, 0x7396}, //{0xE7, 0x8E, 0x96}, // ¾Á
- {0xC2EA, 0x739B}, //{0xE7, 0x8E, 0x9B}, // Âê
- {0xCDE6, 0x73A9}, //{0xE7, 0x8E, 0xA9}, // Íæ
+ {0xD0FE, 0x7384}, //{0xE7, 0x8E, 0x84}, // ��
+ {0xC2CA, 0x7387}, //{0xE7, 0x8E, 0x87}, // ��
+ {0xD3F1, 0x7389}, //{0xE7, 0x8E, 0x89}, // ��
+ {0xCDF5, 0x738B}, //{0xE7, 0x8E, 0x8B}, // ��
+ {0xBEC1, 0x7396}, //{0xE7, 0x8E, 0x96}, // ��
+ {0xC2EA, 0x739B}, //{0xE7, 0x8E, 0x9B}, // ��
+ {0xCDE6, 0x73A9}, //{0xE7, 0x8E, 0xA9}, // ��
{0xC3B5, 0x73AB}, //{0xE7, 0x8E, 0xAB}, // õ
- {0xBBB7, 0x73AF}, //{0xE7, 0x8E, 0xAF}, // »·
- {0xCFD6, 0x73B0}, //{0xE7, 0x8E, 0xB0}, // ÏÖ
- {0xC1E1, 0x73B2}, //{0xE7, 0x8E, 0xB2}, // Áá
- {0xE7E8, 0x73B7}, //{0xE7, 0x8E, 0xB7}, // çè
- {0xB2A3, 0x73BB}, //{0xE7, 0x8E, 0xBB}, // ²£
+ {0xBBB7, 0x73AF}, //{0xE7, 0x8E, 0xAF}, // ��
+ {0xCFD6, 0x73B0}, //{0xE7, 0x8E, 0xB0}, // ��
+ {0xC1E1, 0x73B2}, //{0xE7, 0x8E, 0xB2}, // ��
+ {0xE7E8, 0x73B7}, //{0xE7, 0x8E, 0xB7}, // ��
+ {0xB2A3, 0x73BB}, //{0xE7, 0x8E, 0xBB}, // ��
{0xC9BA, 0x73CA}, //{0xE7, 0x8F, 0x8A}, // ɺ
- {0xD5E4, 0x73CD}, //{0xE7, 0x8F, 0x8D}, // Õä
- {0xD6E9, 0x73E0}, //{0xE7, 0x8F, 0xA0}, // Öé
- {0xB0E0, 0x73ED}, //{0xE7, 0x8F, 0xAD}, // °à
- {0xC7F2, 0x7403}, //{0xE7, 0x90, 0x83}, // Çò
- {0xC0C5, 0x7405}, //{0xE7, 0x90, 0x85}, // ÀÅ
- {0xC0ED, 0x7406}, //{0xE7, 0x90, 0x86}, // Àí
- {0xC1F0, 0x7409}, //{0xE7, 0x90, 0x89}, // Áð
- {0xCBF6, 0x7410}, //{0xE7, 0x90, 0x90}, // Ëö
- {0xD7C1, 0x7422}, //{0xE7, 0x90, 0xA2}, // ×Á
- {0xC1D5, 0x7433}, //{0xE7, 0x90, 0xB3}, // ÁÕ
- {0xC7D9, 0x7434}, //{0xE7, 0x90, 0xB4}, // ÇÙ
- {0xC7ED, 0x743C}, //{0xE7, 0x90, 0xBC}, // Çí
- {0xC8F0, 0x745E}, //{0xE7, 0x91, 0x9E}, // Èð
+ {0xD5E4, 0x73CD}, //{0xE7, 0x8F, 0x8D}, // ��
+ {0xD6E9, 0x73E0}, //{0xE7, 0x8F, 0xA0}, // ��
+ {0xB0E0, 0x73ED}, //{0xE7, 0x8F, 0xAD}, // ��
+ {0xC7F2, 0x7403}, //{0xE7, 0x90, 0x83}, // ��
+ {0xC0C5, 0x7405}, //{0xE7, 0x90, 0x85}, // ��
+ {0xC0ED, 0x7406}, //{0xE7, 0x90, 0x86}, // ��
+ {0xC1F0, 0x7409}, //{0xE7, 0x90, 0x89}, // ��
+ {0xCBF6, 0x7410}, //{0xE7, 0x90, 0x90}, // ��
+ {0xD7C1, 0x7422}, //{0xE7, 0x90, 0xA2}, // ��
+ {0xC1D5, 0x7433}, //{0xE7, 0x90, 0xB3}, // ��
+ {0xC7D9, 0x7434}, //{0xE7, 0x90, 0xB4}, // ��
+ {0xC7ED, 0x743C}, //{0xE7, 0x90, 0xBC}, // ��
+ {0xC8F0, 0x745E}, //{0xE7, 0x91, 0x9E}, // ��
{0xC9AA, 0x745F}, //{0xE7, 0x91, 0x9F}, // ɪ
- {0xB9E5, 0x7470}, //{0xE7, 0x91, 0xB0}, // ¹å
- {0xC1A7, 0x7483}, //{0xE7, 0x92, 0x83}, // Á§
- {0xE8B5, 0x74A7}, //{0xE7, 0x92, 0xA7}, // èµ
- {0xB9CF, 0x74DC}, //{0xE7, 0x93, 0x9C}, // ¹Ï
+ {0xB9E5, 0x7470}, //{0xE7, 0x91, 0xB0}, // ��
+ {0xC1A7, 0x7483}, //{0xE7, 0x92, 0x83}, // ��
+ {0xE8B5, 0x74A7}, //{0xE7, 0x92, 0xA7}, // �
+ {0xB9CF, 0x74DC}, //{0xE7, 0x93, 0x9C}, // ��
{0xC6B0, 0x74E2}, //{0xE7, 0x93, 0xA2}, // ư
- {0xB0EA, 0x74E3}, //{0xE7, 0x93, 0xA3}, // °ê
+ {0xB0EA, 0x74E3}, //{0xE7, 0x93, 0xA3}, // ��
{0xC8BF, 0x74E4}, //{0xE7, 0x93, 0xA4}, // È¿
- {0xCDDF, 0x74E6}, //{0xE7, 0x93, 0xA6}, // Íß
- {0xCECD, 0x74EE}, //{0xE7, 0x93, 0xAE}, // ÎÍ
+ {0xCDDF, 0x74E6}, //{0xE7, 0x93, 0xA6}, // ��
+ {0xCECD, 0x74EE}, //{0xE7, 0x93, 0xAE}, // ��
{0xC6BF, 0x74F6}, //{0xE7, 0x93, 0xB6}, // Æ¿
- {0xB4C9, 0x74F7}, //{0xE7, 0x93, 0xB7}, // ´É
- {0xB8CA, 0x7518}, //{0xE7, 0x94, 0x98}, // ¸Ê
- {0xC9F5, 0x751A}, //{0xE7, 0x94, 0x9A}, // Éõ
- {0xCCF0, 0x751C}, //{0xE7, 0x94, 0x9C}, // Ìð
- {0xC9FA, 0x751F}, //{0xE7, 0x94, 0x9F}, // Éú
- {0xC9FB, 0x7525}, //{0xE7, 0x94, 0xA5}, // Éû
- {0xD3C3, 0x7528}, //{0xE7, 0x94, 0xA8}, // ÓÃ
+ {0xB4C9, 0x74F7}, //{0xE7, 0x93, 0xB7}, // ��
+ {0xB8CA, 0x7518}, //{0xE7, 0x94, 0x98}, // ��
+ {0xC9F5, 0x751A}, //{0xE7, 0x94, 0x9A}, // ��
+ {0xCCF0, 0x751C}, //{0xE7, 0x94, 0x9C}, // ��
+ {0xC9FA, 0x751F}, //{0xE7, 0x94, 0x9F}, // ��
+ {0xC9FB, 0x7525}, //{0xE7, 0x94, 0xA5}, // ��
+ {0xD3C3, 0x7528}, //{0xE7, 0x94, 0xA8}, // ��
{0xCBA6, 0x7529}, //{0xE7, 0x94, 0xA9}, // ˦
- {0xB8A6, 0x752B}, //{0xE7, 0x94, 0xAB}, // ¸¦
- {0xCCEF, 0x7530}, //{0xE7, 0x94, 0xB0}, // Ìï
- {0xD3C9, 0x7531}, //{0xE7, 0x94, 0xB1}, // ÓÉ
- {0xBCD7, 0x7532}, //{0xE7, 0x94, 0xB2}, // ¼×
- {0xC9EA, 0x7533}, //{0xE7, 0x94, 0xB3}, // Éê
- {0xB5E7, 0x7535}, //{0xE7, 0x94, 0xB5}, // µç
- {0xC4D0, 0x7537}, //{0xE7, 0x94, 0xB7}, // ÄÐ
- {0xB5E9, 0x7538}, //{0xE7, 0x94, 0xB8}, // µé
- {0xBBAD, 0x753B}, //{0xE7, 0x94, 0xBB}, // »
- {0xB3A9, 0x7545}, //{0xE7, 0x95, 0x85}, // ³©
- {0xBDE7, 0x754C}, //{0xE7, 0x95, 0x8C}, // ½ç
+ {0xB8A6, 0x752B}, //{0xE7, 0x94, 0xAB}, // ��
+ {0xCCEF, 0x7530}, //{0xE7, 0x94, 0xB0}, // ��
+ {0xD3C9, 0x7531}, //{0xE7, 0x94, 0xB1}, // ��
+ {0xBCD7, 0x7532}, //{0xE7, 0x94, 0xB2}, // ��
+ {0xC9EA, 0x7533}, //{0xE7, 0x94, 0xB3}, // ��
+ {0xB5E7, 0x7535}, //{0xE7, 0x94, 0xB5}, // ��
+ {0xC4D0, 0x7537}, //{0xE7, 0x94, 0xB7}, // ��
+ {0xB5E9, 0x7538}, //{0xE7, 0x94, 0xB8}, // ��
+ {0xBBAD, 0x753B}, //{0xE7, 0x94, 0xBB}, // ��
+ {0xB3A9, 0x7545}, //{0xE7, 0x95, 0x85}, // ��
+ {0xBDE7, 0x754C}, //{0xE7, 0x95, 0x8C}, // ��
{0xCEB7, 0x754F}, //{0xE7, 0x95, 0x8F}, // η
- {0xC5CF, 0x7554}, //{0xE7, 0x95, 0x94}, // ÅÏ
- {0xC1F4, 0x7559}, //{0xE7, 0x95, 0x99}, // Áô
- {0xD0F3, 0x755C}, //{0xE7, 0x95, 0x9C}, // Ðó
- {0xC2D4, 0x7565}, //{0xE7, 0x95, 0xA5}, // ÂÔ
- {0xC6E8, 0x7566}, //{0xE7, 0x95, 0xA6}, // Æè
- {0xB7AC, 0x756A}, //{0xE7, 0x95, 0xAA}, // ·¬
- {0xB3EB, 0x7574}, //{0xE7, 0x95, 0xB4}, // ³ë
- {0xBBFB, 0x7578}, //{0xE7, 0x95, 0xB8}, // »û
- {0xBDAE, 0x7586}, //{0xE7, 0x96, 0x86}, // ½®
- {0xCAE8, 0x758F}, //{0xE7, 0x96, 0x8F}, // Êè
- {0xD2C9, 0x7591}, //{0xE7, 0x96, 0x91}, // ÒÉ
- {0xC1C6, 0x7597}, //{0xE7, 0x96, 0x97}, // ÁÆ
- {0xB8ED, 0x7599}, //{0xE7, 0x96, 0x99}, // ¸í
- {0xBECE, 0x759A}, //{0xE7, 0x96, 0x9A}, // ¾Î
+ {0xC5CF, 0x7554}, //{0xE7, 0x95, 0x94}, // ��
+ {0xC1F4, 0x7559}, //{0xE7, 0x95, 0x99}, // ��
+ {0xD0F3, 0x755C}, //{0xE7, 0x95, 0x9C}, // ��
+ {0xC2D4, 0x7565}, //{0xE7, 0x95, 0xA5}, // ��
+ {0xC6E8, 0x7566}, //{0xE7, 0x95, 0xA6}, // ��
+ {0xB7AC, 0x756A}, //{0xE7, 0x95, 0xAA}, // ��
+ {0xB3EB, 0x7574}, //{0xE7, 0x95, 0xB4}, // ��
+ {0xBBFB, 0x7578}, //{0xE7, 0x95, 0xB8}, // ��
+ {0xBDAE, 0x7586}, //{0xE7, 0x96, 0x86}, // ��
+ {0xCAE8, 0x758F}, //{0xE7, 0x96, 0x8F}, // ��
+ {0xD2C9, 0x7591}, //{0xE7, 0x96, 0x91}, // ��
+ {0xC1C6, 0x7597}, //{0xE7, 0x96, 0x97}, // ��
+ {0xB8ED, 0x7599}, //{0xE7, 0x96, 0x99}, // ��
+ {0xBECE, 0x759A}, //{0xE7, 0x96, 0x9A}, // ��
{0xC5B1, 0x759F}, //{0xE7, 0x96, 0x9F}, // ű
- {0xB0CC, 0x75A4}, //{0xE7, 0x96, 0xA4}, // °Ì
- {0xD2DF, 0x75AB}, //{0xE7, 0x96, 0xAB}, // Òß
- {0xB4AF, 0x75AE}, //{0xE7, 0x96, 0xAE}, // ´¯
- {0xB7E8, 0x75AF}, //{0xE7, 0x96, 0xAF}, // ·è
+ {0xB0CC, 0x75A4}, //{0xE7, 0x96, 0xA4}, // ��
+ {0xD2DF, 0x75AB}, //{0xE7, 0x96, 0xAB}, // ��
+ {0xB4AF, 0x75AE}, //{0xE7, 0x96, 0xAE}, // ��
+ {0xB7E8, 0x75AF}, //{0xE7, 0x96, 0xAF}, // ��
{0xC6A3, 0x75B2}, //{0xE7, 0x96, 0xB2}, // ƣ
- {0xD5EE, 0x75B9}, //{0xE7, 0x96, 0xB9}, // Õî
- {0xCCDB, 0x75BC}, //{0xE7, 0x96, 0xBC}, // ÌÛ
- {0xBCB2, 0x75BE}, //{0xE7, 0x96, 0xBE}, // ¼²
- {0xB2A1, 0x75C5}, //{0xE7, 0x97, 0x85}, // ²¡
+ {0xD5EE, 0x75B9}, //{0xE7, 0x96, 0xB9}, // ��
+ {0xCCDB, 0x75BC}, //{0xE7, 0x96, 0xBC}, // ��
+ {0xBCB2, 0x75BE}, //{0xE7, 0x96, 0xBE}, // ��
+ {0xB2A1, 0x75C5}, //{0xE7, 0x97, 0x85}, // ��
{0xD6A2, 0x75C7}, //{0xE7, 0x97, 0x87}, // Ö¢
{0xC8AC, 0x75CA}, //{0xE7, 0x97, 0x8A}, // Ȭ
- {0xD1F7, 0x75D2}, //{0xE7, 0x97, 0x92}, // Ñ÷
- {0xBADB, 0x75D5}, //{0xE7, 0x97, 0x95}, // ºÛ
- {0xB6BB, 0x75D8}, //{0xE7, 0x97, 0x98}, // ¶»
+ {0xD1F7, 0x75D2}, //{0xE7, 0x97, 0x92}, // ��
+ {0xBADB, 0x75D5}, //{0xE7, 0x97, 0x95}, // ��
+ {0xB6BB, 0x75D8}, //{0xE7, 0x97, 0x98}, // ��
{0xCDB4, 0x75DB}, //{0xE7, 0x97, 0x9B}, // Í´
- {0xC1A1, 0x75E2}, //{0xE7, 0x97, 0xA2}, // Á¡
- {0xBBBE, 0x75EA}, //{0xE7, 0x97, 0xAA}, // »¾
+ {0xC1A1, 0x75E2}, //{0xE7, 0x97, 0xA2}, // a
+ {0xBBBE, 0x75EA}, //{0xE7, 0x97, 0xAA}, // ��
{0xCCB5, 0x75F0}, //{0xE7, 0x97, 0xB0}, // ̵
- {0xB3D5, 0x75F4}, //{0xE7, 0x97, 0xB4}, // ³Õ
- {0xB1D4, 0x75F9}, //{0xE7, 0x97, 0xB9}, // ±Ô
- {0xCEC1, 0x761F}, //{0xE7, 0x98, 0x9F}, // ÎÁ
- {0xC1F6, 0x7624}, //{0xE7, 0x98, 0xA4}, // Áö
- {0xCADD, 0x7626}, //{0xE7, 0x98, 0xA6}, // ÊÝ
- {0xB4F1, 0x7629}, //{0xE7, 0x98, 0xA9}, // ´ñ
- {0xB1F1, 0x762A}, //{0xE7, 0x98, 0xAA}, // ±ñ
+ {0xB3D5, 0x75F4}, //{0xE7, 0x97, 0xB4}, // ��
+ {0xB1D4, 0x75F9}, //{0xE7, 0x97, 0xB9}, // ��
+ {0xCEC1, 0x761F}, //{0xE7, 0x98, 0x9F}, // ��
+ {0xC1F6, 0x7624}, //{0xE7, 0x98, 0xA4}, // ��
+ {0xCADD, 0x7626}, //{0xE7, 0x98, 0xA6}, // ��
+ {0xB4F1, 0x7629}, //{0xE7, 0x98, 0xA9}, // ��
+ {0xB1F1, 0x762A}, //{0xE7, 0x98, 0xAA}, // ��
{0xCCB1, 0x762B}, //{0xE7, 0x98, 0xAB}, // ̱
{0xC8B3, 0x7638}, //{0xE7, 0x98, 0xB8}, // ȳ
- {0xF1AB, 0x763E}, //{0xE7, 0x98, 0xBE}, // ñ«
- {0xB0A9, 0x764C}, //{0xE7, 0x99, 0x8C}, // °©
- {0xF1AE, 0x765E}, //{0xE7, 0x99, 0x9E}, // ñ®
+ {0xF1AB, 0x763E}, //{0xE7, 0x98, 0xBE}, // �
+ {0xB0A9, 0x764C}, //{0xE7, 0x99, 0x8C}, // ��
+ {0xF1AE, 0x765E}, //{0xE7, 0x99, 0x9E}, // �
{0xD1A2, 0x7663}, //{0xE7, 0x99, 0xA3}, // Ѣ
- {0xB5C7, 0x767B}, //{0xE7, 0x99, 0xBB}, // µÇ
- {0xB0D7, 0x767D}, //{0xE7, 0x99, 0xBD}, // °×
- {0xB0D9, 0x767E}, //{0xE7, 0x99, 0xBE}, // °Ù
- {0xD4ED, 0x7682}, //{0xE7, 0x9A, 0x82}, // Ôí
- {0xB5C4, 0x7684}, //{0xE7, 0x9A, 0x84}, // µÄ
- {0xBDD4, 0x7686}, //{0xE7, 0x9A, 0x86}, // ½Ô
- {0xBBCA, 0x7687}, //{0xE7, 0x9A, 0x87}, // »Ê
+ {0xB5C7, 0x767B}, //{0xE7, 0x99, 0xBB}, // ��
+ {0xB0D7, 0x767D}, //{0xE7, 0x99, 0xBD}, // ��
+ {0xB0D9, 0x767E}, //{0xE7, 0x99, 0xBE}, // ��
+ {0xD4ED, 0x7682}, //{0xE7, 0x9A, 0x82}, // ��
+ {0xB5C4, 0x7684}, //{0xE7, 0x9A, 0x84}, // ��
+ {0xBDD4, 0x7686}, //{0xE7, 0x9A, 0x86}, // ��
+ {0xBBCA, 0x7687}, //{0xE7, 0x9A, 0x87}, // ��
{0xC6A4, 0x76AE}, //{0xE7, 0x9A, 0xAE}, // Ƥ
- {0xD6E5, 0x76B1}, //{0xE7, 0x9A, 0xB1}, // Öå
- {0xC3F3, 0x76BF}, //{0xE7, 0x9A, 0xBF}, // Ãó
- {0xD6D1, 0x76C5}, //{0xE7, 0x9B, 0x85}, // ÖÑ
- {0xC5E8, 0x76C6}, //{0xE7, 0x9B, 0x86}, // Åè
+ {0xD6E5, 0x76B1}, //{0xE7, 0x9A, 0xB1}, // ��
+ {0xC3F3, 0x76BF}, //{0xE7, 0x9A, 0xBF}, // ��
+ {0xD6D1, 0x76C5}, //{0xE7, 0x9B, 0x85}, // ��
+ {0xC5E8, 0x76C6}, //{0xE7, 0x9B, 0x86}, // ��
{0xD3AF, 0x76C8}, //{0xE7, 0x9B, 0x88}, // Ó¯
- {0xD2E6, 0x76CA}, //{0xE7, 0x9B, 0x8A}, // Òæ
+ {0xD2E6, 0x76CA}, //{0xE7, 0x9B, 0x8A}, // ��
{0xD5B5, 0x76CF}, //{0xE7, 0x9B, 0x8F}, // Õµ
- {0xD1CE, 0x76D0}, //{0xE7, 0x9B, 0x90}, // ÑÎ
- {0xBCE0, 0x76D1}, //{0xE7, 0x9B, 0x91}, // ¼à
- {0xBAD0, 0x76D2}, //{0xE7, 0x9B, 0x92}, // ºÐ
- {0xBFF8, 0x76D4}, //{0xE7, 0x9B, 0x94}, // ¿ø
- {0xB8C7, 0x76D6}, //{0xE7, 0x9B, 0x96}, // ¸Ç
- {0xB5C1, 0x76D7}, //{0xE7, 0x9B, 0x97}, // µÁ
- {0xC5CC, 0x76D8}, //{0xE7, 0x9B, 0x98}, // ÅÌ
+ {0xD1CE, 0x76D0}, //{0xE7, 0x9B, 0x90}, // ��
+ {0xBCE0, 0x76D1}, //{0xE7, 0x9B, 0x91}, // ��
+ {0xBAD0, 0x76D2}, //{0xE7, 0x9B, 0x92}, // ��
+ {0xBFF8, 0x76D4}, //{0xE7, 0x9B, 0x94}, // ��
+ {0xB8C7, 0x76D6}, //{0xE7, 0x9B, 0x96}, // ��
+ {0xB5C1, 0x76D7}, //{0xE7, 0x9B, 0x97}, // ��
+ {0xC5CC, 0x76D8}, //{0xE7, 0x9B, 0x98}, // ��
{0xCAA2, 0x76DB}, //{0xE7, 0x9B, 0x9B}, // ʢ
- {0xC3CB, 0x76DF}, //{0xE7, 0x9B, 0x9F}, // ÃË
+ {0xC3CB, 0x76DF}, //{0xE7, 0x9B, 0x9F}, // ��
{0xC4BF, 0x76EE}, //{0xE7, 0x9B, 0xAE}, // Ä¿
- {0xB6A2, 0x76EF}, //{0xE7, 0x9B, 0xAF}, // ¶¢
+ {0xB6A2, 0x76EF}, //{0xE7, 0x9B, 0xAF}, // ��
{0xC3A4, 0x76F2}, //{0xE7, 0x9B, 0xB2}, // ä
{0xD6B1, 0x76F4}, //{0xE7, 0x9B, 0xB4}, // Ö±
- {0xCFE0, 0x76F8}, //{0xE7, 0x9B, 0xB8}, // Ïà
- {0xEDEF, 0x76F9}, //{0xE7, 0x9B, 0xB9}, // íï
- {0xC5CE, 0x76FC}, //{0xE7, 0x9B, 0xBC}, // ÅÎ
- {0xB6DC, 0x76FE}, //{0xE7, 0x9B, 0xBE}, // ¶Ü
+ {0xCFE0, 0x76F8}, //{0xE7, 0x9B, 0xB8}, // ��
+ {0xEDEF, 0x76F9}, //{0xE7, 0x9B, 0xB9}, // ��
+ {0xC5CE, 0x76FC}, //{0xE7, 0x9B, 0xBC}, // ��
+ {0xB6DC, 0x76FE}, //{0xE7, 0x9B, 0xBE}, // ��
{0xCAA1, 0x7701}, //{0xE7, 0x9C, 0x81}, // Ê¡
{0xC3BC, 0x7709}, //{0xE7, 0x9C, 0x89}, // ü
- {0xBFB4, 0x770B}, //{0xE7, 0x9C, 0x8B}, // ¿´
- {0xD5E6, 0x771F}, //{0xE7, 0x9C, 0x9F}, // Õæ
- {0xC3DF, 0x7720}, //{0xE7, 0x9C, 0xA0}, // Ãß
+ {0xBFB4, 0x770B}, //{0xE7, 0x9C, 0x8B}, // ��
+ {0xD5E6, 0x771F}, //{0xE7, 0x9C, 0x9F}, // ��
+ {0xC3DF, 0x7720}, //{0xE7, 0x9C, 0xA0}, // ��
{0xD5A3, 0x7728}, //{0xE7, 0x9C, 0xA8}, // Õ£
- {0xC3D0, 0x772F}, //{0xE7, 0x9C, 0xAF}, // ÃÐ
- {0xBFF4, 0x7736}, //{0xE7, 0x9C, 0xB6}, // ¿ô
- {0xBEEC, 0x7737}, //{0xE7, 0x9C, 0xB7}, // ¾ì
- {0xD1DB, 0x773C}, //{0xE7, 0x9C, 0xBC}, // ÑÛ
- {0xD7C5, 0x7740}, //{0xE7, 0x9D, 0x80}, // ×Å
- {0xD5F6, 0x7741}, //{0xE7, 0x9D, 0x81}, // Õö
- {0xBEA6, 0x775B}, //{0xE7, 0x9D, 0x9B}, // ¾¦
+ {0xC3D0, 0x772F}, //{0xE7, 0x9C, 0xAF}, // ��
+ {0xBFF4, 0x7736}, //{0xE7, 0x9C, 0xB6}, // ��
+ {0xBEEC, 0x7737}, //{0xE7, 0x9C, 0xB7}, // ��
+ {0xD1DB, 0x773C}, //{0xE7, 0x9C, 0xBC}, // ��
+ {0xD7C5, 0x7740}, //{0xE7, 0x9D, 0x80}, // ��
+ {0xD5F6, 0x7741}, //{0xE7, 0x9D, 0x81}, // ��
+ {0xBEA6, 0x775B}, //{0xE7, 0x9D, 0x9B}, // ��
{0xCBAF, 0x7761}, //{0xE7, 0x9D, 0xA1}, // ˯
- {0xB6BD, 0x7763}, //{0xE7, 0x9D, 0xA3}, // ¶½
- {0xC4C0, 0x7766}, //{0xE7, 0x9D, 0xA6}, // ÄÀ
- {0xB2C7, 0x776C}, //{0xE7, 0x9D, 0xAC}, // ²Ç
- {0xB6C3, 0x7779}, //{0xE7, 0x9D, 0xB9}, // ¶Ã
- {0xC3E9, 0x7784}, //{0xE7, 0x9E, 0x84}, // Ãé
+ {0xB6BD, 0x7763}, //{0xE7, 0x9D, 0xA3}, // ��
+ {0xC4C0, 0x7766}, //{0xE7, 0x9D, 0xA6}, // ��
+ {0xB2C7, 0x776C}, //{0xE7, 0x9D, 0xAC}, // ��
+ {0xB6C3, 0x7779}, //{0xE7, 0x9D, 0xB9}, // ��
+ {0xC3E9, 0x7784}, //{0xE7, 0x9E, 0x84}, // ��
{0xCFB9, 0x778E}, //{0xE7, 0x9E, 0x8E}, // Ϲ
- {0xC2F7, 0x7792}, //{0xE7, 0x9E, 0x92}, // Â÷
- {0xC7C6, 0x77A7}, //{0xE7, 0x9E, 0xA7}, // ÇÆ
- {0xB5C9, 0x77AA}, //{0xE7, 0x9E, 0xAA}, // µÉ
+ {0xC2F7, 0x7792}, //{0xE7, 0x9E, 0x92}, // ��
+ {0xC7C6, 0x77A7}, //{0xE7, 0x9E, 0xA7}, // ��
+ {0xB5C9, 0x77AA}, //{0xE7, 0x9E, 0xAA}, // ��
{0xCBB2, 0x77AC}, //{0xE7, 0x9E, 0xAC}, // ˲
{0xCDAB, 0x77B3}, //{0xE7, 0x9E, 0xB3}, // Í«
{0xD5B0, 0x77BB}, //{0xE7, 0x9E, 0xBB}, // Õ°
- {0xB4A3, 0x77D7}, //{0xE7, 0x9F, 0x97}, // ´£
+ {0xB4A3, 0x77D7}, //{0xE7, 0x9F, 0x97}, // ��
{0xC3AC, 0x77DB}, //{0xE7, 0x9F, 0x9B}, // ì
{0xCAB8, 0x77E2}, //{0xE7, 0x9F, 0xA2}, // ʸ
{0xD6AA, 0x77E5}, //{0xE7, 0x9F, 0xA5}, // Öª
- {0xBED8, 0x77E9}, //{0xE7, 0x9F, 0xA9}, // ¾Ø
- {0xBDC3, 0x77EB}, //{0xE7, 0x9F, 0xAB}, // ½Ã
- {0xB6CC, 0x77ED}, //{0xE7, 0x9F, 0xAD}, // ¶Ì
- {0xB0AB, 0x77EE}, //{0xE7, 0x9F, 0xAE}, // °«
+ {0xBED8, 0x77E9}, //{0xE7, 0x9F, 0xA9}, // ��
+ {0xBDC3, 0x77EB}, //{0xE7, 0x9F, 0xAB}, // ��
+ {0xB6CC, 0x77ED}, //{0xE7, 0x9F, 0xAD}, // ��
+ {0xB0AB, 0x77EE}, //{0xE7, 0x9F, 0xAE}, // ��
{0xCAAF, 0x77F3}, //{0xE7, 0x9F, 0xB3}, // ʯ
- {0xB7AF, 0x77FE}, //{0xE7, 0x9F, 0xBE}, // ·¯
- {0xBFF3, 0x77FF}, //{0xE7, 0x9F, 0xBF}, // ¿ó
- {0xC2EB, 0x7801}, //{0xE7, 0xA0, 0x81}, // Âë
+ {0xB7AF, 0x77FE}, //{0xE7, 0x9F, 0xBE}, // ��
+ {0xBFF3, 0x77FF}, //{0xE7, 0x9F, 0xBF}, // ��
+ {0xC2EB, 0x7801}, //{0xE7, 0xA0, 0x81}, // ��
{0xC9B0, 0x7802}, //{0xE7, 0xA0, 0x82}, // ɰ
- {0xC6F6, 0x780C}, //{0xE7, 0xA0, 0x8C}, // Æö
- {0xBFB3, 0x780D}, //{0xE7, 0xA0, 0x8D}, // ¿³
- {0xD1D0, 0x7814}, //{0xE7, 0xA0, 0x94}, // ÑÐ
+ {0xC6F6, 0x780C}, //{0xE7, 0xA0, 0x8C}, // ��
+ {0xBFB3, 0x780D}, //{0xE7, 0xA0, 0x8D}, // ��
+ {0xD1D0, 0x7814}, //{0xE7, 0xA0, 0x94}, // ��
{0xD7A9, 0x7816}, //{0xE7, 0xA0, 0x96}, // ש
- {0xD1E2, 0x781A}, //{0xE7, 0xA0, 0x9A}, // Ñâ
- {0xC5E9, 0x7830}, //{0xE7, 0xA0, 0xB0}, // Åé
- {0xC6C6, 0x7834}, //{0xE7, 0xA0, 0xB4}, // ÆÆ
- {0xD4D2, 0x7838}, //{0xE7, 0xA0, 0xB8}, // ÔÒ
- {0xC0F9, 0x783E}, //{0xE7, 0xA0, 0xBE}, // Àù
- {0xB4A1, 0x7840}, //{0xE7, 0xA1, 0x80}, // ´¡
- {0xB9E8, 0x7845}, //{0xE7, 0xA1, 0x85}, // ¹è
+ {0xD1E2, 0x781A}, //{0xE7, 0xA0, 0x9A}, // ��
+ {0xC5E9, 0x7830}, //{0xE7, 0xA0, 0xB0}, // ��
+ {0xC6C6, 0x7834}, //{0xE7, 0xA0, 0xB4}, // ��
+ {0xD4D2, 0x7838}, //{0xE7, 0xA0, 0xB8}, // ��
+ {0xC0F9, 0x783E}, //{0xE7, 0xA0, 0xBE}, // ��
+ {0xB4A1, 0x7840}, //{0xE7, 0xA1, 0x80}, // ��
+ {0xB9E8, 0x7845}, //{0xE7, 0xA1, 0x85}, // ��
{0xCBB6, 0x7855}, //{0xE7, 0xA1, 0x95}, // ˶
- {0xCFF5, 0x785D}, //{0xE7, 0xA1, 0x9D}, // Ïõ
- {0xC1F2, 0x786B}, //{0xE7, 0xA1, 0xAB}, // Áò
+ {0xCFF5, 0x785D}, //{0xE7, 0xA1, 0x9D}, // ��
+ {0xC1F2, 0x786B}, //{0xE7, 0xA1, 0xAB}, // ��
{0xD3B2, 0x786C}, //{0xE7, 0xA1, 0xAC}, // Ó²
{0xC8B7, 0x786E}, //{0xE7, 0xA1, 0xAE}, // È·
- {0xC5F0, 0x787C}, //{0xE7, 0xA1, 0xBC}, // Åð
- {0xB5EF, 0x7889}, //{0xE7, 0xA2, 0x89}, // µï
+ {0xC5F0, 0x787C}, //{0xE7, 0xA1, 0xBC}, // ��
+ {0xB5EF, 0x7889}, //{0xE7, 0xA2, 0x89}, // ��
{0xC2B5, 0x788C}, //{0xE7, 0xA2, 0x8C}, // µ
- {0xB0AD, 0x788D}, //{0xE7, 0xA2, 0x8D}, // °
- {0xCBE9, 0x788E}, //{0xE7, 0xA2, 0x8E}, // Ëé
- {0xB1AE, 0x7891}, //{0xE7, 0xA2, 0x91}, // ±®
- {0xCDEB, 0x7897}, //{0xE7, 0xA2, 0x97}, // Íë
- {0xB5E2, 0x7898}, //{0xE7, 0xA2, 0x98}, // µâ
- {0xB5FA, 0x789F}, //{0xE7, 0xA2, 0x9F}, // µú
- {0xB1CC, 0x78A7}, //{0xE7, 0xA2, 0xA7}, // ±Ì
- {0xC5F6, 0x78B0}, //{0xE7, 0xA2, 0xB0}, // Åö
- {0xBCEE, 0x78B1}, //{0xE7, 0xA2, 0xB1}, // ¼î
+ {0xB0AD, 0x788D}, //{0xE7, 0xA2, 0x8D}, // ��
+ {0xCBE9, 0x788E}, //{0xE7, 0xA2, 0x8E}, // ��
+ {0xB1AE, 0x7891}, //{0xE7, 0xA2, 0x91}, // ��
+ {0xCDEB, 0x7897}, //{0xE7, 0xA2, 0x97}, // ��
+ {0xB5E2, 0x7898}, //{0xE7, 0xA2, 0x98}, // ��
+ {0xB5FA, 0x789F}, //{0xE7, 0xA2, 0x9F}, // ��
+ {0xB1CC, 0x78A7}, //{0xE7, 0xA2, 0xA7}, // ��
+ {0xC5F6, 0x78B0}, //{0xE7, 0xA2, 0xB0}, // ��
+ {0xBCEE, 0x78B1}, //{0xE7, 0xA2, 0xB1}, // ��
{0xCCBC, 0x78B3}, //{0xE7, 0xA2, 0xB3}, // ̼
- {0xB2EA, 0x78B4}, //{0xE7, 0xA2, 0xB4}, // ²ê
- {0xC4EB, 0x78BE}, //{0xE7, 0xA2, 0xBE}, // Äë
- {0xB4C5, 0x78C1}, //{0xE7, 0xA3, 0x81}, // ´Å
- {0xB0F5, 0x78C5}, //{0xE7, 0xA3, 0x85}, // °õ
- {0xBFC4, 0x78D5}, //{0xE7, 0xA3, 0x95}, // ¿Ä
+ {0xB2EA, 0x78B4}, //{0xE7, 0xA2, 0xB4}, // ��
+ {0xC4EB, 0x78BE}, //{0xE7, 0xA2, 0xBE}, // ��
+ {0xB4C5, 0x78C1}, //{0xE7, 0xA3, 0x81}, // ��
+ {0xB0F5, 0x78C5}, //{0xE7, 0xA3, 0x85}, // ��
+ {0xBFC4, 0x78D5}, //{0xE7, 0xA3, 0x95}, // ��
{0xC4A5, 0x78E8}, //{0xE7, 0xA3, 0xA8}, // ĥ
- {0xC1D7, 0x78F7}, //{0xE7, 0xA3, 0xB7}, // Á×
- {0xBBC7, 0x78FA}, //{0xE7, 0xA3, 0xBA}, // Ȃ
- {0xBDB8, 0x7901}, //{0xE7, 0xA4, 0x81}, // ½¸
+ {0xC1D7, 0x78F7}, //{0xE7, 0xA3, 0xB7}, // ��
+ {0xBBC7, 0x78FA}, //{0xE7, 0xA3, 0xBA}, // ��
+ {0xBDB8, 0x7901}, //{0xE7, 0xA4, 0x81}, // ��
{0xCABE, 0x793A}, //{0xE7, 0xA4, 0xBA}, // ʾ
- {0xC0F1, 0x793C}, //{0xE7, 0xA4, 0xBC}, // Àñ
- {0xC9E7, 0x793E}, //{0xE7, 0xA4, 0xBE}, // Éç
- {0xC6ED, 0x7948}, //{0xE7, 0xA5, 0x88}, // Æí
- {0xD7E6, 0x7956}, //{0xE7, 0xA5, 0x96}, // ׿
+ {0xC0F1, 0x793C}, //{0xE7, 0xA4, 0xBC}, // ��
+ {0xC9E7, 0x793E}, //{0xE7, 0xA4, 0xBE}, // ��
+ {0xC6ED, 0x7948}, //{0xE7, 0xA5, 0x88}, // ��
+ {0xD7E6, 0x7956}, //{0xE7, 0xA5, 0x96}, // ��
{0xD7A3, 0x795D}, //{0xE7, 0xA5, 0x9D}, // ×£
- {0xC9F1, 0x795E}, //{0xE7, 0xA5, 0x9E}, // Éñ
- {0xCBEE, 0x795F}, //{0xE7, 0xA5, 0x9F}, // Ëî
- {0xECF4, 0x7960}, //{0xE7, 0xA5, 0xA0}, // ìô
- {0xCFE9, 0x7965}, //{0xE7, 0xA5, 0xA5}, // Ïé
+ {0xC9F1, 0x795E}, //{0xE7, 0xA5, 0x9E}, // ��
+ {0xCBEE, 0x795F}, //{0xE7, 0xA5, 0x9F}, // ��
+ {0xECF4, 0x7960}, //{0xE7, 0xA5, 0xA0}, // ��
+ {0xCFE9, 0x7965}, //{0xE7, 0xA5, 0xA5}, // ��
{0xC6B1, 0x7968}, //{0xE7, 0xA5, 0xA8}, // Ʊ
- {0xBCC0, 0x796D}, //{0xE7, 0xA5, 0xAD}, // ¼À
- {0xB5BB, 0x7977}, //{0xE7, 0xA5, 0xB7}, // µ»
- {0xBBF6, 0x7978}, //{0xE7, 0xA5, 0xB8}, // »ö
- {0xD9F7, 0x7980}, //{0xE7, 0xA6, 0x80}, // Ù÷
- {0xBDFB, 0x7981}, //{0xE7, 0xA6, 0x81}, // ½û
- {0xB8A3, 0x798F}, //{0xE7, 0xA6, 0x8F}, // ¸£
- {0xC0EB, 0x79BB}, //{0xE7, 0xA6, 0xBB}, // Àë
- {0xC7DD, 0x79BD}, //{0xE7, 0xA6, 0xBD}, // ÇÝ
- {0xBACC, 0x79BE}, //{0xE7, 0xA6, 0xBE}, // ºÌ
- {0xD0E3, 0x79C0}, //{0xE7, 0xA7, 0x80}, // Ðã
+ {0xBCC0, 0x796D}, //{0xE7, 0xA5, 0xAD}, // ��
+ {0xB5BB, 0x7977}, //{0xE7, 0xA5, 0xB7}, // ��
+ {0xBBF6, 0x7978}, //{0xE7, 0xA5, 0xB8}, // ��
+ {0xD9F7, 0x7980}, //{0xE7, 0xA6, 0x80}, // ��
+ {0xBDFB, 0x7981}, //{0xE7, 0xA6, 0x81}, // ��
+ {0xB8A3, 0x798F}, //{0xE7, 0xA6, 0x8F}, // ��
+ {0xC0EB, 0x79BB}, //{0xE7, 0xA6, 0xBB}, // ��
+ {0xC7DD, 0x79BD}, //{0xE7, 0xA6, 0xBD}, // ��
+ {0xBACC, 0x79BE}, //{0xE7, 0xA6, 0xBE}, // ��
+ {0xD0E3, 0x79C0}, //{0xE7, 0xA7, 0x80}, // ��
{0xCBBD, 0x79C1}, //{0xE7, 0xA7, 0x81}, // ˽
{0xCDBA, 0x79C3}, //{0xE7, 0xA7, 0x83}, // ͺ
- {0xB8D1, 0x79C6}, //{0xE7, 0xA7, 0x86}, // ¸Ñ
- {0xB1FC, 0x79C9}, //{0xE7, 0xA7, 0x89}, // ±ü
- {0xC7EF, 0x79CB}, //{0xE7, 0xA7, 0x8B}, // Çï
- {0xD6D6, 0x79CD}, //{0xE7, 0xA7, 0x8D}, // ÖÖ
- {0xBFC6, 0x79D1}, //{0xE7, 0xA7, 0x91}, // ¿Æ
- {0xC3EB, 0x79D2}, //{0xE7, 0xA7, 0x92}, // Ãë
- {0xEFF5, 0x79D5}, //{0xE7, 0xA7, 0x95}, // ïõ
- {0xC3D8, 0x79D8}, //{0xE7, 0xA7, 0x98}, // ÃØ
- {0xD7E2, 0x79DF}, //{0xE7, 0xA7, 0x9F}, // ×â
- {0xB3D3, 0x79E4}, //{0xE7, 0xA7, 0xA4}, // ³Ó
- {0xC7D8, 0x79E6}, //{0xE7, 0xA7, 0xA6}, // ÇØ
- {0xD1ED, 0x79E7}, //{0xE7, 0xA7, 0xA7}, // Ñí
- {0xD6C8, 0x79E9}, //{0xE7, 0xA7, 0xA9}, // ÖÈ
- {0xEFF8, 0x79EB}, //{0xE7, 0xA7, 0xAB}, // ïø
- {0xBBFD, 0x79EF}, //{0xE7, 0xA7, 0xAF}, // »ý
- {0xB3C6, 0x79F0}, //{0xE7, 0xA7, 0xB0}, // ³Æ
- {0xBDD5, 0x79F8}, //{0xE7, 0xA7, 0xB8}, // ½Õ
- {0xD2C6, 0x79FB}, //{0xE7, 0xA7, 0xBB}, // ÒÆ
- {0xBBE0, 0x79FD}, //{0xE7, 0xA7, 0xBD}, // Ȉ
+ {0xB8D1, 0x79C6}, //{0xE7, 0xA7, 0x86}, // ��
+ {0xB1FC, 0x79C9}, //{0xE7, 0xA7, 0x89}, // ��
+ {0xC7EF, 0x79CB}, //{0xE7, 0xA7, 0x8B}, // ��
+ {0xD6D6, 0x79CD}, //{0xE7, 0xA7, 0x8D}, // ��
+ {0xBFC6, 0x79D1}, //{0xE7, 0xA7, 0x91}, // ��
+ {0xC3EB, 0x79D2}, //{0xE7, 0xA7, 0x92}, // ��
+ {0xEFF5, 0x79D5}, //{0xE7, 0xA7, 0x95}, // ��
+ {0xC3D8, 0x79D8}, //{0xE7, 0xA7, 0x98}, // ��
+ {0xD7E2, 0x79DF}, //{0xE7, 0xA7, 0x9F}, // ��
+ {0xB3D3, 0x79E4}, //{0xE7, 0xA7, 0xA4}, // ��
+ {0xC7D8, 0x79E6}, //{0xE7, 0xA7, 0xA6}, // ��
+ {0xD1ED, 0x79E7}, //{0xE7, 0xA7, 0xA7}, // ��
+ {0xD6C8, 0x79E9}, //{0xE7, 0xA7, 0xA9}, // ��
+ {0xEFF8, 0x79EB}, //{0xE7, 0xA7, 0xAB}, // ��
+ {0xBBFD, 0x79EF}, //{0xE7, 0xA7, 0xAF}, // ��
+ {0xB3C6, 0x79F0}, //{0xE7, 0xA7, 0xB0}, // ��
+ {0xBDD5, 0x79F8}, //{0xE7, 0xA7, 0xB8}, // ��
+ {0xD2C6, 0x79FB}, //{0xE7, 0xA7, 0xBB}, // ��
+ {0xBBE0, 0x79FD}, //{0xE7, 0xA7, 0xBD}, // ��
{0xCFA1, 0x7A00}, //{0xE7, 0xA8, 0x80}, // Ï¡
- {0xB3CC, 0x7A0B}, //{0xE7, 0xA8, 0x8B}, // ³Ì
- {0xC9D4, 0x7A0D}, //{0xE7, 0xA8, 0x8D}, // ÉÔ
+ {0xB3CC, 0x7A0B}, //{0xE7, 0xA8, 0x8B}, // ��
+ {0xC9D4, 0x7A0D}, //{0xE7, 0xA8, 0x8D}, // ��
{0xCBB0, 0x7A0E}, //{0xE7, 0xA8, 0x8E}, // ˰
- {0xD6C9, 0x7A1A}, //{0xE7, 0xA8, 0x9A}, // ÖÉ
- {0xB3ED, 0x7A20}, //{0xE7, 0xA8, 0xA0}, // ³í
- {0xCEC8, 0x7A33}, //{0xE7, 0xA8, 0xB3}, // ÎÈ
- {0xB5BE, 0x7A3B}, //{0xE7, 0xA8, 0xBB}, // µ¾
- {0xBCDA, 0x7A3C}, //{0xE7, 0xA8, 0xBC}, // ¼Ú
- {0xBBFC, 0x7A3D}, //{0xE7, 0xA8, 0xBD}, // ȟ
- {0xB8E5, 0x7A3F}, //{0xE7, 0xA8, 0xBF}, // ¸å
- {0xC4C2, 0x7A46}, //{0xE7, 0xA9, 0x86}, // ÄÂ
- {0xCBEB, 0x7A57}, //{0xE7, 0xA9, 0x97}, // Ëë
+ {0xD6C9, 0x7A1A}, //{0xE7, 0xA8, 0x9A}, // ��
+ {0xB3ED, 0x7A20}, //{0xE7, 0xA8, 0xA0}, // ��
+ {0xCEC8, 0x7A33}, //{0xE7, 0xA8, 0xB3}, // ��
+ {0xB5BE, 0x7A3B}, //{0xE7, 0xA8, 0xBB}, // ��
+ {0xBCDA, 0x7A3C}, //{0xE7, 0xA8, 0xBC}, // ��
+ {0xBBFC, 0x7A3D}, //{0xE7, 0xA8, 0xBD}, // ��
+ {0xB8E5, 0x7A3F}, //{0xE7, 0xA8, 0xBF}, // ��
+ {0xC4C2, 0x7A46}, //{0xE7, 0xA9, 0x86}, // ��
+ {0xCBEB, 0x7A57}, //{0xE7, 0xA9, 0x97}, // ��
{0xD1A8, 0x7A74}, //{0xE7, 0xA9, 0xB4}, // Ѩ
- {0xBEBF, 0x7A76}, //{0xE7, 0xA9, 0xB6}, // ¾¿
- {0xC7EE, 0x7A77}, //{0xE7, 0xA9, 0xB7}, // Çî
- {0xBFD5, 0x7A7A}, //{0xE7, 0xA9, 0xBA}, // ¿Õ
- {0xB4A9, 0x7A7F}, //{0xE7, 0xA9, 0xBF}, // ´©
+ {0xBEBF, 0x7A76}, //{0xE7, 0xA9, 0xB6}, // ��
+ {0xC7EE, 0x7A77}, //{0xE7, 0xA9, 0xB7}, // ��
+ {0xBFD5, 0x7A7A}, //{0xE7, 0xA9, 0xBA}, // ��
+ {0xB4A9, 0x7A7F}, //{0xE7, 0xA9, 0xBF}, // ��
{0xCDBB, 0x7A81}, //{0xE7, 0xAA, 0x81}, // Í»
- {0xC7D4, 0x7A83}, //{0xE7, 0xAA, 0x83}, // ÇÔ
+ {0xC7D4, 0x7A83}, //{0xE7, 0xAA, 0x83}, // ��
{0xD5AD, 0x7A84}, //{0xE7, 0xAA, 0x84}, // Õ
- {0xC7CF, 0x7A8D}, //{0xE7, 0xAA, 0x8D}, // ÇÏ
+ {0xC7CF, 0x7A8D}, //{0xE7, 0xAA, 0x8D}, // ��
{0xD2A4, 0x7A91}, //{0xE7, 0xAA, 0x91}, // Ò¤
- {0xD6CF, 0x7A92}, //{0xE7, 0xAA, 0x92}, // ÖÏ
- {0xBDD1, 0x7A96}, //{0xE7, 0xAA, 0x96}, // ½Ñ
- {0xB4B0, 0x7A97}, //{0xE7, 0xAA, 0x97}, // ´°
- {0xBEBD, 0x7A98}, //{0xE7, 0xAA, 0x98}, // ¾½
- {0xB4DC, 0x7A9C}, //{0xE7, 0xAA, 0x9C}, // ´Ü
- {0xCED1, 0x7A9D}, //{0xE7, 0xAA, 0x9D}, // ÎÑ
- {0xBFDF, 0x7A9F}, //{0xE7, 0xAA, 0x9F}, // ¿ß
- {0xBFFA, 0x7AA5}, //{0xE7, 0xAA, 0xA5}, // ¿ú
- {0xC1FE, 0x7ABF}, //{0xE7, 0xAA, 0xBF}, // Áþ
- {0xC1A2, 0x7ACB}, //{0xE7, 0xAB, 0x8B}, // Á¢
- {0xCAFA, 0x7AD6}, //{0xE7, 0xAB, 0x96}, // Êú
+ {0xD6CF, 0x7A92}, //{0xE7, 0xAA, 0x92}, // ��
+ {0xBDD1, 0x7A96}, //{0xE7, 0xAA, 0x96}, // ��
+ {0xB4B0, 0x7A97}, //{0xE7, 0xAA, 0x97}, // ��
+ {0xBEBD, 0x7A98}, //{0xE7, 0xAA, 0x98}, // ��
+ {0xB4DC, 0x7A9C}, //{0xE7, 0xAA, 0x9C}, // ��
+ {0xCED1, 0x7A9D}, //{0xE7, 0xAA, 0x9D}, // ��
+ {0xBFDF, 0x7A9F}, //{0xE7, 0xAA, 0x9F}, // ��
+ {0xBFFA, 0x7AA5}, //{0xE7, 0xAA, 0xA5}, // ��
+ {0xC1FE, 0x7ABF}, //{0xE7, 0xAA, 0xBF}, // ��
+ {0xC1A2, 0x7ACB}, //{0xE7, 0xAB, 0x8B}, // b
+ {0xCAFA, 0x7AD6}, //{0xE7, 0xAB, 0x96}, // ��
{0xD5BE, 0x7AD9}, //{0xE7, 0xAB, 0x99}, // Õ¾
- {0xBEBA, 0x7ADE}, //{0xE7, 0xAB, 0x9E}, // ¾º
- {0xBEB9, 0x7ADF}, //{0xE7, 0xAB, 0x9F}, // ¾¹
- {0xD5C2, 0x7AE0}, //{0xE7, 0xAB, 0xA0}, // ÕÂ
- {0xBFA2, 0x7AE3}, //{0xE7, 0xAB, 0xA3}, // ¿¢
+ {0xBEBA, 0x7ADE}, //{0xE7, 0xAB, 0x9E}, // ��
+ {0xBEB9, 0x7ADF}, //{0xE7, 0xAB, 0x9F}, // ��
+ {0xD5C2, 0x7AE0}, //{0xE7, 0xAB, 0xA0}, // ��
+ {0xBFA2, 0x7AE3}, //{0xE7, 0xAB, 0xA3}, // ��
{0xCDAF, 0x7AE5}, //{0xE7, 0xAB, 0xA5}, // ͯ
- {0xBDDF, 0x7AED}, //{0xE7, 0xAB, 0xAD}, // ½ß
- {0xB6CB, 0x7AEF}, //{0xE7, 0xAB, 0xAF}, // ¶Ë
- {0xD6F1, 0x7AF9}, //{0xE7, 0xAB, 0xB9}, // Öñ
- {0xB8CD, 0x7AFF}, //{0xE7, 0xAB, 0xBF}, // ¸Í
- {0xB0CA, 0x7B06}, //{0xE7, 0xAC, 0x86}, // °Ê
- {0xCBF1, 0x7B0B}, //{0xE7, 0xAC, 0x8B}, // Ëñ
+ {0xBDDF, 0x7AED}, //{0xE7, 0xAB, 0xAD}, // ��
+ {0xB6CB, 0x7AEF}, //{0xE7, 0xAB, 0xAF}, // ��
+ {0xD6F1, 0x7AF9}, //{0xE7, 0xAB, 0xB9}, // ��
+ {0xB8CD, 0x7AFF}, //{0xE7, 0xAB, 0xBF}, // ��
+ {0xB0CA, 0x7B06}, //{0xE7, 0xAC, 0x86}, // ��
+ {0xCBF1, 0x7B0B}, //{0xE7, 0xAC, 0x8B}, // ��
{0xD0A6, 0x7B11}, //{0xE7, 0xAC, 0x91}, // Ц
- {0xB1CA, 0x7B14}, //{0xE7, 0xAC, 0x94}, // ±Ê
- {0xF3CF, 0x7B19}, //{0xE7, 0xAC, 0x99}, // óÏ
- {0xB5D1, 0x7B1B}, //{0xE7, 0xAC, 0x9B}, // µÑ
- {0xF3D4, 0x7B24}, //{0xE7, 0xAC, 0xA4}, // óÔ
- {0xB7FB, 0x7B26}, //{0xE7, 0xAC, 0xA6}, // ·û
- {0xB1BF, 0x7B28}, //{0xE7, 0xAC, 0xA8}, // ±¿
- {0xB5DA, 0x7B2C}, //{0xE7, 0xAC, 0xAC}, // µÚ
- {0xC1FD, 0x7B3C}, //{0xE7, 0xAC, 0xBC}, // Áý
- {0xB5C8, 0x7B49}, //{0xE7, 0xAD, 0x89}, // µÈ
- {0xBDEE, 0x7B4B}, //{0xE7, 0xAD, 0x8B}, // ½î
- {0xB7A4, 0x7B4F}, //{0xE7, 0xAD, 0x8F}, // ·¤
- {0xBFF0, 0x7B50}, //{0xE7, 0xAD, 0x90}, // ¿ð
- {0xD6FE, 0x7B51}, //{0xE7, 0xAD, 0x91}, // Öþ
+ {0xB1CA, 0x7B14}, //{0xE7, 0xAC, 0x94}, // ��
+ {0xF3CF, 0x7B19}, //{0xE7, 0xAC, 0x99}, // ��
+ {0xB5D1, 0x7B1B}, //{0xE7, 0xAC, 0x9B}, // ��
+ {0xF3D4, 0x7B24}, //{0xE7, 0xAC, 0xA4}, // ��
+ {0xB7FB, 0x7B26}, //{0xE7, 0xAC, 0xA6}, // ��
+ {0xB1BF, 0x7B28}, //{0xE7, 0xAC, 0xA8}, // ��
+ {0xB5DA, 0x7B2C}, //{0xE7, 0xAC, 0xAC}, // ��
+ {0xC1FD, 0x7B3C}, //{0xE7, 0xAC, 0xBC}, // ��
+ {0xB5C8, 0x7B49}, //{0xE7, 0xAD, 0x89}, // ��
+ {0xBDEE, 0x7B4B}, //{0xE7, 0xAD, 0x8B}, // ��
+ {0xB7A4, 0x7B4F}, //{0xE7, 0xAD, 0x8F}, // ��
+ {0xBFF0, 0x7B50}, //{0xE7, 0xAD, 0x90}, // ��
+ {0xD6FE, 0x7B51}, //{0xE7, 0xAD, 0x91}, // ��
{0xCDB2, 0x7B52}, //{0xE7, 0xAD, 0x92}, // Ͳ
- {0xB4F0, 0x7B54}, //{0xE7, 0xAD, 0x94}, // ´ð
- {0xB2DF, 0x7B56}, //{0xE7, 0xAD, 0x96}, // ²ß
+ {0xB4F0, 0x7B54}, //{0xE7, 0xAD, 0x94}, // ��
+ {0xB2DF, 0x7B56}, //{0xE7, 0xAD, 0x96}, // ��
{0xC9B8, 0x7B5B}, //{0xE7, 0xAD, 0x9B}, // ɸ
- {0xF3DD, 0x7B5D}, //{0xE7, 0xAD, 0x9D}, // óÝ
- {0xBFEA, 0x7B77}, //{0xE7, 0xAD, 0xB7}, // ¿ê
- {0xB3EF, 0x7B79}, //{0xE7, 0xAD, 0xB9}, // ³ï
+ {0xF3DD, 0x7B5D}, //{0xE7, 0xAD, 0x9D}, // ��
+ {0xBFEA, 0x7B77}, //{0xE7, 0xAD, 0xB7}, // ��
+ {0xB3EF, 0x7B79}, //{0xE7, 0xAD, 0xB9}, // ��
{0xC7A9, 0x7B7E}, //{0xE7, 0xAD, 0xBE}, // Ç©
- {0xBCF2, 0x7B80}, //{0xE7, 0xAE, 0x80}, // ¼ò
- {0xB9BF, 0x7B8D}, //{0xE7, 0xAE, 0x8D}, // ¹¿
- {0xBBFE, 0x7B95}, //{0xE7, 0xAE, 0x95}, // »þ
- {0xCBE3, 0x7B97}, //{0xE7, 0xAE, 0x97}, // Ëã
- {0xB9DC, 0x7BA1}, //{0xE7, 0xAE, 0xA1}, // ¹Ü
- {0xC2E1, 0x7BA9}, //{0xE7, 0xAE, 0xA9}, // Âá
- {0xF3EF, 0x7BAB}, //{0xE7, 0xAE, 0xAB}, // óï
- {0xBCFD, 0x7BAD}, //{0xE7, 0xAE, 0xAD}, // ¼ý
- {0xCFE4, 0x7BB1}, //{0xE7, 0xAE, 0xB1}, // Ïä
+ {0xBCF2, 0x7B80}, //{0xE7, 0xAE, 0x80}, // ��
+ {0xB9BF, 0x7B8D}, //{0xE7, 0xAE, 0x8D}, // ��
+ {0xBBFE, 0x7B95}, //{0xE7, 0xAE, 0x95}, // ��
+ {0xCBE3, 0x7B97}, //{0xE7, 0xAE, 0x97}, // ��
+ {0xB9DC, 0x7BA1}, //{0xE7, 0xAE, 0xA1}, // ��
+ {0xC2E1, 0x7BA9}, //{0xE7, 0xAE, 0xA9}, // ��
+ {0xF3EF, 0x7BAB}, //{0xE7, 0xAE, 0xAB}, // ��
+ {0xBCFD, 0x7BAD}, //{0xE7, 0xAE, 0xAD}, // ��
+ {0xCFE4, 0x7BB1}, //{0xE7, 0xAE, 0xB1}, // ��
{0xC6AA, 0x7BC7}, //{0xE7, 0xAF, 0x87}, // ƪ
{0xC2A8, 0x7BD3}, //{0xE7, 0xAF, 0x93}, // ¨
- {0xB8DD, 0x7BD9}, //{0xE7, 0xAF, 0x99}, // ¸Ý
- {0xB4DB, 0x7BE1}, //{0xE7, 0xAF, 0xA1}, // ´Û
- {0xC0BA, 0x7BEE}, //{0xE7, 0xAF, 0xAE}, // ˼
- {0xC0E9, 0x7BF1}, //{0xE7, 0xAF, 0xB1}, // Àé
- {0xC5F1, 0x7BF7}, //{0xE7, 0xAF, 0xB7}, // Åñ
- {0xB4D8, 0x7C07}, //{0xE7, 0xB0, 0x87}, // ´Ø
- {0xF4A4, 0x7C38}, //{0xE7, 0xB0, 0xB8}, // ô¤
- {0xB2BE, 0x7C3F}, //{0xE7, 0xB0, 0xBF}, // ²¾
- {0xBCAE, 0x7C4D}, //{0xE7, 0xB1, 0x8D}, // ¼®
- {0xC3D7, 0x7C73}, //{0xE7, 0xB1, 0xB3}, // Ã×
- {0xC0E0, 0x7C7B}, //{0xE7, 0xB1, 0xBB}, // Àà
- {0xD7D1, 0x7C7D}, //{0xE7, 0xB1, 0xBD}, // ×Ñ
- {0xB7DB, 0x7C89}, //{0xE7, 0xB2, 0x89}, // ·Û
- {0xC1A3, 0x7C92}, //{0xE7, 0xB2, 0x92}, // Á£
- {0xB4D6, 0x7C97}, //{0xE7, 0xB2, 0x97}, // ´Ö
+ {0xB8DD, 0x7BD9}, //{0xE7, 0xAF, 0x99}, // ��
+ {0xB4DB, 0x7BE1}, //{0xE7, 0xAF, 0xA1}, // ��
+ {0xC0BA, 0x7BEE}, //{0xE7, 0xAF, 0xAE}, // :
+ {0xC0E9, 0x7BF1}, //{0xE7, 0xAF, 0xB1}, // ��
+ {0xC5F1, 0x7BF7}, //{0xE7, 0xAF, 0xB7}, // ��
+ {0xB4D8, 0x7C07}, //{0xE7, 0xB0, 0x87}, // ��
+ {0xF4A4, 0x7C38}, //{0xE7, 0xB0, 0xB8}, // �
+ {0xB2BE, 0x7C3F}, //{0xE7, 0xB0, 0xBF}, // ��
+ {0xBCAE, 0x7C4D}, //{0xE7, 0xB1, 0x8D}, // ��
+ {0xC3D7, 0x7C73}, //{0xE7, 0xB1, 0xB3}, // ��
+ {0xC0E0, 0x7C7B}, //{0xE7, 0xB1, 0xBB}, // ��
+ {0xD7D1, 0x7C7D}, //{0xE7, 0xB1, 0xBD}, // ��
+ {0xB7DB, 0x7C89}, //{0xE7, 0xB2, 0x89}, // ��
+ {0xC1A3, 0x7C92}, //{0xE7, 0xB2, 0x92}, // c
+ {0xB4D6, 0x7C97}, //{0xE7, 0xB2, 0x97}, // ��
{0xD5B3, 0x7C98}, //{0xE7, 0xB2, 0x98}, // Õ³
- {0xCBDA, 0x7C9F}, //{0xE7, 0xB2, 0x9F}, // ËÚ
- {0xD4C1, 0x7CA4}, //{0xE7, 0xB2, 0xA4}, // ÔÁ
- {0xD6E0, 0x7CA5}, //{0xE7, 0xB2, 0xA5}, // Öà
- {0xB7E0, 0x7CAA}, //{0xE7, 0xB2, 0xAA}, // ·à
- {0xC1B8, 0x7CAE}, //{0xE7, 0xB2, 0xAE}, // Á¸
- {0xC1BB, 0x7CB1}, //{0xE7, 0xB2, 0xB1}, // Á»
- {0xB4E2, 0x7CB9}, //{0xE7, 0xB2, 0xB9}, // ´â
- {0xBEAB, 0x7CBE}, //{0xE7, 0xB2, 0xBE}, // ¾«
- {0xBAFD, 0x7CCA}, //{0xE7, 0xB3, 0x8A}, // ºý
- {0xB8E2, 0x7CD5}, //{0xE7, 0xB3, 0x95}, // ¸â
- {0xCCC7, 0x7CD6}, //{0xE7, 0xB3, 0x96}, // ÌÇ
- {0xB2DA, 0x7CD9}, //{0xE7, 0xB3, 0x99}, // ²Ú
- {0xC3D3, 0x7CDC}, //{0xE7, 0xB3, 0x9C}, // ÃÓ
- {0xD4E3, 0x7CDF}, //{0xE7, 0xB3, 0x9F}, // Ôã
- {0xBFB7, 0x7CE0}, //{0xE7, 0xB3, 0xA0}, // ¿·
+ {0xCBDA, 0x7C9F}, //{0xE7, 0xB2, 0x9F}, // ��
+ {0xD4C1, 0x7CA4}, //{0xE7, 0xB2, 0xA4}, // ��
+ {0xD6E0, 0x7CA5}, //{0xE7, 0xB2, 0xA5}, // ��
+ {0xB7E0, 0x7CAA}, //{0xE7, 0xB2, 0xAA}, // ��
+ {0xC1B8, 0x7CAE}, //{0xE7, 0xB2, 0xAE}, // ��
+ {0xC1BB, 0x7CB1}, //{0xE7, 0xB2, 0xB1}, // {
+ {0xB4E2, 0x7CB9}, //{0xE7, 0xB2, 0xB9}, // ��
+ {0xBEAB, 0x7CBE}, //{0xE7, 0xB2, 0xBE}, // ��
+ {0xBAFD, 0x7CCA}, //{0xE7, 0xB3, 0x8A}, // ��
+ {0xB8E2, 0x7CD5}, //{0xE7, 0xB3, 0x95}, // ��
+ {0xCCC7, 0x7CD6}, //{0xE7, 0xB3, 0x96}, // ��
+ {0xB2DA, 0x7CD9}, //{0xE7, 0xB3, 0x99}, // ��
+ {0xC3D3, 0x7CDC}, //{0xE7, 0xB3, 0x9C}, // ��
+ {0xD4E3, 0x7CDF}, //{0xE7, 0xB3, 0x9F}, // ��
+ {0xBFB7, 0x7CE0}, //{0xE7, 0xB3, 0xA0}, // ��
{0xC5B4, 0x7CEF}, //{0xE7, 0xB3, 0xAF}, // Å´
{0xCFB5, 0x7CFB}, //{0xE7, 0xB3, 0xBB}, // ϵ
- {0xCEC9, 0x7D0A}, //{0xE7, 0xB4, 0x8A}, // ÎÉ
- {0xCBD8, 0x7D20}, //{0xE7, 0xB4, 0xA0}, // ËØ
- {0xCBF7, 0x7D22}, //{0xE7, 0xB4, 0xA2}, // Ë÷
- {0xBDF4, 0x7D27}, //{0xE7, 0xB4, 0xA7}, // ½ô
- {0xD7CF, 0x7D2B}, //{0xE7, 0xB4, 0xAB}, // ×Ï
- {0xC0DB, 0x7D2F}, //{0xE7, 0xB4, 0xAF}, // ÀÛ
- {0xD0F5, 0x7D6E}, //{0xE7, 0xB5, 0xAE}, // Ðõ
- {0xB7B1, 0x7E41}, //{0xE7, 0xB9, 0x81}, // ·±
- {0xBEC0, 0x7EA0}, //{0xE7, 0xBA, 0xA0}, // ¾À
- {0xBAEC, 0x7EA2}, //{0xE7, 0xBA, 0xA2}, // ºì
- {0xCFCB, 0x7EA4}, //{0xE7, 0xBA, 0xA4}, // ÏË
+ {0xCEC9, 0x7D0A}, //{0xE7, 0xB4, 0x8A}, // ��
+ {0xCBD8, 0x7D20}, //{0xE7, 0xB4, 0xA0}, // ��
+ {0xCBF7, 0x7D22}, //{0xE7, 0xB4, 0xA2}, // ��
+ {0xBDF4, 0x7D27}, //{0xE7, 0xB4, 0xA7}, // ��
+ {0xD7CF, 0x7D2B}, //{0xE7, 0xB4, 0xAB}, // ��
+ {0xC0DB, 0x7D2F}, //{0xE7, 0xB4, 0xAF}, // ��
+ {0xD0F5, 0x7D6E}, //{0xE7, 0xB5, 0xAE}, // ��
+ {0xB7B1, 0x7E41}, //{0xE7, 0xB9, 0x81}, // ��
+ {0xBEC0, 0x7EA0}, //{0xE7, 0xBA, 0xA0}, // ��
+ {0xBAEC, 0x7EA2}, //{0xE7, 0xBA, 0xA2}, // ��
+ {0xCFCB, 0x7EA4}, //{0xE7, 0xBA, 0xA4}, // ��
{0xD4BC, 0x7EA6}, //{0xE7, 0xBA, 0xA6}, // Ô¼
- {0xBCB6, 0x7EA7}, //{0xE7, 0xBA, 0xA7}, // ¼¶
- {0xBCCD, 0x7EAA}, //{0xE7, 0xBA, 0xAA}, // ¼Í
- {0xC8D2, 0x7EAB}, //{0xE7, 0xBA, 0xAB}, // ÈÒ
+ {0xBCB6, 0x7EA7}, //{0xE7, 0xBA, 0xA7}, // ��
+ {0xBCCD, 0x7EAA}, //{0xE7, 0xBA, 0xAA}, // ��
+ {0xC8D2, 0x7EAB}, //{0xE7, 0xBA, 0xAB}, // ��
{0xCEB3, 0x7EAC}, //{0xE7, 0xBA, 0xAC}, // γ
- {0xB4BF, 0x7EAF}, //{0xE7, 0xBA, 0xAF}, // ´¿
+ {0xB4BF, 0x7EAF}, //{0xE7, 0xBA, 0xAF}, // ��
{0xC9B4, 0x7EB1}, //{0xE7, 0xBA, 0xB1}, // É´
- {0xB8D9, 0x7EB2}, //{0xE7, 0xBA, 0xB2}, // ¸Ù
- {0xC4C9, 0x7EB3}, //{0xE7, 0xBA, 0xB3}, // ÄÉ
- {0xD7DD, 0x7EB5}, //{0xE7, 0xBA, 0xB5}, // ×Ý
- {0xB7D7, 0x7EB7}, //{0xE7, 0xBA, 0xB7}, // ·×
+ {0xB8D9, 0x7EB2}, //{0xE7, 0xBA, 0xB2}, // ��
+ {0xC4C9, 0x7EB3}, //{0xE7, 0xBA, 0xB3}, // ��
+ {0xD7DD, 0x7EB5}, //{0xE7, 0xBA, 0xB5}, // ��
+ {0xB7D7, 0x7EB7}, //{0xE7, 0xBA, 0xB7}, // ��
{0xD6BD, 0x7EB8}, //{0xE7, 0xBA, 0xB8}, // Ö½
- {0xCEC6, 0x7EB9}, //{0xE7, 0xBA, 0xB9}, // ÎÆ
- {0xB7C4, 0x7EBA}, //{0xE7, 0xBA, 0xBA}, // ·Ä
+ {0xCEC6, 0x7EB9}, //{0xE7, 0xBA, 0xB9}, // ��
+ {0xB7C4, 0x7EBA}, //{0xE7, 0xBA, 0xBA}, // ��
{0xC5A6, 0x7EBD}, //{0xE7, 0xBA, 0xBD}, // Ŧ
- {0xCFDF, 0x7EBF}, //{0xE7, 0xBA, 0xBF}, // Ïß
- {0xC1B7, 0x7EC3}, //{0xE7, 0xBB, 0x83}, // Á·
- {0xD7E9, 0x7EC4}, //{0xE7, 0xBB, 0x84}, // ×é
- {0xC9F0, 0x7EC5}, //{0xE7, 0xBB, 0x85}, // Éð
+ {0xCFDF, 0x7EBF}, //{0xE7, 0xBA, 0xBF}, // ��
+ {0xC1B7, 0x7EC3}, //{0xE7, 0xBB, 0x83}, // w
+ {0xD7E9, 0x7EC4}, //{0xE7, 0xBB, 0x84}, // ��
+ {0xC9F0, 0x7EC5}, //{0xE7, 0xBB, 0x85}, // ��
{0xCFB8, 0x7EC6}, //{0xE7, 0xBB, 0x86}, // ϸ
{0xD6AF, 0x7EC7}, //{0xE7, 0xBB, 0x87}, // Ö¯
- {0xD6D5, 0x7EC8}, //{0xE7, 0xBB, 0x88}, // ÖÕ
- {0xB0ED, 0x7ECA}, //{0xE7, 0xBB, 0x8A}, // °í
- {0xC9DC, 0x7ECD}, //{0xE7, 0xBB, 0x8D}, // ÉÜ
- {0xD2EF, 0x7ECE}, //{0xE7, 0xBB, 0x8E}, // Òï
- {0xBEAD, 0x7ECF}, //{0xE7, 0xBB, 0x8F}, // ¾
- {0xB0F3, 0x7ED1}, //{0xE7, 0xBB, 0x91}, // °ó
- {0xC8DE, 0x7ED2}, //{0xE7, 0xBB, 0x92}, // ÈÞ
- {0xBDE1, 0x7ED3}, //{0xE7, 0xBB, 0x93}, // ½á
- {0xC8C6, 0x7ED5}, //{0xE7, 0xBB, 0x95}, // ÈÆ
- {0xBBE6, 0x7ED8}, //{0xE7, 0xBB, 0x98}, // Ⱦ
- {0xB8F8, 0x7ED9}, //{0xE7, 0xBB, 0x99}, // ¸ø
- {0xC2E7, 0x7EDC}, //{0xE7, 0xBB, 0x9C}, // Âç
- {0xBEF8, 0x7EDD}, //{0xE7, 0xBB, 0x9D}, // ¾ø
- {0xBDCA, 0x7EDE}, //{0xE7, 0xBB, 0x9E}, // ½Ê
+ {0xD6D5, 0x7EC8}, //{0xE7, 0xBB, 0x88}, // ��
+ {0xB0ED, 0x7ECA}, //{0xE7, 0xBB, 0x8A}, // ��
+ {0xC9DC, 0x7ECD}, //{0xE7, 0xBB, 0x8D}, // ��
+ {0xD2EF, 0x7ECE}, //{0xE7, 0xBB, 0x8E}, // ��
+ {0xBEAD, 0x7ECF}, //{0xE7, 0xBB, 0x8F}, // ��
+ {0xB0F3, 0x7ED1}, //{0xE7, 0xBB, 0x91}, // ��
+ {0xC8DE, 0x7ED2}, //{0xE7, 0xBB, 0x92}, // ��
+ {0xBDE1, 0x7ED3}, //{0xE7, 0xBB, 0x93}, // ��
+ {0xC8C6, 0x7ED5}, //{0xE7, 0xBB, 0x95}, // ��
+ {0xBBE6, 0x7ED8}, //{0xE7, 0xBB, 0x98}, // ��
+ {0xB8F8, 0x7ED9}, //{0xE7, 0xBB, 0x99}, // ��
+ {0xC2E7, 0x7EDC}, //{0xE7, 0xBB, 0x9C}, // ��
+ {0xBEF8, 0x7EDD}, //{0xE7, 0xBB, 0x9D}, // ��
+ {0xBDCA, 0x7EDE}, //{0xE7, 0xBB, 0x9E}, // ��
{0xCDB3, 0x7EDF}, //{0xE7, 0xBB, 0x9F}, // ͳ
- {0xBEEE, 0x7EE2}, //{0xE7, 0xBB, 0xA2}, // ¾î
- {0xD0E5, 0x7EE3}, //{0xE7, 0xBB, 0xA3}, // Ðå
- {0xBCCC, 0x7EE7}, //{0xE7, 0xBB, 0xA7}, // ¼Ì
- {0xBCA8, 0x7EE9}, //{0xE7, 0xBB, 0xA9}, // ¼¨
- {0xD0F7, 0x7EEA}, //{0xE7, 0xBB, 0xAA}, // Ð÷
- {0xD0F8, 0x7EED}, //{0xE7, 0xBB, 0xAD}, // Ðø
- {0xB4C2, 0x7EF0}, //{0xE7, 0xBB, 0xB0}, // ´Â
- {0xC9FE, 0x7EF3}, //{0xE7, 0xBB, 0xB3}, // Éþ
+ {0xBEEE, 0x7EE2}, //{0xE7, 0xBB, 0xA2}, // ��
+ {0xD0E5, 0x7EE3}, //{0xE7, 0xBB, 0xA3}, // ��
+ {0xBCCC, 0x7EE7}, //{0xE7, 0xBB, 0xA7}, // ��
+ {0xBCA8, 0x7EE9}, //{0xE7, 0xBB, 0xA9}, // ��
+ {0xD0F7, 0x7EEA}, //{0xE7, 0xBB, 0xAA}, // ��
+ {0xD0F8, 0x7EED}, //{0xE7, 0xBB, 0xAD}, // ��
+ {0xB4C2, 0x7EF0}, //{0xE7, 0xBB, 0xB0}, // ��
+ {0xC9FE, 0x7EF3}, //{0xE7, 0xBB, 0xB3}, // ��
{0xCEAC, 0x7EF4}, //{0xE7, 0xBB, 0xB4}, // ά
- {0xC3E0, 0x7EF5}, //{0xE7, 0xBB, 0xB5}, // Ãà
- {0xB1C1, 0x7EF7}, //{0xE7, 0xBB, 0xB7}, // ±Á
- {0xB3F1, 0x7EF8}, //{0xE7, 0xBB, 0xB8}, // ³ñ
- {0xD7DB, 0x7EFC}, //{0xE7, 0xBB, 0xBC}, // ×Û
- {0xD5C0, 0x7EFD}, //{0xE7, 0xBB, 0xBD}, // ÕÀ
- {0xC2CC, 0x7EFF}, //{0xE7, 0xBB, 0xBF}, // ÂÌ
+ {0xC3E0, 0x7EF5}, //{0xE7, 0xBB, 0xB5}, // ��
+ {0xB1C1, 0x7EF7}, //{0xE7, 0xBB, 0xB7}, // ��
+ {0xB3F1, 0x7EF8}, //{0xE7, 0xBB, 0xB8}, // ��
+ {0xD7DB, 0x7EFC}, //{0xE7, 0xBB, 0xBC}, // ��
+ {0xD5C0, 0x7EFD}, //{0xE7, 0xBB, 0xBD}, // ��
+ {0xC2CC, 0x7EFF}, //{0xE7, 0xBB, 0xBF}, // ��
{0xD7BA, 0x7F00}, //{0xE7, 0xBC, 0x80}, // ׺
- {0xC3E5, 0x7F05}, //{0xE7, 0xBC, 0x85}, // Ãå
- {0xC0C2, 0x7F06}, //{0xE7, 0xBC, 0x86}, // ÀÂ
- {0xB6D0, 0x7F0E}, //{0xE7, 0xBC, 0x8E}, // ¶Ð
- {0xBBBA, 0x7F13}, //{0xE7, 0xBC, 0x93}, // ȼ
- {0xB5DE, 0x7F14}, //{0xE7, 0xBC, 0x94}, // µÞ
- {0xC2C6, 0x7F15}, //{0xE7, 0xBC, 0x95}, // ÂÆ
- {0xB1E0, 0x7F16}, //{0xE7, 0xBC, 0x96}, // ±à
+ {0xC3E5, 0x7F05}, //{0xE7, 0xBC, 0x85}, // ��
+ {0xC0C2, 0x7F06}, //{0xE7, 0xBC, 0x86}, // ��
+ {0xB6D0, 0x7F0E}, //{0xE7, 0xBC, 0x8E}, // ��
+ {0xBBBA, 0x7F13}, //{0xE7, 0xBC, 0x93}, // ��
+ {0xB5DE, 0x7F14}, //{0xE7, 0xBC, 0x94}, // ��
+ {0xC2C6, 0x7F15}, //{0xE7, 0xBC, 0x95}, // ��
+ {0xB1E0, 0x7F16}, //{0xE7, 0xBC, 0x96}, // ��
{0xD4B5, 0x7F18}, //{0xE7, 0xBC, 0x98}, // Ôµ
- {0xB8BF, 0x7F1A}, //{0xE7, 0xBC, 0x9A}, // ¸¿
- {0xB7EC, 0x7F1D}, //{0xE7, 0xBC, 0x9D}, // ·ì
- {0xB2F8, 0x7F20}, //{0xE7, 0xBC, 0xA0}, // ²ø
- {0xE7CD, 0x7F24}, //{0xE7, 0xBC, 0xA4}, // çÍ
+ {0xB8BF, 0x7F1A}, //{0xE7, 0xBC, 0x9A}, // ��
+ {0xB7EC, 0x7F1D}, //{0xE7, 0xBC, 0x9D}, // ��
+ {0xB2F8, 0x7F20}, //{0xE7, 0xBC, 0xA0}, // ��
+ {0xE7CD, 0x7F24}, //{0xE7, 0xBC, 0xA4}, // ��
{0xD3A7, 0x7F28}, //{0xE7, 0xBC, 0xA8}, // Ó§
- {0xCBF5, 0x7F29}, //{0xE7, 0xBC, 0xA9}, // Ëõ
- {0xE7D4, 0x7F2D}, //{0xE7, 0xBC, 0xAD}, // çÔ
- {0xE7D6, 0x7F30}, //{0xE7, 0xBC, 0xB0}, // çÖ
- {0xBDC9, 0x7F34}, //{0xE7, 0xBC, 0xB4}, // ½É
- {0xB8D7, 0x7F38}, //{0xE7, 0xBC, 0xB8}, // ¸×
+ {0xCBF5, 0x7F29}, //{0xE7, 0xBC, 0xA9}, // ��
+ {0xE7D4, 0x7F2D}, //{0xE7, 0xBC, 0xAD}, // ��
+ {0xE7D6, 0x7F30}, //{0xE7, 0xBC, 0xB0}, // ��
+ {0xBDC9, 0x7F34}, //{0xE7, 0xBC, 0xB4}, // ��
+ {0xB8D7, 0x7F38}, //{0xE7, 0xBC, 0xB8}, // ��
{0xC8B1, 0x7F3A}, //{0xE7, 0xBC, 0xBA}, // ȱ
- {0xB9DE, 0x7F50}, //{0xE7, 0xBD, 0x90}, // ¹Þ
- {0xCDF8, 0x7F51}, //{0xE7, 0xBD, 0x91}, // Íø
- {0xBAB1, 0x7F55}, //{0xE7, 0xBD, 0x95}, // º±
- {0xC2DE, 0x7F57}, //{0xE7, 0xBD, 0x97}, // ÂÞ
- {0xB7A3, 0x7F5A}, //{0xE7, 0xBD, 0x9A}, // ·£
- {0xB0D5, 0x7F62}, //{0xE7, 0xBD, 0xA2}, // °Õ
- {0xD5D6, 0x7F69}, //{0xE7, 0xBD, 0xA9}, // ÕÖ
- {0xD7EF, 0x7F6A}, //{0xE7, 0xBD, 0xAA}, // ×ï
- {0xD6C3, 0x7F6E}, //{0xE7, 0xBD, 0xAE}, // ÖÃ
- {0xCAF0, 0x7F72}, //{0xE7, 0xBD, 0xB2}, // Êð
- {0xD1F2, 0x7F8A}, //{0xE7, 0xBE, 0x8A}, // Ñò
- {0xC3C0, 0x7F8E}, //{0xE7, 0xBE, 0x8E}, // ÃÀ
- {0xB8E1, 0x7F94}, //{0xE7, 0xBE, 0x94}, // ¸á
- {0xD0DF, 0x7F9E}, //{0xE7, 0xBE, 0x9E}, // Ðß
- {0xCFDB, 0x7FA1}, //{0xE7, 0xBE, 0xA1}, // ÏÛ
+ {0xB9DE, 0x7F50}, //{0xE7, 0xBD, 0x90}, // ��
+ {0xCDF8, 0x7F51}, //{0xE7, 0xBD, 0x91}, // ��
+ {0xBAB1, 0x7F55}, //{0xE7, 0xBD, 0x95}, // ��
+ {0xC2DE, 0x7F57}, //{0xE7, 0xBD, 0x97}, // ��
+ {0xB7A3, 0x7F5A}, //{0xE7, 0xBD, 0x9A}, // ��
+ {0xB0D5, 0x7F62}, //{0xE7, 0xBD, 0xA2}, // ��
+ {0xD5D6, 0x7F69}, //{0xE7, 0xBD, 0xA9}, // ��
+ {0xD7EF, 0x7F6A}, //{0xE7, 0xBD, 0xAA}, // ��
+ {0xD6C3, 0x7F6E}, //{0xE7, 0xBD, 0xAE}, // ��
+ {0xCAF0, 0x7F72}, //{0xE7, 0xBD, 0xB2}, // ��
+ {0xD1F2, 0x7F8A}, //{0xE7, 0xBE, 0x8A}, // ��
+ {0xC3C0, 0x7F8E}, //{0xE7, 0xBE, 0x8E}, // ��
+ {0xB8E1, 0x7F94}, //{0xE7, 0xBE, 0x94}, // ��
+ {0xD0DF, 0x7F9E}, //{0xE7, 0xBE, 0x9E}, // ��
+ {0xCFDB, 0x7FA1}, //{0xE7, 0xBE, 0xA1}, // ��
{0xC8BA, 0x7FA4}, //{0xE7, 0xBE, 0xA4}, // Ⱥ
- {0xB8FE, 0x7FB9}, //{0xE7, 0xBE, 0xB9}, // ¸þ
- {0xD3F0, 0x7FBD}, //{0xE7, 0xBE, 0xBD}, // Óð
- {0xCECC, 0x7FC1}, //{0xE7, 0xBF, 0x81}, // ÎÌ
- {0xB3E1, 0x7FC5}, //{0xE7, 0xBF, 0x85}, // ³á
- {0xF4E1, 0x7FCE}, //{0xE7, 0xBF, 0x8E}, // ôá
- {0xCFE8, 0x7FD4}, //{0xE7, 0xBF, 0x94}, // Ïè
- {0xC7CC, 0x7FD8}, //{0xE7, 0xBF, 0x98}, // ÇÌ
- {0xB4E4, 0x7FE0}, //{0xE7, 0xBF, 0xA0}, // ´ä
- {0xF4E6, 0x7FE9}, //{0xE7, 0xBF, 0xA9}, // ôæ
- {0xBAB2, 0x7FF0}, //{0xE7, 0xBF, 0xB0}, // º²
- {0xB7AD, 0x7FFB}, //{0xE7, 0xBF, 0xBB}, // ·
- {0xD2ED, 0x7FFC}, //{0xE7, 0xBF, 0xBC}, // Òí
+ {0xB8FE, 0x7FB9}, //{0xE7, 0xBE, 0xB9}, // ��
+ {0xD3F0, 0x7FBD}, //{0xE7, 0xBE, 0xBD}, // ��
+ {0xCECC, 0x7FC1}, //{0xE7, 0xBF, 0x81}, // ��
+ {0xB3E1, 0x7FC5}, //{0xE7, 0xBF, 0x85}, // ��
+ {0xF4E1, 0x7FCE}, //{0xE7, 0xBF, 0x8E}, // ��
+ {0xCFE8, 0x7FD4}, //{0xE7, 0xBF, 0x94}, // ��
+ {0xC7CC, 0x7FD8}, //{0xE7, 0xBF, 0x98}, // ��
+ {0xB4E4, 0x7FE0}, //{0xE7, 0xBF, 0xA0}, // ��
+ {0xF4E6, 0x7FE9}, //{0xE7, 0xBF, 0xA9}, // ��
+ {0xBAB2, 0x7FF0}, //{0xE7, 0xBF, 0xB0}, // ��
+ {0xB7AD, 0x7FFB}, //{0xE7, 0xBF, 0xBB}, // ��
+ {0xD2ED, 0x7FFC}, //{0xE7, 0xBF, 0xBC}, // ��
{0xD2AB, 0x8000}, //{0xE8, 0x80, 0x80}, // Ò«
- {0xC0CF, 0x8001}, //{0xE8, 0x80, 0x81}, // ÀÏ
- {0xBFBC, 0x8003}, //{0xE8, 0x80, 0x83}, // ¿¼
- {0xD5DF, 0x8005}, //{0xE8, 0x80, 0x85}, // Õß
- {0xB6F8, 0x800C}, //{0xE8, 0x80, 0x8C}, // ¶ø
+ {0xC0CF, 0x8001}, //{0xE8, 0x80, 0x81}, // ��
+ {0xBFBC, 0x8003}, //{0xE8, 0x80, 0x83}, // ��
+ {0xD5DF, 0x8005}, //{0xE8, 0x80, 0x85}, // ��
+ {0xB6F8, 0x800C}, //{0xE8, 0x80, 0x8C}, // ��
{0xCBA3, 0x800D}, //{0xE8, 0x80, 0x8D}, // ˣ
- {0xC4CD, 0x8010}, //{0xE8, 0x80, 0x90}, // ÄÍ
- {0xB8FB, 0x8015}, //{0xE8, 0x80, 0x95}, // ¸û
- {0xBAC4, 0x8017}, //{0xE8, 0x80, 0x97}, // ºÄ
- {0xB0D2, 0x8019}, //{0xE8, 0x80, 0x99}, // °Ò
- {0xB6FA, 0x8033}, //{0xE8, 0x80, 0xB3}, // ¶ú
- {0xCBCA, 0x8038}, //{0xE8, 0x80, 0xB8}, // ËÊ
- {0xB3DC, 0x803B}, //{0xE8, 0x80, 0xBB}, // ³Ü
- {0xB5A2, 0x803D}, //{0xE8, 0x80, 0xBD}, // µ¢
- {0xB9A2, 0x803F}, //{0xE8, 0x80, 0xBF}, // ¹¢
- {0xC4F4, 0x8042}, //{0xE8, 0x81, 0x82}, // Äô
- {0xC1C4, 0x804A}, //{0xE8, 0x81, 0x8A}, // ÁÄ
- {0xC1FB, 0x804B}, //{0xE8, 0x81, 0x8B}, // Áû
+ {0xC4CD, 0x8010}, //{0xE8, 0x80, 0x90}, // ��
+ {0xB8FB, 0x8015}, //{0xE8, 0x80, 0x95}, // ��
+ {0xBAC4, 0x8017}, //{0xE8, 0x80, 0x97}, // ��
+ {0xB0D2, 0x8019}, //{0xE8, 0x80, 0x99}, // ��
+ {0xB6FA, 0x8033}, //{0xE8, 0x80, 0xB3}, // ��
+ {0xCBCA, 0x8038}, //{0xE8, 0x80, 0xB8}, // ��
+ {0xB3DC, 0x803B}, //{0xE8, 0x80, 0xBB}, // ��
+ {0xB5A2, 0x803D}, //{0xE8, 0x80, 0xBD}, // ��
+ {0xB9A2, 0x803F}, //{0xE8, 0x80, 0xBF}, // ��
+ {0xC4F4, 0x8042}, //{0xE8, 0x81, 0x82}, // ��
+ {0xC1C4, 0x804A}, //{0xE8, 0x81, 0x8A}, // ��
+ {0xC1FB, 0x804B}, //{0xE8, 0x81, 0x8B}, // ��
{0xD6B0, 0x804C}, //{0xE8, 0x81, 0x8C}, // Ö°
- {0xC1AA, 0x8054}, //{0xE8, 0x81, 0x94}, // Áª
+ {0xC1AA, 0x8054}, //{0xE8, 0x81, 0x94}, // j
{0xC6B8, 0x8058}, //{0xE8, 0x81, 0x98}, // Ƹ
- {0xBEDB, 0x805A}, //{0xE8, 0x81, 0x9A}, // ¾Û
- {0xB4CF, 0x806A}, //{0xE8, 0x81, 0xAA}, // ´Ï
- {0xCBE0, 0x8083}, //{0xE8, 0x82, 0x83}, // Ëà
- {0xD2DE, 0x8084}, //{0xE8, 0x82, 0x84}, // ÒÞ
- {0xCBC1, 0x8086}, //{0xE8, 0x82, 0x86}, // ËÁ
- {0xC8E2, 0x8089}, //{0xE8, 0x82, 0x89}, // Èâ
- {0xC0DF, 0x808B}, //{0xE8, 0x82, 0x8B}, // Àß
- {0xBCA1, 0x808C}, //{0xE8, 0x82, 0x8C}, // ¼¡
+ {0xBEDB, 0x805A}, //{0xE8, 0x81, 0x9A}, // ��
+ {0xB4CF, 0x806A}, //{0xE8, 0x81, 0xAA}, // ��
+ {0xCBE0, 0x8083}, //{0xE8, 0x82, 0x83}, // ��
+ {0xD2DE, 0x8084}, //{0xE8, 0x82, 0x84}, // ��
+ {0xCBC1, 0x8086}, //{0xE8, 0x82, 0x86}, // ��
+ {0xC8E2, 0x8089}, //{0xE8, 0x82, 0x89}, // ��
+ {0xC0DF, 0x808B}, //{0xE8, 0x82, 0x8B}, // ��
+ {0xBCA1, 0x808C}, //{0xE8, 0x82, 0x8C}, // ��
{0xD0A4, 0x8096}, //{0xE8, 0x82, 0x96}, // Ф
- {0xD6E2, 0x8098}, //{0xE8, 0x82, 0x98}, // Öâ
- {0xB6C7, 0x809A}, //{0xE8, 0x82, 0x9A}, // ¶Ç
- {0xB8D8, 0x809B}, //{0xE8, 0x82, 0x9B}, // ¸Ø
- {0xB8CE, 0x809D}, //{0xE8, 0x82, 0x9D}, // ¸Î
- {0xB3A6, 0x80A0}, //{0xE8, 0x82, 0xA0}, // ³¦
- {0xB9C9, 0x80A1}, //{0xE8, 0x82, 0xA1}, // ¹É
+ {0xD6E2, 0x8098}, //{0xE8, 0x82, 0x98}, // ��
+ {0xB6C7, 0x809A}, //{0xE8, 0x82, 0x9A}, // ��
+ {0xB8D8, 0x809B}, //{0xE8, 0x82, 0x9B}, // ��
+ {0xB8CE, 0x809D}, //{0xE8, 0x82, 0x9D}, // ��
+ {0xB3A6, 0x80A0}, //{0xE8, 0x82, 0xA0}, // ��
+ {0xB9C9, 0x80A1}, //{0xE8, 0x82, 0xA1}, // ��
{0xD6AB, 0x80A2}, //{0xE8, 0x82, 0xA2}, // Ö«
- {0xB7F4, 0x80A4}, //{0xE8, 0x82, 0xA4}, // ·ô
- {0xB7CA, 0x80A5}, //{0xE8, 0x82, 0xA5}, // ·Ê
- {0xBCE7, 0x80A9}, //{0xE8, 0x82, 0xA9}, // ¼ç
- {0xB7BE, 0x80AA}, //{0xE8, 0x82, 0xAA}, // ·¾
- {0xB0B9, 0x80AE}, //{0xE8, 0x82, 0xAE}, // °¹
- {0xBFCF, 0x80AF}, //{0xE8, 0x82, 0xAF}, // ¿Ï
- {0xD3FD, 0x80B2}, //{0xE8, 0x82, 0xB2}, // Óý
- {0xEBC8, 0x80B4}, //{0xE8, 0x82, 0xB4}, // ëÈ
- {0xB7CE, 0x80BA}, //{0xE8, 0x82, 0xBA}, // ·Î
- {0xC9F6, 0x80BE}, //{0xE8, 0x82, 0xBE}, // Éö
- {0xD6D7, 0x80BF}, //{0xE8, 0x82, 0xBF}, // Ö×
- {0xD5CD, 0x80C0}, //{0xE8, 0x83, 0x80}, // ÕÍ
+ {0xB7F4, 0x80A4}, //{0xE8, 0x82, 0xA4}, // ��
+ {0xB7CA, 0x80A5}, //{0xE8, 0x82, 0xA5}, // ��
+ {0xBCE7, 0x80A9}, //{0xE8, 0x82, 0xA9}, // ��
+ {0xB7BE, 0x80AA}, //{0xE8, 0x82, 0xAA}, // ��
+ {0xB0B9, 0x80AE}, //{0xE8, 0x82, 0xAE}, // ��
+ {0xBFCF, 0x80AF}, //{0xE8, 0x82, 0xAF}, // ��
+ {0xD3FD, 0x80B2}, //{0xE8, 0x82, 0xB2}, // ��
+ {0xEBC8, 0x80B4}, //{0xE8, 0x82, 0xB4}, // ��
+ {0xB7CE, 0x80BA}, //{0xE8, 0x82, 0xBA}, // ��
+ {0xC9F6, 0x80BE}, //{0xE8, 0x82, 0xBE}, // ��
+ {0xD6D7, 0x80BF}, //{0xE8, 0x82, 0xBF}, // ��
+ {0xD5CD, 0x80C0}, //{0xE8, 0x83, 0x80}, // ��
{0xD0B2, 0x80C1}, //{0xE8, 0x83, 0x81}, // в
{0xCEB8, 0x80C3}, //{0xE8, 0x83, 0x83}, // θ
- {0xB5A8, 0x80C6}, //{0xE8, 0x83, 0x86}, // µ¨
- {0xB1B3, 0x80CC}, //{0xE8, 0x83, 0x8C}, // ±³
+ {0xB5A8, 0x80C6}, //{0xE8, 0x83, 0x86}, // ��
+ {0xB1B3, 0x80CC}, //{0xE8, 0x83, 0x8C}, // ��
{0xCCA5, 0x80CE}, //{0xE8, 0x83, 0x8E}, // ̥
- {0xC5D6, 0x80D6}, //{0xE8, 0x83, 0x96}, // ÅÖ
- {0xC5DF, 0x80DA}, //{0xE8, 0x83, 0x9A}, // Åß
+ {0xC5D6, 0x80D6}, //{0xE8, 0x83, 0x96}, // ��
+ {0xC5DF, 0x80DA}, //{0xE8, 0x83, 0x9A}, // ��
{0xCAA4, 0x80DC}, //{0xE8, 0x83, 0x9C}, // ʤ
- {0xB0FB, 0x80DE}, //{0xE8, 0x83, 0x9E}, // °û
- {0xBAFA, 0x80E1}, //{0xE8, 0x83, 0xA1}, // ºú
- {0xEBCA, 0x80E7}, //{0xE8, 0x83, 0xA7}, // ëÊ
- {0xBFE8, 0x80EF}, //{0xE8, 0x83, 0xAF}, // ¿è
- {0xD2C8, 0x80F0}, //{0xE8, 0x83, 0xB0}, // ÒÈ
- {0xB8EC, 0x80F3}, //{0xE8, 0x83, 0xB3}, // ¸ì
- {0xBDBA, 0x80F6}, //{0xE8, 0x83, 0xB6}, // ½º
- {0xD0D8, 0x80F8}, //{0xE8, 0x83, 0xB8}, // ÐØ
- {0xC4DC, 0x80FD}, //{0xE8, 0x83, 0xBD}, // ÄÜ
+ {0xB0FB, 0x80DE}, //{0xE8, 0x83, 0x9E}, // ��
+ {0xBAFA, 0x80E1}, //{0xE8, 0x83, 0xA1}, // ��
+ {0xEBCA, 0x80E7}, //{0xE8, 0x83, 0xA7}, // ��
+ {0xBFE8, 0x80EF}, //{0xE8, 0x83, 0xAF}, // ��
+ {0xD2C8, 0x80F0}, //{0xE8, 0x83, 0xB0}, // ��
+ {0xB8EC, 0x80F3}, //{0xE8, 0x83, 0xB3}, // ��
+ {0xBDBA, 0x80F6}, //{0xE8, 0x83, 0xB6}, // ��
+ {0xD0D8, 0x80F8}, //{0xE8, 0x83, 0xB8}, // ��
+ {0xC4DC, 0x80FD}, //{0xE8, 0x83, 0xBD}, // ��
{0xD6AC, 0x8102}, //{0xE8, 0x84, 0x82}, // Ö¬
- {0xB4E0, 0x8106}, //{0xE8, 0x84, 0x86}, // ´à
- {0xC2F6, 0x8109}, //{0xE8, 0x84, 0x89}, // Âö
- {0xBCB9, 0x810A}, //{0xE8, 0x84, 0x8A}, // ¼¹
- {0xD4E0, 0x810F}, //{0xE8, 0x84, 0x8F}, // Ôà
- {0xC6EA, 0x8110}, //{0xE8, 0x84, 0x90}, // Æê
- {0xC4D4, 0x8111}, //{0xE8, 0x84, 0x91}, // ÄÔ
+ {0xB4E0, 0x8106}, //{0xE8, 0x84, 0x86}, // ��
+ {0xC2F6, 0x8109}, //{0xE8, 0x84, 0x89}, // ��
+ {0xBCB9, 0x810A}, //{0xE8, 0x84, 0x8A}, // ��
+ {0xD4E0, 0x810F}, //{0xE8, 0x84, 0x8F}, // ��
+ {0xC6EA, 0x8110}, //{0xE8, 0x84, 0x90}, // ��
+ {0xC4D4, 0x8111}, //{0xE8, 0x84, 0x91}, // ��
{0xC5A7, 0x8113}, //{0xE8, 0x84, 0x93}, // ŧ
- {0xB2B1, 0x8116}, //{0xE8, 0x84, 0x96}, // ²±
- {0xBDC5, 0x811A}, //{0xE8, 0x84, 0x9A}, // ½Å
- {0xB8AC, 0x812F}, //{0xE8, 0x84, 0xAF}, // ¸¬
- {0xCDD1, 0x8131}, //{0xE8, 0x84, 0xB1}, // ÍÑ
- {0xC1B3, 0x8138}, //{0xE8, 0x84, 0xB8}, // Á³
+ {0xB2B1, 0x8116}, //{0xE8, 0x84, 0x96}, // ��
+ {0xBDC5, 0x811A}, //{0xE8, 0x84, 0x9A}, // ��
+ {0xB8AC, 0x812F}, //{0xE8, 0x84, 0xAF}, // ��
+ {0xCDD1, 0x8131}, //{0xE8, 0x84, 0xB1}, // ��
+ {0xC1B3, 0x8138}, //{0xE8, 0x84, 0xB8}, // s
{0xC6A2, 0x813E}, //{0xE8, 0x84, 0xBE}, // Ƣ
- {0xC0B0, 0x814A}, //{0xE8, 0x85, 0x8A}, // ˡ
+ {0xC0B0, 0x814A}, //{0xE8, 0x85, 0x8A}, // 0
{0xD2B8, 0x814B}, //{0xE8, 0x85, 0x8B}, // Ò¸
- {0xEBE7, 0x814C}, //{0xE8, 0x85, 0x8C}, // ëç
- {0xB8AF, 0x8150}, //{0xE8, 0x85, 0x90}, // ¸¯
+ {0xEBE7, 0x814C}, //{0xE8, 0x85, 0x8C}, // ��
+ {0xB8AF, 0x8150}, //{0xE8, 0x85, 0x90}, // ��
{0xC7BB, 0x8154}, //{0xE8, 0x85, 0x94}, // Ç»
- {0xCDF3, 0x8155}, //{0xE8, 0x85, 0x95}, // Íó
- {0xD0C8, 0x8165}, //{0xE8, 0x85, 0xA5}, // ÐÈ
- {0xC8F9, 0x816E}, //{0xE8, 0x85, 0xAE}, // Èù
- {0xD1FC, 0x8170}, //{0xE8, 0x85, 0xB0}, // Ñü
- {0xB8B9, 0x8179}, //{0xE8, 0x85, 0xB9}, // ¸¹
- {0xCFD9, 0x817A}, //{0xE8, 0x85, 0xBA}, // ÏÙ
- {0xC4E5, 0x817B}, //{0xE8, 0x85, 0xBB}, // Äå
- {0xCCDA, 0x817E}, //{0xE8, 0x85, 0xBE}, // ÌÚ
- {0xCDC8, 0x817F}, //{0xE8, 0x85, 0xBF}, // ÍÈ
- {0xB0F2, 0x8180}, //{0xE8, 0x86, 0x80}, // °ò
- {0xB2B2, 0x818A}, //{0xE8, 0x86, 0x8A}, // ²²
- {0xB8E0, 0x818F}, //{0xE8, 0x86, 0x8F}, // ¸à
- {0xB1EC, 0x8198}, //{0xE8, 0x86, 0x98}, // ±ì
- {0xCCC5, 0x819B}, //{0xE8, 0x86, 0x9B}, // ÌÅ
+ {0xCDF3, 0x8155}, //{0xE8, 0x85, 0x95}, // ��
+ {0xD0C8, 0x8165}, //{0xE8, 0x85, 0xA5}, // ��
+ {0xC8F9, 0x816E}, //{0xE8, 0x85, 0xAE}, // ��
+ {0xD1FC, 0x8170}, //{0xE8, 0x85, 0xB0}, // ��
+ {0xB8B9, 0x8179}, //{0xE8, 0x85, 0xB9}, // ��
+ {0xCFD9, 0x817A}, //{0xE8, 0x85, 0xBA}, // ��
+ {0xC4E5, 0x817B}, //{0xE8, 0x85, 0xBB}, // ��
+ {0xCCDA, 0x817E}, //{0xE8, 0x85, 0xBE}, // ��
+ {0xCDC8, 0x817F}, //{0xE8, 0x85, 0xBF}, // ��
+ {0xB0F2, 0x8180}, //{0xE8, 0x86, 0x80}, // ��
+ {0xB2B2, 0x818A}, //{0xE8, 0x86, 0x8A}, // ��
+ {0xB8E0, 0x818F}, //{0xE8, 0x86, 0x8F}, // ��
+ {0xB1EC, 0x8198}, //{0xE8, 0x86, 0x98}, // ��
+ {0xCCC5, 0x819B}, //{0xE8, 0x86, 0x9B}, // ��
{0xC4A4, 0x819C}, //{0xE8, 0x86, 0x9C}, // Ĥ
{0xCFA5, 0x819D}, //{0xE8, 0x86, 0x9D}, // ϥ
- {0xC5F2, 0x81A8}, //{0xE8, 0x86, 0xA8}, // Åò
- {0xC9C5, 0x81B3}, //{0xE8, 0x86, 0xB3}, // ÉÅ
- {0xCDCE, 0x81C0}, //{0xE8, 0x87, 0x80}, // ÍÎ
- {0xB1DB, 0x81C2}, //{0xE8, 0x87, 0x82}, // ±Û
- {0xEBFD, 0x81CA}, //{0xE8, 0x87, 0x8A}, // ëý
- {0xB3BC, 0x81E3}, //{0xE8, 0x87, 0xA3}, // ³¼
- {0xD7D4, 0x81EA}, //{0xE8, 0x87, 0xAA}, // ×Ô
- {0xB3F4, 0x81ED}, //{0xE8, 0x87, 0xAD}, // ³ô
- {0xD6C1, 0x81F3}, //{0xE8, 0x87, 0xB3}, // ÖÁ
- {0xD6C2, 0x81F4}, //{0xE8, 0x87, 0xB4}, // ÖÂ
- {0xBECA, 0x81FC}, //{0xE8, 0x87, 0xBC}, // ¾Ê
+ {0xC5F2, 0x81A8}, //{0xE8, 0x86, 0xA8}, // ��
+ {0xC9C5, 0x81B3}, //{0xE8, 0x86, 0xB3}, // ��
+ {0xCDCE, 0x81C0}, //{0xE8, 0x87, 0x80}, // ��
+ {0xB1DB, 0x81C2}, //{0xE8, 0x87, 0x82}, // ��
+ {0xEBFD, 0x81CA}, //{0xE8, 0x87, 0x8A}, // ��
+ {0xB3BC, 0x81E3}, //{0xE8, 0x87, 0xA3}, // ��
+ {0xD7D4, 0x81EA}, //{0xE8, 0x87, 0xAA}, // ��
+ {0xB3F4, 0x81ED}, //{0xE8, 0x87, 0xAD}, // ��
+ {0xD6C1, 0x81F3}, //{0xE8, 0x87, 0xB3}, // ��
+ {0xD6C2, 0x81F4}, //{0xE8, 0x87, 0xB4}, // ��
+ {0xBECA, 0x81FC}, //{0xE8, 0x87, 0xBC}, // ��
{0xD2A8, 0x8200}, //{0xE8, 0x88, 0x80}, // Ò¨
- {0xBECB, 0x8205}, //{0xE8, 0x88, 0x85}, // ¾Ë
- {0xD3DF, 0x8206}, //{0xE8, 0x88, 0x86}, // Óß
- {0xC9E0, 0x820C}, //{0xE8, 0x88, 0x8C}, // Éà
- {0xC9E1, 0x820D}, //{0xE8, 0x88, 0x8D}, // Éá
- {0xCAE6, 0x8212}, //{0xE8, 0x88, 0x92}, // Êæ
- {0xCCF2, 0x8214}, //{0xE8, 0x88, 0x94}, // Ìò
- {0xCEE8, 0x821E}, //{0xE8, 0x88, 0x9E}, // Îè
- {0xD6DB, 0x821F}, //{0xE8, 0x88, 0x9F}, // ÖÛ
- {0xBABD, 0x822A}, //{0xE8, 0x88, 0xAA}, // º½
- {0xB0E3, 0x822C}, //{0xE8, 0x88, 0xAC}, // °ã
- {0xBDA2, 0x8230}, //{0xE8, 0x88, 0xB0}, // ½¢
- {0xB2D5, 0x8231}, //{0xE8, 0x88, 0xB1}, // ²Õ
- {0xB6E6, 0x8235}, //{0xE8, 0x88, 0xB5}, // ¶æ
- {0xB2B0, 0x8236}, //{0xE8, 0x88, 0xB6}, // ²°
- {0xCFCF, 0x8237}, //{0xE8, 0x88, 0xB7}, // ÏÏ
- {0xB4AC, 0x8239}, //{0xE8, 0x88, 0xB9}, // ´¬
+ {0xBECB, 0x8205}, //{0xE8, 0x88, 0x85}, // ��
+ {0xD3DF, 0x8206}, //{0xE8, 0x88, 0x86}, // ��
+ {0xC9E0, 0x820C}, //{0xE8, 0x88, 0x8C}, // ��
+ {0xC9E1, 0x820D}, //{0xE8, 0x88, 0x8D}, // ��
+ {0xCAE6, 0x8212}, //{0xE8, 0x88, 0x92}, // ��
+ {0xCCF2, 0x8214}, //{0xE8, 0x88, 0x94}, // ��
+ {0xCEE8, 0x821E}, //{0xE8, 0x88, 0x9E}, // ��
+ {0xD6DB, 0x821F}, //{0xE8, 0x88, 0x9F}, // ��
+ {0xBABD, 0x822A}, //{0xE8, 0x88, 0xAA}, // ��
+ {0xB0E3, 0x822C}, //{0xE8, 0x88, 0xAC}, // ��
+ {0xBDA2, 0x8230}, //{0xE8, 0x88, 0xB0}, // ��
+ {0xB2D5, 0x8231}, //{0xE8, 0x88, 0xB1}, // ��
+ {0xB6E6, 0x8235}, //{0xE8, 0x88, 0xB5}, // ��
+ {0xB2B0, 0x8236}, //{0xE8, 0x88, 0xB6}, // ��
+ {0xCFCF, 0x8237}, //{0xE8, 0x88, 0xB7}, // ��
+ {0xB4AC, 0x8239}, //{0xE8, 0x88, 0xB9}, // ��
{0xCDA7, 0x8247}, //{0xE8, 0x89, 0x87}, // ͧ
- {0xCBD2, 0x8258}, //{0xE8, 0x89, 0x98}, // ËÒ
- {0xC1BC, 0x826F}, //{0xE8, 0x89, 0xAF}, // Á¼
- {0xBCE8, 0x8270}, //{0xE8, 0x89, 0xB0}, // ¼è
+ {0xCBD2, 0x8258}, //{0xE8, 0x89, 0x98}, // ��
+ {0xC1BC, 0x826F}, //{0xE8, 0x89, 0xAF}, // |
+ {0xBCE8, 0x8270}, //{0xE8, 0x89, 0xB0}, // ��
{0xC9AB, 0x8272}, //{0xE8, 0x89, 0xB2}, // É«
- {0xD1DE, 0x8273}, //{0xE8, 0x89, 0xB3}, // ÑÞ
- {0xD2D5, 0x827A}, //{0xE8, 0x89, 0xBA}, // ÒÕ
- {0xB0AC, 0x827E}, //{0xE8, 0x89, 0xBE}, // °¬
- {0xBDDA, 0x8282}, //{0xE8, 0x8A, 0x82}, // ½Ú
- {0xD3F3, 0x828B}, //{0xE8, 0x8A, 0x8B}, // Óó
- {0xC9D6, 0x828D}, //{0xE8, 0x8A, 0x8D}, // ÉÖ
+ {0xD1DE, 0x8273}, //{0xE8, 0x89, 0xB3}, // ��
+ {0xD2D5, 0x827A}, //{0xE8, 0x89, 0xBA}, // ��
+ {0xB0AC, 0x827E}, //{0xE8, 0x89, 0xBE}, // ��
+ {0xBDDA, 0x8282}, //{0xE8, 0x8A, 0x82}, // ��
+ {0xD3F3, 0x828B}, //{0xE8, 0x8A, 0x8B}, // ��
+ {0xC9D6, 0x828D}, //{0xE8, 0x8A, 0x8D}, // ��
{0xC3A2, 0x8292}, //{0xE8, 0x8A, 0x92}, // â
{0xDCBD, 0x8299}, //{0xE8, 0x8A, 0x99}, // ܽ
- {0xCEDF, 0x829C}, //{0xE8, 0x8A, 0x9C}, // Îß
+ {0xCEDF, 0x829C}, //{0xE8, 0x8A, 0x9C}, // ��
{0xD6A5, 0x829D}, //{0xE8, 0x8A, 0x9D}, // Ö¥
- {0xBDE6, 0x82A5}, //{0xE8, 0x8A, 0xA5}, // ½æ
+ {0xBDE6, 0x82A5}, //{0xE8, 0x8A, 0xA5}, // ��
{0xC2AB, 0x82A6}, //{0xE8, 0x8A, 0xA6}, // «
- {0xB7D2, 0x82AC}, //{0xE8, 0x8A, 0xAC}, // ·Ò
- {0xB0C5, 0x82AD}, //{0xE8, 0x8A, 0xAD}, // °Å
+ {0xB7D2, 0x82AC}, //{0xE8, 0x8A, 0xAC}, // ��
+ {0xB0C5, 0x82AD}, //{0xE8, 0x8A, 0xAD}, // ��
{0xD0BE, 0x82AF}, //{0xE8, 0x8A, 0xAF}, // о
- {0xBBA8, 0x82B1}, //{0xE8, 0x8A, 0xB1}, // Ȭ
- {0xB7BC, 0x82B3}, //{0xE8, 0x8A, 0xB3}, // ·¼
- {0xC7DB, 0x82B9}, //{0xE8, 0x8A, 0xB9}, // ÇÛ
+ {0xBBA8, 0x82B1}, //{0xE8, 0x8A, 0xB1}, // ��
+ {0xB7BC, 0x82B3}, //{0xE8, 0x8A, 0xB3}, // ��
+ {0xC7DB, 0x82B9}, //{0xE8, 0x8A, 0xB9}, // ��
{0xD1BF, 0x82BD}, //{0xE8, 0x8A, 0xBD}, // Ñ¿
{0xCEAD, 0x82C7}, //{0xE8, 0x8B, 0x87}, // Î
- {0xB2D4, 0x82CD}, //{0xE8, 0x8B, 0x8D}, // ²Ô
- {0xCBD5, 0x82CF}, //{0xE8, 0x8B, 0x8F}, // ËÕ
+ {0xB2D4, 0x82CD}, //{0xE8, 0x8B, 0x8D}, // ��
+ {0xCBD5, 0x82CF}, //{0xE8, 0x8B, 0x8F}, // ��
{0xCCA6, 0x82D4}, //{0xE8, 0x8B, 0x94}, // ̦
- {0xC3E7, 0x82D7}, //{0xE8, 0x8B, 0x97}, // Ãç
- {0xBFC1, 0x82DB}, //{0xE8, 0x8B, 0x9B}, // ¿Á
- {0xB0FA, 0x82DE}, //{0xE8, 0x8B, 0x9E}, // °ú
- {0xB9B6, 0x82DF}, //{0xE8, 0x8B, 0x9F}, // ¹¶
- {0xC8F4, 0x82E5}, //{0xE8, 0x8B, 0xA5}, // Èô
- {0xBFE0, 0x82E6}, //{0xE8, 0x8B, 0xA6}, // ¿à
+ {0xC3E7, 0x82D7}, //{0xE8, 0x8B, 0x97}, // ��
+ {0xBFC1, 0x82DB}, //{0xE8, 0x8B, 0x9B}, // ��
+ {0xB0FA, 0x82DE}, //{0xE8, 0x8B, 0x9E}, // ��
+ {0xB9B6, 0x82DF}, //{0xE8, 0x8B, 0x9F}, // ��
+ {0xC8F4, 0x82E5}, //{0xE8, 0x8B, 0xA5}, // ��
+ {0xBFE0, 0x82E6}, //{0xE8, 0x8B, 0xA6}, // ��
{0xC9BB, 0x82EB}, //{0xE8, 0x8B, 0xAB}, // É»
{0xD3A2, 0x82F1}, //{0xE8, 0x8B, 0xB1}, // Ó¢
{0xC6BB, 0x82F9}, //{0xE8, 0x8B, 0xB9}, // Æ»
- {0xD7C2, 0x8301}, //{0xE8, 0x8C, 0x81}, // ×Â
+ {0xD7C2, 0x8301}, //{0xE8, 0x8C, 0x81}, // ��
{0xC3AF, 0x8302}, //{0xE8, 0x8C, 0x82}, // ï
- {0xB7B6, 0x8303}, //{0xE8, 0x8C, 0x83}, // ·¶
- {0xC7D1, 0x8304}, //{0xE8, 0x8C, 0x84}, // ÇÑ
+ {0xB7B6, 0x8303}, //{0xE8, 0x8C, 0x83}, // ��
+ {0xC7D1, 0x8304}, //{0xE8, 0x8C, 0x84}, // ��
{0xC3A9, 0x8305}, //{0xE8, 0x8C, 0x85}, // é
- {0xDCD4, 0x8309}, //{0xE8, 0x8C, 0x89}, // ÜÔ
- {0xBEA5, 0x830E}, //{0xE8, 0x8C, 0x8E}, // ¾¥
- {0xBCEB, 0x8327}, //{0xE8, 0x8C, 0xA7}, // ¼ë
+ {0xDCD4, 0x8309}, //{0xE8, 0x8C, 0x89}, // ��
+ {0xBEA5, 0x830E}, //{0xE8, 0x8C, 0x8E}, // ��
+ {0xBCEB, 0x8327}, //{0xE8, 0x8C, 0xA7}, // ��
{0xC3A3, 0x832B}, //{0xE8, 0x8C, 0xAB}, // ã
- {0xB2E7, 0x832C}, //{0xE8, 0x8C, 0xAC}, // ²ç
- {0xDCEE, 0x8334}, //{0xE8, 0x8C, 0xB4}, // Üî
- {0xD2F0, 0x8335}, //{0xE8, 0x8C, 0xB5}, // Òð
- {0xB2E8, 0x8336}, //{0xE8, 0x8C, 0xB6}, // ²è
- {0xC8D7, 0x8338}, //{0xE8, 0x8C, 0xB8}, // È×
- {0xBEA3, 0x8346}, //{0xE8, 0x8D, 0x86}, // ¾£
- {0xB2DD, 0x8349}, //{0xE8, 0x8D, 0x89}, // ²Ý
- {0xBCF6, 0x8350}, //{0xE8, 0x8D, 0x90}, // ¼ö
- {0xBBC4, 0x8352}, //{0xE8, 0x8D, 0x92}, // Ȁ
- {0xC0F3, 0x8354}, //{0xE8, 0x8D, 0x94}, // Àó
- {0xBCD4, 0x835A}, //{0xE8, 0x8D, 0x9A}, // ¼Ô
- {0xDCF1, 0x835E}, //{0xE8, 0x8D, 0x9E}, // Üñ
- {0xDCF9, 0x8360}, //{0xE8, 0x8D, 0xA0}, // Üù
- {0xB5B4, 0x8361}, //{0xE8, 0x8D, 0xA1}, // µ´
- {0xC8D9, 0x8363}, //{0xE8, 0x8D, 0xA3}, // ÈÙ
- {0xBBE7, 0x8364}, //{0xE8, 0x8D, 0xA4}, // ȍ
+ {0xB2E7, 0x832C}, //{0xE8, 0x8C, 0xAC}, // ��
+ {0xDCEE, 0x8334}, //{0xE8, 0x8C, 0xB4}, // ��
+ {0xD2F0, 0x8335}, //{0xE8, 0x8C, 0xB5}, // ��
+ {0xB2E8, 0x8336}, //{0xE8, 0x8C, 0xB6}, // ��
+ {0xC8D7, 0x8338}, //{0xE8, 0x8C, 0xB8}, // ��
+ {0xBEA3, 0x8346}, //{0xE8, 0x8D, 0x86}, // ��
+ {0xB2DD, 0x8349}, //{0xE8, 0x8D, 0x89}, // ��
+ {0xBCF6, 0x8350}, //{0xE8, 0x8D, 0x90}, // ��
+ {0xBBC4, 0x8352}, //{0xE8, 0x8D, 0x92}, // ��
+ {0xC0F3, 0x8354}, //{0xE8, 0x8D, 0x94}, // ��
+ {0xBCD4, 0x835A}, //{0xE8, 0x8D, 0x9A}, // ��
+ {0xDCF1, 0x835E}, //{0xE8, 0x8D, 0x9E}, // ��
+ {0xDCF9, 0x8360}, //{0xE8, 0x8D, 0xA0}, // ��
+ {0xB5B4, 0x8361}, //{0xE8, 0x8D, 0xA1}, // ��
+ {0xC8D9, 0x8363}, //{0xE8, 0x8D, 0xA3}, // ��
+ {0xBBE7, 0x8364}, //{0xE8, 0x8D, 0xA4}, // ��
{0xD3AB, 0x8367}, //{0xE8, 0x8D, 0xA7}, // Ó«
{0xD2A9, 0x836F}, //{0xE8, 0x8D, 0xAF}, // Ò©
- {0xBAC9, 0x8377}, //{0xE8, 0x8D, 0xB7}, // ºÉ
+ {0xBAC9, 0x8377}, //{0xE8, 0x8D, 0xB7}, // ��
{0xDDA9, 0x8378}, //{0xE8, 0x8D, 0xB8}, // Ý©
- {0xC0F2, 0x8389}, //{0xE8, 0x8E, 0x89}, // Àò
+ {0xC0F2, 0x8389}, //{0xE8, 0x8E, 0x89}, // ��
{0xC4AA, 0x83AB}, //{0xE8, 0x8E, 0xAB}, // Ī
- {0xC0B3, 0x83B1}, //{0xE8, 0x8E, 0xB1}, // À³
- {0xC1AB, 0x83B2}, //{0xE8, 0x8E, 0xB2}, // Á«
- {0xBBF1, 0x83B7}, //{0xE8, 0x8E, 0xB7}, // Ȗ
+ {0xC0B3, 0x83B1}, //{0xE8, 0x8E, 0xB1}, // 3
+ {0xC1AB, 0x83B2}, //{0xE8, 0x8E, 0xB2}, // k
+ {0xBBF1, 0x83B7}, //{0xE8, 0x8E, 0xB7}, // ��
{0xD3A8, 0x83B9}, //{0xE8, 0x8E, 0xB9}, // Ó¨
{0xDDBA, 0x83BA}, //{0xE8, 0x8E, 0xBA}, // ݺ
{0xC3A7, 0x83BD}, //{0xE8, 0x8E, 0xBD}, // ç
- {0xB9BD, 0x83C7}, //{0xE8, 0x8F, 0x87}, // ¹½
- {0xBED5, 0x83CA}, //{0xE8, 0x8F, 0x8A}, // ¾Õ
- {0xBEFA, 0x83CC}, //{0xE8, 0x8F, 0x8C}, // ¾ú
- {0xB2CB, 0x83DC}, //{0xE8, 0x8F, 0x9C}, // ²Ë
- {0xB2A4, 0x83E0}, //{0xE8, 0x8F, 0xA0}, // ²¤
- {0xC6D0, 0x83E9}, //{0xE8, 0x8F, 0xA9}, // ÆÐ
- {0xC1E2, 0x83F1}, //{0xE8, 0x8F, 0xB1}, // Áâ
- {0xB7C6, 0x83F2}, //{0xE8, 0x8F, 0xB2}, // ·Æ
- {0xCCD1, 0x8404}, //{0xE8, 0x90, 0x84}, // ÌÑ
- {0xC3C8, 0x840C}, //{0xE8, 0x90, 0x8C}, // ÃÈ
+ {0xB9BD, 0x83C7}, //{0xE8, 0x8F, 0x87}, // ��
+ {0xBED5, 0x83CA}, //{0xE8, 0x8F, 0x8A}, // ��
+ {0xBEFA, 0x83CC}, //{0xE8, 0x8F, 0x8C}, // ��
+ {0xB2CB, 0x83DC}, //{0xE8, 0x8F, 0x9C}, // ��
+ {0xB2A4, 0x83E0}, //{0xE8, 0x8F, 0xA0}, // ��
+ {0xC6D0, 0x83E9}, //{0xE8, 0x8F, 0xA9}, // ��
+ {0xC1E2, 0x83F1}, //{0xE8, 0x8F, 0xB1}, // ��
+ {0xB7C6, 0x83F2}, //{0xE8, 0x8F, 0xB2}, // ��
+ {0xCCD1, 0x8404}, //{0xE8, 0x90, 0x84}, // ��
+ {0xC3C8, 0x840C}, //{0xE8, 0x90, 0x8C}, // ��
{0xC6BC, 0x840D}, //{0xE8, 0x90, 0x8D}, // Ƽ
{0xCEAE, 0x840E}, //{0xE8, 0x90, 0x8E}, // ή
- {0xC2DC, 0x841D}, //{0xE8, 0x90, 0x9D}, // ÂÜ
+ {0xC2DC, 0x841D}, //{0xE8, 0x90, 0x9D}, // ��
{0xD3A9, 0x8424}, //{0xE8, 0x90, 0xA4}, // Ó©
{0xD3AA, 0x8425}, //{0xE8, 0x90, 0xA5}, // Óª
- {0xCFF4, 0x8427}, //{0xE8, 0x90, 0xA7}, // Ïô
- {0xC8F8, 0x8428}, //{0xE8, 0x90, 0xA8}, // Èø
- {0xC2E4, 0x843D}, //{0xE8, 0x90, 0xBD}, // Âä
- {0xD6F8, 0x8457}, //{0xE8, 0x91, 0x97}, // Öø
- {0xB8F0, 0x845B}, //{0xE8, 0x91, 0x9B}, // ¸ð
- {0xC6CF, 0x8461}, //{0xE8, 0x91, 0xA1}, // ÆÏ
- {0xB6AD, 0x8463}, //{0xE8, 0x91, 0xA3}, // ¶
- {0xBAF9, 0x846B}, //{0xE8, 0x91, 0xAB}, // ºù
- {0xD4E1, 0x846C}, //{0xE8, 0x91, 0xAC}, // Ôá
- {0xB4D0, 0x8471}, //{0xE8, 0x91, 0xB1}, // ´Ð
- {0xBFFB, 0x8475}, //{0xE8, 0x91, 0xB5}, // ¿û
- {0xB5D9, 0x8482}, //{0xE8, 0x92, 0x82}, // µÙ
- {0xBDAF, 0x848B}, //{0xE8, 0x92, 0x8B}, // ½¯
- {0xC3C9, 0x8499}, //{0xE8, 0x92, 0x99}, // ÃÉ
- {0xCBE2, 0x849C}, //{0xE8, 0x92, 0x9C}, // Ëâ
- {0xC6D1, 0x84B2}, //{0xE8, 0x92, 0xB2}, // ÆÑ
- {0xD5F4, 0x84B8}, //{0xE8, 0x92, 0xB8}, // Õô
- {0xDDEF, 0x84BF}, //{0xE8, 0x92, 0xBF}, // Ýï
- {0xD0EE, 0x84C4}, //{0xE8, 0x93, 0x84}, // Ðî
- {0xC8D8, 0x84C9}, //{0xE8, 0x93, 0x89}, // ÈØ
- {0xB1CD, 0x84D6}, //{0xE8, 0x93, 0x96}, // ±Í
- {0xC0B6, 0x84DD}, //{0xE8, 0x93, 0x9D}, // ˦
- {0xC5EE, 0x84EC}, //{0xE8, 0x93, 0xAC}, // Åî
- {0xC3EF, 0x8511}, //{0xE8, 0x94, 0x91}, // Ãï
- {0xC2FB, 0x8513}, //{0xE8, 0x94, 0x93}, // Âû
- {0xD5E1, 0x8517}, //{0xE8, 0x94, 0x97}, // Õá
+ {0xCFF4, 0x8427}, //{0xE8, 0x90, 0xA7}, // ��
+ {0xC8F8, 0x8428}, //{0xE8, 0x90, 0xA8}, // ��
+ {0xC2E4, 0x843D}, //{0xE8, 0x90, 0xBD}, // ��
+ {0xD6F8, 0x8457}, //{0xE8, 0x91, 0x97}, // ��
+ {0xB8F0, 0x845B}, //{0xE8, 0x91, 0x9B}, // ��
+ {0xC6CF, 0x8461}, //{0xE8, 0x91, 0xA1}, // ��
+ {0xB6AD, 0x8463}, //{0xE8, 0x91, 0xA3}, // ��
+ {0xBAF9, 0x846B}, //{0xE8, 0x91, 0xAB}, // ��
+ {0xD4E1, 0x846C}, //{0xE8, 0x91, 0xAC}, // ��
+ {0xB4D0, 0x8471}, //{0xE8, 0x91, 0xB1}, // ��
+ {0xBFFB, 0x8475}, //{0xE8, 0x91, 0xB5}, // ��
+ {0xB5D9, 0x8482}, //{0xE8, 0x92, 0x82}, // ��
+ {0xBDAF, 0x848B}, //{0xE8, 0x92, 0x8B}, // ��
+ {0xC3C9, 0x8499}, //{0xE8, 0x92, 0x99}, // ��
+ {0xCBE2, 0x849C}, //{0xE8, 0x92, 0x9C}, // ��
+ {0xC6D1, 0x84B2}, //{0xE8, 0x92, 0xB2}, // ��
+ {0xD5F4, 0x84B8}, //{0xE8, 0x92, 0xB8}, // ��
+ {0xDDEF, 0x84BF}, //{0xE8, 0x92, 0xBF}, // ��
+ {0xD0EE, 0x84C4}, //{0xE8, 0x93, 0x84}, // ��
+ {0xC8D8, 0x84C9}, //{0xE8, 0x93, 0x89}, // ��
+ {0xB1CD, 0x84D6}, //{0xE8, 0x93, 0x96}, // ��
+ {0xC0B6, 0x84DD}, //{0xE8, 0x93, 0x9D}, // 6
+ {0xC5EE, 0x84EC}, //{0xE8, 0x93, 0xAC}, // ��
+ {0xC3EF, 0x8511}, //{0xE8, 0x94, 0x91}, // ��
+ {0xC2FB, 0x8513}, //{0xE8, 0x94, 0x93}, // ��
+ {0xD5E1, 0x8517}, //{0xE8, 0x94, 0x97}, // ��
{0xCEB5, 0x851A}, //{0xE8, 0x94, 0x9A}, // ε
- {0xC4E8, 0x852B}, //{0xE8, 0x94, 0xAB}, // Äè
- {0xCADF, 0x852C}, //{0xE8, 0x94, 0xAC}, // Êß
- {0xB0AA, 0x853C}, //{0xE8, 0x94, 0xBC}, // °ª
- {0xB1CE, 0x853D}, //{0xE8, 0x94, 0xBD}, // ±Î
- {0xBDB6, 0x8549}, //{0xE8, 0x95, 0x89}, // ½¶
- {0xC8EF, 0x854A}, //{0xE8, 0x95, 0x8A}, // Èï
- {0xD4CC, 0x8574}, //{0xE8, 0x95, 0xB4}, // ÔÌ
- {0xC0D9, 0x857E}, //{0xE8, 0x95, 0xBE}, // ÀÙ
- {0xB1A1, 0x8584}, //{0xE8, 0x96, 0x84}, // ±¡
+ {0xC4E8, 0x852B}, //{0xE8, 0x94, 0xAB}, // ��
+ {0xCADF, 0x852C}, //{0xE8, 0x94, 0xAC}, // ��
+ {0xB0AA, 0x853C}, //{0xE8, 0x94, 0xBC}, // ��
+ {0xB1CE, 0x853D}, //{0xE8, 0x94, 0xBD}, // ��
+ {0xBDB6, 0x8549}, //{0xE8, 0x95, 0x89}, // ��
+ {0xC8EF, 0x854A}, //{0xE8, 0x95, 0x8A}, // ��
+ {0xD4CC, 0x8574}, //{0xE8, 0x95, 0xB4}, // ��
+ {0xC0D9, 0x857E}, //{0xE8, 0x95, 0xBE}, // ��
+ {0xB1A1, 0x8584}, //{0xE8, 0x96, 0x84}, // ��
{0xDEB1, 0x8587}, //{0xE8, 0x96, 0x87}, // Þ±
{0xD1A6, 0x859B}, //{0xE8, 0x96, 0x9B}, // Ѧ
{0xD0BD, 0x85AA}, //{0xE8, 0x96, 0xAA}, // н
- {0xCAED, 0x85AF}, //{0xE8, 0x96, 0xAF}, // Êí
- {0xB2D8, 0x85CF}, //{0xE8, 0x97, 0x8F}, // ²Ø
- {0xC3EA, 0x85D0}, //{0xE8, 0x97, 0x90}, // Ãê
+ {0xCAED, 0x85AF}, //{0xE8, 0x96, 0xAF}, // ��
+ {0xB2D8, 0x85CF}, //{0xE8, 0x97, 0x8F}, // ��
+ {0xC3EA, 0x85D0}, //{0xE8, 0x97, 0x90}, // ��
{0xC5BA, 0x85D5}, //{0xE8, 0x97, 0x95}, // ź
- {0xCCD9, 0x85E4}, //{0xE8, 0x97, 0xA4}, // ÌÙ
- {0xD4E5, 0x85FB}, //{0xE8, 0x97, 0xBB}, // Ôå
+ {0xCCD9, 0x85E4}, //{0xE8, 0x97, 0xA4}, // ��
+ {0xD4E5, 0x85FB}, //{0xE8, 0x97, 0xBB}, // ��
{0xC4A2, 0x8611}, //{0xE8, 0x98, 0x91}, // Ģ
{0xD5BA, 0x8638}, //{0xE8, 0x98, 0xB8}, // Õº
- {0xBBA2, 0x864E}, //{0xE8, 0x99, 0x8E}, // Ȣ
+ {0xBBA2, 0x864E}, //{0xE8, 0x99, 0x8E}, // ��
{0xC2B2, 0x864F}, //{0xE8, 0x99, 0x8F}, // ²
{0xC5B0, 0x8650}, //{0xE8, 0x99, 0x90}, // Ű
- {0xC2C7, 0x8651}, //{0xE8, 0x99, 0x91}, // ÂÇ
- {0xD0E9, 0x865A}, //{0xE8, 0x99, 0x9A}, // Ðé
- {0xB3E6, 0x866B}, //{0xE8, 0x99, 0xAB}, // ³æ
+ {0xC2C7, 0x8651}, //{0xE8, 0x99, 0x91}, // ��
+ {0xD0E9, 0x865A}, //{0xE8, 0x99, 0x9A}, // ��
+ {0xB3E6, 0x866B}, //{0xE8, 0x99, 0xAB}, // ��
{0xCAAD, 0x8671}, //{0xE8, 0x99, 0xB1}, // Ê
- {0xBAE7, 0x8679}, //{0xE8, 0x99, 0xB9}, // ºç
- {0xCBE4, 0x867D}, //{0xE8, 0x99, 0xBD}, // Ëä
+ {0xBAE7, 0x8679}, //{0xE8, 0x99, 0xB9}, // ��
+ {0xCBE4, 0x867D}, //{0xE8, 0x99, 0xBD}, // ��
{0xCFBA, 0x867E}, //{0xE8, 0x99, 0xBE}, // Ϻ
{0xCAB4, 0x8680}, //{0xE8, 0x9A, 0x80}, // Ê´
- {0xD2CF, 0x8681}, //{0xE8, 0x9A, 0x81}, // ÒÏ
- {0xC2EC, 0x8682}, //{0xE8, 0x9A, 0x82}, // Âì
- {0xCEC3, 0x868A}, //{0xE8, 0x9A, 0x8A}, // ÎÃ
- {0xB0F6, 0x868C}, //{0xE8, 0x9A, 0x8C}, // °ö
- {0xF2BE, 0x8693}, //{0xE8, 0x9A, 0x93}, // ò¾
- {0xB2CF, 0x8695}, //{0xE8, 0x9A, 0x95}, // ²Ï
- {0xD1C1, 0x869C}, //{0xE8, 0x9A, 0x9C}, // ÑÁ
- {0xF2BC, 0x86A3}, //{0xE8, 0x9A, 0xA3}, // ò¼
- {0xD4E9, 0x86A4}, //{0xE8, 0x9A, 0xA4}, // Ôé
- {0xF2BD, 0x86AA}, //{0xE8, 0x9A, 0xAA}, // ò½
- {0xF2C7, 0x86AF}, //{0xE8, 0x9A, 0xAF}, // òÇ
- {0xD6FB, 0x86C0}, //{0xE8, 0x9B, 0x80}, // Öû
- {0xC7F9, 0x86C6}, //{0xE8, 0x9B, 0x86}, // Çù
- {0xC9DF, 0x86C7}, //{0xE8, 0x9B, 0x87}, // Éß
- {0xF2C8, 0x86C9}, //{0xE8, 0x9B, 0x89}, // òÈ
- {0xB5B0, 0x86CB}, //{0xE8, 0x9B, 0x8B}, // µ°
- {0xBBD7, 0x86D4}, //{0xE8, 0x9B, 0x94}, // »×
- {0xCDDC, 0x86D9}, //{0xE8, 0x9B, 0x99}, // ÍÜ
- {0xD6EB, 0x86DB}, //{0xE8, 0x9B, 0x9B}, // Öë
- {0xB8F2, 0x86E4}, //{0xE8, 0x9B, 0xA4}, // ¸ò
- {0xC2F9, 0x86EE}, //{0xE8, 0x9B, 0xAE}, // Âù
+ {0xD2CF, 0x8681}, //{0xE8, 0x9A, 0x81}, // ��
+ {0xC2EC, 0x8682}, //{0xE8, 0x9A, 0x82}, // ��
+ {0xCEC3, 0x868A}, //{0xE8, 0x9A, 0x8A}, // ��
+ {0xB0F6, 0x868C}, //{0xE8, 0x9A, 0x8C}, // ��
+ {0xF2BE, 0x8693}, //{0xE8, 0x9A, 0x93}, // �
+ {0xB2CF, 0x8695}, //{0xE8, 0x9A, 0x95}, // ��
+ {0xD1C1, 0x869C}, //{0xE8, 0x9A, 0x9C}, // ��
+ {0xF2BC, 0x86A3}, //{0xE8, 0x9A, 0xA3}, // �
+ {0xD4E9, 0x86A4}, //{0xE8, 0x9A, 0xA4}, // ��
+ {0xF2BD, 0x86AA}, //{0xE8, 0x9A, 0xAA}, // �
+ {0xF2C7, 0x86AF}, //{0xE8, 0x9A, 0xAF}, // ��
+ {0xD6FB, 0x86C0}, //{0xE8, 0x9B, 0x80}, // ��
+ {0xC7F9, 0x86C6}, //{0xE8, 0x9B, 0x86}, // ��
+ {0xC9DF, 0x86C7}, //{0xE8, 0x9B, 0x87}, // ��
+ {0xF2C8, 0x86C9}, //{0xE8, 0x9B, 0x89}, // ��
+ {0xB5B0, 0x86CB}, //{0xE8, 0x9B, 0x8B}, // ��
+ {0xBBD7, 0x86D4}, //{0xE8, 0x9B, 0x94}, // ��
+ {0xCDDC, 0x86D9}, //{0xE8, 0x9B, 0x99}, // ��
+ {0xD6EB, 0x86DB}, //{0xE8, 0x9B, 0x9B}, // ��
+ {0xB8F2, 0x86E4}, //{0xE8, 0x9B, 0xA4}, // ��
+ {0xC2F9, 0x86EE}, //{0xE8, 0x9B, 0xAE}, // ��
{0xD3BC, 0x86F9}, //{0xE8, 0x9B, 0xB9}, // Ó¼
- {0xB6EA, 0x86FE}, //{0xE8, 0x9B, 0xBE}, // ¶ê
- {0xCAF1, 0x8700}, //{0xE8, 0x9C, 0x80}, // Êñ
- {0xB7E4, 0x8702}, //{0xE8, 0x9C, 0x82}, // ·ä
- {0xF2DA, 0x8708}, //{0xE8, 0x9C, 0x88}, // òÚ
- {0xD1D1, 0x8712}, //{0xE8, 0x9C, 0x92}, // ÑÑ
- {0xF2D1, 0x8713}, //{0xE8, 0x9C, 0x93}, // òÑ
- {0xCDC9, 0x8715}, //{0xE8, 0x9C, 0x95}, // ÍÉ
- {0xCECF, 0x8717}, //{0xE8, 0x9C, 0x97}, // ÎÏ
+ {0xB6EA, 0x86FE}, //{0xE8, 0x9B, 0xBE}, // ��
+ {0xCAF1, 0x8700}, //{0xE8, 0x9C, 0x80}, // ��
+ {0xB7E4, 0x8702}, //{0xE8, 0x9C, 0x82}, // ��
+ {0xF2DA, 0x8708}, //{0xE8, 0x9C, 0x88}, // ��
+ {0xD1D1, 0x8712}, //{0xE8, 0x9C, 0x92}, // ��
+ {0xF2D1, 0x8713}, //{0xE8, 0x9C, 0x93}, // ��
+ {0xCDC9, 0x8715}, //{0xE8, 0x9C, 0x95}, // ��
+ {0xCECF, 0x8717}, //{0xE8, 0x9C, 0x97}, // ��
{0xD6A9, 0x8718}, //{0xE8, 0x9C, 0x98}, // Ö©
- {0xC3DB, 0x871C}, //{0xE8, 0x9C, 0x9C}, // ÃÛ
- {0xC0AF, 0x8721}, //{0xE8, 0x9C, 0xA1}, // À¯
- {0xF2DF, 0x873B}, //{0xE8, 0x9C, 0xBB}, // òß
+ {0xC3DB, 0x871C}, //{0xE8, 0x9C, 0x9C}, // ��
+ {0xC0AF, 0x8721}, //{0xE8, 0x9C, 0xA1}, // /
+ {0xF2DF, 0x873B}, //{0xE8, 0x9C, 0xBB}, // ��
{0xD3AC, 0x8747}, //{0xE8, 0x9D, 0x87}, // Ó¬
- {0xB2F5, 0x8749}, //{0xE8, 0x9D, 0x89}, // ²õ
- {0xF2F2, 0x874C}, //{0xE8, 0x9D, 0x8C}, // òò
+ {0xB2F5, 0x8749}, //{0xE8, 0x9D, 0x89}, // ��
+ {0xF2F2, 0x874C}, //{0xE8, 0x9D, 0x8C}, // ��
{0xD0AB, 0x874E}, //{0xE8, 0x9D, 0x8E}, // Ы
- {0xBBC8, 0x8757}, //{0xE8, 0x9D, 0x97}, // »È
- {0xF2F9, 0x8759}, //{0xE8, 0x9D, 0x99}, // òù
- {0xF2F0, 0x8760}, //{0xE8, 0x9D, 0xA0}, // òð
- {0xBAFB, 0x8774}, //{0xE8, 0x9D, 0xB4}, // ºû
- {0xB5FB, 0x8776}, //{0xE8, 0x9D, 0xB6}, // µû
- {0xF3A6, 0x8783}, //{0xE8, 0x9E, 0x83}, // ó¦
- {0xC8DA, 0x878D}, //{0xE8, 0x9E, 0x8D}, // ÈÚ
- {0xC3F8, 0x879F}, //{0xE8, 0x9E, 0x9F}, // Ãø
- {0xC2DD, 0x87BA}, //{0xE8, 0x9E, 0xBA}, // ÂÝ
- {0xF3B0, 0x87C0}, //{0xE8, 0x9F, 0x80}, // ó°
- {0xF3A1, 0x87C6}, //{0xE8, 0x9F, 0x86}, // ó¡
- {0xF3AC, 0x87CB}, //{0xE8, 0x9F, 0x8B}, // ó¬
+ {0xBBC8, 0x8757}, //{0xE8, 0x9D, 0x97}, // ��
+ {0xF2F9, 0x8759}, //{0xE8, 0x9D, 0x99}, // ��
+ {0xF2F0, 0x8760}, //{0xE8, 0x9D, 0xA0}, // ��
+ {0xBAFB, 0x8774}, //{0xE8, 0x9D, 0xB4}, // ��
+ {0xB5FB, 0x8776}, //{0xE8, 0x9D, 0xB6}, // ��
+ {0xF3A6, 0x8783}, //{0xE8, 0x9E, 0x83}, // �
+ {0xC8DA, 0x878D}, //{0xE8, 0x9E, 0x8D}, // ��
+ {0xC3F8, 0x879F}, //{0xE8, 0x9E, 0x9F}, // ��
+ {0xC2DD, 0x87BA}, //{0xE8, 0x9E, 0xBA}, // ��
+ {0xF3B0, 0x87C0}, //{0xE8, 0x9F, 0x80}, // �
+ {0xF3A1, 0x87C6}, //{0xE8, 0x9F, 0x86}, // �
+ {0xF3AC, 0x87CB}, //{0xE8, 0x9F, 0x8B}, // �
{0xD0B7, 0x87F9}, //{0xE8, 0x9F, 0xB9}, // з
- {0xC8E4, 0x8815}, //{0xE8, 0xA0, 0x95}, // Èä
- {0xB4C0, 0x8822}, //{0xE8, 0xA0, 0xA2}, // ´À
+ {0xC8E4, 0x8815}, //{0xE8, 0xA0, 0x95}, // ��
+ {0xB4C0, 0x8822}, //{0xE8, 0xA0, 0xA2}, // ��
{0xD1AA, 0x8840}, //{0xE8, 0xA1, 0x80}, // Ѫ
- {0xD0C6, 0x8845}, //{0xE8, 0xA1, 0x85}, // ÐÆ
- {0xD0D0, 0x884C}, //{0xE8, 0xA1, 0x8C}, // ÐÐ
- {0xD1DC, 0x884D}, //{0xE8, 0xA1, 0x8D}, // ÑÜ
- {0xCFCE, 0x8854}, //{0xE8, 0xA1, 0x94}, // ÏÎ
- {0xBDD6, 0x8857}, //{0xE8, 0xA1, 0x97}, // ½Ö
- {0xD1C3, 0x8859}, //{0xE8, 0xA1, 0x99}, // ÑÃ
- {0xBAE2, 0x8861}, //{0xE8, 0xA1, 0xA1}, // ºâ
- {0xD2C2, 0x8863}, //{0xE8, 0xA1, 0xA3}, // ÒÂ
- {0xB2B9, 0x8865}, //{0xE8, 0xA1, 0xA5}, // ²¹
- {0xB1ED, 0x8868}, //{0xE8, 0xA1, 0xA8}, // ±í
- {0xF1C3, 0x8869}, //{0xE8, 0xA1, 0xA9}, // ñÃ
- {0xC9C0, 0x886B}, //{0xE8, 0xA1, 0xAB}, // ÉÀ
- {0xB3C4, 0x886C}, //{0xE8, 0xA1, 0xAC}, // ³Ä
+ {0xD0C6, 0x8845}, //{0xE8, 0xA1, 0x85}, // ��
+ {0xD0D0, 0x884C}, //{0xE8, 0xA1, 0x8C}, // ��
+ {0xD1DC, 0x884D}, //{0xE8, 0xA1, 0x8D}, // ��
+ {0xCFCE, 0x8854}, //{0xE8, 0xA1, 0x94}, // ��
+ {0xBDD6, 0x8857}, //{0xE8, 0xA1, 0x97}, // ��
+ {0xD1C3, 0x8859}, //{0xE8, 0xA1, 0x99}, // ��
+ {0xBAE2, 0x8861}, //{0xE8, 0xA1, 0xA1}, // ��
+ {0xD2C2, 0x8863}, //{0xE8, 0xA1, 0xA3}, // ��
+ {0xB2B9, 0x8865}, //{0xE8, 0xA1, 0xA5}, // ��
+ {0xB1ED, 0x8868}, //{0xE8, 0xA1, 0xA8}, // ��
+ {0xF1C3, 0x8869}, //{0xE8, 0xA1, 0xA9}, // ��
+ {0xC9C0, 0x886B}, //{0xE8, 0xA1, 0xAB}, // ��
+ {0xB3C4, 0x886C}, //{0xE8, 0xA1, 0xAC}, // ��
{0xCBA5, 0x8870}, //{0xE8, 0xA1, 0xB0}, // ˥
- {0xD6D4, 0x8877}, //{0xE8, 0xA1, 0xB7}, // ÖÔ
+ {0xD6D4, 0x8877}, //{0xE8, 0xA1, 0xB7}, // ��
{0xD4AC, 0x8881}, //{0xE8, 0xA2, 0x81}, // Ô¬
- {0xB0C0, 0x8884}, //{0xE8, 0xA2, 0x84}, // °À
- {0xB4FC, 0x888B}, //{0xE8, 0xA2, 0x8B}, // ´ü
- {0xC5DB, 0x888D}, //{0xE8, 0xA2, 0x8D}, // ÅÛ
+ {0xB0C0, 0x8884}, //{0xE8, 0xA2, 0x84}, // ��
+ {0xB4FC, 0x888B}, //{0xE8, 0xA2, 0x8B}, // ��
+ {0xC5DB, 0x888D}, //{0xE8, 0xA2, 0x8D}, // ��
{0xCCBB, 0x8892}, //{0xE8, 0xA2, 0x92}, // Ì»
- {0xD0E4, 0x8896}, //{0xE8, 0xA2, 0x96}, // Ðä
- {0xCDE0, 0x889C}, //{0xE8, 0xA2, 0x9C}, // Íà
- {0xB1BB, 0x88AB}, //{0xE8, 0xA2, 0xAB}, // ±»
+ {0xD0E4, 0x8896}, //{0xE8, 0xA2, 0x96}, // ��
+ {0xCDE0, 0x889C}, //{0xE8, 0xA2, 0x9C}, // ��
+ {0xB1BB, 0x88AB}, //{0xE8, 0xA2, 0xAB}, // ��
{0xCFAE, 0x88AD}, //{0xE8, 0xA2, 0xAD}, // Ï®
- {0xB8A4, 0x88B1}, //{0xE8, 0xA2, 0xB1}, // ¸¤
- {0xB2C3, 0x88C1}, //{0xE8, 0xA3, 0x81}, // ²Ã
- {0xC1D1, 0x88C2}, //{0xE8, 0xA3, 0x82}, // ÁÑ
+ {0xB8A4, 0x88B1}, //{0xE8, 0xA2, 0xB1}, // ��
+ {0xB2C3, 0x88C1}, //{0xE8, 0xA3, 0x81}, // ��
+ {0xC1D1, 0x88C2}, //{0xE8, 0xA3, 0x82}, // ��
{0xD7B0, 0x88C5}, //{0xE8, 0xA3, 0x85}, // ×°
- {0xF1C9, 0x88C6}, //{0xE8, 0xA3, 0x86}, // ñÉ
- {0xF1CC, 0x88C9}, //{0xE8, 0xA3, 0x89}, // ñÌ
+ {0xF1C9, 0x88C6}, //{0xE8, 0xA3, 0x86}, // ��
+ {0xF1CC, 0x88C9}, //{0xE8, 0xA3, 0x89}, // ��
{0xD4A3, 0x88D5}, //{0xE8, 0xA3, 0x95}, // Ô£
{0xC8B9, 0x88D9}, //{0xE8, 0xA3, 0x99}, // ȹ
- {0xBFE3, 0x88E4}, //{0xE8, 0xA3, 0xA4}, // ¿ã
- {0xC9D1, 0x88F3}, //{0xE8, 0xA3, 0xB3}, // ÉÑ
- {0xC2E3, 0x88F8}, //{0xE8, 0xA3, 0xB8}, // Âã
- {0xB9FC, 0x88F9}, //{0xE8, 0xA3, 0xB9}, // ¹ü
- {0xB9D3, 0x8902}, //{0xE8, 0xA4, 0x82}, // ¹Ó
- {0xBAD6, 0x8910}, //{0xE8, 0xA4, 0x90}, // ºÖ
- {0xB0FD, 0x8912}, //{0xE8, 0xA4, 0x92}, // °ý
- {0xC8EC, 0x8925}, //{0xE8, 0xA4, 0xA5}, // Èì
- {0xBDF3, 0x895F}, //{0xE8, 0xA5, 0x9F}, // ½ó
- {0xCEF7, 0x897F}, //{0xE8, 0xA5, 0xBF}, // Î÷
+ {0xBFE3, 0x88E4}, //{0xE8, 0xA3, 0xA4}, // ��
+ {0xC9D1, 0x88F3}, //{0xE8, 0xA3, 0xB3}, // ��
+ {0xC2E3, 0x88F8}, //{0xE8, 0xA3, 0xB8}, // ��
+ {0xB9FC, 0x88F9}, //{0xE8, 0xA3, 0xB9}, // ��
+ {0xB9D3, 0x8902}, //{0xE8, 0xA4, 0x82}, // ��
+ {0xBAD6, 0x8910}, //{0xE8, 0xA4, 0x90}, // ��
+ {0xB0FD, 0x8912}, //{0xE8, 0xA4, 0x92}, // ��
+ {0xC8EC, 0x8925}, //{0xE8, 0xA4, 0xA5}, // ��
+ {0xBDF3, 0x895F}, //{0xE8, 0xA5, 0x9F}, // ��
+ {0xCEF7, 0x897F}, //{0xE8, 0xA5, 0xBF}, // ��
{0xD2AA, 0x8981}, //{0xE8, 0xA6, 0x81}, // Òª
- {0xB8B2, 0x8986}, //{0xE8, 0xA6, 0x86}, // ¸²
- {0xBCFB, 0x89C1}, //{0xE8, 0xA7, 0x81}, // ¼û
- {0xB9DB, 0x89C2}, //{0xE8, 0xA7, 0x82}, // ¹Û
- {0xB9E6, 0x89C4}, //{0xE8, 0xA7, 0x84}, // ¹æ
- {0xC3D9, 0x89C5}, //{0xE8, 0xA7, 0x85}, // ÃÙ
- {0xCAD3, 0x89C6}, //{0xE8, 0xA7, 0x86}, // ÊÓ
- {0xC0C0, 0x89C8}, //{0xE8, 0xA7, 0x88}, // ÀÀ
- {0xBEF5, 0x89C9}, //{0xE8, 0xA7, 0x89}, // ¾õ
- {0xBDC7, 0x89D2}, //{0xE8, 0xA7, 0x92}, // ½Ç
- {0xBDE2, 0x89E3}, //{0xE8, 0xA7, 0xA3}, // ½â
- {0xB4A5, 0x89E6}, //{0xE8, 0xA7, 0xA6}, // ´¥
- {0xD1D4, 0x8A00}, //{0xE8, 0xA8, 0x80}, // ÑÔ
- {0xD3FE, 0x8A89}, //{0xE8, 0xAA, 0x89}, // Óþ
- {0xCCDC, 0x8A8A}, //{0xE8, 0xAA, 0x8A}, // ÌÜ
- {0xCAC4, 0x8A93}, //{0xE8, 0xAA, 0x93}, // ÊÄ
- {0xBEAF, 0x8B66}, //{0xE8, 0xAD, 0xA6}, // ¾¯
+ {0xB8B2, 0x8986}, //{0xE8, 0xA6, 0x86}, // ��
+ {0xBCFB, 0x89C1}, //{0xE8, 0xA7, 0x81}, // ��
+ {0xB9DB, 0x89C2}, //{0xE8, 0xA7, 0x82}, // ��
+ {0xB9E6, 0x89C4}, //{0xE8, 0xA7, 0x84}, // ��
+ {0xC3D9, 0x89C5}, //{0xE8, 0xA7, 0x85}, // ��
+ {0xCAD3, 0x89C6}, //{0xE8, 0xA7, 0x86}, // ��
+ {0xC0C0, 0x89C8}, //{0xE8, 0xA7, 0x88}, // ��
+ {0xBEF5, 0x89C9}, //{0xE8, 0xA7, 0x89}, // ��
+ {0xBDC7, 0x89D2}, //{0xE8, 0xA7, 0x92}, // ��
+ {0xBDE2, 0x89E3}, //{0xE8, 0xA7, 0xA3}, // ��
+ {0xB4A5, 0x89E6}, //{0xE8, 0xA7, 0xA6}, // ��
+ {0xD1D4, 0x8A00}, //{0xE8, 0xA8, 0x80}, // ��
+ {0xD3FE, 0x8A89}, //{0xE8, 0xAA, 0x89}, // ��
+ {0xCCDC, 0x8A8A}, //{0xE8, 0xAA, 0x8A}, // ��
+ {0xCAC4, 0x8A93}, //{0xE8, 0xAA, 0x93}, // ��
+ {0xBEAF, 0x8B66}, //{0xE8, 0xAD, 0xA6}, // ��
{0xC6A9, 0x8B6C}, //{0xE8, 0xAD, 0xAC}, // Æ©
- {0xBCC6, 0x8BA1}, //{0xE8, 0xAE, 0xA1}, // ¼Æ
- {0xB6A9, 0x8BA2}, //{0xE8, 0xAE, 0xA2}, // ¶©
- {0xC8CF, 0x8BA4}, //{0xE8, 0xAE, 0xA4}, // ÈÏ
- {0xBCA5, 0x8BA5}, //{0xE8, 0xAE, 0xA5}, // ¼¥
- {0xCCD6, 0x8BA8}, //{0xE8, 0xAE, 0xA8}, // ÌÖ
- {0xC8C3, 0x8BA9}, //{0xE8, 0xAE, 0xA9}, // ÈÃ
+ {0xBCC6, 0x8BA1}, //{0xE8, 0xAE, 0xA1}, // ��
+ {0xB6A9, 0x8BA2}, //{0xE8, 0xAE, 0xA2}, // ��
+ {0xC8CF, 0x8BA4}, //{0xE8, 0xAE, 0xA4}, // ��
+ {0xBCA5, 0x8BA5}, //{0xE8, 0xAE, 0xA5}, // ��
+ {0xCCD6, 0x8BA8}, //{0xE8, 0xAE, 0xA8}, // ��
+ {0xC8C3, 0x8BA9}, //{0xE8, 0xAE, 0xA9}, // ��
{0xD1B5, 0x8BAD}, //{0xE8, 0xAE, 0xAD}, // ѵ
- {0xD2E9, 0x8BAE}, //{0xE8, 0xAE, 0xAE}, // Òé
+ {0xD2E9, 0x8BAE}, //{0xE8, 0xAE, 0xAE}, // ��
{0xD1B6, 0x8BAF}, //{0xE8, 0xAE, 0xAF}, // Ѷ
- {0xBCC7, 0x8BB0}, //{0xE8, 0xAE, 0xB0}, // ¼Ç
- {0xBDB2, 0x8BB2}, //{0xE8, 0xAE, 0xB2}, // ½²
- {0xBBE4, 0x8BB3}, //{0xE8, 0xAE, 0xB3}, // Ȋ
- {0xD1C8, 0x8BB6}, //{0xE8, 0xAE, 0xB6}, // ÑÈ
- {0xD0ED, 0x8BB8}, //{0xE8, 0xAE, 0xB8}, // Ðí
- {0xB6EF, 0x8BB9}, //{0xE8, 0xAE, 0xB9}, // ¶ï
- {0xC2DB, 0x8BBA}, //{0xE8, 0xAE, 0xBA}, // ÂÛ
- {0xCBCF, 0x8BBC}, //{0xE8, 0xAE, 0xBC}, // ËÏ
- {0xB7ED, 0x8BBD}, //{0xE8, 0xAE, 0xBD}, // ·í
- {0xC9E8, 0x8BBE}, //{0xE8, 0xAE, 0xBE}, // Éè
- {0xB7C3, 0x8BBF}, //{0xE8, 0xAE, 0xBF}, // ·Ã
- {0xBEF7, 0x8BC0}, //{0xE8, 0xAF, 0x80}, // ¾÷
+ {0xBCC7, 0x8BB0}, //{0xE8, 0xAE, 0xB0}, // ��
+ {0xBDB2, 0x8BB2}, //{0xE8, 0xAE, 0xB2}, // ��
+ {0xBBE4, 0x8BB3}, //{0xE8, 0xAE, 0xB3}, // ��
+ {0xD1C8, 0x8BB6}, //{0xE8, 0xAE, 0xB6}, // ��
+ {0xD0ED, 0x8BB8}, //{0xE8, 0xAE, 0xB8}, // ��
+ {0xB6EF, 0x8BB9}, //{0xE8, 0xAE, 0xB9}, // ��
+ {0xC2DB, 0x8BBA}, //{0xE8, 0xAE, 0xBA}, // ��
+ {0xCBCF, 0x8BBC}, //{0xE8, 0xAE, 0xBC}, // ��
+ {0xB7ED, 0x8BBD}, //{0xE8, 0xAE, 0xBD}, // ��
+ {0xC9E8, 0x8BBE}, //{0xE8, 0xAE, 0xBE}, // ��
+ {0xB7C3, 0x8BBF}, //{0xE8, 0xAE, 0xBF}, // ��
+ {0xBEF7, 0x8BC0}, //{0xE8, 0xAF, 0x80}, // ��
{0xD6A4, 0x8BC1}, //{0xE8, 0xAF, 0x81}, // Ö¤
- {0xC6C0, 0x8BC4}, //{0xE8, 0xAF, 0x84}, // ÆÀ
- {0xD7E7, 0x8BC5}, //{0xE8, 0xAF, 0x85}, // ×ç
+ {0xC6C0, 0x8BC4}, //{0xE8, 0xAF, 0x84}, // ��
+ {0xD7E7, 0x8BC5}, //{0xE8, 0xAF, 0x85}, // ��
{0xCAB6, 0x8BC6}, //{0xE8, 0xAF, 0x86}, // ʶ
{0xD5A9, 0x8BC8}, //{0xE8, 0xAF, 0x88}, // Õ©
- {0xCBDF, 0x8BC9}, //{0xE8, 0xAF, 0x89}, // Ëß
- {0xD5EF, 0x8BCA}, //{0xE8, 0xAF, 0x8A}, // Õï
- {0xB4CA, 0x8BCD}, //{0xE8, 0xAF, 0x8D}, // ´Ê
- {0xD2EB, 0x8BD1}, //{0xE8, 0xAF, 0x91}, // Òë
- {0xCAD4, 0x8BD5}, //{0xE8, 0xAF, 0x95}, // ÊÔ
+ {0xCBDF, 0x8BC9}, //{0xE8, 0xAF, 0x89}, // ��
+ {0xD5EF, 0x8BCA}, //{0xE8, 0xAF, 0x8A}, // ��
+ {0xB4CA, 0x8BCD}, //{0xE8, 0xAF, 0x8D}, // ��
+ {0xD2EB, 0x8BD1}, //{0xE8, 0xAF, 0x91}, // ��
+ {0xCAD4, 0x8BD5}, //{0xE8, 0xAF, 0x95}, // ��
{0xCAAB, 0x8BD7}, //{0xE8, 0xAF, 0x97}, // Ê«
- {0xB3CF, 0x8BDA}, //{0xE8, 0xAF, 0x9A}, // ³Ï
- {0xBBB0, 0x8BDD}, //{0xE8, 0xAF, 0x9D}, // »°
- {0xB5AE, 0x8BDE}, //{0xE8, 0xAF, 0x9E}, // µ®
- {0xB9EE, 0x8BE1}, //{0xE8, 0xAF, 0xA1}, // ¹î
+ {0xB3CF, 0x8BDA}, //{0xE8, 0xAF, 0x9A}, // ��
+ {0xBBB0, 0x8BDD}, //{0xE8, 0xAF, 0x9D}, // ��
+ {0xB5AE, 0x8BDE}, //{0xE8, 0xAF, 0x9E}, // ��
+ {0xB9EE, 0x8BE1}, //{0xE8, 0xAF, 0xA1}, // ��
{0xD1AF, 0x8BE2}, //{0xE8, 0xAF, 0xA2}, // ѯ
- {0xB8C3, 0x8BE5}, //{0xE8, 0xAF, 0xA5}, // ¸Ã
- {0xCFEA, 0x8BE6}, //{0xE8, 0xAF, 0xA6}, // Ïê
- {0xBDEB, 0x8BEB}, //{0xE8, 0xAF, 0xAB}, // ½ë
- {0xCEDC, 0x8BEC}, //{0xE8, 0xAF, 0xAC}, // ÎÜ
- {0xD3EF, 0x8BED}, //{0xE8, 0xAF, 0xAD}, // Óï
- {0xCEF3, 0x8BEF}, //{0xE8, 0xAF, 0xAF}, // Îó
- {0xD3D5, 0x8BF1}, //{0xE8, 0xAF, 0xB1}, // ÓÕ
- {0xBBE5, 0x8BF2}, //{0xE8, 0xAF, 0xB2}, // Ȍ
+ {0xB8C3, 0x8BE5}, //{0xE8, 0xAF, 0xA5}, // ��
+ {0xCFEA, 0x8BE6}, //{0xE8, 0xAF, 0xA6}, // ��
+ {0xBDEB, 0x8BEB}, //{0xE8, 0xAF, 0xAB}, // ��
+ {0xCEDC, 0x8BEC}, //{0xE8, 0xAF, 0xAC}, // ��
+ {0xD3EF, 0x8BED}, //{0xE8, 0xAF, 0xAD}, // ��
+ {0xCEF3, 0x8BEF}, //{0xE8, 0xAF, 0xAF}, // ��
+ {0xD3D5, 0x8BF1}, //{0xE8, 0xAF, 0xB1}, // ��
+ {0xBBE5, 0x8BF2}, //{0xE8, 0xAF, 0xB2}, // ��
{0xCBB5, 0x8BF4}, //{0xE8, 0xAF, 0xB4}, // ˵
- {0xCBD0, 0x8BF5}, //{0xE8, 0xAF, 0xB5}, // ËÐ
- {0xC7EB, 0x8BF7}, //{0xE8, 0xAF, 0xB7}, // Çë
- {0xD6EE, 0x8BF8}, //{0xE8, 0xAF, 0xB8}, // Öî
+ {0xCBD0, 0x8BF5}, //{0xE8, 0xAF, 0xB5}, // ��
+ {0xC7EB, 0x8BF7}, //{0xE8, 0xAF, 0xB7}, // ��
+ {0xD6EE, 0x8BF8}, //{0xE8, 0xAF, 0xB8}, // ��
{0xC5B5, 0x8BFA}, //{0xE8, 0xAF, 0xBA}, // ŵ
- {0xB6C1, 0x8BFB}, //{0xE8, 0xAF, 0xBB}, // ¶Á
- {0xB7CC, 0x8BFD}, //{0xE8, 0xAF, 0xBD}, // ·Ì
- {0xBFCE, 0x8BFE}, //{0xE8, 0xAF, 0xBE}, // ¿Î
+ {0xB6C1, 0x8BFB}, //{0xE8, 0xAF, 0xBB}, // ��
+ {0xB7CC, 0x8BFD}, //{0xE8, 0xAF, 0xBD}, // ��
+ {0xBFCE, 0x8BFE}, //{0xE8, 0xAF, 0xBE}, // ��
{0xCBAD, 0x8C01}, //{0xE8, 0xB0, 0x81}, // Ë
- {0xB5F7, 0x8C03}, //{0xE8, 0xB0, 0x83}, // µ÷
- {0xC1C2, 0x8C05}, //{0xE8, 0xB0, 0x85}, // ÁÂ
+ {0xB5F7, 0x8C03}, //{0xE8, 0xB0, 0x83}, // ��
+ {0xC1C2, 0x8C05}, //{0xE8, 0xB0, 0x85}, // ��
{0xD7BB, 0x8C06}, //{0xE8, 0xB0, 0x86}, // ×»
{0xCCB8, 0x8C08}, //{0xE8, 0xB0, 0x88}, // ̸
- {0xD2EA, 0x8C0A}, //{0xE8, 0xB0, 0x8A}, // Òê
+ {0xD2EA, 0x8C0A}, //{0xE8, 0xB0, 0x8A}, // ��
{0xC4B1, 0x8C0B}, //{0xE8, 0xB0, 0x8B}, // ı
- {0xB5FD, 0x8C0D}, //{0xE8, 0xB0, 0x8D}, // µý
- {0xBBD1, 0x8C0E}, //{0xE8, 0xB0, 0x8E}, // Ȅ
+ {0xB5FD, 0x8C0D}, //{0xE8, 0xB0, 0x8D}, // ��
+ {0xBBD1, 0x8C0E}, //{0xE8, 0xB0, 0x8E}, // ��
{0xD0B3, 0x8C10}, //{0xE8, 0xB0, 0x90}, // г
- {0xDACB, 0x8C12}, //{0xE8, 0xB0, 0x92}, // ÚË
+ {0xDACB, 0x8C12}, //{0xE8, 0xB0, 0x92}, // ��
{0xCEBD, 0x8C13}, //{0xE8, 0xB0, 0x93}, // ν
- {0xD1E8, 0x8C1A}, //{0xE8, 0xB0, 0x9A}, // Ñè
- {0xC3D5, 0x8C1C}, //{0xE8, 0xB0, 0x9C}, // ÃÕ
+ {0xD1E8, 0x8C1A}, //{0xE8, 0xB0, 0x9A}, // ��
+ {0xC3D5, 0x8C1C}, //{0xE8, 0xB0, 0x9C}, // ��
{0xD0BB, 0x8C22}, //{0xE8, 0xB0, 0xA2}, // л
{0xD2A5, 0x8C23}, //{0xE8, 0xB0, 0xA3}, // Ò¥
- {0xB0F9, 0x8C24}, //{0xE8, 0xB0, 0xA4}, // °ù
+ {0xB0F9, 0x8C24}, //{0xE8, 0xB0, 0xA4}, // ��
{0xC7AB, 0x8C26}, //{0xE8, 0xB0, 0xA6}, // Ç«
- {0xBDF7, 0x8C28}, //{0xE8, 0xB0, 0xA8}, // ½÷
- {0xC3FD, 0x8C2C}, //{0xE8, 0xB0, 0xAC}, // Ãý
+ {0xBDF7, 0x8C28}, //{0xE8, 0xB0, 0xA8}, // ��
+ {0xC3FD, 0x8C2C}, //{0xE8, 0xB0, 0xAC}, // ��
{0xCCB7, 0x8C2D}, //{0xE8, 0xB0, 0xAD}, // Ì·
- {0xC6D7, 0x8C31}, //{0xE8, 0xB0, 0xB1}, // Æ×
+ {0xC6D7, 0x8C31}, //{0xE8, 0xB0, 0xB1}, // ��
{0xC7B4, 0x8C34}, //{0xE8, 0xB0, 0xB4}, // Ç´
- {0xB9C8, 0x8C37}, //{0xE8, 0xB0, 0xB7}, // ¹È
- {0xBBED, 0x8C41}, //{0xE8, 0xB1, 0x81}, // Ȓ
- {0xB6B9, 0x8C46}, //{0xE8, 0xB1, 0x86}, // ¶¹
- {0xCDE3, 0x8C4C}, //{0xE8, 0xB1, 0x8C}, // Íã
- {0xCFF3, 0x8C61}, //{0xE8, 0xB1, 0xA1}, // Ïó
- {0xBAC0, 0x8C6A}, //{0xE8, 0xB1, 0xAA}, // ºÀ
+ {0xB9C8, 0x8C37}, //{0xE8, 0xB0, 0xB7}, // ��
+ {0xBBED, 0x8C41}, //{0xE8, 0xB1, 0x81}, // ��
+ {0xB6B9, 0x8C46}, //{0xE8, 0xB1, 0x86}, // ��
+ {0xCDE3, 0x8C4C}, //{0xE8, 0xB1, 0x8C}, // ��
+ {0xCFF3, 0x8C61}, //{0xE8, 0xB1, 0xA1}, // ��
+ {0xBAC0, 0x8C6A}, //{0xE8, 0xB1, 0xAA}, // ��
{0xD4A5, 0x8C6B}, //{0xE8, 0xB1, 0xAB}, // Ô¥
- {0xB1AA, 0x8C79}, //{0xE8, 0xB1, 0xB9}, // ±ª
- {0xB2F2, 0x8C7A}, //{0xE8, 0xB1, 0xBA}, // ²ò
+ {0xB1AA, 0x8C79}, //{0xE8, 0xB1, 0xB9}, // ��
+ {0xB2F2, 0x8C7A}, //{0xE8, 0xB1, 0xBA}, // ��
{0xC3B2, 0x8C8C}, //{0xE8, 0xB2, 0x8C}, // ò
- {0xB1B4, 0x8D1D}, //{0xE8, 0xB4, 0x9D}, // ±´
- {0xD5EA, 0x8D1E}, //{0xE8, 0xB4, 0x9E}, // Õê
- {0xB8BA, 0x8D1F}, //{0xE8, 0xB4, 0x9F}, // ¸º
- {0xB9B1, 0x8D21}, //{0xE8, 0xB4, 0xA1}, // ¹±
- {0xB2C6, 0x8D22}, //{0xE8, 0xB4, 0xA2}, // ²Æ
- {0xD4F0, 0x8D23}, //{0xE8, 0xB4, 0xA3}, // Ôð
- {0xCFCD, 0x8D24}, //{0xE8, 0xB4, 0xA4}, // ÏÍ
- {0xB0DC, 0x8D25}, //{0xE8, 0xB4, 0xA5}, // °Ü
- {0xD5CB, 0x8D26}, //{0xE8, 0xB4, 0xA6}, // ÕË
- {0xBBF5, 0x8D27}, //{0xE8, 0xB4, 0xA7}, // »õ
- {0xD6CA, 0x8D28}, //{0xE8, 0xB4, 0xA8}, // ÖÊ
- {0xB7B7, 0x8D29}, //{0xE8, 0xB4, 0xA9}, // ··
+ {0xB1B4, 0x8D1D}, //{0xE8, 0xB4, 0x9D}, // ��
+ {0xD5EA, 0x8D1E}, //{0xE8, 0xB4, 0x9E}, // ��
+ {0xB8BA, 0x8D1F}, //{0xE8, 0xB4, 0x9F}, // ��
+ {0xB9B1, 0x8D21}, //{0xE8, 0xB4, 0xA1}, // ��
+ {0xB2C6, 0x8D22}, //{0xE8, 0xB4, 0xA2}, // ��
+ {0xD4F0, 0x8D23}, //{0xE8, 0xB4, 0xA3}, // ��
+ {0xCFCD, 0x8D24}, //{0xE8, 0xB4, 0xA4}, // ��
+ {0xB0DC, 0x8D25}, //{0xE8, 0xB4, 0xA5}, // ��
+ {0xD5CB, 0x8D26}, //{0xE8, 0xB4, 0xA6}, // ��
+ {0xBBF5, 0x8D27}, //{0xE8, 0xB4, 0xA7}, // ��
+ {0xD6CA, 0x8D28}, //{0xE8, 0xB4, 0xA8}, // ��
+ {0xB7B7, 0x8D29}, //{0xE8, 0xB4, 0xA9}, // ��
{0xCCB0, 0x8D2A}, //{0xE8, 0xB4, 0xAA}, // ̰
{0xC6B6, 0x8D2B}, //{0xE8, 0xB4, 0xAB}, // ƶ
- {0xB1E1, 0x8D2C}, //{0xE8, 0xB4, 0xAC}, // ±á
- {0xB9BA, 0x8D2D}, //{0xE8, 0xB4, 0xAD}, // ¹º
- {0xD6FC, 0x8D2E}, //{0xE8, 0xB4, 0xAE}, // Öü
- {0xB9E1, 0x8D2F}, //{0xE8, 0xB4, 0xAF}, // ¹á
- {0xB7A1, 0x8D30}, //{0xE8, 0xB4, 0xB0}, // ·¡
- {0xBCFA, 0x8D31}, //{0xE8, 0xB4, 0xB1}, // ¼ú
- {0xCCF9, 0x8D34}, //{0xE8, 0xB4, 0xB4}, // Ìù
- {0xB9F3, 0x8D35}, //{0xE8, 0xB4, 0xB5}, // ¹ó
+ {0xB1E1, 0x8D2C}, //{0xE8, 0xB4, 0xAC}, // ��
+ {0xB9BA, 0x8D2D}, //{0xE8, 0xB4, 0xAD}, // ��
+ {0xD6FC, 0x8D2E}, //{0xE8, 0xB4, 0xAE}, // ��
+ {0xB9E1, 0x8D2F}, //{0xE8, 0xB4, 0xAF}, // ��
+ {0xB7A1, 0x8D30}, //{0xE8, 0xB4, 0xB0}, // ��
+ {0xBCFA, 0x8D31}, //{0xE8, 0xB4, 0xB1}, // ��
+ {0xCCF9, 0x8D34}, //{0xE8, 0xB4, 0xB4}, // ��
+ {0xB9F3, 0x8D35}, //{0xE8, 0xB4, 0xB5}, // ��
{0xC3B3, 0x8D38}, //{0xE8, 0xB4, 0xB8}, // ó
- {0xB7D1, 0x8D39}, //{0xE8, 0xB4, 0xB9}, // ·Ñ
- {0xBAD8, 0x8D3A}, //{0xE8, 0xB4, 0xBA}, // ºØ
- {0xD4F4, 0x8D3C}, //{0xE8, 0xB4, 0xBC}, // Ôô
- {0xBCD6, 0x8D3E}, //{0xE8, 0xB4, 0xBE}, // ¼Ö
- {0xBBDF, 0x8D3F}, //{0xE8, 0xB4, 0xBF}, // ȧ
- {0xC1DE, 0x8D41}, //{0xE8, 0xB5, 0x81}, // ÁÞ
+ {0xB7D1, 0x8D39}, //{0xE8, 0xB4, 0xB9}, // ��
+ {0xBAD8, 0x8D3A}, //{0xE8, 0xB4, 0xBA}, // ��
+ {0xD4F4, 0x8D3C}, //{0xE8, 0xB4, 0xBC}, // ��
+ {0xBCD6, 0x8D3E}, //{0xE8, 0xB4, 0xBE}, // ��
+ {0xBBDF, 0x8D3F}, //{0xE8, 0xB4, 0xBF}, // ��
+ {0xC1DE, 0x8D41}, //{0xE8, 0xB5, 0x81}, // ��
{0xC2B8, 0x8D42}, //{0xE8, 0xB5, 0x82}, // ¸
- {0xD4DF, 0x8D43}, //{0xE8, 0xB5, 0x83}, // Ôß
- {0xD7CA, 0x8D44}, //{0xE8, 0xB5, 0x84}, // ×Ê
- {0xC9DE, 0x8D4A}, //{0xE8, 0xB5, 0x8A}, // ÉÞ
- {0xB8B3, 0x8D4B}, //{0xE8, 0xB5, 0x8B}, // ¸³
- {0xB6C4, 0x8D4C}, //{0xE8, 0xB5, 0x8C}, // ¶Ä
- {0xCAEA, 0x8D4E}, //{0xE8, 0xB5, 0x8E}, // Êê
- {0xC9CD, 0x8D4F}, //{0xE8, 0xB5, 0x8F}, // ÉÍ
- {0xB4CD, 0x8D50}, //{0xE8, 0xB5, 0x90}, // ´Í
- {0xC5E2, 0x8D54}, //{0xE8, 0xB5, 0x94}, // Åâ
- {0xC0B5, 0x8D56}, //{0xE8, 0xB5, 0x96}, // ˵
+ {0xD4DF, 0x8D43}, //{0xE8, 0xB5, 0x83}, // ��
+ {0xD7CA, 0x8D44}, //{0xE8, 0xB5, 0x84}, // ��
+ {0xC9DE, 0x8D4A}, //{0xE8, 0xB5, 0x8A}, // ��
+ {0xB8B3, 0x8D4B}, //{0xE8, 0xB5, 0x8B}, // ��
+ {0xB6C4, 0x8D4C}, //{0xE8, 0xB5, 0x8C}, // ��
+ {0xCAEA, 0x8D4E}, //{0xE8, 0xB5, 0x8E}, // ��
+ {0xC9CD, 0x8D4F}, //{0xE8, 0xB5, 0x8F}, // ��
+ {0xB4CD, 0x8D50}, //{0xE8, 0xB5, 0x90}, // ��
+ {0xC5E2, 0x8D54}, //{0xE8, 0xB5, 0x94}, // ��
+ {0xC0B5, 0x8D56}, //{0xE8, 0xB5, 0x96}, // 5
{0xD7B8, 0x8D58}, //{0xE8, 0xB5, 0x98}, // ׸
{0xD7AC, 0x8D5A}, //{0xE8, 0xB5, 0x9A}, // ׬
- {0xC8FC, 0x8D5B}, //{0xE8, 0xB5, 0x9B}, // Èü
- {0xD4DE, 0x8D5E}, //{0xE8, 0xB5, 0x9E}, // ÔÞ
- {0xD4F9, 0x8D60}, //{0xE8, 0xB5, 0xA0}, // Ôù
- {0xC9C4, 0x8D61}, //{0xE8, 0xB5, 0xA1}, // ÉÄ
+ {0xC8FC, 0x8D5B}, //{0xE8, 0xB5, 0x9B}, // ��
+ {0xD4DE, 0x8D5E}, //{0xE8, 0xB5, 0x9E}, // ��
+ {0xD4F9, 0x8D60}, //{0xE8, 0xB5, 0xA0}, // ��
+ {0xC9C4, 0x8D61}, //{0xE8, 0xB5, 0xA1}, // ��
{0xD3AE, 0x8D62}, //{0xE8, 0xB5, 0xA2}, // Ó®
- {0xB3E0, 0x8D64}, //{0xE8, 0xB5, 0xA4}, // ³à
- {0xC9E2, 0x8D66}, //{0xE8, 0xB5, 0xA6}, // Éâ
- {0xBAD5, 0x8D6B}, //{0xE8, 0xB5, 0xAB}, // ºÕ
- {0xD7DF, 0x8D70}, //{0xE8, 0xB5, 0xB0}, // ×ß
- {0xB8B0, 0x8D74}, //{0xE8, 0xB5, 0xB4}, // ¸°
- {0xD5D4, 0x8D75}, //{0xE8, 0xB5, 0xB5}, // ÕÔ
- {0xB8CF, 0x8D76}, //{0xE8, 0xB5, 0xB6}, // ¸Ï
- {0xC6F0, 0x8D77}, //{0xE8, 0xB5, 0xB7}, // Æð
- {0xB3C3, 0x8D81}, //{0xE8, 0xB6, 0x81}, // ³Ã
- {0xB3AC, 0x8D85}, //{0xE8, 0xB6, 0x85}, // ³¬
+ {0xB3E0, 0x8D64}, //{0xE8, 0xB5, 0xA4}, // ��
+ {0xC9E2, 0x8D66}, //{0xE8, 0xB5, 0xA6}, // ��
+ {0xBAD5, 0x8D6B}, //{0xE8, 0xB5, 0xAB}, // ��
+ {0xD7DF, 0x8D70}, //{0xE8, 0xB5, 0xB0}, // ��
+ {0xB8B0, 0x8D74}, //{0xE8, 0xB5, 0xB4}, // ��
+ {0xD5D4, 0x8D75}, //{0xE8, 0xB5, 0xB5}, // ��
+ {0xB8CF, 0x8D76}, //{0xE8, 0xB5, 0xB6}, // ��
+ {0xC6F0, 0x8D77}, //{0xE8, 0xB5, 0xB7}, // ��
+ {0xB3C3, 0x8D81}, //{0xE8, 0xB6, 0x81}, // ��
+ {0xB3AC, 0x8D85}, //{0xE8, 0xB6, 0x85}, // ��
{0xD4BD, 0x8D8A}, //{0xE8, 0xB6, 0x8A}, // Ô½
- {0xC7F7, 0x8D8B}, //{0xE8, 0xB6, 0x8B}, // Ç÷
- {0xCCCB, 0x8D9F}, //{0xE8, 0xB6, 0x9F}, // ÌË
+ {0xC7F7, 0x8D8B}, //{0xE8, 0xB6, 0x8B}, // ��
+ {0xCCCB, 0x8D9F}, //{0xE8, 0xB6, 0x9F}, // ��
{0xC8A4, 0x8DA3}, //{0xE8, 0xB6, 0xA3}, // Ȥ
- {0xD7E3, 0x8DB3}, //{0xE8, 0xB6, 0xB3}, // ×ã
+ {0xD7E3, 0x8DB3}, //{0xE8, 0xB6, 0xB3}, // ��
{0xC5BF, 0x8DB4}, //{0xE8, 0xB6, 0xB4}, // Å¿
{0xD6BA, 0x8DBE}, //{0xE8, 0xB6, 0xBE}, // Öº
{0xD4BE, 0x8DC3}, //{0xE8, 0xB7, 0x83}, // Ô¾
- {0xB0CF, 0x8DCB}, //{0xE8, 0xB7, 0x8B}, // °Ï
- {0xB5F8, 0x8DCC}, //{0xE8, 0xB7, 0x8C}, // µø
- {0xC5DC, 0x8DD1}, //{0xE8, 0xB7, 0x91}, // ÅÜ
- {0xF5CB, 0x8DDB}, //{0xE8, 0xB7, 0x9B}, // õË
- {0xBEE0, 0x8DDD}, //{0xE8, 0xB7, 0x9D}, // ¾à
- {0xB8FA, 0x8DDF}, //{0xE8, 0xB7, 0x9F}, // ¸ú
- {0xBFE7, 0x8DE8}, //{0xE8, 0xB7, 0xA8}, // ¿ç
- {0xB9F2, 0x8DEA}, //{0xE8, 0xB7, 0xAA}, // ¹ò
+ {0xB0CF, 0x8DCB}, //{0xE8, 0xB7, 0x8B}, // ��
+ {0xB5F8, 0x8DCC}, //{0xE8, 0xB7, 0x8C}, // ��
+ {0xC5DC, 0x8DD1}, //{0xE8, 0xB7, 0x91}, // ��
+ {0xF5CB, 0x8DDB}, //{0xE8, 0xB7, 0x9B}, // ��
+ {0xBEE0, 0x8DDD}, //{0xE8, 0xB7, 0x9D}, // ��
+ {0xB8FA, 0x8DDF}, //{0xE8, 0xB7, 0x9F}, // ��
+ {0xBFE7, 0x8DE8}, //{0xE8, 0xB7, 0xA8}, // ��
+ {0xB9F2, 0x8DEA}, //{0xE8, 0xB7, 0xAA}, // ��
{0xC2B7, 0x8DEF}, //{0xE8, 0xB7, 0xAF}, // ·
- {0xCCF8, 0x8DF3}, //{0xE8, 0xB7, 0xB3}, // Ìø
- {0xBCF9, 0x8DF5}, //{0xE8, 0xB7, 0xB5}, // ¼ù
- {0xF5CE, 0x8DF7}, //{0xE8, 0xB7, 0xB7}, // õÎ
- {0xB6E5, 0x8DFA}, //{0xE8, 0xB7, 0xBA}, // ¶å
+ {0xCCF8, 0x8DF3}, //{0xE8, 0xB7, 0xB3}, // ��
+ {0xBCF9, 0x8DF5}, //{0xE8, 0xB7, 0xB5}, // ��
+ {0xF5CE, 0x8DF7}, //{0xE8, 0xB7, 0xB7}, // ��
+ {0xB6E5, 0x8DFA}, //{0xE8, 0xB7, 0xBA}, // ��
{0xD3BB, 0x8E0A}, //{0xE8, 0xB8, 0x8A}, // Ó»
{0xCCA4, 0x8E0F}, //{0xE8, 0xB8, 0x8F}, // ̤
- {0xCCDF, 0x8E22}, //{0xE8, 0xB8, 0xA2}, // Ìß
- {0xB2C8, 0x8E29}, //{0xE8, 0xB8, 0xA9}, // ²È
- {0xD7D9, 0x8E2A}, //{0xE8, 0xB8, 0xAA}, // ×Ù
- {0xF5E2, 0x8E31}, //{0xE8, 0xB8, 0xB1}, // õâ
- {0xF5E5, 0x8E42}, //{0xE8, 0xB9, 0x82}, // õå
- {0xCCE3, 0x8E44}, //{0xE8, 0xB9, 0x84}, // Ìã
- {0xB5B8, 0x8E48}, //{0xE8, 0xB9, 0x88}, // µ¸
+ {0xCCDF, 0x8E22}, //{0xE8, 0xB8, 0xA2}, // ��
+ {0xB2C8, 0x8E29}, //{0xE8, 0xB8, 0xA9}, // ��
+ {0xD7D9, 0x8E2A}, //{0xE8, 0xB8, 0xAA}, // ��
+ {0xF5E2, 0x8E31}, //{0xE8, 0xB8, 0xB1}, // ��
+ {0xF5E5, 0x8E42}, //{0xE8, 0xB9, 0x82}, // ��
+ {0xCCE3, 0x8E44}, //{0xE8, 0xB9, 0x84}, // ��
+ {0xB5B8, 0x8E48}, //{0xE8, 0xB9, 0x88}, // ��
{0xCCA3, 0x8E4B}, //{0xE8, 0xB9, 0x8B}, // ̣
- {0xB1C4, 0x8E66}, //{0xE8, 0xB9, 0xA6}, // ±Ä
- {0xB5C5, 0x8E6C}, //{0xE8, 0xB9, 0xAC}, // µÅ
- {0xB2E4, 0x8E6D}, //{0xE8, 0xB9, 0xAD}, // ²ä
- {0xB6D7, 0x8E72}, //{0xE8, 0xB9, 0xB2}, // ¶×
- {0xD4EA, 0x8E81}, //{0xE8, 0xBA, 0x81}, // Ôê
- {0xF5EF, 0x8E8F}, //{0xE8, 0xBA, 0x8F}, // õï
- {0xC9ED, 0x8EAB}, //{0xE8, 0xBA, 0xAB}, // Éí
- {0xB9AA, 0x8EAC}, //{0xE8, 0xBA, 0xAC}, // ¹ª
- {0xC7FB, 0x8EAF}, //{0xE8, 0xBA, 0xAF}, // Çû
- {0xB6E3, 0x8EB2}, //{0xE8, 0xBA, 0xB2}, // ¶ã
- {0xCCC9, 0x8EBA}, //{0xE8, 0xBA, 0xBA}, // ÌÉ
- {0xB3B5, 0x8F66}, //{0xE8, 0xBD, 0xA6}, // ³µ
- {0xD4FE, 0x8F67}, //{0xE8, 0xBD, 0xA7}, // Ôþ
- {0xB9EC, 0x8F68}, //{0xE8, 0xBD, 0xA8}, // ¹ì
- {0xD0F9, 0x8F69}, //{0xE8, 0xBD, 0xA9}, // Ðù
+ {0xB1C4, 0x8E66}, //{0xE8, 0xB9, 0xA6}, // ��
+ {0xB5C5, 0x8E6C}, //{0xE8, 0xB9, 0xAC}, // ��
+ {0xB2E4, 0x8E6D}, //{0xE8, 0xB9, 0xAD}, // ��
+ {0xB6D7, 0x8E72}, //{0xE8, 0xB9, 0xB2}, // ��
+ {0xD4EA, 0x8E81}, //{0xE8, 0xBA, 0x81}, // ��
+ {0xF5EF, 0x8E8F}, //{0xE8, 0xBA, 0x8F}, // ��
+ {0xC9ED, 0x8EAB}, //{0xE8, 0xBA, 0xAB}, // ��
+ {0xB9AA, 0x8EAC}, //{0xE8, 0xBA, 0xAC}, // ��
+ {0xC7FB, 0x8EAF}, //{0xE8, 0xBA, 0xAF}, // ��
+ {0xB6E3, 0x8EB2}, //{0xE8, 0xBA, 0xB2}, // ��
+ {0xCCC9, 0x8EBA}, //{0xE8, 0xBA, 0xBA}, // ��
+ {0xB3B5, 0x8F66}, //{0xE8, 0xBD, 0xA6}, // ��
+ {0xD4FE, 0x8F67}, //{0xE8, 0xBD, 0xA7}, // ��
+ {0xB9EC, 0x8F68}, //{0xE8, 0xBD, 0xA8}, // ��
+ {0xD0F9, 0x8F69}, //{0xE8, 0xBD, 0xA9}, // ��
{0xD7AA, 0x8F6C}, //{0xE8, 0xBD, 0xAC}, // ת
- {0xC2D6, 0x8F6E}, //{0xE8, 0xBD, 0xAE}, // ÂÖ
- {0xC8ED, 0x8F6F}, //{0xE8, 0xBD, 0xAF}, // Èí
- {0xBAE4, 0x8F70}, //{0xE8, 0xBD, 0xB0}, // ºä
- {0xD6E1, 0x8F74}, //{0xE8, 0xBD, 0xB4}, // Öá
- {0xC7E1, 0x8F7B}, //{0xE8, 0xBD, 0xBB}, // Çá
- {0xD4D8, 0x8F7D}, //{0xE8, 0xBD, 0xBD}, // ÔØ
- {0xBDCE, 0x8F7F}, //{0xE8, 0xBD, 0xBF}, // ½Î
- {0xBDCF, 0x8F83}, //{0xE8, 0xBE, 0x83}, // ½Ï
- {0xB8A8, 0x8F85}, //{0xE8, 0xBE, 0x85}, // ¸¨
- {0xC1BE, 0x8F86}, //{0xE8, 0xBE, 0x86}, // Á¾
- {0xB1B2, 0x8F88}, //{0xE8, 0xBE, 0x88}, // ±²
- {0xBBD4, 0x8F89}, //{0xE8, 0xBE, 0x89}, // »Ô
- {0xB7F8, 0x8F90}, //{0xE8, 0xBE, 0x90}, // ·ø
- {0xBCAD, 0x8F91}, //{0xE8, 0xBE, 0x91}, // ¼
- {0xCAE4, 0x8F93}, //{0xE8, 0xBE, 0x93}, // Êä
+ {0xC2D6, 0x8F6E}, //{0xE8, 0xBD, 0xAE}, // ��
+ {0xC8ED, 0x8F6F}, //{0xE8, 0xBD, 0xAF}, // ��
+ {0xBAE4, 0x8F70}, //{0xE8, 0xBD, 0xB0}, // ��
+ {0xD6E1, 0x8F74}, //{0xE8, 0xBD, 0xB4}, // ��
+ {0xC7E1, 0x8F7B}, //{0xE8, 0xBD, 0xBB}, // ��
+ {0xD4D8, 0x8F7D}, //{0xE8, 0xBD, 0xBD}, // ��
+ {0xBDCE, 0x8F7F}, //{0xE8, 0xBD, 0xBF}, // ��
+ {0xBDCF, 0x8F83}, //{0xE8, 0xBE, 0x83}, // ��
+ {0xB8A8, 0x8F85}, //{0xE8, 0xBE, 0x85}, // ��
+ {0xC1BE, 0x8F86}, //{0xE8, 0xBE, 0x86}, // ~
+ {0xB1B2, 0x8F88}, //{0xE8, 0xBE, 0x88}, // ��
+ {0xBBD4, 0x8F89}, //{0xE8, 0xBE, 0x89}, // ��
+ {0xB7F8, 0x8F90}, //{0xE8, 0xBE, 0x90}, // ��
+ {0xBCAD, 0x8F91}, //{0xE8, 0xBE, 0x91}, // ��
+ {0xCAE4, 0x8F93}, //{0xE8, 0xBE, 0x93}, // ��
{0xD4AF, 0x8F95}, //{0xE8, 0xBE, 0x95}, // Ô¯
{0xCFBD, 0x8F96}, //{0xE8, 0xBE, 0x96}, // Ͻ
- {0xD5DE, 0x8F99}, //{0xE8, 0xBE, 0x99}, // ÕÞ
- {0xD0C1, 0x8F9B}, //{0xE8, 0xBE, 0x9B}, // ÐÁ
- {0xB9BC, 0x8F9C}, //{0xE8, 0xBE, 0x9C}, // ¹¼
- {0xB4C7, 0x8F9E}, //{0xE8, 0xBE, 0x9E}, // ´Ç
- {0xB1D9, 0x8F9F}, //{0xE8, 0xBE, 0x9F}, // ±Ù
- {0xC0B1, 0x8FA3}, //{0xE8, 0xBE, 0xA3}, // ˱
- {0xB1E6, 0x8FA8}, //{0xE8, 0xBE, 0xA8}, // ±æ
- {0xB1E7, 0x8FA9}, //{0xE8, 0xBE, 0xA9}, // ±ç
- {0xB1E8, 0x8FAB}, //{0xE8, 0xBE, 0xAB}, // ±è
- {0xB3BD, 0x8FB0}, //{0xE8, 0xBE, 0xB0}, // ³½
- {0xC8E8, 0x8FB1}, //{0xE8, 0xBE, 0xB1}, // Èè
- {0xB1DF, 0x8FB9}, //{0xE8, 0xBE, 0xB9}, // ±ß
- {0xC1C9, 0x8FBD}, //{0xE8, 0xBE, 0xBD}, // ÁÉ
- {0xB4EF, 0x8FBE}, //{0xE8, 0xBE, 0xBE}, // ´ï
+ {0xD5DE, 0x8F99}, //{0xE8, 0xBE, 0x99}, // ��
+ {0xD0C1, 0x8F9B}, //{0xE8, 0xBE, 0x9B}, // ��
+ {0xB9BC, 0x8F9C}, //{0xE8, 0xBE, 0x9C}, // ��
+ {0xB4C7, 0x8F9E}, //{0xE8, 0xBE, 0x9E}, // ��
+ {0xB1D9, 0x8F9F}, //{0xE8, 0xBE, 0x9F}, // ��
+ {0xC0B1, 0x8FA3}, //{0xE8, 0xBE, 0xA3}, // 1
+ {0xB1E6, 0x8FA8}, //{0xE8, 0xBE, 0xA8}, // ��
+ {0xB1E7, 0x8FA9}, //{0xE8, 0xBE, 0xA9}, // ��
+ {0xB1E8, 0x8FAB}, //{0xE8, 0xBE, 0xAB}, // ��
+ {0xB3BD, 0x8FB0}, //{0xE8, 0xBE, 0xB0}, // ��
+ {0xC8E8, 0x8FB1}, //{0xE8, 0xBE, 0xB1}, // ��
+ {0xB1DF, 0x8FB9}, //{0xE8, 0xBE, 0xB9}, // ��
+ {0xC1C9, 0x8FBD}, //{0xE8, 0xBE, 0xBD}, // ��
+ {0xB4EF, 0x8FBE}, //{0xE8, 0xBE, 0xBE}, // ��
{0xC7A8, 0x8FC1}, //{0xE8, 0xBF, 0x81}, // Ǩ
- {0xD3D8, 0x8FC2}, //{0xE8, 0xBF, 0x82}, // ÓØ
- {0xC6F9, 0x8FC4}, //{0xE8, 0xBF, 0x84}, // Æù
+ {0xD3D8, 0x8FC2}, //{0xE8, 0xBF, 0x82}, // ��
+ {0xC6F9, 0x8FC4}, //{0xE8, 0xBF, 0x84}, // ��
{0xD1B8, 0x8FC5}, //{0xE8, 0xBF, 0x85}, // Ѹ
- {0xB9FD, 0x8FC7}, //{0xE8, 0xBF, 0x87}, // ¹ý
- {0xC2F5, 0x8FC8}, //{0xE8, 0xBF, 0x88}, // Âõ
+ {0xB9FD, 0x8FC7}, //{0xE8, 0xBF, 0x87}, // ��
+ {0xC2F5, 0x8FC8}, //{0xE8, 0xBF, 0x88}, // ��
{0xD3AD, 0x8FCE}, //{0xE8, 0xBF, 0x8E}, // Ó
- {0xD4CB, 0x8FD0}, //{0xE8, 0xBF, 0x90}, // ÔË
- {0xBDFC, 0x8FD1}, //{0xE8, 0xBF, 0x91}, // ½ü
- {0xB7B5, 0x8FD4}, //{0xE8, 0xBF, 0x94}, // ·µ
- {0xBBB9, 0x8FD8}, //{0xE8, 0xBF, 0x98}, // »¹
- {0xD5E2, 0x8FD9}, //{0xE8, 0xBF, 0x99}, // Õâ
- {0xBDF8, 0x8FDB}, //{0xE8, 0xBF, 0x9B}, // ½ø
+ {0xD4CB, 0x8FD0}, //{0xE8, 0xBF, 0x90}, // ��
+ {0xBDFC, 0x8FD1}, //{0xE8, 0xBF, 0x91}, // ��
+ {0xB7B5, 0x8FD4}, //{0xE8, 0xBF, 0x94}, // ��
+ {0xBBB9, 0x8FD8}, //{0xE8, 0xBF, 0x98}, // ��
+ {0xD5E2, 0x8FD9}, //{0xE8, 0xBF, 0x99}, // ��
+ {0xBDF8, 0x8FDB}, //{0xE8, 0xBF, 0x9B}, // ��
{0xD4B6, 0x8FDC}, //{0xE8, 0xBF, 0x9C}, // Ô¶
{0xCEA5, 0x8FDD}, //{0xE8, 0xBF, 0x9D}, // Υ
- {0xC1AC, 0x8FDE}, //{0xE8, 0xBF, 0x9E}, // Á¬
- {0xB3D9, 0x8FDF}, //{0xE8, 0xBF, 0x9F}, // ³Ù
- {0xC6C8, 0x8FEB}, //{0xE8, 0xBF, 0xAB}, // ÆÈ
- {0xCAF6, 0x8FF0}, //{0xE8, 0xBF, 0xB0}, // Êö
- {0xC3D4, 0x8FF7}, //{0xE8, 0xBF, 0xB7}, // ÃÔ
- {0xBCA3, 0x8FF9}, //{0xE8, 0xBF, 0xB9}, // ¼£
+ {0xC1AC, 0x8FDE}, //{0xE8, 0xBF, 0x9E}, // l
+ {0xB3D9, 0x8FDF}, //{0xE8, 0xBF, 0x9F}, // ��
+ {0xC6C8, 0x8FEB}, //{0xE8, 0xBF, 0xAB}, // ��
+ {0xCAF6, 0x8FF0}, //{0xE8, 0xBF, 0xB0}, // ��
+ {0xC3D4, 0x8FF7}, //{0xE8, 0xBF, 0xB7}, // ��
+ {0xBCA3, 0x8FF9}, //{0xE8, 0xBF, 0xB9}, // ��
{0xD7B7, 0x8FFD}, //{0xE8, 0xBF, 0xBD}, // ×·
- {0xCDCB, 0x9000}, //{0xE9, 0x80, 0x80}, // ÍË
- {0xCBCD, 0x9001}, //{0xE9, 0x80, 0x81}, // ËÍ
- {0xCACA, 0x9002}, //{0xE9, 0x80, 0x82}, // ÊÊ
- {0xCCD3, 0x9003}, //{0xE9, 0x80, 0x83}, // ÌÓ
- {0xC4E6, 0x9006}, //{0xE9, 0x80, 0x86}, // Äæ
+ {0xCDCB, 0x9000}, //{0xE9, 0x80, 0x80}, // ��
+ {0xCBCD, 0x9001}, //{0xE9, 0x80, 0x81}, // ��
+ {0xCACA, 0x9002}, //{0xE9, 0x80, 0x82}, // ��
+ {0xCCD3, 0x9003}, //{0xE9, 0x80, 0x83}, // ��
+ {0xC4E6, 0x9006}, //{0xE9, 0x80, 0x86}, // ��
{0xD1A1, 0x9009}, //{0xE9, 0x80, 0x89}, // Ñ¡
{0xD1B7, 0x900A}, //{0xE9, 0x80, 0x8A}, // Ñ·
{0xCDB8, 0x900F}, //{0xE9, 0x80, 0x8F}, // ͸
- {0xD6F0, 0x9010}, //{0xE9, 0x80, 0x90}, // Öð
- {0xB5DD, 0x9012}, //{0xE9, 0x80, 0x92}, // µÝ
+ {0xD6F0, 0x9010}, //{0xE9, 0x80, 0x90}, // ��
+ {0xB5DD, 0x9012}, //{0xE9, 0x80, 0x92}, // ��
{0xCDBE, 0x9014}, //{0xE9, 0x80, 0x94}, // ;
- {0xB6BA, 0x9017}, //{0xE9, 0x80, 0x97}, // ¶º
+ {0xB6BA, 0x9017}, //{0xE9, 0x80, 0x97}, // ��
{0xCDA8, 0x901A}, //{0xE9, 0x80, 0x9A}, // ͨ
- {0xB9E4, 0x901B}, //{0xE9, 0x80, 0x9B}, // ¹ä
- {0xCAC5, 0x901D}, //{0xE9, 0x80, 0x9D}, // ÊÅ
- {0xB3D1, 0x901E}, //{0xE9, 0x80, 0x9E}, // ³Ñ
- {0xCBD9, 0x901F}, //{0xE9, 0x80, 0x9F}, // ËÙ
- {0xD4EC, 0x9020}, //{0xE9, 0x80, 0xA0}, // Ôì
- {0xB7EA, 0x9022}, //{0xE9, 0x80, 0xA2}, // ·ê
- {0xB4FE, 0x902E}, //{0xE9, 0x80, 0xAE}, // ´þ
- {0xD2DD, 0x9038}, //{0xE9, 0x80, 0xB8}, // ÒÝ
- {0xC2DF, 0x903B}, //{0xE9, 0x80, 0xBB}, // Âß
- {0xB1C6, 0x903C}, //{0xE9, 0x80, 0xBC}, // ±Æ
- {0xD3E2, 0x903E}, //{0xE9, 0x80, 0xBE}, // Óâ
- {0xCBEC, 0x9042}, //{0xE9, 0x81, 0x82}, // Ëì
- {0xD3F6, 0x9047}, //{0xE9, 0x81, 0x87}, // Óö
- {0xB1E9, 0x904D}, //{0xE9, 0x81, 0x8D}, // ±é
- {0xB6F4, 0x904F}, //{0xE9, 0x81, 0x8F}, // ¶ô
- {0xB5C0, 0x9053}, //{0xE9, 0x81, 0x93}, // µÀ
- {0xD2C5, 0x9057}, //{0xE9, 0x81, 0x97}, // ÒÅ
+ {0xB9E4, 0x901B}, //{0xE9, 0x80, 0x9B}, // ��
+ {0xCAC5, 0x901D}, //{0xE9, 0x80, 0x9D}, // ��
+ {0xB3D1, 0x901E}, //{0xE9, 0x80, 0x9E}, // ��
+ {0xCBD9, 0x901F}, //{0xE9, 0x80, 0x9F}, // ��
+ {0xD4EC, 0x9020}, //{0xE9, 0x80, 0xA0}, // ��
+ {0xB7EA, 0x9022}, //{0xE9, 0x80, 0xA2}, // ��
+ {0xB4FE, 0x902E}, //{0xE9, 0x80, 0xAE}, // ��
+ {0xD2DD, 0x9038}, //{0xE9, 0x80, 0xB8}, // ��
+ {0xC2DF, 0x903B}, //{0xE9, 0x80, 0xBB}, // ��
+ {0xB1C6, 0x903C}, //{0xE9, 0x80, 0xBC}, // ��
+ {0xD3E2, 0x903E}, //{0xE9, 0x80, 0xBE}, // ��
+ {0xCBEC, 0x9042}, //{0xE9, 0x81, 0x82}, // ��
+ {0xD3F6, 0x9047}, //{0xE9, 0x81, 0x87}, // ��
+ {0xB1E9, 0x904D}, //{0xE9, 0x81, 0x8D}, // ��
+ {0xB6F4, 0x904F}, //{0xE9, 0x81, 0x8F}, // ��
+ {0xB5C0, 0x9053}, //{0xE9, 0x81, 0x93}, // ��
+ {0xD2C5, 0x9057}, //{0xE9, 0x81, 0x97}, // ��
{0xC7B2, 0x9063}, //{0xE9, 0x81, 0xA3}, // Dz
{0xD2A3, 0x9065}, //{0xE9, 0x81, 0xA5}, // Ò£
- {0xD4E2, 0x906D}, //{0xE9, 0x81, 0xAD}, // Ôâ
- {0xD5DA, 0x906E}, //{0xE9, 0x81, 0xAE}, // ÕÚ
- {0xD7F1, 0x9075}, //{0xE9, 0x81, 0xB5}, // ×ñ
- {0xB1DC, 0x907F}, //{0xE9, 0x81, 0xBF}, // ±Ü
- {0xD1FB, 0x9080}, //{0xE9, 0x82, 0x80}, // Ñû
- {0xD2D8, 0x9091}, //{0xE9, 0x82, 0x91}, // ÒØ
- {0xB5CB, 0x9093}, //{0xE9, 0x82, 0x93}, // µË
- {0xD0CF, 0x90A2}, //{0xE9, 0x82, 0xA2}, // ÐÏ
- {0xC4C7, 0x90A3}, //{0xE9, 0x82, 0xA3}, // ÄÇ
- {0xB0EE, 0x90A6}, //{0xE9, 0x82, 0xA6}, // °î
+ {0xD4E2, 0x906D}, //{0xE9, 0x81, 0xAD}, // ��
+ {0xD5DA, 0x906E}, //{0xE9, 0x81, 0xAE}, // ��
+ {0xD7F1, 0x9075}, //{0xE9, 0x81, 0xB5}, // ��
+ {0xB1DC, 0x907F}, //{0xE9, 0x81, 0xBF}, // ��
+ {0xD1FB, 0x9080}, //{0xE9, 0x82, 0x80}, // ��
+ {0xD2D8, 0x9091}, //{0xE9, 0x82, 0x91}, // ��
+ {0xB5CB, 0x9093}, //{0xE9, 0x82, 0x93}, // ��
+ {0xD0CF, 0x90A2}, //{0xE9, 0x82, 0xA2}, // ��
+ {0xC4C7, 0x90A3}, //{0xE9, 0x82, 0xA3}, // ��
+ {0xB0EE, 0x90A6}, //{0xE9, 0x82, 0xA6}, // ��
{0xD0B0, 0x90AA}, //{0xE9, 0x82, 0xAA}, // а
- {0xD3CA, 0x90AE}, //{0xE9, 0x82, 0xAE}, // ÓÊ
- {0xC1DA, 0x90BB}, //{0xE9, 0x82, 0xBB}, // ÁÚ
- {0xD3F4, 0x90C1}, //{0xE9, 0x83, 0x81}, // Óô
- {0xBDBC, 0x90CA}, //{0xE9, 0x83, 0x8A}, // ½¼
- {0xC0C9, 0x90CE}, //{0xE9, 0x83, 0x8E}, // ÀÉ
+ {0xD3CA, 0x90AE}, //{0xE9, 0x82, 0xAE}, // ��
+ {0xC1DA, 0x90BB}, //{0xE9, 0x82, 0xBB}, // ��
+ {0xD3F4, 0x90C1}, //{0xE9, 0x83, 0x81}, // ��
+ {0xBDBC, 0x90CA}, //{0xE9, 0x83, 0x8A}, // ��
+ {0xC0C9, 0x90CE}, //{0xE9, 0x83, 0x8E}, // ��
{0xD6A3, 0x90D1}, //{0xE9, 0x83, 0x91}, // Ö£
- {0xB2BF, 0x90E8}, //{0xE9, 0x83, 0xA8}, // ²¿
- {0xB9F9, 0x90ED}, //{0xE9, 0x83, 0xAD}, // ¹ù
- {0xB6BC, 0x90FD}, //{0xE9, 0x83, 0xBD}, // ¶¼
- {0xB1C9, 0x9119}, //{0xE9, 0x84, 0x99}, // ±É
- {0xD7C3, 0x914C}, //{0xE9, 0x85, 0x8C}, // ×Ã
- {0xC5E4, 0x914D}, //{0xE9, 0x85, 0x8D}, // Åä
- {0xBEC6, 0x9152}, //{0xE9, 0x85, 0x92}, // ¾Æ
- {0xD0EF, 0x9157}, //{0xE9, 0x85, 0x97}, // Ðï
- {0xD4CD, 0x915D}, //{0xE9, 0x85, 0x9D}, // ÔÍ
- {0xBAA8, 0x9163}, //{0xE9, 0x85, 0xA3}, // º¨
- {0xCBD6, 0x9165}, //{0xE9, 0x85, 0xA5}, // ËÖ
- {0xC0D2, 0x916A}, //{0xE9, 0x85, 0xAA}, // ÀÒ
- {0xB3EA, 0x916C}, //{0xE9, 0x85, 0xAC}, // ³ê
- {0xBDB4, 0x9171}, //{0xE9, 0x85, 0xB1}, // ½´
- {0xBDCD, 0x9175}, //{0xE9, 0x85, 0xB5}, // ½Í
- {0xBFE1, 0x9177}, //{0xE9, 0x85, 0xB7}, // ¿á
- {0xCBE1, 0x9178}, //{0xE9, 0x85, 0xB8}, // Ëá
- {0xC4F0, 0x917F}, //{0xE9, 0x85, 0xBF}, // Äð
- {0xB4BC, 0x9187}, //{0xE9, 0x86, 0x87}, // ´¼
- {0xD7ED, 0x9189}, //{0xE9, 0x86, 0x89}, // ×í
- {0xB4D7, 0x918B}, //{0xE9, 0x86, 0x8B}, // ´×
- {0xD0D1, 0x9192}, //{0xE9, 0x86, 0x92}, // ÐÑ
- {0xB2C9, 0x91C7}, //{0xE9, 0x87, 0x87}, // ²É
- {0xCACD, 0x91CA}, //{0xE9, 0x87, 0x8A}, // ÊÍ
- {0xC0EF, 0x91CC}, //{0xE9, 0x87, 0x8C}, // Àï
- {0xD6D8, 0x91CD}, //{0xE9, 0x87, 0x8D}, // ÖØ
+ {0xB2BF, 0x90E8}, //{0xE9, 0x83, 0xA8}, // ��
+ {0xB9F9, 0x90ED}, //{0xE9, 0x83, 0xAD}, // ��
+ {0xB6BC, 0x90FD}, //{0xE9, 0x83, 0xBD}, // ��
+ {0xB1C9, 0x9119}, //{0xE9, 0x84, 0x99}, // ��
+ {0xD7C3, 0x914C}, //{0xE9, 0x85, 0x8C}, // ��
+ {0xC5E4, 0x914D}, //{0xE9, 0x85, 0x8D}, // ��
+ {0xBEC6, 0x9152}, //{0xE9, 0x85, 0x92}, // ��
+ {0xD0EF, 0x9157}, //{0xE9, 0x85, 0x97}, // ��
+ {0xD4CD, 0x915D}, //{0xE9, 0x85, 0x9D}, // ��
+ {0xBAA8, 0x9163}, //{0xE9, 0x85, 0xA3}, // ��
+ {0xCBD6, 0x9165}, //{0xE9, 0x85, 0xA5}, // ��
+ {0xC0D2, 0x916A}, //{0xE9, 0x85, 0xAA}, // ��
+ {0xB3EA, 0x916C}, //{0xE9, 0x85, 0xAC}, // ��
+ {0xBDB4, 0x9171}, //{0xE9, 0x85, 0xB1}, // ��
+ {0xBDCD, 0x9175}, //{0xE9, 0x85, 0xB5}, // ��
+ {0xBFE1, 0x9177}, //{0xE9, 0x85, 0xB7}, // ��
+ {0xCBE1, 0x9178}, //{0xE9, 0x85, 0xB8}, // ��
+ {0xC4F0, 0x917F}, //{0xE9, 0x85, 0xBF}, // ��
+ {0xB4BC, 0x9187}, //{0xE9, 0x86, 0x87}, // ��
+ {0xD7ED, 0x9189}, //{0xE9, 0x86, 0x89}, // ��
+ {0xB4D7, 0x918B}, //{0xE9, 0x86, 0x8B}, // ��
+ {0xD0D1, 0x9192}, //{0xE9, 0x86, 0x92}, // ��
+ {0xB2C9, 0x91C7}, //{0xE9, 0x87, 0x87}, // ��
+ {0xCACD, 0x91CA}, //{0xE9, 0x87, 0x8A}, // ��
+ {0xC0EF, 0x91CC}, //{0xE9, 0x87, 0x8C}, // ��
+ {0xD6D8, 0x91CD}, //{0xE9, 0x87, 0x8D}, // ��
{0xD2B0, 0x91CE}, //{0xE9, 0x87, 0x8E}, // Ò°
- {0xC1BF, 0x91CF}, //{0xE9, 0x87, 0x8F}, // Á¿
- {0xBDF0, 0x91D1}, //{0xE9, 0x87, 0x91}, // ½ð
- {0xBCF8, 0x9274}, //{0xE9, 0x89, 0xB4}, // ¼ø
- {0xD5EB, 0x9488}, //{0xE9, 0x92, 0x88}, // Õë
- {0xB6A4, 0x9489}, //{0xE9, 0x92, 0x89}, // ¶¤
- {0xB5F6, 0x9493}, //{0xE9, 0x92, 0x93}, // µö
- {0xB8C6, 0x9499}, //{0xE9, 0x92, 0x99}, // ¸Æ
- {0xB6DB, 0x949D}, //{0xE9, 0x92, 0x9D}, // ¶Û
- {0xB3AE, 0x949E}, //{0xE9, 0x92, 0x9E}, // ³®
- {0xD6D3, 0x949F}, //{0xE9, 0x92, 0x9F}, // ÖÓ
- {0xC4C6, 0x94A0}, //{0xE9, 0x92, 0xA0}, // ÄÆ
- {0xB8D6, 0x94A2}, //{0xE9, 0x92, 0xA2}, // ¸Ö
+ {0xC1BF, 0x91CF}, //{0xE9, 0x87, 0x8F}, //
+ {0xBDF0, 0x91D1}, //{0xE9, 0x87, 0x91}, // ��
+ {0xBCF8, 0x9274}, //{0xE9, 0x89, 0xB4}, // ��
+ {0xD5EB, 0x9488}, //{0xE9, 0x92, 0x88}, // ��
+ {0xB6A4, 0x9489}, //{0xE9, 0x92, 0x89}, // ��
+ {0xB5F6, 0x9493}, //{0xE9, 0x92, 0x93}, // ��
+ {0xB8C6, 0x9499}, //{0xE9, 0x92, 0x99}, // ��
+ {0xB6DB, 0x949D}, //{0xE9, 0x92, 0x9D}, // ��
+ {0xB3AE, 0x949E}, //{0xE9, 0x92, 0x9E}, // ��
+ {0xD6D3, 0x949F}, //{0xE9, 0x92, 0x9F}, // ��
+ {0xC4C6, 0x94A0}, //{0xE9, 0x92, 0xA0}, // ��
+ {0xB8D6, 0x94A2}, //{0xE9, 0x92, 0xA2}, // ��
{0xD4BF, 0x94A5}, //{0xE9, 0x92, 0xA5}, // Ô¿
- {0xC7D5, 0x94A6}, //{0xE9, 0x92, 0xA6}, // ÇÕ
- {0xBEFB, 0x94A7}, //{0xE9, 0x92, 0xA7}, // ¾û
- {0xB9B3, 0x94A9}, //{0xE9, 0x92, 0xA9}, // ¹³
+ {0xC7D5, 0x94A6}, //{0xE9, 0x92, 0xA6}, // ��
+ {0xBEFB, 0x94A7}, //{0xE9, 0x92, 0xA7}, // ��
+ {0xB9B3, 0x94A9}, //{0xE9, 0x92, 0xA9}, // ��
{0xC5A5, 0x94AE}, //{0xE9, 0x92, 0xAE}, // ť
{0xC7AE, 0x94B1}, //{0xE9, 0x92, 0xB1}, // Ç®
{0xC7AF, 0x94B3}, //{0xE9, 0x92, 0xB3}, // ǯ
- {0xD7EA, 0x94BB}, //{0xE9, 0x92, 0xBB}, // ×ê
- {0xBCD8, 0x94BE}, //{0xE9, 0x92, 0xBE}, // ¼Ø
- {0xCCFA, 0x94C1}, //{0xE9, 0x93, 0x81}, // Ìú
- {0xC1E5, 0x94C3}, //{0xE9, 0x93, 0x83}, // Áå
+ {0xD7EA, 0x94BB}, //{0xE9, 0x92, 0xBB}, // ��
+ {0xBCD8, 0x94BE}, //{0xE9, 0x92, 0xBE}, // ��
+ {0xCCFA, 0x94C1}, //{0xE9, 0x93, 0x81}, // ��
+ {0xC1E5, 0x94C3}, //{0xE9, 0x93, 0x83}, // ��
{0xC7A6, 0x94C5}, //{0xE9, 0x93, 0x85}, // Ǧ
{0xC3AD, 0x94C6}, //{0xE9, 0x93, 0x86}, // Ã
- {0xEEED, 0x94D0}, //{0xE9, 0x93, 0x90}, // îí
- {0xEEF5, 0x94DB}, //{0xE9, 0x93, 0x9B}, // îõ
+ {0xEEED, 0x94D0}, //{0xE9, 0x93, 0x90}, // ��
+ {0xEEF5, 0x94DB}, //{0xE9, 0x93, 0x9B}, // ��
{0xCDAD, 0x94DC}, //{0xE9, 0x93, 0x9C}, // Í
- {0xC2C1, 0x94DD}, //{0xE9, 0x93, 0x9D}, // ÂÁ
+ {0xC2C1, 0x94DD}, //{0xE9, 0x93, 0x9D}, // ��
{0xD5A1, 0x94E1}, //{0xE9, 0x93, 0xA1}, // Õ¡
{0xCFB3, 0x94E3}, //{0xE9, 0x93, 0xA3}, // ϳ
- {0xC3FA, 0x94ED}, //{0xE9, 0x93, 0xAD}, // Ãú
- {0xB2F9, 0x94F2}, //{0xE9, 0x93, 0xB2}, // ²ù
- {0xD2F8, 0x94F6}, //{0xE9, 0x93, 0xB6}, // Òø
- {0xD6FD, 0x94F8}, //{0xE9, 0x93, 0xB8}, // Öý
- {0xC6CC, 0x94FA}, //{0xE9, 0x93, 0xBA}, // ÆÌ
- {0xC1B4, 0x94FE}, //{0xE9, 0x93, 0xBE}, // Á´
- {0xCFFA, 0x9500}, //{0xE9, 0x94, 0x80}, // Ïú
- {0xCBF8, 0x9501}, //{0xE9, 0x94, 0x81}, // Ëø
- {0xB3FA, 0x9504}, //{0xE9, 0x94, 0x84}, // ³ú
- {0xB9F8, 0x9505}, //{0xE9, 0x94, 0x85}, // ¹ø
- {0xD0E2, 0x9508}, //{0xE9, 0x94, 0x88}, // Ðâ
- {0xEFB1, 0x9509}, //{0xE9, 0x94, 0x89}, // ï±
- {0xB7E6, 0x950B}, //{0xE9, 0x94, 0x8B}, // ·æ
+ {0xC3FA, 0x94ED}, //{0xE9, 0x93, 0xAD}, // ��
+ {0xB2F9, 0x94F2}, //{0xE9, 0x93, 0xB2}, // ��
+ {0xD2F8, 0x94F6}, //{0xE9, 0x93, 0xB6}, // ��
+ {0xD6FD, 0x94F8}, //{0xE9, 0x93, 0xB8}, // ��
+ {0xC6CC, 0x94FA}, //{0xE9, 0x93, 0xBA}, // ��
+ {0xC1B4, 0x94FE}, //{0xE9, 0x93, 0xBE}, // t
+ {0xCFFA, 0x9500}, //{0xE9, 0x94, 0x80}, // ��
+ {0xCBF8, 0x9501}, //{0xE9, 0x94, 0x81}, // ��
+ {0xB3FA, 0x9504}, //{0xE9, 0x94, 0x84}, // ��
+ {0xB9F8, 0x9505}, //{0xE9, 0x94, 0x85}, // ��
+ {0xD0E2, 0x9508}, //{0xE9, 0x94, 0x88}, // ��
+ {0xEFB1, 0x9509}, //{0xE9, 0x94, 0x89}, // �
+ {0xB7E6, 0x950B}, //{0xE9, 0x94, 0x8B}, // ��
{0xD0BF, 0x950C}, //{0xE9, 0x94, 0x8C}, // п
- {0xC8F1, 0x9510}, //{0xE9, 0x94, 0x90}, // Èñ
- {0xB4ED, 0x9519}, //{0xE9, 0x94, 0x99}, // ´í
+ {0xC8F1, 0x9510}, //{0xE9, 0x94, 0x90}, // ��
+ {0xB4ED, 0x9519}, //{0xE9, 0x94, 0x99}, // ��
{0xC3AA, 0x951A}, //{0xE9, 0x94, 0x9A}, // ê
- {0xCEFD, 0x9521}, //{0xE9, 0x94, 0xA1}, // Îý
- {0xC2E0, 0x9523}, //{0xE9, 0x94, 0xA3}, // Âà
- {0xB4B8, 0x9524}, //{0xE9, 0x94, 0xA4}, // ´¸
+ {0xCEFD, 0x9521}, //{0xE9, 0x94, 0xA1}, // ��
+ {0xC2E0, 0x9523}, //{0xE9, 0x94, 0xA3}, // ��
+ {0xB4B8, 0x9524}, //{0xE9, 0x94, 0xA4}, // ��
{0xD7B6, 0x9525}, //{0xE9, 0x94, 0xA5}, // ×¶
- {0xBDF5, 0x9526}, //{0xE9, 0x94, 0xA6}, // ½õ
- {0xCFC7, 0x9528}, //{0xE9, 0x94, 0xA8}, // ÏÇ
- {0xB6A7, 0x952D}, //{0xE9, 0x94, 0xAD}, // ¶§
- {0xBCFC, 0x952E}, //{0xE9, 0x94, 0xAE}, // ¼ü
- {0xBEE2, 0x952F}, //{0xE9, 0x94, 0xAF}, // ¾â
- {0xC3CC, 0x9530}, //{0xE9, 0x94, 0xB0}, // ÃÌ
- {0xC7C2, 0x9539}, //{0xE9, 0x94, 0xB9}, // ÇÂ
- {0xB6CD, 0x953B}, //{0xE9, 0x94, 0xBB}, // ¶Í
- {0xB6C6, 0x9540}, //{0xE9, 0x95, 0x80}, // ¶Æ
- {0xD5F2, 0x9547}, //{0xE9, 0x95, 0x87}, // Õò
- {0xC4F7, 0x954A}, //{0xE9, 0x95, 0x8A}, // Ä÷
- {0xB8E4, 0x9550}, //{0xE9, 0x95, 0x90}, // ¸ä
- {0xBEB5, 0x955C}, //{0xE9, 0x95, 0x9C}, // ¾µ
- {0xC1CD, 0x9563}, //{0xE9, 0x95, 0xA3}, // ÁÍ
- {0xC1AD, 0x9570}, //{0xE9, 0x95, 0xB0}, // Á
- {0xCFE2, 0x9576}, //{0xE9, 0x95, 0xB6}, // Ïâ
- {0xB3A4, 0x957F}, //{0xE9, 0x95, 0xBF}, // ³¤
- {0xC3C5, 0x95E8}, //{0xE9, 0x97, 0xA8}, // ÃÅ
- {0xC9C1, 0x95EA}, //{0xE9, 0x97, 0xAA}, // ÉÁ
- {0xB1D5, 0x95ED}, //{0xE9, 0x97, 0xAD}, // ±Õ
- {0xCECA, 0x95EE}, //{0xE9, 0x97, 0xAE}, // ÎÊ
- {0xB4B3, 0x95EF}, //{0xE9, 0x97, 0xAF}, // ´³
- {0xC8F2, 0x95F0}, //{0xE9, 0x97, 0xB0}, // Èò
- {0xCFD0, 0x95F2}, //{0xE9, 0x97, 0xB2}, // ÏÐ
- {0xBCE4, 0x95F4}, //{0xE9, 0x97, 0xB4}, // ¼ä
- {0xC3C6, 0x95F7}, //{0xE9, 0x97, 0xB7}, // ÃÆ
+ {0xBDF5, 0x9526}, //{0xE9, 0x94, 0xA6}, // ��
+ {0xCFC7, 0x9528}, //{0xE9, 0x94, 0xA8}, // ��
+ {0xB6A7, 0x952D}, //{0xE9, 0x94, 0xAD}, // ��
+ {0xBCFC, 0x952E}, //{0xE9, 0x94, 0xAE}, // ��
+ {0xBEE2, 0x952F}, //{0xE9, 0x94, 0xAF}, // ��
+ {0xC3CC, 0x9530}, //{0xE9, 0x94, 0xB0}, // ��
+ {0xC7C2, 0x9539}, //{0xE9, 0x94, 0xB9}, // ��
+ {0xB6CD, 0x953B}, //{0xE9, 0x94, 0xBB}, // ��
+ {0xB6C6, 0x9540}, //{0xE9, 0x95, 0x80}, // ��
+ {0xD5F2, 0x9547}, //{0xE9, 0x95, 0x87}, // ��
+ {0xC4F7, 0x954A}, //{0xE9, 0x95, 0x8A}, // ��
+ {0xB8E4, 0x9550}, //{0xE9, 0x95, 0x90}, // ��
+ {0xBEB5, 0x955C}, //{0xE9, 0x95, 0x9C}, // ��
+ {0xC1CD, 0x9563}, //{0xE9, 0x95, 0xA3}, // ��
+ {0xC1AD, 0x9570}, //{0xE9, 0x95, 0xB0}, // m
+ {0xCFE2, 0x9576}, //{0xE9, 0x95, 0xB6}, // ��
+ {0xB3A4, 0x957F}, //{0xE9, 0x95, 0xBF}, // ��
+ {0xC3C5, 0x95E8}, //{0xE9, 0x97, 0xA8}, // ��
+ {0xC9C1, 0x95EA}, //{0xE9, 0x97, 0xAA}, // ��
+ {0xB1D5, 0x95ED}, //{0xE9, 0x97, 0xAD}, // ��
+ {0xCECA, 0x95EE}, //{0xE9, 0x97, 0xAE}, // ��
+ {0xB4B3, 0x95EF}, //{0xE9, 0x97, 0xAF}, // ��
+ {0xC8F2, 0x95F0}, //{0xE9, 0x97, 0xB0}, // ��
+ {0xCFD0, 0x95F2}, //{0xE9, 0x97, 0xB2}, // ��
+ {0xBCE4, 0x95F4}, //{0xE9, 0x97, 0xB4}, // ��
+ {0xC3C6, 0x95F7}, //{0xE9, 0x97, 0xB7}, // ��
{0xD5A2, 0x95F8}, //{0xE9, 0x97, 0xB8}, // Õ¢
- {0xC4D6, 0x95F9}, //{0xE9, 0x97, 0xB9}, // ÄÖ
- {0xB9EB, 0x95FA}, //{0xE9, 0x97, 0xBA}, // ¹ë
- {0xCEC5, 0x95FB}, //{0xE9, 0x97, 0xBB}, // ÎÅ
- {0xC3F6, 0x95FD}, //{0xE9, 0x97, 0xBD}, // Ãö
- {0xB7A7, 0x9600}, //{0xE9, 0x98, 0x80}, // ·§
- {0xB8F3, 0x9601}, //{0xE9, 0x98, 0x81}, // ¸ó
- {0xD4C4, 0x9605}, //{0xE9, 0x98, 0x85}, // ÔÄ
- {0xD1D6, 0x960E}, //{0xE9, 0x98, 0x8E}, // ÑÖ
- {0xB2FB, 0x9610}, //{0xE9, 0x98, 0x90}, // ²û
- {0xC0AB, 0x9614}, //{0xE9, 0x98, 0x94}, // À«
- {0xB6D3, 0x961F}, //{0xE9, 0x98, 0x9F}, // ¶Ó
- {0xDAE5, 0x9631}, //{0xE9, 0x98, 0xB1}, // Úå
- {0xB7C0, 0x9632}, //{0xE9, 0x98, 0xB2}, // ·À
- {0xD1F4, 0x9633}, //{0xE9, 0x98, 0xB3}, // Ñô
- {0xD2F5, 0x9634}, //{0xE9, 0x98, 0xB4}, // Òõ
- {0xD5F3, 0x9635}, //{0xE9, 0x98, 0xB5}, // Õó
- {0xBDD7, 0x9636}, //{0xE9, 0x98, 0xB6}, // ½×
- {0xD7E8, 0x963B}, //{0xE9, 0x98, 0xBB}, // ×è
- {0xB0A2, 0x963F}, //{0xE9, 0x98, 0xBF}, // °¢
- {0xB8BD, 0x9644}, //{0xE9, 0x99, 0x84}, // ¸½
- {0xBCCA, 0x9645}, //{0xE9, 0x99, 0x85}, // ¼Ê
+ {0xC4D6, 0x95F9}, //{0xE9, 0x97, 0xB9}, // ��
+ {0xB9EB, 0x95FA}, //{0xE9, 0x97, 0xBA}, // ��
+ {0xCEC5, 0x95FB}, //{0xE9, 0x97, 0xBB}, // ��
+ {0xC3F6, 0x95FD}, //{0xE9, 0x97, 0xBD}, // ��
+ {0xB7A7, 0x9600}, //{0xE9, 0x98, 0x80}, // ��
+ {0xB8F3, 0x9601}, //{0xE9, 0x98, 0x81}, // ��
+ {0xD4C4, 0x9605}, //{0xE9, 0x98, 0x85}, // ��
+ {0xD1D6, 0x960E}, //{0xE9, 0x98, 0x8E}, // ��
+ {0xB2FB, 0x9610}, //{0xE9, 0x98, 0x90}, // ��
+ {0xC0AB, 0x9614}, //{0xE9, 0x98, 0x94}, // ��
+ {0xB6D3, 0x961F}, //{0xE9, 0x98, 0x9F}, // ��
+ {0xDAE5, 0x9631}, //{0xE9, 0x98, 0xB1}, // ��
+ {0xB7C0, 0x9632}, //{0xE9, 0x98, 0xB2}, // ��
+ {0xD1F4, 0x9633}, //{0xE9, 0x98, 0xB3}, // ��
+ {0xD2F5, 0x9634}, //{0xE9, 0x98, 0xB4}, // ��
+ {0xD5F3, 0x9635}, //{0xE9, 0x98, 0xB5}, // ��
+ {0xBDD7, 0x9636}, //{0xE9, 0x98, 0xB6}, // ��
+ {0xD7E8, 0x963B}, //{0xE9, 0x98, 0xBB}, // ��
+ {0xB0A2, 0x963F}, //{0xE9, 0x98, 0xBF}, // ��
+ {0xB8BD, 0x9644}, //{0xE9, 0x99, 0x84}, // ��
+ {0xBCCA, 0x9645}, //{0xE9, 0x99, 0x85}, // ��
{0xC2BD, 0x9646}, //{0xE9, 0x99, 0x86}, // ½
- {0xB3C2, 0x9648}, //{0xE9, 0x99, 0x88}, // ³Â
+ {0xB3C2, 0x9648}, //{0xE9, 0x99, 0x88}, // ��
{0xC2AA, 0x964B}, //{0xE9, 0x99, 0x8B}, // ª
{0xC4B0, 0x964C}, //{0xE9, 0x99, 0x8C}, // İ
- {0xBDB5, 0x964D}, //{0xE9, 0x99, 0x8D}, // ½µ
- {0xCFDE, 0x9650}, //{0xE9, 0x99, 0x90}, // ÏÞ
- {0xC9C2, 0x9655}, //{0xE9, 0x99, 0x95}, // ÉÂ
- {0xB6B8, 0x9661}, //{0xE9, 0x99, 0xA1}, // ¶¸
+ {0xBDB5, 0x964D}, //{0xE9, 0x99, 0x8D}, // ��
+ {0xCFDE, 0x9650}, //{0xE9, 0x99, 0x90}, // ��
+ {0xC9C2, 0x9655}, //{0xE9, 0x99, 0x95}, // ��
+ {0xB6B8, 0x9661}, //{0xE9, 0x99, 0xA1}, // ��
{0xD4BA, 0x9662}, //{0xE9, 0x99, 0xA2}, // Ôº
- {0xB3FD, 0x9664}, //{0xE9, 0x99, 0xA4}, // ³ý
- {0xD4C9, 0x9668}, //{0xE9, 0x99, 0xA8}, // ÔÉ
- {0xCFD5, 0x9669}, //{0xE9, 0x99, 0xA9}, // ÏÕ
- {0xC5E3, 0x966A}, //{0xE9, 0x99, 0xAA}, // Åã
- {0xC1EA, 0x9675}, //{0xE9, 0x99, 0xB5}, // Áê
- {0xCCD5, 0x9676}, //{0xE9, 0x99, 0xB6}, // ÌÕ
- {0xCFDD, 0x9677}, //{0xE9, 0x99, 0xB7}, // ÏÝ
- {0xD3E7, 0x9685}, //{0xE9, 0x9A, 0x85}, // Óç
+ {0xB3FD, 0x9664}, //{0xE9, 0x99, 0xA4}, // ��
+ {0xD4C9, 0x9668}, //{0xE9, 0x99, 0xA8}, // ��
+ {0xCFD5, 0x9669}, //{0xE9, 0x99, 0xA9}, // ��
+ {0xC5E3, 0x966A}, //{0xE9, 0x99, 0xAA}, // ��
+ {0xC1EA, 0x9675}, //{0xE9, 0x99, 0xB5}, // ��
+ {0xCCD5, 0x9676}, //{0xE9, 0x99, 0xB6}, // ��
+ {0xCFDD, 0x9677}, //{0xE9, 0x99, 0xB7}, // ��
+ {0xD3E7, 0x9685}, //{0xE9, 0x9A, 0x85}, // ��
{0xC2A1, 0x9686}, //{0xE9, 0x9A, 0x86}, // ¡
- {0xCBE6, 0x968F}, //{0xE9, 0x9A, 0x8F}, // Ëæ
- {0xD2FE, 0x9690}, //{0xE9, 0x9A, 0x90}, // Òþ
- {0xB8F4, 0x9694}, //{0xE9, 0x9A, 0x94}, // ¸ô
- {0xB0AF, 0x9698}, //{0xE9, 0x9A, 0x98}, // °¯
+ {0xCBE6, 0x968F}, //{0xE9, 0x9A, 0x8F}, // ��
+ {0xD2FE, 0x9690}, //{0xE9, 0x9A, 0x90}, // ��
+ {0xB8F4, 0x9694}, //{0xE9, 0x9A, 0x94}, // ��
+ {0xB0AF, 0x9698}, //{0xE9, 0x9A, 0x98}, // ��
{0xCFB6, 0x9699}, //{0xE9, 0x9A, 0x99}, // ϶
- {0xD5CF, 0x969C}, //{0xE9, 0x9A, 0x9C}, // ÕÏ
- {0xCBED, 0x96A7}, //{0xE9, 0x9A, 0xA7}, // Ëí
- {0xC1A5, 0x96B6}, //{0xE9, 0x9A, 0xB6}, // Á¥
- {0xC4D1, 0x96BE}, //{0xE9, 0x9A, 0xBE}, // ÄÑ
+ {0xD5CF, 0x969C}, //{0xE9, 0x9A, 0x9C}, // ��
+ {0xCBED, 0x96A7}, //{0xE9, 0x9A, 0xA7}, // ��
+ {0xC1A5, 0x96B6}, //{0xE9, 0x9A, 0xB6}, // e
+ {0xC4D1, 0x96BE}, //{0xE9, 0x9A, 0xBE}, // ��
{0xC8B8, 0x96C0}, //{0xE9, 0x9B, 0x80}, // ȸ
- {0xD1E3, 0x96C1}, //{0xE9, 0x9B, 0x81}, // Ñã
- {0xD0DB, 0x96C4}, //{0xE9, 0x9B, 0x84}, // ÐÛ
- {0xD1C5, 0x96C5}, //{0xE9, 0x9B, 0x85}, // ÑÅ
- {0xBCAF, 0x96C6}, //{0xE9, 0x9B, 0x86}, // ¼¯
- {0xB9CD, 0x96C7}, //{0xE9, 0x9B, 0x87}, // ¹Í
- {0xB4C6, 0x96CC}, //{0xE9, 0x9B, 0x8C}, // ´Æ
- {0xB3FB, 0x96CF}, //{0xE9, 0x9B, 0x8F}, // ³û
- {0xB5F1, 0x96D5}, //{0xE9, 0x9B, 0x95}, // µñ
- {0xD3EA, 0x96E8}, //{0xE9, 0x9B, 0xA8}, // Óê
+ {0xD1E3, 0x96C1}, //{0xE9, 0x9B, 0x81}, // ��
+ {0xD0DB, 0x96C4}, //{0xE9, 0x9B, 0x84}, // ��
+ {0xD1C5, 0x96C5}, //{0xE9, 0x9B, 0x85}, // ��
+ {0xBCAF, 0x96C6}, //{0xE9, 0x9B, 0x86}, // ��
+ {0xB9CD, 0x96C7}, //{0xE9, 0x9B, 0x87}, // ��
+ {0xB4C6, 0x96CC}, //{0xE9, 0x9B, 0x8C}, // ��
+ {0xB3FB, 0x96CF}, //{0xE9, 0x9B, 0x8F}, // ��
+ {0xB5F1, 0x96D5}, //{0xE9, 0x9B, 0x95}, // ��
+ {0xD3EA, 0x96E8}, //{0xE9, 0x9B, 0xA8}, // ��
{0xD1A9, 0x96EA}, //{0xE9, 0x9B, 0xAA}, // Ñ©
- {0xF6A8, 0x96F3}, //{0xE9, 0x9B, 0xB3}, // ö¨
- {0xC1E3, 0x96F6}, //{0xE9, 0x9B, 0xB6}, // Áã
- {0xC0D7, 0x96F7}, //{0xE9, 0x9B, 0xB7}, // À×
- {0xB1A2, 0x96F9}, //{0xE9, 0x9B, 0xB9}, // ±¢
- {0xCEED, 0x96FE}, //{0xE9, 0x9B, 0xBE}, // Îí
- {0xD0E8, 0x9700}, //{0xE9, 0x9C, 0x80}, // Ðè
- {0xD5F0, 0x9707}, //{0xE9, 0x9C, 0x87}, // Õð
+ {0xF6A8, 0x96F3}, //{0xE9, 0x9B, 0xB3}, // ��
+ {0xC1E3, 0x96F6}, //{0xE9, 0x9B, 0xB6}, // ��
+ {0xC0D7, 0x96F7}, //{0xE9, 0x9B, 0xB7}, // ��
+ {0xB1A2, 0x96F9}, //{0xE9, 0x9B, 0xB9}, // ��
+ {0xCEED, 0x96FE}, //{0xE9, 0x9B, 0xBE}, // ��
+ {0xD0E8, 0x9700}, //{0xE9, 0x9C, 0x80}, // ��
+ {0xD5F0, 0x9707}, //{0xE9, 0x9C, 0x87}, // ��
{0xC3B9, 0x9709}, //{0xE9, 0x9C, 0x89}, // ù
- {0xBBF4, 0x970D}, //{0xE9, 0x9C, 0x8D}, // »ô
- {0xF6AE, 0x970E}, //{0xE9, 0x9C, 0x8E}, // ö®
+ {0xBBF4, 0x970D}, //{0xE9, 0x9C, 0x8D}, // ��
+ {0xF6AE, 0x970E}, //{0xE9, 0x9C, 0x8E}, // ��
{0xCBAA, 0x971C}, //{0xE9, 0x9C, 0x9C}, // ˪
{0xCFBC, 0x971E}, //{0xE9, 0x9C, 0x9E}, // ϼ
{0xC2B6, 0x9732}, //{0xE9, 0x9C, 0xB2}, // ¶
- {0xB0D4, 0x9738}, //{0xE9, 0x9C, 0xB8}, // °Ô
- {0xC5F9, 0x9739}, //{0xE9, 0x9C, 0xB9}, // Åù
- {0xC7E0, 0x9752}, //{0xE9, 0x9D, 0x92}, // Çà
- {0xBEB8, 0x9756}, //{0xE9, 0x9D, 0x96}, // ¾¸
- {0xBEB2, 0x9759}, //{0xE9, 0x9D, 0x99}, // ¾²
- {0xB7C7, 0x975E}, //{0xE9, 0x9D, 0x9E}, // ·Ç
- {0xBFBF, 0x9760}, //{0xE9, 0x9D, 0xA0}, // ¿¿
- {0xC3D2, 0x9761}, //{0xE9, 0x9D, 0xA1}, // ÃÒ
- {0xC3E6, 0x9762}, //{0xE9, 0x9D, 0xA2}, // Ãæ
- {0xB8EF, 0x9769}, //{0xE9, 0x9D, 0xA9}, // ¸ï
+ {0xB0D4, 0x9738}, //{0xE9, 0x9C, 0xB8}, // ��
+ {0xC5F9, 0x9739}, //{0xE9, 0x9C, 0xB9}, // ��
+ {0xC7E0, 0x9752}, //{0xE9, 0x9D, 0x92}, // ��
+ {0xBEB8, 0x9756}, //{0xE9, 0x9D, 0x96}, // ��
+ {0xBEB2, 0x9759}, //{0xE9, 0x9D, 0x99}, // ��
+ {0xB7C7, 0x975E}, //{0xE9, 0x9D, 0x9E}, // ��
+ {0xBFBF, 0x9760}, //{0xE9, 0x9D, 0xA0}, // ��
+ {0xC3D2, 0x9761}, //{0xE9, 0x9D, 0xA1}, // ��
+ {0xC3E6, 0x9762}, //{0xE9, 0x9D, 0xA2}, // ��
+ {0xB8EF, 0x9769}, //{0xE9, 0x9D, 0xA9}, // ��
{0xD1A5, 0x9774}, //{0xE9, 0x9D, 0xB4}, // ѥ
- {0xB0D0, 0x9776}, //{0xE9, 0x9D, 0xB6}, // °Ð
+ {0xB0D0, 0x9776}, //{0xE9, 0x9D, 0xB6}, // ��
{0xD0AC, 0x978B}, //{0xE9, 0x9E, 0x8B}, // Ь
- {0xB0B0, 0x978D}, //{0xE9, 0x9E, 0x8D}, // °°
- {0xBECF, 0x97A0}, //{0xE9, 0x9E, 0xA0}, // ¾Ï
- {0xB1DE, 0x97AD}, //{0xE9, 0x9E, 0xAD}, // ±Þ
- {0xC8CD, 0x97E7}, //{0xE9, 0x9F, 0xA7}, // ÈÍ
- {0xBAAB, 0x97E9}, //{0xE9, 0x9F, 0xA9}, // º«
- {0xBEC2, 0x97ED}, //{0xE9, 0x9F, 0xAD}, // ¾Â
- {0xD2F4, 0x97F3}, //{0xE9, 0x9F, 0xB3}, // Òô
- {0xD4CF, 0x97F5}, //{0xE9, 0x9F, 0xB5}, // ÔÏ
+ {0xB0B0, 0x978D}, //{0xE9, 0x9E, 0x8D}, // ��
+ {0xBECF, 0x97A0}, //{0xE9, 0x9E, 0xA0}, // ��
+ {0xB1DE, 0x97AD}, //{0xE9, 0x9E, 0xAD}, // ��
+ {0xC8CD, 0x97E7}, //{0xE9, 0x9F, 0xA7}, // ��
+ {0xBAAB, 0x97E9}, //{0xE9, 0x9F, 0xA9}, // ��
+ {0xBEC2, 0x97ED}, //{0xE9, 0x9F, 0xAD}, // ��
+ {0xD2F4, 0x97F3}, //{0xE9, 0x9F, 0xB3}, // ��
+ {0xD4CF, 0x97F5}, //{0xE9, 0x9F, 0xB5}, // ��
{0xD2B3, 0x9875}, //{0xE9, 0xA1, 0xB5}, // Ò³
- {0xB6A5, 0x9876}, //{0xE9, 0xA1, 0xB6}, // ¶¥
- {0xC7EA, 0x9877}, //{0xE9, 0xA1, 0xB7}, // Çê
- {0xCFEE, 0x9879}, //{0xE9, 0xA1, 0xB9}, // Ïî
+ {0xB6A5, 0x9876}, //{0xE9, 0xA1, 0xB6}, // ��
+ {0xC7EA, 0x9877}, //{0xE9, 0xA1, 0xB7}, // ��
+ {0xCFEE, 0x9879}, //{0xE9, 0xA1, 0xB9}, // ��
{0xCBB3, 0x987A}, //{0xE9, 0xA1, 0xBA}, // ˳
- {0xD0EB, 0x987B}, //{0xE9, 0xA1, 0xBB}, // Ðë
- {0xCDE7, 0x987D}, //{0xE9, 0xA1, 0xBD}, // Íç
- {0xB9CB, 0x987E}, //{0xE9, 0xA1, 0xBE}, // ¹Ë
- {0xB6D9, 0x987F}, //{0xE9, 0xA1, 0xBF}, // ¶Ù
- {0xB0E4, 0x9881}, //{0xE9, 0xA2, 0x81}, // °ä
- {0xCBCC, 0x9882}, //{0xE9, 0xA2, 0x82}, // ËÌ
+ {0xD0EB, 0x987B}, //{0xE9, 0xA1, 0xBB}, // ��
+ {0xCDE7, 0x987D}, //{0xE9, 0xA1, 0xBD}, // ��
+ {0xB9CB, 0x987E}, //{0xE9, 0xA1, 0xBE}, // ��
+ {0xB6D9, 0x987F}, //{0xE9, 0xA1, 0xBF}, // ��
+ {0xB0E4, 0x9881}, //{0xE9, 0xA2, 0x81}, // ��
+ {0xCBCC, 0x9882}, //{0xE9, 0xA2, 0x82}, // ��
{0xD4A4, 0x9884}, //{0xE9, 0xA2, 0x84}, // Ô¤
{0xC2AD, 0x9885}, //{0xE9, 0xA2, 0x85}, // Â
- {0xC1EC, 0x9886}, //{0xE9, 0xA2, 0x86}, // Áì
- {0xC6C4, 0x9887}, //{0xE9, 0xA2, 0x87}, // ÆÄ
- {0xBEB1, 0x9888}, //{0xE9, 0xA2, 0x88}, // ¾±
- {0xBCD5, 0x988A}, //{0xE9, 0xA2, 0x8A}, // ¼Õ
+ {0xC1EC, 0x9886}, //{0xE9, 0xA2, 0x86}, // ��
+ {0xC6C4, 0x9887}, //{0xE9, 0xA2, 0x87}, // ��
+ {0xBEB1, 0x9888}, //{0xE9, 0xA2, 0x88}, // ��
+ {0xBCD5, 0x988A}, //{0xE9, 0xA2, 0x8A}, // ��
{0xC6B5, 0x9891}, //{0xE9, 0xA2, 0x91}, // Ƶ
- {0xCDC7, 0x9893}, //{0xE9, 0xA2, 0x93}, // ÍÇ
+ {0xCDC7, 0x9893}, //{0xE9, 0xA2, 0x93}, // ��
{0xD3B1, 0x9896}, //{0xE9, 0xA2, 0x96}, // Ó±
- {0xBFC5, 0x9897}, //{0xE9, 0xA2, 0x97}, // ¿Å
- {0xCCE2, 0x9898}, //{0xE9, 0xA2, 0x98}, // Ìâ
- {0xD1D5, 0x989C}, //{0xE9, 0xA2, 0x9C}, // ÑÕ
- {0xB6EE, 0x989D}, //{0xE9, 0xA2, 0x9D}, // ¶î
- {0xB5DF, 0x98A0}, //{0xE9, 0xA2, 0xA0}, // µß
- {0xB2FC, 0x98A4}, //{0xE9, 0xA2, 0xA4}, // ²ü
- {0xB7E7, 0x98CE}, //{0xE9, 0xA3, 0x8E}, // ·ç
- {0xECAA, 0x98D2}, //{0xE9, 0xA3, 0x92}, // ìª
+ {0xBFC5, 0x9897}, //{0xE9, 0xA2, 0x97}, // ��
+ {0xCCE2, 0x9898}, //{0xE9, 0xA2, 0x98}, // ��
+ {0xD1D5, 0x989C}, //{0xE9, 0xA2, 0x9C}, // ��
+ {0xB6EE, 0x989D}, //{0xE9, 0xA2, 0x9D}, // ��
+ {0xB5DF, 0x98A0}, //{0xE9, 0xA2, 0xA0}, // ��
+ {0xB2FC, 0x98A4}, //{0xE9, 0xA2, 0xA4}, // ��
+ {0xB7E7, 0x98CE}, //{0xE9, 0xA3, 0x8E}, // ��
+ {0xECAA, 0x98D2}, //{0xE9, 0xA3, 0x92}, // �
{0xC6AE, 0x98D8}, //{0xE9, 0xA3, 0x98}, // Æ®
- {0xB7C9, 0x98DE}, //{0xE9, 0xA3, 0x9E}, // ·É
+ {0xB7C9, 0x98DE}, //{0xE9, 0xA3, 0x9E}, // ��
{0xCAB3, 0x98DF}, //{0xE9, 0xA3, 0x9F}, // ʳ
- {0xB2CD, 0x9910}, //{0xE9, 0xA4, 0x90}, // ²Í
- {0xBCA2, 0x9965}, //{0xE9, 0xA5, 0xA5}, // ¼¢
- {0xB7B9, 0x996D}, //{0xE9, 0xA5, 0xAD}, // ·¹
- {0xD2FB, 0x996E}, //{0xE9, 0xA5, 0xAE}, // Òû
- {0xCACE, 0x9970}, //{0xE9, 0xA5, 0xB0}, // ÊÎ
- {0xB1A5, 0x9971}, //{0xE9, 0xA5, 0xB1}, // ±¥
- {0xCBC7, 0x9972}, //{0xE9, 0xA5, 0xB2}, // ËÇ
- {0xB6FC, 0x9975}, //{0xE9, 0xA5, 0xB5}, // ¶ü
- {0xC8C4, 0x9976}, //{0xE9, 0xA5, 0xB6}, // ÈÄ
- {0xBDC8, 0x997A}, //{0xE9, 0xA5, 0xBA}, // ½È
- {0xB1FD, 0x997C}, //{0xE9, 0xA5, 0xBC}, // ±ý
- {0xB6F6, 0x997F}, //{0xE9, 0xA5, 0xBF}, // ¶ö
- {0xC4D9, 0x9981}, //{0xE9, 0xA6, 0x81}, // ÄÙ
- {0xCFDA, 0x9985}, //{0xE9, 0xA6, 0x85}, // ÏÚ
- {0xB9DD, 0x9986}, //{0xE9, 0xA6, 0x86}, // ¹Ý
- {0xB2F6, 0x998B}, //{0xE9, 0xA6, 0x8B}, // ²ö
- {0xE2C9, 0x998D}, //{0xE9, 0xA6, 0x8D}, // âÉ
- {0xC1F3, 0x998F}, //{0xE9, 0xA6, 0x8F}, // Áó
- {0xC2F8, 0x9992}, //{0xE9, 0xA6, 0x92}, // Âø
- {0xCAD7, 0x9996}, //{0xE9, 0xA6, 0x96}, // Ê×
- {0xCFE3, 0x9999}, //{0xE9, 0xA6, 0x99}, // Ïã
- {0xC2ED, 0x9A6C}, //{0xE9, 0xA9, 0xAC}, // Âí
- {0xCDD4, 0x9A6E}, //{0xE9, 0xA9, 0xAE}, // ÍÔ
+ {0xB2CD, 0x9910}, //{0xE9, 0xA4, 0x90}, // ��
+ {0xBCA2, 0x9965}, //{0xE9, 0xA5, 0xA5}, // ��
+ {0xB7B9, 0x996D}, //{0xE9, 0xA5, 0xAD}, // ��
+ {0xD2FB, 0x996E}, //{0xE9, 0xA5, 0xAE}, // ��
+ {0xCACE, 0x9970}, //{0xE9, 0xA5, 0xB0}, // ��
+ {0xB1A5, 0x9971}, //{0xE9, 0xA5, 0xB1}, // ��
+ {0xCBC7, 0x9972}, //{0xE9, 0xA5, 0xB2}, // ��
+ {0xB6FC, 0x9975}, //{0xE9, 0xA5, 0xB5}, // ��
+ {0xC8C4, 0x9976}, //{0xE9, 0xA5, 0xB6}, // ��
+ {0xBDC8, 0x997A}, //{0xE9, 0xA5, 0xBA}, // ��
+ {0xB1FD, 0x997C}, //{0xE9, 0xA5, 0xBC}, // ��
+ {0xB6F6, 0x997F}, //{0xE9, 0xA5, 0xBF}, // ��
+ {0xC4D9, 0x9981}, //{0xE9, 0xA6, 0x81}, // ��
+ {0xCFDA, 0x9985}, //{0xE9, 0xA6, 0x85}, // ��
+ {0xB9DD, 0x9986}, //{0xE9, 0xA6, 0x86}, // ��
+ {0xB2F6, 0x998B}, //{0xE9, 0xA6, 0x8B}, // ��
+ {0xE2C9, 0x998D}, //{0xE9, 0xA6, 0x8D}, // ��
+ {0xC1F3, 0x998F}, //{0xE9, 0xA6, 0x8F}, // ��
+ {0xC2F8, 0x9992}, //{0xE9, 0xA6, 0x92}, // ��
+ {0xCAD7, 0x9996}, //{0xE9, 0xA6, 0x96}, // ��
+ {0xCFE3, 0x9999}, //{0xE9, 0xA6, 0x99}, // ��
+ {0xC2ED, 0x9A6C}, //{0xE9, 0xA9, 0xAC}, // ��
+ {0xCDD4, 0x9A6E}, //{0xE9, 0xA9, 0xAE}, // ��
{0xD1B1, 0x9A6F}, //{0xE9, 0xA9, 0xAF}, // ѱ
- {0xB3DB, 0x9A70}, //{0xE9, 0xA9, 0xB0}, // ³Û
- {0xC7FD, 0x9A71}, //{0xE9, 0xA9, 0xB1}, // Çý
- {0xB2B5, 0x9A73}, //{0xE9, 0xA9, 0xB3}, // ²µ
+ {0xB3DB, 0x9A70}, //{0xE9, 0xA9, 0xB0}, // ��
+ {0xC7FD, 0x9A71}, //{0xE9, 0xA9, 0xB1}, // ��
+ {0xB2B5, 0x9A73}, //{0xE9, 0xA9, 0xB3}, // ��
{0xC2BF, 0x9A74}, //{0xE9, 0xA9, 0xB4}, // ¿
{0xCABB, 0x9A76}, //{0xE9, 0xA9, 0xB6}, // Ê»
- {0xBED4, 0x9A79}, //{0xE9, 0xA9, 0xB9}, // ¾Ô
+ {0xBED4, 0x9A79}, //{0xE9, 0xA9, 0xB9}, // ��
{0xD7A4, 0x9A7B}, //{0xE9, 0xA9, 0xBB}, // פ
- {0xCDD5, 0x9A7C}, //{0xE9, 0xA9, 0xBC}, // ÍÕ
- {0xBCDD, 0x9A7E}, //{0xE9, 0xA9, 0xBE}, // ¼Ý
- {0xC2EE, 0x9A82}, //{0xE9, 0xAA, 0x82}, // Âî
- {0xBDBE, 0x9A84}, //{0xE9, 0xAA, 0x84}, // ½¾
- {0xC2E6, 0x9A86}, //{0xE9, 0xAA, 0x86}, // Âæ
- {0xBAA7, 0x9A87}, //{0xE9, 0xAA, 0x87}, // º§
- {0xD1E9, 0x9A8C}, //{0xE9, 0xAA, 0x8C}, // Ñé
- {0xBFA5, 0x9A8F}, //{0xE9, 0xAA, 0x8F}, // ¿¥
- {0xC6EF, 0x9A91}, //{0xE9, 0xAA, 0x91}, // Æï
+ {0xCDD5, 0x9A7C}, //{0xE9, 0xA9, 0xBC}, // ��
+ {0xBCDD, 0x9A7E}, //{0xE9, 0xA9, 0xBE}, // ��
+ {0xC2EE, 0x9A82}, //{0xE9, 0xAA, 0x82}, // ��
+ {0xBDBE, 0x9A84}, //{0xE9, 0xAA, 0x84}, // ��
+ {0xC2E6, 0x9A86}, //{0xE9, 0xAA, 0x86}, // ��
+ {0xBAA7, 0x9A87}, //{0xE9, 0xAA, 0x87}, // ��
+ {0xD1E9, 0x9A8C}, //{0xE9, 0xAA, 0x8C}, // ��
+ {0xBFA5, 0x9A8F}, //{0xE9, 0xAA, 0x8F}, // ��
+ {0xC6EF, 0x9A91}, //{0xE9, 0xAA, 0x91}, // ��
{0xC6AD, 0x9A97}, //{0xE9, 0xAA, 0x97}, // Æ
{0xC9A7, 0x9A9A}, //{0xE9, 0xAA, 0x9A}, // ɧ
- {0xC2E2, 0x9AA1}, //{0xE9, 0xAA, 0xA1}, // Ââ
- {0xD6E8, 0x9AA4}, //{0xE9, 0xAA, 0xA4}, // Öè
- {0xB9C7, 0x9AA8}, //{0xE9, 0xAA, 0xA8}, // ¹Ç
- {0xCBE8, 0x9AD3}, //{0xE9, 0xAB, 0x93}, // Ëè
- {0xB8DF, 0x9AD8}, //{0xE9, 0xAB, 0x98}, // ¸ß
- {0xF7DE, 0x9B13}, //{0xE9, 0xAC, 0x93}, // ÷Þ
- {0xB9ED, 0x9B3C}, //{0xE9, 0xAC, 0xBC}, // ¹í
- {0xBFFD, 0x9B41}, //{0xE9, 0xAD, 0x81}, // ¿ý
- {0xBBEA, 0x9B42}, //{0xE9, 0xAD, 0x82}, // Ȑ
- {0xC6C7, 0x9B44}, //{0xE9, 0xAD, 0x84}, // ÆÇ
+ {0xC2E2, 0x9AA1}, //{0xE9, 0xAA, 0xA1}, // ��
+ {0xD6E8, 0x9AA4}, //{0xE9, 0xAA, 0xA4}, // ��
+ {0xB9C7, 0x9AA8}, //{0xE9, 0xAA, 0xA8}, // ��
+ {0xCBE8, 0x9AD3}, //{0xE9, 0xAB, 0x93}, // ��
+ {0xB8DF, 0x9AD8}, //{0xE9, 0xAB, 0x98}, // ��
+ {0xF7DE, 0x9B13}, //{0xE9, 0xAC, 0x93}, // ��
+ {0xB9ED, 0x9B3C}, //{0xE9, 0xAC, 0xBC}, // ��
+ {0xBFFD, 0x9B41}, //{0xE9, 0xAD, 0x81}, // ��
+ {0xBBEA, 0x9B42}, //{0xE9, 0xAD, 0x82}, // ��
+ {0xC6C7, 0x9B44}, //{0xE9, 0xAD, 0x84}, // ��
{0xCEBA, 0x9B4F}, //{0xE9, 0xAD, 0x8F}, // κ
{0xC4A7, 0x9B54}, //{0xE9, 0xAD, 0x94}, // ħ
- {0xD3E3, 0x9C7C}, //{0xE9, 0xB1, 0xBC}, // Óã
+ {0xD3E3, 0x9C7C}, //{0xE9, 0xB1, 0xBC}, // ��
{0xC2B3, 0x9C81}, //{0xE9, 0xB2, 0x81}, // ³
- {0xCFCA, 0x9C9C}, //{0xE9, 0xB2, 0x9C}, // ÏÊ
- {0xC0F0, 0x9CA4}, //{0xE9, 0xB2, 0xA4}, // Àð
- {0xF6EA, 0x9CAB}, //{0xE9, 0xB2, 0xAB}, // öê
- {0xBEA8, 0x9CB8}, //{0xE9, 0xB2, 0xB8}, // ¾¨
- {0xF6F9, 0x9CC4}, //{0xE9, 0xB3, 0x84}, // öù
- {0xF7A2, 0x9CCD}, //{0xE9, 0xB3, 0x8D}, // ÷¢
- {0xB1EE, 0x9CD6}, //{0xE9, 0xB3, 0x96}, // ±î
- {0xC1DB, 0x9CDE}, //{0xE9, 0xB3, 0x9E}, // ÁÛ
- {0xC4F1, 0x9E1F}, //{0xE9, 0xB8, 0x9F}, // Äñ
- {0xF0AF, 0x9E20}, //{0xE9, 0xB8, 0xA0}, // ð¯
- {0xBCA6, 0x9E21}, //{0xE9, 0xB8, 0xA1}, // ¼¦
- {0xC3F9, 0x9E23}, //{0xE9, 0xB8, 0xA3}, // Ãù
+ {0xCFCA, 0x9C9C}, //{0xE9, 0xB2, 0x9C}, // ��
+ {0xC0F0, 0x9CA4}, //{0xE9, 0xB2, 0xA4}, // ��
+ {0xF6EA, 0x9CAB}, //{0xE9, 0xB2, 0xAB}, // ��
+ {0xBEA8, 0x9CB8}, //{0xE9, 0xB2, 0xB8}, // ��
+ {0xF6F9, 0x9CC4}, //{0xE9, 0xB3, 0x84}, // ��
+ {0xF7A2, 0x9CCD}, //{0xE9, 0xB3, 0x8D}, // ��
+ {0xB1EE, 0x9CD6}, //{0xE9, 0xB3, 0x96}, // ��
+ {0xC1DB, 0x9CDE}, //{0xE9, 0xB3, 0x9E}, // ��
+ {0xC4F1, 0x9E1F}, //{0xE9, 0xB8, 0x9F}, // ��
+ {0xF0AF, 0x9E20}, //{0xE9, 0xB8, 0xA0}, // �
+ {0xBCA6, 0x9E21}, //{0xE9, 0xB8, 0xA1}, // ��
+ {0xC3F9, 0x9E23}, //{0xE9, 0xB8, 0xA3}, // ��
{0xC5B8, 0x9E25}, //{0xE9, 0xB8, 0xA5}, // Ÿ
{0xD1BB, 0x9E26}, //{0xE9, 0xB8, 0xA6}, // Ñ»
{0xD1BC, 0x9E2D}, //{0xE9, 0xB8, 0xAD}, // Ѽ
- {0xD1EC, 0x9E2F}, //{0xE9, 0xB8, 0xAF}, // Ñì
+ {0xD1EC, 0x9E2F}, //{0xE9, 0xB8, 0xAF}, // ��
{0xD4A7, 0x9E33}, //{0xE9, 0xB8, 0xB3}, // Ô§
- {0xCDD2, 0x9E35}, //{0xE9, 0xB8, 0xB5}, // ÍÒ
- {0xB8EB, 0x9E3D}, //{0xE9, 0xB8, 0xBD}, // ¸ë
- {0xBAE8, 0x9E3F}, //{0xE9, 0xB8, 0xBF}, // ºè
- {0xBEE9, 0x9E43}, //{0xE9, 0xB9, 0x83}, // ¾é
- {0xB6EC, 0x9E45}, //{0xE9, 0xB9, 0x85}, // ¶ì
- {0xF0C4, 0x9E49}, //{0xE9, 0xB9, 0x89}, // ðÄ
+ {0xCDD2, 0x9E35}, //{0xE9, 0xB8, 0xB5}, // ��
+ {0xB8EB, 0x9E3D}, //{0xE9, 0xB8, 0xBD}, // ��
+ {0xBAE8, 0x9E3F}, //{0xE9, 0xB8, 0xBF}, // ��
+ {0xBEE9, 0x9E43}, //{0xE9, 0xB9, 0x83}, // ��
+ {0xB6EC, 0x9E45}, //{0xE9, 0xB9, 0x85}, // ��
+ {0xF0C4, 0x9E49}, //{0xE9, 0xB9, 0x89}, // ��
{0xC8B5, 0x9E4A}, //{0xE9, 0xB9, 0x8A}, // ȵ
- {0xC5F4, 0x9E4F}, //{0xE9, 0xB9, 0x8F}, // Åô
- {0xBAD7, 0x9E64}, //{0xE9, 0xB9, 0xA4}, // º×
- {0xF0D0, 0x9E66}, //{0xE9, 0xB9, 0xA6}, // ðÐ
+ {0xC5F4, 0x9E4F}, //{0xE9, 0xB9, 0x8F}, // ��
+ {0xBAD7, 0x9E64}, //{0xE9, 0xB9, 0xA4}, // ��
+ {0xF0D0, 0x9E66}, //{0xE9, 0xB9, 0xA6}, // ��
{0xD3A5, 0x9E70}, //{0xE9, 0xB9, 0xB0}, // Ó¥
{0xC2B9, 0x9E7F}, //{0xE9, 0xB9, 0xBF}, // ¹
- {0xC2F3, 0x9EA6}, //{0xE9, 0xBA, 0xA6}, // Âó
- {0xF4EF, 0x9EB8}, //{0xE9, 0xBA, 0xB8}, // ôï
- {0xC2E9, 0x9EBB}, //{0xE9, 0xBA, 0xBB}, // Âé
- {0xBBC6, 0x9EC4}, //{0xE9, 0xBB, 0x84}, // Ȯ
- {0xCAF2, 0x9ECD}, //{0xE9, 0xBB, 0x8D}, // Êò
- {0xC0E8, 0x9ECE}, //{0xE9, 0xBB, 0x8E}, // Àè
- {0xBADA, 0x9ED1}, //{0xE9, 0xBB, 0x91}, // ºÚ
+ {0xC2F3, 0x9EA6}, //{0xE9, 0xBA, 0xA6}, // ��
+ {0xF4EF, 0x9EB8}, //{0xE9, 0xBA, 0xB8}, // ��
+ {0xC2E9, 0x9EBB}, //{0xE9, 0xBA, 0xBB}, // ��
+ {0xBBC6, 0x9EC4}, //{0xE9, 0xBB, 0x84}, // ��
+ {0xCAF2, 0x9ECD}, //{0xE9, 0xBB, 0x8D}, // ��
+ {0xC0E8, 0x9ECE}, //{0xE9, 0xBB, 0x8E}, // ��
+ {0xBADA, 0x9ED1}, //{0xE9, 0xBB, 0x91}, // ��
{0xC7AD, 0x9ED4}, //{0xE9, 0xBB, 0x94}, // Ç
{0xC4AC, 0x9ED8}, //{0xE9, 0xBB, 0x98}, // Ĭ
- {0xB6A6, 0x9F0E}, //{0xE9, 0xBC, 0x8E}, // ¶¦
- {0xB9C4, 0x9F13}, //{0xE9, 0xBC, 0x93}, // ¹Ä
- {0xCAF3, 0x9F20}, //{0xE9, 0xBC, 0xA0}, // Êó
- {0xB1C7, 0x9F3B}, //{0xE9, 0xBC, 0xBB}, // ±Ç
- {0xC6EB, 0x9F50}, //{0xE9, 0xBD, 0x90}, // Æë
- {0xB3DD, 0x9F7F}, //{0xE9, 0xBD, 0xBF}, // ³Ý
- {0xC1E4, 0x9F84}, //{0xE9, 0xBE, 0x84}, // Áä
- {0xC1FA, 0x9F99}, //{0xE9, 0xBE, 0x99}, // Áú
- {0xB9EA, 0x9F9F}, //{0xE9, 0xBE, 0x9F}, // ¹ê
+ {0xB6A6, 0x9F0E}, //{0xE9, 0xBC, 0x8E}, // ��
+ {0xB9C4, 0x9F13}, //{0xE9, 0xBC, 0x93}, // ��
+ {0xCAF3, 0x9F20}, //{0xE9, 0xBC, 0xA0}, // ��
+ {0xB1C7, 0x9F3B}, //{0xE9, 0xBC, 0xBB}, // ��
+ {0xC6EB, 0x9F50}, //{0xE9, 0xBD, 0x90}, // ��
+ {0xB3DD, 0x9F7F}, //{0xE9, 0xBD, 0xBF}, // ��
+ {0xC1E4, 0x9F84}, //{0xE9, 0xBE, 0x84}, // ��
+ {0xC1FA, 0x9F99}, //{0xE9, 0xBE, 0x99}, // ��
+ {0xB9EA, 0x9F9F}, //{0xE9, 0xBE, 0x9F}, // ��
#endif
};
static const unsigned short table_BIG5_to_UCS2[][2] = {
@@ -24826,7 +24833,7 @@ static const unsigned short table_BIG5_to_UCS2[][2] = {
0xFEFD,0xE30F,
0xFEFE,0xE310,
};
-
+#endif
#define NUMOF_TAB_GBK_TO_UCS2 sizeof(table_GBK_to_UCS2)/sizeof(table_GBK_to_UCS2[0])
#define NUMOF_TAB_BIG5_TO_UCS2 sizeof(table_BIG5_to_UCS2)/sizeof(table_BIG5_to_UCS2[0])
@@ -25205,7 +25212,7 @@ bool is_str_utf8(const char* str)
if ((chr & 0xC0) != 0x80) {
return false;
}
- //¼õµ½ÎªÁãΪֹ
+ //����Ϊ��Ϊֹ
nBytes--;
}
}
diff --git a/platform/vendor_bsp/LN/ln882x/src/utils/system_parameter.c b/platform/vendor_bsp/LN/ln882x/src/utils/system_parameter.c
index bffe8fb6..c5da34d5 100644
--- a/platform/vendor_bsp/LN/ln882x/src/utils/system_parameter.c
+++ b/platform/vendor_bsp/LN/ln882x/src/utils/system_parameter.c
@@ -17,10 +17,6 @@ typedef struct {
uint8_t ap_hostname[NETIF_HOSTNAME_LEN_MAX+1];
} hostname_t;
-typedef struct {
- wifi_psk_info_t psk_info_list[WIFI_PSK_INFO_LIST_SIZE];
-} wifi_psk_info_list_t;
-
typedef enum {
WIFI_COMMON_CONFIG = 0,
WIFI_STA_CONFIG,
@@ -42,7 +38,6 @@ typedef struct system_parameter{
uint8_t dhcp_sw_config;
hostname_t hostname_cfg;
server_config_t dhcpd_config;
- wifi_psk_info_list_t psk_info_list;
OS_Mutex_t lock;
}system_parameter_t;
@@ -58,7 +53,6 @@ typedef struct {
uint8_t dhcp_sw_config;
hostname_t hostname_cfg;
server_config_t dhcpd_config;
- wifi_psk_info_list_t psk_info_list;
}item;
} system_param_item_t;
@@ -221,13 +215,6 @@ void system_parameter_sync_to_flash(system_param_item_t *param_item)
}
break;
- case WIFI_PSK_INFO: {
- cache_content = (uint8_t *)&(param_item->item.psk_info_list);
- len = sizeof(wifi_psk_info_list_t);
- start = (uint8_t *)&(system_parameter->psk_info_list) - system_parameter_base;
- }
- break;
-
default:
break;
}
@@ -325,111 +312,6 @@ int system_parameter_get_config(wifi_interface_enum_t if_index, wifi_config_t *c
return 0;
}
-static int system_parameter_set_psk_info_list(wifi_psk_info_list_t *psk_info_list)
-{
- system_parameter_t *system_parameter = get_system_parameter_handle();
- system_param_item_t *param_item = get_param_item_cache();
-
- ART_ASSERT(system_parameter && psk_info_list);
- OS_MutexLock(&system_parameter->lock, OS_WAIT_FOREVER);
- param_item->item_id = (uint32_t)WIFI_PSK_INFO;
- memcpy(¶m_item->item.psk_info_list, psk_info_list, sizeof(wifi_psk_info_list_t));
- system_parameter_sync_to_flash(param_item);
- OS_MutexUnlock(&system_parameter->lock);
- return 0;
-}
-static int system_parameter_get_psk_info_list( wifi_psk_info_list_t *psk_info_list)
-{
- system_parameter_t *system_parameter = get_system_parameter_handle();
-
- ART_ASSERT(system_parameter && psk_info_list);
- OS_MutexLock(&system_parameter->lock, OS_WAIT_FOREVER);
- memcpy(psk_info_list, &(system_parameter->psk_info_list), sizeof(wifi_psk_info_list_t));
- OS_MutexUnlock(&system_parameter->lock);
- return 0;
-}
-
-//PSK info
-int system_parameter_set_psk_info(wifi_psk_info_t *psk_info)
-{
- int i, idx_idle = -1;
- wifi_psk_info_t *wifi_psk_info = NULL;
- wifi_psk_info_list_t wifi_psk_info_list = {0,};
- bool need_flush = false;
-
- ART_ASSERT(psk_info);
-
- if(0 == system_parameter_get_psk_info_list(&wifi_psk_info_list))
- {
- for(i = 0; i < (sizeof(wifi_psk_info_list_t)/sizeof(wifi_psk_info_t)); i++){
- wifi_psk_info = &(wifi_psk_info_list.psk_info_list[i]);
- //Got it
- if((psk_info->ssid_len == wifi_psk_info->ssid_len)
- && (psk_info->password_len == wifi_psk_info->password_len)
- && ((psk_info->password_len > 0) && !memcmp(psk_info->password, wifi_psk_info->password, psk_info->password_len))
- && ((psk_info->ssid_len > 0) && !memcmp(psk_info->ssid, wifi_psk_info->ssid, psk_info->ssid_len))){
- break;
- }
-
- //First idle
- if((idx_idle < 0)
- && (psk_info->password_len == 0)
- && (psk_info->ssid_len == 0)){
- idx_idle = i;
- }
- }
- if(i < (sizeof(wifi_psk_info_list_t)/sizeof(wifi_psk_info_t))){//already in list
- wifi_psk_info = &(wifi_psk_info_list.psk_info_list[i]);
- if(memcmp(psk_info->psk, wifi_psk_info->psk, 40) != 0){//update
- memcpy(wifi_psk_info->psk, psk_info->psk, 40);
- need_flush = true;
- }
- }else if(idx_idle >= 0 && idx_idle < (sizeof(wifi_psk_info_list_t)/sizeof(wifi_psk_info_t))){
- wifi_psk_info = &(wifi_psk_info_list.psk_info_list[i]);
- memcpy(wifi_psk_info, psk_info, sizeof(wifi_psk_info_t));
- need_flush = true;
- }else{
- wifi_psk_info = &(wifi_psk_info_list.psk_info_list[0]);
- memcpy(wifi_psk_info, psk_info, sizeof(wifi_psk_info_t));
- need_flush = true;
- }
-
- if(need_flush){
- system_parameter_set_psk_info_list(&wifi_psk_info_list);
- }
- return 0;
- }
- return -1;
-}
-int system_parameter_get_psk_info(wifi_psk_info_t *psk_info)
-{
- int i;
- wifi_psk_info_t *wifi_psk_info = NULL;
- wifi_psk_info_list_t wifi_psk_info_list = {0,};
-
- ART_ASSERT(psk_info);
-
- if(0 == system_parameter_get_psk_info_list(&wifi_psk_info_list))
- {
- for(i = 0; i < (sizeof(wifi_psk_info_list_t)/sizeof(wifi_psk_info_t)); i++){
- wifi_psk_info = &(wifi_psk_info_list.psk_info_list[i]);
- //Got it
- if((psk_info->ssid_len == wifi_psk_info->ssid_len)
- && (psk_info->password_len == wifi_psk_info->password_len)
- && ((psk_info->password_len > 0) && !memcmp(psk_info->password, wifi_psk_info->password, psk_info->password_len))
- && ((psk_info->ssid_len > 0) && !memcmp(psk_info->ssid, wifi_psk_info->ssid, psk_info->ssid_len))){
- break;
- }
- }
- if(i < (sizeof(wifi_psk_info_list_t)/sizeof(wifi_psk_info_t))){//already in list
- wifi_psk_info = &(wifi_psk_info_list.psk_info_list[i]);
- memcpy(psk_info, wifi_psk_info, sizeof(wifi_psk_info_t));
- return 0;
- }
- }
- return -1;
-}
-
//ip config
int system_parameter_set_ip_config(wifi_interface_enum_t if_index, tcpip_ip_info_t *ip_config)
{
@@ -594,8 +476,12 @@ int system_parameter_get_wifi_config_default (wifi_interface_enum_t if_index, wi
memcpy(ap->ssid, WIFI_AP_SSID_DEFAULT, ap->ssid_len);
len = (strlen(WIFI_AP_PASSWORD_DEFAULT) < PASSWORD_MAX_LEN) ? strlen(WIFI_AP_PASSWORD_DEFAULT) : PASSWORD_MAX_LEN;
memcpy(ap->password, WIFI_AP_PASSWORD_DEFAULT, len);
+ if(strlen((const char *)ap->password) > 0){
+ ap->authmode = WIFI_AUTH_WPA2_PSK;
+ }else{
+ ap->authmode = WIFI_AP_AUTH_MODE_DEFAULT;
+ }
ap->channel = WIFI_AP_CHANNEL_DEFAULT;
- ap->authmode = WIFI_AP_AUTH_MODE_DEFAULT;
ap->ssid_hidden = WIFI_AP_SSID_HIDDEN_DEFAULT;
ap->max_connection = WIFI_AP_MAX_CONNECTION_DEFAULT;
ap->beacon_interval = WIFI_AP_BEACON_INTERVAL_DEFAULT;
diff --git a/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_manager/wifi_manager.c b/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_manager/wifi_manager.c
index 3e5969cd..c617b68d 100644
--- a/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_manager/wifi_manager.c
+++ b/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_manager/wifi_manager.c
@@ -7,7 +7,7 @@
#include "dhcpd/dhcpd.h"
#define WIFI_MANAGER_TASK_STACK_SIZE 5*256 //Byte
-#define WIFI_MSG_QUEUE_DEPTH 5
+#define WIFI_MSG_QUEUE_DEPTH 10
struct wifi_manager_ctrl{
@@ -17,8 +17,14 @@ struct wifi_manager_ctrl{
};
static wifi_manager_ctrl_t gwifi_manager_ctrl= {0,};
-bool reg_wifi_msg_callbcak(wifi_manager_ctrl_t *manager_ctrl, wifi_msg_id_enum_t msg_id, wifi_msg_callback_fun callback_fun)
+static wifi_manager_ctrl_t *wifi_manager_get_handle(void)
{
+ return &gwifi_manager_ctrl;
+}
+
+bool reg_wifi_msg_callbcak(wifi_msg_id_enum_t msg_id, wifi_msg_callback_fun callback_fun)
+{
+ wifi_manager_ctrl_t *manager_ctrl = wifi_manager_get_handle();
wifi_msg_handle_table_t *msg_handler_table = NULL;
ART_ASSERT(manager_ctrl);
@@ -57,15 +63,11 @@ static void wifi_manager_task_entry(void *params)
case WIFI_MSG_ID_STA_READY:
//turn on WIFI LED
- #if (WIFI_TRACK==0)
- LOG(LOG_LVL_INFO, "[%s, %d]WIFI_MSG_ID_WIFI_READY\r\n", __func__, __LINE__);
- #endif
+ LOG(LOG_LVL_TRACE, "[%s, %d]WIFI_MSG_ID_WIFI_READY\r\n", __func__, __LINE__);
break;
case WIFI_MSG_ID_STA_SCAN_DONE:
- #if (WIFI_TRACK==0)
- LOG(LOG_LVL_INFO, "[%s, %d]WIFI_MSG_ID_STA_SCAN_DONE\r\n", __func__, __LINE__);
- #endif
+ LOG(LOG_LVL_TRACE, "[%s, %d]WIFI_MSG_ID_STA_SCAN_DONE\r\n", __func__, __LINE__);
//update ap list
break;
@@ -151,9 +153,10 @@ static void wifi_manager_task_entry(void *params)
}
}
-bool wifi_manager_init(wifi_manager_ctrl_t *manager_ctrl)
+bool wifi_manager_init(void)
{
OS_Status ret = OS_OK;
+ wifi_manager_ctrl_t *manager_ctrl = wifi_manager_get_handle();
ART_ASSERT(manager_ctrl);
ret = OS_QueueCreate(&manager_ctrl->wifi_manager_msgq, WIFI_MSG_QUEUE_DEPTH, sizeof(wifi_msg_t));
@@ -169,11 +172,12 @@ bool wifi_manager_init(wifi_manager_ctrl_t *manager_ctrl)
return true;
}
-bool wifi_manager_deinit(wifi_manager_ctrl_t *manager_ctrl)
+bool wifi_manager_deinit(void)
{
OS_Status ret = OS_OK;
- ART_ASSERT(manager_ctrl);
+ wifi_manager_ctrl_t *manager_ctrl = wifi_manager_get_handle();
+ ART_ASSERT(manager_ctrl);
ret = OS_ThreadDelete(&manager_ctrl->wifi_manager_thread);
if (ret != OS_OK){
LOG(LOG_LVL_ERROR, "[%s, %d]OS_ThreadDelete manager_ctrl->wifi_manager_thread fail.\r\n", __func__, __LINE__);
@@ -188,9 +192,4 @@ bool wifi_manager_deinit(wifi_manager_ctrl_t *manager_ctrl)
return true;
}
-wifi_manager_ctrl_t *wifi_manager_get_handle(void)
-{
- return &gwifi_manager_ctrl;
-}
-
diff --git a/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_port/itypes.h b/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_port/itypes.h
new file mode 100644
index 00000000..a8a9b6d8
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_port/itypes.h
@@ -0,0 +1,52 @@
+/*---------------------------------------------------------------------------*
+ | @author : LightningSemi WLAN Software Team |
+ | @version : V2.0.0 |
+ | @date : 1-May-2018 |
+ | @brief : IEEE 802.11 a/b/g/e/i/n MAC Software |
+ |---------------------------------------------------------------------------|
+ | COPYRIGHT(c) 2018 LightningSemi |
+ *---------------------------------------------------------------------------*/
+
+
+/*****************************************************************************/
+/* */
+/* File Name : itypes.h */
+/* */
+/* Description : This file contains all the data type definitions for */
+/* MAC implementation. */
+/* */
+/* List of Functions : None */
+/* Issues / Problems : None */
+/* */
+/*****************************************************************************/
+
+#ifndef ITYPES_H
+#define ITYPES_H
+
+/*****************************************************************************/
+/* Constants */
+/*****************************************************************************/
+
+#define INLINE static __inline
+
+/*****************************************************************************/
+/* Data Types */
+/*****************************************************************************/
+
+typedef int WORD32;
+typedef short WORD16;
+typedef char WORD8;
+typedef unsigned int UWORD32;
+typedef unsigned short UWORD16;
+typedef unsigned char UWORD8;
+typedef signed char SWORD8;
+
+/*****************************************************************************/
+/* Enums */
+/*****************************************************************************/
+
+typedef enum {BFALSE = 0,
+ BTRUE = 1
+} BOOL_T;
+
+#endif /* ITYPES_H */
diff --git a/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_port/wifi_port.c b/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_port/wifi_port.c
new file mode 100644
index 00000000..8ede4e45
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_port/wifi_port.c
@@ -0,0 +1,62 @@
+#include "wifi_port.h"
+#include "ln_kv_err.h"
+#include "ln_kv_api.h"
+#include "itypes.h"
+#include "osal/osal.h"
+
+#define KV_PSK_INFO ("kv_psk_info")
+
+/* restore/store psk info */
+int kv_set_psk_info_list(uint8_t *v_buf, uint32_t buf_len)
+{
+ if (KV_ERR_NONE != ln_kv_set((const char *)KV_PSK_INFO, v_buf, (size_t)buf_len)) {
+ return BFALSE;
+ }
+ return BTRUE;
+}
+
+int kv_get_psk_info_list(uint8_t *v_buf, uint32_t buf_len)
+{
+ size_t len;
+ if (KV_ERR_NONE != ln_kv_get((const char *)KV_PSK_INFO, v_buf, (size_t)buf_len, &len)) {
+ return BFALSE;
+ }
+ return BTRUE;
+}
+
+int kv_has_psk_info_list(void)
+{
+ size_t len;
+ if (LN_TRUE == ln_kv_has_key((const char *)KV_PSK_INFO)) {
+ return BTRUE;
+ }
+ return BFALSE;
+}
+
+/* heap memory manager */
+void *mac_malloc(uint32_t size)
+{
+ return OS_Malloc(size);
+}
+
+void mac_free(void *ptr)
+{
+ OS_Free(ptr);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_port/wifi_port.h b/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_port/wifi_port.h
new file mode 100644
index 00000000..fccaa1c8
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/src/wifi/wifi_port/wifi_port.h
@@ -0,0 +1,15 @@
+#ifndef __WIFI_PORT_H__
+#define __WIFI_PORT_H__
+
+#include "ln_types.h"
+
+int kv_has_psk_info_list(void);
+int kv_set_psk_info_list(uint8_t *v_buf, uint32_t buf_len);
+int kv_get_psk_info_list(uint8_t *v_buf, uint32_t buf_len);
+
+void *mac_malloc(uint32_t size);
+void mac_free(void *ptr);
+
+
+#endif /* __WIFI_PORT_H__ */
+
diff --git a/platform/vendor_bsp/LN/ln882x/tools/bin/fpu_patch.exe b/platform/vendor_bsp/LN/ln882x/tools/bin/fpu_patch.exe
deleted file mode 100644
index 81e2a537..00000000
Binary files a/platform/vendor_bsp/LN/ln882x/tools/bin/fpu_patch.exe and /dev/null differ
diff --git a/platform/vendor_bsp/LN/ln882x/tools/bin/mkimage.exe b/platform/vendor_bsp/LN/ln882x/tools/bin/mkimage.exe
index 52c00aad..f9cbb2db 100644
Binary files a/platform/vendor_bsp/LN/ln882x/tools/bin/mkimage.exe and b/platform/vendor_bsp/LN/ln882x/tools/bin/mkimage.exe differ
diff --git a/platform/vendor_bsp/LN/ln882x/tools/user_cmd/before_build.py b/platform/vendor_bsp/LN/ln882x/tools/user_cmd/before_build.py
new file mode 100644
index 00000000..8c8d701b
--- /dev/null
+++ b/platform/vendor_bsp/LN/ln882x/tools/user_cmd/before_build.py
@@ -0,0 +1,86 @@
+#!env python3
+# -*- coding: utf-8 -*-
+# @Time : 2020/5/10 11:53
+# @Author : WuLiang
+# @FileName: before_build.py
+# @Software: PyCharm
+
+import json
+import sys
+
+ALIGN = "32"
+image_header_size = "0x100"
+
+def json2macro(rfile_path,wfile_path):
+ result = dict()
+ try:
+ with open(rfile_path,'r',encoding='utf-8') as f:
+ result = json.loads(f.read())
+ except Exception as e:
+ pass
+
+ with open(wfile_path, "w+") as f:
+ file_v = wfile_path.split("\\")[-1].replace(".h","").upper()
+ startcomment = "#ifndef __" + file_v + "__\n#define __" + file_v + "__\n\n\n//flash partition map,it's generated by the script based on the json file \n"
+ f.writelines(startcomment)
+
+ count = 0
+ last_name1 = ""
+ last_name2 = ""
+ for key,value in result.items():
+ try:
+ if key not in ["Warning1","Warning2"]:
+ for i in value:
+ name1 = i['partition_type'] + "_SPACE_OFFSET"
+ name2 = i['partition_type'] + "_SPACE_SIZE"
+
+ temp1 = "".join(["#define ", format(name1," <"+ALIGN), " (", i['start_addr'], ")"])
+ temp2 = "".join(["#define ", format(name2," <"+ALIGN), " (1024*", str(i['size_KB']), ')'])
+
+ f.writelines("\n"+temp1+"\n")
+ f.writelines(temp2+"\n")
+
+ if (count > 0):
+ temp3 = "".join(["#if (", name1, " < (", last_name1, " + ", last_name2, "))"])
+ f.writelines(temp3 + "\n")
+ f.writelines(" #error \"flash partition overlap,please check !!!\"\n")
+ f.writelines("#endif\n")
+
+ count = count + 1
+ last_name1 = name1
+ last_name2 = name2
+ except Exception as e:
+ print(e)
+
+
+ temp = "".join(["\n\n#define ", format("IMAGE_HEADER_SIZE"," <"+ALIGN), " ", "("+image_header_size+")"])
+ f.writelines(temp)
+ endcommont = "\n\n#endif /* __" + file_v + "__ */\n\n"
+ f.writelines(endcommont)
+
+
+def main(argv):
+ arg_count = len(sys.argv)
+ # print("arg count = ", arg_count)
+ # print(sys.argv[1])
+ # print(sys.argv[2])
+
+ if arg_count == 3:
+ rfile_path = sys.argv[1]
+ wfile_path = sys.argv[2]
+ json2macro(rfile_path, wfile_path)
+ else:
+ assert arg_count == 3
+
+
+if __name__ == "__main__":
+ version = sys.version.split(' ')[0]
+ if version < str(3):
+ print("pyhton version is too low,please install python3 !\n")
+ assert version < str(3)
+ else:
+ main(sys.argv)
+
+
+
+
diff --git a/platform/vendor_bsp/LN/ln882x/tools/user_cmd/gen_flash.exe b/platform/vendor_bsp/LN/ln882x/tools/user_cmd/gen_flash.exe
deleted file mode 100644
index af0e394b..00000000
Binary files a/platform/vendor_bsp/LN/ln882x/tools/user_cmd/gen_flash.exe and /dev/null differ