RV1126----新增sensor--imx214

发布时间 2023-04-11 18:28:45作者: 阿风小子

./build.sh then  ./envset.sh

参考资料------------------------------------------------------------------

docs--common-camera-isp2x--《Rockchip_Driver_Guide_VI_CN_v1.0.8》

《imx214datasheet》《imx214register list》培训视频--4,5,6节+文档配套视频《Rockchip_Driver_Guide_VI_CN_v1.0.8》    《linux设备驱动开发详解》

Owl开发板wiki:https://gitee.com/owlvisiontech/owlvtech-patch-rv1126/wikis/%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98/%E5%AA%92%E4%BD%93%E7%9B%B8%E5%85%B3%E5%BC%80%E5%8F%91/Camera%E6%95%B0%E6%8D%AE%E7%9A%84%E8%8E%B7%E5%8F%96

 

Caution!!!-----------------------------------------------

1:i2c通信不成功check不到id,首先为了方便调试先将驱动里的poweroff关闭,再i2cdetect一下,正常来说只要设备上电就会显示出i2c设备,如果驱动正常加载,则相应位为UU,表示该地址被驱动占用,若仍然不对则检查硬件,广角镜头由于是由排线连接可能会导致线路断开,可以使用示波器测一下sda和scl,i2c协议中,若处于空闲状态,sda和scl均为高电平以实现线与,可以以此判断;若仍然通信不成功,则检查sensor上电,可以查看原理图,三路上电由一个pwdn脚控制同时上电,可以直接查看电源芯片的ce脚,测试是否能控制pwdn脚;

2:图像抓取错误,首先是空数据文件,第一次设置为1920*1080导致抓取不到数据,应该是设置问题,后面更改为4000*3000后抓取到数据但显示不正确,为了确定是否为senor抓取的数据可以先用手挡住再用灯光照射进行对比,若有亮度的变化则表示数据可能为sensor的输出,可能只是数据的输入输出格式不对,因为v4l2的不同节点输出格式不同,可以查看手册多试几次,这里可以使用hexdump工具直接查看16进制文件,如果是raw数据,由于是16位表示10位或12位,高位补0,则最高位肯定为0,以此判断;

3注意一这个的大小

 

 

V4l2--------------------------------------------------------------------

1:video for linux2:内核提供给应用程序访问音视频驱动的统一接口;

2:V4L2支持两种方式来采集图像:内存映射方式(mmap)和直接读取方式(read)。前者用于连续视频数据的采集,后者用于静态图片的数据采集;

3:包含了处理视频信息的一系列接口,视频采集,视频输出,视频覆盖,编解码 ;

4:V4L2在include/linux/videodev.h文件中定义了一些重要的数据结构,在采集图像的过程中,就是通过对这些数据的操作来获得最终的图像数据;

5:应用程序通过V4L2接口采集视频数据分为五个步骤:

  首先,打开视频设备文件,进行视频采集的参数初始化,通过V4L2接口设置视频图像的采集窗口、采集的点阵大小和格式;

  其次,申请若干视频采集的帧缓冲区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取/处理视频数据;

  第三,将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集;

  第四,驱动开始视频数据的采集,应用程序从视频采集输出队列取出帧缓冲区,处理完后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据;

  第五,停止视频采集。

6:V4L2采集视频操作基本按照打开视频设备、设置视频格式、启动视频采集,循环处理视频数据、停止视频采集、关闭视频设备,具体操作通过ioctl等函数来实现;

7:内核中没有printf,只有printk,printf运行在用户态,printk运行在内核态;

ADD A new sensor

知识点------------------------------------------------------------

1:fps--frame per second

2:VCM--voice coil motor--音圈电机

3:avdd--模拟用电 dvdd--数字电压 iovdd--芯片引脚电压

   控制部分--RST  PWDN

4:csi(camera serial interface)

5:主要实现摄像头的上电、时钟控制(MCLK)、设备初始化功能。上电分为DOVDD、DVDD、AVDD、reset、PWDN几个部分。需要按照设备要求顺序操作,一般时钟控制顺序也包含在内,设备初始化过程是将sensor设备的所有寄存器全部初始化一遍,采用IIC方式将初始化寄存器地址和值全部发送到sensor端。完成后此时摄像头模组才能正常工作,并将图像通过MIPI线路传送到CPU端。

 

