分享

HDMI输入转MIPI接口

 云深无际 2022-01-08

先说这个东西有什么用,可以把市面上支持输出HDMI的运动相机转成树莓派的CSI接口,然后可以借助Linux强大的生态来捕获视频。至于应用,那可太多了。

官方点的说法是:

HDMI 到 CSI 摄像头端口适配器,HDMI 输入支持高达1080p@30fps ,向后兼容。它允许您使用 HDMI 摄像头,就像标准的 Raspberry Pi CSI 摄像头一样,支持所有版本的 Raspberry Pi 系列板。

4B

Capturesudo raspistill -o image-01.jpgRecordsudo raspivid -o video-01.h264 -t 10000

有图有真相,就像下面这样:

这是狗5?

自然相机也少不了啊

就像这样

放大一点看

正面

背面

在这个TM的物价飞涨的世界里面,幸亏以前有买板子

其实为了文章的完整性,我这里想插一些关于这个相机接口的定义的内容。

就是这个相机的接口,其实我们知道,上面的东西就是模拟了相机的视频信号,遵循了固定的协议。

前面是V1的相机,后面是V2的。

一模一样,一共15个

中文接口

英文接口

因为Zero的小巧,所以单独的说说

确实是这样的

另外我想写一下关于这个树莓派捕获视频的应用。

关于树莓派新系统二三事(Bullseye)我前几天也写过这个,新的OS都是把里面换成了开源的实现,SO,我们就用以前的版本。

raspistill 是用于使用 Raspberry Pi 相机模块捕获静态照片的命令行工具。

用法:RaspiStill [选项]

图像参数命令

-?, --help :此帮助信息

-w, --width : 设置图片宽度

-h, --height : 设置图片高度

-q, --quality : 设置 jpeg 质量 <0 到 100>

-r, --raw :将原始拜耳数据添加到 jpeg 元数据

-o, --output : 输出文件名 (要写入标准输出,请使用'-o -')。如果未指定,则不保存文件

-v, --verbose : 运行时输出详细信息

-t, --timeout : 拍照和关机前的时间(以毫秒为单位)(如果没有指定,设置为 5s)

-th, --thumb : 设置缩略图参数 (x:y:quality)

-d, --demo : 运行演示模式(循环通过一系列相机选项,不捕获)

-e, --encoding : 用于输出文件的编码 (jpg, bmp, gif, png)

-x, --exif : 应用于捕获的 EXIF 标记(格式为 'key=value')

-tl, --timelapse :延时摄影模式。每拍一张多发性硬化症

预览参数命令

-p, --preview : 预览窗口设置

-f, --fullscreen :全屏预览模式

-n, --nopreview : 不显示预览窗口

图像参数命令

-sh, --sharpness :设置图像清晰度(-100 到 100)

-co, --contrast :设置图像对比度(-100 到 100)

-br, --brightness :设置图像亮度(0 到 100)

-sa, --saturation :设置图像饱和度(-100 到 100)

-ISO, --ISO : 设置捕获 ISO

-vs, --vstab : 开启视频稳定

-ev, --ev : 设置 EV 补偿

-ex, --exposure :设置曝光模式(见注释)

-awb, --awb : 设置 AWB 模式(见注释)

-ifx, --imxfx :设置图像效果(见注释)

-cfx, --colfx : 设置颜色效果 (U:V)

-mm, --metering :设置测光模式(见注释)

-rot, --rotation : 设置图像旋转 (0-359)

-hf, --hflip : 设置水平翻转

-vf, --vflip : 设置垂直翻转

注意!

曝光模式选项:

关闭,自动,夜,夜景,背光,聚光灯,体育,雪景,海滩,很长,固定fps,防抖,烟花

AWB 模式选项:

关闭,自动,太阳,云,灯罩,钨丝灯,荧光灯,白炽灯,闪光,地平线

图像效果模式选项:

无,负数,日光,素描,去噪,浮雕,油画,影线,gpen,粉彩,水彩,电影,模糊,饱和度,颜色交换,褪色,海报,色点,色彩平衡,卡通

测光模式选项:

平均,点,背光,矩阵

raspivid 是用于使用 Raspberry Pi 摄像头模块捕获视频的命令行工具。

Raspberry Pi 系列上使用的 SoC 都有两个摄像头接口,支持 CSI-2 D-PHY 1.1 或 CCP2(紧凑型摄像头端口 2)源。该接口的代号为“Unicam”。Unicam 的第一个实例支持 2 个 CSI-2 数据通道,而第二个支持 4 个。每个通道可以以高达 1Gbit/s(DDR,因此最大链路频率为 500MHz)运行。

但是,Raspberry Pi 的普通变体仅公开第二个实例,并且仅将2 个数据通道路由到相机连接器。计算模块范围从两个外围设备路由出所有通道。

接下来就是说,为什么可以用这个东芝的芯片就可以捕捉HDMI。因为是内核有支持!

有个模块叫C779,这里要说一下。

关于这个接口,我看板子是公版的。

HDMI to CSI - 2

是我们的板子,然后是I2C控制的芯片。

Linux的内核折腾指南

