source: rtems/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspstart.c @ 087a29b4

4.115
Last change on this file since 087a29b4 was 087a29b4, checked in by Sebastian Huber <sebastian.huber@…>, on 04/08/13 at 14:13:18

bsp/mpc55xx: Fix warnings

  • Property mode set to 100644
File size: 2.8 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup mpc55xx
5 *
6 * @brief BSP startup code.
7 */
8
9/*
10 * Copyright (c) 2008-2013 embedded brains GmbH.  All rights reserved.
11 *
12 *  embedded brains GmbH
13 *  Dornierstr. 4
14 *  82178 Puchheim
15 *  Germany
16 *  <rtems@embedded-brains.de>
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.com/license/LICENSE.
21 */
22
23#include <mpc55xx/mpc55xx.h>
24#include <mpc55xx/regs.h>
25#include <mpc55xx/edma.h>
26#include <mpc55xx/emios.h>
27
28#include <string.h>
29
30#include <rtems.h>
31#include <rtems/config.h>
32
33#include <libcpu/powerpc-utility.h>
34#include <bsp/vectors.h>
35
36#include <bsp.h>
37#include <bsp/bootcard.h>
38#include <bsp/irq.h>
39#include <bsp/irq-generic.h>
40#include <bsp/linker-symbols.h>
41#include <bsp/start.h>
42#include <bsp/mpc55xx-config.h>
43
44/* Symbols defined in linker command file */
45LINKER_SYMBOL(mpc55xx_exc_vector_base);
46
47unsigned int bsp_clock_speed = 0;
48
49uint32_t bsp_clicks_per_usec = 0;
50
51void _BSP_Fatal_error(unsigned n)
52{
53        rtems_interrupt_level level;
54
55        (void) level;
56        rtems_interrupt_disable( level);
57
58        while (true) {
59                mpc55xx_wait_for_interrupt();
60        }
61}
62
63void mpc55xx_fatal(mpc55xx_fatal_code code)
64{
65  rtems_fatal(RTEMS_FATAL_SOURCE_BSP_SPECIFIC, code);
66}
67
68static void null_pointer_protection(void)
69{
70#ifdef MPC55XX_NULL_POINTER_PROTECTION
71        struct MMU_tag mmu = { .MAS0 = { .B = { .TLBSEL = 1, .ESEL = 1 } } };
72
73        PPC_SET_SPECIAL_PURPOSE_REGISTER(FSL_EIS_MAS0, mmu.MAS0.R);
74        __asm__ volatile ("tlbre");
75        mmu.MAS1.R = PPC_SPECIAL_PURPOSE_REGISTER(FSL_EIS_MAS1);
76        mmu.MAS1.B.VALID = 0;
77        PPC_SET_SPECIAL_PURPOSE_REGISTER(FSL_EIS_MAS1, mmu.MAS1.R);
78        __asm__ volatile ("tlbwe");
79#endif
80}
81
82void bsp_start(void)
83{
84        null_pointer_protection();
85
86        /*
87         * make sure BSS/SBSS is cleared
88         */
89        memset(&bsp_section_bss_begin [0], 0, (size_t) bsp_section_bss_size);
90
91        /*
92         * Get CPU identification dynamically. Note that the get_ppc_cpu_type()
93         * function store the result in global variables so that it can be used
94         * latter...
95         */
96        get_ppc_cpu_type();
97        get_ppc_cpu_revision();
98
99        /*
100         * determine clock speed
101         */
102        bsp_clock_speed = mpc55xx_get_system_clock() / MPC55XX_SYSTEM_CLOCK_DIVIDER;
103
104        /* Time reference value */
105        bsp_clicks_per_usec = bsp_clock_speed / 1000000;
106
107        /* Initialize exceptions */
108        ppc_exc_vector_base = (uint32_t) mpc55xx_exc_vector_base;
109        ppc_exc_initialize(
110                PPC_INTERRUPT_DISABLE_MASK_DEFAULT,
111                (uintptr_t) bsp_section_work_begin,
112                rtems_configuration_get_interrupt_stack_size()
113        );
114        #ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
115                ppc_exc_set_handler(ASM_ALIGN_VECTOR, ppc_exc_alignment_handler);
116        #endif
117
118        /* Initialize interrupts */
119        bsp_interrupt_initialize();
120
121        mpc55xx_edma_init();
122        #ifdef MPC55XX_EMIOS_PRESCALER
123                mpc55xx_emios_initialize(MPC55XX_EMIOS_PRESCALER);
124        #endif
125}
Note: See TracBrowser for help on using the repository browser.