赞
踩
原文链接:树莓派-内核开发-说明 下载代码 编译 替换内核 - 生命不息 折腾不止
驱动代码的编写
驱动代码的编译需要一个提前编译好的内核
编译内核就必须配置
配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内
厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码
第一种方式:
cp 厂家.config .config
第二种方式:
make menuconfig 一项项配置,通常是基于厂家的config来配置
第三种方式:
完全自己来
如何配置树莓派的Linux内核
驱动两种加载方式:
1)编译进内核 zImage包含了驱动
2)把驱动编译成模块,然后使用命令把驱动加载到内核里面,就是M 模块方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko 加载
对于我们要用到的有两个仓库:
https://github.com/raspberrypi/linux 内核源码
GitHub - raspberrypi/tools 交叉编译工具链(仅在交叉编译时用到)
注:
1、树莓派里安装的系统镜像版本要和kernel代码对应。因为树莓派系统是在不断开发和升级的,如果你的树莓派使用的是某个时间的系统镜像,那么最好也使用当时的kernel代码。
2、关于内核编译方法,官网有很详细的介绍:Raspberry Pi Documentation - The Linux kernel
树莓派1的工程是bcmrpi_defconfig
树莓派2、3的工程是bcm2709_defconfig (我这里是用树莓派3)
内核配置:此命令功能是获取bcm2709_defconfig的配置到 .config里
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
指定ARM架构 指定编译器 树莓派 主要核心指令
安装必要的库:
sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
如果没什么改的就不用执行这一步
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
-j4代表四核,即四线程,看资源配置也可以改为8
zImage (内核镜像)、modules(驱动模块)、dtbs(配置文件)就是我们要生成的
这里大概要编译一段比较长的时间,如果编译一下就出错,可以看看前面步骤哪里错了,编译成功后,看到源码树目录多了vmlinux,失败则无此文件
成功后,目标zImage镜像在arch/arm/boot里面
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
在本目录生成一个kernel_new.img文件,这个文件就是要放到树莓派用的sd卡中的文件
在挂载树莓派之前可以启动树莓派 uname -r 命令查看当前内核版本,之后替换内核版本了可以看到替换后的版本
把树莓派的sd卡插入ubuntu系统电脑,树莓派的sd卡有两个分区:
一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;
一个是ext4分区,也就是系统的根目录分区。
在工作目录下创建data1和data2两个目录用于挂载U盘 mkdir data1 data2
注意:下面很多操作要加sudo需要超级用户权限
sudo mount /dev/sdb1 data1 一个fat分区,是boot相关的内容,kernel的img
sudo mount /dev/sdb2 data2 一个是ext4分区,也就是系统的根目录分区
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/jdr/data2 modules_install
安装更新 kernel.img 文件,注意镜像名字是kernel7.img
先备份
cd /home/jdr/data1
cp kernel7.img kernel7OLD.img
(直接覆盖)再把编译新生成的拷贝到data1,起名kernel7.img
cp kernel_new.img /home/jdr/data1/kernel7.img
这里可以检查下cp拷贝是否完整:md5sum 会生成每个文件的唯一编码号,就是md5的值,拷贝失败会发生变化
源码树目录下 md5sum kernel_new.img
/home/jdr/data1下 md5sum kernel7.img
(指定内核)除了直接覆盖这里还有一种方法是指定内核:
编辑fat分区 /home/jdr/data1/config.txt 文件,在最后加入一行:
kernel=kernel_new.img
拷贝配置文件: *是通配符
cp arch/arm/boot/dts/.*dtb* /home/jdr/data1
cp arch/arm/boot/dts/overlays/.*dtb* /home/jdr/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/jdr/data1/overlays/
拷贝完毕即可断开U盘了
在cmdline.txt里,下面黑色标粗的 console=serial0,115200 加上去,之前可能因为树莓派串口编程删掉了,这个是因为我们要观察操作系统是否起得来,要查看启动过程就只有串口连接,ssh看不到启动过程的
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
uname -r 查看树莓派内核,看看是否更换了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。