OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [hal/] [cortexm/] [a2fxxx/] [var/] [current/] [src/] [a2fxxx_misc.c] - Blame information for rev 786

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
/*==========================================================================
2
//
3
//      a2f_misc.c
4
//
5
//      Cortex-M Actel A2F HAL functions
6
//
7
//==========================================================================
8
// ####ECOSGPLCOPYRIGHTBEGIN####
9
// -------------------------------------------
10
// This file is part of eCos, the Embedded Configurable Operating System.
11
// Copyright (C) 2011 Free Software Foundation, Inc.
12
//
13
// eCos is free software; you can redistribute it and/or modify it under
14
// the terms of the GNU General Public License as published by the Free
15
// Software Foundation; either version 2 or (at your option) any later
16
// version.
17
//
18
// eCos is distributed in the hope that it will be useful, but WITHOUT
19
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21
// for more details.
22
//
23
// You should have received a copy of the GNU General Public License
24
// along with eCos; if not, write to the Free Software Foundation, Inc.,
25
// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
26
//
27
// As a special exception, if other files instantiate templates or use
28
// macros or inline functions from this file, or you compile this file
29
// and link it with other works to produce a work based on this file,
30
// this file does not by itself cause the resulting work to be covered by
31
// the GNU General Public License. However the source code for this file
32
// must still be made available in accordance with section (3) of the GNU
33
// General Public License v2.
34
//
35
// This exception does not invalidate any other reasons why a work based
36
// on this file might be covered by the GNU General Public License.
37
// -------------------------------------------
38
// ####ECOSGPLCOPYRIGHTEND####
39
//==========================================================================
40
//#####DESCRIPTIONBEGIN####
41
//
42
// Author(s):    ccoutand
43
// Contributors:
44
// Date:         2011-02-03
45
// Description:
46
//
47
//####DESCRIPTIONEND####
48
//
49
//========================================================================*/
50
 
51
#include <pkgconf/hal.h>
52
#include <pkgconf/hal_cortexm.h>
53
#include <pkgconf/hal_cortexm_a2fxxx.h>
54
 
55
#ifdef CYGPKG_KERNEL
56
#include <pkgconf/kernel.h>
57
#endif
58
 
59
#include <cyg/infra/diag.h>
60
#include <cyg/infra/cyg_type.h>
61
#include <cyg/infra/cyg_trac.h>         // tracing macros
62
#include <cyg/infra/cyg_ass.h>          // assertion macros
63
 
64
#include <cyg/hal/hal_arch.h>           // HAL header
65
#include <cyg/hal/hal_intr.h>           // HAL header
66
#include <cyg/hal/hal_if.h>             // HAL header
67
 
68
 
69
//==========================================================================
70
// Clock Initialization values
71
 
72
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK
73
 
74
#define CLKx_SRC_CLKA    0
75
#define CLKx_SRC_CLKB    1
76
#define CLKx_SRC_CLKC    2
77
#define CLKx_SRC_CLKGA   3
78
#define CLKx_SRC_CLKGB   4
79
#define CLKx_SRC_CLKGC   5
80
#define CLKx_SRC_CLKGINT 6
81
 
82
#define CLKx_SRC_UIN     0
83
#define CLKx_SRC_DIP     1
84
#define CLKx_SRC_UIP     4
85
#define CLKx_SRC_GLxINT  5
86
#define CLKx_SRC_RCOSC   2
87
#define CLKx_SRC_MOSC    6
88
#define CLKx_SRC_32KOSC  6
89
 
90
// Select source of CLKA
91
 
92
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_SRC_AUIN
93
# define CLKA_SRC_SEL CLKx_SRC_UIN
94
#elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_SRC_AUIP)
95
# define CLKA_SRC_SEL CLKx_SRC_UIP
96
#elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_SRC_ADIP)
97
# define CLKA_SRC_SEL CLKx_SRC_DIP
98
#elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_SRC_GLAINT)
99
# define CLKA_SRC_SEL CLKx_SRC_GLxINT
100
#elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_SRC_RCOSC)
101
# define CLKA_SRC_SEL CLKx_SRC_RCOSC
102
#else
103
# define CLKA_SRC_SEL CLKx_SRC_MOSC
104
#endif
105
 
106
// Select source of CLKB
107
 
108
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKB
109
# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_SRC_BUIN
110
#  define CLKB_SRC_SEL CLKx_SRC_UIN
111
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_SRC_BUIP)
112
#  define CLKB_SRC_SEL CLKx_SRC_UIP
113
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_SRC_BDIP)
114
#  define CLKB_SRC_SEL CLKx_SRC_DIP
115
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_SRC_GLBINT)
116
#  define CLKB_SRC_SEL CLKx_SRC_GLxINT
117
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_SRC_RCOSC)
118
#  define CLKB_SRC_SEL CLKx_SRC_RCOSC
119
# else
120
#  define CLKB_SRC_SEL CLKx_SRC_MOSC
121
# endif
122
#endif
123
 
124
// Select source of CLKC
125
 
126
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKC
127
# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_SRC_CUIN
128
#  define CLKC_SRC_SEL CLKx_SRC_UIN
129
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_SRC_CUIP)
130
#  define CLKC_SRC_SEL CLKx_SRC_UIP
131
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_SRC_CDIP)
132
#  define CLKC_SRC_SEL CLKx_SRC_DIP
133
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_SRC_GLCINT)
134
#  define CLKC_SRC_SEL CLKx_SRC_GLxINT
135
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_SRC_RCOSC)
136
#  define CLKC_SRC_SEL CLKx_SRC_RCOSC
137
# else
138
#  define CLKC_SRC_SEL CLKx_SRC_32KOSC
139
# endif
140
#endif
141
 
142
// Select source of CLKGA
143
 
144
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA
145
# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC_CLKA
146
#  define CLKGA_SRC_SEL 1
147
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC_PLL_VCO0)
148
#  define CLKGA_SRC_SEL 4
149
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC_PLL_VCO90)
150
#  define CLKGA_SRC_SEL 5
151
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC_PLL_VCO180)
152
#  define CLKGA_SRC_SEL 6
153
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC_PLL_VCO270)
154
#  define CLKGA_SRC_SEL 7
155
# else
156
#  define CLKGA_SRC_SEL 2
157
# endif
158
#endif
159
 
160
// Select source of CLKGB
161
 
162
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB
163
# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC_CLKB
164
#  define CLKGB_SRC_SEL 1
165
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC_CLKGA
166
#  define CLKGB_SRC_SEL 3
167
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC_PLL_VCO0)
168
#  define CLKGB_SRC_SEL 4
169
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC_PLL_VCO90)
170
#  define CLKGB_SRC_SEL 5
171
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC_PLL_VCO180)
172
#  define CLKGB_SRC_SEL 6
173
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC_PLL_VCO270)
174
#  define CLKGB_SRC_SEL 7
175
# else
176
#  define CLKGB_SRC_SEL 2
177
# endif
178
#endif
179
 
180
// Select source of CLKGC
181
 
182
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC
183
# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_CLKC
184
#  define CLKGC_SRC_SEL 1
185
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_CLKGA)
186
#  define CLKGC_SRC_SEL 3
187
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_PLL_VCO0)
188
#  define CLKGC_SRC_SEL 4
189
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_PLL_VCO90)
190
#  define CLKGC_SRC_SEL 5
191
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_PLL_VCO180)
192
#  define CLKGC_SRC_SEL 6
193
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_PLL_VCO270)
194
#  define CLKGC_SRC_SEL 7
195
# else
196
#  define CLKGC_SRC_SEL 2
197
# endif
198
#endif
199
 
200
#if CYGHWR_HAL_CORTEXM_A2FXXX_PCLK0_DIV   == 1
201
# define PCLK0DIV 0
202
#elif CYGHWR_HAL_CORTEXM_A2FXXX_PCLK0_DIV == 2
203
# define PCLK0DIV 1
204
#else
205
# define PCLK0DIV 2
206
#endif
207
 
208
#if CYGHWR_HAL_CORTEXM_A2FXXX_PCLK1_DIV   == 1
209
# define PCLK1DIV 0
210
#elif CYGHWR_HAL_CORTEXM_A2FXXX_PCLK1_DIV == 2
211
# define PCLK1DIV 1
212
#else
213
# define PCLK1DIV 2
214
#endif
215
 
216
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_ACE_CLK
217
# if CYGHWR_HAL_CORTEXM_A2FXXX_ACLK_DIV   == 1
218
#  define ACLKDIV 0
219
# elif CYGHWR_HAL_CORTEXM_A2FXXX_ACLK_DIV == 2
220
#  define ACLKDIV 1
221
# else
222
#  define ACLKDIV 2
223
# endif
224
#endif
225
 
226
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_PLL
227
# if CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FREQ   < 43750000
228
#  define PLL_RANGE 0
229
# elif CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FREQ < 87500000
230
#  define PLL_RANGE 1
231
# elif CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FREQ < 175000000
232
#  define PLL_RANGE 2
233
# else
234
#  define PLL_RANGE 3
235
# endif
236
#endif
237
 
238
#define OXDIV_CLEAR 0x1F
239
#define OXMUX_CLEAR 0x07
240
#define DLYX_CLEAR  0x1F
241
#define DIV_CLEAR   0x03
242
 
243
#endif // CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK
244
 
245
//==========================================================================
246
// IO settings
247
 
248
#ifdef CYGPKG_HAL_CORTEXM_A2FXXX_IO
249
 
250
# if defined(CYGHWR_HAL_CORTEXM_A2FXXX_IO_WEST_BANK_LVCMOS_3V3)
251
# define IO_WEST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTWEST(LVCMOS_3V3)
252
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_IO_WEST_BANK_LVCMOS_2V5)
253
# define IO_WEST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTWEST(LVCMOS_2V5)
254
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_IO_WEST_BANK_LVCMOS_1V8)
255
# define IO_WEST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTWEST(LVCMOS_1V8)
256
# else
257
# define IO_WEST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTWEST(LVCMOS_1V5)
258
# endif
259
 
260
# if defined(CYGHWR_HAL_CORTEXM_A2FXXX_IO_EAST_BANK_LVCMOS_3V3)
261
# define IO_EAST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTEAST(LVCMOS_3V3)
262
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_IO_EAST_BANK_LVCMOS_2V5)
263
# define IO_EAST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTEAST(LVCMOS_2V5)
264
# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_IO_EAST_BANK_LVCMOS_1V8)
265
# define IO_EAST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTEAST(LVCMOS_1V8)
266
# else
267
# define IO_EAST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTEAST(LVCMOS_1V5)
268
# endif
269
 
270
#endif // CYGPKG_HAL_CORTEXM_A2FXXX_IO
271
 
272
 
273
#ifdef CYGSEM_HAL_CORTEXM_A2FXXX_CLOCK_CHATTER
274
# define A2FXXX_CLOCK_TRACE(args...)   diag_printf(args)
275
#else
276
# define A2FXXX_CLOCK_TRACE(args...)    /* NOOP */
277
#endif
278
 
279
 
280
//==========================================================================
281
// Clock frequencies
282
//
283
// These are set to the frequencies of the various system clocks.
284
 
285
cyg_uint32 hal_a2fxxx_pclk0;           // Peripheral clock (connected to APB_0)
286
cyg_uint32 hal_a2fxxx_pclk1;           // Peripheral clock (connected to APB_1)
287
cyg_uint32 hal_a2fxxx_aclk;            // Analog Peripheral clock (ADC /DAC etc..)
288
cyg_uint32 hal_a2fxxx_pclk_fpga;       // FPGA clock
289
 
290
cyg_uint32 hal_a2fxxx_glb;             // Global Clock B
291
cyg_uint32 hal_a2fxxx_glc;             // Global Clock C
292
 
293
cyg_uint32 hal_cortexm_systick_clock;  // NGMUx output or FCLK or SysTick clock
294
cyg_uint32 hal_a2fxxx_fclk;            // FCLK
295
 
