Update cmem7_eth.c
This commit is contained in:
parent
2313424f81
commit
bd59276640
|
@ -5,8 +5,8 @@
|
||||||
* @brief CMEM7 ethernet source file
|
* @brief CMEM7 ethernet source file
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @version V1.0
|
* @version V2.0
|
||||||
* @date 3. September 2013
|
* @date 3. September 2014
|
||||||
*
|
*
|
||||||
* @note
|
* @note
|
||||||
*
|
*
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cmem7_eth.h"
|
#include "cmem7_eth.h"
|
||||||
|
#include "cmem7_misc.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
union {
|
union {
|
||||||
|
@ -49,7 +49,7 @@ typedef struct {
|
||||||
uint32_t TCH : 1; /*!< Second Address Chained */
|
uint32_t TCH : 1; /*!< Second Address Chained */
|
||||||
uint32_t : 4;
|
uint32_t : 4;
|
||||||
uint32_t TTSE : 1; /*!< enables IEEE1588 hardware timestamping in first segment */
|
uint32_t TTSE : 1; /*!< enables IEEE1588 hardware timestamping in first segment */
|
||||||
uint32_t : 2;
|
uint32_t : 2;
|
||||||
uint32_t FS : 1; /*!< first segment flag */
|
uint32_t FS : 1; /*!< first segment flag */
|
||||||
uint32_t LS : 1; /*!< last segment flag */
|
uint32_t LS : 1; /*!< last segment flag */
|
||||||
uint32_t IC : 1; /*!< Interrupt on Completion */
|
uint32_t IC : 1; /*!< Interrupt on Completion */
|
||||||
|
@ -190,8 +190,9 @@ static void mac_SetConfig(ETH_InitTypeDef *init) {
|
||||||
ETH->CONFIG_b.IPC = init->ETH_ChecksumOffload;
|
ETH->CONFIG_b.IPC = init->ETH_ChecksumOffload;
|
||||||
ETH->CONFIG_b.DM = init->ETH_Duplex;
|
ETH->CONFIG_b.DM = init->ETH_Duplex;
|
||||||
ETH->CONFIG_b.LM = FALSE;
|
ETH->CONFIG_b.LM = FALSE;
|
||||||
ETH->MMC_RX_MASK = 0xFFFFFFFF;
|
ETH->MMCRIMR = 0xFFFFFFFF;
|
||||||
ETH->MMC_TX_MASK = 0xFFFFFFFF;
|
ETH->MMCTIMR = 0xFFFFFFFF;
|
||||||
|
ETH->MMCIRCOIM = 0xFFFFFFFF;
|
||||||
|
|
||||||
if (init->ETH_Speed == ETH_SPEED_10M) {
|
if (init->ETH_Speed == ETH_SPEED_10M) {
|
||||||
ETH->CONFIG_b.FES = ETH_EXACT_SPEED_10M_BPS;
|
ETH->CONFIG_b.FES = ETH_EXACT_SPEED_10M_BPS;
|
||||||
|
@ -209,7 +210,7 @@ static void mac_SetConfig(ETH_InitTypeDef *init) {
|
||||||
ETH->CONFIG_b.JD = TRUE;
|
ETH->CONFIG_b.JD = TRUE;
|
||||||
ETH->CONFIG_b.WD = TRUE;
|
ETH->CONFIG_b.WD = TRUE;
|
||||||
ETH->CONFIG_b.TC = FALSE;
|
ETH->CONFIG_b.TC = FALSE;
|
||||||
ETH->CONFIG_b.CST = FALSE;
|
ETH->CONFIG_b.CST = TRUE;
|
||||||
ETH->CONFIG_b.TWOKPE = FALSE;
|
ETH->CONFIG_b.TWOKPE = FALSE;
|
||||||
ETH->CONFIG_b.SARC = ETH_SOURCE_ADDR_REPLACE;
|
ETH->CONFIG_b.SARC = ETH_SOURCE_ADDR_REPLACE;
|
||||||
}
|
}
|
||||||
|
@ -318,7 +319,7 @@ static void mac_SetFrameFilter(ETH_FrameFilter *filter) {
|
||||||
ETH->FF_b.VTFE = FALSE;
|
ETH->FF_b.VTFE = FALSE;
|
||||||
ETH->FF_b.IPFE = FALSE;
|
ETH->FF_b.IPFE = FALSE;
|
||||||
ETH->FF_b.DNTU = FALSE;
|
ETH->FF_b.DNTU = FALSE;
|
||||||
ETH->FF_b.RA = TRUE;
|
ETH->FF_b.RA = FALSE;//TRUE
|
||||||
|
|
||||||
// receive all
|
// receive all
|
||||||
if (!filter) {
|
if (!filter) {
|
||||||
|
@ -339,14 +340,20 @@ static void mac_SetFrameFilter(ETH_FrameFilter *filter) {
|
||||||
|
|
||||||
// SA
|
// SA
|
||||||
if (filter->ETH_SourceFilterEnable) {
|
if (filter->ETH_SourceFilterEnable) {
|
||||||
ETH->FF_b.RA = FALSE;
|
uint32_t value;
|
||||||
|
|
||||||
|
ETH->FF_b.RA = FALSE;
|
||||||
ETH->FF_b.SAF = TRUE;
|
ETH->FF_b.SAF = TRUE;
|
||||||
ETH->FF_b.SAIF = filter->ETH_SourceDrop;
|
ETH->FF_b.SAIF = filter->ETH_SourceDrop;
|
||||||
ETH->ADDR1_HIGH_b.AE = TRUE;
|
ETH->ADDR1_HIGH_b.AE = TRUE;
|
||||||
ETH->ADDR1_HIGH_b.SA = TRUE;
|
ETH->ADDR1_HIGH_b.SA = TRUE;
|
||||||
ETH->ADDR1_HIGH_b.ADDR =
|
ETH->ADDR1_HIGH_b.ADDR =
|
||||||
(filter->ETH_SourceMacAddr[5] << 8) | filter->ETH_SourceMacAddr[4];
|
(filter->ETH_SourceMacAddr[5] << 8) | filter->ETH_SourceMacAddr[4];
|
||||||
ETH->ADDR1_LOW = (filter->ETH_SourceMacAddr[3] << 24) |
|
|
||||||
|
|
||||||
|
// value = (filter->ETH_SourceMacAddr[5] << 8) | filter->ETH_SourceMacAddr[4];
|
||||||
|
// CMEM7_BFI(&(ETH->ADDR1_HIGH), value, 0, 16);
|
||||||
|
ETH->ADDR1_LOW = (filter->ETH_SourceMacAddr[3] << 24) |
|
||||||
(filter->ETH_SourceMacAddr[2] << 16) |
|
(filter->ETH_SourceMacAddr[2] << 16) |
|
||||||
(filter->ETH_SourceMacAddr[1] << 8) |
|
(filter->ETH_SourceMacAddr[1] << 8) |
|
||||||
filter->ETH_SourceMacAddr[0];
|
filter->ETH_SourceMacAddr[0];
|
||||||
|
@ -355,9 +362,9 @@ static void mac_SetFrameFilter(ETH_FrameFilter *filter) {
|
||||||
|
|
||||||
static void mac_setFlowControl(void) {
|
static void mac_setFlowControl(void) {
|
||||||
ETH->FC_b.FCB = FALSE;
|
ETH->FC_b.FCB = FALSE;
|
||||||
ETH->FC_b.TFE = TRUE;
|
ETH->FC_b.TFE = FALSE;//TRUE
|
||||||
ETH->FC_b.RFE = TRUE;
|
ETH->FC_b.RFE = FALSE;//TRUE
|
||||||
ETH->FC_b.UP = TRUE;
|
ETH->FC_b.UP = FALSE;//TRUE
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t ETH_PhyRead(uint32_t phyAddr, uint32_t phyReg) {
|
uint32_t ETH_PhyRead(uint32_t phyAddr, uint32_t phyReg) {
|
||||||
|
@ -381,27 +388,44 @@ void ETH_PhyWrite(uint32_t phyAddr, uint32_t phyReg, uint32_t data) {
|
||||||
while (ETH->GMII_ADDR_b.BUSY) ;
|
while (ETH->GMII_ADDR_b.BUSY) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ETH_StructInit(ETH_InitTypeDef* init)
|
||||||
|
{
|
||||||
|
init->ETH_Speed = ETH_SPEED_10M;
|
||||||
|
init->ETH_Duplex = ETH_DUPLEX_FULL;
|
||||||
|
init->ETH_JumboFrame = FALSE;
|
||||||
|
init->ETH_LinkUp = FALSE;
|
||||||
|
init->ETH_RxEn = TRUE;
|
||||||
|
init->ETH_TxEn = TRUE;
|
||||||
|
init->ETH_ChecksumOffload = FALSE;
|
||||||
|
init->ETH_Filter = 0;
|
||||||
|
init->ETH_MacAddr[0] = 0;
|
||||||
|
init->ETH_MacAddr[1] = 0;
|
||||||
|
init->ETH_MacAddr[2] = 0;
|
||||||
|
init->ETH_MacAddr[3] = 0;
|
||||||
|
init->ETH_MacAddr[4] = 0;
|
||||||
|
init->ETH_MacAddr[5] = 0;
|
||||||
|
|
||||||
|
}
|
||||||
BOOL ETH_Init(ETH_InitTypeDef *init) {
|
BOOL ETH_Init(ETH_InitTypeDef *init) {
|
||||||
assert_param(init);
|
assert_param(init);
|
||||||
assert_param(IS_ETH_SPEED(init->ETH_Speed));
|
assert_param(IS_ETH_SPEED(init->ETH_Speed));
|
||||||
assert_param(IS_ETH_DUPLEX(init->ETH_Duplex));
|
assert_param(IS_ETH_DUPLEX(init->ETH_Duplex));
|
||||||
|
|
||||||
mac_SwReset();
|
mac_SwReset();
|
||||||
mac_SetConfig(init);
|
mac_SetConfig(init);
|
||||||
mac_SetMacAddr(init->ETH_MacAddr);
|
mac_SetMacAddr(init->ETH_MacAddr);
|
||||||
|
|
||||||
mac_SetBurst(ETH_BURST_MODE_MIXED, 3, 4);
|
mac_SetBurst(ETH_BURST_MODE_MIXED, 3, 4);
|
||||||
mac_SetPriority(TRUE, 0);
|
mac_SetPriority(TRUE, 0);
|
||||||
mac_SetDescMode(TRUE, 0);
|
mac_SetDescMode(TRUE, 0);
|
||||||
mac_SetOpertionMode();
|
mac_SetOpertionMode();
|
||||||
mac_SetFrameFilter(init->ETH_Filter);
|
mac_SetFrameFilter(init->ETH_Filter);
|
||||||
mac_setFlowControl();
|
mac_setFlowControl();
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ETH_EnableInt(uint32_t Int, BOOL enable) {
|
void ETH_ITConfig(uint32_t Int, BOOL enable) {
|
||||||
assert_param(IS_ETH_INT(Int));
|
assert_param(IS_ETH_INT(Int));
|
||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
|
@ -426,7 +450,7 @@ void ETH_EnableInt(uint32_t Int, BOOL enable) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BOOL ETH_GetIntStatus(uint32_t Int) {
|
BOOL ETH_GetITStatus(uint32_t Int) {
|
||||||
assert_param(IS_ETH_INT(Int));
|
assert_param(IS_ETH_INT(Int));
|
||||||
|
|
||||||
Int &= ETH->INT_EN;
|
Int &= ETH->INT_EN;
|
||||||
|
@ -436,8 +460,7 @@ BOOL ETH_GetIntStatus(uint32_t Int) {
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
void ETH_ClearITPendingBit(uint32_t Int) {
|
||||||
void ETH_ClearInt(uint32_t Int) {
|
|
||||||
uint32_t sta;
|
uint32_t sta;
|
||||||
assert_param(IS_ETH_INT(Int));
|
assert_param(IS_ETH_INT(Int));
|
||||||
|
|
||||||
|
@ -450,15 +473,15 @@ void ETH_ClearInt(uint32_t Int) {
|
||||||
|
|
||||||
if (IS_ETH_INT_NORMAL(Int)) {
|
if (IS_ETH_INT_NORMAL(Int)) {
|
||||||
if (!IS_ETH_INT_NORMAL(sta)) {
|
if (!IS_ETH_INT_NORMAL(sta)) {
|
||||||
// write 1 clear
|
// write 1 clear NIS
|
||||||
ETH->STATUS_b.NIS = 1;
|
ETH->STATUS = ETH_INT_NORMAL_SUMMARY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_ETH_INT_ABNORMAL(Int)) {
|
if (IS_ETH_INT_ABNORMAL(Int)) {
|
||||||
if (!IS_ETH_INT_ABNORMAL(sta)) {
|
if (!IS_ETH_INT_ABNORMAL(sta)) {
|
||||||
// write 1 clear
|
// write 1 clear AIS
|
||||||
ETH->STATUS_b.AIS = 1;
|
ETH->STATUS = ETH_INT_ABNORMAL_SUMMARY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -491,12 +514,25 @@ BOOL ETH_SetTxDescRing(ETH_TX_DESC *ring) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If code mapping */
|
||||||
|
ring = (ETH_TX_DESC *)GLB_ConvertToMappingFromAddr((uint32_t)ring);
|
||||||
|
buf = ring;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
INNER_ETH_TX_DESC *desc = (INNER_ETH_TX_DESC *)buf;
|
INNER_ETH_TX_DESC *desc = (INNER_ETH_TX_DESC *)buf;
|
||||||
|
uint8_t first = desc->TX_0.TX0_b.FS;
|
||||||
|
uint8_t last = desc->TX_0.TX0_b.LS;
|
||||||
|
|
||||||
|
// clear all bits
|
||||||
|
desc->TX_0.TX0 = 0;
|
||||||
|
desc->TX_0.TX0_b.FS = first;
|
||||||
|
desc->TX_0.TX0_b.LS = last;
|
||||||
desc->TX_0.TX0_b.TCH = TRUE;
|
desc->TX_0.TX0_b.TCH = TRUE;
|
||||||
desc->TX_0.TX0_b.IC = TRUE;
|
desc->TX_0.TX0_b.IC = TRUE;
|
||||||
desc->TX_0.TX0_b.OWN = ETH_DESC_OWN_BY_SELF;
|
desc->TX_0.TX0_b.OWN = ETH_DESC_OWN_BY_SELF;
|
||||||
|
|
||||||
|
buf->bufAddr = GLB_ConvertToMappingFromAddr(buf->bufAddr);
|
||||||
|
buf->nextDescAddr = GLB_ConvertToMappingFromAddr(buf->nextDescAddr);
|
||||||
buf = (ETH_TX_DESC *)buf->nextDescAddr;
|
buf = (ETH_TX_DESC *)buf->nextDescAddr;
|
||||||
} while (buf != ring);
|
} while (buf != ring);
|
||||||
|
|
||||||
|
@ -553,6 +589,16 @@ void ETH_ReleaseTxDesc(ETH_TX_DESC *desc) {
|
||||||
inner->TX_0.TX0_b.OWN = ETH_DESC_OWN_BY_HW;
|
inner->TX_0.TX0_b.OWN = ETH_DESC_OWN_BY_HW;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ETH_SetTxDescBufAddr(ETH_TX_DESC *desc, uint32_t bufAddr) {
|
||||||
|
if (desc) {
|
||||||
|
desc->bufAddr = GLB_ConvertToMappingFromAddr(bufAddr);;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t ETH_GetTxDescBufAddr(ETH_TX_DESC *desc) {
|
||||||
|
return (desc ? GLB_ConvertToMappingToAddr(desc->bufAddr) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
BOOL ETH_SetRxDescRing(ETH_RX_DESC *ring) {
|
BOOL ETH_SetRxDescRing(ETH_RX_DESC *ring) {
|
||||||
ETH_RX_DESC *buf = ring;
|
ETH_RX_DESC *buf = ring;
|
||||||
|
|
||||||
|
@ -564,12 +610,17 @@ BOOL ETH_SetRxDescRing(ETH_RX_DESC *ring) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If code mapping */
|
||||||
|
ring = (ETH_RX_DESC *)GLB_ConvertToMappingFromAddr((uint32_t)ring);
|
||||||
|
buf = ring;
|
||||||
do {
|
do {
|
||||||
INNER_ETH_RX_DESC *desc = (INNER_ETH_RX_DESC *)buf;
|
INNER_ETH_RX_DESC *desc = (INNER_ETH_RX_DESC *)buf;
|
||||||
desc->RX_1.RX1_b.RCH = TRUE;
|
desc->RX_1.RX1_b.RCH = TRUE;
|
||||||
desc->RX_1.RX1_b.DIC = FALSE;
|
desc->RX_1.RX1_b.DIC = FALSE;
|
||||||
desc->RX_0.RX0_b.OWN = ETH_DESC_OWN_BY_HW;
|
desc->RX_0.RX0_b.OWN = ETH_DESC_OWN_BY_HW;
|
||||||
|
|
||||||
|
buf->bufAddr = GLB_ConvertToMappingFromAddr(buf->bufAddr);
|
||||||
|
buf->nextDescAddr = GLB_ConvertToMappingFromAddr(buf->nextDescAddr);
|
||||||
buf = (ETH_RX_DESC *)buf->nextDescAddr;
|
buf = (ETH_RX_DESC *)buf->nextDescAddr;
|
||||||
} while (buf != ring);
|
} while (buf != ring);
|
||||||
|
|
||||||
|
@ -627,3 +678,15 @@ void ETH_ReleaseRxDesc(ETH_RX_DESC *desc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ETH_SetRxDescBufAddr(ETH_RX_DESC *desc, uint32_t bufAddr) {
|
||||||
|
if (desc) {
|
||||||
|
desc->bufAddr = GLB_ConvertToMappingFromAddr(bufAddr);;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t ETH_GetRxDescBufAddr(ETH_RX_DESC *desc) {
|
||||||
|
return (desc ? GLB_ConvertToMappingToAddr(desc->bufAddr) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue