1

Committer:
valeyev
Date:
Tue Mar 13 07:17:50 2018 +0000
Revision:
0:e056ac8fecf8
looking for...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
valeyev 0:e056ac8fecf8 1 /* mbed Microcontroller Library
valeyev 0:e056ac8fecf8 2 * Copyright (c) 2016 ARM Limited
valeyev 0:e056ac8fecf8 3 *
valeyev 0:e056ac8fecf8 4 * Licensed under the Apache License, Version 2.0 (the "License");
valeyev 0:e056ac8fecf8 5 * you may not use this file except in compliance with the License.
valeyev 0:e056ac8fecf8 6 * You may obtain a copy of the License at
valeyev 0:e056ac8fecf8 7 *
valeyev 0:e056ac8fecf8 8 * http://www.apache.org/licenses/LICENSE-2.0
valeyev 0:e056ac8fecf8 9 *
valeyev 0:e056ac8fecf8 10 * Unless required by applicable law or agreed to in writing, software
valeyev 0:e056ac8fecf8 11 * distributed under the License is distributed on an "AS IS" BASIS,
valeyev 0:e056ac8fecf8 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
valeyev 0:e056ac8fecf8 13 * See the License for the specific language governing permissions and
valeyev 0:e056ac8fecf8 14 * limitations under the License.
valeyev 0:e056ac8fecf8 15 */
valeyev 0:e056ac8fecf8 16
valeyev 0:e056ac8fecf8 17 #ifndef MBED_EMAC_API_H
valeyev 0:e056ac8fecf8 18 #define MBED_EMAC_API_H
valeyev 0:e056ac8fecf8 19
valeyev 0:e056ac8fecf8 20 #if DEVICE_EMAC
valeyev 0:e056ac8fecf8 21
valeyev 0:e056ac8fecf8 22 #include <stdbool.h>
valeyev 0:e056ac8fecf8 23 #include "emac_stack_mem.h"
valeyev 0:e056ac8fecf8 24
valeyev 0:e056ac8fecf8 25 typedef struct emac_interface emac_interface_t;
valeyev 0:e056ac8fecf8 26
valeyev 0:e056ac8fecf8 27 /**
valeyev 0:e056ac8fecf8 28 * EmacInterface
valeyev 0:e056ac8fecf8 29 *
valeyev 0:e056ac8fecf8 30 * This interface should be used to abstract low level access to networking hardware
valeyev 0:e056ac8fecf8 31 */
valeyev 0:e056ac8fecf8 32
valeyev 0:e056ac8fecf8 33 /**
valeyev 0:e056ac8fecf8 34 * Callback to be register with Emac interface and to be called fore received packets
valeyev 0:e056ac8fecf8 35 *
valeyev 0:e056ac8fecf8 36 * @param data Arbitrary user data (IP stack)
valeyev 0:e056ac8fecf8 37 * @param buf Received data
valeyev 0:e056ac8fecf8 38 */
valeyev 0:e056ac8fecf8 39 typedef void (*emac_link_input_fn)(void *data, emac_stack_mem_chain_t *buf);
valeyev 0:e056ac8fecf8 40
valeyev 0:e056ac8fecf8 41 /**
valeyev 0:e056ac8fecf8 42 * Callback to be register with Emac interface and to be called for link status changes
valeyev 0:e056ac8fecf8 43 *
valeyev 0:e056ac8fecf8 44 * @param data Arbitrary user data (IP stack)
valeyev 0:e056ac8fecf8 45 * @param up Link status
valeyev 0:e056ac8fecf8 46 */
valeyev 0:e056ac8fecf8 47 typedef void (*emac_link_state_change_fn)(void *data, bool up);
valeyev 0:e056ac8fecf8 48
valeyev 0:e056ac8fecf8 49 /**
valeyev 0:e056ac8fecf8 50 * Return maximum transmission unit
valeyev 0:e056ac8fecf8 51 *
valeyev 0:e056ac8fecf8 52 * @param emac Emac interface
valeyev 0:e056ac8fecf8 53 * @return MTU in bytes
valeyev 0:e056ac8fecf8 54 */
valeyev 0:e056ac8fecf8 55 typedef uint32_t (*emac_get_mtu_size_fn)(emac_interface_t *emac);
valeyev 0:e056ac8fecf8 56
valeyev 0:e056ac8fecf8 57 /**
valeyev 0:e056ac8fecf8 58 * Return interface name
valeyev 0:e056ac8fecf8 59 *
valeyev 0:e056ac8fecf8 60 * @param emac Emac interface
valeyev 0:e056ac8fecf8 61 * @param name Pointer to where the name should be written
valeyev 0:e056ac8fecf8 62 * @param size Maximum number of character to copy
valeyev 0:e056ac8fecf8 63 */
valeyev 0:e056ac8fecf8 64 typedef void (*emac_get_ifname_fn)(emac_interface_t *emac, char *name, uint8_t size);
valeyev 0:e056ac8fecf8 65
valeyev 0:e056ac8fecf8 66 /**
valeyev 0:e056ac8fecf8 67 * Returns size of the underlying interface HW address size
valeyev 0:e056ac8fecf8 68 *
valeyev 0:e056ac8fecf8 69 * @param emac Emac interface
valeyev 0:e056ac8fecf8 70 * @return HW address size in bytes
valeyev 0:e056ac8fecf8 71 */
valeyev 0:e056ac8fecf8 72 typedef uint8_t (*emac_get_hwaddr_size_fn)(emac_interface_t *emac);
valeyev 0:e056ac8fecf8 73
valeyev 0:e056ac8fecf8 74 /**
valeyev 0:e056ac8fecf8 75 * Return interface hw address
valeyev 0:e056ac8fecf8 76 *
valeyev 0:e056ac8fecf8 77 * Copies HW address to provided memory, @param addr has to be of correct size see @a get_hwaddr_size
valeyev 0:e056ac8fecf8 78 *
valeyev 0:e056ac8fecf8 79 * @param emac Emac interface
valeyev 0:e056ac8fecf8 80 * @param addr HW address for underlying interface
valeyev 0:e056ac8fecf8 81 */
valeyev 0:e056ac8fecf8 82 typedef void (*emac_get_hwaddr_fn)(emac_interface_t *emac, uint8_t *addr);
valeyev 0:e056ac8fecf8 83
valeyev 0:e056ac8fecf8 84 /**
valeyev 0:e056ac8fecf8 85 * Set HW address for interface
valeyev 0:e056ac8fecf8 86 *
valeyev 0:e056ac8fecf8 87 * Provided address has to be of correct size, see @a get_hwaddr_size
valeyev 0:e056ac8fecf8 88 *
valeyev 0:e056ac8fecf8 89 * @param emac Emac interface
valeyev 0:e056ac8fecf8 90 * @param addr Address to be set
valeyev 0:e056ac8fecf8 91 */
valeyev 0:e056ac8fecf8 92 typedef void (*emac_set_hwaddr_fn)(emac_interface_t *emac, uint8_t *addr);
valeyev 0:e056ac8fecf8 93
valeyev 0:e056ac8fecf8 94 /**
valeyev 0:e056ac8fecf8 95 * Sends the packet over the link
valeyev 0:e056ac8fecf8 96 *
valeyev 0:e056ac8fecf8 97 * That can not be called from an interrupt context.
valeyev 0:e056ac8fecf8 98 *
valeyev 0:e056ac8fecf8 99 * @param emac Emac interface
valeyev 0:e056ac8fecf8 100 * @param buf Packet to be send
valeyev 0:e056ac8fecf8 101 * @return True if the packet was send successfully, False otherwise
valeyev 0:e056ac8fecf8 102 */
valeyev 0:e056ac8fecf8 103 typedef bool (*emac_link_out_fn)(emac_interface_t *emac, emac_stack_mem_t *buf);
valeyev 0:e056ac8fecf8 104
valeyev 0:e056ac8fecf8 105 /**
valeyev 0:e056ac8fecf8 106 * Initializes the HW
valeyev 0:e056ac8fecf8 107 *
valeyev 0:e056ac8fecf8 108 * @return True on success, False in case of an error.
valeyev 0:e056ac8fecf8 109 */
valeyev 0:e056ac8fecf8 110 typedef bool (*emac_power_up_fn)(emac_interface_t *emac);
valeyev 0:e056ac8fecf8 111
valeyev 0:e056ac8fecf8 112 /**
valeyev 0:e056ac8fecf8 113 * Deinitializes the HW
valeyev 0:e056ac8fecf8 114 *
valeyev 0:e056ac8fecf8 115 * @param emac Emac interface
valeyev 0:e056ac8fecf8 116 */
valeyev 0:e056ac8fecf8 117 typedef void (*emac_power_down_fn)(emac_interface_t *emac);
valeyev 0:e056ac8fecf8 118
valeyev 0:e056ac8fecf8 119 /**
valeyev 0:e056ac8fecf8 120 * Sets a callback that needs to be called for packets received for that interface
valeyev 0:e056ac8fecf8 121 *
valeyev 0:e056ac8fecf8 122 * @param emac Emac interface
valeyev 0:e056ac8fecf8 123 * @param input_cb Function to be register as a callback
valeyev 0:e056ac8fecf8 124 * @param data Arbitrary user data to be passed to the callback
valeyev 0:e056ac8fecf8 125 */
valeyev 0:e056ac8fecf8 126 typedef void (*emac_set_link_input_cb_fn)(emac_interface_t *emac, emac_link_input_fn input_cb, void *data);
valeyev 0:e056ac8fecf8 127
valeyev 0:e056ac8fecf8 128 /**
valeyev 0:e056ac8fecf8 129 * Sets a callback that needs to be called on link status changes for given interface
valeyev 0:e056ac8fecf8 130 *
valeyev 0:e056ac8fecf8 131 * @param emac Emac interface
valeyev 0:e056ac8fecf8 132 * @param state_cb Function to be register as a callback
valeyev 0:e056ac8fecf8 133 * @param data Arbitrary user data to be passed to the callback
valeyev 0:e056ac8fecf8 134 */
valeyev 0:e056ac8fecf8 135 typedef void (*emac_set_link_state_cb_fn)(emac_interface_t *emac, emac_link_state_change_fn state_cb, void *data);
valeyev 0:e056ac8fecf8 136
valeyev 0:e056ac8fecf8 137 typedef struct emac_interface_ops {
valeyev 0:e056ac8fecf8 138 emac_get_mtu_size_fn get_mtu_size;
valeyev 0:e056ac8fecf8 139 emac_get_ifname_fn get_ifname;
valeyev 0:e056ac8fecf8 140 emac_get_hwaddr_size_fn get_hwaddr_size;
valeyev 0:e056ac8fecf8 141 emac_get_hwaddr_fn get_hwaddr;
valeyev 0:e056ac8fecf8 142 emac_set_hwaddr_fn set_hwaddr;
valeyev 0:e056ac8fecf8 143 emac_link_out_fn link_out;
valeyev 0:e056ac8fecf8 144 emac_power_up_fn power_up;
valeyev 0:e056ac8fecf8 145 emac_power_down_fn power_down;
valeyev 0:e056ac8fecf8 146 emac_set_link_input_cb_fn set_link_input_cb;
valeyev 0:e056ac8fecf8 147 emac_set_link_state_cb_fn set_link_state_cb;
valeyev 0:e056ac8fecf8 148 } emac_interface_ops_t;
valeyev 0:e056ac8fecf8 149
valeyev 0:e056ac8fecf8 150 typedef struct emac_interface {
valeyev 0:e056ac8fecf8 151 const emac_interface_ops_t ops;
valeyev 0:e056ac8fecf8 152 void *hw;
valeyev 0:e056ac8fecf8 153 } emac_interface_t;
valeyev 0:e056ac8fecf8 154
valeyev 0:e056ac8fecf8 155 #else
valeyev 0:e056ac8fecf8 156
valeyev 0:e056ac8fecf8 157 typedef void *emac_interface_t;
valeyev 0:e056ac8fecf8 158
valeyev 0:e056ac8fecf8 159 #endif /* DEVICE_EMAC */
valeyev 0:e056ac8fecf8 160 #endif /* MBED_EMAC_API_H */