296
 
297
//==========================================================================
298
// Local prototypes
299
 
300
static void hal_a2fxxx_clk_network_chatter( cyg_uint8 );
301
 
302
static cyg_uint8 hal_start_clocks( void );
303
static cyg_uint8 hal_a2fxxx_get_system_boot_clk( void );
304
 
305
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK
306
static void hal_a2fxxx_set_clk_network( void );
307
static void hal_a2fxxx_set_envm_timing( void );
308
static void hal_a2fxxx_set_clkx( cyg_uint8 x, cyg_uint8 src );
309
static void hal_a2fxxx_set_clkgx( cyg_uint8 x );
310
static void hal_a2fxxx_set_clkgx_default( cyg_uint8 x );
311
static void hal_a2fxxx_set_ngmux( cyg_uint8 );
312
static cyg_uint8 hal_a2fxxx_get_ngmux( void );
313
 
314
# if defined(CYGHWR_HAL_CORTEXM_A2FXXX_PLL)
315
static inline void hal_a2fxxx_set_pll( void );
316
# endif
317
#endif
318
 
319
 
320
//==========================================================================
321
 
322
void
323
hal_variant_init( void )
324
{
325
#if !defined(CYG_HAL_STARTUP_RAM)
326
    cyg_uint8 sysboot_miss;
327
#endif
328
    cyg_uint32 base = CYGHWR_HAL_A2FXXX_WD;
329
 
330
    // Disable Watch-dog
331
    HAL_WRITE_UINT32(base + CYGHWR_HAL_A2FXXX_WD_ENABLE,
332
                                           CYGHWR_HAL_A2FXXX_WD_DISABLE_KEY);
333
 
334
#if !defined(CYG_HAL_STARTUP_RAM)
335
    sysboot_miss = hal_start_clocks();
336
#endif
337
 
338
    // Release GPIO
339
    CYGHWR_HAL_A2FXXX_PERIPH_RELEASE( CYGHWR_HAL_A2FXXX_PERIPH_SOFTRST(GPIO) );
340
 
341
    // Setup IO banks
342
#ifdef CYGPKG_HAL_CORTEXM_A2FXXX_IO
343
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR, (IO_WEST_BANK | IO_EAST_BANK) );
344
#endif
345
 
346
    // Reset UART0
347
#if CYGINT_HAL_A2FXXX_UART0>0
348
    CYGHWR_HAL_A2FXXX_PERIPH_RELEASE( CYGHWR_HAL_A2FXXX_PERIPH_SOFTRST(UART0) );
349
#endif
350
 
351
    // Reset UART1
352
#if CYGINT_HAL_A2FXXX_UART1>0
353
    CYGHWR_HAL_A2FXXX_PERIPH_RELEASE( CYGHWR_HAL_A2FXXX_PERIPH_SOFTRST(UART1) );
354
#endif
355
 
356
#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
357
    hal_if_init();
358
#endif
359
 
360
#if !defined(CYG_HAL_STARTUP_RAM)
361
    hal_a2fxxx_clk_network_chatter( sysboot_miss );
362
#endif
363
}
364
 
365
//==========================================================================
366
// Setup up system clocks
367
//
368
// Set up clocks from configuration. In the future this should be extended so
369
// that clock rates can be changed at runtime.
370
 
371
static cyg_uint8
372
hal_start_clocks( void )
373
{
374
    if( ! hal_a2fxxx_get_system_boot_clk( ) )
375
        return 0;
376
 
377
    //
378
    // User has chosen to re-configure the clock network and
379
    // overwrite the settings provided by the system boot
380
    //
381
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK
382
    hal_a2fxxx_set_clk_network( );
383
 
384
    // Adjust the ENVM timing according to the core clock
385
    // frequency
386
    hal_a2fxxx_set_envm_timing( );
387
#endif
388
 
389
    return 1;
390
}
391
 
392
 
393
//==========================================================================
394
// Read clock configuration as setup by the system boot
395
 
396
static cyg_uint8
397
hal_a2fxxx_get_system_boot_clk( void )
398
{
399
    cyg_uint32 sysboot_key, sysboot_ver, clk_cr, clkga0;
400
 
401
    sysboot_ver = CYGHWR_HAL_A2FXXX_GET_SYSBOOT_VERSION();
402
    sysboot_key = CYGHWR_HAL_A2FXXX_GET_SYSBOOT_KEY();
403
 
404
    // Verify that the system boot is present, if not we must give up?
405
    if( CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES_SYSBOOT_KEY_VALUE
406
             != sysboot_key )
407
       return 0;
408
 
409
    // Read the MSS CLGA0 frequency value. Address varies with system boot
410
    // version
411
    if ( sysboot_ver < CYGHWR_HAL_A2FXXX_SYSBOOT_VERSION(2, 0, 0) ) {
412
       clkga0 = CYGHWR_HAL_A2FXXX_GET_SYSBOOT_1_3_FCLK();
413
    }
414
    else {
415
       clkga0 = CYGHWR_HAL_A2FXXX_GET_SYSBOOT_2_0_FCLK();
416
    }
417
 
418
    // Compute the BUS and fabric clock frequency
419
    hal_cortexm_systick_clock = clkga0;
420
 
421
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC + CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR, clk_cr);
422
 
423
    hal_a2fxxx_pclk0     =
424
          clkga0 >> CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_GET_PCLK0DIV( clk_cr );
425
    hal_a2fxxx_pclk1     =
426
          clkga0 >> CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_GET_PCLK1DIV( clk_cr );
427
    hal_a2fxxx_pclk_fpga =
428
          clkga0 >> CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_GET_GLBDIV( clk_cr );
429
 
430
    return 1;
431
}
432
 
433
 
434
//==========================================================================
435
// Chatter function
436
 
