Very nice!

I'll put it in tomorrow and make a new release.

Paul Alfille


On 7/23/06, Robert Nilsson <[EMAIL PROTECTED]> wrote:
> Paul,
>
> Here are my patches.  I haven't tried Fuse yet - I want to revel in the fact 
> that this is working for owhttpd/owftpd/owserver!
>
> I put the usb_clear_halt fix into the DS9490 code, since I really don't know 
> when the libusb port might get updated.  This could probably use some smart 
> checking in configure for such things...  It's ugly, but hopefully only 
> temporary.
>
> Any idea why <sys/types> needs to be included twice (lines 77 and 85 of ow.h)?
>
> Rob.
>
> --- /home/robert/build/owfs-2.4p3/module/owlib/src/include/ow.h Fri Jun 23 
> 17:50:23 2006
> +++ /home/robert/build/owfs-2.4p3.rob/module/owlib/src/include/ow.h     Sun 
> Jul 23 13:34:36 2006
> @@ -76,6 +76,11 @@
>  #ifdef HAVE_SYS_TYPES_H
>   #include <sys/types.h> /* for stat */
>  #endif
> +#ifdef __FreeBSD__ // Fix to compile under FreeBSD
> + #define major(x)        ((int)(((unsigned int)(x) >> 8)&0xff)) /* major 
> number */
> + #define minor(x)        ((int)((x)&0xffff00ff))         /* minor number */
> + #define IPPORT_RESERVED         1024
> +#endif
>  #include <ctype.h>
>  #include <sys/types.h>
>  #include <stdlib.h>
> @@ -99,7 +104,10 @@
>  #include <termios.h>
>  #include <errno.h>
>  #include <syslog.h>
> -#include <sys/file.h> /* for flock */
> +// #include <sys/file.h> /* for flock */
> +#ifdef __FreeBSD__
> + #include <sys/select.h>
> +#endif
>  #ifdef HAVE_GETOPT_H
>   #include <getopt.h> /* for long options */
>  #endif
> @@ -209,6 +217,28 @@
>  #endif /* OW_MT */
>
>  #if OW_USB
> + #ifdef __FreeBSD__
> +    // Add a few definitions we need
> +    #undef HAVE_USB_INTERRUPT_READ // This call in libusb is unneeded for 
> FreeBSD (and it's broken)
> +    #define u_long unsigned long
> +    #define u_char unsigned char
> +    #define u_int  unsigned int
> +//    #include <sys/ioctl.h>
> +    // The include, structure definition, and define are only needed until 
> FreeBSD has a usb_clear_halt function
> +    #include <dev/usb/usb.h>
> +    struct usb_dev_handle {
> +      int fd;
> +      struct usb_bus *bus;
> +      struct usb_device *device;
> +      int config;
> +      int interface;
> +      int altsetting;
> +      void *impl_info;
> +    };
> +    #define USB_CLEAR_HALT BSD_usb_clear_halt
> + #else
> +    #define USB_CLEAR_HALT usb_clear_halt
> + #endif
>      #include <usb.h>
>  #endif /* OW_USB */
>
>
> --- /home/robert/build/owfs-2.4p3/module/owlib/src/c/ow_ds9490.c        Fri 
> Jun 23 17:50:23 2006
> +++ /home/robert/build/owfs-2.4p3.rob/module/owlib/src/c/ow_ds9490.c    Sun 
> Jul 23 13:23:42 2006
> @@ -209,6 +209,28 @@
>
>  char badUSBname[] = "-1/-1" ;
>
> +#ifdef __FreeBSD__
> +// This is in here until the libusb on FreeBSD supports the usb_clear_halt 
> function
> +int BSD_usb_clear_halt(usb_dev_handle *dev, unsigned int ep)
> +{
> +  int ret;
> +  struct usb_ctl_request ctl_req;
> +
> +  ctl_req.ucr_addr = 0; // Not used for this type of request
> +  ctl_req.ucr_request.bmRequestType = UT_WRITE_ENDPOINT;
> +  ctl_req.ucr_request.bRequest = UR_CLEAR_FEATURE;
> +  USETW(ctl_req.ucr_request.wValue, UF_ENDPOINT_HALT);
> +  USETW(ctl_req.ucr_request.wIndex, ep);
> +  USETW(ctl_req.ucr_request.wLength, 0);
> +  ctl_req.ucr_flags = 0;
> +
> +  if ((ret = ioctl(dev->fd, USB_DO_REQUEST, &ctl_req)) < 0)
> +      LEVEL_DATA("DS9490_clear_halt:  failed for %d", ep);
> +
> +       return ret;
> +}
> +#endif /* __FreeBSD__ */
> +
>  int DS9490_enumerate( void ) {
>      struct usb_list ul ;
>      int ret = 0 ;
> @@ -384,10 +406,10 @@
>
>                  // clear endpoints
>                  if ( (ret =
> -                        usb_clear_halt(usb, DS2490_EP3) ||
> -                        usb_clear_halt(usb, DS2490_EP2) ||
> -                        usb_clear_halt(usb, DS2490_EP1) ) ) {
> -                    LEVEL_DEFAULT("DS9490_open: usb_clear_halt failed 
> ret=%d\n", ret);
> +                        USB_CLEAR_HALT(usb, DS2490_EP3) ||
> +                        USB_CLEAR_HALT(usb, DS2490_EP2) ||
> +                        USB_CLEAR_HALT(usb, DS2490_EP1) ) ) {
> +                    LEVEL_DEFAULT("DS9490_open: USB_CLEAR_HALT failed 
> ret=%d\n", ret);
>                  } else if ( DS9490_setup_adapter(pn) ||
>                              DS9490_overdrive(ONEWIREBUSSPEED_REGULAR, pn) ||
>                              DS9490_level(MODE_NORMAL, pn) ) {
> @@ -584,8 +606,22 @@
>      int ret , loops = 0 ;
>      int i ;
>      usb_dev_handle * usb = pn->in->connin.usb.usb ;
> +#ifdef OW_DEBUG
> +    char s[97], t[4] ; // For my fancy display in the log
> +#endif
>
>      memset(buffer, 0, 32) ; // should not be needed
> +
> +    LEVEL_DETAIL("DS9490_getstatus: readlen=%d\n", readlen);
> +
> +#ifdef __FreeBSD__ // Clear the Interrupt read buffer before trying to get 
> status
> +    char junk[1500] ;
> +    if ( (ret=usb_bulk_read(usb,DS2490_EP1,(ASCII 
> *)junk,(size_t)1500,TIMEOUT_USB)) < 0 ) {
> +        STAT_ADD1_BUS(BUS_status_errors,pn->in);
> +        LEVEL_DATA("DS9490_getstatus: error reading ret=%d\n", ret);
> +        return -EIO ;
> +    }
> +#endif // __FreeBSD__
>      do {
>  #ifdef HAVE_USB_INTERRUPT_READ
>          // Fix from Wim Heirman -- kernel 2.6 is fussier about endpoint type
> @@ -597,7 +633,24 @@
>              LEVEL_DATA("DS9490_getstatus: error reading ret=%d\n", ret);
>              return -EIO ;
>          }
> +#ifdef OW_DEBUG
> +        if (error_level>4) { // LEVEL_DETAIL
> +            s[0] = '\0';
> +            for (i = 0; i < ret; i++) {
> +                sprintf(t,"-%02x",buffer[i]);
> +                strcat(s,t);
> +            }
> +            LEVEL_DETAIL("DS9490_getstatus: Bytes%s\n", s);
> +        }
> +#endif
>          if(ret > 16) {
> +            if (ret == 32) { // FreeBSD buffers the input, so this could 
> just be two readings
> +                if (!memcmp(buffer, &buffer[16], 6)) {
> +                    memmove(buffer, &buffer[16],16);
> +                    ret = 16;
> +                    LEVEL_DATA("DS9490_getstatus: Corrected buffer 32 byte 
> read\n", s);
> +                }
> +            }
>              for(i=16; i<ret; i++) {
>                  BYTE val = buffer[i];
>                  if(val != ONEWIREDEVICEDETECT) {
> @@ -810,7 +863,7 @@
>      //printf("DS9490_read\n");
>      if ((ret=usb_bulk_read(usb,DS2490_EP3,(ASCII*)buf,(int)size,TIMEOUT_USB 
> )) > 0) return ret ;
>      LEVEL_DATA("DS9490_read: failed ret=%d\n", ret);
> -    usb_clear_halt(usb,DS2490_EP3) ;
> +    USB_CLEAR_HALT(usb,DS2490_EP3) ;
>      STAT_ADD1_BUS(BUS_read_errors,pn->in) ;
>      return ret ;
>  }
> @@ -821,7 +874,7 @@
>      //printf("DS9490_write\n");
>      if ((ret=usb_bulk_write(usb,DS2490_EP2,(const ASCII *)buf,(const 
> int)size,TIMEOUT_USB )) > 0) return ret ;
>      LEVEL_DATA("DS9490_write: failed ret=%d\n", ret);
> -    usb_clear_halt(usb,DS2490_EP2) ;
> +    USB_CLEAR_HALT(usb,DS2490_EP2) ;
>      STAT_ADD1_BUS(BUS_write_errors,pn->in) ;
>      return ret ;
>  }
>
>
> --- /home/robert/build/owfs-2.4p3/module/owlib/src/c/ow_net.c   Tue Jun  6 
> 19:07:00 2006
> +++ /home/robert/build/owfs-2.4p3.rob/module/owlib/src/c/ow_net.c       Sun 
> Jul 23 11:23:41 2006
> @@ -109,8 +109,11 @@
>      memset( &hint, 0, sizeof(struct addrinfo) ) ;
>      hint.ai_flags = AI_PASSIVE ;
>      hint.ai_socktype = SOCK_STREAM ;
> +#ifdef __FreeBSD__
> +    hint.ai_family = AF_INET; // Until the code is fixed to bind to more 
> than one protocol
> +#else
>      hint.ai_family = AF_UNSPEC ;
> -
> +#endif
>      //printf("ServerAddr: [%s] [%s]\n", out->host, out->service);
>
>      if ( (ret=getaddrinfo( out->host, out->service, &hint, &out->ai )) ) {
>
>
> --- /home/robert/build/owfs-2.4p3/module/owlib/src/c/ow_tree.c  Sun May 21 
> 19:57:42 2006
> +++ /home/robert/build/owfs-2.4p3.rob/module/owlib/src/c/ow_tree.c      Sun 
> Jul 23 11:13:34 2006
> @@ -33,8 +33,19 @@
>
>
>  static void Device2Tree( const struct device * d, enum pn_type type ) {
> -    tsearch( d, &Tree[type], device_compare ) ;
> -    if (d->ft) qsort( d->ft,(size_t) d->nft,sizeof(struct 
> filetype),file_compare ) ;
> +       struct device *d_copy;
> +
> +    /*  In order for DeviceDestroy to work on FreeBSD we must copy the keys.
> +        Otherwise, tdestroy will attempt to free implicitly allocated 
> structures.
> +    */
> +
> +       if ( (d_copy = (struct device *)malloc(sizeof(struct device))) ) {
> +       memmove(d_copy, d, sizeof(struct device));
> +        tsearch( d_copy, &Tree[type], device_compare ) ;
> +        if (d_copy->ft) qsort( d_copy->ft,(size_t) d_copy->nft,sizeof(struct 
> filetype),file_compare ) ;
> +    } else {
> +        LEVEL_DATA("Device2Tree:  Could not allocate memory for device 
> %s\n",d->name);
> +    }
>  /*
>  {
>  int i ;
>
>
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys -- and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Owfs-developers mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/owfs-developers
>

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Owfs-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/owfs-developers

Reply via email to