ubuntu 发表于 2021-9-10 11:11:59

[Core-1126-JD4] os04a10 reset pin 无法配置为高电平有效,是否是 bug 还是预期的...

如题, 我做了 10 次对比实验, 发现 pwd pin 可以配置为高电平/低电平有效, 但 reset pin 不可以.
请教firefly 的兄台, 是否是 bug 呢?

具体实验:
rst pwn pin gpio分析

# case1 当如下配置后,pwn电压为0

pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>;

/*
    usleep_range(500, 1000);
    if (!IS_ERR(os04a10->pwdn_gpio))
      gpiod_direction_output(os04a10->pwdn_gpio, 1);
*/

# cases2 当如下配置后, pwn 电压还是 0

pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_LOW>;
reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>;

    usleep_range(500, 1000);
    if (!IS_ERR(os04a10->pwdn_gpio))
      gpiod_direction_output(os04a10->pwdn_gpio, 1);

# case3 当如下配置, pwn 电压正常为 1.8v,sensor 可以正常用.

pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_LOW>;
reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>;


    if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 0);

    usleep_range(500, 1000);
    if (!IS_ERR(os04a10->pwdn_gpio))
      gpiod_direction_output(os04a10->pwdn_gpio, 0);

# case4. 异常 . 异常. pwn=1.8v, rst=0v.

if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 0);

    if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 1);

    usleep_range(500, 1000);
    if (!IS_ERR(os04a10->pwdn_gpio))
      gpiod_direction_output(os04a10->pwdn_gpio, 0);

                pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_LOW>;
                reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_HIGH>;

# case5. 异常 . 异常. pwn=1.8v, rst=0v.
/*if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 0); */


    if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 1);

    usleep_range(500, 1000);
    if (!IS_ERR(os04a10->pwdn_gpio))
      gpiod_direction_output(os04a10->pwdn_gpio, 0);

                pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_LOW>;
                reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_HIGH>;

# case6. 异常. pwn=0 rst=0
/*if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 1); */

    if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 1);

    usleep_range(500, 1000);
    if (!IS_ERR(os04a10->pwdn_gpio))
      gpiod_direction_output(os04a10->pwdn_gpio, 1);

                pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_LOW>;
                reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>;


# case7. 正常. 其实就是重复 case3 的实验.
/*if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 0); */

    if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 0);

    usleep_range(500, 1000);
    if (!IS_ERR(os04a10->pwdn_gpio))
      gpiod_direction_output(os04a10->pwdn_gpio, 0);

                pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_LOW>;
                reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>;


# case8. 异常. pwn=1.8v, rst=0v.
                pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;
                reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_HIGH>;

/*if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 0); */

    if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 1);

    usleep_range(500, 1000);
    if (!IS_ERR(os04a10->pwdn_gpio))
      gpiod_direction_output(os04a10->pwdn_gpio, 1);

# case9. 异常. pwn=1.8v, rst=0v.

    if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 0);

    if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 1);

    usleep_range(500, 1000);
    if (!IS_ERR(os04a10->pwdn_gpio))
      gpiod_direction_output(os04a10->pwdn_gpio, 1);

                pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;
                reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_HIGH>;

# case10. 正常.
    if (!IS_ERR(os04a10->reset_gpio))
      gpiod_direction_output(os04a10->reset_gpio, 0);

    usleep_range(500, 1000);
    if (!IS_ERR(os04a10->pwdn_gpio))
      gpiod_direction_output(os04a10->pwdn_gpio, 1);

                pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;
                reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>;



板蓝根 发表于 2021-9-10 15:16:41

不知道你是用示波器测量还是万用表,如果你要怀疑这两个脚可不可控应该用 gpio 子系统去测试一下。如果你用 sensor 去测试,sensor 驱动很多地方会控制这两个引脚,例如摄像头初始化失败了,就会把掉源关掉。所以用示波器测试应该会准确一点

ubuntu 发表于 2021-9-13 16:45:44

板蓝根 发表于 2021-9-10 15:16
不知道你是用示波器测量还是万用表,如果你要怀疑这两个脚可不可控应该用 gpio 子系统去测试一下。如果你用 ...

您说的对.
虽然我把 camera driver 下电函数直接 return , 然后用万能表测试, 但 camera sensor 内部电路未知.

我应该不挂载 camera sensor 直接测试主板试试.
页: [1]
查看完整版本: [Core-1126-JD4] os04a10 reset pin 无法配置为高电平有效,是否是 bug 还是预期的...