437
static void
438
hal_a2fxxx_clk_network_chatter( cyg_uint8 hal_clk_network_chatter )
439
{
440
    if ( hal_clk_network_chatter == 0 )
441
        diag_printf("Actel System Boot Missing\n Clock network configuration failed!!\n");
442
 
443
    A2FXXX_CLOCK_TRACE("Device clock network configuration:\n");
444
    A2FXXX_CLOCK_TRACE("Global Clock A (Systick): %d [Hz]\n",
445
                                                  hal_cortexm_systick_clock);
446
    A2FXXX_CLOCK_TRACE("PCLK0: %d [Hz]\n", hal_a2fxxx_pclk0);
447
    A2FXXX_CLOCK_TRACE("PCLK1: %d [Hz]\n", hal_a2fxxx_pclk1);
448
}
449
 
450
 
451
//==========================================================================
452
// Setup device clock network
453
 
454
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK
455
 
456
static void
457
hal_a2fxxx_set_clk_network( void )
458
{
459
    cyg_uint32 mss_ccc_mux;
460
    cyg_uint32 mss_clk_cr;
461
    cyg_uint8  ngmux;
462
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_PLL
463
    cyg_bool   pll = false;
464
#endif
465
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKA
466
    cyg_bool  clka = false;
467
#endif
468
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKC
469
    cyg_bool  clkc = false;
470
#endif
471
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA
472
    cyg_bool  clkga = false;
473
#endif
474
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC
475
    cyg_bool  clkgc = false;
476
#endif
477
 
478
    // Find out which CLKGx is currently used as FLCK
479
    ngmux = hal_a2fxxx_get_ngmux( );
480
 
481
    //
482
    // Start by configuring NGMUX. In the following case, if
483
    // the current NGMUX output is already CLKGA, first move
484
    // to CLKGC to keep a stable ground otherwise go ahead and
485
    // configure CLKGA.
486
    //
487
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_CLKGA
488
    if( ngmux == CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLA )
489
    {
490
        // Setup CLKGC to use the On-Chip RC oscillator and move
491
        // the MSS clock to CLKGC. No division factor is applied
492
        // therefore FCLK = 100MHz
493
 
494
        // CLKC = RCOSC
495
        hal_a2fxxx_set_clkx( CLKx_SRC_CLKC, CLKx_SRC_RCOSC );
496
 
497
        // CLKGC = CLKC
498
        hal_a2fxxx_set_clkgx_default( CLKx_SRC_CLKGC );
499
 
500
        // FCLK = CLKGC
501
        hal_a2fxxx_set_ngmux( CLKx_SRC_CLKGC );
502
    }
503
    else {
504
        HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
505
                         CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
506
        mss_ccc_mux &= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OCMUX(OXMUX_CLEAR);
507
        mss_ccc_mux = mss_ccc_mux >> 19;
508
 
509
        // Make sure PLL is bypassed.
510
        if ( mss_ccc_mux != 1 ){
511
            hal_a2fxxx_set_clkx( CLKx_SRC_CLKC, CLKx_SRC_RCOSC );
512
            hal_a2fxxx_set_clkgx_default( CLKx_SRC_CLKGC );
513
        }
514
    }
515
 
516
    // Now we can configure CLKGA as specified by the
517
    // user. Check is PLL should be configured.
518
    hal_a2fxxx_set_clkx( CLKx_SRC_CLKA, CLKA_SRC_SEL );
519
 
520
# if defined(CYGHWR_HAL_CORTEXM_A2FXXX_PLL)
521
    hal_a2fxxx_set_pll( );
522
    pll = true;
523
# endif
524
 
525
    // Move to CLKGA
526
    hal_a2fxxx_set_clkgx( CLKx_SRC_CLKGA );
527
    clka = clkga = true;
528
    hal_a2fxxx_set_ngmux( CLKx_SRC_CLKGA );
529
 
530
#endif  // CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_CLKGA
531
 
532
 
533
    //
534
    // In the following case, NGMUX is configured to use CLKGC.
535
    // This can be tricky as CLKGC can be routed from CLKGA...
536
    //
537
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_CLKGC
538
 
539
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
540
                           CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
541
    mss_ccc_mux &= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OCMUX(OXMUX_CLEAR);
542
    mss_ccc_mux = mss_ccc_mux >> 19;
543
 
544
    // If CLKGC is not routed form CLKC or if CLKGC is not used
545
    // as NGMUX output, proceed to configure CLKGC = CLKC
546
    if( ((ngmux == CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLC) && (mss_ccc_mux != 1)) ||
547
                (ngmux == CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLA) )
548
    {
549
 
550
        // Set CLKC source, use on-chip oscillator as default
551
        // value
552
# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_CLKC
553
        hal_a2fxxx_set_clkx( CLKx_SRC_CLKC, CLKC_SRC_SEL );
554
        clkc = true;
555
# else
556
        hal_a2fxxx_set_clkx( CLKx_SRC_CLKC, CLKx_SRC_RCOSC );
557
# endif
558
 
559
        // Set CLKGC = CLKC
560
        hal_a2fxxx_set_clkgx_default( CLKx_SRC_CLKGC );
561
 
562
        // Set NGMUX = CLKGC
563
        hal_a2fxxx_set_ngmux( CLKx_SRC_CLKGC );
564
 
565
        // Configure PLL input if in use
566
# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_PLL
567
        hal_a2fxxx_set_clkx( CLKx_SRC_CLKA, CLKA_SRC_SEL );
568
        clka = true;
569
# endif
570
 
571
    }
572
    else {
573
 
574
        // Set CLKA source, use on-chip oscillator as default
575
        // value
576
# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKA
577
        hal_a2fxxx_set_clkx( CLKx_SRC_CLKA, CLKA_SRC_SEL );
578
        clka = true;
579
# else
580
        hal_a2fxxx_set_clkx( CLKx_SRC_CLKA, CLKx_SRC_RCOSC );
581
# endif
582
 
583
# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_CLKC
584
        // CLKGA = CLKA
585
        hal_a2fxxx_set_clkgx_default( CLKx_SRC_CLKGA );
586
 
587
        // Move NGMUX = CLKGA
588
        hal_a2fxxx_set_ngmux( CLKx_SRC_CLKGA );
589
 
590
        // Now we can Configure CLKC
591
        hal_a2fxxx_set_clkx( CLKx_SRC_CLKC, CLKC_SRC_SEL );
592
# endif
593
 
594
    }
595
 
596
# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_PLL
597
    hal_a2fxxx_set_pll( );
598
    pll = true;
599
# endif
600
 
601
    clkgc = true;
602
    hal_a2fxxx_set_clkgx( CLKx_SRC_CLKGC );
603
    hal_a2fxxx_set_ngmux( CLKx_SRC_CLKGC );
604
 
605
#endif // CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_CLKGC
606
 
607
 
608
    // Configure CLKA
609
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKA
610
    if ( clka == false ){
611
       hal_a2fxxx_set_clkx( CLKx_SRC_CLKA, CLKA_SRC_SEL );
612
    }
613
#endif
614
 
615
    // Configure the PLL
616
#if defined(CYGHWR_HAL_CORTEXM_A2FXXX_PLL)
617
    if ( pll == false ){
618
        hal_a2fxxx_set_pll( );
619
    }
620
#endif
621
 
622
    // Configure CLKB
623
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKB
624
    hal_a2fxxx_set_clkx( CLKx_SRC_CLKB, CLKB_SRC_SEL );
625
#endif
626
 
627
    // Configure CLKC
628
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKC
629
    if ( clkc == false ){
630
        hal_a2fxxx_set_clkx( CLKx_SRC_CLKC, CLKC_SRC_SEL );
631
    }
632
#endif
633
 
634
    // Configure CLKGA
635
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA
636
    if ( clkga == false ){
637
        hal_a2fxxx_set_clkgx( CLKx_SRC_CLKA );
638
    }
639
#endif
640
 
641
    // Configure CLKGB
642
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB
643
    hal_a2fxxx_set_clkgx( CLKx_SRC_CLKB );
644
#endif
645
 
646
    // Configure CLKGC
647
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC
648
    if ( clkgc == false ){
649
        hal_a2fxxx_set_clkgx( CLKx_SRC_CLKC );
650
    }
651
#endif
652
 
653
    // Now, configure all MSS clock dividers
654
    //
655
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
656
                           CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
657
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
658
                           CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR, mss_clk_cr);
