From: Alex K. <ak...@se...> - 2005-02-10 22:10:21
|
Hello, here's the patch that adds support for USB transport layer via libusb to openobex library. The patch for the obex_test application is in the next message. Specification for these USB OBEX interfaces is available at http://www.usb.org/developers/devclass_docs Devices which support this are typically post-2003 mobile phones with a USB interface. The list of contributors to the specification includes Ericsson, Motorola, NEC, Nokia, NTT DoCoMo and others. The only devices which are known to work so far are my Nokia 7610 and 6630 phones, and of course I'd like to hear from you about other gadgets. Please note that many phones which claim to be obex-compatible don't actually have a proper OBEX interface: you switch their ACM modems to OBEX mode instead with a special AT command. For Nokia phones the rule of thumb is this: if it comes with a DKU-2 cable, it has a proper OBEX interface, and should work with this patch. If it comes with a DKU-5 or any other cable, then it's using some other method and isn't compatible. The compatibility chart is here: http://www.nokia.com/nokia/0,,54698,00.html#apps I have also added support for USB to obexftp library and application, but that's coming later; it works, but it's not ready for others to see yet. To use this, you first run "obex_test -u" to get a list of USB OBEX interfaces on your system. Then "obex_test -u interface_number" to connect to one of them. So I'd like to get your comments on the patch, and of course ultimately have it included into openobex. -- Alexander Homepage: http://www.sensi.org/~ak/ diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/ChangeLog openobex-1.0.1-usb/ChangeLog --- openobex-1.0.1/ChangeLog 2003-10-01 14:17:13.000000000 +0300 +++ openobex-1.0.1-usb/ChangeLog 2005-02-10 01:23:17.000000000 +0200 @@ -1,3 +1,7 @@ +2005-02-10 Alex Kanavin <ak...@se...> + + * Support for USB transport layer and USB interface discovery + 2003-10-01 Marcel Holtmann <ma...@ho...> * Add COPYING.LIB for LGPL stuff diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/acinclude.m4 openobex-1.0.1-usb/acinclude.m4 --- openobex-1.0.1/acinclude.m4 2003-10-01 14:17:13.000000000 +0300 +++ openobex-1.0.1-usb/acinclude.m4 2005-02-07 00:33:26.000000000 +0200 @@ -54,3 +54,31 @@ AC_DEFUN([BLUETOOTH_CHECK], [ BLUETOOTH_HOOK([],failure) ]) + + +dnl +dnl USB_HOOK (script-if-usb-found, failflag) +dnl +dnl if failflag is "failure" it aborts if obex is not found. +dnl + +AC_DEFUN([USB_HOOK],[ + AC_CACHE_CHECK([for USB support],am_cv_usb_found,[ + + AC_TRY_COMPILE([#include <usb.h>], + [struct usb_dev_handle *dev;], + am_cv_usb_found=yes, + am_cv_usb_found=no)]) + + if test $am_cv_usb_found = yes; then + AC_DEFINE(HAVE_USB,1,[Define if system supports USB]) + USB_LIBS="-lusb" + fi + AC_SUBST(USB_LIBS) + ]) + +]) + +AC_DEFUN([USB_CHECK], [ + USB_HOOK([],failure) +]) diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/configure.in openobex-1.0.1-usb/configure.in --- openobex-1.0.1/configure.in 2003-10-01 14:17:13.000000000 +0300 +++ openobex-1.0.1-usb/configure.in 2005-01-24 01:49:11.000000000 +0200 @@ -39,6 +39,7 @@ IRDA_CHECK BLUETOOTH_CHECK +USB_CHECK dnl Configure debug facilities AC_ARG_WITH(debug,[ --with-debug=level Debug level], diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/Makefile.am openobex-1.0.1-usb/src/Makefile.am --- openobex-1.0.1/src/Makefile.am 2003-10-01 14:17:13.000000000 +0300 +++ openobex-1.0.1-usb/src/Makefile.am 2005-02-07 00:24:20.000000000 +0200 @@ -22,7 +22,8 @@ inobex.c inobex.h \ btobex.c btobex.h \ netbuf.c netbuf.h \ - irda.h irda_wrap.h + irda.h irda_wrap.h \ + usbobex.c usbobex.h usb_wrap.h libopenobex_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ @@ -32,4 +33,6 @@ INCLUDES = -I$(top_srcdir)/src +libopenobex_la_LIBADD = @USB_LIBS@ + EXTRA_DIST = obex.sym obex.def makefile.msc win32compat.c windeps.dep Binary files openobex-1.0.1/src/btobex.o and openobex-1.0.1-usb/src/btobex.o differ Binary files openobex-1.0.1/src/inobex.o and openobex-1.0.1-usb/src/inobex.o differ Binary files openobex-1.0.1/src/irobex.o and openobex-1.0.1-usb/src/irobex.o differ Binary files openobex-1.0.1/src/netbuf.o and openobex-1.0.1-usb/src/netbuf.o differ diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/obex.c openobex-1.0.1-usb/src/obex.c --- openobex-1.0.1/src/obex.c 2003-10-01 14:17:13.000000000 +0300 +++ openobex-1.0.1-usb/src/obex.c 2005-02-10 01:29:18.000000000 +0200 @@ -50,11 +50,15 @@ #include "obex_object.h" #include "obex_connect.h" #include "obex_client.h" +#include "obex_const.h" #include "inobex.h" #ifdef HAVE_IRDA #include "irobex.h" #endif +#ifdef HAVE_USB +#include "usbobex.h" +#endif #ifdef HAVE_BLUETOOTH #include "btobex.h" #else @@ -69,6 +73,7 @@ * %OBEX_TRANS_INET : Use regular TCP/IP socket * %OBEX_TRANS_CUSTOM : Use user provided transport * %OBEX_TRANS_BLUETOOTH: Use regular Bluetooth RFCOMM socket (need the BlueZ stack) + * %OBEX_TRANS_USB: Use USB transport (libusb needed) * If you use %OBEX_TRANS_CUSTOM you must register your own * transport with OBEX_RegisterCTransport() * @eventcb: Function pointer to your event callback. @@ -121,25 +126,39 @@ /* Init transport */ self->trans.type = transport; self->trans.connected = FALSE; + + self->usb_interfaces = NULL; + if ( transport == OBEX_TRANS_USB ) { +#ifdef HAVE_USB + self->usb_interfaces = usbobex_find_interfaces(); +#endif + } + + + /* Safe values. + * Both self->mtu_rx and self->mtu_tx_max can be increased by app + * self->mtu_tx will be whatever the other end sneds us - Jean II */ + if ( transport == OBEX_TRANS_USB ) { + self->mtu_rx = OBEX_DEFAULT_MTU_USB; + self->mtu_tx = OBEX_MINIMUM_MTU; + self->mtu_tx_max = OBEX_DEFAULT_MTU_USB; + } else { + self->mtu_rx = OBEX_DEFAULT_MTU; + self->mtu_tx = OBEX_MINIMUM_MTU; + self->mtu_tx_max = OBEX_DEFAULT_MTU; + } /* Allocate message buffers */ /* It's safe to allocate them smaller than OBEX_MAXIMUM_MTU * because netbuf will realloc data as needed. - Jean II */ - self->rx_msg = g_netbuf_new(OBEX_DEFAULT_MTU); + self->rx_msg = g_netbuf_new(self->mtu_rx); if (self->rx_msg == NULL) goto out_err; - self->tx_msg = g_netbuf_new(OBEX_DEFAULT_MTU); + self->tx_msg = g_netbuf_new(self->mtu_tx_max); if (self->tx_msg == NULL) goto out_err; - /* Safe values. - * Both self->mtu_rx and self->mtu_tx_max can be increased by app - * self->mtu_tx will be whatever the other end sneds us - Jean II */ - self->mtu_rx = OBEX_DEFAULT_MTU; - self->mtu_tx = OBEX_MINIMUM_MTU; - self->mtu_tx_max = OBEX_DEFAULT_MTU; - #ifndef _WIN32 /* Ignore SIGPIPE. Otherwise send() will raise it and the app will quit */ signal(SIGPIPE, SIG_IGN); @@ -182,16 +201,26 @@ */ void OBEX_Cleanup(obex_t *self) { + struct usb_obex_intf* next; + obex_return_if_fail(self != NULL); obex_transport_disconnect_request(self); obex_transport_disconnect_server(self); - + if (self->tx_msg) g_netbuf_free(self->tx_msg); if (self->rx_msg) g_netbuf_free(self->rx_msg); + + if ( self->trans.type == OBEX_TRANS_USB ) { + while (self->usb_interfaces != NULL) { + next = self->usb_interfaces->next; + free(self->usb_interfaces); + self->usb_interfaces = next; + } + } free(self); } @@ -1050,3 +1079,44 @@ return obex_transport_connect_request(self); } +/** + * UsbOBEX_TransportConnect - Connect USB transport + * @self: OBEX handle + * @interface: USB interface to connect to + * + * An easier connect function to use for USB (USB OBEX) only. + */ +int UsbOBEX_TransportConnect(obex_t *self, struct usb_obex_intf* interface) +{ + DEBUG(4, "\n"); + + if (self->object) { + DEBUG(1, "We are busy.\n"); + return -EBUSY; + } + + obex_return_val_if_fail(self != NULL, -1); + obex_return_val_if_fail(interface != NULL, -1); + obex_return_val_if_fail(interface->device != NULL, -1); + +#ifdef HAVE_USB + usbobex_prepare_connect(self, interface); + return obex_transport_connect_request(self); +#else + return -ESOCKTNOSUPPORT; +#endif /* HAVE_USB */ +} + +/** + * UsbOBEX_GetInterfaces - Get a list of USB OBEX interfaces on the system + * @self: OBEX handle + * @interfaces: A list of USB OBEX interfaces + * + * Gets a list of USB OBEX interfaces, or NULL if there are none. + */ +struct usb_obex_intf* UsbOBEX_GetInterfaces(obex_t *self) +{ + DEBUG(4, "\n"); + + return self->usb_interfaces; +} diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/obex.def openobex-1.0.1-usb/src/obex.def --- openobex-1.0.1/src/obex.def 2003-10-01 14:17:13.000000000 +0300 +++ openobex-1.0.1-usb/src/obex.def 2005-02-07 01:05:06.000000000 +0200 @@ -10,6 +10,7 @@ OBEX_GetFD OBEX_HandleInput OBEX_ServerRegister +OBEX_ServerAccept OBEX_Request OBEX_CancelRequest OBEX_SetUserData @@ -34,3 +35,5 @@ BtOBEX_ServerRegister BtOBEX_TransportConnect FdOBEX_TransportSetup +UsbOBEX_TransportConnect +UsbOBEX_GetInterfaces \ No newline at end of file diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/obex.h openobex-1.0.1-usb/src/obex.h --- openobex-1.0.1/src/obex.h 2003-10-01 14:17:13.000000000 +0300 +++ openobex-1.0.1-usb/src/obex.h 2005-02-06 23:01:19.000000000 +0200 @@ -134,4 +134,10 @@ */ int FdOBEX_TransportSetup(obex_t *self, int rfd, int wfd, int mtu); +/* + * OBEX USB API + */ + struct usb_obex_intf* UsbOBEX_GetInterfaces(obex_t *self); + int UsbOBEX_TransportConnect(obex_t *self, struct usb_obex_intf* interface); + #endif Binary files openobex-1.0.1/src/obex.o and openobex-1.0.1-usb/src/obex.o differ diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/obex.sym openobex-1.0.1-usb/src/obex.sym --- openobex-1.0.1/src/obex.sym 2003-10-01 14:17:13.000000000 +0300 +++ openobex-1.0.1-usb/src/obex.sym 2005-02-07 01:05:37.000000000 +0200 @@ -9,6 +9,7 @@ OBEX_GetFD OBEX_HandleInput OBEX_ServerRegister +OBEX_ServerAccept OBEX_Request OBEX_CancelRequest OBEX_SetUserData @@ -33,3 +34,5 @@ BtOBEX_ServerRegister BtOBEX_TransportConnect FdOBEX_TransportSetup +UsbOBEX_TransportConnect +UsbOBEX_GetInterfaces \ No newline at end of file Binary files openobex-1.0.1/src/obex_client.o and openobex-1.0.1-usb/src/obex_client.o differ Binary files openobex-1.0.1/src/obex_connect.o and openobex-1.0.1-usb/src/obex_connect.o differ diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/obex_const.h openobex-1.0.1-usb/src/obex_const.h --- openobex-1.0.1/src/obex_const.h 2003-10-01 14:17:13.000000000 +0300 +++ openobex-1.0.1-usb/src/obex_const.h 2005-02-10 01:50:15.000000000 +0200 @@ -47,6 +47,31 @@ void * customdata; } obex_ctrans_t; +struct usb_obex_intf; + +/* Structure that contains information about a USB OBEX interface + * present on the system */ +struct usb_obex_intf { + struct usb_obex_intf *prev, *next; /* Next and previous interfaces in the list */ + struct usb_device *device; /* USB device that has the interface */ + int configuration; /* Device configuration */ + int control_interface; /* OBEX master interface */ + int control_interface_description; /* OBEX master interface string descriptor number + * If non-zero, use usb_get_string_simple() from + * libusb to retrieve human-readable description + */ + int control_setting; /* OBEX master interface setting */ + int data_interface; /* OBEX data/slave interface */ + int data_idle_setting; /* OBEX data/slave idle setting */ + int data_interface_idle_description; /* OBEX data/slave interface string descriptor number + * in idle setting */ + int data_active_setting; /* OBEX data/slave active setting */ + int data_interface_active_description; /* OBEX data/slave interface string descriptor number + * in active setting */ + int data_endpoint_read; /* OBEX data/slave interface read endpoint */ + int data_endpoint_write; /* OBEX data/slave interface write endpoint */ +}; + #define OBEX_CLIENT 0 #define OBEX_SERVER 1 @@ -81,6 +106,7 @@ #define OBEX_TRANS_CUSTOM 3 #define OBEX_TRANS_BLUETOOTH 4 #define OBEX_TRANS_FD 5 +#define OBEX_TRANS_USB 6 /* Standard headers */ #define OBEX_HDR_COUNT 0xc0 /* Number of objects (used by connect) */ @@ -133,6 +159,7 @@ #define OBEX_DEFAULT_MTU 1024 #define OBEX_MINIMUM_MTU 255 #define OBEX_MAXIMUM_MTU 32768 +#define OBEX_DEFAULT_MTU_USB 0xffff /* In theory max MTU is (64k-1), but that's quite big. */ /* Optimum MTU for various transport (optimum for throughput). Binary files openobex-1.0.1/src/obex_header.o and openobex-1.0.1-usb/src/obex_header.o differ diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/obex_main.h openobex-1.0.1-usb/src/obex_main.h --- openobex-1.0.1/src/obex_main.h 2003-10-01 14:17:13.000000000 +0300 +++ openobex-1.0.1-usb/src/obex_main.h 2005-02-06 23:07:52.000000000 +0200 @@ -139,6 +139,9 @@ obex_transport_t trans; /* Transport being used */ obex_ctrans_t ctrans; + + struct usb_obex_intf* usb_interfaces; /* Used by USB OBEX transport*/ + void * userdata; /* For user */ }; Binary files openobex-1.0.1/src/obex_main.o and openobex-1.0.1-usb/src/obex_main.o differ Binary files openobex-1.0.1/src/obex_object.o and openobex-1.0.1-usb/src/obex_object.o differ Binary files openobex-1.0.1/src/obex_server.o and openobex-1.0.1-usb/src/obex_server.o differ diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/obex_transport.c openobex-1.0.1-usb/src/obex_transport.c --- openobex-1.0.1/src/obex_transport.c 2003-10-01 14:17:13.000000000 +0300 +++ openobex-1.0.1-usb/src/obex_transport.c 2005-02-01 20:27:08.000000000 +0200 @@ -43,6 +43,9 @@ #ifdef HAVE_BLUETOOTH #include "btobex.h" #endif /*HAVE_BLUETOOTH*/ +#ifdef HAVE_USB +#include "usbobex.h" +#endif /*HAVE_USB*/ #include "obex_transport.h" @@ -64,6 +67,9 @@ ret = -1; } } + else if (self->trans.type == OBEX_TRANS_USB) { + ret = obex_data_indication(self, NULL, 0); + } else { struct timeval time; fd_set fdset; @@ -205,7 +211,11 @@ if (self->fd >= 0 && self->writefd >= 0) ret = 0; break; - +#ifdef HAVE_USB + case OBEX_TRANS_USB: + ret = usbobex_connect_request(self); + break; +#endif /*HAVE_USB*/ default: DEBUG(4, "Transport not implemented!\n"); break; @@ -250,6 +260,11 @@ /* no real disconnect on a file */ self->fd = self->writefd = -1; break; +#ifdef HAVE_USB + case OBEX_TRANS_USB: + usbobex_disconnect_request(self); + break; +#endif /*HAVE_USB*/ default: DEBUG(4, "Transport not implemented!\n"); break; @@ -289,7 +304,8 @@ break; #endif /*HAVE_BLUETOOTH*/ case OBEX_TRANS_FD: - /* no real listen on the file */ + case OBEX_TRANS_USB: + /* no real listen on the file or USB */ ret = 0; break; default: @@ -330,7 +346,8 @@ break; #endif /*HAVE_BLUETOOTH*/ case OBEX_TRANS_FD: - /* no real server on a file */; + case OBEX_TRANS_USB: + /* no real server on a file or USB */; break; default: DEBUG(4, "Transport not implemented!\n"); @@ -389,6 +406,16 @@ case OBEX_TRANS_FD: actual = do_write(self->writefd, msg, self->trans.mtu); break; +#ifdef HAVE_USB + case OBEX_TRANS_USB: + if ( self->trans.connected != TRUE ) + break; + DEBUG(4, "Endpoint %d\n", self->trans.self.usb.interface->data_endpoint_write); + actual = usb_bulk_write(self->trans.self.usb.dev_data, \ + self->trans.self.usb.interface->data_endpoint_write, \ + msg->data, msg->len, 10*1000); + break; +#endif /*HAVE_USB*/ case OBEX_TRANS_CUSTOM: DEBUG(4, "Custom write\n"); if(self->ctrans.write) @@ -427,6 +454,16 @@ case OBEX_TRANS_FD: actual = read(self->fd, msg->tail, max); break; +#ifdef HAVE_USB + case OBEX_TRANS_USB: + if ( self->trans.connected != TRUE ) + break; + DEBUG(4, "Endpoint %d\n", self->trans.self.usb.interface->data_endpoint_read); + actual = usb_bulk_read(self->trans.self.usb.dev_data, \ + self->trans.self.usb.interface->data_endpoint_read, \ + msg->tail, self->mtu_rx, 10*1000); + break; +#endif /*HAVE_USB*/ case OBEX_TRANS_CUSTOM: if(buflen > max) { memcpy(msg->tail, buf, max); diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/obex_transport.h openobex-1.0.1-usb/src/obex_transport.h --- openobex-1.0.1/src/obex_transport.h 2003-10-01 14:17:13.000000000 +0300 +++ openobex-1.0.1-usb/src/obex_transport.h 2005-01-24 03:22:50.000000000 +0200 @@ -43,6 +43,9 @@ #include <bluetooth/bluetooth.h> #include <bluetooth/rfcomm.h> #endif /*HAVE_BLUETOOTH*/ +#ifdef HAVE_USB +#include "usb_wrap.h" +#endif /*HAVE_USB*/ #include "obex_main.h" @@ -54,6 +57,9 @@ #ifdef HAVE_BLUETOOTH struct sockaddr_rc rfcomm; #endif /*HAVE_BLUETOOTH*/ +#ifdef HAVE_USB + struct addr_usb usb; +#endif /*HAVE_USB*/ } saddr_t; typedef struct obex_transport { @@ -76,7 +82,7 @@ int obex_transport_read(obex_t *self, int count, uint8_t *buf, int buflen); -#endif OBEX_TRANSPORT_H +#endif //OBEX_TRANSPORT_H Binary files openobex-1.0.1/src/obex_transport.o and openobex-1.0.1-usb/src/obex_transport.o differ diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/usb_wrap.h openobex-1.0.1-usb/src/usb_wrap.h --- openobex-1.0.1/src/usb_wrap.h 1970-01-01 02:00:00.000000000 +0200 +++ openobex-1.0.1-usb/src/usb_wrap.h 2005-01-24 03:46:38.000000000 +0200 @@ -0,0 +1,12 @@ +#ifndef USB_WRAP_H +#define USB_WRAP_H + +#include <usb.h> + +struct addr_usb { + struct usb_obex_intf* interface; + usb_dev_handle* dev_control; + usb_dev_handle* dev_data; +}; + +#endif /* USB_WRAP_H */ diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/usbobex.c openobex-1.0.1-usb/src/usbobex.c --- openobex-1.0.1/src/usbobex.c 1970-01-01 02:00:00.000000000 +0200 +++ openobex-1.0.1-usb/src/usbobex.c 2005-02-10 02:07:03.000000000 +0200 @@ -0,0 +1,320 @@ +/*************************************<******************************** + * + * Filename: usbobex.c + * Version: 0.1 + * Description: USB OBEX, USB transport for OBEX + * Status: Experimental. + * Author: Alex Kanavin <ak...@se...> + * + * Copyright (c) 2005 Alex Kanavin, All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef HAVE_USB + +/* Linux case */ + +#include <string.h> +#include <unistd.h> +#include <stdio.h> /* perror */ +#include <errno.h> /* errno and EADDRNOTAVAIL */ +#include <netinet/in.h> +#include <sys/socket.h> + +#include <usb.h> + +#include <obex_main.h> +#include <usbobex.h> + + +/* + * Function usbobex_prepare_connect (self, interface) + * + * Prepare for USB OBEX connect + * + */ +void usbobex_prepare_connect(obex_t *self, struct usb_obex_intf *intf) +{ +#ifndef _WIN32 + self->trans.self.usb.interface = intf; +#endif /* _WIN32 */ +} + +/* + * Function usbobex_find_interfaces () + * + * Find available USBOBEX interfaces on the system + */ +struct usb_obex_intf* usbobex_find_interfaces() +{ + struct usb_bus *busses; + struct usb_obex_intf *current, *next; + current = NULL; next = NULL; + + usb_init(); + usb_find_busses(); + usb_find_devices(); + + busses = usb_get_busses(); + + struct usb_bus *bus; + int c, i, a; + + for (bus = busses; bus; bus = bus->next) { + struct usb_device *dev; + + for (dev = bus->devices; dev; dev = dev->next) { + /* Loop through all of the configurations */ + for (c = 0; c < dev->descriptor.bNumConfigurations; c++) { + /* Loop through all of the interfaces */ + for (i = 0; i < dev->config[c].bNumInterfaces; i++) { + /* Loop through all of the alternate settings */ + for (a = 0; a < dev->config[c].interface[i].num_altsetting; a++) { + /* Check if this interface is OBEX */ + if ((dev->config[c].interface[i].altsetting[a].bInterfaceClass == USB_CDC_CLASS) + && (dev->config[c].interface[i].altsetting[a].bInterfaceSubClass == USB_CDC_OBEX_SUBCLASS)) { + /* Find the data interface */ + + unsigned char *buffer = dev->config[c].interface[i].altsetting[a].extra; + int buflen = dev->config[c].interface[i].altsetting[a].extralen; + + next = malloc(sizeof(struct usb_obex_intf)); + if (next == NULL) + continue; + next->device = dev; + next->configuration = dev->config[c].bConfigurationValue; + next->control_interface = dev->config[c].interface[i].altsetting[a].bInterfaceNumber; + next->control_interface_description = dev->config[c].interface[i].altsetting[a].iInterface; + next->control_setting = dev->config[c].interface[i].altsetting[a].bAlternateSetting; + + int err = find_obex_data_interface(buffer, buflen, dev->config[c], next); + if (err) + free(next); + else { + if (current) + current->next = next; + next->prev = current; + next->next = NULL; + current = next; + } + } + } + } + } + } + } + while (current && current->prev) + current = current->prev; + return current; +} + +/* + * Helper function to usbobex_find_interfaces + */ +int find_obex_data_interface(unsigned char* buffer, int buflen, struct usb_config_descriptor config, struct usb_obex_intf* intf) +{ + struct cdc_union_desc* union_header = NULL; + + if (!buffer) { + DEBUG(2,"Weird descriptor references"); + return -EINVAL; + } + while (buflen > 0) { + if (buffer [1] != USB_DT_CS_INTERFACE) { + DEBUG(2,"skipping garbage"); + goto next_desc; + } + switch (buffer [2]) { + case CDC_UNION_TYPE: /* we've found it */ + if (union_header) { + DEBUG(2,"More than one union descriptor, skiping ..."); + goto next_desc; + } + union_header = (struct cdc_union_desc *)buffer; + break; + case CDC_OBEX_TYPE: /* maybe check version */ + case CDC_HEADER_TYPE: + break; /* for now we ignore it */ + default: + DEBUG(2, "Ignoring extra header, type %d, length %d", buffer[2], buffer[0]); + break; + } +next_desc: + buflen -= buffer[0]; + buffer += buffer[0]; + } + if (!union_header) { + DEBUG(2,"No union descriptor, giving up\n"); + return -ENODEV; + } + /* Found the slave interface, now find active/idle settings and endpoints */ + intf->data_interface = union_header->bSlaveInterface0; + int c, i, a; + struct usb_endpoint_descriptor *ep0, *ep1; + int found_active = 0; + int found_idle = 0; + struct usb_bus* bus; + + /* Loop through all of the interfaces */ + for (i = 0; i < config.bNumInterfaces; i++) { + /* Loop through all of the alternate settings */ + for (a = 0; a < config.interface[i].num_altsetting; a++) { + /* Check if this interface is OBEX data interface*/ + if (config.interface[i].altsetting[a].bInterfaceNumber == intf->data_interface) { + if (config.interface[i].altsetting[a].bNumEndpoints == 2) { + ep0 = config.interface[i].altsetting[a].endpoint; + ep1 = config.interface[i].altsetting[a].endpoint + 1; + if ((ep0->bEndpointAddress & USB_ENDPOINT_IN) && ((ep0->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK) && !(ep1->bEndpointAddress & USB_ENDPOINT_IN) && ((ep1->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK)) { + found_active = 1; + intf->data_active_setting = config.interface[i].altsetting[a].bAlternateSetting; + intf->data_interface_active_description = config.interface[i].altsetting[a].iInterface; + intf->data_endpoint_read = ep0->bEndpointAddress; + intf->data_endpoint_write = ep1->bEndpointAddress; + } + if (!(ep0->bEndpointAddress & USB_ENDPOINT_IN) &&((ep0->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK) && (ep1->bEndpointAddress & USB_ENDPOINT_IN) &&((ep1->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK)) { + found_active = 1; + intf->data_active_setting = config.interface[i].altsetting[a].bAlternateSetting; + intf->data_interface_active_description = config.interface[i].altsetting[a].iInterface; + intf->data_endpoint_read = ep1->bEndpointAddress; + intf->data_endpoint_write = ep0->bEndpointAddress; + } + } + if (config.interface[i].altsetting[a].bNumEndpoints == 0) { + found_idle = 1; + intf->data_idle_setting = config.interface[i].altsetting[a].bAlternateSetting; + intf->data_interface_idle_description = config.interface[i].altsetting[a].iInterface; + } + } + } + } + + if (!found_idle) { + DEBUG(2,"No idle setting\n"); + return -ENODEV; + } + if (!found_active) { + DEBUG(2,"No active setting\n"); + return -ENODEV; + } + + return 0; +} + +/* + * Function usbobex_connect_request (self) + * + * Open the USB connection + * + */ +int usbobex_connect_request(obex_t *self) +{ + int ret; +#ifndef _WIN32 + int mtu = 0; + //int len = sizeof(int); + + DEBUG(4, "\n"); + + self->trans.self.usb.dev_control = usb_open(self->trans.self.usb.interface->device); + self->trans.self.usb.dev_data = usb_open(self->trans.self.usb.interface->device); + + ret = usb_claim_interface(self->trans.self.usb.dev_control, self->trans.self.usb.interface->control_interface); + if(ret < 0) { + DEBUG(4, "Can't claim control interface %d", ret); + return ret; + } + + ret = usb_claim_interface(self->trans.self.usb.dev_data, self->trans.self.usb.interface->data_interface); + if(ret < 0) { + DEBUG(4, "Can't claim data interface %d", ret); + usb_release_interface(self->trans.self.usb.dev_control, self->trans.self.usb.interface->control_interface); + return ret; + } + + ret = usb_set_configuration(self->trans.self.usb.dev_control, self->trans.self.usb.interface->configuration); + if(ret < 0) { + DEBUG(4, "Can't set configuration %d", ret); + goto err; + } + + ret = usb_set_altinterface(self->trans.self.usb.dev_control, self->trans.self.usb.interface->control_setting); + if(ret < 0) { + DEBUG(4, "Can't set control setting %d", ret); + goto err; + } + + ret = usb_set_altinterface(self->trans.self.usb.dev_data, self->trans.self.usb.interface->data_active_setting); + if(ret < 0) { + DEBUG(4, "Can't set data active setting %d", ret); + goto err; + } + + mtu = OBEX_DEFAULT_MTU_USB; + self->trans.mtu = mtu; + + DEBUG(2, "transport mtu=%d\n", mtu); + + return 1; + +err: + usb_release_interface(self->trans.self.usb.dev_data, self->trans.self.usb.interface->data_interface); + usb_release_interface(self->trans.self.usb.dev_control, self->trans.self.usb.interface->control_interface); + return ret; + +#endif /* _WIN32 */ +} + +/* + * Function usbobex_link_disconnect_request (self) + * + * Shutdown the USB link + * + */ +int usbobex_disconnect_request(obex_t *self) +{ + int ret; +#ifndef _WIN32 + DEBUG(4, "\n"); + if (!self->trans.self.usb.interface) + return 0; + ret = usb_set_altinterface(self->trans.self.usb.dev_data, self->trans.self.usb.interface->data_idle_setting);; + if(ret < 0) + DEBUG(4, "Can't set data idle setting %d", ret); + ret = usb_release_interface(self->trans.self.usb.dev_data, self->trans.self.usb.interface->data_interface); + if(ret < 0) + DEBUG(4, "Can't release data interface %d", ret); + ret = usb_release_interface(self->trans.self.usb.dev_control, self->trans.self.usb.interface->control_interface); + if(ret < 0) + DEBUG(4, "Can't release control interface %d", ret); + ret = usb_close(self->trans.self.usb.dev_data); + if(ret < 0) + DEBUG(4, "Can't close data interface %d", ret); + ret = usb_close(self->trans.self.usb.dev_control); + if(ret < 0) + DEBUG(4, "Can't close control interface %d", ret); + +#endif /* _WIN32 */ + return ret; +} + + +#endif /* HAVE_BLUETOOTH */ diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/usbobex.h openobex-1.0.1-usb/src/usbobex.h --- openobex-1.0.1/src/usbobex.h 1970-01-01 02:00:00.000000000 +0200 +++ openobex-1.0.1-usb/src/usbobex.h 2005-02-10 01:55:54.000000000 +0200 @@ -0,0 +1,66 @@ +/********************************************************************* + * + * Filename: usbobex.h + * Version: + * Description: + * Status: Experimental. + * Author: Alex Kanavin <ak...@se...> + * + * Copyright (c) 2005 Alex Kanavin, All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ********************************************************************/ + +#ifndef USBOBEX_H +#define USBOBEX_H + +#include "obex_const.h" + +/* "Union Functional Descriptor" from CDC spec 5.2.3.X + * used to find data/slave OBEX interface */ +struct cdc_union_desc { + u_int8_t bLength; + u_int8_t bDescriptorType; + u_int8_t bDescriptorSubType; + + u_int8_t bMasterInterface0; + u_int8_t bSlaveInterface0; +} __attribute__ ((packed)); + +/* CDC class and subclass types */ +#define USB_CDC_CLASS 0x02 +#define USB_CDC_OBEX_SUBCLASS 0x0b + +/* class and subclass specific descriptor types */ +#define CDC_HEADER_TYPE 0x00 +#define CDC_CALL_MANAGEMENT_TYPE 0x01 +#define CDC_AC_MANAGEMENT_TYPE 0x02 +#define CDC_UNION_TYPE 0x06 +#define CDC_COUNTRY_TYPE 0x07 +#define CDC_OBEX_TYPE 0x15 + +/* Interface descriptor */ +#define USB_DT_CS_INTERFACE 0x24 +#define CDC_DATA_INTERFACE_TYPE 0x0a + + +void usbobex_prepare_connect(obex_t *self, struct usb_obex_intf* intf); +int usbobex_connect_request(obex_t *self); +int usbobex_disconnect_request(obex_t *self); +struct usb_obex_intf* usbobex_find_interfaces(); +int find_obex_data_interface(unsigned char* buffer, int buflen, struct usb_config_descriptor config, struct usb_obex_intf* intf); +#endif Binary files openobex-1.0.1/src/usbobex.o and openobex-1.0.1-usb/src/usbobex.o differ |
From: Alex K. <ak...@se...> - 2005-02-10 22:13:35
|
Here's the supplementary patch for openobex-apps. -- Alexander Homepage: http://www.sensi.org/~ak/ diff -uNr -x INSTALL -x Makefile -x Makefile.in -x aclocal.m4 -x autom4te.cache -x config.cache -x config.h -x 'config.h*' -x config.log -x config.status -x configure -x depcomp -x install-sh -x missing -x mkinstalldirs -x '*.Po' openobex-apps-1.0.0/ChangeLog openobex-apps-1.0.0-usb/ChangeLog --- openobex-apps-1.0.0/ChangeLog 2002-12-01 19:34:41.000000000 +0200 +++ openobex-apps-1.0.0-usb/ChangeLog 2005-02-10 22:02:37.869328597 +0200 @@ -1,3 +1,7 @@ +2005-07-02 Alex Kanavin <ak...@se...> + + * Add client-side USB support and interface discovery + 2002-11-15 Marcel Holtmann <ma...@ho...> * Add Bluetooth server support diff -uNr -x INSTALL -x Makefile -x Makefile.in -x aclocal.m4 -x autom4te.cache -x config.cache -x config.h -x 'config.h*' -x config.log -x config.status -x configure -x depcomp -x install-sh -x missing -x mkinstalldirs -x '*.Po' openobex-apps-1.0.0/acinclude.m4 openobex-apps-1.0.0-usb/acinclude.m4 --- openobex-apps-1.0.0/acinclude.m4 2002-12-01 19:34:41.000000000 +0200 +++ openobex-apps-1.0.0-usb/acinclude.m4 2005-01-25 01:34:27.000000000 +0200 @@ -27,3 +27,30 @@ AC_SUBST(BLUETOOTH_LIBS) AC_MSG_RESULT($am_cv_bluetooth_found) ]) + +dnl +dnl Check for USB library +dnl + +AC_DEFUN([USB_CHECK],[ + AC_MSG_CHECKING(for USB support) + + AC_TRY_COMPILE( [ #include <usb.h> + ],[ + struct usb_dev_handle *dev; + ], + am_cv_usb_found=yes, + am_cv_usb_found=no + ) + + if test $am_cv_usb_found = yes; then + AC_DEFINE(HAVE_USB,1,[Define if system supports USB]) + + USB_CFLAGS="" + USB_LIBS="-lusb" + fi + + AC_SUBST(USB_CFLAGS) + AC_SUBST(USB_LIBS) + AC_MSG_RESULT($am_cv_usb_found) +]) diff -uNr -x INSTALL -x Makefile -x Makefile.in -x aclocal.m4 -x autom4te.cache -x config.cache -x config.h -x 'config.h*' -x config.log -x config.status -x configure -x depcomp -x install-sh -x missing -x mkinstalldirs -x '*.Po' openobex-apps-1.0.0/configure.in openobex-apps-1.0.0-usb/configure.in --- openobex-apps-1.0.0/configure.in 2002-12-01 19:34:41.000000000 +0200 +++ openobex-apps-1.0.0-usb/configure.in 2005-01-25 01:35:58.000000000 +0200 @@ -18,5 +18,6 @@ AM_PATH_OPENOBEX(1.0.0) BLUETOOTH_CHECK +USB_CHECK AC_OUTPUT([Makefile src/Makefile]) diff -uNr -x INSTALL -x Makefile -x Makefile.in -x aclocal.m4 -x autom4te.cache -x config.cache -x config.h -x 'config.h*' -x config.log -x config.status -x configure -x depcomp -x install-sh -x missing -x mkinstalldirs -x '*.Po' openobex-apps-1.0.0/src/Makefile.am openobex-apps-1.0.0-usb/src/Makefile.am --- openobex-apps-1.0.0/src/Makefile.am 2002-12-01 19:34:41.000000000 +0200 +++ openobex-apps-1.0.0-usb/src/Makefile.am 2005-01-25 01:35:35.000000000 +0200 @@ -17,7 +17,7 @@ obex_test_server.c obex_test_server.h \ obex_test_cable.c obex_test_cable.h -obex_test_LDADD = @OPENOBEX_LIBS@ @BLUETOOTH_LIBS@ libmisc.a +obex_test_LDADD = @OPENOBEX_LIBS@ @BLUETOOTH_LIBS@ @USB_LIBS@ libmisc.a obex_tcp_SOURCES = obex_tcp.c @@ -28,6 +28,6 @@ LDADD = @OPENOBEX_LIBS@ libmisc.a -INCLUDES = @OPENOBEX_CFLAGS@ @BLUETOOTH_CFLAGS@ +INCLUDES = @OPENOBEX_CFLAGS@ @BLUETOOTH_CFLAGS@ @USB_CFLAGS@ EXTRA_DIST = makefile.msc Binary files openobex-apps-1.0.0/src/irobex_palm3 and openobex-apps-1.0.0-usb/src/irobex_palm3 differ Binary files openobex-apps-1.0.0/src/irobex_palm3.o and openobex-apps-1.0.0-usb/src/irobex_palm3.o differ Binary files openobex-apps-1.0.0/src/irxfer and openobex-apps-1.0.0-usb/src/irxfer differ Binary files openobex-apps-1.0.0/src/irxfer.o and openobex-apps-1.0.0-usb/src/irxfer.o differ Binary files openobex-apps-1.0.0/src/libmisc.a and openobex-apps-1.0.0-usb/src/libmisc.a differ Binary files openobex-apps-1.0.0/src/obex_io.o and openobex-apps-1.0.0-usb/src/obex_io.o differ Binary files openobex-apps-1.0.0/src/obex_put_common.o and openobex-apps-1.0.0-usb/src/obex_put_common.o differ Binary files openobex-apps-1.0.0/src/obex_tcp and openobex-apps-1.0.0-usb/src/obex_tcp differ Binary files openobex-apps-1.0.0/src/obex_tcp.o and openobex-apps-1.0.0-usb/src/obex_tcp.o differ Binary files openobex-apps-1.0.0/src/obex_test and openobex-apps-1.0.0-usb/src/obex_test differ diff -uNr -x INSTALL -x Makefile -x Makefile.in -x aclocal.m4 -x autom4te.cache -x config.cache -x config.h -x 'config.h*' -x config.log -x config.status -x configure -x depcomp -x install-sh -x missing -x mkinstalldirs -x '*.Po' openobex-apps-1.0.0/src/obex_test.c openobex-apps-1.0.0-usb/src/obex_test.c --- openobex-apps-1.0.0/src/obex_test.c 2002-12-01 19:34:41.000000000 +0200 +++ openobex-apps-1.0.0-usb/src/obex_test.c 2005-02-07 00:40:07.000000000 +0200 @@ -47,6 +47,10 @@ #include <bluetooth/rfcomm.h> #endif +#ifdef HAVE_USB +#include <usb.h> +#endif + #include <openobex/obex.h> #include "obex_test.h" @@ -155,13 +159,18 @@ { char cmd[10]; int end = 0; - int cobex = FALSE, tcpobex = FALSE, btobex = FALSE, r320 = FALSE; + int cobex = FALSE, tcpobex = FALSE, btobex = FALSE, r320 = FALSE, usbobex = FALSE; obex_t *handle; #ifdef HAVE_BLUETOOTH bdaddr_t bdaddr; uint8_t channel; #endif +#ifdef HAVE_USB + struct usb_obex_intf* usb_intf; + struct usb_obex_intf* interfaces; +#endif + struct context global_context = {0,}; #ifndef _WIN32 @@ -181,7 +190,8 @@ tcpobex = TRUE; if( (argc >= 2) && (strcmp(argv[1], "-b") == 0 ) ) btobex = TRUE; - + if( (argc >= 2) && (strcmp(argv[1], "-u") == 0 ) ) + usbobex = TRUE; if(cobex) { #ifndef _WIN32 @@ -262,6 +272,60 @@ printf("Not implemented in Win32 yet.\n"); #endif // _WIN32 } + else if(usbobex) { + switch (argc) { +#ifdef HAVE_USB + case 2: + printf("Using USB transport, querying available interfaces\n"); + if(! (handle = OBEX_Init(OBEX_TRANS_USB, obex_event, 0))) { + perror( "OBEX_Init failed"); + exit(0); + } + struct usb_dev_handle* usb_handle; + char manufacturer[256] = "\0"; + char product[256] = "\0"; + char interface_desc[256] = "\0"; + int i = 0; int len; + + interfaces = UsbOBEX_GetInterfaces(handle); + while (interfaces != NULL) { + usb_handle = usb_open(interfaces->device); + len = usb_get_string_simple(usb_handle, interfaces->device->descriptor.iManufacturer, manufacturer, 256); + len = usb_get_string_simple(usb_handle, interfaces->device->descriptor.iProduct, product ,256); + len = usb_get_string_simple(usb_handle, interfaces->control_interface_description, interface_desc, 256); + usb_close(usb_handle); + printf("Interface %d: %s %s %s\n", i, manufacturer, product, interface_desc); + interfaces = interfaces->next; i++; + } + printf("Use '%s -u interface_number' to run interactive OBEX test client\n", argv[0]); + OBEX_Cleanup(handle); + exit(0); + break; + case 3: + printf("Using USB transport \n"); + int interface = atoi(argv[2]); + if(! (handle = OBEX_Init(OBEX_TRANS_USB, obex_event, 0))) { + perror( "OBEX_Init failed"); + exit(0); + } + + interfaces = UsbOBEX_GetInterfaces(handle); + while (interfaces != NULL && interface > 0) { + interfaces = interfaces->next; interface--; + } + if (interfaces == NULL) { + printf( "Invalid interface number\n"); + exit(0); + } + usb_intf = interfaces; + + break; +#endif + default: + printf("Wrong number of arguments\n"); + exit(0); + } + } else { printf("Using IrDA transport\n"); if(! (handle = OBEX_Init(OBEX_TRANS_IRDA, obex_event, 0))) { @@ -321,6 +385,16 @@ printf("Transport not found! (Bluetooth)\n"); #endif } + if (usbobex) { +#ifdef HAVE_USB + if (UsbOBEX_TransportConnect(handle, usb_intf) < 0) { + printf("Transport connect error! (USB)\n"); + break; + } +#else + printf("Transport not found! (USB)\n"); +#endif + } else { if(IrOBEX_TransportConnect(handle, IR_SERVICE) < 0) { printf("Transport connect error! (IrDA)\n"); Binary files openobex-apps-1.0.0/src/obex_test.o and openobex-apps-1.0.0-usb/src/obex_test.o differ Binary files openobex-apps-1.0.0/src/obex_test_cable.o and openobex-apps-1.0.0-usb/src/obex_test_cable.o differ diff -uNr -x INSTALL -x Makefile -x Makefile.in -x aclocal.m4 -x autom4te.cache -x config.cache -x config.h -x 'config.h*' -x config.log -x config.status -x configure -x depcomp -x install-sh -x missing -x mkinstalldirs -x '*.Po' openobex-apps-1.0.0/src/obex_test_client.c openobex-apps-1.0.0-usb/src/obex_test_client.c --- openobex-apps-1.0.0/src/obex_test_client.c 2002-12-01 19:34:41.000000000 +0200 +++ openobex-apps-1.0.0-usb/src/obex_test_client.c 2005-02-02 00:40:48.000000000 +0200 @@ -256,7 +256,7 @@ free(buf); free(uname); - free(bfname); +// free(bfname); OBEX_Request(handle, object); syncwait(handle); |
From: David B. <da...@pa...> - 2005-02-10 22:28:19
|
On Thursday 10 February 2005 2:10 pm, Alex Kanavin wrote: > Specification for these USB OBEX interfaces is available at > http://www.usb.org/developers/devclass_docs Specifically inside http://www.usb.org/developers/devclass_docs/cdc_wmc10.zip which doesn't have OBEX in the title or anywhere near its description on that webpage ... ;) |
From: Marcel H. <ma...@ho...> - 2005-02-11 00:03:47
|
Hi Alex, > here's the patch that adds support for USB transport layer via libusb to > openobex library. The patch for the obex_test application is in the next > message. Specification for these USB OBEX interfaces is available at > http://www.usb.org/developers/devclass_docs > > Devices which support this are typically post-2003 mobile phones with a > USB interface. The list of contributors to the specification includes > Ericsson, Motorola, NEC, Nokia, NTT DoCoMo and others. The only devices > which are known to work so far are my Nokia 7610 and 6630 phones, and of > course I'd like to hear from you about other gadgets. > > Please note that many phones which claim to be obex-compatible don't > actually have a proper OBEX interface: you switch their ACM modems to OBEX > mode instead with a special AT command. For Nokia phones the rule of thumb > is this: if it comes with a DKU-2 cable, it has a proper OBEX interface, > and should work with this patch. If it comes with a DKU-5 or any other > cable, then it's using some other method and isn't compatible. The > compatibility chart is here: > http://www.nokia.com/nokia/0,,54698,00.html#apps > > I have also added support for USB to obexftp library and application, but > that's coming later; it works, but it's not ready for others to see yet. > > To use this, you first run "obex_test -u" to get a list of USB OBEX > interfaces on your system. Then "obex_test -u interface_number" to connect > to one of them. > > So I'd like to get your comments on the patch, and of course ultimately > have it included into openobex. thanks for the patch, but I am not sure when I will find the time to review it completly. However some comments and please don't diff any object files. > diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/obex.c openobex-1.0.1-usb/src/obex.c > --- openobex-1.0.1/src/obex.c 2003-10-01 14:17:13.000000000 +0300 > +++ openobex-1.0.1-usb/src/obex.c 2005-02-10 01:29:18.000000000 +0200 > @@ -50,11 +50,15 @@ > #include "obex_object.h" > #include "obex_connect.h" > #include "obex_client.h" > +#include "obex_const.h" why is this now needed? > @@ -121,25 +126,39 @@ > /* Init transport */ > self->trans.type = transport; > self->trans.connected = FALSE; > + > + self->usb_interfaces = NULL; > + if ( transport == OBEX_TRANS_USB ) { check your coding style. It should be "if (transport == ..) {". There are more of them. Fix them all. > +#ifdef HAVE_USB > + self->usb_interfaces = usbobex_find_interfaces(); > +#endif Doing #else self->usb_interfaces = NULL; #endif is better then double assignment. However I still don't understand why self->usb_interfaces is needed. > + /* Safe values. > + * Both self->mtu_rx and self->mtu_tx_max can be increased by app > + * self->mtu_tx will be whatever the other end sneds us - Jean II */ Against what version do you diff. You are not Jean. Do the diff against the CVS version and if you wanna change basic OpenOBEX send in a extra patch for it. > @@ -182,16 +201,26 @@ > */ > void OBEX_Cleanup(obex_t *self) > { > + struct usb_obex_intf* next; > + > obex_return_if_fail(self != NULL); > > obex_transport_disconnect_request(self); > obex_transport_disconnect_server(self); > - > + > if (self->tx_msg) > g_netbuf_free(self->tx_msg); > > if (self->rx_msg) > g_netbuf_free(self->rx_msg); > + > + if ( self->trans.type == OBEX_TRANS_USB ) { > + while (self->usb_interfaces != NULL) { > + next = self->usb_interfaces->next; > + free(self->usb_interfaces); > + self->usb_interfaces = next; > + } > + } And again. I need a reason for it. This is generic code and I don't see any need to touch it. Even if it is needed, if USB support is not compiled in there should be no code path for it. > + > + obex_return_val_if_fail(self != NULL, -1); > + obex_return_val_if_fail(interface != NULL, -1); > + obex_return_val_if_fail(interface->device != NULL, -1); The coding style must be wrong. We use tabs. > diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/obex.def openobex-1.0.1-usb/src/obex.def > --- openobex-1.0.1/src/obex.def 2003-10-01 14:17:13.000000000 +0300 > +++ openobex-1.0.1-usb/src/obex.def 2005-02-07 01:05:06.000000000 +0200 > @@ -10,6 +10,7 @@ > OBEX_GetFD > OBEX_HandleInput > OBEX_ServerRegister > +OBEX_ServerAccept > OBEX_Request > OBEX_CancelRequest > OBEX_SetUserData This is not part of the USB patch. Send a separate one to fix it. > @@ -9,6 +9,7 @@ > OBEX_GetFD > OBEX_HandleInput > OBEX_ServerRegister > +OBEX_ServerAccept > OBEX_Request > OBEX_CancelRequest > OBEX_SetUserData See above. > diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/obex_const.h openobex-1.0.1-usb/src/obex_const.h > --- openobex-1.0.1/src/obex_const.h 2003-10-01 14:17:13.000000000 +0300 > +++ openobex-1.0.1-usb/src/obex_const.h 2005-02-10 01:50:15.000000000 +0200 > @@ -47,6 +47,31 @@ > void * customdata; > } obex_ctrans_t; > > +struct usb_obex_intf; > + > +/* Structure that contains information about a USB OBEX interface > + * present on the system */ > +struct usb_obex_intf { > + struct usb_obex_intf *prev, *next; /* Next and previous interfaces in the list */ > + struct usb_device *device; /* USB device that has the interface */ > + int configuration; /* Device configuration */ > + int control_interface; /* OBEX master interface */ > + int control_interface_description; /* OBEX master interface string descriptor number > + * If non-zero, use usb_get_string_simple() from > + * libusb to retrieve human-readable description > + */ > + int control_setting; /* OBEX master interface setting */ > + int data_interface; /* OBEX data/slave interface */ > + int data_idle_setting; /* OBEX data/slave idle setting */ > + int data_interface_idle_description; /* OBEX data/slave interface string descriptor number > + * in idle setting */ > + int data_active_setting; /* OBEX data/slave active setting */ > + int data_interface_active_description; /* OBEX data/slave interface string descriptor number > + * in active setting */ > + int data_endpoint_read; /* OBEX data/slave interface read endpoint */ > + int data_endpoint_write; /* OBEX data/slave interface write endpoint */ > +}; > + This can't be part of the public interface. Hide it inside the USB specific transport layer. What happens when the library is compiled without USB support? > @@ -133,6 +159,7 @@ > #define OBEX_DEFAULT_MTU 1024 > #define OBEX_MINIMUM_MTU 255 > #define OBEX_MAXIMUM_MTU 32768 > +#define OBEX_DEFAULT_MTU_USB 0xffff Why? > diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/obex_main.h openobex-1.0.1-usb/src/obex_main.h > --- openobex-1.0.1/src/obex_main.h 2003-10-01 14:17:13.000000000 +0300 > +++ openobex-1.0.1-usb/src/obex_main.h 2005-02-06 23:07:52.000000000 +0200 > @@ -139,6 +139,9 @@ > > obex_transport_t trans; /* Transport being used */ > obex_ctrans_t ctrans; > + > + struct usb_obex_intf* usb_interfaces; /* Used by USB OBEX transport*/ > + > void * userdata; /* For user */ > }; Explain why this is needed? > default: > DEBUG(4, "Transport not implemented!\n"); > @@ -389,6 +406,16 @@ > case OBEX_TRANS_FD: > actual = do_write(self->writefd, msg, self->trans.mtu); > break; > +#ifdef HAVE_USB > + case OBEX_TRANS_USB: > + if ( self->trans.connected != TRUE ) > + break; > + DEBUG(4, "Endpoint %d\n", self->trans.self.usb.interface->data_endpoint_write); > + actual = usb_bulk_write(self->trans.self.usb.dev_data, \ > + self->trans.self.usb.interface->data_endpoint_write, \ > + msg->data, msg->len, 10*1000); For what do you need the "\"? > +#ifdef HAVE_USB > + case OBEX_TRANS_USB: > + if ( self->trans.connected != TRUE ) > + break; > + DEBUG(4, "Endpoint %d\n", self->trans.self.usb.interface->data_endpoint_read); > + actual = usb_bulk_read(self->trans.self.usb.dev_data, \ > + self->trans.self.usb.interface->data_endpoint_read, \ > + msg->tail, self->mtu_rx, 10*1000); > + break; See above. > +#ifdef HAVE_USB > +#include "usb_wrap.h" > +#endif /*HAVE_USB*/ And what is "usb_wrap.h"? > @@ -76,7 +82,7 @@ > int obex_transport_read(obex_t *self, int count, uint8_t *buf, int buflen); > > > -#endif OBEX_TRANSPORT_H > +#endif //OBEX_TRANSPORT_H Again, against what version do you diff? If this is a core bug, then in a patch for it. > Binary files openobex-1.0.1/src/obex_transport.o and openobex-1.0.1-usb/src/obex_transport.o differ > diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x config.h -x config.h.in -x config.log -x config.status -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x stamp-h1 openobex-1.0.1/src/usb_wrap.h openobex-1.0.1-usb/src/usb_wrap.h > --- openobex-1.0.1/src/usb_wrap.h 1970-01-01 02:00:00.000000000 +0200 > +++ openobex-1.0.1-usb/src/usb_wrap.h 2005-01-24 03:46:38.000000000 +0200 > @@ -0,0 +1,12 @@ > +#ifndef USB_WRAP_H > +#define USB_WRAP_H > + > +#include <usb.h> > + > +struct addr_usb { > + struct usb_obex_intf* interface; > + usb_dev_handle* dev_control; > + usb_dev_handle* dev_data; > +}; > + > +#endif /* USB_WRAP_H */ Ah, this is "usb_wrap.h" and why do you need it? > +struct usb_obex_intf* usbobex_find_interfaces() > +{ > + struct usb_bus *busses; > + struct usb_obex_intf *current, *next; > + current = NULL; next = NULL; > + > + usb_init(); > + usb_find_busses(); > + usb_find_devices(); > + > + busses = usb_get_busses(); > + > + struct usb_bus *bus; > + int c, i, a; May you wanna try a GCC 2.95 with this part of code. Do it right. We declare variables at the top of a function or a the top of a block. > + for (bus = busses; bus; bus = bus->next) { > + struct usb_device *dev; > + > + for (dev = bus->devices; dev; dev = dev->next) { > + /* Loop through all of the configurations */ > + for (c = 0; c < dev->descriptor.bNumConfigurations; c++) { > + /* Loop through all of the interfaces */ > + for (i = 0; i < dev->config[c].bNumInterfaces; i++) { > + /* Loop through all of the alternate settings */ > + for (a = 0; a < dev->config[c].interface[i].num_altsetting; a++) { > + /* Check if this interface is OBEX */ > + if ((dev->config[c].interface[i].altsetting[a].bInterfaceClass == USB_CDC_CLASS) > + && (dev->config[c].interface[i].altsetting[a].bInterfaceSubClass == USB_CDC_OBEX_SUBCLASS)) { > + /* Find the data interface */ > + > + unsigned char *buffer = dev->config[c].interface[i].altsetting[a].extra; > + int buflen = dev->config[c].interface[i].altsetting[a].extralen; > + > + next = malloc(sizeof(struct usb_obex_intf)); > + if (next == NULL) > + continue; > + next->device = dev; > + next->configuration = dev->config[c].bConfigurationValue; > + next->control_interface = dev->config[c].interface[i].altsetting[a].bInterfaceNumber; > + next->control_interface_description = dev->config[c].interface[i].altsetting[a].iInterface; > + next->control_setting = dev->config[c].interface[i].altsetting[a].bAlternateSetting; > + > + int err = find_obex_data_interface(buffer, buflen, dev->config[c], next); > + if (err) > + free(next); > + else { > + if (current) > + current->next = next; > + next->prev = current; > + next->next = NULL; > + current = next; > + } > + } > + } > + } > + } > + } > + } Come on. Break this up into smaller part. Nobody can read or understand it. You reached the end of a 80 width terminal. > + switch (buffer [2]) { Coding style mistake. This must be "switch (buffer[2]) {". Follow it. > + /* Found the slave interface, now find active/idle settings and endpoints */ > + intf->data_interface = union_header->bSlaveInterface0; > + int c, i, a; Test this with a GCC 2.95. See point above. > + struct usb_endpoint_descriptor *ep0, *ep1; > + int found_active = 0; > + int found_idle = 0; > + struct usb_bus* bus; > + > + /* Loop through all of the interfaces */ > + for (i = 0; i < config.bNumInterfaces; i++) { > + /* Loop through all of the alternate settings */ > + for (a = 0; a < config.interface[i].num_altsetting; a++) { > + /* Check if this interface is OBEX data interface*/ > + if (config.interface[i].altsetting[a].bInterfaceNumber == intf->data_interface) { > + if (config.interface[i].altsetting[a].bNumEndpoints == 2) { > + ep0 = config.interface[i].altsetting[a].endpoint; > + ep1 = config.interface[i].altsetting[a].endpoint + 1; > + if ((ep0->bEndpointAddress & USB_ENDPOINT_IN) && ((ep0->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK) && !(ep1->bEndpointAddress & USB_ENDPOINT_IN) && ((ep1->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK)) { > + found_active = 1; > + intf->data_active_setting = config.interface[i].altsetting[a].bAlternateSetting; > + intf->data_interface_active_description = config.interface[i].altsetting[a].iInterface; > + intf->data_endpoint_read = ep0->bEndpointAddress; > + intf->data_endpoint_write = ep1->bEndpointAddress; > + } > + if (!(ep0->bEndpointAddress & USB_ENDPOINT_IN) &&((ep0->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK) && (ep1->bEndpointAddress & USB_ENDPOINT_IN) &&((ep1->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK)) { > + found_active = 1; > + intf->data_active_setting = config.interface[i].altsetting[a].bAlternateSetting; > + intf->data_interface_active_description = config.interface[i].altsetting[a].iInterface; > + intf->data_endpoint_read = ep1->bEndpointAddress; > + intf->data_endpoint_write = ep0->bEndpointAddress; > + } > + } > + if (config.interface[i].altsetting[a].bNumEndpoints == 0) { > + found_idle = 1; > + intf->data_idle_setting = config.interface[i].altsetting[a].bAlternateSetting; > + intf->data_interface_idle_description = config.interface[i].altsetting[a].iInterface; > + } > + } > + } > + } Break this loop up. It is too nested. > + if(ret < 0) { Coding style mistake. This should be "if (ret < 0) {". Fix them all. > + > + ret = usb_set_configuration(self->trans.self.usb.dev_control, self->trans.self.usb.interface->configuration); > + if(ret < 0) { This is a tab versus spaces problem. Fix all of them. > +/* class and subclass specific descriptor types */ > +#define CDC_HEADER_TYPE 0x00 > +#define CDC_CALL_MANAGEMENT_TYPE 0x01 > +#define CDC_AC_MANAGEMENT_TYPE 0x02 > +#define CDC_UNION_TYPE 0x06 > +#define CDC_COUNTRY_TYPE 0x07 > +#define CDC_OBEX_TYPE 0x15 > + > +/* Interface descriptor */ > +#define USB_DT_CS_INTERFACE 0x24 > +#define CDC_DATA_INTERFACE_TYPE 0x0a Looks like tab versus spaces again. > Binary files openobex-1.0.1/src/usbobex.o and openobex-1.0.1-usb/src/usbobex.o differ You better exclude *.o files from the diff ;) This was the first look through your code. You should really make sure that everything is still working when USB support is not compiled in. I think it is a good idea to break your patch up a little bit. One patch that adds usbobex.[ch] and the other one for the needed changes in the main files. Regards Marcel |
From: Christian Z. <za...@tr...> - 2005-02-11 01:17:52
|
Hi, Marcel Holtmann wrote: > >>@@ -76,7 +82,7 @@ >> int obex_transport_read(obex_t *self, int count, uint8_t *buf, int buflen); >> >> >>-#endif OBEX_TRANSPORT_H >>+#endif //OBEX_TRANSPORT_H >> >> > >Again, against what version do you diff? If this is a core bug, then in >a patch for it. > > That was a nasty bug indeed. It was the only line which didn't read #endif /* ... */ and that breaks some preprocessors/compilers. I fixed that nearly a year ago though. cu, Christian |
From: Alex K. <ak...@se...> - 2005-02-11 13:45:45
|
On Fri, 11 Feb 2005, Christian Zuckschwerdt wrote: > >>-#endif OBEX_TRANSPORT_H > >>+#endif //OBEX_TRANSPORT_H > >Again, against what version do you diff? If this is a core bug, then in > >a patch for it. > That was a nasty bug indeed. It was the only line which didn't read > #endif /* ... */ and that breaks some preprocessors/compilers. I fixed > that nearly a year ago though. Yeah, my bad. I diff-ed against 1.0.1, and there were some fixes in cvs after that, including this one. -- Alexander Homepage: http://www.sensi.org/~ak/ |
From: Alex K. <ak...@se...> - 2005-02-11 15:54:39
|
On Fri, 11 Feb 2005, Marcel Holtmann wrote: > thanks for the patch, but I am not sure when I will find the time to > review it completly. However some comments and please don't diff any > object files. Thanks for the comments. There's plenty of questions about the architecture changes so I'll try to answer some of them here. 1. Why is there a whole new structure for usb obex interfaces in a public header file? In order to connect to a specific USB OBEX interface with libusb, you need plenty of data: usb device structure pointer, configuration value, control and data interface numbers and interface setting numbers for each, endpoints and so on. It made perfect sense to me to unite all of this in a structure and make applications pass a pointer to that structure in the connect function: int UsbOBEX_TransportConnect(obex_t *self, struct usb_obex_intf* interface) There's also an interface discovery function which returns a list of those interfaces, so that applications wouldn't have to do the discovery themselves - it's not a trivial thing at all: struct usb_obex_intf* UsbOBEX_GetInterfaces(obex_t *self) An example of how this all works from an application's point of view is provided in obex_test patch. 2. Why is "struct usb_obex_intf* usb_interfaces;" added to obex_t? Because I couldn't find any better place to store a list of discovered USB OBEX interfaces than obex_t. There's no way to hide it inside usb specific transport functions as far as I can see. 3. Why is usb_wrap.h present? Agreed. I'll get rid of it. 4. Why +#define OBEX_DEFAULT_MTU_USB 0xffff? Because USB is fast, and it makes sense to set the MTU to the maximum and then lower it if the phone says so in its CONNECT response - openobex does this automatically. Nokia 6630 returns 0xffff MTU, 7610 suggests 4000 bytes MTU (and won't work with anything less, btw), and it's all totally transparent to the application. Pretty much everything else you suggested I agree with, and will fix. -- Alexander Homepage: http://www.sensi.org/~ak/ |
From: Alex K. <ak...@se...> - 2005-03-02 15:24:23
|
On Fri, 11 Feb 2005, Marcel Holtmann wrote: > This was the first look through your code. You should really make sure > that everything is still working when USB support is not compiled in. I > think it is a good idea to break your patch up a little bit. One patch > that adds usbobex.[ch] and the other one for the needed changes in the > main files. Hi Marcel, I have (hopefully) fixed all the problems that you've mentioned (and for those that I didn't, the explanations follow). I tried both gcc 3.4, and egcs 1.1.2, with and without compiling in USB support - seems to work fine. 1. Why is there a whole new structure for usb obex interfaces in a public header file? In order to connect to a specific USB OBEX interface with libusb, you need plenty of data: usb device structure pointer, configuration value, control and data interface numbers and interface setting numbers for each, endpoints and so on. It made perfect sense to me to unite all of this in a structure and make applications pass a pointer to that structure in the connect function: int UsbOBEX_TransportConnect(obex_t *self, struct usb_obex_intf* interface) There's also an interface discovery function which returns a list of those interfaces, so that applications wouldn't have to do the discovery themselves - it's not a trivial thing at all: struct usb_obex_intf* UsbOBEX_GetInterfaces(obex_t *self) An example of how this all works from an application's point of view is provided in obex_test patch. An even better approach would be to move all transport-specific data definitions to a separate obex_transport.h file and replace all the various *_TransportConnect functions with a unified one: int OBEX_TransportConnect(obex_t *self, struct obex_transport* transport) 2. Why +#define OBEX_DEFAULT_MTU_USB 0xffff? Because USB is fast, and it makes sense to set the MTU to the maximum and then lower it if the phone says so in its CONNECT response - openobex does this automatically. Nokia 6630 returns 0xffff MTU, 7610 suggests 4000 bytes MTU (and won't work with anything less, btw), and it's all totally transparent to the application. So here's the new version of the patch, first the part that adds usbobex.c and .h. -- Alexander Homepage: http://www.sensi.org/~ak/ diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/src/usbobex.c lib-usb/src/usbobex.c --- lib/src/usbobex.c 1970-01-01 02:00:00.000000000 +0200 +++ lib-usb/src/usbobex.c 2005-02-23 22:48:24.000000000 +0200 @@ -0,0 +1,344 @@ +/*************************************<******************************** + * + * Filename: usbobex.c + * Version: 0.1 + * Description: USB OBEX, USB transport for OBEX + * Status: Experimental. + * Author: Alex Kanavin <ak...@se...> + * + * Copyright (c) 2005 Alex Kanavin, All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef HAVE_USB + +/* Linux case */ + +#include <string.h> +#include <unistd.h> +#include <stdio.h> /* perror */ +#include <errno.h> /* errno and EADDRNOTAVAIL */ +#include <netinet/in.h> +#include <sys/socket.h> + +#include <usb.h> + +#include <obex_main.h> +#include <usbobex.h> + + +/* + * Function usbobex_prepare_connect (self, interface) + * + * Prepare for USB OBEX connect + * + */ +void usbobex_prepare_connect(obex_t *self, struct usb_obex_intf *intf) +{ +#ifndef _WIN32 + self->trans.self.usb.interface = intf; +#endif /* _WIN32 */ +} + +/* + * Function usbobex_find_interfaces () + * + * Find available USBOBEX interfaces on the system + */ +struct usb_obex_intf* usbobex_find_interfaces() +{ + struct usb_bus *busses; + struct usb_bus *bus; + struct usb_device *dev; + int c, i, a; + struct usb_obex_intf *current = NULL; + + usb_init(); + usb_find_busses(); + usb_find_devices(); + + busses = usb_get_busses(); + + for (bus = busses; bus; bus = bus->next) { + for (dev = bus->devices; dev; dev = dev->next) { + /* Loop through all of the configurations */ + for (c = 0; c < dev->descriptor.bNumConfigurations; c++) { + /* Loop through all of the interfaces */ + for (i = 0; i < dev->config[c].bNumInterfaces; i++) { + /* Loop through all of the alternate settings */ + for (a = 0; a < dev->config[c].interface[i].num_altsetting; a++) { + /* Check if this interface is OBEX */ + /* and find data interface */ + current = check_intf(dev, c, i, a, current); + } + } + } + } + } + while (current && current->prev) + current = current->prev; + return current; +} + +/* + * Helper function to usbobex_find_interfaces + */ +struct usb_obex_intf* check_intf(struct usb_device* dev, int c, int i, int a, struct usb_obex_intf* current) +{ + struct usb_obex_intf *next = NULL; + + if ((dev->config[c].interface[i].altsetting[a].bInterfaceClass == USB_CDC_CLASS) + && (dev->config[c].interface[i].altsetting[a].bInterfaceSubClass == USB_CDC_OBEX_SUBCLASS)) { + int err; + unsigned char *buffer = dev->config[c].interface[i].altsetting[a].extra; + int buflen = dev->config[c].interface[i].altsetting[a].extralen; + + next = malloc(sizeof(struct usb_obex_intf)); + if (next == NULL) + return current; + next->device = dev; + next->configuration = dev->config[c].bConfigurationValue; + next->control_interface = dev->config[c].interface[i].altsetting[a].bInterfaceNumber; + next->control_interface_description = dev->config[c].interface[i].altsetting[a].iInterface; + next->control_setting = dev->config[c].interface[i].altsetting[a].bAlternateSetting; + + err = find_obex_data_interface(buffer, buflen, dev->config[c], next); + if (err) + free(next); + else { + if (current) + current->next = next; + next->prev = current; + next->next = NULL; + current = next; + } + } + return current; +} + +/* + * Helper function to usbobex_find_interfaces + */ +int find_obex_data_interface(unsigned char* buffer, int buflen, struct usb_config_descriptor config, struct usb_obex_intf* intf) +{ + struct cdc_union_desc* union_header = NULL; + int i, a; + int found_active = 0; + int found_idle = 0; + + if (!buffer) { + DEBUG(2,"Weird descriptor references"); + return -EINVAL; + } + while (buflen > 0) { + if (buffer [1] != USB_DT_CS_INTERFACE) { + DEBUG(2,"skipping garbage"); + goto next_desc; + } + switch (buffer [2]) { + case CDC_UNION_TYPE: /* we've found it */ + if (union_header) { + DEBUG(2,"More than one union descriptor, skiping ..."); + goto next_desc; + } + union_header = (struct cdc_union_desc *)buffer; + break; + case CDC_OBEX_TYPE: /* maybe check version */ + case CDC_HEADER_TYPE: + break; /* for now we ignore it */ + default: + DEBUG(2, "Ignoring extra header, type %d, length %d", buffer[2], buffer[0]); + break; + } +next_desc: + buflen -= buffer[0]; + buffer += buffer[0]; + } + if (!union_header) { + DEBUG(2,"No union descriptor, giving up\n"); + return -ENODEV; + } + /* Found the slave interface, now find active/idle settings and endpoints */ + intf->data_interface = union_header->bSlaveInterface0; + + + /* Loop through all of the interfaces */ + for (i = 0; i < config.bNumInterfaces; i++) { + /* Loop through all of the alternate settings */ + for (a = 0; a < config.interface[i].num_altsetting; a++) { + /* Check if this interface is OBEX data interface*/ + /* and find endpoints */ + if (config.interface[i].altsetting[a].bInterfaceNumber == intf->data_interface) { + find_eps(intf, config.interface[i].altsetting[a], &found_active, &found_idle); + } + } + } + if (!found_idle) { + DEBUG(2,"No idle setting\n"); + return -ENODEV; + } + if (!found_active) { + DEBUG(2,"No active setting\n"); + return -ENODEV; + } + + return 0; +} + +/* + * Helper function to usbobex_find_interfaces + */ +void find_eps(struct usb_obex_intf* intf, struct usb_interface_descriptor data_intf, int* found_active, int* found_idle) +{ + struct usb_endpoint_descriptor *ep0, *ep1; + + if (data_intf.bNumEndpoints == 2) { + ep0 = data_intf.endpoint; + ep1 = data_intf.endpoint + 1; + if ((ep0->bEndpointAddress & USB_ENDPOINT_IN) && + ((ep0->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK) && + !(ep1->bEndpointAddress & USB_ENDPOINT_IN) && + ((ep1->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK)) { + *found_active = 1; + intf->data_active_setting = data_intf.bAlternateSetting; + intf->data_interface_active_description = data_intf.iInterface; + intf->data_endpoint_read = ep0->bEndpointAddress; + intf->data_endpoint_write = ep1->bEndpointAddress; + } + if (!(ep0->bEndpointAddress & USB_ENDPOINT_IN) && + ((ep0->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK) && + (ep1->bEndpointAddress & USB_ENDPOINT_IN) && + ((ep1->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK)) { + *found_active = 1; + intf->data_active_setting = data_intf.bAlternateSetting; + intf->data_interface_active_description = data_intf.iInterface; + intf->data_endpoint_read = ep1->bEndpointAddress; + intf->data_endpoint_write = ep0->bEndpointAddress; + } + } + if (data_intf.bNumEndpoints == 0) { + *found_idle = 1; + intf->data_idle_setting = data_intf.bAlternateSetting; + intf->data_interface_idle_description = data_intf.iInterface; + } +} + + +/* + * Function usbobex_connect_request (self) + * + * Open the USB connection + * + */ +int usbobex_connect_request(obex_t *self) +{ + int ret; +#ifndef _WIN32 + int mtu = 0; + //int len = sizeof(int); + + DEBUG(4, "\n"); + + self->trans.self.usb.dev_control = usb_open(self->trans.self.usb.interface->device); + self->trans.self.usb.dev_data = usb_open(self->trans.self.usb.interface->device); + + ret = usb_claim_interface(self->trans.self.usb.dev_control, self->trans.self.usb.interface->control_interface); + if (ret < 0) { + DEBUG(4, "Can't claim control interface %d", ret); + return ret; + } + + ret = usb_claim_interface(self->trans.self.usb.dev_data, self->trans.self.usb.interface->data_interface); + if (ret < 0) { + DEBUG(4, "Can't claim data interface %d", ret); + usb_release_interface(self->trans.self.usb.dev_control, self->trans.self.usb.interface->control_interface); + return ret; + } + + ret = usb_set_configuration(self->trans.self.usb.dev_control, self->trans.self.usb.interface->configuration); + if (ret < 0) { + DEBUG(4, "Can't set configuration %d", ret); + goto err; + } + + ret = usb_set_altinterface(self->trans.self.usb.dev_control, self->trans.self.usb.interface->control_setting); + if (ret < 0) { + DEBUG(4, "Can't set control setting %d", ret); + goto err; + } + + ret = usb_set_altinterface(self->trans.self.usb.dev_data, self->trans.self.usb.interface->data_active_setting); + if (ret < 0) { + DEBUG(4, "Can't set data active setting %d", ret); + goto err; + } + + mtu = OBEX_DEFAULT_MTU_USB; + self->trans.mtu = mtu; + + DEBUG(2, "transport mtu=%d\n", mtu); + + return 1; + +err: + usb_release_interface(self->trans.self.usb.dev_data, self->trans.self.usb.interface->data_interface); + usb_release_interface(self->trans.self.usb.dev_control, self->trans.self.usb.interface->control_interface); + return ret; + +#endif /* _WIN32 */ +} + +/* + * Function usbobex_link_disconnect_request (self) + * + * Shutdown the USB link + * + */ +int usbobex_disconnect_request(obex_t *self) +{ + int ret; +#ifndef _WIN32 + DEBUG(4, "\n"); + if (!self->trans.self.usb.interface) + return 0; + ret = usb_set_altinterface(self->trans.self.usb.dev_data, self->trans.self.usb.interface->data_idle_setting);; + if (ret < 0) + DEBUG(4, "Can't set data idle setting %d", ret); + ret = usb_release_interface(self->trans.self.usb.dev_data, self->trans.self.usb.interface->data_interface); + if (ret < 0) + DEBUG(4, "Can't release data interface %d", ret); + ret = usb_release_interface(self->trans.self.usb.dev_control, self->trans.self.usb.interface->control_interface); + if (ret < 0) + DEBUG(4, "Can't release control interface %d", ret); + ret = usb_close(self->trans.self.usb.dev_data); + if (ret < 0) + DEBUG(4, "Can't close data interface %d", ret); + ret = usb_close(self->trans.self.usb.dev_control); + if (ret < 0) + DEBUG(4, "Can't close control interface %d", ret); + +#endif /* _WIN32 */ + return ret; +} + + +#endif /* HAVE_BLUETOOTH */ diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/src/usbobex.h lib-usb/src/usbobex.h --- lib/src/usbobex.h 1970-01-01 02:00:00.000000000 +0200 +++ lib-usb/src/usbobex.h 2005-02-22 00:45:39.000000000 +0200 @@ -0,0 +1,75 @@ +/********************************************************************* + * + * Filename: usbobex.h + * Version: + * Description: + * Status: Experimental. + * Author: Alex Kanavin <ak...@se...> + * + * Copyright (c) 2005 Alex Kanavin, All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ********************************************************************/ + +#ifndef USBOBEX_H +#define USBOBEX_H + +#include "obex_const.h" +#include "usb.h" + +struct addr_usb { + struct usb_obex_intf* interface; + usb_dev_handle* dev_control; + usb_dev_handle* dev_data; +}; + +/* "Union Functional Descriptor" from CDC spec 5.2.3.X + * used to find data/slave OBEX interface */ +struct cdc_union_desc { + u_int8_t bLength; + u_int8_t bDescriptorType; + u_int8_t bDescriptorSubType; + + u_int8_t bMasterInterface0; + u_int8_t bSlaveInterface0; +} __attribute__ ((packed)); + +/* CDC class and subclass types */ +#define USB_CDC_CLASS 0x02 +#define USB_CDC_OBEX_SUBCLASS 0x0b + +/* class and subclass specific descriptor types */ +#define CDC_HEADER_TYPE 0x00 +#define CDC_CALL_MANAGEMENT_TYPE 0x01 +#define CDC_AC_MANAGEMENT_TYPE 0x02 +#define CDC_UNION_TYPE 0x06 +#define CDC_COUNTRY_TYPE 0x07 +#define CDC_OBEX_TYPE 0x15 + +/* Interface descriptor */ +#define USB_DT_CS_INTERFACE 0x24 +#define CDC_DATA_INTERFACE_TYPE 0x0a + + +void usbobex_prepare_connect(obex_t *self, struct usb_obex_intf* intf); +int usbobex_connect_request(obex_t *self); +int usbobex_disconnect_request(obex_t *self); +struct usb_obex_intf* usbobex_find_interfaces(); +int find_obex_data_interface(unsigned char* buffer, int buflen, struct usb_config_descriptor config, struct usb_obex_intf* intf); +struct usb_obex_intf* check_intf(struct usb_device* dev, int c, int i, int a, struct usb_obex_intf* current); +void find_eps(struct usb_obex_intf* intf, struct usb_interface_descriptor data_intf, int* found_active, int* found_idle); +#endif |
From: Alex K. <ak...@se...> - 2005-03-02 15:26:20
|
On Wed, 2 Mar 2005, Alex Kanavin wrote: > So here's the new version of the patch, first the part that adds usbobex.c > and .h. This is the second part, which adds necessary modifications to the rest of the library. -- Alexander Homepage: http://www.sensi.org/~ak/ diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/ChangeLog lib-usb/ChangeLog --- lib/ChangeLog 2004-03-06 14:00:27.000000000 +0200 +++ lib-usb/ChangeLog 2005-02-23 22:52:06.000000000 +0200 @@ -1,3 +1,7 @@ +2005-02-23 Alex Kanavin <ak...@se...> + + * Support for USB transport layer and USB interface discovery + 2004-03-06 Christian W. Zuckschwerdt <za...@tr...> * Portability fixes, mainly replacing stdint.h with inttypes.h diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/acinclude.m4 lib-usb/acinclude.m4 --- lib/acinclude.m4 2002-10-16 01:39:02.000000000 +0300 +++ lib-usb/acinclude.m4 2005-02-23 22:36:07.000000000 +0200 @@ -54,3 +54,31 @@ AC_DEFUN([BLUETOOTH_CHECK], [ BLUETOOTH_HOOK([],failure) ]) + + +dnl +dnl USB_HOOK (script-if-usb-found, failflag) +dnl +dnl if failflag is "failure" it aborts if obex is not found. +dnl + +AC_DEFUN([USB_HOOK],[ + AC_CACHE_CHECK([for USB support],am_cv_usb_found,[ + + AC_TRY_COMPILE([#include <usb.h>], + [struct usb_dev_handle *dev;], + am_cv_usb_found=yes, + am_cv_usb_found=no)]) + + if test $am_cv_usb_found = yes; then + AC_DEFINE(HAVE_USB,1,[Define if system supports USB]) + USB_LIBS="-lusb" + fi + AC_SUBST(USB_LIBS) + ]) + +]) + +AC_DEFUN([USB_CHECK], [ + USB_HOOK([],failure) +]) diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/configure.in lib-usb/configure.in --- lib/configure.in 2003-10-01 14:15:52.000000000 +0300 +++ lib-usb/configure.in 2005-01-24 01:49:11.000000000 +0200 @@ -39,6 +39,7 @@ IRDA_CHECK BLUETOOTH_CHECK +USB_CHECK dnl Configure debug facilities AC_ARG_WITH(debug,[ --with-debug=level Debug level], diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/src/Makefile.am lib-usb/src/Makefile.am --- lib/src/Makefile.am 2002-10-28 23:51:18.000000000 +0200 +++ lib-usb/src/Makefile.am 2005-02-20 17:45:29.000000000 +0200 @@ -22,7 +22,8 @@ inobex.c inobex.h \ btobex.c btobex.h \ netbuf.c netbuf.h \ - irda.h irda_wrap.h + irda.h irda_wrap.h \ + usbobex.c usbobex.h libopenobex_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ @@ -32,4 +33,6 @@ INCLUDES = -I$(top_srcdir)/src +libopenobex_la_LIBADD = @USB_LIBS@ + EXTRA_DIST = obex.sym obex.def makefile.msc win32compat.c windeps.dep diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/src/obex.c lib-usb/src/obex.c --- lib/src/obex.c 2004-01-30 21:44:30.000000000 +0200 +++ lib-usb/src/obex.c 2005-02-23 22:39:04.000000000 +0200 @@ -55,6 +55,9 @@ #ifdef HAVE_IRDA #include "irobex.h" #endif +#ifdef HAVE_USB +#include "usbobex.h" +#endif #ifdef HAVE_BLUETOOTH #include "btobex.h" #else @@ -69,6 +72,7 @@ * %OBEX_TRANS_INET : Use regular TCP/IP socket * %OBEX_TRANS_CUSTOM : Use user provided transport * %OBEX_TRANS_BLUETOOTH: Use regular Bluetooth RFCOMM socket (need the BlueZ stack) + * %OBEX_TRANS_USB: Use USB transport (libusb needed) * If you use %OBEX_TRANS_CUSTOM you must register your own * transport with OBEX_RegisterCTransport() * @eventcb: Function pointer to your event callback. @@ -121,25 +125,40 @@ /* Init transport */ self->trans.type = transport; self->trans.connected = FALSE; + if (transport == OBEX_TRANS_USB) { +#ifdef HAVE_USB + self->trans.usb_interfaces = usbobex_find_interfaces(); +#else + self->trans.usb_interfaces = NULL; +#endif + } + + + /* Safe values. + * Both self->mtu_rx and self->mtu_tx_max can be increased by app + * self->mtu_tx will be whatever the other end sneds us - Jean II */ + /* Set MTU to the maximum, if using USB transport - Alex Kanavin */ + if (transport == OBEX_TRANS_USB) { + self->mtu_rx = OBEX_DEFAULT_MTU_USB; + self->mtu_tx = OBEX_MINIMUM_MTU; + self->mtu_tx_max = OBEX_DEFAULT_MTU_USB; + } else { + self->mtu_rx = OBEX_DEFAULT_MTU; + self->mtu_tx = OBEX_MINIMUM_MTU; + self->mtu_tx_max = OBEX_DEFAULT_MTU; + } /* Allocate message buffers */ /* It's safe to allocate them smaller than OBEX_MAXIMUM_MTU * because netbuf will realloc data as needed. - Jean II */ - self->rx_msg = g_netbuf_new(OBEX_DEFAULT_MTU); + self->rx_msg = g_netbuf_new(self->mtu_rx); if (self->rx_msg == NULL) goto out_err; - self->tx_msg = g_netbuf_new(OBEX_DEFAULT_MTU); + self->tx_msg = g_netbuf_new(self->mtu_tx_max); if (self->tx_msg == NULL) goto out_err; - /* Safe values. - * Both self->mtu_rx and self->mtu_tx_max can be increased by app - * self->mtu_tx will be whatever the other end sneds us - Jean II */ - self->mtu_rx = OBEX_DEFAULT_MTU; - self->mtu_tx = OBEX_MINIMUM_MTU; - self->mtu_tx_max = OBEX_DEFAULT_MTU; - #ifndef _WIN32 /* Ignore SIGPIPE. Otherwise send() will raise it and the app will quit */ signal(SIGPIPE, SIG_IGN); @@ -182,6 +201,10 @@ */ void OBEX_Cleanup(obex_t *self) { +#ifdef HAVE_USB + struct usb_obex_intf* next; +#endif + obex_return_if_fail(self != NULL); obex_transport_disconnect_request(self); @@ -192,6 +215,16 @@ if (self->rx_msg) g_netbuf_free(self->rx_msg); + + if (self->trans.type == OBEX_TRANS_USB) { +#ifdef HAVE_USB + while (self->trans.usb_interfaces != NULL) { + next = self->trans.usb_interfaces->next; + free(self->trans.usb_interfaces); + self->trans.usb_interfaces = next; + } +#endif + } free(self); } @@ -1054,3 +1087,49 @@ return obex_transport_connect_request(self); } +/** + * UsbOBEX_TransportConnect - Connect USB transport + * @self: OBEX handle + * @interface: USB interface to connect to + * + * An easier connect function to use for USB (USB OBEX) only. + */ +int UsbOBEX_TransportConnect(obex_t *self, struct usb_obex_intf* interface) +{ + DEBUG(4, "\n"); + + obex_return_val_if_fail(self != NULL, -1); + + if (self->object) { + DEBUG(1, "We are busy.\n"); + return -EBUSY; + } + + obex_return_val_if_fail(interface != NULL, -1); + obex_return_val_if_fail(interface->device != NULL, -1); + +#ifdef HAVE_USB + usbobex_prepare_connect(self, interface); + return obex_transport_connect_request(self); +#else + return -ESOCKTNOSUPPORT; +#endif /* HAVE_USB */ +} + +/** + * UsbOBEX_GetInterfaces - Get a list of USB OBEX interfaces on the system + * @self: OBEX handle + * @interfaces: A list of USB OBEX interfaces + * + * Gets a list of USB OBEX interfaces, or NULL if there are none. + */ +struct usb_obex_intf* UsbOBEX_GetInterfaces(obex_t *self) +{ + DEBUG(4, "\n"); + +#ifdef HAVE_USB + return self->trans.usb_interfaces; +#else + return NULL; +#endif +} diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/src/obex.def lib-usb/src/obex.def --- lib/src/obex.def 2004-01-30 21:25:45.000000000 +0200 +++ lib-usb/src/obex.def 2005-02-20 17:06:19.000000000 +0200 @@ -38,3 +38,5 @@ BtOBEX_ServerRegister BtOBEX_TransportConnect FdOBEX_TransportSetup +UsbOBEX_TransportConnect +UsbOBEX_GetInterfaces diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/src/obex.h lib-usb/src/obex.h --- lib/src/obex.h 2004-03-06 13:32:56.000000000 +0200 +++ lib-usb/src/obex.h 2005-02-20 17:16:31.000000000 +0200 @@ -134,4 +134,10 @@ */ int FdOBEX_TransportSetup(obex_t *self, int rfd, int wfd, int mtu); +/* + * OBEX USB API + */ + struct usb_obex_intf* UsbOBEX_GetInterfaces(obex_t *self); + int UsbOBEX_TransportConnect(obex_t *self, struct usb_obex_intf* interface); + #endif diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/src/obex.sym lib-usb/src/obex.sym --- lib/src/obex.sym 2004-01-30 21:25:45.000000000 +0200 +++ lib-usb/src/obex.sym 2005-02-20 17:06:55.000000000 +0200 @@ -37,3 +37,5 @@ BtOBEX_ServerRegister BtOBEX_TransportConnect FdOBEX_TransportSetup +UsbOBEX_TransportConnect +UsbOBEX_GetInterfaces diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/src/obex_const.h lib-usb/src/obex_const.h --- lib/src/obex_const.h 2004-03-06 13:32:56.000000000 +0200 +++ lib-usb/src/obex_const.h 2005-02-23 22:50:25.000000000 +0200 @@ -47,6 +47,31 @@ void * customdata; } obex_ctrans_t; +struct usb_obex_intf; + +/* Structure that contains information about a USB OBEX interface + * present on the system */ +struct usb_obex_intf { + struct usb_obex_intf *prev, *next; /* Next and previous interfaces in the list */ + struct usb_device *device; /* USB device that has the interface */ + int configuration; /* Device configuration */ + int control_interface; /* OBEX master interface */ + int control_interface_description; /* OBEX master interface string descriptor number + * If non-zero, use usb_get_string_simple() from + * libusb to retrieve human-readable description + */ + int control_setting; /* OBEX master interface setting */ + int data_interface; /* OBEX data/slave interface */ + int data_idle_setting; /* OBEX data/slave idle setting */ + int data_interface_idle_description; /* OBEX data/slave interface string descriptor number + * in idle setting */ + int data_active_setting; /* OBEX data/slave active setting */ + int data_interface_active_description; /* OBEX data/slave interface string descriptor number + * in active setting */ + int data_endpoint_read; /* OBEX data/slave interface read endpoint */ + int data_endpoint_write; /* OBEX data/slave interface write endpoint */ +}; + #define OBEX_CLIENT 0 #define OBEX_SERVER 1 @@ -81,6 +106,7 @@ #define OBEX_TRANS_CUSTOM 3 #define OBEX_TRANS_BLUETOOTH 4 #define OBEX_TRANS_FD 5 +#define OBEX_TRANS_USB 6 /* Standard headers */ #define OBEX_HDR_COUNT 0xc0 /* Number of objects (used by connect) */ @@ -133,6 +159,7 @@ #define OBEX_DEFAULT_MTU 1024 #define OBEX_MINIMUM_MTU 255 #define OBEX_MAXIMUM_MTU 32768 +#define OBEX_DEFAULT_MTU_USB 0xffff /* In theory max MTU is (64k-1), but that's quite big. */ /* Optimum MTU for various transport (optimum for throughput). diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/src/obex_transport.c lib-usb/src/obex_transport.c --- lib/src/obex_transport.c 2002-11-22 21:06:12.000000000 +0200 +++ lib-usb/src/obex_transport.c 2005-02-23 22:40:27.000000000 +0200 @@ -43,6 +43,9 @@ #ifdef HAVE_BLUETOOTH #include "btobex.h" #endif /*HAVE_BLUETOOTH*/ +#ifdef HAVE_USB +#include "usbobex.h" +#endif /*HAVE_USB*/ #include "obex_transport.h" @@ -64,6 +67,9 @@ ret = -1; } } + else if (self->trans.type == OBEX_TRANS_USB) { + ret = obex_data_indication(self, NULL, 0); + } else { struct timeval time; fd_set fdset; @@ -205,7 +211,11 @@ if (self->fd >= 0 && self->writefd >= 0) ret = 0; break; - +#ifdef HAVE_USB + case OBEX_TRANS_USB: + ret = usbobex_connect_request(self); + break; +#endif /*HAVE_USB*/ default: DEBUG(4, "Transport not implemented!\n"); break; @@ -250,6 +260,11 @@ /* no real disconnect on a file */ self->fd = self->writefd = -1; break; +#ifdef HAVE_USB + case OBEX_TRANS_USB: + usbobex_disconnect_request(self); + break; +#endif /*HAVE_USB*/ default: DEBUG(4, "Transport not implemented!\n"); break; @@ -289,7 +304,8 @@ break; #endif /*HAVE_BLUETOOTH*/ case OBEX_TRANS_FD: - /* no real listen on the file */ + case OBEX_TRANS_USB: + /* no real listen on the file or USB */ ret = 0; break; default: @@ -330,7 +346,8 @@ break; #endif /*HAVE_BLUETOOTH*/ case OBEX_TRANS_FD: - /* no real server on a file */; + case OBEX_TRANS_USB: + /* no real server on a file or USB */; break; default: DEBUG(4, "Transport not implemented!\n"); @@ -389,6 +406,16 @@ case OBEX_TRANS_FD: actual = do_write(self->writefd, msg, self->trans.mtu); break; +#ifdef HAVE_USB + case OBEX_TRANS_USB: + if (self->trans.connected != TRUE) + break; + DEBUG(4, "Endpoint %d\n", self->trans.self.usb.interface->data_endpoint_write); + actual = usb_bulk_write(self->trans.self.usb.dev_data, + self->trans.self.usb.interface->data_endpoint_write, + msg->data, msg->len, 10*1000); + break; +#endif /*HAVE_USB*/ case OBEX_TRANS_CUSTOM: DEBUG(4, "Custom write\n"); if(self->ctrans.write) @@ -427,6 +454,16 @@ case OBEX_TRANS_FD: actual = read(self->fd, msg->tail, max); break; +#ifdef HAVE_USB + case OBEX_TRANS_USB: + if (self->trans.connected != TRUE) + break; + DEBUG(4, "Endpoint %d\n", self->trans.self.usb.interface->data_endpoint_read); + actual = usb_bulk_read(self->trans.self.usb.dev_data, + self->trans.self.usb.interface->data_endpoint_read, + msg->tail, self->mtu_rx, 10*1000); + break; +#endif /*HAVE_USB*/ case OBEX_TRANS_CUSTOM: if(buflen > max) { memcpy(msg->tail, buf, max); diff -uNr -x configure -x aclocal.m4 -x autom4te.cache -x 'config.*' -x depcomp -x doc -x INSTALL -x install-sh -x libtool -x ltmain.sh -x m4macros -x Makefile -x Makefile.in -x missing -x mkinstalldirs -x '*.lo' -x '*.Plo' -x '*.la*' -x .libs -x 'stamp*' -x CVS -x '*.o' -x openobex-config lib/src/obex_transport.h lib-usb/src/obex_transport.h --- lib/src/obex_transport.h 2004-03-05 11:48:49.000000000 +0200 +++ lib-usb/src/obex_transport.h 2005-02-23 22:40:57.000000000 +0200 @@ -43,6 +43,9 @@ #include <bluetooth/bluetooth.h> #include <bluetooth/rfcomm.h> #endif /*HAVE_BLUETOOTH*/ +#ifdef HAVE_USB +#include "usbobex.h" +#endif /*HAVE_USB*/ #include "obex_main.h" @@ -54,6 +57,9 @@ #ifdef HAVE_BLUETOOTH struct sockaddr_rc rfcomm; #endif /*HAVE_BLUETOOTH*/ +#ifdef HAVE_USB + struct addr_usb usb; +#endif /*HAVE_USB*/ } saddr_t; typedef struct obex_transport { @@ -62,6 +68,7 @@ unsigned int mtu; /* Tx MTU of the link */ saddr_t self; /* Source address */ saddr_t peer; /* Destination address */ + struct usb_obex_intf* usb_interfaces; /* Used by USB OBEX transport*/ } obex_transport_t; |
From: Alex K. <ak...@se...> - 2005-03-02 15:27:51
|
On Wed, 2 Mar 2005, Alex Kanavin wrote: > This is the second part, which adds necessary modifications to the rest of > the library. The last part: obex_test application patch. -- Alexander Homepage: http://www.sensi.org/~ak/ diff -uNr -x INSTALL -x Makefile -x Makefile.in -x aclocal.m4 -x autom4te.cache -x config.cache -x config.h -x 'config.h*' -x config.log -x config.status -x configure -x depcomp -x install-sh -x missing -x mkinstalldirs -x '*.Po' -x CVS -x '*.o' -x stamp apps/ChangeLog apps-usb/ChangeLog --- apps/ChangeLog 2002-11-15 11:49:12.000000000 +0200 +++ apps-usb/ChangeLog 2005-02-23 22:52:22.000000000 +0200 @@ -1,3 +1,7 @@ +2005-02-23 Alex Kanavin <ak...@se...> + + * Add client-side USB support and interface discovery + 2002-11-15 Marcel Holtmann <ma...@ho...> * Add Bluetooth server support diff -uNr -x INSTALL -x Makefile -x Makefile.in -x aclocal.m4 -x autom4te.cache -x config.cache -x config.h -x 'config.h*' -x config.log -x config.status -x configure -x depcomp -x install-sh -x missing -x mkinstalldirs -x '*.Po' -x CVS -x '*.o' -x stamp apps/acinclude.m4 apps-usb/acinclude.m4 --- apps/acinclude.m4 2002-11-01 14:19:14.000000000 +0200 +++ apps-usb/acinclude.m4 2005-01-25 01:34:27.000000000 +0200 @@ -27,3 +27,30 @@ AC_SUBST(BLUETOOTH_LIBS) AC_MSG_RESULT($am_cv_bluetooth_found) ]) + +dnl +dnl Check for USB library +dnl + +AC_DEFUN([USB_CHECK],[ + AC_MSG_CHECKING(for USB support) + + AC_TRY_COMPILE( [ #include <usb.h> + ],[ + struct usb_dev_handle *dev; + ], + am_cv_usb_found=yes, + am_cv_usb_found=no + ) + + if test $am_cv_usb_found = yes; then + AC_DEFINE(HAVE_USB,1,[Define if system supports USB]) + + USB_CFLAGS="" + USB_LIBS="-lusb" + fi + + AC_SUBST(USB_CFLAGS) + AC_SUBST(USB_LIBS) + AC_MSG_RESULT($am_cv_usb_found) +]) diff -uNr -x INSTALL -x Makefile -x Makefile.in -x aclocal.m4 -x autom4te.cache -x config.cache -x config.h -x 'config.h*' -x config.log -x config.status -x configure -x depcomp -x install-sh -x missing -x mkinstalldirs -x '*.Po' -x CVS -x '*.o' -x stamp apps/configure.in apps-usb/configure.in --- apps/configure.in 2002-12-01 19:26:42.000000000 +0200 +++ apps-usb/configure.in 2005-01-25 01:35:58.000000000 +0200 @@ -18,5 +18,6 @@ AM_PATH_OPENOBEX(1.0.0) BLUETOOTH_CHECK +USB_CHECK AC_OUTPUT([Makefile src/Makefile]) diff -uNr -x INSTALL -x Makefile -x Makefile.in -x aclocal.m4 -x autom4te.cache -x config.cache -x config.h -x 'config.h*' -x config.log -x config.status -x configure -x depcomp -x install-sh -x missing -x mkinstalldirs -x '*.Po' -x CVS -x '*.o' -x stamp apps/src/Makefile.am apps-usb/src/Makefile.am --- apps/src/Makefile.am 2002-11-01 21:06:02.000000000 +0200 +++ apps-usb/src/Makefile.am 2005-01-25 01:35:35.000000000 +0200 @@ -17,7 +17,7 @@ obex_test_server.c obex_test_server.h \ obex_test_cable.c obex_test_cable.h -obex_test_LDADD = @OPENOBEX_LIBS@ @BLUETOOTH_LIBS@ libmisc.a +obex_test_LDADD = @OPENOBEX_LIBS@ @BLUETOOTH_LIBS@ @USB_LIBS@ libmisc.a obex_tcp_SOURCES = obex_tcp.c @@ -28,6 +28,6 @@ LDADD = @OPENOBEX_LIBS@ libmisc.a -INCLUDES = @OPENOBEX_CFLAGS@ @BLUETOOTH_CFLAGS@ +INCLUDES = @OPENOBEX_CFLAGS@ @BLUETOOTH_CFLAGS@ @USB_CFLAGS@ EXTRA_DIST = makefile.msc diff -uNr -x INSTALL -x Makefile -x Makefile.in -x aclocal.m4 -x autom4te.cache -x config.cache -x config.h -x 'config.h*' -x config.log -x config.status -x configure -x depcomp -x install-sh -x missing -x mkinstalldirs -x '*.Po' -x CVS -x '*.o' -x stamp apps/src/obex_test.c apps-usb/src/obex_test.c --- apps/src/obex_test.c 2002-11-15 23:18:29.000000000 +0200 +++ apps-usb/src/obex_test.c 2005-02-24 01:13:39.000000000 +0200 @@ -47,6 +47,10 @@ #include <bluetooth/rfcomm.h> #endif +#ifdef HAVE_USB +#include <usb.h> +#endif + #include <openobex/obex.h> #include "obex_test.h" @@ -147,7 +151,29 @@ return OBEX_TransportConnect(handle, (struct sockaddr *) &peer, sizeof(struct sockaddr_in)); } - + +// +// +// +void print_usb_intf_info(struct usb_obex_intf* interfaces) +{ + struct usb_dev_handle* usb_handle; + char manufacturer[256] = "\0"; + char product[256] = "\0"; + char interface_desc[256] = "\0"; + int i = 0; int len; + + while (interfaces != NULL) { + usb_handle = usb_open(interfaces->device); + len = usb_get_string_simple(usb_handle, interfaces->device->descriptor.iManufacturer, manufacturer, 256); + len = usb_get_string_simple(usb_handle, interfaces->device->descriptor.iProduct, product ,256); + len = usb_get_string_simple(usb_handle, interfaces->control_interface_description, interface_desc, 256); + usb_close(usb_handle); + printf("Interface %d: %s %s %s\n", i, manufacturer, product, interface_desc); + interfaces = interfaces->next; i++; + } +} + // // // @@ -155,13 +181,17 @@ { char cmd[10]; int end = 0; - int cobex = FALSE, tcpobex = FALSE, btobex = FALSE, r320 = FALSE; + int cobex = FALSE, tcpobex = FALSE, btobex = FALSE, r320 = FALSE, usbobex = FALSE; obex_t *handle; #ifdef HAVE_BLUETOOTH bdaddr_t bdaddr; uint8_t channel; #endif +#ifdef HAVE_USB + struct usb_obex_intf* usb_intf; +#endif + struct context global_context = {0,}; #ifndef _WIN32 @@ -181,7 +211,8 @@ tcpobex = TRUE; if( (argc >= 2) && (strcmp(argv[1], "-b") == 0 ) ) btobex = TRUE; - + if( (argc >= 2) && (strcmp(argv[1], "-u") == 0 ) ) + usbobex = TRUE; if(cobex) { #ifndef _WIN32 @@ -262,6 +293,45 @@ printf("Not implemented in Win32 yet.\n"); #endif // _WIN32 } + else if(usbobex) { + int intf_num; + switch (argc) { +#ifdef HAVE_USB + case 2: + printf("Using USB transport, querying available interfaces\n"); + if(! (handle = OBEX_Init(OBEX_TRANS_USB, obex_event, 0))) { + perror( "OBEX_Init failed"); + exit(0); + } + print_usb_intf_info(UsbOBEX_GetInterfaces(handle)); + printf("Use '%s -u interface_number' to run interactive OBEX test client\n", argv[0]); + OBEX_Cleanup(handle); + exit(0); + break; + case 3: + intf_num = atoi(argv[2]); + printf("Using USB transport \n"); + if(! (handle = OBEX_Init(OBEX_TRANS_USB, obex_event, 0))) { + perror( "OBEX_Init failed"); + exit(0); + } + + usb_intf = UsbOBEX_GetInterfaces(handle); + while (usb_intf != NULL && intf_num > 0) { + usb_intf = usb_intf->next; intf_num--; + } + if (usb_intf == NULL) { + printf( "Invalid interface number\n"); + exit(0); + } + + break; +#endif + default: + printf("Wrong number of arguments\n"); + exit(0); + } + } else { printf("Using IrDA transport\n"); if(! (handle = OBEX_Init(OBEX_TRANS_IRDA, obex_event, 0))) { @@ -321,6 +391,16 @@ printf("Transport not found! (Bluetooth)\n"); #endif } + if (usbobex) { +#ifdef HAVE_USB + if (UsbOBEX_TransportConnect(handle, usb_intf) < 0) { + printf("Transport connect error! (USB)\n"); + break; + } +#else + printf("Transport not found! (USB)\n"); +#endif + } else { if(IrOBEX_TransportConnect(handle, IR_SERVICE) < 0) { printf("Transport connect error! (IrDA)\n"); |
From: Alex K. <ak...@se...> - 2005-03-02 15:40:08
|
On Wed, 2 Mar 2005, Alex Kanavin wrote: > On Wed, 2 Mar 2005, Alex Kanavin wrote: > > > This is the second part, which adds necessary modifications to the rest of > > the library. > > The last part: obex_test application patch. Oops, there are three parts altogether, not four :) -- Alexander Homepage: http://www.sensi.org/~ak/ |
From: Sergey V. <vs...@al...> - 2005-03-02 16:28:08
|
On Wed, Mar 02, 2005 at 06:24:07PM +0300, Alex Kanavin wrote: [...] > +/* > + * Helper function to usbobex_find_interfaces=20 > + */ > +struct usb_obex_intf* check_intf(struct usb_device* dev, int c, int i, i= nt a, struct usb_obex_intf* current) This function should be static. > +/* > + * Helper function to usbobex_find_interfaces=20 > + */ > +int find_obex_data_interface(unsigned char* buffer, int buflen, struct u= sb_config_descriptor config, struct usb_obex_intf* intf) This should be static too. > +/* > + * Helper function to usbobex_find_interfaces=20 > + */ > +void find_eps(struct usb_obex_intf* intf, struct usb_interface_descripto= r data_intf, int* found_active, int* found_idle) And this should be static too. BTW, "-export-symbols $(top_srcdir)/src/obex.sym" in openobex/src/Makefile.am does not really hide any symbols at least on Linux/i386 - it strips them from the normal symbol table (which is used for linking object files and debugging), but does not change the dynamic symbol table in the shared library (you can check it with "nm --dynamic" or "objdump -T"). Therefore global symbols which are not mentioned in obex.sym can still conflict with the symbols used by the program linked with the shared library (if a function with the same name is defined in the program, the implementation from the program will be used instead of the code in the shared library). |
From: Marcel H. <ma...@ho...> - 2005-05-02 14:06:47
|
Hi Alexander, > there's now a webpage with information about using USB OBEX interfaces > under Linux: > > http://members.dodo.com.au/~joaniemrc/nokia/Nokia-6670-USB.html > > Note that the obexftp patch offered from there is only a temporary hack, > and I'm planning to write a proper patch when Marcel reviews and hopefully > includes my USB transport patch into openobex. Soon, I hope. I am mostly fine with all your changes, but "struct usb_obex_intf" worries me a little bit. Is it possible to create a string from it that represents all the needed information and hide all other stuff inside the USB transport layer. From my current view I think the OBEX API should be as simple as possible. So less structs are better. Another thing is that the different transport layers should be loaded on demand by dlopen() and realized as plugins. The dependencies with the USB and Bluetooth libraries are maybe too complex for some systems. Regards Marcel |
From: Alex K. <ak...@se...> - 2005-05-02 14:59:23
|
On Mon, 2 May 2005, Marcel Holtmann wrote: > I am mostly fine with all your changes, but "struct usb_obex_intf" > worries me a little bit. Is it possible to create a string from it that > represents all the needed information and hide all other stuff inside > the USB transport layer. From my current view I think the OBEX API > should be as simple as possible. So less structs are better. You need to supply at least a USB device/interface pair, and I don't think you can identify that with a string. So there has to be a struct. I think the API can be simpified by introducing a grand unified transport connect function, which hides all the transport-specific data inside struct obex_transport: int OBEX_TransportConnect(obex_t *self, struct obex_transport *transport); and then marking all the transport-specific functions as deprecated. > Another thing is that the different transport layers should be loaded on > demand by dlopen() and realized as plugins. The dependencies with the > USB and Bluetooth libraries are maybe too complex for some systems. It's unlikely we'll get yet another transport in the near future, so maybe we can keep things in a current, static way for now. Alexander Homepage: http://www.sensi.org/~ak/ |
From: Alex K. <ak...@se...> - 2005-05-02 13:44:01
|
Hi, there's now a webpage with information about using USB OBEX interfaces under Linux: http://members.dodo.com.au/~joaniemrc/nokia/Nokia-6670-USB.html Note that the obexftp patch offered from there is only a temporary hack, and I'm planning to write a proper patch when Marcel reviews and hopefully includes my USB transport patch into openobex. Soon, I hope. I also found out that there are at least two non-Nokia phones which support USB OBEX interfaces: Sony Ericsson Z1010 and LG U8110/8120. If someone has them, I'd like to know if they work with the openobex patch. By the way, the newly announced Nokia N91 phone (the 4 gigs harddrive iPod mini competitor) is going to support usb mass storage. Alexander Homepage: http://www.sensi.org/~ak/ |