Linux设备树学习(三)uboot和Linux中的设备树移植

发布者:ZenMaster123最新更新时间:2023-09-30 来源: elecfans关键字:Linux  uboot 手机看文章 扫描二维码
随时随地手机看文章

一、uboot对fdt(flattened device tree)的支持

在xxx_defconfig中加入

#define CONFIG_OF_LIBFDT 1 /* Device Tree support */

重新编译u-boot,就可以实现对device tree的支持。


1、在uboot命令行输入: fdt

有类似显示证明支持device tree:


dt - flattened device tree utility commands


Usage:

fdt addr [-c]  []   - Set the [control] fdt location to

fdt move    - Copy the fdt to and make it active

fdt resize []            - Resize fdt to size + padding to 4k addr + some optional if needed

2、bootm 31000000 - 32000000 (uImage地址、文件系统地址、DTB设备树地址)

执行以上指令后,看到如下打印证明支持device tree:


## Flattened Device Tree blob at 01f00000

   Booting using the fdt blob at 0x1f00000

   Loading Ramdisk to 06c59000, end 081ff864 ... OK

   Loading Device Tree to 6c44000, end 6c58399 ... OK

二、Linux

1、在 arch/arm/boot/dts/目录下添加设备树文件


2、修改设备树的Makefile

vim arch/arm/boot/dts/Makefile

这样make dtbs的时候就会编译出指定的.dtb


3、使能单板型号时,select xxx

CONFIG_CLKSRC_OF/CONFIG_USE_OF/等需要的配置需加上。


4、修改单板文件

例如arch/arm/mach-s3c24xx/mach-jz2440-dt.c文件


#include

#include

#include

#include

#include

#include

#include

#include "common.h"


static void __init jz2440_dt_map_io(void)

{

    s3c24xx_init_io(NULL, 0);

}


static void __init jz2440_dt_machine_init(void)

{

    s3c_pm_init();

}


static const char *const jz2440_dt_compat[] __initconst = {

    "samsung,s3c2440",

    "samsung,jz2440",

    NULL

};


DT_MACHINE_START(S3C2440_DT, "Samsung S3C2440 (Flattened Device Tree)")

    .dt_compat    = jz2440_dt_compat,

    .map_io        = jz2440_dt_map_io,

    .init_irq    = irqchip_init,

    .init_machine    = jz2440_dt_machine_init,

MACHINE_END

5、Linux支持设备树


make menuconfig ---> 

              Boot options ---> 

                       Flattened Device Tree support

选择该选项后,内核在启动时,不会通过u-boot传入的machid来找到单板文件;而是通过上面的dt_compat数组中的信息和设备树中的compatible进行匹配,以此来找到相应单板文件。

例如


static const char *const s3c2416_dt_compat[] __initconst = {

"samsung,s3c2416",

"samsung,s3c2450",

NULL

};


DT_MACHINE_START(S3C2416_DT, "Samsung S3C2416 (Flattened Device Tree)")

.dt_compat = s3c2416_dt_compat,

.map_io = s3c2416_dt_map_io,

.init_irq = irqchip_init,

.init_machine = s3c2416_dt_machine_init,

MACHINE_END

扩展为:


static const struct machine_desc __mach_desc_S3C2416_DT __used __attribute__((__section__(".arch.info.init"))) = { 

.nr = ~0, 

.name = "Samsung S3C2416 (Flattened Device Tree)",

.dt_compat = s3c2416_dt_compat,

.map_io = s3c2416_dt_map_io,

.init_irq = irqchip_init,

.init_machine = s3c2416_dt_machine_init,

}

6、编译内核和设备树


make uImage -j4

make dtbs  /*编译设备树,生成.dtb文件*/


如果无法生成uImage,将zImage转为uImage

mkimage -A arm -O linux -T kernel -C none -a 0x31000000 -e 0x31000040 -n "jz2440" -d zImage uImage

7、在线烧写和启动

先将生成的uImage文件和s3c2440-jz2440.dtb文件放入/tftpboot目录,使用tftp服务,在uboot启动时使用tftp服务将内核和设备树从tftp服务器中加载到内存,然后bootm。具体的bootcmd参数如下:

bootcmd=tftp 31000000 uImage; tftp 32000000 s3c2440-jz2440.dtb; bootm 31000000 - 32000000


8、对于Linux中设备树常用的 OF 操作函数,介绍见以下博客

https://blog.csdn.net/qq_35031421/article/details/105107629


