使用imx6ull开发板输出PWM
用韦老师的开发板进行实验,imx6ull这款开发板有8路PWM,但是所有的引出脚(扩展)中只有两个引脚可以输出PWM波,分别是PWM7,PWM8,对应的GPIO引脚为gpio_io20,gpio_io19。如何确定扩展口中有没有引脚能输出pwm波呢?如何修改设备树呢?如何操控设备节点呢?
如何确定扩展口中有没有引脚能输出pwm波呢?
查看扩展板的原理图,并且与底板的原理图对照,弄清楚每个扩展引脚对应的功能,将来可以查看该引脚的其他复用功能是否可以设置为PWM输出。如下图所示,扩展板中所引出脚为imx6ull开发板中CAMERA模块中所用到的引脚,由图可知gpio_io20,gpio_io19分别对应的是csi_vsync以及csi_hsync。
利用官方NXP的工具i.MX pins v6,此工具能够查看芯片所支持外设对应的引脚,此工具仅支持为包含电气特性配置(与所有引脚信号相关的)的器件配置引脚路由配置,并创建可用于初始化的源代码,通过寄存器直接初始化或 SDK API 代码和/或器件树代码段(如果支持)的方式。本小节主要利用此工具查看PWM外设所路由到的引脚,也就是说PWM能通过什么引脚哪个引脚输出。
打开i.MX pins v6工具,点击外设信号选择PWM,依次查看8路PWM波所支持的引脚。具体操作如下图所示。
引脚F3(GPIO4_io20)所支持的复用功能上述图片中的几种,其中就包括了本实验所需要的pwm8_OUT。
如何修改设备树?
勾选pwm8_OUT后可以查看右边代码栏中的设备树代码。如下图所示。将黑框内的代码复制到
将黑框内的代码复制到设备树100ask_imx6ull-14x14.dts下的iomuxc中。
pinctrl_pwm7: pwm7grp{ /*!< Function assigned for the core: Cortex-A7[ca7] */
fsl,pins = <
MX6UL_PAD_CSI_VSYNC__PWM7_OUT 0x000010B0
>;
};
pinctrl_pwm8: pwm8grp{
fsl,pins = <
MX6UL_PAD_CSI_HSYNC__PWM8_OUT 0x000010B0
>;
};
将设备树拷贝至 dts目录下。
cp 100ask_imx6ull-14x14.dts ~/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/dts/
cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
make dtbs
将生成的dtb文件拷贝至nfs_rootfs
cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs/
在开发板上输入挂载命令,将dtb文件拷贝至boot中并重启内核。
如何操控PWM设备节点?
PWM 是通过 sysfs 方式进行操控,进入到/sys/class/pwm/pwmchip7 目录下,注意pwm8在此对应的是pwmchip7
/*到处PWM7,会生成一个pwm0的文件夹*/
echo 0 > export
/*设置周期,单位为ns*/
echo 5000 > pwm0/period
/*设置占空比,单位为ns*/
echo 3000 > pwm0/duty_cycle
/*使能PWM*/
echo 1 > pwm0/enable
将输出的PWM接入到示波器观察,具体接线图如下图所示。
小结
本实验中不采用PWM7的原因是考虑到可能会存在引脚冲突的问题,所以在原来的基础上添加了新的pinctl子节点。另外操控设备节点的方法有三种,本实验是其中之一。即:
- 通过sysfs的方式进行操控。
- 在设备驱动程序中通过辅助函数device_create()创建设备节点。
- 新手初期常用的mknod命令。