当前位置:   article > 正文

一文让你更了解linux设备树_properties must precede subnodes

properties must precede subnodes

对于每种设备的设备树设置的要求可以参考内核源码目录linux-4.14.78/Documentation/devicetree/bindings 下的文件,

例如对于i2c设备的设备树文件要求可以参考文件 linux-4.14.78/Documentation/devicetree/bindings/i2c/i2c.txt:

内核源码提供了设备树的单元测试代码,参见文件 linux-4.14.78/Documentation/devicetree/usage-model.txt 和 linux-4.14.78/Documentation/devicetree/of_unittest.txt,具体源代码是: linux-4.14.78/drivers/of/unittest.c,可参考该文件对二进制设备树文件解析的函数unittest_data_add(),使用unittest 需要添加内核配置选项 CONFIG_OF_UNITTEST。

在sysfs中查看设备树

在 sysfs文件系统的 /sys/firmware/fdt 存放的是原始的未解析的二进制格式的设备树文件,目录 /sys/firmware/devicetree/base下存放的是解析的结果。

a. /sys/firmware/fdt // 查看原始dtb文件

hexdump -C /sys/firmware/fdt

b. /sys/firmware/devicetree // 以目录结构程现的dtb文件, 根节点对应base目录, 每一个节点对应一个目录, 每一个属性对应一个文件

比如查看 #address-cells 的16进制,在目录 /sys/firmware/devicetree/base 下执行:

hexdump -C “#address-cells”

如果你在设备树设备节点中设置一个错误的中断属性,那么就导致led对应的平台设备节点没办法创建

c. /sys/devices/platform // 系统中所有的platform_device, 有来自设备树的, 也有来有.c文件中注册的

对于来自设备树的platform_device, 可以进入 /sys/devices/platform/<设备名>/of_node 查看它的设备树属性

d. /proc/device-tree 是链接文件, 指向 /sys/firmware/devicetree/base

引用自链接:https://blog.csdn.net/thisway_diy/article/details/84336817

自创设备树的经典例子

下面参考网址 Device Tree Usage - eLinux.org 的设备树例子来讲解设备树生成与解析应用过程,并加以改进定制。

编写设备树文件 fdt_example.dts

将下面的代码保存在文件 fdt_example.dts中:

/dts-v1/;

/include/ "fdt_example.dtsi"

/{

                  /delete-node/ node3deleted@12345678;

};

&label1 {

                  extra-property = "test";

                  status = "disable";                 

                  /*对于相同名称的节点,dtc会根据定义的先后顺序进行合并,其相同属性,取后定义的那个。*/

};

&label2 {

                  reference = < &label1 > ;

                  /delete-property/ property-to-be-deleted;

};

编写设备树文件 fdt_example.dtsi

将下面的代码保存在文件 fdt_example.dtsi中:

/dts-v1/;

