1. 在PC机上安装Linux系统

参考:【Terasic友晶科技】【重装系统】如何从U盘启动安装Ubuntu系统(设置电脑从U盘启动)

2.在Linux系统上安装必要的库

apt install lib32ncurses5 -y
apt install libncurses5-dev -y
apt install qemu-user-static -y

3. 安装Quartus和SOC EDS 软件

参考:UBUNTU 18.04.6 如何安装Quartus SOCEDS 等软件

4. 添加自定义IP

(1)拷贝DE10-Nano_v.1.3.8_HWrevC_SystemCD\Demonstrations\SoC_FPGA\DE10_NANO_SoC_FB工程到Linux系统

(2)添加自定义IP,参考:【从零开始】制作适用于CYCLONE V SOC FPGA(ARM平台)的UBUNTU系统(四)——添加自定义IP

如果遇到问题参考:generate qsys 时报错Error: border: Error during execution of script generate_hps_sdram.tcl

5. 生成preloader rbf uboot和dtb

(1)设置环境变量,进入安装目录intelFPGA_lite/18.1/embedded/打开终端,运行embedded_command_shell.sh

(2)回到DE10_NANO_SoC_FB工程目录,输入make all ,用Makefile文件生成preloader rbf uboot和dtb。(这个过程会很久,这个过程中会把整个工程重新编译了一遍)

 

这个过程会提示 Component alt_vip_itc_0 of class alt_vip_itc is unknown,这个可以不用管暂时,想进一步了解可以参考:

用DE10_NANO_SOC_FB生成DTS的时候 提示COMPONENT ALT_VIP_ITC_0 OF CLASS ALT_VIP_ITC IS UNKNOWN

 

如果是提示ERROR (phandle_references): Reference to non-existent node or label "led_pio",是因为在上面添加自定义IP 的时候去掉了led_pio这个模块,而参与生成dtb文件的xml文件里面还存在led_pio的信息。

 解决办法之一是可以采取强制命令生成dtb文件:

dtc -I dts -O dtb -o soc_system.dtb soc_system.dts -f

 

 这样在DE10_NANO_SoC_FB工程目录中就生成了最新的dtb文件。

接下来因为u-boot.scr和rbf文件等还没有生成,所以重新执行make all直到所有编译都完成:

 

6. 下载交叉编译链并解压

 

wget https://releases.linaro.org/components/toolchain/binaries/latest-6/arm-linux-gnueabihf/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz

tar xvf gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz

rm gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz

 

7. 下载Linux内核

(1)下载内核:

 git clone https://github.com/terasic/linux-socfpga.git

然后指定到你要用的分支(checkout是切换branch):

cd linux-socfpga
git checkout -t -b socfpga-4.16 origin/socfpga-4.16

 或者直接下载指定分支:

 git clone -b socfpga-4.16 https://github.com/terasic/linux-socfpga.git

再或者直接从网站下载压缩包然后拷贝到Linux PC机上:

(2)为交叉编译设置环境变量(注意:每次terminal关闭, 设置的环境变量就失效了, 需要重新设置一次):

export ARCH=arm
export CROSS_COMPILE=/home/doreen/DE10_NANO_SoC_FB/software/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

(3)生成默认配置文件(.config):

Intel 针对 SoC FPGA 芯片 提供的Linux 源码中已经提供好了一个名为socfpga_defconfig 的配置文件,我们对内核的配置和修改,建议基于此配置文件进行,因此在进行配置前,需要先将该配置文件导入到默认配置文件.config中,操作方法很简单:

make socfpga_defconfig

 

如果遇到提示: /bin/sh: 1: bison: not found, 请参考 UBUNTU 18.04.6 在编译linux内核的时候执行make ARCH=arm socfpga_defconfig设置默认配置时报错bison flex not found 缺少文件

接着再执行 make socfpga_defconfig,如遇到提示:/bin/sh: 1: flex: not found ,请参考 UBUNTU 18.04.6 在编译linux内核的时候执行make ARCH=arm socfpga_defconfig设置默认配置时报错bison flex not found 缺少文件

