aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/platforms/AT91SAM7/mac_lld.h
blob: 5184be95483b0398c94e35fff4ebbd22ed38a0bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/*
    ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.

    This file is part of ChibiOS/RT.

    ChibiOS/RT is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    ChibiOS/RT is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/**
 * @file AT91SAM7/mac_lld.h
 * @brief AT91SAM7 low level MAC driver header
 * @addtogroup AT91SAM7_MAC
 * @{
 */

#ifndef _MAC_LLD_H_
#define _MAC_LLD_H_

/*===========================================================================*/
/* Driver pre-compile time settings.                                         */
/*===========================================================================*/

/**
 * @brief Number of available transmit buffers.
 */
#if !defined(MAC_TRANSMIT_BUFFERS) || defined(__DOXYGEN__)
#define MAC_TRANSMIT_BUFFERS            2
#endif

/**
 * @brief Number of available receive buffers.
 */
#if !defined(MAC_RECEIVE_BUFFERS) || defined(__DOXYGEN__)
#define MAC_RECEIVE_BUFFERS             2
#endif

/**
 * @brief Maximum supported frame size.
 */
#if !defined(MAC_BUFFERS_SIZE) || defined(__DOXYGEN__)
#define MAC_BUFFERS_SIZE                1518
#endif

/*===========================================================================*/
/* EMAC specific settings.                                                   */
/*===========================================================================*/

/**
 * @brief Interrupt priority level for the EMAC device.
 */
#if !defined(EMAC_INTERRUPT_PRIORITY) || defined(__DOXYGEN__)
#define EMAC_INTERRUPT_PRIORITY         (AT91C_AIC_PRIOR_HIGHEST - 3)
#endif

/*===========================================================================*/
/* EMAC specific constants.                                                  */
/*===========================================================================*/

#define EMAC_RECEIVE_BUFFERS_SIZE       128     /* Do not modify */
#define EMAC_TRANSMIT_BUFFERS_SIZE      MAC_BUFFERS_SIZE
#define EMAC_RECEIVE_DESCRIPTORS                                            \
    (((((MAC_BUFFERS_SIZE - 1) | (EMAC_RECEIVE_BUFFERS_SIZE - 1)) + 1)      \
      / EMAC_RECEIVE_BUFFERS_SIZE) * MAC_RECEIVE_BUFFERS)
#define EMAC_TRANSMIT_DESCRIPTORS       MAC_TRANSMIT_BUFFERS

#define W1_R_OWNERSHIP          0x00000001
#define W1_R_WRAP               0x00000002
#define W1_R_ADDRESS_MASK       0xFFFFFFFC

#define W2_R_LENGTH_MASK        0x00000FFF
#define W2_R_FRAME_START        0x00004000
#define W2_R_FRAME_END          0x00008000
#define W2_R_CFI                0x00010000
#define W2_R_VLAN_PRIO_MASK     0x000E0000
#define W2_R_PRIO_TAG_DETECTED  0x00100000
#define W2_R_VLAN_TAG_DETECTED  0x00200000
#define W2_R_TYPE_ID_MATCH      0x00400000
#define W2_R_ADDR4_MATCH        0x00800000
#define W2_R_ADDR3_MATCH        0x01000000
#define W2_R_ADDR2_MATCH        0x02000000
#define W2_R_ADDR1_MATCH        0x04000000
#define W2_R_RFU1               0x08000000
#define W2_R_ADDR_EXT_MATCH     0x10000000
#define W2_R_UNICAST_MATCH      0x20000000
#define W2_R_MULTICAST_MATCH    0x40000000
#define W2_R_BROADCAST_DETECTED 0x80000000

#define W1_T_ADDRESS_MASK       0xFFFFFFFF

#define W2_T_LENGTH_MASK        0x000007FF
#define W2_T_LOCKED             0x00000800 /* Not an EMAC flag, used by the driver */
#define W2_T_RFU1               0x00003000
#define W2_T_LAST_BUFFER        0x00008000
#define W2_T_NO_CRC             0x00010000
#define W2_T_RFU2               0x07FE0000
#define W2_T_BUFFERS_EXHAUSTED  0x08000000
#define W2_T_TRANSMIT_UNDERRUN  0x10000000
#define W2_T_RETRY_LIMIT_EXC    0x20000000
#define W2_T_WRAP               0x40000000
#define W2_T_USED               0x80000000

/*===========================================================================*/
/* Driver data structures and types.                                         */
/*===========================================================================*/

/**
 * @brief Structure representing a buffer physical descriptor.
 * @note It represents both descriptor types.
 */
typedef struct {
  uint32_t              w1;
  uint32_t              w2;
} EMACDescriptor;

/**
 * @brief Structure representing a MAC driver.
 */
typedef struct {
  Semaphore             md_tdsem;       /**< Transmit semaphore.        */
  Semaphore             md_rdsem;       /**< Receive semaphore.         */
#if CH_USE_EVENTS
  EventSource           md_rdevent;     /**< Receive event source.      */
#endif
  /* End of the mandatory fields.*/
} MACDriver;

/**
 * @brief Structure representing a transmit descriptor.
 */
typedef struct {
  size_t                td_offset;      /**< Current write offset.      */
  size_t                td_size;        /**< Available space size.      */
  /* End of the mandatory fields.*/
  EMACDescriptor        *td_physdesc;   /**< Pointer to the physical
                                             descriptor.                */
} MACTransmitDescriptor;

/**
 * @brief Structure representing a receive descriptor.
 */
typedef struct {
  size_t                rd_offset;      /**< Current read offset.       */
  size_t                rd_size;        /**< Available data size.       */
  /* End of the mandatory fields.*/
  EMACDescriptor        *rd_physdesc;   /**< Pointer to the first descriptor
                                             of the buffers chain.      */
} MACReceiveDescriptor;

/*===========================================================================*/
/* External declarations.                                                    */
/*===========================================================================*/

/** @cond never*/
extern MACDriver ETH1;

#ifdef __cplusplus
extern "C" {
#endif
  void mac_lld_init(void);
  void mac_lld_set_address(MACDriver *macp, const uint8_t *p);
  msg_t max_lld_get_transmit_descriptor(MACDriver *macp,
                                        MACTransmitDescriptor *tdp);
  size_t mac_lld_write_transmit_descriptor(MACTransmitDescriptor *tdp,
                                           uint8_t *buf,
                                           size_t size);
  void mac_lld_release_transmit_descriptor(MACTransmitDescriptor *tdp);
  msg_t max_lld_get_receive_descriptor(MACDriver *macp,
                                       MACReceiveDescriptor *rdp);
  size_t mac_lld_read_receive_descriptor(MACReceiveDescriptor *rdp,
                                         uint8_t *buf,
                                         size_t size);
  void mac_lld_release_receive_descriptor(MACReceiveDescriptor *rdp);
  bool_t mac_lld_poll_link_status(MACDriver *macp);
#ifdef __cplusplus
}
#endif
/** @endcond*/

#endif /* _MAC_LLD_H_ */

/** @} */