在做项目的过程中自己找资料摸索出了一套适合PWM驱动的编写方法,下面让我来带大家从头开始编写PWM驱动吧!
首先附上设备树
beep@139D0000{
compatible= "fs4412,beep";
reg=<0x139D0000 0x24>;
clocks = <&clock 336>;
clock-names = "timers";
pinctrl-0 = <&pwm0_out>;
pinctrl-names = "default";
};
我用PWM控制蜂鸣器,139D0000是PWM寄存器的基地址,如下图:
想必到这里beep@139D0000大家应该知道是什么意思了。
接下来就是compatible属性,这个是在写驱动代码的时候匹配要用到的,到时候看下面的驱动代码就会知道。
reg属性就是寄存器的其实地址,加上所有寄存器的长度0x24就是36个字节也就是9个寄存器 clocks属性是PWM要用到的时钟编号就是336,具体可以在linux源码目录下的Documentation/devicetree/bindings/clock/exynos4-clock.txt可以找到(我用的芯片是exynos4,具体芯片看你自己的)如下图:
接下来的clock-names属性的值是"timers",这个值在驱动代码中获取时钟频率的时候也需要用到,要记住了!!
pinctrl-0的属性定义后就可以在驱动代码中使用pinctrl子系统的API(Pinctrl(Pin Control)子系统是一个用于管理和控制硬件引脚的框架),需要注意的是这个值直接填默认就行。
到此为止,相信大家已经对设备树有一个比较好的理解了。
接下来就是驱动代码的分析。
先附上代码。代码都有详细的注释。看驱动代码前先补充一点。
设备树的机制其实也是总线型的 BUS/Dev/Drv 模型,只是编写 Dev 的方式变了。即编写 设备树文件 .dts。dst 文件会被编译成 dtb 文件。dtb文件会传给内核, 内核会解析dtb文件, 构造出一系列的 device_node 结构体,