配置思路

1. 如何分析视频接口

选择使用MIPI还是LVDS,所需要做的工作有:
1) 硬件配置正确,即配置正确的公模电压,差分电路,正确的接口。
2) 配置相关的MIPI上层抽象接口。
3) 配置相关的寄存器操作。
注:
1、上层硬件配置,此处硬件工作较多,不做深入研究。
2、相关寄存器操作主要集中在XXX_cmos.c与XXX_ctrl.c中,具体配置以另外叙述。
3、Mipi上层抽象接口为海思抽象出来的接口,此层自行配置了相关寄存器,本文主要基于HI3516D芯片进行配置,这也是本次研究的重点。

2. 如何配置上层抽象接口

此处只针对于配置上层抽象接口。主要为LVDS配置,MIPI方式配置较为简单,不做叙述。

  1. 查看sensor支持LVDS还是mipi接口。实际操作为查看datasheet,一般前几页会有支持的接口名称,或者搜索LVDS,然后搜索DOP1或者DOM1。LVDS的接口使用名称叫做DOPX/DOMX,而MIPI的接口一般为DMOXP/DMOXN。
  2. 查看硬件配置是否为LVDS接口,实际操作为查看硬件电路图。
  3. 根据硬件电路图,确定LVDS的lane对接方式。实际操作为对接方式,例如OV4689操作
  4. 根据sensor,查看是否支持宽动态,支持宽动态的方式,配置HI_WDR_MODE。
  5. 确定同步方式。实际操作为搜索LVDS,查看是为SOL方式还是SAV方式。
  6. 搜寻同步码。实际操作为搜寻sync_code。

3. 视频上层抽象接口配置

海思接口配置,结构体如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct
{
/* input mode:MIPI/LVDS/SUBLVDS/HISPI/DC */
input_mode_t  input_mode;
    union
{
/* for MIPI configuration */
        mipi_dev_attr_t     mipi_attr;   
/* for LVDS/SUBLVDS/HISPI configuration */
        lvds_dev_attr_t     lvds_attr;                
 };
 } combo_dev_attr_t;

input_mode为输入模式,代码会根据设置的输入,自行载入MIPI配置还是LVDS配置。
以OV4689 MIPI配置实测:

OV4689配置MIPI

OV4689确定使用MIPI设置,从硬件电路可看出,不累述。
MIPI的配置结构体如下:

1
2
3
4
5
typedef struct
{
    raw_data_type_e  raw_data_type; /* raw data type: 8/10/12/14 bit */
    short lane_id[MIPI_LANE_NUM];   /* lane_id: -1 - disable */
}mipi_dev_attr_t;

1.   确定datasheet支持的接口

OV4689支持的接口如下:

中OV4689只支持MIPI 4-lane的接口:

2. 确定传输数据

根据文档,传输数据为10位数据。 (海思默认默认配置为12位,此处经过确认,配置成10位也是可以的,通过读取海思3516D寄存器,如论如何配置,寄存器都是10位数据,暂时不知道是不是应用层配置无效)

3. 确定lane的配置。

首先,查看硬件接口,主板3516A接口如下所示:

主板引出来的接口板如下如是:

而OV4689的sensor板插线板如下所示:

构成关系如下:

从海思3516A的芯片出来的MIPI0_D0对应着OV4689sensor的MIPI0_D1, MIPI0_D0对应着OV4689的MIPI0_D3。以此类推,当3516A出来的lane为0,1,2,3时候,对应OV4689为1,3,0,2,配置关系如下:

1
2
3
4
5
6
7
8
9
10
11
12
combo_dev_attr_t MIPI_4lane_SENSOR_OV4689_12BIT_ATTR =
{
    .input_mode = INPUT_MODE_MIPI, 
    {
        .mipi_attr =   
        {
            RAW_DATA_12BIT,
            {1, 3, 0, 2, -1, -1, -1, -1}     //-1表示不支持      
//            {1, 0, 2, 3, -1, -1, -1, -1}
        }
    }   
};

注:此处有一次事故,由于sensor的mipi接口与海思的mipi接口有改动,所以造成此处接口需要重新配置。

