感觉设备树写驱动是未来的潮流。。。下面我们来讲讲设备树驱动开发。。
设备树语法我们这就不说了,去下面链接自己参考吧:
http://www.cnblogs.com/xiaojiang1025/p/6131381.html
一、修改设备树:
设备树文件在arch/arm/boot/dts目录下am335x-boneblack.dts文件
先贴代码:
修改的地方我都有标注。。。
compatible是用来匹配的。。。
pinctrl-names用来匹配pinctrl设置信息。。。
source_gpios用来获取io信息。。。
我们用的是gpio1_12,设置mode7,且为输出模式。。。
二、总线驱动
platform总线驱动这里就不介绍了。我也讲不明白。感兴趣的可以去 了解,以前学习的时候都是自己写个device再写个driver然后匹配。
现在有设备树了devcie省去了,减少了很大的代码冗余。。。。
写驱动编译有错误不要紧,一条条出解决,查问题。这个驱动刚写好时,一编译刷刷的一排error下来,看到额眼睛都花了,但是一个个看过去还是能解决的。无非就是头文件没包含
语法有问题。。调用的变量类型有问题。。
下面贴个简单的框架:
设备树语法我们这就不说了,去下面链接自己参考吧:
http://www.cnblogs.com/xiaojiang1025/p/6131381.html
一、修改设备树:
设备树文件在arch/arm/boot/dts目录下am335x-boneblack.dts文件
先贴代码:
/* add by Sourcelink */
/ {
model = "TI AM335x BeagleBoneBlack";
compatible = "ti,am335x-bone", "ti,am33xx";
cpus {
cpu@0 {
cpu0-supply = <&dcdc2_reg>;
};
};
/* add by Sourcelink */
source_gpio {
compatible = "sourcelink_gpio";
pinctrl-names = "sourcelink_gpio";
pinctrl-0 = <&sourcelink_pin>;
source_gpios = <&gpio2 12 0>;
};
};
&am33xx_pinmux {
rstctl_pins: pinmux_rstctl_pins {
pinctrl-single,pins = <
/* eMMC_RSTn */
0x50 0x17 /* gpmc_a4.gpio1_20, OUTPUT | MODE7 | PULLUP */
>;
};
/* add by Sourcelink */
sourcelink_pin: pinmux_source_pins {
pinctrl-single,pins = <
0x30 0x7 /* gpmc_ad12.gpio1_12, OUTPUT | MODE7 */
>;
};
};
compatible是用来匹配的。。。
pinctrl-names用来匹配pinctrl设置信息。。。
source_gpios用来获取io信息。。。
我们用的是gpio1_12,设置mode7,且为输出模式。。。
切记gpio的地址标号是从1开始的。。。gpio1对应的是GPIO0_x的地址,我就是这出了问题一直没有调出来。。。
引脚的复用都是从800h地址开始:
对应管脚从gpio0_0开始四个字节开始增加,所以gpio1_12偏移对应:4*12 = 48 = 0x30
二、总线驱动
platform总线驱动这里就不介绍了。我也讲不明白。感兴趣的可以去 了解,以前学习的时候都是自己写个device再写个driver然后匹配。
现在有设备树了devcie省去了,减少了很大的代码冗余。。。。
写驱动编译有错误不要紧,一条条出解决,查问题。这个驱动刚写好时,一编译刷刷的一排error下来,看到额眼睛都花了,但是一个个看过去还是能解决的。无非就是头文件没包含
语法有问题。。调用的变量类型有问题。。
下面贴个简单的框架:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/fs.h>
#include <asm/uaccess.h>