Brian,

Thank you for the information. Sorry I didn't know that there is
already a patch. I'm working on the resolution problem now ( Change
SN9c202 to 1280x1024 ). But no luck so far.

Because I'm a Java developer and I don't know the Linux code format.
So first I want to make every function of this camera working. Then I
will learn the code format and submit a decent patch.

Because the auto exposure and white balance are in the same register.
So there is no way we can separate them to two functions if we don't
read the register value first.

Thank you.

struct sn9c20x_i2c_regs mt9m111_init[] = {
        {0xf0, 0x0000},
        /* Reset sensor */
        {0x0d, 0x0008},{0x0d, 0x0009},{0x0d, 0x0008},
        /* Select Page map 0x01
         * This means  all new writes now have the address prefix 0x1.
         * Example: 0x3a becomes 0x13a. */
        {0xf0, 0x0001},
        {0x3a, 0x7300},{0x9b, 0x7300},/* change pixel format of both
context */
        {0x06, 0x708e},
        /* Switch back to Page map 0x00 */
        {0xf0, 0x0000},
        {0xff, 0xffff},
};

int mt9m111_probe(struct usb_sn9c20x *dev)
{
        __u16 buf;
        int ret = -EINVAL;

        dev->camera.address = 0x5d;
        ret = sn9c20x_read_i2c_data16(dev, 2, 0xff, &buf);
        if ((ret == 0) && (buf == 0x143a))
                ret = MT9M111_SENSOR;
        return ret;
}

int mt9m111_set_exposure(struct usb_sn9c20x *dev)
{
        int ret = 0;
        int page=0;
        int exposure;

        exposure=dev->vsettings.exposure*10; // from 0 to 2550

        ret |= sn9c20x_write_i2c_data16(dev, 1, 0xF0, &page);
        ret |= sn9c20x_write_i2c_data16(dev, 1, 0x09, &exposure);

        return ret;
}

int mt9m111_set_autoexposure(struct usb_sn9c20x *dev)
{
        __u16 buf[1];
        int page = 0;
        int ret = 0;
        int data = 0x3080;

        switch (dev->vsettings.auto_exposure) {
        case V4L2_EXPOSURE_AUTO:
                data|=0x7000;
                data|=0x000C;
        break;
        case V4L2_EXPOSURE_MANUAL:
                data&=~0x7000;
        break;
        case V4L2_EXPOSURE_SHUTTER_PRIORITY:
                data|=0x7000;
                data&=~0x000C;
        break;
        case V4L2_EXPOSURE_APERTURE_PRIORITY:
                data|=0x7000;
                data&=~0x000C;
                data|=0x0004;
        break;
        default:
                return -EINVAL;
        }
        if (dev->vsettings.auto_whitebalance == 1) {
                data|=0x0002;
        } else if (dev->vsettings.auto_whitebalance == 0) {
                data&=~0x0002;
        }
        page=1;
        ret |= sn9c20x_write_i2c_data16(dev, 1, 0xF0, &page); //
Change to
page 1
        ret |= sn9c20x_write_i2c_data16(dev, 1, 0x06, &data); // Write
register 0x106
        page=0;
        ret |= sn9c20x_write_i2c_data16(dev, 1, 0xF0, &page); //
Change to
page 0

        if (ret < 0) {
                UDIA_ERROR("Error: setting of auto exposure failed: "
                        "error while writing to IFP-register 0x06\n");
                return ret;
        }
        return 0;
}

int mt9m111_set_autowhitebalance(struct usb_sn9c20x *dev)
{
        return mt9m111_set_autoexposure(dev);
}
--~--~---------~--~----~------------~-------~--~----~
Lets make microdia webcams plug'n play, (currently plug'n pray)
To post to this group, send email to [email protected]
Visit us online https://groups.google.com/group/microdia
-~----------~----~----~----~------~----~------~--~---

Reply via email to