Changing the poer on a USB device
Hans Petter Selasky
hselasky at c2i.net
Sat Jul 28 06:39:03 UTC 2007
Hi Kirk!
There is a function that is called "usbd_do_request()" in the kernel that will
do this.
Here is an example from my new USB stack:
static u_int8_t
umass_bbb_get_max_lun(struct umass_softc *sc)
{
usb_device_request_t req;
usbd_status err;
u_int8_t buf = 0;
/* The Get Max Lun command is a class-specific request. */
req.bmRequestType = UT_READ_CLASS_INTERFACE;
req.bRequest = UR_BBB_GET_MAX_LUN;
USETW(req.wValue, 0);
req.wIndex[0] = sc->sc_iface_no;
req.wIndex[1] = 0;
USETW(req.wLength, 1);
err = usbd_do_request(sc->sc_udev, &req, &buf);
if (err) {
buf = 0;
/* Device doesn't support Get Max Lun request. */
printf("%s: Get Max Lun not supported (%s)\n",
sc->sc_name, usbd_errstr(err));
}
return buf;
}
--HPS
On Friday 27 July 2007, Kirk Davis wrote:
> Hi,
> I am trying to write a device driver for FreeBSD that will
> detect and change a newer blackberry. I have the driver detecting and
> enabling the port when I insert the blackberry but it only configs the
> USB port for 100mA rate. The blackberry needs 500mA and it displays
> some information on the blackberry screen that they current is to low.
>
> Looking at some other code that was written for libusb it looks
> like that is what is needed to turn on the charging:
>
> void charge(struct usb_dev_handle *handle)
> {
> // the special sauce... these steps seem to do the trick
> // for the 7750 series... needs testing on others
> char buffer[2];
> usb_control_msg(handle, 0xc0, 0xa5, 0, 1, buffer, 2, 100);
> usb_control_msg(handle, 0x40, 0xa2, 0, 1, buffer, 0, 100);
> }
>
>
> I'm a weak C programmer and this is my first attempt at a
> driver. Can anyone give my some advise on how I would do something like
> this in a driver? I'm not sure of the kernel equivalent to
> usb_control_msg.
>
> Thanks, Kirk
>
>
>
> Kirk Davis
> Sr. Network Analyst, ITS
> Edmonton Public Schools
>
More information about the freebsd-usb
mailing list