Author: oruizdorantes Date: 2010-04-02 14:12:29 +0200 (Fri, 02 Apr 2010) New Revision: 36027 Changeset: http://dev.haiku-os.org/changeset/36027/haiku Modified: haiku/trunk/headers/os/bluetooth/HCI/btHCI.h haiku/trunk/headers/os/bluetooth/HCI/btHCI_transport.h haiku/trunk/headers/os/bluetooth/LocalDevice.h haiku/trunk/src/add-ons/kernel/bluetooth/hci/bluetooth.cpp haiku/trunk/src/kits/bluetooth/LocalDevice.cpp Log: - Read Local features al LocalDevice constructor - keep record in UL and KL side Modified: haiku/trunk/headers/os/bluetooth/HCI/btHCI.h =================================================================== --- haiku/trunk/headers/os/bluetooth/HCI/btHCI.h 2010-04-02 11:42:00 UTC (rev 36026) +++ haiku/trunk/headers/os/bluetooth/HCI/btHCI.h 2010-04-02 12:12:29 UTC (rev 36027) @@ -9,7 +9,7 @@ typedef int32 hci_id; #define HCI_DEVICE_INDEX_OFFSET 0x7c -typedef enum { H2 = 2, H3, H4, H5 } transport_type; +typedef enum { H2 = 2, H3, H4, H5 } transport_type; typedef enum { BT_COMMAND = 0, BT_EVENT, @@ -44,8 +44,114 @@ /* Device drivers need to take this into account * when receiving ioctls. Only applies to R5 builds - * in deprecation process + * in deprecation process */ #define BT_IOCTLS_PASS_SIZE + +// HCI Packet types +#define HCI_2DH1 0x0002 +#define HCI_3DH1 0x0004 +#define HCI_DM1 0x0008 +#define HCI_DH1 0x0010 +#define HCI_2DH3 0x0100 +#define HCI_3DH3 0x0200 +#define HCI_DM3 0x0400 +#define HCI_DH3 0x0800 +#define HCI_2DH5 0x1000 +#define HCI_3DH5 0x2000 +#define HCI_DM5 0x4000 +#define HCI_DH5 0x8000 + +#define HCI_HV1 0x0020 +#define HCI_HV2 0x0040 +#define HCI_HV3 0x0080 + +#define HCI_EV3 0x0008 +#define HCI_EV4 0x0010 +#define HCI_EV5 0x0020 +#define HCI_2EV3 0x0040 +#define HCI_3EV3 0x0080 +#define HCI_2EV5 0x0100 +#define HCI_3EV5 0x0200 + +#define SCO_PTYPE_MASK (HCI_HV1 | HCI_HV2 | HCI_HV3) +#define ACL_PTYPE_MASK (HCI_DM1 | HCI_DH1 | HCI_DM3 | HCI_DH3 | HCI_DM5 | HCI_DH5) + + +// LMP features +#define LMP_3SLOT 0x01 +#define LMP_5SLOT 0x02 +#define LMP_ENCRYPT 0x04 +#define LMP_SOFFSET 0x08 +#define LMP_TACCURACY 0x10 +#define LMP_RSWITCH 0x20 +#define LMP_HOLD 0x40 +#define LMP_SNIFF 0x80 + +#define LMP_PARK 0x01 +#define LMP_RSSI 0x02 +#define LMP_QUALITY 0x04 +#define LMP_SCO 0x08 +#define LMP_HV2 0x10 +#define LMP_HV3 0x20 +#define LMP_ULAW 0x40 +#define LMP_ALAW 0x80 + +#define LMP_CVSD 0x01 +#define LMP_PSCHEME 0x02 +#define LMP_PCONTROL 0x04 +#define LMP_TRSP_SCO 0x08 +#define LMP_BCAST_ENC 0x80 + +#define LMP_EDR_ACL_2M 0x02 +#define LMP_EDR_ACL_3M 0x04 +#define LMP_ENH_ISCAN 0x08 +#define LMP_ILACE_ISCAN 0x10 +#define LMP_ILACE_PSCAN 0x20 +#define LMP_RSSI_INQ 0x40 +#define LMP_ESCO 0x80 + +#define LMP_EV4 0x01 +#define LMP_EV5 0x02 +#define LMP_AFH_CAP_SLV 0x08 +#define LMP_AFH_CLS_SLV 0x10 +#define LMP_EDR_3SLOT 0x80 + +#define LMP_EDR_5SLOT 0x01 +#define LMP_SNIFF_SUBR 0x02 +#define LMP_PAUSE_ENC 0x04 +#define LMP_AFH_CAP_MST 0x08 +#define LMP_AFH_CLS_MST 0x10 +#define LMP_EDR_ESCO_2M 0x20 +#define LMP_EDR_ESCO_3M 0x40 +#define LMP_EDR_3S_ESCO 0x80 + +#define LMP_EXT_INQ 0x01 +#define LMP_SIMPLE_PAIR 0x08 +#define LMP_ENCAPS_PDU 0x10 +#define LMP_ERR_DAT_REP 0x20 +#define LMP_NFLUSH_PKTS 0x40 + +#define LMP_LSTO 0x01 +#define LMP_INQ_TX_PWR 0x02 +#define LMP_EXT_FEAT 0x80 + +// Link policies +#define HCI_LP_RSWITCH 0x0001 +#define HCI_LP_HOLD 0x0002 +#define HCI_LP_SNIFF 0x0004 +#define HCI_LP_PARK 0x0008 + +// Link mode +#define HCI_LM_ACCEPT 0x8000 +#define HCI_LM_MASTER 0x0001 +#define HCI_LM_AUTH 0x0002 +#define HCI_LM_ENCRYPT 0x0004 +#define HCI_LM_TRUSTED 0x0008 +#define HCI_LM_RELIABLE 0x0010 +#define HCI_LM_SECURE 0x0020 + + #endif // _BTHCI_H_ + Property changes on: haiku/trunk/headers/os/bluetooth/HCI/btHCI.h ___________________________________________________________________ Added: svn:eol-style + native Modified: haiku/trunk/headers/os/bluetooth/HCI/btHCI_transport.h =================================================================== --- haiku/trunk/headers/os/bluetooth/HCI/btHCI_transport.h 2010-04-02 11:42:00 UTC (rev 36026) +++ haiku/trunk/headers/os/bluetooth/HCI/btHCI_transport.h 2010-04-02 12:12:29 UTC (rev 36027) @@ -62,9 +62,9 @@ // to be filled by driver status_t (*SendCommand)(hci_id hciId, void* command); - status_t (*SendACL)(hci_id hciId, net_buffer* nbuf ); - status_t (*SendSCO)(hci_id hciId, net_buffer* nbuf ); - status_t (*SendESCO)(hci_id hciId, net_buffer* nbuf ); + status_t (*SendACL)(hci_id hciId, net_buffer* nbuf); + status_t (*SendSCO)(hci_id hciId, net_buffer* nbuf); + status_t (*SendESCO)(hci_id hciId, net_buffer* nbuf); status_t (*DeliverStatistics)(hci_id hciId, bt_hci_statistics* statistics); @@ -90,6 +90,8 @@ size_t fExpectedPacketSize[HCI_NUM_PACKET_TYPES]; hci_id index; + uint16 supportedPacketTypes; + uint16 linkMode; int fd; bt_hci_device_information* info; @@ -148,10 +150,11 @@ BT_UP }; -#define PACK_PORTCODE(type,hid,data) ((type & 0xFF) << 24 | (hid & 0xFF) << 16 | (data & 0xFFFF)) -#define GET_PORTCODE_TYPE(code) ((code & 0xFF000000) >> 24) -#define GET_PORTCODE_HID(code) ((code & 0x00FF0000) >> 16) -#define GET_PORTCODE_DATA(code) ((code & 0x0000FFFF)) +// To deprecate ... +#define PACK_PORTCODE(type,hid,data) ((type & 0xFF) << 24 | (hid & 0xFF) << 16 | (data & 0xFFFF)) +#define GET_PORTCODE_TYPE(code) ((code & 0xFF000000) >> 24) +#define GET_PORTCODE_HID(code) ((code & 0x00FF0000) >> 16) +#define GET_PORTCODE_DATA(code) ((code & 0x0000FFFF)) /* Port drivers can use to send information (1 for all for at moment refer to ioctl GET_NOTIFICATION_PORT)*/ Modified: haiku/trunk/headers/os/bluetooth/LocalDevice.h =================================================================== --- haiku/trunk/headers/os/bluetooth/LocalDevice.h 2010-04-02 11:42:00 UTC (rev 36026) +++ haiku/trunk/headers/os/bluetooth/LocalDevice.h 2010-04-02 12:12:29 UTC (rev 36027) @@ -35,11 +35,11 @@ BString GetFriendlyName(); DeviceClass GetDeviceClass(); status_t SetDeviceClass(DeviceClass deviceClass); - + /* Possible throwing */ status_t SetDiscoverable(int mode); - BString GetProperty(const char* property); + BString GetProperty(const char* property); status_t GetProperty(const char* property, uint32* value); int GetDiscoverable(); @@ -53,10 +53,11 @@ LocalDevice(hci_id hid); virtual ~LocalDevice(); - status_t ReadLocalVersion(); - status_t ReadBufferSize(); + status_t _ReadLocalVersion(); + status_t _ReadBufferSize(); + status_t _ReadLocalFeatures(); status_t Reset(); - + static LocalDevice* RequestLocalDeviceID(BMessage* request); BMessenger* fMessenger; @@ -70,6 +71,7 @@ } + #ifndef _BT_USE_EXPLICIT_NAMESPACE using Bluetooth::LocalDevice; #endif Modified: haiku/trunk/src/add-ons/kernel/bluetooth/hci/bluetooth.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/bluetooth/hci/bluetooth.cpp 2010-04-02 11:42:00 UTC (rev 36026) +++ haiku/trunk/src/add-ons/kernel/bluetooth/hci/bluetooth.cpp 2010-04-02 12:12:29 UTC (rev 36027) @@ -251,7 +251,8 @@ device->info = NULL; // not yet used device->hooks = hooks; - + device->supportedPacketTypes = (HCI_DM1 | HCI_DH1 | HCI_HV1); + device->linkMode = (HCI_LM_ACCEPT); device->mtu = L2CAP_MTU_MINIMUM; // TODO: ensure specs min value MutexLocker _(&sListLock); @@ -415,7 +416,6 @@ if (BluetoothRXPort->Launch() != B_OK) { flowf("RX thread creation failed!\n"); // we Cannot do much here ... avoid registering - } else { flowf("RX thread launched!\n"); } Modified: haiku/trunk/src/kits/bluetooth/LocalDevice.cpp =================================================================== --- haiku/trunk/src/kits/bluetooth/LocalDevice.cpp 2010-04-02 11:42:00 UTC (rev 36026) +++ haiku/trunk/src/kits/bluetooth/LocalDevice.cpp 2010-04-02 12:12:29 UTC (rev 36027) @@ -77,7 +77,6 @@ LocalDevice* LocalDevice::GetLocalDevice(const bdaddr_t bdaddr) { - BMessage request(BT_MSG_ACQUIRE_LOCAL_DEVICE); request.AddData("bdaddr", B_ANY_TYPE, &bdaddr, sizeof(bdaddr_t)); @@ -110,7 +109,7 @@ DiscoveryAgent* LocalDevice::GetDiscoveryAgent() { - /* TODO: Study a singleton here */ + // TODO: Study a singleton here return new (std::nothrow)DiscoveryAgent(this); } @@ -118,7 +117,6 @@ BString LocalDevice::GetProperty(const char* property) { - return NULL; } @@ -334,7 +332,7 @@ status_t -LocalDevice::ReadLocalVersion() +LocalDevice::_ReadLocalVersion() { int8 bt_status = BT_ERROR; @@ -359,7 +357,7 @@ status_t -LocalDevice::ReadBufferSize() +LocalDevice::_ReadBufferSize() { int8 bt_status = BT_ERROR; @@ -384,6 +382,31 @@ status_t +LocalDevice::_ReadLocalFeatures() +{ + int8 bt_status = BT_ERROR; + + BluetoothCommand<> LocalFeatures(OGF_INFORMATIONAL_PARAM, + OCF_READ_LOCAL_FEATURES); + + BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); + BMessage reply; + + request.AddInt32("hci_id", fHid); + request.AddData("raw command", B_ANY_TYPE, + LocalFeatures.Data(), LocalFeatures.Size()); + request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); + request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_INFORMATIONAL_PARAM, + OCF_READ_LOCAL_FEATURES)); + + if (fMessenger->SendMessage(&request, &reply) == B_OK) + reply.FindInt8("status", &bt_status); + + return bt_status; +} + + +status_t LocalDevice::Reset() { int8 bt_status = BT_ERROR; @@ -406,6 +429,7 @@ } + /* ServiceRecord LocalDevice::getRecord(Connection notifier) { @@ -422,7 +446,11 @@ LocalDevice::LocalDevice(hci_id hid) : fHid(hid) { fMessenger = _RetrieveBluetoothMessenger(); - ReadLocalVersion(); + + _ReadBufferSize(); + _ReadLocalFeatures(); + _ReadLocalVersion(); + uint32 value; // HARDCODE -> move this to addons @@ -433,7 +461,7 @@ // Reset(); // Perform a reset to Broadcom buggyland // Uncomment this out if your Broadcom dongle has a null bdaddr -//#define BT_WRITE_BDADDR_FOR_BCM2035 +// #define BT_WRITE_BDADDR_FOR_BCM2035 #ifdef BT_WRITE_BDADDR_FOR_BCM2035 #warning Writting broadcom bdaddr @ init. // try write bdaddr to a bcm2035 -> will be moved to an addon @@ -462,8 +490,6 @@ reply.FindInt8("status", &bt_status); #endif } - - ReadBufferSize(); }