在NanoPi-NEO上试验dts和平台总线机制

   学习了linux的dts和platform总线机制,自己画图概括了一下dts文件,设备,总线和驱动之间的相互关系.



   为了证实一下,在NanoPi-NEO上进行了如下试验, NanoPi-NEO上已经预装了Ubuntu-Core Linux_4.11 固件:

1. 将friendlyarm官方源码linux_4.11.2_20170531.tar.gz 解压到NanoPi-NEO的 /works 目录下,并按照说明完成编译。

2. 在 /works/linux/arch/arm/boot/dts 目录下建立一个midas.dtsi文件,添加一个midas节点,内容如下:

/{
        midas {
                compatible = "midas,dts_test";

reg=<0x12344321 0x1>;

                midas_value=<555>;
                label = "Midas_Label";
        };
};

  然后将它引用到 sun8i-h3-nanopi-neo.dts 文件中 #include "midas.dtsi"  

 3. 在/works/linux 目录下执行 make dtbs 命令,成功后会生成dtb文件 /works/linux/arch/arm/boot/dts/sun8i-h3-nanopi-neo.dtb,将它复制到/boot下覆盖原来的同名文件, 然后重启linux,内核加载新的dtb.

 4. 编辑一个platf_test.c文件, 内容如下:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/of_platform.h>

static struct of_device_id my_match_table[] = {
        { .compatible = "midas,dts_test",     },
        { },
};

static int my_probe(struct platform_device *dev)
{

    struct resource *res_mem;

    struct device_node *node_midas;
    int value;
    char *label;

  
    if( dev && (dev->name))
    {
        printk("--- dts_test: a compatibale device is found! -----");
        printk("matched platform_device:   name=%s    id=%d  num_resources=%d\n",dev->name,dev->id,dev->num_resources);

        res_mem = platform_get_resource(dev,IORESOURCE_MEM,0);
        printk("get MEM resource: name=%s, start=0x%08x, end=0x%08x\n",res_mem->name,res_mem->start,res_mem->end);

        //----- get node -----

        node_midas = dev->dev.of_node;
        //----- get u32 value of a property -----
        if(!of_property_read_u32(node_midas,"midas_value",&value))
                printk("value: %d ",value);
        else
                printk("no property with name 'midas_value' \n");

        //----- get property of a label string -----
        label=(char *)of_get_property(node_midas,"label",NULL); /* return void  */
        if(label)
                printk("label: %s \n",label);
        else
                printk("no property with name 'label' \n");
    }

    else
        printk("name unknwon \n");
    return 0;
}

static struct platform_driver my_driver = {
        .probe          = my_probe,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "midas",
                .of_match_table = my_match_table, //platform_bus will try to match .of_match_table first, and then .name
        },
};

static int __init platf_test_init(void)
{
  printk("------  dts v.s. platform driver start -----\n");
  return platform_driver_register(&my_driver);
}

static void __exit platf_test_exit(void)
{

  platform_driver_unregister(&my_driver);
  printk("------ dts v.s. platform driver exit -----\n");
}

module_init(platf_test_init);
module_exit(platf_test_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Midas");
MODULE_DESCRIPTION("platf_test");


并编辑一个对应的Makefile如下:

obj-m := platf_test.o
PWD   := $(shell pwd)
K_DIR := /works/linux
all:
        $(MAKE) -C $(K_DIR) M=$(PWD) modules
clean:
        $(MAKE) -C $(K_DIR) M=$(PWD) clean


5. make 一下, 在当前目录下会生成 platf_test.ko


6. insmod platf_test.ko 加载内核模块,观察运行结果:


注意到 /sys/bus/platform/devices下生成的设备名:



(水平所限,如有错误还请斧正.)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Midas-Zhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值