Linux移植

1、背景介绍

局部硬件简图如下:

局部硬件简图

如上图所示,ZYNQ中使用了AXI_PCIE IP核,作为PCIE RC节点,交换芯片作为PCIE EP节点,两者之间通过PCIE总线相连。ZYNQ通过PCIE配置交换芯片,实现路由配置和转发等功能。

2、问题描述
Linux启动后能枚举到交换芯片,也可以通过PCIE命令读写交换芯片寄存器,但交换芯片在每次上电时需要启动DMA引擎从ZYNQ端的DDR获取描述符,这时发现ARM能给出ACK信号,但却没有数据返回,导致DMA引擎取数失败。

3、解决思路
首先可以确认这种情况下是PCIE的EP访问RC,由于ZYNQ已经实现了RC对EP的正确读写,不可能去向正常而回向异常,可以确认链路应该不存在问题。

通过盛科SDK给出的信息发现DMA引擎去取描述符的地址如下:

1、背景介绍
最近为了使用PCIe驱动,对Linux内核进行了升级,目前ZYNQ发布的最新版内核为2017.4(对应内核版本4.9),升级虽然解决了PCIe驱动问题,但却引入了另一个奇怪的问题-挂载JFFS2文件系统时会出现如下错误:
jffs2: jffs2_scan_eraseblock(): Node at 0x0000225c {0x1985, 0xe002, 0xe002e002) has invalid CRC 0x84d1586d (calculated 0x1d56aca6)
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00002260: 0xe002 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00002264: 0x586d instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00002268: 0x0002 instead

在对模块进行信息监测时,会用到ZYNQ内部的VPVN通道,默认情况下该通道是不开启的,需要手动在内核驱动代码中设置

修改为

重新编译内核,加载镜像就能够系统/sys/bus/iio/devices/iio:device0/中看到VPVN了

将VPVN电压转换为温度可以参考下面代码TEMP1848_1

默认情况下QSPI拷贝文件到DDR中需要时间很长,15M左右大小的bin文件约30s左右。在某些产品中无法满足需求。

经排查发现u-boot代码中有对速度进行配置的地方,位于zynq-common.h中。

默认值为30000000,也就是30M,而QSPI主频最多可达到100M,所以应该可以通过修改该值提升QSPI读写速度。

但是从30M提升到50M后发现速度依然不变,怀疑代码中根本没有配置该值,于是对u-boot代码进行了检查。

排查发现在u-boot在/common/cmd_sf.c中用到了速度配置,函数如下:
static int do_spi_flash_probe(int argc,char * const argv[])