659
 
660
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_ACE_CLK
661
    mss_clk_cr &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_ACLKDIV(DIV_CLEAR) );
662
    mss_clk_cr |=  ( CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_ACLKDIV(ACLKDIV) );
663
#endif
664
 
665
    mss_clk_cr &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_PCLK1DIV(DIV_CLEAR) |
666
                     CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_PCLK0DIV(DIV_CLEAR) );
667
 
668
    mss_clk_cr |=  ( CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_PCLK1DIV(PCLK1DIV) |
669
                     CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_PCLK0DIV(PCLK0DIV) );
670
 
671
    // Record the different clock frequencies
672
    hal_cortexm_systick_clock = CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_FREQ;
673
    hal_a2fxxx_fclk  = CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_FREQ;
674
    hal_a2fxxx_pclk0 = CYGHWR_HAL_CORTEXM_A2FXXX_PCLK0_FREQ;
675
    hal_a2fxxx_pclk1 = CYGHWR_HAL_CORTEXM_A2FXXX_PCLK1_FREQ;
676
 
677
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK
678
    hal_a2fxxx_pclk_fpga = CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK_FREQ;
679
#endif
680
 
681
    // Configure the MAC clock
682
#if defined(CYGHWR_HAL_CORTEXM_A2FXXX_MAC_CLK) && \
683
          defined(CYGHWR_HAL_CORTEXM_A2FXXX_MAC_SRC_CLKGC)
684
 
685
    mss_clk_cr |= CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_RMIICLKSEL;
686
 
687
#elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_MAC_CLK) && \
688
          defined(CYGHWR_HAL_CORTEXM_A2FXXX_MAC_SRC_EXTERNAL)
689
 
690
    mss_clk_cr &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_RMIICLKSEL;
691
 
692
#endif
693
 
694
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC + CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR,
695
                      mss_clk_cr);
696
 
697
    // PLL is disable if not in used
698
#if !defined(CYGHWR_HAL_CORTEXM_A2FXXX_PLL)
699
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
700
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR, 0x0);
701
#endif
702
}
703
 
704
 
705
//==========================================================================
706
// Get / Set NGMUX settings
707
 
708
static cyg_uint8
709
hal_a2fxxx_get_ngmux( void )
710
{
711
    cyg_uint32 mss_ccc_mux;
712
    cyg_uint8  ngmux_setting;
713
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
714
                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
715
 
716
    mss_ccc_mux = mss_ccc_mux >> 24;
717
    switch( mss_ccc_mux & 0xf ){
718
    case  0:
719
    case  2:
720
    case  4:
721
    case  6:
722
    case 12:
723
        ngmux_setting = CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLA;
724
        break;
725
    case  1:
726
    case  3:
727
    case  8:
728
    case 10:
729
    case 13:
730
        ngmux_setting = CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLC;
731
        break;
732
    case  5:
733
    case  7:
734
    case  9:
735
    case 11:
736
    case 14:
737
        ngmux_setting = CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLINT;
738
        break;
739
    default:
740
        ngmux_setting = CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GND;
741
        break;
742
    }
743
 
744
    return ngmux_setting;
745
}
746
 
747
 
748
static void
749
hal_a2fxxx_set_ngmux( cyg_uint8 x )
750
{
751
    cyg_uint32 mss_ccc_mux;
752
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
753
                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
754
 
755
    // Clear bits
756
    mss_ccc_mux &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXSEL(0x3) |
757
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXCFG(0x3) );
758
 
759
    if( x == CLKx_SRC_CLKGA ){
760
        mss_ccc_mux |= ( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXSEL(0) |
761
                         CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXCFG(0) );
762
    }
763
    else if (x == CLKx_SRC_CLKGC ){
764
        mss_ccc_mux |= ( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXSEL(1) |
765
                         CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXCFG(0) );
766
    }
