本文共 3066 字,大约阅读时间需要 10 分钟。
如果我所做的每一件事都要对我的人生有用,那我的人生到底是什么呢? 赚更多的钱?开更好的车?住更大的房子? 这些鬼东西就是我的人生么?
从上图可以知道, platform_device/platform_driver 只是编程的技巧,不涉及驱动的核心。
在我们的工作中,驱动要求设备树节点提供什么,我们就得按这要求去编写设备树。但是,匹配过程所要求的东西是固定的。
比如:
如果在设备树节点里使用 reg 属性,那么内核生成对应的 platform_device 时会用 reg属性来设置 IORESOURCE_MEM 类型的资源。
如果在设备树节点里使用 interrupts 属性,那么内核生成对应的 platform_device 时会用reg 属性来设置 IORESOURCE_IRQ 类型的资源。对于 interrupts 属性,内核会检查它的有效性,所以不建议在设备树里使用该属性来表示其他资源。在我们的工作中,驱动要求设备树节点提供什么,我们就得按这要求去编写设备树。驱动程序中根据 pin 属性来确定引脚,那么我们就在设备树节点中添加 pin 属性。
比如:
设备树节点中有
#define GROUP_PIN(g,p) ((g<<16) | (p))100ask_led0 { compatible = “100ask,led”; pin =;};
驱动程序中,可以从 platform_device 中得到 device_node,再用 of_property_read_u32
得到属性的值:struct device_node* np = pdev->dev.of_node;int led_pin;int err = of_property_read_u32(np, “pin”, &led_pin);
在本实验中,需要添加的设备节点代码是一样的,你需要找到你的单板所用的设备树文
件,在它的根节点下添加如下内容:#define GROUP_PIN(g,p) ((g<<16) | (p))100ask_led@0 { compatible = "100as,leddrv"; pin =;};100ask_led@1 { compatible = "100as,leddrv"; pin = ;};
/home/clay/linux/qemu/kernel/100ask_imx6ull-qemu/linux-4.9.88/arch/arm/boot/dts/100ask_imx6ul_qemu.dts
。修改、编译后得到arch/arm/boot/dts/100ask_imx6ul_qemu.dtb
文件
make dtbs
/home/clay/linux/qemu/kernel/100ask_imx6ull-qemu/linux-4.9.88
然后去覆盖qemu板旧的dtb文件,路径在qemu安装目录下的./imx6ull-system-image
文件夹中,我的是/home/clay/linux/qemu/new/ubuntu-16.04_imx6ul_qemu_system/imx6ull-system-image
目录
然后修改chipY_gpio.c,较上一节不同的是,主要修改了如下几个地方
删除了board_A_led.c因为由设备树指定资源!其他的内容几乎不变!
编译程序没有问题后,运行qemu虚拟开发板,并做好准备工作!
cp *.ko ledtest ~/linux/qemu/NFS/
insmod leddrv.koinsmod chipY_gpio.ko
在qemu中加载最后一个模块时,会出现下面的提示信息,但是ctrl+c之后,似乎测试还是可以用的,不知道是怎么回事。知道的朋友,可以在下面留言一起探讨!
查看LED对应的设备树节点是够加载成功
cd /sys/firmware/devicetree/base/
,然后输入ls
命令可以看到如下信息 cd 100ask_led@0
cd /sys/devices/soc0
,然后可以看到一堆的platform_device,当然也可以周到我们的led了. cd 100ask_led@0
,可以看到Platform_divice的各种属性,需要注意的是其中的driver目录,这个是只有在platform_device和Platform_driver绑定后才会生成的! ls -l driver
,可以看到它指向/sys/bus/platform/drivers/100ask_led
在qemu终端,运行应用程序打开LED0
./ledtest /dev/100ask_led0 on
led0对应的就是GPIO3_IO1引脚,这个在设备树中指定的!
./ledtest /dev/100ask_led1 on
led1对应的就是GPIO5_IO8引脚
终于终于,将设备树的内容一口气输出完了,但是上面的程序我们并没有配置具体的硬件,为了更好的理解设备树思想嘛!所以,这还仅仅是一盏假的LED,别急别急,下一次我们真的LED就要来了!拭目以待~~
转载地址:http://gfnaf.baihongyu.com/