static unsigned char bt_rx_buf_rpos = 0;
static uint8_t mw_bt_enabled = 0;
+int mw_bt_get_rxbuf_len(void)
+{
+ if (bt_rx_buf_rpos > bt_rx_buf_wpos)
+ return (BT_RX_MAX_SIZE - bt_rx_buf_rpos) + bt_rx_buf_wpos;
+ else
+ return bt_rx_buf_wpos - bt_rx_buf_rpos;
+}
+
const unsigned char *mw_bt_get_rx_buf(unsigned char **rpos, unsigned char *len)
{
*rpos = &bt_rx_buf_rpos;
+
if (bt_rx_buf_rpos > bt_rx_buf_wpos)
*len = (BT_RX_MAX_SIZE - bt_rx_buf_rpos) + bt_rx_buf_wpos;
else
*len = bt_rx_buf_wpos - bt_rx_buf_rpos;
- if (*len > (BT_RX_MAX_SIZE-(BT_RX_MAX_SIZE/10)))
+ // if we reach high water mark raise RTS to stop more data
+ if (*len > (BT_RX_MAX_SIZE-(BT_RX_MAX_SIZE/10))) {
+ debug_uart_tx("BT UART RTS\n");
BT_IO_POUT |= BT_IO_RTS; // low == ready, high == !ready
+ } else {
+ BT_IO_POUT &= ~BT_IO_RTS; // low == ready, high == !ready
+ }
return (unsigned char *)bt_rx_buf;
}
{
switch (UCA1IV) {
case 2: // RXIFG
+ /* clear IRQ flag */
+ //UCA1IFG &= ~UCRXIFG;
/* wake up to handle the received char */
- LPM3_EXIT;
+ if (UCA1STAT & UCRXERR) {
+ debug_uart_tx("BT UART RXERR: ");
+ if (UCA1STAT & UCOE)
+ debug_uart_tx("overrun\n");
+ if (UCA1STAT & UCPE)
+ debug_uart_tx("parity err\n");
+ if (UCA1STAT & UCFE)
+ debug_uart_tx("frm-err\n");
+ }
bt_rx_buf[bt_rx_buf_wpos++] = UCA1RXBUF;
- /* clear IRQ flag */
- UCA1IFG &= ~UCRXIFG;
bt_rx_buf_wpos %= BT_RX_MAX_SIZE;
+ LPM3_EXIT;
_event_src |= BT_UART_RCV_EVENT;
break;
case 4: // TXIFG
+ debug_uart_tx("BT UART TX IRQ - huh?\n");
break;
default:
break;
void mw_init_bt_uart(const bt_uart_baud_t baud)
{
UCA1CTL1 = UCSWRST;
+
UCA1CTL1 |= UCSSEL__SMCLK;
+
switch (baud) {
case BT_UART_BD115200:
default:
break;
};
UCA1STAT = 0;
- UCA1CTL0 = UCMODE_0; // UART mode
- UCA1CTL0 &= ~UC7BIT; // 8bit char
+ // UCA1CTL0 = UCMODE_0; // UART mode
+ // UCA1CTL0 &= ~UC7BIT; // 8bit char
+ //UCA1CTL0 |= UCRXEIE;
UCA1CTL1 &= ~UCSWRST;
/* clear interrup flags */
- UCA1IFG = 0;
UCA1IE = UCRXIE;
+ UCA1IFG = 0;
}
#if 0 // Does never finish, presumably trigger does not trigger, unknown :(
pos = 0;
// debug_uart_tx("BT tx: ");
while (pos < len) {
- while ((BT_IO_PIN & BT_IO_CTS)) // wait for CTS to go low
+ // wait for CTS to go low
+ while ((BT_IO_PIN & BT_IO_CTS))
+ nop();
+
+ // do not start a transfer if UART is busy, e.g. rx-ing
+ while (UCA1STAT & UCBUSY)
nop();
UCA1TXBUF = *(unsigned char *) (buf+pos);
}
while (UCA1STAT & UCBUSY)
nop();
- // debug_uart_tx("\n");
}
#endif
mw_init_bt_uart(BT_UART_BD115200);
+ bt_rx_buf_wpos = 0;
+ bt_rx_buf_rpos = 0;
+
/* release BT reset pin */
BT_ENABLE();
load_cc256x_init_script();
debug_uart_tx("init uploaded\n");
}
+
P1IE &= ~BT_IO_CTS;
P1IES &= ~BT_IO_CTS;
+
bt_hci_init();
init_l2cap();
+
mw_bt_enabled = 1;
}