(4)进行内核配置:

按向右的按键 选中Save弹出界面:

 点击3次键盘的Enter键弹出界面:

 按向右的按键选中Exit,点击键盘Enter键退出内核配置界面。

(5)编译内核(这个过程会需要点时间,请耐心等待):

make zImage

 编译成功:

8. 下载根文件系统

Ubuntu是Linux系统的一种,可以简单的将Ubuntu理解为一个根文件系统,和我们用busybox、buildroot制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上。

Ubuntu的移植非常简单,不需要我们编译任何东西,因为Ubuntu官方已经将根文件系统制作好了!我们只需要简单配置一下Ubuntu官方提供的base根文件系统,使其在我们的开发板上跑起来即可。首先是到Ubuntu官方去下载18.04的根文件系统,下载地址为http://cdimage.ubuntu.com/ubuntu-base/releases/,这里又很多版本可选:

 Ubuntu针对不同的CPU架构提供相应的ubuntu-base根文件系统,有amd64(64位X86)、armhf、i386(32位X86)、powerpc、ppc64el等系统的。DE10-Nano 是Cortex-A9内核的CPU,并且有硬件浮点运算单元,因此选择armhf版本。

(1)下载根文件系统:

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

(2)在software文件夹内新建rootfs文件夹,解压根文件系统到rootfs文件夹:

cd rootfs
tar xvf ubuntu-base-18.04.5-base-armhf.tar.gz
rm ubuntu-base-18.04.5-base-armhf.tar.gz

 

 (3)拷贝qemu-user-static:

cp /usr/bin/qemu-arm-static usr/bin/

注意:拷贝不成功时,可能要需要在PC的Ubuntu上先安装qemu工具:

sudo apt-get install qemu-user-static

然后将刚刚安装的qemu-arm-static拷贝到刚刚解压出来的文件系统中,也就是rootfs/usr/bin目录下。

 

(4)设置软件源

我们在ubuntu下使用apt-get安装软件的时候,是从网上下载软件并安装的,因此需要指定软件源。在设置软件源之前先将 Ubuntu主机下的DNS配置文件/etc/resolv.conf 拷贝到根文件系统中,命令如下:

cp /etc/resolv.conf etc/resolv.conf

 

打开rootfs/etc/apt/sources.list文件,在文末加上如下这些(或者把之前内容删除掉,换成下面的内容):

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-proposed main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-proposed main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe

记住都要改成bionic,与你的文件系统版本匹配。 有的移植ubuntu其他版本(比如xenial)时,则需要修改成 xenial

(5)主机挂载根文件系统:

接下来将上面制作的根文件系统挂载在主机上,需要挂载proc、sys、dev、dev/pts等文件系统,使用chroot将主机的根文件系统切换到我们前面制作的根文件系统中。这里我们通过一个脚本文件来完成挂载和卸载操作,在software目录下创建一个名为ch-mount.sh的shell脚本,然后在里面输入如下所示内容:

#!/bin/bash
# 


function mnt() {
    echo "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}
}

function umnt() {
    echo "UNMOUNTING"
    sudo umount ${2}proc
    sudo umount ${2}sys
    sudo umount ${2}dev/pts
    sudo umount ${2}dev

}


if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
    mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
    umnt $1 $2
else
    echo ""
    echo "Either 1'st, 2'nd or both parameters were missing"
    echo ""
    echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
    echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
    echo ""
    echo "For example: ch-mount -m /media/sdcard/"
    echo ""
    echo 1st parameter : ${1}
    echo 2nd parameter : ${2}
fi

先给予ch-mount.sh文件的可执行权限,然后执行ch-mount.sh挂载根文件系统挂载到主机下,输入如下命令:

chmod a+x ch-mount.sh