驱动实现步骤--------------------------------------------------------

1:主要需要用到四个文件,依次进行改动

 

 

Kconfig 加一个default y!!! 表示内核编译该驱动

 

 

Makefile添加相关项

 

 

2:DTS

1:7位IIc slave地址 需要右移一位,因为最后一位是读和写,为0x10;

2:dts相关语法--->https://kdocs.cn/l/cgnuyAVEh7ZR

3:使用通路sensor->cif->isp->ispp

4:添加imx214节点

 

 

 

 

 

 

 

 

 

 

 

 

3:imx214.c

改动不多,具体可以参考

->Rockchip_Developer_Guide_Linux4.4_Camera_CN

->Rockchip_Driver_Guide_VI_CN

 

 调试指令-----------------------------------------------------------

1: mount -t ext4 /dev/mmcblk0p4 /userdata

media-ctl -p -d /dev/media0

2:若要查看16位地址,先i2cset设置16位地址,在i2cget;例 i2cset -f -y 1 0x10  0x16 0x17

i2cget 1 0x10

 

 

 

3:dmesg 打印内核信息

4:

 

 

 

可知entity-name:m01_f_imx214 1-0010

V4l2的子设备

对应节点/dev/v4l-subdev3

仅一个输出节点 source 记为pad0

输出格式为SRGGB10_1X10/1920x1080@1/10

Source节点连接到rockchip-mipi-dphy-rx

 

抓CIF的RAW图

先 mount -t ext4 /dev/mmcblk0p4 /userdata ----------------------mkdir /userdata/wzw

check一下  media-ctl -p -d /dev/media0(看一下是否有imx214的entity)

抓一下节点 grep '' /sys/class/video4linux/video*/name(这里选取stream_cif_mipi_id0的videoXX)

Debug-------  dmesg -c       echo 3>/sys/class/video4linux/video2/dev_debug

media-ctl  -l '"rkisp-isp-subdev":2->"rkisp_selfpath":0[0]' -d /dev/media2

media-ctl  -l '"rkisp-isp-subdev":2->"rkisp_mainpath":0[1]' -d /dev/media1

 

最后  

echo 0 > /sys/devices/platform/rkcif_mipi_lvds/compact_test 

v4l2-ctl -d /dev/video25 --set-fmt-video=width=4000,height=3000,pixelformat=BG10\

 --stream-mmap=1 --stream-skip=1 --stream-to=/userdata/wzw.out \

--stream-count=1 --stream-poll

 

ispserver --no-sync-db &   先开启ispserver!!!

v4l2-ctl -d /dev/video --set-fmt-video=width=4000,height=3000,pixelformat=NV12\

 --stream-mmap=1 --stream-skip=1 --stream-to=/userdata/wzw.out \

--stream-count=1 --stream-poll

 

 rkisp_demo --device /dev/video30 --width 4000 --height 3000 --stream-to /userdata/isp.yuv

 

rkispdemo-------------------------------------------------------------

mount -t ext4 /dev/mmcblk0p4 /userdata

Ps  kill掉ispserver

手挡 在ctrl+z

rkisp_demo --device /dev/video33 --width 1920 --height 1080--vop --rkaiq --hdr --sync-to-raw  --stream-to /userdata/wzw.out

 

   

6:查看是否启用cif isp ispp----->>dmesg | grep Async

 

 

 

7:链路节点-- grep '' /sys/class/video4linux/video*/name

 

 

 

 

 

 

 

ISP ISPP---------------------------------------------------------------

 

 

 

Rkisp_demo源码分析------------------------------------------------------------------------------------------

效果图------------------------------------------------------

使用adb

.\adb.exe pull /userdata/wzw.out wzw.out  拉图

.\adb.exe push cif.out /userdata/cif.out  传图

CIF

 

 

rkispdemo-------------------------------------------------------------

注:mmc.c中的大小改为485

 

 

mount -t ext4 /dev/mmcblk0p4 /userdata

Ps  kill掉ispserver

ctrl+z+退出该进程

 

 

rkisp_demo --device /dev/video39 --width 1920 --height 1080 --rkaiq --sync-to -raw --stream-to /userdata/wzw.out

 OR

rkisp_demo --device /dev/video39 --width 2000 --height 2000 --rkaiq --sync-to -raw --stream-to /userdata/wzw.out