![嵌入式Linux设备驱动程序开发指南(原书第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/453/40381453/b_40381453.jpg)
1.11 为Broadcom BCM2837处理器构建Linux嵌入式系统
Broadcom处理器BCM2837被使用在Raspberry Pi 2上以及后来的Raspberry Pi 3上。BCM2837的底层体系结构与BCM2836相同。唯一的显著区别是用四核ARM Cortex A53(ARMv8)替换了四核ARMv7。
ARM内核运行速为1.2GHz,比Raspberry Pi 2快50%。VideoCore IV的处理速度为400MHz。可以在下面链接查看BCM2836的相关文档:https://www.raspberrypi.org/docu-mentation/hardware/raspberrypi/bcm2836/README.md。
以及在如下链接查看BCM2835的相关文档:https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/README.md。
使用Raspberry Pi 3 Model B型号做开发试验,这是一款带有无线局域网和蓝牙的单板计算机。可以在如下链接查看更多的信息:https://www.raspberrypi.org/products/raspberry-pi-3-model-b/。
1.11.1 Raspbian
Raspbian是推荐用于Raspberry Pi上的典型操作系统。Raspbian是一款免费的操作系统,它基于Debian系统开发,并针对Raspberry Pi硬件做了优化。Raspbian附带了35 000多个软件包:这些软件包以很好的格式预编译为附带软件,以便可以轻松地安装到Raspberry Pi上。Raspbian是一个社区项目,目前正在积极的开发中,其重点是尽可能提高Debian软件包的稳定性和性能。
你将在SD卡中安装基于内核4.9.y的Raspbina_lite映像。打开链接http://downloads.raspberrypi.org/raspbian_lite/images/,下载raspbian_lite-2017-09-08/
目录下的2017-09-07-raspbian-stretch-lite.zip
映像文件。
要将映像文件写入SD卡中,你需要下载和安装软件Etcher。该工具是一款开源软件,非常有用,因为它允许将压缩后的映像文件作为输入参数。更多的信息和额外的帮助见Ether的网站:https://etcher.io/。
请依照下面网站的“Writing an image to the SD card”节的步骤把映像文件写入SD卡中:https://www.raspberrypi.org/documentation/installation/installing-images/README.md。
1.11.2 构建Linux内核
有两种方法构建内核。你可以在Raspberry Pi上本地构建,但是这种方法需要很长的时间。或者使用交叉编译的方法,这样更快,但是这需要更多的设置。你将选择第二种方法。
首先安装Git和构建依赖:
![047-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/047-01.jpg?sign=1738944944-rOuDhUkKpC0dTlkryg3Ri1AT9TecdiHc-0-d7bc1276c46f9e2f2b5776f47ab41fe0)
接下来获取资源:
![047-02](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/047-02.jpg?sign=1738944944-qH02XkBcb0Qf1IqkpLCE7vGLA0QKGDKb-0-8eac11a0e76b12161c0832110ffe2c9c)
将工具链下载到主文件夹:
![047-03](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/047-03.jpg?sign=1738944944-KonK5QmVOuHA9HTA4d0W2ILmeYW01rhD-0-2690b0ff71bfa23638cf135636d12192)
编译内核、模块和设备树文件:
![047-04](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/047-04.jpg?sign=1738944944-BW8pYIU3mizz8RUc2zpTSNl2KLIbv1TB-0-378005704757534973732ba014675bd2)
做如下的内核配置,用于接下来的开发试验:
![047-05](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/047-05.jpg?sign=1738944944-W6XRbJnKdTRqNlyFm6J2YLlP6J4avpv2-0-977d9913477f75fa1e59cff188f30170)
保存设置并退出菜单。
一次性编译内核、设备树文件和模块:
![048-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/048-01.jpg?sign=1738944944-iNaDGqYQxfGE0XJXmDLGfcbZD6XzAHbf-0-d04196f9e572cc2d58fcc6ba70be8458)
构建完内核后,你需要把内核文件拷贝到Raspberry Pi上并安装模块。把uSD插入SD读卡器。
![048-02](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/048-02.jpg?sign=1738944944-jBx7CjMO1cF45stdOzvKyQmYxa3T0rlg-0-d7a51a650f4fc91496a58c1cfce669c3)
更新config.txt
文件,添加以下值:
![048-03](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/048-03.jpg?sign=1738944944-Z7oQzEKj3B3MXy2mYkWhcq32qGcolCW8-0-4d86ac64f058212b05caffc54b1f3108)
更新内核、设备树文件和模块:
![049-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/049-01.jpg?sign=1738944944-3YJVC8CDIAvm7i9uewZ91D1vY5Z7SsnN-0-3ef276a7c20807c42df3cb51afe6772c)
从读卡器中拔下uSD卡,并插入Raspberry Pi 3 Model B单板中。给单板上电。启动并配置主机上的minicom应用,观察系统启动过程。给minicom做如下配置:115200波特率,8位数据位,1位停止位,无奇偶校验。确保硬件和软件流控功能关闭。
1.11.3 将文件复制到Raspberry Pi
可以使用SSH从同一网络里的另一台计算机或者设备上远程登录到Raspberry Pi的命令行模式中。请确保正确设置并连接了Raspberry Pi:
![049-02](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/049-02.jpg?sign=1738944944-vWsBaH7V4KzyT0ZGSI9ELgejf6SndK0E-0-ee45b72757d2a6d2b12dc89e7cadf490)
Raspbian默认情况下是关闭SSH服务器的,你需要手动启动它:
![049-03](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/049-03.jpg?sign=1738944944-AwVfNQaLdco9hBJua60agJtxycJ4Vxq3-0-d2c09a2587f9217f4e327ab7f3394d74)
默认情况下root账号是禁止的,但是可以是用下面的命令来启用它,同时给它设置密码:
![049-04](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/049-04.jpg?sign=1738944944-uKr9w3nElhu1jYHcmRFmnTfSAgUoREVw-0-6250ff9f0f99c163d944759483771e65)
现在你可以使用root账号登录你的Raspberry Pi了。打开sshd_config
文件,将Permit-RootLogin改为yes(同时把原来的行注释掉)。按<Ctrl+O>键保存文件,然后按<Ctrl+x>键,输入“yes”并回车退出。
![049-05](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/049-05.jpg?sign=1738944944-a9YROQevLIFsRj4VtKigWX2shce4kH8c-0-2e04f2ed3bec6b2844471283fe261205)
创建一个简单的应用来验证工具链是否正确安装。可以使用gedit文本编辑器来编写应用文件:
![049-06](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/049-06.jpg?sign=1738944944-rPSuuJGQN7QOhDq4CJ8xBduTRmiBGj55-0-b6d18138c7aa501ca93f02cd91fd9746)
添加如下代码:
![050-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/050-01.jpg?sign=1738944944-hghBzSA1qsxoAhXD8DuRO2NguZfi9MvW-0-ee02a3bc62826c7c236d7ccd74bbd466)
将工具链添加到$PATH环境变量里:
![050-02](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/050-02.jpg?sign=1738944944-CeNoAKoVpAtQOZml8ZUejHP67sDGKjVK-0-b1d8f21c662a543bdbbd4aa99e988706)
可以直接使用C编译器编译app.c
文件。
![050-03](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/050-03.jpg?sign=1738944944-662ayAR0uxjdtBZXWRXti9gW9kQEOaoL-0-a817d193ac7ca27b047c32d710130b02)
scp是通过SSH传输文件的命令。这意味着你可以在计算机之间复制文件,例如从Raspberry Pi复制到台式机或者笔记本,反之亦然。现在你可以使用下面的命令将应用程序文件app
从你的计算机复制到IP地址为10.0.0.10的Raspberry Pi用户目录下:
![050-04](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/050-04.jpg?sign=1738944944-EDXx2df9kkF9M6iPclwYbXT7GsDy9fdx-0-19de229653fe3d43beb04d9956cc36a2)
或
![050-05](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/050-05.jpg?sign=1738944944-rimYJpn0Oan9nXDA2ZpXB1iUojmzRiEI-0-32166450d3da36f7fd1368a26dd6e1f2)
你必须先以root用户身份登录Raspberry Pi设备,才能在主机中使用scp app root@ 10.0.0.10命令:
![050-06](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/050-06.jpg?sign=1738944944-KsWrZVP29sSSC5Ht4jGkfHplV954NEYb-0-846ec61e18b2b3c9a271db028295a6c3)
如果随后修改了内核或设备树文件,你可以使用SHH将它们远程复制到Raspberry Pi:
![050-07](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/050-07.jpg?sign=1738944944-wdwz5WAW12UW8UvsNCZaV3UJmJkqKsnT-0-aec9ed69b5a071b83bce33d87d5e421d)
在Raspberry Pi板(目录)上将eth0网络接口的IP地址配置为10.0.0.10,需要编辑/etc/network/interfaces
文件。使用nano
编辑器打开这个文件:
![050-08](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/050-08.jpg?sign=1738944944-YTV4DalGNEQ5emFVLGXEM28Clyyp2HIZ-0-1942ff3fbaf042a79e624261a5206690)
添加如下的内容:
![051-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/051-01.jpg?sign=1738944944-A2LCCYLQeQtyjzOHzDlx3OLp2iNVlB55-0-04ee2717c09a80fc609027eb5fdf5c88)
按<Ctrl+O>键保存文件,然后按<Ctrl+x>,输入“yes”并按回车键退出。重启SSH服务。这样,每次启动Pi的时候,就不必再次通过ifconfig
来设置网络地址了。