./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