欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

海思平台SDK原厂bug排雷汇总(不定期更新)

程序员文章站 2022-04-30 11:31:52
...

海思虽然提供了丰富的文档描述和接口支持,但是由于底层代码不可见,很多接口的实现机制描述的不清楚,会导致很多问题难以定位,更难以解决,一般的公司或者学校项目也基本得不到海思原厂的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);

}

我们在看下海思手册里对这个寄存器的描述

海思平台SDK原厂bug排雷汇总(不定期更新)

各位看出错误了吗,修改如下

解决方案:



static void coms_clock_config(int index)

{

    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输出,这让我再次怀疑这是实习生写的接口)
海思平台SDK原厂bug排雷汇总(不定期更新)

海思平台SDK原厂bug排雷汇总(不定期更新)

解决方案:

看了uboot里vo的相关源码,找到了对应的寄存器(虽然手册里没有描述),使用himm命令强行覆盖应用层的值,使矩阵生效。各位可以自己根据自己的平台,去看看uboot的源码

	system("himm 0x11118600 0");//fix bug of mipi graphic0/fb0
	system("himm 0x11107900 0");//fix bug of mipi graphic1/fb1

 

相关标签: 海思