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