这是目前已经测试通过的驱动程序,其实看源码。。。密密麻麻的驱动啊,可能还没有测试。

Raspberry Pi Linux 内核目前支持 2 个桥接芯片,用于模拟视频源的 Analog Devices ADV728x-M 和用于 HDMI 源的 Toshiba TC358743。

这是基本的作用

处理视频的能力

CSI-2 TX(发送)

芯片的整个控制都是使用的IIC控制

芯片还不咋省电。。。

说看看MIPI的标准。。。hhhh,还看不了,有兄弟有的,给我看看

系统框图

对了这个东西还支持EDID

WIKI的说法

关于具体这个芯片的控制,后面会给资料,300多页的寄存器。

上面的图像格式频繁的出现,这里就说说

YCbCr颜色空间是YUV颜色空间的缩放和偏移版本。Y定义为8bit,标称颜色范围为16-235;Cb和Cr标称颜色表示范围为16-240。YCbCr的采样格式一般有4:4:4、4:2:2、4:1:1、和4:2:0。

这里给段MATLAB的转换代码:

close allclear allclc I=imread('1.bmp'); [H ,W ,D]=size(I); R=double(I(:,:,1));G=double(I(:,:,2));B=double(I(:,:,3)); Y0= double(zeros(H,W));Cb0 =double(zeros(H,W));Cr0 = double(zeros(H,W)); Cb1 =double(zeros(H,W/2));Cr1 = double(zeros(H,W/2));CbCr = double(zeros(H,W)); %RGB转YCbCr444 for i = 1:H for j = 1:W Y0(i, j) = 0.299*R(i, j) + 0.587*G(i, j) + 0.114*B(i, j); Cb0(i, j) = -0.172*R(i, j) - 0.339*G(i, j) + 0.511*B(i, j) + 128; Cr0(i, j) = 0.511*R(i, j) - 0.428*G(i, j) - 0.083*B(i, j) + 128; end end for i=1:1:H for j=2:2:W Cb1(i,j/2)=(Cb0(i,j-1)+Cb0(i,j))/2; endend for i=1:1:H for j=2:2:W Cr1(i,j/2)=(Cr0(i,j-1)+Cr0(i,j))/2; endend for i=1:1:H for j=1:1:W if rem(j,2)==0 CbCr(i,j)=Cr1(i,j/2); else CbCr(i,j)=Cb1(i,(j+1)/2); end endend Iycbcr(:,:,1)=Y0;Iycbcr(:,:,2)=Cb0;Iycbcr(:,:,3)=Cr0; Iycbcr=uint8(Iycbcr);Y0=uint8(Y0);Cb0=uint8(Cb0);Cr0=uint8(Cr0); Cb1=uint8(Cb1);Cr1=uint8(Cr1);CbCr=uint8(CbCr); figure(1),subplot(211),imshow(I),title('RGB');subplot(212),imshow(Iycbcr),title('YCbCr444'); figure(2),subplot(221),imshow(Cb1),title('Cb1');subplot(222),imshow(Cr1),title('Cr1');subplot(223),imshow(Cb0),title('Cb0');subplot(224),imshow(Cr0),title('Cr0'); figure(3),subplot(211),imshow(Y0),title('Y0');subplot(212),imshow(CbCr),title('CbCr');

YCbCr444转YCbCr422:首先将rgb图像转为YCbCr444然后再由YCbCr444转为YCbCr422.

还出现一个bpp???其实就是颜色深度,真装逼呢。。。

色彩深度简称色深,在计算机图形学领域表示在位图或者视频帧缓冲区中储存每一像素的颜色所用的位数,常用单位为位/像素(bpp)。色彩深度越高,可用的颜色就越多。

