解析Linux内核与设备树的编译和烧写

一、准备材料

可以根据自己的需要准备相应材料:

开发环境:VMware

操作系统:ubuntu

开发版:湃兔i2S-6UB

二、下载Linux内核文件

之前下载过UBoot文件的朋友应该知道,在每个开发版的资料里都有相应的文件,没有的可以找购买开发版的店家要。

下载完成后将文件拷贝到linux系统下进行解压,解压后会的目录如下图所示:

注意:编译时一定要在当前路径下才能编译

三、编译

1、清理项目工程

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

2、设置默认配置文件

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- i2som_imx6_defconfig

编译完成后会生成“.config”,如下图所示:

注意:湃兔的默认配置文件是“i2som_imx6_defconfig”,不同厂商的默认配置文件有所不同,可与根据相应的资料查看。如湃兔官网的说明,如下图所示

3.编译生成kernrl文件

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage

4.编译生成.dtb文件

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs

注意:到这里内核与设备树的编译就算完成了,如果细心的小伙伴就会发现,为啥我的命令会长一些。每个指令中都用“ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-”,这是设置编译器为交叉编译器。为了使编译指令简介一些,可以在Makefile文件中添加ARCH和CROSS_COMPILE的配置,以后就可以编译时就可以省掉命令中的“ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-”部分,如下图所示:

5.生成文件的路径

zImage:/arch/arm/boot/目录下

dtb:/arch/arm/boot/dts目录下

四、通过TFTp烧写zImage与.dtb文件

1.将zImage和.dtb文件放入tftp服务器中

2.进入开发版UBoot的命令行,配置TFTP服务地址

setenv serverip 192.168.1.99

saveenv 

3.下载zImage文件

tftp 80800000 zImage

4.下载.dtb文件

tftp 83000000 i2c6ulxb-i2s6ull-emmc.dtb

5.启动加载zImage和dtb文件

bootz 80800000 - 83000000

6.验证是否成功

烧写完成后,在kernel启动时会打印编译的时间,如果时间是没问题则说明成功了,启动信息如下图所示:

五、常见问题

1.编译生成zImage时可能会出现的错误如下图所示:

这个错误主要是开发环境未安装‘lzop'工具,只需安装一下从新编译即可

sudo apt-get install lzop

2.启动时卡死在“Starting kernel ...”,如下图所示:

不知道是我手里的开发有问题还是怎么回事,只要编译是不如改动其他文件一般不会有配置错误,所以遇到这种情况多重新试几次即可。

3.如图能启动系统,湃兔的开发版还可以通过替换文件进行更新,进入开发版的系统后之心一下操作

mkdir /mnt/linux/

umount /mnt/linux/

mount /dev/mmcblk1p1 /mnt/linux/

cp i2c6ulxb-i2s6ull-emmc.dtb /mnt/linux/zImage-i2c6ulxb-i2s6ull-emmc.dtb; sync

umount /mnt/linux

reboot

官方教程如下图所示:

4.启动后会发现不能正常启动,这是因为没有根文件导致的

以上就是解析Linux内核与设备树的编译和烧写的详细内容,更多关于Linux内核与设备树的编译和烧写的资料请关注我们其它相关文章!

(0)

