1 | uint32_t ETH_HandleTxPkt(uint8_t *ppkt, uint16_t FrameLength)
|
2 | {
|
3 | uint32_t offset = 0;
|
4 |
|
5 | /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
|
6 | if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET)
|
7 | {
|
8 | /* Return ERROR: OWN bit set */
|
9 | return ETH_ERROR;
|
10 | }
|
11 |
|
12 | /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */
|
13 | for(offset=0; offset<FrameLength; offset++)
|
14 | {
|
15 | (*(__IO uint8_t *)((DMATxDescToSet->Buffer1Addr) + offset)) = (*(ppkt + offset));
|
16 | }
|
17 |
|
18 | /* Setting the Frame Length: bits[12:0] */
|
19 | DMATxDescToSet->ControlBufferSize = (FrameLength & ETH_DMATxDesc_TBS1);
|
20 | /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */
|
21 | DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS;
|
22 | /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
|
23 | DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
|
24 | /* When Tx Buffer unavailable flag is set: clear it and resume transmission */
|
25 | if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET)
|
26 | {
|
27 | /* Clear TBUS ETHERNET DMA flag */
|
28 | ETH->DMASR = ETH_DMASR_TBUS;
|
29 | /* Resume DMA transmission*/
|
30 | ETH->DMATPDR = 0;
|
31 | }
|
32 |
|
33 | /* Update the ETHERNET DMA global Tx descriptor with next Tx decriptor */
|
34 | /* Chained Mode */
|
35 | if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET)
|
36 | {
|
37 | /* Selects the next DMA Tx descriptor list for next buffer to send */
|
38 | DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMATxDescToSet->Buffer2NextDescAddr);
|
39 | }
|
40 | else /* Ring Mode */
|
41 | {
|
42 | if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET)
|
43 | {
|
44 | /* Selects the first DMA Tx descriptor for next buffer to send: last Tx descriptor was used */
|
45 | DMATxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR);
|
46 | }
|
47 | else
|
48 | {
|
49 | /* Selects the next DMA Tx descriptor list for next buffer to send */
|
50 | DMATxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2));
|
51 | }
|
52 | }
|
53 | /* Return SUCCESS */
|
54 | return ETH_SUCCESS;
|
55 | }
|