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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Based on Linux driver:
* Copyright (C) 2003 Atheros Communications, Inc., All Rights Reserved.
* Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
* Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org>
* Ported to Barebox:
* Copyright (C) 2013 Oleksij Rempel <linux@rempel-privat.de>
*/
#ifndef AR2312_H
#define AR2312_H
#include <asm/addrspace.h>
/* Address Map */
#define AR2312_SDRAM0 0x00000000
#define AR2312_SDRAM1 0x08000000
#define AR2312_WLAN0 0x18000000
#define AR2312_WLAN1 0x18500000
#define AR2312_ENET0 0x18100000
#define AR2312_ENET1 0x18200000
#define AR2312_SDRAMCTL 0x18300000
#define AR2312_FLASHCTL 0x18400000
#define AR2312_APBBASE 0x1c000000
#define AR2312_FLASH 0x1e000000
#define AR2312_CPU_CLOCK_RATE 180000000
/* Used by romSizeMemory to set SDRAM Memory Refresh */
#define AR2312_SDRAM_CLOCK_RATE (AR2312_CPU_CLOCK_RATE / 2)
/*
* SDRAM Memory Refresh (MEM_REF) value is computed as:
* 15.625us * SDRAM_CLOCK_RATE (in MHZ)
*/
#define DESIRED_MEMORY_REFRESH_NSECS 15625
#define AR2312_SDRAM_MEMORY_REFRESH_VALUE \
((DESIRED_MEMORY_REFRESH_NSECS * AR2312_SDRAM_CLOCK_RATE/1000000) / 1000)
/*
* APB Address Map
*/
#define AR2312_UART0 (AR2312_APBBASE + 0x0003) /* high speed uart */
#define AR2312_UART_SHIFT 2
#define AR2312_UART1 (AR2312_APBBASE + 0x1000) /* ar2312 only */
#define AR2312_GPIO (AR2312_APBBASE + 0x2000)
#define AR2312_RESETTMR (AR2312_APBBASE + 0x3000)
#define AR2312_APB2AHB (AR2312_APBBASE + 0x4000)
/*
* AR2312_NUM_ENET_MAC defines the number of ethernet MACs that
* should be considered available. The AR2312 supports 2 enet MACS,
* even though many reference boards only actually use 1 of them
* (i.e. Only MAC 0 is actually connected to an enet PHY or PHY switch.
* The AR2312 supports 1 enet MAC.
*/
#define AR2312_NUM_ENET_MAC 2
/*
* Need these defines to determine true number of ethernet MACs
*/
#define AR5212_AR2312_REV2 0x52 /* AR2312 WMAC (AP31) */
#define AR5212_AR2312_REV7 0x57 /* AR2312 WMAC (AP30-040) */
#define AR5212_AR2313_REV8 0x58 /* AR2313 WMAC (AP43-030) */
/* Reset/Timer Block Address Map */
#define AR2312_RESETTMR (AR2312_APBBASE + 0x3000)
#define AR2312_TIMER (AR2312_RESETTMR + 0x0000) /* countdown timer */
#define AR2312_WD_CTRL (AR2312_RESETTMR + 0x0008) /* watchdog cntrl */
#define AR2312_WD_TIMER (AR2312_RESETTMR + 0x000c) /* watchdog timer */
#define AR2312_ISR (AR2312_RESETTMR + 0x0010) /* Intr Status Reg */
#define AR2312_IMR (AR2312_RESETTMR + 0x0014) /* Intr Mask Reg */
#define AR2312_RESET (AR2312_RESETTMR + 0x0020)
#define AR2312_CLOCKCTL0 (AR2312_RESETTMR + 0x0060)
#define AR2312_CLOCKCTL1 (AR2312_RESETTMR + 0x0064)
#define AR2312_CLOCKCTL2 (AR2312_RESETTMR + 0x0068)
#define AR2312_SCRATCH (AR2312_RESETTMR + 0x006c)
#define AR2312_PROCADDR (AR2312_RESETTMR + 0x0070)
#define AR2312_PROC1 (AR2312_RESETTMR + 0x0074)
#define AR2312_DMAADDR (AR2312_RESETTMR + 0x0078)
#define AR2312_DMA1 (AR2312_RESETTMR + 0x007c)
#define AR2312_ENABLE (AR2312_RESETTMR + 0x0080) /* interface enb */
#define AR2312_REV (AR2312_RESETTMR + 0x0090) /* revision */
/* AR2312_WD_CTRL register bit field definitions */
#define AR2312_WD_CTRL_IGNORE_EXPIRATION 0x0000
#define AR2312_WD_CTRL_NMI 0x0001
#define AR2312_WD_CTRL_RESET 0x0002
/* AR2312_ISR register bit field definitions */
#define AR2312_ISR_NONE 0x0000
#define AR2312_ISR_TIMER 0x0001
#define AR2312_ISR_AHBPROC 0x0002
#define AR2312_ISR_AHBDMA 0x0004
#define AR2312_ISR_GPIO 0x0008
#define AR2312_ISR_UART0 0x0010
#define AR2312_ISR_UART0DMA 0x0020
#define AR2312_ISR_WD 0x0040
#define AR2312_ISR_LOCAL 0x0080
/* AR2312_RESET register bit field definitions */
#define AR2312_RESET_SYSTEM 0x00000001 /* cold reset full system */
#define AR2312_RESET_PROC 0x00000002 /* cold reset MIPS core */
#define AR2312_RESET_WLAN0 0x00000004 /* cold reset WLAN MAC and BB */
#define AR2312_RESET_EPHY0 0x00000008 /* cold reset ENET0 phy */
#define AR2312_RESET_EPHY1 0x00000010 /* cold reset ENET1 phy */
#define AR2312_RESET_ENET0 0x00000020 /* cold reset ENET0 mac */
#define AR2312_RESET_ENET1 0x00000040 /* cold reset ENET1 mac */
#define AR2312_RESET_UART0 0x00000100 /* cold reset UART0 (high speed) */
#define AR2312_RESET_WLAN1 0x00000200 /* cold reset WLAN MAC/BB */
#define AR2312_RESET_APB 0x00000400 /* cold reset APB (ar2312) */
#define AR2312_RESET_WARM_PROC 0x00001000 /* warm reset MIPS core */
#define AR2312_RESET_WARM_WLAN0_MAC 0x00002000 /* warm reset WLAN0 MAC */
#define AR2312_RESET_WARM_WLAN0_BB 0x00004000 /* warm reset WLAN0 BaseBand */
#define AR2312_RESET_NMI 0x00010000 /* send an NMI to the processor */
#define AR2312_RESET_WARM_WLAN1_MAC 0x00020000 /* warm reset WLAN1 mac */
#define AR2312_RESET_WARM_WLAN1_BB 0x00040000 /* warm reset WLAN1 baseband */
#define AR2312_RESET_LOCAL_BUS 0x00080000 /* reset local bus */
#define AR2312_RESET_WDOG 0x00100000 /* last reset was a watchdog */
/* Values for AR2312_CLOCKCTL1
*
* The AR2312_CLOCKCTL1 register is loaded based on the speed of
* our incoming clock. Currently, all valid configurations
* for an AR2312 use an ar5112 radio clocked at 40MHz. Until
* there are other configurations available, we'll hardcode
* this 40MHz assumption.
*/
#define AR2312_INPUT_CLOCK 40000000
#define AR2312_CLOCKCTL1_IN40_OUT160MHZ 0x0405 /* 40MHz in, 160Mhz out */
#define AR2312_CLOCKCTL1_IN40_OUT180MHZ 0x0915 /* 40MHz in, 180Mhz out */
#define AR2312_CLOCKCTL1_IN40_OUT200MHZ 0x1935 /* 40MHz in, 200Mhz out */
#define AR2312_CLOCKCTL1_IN40_OUT220MHZ 0x0b15 /* 40MHz in, 220Mhz out */
#define AR2312_CLOCKCTL1_IN40_OUT240MHZ 0x0605 /* 40MHz in, 240Mhz out */
#define AR2312_CLOCKCTL1_SELECTION AR2312_CLOCKCTL1_IN40_OUT180MHZ
#define AR2312_CPU_CLOCK_RATE 180000000
/*
* Special values for AR2313 'VIPER' PLL.
*
* These values do not match the latest datasheet for the AR2313,
* which appears to be an exact copy of the AR2312 in this area.
* The values were derived from the ECOS code provided in the Atheros
* LSDK-1.0 (and confirmed by checking values on an AR2313 reference
* design).
*/
#define AR2313_CLOCKCTL1_SELECTION 0x91245
/* Bit fields for AR2312_CLOCKCTL2 */
#define AR2312_CLOCKCTL2_WANT_RESET 0x00000001 /* reset with new vals */
#define AR2312_CLOCKCTL2_WANT_DIV2 0x00000010 /* request /2 clock */
#define AR2312_CLOCKCTL2_WANT_DIV4 0x00000020 /* request /4 clock */
#define AR2312_CLOCKCTL2_WANT_PLL_BYPASS 0x00000080 /* request PLL bypass */
#define AR2312_CLOCKCTL2_STATUS_DIV2 0x10000000 /* have /2 clock */
#define AR2312_CLOCKCTL2_STATUS_DIV4 0x20000000 /* have /4 clock */
#define AR2312_CLOCKCTL2_STATUS_PLL_BYPASS 0x80000000 /* PLL is bypassed */
/* AR2312_CLOCKCTL1 register bit field definitions */
#define AR2312_CLOCKCTL1_PREDIVIDE_MASK 0x00000030
#define AR2312_CLOCKCTL1_PREDIVIDE_SHIFT 4
#define AR2312_CLOCKCTL1_MULTIPLIER_MASK 0x00001f00
#define AR2312_CLOCKCTL1_MULTIPLIER_SHIFT 8
#define AR2312_CLOCKCTL1_DOUBLER_MASK 0x00010000
/* Valid for AR2313 */
#define AR2313_CLOCKCTL1_PREDIVIDE_MASK 0x00003000
#define AR2313_CLOCKCTL1_PREDIVIDE_SHIFT 12
#define AR2313_CLOCKCTL1_MULTIPLIER_MASK 0x001f0000
#define AR2313_CLOCKCTL1_MULTIPLIER_SHIFT 16
#define AR2313_CLOCKCTL1_DOUBLER_MASK 0x00000000
/* Values for AR2312_CLOCKCTL */
#define AR2312_CLOCKCTL_ETH0 0x0004 /* enable eth0 clock */
#define AR2312_CLOCKCTL_ETH1 0x0008 /* enable eth1 clock */
#define AR2312_CLOCKCTL_UART0 0x0010 /* enable UART0 external clock */
/* AR2312_ENABLE register bit field definitions */
#define AR2312_ENABLE_ENET0 0x0002
#define AR2312_ENABLE_ENET1 0x0004
/* AR2312_REV register bit field definitions */
#define AR2312_REV_WMAC_MAJ 0xf000
#define AR2312_REV_WMAC_MAJ_S 12
#define AR2312_REV_WMAC_MIN 0x0f00
#define AR2312_REV_WMAC_MIN_S 8
#define AR2312_REV_MAJ 0x00f0
#define AR2312_REV_MAJ_S 4
#define AR2312_REV_MIN 0x000f
#define AR2312_REV_MIN_S 0
#define AR2312_REV_CHIP (AR2312_REV_MAJ|AR2312_REV_MIN)
/* Major revision numbers, bits 7..4 of Revision ID register */
#define AR2312_REV_MAJ_AR2312 0x4
#define AR2312_REV_MAJ_AR2313 0x5
/* Minor revision numbers, bits 3..0 of Revision ID register */
#define AR2312_REV_MIN_DUAL 0x0 /* Dual WLAN version */
#define AR2312_REV_MIN_SINGLE 0x1 /* Single WLAN version */
/* AR2312_FLASHCTL register bit field definitions */
#define FLASHCTL_IDCY 0x0000000f /* Idle cycle turn around time */
#define FLASHCTL_IDCY_S 0
#define FLASHCTL_WST1 0x000003e0 /* Wait state 1 */
#define FLASHCTL_WST1_S 5
#define FLASHCTL_RBLE 0x00000400 /* Read byte lane enable */
#define FLASHCTL_WST2 0x0000f800 /* Wait state 2 */
#define FLASHCTL_WST2_S 11
#define FLASHCTL_AC 0x00070000 /* Flash address check (added) */
#define FLASHCTL_AC_S 16
#define FLASHCTL_AC_128K 0x00000000
#define FLASHCTL_AC_256K 0x00010000
#define FLASHCTL_AC_512K 0x00020000
#define FLASHCTL_AC_1M 0x00030000
#define FLASHCTL_AC_2M 0x00040000
#define FLASHCTL_AC_4M 0x00050000
#define FLASHCTL_AC_8M 0x00060000
#define FLASHCTL_AC_RES 0x00070000 /* 16MB is not supported */
#define FLASHCTL_E 0x00080000 /* Flash bank enable (added) */
#define FLASHCTL_BUSERR 0x01000000 /* Bus transfer error status flag */
#define FLASHCTL_WPERR 0x02000000 /* Write protect error status flag */
#define FLASHCTL_WP 0x04000000 /* Write protect */
#define FLASHCTL_BM 0x08000000 /* Burst mode */
#define FLASHCTL_MW 0x30000000 /* Memory width */
#define FLASHCTL_MWx8 0x00000000 /* Memory width x8 */
#define FLASHCTL_MWx16 0x10000000 /* Memory width x16 */
#define FLASHCTL_MWx32 0x20000000 /* Memory width x32 (not supported) */
#define FLASHCTL_ATNR 0x00000000 /* Access type == no retry */
#define FLASHCTL_ATR 0x80000000 /* Access type == retry every */
#define FLASHCTL_ATR4 0xc0000000 /* Access type == retry every 4 */
#define AR2312_MAX_FLASH_SIZE 0x800000
/* ARM Flash Controller -- 3 flash banks with either x8 or x16 devices. */
#define AR2312_FLASHCTL0 (AR2312_FLASHCTL + 0x00)
#define AR2312_FLASHCTL1 (AR2312_FLASHCTL + 0x04)
#define AR2312_FLASHCTL2 (AR2312_FLASHCTL + 0x08)
/* ARM SDRAM Controller -- just enough to determine memory size */
#define AR2312_MEM_CFG0 (AR2312_SDRAMCTL + 0x00)
#define AR2312_MEM_CFG1 (AR2312_SDRAMCTL + 0x04)
#define AR2312_MEM_REF (AR2312_SDRAMCTL + 0x08) /* 16 bit value */
#define MEM_CFG0_F0 0x00000002 /* bank 0: 256Mb support */
#define MEM_CFG0_T0 0x00000004 /* bank 0: chip width */
#define MEM_CFG0_B0 0x00000008 /* bank 0: 2 vs 4 bank */
#define MEM_CFG0_F1 0x00000020 /* bank 1: 256Mb support */
#define MEM_CFG0_T1 0x00000040 /* bank 1: chip width */
#define MEM_CFG0_B1 0x00000080 /* bank 1: 2 vs 4 bank */
/* bank 2 and 3 are not supported */
#define MEM_CFG0_E 0x00020000 /* SDRAM clock control */
#define MEM_CFG0_C 0x00040000 /* SDRAM clock enable */
#define MEM_CFG0_X 0x00080000 /* bus width (0 == 32b) */
#define MEM_CFG0_CAS 0x00300000 /* CAS latency (1-3) */
#define MEM_CFG0_C1 0x00100000
#define MEM_CFG0_C2 0x00200000
#define MEM_CFG0_C3 0x00300000
#define MEM_CFG0_R 0x00c00000 /* RAS to CAS latency (1-3) */
#define MEM_CFG0_R1 0x00400000
#define MEM_CFG0_R2 0x00800000
#define MEM_CFG0_R3 0x00c00000
#define MEM_CFG0_A 0x01000000 /* AHB auto pre-charge */
#define MEM_CFG1_I 0x0001 /* memory init control */
#define MEM_CFG1_M 0x0002 /* memory init control */
#define MEM_CFG1_R 0x0004 /* read buffer enable (unused) */
#define MEM_CFG1_W 0x0008 /* write buffer enable (unused) */
#define MEM_CFG1_B 0x0010 /* SDRAM engine busy */
#define MEM_CFG1_AC_2 0 /* AC of 2MB */
#define MEM_CFG1_AC_4 1 /* AC of 4MB */
#define MEM_CFG1_AC_8 2 /* AC of 8MB */
#define MEM_CFG1_AC_16 3 /* AC of 16MB */
#define MEM_CFG1_AC_32 4 /* AC of 32MB */
#define MEM_CFG1_AC_64 5 /* AC of 64MB */
#define MEM_CFG1_AC_128 6 /* AC of 128MB */
#define MEM_CFG1_AC0_S 8
#define MEM_CFG1_AC0 0x0700 /* bank 0: SDRAM addr check (added) */
#define MEM_CFG1_E0 0x0800 /* bank 0: enable */
#define MEM_CFG1_AC1_S 12
#define MEM_CFG1_AC1 0x7000 /* bank 1: SDRAM addr check (added) */
#define MEM_CFG1_E1 0x8000 /* bank 1: enable */
/* GPIO Address Map */
#define AR2312_GPIO (AR2312_APBBASE + 0x2000)
#define AR2312_GPIO_DO (AR2312_GPIO + 0x00) /* output register */
#define AR2312_GPIO_DI (AR2312_GPIO + 0x04) /* intput register */
#define AR2312_GPIO_CR (AR2312_GPIO + 0x08) /* control register */
/* GPIO Control Register bit field definitions */
#define AR2312_GPIO_CR_M(x) (1 << (x)) /* mask for i/o */
#define AR2312_GPIO_CR_O(x) (0 << (x)) /* mask for output */
#define AR2312_GPIO_CR_I(x) (1 << (x)) /* mask for input */
#define AR2312_GPIO_CR_INT(x) (1 << ((x)+8)) /* mask for interrupt */
#define AR2312_GPIO_CR_UART(x) (1 << ((x)+16)) /* uart multiplex */
#define AR2312_NUM_GPIO 8
#endif
|