drv_eth.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-07-20 thread-liu the first version
  9. */
  10. #include "board.h"
  11. #include "drv_config.h"
  12. #include <netif/ethernetif.h>
  13. #include "lwipopts.h"
  14. #include "drv_eth.h"
  15. #if defined(BSP_USING_GBE)
  16. //#define DRV_DEBUG
  17. //#define ETH_RX_DUMP
  18. //#define ETH_TX_DUMP
  19. #define LOG_TAG "drv.emac"
  20. #include <drv_log.h>
  21. #define MAX_ADDR_LEN 6
  22. rt_base_t level;
  23. #define TX_ADD_BASE 0x2FFC3000
  24. #define RX_ADD_BASE 0x2FFC5000
  25. #define TX_DMA_ADD_BASE 0x2FFC7000
  26. #define RX_DMA_ADD_BASE 0x2FFC7100
  27. #if defined(__ICCARM__)
  28. /* transmit buffer */
  29. #pragma location = TX_ADD_BASE
  30. __no_init static rt_uint8_t txBuffer[ETH_TXBUFNB][ETH_TX_BUF_SIZE];
  31. /* Receive buffer */
  32. #pragma location = RX_ADD_BASE
  33. __no_init static rt_uint8_t rxBuffer[ETH_RXBUFNB][ETH_RX_BUF_SIZE];
  34. /* Transmit DMA descriptors */
  35. #pragma location = TX_DMA_ADD_BASE
  36. __no_init static TxDmaDesc txDmaDesc[ETH_TXBUFNB];
  37. /* Receive DMA descriptors */
  38. #pragma location = RX_DMA_ADD_BASE
  39. __no_init static RxDmaDesc rxDmaDesc[ETH_RXBUFNB];
  40. #elif defined(__ARMCC_VERSION)
  41. /* transmit buffer */
  42. static rt_uint8_t txBuffer[ETH_TXBUFNB][ETH_TX_BUF_SIZE] __attribute__((at(TX_ADD_BASE)));
  43. /* Receive buffer */
  44. static rt_uint8_t rxBuffer[ETH_RXBUFNB][ETH_RX_BUF_SIZE] __attribute__((at(RX_ADD_BASE)));
  45. /* Transmit DMA descriptors */
  46. static TxDmaDesc txDmaDesc[ETH_TXBUFNB] __attribute__((at(TX_DMA_ADD_BASE)));
  47. /* Receive DMA descriptors */
  48. static RxDmaDesc rxDmaDesc[ETH_RXBUFNB] __attribute__((at(RX_DMA_ADD_BASE)));
  49. #elif defined ( __GNUC__ )
  50. /* transmit buffer */
  51. static rt_uint8_t txBuffer[ETH_TXBUFNB][ETH_TX_BUF_SIZE] __attribute__((section(".TxArraySection")));
  52. /* Receive buffer */
  53. static rt_uint8_t rxBuffer[ETH_RXBUFNB][ETH_RX_BUF_SIZE] __attribute__((section(".RxArraySection")));
  54. /* Transmit DMA descriptors */
  55. static TxDmaDesc txDmaDesc[ETH_TXBUFNB] __attribute__((section(".TxDecripSection")));
  56. /* Receive DMA descriptors */
  57. static RxDmaDesc rxDmaDesc[ETH_RXBUFNB] __attribute__((section(".RxDecripSection")));
  58. #endif
  59. //Current transmit descriptor
  60. static rt_uint8_t txIndex = 0;
  61. //Current receive descriptor
  62. static rt_uint8_t rxIndex = 0;
  63. /* eth */
  64. static struct rt_event rx_event = {0};
  65. #define ETH_TIME_OUT 100000
  66. struct rt_stm32_eth
  67. {
  68. /* inherit from ethernet device */
  69. struct eth_device parent;
  70. #ifndef PHY_USING_INTERRUPT_MODE
  71. rt_timer_t poll_link_timer;
  72. #endif
  73. /* interface address info, hw address */
  74. rt_uint8_t dev_addr[MAX_ADDR_LEN];
  75. /* eth speed */
  76. uint32_t eth_speed;
  77. /* eth duplex mode */
  78. uint32_t eth_mode;
  79. };
  80. static struct rt_stm32_eth stm32_eth_device = {0};
  81. #if defined(ETH_RX_DUMP) || defined(ETH_TX_DUMP)
  82. #define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
  83. static void dump_hex(const rt_uint8_t *ptr, rt_size_t buflen)
  84. {
  85. unsigned char *buf = (unsigned char *)ptr;
  86. int i, j;
  87. for (i = 0; i < buflen; i += 16)
  88. {
  89. rt_kprintf("%08X: ", i);
  90. for (j = 0; j < 16; j++)
  91. if (i + j < buflen)
  92. rt_kprintf("%02X ", buf[i + j]);
  93. else
  94. rt_kprintf(" ");
  95. rt_kprintf(" ");
  96. for (j = 0; j < 16; j++)
  97. if (i + j < buflen)
  98. rt_kprintf("%c", __is_print(buf[i + j]) ? buf[i + j] : '.');
  99. rt_kprintf("\n");
  100. }
  101. }
  102. #endif
  103. static rt_err_t phy_write_reg(uint8_t phy_addr, uint8_t reg_addr, uint16_t reg_value)
  104. {
  105. uint32_t temp;
  106. volatile uint32_t tickstart = 0;
  107. /* Take care not to alter MDC clock configuration */
  108. temp = ETH->MACMDIOAR & ETH_MACMDIOAR_CR;
  109. /* Set up a write operation */
  110. temp |= ETH_MACMDIOAR_GOC_Val(1) | ETH_MACMDIOAR_GB;
  111. /* PHY address */
  112. temp |= (phy_addr << 21) & ETH_MACMDIOAR_PA;
  113. /* Register address */
  114. temp |= (reg_addr << 16) & ETH_MACMDIOAR_RDA;
  115. /* Data to be written in the PHY register */
  116. ETH->MACMDIODR = reg_value & ETH_MACMDIODR_GD;
  117. /* Start a write operation */
  118. ETH->MACMDIOAR = temp;
  119. /* Wait for the write to complete */
  120. tickstart = rt_tick_get();
  121. while((ETH->MACMDIOAR & ETH_MACMDIOAR_GB) != 0)
  122. {
  123. /* judge timeout */
  124. if((rt_tick_get() - tickstart) > ETH_TIME_OUT)
  125. {
  126. LOG_E("PHY write reg %02x date %04x timeout!", reg_addr, reg_value);
  127. return RT_ETIMEOUT;
  128. }
  129. }
  130. return RT_EOK;
  131. }
  132. static uint16_t phy_read_reg(uint8_t phy_addr, uint8_t reg_addr)
  133. {
  134. uint16_t reg_value = 0;
  135. uint32_t status = 0;
  136. volatile uint32_t tickstart = 0;
  137. /* Take care not to alter MDC clock configuration */
  138. status = ETH->MACMDIOAR & ETH_MACMDIOAR_CR;
  139. /* Set up a read operation */
  140. status |= ETH_MACMDIOAR_GOC_Val(3) | ETH_MACMDIOAR_GB;
  141. /* PHY address */
  142. status |= (phy_addr << 21) & ETH_MACMDIOAR_PA;
  143. /* Register address */
  144. status |= (reg_addr << 16) & ETH_MACMDIOAR_RDA;
  145. /* Start a read operation */
  146. ETH->MACMDIOAR = status;
  147. /* Wait for the read to complete */
  148. tickstart = rt_tick_get();
  149. while((ETH->MACMDIOAR & ETH_MACMDIOAR_GB) != 0)
  150. {
  151. /* judge timeout */
  152. if((rt_tick_get() - tickstart) > ETH_TIME_OUT)
  153. {
  154. LOG_E("PHY read reg %02x timeout!", reg_addr);
  155. return RT_ETIMEOUT;
  156. }
  157. }
  158. /* Get register value */
  159. reg_value = ETH->MACMDIODR & ETH_MACMDIODR_GD;
  160. return reg_value;
  161. }
  162. static rt_err_t update_mac_mode(void)
  163. {
  164. uint32_t status;
  165. /* Read current MAC configuration */
  166. status = ETH->MACCR;
  167. if (stm32_eth_device.eth_speed & PHY_1000M)
  168. {
  169. status &= ~ETH_MACCR_PS;
  170. status &= ~ETH_MACCR_FES;
  171. }
  172. else if (stm32_eth_device.eth_speed & PHY_100M)
  173. {
  174. status |= ETH_MACCR_PS;
  175. status |= ETH_MACCR_FES;
  176. }
  177. /* 10M */
  178. else
  179. {
  180. status |= ETH_MACCR_PS;
  181. status &= ~ETH_MACCR_FES;
  182. }
  183. if (stm32_eth_device.eth_mode & PHY_FULL_DUPLEX)
  184. {
  185. status |= ETH_MACCR_DM;
  186. }
  187. else
  188. {
  189. status &= ~ETH_MACCR_DM;
  190. }
  191. /* Update MAC configuration register */
  192. ETH->MACCR = status;
  193. return RT_EOK;
  194. }
  195. static void HAL_ETH_MspInit(void)
  196. {
  197. GPIO_InitTypeDef GPIO_InitStruct = {0};
  198. RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  199. if(IS_ENGINEERING_BOOT_MODE())
  200. {
  201. /** Initializes the peripherals clock
  202. */
  203. PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ETH;
  204. PeriphClkInit.EthClockSelection = RCC_ETHCLKSOURCE_PLL4;
  205. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  206. {
  207. Error_Handler();
  208. }
  209. }
  210. /* Enable SYSCFG clock */
  211. __HAL_RCC_SYSCFG_CLK_ENABLE();
  212. /* Enable GPIO clocks */
  213. __HAL_RCC_GPIOA_CLK_ENABLE();
  214. __HAL_RCC_GPIOB_CLK_ENABLE();
  215. __HAL_RCC_GPIOC_CLK_ENABLE();
  216. __HAL_RCC_GPIOD_CLK_ENABLE();
  217. __HAL_RCC_GPIOE_CLK_ENABLE();
  218. __HAL_RCC_GPIOG_CLK_ENABLE();
  219. /* Select RGMII interface mode */
  220. HAL_SYSCFG_ETHInterfaceSelect(SYSCFG_ETH_RGMII);
  221. /* Enable Ethernet MAC clock */
  222. __HAL_RCC_ETH1MAC_CLK_ENABLE();
  223. __HAL_RCC_ETH1TX_CLK_ENABLE();
  224. __HAL_RCC_ETH1RX_CLK_ENABLE();
  225. /**ETH1 GPIO Configuration
  226. PA1 ------> ETH1_RX_CLK
  227. PA2 ------> ETH1_MDIO
  228. PA7 ------> ETH1_RX_CTL
  229. PB0 ------> ETH1_RXD2
  230. PB1 ------> ETH1_RXD3
  231. PB11 ------> ETH1_TX_CTL
  232. PC1 ------> ETH1_MDC
  233. PC2 ------> ETH1_TXD2
  234. PC4 ------> ETH1_RXD0
  235. PC5 ------> ETH1_RXD1
  236. PE2 ------> ETH1_TXD3
  237. PG4 ------> ETH1_GTX_CLK
  238. PG5 ------> ETH1_CLK125
  239. PG13 ------> ETH1_TXD0
  240. PG14 ------> ETH1_TXD1
  241. */
  242. GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
  243. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  244. GPIO_InitStruct.Pull = GPIO_NOPULL;
  245. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  246. GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
  247. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  248. GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_11;
  249. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  250. GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5;
  251. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  252. GPIO_InitStruct.Pin = GPIO_PIN_2;
  253. HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  254. GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_13|GPIO_PIN_14;
  255. HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
  256. /* ETH interrupt Init */
  257. HAL_NVIC_SetPriority(ETH1_IRQn, 0x01, 0x00);
  258. HAL_NVIC_EnableIRQ(ETH1_IRQn);
  259. /* Configure PHY_RST (PD10) */
  260. GPIO_InitStruct.Pin = GPIO_PIN_10;
  261. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  262. GPIO_InitStruct.Pull = GPIO_PULLUP;
  263. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  264. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  265. /* Reset PHY transceiver */
  266. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_RESET);
  267. rt_thread_mdelay(20);
  268. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_SET);
  269. rt_thread_mdelay(20);
  270. }
  271. static rt_err_t rt_stm32_eth_init(rt_device_t dev)
  272. {
  273. RT_ASSERT(dev != RT_NULL);
  274. rt_uint32_t status;
  275. int i = 0 ;
  276. volatile uint32_t tickstart = 0;
  277. uint8_t *macAddr = &stm32_eth_device.dev_addr[0];
  278. /* Initialize RX/TX descriptor index */
  279. rxIndex = txIndex = 0;
  280. HAL_ETH_MspInit();
  281. /* Reset Ethernet MAC peripheral */
  282. __HAL_RCC_ETH1MAC_FORCE_RESET();
  283. __HAL_RCC_ETH1MAC_RELEASE_RESET();
  284. /* Ethernet Software reset */
  285. ETH->DMAMR |= ETH_DMAMR_SWR;
  286. /* Wait for the reset to complete */
  287. tickstart = rt_tick_get();
  288. while (READ_BIT(ETH->DMAMR, ETH_DMAMR_SWR))
  289. {
  290. if(((HAL_GetTick() - tickstart ) > ETH_TIME_OUT))
  291. {
  292. LOG_E("ETH software reset timeout!");
  293. return RT_ERROR;
  294. }
  295. }
  296. /* Adjust MDC clock range depending on HCLK frequency */
  297. ETH->MACMDIOAR = ETH_MACMDIOAR_CR_Val(5);
  298. /* Use default MAC configuration */
  299. ETH->MACCR = ETH_MACCR_DO;
  300. /* Set the MAC address of the station */
  301. ETH->MACA0LR = ((macAddr[3] << 24) | (macAddr[2] << 16) | (macAddr[1] << 8) | macAddr[0]);
  302. ETH->MACA0HR = ((macAddr[5] << 8) | macAddr[4]);
  303. /* The MAC supports 3 additional addresses for unicast perfect filtering */
  304. ETH->MACA1LR = 0;
  305. ETH->MACA1HR = 0;
  306. ETH->MACA2LR = 0;
  307. ETH->MACA2HR = 0;
  308. ETH->MACA3LR = 0;
  309. ETH->MACA3HR = 0;
  310. /* Initialize hash table */
  311. ETH->MACHT0R = 0;
  312. ETH->MACHT1R = 0;
  313. /* Configure the receive filter */
  314. ETH->MACPFR = ETH_MACPFR_HPF | ETH_MACPFR_HMC;
  315. /* Disable flow control */
  316. ETH->MACQ0TXFCR = 0;
  317. ETH->MACRXFCR = 0;
  318. /* Enable the first RX queue */
  319. ETH->MACRXQC0R = ETH_MACRXQC0R_RXQ0EN_Val(1);
  320. /* Configure DMA operating mode */
  321. ETH->DMAMR = ETH_DMAMR_INTM_Val(0) | ETH_DMAMR_PR_Val(0);
  322. /* Configure system bus mode */
  323. ETH->DMASBMR |= ETH_DMASBMR_AAL;
  324. /* The DMA takes the descriptor table as contiguous */
  325. ETH->DMAC0CR = ETH_DMAC0CR_DSL_Val(0);
  326. /* Configure TX features */
  327. ETH->DMAC0TXCR = ETH_DMAC0TXCR_TXPBL_Val(1);
  328. /* Configure RX features */
  329. ETH->DMAC0RXCR = ETH_DMAC0RXCR_RXPBL_Val(1) | ETH_DMAC0RXCR_RBSZ_Val(ETH_RX_BUF_SIZE);
  330. /* Enable store and forward mode for transmission */
  331. ETH->MTLTXQ0OMR = ETH_MTLTXQ0OMR_TQS_Val(7) | ETH_MTLTXQ0OMR_TXQEN_Val(2) | ETH_MTLTXQ0OMR_TSF;
  332. /* Enable store and forward mode for reception */
  333. ETH->MTLRXQ0OMR = ETH_MTLRXQ0OMR_RQS_Val(7) | ETH_MTLRXQ0OMR_RSF;
  334. /* Initialize TX DMA descriptor list */
  335. for (i = 0; i < ETH_TXBUFNB; i++)
  336. {
  337. /* The descriptor is initially owned by the application */
  338. txDmaDesc[i].tdes0 = 0;
  339. txDmaDesc[i].tdes1 = 0;
  340. txDmaDesc[i].tdes2 = 0;
  341. txDmaDesc[i].tdes3 = 0;
  342. }
  343. /* Initialize RX DMA descriptor list */
  344. for (i = 0; i < ETH_RXBUFNB; i++)
  345. {
  346. /* The descriptor is initially owned by the DMA */
  347. rxDmaDesc[i].rdes0 = (uint32_t)rxBuffer[i];
  348. rxDmaDesc[i].rdes1 = 0;
  349. rxDmaDesc[i].rdes2 = 0;
  350. rxDmaDesc[i].rdes3 = ETH_RDES3_OWN | ETH_RDES3_IOC | ETH_RDES3_BUF1V;
  351. }
  352. /* Set Transmit Descriptor List Address Register */
  353. ETH->DMAC0TXDLAR = (uint32_t)&txDmaDesc[0];
  354. /* Length of the transmit descriptor ring */
  355. ETH->DMAC0TXRLR = ETH_TXBUFNB - 1;
  356. /* Set Receive Descriptor List Address Register */
  357. ETH->DMAC0RXDLAR = (uint32_t)&rxDmaDesc[0];
  358. /* Length of the receive descriptor ring */
  359. ETH->DMAC0RXRLR = ETH_RXBUFNB - 1;
  360. /* Prevent interrupts from being generated when the transmit statistic
  361. * counters reach half their maximum value */
  362. ETH->MMCTXIMR = ETH_MMCTXIMR_TXLPITRCIM | ETH_MMCTXIMR_TXLPIUSCIM | ETH_MMCTXIMR_TXGPKTIM | ETH_MMCTXIMR_TXMCOLGPIM | ETH_MMCTXIMR_TXSCOLGPIM;
  363. /* Prevent interrupts from being generated when the receive statistic
  364. * counters reach half their maximum value */
  365. ETH->MMCRXIMR = ETH_MMCRXIMR_RXLPITRCIM | ETH_MMCRXIMR_RXLPIUSCIM | ETH_MMCRXIMR_RXUCGPIM | ETH_MMCRXIMR_RXALGNERPIM | ETH_MMCRXIMR_RXCRCERPIM;
  366. /* Disable MAC interrupts */
  367. ETH->MACIER = 0;
  368. /* Enable the desired DMA interrupts */
  369. ETH->DMAC0IER = ETH_DMAC0IER_NIE | ETH_DMAC0IER_RIE | ETH_DMAC0IER_TIE;
  370. /* Enable MAC transmission and reception */
  371. ETH->MACCR |= ETH_MACCR_TE | ETH_MACCR_RE;
  372. /* Enable DMA transmission and reception */
  373. ETH->DMAC0TXCR |= ETH_DMAC0TXCR_ST;
  374. ETH->DMAC0RXCR |= ETH_DMAC0RXCR_SR;
  375. /* Reset PHY transceiver */
  376. phy_write_reg(RTL8211E_PHY_ADDR, RTL8211E_BMCR, RTL8211E_BMCR_RESET);
  377. status = phy_read_reg(RTL8211E_PHY_ADDR, RTL8211E_BMCR);
  378. /* Wait for the reset to complete */
  379. tickstart = rt_tick_get();
  380. while (status & RTL8211E_BMCR_RESET)
  381. {
  382. if((rt_tick_get() - tickstart) > ETH_TIME_OUT)
  383. {
  384. LOG_E("PHY software reset timeout!");
  385. return RT_ETIMEOUT;
  386. }
  387. else
  388. {
  389. status = phy_read_reg(RTL8211E_PHY_ADDR, RTL8211E_BMCR);
  390. }
  391. }
  392. /* The PHY will generate interrupts when link status changes are detected */
  393. phy_write_reg(RTL8211E_PHY_ADDR, RTL8211E_INER, RTL8211E_INER_AN_COMPLETE | RTL8211E_INER_LINK_STATUS);
  394. return RT_EOK;
  395. }
  396. static rt_err_t rt_stm32_eth_open(rt_device_t dev, rt_uint16_t oflag)
  397. {
  398. LOG_D("emac open");
  399. return RT_EOK;
  400. }
  401. static rt_err_t rt_stm32_eth_close(rt_device_t dev)
  402. {
  403. LOG_D("emac close");
  404. return RT_EOK;
  405. }
  406. static rt_size_t rt_stm32_eth_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
  407. {
  408. LOG_D("emac read");
  409. rt_set_errno(-RT_ENOSYS);
  410. return 0;
  411. }
  412. static rt_size_t rt_stm32_eth_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
  413. {
  414. LOG_D("emac write");
  415. rt_set_errno(-RT_ENOSYS);
  416. return 0;
  417. }
  418. static rt_err_t rt_stm32_eth_control(rt_device_t dev, int cmd, void *args)
  419. {
  420. switch (cmd)
  421. {
  422. case NIOCTL_GADDR:
  423. /* get mac address */
  424. if (args)
  425. {
  426. rt_memcpy(args, stm32_eth_device.dev_addr, 6);
  427. }
  428. else
  429. {
  430. return -RT_ERROR;
  431. }
  432. break;
  433. default :
  434. break;
  435. }
  436. return RT_EOK;
  437. }
  438. rt_err_t rt_stm32_eth_tx(rt_device_t dev, struct pbuf *p)
  439. {
  440. uint32_t framelen = 0;
  441. struct pbuf *q = RT_NULL;
  442. /* Copy user data to the transmit buffer */
  443. for (q = p; q != NULL; q = q->next)
  444. {
  445. /* Make sure the current buffer is available for writing */
  446. if((txDmaDesc[txIndex].tdes3 & ETH_TDES3_OWN) != 0)
  447. {
  448. LOG_D("buffer not valid");
  449. return ERR_USE;
  450. }
  451. level = rt_hw_interrupt_disable();
  452. rt_memcpy(&txBuffer[txIndex][framelen], q->payload, q->len);
  453. framelen += q->len;
  454. rt_hw_interrupt_enable(level);
  455. /* Check the frame length */
  456. if (framelen > ETH_TX_BUF_SIZE - 1)
  457. {
  458. LOG_D(" tx buffer frame length over : %d", framelen);
  459. return ERR_USE;
  460. }
  461. }
  462. #ifdef ETH_TX_DUMP
  463. rt_kprintf("Tx dump, len= %d\r\n", framelen);
  464. dump_hex(txBuffer[txIndex], framelen);
  465. #endif
  466. /* Set the start address of the buffer */
  467. txDmaDesc[txIndex].tdes0 = (uint32_t)txBuffer[txIndex];
  468. /* Write the number of bytes to send */
  469. txDmaDesc[txIndex].tdes2 = ETH_TDES2_IOC | (framelen & ETH_TDES2_B1L);
  470. /* Give the ownership of the descriptor to the DMA */
  471. txDmaDesc[txIndex].tdes3 = ETH_TDES3_OWN | ETH_TDES3_FD | ETH_TDES3_LD;
  472. /* Data synchronization barrier */
  473. __DSB();
  474. /* Clear TBU flag to resume processing */
  475. ETH->DMAC0SR = ETH_DMAC0SR_TBU;
  476. /* Instruct the DMA to poll the transmit descriptor list */
  477. ETH->DMAC0TXDTPR = 0;
  478. if (++txIndex > ETH_TXBUFNB - 1)
  479. {
  480. txIndex = 0;
  481. }
  482. return ERR_OK;
  483. }
  484. struct pbuf *rt_stm32_eth_rx(rt_device_t dev)
  485. {
  486. rt_uint32_t framelength = 0;
  487. uint32_t framelen = 0;
  488. struct pbuf *p = RT_NULL, *q = RT_NULL;
  489. /* The current buffer is available for reading */
  490. if (!(rxDmaDesc[rxIndex].rdes3 & ETH_RDES3_OWN))
  491. {
  492. /* FD and LD flags should be set */
  493. if ((rxDmaDesc[rxIndex].rdes3 & ETH_RDES3_FD) && (rxDmaDesc[rxIndex].rdes3 & ETH_RDES3_LD))
  494. {
  495. /* Make sure no error occurred */
  496. if(!(rxDmaDesc[rxIndex].rdes3 & ETH_RDES3_ES))
  497. {
  498. /* Retrieve the length of the frame */
  499. framelength = rxDmaDesc[rxIndex].rdes3 & ETH_RDES3_PL;
  500. /* check the frame length */
  501. framelength = (framelength > ETH_RX_BUF_SIZE) ? ETH_RX_BUF_SIZE : framelength;
  502. p = pbuf_alloc(PBUF_RAW, framelength, PBUF_RAM);
  503. if (p != NULL)
  504. {
  505. for (q = p; q != NULL; q = q->next)
  506. {
  507. level=rt_hw_interrupt_disable();
  508. rt_memcpy(q->payload, &rxBuffer[rxIndex][framelen], q->len);
  509. framelen += q->len;
  510. rt_hw_interrupt_enable(level);
  511. if (framelen > framelength)
  512. {
  513. LOG_E("frame len is too long!");
  514. return RT_NULL;
  515. }
  516. }
  517. }
  518. }
  519. else
  520. {
  521. /* The received packet contains an error */
  522. LOG_D("the received packet contains an error!");
  523. return RT_NULL;
  524. }
  525. }
  526. else
  527. {
  528. /* The packet is not valid */
  529. LOG_D("the packet is not valid");
  530. return RT_NULL;
  531. }
  532. /* Set the start address of the buffer */
  533. rxDmaDesc[rxIndex].rdes0 = (uint32_t)rxBuffer[rxIndex];
  534. /* Give the ownership of the descriptor back to the DMA */
  535. rxDmaDesc[rxIndex].rdes3 = ETH_RDES3_OWN | ETH_RDES3_IOC | ETH_RDES3_BUF1V;
  536. #ifdef ETH_RX_DUMP
  537. rt_kprintf("Rx dump, len= %d\r\n", framelen);
  538. dump_hex(rxBuffer[rxIndex], framelen);
  539. #endif
  540. /* Increment index and wrap around if necessary */
  541. if (++rxIndex > ETH_RXBUFNB - 1)
  542. {
  543. rxIndex = 0;
  544. }
  545. /* Clear RBU flag to resume processing */
  546. ETH->DMAC0SR = ETH_DMAC0SR_RBU;
  547. /* Instruct the DMA to poll the receive descriptor list */
  548. ETH->DMAC0RXDTPR = 0;
  549. }
  550. return p;
  551. }
  552. void ETH1_IRQHandler(void)
  553. {
  554. rt_uint32_t status = 0;
  555. /* enter interrupt */
  556. rt_interrupt_enter();
  557. /* Read DMA status register */
  558. status = ETH->DMAC0SR;
  559. /* Frame transmitted */
  560. if (status & ETH_DMAC0SR_TI)
  561. {
  562. /* Clear the Eth DMA Tx IT pending bits */
  563. ETH->DMAC0SR = ETH_DMAC0SR_TI;
  564. }
  565. /* Frame received */
  566. else if (status & ETH_DMAC0SR_RI)
  567. {
  568. /* Disable RIE interrupt */
  569. ETH->DMAC0IER &= ~ETH_DMAC0IER_RIE;
  570. rt_event_send(&rx_event, status);
  571. }
  572. /* ETH DMA Error */
  573. if (status & ETH_DMAC0SR_AIS)
  574. {
  575. ETH->DMAC0IER &= ~ETH_DMAC0IER_AIE;
  576. LOG_E("eth dam err");
  577. }
  578. /* Clear the interrupt flags */
  579. ETH->DMAC0SR = ETH_DMAC0SR_NIS;
  580. /* leave interrupt */
  581. rt_interrupt_leave();
  582. }
  583. static void phy_linkchange()
  584. {
  585. rt_uint32_t status = 0;
  586. /* Read status register to acknowledge the interrupt */
  587. status = phy_read_reg(RTL8211E_PHY_ADDR, RTL8211E_INSR);
  588. if (status & (RTL8211E_INSR_AN_COMPLETE | RTL8211E_INSR_LINK_STATUS))
  589. {
  590. status = phy_read_reg(RTL8211E_PHY_ADDR, RTL8211E_BMSR);
  591. status = phy_read_reg(RTL8211E_PHY_ADDR, RTL8211E_BMSR);
  592. if (status & RTL8211E_BMSR_LINK_STATUS)
  593. {
  594. LOG_D("link up");
  595. status = phy_read_reg(RTL8211E_PHY_ADDR, RTL8211E_PHYSR);
  596. switch (status & RTL8211E_PHYSR_SPEED)
  597. {
  598. case RTL8211E_PHYSR_SPEED_10MBPS:
  599. {
  600. LOG_D("speed: 10M");
  601. stm32_eth_device.eth_speed |= PHY_10M;
  602. break;
  603. }
  604. case RTL8211E_PHYSR_SPEED_100MBPS:
  605. {
  606. LOG_D("speed: 100M");
  607. stm32_eth_device.eth_speed |= PHY_100M;
  608. break;
  609. }
  610. case RTL8211E_PHYSR_SPEED_1000MBPS:
  611. {
  612. LOG_D("speed: 1000M");
  613. stm32_eth_device.eth_speed |= PHY_1000M;
  614. break;
  615. }
  616. /* Unknown speed */
  617. default:
  618. rt_kprintf("Invalid speed.");
  619. break;
  620. }
  621. stm32_eth_device.eth_mode = (status & RTL8211E_PHYSR_DUPLEX)? PHY_FULL_DUPLEX : PHY_HALF_DUPLEX;
  622. update_mac_mode();
  623. /* send link up. */
  624. eth_device_linkchange(&stm32_eth_device.parent, RT_TRUE);
  625. }
  626. else
  627. {
  628. LOG_D("link down");
  629. eth_device_linkchange(&stm32_eth_device.parent, RT_FALSE);
  630. }
  631. }
  632. }
  633. #ifdef PHY_USING_INTERRUPT_MODE
  634. static void eth_phy_isr(void *args)
  635. {
  636. rt_uint32_t status = 0;
  637. phy_read_reg(RTL8211E_PHY_ADDR, PHY_INTERRUPT_FLAG_REG, (uint32_t *)&status);
  638. LOG_D("phy interrupt status reg is 0x%X", status);
  639. phy_linkchange();
  640. }
  641. #endif /* PHY_USING_INTERRUPT_MODE */
  642. static void phy_monitor_thread_entry(void *parameter)
  643. {
  644. rt_uint32_t status = 0;
  645. phy_linkchange();
  646. #ifdef PHY_USING_INTERRUPT_MODE
  647. /* configuration intterrupt pin */
  648. rt_pin_mode(PHY_INT_PIN, PIN_MODE_INPUT_PULLUP);
  649. rt_pin_attach_irq(PHY_INT_PIN, PIN_IRQ_MODE_FALLING, eth_phy_isr, (void *)"callbackargs");
  650. rt_pin_irq_enable(PHY_INT_PIN, PIN_IRQ_ENABLE);
  651. /* enable phy interrupt */
  652. phy_write_reg(RTL8211E_PHY_ADDR, PHY_INTERRUPT_MASK_REG, PHY_INT_MASK);
  653. #if defined(PHY_INTERRUPT_CTRL_REG)
  654. phy_write_reg( RTL8211E_PHY_ADDR, PHY_INTERRUPT_CTRL_REG, PHY_INTERRUPT_EN);
  655. #endif
  656. #else /* PHY_USING_INTERRUPT_MODE */
  657. stm32_eth_device.poll_link_timer = rt_timer_create("phylnk", (void (*)(void*))phy_linkchange,
  658. NULL, RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC);
  659. if (!stm32_eth_device.poll_link_timer || rt_timer_start(stm32_eth_device.poll_link_timer) != RT_EOK)
  660. {
  661. LOG_E("Start link change detection timer failed");
  662. }
  663. #endif /* PHY_USING_INTERRUPT_MODE */
  664. while(1)
  665. {
  666. if (rt_event_recv(&rx_event, 0xffffffff, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
  667. RT_WAITING_FOREVER, &status) == RT_EOK)
  668. {
  669. /* check dma rx buffer */
  670. if (ETH->DMAC0SR & ETH_DMAC0SR_RI)
  671. {
  672. /* Clear interrupt flag */
  673. ETH->DMAC0SR = ETH_DMAC0SR_RI;
  674. /* Process all pending packets */
  675. while (rxDmaDesc[rxIndex].rdes3 & ETH_RDES3_PL)
  676. {
  677. /* trigger lwip receive thread */
  678. eth_device_ready(&(stm32_eth_device.parent));
  679. }
  680. }
  681. /* enable DMA interrupts */
  682. ETH->DMAC0IER = ETH_DMAC0IER_NIE | ETH_DMAC0IER_RIE | ETH_DMAC0IER_TIE;
  683. }
  684. }
  685. }
  686. /* Register the EMAC device */
  687. static int rt_hw_stm32_eth_init(void)
  688. {
  689. rt_err_t state = RT_EOK;
  690. /* OUI 00-80-E1 STMICROELECTRONICS. */
  691. stm32_eth_device.dev_addr[0] = 0x00;
  692. stm32_eth_device.dev_addr[1] = 0x80;
  693. stm32_eth_device.dev_addr[2] = 0xE1;
  694. /* generate MAC addr from 96bit unique ID. */
  695. stm32_eth_device.dev_addr[3] = *(rt_uint8_t *)(UID_BASE + 4);
  696. stm32_eth_device.dev_addr[4] = *(rt_uint8_t *)(UID_BASE + 2);
  697. stm32_eth_device.dev_addr[5] = *(rt_uint8_t *)(UID_BASE + 0);
  698. stm32_eth_device.parent.parent.init = rt_stm32_eth_init;
  699. stm32_eth_device.parent.parent.open = rt_stm32_eth_open;
  700. stm32_eth_device.parent.parent.close = rt_stm32_eth_close;
  701. stm32_eth_device.parent.parent.read = rt_stm32_eth_read;
  702. stm32_eth_device.parent.parent.write = rt_stm32_eth_write;
  703. stm32_eth_device.parent.parent.control = rt_stm32_eth_control;
  704. stm32_eth_device.parent.parent.user_data = RT_NULL;
  705. stm32_eth_device.parent.eth_rx = rt_stm32_eth_rx;
  706. stm32_eth_device.parent.eth_tx = rt_stm32_eth_tx;
  707. rt_event_init(&rx_event, "eth_rx", RT_IPC_FLAG_FIFO);
  708. /* register eth device */
  709. state = eth_device_init(&(stm32_eth_device.parent), "e0");
  710. if (RT_EOK == state)
  711. {
  712. LOG_D("emac device init success");
  713. }
  714. else
  715. {
  716. LOG_E("emac device init faild: %d", state);
  717. state = -RT_ERROR;
  718. }
  719. /* start phy monitor */
  720. rt_thread_t tid;
  721. tid = rt_thread_create("phy",
  722. phy_monitor_thread_entry,
  723. RT_NULL,
  724. 1024,
  725. RT_THREAD_PRIORITY_MAX - 2,
  726. 2);
  727. if (tid != RT_NULL)
  728. {
  729. rt_thread_startup(tid);
  730. }
  731. else
  732. {
  733. state = -RT_ERROR;
  734. }
  735. return state;
  736. }
  737. INIT_DEVICE_EXPORT(rt_hw_stm32_eth_init);
  738. #endif