1 /*
2  * Copyright (C) 2020-2022 Alibaba Group Holding Limited
3  */
4 
5 #ifndef CH395_CMD_H
6 #define CH395_CMD_H
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 /* ********************************************************************************************************************* */
13 /* 命令代码 */
14 /* 一个命令操作顺序包含:
15           一个命令码(对于串口方式,命令码之前还需要两个同步码),
16           若干个输入数据(可以是0个),
17           若干个输出数据(可以是0个)
18        命令码起名规则: CMDxy_NAME
19        其中的x和y都是数字, x说明最少输入数据个数(字节数), y说明最少输出数据个数(字节数), y如果是W表示需要等待命令执行成功
20        有些命令能够实现0到多个字节的数据块读写, 数据块本身的字节数未包含在上述x或y之内 */
21 /* ********************************************************************************************************************* */
22 #define CMD01_GET_IC_VER                          0x01                          /* 获取芯片以及固件版本号 */
23 /* 输出: 版本号( 位7为0, 位6为1, 位5~位0为版本号 ) */
24 /*       CH3395返回版本号的值为041H即版本号为01H */
25 
26 #define CMD31_SET_BAUDRATE                        0x02                          /* 串口方式: 设置串口通讯波特率(上电或者复位后的默认波特率为9600bps */
27 /* 输入: 3字节波特率,第字节在前 */
28 /* 输出: 操作状态( CMD_RET_SUCCESS, 其它值说明操作未完成 ) */
29 
30 #define CMD00_ENTER_SLEEP                         0x03                          /* 进入睡眠状态 */
31 
32 #define CMD00_RESET_ALL                           0x05                          /* 执行硬件复位 */
33 
34 #define CMD11_CHECK_EXIST                         0x06                          /* 测试通讯接口以及工作状态 */
35 /* 输入: 任意数据 */
36 /* 输出: 输入数据的按位取反 */
37 
38 #define CMD02_GET_GLOB_INT_STATUS_ALL             0x19                          /* 获取全局中断状态,V44版本以后的程序由于增加了socket数量需要用此命令获取全部的中断 */
39 /*输出:全局中断状态,参考全局中断状态定义 */
40 
41 #define CMD10_SET_PHY                             0x20                          /* 设置PHY,默认为Auto,自动协商 */
42 /* 输入:PHY参数,参考PHY参数定义 */
43 
44 #define CMD60_SET_MAC_ADDR                        0x21                          /* 设置MAC地址 必须在CMD00H_INIT_CH395之前设置完毕 */
45 /* 输入:6字节的MAC地址 */
46 
47 #define CMD40_SET_IP_ADDR                         0x22                          /* 设置IP地址 必须在CMD00H_INIT_CH395之前设置完毕 */
48 /* 输入:4字节的IP地址 */
49 
50 #define CMD40_SET_GWIP_ADDR                       0x23                          /* 设置网关IP地址 必须在CMD00H_INIT_CH395之前设置完毕 */
51 /* 输入:4字节的网关IP地址 */
52 
53 #define CMD40_SET_MASK_ADDR                       0x24                          /* 设置子网掩码, 必须在CMD00H_INIT_CH395之前设置完毕 */
54 /* 输入:4字节的子网掩码 */
55 
56 #define CMD90_SET_MAC_FILT                        0x25                          /* 设置MAC过滤 可以进行广播,多播等过滤 */
57 /* 输入:9字节参数,第1字节为过滤类型,参考过滤类型定义,*/
58 /*      第2至第5字节为HASH0,第6至第9字节为HASH1 */
59 
60 #define CMD01_GET_PHY_STATUS                      0x26                          /* 获取PHY当前状态,如断开连接,10/100M FULL/HALF */
61 /* 输出:当前PHY状态,状态定义请参考PHY参数定义 */
62 
63 #define CMD0W_INIT_CH395                          0x27                          /* 初始化CH395 */
64 /* 此命令执行时间大约200MS,需要等待此命令执行成功,才可以发下一条命令 */
65 
66 #define CMD08_GET_UNREACH_IPPORT                  0x28                          /* 获取不可达信息 */
67 /* 输出:8字节,第1字节为不可达类型,参考不可达类型定义 */
68 /*         第2字节协议不可达协议码 */
69 /*         第3,4字节不可达端口 */
70 /*         第5-8字不可达IP */
71 
72 #define CMD01_GET_GLOB_INT_STATUS                 0x29                          /* 获取全局中断状态,最大值为1S,不可以设置为0 */
73 /* 输出:全局中断状态,参考全局中断状态定义 */
74 
75 #define CMD10_SET_RETRAN_COUNT                    0x2A                          /* 重试次数,仅在TCP模式下有效 */
76 /* 输入:重试次数 */
77 
78 #define CMD20_SET_RETRAN_PERIOD                   0x2B                          /* 重试周期,最大值为20,仅在TCP模式下有效,不可以设置为0 */
79 /* 输入:重试周期 */
80 
81 #define CMD01_GET_CMD_STATUS                      0x2C                          /* 获取命令执行状态 */
82 /* 输出:命令执行状态,参考命令执行状态定义 */
83 
84 #define CMD06_GET_REMOT_IPP_SN                    0x2D                          /* 获取远端的端口以及IP地址,该命令在TCP服务器模式下使用 */
85 /* 输出:6字节,第1-4字节为远端的IP地址,第5-6字节为远端的端口号 */
86 
87 #define CMD10_CLEAR_RECV_BUF_SN                   0x2E                          /* 清除接收缓冲区  */
88 /* 输入:第1字节为socket的索引值 */
89 
90 #define CMD12_GET_SOCKET_STATUS_SN                0x2F                          /* 获取socket n状态 */
91 /* 输入:socket的索引值,*/
92 /* 输出:第1字节:socket n 打开或者关闭
93          第2字节:TCP状态,仅在TCP模式且第1字节为打开状态下有意义 */
94 
95 #define CMD11_GET_INT_STATUS_SN                   0x30                          /* 获取socket n的中断状态 */
96 /* 输入: socket的索引值*/
97 /* 输出:全局中断状态,参考全局中断状态定义 */
98 
99 #define CMD50_SET_IP_ADDR_SN                      0x31                          /* 设置socket n的目的IP地址 */
100 /* 输入:第1字节为socket的索引值,第2至5字节为IP地址 */
101 
102 #define CMD30_SET_DES_PORT_SN                     0x32                          /* 设置socket n的目的端口 */
103 /* 输入:第1字节为socket的索引值,第2至3字节为目的端口 */
104 
105 #define CMD30_SET_SOUR_PORT_SN                    0x33                           /* 设置socket n的源端口 */
106 /* 输入:第1字节为socket的索引值,第2至3字节为源端口 */
107 
108 #define CMD20_SET_PROTO_TYPE_SN                   0x34                          /* 设置socket n的协议类型 */
109 /* 输入:第1字节为socket的索引值,第2协议类型,参考协议类型定义 */
110 
111 #define CMD1W_OPEN_SOCKET_SN                      0x35                          /* 打开socket n */
112 /* 输入:第1字节为socket的索引值,此命令需要等待命令执行成功 */
113 
114 #define CMD1W_TCP_LISTEN_SN                       0x36                          /* socket n监听,收到此命令,socket n进入服务器模式,仅对TCP模式有效 */
115 /* 输入:第1字节为socket的索引值,此命令需要等待命令执行成功 */
116 
117 #define CMD1W_TCP_CONNECT_SN                      0x37                          /* socket n连接,收到此命令,socket n进入客户端模式,仅对TCP模式有效 */
118 /* 输入:第1字节为socket的索引值,此命令需要等待命令执行成功 */
119 
120 #define CMD1W_TCP_DISNCONNECT_SN                  0x38                          /* socket n断开连接,收到此命令,socket n断开已有连接,仅对TCP模式有效 */
121 /* 输入:第1字节为socket的索引值,此命令需要等待命令执行成功 */
122 
123 #define CMD30_WRITE_SEND_BUF_SN                   0x39                          /* 向socket n缓冲区写入数据 */
124 /* 输入:第1字节为socket的索引值,第2至3字节为长度 */
125 
126 #define CMD12_GET_RECV_LEN_SN                     0x3B                          /* 获取socket n接收数据的长度 */
127 /* 输入:socket的索引值 */
128 /* 输出:2字节的接收长度 */
129 
130 #define CMD30_READ_RECV_BUF_SN                    0x3C                          /* 读取socket n接收缓冲区数据 */
131 /* 输入:第1字节为socket的索引值,第2至3字节为读取的长度n,低位在前 */
132 /* 输出:n个数据 */
133 
134 #define CMD1W_CLOSE_SOCKET_SN                     0x3D                          /* 关闭socket n */
135 /* 输入:socket的索引值 */
136 
137 #define CMD20_SET_IPRAW_PRO_SN                    0x3E                          /* 在IP RAW下,设置socket n的IP包协议类型 */
138 /* 输入:第1字节为socket的索引值,第2字节为IP RAW协议类型 */
139 
140 #define CMD01_PING_ENABLE                         0x3F                          /* 开启/关闭PING */
141 /* 输入:1字节,0为关闭PING,1为开启PING,默认开启 */
142 
143 #define CMD06_GET_MAC_ADDR                        0x40                          /* 获取MAC地址 */
144 /* 输出:6字节的MAC地址 */
145 
146 #define CMD10_DHCP_ENABLE                         0x41                          /* DHCP使能 */
147 /* 输入:1字节,1启动DHCP,0关闭DHCP */
148 #define CMD01_GET_DHCP_STATUS                     0x42                          /* 获取DHCP状态 */
149 /* 输出: 1字节状态码,0表示成功,其他值失败 */
150 
151 #define CMD014_GET_IP_INF                         0x43                          /* IP,子网掩码,网关 */
152 /* 输出:20字节,分别为4字节IP,4字节网关,4字节掩码,4字节的DNS1,4字节的DNS2 */
153 
154 #define CMD00_PPPOE_SET_USER_NAME                 0x44                          /* 设置PPPOE用户名 */
155 /* 输入:N个字节,0为结束符 */
156 
157 #define CMD00_PPPOE_SET_PASSWORD                  0x45                          /* 设置密码 */
158 /* 输入:N个字节,0为结束符 */
159 
160 #define CMD10_PPPOE_ENABLE                        0x46                          /* PPPOE使能 */
161 /* 输入:1字节,1启动PPPOE,0关闭PPPOE */
162 
163 #define CMD01_GET_PPPOE_STATUS                    0x47                          /* 获取pppoe状态 */
164 /* 输出: 1字节状态码,0表示成功,其他值失败 */
165 
166 #define CMD20_SET_TCP_MSS                         0x50                          /* 设置TCP MSS */
167 /* 输入:TCP MSS,低位在前 */
168 
169 #define CMD20_SET_TTL                             0x51                          /* 设置TTL,TTL最大值为128 */
170 /* 输入:第1字节为socket的索引值,第2字节为TTL值,最大为128 */
171 
172 #define CMD30_SET_RECV_BUF                        0x52                          /* 设置SOCKET接收缓冲区 */
173 /* 输入:第1字节为socket的索引值,第2字节为起始块索引,第3字节为块数 */
174 
175 #define CMD30_SET_SEND_BUF                        0x53                          /* 设置SOCKET发送缓冲区 */
176 /* 输入:第1字节为socket的索引值,第2字节为起始块索引,第3字节为块数 */
177 
178 #define CMD10_SET_MAC_RECV_BUF                    0x54                          /* 设置MAC接收缓冲区 */
179 /* 输入:输入1字节的MAC接收缓冲区的大小,16字节为单位 */
180 
181 #define CMD40_SET_FUN_PARA                        0x55                          /* 设置功能参数 */
182 /* 输入:4字节的启动参数 */
183 
184 #define CMD40_SET_KEEP_LIVE_IDLE                  0x56                    /* 设置KEEPLIVE空闲 */
185 /*输入:4字节的保活定时器空闲时间参数,低位在前 */
186 
187 #define CMD40_SET_KEEP_LIVE_INTVL                 0x57                    /* 设置间隔时间 */
188 /*输入:4字节的保活定时器超时间隔,低位在前 */
189 
190 #define CMD10_SET_KEEP_LIVE_CNT                   0x58                    /* 重试次数 */
191 /*输入:1字节重试次数 */
192 
193 #define CMD20_SET_KEEP_LIVE_SN                    0X59                    /* 设置socket nkeeplive功能*/
194 /*输入:1个字节Socket索引,1个字节设置 */
195 
196 #define CMD00_EEPROM_ERASE                        0xE9                          /* 擦除EEPROM*/
197 
198 #define CMD30_EEPROM_WRITE                        0xEA                          /* 写EEPROM */
199 /* 输入:2字节地址,1字节长度,长度必须小于64字节 */
200 
201 #define CMD30_EEPROM_READ                         0xEB                          /* 读EEPROM */
202 /* 输入:2字节地址,1字节长度,长度必须小于64字节 */
203 
204 #define CMD10_READ_GPIO_REG                       0xEC                          /* 读GPIO寄存器 */
205 /* 输入:第1个字节为REG地址,关于地址请参考相关宏定义 */
206 
207 #define CMD20_WRITE_GPIO_REG                      0xED                          /* 写GPIO寄存器 */
208 /* 输入:第1个字节为REG地址,关于地址请参考相关宏定义 */
209 /*       第2个字节为数据 */
210 
211 /* 协议类型 */
212 #define PROTO_TYPE_IP_RAW                         0                             /* IP层原始数据 */
213 #define PROTO_TYPE_MAC_RAW                        1                             /* MAC层原始数据 */
214 #define PROTO_TYPE_UDP                            2                             /* UDP协议类型 */
215 #define PROTO_TYPE_TCP                            3                             /* TCP协议类型 */
216 
217 /* PHY 命令参数/状态 */
218 #define PHY_DISCONN                               (1<<0)                        /* PHY断开 */
219 #define PHY_10M_FLL                               (1<<1)                        /* 10M全双工 */
220 #define PHY_10M_HALF                              (1<<2)                        /* 10M半双工 */
221 #define PHY_100M_FLL                              (1<<3)                        /* 100M全双工 */
222 #define PHY_100M_HALF                             (1<<4)                        /* 100M半双工 */
223 #define PHY_AUTO                                  (1<<5)                        /* PHY自动模式,CMD10H_SET_PHY */
224 
225 /*CH395 MAC过滤*/
226 #define MAC_FILT_RECV_BORADPKT                    (1<<0)                        /* 使能接收广播包 */
227 #define MAC_FILT_RECV_ALL                         (1<<1)                        /* 使能接收所有数据包 */
228 #define MAC_FILT_RECV_MULTIPKT                    (1<<2)                        /* 使能接收多播包 */
229 #define MAC_FILT_RECV_ENABLE                      (1<<3)                        /* 使能接收 */
230 #define MAC_FILT_SEND_ENABLE                      (1<<4)                        /* 使能发送 */
231 
232 /* 中断状态 */
233 /* 以下为GLOB_INT会产生的状态 */
234 #define GINT_STAT_UNREACH                         (1<<0)                        /* 不可达中断 */
235 #define GINT_STAT_IP_CONFLI                       (1<<1)                        /* IP冲突 */
236 #define GINT_STAT_PHY_CHANGE                      (1<<2)                        /* PHY状态改变 */
237 #define GINT_STAT_DHCP                            (1<<3)                        /* DHCP/PPPOE 状态改变 */
238 #define GINT_STAT_SOCK0                           (1<<4)                        /* socket0 产生中断 */
239 #define GINT_STAT_SOCK1                           (1<<5)                        /* socket1 产生中断 */
240 #define GINT_STAT_SOCK2                           (1<<6)                        /* socket2 产生中断 */
241 #define GINT_STAT_SOCK3                           (1<<7)                        /* socket3 产生中断 */
242 #define GINT_STAT_SOCK4                           (1<<8)                        /* scoket4 产生中断 */
243 #define GINT_STAT_SOCK5                           (1<<9)                        /* scoket5 产生中断 */
244 #define GINT_STAT_SOCK6                           (1<<10)                       /* scoket6 产生中断 */
245 #define GINT_STAT_SOCK7                           (1<<11)                       /* scoket7 产生中断 */
246 
247 /*以下为Sn_INT会产生的状态*/
248 #define SINT_STAT_SENBUF_FREE                     (1<<0)                        /* 发送缓冲区空闲 */
249 #define SINT_STAT_SEND_OK                         (1<<1)                        /* 发送成功 */
250 #define SINT_STAT_RECV                            (1<<2)                        /* socket端口接收到数据或者接收缓冲区不为空 */
251 #define SINT_STAT_CONNECT                         (1<<3)                        /* 连接成功,TCP模式下产生此中断 */
252 #define SINT_STAT_DISCONNECT                      (1<<4)                        /* 连接断开,TCP模式下产生此中断 */
253 #define SINT_STAT_TIM_OUT                         (1<<6)                        /* ARP和TCP模式下会发生此中断 */
254 
255 /* 获取命令状态 */
256 #define CMD_ERR_SUCCESS                           0x00                          /* 命令操作成功 */
257 #define CMD_RET_ABORT                             0x5F                          /* 命令操作失败 */
258 #define CH395_ERR_BUSY                            0x10                          /* 忙状态,表示当前正在执行命令 */
259 #define CH395_ERR_MEM                             0x11                          /* 内存错误 */
260 #define CH395_ERR_BUF                             0x12                          /* 缓冲区错误 */
261 #define CH395_ERR_TIMEOUT                         0x13                          /* 超时 */
262 #define CH395_ERR_RTE                             0x14                          /* 路由错误*/
263 #define CH395_ERR_ABRT                            0x15                          /* 连接停止*/
264 #define CH395_ERR_RST                             0x16                          /* 连接复位 */
265 #define CH395_ERR_CLSD                            0x17                          /* 连接关闭/socket 在关闭状态 */
266 #define CH395_ERR_CONN                            0x18                          /* 无连接 */
267 #define CH395_ERR_VAL                             0x19                          /* 错误的值 */
268 #define CH395_ERR_ARG                             0x1a                          /* 错误的参数 */
269 #define CH395_ERR_USE                             0x1b                          /* 已经被使用 */
270 #define CH395_ERR_IF                              0x1c                          /* MAC错误  */
271 #define CH395_ERR_ISCONN                          0x1d                          /* 已连接 */
272 #define CH395_ERR_OPEN                            0X20                          /* 已经打开 */
273 #define CH395_ERR_UNKNOW                          0xFA                          /* 未知错误 */
274 
275 /* PPP状态 */
276 #define CH395_PPP_SUCCESS                         0                             /* 成功 */
277 #define CH395_PPPERR_PARM                         1                             /* 无效参数 */
278 #define CH395_PPPERR_OPEN                         2                             /* 无法打开PPP会话 */
279 #define CH395_PPPERR_DEVICE                       3                             /* 无效的PPP设备 */
280 #define CH395_PPPERR_ALLOC                        4                             /* 资源分配失败 */
281 #define CH395_PPPERR_USER                         5                             /* 用户中断 */
282 #define CH395_PPPERR_CONNECT                      6                             /* 连接断开 */
283 #define CH395_PPPERR_AUTHFAIL                     7                             /* 挑战鉴别失败 */
284 #define CH395_PPPERR_PROTOCOL                     8                             /* 握手协议失败 */
285 #define CH395_PPPERR_TIME_OUT                     9                             /* 超时失败 */
286 #define CH395_PPPERR_CLOSE                        10                            /* 关闭失败 */
287 
288 /* 不可达代码 */
289 #define UNREACH_CODE_HOST                         0                             /* 主机不可达 */
290 #define UNREACH_CODE_NET                          1                             /* 网络不可达 */
291 #define UNREACH_CODE_PROTOCOL                     2                             /* 协议不可达 */
292 #define UNREACH_CODE_PROT                         3                             /* 端口不可达 */
293 /*其他值请参考RFC792文档*/
294 
295 /* 命令包头 */
296 #define SER_SYNC_CODE1                            0x57                          /* 串口命令同步码1 */
297 #define SER_SYNC_CODE2                            0xAB                          /* 串口命令同步码2 */
298 
299 /* TCP状态 */
300 #define TCP_CLOSED                                0
301 #define TCP_LISTEN                                1
302 #define TCP_SYN_SENT                              2
303 #define TCP_SYN_RCVD                              3
304 #define TCP_ESTABLISHED                           4
305 #define TCP_FIN_WAIT_1                            5
306 #define TCP_FIN_WAIT_2                            6
307 #define TCP_CLOSE_WAIT                            7
308 #define TCP_CLOSING                               8
309 #define TCP_LAST_ACK                              9
310 #define TCP_TIME_WAIT                             10
311 
312 /* GPIO寄存器地址 */
313 #define GPIO_DIR_REG                              0x80                          /* 寄存器方向寄存器,1:输出;0:输入 */
314 #define GPIO_IN_REG                               0x81                          /* GPIO输入寄存器 */
315 #define GPIO_OUT_REG                              0x82                          /* GPIO输出寄存器 */
316 #define GPIO_CLR_REG                              0x83                          /* GPIO输出清除: 0=keep, 1=clear */
317 #define GPIO_PU_REG                               0x84                          /* GPIO上拉使能寄存器 */
318 #define GPIO_PD_REG                               0x85                          /* GPIO下拉使能寄存器 */
319 
320 /* 功能参数 */
321 #define FUN_PARA_FLAG_TCP_SERVER                  (1<<1)                        /* tcp server 多连接模式标志,0X44版本及以后支持 */
322 #define FUN_PARA_FLAG_LOW_PWR                     (1<<2)                        /* 低耗能模式 */
323 #define SOCK_CTRL_FLAG_SOCKET_CLOSE               (1<<3)                        /* CH395不主动关闭Socket */
324 #define SOCK_DISABLE_SEND_OK_INT                  (1<<4)                        /* send ok中断控制位,为1表示关闭send ok中断 */
325 
326 
327 #define MAX_SURPPORT_SOCK_NUM 4         /*default is 4, max is 8*/
328 
329 typedef struct {
330    uint8_t ipaddr[4];
331    uint8_t gateway[4];
332    uint8_t ip_mask[4];
333    uint8_t ip_dns1[4];
334    uint8_t ip_dns2[4];
335 } ch395_int_t;
336 
337 typedef struct {
338    ch395_int_t ip_info;
339    uint8_t     mac_addr[6];
340    uint8_t     phystate;
341    uint8_t     mac_filt;
342    uint16_t    retran_count;
343    uint16_t    retran_period;
344    uint8_t     int_mode;
345    uint16_t    unreach_port;
346    uint8_t     unreach_ip[4];
347 } st_ch395_info_t;
348 
349 #ifdef __cplusplus
350 }
351 #endif
352 
353 #endif /* CH395_CMD_H */
354