staticint lpc32xx_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, int duty_ns, int period_ns)
{ struct lpc32xx_pwm_chip *lpc32xx = to_lpc32xx_pwm_chip(chip); unsignedlonglong c; int period_cycles, duty_cycles;
u32 val;
c = clk_get_rate(lpc32xx->clk);
/* The highest acceptable divisor is 256, which is represented by 0 */
period_cycles = div64_u64(c * period_ns,
(unsignedlonglong)NSEC_PER_SEC * 256); if (!period_cycles || period_cycles > 256) return -ERANGE; if (period_cycles == 256)
period_cycles = 0;
/* Compute 256 x #duty/period value and care for corner cases */
duty_cycles = div64_u64((unsignedlonglong)(period_ns - duty_ns) * 256,
period_ns); if (!duty_cycles)
duty_cycles = 1; if (duty_cycles > 255)
duty_cycles = 255;
val = readl(lpc32xx->base);
val &= ~0xFFFF;
val |= (period_cycles << 8) | duty_cycles;
writel(val, lpc32xx->base);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.