海思平台SDK原⼚bug排雷汇总(不定期更新)
海思虽然提供了丰富的⽂档描述和接⼝⽀持,但是由于底层代码不可见,很多接⼝的实现机制描述的不清楚,会导致很多问题难以定位,更难以解决,⼀般的公司或者学校项⽬也基本得不到海思原⼚的FAE⽀持。
本⽂仅据个⼈观点和经验提供⼀些常见的bug的解决⽅案或规避⽅法。还请各位看官批评指正!
1. 使⽤uboot烧录⽂件系统不成功问题
海思除了可以通过串⼝(串⼝速率实在太慢了,⼀般最多⽤来烧录fastboot)和⽹⼝(许多板⼦可能不带⽹⼝)还可以通过sd卡来进⾏快速的裸板或者⾮裸板升级,因为mmc读写速率快,不失为⼀种好的烧录⽅式,详细烧录的原理可以参考uboot源码和相关⽂档。
问题出在⽂件系统过⼤时,会导致uboot dump导致烧录失败。经过测试分析,由于uboot下内存管理机制和烧录机制的问题,在通过fatload把⽂件系统⼀次性加载到ddr的过程中,只能读取⼀定⼤⼩的⽂件(能读取的⼤⼩与单⽚ddr的⼤⼩成正⽐),由于当时烧录的⽂件系统是ext4,看了源码,烧录ext4⽂件系统的原理(与烧录内核和uboot不同)⽐较复杂,单纯的分包读取并烧录是会破坏⽂件系统的完整性的(记得是分成了很多歌chunk,每个chunk还有head info)。
解决⽅案:
1.hitool提供的⽹⼝烧录是不会有这个问题的,海思原⼚在设计hitool⼯具时还是考虑到了ddr的问题,看hitool log可以明显看到过⼤
的烧录⽂件会被分包下载处理,奈何本⼈能⼒和精⼒有限,没有深究该如何分包,如果有哪位⼤神了解原理,还希望能够指导下。
2.这是我实际的采⽤的解决⽅案,制作⼀个空的⽂件系统,⽂件系统的部署在kernel起来后再去做,应为内核的内存管理机制⽐
uboot要完善的多。
2. Hi3559AV100对接bt1120的问题
这⾥假设应⽤层的接⼝添加都没有问题了,这个问题也是让我了好久,觉得哪⾥都没错就是最后抓不到图,也没有中断,经过⼤段时间的浪费,发现是个低级错误(这也让我怀疑这段code是不是海思的实习⽣写的),问题出在cmos时钟的设置,Hi3559AV100的管脚复⽤和时钟配置是以ko的形式进⾏配置的,源码可以参考drv/interdrv/sysconfig.c。
static void coms_clock_config(int index)
{
if(0 == index)
{
reg_write32(0x5, 0x7 << 15, (unsigned long)reg_crg_base+0x0104);
}
else if(1 == index)
{
reg_write32(0x5, 0x6 << 21, (unsigned long)reg_crg_base+0x0104);
}
else if(2 == index)
{
reg_write32(0x5, 0x7 << 9, (unsigned long)reg_crg_base+0x0104);
}
}
//我们看下reg_write32函数原型
static inline void reg_write32(unsigned long value, unsigned long mask, unsigned long addr) {
unsigned long t;
t = SYS_READ((const volatile void *)addr);
t &= ~mask;
t |= value & mask;
SYS_WRITEL((volatile void *)addr, t);
}
我们在看下海思⼿册⾥对这个寄存器的描述
各位看出错误了吗,修改如下
解决⽅案:
static void coms_clock_config(int index)
{
sdk
if(0 == index)
{
reg_write32(0x5 << 15, 0x7 << 15, (unsigned long)reg_crg_base+0x0104);
}
else if(1 == index)
{
reg_write32(0x5 << 21, 0x6 << 21, (unsigned long)reg_crg_base+0x0104);
}
else if(2 == index)
{
reg_write32(0x5 << 9, 0x7 << 9, (unsigned long)reg_crg_base+0x0104);
}
}
3. Hi3559AV100图形层HI_MPI_VO_SetGraphicLayerCSC接⼝⽆效
这个接⼝只⽀持RGB2YUV,不⽀持bypass,虽然查看/proc/umap/vo 的log对应的值也的确设下去了,但是就是不⽣效,这等于我⽆法使⽤RGB图像格式的输出(⽐如我想⽤MIPI输出,这让我再次怀疑这是实习⽣写的接⼝)
解决⽅案:
看了uboot⾥vo的相关源码,到了对应的寄存器(虽然⼿册⾥没有描述),使⽤himm命令强⾏覆盖应⽤层的值,使矩阵⽣效。各位可以⾃⼰根据⾃⼰的平台,去看看uboot的源码
system("himm 0x11118600 0");//fix bug of mipi graphic0/fb0
system("himm 0x11107900 0");//fix bug of mipi graphic1/fb1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。