eth_cl.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /*
  2. * File : eth_cl.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2009-10-05 Bernard eth interface driver for STM32F107 CL
  13. */
  14. #include <rtthread.h>
  15. #include "Libraries/STM32_ETH_Driver/inc/stm32_eth.h"
  16. #include <netif/ethernetif.h>
  17. #include "lwipopts.h"
  18. #define DP83848_PHY /* Ethernet pins mapped on STM3210C-EVAL Board */
  19. #define PHY_ADDRESS 0x01 /* Relative to STM3210C-EVAL Board */
  20. #define ETH_RXBUFNB 8
  21. #define ETH_TXBUFNB 2
  22. ETH_InitTypeDef ETH_InitStructure;
  23. ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB], DMATxDscrTab[ETH_TXBUFNB];
  24. rt_uint8_t Rx_Buff[ETH_RXBUFNB][ETH_MAX_PACKET_SIZE], Tx_Buff[ETH_TXBUFNB][ETH_MAX_PACKET_SIZE];
  25. #define MAX_ADDR_LEN 6
  26. struct rt_stm32_eth
  27. {
  28. /* inherit from ethernet device */
  29. struct eth_device parent;
  30. /* interface address info. */
  31. rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* hw address */
  32. };
  33. static struct rt_stm32_eth stm32_eth_device;
  34. /* interrupt service routine */
  35. void rt_stm32_eth_isr(int irqno)
  36. {
  37. rt_uint32_t status;
  38. if (status) // if receive packet
  39. {
  40. rt_err_t result;
  41. /* a frame has been received */
  42. result = eth_device_ready(&(stm32_eth_device.parent));
  43. RT_ASSERT(result == RT_EOK);
  44. }
  45. if (status) // if finished packet transmission
  46. {
  47. }
  48. }
  49. /* RT-Thread Device Interface */
  50. /* initialize the interface */
  51. static rt_err_t rt_stm32_eth_init(rt_device_t dev)
  52. {
  53. vu32 Value = 0;
  54. /* Reset ETHERNET on AHB Bus */
  55. ETH_DeInit();
  56. /* Software reset */
  57. ETH_SoftwareReset();
  58. /* Wait for software reset */
  59. while(ETH_GetSoftwareResetStatus()==SET);
  60. /* ETHERNET Configuration ------------------------------------------------------*/
  61. /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
  62. ETH_StructInit(&ETH_InitStructure);
  63. /* Fill ETH_InitStructure parametrs */
  64. /*------------------------ MAC -----------------------------------*/
  65. ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable ;
  66. ETH_InitStructure.ETH_Speed = ETH_Speed_100M;
  67. ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
  68. ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
  69. ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
  70. ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
  71. ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable;
  72. ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable;
  73. ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
  74. ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
  75. ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
  76. /* Configure ETHERNET */
  77. Value = ETH_Init(&ETH_InitStructure, PHY_ADDRESS);
  78. /* Initialize Tx Descriptors list: Chain Mode */
  79. ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
  80. /* Initialize Rx Descriptors list: Chain Mode */
  81. ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
  82. /* Enable MAC and DMA transmission and reception */
  83. ETH_Start();
  84. return RT_EOK;
  85. }
  86. static rt_err_t rt_stm32_eth_open(rt_device_t dev, rt_uint16_t oflag)
  87. {
  88. return RT_EOK;
  89. }
  90. static rt_err_t rt_stm32_eth_close(rt_device_t dev)
  91. {
  92. return RT_EOK;
  93. }
  94. static rt_size_t rt_stm32_eth_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
  95. {
  96. rt_set_errno(-RT_ENOSYS);
  97. return 0;
  98. }
  99. static rt_size_t rt_stm32_eth_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
  100. {
  101. rt_set_errno(-RT_ENOSYS);
  102. return 0;
  103. }
  104. static rt_err_t rt_stm32_eth_control(rt_device_t dev, rt_uint8_t cmd, void *args)
  105. {
  106. switch(cmd)
  107. {
  108. case NIOCTL_GADDR:
  109. /* get mac address */
  110. if(args) rt_memcpy(args, stm32_eth_device.dev_addr, 6);
  111. else return -RT_ERROR;
  112. break;
  113. default :
  114. break;
  115. }
  116. return RT_EOK;
  117. }
  118. /* ethernet device interface */
  119. /* transmit packet. */
  120. rt_err_t rt_stm32_eth_tx( rt_device_t dev, struct pbuf* p)
  121. {
  122. struct pbuf* q;
  123. rt_uint32_t len;
  124. rt_uint8_t* ptr;
  125. for (q = p; q != NULL; q = q->next)
  126. {
  127. len = q->len;
  128. ptr = q->payload;
  129. /* write data to device */
  130. }
  131. return RT_EOK;
  132. }
  133. /* reception packet. */
  134. struct pbuf *rt_stm32_eth_rx(rt_device_t dev)
  135. {
  136. struct pbuf* p;
  137. rt_uint32_t len;
  138. /* init p pointer */
  139. p = RT_NULL;
  140. if (1) // if there is packet in device
  141. {
  142. /* get one packet length */
  143. len = 0; // packet length
  144. /* allocate buffer */
  145. p = pbuf_alloc(PBUF_LINK, len, PBUF_RAM);
  146. if (p != RT_NULL)
  147. {
  148. rt_uint8_t* data;
  149. struct pbuf* q;
  150. for (q = p; q != RT_NULL; q= q->next)
  151. {
  152. data = q->payload;
  153. len = q->len;
  154. /* read data from device */
  155. }
  156. }
  157. }
  158. else
  159. {
  160. /* restore interrupt */
  161. }
  162. return p;
  163. }
  164. void rt_hw_stm32_eth_init()
  165. {
  166. stm32_eth_device.parent.parent.init = rt_stm32_eth_init;
  167. stm32_eth_device.parent.parent.open = rt_stm32_eth_open;
  168. stm32_eth_device.parent.parent.close = rt_stm32_eth_close;
  169. stm32_eth_device.parent.parent.read = rt_stm32_eth_read;
  170. stm32_eth_device.parent.parent.write = rt_stm32_eth_write;
  171. stm32_eth_device.parent.parent.control = rt_stm32_eth_control;
  172. stm32_eth_device.parent.parent.private = RT_NULL;
  173. stm32_eth_device.parent.eth_rx = rt_stm32_eth_rx;
  174. stm32_eth_device.parent.eth_tx = rt_stm32_eth_tx;
  175. eth_device_init(&(stm32_eth_device.parent), "e0");
  176. }