DE1-SoC实用经验之——linux内核编译
从2014年初到现在,虽然DE1-SoC已经推出近两年多并且该板子的好评率也不低,但是网上能找到的相关开发经验却并不多,因此很多问题也需要自己慢慢探索。本文先来谈一谈如何有效地对其linux内核进行编译。
众所周知,SoC FPGA的最大特点就是除了运用FPGA进行硬件定制和构建NIOS软核处理器之外,其中的ARM硬核处理器可以很方便地移植嵌入式linux操作系统,这样就大大方便了应用FPGA进行嵌入式设计。DE1-SoC SD镜像文件的linux系统中,默认的驱动程序是相当有限的,为了给它增加更多的驱动程序,比如SPI驱动、LCD驱动或者摄像头驱动,我们就需要对其linux内核进行配置和重新编译。本文的解决过程除了参考Altera WiKi (见如下链接)中与内核编译相关的教程之外,还提供了笔者的一些个人经验。
http://www.alterawiki.com/wiki/Compiling_u-boot_and_Linux_Kernel_for_Cyclone_V_SoC
主机环境:Win10、Ubuntu 12.04.4(VMware Workstation虚拟机)
目标板: DE1-SoC (原则上SOC系列FPGA开发板均可)
嵌入式Linux版本:Linux socfpga 3.12.0(DE1_SoC_SD提供, Linux Concole 2014-01-14)
交叉编译工具: gcc-linaro-arm-linux-gnueabihf-4.7
必备工具: Win32DiskImager、串口调试助手
二、移植及编译内核步骤
1. 移植Linux到DE1-SoC
具体教程见DE1-SoC_SystemCD解压后的UserManual文件夹下的DE1-SoC_Getting_Started_Guide文档里。移植完成后用USB连接到DE1-SoC(板上已经有USB转232芯片),即可在串口调试助手界面里看到linux的命令行,于是就可以通过串口来完成与linux的交互工作。需要注意的是,terasic所有的教程里使用的串口助手均为Putty,然而本人的Putty怎么都无法连接到DE1-SoC,所以使用一般的串口调试助手也是OK的(本人用ATK XCOM V2.0)。Putty的好处是Windows下和Linux下都可以使用,但一般我们用虚拟机的话在Windows下用普通的串口工具调试开发板即可。为防止Linux版本变动,启动DE1-SOC板子并root登入Linux之后,可以用 uname -a命令查看linux版本信息
2.配置Linux内核
虽然DE1_SoC_SD已经提供了编译好的内核,但该内核的驱动程序是有限的,并且随着我们给ARM HPS增加更多的外设和功能,就需要对内核作出修改和重新编译。需要特别注意的是,如果只是单纯地配置和编译内核,不对文件系统进行修改,需要保证内核和文件系统是相同的版本,比如这里我们的文件系统是3.12版本,那么编译内核的时候Linux源码也要使用3.12版本的,否则会造成系统无法启动或者配置修改无效。如果要对整个Linux文件系统进行版本更新,那么具体可以参考
http://www.alterawiki.com/wiki/Compiling_u-boot_and_Linux_Kernel_for_Cyclone_V_SoC
中的相关步骤。不过一般情况下我们是不需要对文件系统进行变更的。
(1)安装交叉编译工具:
下载地址:ftp://ftp.altera.com/outgoing/SoC_FPGA/ethernet_3.7/gcc-linaro-arm.tar.bz2
先解压到合适的文件夹下即可,解压后得到一个名为“gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux“的文件夹;
(2)下载Linux源码:
首先安装git工具,git 是类似于svn 的版本控制工具了,他的开发者就是linux内核的发明者linus torvalds。关于git 的安装可以参考http://www.douban.com/note/263056199/ 这个链接的源码安装方法。安装完成后输入git --version 命令可以查看到 git version 1.x.x的信息说明安装成功了。(在ubuntu 环境下也可以使用apt-get install git 命令安装git 工具)。然后就是从rocketboards的git 仓库中获取linux 的源码了。
git clone gits://git.rocketboards.org/linux-socfpga.git
cd linux-socfpga
git checkout -b kenel_3.12 origin/socfpga-3.12
(这里kernel 3.12可以任意命令, origin/socfpga-3.12 表示远程版本信息,Altera 从3.7版本开始都有上传到git server上。用户可以用 git branch -r 查看远程的版本号,目前最新的版本已经到4.7了)。这样内核源码就已经获取完成。
(3)配置并编译内核:
使用cd命令转到上述socfpga文件夹目录下以此输入下列命令:
export ARCH=arm (指定CPU架构)
export PATH=/home/felton/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin:$PATH (交叉编译工具路径指向第一步中解压的gcc文件夹下的bin文件夹内)
make socfpga_defconfig (先完成SOC_FPGA的默认配置)
如果需要配置内核增加新的硬件驱动,则输入
make menuconfig
此时会跳出菜单形式配置Linux的界面如下所示:
export CROSS_COMPILE=arm-linux-gnueabihf- (调用gcc)
make zImage LOADADDR=0x8000 (指定引导地址)
完成后在socfpga/arch/arm/boot文件夹下找到生成的内核文件zlmage,将其拷贝到SD卡中,重启开发板即可发现已经完成对Linux内核驱动程序的更新。