首页 > 技术知识 > 正文

第一部分 概述

硬件部分:调试所用的开发板是从外面买的海思3516A的成品。卖家提供的开发板是在海思提供的DEMO板的基础上改的,据说是改动了网卡phy芯片、DDR和flash,使用的是16MMX25L128XX spi flash,DDR据说是一片512M的,phy应该是100M芯片,型号暂时未知。

SDK部分:卖家首次提供的是Hi3516AV100R001C01SPC020版本的SDK,与我司购买的SDK属于同一版本,该版本是Hi3516A芯片的第二个SDK发布版本,发布日期大概是2014年12月。卖家第二次提供的是Hi3516AV100R001C01SPC030 版本的SDK。 软件部分:可以说基本无任何卖家提供的demo程序。 在此基础上开始进行相关的功能调试。

第二部分 文件系统

调试文件系统时,使用NFS文件系统挂载的方式是最利于调试的,做NFS文件系统时,首先使用海思SDK中提供的busybox进行文件系统编译,该过程在SPC020版本的SDK下执行,制作过程中,并未找到文档《Hi3516A/Hi3516D Linux开发环境用户指南.pdf》中说提及的busybox_cfg_hi3516a_XXX 的配置文件,因此尝试使用busybox中现有的几个配置文件进行制作测试,发现没有一个文件系统能正常加载起来。

尝试使用SDK中提供的文件系统进行挂载,在目录HI3516A_SDK_V1020\package 中有一个文件系统的压缩包:rootfs_uclibc.tgz,对其进行解压,然后使用NFS文件系统进行挂载,这次很顺利,文件系统正常挂载起来了,并成功进入系统。

到此,就有了便于调试程序的NFS文件系统。

后续,我在拿到 V100R001C01SPC030版本的SDK之后,同样,将package目录中的文件系统加压出来进行挂载,发现NFS居然挂载不起来,依然是提示“Kernel panic – not syncing: No init found. Try passing init= option to kernel”。所以,这就遗留了一个全新制作或者定制文件系统的问题。

第三部分 芯片初始化

进入文件系统之后,如果需要打开海思方案的视频功能,需要对芯片进行初始化工作,芯片的初始化会做一些配置pinmux、配置时钟、打开sensor读写总线等基础的操作。

第一节 操作命令

配置芯片使用的工具是脚本load3516a, 关于load3516a脚本的使用方案,在海思的文档里面有如下的介绍:

1) 在单板linux系统下,进入mpp/ko目录,加载KO cd mpp/ko 2) default online ./load3516a -a -sensor mn34220 -osmem 64 3) vi_vpss offline ./load3516a -a -sensor mn34220 -osmem 64 –offline

从以上的命令来看,命令2)中有三个option: -a, -sensor, -osmem。

-a操作是没有对应的参数的,表示移除旧的ko再重新加载必要的ko文件;

-sensor 操作就是针对sensor类型做一些配置了,demo提供的参数是mn34220的sensor,针对这块开发板,那就必定需要改成imx178了;

-osmem 这个参数是配置操作系统的内存大小的,关于这个内存的大小,文档中有如下介绍:

1)所有DDR内存中,一部分由操作系统管理,称为OS内存;另一部分由MMZ模块管理,供媒体业务单独使用,称为MMZ内存。

2) OS内存起始地址为0x80000000,内存大小可通过bootargs进行配置,例如第三章中的setenv bootargs mem=64M … ,表示分配给操作系统内存为64M,您可以根据实际情况进行调整。

3) MMZ内存由MMZ内核模块管理(mpp/ko_hi35xx目录下的mmz.ko),加载mmz模块时,通过模块参数指定其起始地址及大小,load脚本中根据osmem大小来进行计算,例如: ./load3516a -a -sensor mn34220 -osmem 64

您也可以通过修改mpp/ko目录下load3536a脚本中的mmz模块参数,来修改其起始地址和总大小。

4)请注意MMZ内存地址范围不能与OS内存重叠。

从这段说明文字来看,osmem的参数我配置的是265M。 -offline 参数,这个参数设置的是vpss的在线和离线模式的,两种模式的区别在于是否使用vpss模块。所以,综合以上分析,我们需要使用的加载mpp的命令如下:

./load3516a-a -sensor imx178 -osmem 256

第二节 获取文件

关于mpp/ko这个目录,想必海思提供的demo板里面是有匹配的文件的,但是在我的NFS文件系统里面是没有这些文件的,所以需要获取这个文件夹里面的所有文件,获取文件途径有两种:

从开发板的flash里面获取。 从SDK里面获取。

首先我从开发板里面提取了所有的文件,提取之前,使用开发板做了一个实验,开发板中有两个路径下有这些文件,分别在/komod 和/usr/komod,我依此进入两个文件夹运行了上述的load3516a命令,发现运行到最后脚本居然堵死在那里了,从堵死的打印来看,是在等待I2C数据的回应,进一步跟了一下,是在加载sil9024.ko的时候堵住了,查阅文档,发现sil9024这个ic确实是使用的I2C2通道进行数据通讯的,所以有可能就是板上根本没有也不需要这个ic,因此在load3516中屏蔽了insmodsil9024.ko 这行。

