27 #include "../../board.h"
29 #if BOARD == BOARD_EA4357
31 #include "lpc43xx_i2c.h"
32 #include "lpc43xx_cgu.h"
33 #include "lpc_types.h"
40 #define I2C_PORT (LPC_I2C0)
42 #define LS_MODE_ON 0x01
43 #define LS_MODE_BLINK0 0x02
44 #define LS_MODE_BLINK1 0x03
55 static uint16_t blink0Shadow = 0;
56 static uint16_t blink1Shadow = 0;
57 static uint16_t ledStateShadow = 0;
63 static Status I2CWrite(uint32_t addr, uint8_t* buf, uint32_t len)
65 I2C_M_SETUP_Type i2cData;
67 i2cData.sl_addr7bit = addr;
68 i2cData.tx_data = buf;
69 i2cData.tx_length = len;
70 i2cData.rx_data = NULL;
71 i2cData.rx_length = 0;
72 i2cData.retransmissions_max = 3;
74 return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING);
77 static Status I2CRead(uint32_t addr, uint8_t* buf, uint32_t len)
79 I2C_M_SETUP_Type i2cData;
81 i2cData.sl_addr7bit = addr;
82 i2cData.tx_data = NULL;
83 i2cData.tx_length = 0;
84 i2cData.rx_data = buf;
85 i2cData.rx_length = len;
86 i2cData.retransmissions_max = 3;
88 return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING);
91 static void setLsStates(uint16_t states, uint8_t* ls, uint8_t mode)
93 #define IS_LED_SET(bit, x) ( ( ((x) & (bit)) != 0 ) ? 1 : 0 )
97 for (i = 0; i < 4; i++) {
99 ls[i] |= ( (IS_LED_SET(0x0001, states)*mode << 0)
100 | (IS_LED_SET(0x0002, states)*mode << 2)
101 | (IS_LED_SET(0x0004, states)*mode << 4)
102 | (IS_LED_SET(0x0008, states)*mode << 6) );
108 static void setLeds(
void)
111 uint8_t ls[4] = {0,0,0,0};
112 uint16_t states = ledStateShadow;
115 setLsStates(states, ls, LS_MODE_ON);
118 setLsStates(blink0Shadow, ls, LS_MODE_BLINK0);
119 setLsStates(blink1Shadow, ls, LS_MODE_BLINK1);
122 buf[0] = PCA9532_LS0 | PCA9532_AUTO_INC;
127 I2CWrite(PCA9532_I2C_ADDR, buf, 5);
140 void pca9532_init (
void)
164 uint16_t pca9532_getLedState (uint32_t shadow)
171 ret = (ledStateShadow | blink0Shadow | blink1Shadow);
180 buf[0] = PCA9532_INPUT0;
181 I2CWrite(PCA9532_I2C_ADDR, buf, 1);
183 I2CRead(PCA9532_I2C_ADDR, buf, 1);
187 buf[0] = PCA9532_INPUT1;
188 I2CWrite(PCA9532_I2C_ADDR, buf, 1);
190 I2CRead(PCA9532_I2C_ADDR, buf, 1);
191 ret |= (buf[0] << 8);
195 ret = ((~ret) & 0xFFFF);
198 return (ret & ~PCA9532_NOT_USED);
213 void pca9532_setLeds (uint16_t ledOnMask, uint16_t ledOffMask)
216 ledStateShadow &= (~(ledOffMask) & 0xffff);
219 ledStateShadow |= ledOnMask;
222 blink0Shadow &= (~(ledOffMask) & 0xffff);
223 blink1Shadow &= (~(ledOffMask) & 0xffff);
238 void pca9532_setBlink0Period(uint8_t period)
242 buf[0] = PCA9532_PSC0;
244 I2CWrite(PCA9532_I2C_ADDR, buf, 2);
257 void pca9532_setBlink0Duty(uint8_t duty)
265 tmp = (256 * tmp)/100;
267 buf[0] = PCA9532_PWM0;
269 I2CWrite(PCA9532_I2C_ADDR, buf, 2);
282 void pca9532_setBlink0Leds(uint16_t ledMask)
284 blink0Shadow |= ledMask;
298 void pca9532_setBlink1Period(uint8_t period)
302 buf[0] = PCA9532_PSC1;
304 I2CWrite(PCA9532_I2C_ADDR, buf, 2);
317 void pca9532_setBlink1Duty(uint8_t duty)
326 tmp = (256 * tmp)/100;
328 buf[0] = PCA9532_PWM1;
330 I2CWrite(PCA9532_I2C_ADDR, buf, 2);
343 void pca9532_setBlink1Leds(uint16_t ledMask)
345 blink1Shadow |= ledMask;