赞
踩
对于每种设备的设备树设置的要求可以参考内核源码目录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文件系统的 /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中:
/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中:
/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";
把这一句删除即可消除警告,暂不清楚为何出现此警告。
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的源码可以参见内核源码的文件 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的输出信息一致:
将下面的二进制设备树文件解析驱动代码保存在文件 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,其作用是将设备树文件传送到驱动程序 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
使用的内核中很多地方添加了打印信息,信息可能有点乱:
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。