/ {

    compatible = "acme,coyotes-revenge";

    #address-cells = <1>;

    #size-cells = <1>;

    interrupt-parent = <&intc>;

    label1:node1 {

        a-string-property = "A string";

        a-string-list-property = "first string", "second string";

        // hex is implied in byte arrays. no '0x' prefix is required

        a-byte-data-property = [01 23 34 56];

                  status = "okay";     //属性应该放在子节点之前,否则编译时出错:Error: fdt_example.dtsi:49.9-25 Properties must precede subnodes

        child-node1 {

            first-child-property;

            second-child-property = <1>;

            a-string-property = "Hello, world";

        };

        child-node2 {

        };

        //status = "okay";   //属性应该放在子节点之前,否则编译时出错:Error: fdt_example.dtsi:49.9-25 Properties must precede subnodes

    };

label2:node2 {

                  compatible = "mxl,lf", "simple-bus";                 

        an-empty-property;

        a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */

        property-to-be-deleted = "nonsense property";

                                   status = "okay";

        child-node1 {

                                   compatible = "mxl,lf";          //必须有属性 compatible 才会转换为平台设备

        };

    };

    node3deleted@12345678 {

                                   a-string-property = "nonsense node";

    };

    cpus {

        #address-cells = <1>;

        #size-cells = <0>;

        cpu@0 {

            compatible = "arm,cortex-a9";

            reg = <0>;

        };

        cpu@1 {

            compatible = "arm,cortex-a9";

            reg = <1>;

        };

    };

    serial@101f0000 {

        compatible = "arm,pl011";

        reg = <0x101f0000 0x1000 >;

        interrupts = < 1 0 >;

    };

    serial@101f2000 {

        compatible = "arm,pl011";

        reg = <0x101f2000 0x1000 >;

        interrupts = < 2 0 >;

    };

    gpio@101f3000 {

        compatible = "arm,pl061";

        reg = <0x101f3000 0x1000

               0x101f4000 0x0010>;

        interrupts = < 3 0 >;

    };

    intc: interrupt-controller@10140000 {

        compatible = "arm,pl190";

        reg = <0x10140000 0x1000 >;

        interrupt-controller;

        #interrupt-cells = <2>;

    };

    spi@10115000 {

        compatible = "arm,pl022";

        reg = <0x10115000 0x1000 >;

        interrupts = < 4 0 >;

    };

    external-bus {

        #address-cells = <2>;

        #size-cells = <1>;

        ranges = <0 0  0x10100000   0x10000     // Chipselect 1, Ethernet

                  1 0  0x10160000   0x10000     // Chipselect 2, i2c controller

                  2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash

        ethernet@0,0 {

            compatible = "smc,smc91c111";

            reg = <0 0 0x1000>;

            interrupts = < 5 2 >;

        };

        i2c@1,0 {

            compatible = "acme,a1234-i2c-bus";

            #address-cells = <1>;

            #size-cells = <0>;

            reg = <1 0 0x1000>;

            interrupts = < 6 2 >;

            rtc@58 {

                compatible = "maxim,ds1338";

                reg = <58>;

                interrupts = < 7 3 >;

            };

        };

        flash@2,0 {

            compatible = "samsung,k8f1315ebm", "cfi-flash";

            reg = <2 0 0x4000000>;

        };

    };      

                 

};

在ubuntu主机上安装设备编译程序dtc以及设备树文件dtb分析工具fdtdump:

sudo apt-get install device-tree-compiler

将设备树源码(dts/dtsi)编译成设备树二进制文件(dtb)可以使用DTC(Device Tree Compiler)工具编译,但是对于嵌入式开发,必须使用交叉编译工具链的 dtc 工具,或者也可以使用内核源码编译设备树时内核自动生成的dtc工具linux-4.14.78/scripts/dtc/dtc来单独编译设备树,否则编译时会产生语法错误,dtc编译器可以把dts文件编译成为dtb,也可把dtb编译成为dts文件,在设置交叉编译环境后,编译命令格式如下:  

(1)  dts编译生成dtb    

./dtc -I dts -O dtb -o xxx.dtb xxx.dts    

(2)  dtb编译生成dts    

./dtc -I dtb -O dts -o xxx.dts xxx.dtb  

使用dtc工具将上面的设备树文件 fdt_example.dts 编译成 设备树二进制文件fdt_example.dtb

mxl@ubuntu:~/work/linux-driver/dtb_example$ dtc -I dts -O dtb -o fdt_example.dtb fdt_example.dts

fdt_example.dtb: Warning (unit_address_vs_reg): Node /external-bus has a reg or ranges property, but no unit name

fdt_example.dtb: Warning (simple_bus_reg): Node /node2/child-node1 missing or empty reg/ranges property

编译过程中出现了第2个警告,暂时不理会,不影响分析结果。

后面两个 fdt_example.dtb: Warning (simple_bus_reg) 的警告是因为文件 fdt_example.dtsi 的节点 node2 属性增加了:

            compatible = "mxl,lf", "simple-bus";

把这一句删除即可消除警告,暂不清楚为何出现此警告。

使用dtc工具将生成的设备树二进制文件fdt_example.dtb 转换为 dts 的文件格式:

mxl@ubuntu:~/work/linux-driver/dtb_example$ dtc -I dtb -O dts -o dtc-fdt_example.dts fdt_example.dtb 

dtc-fdt_example.dts: Warning (unit_address_vs_reg): Node /external-bus has a reg or ranges property, but no unit name

dtc-fdt_example.dts: Warning (simple_bus_reg): Node /node2/child-node1 missing or empty reg/ranges property

mxl@ubuntu:~/work/linux-driver/dtb_example$

mxl@ubuntu:~/work/linux-driver/dtb_example$ cat dtc-fdt_example.dts

/dts-v1/;

