altos/btm: Add fancier debug. Pull serial reset port low.
authorKeith Packard <keithp@keithp.com>
Sun, 1 Feb 2015 15:39:17 +0000 (16:39 +0100)
committerKeith Packard <keithp@keithp.com>
Sun, 1 Feb 2015 15:39:17 +0000 (16:39 +0100)
Adds an interactive debugging mode to help diagnose BTM issues.

Discovered that the serial reset pin on the BTM needs to be pulled low
for the device to work correctly.

Leave the bt link interrupt disabled until things are initialized.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/drivers/ao_btm.c

index 9ea638ba58089581ad0e85bce7456b16fc208926..e6b286881e778a13e54049c849f91f4f0f714e61 100644 (file)
@@ -35,7 +35,7 @@ __xdata uint8_t               ao_btm_connected;
 
 #if BT_DEBUG
 __xdata char           ao_btm_buffer[256];
-int                    ao_btm_ptr;
+uint16_t               ao_btm_ptr;
 char                   ao_btm_dir;
 
 static void
@@ -84,6 +84,10 @@ ao_btm_dump(void)
                        putchar(ao_btm_buffer[i]);
        }
        putchar('\n');
+       ao_cmd_decimal();
+       if (ao_cmd_status == ao_cmd_success && ao_cmd_lex_i)
+               ao_btm_ptr = 0;
+       ao_cmd_status = ao_cmd_success;
 }
 
 static void
@@ -98,9 +102,44 @@ ao_btm_speed(void)
                ao_cmd_status = ao_cmd_syntax_error;
 }
 
+static uint8_t ao_btm_enable;
+
+static void
+ao_btm_do_echo(void)
+{
+       int     c;
+       while (ao_btm_enable) {
+               ao_arch_block_interrupts();
+               while ((c = _ao_serial_btm_pollchar()) == AO_READ_AGAIN && ao_btm_enable)
+                       _ao_serial_btm_sleep();
+               ao_arch_release_interrupts();
+               if (c != AO_READ_AGAIN) {
+                       putchar(c);
+                       flush();
+               }
+       }
+       ao_exit();
+}
+
+static struct ao_task ao_btm_echo_task;
+
+static void
+ao_btm_send(void)
+{
+       int c;
+       ao_btm_enable = 1;
+       ao_add_task(&ao_btm_echo_task, ao_btm_do_echo, "btm-echo");
+       while ((c = getchar()) != '~') {
+               ao_serial_btm_putchar(c);
+       }
+       ao_btm_enable = 0;
+       ao_wakeup((void *) &ao_serial_btm_rx_fifo);
+}
+
 __code struct ao_cmds ao_btm_cmds[] = {
        { ao_btm_dump,          "d\0Dump btm buffer." },
        { ao_btm_speed,         "s <19200,57600>\0Set btm serial speed." },
+       { ao_btm_send,          "S\0BTM interactive mode. ~ to exit." },
        { 0, NULL },
 };
 
@@ -260,6 +299,52 @@ ao_btm_try_speed(uint8_t speed)
        return 0;
 }
 
+#if BT_LINK_ON_P2
+#define BT_PICTL_ICON  PICTL_P2ICON
+#define BT_PIFG                P2IFG
+#define BT_PDIR                P2DIR
+#define BT_PINP                P2INP
+#define BT_IEN2_PIE    IEN2_P2IE
+#define BT_CC1111      1
+#endif
+#if BT_LINK_ON_P1
+#define BT_PICTL_ICON  PICTL_P1ICON
+#define BT_PIFG                P1IFG
+#define BT_PDIR                P1DIR
+#define BT_PINP                P1INP
+#define BT_IEN2_PIE    IEN2_P1IE
+#define BT_CC1111      1
+#endif
+
+void
+ao_btm_check_link()
+{
+#if BT_CC1111
+       ao_arch_critical(
+               /* Check the pin and configure the interrupt detector to wait for the
+                * pin to flip the other way
+                */
+               if (BT_LINK_PIN) {
+                       ao_btm_connected = 0;
+                       PICTL |= BT_PICTL_ICON;
+               } else {
+                       ao_btm_connected = 1;
+                       PICTL &= ~BT_PICTL_ICON;
+               }
+               );
+#else
+       ao_arch_block_interrupts();
+       if (ao_gpio_get(AO_BTM_INT_PORT, AO_BTM_INT_PIN, AO_BTM_INT) == 0) {
+               ao_btm_connected = 1;
+       } else {
+               ao_btm_connected = 0;
+       }
+       ao_arch_release_interrupts();
+#endif
+}
+
+__xdata struct ao_task ao_btm_task;
+
 /*
  * A thread to initialize the bluetooth device and
  * hang around to blink the LED when connected
@@ -267,12 +352,6 @@ ao_btm_try_speed(uint8_t speed)
 void
 ao_btm(void)
 {
-#ifdef AO_BTM_RESET_PORT
-       ao_gpio_set(AO_BTM_RESET_PORT, AO_BTM_RESET_PIN, AO_BTM_RESET, 0);
-       ao_delay(AO_MS_TO_TICKS(20));
-       ao_gpio_set(AO_BTM_RESET_PORT, AO_BTM_RESET_PIN, AO_BTM_RESET, 1);
-#endif
-
        /*
         * Wait for the bluetooth device to boot
         */
@@ -308,6 +387,13 @@ ao_btm(void)
                                    NULL);
        ao_btm_echo(0);
 
+       /* Check current pin state */
+       ao_btm_check_link();
+
+#ifdef AO_BTM_INT_PORT
+       ao_exti_enable(AO_BTM_INT_PORT, AO_BTM_INT_PIN);
+#endif
+
        for (;;) {
                while (!ao_btm_connected)
                        ao_sleep(&ao_btm_connected);
@@ -318,43 +404,6 @@ ao_btm(void)
        }
 }
 
-__xdata struct ao_task ao_btm_task;
-
-#if BT_LINK_ON_P2
-#define BT_PICTL_ICON  PICTL_P2ICON
-#define BT_PIFG                P2IFG
-#define BT_PDIR                P2DIR
-#define BT_PINP                P2INP
-#define BT_IEN2_PIE    IEN2_P2IE
-#define BT_CC1111      1
-#endif
-#if BT_LINK_ON_P1
-#define BT_PICTL_ICON  PICTL_P1ICON
-#define BT_PIFG                P1IFG
-#define BT_PDIR                P1DIR
-#define BT_PINP                P1INP
-#define BT_IEN2_PIE    IEN2_P1IE
-#define BT_CC1111      1
-#endif
-
-void
-ao_btm_check_link()
-{
-#if BT_CC1111
-       ao_arch_critical(
-               /* Check the pin and configure the interrupt detector to wait for the
-                * pin to flip the other way
-                */
-               if (BT_LINK_PIN) {
-                       ao_btm_connected = 0;
-                       PICTL |= BT_PICTL_ICON;
-               } else {
-                       ao_btm_connected = 1;
-                       PICTL &= ~BT_PICTL_ICON;
-               }
-               );
-#endif
-}
 
 #if BT_CC1111
 void
@@ -425,13 +474,6 @@ ao_btm_init (void)
        IEN2 |= BT_IEN2_PIE;
 #endif
 
-       /* Check current pin state */
-       ao_btm_check_link();
-
-#ifdef AO_BTM_INT_PORT
-       ao_exti_enable(AO_BTM_INT_PORT, AO_BTM_INT_PIN);
-#endif
-
 #if BT_LINK_ON_P2
        /* Eable the pin interrupt */
        PICTL |= PICTL_P2IEN;