配置树莓派linux的内核和编译并将镜像拷贝至树莓派

驱动代码的编写需要一个提前编译好的内核,编译内核就必须配置,配置的最终目标会生成.config文件,该文件指导makefile去把有用的东西组织成内核。
如何生成.config文件:
第一种方式:
厂家配linux内核源码,比如说买了树莓派,现在要研发树莓派的底层,厂家会提供树莓派linux内核源码,直接cp    厂家.config    .config
第二种方式:
make menuconfig 一项项配置,通常是基于厂家的config来配置的。
第三种方式:
完全自己来
如何配置树莓派linux的内核:
1、配置config
linux源码中有很多工程:
树莓派1的工程是bcmrpi_defconfig;
树莓派2、3的工程是bcm2709_defconfig。

1.1、获取当前树莓派的config

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
//ARCH是指定是arm架构
//CROSS_COMPILE指定编译器是arm-linux-gnueabihf-(不同架构用不同的编译器)
//KERNEL是树莓派里特别指定的
//用的config是bcm2709_defconfig

运行结果如下图:

feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$  ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfigHOSTCC  scripts/basic/fixdepHOSTCC  scripts/kconfig/conf.oSHIPPED scripts/kconfig/zconf.tab.cSHIPPED scripts/kconfig/zconf.lex.cHOSTCC  scripts/kconfig/zconf.tab.oHOSTLD  scripts/kconfig/conf
#
# configuration written to .config//将厂家的config变成了.config
#

此命令功能是获取bcm2709_defconfig的配置到 .config里。
我们可以直接用工程里的配置,但这样的话可能会丢失原来使用的树莓派的配置,这里提供一个方法可以获取当前正在使用的树莓派的config。
出现上图内核配置已完成!下一步内核的编译。
编译:
安装必要的库:

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

1、执行menuconfig

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig

在这里插入图片描述

如果没什么改的就不用执行这一步。

2、编译

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs 
//-j4指定用多少电脑资源来编译,4是4进程。
//zImage是生成内核镜像
//modules要生成驱动模块
//dtbs是生成配置文件

以n进程编译。不指明几进程的话则默认以单进程编译,编译成功后,看到源码树多了vmlinux(没有压缩的linux),失败则无此文件,成功后目标文件zImage镜像在arch/arm/boot底下。

3、打包zImage文件成树莓派可用的xxx.img
直接用linux源码包里的工具:

./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
//scripts是一个脚本文件夹,其中的mkknlimg会将zImage打包成kernel_new.img

在本目录生成一个kernel_new.img文件,这个文件就是要放到sd卡中的文件。
注:网上很多地方说的用 tools/mkimage/imagetool-uncompressd.py 的方法不行!!

镜像的拷贝:

一、挂载树莓派sd卡,并安装编译出的DIRECTLY 到sd卡
把树莓派的sd卡插入ubuntu系统电脑,树莓派的sd卡有两个分区:
一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;
一个是ext4分区,也就是系统的根目录分区。

我们生成的文件涉及到这两个分区的内容,一般插入ubuntu后会自动挂载,fat分区可以不用root权限操作,ext4分区需要root权限操作。

两个分区具体挂载在什么地方可以自己决定,以下用[fat]表示boot挂载的路径,[ext4]表示ext4挂载的路径。

二、挂载
插入sd卡输入dmesg去查看内核的信息,如有设备接入,内核会打印一些驱动方面的信息,如图:会看到两个分区,sdb1和sdb2
在这里插入图片描述

数据拷贝:

mkdir data1
mkdir data2
//创建两个文件夹,对应stb1和stb2

挂载U盘:

sudo mount /dev/sdb1 data1  一个是fat分区,是boot相关的内容,kernel的img
sudo mount /dev/sdb2 data2  一个是ext4分区,也就是系统的根目录分区
//将dev下的sdb1和sdb2分别挂载到data1和data2

如图,可以看到sd卡中的文件以挂载到data1和data2:
在这里插入图片描述

三、开始拷贝
1、安装modules(也是编译生成的,主要是设备驱动文件,比如:hdmi,usb,wifi…)

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install
//其中的[ext4]是根据自己挂载的文件名称填写,是存放根目录的文件夹路径。
演示:
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/feng/data2 modules_install

安装后如图:
在这里插入图片描述
2、可以考虑先备份(防止拷贝失败,树莓派不能开机)如图:
在这里插入图片描述

