> >Are you sure that register 0x18 is gain? you mentioned an effect on >FPS. Wouldn't this imply that it is instead exposure time? >
No, I am not sure. Exposure time is better signification for this control, but standart control like "explosure time" is not defined in v4l2. Or not? I mean, that gain is finest term from standart v4l2 controls ( http://v4l2spec.bytesex.org/spec/x542.htm ) for efect what register 0x18 make... Maybe we can sign "explosure time" as V4L2_CID_PRIVATE_BASE, but I dont know abou any programs, that can control this id... :( Regards Karry >2008/9/6 Lukáš Karas <[EMAIL PROTECTED]>: >> Ok, thanks for comments. >> New patch is in attachment (patch comparet to branche m5602, revision 372). >> >> ______________________________________________________________ >>> Od: [EMAIL PROTECTED] >>> Komu: Lukáš Karas <[EMAIL PROTECTED]> >>> CC: m560x-driver-devel <[email protected]> >>> Datum: 06.09.2008 17:42 >>> Předmět: Re: [M560x-driver-devel] m5602/s5k83a brightness,whiteness and >>> gain control >>> >>>-----BEGIN PGP SIGNED MESSAGE----- >>>Hash: SHA1 >>> >>> >>> >>>~ Luká? Karas wrote: >>>| Hi Eric. >>>| >>>| There is my today edit for s5k83a sensor: >>>http://www.karry.wz.cz/download/m5602.20080906.zip >>>| I was edited m5602 branch. Now is possible controll brightness, >>>whiteness and gain. >>>| >>>| I identify sensor register (0x18), that drasticaly extend expose time. >>>With maximal value is fps about 3! >>>| In this case getting good images in dark. You can see at: >>>http://www.karry.wz.cz/download/m5602-night_mode.png >>>| I named this properties as GAIN. It is right? I dont find apposites >>>properties on http://v4l2spec.bytesex.org/spec/x542.htm ... >>>| >>>| At end, I have small question. What you use as camera viewer? I find >>>neither viewer, that support change all parameters >>>| and work good with m5602... >>>| >>>| Regards Karry >>> >>> >>>Hi again. >>>This is a diff against the current driver. See my comments inline. >>>Please address them and send me the updated driver as a patch. >>> >>> >>>- --- >>>/home/erik/Utveckling/m560x-driver/m560x/branches/m5602/m5602_s5k83a.c >>>2008-09-06 16:59:02.000000000 +0200 >>>+++ m5602_s5k83a.c 2008-09-06 13:07:53.000000000 +0200 >>>@@ -18,6 +18,11 @@ >>> >>>~ #include "m5602_s5k83a.h" >>> >>>+static int brightness = S5K83A_DEFAULT_BRIGHTNESS; >>>+static int whiteness = S5K83A_DEFAULT_WHITENESS; >>>+static int gain = S5K83A_DEFAULT_GAIN; >>>+ >>> >>>Do not use static integers in the code. It's not pretty and can cause >>>race conditions. Also why shadow the registers in the sensor with local >>>variables? >>> >> >> Sorry, I dont know how make it better. I try read register values instead >> shadows his, but read function return me different values compare with >> written in some cases! >> Especiali with whitness, what is write with sequence three registers. >> It is hard when we have any datasheet. >> >> Maybe for pretty code create new structure with actual controls... >> >>>+ >>>~ static int s5k83a_probe(struct m5602_camera *cam) >>>~ { >>>~ u8 prod_id = 0, ver_id = 0; >>>@@ -159,6 +164,10 @@ >>>~ return -EINVAL; >>>~ } >>>~ } >>>+ >>>+ s5k83a_set_brightness(cam,brightness); >>>+ s5k83a_set_whiteness(cam, whiteness); >>>+ s5k83a_set_gain(cam, gain); >>> >>>This is ok I guess, although I would prefer if you altered the init code >>>in the m5602_s5k83a.h instead. >> >> Good idea. I do it. >> >>> >>>~ if (dump_sensor) >>>~ s5k83a_dump_registers(cam); >>>@@ -173,13 +182,102 @@ >>> >>>~ static int s5k83a_get_ctrl(struct m5602_camera *cam, struct >>>v4l2_control *ctrl) >>>~ { >>>- - return 0; >>>+ switch (ctrl->id) { >>>+ case V4L2_CID_BRIGHTNESS: >>>+ ctrl->value = brightness; >>>+ PDEBUG(DBG_V4L2, "get brightness (0x%x)", ctrl->value ); >>>+ return 0; >>> >>>Probe the actual sensor registers instead of copying the shadowed variable. >>> >> >> I explayin top, why I do this way. >> >>>+ case V4L2_CID_WHITENESS: >>>+ ctrl->value = whiteness; >>>+ PDEBUG(DBG_V4L2, "get whiteness (0x%x)", ctrl->value ); >>> >>>Same here. >>> >>>+ return 0; >>>+ case V4L2_CID_GAIN: >>>+ ctrl->value = gain; >>>+ PDEBUG(DBG_V4L2, "get gain (0x%x)", ctrl->value ); >>>+ return 0; >>> >>>And here >>>+ default: >>>+ PDEBUG(DBG_V4L2, "s5k83a_get_ctrl 0x%x", ctrl->id); >>> >>>This should warn that the selected ioctl isn't supported. >>> >> >> OK >> >>> >>>+ } >>>+ return EINVAL; >>>~ } >>> >>> >>> >>>~ static int s5k83a_set_ctrl(struct m5602_camera *cam, >>>~ const struct v4l2_control *ctrl) >>>~ { >>>- - return 0; >>>+ switch (ctrl->id) { >>>+ case V4L2_CID_BRIGHTNESS: >>>+ brightness = ctrl->value; >>>+ s5k83a_set_brightness( cam, ctrl->value ); >>>+ PDEBUG(DBG_V4L2, "set brightness to 0x%x", ctrl->value ); >>>+ return 0; >>> >>>Please remove the spaces around the brackets and replace the return with >>>a break. >>> >> >> ok >> >>> >>>+ case V4L2_CID_WHITENESS: >>>+ whiteness = ctrl->value; >>>+ s5k83a_set_whiteness(cam, ctrl->value); >>>+ PDEBUG(DBG_V4L2, "set whiteness to 0x%x", ctrl->value ); >>>+ return 0; >>> >>>Same here. >>> >>>+ case V4L2_CID_GAIN: >>>+ gain = ctrl->value; >>>+ s5k83a_set_gain(cam, ctrl->value); >>>+ PDEBUG(DBG_V4L2, "set whiteness to 0x%x", ctrl->value ); >>>+ return 0; >>> >>>Same here. >>>+ default: >>>+ PDEBUG(DBG_V4L2, "s5k83a_set_ctrl 0x%x to value 0x%x", >>>ctrl->id, ctrl->value); >>>+ } >>>+ return EINVAL; >>> >>>Check for errors and set the return value properly. >> >> ok >> >>> >>>+} >>>+ >>>+ >>>+static void s5k83a_set_brightness(struct m5602_camera *cam, u16 value) >>>+{ >>>+ int err = 0; >>>+ u8 data[2]; >>>+ >>>+ data[0] = 0x00; >>>+ data[1] = 0x20; >>>+ err = s5k83a_write_sensor(cam, 0x14, data, 2); >>>Is this necessary? What does it do? >>> >> >> Yes. It is necessary. I extract this sequence from snoop with >> windows driver. Without write 0x14 and 0x0d registers >> before 0x1b has strange results. >> >>>+ >>>+ data[0] = 0x01; >>>+ data[1] = (value & 0xff); // part of expose time (i dont know >>>what is this...) >>> >>>If you don't know what this is why do you write to it? >> >> Value of second byte change fractionally brightness. >> This change is little with compare 0x1b register. >> I set this value to 0x00 >> >>> >>>+ err = s5k83a_write_sensor(cam, 0x0d, data, 2); >>>+ >>>+ data[0] = (value ) >> 3; // brightness, high 5 bits >>>+ data[1] = (value ) >> 2; // brightness, high 6 bits (range is >>>7bits, but with the highest bit is unusable) >>>This doesn't make any sense. Do you really need to write almost the same >>>value to the two bytes? What happens if you only write to one byte? >>> >> >> So. This values are partly experimented. Both bytes change brightness. >> If use both, range is greater. >> >> Can you see video with this? >> >>>+ err = s5k83a_write_sensor(cam, 0x1b, data, 2); >>>+ >>>+} >>>+ >>>+static void s5k83a_set_whiteness(struct m5602_camera *cam, u8 value) >>>+{ >>>+ int tmp, err = 0; >>>+ u8 data[2]; >>>+ tmp = value; >>>+ >>>+ >>>+ data[0] = value; >>>+ data[1] = 0x00; >>>+ err = s5k83a_write_sensor(cam, 0x0a, data, 1); >>>+ >>>If you only write the first byte, don't set the next at all. >>> >> >> ok >> >>>+ >>>+ /* >>>+ // this code is for playing :-D >>>+ info("set to value 0x%x", tmp); >>>+ >>>+ data[0] = tmp; >>>+ data[1] = tmp; >>>+ err = s5k83a_write_sensor(cam, 0xe8, data, 2); >>>+ */ >>>Remove this comment. >>> >> >> ok >> >>>+} >>>+ >>>+static void s5k83a_set_gain(struct m5602_camera *cam, u8 value) >>>Don't return void but the error value generated by the >>>s5k83a_write_sensor() command. >>> >>>+{ >>>+ // values near 0x3c is greath for nigh mode >>>Remove this comment. >>> >> >> ok >> >>>+ int err = 0; >>>+ u8 data[2]; >>>+ >>>+ data[0] = 0; >>>+ data[1] = value; >>>+ err = s5k83a_write_sensor(cam, 0x18, data, 2); >>> >>>Is it only the high byte that alters the gain? >>> >> >> Yes exactly. First byte change nothing. Second byte change "gain" only from >> 0x00 to 0x3c... >> >>>+ >>>~ } >>> >>>~ static void s5k83a_dump_registers(struct m5602_camera *cam) >>> >>>Thanks, >>>Erik >>> >>> >> >> Please write me how solve problem with shadows registers/ controls >> >> Karry >> >> >>> >>>| >>>| >>>| >>>| ------------------------------------------------------------------------- >>>| This SF.Net email is sponsored by the Moblin Your Move Developer's >>>challenge >>>| Build the coolest Linux based applications with Moblin SDK & win great >>>prizes >>>| Grand prize is a trip for two to an Open Source event anywhere in the >>>world >>>| http://moblin-contest.org/redirect.php?banner_id=100&url=/ >>>| _______________________________________________ >>>| M560x-driver-devel mailing list >>>| [email protected] >>>| https://lists.sourceforge.net/lists/listinfo/m560x-driver-devel >>>| >>>-----BEGIN PGP SIGNATURE----- >>>Version: GnuPG v1.4.6 (GNU/Linux) >>> >>>iD8DBQFIwqQcN7qBt+4UG0ERAgiAAJ9VeLNvfTyxm+oHSRNphSpItDOazwCdFXn0 >>>h7BA8goqSrDa0FMyJfEPrNE= >>>=OpcB >>>-----END PGP SIGNATURE----- >>> >> >> >> ------------------------------------------------------------------------- >> This SF.Net email is sponsored by the Moblin Your Move Developer's challenge >> Build the coolest Linux based applications with Moblin SDK & win great prizes >> Grand prize is a trip for two to an Open Source event anywhere in the world >> http://moblin-contest.org/redirect.php?banner_id=100&url=/ >> _______________________________________________ >> M560x-driver-devel mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/m560x-driver-devel >> >> > ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ M560x-driver-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/m560x-driver-devel
