Mistake on this page?
Report an issue in GitHub or email us
lpc17_emac.h
1 /* Copyright (c) 2018 ARM Limited
2  * SPDX-License-Identifier: Apache-2.0
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #ifndef LPC17_EMAC_H_
17 #define LPC17_EMAC_H_
18 
19 #include "EMAC.h"
20 #include "rtos/Semaphore.h"
21 #include "rtos/Mutex.h"
22 
23 #include "lpc_emac_config.h"
24 
25 class LPC17_EMAC : public EMAC {
26 public:
27  LPC17_EMAC();
28 
29  static LPC17_EMAC &get_instance();
30 
31  /**
32  * Return maximum transmission unit
33  *
34  * @return MTU in bytes
35  */
36  virtual uint32_t get_mtu_size() const;
37 
38  /**
39  * Gets memory buffer alignment preference
40  *
41  * Gets preferred memory buffer alignment of the Emac device. IP stack may or may not
42  * align link out memory buffer chains using the alignment.
43  *
44  * @return Memory alignment requirement in bytes
45  */
46  virtual uint32_t get_align_preference() const;
47 
48  /**
49  * Return interface name
50  *
51  * @param name Pointer to where the name should be written
52  * @param size Maximum number of character to copy
53  */
54  virtual void get_ifname(char *name, uint8_t size) const;
55 
56  /**
57  * Returns size of the underlying interface HW address size.
58  *
59  * @return HW address size in bytes
60  */
61  virtual uint8_t get_hwaddr_size() const;
62 
63  /**
64  * Return interface-supplied HW address
65  *
66  * Copies HW address to provided memory, @param addr has to be of correct size see @a get_hwaddr_size
67  *
68  * HW address need not be provided if this interface does not have its own HW
69  * address configuration; stack will choose address from central system
70  * configuration if the function returns false and does not write to addr.
71  *
72  * @param addr HW address for underlying interface
73  * @return true if HW address is available
74  */
75  virtual bool get_hwaddr(uint8_t *addr) const;
76 
77  /**
78  * Set HW address for interface
79  *
80  * Provided address has to be of correct size, see @a get_hwaddr_size
81  *
82  * Called to set the MAC address to actually use - if @a get_hwaddr is provided
83  * the stack would normally use that, but it could be overridden, eg for test
84  * purposes.
85  *
86  * @param addr Address to be set
87  */
88  virtual void set_hwaddr(const uint8_t *addr);
89 
90  /**
91  * Sends the packet over the link
92  *
93  * That can not be called from an interrupt context.
94  *
95  * @param buf Packet to be send
96  * @return True if the packet was send successfully, False otherwise
97  */
98  virtual bool link_out(emac_mem_buf_t *buf);
99 
100  /**
101  * Initializes the HW
102  *
103  * @return True on success, False in case of an error.
104  */
105  virtual bool power_up();
106 
107  /**
108  * Deinitializes the HW
109  *
110  */
111  virtual void power_down();
112 
113  /**
114  * Sets a callback that needs to be called for packets received for that interface
115  *
116  * @param input_cb Function to be register as a callback
117  */
118  virtual void set_link_input_cb(emac_link_input_cb_t input_cb);
119 
120  /**
121  * Sets a callback that needs to be called on link status changes for given interface
122  *
123  * @param state_cb Function to be register as a callback
124  */
125  virtual void set_link_state_cb(emac_link_state_change_cb_t state_cb);
126 
127  /** Add device to a multicast group
128  *
129  * @param address A multicast group hardware address
130  */
131  virtual void add_multicast_group(const uint8_t *address);
132 
133  /** Remove device from a multicast group
134  *
135  * @param address A multicast group hardware address
136  */
137  virtual void remove_multicast_group(const uint8_t *address);
138 
139  /** Request reception of all multicast packets
140  *
141  * @param all True to receive all multicasts
142  * False to receive only multicasts addressed to specified groups
143  */
144  virtual void set_all_multicast(bool all);
145 
146  /** Sets memory manager that is used to handle memory buffers
147  *
148  * @param mem_mngr Pointer to memory manager
149  */
150  virtual void set_memory_manager(EMACMemoryManager &mem_mngr);
151 
152  void update_link_status(bool up);
153 
154  osThreadId_t RxThread;
155  mbed_rtos_storage_thread_t RxThread_cb;
156  rtos::Semaphore TxCleanSem;
157 
158 private:
159  void lpc_rxqueue_pbuf(emac_mem_buf_t *p);
160  int32_t lpc_rx_queue();
161  bool lpc_rx_setup();
162  emac_mem_buf_t *lpc_low_level_input();
163  void lpc_enetif_input();
164  int32_t lpc_packet_addr_notsafe(void *addr);
165  bool lpc_tx_setup();
166  void lpc_tx_reclaim_st(uint32_t cidx);
167  void lpc_tx_reclaim();
168  int32_t lpc_tx_ready();
169  static void packet_rx(void* pvParameters);
170  static void packet_tx(void* pvParameters);
171  bool low_level_init();
172  static void phy_update(void *nif);
173  bool eth_arch_enetif_init();
174  void eth_arch_enable_interrupts();
175  void eth_arch_disable_interrupts();
176 
177  uint8_t hwaddr[6];
178 
179  osThreadId_t TxCleanThread;
180  mbed_rtos_storage_thread_t TxCleanThread_cb;
181  osThreadId_t PhyThread;
182  mbed_rtos_storage_thread_t PhyThread_cb;
183  rtos::Mutex TXLockMutex;
184  rtos::Semaphore xTXDCountSem;
185 
186  emac_link_input_cb_t emac_link_input_cb; /**< Callback for incoming data */
187  emac_link_state_change_cb_t emac_link_state_cb; /**< Link state change callback */
188 
189  EMACMemoryManager *memory_manager; /**< Memory manager */
190 };
191 
192 #endif
virtual uint32_t get_align_preference() const
Gets memory buffer alignment preference.
The Semaphore class is used to manage and protect access to a set of shared resources.
Definition: Semaphore.h:50
virtual void power_down()
Deinitializes the HW.
virtual void set_link_state_cb(emac_link_state_change_cb_t state_cb)
Sets a callback that needs to be called on link status changes for given interface.
virtual void remove_multicast_group(const uint8_t *address)
Remove device from a multicast group.
virtual uint8_t get_hwaddr_size() const
Returns size of the underlying interface HW address size.
virtual uint32_t get_mtu_size() const
Return maximum transmission unit.
virtual void set_memory_manager(EMACMemoryManager &mem_mngr)
Sets memory manager that is used to handle memory buffers.
PHY and EMAC configuration file.
mbed::Callback< void(emac_mem_buf_t *buf)> emac_link_input_cb_t
Callback to be register with EMAC interface and to be called for received packets.
Definition: EMAC.h:49
virtual void add_multicast_group(const uint8_t *address)
Add device to a multicast group.
The Mutex class is used to synchronize the execution of threads.
Definition: Mutex.h:70
virtual bool get_hwaddr(uint8_t *addr) const
Return interface-supplied HW address.
virtual void set_hwaddr(const uint8_t *addr)
Set HW address for interface.
virtual bool link_out(emac_mem_buf_t *buf)
Sends the packet over the link.
virtual bool power_up()
Initializes the HW.
This interface should be used to abstract low level access to networking hardware All operations rece...
Definition: EMAC.h:33
virtual void set_all_multicast(bool all)
Request reception of all multicast packets.
virtual void set_link_input_cb(emac_link_input_cb_t input_cb)
Sets a callback that needs to be called for packets received for that interface.
virtual void get_ifname(char *name, uint8_t size) const
Return interface name.
Important Information for this Arm website

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies. If you are not happy with the use of these cookies, please review our Cookie Policy to learn how they can be disabled. By disabling cookies, some features of the site will not work.