我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

上一节中我们使用了小美编译配置好的内核,所以在配置完设备树之后,我们可以在Linux系统中查看到i2c_2节点。这一节我们来看看如何在Linux内核中配置和使能想要的驱动,以及编译对应的Linux内核。

1. 简介

HPS on SoC FPGA可以运行标准的Linux系统。Linux系统是一个高度可定制的系统,支持用户根据自己的实际硬件平台选择所需的驱动和功能,并编译Linux系统镜像。这样编译出来的Linux系统镜像文件大小可以非常小,从而可以部署在各种嵌入式硬件板上。

在基于SoC FPGA开发嵌入式系统应用程序时,如果仅使用虚拟地址映射的方法开发Linux应用程序,则无需开发Linux内核驱动程序或修改Linux内核配置。实际上,您也不需要安装Linux操作系统作为主机环境。根据本书前面讲解的虚拟地址映射方法,您可以直接在系统中使用DS-5开发软件编写和编译Linux应用程序。但如果您需要编写Linux内核驱动程序或修改Linux内核配置,则必须先获取Linux主机环境。一般可以通过以下三种方式获取Linux环境。

如果没有闲置的电脑,或者现有系统电脑的硬盘空间足够,可以考虑分配一部分硬盘空间安装Linux操作系统,最终形成双系统电脑。这种方式经济实惠,对电脑硬件要求不高。但是安装双系统有一定的风险,一不小心可能会导致整个硬盘数据丢失。另外在开发过程中使用工具时,需要切换系统,不是很方便。

如果电脑数量足够的话,可以选择在一台电脑上安装新的Linux操作系统。这种方式不需要考虑多系统共存的问题,对电脑硬件的要求也不太高。但也存在着无法方便使用系统的问题。

如果你的电脑配置较高,可以考虑虚拟机方案。先安装虚拟机软件,再用虚拟机软件创建虚拟电脑,最后在虚拟电脑里安装Linux操作系统;也可以先安装Linux,再在Linux里安装虚拟机,然后再安装。

常用的虚拟机软件有 Box 和 PC 等,不同虚拟机软件的使用方法略有不同,以下举例说明。优点:安装使用 Linux 非常方便;同时还可以使用系统。缺点:对电脑硬件要求较高,尤其是内存,建议 4GB 以上。使用虚拟机除了可以继续使用下面的工具外,还有以下好处:

安装完虚拟机后需要安装以下32位必备支持库

sudo apt install libstdc++6
sudo apt install lib32stdc++6
sudo apt install lib32z1

2.获取Intel SOC FPGA的Linux源代码

要编译嵌入式Linux系统,您需要相应的Linux系统源代码文件。有两种方法可以获取Intel SOC FPGA的Linux源代码:

当然我们选择最简单的,就是直接从光盘里复制,源码位于目录AC501-SoC开发板数据文件夹版本\Linux内核源代码\linux---4.5.zip,完成后输入以下命令解压:

unzip linux-socfpga-socfpga-4.5

3.搭建交叉编译环境

嵌入式系统由于资源匮乏,一般无法像PC机那样安装本地编译器和调试器,无法在本地完成程序的编写、编译和调试,而是需要PC机等其他系统来完成这些工作,这样的系统通常称为宿主机。

宿主机通常为安装了交叉编译器、调试器等工具的Linux系统;宿主机也可以是安装了嵌入式Linux集成开发环境的系统。在宿主机上编写、编译代码,通过串口、网口或硬件调试器将程序下载到目标系统上运行,系统框图如下图所示。

在这里插入图片描述

所谓交叉编译,就是利用宿主机平台上特定的交叉编译器,为不同于宿主机平台的目标系统编译程序,生成的程序运行在目标系统上,而不是运行在宿主机上。这里的平台有两层含义,一是核心处理器的架构,二是运行的系统。这样一来,交叉编译就有三种情况:

其实,在PC上进行非Linux嵌入式开发,即使使用Keil、ADS等IDE集成环境,也是一个交叉编译、调试的过程,只是IDE工具隐藏了细节,没有明确的提出这个概念。

交叉编译器就是在宿主机上运行的编译器,但是编译出来的二进制程序不能在宿主机上运行,​​只能在目标机上运行。交叉编译器的命名一般遵循“处理器-系统-gcc”的规则,一般通过名字就能知道交叉编译器的功能。例如下面的交叉编译器:

交叉编译器可以自己从源码编译,也可以从第三方获取。对于Intel的SoC FPGA,厂商建议使用编译器,可以从网站或官网下载。前面我们已经讲解了如何在系统中使用DS-5集成的交叉编译器编译Linux应用程序,现在我们需要在Linux系统中编译Linux内核,因此需要确保两者使用的交叉编译器版本相同。

上一章讲解基于虚拟地址映射的Linux应用程序编程时,使用的是17.1版本DS-5软件自带的arm-linux-工具链。在软件安装目录(D:\\17.1\\ds-5\sw\gcc)下有描述文件,其中注明编译器的版本为2014.04,也就是4.8.3版本。因此,在编译Linux内核时,也应该使用2014.04版本。

之前提到过,Intel会将编译器和源代码更新到网站上,但是目前网站上没有4.8.3版本,网站上对应的最新版本是4.8.2。但是这个版本的软件bug比较多,在编译Linux内核时会报错“error:#error Your is too buggy”。新版本的编译器需要到官网下载,但是官网上最老的版本是4.9-2016.02,无法直接下载。因此如果需要使用Prime 17.1版本软件自带的编译器,请直接从AC501-SoC开发板光盘中将此版本的编译器复制到系统中,然后解压安装即可。交叉编译器所在光盘目录:AC501-SoC开发板数据文件夹版本\配套软件\gcc--arm-linux--4.8-2014..tar.xz。解压命令如下:

tar xvf gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz

环境变量生效方法请参考:【别忘了一起配置ARCH】

正确配置环境变量后,输入arm-linux--gcc -v如下图:

4.配置并编译Linux内核

只有正确配置内核后才能进行编译。配置不正确的内核很可能会编译失败或无法正确运行。

4.1、快速配置内核

进入Linux内核源代码的顶层目录,然后输入make命令,进入Linux内核主配置界面如下图所示(注意:主机必须安装相关库才能正确运行该命令并显示配置界面)。若未安装相关库,请在命令行中输入以下命令完成库的安装:

sudo apt install build-essential
sudo apt install libncurses5
sudo apt install libncurses5-dev

输入以下命令打开图形界面配置内核,如果能打开说明库安装正确,环境OK,然后就可以暂时退出了。

make menuconfig

Linux内核配置界面不支持鼠标操作,必须用键盘操作。基本操作方法:

在Linux系统源代码的arch/arm/目录下,有很多处理器内核的配置文件。这些一般由处理器厂商提供,用户可以根据自己的需求对相应的配置文件进行简单的修改,从而得到自定义的系统。从头配置一个合适的内核,不仅工作量巨大,而且很容易出错。

对于Intel的SoC FPGA芯片,在Linux源码中已经提供了一个名为的配置文件,建议大家基于此配置文件来配置和修改内核,因此在配置之前需要先将该配置文件导入到默认配置文件中,操作非常简单。

在终端中输入make命令,选择厂商提供的基本配置设置,如下图

然后就可以使用命令打开内核配置界面了。输入make命令,打开内核配置界面。

本书并不介绍内核的详细配置,这里只介绍几种工程相关的设备驱动的开启方法。

4.1.1、启用UART驱动

项目中增加了一个UART串口外设,而Linux系统的驱动源代码已经有了对该串口控制器的驱动支持,因此,可以开启Linux系统中的驱动支持,快速实现在FPGA端添加的UART IP的驱动。

另外Linux系统还支持JTAG UART,为了避免以后需要时重新配置内核,这里也将其启用。

依次输入>>选项,在UART、UART、UART选项前输入字符“y”即可启用该选项。如下图所示

按两次 ESC 键可返回上一级。

4.1.2. 启用 SPI 驱动

4.5版本的Linux源码除了提供对UART IP核的驱动支持外,还提供了对SPI IP核的支持,因此,通过在Linux系统中开启该驱动支持,即可快速实现对FPGA端添加的SPI IP的驱动。

