cmem7_eth.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. /**
  2. *****************************************************************************
  3. * @file cmem7_eth.c
  4. *
  5. * @brief CMEM7 ethernet source file
  6. *
  7. *
  8. * @version V2.0
  9. * @date 3. September 2014
  10. *
  11. * @note
  12. *
  13. *****************************************************************************
  14. * @attention
  15. *
  16. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  17. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  18. * TIME. AS A RESULT, CAPITAL-MICRO SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  19. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  20. * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  21. * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  22. *
  23. * <h2><center>&copy; COPYRIGHT 2013 Capital-micro </center></h2>
  24. *****************************************************************************
  25. */
  26. #include "cmem7_eth.h"
  27. #include "cmem7_misc.h"
  28. typedef struct {
  29. union {
  30. uint32_t TX0;
  31. struct {
  32. uint32_t : 1;
  33. uint32_t UNDERFLOW_ERR : 1; /*!< [OUT] Underflow error */
  34. uint32_t : 1;
  35. uint32_t COLLISION_CNT : 4; /*!< [OUT] Collision count */
  36. uint32_t : 1;
  37. uint32_t EX_COLLISION : 1; /*!< [OUT] Excessive collision error */
  38. uint32_t LATE_COLLISION : 1; /*!< [OUT] Late collision error */
  39. uint32_t NO_CARRIER : 1; /*!< [OUT] No carrier error */
  40. uint32_t LOSS_CARRIER : 1; /*!< [OUT] loss of carrier error */
  41. uint32_t PAYLOAD_ERR : 1; /*!< [OUT] IP payload error */
  42. uint32_t : 2;
  43. uint32_t ERR_SUM : 1; /*!< [OUT] Error summary */
  44. uint32_t HEADER_ERR : 1; /*!< [OUT] IP header error */
  45. uint32_t : 3;
  46. uint32_t TCH : 1; /*!< Second Address Chained */
  47. uint32_t : 4;
  48. uint32_t TTSE : 1; /*!< enables IEEE1588 hardware timestamping in first segment */
  49. uint32_t : 2;
  50. uint32_t FS : 1; /*!< first segment flag */
  51. uint32_t LS : 1; /*!< last segment flag */
  52. uint32_t IC : 1; /*!< Interrupt on Completion */
  53. uint32_t OWN : 1; /*!< Descriptor is owned by self or hardware */
  54. } TX0_b;
  55. } TX_0;
  56. union {
  57. uint32_t TX1;
  58. struct {
  59. uint32_t SIZE : 13; /*!< buffer size */
  60. uint32_t : 19;
  61. } TX1_b;
  62. } TX_1;
  63. uint32_t bufAddr;
  64. uint32_t nextDescAddr;
  65. uint64_t reserved;
  66. uint64_t timeStamp; /*!< time stamp in the last segment */
  67. } INNER_ETH_TX_DESC;
  68. typedef struct {
  69. union {
  70. uint32_t RX0;
  71. struct {
  72. uint32_t : 1;
  73. uint32_t CRC_ERR : 1; /*!< [OUT] CRC error while last segment */
  74. uint32_t : 5;
  75. uint32_t TTSE : 1; /*!< timestamp available while last segment */
  76. uint32_t LS : 1; /*!< last segment flag */
  77. uint32_t FS : 1; /*!< first segment flag */
  78. uint32_t : 1;
  79. uint32_t OVERFLOW_ERR : 1; /*!< [OUT] FIFO overflow while last segment */
  80. uint32_t LENGTH_ERR : 1; /*!< [OUT] length error while last segment */
  81. uint32_t : 2;
  82. uint32_t ERR_SUM : 1; /*!< [OUT] Error summary while last segment */
  83. uint32_t FL : 14; /*!< frame length while last segment */
  84. uint32_t : 1;
  85. uint32_t OWN : 1; /*!< Descriptor is owned by self or hardware */
  86. } RX0_b;
  87. } RX_0;
  88. union {
  89. uint32_t RX1;
  90. struct {
  91. uint32_t SIZE : 13; /*!< buffer size */
  92. uint32_t : 1;
  93. uint32_t RCH : 1; /*!< Second Address Chained */
  94. uint32_t : 16;
  95. uint32_t DIC : 1; /*!< Disable interrupt on Completion */
  96. } RX1_b;
  97. } RX_1;
  98. uint32_t bufAddr;
  99. uint32_t nextDescAddr;
  100. uint64_t reserved;
  101. uint64_t timeStamp; /*!< time stamp while the last segment */
  102. } INNER_ETH_RX_DESC;
  103. #define PHY_OP_READ 0x0
  104. #define PHY_OP_WRITE 0x1
  105. #define ETH_BURST_MODE_FIXED 0x0
  106. #define ETH_BURST_MODE_UNDERSIZE 0x1
  107. #define ETH_BURST_MODE_MIXED 0x2
  108. #define ETH_BURST_LENGTH_MIN 1
  109. #define ETH_BURST_LENGTH_MAX 256
  110. #define ETH_BURST_LENGTH_8X_SWITCH 32
  111. #define ETH_BURST_LENGTH_8X_MIN 8
  112. #define ETH_DMA_ARBITRATION_ROUND_ROBIN 0x0
  113. #define ETH_DMA_ARBITRATION_FIXED_PRIORITY 0x1
  114. #define ETH_RX_THRESHOLD_64 0x0
  115. #define ETH_RX_THRESHOLD_32 0x1
  116. #define ETH_RX_THRESHOLD_96 0x2
  117. #define ETH_RX_THRESHOLD_128 0x3
  118. #define ETH_TX_THRESHOLD_64 0x0
  119. #define ETH_TX_THRESHOLD_128 0x1
  120. #define ETH_TX_THRESHOLD_192 0x2
  121. #define ETH_TX_THRESHOLD_256 0x3
  122. #define ETH_TX_THRESHOLD_40 0x4
  123. #define ETH_TX_THRESHOLD_32 0x5
  124. #define ETH_TX_THRESHOLD_24 0x6
  125. #define ETH_TX_THRESHOLD_16 0x7
  126. #define ETH_INT_ABNORMAL_SUMMARY 0x8000
  127. #define ETH_INT_NORMAL_SUMMARY 0x10000
  128. #define IS_ETH_INT_NORMAL(INT) ((INT & ETH_INT_TX_COMPLETE_FRAME) || \
  129. (INT & ETH_INT_TX_BUF_UNAVAI) || \
  130. (INT & ETH_INT_RX_COMPLETE_FRAME))
  131. #define IS_ETH_INT_ABNORMAL(INT) ((INT & ETH_INT_TX_STOP) || \
  132. (INT & ETH_INT_RX_OVERFLOW) || \
  133. (INT & ETH_INT_TX_UNDERFLOW) || \
  134. (INT & ETH_INT_RX_BUF_UNAVAI) || \
  135. (INT & ETH_INT_RX_STOP) || \
  136. (INT & ETH_INT_BUS_FATAL_ERROR))
  137. #define ETH_PREAMBLE_7_BYTE 0x0
  138. #define ETH_PREAMBLE_5_BYTE 0x1
  139. #define ETH_PREAMBLE_3_BYTE 0x2
  140. #define ETH_LINE_SPEED_1000M_BPS 0x0
  141. #define ETH_LINE_SPEED_10_100M_BPS 0x1
  142. #define ETH_EXACT_SPEED_10M_BPS 0x0
  143. #define ETH_EXACT_SPEED_100M_BPS 0x1
  144. #define ETH_SOURCE_ADDR_REPLACE 0x3
  145. #define ETH_PASS_CTRL_FRAME_ALL 0x0
  146. #define ETH_DESC_OWN_BY_SELF 0x0
  147. #define ETH_DESC_OWN_BY_HW 0x1
  148. static void mac_SwReset(void) {
  149. ETH->BUS_MODE_b.SWR = 1;
  150. while (ETH->BUS_MODE_b.SWR) ;
  151. while (ETH->AHB_STATUS_b.BUSY) ;
  152. }
  153. static void mac_SetConfig(ETH_InitTypeDef *init) {
  154. ETH->CONFIG_b.PRELEN = ETH_PREAMBLE_7_BYTE;
  155. ETH->CONFIG_b.RX_EN = init->ETH_RxEn;
  156. ETH->CONFIG_b.TX_EN = init->ETH_TxEn;
  157. ETH->CONFIG_b.DC_EN = FALSE;
  158. ETH->CONFIG_b.ACS = FALSE;
  159. ETH->CONFIG_b.LUD = init->ETH_LinkUp;
  160. ETH->CONFIG_b.IPC = init->ETH_ChecksumOffload;
  161. ETH->CONFIG_b.DM = init->ETH_Duplex;
  162. ETH->CONFIG_b.LM = FALSE;
  163. ETH->MMCRIMR = 0xFFFFFFFF;
  164. ETH->MMCTIMR = 0xFFFFFFFF;
  165. ETH->MMCIRCOIM = 0xFFFFFFFF;
  166. if (init->ETH_Speed == ETH_SPEED_10M) {
  167. ETH->CONFIG_b.FES = ETH_EXACT_SPEED_10M_BPS;
  168. ETH->CONFIG_b.PS = ETH_LINE_SPEED_10_100M_BPS;
  169. } else if (init->ETH_Speed == ETH_SPEED_100M) {
  170. ETH->CONFIG_b.FES = ETH_EXACT_SPEED_100M_BPS;
  171. ETH->CONFIG_b.PS = ETH_LINE_SPEED_10_100M_BPS;
  172. } else {
  173. ETH->CONFIG_b.FES = ETH_EXACT_SPEED_100M_BPS;
  174. ETH->CONFIG_b.PS = ETH_LINE_SPEED_1000M_BPS;
  175. }
  176. ETH->CONFIG_b.JE = init->ETH_JumboFrame;
  177. ETH->CONFIG_b.JD = TRUE;
  178. ETH->CONFIG_b.WD = TRUE;
  179. ETH->CONFIG_b.TC = FALSE;
  180. ETH->CONFIG_b.CST = TRUE;
  181. ETH->CONFIG_b.TWOKPE = FALSE;
  182. ETH->CONFIG_b.SARC = ETH_SOURCE_ADDR_REPLACE;
  183. }
  184. static void mac_SetMacAddr(uint8_t *mac) {
  185. ETH->ADDR0_HIGH = (mac[5] << 8) | mac[4];
  186. ETH->ADDR0_LOW = (mac[3] << 24) | (mac[2] << 16) |
  187. (mac[1] << 8) | mac[0];
  188. }
  189. static void mac_SetBurst(
  190. uint8_t mode, uint32_t rxBurstLen, uint32_t txBurstLen) {
  191. ETH->BUS_MODE_b.RIB = FALSE;
  192. ETH->BUS_MODE_b.AAL = FALSE;
  193. if (mode == ETH_BURST_MODE_FIXED) {
  194. ETH->BUS_MODE_b.FB = TRUE;
  195. ETH->BUS_MODE_b.MB = FALSE;
  196. } else if (mode == ETH_BURST_MODE_UNDERSIZE) {
  197. ETH->BUS_MODE_b.FB = FALSE;
  198. ETH->BUS_MODE_b.MB = FALSE;
  199. } else {
  200. ETH->BUS_MODE_b.FB = TRUE;
  201. ETH->BUS_MODE_b.MB = TRUE;
  202. }
  203. rxBurstLen = 1 << rxBurstLen;
  204. rxBurstLen = (rxBurstLen > ETH_BURST_LENGTH_MAX) ?
  205. ETH_BURST_LENGTH_MAX : rxBurstLen;
  206. txBurstLen = 1 << txBurstLen;
  207. txBurstLen = (txBurstLen > ETH_BURST_LENGTH_MAX) ?
  208. ETH_BURST_LENGTH_MAX : txBurstLen;
  209. // Regrading PBLx8 register, if one of PBL and RPBL is more than
  210. // ETH_BURST_LENGTH_8X_SWITCH, another should be more than
  211. // ETH_BURST_LENGTH_8X_MIN.
  212. // If not, the greater level down to ETH_BURST_LENGTH_8X_SWITCH.
  213. if ((txBurstLen < ETH_BURST_LENGTH_8X_MIN) ||
  214. (rxBurstLen < ETH_BURST_LENGTH_8X_MIN)) {
  215. if (rxBurstLen > ETH_BURST_LENGTH_8X_SWITCH) {
  216. rxBurstLen = ETH_BURST_LENGTH_8X_SWITCH;
  217. }
  218. if (txBurstLen > ETH_BURST_LENGTH_8X_SWITCH) {
  219. txBurstLen = ETH_BURST_LENGTH_8X_SWITCH;
  220. }
  221. }
  222. ETH->BUS_MODE_b.USP = (rxBurstLen == txBurstLen) ? FALSE : TRUE;
  223. if ((txBurstLen > ETH_BURST_LENGTH_8X_SWITCH) ||
  224. (rxBurstLen > ETH_BURST_LENGTH_8X_SWITCH)) {
  225. ETH->BUS_MODE_b.PBLx8 = TRUE;
  226. } else {
  227. ETH->BUS_MODE_b.PBLx8 = FALSE;
  228. }
  229. if (ETH->BUS_MODE_b.PBLx8) {
  230. ETH->BUS_MODE_b.RPBL = rxBurstLen >> 3;
  231. ETH->BUS_MODE_b.PBL = txBurstLen >> 3;
  232. } else {
  233. ETH->BUS_MODE_b.RPBL = rxBurstLen;
  234. ETH->BUS_MODE_b.PBL = txBurstLen;
  235. }
  236. }
  237. static void mac_SetPriority(BOOL isRxPrior, uint8_t priorityRate) {
  238. ETH->BUS_MODE_b.PRWG = 0;
  239. ETH->BUS_MODE_b.DA = ETH_DMA_ARBITRATION_ROUND_ROBIN;
  240. ETH->BUS_MODE_b.TXPR = isRxPrior ? FALSE : TRUE;
  241. ETH->BUS_MODE_b.PR = priorityRate;
  242. }
  243. static void mac_SetDescMode(BOOL isAlternate, uint8_t gap) {
  244. ETH->BUS_MODE_b.ATDS = isAlternate;
  245. ETH->BUS_MODE_b.DSL = gap;
  246. }
  247. static void mac_SetOpertionMode(void) {
  248. ETH->OPERATION_b.OSF = FALSE;
  249. ETH->OPERATION_b.RT = ETH_RX_THRESHOLD_32;
  250. ETH->OPERATION_b.RSF = FALSE;
  251. ETH->OPERATION_b.DGF = FALSE;
  252. ETH->OPERATION_b.FUF = FALSE;
  253. ETH->OPERATION_b.FEF = FALSE;
  254. ETH->OPERATION_b.TT = ETH_TX_THRESHOLD_64;
  255. ETH->OPERATION_b.TSF = FALSE;
  256. ETH->OPERATION_b.FTF = TRUE;
  257. ETH->OPERATION_b.DFF = TRUE;
  258. }
  259. static void mac_SetFrameFilter(ETH_FrameFilter *filter) {
  260. ETH->FF_b.PR = FALSE;
  261. ETH->FF_b.HUC = FALSE;
  262. ETH->FF_b.HMC = FALSE;
  263. ETH->FF_b.DAIF = FALSE;
  264. ETH->FF_b.PM = FALSE;
  265. ETH->FF_b.DBF = FALSE;
  266. ETH->FF_b.PCF = ETH_PASS_CTRL_FRAME_ALL;
  267. ETH->FF_b.SAIF = FALSE;
  268. ETH->FF_b.SAF = FALSE;
  269. ETH->FF_b.HPF = FALSE;
  270. ETH->FF_b.VTFE = FALSE;
  271. ETH->FF_b.IPFE = FALSE;
  272. ETH->FF_b.DNTU = FALSE;
  273. ETH->FF_b.RA = FALSE;//TRUE
  274. // receive all
  275. if (!filter) {
  276. return ;
  277. }
  278. // broadcast
  279. if (filter->ETH_BroadcastFilterEnable) {
  280. ETH->FF_b.RA = FALSE;
  281. ETH->FF_b.DBF = TRUE;
  282. }
  283. // DA
  284. if (filter->ETH_OwnFilterEnable) {
  285. ETH->FF_b.RA = FALSE;
  286. ETH->FF_b.DAIF = filter->ETH_SelfDrop;
  287. }
  288. // SA
  289. if (filter->ETH_SourceFilterEnable) {
  290. uint32_t value;
  291. ETH->FF_b.RA = FALSE;
  292. ETH->FF_b.SAF = TRUE;
  293. ETH->FF_b.SAIF = filter->ETH_SourceDrop;
  294. ETH->ADDR1_HIGH_b.AE = TRUE;
  295. ETH->ADDR1_HIGH_b.SA = TRUE;
  296. ETH->ADDR1_HIGH_b.ADDR =
  297. (filter->ETH_SourceMacAddr[5] << 8) | filter->ETH_SourceMacAddr[4];
  298. // value = (filter->ETH_SourceMacAddr[5] << 8) | filter->ETH_SourceMacAddr[4];
  299. // CMEM7_BFI(&(ETH->ADDR1_HIGH), value, 0, 16);
  300. ETH->ADDR1_LOW = (filter->ETH_SourceMacAddr[3] << 24) |
  301. (filter->ETH_SourceMacAddr[2] << 16) |
  302. (filter->ETH_SourceMacAddr[1] << 8) |
  303. filter->ETH_SourceMacAddr[0];
  304. }
  305. }
  306. static void mac_setFlowControl(void) {
  307. ETH->FC_b.FCB = FALSE;
  308. ETH->FC_b.TFE = FALSE;//TRUE
  309. ETH->FC_b.RFE = FALSE;//TRUE
  310. ETH->FC_b.UP = FALSE;//TRUE
  311. }
  312. uint32_t ETH_PhyRead(uint32_t phyAddr, uint32_t phyReg) {
  313. ETH->GMII_ADDR_b.PA = phyAddr;
  314. ETH->GMII_ADDR_b.GR = phyReg;
  315. ETH->GMII_ADDR_b.GW = PHY_OP_READ;
  316. ETH->GMII_ADDR_b.BUSY = TRUE;
  317. while (ETH->GMII_ADDR_b.BUSY) ;
  318. return ETH->GMII_DATA;
  319. }
  320. void ETH_PhyWrite(uint32_t phyAddr, uint32_t phyReg, uint32_t data) {
  321. ETH->GMII_ADDR_b.PA = phyAddr;
  322. ETH->GMII_ADDR_b.GR = phyReg;
  323. ETH->GMII_ADDR_b.GW = PHY_OP_WRITE;
  324. ETH->GMII_DATA = data;
  325. ETH->GMII_ADDR_b.BUSY = TRUE;
  326. while (ETH->GMII_ADDR_b.BUSY) ;
  327. }
  328. void ETH_StructInit(ETH_InitTypeDef* init)
  329. {
  330. init->ETH_Speed = ETH_SPEED_10M;
  331. init->ETH_Duplex = ETH_DUPLEX_FULL;
  332. init->ETH_JumboFrame = FALSE;
  333. init->ETH_LinkUp = FALSE;
  334. init->ETH_RxEn = TRUE;
  335. init->ETH_TxEn = TRUE;
  336. init->ETH_ChecksumOffload = FALSE;
  337. init->ETH_Filter = 0;
  338. init->ETH_MacAddr[0] = 0;
  339. init->ETH_MacAddr[1] = 0;
  340. init->ETH_MacAddr[2] = 0;
  341. init->ETH_MacAddr[3] = 0;
  342. init->ETH_MacAddr[4] = 0;
  343. init->ETH_MacAddr[5] = 0;
  344. }
  345. BOOL ETH_Init(ETH_InitTypeDef *init) {
  346. assert_param(init);
  347. assert_param(IS_ETH_SPEED(init->ETH_Speed));
  348. assert_param(IS_ETH_DUPLEX(init->ETH_Duplex));
  349. mac_SwReset();
  350. mac_SetConfig(init);
  351. mac_SetMacAddr(init->ETH_MacAddr);
  352. mac_SetBurst(ETH_BURST_MODE_MIXED, 3, 4);
  353. mac_SetPriority(TRUE, 0);
  354. mac_SetDescMode(TRUE, 0);
  355. mac_SetOpertionMode();
  356. mac_SetFrameFilter(init->ETH_Filter);
  357. mac_setFlowControl();
  358. return TRUE;
  359. }
  360. void ETH_ITConfig(uint32_t Int, BOOL enable) {
  361. assert_param(IS_ETH_INT(Int));
  362. if (enable) {
  363. if (IS_ETH_INT_NORMAL(Int)) {
  364. ETH->INT_EN_b.NIE = TRUE;
  365. }
  366. if (IS_ETH_INT_ABNORMAL(Int)) {
  367. ETH->INT_EN_b.AIE = TRUE;
  368. }
  369. ETH->INT_EN |= Int;
  370. } else {
  371. ETH->INT_EN &= ~Int;
  372. if (!IS_ETH_INT_NORMAL(ETH->INT_EN)) {
  373. ETH->INT_EN_b.NIE = FALSE;
  374. }
  375. if (!IS_ETH_INT_ABNORMAL(ETH->INT_EN)) {
  376. ETH->INT_EN_b.AIE = FALSE;
  377. }
  378. }
  379. }
  380. BOOL ETH_GetITStatus(uint32_t Int) {
  381. assert_param(IS_ETH_INT(Int));
  382. Int &= ETH->INT_EN;
  383. if (0 != (ETH->STATUS & Int)) {
  384. return TRUE;
  385. }
  386. return FALSE;
  387. }
  388. void ETH_ClearITPendingBit(uint32_t Int) {
  389. uint32_t sta;
  390. assert_param(IS_ETH_INT(Int));
  391. sta = ETH->STATUS;
  392. sta &= ETH->INT_EN;
  393. sta &= ~Int;
  394. // write 1 clear
  395. ETH->STATUS = Int;
  396. if (IS_ETH_INT_NORMAL(Int)) {
  397. if (!IS_ETH_INT_NORMAL(sta)) {
  398. // write 1 clear NIS
  399. ETH->STATUS = ETH_INT_NORMAL_SUMMARY;
  400. }
  401. }
  402. if (IS_ETH_INT_ABNORMAL(Int)) {
  403. if (!IS_ETH_INT_ABNORMAL(sta)) {
  404. // write 1 clear AIS
  405. ETH->STATUS = ETH_INT_ABNORMAL_SUMMARY;
  406. }
  407. }
  408. }
  409. void ETH_GetMacAddr(uint8_t *mac) {
  410. uint32_t tmp;
  411. if (!mac) {
  412. return ;
  413. }
  414. tmp = ETH->ADDR0_LOW;
  415. *(mac + 0) = (tmp >> 0) & 0xFF;
  416. *(mac + 1) = (tmp >> 8) & 0xFF;
  417. *(mac + 2) = (tmp >> 16) & 0xFF;
  418. *(mac + 3) = (tmp >> 24) & 0xFF;
  419. tmp = ETH->ADDR0_HIGH;
  420. *(mac + 4) = (tmp >> 0) & 0xFF;
  421. *(mac + 5) = (tmp >> 8) & 0xFF;
  422. }
  423. BOOL ETH_SetTxDescRing(ETH_TX_DESC *ring) {
  424. ETH_TX_DESC *buf = ring;
  425. if (!ring) {
  426. return FALSE;
  427. }
  428. if (ETH->OPERATION_b.ST) {
  429. return FALSE;
  430. }
  431. /* If code mapping */
  432. ring = (ETH_TX_DESC *)GLB_ConvertToMappingFromAddr((uint32_t)ring);
  433. buf = ring;
  434. do {
  435. INNER_ETH_TX_DESC *desc = (INNER_ETH_TX_DESC *)buf;
  436. uint8_t first = desc->TX_0.TX0_b.FS;
  437. uint8_t last = desc->TX_0.TX0_b.LS;
  438. // clear all bits
  439. desc->TX_0.TX0 = 0;
  440. desc->TX_0.TX0_b.FS = first;
  441. desc->TX_0.TX0_b.LS = last;
  442. desc->TX_0.TX0_b.TCH = TRUE;
  443. desc->TX_0.TX0_b.IC = TRUE;
  444. desc->TX_0.TX0_b.OWN = ETH_DESC_OWN_BY_SELF;
  445. buf->bufAddr = GLB_ConvertToMappingFromAddr(buf->bufAddr);
  446. buf->nextDescAddr = GLB_ConvertToMappingFromAddr(buf->nextDescAddr);
  447. buf = (ETH_TX_DESC *)buf->nextDescAddr;
  448. } while (buf != ring);
  449. ETH->TDESLA = (uint32_t)ring;
  450. return TRUE;
  451. }
  452. void ETH_StartTx() {
  453. ETH->OPERATION_b.ST = TRUE;
  454. }
  455. void ETH_StopTx() {
  456. ETH->OPERATION_b.ST = FALSE;
  457. }
  458. void ETH_ResumeTx() {
  459. ETH->TPD = 0;
  460. }
  461. ETH_TX_DESC *ETH_AcquireFreeTxDesc(void) {
  462. uint32_t cur = ETH->CURTDESAPTR;
  463. INNER_ETH_TX_DESC *desc = (INNER_ETH_TX_DESC *)cur;
  464. do {
  465. if (desc->TX_0.TX0_b.OWN == ETH_DESC_OWN_BY_SELF) {
  466. return (ETH_TX_DESC *)desc;
  467. }
  468. desc = (INNER_ETH_TX_DESC *)desc->nextDescAddr;
  469. } while ((uint32_t)desc != cur);
  470. return 0;
  471. }
  472. BOOL ETH_IsFreeTxDesc(ETH_TX_DESC *desc) {
  473. INNER_ETH_TX_DESC *inner;
  474. if (!desc) {
  475. return FALSE;
  476. }
  477. inner = (INNER_ETH_TX_DESC *)desc;
  478. return (inner->TX_0.TX0_b.OWN == ETH_DESC_OWN_BY_SELF) ? TRUE : FALSE;
  479. }
  480. void ETH_ReleaseTxDesc(ETH_TX_DESC *desc) {
  481. INNER_ETH_TX_DESC *inner;
  482. if (!desc) {
  483. return;
  484. }
  485. inner = (INNER_ETH_TX_DESC *)desc;
  486. inner->TX_0.TX0_b.OWN = ETH_DESC_OWN_BY_HW;
  487. }
  488. void ETH_SetTxDescBufAddr(ETH_TX_DESC *desc, uint32_t bufAddr) {
  489. if (desc) {
  490. desc->bufAddr = GLB_ConvertToMappingFromAddr(bufAddr);;
  491. }
  492. }
  493. uint32_t ETH_GetTxDescBufAddr(ETH_TX_DESC *desc) {
  494. return (desc ? GLB_ConvertToMappingToAddr(desc->bufAddr) : 0);
  495. }
  496. BOOL ETH_SetRxDescRing(ETH_RX_DESC *ring) {
  497. ETH_RX_DESC *buf = ring;
  498. if (!ring) {
  499. return FALSE;
  500. }
  501. if (ETH->OPERATION_b.SR) {
  502. return FALSE;
  503. }
  504. /* If code mapping */
  505. ring = (ETH_RX_DESC *)GLB_ConvertToMappingFromAddr((uint32_t)ring);
  506. buf = ring;
  507. do {
  508. INNER_ETH_RX_DESC *desc = (INNER_ETH_RX_DESC *)buf;
  509. desc->RX_1.RX1_b.RCH = TRUE;
  510. desc->RX_1.RX1_b.DIC = FALSE;
  511. desc->RX_0.RX0_b.OWN = ETH_DESC_OWN_BY_HW;
  512. buf->bufAddr = GLB_ConvertToMappingFromAddr(buf->bufAddr);
  513. buf->nextDescAddr = GLB_ConvertToMappingFromAddr(buf->nextDescAddr);
  514. buf = (ETH_RX_DESC *)buf->nextDescAddr;
  515. } while (buf != ring);
  516. ETH->RDESLA = (uint32_t)ring;
  517. return TRUE;
  518. }
  519. void ETH_StartRx() {
  520. ETH->OPERATION_b.SR = TRUE;
  521. }
  522. void ETH_StopRx() {
  523. ETH->OPERATION_b.SR = FALSE;
  524. }
  525. void ETH_ResumeRx() {
  526. ETH->RPD = 0;
  527. }
  528. ETH_RX_DESC *ETH_AcquireFreeRxDesc(void) {
  529. uint32_t cur = ETH->CURRDESAPTR;
  530. INNER_ETH_RX_DESC *desc = (INNER_ETH_RX_DESC *)cur;
  531. do {
  532. if (desc->RX_0.RX0_b.OWN == ETH_DESC_OWN_BY_SELF) {
  533. return (ETH_RX_DESC *)desc;
  534. }
  535. desc = (INNER_ETH_RX_DESC *)desc->nextDescAddr;
  536. } while ((uint32_t)desc != cur);
  537. return 0;
  538. }
  539. BOOL ETH_IsFreeRxDesc(ETH_RX_DESC *desc) {
  540. INNER_ETH_RX_DESC *inner;
  541. if (!desc) {
  542. return FALSE;
  543. }
  544. inner = (INNER_ETH_RX_DESC *)desc;
  545. return (inner->RX_0.RX0_b.OWN == ETH_DESC_OWN_BY_SELF) ? TRUE : FALSE;
  546. }
  547. void ETH_ReleaseRxDesc(ETH_RX_DESC *desc) {
  548. INNER_ETH_RX_DESC *inner;
  549. if (!desc) {
  550. return;
  551. }
  552. inner = (INNER_ETH_RX_DESC *)desc;
  553. inner->RX_0.RX0_b.OWN = ETH_DESC_OWN_BY_HW;
  554. }
  555. void ETH_SetRxDescBufAddr(ETH_RX_DESC *desc, uint32_t bufAddr) {
  556. if (desc) {
  557. desc->bufAddr = GLB_ConvertToMappingFromAddr(bufAddr);;
  558. }
  559. }
  560. uint32_t ETH_GetRxDescBufAddr(ETH_RX_DESC *desc) {
  561. return (desc ? GLB_ConvertToMappingToAddr(desc->bufAddr) : 0);
  562. }