diff options
| -rw-r--r-- | libaltos/libaltos_common.c | 21 | ||||
| -rw-r--r-- | libaltos/libaltos_linux.c | 24 | ||||
| -rw-r--r-- | libaltos/libaltos_private.h | 3 | ||||
| -rw-r--r-- | 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)); | 