色彩深度是用“n位颜色”(n-bit colour)来说明的。若色彩深度是n位,即有2n种颜色选择,而储存每像素所用的位数目就是n。常见的有:

  • 1位:2种颜色,单色光,黑白二色,用于compact Macintoshes。

  • 2位:4种颜色,CGA,用于gray-scale早期的NeXTstation及color Macintoshes。

  • 3位:8种颜色,用于大部分早期的计算机显示器。

  • 4位:16种颜色,用于EGA及不常见及在更高的分辨率的VGA标准,color Macintoshes。

  • 5位:32种颜色,用于Original Amiga chipset。

  • 6位:64种颜色,用于Original Amiga chipset。

  • 7位:128种颜色。

  • 8位:256种颜色,用于最早期的彩色Unix工作站,低分辨率的VGA,Super VGA,AGA,color Macintoshes。其中红色和绿色各占3位,蓝色占2位。

  • 灰阶,有256种灰色(包括黑白)。若以24位模式来表示,则RGB的数值均一样,例如(200,200,200)。

  • 9位:512种颜色

  • 10位:1,024种颜色。

  • 12位:4,096种颜色,用于部分硅谷图形系统,Neo Geo,彩色NeXTstation及Amiga系统于HAM mode。

  • 16位:65,536种颜色,用于部分color Macintoshes(红色占5个位、蓝色占5个位、绿色占6个位,所以红色、蓝色、绿·色各有32、32、64种明暗度的变化总共可以组合出65,536种颜色)。

  • 24位:16,777,216种颜色,真彩色,能提供比肉眼能识别更多的颜色,用于显示照片。

  • 彩色图像,就是常说的24位真彩,约为1670万色。

  • 32位:基于24位而生,增加8个位(256种)的透明通道,共4,294,967,296种颜色。

  • 24位就是真彩色了。

    好像扯得远了,继续说,树莓派得文档里面说,国外最容易买得就是:

    这个板子。

    我又找到一点东西:

    这个25FPS,是因为树莓派的限制,而且如果有计算模块,可以以60FPS捕获。

    如果相机不支持隔行输出也不行。

    上面的内容是OpenHD,一共基于树莓派构建的数字FPV系统。

    继续说树莓派的事情:

    树莓派因为没有BIOS,所以Raspbian对设备的加载都是依赖在/boot/config.txt中的配置来加载。当Linux内核加载时,会读取/boot/config.txt中的设备配置和设备参数配置来把设备动态加载到Device Tree(DT)中。


    配置语法:

    dtoverlay=<device>dtparam=<param1>,<param2>,...
    • dtoverlay上配你想要加载设备,这些设备都必须是Raspbian支持的,它们位于/boot/overlays下。这是设备他们的说明位于/boot/overlays/README,可以在这里查看到Raspbian支持的每个设备的具体信息和参数(也可以直接在官方Github查阅最新的设备支持)

    • dtparam是设备的参数,具体信息可根据/boot/overlays/README中的说明来配置

    TC358743 将 HDMI 接口连接到 CSI-2 和 I2S 输出。它由TC358743 内核模块支持

    该芯片支持高达 1080p60 的 RGB888、YUV444 或 YUV422 输入 HDMI 信号。它可以转发RGB888,或者将其转换为YUV444或YUV422,并在YUV444和YUV422之间转换。仅测试了 RGB888 和 YUV422 支持。使用 2 个 CSI-2 通道时,可以支持的最大速率为 1080p30 RGB888 或 1080p50 YUV422。在计算模块上使用 4 个通道时,可以以任一格式接收 1080p60。

    HDMI 通过广播它可以支持的所有模式EDID接收设备来协商分辨率内核驱动程序不知道您希望接收的分辨率、帧速率或格式,因此由用户提供合适的文件。这是通过 VIDIOC_S_EDID ioctl 完成的,(里面都是系统级别的配置,具体使用需要查文档)或者更容易使用v4l2-ctl --fix-edid-checksums --set-edid=file=filename.txt

    如上所述,使用DV_TIMINGSioctl 配置驱动程序以匹配传入的视频。最简单的方法是使用命令v4l2-ctl --set-dv-bt-timings query如果您希望编写应用程序来处理不断变化的源,驱动程序确实支持生成 SOURCE_CHANGED 事件。更改输出像素格式是通过 VIDIOC_S_FMT 设置来实现的,但是只有像素格式字段将被更新,因为分辨率是由 dv 时序配置的。

    此驱动程序使用config.txtdtoverlay加载tc358743

    音频没有这方面的需求,我就不写了

    还找到一个输出YUV的Github库

    https://github.com/circpeoria/raspividYUV
    https://github.com/ylj2000/HDMI_To_MIPI

    https://github.com/ylj2000/MSATA_HDMI_MIPI

    https://github.com/hoglet67/RGBtoHDMI

    另外一个和树莓派有关系的

    https://github.com/peng-zhihui/HDMI-PI

    大佬的项目可不能不写

    以上全为东芝原厂的原理图,最后一共是最简单的系统连线。

    最后这个数据手册。。。送走我。。。

    网上现在就是150的价钱。。。怎么说呢,我也没有用过,不知道这个玩起来怎么样。

    因为OBS在Linux AARCH64下好像不能用,这就算无奈之举了。。。

    至于更多的玩法,我有了再玩,但是哪个时候我可能有了更喜欢玩的东西。

    https://www.arducam.com/raspberry-pi-camera-pinout/#:~:text=Raspberry%20Pi%20Camera%20Pinout%20%2822-Pin%29%20%20%20,%20%20Ground%20%2018%20more%20rows%20
    https://thepihut.com/blogs/raspberry-pi-roundup/raspberry-pi-camera-board-raspistill-command-list
    https://github.com/raspberrypi/linux/blob/rpi-5.4.y/drivers/media/i2c/tc358743.c
    https://www.kernel.org/doc/html/latest/
    https://toshiba.semicon-storage.com/ap-en/semiconductor/product/interface-bridge-ics-for-mobile-peripheral-devices/hdmir-interface-bridge-ics/detail.TC358743XBG.html
    https://en.wikipedia.org/wiki/Extended_Display_Identification_Data
    https://zh.wikipedia.org/wiki/%E8%89%B2%E5%BD%A9%E6%B7%B1%E5%BA%A6
    https://github.com/OpenHD/Open.HD/wiki/General-~-Features
    https://www.raspberrypi.com/documentation/accessories/camera.html#shooting-raw-using-the-camera-modules

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多