制作适用于ZYNQ(ARM平台)的Ubuntu系统


前言

在ZYNQ上跑Linux系统其实已经不是什么新鲜事了,Xilinx官方提供的Petalinux工具能够很好的制做定制版本的Linux系统。但是如果要进行软件开发部分,总感觉多多少少有些麻烦。所以一直有个执念就是要给ZYNQ装一个Ubuntu系统,但是网上搜索到的系统的版本都比较老,无奈之下尝试着自己制作系统。希望能给大家一点参考。

软件版本:

  • 操作环境:WSL-Ubuntu18.04
  • 目标芯片:XCZ4EV
  • Petalinux:2020.2
  • Vivado:2020.2

一、主要流程

在系统的启动流程中,最先运行的是Bootloader程序,负责初始化初始化DDR等外设,然后将Linux内核从flash(NAND,NOR FLASH,SD,MMC等)拷贝到DDR中,最后启动Linux内核。对于ZYNQ而言,其Bootloader程序分为两个部分。在启动引导过程中,先运行FSBL来设置PS,然后运行U-Boot用于加载Linux内核映像并引导Linux,所以U-boot对于ZYNQ而言是第二阶段引导程序,FSBL是第一阶段引导程序。等U-Boot程序执行完成之后,就会启动内存中的Linux内核,内核在完成启动之后,会挂载根文件系统(rootfs)执行其中的初始化文件,同时根文件系统中也包含了系统的关键软件。

U-Boot、Linux-kernel和rootfs这三者一起构成了一个完整的Linux系统,而最终决定Linux系统是什么发行版的是rootfs,所以只要替换适配好的rootfs,ZYNQ是可以运行几乎所有的发行版本,如CentOS、ArchLinux和Ubuntu等。正如你所想,Petalinux也是其中一个发行版本。

PS:如果接触过Ubuntu系统更换系统内核的,可能会更容易明白内核和发行版系统是分离的这个概念。

大致的流程是:

  1. 使用Vivado生成定制的硬件描述文件
  2. 利用Vitis生成定制的FSBL (可选,本文不进行此步骤,使用原版自带的)
  3. 导入硬件描述文件到Petalinux工程,并配置启动顺序、U-Boot和内核
  4. 使用Petalinux编译FSBL、U-Boot和内核
  5. 适配Ubuntu的根文件系统
  6. 制作SD卡启动

二、制作FSBL、U-Boot和内核

这个过程不进行详细描述,仅对关键部分进行解释,与制作Petlinux的系统的步骤一致,可以参考网上资料。

记住必须确认在命令petalinux-config的配置中,选择以SD卡启动,并正确填写rootfs的位置。我的SD卡为第二个设备,然后rootfs在其第二个分区,所以是mmcblk1p2

→ Image Packaging Configuration
	→ Root filesystem type()
		
		( ) INITRAMFS
		( ) INITRD
		( ) JFFS2
		( ) NFS
		(X) EXT4 (SD/eMMC/SATA/USB)
		( ) other

→ Image Packaging Configuration
	(/dev/mmcblk1p2) Device node of SD device 

配置完事后,直接编译就可以得到相关的文件,在$(petalinu-project)/images/linux下。

三、获得Ubuntu基本rootfs

3.1 利用debootstrap工具

参考Ubuntu提供的网站:https://wiki.ubuntu.com/ARM/RootfsFromScratch/QemuDebootstrap

首先在PC主机Ubuntu系统中安装qemu模拟器:

sudo apt-get install qemu-user-static

利用下面的命令获得一个基本的Ubuntu裸文件系统:

sudo mkdir ~/ubuntu-rootfs
sudo qemu-debootstrap --arch arm64 trusty ~/ubuntu-rootfs/ --variant=minbase --verbose 

qemu-debootstrap调用debootstrap函数,并且把qemu-user-static的二进制文件qemu-arm-static复制到目标目录中以用于跨平台编译。

qemu-debootstrap的参数选项和debootstrap相同,具体指令可以查看debootstrap的帮助文档。下面是对我的命令的解释。

debootstrap --arch [平台] [发行版本代号] [存放目录] --variant=minbase[附加变量:最小包] --verbose[不关闭wget输出]

