pwm.c 655 B

12345678910111213141516171819202122232425262728293031
  1. #include "FreeRTOS.h"
  2. #include "chip.h"
  3. #define PWM_EN 0x0
  4. #define PWM_DUTY 0x4
  5. #define PWM_CNTR 0x8
  6. #define PWM_REG(x) (REGS_PWM_BASE + 0x10 * (x))
  7. int pwm_config(int id, uint32_t duty_ns, uint32_t period_ns)
  8. {
  9. uint32_t clk_mhz = ulClkGetRate(CLK_PWM) / 1000000;
  10. uint32_t duty = (unsigned long long)duty_ns * clk_mhz / 1000;
  11. uint32_t period = (unsigned long long)period_ns * clk_mhz / 1000;
  12. writel(0, PWM_REG(id) + PWM_EN);
  13. writel(duty, PWM_REG(id) + PWM_DUTY);
  14. writel(period, PWM_REG(id) + PWM_CNTR);
  15. return 0;
  16. }
  17. void pwm_enable(int id)
  18. {
  19. writel(1, PWM_REG(id) + PWM_EN);
  20. }
  21. void pwm_disable(int id)
  22. {
  23. writel(0, PWM_REG(id) + PWM_EN);
  24. }