From: Keith Packard Date: Mon, 16 Aug 2021 00:08:44 +0000 (-0700) Subject: libaltos: Add new microchip MAC address to bluetooth map X-Git-Tag: 1.9.8~1^2~36^2 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=b6619833a3a581e74796b5c2ab837b52a4e9f6f3 libaltos: Add new microchip MAC address to bluetooth map The new batch of BT modules use a new MAC prefix. On Linux, also add the RFCOMM channel discovery code in case this happens again. On windows, suffer. Signed-off-by: Keith Packard --- diff --git a/libaltos/altos.dll b/libaltos/altos.dll index 3a3aca0e..8062fcb2 100755 Binary files a/libaltos/altos.dll and b/libaltos/altos.dll differ diff --git a/libaltos/altos64.dll b/libaltos/altos64.dll index c83c59e9..91ab068f 100755 Binary files a/libaltos/altos64.dll and b/libaltos/altos64.dll differ diff --git a/libaltos/libaltos_common.c b/libaltos/libaltos_common.c index fb8c314e..a2f25735 100644 --- a/libaltos/libaltos_common.c +++ b/libaltos/libaltos_common.c @@ -89,10 +89,10 @@ 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 */ + { .vendor = "04:91:62:", 6 }, /* New Microchip */ }; #define NUM_BT_VENDOR_MAP (sizeof altos_bt_vendor_map / sizeof altos_bt_vendor_map[0]) -#define BT_PORT_DEFAULT 1 static inline int ao_tolower(int c) { @@ -114,7 +114,7 @@ int altos_bt_port(struct altos_bt_device *device) { break; } } - return BT_PORT_DEFAULT; + return 0; } PUBLIC void diff --git a/libaltos/libaltos_linux.c b/libaltos/libaltos_linux.c index 255b9773..55038ff0 100644 --- a/libaltos/libaltos_linux.c +++ b/libaltos/libaltos_linux.c @@ -512,58 +512,66 @@ altos_bt_open(struct altos_bt_device *device) 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); - - range = 0x0000ffff; - attrid_list = sdp_list_append(NULL, &range); - - err = sdp_service_search_attr_req(session, search_list, - SDP_ATTR_REQ_RANGE, attrid_list, &response_list); - - if (err >= 0) { - for (r = response_list; r; r = r->next) { - sdp_record_t *rec = (sdp_record_t*) r->data; - sdp_list_t *proto_list; - sdp_list_t *access = NULL; - int proto; - - proto = sdp_uuid_to_proto(&rec->svclass); - - if (proto == SERIAL_PORT_SVCLASS_ID) { - sdp_get_access_protos(rec, &access); - if (access) { - int this_chan = sdp_get_proto_port(access, RFCOMM_UUID); - if (this_chan) - channel = this_chan; + /* Try the built-in vendor list */ + channel = altos_bt_port(device); + + /* Not present, try to discover an RFCOMM service */ + if (channel == 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); + + range = 0x0000ffff; + attrid_list = sdp_list_append(NULL, &range); + + err = sdp_service_search_attr_req(session, search_list, + SDP_ATTR_REQ_RANGE, attrid_list, &response_list); + + if (err >= 0) { + for (r = response_list; r; r = r->next) { + sdp_record_t *rec = (sdp_record_t*) r->data; + sdp_list_t *proto_list; + sdp_list_t *access = NULL; + int proto; + + proto = sdp_uuid_to_proto(&rec->svclass); + + if (proto == SERIAL_PORT_SVCLASS_ID) { + sdp_get_access_protos(rec, &access); + if (access) { + int this_chan = sdp_get_proto_port(access, RFCOMM_UUID); + if (this_chan) { + printf("found service on channel %d\n", this_chan); + channel = this_chan; + } + } } } } - } - /* Leave the session open so we don't disconnect from the device before opening - * the RFCOMM channel - */ + /* Leave the session open so we don't disconnect from the device before opening + * the RFCOMM channel + */ + } } -#endif + + /* Still nothing, try the default */ if (channel == 0) - channel = altos_bt_port(device); + channel = BT_PORT_DEFAULT; /* 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 f356eb6b..9b9b4ec4 100644 --- a/libaltos/libaltos_private.h +++ b/libaltos/libaltos_private.h @@ -25,6 +25,7 @@ #include #define BLUETOOTH_PRODUCT_TELEBT "TeleBT" +#define BT_PORT_DEFAULT 6 #define USB_BUF_SIZE 64 diff --git a/libaltos/libaltos_windows.c b/libaltos/libaltos_windows.c index 43e347c4..33eb77c7 100644 --- a/libaltos/libaltos_windows.c +++ b/libaltos/libaltos_windows.c @@ -757,6 +757,7 @@ altos_bt_open(struct altos_bt_device *device) struct altos_file_windows *file; SOCKADDR_BTH sockaddr_bth; int ret; + int channel = 0; file = calloc(1, sizeof (struct altos_file_windows)); if (!file) { @@ -775,7 +776,12 @@ 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 = altos_bt_port(device); + + channel = altos_bt_port(device); + if (channel == 0) + channel = BT_PORT_DEFAULT; + + sockaddr_bth.port = channel; ret = connect(file->socket, (SOCKADDR *) &sockaddr_bth, sizeof (sockaddr_bth));