From 1594691ea88ca84634eea237ac8137a5bdc19f5c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 20 Mar 2016 21:52:53 -0700 Subject: libaltos: Add Windows BT support. Split into separate source files. Add Bluetooth support to Windows. Split libaltos into separate files. Signed-off-by: Keith Packard --- libaltos/Makefile-standalone | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'libaltos/Makefile-standalone') diff --git a/libaltos/Makefile-standalone b/libaltos/Makefile-standalone index a1f9f5bc..9a44b8e0 100644 --- a/libaltos/Makefile-standalone +++ b/libaltos/Makefile-standalone @@ -5,9 +5,11 @@ OS:=$(shell uname) # ifeq ($(OS),Linux) -JAVA_CFLAGS=-I/usr/lib/jvm/java-6-openjdk/include +OS_SRCS=libaltos_posix.c libaltos_linux.c -OS_LIB_CFLAGS=-DLINUX -DPOSIX_TTY $(JAVA_CFLAGS) +JAVA_CFLAGS=-I/usr/lib/jvm/default-java/include -I/usr/lib/jvm/default-java/include/linux + +OS_LIB_CFLAGS=-DLINUX -DPOSIX_TTY $(JAVA_CFLAGS) -shared -fPIC OS_APP_CFLAGS=$(OS_LIB_CFLAGS) @@ -22,6 +24,8 @@ endif # ifeq ($(OS),Darwin) +OS_SRCS=libaltos_posix.c libaltos_darwin.c + #OS_LIB_CFLAGS=\ # -DDARWIN -DPOSIX_TTY -arch i386 -arch x86_64 \ # --sysroot=/Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5 \ @@ -54,6 +58,8 @@ endif # ifneq (,$(findstring MINGW,$(OS))) +OS_SRCS=libaltos_windows.c + CC=gcc OS_LIB_CFLAGS = -DWINDOWS -mconsole -DBUILD_DLL @@ -103,7 +109,7 @@ CFLAGS=$(OS_LIB_CFLAGS) -O -I. LDFLAGS=$(OS_LDFLAGS) HEADERS=libaltos.h -SRCS = libaltos.c $(SWIG_WRAP) +SRCS = libaltos_common.c $(OS_SRCS) $(SWIG_WRAP) OBJS = $(SRCS:%.c=%.o) LIBS = $(DARWIN_LIBS) @@ -111,7 +117,7 @@ $(CJNITEST): cjnitest.c $(LIBNAME) $(CC) -o $@ $(OS_APP_CFLAGS) cjnitest.c $(LIBNAME) $(LIBS) $(LDFLAGS) $(LIBNAME): $(OBJS) - $(CC) -shared $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(LDFLAGS) + $(CC) -shared -fPIC $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(LDFLAGS) clean: rm -f $(CLASSFILES) $(OBJS) $(LIBNAME) $(CJNITEST) cjnitest.o -- cgit v1.2.3 From 565d8f22c23c7c6c6817d11ef1ca02e70ba5d2ae Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Wed, 20 Apr 2016 20:27:47 -0400 Subject: libaltos: Fix for Mac OS X El Capitan USB enumeration for serial devices changed Signed-off-by: Keith Packard --- libaltos/Makefile-standalone | 6 ++-- libaltos/libaltos.dylib | Bin 41596 -> 46228 bytes libaltos/libaltos_darwin.c | 82 +++++++++++++++++++++++++++++++++++++------ 3 files changed, 75 insertions(+), 13 deletions(-) (limited to 'libaltos/Makefile-standalone') diff --git a/libaltos/Makefile-standalone b/libaltos/Makefile-standalone index 9a44b8e0..1430aacb 100644 --- a/libaltos/Makefile-standalone +++ b/libaltos/Makefile-standalone @@ -33,8 +33,8 @@ OS_SRCS=libaltos_posix.c libaltos_darwin.c # -iwithsysroot /System/Library/Frameworks/IOKit.framework/Headers \ # -iwithsysroot /System/Library/Frameworks/CoreFoundation.framework/Headers -XCODE=/Applications/Xcode.app -SDK=$(XCODE)/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk +XCODE=/Applications/Xcode-beta.app +SDK=$(XCODE)/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk MINVERSION=10.5 OS_LIB_CFLAGS=\ @@ -43,7 +43,7 @@ OS_LIB_CFLAGS=\ -iwithsysroot /System/Library/Frameworks/JavaVM.framework/Headers \ -iwithsysroot /System/Library/Frameworks/IOKit.framework/Headers \ -iwithsysroot /System/Library/Frameworks/CoreFoundation.framework/Headers -OS_APP_CFLAGS=$(OS_LIB_CFLAGS) +OS_APP_CFLAGS=$(OS_LIB_CFLAGS) -O0 -g OS_LDFLAGS =\ -framework IOKit -framework CoreFoundation diff --git a/libaltos/libaltos.dylib b/libaltos/libaltos.dylib index 8b491c58..c18493ea 100755 Binary files a/libaltos/libaltos.dylib and b/libaltos/libaltos.dylib differ diff --git a/libaltos/libaltos_darwin.c b/libaltos/libaltos_darwin.c index bf3cf094..04194d9a 100644 --- a/libaltos/libaltos_darwin.c +++ b/libaltos/libaltos_darwin.c @@ -20,6 +20,9 @@ #include #include +#include +#include +#include #include #include #include @@ -45,11 +48,23 @@ struct altos_list { int ftdi; }; +static char * +get_cfstring(CFTypeRef string, char result[512]) +{ + Boolean got_string; + + got_string = CFStringGetCString(string, result, 512, kCFStringEncodingASCII); + if (!got_string) + strcpy(result, "CFStringGetCString failed"); + return result; +} + static int get_string(io_object_t object, CFStringRef entry, char *result, int result_len) { CFTypeRef entry_as_string; Boolean got_string; + char entry_string[512]; entry_as_string = IORegistryEntrySearchCFProperty (object, kIOServicePlane, @@ -62,8 +77,9 @@ get_string(io_object_t object, CFStringRef entry, char *result, int result_len) kCFStringEncodingASCII); CFRelease(entry_as_string); - if (got_string) + if (got_string) { return 1; + } } return 0; } @@ -73,6 +89,7 @@ get_number(io_object_t object, CFStringRef entry, int *result) { CFTypeRef entry_as_number; Boolean got_number; + char entry_string[512]; entry_as_number = IORegistryEntrySearchCFProperty (object, kIOServicePlane, @@ -83,8 +100,9 @@ get_number(io_object_t object, CFStringRef entry, int *result) got_number = CFNumberGetValue(entry_as_number, kCFNumberIntType, result); - if (got_number) + if (got_number) { return 1; + } } return 0; } @@ -93,12 +111,19 @@ PUBLIC struct altos_list * altos_list_start(void) { struct altos_list *list = calloc (sizeof (struct altos_list), 1); - CFMutableDictionaryRef matching_dictionary = IOServiceMatching("IOUSBDevice"); + CFMutableDictionaryRef matching_dictionary; io_iterator_t tdIterator; io_object_t tdObject; kern_return_t ret; int i; + matching_dictionary = IOServiceMatching(kIOSerialBSDServiceValue); + if (matching_dictionary) { + CFDictionarySetValue(matching_dictionary, + CFSTR(kIOSerialBSDTypeKey), + CFSTR(kIOSerialBSDAllTypes)); + } + ret = IOServiceGetMatchingServices(kIOMasterPortDefault, matching_dictionary, &list->iterator); if (ret != kIOReturnSuccess) { free(list); @@ -118,26 +143,63 @@ altos_ftdi_list_start(void) return list; } +static io_service_t get_usb_object(io_object_t serial_device) +{ + io_iterator_t iterator; + io_service_t usb_device; + io_service_t service; + IOReturn status; + + status = IORegistryEntryCreateIterator(serial_device, + kIOServicePlane, + kIORegistryIterateParents | kIORegistryIterateRecursively, + &iterator); + + if (status != kIOReturnSuccess) + return 0; + + while((service = IOIteratorNext(iterator))) { + io_name_t servicename; + status = IORegistryEntryGetNameInPlane(service, kIOServicePlane, servicename); + + if (status == kIOReturnSuccess && IOObjectConformsTo(service, kIOUSBDeviceClassName)) { + IOObjectRelease(iterator); + return service; + } + IOObjectRelease(service); + } + IOObjectRelease(iterator); + return 0; +} + PUBLIC int altos_list_next(struct altos_list *list, struct altos_device *device) { + io_object_t object; + io_service_t usb_device; char serial_string[128]; for (;;) { object = IOIteratorNext(list->iterator); - if (!object) + if (!object) { return 0; + } + + usb_device = get_usb_object(object); - if (!get_number (object, CFSTR(kUSBVendorID), &device->vendor) || - !get_number (object, CFSTR(kUSBProductID), &device->product)) - continue; - if (get_string (object, CFSTR("IOCalloutDevice"), device->path, sizeof (device->path)) && - get_string (object, CFSTR("USB Product Name"), device->name, sizeof (device->name)) && - get_string (object, CFSTR("USB Serial Number"), serial_string, sizeof (serial_string))) { + if (get_number (usb_device, CFSTR(kUSBVendorID), &device->vendor) && + get_number (usb_device, CFSTR(kUSBProductID), &device->product) && + get_string (object, CFSTR(kIOCalloutDeviceKey), device->path, sizeof (device->path)) && + get_string (usb_device, CFSTR(kUSBProductString), device->name, sizeof (device->name)) && + get_string (usb_device, CFSTR(kUSBSerialNumberString), serial_string, sizeof (serial_string))) { device->serial = atoi(serial_string); + IOObjectRelease(object); + IOObjectRelease(usb_device); return 1; } + IOObjectRelease(object); + IOObjectRelease(usb_device); } } -- cgit v1.2.3