等待一段时间下载完成。

3.2 从Ubuntu官网下载

Ubuntu官方网站下载其提供的最小裸文件系统。

新建目录

mkdir ~/ubuntu-rootfs
cd ubuntu-rootfs

下载 Ubuntu Core rootfs

wget http://cdimage.ubuntu.com/ubuntu-base/releases/18.04.5/release/ubuntu-base-18.04.5-base-arm64.tar.gz

解压 Ubuntu Core rootfs tar包,注意一定要用sudo

sudo tar -xzvf ubuntu-core-14.04-core-armhf.tar.gz

# 退回到上一级目录
cd ..

由于我们要chroot,所以需要能够在chroot环境执行arm64版本的binary,所以我们要接触linux的binfmt机制和qemu static解释器

sudo apt-get install qemu-user-static
sudo cp /usr/bin/qemu-aarch64-static ~/ubuntu-rootfs/usr/bin/

四、挂载相关文件系统并chroot

先将本机的dns配置复制到目标rootfs,后面联网时会用到。同时修改apt软件源

sudo cp -b /etc/resolv.conf ~/ubuntu-rootfs/etc/resolv.conf
sudo vim ~/ubuntu-rootfs/etc/apt/source.list

中科大源(arm64)。这里不使用https的软件源,因为缺少安装包,会连接失败。

#中科大源
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main universe restricted
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main universe restricted
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse

挂载proc, sys, dev, dev/pts等文件系统,可以编写一个bash脚本ch-mount.sh来完成挂载和后面的卸载操作。脚本内容如下所示:

#!/bin/bash

function help() {
    echo ""
    echo "usage: ch-mount.sh [-m <path>] [-u <path>] <command> [<args>]"
    echo ""
    echo "For example: bash ch-mount.sh -m /media/sdcard/"
    echo ""
}


while getopts "m:u:" arg
do
    case $arg in
        m)
            echo "I:MOUNTING"
            sudo mount -t proc /proc ${2}proc
            sudo mount -t sysfs /sys ${2}sys
            sudo mount -o bind /dev ${2}dev
            sudo mount -o bind /dev/pts ${2}dev/pts        
            sudo chroot ${2}
            ;;
        u)
            echo "I:UNMOUNTING"
            sudo umount ${2}proc
            sudo umount ${2}sys
            sudo umount ${2}dev/pts
            sudo umount ${2}dev
            ;;
        ?)
            echo "E:Unknow parameter"
            help
            exit 1
    esac
done

保存好shell脚本,并在终端中执行。其中-m为挂载后面跟目录,-u为解挂同样跟目录。

sudo bash ch-mount.sh -m ~/ubuntu-rootfs/

五、安装所需软件包

apt-get install language-pack-en-base sudo ssh net-tools ethtool wireless-tools ifupdown network-manager iputils-ping rsyslog bash-completion htop vim resolvconf --no-install-recommends

# 推荐软件
# language-pack-en-base  英文翻译的mo文件
# sudo                   sudo命令
# ssh                    ssh的client和server
# net-tools              ifconfig,netstat,route,arp等
# ethtool                ethtool命令,显示、修改以太网设置
# wireless-tools         iwconfig等,显示、修改无线设置
# ifupdown               ifup,ifdown等工具
# network-manager        Network Manager服务和框架,高级网络管理
# iputils-ping           ping和ping6
# rsyslog                系统log服务
# bash-completion        bash命令行补全
# htop                   htop工具,交互式进程查看器

六、用户设置

添加用户

adduser xxx(填用户名) # 根据提示设置密码。

修改/etc/sudoers里面的内容,在root行下加上这句,然后你创建的用户就可以用sudo获得root权限了。

xxx(用户名)    ALL=(ALL:ALL) ALL

设置主机名称

echo "ubuntu-arm-zynq">/etc/hostname

设置本机入口ip:

echo "127.0.0.1 localhost">>/etc/hosts
echo "127.0.1.1 ubuntu-arm-zynq">>/etc/hosts

允许自动更新dns:

dpkg-reconfigure resolvconf

设置时区:

dpkg-reconfigure tzdata

七、配置串口调试服务和SD卡分区挂载

