Merge pull request 'merge_back' (#1) from Airbus/ADS-VP-Demo-FW:merge_back into main
Reviewed-on: #1
This commit was merged in pull request #1.
This commit is contained in:
10
.clang-format
Normal file
10
.clang-format
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
BasedOnStyle: Microsoft
|
||||||
|
BinPackArguments: false
|
||||||
|
BinPackParameters: false
|
||||||
|
AlignAfterOpenBracket: DontAlign
|
||||||
|
AlignConsecutiveMacros: true
|
||||||
|
AlignConsecutiveAssignments: true
|
||||||
|
IndentCaseLabels: true
|
||||||
|
PointerAlignment: Left
|
||||||
|
BraceWrapping:
|
||||||
|
AfterCaseLabel: true
|
||||||
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@@ -6,7 +6,7 @@
|
|||||||
"comment": "clang-format"
|
"comment": "clang-format"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"editor.formatOnSave": false,
|
"editor.formatOnSave": true,
|
||||||
"clangd.arguments": [
|
"clangd.arguments": [
|
||||||
"--pretty",
|
"--pretty",
|
||||||
"--background-index",
|
"--background-index",
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
#define TICKNUM_PER_SECOND 32768
|
#define TICKNUM_PER_SECOND 32768
|
||||||
#define TICKNUM_PER_TIMER (TICKNUM_PER_SECOND / 1000) // ~ 1ms timer
|
#define TICKNUM_PER_TIMER (TICKNUM_PER_SECOND / 100) // ~ 1ms timer
|
||||||
|
|
||||||
static inline int hwtimer_init(void) {
|
static inline int hwtimer_init(void) {
|
||||||
uint64_t time = get_aclint_mtime(aclint);
|
uint64_t time = get_aclint_mtime(aclint);
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ extern int register_irq_handler(unsigned irq_num, void (*handler)());
|
|||||||
#define NX_LINK_MTU 1514
|
#define NX_LINK_MTU 1514
|
||||||
#define NX_MAX_PACKET_SIZE 1536
|
#define NX_MAX_PACKET_SIZE 1536
|
||||||
|
|
||||||
|
|
||||||
/* Define Ethernet address format. This is prepended to the incoming IP
|
/* Define Ethernet address format. This is prepended to the incoming IP
|
||||||
and ARP/RARP messages. The frame beginning is 14 bytes, but for speed
|
and ARP/RARP messages. The frame beginning is 14 bytes, but for speed
|
||||||
purposes, we are going to assume there are 16 bytes free in front of the
|
purposes, we are going to assume there are 16 bytes free in front of the
|
||||||
@@ -71,7 +70,6 @@ extern int register_irq_handler(unsigned irq_num, void (*handler)());
|
|||||||
const ULONG mnrs_mac_address_msw = 0x0200;
|
const ULONG mnrs_mac_address_msw = 0x0200;
|
||||||
const ULONG mnrs_mac_address_lsw = 0x00334450;
|
const ULONG mnrs_mac_address_lsw = 0x00334450;
|
||||||
|
|
||||||
|
|
||||||
/* Define driver prototypes. */
|
/* Define driver prototypes. */
|
||||||
|
|
||||||
VOID _nx_mnrs_network_driver(NX_IP_DRIVER *driver_req_ptr);
|
VOID _nx_mnrs_network_driver(NX_IP_DRIVER *driver_req_ptr);
|
||||||
@@ -82,7 +80,6 @@ VOID _nx_mnrs_eth_recv_packet(UINT id, volatile ethmac_t* ethmac);
|
|||||||
VOID _nx_mnrs_eth_recv_packet_eth0(VOID);
|
VOID _nx_mnrs_eth_recv_packet_eth0(VOID);
|
||||||
VOID _nx_mnrs_eth_recv_packet_eth1(VOID);
|
VOID _nx_mnrs_eth_recv_packet_eth1(VOID);
|
||||||
|
|
||||||
#define NX_MAX_MNRS_INTERFACES 4
|
|
||||||
#define NX_MNRS_DRIVER_MAX_MCAST_ADDRESSES 3
|
#define NX_MNRS_DRIVER_MAX_MCAST_ADDRESSES 3
|
||||||
typedef struct MAC_ADDRESS_STRUCT
|
typedef struct MAC_ADDRESS_STRUCT
|
||||||
{
|
{
|
||||||
@@ -118,7 +115,7 @@ typedef struct _nx_mnrs_network_driver_instance_type
|
|||||||
/* In this example, there are four instances of the MNRS ETH driver.
|
/* In this example, there are four instances of the MNRS ETH driver.
|
||||||
Therefore an array of four driver instances are created to keep track of
|
Therefore an array of four driver instances are created to keep track of
|
||||||
the interface information of each driver. */
|
the interface information of each driver. */
|
||||||
static _nx_mnrs_network_driver_instance_type nx_mnrs_driver[NX_MAX_MNRS_INTERFACES];
|
static _nx_mnrs_network_driver_instance_type nx_mnrs_driver[NX_MAX_PHYSICAL_INTERFACES];
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -203,7 +200,7 @@ ULONG *ethernet_frame_ptr;
|
|||||||
/* Find out the driver interface if the driver command is not ATTACH. */
|
/* Find out the driver interface if the driver command is not ATTACH. */
|
||||||
if (driver_req_ptr->nx_ip_driver_command != NX_LINK_INTERFACE_ATTACH)
|
if (driver_req_ptr->nx_ip_driver_command != NX_LINK_INTERFACE_ATTACH)
|
||||||
{
|
{
|
||||||
for (i = 0; i < NX_MAX_MNRS_INTERFACES; i++)
|
for (i = 0; i < NX_MAX_PHYSICAL_INTERFACES; i++)
|
||||||
{
|
{
|
||||||
if (nx_mnrs_driver[i].nx_mnrs_network_driver_in_use == 0)
|
if (nx_mnrs_driver[i].nx_mnrs_network_driver_in_use == 0)
|
||||||
{
|
{
|
||||||
@@ -218,7 +215,7 @@ ULONG *ethernet_frame_ptr;
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (i == NX_MAX_MNRS_INTERFACES)
|
if (i == NX_MAX_PHYSICAL_INTERFACES)
|
||||||
{
|
{
|
||||||
driver_req_ptr->nx_ip_driver_status = NX_INVALID_INTERFACE;
|
driver_req_ptr->nx_ip_driver_status = NX_INVALID_INTERFACE;
|
||||||
return;
|
return;
|
||||||
@@ -231,7 +228,7 @@ ULONG *ethernet_frame_ptr;
|
|||||||
case NX_LINK_INTERFACE_ATTACH:
|
case NX_LINK_INTERFACE_ATTACH:
|
||||||
{
|
{
|
||||||
/* Find an available driver instance to attach the interface. */
|
/* Find an available driver instance to attach the interface. */
|
||||||
for (i = 0; i < NX_MAX_MNRS_INTERFACES; i++)
|
for (i = 0; i < NX_MAX_PHYSICAL_INTERFACES; i++)
|
||||||
{
|
{
|
||||||
if (nx_mnrs_driver[i].nx_mnrs_network_driver_in_use == 0)
|
if (nx_mnrs_driver[i].nx_mnrs_network_driver_in_use == 0)
|
||||||
{
|
{
|
||||||
@@ -239,7 +236,7 @@ ULONG *ethernet_frame_ptr;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* An available entry is found. */
|
/* An available entry is found. */
|
||||||
if (i < NX_MAX_MNRS_INTERFACES)
|
if (i < NX_MAX_PHYSICAL_INTERFACES)
|
||||||
{
|
{
|
||||||
/* Set the IN USE flag.*/
|
/* Set the IN USE flag.*/
|
||||||
nx_mnrs_driver[i].nx_mnrs_network_driver_in_use = 1;
|
nx_mnrs_driver[i].nx_mnrs_network_driver_in_use = 1;
|
||||||
@@ -252,7 +249,8 @@ ULONG *ethernet_frame_ptr;
|
|||||||
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_msw = mnrs_mac_address_msw;
|
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_msw = mnrs_mac_address_msw;
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_lsw = mnrs_mac_address_lsw + i;
|
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_lsw = mnrs_mac_address_lsw + i;
|
||||||
/* Record the peripheral address */
|
/* Record the peripheral address */
|
||||||
switch(i) {
|
switch (i)
|
||||||
|
{
|
||||||
case 0:
|
case 0:
|
||||||
nx_mnrs_driver[i].ethmac = ethmac0;
|
nx_mnrs_driver[i].ethmac = ethmac0;
|
||||||
break;
|
break;
|
||||||
@@ -293,7 +291,8 @@ ULONG *ethernet_frame_ptr;
|
|||||||
#endif
|
#endif
|
||||||
// enable TX & RX path
|
// enable TX & RX path
|
||||||
set_ethmac_mac_ctrl(nx_mnrs_driver[i].ethmac,
|
set_ethmac_mac_ctrl(nx_mnrs_driver[i].ethmac,
|
||||||
get_ethmac_mac_ctrl(nx_mnrs_driver[i].ethmac) & ~(ETHMAC_MAC_CTRL_TX_FLUSH(1)| ETHMAC_MAC_CTRL_RX_FLUSH(1)));
|
get_ethmac_mac_ctrl(nx_mnrs_driver[i].ethmac) &
|
||||||
|
~(ETHMAC_MAC_CTRL_TX_FLUSH(1) | ETHMAC_MAC_CTRL_RX_FLUSH(1)));
|
||||||
register_irq_handler(ETH0_IRQ, &_nx_mnrs_eth_recv_packet_eth0);
|
register_irq_handler(ETH0_IRQ, &_nx_mnrs_eth_recv_packet_eth0);
|
||||||
register_irq_handler(ETH1_IRQ, &_nx_mnrs_eth_recv_packet_eth1);
|
register_irq_handler(ETH1_IRQ, &_nx_mnrs_eth_recv_packet_eth1);
|
||||||
csr_read_set_bits_mie(1 << ETH0_IRQ | 1 << ETH1_IRQ);
|
csr_read_set_bits_mie(1 << ETH0_IRQ | 1 << ETH1_IRQ);
|
||||||
@@ -308,9 +307,11 @@ ULONG *ethernet_frame_ptr;
|
|||||||
/* For this MNRS ETH driver, the MAC address is constructed by
|
/* For this MNRS ETH driver, the MAC address is constructed by
|
||||||
incrementing a base lsw value, to simulate multiple nodes on the
|
incrementing a base lsw value, to simulate multiple nodes on the
|
||||||
ethernet. */
|
ethernet. */
|
||||||
nx_ip_interface_physical_address_set(ip_ptr, interface_index,
|
nx_ip_interface_physical_address_set(ip_ptr,
|
||||||
|
interface_index,
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_msw,
|
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_msw,
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_lsw, NX_FALSE);
|
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_lsw,
|
||||||
|
NX_FALSE);
|
||||||
/* Indicate to the IP software that IP to physical mapping is required. */
|
/* Indicate to the IP software that IP to physical mapping is required. */
|
||||||
nx_ip_interface_address_mapping_configure(ip_ptr, interface_index, NX_TRUE);
|
nx_ip_interface_address_mapping_configure(ip_ptr, interface_index, NX_TRUE);
|
||||||
break;
|
break;
|
||||||
@@ -325,7 +326,8 @@ ULONG *ethernet_frame_ptr;
|
|||||||
// set_ethmac_mac_ctrl_tx_flush(nx_mnrs_driver[i].ethmac, 1);
|
// set_ethmac_mac_ctrl_tx_flush(nx_mnrs_driver[i].ethmac, 1);
|
||||||
// set_ethmac_mac_ctrl_rx_flush(nx_mnrs_driver[i].ethmac, 1);
|
// set_ethmac_mac_ctrl_rx_flush(nx_mnrs_driver[i].ethmac, 1);
|
||||||
set_ethmac_mac_ctrl(nx_mnrs_driver[i].ethmac,
|
set_ethmac_mac_ctrl(nx_mnrs_driver[i].ethmac,
|
||||||
get_ethmac_mac_ctrl(nx_mnrs_driver[i].ethmac) | ETHMAC_MAC_CTRL_TX_FLUSH(1)| ETHMAC_MAC_CTRL_RX_FLUSH(1));
|
get_ethmac_mac_ctrl(nx_mnrs_driver[i].ethmac) | ETHMAC_MAC_CTRL_TX_FLUSH(1) |
|
||||||
|
ETHMAC_MAC_CTRL_RX_FLUSH(1));
|
||||||
/* Zero out the driver instance. */
|
/* Zero out the driver instance. */
|
||||||
memset(&(nx_mnrs_driver[i]), 0, sizeof(_nx_mnrs_network_driver_instance_type));
|
memset(&(nx_mnrs_driver[i]), 0, sizeof(_nx_mnrs_network_driver_instance_type));
|
||||||
break;
|
break;
|
||||||
@@ -400,7 +402,8 @@ ULONG *ethernet_frame_ptr;
|
|||||||
#ifdef NX_ENABLE_VLAN
|
#ifdef NX_ENABLE_VLAN
|
||||||
/* Add Ethernet header. */
|
/* Add Ethernet header. */
|
||||||
if (nx_link_ethernet_header_add(ip_ptr,
|
if (nx_link_ethernet_header_add(ip_ptr,
|
||||||
driver_req_ptr -> nx_ip_driver_interface -> nx_interface_index, packet_ptr,
|
driver_req_ptr->nx_ip_driver_interface->nx_interface_index,
|
||||||
|
packet_ptr,
|
||||||
driver_req_ptr->nx_ip_driver_physical_address_msw,
|
driver_req_ptr->nx_ip_driver_physical_address_msw,
|
||||||
driver_req_ptr->nx_ip_driver_physical_address_lsw,
|
driver_req_ptr->nx_ip_driver_physical_address_lsw,
|
||||||
(UINT)ether_type))
|
(UINT)ether_type))
|
||||||
@@ -469,8 +472,10 @@ ULONG *ethernet_frame_ptr;
|
|||||||
if (nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_msw == 0 &&
|
if (nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_msw == 0 &&
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_lsw == 0)
|
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_lsw == 0)
|
||||||
{
|
{
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_msw = driver_req_ptr -> nx_ip_driver_physical_address_msw;
|
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_msw =
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_lsw = driver_req_ptr -> nx_ip_driver_physical_address_lsw;
|
driver_req_ptr->nx_ip_driver_physical_address_msw;
|
||||||
|
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_lsw =
|
||||||
|
driver_req_ptr->nx_ip_driver_physical_address_lsw;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -493,8 +498,10 @@ ULONG *ethernet_frame_ptr;
|
|||||||
multicast MAC addresses by a simple look up table. */
|
multicast MAC addresses by a simple look up table. */
|
||||||
for (mcast_index = 0; mcast_index < NX_MNRS_DRIVER_MAX_MCAST_ADDRESSES; mcast_index++)
|
for (mcast_index = 0; mcast_index < NX_MNRS_DRIVER_MAX_MCAST_ADDRESSES; mcast_index++)
|
||||||
{
|
{
|
||||||
if (nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_msw == driver_req_ptr -> nx_ip_driver_physical_address_msw &&
|
if (nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_msw ==
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_lsw == driver_req_ptr -> nx_ip_driver_physical_address_lsw)
|
driver_req_ptr->nx_ip_driver_physical_address_msw &&
|
||||||
|
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_lsw ==
|
||||||
|
driver_req_ptr->nx_ip_driver_physical_address_lsw)
|
||||||
{
|
{
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_msw = 0;
|
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_msw = 0;
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_lsw = 0;
|
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_lsw = 0;
|
||||||
@@ -577,7 +584,7 @@ ULONG *ethernet_frame_ptr;
|
|||||||
case NX_LINK_SET_PHYSICAL_ADDRESS:
|
case NX_LINK_SET_PHYSICAL_ADDRESS:
|
||||||
{
|
{
|
||||||
/* Find an driver instance to attach the interface. */
|
/* Find an driver instance to attach the interface. */
|
||||||
for (i = 0; i < NX_MAX_MNRS_INTERFACES; i++)
|
for (i = 0; i < NX_MAX_PHYSICAL_INTERFACES; i++)
|
||||||
{
|
{
|
||||||
if (nx_mnrs_driver[i].nx_mnrs_driver_interface_ptr == interface_ptr)
|
if (nx_mnrs_driver[i].nx_mnrs_driver_interface_ptr == interface_ptr)
|
||||||
{
|
{
|
||||||
@@ -585,11 +592,13 @@ ULONG *ethernet_frame_ptr;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* An available entry is found. */
|
/* An available entry is found. */
|
||||||
if (i < NX_MAX_MNRS_INTERFACES)
|
if (i < NX_MAX_PHYSICAL_INTERFACES)
|
||||||
{
|
{
|
||||||
/* Set the physical address. */
|
/* Set the physical address. */
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_msw = driver_req_ptr -> nx_ip_driver_physical_address_msw;
|
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_msw =
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_lsw = driver_req_ptr -> nx_ip_driver_physical_address_lsw;
|
driver_req_ptr->nx_ip_driver_physical_address_msw;
|
||||||
|
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_lsw =
|
||||||
|
driver_req_ptr->nx_ip_driver_physical_address_lsw;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -600,7 +609,8 @@ ULONG *ethernet_frame_ptr;
|
|||||||
#ifdef NX_ENABLE_INTERFACE_CAPABILITY
|
#ifdef NX_ENABLE_INTERFACE_CAPABILITY
|
||||||
case NX_INTERFACE_CAPABILITY_GET:
|
case NX_INTERFACE_CAPABILITY_GET:
|
||||||
{
|
{
|
||||||
/* Return the capability of the Ethernet controller speed in the supplied return pointer. Unsupported feature. */
|
/* Return the capability of the Ethernet controller speed in the supplied return pointer. Unsupported
|
||||||
|
* feature. */
|
||||||
*(driver_req_ptr->nx_ip_driver_return_ptr) = 0;
|
*(driver_req_ptr->nx_ip_driver_return_ptr) = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -714,7 +724,8 @@ UINT i, j;
|
|||||||
/* Release the packet. */
|
/* Release the packet. */
|
||||||
nx_link_packet_transmitted(nx_mnrs_driver[interface_instance_id].nx_mnrs_driver_ip_ptr,
|
nx_link_packet_transmitted(nx_mnrs_driver[interface_instance_id].nx_mnrs_driver_ip_ptr,
|
||||||
nx_mnrs_driver[interface_instance_id].nx_mnrs_driver_interface_ptr->nx_interface_index,
|
nx_mnrs_driver[interface_instance_id].nx_mnrs_driver_interface_ptr->nx_interface_index,
|
||||||
packet_ptr, NX_NULL);
|
packet_ptr,
|
||||||
|
NX_NULL);
|
||||||
#else
|
#else
|
||||||
/* Remove the Ethernet header. In real hardware environments, this is typically
|
/* Remove the Ethernet header. In real hardware environments, this is typically
|
||||||
done after a transmit complete interrupt. */
|
done after a transmit complete interrupt. */
|
||||||
@@ -787,7 +798,8 @@ UINT packet_type;
|
|||||||
#ifdef NX_ENABLE_VLAN
|
#ifdef NX_ENABLE_VLAN
|
||||||
nx_link_ethernet_packet_received(ip_ptr,
|
nx_link_ethernet_packet_received(ip_ptr,
|
||||||
nx_mnrs_driver[interface_instance_id].nx_mnrs_driver_interface_ptr->nx_interface_index,
|
nx_mnrs_driver[interface_instance_id].nx_mnrs_driver_interface_ptr->nx_interface_index,
|
||||||
packet_ptr, NX_NULL);
|
packet_ptr,
|
||||||
|
NX_NULL);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* Pickup the packet header to determine where the packet needs to be
|
/* Pickup the packet header to determine where the packet needs to be
|
||||||
@@ -795,7 +807,8 @@ UINT packet_type;
|
|||||||
packet_type = (((UINT)(*(packet_ptr->nx_packet_prepend_ptr + 12))) << 8) |
|
packet_type = (((UINT)(*(packet_ptr->nx_packet_prepend_ptr + 12))) << 8) |
|
||||||
((UINT)(*(packet_ptr->nx_packet_prepend_ptr + 13)));
|
((UINT)(*(packet_ptr->nx_packet_prepend_ptr + 13)));
|
||||||
/* Setup interface pointer. */
|
/* Setup interface pointer. */
|
||||||
packet_ptr -> nx_packet_address.nx_packet_interface_ptr = nx_mnrs_driver[interface_instance_id].nx_mnrs_driver_interface_ptr;
|
packet_ptr->nx_packet_address.nx_packet_interface_ptr =
|
||||||
|
nx_mnrs_driver[interface_instance_id].nx_mnrs_driver_interface_ptr;
|
||||||
/* Route the incoming packet according to its ethernet type. */
|
/* Route the incoming packet according to its ethernet type. */
|
||||||
/* The MNRS ETH driver accepts both IPv4 and IPv6 frames. */
|
/* The MNRS ETH driver accepts both IPv4 and IPv6 frames. */
|
||||||
if ((packet_type == NX_ETHERNET_IP) || (packet_type == NX_ETHERNET_IPV6))
|
if ((packet_type == NX_ETHERNET_IP) || (packet_type == NX_ETHERNET_IPV6))
|
||||||
@@ -853,7 +866,8 @@ UINT packet_type;
|
|||||||
#endif /* NX_ENABLE_VLAN */
|
#endif /* NX_ENABLE_VLAN */
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT _nx_mnrs_eth_send_packet(NX_PACKET *packet_ptr, volatile ethmac_t* ethmac){
|
UINT _nx_mnrs_eth_send_packet(NX_PACKET* packet_ptr, volatile ethmac_t* ethmac)
|
||||||
|
{
|
||||||
ULONG size = 0;
|
ULONG size = 0;
|
||||||
UCHAR* data;
|
UCHAR* data;
|
||||||
UINT i;
|
UINT i;
|
||||||
@@ -872,10 +886,14 @@ ULONG words;
|
|||||||
while (get_ethmac_mac_ctrl_tx_ready(ethmac) == 0)
|
while (get_ethmac_mac_ctrl_tx_ready(ethmac) == 0)
|
||||||
;
|
;
|
||||||
set_ethmac_mac_tx(ethmac, size * 8);
|
set_ethmac_mac_tx(ethmac, size * 8);
|
||||||
for(i=0; i<size; i+=4) {
|
for (i = 0; i < size; i += 4)
|
||||||
if(i<size-3) {
|
{
|
||||||
|
if (i < size - 3)
|
||||||
|
{
|
||||||
memcpy(&buffer, data + i, 4);
|
memcpy(&buffer, data + i, 4);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
memcpy(&buffer, data + i, size - i);
|
memcpy(&buffer, data + i, size - i);
|
||||||
}
|
}
|
||||||
while (!get_ethmac_mac_ctrl_tx_ready(ethmac))
|
while (!get_ethmac_mac_ctrl_tx_ready(ethmac))
|
||||||
@@ -886,7 +904,8 @@ ULONG words;
|
|||||||
return NX_SUCCESS;
|
return NX_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT mac_addr_hit(UINT i, MAC_ADDRESS* mac_addr) {
|
UINT mac_addr_hit(UINT i, MAC_ADDRESS* mac_addr)
|
||||||
|
{
|
||||||
UINT mcast_index;
|
UINT mcast_index;
|
||||||
if (nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_msw == mac_addr->nx_mac_address_msw &&
|
if (nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_msw == mac_addr->nx_mac_address_msw &&
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_lsw == mac_addr->nx_mac_address_lsw)
|
nx_mnrs_driver[i].nx_mnrs_driver_mac_address.nx_mac_address_lsw == mac_addr->nx_mac_address_lsw)
|
||||||
@@ -896,12 +915,15 @@ UINT mac_addr_hit(UINT i, MAC_ADDRESS* mac_addr) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT mcast_mac_addr_hit_idx(UINT i, MAC_ADDRESS*mac_addr) {
|
UINT mcast_mac_addr_hit_idx(UINT i, MAC_ADDRESS* mac_addr)
|
||||||
|
{
|
||||||
UINT mcast_index;
|
UINT mcast_index;
|
||||||
for (mcast_index = 0; mcast_index < NX_MNRS_DRIVER_MAX_MCAST_ADDRESSES; mcast_index++)
|
for (mcast_index = 0; mcast_index < NX_MNRS_DRIVER_MAX_MCAST_ADDRESSES; mcast_index++)
|
||||||
{
|
{
|
||||||
if (nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_msw == mac_addr->nx_mac_address_msw &&
|
if (nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_msw ==
|
||||||
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_lsw == mac_addr -> nx_mac_address_lsw)
|
mac_addr->nx_mac_address_msw &&
|
||||||
|
nx_mnrs_driver[i].nx_mnrs_driver_mcast_address[mcast_index].nx_mac_address_lsw ==
|
||||||
|
mac_addr->nx_mac_address_lsw)
|
||||||
{
|
{
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
@@ -910,15 +932,12 @@ UINT mcast_mac_addr_hit_idx(UINT i, MAC_ADDRESS*mac_addr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static UCHAR nx_mnrs_receive_buffer[NX_MAX_PACKET_SIZE];
|
static UCHAR nx_mnrs_receive_buffer[NX_MAX_PACKET_SIZE];
|
||||||
VOID _nx_mnrs_eth_recv_packet(UINT id, volatile ethmac_t* ethmac){
|
VOID _nx_mnrs_eth_recv_packet(UINT id, volatile ethmac_t* ethmac)
|
||||||
UINT bit_size;
|
{
|
||||||
UINT word_size;
|
UINT bits_received;
|
||||||
UINT byte_size;
|
UINT words_to_read;
|
||||||
UINT i;
|
UINT i, j;
|
||||||
UINT word;
|
UINT word;
|
||||||
UCHAR buffer[16];
|
|
||||||
MAC_ADDRESS to_mac;
|
|
||||||
MAC_ADDRESS from_mac;
|
|
||||||
UINT status;
|
UINT status;
|
||||||
NX_PACKET* packet_ptr;
|
NX_PACKET* packet_ptr;
|
||||||
NX_IP* ip_ptr;
|
NX_IP* ip_ptr;
|
||||||
@@ -928,34 +947,28 @@ VOID _nx_mnrs_eth_recv_packet(UINT id, volatile ethmac_t* ethmac){
|
|||||||
UINT packet_type;
|
UINT packet_type;
|
||||||
|
|
||||||
set_ethmac_mac_intr_rx_data_avail_intr_enable(ethmac, 0);
|
set_ethmac_mac_intr_rx_data_avail_intr_enable(ethmac, 0);
|
||||||
bit_size = get_ethmac_mac_rx(ethmac);
|
bits_received = get_ethmac_mac_rx(ethmac);
|
||||||
word_size = (bit_size+31)/32;
|
words_to_read = (bits_received + 31) / 32;
|
||||||
byte_size = (bit_size+7)/8;
|
if (words_to_read < 4)
|
||||||
if(word_size<4)
|
|
||||||
{
|
{
|
||||||
set_ethmac_mac_intr_rx_data_avail_intr_enable(ethmac, 1);
|
for (j = 0; j < words_to_read; j++)
|
||||||
return;
|
|
||||||
}
|
|
||||||
// read the first 14 bytes to get from and to mac address (6bytes each) and the frame type/length
|
|
||||||
for( i = 0;i < 4;i++)
|
|
||||||
{
|
{
|
||||||
while (!get_ethmac_mac_ctrl_rx_pending(ethmac))
|
while (!get_ethmac_mac_ctrl_rx_pending(ethmac))
|
||||||
;
|
;
|
||||||
// be carefull of unaligned accesses
|
// be carefull of unaligned accesses since data is 2byte aligned
|
||||||
word = get_ethmac_mac_rx(ethmac);
|
word = get_ethmac_mac_rx(ethmac);
|
||||||
memcpy(buffer+i*sizeof(UINT), &word, sizeof(UINT));
|
memcpy(data + j * sizeof(UINT), &word, sizeof(UINT));
|
||||||
|
}
|
||||||
|
set_ethmac_mac_intr_rx_data_avail_intr_enable(ethmac, 1);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
to_mac.nx_mac_address_msw=(buffer[0]<<8) + buffer[1];
|
|
||||||
to_mac.nx_mac_address_lsw=(buffer[2]<<24) + (buffer[3]<<16) + (buffer[4]<<8) + buffer[5];
|
|
||||||
from_mac.nx_mac_address_msw=(buffer[6]<<8) + buffer[7];
|
|
||||||
from_mac.nx_mac_address_lsw=(buffer[8]<<24) + (buffer[9]<<16) + (buffer[10]<<8) + buffer[11];
|
|
||||||
// find the diver instance belonging to our ethmac
|
// find the diver instance belonging to our ethmac
|
||||||
for(i=0; i<NX_MAX_MNRS_INTERFACES; ++i) {
|
for (i = 0; i < NX_MAX_PHYSICAL_INTERFACES; ++i)
|
||||||
|
{
|
||||||
if (nx_mnrs_driver[i].ethmac == ethmac)
|
if (nx_mnrs_driver[i].ethmac == ethmac)
|
||||||
{
|
{
|
||||||
ip_ptr = nx_mnrs_driver[i].nx_mnrs_driver_ip_ptr;
|
ip_ptr = nx_mnrs_driver[i].nx_mnrs_driver_ip_ptr;
|
||||||
status = nx_packet_allocate(ip_ptr->nx_ip_default_packet_pool,
|
status = nx_packet_allocate(ip_ptr->nx_ip_default_packet_pool, &packet_ptr, NX_RECEIVE_PACKET, NX_NO_WAIT);
|
||||||
&packet_ptr, NX_RECEIVE_PACKET, NX_NO_WAIT);
|
|
||||||
if (status)
|
if (status)
|
||||||
{
|
{
|
||||||
packet_ptr = NX_NULL;
|
packet_ptr = NX_NULL;
|
||||||
@@ -969,15 +982,14 @@ VOID _nx_mnrs_eth_recv_packet(UINT id, volatile ethmac_t* ethmac){
|
|||||||
{
|
{
|
||||||
data = nx_mnrs_receive_buffer;
|
data = nx_mnrs_receive_buffer;
|
||||||
}
|
}
|
||||||
/* read the data from the rx buffer into the packet pointer or our frame buffer */
|
|
||||||
memcpy(data, buffer, 16);
|
|
||||||
/* now get the remaining bytes from the ethmac peripheral */
|
/* now get the remaining bytes from the ethmac peripheral */
|
||||||
for( i = 4;i < word_size;i++){
|
for (j = 0; j < words_to_read; j++)
|
||||||
|
{
|
||||||
while (!get_ethmac_mac_ctrl_rx_pending(ethmac))
|
while (!get_ethmac_mac_ctrl_rx_pending(ethmac))
|
||||||
;
|
;
|
||||||
// be carefull of unaligned accesses
|
// be carefull of unaligned accesses since data is 2byte aligned
|
||||||
word = get_ethmac_mac_rx(ethmac);
|
word = get_ethmac_mac_rx(ethmac);
|
||||||
memcpy(data+i*sizeof(UINT), &word, sizeof(UINT));
|
memcpy(data + j * sizeof(UINT), &word, sizeof(UINT));
|
||||||
}
|
}
|
||||||
if (packet_ptr == NX_NULL)
|
if (packet_ptr == NX_NULL)
|
||||||
{
|
{
|
||||||
@@ -990,8 +1002,8 @@ VOID _nx_mnrs_eth_recv_packet(UINT id, volatile ethmac_t* ethmac){
|
|||||||
if (data == nx_mnrs_receive_buffer)
|
if (data == nx_mnrs_receive_buffer)
|
||||||
{
|
{
|
||||||
/* Copy data into packet. */
|
/* Copy data into packet. */
|
||||||
status = nx_packet_data_append(packet_ptr, (VOID *)data, bytes_received,
|
status = nx_packet_data_append(
|
||||||
ip_ptr -> nx_ip_default_packet_pool, NX_NO_WAIT);
|
packet_ptr, (VOID*)data, bytes_received, ip_ptr->nx_ip_default_packet_pool, NX_NO_WAIT);
|
||||||
if (status)
|
if (status)
|
||||||
{
|
{
|
||||||
nx_packet_release(packet_ptr);
|
nx_packet_release(packet_ptr);
|
||||||
@@ -1003,69 +1015,26 @@ VOID _nx_mnrs_eth_recv_packet(UINT id, volatile ethmac_t* ethmac){
|
|||||||
packet_ptr->nx_packet_length = (ULONG)bytes_received;
|
packet_ptr->nx_packet_length = (ULONG)bytes_received;
|
||||||
packet_ptr->nx_packet_append_ptr += (ULONG)bytes_received;
|
packet_ptr->nx_packet_append_ptr += (ULONG)bytes_received;
|
||||||
}
|
}
|
||||||
/* Pickup the packet header to determine where the packet needs to be sent. */
|
|
||||||
packet_type = (((UINT)(*(packet_ptr -> nx_packet_prepend_ptr + 12))) << 8) |
|
|
||||||
((UINT)(*(packet_ptr -> nx_packet_prepend_ptr + 13)));
|
|
||||||
/* Route the incoming packet according to its ethernet type. */
|
|
||||||
if ((packet_type == NX_ETHERNET_IP) || (packet_type == NX_ETHERNET_IPV6))
|
|
||||||
{
|
|
||||||
/* Note: The length reported by some Ethernet hardware includes bytes after the packet
|
|
||||||
as well as the Ethernet header. In some cases, the actual packet length after the
|
|
||||||
Ethernet header should be derived from the length in the IP header (lower 16 bits of
|
|
||||||
the first 32-bit word). */
|
|
||||||
|
|
||||||
/* Clean off the Ethernet header. */
|
_nx_mnrs_network_driver_receive(ip_ptr, packet_ptr, i);
|
||||||
packet_ptr -> nx_packet_prepend_ptr = packet_ptr -> nx_packet_prepend_ptr + NX_ETHERNET_SIZE;
|
break;
|
||||||
/* Adjust the packet length. */
|
|
||||||
packet_ptr -> nx_packet_length = packet_ptr -> nx_packet_length - NX_ETHERNET_SIZE;
|
|
||||||
_nx_ip_packet_deferred_receive(ip_ptr, packet_ptr);
|
|
||||||
}
|
|
||||||
else if (packet_type == NX_ETHERNET_ARP)
|
|
||||||
{
|
|
||||||
/* Clean off the Ethernet header. */
|
|
||||||
packet_ptr -> nx_packet_prepend_ptr = packet_ptr -> nx_packet_prepend_ptr + NX_ETHERNET_SIZE;
|
|
||||||
/* Adjust the packet length. */
|
|
||||||
packet_ptr -> nx_packet_length = packet_ptr -> nx_packet_length - NX_ETHERNET_SIZE;
|
|
||||||
_nx_arp_packet_deferred_receive(ip_ptr, packet_ptr);
|
|
||||||
}
|
|
||||||
else if (packet_type == NX_ETHERNET_RARP)
|
|
||||||
{
|
|
||||||
/* Clean off the Ethernet header. */
|
|
||||||
packet_ptr -> nx_packet_prepend_ptr = packet_ptr -> nx_packet_prepend_ptr + NX_ETHERNET_SIZE;
|
|
||||||
/* Adjust the packet length. */
|
|
||||||
packet_ptr -> nx_packet_length = packet_ptr -> nx_packet_length - NX_ETHERNET_SIZE;
|
|
||||||
_nx_rarp_packet_deferred_receive(ip_ptr, packet_ptr);
|
|
||||||
}
|
|
||||||
#ifdef NX_ENABLE_PPPOE
|
|
||||||
else if ((packet_type == NX_ETHERNET_PPPOE_DISCOVERY) ||
|
|
||||||
(packet_type == NX_ETHERNET_PPPOE_SESSION))
|
|
||||||
{
|
|
||||||
/* Clean off the Ethernet header. */
|
|
||||||
packet_ptr -> nx_packet_prepend_ptr = packet_ptr -> nx_packet_prepend_ptr + NX_ETHERNET_SIZE;
|
|
||||||
/* Adjust the packet length. */
|
|
||||||
packet_ptr -> nx_packet_length = packet_ptr -> nx_packet_length - NX_ETHERNET_SIZE;
|
|
||||||
/* Route to the PPPoE receive function. */
|
|
||||||
_nx_pppoe_packet_deferred_receive(packet_ptr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Invalid ethernet header... release the packet. */
|
|
||||||
nx_packet_release(packet_ptr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set_ethmac_mac_intr_rx_data_avail_intr_enable(ethmac, 1);
|
set_ethmac_mac_intr_rx_data_avail_intr_enable(ethmac, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID _nx_mnrs_eth_recv_packet_eth0(VOID){
|
VOID _nx_mnrs_eth_recv_packet_eth0(VOID)
|
||||||
if(get_ethmac_mac_ctrl_rx_pending(ethmac0)) {
|
{
|
||||||
|
if (get_ethmac_mac_ctrl_rx_pending(ethmac0))
|
||||||
|
{
|
||||||
_nx_mnrs_eth_recv_packet(0, ethmac0);
|
_nx_mnrs_eth_recv_packet(0, ethmac0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID _nx_mnrs_eth_recv_packet_eth1(VOID){
|
VOID _nx_mnrs_eth_recv_packet_eth1(VOID)
|
||||||
if(get_ethmac_mac_ctrl_rx_pending(ethmac1)) {
|
{
|
||||||
|
if (get_ethmac_mac_ctrl_rx_pending(ethmac1))
|
||||||
|
{
|
||||||
_nx_mnrs_eth_recv_packet(1, ethmac1);
|
_nx_mnrs_eth_recv_packet(1, ethmac1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,16 +62,6 @@
|
|||||||
|
|
||||||
#define NX_LITTLE_ENDIAN
|
#define NX_LITTLE_ENDIAN
|
||||||
|
|
||||||
/* Define various constants for the port. */
|
|
||||||
|
|
||||||
#ifndef NX_IP_PERIODIC_RATE
|
|
||||||
#ifdef TX_TIMER_TICKS_PER_SECOND
|
|
||||||
#define NX_IP_PERIODIC_RATE TX_TIMER_TICKS_PER_SECOND
|
|
||||||
#else
|
|
||||||
#define NX_IP_PERIODIC_RATE 10
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define macros that swap the endian for little endian ports. */
|
/* Define macros that swap the endian for little endian ports. */
|
||||||
#ifdef NX_LITTLE_ENDIAN
|
#ifdef NX_LITTLE_ENDIAN
|
||||||
#define NX_CHANGE_ULONG_ENDIAN(arg) \
|
#define NX_CHANGE_ULONG_ENDIAN(arg) \
|
||||||
|
|||||||
@@ -61,11 +61,8 @@
|
|||||||
|
|
||||||
/* Define the base exponent of 2 for huge number.
|
/* Define the base exponent of 2 for huge number.
|
||||||
* Only 16 and 32 are supported. */
|
* Only 16 and 32 are supported. */
|
||||||
#if __riscv_xlen == 64
|
|
||||||
#define NX_CRYPTO_HUGE_NUMBER_BITS 16
|
|
||||||
#else
|
|
||||||
#define NX_CRYPTO_HUGE_NUMBER_BITS 32
|
#define NX_CRYPTO_HUGE_NUMBER_BITS 32
|
||||||
#endif
|
#define NX_DIRECT_ISR_CALL 1
|
||||||
/* Define various build options for the NetX Duo port. The application should either make changes
|
/* Define various build options for the NetX Duo port. The application should either make changes
|
||||||
here by commenting or un-commenting the conditional compilation defined OR supply the defines
|
here by commenting or un-commenting the conditional compilation defined OR supply the defines
|
||||||
though the compiler's equivalent of the -D option. */
|
though the compiler's equivalent of the -D option. */
|
||||||
@@ -79,10 +76,8 @@
|
|||||||
present to NetX Duo IP layer. Physical interface does not include
|
present to NetX Duo IP layer. Physical interface does not include
|
||||||
loopback interface. By default there is at least one physical interface
|
loopback interface. By default there is at least one physical interface
|
||||||
in the system. */
|
in the system. */
|
||||||
|
|
||||||
#define NX_MAX_PHYSICAL_INTERFACES 2
|
#define NX_MAX_PHYSICAL_INTERFACES 2
|
||||||
|
|
||||||
|
|
||||||
/* Defined, this option disables NetX Duo support on the 127.0.0.1 loopback interface.
|
/* Defined, this option disables NetX Duo support on the 127.0.0.1 loopback interface.
|
||||||
127.0.0.1 loopback interface is enabled by default. Uncomment out the follow code to disable
|
127.0.0.1 loopback interface is enabled by default. Uncomment out the follow code to disable
|
||||||
the loopback interface. */
|
the loopback interface. */
|
||||||
@@ -99,13 +94,11 @@
|
|||||||
|
|
||||||
/* This defines specifies the number of ThreadX timer ticks in one second. The default value is based
|
/* This defines specifies the number of ThreadX timer ticks in one second. The default value is based
|
||||||
on ThreadX timer interrupt. */
|
on ThreadX timer interrupt. */
|
||||||
/*
|
|
||||||
#ifdef TX_TIMER_TICKS_PER_SECOND
|
#ifdef TX_TIMER_TICKS_PER_SECOND
|
||||||
#define NX_IP_PERIODIC_RATE TX_TIMER_TICKS_PER_SECOND
|
#define NX_IP_PERIODIC_RATE TX_TIMER_TICKS_PER_SECOND
|
||||||
#else
|
#else
|
||||||
#define NX_IP_PERIODIC_RATE 100
|
#define NX_IP_PERIODIC_RATE 100
|
||||||
#endif
|
#endif
|
||||||
*/
|
|
||||||
|
|
||||||
/* Defined, NX_ENABLE_IP_RAW_PACKET_FILTER allows an application to install a filter
|
/* Defined, NX_ENABLE_IP_RAW_PACKET_FILTER allows an application to install a filter
|
||||||
for incoming raw packets. This feature is disabled by default. */
|
for incoming raw packets. This feature is disabled by default. */
|
||||||
|
|||||||
@@ -130,7 +130,7 @@
|
|||||||
Note: the actual hardware timer value may need to be changed (usually in tx_initialize_low_level). */
|
Note: the actual hardware timer value may need to be changed (usually in tx_initialize_low_level). */
|
||||||
|
|
||||||
|
|
||||||
#define TX_TIMER_TICKS_PER_SECOND (33UL) // for moonlight with 32,7kHz Frequency (divided by 1000)
|
#define TX_TIMER_TICKS_PER_SECOND (100) // for moonlight with 32,7kHz Frequency (divided by 1000)
|
||||||
|
|
||||||
|
|
||||||
/* Determine if there is a FileX pointer in the thread control block.
|
/* Determine if there is a FileX pointer in the thread control block.
|
||||||
|
|||||||
@@ -134,7 +134,8 @@ void thread_0_entry(ULONG thread_input) {
|
|||||||
|
|
||||||
NX_PARAMETER_NOT_USED(thread_input);
|
NX_PARAMETER_NOT_USED(thread_input);
|
||||||
|
|
||||||
tx_thread_sleep(NX_IP_PERIODIC_RATE);
|
/* Wait 1 second for the IP thread to finish its initilization. */
|
||||||
|
tx_thread_sleep(/* NX_IP_PERIODIC_RATE */ 10);
|
||||||
|
|
||||||
/* set the TCP server addresses. */
|
/* set the TCP server addresses. */
|
||||||
server_ipv4_address.nxd_ip_version = NX_IP_VERSION_V4;
|
server_ipv4_address.nxd_ip_version = NX_IP_VERSION_V4;
|
||||||
@@ -234,7 +235,7 @@ void thread_1_entry(ULONG thread_input) {
|
|||||||
NX_PARAMETER_NOT_USED(thread_input);
|
NX_PARAMETER_NOT_USED(thread_input);
|
||||||
|
|
||||||
/* Wait 1 second for the IP thread to finish its initilization. */
|
/* Wait 1 second for the IP thread to finish its initilization. */
|
||||||
tx_thread_sleep(NX_IP_PERIODIC_RATE);
|
tx_thread_sleep(/* NX_IP_PERIODIC_RATE */ 10);
|
||||||
|
|
||||||
/* Ensure the IP instance has been initialized. */
|
/* Ensure the IP instance has been initialized. */
|
||||||
status = nx_ip_status_check(&ip_1, NX_IP_INITIALIZE_DONE, &actual_status, NX_IP_PERIODIC_RATE);
|
status = nx_ip_status_check(&ip_1, NX_IP_INITIALIZE_DONE, &actual_status, NX_IP_PERIODIC_RATE);
|
||||||
|
|||||||
Reference in New Issue
Block a user