./ch-mount.sh -m rootfs/

 注意: 有的会遇到问题:执行./ch-mount.sh -m rootfs/时报错: /bin/bash^M 解释器错误: 没有那个文件或目录

由于ubuntu base是一个最小根文件系统,很多命令和软件都没有,因此我们需要先安装一下常用的命令和软件,输入如下命令(注意!是在电脑的Ubuntu下输入这些命令,因为现在电脑的Ubuntu正挂载着我们移植的Ubuntu-base根文件系统):

 

apt update
apt install sudo
apt install kmod (支持insmod命令)
apt install ssh (支持scp命令)
apt install net-tools (支持ifconfig命令)
apt install udhcpc (自动分配IP)
apt install ethtool
apt install lxde 
apt upgrade

 

如果安装kmod(安装kmod后就支持去掉加载命令insmod)遇到问题E:Unable to locate package kmod:或者是问题InRelease: Couldn’t create temporary file /tmp/apt.conf.caV5H6 for passing config to apt-key请参考:当在根文件系统中安装命令提示E:Unable to locate package kmod和InRelease: Couldn’t create temporary file /tmp/apt.con

 

完安装ssh后继续执行 sed -i 's%#PermitRootLogin prohibit-password%PermitRootLogin yes%' /etc/ssh/sshd_config:

如果这个没有设置,或者PermitRootLogin yes内容的前面的#号没有删除,后面使用scp命令通过网络传输文件会有问题,参考:用scp命令将文件从windows系统传递到目标主机DE10-Nano时提示 Permission denied, please try again.

 

如果安装lxde遇到问题参考:UBUNTU安装LXDE遇到报错ERRORS WERE ENCOUNTERED WHILE PROCESSING: /TMP/APT-DPKG-INSTALL-NAH42F/708-LXDE-ICON-THEME_0.5.1-2_ALL.DEB

 

 其他的命令和软件也可以在用户在开发板的ubuntu boot起来,当临时要使用的时候再安装(下面的这些安装是可选的,可以暂时不安装, 下面的这个命令是一次性安装多个命令和软件)。

apt install sudo ssh net-tools ethtool wireless-tools lxde xfce4-power-manager xinit xorg network-manager iputils-ping rsyslog lightdm-gtk-greeter xserver-xorg-video-fbdev lightdm bash-completion lxtask htop python-gobject-2 python-gtk2 synaptic libgtk-3-dev console-data --no-install-recommends --yes

 

 再次执行apt upgrade。

 

useradd terasic -m -s /bin/bash
echo terasic:123 | chpasswd

修改root密碼
echo root:123 | chpasswd

用户名:
echo 'DE10_NANO' > /etc/hostname

添加host entry in /etc/hosts:
echo "127.0.0.1 localhost" >> /etc/hosts
echo "127.0.1.1 DE10_NANO" >> /etc/hosts

 

卸载文件系统:

exit

./ch-mount.sh -u rootfs/

 

注意加载和卸载文件系统,稍有不慎(操作不当)会导致文件系统卸载不完全, 比如我没有输入exit,直接在挂载的文件系统里面执行./ch-mount.sh -u rootfs/ , 后来发现以后再执行exit和./ch-mount.sh -u rootfs/时,proc卸载不了,后来linux系统也不能正常关机卡死了,强制关机再开机就遇到问题了:在ubuntu上挂载文件系统后卸载不了? 最后我只好重新安装系统。

 

复制LXDE 桌面图片文件到rootfs/etc/alternatives路径下:

 

9. 打包SD卡众多文件

在software文件夹新建这些文件目录:

de10_nano/
├── image
│  ├── p1 
     └── output_files
│  ├── p2
│  └── p3 
 
mkdir de10_nano
cd de10_nano
mkdir image
mkdir image/p1
mkdir image/p2
mkdir image/p3 
cd p1
mkdir output_files

然后回到DE10_NANO_SoC_FB路径,将相应文件拷贝到相应目录下:

