webcamd and cameras with Micron (MT9M0x1 and MT9T0x1) chips

Hans Petter Selasky hselasky at c2i.net
Sun Apr 25 07:47:01 UTC 2010


On Saturday 24 April 2010 21:18:09 maillist at diode.be wrote:
> Quoting Hans Petter Selasky <hselasky at c2i.net>:
> > Hi,
> >
> >> For both Micron cameras, #webcamd -B just gives `Cannot find USB
> >> device'.
> >
> > This usually happens when the webcamd is not listed.
> >
> >> dmesg output for the Mightex camera (MT9M001 chip):
> >> ugen3.2: <Mightex> at usbus3
> >>
> >> and usbconfig -d ugen3.2 dump_device_desc gives:
> >> ugen3.2: <USB-MT9M001-2 Mightex> at usbus3, cfg=0 md=HOST spd=HIGH
> >> (480Mbps) pwr=ON
> >>
> >>     bLength = 0x0012
> >>     bDescriptorType = 0x0001
> >>     bcdUSB = 0x0200
> >>     bDeviceClass = 0x0000
> >>     bDeviceSubClass = 0x0000
> >>     bDeviceProtocol = 0x0000
> >>     bMaxPacketSize0 = 0x0040
> >>     idVendor = 0x04b4
> >>     idProduct = 0x0228
> >>     bcdDevice = 0x0000
> >>     iManufacturer = 0x0001  <Mightex>
> >>     iProduct = 0x0002  <USB-MT9M001-2>
> >>     iSerialNumber = 0x0000  <no string>
> >>     bNumConfigurations = 0x0001
> >>
> >>
> >> For the MT9T031 camera (likely prototype), dmesg gives:
> >> ugen3.2: <Micron> at usbus3
> >>
> >> and usbconfig -d ugen3.2 dump_device_desc:
> >> ugen3.2: <Demo2A Micron> at usbus3, cfg=0 md=HOST spd=HIGH (480Mbps)
> >> pwr=ON
> >>
> >>     bLength = 0x0012
> >>     bDescriptorType = 0x0001
> >>     bcdUSB = 0x0200
> >>     bDeviceClass = 0x0000
> >>     bDeviceSubClass = 0x0000
> >>     bDeviceProtocol = 0x0000
> >>     bMaxPacketSize0 = 0x0040
> >>     idVendor = 0x0634
> >>     idProduct = 0x1007
> >>     bcdDevice = 0x0021
> >>     iManufacturer = 0x0001  <Micron>
> >>     iProduct = 0x0002  <Demo2A>
> >>     iSerialNumber = 0x0000  <no string>
> >>     bNumConfigurations = 0x0001
> >>
> >>
> >>
> >>
> >> Now, I have no coding skills, but thought it would be good to have a
> >> look into the driver code. I hoped I would find Vendor and Product
> >> id's that differed from how the camera identified, this explaining the
> >> refusal to associate. But while some other v4l drivers appear to
> >> contain things like {USB_DEVICE(0xXXXX, 0xXXXX), .driver_info=XXXXX},
> >> such code is absent from the mt9xxxx.c files. Instead, there is a
> >> function data = reg_read(client, MT9M001_CHIP_VERSION) that does some
> >> sort of identification. But this is on the i2c level, reading the chip
> >> version number. I thought that for doing this, the system would
> >> already need to know what Micron chip it is dealing with.
> >>
> >> Any thoughts would be appreciated.
> >
> > Hi,
> >
> > I did a little bit of grepping, and I think you need to patch the
> > following file to get your webcam working:
> >
> > v4l-dvb/linux/drivers/media/video/gspca/sn9c20x.c
> >
> > You can use this entry as an example:
> >
> > {USB_DEVICE(0x0c45, 0x6240), SN9C20X(MT9M001, 0x5d, 0)},
> >
> > The iProduct dump indicates this is the right place to hack for the
> > MT9M001 one :-)
> >
> > --HPS
> 
> I added
> {USB_DEVICE(0x04b4, 0x0228), SN9C20X(MT9M001, 0x5d, 0)},
> to the list, with 0x5d as i2c address as the other two MT9M001 entries
> have it too. After re-making ulinux and using the new webcamd from
> that directory, I get
> 
> Attached ugen3.2[0] to cuse init 0
> Cannot find USB device
> 
> Interestingly, the other (MT9T031) camera, for which nothing changed,
> only states `Cannot find USB device' without returning `Attached
> [...]'. The Logitech cam, which used to work, states `Attached [...]'
> and then `Creating /dev/video0'.
> 
> But for this Logitech cam, pwcview now complains `Failed to access
> webcam: Device not configured'. Note that I used the webcamd from
> ports before, so I must have messed something up. I updated to the
> latest svn version. I will update my ports too, as this doesn't appear
> to have anything to do with the change to the code I made.
> 
> On the other hand, webcamd still returns `Cannot find USB device' for
> the MT9M001 camera. Maybe simply adding the corresponding USB_DEVICE()
> entry was not what you meant?

After you add that USB_DEVICE() entry, the following code should be called.

Try adding

CFLAGS+= -g

in the Makefile.

Then run webcamd via gdb. 

In gdb type:

break gspca_dev_probe
run

at first break:

next

If you don't get the break, you're running an older version of webcamd. Try 
svn up! You might have to do:

make fetch_clean
make fetch

cd patches/
./do_patch.sh

After svn up.

/* -- device connect -- */
static int sd_probe(struct usb_interface *intf,
                    const struct usb_device_id *id)
{
        return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
                                THIS_MODULE);
}

--HPS


More information about the freebsd-usb mailing list