SOC平台学习总结
最近通过对altera提供的CycloneV开发板进行熟悉掌握以及对相应的开发板的开发文档以及在线社区https://rocketboards.org/的文档进行阅读,逐步掌握了altera系列SOC启动流程及相应开发方法,现总结如下:
开发环境包括一下软件:
Quartus Prime16.1(逻辑工程 Qsys)
the Altera SoC Embedded Design Suite(EDS) (一些嵌入式开发工具)
the ARM DS-5 AE(仿真调试,主要初期调试板子系统)
交叉编译工具链:arm-linux-gnueabihf-
DiskImager(SD卡烧写镜像)
开发环境分为windows开发(altera系列的软件)和linux开发环境(主要是工具链以及一些源代码编译)
开发环境搭建中小提示:
1. Quartus license 需要安装虚拟网卡然后设置为altera提供的license对应的MAC地址
2. EDS安装一般是和quartus16.1安装在一个路径下的,在~/embedded有windows下的一些嵌入式工具以及开发板需要安装的相关驱动,example,以及底层API的源码和文档
3. ARM DS5不提供license,需要自己用邮箱申请一个一月的授权
针对CycloneV和ArriaV由于OCRAM空间小放不下uboot,所以需要Preloader
Arria 10则不需要Preloader这一环节
上手soc可以从该网址入手
https://rocketboards.org/foswiki/view/Documentation/EmbeddedLinuxBeginnerSGuide
l BootROM存在于复位异常地址,通过reset触发,
l SSBL是第二boot阶段,需要BSP(板级支持),这一阶段决定启动位置(SD QSPI NAND)需要配置bsp,具体根据网址对应步骤,最后生成preloader-mkpimage.bin
l 然后是uboot的配置及编译,主要关注uboot源代码目录下的include/configs/socfpga_cyclone5.h 相关的硬件配置,编译生成uboot.Img 可以把uboot阶段要执行的命令写成脚本uboot.scr
l 接着是linux所需要的dts,根据开发功能需求在altera提供的dts进行修改,然后使用dtc进行编译生成dtb二进制文件
l 然后进行kernel的配置编译,根据需求配置相应的驱动,功能支持,altera有提供每个开发板的默认配置make ARCH=arm socfpga_defconfig,编译生成zImage(注意使用正确的版本及长期支持版本ltsi)
l 然后是文件系统的配置编译,根据需求定制自己的工具,使用buildroot(提示:注意配置外置工具链以及prefix,以及要有root权限或者有fakeroot命令)生成rootfs.tar
SD卡生成及更新:
主要使用altera提供的make_sdimage.py脚本生成sd bin然后通过diskImager烧写进SD卡
sudo ~/make_sdimage.py \
-f \
-Ppreloader-mkpimage.bin,u-boot-cyclone5.img,num=3,format=raw,
size=10M,type=A2 \
-P rootfs/*,num=2,format=ext3,size=1500M \(根据实际大小改变)
-P zImage,u-boot.scr,soc_system.rbf,socfpga.dtb,num=1,format=vfat,size=500M \
-s 2G \(根据实际大小改变)
-n sd_card_image_cyclone5.bin
Qspi flash以及NANDflash的启动主要是在bsp配置选择,ubootconfig.h配置选择,制作适合flash大小的文件系统,当然可以直接使用altera提供的文件系统,
然后可以通过三种方式烧写SPI flash,eds(比较慢);linux console 需要有mtd工具(altera提供的文件系统没有);uboot console,然后uboot配置启动环境变量,启动选择跳线选择SPI启动
本节主要总结一下进行交叉编译开发遇到的问题,主要是安装ztools和编译EMR4.0应用程序(basic system的应用)
首先说安装ztools,因为是交叉编译,所以./configure需要额外选项,指定host,指定交叉编译工具,指定安装目录,即./configure--host=arm-linux --cross-prefix=$CROSS_COMPILE --prefix=/home/chuguangyang/opt
但是会遇到xml不支持,查找原因是因为tsana依赖于libxml库,所以必须指定libxml库的路径,所以要先交叉编译libxml,
因此去下载libxml2的源代码进行编译,同样先看./configure –h 查看需要哪些配置选项,同样host 交叉编译安装目录不可少,但是这样之后make又有了提示错误,提示lzma.h找不到,这是应该缺少lzma库的支持,后来查看./configure生成的输出check 发现libxml是需要有压缩算法支持的,可以选择zlib或者lzma,尝试下载安装lzma,但好像没有找到特定的源代码,因此放弃,选择使用zlib,下载zlib-1.2.8.tar.gz,
先配置,根据提示./configure --host=arm-linux-gnueabihf--prefix=/home/chuguangyang/opt,交叉编译时在—host后进行识别的
make make instsll,所需要的zlib库就被安装到/home/chuguangyang/opt目录下
然后回去编译libxml,配置时需要禁止lzma,指定zlib的路径,因此配置选项如下
./configure--host=arm-linux-gnueabihf CROSS_COMPILE=arm-linux-gnueabihf-CC=arm-linux-gnueabihf-gcc --prefix=/home/chuguangyang/opt--with-zlib=/home/chuguangyang/opt CFLAGS=-I/home/chuguangyang/opt/includeLDFLAGS=-L/home/chuguangyang/opt/lib --without-lzma --without-python
是根据实际结果添加的CFLAGS以及LDFLAGS,如果这样不可行,还可以直接修改对应的Makefile修改zlib的加载路径。
好了现在又回归到ztools的编译,先注释掉需要xml的部分进行编译,在链接库时,提示找不到之前分别编译的lib.1.so,这种情况应该是A B->C(C 依赖A和B)C->D(D依赖C)然后编译D时没有找到A B的库,因此需要在编译D时添加A B的路径,当然可以通过-rpath-link指定,但是不太熟悉,使用的是笨办法直接在Makefile里添加LDFLAGS,然后编译成功
接着把xml禁止打开,同样修改Makefile修改libxml2的加载路径LDFLAGS +=-L/home/chuguangyang/opt/lib -lxml2,然后编译成功,将安装路径下的bin和lib拷贝到目标板上,放到对应的路径,使用ldconfig使得lib生效,然后就可以正常使用ztools了。
下面是在SOC上进行的性能测试
1. 在SOC上运行ztools选用一个138MB的ts节目,使用catts | tsana -err
监测运行时间10s,换算码率应该是109.6Mb/s,cpu占用情况catts占用20%,tsana占用50%(按照双核一起计算的)
2. 运行EMR4.0应用程序,正常跑裸壳
l 系统自启动:系统不同于之前用的linux,采用systemd来管理一些服务的启动,systemd作为新一代linux的启动方式要用来替代之前的init.d的启动,具体介绍见https://linux.cn/article-5457-1.html,因此添加自启动主要是在/etc/systemd/system/multi-user.target.wants路径下添加自己的启动脚本*.Service,altera提供的例子altera-gsrd.service用来启动位于/usr/bin下面的altera-gsrd-init.sh(其中包括了上电检查ip地址并在液晶屏上进行显示)
l 网络管理主要是使用开源的connman来进行管理,服务的自启动也是有systemd来管理,然后connman的配置文件位于/var/lib/connman/*/settings,*代表网络设备名字,以下是该文件内容:
[ethernet_0007ed260d8f_cable]
Name=Wired
AutoConnect=true
Modified=2016-10-28T11:48:25.275755Z
IPv4.method=manual
IPv4.local_address=192.165.52.120
IPv4.DHCP.LastAddress=192.165.52.115
IPv6.method=auto
IPv6.privacy=disabled
IPv4.netmask_prefixlen=24
IPv4.gateway=192.165.52.1
~
可以通过修改该文件进行网络配置,也可以使用connmanctl来进行配置
connmanctl config ethernet_0007ed260d8f_cable --ipv4 manual192.165.52.120 255.255.255.0 192.165.52.1