LVDS配置与imx123学习

1. 查看imx123datasheet,是否支持LVDS。


由配置可知,imx123支持LVDS与MIPI,详细配置如下:

2查看硬件采用的是MIPI还是LVDS


由配置可知,imx123配置的是LVDS硬件,而MIPI的硬件是没有配置的,imx123硬件的MIPI如下:

3. 软件配置LVDS配置

Imx123使用的是LVDS配置,所需工作如下:
配置关系如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
combo_dev_attr_t LVDS_4lane_SENSOR_IMX123_12BIT_3M_ATTR_WDR =
{
    /* input mode */
    .input_mode = INPUT_MODE_LVDS,
    {
        .lvds_attr = {
            .img_size = {2048, 1536},//图像大小
            HI_WDR_MODE_DOL_2F, //宽动态模式,暂时只支持2F
            LVDS_SYNC_MODE_SAV,//设置起始方式,sav与SOL等方式
            RAW_DATA_12BIT,//图像数据大小
            LVDS_ENDIAN_BIG,//数据传输方式,大端小端方式
            LVDS_ENDIAN_BIG,//同步传输方式,大端小端方式
            .lane_id = {0, 1, 2, 3, 4, 5, 6, 7},//同步通道设置
            .sync_code = {
                   {{0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0}},
                    {{0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0}},
                    {{0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0}},
                    {{0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0}},
                    {{0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0}},
                    {{0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0}},
                    {{0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0}},
                    {{0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0},
                    {0xab0, 0xb60, 0x800, 0x9d0}}                 }
        }
    }
};

1)首先设置图像大小

根据配置寄存器我们可知道,设置的图像为2048x1536。(具体如何配置寄存器,后续可在附件配置里讲)

2)配置宽动态模式

我们可知道imx123支持的宽动态为

而海思对于宽动态支持的力度较小,目前只是支持两帧合一帧,即HI_WDR_MODE_DOL_2F,故选择HI_WDR_MODE_DOL_2F。(几种宽动态模式差异,可在后续讲)

3)配置起始方式

首先,在datasheet里搜寻LVDS,在设置页面可知,支持SAV格式,文档如下:

具体SAV与SOL的区别,有兴趣可以看海思文档

1
2
Hi3516A/Hi3516D 专业型HD IP Camera Soc用户指南.pdf
HiMPP IPC V2.0 媒体处理 FAQ.pdf

关于MIPI的部分,也可以直接咨询本人。

4)设置图像数据方式

数据格式,通过文档可知

MIPI支持12或者14,查看

相关设置可知,LVDS也是支持12bit或者14bit相关数据。根据寄存器配置,我们一般使用为RAW_DATA_12BIT。

5)设置数据同步大小端

由文档可知,此数据是以大端设置为先,故设置为LVDS_ENDIAN_BIG。

6)设置同步传输大小端

与第五条类似。

7)设置同步通道

设置同步通道,首先我们是查看文档,是支持LVDS的,并且相关GPIO对应如下:

其中我们硬件设计的时候,同步也有相关标记:

其中硬件设计为8通道设计,DLOP/MD对应的是Ch1.。硬件已做了相关标记。通过寄存器的配置,软件设置8通道。

故配置通道为{1,2,3,4,5,6,7,8}。此配置可参照OV4689的通道配置,sensor出来的ch通道一定要和3516A的ch通道一一对应!

8)设置同步码

设置同步码,可以慢慢看datasheet文档,也可以直接搜sync code两个关键字

我们可以看到,图像的同步码按照图像配置来设置,我们一般用12位数据,其中每个同步码一般为四位,按照SAV(invalid)EAV(invalid), SAV(valid),EAV(valid)顺序来说12位的同步码为:

1
2
3
4
FFFh,000h,000h,AB0h
FFFh,000h,000h,B60h
FFFh,000h,000h,800h
FFFh,000h,000h,9D0h

其中前三个同步码为相同数字,故每个通道的同步码为 {0xab0, 0xb60, 0x800, 0x9d0}。
另(拓展)

  • Sav英文名为start audio vide,EAV为end audio video
  • 图像为什么从invaid SAV开始,可以参考下图。