* [BUG] OV02C10: image upside down in kernel 6.16
[not found] <7d38cf46-670e-462e-b7c2-78f9aaa9eb43@runbox.com>
@ 2025-08-08 9:03 ` Frederic Stuyk
2025-08-08 9:27 ` Bryan O'Donoghue
0 siblings, 1 reply; 4+ messages in thread
From: Frederic Stuyk @ 2025-08-08 9:03 UTC (permalink / raw)
To: hansg; +Cc: bod, mchehab, linux-media, linux-kernel
Hello,
I'm using the OV02C10 camera sensor on a system running Linux kernel
6.16 (CachyOS, Arch-based).
I assume CachyOS customizations do not affect camera handling.
The sensor is detected and streams video correctly, but the image
appears upside down by default.
Tested with GNOME Camera, qcam, and Firefox using an online webcam test
page.
Querying the sensor orientation metadata shows:
$ v4l2-ctl -d /dev/v4l-subdev6 -C camera_sensor_rotation
camera_sensor_rotation: 0
This control is read-only and cannot be changed.
This suggests that either the driver incorrectly reports the orientation
as 0, or that the platform is missing a quirk to reflect the actual
physical mounting of the sensor.
I’d be happy to provide more details (e.g., logs, info...) if needed.
Here is some information about my system:
Vendor: LENOVO
Product: ThinkBook 13x G4 IMH (model: 21KR)
BIOS: MTCN51WW
Kernel: 6.16.0-5-cachyos
Arch: x86_64
I’m reporting this to you as the driver maintainer. Please let me know
if I should follow a different process — this is my first time reporting
a kernel issue.
Note: Hans, we briefly exchanged emails on March 24th regarding early
testing of this driver (as Kernel patch), and the same orientation issue
was already visible at that time.
Best regards,
Frédéric
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [BUG] OV02C10: image upside down in kernel 6.16
2025-08-08 9:03 ` [BUG] OV02C10: image upside down in kernel 6.16 Frederic Stuyk
@ 2025-08-08 9:27 ` Bryan O'Donoghue
2025-08-08 9:33 ` Bryan O'Donoghue
0 siblings, 1 reply; 4+ messages in thread
From: Bryan O'Donoghue @ 2025-08-08 9:27 UTC (permalink / raw)
To: Frederic Stuyk, hansg; +Cc: mchehab, linux-media, linux-kernel
On 08/08/2025 10:03, Frederic Stuyk wrote:
> Querying the sensor orientation metadata shows:
>
> $ v4l2-ctl -d /dev/v4l-subdev6 -C camera_sensor_rotation
> camera_sensor_rotation: 0
>
> This control is read-only and cannot be changed.
Register is defined but not used.
deckard$ grep ROT drivers/media/i2c/ov02c10.c
#define OV02C10_ROTATE_CONTROL CCI_REG8(0x3820)
#define OV02C10_CONFIG_ROTATE 0x18
::set_ctrl()
case V4L2_CID_HFLIP:
case V4L2_CID_VFLIP:
cci_write(ov02c10->regmap, OV02C10_ROTATE_CONTROL,
ov02c10->hflip->val | ov02c10->vflip->val << 1, &ret);
::init_controls()
ov02c10->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov02c10_ctrl_ops,
V4L2_CID_HFLIP, 0, 1, 1, 0);
if (ov02e10->hflip)
ov02e10->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
ov02c10->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov02c10_ctrl_ops,
V4L2_CID_VFLIP, 0, 1, 1, 0);
if (ov02c10->vflip)
ov02c10->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
Something like that should work.
I think Hans said the ACPI tables provide the orientation for the sensor.
---
bod
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [BUG] OV02C10: image upside down in kernel 6.16
2025-08-08 9:27 ` Bryan O'Donoghue
@ 2025-08-08 9:33 ` Bryan O'Donoghue
2025-08-08 14:49 ` Frederic Stuyk
0 siblings, 1 reply; 4+ messages in thread
From: Bryan O'Donoghue @ 2025-08-08 9:33 UTC (permalink / raw)
To: Frederic Stuyk, hansg; +Cc: mchehab, linux-media, linux-kernel
On 08/08/2025 10:27, Bryan O'Donoghue wrote:
> On 08/08/2025 10:03, Frederic Stuyk wrote:
>> Querying the sensor orientation metadata shows:
>>
>> $ v4l2-ctl -d /dev/v4l-subdev6 -C camera_sensor_rotation
>> camera_sensor_rotation: 0
>>
>> This control is read-only and cannot be changed.
>
> Register is defined but not used.
>
> deckard$ grep ROT drivers/media/i2c/ov02c10.c
> #define OV02C10_ROTATE_CONTROL CCI_REG8(0x3820)
> #define OV02C10_CONFIG_ROTATE 0x18
>
> ::set_ctrl()
> case V4L2_CID_HFLIP:
> case V4L2_CID_VFLIP:
> cci_write(ov02c10->regmap, OV02C10_ROTATE_CONTROL,
> ov02c10->hflip->val | ov02c10->vflip->val << 1, &ret);
>
> ::init_controls()
>
> ov02c10->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov02c10_ctrl_ops,
> V4L2_CID_HFLIP, 0, 1, 1, 0);
> if (ov02e10->hflip)
> ov02e10->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
>
> ov02c10->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov02c10_ctrl_ops,
> V4L2_CID_VFLIP, 0, 1, 1, 0);
> if (ov02c10->vflip)
> ov02c10->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
>
> Something like that should work.
>
> I think Hans said the ACPI tables provide the orientation for the sensor.
>
> ---
> bod
0x3820: default 0xa0
bit5: vflip_blc_0
bit4: vflip_0
bit3: hmirror_0
bit2: hbin4_0
bit1: hbin2_0
bit0: vbinf_0
So you want to set bit3 = 0x08
---
bod
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [BUG] OV02C10: image upside down in kernel 6.16
2025-08-08 9:33 ` Bryan O'Donoghue
@ 2025-08-08 14:49 ` Frederic Stuyk
0 siblings, 0 replies; 4+ messages in thread
From: Frederic Stuyk @ 2025-08-08 14:49 UTC (permalink / raw)
To: Bryan O'Donoghue, hansg; +Cc: mchehab, linux-media, linux-kernel
Hi Bryan,
Based on your answer below, I tested the following minimal patch on
kernel 6.16 and confirmed it fixes the image orientation on my laptop
(Lenovo ThinkBook 13x G4 IMH):
--- a/drivers/media/i2c/ov02c10.c
+++ b/drivers/media/i2c/ov02c10.c
@@ -107,7 +107,7 @@ static const struct reg_sequence
sensor_1928x1092_30fps_setting[] = {
{0x3816, 0x01},
{0x3817, 0x01},
- {0x3820, 0xb0},
+ {0x3820, 0xa8},
{0x3821, 0x00},
{0x3822, 0x80},
{0x3823, 0x08},
Tested ok with gnome camera, qcam & firefox.
Would it make sense to add a quirk specific to this laptop model?
Also, the image appears heavily blue-ish under normal lighting
conditions, regardless of the application used. It's a different topic,
but I thought it was worth mentioning.
Let me know if there's anything else I can try or information to provide.
Best regards,
Frederic
On 08/08/2025 11:33, Bryan O'Donoghue wrote:
> On 08/08/2025 10:27, Bryan O'Donoghue wrote:
>> On 08/08/2025 10:03, Frederic Stuyk wrote:
>>> Querying the sensor orientation metadata shows:
>>>
>>> $ v4l2-ctl -d /dev/v4l-subdev6 -C camera_sensor_rotation
>>> camera_sensor_rotation: 0
>>>
>>> This control is read-only and cannot be changed.
>>
>> Register is defined but not used.
>>
>> deckard$ grep ROT drivers/media/i2c/ov02c10.c
>> #define OV02C10_ROTATE_CONTROL CCI_REG8(0x3820)
>> #define OV02C10_CONFIG_ROTATE 0x18
>>
>> ::set_ctrl()
>> case V4L2_CID_HFLIP:
>> case V4L2_CID_VFLIP:
>> cci_write(ov02c10->regmap, OV02C10_ROTATE_CONTROL,
>> ov02c10->hflip->val | ov02c10->vflip->val << 1, &ret);
>>
>> ::init_controls()
>>
>> ov02c10->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov02c10_ctrl_ops,
>> V4L2_CID_HFLIP, 0, 1, 1, 0);
>> if (ov02e10->hflip)
>> ov02e10->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
>>
>> ov02c10->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov02c10_ctrl_ops,
>> V4L2_CID_VFLIP, 0, 1, 1, 0);
>> if (ov02c10->vflip)
>> ov02c10->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
>>
>> Something like that should work.
>>
>> I think Hans said the ACPI tables provide the orientation for the
>> sensor.
>>
>> ---
>> bod
>
> 0x3820: default 0xa0
>
> bit5: vflip_blc_0
> bit4: vflip_0
> bit3: hmirror_0
> bit2: hbin4_0
> bit1: hbin2_0
> bit0: vbinf_0
>
> So you want to set bit3 = 0x08
>
> ---
> bod
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-08-08 14:50 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <7d38cf46-670e-462e-b7c2-78f9aaa9eb43@runbox.com>
2025-08-08 9:03 ` [BUG] OV02C10: image upside down in kernel 6.16 Frederic Stuyk
2025-08-08 9:27 ` Bryan O'Donoghue
2025-08-08 9:33 ` Bryan O'Donoghue
2025-08-08 14:49 ` Frederic Stuyk
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).