cp output_files/*.rbf ~/de10_nano/image/p1/output_files/
cp soc_system.dtb ~/de10_nano/image/p1/
cp u-boot.scr ~/de10_nano/image/p1/
cp software/preloader/preloader-mkpimage.bin ~/de10_nano/image/p3/
cp software/preloader/uboot-socfpga/u-boot.img ~/de10_nano/image/p3/
cp software/linux-socfpga/arch/arm/boot/zImage ~/de10_nano/image/p1/

 

 

制作makefile文件, Makefile文件内容如下:

all:
    ./make_sdimage_p3.py -f \
        -P p1/*,num=1,format=vfat,size=100M \
        -P p2/*,num=2,format=ext3,size=7300M \
        -P p3/preloader-mkpimage.bin,p3/u-boot.img,num=3,format=raw,size=10M,type=A2 \
        -s 7500M \
        -n de10-nano-sdcard.img

 用touch Makefile命令在image路径下创建Makefile文件,用vi Makefile 编辑该文件,粘贴上面内容,然后输入:wq保存退出。

下载Phython脚本https://releases.rocketboards.org/2020.07/gsrd/tools/make_sdimage_p3.py 。(以前用https://releases.rocketboards.org/2019.04/gsrd/tools/make_sdimage.py

将Makefile文件和make_sdimage_p3.py拷贝到image路径下:

 

然后执行sudo make 即可生成de10-nano-sdcard.img 文件了。

 如果输入sudo make提示“Makefile:2: ***缺失分隔符。停止。”或者提示“Makefile:2: ***缺失分隔符。停止“,请参考链接CYCLONE V SOC FPGA 如何将PRELOADER UBOOT KERNEL ROOTFILE RBF DTB UBOOT.SCR 等文件打包成一个SD卡 .IMG文件 方便WINDOWS的WINDISK32 一键烧写呢?  的第3题。

 

如果输入sudo make 提示问题/bin/sh: 1: ./make_sdimage_p3.py:Permission denied, 请参考链接CYCLONE V SOC FPGA 如何将PRELOADER UBOOT KERNEL ROOTFILE RBF DTB UBOOT.SCR 等文件打包成一个SD卡 .IMG文件 方便WINDOWS的WINDISK32 一键烧写呢?  的第1题。

 

10. 烧写img文件到SD卡

准备一个16GB以上的SD卡。

在Linux上用一个命令烧写SD卡参考:在ubuntu上用命令烧写SD卡&&在Windows上用Win32DiskImager工具一键烧写SD卡

在Windows上烧写SD卡参考:在ubuntu上用命令烧写SD卡&&在Windows上用Win32DiskImager工具一键烧写SD卡

11. 设计led的Linux底层驱动

参考:通过LINUX驱动控制FPGA端PWM外设(LED) 通过应用程序命令传参随意修改寄存器的值(PWM波频率和占空比随意修改)

12. 设计led的测试程序app

参考:通过LINUX驱动控制FPGA端PWM外设(LED) 通过应用程序命令传参随意修改寄存器的值(PWM波频率和占空比随意修改)

13. 拷贝驱动文件和linux可执行文件到SD卡

参考:通过LINUX驱动控制FPGA端PWM外设(LED) 通过应用程序命令传参随意修改寄存器的值(PWM波频率和占空比随意修改)

 如果是通过Windows传输文件到开发板ubuntu系统出现问题参考:用scp命令在Windows传递文件给linux系统时报错IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

14. 测试结果

参考:通过LINUX驱动控制FPGA端PWM外设(LED) 通过应用程序命令传参随意修改寄存器的值(PWM波频率和占空比随意修改)

 如果遇到问题请参考:加载驱动遇到 ERROR: could not insert module pwmdriver.ko: Invalid module format

 

15. 工程代码下载:

链接:https://pan.baidu.com/s/1o__b6bqMtjEFqUVdhIsYSg?pwd=czy2
提取码:czy2

(因为文件系统太大, 我删掉了, 其余基本保留)