From 32342b0d7cd1eb526f5422d600b7fe3e7c779cc4 Mon Sep 17 00:00:00 2001 From: "matthias.ringwald@gmail.com" Date: Sat, 15 Nov 2014 17:09:34 +0000 Subject: [PATCH] use embedded spp_counter --- platforms/msp-exp430f5438-cc2564b/Makefile | 24 +- .../msp-exp430f5438-cc2564b/spp_counter.c | 236 ------------------ 2 files changed, 13 insertions(+), 247 deletions(-) delete mode 100644 platforms/msp-exp430f5438-cc2564b/spp_counter.c diff --git a/platforms/msp-exp430f5438-cc2564b/Makefile b/platforms/msp-exp430f5438-cc2564b/Makefile index 01917c349..35a69b7d3 100644 --- a/platforms/msp-exp430f5438-cc2564b/Makefile +++ b/platforms/msp-exp430f5438-cc2564b/Makefile @@ -1,7 +1,7 @@ +# Makefile for MSP-EXP430F5438 board with CC2560B/CC2564B/CC2567 modules # -# Makefile for MSP-EXP430F5438 demos with PAN1315, PAN1317, PAN1325, PAN1323, or PAN1327 Bluetooth modules -# -# Please check instructions at https://code.google.com/p/btstack/wiki/CC256x on where to download the init scripts and how to convert them to *.c files. +# Please check instructions at https://code.google.com/p/btstack/wiki/CC256x on downloading +# and converting the init scripts for use with BTstack # # mspgcc is used: http://sourceforge.net/apps/mediawiki/mspgcc/index.php?title=MSPGCC_Wiki # @@ -9,7 +9,7 @@ # init scripts CC2560B = bluetooth_init_cc2560B_1.0_BT_Spec_4.1.o CC2564B = bluetooth_init_cc2564B_1.0_BT_Spec_4.1.o -CC2567 = CC256x_BT_Service_Pack_2.8_ANT_1.16.o +CC2567 = CC256x_BT_Service_Pack_2.8_ANT_1.16.o BTSTACK_ROOT = ../.. VPATH += $(BTSTACK_ROOT)/ble @@ -48,10 +48,12 @@ SPP = \ remote_device_db_memory.c \ rfcomm.c \ sdp_util.c \ - sdp_parser.c \ - sdp_client.c \ - sdp_query_util.c \ - sdp_query_rfcomm.c \ + +SDP_CLIENT += \ + sdp_client.o \ + sdp_parser.o \ + sdp_query_util.o \ + sdp_query_rfcomm.o \ BLE = \ att.c \ @@ -111,7 +113,7 @@ spp_accel.out: ${CORE_OBJ} ${COMMON_OBJ} ${SPP_OBJ} ${CC2560B} spp_accel.o sdp.o spp_and_le_counter.out: ${CORE_OBJ} ${COMMON_OBJ} ${SPP_OBJ} ${BLE_OBJ} spp_and_le_counter.h spp_and_le_counter.o sdp.o hal_adc.o ${CC} $^ ${LDFLAGS} -o $@ -spp_counter.out: ${CORE_OBJ} ${COMMON_OBJ} ${SPP_OBJ} ${CC2560B} spp_counter.o sdp.o hal_adc.o +spp_counter.out: ${CORE_OBJ} ${COMMON_OBJ} ${SPP_OBJ} ${CC2560B} main.o spp_counter.o sdp.o hal_adc.o ${CC} $^ ${LDFLAGS} -o $@ spp_flowcontrol.out: ${CORE_OBJ} ${COMMON_OBJ} ${SPP_OBJ} ${CC2560B} spp_flowcontrol.o sdp.o hal_adc.o @@ -120,10 +122,10 @@ spp_flowcontrol.out: ${CORE_OBJ} ${COMMON_OBJ} ${SPP_OBJ} ${CC2560B} spp_flowcon gap_inquiry.out: ${CORE_OBJ} ${COMMON_OBJ} ${SPP_OBJ} ${CC2560B} gap_inquiry.o hal_adc.o ${CC} $^ ${LDFLAGS} -o $@ -sdp_rfcomm_query.out: ${CORE_OBJ} ${COMMON_OBJ} ${SPP_OBJ} ${CC2560B} sdp_rfcomm_query.o hal_adc.o +sdp_rfcomm_query.out: ${CORE_OBJ} ${COMMON_OBJ} ${SPP_OBJ} ${SDP_CLIENT} ${CC2560B} sdp_rfcomm_query.o hal_adc.o ${CC} $^ ${LDFLAGS} -o $@ -sdp_general_query.out: ${CORE_OBJ} ${COMMON_OBJ} ${SPP_OBJ} ${CC2560B} sdp_general_query.o hal_adc.o +sdp_general_query.out: ${CORE_OBJ} ${COMMON_OBJ} ${SPP_OBJ} ${SDP_CLIENT} ${CC2560B} sdp_general_query.o hal_adc.o ${CC} $^ ${LDFLAGS} -o $@ clean: diff --git a/platforms/msp-exp430f5438-cc2564b/spp_counter.c b/platforms/msp-exp430f5438-cc2564b/spp_counter.c deleted file mode 100644 index e18faf6f9..000000000 --- a/platforms/msp-exp430f5438-cc2564b/spp_counter.c +++ /dev/null @@ -1,236 +0,0 @@ -// ***************************************************************************** -// -// spp_counter demo - it provides an SPP and sends a counter every second -// -// it doesn't use the LCD to get down to a minimal memory footprint -// -// ***************************************************************************** - -#include -#include -#include -#include - -#include - -#include "bt_control_cc256x.h" -#include "hal_board.h" -#include "hal_compat.h" -#include "hal_usb.h" - -#include -#include -#include - -#include "hci.h" -#include "l2cap.h" -#include "btstack_memory.h" -#include "remote_device_db.h" -#include "rfcomm.h" -#include "sdp.h" -#include "btstack-config.h" - -#define HEARTBEAT_PERIOD_MS 1000 - -static uint8_t rfcomm_channel_nr = 1; -static uint16_t rfcomm_channel_id; -static uint8_t spp_service_buffer[150]; -static timer_source_t heartbeat; - -static int real_counter = 0; -static int counter_to_send = 0; - -enum STATE {INIT, W4_CONNECTION, W4_CHANNEL_COMPLETE, ACTIVE} ; -enum STATE state = INIT; - -static void send_packet(void){ - if (real_counter <= counter_to_send) return; - - char lineBuffer[30]; - sprintf(lineBuffer, "BTstack counter %04u\n\r", counter_to_send); - printf(lineBuffer); - int err = rfcomm_send_internal(rfcomm_channel_id, (uint8_t*) lineBuffer, strlen(lineBuffer)); - - switch (err){ - case 0: - counter_to_send++; - break; - case BTSTACK_ACL_BUFFERS_FULL: - break; - default: - printf("rfcomm_send_internal() -> err %d\n\r", err); - break; - } -} - -// Bluetooth logic -static void packet_handler (void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ - bd_addr_t event_addr; - uint8_t rfcomm_channel_nr; - uint16_t mtu; - uint8_t event = packet[0]; - - // handle events, ignore data - if (packet_type != HCI_EVENT_PACKET) return; - - switch (event) { - case BTSTACK_EVENT_STATE: - // bt stack activated, get started - set local name - if (packet[2] == HCI_STATE_WORKING) { - hci_send_cmd(&hci_write_local_name, "BTstack SPP Counter"); - } - break; - - case HCI_EVENT_COMMAND_COMPLETE: - if (COMMAND_COMPLETE_EVENT(packet, hci_read_bd_addr)){ - bt_flip_addr(event_addr, &packet[6]); - printf("BD-ADDR: %s\n\r", bd_addr_to_str(event_addr)); - break; - } - if (COMMAND_COMPLETE_EVENT(packet, hci_write_local_name)){ - hci_discoverable_control(1); - break; - } - break; - - case HCI_EVENT_LINK_KEY_REQUEST: - // deny link key request - printf("Link key request\n\r"); - bt_flip_addr(event_addr, &packet[2]); - hci_send_cmd(&hci_link_key_request_negative_reply, &event_addr); - break; - - case HCI_EVENT_PIN_CODE_REQUEST: - // inform about pin code request - printf("Pin code request - using '0000'\n\r"); - bt_flip_addr(event_addr, &packet[2]); - hci_send_cmd(&hci_pin_code_request_reply, &event_addr, 4, "0000"); - break; - - case RFCOMM_EVENT_INCOMING_CONNECTION: - // data: event (8), len(8), address(48), channel (8), rfcomm_cid (16) - bt_flip_addr(event_addr, &packet[2]); - rfcomm_channel_nr = packet[8]; - rfcomm_channel_id = READ_BT_16(packet, 9); - printf("RFCOMM channel %u requested for %s\n\r", rfcomm_channel_nr, bd_addr_to_str(event_addr)); - rfcomm_accept_connection_internal(rfcomm_channel_id); - break; - - case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE: - // data: event(8), len(8), status (8), address (48), server channel(8), rfcomm_cid(16), max frame size(16) - if (packet[2]) { - printf("RFCOMM channel open failed, status %u\n\r", packet[2]); - } else { - rfcomm_channel_id = READ_BT_16(packet, 12); - mtu = READ_BT_16(packet, 14); - printf("\n\rRFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n\r", rfcomm_channel_id, mtu); - } - break; - case DAEMON_EVENT_HCI_PACKET_SENT: - case RFCOMM_EVENT_CREDITS: - if (rfcomm_can_send_packet_now(rfcomm_channel_id)) send_packet(); - break; - - case RFCOMM_EVENT_CHANNEL_CLOSED: - rfcomm_channel_id = 0; - break; - - default: - break; - } - -} - -static void run_loop_register_timer(timer_source_t *timer, uint16_t period){ - run_loop_set_timer(timer, period); - run_loop_add_timer(timer); -} - - -static void timer_handler(timer_source_t *ts){ - real_counter++; - // re-register timer - run_loop_register_timer(ts, HEARTBEAT_PERIOD_MS); - if (rfcomm_can_send_packet_now(rfcomm_channel_id)) send_packet(); -} - -static void timer_setup(){ - // set one-shot timer - heartbeat.process = &timer_handler; - run_loop_register_timer(&heartbeat, HEARTBEAT_PERIOD_MS); -} - - - -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(); -} - -static void btstack_setup(){ - /// 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_internal(NULL, rfcomm_channel_nr, 100); // reserved channel, mtu=100 - - // 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); -} - - -// main -int main(void){ - hw_setup(); - btstack_setup(); - timer_setup(); - - printf("Run...\n\r"); - - // turn on! - hci_power_control(HCI_POWER_ON); - - // go! - run_loop_execute(); - - // happy compiler! - return 0; -} -