summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libaltos/libaltos_common.c21
-rw-r--r--libaltos/libaltos_linux.c24
-rw-r--r--libaltos/libaltos_private.h3
-rw-r--r--libaltos/libaltos_windows.c2
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));