那么问题就来了,既然手动执行这条命令会导致系统堵死,那么开发板的/usr/start业务程序是怎么跑起来的呢?然后我再跟了一下,发现start业务进程并不是直接使用运行load3516a这个脚本的方式来加载的,而且从程序起来之后的lsmod来看,根本没有加载到sil9024.ko,所以,我们屏蔽它是对的。

第三节 加载文件

获取到文件之后,把整个文件夹放到NFS文件系统中,执行前面标红的那条load3516a的命令,一跑就段错误,定位之后发现出现段错误的地方是在执行脚本pinmux_hi3516a.sh的时候,这个脚本是用来设置3516a芯片pinmux的,使用的设置pinmux的工具是一个叫做himm的工具,我查了下文件系统,himm是链接的一个叫做btools的工具,也就是说btools这个工具执行的时候会出现段错误。那么就有了第一个问题:

问题一:himm操作段错误的问题:

解决这个问题做了如下几个操作:

首先,确认himm这个程序的连接的动态库是否全部都有,这个需要使用readelf工具来读一下,找到himm所连接的动态库有哪些,找到后依此确认这些动态库是否存在,不存在的从交叉工具链中拷贝过来;

其次,确认一下工具编译时所使用的编译工具是否匹配,海思方案针对不同的libc库使用了不同的编译工具,文档中的说的是glibc库对应的编译器arm-hisiv400-linux,uclibc对应的编译器是arm-hisiv300-linux,我们的编译环境使用的是arm-hisiv400-linux,使用正确的编译器对btools进行编译即可。源代码路径位于:$(SDK_PATH)\osdrv\tools\board\reg-tools-1.0.0\source\tools,编译完成之后拷贝到文件系统的/bin 目录下。

问题二:DDR内存时钟的配置

在clkcfg_hi3516a.sh文件中脚本针对所有的时钟进行配置,其中DDR时钟是在0x20030030寄存器中进行配置的,卖家针对DDR做过修改,所以我们需要将DDR时钟配置成297M,若配置成250M,会导致系统挂死。也就是需要将”himm 0x200300300x00004025”改为” himm0x20030030 0x00004005”。 综合上述记录来看,修改上述两点,load3516a系统加载就能正常完成了,当然,这个仅限于我们调试的开发板,如果使用海思的demo板,应该是不需要做这些修改的。加载完成之后,我们查看系统所有安装的ko文件信息如下表所示:

Module Size Used by Tainted: G hi_mipi 23493 0 hi3516a_adec 15046 0 hi3516a_aenc 51562 0 hi3516a_ao 79030 0 hi3516a_ai 82126 1 hi3516a_aenc hi3516a_aio 27250 0 acodec 10846 0 pwm 2837 0 sensor_i2c 1441 0 hi3516a_ive 77633 0 hi3516a_vda 191247 0 hi3516a_jpege 54539 0 hi3516a_h265e 142869 0 hi3516a_h264e 160945 0 hi3516a_chnl 32415 0 hi3516a_venc 236377 3 hi3516a_jpege,hi3516a_h265e,hi3516a_h264e hi3516a_rc 69619 0 hifb 78599 0 hi3516a_vou 186651 4 hifb hi3516a_vpss 301509 6 hi3516a_viu 240306 7 hi3516a_vpss hi3516a_isp 75942 9 sensor_i2c,hi3516a_vpss,hi3516a_viu hi3516a_vgs 161509 0 hi3516a_region 69025 0 hi3516a_tde 155453 2 hifb,hi3516a_region hi3516a_sys 39531 5 hi3516a_vpss,hi3516a_viu hi3516a_base 58535 26 hi3516a_adec,hi3516a_aenc,hi3516a_ao,hi3516a_ai,hi3516a_aio,acodec,hi3516a_ive,hi3516a_vda,hi3516a_jpege,hi3516a_h265e,hi3516a_h264e,hi3516a_chnl,hi3516a_venc,hi3516a_rc,hifb,hi3516a_vou,hi3516a_vpss,hi3516a_viu,hi3516a_isp,hi3516a_vgs,hi3516a_region,hi3516a_tde,hi3516a_sys hi_media 5877 33 hi_mipi,acodec,pwm,hifb,hi3516a_tde,hi3516a_base mmz 22567 7 hi3516a_aenc,hi3516a_ao,hi3516a_jpege,hi3516a_h265e,hi3516a_h264e,hi3516a_tde,hi3516a_base
<

至此,整个3516a的业务初始化工作就已经基本完成了,如果后续需要进行扩展,可以直接在这几个脚本中进行配置修改。

原文链接:https://blog.csdn.net/bobpeter84/article/details/78835914?biz_id=102&utm_term=%E6%B5%B7%E6%80%9D&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-8-78835914&spm=1018.2118.3001.4187

猜你喜欢