429 lines
15 KiB
C
429 lines
15 KiB
C
///******************************************************************************
|
||
// * @file drv_w5500.c
|
||
// * @brief w5500 drivers
|
||
// * @version V1.0
|
||
// * @author Gary
|
||
// * @copyright
|
||
// ******************************************************************************/
|
||
//#include "drv_gpio.h"
|
||
//#include "drv_w5500.h"
|
||
|
||
//#include "bsp_task.h"
|
||
|
||
//#include "kit_time.h"
|
||
//#include "kit_data.h"
|
||
//#include "kit_debug.h"
|
||
|
||
//#include "ucos_ii.h"
|
||
|
||
//OS_EVENT *w5500_semaphore;
|
||
|
||
////void drv_w5500_init(W5500Item *item, uint32_t ip, uint16_t *port_array, uint32_t gateway_ip, uint32_t net_mask, uint8_t *mac, uint16_t timeout)
|
||
////{
|
||
//// uint8_t buf[20];
|
||
//// uint32_t cnt = 0;
|
||
////
|
||
//// item->server_port = port_array;
|
||
//// //自动协商 最高位置位,否则PHY重启
|
||
//// buf[0] = 0x38 | 0x80 | 0x40;
|
||
//// drv_w5500_write_comm_reg(item, W5500_PHYCFGR_REG_0x2E, buf, 1);
|
||
////
|
||
//// buf[0] = 0;
|
||
//// while(((buf[0] & 0x01) == 0x00) && (cnt++ < 50))
|
||
//// {
|
||
//// bsp_task_delay_ms(100);
|
||
//// drv_w5500_read_comm_reg(item, W5500_PHYCFGR_REG_0x2E, buf, 1);
|
||
//// }
|
||
////
|
||
//// KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 connet res %d\r\n", cnt < 100);
|
||
//// cnt = 0;
|
||
//// //设置网关IP
|
||
//// WRITE_LT_INT32U(buf, cnt, gateway_ip);
|
||
//// drv_w5500_write_comm_reg(item, W5500_GAR0_REG_0x01, buf, 4);
|
||
////
|
||
//// //设置子网掩码
|
||
//// cnt = 0;
|
||
//// WRITE_LT_INT32U(buf, cnt, net_mask);
|
||
//// drv_w5500_write_comm_reg(item, W5500_SUBR0_REG_0x05, buf, 4);
|
||
////
|
||
//// //设置MAC 地址
|
||
//// cnt = 0;
|
||
//// kit_copy_buf(buf, mac, 6);
|
||
//// drv_w5500_write_comm_reg(item, W5500_SHAR0_REG_0x09, buf, 6);
|
||
////
|
||
//// //设置ip地址
|
||
//// cnt = 0;
|
||
//// WRITE_LT_INT32U(buf, cnt, ip);
|
||
//// drv_w5500_write_comm_reg(item, W5500_SIPR0_REG_0x0F, buf, 4);
|
||
////
|
||
//// buf[0] = timeout / 200;
|
||
//// drv_w5500_write_comm_reg(item, W5500_GAR0_REG_0x01, buf, 1);
|
||
////#ifdef W5500_DEBUG
|
||
//// drv_w5500_read_comm_reg(item, W5500_GAR0_REG_0x01, buf, 4 + 4 + 6 + 4);
|
||
//// KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 param:");
|
||
//// KIT_PRINTF_U8_BUF(buf, 4 + 4 + 6 + 4);
|
||
////#endif
|
||
//// w5500_semaphore = OSSemCreate(1);
|
||
////}
|
||
|
||
////uint8_t drv_w5500_get_socket_status(W5500Item *item, uint8_t socket)
|
||
////{
|
||
//// uint8_t buf[1];
|
||
//// uint8_t socket_reg = W5500_CREAT_SOCKET_REG(socket);
|
||
//// //读取当前socket状态
|
||
//// drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, buf, 1);
|
||
////
|
||
//// return buf[0];
|
||
////}
|
||
|
||
|
||
////bool drv_w5500_close_socket(W5500Item *item, uint8_t socket)
|
||
////{
|
||
//// bool res = false;
|
||
//// uint8_t tmp_buf[1];
|
||
//// uint32_t cnt;
|
||
//// uint8_t socket_reg = W5500_CREAT_SOCKET_REG(socket);
|
||
//// //读取当前socket状态
|
||
////
|
||
//// if(item->close_call != NULL)
|
||
//// {
|
||
//// item->close_call(socket);
|
||
//// }
|
||
//// drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, tmp_buf, 1);
|
||
//// KIT_MODULE_PRINTF(W5500_PRT_EN, "socket %d close st %x\r\n", socket, tmp_buf[0]);
|
||
//// if(tmp_buf[0] != SOCK_CLOSED)
|
||
//// {
|
||
//// tmp_buf[0] = SOCKET_CMD_CLOSE;
|
||
//// drv_w5500_write_socket_reg(item, socket_reg, Sn_CR_0x01, tmp_buf, 1);
|
||
////
|
||
//// cnt = 0;
|
||
//// while((tmp_buf[0] != SOCK_CLOSED) && (cnt++ < 20))
|
||
//// {
|
||
//// drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, tmp_buf, 1);
|
||
//// kit_time_dly_ms(1);
|
||
//// }
|
||
//// if(cnt < 20)
|
||
//// {
|
||
//// //强制关闭一个socket
|
||
//// tmp_buf[0] = 0;
|
||
//// drv_w5500_write_socket_reg(item, socket_reg, Sn_MR_0x00, tmp_buf, 1);
|
||
//// //清除socket所有中断
|
||
//// tmp_buf[0] = 0xFF;
|
||
//// drv_w5500_write_socket_reg(item, socket_reg, Sn_IR_0x02, tmp_buf, 1);
|
||
//// //关闭所有中断
|
||
//// tmp_buf[0] = 0;
|
||
//// drv_w5500_write_socket_reg(item, socket_reg, Sn_IMR_0x2C, tmp_buf, 1);
|
||
//// res = true;
|
||
//// }
|
||
//// }
|
||
////
|
||
//// return res;
|
||
////}
|
||
|
||
|
||
////MTU
|
||
//#define SOCKET_UDP_PACKSIZE 1472 //1-1472
|
||
//#define SOCKET_TCP_PACKSIZE 1460 //1-1460
|
||
//#define SOCKET_PPPOE_PACKSIZE 1464 //1-1464
|
||
//#define SOCKET_MACRAW_PACKSIZE 1514 //1-1514
|
||
|
||
//bool drv_w5500_creat_tcp_server(W5500Item *item, uint8_t socket, uint16_t local_port)
|
||
//{
|
||
// uint8_t tmp_buf[4];
|
||
// uint32_t cnt;
|
||
// uint8_t socket_reg = W5500_CREAT_SOCKET_REG(socket);
|
||
// if(socket < W5500_MAX_SOCKET_NUM)
|
||
// {
|
||
// //尝试关闭socket
|
||
// drv_w5500_close_socket(item, socket);
|
||
// kit_time_dly_ms(1);
|
||
//
|
||
// //设置位TCP模式 无延时ACK
|
||
// tmp_buf[0] = (SOCKET_TCP & 0x07) | 0x20;
|
||
// drv_w5500_write_socket_reg(item, socket_reg, Sn_MR_0x00, tmp_buf, 1);
|
||
// //设置本地端口号
|
||
// WRITE_BT_INT16U_BY_CONST_POS(tmp_buf, 0, local_port);
|
||
// drv_w5500_write_socket_reg(item, socket_reg, Sn_PORT_0x04, tmp_buf, 2);
|
||
//
|
||
// drv_w5500_read_socket_reg(item, socket_reg, Sn_PORT_0x04, tmp_buf, 2);
|
||
// KIT_MODULE_PRINTF(W5500_PRT_EN, "socket %d creat port %d\r\n", socket, READ_BT_INT16U_BY_CONST_POS(tmp_buf, 0));
|
||
// //打开socket
|
||
// tmp_buf[0] = SOCKET_CMD_OPEN;
|
||
// drv_w5500_write_socket_reg(item, socket_reg, Sn_CR_0x01, tmp_buf, 1);
|
||
//
|
||
// cnt = 0;
|
||
// while((tmp_buf[0] != SOCK_INIT) && (cnt++ < 50))
|
||
// {
|
||
// drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, tmp_buf, 1);
|
||
// //KIT_MODULE_PRINTF(W5500_PRT_EN, "socket sr %x\r\n", tmp_buf[0]);
|
||
// kit_time_dly_ms(1);
|
||
// }
|
||
// if(cnt < 50)
|
||
// {
|
||
// //监听socket
|
||
// tmp_buf[0] = SOCKET_CMD_LISTEN;
|
||
// drv_w5500_write_socket_reg(item, socket_reg, Sn_CR_0x01, tmp_buf, 1);
|
||
//
|
||
// for(cnt = 0; cnt < 40; cnt++)
|
||
// {
|
||
// drv_w5500_read_socket_reg(item, socket_reg, Sn_SR_0x03, tmp_buf, 1);
|
||
// //KIT_MODULE_PRINTF(W5500_PRT_EN, "socket sr %x\r\n", tmp_buf[0]);
|
||
// if(tmp_buf[0] == SOCK_LISTEN)
|
||
// {
|
||
// //设置MTU
|
||
// WRITE_BT_INT16U_BY_CONST_POS(tmp_buf, 0, SOCKET_TCP_PACKSIZE);
|
||
// drv_w5500_write_socket_reg(item, socket_reg, Sn_MSSR_0x12, tmp_buf, 2);
|
||
// //心跳包间隔
|
||
// tmp_buf[0] = 1;
|
||
// drv_w5500_write_socket_reg(item, socket_reg, Sn_KPALVTR_0x2F, tmp_buf, 1);
|
||
// KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 server %d register success\r\n", socket);
|
||
// //清除socket所有中断
|
||
// tmp_buf[0] = 0xFF;
|
||
// drv_w5500_write_socket_reg(item, socket_reg, Sn_IR_0x02, tmp_buf, 1);
|
||
// //关闭所有中断
|
||
// tmp_buf[0] = 0xFF;
|
||
// drv_w5500_write_socket_reg(item, socket_reg, Sn_IMR_0x2C, tmp_buf, 1);
|
||
// tmp_buf[0] = 1;
|
||
// drv_w5500_read_socket_reg(item, socket_reg, Sn_IMR_0x2C, tmp_buf, 1);
|
||
// KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 server %d ir %d \r\n", socket, tmp_buf[0]);
|
||
// return true;
|
||
// }
|
||
// kit_time_dly_ms(100);
|
||
// }
|
||
// }
|
||
// }
|
||
// KIT_MODULE_PRINTF(W5500_PRT_EN, "w5500 server %d register fail\r\n", socket);
|
||
// return false;
|
||
//}
|
||
|
||
|
||
//bool drv_w5500_read_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len)
|
||
//{
|
||
// bool res = false;
|
||
// uint8_t buf[3], err;
|
||
//
|
||
// buf[0] = reg >> 8;
|
||
// buf[1] = (uint8_t)reg;
|
||
// buf[2] = ctrl_phase << 3 | W5500_READ_ACCESS_MODE;
|
||
|
||
// OSSemPend(w5500_semaphore, 500, &err);
|
||
// if(err == OS_ERR_NONE)
|
||
// {
|
||
// drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
|
||
// res = (drv_spi_series_sync_send_receive(item->spi, buf, 3, value, len) == kKit_Ret_Ok);
|
||
// drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
|
||
// OSSemPost(w5500_semaphore);
|
||
// }
|
||
//
|
||
// return res;
|
||
//}
|
||
|
||
////len > 实际长度 + 3
|
||
//bool drv_w5500_dma_read_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len)
|
||
//{
|
||
// bool res = false;
|
||
// uint32_t i;
|
||
// uint8_t err;
|
||
//
|
||
// value[0] = reg >> 8;
|
||
// value[1] = (uint8_t)reg;
|
||
// value[2] = ctrl_phase << 3 | W5500_READ_ACCESS_MODE;
|
||
|
||
// OSSemPend(w5500_semaphore, 500, &err);
|
||
// if(err == OS_ERR_NONE)
|
||
// {
|
||
// drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
|
||
// res = (drv_spi_dma_sync_receive(item->spi, value, len + 3) == kKit_Ret_Ok);
|
||
// drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
|
||
// OSSemPost(w5500_semaphore);
|
||
//
|
||
// for(i = 0 ; i < len; i++)
|
||
// {
|
||
// value[i] = value[i + 3];
|
||
// }
|
||
// }
|
||
|
||
// return res;
|
||
//}
|
||
|
||
//bool drv_w5500_write_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len)
|
||
//{
|
||
// bool res = false;
|
||
// uint8_t buf[3], err;
|
||
//
|
||
// buf[0] = reg >> 8;
|
||
// buf[1] = reg;
|
||
// buf[2] = ctrl_phase << 3 | W5500_WRITE_ACCESS_MODE;
|
||
|
||
// OSSemPend(w5500_semaphore, 500, &err);
|
||
// if(err == OS_ERR_NONE)
|
||
// {
|
||
// drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
|
||
// res = (drv_spi_series_sync_send_receive(item->spi, buf, 3, NULL, 0) == kKit_Ret_Ok);
|
||
// res &= (drv_spi_series_sync_send_receive(item->spi, value, len, NULL, 0) == kKit_Ret_Ok);
|
||
// drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
|
||
//
|
||
// OSSemPost(w5500_semaphore);
|
||
// }
|
||
//
|
||
// return res;
|
||
//}
|
||
|
||
|
||
|
||
//bool drv_w5500_dma_write_socket_reg(W5500Item *item, uint8_t ctrl_phase, uint16_t reg, uint8_t *value, uint16_t len)
|
||
//{
|
||
// bool res = false;
|
||
// uint8_t w5500_send_buf[300], err;
|
||
// if(len + 3 < 300)
|
||
// {
|
||
// w5500_send_buf[0] = reg >> 8;
|
||
// w5500_send_buf[1] = reg;
|
||
// w5500_send_buf[2] = ctrl_phase << 3 | W5500_WRITE_ACCESS_MODE;
|
||
// kit_copy_buf(&w5500_send_buf[3], value, len);
|
||
//
|
||
// OSSemPend(w5500_semaphore, 0, &err);
|
||
// drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
|
||
// res = (drv_spi_dma_sync_send(item->spi, w5500_send_buf, len + 3) == kKit_Ret_Ok);
|
||
// drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
|
||
// OSSemPost(w5500_semaphore);
|
||
// }
|
||
//
|
||
// return res;
|
||
//}
|
||
|
||
|
||
|
||
//bool drv_w5500_read_comm_reg(W5500Item *item, uint16_t reg, uint8_t *value, uint16_t len)
|
||
//{
|
||
// bool res = false;
|
||
// uint8_t buf[3];
|
||
//
|
||
// buf[0] = reg >> 8;
|
||
// buf[1] = reg;
|
||
// buf[2] = SELECT_GREG_00 | W5500_READ_ACCESS_MODE;
|
||
|
||
// drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
|
||
// res = (drv_spi_series_sync_send_receive(item->spi, buf, 3, value, len) == kKit_Ret_Ok);
|
||
// drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
|
||
//
|
||
// return res;
|
||
//}
|
||
|
||
//bool drv_w5500_write_comm_reg(W5500Item *item, uint8_t reg, uint8_t *value, uint16_t len)
|
||
//{
|
||
// bool res = true;
|
||
// uint8_t buf[3];
|
||
//
|
||
// buf[0] = reg >> 8;
|
||
// buf[1] = reg;
|
||
// buf[2] = SELECT_GREG_00 | W5500_WRITE_ACCESS_MODE;
|
||
|
||
// drv_gpio_set_pin_status(item->cs, kGpioStatus_Low);
|
||
// res &= (drv_spi_series_sync_send_receive(item->spi, buf, 3, NULL, 0) == kKit_Ret_Ok);
|
||
// res &= (drv_spi_series_sync_send_receive(item->spi, value, len, NULL, 0) == kKit_Ret_Ok);
|
||
// drv_gpio_set_pin_status(item->cs, kGpioStatus_High);
|
||
//
|
||
// return res;
|
||
//}
|
||
|
||
|
||
//void drv_w5500_poll(W5500Item *item)
|
||
//{
|
||
// static uint8_t link_off_cnt = 0;
|
||
// uint8_t socket_reg, buf[4];
|
||
// uint16_t addr, len;
|
||
// uint32_t i;
|
||
|
||
// if((item->rcv_call != NULL) && (item->server_port != NULL))
|
||
// {
|
||
// drv_w5500_read_comm_reg(item, W5500_PHYCFGR_REG_0x2E, buf, 1);
|
||
// if((buf[0] & 0x01) == 0)
|
||
// {
|
||
// buf[1] = (link_off_cnt++ > 10) ? 0x80 : 0;
|
||
// }
|
||
// else
|
||
// {
|
||
// buf[1] = link_off_cnt = 0;
|
||
// }
|
||
|
||
// for(i = 0; i < W5500_MAX_SOCKET_NUM; i++)
|
||
// {
|
||
// if(buf[1] != 0x80)
|
||
// {
|
||
// socket_reg = W5500_CREAT_SOCKET_REG(i);
|
||
// //读取w5500 socket状态
|
||
// drv_w5500_read_socket_reg(item, socket_reg, Sn_IR_0x02, buf, 2);
|
||
// }
|
||
// else
|
||
// {
|
||
// link_off_cnt = 11;
|
||
// }
|
||
// switch(buf[1])
|
||
// {
|
||
// //建立连接后可能存在有通信数据
|
||
// case SOCK_ESTABLISHED:
|
||
// item->close_cnt[i] = 0;
|
||
// drv_w5500_read_socket_reg(item, socket_reg, Sn_RX_RSR_0x26, buf, 4);
|
||
// len = READ_BT_INT16U_BY_CONST_POS(buf, 0);
|
||
// if((len > 0) && (len < W5500_MAX_READ_BUF_SIZE))
|
||
// {
|
||
// //获取地址并读数据
|
||
// addr = READ_BT_INT16U_BY_CONST_POS(buf, 2);
|
||
// drv_w5500_dma_read_socket_reg(item, W5500_CREAT_SOCKET_READ_BUF(i), addr, item->read_buf, len);
|
||
//
|
||
// item->rcv_call(i, item->read_buf, len);
|
||
//
|
||
// addr += len;
|
||
// WRITE_BT_INT16U_BY_CONST_POS(buf, 0, addr);
|
||
// drv_w5500_write_socket_reg(item, socket_reg, Sn_RX_RD_0x28, buf, 2);
|
||
//
|
||
// buf[0] = SOCKET_CMD_RECV;
|
||
// drv_w5500_write_socket_reg(item, socket_reg, Sn_CR_0x01, buf, 1);
|
||
//
|
||
//// cnt = buf[0] = 1;
|
||
//// while((buf[0] != 0) && (cnt++ < 4))
|
||
//// {
|
||
//// drv_w5500_read_socket_reg(&w5500, socket_reg, Sn_CR_0x01, buf, 1);
|
||
//// }
|
||
// }
|
||
// break;
|
||
// case SOCK_CLOSED:
|
||
// case SOCK_CLOSE_WAIT:
|
||
// if(item->close_cnt[i]++ >= 5)
|
||
// {
|
||
// if((buf[0] & 0x08) == 0x08)
|
||
// {
|
||
// buf[0] = 0x08;
|
||
// item->close_cnt[i] = 0;
|
||
// drv_w5500_write_socket_reg(item, socket_reg, Sn_IR_0x02, buf, 1);
|
||
// }
|
||
// else
|
||
// {
|
||
// drv_w5500_close_socket(item, i);
|
||
// drv_w5500_creat_tcp_server(item, i, item->server_port[i]);
|
||
// }
|
||
// }
|
||
// break;
|
||
//
|
||
// case SOCK_LISTEN:
|
||
// item->close_cnt[i] = 0;
|
||
// break;
|
||
// case 0x80:
|
||
// drv_w5500_close_socket(item, i);
|
||
// break;
|
||
// default :
|
||
//
|
||
// break;
|
||
// }
|
||
// }
|
||
// }
|
||
//}
|
||
|
||
//void drv_w5500_set_close_call(W5500Item *item, W5500CloseCall call)
|
||
//{
|
||
// item->close_call = call;
|
||
//}
|
||
|
||
|