Mistake on this page?
Report an issue in GitHub or email us
kinetis_emac.h
1 /* Copyright (c) 2017 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 
17 #ifndef KINETIS_EMAC_H_
18 #define KINETIS_EMAC_H_
19 
20 #include "EMAC.h"
21 #include "rtos/Semaphore.h"
22 #include "rtos/Mutex.h"
23 
24 class Kinetis_EMAC : public EMAC {
25 public:
26  Kinetis_EMAC();
27 
28  static Kinetis_EMAC &get_instance();
29 
30  /**
31  * Return maximum transmission unit
32  *
33  * @return MTU in bytes
34  */
35  virtual uint32_t get_mtu_size() const;
36 
37  /**
38  * Gets memory buffer alignment preference
39  *
40  * Gets preferred memory buffer alignment of the Emac device. IP stack may or may not
41  * align link out memory buffer chains using the alignment.
42  *
43  * @return Memory alignment requirement in bytes
44  */
45  virtual uint32_t get_align_preference() const;
46 
47  /**
48  * Return interface name
49  *
50  * @param name Pointer to where the name should be written
51  * @param size Maximum number of character to copy
52  */
53  virtual void get_ifname(char *name, uint8_t size) const;
54 
55  /**
56  * Returns size of the underlying interface HW address size.
57  *
58  * @return HW address size in bytes
59  */
60  virtual uint8_t get_hwaddr_size() const;
61 
62  /**
63  * Return interface-supplied HW address
64  *
65  * Copies HW address to provided memory, @param addr has to be of correct size see @a get_hwaddr_size
66  *
67  * HW address need not be provided if this interface does not have its own HW
68  * address configuration; stack will choose address from central system
69  * configuration if the function returns false and does not write to addr.
70  *
71  * @param addr HW address for underlying interface
72  * @return true if HW address is available
73  */
74  virtual bool get_hwaddr(uint8_t *addr) const;
75 
76  /**
77  * Set HW address for interface
78  *
79  * Provided address has to be of correct size, see @a get_hwaddr_size
80  *
81  * Called to set the MAC address to actually use - if @a get_hwaddr is provided
82  * the stack would normally use that, but it could be overridden, eg for test
83  * purposes.
84  *
85  * @param addr Address to be set
86  */
87  virtual void set_hwaddr(const uint8_t *addr);
88 
89  /**
90  * Sends the packet over the link
91  *
92  * That can not be called from an interrupt context.
93  *
94  * @param buf Packet to be send
95  * @return True if the packet was send successfully, False otherwise
96  */
97  virtual bool link_out(emac_mem_buf_t *buf);
98 
99  /**
100  * Initializes the HW
101  *
102  * @return True on success, False in case of an error.
103  */
104  virtual bool power_up();
105 
106  /**
107  * Deinitializes the HW
108  *
109  */
110  virtual void power_down();
111 
112  /**
113  * Sets a callback that needs to be called for packets received for that interface
114  *
115  * @param input_cb Function to be register as a callback
116  */
117  virtual void set_link_input_cb(emac_link_input_cb_t input_cb);
118 
119  /**
120  * Sets a callback that needs to be called on link status changes for given interface
121  *
122  * @param state_cb Function to be register as a callback
123  */
124  virtual void set_link_state_cb(emac_link_state_change_cb_t state_cb);
125 
126  /** Add device to a multicast group
127  *
128  * @param address A multicast group hardware address
129  */
130  virtual void add_multicast_group(const uint8_t *address);
131 
132  /** Remove device from a multicast group
133  *
134  * @param address A multicast group hardware address
135  */
136  virtual void remove_multicast_group(const uint8_t *address);
137 
138  /** Request reception of all multicast packets
139  *
140  * @param all True to receive all multicasts
141  * False to receive only multicasts addressed to specified groups
142  */
143  virtual void set_all_multicast(bool all);
144 
145  /** Sets memory manager that is used to handle memory buffers
146  *
147  * @param mem_mngr Pointer to memory manager
148  */
149  virtual void set_memory_manager(EMACMemoryManager &mem_mngr);
150 
151 private:
152  bool low_level_init_successful();
153  void rx_isr();
154  void tx_isr();
155  void packet_rx();
156  void packet_tx();
157  void tx_reclaim();
158  void input(int idx);
159  emac_mem_buf_t *low_level_input(int idx);
160  static void thread_function(void* pvParameters);
161  void phy_task();
162  static void ethernet_callback(ENET_Type *base, enet_handle_t *handle, enet_event_t event, void *param);
163 
164  mbed_rtos_storage_thread_t thread_cb;
165  osThreadId_t thread; /**< Processing thread */
166  rtos::Mutex TXLockMutex;/**< TX critical section mutex */
167  rtos::Semaphore xTXDCountSem; /**< TX free buffer counting semaphore */
168  uint8_t tx_consume_index, tx_produce_index; /**< TX buffers ring */
169  emac_link_input_cb_t emac_link_input_cb; /**< Callback for incoming data */
170  emac_link_state_change_cb_t emac_link_state_cb; /**< Link state change callback */
171  EMACMemoryManager *memory_manager; /**< Memory manager */
172  int phy_task_handle; /**< Handle for phy task event */
173  struct PHY_STATE {
174  int connected;
175  phy_speed_t speed;
176  phy_duplex_t duplex;
177  };
178  PHY_STATE prev_state;
179  uint8_t hwaddr[KINETIS_HWADDR_SIZE];
180 };
181 
182 #endif /* KINETIS_EMAC_H_ */
virtual void set_all_multicast(bool all)
Request reception of all multicast packets.
virtual void get_ifname(char *name, uint8_t size) const
Return interface name.
virtual uint8_t get_hwaddr_size() const
Returns size of the underlying interface HW address size.
The Semaphore class is used to manage and protect access to a set of shared resources.
Definition: Semaphore.h:46
virtual uint32_t get_align_preference() const
Gets memory buffer alignment preference.
virtual void remove_multicast_group(const uint8_t *address)
Remove device from a multicast group.
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 set_memory_manager(EMACMemoryManager &mem_mngr)
Sets memory manager that is used to handle memory buffers.
virtual void set_hwaddr(const uint8_t *addr)
Set HW address for interface.
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:48
The Mutex class is used to synchronize the execution of threads.
Definition: Mutex.h:66
virtual bool power_up()
Initializes the HW.
virtual bool get_hwaddr(uint8_t *addr) const
Return interface-supplied HW address.
virtual void add_multicast_group(const uint8_t *address)
Add device to a multicast group.
This interface should be used to abstract low level access to networking hardware All operations rece...
Definition: EMAC.h:32
virtual void power_down()
Deinitializes the HW.
virtual bool link_out(emac_mem_buf_t *buf)
Sends the packet over the link.
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.
Callback class based on template specialization.
Definition: Callback.h:39
virtual uint32_t get_mtu_size() const
Return maximum transmission unit.
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.