From 2536640b852feff41975d2da50befdda91ee6303 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 13 May 2017 15:24:20 -0700 Subject: [PATCH] libaltos: Add support for TeleBT-v4.0 bluetooth channel change The RN4678 in TeleBT v4.0 uses channel 6 instead of channel 1. There is code in the linux bits which discovers this value, but that crashes when run under java for unknown reasons. Signed-off-by: Keith Packard --- libaltos/libaltos_common.c | 21 +++++++++++++++++++++ libaltos/libaltos_linux.c | 24 ++++++++++++++---------- libaltos/libaltos_private.h | 3 +++ libaltos/libaltos_windows.c | 2 +- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/libaltos/libaltos_common.c b/libaltos/libaltos_common.c index dfafcc7a..f577de02 100644 --- a/libaltos/libaltos_common.c +++ b/libaltos/libaltos_common.c @@ -75,6 +75,27 @@ altos_putchar(struct altos_file *file, char c) return ret; } +struct bt_vendor_map { + char vendor[10]; + int port; +}; + +static const struct bt_vendor_map altos_bt_vendor_map[] = { + { .vendor = "00:12:6f:", 1 }, /* Rayson */ + { .vendor = "8C:DE:52:", 6 }, /* ISSC */ + { .vendor = "D8:80:39:", 6 }, /* Microchip */ +}; + +#define NUM_BT_VENDOR_MAP (sizeof altos_bt_vendor_map / sizeof altos_bt_vendor_map[0]) +#define BT_PORT_DEFAULT 1 + +int altos_bt_port(struct altos_bt_device *device) { + unsigned i; + for (i = 0; i < NUM_BT_VENDOR_MAP; i++) + if (strncmp (device->addr, altos_bt_vendor_map[i].vendor, strlen(altos_bt_vendor_map[i].vendor)) == 0) + return altos_bt_vendor_map[i].port; + return BT_PORT_DEFAULT; +} PUBLIC void altos_free(struct altos_file *file) diff --git a/libaltos/libaltos_linux.c b/libaltos/libaltos_linux.c index b187bb19..255b9773 100644 --- a/libaltos/libaltos_linux.c +++ b/libaltos/libaltos_linux.c @@ -501,32 +501,33 @@ altos_bt_fill_in(char *name, char *addr, struct altos_bt_device *device) struct altos_file * altos_bt_open(struct altos_bt_device *device) { - static const uint8_t svc_uuid_int[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0x11, 0x01 - }; - uuid_t svc_uuid; struct sockaddr_rc addr = { 0 }; int status, i; struct altos_file_posix *file; sdp_session_t *session = NULL; - sdp_list_t *search_list, *attrid_list; - sdp_list_t *response_list = NULL, *r; - uint32_t range; - int err; - int channel = 1; + int channel = 0; if (str2ba(device->addr, &addr.rc_bdaddr) < 0) { altos_set_last_posix_error(); goto no_file; } +#if 0 /* * Search for the RFCOMM service to get the right channel */ session = sdp_connect(BDADDR_ANY, &addr.rc_bdaddr, SDP_RETRY_IF_BUSY); if (session) { + static const uint8_t svc_uuid_int[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x11, 0x01 + }; + int err; + uuid_t svc_uuid; + uint32_t range; + sdp_list_t *search_list, *attrid_list; + sdp_list_t *response_list = NULL, *r; sdp_uuid16_create(&svc_uuid, PUBLIC_BROWSE_GROUP); search_list = sdp_list_append(NULL, &svc_uuid); @@ -560,6 +561,9 @@ altos_bt_open(struct altos_bt_device *device) * the RFCOMM channel */ } +#endif + if (channel == 0) + channel = altos_bt_port(device); /* Connect to the channel */ file = calloc(1, sizeof (struct altos_file_posix)); diff --git a/libaltos/libaltos_private.h b/libaltos/libaltos_private.h index f8e5231b..ee3dd708 100644 --- a/libaltos/libaltos_private.h +++ b/libaltos/libaltos_private.h @@ -61,4 +61,7 @@ altos_flush(struct altos_file *file); int altos_fill(struct altos_file *file, int timeout); +int +altos_bt_port(struct altos_bt_device *device); + #endif /* _LIBALTOS_PRIVATE_H_ */ diff --git a/libaltos/libaltos_windows.c b/libaltos/libaltos_windows.c index e53aa72b..4f9f1807 100644 --- a/libaltos/libaltos_windows.c +++ b/libaltos/libaltos_windows.c @@ -747,7 +747,7 @@ altos_bt_open(struct altos_bt_device *device) memset(&sockaddr_bth, '\0', sizeof (sockaddr_bth)); sockaddr_bth.addressFamily = AF_BTH; sockaddr_bth.btAddr = str2ba(device->addr); - sockaddr_bth.port = 1; + sockaddr_bth.port = altos_bt_port(device); ret = connect(file->socket, (SOCKADDR *) &sockaddr_bth, sizeof (sockaddr_bth)); -- 2.30.2