/ {

                  compatible = "acme,coyotes-revenge";

                  #address-cells = <0x1>;

                  #size-cells = <0x1>;

                  interrupt-parent = <0x1>;

                  node1 {

                                   a-string-property = "A string";

                                   a-string-list-property = "first string", "second string";

                                   a-byte-data-property = <0x1233456>;

                                   status = "disable";

                                   extra-property = "test";

                                   phandle = <0x2>;

                                   child-node1 {

                                                     first-child-property;

                                                     second-child-property = <0x1>;

                                                     a-string-property = "Hello, world";

                                   };

                                   child-node2 {

                                   };

                  };

                  node2 {

                                   compatible = "mxl,lf", "simple-bus";

                                   an-empty-property;

                                   a-cell-property = <0x1 0x2 0x3 0x4>;

                                   status = "okay";

                                   reference = <0x2>;

                                   child-node1 {

                                                     compatible = "mxl,lf";

                                   };

                  };

                  cpus {

                                   #address-cells = <0x1>;

                                   #size-cells = <0x0>;

                                   cpu@0 {

                                                     compatible = "arm,cortex-a9";

                                                     reg = <0x0>;

                                   };

                                   cpu@1 {

                                                     compatible = "arm,cortex-a9";

                                                     reg = <0x1>;

                                   };

                  };

                  serial@101f0000 {

                                   compatible = "arm,pl011";

                                   reg = <0x101f0000 0x1000>;

                                   interrupts = <0x1 0x0>;

                  };

                  serial@101f2000 {

                                   compatible = "arm,pl011";

                                   reg = <0x101f2000 0x1000>;

                                   interrupts = <0x2 0x0>;

                  };

                  gpio@101f3000 {

                                   compatible = "arm,pl061";

                                   reg = <0x101f3000 0x1000 0x101f4000 0x10>;

                                   interrupts = <0x3 0x0>;

                  };

                  interrupt-controller@10140000 {

                                   compatible = "arm,pl190";

                                   reg = <0x10140000 0x1000>;

                                   interrupt-controller;

                                   #interrupt-cells = <0x2>;

                                   phandle = <0x1>;

                  };

                  spi@10115000 {

                                   compatible = "arm,pl022";

                                   reg = <0x10115000 0x1000>;

                                   interrupts = <0x4 0x0>;

                  };

                  external-bus {

                                   #address-cells = <0x2>;

                                   #size-cells = <0x1>;

                                   ranges = <0x0 0x0 0x10100000 0x10000 0x1 0x0 0x10160000 0x10000 0x2 0x0 0x30000000 0x1000000>;

                                   ethernet@0,0 {

                                                     compatible = "smc,smc91c111";

                                                     reg = <0x0 0x0 0x1000>;

                                                     interrupts = <0x5 0x2>;

                                   };

                                   i2c@1,0 {

                                                     compatible = "acme,a1234-i2c-bus";

                                                     #address-cells = <0x1>;

                                                     #size-cells = <0x0>;

                                                     reg = <0x1 0x0 0x1000>;

                                                     interrupts = <0x6 0x2>;

                                                     rtc@58 {

                                                                      compatible = "maxim,ds1338";

                                                                      reg = <0x3a>;

                                                                      interrupts = <0x7 0x3>;

                                                     };

                                   };

                                   flash@2,0 {

                                                     compatible = "samsung,k8f1315ebm", "cfi-flash";

                                                     reg = <0x2 0x0 0x4000000>;

                                   };

                  };

};

mxl@ubuntu:~/work/linux-driver/dtb_example$

使用fdtdump解析二进制设备树文件

fdtdump的源码可以参见内核源码的文件 linux-4.14.78/scripts/dtc/fdtdump.c:

将 dtb 文件进行解析:

           fdtdump -sd fdt_example.dtb > fdt_example.txt

fdtdump工具的输出信息即是以上结构中每一个成员的值,struct fdt_header结构体包含了Device Tree的私有信息。例如: fdt_header.magic是fdt的魔数,固定值为0xd00dfeed,fdt_header.totalsize是fdt文件的大小。使用二进制工具打开fdt_example.dtb验证。fdt_example.dtb二进制文件头信息如图2所示。从下图中可以得到Device Tree的文件是以大端模式储存。并且,头部信息和fdtdump的输出信息一致:

二进制设备树文件dtb的解析驱动程序parse_fdt.c

将下面的二进制设备树文件解析驱动代码保存在文件 parse_fdt.c 中:

