Edit online

调试指南

17 Dec 2024
Read time: 3 minute(s)

调试开关

  1. 在 SDK 根目录下,执行下列命令,进入 kernel 的功能配置界面:
    make kernel-menuconfig

    或使用简写命令

    make km
  2. 在内核配置界面,打开 DVP 模块的 DEBUG 选项:
    Linux
        Kernel hacking
            Artinchip Debug
                [*] DVP driver debug
打开 DEBUG 选项后:
  • 驱动以-O0 编译。

  • pr_dbg()dev_dbg() 调试信息会被编译。

    在系统运行时,如果要打印 pr_dbg()dev_dbg() 信息,还需要调整 loglevel 为 8,可以通过以下两种方式实现:
    • board.dts 中修改 bootargs,增加 “loglevel=8”

    • 在板子启动到 Linux Shell 后,执行下列命令:
      echo8 > /proc/sys/kernel/printk

Sysfs 节点

  1. 在 Sysfs 中查看 video 设备的信息:
    • 查看 /dev/video0 设备的信息:
      ls /dev/video0 -l
      输出结果示例如下,其中主设备号为 81,次设备号为 0:
      crw-------    1 root     root       81,   0 Jan  1  1970 /dev/video0
    • 查看 /sys/class/video4linux/v4l-subdev0/ 目录中的文件,了解视频子设备的详细信息:
      ls /sys/class/video4linux/v4l-subdev0/
      输出结果示例如下:
      dev        dev_debug  device     index      name       subsystem  uevent
    • 通过 cat 命令查看特定文件的内容,例如 name 文件:
      cat /sys/class/video4linux/v4l-subdev0/name

      输出结果示例如下,表示视频子设备的名称是 ov5640 3-003c

      ov5640 3-003c
    • cat /sys/class/video4linux/v4l-subdev1/name
      aic-dvp-sd
    • ls -l /sys/class/video4linux/
      lrwxrwxrwx    1 root     root             0 Jan  1 00:12 v4l-subdev0 -> ../../devices/platform/soc/99223000.i2c/i2c-3/3-003c/video4linux/v4l-subdev0
      lrwxrwxrwx    1 root     root             0 Jan  1 00:12 v4l-subdev1 -> ../../devices/platform/soc/98830000.dvp/video4linux/v4l-subdev1
      lrwxrwxrwx    1 root     root             0 Jan  1 00:12 video0 -> ../../devices/platform/soc/98830000.dvp/video4linux/video0
  2. 向对应的 Sysfs 节点写入一个整数值,修改 debug level,打开 V4L2 的 debug 开关。

    例如,设置不同的模块和设备的 Debug 级别为 3(即显示所有调试信息):
    echo 0x3 > /sys/module/videobuf2_v4l2/parameters/debug
    echo 0x3 > /sys/module/videobuf2_common/parameters/debug
    echo 0x3 > /sys/devices/platform/soc/18830000.dvp/video4linux/v4l-subdev1/dev_debug
    echo 0x3 > /sys/devices/platform/soc/18830000.dvp/video4linux/video0/dev_debug
    

    V4L2 子系统使用 dprintk(level) 接口来控制调试信息。当 dprintk(level) 中的 level 值大于代码中的 dprintk(level) 调用的 level 值即可打印信息。dprintk() 一般用到两个 debug level:

    1 显示 ioctl 名称
    2 显示 API 的传入参数
  3. 查看 DVP 的 Buf 队列情况

    DVP 驱动中实现了一个 sysfs 节点 buflist,查看当前三个 Qbuf、DQbuf、DVP 驱动中的 buf list 状态:

    cat /sys/devices/platform/soc/18830000.dvp/buflist
    输出结果示例如下,表示当前 DVP 驱动中的缓冲区列表状态,其中 Q-buf 和 DQ-buf 列表均为空,而 D-buf 列表中的所有缓冲区都处于完成状态:
    In dvp->buf_list, the current buf in list:
    [0]: empty
    [1]: empty
    [2]: empty
    
    In V4L2 Q-buf list:
    [0]: empty
    [1]: empty
    [2]: empty
    
    In V4L2 DQ-buf list:
    [0], state: Done
    [1], state: Done
    [2], state: Done
    

V4L2 相关的其他工具

  • V4l2-ctl,v4l2 的命令行工具,用于管理和控制 Linux 系统中的视频设备。

  • V4l2 兼容性测试

  • V4l2-dbg,

  • qv4l2,QT 测试程序