On Mon, Jul 20, 2015 at 11:46:12AM +0200, Clemens Gruber wrote:
> On Mon, Jul 20, 2015 at 11:30:22AM +0200, Thierry Reding wrote:
> > On Mon, Jul 20, 2015 at 10:36:09AM +0200, Clemens Gruber wrote:
> > > Previously, period_ns and duty_ns were only used to determine the
> > > ratio of ON and OFF time, the default frequency of 200 Hz was never
> > > changed.
> > > The PCA9685 however is capable of changing the PWM output frequency,
> > > which is expected when changing the period.
> > > 
> > > This patch configures the prescaler accordingly, using the formula
> > > and notes provided in the PCA9685 datasheet.
> > > Bounds checking for the minimum and maximum frequencies, last updated
> > > in revision v.4 of said datasheet, is also added.
> > > 
> > > The prescaler is only touched if the period changed, because we have to
> > > put the chip into sleep mode to unlock the prescale register.
> > > If it is changed, the PWM output frequency changes for all outputs,
> > > because there is one prescaler per chip. This is documented in the
> > > PCA9685 datasheet and in the comments.
> > 
> > I think the reason why the driver doesn't support changing the frequency
> > is precisely because it has a per-chip prescaler. So you'd be changing
> > the frequency from other all other users if one of the channels requests
> > to do so. If I remember correctly there had been some discussion back at
> > the time that this wasn't safe to do.
> > 
> > If you have to do this, I'd think you'd need to at least update the duty
> > cycle of all other users according to the new period.
> 
> Hi, thanks for your feedback.
> 
> Yes, that's true. You'd have to set the prescaler first and then manually set
> all duty cycle values. Although this is a hardware feature, I can understand
> that this might be confusing.
> 
> I will send a v4 to update the duty cycle of all other users after the chip
> woke up again!
> (Using the ratio from duty cycle to old period to set the new duty cycle)
> 
> Clemens

Do you think it would be a good idea to print something to the kernel log when
changing the prescaler frequency? At the moment I only print an error when it is
out of bounds.
To notify the users that the frequency of all channels changed and the duty
cycle values have been adjusted?

Clemens
--
To unsubscribe from this list: send the line "unsubscribe linux-pwm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to