source: rtems/c/src/lib/libbsp/arm/rtl22xx/startup/bspstart.c @ c4e05c26

4.104.114.84.9
Last change on this file since c4e05c26 was c4e05c26, checked in by Ralf Corsepius <ralf.corsepius@…>, on Apr 25, 2007 at 1:15:07 PM

convert from DOS to unix.

  • Property mode set to 100644
File size: 9.6 KB
Line 
1/*
2 *  LPC22XX Startup code
3 *
4 *  Copyright (c) 2005 by Ray X <rayx.cn@gmail.com>
5 *
6 *  The license and distribution terms for this file may be
7 *  found in the file LICENSE in this distribution or at
8 *
9 *  http://www.rtems.com/license/LICENSE.
10 *
11 *
12 *  $Id$
13*/
14
15#include <bsp.h>
16#include <rtems/libcsupport.h>
17#include <rtems/libio.h>
18#include <lpc22xx.h>
19
20
21/*************************************************************/
22/* Macros                                                    */
23/*************************************************************/
24
25/*************************************************************/
26/* Data Structures                                           */
27/*************************************************************/
28
29/*************************************************************/
30/* Global Variables                                          */
31/*************************************************************/
32/*FIX ME:we do not have SDRAM, but can I define mutiple SRAM?*/
33
34extern void            *_flash_size;
35extern void            *_flash_base;
36extern void            *_sdram_size;
37extern void            *_sdram_base;
38extern void            *_bss_free_start;
39extern void            *_bss_start_;
40extern void            *_bss_end_;
41
42
43unsigned long           free_mem_start;
44unsigned long           free_mem_end;
45
46/* The original BSP configuration table from the application and our copy of it
47   with some changes. */
48
49extern rtems_configuration_table  Configuration;
50rtems_configuration_table  BSP_Configuration;
51
52rtems_cpu_table Cpu_table;                    /* CPU configuration table.    */
53char            *rtems_progname;              /* Program name - from main(). */
54
55/*************************************************************/
56/* Function prototypes                                       */
57/*************************************************************/
58extern void rtems_irq_mngt_init(void);
59void bsp_libc_init( void *, uint32_t, int );
60void bsp_postdriver_hook(void);
61extern void  UART0_Ini(void);
62extern void printi(unsigned long);
63extern void debug_printk(char*);
64/**************************************************************************/
65/*                                                                        */
66/* NAME: bps_pretasking_hook - Function to setup system before startup    */
67/*                                                                        */
68/* DESCRIPTION:                                                           */
69/*   This function is called before drivers are initialized and used      */
70/*   to setup libc and BSP extensions. It configures non cacheable        */
71/*   SDRAM, SRAM, AIM, and ADM regions and sets up the CPU's memory       */
72/*   protection unit.                                                     */
73/*                                                                        */
74/* GLOBALS USED:                                                          */
75/*   free_mem_start                                                 */
76/*   free_mem_end                                                   */
77/*                                                                        */
78/* RESTRICTIONS/LIMITATIONS:                                              */
79/*   Since this function is setting up libc, it cannot use and libc       */
80/*   functions.                                                           */
81/*                                                                        */
82/**************************************************************************/
83void bsp_pretasking_hook(void)
84{
85    uint32_t   heap_start;
86    uint32_t   heap_size;
87
88    /*
89     * Set up the heap. It uses all free SDRAM except that reserved
90     * for non-cached uses.
91     */
92    heap_start =  free_mem_start;
93
94    /*   heap_size = (free_mem_end - heap_start - MEM_NOCACHE_SIZE); */
95    /*the board seems to have only 512K memory, we use 256K as heap*/
96    heap_size = 0x40000;
97
98    bsp_libc_init((void *)heap_start, heap_size, 0);
99
100#ifdef RTEMS_DEBUG
101
102    rtems_debug_enable(RTEMS_DEBUG_ALL_MASK);
103
104#endif /* RTEMS_DEBUG */
105
106} /* bsp_pretasking_hook */
107
108/**************************************************************************/
109/*                                                                        */
110/* NAME: bsp_start_default - BSP initialization function                  */
111/*                                                                        */
112/* DESCRIPTION:                                                           */
113/*   This function is called before RTEMS is initialized and used         */
114/*   adjust the kernel's configuration.                                   */
115/*                                                                        */
116/*   This function also configures the CPU's memory protection unit.      */
117/*                                                                        */
118/* GLOBALS USED:                                                          */
119/*    CPU_table                                                    */
120/*    BSP_Configuration                                            */
121/*    free_mem_start                                               */
122/*    free_mem_end                                                 */
123/*    free_mem_nocache_start                                       */
124/*    _bss_free_start                                              */
125/*    mpu_region_tbl                                               */
126/*                                                                        */
127/*                                                                        */
128/*                                                                        */
129/*                                                                        */
130/* RESTRICTIONS/LIMITATIONS:                                              */
131/*   Since RTEMS is not configured, no RTEMS functions can be called.     */
132/*                                                                        */
133/**************************************************************************/
134void bsp_start_default( void )
135{
136    uint32_t i;
137    PINSEL2 =0x0f814914;
138    BCFG0 = 0x1000ffef;
139    BCFG1 = 0x1000ffef;
140
141    MEMMAP = 0x2;  //debug and excute outside chip
142
143    PLLCON = 1;
144#if (Fpclk / (Fcclk / 4)) == 1
145    VPBDIV = 0;
146#endif
147#if (Fpclk / (Fcclk / 4)) == 2
148    VPBDIV = 2;
149#endif
150#if (Fpclk / (Fcclk / 4)) == 4
151    VPBDIV = 1;
152#endif
153
154#if (Fcco / Fcclk) == 2
155    PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
156#endif
157#if (Fcco / Fcclk) == 4
158    PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
159#endif
160#if (Fcco / Fcclk) == 8
161    PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
162#endif
163#if (Fcco / Fcclk) == 16
164    PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
165#endif
166    PLLFEED = 0xaa;
167    PLLFEED = 0x55;
168    while((PLLSTAT & (1 << 10)) == 0);
169    PLLCON = 3;
170    PLLFEED = 0xaa;
171    PLLFEED = 0x55;
172
173    /* memory configure */
174    //MAMCR = 0;
175    // MAMTIM = 3;
176    //MAMCR = 2;
177
178    /* init VIC */
179    VICIntEnClr = 0xffffffff;
180    VICVectAddr = 0;
181    VICIntSelect = 0;
182
183    /* disable interrupts */
184    /* Setup interrupt controller.*/
185    VICProtection = 0;
186
187
188    Cpu_table.pretasking_hook        = bsp_pretasking_hook;
189    Cpu_table.postdriver_hook        = bsp_postdriver_hook;
190    Cpu_table.do_zero_of_workspace   = TRUE;
191    BSP_Configuration.microseconds_per_tick=100000;
192    /* Place RTEMS workspace at beginning of free memory. */
193    BSP_Configuration.work_space_start = (void *)&_bss_free_start;
194
195    free_mem_start = ((uint32_t)&_bss_free_start +
196                      BSP_Configuration.work_space_size);
197
198    free_mem_end = ((uint32_t)&_sdram_base + (uint32_t)&_sdram_size);
199
200    UART0_Ini();
201
202    #if 0
203    debug_printk(" bsp_start_defalt");
204   
205    debug_printk(" _bss_free_start");
206    printi((int)&_bss_free_start);
207
208    debug_printk(" free_mem_start");
209    printi((int)free_mem_start);
210
211    debug_printk(" _sdram_base");
212    printi((int)&_sdram_base);
213
214    debug_printk(" _sdram_size");
215    printi((int)&_sdram_size);
216
217    debug_printk(" free_mem_end");
218    printi((int)free_mem_end);
219
220   
221    printi(free_mem_end);
222    #endif
223
224    /*
225     * Init rtems exceptions management
226     */
227    rtems_exception_init_mngt();
228
229    /*
230     * Init rtems interrupt management
231     */
232    rtems_irq_mngt_init();
233
234    /*
235     *  The following information is very useful when debugging.
236     */
237#if 0
238
239    printk( "work_space_size = 0x%x\n", BSP_Configuration.work_space_size );
240    printk( "maximum_extensions = 0x%x\n", BSP_Configuration.maximum_extensions );
241    printk( "microseconds_per_tick = 0x%x\n",
242            BSP_Configuration.microseconds_per_tick );
243    printk( "ticks_per_timeslice = 0x%x\n",
244            BSP_Configuration.ticks_per_timeslice );
245    printk( "maximum_devices = 0x%x\n", BSP_Configuration.maximum_devices );
246    printk( "number_of_device_drivers = 0x%x\n",
247            BSP_Configuration.number_of_device_drivers );
248    printk( "Device_driver_table = 0x%x\n",
249            BSP_Configuration.Device_driver_table );
250
251    /*  printk( "_stack_size = 0x%x\n", _stack_size );*/
252    printk( "work_space_start = 0x%x\n", BSP_Configuration.work_space_start );
253    printk( "work_space_size = 0x%x\n", BSP_Configuration.work_space_size );
254#endif
255} /* bsp_start */
256
257
258/**
259 *  Reset the system.
260 *
261 *  This functions enables the watchdog and waits for it to
262 *  fire, thus resetting the system.
263 */
264/**
265 *  Reset the system.
266 *
267 *  This functions enables the watchdog and waits for it to
268 *  fire, thus resetting the system.
269 */
270void bsp_reset(void)
271{
272    rtems_interrupt_level level;
273
274    _CPU_ISR_Disable(level);
275
276    while(1);
277}
278
279/*
280 *  By making this a weak alias for bsp_start_default, a brave soul
281 *  can override the actual bsp_start routine used.
282 */
283
284void bsp_start (void) __attribute__ ((weak, alias("bsp_start_default")));
Note: See TracBrowser for help on using the repository browser.