1.MIPI摄像头简介1.1MIPI CSI2接口简介MIPI (Mobile Industry Processor Interface)ARM, Nokia, ST ,TI等公司在2003年成立的一个联盟所定的接口。目的是把手机等移动设备内部的接口如摄像头、显示屏接口、射频/基带接口等标准化从而减少手机等移动设备设计的复杂程度和增加设计灵活性。工作组(Work Group)MIPI联盟下有许多的工作组不同的工作组负责定义对应设备的标准。其中包括有Camera工作组、Display工作组、高速多端链接工作组等十几个工作组。MIPI CSI-2接口是由MIPI联盟下的Camera工作组指定的CSI(Camera Serial Interface)的第2版接口标准。硬件层面最大支持4个虚拟通道Lane传输数据1个Lane在硬件上体现就是一对差分信号线(见下方原理图)每个Lane的最大通讯速率为2.0Gbps。软件层面MIPI CSI-2协议栈主要由应用层、协议层、物理层组成其中协议层又可以分为像素/字节组包/解包层、底层协议层、通道管理层。1.2硬件接口资源介绍EASY EAI PI2开发板具有2路MIPI CSI-2接口。每路引出了4个Lane。位置定义如下所示。EASY EAI PI2默认搭配IMX415单目摄像头。同时配有一根0.5mm间距的40pin FPC反向线。反向线两端的蓝色标识不在同一侧面。同向线两端的蓝色标识处于同一侧面。1.3接线说明* 接线必须在断电时进行操作。* 采用反向线连接IMX415摄像头与Cmaera1接口。注意用错线会烧坏摄像头或者核心板因此在接线时务必要小心。* 接线端子卡扣与FPC线的蓝色塑料标识必须位于同一侧。如下图所示。1.4查看设备情况可以通过dmesg命令检查MIPI-CSI2接口模块是否正常工作。dmesg | grep csi2-.phy摄像头正常挂载的情况如下所示。可以看到在dphy0接口上有一个sensor型号为sc450ai的摄像头MIPI-CSI2地址为1-0030在dphy3接口上有一个sensor型号为imx415的摄像头MIPI-CSI2地址为4-0036。当没能出现目标camera节点时就需要检查FPC排线是否正常连接请检查排线的连接是否与“1.3接线说明”一致。1.5寻找可用的设备节点rockchip平台一个MIPI-CSI接口会对应20多个video节点(设备树定了就会生成这么多个)如下图所示。注意CSI0并不一定是对应着video0~24这个要根据设备树的实际情况对应生成。而且MIPI-CSI camera对应的节点会在修改内核设备树的时候固定下来即内核配好了MIPI-CSI Camera个数无论MIPI-CSI摄像头是否有接上它的video节点情况都是不会根据MIPI-CSI Camera的接入情况而【动态】改变。因此用户需要找到这些节点所对应的描述信息是什么。Linux的v4l2框架会把这些节点的描述信息统一放在/sys/class/video4linux/目录下如下图所示。随便进入一个描述如video23。通过cat命令可以用查看这个name的内容是什么。rockchip芯片定义如果这个name是mainpath或者selfpath。则这个“video23”就是可用节点。在终端任意目录执行下面这条命令可以快速扫描所有的节点的“name”描述。grep mainpath /sys/class/video4linux/video*/name因此/dev/video23和/dev/video24都是MIPI-CSI0的可用节点。2.快速上手2.1开发环境准备如果您初次阅读此文档请阅读《入门指南/开发环境准备/Easy-Eai编译环境准备与更新》并按照其相关的操作进行编译环境的部署。在PC端Ubuntu系统中执行run脚本进入EASY-EAI编译环境具体如下所示。cd ~/develop_environment ./run.sh 22042.2源码下载以及例程编译首先在虚拟机后台终端执行以下命令创建外设单例源码管理目录cd /opt mkdir -p EASY-EAI-PI2/demo首先到【百度网盘】上下载相关的单例程序链接https://pan.baidu.com/s/1ORJrMeW-bOJ6g_lPiNG6mw?pwd1234提取码1234比如把单例程序下载到此电脑\D:\BaiduNetdisk (无规定用户可自主选择)如下图所示。再将下载好的单例复制进入虚拟机的文件系统过程如下图所示。最后进入到对应的例程目录执行编译操作具体命令如下所示cd EASY-EAI-PI2/demo/02_camera ./build.sh注* 由于依赖库部署在板卡上因此交叉编译过程中必须保持/mnt挂载。2.3例程运行通过串口调试或ssh调试进入板卡后台定位到例程部署的位置如下所示cd /userdata运行例程命令如下所示./test-mipiCam 232.4运行效果执行效果如下所示。例程运行完之后会在/tmp目录下得到一张photo图片。回到虚拟机里新开一个终端窗口通过scp命令把图片拷回来然后把photo用mplayer命令播放出来如下所示。ffplay -f rawvideo -pixel_format bgr24 -video_size 1920x1080 photo例程默认分辨率为1920x1080故w和h的参数对应填入1920和1080。当出现图片异常时说明分辨率等不太对应于手头的摄像头所以需要调整mipicamera_init()的分辨率例如1280x720。命令执行如下所示。3.MIPI摄像头测试案例示例代码路径为02_camera/test-mipiCam/main.c。MIPI Camera API的测试案例代码逻辑流程如下所示3.1源码说明int main(int argc, char **argv) { int ret 0; if(1 argc){ printf(\nerr: Missing parameter!\n); printf( [usage] \n); printf(example:\n); printf(\t%s 22/30\n, argv[0]); printf(--------------------------------------------\n); return 0; } char *pbuf NULL; int skip 0; FILE *fp NULL; int cameraIndex atoi(argv[1]); //通常是video22 ret mipicamera_init(cameraIndex, CAMERA_WIDTH, CAMERA_HEIGHT, 0); if (ret) { printf(error: %s, %d\n, __func__, __LINE__); goto exit3; } pbuf (char *)malloc(IMAGE_SIZE); if (!pbuf) { printf(error: %s, %d\n, __func__, __LINE__); ret -1; goto exit2; } //跳过前10帧 skip 10; while(skip--) { ret mipicamera_getframe(cameraIndex, pbuf); if (ret) { printf(error: %s, %d\n, __func__, __LINE__); goto exit1; } } /* tips: 可以在Ubuntu下用mplayer播放录制图像 * mplayer -demuxer rawvideo -rawvideo w1920:h1080:formatbgr24 photo -loop 0 */ fp fopen(/tmp/photo, w); if (!fp) { printf(error: %s, %d\n, __func__, __LINE__); ret -1; goto exit2; } fwrite(pbuf, 1, IMAGE_SIZE, fp); fclose(fp); exit1: free(pbuf); pbuf NULL; exit2: mipicamera_exit(cameraIndex); exit3: return ret; }其中mipicamera_init()mipicamera_getframe()mipicamera_exit()是对v4l2接口调用的易用化封装。具体实现于02_camera/commonApi/mipi_camera.c。
瑞芯微RV1126B开发板(EASY-EAI-PI2) MIPI-CSI摄像头
1.MIPI摄像头简介1.1MIPI CSI2接口简介MIPI (Mobile Industry Processor Interface)ARM, Nokia, ST ,TI等公司在2003年成立的一个联盟所定的接口。目的是把手机等移动设备内部的接口如摄像头、显示屏接口、射频/基带接口等标准化从而减少手机等移动设备设计的复杂程度和增加设计灵活性。工作组(Work Group)MIPI联盟下有许多的工作组不同的工作组负责定义对应设备的标准。其中包括有Camera工作组、Display工作组、高速多端链接工作组等十几个工作组。MIPI CSI-2接口是由MIPI联盟下的Camera工作组指定的CSI(Camera Serial Interface)的第2版接口标准。硬件层面最大支持4个虚拟通道Lane传输数据1个Lane在硬件上体现就是一对差分信号线(见下方原理图)每个Lane的最大通讯速率为2.0Gbps。软件层面MIPI CSI-2协议栈主要由应用层、协议层、物理层组成其中协议层又可以分为像素/字节组包/解包层、底层协议层、通道管理层。1.2硬件接口资源介绍EASY EAI PI2开发板具有2路MIPI CSI-2接口。每路引出了4个Lane。位置定义如下所示。EASY EAI PI2默认搭配IMX415单目摄像头。同时配有一根0.5mm间距的40pin FPC反向线。反向线两端的蓝色标识不在同一侧面。同向线两端的蓝色标识处于同一侧面。1.3接线说明* 接线必须在断电时进行操作。* 采用反向线连接IMX415摄像头与Cmaera1接口。注意用错线会烧坏摄像头或者核心板因此在接线时务必要小心。* 接线端子卡扣与FPC线的蓝色塑料标识必须位于同一侧。如下图所示。1.4查看设备情况可以通过dmesg命令检查MIPI-CSI2接口模块是否正常工作。dmesg | grep csi2-.phy摄像头正常挂载的情况如下所示。可以看到在dphy0接口上有一个sensor型号为sc450ai的摄像头MIPI-CSI2地址为1-0030在dphy3接口上有一个sensor型号为imx415的摄像头MIPI-CSI2地址为4-0036。当没能出现目标camera节点时就需要检查FPC排线是否正常连接请检查排线的连接是否与“1.3接线说明”一致。1.5寻找可用的设备节点rockchip平台一个MIPI-CSI接口会对应20多个video节点(设备树定了就会生成这么多个)如下图所示。注意CSI0并不一定是对应着video0~24这个要根据设备树的实际情况对应生成。而且MIPI-CSI camera对应的节点会在修改内核设备树的时候固定下来即内核配好了MIPI-CSI Camera个数无论MIPI-CSI摄像头是否有接上它的video节点情况都是不会根据MIPI-CSI Camera的接入情况而【动态】改变。因此用户需要找到这些节点所对应的描述信息是什么。Linux的v4l2框架会把这些节点的描述信息统一放在/sys/class/video4linux/目录下如下图所示。随便进入一个描述如video23。通过cat命令可以用查看这个name的内容是什么。rockchip芯片定义如果这个name是mainpath或者selfpath。则这个“video23”就是可用节点。在终端任意目录执行下面这条命令可以快速扫描所有的节点的“name”描述。grep mainpath /sys/class/video4linux/video*/name因此/dev/video23和/dev/video24都是MIPI-CSI0的可用节点。2.快速上手2.1开发环境准备如果您初次阅读此文档请阅读《入门指南/开发环境准备/Easy-Eai编译环境准备与更新》并按照其相关的操作进行编译环境的部署。在PC端Ubuntu系统中执行run脚本进入EASY-EAI编译环境具体如下所示。cd ~/develop_environment ./run.sh 22042.2源码下载以及例程编译首先在虚拟机后台终端执行以下命令创建外设单例源码管理目录cd /opt mkdir -p EASY-EAI-PI2/demo首先到【百度网盘】上下载相关的单例程序链接https://pan.baidu.com/s/1ORJrMeW-bOJ6g_lPiNG6mw?pwd1234提取码1234比如把单例程序下载到此电脑\D:\BaiduNetdisk (无规定用户可自主选择)如下图所示。再将下载好的单例复制进入虚拟机的文件系统过程如下图所示。最后进入到对应的例程目录执行编译操作具体命令如下所示cd EASY-EAI-PI2/demo/02_camera ./build.sh注* 由于依赖库部署在板卡上因此交叉编译过程中必须保持/mnt挂载。2.3例程运行通过串口调试或ssh调试进入板卡后台定位到例程部署的位置如下所示cd /userdata运行例程命令如下所示./test-mipiCam 232.4运行效果执行效果如下所示。例程运行完之后会在/tmp目录下得到一张photo图片。回到虚拟机里新开一个终端窗口通过scp命令把图片拷回来然后把photo用mplayer命令播放出来如下所示。ffplay -f rawvideo -pixel_format bgr24 -video_size 1920x1080 photo例程默认分辨率为1920x1080故w和h的参数对应填入1920和1080。当出现图片异常时说明分辨率等不太对应于手头的摄像头所以需要调整mipicamera_init()的分辨率例如1280x720。命令执行如下所示。3.MIPI摄像头测试案例示例代码路径为02_camera/test-mipiCam/main.c。MIPI Camera API的测试案例代码逻辑流程如下所示3.1源码说明int main(int argc, char **argv) { int ret 0; if(1 argc){ printf(\nerr: Missing parameter!\n); printf( [usage] \n); printf(example:\n); printf(\t%s 22/30\n, argv[0]); printf(--------------------------------------------\n); return 0; } char *pbuf NULL; int skip 0; FILE *fp NULL; int cameraIndex atoi(argv[1]); //通常是video22 ret mipicamera_init(cameraIndex, CAMERA_WIDTH, CAMERA_HEIGHT, 0); if (ret) { printf(error: %s, %d\n, __func__, __LINE__); goto exit3; } pbuf (char *)malloc(IMAGE_SIZE); if (!pbuf) { printf(error: %s, %d\n, __func__, __LINE__); ret -1; goto exit2; } //跳过前10帧 skip 10; while(skip--) { ret mipicamera_getframe(cameraIndex, pbuf); if (ret) { printf(error: %s, %d\n, __func__, __LINE__); goto exit1; } } /* tips: 可以在Ubuntu下用mplayer播放录制图像 * mplayer -demuxer rawvideo -rawvideo w1920:h1080:formatbgr24 photo -loop 0 */ fp fopen(/tmp/photo, w); if (!fp) { printf(error: %s, %d\n, __func__, __LINE__); ret -1; goto exit2; } fwrite(pbuf, 1, IMAGE_SIZE, fp); fclose(fp); exit1: free(pbuf); pbuf NULL; exit2: mipicamera_exit(cameraIndex); exit3: return ret; }其中mipicamera_init()mipicamera_getframe()mipicamera_exit()是对v4l2接口调用的易用化封装。具体实现于02_camera/commonApi/mipi_camera.c。