查看: 1922|回复: 2

[评测分享] 米尔MTD-T507H开发板试用--调试sensor gc5035通信

[复制链接]
  • TA的每日心情
    郁闷
    2024-9-18 16:57
  • 签到天数: 48 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2022-8-26 19:32:24 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 eefocus_3828686 于 2022-8-26 19:37 编辑

    在MTD-T507H开发板上调试gc5035,硬件设计见https://www.cirmall.com/bbs/thread-222755-1-1.html
    1、配置驱动文件Makefile,路径为/home/myir/myd-t507h/t507h-sdk/t507/kernel/linux-4.9/drivers/media/platform/sunxi-vin/modules/sensor/Makefile,把把其余的sensor都注释掉,只留gc5035_mipi就行
    1. #obj-y                        += ov5640.o
    2. #obj-m                        += ov2775_mipi.o
    3. #obj-m                        += gc2145.o
    4. ##obj-m                        += gc0310_mipi.o
    5. ##obj-m                        += gc2355_mipi.o
    6. ##obj-m                        += gc030a_mipi.o
    7. ##obj-m                        += gc2385_mipi.o
    8. ##obj-m                        += gc5024_mipi.o
    9. #obj-m                        += imx214.o
    10. #obj-m                        += imx219.o
    11. #obj-m                        += imx274_slvds.o
    12. #obj-m                        += imx291_dvp.o
    13. #obj-m                        += imx291_mipi.o
    14. ##obj-m                        += imx317_mipi.o
    15. #obj-m                        += imx335_mipi.o
    16. #obj-m                        += imx326_mipi.o
    17. #obj-m                        += imx477_mipi.o
    18. #obj-m                        += ov2710_mipi.o
    19. #obj-m                        += ov2718_mipi.o
    20. #obj-m                        += ar0238.o
    21. #obj-m                        += imx278_mipi.o
    22. #obj-m                        += imx386_mipi.o
    23. #obj-m                        += s5k3h5xa.o
    24. #obj-m                        += ar0238_hispi.o
    25. #obj-m                        += nvp6134/
    26. ##obj-y                        += nvp6324/
    27. ##obj-y                        += nvp6158/
    28. ##obj-y                        += max9286_mipi.o
    29. ##obj-y                        += rn6854m_mipi.o
    30. ##obj-y                        += ov5640_mipi.o
    31. ##obj-y                        += ov5640_dvp.o
    32. #obj-m                        += tp9950.o
    33. obj-y                        += gc5035_mipi.o
    34. #obj-m                        += sc2232_mipi.o
    复制代码
    2、在路径/home/myir/myd-t507h/t507h-sdk/t507/kernel/myir-t5-kernel/drivers/media/platform/sunxi-vin/modules/sensor/添加gc5035_mipi.c文件,这里直接复制SDK里自带的gc5024_mipi.c为gc5035_mipi.c,姑且修改如下
    1. /*
    2. * A V4L2 driver for GC5035 Raw cameras.
    3. * This program is free software; you can redistribute it and/or modify
    4. * it under the terms of the GNU General Public License version 2 as
    5. * published by the Free Software Foundation.
    6. */

    7. #include <linux/init.h>
    8. #include <linux/module.h>
    9. #include <linux/slab.h>
    10. #include <linux/i2c.h>
    11. #include <linux/delay.h>
    12. #include <linux/videodev2.h>
    13. #include <linux/clk.h>
    14. #include <media/v4l2-device.h>
    15. #include <media/v4l2-mediabus.h>
    16. #include <linux/io.h>

    17. #include "camera.h"
    18. #include "sensor_helper.h"

    19. #define SENSOR_DEBUG_INFO 1
    20. #if SENSOR_DEBUG_INFO == 1
    21. #define print_debug(fmt,...) \
    22.         do{\
    23.                 printk("[DEBUG_INFO] <%s %s %d> ==> "fmt, __FILE__,__func__, __LINE__, ##__VA_ARGS__); \
    24.         }while(0)
    25. #elif SENSOR_DEBUG_INFO == 0
    26. #define print_debug(fmt,...)
    27. #endif

    28. MODULE_AUTHOR("lwj");
    29. MODULE_DESCRIPTION("A low-level driver for GC5035 sensors");
    30. MODULE_LICENSE("GPL");

    31. #define MCLK              (24*1000*1000)
    32. #define V4L2_IDENT_SENSOR 0x5035

    33. #define I2C_ADDR 0x6e

    34. #define SENSOR_NAME "gc5035_mipi"
    复制代码
    想看原有打印也可以打开/home/myir/myd-t507h/t507h-sdk/t507/kernel/linux-4.9/drivers/media/platform/sunxi-vin/modules/sensor/sensor_helper.h文件里的
    1. #define DEV_DBG_EN   1
    复制代码
    gc5035_mipi.c里的函数改为如下,主要是PWR_ON要符合所用sensor的时序,这点很重要
    1. static int sensor_power(struct v4l2_subdev *sd, int on)
    2. {
    3.         int ret = 0;
    4.         print_debug("\n");
    5.         switch (on) {
    6.         case STBY_ON:
    7.                 sensor_dbg("STBY_ON!\n");
    8.                 if (ret < 0)
    9.                         usleep_range(10000, 12000);
    10.                 cci_lock(sd);
    11.                 vin_gpio_write(sd, PWDN, CSI_STBY_ON);
    12.                 cci_unlock(sd);
    13.                 break;
    14.         case STBY_OFF:
    15.                 sensor_dbg("STBY_OFF!\n");
    16.                 cci_lock(sd);
    17.                 vin_set_mclk_freq(sd, MCLK);
    18.                 vin_set_mclk(sd, ON);
    19.                 usleep_range(10000, 12000);
    20.                 vin_gpio_write(sd, PWDN, CSI_STBY_OFF);
    21.                 usleep_range(10000, 12000);
    22.                 cci_unlock(sd);
    23.                 usleep_range(10000, 12000);
    24.                 break;
    25.         case PWR_ON:
    26.                 sensor_dbg("PWR_ON!\n");
    27.                 cci_lock(sd);
    28.                 vin_gpio_write(sd, RESET, CSI_GPIO_LOW);
    29.                 vin_gpio_write(sd, PWDN, CSI_GPIO_LOW);
    30.                 usleep_range(1000, 1200);
    31.                 vin_set_mclk_freq(sd, MCLK);
    32.                 vin_set_mclk(sd, ON);
    33.                 usleep_range(10000, 12000);
    34.                 vin_set_pmu_channel(sd, CAMERAVDD, ON);
    35.                 vin_set_pmu_channel(sd, IOVDD, ON);
    36.                 vin_set_pmu_channel(sd, DVDD, ON);
    37.                 vin_set_pmu_channel(sd, AVDD, ON);
    38.                 usleep_range(5000, 6000);
    39.                 vin_gpio_write(sd, RESET, CSI_GPIO_HIGH);
    40.                 vin_gpio_write(sd, PWDN, CSI_GPIO_HIGH);
    41.                 usleep_range(1000, 1200); // >50us
    42.                 cci_unlock(sd);
    43.                 break;
    44.         case PWR_OFF:
    45.                 sensor_dbg("PWR_OFF!\n");
    46.                 cci_lock(sd);
    47.                 vin_set_mclk(sd, OFF);
    48.                 vin_set_pmu_channel(sd, CAMERAVDD, OFF);
    49.                 vin_set_pmu_channel(sd, IOVDD, OFF);
    50.                 vin_set_pmu_channel(sd, DVDD, OFF);
    51.                 vin_set_pmu_channel(sd, AVDD, OFF);
    52.                 //vin_gpio_write(sd, RESET, CSI_GPIO_HIGH);
    53.                 //vin_gpio_write(sd, PWDN, CSI_GPIO_HIGH);
    54.                 usleep_range(1000, 1200);
    55.                 vin_set_mclk(sd, OFF);
    56.                 cci_unlock(sd);
    57.                 break;
    58.         default:
    59.                 return -EINVAL;
    60.         }

    61.         return 0;
    62. }
    复制代码
    gc5035上电时序如下图
    1.png
    sensor_detect
    函数加打印,用来读取sensor ID的
    1. #define ID_REG_HIGH                0xf0
    2. #define ID_REG_LOW                0xf1
    复制代码
    1. static int sensor_detect(struct v4l2_subdev *sd)
    2. {
    3.         data_type val = 0;
    4.     print_debug("\n");
    5.         sensor_read(sd, ID_REG_HIGH, &val);
    6.         if (val != ID_VAL_HIGH)
    7.                 return -ENODEV;
    8.         print_debug("ID_REG_HIGH: 0x%x\n", val);
    9.         sensor_read(sd, ID_REG_LOW, &val);
    10.         if (val != ID_VAL_LOW)
    11.                 return -ENODEV;
    12.         print_debug("ID_REG_LOW : 0x%x\n", val);
    13.         return 0;
    14. }
    复制代码
    函数sensor_init、sensor_reset、sensor_ioctl、sensor_probe都加上打印,方便看执行情况
    3、设备树配置/home/myir/myd-t507h/t507h-sdk/t507/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/myir-yt507.dtsi
    1. sensor0:sensor@0 {
    2.                                 device_type = "sensor0";
    3. #if 0
    4.                                 sensor0_mname = "ov5640_mipi";
    5.                                 sensor0_twi_cci_id = <0>;
    6.                                 sensor0_twi_addr = <0x78>;
    7. #else
    8.                                 sensor0_mname = "gc5035_mipi";// likw
    9.                                 sensor0_twi_cci_id = <0>;
    10.                                 sensor0_twi_addr = <0x6e>;
    11. #endif
    12.                                 sensor0_mclk_id = <1>;
    13.                                 sensor0_pos = "rear";
    14.                                 sensor0_isp_used = <0>;
    15.                                 sensor0_fmt = <0>;
    16.                                 sensor0_stby_mode = <0>;
    17.                                 sensor0_vflip = <0>;
    18.                                 sensor0_hflip = <0>;
    19.                                 sensor0_iovdd-supply = <®_bldo1>;
    20.                                 sensor0_iovdd_vol = <1800000>;
    21.                                 /*
    22.                                 sensor0_avdd-supply = <®_cldo1>;
    23.                                 sensor0_avdd_vol = <3300000>;
    24.                                 sensor0_dvdd-supply = <®_bldo5>;
    25.                                 sensor0_dvdd_vol = <1200000>;
    26.                                 */
    27.                                 sensor0_power_en = <&pio PC 7 1 0 1 1>;
    28.                                 sensor0_reset = <&pio PC 12 1 0 1 0>;
    29.                                 sensor0_pwdn = <&pio PC 2 1 0 1 1>;
    30.                                 sensor0_sm_vs = <>;
    31.                                 device_id = <0>;
    32.                                 status        = "okay";
    33.                         };
    复制代码
    sensor0_twi_addr = <0x6e>; 0x6e是gc5035的8位i2c地址值
    4、编译烧录看现象,dmesg 3.png


    2.png

    可见gc5035驱动已经被运行,并且读出了sensor的ID值

    dev目录下也已经生成了video节点
    4.png

    至此,MTD-T507H开发板和gc5035通信成功,后续再学习gc5035在MTD-T507H开发板的配置和具体调试。


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-8-5 17:13
  • 签到天数: 333 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2022-8-30 09:57:57 | 显示全部楼层
    不错啊,你这个内核代码是米尔提供的还是啥?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2024-9-18 16:57
  • 签到天数: 48 天

    连续签到: 1 天

    [LV.5]常住居民I

     楼主| 发表于 2022-9-4 21:13:25 | 显示全部楼层
    xiaoshen-372360 发表于 2022-8-30 09:57
    不错啊,你这个内核代码是米尔提供的还是啥?

    米尔提供的SDK里带了很多调试好的sensor模板可以参考的
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 04:20 , Processed in 0.146614 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.