doubao_chat/apps/common/eth/w5500/w5500.h

296 lines
8.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _W5500_H_
#define _W5500_H_
#include "gpio.h"
#include <stdio.h>
#include "includes.h"
#include "os/os_api.h"
#include "w5500_socket.h"
#include "asm/port_waked_up.h"
/***************----- W5500 SPI设备定义 -----***************/
#define OS_SUPPORT 1 //支持操作系统
#define SPI_USE_DEV 1 //使用dev设备接口
#if SPI_USE_DEV
#define SPI_DEV_NAME "spi2" //spi设备名称,SPI速度 < 30MHz
#endif
/*board.c的SPI设备配置
SPI2_PLATFORM_DATA_BEGIN(spi2_data)
.clk = 24000000,
.mode = SPI_STD_MODE,
.attr = SPI_SCLK_L_UPL_SMPH | SPI_BIDIR_MODE | SPI_SCLK_PORT_HD,
.port = 'C',
SPI2_PLATFORM_DATA_END()
*/
/***************----- W5500 GPIO定义 -----***************/
#define W5500_RST_IO IO_PORTA_05 //定义W5500的RST引脚
#define W5500_CS_IO IO_PORTA_01 //定义W5500的CS引脚
#define W5500_SCLK_IO IO_PORTA_03 //定义W5500的SCLK引脚
#define W5500_MISO_IO IO_PORTA_02 //定义W5500的MISO引脚
#define W5500_MOSI_IO IO_PORTA_04 //定义W5500的MOSI引脚
#define W5500_INT_IO IO_PORTA_00 //定义W5500的INT引脚
#define W5500_INT_EVENT EVENT_IO_0 //中断引脚中断事件:EVENT_IO_0和EVENT_IO_1任意IO
#define W5500_INT_EDGE EDGE_NEGATIVE //中断引脚边沿触发:EDGE_NEGATIVE下降沿,EDGE_POSITIVE上升沿
#define W5500_RST_SET(x) gpio_direction_output(W5500_RST_IO,x)
#define W5500_INT_SET(x) gpio_direction_output(W5500_INT_IO,x)
#define W5500_CS_SET(x) gpio_direction_output(W5500_CS_IO,x)
#define W5500_SCLK_SET(x) gpio_direction_output(W5500_SCLK_IO,x)
#define W5500_MISO_SET(x) gpio_direction_output(W5500_MISO_IO,x)
#define W5500_MISO_GET() gpio_read(W5500_MISO_IO)
#define W5500_MOSI_SET(x) gpio_direction_output(W5500_MOSI_IO,x)
#define W5500_SCLK_SET_HD(x) gpio_set_hd(W5500_SCLK_IO,x)
/***************----- W5500 IO初始化 -----***************/
#define W5500_IO_INIT() \
{\
gpio_direction_output(W5500_RST_IO,1);\
gpio_direction_input(W5500_INT_IO);\
gpio_direction_output(W5500_CS_IO,1);\
gpio_direction_output(W5500_SCLK_IO,1);\
gpio_direction_input(W5500_MISO_IO);\
gpio_direction_output(W5500_MOSI_IO,1);\
}
/*******----- W5500 printf w5500_delay_ms -----************/
#define w5500_log printf
#if OS_SUPPORT
#define w5500_delay_ms(x) os_time_dly(x/10)
#else
#define w5500_delay_ms(x) delay_ms(x)
#endif
#define w5500_delay_us delay_us
#define delay_ms w5500_delay_ms
#define socket_delay_ms(x) w5500_delay_ms(x)
/***************----- W5500寄存器 -----********************/
/***************** Common Register *****************/
#define MR 0x0000
#define RST 0x80
#define WOL 0x20
#define PB 0x10
#define PPP 0x08
#define FARP 0x02
#define GAR 0x0001
#define SUBR 0x0005
#define SHAR 0x0009
#define SIPR 0x000f
#define INTLEVEL 0x0013
#define IR 0x0015
#define CONFLICT 0x80
#define UNREACH 0x40
#define PPPOE 0x20
#define MP 0x10
#define IMR 0x0016
#define IM_IR7 0x80
#define IM_IR6 0x40
#define IM_IR5 0x20
#define IM_IR4 0x10
#define SIR 0x0017
#define S7_INT 0x80
#define S6_INT 0x40
#define S5_INT 0x20
#define S4_INT 0x10
#define S3_INT 0x08
#define S2_INT 0x04
#define S1_INT 0x02
#define S0_INT 0x01
#define SIMR 0x0018
#define S7_IMR 0x80
#define S6_IMR 0x40
#define S5_IMR 0x20
#define S4_IMR 0x10
#define S3_IMR 0x08
#define S2_IMR 0x04
#define S1_IMR 0x02
#define S0_IMR 0x01
#define RTR 0x0019
#define RCR 0x001b
#define PTIMER 0x001c
#define PMAGIC 0x001d
#define PHA 0x001e
#define PSID 0x0024
#define PMRU 0x0026
#define UIPR 0x0028
#define UPORT 0x002c
#define PHYCFGR 0x002e
#define RST_PHY 0x80
#define OPMODE 0x40
#define DPX 0x04
#define SPD 0x02
#define LINK 0x01
#define VERR 0x0039
/********************* Socket Register *******************/
#define Sn_MR 0x0000
#define MULTI_MFEN 0x80
#define BCASTB 0x40
#define ND_MC_MMB 0x20
#define UCASTB_MIP6B 0x10
#define MR_CLOSE 0x00
#define MR_TCP 0x01
#define MR_UDP 0x02
#define MR_MACRAW 0x04
#define Sn_CR 0x0001
#define OPEN 0x01
#define LISTEN 0x02
#define CONNECT 0x04
#define DISCON 0x08
#define CLOSE 0x10
#define SEND 0x20
#define SEND_MAC 0x21
#define SEND_KEEP 0x22
#define RECV 0x40
#define Sn_IR 0x0002
#define IR_SEND_OK 0x10
#define IR_TIMEOUT 0x08
#define IR_RECV 0x04
#define IR_DISCON 0x02
#define IR_CON 0x01
#define Sn_SR 0x0003
#define SOCK_CLOSED 0x00
#define SOCK_INIT 0x13
#define SOCK_LISTEN 0x14
#define SOCK_ESTABLISHED 0x17
#define SOCK_CLOSE_WAIT 0x1c
#define SOCK_UDP 0x22
#define SOCK_MACRAW 0x02
#define SOCK_SYNSEND 0x15
#define SOCK_SYNRECV 0x16
#define SOCK_FIN_WAI 0x18
#define SOCK_CLOSING 0x1a
#define SOCK_TIME_WAIT 0x1b
#define SOCK_LAST_ACK 0x1d
#define Sn_PORT 0x0004
#define Sn_DHAR 0x0006
#define Sn_DIPR 0x000c
#define Sn_DPORTR 0x0010
#define Sn_MSSR 0x0012
#define Sn_TOS 0x0015
#define Sn_TTL 0x0016
#define Sn_RXBUF_SIZE 0x001e
#define Sn_TXBUF_SIZE 0x001f
#define Sn_TX_FSR 0x0020
#define Sn_TX_RD 0x0022
#define Sn_TX_WR 0x0024
#define Sn_RX_RSR 0x0026
#define Sn_RX_RD 0x0028
#define Sn_RX_WR 0x002a
#define Sn_IMR 0x002c
#define IMR_SENDOK 0x10
#define IMR_TIMEOUT 0x08
#define IMR_RECV 0x04
#define IMR_DISCON 0x02
#define IMR_CON 0x01
#define Sn_FRAG 0x002d
#define Sn_KPALVTR 0x002f
/*******************************************************************/
/************************ SPI Control Byte *************************/
/*******************************************************************/
/* Operation mode bits */
#define VDM 0x00
#define FDM1 0x01
#define FDM2 0x02
#define FDM4 0x03
/* Read_Write control bit */
#define RWB_READ 0x00
#define RWB_WRITE 0x04
/* Block select bits */
#define COMMON_R 0x00
/* Socket 0 */
#define S0_REG 0x08
#define S0_TX_BUF 0x10
#define S0_RX_BUF 0x18
/* Socket 1 */
#define S1_REG 0x28
#define S1_TX_BUF 0x30
#define S1_RX_BUF 0x38
/* Socket 2 */
#define S2_REG 0x48
#define S2_TX_BUF 0x50
#define S2_RX_BUF 0x58
/* Socket 3 */
#define S3_REG 0x68
#define S3_TX_BUF 0x70
#define S3_RX_BUF 0x78
/* Socket 4 */
#define S4_REG 0x88
#define S4_TX_BUF 0x90
#define S4_RX_BUF 0x98
/* Socket 5 */
#define S5_REG 0xa8
#define S5_TX_BUF 0xb0
#define S5_RX_BUF 0xb8
/* Socket 6 */
#define S6_REG 0xc8
#define S6_TX_BUF 0xd0
#define S6_RX_BUF 0xd8
/* Socket 7 */
#define S7_REG 0xe8
#define S7_TX_BUF 0xf0
#define S7_RX_BUF 0xf8
//#define TRUE 0xff
//#define FALSE 0x00
#define S_RX_SIZE 2048 /*定义Socket接收缓冲区的大小,可以根据W5500_RMSR的设置修改 */
#define S_TX_SIZE 2048 /*定义Socket发送缓冲区的大小,可以根据W5500_TMSR的设置修改 */
typedef unsigned char SOCKET; //自定义端口号数据类型
extern unsigned int W5500_ip_addr_get(void);
extern void W5500_Hardware_Reset(void);//硬件复位W5500
extern void W5500_Init(void);//初始化W5500寄存器函数
extern unsigned char Socket_Connect(SOCKET s);//设置指定Socket(0~7)为客户端与远程服务器连接
extern unsigned char Socket_Listen(SOCKET s);//设置指定Socket(0~7)作为服务器等待远程主机的连接
extern unsigned char Socket_UDP(SOCKET s);//设置指定Socket(0~7)为UDP模式
extern unsigned short Read_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr);//指定Socket(0~7)接收数据处理
extern void Write_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr, unsigned short size); //指定Socket(0~7)发送数据处理
extern void Write_W5500_nByte(unsigned short reg, unsigned char *dat_ptr, unsigned short size);
extern void Write_W5500_SOCK_1Byte(SOCKET s, unsigned short reg, unsigned char dat);
extern void Write_W5500_SOCK_2Byte(SOCKET s, unsigned short reg, unsigned short dat);
extern void Write_W5500_SOCK_4Byte(SOCKET s, unsigned short reg, unsigned char *dat_ptr);
extern void Write_W5500_1Byte(unsigned short reg, unsigned char dat);
extern void Write_W5500_2Byte(unsigned short reg, unsigned short dat);
extern void Write_W5500_nByte(unsigned short reg, unsigned char *dat_ptr, unsigned short size);
extern unsigned char Read_W5500_1Byte(unsigned short reg);
extern unsigned char Read_W5500_SOCK_1Byte(SOCKET s, unsigned short reg);
extern unsigned short Read_W5500_SOCK_2Byte(SOCKET s, unsigned short reg);
#endif