Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 29 Sep 2007 07:42:03 -0700
From:      Chuck T. <freebsdfan@hotmail.com>
To:        Xiaofan Chen <xiaofanc@gmail.com>
Cc:        freebsd-usb@freebsd.org
Subject:   RE: snd_uaudio with libusb ?
Message-ID:  <BAY116-W345418CFE1BA38690D04A8C7B30@phx.gbl>
In-Reply-To: <a276da400709290213v6d747d3bh4f3e4de212d5b602@mail.gmail.com>
References:  <BAY116-W4072AA56B15EBD7B73FAC9C7B20@phx.gbl> <a276da400709281906m28bacac2r80c27074e222c597@mail.gmail.com> <BAY116-W245D862663F945A3204C2CC7B30@phx.gbl>  <a276da400709290213v6d747d3bh4f3e4de212d5b602@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

> On 9/29/07, Chuck T. <freebsdfan@hotmail.com> wrote:
> >
> > >I think your device is a USB composite USB device with two
> > >interfaces (one for USB audio and the other for GPIO). How
> > >do you control the GPIO under Linux (by control transfer
> > >or interrupt/bulk transfer)? If the Linux application indeed
> > >works at the same time as the USB audio, then Linux
> > >does bind different driver to different interfaces (one for
> > >the usb audio interface and no driver for the GPIO interface).
> >
> > I talk to the GPIO bits via vendor specific requests to the control pip=
e.
> > I do a usb_open() when my application loads and never close it.  When I=
 need
> > to set a GPIO bit I use usb_control_msg().  I've never "looked under th=
e
> > covers" to see why it works, but it does.
> >
>=20
> So this works under Linux but not FreeBSD. Maybe this is just a limitatio=
n
> of libusb under FreeBSD. Anyway, it is said that libusb is just a thin
> wrapper on top of USB. You may want to use the lower level api instead.



Yes I believe that is the case.  I'm hoping there is a simple fix that will=
 allow

me to use libusb for OS portability.  I don't want to have to write OS spec=
ific

code if I can avoid it.  I've been using FreeBSD since the 1.0 and I really

want my app to run on FreeBSD but frankly 90% of the users will probably

be running on Linux anyway.


> I confess I do not know further (like how to bind ugen to individual inte=
rfaces
> and use IOCTL to perform usb transfer). But if post some codes,
> others may be able to help you.



Sure.  I doubt it will help as the problem is related to libusb but here's =
my code:



static usb_dev_handle *udev =3D NULL;



void UsbKeyRadio(int bKey)

{

   int ret;

   char Buf[2] =3D {0xff,0xff};



   if(bKey) {

   // Set PTT bit low

      Buf[0] =3D 0;

   }

   else {

   // Set PTT bit high

      Buf[0] =3D 0x20;

   }



   ret =3D usb_control_msg(udev,USB_TYPE_VENDOR,WRITE_GPIO,0,0,Buf,2,1000);

   if(ret !=3D 2) {

      LOG_ERROR(("%s#%d: usb_control_msg returned %d (%s)\n",__FUNCTION__,

                 __LINE__,ret,Err2String(errno)));

   }

}



int UsbInit(void)

{

   struct usb_bus *bus;

   struct usb_device *dev =3D NULL;

   int Ret =3D ERR_USB_DEV_OPEN;   // assume the worse



   usb_init();

   usb_find_busses();

   usb_find_devices();



   for (bus =3D usb_busses; bus && dev =3D=3D NULL; bus =3D bus->next) {

       for (dev =3D bus->devices; dev; dev =3D dev->next) {

          if(dev->descriptor.idVendor =3D=3D 0x074d &&=20

             dev->descriptor.idProduct =3D=3D 0x3556)

          {

             break;

          }

          else if(dev->descriptor.idVendor =3D=3D 0x077d &&=20

             dev->descriptor.idProduct =3D=3D 0x07af)

          {

             break;

          }

       }

   }



   if(dev !=3D NULL) {

      if((udev =3D usb_open(dev)) !=3D NULL) {

         Ret =3D 0;

      }

   }

   else {

      LOG_ERROR(("%s: USB device not found\n",__FUNCTION__));

   }



   return Ret;

}




_________________________________________________________________
Discover the new Windows Vista
http://search.msn.com/results.aspx?q=3Dwindows+vista&mkt=3Den-US&form=3DQBR=
E=



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?BAY116-W345418CFE1BA38690D04A8C7B30>