1 |
27 |
unneback |
#ifndef __BSP_BSP_H__
|
2 |
|
|
#define __BSP_BSP_H__
|
3 |
|
|
//==========================================================================
|
4 |
|
|
//
|
5 |
|
|
// bsp.h
|
6 |
|
|
//
|
7 |
|
|
// Public interface to Red Hat BSP.
|
8 |
|
|
//
|
9 |
|
|
//==========================================================================
|
10 |
|
|
//####ECOSGPLCOPYRIGHTBEGIN####
|
11 |
|
|
// -------------------------------------------
|
12 |
|
|
// This file is part of eCos, the Embedded Configurable Operating System.
|
13 |
|
|
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
|
14 |
|
|
//
|
15 |
|
|
// eCos is free software; you can redistribute it and/or modify it under
|
16 |
|
|
// the terms of the GNU General Public License as published by the Free
|
17 |
|
|
// Software Foundation; either version 2 or (at your option) any later version.
|
18 |
|
|
//
|
19 |
|
|
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
|
20 |
|
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
21 |
|
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
22 |
|
|
// for more details.
|
23 |
|
|
//
|
24 |
|
|
// You should have received a copy of the GNU General Public License along
|
25 |
|
|
// with eCos; if not, write to the Free Software Foundation, Inc.,
|
26 |
|
|
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
27 |
|
|
//
|
28 |
|
|
// As a special exception, if other files instantiate templates or use macros
|
29 |
|
|
// or inline functions from this file, or you compile this file and link it
|
30 |
|
|
// with other works to produce a work based on this file, this file does not
|
31 |
|
|
// by itself cause the resulting work to be covered by the GNU General Public
|
32 |
|
|
// License. However the source code for this file must still be made available
|
33 |
|
|
// in accordance with section (3) of the GNU General Public License.
|
34 |
|
|
//
|
35 |
|
|
// This exception does not invalidate any other reasons why a work based on
|
36 |
|
|
// this file might be covered by the GNU General Public License.
|
37 |
|
|
//
|
38 |
|
|
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
|
39 |
|
|
// at http://sources.redhat.com/ecos/ecos-license/
|
40 |
|
|
// -------------------------------------------
|
41 |
|
|
//####ECOSGPLCOPYRIGHTEND####
|
42 |
|
|
//==========================================================================
|
43 |
|
|
//#####DESCRIPTIONBEGIN####
|
44 |
|
|
//
|
45 |
|
|
// Author(s):
|
46 |
|
|
// Contributors: gthomas
|
47 |
|
|
// Date: 1999-10-20
|
48 |
|
|
// Purpose: Public interface to Red Hat BSP.
|
49 |
|
|
// Description:
|
50 |
|
|
//
|
51 |
|
|
//
|
52 |
|
|
//####DESCRIPTIONEND####
|
53 |
|
|
//
|
54 |
|
|
//=========================================================================
|
55 |
|
|
|
56 |
|
|
|
57 |
|
|
#ifndef __ASSEMBLER__
|
58 |
|
|
|
59 |
|
|
/* needed for _bsp_vsprintf() */
|
60 |
|
|
#include <stdarg.h>
|
61 |
|
|
|
62 |
|
|
/*
|
63 |
|
|
* Exception and interrupt handler type.
|
64 |
|
|
*/
|
65 |
|
|
#ifndef _BSP_HANDLER_T_DEFINED
|
66 |
|
|
#define _BSP_HANDLER_T_DEFINED
|
67 |
|
|
typedef int (*bsp_handler_t)(int __irq_nr, void *__regs);
|
68 |
|
|
#endif // _BSP_HANDLER_T_DEFINED
|
69 |
|
|
|
70 |
|
|
/*
|
71 |
|
|
* Vector descriptor. This is needed for chaining vectors. The interfaces use
|
72 |
|
|
* bsp_vec structure pointers instead of direct pointers to handlers. This
|
73 |
|
|
* puts the responsibility for allocating the bsp_vec structures on the
|
74 |
|
|
* caller, rather than the BSP code.
|
75 |
|
|
*/
|
76 |
|
|
typedef struct bsp_vec {
|
77 |
|
|
bsp_handler_t handler; /* pointer to actual ISR */
|
78 |
|
|
struct bsp_vec *next; /* for chaining */
|
79 |
|
|
} bsp_vec_t;
|
80 |
|
|
|
81 |
|
|
/*
|
82 |
|
|
* Valid op values for vector install routines.
|
83 |
|
|
*/
|
84 |
|
|
#define BSP_VEC_REPLACE 0
|
85 |
|
|
#define BSP_VEC_CHAIN_FIRST 1
|
86 |
|
|
#define BSP_VEC_CHAIN_LAST 2
|
87 |
|
|
|
88 |
|
|
/*
|
89 |
|
|
* Valid kinds of vectors supported by vector install and remove
|
90 |
|
|
* routines.
|
91 |
|
|
*/
|
92 |
|
|
#define BSP_VEC_EXCEPTION 0
|
93 |
|
|
#define BSP_VEC_INTERRUPT 1
|
94 |
|
|
|
95 |
|
|
/*
|
96 |
|
|
* Routine to cause a breakpoint exception.
|
97 |
|
|
*/
|
98 |
|
|
extern void bsp_breakpoint(void);
|
99 |
|
|
|
100 |
|
|
/*
|
101 |
|
|
* Dummy function whose address is the address of
|
102 |
|
|
* the breakpoint caused by calling bsp_breakpoint().
|
103 |
|
|
*/
|
104 |
|
|
extern void bsp_breakinsn(void);
|
105 |
|
|
|
106 |
|
|
/*
|
107 |
|
|
* Enable given irq.
|
108 |
|
|
*/
|
109 |
|
|
extern void bsp_enable_irq(int __irq_nr);
|
110 |
|
|
|
111 |
|
|
/*
|
112 |
|
|
* Disable given irq. Returns true if irq was enabled.
|
113 |
|
|
*/
|
114 |
|
|
extern int bsp_disable_irq(int __irq_nr);
|
115 |
|
|
|
116 |
|
|
/*
|
117 |
|
|
* Remove given vector from vector chain.
|
118 |
|
|
*/
|
119 |
|
|
extern void bsp_remove_vec(int __vec_kind,
|
120 |
|
|
int __vec_nr,
|
121 |
|
|
bsp_vec_t *__vec);
|
122 |
|
|
|
123 |
|
|
/*
|
124 |
|
|
* Install a vector chain.
|
125 |
|
|
*
|
126 |
|
|
* vec_kind may be BSP_VEC_EXCEPTION or BSP_VEC_INTERRUPT.
|
127 |
|
|
* vec_nr is the exception or interrupt number.
|
128 |
|
|
* op may be one of:
|
129 |
|
|
* BSP_VEC_REPLACE - replace existing chain.
|
130 |
|
|
* BSP_VEC_CHAIN_FIRST - install at head of chain.
|
131 |
|
|
* BSP_VEC_CHAIN_LAST - install at tail of chain.
|
132 |
|
|
*
|
133 |
|
|
*/
|
134 |
|
|
extern bsp_vec_t *bsp_install_vec(int __vec_kind,
|
135 |
|
|
int __vec_nr,
|
136 |
|
|
int __op,
|
137 |
|
|
bsp_vec_t *__vec);
|
138 |
|
|
|
139 |
|
|
/*
|
140 |
|
|
* Install a debug handler.
|
141 |
|
|
* Returns old handler being replaced.
|
142 |
|
|
*/
|
143 |
|
|
extern bsp_handler_t bsp_install_dbg_handler(bsp_handler_t __new_handler);
|
144 |
|
|
|
145 |
|
|
/*
|
146 |
|
|
* Sometimes it is desireable to call the debug handler directly. This routine
|
147 |
|
|
* accomplishes that. It is the responsibility of the caller to insure that
|
148 |
|
|
* interrupts are disabled before calling this routine.
|
149 |
|
|
*/
|
150 |
|
|
extern void bsp_invoke_dbg_handler(int __exc_nr, void *__regs);
|
151 |
|
|
|
152 |
|
|
/*
|
153 |
|
|
* Install a 'kill' handler. This handler is called when debugger
|
154 |
|
|
* issues a kill command.
|
155 |
|
|
* Returns old handler being replaced.
|
156 |
|
|
*/
|
157 |
|
|
extern bsp_handler_t bsp_install_kill_handler(bsp_handler_t __new_handler);
|
158 |
|
|
|
159 |
|
|
/*
|
160 |
|
|
* Architecure specific routine to prepare CPU to execute
|
161 |
|
|
* a single machine instruction.
|
162 |
|
|
*/
|
163 |
|
|
#ifndef USE_ECOS_HAL_SINGLESTEP
|
164 |
|
|
extern void bsp_singlestep_setup(void *__saved_regs);
|
165 |
|
|
#endif /* USE_ECOS_HAL_SINGLESTEP */
|
166 |
|
|
|
167 |
|
|
/*
|
168 |
|
|
* Architecure specific routine to cleanup after a single-step
|
169 |
|
|
* completes.
|
170 |
|
|
*/
|
171 |
|
|
#ifndef USE_ECOS_HAL_SINGLESTEP
|
172 |
|
|
extern void bsp_singlestep_cleanup(void *__saved_regs);
|
173 |
|
|
#endif /* USE_ECOS_HAL_SINGLESTEP */
|
174 |
|
|
|
175 |
|
|
/*
|
176 |
|
|
* Architecture specific routine to skip past the current machine instruction.
|
177 |
|
|
*/
|
178 |
|
|
#ifndef USE_ECOS_HAL_SINGLESTEP
|
179 |
|
|
extern void bsp_skip_instruction(void *__saved_regs);
|
180 |
|
|
#endif /* USE_ECOS_HAL_SINGLESTEP */
|
181 |
|
|
|
182 |
|
|
/*
|
183 |
|
|
* Return byte offset within the saved register area of the
|
184 |
|
|
* given register.
|
185 |
|
|
*/
|
186 |
|
|
extern int bsp_regbyte(int __regno);
|
187 |
|
|
|
188 |
|
|
/*
|
189 |
|
|
* Return size in bytes of given register.
|
190 |
|
|
*/
|
191 |
|
|
extern int bsp_regsize(int __regno);
|
192 |
|
|
|
193 |
|
|
/*
|
194 |
|
|
* Setup the saved registered to establish the given Program Counter.
|
195 |
|
|
*/
|
196 |
|
|
#ifndef bsp_set_pc
|
197 |
|
|
extern void bsp_set_pc(unsigned long __pc, void *__saved_regs);
|
198 |
|
|
#endif
|
199 |
|
|
|
200 |
|
|
/*
|
201 |
|
|
* Get the current Program Counter from the saved registers.
|
202 |
|
|
*/
|
203 |
|
|
#ifndef bsp_get_pc
|
204 |
|
|
unsigned long bsp_get_pc(void *__saved_regs);
|
205 |
|
|
#endif
|
206 |
|
|
|
207 |
|
|
extern int bsp_memory_read(void *__addr, /* start addr of memory to read */
|
208 |
|
|
int __asid, /* address space id */
|
209 |
|
|
int __rsize, /* size of individual read ops */
|
210 |
|
|
int __nreads, /* number of read operations */
|
211 |
|
|
void *__buf); /* result buffer */
|
212 |
|
|
|
213 |
|
|
extern int bsp_memory_write(void *__addr, /* start addr of memory to write */
|
214 |
|
|
int __asid, /* address space id */
|
215 |
|
|
int __wsize, /* size of individual write ops */
|
216 |
|
|
int __nwrites, /* number of write operations */
|
217 |
|
|
void *__buf); /* source buffer for write data */
|
218 |
|
|
|
219 |
|
|
/*
|
220 |
|
|
* Architecture specific routines to read and write CPU registers.
|
221 |
|
|
*/
|
222 |
|
|
extern void bsp_set_register(int __regno, void *__saved_regs, void *__val);
|
223 |
|
|
extern void bsp_get_register(int __regno, void *__saved_regs, void *__val);
|
224 |
|
|
|
225 |
|
|
|
226 |
|
|
/*
|
227 |
|
|
* Architecture specific conversion of raw exception info into
|
228 |
|
|
* a signal value.
|
229 |
|
|
*/
|
230 |
|
|
#ifndef bsp_get_signal
|
231 |
|
|
extern int bsp_get_signal(int __exc_nr, void *__saved_regs);
|
232 |
|
|
#endif
|
233 |
|
|
|
234 |
|
|
/* light-weight bsp printf to console port */
|
235 |
|
|
extern void bsp_printf(const char *__fmt, ...);
|
236 |
|
|
|
237 |
|
|
/* light-weight bsp printf to debug port */
|
238 |
|
|
extern void bsp_dprintf(const char *__fmt, ...);
|
239 |
|
|
|
240 |
|
|
/* bsp vsprintf */
|
241 |
|
|
extern int bsp_vsprintf(char *__str, const char *__fmt, va_list __ap);
|
242 |
|
|
|
243 |
|
|
/* bsp vprintf to console port */
|
244 |
|
|
extern void bsp_vprintf(const char *__fmt, va_list __ap);
|
245 |
|
|
|
246 |
|
|
/* bsp vprintf to debug port */
|
247 |
|
|
extern void bsp_dvprintf(const char *__fmt, va_list __ap);
|
248 |
|
|
|
249 |
|
|
/* bsp sprintf */
|
250 |
|
|
extern void bsp_sprintf(char *str, const char *fmt, ...);
|
251 |
|
|
|
252 |
|
|
#ifdef NDEBUG
|
253 |
|
|
#define BSP_ASSERT(e) ((void)0)
|
254 |
|
|
#else /* NDEBUG */
|
255 |
|
|
extern void _bsp_assert(const char *, const int, const char *);
|
256 |
|
|
#define BSP_ASSERT(e) ((e) ? (void)0 : _bsp_assert(__FILE__, __LINE__, #e))
|
257 |
|
|
#endif /* NDEBUG */
|
258 |
|
|
|
259 |
|
|
/*
|
260 |
|
|
* Functions for low-level console and debug i/o.
|
261 |
|
|
*/
|
262 |
|
|
extern void bsp_console_write(const char *__p, int __len);
|
263 |
|
|
extern void bsp_console_putc(char __ch);
|
264 |
|
|
extern int bsp_console_read(char *__p, int __len);
|
265 |
|
|
extern int bsp_console_getc(void);
|
266 |
|
|
extern void bsp_console_ungetc(char ch);
|
267 |
|
|
extern void bsp_debug_write(const char *__p, int __len);
|
268 |
|
|
extern int bsp_debug_read(char *__p, int __len);
|
269 |
|
|
extern void bsp_debug_putc(char __ch);
|
270 |
|
|
extern int bsp_debug_getc(void);
|
271 |
|
|
extern void bsp_debug_ungetc(char ch);
|
272 |
|
|
|
273 |
|
|
/*
|
274 |
|
|
* Disable interrupts for debug comm channel.
|
275 |
|
|
* Returns true if interrupts were previously enabled,
|
276 |
|
|
* false if interrupts were already disabled.
|
277 |
|
|
*/
|
278 |
|
|
extern int bsp_debug_irq_disable(void);
|
279 |
|
|
extern void bsp_debug_irq_enable(void);
|
280 |
|
|
|
281 |
|
|
/*
|
282 |
|
|
* Cache control functions. May be noops for architectures not
|
283 |
|
|
* supporting caches.
|
284 |
|
|
*
|
285 |
|
|
* The icache flush simply invalidates _at_least_ the range of
|
286 |
|
|
* addresses specified.
|
287 |
|
|
*
|
288 |
|
|
* The dcache flush writes back (if write-back cache) and invalidates
|
289 |
|
|
* _at_least_ the range of addresses specified.
|
290 |
|
|
*
|
291 |
|
|
*/
|
292 |
|
|
extern void bsp_flush_dcache(void *__p, int __nbytes);
|
293 |
|
|
extern void bsp_flush_icache(void *__p, int __nbytes);
|
294 |
|
|
|
295 |
|
|
/*
|
296 |
|
|
* Reset function. May be noops for architectures not
|
297 |
|
|
* supporting software reset.
|
298 |
|
|
*/
|
299 |
|
|
extern void bsp_reset(void);
|
300 |
|
|
|
301 |
|
|
/*
|
302 |
|
|
* Generic data (board and CPU specific) handling
|
303 |
|
|
*/
|
304 |
|
|
extern void *bsp_cpu_data(void);
|
305 |
|
|
extern void *bsp_board_data(void);
|
306 |
|
|
|
307 |
|
|
/*
|
308 |
|
|
* List of board characteristics which can be read queried by BSP clients. These
|
309 |
|
|
* information IDs are passed to:
|
310 |
|
|
*
|
311 |
|
|
* int bsp_sysinfo(enum bsp_info_id id, ...);
|
312 |
|
|
*
|
313 |
|
|
* Some pieces of information may have more than one instance. For example, the
|
314 |
|
|
* BSP will likely have information on multiple memory regions. In those cases,
|
315 |
|
|
* a particular instance may be accessed using a small integer index argument.
|
316 |
|
|
*
|
317 |
|
|
* The following comments indicate what additional arguments are needed
|
318 |
|
|
* to access the specific information.
|
319 |
|
|
*/
|
320 |
|
|
enum bsp_info_id {
|
321 |
|
|
/*
|
322 |
|
|
* CPU and board names.
|
323 |
|
|
*
|
324 |
|
|
* err = bsp_sysinfo(BSP_INFO_PLATFORM,
|
325 |
|
|
* struct bsp_platform_info *result)
|
326 |
|
|
*
|
327 |
|
|
* err => zero if successful, -1 if unsupported.
|
328 |
|
|
*/
|
329 |
|
|
BSP_INFO_PLATFORM,
|
330 |
|
|
|
331 |
|
|
/*
|
332 |
|
|
* Data, instruction, and secondary caches.
|
333 |
|
|
*
|
334 |
|
|
* err = bsp_sysinfo(BSP_INFO_[DIS]CACHE,
|
335 |
|
|
* struct bsp_cache_info *result)
|
336 |
|
|
*
|
337 |
|
|
* err => zero if successful, -1 if unsupported.
|
338 |
|
|
*
|
339 |
|
|
*/
|
340 |
|
|
BSP_INFO_DCACHE,
|
341 |
|
|
BSP_INFO_ICACHE,
|
342 |
|
|
BSP_INFO_SCACHE,
|
343 |
|
|
|
344 |
|
|
/*
|
345 |
|
|
* Memory region info.
|
346 |
|
|
*
|
347 |
|
|
* err = bsp_sysinfo(BSP_INFO_MEMORY,
|
348 |
|
|
* int index,
|
349 |
|
|
* struct bsp_mem_info *result)
|
350 |
|
|
*
|
351 |
|
|
* err => zero if successful, -1 if invalid index.
|
352 |
|
|
*
|
353 |
|
|
* Caller should start index at zero, then increment index for subsequent
|
354 |
|
|
* calls until error return indicates no more memory regions.
|
355 |
|
|
*/
|
356 |
|
|
BSP_INFO_MEMORY,
|
357 |
|
|
|
358 |
|
|
/*
|
359 |
|
|
* Communication channel info.
|
360 |
|
|
*
|
361 |
|
|
* err = bsp_sysinfo(BSP_INFO_COMM,
|
362 |
|
|
* int index,
|
363 |
|
|
* struct bsp_comm_info *result)
|
364 |
|
|
*
|
365 |
|
|
* err => zero if successful, -1 if invalid index.
|
366 |
|
|
*
|
367 |
|
|
* Caller should start index at zero, then increment index for subsequent
|
368 |
|
|
* calls until error return indicates no more comm channels.
|
369 |
|
|
*/
|
370 |
|
|
BSP_INFO_COMM
|
371 |
|
|
};
|
372 |
|
|
|
373 |
|
|
|
374 |
|
|
/*
|
375 |
|
|
* Platform info.
|
376 |
|
|
*/
|
377 |
|
|
struct bsp_platform_info {
|
378 |
|
|
const char *cpu; /* CPU name*/
|
379 |
|
|
const char *board; /* board name */
|
380 |
|
|
const char *extra; /* extra info */
|
381 |
|
|
};
|
382 |
|
|
|
383 |
|
|
|
384 |
|
|
/*
|
385 |
|
|
* Cache size info.
|
386 |
|
|
*/
|
387 |
|
|
struct bsp_cachesize_info {
|
388 |
|
|
int size; /* total size in bytes */
|
389 |
|
|
short linesize; /* width of cacheline in bytes */
|
390 |
|
|
short ways; /* number of ways per line */
|
391 |
|
|
};
|
392 |
|
|
|
393 |
|
|
|
394 |
|
|
/*
|
395 |
|
|
* Memory region info.
|
396 |
|
|
* The BSP may describe multiple memory regions. For example,
|
397 |
|
|
* DRAM may be comprised of several non-contiguous regions.
|
398 |
|
|
* ROM and FLASH regions may also be described.
|
399 |
|
|
*
|
400 |
|
|
*/
|
401 |
|
|
struct bsp_mem_info {
|
402 |
|
|
void *phys_start; /* physical start address */
|
403 |
|
|
void *virt_start; /* virtual start address */
|
404 |
|
|
int virt_asid; /* some architectures also use an address space id */
|
405 |
|
|
long nbytes; /* length of region in bytes */
|
406 |
|
|
int kind; /* kind of memory */
|
407 |
|
|
#define BSP_MEM_RAM 1
|
408 |
|
|
#define BSP_MEM_FLASH 2
|
409 |
|
|
#define BSP_MEM_ROM 3
|
410 |
|
|
};
|
411 |
|
|
|
412 |
|
|
|
413 |
|
|
struct bsp_comm_info {
|
414 |
|
|
char *name;
|
415 |
|
|
short kind;
|
416 |
|
|
#define BSP_COMM_SERIAL 1
|
417 |
|
|
#define BSP_COMM_ENET 2
|
418 |
|
|
short protocol;
|
419 |
|
|
#define BSP_PROTO_NONE 0
|
420 |
|
|
#define BSP_PROTO_UDP 1
|
421 |
|
|
#define BSP_PROTO_TCP 2
|
422 |
|
|
};
|
423 |
|
|
|
424 |
|
|
|
425 |
|
|
extern int bsp_sysinfo(enum bsp_info_id __id, ...);
|
426 |
|
|
|
427 |
|
|
/*
|
428 |
|
|
* Set or get active debug and console channels.
|
429 |
|
|
* Returns -1 if unsucessful.
|
430 |
|
|
* If the passed in __comm_id is -1, then the id of the current channel
|
431 |
|
|
* is returned.
|
432 |
|
|
*/
|
433 |
|
|
extern int bsp_set_debug_comm(int __comm_id);
|
434 |
|
|
extern int bsp_set_console_comm(int __comm_id);
|
435 |
|
|
|
436 |
|
|
/*
|
437 |
|
|
* Set or get the current baud rate of a serial comm channel.
|
438 |
|
|
* Returns -1 on if unsuccessful.
|
439 |
|
|
* If the given baud is -1, then the current baudrate is returned.
|
440 |
|
|
*/
|
441 |
|
|
extern int bsp_set_serial_baud(int __comm_id, int baud);
|
442 |
|
|
|
443 |
|
|
#endif
|
444 |
|
|
|
445 |
|
|
#endif // __BSP_BSP_H__
|