From d5c4a86de82b8dda100fbc0148c04cbab1a9bc72 Mon Sep 17 00:00:00 2001 From: "bernard.xiong" Date: Tue, 6 Oct 2009 00:24:03 +0000 Subject: [PATCH] add eth driver for STM32 CL git-svn-id: https://rt-thread.googlecode.com/svn/trunk@71 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- bsp/stm3210/eth_cl.c | 218 +++++++++++++++++++++++++++++++++++++++++++ bsp/stm3210/led.c | 3 +- 2 files changed, 219 insertions(+), 2 deletions(-) create mode 100644 bsp/stm3210/eth_cl.c diff --git a/bsp/stm3210/eth_cl.c b/bsp/stm3210/eth_cl.c new file mode 100644 index 0000000000..d3fb8a9047 --- /dev/null +++ b/bsp/stm3210/eth_cl.c @@ -0,0 +1,218 @@ +/* + * File : eth_cl.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2009-10-05 Bernard eth interface driver for STM32F107 CL + */ + +#include +#include "Libraries/STM32_ETH_Driver/inc/stm32_eth.h" + +#include +#include "lwipopts.h" + +#define DP83848_PHY /* Ethernet pins mapped on STM3210C-EVAL Board */ +#define PHY_ADDRESS 0x01 /* Relative to STM3210C-EVAL Board */ + +#define ETH_RXBUFNB 8 +#define ETH_TXBUFNB 2 +ETH_InitTypeDef ETH_InitStructure; +ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB], DMATxDscrTab[ETH_TXBUFNB]; +rt_uint8_t Rx_Buff[ETH_RXBUFNB][ETH_MAX_PACKET_SIZE], Tx_Buff[ETH_TXBUFNB][ETH_MAX_PACKET_SIZE]; + +#define MAX_ADDR_LEN 6 +struct rt_stm32_eth +{ + /* inherit from ethernet device */ + struct eth_device parent; + + /* interface address info. */ + rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* hw address */ +}; +static struct rt_stm32_eth stm32_eth_device; + +/* interrupt service routine */ +void rt_stm32_eth_isr(int irqno) +{ + rt_uint32_t status; + + if (status) // if receive packet + { + rt_err_t result; + + /* a frame has been received */ + result = eth_device_ready(&(stm32_eth_device.parent)); + RT_ASSERT(result == RT_EOK); + } + + if (status) // if finished packet transmission + { + } +} + +/* RT-Thread Device Interface */ +/* initialize the interface */ +static rt_err_t rt_stm32_eth_init(rt_device_t dev) +{ + vu32 Value = 0; + + /* Reset ETHERNET on AHB Bus */ + ETH_DeInit(); + + /* Software reset */ + ETH_SoftwareReset(); + + /* Wait for software reset */ + while(ETH_GetSoftwareResetStatus()==SET); + + /* ETHERNET Configuration ------------------------------------------------------*/ + /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */ + ETH_StructInit(Ð_InitStructure); + + /* Fill ETH_InitStructure parametrs */ + /*------------------------ MAC -----------------------------------*/ + ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable ; + ETH_InitStructure.ETH_Speed = ETH_Speed_100M; + ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable; + ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; + ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable; + ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; + ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable; + ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable; + ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; + ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; + ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; + + /* Configure ETHERNET */ + Value = ETH_Init(Ð_InitStructure, PHY_ADDRESS); + + /* Initialize Tx Descriptors list: Chain Mode */ + ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB); + /* Initialize Rx Descriptors list: Chain Mode */ + ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB); + + /* Enable MAC and DMA transmission and reception */ + ETH_Start(); + + return RT_EOK; +} + +static rt_err_t rt_stm32_eth_open(rt_device_t dev, rt_uint16_t oflag) +{ + return RT_EOK; +} + +static rt_err_t rt_stm32_eth_close(rt_device_t dev) +{ + return RT_EOK; +} + +static rt_size_t rt_stm32_eth_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) +{ + rt_set_errno(-RT_ENOSYS); + return 0; +} + +static rt_size_t rt_stm32_eth_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) +{ + rt_set_errno(-RT_ENOSYS); + return 0; +} + +static rt_err_t rt_stm32_eth_control(rt_device_t dev, rt_uint8_t cmd, void *args) +{ + switch(cmd) + { + case NIOCTL_GADDR: + /* get mac address */ + if(args) rt_memcpy(args, stm32_eth_device.dev_addr, 6); + else return -RT_ERROR; + break; + + default : + break; + } + + return RT_EOK; +} + +/* ethernet device interface */ +/* transmit packet. */ +rt_err_t rt_stm32_eth_tx( rt_device_t dev, struct pbuf* p) +{ + struct pbuf* q; + rt_uint32_t len; + rt_uint8_t* ptr; + + for (q = p; q != NULL; q = q->next) + { + len = q->len; + ptr = q->payload; + + /* write data to device */ + } + + return RT_EOK; +} + +/* reception packet. */ +struct pbuf *rt_stm32_eth_rx(rt_device_t dev) +{ + struct pbuf* p; + rt_uint32_t len; + + /* init p pointer */ + p = RT_NULL; + + if (1) // if there is packet in device + { + /* get one packet length */ + len = 0; // packet length + + /* allocate buffer */ + p = pbuf_alloc(PBUF_LINK, len, PBUF_RAM); + + if (p != RT_NULL) + { + rt_uint8_t* data; + struct pbuf* q; + + for (q = p; q != RT_NULL; q= q->next) + { + data = q->payload; + len = q->len; + + /* read data from device */ + } + } + } + else + { + /* restore interrupt */ + } + + return p; +} + +void rt_hw_stm32_eth_init() +{ + stm32_eth_device.parent.parent.init = rt_stm32_eth_init; + stm32_eth_device.parent.parent.open = rt_stm32_eth_open; + stm32_eth_device.parent.parent.close = rt_stm32_eth_close; + stm32_eth_device.parent.parent.read = rt_stm32_eth_read; + stm32_eth_device.parent.parent.write = rt_stm32_eth_write; + stm32_eth_device.parent.parent.control = rt_stm32_eth_control; + stm32_eth_device.parent.parent.private = RT_NULL; + + stm32_eth_device.parent.eth_rx = rt_stm32_eth_rx; + stm32_eth_device.parent.eth_tx = rt_stm32_eth_tx; + + eth_device_init(&(stm32_eth_device.parent), "e0"); +} diff --git a/bsp/stm3210/led.c b/bsp/stm3210/led.c index e20627cc9f..51721fce99 100644 --- a/bsp/stm3210/led.c +++ b/bsp/stm3210/led.c @@ -5,8 +5,7 @@ #define GPIO_LED GPIOF #define GPIO_Pin_LED GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 -static const rt_uint16_t led_map[] = {GPIO_Pin_6, GPIO_Pin_7, GPIO_Pin_8, GPIO_Pin_9 -}; +static const rt_uint16_t led_map[] = {GPIO_Pin_6, GPIO_Pin_7, GPIO_Pin_8, GPIO_Pin_9}; static rt_uint8_t led_inited = 0; static void GPIO_Configuration(void) -- GitLab