1 /* Author: Domen Puncer <domen@cba.si>. License: WTFPL, see file LICENSE */
8 #include <drivers/i2c.h>
9 #include <drivers/lpc_i2c.h>
15 #define CON_STO (1<<4)
16 #define CON_STA (1<<5)
17 #define CON_I2EN (1<<6)
20 static void lpc_i2c_init(struct i2c_master
*master
)
22 struct lpc_i2c
*i2c_data
= master
->priv
;
23 struct lpc_i2c_regs
*i2c
= i2c_data
->regs
;
24 int speed
= master
->speed
;
26 i2c
->CONCLR
= CON_AA
| CON_SI
| CON_STA
| CON_I2EN
;
27 speed
= i2c_data
->pclk
/speed
/2;
35 i2c
->CONSET
= CON_I2EN
; /* slave disabled */
39 static void lpc_i2c_handler(struct i2c_master
*master
)
41 struct lpc_i2c
*i2c_data
= master
->priv
;
42 struct lpc_i2c_regs
*i2c
= i2c_data
->regs
;
44 irq_ack(i2c_data
->irq
);
45 i2c_state_machine(master
, i2c
->STAT
);
49 /* TODO find some nicer way to do this */
51 static struct i2c_irq_data
{
52 struct i2c_master
*master
;
55 void __interrupt
i2c0_handler()
57 lpc_i2c_handler(i2c_irq_data
[0].master
);
60 void __interrupt
i2c1_handler()
62 lpc_i2c_handler(i2c_irq_data
[1].master
);
66 static struct i2c_irq_data
{
67 struct i2c_master
*master
;
70 void __interrupt
i2c_irqhandler()
72 lpc_i2c_handler(i2c_irq_data
[0].master
);
76 static void lpc_i2c_start(struct i2c_master
*master
)
78 struct lpc_i2c
*i2c_data
= master
->priv
;
79 struct lpc_i2c_regs
*i2c
= i2c_data
->regs
;
80 i2c
->CONSET
= CON_STA
;
83 static void lpc_i2c_restart(struct i2c_master
*master
)
85 struct lpc_i2c
*i2c_data
= master
->priv
;
86 struct lpc_i2c_regs
*i2c
= i2c_data
->regs
;
87 i2c
->CONSET
= CON_STA
; /* user must clear it */
90 static void lpc_i2c_stop(struct i2c_master
*master
)
92 struct lpc_i2c
*i2c_data
= master
->priv
;
93 struct lpc_i2c_regs
*i2c
= i2c_data
->regs
;
94 i2c
->CONCLR
= CON_AA
; /* clear ack bit / slave enabled bit */
95 i2c
->CONSET
= CON_STO
; /* auto cleared */
98 static void lpc_i2c_ack(struct i2c_master
*master
, int ack
)
100 struct lpc_i2c
*i2c_data
= master
->priv
;
101 struct lpc_i2c_regs
*i2c
= i2c_data
->regs
;
103 i2c
->CONSET
= CON_AA
; /* set ack bit for next received byte */
105 i2c
->CONCLR
= CON_AA
; /* clear ack bit for next received byte */
108 static void lpc_i2c_write(struct i2c_master
*master
, u8 data
)
110 struct lpc_i2c
*i2c_data
= master
->priv
;
111 struct lpc_i2c_regs
*i2c
= i2c_data
->regs
;
112 i2c
->CONCLR
= CON_STA
; /* clear start bit */
116 static u8
lpc_i2c_read(struct i2c_master
*master
)
118 struct lpc_i2c
*i2c_data
= master
->priv
;
119 struct lpc_i2c_regs
*i2c
= i2c_data
->regs
;
120 i2c
->CONCLR
= CON_STA
; /* clear start bit */
125 int lpc_i2c_register(struct i2c_master
*master
)
127 struct lpc_i2c
*i2c_data
= master
->priv
;
128 struct lpc_i2c_regs
*i2c
= i2c_data
->regs
;
130 i2c
->CONCLR
= CON_AA
| CON_SI
| CON_STA
| CON_I2EN
;
132 i2c_irq_data
[i2c_data
->bus
].master
= master
;
133 irq_enable(i2c_data
->irq
);
135 master
->init
= lpc_i2c_init
;
136 master
->start
= lpc_i2c_start
;
137 master
->restart
= lpc_i2c_restart
;
138 master
->stop
= lpc_i2c_stop
;
139 master
->ack
= lpc_i2c_ack
;
140 master
->read
= lpc_i2c_read
;
141 master
->write
= lpc_i2c_write
;