#include <linux/module.h>

#include <linux/device.h>

#include <linux/cdev.h>

#include <linux/kdev_t.h>

#include <linux/notifier.h>

#include <linux/init.h>

#include <linux/module.h>

#include <linux/slab.h>

#include <linux/string.h>

#include <linux/kallsyms.h>

#include <linux/mutex.h>

#include <linux/sched/signal.h>

#include <linux/sysfs.h>

#include <linux/kernel.h>

#include <linux/kobject.h>

#include <linux/uaccess.h>

#include <linux/of.h>

#include <linux/of_device.h>

#include <linux/of_fdt.h>

#include <linux/of_irq.h>

#include <linux/of_platform.h>

#include <linux/list.h>

#include <linux/mutex.h>

#include <linux/slab.h>

#include <linux/platform_device.h>

#include <linux/bitops.h>

/*

由文件 linux-4.14.78/drivers/of/platform.c 的 of_default_bus_match_table 复制而来

*/

static const struct of_device_id mxl_of_default_bus_match_table[] = {

                  { .compatible = "simple-bus", },

                  { .compatible = "simple-mfd", },

                  { .compatible = "isa", },

#ifdef CONFIG_ARM_AMBA

                  { .compatible = "arm,amba-bus", },

#endif /* CONFIG_ARM_AMBA */

                  {} /* Empty terminated list */

};

#define DEVICE_NAME         "mxl"

void walk_device_node(struct device_node *np)

{

                  struct device_node *np_sibling;

                 

                  printk("mxl:%s %s %d  np->name = %s.\n", __FILE__, __FUNCTION__, __LINE__, np->name);

                  printk("mxl:%s %s %d  np->full_name = %s.\n", __FILE__, __FUNCTION__, __LINE__, np->full_name);

                  for (np_sibling = np; np_sibling != NULL; np_sibling = np_sibling->sibling)

                  {

                                   while (np) {                             

                                                     struct device_node *next = np->sibling;

                                                     if(next)

                                                     {

                                                                      printk("mxl:%s %s %d  next->name = %s.\n", __FILE__, __FUNCTION__, __LINE__, next->name);

                                                                       printk("mxl:%s %s %d  next->full_name = %s.\n", __FILE__, __FUNCTION__, __LINE__, next->full_name);

                                                     }

                                                     np = next;                               

                                   }               

                                  

                                   if(np_sibling->child != NULL)

                                                     walk_device_node(np_sibling->child);               

                  }

}

/*

使用宏定义 for_each_child_of_node ,采用递归的方式,遍历设备树struct device_node *np所有儿子节点childe和兄妹节点sibling

*/

void walk_child(struct device_node *np)

{

                  struct device_node *np_child;

                  struct property *prop;

                 

                  for_each_child_of_node(np, np_child) //获取设备节点 np 的子节点存放在 np_child 中

                  {

                                   printk("mxl:%s %s %d  np_child->name = %s.\n", __FILE__, __FUNCTION__, __LINE__, np_child->name);

                                   printk("mxl:%s %s %d  np_child->full_name = %s.\n", __FILE__, __FUNCTION__, __LINE__, np_child->full_name);

                                   prop = of_find_property(np_child, "compatible", NULL);

                                   if (prop)

                                   {

                                                     if(prop->length > strlen(prop->value) + 1)

                                                                      printk("mxl:%s %s %d  compatible = \"%s\",\"%s\"\n", __FILE__, __FUNCTION__, __LINE__,

                                                                                                                           (char *)prop->value, (char *)(prop->value + strlen(prop->value) + 1) );//属性有两个值

                                                     else

                                                                      printk("mxl:%s %s %d  compatible = \"%s\"\n", __FILE__, __FUNCTION__, __LINE__, (char *)(prop->value));

                                   }               

                                   walk_child(np_child);//递归调用,继续处理np_child 的子节点 np_child->child

                  }

}

/*

模仿 linux-4.14.78/drivers/of/unittest.c的函数unittest_data_add()。

作用是解析二进制格式设备树dtb文件生成设备节点,

其中解析得到的根节点存放在 struct device_node *unittest_data_node,

fdt_sized 存放编译生成的二进制格式设备树dtb文件的大小,单位是字节。

fdt_mem 存放编译生成的二进制格式设备树dtb文件的首地址。

*/

static int __init unittest_data_add(int fdt_size, void *fdt_mem)

