7#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
9#elif defined(TARGET_LPC11Cxx)
11#define i2c0_irq I2C_IRQHandler
12#define INTERRUPT_ATTRIBUTE
18os_sem_t i2c_sem[I2CCOUNT];
20int i2c_get_id(i2c_t* obj) {
21 switch ((
int)obj->i2c) {
31void i2c0_irq(
void) INTERRUPT_ATTRIBUTE;
33void i2c1_irq(
void) INTERRUPT_ATTRIBUTE;
34void i2c2_irq(
void) INTERRUPT_ATTRIBUTE;
38static const IRQn_Type i2c_irqn[I2CCOUNT] = {
49 os_sem_post_from_isr(i2c_sem+0);
50 NVIC_DisableIRQ(i2c_irqn[0]);
58 os_sem_post_from_isr(i2c_sem+1);
59 NVIC_DisableIRQ(i2c_irqn[1]);
66 os_sem_post_from_isr(i2c_sem+2);
67 NVIC_DisableIRQ(i2c_irqn[2]);
74static const uint32_t irqptr[I2CCOUNT] = {
82void i2c_init_irq(i2c_t *obj) {
83 int id = i2c_get_id(obj);
86 NVIC_SetVector(i2c_irqn[
id], irqptr[
id]);
90int i2c_wait_SI(i2c_t *obj) {
92 int id = i2c_get_id(obj);
94 while (!(obj->i2c->CONSET & (1 << 3))) {
96 while (!(obj->i2c->I2CONSET & (1 << 3))) {
98 NVIC_EnableIRQ(i2c_irqn[
id]);
99 if (os_sem_timedwait(i2c_sem +
id, kTimeoutNano) < 0) {
#define MSEC_TO_NSEC(_msec)
Convert a millisecond value to a nanosecond value.
OS_INLINE int os_sem_init(os_sem_t *sem, unsigned int value)
Initialize a semaphore.