iMX6平台MAX9288调试

article/2025/9/17 10:47:12

因为有之前Ti ds90ub964的调试经验,这次调9288只是当做一个常规的驱动调试,坑大也得到了宝贵的经验

9288(GMSL--->MIPI CSI2)解码器解码9291和9277编码器过来的gmsl信号

iMX6DQ的mipi csi接口寄存器控制的特性:
            IPU0-CSI0: can be connected to parallel interface(GPR1 bit19 is 1) or to mipi-csi2 virtual channel0(GPR1 bit19 is 0).
            IPU0-CSI1: can only be connected to mipi-csi2 virtual channel1.
            IPU1-CSI0: can only be connected to mipi-csi2 virtual channel2.
            IPU1-CSI1: can be connected to parallel interface(GPR1 bit20 is 1) or to mipi-csi2 virtual channel3(GPR1 bit 20 is 0).

基于官方评估板和原始官方代码,选择串行还是并行的控制寄存器GPR1非常重要,控制这两个并口和一个串行接口的选择;还有由于写代码人的随意,官方ov5640_mipi中virtual channel的选择的是根据dts里的csi_id来判断的

由于ov5640的芯片同时有两种接口parallel interface和mipi-csi2,官方代码里有两个方法从默认的parallel interface改为mipi-csi2
1. 使用mipi-csi2接口的vc1通道,只需删除如下dts即可

v4l2_cap_0 {compatible = "fsl,imx6q-v4l2-capture";ipu_id = <0>;csi_id = <0>;mclk_source = <0>;status = "okay";
};

2. 使用mipi-csi2接口的vc0通道,需要更改dts和将GPR1将IPU0-CSI0连接到mipi-csi2 virtual channel0(GPR1 bit19 is 0)