{

                  void *unittest_data;

                  struct device_node *unittest_data_node;

                  /* creating copy */

                  unittest_data = kmemdup(fdt_mem, fdt_size, GFP_KERNEL); //二进制格式设备树dtb的数据存放在 unittest_data

                  if (!unittest_data) {

                                   pr_warn("%s: Failed to allocate memory for unittest_data; "

                                                     "not running tests\n", __func__);

                                   return -ENOMEM;

                  }

                  //解析二进制格式设备树dtb文件生成设备节点,结果存放在 unittest_data_node

                  of_fdt_unflatten_tree(unittest_data, NULL, &unittest_data_node);

                  if (!unittest_data_node) {

                                   pr_warn("%s: No tree to attach; not running tests\n", __func__);

                                   return -ENODATA;

                  }

                  of_node_set_flag(unittest_data_node, OF_DETACHED);

                  printk("***************start walking through device_node****************************\n");

                  walk_child(unittest_data_node);          //遍历设备树节点 unittest_data_node 下的所有子节点

                  printk("***************end of walking through device_node****************************\n");

                  /* 遍历节点 unittest_data_node ,生成平台设备 struct platform_device */

                  printk("***************start creating platform device ****************************\n");

                  of_platform_populate(unittest_data_node, mxl_of_default_bus_match_table, NULL, NULL);

                  printk("***************endof creating platform device ****************************\n");

                  return 0;

}

static int mxl_chr_driver_open (struct inode *inode, struct file *file)

{

                  printk("mxl:%s %s %d.\n", __FILE__, __FUNCTION__, __LINE__);

                  return 0;

}

static ssize_t mxl_chr_driver_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)

{

                  printk("mxl:%s %s %d.\n", __FILE__, __FUNCTION__, __LINE__);

                  return 0;

}

void * fdt_mem;

static ssize_t mxl_chr_driver_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)

{

                  int real_cnt = 0;

                  printk("mxl:%s %s %d: received dtb file size = %d  bytes.\n", __FILE__, __FUNCTION__, __LINE__, count);

                  fdt_mem = kzalloc(100000, GFP_KERNEL);

                  real_cnt = copy_from_user(fdt_mem, buf, count);//复制应用程序传递过来的二进制格式设备树文件

                 

                  printk("mxl:%s %s %d: real received dtb file size = %d  bytes .\n", __FILE__, __FUNCTION__, __LINE__, count - real_cnt);

                  unittest_data_add(count, fdt_mem);

                  kfree(fdt_mem);

                  return real_cnt;

}

static const struct file_operations  mxl_chr_driver_fops =

{

                  .owner = THIS_MODULE,

                  .open = mxl_chr_driver_open,

                  .read = mxl_chr_driver_read,

                  .write = mxl_chr_driver_write,

};

static dev_t mxl_major = 0;

static dev_t devid;

static struct cdev *cdev;

static struct class *mxl_class ;

static int __init mxl_chr_driver_init(void)           //参考函数register_chrdev()的作法

{

                  int err = -ENOMEM;

                  unsigned char i = 0;

                  if (alloc_chrdev_region(&devid, 0, 3,  DEVICE_NAME)) //注册字符设备主设备号

                  {

                                   pr_err("unable to allocate chrdev region\n");

                                   return -EFAULT;

                  }

                  mxl_major = MAJOR(devid);

                  cdev = cdev_alloc();

                  cdev_init(cdev, &mxl_chr_driver_fops);

                  err = cdev_add(cdev, MKDEV(mxl_major, 0), 3); //注册字符设备

                  mxl_class = class_create(THIS_MODULE, DEVICE_NAME); //创建类

                  if (IS_ERR(mxl_class))

                  {

                                   return PTR_ERR(mxl_class);

                  }

                  for( i = 0; i < 3; i++)

                                   device_create(mxl_class, NULL, MKDEV(mxl_major, i), NULL, "mxl%d", i); //创建设备

                  return 0;

}

static void __exit mxl_chr_driver_exit(void)

{

                  unsigned char i = 0;

                  for( i = 0; i < 3; i++)

                                   device_destroy(mxl_class, MKDEV(mxl_major, i));

                 

                  class_destroy(mxl_class);    

                  unregister_chrdev_region(MKDEV(mxl_major, 0), 3);

                  cdev_del(cdev);

}

