OK, here a rebased version. GWater
GWater schrieb:
We had some problems with sensor probing and decided to use a new procdure. Here is my second try to solve that. The first two paches are not vital but I didn't want to rebase.It currently breaks the module since I have no idea how to assign the correct formats and resolutions. I also remeber Brian had developed a new system for to make YUV422 work. Maybe we can include this right now.Let's get this over done. GWater
From ad6babefa443680cbd285bd127d5890187c4c53e Mon Sep 17 00:00:00 2001
From: GWater <[EMAIL PROTECTED]>
Date: Sat, 22 Nov 2008 13:39:43 +0100
Subject: [PATCH] New system regarding sensor assignment
Sensors are now assigned using the dev_microdia_assign_sensor()
function.
Initilization is seperated from that and probing has been removed.
FIXME:
- No support for 6270 and 62b0. These need probing.
- Resolutions and Formats are not geing assigned.
Therefore this patch temporarily breaks video capture.
Signed-off-by: GWater <[EMAIL PROTECTED]>
---
microdia-dev.c | 133 ++++++++++++++++++++++++++++++++++++--------------------
microdia.h | 29 +++++++------
micron.c | 53 ----------------------
micron.h | 4 +-
omnivision.c | 122 ++++++++++++++++++++-------------------------------
omnivision.h | 3 +-
sn9c20x.c | 57 ++++++++++--------------
7 files changed, 176 insertions(+), 225 deletions(-)
diff --git a/microdia-dev.c b/microdia-dev.c
index f3cdf4d..30f03c0 100644
--- a/microdia-dev.c
+++ b/microdia-dev.c
@@ -38,58 +38,121 @@ struct sensor_info sensors[] = {
.id = OV9650_SENSOR,
.name = "OV9650",
.address = 0x30,
- .probe = ov_probe
+ .initialize = ov_initialize,
+ .set_hvflip = ov965x_set_hvflip,
+ .set_exposure = ov965x_set_exposure,
+ .set_auto_exposure = ov965x_set_autoexposure,
+ .flip_detect = ov965x_flip_detect,
},
{
.id = OV9655_SENSOR,
.name = "OV9655",
.address = 0x30,
- .probe = ov_probe
+ .initialize = ov_initialize,
},
{
.id = SOI968_SENSOR,
.name = "SOI968",
.address = 0x30,
- .probe = ov_probe
+ .initialize = ov_initialize,
+ .set_exposure = soi968_set_exposure,
+ .set_auto_exposure = ov965x_set_autoexposure,
},
{
.id = OV7660_SENSOR,
.name = "OV7660",
.address = 0x21,
- .probe = ov_probe
+ .initialize = ov_initialize,
+ .set_exposure = ov7660_set_exposure,
+ .set_auto_exposure = ov7660_set_autoexposure,
},
{
.id = OV7670_SENSOR,
.name = "OV7670",
.address = 0x21,
- .probe = ov_probe
- },
- {
- .id = MT9M111_SENSOR,
- .name = "MT9M111",
- .address = 0x5d,
- .probe = mt9m111_probe
+ .initialize = ov_initialize,
+ .flip_detect = ov7670_flip_detect,
},
{
.id = MT9V111_SENSOR,
.name = "MT9V111",
.address = 0x5c,
- .probe = mt9v111_probe
+ .initialize = mt9v111_initialize,
+ .set_hvflip = mt9v111_set_hvflip,
+ .set_exposure = mt9v111_set_exposure,
+ .set_auto_exposure = mt9v111_set_autoexposure,
+ },
+ {
+ .id = MT9M111_SENSOR,
+ .name = "MT9M111",
+ .address = 0x5d,
+ .initialize = mt9m111_initialize,
},
{
.id = MT9V011_SENSOR,
.name = "MT9V011",
.address = 0x5d,
- .probe = mt9v011_probe
+ .initialize = mt9v011_initialize,
+ .set_hvflip = mt9v011_set_hvflip,
+ .set_exposure = mt9v011_set_exposure,
},
{
.id = MT9M001_SENSOR,
.name = "MT9M001",
.address = 0x5d,
- .probe = mt9m001_probe
+ .initialize = mt9m001_initialize,
},
};
+static __u16 known_cams[][2] = {
+ {0x6240, MT9M001_SENSOR},
+ {0x6242, MT9M111_SENSOR},
+ {0x6248, OV9655_SENSOR},
+ {0x624e, SOI968_SENSOR},
+ {0x624f, OV9650_SENSOR},
+ {0x6253, OV9650_SENSOR},
+ {0x6260, OV7670_SENSOR},
+ {0x627b, OV7660_SENSOR},
+ {0x627f, OV9650_SENSOR},
+ {0x6288, OV9655_SENSOR},
+ {0x628e, SOI968_SENSOR},
+ {0x62a0, OV7670_SENSOR},
+ {0x62b3, OV9655_SENSOR},
+ {0x62bb, OV7660_SENSOR},
+};
+
+int dev_microdia_assign_sensor(struct usb_microdia *dev)
+{
+ int i, j;
+ __u16 pid = le16_to_cpu(dev->udev->descriptor.idProduct);
+
+ /* FIXME: For 6270 and 62b0 perform probe */
+
+ for (i = 0; i < ARRAY_SIZE(known_cams); i++) {
+ if (pid == known_cams[i][0]) {
+ for (j = 0; j < ARRAY_SIZE(sensors); j++) {
+ if (known_cams[i][1] == sensors[j].id) {
+ dev->camera.sensor = &sensors[j];
+ return 0;
+ }
+ }
+ }
+ }
+
+ UDIA_ERROR("Could not assign sensor: "
+ "Please report to [email protected] .\n");
+
+ return -EINVAL;
+}
+
+int dev_microdia_initialize_sensor(struct usb_microdia *dev)
+{
+ int ret = -ENODEV;
+ if (dev && dev->camera.sensor->initialize)
+ ret = dev->camera.sensor->initialize(dev);
+ return ret;
+}
+
/**
* @brief Wrapper function for camera-setting functions
*
@@ -169,8 +232,8 @@ int dev_microdia_camera_set_gamma(struct usb_microdia *dev)
*/
int dev_microdia_camera_set_exposure(struct usb_microdia *dev)
{
- if (dev && dev->camera.set_exposure != NULL)
- return dev->camera.set_exposure(dev);
+ if (dev && dev->camera.sensor->set_exposure != NULL)
+ return dev->camera.sensor->set_exposure(dev);
return 0;
}
@@ -186,8 +249,8 @@ int dev_microdia_camera_set_exposure(struct usb_microdia
*dev)
int dev_microdia_camera_set_hvflip(struct usb_microdia *dev)
{
int ret = -ENODEV;
- if (dev && dev->camera.set_hvflip)
- ret = dev->camera.set_hvflip(dev);
+ if (dev && dev->camera.sensor->set_hvflip)
+ ret = dev->camera.sensor->set_hvflip(dev);
return ret;
}
@@ -237,8 +300,8 @@ int dev_microdia_camera_set_rgb_gain(struct usb_microdia
*dev)
int dev_microdia_camera_set_auto_exposure(struct usb_microdia *dev)
{
int ret = -ENODEV;
- if (dev && dev->camera.set_auto_exposure)
- ret = dev->camera.set_auto_exposure(dev);
+ if (dev && dev->camera.sensor->set_auto_exposure)
+ ret = dev->camera.sensor->set_auto_exposure(dev);
return ret;
}
@@ -254,39 +317,13 @@ int dev_microdia_camera_set_auto_exposure(struct
usb_microdia *dev)
int dev_microdia_camera_set_auto_whitebalance(struct usb_microdia *dev)
{
int ret = -ENODEV;
- if (dev && dev->camera.set_auto_whitebalance)
- ret = dev->camera.set_auto_whitebalance(dev);
+ if (dev && dev->camera.sensor->set_auto_whitebalance)
+ ret = dev->camera.sensor->set_auto_whitebalance(dev);
return ret;
}
/**
- * @brief function to probe sensor attached to bridge
- *
- * @param dev pointer to device structure
- *
- * @returns 0 or negative error value
- *
- * This function will probe the bridge for the proper sensor
- */
-int dev_microdia_probe_sensor(struct usb_microdia *dev)
-{
- int i, ret;
- dev->camera.sensor_flags = SN9C20X_I2C_2WIRE;
-
- for (i = 0; i < ARRAY_SIZE(sensors); i++) {
- dev->camera.sensor_slave_address = sensors[i].address;
- ret = sensors[i].probe(dev);
- if (ret == sensors[i].id) {
- UDIA_INFO("Detected sensor: %s\n", sensors[i].name);
- return ret;
- }
- }
-
- return UNKNOWN_SENSOR;
-}
-
-/**
* @brief Wrapper function for device-specific initialization functions
*
* @param dev Pointer to device structure
diff --git a/microdia.h b/microdia.h
index 09f3e9f..f615fd7 100644
--- a/microdia.h
+++ b/microdia.h
@@ -335,17 +335,20 @@ struct sensor_info {
__u8 id;
__u8 *name;
__u8 address;
- int (*probe) (struct usb_microdia *dev);
+
+/* sensor specific functions */
+ int (*initialize) (struct usb_microdia *dev);
+ int (*set_exposure) (struct usb_microdia *dev);
+ int (*set_auto_exposure) (struct usb_microdia *dev);
+ int (*set_auto_whitebalance) (struct usb_microdia *dev);
+ int (*flip_detect) (struct usb_microdia *dev);
+ int (*set_hvflip) (struct usb_microdia *dev);
};
extern struct sensor_info sensors[];
struct microdia_camera {
- __u8 sensor_slave_address;
- __u8 sensor_flags;
- __u8 sensor;
-
/* supported resolutions */
__u8 nmodes;
struct microdia_video_resolution *modes;
@@ -353,22 +356,21 @@ struct microdia_camera {
__u8 nfmts;
struct microdia_video_format *fmts;
+/* image sensor */
+ struct sensor_info *sensor;
+
+/* SCCB/I2C interface */
+ __u8 i2c_flags;
+
/* bridge functions */
- int (*initialize) (struct usb_microdia *dev);
int (*enable_video) (struct usb_microdia *dev, int enable);
/* image quality functions */
-
int (*set_contrast) (struct usb_microdia *dev);
int (*set_brightness) (struct usb_microdia *dev);
int (*set_gamma) (struct usb_microdia *dev);
- int (*set_exposure) (struct usb_microdia *dev);
- int (*flip_detect) (struct usb_microdia *dev);
- int (*set_hvflip) (struct usb_microdia *dev);
int (*set_sharpness) (struct usb_microdia *dev);
int (*set_rgb_gain) (struct usb_microdia *dev);
- int (*set_auto_exposure) (struct usb_microdia *dev);
- int (*set_auto_whitebalance) (struct usb_microdia *dev);
};
/**
@@ -424,7 +426,8 @@ void usb_microdia_delete(struct kref *);
int dev_microdia_initialize_device(struct usb_microdia *, __u32 flags);
-int dev_microdia_probe_sensor(struct usb_microdia *);
+int dev_microdia_assign_sensor(struct usb_microdia *dev);
+int dev_microdia_initialize_sensor(struct usb_microdia *dev);
int dev_microdia_enable_video(struct usb_microdia *, int);
int dev_microdia_camera_settings(struct usb_microdia *);
int dev_microdia_camera_set_contrast(struct usb_microdia *);
diff --git a/micron.c b/micron.c
index cc70fec..3b069bb 100644
--- a/micron.c
+++ b/micron.c
@@ -491,9 +491,6 @@ int mt9v011_probe(struct usb_microdia *dev)
if (buf[0] != 0x82)
return -EINVAL;
if (buf[1] == 0x43) {
- mt9v011_initialize(dev);
- dev->camera.set_hvflip = mt9v011_set_hvflip;
- dev->camera.set_exposure = mt9v011_set_exposure;
dev->camera.modes = micron_resolutions;
dev->camera.nmodes = ARRAY_SIZE(micron_resolutions);
dev->camera.fmts = mt9x0xx_fmts;
@@ -580,10 +577,6 @@ int mt9v111_probe(struct usb_microdia *dev)
if (buf[0] != 0x82)
return -EINVAL;
if (buf[1] == 0x3a) {
- mt9v111_initialize(dev);
- dev->camera.set_hvflip = mt9v111_set_hvflip;
- dev->camera.set_exposure = mt9v111_set_exposure;
- dev->camera.set_auto_exposure =
mt9v111_set_autoexposure;
dev->camera.modes = micron_resolutions;
dev->camera.nmodes = ARRAY_SIZE(micron_resolutions);
dev->camera.fmts = mt9v111_fmts;
@@ -626,27 +619,6 @@ int mt9m001_initialize(struct usb_microdia *dev)
return ret;
}
-int mt9m001_probe(struct usb_microdia *dev)
-{
- int ret;
- __u8 buf[2];
- ret = sn9c20x_read_i2c_data(dev, 2, 0x00, buf);
- if (ret == 0) {
- if (buf[0] != 0x84)
- return -EINVAL;
- if (buf[1] == 0x31) {
- mt9m001_initialize(dev);
- dev->camera.modes = micron_resolutions;
- dev->camera.nmodes = ARRAY_SIZE(micron_resolutions);
- dev->camera.fmts = mt9x0xx_fmts;
- dev->camera.nfmts = ARRAY_SIZE(mt9x0xx_fmts);
- return MT9M001_SENSOR;
- }
- }
-
- return -EINVAL;
-}
-
/**
* @brief Initialize mt9m111 sensors
*
@@ -680,31 +652,6 @@ int mt9m111_initialize(struct usb_microdia *dev)
return ret;
}
-int mt9m111_probe(struct usb_microdia *dev)
-{
- int ret;
- __u8 buf[2] = {0x00, 0x00};
-
- /* Select address-space: Sensor */
- sn9c20x_write_i2c_data(dev, 2, 0xf0, buf);
-
- ret = sn9c20x_read_i2c_data(dev, 2, 0x00, buf);
- if (ret == 0) {
- if (buf[0] != 0x14)
- return -EINVAL;
- if (buf[1] == 0x3a) {
- mt9m111_initialize(dev);
- dev->camera.modes = mt9m111_resolutions;
- dev->camera.nmodes = ARRAY_SIZE(mt9m111_resolutions);
- dev->camera.fmts = mt9m111_fmts;
- dev->camera.nfmts = ARRAY_SIZE(mt9m111_fmts);
- return MT9M111_SENSOR;
- }
- }
-
- return -EINVAL;
-}
-
int mt9m111_set_raw(struct usb_microdia *dev)
{
__u16 buf;
diff --git a/micron.h b/micron.h
index 4e2ee99..b469455 100644
--- a/micron.h
+++ b/micron.h
@@ -115,10 +115,10 @@ int mt9v011_set_hvflip(struct usb_microdia *dev);
int mt9v011_initialize(struct usb_microdia *dev);
int mt9v011_probe(struct usb_microdia *dev);
-int mt9m111_probe(struct usb_microdia *dev);
int mt9m111_set_raw(struct usb_microdia *dev);
int mt9m111_set_yuv422(struct usb_microdia *dev);
+int mt9m111_initialize(struct usb_microdia *dev);
-int mt9m001_probe(struct usb_microdia *dev);
+int mt9m001_initialize(struct usb_microdia *dev);
#endif
diff --git a/omnivision.c b/omnivision.c
index 36eb280..defcd5a 100644
--- a/omnivision.c
+++ b/omnivision.c
@@ -598,96 +598,70 @@ struct microdia_video_resolution ov7660_resolutions[] = {
},
};
-int ov_probe(struct usb_microdia *dev)
-{
- int ret;
- __u8 buf[2];
- ret = sn9c20x_read_i2c_data(dev, 2, 0x0a, buf);
- if (ret == 0) {
- if (buf[0] != 0x76 && buf[0] != 0x96)
- return -EINVAL;
- if (buf[1] == 0x60) {
- ov_initialize(dev, ov7660_init,
ARRAY_SIZE(ov7660_init));
- dev->camera.set_exposure = ov7660_set_exposure;
- dev->camera.set_auto_exposure = ov7660_set_autoexposure;
- dev->camera.modes = ov7660_resolutions;
- dev->camera.nmodes = ARRAY_SIZE(ov7660_resolutions);
- dev->camera.fmts = ov_fmts;
- dev->camera.nfmts = ARRAY_SIZE(ov_fmts);
- return OV7660_SENSOR;
- }
- if (buf[1] == 0x70) {
- ov_initialize(dev, ov7670_init,
ARRAY_SIZE(ov7670_init));
- dev->camera.flip_detect = ov7670_flip_detect;
- dev->camera.modes = ov7670_resolutions;
- dev->camera.nmodes = ARRAY_SIZE(ov7670_resolutions);
- dev->camera.fmts = ov_fmts;
- dev->camera.nfmts = ARRAY_SIZE(ov_fmts);
- return OV7670_SENSOR;
- }
- if (buf[1] == 0x52) {
- ov_initialize(dev, ov9650_init,
ARRAY_SIZE(ov9650_init));
- dev->camera.set_hvflip = ov965x_set_hvflip;
- dev->camera.set_exposure = ov965x_set_exposure;
- dev->camera.set_auto_exposure = ov965x_set_autoexposure;
- dev->camera.flip_detect = ov965x_flip_detect;
- dev->camera.modes = ov965x_resolutions;
- dev->camera.nmodes = ARRAY_SIZE(ov965x_resolutions);
- dev->camera.fmts = ov_fmts;
- dev->camera.nfmts = ARRAY_SIZE(ov_fmts);
- return OV9650_SENSOR;
- }
- if (buf[1] == 0x56 || buf[1] == 0x57) {
- ov_initialize(dev, ov9655_init,
ARRAY_SIZE(ov9655_init));
- dev->camera.modes = ov7670_resolutions;
- dev->camera.nmodes = ARRAY_SIZE(ov7670_resolutions);
- dev->camera.fmts = ov_fmts;
- dev->camera.nfmts = ARRAY_SIZE(ov_fmts);
- return OV9655_SENSOR;
- }
- if (buf[1] == 0x28) {
- ov_initialize(dev, soi968_init,
ARRAY_SIZE(soi968_init));
- dev->camera.set_exposure = soi968_set_exposure;
- dev->camera.set_auto_exposure = ov965x_set_autoexposure;
- dev->camera.modes = soi968_resolutions;
- dev->camera.nmodes = ARRAY_SIZE(soi968_resolutions);
- dev->camera.fmts = ov_fmts;
- dev->camera.nfmts = ARRAY_SIZE(ov_fmts);
- return SOI968_SENSOR;
- }
- }
-
- return -EINVAL;
-}
-
/**
* @brief Initialize ov sensors
*
* @param dev Pointer to device structure
- * @param ov_init Data array for initialization
- * @param array_size size of ov_init
*
* @return 0 or negative error code
*
*/
-int ov_initialize(struct usb_microdia *dev, __u8 ov_init[][2], int array_size)
+int ov_initialize(struct usb_microdia *dev)
{
int i;
int ret = 0;
- __u8 value, reg;
-
- for (i = 0; i < array_size; i++) {
- reg = ov_init[i][0];
- value = ov_init[i][1];
- ret = sn9c20x_write_i2c_data(dev, 1, reg, &value);
- if (ret < 0) {
- UDIA_INFO("Sensor Init Error (%d). line %d\n", ret, i);
- break;
- }
+
+ switch (dev->camera.sensor->id) {
+ case SOI968_SENSOR:
+ for (i = 0; i < ARRAY_SIZE(soi968_init); i++) {
+ ret = sn9c20x_write_i2c_data(dev, 1,
+ soi968_init[i][0], &soi968_init[i][1]);
+ if (ret < 0)
+ goto err;
+ }
+ break;
+ case OV9650_SENSOR:
+ for (i = 0; i < ARRAY_SIZE(ov9650_init); i++) {
+ ret = sn9c20x_write_i2c_data(dev, 1,
+ ov9650_init[i][0], &ov9650_init[i][1]);
+ if (ret < 0)
+ goto err;
+ }
+ break;
+ case OV9655_SENSOR:
+ for (i = 0; i < ARRAY_SIZE(ov9655_init); i++) {
+ ret = sn9c20x_write_i2c_data(dev, 1,
+ ov9655_init[i][0], &ov9655_init[i][1]);
+ if (ret < 0)
+ goto err;
+ }
+ break;
+ case OV7670_SENSOR:
+ for (i = 0; i < ARRAY_SIZE(ov7670_init); i++) {
+ ret = sn9c20x_write_i2c_data(dev, 1,
+ ov7670_init[i][0], &ov7670_init[i][1]);
+ if (ret < 0)
+ goto err;
+ }
+ break;
+ case OV7660_SENSOR:
+ for (i = 0; i < ARRAY_SIZE(ov7660_init); i++) {
+ ret = sn9c20x_write_i2c_data(dev, 1,
+ ov7660_init[i][0], &ov7660_init[i][1]);
+ if (ret < 0)
+ goto err;
+ }
+ break;
+
+ default:
+ return -EINVAL;
}
return ret;
+err:
+ UDIA_ERROR("Sensor Init failed (%d)! - line %d\n", ret, i);
+ return ret;
}
/**
diff --git a/omnivision.h b/omnivision.h
index e08092a..1403a18 100644
--- a/omnivision.h
+++ b/omnivision.h
@@ -547,7 +547,6 @@ int ov965x_set_exposure(struct usb_microdia *);
int ov965x_set_autoexposure(struct usb_microdia *dev);
int ov965x_flip_detect(struct usb_microdia *dev);
-int ov_probe(struct usb_microdia *dev);
-int ov_initialize(struct usb_microdia *dev, __u8 ov_init[][2], int array_size);
+int ov_initialize(struct usb_microdia *dev);
#endif
diff --git a/sn9c20x.c b/sn9c20x.c
index a26ae01..bde5b9b 100644
--- a/sn9c20x.c
+++ b/sn9c20x.c
@@ -44,7 +44,7 @@
*/
int sn9c20x_initialize(struct usb_microdia *dev)
{
- int ret, i, sensor;
+ int ret, i;
__u16 reg;
__u8 value;
@@ -99,15 +99,6 @@ int sn9c20x_initialize(struct usb_microdia *dev)
{0x11bf, 0x00},
};
- __u8 lens_gain[48] = {
- 0x10, 0x21, 0x34, 0x40, 0x47, 0x4f, 0x57, 0x5f,
- 0x64, 0x68, 0x6d, 0x73, 0x79, 0x80, 0x89, 0x97,
- 0x0d, 0x1c, 0x2a, 0x33, 0x38, 0x3d, 0x44, 0x4a,
- 0x4e, 0x52, 0x56, 0x5b, 0x61, 0x68, 0x6f, 0x7a,
- 0x0d, 0x1a, 0x2a, 0x31, 0x36, 0x3b, 0x41, 0x47,
- 0x4a, 0x4e, 0x53, 0x58, 0x5d, 0x64, 0x6b, 0x76
- };
-
__u8 qtable1[64] = {
0x0d, 0x08, 0x08, 0x0d, 0x08, 0x08, 0x0d, 0x0d,
0x0d, 0x0d, 0x11, 0x0d, 0x0d, 0x11, 0x15, 0x21,
@@ -160,21 +151,19 @@ int sn9c20x_initialize(struct usb_microdia *dev)
dev->camera.set_sharpness = sn9c20x_set_sharpness;
dev->camera.set_rgb_gain = sn9c20x_set_rgb_gain;
- sensor = dev_microdia_probe_sensor(dev);
- if (sensor == UNKNOWN_SENSOR) {
- UDIA_ERROR("Failed to detect sensor.\n");
- ret = -ENODEV;
+ ret = dev_microdia_assign_sensor(dev);
+ if (ret < 0)
goto err;
- }
- dev->camera.sensor = sensor;
-
- if (!(sensor == OV9650_SENSOR || sensor == OV9655_SENSOR))
- memset(lens_gain, 0x00, 48);
- ret = usb_microdia_control_write(dev, 0x11c0, lens_gain, 48);
+ ret = dev_microdia_initialize_sensor(dev);
if (ret < 0)
goto err;
+ /** FIXME: Assign sensor-specific reslutions and formats
+ * Brian developed a new system for that with his YUV422
+ * patch for OV sensors.
+ */
+
return 0;
err:
@@ -231,7 +220,7 @@ int sn9c20x_set_LEDs(struct usb_microdia *dev, int enable)
int ret;
__u8 led[2];
- int sensor = dev->camera.sensor;
+ int sensor = dev->camera.sensor->id;
if (enable) {
switch (sensor) {
@@ -303,8 +292,10 @@ int sn9c20x_i2c_initialize(struct usb_microdia *dev)
__u8 buf[9];
int ret;
- buf[0] = dev->camera.sensor_flags;
- buf[1] = dev->camera.sensor_slave_address;
+ dev->camera.i2c_flags = SN9C20X_I2C_2WIRE;
+
+ buf[0] = dev->camera.i2c_flags;
+ buf[1] = dev->camera.sensor->address;
buf[2] = 0x00;
buf[3] = 0x00;
buf[4] = 0x00;
@@ -383,9 +374,9 @@ int sn9c20x_read_i2c_data(struct usb_microdia *dev, __u8
nbytes,
memset(row, 0, 5);
/* now we issue the same command but with the read bit set
* and no slave register address */
- dev->camera.sensor_flags |= SN9C20X_I2C_READ;
+ dev->camera.i2c_flags |= SN9C20X_I2C_READ;
ret = sn9c20x_write_i2c_data(dev, nbytes - 1, 0, row);
- dev->camera.sensor_flags &= ~SN9C20X_I2C_READ;
+ dev->camera.i2c_flags &= ~SN9C20X_I2C_READ;
if (ret < 0)
return ret;
@@ -455,8 +446,8 @@ int sn9c20x_write_i2c_data(struct usb_microdia *dev, __u8
nbytes,
/* from the point of view of the bridge, the length
* includes the address */
- row[0] = dev->camera.sensor_flags | ((nbytes + 1) << 4);
- row[1] = dev->camera.sensor_slave_address;
+ row[0] = dev->camera.i2c_flags | ((nbytes + 1) << 4);
+ row[1] = dev->camera.sensor->address;
row[2] = address;
row[7] = 0x10; /* I think this means we want an ack */
@@ -464,19 +455,19 @@ int sn9c20x_write_i2c_data(struct usb_microdia *dev, __u8
nbytes,
row[i + 3] = i < nbytes ? data[i] : 0;
UDIA_DEBUG("I2C %s %02x: %02x %02x %02x %02x %02x %02x %02x %02x\n",
- (dev->camera.sensor_flags & SN9C20X_I2C_READ ? wasread :
waswrite), address,
+ (dev->camera.i2c_flags & SN9C20X_I2C_READ ? wasread :
waswrite), address,
row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7]);
ret = usb_microdia_control_write(dev, 0x10c0, row, 8);
if (ret >= 0)
ret = sn9c20x_i2c_ack_wait(dev,
- dev->camera.sensor_flags & SN9C20X_I2C_400KHZ,
+ dev->camera.i2c_flags & SN9C20X_I2C_400KHZ,
&slave_error);
if (slave_error) {
UDIA_ERROR("I2C slave 0x%02x returned error during %s address
0x%02x\n",
- dev->camera.sensor_slave_address,
- (dev->camera.sensor_flags & SN9C20X_I2C_READ ? wasread
: waswrite),
+ dev->camera.sensor->address,
+ (dev->camera.i2c_flags & SN9C20X_I2C_READ ? wasread :
waswrite),
address);
return -1000;
/* there should be no interference with USB errors */
@@ -485,8 +476,8 @@ int sn9c20x_write_i2c_data(struct usb_microdia *dev, __u8
nbytes,
if (ret < 0) {
/* we got no ack */
UDIA_ERROR("No ack from I2C slave 0x%02x for %s address
0x%02x\n",
- dev->camera.sensor_slave_address,
- (dev->camera.sensor_flags & SN9C20X_I2C_READ ? wasread
: waswrite),
+ dev->camera.sensor->address,
+ (dev->camera.i2c_flags & SN9C20X_I2C_READ ? wasread :
waswrite),
address);
return ret;
}
--
1.5.6.5
signature.asc
Description: OpenPGP digital signature
