diff packages/hal/common/current/include/hal_if.h @ 101:c37d3a9e1b28 ecos-sw-2000-06-16

Merge from eCos master repository on 2000-06-16-07:47:03-BST
author jlarmour
date Fri, 16 Jun 2000 16:43:59 +0000
parents
children 95f3e12a6327
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/hal/common/current/include/hal_if.h
@@ -0,0 +1,345 @@
+#ifndef CYGONCE_HAL_HAL_IF_H
+#define CYGONCE_HAL_HAL_IF_H
+
+//=============================================================================
+//
+//      hal_if.h
+//
+//      HAL header for ROM/RAM calling interface.
+//
+//=============================================================================
+//####COPYRIGHTBEGIN####
+//                                                                          
+// -------------------------------------------                              
+// The contents of this file are subject to the Red Hat eCos Public License 
+// Version 1.1 (the "License"); you may not use this file except in         
+// compliance with the License.  You may obtain a copy of the License at    
+// http://www.redhat.com/                                                   
+//                                                                          
+// Software distributed under the License is distributed on an "AS IS"      
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the 
+// License for the specific language governing rights and limitations under 
+// the License.                                                             
+//                                                                          
+// The Original Code is eCos - Embedded Configurable Operating System,      
+// released September 30, 1998.                                             
+//                                                                          
+// The Initial Developer of the Original Code is Red Hat.                   
+// Portions created by Red Hat are                                          
+// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.                             
+// All Rights Reserved.                                                     
+// -------------------------------------------                              
+//                                                                          
+//####COPYRIGHTEND####
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   jskov
+// Contributors:jskov
+// Date:        2000-06-07
+// Purpose:     HAL RAM/ROM calling interface
+// Description: ROM/RAM calling interface table	definitions. The layout is a
+//              combination of libbsp and vectors already in use by some
+//              eCos platforms.
+// Usage:       #include <cyg/hal/hal_if.h>
+//                           
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#include <cyg/infra/cyg_type.h>         // types & externC
+#include <cyg/hal/dbg-threads-api.h>
+#include <cyg/hal/dbg-thread-syscall.h>
+
+
+//--------------------------------------------------------------------------
+typedef int (*bsp_handler_t)(int __irq_nr, void *__regs);
+
+//--------------------------------------------------------------------------
+// Communication interface table. CYGNUM_CALL_IF_CONSOLE_PROCS and
+// CYGNUM_CALL_IF_DEBUG_PROCS point to instances (possibly the same)
+// of this table.
+
+typedef enum {
+    /*
+     * For serial ports, the control function may be used to set and get the
+     * current baud rate. Usage:
+     * 
+     *   err = (*__control)(COMMCTL_SETBAUD, int bits_per_second);
+     *     err => Zero if successful, -1 if error.
+     *
+     *   baud = (*__control)(COMMCTL_GETBAUD);
+     *     baud => -1 if error, current baud otherwise.
+     */
+    __COMMCTL_SETBAUD=0,
+    __COMMCTL_GETBAUD,
+
+    /*
+     * Install and remove debugger interrupt handlers. These are the receiver
+     * interrupt routines which are used to change control from a running
+     * program to the debugger stub.
+     */
+    __COMMCTL_INSTALL_DBG_ISR,
+    __COMMCTL_REMOVE_DBG_ISR,
+
+    /*
+     * Disable comm port interrupt. Returns TRUE if interrupt was enabled,
+     * FALSE otherwise.
+     */
+    __COMMCTL_IRQ_DISABLE,
+
+    /*
+     * Enable comm port interrupt.
+     */
+    __COMMCTL_IRQ_ENABLE,
+} __comm_control_cmd_t;
+
+
+#define CYGNUM_COMM_IF_CH_DATA                    0
+#define CYGNUM_COMM_IF_WRITE                      1
+#define CYGNUM_COMM_IF_READ                       2
+#define CYGNUM_COMM_IF_PUTC                       3
+#define CYGNUM_COMM_IF_GETC                       4
+#define CYGNUM_COMM_IF_CONTROL                    5
+
+#define CYGNUM_COMM_IF_TABLE_SIZE                 8
+
+typedef CYG_ADDRWORD hal_virtual_comm_table_t[CYGNUM_COMM_IF_TABLE_SIZE];
+
+// The below is a (messy) attempt at adding some type safety to the
+// above array. At the same time, the accessors allow the
+// implementation to be easily changed in the future (both tag->data
+// table and structure implementations have been suggested).
+
+typedef void* __comm_if_ch_data_t;
+#define CYGACC_COMM_IF_CH_DATA(_t_) \
+ ((__comm_if_ch_data_t)(((_t_))[CYGNUM_COMM_IF_CH_DATA]))
+#define CYGACC_COMM_IF_CH_DATA_SET(_t_, _x_) \
+ (_t_)[CYGNUM_COMM_IF_CH_DATA]=(CYG_ADDRWORD)(_x_)
+
+typedef void (*__comm_if_write_t)(void* __ch_data, const cyg_uint8* __buf,
+                                  cyg_uint32 __len);
+#define CYGACC_COMM_IF_WRITE(_t_) \
+ ((__comm_if_write_t)(((_t_))[CYGNUM_COMM_IF_WRITE]))
+#define CYGACC_COMM_IF_WRITE_SET(_t_, _x_) \
+ (_t_)[CYGNUM_COMM_IF_WRITE]=(CYG_ADDRWORD)(_x_)
+
+typedef int (*__comm_if_read_t)(void* __ch_data, cyg_uint8* __buf,
+                                cyg_uint32 __len);
+#define CYGACC_COMM_IF_READ(_t_) \
+ ((__comm_if_read_t)(((_t_))[CYGNUM_COMM_IF_READ]))
+#define CYGACC_COMM_IF_READ_SET(_t_, _x_) \
+ (_t_)[CYGNUM_COMM_IF_READ]=(CYG_ADDRWORD)(_x_)
+
+typedef void (*__comm_if_putc_t)(void* __ch_data, cyg_uint8 __ch);
+#define CYGACC_COMM_IF_PUTC(_t_) \
+ ((__comm_if_putc_t)(((_t_))[CYGNUM_COMM_IF_PUTC]))
+#define CYGACC_COMM_IF_PUTC_SET(_t_, _x_) \
+ (_t_)[CYGNUM_COMM_IF_PUTC]=(CYG_ADDRWORD)(_x_)
+
+typedef cyg_uint8 (*__comm_if_getc_t)(void* __ch_data);
+#define CYGACC_COMM_IF_GETC(_t_) \
+ ((__comm_if_getc_t)(((_t_))[CYGNUM_COMM_IF_GETC]))
+#define CYGACC_COMM_IF_GETC_SET(_t_, _x_) \
+ (_t_)[CYGNUM_COMM_IF_GETC]=(CYG_ADDRWORD)(_x_)
+
+typedef int (*__comm_if_control_t)(void *__ch_data, 
+                                   __comm_control_cmd_t __func, ...);
+#define CYGACC_COMM_IF_CONTROL(_t_) \
+ ((__comm_if_control_t)(((_t_))[CYGNUM_COMM_IF_CONTROL]))
+#define CYGACC_COMM_IF_CONTROL_SET(_t_, _x_) \
+ (_t_)[CYGNUM_COMM_IF_CONTROL]=(CYG_ADDRWORD)(_x_)
+
+
+//--------------------------------------------------------------------------
+// Main calling interface table. Will be assigned a location by the 
+// linker script. Both ROM and RAM startup applications will know about
+// the location.
+#define CYGNUM_CALL_IF_VERSION                    0
+#define CYGNUM_CALL_IF_ICTRL_TABLE                1
+#define CYGNUM_CALL_IF_EXC_TABLE                  2
+#define CYGNUM_CALL_IF_DBG_VECTOR                 3
+#define CYGNUM_CALL_IF_KILL_VECTOR                4
+#define CYGNUM_CALL_IF_CONSOLE_PROCS              5
+#define CYGNUM_CALL_IF_DEBUG_PROCS                6
+#define CYGNUM_CALL_IF_FLUSH_DCACHE               7
+#define CYGNUM_CALL_IF_FLUSH_ICACHE               8
+#define CYGNUM_CALL_IF_CPU_DATA                   9
+#define CYGNUM_CALL_IF_BOARD_DATA                 10
+#define CYGNUM_CALL_IF_SYSINFO                    11
+#define CYGNUM_CALL_IF_SET_DEBUG_COMM             12
+#define CYGNUM_CALL_IF_SET_CONSOLE_COMM           13
+#define CYGNUM_CALL_IF_SET_SERIAL_BAUD            14
+#define CYGNUM_CALL_IF_DBG_DATA                   15
+#define CYGNUM_CALL_IF_DBG_SYSCALL                15 // conflict!
+#define CYGNUM_CALL_IF_RESET                      16
+#define CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG     17
+
+#define CYGNUM_CALL_IF_LAST_ENTRY                 CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG
+
+#define CYGNUM_CALL_IF_INSTALL_BPT_FN             35
+
+#define CYGNUM_CALL_IF_TABLE_SIZE                 64
+
+externC CYG_ADDRWORD hal_virtual_vector_table[CYGNUM_CALL_IF_TABLE_SIZE];
+
+// Table version is simply the number of the last active entry in the table
+// (except INSTALL_BPT_FN since it's so high).
+#define CYGNUM_CALL_IF_TABLE_VERSION              CYGNUM_CALL_IF_LAST_ENTRY
+
+// The below is a (messy) attempt at adding some type safety to the
+// above array. At the same time, the accessors allow the
+// implementation to be easily changed in the future (both tag->data
+// table and structure implementations have been suggested).
+
+typedef int __call_if_version_t;
+#define CYGACC_CALL_IF_VERSION() \
+ ((__call_if_version_t)hal_virtual_vector_table[CYGNUM_CALL_IF_VERSION])
+#define CYGACC_CALL_IF_VERSION_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_VERSION]=(CYG_ADDRWORD)(_x_)
+
+typedef void* __call_if_ictrl_table_t;
+#define CYGACC_CALL_IF_ICTRL_TABLE() \
+ ((__call_if_ictrl_table_t)hal_virtual_vector_table[CYGNUM_CALL_IF_ICTRL_TABLE])
+#define CYGACC_CALL_IF_ICTRL_TABLE_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_ICTRL_TABLE]=(CYG_ADDRWORD)(_x_)
+
+typedef void* __call_if_exc_table_t;
+#define CYGACC_CALL_IF_EXC_TABLE() \
+ ((__call_if_exc_table_t)hal_virtual_vector_table[CYGNUM_CALL_IF_EXC_TABLE])
+#define CYGACC_CALL_IF_EXC_TABLE_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_EXC_TABLE]=(CYG_ADDRWORD)(_x_)
+
+typedef bsp_handler_t *__call_if_dbg_vector_t;
+#define CYGACC_CALL_IF_DBG_VECTOR() \
+ ((__call_if_dbg_vector_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_VECTOR])
+#define CYGACC_CALL_IF_DBG_VECTOR_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_VECTOR]=(CYG_ADDRWORD)(_x_)
+
+typedef bsp_handler_t __call_if_kill_vector_t;
+#define CYGACC_CALL_IF_KILL_VECTOR() \
+ ((__call_if_kill_vector_t)hal_virtual_vector_table[CYGNUM_CALL_IF_KILL_VECTOR])
+#define CYGACC_CALL_IF_KILL_VECTOR_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_KILL_VECTOR]=(CYG_ADDRWORD)(_x_)
+
+typedef hal_virtual_comm_table_t *__call_if_console_procs_t;
+#define CYGACC_CALL_IF_CONSOLE_PROCS() \
+ ((__call_if_console_procs_t)hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_PROCS])
+#define CYGACC_CALL_IF_CONSOLE_PROCS_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_PROCS]=(CYG_ADDRWORD)(_x_)
+
+typedef hal_virtual_comm_table_t *__call_if_debug_procs_t;
+#define CYGACC_CALL_IF_DEBUG_PROCS() \
+ ((__call_if_debug_procs_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DEBUG_PROCS])
+#define CYGACC_CALL_IF_DEBUG_PROCS_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_DEBUG_PROCS]=(CYG_ADDRWORD)(_x_)
+
+typedef void (*__call_if_flush_dcache_t)(void *__p, int __nbytes);
+#define CYGACC_CALL_IF_FLUSH_DCACHE() \
+ ((__call_if_flush_dcache_t)hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_DCACHE])
+#define CYGACC_CALL_IF_FLUSH_DCACHE_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_DCACHE]=(CYG_ADDRWORD)(_x_)
+
+typedef void (*__call_if_flush_icache_t)(void *__p, int __nbytes);
+#define CYGACC_CALL_IF_FLUSH_ICACHE() \
+ ((__call_if_flush_icache_t)hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_ICACHE])
+#define CYGACC_CALL_IF_FLUSH_ICACHE_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_ICACHE]=(CYG_ADDRWORD)(_x_)
+
+typedef void* __call_if_cpu_data_t;
+#define CYGACC_CALL_IF_CPU_DATA() \
+ ((__call_if_cpu_data_t)hal_virtual_vector_table[CYGNUM_CALL_IF_CPU_DATA])
+#define CYGACC_CALL_IF_CPU_DATA_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_CPU_DATA]=(CYG_ADDRWORD)(_x_)
+
+typedef void* __call_if_board_data_t;
+#define CYGACC_CALL_IF_BOARD_DATA() \
+ ((__call_if_board_data_t)hal_virtual_vector_table[CYGNUM_CALL_IF_BOARD_DATA])
+#define CYGACC_CALL_IF_BOARD_DATA_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_BOARD_DATA]=(CYG_ADDRWORD)(_x_)
+
+typedef int (*__call_if_sysinfo_t)(int __id, void* __ap);
+//typedef int (*__call_if_sysinfo_t)(enum bsp_info_id __id, va_list __ap);
+#define CYGACC_CALL_IF_SYSINFO() \
+ ((__call_if_sysinfo_t)hal_virtual_vector_table[CYGNUM_CALL_IF_SYSINFO])
+#define CYGACC_CALL_IF_SYSINFO_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_SYSINFO]=(CYG_ADDRWORD)(_x_)
+
+typedef int (*__call_if_set_debug_comm_t)(int __comm_id);
+#define CYGACC_CALL_IF_SET_DEBUG_COMM() \
+ ((__call_if_set_debug_comm_t)hal_virtual_vector_table[CYGNUM_CALL_IF_SET_DEBUG_COMM])
+#define CYGACC_CALL_IF_SET_DEBUG_COMM_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_SET_DEBUG_COMM]=(CYG_ADDRWORD)(_x_)
+
+typedef int (*__call_if_set_console_comm_t)(int __comm_id);
+#define CYGACC_CALL_IF_SET_CONSOLE_COMM() \
+ ((__call_if_set_console_comm_t)hal_virtual_vector_table[CYGNUM_CALL_IF_SET_CONSOLE_COMM])
+#define CYGACC_CALL_IF_SET_CONSOLE_COMM_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_SET_CONSOLE_COMM]=(CYG_ADDRWORD)(_x_)
+
+typedef int (*__call_if_set_serial_baud_t)(int __comm_id, int __baud);
+#define CYGACC_CALL_IF_SET_SERIAL_BAUD() \
+ ((__call_if_set_serial_baud_t)hal_virtual_vector_table[CYGNUM_CALL_IF_SET_SERIAL_BAUD])
+#define CYGACC_CALL_IF_SET_SERIAL_BAUD_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_SET_SERIAL_BAUD]=(CYG_ADDRWORD)(_x_)
+
+typedef void* __call_if_dbg_data_t;
+#define CYGACC_CALL_IF_DBG_DATA() \
+ ((__call_if_dbg_data_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_DATA])
+#define CYGACC_CALL_IF_DBG_DATA_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_DATA]=(CYG_ADDRWORD)(_x_)
+
+typedef int (*__call_if_dbg_syscall_t) (enum dbg_syscall_ids id,
+                                        union dbg_thread_syscall_parms  *p );
+#define CYGACC_CALL_IF_DBG_SYSCALL() \
+ ((__call_if_dbg_syscall_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_SYSCALL])
+#define CYGACC_CALL_IF_DBG_SYSCALL_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_SYSCALL]=(CYG_ADDRWORD)(_x_)
+
+typedef void (*__call_if_reset_t)(void);
+#define CYGACC_CALL_IF_RESET() \
+ ((__call_if_reset_t)hal_virtual_vector_table[CYGNUM_CALL_IF_RESET])
+#define CYGACC_CALL_IF_RESET_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_RESET]=(CYG_ADDRWORD)(_x_)
+
+typedef int __call_if_console_interrupt_flag_t;
+#define CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG() \
+ ((__call_if_console_interrupt_flag_t)hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG])
+#define CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG]=(CYG_ADDRWORD)(_x_)
+
+typedef void (*__call_if_install_bpt_fn_t)(void *__epc);
+#define CYGACC_CALL_IF_INSTALL_BPT_FN() \
+ ((__call_if_install_bpt_fn_t)hal_virtual_vector_table[CYGNUM_CALL_IF_INSTALL_BPT_FN])
+#define CYGACC_CALL_IF_INSTALL_BPT_FN_SET(_x_) \
+ hal_virtual_vector_table[CYGNUM_CALL_IF_INSTALL_BPT_FN]=(CYG_ADDRWORD)(_x_)
+
+
+//--------------------------------------------------------------------------
+// Functions provided by the HAL interface.
+externC void hal_if_init(void);
+
+
+//--------------------------------------------------------------------------
+// Diag wrappers.
+externC void hal_if_diag_init(void);
+externC void hal_if_diag_write_char(char c);
+externC void hal_if_diag_read_char(char *c);
+
+//--------------------------------------------------------------------------
+// Determining if console code needs to be included, or if it will be
+// provided by via the vector table:
+//
+// The console channel is already handled if (a) stubs are included and the
+// console and debug channels are the same, or (b) the console channel is
+// the same as the ROM monitor debug channel.
+#if (defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) \
+     && (CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL == CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL)) \
+    || (defined(CYGSEM_HAL_USE_ROM_MONITOR_GDB_stubs) \
+        && (CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL == CYGNUM_HAL_VIRTUAL_VECTOR_ROM_DEBUG_CHANNEL))
+# define CYGPRI_CONSOLE_PROCS_HANDLED
+#endif
+
+//-----------------------------------------------------------------------------
+#endif // CYGONCE_HAL_HAL_IF_H
+// End of hal_if.h