然后更新 kernel.img 文件,再将新生成的镜像文件拷贝到data1,其名为kernel7.img,将原来的(kernel7.img)覆盖掉,前面已经用 mkknlimg 工具打包了kernel_new.img文件了,把它复制到boot分区并配置使用即可:

cp kernel_new.img [fat]/

3、复制其他相关文件(这些是配置文件,为了能够加载驱动等)

cp arch/arm/boot/dts/.*dtb* [fat]/
cp arch/arm/boot/dts/overlays/.*dtb* [fat]/overlays/
cp arch/arm/boot/dts/overlays/README [fat]/overlays/
//*dtb*中的*是通配符就是以.开头以dtb在中间这种形式的文件,.和dtb之间的东西不管,dtb后有什么字符也不管。

在这里插入图片描述

更新完成后插回树莓派即可开机,可以通过串口开机(可以看操作系统是否起来了),开机后可以用 uname -a 命令查看kernel信息已经改变。

驱动加载的两种方式:

  • *  编译内核     zImage包含了驱动
  • M  模块方式生成驱动文件xxx.ko    系统启动后,通过命令inmosd  xxx.ko加载

指令补充:

dmesg
//查看硬件底层的一些连接数据
feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ du kernel_new.img
4828	kernel_new.img
feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ du kernel_new.img -h
4.8M	kernel_new.img
feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ md5sum kernel_new.img
6350420d173bddfe02f4d8f81791e91f  kernel_new.img
feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ md5sum /home/feng/data1/kernel7.img 
6350420d173bddfe02f4d8f81791e91f  /home/feng/data1/kernel7.img
feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ 
//du指令查看文件的大小,-h是以兆为单位显示
//每个文件都有它唯一的的编码号就是md5sum的值,在拷贝时若发生损坏则md5sum的值会发生改变,可以用其验证是否烤坏。

参考博文:https://blog.csdn.net/nicekwell/article/details/78482833

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

h5 与原生 app 交互的原理

作者:senntyousegmentfault.com/a/1190000016759517现在移动端 web 应用,很多时候都需要与原生 app 进行交互、沟通(运行在 webview中),比如微信的 jssdk,通过 window.wx 对象调用一些原生 app 的功能。所以…

【ROS问题】rqt_plot运行报错

本人Linux版本:Ubuntu 18.04 LTS ROS版本:Melodic 方案一: 你看那个报错,全是Matplotlib的报错,是这个东西版本不够高,重新安装就好啦。 python -m pip install -U pip python -m pip install -U matp…

BCP使用笔记整理

一、BCP 简介大容量复制程序实用工具 (bcp) 可以在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容量复制数据。 使用 bcp 实用工具可以将大量新行导入 SQL Server 表,或将表数据导出到数据文件。 除非与 queryout 选项一起使用,否则使用该实…

怎样基于谷歌地图的Server缓存公布Image Service服务

怎样基于谷歌地图的Server缓存公布Image Service服务第一步:下载地图数据下载安装水经注万能地图下载器,启动时仅仅选择电子.谷歌(这里能够依据自己的须要选择)。例如以下图所看到的。找到成都后框选下载成都区域,例如…

整理的一些比较基础的面试知识点

1、面向对象的三大特性或其具体体现在哪 2、页面间传值方式 3、session cookie原理及区别 4、hasstable,dictionary,List ,collection 5、类和抽象类,类和接口,接口和抽象类区别及适合场景 6、Get和Post比较优缺点或区…

五种类型的程序员,你属于哪一种?

在我的编程生涯中,我碰到过很多奇奇怪怪的对手和同盟。我把这些编码战士们分成五类,有些人是你队伍中的好伙伴,有些人则是捣蛋者,让你的每一个计划都完不成。不管怎么说,他们在软件开发的诸神殿上都占有一席之地。如果你的团队中没…

一些有用的js插件

getfuelux.com 一系列插件合集 Ion.RangeSlider 超级牛的范围选择控件 Ion.CheckRadio Ion.Tabs Ion.Calendar Ion.ImageSlider Ion.Zoom www.ngwidgets.com Advanced UI Widgets for AngularJS http://www.jq22.com/ jQuery 插件库 http://jvectormap.com/ 地图插件 X-…

C# FTP操作类库

