From owner-freebsd-bluetooth@freebsd.org Mon Sep 14 00:03:48 2015 Return-Path: Delivered-To: freebsd-bluetooth@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 2DA039CA761 for ; Mon, 14 Sep 2015 00:03:48 +0000 (UTC) (envelope-from erdgeist@erdgeist.org) Received: from elektropost.org (elektropost.org [217.115.13.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 823B010F6 for ; Mon, 14 Sep 2015 00:03:46 +0000 (UTC) (envelope-from erdgeist@erdgeist.org) Received: (qmail 34437 invoked from network); 14 Sep 2015 00:03:37 -0000 Received: from elektropost.org (HELO elektropost.org) (erdgeist@erdgeist.org) by elektropost.org with ESMTPS (DHE-RSA-AES128-SHA encrypted); 14 Sep 2015 00:03:37 -0000 Subject: Re: Apple Magic Mouse To: Maksim Yevmenkin References: <1437909200.57929.3.camel@yandex.com> <55F4362A.4050203@erdgeist.org> Cc: "freebsd-bluetooth@freebsd.org" From: Dirk Engling X-Enigmail-Draft-Status: N1110 Message-ID: <55F60ED8.8080203@erdgeist.org> Date: Mon, 14 Sep 2015 02:03:36 +0200 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------060602030404060108060001" X-BeenThere: freebsd-bluetooth@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Using Bluetooth in FreeBSD environments List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Sep 2015 00:03:48 -0000 This is a multi-part message in MIME format. --------------060602030404060108060001 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit On 12.09.15 19:53, Maksim Yevmenkin wrote: > i think it should be possible to teach bthidd to make another sdp > request to pull device id sdp record (if available). if apple mouse > answers it then it should very easy to identify it and enable all the > features. Apples magic mouse indeed answers the SDP request for its Device ID Service Record. Find attached a first patch that adds a vendor, product and version member in the bthid_session object that is filled after both connections for the session were attached. This is done in a new function session_get_devid that issues and handles the SDP requests. There's also a new hid_initialise function, that gets a chance to take a look at those new members and initialise devices based on those information. Caveats: Only the first DevIDService record is parsed without regard for the PrimaryRecord flag. This is not necessarily correct for devices that expose multiple services. For most HID it still should be good enough and checking for multiple records and writing code to handle devices with no PrimaryRecord is way too complex for what we want to achieve. The libsdp actually issues a blocking write and, worse: a blocking read on the bluetooth connection, potentially blocking the whole bthidd until the read times out. However, since this happens after both channels were successfully established, chances are pretty good that the device will not die just when we send the request. Depending on lingual preferences, you might want to rename initialise to initialize. Comments on the patch are appreciated. I will now go on and blatantly rip off Iain Hibberts code from the NetBSD driver to make use of what the mouse sends me. Regards, erdgeist --------------060602030404060108060001 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="bthidd.sdp.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="bthidd.sdp.patch" ZGlmZiAtdXIgYnRoaWRkL01ha2VmaWxlIC91c3Ivc3JjL3Vzci5zYmluL2JsdWV0b290aC9i dGhpZGQvTWFrZWZpbGUKLS0tIGJ0aGlkZC9NYWtlZmlsZQkyMDE1LTA4LTEyIDE2OjIxOjM2 LjAwMDAwMDAwMCArMDIwMAorKysgL3Vzci9zcmMvdXNyLnNiaW4vYmx1ZXRvb3RoL2J0aGlk ZC9NYWtlZmlsZQkyMDE1LTA5LTE0IDAxOjIzOjU4Ljc0NTg0MjMxNyArMDIwMApAQCAtMTEs NyArMTEsNyBAQAogREVCVUdfRkxBR1M9CS1nCiAKIERQQUREPSAgICAgICAgICAke0xJQkJM VUVUT09USH0gJHtMSUJVU0JISUR9Ci1MREFERD0JCS1sYmx1ZXRvb3RoIC1sdXNiaGlkCitM REFERD0JCS1sYmx1ZXRvb3RoIC1sdXNiaGlkIC1sc2RwCiAKIE5PX1dNSVNTSU5HX1ZBUklB QkxFX0RFQ0xBUkFUSU9OUz0KIApkaWZmIC11ciBidGhpZGQvYnRoaWRkLmggL3Vzci9zcmMv dXNyLnNiaW4vYmx1ZXRvb3RoL2J0aGlkZC9idGhpZGQuaAotLS0gYnRoaWRkL2J0aGlkZC5o CTIwMTUtMDgtMTIgMTY6MjE6MzYuMDAwMDAwMDAwICswMjAwCisrKyAvdXNyL3NyYy91c3Iu c2Jpbi9ibHVldG9vdGgvYnRoaWRkL2J0aGlkZC5oCTIwMTUtMDktMTQgMDE6MjA6NDkuODYz ODgwODg3ICswMjAwCkBAIC02MSw2ICs2MSw5IEBACiAJaW50MzJfdAkJCQkgaW50cjsJLyog aW50ZXJydXB0IGNoYW5uZWwgKi8KIAlpbnQzMl90CQkJCSB2a2JkOwkvKiB2aXJ1YWwga2V5 Ym9hcmQgKi8KIAliZGFkZHJfdAkJCSBiZGFkZHI7LyogcmVtb3RlIGJkYWRkciAqLworCXVp bnQxNl90CQkJIHZlbmRvcjsvKiByZW1vdGUgdmVuZG9yIGlkICovCisJdWludDE2X3QJCQkg cHJvZHVjdDsvKnJlbW90ZSBwcm9kdWN0IGlkICovCisJdWludDE2X3QJCQkgdmVyc2lvbjsv KnJlbW90ZSB2ZXJzaW9uIGlkICovCiAJdWludDE2X3QJCQkgc3RhdGU7CS8qIHNlc3Npb24g c3RhdGUgKi8KICNkZWZpbmUgQ0xPU0VECTAKICNkZWZpbmUJVzRDVFJMCTEKQEAgLTg0LDgg Kzg3LDEwIEBACiBidGhpZF9zZXNzaW9uX3AJc2Vzc2lvbl9vcGVuICAgICAoYnRoaWRfc2Vy dmVyX3Agc3J2LCBoaWRfZGV2aWNlX3AgY29uc3QgZCk7CiBidGhpZF9zZXNzaW9uX3AJc2Vz c2lvbl9ieV9iZGFkZHIoYnRoaWRfc2VydmVyX3Agc3J2LCBiZGFkZHJfcCBiZGFkZHIpOwog YnRoaWRfc2Vzc2lvbl9wCXNlc3Npb25fYnlfZmQgICAgKGJ0aGlkX3NlcnZlcl9wIHNydiwg aW50MzJfdCBmZCk7Cit2b2lkIAkJc2Vzc2lvbl9nZXRfZGV2aWQoYnRoaWRfc2Vzc2lvbl9w IHMpOwogdm9pZAkJc2Vzc2lvbl9jbG9zZSAgICAoYnRoaWRfc2Vzc2lvbl9wIHMpOwogCit2 b2lkCQloaWRfaW5pdGlhbGlzZQkgKGJ0aGlkX3Nlc3Npb25fcCBzKTsKIGludDMyX3QJCWhp ZF9jb250cm9sICAgICAgKGJ0aGlkX3Nlc3Npb25fcCBzLCB1aW50OF90ICpkYXRhLCBpbnQz Ml90IGxlbik7CiBpbnQzMl90CQloaWRfaW50ZXJydXB0ICAgIChidGhpZF9zZXNzaW9uX3Ag cywgdWludDhfdCAqZGF0YSwgaW50MzJfdCBsZW4pOwogCmRpZmYgLXVyIGJ0aGlkZC9oaWQu YyAvdXNyL3NyYy91c3Iuc2Jpbi9ibHVldG9vdGgvYnRoaWRkL2hpZC5jCi0tLSBidGhpZGQv aGlkLmMJMjAxNS0wOC0xMiAxNjoyMTozNi4wMDAwMDAwMDAgKzAyMDAKKysrIC91c3Ivc3Jj L3Vzci5zYmluL2JsdWV0b290aC9idGhpZGQvaGlkLmMJMjAxNS0wOS0xNCAwMTo0Mzo0OC42 NDQ3NTQ2NzggKzAyMDAKQEAgLTQ5LDYgKzQ5LDE5IEBACiAjaW5jbHVkZSAia2JkLmgiCiAK IC8qCisgKiBQcm9iZSBmb3IgcGVyLWRldmljZSBpbml0aWFsaXNhdGlvbgorICovCit2b2lk CitoaWRfaW5pdGlhbGlzZShidGhpZF9zZXNzaW9uX3AgcykKK3sKKwkvKiBNYWdpYyByZXBv cnQgdG8gZW5hYmxlIHRyYWNrcGFkIG9uIEFwcGxlJ3MgTWFnaWMgTW91c2UKKwlzdGF0aWMg dWludDhfdCByZXBbXSA9IHsgMHg1MywgMHhkNywgMHgwMSB9OworCWlmKHMtPnZlbmRvciAg PT0gMHg1YWMgJiYgcy0+cHJvZHVjdCA9PSAweDMwZCApCisJCXdyaXRlKHMtPmN0cmwsIHJl cCwgMyApOworCSovCit9CisKKy8qCiAgKiBQcm9jZXNzIGRhdGEgZnJvbSBjb250cm9sIGNo YW5uZWwKICAqLwogCmRpZmYgLXVyIGJ0aGlkZC9zZXJ2ZXIuYyAvdXNyL3NyYy91c3Iuc2Jp bi9ibHVldG9vdGgvYnRoaWRkL3NlcnZlci5jCi0tLSBidGhpZGQvc2VydmVyLmMJMjAxNS0w OC0xMiAxNjoyMTozNi4wMDAwMDAwMDAgKzAyMDAKKysrIC91c3Ivc3JjL3Vzci5zYmluL2Js dWV0b290aC9idGhpZGQvc2VydmVyLmMJMjAxNS0wOS0xNCAwMTo0NDoxMi44NDM3NjUwNDkg KzAyMDAKQEAgLTI4Niw2ICsyODYsMTIgQEAKIAkJCXNydi0+bWF4ZmQgPSBzLT52a2JkOwog CX0KIAorCS8qIEdldCBWZW5kb3JJRCBhbmQgUHJvZHVjdElEIGFmdGVyIGJvdGggY2hhbm5l bHMgYXJlIGVzdGFibGlzaGVkICovCisJaWYgKHMtPnN0YXRlID09IE9QRU4pIHsKKwkJc2Vz c2lvbl9nZXRfZGV2aWQocyk7CisJCWhpZF9pbml0aWFsaXNlKHMpOworCX0KKwogCXJldHVy biAoMCk7CiB9CiAKZGlmZiAtdXIgYnRoaWRkL3Nlc3Npb24uYyAvdXNyL3NyYy91c3Iuc2Jp bi9ibHVldG9vdGgvYnRoaWRkL3Nlc3Npb24uYwotLS0gYnRoaWRkL3Nlc3Npb24uYwkyMDE1 LTA4LTEyIDE2OjIxOjM2LjAwMDAwMDAwMCArMDIwMAorKysgL3Vzci9zcmMvdXNyLnNiaW4v Ymx1ZXRvb3RoL2J0aGlkZC9zZXNzaW9uLmMJMjAxNS0wOS0xNCAwMTo1MDoxOS44NjI3MjY0 MTggKzAyMDAKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxibHVldG9vdGguaD4KICNp bmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2RwLmg+ CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxz dHJpbmcuaD4KQEAgLTYxLDcgKzYyLDcgQEAKIAlpZiAoKHMgPSAoYnRoaWRfc2Vzc2lvbl9w KSBtYWxsb2Moc2l6ZW9mKCpzKSkpID09IE5VTEwpCiAJCXJldHVybiAoTlVMTCk7CiAKLQlz LT5zcnYgPSBzcnY7ICAKKwlzLT5zcnYgPSBzcnY7CiAJbWVtY3B5KCZzLT5iZGFkZHIsICZk LT5iZGFkZHIsIHNpemVvZihzLT5iZGFkZHIpKTsKIAlzLT5jdHJsID0gLTE7CiAJcy0+aW50 ciA9IC0xOwpAQCAtODAsNiArODEsNyBAQAogCQlzLT52a2JkID0gLTE7CiAKIAlzLT5zdGF0 ZSA9IENMT1NFRDsKKwlzLT52ZW5kb3IgPSBzLT5wcm9kdWN0ID0gcy0+dmVyc2lvbiA9IDA7 CiAKIAlzLT5rZXlzMSA9IGJpdF9hbGxvYyhrYmRfbWF4a2V5KCkpOwogCWlmIChzLT5rZXlz MSA9PSBOVUxMKSB7CkBAIC0xMzgsNiArMTQwLDg5IEBACiB9CiAKIC8qCisgKiBHZXQgRGV2 aWNlIElEIFNlcnZpY2UgUmVjb3JkIGZvciBzZXNzaW9uCisKKyAgIEhhcmQgY29kZWQgYXR0 aWJ1dGUgSURzIHRha2VuIGZyb20gdGhlCisgICBERVZJQ0UgSURFTlRJRklDQVRJT04gUFJP RklMRSBTUEVDSUZJQ0FUSU9OIFYxMyBwLjEyCisgKi8KKworI2RlZmluZSBTRFBfREVWSUNF X0lEX1NFUlZJQ0VfQVRUUl9WRU5ET1JJRCAgMHgwMjAxCisjZGVmaW5lIFNEUF9ERVZJQ0Vf SURfU0VSVklDRV9BVFRSX1BST0RVQ1RJRCAweDAyMDIKKyNkZWZpbmUgU0RQX0RFVklDRV9J RF9TRVJWSUNFX0FUVFJfVkVSU0lPTiAgIDB4MDIwMworI2RlZmluZSBTRFBfREVWSUNFX0lE X1JBTkdFIFNEUF9BVFRSX1JBTkdFKCBcCisgU0RQX0RFVklDRV9JRF9TRVJWSUNFX0FUVFJf VkVORE9SSUQsIFNEUF9ERVZJQ0VfSURfU0VSVklDRV9BVFRSX1ZFUlNJT04gKQorCit2b2lk CitzZXNzaW9uX2dldF9kZXZpZChidGhpZF9zZXNzaW9uX3AgcykKK3sKKwlzZHBfYXR0cl90 IHZhbFszXTsKKwl1aW50OF90IGJ1ZlsxNl07CisJdWludDE2X3QgZGV2aWRfc2VydnJlY191 dWlkID0gU0RQX1NFUlZJQ0VfQ0xBU1NfUE5QX0lORk9STUFUSU9OOworCXVpbnQzMl90IGRl dmlkX3NlcnZyZWNfYXR0cl9yYW5nZSA9IFNEUF9ERVZJQ0VfSURfUkFOR0U7CisJdWludDMy X3QgdHlwZTsKKwl2b2lkICp4czsKKwl1aW50OF90ICp2OworCWludCBpOworCisJYXNzZXJ0 KHMgIT0gTlVMTCk7CisJYXNzZXJ0KHMtPnN0YXRlID09IE9QRU4pOworCisJeHMgPSBzZHBf b3BlbihOR19IQ0lfQkRBRERSX0FOWSwgJnMtPmJkYWRkcik7CisJaWYgKCF4cykKKwkJcmV0 dXJuOworCisJLyogSW5pdGlhbGlzZSByZXR1cm4gYXJyYXkgKi8KKwlmb3IgKGk9MDsgaTwz OyArK2kpIHsKKwkJdmFsW2ldLmZsYWdzID0gU0RQX0FUVFJfSU5WQUxJRDsKKwkJdmFsW2ld LmF0dHIgID0gMDsKKwkJdmFsW2ldLnZhbHVlID0gYnVmICsgaSo0OworCQl2YWxbaV0udmxl biAgPSA0OyAvKiBNYXggc2l6ZSBzaG91bGQgYmUgMyAqLworCX0KKworCS8qIEdldHRpbmcg b25seSB0aGUgZmlyc3Qgc2V0IG9mIGF0dHJpYnV0ZXMsIGFzc3VtaW5nIHRoZQorCSAgIHBy aW1hcnkgcmVjb3JkIHRvIGNvbWUgZmlyc3QuIFRPRE8uICovCisJaWYgKHNkcF9zZWFyY2go eHMsIDEsICZkZXZpZF9zZXJ2cmVjX3V1aWQsCisJCQkgICAxLCAmZGV2aWRfc2VydnJlY19h dHRyX3JhbmdlLAorCQkJICAgMywgdmFsKSAhPSAwICkgeworCQlzZHBfY2xvc2UoeHMpOwor CQlyZXR1cm47CisJfQorCisKKwkvKiBJZiBzZWFyY2ggaXMgc3VjY2Vzc2Z1bCwgc2NhbiB0 aHJvdWdoIHJldHVybiB2YWxzICovCisJZm9yIChpPTA7IGk8MzsgKytpKSB7CisJCWlmICh2 YWxbaV0uZmxhZ3MgPT0gU0RQX0FUVFJfSU5WQUxJRCApCisJCQljb250aW51ZTsKKworCQkv KiBFeHBlY3RpbmcgdGFnICsgdWludDE2X3Qgb24gYWxsIDMgYXR0cmlidXRlcyAqLworCQlp ZiAodmFsW2ldLnZsZW4gIT0gMykKKwkJCWNvbnRpbnVlOworCisJCS8qIE1ha2Ugc3VyZSwg d2UncmUgcmVhZGluZyBhIHVpbnQxNl90ICovCisJCXYgPSB2YWxbaV0udmFsdWU7CisJCVNE UF9HRVQ4KHR5cGUsIHYpOworCQlpZiAodHlwZSAhPSBTRFBfREFUQV9VSU5UMTYgKQorCQkJ Y29udGludWU7CisKKwkJc3dpdGNoICh2YWxbaV0uYXR0cikgeworCQkJY2FzZSBTRFBfREVW SUNFX0lEX1NFUlZJQ0VfQVRUUl9WRU5ET1JJRDoKKwkJCQlTRFBfR0VUMTYocy0+dmVuZG9y LCB2KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RQX0RFVklDRV9JRF9TRVJWSUNFX0FUVFJf UFJPRFVDVElEOgorCQkJCVNEUF9HRVQxNihzLT5wcm9kdWN0LCB2KTsKKwkJCQlicmVhazsK KwkJCWNhc2UgU0RQX0RFVklDRV9JRF9TRVJWSUNFX0FUVFJfVkVSU0lPTjoKKwkJCQlTRFBf R0VUMTYocy0+dmVyc2lvbiwgdik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJy ZWFrOworCQl9CisJfQorCisJc2RwX2Nsb3NlKHhzKTsKK30KKworLyoKICAqIENsb3NlIHNl c3Npb24KICAqLwogCg== --------------060602030404060108060001--