正点原子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属性查找失败
这个时候就要在设备树这个节点加上: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