常见问题分析
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)
-
在flast_list.nri,检查是否enable quad mode,且最大clk是否设置86M,默认是54M
-
检查api入参,flash addr是否是16对齐,dram addr是否是64对齐。如果可以,两者都做64对齐,不行至少都做16对齐。
2.3. 如何清空Flash¶
-
长按enter,长按的同时断电重启,会进入uboot,在命令行输入sf probe;sf erase 0 1000;reset
-
在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失败¶
-
检查烧录过程,misc分区是否正确烧录了。一般分区设置大小最好要比misc.fwfs文件实际大小大一倍才满足断电保护要求。
-
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线,软件就会恢复,然后上电重新升级。