Mercurial > ecos
diff packages/hal/common/current/src/hal_stub.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_stub.c +++ b/packages/hal/common/current/src/hal_stub.c @@ -107,7 +107,7 @@ putDebugChar (int c) { #ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT __call_if_debug_procs_t __debug_procs = CYGACC_CALL_IF_DEBUG_PROCS(); - CYGACC_COMM_IF_PUTC(*__debug_procs)(__debug_procs, c); + CYGACC_COMM_IF_PUTC(*__debug_procs)(CYGACC_COMM_IF_CH_DATA(*__debug_procs), c); #elif defined(CYGPKG_CYGMON) ecos_bsp_console_putc(c); #else @@ -121,7 +121,7 @@ getDebugChar (void) { #ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT __call_if_debug_procs_t __debug_procs = CYGACC_CALL_IF_DEBUG_PROCS(); - return CYGACC_COMM_IF_GETC(*__debug_procs)(__debug_procs); + return CYGACC_COMM_IF_GETC(*__debug_procs)(CYGACC_COMM_IF_CH_DATA(*__debug_procs)); #elif defined(CYGPKG_CYGMON) return ecos_bsp_console_getc(); #else @@ -135,7 +135,7 @@ void { #ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT __call_if_debug_procs_t __debug_procs = CYGACC_CALL_IF_DEBUG_PROCS(); - CYGACC_COMM_IF_CONTROL(*__debug_procs)(__debug_procs, __COMMCTL_SETBAUD, baud); + CYGACC_COMM_IF_CONTROL(*__debug_procs)(CYGACC_COMM_IF_CH_DATA(*__debug_procs), __COMMCTL_SETBAUD, baud); #elif defined(CYGPKG_CYGMON) // FIXME! #else @@ -270,7 +270,7 @@ cyg_hal_gdb_diag_getc(void* __ch_data) hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS(); CYGARC_HAL_SAVE_GP(); - __ch = CYGACC_COMM_IF_GETC(*__chan)(*__chan); + __ch = CYGACC_COMM_IF_GETC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan)); CYGARC_HAL_RESTORE_GP(); @@ -307,24 +307,24 @@ cyg_hal_gdb_diag_putc(void* __ch_data, c cyg_uint8 csum = 0, c1; int i; - CYGACC_COMM_IF_PUTC(*__chan)(*__chan, '$'); - CYGACC_COMM_IF_PUTC(*__chan)(*__chan, 'O'); + CYGACC_COMM_IF_PUTC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan), '$'); + CYGACC_COMM_IF_PUTC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan), 'O'); csum += 'O'; for( i = 0; i < pos; i++ ) { char ch = line[i]; char h = hex[(ch>>4)&0xF]; char l = hex[ch&0xF]; - CYGACC_COMM_IF_PUTC(*__chan)(*__chan, h); - CYGACC_COMM_IF_PUTC(*__chan)(*__chan, l); + CYGACC_COMM_IF_PUTC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan), h); + CYGACC_COMM_IF_PUTC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan), l); csum += h; csum += l; } - CYGACC_COMM_IF_PUTC(*__chan)(*__chan, '#'); - CYGACC_COMM_IF_PUTC(*__chan)(*__chan, hex[(csum>>4)&0xF]); - CYGACC_COMM_IF_PUTC(*__chan)(*__chan, hex[csum&0xF]); + CYGACC_COMM_IF_PUTC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan), '#'); + CYGACC_COMM_IF_PUTC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan), hex[(csum>>4)&0xF]); + CYGACC_COMM_IF_PUTC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan), hex[csum&0xF]); - c1 = CYGACC_COMM_IF_GETC(*__chan)(*__chan); + c1 = CYGACC_COMM_IF_GETC(*__chan)(CYGACC_COMM_IF_CH_DATA(*__chan)); if( c1 == '+' ) break; if( cyg_hal_is_break( &c1 , 1 ) ) { @@ -357,11 +357,10 @@ cyg_hal_gdb_diag_write(void* __ch_data, static void cyg_hal_gdb_diag_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len) { - hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS(); CYGARC_HAL_SAVE_GP(); while(__len-- > 0) - *__buf++ = CYGACC_COMM_IF_GETC(*__chan)(*__chan); + *__buf++ = cyg_hal_gdb_diag_getc(__ch_data); CYGARC_HAL_RESTORE_GP(); } @@ -372,15 +371,6 @@ cyg_hal_gdb_diag_control(void *__ch_data // Do nothing (yet). return 0; } - -hal_virtual_comm_table_t cyg_hal_gdb_console_procs = { - 0, - (CYG_ADDRWORD) &cyg_hal_gdb_diag_write, - (CYG_ADDRWORD) &cyg_hal_gdb_diag_read, - (CYG_ADDRWORD) &cyg_hal_gdb_diag_putc, - (CYG_ADDRWORD) &cyg_hal_gdb_diag_getc, - (CYG_ADDRWORD) &cyg_hal_gdb_diag_control}; - #endif @@ -479,8 +469,9 @@ initHardware (void) { static int initialized = 0; - if (initialized++) + if (initialized) return; + initialized = 1; #if !defined(CYGPKG_CYGMON) #ifdef HAL_STUB_PLATFORM_INIT @@ -492,13 +483,30 @@ initHardware (void) HAL_STUB_PLATFORM_INIT_SERIAL(); #ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT - // This should really be done during handle_exception_init (at - // stub exit), but that makes it impossible a stub to be included - // in the application without breaking things. So do it here - // instead - stub initialization happens after - // constructors/hal_diag_init anyway. - if (NULL == CYGACC_CALL_IF_CONSOLE_PROCS()) - CYGACC_CALL_IF_CONSOLE_PROCS_SET(cyg_hal_gdb_console_procs); + { + hal_virtual_comm_table_t* comm; + int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM()(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); + + // Initialize mangler procs + CYGACC_CALL_IF_SET_CONSOLE_COMM()(CYGNUM_CALL_IF_SET_COMM_ID_MANGLER); + comm = CYGACC_CALL_IF_CONSOLE_PROCS(); + CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_gdb_diag_write); + CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_gdb_diag_read); + CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_gdb_diag_putc); + CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_gdb_diag_getc); + CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_gdb_diag_control); + + // Now either restore the previous console channel, or let the + // mangler stay in its place. The latter happens if the + // console channel was previously unspecified, or if the + // previous channel matches the used for GDB communication. + if (CYGNUM_CALL_IF_SET_COMM_ID_EMPTY != cur + && CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL != cur) + CYGACC_CALL_IF_SET_CONSOLE_COMM()(cur); + + // Set the debug channel. + CYGACC_CALL_IF_SET_DEBUG_COMM()(CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL); + } #endif #ifndef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
