@@ -57,8 +57,8 @@ MODULE_AUTHOR("Thomas Kaiser thomas@kais
MODULE_DESCRIPTION("Pixart PAC7311");
MODULE_LICENSE("GPL");
-/* specific webcam descriptor */
-struct sd {
+/* specific webcam descriptor for pac7302 */
+struct pac7302_sd {
struct gspca_dev gspca_dev; /* !! must be the first item */
unsigned char brightness;
@@ -70,7 +70,26 @@ struct sd {
__u8 hflip;
__u8 vflip;
- __u8 sensor;
+#define SENSOR_PAC7302 0
+#define SENSOR_PAC7311 1
+
+ u8 sof_read;
+ u8 autogain_ignore_frames;
+
+ atomic_t avg_lum;
+};
+
+/* specific webcam descriptor for pac7311 */
+struct pac7311_sd {
+ struct gspca_dev gspca_dev; /* !! must be the first item */
+
+ unsigned char contrast;
+ unsigned char gain;
+ unsigned char exposure;
+ unsigned char autogain;
+ __u8 hflip;
+ __u8 vflip;
+
#define SENSOR_PAC7302 0
#define SENSOR_PAC7311 1
@@ -617,12 +636,11 @@ static void reg_w_var(struct gspca_dev *
static int pac7302_sd_config(struct gspca_dev *gspca_dev,
const struct usb_device_id *id)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
struct cam *cam;
cam = &gspca_dev->cam;
- sd->sensor = id->driver_info;
PDEBUG(D_CONF, "Find Sensor PAC7302");
cam->cam_mode = &vga_mode[2]; /* only 640x480 */
cam->nmodes = 1;
@@ -642,19 +660,16 @@ static int pac7302_sd_config(struct gspc
static int pac7311_sd_config(struct gspca_dev *gspca_dev,
const struct usb_device_id *id)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
struct cam *cam;
cam = &gspca_dev->cam;
- sd->sensor = id->driver_info;
PDEBUG(D_CONF, "Find Sensor PAC7311");
cam->cam_mode = vga_mode;
cam->nmodes = ARRAY_SIZE(vga_mode);
- sd->brightness = BRIGHTNESS_DEF;
sd->contrast = CONTRAST_DEF;
- sd->colors = COLOR_DEF;
sd->gain = GAIN_DEF;
sd->exposure = EXPOSURE_DEF;
sd->autogain = AUTOGAIN_DEF;
@@ -666,7 +681,7 @@ static int pac7311_sd_config(struct gspc
/* This function is used by pac7302 only */
static void pac7302_setbrightcont(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
int i, v;
static const __u8 max[10] =
{0x29, 0x33, 0x42, 0x5a, 0x6e, 0x80, 0x9f, 0xbb,
@@ -693,7 +708,7 @@ static void pac7302_setbrightcont(struct
/* This function is used by pac7311 only */
static void pac7311_setcontrast(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
reg_w(gspca_dev, 0xff, 0x04);
reg_w(gspca_dev, 0x10, sd->contrast >> 4);
@@ -704,7 +719,7 @@ static void pac7311_setcontrast(struct g
/* This function is used by pac7302 only */
static void pac7302_setcolors(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
int i, v;
static const int a[9] =
{217, -212, 0, -101, 170, -67, -38, -315, 355};
@@ -725,7 +740,7 @@ static void pac7302_setcolors(struct gsp
static void pac7302_setgain(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
reg_w(gspca_dev, 0xff, 0x03); /* page 3 */
reg_w(gspca_dev, 0x10, sd->gain >> 3);
@@ -736,7 +751,7 @@ static void pac7302_setgain(struct gspca
static void pac7311_setgain(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
int gain = GAIN_MAX - sd->gain;
if (gain < 1)
@@ -753,7 +768,7 @@ static void pac7311_setgain(struct gspca
static void pac7302_setexposure(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
__u8 reg;
/* register 2 of frame 3/4 contains the clock divider configuring the
@@ -778,7 +793,7 @@ static void pac7302_setexposure(struct g
static void pac7311_setexposure(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
__u8 reg;
/* register 2 of frame 3/4 contains the clock divider configuring the
@@ -807,7 +822,7 @@ static void pac7311_setexposure(struct g
static void pac7302_sethvflip(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
__u8 data;
reg_w(gspca_dev, 0xff, 0x03); /* page 3 */
@@ -819,7 +834,7 @@ static void pac7302_sethvflip(struct gsp
static void pac7311_sethvflip(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
__u8 data;
reg_w(gspca_dev, 0xff, 0x04); /* page 4 */
@@ -847,7 +862,7 @@ static int pac7311_sd_init(struct gspca_
static int pac7302_sd_start(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
sd->sof_read = 0;
@@ -873,7 +888,7 @@ static int pac7302_sd_start(struct gspca
static int pac7311_sd_start(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
sd->sof_read = 0;
@@ -953,7 +968,7 @@ static void pac7311_sd_stop0(struct gspc
static void pac7302_do_autogain(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
int avg_lum = atomic_read(&sd->avg_lum);
int desired_lum, deadzone;
@@ -981,7 +996,7 @@ static void pac7302_do_autogain(struct g
static void pac7311_do_autogain(struct gspca_dev *gspca_dev)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
int avg_lum = atomic_read(&sd->avg_lum);
int desired_lum, deadzone;
@@ -1032,7 +1047,7 @@ static void pac7302_sd_pkt_scan(struct g
__u8 *data, /* isoc packet */
int len) /* iso packet length */
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
unsigned char *sof;
sof = pac_find_sof(&sd->sof_read, data, len);
@@ -1096,7 +1111,7 @@ static void pac7311_sd_pkt_scan(struct g
__u8 *data, /* isoc packet */
int len) /* iso packet length */
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
unsigned char *sof;
sof = pac_find_sof(&sd->sof_read, data, len);
@@ -1155,7 +1170,7 @@ static void pac7311_sd_pkt_scan(struct g
static int pac7302_sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
sd->brightness = val;
if (gspca_dev->streaming)
@@ -1165,7 +1180,7 @@ static int pac7302_sd_setbrightness(stru
static int pac7302_sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
*val = sd->brightness;
return 0;
@@ -1173,7 +1188,7 @@ static int pac7302_sd_getbrightness(stru
static int pac7302_sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
sd->contrast = val;
if (gspca_dev->streaming) {
@@ -1184,7 +1199,7 @@ static int pac7302_sd_setcontrast(struct
static int pac7311_sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
sd->contrast = val;
if (gspca_dev->streaming) {
@@ -1195,7 +1210,7 @@ static int pac7311_sd_setcontrast(struct
static int pac7302_sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
*val = sd->contrast;
return 0;
@@ -1203,7 +1218,7 @@ static int pac7302_sd_getcontrast(struct
static int pac7311_sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
*val = sd->contrast;
return 0;
@@ -1211,7 +1226,7 @@ static int pac7311_sd_getcontrast(struct
static int pac7302_sd_setcolors(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
sd->colors = val;
if (gspca_dev->streaming)
@@ -1221,7 +1236,7 @@ static int pac7302_sd_setcolors(struct g
static int pac7302_sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
*val = sd->colors;
return 0;
@@ -1229,7 +1244,7 @@ static int pac7302_sd_getcolors(struct g
static int pac7302_sd_setgain(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
sd->gain = val;
if (gspca_dev->streaming)
@@ -1239,7 +1254,7 @@ static int pac7302_sd_setgain(struct gsp
static int pac7311_sd_setgain(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
sd->gain = val;
if (gspca_dev->streaming)
@@ -1249,7 +1264,7 @@ static int pac7311_sd_setgain(struct gsp
static int pac7302_sd_getgain(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
*val = sd->gain;
return 0;
@@ -1257,7 +1272,7 @@ static int pac7302_sd_getgain(struct gsp
static int pac7311_sd_getgain(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
*val = sd->gain;
return 0;
@@ -1265,7 +1280,7 @@ static int pac7311_sd_getgain(struct gsp
static int pac7302_sd_setexposure(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
sd->exposure = val;
if (gspca_dev->streaming)
@@ -1275,7 +1290,7 @@ static int pac7302_sd_setexposure(struct
static int pac7311_sd_setexposure(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
sd->exposure = val;
if (gspca_dev->streaming)
@@ -1285,7 +1300,7 @@ static int pac7311_sd_setexposure(struct
static int pac7302_sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
*val = sd->exposure;
return 0;
@@ -1293,7 +1308,7 @@ static int pac7302_sd_getexposure(struct
static int pac7311_sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
*val = sd->exposure;
return 0;
@@ -1301,7 +1316,7 @@ static int pac7311_sd_getexposure(struct
static int pac7302_sd_setautogain(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
sd->autogain = val;
/* when switching to autogain set defaults to make sure
@@ -1324,7 +1339,7 @@ static int pac7302_sd_setautogain(struct
static int pac7311_sd_setautogain(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
sd->autogain = val;
/* when switching to autogain set defaults to make sure
@@ -1347,7 +1362,7 @@ static int pac7311_sd_setautogain(struct
static int pac7302_sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
*val = sd->autogain;
return 0;
@@ -1355,7 +1370,7 @@ static int pac7302_sd_getautogain(struct
static int pac7311_sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
*val = sd->autogain;
return 0;
@@ -1363,7 +1378,7 @@ static int pac7311_sd_getautogain(struct
static int pac7302_sd_sethflip(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
sd->hflip = val;
if (gspca_dev->streaming)
@@ -1373,7 +1388,7 @@ static int pac7302_sd_sethflip(struct gs
static int pac7311_sd_sethflip(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
sd->hflip = val;
if (gspca_dev->streaming)
@@ -1383,7 +1398,7 @@ static int pac7311_sd_sethflip(struct gs
static int pac7302_sd_gethflip(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
*val = sd->hflip;
return 0;
@@ -1391,7 +1406,7 @@ static int pac7302_sd_gethflip(struct gs
static int pac7311_sd_gethflip(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
*val = sd->hflip;
return 0;
@@ -1399,7 +1414,7 @@ static int pac7311_sd_gethflip(struct gs
static int pac7302_sd_setvflip(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
sd->vflip = val;
if (gspca_dev->streaming)
@@ -1409,7 +1424,7 @@ static int pac7302_sd_setvflip(struct gs
static int pac7311_sd_setvflip(struct gspca_dev *gspca_dev, __s32 val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
sd->vflip = val;
if (gspca_dev->streaming)
@@ -1419,7 +1434,7 @@ static int pac7311_sd_setvflip(struct gs
static int pac7302_sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7302_sd *sd = (struct pac7302_sd *) gspca_dev;
*val = sd->vflip;
return 0;
@@ -1427,7 +1442,7 @@ static int pac7302_sd_getvflip(struct gs
static int pac7311_sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val)
{
- struct sd *sd = (struct sd *) gspca_dev;
+ struct pac7311_sd *sd = (struct pac7311_sd *) gspca_dev;
*val = sd->vflip;
return 0;
@@ -1488,10 +1503,10 @@ static int sd_probe(struct usb_interface
{
if (id->driver_info == SENSOR_PAC7302)
return gspca_dev_probe(intf, id, &pac7302_sd_desc,
- sizeof(struct sd), THIS_MODULE);
+ sizeof(struct pac7302_sd), THIS_MODULE);
else
return gspca_dev_probe(intf, id, &pac7311_sd_desc,
- sizeof(struct sd), THIS_MODULE);
+ sizeof(struct pac7311_sd), THIS_MODULE);
}
static struct usb_driver sd_driver = {