Linux 设备树学习——基于i2c总线分析

博客说明

撰写日期 2019.11.18
完稿日期 2019.11.20
最近维护 暂无
本文作者 multimicro
联系方式 multimicro@qq.com
资料链接 本文无附件资料
GitHub https://github.com/wifialan/drivers/tree/master/device_tree_i2c
原文链接 https://blog.csdn.net/multimicro/article/details/103129546

开发环境

环境说明 详细信息 备注信息
操作系统 Ubunut 18.04
开发板 JZ2440-V3
u-boot uboot-2012.04.01
busybox busybox-1.22.1
u-boot和busybox编译器 arm-linux-gcc (4.4.3)
Linux内核 linux-4.19-rc3
Linux内核编译器 arm-linux-gnueabi-gcc (4.9.4)

1. 如何使用设备树

设备树,顾名思义,是描述物理设备的文件,里面的节点包含特定设备下的硬件信息。使用设备树,需要做两方面工作:其一,开启u-boot支持设备树的功能;其二:使用支持设备树的内核版本。

1.1 u-boot支持设备树

  • 在u-boot工程中,增添一行命令在板级配置文件中:
    #define CONFIG_OF_LIBFDT
    我用的是S3C2440,所以应该在include/configs/smdk2440.h中增添上述命令行,然后重新编译即可得到支持设备树的u-boot。

  • 在u-boot启动过程中,在把控制权交给内核前,会对内存进行分区,那么因此,也需要让u-boot启动时,为设备树分配一定的内存空间,具体操作是:
    继续修改include/configs/smdk2440.h文件,在里面这个位置增加图示代码:

在这里插入图片描述
重新编译,烧录,在u-boot命令行中输入mtdparts即可查看分区情况

在这里插入图片描述
这就在之前的u-boot基础上得到了一个支持设备树的u-boot,可以在对应的内存空间中烧写相应的文件。

1.2 Linux内核支持设备树

我使用的是韦东山提供的Linux内核以及补丁包,采用Linux-4.19.3-rc内核版本。

打补丁:
patch -p1<../linux-4.19-rc3_device_tree_for_jz2440.patch
编内核:
cp config_ok .config
make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.9.4/bin/arm-linux-gnueabi- menuconfig
make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.9.4/bin/arm-linux-gnueabi- uImage -j8
make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.9.4/bin/arm-linux-gnueabi- dtbs -j8

执行完后,会在arch/arm/boot/文件夹下得到uImage,在arch/arm/boot/dts/文件夹下得到*.dtb

1.3 如何在开发板中使用设备树

为了减少学习时对开发板的FLASH擦写,这里一直使用tftp服务将内核和设备树文件的直接传递给内存中运行,而u-boot和文件系统busybox则固化在FLASH中,从Linux-3.4.2过渡过来的busybox可以直接使用,但需要提醒一下,之前的busybox是在第三分区,而增加设备树分区后的busybox被挪到了第四分区:
在这里插入图片描述
因此,在bootargs命令中,应该修改root挂载到/dev/mtdblock4分区下

set bootargs console=ttySAC0,115200 root=/dev/mtdblock4 rw init=/linuxrc

现在开始通过tftp服务加载内核和设备树,tftp服务器搭建参考:在Linux系统下通过TFTP或NFS烧写内核
u-boot命令行中输入:

tftp 31000000 uImage; tftp 32000000 jz2440_irq.dtb; bootm 31000000 - 32000000

bootm 命令介绍,若ramdisk没有,则用"-"号替代
bootm + uImage地址 + ramdisk地址 + 设备树镜像地址

在这里插入图片描述
可以看到,设备树已经成功被uImage加载。

2. 设备树介绍

  • Linux uses DT data for three major purposes:
    1) platform identification,
    2) runtime configuration, and
    3) device population.

  • 我用设备树主要是方便其加载硬件设备信息,不需要在内核中增加比如spi_register_board_info这样的设备注册函数,通过重新编译内核来实现device的注册。现在在利用设备树时,若增加某个设备,那么只需要修改设备树中的相关信息,那么重新编译设备树让内核重新加载,即可便捷的注册某device。非设备树注册device可参考spi_device的注册过程: 2.2 spi_device注册

  • 在根文件系统中查看设备树(有助于调试)
    a. /sys/firmware/fdt // 原始dtb文件
    hexdump -C /sys/firmware/fdt//查看dtb文件内容
    b. /sys/firmware/devicetree // 以目录结构程现的dtb文件, 根节点对应base目录, 每一个节点对应一个目录, 每一个属性对应一个文件
    c. /sys/devices/platform // 系统中所有的platform_device, 有来自设备树的, 也有来有.c文件中注册的
     对于来自设备树的platform_device, 可以进入 /sys/devices/platform/<设备名>/of_node 查看它的设备树属性
    d. /proc/device-tree是链接文件, 指向 /sys/firmware/devicetree/base

2.1 设备树中的设备驱动节点

  • sys/devices/platform/
    sys/devices/platform/文件夹下面可以看到通过设备树注册进来的根设备(子设备都在根设备文件夹内的of_node文件夹下):

在这里插入图片描述
进入其中一个文件夹,如54000000.i2c可以看到一个文件夹of_node,里面包含了i2c节点下的子节点设备信息:

在这里插入图片描述
红框中of_node被链接到了/sys/firmware/devicetree/base/i2c@54000000/文件夹下(由此也验证,设备树中的所有信息都在/sys/firmware/devicetree/base文件夹里面),那么该文件夹中信息有那些呢?

  • sys/firmware/devicetree/base

tree命令: 将tree源码交叉编译后的文件放到busybox下的/bin/文件夹下方可使用

在这里插入图片描述
设备树中,i2c节点下的设备子节点信息如下:

在这里插入图片描述
通过上述两张图,可以看出eeprom设备节点被成功加载到了内核中去,其依附于i2c设备。现在想想,树状关系是不是有点雏形了,一个根设备(i2c)下面伸出了一个枝干(eeprom)。

  • sys/bus/i2c/

设备树注册进来的总线设备,可以在sys/bus/文件夹下找到,比如i2c、spi总线等

sys/bus/i2c/目录下面可以看到i2c总线下面的devicedriver信息

在这里插入图片描述
若内核中注册了相应的i2c drivers,那么通过名字匹配成功后(具体的匹配方式下面会写),会调用相应的probe函数将driver和device连在一起

在这里插入图片描述

2.2 设备树匹配流程

通过设备树注册进来的device,是如何匹配到对应的driver呢,本节仍然以i2c总线的匹配为例进行介绍。

spi总线platform总线也是类似的,本节结尾我会贴出这两个总线的匹配程序供参考,会发现,这玩意儿,就是一通百通。

2.2.1 以i2c匹配为例

i2c中的匹配函数在如下文件内

drivers/i2c/i2c-core-base.c : line 101</

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值