首先回车,在SPI选项前面的[ ]中输入字符“y”来启用对SPI的支持,然后按下键盘上的回车键,进入下一层。在SPI选项前面输入字符“y”来启用该选项,如下图所示:

4.1.3. 启用控制器驱动程序

项目中添加了一个开源的第三方I2C控制器“”,该控制器在4.5版本的Linux内核中已有驱动支持,因此可以在内核配置中打开该控制器的驱动编译。

进入 > I2C > I2C Bus ,在I2C选项前输入字符“y”开启该选项。如下图所示:

4.1.4、使能驱动

项目中添加了一个用于图形显示的控制器,该控制器应该是Linux系统的一个属性,4.5版本的Linux源码已经提供了该控制器的驱动支持,启用该驱动就可以在AC501-SoC开发板的5寸显示屏上显示图形和文字。

依次输入>>Frame选项,先在for frame选项前面输入字符“y”启用该选项,再在VIP Frame选项前面输入字符“y”启用该选项。如下图所示

另外,为了支持显示屏作为终端使用,用户可以直接在显示屏上登录,输入和反馈各种命令信息。可以在>>选项中启用该选项。这样系统开机时,显示屏上就会显示登录界面。用户可以将USB键盘连接到开发板上输入各种命令,就像在电脑上使用串口终端操作开发板一样。如下图所示

至此,项目的Linux内核配置完成。反复按ESC,直到弹出Save对话框,选择Yes保存配置,如下图

4.2. 保存内核配置文件

配置完成后,当前的配置会暂时保存在 . 文件中,这是一个临时文件。为了保存当前的配置以便以后再次编译内核时可以直接使用配置的内容,可以使用命令存储当前的配置信息。下次需要按照这个配置编译内核时,就可以使用这个配置文件了。例如,存储配置,可以使用以下命令:

make savedefconfig && mv defconfig arch/arm/configs/ac501_defconfig

保存之后在arch/arm//路径下会多出一个文件名为,如下图

在这里插入图片描述

这样下次需要编译ac501开发板的内核配置时,输入make命令将配置文件的内容更新到源代码根目录下的.文件中,然后就可以使用make命令按照这个配置编译内核了。当然,你也可以使用make命令打开配置界面,再次修改配置。

4.3. 编译内核

输入make -j4命令开始编译内核,编译过程大概需要5到20分钟,具体时间取决于用户PC的性能。编译完成后会生成内核镜像文件,该文件默认存放在linux-/arch/arm/boot下,如下图所示。

在这里插入图片描述

5.使用内核启动开发板

将文件复制到AC501-SoC开发板的SD卡上,将工程生成的dtb文件和rbf文件复制到启动SD卡上,设置MSEL[4:0]=5',然后启动AC501-SoC开发板,串口就会开始打印启动信息。在众多的启动信息中,下面这几条比较重要:

1、内核信息。在打印信息后的第二行开始打印内核的详细信息,包括内核版本、编译主机、编译器版本、编译时间等,如下图所示。可以看出内核版本为4.5,编译主机为笔者使用的系统的账号,gcc交叉编译器为4.8.3。最能证明这个内核就是我们刚刚编译出来的内核的信息就是时间,显示内核编译时间为Sun Aug 30 00:05:32 CST 2020,与上图显示的内核编译时间一致。

2、设备驱动加载。在众多的启动信息中,以下三条设备驱动加载信息值得注意。如下图所示,这三条信息的详细信息为:

第一个表示识别到设备并加载驱动,创建的设备名字为fb0。

第二行显示识别到 UART 设备,并加载驱动程序。创建的设备名称为;

第三行表示识别到控制器,由于SPI的属性是总线而不是设备,所以没有创建设备节点。

使用ls命令查看dev目录下的文件,可以看到fb0设备以及该设备的存在,如下图

如果使用厂家提供的配置文件编译的内核(AC501-SoC开发板光盘中已经提供内核镜像),由于没有启用上述驱动,所以不会打印设备驱动加载信息,也不会在/dev目录下创建设备节点,液晶屏也不会亮。

二维码
扫一扫在手机端查看

本文链接:https://by928.com/6633.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线