当前位置: 首页 > article >正文

[linux驱动开发--读设备树] 基于qemu9.1+linux内核6.11.0

本文档模拟vexpress-a9开发板,作为铁头娃,要学就学最新的版本
环境搭建请看我这篇博客

1. 查找设备树文件位置

  • arch/arm/boot/dts/arm/vexpress-v2p-ca9.dts
  • arch/arm/boot/dts/arm/vexpress-v2m.dtsi
  • 关于.dts.dtsi的区别,请看我这篇博客

2. 要读取的节点属性

尝试读取此节点的compatible属性,节点:

根节点
	-->bus@40000000
		-->motherboard-bus@40000000
			-->leds
				-->compatible = "gpio-leds";

3. 测试代码

内核的OF函数API文档

#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>

static int __init my_driver_init(void)
{
    struct device_node *bus_node;
    struct device_node *motherboard_node;
    struct device_node *leds_node;
    const char *compatible;

    // 查找根节点下的 bus@40000000
    bus_node = of_find_node_by_name(NULL, "bus");
    if (!bus_node) {
        pr_err("bus@40000000 node not found\n");
        return -ENODEV;
    }

    // 在 bus@40000000 下找到 motherboard-bus@40000000
    motherboard_node = of_get_child_by_name(bus_node, "motherboard-bus");
    if (!motherboard_node) {
        pr_err("motherboard-bus@40000000 node not found\n");
        of_node_put(bus_node);
        return -ENODEV;
    }

    // 在 motherboard-bus@40000000 下找到 leds 节点
    leds_node = of_get_child_by_name(motherboard_node, "leds");
    if (!leds_node) {
        pr_err("leds node not found\n");
        of_node_put(motherboard_node);
        of_node_put(bus_node);
        return -ENODEV;
    }

    // 读取 leds 节点的 compatible 属性
    if (of_property_read_string(leds_node, "compatible", &compatible) == 0) {
        pr_info("LEDs compatible property: %s\n", compatible);
    } else {
        pr_err("Failed to read compatible property from LEDs node\n");
    }

    // 释放节点引用
    of_node_put(leds_node);
    of_node_put(motherboard_node);
    of_node_put(bus_node);

    return 0;
}

static void __exit my_driver_exit(void)
{
    pr_info("Driver exit\n");
}

module_init(my_driver_init);
module_exit(my_driver_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Device Tree Property Access Example");

4. Makefile编译

记得把linux内核根目录的路径改成你电脑上的

KERNELDIR := ~/qemu_9.1/linux
CROSS_COMPILE := arm-linux-gnueabihf-
CURRENT_PATH := $(shell pwd)

obj-m := device_tree.o

build: kernel_modules

kernel_modules:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules

clean:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) clean

记得把复制路径改成你的根文件系统相应路径

make -j12
cp -rf device_tree.ko your_rootfs_path/lib/modules/6.11.0/

5. 运行效果

在这里插入图片描述


http://www.kler.cn/a/382557.html

相关文章:

  • 海外媒体发稿:国外媒体通稿PR发布-提升品牌影响力的绝佳选择
  • HTB:PermX[WriteUP]
  • 基础算法——排序算法(冒泡排序,选择排序,堆排序,插入排序,希尔排序,归并排序,快速排序,计数排序,桶排序,基数排序,Java排序)
  • 内网项目,maven本地仓库离线打包,解决Cannot access central in offline mode?
  • Neo4j数据库清理指南:如何安全地删除所有节点和索引
  • C语言心型代码解析
  • Spire.PDF for .NET【页面设置】演示:获取 PDF 文件中的页数
  • python全栈开发《60.获取两个集合的差集》
  • 摩尔线程嵌入式面试题及参考答案(2万字长文)
  • 突破1200°C高温性能极限!北京科技大学用机器学习合成24种耐火高熵合金,室温延展性极佳
  • MongoDB笔记03-MongoDB索引
  • 站长推荐使用站群服务器的原因
  • [mysql]mysql的DML数据操作语言增删改,以及新特性计算列,阿里巴巴开发手册mysql相关
  • 探索人工智能的世界:构建智能问答系统之前置篇
  • 数据结构 ——— 链式二叉树oj题:相同的树
  • Spring Boot 中的拦截器 (HandlerInterceptor) 使用方案
  • 基于Halcon的支持向量机(SVM)技术的特征分类
  • B2119 删除单词后缀
  • 全文检索ElasticSearch到底是什么?
  • 计算机网络易混淆知识点串记
  • 【JAVA基础】HashMap详细
  • Node.js NPM以及REPL(交互式解释器) 使用介绍(基础介绍 二)
  • 编写虚拟的GPIO控制器的驱动程序:和pinctrl的交互使用
  • “高效开发之路:用Spring MVC构建健壮的企业级应用”
  • springboot系列十三: 异常处理
  • Redis数据库测试和缓存穿透、雪崩、击穿