本来以为一天就能改完了,莫名越改越多,故单另叙述。
[success]前排提示:sdk里有份文档《sensor调试指南》可以根据里面的流程进行排查,编写代码。[/success]

首先还是在load3516文件中可以定义senor的相关寄存器,主要就三个用于定义时钟的。

0x004C PERI_CRG19 媒体CBB 频率配置寄存器1

0x0054 PERI_CRG21 媒体CBB 频率配置寄存器2

0x0040 PERI_CRG16 Sensor 时钟配置寄存器

这三个按照注释配置就好。

主要需要配置i2c或者spi通信方式,对于接线,i2c是双线spi是四线前两根线通用,所以主要是底层自己的协议配置。店家给的和274的进行了对比差距有点大故自己在这里下载了这个资源包含1080p30帧的源码据说可用,就先凑合着用。(这个代码是i2c通信的)
先来说一下文件结构吧
系统跑起来后所有需要的文件都在sdk/mpp_big-little下,其中component里是sensor的驱动,包括成像参数。include是调用的头文件。ko是硬件驱动,lib是相关动态文件,注意,编译好的sensor文件要放在这里。sample是测试程序。

前面那个load3516av200的文件是用来配置管脚的,没有加载驱动的代码。sdk中在sample/common中有加载senor的代码,所以需要进行相应修改。
makefile.param

ifeq ($(SNS), imx385_3M30_12BIT)
SENSOR_LIBS += $(REL_LIB)/libsns_imx385.a
SENSOR_TYPE = SONY_IMX385_MIPI_3M30_12BIT
CFLAGS += -DSNS_IMX385_8M30_12BIT_SINGLE
CFLAGS += -DHI_MIPI_ENABLE
endif 

sample_comm_isp.c

const ISP_SNS_OBJ_S *g_pstSnsObj[MAX_SENSOR_NUM] =
{
#elif defined (SNS_IMX385_8M30_12BIT_SINGLE)
    &stSnsImx385Obj, HI_NULL
static HI_S32 GetIspPubAttrBySns(ISP_PUB_ATTR_S *pstPubAttr)
{
switch (SENSOR_TYPE)
{
case SONY_IMX385_MIPI_3M30_12BIT:
stPubAttr.enBayer = BAYER_RGGB;
stPubAttr.f32FrameRate = 30;
stPubAttr.stWndRect.s32X = 0;
stPubAttr.stWndRect.s32Y = 0;
stPubAttr.stWndRect.u32Width = 1920;
stPubAttr.stWndRect.u32Height = 1080;
stPubAttr.stSnsSize.u32Width = 1920;
stPubAttr.stSnsSize.u32Height = 1080;
break;
}
}
static ISP_SNS_TYPE_E GetSnsType(SAMPLE_VI_MODE_E enViMode)      
{
    ISP_SNS_TYPE_E enSnsType;
    switch (enViMode)
    {
    case SONY_IMX385_MIPI_3M30_12BIT: 
    }libsns_imx385.so
}

sample_comm.h

typedef enum sample_vi_mode_e
{
    SONY_IMX385_MIPI_3M30_12BIT,
}

大概就是这么几处,主要是相关变量名写清楚。一一对应上就好。
然后就可以编译相关文件了,直接make就好,然后就可以运行了。
然而!!!还是会提示错误,也不知道哪里有问题,排查代码又无从下手只能转头想别的方式。
提示错误是因为串行图像口通信失败,这时需要根据i2c的参数来进行细致排查,寻找故障。
这时发现sdk里面有一个PQ Tools工具,用来调试图像质量的,这个可以直接出图,于是考虑不用例程,用这个软件调试摄像头
分为上位机和下位机两部分,主要修改的是下位机部分。该部分主要是增加385部分的驱动以及相关配置文件。

[SensorConfig]
file=configs/imx385/config_entry.ini

把libsns_imx385.so文件复制到/libs文件夹下
/config文件夹下新建imx385文件,然后根据其他文件进行修改
这里直接贴代码了


大部分直接复制的其他senor的,部分根据实际修改,该摄像头最大支持1080p,且目前只支持30/25fps进行响应定义,然后把.so文件放置在sbin文件夹下。
在sdk开发包中的Hi3519V101R001C01SPC040\01.software\board./HiIspTool.shdocument_cn有个HiISP 开发参考.pdf文档,里面描述了错误码,可以根据这个进行错误追踪。
然后下位机启动./HiIspTool.sh文件,该文件有一个参数
如果加载驱动没有报错,最后成功输出"initial_ok"做到这里只是把i2c调通了而已,i2c只是进行寄存器配置部分,sensor与海思芯片通信还是需要并行口的,并行口的配置不在sensor驱动部分,而是在例程以及pqtools部分分别配置,这部分需要配置sync code(老师建议先调mipi模式,这个简单,那lvds先鸽了。另起一段,其实可能难度差不多,大同小异)
[success]pqtools与sample是两部分,连驱动文件都在不同的文件夹里,这里需要注意,不要搞混了,配置文件要分别配置[/success]
这里简单介绍一下相关名词:
MIPI
MIPI 的全称是Mobile Industry Processor Interface(移动行业处理器接口),本文描述
的MIPI 接口特指物理层使用D-PHY 传输规范,协议层使用CSI-2 的通信接口。
LVDS
LVDS 的全称是Low Voltage differential Signaling(低压差分信号),通过同步码区分
消隐区和有效数据。
Lane
用于连接发送端和接收端的一对高速差分线,即可以是时钟Lane,也可以是数据
Lane。
Link
发送端和接收端之间的时钟Lane 和至少一个数据Lane 组成一个Link。
同步码
MIPI 接口使用CSI-2 里面的短包进行同步,LVDS 使用同步码区分有效数据和消
隐区。LVDS 有两种同步方式
相对而言MIPI更简单一些,不用设置同步码了。
mipi模式需要修改寄存器配置部分,通过datasheet找到了这部分

image.png

控制台以及流输出都打开需要-a 后面加上摄像头模块 imx385即可启动,注意会读取配置文件,注意输出根据错误提示寻找修改处,我这里控制台读取完成后会输出

image.png

然而目前流输出还没配置好。。。此时可以根据
cat /proc/umap/isp
cat /proc/umap/vi
cat /proc/umap/hi_mipi
来判断配置结果如何也可以使用官方给出的读取工具ssp_read/i2c_read来读取寄存器的值,这里要注意和datasheet进行结合。
例如:

image.png

硬件接在spi接口上如图所示,该部分寄存器地址位于ID:02H部分,所以采用spi读取时的

Usage: ssp_read [num_reg] [dev_width] [reg_width] [data_width] [reg_order] [data_order] .
ssp_read 0x0 0x0 0x2 0x5 1 1 1 1
usage: i2c_read
i2c_read 0x0 0x34 0x3005 0x3055 2 1

 

修改成mipi需要配置

image.png

3044h以及3054h
修改成mipi模式后,还需要根据所选择的连线数量(2lane/4 lane)来具体配置寄存器。主要见下图。

image.png

还有其他的寄存器需要配置,根据模板细细改完。
搞定后就进行编译,切记,编译了sensor驱动后还要编译sample例程。调试阶段多做printf输出,并且每次版本做点不一样的输出,保证能一眼看出来是编译的新版本。我是使用sample/venc例程 # ./sample_venc 11 如果通信顺利就能在当前文件夹下生成图像了。

image.png

此作者没有提供个人介绍。
最后更新于 2022-04-09