![嵌入式Linux设备驱动程序开发指南(原书第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/453/40381453/b_40381453.jpg)
1.10 为Microchip SAMA5D2处理器构建嵌入式Linux系统
SAMA5D2系列是基于MPU的高性能、低功耗的ARM Cortex-A5处理器。Cortex A5处理器最高运行频率达500MHz,支持ARM NEON SIMD引擎、128kB L2缓存和浮点运算单元。它支持多种存储器,包括最新一代的存储器技术,如DDR3、LPDDR3和QSPI闪存。它也集成了功能强大的外部设备(EMAC、USB、双CAN、多达10个UART等)和用户应用接口(TFT LCD控制器、PCAP和电阻触摸控制器、D类功放、音频锁相环、CMOS摄像头接口等)。这些设备提供高级的安全功能以保护客户的代码和外部数据的安全传输。其中包括ARM TrustZone、篡改检测、安全数据存储、硬件加密引擎、存储在外部DDR或QSPI内存中的代码的动态解密以及安全引导加载程序。
以上信息可以在下面链接查询到:http://www.microchip.com/design-centers/32-bit-mpus/microprocessors/sama5/sama5d2-series。
针对SAMA5D2B-XULT的实验开发,将使用SAMA5D2(Rev. B)开发评估板。单板的使用手册可在下面的链接找到:http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-44083-32-bit-Cortex-A5-Microprocessor-SAMA5D2-Rev.B-Xplained-Ultra_User-Guide.pdf。
1.10.1 简介
为了在Linux主机上获得Yocto工程,必须先安装下面列出的软件包和工具。一个重要的考虑因素是主机的磁盘空间。例如:在Ubuntu主机上构建的时候,X11后端程序需要的最小空间是50 GB。推荐至少要有120 GB的磁盘空间可用,这样才有足够的空间编译所有的后端软件。
所有的命令,已经在Ubuntu 14.04 64位主机上测试过了。
1.10.2 主机软件包
Yocto工程的构建需要安装一些软件包,这些软件包在Yocto工程里有相关文档说明。工程涉及的一些主要包有:
![040-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/040-01.jpg?sign=1738851941-nbJnmmXUIrIb4WLioq2w7WJZsNeVXjX5-0-d9617cf2a2866bce51fc5f5c34db4aee)
Ubuntu 14.04主机需要安装的软件包有:
![040-02](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/040-02.jpg?sign=1738851941-mqlo1VDxDZkOISLCd66oAagasvp8yr6h-0-ca83fe39da00e834905cbda0a50c6aab)
1.10.3 Yocto工程的安装和映像构建
Yocto工程有功能强大的构建环境。它由几个组件构建而成,包括著名的用于嵌入式Linux的OpenEmbedded框架。poky是构建整个嵌入式系统发行版的参考系统。
对SAMA5系列处理器的支持代码包含在Yocto的一个特定层中:meta-atmel。相关源托管在Linux4SAM GitHub账户上:https://github.com/linux4sam/meta-atmel。
参考下面的构建步骤:
创建一个目录:
![041-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/041-01.jpg?sign=1738851941-9QmCrf9jI4O36uwO55S1UVUWaqe9HGgT-0-d6a3553d1353c4734e43b5f53ecae389)
克隆yocto/poky的git仓库里合适的稳定分支:
![041-02](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/041-02.jpg?sign=1738851941-2eobBtCGOlf3AOZfVtyvet2n808yjh6v-0-718e2db53f5200c1aaa3dbcc39ea47b6)
克隆meta-openembedded的git仓库里合适的稳定分支:
![041-03](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/041-03.jpg?sign=1738851941-2Hyj7Z2FyXX5TdKpyatK3otKkeIGD0Rx-0-d351862f9b7620b7b9168392debdc1a2)
克隆meta-qt5的git仓库里合适的稳定分支:
![041-04](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/041-04.jpg?sign=1738851941-0n8oTzTYP02kpTUtHz7Fhe1MOpfzBiGb-0-3d4f52e83f9633a5304bbf539979f3fb)
克隆meta-atmel层的git仓库里合适的稳定分支:
![041-05](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/041-05.jpg?sign=1738851941-AHYfeS2BFTKo7qM7tirEMF1MV7MIt2T0-0-43c34e13c036f1d9ea0a2af0742847bb)
进入poky目录,配置构建系统和启动构建过程:
![041-06](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/041-06.jpg?sign=1738851941-YLR1patCIXrKzTpc2yBLHCEYZu0W3Jvp-0-1c5822f2488548f76878d14ebe179dab)
初始化构建用的目录:
![041-07](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/041-07.jpg?sign=1738851941-qV1lGGzqDVp5ecOPsWRJuH828awle97q-0-e45c5ce882ffa30e8e9794c6859610aa)
在bblayer配置文件中添加meta-atmel层。
![041-08](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/041-08.jpg?sign=1738851941-X9128kRi5tYQXH7JhsQUIB47HQObFrTY-0-cfa68fb3771bcfd38c92faab5574c20b)
编辑local.conf
文件,指定计算机、源文件的存放路径、包的类型(rpm、deb或者ipk)。设置MACHINE的名字为“sama5d2-xplained”。
![042-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/042-01.jpg?sign=1738851941-GJLBkygtn0SSXJkpIT7uCeggzGaHvTkQ-0-e54277109afe8fc45b2bdc9c278b4bdf)
为了获得较好的性能,添加下面一行参数,来使用“poky-atmel”发行版:
![042-02](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/042-02.jpg?sign=1738851941-iYEFzyXwtcBdRYE6HgNw1rWOZFjue3yr-0-040b44fd439ac2500f944103014c6427)
构建演示映像文件。QT演示映像文件需要额外修改local.conf
,你可以在文件末尾添加下面这两行代码:
![042-03](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/042-03.jpg?sign=1738851941-1mLvCMZCEBgV2eJ1cU4pDO8Ny7W0Odcl-0-a256c9792592a30365f5563302e61139)
在官方的4.9版本的内核标签上增加了一些增强功能,已经支持大多数的Microchip SOC特性了。同时请注意,基于这个长期支持的内核发布的每一个稳定版本,都集成了Microchip的特性。这也就意味着,每一个4.9.x版本都合并到了Microchip的分支里。你将使用Linux4sam_5.7版本集成稳定的内核版本,这会将内核升级到4.9.52版本。你可以在这个地址检阅更多信息:https://www.at91.com/linux4sam/bin/view/Linux4SAM/LinuxKernel。
你将创建一个SD演示映像文件,由linux4sam_5.7版本代码进行编译。请在https://www.at91.com/linux4sam/bin/view/Linux4SAM/DemoArchive5_7下载Yocto的演示文件linux4sam-poky-sama5d2_xplained-5.7.img.bz2
。
为了把这个压缩文件写进SD卡里,需要下载安装Etcher工具。这是一个开源的软件,它的好处是可以读取一个压缩后的映像文件。在Etcher的网站上可以看到更多的信息和更多额外的帮助:https://etcher.io/。根据网址https://www.at91.com/linux4sam/bin/ view/ Linux4SAM/Sama5d2XplainedMainPage上的“Create a SD card with the demo”节的步骤,用映像文件创建一个SD卡。
1.10.4 Yocto之外的工作
本节将讲述为SAMA5D2处理器构建Yocto SDK的一些指令。这些指令的具体意思,请参考之前讲过的1.9.5节。
![043-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/043-01.jpg?sign=1738851941-6wYPXa5PrOAqWrcfCp9tmG0jV65EDAZE-0-18799ed1135d7c7a91b699375c55df50)
1.10.5 构建Linux内核
这一节将讲述为SAMA5D2处理器构建Linux内核的一些命令。关于这些命令的更多信息,请参考之前的1.9.6节。
从Yocto工程中拷贝内核源代码到一个新的文件夹:
![043-02](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/043-02.jpg?sign=1738851941-RqupxJ8gsjq3Y2MN0YrJEqiTwRYa4fCD-0-771df066ed7d9c531edf2e39ab81b288)
从Microchip的git仓库下载内核源代码。
![043-03](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/043-03.jpg?sign=1738851941-BOhWrVOu3U4K2HrNYQu5mIYTF7cJmQOf-0-274dfb4d59422e2689d9aea39eebaf72)
编译内核镜像、内核模块和所有的设备树文件:
![043-04](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/043-04.jpg?sign=1738851941-Y20ESUwHAFEi5Fg07sNvkJ08ztnNtxOm-0-351d01d2651d389c1d953dade0e09641)
配置内核设置项,这些设置项在开发驱动的时候会用到。
![044-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/044-01.jpg?sign=1738851941-EbNiboFy8QwcNzjc2vqkt36WXU5nFuUo-0-330728181f384dc5d45f05b413629eaf)
配置完成后保存配置并从menuconfig退出。
使用下面的步骤,调用工具链脚本,并编译内核,设备树文件和内核模块:
![044-02](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/044-02.jpg?sign=1738851941-2dX6lSLjMWCR9Yxa9d6Mg8Sk8cLaFCSE-0-0d7a643bf0dcd294509066e0b522a48c)
一旦Linux内核、设备树文件和内核模块被编译完,就可以开始安装了。在这个例子中,对于内核映像,可以通过把zImage文件复制到工具读取内核映像的地方来安装。设备树二进制文件应该也被复制到内核映像文件被复制到的位置。可以从TFTP服务器上读取内核映像和设备树文件。
![044-03](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/044-03.jpg?sign=1738851941-wZDYKIrIzbqLTBeJBOU94uxqsKOT2aFk-0-8496370ba999a4e7a645bd59043274b7)
在驱动开发的过程中,你可以在主机上使用TFTP服务器和NFS服务器,并且只需要把引导加载器存放在SD卡里就可以了。引导加载器从TFTP服务器上读取Linux内核,从NFS服务器上挂载根文件系统。这样,不需要重新烧写SD卡,就可以修改内核映像和根文件系统。
1.10.6 安装TFTP服务器
使用下面的步骤在Ubuntu 14.04主机上安装和配置TFTP服务器:
![045-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/045-01.jpg?sign=1738851941-pTH5a8H24MTCFqomjwrMXexUVIiJcijA-0-c066918ef4d99e88f10f6f76973017c0)
使用下面的命令修改文件夹的权限,让所有的用户都可以访问它:
![045-02](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/045-02.jpg?sign=1738851941-Z9lurFE2GVQnFiLH8bxihOFtOjdgW6mH-0-37ba6c7b048cd787ed31cf97efcec72b)
使用命令netstat –a | grep tftp
检查TFTP服务器的状态。如果没有看到相关结果的话,有可能是服务器没有启动。在确保安全的情况下,使用如下命令先停止服务,然后再启动服务:sudo service tftpd-hpa stop
和sudo service tftpd-hpa start
。
1.10.7 安装NFS服务器
使用下面的命令在Ubuntu 14.04主机上安装和配置NFS服务器:
![045-03](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/045-03.jpg?sign=1738851941-PaZ8QXWMxTq7ZxPyd0rafh0WB55qQPfl-0-9ab4f79a962f274d6ba8e5e2b58be1c3)
/nfssama5d2
文件夹将被用作NFS服务器的根目录,因此根文件系统将从Yocto构建目录重定位到这个目录下:
![045-04](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/045-04.jpg?sign=1738851941-Qr7ZKuwN1bIYmKI8m5aiQbVfh2fWlIKl-0-bff2e8e0aeea47f4a26dd0239250ec8b)
接下来,配置NFS服务器,把/nfssama5d2
文件夹引出。编辑文件/etc/exports
并添加下面的代码:
![045-05](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/045-05.jpg?sign=1738851941-rJCwSkylCt7mrK60yK7U1yVFqn2qRIEa-0-38add6c3401f5acc0845573f4f416d71)
重启NFS服务器,让修改的配置生效:
![045-06](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/045-06.jpg?sign=1738851941-kJ6j3o1KawhEdY5tUXIUf1lwtWXgjFEQ-0-8f85096317c641eb376218efeacce25b)
使用另一个类似的make
命令安装内核模块文件,但是会带有一个参数来指明模块文件的安装位置。这个命令将在指定的位置创建一个目录树,例如lib/modules/<kernel version>
。这里面会存放对应内核版本的动态模块文件。最基本的位置应该是目标设备将要使用的文件系统的根目录。
![045-07](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/045-07.jpg?sign=1738851941-mZnIqUuRIOHcoKKrLRVR539lB6QJPBCx-0-d03b961a24444ef913435341f9b03a21)
1.10.8 设置U-Boot环境变量
将SAMA5D2B-XULT开发板上电,启动并配置主机上的应用minicom,查看系统启动的过程。给minicom设置如下配置:115200波特率,8位数据位,1位停止位,无校验。确保关闭硬件流控和软件流控。按任意键停止U-Boot的启动。
要执行网络引导,请在U-Boot提示符下设置如下环境变量:
![046-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/046-01.jpg?sign=1738851941-6COL3lDOss2ytSpuuOYL7Du7vcAbGmp8-0-ebaea32e868cb5449fa38104ce9e945e)
重启开发板就可以从网络启动了。