module_init(mxl_chr_driver_init);

module_exit(mxl_chr_driver_exit);

MODULE_AUTHOR("mxl");

MODULE_DESCRIPTION("mxl character driver");

MODULE_LICENSE("GPL");

将下面的代码保存在文件 Makefile 中:

obj-m += parse_fdt.o

KERNEL_DIR :=/home/mxl/work/kernel/output

PWD := ${shell pwd}

default:

        make -C ${KERNEL_DIR} M=${PWD} modules

clean:

        rm -rf *.o *.ko *.mod.c

其中的 KERNEL_DIR 是内核编译结果的路径,设置交叉编译环境后执行 make 成驱动模块文件parse_fdt.ko。

应用测试程序test_dtb_example.c

将下面的代码保存在文件test_dtb_example.c,其作用是将设备树文件传送到驱动程序 parse_fdt.ko中进行解析 :

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

extern int errno;

unsigned int cnt = 0;

int main(int argc, char *argv[])

{

            FILE * fp = NULL;

            FILE *dtb_file = NULL;

            int fd = open("/dev/mxl0", O_RDWR);

            int ret = 0;

           

            if(argc < 2)

            {

                       printf("Usage: %s dtb_file\n", argv[0]);

                       return 0;                   

            }

           

            if(fd < 0)

            {

                       ret = errno;

                       perror("/dev/mxl0");

                       return ret;

            }

           

            char *buf = malloc(1000000);

            if(buf == NULL)

                       printf("malloc buf failed!\n");

           

            dtb_file = fopen(argv[1], "r");

            if(dtb_file == NULL)

                       return 1;

            cnt = fread(buf, 1, 1000000, dtb_file);

           

            printf("start to write to dtb file to parse_fdt driver : dtb size = %d.\n", cnt);

            write(fd, buf, cnt);

           

            fclose(dtb_file);

           

            if(fp)

                       fclose(fp);

            close(fd);

            free(buf);

            return 0;

}

使用交叉编译工具链生成可执行文件:

            $CC -g -o test_dtb_example test_dtb_example.c

加载驱动parse_fdt.ko

使用的内核中很多地方添加了打印信息,信息可能有点乱:

root@mxl:/home/mxl/work/linux-driver/parse_fdt# insmod parse_fdt.ko

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/kernel/module.c load_module 3661.   start+++++++++++++++++++=+++

Mar 28 17:15:55 mxl kernel: parse_fdt: loading out-of-tree module taints kernel.

Mar 28 17:15:55 mxl kernel: kobject: 'parse_fdt' (7f208048): kobject_uevent_env

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/lib/kobject_uevent.c kobject_uevent_env 537: retval = 0 .

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/kernel/module.c do_init_module 3454.

Mar 28 17:15:55 mxl kernel: calling  mxl_chr_driver_init+0x0/0x1000 [parse_fdt] @ 680

Mar 28 17:15:55 mxl kernel: kobject: 'mxl' (a97ebf0c): kobject_uevent_env

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/lib/kobject_uevent.c kobject_uevent_env 537: retval = 0 .

Mar 28 17:15:55 mxl kernel: >>>device_add start :/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1792 device: 'mxl0':

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1838 MAJOR(dev->devt) = 236 ,  MINOR(dev->devt) = 0.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/devtmpfs.c devtmpfs_create_node 114:req.name = mxl0  req.mode  = 0x2180.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/devtmpfs.c devtmpfsd 404.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/devtmpfs.c handle_create 207 nodename = mxl0 .

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/devtmpfs.c handle_create 215 MAJOR(dev->devt) = 236 ,  MINOR(dev->devt) = 0.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/namei.c vfs_mknod 3707 dir->i_op->mknod = 801d37cc.

Mar 28 17:15:55 mxl kernel: kobject: 'mxl0' (a9b43208): kobject_uevent_env

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/lib/kobject_uevent.c kobject_uevent_env 537: retval = 0 .

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:55 mxl kernel: ---device_add end device : mxl0

Mar 28 17:15:55 mxl kernel: >>>device_add start :/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1792 device: 'mxl1':

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1838 MAJOR(dev->devt) = 236 ,  MINOR(dev->devt) = 1.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/devtmpfs.c devtmpfs_create_node 114:req.name = mxl1  req.mode  = 0x2180.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/devtmpfs.c devtmpfsd 404.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/devtmpfs.c handle_create 207 nodename = mxl1 .

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/devtmpfs.c handle_create 215 MAJOR(dev->devt) = 236 ,  MINOR(dev->devt) = 1.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/namei.c vfs_mknod 3707 dir->i_op->mknod = 801d37cc.

