我测试使用的是PWM7_M0
先配置pwm7
&pwm7 {
status = "okay";
pinctrl-names = "active";
pinctrl-0 = <&pwm7m0_pins_pull_down>;
};
进入系统后可以在/sys/class/pwm下面看到pwmchip2
因为我的pwm1和pwm2也使能了pwm7排第3个所以我的是pwmchip2
正常使用pwm我们需要进入pwmchip2
然后echo 0 > export
然后产生一个pwm0的文件夹这个里面对应了PWM7_M0
在这个里面呢有enable period duty_cycle这些常用的参数,如果我们实现呼吸灯的效果那么就要在应用中循环配置duty_cycle的值
现在我们增加breath和breath_period节点用来实现呼吸灯效果
首先在drivers/pwm/sysfs.c里面增加设备节点
下面是差异文件
+static ssize_t breath_show(struct device *child,
+ struct device_attribute *attr,
+ char *buf)
+{
+ const struct pwm_device *pwm = child_to_pwm_device(child);
+ struct pwm_state state;
+
+ pwm_get_state(pwm, &state);
+
+ return sprintf(buf, "%d\n", state.breath);
+}
+
+static ssize_t breath_store(struct device *child,
+ struct device_attribute *attr,
+ const char *buf, size_t size)
+{
+ struct pwm_export *export = child_to_pwm_export(child);
+ struct pwm_device *pwm = export->pwm;
+ struct pwm_state state;
+ int val, ret;
+
+ ret = kstrtoint(buf, 0, &val);
+ if (ret)
+ return ret;
+
+ mutex_lock(&export->lock);
+
+ pwm_get_state(pwm, &state);
+
+ switch (val) {