FreeNOS
Sun8iEmac.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2020 Niek Linnenbank
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef __SERVER_NETWORK_SUN8I_SUN8IEMAC_H
19#define __SERVER_NETWORK_SUN8I_SUN8IEMAC_H
20
21#include <FreeNOS/System.h>
22#include <Types.h>
23#include <Index.h>
24#include <Queue.h>
25#include <NetworkDevice.h>
26#include <Ethernet.h>
29
42{
43 public:
44
46 static const Size InterruptNumber = 114;
47
48 private:
49
51 static const Address MemoryAddress = 0x01c30000;
52
54 static const u8 PhyMdioAddress = 0x1;
55
57 static const Size MaximumMiiPoll = 100000;
58
60 static const Size MaximumResetPoll = 100000;
61
66 {
67 BasicCtl0 = 0x0000,
68 BasicCtl1 = 0x0004,
69 IntStatus = 0x0008,
70 IntEnable = 0x000C,
71 TransmitCtl0 = 0x0010,
72 TransmitCtl1 = 0x0014,
73 TransmitFlowCtl = 0x001C,
75 ReceiveCtl0 = 0x0024,
76 ReceiveCtl1 = 0x0028,
77 ReceiveDescList = 0x0034,
79 ReceiveHash0 = 0x0040,
80 ReceiveHash1 = 0x0044,
81 MiiCmd = 0x0048,
82 MiiData = 0x004C,
83 AddrHigh = 0x0050,
84 AddrLow = 0x0054,
85 TransmitStatus = 0x00B0,
86 TransmitCurDesc = 0x00B4,
87 TransmitCurBuf = 0x00B8,
88 ReceiveStatus = 0x00C0,
89 ReceiveCurDesc = 0x00C4,
90 ReceiveCurBuf = 0x00C8,
91 RgmiiStatus = 0x00D0,
92 };
93
98 {
99 BasicCtl0FullDup = (1 << 0),
100 BasicCtl0SpeedMask = ((1 << 2) | (1 << 3)),
101 BasicCtl0Speed100 = (0x3 << 2)
102 };
103
112
117 {
119 IntStatusTransmit = (1 << 0)
120 };
121
126 {
128 IntEnableTransmit = (1 << 0)
129 };
130
145
150 {
152 MiiRegStatus = (0x1),
153 MiiRegIdHigh = (0x2),
154 MiiRegIdLow = (0x3),
155 MiiRegAdv = (0x4),
156 MiiRegLink = (0x5),
157 };
158
170
175 {
176 MiiStatusExt = 0x0001,
179 MiiStatusAutoCompl = 0x0020
180 };
181
186 {
188 MiiAdvSpeed100Full = 0x0100
189 };
190
195 {
196 TransmitCtl0Enable = (1 << 31)
197 };
198
209
214 {
215 ReceiveCtl0Enable = (1 << 31)
216 };
217
229
240
255
256 public:
257
264 Sun8iEmac(const u32 inode,
265 NetworkServer &server);
266
270 virtual ~Sun8iEmac();
271
278
287
295 virtual FileSystem::Result setAddress(const Ethernet::Address *address);
296
304 virtual FileSystem::Result interrupt(const Size vector);
305
314
321
322 private:
323
330
336 bool miiBusyWait() const;
337
346 u32 miiRead(const u8 phyAddr,
347 const u8 regAddr);
348
356 void miiWrite(const u8 phyAddr,
357 const u8 regAddr,
358 const u32 data);
359
366
373
380
387
394
398 void printRx();
399
403 void printTx();
404
405 private:
406
409
412
415
418
421
424
427
430
433
436
439
442};
443
449#endif /* __SERVER_NETWORK_SUN8I_SUN8IEMAC_H */
Input/Output operations specific to the ARM architecture.
Definition ARMIO.h:40
Index is a N-sized array of pointers to items of type T.
Definition Index.h:37
Network Device abstract class.
Networking server.
Array of items as a First-In-First-Out (FIFO) datastructure.
Definition Queue.h:37
Network device of the Allwinner Sun8i family System-on-Chips.
Definition Sun8iEmac.h:42
static const u8 PhyMdioAddress
Fixed address of the PHY on the MDIO bus.
Definition Sun8iEmac.h:54
static const Size MaximumMiiPoll
Maximum number of polling reads for MII-busy flag.
Definition Sun8iEmac.h:57
Index< NetworkQueue::Packet, NetworkQueue::MaxPackets > m_receivePackets
List of pointers to receive packets.
Definition Sun8iEmac.h:423
MiiControlFlags
Flags in the Mii Control register.
Definition Sun8iEmac.h:163
@ MiiControlSpeed100
Definition Sun8iEmac.h:167
@ MiiControlReset
Definition Sun8iEmac.h:168
@ MiiControlAutoEnable
Definition Sun8iEmac.h:166
@ MiiControlAutoRestart
Definition Sun8iEmac.h:165
@ MiiControlFullDuplex
Definition Sun8iEmac.h:164
Queue< NetworkQueue::Packet *, NetworkQueue::MaxPackets > m_transmitPending
List of pointers to packets pending transmission.
Definition Sun8iEmac.h:435
FileSystem::Result reset()
Reset the controller.
ReceiveCtl1Flags
Flags for the Receive Control 1 register.
Definition Sun8iEmac.h:222
@ ReceiveCtl1ErrorFrame
Definition Sun8iEmac.h:225
@ ReceiveCtl1DmaStart
Definition Sun8iEmac.h:223
@ ReceiveCtl1UnderFrame
Definition Sun8iEmac.h:226
@ ReceiveCtl1DmaEnable
Definition Sun8iEmac.h:224
@ ReceiveCtl1FullFrame
Definition Sun8iEmac.h:227
Index< FrameDescriptor, NetworkQueue::MaxPackets > m_receiveDesc
List of pointers to receive descriptors.
Definition Sun8iEmac.h:420
virtual FileSystem::Result startDMA()
Start DMA processing.
virtual FileSystem::Result interrupt(const Size vector)
Called when an interrupt has been triggered for this device.
virtual FileSystem::Result getAddress(Ethernet::Address *address)
Read ethernet address.
virtual FileSystem::Result setAddress(const Ethernet::Address *address)
Set ethernet address.
u32 miiRead(const u8 phyAddr, const u8 regAddr)
Read a Media-Independent-Interface (MII) register on the PHY.
Registers
Hardware registers.
Definition Sun8iEmac.h:66
@ MiiData
< Management Interface Command
Definition Sun8iEmac.h:82
@ ReceiveHash1
< Receive Hash Table 0
Definition Sun8iEmac.h:80
@ ReceiveStatus
< Transmit Current Buffer
Definition Sun8iEmac.h:88
@ ReceiveCtl1
< Receive Control 0
Definition Sun8iEmac.h:76
@ TransmitCurBuf
< Transmit Current Descriptor
Definition Sun8iEmac.h:87
@ BasicCtl1
< Basic Control 0
Definition Sun8iEmac.h:68
@ TransmitCurDesc
< Transmit DMA Status
Definition Sun8iEmac.h:86
@ RgmiiStatus
< Receive Current Buffer
Definition Sun8iEmac.h:91
@ TransmitCtl1
< Transmit Control 0
Definition Sun8iEmac.h:72
@ IntEnable
< Interrupt Status
Definition Sun8iEmac.h:70
@ AddrHigh
< Management Interface Data
Definition Sun8iEmac.h:83
@ ReceiveCurBuf
< Receive Current Descriptor
Definition Sun8iEmac.h:90
@ AddrLow
< MAC Address High
Definition Sun8iEmac.h:84
@ IntStatus
< Basic Control 1
Definition Sun8iEmac.h:69
@ ReceiveDescList
< Receive Control 1
Definition Sun8iEmac.h:77
@ TransmitStatus
< MAC Address Low
Definition Sun8iEmac.h:85
@ ReceiveCtl0
< Transmit Descriptor List Address
Definition Sun8iEmac.h:75
@ TransmitFlowCtl
< Transmit Control 1
Definition Sun8iEmac.h:73
@ TransmitCtl0
< Interrupt Enable
Definition Sun8iEmac.h:71
@ ReceiveHash0
< Receive Frame Filter
Definition Sun8iEmac.h:79
@ ReceiveCurDesc
< Receive DMA Status
Definition Sun8iEmac.h:89
@ ReceiveFrmFilter
< Receive Descriptor List Address
Definition Sun8iEmac.h:78
@ TransmitDescList
< Transmit Flow Control
Definition Sun8iEmac.h:74
@ MiiCmd
< Receive Hash Table 1
Definition Sun8iEmac.h:81
MiiStatusFlags
Flags in the Mii Status register.
Definition Sun8iEmac.h:175
@ MiiStatusAutoCap
Definition Sun8iEmac.h:178
@ MiiStatusAutoCompl
Definition Sun8iEmac.h:179
@ MiiStatusLink
Definition Sun8iEmac.h:177
MiiCmdFlags
Flags for Media-Independent-Interface (MII) Command register.
Definition Sun8iEmac.h:135
@ MiiCmdPhyBusy
Definition Sun8iEmac.h:143
@ MiiCmdPhyAddrShift
Definition Sun8iEmac.h:136
@ MiiCmdPhyWrite
Definition Sun8iEmac.h:142
@ MiiCmdPhyCsrDiv128
Definition Sun8iEmac.h:140
@ MiiCmdPhyCsrShift
Definition Sun8iEmac.h:141
@ MiiCmdPhyRegMask
Definition Sun8iEmac.h:139
@ MiiCmdPhyAddrMask
Definition Sun8iEmac.h:137
@ MiiCmdPhyRegShift
Definition Sun8iEmac.h:138
Index< FrameDescriptor, NetworkQueue::MaxPackets > m_transmitDesc
List of pointers to transmit descriptors.
Definition Sun8iEmac.h:432
TransmitCtl0Flags
Flags for the Transmit Control 0 register.
Definition Sun8iEmac.h:195
@ TransmitCtl0Enable
Definition Sun8iEmac.h:196
MiiAdvFlags
Flags in the Mii Advertised abilities register.
Definition Sun8iEmac.h:186
@ MiiAdvSpeed100Full
Definition Sun8iEmac.h:188
@ MiiAdvSpeed10Full
Definition Sun8iEmac.h:187
MiiRegisters
Registers provided by the PHY on the Media-Independent-Interface (MII)
Definition Sun8iEmac.h:150
@ MiiRegControl
Definition Sun8iEmac.h:151
@ MiiRegAdv
< Identifier Low
Definition Sun8iEmac.h:155
@ MiiRegStatus
< Control
Definition Sun8iEmac.h:152
@ MiiRegIdLow
< Identifier High
Definition Sun8iEmac.h:154
@ MiiRegLink
< Advertised abilities
Definition Sun8iEmac.h:156
@ MiiRegIdHigh
< Status
Definition Sun8iEmac.h:153
FileSystem::Result receive()
Receive packets.
static const Size MaximumResetPoll
Maximum number of polling reset iterations.
Definition Sun8iEmac.h:60
Size m_transmitIndex
Current transmit packet index.
Definition Sun8iEmac.h:441
IntStatusFlags
Flags for the Interrupt Status register.
Definition Sun8iEmac.h:117
@ IntStatusTransmit
Definition Sun8iEmac.h:119
@ IntStatusReceive
Definition Sun8iEmac.h:118
bool miiBusyWait() const
Wait until the PHY comes out of busy state.
virtual FileSystem::Result initialize()
Initialize the device.
Definition Sun8iEmac.cpp:39
void printRx()
Print diagnostic information about the receive queue (RX)
TransmitCtl1Flags
Flags for the Transmit Control 1 register.
Definition Sun8iEmac.h:203
@ TransmitCtl1DmaStart
Definition Sun8iEmac.h:204
@ TransmitCtl1DmaEnable
Definition Sun8iEmac.h:205
@ TransmitCtl1FullFrame
Definition Sun8iEmac.h:207
@ TransmitCtl1NextFrame
Definition Sun8iEmac.h:206
Queue< NetworkQueue::Packet *, NetworkQueue::MaxPackets > m_transmitPackets
List of pointers to packets that the driver has submitted for transmission.
Definition Sun8iEmac.h:438
void printTx()
Print diagnostic information about the transmit queue (TX)
Memory::Range m_receiveDescRange
Memory range for receive descriptors.
Definition Sun8iEmac.h:417
void miiWrite(const u8 phyAddr, const u8 regAddr, const u32 data)
Write a Media-Independent-Interface (MII) register on the PHY.
FileSystem::Result configPhy()
Configure the PHY connected to the MAC controller.
SunxiSystemControl m_syscon
System Control Unit.
Definition Sun8iEmac.h:414
FileSystem::Result resetTransmit()
Reset transmit control functions.
FileSystem::Result resetPhy()
Reset the PHY connected to the MAC controller.
Arch::IO m_io
Memory mapped registers.
Definition Sun8iEmac.h:408
IntEnableFlags
Flags for the Interrupt Enable register.
Definition Sun8iEmac.h:126
@ IntEnableTransmit
Definition Sun8iEmac.h:128
@ IntEnableReceive
Definition Sun8iEmac.h:127
BasicCtl1Flags
Flags for the Basic Control 1 register.
Definition Sun8iEmac.h:108
@ BasicCtl1Reset
Definition Sun8iEmac.h:109
@ BasicCtl1BurstShift
Definition Sun8iEmac.h:110
virtual FileSystem::Result transmit(NetworkQueue::Packet *pkt)
Add a network packet to the transmit queue.
static const Address MemoryAddress
Physical memory address of the device memory mapped registers.
Definition Sun8iEmac.h:51
FileSystem::Result resetReceive()
Reset receive control functions.
SunxiClockControl m_ccu
Clock Control Unit.
Definition Sun8iEmac.h:411
FrameDescriptorFlags
Flags for frame descriptors.
Definition Sun8iEmac.h:245
@ TransmitDescChained
Definition Sun8iEmac.h:250
@ ReceiveDescFrmMask
Definition Sun8iEmac.h:253
@ ReceiveDescFrmShift
Definition Sun8iEmac.h:252
@ TransmitDescRaiseInt
Definition Sun8iEmac.h:247
@ ReceiveDescLast
Definition Sun8iEmac.h:251
@ TransmitDescFirst
Definition Sun8iEmac.h:248
@ FrameDescriptorCtl
Definition Sun8iEmac.h:246
@ TransmitDescLast
Definition Sun8iEmac.h:249
BasicCtl0Flags
Flags for the Basic Control 0 register.
Definition Sun8iEmac.h:98
@ BasicCtl0Speed100
Definition Sun8iEmac.h:101
@ BasicCtl0FullDup
Definition Sun8iEmac.h:99
@ BasicCtl0SpeedMask
Definition Sun8iEmac.h:100
virtual ~Sun8iEmac()
Destructor.
Definition Sun8iEmac.cpp:34
Size m_receiveIndex
Current receive packet index.
Definition Sun8iEmac.h:426
ReceiveCtl0Flags
Flags for the Receive Control 0 register.
Definition Sun8iEmac.h:214
@ ReceiveCtl0Enable
Definition Sun8iEmac.h:215
static const Size InterruptNumber
Interrupt number for this device on a sun8i family SoC.
Definition Sun8iEmac.h:46
Memory::Range m_transmitDescRange
Memory range for transmit descriptors.
Definition Sun8iEmac.h:429
Allwinner Clock Control Unit (CCU)
Allwinner System Control (SYSCON) module.
unsigned int u32
Unsigned 32-bit number.
Definition Types.h:53
unsigned long Address
A memory address.
Definition Types.h:131
unsigned int Size
Any sane size indicator cannot go negative.
Definition Types.h:128
unsigned char u8
Unsigned 8-bit number.
Definition Types.h:59
Result
Result code for filesystem Actions.
Definition FileSystem.h:53
Ethernet network address.
Definition Ethernet.h:53
Memory range.
Definition Memory.h:56
Represents a network packet.
Transmit/receive frame descriptor.
Definition Sun8iEmac.h:234