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