海思3516A开发板调试整理(一)

在学了在学了! 2020-08-11 10:29:05 3368

第一部分 概述

硬件部分:调试所用的开发板是从外面买的海思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

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
在学了在学了!
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区