Initial commit, code based on LPC1224 support and LPC812-MAX CMSIS-DAP interface...
[lpc11u3x] / include / drivers / i2c.h
1 /****************************************************************************
2  *   drivers/i2c.h
3  *
4  *
5  * Copyright 2012 Nathael Pajani <nathael.pajani@ed3l.fr>
6  *
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20  *
21  *************************************************************************** */
23 #ifndef DRIVERS_I2C_H
24 #define DRIVERS_I2C_H
26 #include <stdint.h>
29 #define I2C_CLK_100KHz  (100*1000)
30 #define I2C_CLK_400KHz  (400*1000)
32 #define I2C_READ_BIT 0x01
33 #define I2C_WRITE_BIT 0x00
35 enum i2c_conditions {
36         I2C_CONT = 0,
37         I2C_DO_REPEATED_START,
38         I2C_DO_STOP_START,
39         I2C_STOP,
40 };
42 enum i2c_states {
43         /* Must be set before starting the state machine to be able to wait for completion. */
44         I2C_BUSY = 0,
45         I2C_OK, /* All right, default state after init has been done. */
46         /* Sent slave address and it got ACK'ed, but no data.
47          *  Used to probe or wait for completion. */
48         I2C_NO_DATA,
49         I2C_NACK, /* NACK received */
50         I2C_TIME_OUT,
51         I2C_ARBITRATION_LOST, /* Another master took the I2C Bus from us ... */
52         I2C_BUS_ERROR, /* Illegal start or stop (status of 0x00) */
53         I2C_ERROR_UNKNOWN,
54 };
56 enum i2c_state_machine_states {
57         /* Error states */
58         I2C_ILLEGAL = 0x00, /* Illegal start or stop */
59         I2C_ARBIT_LOST = 0x38,
60         /* Start condition states */
61         I2C_STARTED = 0x08,
62         I2C_RESTARTED, /* Unused, should be set when restarting (STOP+START) after a NACK */
63         I2C_REPEATED_START = 0x10,
64         /* Transmitter states */
65         I2C_ACK_ON_ADDRESS_W = 0x18,
66         I2C_NACK_ON_ADDRESS_W = 0x20,
67         I2C_ACK_ON_DATA_W = 0x28,
68         I2C_NACK_ON_DATA_W = 0x30,
69         /* Receiver states */
70         I2C_ACK_ON_ADDRESS_R = 0x40,
71         I2C_NACK_ON_ADDRESS_R = 0x48,
72         I2C_DATA_ACK = 0x50,
73         I2C_DATA_NACK = 0x58,
74 };
79 /***************************************************************************** */
80 /*                Modules I2C access                                           */
81 /***************************************************************************** */
82 /* I2C Read
83  * Performs a non-blocking read on the i2c bus.
84  *   cmd_buf : buffer containing all control byte to be sent on the i2c bus
85  *   cmd_size : size of the cmd_buf command buffer
86  *   ctrl_buf : buffer containing action to be done after sending, like repeated START conditions
87  *         ctrl_buf has the same size as cmd_buf
88  *   inbuff : the buffer where read data will be put.
89  *   count : the number of bytes to be read.
90  * RETURN VALUE
91  *   Upon successfull completion, returns the number of bytes read. On error, returns a negative
92  *   integer equivalent to errors from glibc.
93  *   -EBADFD : Device not initialized
94  *   -EBUSY : Device or ressource Busy or Arbitration lost
95  *   -EAGAIN : Device already in use
96  *   -EINVAL : Invalid argument (buf)
97  *   -EREMOTEIO : Device did not acknowledge
98  *   -EIO : Bad one: Illegal start or stop, or illegal state in i2c state machine
99  */
100 int i2c_read(const void *cmd_buf, size_t cmd_size, const void* ctrl_buf, void* inbuff, size_t count);
102 /* I2C Write
103  * Performs a non-blocking write on the i2c bus.
104  *   buf : buffer containing all byte to be sent on the i2c bus,
105  *         including conrtol bytes (address, offsets, ...)
106  *   count : the number of bytes to be sent, including address bytes and so on.
107  *   ctrl_buf : buffer containing action to be done after sending, like repeated START conditions
108  *         ctrl_buf has the same size as cmd_buf
109  *         FIXME : note that STOP + START conditions are not allowed, the STOP would lead to sending
110  *         the first bytes of buf, creating an infinite loop.
111  * RETURN VALUE
112  *   Upon successfull completion, returns the number of bytes written. On error, returns a negative
113  *   integer equivalent to errors from glibc.
114  *   -EBADFD : Device not initialized
115  *   -EBUSY : Device or ressource Busy or Arbitration lost
116  *   -EAGAIN : Device already in use
117  *   -EINVAL : Invalid argument (buf)
118  *   -EREMOTEIO : Device did not acknowledge
119  *   -EIO : Bad one: Illegal start or stop, or illegal state in i2c state machine
120  */
121 int i2c_write(const void *buf, size_t count, const void* ctrl_buf);
126 /***************************************************************************** */
127 /*                I2C Init                                                     */
128 /***************************************************************************** */
129 void i2c_on(uint32_t i2c_clk_freq);
130 void i2c_off(void);
131 /* Allow system to propagate main clock */
132 void i2c_clock_update(void);
136 #endif /* DRIVERS_I2C_H */