正点原子ALPHA_设备树点亮LED
设备树点亮LED灯
基于上一章新字符设备驱动进行设备树的点灯操作。
修改设备树
修改内核的dts文件,找到arch/arm/boot/dts/imx6ull-alientek-emmc.dts的文件,在根节点的最后面添加一个alphaled节点,里面属性内容:
alphaled{
#address-cells = <1>;
#size-cells = <1>;
compatible = "atkalpha-led";
status = "okay";
reg = <0x020c406c 0x04
0x020e0068 0x04
0x020e02f4 0x04
0x0209c000 0x04
0x0209c004 0x04 >;
};
保存,编译linux内核下的make dtbsdts文件,make dtbs
将编译后的dtb文件拷贝到tftp目录下cp arch/arm/boot/dts/imx6ull-alientek-emmc.dtb /home/zzz/linux/tftpboot/ -f
这里提一下,选择linux内核下的dts文件,之前选择的是之前是、alientek_linux下的dts文件,系统启动以后led一直在闪烁,估计是这个设备树有用到led灯,一直闪烁是验证不了这个实验的,要用linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek这里面的dts文件编译的dtb.
加载设备驱动
启动linux 通过tftp加载刚编译dtb文件
查看设备是否加载cd /proc/device-tree/
/sys/firmware/devicetree/base # ls
#address-cells leds
#size-cells memory
aliases model
alphaled name
backlight pxp_v4l2
chosen regulators
clocks reserved-memory
compatible sii902x-reset
cpus soc
gpio_keys@0 sound
interrupt-controller@00a01000 spi4
打开alphaled目录,里面就是这个节点所有的属性:
驱动编写
驱动主要是在上一节的新字符设备驱动基础上进行修改:
①:新增两个头文件,是of函数需要用到的:
#include <linux/of.h>
#include <linux/of_address.h>
②:在设备结构体新增结构体成员:struct device_node *nd;nd这个成员变量是代表想要获取设备树节点,可以通过of函数来获取该节点的参数。
③:在驱动初始化函数中通过dtsled.nd = of_find_node_by_path("/alphaled");查找设备树中alphaled节点;
④:在查找到结构体后,查看该节点的熟悉compatibleproper=of_find_property
(dtsled.nd, “compatible”, NULL);有可能看视频操作的,会在alphaled节点没有添加compatible属性,加载驱动时候就会出现如下提示:compatible property find failed。
这个时候就要在设备树这个节点加上:compatible = “atkalpha-led”;驱动运行的时候才能查找到compatible属性。
⑤:查看节点的status属性,确认该节点是否可以运行of_property_read_string(dtsled.nd, “status”, &str);
⑥:获取节点寄存器值,也就是数组数据:of_property_read_u32_array(dtsled.nd, “reg”, regdata, 10);将得到的值保存在regdata中。
⑦:与之前新字符点亮LED设备驱动不同的是,采用设备树后,获取寄存器的方式是通过of_iomap。本质都是将物理地址转化成虚拟地址的操作,如果reg有多段,通过所以index指定需要完成的内存映射。函数原型:void __iomem *of_iomap(struct device_node *np,int index);
总结
设备树感觉就是将需要用到的信息,都写在dts文件中,然后通过函数去获取节点的信息,调用执行。这样的写法应该是有好处的吧,自己再后面用的时候慢慢体会感受一下。
参考:【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.pdf