32 #include "pwm-pca9685.h"
34 #define REG_MODE1 0x00
35 #define REG_MODE2 0x01
37 #define REG_LED_ON_L(n) ((4 * n) + 0x06)
38 #define REG_LED_ON_H(n) ((4 * n) + 0x07)
39 #define REG_LED_OFF_L(n) ((4 * n) + 0x08)
40 #define REG_LED_OFF_H(n) ((4 * n) + 0x09)
42 #define MAX_PWM_OUT 16
43 #define PWM_ONE_PERIOD_TICKS 4096
46 pwm_pca9685_set_values(
struct pwm_pca9685_data *data, uint32_t pwm, uint32_t on, uint32_t off)
48 uint8_t buf[5] = { 0 };
50 if(!quarkX1000_i2c_is_available()) {
54 if(pwm > MAX_PWM_OUT) {
58 buf[0] = REG_LED_ON_L(pwm);
60 if((on >= PWM_ONE_PERIOD_TICKS) || (off >= PWM_ONE_PERIOD_TICKS)) {
75 buf[1] = ((on >> 8) & 0x0F);
76 buf[2] = (off & 0xFF);
77 buf[3] = ((off >> 8) & 0x0F);
80 return quarkX1000_i2c_polling_write(buf,
sizeof(buf), data->i2c_slave_addr);
83 pwm_pca9685_set_duty_cycle(
struct pwm_pca9685_data *data, uint32_t pwm, uint8_t duty)
90 }
else if(duty >= 100) {
91 on = PWM_ONE_PERIOD_TICKS + 1;
92 off = PWM_ONE_PERIOD_TICKS + 1;
94 on = PWM_ONE_PERIOD_TICKS * duty / 100;
95 off = PWM_ONE_PERIOD_TICKS - 1;
98 return pwm_pca9685_set_values(data, pwm, on, off);
101 pwm_pca9685_init(
struct pwm_pca9685_data *data, uint16_t i2c_slave_addr)
103 uint8_t buf[2] = { 0 };
106 if(!quarkX1000_i2c_is_available()) {
110 data->i2c_slave_addr = i2c_slave_addr;
115 if(quarkX1000_i2c_polling_write(buf, 2, i2c_slave_addr) < 0) {