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)进行内核配置:
make menuconfig
弹出如下界面:
如果没弹出界面可以参考解决办法
(1)UBUNTU 18.04.6编译linux内核make ARCH=arm menuconfig提示recipe for target ‘menuconfig’ failed
(3)UBUNTU 18.04.6 在编译LINUX内核的时候执行MAKE ARCH=ARM SOCFPGA_DEFCONFIG提示Can't find default configuration "arch/x86/configs/socfpga_defconfig"
(4) 配置内核的时候提示YOUR DISPLAY IS TOO SMALL TO RUN MENUCONFIG! IT MUST BE AT LEAST 19 LINES BY 80 COLUMNS.
工程师可以在这个界面修改内核的一些配置,因为目前暂无特殊需求, 所以内核配置我暂时保持默认配置好了:
点击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文件夹新建这些文件目录:
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波频率和占空比随意修改)
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
(因为文件系统太大, 我删掉了, 其余基本保留)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具