相关推荐

  • linux编译内核的方法

    1.下载需要的内核版本 2.上传到操作系统 3.解压到/usr/src目录下 比如:3.19内核 tar -xvf linux-3.19.tar.xz -C /usr/src 4.创建连接 cd /usr/src ln -sv /usr/src/linux-3.19 Linux 5.进行内核设置 cd /usr/src/linux make menuconfig 这步,最好是拷贝一个前面运行的.config文件,在这个文件上进行修改,否则,可能重启起不来. 比如下面这样: cp /boot/co

  • Linux deepin 删除多余内核的实现方法

    前一篇写了deepin linux手动安装新内核,本篇记录如何删除不用的内核 使用命令 dpkg --get-selections| grep linux 列出当前安装的内核 比如要卸载Linux5.1.9 则执行: sudo apt remove --purge linux-headers-5.1.9-050109 除了linux-header,还包括linux-modules和linux-image-unsigned,一并卸载 因为卸载linux-modules会自动同时卸载linux-im

  • Linux内核参数调整方法

    ulimit设置 ulimit -n 要调整为100000甚至更大. 命令行下执行 ulimit -n 100000即可修改.如果不能修改,需要设置 /etc/security/limits.conf,加入 * soft nofile 262140 * hard nofile 262140 root soft nofile 262140 root hard nofile 262140 * soft core unlimited * hard core unlimited root soft co

  • deepin linux 手动升级内核的方法

    deepin和Ubuntu都是基于debian的发行版,这里使用Ubuntu构建的内核. 下载地址: https://kernel.ubuntu.com/~kernel-ppa/mainline/ 选择最近的stable版本,比如目前(2019.12.15)最新的稳定版是5.4.3 下载amd64的这4个deb包: 下载完成后安装: 安装后重启即可 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • Linux内核设备驱动之字符设备驱动笔记整理

    /******************** * 字符设备驱动 ********************/ (1)字符设备驱动介绍 字符设备是指那些按字节流访问的设备,针对字符设备的驱动称为字符设备驱动. 此类驱动适合于大多数简单的硬件设备.比如并口打印机,我们通过在/dev下建立一个设备文件(如/dev/printer)来访问它. 用户应用程序用标准的open函数打开dev/printer,然后用write向文件中写入数据,用read从里面读数据. 调用流程: write(): 用户空间 -->

  • Linux内核宏container_of的深度剖析

    1.前面说的 我在好几年前读linux 驱动代码的时候看到这个宏,百度了好久,知道怎么用了,但是对实现过程和原理还是一知半解. container_of宏 在linux内核代码里面使用次数非常非常多,对于喜欢linux编程的同学来说,了解其实现方法,对以后看内核代码,写内核驱动的帮助都非常大,当然,我不是说了解这个就可以为所欲为了,内核博大精深,先宏观再微观去学习,不积跬步何以致千里,不要想着一口就能吃成一个胖子,我这篇文章主要剖析一下这个函数的实现原理,希望对大家学习过程中有所帮助. andr

  • 移植新内核到Linux系统上的操作步骤

    1.在ubuntu官网下载ubuntu16.04的镜像和对应ubuntu16.04的内核版本源代码,或者在镜像源上找 2.安装ubuntu16.04到PC主机上 接下来执行以下: 编译新的Linux内核给X86内核使用出现以下错误: scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: No such file or directory 解决方法: (1)下载openssl-1.0.1d.tar.gz tar xzf openss

  • 详解Linux内核内存管理架构

    内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射.页面分配.页面回收.页面交换.冷热页面.紧急页面.页面碎片管理.页面缓存.页面统计等,而且对性能也有很高的要求.本文从内存管理硬件架构.地址空间划分和内存管理软件架构三个方面入手,尝试对内存管理的软硬件架构做一些宏观上的分析总结. 内存管理硬件架构 因为内存管理是内核最为核心的一个功能,针对内存管理性能优化,除了软件优化,硬件架构也做了很多的优化设计.下图是一个目前主流处理器上的存储器层次结构设计方案.

  • 解析Linux内核与设备树的编译和烧写

    一.准备材料 可以根据自己的需要准备相应材料: 开发环境:VMware 操作系统:ubuntu 开发版:湃兔i2S-6UB 二.下载Linux内核文件 之前下载过UBoot文件的朋友应该知道,在每个开发版的资料里都有相应的文件,没有的可以找购买开发版的店家要. 下载完成后将文件拷贝到linux系统下进行解压,解压后会的目录如下图所示: 注意:编译时一定要在当前路径下才能编译 三.编译 1.清理项目工程 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf

  • 解析Linux内核的基本的模块管理与时间管理操作

    内核模块管理 Linux设备驱动会以内核模块的形式出现,因此学会编写Linux内核模块编程是学习linux设备驱动的先决条件. Linux内核的整体结构非常庞大,其包含的组件非常多.我们把需要的功能都编译到linux内核,以模块方式扩展内核功能. 先来看下最简单的内核模块 #include <linux/init.h> #include <linux/module.h> static int __init hello_init(void) { printk(KERN_ALERT &

  • Python提取Linux内核源代码的目录结构实现方法

    今天用Python提取了Linux内核源代码的目录树结构,没有怎么写过脚本程序,我居然折腾了2个小时,先是如何枚举出给定目录下的所有文件和文件夹,os.walk可以实现列举,但是os.walk是只给出目录名和文件名,而没有绝对路径.使用os.path.listdir可以达到这个目的,然后是创建目录,由于当目录存在是会提示创建失败的错误,所以我先想删除所有目录,然后再创建,但是发现还是有问题,最好还是使用判断如果不存在才创建目录,存在时就不创建,贴下代码: # @This script can b

  • Linux内核设备驱动之内核中链表的使用笔记整理

    /******************** * 内核中链表的应用 ********************/ (1)介绍 在Linux内核中使用了大量的链表结构来组织数据,包括设备列表以及各种功能模块中的数据组织.这些链表大多采用在include/linux/list.h实现的一个相当精彩的链表数据结构. 链表数据结构的定义很简单: struct list_head { struct list_head *next, *prev; }; list_head结构包含两个指向list_head结构的

  • Centos下编译Linux内核的具体实现方法

    Linux内核编译是一件简单却费事的事.但是独立的编译linux内核会帮助你很好的理解Linux内核的工作机理. 首先编译linux内核我们需要在当前linux操作系统下安装gcc编译器,因为我是Centos distribution版本 yum install gcc 接下来安装依赖环境: yum install ncurses-devel 现在我们以linux-3.18.1内核为例进行编译,假设我当前系统的版本为2.6.32 那么我首先在Linux内核发布的官网上http:/kernel.o

  • Linux内核设备驱动之内核的时间管理笔记整理

    /****************** * linux内核的时间管理 ******************/ (1)内核中的时间概念 时间管理在linux内核中占有非常重要的作用. 相对于事件驱动而言,内核中有大量函数是基于时间驱动的. 有些函数是周期执行的,比如每10毫秒刷新一次屏幕: 有些函数是推后一定时间执行的,比如内核在500毫秒后执行某项任务. 要区分: *绝对时间和相对时间 *周期性产生的事件和推迟执行的事件 周期性事件是由系统系统定时器驱动的 (2)HZ值 内核必须在硬件定时器的帮

  • Linux内核设备驱动之高级字符设备驱动笔记整理

    /****************** * 高级字符设备驱动 ******************/ (1)ioctl 除了读取和写入设备外,大部分驱动程序还需要另外一种能力,即通过设备驱动程序执行各种类型的硬件控制.比如弹出介质,改变波特率等等.这些操作通过ioctl方法支持,该方法实现了同名的系统调用. 在用户空间,ioctl系统调用的原型是: int ioctl(int fd, unsigned long cmd, ...); fd: 打开的设备文件描述符 cmd: 命令 第三个参数:根据

  • 解析Linux下C++编译和链接

    编译原理 将如下最简单的C++程序(main.cpp)编译成可执行目标程序,实际上可以分为四个步骤:预处理.编译.汇编.链接,可以通过 g++ main.cpp –v看到详细的过程,不过现在编译器已经把预处理和编译过程合并. 预处理:g++ -E main.cpp -o main.ii,-E表示只进行预处理.预处理主要是处理各种宏展开:添加行号和文件标识符,为编译器产生调试信息提供便利:删除注释:保留编译器用到的编译器指令等. 编译:g++ -S main.ii –o main.s,-S表示只编

  • Linux内核设备驱动之Linux内核基础笔记整理

    1. Linux内核驱动模块机制 静态加载, 把驱动模块编进内核, 在内核启动时加载 动态加载, 把驱动模块编为ko, 在内核启动后,需要用时加载 2. 编写内核驱动 #include <linux/module.h> #include <linux/init.h> static int __init test_init(void) { return 0; //返回0表示成功, 返加负数退出加载模块 } //__init 当内核把驱动初始化完后, 释放此函数的代码指令空间 stat

  • Linux内核中红黑树算法的实现详解

    一.简介 平衡二叉树(BalancedBinary Tree或Height-Balanced Tree) 又称AVL树.它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1.若将二叉树上结点的平衡因子BF(BalanceFactor)定义为该结点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有结点的平衡因子只可能是-1.0和1.(此段定义来自严蔚敏的<数据结构(C语言版)>) 红黑树 R-B Tree,全称是Red-B

随机推荐