将dts中的相应的csi_id = <1>改为csi_id = <0>
更改GPR1寄存器,位于arch/arm/mach-imx/mach-imx6q.c文件,将bit19置为0
如需要使用vc3则把bit20也置0,在这里第三个参数为mask已经将19,20位置0了
if (of_machine_is_compatible("fsl,imx6q-sabresd")) {regmap_update_bits(gpr, IOMUXC_GPR1, 3 << 19, 0 << 19);

这两种方法都是打开video0节点,方法1.中该节点是vc1通道,方法2.中该节点是vc0通道,如果更改mxc_v4l2_tvin的应用程序,方法2.的video1节点可以通过打开vc1来与vitrual channel可选的ov5640进行通信

iMX6的mipi csi2初始化也有严格的规范,官方手册IMX6DQRM中40.3.1要求的规范如下
1. Deassert CSI2 presetn signal (global reset);
2. Configure MIPI Camera Sensor to have all Tx lanes in PL-11 state
(STOPSTATE) if required - According to D-PHY Specification the D-PHY master
should be initialized at LP-11 state (STOPSTATE), nevertheless a CCI command
may be required to switch-on the MIPI interface;
3. D-PHY initialization - Access the D-PHY programming interface to initialize and
program the D-PHY according to the selected operating mode of the D-PHY. This is
D-PHY dependent, and this programming should be carried out according to the D-
PHY databook;
4. CSI2 Controller programming - Program the CSI2 Host Controller registers
according to the operating mode required:
• Number of Lanes (register N_LANES);
• Deassert PHY shutdown (register PHY_SHUTDOWNZ);
• Deassert PHY reset (register PHY_RSTZ);
• Deassert CSI reset (register CSI2_RESETN);
i.MX 6Dual/6Quad Applications Processor Reference Manual, Rev. 5, 06/2018
3528
NXP SemiconductorsChapter 40 MIPI - Camera Serial Interface Host Controller (MIPI_CSI)
• (Optional) Program Data IDs for matching error reporting (registers
DATA_IDS_1 and DATA_IDS_2);
• (Optional) Program the interrupt masks (registers MASK1 and MASK2);
5. CSI2 Controller programming - Read the PHY status register (PHY_STATE) to
confirm that all data and clock lanes of the D-PHY are in Stop State (i.e. ready to
receive data);
6. Configure the MIPI Camera Sensor - Access Camera Sensor using CCI interface
to initialize and configure the Camera Sensor to start transmitting a clock on the D-
PHY clock lane;
7. CSI2 Controller programming - Read the PHY status register (PHY_STATE) to
confirm that the D-PHY is receiving a clock on the D-PHY clock lane;

流程图表达式

在代码中体现为

mipi_csi2_info = mipi_csi2_get_info();/* initial mipi dphy */
if (!mipi_csi2_info) {printk(KERN_ERR "%s() in %s: Fail to get mipi_csi2_info!\n",__func__, __FILE__);return -1;
}if (!mipi_csi2_get_status(mipi_csi2_info))mipi_csi2_enable(mipi_csi2_info);if (!mipi_csi2_get_status(mipi_csi2_info)) {pr_err("Can not enable mipi csi2 driver!\n");return -1;
}mipi_csi2_set_lanes(mipi_csi2_info);
mipi_csi2_reset(mipi_csi2_info);
mipi_csi2_set_datatype(mipi_csi2_info, MIPI_DT_RGB888);/* 启动解码芯片的位置要在这个地方才符合MIPI的初始化规范,否则存在PHY_STATUS异常等问题 */
max9288_registers_init();
max9288_dump_reg();if (mipi_csi2_info) {unsigned int i;i = 0;/* wait for mipi sensor ready */mipi_reg = mipi_csi2_dphy_status(mipi_csi2_info);while (((mipi_reg & 0x700) != 0x300) && (i < 10)) {mipi_reg = mipi_csi2_dphy_status(mipi_csi2_info);i++;msleep(10);}if (i >= 10) {pr_err("mipi csi2 can not receive sensor clk! MIPI_CSI_PHY_STATE = 0x%x.\n", mipi_reg);return -1;}i = 0;/* wait for mipi stable */mipi_reg = mipi_csi2_get_error1(mipi_csi2_info);while ((mipi_reg != 0x0) && (i < 10)) {mipi_reg = mipi_csi2_get_error1(mipi_csi2_info);i++;msleep(10);}if (i >= 10) {pr_err("mipi csi2 can not reveive data correctly! MIPI_CSI_ERR1 = 0x%x.\n", mipi_reg);return -1;}
}

按照这个规范初始化mipi后在关注代码中几个状体寄存器的值,参考论坛的Debug steps for customer MIPI sensor文档
主要关注MIPI_CSI_PHY_STATE和MIPI_CSI_ERR1/2,通常MIPI_CSI_PHY_STATE=0x300,MIPI_CSI_ERR1/2=0x0,这两个寄存器对了基本不会有问题了,在分辨率和时钟等再做细微调整

9288就调试完了,过程是相对简单的,之前因为显示驱动问题一直查capture,做了好些时钟和分辨率的计算,如下做个笔记

MIPI 性能

带宽部分

The maximum MIPI-CSI2 frequency is 200 MHz
Each lane can transfer up to 1000 Mb/s or up to 800 Mb/s when all four lanes are used
The required minimum operating frequency of the interface is calculated as:
F = FH * FW * FPS * BI * DF
Where:
• FH—frame height (in pixels)
• FW—frame width (in pixels)
• FPS—frame rate (frames per second)
• DF—data format; defines the number of cycles needed to send a single pixel
• BI—blank interval; a 35 % (1.35) overhead provides a safe estimate for the minimum frequency

Or as:
the minimum operating frequency can be also calculated as:
F = TFH * TFW * FPS * DF
where:
• TFH—total frame height = front porch + vsync + back porch
• TFW—total frame width = front porch + hsync + back porch
• FPS—frame rate (frames per second)
• DF—data format; defines the number of cycles needed to send a single pixel

• Camera 1—virtual channel 0: 1024x768, 4-lane configuration, 30 fps, YUV422 format:
1024 * 768 * 30 fps * 1 cycle/pixel * 1.35 blank interval = 31.85 MHz
• Camera 2—virtual channel 1: 1920x1080, 4-lane configuration, 30 fps, YUV422 format:
1920 * 1080 * 30 fps * 1 cycle/pixel * 1.35 blank interval = 83.98 MHz
Total bandwidth = 31.85 MHz + 83.98 MHz = 115.83 MHz
更多例子请查看手册MIPI–CSI2 Peripheral on i.MX6 MPUs(AN5305)

MIPI物理层时钟
To calculate the MIPI data rate, use these equations:
MIPI data rate = (MIPI clock * 2) * Number of lanes >= Pixel clock * Bits-per-pixel
MIPI clock = (Pixel clock * Bits-per-pixel) / (Number of lanes) / 2
For example, a video input of 720p, 59.94 fps, and YUV422 is calculated as follows:
Pixel clock = 1280 * 720 * 59.94 fps * 1 cycle/pixel * 1.35 blank interval = 74.57 MHz
Total MIPI data rate is 74.25 M * 16 bits = 1193 Mb/s.
The frame blank intervals and the interface packaging overhead were added as the 1.35 factor in the
pixel clock equation above.
For a 2-lane interface:
MIPI clock = 1193 / 2 / 2 = 298.25 MHz
MIPI_CSI2_PHY_TST_CTRL1 setting = 298.25 MHz * 2 (DDR mode) = 596.5 MHz
According to Table 2, MIPI_CSI2_PHY_TST_CTRL1 = 0x2E.
For a 4-lane interface:
MIPI clock = 1193 / 4 / 2 = 149.12 MHz
MIPI_CSI2_PHY_TST_CTRL1 setting = 149.12 MHz * 2 (DDR mode) = 298.24 MHz

以上debug参考了如下文档,不知为啥要5分,我本来只想要1分了,没地方设置
https://download.csdn.net/download/bgk112358/11493552


http://chatgpt.dhexx.cn/article/ETUNZMRL.shtml

相关文章

【imx6ul】从头搭建imx6ul开发环境(uboot、内核编译及烧入、mfgtools详细使用方法)

实现一个自制的Bootloader见: 01-基于imx6ul从0自制Bootloader专栏实现总结_【星星之火】的博客-CSDN博客 硬件平台&#xff1a;自制imx6ul&#xff08;详见【ALLEGRO】从零制作imx6-PCB核心板全流程_【星星之火】的博客-CSDN博客&#xff09;系统&#xff1a;linux-4.1.15文件…

飞思卡尔IMX6处理器的GPIO配置方式

在linux或android系统中&#xff0c;假如我们要配置飞思卡尔IMX6处理器的GPIO管脚&#xff0c;比如是GPIO_19这个管脚&#xff0c;那么要像这样&#xff1a; #define MX6Q_PAD_GPIO_19__GPIO_4_5 \(_MX6Q_PAD_GPIO_19__GPIO_4_5 | MUX_PAD_CTRL(NO_PAD_CTRL))其中_MX6Q_PAD_…

迅为IMX6Q四核核心板商业级|工业级|IMX6Plus版本|IMX6D双核核心板

迅为IMX6Q核心板工业级/Plus版本 IMX6Q处理器&#xff1a;兼容单核&#xff0c;双核&#xff0c;工业级&#xff0c;汽车级&#xff0c;IMX6Q最新Plus版本&#xff0c;共用同一底板&#xff0c;高端产品无忧。 i.MX6系列针对消费电子、工业控制和汽车应用领域&#xff0c;它将…

imx6ull驱动开发经验

1、背景 imx6ull驱动开发基于正点原子的开发板&#xff0c;上面运行linux 4.1.15内核&#xff0c;根文件系统为ubuntu 16.05.5 LTS. 2、加载驱动文件chrdevbase.ko文件时&#xff0c;先使用depmod生成依赖文件时&#xff0c;提示无modules.order, modules.builtin无这两个文件…

【盘点】imx6的应用

导读: i.mx6系列应用处理器因其高性能&#xff0c;低功耗以及令人瞩目的多媒体功能等特性&#xff0c;被广泛运用于消费电子、工业以及汽车车载娱乐系统等新应用中。 今天为大家盘点一下启扬i.MX6嵌入式主板的部分实际应用。 以智能、多媒体为中心、基于触摸的设备市场正在迅速…

imx6 usb增强信号强度

USB信号 参考&#xff1a;官方文档 USB信号完整性取决于许多因素&#xff0c;如电路设计、PCB布局、堆叠和阻抗。每个产品可能彼此不同&#xff0c;因此客户需要微调参数&#xff0c;以获得最佳的信号质量。 测试板已经路由出两个USB端口:一个OTG1&#xff0c;一个主机。每个端…

iMX6ULL上手体验

CSDN仅用于增加百度收录权重&#xff0c;排版未优化&#xff0c;日常不维护。请访问&#xff1a;www.hceng.cn 查看、评论。 本博文对应地址: https://hceng.cn/2018/03/28/iMX6ULL上手体验/#more 第一次接触NXP/Freescale的SOC&#xff0c;记录拿到板子后快速上手的技巧和思维…

imx6ul 驱动详解

链表的知识&#xff1a; struct list_head { struct list_head *next, *prev; };API函数 函数 功能LIST_HEAD声明并初始化双向链表。INIT_LIST_HEAD初始化双向链表。list_add在链表头head节点后面插入一个新的节点new。list_add_tail在链表末尾tail节点后面插入一个新的节点n…

IMX6 / IMX8 系列芯片简单对比

imx6有&#xff1a; imx8 分为&#xff1a; IMX8/IMX8M/IMX8X三个系列 IMX8有&#xff1a;iMX 8qm 和 IMX8-QP IMX8M有&#xff1a;IMX8mn 、 IMX8mm 、 IMX8mq 、IMX8mp 3.IMX8X 有&#xff1a;iMX8dxp / iMX8qxp 和 iMX8dx

IMX6启动流程

目录 1. 流程图 2. u-boot.imx的构造 1. 流程图 正常情况下&#xff0c;一台IMX6设备的启动路径就是图中自上而下最左边那条路&#xff1a; 启动/复位后先检查CPU的ID(每颗芯片独一无二) ------> 检查复位状态(有没有按下复位键) ------> 检查boot模式(mmc? USB? SPI…

ARM恩智浦IMX6系列-产品开发无忧-四种主控核心

ITOP-IMX6 开发平台是基于 NXP 的 IMX6 系类的芯片开发的一款产品&#xff0c;CPU 采用 Cortex-A9 内核&#xff0c;主频达1Ghz。 ITOP-IMX6 开发板平台均由核心板和底板构成&#xff0c;核心板的主要芯片有 CPU,内存&#xff0c;EMMC&#xff0c;电源管理&#xff0c;EEPROM 等…

关于NXP公司的IMX6系列芯片参考资料体系介绍

IMX6系列芯片由FreeScale公司基于ARM核设计开发&#xff0c;该公司于2015年被NXP公司收购。之前由FreeScale提供支持的资源被整合进NXP支持体系&#xff0c;资料内部FreeScale和NXP的标记都有&#xff0c;文档内部原有资源链接失效&#xff0c;给人混乱感。加之IMX6系列芯片本身…

伺服电机矢量控制原理与仿真(1)控制系统的建立

自动控制原理综合实践 直流伺服电机及其控制为什么是六步换向法类比有刷直流电机类比三相异步电机这些差异意味着什么 从六步换向到FOCFOC的大体流程FOC的目的电流环的执行器&#xff1a;SVPWM 从物理走向数学直流伺服电机的数学模型&#xff08;正弦式&#xff09;从数学模型到…

台达PLC模拟量或台达伺服电机控制模块程序案例

台达PLC模拟量或台达伺服电机控制模块程序案例&#xff0c;二选一 ID:6958618562901252Anh13309639501 以下内容不属于本博内容&#xff0c;仅仅是相关参考&#xff1a; 台达PLC采用可以编制程序的存储器&#xff0c;用来在其部存储执行逻辑运算、顺序运算、计时、计数和算术运…

使用Arduino开发板控制伺服电机

大多数情况下&#xff0c;直流电机控制的控制方法都是非常简单的&#xff08;只需要连接电源和地&#xff09;。伺服电机有一些不同&#xff0c;它使用3根线连接&#xff08;电源、地和信号&#xff09;将电机移动到某个旋转位置。该位置由信号线上发送的信号决定。一旦电机到达…

步进伺服电机控制程序: 1.实现步进电机的正转、反转控制 2.相对和绝对位置运动

步进伺服电机控制程序: 1.实现步进电机的正转、反转控制 2.相对和绝对位置运动 3.电机复位找原点功能 4.显示电机的当前位置 硬件:1西门子S7-200PLC 2.昆仑通泰MCGS触摸屏 3.步进电机驱动器(不限制厂家) 西门子200步进电机控制 4810625077520119gao699592

三菱fx3u型PLC和昆仑通泰MCGS触摸屏控制松下伺服电机控制程序

三菱fx3u型PLC和昆仑通泰MCGS触摸屏控制松下伺服电机控制程序 一、包含内容&#xff1a; mcgs7.7触摸屏程序 2.三菱FX3U型PLC梯形图程序一个&#xff0c;带IO表 3.PLC和伺服电机接线图一个 4.伺服电机使用手册 二、主要功能&#xff1a; 1.伺服电机运动速度设定 2.伺服电机运动…

伺服电机

1.简介 伺服系统&#xff08;servomechanism&#xff09;是使物体的位置、方位、状态等输出被控量能够跟随输入目标&#xff08;或给定值&#xff09;的任意变化的自动控制系统。伺服主要靠脉冲来定位&#xff0c;基本上可以这样理解&#xff0c;伺服电机接收到1个脉冲&#xf…

机器人关节伺服电机PID串级控制

机器人的运动控制系统 通常由电机控制器、电机驱动、电机本体(多为伺服电机)组成。电机控制器具备智能运算功能&#xff0c;并可传送指令以驱动电机。驱动可提供增压电流&#xff0c;根据控制器指令以驱动电机。电机可以直接移动机器人&#xff0c;也可通过传动系统或链条系统…

机器人关节伺服电机三环控制方式

伺服电机&#xff08;servo motor &#xff09;是指在伺服系统中控制机械元件运转的发动机&#xff0c;是一种补助马达间接变速装置。 伺服电机可以控制速度&#xff0c;位置精度非常准确&#xff0c;可以将电压信号转化为转矩和转速以驱动控制对象。伺服电机转子转速受输入信…