{

unsignedint bus = CONFIG_SF_DEFAULT_BUS;

unsignedint cs = CONFIG_SF_DEFAULT_CS;

ZYNQ跑系统系列(三) SDSoc方式移植linux

移植linux之SDSoc
想让ZYNQ上跑个linux系统,除了之前的两篇文章中的传统方式和petalinux方式外,还有一种更简单快捷的SDSoc,xilinx的SDx系列开发工具主要是面向软件开发人员和系统工程师,加快应用的开发,让软件开发者加入到项目中,SDSoc侧重的是对软件算法进行加速,本文仅仅是使用该工具生成一个linux环境下的helloworld应用

SDSoc可以直接运行在Windows环境下,不需要搭建linux开发环境,一键生成SD卡的启动文件,可以说是很省心了

一、准备工作
1.下载SDsoc的预安装程序
这里没有去下载全安装包,因为太大了,30多个G,而是选择了可以根据自己的需要,去定制要下载的安装包的预安装程序
SDsoc的安装程序建议去官网下载,也可以从这里直接下载

2.打开安装程序,选择自己需要安装的东西,越少越好

3.继续,等待下载和安装

4.安装完成后要去下载一个SDSoc的lic

ZYNQ跑系统系列(二) petalinux方式移植linux

移植linux之petalinux
之前一篇博文中,提到了一种通用的传统移植方式,将linux移植到ZYNQ中的ARM芯片中。本文将针对xilinx的专用开发环境petalinux,进行入门和开发,本文petalinux的运行环境依然在虚拟机的linux系统里,即将体验petalinux相对于传统方式的便捷和强大之处

一、安装petalinux
-1.安装虚拟机,在虚拟机里安装linux系统(ubuntu16)

  • 虚拟机里磁盘尽量留大点,建议60G,我的是80G
  • sudo passwd命令,设置超级用户su时的密码
  • 建议安装VMware Tools
  • 开发工具:vivado2017.1(Windows下) + petalinux 2017.1(Linux下)
  • 0.更新apt-get(可选,加速用,同传统方式移植那篇文章的第二节)

    1.安装petalinux的依赖环境
    安装petalinux的必要依赖环境,直接复制粘贴下面的命令行到shell中,系统自动下载安装下面的工具:
    sudo apt-get install build-essential vim tofrodos \

    ZYNQ跑系统系列(一) 传统方式移植linux

    移植linux之传统方式
    在ZYNQ开发时,有些情况下,为了降低开发的复杂性,或是提升系统运行的性能,在ARM上跑一个linux系统往往是一个不错的选择,而且linux系统一般集成了一些常用的成熟驱动,可以减少开发周期。本章将通过传统u-boot、kernel方式,完成移植。该方式虽然繁琐复杂,但是毕竟是一种通用的移植方式。

    一、搭建硬件环境
    1.新建工程,并新建一个 BD 文件,然后添加一个ZYNQ Processing system的IP核,并设置好与硬件相符合的PS和PL时钟以及DDR型号


    2.添加一些必要外设

    Zybo开发板linux作业系统移植

    文章主要介紹zybo board上linux作业系统移植过程。分别介绍了开发环境搭建、U-boot编译、linux内核编译、busybox制作等流程及注意事项。文章使用的开发板是zynq 7000系列的zybo board。Vivado版本是2015.1.主机系统是Debian 9.

    1.开发环境搭建
    工欲善其事必先利其器,做开发前搭建好编译环境是重要的一步,这些步骤大体上都相同,然而对于不同的系统平台、硬件平台,环境的搭建也会有些差别,因人而异。有些问题只能根据错误提示去需找解决方案。虽然网上大多推荐使用ubuntu LTS作为开发环境,但是我还是倾向使用Debian系统。我觉得Debian稳定,之前用了好多年Arch,但是现在为了有一个稳定的开发环境,还是离开了Arch。在Debian 9系统上,要安装一些依赖包,否则无法进行下面的工作,因为在我的机器上我遇到了这些问题,至于其他的机器是什么情况,我就无法得知了。

    首先安装以下软件包:
    apt install gcc-multilib libmpfr-dev bc

    Zynq 7015 linux跑起来之导入之linux移植

    linux源码下载 https://github.com/digilent/linux-digilent-dev由于我网速慢,就不用git下载了,用之前下好的zip文件,进入到解压好的linux源码目录。

    这里直接解压会有问题,因为那个zip软件固有的问题,导致解压的时候出问题,一般这个时候不注意是看不出来的,在编译的时候就会显现出来,一般为文件名太长。

    symlink error: File name too long这是解压的时候报出来的,这个一般不注意看不出来的。下面是我make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- distclean时的报错。
    ./scripts/Makefile.clean:17: fs/jffs2/Makefile: File name too long
    make[2]: stat: fs/jffs2/Makefile: File name too long
    make[2]: *** No rule to make target `fs/jffs2/Makefile'. Stop.
    make[1]: *** [fs/jffs2] Error 2
    make: *** [_clean_fs] Error 2

    解决方案

    编写Linux下的应用程序时有时需要调用Linux的相关shell脚本,在这些脚本中通过调用Linux的相关函数实现对应的功能。比如使用ifconfig配置本地的IP地址,采用这种方式省去了自己编写应用程序去实现的麻烦。

    Linux常见调用shell脚本的方式有三种,网上说明很多,最简单的是使用system调用shell文件,下午中就是采用这种做法。

    1、编写应用程序

    这里以配置IP地址举例,在应用程序中设置了IP地址,最后通过参数传入shell文件
    void config_ip(unsigned int slot)
    {
    charcmdline[100];
    intip1,ip2,ip3,ip4;
    ip1=192;
    ip2=168;
    ip3=100;
    ip4=200;
    sprintf(cmdline,"shipaddr.sh %d %d %d %d",ip1,ip2,ip3,ip4);

    同步内容