Mercurial > flash_v2
diff packages/hal/common/current/src/hal_if.c @ 103:95f3e12a6327 ecos-sw-2000-06-23
Merge from eCos master repository on 2000-06-23-16:41:10-BST
| author | jlarmour |
|---|---|
| date | Fri, 23 Jun 2000 17:06:31 +0000 |
| parents | c37d3a9e1b28 |
| children | 5a0cc6c243a9 |
line wrap: on
line diff
--- a/packages/hal/common/current/src/hal_if.c +++ b/packages/hal/common/current/src/hal_if.c @@ -62,18 +62,9 @@ externC void init_thread_syscall(void * externC CYG_ADDRWORD hal_interrupt_handlers[]; externC CYG_ADDRWORD hal_vsr_table[]; - -//-------------------------------------------------------------------------- -// Configuration control for the services in this feil. -#if defined(CYG_HAL_STARTUP_ROM) || \ - ( defined(CYG_HAL_STARTUP_RAM) && \ - !defined(CYGSEM_HAL_USE_ROM_MONITOR)) -# define CYGPRI_IMPLEMENTS_IF_SERVICES -#endif - //-------------------------------------------------------------------------- // Implementations and function wrappers for monitor services -#ifdef CYGPRI_IMPLEMENTS_IF_SERVICES +#ifdef CYGPRI_HAL_IMPLEMENTS_IF_SERVICES static void reset(void) @@ -117,20 +108,41 @@ nop_service(void) //---------------------------------- // Comm controls -static hal_virtual_comm_table_t comm_channels[CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS]; +static hal_virtual_comm_table_t comm_channels[CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS+1]; + + static int set_debug_comm(int __comm_id) { - static int __selected_id; + static int __selected_id = CYGNUM_CALL_IF_SET_COMM_ID_EMPTY; - CYG_ASSERT(-1 == __comm_id - || __comm_id < CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS, + CYG_ASSERT(__comm_id >= CYGNUM_CALL_IF_SET_COMM_ID_MANGLER + && __comm_id < CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS, "Invalid channel"); - if (-1 == __comm_id) + switch (__comm_id) { + case CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT: + if (__selected_id > 0) + return __selected_id-1; + if (__selected_id == 0) + return CYGNUM_CALL_IF_SET_COMM_ID_MANGLER; return __selected_id; + case CYGNUM_CALL_IF_SET_COMM_ID_EMPTY: + CYGACC_CALL_IF_DEBUG_PROCS_SET(0); + __selected_id = __comm_id; + return 1; + + case CYGNUM_CALL_IF_SET_COMM_ID_MANGLER: + __comm_id = 0; + break; + + default: + __comm_id++; // skip mangler entry + break; + } + __selected_id = __comm_id; CYGACC_CALL_IF_DEBUG_PROCS_SET(comm_channels[__comm_id]); @@ -141,15 +153,34 @@ set_debug_comm(int __comm_id) static int set_console_comm(int __comm_id) { - static int __selected_id; + static int __selected_id = CYGNUM_CALL_IF_SET_COMM_ID_EMPTY; - CYG_ASSERT(-1 == __comm_id - || __comm_id < CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS, + CYG_ASSERT(__comm_id >= CYGNUM_CALL_IF_SET_COMM_ID_MANGLER + && __comm_id < CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS, "Invalid channel"); - if (-1 == __comm_id) + switch (__comm_id) { + case CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT: + if (__selected_id > 0) + return __selected_id-1; + if (__selected_id == 0) + return CYGNUM_CALL_IF_SET_COMM_ID_MANGLER; return __selected_id; + case CYGNUM_CALL_IF_SET_COMM_ID_EMPTY: + CYGACC_CALL_IF_CONSOLE_PROCS_SET(0); + __selected_id = __comm_id; + return 1; + + case CYGNUM_CALL_IF_SET_COMM_ID_MANGLER: + __comm_id = 0; + break; + + default: + __comm_id++; // skip mangler entry + break; + } + __selected_id = __comm_id; CYGACC_CALL_IF_CONSOLE_PROCS_SET(comm_channels[__comm_id]); @@ -157,63 +188,6 @@ set_console_comm(int __comm_id) return 1; } - -#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS -//---------------------------------- -// eCos debug procedure wrappers -static void -debug_write(void* __ch_data, const cyg_uint8* __buf, cyg_uint32 __len) -{ - CYGARC_HAL_SAVE_GP(); - - while(__len-- > 0) - HAL_STUB_PLATFORM_PUT_CHAR(*__buf++); - - CYGARC_HAL_RESTORE_GP(); -} - -static void -debug_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len) -{ - CYGARC_HAL_SAVE_GP(); - - while(__len-- > 0) - *__buf++ = HAL_STUB_PLATFORM_GET_CHAR(); - - CYGARC_HAL_RESTORE_GP(); -} - - -static void -debug_putc(void* __ch_data, cyg_uint8 __ch) -{ - CYGARC_HAL_SAVE_GP(); - - HAL_STUB_PLATFORM_PUT_CHAR(__ch); - - CYGARC_HAL_RESTORE_GP(); -} - -static cyg_uint8 -debug_getc(void* __ch_data) -{ - cyg_uint8 __ch; - CYGARC_HAL_SAVE_GP(); - - __ch = HAL_STUB_PLATFORM_GET_CHAR(); - - CYGARC_HAL_RESTORE_GP(); - return __ch; -} - -static int -debug_control(void *__ch_data, __comm_control_cmd_t __func, ...) -{ - // Do nothing (yet). - return 0; -} -#endif // CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - //---------------------------------- // Cache functions @@ -239,65 +213,6 @@ flush_dcache(void *__p, int __nbytes) #endif -#if !defined(CYGPRI_CONSOLE_PROCS_HANDLED) \ - && defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) -// -------------------- -// Console wrapper functions. These are used for pumping data to the device -// via low-level functions provided by the platform HAL. Mangling has -// happened (if applicable) by the time the stream hits this code. -static void -console_write(void* __ch_data, const cyg_uint8* __buf, cyg_uint32 __len) -{ - CYGARC_HAL_SAVE_GP(); - - while(__len-- > 0) - HAL_PLF_DIAG_RAW_WRITE_CHAR(*__buf++); - - CYGARC_HAL_RESTORE_GP(); -} - -static void -console_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len) -{ - CYGARC_HAL_SAVE_GP(); - - while(__len-- > 0) - HAL_PLF_DIAG_RAW_READ_CHAR(*__buf++); - - CYGARC_HAL_RESTORE_GP(); -} - - -static void -console_putc(void* __ch_data, cyg_uint8 __ch) -{ - CYGARC_HAL_SAVE_GP(); - - HAL_PLF_DIAG_RAW_WRITE_CHAR(__ch); - - CYGARC_HAL_RESTORE_GP(); -} - -static cyg_uint8 -console_getc(void* __ch_data) -{ - cyg_uint8 __ch; - CYGARC_HAL_SAVE_GP(); - - HAL_PLF_DIAG_RAW_READ_CHAR(__ch); - - CYGARC_HAL_RESTORE_GP(); - return __ch; -} - -static int -console_control(void *__ch_data, __comm_control_cmd_t __func, ...) -{ - // Do nothing (yet). - return 0; -} -#endif - #if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) //----------------------------------------------------------------------------- // Console IO functions that adhere to the virtual vector table semantics in @@ -310,22 +225,17 @@ console_control(void *__ch_data, __comm_ void hal_if_diag_init(void) { -#ifndef CYGPRI_CONSOLE_PROCS_HANDLED - // Set up console procs for the channel and initialize it. - hal_virtual_comm_table_t* comm; - // Hook console wrappers up on the diag channel - CYGACC_CALL_IF_SET_CONSOLE_COMM()(CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL); - comm = CYGACC_CALL_IF_CONSOLE_PROCS(); +#ifndef CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + cyg_hal_plf_comms_init(); +#endif - CYGACC_COMM_IF_WRITE_SET(*comm, console_write); - CYGACC_COMM_IF_READ_SET(*comm, console_read); - CYGACC_COMM_IF_PUTC_SET(*comm, console_putc); - CYGACC_COMM_IF_GETC_SET(*comm, console_getc); - CYGACC_COMM_IF_CONTROL_SET(*comm, console_control); - - // Init device. - HAL_PLF_DIAG_RAW_INIT(); -#endif + // Set console channel. This should only be done when the console channel + // differs from the debug channel to prevent removing the debug agent's + // mangler procs. + if (CYGACC_CALL_IF_SET_DEBUG_COMM()(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT) + != CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL) + + CYGACC_CALL_IF_SET_CONSOLE_COMM()(CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL); } void @@ -334,10 +244,10 @@ hal_if_diag_write_char(char c) hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_CONSOLE_PROCS(); if (__chan) - CYGACC_COMM_IF_PUTC(*__chan)(*__chan, c); + CYGACC_COMM_IF_PUTC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan), c); else { __chan = CYGACC_CALL_IF_DEBUG_PROCS(); - CYGACC_COMM_IF_PUTC(*__chan)(*__chan, c); + CYGACC_COMM_IF_PUTC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan), c); } } @@ -347,10 +257,10 @@ hal_if_diag_read_char(char *c) hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_CONSOLE_PROCS(); if (__chan) - *c = CYGACC_COMM_IF_GETC(*__chan)(*__chan); + *c = CYGACC_COMM_IF_GETC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan)); else { __chan = CYGACC_CALL_IF_DEBUG_PROCS(); - *c = CYGACC_COMM_IF_GETC(*__chan)(*__chan); + *c = CYGACC_COMM_IF_GETC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan)); } } #endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG @@ -364,9 +274,8 @@ void hal_if_init(void) { // Set up services provided by monitors -#ifdef CYGPRI_IMPLEMENTS_IF_SERVICES +#ifdef CYGPRI_HAL_IMPLEMENTS_IF_SERVICES { - hal_virtual_comm_table_t* comm; int i, j; // Initialize tables with the NOP service. // This should only be done for service routine entries - data @@ -374,7 +283,7 @@ hal_if_init(void) for (i = 0; i < CYGNUM_CALL_IF_TABLE_SIZE; i++) hal_virtual_vector_table[i] = (CYG_ADDRWORD) &nop_service; - for (j = 0; j < CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS; j++) + for (j = 0; j < CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS+1; j++) for (i = 0; i < CYGNUM_COMM_IF_TABLE_SIZE; i++) comm_channels[j][i] = (CYG_ADDRWORD) &nop_service; @@ -401,23 +310,12 @@ hal_if_init(void) CYGACC_CALL_IF_FLUSH_ICACHE_SET(flush_icache); CYGACC_CALL_IF_FLUSH_DCACHE_SET(flush_dcache); - // Clear console procs entry. If platform has been to - // configured to use a separate console port, it will be set - // up later (hal_diag_init). Alternatively (if this is a stub) - // it will be initialized with the output mangler - // (O-packetizer for GDB) which uses the debug comms. - CYGACC_CALL_IF_CONSOLE_PROCS_SET(0); - -#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - // Hook debug wrappers up on the debug channel - set_debug_comm(CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL); - comm = CYGACC_CALL_IF_DEBUG_PROCS(); - CYGACC_COMM_IF_WRITE_SET(*comm, debug_write); - CYGACC_COMM_IF_READ_SET(*comm, debug_read); - CYGACC_COMM_IF_PUTC_SET(*comm, debug_putc); - CYGACC_COMM_IF_GETC_SET(*comm, debug_getc); - CYGACC_COMM_IF_CONTROL_SET(*comm, debug_control); -#endif + // Clear console procs entry. If platform has been configured + // to use a separate console port, it will be set up later + // (hal_diag_init). Alternatively (if this is a stub) it will + // be initialized with the output mangler (O-packetizer for + // GDB) which uses the debug comms. + set_console_comm(CYGNUM_CALL_IF_SET_COMM_ID_EMPTY); // Data entries not currently supported in eCos CYGACC_CALL_IF_CPU_DATA_SET(0);
