diff options
Diffstat (limited to 'firmware/drivers/generic_i2c.c')
-rw-r--r-- | firmware/drivers/generic_i2c.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/firmware/drivers/generic_i2c.c b/firmware/drivers/generic_i2c.c index effb5372b4..9fd90b5b2c 100644 --- a/firmware/drivers/generic_i2c.c +++ b/firmware/drivers/generic_i2c.c | |||
@@ -198,6 +198,40 @@ end: | |||
198 | return ret; | 198 | return ret; |
199 | } | 199 | } |
200 | 200 | ||
201 | int i2c_write_read_data(int bus_index, int bus_address, | ||
202 | const unsigned char* buf_write, int count_write, | ||
203 | unsigned char* buf_read, int count_read) | ||
204 | { | ||
205 | int i; | ||
206 | int ret = 0; | ||
207 | const struct i2c_interface *iface = i2c_if[bus_index]; | ||
208 | |||
209 | i2c_start(iface); | ||
210 | if (!i2c_outb(iface, bus_address)) | ||
211 | { | ||
212 | ret = -2; | ||
213 | goto end; | ||
214 | } | ||
215 | |||
216 | for(i = 0;i < count_write;i++) | ||
217 | { | ||
218 | if (!i2c_outb(iface, buf_write[i])) | ||
219 | { | ||
220 | ret = -3; | ||
221 | goto end; | ||
222 | } | ||
223 | } | ||
224 | |||
225 | for(i = 0;i < count_read-1;i++) | ||
226 | buf_read[i] = i2c_inb(iface, true); | ||
227 | |||
228 | buf_read[i] = i2c_inb(iface, false); | ||
229 | |||
230 | end: | ||
231 | i2c_stop(iface); | ||
232 | return ret; | ||
233 | } | ||
234 | |||
201 | /* returns bus index which can be used as a handle, or <0 on error */ | 235 | /* returns bus index which can be used as a handle, or <0 on error */ |
202 | int i2c_add_node(const struct i2c_interface *iface) | 236 | int i2c_add_node(const struct i2c_interface *iface) |
203 | { | 237 | { |