在用debootstrap制作的rootfs里,是不包含有串口登陆tty的。需要添加一个/etc/init/ttyPS0.conf文件才能从串口登陆。否则你会在串口看见Kernel的输出信息,但就是等不到登陆提示。

如果没有/etc/init/ttyPS0.conf,则自行创建。文件夹没有的也需要自行创建。在其中写入以下内容。

start on stoppedrc or RUNLEVEL=[12345]
stop on runlevel[!12345]
respawn
exec /sbin/getty -L 115200 ttyPS0 vt102

由于使用SD卡在板子上启动,需要修改/etc/fstab的内容,以便根文件系统能够正确地挂载,否则不能正确挂载根文件系统将导致系统无法启动。由于在内核中设置的根文件系统的挂载目录是SD卡(地二个设备)的第二分区,于是修改/etc/fstab的内容:

# <file system>   <dir>         <type>    <options>                          <dump> <pass>
/dev/mmcblk1p2    /             ext4      defaults,noatime,errors=remount-ro   0      1
/dev/mmcblk1p1    /boot/uboot   vfat      defaults,noatime                     0      0

八、网络设置

打开/etc/network/interfaces文件,注释掉source-directory /etc/network/interfaces.d行,并在其中添加以下内容

# 本地回环
auto lo 
iface lo inet loopback 

# 两种方法任选一个

# 1、获取动态配置: 
auto eth0 
iface eth0 inet dhcp 

# 2、获取静态配置: 
# auto eth0 
# iface eth0 inet static 
# address 192.168.0.1 
# netmask 255.255.255.0 
# gateway 192.168.0.1 

九、制作SD卡启动系统

输入exit退出chroot,执行命令卸载相关文件系统。

sudo bash ch-mount.sh -u ubuntu-rootfs/

$(petalinu-project)/images/linux下的BOOT.BIN,boot.scr和image.ub拷贝到SD卡的FAT分区,然后把制作好的roofs拷贝到SD卡的ext4分区。

接上串口,上电运行就可以看到如下输出。至于为什么是20.04 LTS是因为我完成后又自己升级了一下,但是就是能直接运行。
启动界面


参考文献

[1] 定制适用于ARM平台的Ubuntu rootfs(根文件系统)
[2] Zynq-7000 AP SoC - Installing the Ubuntu Desktop on PetaLinux and Demo Tech Tip
[3] 正点原子启明星ZYNQ之嵌入式Linux开发指南 V1.5.1.pdf 附录A5 Ubuntu-base根文件系统构建

  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Zynq ARM是一款基于Xilinx Zynq系统芯片的ARM处理器。要控制LED,首先需要连接LED到Zynq ARM芯片上的GPIO(通用输入输出)引脚。然后,通过对GPIO寄存器进行编程,可以控制GPIO引脚的电平状态,从而控制LED的亮灭。 对于Zynq ARM芯片上的GPIO控制,可以使用Linux操作系统和相应的GPIO驱动程序来实现。在Linux中,GPIO控制的接口通常被映射到/dev/gpio目录下的文件,我们可以通过读写这些文件来控制GPIO引脚。 首先,需要确定LED连接到Zynq ARM芯片的哪个GPIO引脚上。然后,在Linux中使用命令行或者编写程序来设置该GPIO引脚为输出模式。 例如,如果LED连接到Zynq ARM芯片的GPIO0引脚上,可以使用以下命令在命令行中设置该引脚为输出模式: echo out > /sys/class/gpio/gpio0/direction 然后,可以使用以下命令将GPIO0引脚的电平设置为高或低,从而控制LED的亮灭: echo 1 > /sys/class/gpio/gpio0/value # 设置引脚电平为高,LED亮起 echo 0 > /sys/class/gpio/gpio0/value # 设置引脚电平为低,LED熄灭 如果希望通过编写程序来控制LED,可以使用C语言或Python等语言,通过打开/dev/gpio目录下相应的文件,然后读写文件来控制GPIO引脚电平。 总结起来,要实现Zynq ARM控制LED,需要确定LED连接的GPIO引脚,然后通过GPIO控制接口,设置引脚为输出模式,并通过读写相关文件或者编写程序,控制GPIO引脚电平,从而控制LED的亮灭。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值