run auto-formatter
This commit is contained in:
@ -9,8 +9,10 @@
|
||||
#include "ethernetif.h"
|
||||
#include "udp_config.h"
|
||||
|
||||
TmTcLwIpUdpBridge::TmTcLwIpUdpBridge(object_id_t objectId, object_id_t ccsdsPacketDistributor,
|
||||
object_id_t tmStoreId, object_id_t tcStoreId)
|
||||
TmTcLwIpUdpBridge::TmTcLwIpUdpBridge(object_id_t objectId,
|
||||
object_id_t ccsdsPacketDistributor,
|
||||
object_id_t tmStoreId,
|
||||
object_id_t tcStoreId)
|
||||
: TmTcBridge(objectId, ccsdsPacketDistributor, tmStoreId, tcStoreId) {
|
||||
TmTcLwIpUdpBridge::lastAdd.addr = IPADDR_TYPE_ANY;
|
||||
}
|
||||
@ -38,7 +40,8 @@ ReturnValue_t TmTcLwIpUdpBridge::udp_server_init(void) {
|
||||
|
||||
if (err == ERR_OK) {
|
||||
/* Set a receive callback for the upcb */
|
||||
udp_recv(TmTcLwIpUdpBridge::upcb, &udp_server_receive_callback, (void*)this);
|
||||
udp_recv(TmTcLwIpUdpBridge::upcb, &udp_server_receive_callback,
|
||||
(void *)this);
|
||||
return RETURN_OK;
|
||||
} else {
|
||||
udp_remove(TmTcLwIpUdpBridge::upcb);
|
||||
@ -54,20 +57,22 @@ ReturnValue_t TmTcLwIpUdpBridge::performOperation(uint8_t operationCode) {
|
||||
|
||||
#if TCPIP_RECV_WIRETAPPING == 1
|
||||
if (connectFlag) {
|
||||
uint32_t ipAddress = ((ip4_addr*)&lastAdd)->addr;
|
||||
uint32_t ipAddress = ((ip4_addr *)&lastAdd)->addr;
|
||||
int ipAddress1 = (ipAddress & 0xFF000000) >> 24;
|
||||
int ipAddress2 = (ipAddress & 0xFF0000) >> 16;
|
||||
int ipAddress3 = (ipAddress & 0xFF00) >> 8;
|
||||
int ipAddress4 = ipAddress & 0xFF;
|
||||
#if OBSW_VERBOSE_LEVEL == 1
|
||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||
sif::info << "TmTcLwIpUdpBridge: Client IP Address " << std::dec << ipAddress4 << "."
|
||||
<< ipAddress3 << "." << ipAddress2 << "." << ipAddress1 << std::endl;
|
||||
sif::info << "TmTcLwIpUdpBridge: Client IP Address " << std::dec
|
||||
<< ipAddress4 << "." << ipAddress3 << "." << ipAddress2 << "."
|
||||
<< ipAddress1 << std::endl;
|
||||
uint16_t portSwapped = EndianConverter::convertBigEndian(lastPort);
|
||||
sif::info << "TmTcLwIpUdpBridge: Client IP Port " << (int)portSwapped << std::endl;
|
||||
sif::info << "TmTcLwIpUdpBridge: Client IP Port " << (int)portSwapped
|
||||
<< std::endl;
|
||||
#else
|
||||
sif::printInfo("TmTcLwIpUdpBridge: Client IP Address %d.%d.%d.%d\n", ipAddress4, ipAddress3,
|
||||
ipAddress2, ipAddress1);
|
||||
sif::printInfo("TmTcLwIpUdpBridge: Client IP Address %d.%d.%d.%d\n",
|
||||
ipAddress4, ipAddress3, ipAddress2, ipAddress1);
|
||||
uint16_t portSwapped = EndianConverter::convertBigEndian(lastPort);
|
||||
sif::printInfo("TmTcLwIpUdpBridge: Client IP Port: %d\n", portSwapped);
|
||||
#endif
|
||||
@ -79,11 +84,12 @@ ReturnValue_t TmTcLwIpUdpBridge::performOperation(uint8_t operationCode) {
|
||||
return RETURN_OK;
|
||||
}
|
||||
|
||||
ReturnValue_t TmTcLwIpUdpBridge::sendTm(const uint8_t* data, size_t dataLen) {
|
||||
struct pbuf* p_tx = pbuf_alloc(PBUF_TRANSPORT, dataLen, PBUF_RAM);
|
||||
if ((p_tx != nullptr) && (lastAdd.addr != IPADDR_TYPE_ANY) && (upcb != nullptr)) {
|
||||
ReturnValue_t TmTcLwIpUdpBridge::sendTm(const uint8_t *data, size_t dataLen) {
|
||||
struct pbuf *p_tx = pbuf_alloc(PBUF_TRANSPORT, dataLen, PBUF_RAM);
|
||||
if ((p_tx != nullptr) && (lastAdd.addr != IPADDR_TYPE_ANY) &&
|
||||
(upcb != nullptr)) {
|
||||
/* copy data to pbuf */
|
||||
err_t err = pbuf_take(p_tx, (char*)data, dataLen);
|
||||
err_t err = pbuf_take(p_tx, (char *)data, dataLen);
|
||||
if (err != ERR_OK) {
|
||||
pbuf_free(p_tx);
|
||||
return err;
|
||||
@ -109,17 +115,21 @@ ReturnValue_t TmTcLwIpUdpBridge::sendTm(const uint8_t* data, size_t dataLen) {
|
||||
return RETURN_OK;
|
||||
}
|
||||
|
||||
void TmTcLwIpUdpBridge::udp_server_receive_callback(void* arg, struct udp_pcb* upcb_,
|
||||
struct pbuf* p, const ip_addr_t* addr,
|
||||
void TmTcLwIpUdpBridge::udp_server_receive_callback(void *arg,
|
||||
struct udp_pcb *upcb_,
|
||||
struct pbuf *p,
|
||||
const ip_addr_t *addr,
|
||||
u16_t port) {
|
||||
struct pbuf* p_tx = nullptr;
|
||||
auto udpBridge = reinterpret_cast<TmTcLwIpUdpBridge*>(arg);
|
||||
struct pbuf *p_tx = nullptr;
|
||||
auto udpBridge = reinterpret_cast<TmTcLwIpUdpBridge *>(arg);
|
||||
if (udpBridge == nullptr) {
|
||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||
sif::warning << "TmTcLwIpUdpBridge::udp_server_receive_callback: Invalid UDP bridge!"
|
||||
<< std::endl;
|
||||
sif::warning
|
||||
<< "TmTcLwIpUdpBridge::udp_server_receive_callback: Invalid UDP bridge!"
|
||||
<< std::endl;
|
||||
#else
|
||||
sif::printWarning("TmTcLwIpUdpBridge::udp_server_receive_callback: Invalid UDP bridge!\n");
|
||||
sif::printWarning("TmTcLwIpUdpBridge::udp_server_receive_callback: Invalid "
|
||||
"UDP bridge!\n");
|
||||
#endif
|
||||
}
|
||||
/* allocate pbuf from RAM*/
|
||||
@ -140,9 +150,9 @@ void TmTcLwIpUdpBridge::udp_server_receive_callback(void* arg, struct udp_pcb* u
|
||||
udpBridge->physicalConnectStatusChange(true);
|
||||
}
|
||||
}
|
||||
pbuf_take(p_tx, (char*)p->payload, p->len);
|
||||
pbuf_take(p_tx, (char *)p->payload, p->len);
|
||||
/* send the received data to the uart port */
|
||||
char* data = reinterpret_cast<char*>(p_tx->payload);
|
||||
char *data = reinterpret_cast<char *>(p_tx->payload);
|
||||
*(data + p_tx->len) = '\0';
|
||||
|
||||
#if TCPIP_RECV_WIRETAPPING == 1
|
||||
@ -150,8 +160,8 @@ void TmTcLwIpUdpBridge::udp_server_receive_callback(void* arg, struct udp_pcb* u
|
||||
#endif
|
||||
|
||||
store_address_t storeId;
|
||||
ReturnValue_t returnValue =
|
||||
udpBridge->tcStore->addData(&storeId, reinterpret_cast<uint8_t*>(p->payload), p->len);
|
||||
ReturnValue_t returnValue = udpBridge->tcStore->addData(
|
||||
&storeId, reinterpret_cast<uint8_t *>(p->payload), p->len);
|
||||
if (returnValue != RETURN_OK) {
|
||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||
sif::warning << "UDP Server: Data storage failed" << std::endl;
|
||||
@ -178,8 +188,8 @@ bool TmTcLwIpUdpBridge::comLinkUp() const { return communicationLinkUp; }
|
||||
/* Caller must ensure thread-safety */
|
||||
void TmTcLwIpUdpBridge::physicalConnectStatusChange(bool connect) {
|
||||
if (connect) {
|
||||
/* Physical connection does not mean there is a recipient to send packets too.
|
||||
This will be done by the receive callback! */
|
||||
/* Physical connection does not mean there is a recipient to send packets
|
||||
too. This will be done by the receive callback! */
|
||||
physicalConnection = true;
|
||||
} else {
|
||||
physicalConnection = false;
|
||||
|
@ -8,14 +8,15 @@
|
||||
#define TCPIP_RECV_WIRETAPPING 0
|
||||
|
||||
/**
|
||||
* This bridge is used to forward TMTC packets received via LwIP UDP to the internal software bus.
|
||||
* This bridge is used to forward TMTC packets received via LwIP UDP to the
|
||||
* internal software bus.
|
||||
*/
|
||||
class TmTcLwIpUdpBridge : public TmTcBridge {
|
||||
friend class UdpTcLwIpPollingTask;
|
||||
|
||||
public:
|
||||
TmTcLwIpUdpBridge(object_id_t objectId, object_id_t ccsdsPacketDistributor, object_id_t tmStoreId,
|
||||
object_id_t tcStoreId);
|
||||
public:
|
||||
TmTcLwIpUdpBridge(object_id_t objectId, object_id_t ccsdsPacketDistributor,
|
||||
object_id_t tmStoreId, object_id_t tcStoreId);
|
||||
virtual ~TmTcLwIpUdpBridge();
|
||||
|
||||
virtual ReturnValue_t initialize() override;
|
||||
@ -44,8 +45,9 @@ class TmTcLwIpUdpBridge : public TmTcBridge {
|
||||
* @param addr Source address which will be bound to TmTcUdpBridge::lastAdd
|
||||
* @param port
|
||||
*/
|
||||
static void udp_server_receive_callback(void *arg, struct udp_pcb *upcb_, struct pbuf *p,
|
||||
const ip_addr_t *addr, u16_t port);
|
||||
static void udp_server_receive_callback(void *arg, struct udp_pcb *upcb_,
|
||||
struct pbuf *p, const ip_addr_t *addr,
|
||||
u16_t port);
|
||||
|
||||
/**
|
||||
* Check whether the communication link is up.
|
||||
@ -54,7 +56,7 @@ class TmTcLwIpUdpBridge : public TmTcBridge {
|
||||
*/
|
||||
bool comLinkUp() const;
|
||||
|
||||
private:
|
||||
private:
|
||||
struct udp_pcb *upcb = nullptr;
|
||||
ip_addr_t lastAdd;
|
||||
u16_t lastPort = 0;
|
||||
@ -67,9 +69,9 @@ class TmTcLwIpUdpBridge : public TmTcBridge {
|
||||
|
||||
/**
|
||||
* Used to notify bridge about change in the physical ethernet connection.
|
||||
* Connection does not mean that replies are possible (recipient not set yet), but
|
||||
* disconnect means that we can't send anything. Caller must ensure thread-safety
|
||||
* by using the bridge lock.
|
||||
* Connection does not mean that replies are possible (recipient not set yet),
|
||||
* but disconnect means that we can't send anything. Caller must ensure
|
||||
* thread-safety by using the bridge lock.
|
||||
*/
|
||||
void physicalConnectStatusChange(bool connect);
|
||||
};
|
||||
|
@ -12,9 +12,11 @@
|
||||
#include "lwip/timeouts.h"
|
||||
#include "networking.h"
|
||||
|
||||
UdpTcLwIpPollingTask::UdpTcLwIpPollingTask(object_id_t objectId, object_id_t bridgeId,
|
||||
struct netif* gnetif)
|
||||
: SystemObject(objectId), periodicHandleCounter(0), bridgeId(bridgeId), gnetif(gnetif) {}
|
||||
UdpTcLwIpPollingTask::UdpTcLwIpPollingTask(object_id_t objectId,
|
||||
object_id_t bridgeId,
|
||||
struct netif *gnetif)
|
||||
: SystemObject(objectId), periodicHandleCounter(0), bridgeId(bridgeId),
|
||||
gnetif(gnetif) {}
|
||||
|
||||
UdpTcLwIpPollingTask::~UdpTcLwIpPollingTask() {}
|
||||
|
||||
@ -47,7 +49,8 @@ ReturnValue_t UdpTcLwIpPollingTask::performOperation(uint8_t operationCode) {
|
||||
/* In case ethernet cable is disconnected */
|
||||
if (not networking::getEthCableConnected() and udpBridge->comLinkUp()) {
|
||||
udpBridge->physicalConnectStatusChange(false);
|
||||
} else if (networking::getEthCableConnected() and not udpBridge->comLinkUp()) {
|
||||
} else if (networking::getEthCableConnected() and
|
||||
not udpBridge->comLinkUp()) {
|
||||
udpBridge->physicalConnectStatusChange(true);
|
||||
}
|
||||
}
|
||||
|
@ -15,8 +15,9 @@ class TmTcLwIpUdpBridge;
|
||||
class UdpTcLwIpPollingTask : public SystemObject,
|
||||
public ExecutableObjectIF,
|
||||
public HasReturnvaluesIF {
|
||||
public:
|
||||
UdpTcLwIpPollingTask(object_id_t objectId, object_id_t bridgeId, struct netif* gnetif);
|
||||
public:
|
||||
UdpTcLwIpPollingTask(object_id_t objectId, object_id_t bridgeId,
|
||||
struct netif *gnetif);
|
||||
virtual ~UdpTcLwIpPollingTask();
|
||||
|
||||
virtual ReturnValue_t initialize() override;
|
||||
@ -28,12 +29,12 @@ class UdpTcLwIpPollingTask : public SystemObject,
|
||||
*/
|
||||
virtual ReturnValue_t performOperation(uint8_t operationCode = 0) override;
|
||||
|
||||
private:
|
||||
private:
|
||||
static const uint8_t PERIODIC_HANDLE_TRIGGER = 5;
|
||||
uint8_t periodicHandleCounter;
|
||||
object_id_t bridgeId = 0;
|
||||
TmTcLwIpUdpBridge* udpBridge = nullptr;
|
||||
struct netif* gnetif = nullptr;
|
||||
TmTcLwIpUdpBridge *udpBridge = nullptr;
|
||||
struct netif *gnetif = nullptr;
|
||||
};
|
||||
|
||||
#endif /* BSP_STM32_RTEMS_EMACPOLLINGTASK_H_ */
|
||||
|
@ -13,39 +13,39 @@
|
||||
uint8_t DHCP_state = DHCP_OFF;
|
||||
uint32_t DHCPfineTimer = 0;
|
||||
|
||||
void handle_dhcp_timeout(struct netif* netif);
|
||||
void handle_dhcp_start(struct netif* netif);
|
||||
void handle_dhcp_wait(struct netif* netif, struct dhcp** dhcp);
|
||||
void handle_dhcp_down(struct netif* netif);
|
||||
void handle_dhcp_timeout(struct netif *netif);
|
||||
void handle_dhcp_start(struct netif *netif);
|
||||
void handle_dhcp_wait(struct netif *netif, struct dhcp **dhcp);
|
||||
void handle_dhcp_down(struct netif *netif);
|
||||
|
||||
/**
|
||||
* @brief DHCP_Process_Handle
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void DHCP_Process(struct netif* netif) {
|
||||
struct dhcp* dhcp = NULL;
|
||||
void DHCP_Process(struct netif *netif) {
|
||||
struct dhcp *dhcp = NULL;
|
||||
switch (DHCP_state) {
|
||||
case DHCP_START: {
|
||||
handle_dhcp_start(netif);
|
||||
break;
|
||||
}
|
||||
case DHCP_WAIT_ADDRESS: {
|
||||
handle_dhcp_wait(netif, &dhcp);
|
||||
break;
|
||||
}
|
||||
case DHCP_START: {
|
||||
handle_dhcp_start(netif);
|
||||
break;
|
||||
}
|
||||
case DHCP_WAIT_ADDRESS: {
|
||||
handle_dhcp_wait(netif, &dhcp);
|
||||
break;
|
||||
}
|
||||
|
||||
case DHCP_LINK_DOWN: {
|
||||
handle_dhcp_down(netif);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
case DHCP_LINK_DOWN: {
|
||||
handle_dhcp_down(netif);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void handle_dhcp_timeout(struct netif* netif) {
|
||||
void handle_dhcp_timeout(struct netif *netif) {
|
||||
ip_addr_t ipaddr;
|
||||
ip_addr_t netmask;
|
||||
ip_addr_t gw;
|
||||
@ -61,11 +61,11 @@ void handle_dhcp_timeout(struct netif* netif) {
|
||||
|
||||
printf("DHCP Timeout\n\r");
|
||||
uint8_t iptxt[20];
|
||||
sprintf((char*)iptxt, "%s", ip4addr_ntoa(netif_ip4_addr(netif)));
|
||||
sprintf((char *)iptxt, "%s", ip4addr_ntoa(netif_ip4_addr(netif)));
|
||||
printf("Assigning static IP address: %s\n", iptxt);
|
||||
|
||||
#if defined FSFW_OSAL_FREERTOS
|
||||
ETH_HandleTypeDef* handle = getEthernetHandle();
|
||||
ETH_HandleTypeDef *handle = getEthernetHandle();
|
||||
handle->gState = HAL_ETH_STATE_READY;
|
||||
#endif
|
||||
|
||||
@ -82,7 +82,7 @@ void handle_dhcp_timeout(struct netif* netif) {
|
||||
* @param netif
|
||||
* @retval None
|
||||
*/
|
||||
void DHCP_Periodic_Handle(struct netif* netif) {
|
||||
void DHCP_Periodic_Handle(struct netif *netif) {
|
||||
/* Fine DHCP periodic process every 500ms */
|
||||
if (HAL_GetTick() - DHCPfineTimer >= DHCP_FINE_TIMER_MSECS) {
|
||||
DHCPfineTimer = HAL_GetTick();
|
||||
@ -91,7 +91,7 @@ void DHCP_Periodic_Handle(struct netif* netif) {
|
||||
}
|
||||
}
|
||||
|
||||
void handle_dhcp_start(struct netif* netif) {
|
||||
void handle_dhcp_start(struct netif *netif) {
|
||||
printf("handle_dhcp_start: Looking for DHCP server ...\n\r");
|
||||
#if OBSW_ETHERNET_TMTC_COMMANDING == 1
|
||||
#if OBSW_ETHERNET_USE_LED1_LED2 == 1
|
||||
@ -106,10 +106,11 @@ void handle_dhcp_start(struct netif* netif) {
|
||||
DHCP_state = DHCP_WAIT_ADDRESS;
|
||||
}
|
||||
|
||||
void handle_dhcp_wait(struct netif* netif, struct dhcp** dhcp) {
|
||||
void handle_dhcp_wait(struct netif *netif, struct dhcp **dhcp) {
|
||||
if (dhcp_supplied_address(netif)) {
|
||||
DHCP_state = DHCP_ADDRESS_ASSIGNED;
|
||||
printf("IP address assigned by a DHCP server: %s\n\r", ip4addr_ntoa(netif_ip4_addr(netif)));
|
||||
printf("IP address assigned by a DHCP server: %s\n\r",
|
||||
ip4addr_ntoa(netif_ip4_addr(netif)));
|
||||
printf("Listener port: %d\n\r", UDP_SERVER_PORT);
|
||||
#if OBSW_ETHERNET_TMTC_COMMANDING == 1
|
||||
#if OBSW_ETHERNET_USE_LED1_LED2 == 1
|
||||
@ -118,7 +119,8 @@ void handle_dhcp_wait(struct netif* netif, struct dhcp** dhcp) {
|
||||
#endif
|
||||
#endif
|
||||
} else {
|
||||
*dhcp = (struct dhcp*)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP);
|
||||
*dhcp = (struct dhcp *)netif_get_client_data(
|
||||
netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP);
|
||||
|
||||
/* DHCP timeout */
|
||||
if ((*dhcp)->tries > MAX_DHCP_TRIES) {
|
||||
@ -127,7 +129,7 @@ void handle_dhcp_wait(struct netif* netif, struct dhcp** dhcp) {
|
||||
}
|
||||
}
|
||||
|
||||
void handle_dhcp_down(struct netif* netif) {
|
||||
void handle_dhcp_down(struct netif *netif) {
|
||||
DHCP_state = DHCP_OFF;
|
||||
#if OBSW_ETHERNET_TMTC_COMMANDING == 1
|
||||
printf("DHCP_Process: The network cable is not connected.\n\r");
|
||||
|
@ -21,7 +21,7 @@
|
||||
uint32_t ethernetLinkTimer = 0;
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
void handle_status_change(struct netif* netif, bool link_up);
|
||||
void handle_status_change(struct netif *netif, bool link_up);
|
||||
|
||||
/* Private functions ---------------------------------------------------------*/
|
||||
/**
|
||||
@ -29,7 +29,7 @@ void handle_status_change(struct netif* netif, bool link_up);
|
||||
* @param netif: the network interface
|
||||
* @retval None
|
||||
*/
|
||||
void networking::ethernetLinkStatusUpdated(struct netif* netif) {
|
||||
void networking::ethernetLinkStatusUpdated(struct netif *netif) {
|
||||
if (netif_is_link_up(netif)) {
|
||||
networking::setEthCableConnected(true);
|
||||
handle_status_change(netif, true);
|
||||
@ -39,16 +39,16 @@ void networking::ethernetLinkStatusUpdated(struct netif* netif) {
|
||||
}
|
||||
}
|
||||
|
||||
void handle_status_change(struct netif* netif, bool link_up) {
|
||||
void handle_status_change(struct netif *netif, bool link_up) {
|
||||
if (link_up) {
|
||||
#if LWIP_DHCP
|
||||
/* Update DHCP state machine */
|
||||
set_dhcp_state(DHCP_START);
|
||||
#else
|
||||
uint8_t iptxt[20];
|
||||
sprintf((char*)iptxt, "%s", ip4addr_ntoa(netif_ip4_addr(netif)));
|
||||
printf("\rNetwork cable connected. Static IP address: %s | Port: %d\n\r", iptxt,
|
||||
UDP_SERVER_PORT);
|
||||
sprintf((char *)iptxt, "%s", ip4addr_ntoa(netif_ip4_addr(netif)));
|
||||
printf("\rNetwork cable connected. Static IP address: %s | Port: %d\n\r",
|
||||
iptxt, UDP_SERVER_PORT);
|
||||
#if OBSW_ETHERNET_USE_LED1_LED2 == 1
|
||||
BSP_LED_On(LED1);
|
||||
BSP_LED_Off(LED2);
|
||||
@ -75,7 +75,7 @@ void handle_status_change(struct netif* netif, bool link_up) {
|
||||
* @param netif
|
||||
* @retval None
|
||||
*/
|
||||
void networking::ethernetLinkPeriodicHandle(struct netif* netif) {
|
||||
void networking::ethernetLinkPeriodicHandle(struct netif *netif) {
|
||||
/* Ethernet Link every 100ms */
|
||||
if (HAL_GetTick() - ethernetLinkTimer >= 100) {
|
||||
ethernetLinkTimer = HAL_GetTick();
|
||||
|
@ -65,7 +65,7 @@ namespace networking {
|
||||
void ethernetLinkStatusUpdated(struct netif *netif);
|
||||
void ethernetLinkPeriodicHandle(struct netif *netif);
|
||||
|
||||
} // namespace networking
|
||||
} // namespace networking
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -72,8 +72,8 @@
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
/*
|
||||
@Note: This interface is implemented to operate in zero-copy mode only:
|
||||
- Rx buffers are allocated statically and passed directly to the LwIP stack
|
||||
they will return back to DMA after been processed by the stack.
|
||||
- Rx buffers are allocated statically and passed directly to the LwIP
|
||||
stack they will return back to DMA after been processed by the stack.
|
||||
- Tx Buffers will be allocated from LwIP stack memory heap,
|
||||
then passed to ETH HAL driver.
|
||||
|
||||
@ -91,40 +91,44 @@
|
||||
#if defined(__ICCARM__) /*!< IAR Compiler */
|
||||
|
||||
#pragma location = 0x30040000
|
||||
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
|
||||
ETH_DMADescTypeDef
|
||||
DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
|
||||
#pragma location = 0x30040060
|
||||
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
|
||||
ETH_DMADescTypeDef
|
||||
DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
|
||||
#pragma location = 0x30040200
|
||||
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */
|
||||
uint8_t Rx_Buff[ETH_RX_DESC_CNT]
|
||||
[ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */
|
||||
|
||||
#elif defined(__CC_ARM) /* MDK ARM Compiler */
|
||||
|
||||
__attribute__((section(".RxDecripSection")))
|
||||
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
|
||||
__attribute__((section(".TxDecripSection")))
|
||||
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
|
||||
__attribute__((section(".RxArraySection")))
|
||||
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
|
||||
__attribute__((section(".RxDecripSection"))) ETH_DMADescTypeDef
|
||||
DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
|
||||
__attribute__((section(".TxDecripSection"))) ETH_DMADescTypeDef
|
||||
DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
|
||||
__attribute__((section(".RxArraySection"))) uint8_t
|
||||
Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
|
||||
|
||||
#elif defined(__GNUC__) /* GNU Compiler */
|
||||
|
||||
#ifdef FSFW_OSAL_RTEMS
|
||||
/* Put into special RTEMS section and align correctly */
|
||||
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]
|
||||
__attribute__((section(".bsp_nocache"),
|
||||
__aligned__(DMA_DESCRIPTOR_ALIGNMENT))); /* Ethernet Rx DMA Descriptors */
|
||||
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((
|
||||
section(".bsp_nocache"),
|
||||
__aligned__(DMA_DESCRIPTOR_ALIGNMENT))); /* Ethernet Rx DMA Descriptors */
|
||||
/* Put into special RTEMS section and align correctly */
|
||||
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]
|
||||
__attribute__((section(".bsp_nocache"),
|
||||
__aligned__(DMA_DESCRIPTOR_ALIGNMENT))); /* Ethernet Tx DMA Descriptors */
|
||||
/* Ethernet Receive Buffers. Just place somewhere is BSS instead of explicitely placing it */
|
||||
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((
|
||||
section(".bsp_nocache"),
|
||||
__aligned__(DMA_DESCRIPTOR_ALIGNMENT))); /* Ethernet Tx DMA Descriptors */
|
||||
/* Ethernet Receive Buffers. Just place somewhere is BSS instead of explicitely
|
||||
* placing it */
|
||||
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE];
|
||||
#elif defined FSFW_OSAL_FREERTOS
|
||||
/* Placement and alignment specified in linker script here */
|
||||
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]
|
||||
__attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */
|
||||
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]
|
||||
__attribute__((section(".TxDecripSection"))); /* Ethernet Tx DMA Descriptors */
|
||||
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((
|
||||
section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */
|
||||
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((
|
||||
section(".TxDecripSection"))); /* Ethernet Tx DMA Descriptors */
|
||||
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]
|
||||
__attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */
|
||||
#endif /* FSFW_FREERTOS */
|
||||
@ -148,12 +152,15 @@ void pbuf_free_custom(struct pbuf *p);
|
||||
|
||||
int32_t ETH_PHY_IO_Init(void);
|
||||
int32_t ETH_PHY_IO_DeInit(void);
|
||||
int32_t ETH_PHY_IO_ReadReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t *pRegVal);
|
||||
int32_t ETH_PHY_IO_WriteReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t RegVal);
|
||||
int32_t ETH_PHY_IO_ReadReg(uint32_t DevAddr, uint32_t RegAddr,
|
||||
uint32_t *pRegVal);
|
||||
int32_t ETH_PHY_IO_WriteReg(uint32_t DevAddr, uint32_t RegAddr,
|
||||
uint32_t RegVal);
|
||||
int32_t ETH_PHY_IO_GetTick(void);
|
||||
|
||||
lan8742_IOCtx_t LAN8742_IOCtx = {ETH_PHY_IO_Init, ETH_PHY_IO_DeInit, ETH_PHY_IO_WriteReg,
|
||||
ETH_PHY_IO_ReadReg, ETH_PHY_IO_GetTick};
|
||||
lan8742_IOCtx_t LAN8742_IOCtx = {ETH_PHY_IO_Init, ETH_PHY_IO_DeInit,
|
||||
ETH_PHY_IO_WriteReg, ETH_PHY_IO_ReadReg,
|
||||
ETH_PHY_IO_GetTick};
|
||||
/* Private functions ---------------------------------------------------------*/
|
||||
/*******************************************************************************
|
||||
LL Driver Interface ( LwIP stack --> ETH)
|
||||
@ -207,7 +214,8 @@ static void low_level_init(struct netif *netif) {
|
||||
|
||||
/* Set Tx packet config common parameters */
|
||||
memset(&TxConfig, 0, sizeof(ETH_TxPacketConfig));
|
||||
TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;
|
||||
TxConfig.Attributes =
|
||||
ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;
|
||||
TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC;
|
||||
TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT;
|
||||
|
||||
@ -221,12 +229,13 @@ static void low_level_init(struct netif *netif) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function should do the actual transmission of the packet. The packet is
|
||||
* contained in the pbuf that is passed to the function. This pbuf
|
||||
* @brief This function should do the actual transmission of the packet. The
|
||||
* packet is contained in the pbuf that is passed to the function. This pbuf
|
||||
* might be chained.
|
||||
*
|
||||
* @param netif the lwip network interface structure for this ethernetif
|
||||
* @param p the MAC packet to send (e.g. IP packet including MAC addresses and type)
|
||||
* @param p the MAC packet to send (e.g. IP packet including MAC addresses and
|
||||
* type)
|
||||
* @return ERR_OK if the packet could be sent
|
||||
* an err_t value if the packet couldn't be sent
|
||||
*
|
||||
@ -242,7 +251,8 @@ static err_t low_level_output(struct netif *netif, struct pbuf *p) {
|
||||
ETH_BufferTypeDef Txbuffer[ETH_TX_DESC_CNT];
|
||||
|
||||
for (q = p; q != NULL; q = q->next) {
|
||||
if (i >= ETH_TX_DESC_CNT) return ERR_IF;
|
||||
if (i >= ETH_TX_DESC_CNT)
|
||||
return ERR_IF;
|
||||
|
||||
Txbuffer[i].buffer = q->payload;
|
||||
Txbuffer[i].len = q->len;
|
||||
@ -265,7 +275,8 @@ static err_t low_level_output(struct netif *netif, struct pbuf *p) {
|
||||
HAL_StatusTypeDef ret = HAL_ETH_Transmit(&EthHandle, &TxConfig, 20);
|
||||
|
||||
if (ret != HAL_OK) {
|
||||
printf("low_level_output: Could not transmit ethernet packet, code %d!\n\r", ret);
|
||||
printf("low_level_output: Could not transmit ethernet packet, code %d!\n\r",
|
||||
ret);
|
||||
}
|
||||
|
||||
return errval;
|
||||
@ -289,10 +300,12 @@ static struct pbuf *low_level_input(struct netif *netif) {
|
||||
HAL_ETH_GetRxDataLength(&EthHandle, &framelength);
|
||||
|
||||
/* Invalidate data cache for ETH Rx Buffers */
|
||||
SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff, (ETH_RX_DESC_CNT * ETH_RX_BUFFER_SIZE));
|
||||
SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff,
|
||||
(ETH_RX_DESC_CNT * ETH_RX_BUFFER_SIZE));
|
||||
|
||||
p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL, &rx_pbuf[current_pbuf_idx],
|
||||
RxBuff.buffer, ETH_RX_BUFFER_SIZE);
|
||||
p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_POOL,
|
||||
&rx_pbuf[current_pbuf_idx], RxBuff.buffer,
|
||||
ETH_RX_BUFFER_SIZE);
|
||||
if (current_pbuf_idx < (ETH_RX_DESC_CNT - 1)) {
|
||||
current_pbuf_idx++;
|
||||
} else {
|
||||
@ -306,11 +319,11 @@ static struct pbuf *low_level_input(struct netif *netif) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function is the ethernetif_input task, it is processed when a packet
|
||||
* is ready to be read from the interface. It uses the function low_level_input()
|
||||
* that should handle the actual reception of bytes from the network
|
||||
* interface. Then the type of the received packet is determined and
|
||||
* the appropriate input function is called.
|
||||
* @brief This function is the ethernetif_input task, it is processed when a
|
||||
* packet is ready to be read from the interface. It uses the function
|
||||
* low_level_input() that should handle the actual reception of bytes from the
|
||||
* network interface. Then the type of the received packet is determined and the
|
||||
* appropriate input function is called.
|
||||
*
|
||||
* @param netif the lwip network interface structure for this ethernetif
|
||||
*/
|
||||
@ -322,7 +335,8 @@ void ethernetif_input(struct netif *netif) {
|
||||
p = low_level_input(netif);
|
||||
|
||||
/* no packet could be read, silently ignore this */
|
||||
if (p == NULL) return;
|
||||
if (p == NULL)
|
||||
return;
|
||||
|
||||
/* entry point to the LwIP stack */
|
||||
err = netif->input(p, netif);
|
||||
@ -413,7 +427,8 @@ void HAL_ETH_MspInit(ETH_HandleTypeDef *heth) {
|
||||
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOG_CLK_ENABLE();
|
||||
|
||||
/* Ethernet pins configuration ************************************************/
|
||||
/* Ethernet pins configuration
|
||||
* ************************************************/
|
||||
/*
|
||||
RMII_REF_CLK ----------------------> PA1
|
||||
RMII_MDIO -------------------------> PA2
|
||||
@ -492,8 +507,10 @@ int32_t ETH_PHY_IO_DeInit(void) { return 0; }
|
||||
* @param pRegVal: pointer to hold the register value
|
||||
* @retval 0 if OK -1 if Error
|
||||
*/
|
||||
int32_t ETH_PHY_IO_ReadReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t *pRegVal) {
|
||||
if (HAL_ETH_ReadPHYRegister(&EthHandle, DevAddr, RegAddr, pRegVal) != HAL_OK) {
|
||||
int32_t ETH_PHY_IO_ReadReg(uint32_t DevAddr, uint32_t RegAddr,
|
||||
uint32_t *pRegVal) {
|
||||
if (HAL_ETH_ReadPHYRegister(&EthHandle, DevAddr, RegAddr, pRegVal) !=
|
||||
HAL_OK) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -507,8 +524,10 @@ int32_t ETH_PHY_IO_ReadReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t *pRegVal
|
||||
* @param RegVal: Value to be written
|
||||
* @retval 0 if OK -1 if Error
|
||||
*/
|
||||
int32_t ETH_PHY_IO_WriteReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t RegVal) {
|
||||
if (HAL_ETH_WritePHYRegister(&EthHandle, DevAddr, RegAddr, RegVal) != HAL_OK) {
|
||||
int32_t ETH_PHY_IO_WriteReg(uint32_t DevAddr, uint32_t RegAddr,
|
||||
uint32_t RegVal) {
|
||||
if (HAL_ETH_WritePHYRegister(&EthHandle, DevAddr, RegAddr, RegVal) !=
|
||||
HAL_OK) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -536,30 +555,31 @@ void ethernet_link_check_state(struct netif *netif) {
|
||||
HAL_ETH_Stop(&EthHandle);
|
||||
netif_set_down(netif);
|
||||
netif_set_link_down(netif);
|
||||
} else if (!netif_is_link_up(netif) && (PHYLinkState > LAN8742_STATUS_LINK_DOWN)) {
|
||||
} else if (!netif_is_link_up(netif) &&
|
||||
(PHYLinkState > LAN8742_STATUS_LINK_DOWN)) {
|
||||
switch (PHYLinkState) {
|
||||
case LAN8742_STATUS_100MBITS_FULLDUPLEX:
|
||||
duplex = ETH_FULLDUPLEX_MODE;
|
||||
speed = ETH_SPEED_100M;
|
||||
linkchanged = 1;
|
||||
break;
|
||||
case LAN8742_STATUS_100MBITS_HALFDUPLEX:
|
||||
duplex = ETH_HALFDUPLEX_MODE;
|
||||
speed = ETH_SPEED_100M;
|
||||
linkchanged = 1;
|
||||
break;
|
||||
case LAN8742_STATUS_10MBITS_FULLDUPLEX:
|
||||
duplex = ETH_FULLDUPLEX_MODE;
|
||||
speed = ETH_SPEED_10M;
|
||||
linkchanged = 1;
|
||||
break;
|
||||
case LAN8742_STATUS_10MBITS_HALFDUPLEX:
|
||||
duplex = ETH_HALFDUPLEX_MODE;
|
||||
speed = ETH_SPEED_10M;
|
||||
linkchanged = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case LAN8742_STATUS_100MBITS_FULLDUPLEX:
|
||||
duplex = ETH_FULLDUPLEX_MODE;
|
||||
speed = ETH_SPEED_100M;
|
||||
linkchanged = 1;
|
||||
break;
|
||||
case LAN8742_STATUS_100MBITS_HALFDUPLEX:
|
||||
duplex = ETH_HALFDUPLEX_MODE;
|
||||
speed = ETH_SPEED_100M;
|
||||
linkchanged = 1;
|
||||
break;
|
||||
case LAN8742_STATUS_10MBITS_FULLDUPLEX:
|
||||
duplex = ETH_FULLDUPLEX_MODE;
|
||||
speed = ETH_SPEED_10M;
|
||||
linkchanged = 1;
|
||||
break;
|
||||
case LAN8742_STATUS_10MBITS_HALFDUPLEX:
|
||||
duplex = ETH_HALFDUPLEX_MODE;
|
||||
speed = ETH_SPEED_10M;
|
||||
linkchanged = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (linkchanged) {
|
||||
|
@ -4,11 +4,14 @@
|
||||
|
||||
bool ethernetCableConnected = false;
|
||||
|
||||
void networking::setEthCableConnected(bool status) { ethernetCableConnected = status; }
|
||||
void networking::setEthCableConnected(bool status) {
|
||||
ethernetCableConnected = status;
|
||||
}
|
||||
|
||||
bool networking::getEthCableConnected() { return ethernetCableConnected; }
|
||||
|
||||
void networking::setLwipAddresses(ip_addr_t* ipaddr, ip_addr_t* netmask, ip_addr_t* gw) {
|
||||
void networking::setLwipAddresses(ip_addr_t *ipaddr, ip_addr_t *netmask,
|
||||
ip_addr_t *gw) {
|
||||
IP4_ADDR(ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3);
|
||||
IP4_ADDR(netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
|
||||
IP4_ADDR(gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
|
||||
|
@ -7,8 +7,8 @@ namespace networking {
|
||||
|
||||
void setEthCableConnected(bool status);
|
||||
bool getEthCableConnected();
|
||||
void setLwipAddresses(ip_addr_t* ipaddr, ip_addr_t* netmask, ip_addr_t* gw);
|
||||
void setLwipAddresses(ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t *gw);
|
||||
|
||||
} // namespace networking
|
||||
} // namespace networking
|
||||
|
||||
#endif /* BSP_STM32H7_RTEMS_NETWORKING_NETWORKING_H_ */
|
||||
|
@ -8,7 +8,8 @@ extern "C" {
|
||||
/* UDP local connection port. Client needs to bind to this port */
|
||||
#define UDP_SERVER_PORT 7
|
||||
|
||||
/*Static DEST IP ADDRESS: DEST_IP_ADDR0.DEST_IP_ADDR1.DEST_IP_ADDR2.DEST_IP_ADDR3 */
|
||||
/*Static DEST IP ADDRESS:
|
||||
* DEST_IP_ADDR0.DEST_IP_ADDR1.DEST_IP_ADDR2.DEST_IP_ADDR3 */
|
||||
#define DEST_IP_ADDR0 ((uint8_t)169U)
|
||||
#define DEST_IP_ADDR1 ((uint8_t)254U)
|
||||
#define DEST_IP_ADDR2 ((uint8_t)39U)
|
||||
|
Reference in New Issue
Block a user