Mar 28 17:15:55 mxl kernel: kobject: 'mxl1' (a91e9c08): kobject_uevent_env

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/lib/kobject_uevent.c kobject_uevent_env 537: retval = 0 .

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:55 mxl kernel: ---device_add end device : mxl1

Mar 28 17:15:55 mxl kernel: >>>device_add start :/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1792 device: 'mxl2':

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1838 MAJOR(dev->devt) = 236 ,  MINOR(dev->devt) = 2.

Mar 28 17:15:55 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/devtmpfs.c devtmpfs_create_node 114:req.name = mxl2  req.mode  = 0x2180.

Mar 28 17:15:56 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/devtmpfs.c devtmpfsd 404.

Mar 28 17:15:56 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/devtmpfs.c handle_create 207 nodename = mxl2 .

Mar 28 17:15:56 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/devtmpfs.c handle_create 215 MAJOR(dev->devt) = 236 ,  MINOR(dev->devt) = 2.

Mar 28 17:15:56 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/namei.c vfs_mknod 3707 dir->i_op->mknod = 801d37cc.

Mar 28 17:15:56 mxl kernel: kobject: 'mxl2' (a91df208): kobject_uevent_env

Mar 28 17:15:56 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:56 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/lib/kobject_uevent.c kobject_uevent_env 537: retval = 0 .

Mar 28 17:15:56 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:56 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:56 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:56 mxl kernel: ---device_add end device : mxl2

Mar 28 17:15:56 mxl kernel: initcall mxl_chr_driver_init+0x0/0x1000 [parse_fdt] returned 0 after 362360 usecs

Mar 28 17:15:58 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/char_dev.c chrdev_open 385. p =   (null)

驱动程序解析设备树

将前面生成的二进制格式设备树文件 fdt_example.dtb 传递给驱动程序处理,最终在 /sys/bus/platform/devices 新增了以下设备:

node2、node2:child-node1 、10115000.spi、10140000.interrupt-controller、101f0000.serial、101f2000.serial、

101f3000.gpio,如下图所示:

具体的执行过程如下:

root@mxl:/home/mxl/work/linux-driver/parse_fdt# ./test_dtb_example ../dtb_example/fdt_example.dtb

Mar 28 17:15:58 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c mxl_chr_driver_open 151.

Mar 28 17:15:58 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c mxl_chr_driver_write 165: received dtb file size = 2030  bytes.

Mar 28 17:15:58 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c mxl_chr_driver_write 170: real received dtb file size = 2030  bytes .

Mar 28 17:15:58 mxl kernel: ***************start walking through device_node****************************

Mar 28 17:15:58 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = node1.

Mar 28 17:15:58 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /node1.

Mar 28 17:15:58 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = child-node1.

Mar 28 17:15:58 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /node1/child-node1.

Mar 28 17:15:58 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = child-node2.

Mar 28 17:15:58 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /node1/child-node2.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = node2.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /node2.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 93  compatible = "mxl,lf","simple-bus"

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = child-node1.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /node2/child-node1.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 96  compatible = "mxl,lf"

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = cpus.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /cpus.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = cpu.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /cpus/cpu@0.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 96  compatible = "arm,cortex-a9"

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = cpu.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /cpus/cpu@1.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 96  compatible = "arm,cortex-a9"

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = serial.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /serial@101f0000.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 96  compatible = "arm,pl011"

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = serial.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /serial@101f2000.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 96  compatible = "arm,pl011"

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = gpio.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /gpio@101f3000.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 96  compatible = "arm,pl061"

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = interrupt-controller.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /interrupt-controller@10140000.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 96  compatible = "arm,pl190"

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = spi.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /spi@10115000.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 96  compatible = "arm,pl022"

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = external-bus.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /external-bus.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = ethernet.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /external-bus/ethernet@0,0.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 96  compatible = "smc,smc91c111"

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = i2c.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /external-bus/i2c@1,0.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 96  compatible = "acme,a1234-i2c-bus"

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = rtc.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /external-bus/i2c@1,0/rtc@58.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 96  compatible = "maxim,ds1338"

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 87  np_child->name = flash.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 88  np_child->full_name = /external-bus/flash@2,0.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/linux-driver/parse_fdt/parse_fdt.c walk_child 93  compatible = "samsung,k8f1315ebm","cfi-flash"

