• Eugen Hristev's avatar
    media: atmel: atmel-isc: rework component offsets · 2e7ee8bb
    Eugen Hristev authored
    The component offsets were computed in a negative way: they were
    subtracted from the actual color component value.
    So, a higher offset was reducing the component value.
    This is not really desirable, as the offset is a 2's complements
    number with 1 bit for sign and 12 value bits, so we would like to be able
    to also add to the component, not only subtract.
    The reported number in v4l2 is fine, a range from -4095 to +4095.
    However when configuring a negative value for the offset, this would in
    fact not function, because with the old code, the number was subtracted
    from the max value. By setting something negative, it was overflowing in
    fact. Reworked the component offsets by placing the real value as the
    v4l2 ctrls.
    
    Now, the values are the real number that is added or subtracted from
    the component.
    The negative values received from v4l2 are already in 2's complements, so
    there is no need for conversion.
    This actually simplifies a lot the computation procedure, eliminating the
    need for the macros that convert from v4l2 values to ISC values and
    viceversa.
    Also the ZERO_VAL is eliminated, as 0 is now 0, as it's supposed to be.
    
    Example after this change:
    
     # v4l2-ctl --set-ctrl=red_component_offset=-150 -L
    
    User Controls
    
                         brightness 0x00980900 (int)    : min=-1024 max=1023 step=1 default=0 value=0 flags=slider
                           contrast 0x00980901 (int)    : min=-2048 max=2047 step=1 default=16 value=20 flags=slider
            white_balance_automatic 0x0098090c (bool)   : default=1 value=0 flags=update
                   do_white_balance 0x0098090d (button) : flags=inactive, write-only, execute-on-write
                              gamma 0x00980910 (int)    : min=0 max=3 step=1 default=3 value=3 flags=slider
                 red_component_gain 0x009819c0 (int)    : min=0 max=8191 step=1 default=512 value=512 flags=slider
                blue_component_gain 0x009819c1 (int)    : min=0 max=8191 step=1 default=512 value=512 flags=slider
           green_red_component_gain 0x009819c2 (int)    : min=0 max=8191 step=1 default=512 value=512 flags=slider
          green_blue_component_gain 0x009819c3 (int)    : min=0 max=8191 step=1 default=512 value=512 flags=slider
               red_component_offset 0x009819c4 (int)    : min=-4095 max=4095 step=1 default=0 value=-150 flags=slider
              blue_component_offset 0x009819c5 (int)    : min=-4095 max=4095 step=1 default=0 value=0 flags=slider
         green_red_component_offset 0x009819c6 (int)    : min=-4095 max=4095 step=1 default=0 value=0 flags=slider
        green_blue_component_offset 0x009819c7 (int)    : min=-4095 max=4095 step=1 default=0 value=0 flags=slider
    
    The auto white balance algorithm is unchanged, but the obtained value to
    'subtract' is now converted to negative and saved as a v4l2 control and
    displayed properly.
    Signed-off-by: default avatarEugen Hristev <eugen.hristev@microchip.com>
    Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
    2e7ee8bb
atmel-isc-regs.h 8.08 KB