767
    else{
768
        mss_ccc_mux |= ( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXSEL(2) |
769
                         CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXCFG(3) );
770
    }
771
 
772
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
773
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
774
}
775
 
776
 
777
//==========================================================================
778
// Setup PLL
779
 
780
#if defined(CYGHWR_HAL_CORTEXM_A2FXXX_PLL)
781
static inline void
782
hal_a2fxxx_set_pll( void )
783
{
784
    cyg_uint32 x =
785
    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_FINDIV((CYGHWR_HAL_CORTEXM_A2FXXX_PLL_DIV-1)) |
786
    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_FBDIV((CYGHWR_HAL_CORTEXM_A2FXXX_PLL_MULT-1)) |
787
    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_FBSEL(1) |
788
    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_FBDLY(CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FB_DELAY) |
789
    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_VCOSEL0 |
790
    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_VCOSEL2_1(PLL_RANGE) |
791
    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_PLLEN;
792
 
793
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC + CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR, x);
794
 
795
    // Wait PLL lock
796
    do {
797
        HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC + CYGHWR_HAL_A2FXXX_SC_MSS_CCC_SR, x);
798
    } while( (x & CYGHWR_HAL_A2FXXX_SC_MSS_CCC_SR_PLL_LOCK_SYNC) == 0);
799
}
800
#endif
801
 
802
 
803
//==========================================================================
804
// Setup CLKA, CLKB or CLKC input clock
805
 
806
static void
807
hal_a2fxxx_set_clkx( cyg_uint8 x, cyg_uint8 src )
808
{
809
    cyg_uint32 mss_ccc_mux;
810
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
811
                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
812
    if( x == CLKx_SRC_CLKA ){
813
        mss_ccc_mux &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_DYNASEL |
814
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_RXASEL  |
815
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_STATASEL );
816
        mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_CLKA_SEL (src);
817
    }
818
    else if (x == CLKx_SRC_CLKB ){
819
        mss_ccc_mux &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_DYNBSEL |
820
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_RXBSEL  |
821
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_STATBSEL );
822
        mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_CLKB_SEL (src);
823
    }
824
    else{
825
        mss_ccc_mux &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_DYNCSEL |
826
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_RXCSEL  |
827
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_STATCSEL );
828
        mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_CLKC_SEL (src);
829
    }
830
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
831
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
832
}
833
 
834
 
835
//==========================================================================
836
// Setup CLKGA, CLKGB or CLKGC output clock
837
 
838
static void
839
hal_a2fxxx_set_clkgx( cyg_uint8 x )
840
{
841
    cyg_uint32 mss_ccc_mux;
842
    cyg_uint32 mss_ccc_dly;
843
    cyg_uint32 mss_ccc_div;
844
    cyg_uint8  div10;
845
    cyg_uint8  div;
846
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
847
                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
848
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
849
                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR, mss_ccc_dly);
850
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
851
                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR, mss_ccc_div);
852
 
853
    if( x == CLKx_SRC_CLKGA ){
854
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA
855
        // Clear bits
856
        mss_ccc_div &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIV(OXDIV_CLEAR) |
857
                          CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIVHALF );
858
        mss_ccc_dly &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYA(DLYX_CLEAR);
859
        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OAMUX(OXMUX_CLEAR);
860
        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSA;
861
        // Compute divider
862
        div10 = CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_DIV10;
863
        div = (cyg_uint8) CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_DIV;
864
        if( div10 % 10 ){
865
            div += 1;
866
            mss_ccc_div |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIVHALF;
867
        }
868
        else {
869
           div -= 1;
870
        }
871
        // CLKA = CLGA, bypass MUX
872
        if (div == 0 && CLKGA_SRC_SEL == 1) {
873
            mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSA;
874
        }
875
        else {
876
            mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OAMUX(CLKGA_SRC_SEL);
877
            mss_ccc_div |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIV(div);
878
        }
879
        mss_ccc_dly |=
880
        CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYA(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_DELAY);
881
#endif
882
    }
883
    if ( x == CLKx_SRC_CLKGB ){
884
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB
885
        // Clear bits
886
        mss_ccc_div &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OBDIV(OXDIV_CLEAR) |
887
                          CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OBDIVHALF );
888
        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OBMUX(OXMUX_CLEAR);
889
        mss_ccc_dly &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYB(DLYX_CLEAR);
890
        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSB;
891
        // Compute divider
892
        div10 = CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DIV10;
893
        div = (cyg_uint8) CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DIV;
894
        if( div10 % 10 ){
895
            div += 1;
896
            mss_ccc_div |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OBDIVHALF;
897
        }
898
        else {
899
           div -= 1;
900
        }
901
        // CLKB = CLGB, bypass MUX
902
        if (div == 0 && CLKGB_SRC_SEL == 1) {
903
            mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSB;
904
        }
905
        else {
906
            mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OBMUX(CLKGB_SRC_SEL);
907
            mss_ccc_div |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OBDIV(div);
908
            mss_ccc_dly |=
909
            CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYB(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DELAY);
910
        }
911
#endif
912
    }
913
    if ( x == CLKx_SRC_CLKGC ){
914
#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC
915
        // Clear bits
916
        mss_ccc_div &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIV(OXDIV_CLEAR) |
917
                          CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIVHALF );
918
        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OCMUX(OXMUX_CLEAR);
919
        mss_ccc_dly &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYC(DLYX_CLEAR);
920
        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSC;
921
        // Compute divider
922
        div10 = CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DIV10;
923
        div = (cyg_uint8) CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DIV;
924
        if( div10 % 10 ){
925
            div += 1;
926
            mss_ccc_div |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIVHALF;
927
        }
928
        else {
929
           div -= 1;
930
        }
931
        // CLKC = CLGC, bypass MUX
932
        if (div == 0 && CLKGC_SRC_SEL == 1) {
933
            mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSC;
934
        }
935
        else {
936
            mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OCMUX(CLKGC_SRC_SEL);
937
            mss_ccc_div |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIV(div);
938
        }
