changeset 1710:f03c7ea29ce3

allow settable baudrate in redboot for edb7xxx
author jani
date Thu, 12 Aug 2004 13:03:29 +0000
parents 226b4b84cff9
children dd8ccc367dae
files packages/hal/arm/edb7xxx/current/ChangeLog packages/hal/arm/edb7xxx/current/cdl/hal_arm_edb7xxx.cdl packages/hal/arm/edb7xxx/current/src/hal_diag.c
diffstat 3 files changed, 25 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/packages/hal/arm/edb7xxx/current/ChangeLog
+++ b/packages/hal/arm/edb7xxx/current/ChangeLog
@@ -1,3 +1,8 @@
+2004-08-12  Jani Monoses <jani@iv.ro>
+
+	* cdl/hal_arm_edb7xxx.cdl:
+	* src/hal_diag.c: Support baudrate change via virtual vectors.
+
 2004-04-22  Jani Monoses <jani@iv.ro>
 
 	 * cdl/hal_arm_edb7xxx.cdl :
--- a/packages/hal/arm/edb7xxx/current/cdl/hal_arm_edb7xxx.cdl
+++ b/packages/hal/arm/edb7xxx/current/cdl/hal_arm_edb7xxx.cdl
@@ -65,6 +65,7 @@ CL-PS7111 and EP7xxx based development b
     implements    CYGINT_HAL_DEBUG_GDB_STUBS
     implements    CYGINT_HAL_DEBUG_GDB_STUBS_BREAK
     implements    CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT
+    implements    CYGINT_HAL_VIRTUAL_VECTOR_COMM_BAUD_SUPPORT
     implements    CYGINT_HAL_ARM_ARCH_ARM7
     implements    CYGINT_HAL_SUPPORTS_MMU_TABLES
 
--- a/packages/hal/arm/edb7xxx/current/src/hal_diag.c
+++ b/packages/hal/arm/edb7xxx/current/src/hal_diag.c
@@ -87,6 +87,7 @@ typedef struct {
     volatile struct edb_serial* base;
     cyg_int32 msec_timeout;
     int isr_vector;
+    int baud_rate;	
 } channel_data_t;
 
 //-----------------------------------------------------------------------------
@@ -99,7 +100,7 @@ cyg_hal_plf_serial_init_channel(channel_
     // Enable port
     chan->base->ctrl |= SYSCON1_UART1EN;
     // Configure
-    chan->base->blcr = UART_BITRATE(CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD) |
+    chan->base->blcr = UART_BITRATE(chan->baud_rate) |
                        UBLCR_FIFOEN | UBLCR_WRDLEN8;
 }
 
@@ -159,8 +160,8 @@ cyg_hal_plf_serial_getc(void* __ch_data)
 }
 
 static channel_data_t edb_ser_channels[2] = {
-    {(volatile struct edb_serial*)SYSCON1, 1000, CYGNUM_HAL_INTERRUPT_URXINT1},
-    {(volatile struct edb_serial*)SYSCON2, 1000, CYGNUM_HAL_INTERRUPT_URXINT2}
+    {(volatile struct edb_serial*)SYSCON1, 1000, CYGNUM_HAL_INTERRUPT_URXINT1, CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD},
+    {(volatile struct edb_serial*)SYSCON2, 1000, CYGNUM_HAL_INTERRUPT_URXINT2, CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD}
 };
 
 static void
@@ -214,9 +215,22 @@ cyg_hal_plf_serial_control(void *__ch_da
     static int irq_state = 0;
     channel_data_t* chan = (channel_data_t*)__ch_data;
     int ret = 0;
+    va_list ap;
+
     CYGARC_HAL_SAVE_GP();
+    va_start(ap, __func);
 
     switch (__func) {
+    case __COMMCTL_GETBAUD:
+        ret = chan->baud_rate;
+        break;
+    case __COMMCTL_SETBAUD:
+        chan->baud_rate = va_arg(ap, cyg_int32);
+        // Should we verify this value here?
+        cyg_hal_plf_serial_init_channel(chan);
+        ret = 0;
+        break;
+
     case __COMMCTL_IRQ_ENABLE:
         irq_state = 1;
         HAL_INTERRUPT_UNMASK(chan->isr_vector);
@@ -243,6 +257,8 @@ cyg_hal_plf_serial_control(void *__ch_da
     default:
         break;
     }
+
+    va_end(ap);
     CYGARC_HAL_RESTORE_GP();
     return ret;
 }