Fit w5500 to lwip, fix some unintialized params and printf warning.
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
export CFLAGS := -mcmodel=medany -march=rv64imafdc -mabi=lp64d -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -O0 -ggdb -fgnu89-inline -Werror
|
||||
export CFLAGS := -mcmodel=medany -march=rv64imafdc -mabi=lp64d -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -O1 -fgnu89-inline -Wformat -Wuninitialized
|
||||
# export CFLAGS := -mcmodel=medany -march=rv64imafdc -mabi=lp64d -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -O0 -ggdb -fgnu89-inline -Werror -Wformat -Wuninitialized
|
||||
export AFLAGS := -c -mcmodel=medany -march=rv64imafdc -mabi=lp64d -x assembler-with-cpp -ggdb
|
||||
export LFLAGS := -mcmodel=medany -march=rv64imafdc -mabi=lp64d -nostartfiles -Wl,--gc-sections,-Map=XiZi-edu-riscv64.map,-cref,-u,_start -T $(BSP_ROOT)/link.lds
|
||||
|
||||
|
||||
@@ -25,11 +25,12 @@
|
||||
#ifndef _BSP_ATOMIC_H
|
||||
#define _BSP_ATOMIC_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#define SPINLOCK_INIT \
|
||||
{ \
|
||||
0 \
|
||||
@@ -63,7 +64,7 @@ extern "C" {
|
||||
|
||||
typedef struct _spinlock
|
||||
{
|
||||
int lock;
|
||||
int32_t lock;
|
||||
} spinlock_t;
|
||||
|
||||
typedef struct _semaphore
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SRC_FILES := socket.c connect_w5500.c w5500.c wizchip_conf.c spi_interface.c wiz_ping.c connect_w5500_test.c wiz_iperf.c
|
||||
SRC_FILES := socket.c connect_w5500.c w5500.c wizchip_conf.c spi_interface.c connect_w5500_test.c w5x00_lwip.c
|
||||
SRC_FILES := socket.c connect_w5500.c w5500.c wizchip_conf.c spi_interface.c wiz_ping.c connect_w5500_test.c w5x00_lwip.c wiz_iperf.c
|
||||
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
||||
+279
-211
@@ -5,8 +5,8 @@
|
||||
#include <dev_pin.h>
|
||||
#include <drv_io_config.h>
|
||||
#include <fpioa.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <xs_base.h>
|
||||
|
||||
#include "gpio_common.h"
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
#include "connect_ethernet.h"
|
||||
|
||||
#include <sys.h>
|
||||
|
||||
#define SPI_LORA_FREQUENCY 10000000
|
||||
|
||||
// spi operations
|
||||
@@ -25,263 +27,329 @@ extern void spi_select_cs(void);
|
||||
extern void spi_deselete_cs(void);
|
||||
|
||||
// global configurations for w5500 tcp connection
|
||||
uint32_t get_gbuf_size() {
|
||||
static const uint32_t g_wiznet_buf_size = 2048;
|
||||
return g_wiznet_buf_size;
|
||||
uint32_t get_gbuf_size()
|
||||
{
|
||||
static const uint32_t g_wiznet_buf_size = 2048;
|
||||
return g_wiznet_buf_size;
|
||||
}
|
||||
|
||||
wiz_NetInfo *get_gnetinfo() {
|
||||
static wiz_NetInfo g_wiz_netinfo = {.mac = {0x00, 0x08, 0xdc, 0x11, 0x11, 0x11},
|
||||
.ip = {192, 168, 130, 77},
|
||||
.sn = {255, 255, 254, 0},
|
||||
.gw = {192, 168, 130, 1},
|
||||
.dns = {0, 0, 0, 0},
|
||||
.dhcp = NETINFO_STATIC};
|
||||
return &g_wiz_netinfo;
|
||||
wiz_NetInfo* get_gnetinfo()
|
||||
{
|
||||
static wiz_NetInfo g_wiz_netinfo = { .mac = { 0x00, 0x08, 0xdc, 0x11, 0x11, 0x11 },
|
||||
.ip = { 192, 168, 130, 77 },
|
||||
.sn = { 255, 255, 254, 0 },
|
||||
.gw = { 192, 168, 130, 1 },
|
||||
.dns = { 0, 0, 0, 0 },
|
||||
.dhcp = NETINFO_STATIC };
|
||||
return &g_wiz_netinfo;
|
||||
}
|
||||
|
||||
int network_init() {
|
||||
wiz_NetInfo check_wiz_netinfo;
|
||||
check_wiz_netinfo.dhcp = NETINFO_STATIC;
|
||||
ctlnetwork(CN_SET_NETINFO, (void *)get_gnetinfo());
|
||||
ctlnetwork(CN_GET_NETINFO, (void *)&check_wiz_netinfo);
|
||||
int network_init()
|
||||
{
|
||||
wiz_NetInfo check_wiz_netinfo;
|
||||
check_wiz_netinfo.dhcp = NETINFO_STATIC;
|
||||
ctlnetwork(CN_SET_NETINFO, (void*)get_gnetinfo());
|
||||
ctlnetwork(CN_GET_NETINFO, (void*)&check_wiz_netinfo);
|
||||
|
||||
if (memcmp(get_gnetinfo(), &check_wiz_netinfo, sizeof(wiz_NetInfo)) != 0) {
|
||||
KPrintf(
|
||||
"mac: %d; ip: %d; gw: %d; sn: %d; dns: %d; dhcp: %d;\n",
|
||||
memcmp(&get_gnetinfo()->mac, &check_wiz_netinfo.mac, sizeof(uint8_t) * 6),
|
||||
memcmp(&get_gnetinfo()->ip, &check_wiz_netinfo.ip, sizeof(uint8_t) * 4),
|
||||
memcmp(&get_gnetinfo()->sn, &check_wiz_netinfo.sn, sizeof(uint8_t) * 4),
|
||||
memcmp(&get_gnetinfo()->gw, &check_wiz_netinfo.gw, sizeof(uint8_t) * 4),
|
||||
memcmp(&get_gnetinfo()->dns, &check_wiz_netinfo.dns, sizeof(uint8_t) * 4),
|
||||
memcmp(&get_gnetinfo()->dhcp, &check_wiz_netinfo.dhcp, sizeof(uint8_t)));
|
||||
KPrintf("WIZCHIP set network information fail.\n");
|
||||
return ERROR;
|
||||
}
|
||||
uint8_t tmpstr[6];
|
||||
ctlwizchip(CW_GET_ID, (void *)tmpstr);
|
||||
KPrintf("=== %s NET CONF ===\r\n", (char *)tmpstr);
|
||||
KPrintf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", get_gnetinfo()->mac[0],
|
||||
get_gnetinfo()->mac[1], get_gnetinfo()->mac[2], get_gnetinfo()->mac[3],
|
||||
get_gnetinfo()->mac[4], get_gnetinfo()->mac[5]);
|
||||
KPrintf("SIP: %d.%d.%d.%d\r\n", get_gnetinfo()->ip[0], get_gnetinfo()->ip[1],
|
||||
get_gnetinfo()->ip[2], get_gnetinfo()->ip[3]);
|
||||
KPrintf("GAR: %d.%d.%d.%d\r\n", get_gnetinfo()->gw[0], get_gnetinfo()->gw[1],
|
||||
get_gnetinfo()->gw[2], get_gnetinfo()->gw[3]);
|
||||
KPrintf("SUB: %d.%d.%d.%d\r\n", get_gnetinfo()->sn[0], get_gnetinfo()->sn[1],
|
||||
get_gnetinfo()->sn[2], get_gnetinfo()->sn[3]);
|
||||
KPrintf("DNS: %d.%d.%d.%d\r\n", get_gnetinfo()->dns[0], get_gnetinfo()->dns[1],
|
||||
get_gnetinfo()->dns[2], get_gnetinfo()->dns[3]);
|
||||
KPrintf("======================\r\n");
|
||||
if (memcmp(get_gnetinfo(), &check_wiz_netinfo, sizeof(wiz_NetInfo)) != 0) {
|
||||
KPrintf(
|
||||
"mac: %d; ip: %d; gw: %d; sn: %d; dns: %d; dhcp: %d;\n",
|
||||
memcmp(&get_gnetinfo()->mac, &check_wiz_netinfo.mac, sizeof(uint8_t) * 6),
|
||||
memcmp(&get_gnetinfo()->ip, &check_wiz_netinfo.ip, sizeof(uint8_t) * 4),
|
||||
memcmp(&get_gnetinfo()->sn, &check_wiz_netinfo.sn, sizeof(uint8_t) * 4),
|
||||
memcmp(&get_gnetinfo()->gw, &check_wiz_netinfo.gw, sizeof(uint8_t) * 4),
|
||||
memcmp(&get_gnetinfo()->dns, &check_wiz_netinfo.dns, sizeof(uint8_t) * 4),
|
||||
memcmp(&get_gnetinfo()->dhcp, &check_wiz_netinfo.dhcp, sizeof(uint8_t)));
|
||||
KPrintf("WIZCHIP set network information fail.\n");
|
||||
return ERROR;
|
||||
}
|
||||
uint8_t tmpstr[6];
|
||||
ctlwizchip(CW_GET_ID, (void*)tmpstr);
|
||||
KPrintf("=== %s NET CONF ===\r\n", (char*)tmpstr);
|
||||
KPrintf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", get_gnetinfo()->mac[0],
|
||||
get_gnetinfo()->mac[1], get_gnetinfo()->mac[2], get_gnetinfo()->mac[3],
|
||||
get_gnetinfo()->mac[4], get_gnetinfo()->mac[5]);
|
||||
KPrintf("SIP: %d.%d.%d.%d\r\n", get_gnetinfo()->ip[0], get_gnetinfo()->ip[1],
|
||||
get_gnetinfo()->ip[2], get_gnetinfo()->ip[3]);
|
||||
KPrintf("GAR: %d.%d.%d.%d\r\n", get_gnetinfo()->gw[0], get_gnetinfo()->gw[1],
|
||||
get_gnetinfo()->gw[2], get_gnetinfo()->gw[3]);
|
||||
KPrintf("SUB: %d.%d.%d.%d\r\n", get_gnetinfo()->sn[0], get_gnetinfo()->sn[1],
|
||||
get_gnetinfo()->sn[2], get_gnetinfo()->sn[3]);
|
||||
KPrintf("DNS: %d.%d.%d.%d\r\n", get_gnetinfo()->dns[0], get_gnetinfo()->dns[1],
|
||||
get_gnetinfo()->dns[2], get_gnetinfo()->dns[3]);
|
||||
KPrintf("======================\r\n");
|
||||
|
||||
return EOK;
|
||||
return EOK;
|
||||
}
|
||||
|
||||
/****************** spi init ******************/
|
||||
static struct Bus *w5500_spi_bus;
|
||||
int w5500_spi_init() {
|
||||
x_err_t ret = EOK;
|
||||
static struct Bus* w5500_spi_bus;
|
||||
int w5500_spi_init()
|
||||
{
|
||||
x_err_t ret = EOK;
|
||||
|
||||
w5500_spi_bus = BusFind(SPI_BUS_NAME_1);
|
||||
w5500_spi_bus->owner_haldev =
|
||||
BusFindDevice(w5500_spi_bus, SPI_1_DEVICE_NAME_0);
|
||||
w5500_spi_bus->owner_driver = BusFindDriver(w5500_spi_bus, SPI_1_DRV_NAME);
|
||||
w5500_spi_bus = BusFind(SPI_BUS_NAME_1);
|
||||
w5500_spi_bus->owner_haldev = BusFindDevice(w5500_spi_bus, SPI_1_DEVICE_NAME_0);
|
||||
w5500_spi_bus->owner_driver = BusFindDriver(w5500_spi_bus, SPI_1_DRV_NAME);
|
||||
|
||||
w5500_spi_bus->match(w5500_spi_bus->owner_driver,
|
||||
w5500_spi_bus->owner_haldev);
|
||||
w5500_spi_bus->match(w5500_spi_bus->owner_driver,
|
||||
w5500_spi_bus->owner_haldev);
|
||||
|
||||
struct BusConfigureInfo configure_info;
|
||||
struct SpiMasterParam spi_master_param;
|
||||
spi_master_param.spi_data_bit_width = 8;
|
||||
spi_master_param.spi_work_mode = SPI_MODE_0 | SPI_MSB;
|
||||
spi_master_param.spi_maxfrequency = SPI_LORA_FREQUENCY;
|
||||
spi_master_param.spi_data_endian = 0;
|
||||
struct BusConfigureInfo configure_info;
|
||||
struct SpiMasterParam spi_master_param;
|
||||
spi_master_param.spi_data_bit_width = 8;
|
||||
spi_master_param.spi_work_mode = SPI_MODE_0 | SPI_MSB;
|
||||
spi_master_param.spi_maxfrequency = SPI_LORA_FREQUENCY;
|
||||
spi_master_param.spi_data_endian = 0;
|
||||
|
||||
configure_info.configure_cmd = OPE_CFG;
|
||||
configure_info.private_data = (void *)&spi_master_param;
|
||||
ret = BusDrvConfigure(w5500_spi_bus->owner_driver, &configure_info);
|
||||
if (ret) {
|
||||
KPrintf("spi drv OPE_CFG error drv %8p cfg %8p\n",
|
||||
configure_info.configure_cmd = OPE_CFG;
|
||||
configure_info.private_data = (void*)&spi_master_param;
|
||||
ret = BusDrvConfigure(w5500_spi_bus->owner_driver, &configure_info);
|
||||
if (ret) {
|
||||
KPrintf("spi drv OPE_CFG error drv %8p cfg %8p\n",
|
||||
w5500_spi_bus->owner_driver, &spi_master_param);
|
||||
return ERROR;
|
||||
}
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
configure_info.configure_cmd = OPE_INT;
|
||||
ret = BusDrvConfigure(w5500_spi_bus->owner_driver, &configure_info);
|
||||
if (ret) {
|
||||
KPrintf("spi drv OPE_INT error drv %8p\n", w5500_spi_bus->owner_driver);
|
||||
return ERROR;
|
||||
}
|
||||
configure_info.configure_cmd = OPE_INT;
|
||||
ret = BusDrvConfigure(w5500_spi_bus->owner_driver, &configure_info);
|
||||
if (ret) {
|
||||
KPrintf("spi drv OPE_INT error drv %8p\n", w5500_spi_bus->owner_driver);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
return EOK;
|
||||
return EOK;
|
||||
}
|
||||
|
||||
void spi_write_byte(uint8_t tx_data) {
|
||||
struct BusBlockWriteParam write_param;
|
||||
write_param.buffer = &tx_data;
|
||||
write_param.size = 1;
|
||||
BusDevWriteData(w5500_spi_bus->owner_haldev, &write_param);
|
||||
void spi_write_byte(uint8_t tx_data)
|
||||
{
|
||||
struct BusBlockWriteParam write_param;
|
||||
uint8_t data = tx_data;
|
||||
write_param.buffer = &data;
|
||||
write_param.size = 1;
|
||||
BusDevWriteData(w5500_spi_bus->owner_haldev, &write_param);
|
||||
}
|
||||
uint8_t spi_read_byte(void) {
|
||||
uint8_t result = 0;
|
||||
struct BusBlockReadParam read_param;
|
||||
read_param.buffer = &result;
|
||||
read_param.size = 1;
|
||||
BusDevReadData(w5500_spi_bus->owner_haldev, &read_param);
|
||||
return result;
|
||||
uint8_t spi_read_byte(void)
|
||||
{
|
||||
uint8_t result = 0;
|
||||
struct BusBlockReadParam read_param;
|
||||
read_param.buffer = &result;
|
||||
read_param.size = 1;
|
||||
BusDevReadData(w5500_spi_bus->owner_haldev, &read_param);
|
||||
return result;
|
||||
}
|
||||
void spi_write_burst(uint8_t *tx_buf, uint16_t len) {
|
||||
struct BusBlockWriteParam write_param;
|
||||
write_param.buffer = tx_buf;
|
||||
write_param.size = len;
|
||||
BusDevWriteData(w5500_spi_bus->owner_haldev, &write_param);
|
||||
void spi_write_burst(uint8_t* tx_buf, uint16_t len)
|
||||
{
|
||||
struct BusBlockWriteParam write_param;
|
||||
write_param.buffer = tx_buf;
|
||||
write_param.size = len;
|
||||
BusDevWriteData(w5500_spi_bus->owner_haldev, &write_param);
|
||||
}
|
||||
void spi_read_burst(uint8_t *rx_buf, uint16_t len) {
|
||||
struct BusBlockReadParam read_param;
|
||||
read_param.buffer = rx_buf;
|
||||
read_param.size = len;
|
||||
BusDevReadData(w5500_spi_bus->owner_haldev, &read_param);
|
||||
void spi_read_burst(uint8_t* rx_buf, uint16_t len)
|
||||
{
|
||||
struct BusBlockReadParam read_param;
|
||||
read_param.buffer = rx_buf;
|
||||
read_param.size = len;
|
||||
BusDevReadData(w5500_spi_bus->owner_haldev, &read_param);
|
||||
}
|
||||
|
||||
/****************** chip init ******************/
|
||||
|
||||
void wiz_reset() {
|
||||
gpiohs_set_drive_mode(WIZ_RST_PIN, GPIO_DM_OUTPUT);
|
||||
gpiohs_set_pin(WIZ_RST_PIN, GPIO_PV_LOW);
|
||||
MdelayKTask(20);
|
||||
void wiz_reset()
|
||||
{
|
||||
gpiohs_set_drive_mode(WIZ_RST_PIN, GPIO_DM_OUTPUT);
|
||||
gpiohs_set_pin(WIZ_RST_PIN, GPIO_PV_LOW);
|
||||
MdelayKTask(20);
|
||||
|
||||
gpiohs_set_pin(WIZ_RST_PIN, GPIO_PV_HIGH);
|
||||
MdelayKTask(20);
|
||||
gpiohs_set_pin(WIZ_RST_PIN, GPIO_PV_HIGH);
|
||||
MdelayKTask(20);
|
||||
}
|
||||
|
||||
void wiz_spi_handler_reg() {
|
||||
// spi ops registration
|
||||
#if (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_) || \
|
||||
(_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_)
|
||||
/* register SPI device CS select callback function */
|
||||
gpiohs_set_drive_mode(SPI1_CS0_PIN, GPIO_DM_OUTPUT);
|
||||
reg_wizchip_cs_cbfunc(spi_select_cs, spi_deselete_cs);
|
||||
void wiz_spi_handler_reg()
|
||||
{
|
||||
// spi ops registration
|
||||
#if (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_) || (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_)
|
||||
/* register SPI device CS select callback function */
|
||||
gpiohs_set_drive_mode(SPI1_CS0_PIN, GPIO_DM_OUTPUT);
|
||||
reg_wizchip_cs_cbfunc(spi_select_cs, spi_deselete_cs);
|
||||
#else
|
||||
#if (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SIP_) != _WIZCHIP_IO_MODE_SIP_
|
||||
#error "Unknown _WIZCHIP_IO_MODE_"
|
||||
#else
|
||||
reg_wizchip_cs_cbfunc(wizchip_select, wizchip_deselect);
|
||||
reg_wizchip_cs_cbfunc(wizchip_select, wizchip_deselect);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
reg_wizchip_spi_cbfunc(spi_read_byte, spi_write_byte);
|
||||
reg_wizchip_cris_cbfunc(spi_enter_cris, spi_exit_cris);
|
||||
reg_wizchip_spiburst_cbfunc(spi_read_burst, spi_write_burst);
|
||||
reg_wizchip_spi_cbfunc(spi_read_byte, spi_write_byte);
|
||||
reg_wizchip_cris_cbfunc(spi_enter_cris, spi_exit_cris);
|
||||
reg_wizchip_spiburst_cbfunc(spi_read_burst, spi_write_burst);
|
||||
}
|
||||
|
||||
int wiz_chip_cfg_init() {
|
||||
uint8_t mem_size[2][8] = {{2, 2, 2, 2, 2, 2, 2, 2}, {2, 2, 2, 2, 2, 2, 2, 2}};
|
||||
int wiz_chip_cfg_init()
|
||||
{
|
||||
uint8_t mem_size[2][8] = { { 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2 } };
|
||||
|
||||
/* reset WIZnet chip internal PHY, configures PHY mode. */
|
||||
if (ctlwizchip(CW_INIT_WIZCHIP, (void *)mem_size) == -1) {
|
||||
KPrintf("WIZCHIP initialize failed.");
|
||||
return ERROR;
|
||||
}
|
||||
/* reset WIZnet chip internal PHY, configures PHY mode. */
|
||||
if (ctlwizchip(CW_INIT_WIZCHIP, (void*)mem_size) == -1) {
|
||||
KPrintf("WIZCHIP initialize failed.");
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
struct wiz_NetTimeout_t net_timeout;
|
||||
net_timeout.retry_cnt = 5;
|
||||
net_timeout.time_100us = 20000;
|
||||
ctlnetwork(CN_SET_TIMEOUT, (void *)&net_timeout);
|
||||
struct wiz_NetTimeout_t net_timeout;
|
||||
net_timeout.retry_cnt = 5;
|
||||
net_timeout.time_100us = 20000;
|
||||
ctlnetwork(CN_SET_TIMEOUT, (void*)&net_timeout);
|
||||
|
||||
return EOK;
|
||||
return EOK;
|
||||
}
|
||||
|
||||
/****************** interrupt handle ******************/
|
||||
void wiz_irq_handler() {}
|
||||
|
||||
int wiz_interrupt_init() {
|
||||
int32_t ret = -ERROR;
|
||||
|
||||
struct Bus *pin_bus = PinBusInitGet();
|
||||
|
||||
struct PinParam pin_param;
|
||||
struct BusConfigureInfo pin_configure_info;
|
||||
|
||||
pin_configure_info.configure_cmd = OPE_CFG;
|
||||
pin_configure_info.private_data = (void *)&pin_param;
|
||||
|
||||
pin_param.cmd = GPIO_CONFIG_MODE;
|
||||
pin_param.pin = BSP_WIZ_INT_PIN;
|
||||
pin_param.mode = GPIO_CFG_INPUT_PULLUP;
|
||||
ret = BusDrvConfigure(pin_bus->owner_driver, &pin_configure_info);
|
||||
if (ret != EOK) {
|
||||
KPrintf("config pin_param %d input failed!\n", pin_param.pin);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
pin_param.cmd = GPIO_IRQ_REGISTER;
|
||||
pin_param.pin = BSP_WIZ_INT_PIN;
|
||||
pin_param.irq_set.irq_mode = GPIO_IRQ_EDGE_FALLING;
|
||||
pin_param.irq_set.hdr = wiz_irq_handler;
|
||||
pin_param.irq_set.args = NONE;
|
||||
ret = BusDrvConfigure(pin_bus->owner_driver, &pin_configure_info);
|
||||
if (ret != EOK) {
|
||||
KPrintf("register pin_param %d irq failed!\n", pin_param.pin);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
pin_param.cmd = GPIO_IRQ_DISABLE;
|
||||
pin_param.pin = BSP_WIZ_INT_PIN;
|
||||
ret = BusDrvConfigure(pin_bus->owner_driver, &pin_configure_info);
|
||||
if (ret != EOK) {
|
||||
KPrintf("disable pin_param %d irq failed!\n", pin_param.pin);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
// 4. enable interuption
|
||||
pin_param.cmd = GPIO_IRQ_ENABLE;
|
||||
pin_param.pin = BSP_WIZ_INT_PIN;
|
||||
ret = BusDrvConfigure(pin_bus->owner_driver, &pin_configure_info);
|
||||
if (ret != EOK) {
|
||||
KPrintf("enable pin_param %d irq failed!\n", pin_param.pin);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
return EOK;
|
||||
|
||||
return EOK;
|
||||
#ifdef BSP_USING_LWIP
|
||||
#include <sys.h>
|
||||
static inline void spi_if_clr(void)
|
||||
{
|
||||
setSn_IR(0, 0x1F);
|
||||
setSIR(0);
|
||||
}
|
||||
|
||||
int HwWiznetInit(void) {
|
||||
wiz_reset();
|
||||
void wiz_irq_handler()
|
||||
{
|
||||
static x_base eth_irq_lock;
|
||||
eth_irq_lock = DISABLE_INTERRUPT();
|
||||
|
||||
if (EOK != w5500_spi_init()) {
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
wiz_spi_handler_reg();
|
||||
|
||||
if (EOK != wiz_chip_cfg_init()) {
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
extern uint8_t wiz_mac[6];
|
||||
setSHAR(wiz_mac);
|
||||
ctlwizchip(CW_RESET_PHY, 0);
|
||||
|
||||
setSn_MR(0, Sn_MR_MFEN | Sn_MR_MACRAW | Sn_MR_MIP6B | Sn_MR_MMB);
|
||||
// setSn_RXBUF_SIZE(0, 16);
|
||||
// setSn_TXBUF_SIZE(0, 16);
|
||||
#define SOCK_ANY_PORT_NUM 0xC000
|
||||
wiz_socket(0, Sn_MR_MACRAW, SOCK_ANY_PORT_NUM, 0x00);
|
||||
// setSn_CR(0, Sn_CR_OPEN);
|
||||
// setSn_CR(0, Sn_CR_CONNECT);
|
||||
|
||||
uint8_t sock_sr = 0;
|
||||
while (1) {
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] sock_sr: %x, MACRAW: %x\n", __func__, sock_sr = getSn_SR(0), SOCK_MACRAW));
|
||||
if (sock_sr == SOCK_MACRAW) {
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("Socket 0 MACRAW mdoe established\r\n"));
|
||||
break;
|
||||
if (*get_eth_recv_sem() > 0) {
|
||||
sys_sem_signal(get_eth_recv_sem());
|
||||
}
|
||||
}
|
||||
|
||||
network_init();
|
||||
ENABLE_INTERRUPT(eth_irq_lock);
|
||||
}
|
||||
#else
|
||||
void wiz_irq_handler()
|
||||
{
|
||||
static x_base eth_irq_lock;
|
||||
eth_irq_lock = DISABLE_INTERRUPT();
|
||||
|
||||
return EOK;
|
||||
printf("=");
|
||||
uint8_t ir = getIR();
|
||||
setSIR(0x00);
|
||||
setIR(0x00);
|
||||
|
||||
ENABLE_INTERRUPT(eth_irq_lock);
|
||||
}
|
||||
#endif
|
||||
|
||||
void wizchip_interrupt_init(uint8_t socket, void (*callback)(void*))
|
||||
{
|
||||
int ret_val;
|
||||
|
||||
uint8_t reg_val1;
|
||||
reg_val1 = (SIK_CONNECTED | SIK_DISCONNECTED | SIK_RECEIVED | SIK_TIMEOUT); // except SendOK
|
||||
ret_val = wiz_ctlsocket(socket, CS_SET_INTMASK, (void*)®_val1);
|
||||
|
||||
#if (_WIZCHIP_ == W5100S)
|
||||
reg_val = (1 << socket);
|
||||
#elif (_WIZCHIP_ == W5500)
|
||||
uint16_t reg_val2 = ((1 << socket) << 8);
|
||||
#endif
|
||||
ret_val = ctlwizchip(CW_SET_INTRMASK, (void*)®_val2);
|
||||
|
||||
(void)ret_val;
|
||||
}
|
||||
|
||||
int wiz_interrupt_init()
|
||||
{
|
||||
int32_t ret = -ERROR;
|
||||
|
||||
wizchip_interrupt_init(0, wiz_irq_handler);
|
||||
|
||||
struct Bus* pin_bus = PinBusInitGet();
|
||||
|
||||
struct PinParam pin_param;
|
||||
struct BusConfigureInfo pin_configure_info;
|
||||
|
||||
pin_configure_info.configure_cmd = OPE_CFG;
|
||||
pin_configure_info.private_data = (void*)&pin_param;
|
||||
|
||||
pin_param.cmd = GPIO_CONFIG_MODE;
|
||||
pin_param.pin = BSP_WIZ_INT_PIN;
|
||||
pin_param.mode = GPIO_CFG_INPUT_PULLUP;
|
||||
ret = BusDrvConfigure(pin_bus->owner_driver, &pin_configure_info);
|
||||
if (ret != EOK) {
|
||||
KPrintf("config pin_param %d input failed!\n", pin_param.pin);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
pin_param.cmd = GPIO_IRQ_REGISTER;
|
||||
pin_param.pin = BSP_WIZ_INT_PIN;
|
||||
pin_param.irq_set.irq_mode = GPIO_IRQ_EDGE_FALLING;
|
||||
pin_param.irq_set.hdr = wiz_irq_handler;
|
||||
pin_param.irq_set.args = NONE;
|
||||
ret = BusDrvConfigure(pin_bus->owner_driver, &pin_configure_info);
|
||||
if (ret != EOK) {
|
||||
KPrintf("register pin_param %d irq failed!\n", pin_param.pin);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
pin_param.cmd = GPIO_IRQ_DISABLE;
|
||||
pin_param.pin = BSP_WIZ_INT_PIN;
|
||||
ret = BusDrvConfigure(pin_bus->owner_driver, &pin_configure_info);
|
||||
if (ret != EOK) {
|
||||
KPrintf("disable pin_param %d irq failed!\n", pin_param.pin);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
// 4. enable interuption
|
||||
pin_param.cmd = GPIO_IRQ_ENABLE;
|
||||
pin_param.pin = BSP_WIZ_INT_PIN;
|
||||
ret = BusDrvConfigure(pin_bus->owner_driver, &pin_configure_info);
|
||||
if (ret != EOK) {
|
||||
KPrintf("enable pin_param %d irq failed!\n", pin_param.pin);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
return EOK;
|
||||
}
|
||||
|
||||
int HwWiznetInit(void)
|
||||
{
|
||||
wiz_reset();
|
||||
|
||||
if (EOK != w5500_spi_init()) {
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
wiz_spi_handler_reg();
|
||||
|
||||
if (EOK != wiz_chip_cfg_init()) {
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
extern uint8_t wiz_mac[6];
|
||||
setSHAR(wiz_mac);
|
||||
ctlwizchip(CW_RESET_PHY, 0);
|
||||
|
||||
wiz_interrupt_init(0, wiz_irq_handler);
|
||||
|
||||
setSn_RXBUF_SIZE(0, 16);
|
||||
setSn_TXBUF_SIZE(0, 16);
|
||||
#define SOCK_ANY_PORT_NUM 0xC000
|
||||
setSn_MR(0, Sn_MR_MFEN | Sn_MR_MACRAW | Sn_MR_MIP6B | Sn_MR_MMB);
|
||||
wiz_socket(0, Sn_MR_MACRAW, SOCK_ANY_PORT_NUM, SOCK_IO_NONBLOCK);
|
||||
|
||||
uint8_t sock_iomode = SOCK_IO_NONBLOCK;
|
||||
wiz_ctlsocket(0, CS_SET_IOMODE, &sock_iomode);
|
||||
|
||||
uint8_t sock_sr = 0;
|
||||
while (1) {
|
||||
sock_sr = getSn_SR(0);
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] sock_sr: %x, MACRAW: %x\n", __func__, sock_sr, SOCK_MACRAW));
|
||||
if (sock_sr == SOCK_MACRAW) {
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("Socket 0 MACRAW mode established\r\n"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
network_init();
|
||||
|
||||
return EOK;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -54,7 +54,7 @@
|
||||
//! THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
//*****************************************************************************
|
||||
//#include <stdio.h>
|
||||
// #include <stdio.h>
|
||||
#include "w5500.h"
|
||||
|
||||
#define _W5500_SPI_VDM_OP_ 0x00
|
||||
@@ -65,191 +65,198 @@
|
||||
#if (_WIZCHIP_ == 5500)
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
uint8_t WIZCHIP_READ(uint32_t AddrSel) {
|
||||
uint8_t ret;
|
||||
uint8_t spi_data[3];
|
||||
uint8_t WIZCHIP_READ(uint32_t AddrSel)
|
||||
{
|
||||
uint8_t ret = 0;
|
||||
uint8_t spi_data[3];
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_);
|
||||
AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_);
|
||||
|
||||
if (!WIZCHIP.IF.SPI._read_burst ||
|
||||
!WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
} else // burst operation
|
||||
{
|
||||
spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
|
||||
spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
|
||||
spi_data[2] = (AddrSel & 0x000000FF) >> 0;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 3);
|
||||
}
|
||||
ret = WIZCHIP.IF.SPI._read_byte();
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
return ret;
|
||||
}
|
||||
|
||||
void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb) {
|
||||
uint8_t spi_data[4];
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_);
|
||||
|
||||
// if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // byte
|
||||
// operation
|
||||
if (!WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(wb);
|
||||
} else // burst operation
|
||||
{
|
||||
spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
|
||||
spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
|
||||
spi_data[2] = (AddrSel & 0x000000FF) >> 0;
|
||||
spi_data[3] = wb;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 4);
|
||||
}
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
void WIZCHIP_READ_BUF(uint32_t AddrSel, uint8_t *pBuf, uint16_t len) {
|
||||
uint8_t spi_data[3];
|
||||
uint16_t i;
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_);
|
||||
|
||||
if (!WIZCHIP.IF.SPI._read_burst ||
|
||||
!WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
for (i = 0; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.SPI._read_byte();
|
||||
} else // burst operation
|
||||
{
|
||||
spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
|
||||
spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
|
||||
spi_data[2] = (AddrSel & 0x000000FF) >> 0;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 3);
|
||||
WIZCHIP.IF.SPI._read_burst(pBuf, len);
|
||||
}
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t *pBuf, uint16_t len) {
|
||||
uint8_t spi_data[3];
|
||||
uint16_t i;
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_);
|
||||
|
||||
if (!WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
for (i = 0; i < len; i++)
|
||||
WIZCHIP.IF.SPI._write_byte(pBuf[i]);
|
||||
} else // burst operation
|
||||
{
|
||||
spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
|
||||
spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
|
||||
spi_data[2] = (AddrSel & 0x000000FF) >> 0;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 3);
|
||||
WIZCHIP.IF.SPI._write_burst(pBuf, len);
|
||||
}
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
uint16_t getSn_TX_FSR(uint8_t sn) {
|
||||
uint16_t val = 0, val1 = 0;
|
||||
|
||||
do {
|
||||
val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn), 1));
|
||||
if (val1 != 0) {
|
||||
val = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn), 1));
|
||||
if (!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
} else // burst operation
|
||||
{
|
||||
spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
|
||||
spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
|
||||
spi_data[2] = (AddrSel & 0x000000FF) >> 0;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 3);
|
||||
}
|
||||
} while (val != val1);
|
||||
return val;
|
||||
ret = WIZCHIP.IF.SPI._read_byte();
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint16_t getSn_RX_RSR(uint8_t sn) {
|
||||
uint16_t val = 0, val1 = 0;
|
||||
void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb)
|
||||
{
|
||||
uint8_t spi_data[4];
|
||||
|
||||
do {
|
||||
val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn), 1));
|
||||
if (val1 != 0) {
|
||||
val = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn), 1));
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_);
|
||||
|
||||
// if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // byte
|
||||
// operation
|
||||
if (!WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(wb);
|
||||
} else // burst operation
|
||||
{
|
||||
spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
|
||||
spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
|
||||
spi_data[2] = (AddrSel & 0x000000FF) >> 0;
|
||||
spi_data[3] = wb;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 4);
|
||||
}
|
||||
} while (val != val1);
|
||||
return val;
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len) {
|
||||
uint16_t ptr = 0;
|
||||
uint32_t addrsel = 0;
|
||||
void WIZCHIP_READ_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
|
||||
{
|
||||
uint8_t spi_data[3];
|
||||
uint16_t i;
|
||||
|
||||
if (len == 0)
|
||||
return;
|
||||
ptr = getSn_TX_WR(sn);
|
||||
// M20140501 : implict type casting -> explict type casting
|
||||
// addrsel = (ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
|
||||
addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
|
||||
//
|
||||
WIZCHIP_WRITE_BUF(addrsel, wizdata, len);
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
ptr += len;
|
||||
setSn_TX_WR(sn, ptr);
|
||||
AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_);
|
||||
|
||||
if (!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
for (i = 0; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.SPI._read_byte();
|
||||
} else // burst operation
|
||||
{
|
||||
spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
|
||||
spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
|
||||
spi_data[2] = (AddrSel & 0x000000FF) >> 0;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 3);
|
||||
WIZCHIP.IF.SPI._read_burst(pBuf, len);
|
||||
}
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len) {
|
||||
uint16_t ptr = 0;
|
||||
uint32_t addrsel = 0;
|
||||
void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
|
||||
{
|
||||
uint8_t spi_data[3];
|
||||
uint16_t i;
|
||||
|
||||
if (len == 0)
|
||||
return;
|
||||
ptr = getSn_RX_RD(sn);
|
||||
// M20140501 : implict type casting -> explict type casting
|
||||
// addrsel = ((ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
|
||||
addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
|
||||
//
|
||||
WIZCHIP_READ_BUF(addrsel, wizdata, len);
|
||||
ptr += len;
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
setSn_RX_RD(sn, ptr);
|
||||
AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_);
|
||||
|
||||
if (!WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
for (i = 0; i < len; i++)
|
||||
WIZCHIP.IF.SPI._write_byte(pBuf[i]);
|
||||
} else // burst operation
|
||||
{
|
||||
spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
|
||||
spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
|
||||
spi_data[2] = (AddrSel & 0x000000FF) >> 0;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 3);
|
||||
WIZCHIP.IF.SPI._write_burst(pBuf, len);
|
||||
}
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
void wiz_recv_ignore(uint8_t sn, uint16_t len) {
|
||||
uint16_t ptr = 0;
|
||||
uint16_t getSn_TX_FSR(uint8_t sn)
|
||||
{
|
||||
uint16_t val = 0, val1 = 0;
|
||||
|
||||
ptr = getSn_RX_RD(sn);
|
||||
ptr += len;
|
||||
setSn_RX_RD(sn, ptr);
|
||||
do {
|
||||
val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn), 1));
|
||||
if (val1 != 0) {
|
||||
val = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn), 1));
|
||||
}
|
||||
} while (val != val1);
|
||||
return val;
|
||||
}
|
||||
|
||||
uint16_t getSn_RX_RSR(uint8_t sn)
|
||||
{
|
||||
uint16_t val = 0, val1 = 0;
|
||||
|
||||
do {
|
||||
val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn), 1));
|
||||
if (val1 != 0) {
|
||||
val = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn), 1));
|
||||
}
|
||||
} while (val != val1);
|
||||
return val;
|
||||
}
|
||||
|
||||
void wiz_send_data(uint8_t sn, uint8_t* wizdata, uint16_t len)
|
||||
{
|
||||
uint16_t ptr = 0;
|
||||
uint32_t addrsel = 0;
|
||||
|
||||
if (len == 0)
|
||||
return;
|
||||
ptr = getSn_TX_WR(sn);
|
||||
// M20140501 : implict type casting -> explict type casting
|
||||
// addrsel = (ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
|
||||
addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
|
||||
//
|
||||
WIZCHIP_WRITE_BUF(addrsel, wizdata, len);
|
||||
|
||||
ptr += len;
|
||||
setSn_TX_WR(sn, ptr);
|
||||
}
|
||||
|
||||
void wiz_recv_data(uint8_t sn, uint8_t* wizdata, uint16_t len)
|
||||
{
|
||||
uint16_t ptr = 0;
|
||||
uint32_t addrsel = 0;
|
||||
|
||||
if (len == 0)
|
||||
return;
|
||||
ptr = getSn_RX_RD(sn);
|
||||
// M20140501 : implict type casting -> explict type casting
|
||||
// addrsel = ((ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
|
||||
addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
|
||||
//
|
||||
WIZCHIP_READ_BUF(addrsel, wizdata, len);
|
||||
ptr += len;
|
||||
|
||||
setSn_RX_RD(sn, ptr);
|
||||
}
|
||||
|
||||
void wiz_recv_ignore(uint8_t sn, uint16_t len)
|
||||
{
|
||||
uint16_t ptr = 0;
|
||||
|
||||
ptr = getSn_RX_RD(sn);
|
||||
ptr += len;
|
||||
setSn_RX_RD(sn, ptr);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "socket.h"
|
||||
|
||||
#include "netif/etharp.h"
|
||||
#include <sys.h>
|
||||
|
||||
#include <xs_kdbg.h>
|
||||
|
||||
@@ -33,9 +34,10 @@
|
||||
*/
|
||||
uint8_t wiz_mac[6] = { 0x00, 0x08, 0xDC, 0x12, 0x34, 0x56 };
|
||||
|
||||
static uint8_t tx_frame[1542];
|
||||
static const uint32_t ethernet_polynomial_le = 0xedb88320U;
|
||||
|
||||
static sys_mutex_t wiz_trans_mtx;
|
||||
|
||||
/**
|
||||
* ----------------------------------------------------------------------------------------------------
|
||||
* Functions
|
||||
@@ -51,165 +53,75 @@ void Time_Update_LwIP(void)
|
||||
// no need to do
|
||||
}
|
||||
|
||||
int32_t send_lwip(uint8_t sn, uint8_t* buf, uint16_t len)
|
||||
static inline void spi_if_clr(void)
|
||||
{
|
||||
uint8_t tmp = 0;
|
||||
uint16_t freesize = 0;
|
||||
setSn_IR(0, 0x1F);
|
||||
setSIR(0);
|
||||
}
|
||||
|
||||
tmp = getSn_SR(sn);
|
||||
// macraw func
|
||||
uint16_t macraw_send(const uint8_t* buf, uint16_t len)
|
||||
{
|
||||
uint8_t sock_num = 0;
|
||||
uint16_t ret = 0;
|
||||
|
||||
// freesize = getSn_TxMAX(sn);
|
||||
// freesize = getSn_TXBUF_SIZE(sn);
|
||||
freesize = getSn_TX_FSR(sn);
|
||||
if (len > getSn_TxMAX(sock_num)) {
|
||||
ret = getSn_TxMAX(sock_num);
|
||||
} else {
|
||||
ret = len;
|
||||
}
|
||||
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] sending len: %d, free size: %d\n", __func__, len, freesize));
|
||||
if (len > freesize)
|
||||
len = freesize; // check size not to exceed MAX size.
|
||||
wiz_send_data(sock_num, (uint8_t*)buf, len);
|
||||
|
||||
wiz_send_data(sn, buf, len);
|
||||
setSn_CR(sn, Sn_CR_SEND);
|
||||
while (getSn_CR(sn))
|
||||
WIZCHIP_WRITE(Sn_CR(sock_num), Sn_CR_SEND);
|
||||
while (WIZCHIP_READ(Sn_CR(sock_num))) {
|
||||
}
|
||||
while (WIZCHIP_READ(Sn_IR(sock_num)) & Sn_IR_SENDOK != Sn_IR_SENDOK) {
|
||||
}
|
||||
WIZCHIP_WRITE(Sn_IR(sock_num), Sn_IR_SENDOK);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint16_t macraw_recv(uint8_t* buf, uint16_t len)
|
||||
{
|
||||
uint8_t sock_num = 0;
|
||||
|
||||
uint16_t lowlevel_len = getSn_RX_RSR(sock_num);
|
||||
if (lowlevel_len <= 0 || len <= 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint16_t data_len = 0;
|
||||
uint8_t macraw_head[2];
|
||||
|
||||
uint16_t ptr = getSn_RX_RD(sock_num);
|
||||
uint32_t addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sock_num) << 3);
|
||||
|
||||
WIZCHIP_READ_BUF(addrsel, macraw_head, 2);
|
||||
ptr += 2;
|
||||
|
||||
data_len = (macraw_head[0] << 8) + macraw_head[1] - 2;
|
||||
if (data_len > 1514) {
|
||||
KPrintf("[%s:%d] Info: data recved oversize: %d\n", __func__, __LINE__, data_len);
|
||||
wiz_recv_ignore(sock_num, data_len);
|
||||
// wiz_sock_close(sock_num);
|
||||
// wiz_socket(sock_num, Sn_MR_MACRAW, 0xC000, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sock_num) << 3);
|
||||
WIZCHIP_READ_BUF(addrsel, buf, data_len);
|
||||
ptr += data_len;
|
||||
|
||||
setSn_RX_RD(sock_num, ptr);
|
||||
WIZCHIP_WRITE(Sn_CR(sock_num), Sn_CR_RECV);
|
||||
while (WIZCHIP_READ(Sn_CR(sock_num)))
|
||||
;
|
||||
|
||||
while (1) {
|
||||
uint8_t IRtemp = getSn_IR(sn);
|
||||
if (IRtemp & Sn_IR_SENDOK) {
|
||||
setSn_IR(sn, Sn_IR_SENDOK);
|
||||
// printf("Packet sent ok\n");
|
||||
break;
|
||||
} else if (IRtemp & Sn_IR_TIMEOUT) {
|
||||
setSn_IR(sn, Sn_IR_TIMEOUT);
|
||||
// printf("Socket is closed\n");
|
||||
// There was a timeout
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return (int32_t)len;
|
||||
return data_len;
|
||||
}
|
||||
|
||||
int32_t recv_lwip(uint8_t sn, uint8_t* buf, uint16_t len)
|
||||
{
|
||||
uint8_t head[2];
|
||||
uint16_t pack_len = 0;
|
||||
|
||||
pack_len = getSn_RX_RSR(sn);
|
||||
|
||||
if (pack_len > 0) {
|
||||
wiz_recv_data(sn, head, 2);
|
||||
setSn_CR(sn, Sn_CR_RECV);
|
||||
|
||||
// byte size of data packet (2byte)
|
||||
pack_len = head[0];
|
||||
pack_len = (pack_len << 8) + head[1];
|
||||
pack_len -= 2;
|
||||
|
||||
if (pack_len > len) {
|
||||
// Packet is bigger than buffer - drop the packet
|
||||
// wiz_recv_ignore(sn, pack_len);
|
||||
// setSn_CR(sn, Sn_CR_RECV);
|
||||
// return 0;
|
||||
pack_len = len;
|
||||
}
|
||||
|
||||
wiz_recv_data(sn, buf, pack_len); // data copy
|
||||
setSn_CR(sn, Sn_CR_RECV);
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] recved len: %d, len: %d\n", __func__, pack_len, len));
|
||||
}
|
||||
|
||||
return (int32_t)pack_len;
|
||||
}
|
||||
|
||||
err_t netif_output(struct netif* netif, struct pbuf* p)
|
||||
{
|
||||
uint32_t send_len = 0;
|
||||
uint32_t tot_len = 0;
|
||||
|
||||
memset(tx_frame, 0x00, sizeof(tx_frame));
|
||||
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] pbuf len: %d, totlen: %d\n", __func__, p->len, p->tot_len));
|
||||
for (struct pbuf* q = p; q != NULL; q = q->next) {
|
||||
memcpy(tx_frame + tot_len, q->payload, q->len);
|
||||
|
||||
tot_len += q->len;
|
||||
|
||||
if (q->len == q->tot_len) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (tot_len < 60) {
|
||||
// pad
|
||||
tot_len = 60;
|
||||
}
|
||||
|
||||
uint32_t crc = ethernet_frame_crc(tx_frame, tot_len);
|
||||
|
||||
send_len = send_lwip(0, tx_frame, tot_len);
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
static uint16_t wiz_sendFrame(uint8_t* buf, uint16_t len)
|
||||
{
|
||||
// Wait for space in the transmit buffer
|
||||
// while (1) {
|
||||
// SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] looping for freesize, sock state: %x\n", __func__, getSn_SR(0)));
|
||||
// uint16_t freesize = getSn_TX_FSR(0);
|
||||
|
||||
// if (len <= freesize) {
|
||||
// break;
|
||||
// }
|
||||
// };
|
||||
|
||||
wiz_send_data(0, buf, len);
|
||||
setSn_CR(0, Sn_CR_SEND);
|
||||
|
||||
while (1) {
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] looping for sendok\n", __func__));
|
||||
uint8_t tmp = getSn_IR(0);
|
||||
if (tmp & Sn_IR_SENDOK) {
|
||||
setSn_IR(0, Sn_IR_SENDOK);
|
||||
// Packet sent ok
|
||||
break;
|
||||
} else if (tmp & Sn_IR_TIMEOUT) {
|
||||
setSn_IR(0, Sn_IR_TIMEOUT);
|
||||
// There was a timeout
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
// void ethernetif_input(void* netif_arg)
|
||||
// {
|
||||
// struct netif* netif = (struct netif*)netif_arg;
|
||||
// struct pbuf* p;
|
||||
// uint16_t pack_len = 0;
|
||||
// uint8_t* pack = malloc(ETHERNET_MTU);
|
||||
// while (1) {
|
||||
// wiz_getsockopt(SOCKET_MACRAW, SO_RECVBUF, &pack_len);
|
||||
// if (pack_len > 0) {
|
||||
// pack_len = recv_lwip(SOCKET_MACRAW, (uint8_t*)pack, pack_len);
|
||||
// if (pack_len) {
|
||||
// p = pbuf_alloc(PBUF_RAW, pack_len, PBUF_POOL);
|
||||
// pbuf_take(p, pack, pack_len);
|
||||
// free(pack);
|
||||
// pack = malloc(ETHERNET_MTU);
|
||||
// } else {
|
||||
// printf(" No packet received\n");
|
||||
// }
|
||||
// if (pack_len && p != NULL) {
|
||||
// LINK_STATS_INC(link.recv);
|
||||
// if (netif->input(p, netif) != ERR_OK) {
|
||||
// pbuf_free(p);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
void netif_link_callback(struct netif* netif)
|
||||
{
|
||||
printf("netif link status changed %s\n", netif_is_link_up(netif) ? "up" : "down");
|
||||
@@ -220,123 +132,105 @@ void netif_status_callback(struct netif* netif)
|
||||
printf("netif status changed %s\n", ip4addr_ntoa(netif_ip4_addr(netif)));
|
||||
}
|
||||
|
||||
static void wiz_transmit_pbuf(struct pbuf* p)
|
||||
static int32_t wiz_transmit_pbuf(struct pbuf* p)
|
||||
{
|
||||
static uint8_t addr[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
int32_t send_ret = 0;
|
||||
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("+++++++"));
|
||||
uint16_t freeSize = getSn_TX_FSR(0);
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] max tx len: %d, current tx len: %d\n", __func__, getSn_TxMAX(0), freeSize));
|
||||
uint16_t length = p->tot_len;
|
||||
|
||||
if (freeSize < length) {
|
||||
/* TODO: Handle insufficent space in buffer */
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] max tx len: %d, current tx len: %d\n", __func__, getSn_TxMAX(0), freeSize));
|
||||
setSn_CR(0, Sn_CR_SEND);
|
||||
return;
|
||||
}
|
||||
while (1) {
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] pbuf len: %d, totlen: %d\n", __func__, p->len, p->tot_len));
|
||||
// wiz_send_data(0, p->payload, p->len);
|
||||
wiz_sendFrame((uint8_t*)p->payload, p->len);
|
||||
if (p->len == p->tot_len)
|
||||
spi_if_clr();
|
||||
if ((send_ret = wiz_sock_sendto(0, (uint8_t*)p->payload, p->len, addr, 0)) <= 0) {
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] data send failed: %d, sock: %x\n", __func__, send_ret, getSn_SR(0)));
|
||||
return -ERROR;
|
||||
}
|
||||
if (p->len == p->tot_len) {
|
||||
break;
|
||||
}
|
||||
|
||||
p = p->next;
|
||||
}
|
||||
setSn_CR(0, Sn_CR_SEND);
|
||||
|
||||
return EOK;
|
||||
}
|
||||
|
||||
static int wiz_read_receive_pbuf(struct pbuf** buf)
|
||||
static struct pbuf* wiz_read_receive_pbuf(struct pbuf* buf)
|
||||
{
|
||||
// uint8_t header[6];
|
||||
uint16_t length;
|
||||
// uint16_t readlen;
|
||||
uint16_t framelen;
|
||||
// struct pbuf * p;
|
||||
#define RX_FRAME_SIZE 1542
|
||||
static uint8_t rx_frame[RX_FRAME_SIZE];
|
||||
static uint8_t addr[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
uint16_t port = 0;
|
||||
|
||||
if (*buf != NULL)
|
||||
return 1;
|
||||
|
||||
// uint16_t rxRd = getSn_RX_RD(0);
|
||||
|
||||
length = getSn_RX_RSR(0);
|
||||
if (length < 4) {
|
||||
/* This could be indicative of a crashed (brown-outed?) controller */
|
||||
goto end;
|
||||
uint16_t lowlevel_len = getSn_RX_RSR(0);
|
||||
if (lowlevel_len <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
wiz_recv_data(0, (uint8_t*)&framelen, 2);
|
||||
setSn_CR(0, Sn_CR_RECV);
|
||||
//__bswap16(framelen); //!< didn't work for me
|
||||
framelen = (framelen << 8) | (framelen >> 8);
|
||||
|
||||
/* workaround for https://savannah.nongnu.org/bugs/index.php?50040 */
|
||||
if (framelen > 32000) {
|
||||
wiz_recv_ignore(0, framelen);
|
||||
setSn_CR(0, Sn_CR_RECV);
|
||||
goto end;
|
||||
int32_t data_len = wiz_sock_recvfrom(0, rx_frame, RX_FRAME_SIZE, addr, &port);
|
||||
if (data_len > 0 && data_len <= RX_FRAME_SIZE) {
|
||||
buf = pbuf_alloc(PBUF_RAW, data_len, PBUF_POOL);
|
||||
memcpy(buf->payload, rx_frame, data_len);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
framelen -= 2;
|
||||
|
||||
*buf = pbuf_alloc(PBUF_RAW, (framelen), PBUF_RAM);
|
||||
|
||||
if (*buf == NULL) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
wiz_recv_data(0, (*buf)->payload, framelen);
|
||||
setSn_CR(0, Sn_CR_RECV);
|
||||
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] recved data: framelen: %d\n", __func__, framelen));
|
||||
|
||||
end:
|
||||
return (*buf == NULL) ? 2 : 0;
|
||||
}
|
||||
|
||||
void spi_if_clr(void)
|
||||
{
|
||||
setSn_IR(0, 0x1F);
|
||||
setSIR(0);
|
||||
return buf;
|
||||
}
|
||||
|
||||
void ethernetif_input(void* netif_arg)
|
||||
{
|
||||
struct netif* netif = (struct netif*)netif_arg;
|
||||
struct pbuf* p = NULL;
|
||||
uint8_t res = 0;
|
||||
uint16_t epktcnt;
|
||||
for (;;) {
|
||||
spi_if_clr();
|
||||
p = NULL;
|
||||
res = wiz_read_receive_pbuf(&p);
|
||||
if (p != NULL) {
|
||||
LWIP_DEBUGF(NETIF_DEBUG, ("incoming: %d packages, first read into %x\n", epktcnt, (uintptr_t)(p)));
|
||||
if (ERR_OK != netif->input(p, netif)) {
|
||||
pbuf_free(p);
|
||||
sys_arch_sem_wait(get_eth_recv_sem(), WAITING_FOREVER);
|
||||
while (1) {
|
||||
sys_mutex_lock(&wiz_trans_mtx);
|
||||
|
||||
spi_if_clr();
|
||||
p = NULL;
|
||||
p = wiz_read_receive_pbuf(p);
|
||||
|
||||
sys_mutex_unlock(&wiz_trans_mtx);
|
||||
|
||||
if (p != NULL) {
|
||||
// SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s:%d] Info Recved package with size %d\n", __func__, __LINE__, p->len));
|
||||
if (ERR_OK != netif->input(p, netif)) {
|
||||
pbuf_free(p);
|
||||
}
|
||||
p = NULL;
|
||||
} else {
|
||||
p = NULL;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// LWIP_DEBUGF(NETIF_DEBUG, ("didn't receive.\n"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static err_t spi_if_linkoutput(struct netif* netif, struct pbuf* p)
|
||||
{
|
||||
while (!(getSn_SR(0) & SOCK_MACRAW))
|
||||
; /* TODO: Implement wait timeout */
|
||||
sys_mutex_lock(&wiz_trans_mtx);
|
||||
|
||||
if (!(getSn_SR(0) & SOCK_MACRAW)) {
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s:%d] err socket state %d\n", __func__, __LINE__, p->len));
|
||||
wiz_sock_close(0);
|
||||
setSn_MR(0, Sn_MR_MFEN | Sn_MR_MACRAW | Sn_MR_MIP6B | Sn_MR_MMB);
|
||||
wiz_socket(0, Sn_MR_MACRAW, 0, SOCK_IO_NONBLOCK);
|
||||
}
|
||||
|
||||
int32_t ret = wiz_transmit_pbuf(p);
|
||||
|
||||
sys_mutex_unlock(&wiz_trans_mtx);
|
||||
|
||||
if (ret != EOK) {
|
||||
return ERR_USE;
|
||||
}
|
||||
|
||||
SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] data output, len: %d\n", __func__, p->tot_len));
|
||||
wiz_transmit_pbuf(p);
|
||||
LWIP_DEBUGF(NETIF_DEBUG, ("sent %d bytes.\n", p->tot_len));
|
||||
/* TODO: Set up result value */
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
err_t netif_initialize(struct netif* netif)
|
||||
{
|
||||
sys_mutex_new(&wiz_trans_mtx);
|
||||
|
||||
netif->linkoutput = spi_if_linkoutput;
|
||||
// netif->linkoutput = netif_output;
|
||||
netif->output = etharp_output;
|
||||
@@ -348,23 +242,4 @@ err_t netif_initialize(struct netif* netif)
|
||||
netif->name[0] = 'e';
|
||||
netif->name[1] = '0';
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
static uint32_t ethernet_frame_crc(const uint8_t* data, int length)
|
||||
{
|
||||
uint32_t crc = 0xffffffff; /* Initial value. */
|
||||
|
||||
while (--length >= 0) {
|
||||
uint8_t current_octet = *data++;
|
||||
|
||||
for (int bit = 8; --bit >= 0; current_octet >>= 1) {
|
||||
if ((crc ^ current_octet) & 1) {
|
||||
crc >>= 1;
|
||||
crc ^= ethernet_polynomial_le;
|
||||
} else
|
||||
crc >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
return ~crc;
|
||||
}
|
||||
}
|
||||
@@ -12,8 +12,8 @@
|
||||
|
||||
#define PING_BIND_PORT 3000
|
||||
|
||||
PINGMSGR PingRequest = {0};
|
||||
PINGMSGR PingReply = {0};
|
||||
PINGMSGR PingRequest = { 0 };
|
||||
PINGMSGR PingReply = { 0 };
|
||||
|
||||
static uint16_t ping_RandomID = 0x1234;
|
||||
static uint16_t ping_RandomSeqNum = 0x4321;
|
||||
@@ -21,7 +21,7 @@ uint8_t ping_reply_received = 0;
|
||||
uint8_t ping_req = 0;
|
||||
uint8_t ping_rep = 0;
|
||||
uint8_t ping_cnt = 0;
|
||||
uint8_t ping_rep_buf[150] = {0};
|
||||
uint8_t ping_rep_buf[150] = { 0 };
|
||||
|
||||
// ping状态机
|
||||
#define PING_STA_FREE 0
|
||||
@@ -32,41 +32,43 @@ uint8_t ping_rep_buf[150] = {0};
|
||||
|
||||
uint8_t ping_sta = PING_STA_FREE;
|
||||
|
||||
//当前ping的设备的序号
|
||||
// 当前ping的设备的序号
|
||||
uint8_t ping_socket = 0;
|
||||
|
||||
#define bswap_16(A) ((((uint16)(A)&0xff00) >> 8) | (((uint16)(A)&0x00ff) << 8))
|
||||
#define bswap_16(A) ((((uint16)(A) & 0xff00) >> 8) | (((uint16)(A) & 0x00ff) << 8))
|
||||
|
||||
uint16_t htons(uint16_t n) {
|
||||
union {
|
||||
int i;
|
||||
char c;
|
||||
} u = {1};
|
||||
return u.c ? bswap_16(n) : n;
|
||||
uint16_t htons(uint16_t n)
|
||||
{
|
||||
union {
|
||||
int i;
|
||||
char c;
|
||||
} u = { 1 };
|
||||
return u.c ? bswap_16(n) : n;
|
||||
}
|
||||
|
||||
uint16_t checksum(uint8_t *src, uint32_t len) {
|
||||
uint16_t sum, tsum, i, j;
|
||||
uint32_t lsum;
|
||||
uint16_t checksum(uint8_t* src, uint32_t len)
|
||||
{
|
||||
uint16_t sum, tsum, i, j;
|
||||
uint32_t lsum;
|
||||
|
||||
j = len >> 1;
|
||||
lsum = 0;
|
||||
j = len >> 1;
|
||||
lsum = 0;
|
||||
|
||||
for (i = 0; i < j; i++) {
|
||||
tsum = src[i * 2];
|
||||
tsum = tsum << 8;
|
||||
tsum += src[i * 2 + 1];
|
||||
lsum += tsum;
|
||||
}
|
||||
for (i = 0; i < j; i++) {
|
||||
tsum = src[i * 2];
|
||||
tsum = tsum << 8;
|
||||
tsum += src[i * 2 + 1];
|
||||
lsum += tsum;
|
||||
}
|
||||
|
||||
if (len % 2) {
|
||||
tsum = src[i * 2];
|
||||
lsum += (tsum << 8);
|
||||
}
|
||||
if (len % 2) {
|
||||
tsum = src[i * 2];
|
||||
lsum += (tsum << 8);
|
||||
}
|
||||
|
||||
sum = lsum;
|
||||
sum = ~(sum + (lsum >> 16));
|
||||
return (uint16_t)sum;
|
||||
sum = lsum;
|
||||
sum = ~(sum + (lsum >> 16));
|
||||
return (uint16_t)sum;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -76,64 +78,64 @@ uint16_t checksum(uint8_t *src, uint32_t len) {
|
||||
*@param pCount- ping的次数
|
||||
*@return ping成功次数
|
||||
*/
|
||||
uint8_t ping_count(uint8_t sn, uint16_t pCount, uint8_t *addr) {
|
||||
uint16_t rlen, cnt, i;
|
||||
uint8_t ping_count(uint8_t sn, uint16_t pCount, uint8_t* addr)
|
||||
{
|
||||
uint16_t rlen, cnt, i;
|
||||
|
||||
ping_reply_received = 0;
|
||||
ping_req = 0;
|
||||
ping_rep = 0;
|
||||
KPrintf("Ping:%d.%d.%d.%d\r\n", (addr[0]), (addr[1]), (addr[2]), (addr[3]));
|
||||
ping_reply_received = 0;
|
||||
ping_req = 0;
|
||||
ping_rep = 0;
|
||||
KPrintf("Ping:%d.%d.%d.%d, socket state: %x\r\n", (addr[0]), (addr[1]), (addr[2]), (addr[3]), getSn_SR(sn));
|
||||
|
||||
for (i = 0; i < pCount + 1; i++) /*循环ping pCount次*/
|
||||
{
|
||||
switch (getSn_SR(sn)) /*获取socket状态*/
|
||||
for (i = 0; i < pCount + 1; i++) /*循环ping pCount次*/
|
||||
{
|
||||
case SOCK_CLOSED: /*socket关闭状态*/
|
||||
{
|
||||
wiz_sock_close(sn);
|
||||
/* Create Socket */
|
||||
IINCHIP_WRITE(Sn_PROTO(sn), IPPROTO_ICMP); /*设置ICMP 协议*/
|
||||
if (wiz_socket(sn, Sn_MR_IPRAW, PING_BIND_PORT, 0) !=
|
||||
0) /*判断ip raw模式socket是否开启*/
|
||||
switch (getSn_SR(sn)) /*获取socket状态*/
|
||||
{
|
||||
}
|
||||
/* Check socket register */
|
||||
while (getSn_SR(sn) != SOCK_IPRAW) {
|
||||
MdelayKTask(50);
|
||||
};
|
||||
break;
|
||||
}
|
||||
case SOCK_IPRAW: /*ip raw模式*/
|
||||
{
|
||||
cnt = 0;
|
||||
ping_request(sn, addr); /*发送Ping请求*/
|
||||
ping_req++;
|
||||
while (1) {
|
||||
if ((rlen = getSn_RX_RSR(sn)) > 0) {
|
||||
rlen = ping_reply(sn, addr, rlen); /*获取回复信息*/
|
||||
ping_rep++;
|
||||
if (ping_reply_received) {
|
||||
break;
|
||||
case SOCK_CLOSED: /*socket关闭状态*/
|
||||
{
|
||||
wiz_sock_close(sn);
|
||||
/* Create Socket */
|
||||
IINCHIP_WRITE(Sn_PROTO(sn), IPPROTO_ICMP); /*设置ICMP 协议*/
|
||||
if (wiz_socket(sn, Sn_MR_IPRAW, PING_BIND_PORT, 0) != 0) /*判断ip raw模式socket是否开启*/
|
||||
{
|
||||
}
|
||||
}
|
||||
if ((cnt > 300)) {
|
||||
cnt = 0;
|
||||
/* Check socket register */
|
||||
while (getSn_SR(sn) != SOCK_IPRAW) {
|
||||
MdelayKTask(50);
|
||||
};
|
||||
break;
|
||||
} else {
|
||||
cnt++;
|
||||
MdelayKTask(10);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
case SOCK_IPRAW: /*ip raw模式*/
|
||||
{
|
||||
cnt = 0;
|
||||
ping_request(sn, addr); /*发送Ping请求*/
|
||||
ping_req++;
|
||||
while (1) {
|
||||
if ((rlen = getSn_RX_RSR(sn)) > 0) {
|
||||
rlen = ping_reply(sn, addr, rlen); /*获取回复信息*/
|
||||
ping_rep++;
|
||||
if (ping_reply_received) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ((cnt > 300)) {
|
||||
cnt = 0;
|
||||
break;
|
||||
} else {
|
||||
cnt++;
|
||||
MdelayKTask(10);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (ping_req >= pCount) {
|
||||
wiz_sock_close(sn);
|
||||
}
|
||||
}
|
||||
if (ping_req >= pCount) {
|
||||
wiz_sock_close(sn);
|
||||
}
|
||||
}
|
||||
return ping_rep;
|
||||
return ping_rep;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -142,31 +144,30 @@ uint8_t ping_count(uint8_t sn, uint16_t pCount, uint8_t *addr) {
|
||||
*@param addr- P地址
|
||||
*@return 无
|
||||
*/
|
||||
uint8_t ping_request(uint8_t sn, uint8_t *addr) {
|
||||
uint8_t *buffer;
|
||||
uint16_t i, temp_len = 0;
|
||||
ping_reply_received = 0; /*ping 回复初始化标志位*/
|
||||
PingRequest.Type = PING_REQUEST; /*Ping-Request*/
|
||||
PingRequest.Code = CODE_ZERO; /*总是 '0'*/
|
||||
PingRequest.ID = htons(ping_RandomID++); /*设置ping响应ID为随机的整型变量*/
|
||||
PingRequest.SeqNum =
|
||||
htons(ping_RandomSeqNum++); /*设置ping响应的序列号为随机整形变量*/
|
||||
for (i = 0; i < PING_BUF_LEN; i++) {
|
||||
PingRequest.Data[i] = (i) % 8; /*ping相应的数在'0'~'8‘*/
|
||||
}
|
||||
PingRequest.CheckSum = 0;
|
||||
/* 计算响应次数*/
|
||||
PingRequest.CheckSum =
|
||||
htons(checksum((uint8_t *)&PingRequest, sizeof(PingRequest)));
|
||||
uint8_t ping_request(uint8_t sn, uint8_t* addr)
|
||||
{
|
||||
uint8_t* buffer;
|
||||
|
||||
/*发送ping响应到目的方 */
|
||||
if (wiz_sock_sendto(sn, (uint8_t *)&PingRequest, sizeof(PingRequest), addr,
|
||||
PING_BIND_PORT) == 0) {
|
||||
KPrintf("Fail to send ping-reply packet\r\n");
|
||||
} else {
|
||||
KPrintf("ping send\n");
|
||||
}
|
||||
return 0;
|
||||
uint16_t i, temp_len = 0;
|
||||
ping_reply_received = 0; /*ping 回复初始化标志位*/
|
||||
PingRequest.Type = PING_REQUEST; /*Ping-Request*/
|
||||
PingRequest.Code = CODE_ZERO; /*总是 '0'*/
|
||||
PingRequest.ID = htons(ping_RandomID++); /*设置ping响应ID为随机的整型变量*/
|
||||
PingRequest.SeqNum = htons(ping_RandomSeqNum++); /*设置ping响应的序列号为随机整形变量*/
|
||||
for (i = 0; i < PING_BUF_LEN; i++) {
|
||||
PingRequest.Data[i] = (i) % 8; /*ping相应的数在'0'~'8‘*/
|
||||
}
|
||||
PingRequest.CheckSum = 0;
|
||||
/* 计算响应次数*/
|
||||
PingRequest.CheckSum = htons(checksum((uint8_t*)&PingRequest, sizeof(PingRequest)));
|
||||
|
||||
/*发送ping响应到目的方 */
|
||||
if (wiz_sock_sendto(sn, (uint8_t*)&PingRequest, sizeof(PingRequest), addr, PING_BIND_PORT) == 0) {
|
||||
KPrintf("Fail to send ping-reply packet\r\n");
|
||||
} else {
|
||||
KPrintf("ping send\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -175,82 +176,84 @@ uint8_t ping_request(uint8_t sn, uint8_t *addr) {
|
||||
*@param addr- Ping地址
|
||||
*@return 无
|
||||
*/
|
||||
uint8_t ping_reply(uint8_t sn, uint8_t *addr, uint16_t rlen) {
|
||||
uint16_t tmp_checksum;
|
||||
uint16_t len;
|
||||
uint16_t i;
|
||||
uint8_t ping_reply(uint8_t sn, uint8_t* addr, uint16_t rlen)
|
||||
{
|
||||
uint16_t tmp_checksum;
|
||||
uint16_t len;
|
||||
uint16_t i;
|
||||
|
||||
uint16_t port = PING_BIND_PORT;
|
||||
PINGMSGR PingReply;
|
||||
uint16_t port = PING_BIND_PORT;
|
||||
PINGMSGR PingReply;
|
||||
|
||||
memset(ping_rep_buf, 0, sizeof(ping_rep_buf));
|
||||
len = wiz_sock_recvfrom(sn, ping_rep_buf, rlen, addr,
|
||||
&port); /*从目的端接收数据*/
|
||||
memset(ping_rep_buf, 0, sizeof(ping_rep_buf));
|
||||
len = wiz_sock_recvfrom(sn, ping_rep_buf, rlen, addr,
|
||||
&port); /*从目的端接收数据*/
|
||||
|
||||
if (ping_rep_buf[0] == PING_REPLY) {
|
||||
PingReply.Type = ping_rep_buf[0];
|
||||
PingReply.Code = ping_rep_buf[1];
|
||||
PingReply.CheckSum = (ping_rep_buf[3] << 8) + ping_rep_buf[2];
|
||||
PingReply.ID = (ping_rep_buf[5] << 8) + ping_rep_buf[4];
|
||||
PingReply.SeqNum = (ping_rep_buf[7] << 8) + ping_rep_buf[6];
|
||||
if (ping_rep_buf[0] == PING_REPLY) {
|
||||
PingReply.Type = ping_rep_buf[0];
|
||||
PingReply.Code = ping_rep_buf[1];
|
||||
PingReply.CheckSum = (ping_rep_buf[3] << 8) + ping_rep_buf[2];
|
||||
PingReply.ID = (ping_rep_buf[5] << 8) + ping_rep_buf[4];
|
||||
PingReply.SeqNum = (ping_rep_buf[7] << 8) + ping_rep_buf[6];
|
||||
|
||||
for (i = 0; i < len - 8; i++) {
|
||||
PingReply.Data[i] = ping_rep_buf[8 + i];
|
||||
}
|
||||
tmp_checksum = ~checksum(ping_rep_buf, len); /*检查ping回复的次数*/
|
||||
if (tmp_checksum != 0xffff) {
|
||||
KPrintf("tmp_checksum = %x\r\n", tmp_checksum);
|
||||
for (i = 0; i < len - 8; i++) {
|
||||
PingReply.Data[i] = ping_rep_buf[8 + i];
|
||||
}
|
||||
tmp_checksum = ~checksum(ping_rep_buf, len); /*检查ping回复的次数*/
|
||||
if (tmp_checksum != 0xffff) {
|
||||
KPrintf("tmp_checksum = %x\r\n", tmp_checksum);
|
||||
} else {
|
||||
KPrintf("Reply from %3d.%3d.%3d.%3d ID=%x Byte=%d\r\n\r\n", (addr[0]),
|
||||
(addr[1]), (addr[2]), (addr[3]), htons(PingReply.ID), (rlen + 6));
|
||||
ping_reply_received = 1; /*当退出ping回复循环时,设置ping回复标志为1*/
|
||||
}
|
||||
} else if (ping_rep_buf[0] == PING_REQUEST) {
|
||||
PingReply.Code = ping_rep_buf[1];
|
||||
PingReply.Type = ping_rep_buf[2];
|
||||
PingReply.CheckSum = (ping_rep_buf[3] << 8) + ping_rep_buf[2];
|
||||
PingReply.ID = (ping_rep_buf[5] << 8) + ping_rep_buf[4];
|
||||
PingReply.SeqNum = (ping_rep_buf[7] << 8) + ping_rep_buf[6];
|
||||
for (i = 0; i < len - 8; i++) {
|
||||
PingReply.Data[i] = ping_rep_buf[8 + i];
|
||||
}
|
||||
tmp_checksum = PingReply.CheckSum; /*检查ping回复次数*/
|
||||
PingReply.CheckSum = 0;
|
||||
if (tmp_checksum != PingReply.CheckSum) {
|
||||
KPrintf(" \n CheckSum is in correct %x shold be %x \n", (tmp_checksum),
|
||||
htons(PingReply.CheckSum));
|
||||
} else {
|
||||
}
|
||||
KPrintf(
|
||||
" Request from %d.%d.%d.%d ID:%x SeqNum:%x :data size %d bytes\r\n",
|
||||
(addr[0]), (addr[1]), (addr[2]), (addr[3]), (PingReply.ID),
|
||||
(PingReply.SeqNum), (rlen + 6));
|
||||
ping_reply_received = 1; /* 当退出ping回复循环时,设置ping回复标志为1
|
||||
*/
|
||||
} else {
|
||||
KPrintf("Reply from %3d.%3d.%3d.%3d ID=%x Byte=%d\r\n\r\n", (addr[0]),
|
||||
(addr[1]), (addr[2]), (addr[3]), htons(PingReply.ID), (rlen + 6));
|
||||
ping_reply_received = 1; /*当退出ping回复循环时,设置ping回复标志为1*/
|
||||
KPrintf(" Unkonwn msg. \n");
|
||||
}
|
||||
} else if (ping_rep_buf[0] == PING_REQUEST) {
|
||||
PingReply.Code = ping_rep_buf[1];
|
||||
PingReply.Type = ping_rep_buf[2];
|
||||
PingReply.CheckSum = (ping_rep_buf[3] << 8) + ping_rep_buf[2];
|
||||
PingReply.ID = (ping_rep_buf[5] << 8) + ping_rep_buf[4];
|
||||
PingReply.SeqNum = (ping_rep_buf[7] << 8) + ping_rep_buf[6];
|
||||
for (i = 0; i < len - 8; i++) {
|
||||
PingReply.Data[i] = ping_rep_buf[8 + i];
|
||||
}
|
||||
tmp_checksum = PingReply.CheckSum; /*检查ping回复次数*/
|
||||
PingReply.CheckSum = 0;
|
||||
if (tmp_checksum != PingReply.CheckSum) {
|
||||
KPrintf(" \n CheckSum is in correct %x shold be %x \n", (tmp_checksum),
|
||||
htons(PingReply.CheckSum));
|
||||
} else {
|
||||
}
|
||||
KPrintf(
|
||||
" Request from %d.%d.%d.%d ID:%x SeqNum:%x :data size %d bytes\r\n",
|
||||
(addr[0]), (addr[1]), (addr[2]), (addr[3]), (PingReply.ID),
|
||||
(PingReply.SeqNum), (rlen + 6));
|
||||
ping_reply_received = 1; /* 当退出ping回复循环时,设置ping回复标志为1
|
||||
*/
|
||||
} else {
|
||||
KPrintf(" Unkonwn msg. \n");
|
||||
}
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void wiz_ping_test(int argc, char *argv[]) {
|
||||
uint32_t tmp_ip[4];
|
||||
uint8_t target_ip[4];
|
||||
uint16_t pCount = 5; //默认ping 5次
|
||||
void wiz_ping_test(int argc, char* argv[])
|
||||
{
|
||||
uint32_t tmp_ip[4];
|
||||
uint8_t target_ip[4];
|
||||
uint16_t pCount = 5; // 默认ping 5次
|
||||
|
||||
if (argc >= 2) {
|
||||
KPrintf("This is a Ping test: %s\n", argv[1]);
|
||||
sscanf(argv[1], "%d.%d.%d.%d", &tmp_ip[0], &tmp_ip[1], &tmp_ip[2],
|
||||
&tmp_ip[3]);
|
||||
target_ip[0] = (uint8_t)tmp_ip[0];
|
||||
target_ip[1] = (uint8_t)tmp_ip[1];
|
||||
target_ip[2] = (uint8_t)tmp_ip[2];
|
||||
target_ip[3] = (uint8_t)tmp_ip[3];
|
||||
if (argc >= 3){
|
||||
pCount = atoi(argv[2]); //如果ip后面跟具体的数字,代表ping的次数
|
||||
if (argc >= 2) {
|
||||
KPrintf("This is a Ping test: %s\n", argv[1]);
|
||||
sscanf(argv[1], "%d.%d.%d.%d", &tmp_ip[0], &tmp_ip[1], &tmp_ip[2],
|
||||
&tmp_ip[3]);
|
||||
target_ip[0] = (uint8_t)tmp_ip[0];
|
||||
target_ip[1] = (uint8_t)tmp_ip[1];
|
||||
target_ip[2] = (uint8_t)tmp_ip[2];
|
||||
target_ip[3] = (uint8_t)tmp_ip[3];
|
||||
if (argc >= 3) {
|
||||
pCount = atoi(argv[2]); // 如果ip后面跟具体的数字,代表ping的次数
|
||||
}
|
||||
ping_count(ping_socket, pCount, target_ip);
|
||||
}
|
||||
ping_count(ping_socket, pCount, target_ip);
|
||||
}
|
||||
}
|
||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
|
||||
ping, wiz_ping_test, ping to given addr);
|
||||
wiz_ping, wiz_ping_test, ping to given addr);
|
||||
@@ -191,8 +191,8 @@ static uint32 SpiWriteData(struct SpiHardwareDevice *spi_dev, struct SpiDataStan
|
||||
for (i = 0; i < spi_datacfg->length; i++) {
|
||||
tx_buff[i] = ((uint8_t *)spi_datacfg->tx_buff)[i];
|
||||
}
|
||||
dmac_set_single_mode(dev_param->spi_dma_param->spi_dmac_txchannel, tx_buff, (void *)(&spi_instance[device_master_id]->dr[0]), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
|
||||
DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, spi_datacfg->length);
|
||||
dmac_set_single_mode(dev_param->spi_dma_param->spi_dmac_txchannel, tx_buff, (void*)(&spi_instance[device_master_id]->dr[0]), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
|
||||
DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, spi_datacfg->length);
|
||||
}
|
||||
|
||||
spi_instance[device_master_id]->ser = 1U << dev_param->spi_slave_param->spi_cs_select_id;
|
||||
@@ -202,9 +202,9 @@ static uint32 SpiWriteData(struct SpiHardwareDevice *spi_dev, struct SpiDataStan
|
||||
spi_instance[device_master_id]->ssienr = 0x00;
|
||||
|
||||
transfer_done:
|
||||
if (tx_buff) {
|
||||
x_free(tx_buff);
|
||||
}
|
||||
if (tx_buff != NULL) {
|
||||
x_free(tx_buff);
|
||||
}
|
||||
}
|
||||
|
||||
if (spi_datacfg->spi_cs_release) {
|
||||
|
||||
Reference in New Issue
Block a user