class FTP_Class{string ftpServerIP;string ftpUserID;string ftpPassword;FtpWebRequest reqFTP; #region 连接/// <summary>/// 连接FtpWebRequest/// </summary>/// <param name"path"></param>private void Connect(String path)/…

安装并配置ROS环境

参考该网址内容&#xff1a;http://wiki.ros.org/cn/ROS/Tutorials/InstallingandConfiguringROSEnvironment

Cropper – 简单的 jQuery 图片裁剪插件

Cropper 是一个简单的 jQuery 图像裁剪插件。它支持选项&#xff0c;方法&#xff0c;事件&#xff0c;触摸&#xff08;移动&#xff09;&#xff0c;缩放&#xff0c;旋转。输出的裁剪数据基于原始图像大小&#xff0c;这样你就可以用它们来直接裁剪图像。 如果你尝试裁剪跨域…

C# JSON格式数据用法

JSON简介JSON(全称为JavaScript ObjectNotation) 是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。JSON采用完全独立于语言的文本格式&#xff0c;可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单&#xff0c;易于人阅读和编写&#xff0c;同…

Ros命令及功能

运行小乌龟代码&#xff1a; roscore rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key一些命令及作用 ros 加tap //查看电脑中以ros开头的命令 rqt_graph //将系统内的主要资源以可视化的形式展现出来 rosnode list //列出系统节点 命令 --help //查看命…

数据库——环境初建改端口和密码(转)

一、修改APACHE的监听端口 2、在界面中选apache&#xff0c;弹出隐藏菜单选项&#xff0c;打开配置文件httpd.conf; 2、找到Listen 80 和 ServerName localhost:80; 3、将80改成801&#xff08;当然自己也可以设定别的不使用的端口&#xff0c;例如8000等&#xff09;; 4、保存…

文件系统认知

什么是文件系统 常规认知是&#xff1a;linux根目录那些东西 百科&#xff1a;文件系统是操作系统用于明确存储设备组织文件的方法&#xff0c;操作系统中负责管理和存储文件信息的软件机构称为文件管理系统&#xff0c;简称文件系统。 以上说的方法&#xff1a;就是文件管理…

寒哥细谈之AutoLayout全解

看到群中好多朋友还停留在Frame布局的痛苦时代&#xff0c;以及有些开发者接手别人的就项目发现布局一团乱。而且没有启动图的时候并不是真正真正适配iPhone 6(S)、iPhone6(S) Plus等设备 。寒哥准备尽可能详细的讲一讲我所掌握的AutoLayout 。AutoLayout很难&#xff1f;我觉得…

最难学的5种编程语言排行

每个程序员都熟悉许多编程语言。许多编程语言都是高级的&#xff0c;它们的语法是人类可读的。然而&#xff0c;也有一些低级语言&#xff0c;对于一个人来说&#xff0c;读起来很困难&#xff0c;但是可以理解。然而&#xff0c;您是否遇到过一种既不可读又不可理解的编程语言…

[小北De编程手记] : Lesson 02 - Selenium For C# 之 核心对象

从这一篇开始&#xff0c;开始正式的介绍Selenium 以及相关的组件&#xff0c;本文的将讨论如下问题&#xff1a; Selenium基本的概念以及在企业化测试框架中的位置Selenium核心对象&#xff08;浏览器驱动&#xff09; Web DriverSelenium核心对象&#xff08;Dom元素&#xf…

Java中HashMap的entrySet()你会用了吗

Map中存放的元素均为键值对&#xff0c;故每一个键值对必然存在一个映射关系。 Map中采用Entry内部类来表示一个映射项&#xff0c;映射项包含Key和Value Map.Entry里面包含getKey()和getValue()方法 Set<Entry<T,V>> entrySet() 该方法返回值就是这个map中各个键…

JS获取请求URL相关参数

今天在找获取当前网址除去参数的js方式&#xff0c;结果自己会的竟然只有window.location.href 先看一个示例 用javascript获取url网址信息 <script type"text/javascript"> document.write("location.host"location.host"<br>"); d…

wiki语法大全

Wiki语法大全 编辑一个维客页面十分容易。只要点击页面上方的“编辑本页”或右侧的[编辑]链接即可修改该页&#xff0c;或点击“讨论本页”然后再点击“编辑页面”来讨论该页面。点击后您就会看到一个包含那个Wiki页面的可编辑的文字区域。 先将文字复制到您最喜欢的文字编辑器…