BluetoothHost.c 9.43 KB
 Dean Camera committed Jun 05, 2009 1 2 /* LUFA Library  Dean Camera committed Dec 30, 2009 3  Copyright (C) Dean Camera, 2010.  Dean Camera committed Jun 05, 2009 4 5 6 7 8 9  dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /*  Dean Camera committed Dec 30, 2009 10  Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)  Dean Camera committed Jun 05, 2009 11   Dean Camera committed Dec 28, 2009 12 13 14 15 16 17 18  Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the  Dean Camera committed Jun 05, 2009 19 20 21 22 23 24 25 26 27 28 29 30  software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */  31 32 33 34 35 /** \file * * Main source file for the BluetoothHost demo. This file contains the main tasks of * the demo and is responsible for the initial application hardware configuration. */  Dean Camera committed Jun 05, 2009 36 37 38  #include "BluetoothHost.h"  39 40 41 /** Main program entry point. This routine configures the hardware required by the application, then * enters a loop to run the application tasks in sequence. */  Dean Camera committed Jun 05, 2009 42 43 44 int main(void) { SetupHardware();  45 46  puts_P(PSTR(ESC_FG_CYAN "Bluetooth Host Demo running.\r\n" ESC_FG_WHITE));  Dean Camera committed Jun 05, 2009 47 48 49 50 51  LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); for (;;) {  Dean Camera committed Apr 05, 2010 52  Bluetooth_Stack_USBTask();  53  Bluetooth_Host_Task();  Dean Camera committed Jun 08, 2009 54  USB_USBTask();  Dean Camera committed Jun 05, 2009 55 56 57  } }  58 /** Configures the board hardware and chip peripherals for the demo's functionality. */  Dean Camera committed Jun 05, 2009 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 void SetupHardware(void) { /* Disable watchdog if enabled by bootloader/fuses */ MCUSR &= ~(1 << WDRF); wdt_disable(); /* Disable clock division */ clock_prescale_set(clock_div_1); /* Hardware Initialization */ SerialStream_Init(9600, false); LEDs_Init(); USB_Init(); }  74 75 76 /** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and * starts the library USB task to begin the enumeration and USB management process. */  Dean Camera committed Aug 05, 2009 77 void EVENT_USB_Host_DeviceAttached(void)  Dean Camera committed Jun 05, 2009 78 {  Dean Camera committed Jul 19, 2009 79  puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE));  Dean Camera committed Jun 05, 2009 80 81 82  LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); }  83 84 85 /** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and * stops the library USB task management process. */  Dean Camera committed Aug 05, 2009 86 void EVENT_USB_Host_DeviceUnattached(void)  Dean Camera committed Jun 05, 2009 87 {  Dean Camera committed Jul 19, 2009 88  puts_P(PSTR(ESC_FG_GREEN "\r\nDevice Unattached.\r\n" ESC_FG_WHITE));  Dean Camera committed Jun 05, 2009 89 90 91  LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); }  92 93 94 /** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully * enumerated by the host and is now ready to be used by the application. */  Dean Camera committed Aug 05, 2009 95 void EVENT_USB_Host_DeviceEnumerationComplete(void)  Dean Camera committed Jun 05, 2009 96 97 98 99 { LEDs_SetAllLEDs(LEDMASK_USB_READY); }  100 101 /** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */ void EVENT_USB_Host_HostError(const uint8_t ErrorCode)  Dean Camera committed Jun 05, 2009 102 103 104 { USB_ShutDown();  Dean Camera committed Aug 06, 2009 105 106  printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n" " -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);  Dean Camera committed Jun 05, 2009 107 108 109 110 111  LEDs_SetAllLEDs(LEDMASK_USB_ERROR); for(;;); }  112 113 114 115 /** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while * enumerating an attached USB device. */ void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, const uint8_t SubErrorCode)  Dean Camera committed Jun 05, 2009 116 {  Dean Camera committed Aug 06, 2009 117 118 119 120  printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n" " -- Error Code %d\r\n" " -- Sub Error Code %d\r\n" " -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);  Dean Camera committed Jun 05, 2009 121 122 123 124  LEDs_SetAllLEDs(LEDMASK_USB_ERROR); }  125 126 /** Task to set the configuration of the attached device after it has been enumerated. */ void Bluetooth_Host_Task(void)  Dean Camera committed Jun 05, 2009 127 128 129 130 131 132 133 134 135 136 137 { uint8_t ErrorCode; switch (USB_HostState) { case HOST_STATE_Addressed: puts_P(PSTR("Getting Device Data.\r\n")); /* Get and process the configuration descriptor data */ if ((ErrorCode = ProcessDeviceDescriptor()) != SuccessfulDeviceRead) {  138  if (ErrorCode == DevControlError)  Dean Camera committed Jul 19, 2009 139  puts_P(PSTR(ESC_FG_RED "Control Error (Get Device).\r\n"));  Dean Camera committed Jun 05, 2009 140  else  Dean Camera committed Jul 19, 2009 141  puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));  Dean Camera committed Jun 05, 2009 142   Dean Camera committed Jul 19, 2009 143  printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);  Dean Camera committed Jun 05, 2009 144 145 146 147 148  /* Indicate error via status LEDs */ LEDs_SetAllLEDs(LEDS_LED1); /* Wait until USB device disconnected */  Dean Camera committed Jul 13, 2009 149  USB_HostState = HOST_STATE_WaitForDeviceRemoval;  Dean Camera committed Jun 05, 2009 150 151 152 153 154  break; } puts_P(PSTR("Bluetooth Dongle Detected.\r\n"));  Dean Camera committed Jun 18, 2009 155 156  /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */ if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)  Dean Camera committed Jun 05, 2009 157  {  Dean Camera committed Aug 06, 2009 158 159  printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n" " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);  Dean Camera committed Jun 05, 2009 160 161 162 163 164  /* Indicate error via status LEDs */ LEDs_SetAllLEDs(LEDS_LED1); /* Wait until USB device disconnected */  Dean Camera committed Jul 13, 2009 165  USB_HostState = HOST_STATE_WaitForDeviceRemoval;  Dean Camera committed Jun 05, 2009 166 167 168 169 170 171 172 173  break; } puts_P(PSTR("Getting Config Data.\r\n")); /* Get and process the configuration descriptor data */ if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead) {  174  if (ErrorCode == ControlError)  Dean Camera committed Jul 19, 2009 175  puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));  Dean Camera committed Jun 05, 2009 176  else  Dean Camera committed Jul 19, 2009 177  puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));  Dean Camera committed Jun 05, 2009 178   Dean Camera committed Jul 19, 2009 179  printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);  Dean Camera committed Jun 05, 2009 180 181 182 183 184  /* Indicate error via status LEDs */ LEDs_SetAllLEDs(LEDS_LED1); /* Wait until USB device disconnected */  Dean Camera committed Jul 13, 2009 185  USB_HostState = HOST_STATE_WaitForDeviceRemoval;  Dean Camera committed Jun 05, 2009 186 187 188 189  break; } puts_P(PSTR("Bluetooth Dongle Enumerated.\r\n"));  Dean Camera committed Mar 31, 2010 190 191  /* Initialize the Bluetooth stack */  Dean Camera committed Apr 05, 2010 192  Bluetooth_Stack_Init();  Dean Camera committed Jun 05, 2009 193   Dean Camera committed Aug 05, 2009 194  USB_HostState = HOST_STATE_Configured;  Dean Camera committed Jun 05, 2009 195 196 197  break; } }  198   199 200 201 /** Bluetooth stack callback event for a Bluetooth connection request. When this callback fires, the * user application must indicate if the connection is to be allowed or rejected. *  Dean Camera committed Apr 15, 2010 202  * \param[in] RemoteAddress Bluetooth address of the remote device attempting the connection  203 204 205  * * \return Boolean true to accept the connection, false to reject it */  206 207 208 209 210 211 212 213 214 215 216 bool Bluetooth_ConnectionRequest(uint8_t* RemoteAddress) { printf_P(PSTR("Connection Request from Device %02X:%02X:%02X:%02X:%02X:%02X\r\n"), RemoteAddress[5], RemoteAddress[4], RemoteAddress[3], RemoteAddress[2], RemoteAddress[1], RemoteAddress[0]); /* Always accept connections from remote devices */ return true; }  217 218 219 /** Bluetooth stack callback event for a completed Bluetooth connection. When this callback is made, * the connection information can be accessed through the global \ref Bluetooth_Connection structure. */  220 221 222 223 224 225 226 227 void Bluetooth_ConnectionComplete(void) { printf_P(PSTR("Connection Complete to Device %02X:%02X:%02X:%02X:%02X:%02X\r\n"), Bluetooth_Connection.RemoteAddress[5], Bluetooth_Connection.RemoteAddress[4], Bluetooth_Connection.RemoteAddress[3], Bluetooth_Connection.RemoteAddress[2], Bluetooth_Connection.RemoteAddress[1], Bluetooth_Connection.RemoteAddress[0]); }  228 229 230 231 232 /** Bluetooth stack callback event for a completed Bluetooth disconnection. When this callback is made, * the connection information in the global \ref Bluetooth_Connection structure is invalidated with the * exception of the RemoteAddress element, which can be used to determine the address of the device that * was disconnected. */  233 234 235 236 237 238 239 void Bluetooth_DisconnectionComplete(void) { printf_P(PSTR("Disconnection Complete to Device %02X:%02X:%02X:%02X:%02X:%02X\r\n"), Bluetooth_Connection.RemoteAddress[5], Bluetooth_Connection.RemoteAddress[4], Bluetooth_Connection.RemoteAddress[3], Bluetooth_Connection.RemoteAddress[2], Bluetooth_Connection.RemoteAddress[1], Bluetooth_Connection.RemoteAddress[0]); }  240 241 242 243  /** Bluetooth stack callback event for a non-signal ACL packet reception. This callback fires once a connection * to a remote Bluetooth device has been made, and the remote device has sent a non-signalling ACL packet. *  Dean Camera committed Apr 15, 2010 244 245 246  * \param[in] Data Pointer to a buffer where the received data is stored * \param[in] DataLen Length of the packet data, in bytes * \param[in] Channel Bluetooth ACL data channel information structure for the packet's destination channel  247  */  Dean Camera committed Apr 13, 2010 248 void Bluetooth_PacketReceived(void* Data, uint16_t DataLen, Bluetooth_Channel_t* Channel)  249 {  Dean Camera committed Apr 13, 2010 250 251 252 253  switch (Channel->PSM) { case CHANNEL_PSM_SDP: /* Service Discovery Protocol packet */  Dean Camera committed Apr 15, 2010 254  ServiceDiscovery_ProcessPacket(Data, Channel);  Dean Camera committed Apr 13, 2010 255 256 257 258 259 260 261 262 263 264  break; default: /* Unknown Protocol packet */ printf_P(PSTR("Packet Received (Channel 0x%04X, PSM: 0x%02x):\r\n"), Channel->LocalNumber, Channel->PSM); for (uint16_t Byte = 0; Byte < DataLen; Byte++) printf_P(PSTR("0x%02X "), ((uint8_t*)Data)[Byte]); puts_P(PSTR("\r\n")); break; }  265 }