939
        mss_ccc_dly |=
940
        CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYC(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DELAY);
941
#endif
942
    }
943
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
944
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR, mss_ccc_div);
945
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
946
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR, mss_ccc_dly);
947
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
948
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
949
}
950
 
951
//==========================================================================
952
// Setup CLKGA CLKGC output clock
953
 
954
static void
955
hal_a2fxxx_set_clkgx_default( cyg_uint8 x )
956
{
957
    cyg_uint32 mss_ccc_mux;
958
    cyg_uint32 mss_ccc_dly;
959
    cyg_uint32 mss_ccc_div;
960
 
961
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
962
                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
963
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
964
                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR, mss_ccc_dly);
965
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
966
                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR, mss_ccc_div);
967
 
968
    if( x == CLKx_SRC_CLKGA ){
969
        // Clear bits
970
        mss_ccc_div &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIV(OXDIV_CLEAR) |
971
                          CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIVHALF );
972
        mss_ccc_dly &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYA(DLYX_CLEAR);
973
        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OAMUX(OXMUX_CLEAR);
974
        // CLKGA = CLKA, Division factor = 1 and minimum delay of 535ps
975
        mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSA;
976
        mss_ccc_dly |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYA(0);
977
    }
978
    if ( x == CLKx_SRC_CLKGC ){
979
        // Clear bits
980
        mss_ccc_div &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIV(OXDIV_CLEAR) |
981
                          CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIVHALF );
982
        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OCMUX(OXMUX_CLEAR);
983
        mss_ccc_dly &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYC(DLYX_CLEAR);
984
        // CLKGC = CLKC, Division factor = 1 and minimum delay of 535ps
985
        mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSC;
986
        mss_ccc_dly |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYC(0);
987
    }
988
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
989
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR, mss_ccc_div);
990
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
991
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR, mss_ccc_dly);
992
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
993
                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
994
}
995
 
996
 
997
//==========================================================================
998
// Adjust ENVM timing
999
 
1000
static void
1001
hal_a2fxxx_set_envm_timing( void ) {
1002
    cyg_uint32 x;
1003
    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC + CYGHWR_HAL_A2FXXX_SC_ENVM_CR, x);
1004
    x &= ~CYGHWR_HAL_A2FXXX_SC_ENVM_CR_SIX_CYCLE;
1005
    if( hal_a2fxxx_fclk <= 80e6 ){
1006
        x |= CYGHWR_HAL_A2FXXX_SC_ENVM_CR_PIPE_BYPASS;
1007
    } else {
1008
        x &= ~CYGHWR_HAL_A2FXXX_SC_ENVM_CR_PIPE_BYPASS;
1009
    }
1010
    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC + CYGHWR_HAL_A2FXXX_SC_ENVM_CR, x);
1011
}
1012
 
1013
#endif // CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK
1014
 
1015
 
1016
//==========================================================================
1017
// Reset modules
1018
 
1019
__externC void
1020
hal_a2fxxx_periph_release( cyg_uint32 bit )
1021
{
1022
    cyg_uint32 sc, base = CYGHWR_HAL_A2FXXX_SC;
1023
    HAL_READ_UINT32( base + CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR, sc );
1024
    sc &= ~( bit );
1025
    HAL_WRITE_UINT32( base + CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR, sc );
1026
}
1027
 
1028
 
1029
__externC void
1030
hal_a2fxxx_periph_reset( cyg_uint32 bit )
1031
{
1032
    cyg_uint32 sc, base = CYGHWR_HAL_A2FXXX_SC;
1033
    HAL_READ_UINT32( base + CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR , sc );
1034
    sc |= ( bit );
1035
    HAL_WRITE_UINT32( base + CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR , sc );
1036
}
1037
 
1038
 
1039
//==========================================================================
1040
// GPIO support
1041
//
1042
 
1043
const default_io_mux_type default_io_mux[] = {
1044
   // SPI0
1045
   {0x00}, {0x0a}, {0x00}, {0x00},
1046
   // UART0
1047
   {0x18}, {0x00},
1048
   // I2C0
1049
   {0x00}, {0x00},
1050
   // SPI1
1051
   {0x00}, {0x0a}, {0x00}, {0x00},
1052
   // UART1
1053
   {0x18}, {0x00},
1054
   // I2C1
1055
   {0x00}, {0x00},
1056
   // MAC0
1057
   {0x18}, {0x18}, {0x0a}, {0x0a}, {0x18}, {0x0a}, {0x0a}, {0x00}, {0x18},
1058
   // GPIO
1059
   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
1060
   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
1061
   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
1062
   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
1063
   // SPI0 CS
1064
   {0x00}, {0x00}, {0x00},
1065
   // Unused
1066
   {0x00}, {0x00}, {0x00}, {0x00},
1067
   // UART0 misc
1068
   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
1069
   // SPI1 CS
1070
   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
1071
   // UART1 misc
1072
   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
1073
   {0x0}
1074
};
1075
 
1076
// These functions provide configuration and IO for GPIO pins.
1077
 
