/* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved. This software may be distributed and modified under the terms of the GNU General Public License version 2 (GPL2) as published by the Free Software Foundation and appearing in the file GPL2.TXT included in the packaging of this file. Please note that GPL2 Section 2[b] requires that all works based on this software must also be made publicly available under the terms of the GPL2 ("Copyleft"). Contact information ------------------- Kristian Lauszus, TKJ Electronics Web : http://www.tkjelectronics.com e-mail : kristianl@tkjelectronics.com */ #ifndef _btd_h_ #define _btd_h_ #include "Usb.h" #include "confdescparser.h" //PID and VID of the Sony PS3 devices #define PS3_VID 0x054C // Sony Corporation #define PS3_PID 0x0268 // PS3 Controller DualShock 3 #define PS3NAVIGATION_PID 0x042F // Navigation controller #define PS3MOVE_PID 0x03D5 // Motion controller /* Bluetooth dongle data taken from descriptors */ #define BULK_MAXPKTSIZE 64 // max size for ACL data // Used in control endpoint header for HCI Commands #define bmREQ_HCI_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE // Used in control endpoint header for HID Commands #define bmREQ_HID_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE #define HID_REQUEST_SET_REPORT 0x09 /* Bluetooth HCI states for hci_task() */ #define HCI_INIT_STATE 0 #define HCI_RESET_STATE 1 #define HCI_BDADDR_STATE 2 #define HCI_LOCAL_VERSION_STATE 3 #define HCI_SET_NAME_STATE 4 #define HCI_CHECK_WII_SERVICE 5 #define HCI_INQUIRY_STATE 6 // These three states are only used if it should pair and connect to a Wii controller #define HCI_CONNECT_WII_STATE 7 #define HCI_CONNECTED_WII_STATE 8 #define HCI_SCANNING_STATE 9 #define HCI_CONNECT_IN_STATE 10 #define HCI_REMOTE_NAME_STATE 11 #define HCI_CONNECTED_STATE 12 #define HCI_DISABLE_SCAN_STATE 13 #define HCI_DONE_STATE 14 #define HCI_DISCONNECT_STATE 15 /* HCI event flags*/ #define HCI_FLAG_CMD_COMPLETE 0x01 #define HCI_FLAG_CONN_COMPLETE 0x02 #define HCI_FLAG_DISCONN_COMPLETE 0x04 #define HCI_FLAG_REMOTE_NAME_COMPLETE 0x08 #define HCI_FLAG_INCOMING_REQUEST 0x10 #define HCI_FLAG_READ_BDADDR 0x20 #define HCI_FLAG_READ_VERSION 0x40 #define HCI_FLAG_WII_FOUND 0x80 #define HCI_FLAG_CONNECT_EVENT 0x100 /*Macros for HCI event flag tests */ #define hci_cmd_complete (hci_event_flag & HCI_FLAG_CMD_COMPLETE) #define hci_connect_complete (hci_event_flag & HCI_FLAG_CONN_COMPLETE) #define hci_disconnect_complete (hci_event_flag & HCI_FLAG_DISCONN_COMPLETE) #define hci_remote_name_complete (hci_event_flag & HCI_FLAG_REMOTE_NAME_COMPLETE) #define hci_incoming_connect_request (hci_event_flag & HCI_FLAG_INCOMING_REQUEST) #define hci_read_bdaddr_complete (hci_event_flag & HCI_FLAG_READ_BDADDR) #define hci_read_version_complete (hci_event_flag & HCI_FLAG_READ_VERSION) #define hci_wii_found (hci_event_flag & HCI_FLAG_WII_FOUND) #define hci_connect_event (hci_event_flag & HCI_FLAG_CONNECT_EVENT) /* HCI Events managed */ #define EV_INQUIRY_COMPLETE 0x01 #define EV_INQUIRY_RESULT 0x02 #define EV_CONNECT_COMPLETE 0x03 #define EV_INCOMING_CONNECT 0x04 #define EV_DISCONNECT_COMPLETE 0x05 #define EV_AUTHENTICATION_COMPLETE 0x06 #define EV_REMOTE_NAME_COMPLETE 0x07 #define EV_ENCRYPTION_CHANGE 0x08 #define EV_CHANGE_CONNECTION_LINK 0x09 #define EV_ROLE_CHANGED 0x12 #define EV_NUM_COMPLETE_PKT 0x13 #define EV_PIN_CODE_REQUEST 0x16 #define EV_LINK_KEY_REQUEST 0x17 #define EV_LINK_KEY_NOTIFICATION 0x18 #define EV_DATA_BUFFER_OVERFLOW 0x1A #define EV_MAX_SLOTS_CHANGE 0x1B #define EV_READ_REMOTE_VERSION_INFORMATION_COMPLETE 0x0C #define EV_QOS_SETUP_COMPLETE 0x0D #define EV_COMMAND_COMPLETE 0x0E #define EV_COMMAND_STATUS 0x0F #define EV_LOOPBACK_COMMAND 0x19 #define EV_PAGE_SCAN_REP_MODE 0x20 /* L2CAP signaling commands */ #define L2CAP_CMD_COMMAND_REJECT 0x01 #define L2CAP_CMD_CONNECTION_REQUEST 0x02 #define L2CAP_CMD_CONNECTION_RESPONSE 0x03 #define L2CAP_CMD_CONFIG_REQUEST 0x04 #define L2CAP_CMD_CONFIG_RESPONSE 0x05 #define L2CAP_CMD_DISCONNECT_REQUEST 0x06 #define L2CAP_CMD_DISCONNECT_RESPONSE 0x07 #define L2CAP_CMD_INFORMATION_REQUEST 0x0A #define L2CAP_CMD_INFORMATION_RESPONSE 0x0B // Used For Connection Response - Remember to Include High Byte #define PENDING 0x01 #define SUCCESSFUL 0x00 /* Bluetooth L2CAP PSM - see http://www.bluetooth.org/Technical/AssignedNumbers/logical_link.htm */ #define SDP_PSM 0x01 // Service Discovery Protocol PSM Value #define RFCOMM_PSM 0x03 // RFCOMM PSM Value #define HID_CTRL_PSM 0x11 // HID_Control PSM Value #define HID_INTR_PSM 0x13 // HID_Interrupt PSM Value // Used to determine if it is a Bluetooth dongle #define WI_SUBCLASS_RF 0x01 // RF Controller #define WI_PROTOCOL_BT 0x01 // Bluetooth Programming Interface #define BTD_MAX_ENDPOINTS 4 #define BTD_NUMSERVICES 4 // Max number of Bluetooth services /** All Bluetooth services should include this class. */ class BluetoothService { public: /** * Used to pass acldata to the Bluetooth service. * @param ACLData Pointer to the incoming acldata. */ virtual void ACLData(uint8_t* ACLData); /** Used to run the different state machines in the Bluetooth service. */ virtual void Run(); /** Used to reset the Bluetooth service. */ virtual void Reset(); /** Used to disconnect both the L2CAP Channel and the HCI Connection for the Bluetooth service. */ virtual void disconnect(); }; /** * The Bluetooth Dongle class will take care of all the USB communication * and then pass the data to the BluetoothService classes. */ class BTD : public USBDeviceConfig, public UsbConfigXtracter { public: /** * Constructor for the BTD class. * @param p Pointer to USB class instance. */ BTD(USB *p); /** @name USBDeviceConfig implementation */ /** * Initialize the Bluetooth dongle. * @param parent Hub number. * @param port Port number on the hub. * @param lowspeed Speed of the device. * @return 0 on success. */ virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed); /** * Release the USB device. * @return 0 on success. */ virtual uint8_t Release(); /** * Poll the USB Input endpoins and run the state machines. * @return 0 on success. */ virtual uint8_t Poll(); /** * Get the device address. * @return The device address. */ virtual uint8_t GetAddress() { return bAddress; }; /** * Used to check if the dongle has been initialized. * @return True if it's ready. */ virtual bool isReady() { return bPollEnable; }; /**@}*/ /** @name UsbConfigXtracter implementation */ /** * UsbConfigXtracter implementation, used to extract endpoint information. * @param conf Configuration value. * @param iface Interface number. * @param alt Alternate setting. * @param proto Interface Protocol. * @param ep Endpoint Descriptor. */ virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep); /**@}*/ /** Disconnects both the L2CAP Channel and the HCI Connection for all Bluetooth services. */ void disconnect() { for (uint8_t i=0; idisconnect(); }; /** * Register bluetooth dongle members/services. * @param pService Pointer to BluetoothService class instance. * @return The serice ID on succes or -1 on fail. */ int8_t registerServiceClass(BluetoothService *pService) { for (uint8_t i=0; i