linux imx?Ubuntu centos
Rockchip Camera bring up 简述
在ISP调试过程中,前期的camera环境搭建,我们称之为bring up,这部分工作往往被忽视。我最近调试RK1126时,尝试重新点亮一颗sensor,以加深对camera工作流程的理解。当前,调试行业面临寒冬,竞争愈发激烈。
为了交流学习,我创建了QQ群,欢迎行业内的朋友加入,共享内推资源。希望tuning专家及驱动工程师都能参与,共同讨论行业发展。
以RK1126+os04a10为默认配置的开发板为例,我们尝试将相同pin的imx415点亮。首先,下载sdk,通过公司服务器在Linux环境中解压并更新代码,这需要较长时间。至此,具备了编译环境。全编开发板时,选择28 boardconfig.mk,可编译出固件IMG,实现os04a10的点亮。
更换imx415后,我们需先在dts文件中挂载此sensor,文件位于rv1126_rv1109\kernel\arch\arm\boot\dts路径下。接着,在sdk中找到imx415驱动文件imx415.c,并调整其上电时序,修改dts配置。随后,尝试编译boot和kernel,烧录后发现media-ctl无法识别imx415节点。通过检查Makefile文件,发现未正确开启imx415.c,导致生成的imx415.o未能包含驱动。修正后,kernel重新编译,media-ctl已能识别imx415节点,使用rkispdemo预览出图。
bring up过程涉及大量Linux基础知识,对纯调试人员构成挑战。点亮过程有助于调试人员深入了解tuning前的准备工作。实际上,与度信(卓辰)盒子出图相似,都需要正确的上电时序,找到i2c后,通过下发寄存器数组实现成像。
由于我非软件背景,对嵌入式知识有限,点亮新sensor的过程复杂且常遇bug。行业内卷时,希望同行们相互支持,共渡难关。
linux TTY子系统 之 串口
TTY结构体关系图
TTY设备
TTY驱动类型包含串口,其层次结构分为两层,下层为直接与硬件接触的串口驱动层,上层为包括TTY核心层及线路规程的tty层。用户空间通过注册的字符设备节点访问串口设备。
芯片厂商定义一个全局的struct uart_driver类型变量,包含一些不涉及底层硬件访问的信息,如名字、设备号等。在struct uart_driver imx_uart_uart_driver中,有两个成员未被赋值,分别是tty_driver和uart_state。uart_driver代表上层,会在uart_register_driver过程中赋值;而uart_state代表下层,会在相同过程中分配空间,但真正设置硬件相关的东西是uart_state->uart_port,需要通过调用uart_add_one_port添加。
调用uart_register_driver将struct uart_driver类型变量注册到系统中,该过程仅执行一次,系统启动时完成。此过程会申请nr个uart_state空间,nr为uart_driver->nr,用于存放支持的串口物理信息。同时创建一个struct tty_driver类型变量并将其注册到系统中,使得串口驱动与TTY层关联。所有串口设备共用此normal变量。
串口设备与驱动通过platform总线进行匹配。当设备树中的串口设备与驱动匹配时,执行imx_uart_probe,此函数执行次数与芯片串口总数一致。在imx_uart_probe中,创建一个struct imx_port变量并添加到数组imx_uart_ports中,记录串口基地址、时钟、中断号等信息,还记录了芯片厂家提供的操作集imx_uart_pops,用于硬件寄存器级的适配。
uart_add_one_port与tty_port_register_device_attr_serdev之间的调用关系表明,serdev_tty_port_register返回值为-ENODEV,导致执行tty_register_device_attr。此函数创建设备文件,设备节点文件名由struct uart_driver的dev_name和编号组成,并创建并注册一个字符设备。
小结
对接底层部分,Kernel提供了两个关键接口:uart_register_driver和uart_add_one_port。通过这两个接口,芯片将自己的UART对接到Linux Kernel UART Driver中。芯片厂商需要自行设计并实现uart_driver结构、uart_port结构和uart_ops操作集。
结构上,对接过程涉及数据结构和相互关系,具体包括uart_register_driver和uart_add_one_port的调用关系。串口作为字符设备,用户空间的open、write、read等操作对应到TTY层的注册到字符设备的struct file_operation,即tty_fops。open流程涉及获取当前进程的tty、获取ops结构等,最终调用芯片厂商提供的硬件寄存器级函数。write流程涉及操作流、数据传递到芯片级对接层。read流程涉及数据读取、中断申请与处理等。
在芯片级对接层,接收数据前需要先通过irq_request申请中断,挂接中断服务程序。中断处理流程包括串口接收中断、数据写入tty_port->buf.tail、数据传递到n_tty_data::read_buf[]等。
Linux内核学习教程、资料、面试题、学习路线图等免费资源可通过指定链接访问,如有需求可自行加入学习交流群获取更多资源。
NXP iMX8 系列产品功耗对比测试
1). 简介
NXP iMX8系列应用处理器是NXP发布的基于Cortex-A72/A53/A35和Coretex-M4/M7等架构的ARM处理器,其包含了如下多个子系列,本文就选取其中比较有代表性的iMX8、iMX8X以及iMX8M Mini进行简单的功耗对比测试,从功耗角度给大家为项目选择具体iMX8产品系列做参考。
请注意由于目前iMX8系列产品软硬件还没有进入到最终稳定状态,本文测试数据仅限于当下状态供参考,后续软硬件优化后可能还会存在差异。
本文所演示的iMX8系列ARM平台来自于Toradex ARM嵌入式平台,为了尽量减少外设对功耗的干扰,使用的都是精简的载板(除了iMX8MM平台手里暂时还没有精简载板),尽管如此,本文测试的还是包含了ARM计算机模块和载板一起的功耗数据,因此会比实际模块的功耗略大一些。
./ iMX8QM平台 - Apalis iMX8QM 4GB WB IT ARM核心版配合 Ioxra 载板,基于NXP iMX8QuadMax处理器,支持2x Cortex-A72+4x Cortex-A53 CPU,2x GC7000 XSVX GPU(高至128GFLOPS每核心)。
./iMX8QP平台 - Apalis iMX8QP 2GB WB IT ARM 核心板配合 Ixora 载板,基于NXP iMX8QuadPlus处理器,支持1x Cortex-A72+4x Cortex-A53 CPU,2x GC7000Lite XSVX GPU(高至80GFLOPS每核心)。
./iMX8X平台 - Colibri iMX8QXP 2GB WB IT ARM 核心板配合 Iris 载板,基于NXP iMX8QuandXPlus处理器,支持4x Cortex-A35,1x GC7000Lite GPU(高至64GFLOPS每核心)。
./iMX8MM平台 - Verdin iMX8MM Quad 2GB WB IT ARM 核心板配合 Verdin Development Board载板,基于NXP iMX8M Mini Quad处理器,支持4x Cortex-A53,1x GCNanoUltra GPU(高至6.4GFLOPS每核心)。
2). 准备
a). 硬件连接
不同测试平台通过数字直流稳压电源(Rek– PS-303DM+)进行供电,外设连接调试串口;iMX8QM、iMX8QP和iMX8MM平台连接HDMI显示器,iMX8X平台连接VGA显示器。
b). 测试软件:
./ 全部平台模块安装Toradex V3.0b4 Ycoto Console Linux BSP Image, 基于Linux Kernel 4.14.170内核版本
./ CPU 负载通过BSP自带的stress工具来实现
./ GPU负载通过Ycoto环境编译的glmark2工具来实现,编译好的glmark2 ipk软件包复制到平台Linux下通过“opkg install”命令安装
c). 测试流程
./ 平台上电,进入Linux系统后不进行任何加载,测试系统idle状态直流电源的电流值和电压值得出功耗数据
./ 执行下面命令将CPU负载加至满负荷,观察记录直流电源的电流值和电压值得出功耗数据
-----------------------------------
$ stress-c
-----------------------------------
./ 在上面CPU满载的基础上,通过下面Linux shell脚本来启动8个进程glmark2应用实现GPU压力负载,然后观察记录直流电源的电流值和电压值得出功耗数据
-----------------------------------
#!/bin/sh
for((i=0;i<8;i++));
do
glmark2-es2-wayland--run-forever--fullscreen>/dev/null 2<&1&
done
-----------------------------------
3). 测试结果
a). 由于功耗和温度是成正相关的,因此在不同温度下功耗会有一定的差异,同时GPU架构的特点也使其表现去运行时功耗的不稳定性,结合文初提到的软硬件成熟度,功耗的测试数据在不同场景和状态下难免会有差异,因此建议本文数据仅作为横向对比参考,不建议作为实际散热设计的直接依据。
b). 每个平台测试数据
./ iMX8QM平台
电流(A)电压(V)功率(W)
Idle状态0.4512.15.445
CPU 满负荷状态0.74– 0.9512.18.954– 11.495
CPU+GPU 满负荷状态1.2– 1.412.114.52– 16.94
./ iMX8QP台
电流(A)电压(V)功率(W)
Idle状态0.4412.15.324
CPU 满负荷状态0.65– 0.812.17.865– 9.68
CPU+GPU 满负荷状态0.92– 1.112.111.132– 13.31
./ iMX8X平台
电流(A)电压(V)功率(W)
Idle状态0.2412.12.904
CPU 满负荷状态0.3212.13.872
CPU+GPU 满负荷状态0.43– 0.5712.15.203– 6.897
./ iMX8MM平台
电流(A)电压(V)功率(W)
Idle状态0.33123.96
CPU 满负荷状态0.42125.04
CPU+GPU 满负荷状态0.47125.64
c). 测试平台功耗横向对比,这里只对比测试出的最大功耗数据
iMX8QM平台iMX8QP平台iMX8X平台iMX8MM平台
Idle状态功率(W)5.4455.3242.9043.96
CPU 满负荷状态功率(W)11.4959.683.8725.04
CPU+GPU 满负荷状态功率(W)16.9413.316.8975.64
4). 总结
本文测试了NXP iMX8产品系列的功耗参考数据,可以看出iMX8QM/QP性能强劲但是相应的功耗也比较大,iMX8X系列功耗和性能取得了不错的平衡,而iMX8MM系列相对来说CPU性能尚佳,GPU则比较弱了。最后再次强调,由于功耗数据受软硬件成熟度、温度、外设、测试设备和条件等众多因素影响,本文测试数据仅供横向对比参考。