Mar 28 17:15:59 mxl kernel: ***************end of walking through device_node****************************

Mar 28 17:15:59 mxl kernel: ***************start creating platform device ****************************

Mar 28 17:15:59 mxl kernel: >>>device_add start :/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1792 device: 'node2':

Mar 28 17:15:59 mxl kernel: platform node2: Error -2 creating of_node link

Mar 28 17:15:59 mxl kernel: kobject: 'node2' (a91de418): kobject_uevent_env

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/lib/kobject_uevent.c kobject_uevent_env 537: retval = 0 .

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: ---device_add end device : node2

Mar 28 17:15:59 mxl kernel: >>>device_add start :/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1792 device: 'node2:child-node1':

Mar 28 17:15:59 mxl kernel: platform node2:child-node1: Error -2 creating of_node link

Mar 28 17:15:59 mxl kernel: kobject: 'node2:child-node1' (a91de018): kobject_uevent_env

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/lib/kobject_uevent.c kobject_uevent_env 537: retval = 0 .

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: ---device_add end device : node2:child-node1

Mar 28 17:15:59 mxl kernel: >>>device_add start :/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1792 device: '101f0000.serial':

Mar 28 17:15:59 mxl kernel: platform 101f0000.serial: Error -2 creating of_node link

Mar 28 17:15:59 mxl kernel: kobject: '101f0000.serial' (a91de618): kobject_uevent_env

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/lib/kobject_uevent.c kobject_uevent_env 537: retval = 0 .

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: ---device_add end device : 101f0000.serial

Mar 28 17:15:59 mxl kernel: >>>device_add start :/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1792 device: '101f2000.serial':

Mar 28 17:15:59 mxl kernel: platform 101f2000.serial: Error -2 creating of_node link

Mar 28 17:15:59 mxl kernel: kobject: '101f2000.serial' (a91dea18): kobject_uevent_env

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/lib/kobject_uevent.c kobject_uevent_env 537: retval = 0 .

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: ---device_add end device : 101f2000.serial

Mar 28 17:15:59 mxl kernel: >>>device_add start :/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1792 device: '101f3000.gpio':

Mar 28 17:15:59 mxl kernel: platform 101f3000.gpio: Error -2 creating of_node link

Mar 28 17:15:59 mxl kernel: kobject: '101f3000.gpio' (a91df018): kobject_uevent_env

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/lib/kobject_uevent.c kobject_uevent_env 537: retval = 0 .

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: ---device_add end device : 101f3000.gpio

Mar 28 17:15:59 mxl kernel: >>>device_add start :/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1792 device: '10140000.interrupt-controller':

Mar 28 17:15:59 mxl kernel: platform 10140000.interrupt-controller: Error -2 creating of_node link

Mar 28 17:15:59 mxl kernel: kobject: '10140000.interrupt-controller' (a91df418): kobject_uevent_env

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/lib/kobject_uevent.c kobject_uevent_env 537: retval = 0 .

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: ---device_add end device : 10140000.interrupt-controller

Mar 28 17:15:59 mxl kernel: >>>device_add start :/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c device_add 1792 device: '10115000.spi':

Mar 28 17:15:59 mxl kernel: platform 10115000.spi: Error -2 creating of_node link

Mar 28 17:15:59 mxl kernel: kobject: '10115000.spi' (a91df818): kobject_uevent_env

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:15:59 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:16:00 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/lib/kobject_uevent.c kobject_uevent_env 537: retval = 0 .

Mar 28 17:16:00 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:16:00 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:16:00 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c dev_uevent 881.

Mar 28 17:16:00 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/sysfs/file.c sysfs_kf_seq_show 49 ops = 80a5f888.

Mar 28 17:16:00 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/drivers/base/core.c uevent_show 960.

Mar 28 17:16:00 mxl kernel: ---device_add end device : 10115000.spi

Mar 28 17:16:00 mxl kernel: ***************endof creating platform device ****************************

Mar 28 17:16:01 mxl kernel: mxl:/home/mxl/work/kernel/linux-4.14.78/fs/char_dev.c chrdev_open 385. p = 810fad4c

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/263511
推荐阅读
相关标签
  

闽ICP备14008679号