6.7物联网RK3399项目开发实录-驱动开发之Camera摄像头的使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】

链接:https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwd=c53f

Camera 使用

简介

AIO-3399J 开发板分别带有两个 MIPI,MIPI 支持最高 4K 拍照,并支持 1080P 30fps 以上视频录制。此外,开发板还支持 USB 摄像头。

本文以 OV13850/OV5640 摄像头为例,讲解在该开发板上的配置过程。

  • 接口效果图

DTS 配置

复制代码
isp0: isp@ff910000 {
    …
    status = "okay";
}
isp1: isp@ff920000 {
    …
    status = "okay";
}

驱动说明

与摄像头相关的代码目录如下:

复制代码
Android:
 `- hardware/rockchip/camera/
    |- CameraHal             // 摄像头的 HAL 源码
    `- SiliconImage          // ISP 库,包括所有支持模组的驱动源码
       `- isi/drv/OV13850    // OV13850 模组的驱动源码
          `- calib/OV13850.xml // OV13850 模组的调校参数
 `- device/rockchip/rk3399/
    |- rk3399_firefly_aio_box
    |  `- cam_board.xml      // 摄像头的参数设置

 Kernel:
 |- kernel/drivers/media/video/rk_camsys  // CamSys 驱动源码
 `- kernel/include/media/camsys_head.h

配置原理

设置摄像头相关的引脚和时钟,即可完成配置过程。

从以下摄像头接口原理图可知,需要配置的引脚有:AF_VDD28DOVDD18AVDD28DVDD12PWDN1RSTMCLK

  • MIPI 接口
  • AF_VDD28 可不做配置。

  • DOVDD18AVDD28DVP_PWR 控制,DVP_PWR 对应 RK3399 的 GPIO1_C1

  • DVDD12CIF_POWER 引脚控制,CIF_POWER 对应 RK3399 上的 GPIO1_A1 引脚:
  • MIPI CIF:PWDN0(共用)、PWDN1、RST 对应 GPIO1_C1、GPIO1_A1、GPIO0_B0 引脚:

在开发板中,除了 DVDD12 (CIF_POWER) 要在 DTS 中设置以外,其它引脚都是在 cam_board.xml 中设置。

配置步骤

配置 Android

修改 device/rockchip/rk3399/$(TARGET_PRODUCT)/cam_board.xml 来注册摄像头:

复制代码
<BoardFile>
<BoardXmlVersion version="v0.0xf.0"></BoardXmlVersion>
<CamDevie>
<HardWareInfo>
<Sensor>
<SensorName name="OV13850"/>
<SensorLens name="50013A1"/>
<SensorDevID IDname="CAMSYS_DEVID_SENSOR_1B"/>
<SensorHostDevID busnum="CAMSYS_DEVID_MARVIN"/>
<SensorI2cBusNum busnum="1"/>
<SensorI2cAddrByte byte="2"/>
<SensorI2cRate rate="100000"/>
<SensorAvdd name="NC" min="28000000" max="28000000" delay="0"/>
<SensorDvdd name="NC" min="12000000" max="12000000" delay="0"/>
<SensorDovdd name="NC" min="18000000" max="18000000" delay="5000"/>
<SensorMclk mclk="24000000" delay="1000"/>
<SensorGpioPwen ioname="RK30_PIN1_PC1" active="1" delay="1000"/>
<SensorGpioRst ioname="RK30_PIN0_PB0" active="0" delay="1000"/>
<SensorGpioPwdn ioname="RK30_PIN1_PA1" active="0" delay="0"/>
<SensorFacing facing="back"/>
<SensorInterface interface=" MIPI "/>
<SensorMirrorFlip mirror="0"/>
<SensorOrientation orientation="180"/>
<SensorPowerupSequence seq="1234"/>
<SensorFovParemeter h="60.0" v="60.0"/>
<SensorAWB_Frame_Skip fps="15"/>
<SensorPhy phyMode="CamSys_Phy_Mipi" lane="2" phyIndex="1" sensorFmt="CamSys_Fmt_Raw_10b"/>
</Sensor>
<VCM>
<VCMDrvName name="DW9714"/>
<VCMName name="HuaYong6505"/>
<VCMI2cBusNum busnum="1"/>
<VCMI2cAddrByte byte="0"/>
<VCMI2cRate rate="0"/>
<VCMVdd name="NC" min="0" max="0" delay="0"/>
<VCMGpioPower ioname="NC" active="0" delay="1000"/>
<VCMGpioPwdn ioname="NC" active="0" delay="0"/>
<VCMCurrent start="20" rated="80" vcmmax="100" stepmode="13" drivermax="100"/>
</VCM>
<Flash>
<FlashName name="Internal"/>
<FlashI2cBusNum busnum="0"/>
<FlashI2cAddrByte byte="0"/>
<FlashI2cRate rate="0"/>
<FlashTrigger ioname="NC" active="0"/>
<FlashEn ioname="NC" active="0"/>
<FlashModeType mode="1"/>
<FlashLuminance luminance="0"/>
<FlashColorTemp colortemp="0"/>
</Flash>
</HardWareInfo>
<SoftWareInfo>
<AWB>
<AWB_Auto support="1"/>
<AWB_Incandescent support="1"/>
<AWB_Fluorescent support="1"/>
<AWB_Warm_Fluorescent support="1"/>
<AWB_Daylight support="1"/>
<AWB_Cloudy_Daylight support="1"/>
<AWB_Twilight support="1"/>
<AWB_Shade support="1"/>
</AWB>
<Sence>
<Sence_Mode_Auto support="1"/>
<Sence_Mode_Action support="1"/>
<Sence_Mode_Portrait support="1"/>
<Sence_Mode_Landscape support="1"/>
<Sence_Mode_Night support="1"/>
<Sence_Mode_Night_Portrait support="1"/>
<Sence_Mode_Theatre support="1"/>
<Sence_Mode_Beach support="1"/>
<Sence_Mode_Snow support="1"/>
<Sence_Mode_Sunset support="1"/>
<Sence_Mode_Steayphoto support="1"/>
<Sence_Mode_Pireworks support="1"/>
<Sence_Mode_Sports support="1"/>
<Sence_Mode_Party support="1"/>
<Sence_Mode_Candlelight support="1"/>
<Sence_Mode_Barcode support="1"/>
<Sence_Mode_HDR support="1"/>
</Sence>
<Effect>
<Effect_None support="1"/>
<Effect_Mono support="1"/>
<Effect_Solarize support="1"/>
<Effect_Negative support="1"/>
<Effect_Sepia support="1"/>
<Effect_Posterize support="1"/>
<Effect_Whiteboard support="1"/>
<Effect_Blackboard support="1"/>
<Effect_Aqua support="1"/>
</Effect>
<FocusMode>
<Focus_Mode_Auto support="1"/>
<Focus_Mode_Infinity support="1"/>
<Focus_Mode_Marco support="1"/>
<Focus_Mode_Fixed support="1"/>
<Focus_Mode_Edof support="1"/>
<Focus_Mode_Continuous_Video support="0"/>
<Focus_Mode_Continuous_Picture support="1"/>
</FocusMode>
<FlashMode>
<Flash_Mode_Off support="1"/>
<Flash_Mode_On support="1"/>
<Flash_Mode_Torch support="1"/>
<Flash_Mode_Auto support="1"/>
<Flash_Mode_Red_Eye support="1"/>
</FlashMode>
<AntiBanding>
<Anti_Banding_Auto support="1"/>
<Anti_Banding_50HZ support="1"/>
<Anti_Banding_60HZ support="1"/>
<Anti_Banding_Off support="1"/>
</AntiBanding>
<HDR support="1"/>
<ZSL support="1"/>
<DigitalZoom support="1"/>
<Continue_SnapShot support="1"/>
<InterpolationRes resolution="0"/>
<PreviewSize width="1920" height="1080"/>
<FaceDetect support="0" MaxNum="1"/>
<DV>
<DV_QCIF name="qcif" width="176" height="144" fps="10" support="1"/>
<DV_QVGA name="qvga" width="320" height="240" fps="10" support="1"/>
<DV_CIF name="cif" width="352" height="288" fps="10" support="1"/>
<DV_VGA name="480p" width="640" height="480" fps="10" support="0"/>
<DV_480P name="480p" width="720" height="480" fps="10" support="0"/>
<DV_720P name="720p" width="1280" height="720" fps="10" support="1"/>
<DV_1080P name="1080p" width="1920" height="1080" fps="10" support="1"/>
</DV>
</SoftWareInfo>
</CamDevie>
</BoardFile>

主要修改的内容如下:

  • Sensor 名称
复制代码
<SensorName name="OV13850" ></SensorName>

该名字必须与 Sensor 驱动的名字一致,目前提供的 Sensor 驱动格式如下:

复制代码
libisp_isi_drv_OV13850.so
  • Sensor 软件标识
复制代码
<SensorDevID IDname="CAMSYS_DEVID_SENSOR_1A"></SensorDevID>

注册标识不一致即可,可填写以下值:

复制代码
CAMSYS_DEVID_SENSOR_1A
CAMSYS_DEVID_SENSOR_1B
CAMSYS_DEVID_SENSOR_2
  • 采集控制器名称
复制代码
<SensorHostDevID busnum="CAMSYS_DEVID_MARVIN" ></SensorHostDevID>

目前只支持:

复制代码
CAMSYS_DEVID_MARVIN
  • Sensor 所连接的主控 I2C 通道号
复制代码
<SensorI2cBusNum busnum=3></SensorI2cBusNum>

具体通道号请参考摄像头原理图连接主控的 I2C 通道号。

  • Sensor 寄存器地址长度,单位:字节
复制代码
<SensorI2cAddrByte byte="2"></SensorI2cAddrByte>
  • Sensor 的 I2C 频率,单位:Hz,用于设置 I2C 的频率。
复制代码
<SensorI2cRate rate="100000"></SensorI2cRate>
  • Sensor 输入时钟频率, 单位:Hz,用于设置摄像头的时钟。
复制代码
<SensorMclk mclk="24000000"></SensorMclk>
  • Sensor AVDD 的 PMU LDO 名称。如果不是连接到 PMU,那么只需填写 NC。
复制代码
<SensorAvdd name="NC" min="0" max="0"></SensorAvdd>
  • Sensor DOVDD 的 PMU LDO 名称。
复制代码
<SensorDovdd name="NC" min="18000000" max="18000000"></SensorDovdd>

如果不是连接到 PMU,那么只需填写 NC。注意 min 以及 max 值必须填写,这决定了 Sensor 的 IO 电压。

  • Sensor DVDD 的 PMU LDO 名称。
复制代码
<SensorDvdd name="NC" min="0" max="0"></SensorDvdd>

如果不是连接到 PMU,那么只需填写 NC。

  • Sensor PowerDown 引脚。
复制代码
<SensorGpioPwdn ioname="RK30_PIN2_PB6" active="0"></SensorGpioPwdn>

直接填写名称即可,active 填写休眠的有效电平。

  • Sensor Reset 引脚。
复制代码
<SensorGpioRst ioname="RK30_PIN3_PB0" active="0"></SensorGpioRst>

直接填写名称即可,active 填写复位的有效电平。

  • Sensor Power 引脚。
复制代码
<SensorGpioPwen ioname="RK30_PIN0_PB3" active="1"></SensorGpioPwen>

直接填写名称即可, active 填写电源有效电平。

  • 选择 Sensor 作为前置还是后置。
复制代码
<SensorFacing facing="front"></SensorFacing>

可填写 frontback

  • Sensor 的接口方式
复制代码
<SensorInterface mode=" MIPI "></SensorInterface>

可填写如下值:

复制代码
CCIR601
CCIR656
MIPI
SMIA
  • Sensor 的镜像方式
复制代码
<SensorMirrorFlip mirror="0"></SensorMirrorFlip>

目前暂不支持。

  • Sensor 的角度信息
复制代码
<SensorOrientation orientation="0"></SensorOrientation>
  • 物理接口设置

MIPI

复制代码
<SensorPhy phyMode="CamSys_Phy_Mipi" lane="2" phyIndex="1" sensorFmt="CamSys_Fmt_Raw_10b"></SensorPhy>
  • phyMode:Sensor 接口硬件连接方式,对 MIPI Sensor 来说,该值取 CamSys_Phy_Mipi

  • lane:Sensor mipi 接口数据通道数

  • phyIndex:Sensor MIPI 连接的主控 MIPI phy 编号

  • sensorFmt:Sensor 输出数据格式,目前仅支持 CamSys_Fmt_Raw_10b

编译内核需将 drivers/media/video/rk_camsys 驱动源码编进内核,其配置方法如下:

在内核源码目录下执行命令:

复制代码
make menuconfig

然后将以下配置项打开:

复制代码
Device Drivers  --->
 Multimedia support  --->
        camsys driver
         RockChip camera system driver  --->
                   camsys driver for marvin isp
                   camsys driver for cif

最后执行:

复制代码
make ARCH=arm64 rk3399-firefly-aio.img

即可完成内核的编译。

调试方法

终端下可以直接修改 /system/etc/cam_board.xml 调试各参数并重启生效

FAQs

  1. 无法打开摄像头,首先确定 sensor I2C 是否通信。若不通则可检查 mclk 以及供电是否正常(Power/PowerDown/Reset/Mclk/I2cBus)分别排查

  2. 支持列表ː

  • 13Mː OV13850/IMX214-0AQH5

  • 8Mː OV8825/OV8820/OV8858-Z(R1A)/OV8858-R2A

  • 5Mː OV5648/OV5640

  • 2Mː OV2680

详细资料可查询 SDK/RKDocs

相关推荐
Elias不吃糖11 分钟前
第四天学习总结:C++ 文件系统 × Linux 自动化 × Makefile 工程化
linux·c++·学习
噜啦噜啦嘞好11 分钟前
Linux进程信号
linux·运维·服务器
极造数字18 分钟前
从EMS看分布式能源发展:挑战与机遇并存
人工智能·分布式·物联网·信息可视化·能源·制造
REDcker1 小时前
Linux 进程资源占用分析指南
linux·运维·chrome
samroom1 小时前
Linux系统管理与常用命令详解
linux·运维·服务器
一叶之秋14122 小时前
Linux基本指令
linux·运维·服务器
码割机2 小时前
Linux服务器安装jdk和maven详解
java·linux·maven
亚林瓜子2 小时前
在amazon linux 2023上面源码手动安装tesseract5.5.1
linux·运维·服务器·ocr·aws·ec2
爱学习的大牛1232 小时前
Ubuntu 24.04 安装 FreeSWITCH 完整教程
linux·freeswitch
go_bai2 小时前
Linux--进程池
linux·c++·经验分享·笔记·学习方法