关键字:Linux  uboot 引用地址:Linux设备树学习(三)uboot和Linux中的设备树移植

上一篇:【bootloader】关于2440+WinCE5.0,2440init.s文件代码问题
下一篇:病症:arm启动后应用程序界面显示不正常

推荐阅读最新更新时间:2024-11-11 14:12

Linux 驱动--ADC驱动
主机系统:Ubuntu 11.04 内核版本:Linux Kernel 2.6.39 硬件平台:FL2440 开发板系统:Linux Kernel 2.6.28 下面是用CPU轮寻的方式来判断AD转换完成的 #include linux/kernel.h #include linux/module.h #include linux/fs.h #include linux/device.h /*创建设备节点*/ #include linux/clk.h #include linux/delay.h /*延时函数*/ #include asm/io.h #include asm/uac
[单片机]
<font color='red'>Linux</font> 驱动--ADC驱动
linux内核移植和网卡驱动(二)
一,内核移植步骤: 1, 修改顶层目录下的 Makefile ARCH ?= $(SUBARCH) CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE: % =%) 修改为: ARCH :=arm CROSS_COMPILE :=/usr/local/arm/4.4.3/bin/arm-linux- 2, 拷贝配置文件 这里用的是 FS2410 开发板,拷贝相应的板文件到顶层目录下 cp arch/arm/configs/s3c2410_defconfig ./ 编译配置文件,生成 .config 文件: Make s3c2410_defconfig 内核配置的目的: .config
[单片机]
ARMv8 Linux内核源码分析:__flush_dcache_all()
1.1 /* * __flush_dcache_all() * Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY(__flush_dcache_all) //保证之前的访存指令的顺序 dsb sy //读cache level id register mrs x0, clidr_el1 // read clidr //取bits (Level of Coherency for the cache hierarchy.) //需要遵循cache一致性的cac
[单片机]
ARMv8 <font color='red'>Linux</font>内核源码分析:__flush_dcache_all()
uboot 替代 eboot 烧写、启动 wince
一、wince 启动过程分析 我用的是utu2440的开发板,板子自带的启动文件包括NBOOT1、NBOOT2、EBOOT、wince内核,各个文件作用是: NBOOT1:S3C2440对于NAND FLash,最大加载4K的代码运行,可以直接运行这个程序,NBOOT1启动后会从FLASH中加载NBOOT2 NBOOT2:主要实现从FLASH中读取wince内核、加载eboot、显示启动画面 EBOOT:实现对FLASH进行分区、格式化和烧写WINCE内核镜像文件,这里要注意的是EBOOT在烧写 wince内核镜像的过程中会把NK.bin解压为NB.nb0再写入到flash中。 二、分析UBOOT启动wince的可能性
[单片机]
AT91RM9200Linux移植笔记(一)-交叉编译环境的建立
公司有块复旭AT91RM9200的板子,自带的是u-boot-0.40和2.4.19的kernel,决定把u-boot-1.1.6和2.6的内核移植上去,以此开始进入嵌入式Linux的世界。我的开发环境是Vmvare 5.5.1和Redhat 9, 参考了网上不少网友的移植文档,在此向他们表示感谢! 发现原有的arm-linux-2.95.3交叉编译工具只能编译u-boot-1.1.4一下的版本,更新的需要更新的交叉编译工具,但用arm-linux-gcc-3.4.1编译u-boot-1.1.6会出现软浮点-softfloat问题: /lib_arm/_udivsi3.S:67: relocation truncated to
[单片机]
arm-linux下交叉编译json-c-0.9库遇到的编译问题
在linux下比较成熟的json库要属json-c-0.9. 但是悲剧的是好多人编译不通过。 编译json-c arm版本 貌似可以顺利通过, 但是链接json-c动态库的时候会有提示: undefined reference to rpl_malloc 虚拟机:vmware 7.1.3 操作系统:ubuntu8.04 arm-linux-gcc版本: 4.2.2 config.h.in里定义了 #undef malloc #undef realloc 用//把这两行注释掉, 然后 autoconf ./configure --prefix=/usr/local/json-c-0.9for
[单片机]
一款基于嵌入式Linux的触摸屏自助点菜机
  引言   随着人民生活水平的提高和生活方式的转变,餐饮业的市场急剧扩大,利润飞速增长,被称为中国的黄金产业。而电子点菜系统的应用,提高了餐馆档次和营业效率、优化了业务流程,为餐饮行业带来崭新的管理理念与服务手段。目前较为流行的点菜终端主要分为2 种模式。第一种采用 单片机   单片机   单片机是单片微型计算机(Single-Chip MICrocomputer)的简称,是一种将中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)采用超大规模集成电路技术集成到一块硅片上构成的微型计算机系统。   和无线模块
[单片机]
一款基于嵌入式<font color='red'>Linux</font>的触摸屏自助点菜机
解决2.95.3 arm-linux-gcc编译错误问题
1.opt解压缩会出错,本质是里面的符号连接有误,找不到文件,但不影响使用 2.当出现make编译错误时: arm-linux-gcc: installation problem,cannot exec 'cpp0': No such file or directory时 是这个2.95.3版本的arm-linux-gcc要求装在/usr/local/arm/2.95.3/下面 而装在别的目录下面就会出这个错误,老版本的编译器得需指定目录 百最新的编译器则不需这样 3.解决方案将解压后的opt目录下的2.95.3整个目录拷贝到/usr/local/arm/2.95.3下面 并设置好.bashrc export PAT
[单片机]

推荐帖子

传说中的2019年模拟芯片十大厂商
这是我从一网站看到的2019年十大模拟芯片厂商。我除了第十名的瑞萨其它厂家的芯片都有用过。今年ADI和Maxim合并是不是能超过TI呢。目前看TI(19%)ADI+Maxim(14%=10%+4%)好像还是差点啊。ADI与Maxim的产品重合的部分较多,难道是为了消灭竞争对手吗。各位如何看呢传说中的2019年模拟芯片十大厂商已经没有maxim了收购的一点风声都没吹出来,有点突然。美信还是不错的,从此就消失了。看不懂。
bigbat 模拟电子
JFET管的应用电路疑问
如上图所示。Q3是N沟道的JFET管(型号J113),U3是LDO电源芯片,VC-BAT是电池电源输入(12-16.8V),VC_MCU是LDO输出的3.3V.现在想知道这个JFET管是怎么去工作的?听同事说是利用JFET管Q3的Vgs钳制LDO的输入。图中LDO最大输入是5.5V.对此表示疑惑,如果我JFET管Q3在没有完全夹断的情况下,源极的电压S又如何去确定呢?请大神指点,谢谢。JFET管的应用电路疑问【如上图所示。Q3是N沟道的JFET管(型号J113),U3是L
反倒是fdsf 模拟电子
GD32E231的熏香机控制板
作品简介熏香机控制板基于GD32E231做为主控,利用定时器和PWM对直流泵的运行时间和强度的控制。4相5线步进电机对香水瓶更换和安装是的升降操作。显示应用了常用的ST7567主控的12864显示屏,可以直观的显示熏香机的工作状态。熏香机工作原理介绍,1、上电步进电机位置校准。2、熏香机气泵根据设置的定时模式,循环定时开启和关闭。3、应用在不同的环境比如机场、车站的候车大厅、酒店、办公室、家等不同的室内空间的大小可以调节熏香机泵的强度。4、为了美观和方便熏香机的
小涛电子 GD32 MCU
遇到 VXworks 下 Intel 82541千兆网卡驱动的问题
在VXWORKS5.5下调试82541的网卡驱动,一开始VXWORKS加载时提示CHECKCAPBLECONNECTION!如何修改了MIILIB.C中的MIIAUTONEGSTART与MIIAUTOPHYINIT函数?就可以正常启动也可以PING通了,FTP也可以连上,但是无法通过FTP传输文件.请高手指教!遇到VXworks下Intel82541千兆网卡驱动的问题如何更改函数就能从Download阿!求教
junliyang 实时操作系统RTOS
关于codewarrior 10.3
我是新手,这个codewarrior10.3我按照例子,可是这个processorexpert不能用,请问一下是不是和破解license有关还是自己设置不对,还是要装个专家包?关于codewarrior10.3
fantianchen NXP MCU
【Follow me第二季第2期】任务汇总贴
非常荣幸能够参加电子工程世界和得捷电子举办得Followme第二季第2期活动。我以前没有接触过嵌入式系统的开发,对电子技术略有了解。本次活动让我有机会接触到一些新的领域,学习了不少新知识。实验过程中遇到不少问题,有些通过参考各位大佬的帖子解决了,有些还需要将来进一步探索。我的代码:https://download.eeworld.com.cn/detail/tangye/634556我的视频:https://training.eeworld.com.cn/vide
tangye DigiKey得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved