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