int main(void){ // stop watchdog timer WDTCTL = WDTPW + WDTHOLD; //Initialize clock and peripherals halBoardInit(); halBoardStartXT1(); halBoardSetSystemClock(SYSCLK_16MHZ); // Debug UART halUsbInit(); // show off doLCD(); // init LEDs LED_PORT_OUT |= LED_1 | LED_2; LED_PORT_DIR |= LED_1 | LED_2; /// GET STARTED /// btstack_memory_init(); run_loop_init(RUN_LOOP_EMBEDDED); // init HCI hci_transport_t * transport = hci_transport_h4_dma_instance(); bt_control_t * control = bt_control_cc256x_instance(); hci_uart_config_t * config = hci_uart_config_cc256x_instance(); remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_memory; hci_init(transport, config, control, remote_db); // use eHCILL bt_control_cc256x_enable_ehcill(1); // init L2CAP l2cap_init(); l2cap_register_packet_handler(packet_handler); // ready - enable irq used in h4 task __enable_interrupt(); // turn on! hci_power_control(HCI_POWER_ON); // go! run_loop_execute(); return 0; }
static void hw_setup(){ // stop watchdog timer WDTCTL = WDTPW + WDTHOLD; //Initialize clock and peripherals halBoardInit(); halBoardStartXT1(); halBoardSetSystemClock(SYSCLK_16MHZ); // init debug UART halUsbInit(); // init LEDs LED_PORT_OUT |= LED_1 | LED_2; LED_PORT_DIR |= LED_1 | LED_2; // ready - enable irq used in h4 task __enable_interrupt(); }
/**********************************************************************//** * @brief Executes the "PMM-MCLK" menu option in the User Experience * example code. This menu option allows one to change the frequency * of operation for the MSP430 and the VCore setting. * * @param none * * @return none *************************************************************************/ void menuPMMMCLK( void ) { unsigned char menuLeftPos = 2, menuRightPos = 0, menuRightMaxAllowed = 5; unsigned char ledOn, quit = 0; volatile unsigned int i; halButtonsInterruptDisable( BUTTON_ALL ); halButtonsInterruptEnable( BUTTON_SELECT + BUTTON_S1 + \ BUTTON_S2 + BUTTON_RIGHT ); halAccelerometerShutDown(); halLcdClearScreen(); halBoardOutputSystemClock(); halLcdPrintLineCol(&VcoreText[0], 0, 1, OVERWRITE_TEXT ); for (i=0;i < MCLK_MENU_MAX+1; i++) halLcdPrintLineCol(&MCLKText[i*6], i, 12, OVERWRITE_TEXT ); halLcdPrintLineCol(&VcoreText[menuLeftPos*6 + 6], \ menuLeftPos+1, 1, INVERT_TEXT | OVERWRITE_TEXT); halLcdPrintLineCol(&MCLKText[menuRightPos*6 + 6], \ menuRightPos+1, 12, INVERT_TEXT | OVERWRITE_TEXT); buttonsPressed = 0; for (i = menuRightMaxAllowed; i < MCLK_MENU_MAX; i++) { halLcdLine(96, 12*(i+1)+6, 136, 12*(i+1)+6, PIXEL_ON); halLcdLine(96, 12*(i+1)+7, 136, 12*(i+1)+7, PIXEL_ON); } ledOn = 0; halLcdPrintLine(" LED", 6, 0); halLcdPrintLine(" OFF", 7, 0); halLcdImage(IMG_RIGHT_FILLED, 4, 32, 10, 75); halBoardSetVCore(menuLeftPos); halBoardSetSystemClock(menuRightPos); while (!quit) { // The LED can be enabled to show the relative difference between // frequencies of operation. while (!buttonsPressed) if (ledOn) { LED_PORT_OUT ^= LED_1; for (i=0; i < 0xFFFF; i++) if (buttonsPressed) break; } else { // To emulate a real application instead of continuous jumps, use nops __no_operation(); __no_operation(); __no_operation(); __no_operation(); __no_operation(); __no_operation(); __no_operation(); __no_operation(); __no_operation(); } if (buttonsPressed & BUTTON_S1) { /* * Disabled for MSP430F5438 RTM Silicon halLcdPrintLineCol(&VcoreText[menuLeftPos*6 + 6], menuLeftPos+1, \ 1, OVERWRITE_TEXT); if (++ menuLeftPos >= VCORE_MENU_MAX) { menuLeftPos = 0; menuRightMaxAllowed = MAX_MCLK_ALLOWED[ menuLeftPos ]; if (menuRightPos >= menuRightMaxAllowed) { halLcdPrintLineCol(&MCLKText[menuRightPos*6 + 6], menuRightPos+1, \ 12, OVERWRITE_TEXT); menuRightPos = menuRightMaxAllowed - 1; halLcdPrintLineCol(&MCLKText[menuRightPos*6 + 6], menuRightPos+1, \ 12, INVERT_TEXT | OVERWRITE_TEXT); } for (i = menuRightMaxAllowed; i < MCLK_MENU_MAX; i++) { halLcdLine(96, 12*(i+1)+6, 136, 12*(i+1)+6, PIXEL_ON); halLcdLine(96, 12*(i+1)+7, 136, 12*(i+1)+7, PIXEL_ON); } } else { for (i=menuRightMaxAllowed+1; i< MAX_MCLK_ALLOWED[menuLeftPos]+1; i ++) halLcdPrintLineCol(&MCLKText[i*6], i, 12, OVERWRITE_TEXT ); menuRightMaxAllowed = MAX_MCLK_ALLOWED[menuLeftPos]; } halLcdPrintLineCol(&VcoreText[menuLeftPos*6 + 6], menuLeftPos+1, \ 1, INVERT_TEXT | OVERWRITE_TEXT); */ } if ( buttonsPressed & BUTTON_S2 ) { halLcdPrintLineCol(&MCLKText[menuRightPos*6 + 6], \ menuRightPos+1, 12, OVERWRITE_TEXT); if ( ++menuRightPos >= menuRightMaxAllowed ) menuRightPos = 0; halLcdPrintLineCol(&MCLKText[menuRightPos*6 + 6], \ menuRightPos+1, 12, INVERT_TEXT| OVERWRITE_TEXT); } if ( buttonsPressed & BUTTON_RIGHT ) { ledOn = 1 - ledOn; if ( ledOn ) halLcdPrintLineCol("ON ", 7, 6, OVERWRITE_TEXT); else { halLcdPrintLineCol("OFF", 7, 6, OVERWRITE_TEXT); LED_PORT_OUT &= ~LED_1; } } if ( buttonsPressed & (BUTTON_S1 | BUTTON_S2) ) { halBoardSetVCore(menuLeftPos); halBoardSetSystemClock(menuRightPos); //halBoardDisableSVS(); } if ( buttonsPressed & BUTTON_SELECT ) quit = 1; buttonsPressed = 0; } halBoardSetSystemClock( SYSCLK_16MHZ ); halBoardStopOutputSystemClock(); LED_PORT_OUT &= ~LED_1; }
// main int main(void) { // stop watchdog timer WDTCTL = WDTPW + WDTHOLD; //Initialize clock and peripherals halBoardInit(); halBoardStartXT1(); halBoardSetSystemClock(SYSCLK_16MHZ); // init debug UART halUsbInit(); // init LEDs LED_PORT_OUT |= LED_1 | LED_2; LED_PORT_DIR |= LED_1 | LED_2; /// GET STARTED with BTstack /// btstack_memory_init(); run_loop_init(RUN_LOOP_EMBEDDED); // init HCI hci_transport_t * transport = hci_transport_h4_dma_instance(); bt_control_t * control = bt_control_cc256x_instance(); hci_uart_config_t * config = hci_uart_config_cc256x_instance(); remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_memory; hci_init(transport, config, control, remote_db); // use eHCILL bt_control_cc256x_enable_ehcill(1); // init L2CAP l2cap_init(); l2cap_register_packet_handler(packet_handler); // init RFCOMM rfcomm_init(); rfcomm_register_packet_handler(packet_handler); rfcomm_register_service_with_initial_credits_internal(NULL, rfcomm_channel_nr, 100, 1); // reserved channel, mtu=100, 1 credit // init SDP, create record for SPP and register with SDP sdp_init(); memset(spp_service_buffer, 0, sizeof(spp_service_buffer)); service_record_item_t * service_record_item = (service_record_item_t *) spp_service_buffer; sdp_create_spp_service( (uint8_t*) &service_record_item->service_record, 1, "SPP Counter"); printf("SDP service buffer size: %u\n\r", (uint16_t) (sizeof(service_record_item_t) + de_get_len((uint8_t*) &service_record_item->service_record))); sdp_register_service_internal(NULL, service_record_item); // set one-shot timer timer_source_t heartbeat; heartbeat.process = &heartbeat_handler; run_loop_set_timer(&heartbeat, HEARTBEAT_PERIOD_MS); run_loop_add_timer(&heartbeat); puts("SPP FlowControl Demo: simulates processing on received data...\n\r"); // ready - enable irq used in h4 task __enable_interrupt(); // turn on! hci_power_control(HCI_POWER_ON); // go! run_loop_execute(); // happy compiler! return 0; }
int main(void) { uint8_t currState; uint8_t targetState; uint16_t readbcLength; uint32_t nwkId; uint8_t errorCheckInterval = 100; // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; // Initialize the MCU and board peripherals halBoardInit(); halBoardStartXT1(); halBoardSetSystemClock(SYSCLK_16MHZ); halButtonsInit(BUTTON_ALL); halLcdInit(); halLcdBackLightInit(); halLcdSetContrast(90); halLcdSetBackLight(10); halLcdClearScreen(); halLcdPrintLine(" CC85XX SLAVE ", 0, OVERWRITE_TEXT ); halLcdPrintLine(" ", 1, OVERWRITE_TEXT ); halLcdPrintLine("S1: Power toggle ", 2, OVERWRITE_TEXT ); halLcdPrintLine("S2: Pairing start", 3, OVERWRITE_TEXT ); uifLcdPrintJoystickInfo(); // Wipe remote control information memset(&ehifRcSetDataParam, 0x00, sizeof(ehifRcSetDataParam)); // Initialize EHIF IO ehifIoInit(); // Reset into the application ehifSysResetPin(true); currState = CC85XX_STATE_ALONE; targetState = CC85XX_STATE_ACTIVE; // Get the last used network ID from CC85XX non-volatile storage initParam(); ehifCmdParam.nvsGetData.index = 0; ehifCmdExecWithRead(EHIF_EXEC_ALL, EHIF_CMD_NVS_GET_DATA, sizeof(EHIF_CMD_NVS_GET_DATA_PARAM_T), &ehifCmdParam, sizeof(EHIF_CMD_NVS_GET_DATA_DATA_T), &ehifCmdData); nwkId = ehifCmdData.nvsGetData.data; // Handle illegal default network IDs that may occur first time after programming if ((nwkId == 0x00000000) || (nwkId == 0xFFFFFFFF)) { nwkId = 0xFFFFFFFE; } // Main loop while (1) { // Wait 10 ms EHIF_DELAY_MS(10); // Perform action according to edge-triggered button events (debouncing with 100 ms delay) switch (pollButtons()) { // POWER TOGGLE case BUTTON_S1: if (currState == CC85XX_STATE_OFF) { targetState = CC85XX_STATE_ACTIVE; } else { targetState = CC85XX_STATE_OFF; } break; // PAIRING TRIGGER case BUTTON_S2: if (currState != CC85XX_STATE_OFF) { targetState = CC85XX_STATE_PAIRING; } break; } // Run the state machine if (currState != targetState) { if (currState == CC85XX_STATE_OFF) { // HANDLE POWER ON // Ensure known state (power state 5) ehifSysResetPin(true); currState = CC85XX_STATE_ALONE; } else if (targetState == CC85XX_STATE_OFF) { // HANDLE POWER OFF // Ensure known state (power state 5) ehifSysResetPin(true); currState = CC85XX_STATE_ALONE; // Set power state 0 ehifCmdParam.pmSetState.state = 0; ehifCmdExec(EHIF_CMD_PM_SET_STATE, sizeof(EHIF_CMD_PM_SET_STATE_PARAM_T), &ehifCmdParam); currState = CC85XX_STATE_OFF; } else if (targetState == CC85XX_STATE_PAIRING) { // HANDLE PAIRING // Let the last executed EHIF command complete, with 5 second timeout ehifWaitReadyMs(5000); // Disconnect if currently connected if (ehifGetStatus() & BV_EHIF_STAT_CONNECTED) { initParam(); // All parameters should be zero ehifCmdExec(EHIF_CMD_NWM_DO_JOIN, sizeof(EHIF_CMD_NWM_DO_JOIN_PARAM_T), &ehifCmdParam); } // Search for one protocol master with pairing signal enabled for 10 seconds initParam(); ehifCmdParam.nwmDoScan.scanTo = 1000; ehifCmdParam.nwmDoScan.scanMax = 1; ehifCmdParam.nwmDoScan.reqPairingSignal = 1; ehifCmdParam.nwmDoScan.reqRssi = -128; ehifCmdExecWithReadbc(EHIF_EXEC_CMD, EHIF_CMD_NWM_DO_SCAN, sizeof(EHIF_CMD_NWM_DO_SCAN_PARAM_T), &ehifCmdParam, NULL, NULL); // Fetch network information once ready ehifWaitReadyMs(12000); readbcLength = sizeof(ehifNwmDoScanData); ehifCmdExecWithReadbc(EHIF_EXEC_DATA, EHIF_CMD_NWM_DO_SCAN, 0, NULL, &readbcLength, &ehifNwmDoScanData); // If found ... if (readbcLength == sizeof(EHIF_CMD_NWM_DO_SCAN_DATA_T)) { // Update the network ID to be used next nwkId = ehifNwmDoScanData.deviceId; // Place the new network ID in CC85XX non-volatile storage initParam(); ehifCmdParam.nvsSetData.index = 0; ehifCmdParam.nvsSetData.data = ehifNwmDoScanData.deviceId; ehifCmdExec(EHIF_CMD_NVS_SET_DATA, sizeof(EHIF_CMD_NVS_SET_DATA_PARAM_T), &ehifCmdParam); } // Done currState = CC85XX_STATE_ALONE; targetState = CC85XX_STATE_ACTIVE; } else if (targetState == CC85XX_STATE_ACTIVE) { // We're disconnected. Proceed only if EHIF is ready, so that power toggle and pairing // buttons can still be operated uint16_t status = ehifGetStatus(); if (status & BV_EHIF_STAT_CMD_REQ_RDY) { // Perform join operation first and then activate audio channels. We're using remote // volume control if (!(status & BV_EHIF_STAT_CONNECTED)) { // Enable disconnection notification to avoid unnecessary EHIF activity while active initParam(); ehifCmdParam.ehcEvtClr.clearedEvents = BV_EHIF_EVT_NWK_CHG; ehifCmdExec(EHIF_CMD_EHC_EVT_CLR, sizeof(EHIF_CMD_EHC_EVT_CLR_PARAM_T), &ehifCmdParam); initParam(); ehifCmdParam.ehcEvtMask.irqGioLevel = 0; ehifCmdParam.ehcEvtMask.eventFilter = BV_EHIF_EVT_NWK_CHG; ehifCmdExec(EHIF_CMD_EHC_EVT_MASK, sizeof(EHIF_CMD_EHC_EVT_MASK_PARAM_T), &ehifCmdParam); // Not connected: Start JOIN operation initParam(); ehifCmdParam.nwmDoJoin.joinTo = 100; ehifCmdParam.nwmDoJoin.deviceId = nwkId; ehifCmdExec(EHIF_CMD_NWM_DO_JOIN, sizeof(EHIF_CMD_NWM_DO_JOIN_PARAM_T), &ehifCmdParam); } else { // Connected: Subscribe to audio channels (0xFF = unused) memset(&ehifCmdParam, 0xFF, sizeof(EHIF_CMD_NWM_ACH_SET_USAGE_PARAM_T)); ehifCmdParam.nwmAchSetUsage.pAchUsage[0] = 0; // Front left -> I2S LEFT ehifCmdParam.nwmAchSetUsage.pAchUsage[1] = 1; // Front right -> I2S RIGHT ehifCmdExec(EHIF_CMD_NWM_ACH_SET_USAGE, sizeof(EHIF_CMD_NWM_ACH_SET_USAGE_PARAM_T), &ehifCmdParam); currState = CC85XX_STATE_ACTIVE; } } } } else { // Only OFF and ACTIVE are permanent target states. SCAN is only a temporary target state. // In the OFF state we do nothing, so only need to handle the ACTIVE state. if (currState == CC85XX_STATE_ACTIVE) { // Detect network disconnection without generating noise on the SPI interface if (EHIF_INTERRUPT_IS_ACTIVE()) { currState = CC85XX_STATE_ALONE; } // Perform error checking at 10 ms * 100 = 1 second intervals: // - No timeouts or SPI errors shall have occurred // - We should be connected unless disconnection has been signalized if (--errorCheckInterval == 0) { errorCheckInterval = 100; uint16_t status = ehifGetStatus(); if (ehifGetWaitReadyError() || (status & BV_EHIF_EVT_SPI_ERROR) || (!(status & BV_EHIF_STAT_CONNECTED) && !(status & BV_EHIF_EVT_NWK_CHG))) { // The device is in an unknown state -> restart everything ehifSysResetPin(true); currState = CC85XX_STATE_ALONE; } } // If the network connection is up and running... if (currState == CC85XX_STATE_ACTIVE) { // Send remote control commands (mouse or play control, depending on which uif file // is included in the build) if (uifPollFunc(&ehifRcSetDataParam)) { ehifCmdExec(EHIF_CMD_RC_SET_DATA, sizeof(EHIF_CMD_RC_SET_DATA_PARAM_T), &ehifRcSetDataParam); } } } } } } // main
// main int main(void) { // stop watchdog timer WDTCTL = WDTPW + WDTHOLD; //Initialize clock and peripherals halBoardInit(); halBoardStartXT1(); halBoardSetSystemClock(SYSCLK_16MHZ); // init debug UART halUsbInit(); // init LEDs P1OUT |= LED_1 | LED_2; P1DIR |= LED_1 | LED_2; /*//init linkLED P1OUT &= ~BIT0; P1DIR |= BIT0;*/ //Setup Input Port 2 initSwitch(2, BIT0); initSwitch(2, BIT1); initSwitch(2, BIT2); initSwitch(2, BIT3); //tie port3 and unused pins of port 2 /*P3OUT = 0; P3DIR = 0xFF; P3SEL = 0; P2OUT &= 0x0F; P2DIR |= 0xF0; P2SEL &= 0x0F;*/ /// GET STARTED with BTstack /// btstack_memory_init(); run_loop_init(RUN_LOOP_EMBEDDED); // add gpio port 2 to run loop // default values port2_status = P2IN & 0x0F; data_source_t data_src_port2; data_src_port2.process = port2_poll; data_src_port2.fd = 0; run_loop_add_data_source(&data_src_port2); // init HCI hci_transport_t * transport = hci_transport_h4_dma_instance(); bt_control_t * control = bt_control_cc256x_instance(); hci_uart_config_t * config = hci_uart_config_cc256x_instance(); remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_memory; hci_init(transport, config, control, remote_db); // use eHCILL bt_control_cc256x_enable_ehcill(1); // init L2CAP l2cap_init(); l2cap_register_packet_handler(bt_packet_handler); l2cap_register_service_internal(NULL, l2cap_packet_handler, 0x1001, L2CAP_MINIMAL_MTU); // ready - enable irq used in h4 task __enable_interrupt(); // turn on! if(hci_power_control(HCI_POWER_ON)) printf("power on failed"); //init i2c initi2c(); // go! run_loop_execute(); // happy compiler! return 0; }