1078
__externC void
1079
hal_a2fxxx_gpio_set( cyg_uint32 pin )
1080
{
1081
    cyg_uint32 bit  = CYGHWR_HAL_A2FXXX_GPIO_BIT( pin );
1082
    cyg_uint32 mode = CYGHWR_HAL_A2FXXX_GPIO_MODE( pin );
1083
    cyg_uint32 mux  = CYGHWR_HAL_A2FXXX_GPIO_IOMUX_IDX( pin );
1084
    cyg_uint32 irq  = CYGHWR_HAL_A2FXXX_GPIO_IRQ( pin );
1085
    cyg_uint32 reg    = 0;
1086
    cyg_uint32 io_mux = 0;
1087
 
1088
    if (pin == CYGHWR_HAL_A2FXXX_GPIO_NONE)
1089
        return;
1090
 
1091
    if(mode == CYGHWR_HAL_A2FXXX_GPIO_MODE_PERIPH){
1092
       // Set IOMUX default value for peripheral use
1093
       io_mux = default_io_mux[mux].val;
1094
       HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
1095
                         CYGHWR_HAL_A2FXXX_SC_IOMUX( mux ), io_mux );
1096
    } else {
1097
       // Set GPIO input/ output mode
1098
       if (mode == CYGHWR_HAL_A2FXXX_GPIO_MODE_OUT) {
1099
           reg = CYGHWR_HAL_A2FXXX_GPIO_CFG_GPOUTEN |
1100
                 CYGHWR_HAL_A2FXXX_GPIO_CFG_OUTBUFEN;
1101
       }
1102
 
1103
       // Configure IO as interrupt
1104
       if (irq != CYGHWR_HAL_A2FXXX_GPIO_IRQ_DISABLE) {
1105
           reg |= CYGHWR_HAL_A2FXXX_GPIO_CFG_GPINTEN;
1106
           if(irq & CYGHWR_HAL_A2FXXX_GPIO_IRQ_FALLING_EDGE)
1107
              reg |= CYGHWR_HAL_A2FXXX_GPIO_CFG_INTYPE(0);
1108
           else if(irq & CYGHWR_HAL_A2FXXX_GPIO_IRQ_RISING_EDGE)
1109
              reg |= CYGHWR_HAL_A2FXXX_GPIO_CFG_INTYPE(1);
1110
           else if(irq & CYGHWR_HAL_A2FXXX_GPIO_IRQ_BOTH_EDGES)
1111
              reg |= CYGHWR_HAL_A2FXXX_GPIO_CFG_INTYPE(2);
1112
           else if(irq & CYGHWR_HAL_A2FXXX_GPIO_IRQ_LOW_LEVEL)
1113
              reg |= CYGHWR_HAL_A2FXXX_GPIO_CFG_INTYPE(3);
1114
           else
1115
              reg |= CYGHWR_HAL_A2FXXX_GPIO_CFG_INTYPE(4);
1116
       }
1117
 
1118
       // Write down result
1119
       HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_MSS_GPIO +
1120
                       ( CYGHWR_HAL_A2FXXX_MSS_GPIO_CFG( bit ) ), reg );
1121
 
1122
       // For GPIO 16 to 31, we must setup the IOMUX
1123
       // TODO, this is for output only?
1124
       if( bit > 15 ){
1125
          bit = bit - 16;
1126
          io_mux = 0x35;
1127
          HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
1128
                            CYGHWR_HAL_A2FXXX_SC_IOMUX( bit ), io_mux );
1129
       }
1130
 
1131
    }
1132
}
1133
 
1134
 
1135
__externC void
1136
hal_a2fxxx_gpio_out( cyg_uint32 pin, int val )
1137
{
1138
    cyg_uint32 bit = ( CYGHWR_HAL_A2FXXX_GPIO_BIT(pin) << 2 );
1139
    cyg_uint32 port =  CYGHWR_HAL_A2FXXX_MSS_GPIO_BB +
1140
                     ( CYGHWR_HAL_A2FXXX_MSS_GPIO_DOUT << 5 );
1141
 
1142
    port += bit;
1143
 
1144
    HAL_WRITE_UINT32( port, val );
1145
}
1146
 
1147
 
1148
__externC void
1149
hal_a2fxxx_gpio_in ( cyg_uint32 pin, int *val )
1150
{
1151
    cyg_uint32 bit = ( CYGHWR_HAL_A2FXXX_GPIO_BIT(pin) << 2 );
1152
    cyg_uint32 port =  CYGHWR_HAL_A2FXXX_MSS_GPIO_BB +
1153
                     ( CYGHWR_HAL_A2FXXX_MSS_GPIO_DIN << 5 );
1154
    cyg_uint32 pd;
1155
 
1156
    port += bit;
1157
 
1158
    HAL_READ_UINT32( port, pd );
1159
    *val = 1 ? (bit & pd) : 0;
1160
}
1161
 
1162
 
1163
//==========================================================================
1164
// I2C clock rate
1165
//
1166
__externC cyg_uint32
1167
hal_a2fxxx_i2c_clock( cyg_uint32 base )
1168
{
1169
    return ( (base == CYGHWR_HAL_A2FXXX_I2C0) ? hal_a2fxxx_pclk0 : hal_a2fxxx_pclk1 );
1170
}
1171
 
1172
 
1173
//==========================================================================
1174
// SPI clock rate
1175
//
1176
__externC cyg_uint32
1177
hal_a2fxxx_spi_clock( cyg_uint32 base )
1178
{
1179
    return ( (base == CYGHWR_HAL_A2FXXX_SPI0) ? hal_a2fxxx_pclk0 : hal_a2fxxx_pclk1 );
1180
}
1181
 
1182
 
1183
//==========================================================================
1184
// UART baud rate
1185
//
1186
// Set the baud rate divider of a UART based on the requested rate and
1187
// the current APB clock settings.
1188
 
1189
__externC void
1190
hal_a2fxxx_uart_setbaud(cyg_uint32 base, cyg_uint32 baud)
1191
{
1192
    cyg_uint16 divider =
1193
         CYG_HAL_CORTEXM_A2FXXX_BAUD_GENERATOR( ((base == CYGHWR_HAL_A2FXXX_UART0)? 0 : 1) , baud );
1194
 
1195
    HAL_WRITE_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_LCR,
1196
                                  CYGHWR_HAL_A2FXXX_UART16550_LCR_DLAB);
1197
    HAL_WRITE_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_DMR, divider >> 8);
1198
    HAL_WRITE_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_DLR, divider & 0xFF);
1199
}
1200
 
1201
 
1202
//==========================================================================
1203
// Idle thread
1204
//
1205
#ifdef CYGSEM_HAL_CORTEXM_A2FXXX_DEFINES_IDLE_THREAD_ACTION
1206
__externC void
1207
hal_idle_thread_action( cyg_uint32 count )
1208
{
1209
    while(1);
1210
}
1211
#endif
1212
 
1213
//==========================================================================
1214
// EOF a2fxxx_misc.c

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.