Shinji Tadenuma / ADK_DEMO

Description: BlackOneとAndroidの連携デモプログラム AndroidAccessoryを改造してBlackOneとAndroidが連携できるようにしました。 サポートしているのは、デモアプリの ”Buttons” B1-SW1, B2-SW2, B3-SW3 ”LED2” RGB-LED のみです。 LCDに表示するイメージをマイクロSDカードに入れてLCDのソケットに挿入しておく必要があります。 イメージは、320X240ドットで”\Image”という名前のフォルダの直下に”10.jpg”という名前で入れてください。

Committer:
user Shinji Tadenuma
Date:
Fri Dec 23 04:33:33 2011 +0000
Revision:
0:7b556109fd46

    

Who changed what in which revision?

UserRevisionLine numberNew contents of line
user Shinji Tadenuma0:7b556109fd46 1/*
user Shinji Tadenuma0:7b556109fd46 2Copyright (c) 2010 Peter Barrett
user Shinji Tadenuma0:7b556109fd46 3
user Shinji Tadenuma0:7b556109fd46 4Permission is hereby granted, free of charge, to any person obtaining a copy
user Shinji Tadenuma0:7b556109fd46 5of this software and associated documentation files (the "Software"), to deal
user Shinji Tadenuma0:7b556109fd46 6in the Software without restriction, including without limitation the rights
user Shinji Tadenuma0:7b556109fd46 7to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
user Shinji Tadenuma0:7b556109fd46 8copies of the Software, and to permit persons to whom the Software is
user Shinji Tadenuma0:7b556109fd46 9furnished to do so, subject to the following conditions:
user Shinji Tadenuma0:7b556109fd46 10
user Shinji Tadenuma0:7b556109fd46 11The above copyright notice and this permission notice shall be included in
user Shinji Tadenuma0:7b556109fd46 12all copies or substantial portions of the Software.
user Shinji Tadenuma0:7b556109fd46 13
user Shinji Tadenuma0:7b556109fd46 14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
user Shinji Tadenuma0:7b556109fd46 15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
user Shinji Tadenuma0:7b556109fd46 16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
user Shinji Tadenuma0:7b556109fd46 17AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
user Shinji Tadenuma0:7b556109fd46 18LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
user Shinji Tadenuma0:7b556109fd46 19OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
user Shinji Tadenuma0:7b556109fd46 20THE SOFTWARE.
user Shinji Tadenuma0:7b556109fd46 21*/
user Shinji Tadenuma0:7b556109fd46 22
user Shinji Tadenuma0:7b556109fd46 23#ifndef HCI_H_INCLUDED
user Shinji Tadenuma0:7b556109fd46 24#define HCI_H_INCLUDED
user Shinji Tadenuma0:7b556109fd46 25
user Shinji Tadenuma0:7b556109fd46 26#include "Socket.h"
user Shinji Tadenuma0:7b556109fd46 27
user Shinji Tadenuma0:7b556109fd46 28#pragma pack(1)
user Shinji Tadenuma0:7b556109fd46 29
user Shinji Tadenuma0:7b556109fd46 30#define ERR_HCI_DEVICE_NOT_FOUND -300
user Shinji Tadenuma0:7b556109fd46 31
user Shinji Tadenuma0:7b556109fd46 32class HCI;
user Shinji Tadenuma0:7b556109fd46 33class HCITransport;
user Shinji Tadenuma0:7b556109fd46 34class BTDevice;
user Shinji Tadenuma0:7b556109fd46 35
user Shinji Tadenuma0:7b556109fd46 36typedef struct
user Shinji Tadenuma0:7b556109fd46 37{
user Shinji Tadenuma0:7b556109fd46 38 u8 addr[6];
user Shinji Tadenuma0:7b556109fd46 39} BD_ADDR;
user Shinji Tadenuma0:7b556109fd46 40
user Shinji Tadenuma0:7b556109fd46 41typedef struct
user Shinji Tadenuma0:7b556109fd46 42{
user Shinji Tadenuma0:7b556109fd46 43 BD_ADDR bdaddr;
user Shinji Tadenuma0:7b556109fd46 44 u8 pscan_rep_mode;
user Shinji Tadenuma0:7b556109fd46 45 u8 pscan_period_mode;
user Shinji Tadenuma0:7b556109fd46 46 u8 pscan_mode;
user Shinji Tadenuma0:7b556109fd46 47 u8 dev_class[3];
user Shinji Tadenuma0:7b556109fd46 48 u16 clock_offset;
user Shinji Tadenuma0:7b556109fd46 49} inquiry_info;
user Shinji Tadenuma0:7b556109fd46 50
user Shinji Tadenuma0:7b556109fd46 51typedef struct
user Shinji Tadenuma0:7b556109fd46 52{
user Shinji Tadenuma0:7b556109fd46 53 BD_ADDR bdaddr;
user Shinji Tadenuma0:7b556109fd46 54 u8 dev_class[3];
user Shinji Tadenuma0:7b556109fd46 55 u8 link_type;
user Shinji Tadenuma0:7b556109fd46 56} request_info;
user Shinji Tadenuma0:7b556109fd46 57
user Shinji Tadenuma0:7b556109fd46 58typedef struct
user Shinji Tadenuma0:7b556109fd46 59{
user Shinji Tadenuma0:7b556109fd46 60 u8 status;
user Shinji Tadenuma0:7b556109fd46 61 u16 handle;
user Shinji Tadenuma0:7b556109fd46 62 BD_ADDR bdaddr;
user Shinji Tadenuma0:7b556109fd46 63 u8 link_type;
user Shinji Tadenuma0:7b556109fd46 64 u8 encr_mode;
user Shinji Tadenuma0:7b556109fd46 65} connection_info;
user Shinji Tadenuma0:7b556109fd46 66
user Shinji Tadenuma0:7b556109fd46 67// Address struct for creating L2CAP sockets
user Shinji Tadenuma0:7b556109fd46 68typedef struct {
user Shinji Tadenuma0:7b556109fd46 69 SocketAddrHdr hdr;
user Shinji Tadenuma0:7b556109fd46 70 BD_ADDR bdaddr;
user Shinji Tadenuma0:7b556109fd46 71 u16 psm;
user Shinji Tadenuma0:7b556109fd46 72} L2CAPAddr;
user Shinji Tadenuma0:7b556109fd46 73
user Shinji Tadenuma0:7b556109fd46 74#pragma pack(4)
user Shinji Tadenuma0:7b556109fd46 75
user Shinji Tadenuma0:7b556109fd46 76class BTDevice;
user Shinji Tadenuma0:7b556109fd46 77typedef struct
user Shinji Tadenuma0:7b556109fd46 78{
user Shinji Tadenuma0:7b556109fd46 79 public:
user Shinji Tadenuma0:7b556109fd46 80 SocketInternal si;
user Shinji Tadenuma0:7b556109fd46 81 BTDevice* btdevice;
user Shinji Tadenuma0:7b556109fd46 82 u16 scid;
user Shinji Tadenuma0:7b556109fd46 83 u16 dcid;
user Shinji Tadenuma0:7b556109fd46 84} L2CAPSocket;
user Shinji Tadenuma0:7b556109fd46 85
user Shinji Tadenuma0:7b556109fd46 86#define MAX_HCL_NAME_LENGTH 20 // TODO - BTDevice wants to be a multiple of 4
user Shinji Tadenuma0:7b556109fd46 87#define MAX_PORTS 3
user Shinji Tadenuma0:7b556109fd46 88
user Shinji Tadenuma0:7b556109fd46 89// BTDevice encapsulates individual device state
user Shinji Tadenuma0:7b556109fd46 90// It provides L2CAP layer sockets
user Shinji Tadenuma0:7b556109fd46 91
user Shinji Tadenuma0:7b556109fd46 92class BTDevice : public SocketHandler
user Shinji Tadenuma0:7b556109fd46 93{
user Shinji Tadenuma0:7b556109fd46 94 public:
user Shinji Tadenuma0:7b556109fd46 95 HCITransport* _transport;
user Shinji Tadenuma0:7b556109fd46 96 inquiry_info _info;
user Shinji Tadenuma0:7b556109fd46 97 u16 _handle; // acl connection handle
user Shinji Tadenuma0:7b556109fd46 98 u8 _state; // connection state
user Shinji Tadenuma0:7b556109fd46 99 u8 _txid;
user Shinji Tadenuma0:7b556109fd46 100 char _name[MAX_HCL_NAME_LENGTH];
user Shinji Tadenuma0:7b556109fd46 101
user Shinji Tadenuma0:7b556109fd46 102 void Init();
user Shinji Tadenuma0:7b556109fd46 103
user Shinji Tadenuma0:7b556109fd46 104 BD_ADDR* GetAddress() { return &_info.bdaddr; }
user Shinji Tadenuma0:7b556109fd46 105
user Shinji Tadenuma0:7b556109fd46 106 // Called from HCI
user Shinji Tadenuma0:7b556109fd46 107 void ACLRecv(const BD_ADDR* addr, const u8* data, int len);
user Shinji Tadenuma0:7b556109fd46 108
user Shinji Tadenuma0:7b556109fd46 109 // SocketHandler
user Shinji Tadenuma0:7b556109fd46 110 virtual int Open(SocketInternal* sock, SocketAddrHdr* addr);
user Shinji Tadenuma0:7b556109fd46 111 virtual int Send(SocketInternal* sock, const u8* data, int len);
user Shinji Tadenuma0:7b556109fd46 112 virtual int Close(SocketInternal* sock);
user Shinji Tadenuma0:7b556109fd46 113 // added by Bart Janssens
user Shinji Tadenuma0:7b556109fd46 114 virtual int Create(SocketInternal* sock, SocketAddrHdr* addr);
user Shinji Tadenuma0:7b556109fd46 115 virtual int Accept(SocketInternal* sock, SocketAddrHdr* addr);
user Shinji Tadenuma0:7b556109fd46 116
user Shinji Tadenuma0:7b556109fd46 117private:
user Shinji Tadenuma0:7b556109fd46 118 L2CAPSocket* SCIDToSocket(int scid);
user Shinji Tadenuma0:7b556109fd46 119 int Send(const u8* data, int len);
user Shinji Tadenuma0:7b556109fd46 120 int Send(u8 c, u8 id, u16* params, int count);
user Shinji Tadenuma0:7b556109fd46 121 int Connect(int scid, int psm);
user Shinji Tadenuma0:7b556109fd46 122 int Disconnect(int scid, int dcid);
user Shinji Tadenuma0:7b556109fd46 123 int ConfigureRequest(int dcid);
user Shinji Tadenuma0:7b556109fd46 124 int ConfigureResponse(u8 rxid, int dcid);
user Shinji Tadenuma0:7b556109fd46 125 int DisconnectResponse(u8 rxid, int scid, int dcid);
user Shinji Tadenuma0:7b556109fd46 126 // added by Bart Janssens
user Shinji Tadenuma0:7b556109fd46 127 int AcceptResponse(u8 rxid, int scid, int dcid);
user Shinji Tadenuma0:7b556109fd46 128 int RefuseResponse(u8 rxid);
user Shinji Tadenuma0:7b556109fd46 129 //
user Shinji Tadenuma0:7b556109fd46 130 void Control(const BD_ADDR* addr, const u8* data, int len);
user Shinji Tadenuma0:7b556109fd46 131};
user Shinji Tadenuma0:7b556109fd46 132
user Shinji Tadenuma0:7b556109fd46 133enum HCI_CALLBACK_EVENT
user Shinji Tadenuma0:7b556109fd46 134{
user Shinji Tadenuma0:7b556109fd46 135 CALLBACK_NONE,
user Shinji Tadenuma0:7b556109fd46 136 CALLBACK_READY,
user Shinji Tadenuma0:7b556109fd46 137 CALLBACK_INQUIRY_RESULT,
user Shinji Tadenuma0:7b556109fd46 138 CALLBACK_INQUIRY_DONE,
user Shinji Tadenuma0:7b556109fd46 139 CALLBACK_REMOTE_NAME,
user Shinji Tadenuma0:7b556109fd46 140 CALLBACK_CONNECTION_COMPLETE,
user Shinji Tadenuma0:7b556109fd46 141 CALLBACK_CONNECTION_FAILED
user Shinji Tadenuma0:7b556109fd46 142};
user Shinji Tadenuma0:7b556109fd46 143
user Shinji Tadenuma0:7b556109fd46 144// L2CAP Protocol/Service Multiplexor (PSM) values
user Shinji Tadenuma0:7b556109fd46 145
user Shinji Tadenuma0:7b556109fd46 146#define L2CAP_PSM_ANY 0x0000 /* Any/Invalid PSM */
user Shinji Tadenuma0:7b556109fd46 147#define L2CAP_PSM_SDP 0x0001 /* Service Discovery Protocol */
user Shinji Tadenuma0:7b556109fd46 148#define L2CAP_PSM_RFCOMM 0x0003 /* RFCOMM protocol */
user Shinji Tadenuma0:7b556109fd46 149#define L2CAP_PSM_TCP 0x0005 /* Telephony Control Protocol */
user Shinji Tadenuma0:7b556109fd46 150#define L2CAP_PSM_TCS 0x0007 /* TCS cordless */
user Shinji Tadenuma0:7b556109fd46 151#define L2CAP_PSM_BNEP 0x000f /* Bluetooth Network Encapsulation Protocol*/
user Shinji Tadenuma0:7b556109fd46 152#define L2CAP_PSM_HID_CNTL 0x0011 /* HID Control */
user Shinji Tadenuma0:7b556109fd46 153#define L2CAP_PSM_HID_INTR 0x0013 /* HID Interrupt */
user Shinji Tadenuma0:7b556109fd46 154#define L2CAP_PSM_ESDP 0x0015 /* Extended Service Discovery Profile */
user Shinji Tadenuma0:7b556109fd46 155#define L2CAP_PSM_AVCTP 0x0017 /* Audio/Visual Control Transport Protocol */
user Shinji Tadenuma0:7b556109fd46 156#define L2CAP_PSM_AVDTP 0x0019 /* Audio/Visual Distribution */
user Shinji Tadenuma0:7b556109fd46 157
user Shinji Tadenuma0:7b556109fd46 158/* Connection response results */
user Shinji Tadenuma0:7b556109fd46 159#define L2CAP_CONN_SUCCESS 0x0000
user Shinji Tadenuma0:7b556109fd46 160#define L2CAP_CONN_PND 0x0001
user Shinji Tadenuma0:7b556109fd46 161#define L2CAP_CONN_REF_PSM 0x0002
user Shinji Tadenuma0:7b556109fd46 162#define L2CAP_CONN_REF_SEC 0x0003
user Shinji Tadenuma0:7b556109fd46 163#define L2CAP_CONN_REF_RES 0x0004
user Shinji Tadenuma0:7b556109fd46 164#define L2CAP_CONN_CFG_TO 0x0005 /* Implementation specific result */
user Shinji Tadenuma0:7b556109fd46 165
user Shinji Tadenuma0:7b556109fd46 166
user Shinji Tadenuma0:7b556109fd46 167
user Shinji Tadenuma0:7b556109fd46 168// Callback from inquiry
user Shinji Tadenuma0:7b556109fd46 169typedef int (*HCICallback)(HCI* hci, HCI_CALLBACK_EVENT evt, const u8* data, int len);
user Shinji Tadenuma0:7b556109fd46 170
user Shinji Tadenuma0:7b556109fd46 171#define MAX_BTDEVICES 8
user Shinji Tadenuma0:7b556109fd46 172
user Shinji Tadenuma0:7b556109fd46 173class HCITransport;
user Shinji Tadenuma0:7b556109fd46 174class HCI : public SocketHandler
user Shinji Tadenuma0:7b556109fd46 175{
user Shinji Tadenuma0:7b556109fd46 176 HCITransport* _transport;
user Shinji Tadenuma0:7b556109fd46 177 HCICallback _callback;
user Shinji Tadenuma0:7b556109fd46 178 BD_ADDR _localAddr;
user Shinji Tadenuma0:7b556109fd46 179
user Shinji Tadenuma0:7b556109fd46 180 BTDevice _devices[MAX_BTDEVICES];
user Shinji Tadenuma0:7b556109fd46 181 int _deviceCount;
user Shinji Tadenuma0:7b556109fd46 182
user Shinji Tadenuma0:7b556109fd46 183 int _acl_mtu;
user Shinji Tadenuma0:7b556109fd46 184 int _acl_max_pkt;
user Shinji Tadenuma0:7b556109fd46 185 int _sco_mtu;
user Shinji Tadenuma0:7b556109fd46 186 int _sco_max_pkt;
user Shinji Tadenuma0:7b556109fd46 187
user Shinji Tadenuma0:7b556109fd46 188 int _state;
user Shinji Tadenuma0:7b556109fd46 189
user Shinji Tadenuma0:7b556109fd46 190 public:
user Shinji Tadenuma0:7b556109fd46 191
user Shinji Tadenuma0:7b556109fd46 192 // Open a local adapter
user Shinji Tadenuma0:7b556109fd46 193 int Open(HCITransport* transport, HCICallback callback);
user Shinji Tadenuma0:7b556109fd46 194
user Shinji Tadenuma0:7b556109fd46 195 // Return list of discovered addreses
user Shinji Tadenuma0:7b556109fd46 196 int GetDevices(BTDevice** devices, int maxDevices);
user Shinji Tadenuma0:7b556109fd46 197
user Shinji Tadenuma0:7b556109fd46 198 // Lookup a device by address or handle
user Shinji Tadenuma0:7b556109fd46 199 BTDevice* Find(const BD_ADDR* addr);
user Shinji Tadenuma0:7b556109fd46 200 BTDevice* Find(int handle);
user Shinji Tadenuma0:7b556109fd46 201
user Shinji Tadenuma0:7b556109fd46 202 // Disconnect from a remote device
user Shinji Tadenuma0:7b556109fd46 203 int Disconnect(const BD_ADDR* addr);
user Shinji Tadenuma0:7b556109fd46 204 int DisconnectAll();
user Shinji Tadenuma0:7b556109fd46 205
user Shinji Tadenuma0:7b556109fd46 206 // see what devies are in the system
user Shinji Tadenuma0:7b556109fd46 207 int Inquiry(int duration = 10);
user Shinji Tadenuma0:7b556109fd46 208
user Shinji Tadenuma0:7b556109fd46 209 // added by Bart Janssens
user Shinji Tadenuma0:7b556109fd46 210 int WriteScanEnable();
user Shinji Tadenuma0:7b556109fd46 211
user Shinji Tadenuma0:7b556109fd46 212 int AcceptConnection(const BD_ADDR* addr);
user Shinji Tadenuma0:7b556109fd46 213
user Shinji Tadenuma0:7b556109fd46 214 // get a name, delivered in callback
user Shinji Tadenuma0:7b556109fd46 215 int RemoteNameRequest(const BD_ADDR* addr);
user Shinji Tadenuma0:7b556109fd46 216
user Shinji Tadenuma0:7b556109fd46 217 // Connect to a remote device
user Shinji Tadenuma0:7b556109fd46 218 int CreateConnection(const BD_ADDR* remoteAddr);
user Shinji Tadenuma0:7b556109fd46 219
user Shinji Tadenuma0:7b556109fd46 220 bool Busy();
user Shinji Tadenuma0:7b556109fd46 221
user Shinji Tadenuma0:7b556109fd46 222 // called from transport
user Shinji Tadenuma0:7b556109fd46 223 void HCIRecv(const u8* data, int len);
user Shinji Tadenuma0:7b556109fd46 224
user Shinji Tadenuma0:7b556109fd46 225 // called from transport
user Shinji Tadenuma0:7b556109fd46 226 void ACLRecv(const u8* data, int len);
user Shinji Tadenuma0:7b556109fd46 227
user Shinji Tadenuma0:7b556109fd46 228 // SocketHandler methods for maintaining L2CAP sockets
user Shinji Tadenuma0:7b556109fd46 229 virtual int Open(SocketInternal* sock, SocketAddrHdr* addr);
user Shinji Tadenuma0:7b556109fd46 230 virtual int Send(SocketInternal* sock, const u8* data, int len);
user Shinji Tadenuma0:7b556109fd46 231 virtual int Close(SocketInternal* sock);
user Shinji Tadenuma0:7b556109fd46 232 // added by Bart Janssens
user Shinji Tadenuma0:7b556109fd46 233 virtual int Create(SocketInternal* sock, SocketAddrHdr* addr);
user Shinji Tadenuma0:7b556109fd46 234 virtual int Accept(SocketInternal* sock, SocketAddrHdr* addr);
user Shinji Tadenuma0:7b556109fd46 235
user Shinji Tadenuma0:7b556109fd46 236 private:
user Shinji Tadenuma0:7b556109fd46 237 void InquiryResult(const inquiry_info* info);
user Shinji Tadenuma0:7b556109fd46 238 void RemoteName(const BD_ADDR* addr, const char* name);
user Shinji Tadenuma0:7b556109fd46 239 void ConnectComplete(const connection_info* info);
user Shinji Tadenuma0:7b556109fd46 240 void ConnectRequest(const request_info* info);
user Shinji Tadenuma0:7b556109fd46 241 void DisconnectComplete(int handle);
user Shinji Tadenuma0:7b556109fd46 242 int SendCmd(int cmd, const u8* params = 0, int len = 0);
user Shinji Tadenuma0:7b556109fd46 243 void OnCommandComplete(int cmd, const u8* data, int len);
user Shinji Tadenuma0:7b556109fd46 244 void Callback(HCI_CALLBACK_EVENT c, const u8* data, int len);
user Shinji Tadenuma0:7b556109fd46 245 int PinCodeReply(const u8* data);
user Shinji Tadenuma0:7b556109fd46 246};
user Shinji Tadenuma0:7b556109fd46 247
user Shinji Tadenuma0:7b556109fd46 248class HCITransport
user Shinji Tadenuma0:7b556109fd46 249{
user Shinji Tadenuma0:7b556109fd46 250protected:
user Shinji Tadenuma0:7b556109fd46 251 HCI* _target;
user Shinji Tadenuma0:7b556109fd46 252public:
user Shinji Tadenuma0:7b556109fd46 253 void Set(HCI* target) { _target = target; };
user Shinji Tadenuma0:7b556109fd46 254 virtual void HCISend(const u8* data, int len) = 0;
user Shinji Tadenuma0:7b556109fd46 255 virtual void ACLSend(const u8* data, int len) = 0;
user Shinji Tadenuma0:7b556109fd46 256};
user Shinji Tadenuma0:7b556109fd46 257
user Shinji Tadenuma0:7b556109fd46 258#endif