树莓派4B内核编译

树莓派4B驱动开发第一步编译内核

  • 安装系统镜像
  • 编译环境
  • 交叉编译器
  • 编译内核(kernel)
    • 交叉编译器
    • 获取Raspberry Kernel源码
    • 安装编译环境所需的依赖
    • 内核(kernel)编译开始
    • 安装kernel modules
  • 将编译好的内核拷贝到树莓派SD卡上,
    • 先在虚拟机~目录下创建2个空文件,
    • 复制boot所需文件
    • 编写config.txt
    • 安装内核模块
    • 卸载sd卡
  • 最后将sd卡插入树莓派即可
  • 树莓派固定IP地址
    • 网线

以下是我的安装方法

安装系统镜像

首先是安装系统镜像,官方提供的,按照购买树莓派4B时给的资料安装系统,
树莓派4B内核编译_第1张图片
安装完后,再添加以下2个文件至boot文件夹
在这里插入图片描述
将sd卡插入树莓派,连接网线,上电,设置wifi为共享(以太网),然后配置以太网ipv4
树莓派4B内核编译_第2张图片
最后打开打开Mobaxterm软件(免费!!!强烈推荐),使用ssh连接,IP地址
(打开终端,输入arp -a指令,然后在192.168.137.1下面的ip地址一个一个试)
树莓派4B内核编译_第3张图片
即可连接上。说明树莓派系统没问题,设备也没问题。

编译环境

安装虚拟机,具体方法去bilibilbi上看

交叉编译器

定义:交叉编译器(英语:Cross compiler)是指一个在某个系统平台下可以产生另一个系统平台的可执行文件的编译器

编译内核(kernel)

交叉编译器

首先是获取交叉编译器链接: link
下载上面链接中的 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz,有可能更新了,日期和版本会变化,

然后在虚拟机创建一个工作目录,后续的操作都在工作目录中操作

mkdir ~/build && cd ~/build
#把下载好的gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz拷贝到虚拟机,然后解压到/usr/src/
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /usr/src/
cd /usr/src/ && sudo mv gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu aarch64-linux-gnu
sudo vi /etc/profile
or
sudo vi ~/.bashrc
# 末尾添加以下内容
export ARCH_HOME=/usr/src/aarch64-linux-gnu
export PATH=$PATH:$ARCH_HOME/bin
source /etc/profile
or
source ~/.bashrc

获取Raspberry Kernel源码

我下的5.15y 版本无所谓,看自己,
链接: link:https://github.com/raspberrypi/linux
下载后拷贝到虚拟机创建的build目录下
树莓派4B内核编译_第4张图片
命令方式

cd ~/build
sudo apt-get install git
# 官方的github地址
git clone --depth=1 --branch rpi-5.15.y https://github.com/raspberrypi/linux

安装编译环境所需的依赖

 sudo apt-get install git bison flex libssl-dev zip libncurses-dev make

libncurses-dev依赖是支持后面menuconfig的

内核(kernel)编译开始

#进入创建的build文件夹
cd ~/build
# 如果源码文件不叫linux,可以mv 改成linux或者你想要的的名字 
# 比如linux-rpi-5.10.y 执行 sudo mv linux-rpi-5.10.y linux
cd linux
# 在编译之前可以先进行清除命令,以保证清洁的环境,如果在编译的环节出错或者操作失误,可以运行此命令重新开始。
make distclean
# 编译.config,ARCH要配置成arm64,如果不配置则默认为开发机的x86了,CROSS_COMPILE指定编译器
# bcm2711_defconfig在 arch/arm64/configs/bcm2711_defconfig,它会自己根据Makefile自己去找这个文件
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
# 在当前的.config基础上开始裁剪内核,如果没有要裁剪的按ESC两次退出即可,主要是我也没太了解,等我了解了再记
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
# 开始编译内核, 参数-j5的意思是 使用多处理器同时编译内核,数字最大为:cpu的核数 × 1.5,可自行修改
make -j5 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

中间不报错的话,大概会在1个小时左右,会在目录 arch/arm64/boot 中生成 Image 二进制内核文件;如果制作的是32为内核,会在 arch/arm/boot 生成zImage 二进制内核;同时会在linux目录中生成最原始的内核文件vmlimux。

vmlinunx:最原始的linux内核文件。

zImage: 经过压缩和去掉调试信息的可加载二进制内核文件。

Image:没有经过压缩的可加载二进制内核文件。

有关更多关于内核文件可Google

安装kernel modules

这个modules在后面使用i2c等会使用到(内核编译的模块,未被加载到内核里面那部分),先安装到 ~/build 工作目录中,记得把 [user] 替换为自己的用户名

cd ~/build/linux
# 切换到root用户下
su
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/home/[user]/bulid/ modules_install
su [user]

将编译好的内核拷贝到树莓派SD卡上,

先在虚拟机~目录下创建2个空文件,

cd ~
mkdir data1
mkdir data2

再将sd卡插入电脑,然后挂载,

sudo mount /dev/sdb1 ~/data1
sudo mount /dev/sdb2 ~/data2

复制boot所需文件

$ sudo cp linux/arch/arm64/boot/dts/broadcom/*.dtb ~/data1
$ sudo cp linux/arch/arm64/boot/dts/overlays/*.dtb* ~/data1/overlays/
$ sudo cp linux/arch/arm64/boot/dts/overlays/README ~/data1/overlays/
# 复制内核
$ sudo cp linux/arch/arm64/boot/Image ~/data1/kernel8.img

编写config.txt

# 添加内容并保存退出
$ sudo vim /mnt/loopXp1/config.txt

# 以64位读取内核
arm_64bit=1
# 想要以ARMV8的模式启动,设置此选项
arm_control=0x200
# 内核的名字
kernel=kernel8.img

# u-boot进行引导kernel时延迟几秒
boot_delay=1

# 关闭蓝牙功能
# See /boot/overlays/README for all available options
dtoverlay=disable-bt
# 开启音频snd_bcm2835
dtparam=audio=on

安装内核模块

因为在编译kernel时已经把modules安装到了工作目录build中了,直接复制到第二分区中就可以了,如果不放心,可以用安装modules的命令安装到第二分区下,更改下路径就可以了。

cd ~/build
sudo cp -r lib/modules/ ~/data2/lib/

卸载sd卡

cd ~/build
sudo umount ~/data1
sudo umount ~/data2

最后将sd卡插入树莓派即可

注意:在使用modprobe失败的时候,先使用sudo depmod,再使用modprobe

树莓派固定IP地址

网线

1、首先在网线连接下查看自己局域网的IP网段
输入ifconfig
在这里插入图片描述
2、修改网络配置文件/dhcpcd.conf
sudo vi /etc/dhcpcd.conf
找到#interface eth0,将其下方的注释取消,然后换成自己的ip网段。
树莓派4B内核编译_第5张图片
3、重启树莓派,使用固定的ip地址进行远程连接

你可能感兴趣的:(linux,驱动开发)