常见问题分析

Version1.1


1. i2c相关

1.1. i2c读写,用什么函数

可以参考uvc_app.c中ST_PipeLineInit_pspi中的i2c_transfer。需要特别注意的是,这个函数传进去的addr需要实际SLAVE_ADDR/2,比如外设的SLA_ADDR是0x42,那么这里传进去的要是0x21


1.2. i2c报错,如何自查

首先riu_r 0x103c, offset 6F位置的值就是i2c padmux配置的值,bit0bit3表示i2c0,bit4bit7表示i2c1。

其次查看riu_r 0x103c offset 74,这里是配置mipi_ctrl_mode padmux的值,其中其中的bit8~bit11表示padmux值。还是不行的话可能要排查下硬件了,抓波形看看。


2. flash相关

2.1. flash报错

如果用flash夹具,出现flash报错,或者系统起不来,请将flash直接焊在板子上测试排除问题


2.2. Flash读取时间较长

发现flash api读取时间太长,比如(DRV_SPINOR_read)

  1. 在flast_list.nri,检查是否enable quad mode,且最大clk是否设置86M,默认是54M

  2. 检查api入参,flash addr是否是16对齐,dram addr是否是64对齐。如果可以,两者都做64对齐,不行至少都做16对齐。


2.3. 如何清空Flash

  1. 长按enter,长按的同时断电重启,会进入uboot,在命令行输入sf probe;sf erase 0 1000;reset

  2. 在rtos系统下,直接sf erase 0 1000;reset


3. RTOS debug相关

3.1. 堆栈溢出怎么调大

创建线程时,传入CamOsThreadCreate的第二个参数中的属性信息,带有nStackSize,如果不够,适当加大这里的size

目前rtos堆栈做了8KB限制,如果实在有需要比8KB还大的stack,请联系FAE


3.2. 如何查看MI内存信息/rtk内存信息

MI内存: cat_proc mi_sys

Rtk内存: memstat


3.3. 如何查看MI Proc信息

cat_proc 命令:

cat_proc mi_vif

cat_proc mi_vpe

cat_proc mi_venc

3.4. RTOS 崩溃了,如何定位问题

一旦发生coredump,串口会一直刷log,在头部部分会有aborted addr,根据这个addr,利用交叉编译工具,可以找到出问题的代码位置:

arm-eabi-addr2line –e ./build/pioneer3_64_nor_isw_uvc.elf addr

另外,可以加log定位core位置。由于发生core时系统就崩溃了,此时会导致core发生前的部分log无法来得及打印而没有打印,这种情况下,需要在打印完log之后,加一小段延时,让log来得及打印,才能准确


3.5. 如何读写寄存器

Console下面提供riu_r/riu_w 命令用于读写寄存器

命令格式: riu_r/riu_w bank offset valude

如: 读取bank 103c

riu_r 0x103c 读取103c寄存器

riu_r 0x103c 6F 读取bank 103c,offset为6F的寄存器的值

如: 写寄存器 bank 103c offset 6F

riu_r 0x103c 6F 0x021


4. RTOS和LINUX在调用MI API的差异

由于Linux下有insmod ko的操作,在insmod ko时,其实就会对模块做整体的初始化。但是rtos没有这个流程,所以rtos app在使用api上需要比Linux多一个步骤,也就是显式调用初始化函数,如下:

如上图,在使用VIF VPE VENC之前,需要先调用MI_VIF_IMPL_Init/MI_VPE_IMPL_Init/MI_VENC_IMPL_Init函数。如果使用上出现找不到module的错误,应该就是这个问题了。


5. RTOS MISC分区制作方法

5.1. RTOS MISC分区制作方法

如果想要往misc分区放置文件,可以修改project/image/configs/p3/misc_usbcam-rtos.mk中添加想要添加的文件的拷贝语句。编译时会执行这个脚本去拷贝文件生成分区


5.2. MISC分区mount失败

  1. 检查烧录过程,misc分区是否正确烧录了。一般分区设置大小最好要比misc.fwfs文件实际大小大一倍才满足断电保护要求。

  2. misc分区的起始地址需要64k对齐


5.3. 我们有一些启动后需要的配置文件,要放在哪个分区

我们提供了一个misc分区,这个分区在打包image的时候会一起打包。对于misc分区,挂载位置是”/mnt/MISC”

我们提供了一套接口用于文件操作:

CamFsOpen/CamFsClose/CamFsRead/CamFsWrite等,具体可以看 MISC分区读写参考文档


6. 编译相关

6.1. NEON编译

如果是跟rtos一起编译,就不需要另外加compile-option.

如果是先独立成lib再link进rtos,就要加这几个compile-option:

-mcpu=cortex-a7 –c –mfpu=neon-vfpv4 –mfloat-abi=softfp –fno-short-enums –fno-exceptions


6.2. 修改头文件无效

在0909 sdk及之前的sdk,个别头文件会在两个目录下同时存在,一个是原本的目录,另一个是在proj/hdrs/config下。如果出现修改头文件无效的,可以看下hdrs目录下有没有同名文件。把这里删掉就ok。或者两边同时修改


6.3. 打包时报setup_config.sh: [[: not found

部分Linux环境下,/bin/sh是指向dash,需要改成指向bash


7. 编程相关

7.1. 内存相关函数

FreeRTOS内存:

CamOsMemAlloc

CamOsMemFree

MMA内存:

请查看SDK模块API: MI SYS API


7.2. 获取精确时间函数

可以用CamOsGetMonotonicTime,可以精确到到纳秒


7.3. 如何在代码中修改环境变量

添加如下声明:

extern s32 env_set(char *key, char*par);

extern s32 env_save(void);

比如设置环境变量ota_upgrade_status 为1:

env_set(“ota_upgrade_status”,”1”);

env_save();


7.4. 如何在代码中做reset动作

添加如下声明:

extern int reset();

然后代码直接调用reset();即可


7.5. 如何在RTOS代码中修改寄存器

1、首先代码增加:

#define ms_writeb(v,a) (*(volatile u8 *)(a) = (v))

#define RIU_BASE_ADDR 0x1F000000

#define GET_REG16_ADDR(x, y) ((x) + ((y) << 2))

#define GET_REG8_ADDR(x, y) ((x) + ((y) << 1) - ((y) & 1))


#define UTMI_BASE_ADDR GET_REG8_ADDR(RIU_BASE_ADDR, 0x142100)  //这里的0x142100根据你的bank,需要更改

2、比如要写 riu_w 0x1421 15 0x6C,可以在代码里面这么写

ms_writeb(0x6C, GET_REG16_ADDR(UTMI_BASE_ADDR, 0x15));

8. 其它

8.1. 为什么vpe port1不能使用

我们内部为了统一性,设计上IKAYAKI系列的芯片MI VPE不支持port1,支持port 0 3 4,使用时请注意


8.2. 如何做图像旋转

由于9211/222 vpe不支持rotation,所以rotation可以放在divp做。不过需要注意的是,divp只能单独做rotation或者scaler,不能同时做ratation和scaler。


8.3. 空片升级时,USBDownloadTool卡住

空片升级时,擦除完不要立即点击升级,因为此时可能和host交互还没完成,协商还没完成,可以稍等四五秒再点击升级。另外如果卡住了,最快的方式就是拔掉usb线,软件就会恢复,然后上电重新升级。