void main () { hBSP430halSERIAL console = NULL; hBSP430halSERIAL uart = NULL; unsigned long prep_utt = 0; unsigned long emit_utt = 0; unsigned long done_utt = 0; vBSP430platformInitialize_ni(); iBSP430consoleInitialize(); console = hBSP430console(); cprintf("\ntxcb " __DATE__ " " __TIME__ "\n"); cprintf("\nConsole %p is on %s: %s\n", console, xBSP430serialName(BSP430_CONSOLE_SERIAL_PERIPH_HANDLE), xBSP430platformPeripheralHelp(BSP430_CONSOLE_SERIAL_PERIPH_HANDLE, 0)); uart = hBSP430serialLookup(UART_PERIPH_HANDLE); if (NULL == uart) { cprintf("Failed to resolve secondary\n"); return; } cprintf("\nSecondary %p is on %s: %s\n", uart, xBSP430serialName(UART_PERIPH_HANDLE), xBSP430platformPeripheralHelp(UART_PERIPH_HANDLE, 0)); tx_buffer_.head = tx_buffer_.tail = 0; BSP430_HAL_ISR_CALLBACK_LINK_NI(sBSP430halISRVoidChainNode, uart->tx_cbchain_ni, tx_buffer_.cb_node, next_ni); uart = hBSP430serialOpenUART(uart, 0, 0, 9600); if (NULL == uart) { cprintf("Secondary open failed\n"); } /* Need to enable interrupts so timer overflow events are properly * acknowledged */ BSP430_CORE_ENABLE_INTERRUPT(); while (1) { unsigned long next_prep_utt; char * obp; char * ob_end; next_prep_utt = ulBSP430uptime(); obp = tx_buffer_.buffer; ob_end = obp + sizeof(tx_buffer_.buffer); obp += snprintf(obp, ob_end - obp, "prep %lu emit %lu\r\n", emit_utt - prep_utt, done_utt - emit_utt); ob_end = obp; BSP430_CORE_DISABLE_INTERRUPT(); emit_utt = ulBSP430uptime_ni(); prep_utt = next_prep_utt; tx_buffer_.tail = 0; tx_buffer_.head = obp - tx_buffer_.buffer; vBSP430serialWakeupTransmit_ni(uart); BSP430_CORE_LPM_ENTER_NI(LPM0_bits); /* Expect tail == head otherwise should not have awoken */ done_utt = ulBSP430uptime(); } }
int iBSP430consoleInitialize (void) { BSP430_CORE_INTERRUPT_STATE_T istate; int rv; hBSP430halSERIAL hal; if (console_hal_) { return 0; } hal = hBSP430serialLookup(BSP430_CONSOLE_SERIAL_PERIPH_HANDLE); if (NULL == hal) { return -1; } rv = -1; BSP430_CORE_SAVE_INTERRUPT_STATE(istate); BSP430_CORE_DISABLE_INTERRUPT(); do { #if BSP430_CONSOLE_RX_BUFFER_SIZE - 0 /* Associate the callback before opening the device, so the * interrupts are enabled properly. */ rx_buffer_.head = rx_buffer_.tail = 0; BSP430_HAL_ISR_CALLBACK_LINK_NI(sBSP430halISRVoidChainNode, hal->rx_cbchain_ni, rx_buffer_.cb_node, next_ni); #endif /* BSP430_CONSOLE_RX_BUFFER_SIZE */ #if BSP430_CONSOLE_TX_BUFFER_SIZE - 0 uartTransmit_ni = console_tx_queue_ni; tx_buffer_.wake_available = 0; tx_buffer_.head = tx_buffer_.tail = 0; BSP430_HAL_ISR_CALLBACK_LINK_NI(sBSP430halISRVoidChainNode, hal->tx_cbchain_ni, tx_buffer_.cb_node, next_ni); #endif /* BSP430_CONSOLE_TX_BUFFER_SIZE */ /* Attempt to configure and install the console */ console_hal_ = hBSP430serialOpenUART(hal, 0, 0, BSP430_CONSOLE_BAUD_RATE); if (! console_hal_) { /* Open failed, revert the callback association. */ #if BSP430_CONSOLE_RX_BUFFER_SIZE - 0 BSP430_HAL_ISR_CALLBACK_UNLINK_NI(sBSP430halISRVoidChainNode, hal->rx_cbchain_ni, rx_buffer_.cb_node, next_ni); #endif /* BSP430_CONSOLE_RX_BUFFER_SIZE */ break; } #if BSP430_PLATFORM_SPIN_FOR_JUMPER - 0 vBSP430platformSpinForJumper_ni(); #endif /* BSP430_PLATFORM_SPIN_FOR_JUMPER */ /* All is good */ rv = 0; } while (0); BSP430_CORE_RESTORE_INTERRUPT_STATE(istate); return rv; }