BTstack for EA LPC4088 QSB example program

Dependencies:   LPC4088-USBHost mbed

Fork of KL46Z-BTstack_example by Norimasa Okamoto

The usage is the same as KL46Z-BTstack_example.
使い方はKL46Z-BTstack_exampleと同じです。
/media/uploads/va009039/lpc4088-btstack-480x360.jpg

Committer:
va009039
Date:
Fri Apr 25 05:34:24 2014 +0000
Revision:
6:d946cb517371
Parent:
3:54f9b5e0d12d
run on LPC4088

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 3:54f9b5e0d12d 1 #include "mbed.h"
va009039 3:54f9b5e0d12d 2 #include <btstack/run_loop.h>
va009039 3:54f9b5e0d12d 3 #include <btstack/hci_cmds.h>
va009039 3:54f9b5e0d12d 4 #include "hci.h"
va009039 3:54f9b5e0d12d 5 #include "l2cap.h"
va009039 3:54f9b5e0d12d 6 #include "debug.h"
va009039 3:54f9b5e0d12d 7 #include "bd_addr.h" // class bd_addr
va009039 3:54f9b5e0d12d 8 Serial pc(USBTX, USBRX);
va009039 3:54f9b5e0d12d 9 DigitalOut led1(LED1), led2(LED2);
va009039 3:54f9b5e0d12d 10
va009039 6:d946cb517371 11 #if defined(TARGET_LPC4088)||defined(TARGET_LPC1768)
va009039 6:d946cb517371 12 #define LED_ON 1
va009039 6:d946cb517371 13 #define LED_OFF 0
va009039 6:d946cb517371 14 #elif defined(TARGET_KL46Z)||defined(TARGET_KL25Z)
va009039 3:54f9b5e0d12d 15 #define LED_ON 0
va009039 3:54f9b5e0d12d 16 #define LED_OFF 1
va009039 3:54f9b5e0d12d 17 #else
va009039 6:d946cb517371 18 #error target error
va009039 3:54f9b5e0d12d 19 #endif
va009039 3:54f9b5e0d12d 20
va009039 3:54f9b5e0d12d 21 #define INQUIRY_INTERVAL 15
va009039 3:54f9b5e0d12d 22
va009039 3:54f9b5e0d12d 23 bd_addr addr;
va009039 3:54f9b5e0d12d 24
va009039 3:54f9b5e0d12d 25 static void hid_process_packet(uint8_t* report, int size)
va009039 3:54f9b5e0d12d 26 {
va009039 3:54f9b5e0d12d 27 if (report[0] == 0xa1 && report[1] == 0x02) {
va009039 3:54f9b5e0d12d 28 led1 = (report[2] & 0x01) ? LED_ON : LED_OFF; // left
va009039 3:54f9b5e0d12d 29 led2 = (report[2] & 0x02) ? LED_ON : LED_OFF; // right
va009039 3:54f9b5e0d12d 30 //led2 = (report[2] & 0x04) ? LED_ON : LED_OFF; // center
va009039 3:54f9b5e0d12d 31 }
va009039 3:54f9b5e0d12d 32 hexdump(report, size);
va009039 3:54f9b5e0d12d 33 }
va009039 3:54f9b5e0d12d 34
va009039 3:54f9b5e0d12d 35 static void l2cap_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
va009039 3:54f9b5e0d12d 36
va009039 3:54f9b5e0d12d 37 if (packet_type == HCI_EVENT_PACKET && packet[0] == L2CAP_EVENT_CHANNEL_OPENED){
va009039 3:54f9b5e0d12d 38 if (packet[2]) {
va009039 3:54f9b5e0d12d 39 log_info("Connection failed\n");
va009039 3:54f9b5e0d12d 40 return;
va009039 3:54f9b5e0d12d 41 }
va009039 3:54f9b5e0d12d 42 log_info("Connected\n");
va009039 3:54f9b5e0d12d 43 }
va009039 3:54f9b5e0d12d 44 if (packet_type == L2CAP_DATA_PACKET){
va009039 3:54f9b5e0d12d 45 // handle input
va009039 3:54f9b5e0d12d 46 log_info("HID report, size %u\n", size);
va009039 3:54f9b5e0d12d 47 hid_process_packet(packet, size);
va009039 3:54f9b5e0d12d 48 }
va009039 3:54f9b5e0d12d 49 }
va009039 3:54f9b5e0d12d 50
va009039 3:54f9b5e0d12d 51 static void packet_handler(void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
va009039 3:54f9b5e0d12d 52 if (packet_type == HCI_EVENT_PACKET) {
va009039 3:54f9b5e0d12d 53 switch (packet[0]) {
va009039 3:54f9b5e0d12d 54 case BTSTACK_EVENT_STATE:
va009039 3:54f9b5e0d12d 55 // bt stack activated, get started - set local name
va009039 3:54f9b5e0d12d 56 if (packet[2] == HCI_STATE_WORKING) {
va009039 3:54f9b5e0d12d 57 hci_send_cmd(&hci_write_authentication_enable, 1);
va009039 3:54f9b5e0d12d 58 }
va009039 3:54f9b5e0d12d 59 break;
va009039 3:54f9b5e0d12d 60
va009039 3:54f9b5e0d12d 61 case HCI_EVENT_INQUIRY_RESULT:
va009039 3:54f9b5e0d12d 62 // ignore none mouses
va009039 3:54f9b5e0d12d 63 if ((packet[12] & 0x80) != 0x80 || packet[13] != 0x25) break;
va009039 3:54f9b5e0d12d 64 addr.data(&packet[3]);
va009039 3:54f9b5e0d12d 65 log_info("Mouse addr: %s\n", addr.to_str());
va009039 3:54f9b5e0d12d 66 hci_send_cmd(&hci_inquiry_cancel);
va009039 3:54f9b5e0d12d 67 break;
va009039 3:54f9b5e0d12d 68
va009039 3:54f9b5e0d12d 69 case HCI_EVENT_INQUIRY_COMPLETE:
va009039 3:54f9b5e0d12d 70 log_info("No mouse found :(\n");
va009039 3:54f9b5e0d12d 71 break;
va009039 3:54f9b5e0d12d 72
va009039 3:54f9b5e0d12d 73 case HCI_EVENT_LINK_KEY_REQUEST:
va009039 3:54f9b5e0d12d 74 // deny link key request
va009039 3:54f9b5e0d12d 75 hci_send_cmd(&hci_link_key_request_negative_reply, addr.data());
va009039 3:54f9b5e0d12d 76 break;
va009039 3:54f9b5e0d12d 77
va009039 3:54f9b5e0d12d 78 case HCI_EVENT_PIN_CODE_REQUEST:
va009039 3:54f9b5e0d12d 79 // inform about pin code request
va009039 3:54f9b5e0d12d 80 log_info("Enter 0000\n");
va009039 3:54f9b5e0d12d 81 hci_send_cmd(&hci_pin_code_request_reply, addr.data(), 4, "0000");
va009039 3:54f9b5e0d12d 82 break;
va009039 3:54f9b5e0d12d 83
va009039 3:54f9b5e0d12d 84 case HCI_EVENT_COMMAND_COMPLETE:
va009039 3:54f9b5e0d12d 85 if (COMMAND_COMPLETE_EVENT(packet, hci_write_authentication_enable)){
va009039 3:54f9b5e0d12d 86 log_info("Inquiry\n");
va009039 3:54f9b5e0d12d 87 hci_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0);
va009039 3:54f9b5e0d12d 88 }
va009039 3:54f9b5e0d12d 89 if (COMMAND_COMPLETE_EVENT(packet, hci_inquiry_cancel) ) {
va009039 3:54f9b5e0d12d 90 // inq successfully cancelled
va009039 3:54f9b5e0d12d 91 log_info("Connecting\n");
va009039 3:54f9b5e0d12d 92 l2cap_create_channel_internal(NULL, l2cap_packet_handler, addr.data(), PSM_HID_INTERRUPT, 150);
va009039 3:54f9b5e0d12d 93 }
va009039 3:54f9b5e0d12d 94 break;
va009039 3:54f9b5e0d12d 95 }
va009039 3:54f9b5e0d12d 96 }
va009039 3:54f9b5e0d12d 97 }
va009039 3:54f9b5e0d12d 98
va009039 3:54f9b5e0d12d 99 int main(void){
va009039 3:54f9b5e0d12d 100 //pc.baud(921600);
va009039 3:54f9b5e0d12d 101 log_info("%s\n", __FILE__);
va009039 3:54f9b5e0d12d 102
va009039 3:54f9b5e0d12d 103 // init LEDs
va009039 3:54f9b5e0d12d 104 led1 = LED_OFF;
va009039 3:54f9b5e0d12d 105 led2 = LED_OFF;
va009039 3:54f9b5e0d12d 106
va009039 3:54f9b5e0d12d 107 // GET STARTED
va009039 3:54f9b5e0d12d 108 run_loop_init(RUN_LOOP_EMBEDDED);
va009039 3:54f9b5e0d12d 109
va009039 3:54f9b5e0d12d 110 // init HCI
va009039 3:54f9b5e0d12d 111 hci_transport_t* transport = hci_transport_usb_instance();
va009039 3:54f9b5e0d12d 112 remote_device_db_t* remote_db = (remote_device_db_t *)&remote_device_db_memory;
va009039 3:54f9b5e0d12d 113 hci_init(transport, NULL, NULL, remote_db);
va009039 3:54f9b5e0d12d 114
va009039 3:54f9b5e0d12d 115 // init L2CAP
va009039 3:54f9b5e0d12d 116 l2cap_init();
va009039 3:54f9b5e0d12d 117 l2cap_register_packet_handler(packet_handler);
va009039 3:54f9b5e0d12d 118
va009039 3:54f9b5e0d12d 119 // turn on!, send RESET command
va009039 3:54f9b5e0d12d 120 hci_power_control(HCI_POWER_ON);
va009039 3:54f9b5e0d12d 121
va009039 3:54f9b5e0d12d 122 // go!
va009039 3:54f9b5e0d12d 123 run_loop_execute();
va009039 3:54f9b5e0d12d 124
va009039 3:54f9b5e0d12d 125 return 0;
va009039 3:54f9b5e0d12d 126 }