COSMOS core  1.0.2 (beta)
Comprehensive Open-architecture Solution for Mission Operations Systems
i2c-dev-smbus.h
Go to the documentation of this file.
1 /*
2  i2c-dev.h - i2c-bus driver, char device interface
3 
4  Copyright (C) 1995-97 Simon G. Vogl
5  Copyright (C) 1998-99 Frodo Looijaard <frodol@dds.nl>
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 2 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program; if not, write to the Free Software
19  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20  MA 02110-1301 USA.
21 */
22 
23 /* $Id: i2c-dev.h 5894 2010-12-12 13:22:29Z khali $ */
24 
25 #ifndef LIB_I2CDEV_H
26 #define LIB_I2CDEV_H
27 
28 #if defined(COSMOS_LINUX_OS)
29 #include <linux/types.h>
30 #include <sys/ioctl.h>
31 
32 
33 /* -- i2c.h -- */
34 
35 
36 /*
37  * I2C Message - used for pure i2c transaction, also from /dev interface
38  */
39 struct i2c_msg {
40  __u16 addr; /* slave address */
41  unsigned short flags;
42 #define I2C_M_TEN 0x10 /* we have a ten bit chip address */
43 #define I2C_M_RD 0x01
44 #define I2C_M_NOSTART 0x4000
45 #define I2C_M_REV_DIR_ADDR 0x2000
46 #define I2C_M_IGNORE_NAK 0x1000
47 #define I2C_M_NO_RD_ACK 0x0800
48  short len; /* msg length */
49  char *buf; /* pointer to msg data */
50 };
51 
52 /* To determine what functionality is present */
53 
54 #define I2C_FUNC_I2C 0x00000001
55 #define I2C_FUNC_10BIT_ADDR 0x00000002
56 #define I2C_FUNC_PROTOCOL_MANGLING 0x00000004 /* I2C_M_{REV_DIR_ADDR,NOSTART,..} */
57 #define I2C_FUNC_SMBUS_PEC 0x00000008
58 #define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0x00008000 /* SMBus 2.0 */
59 #define I2C_FUNC_SMBUS_QUICK 0x00010000
60 #define I2C_FUNC_SMBUS_READ_BYTE 0x00020000
61 #define I2C_FUNC_SMBUS_WRITE_BYTE 0x00040000
62 #define I2C_FUNC_SMBUS_READ_BYTE_DATA 0x00080000
63 #define I2C_FUNC_SMBUS_WRITE_BYTE_DATA 0x00100000
64 #define I2C_FUNC_SMBUS_READ_WORD_DATA 0x00200000
65 #define I2C_FUNC_SMBUS_WRITE_WORD_DATA 0x00400000
66 #define I2C_FUNC_SMBUS_PROC_CALL 0x00800000
67 #define I2C_FUNC_SMBUS_READ_BLOCK_DATA 0x01000000
68 #define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 0x02000000
69 #define I2C_FUNC_SMBUS_READ_I2C_BLOCK 0x04000000 /* I2C-like block xfer */
70 #define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 0x08000000 /* w/ 1-byte reg. addr. */
71 
72 #define I2C_FUNC_SMBUS_BYTE (I2C_FUNC_SMBUS_READ_BYTE | \
73  I2C_FUNC_SMBUS_WRITE_BYTE)
74 #define I2C_FUNC_SMBUS_BYTE_DATA (I2C_FUNC_SMBUS_READ_BYTE_DATA | \
75  I2C_FUNC_SMBUS_WRITE_BYTE_DATA)
76 #define I2C_FUNC_SMBUS_WORD_DATA (I2C_FUNC_SMBUS_READ_WORD_DATA | \
77  I2C_FUNC_SMBUS_WRITE_WORD_DATA)
78 #define I2C_FUNC_SMBUS_BLOCK_DATA (I2C_FUNC_SMBUS_READ_BLOCK_DATA | \
79  I2C_FUNC_SMBUS_WRITE_BLOCK_DATA)
80 #define I2C_FUNC_SMBUS_I2C_BLOCK (I2C_FUNC_SMBUS_READ_I2C_BLOCK | \
81  I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)
82 
83 /* Old name, for compatibility */
84 #define I2C_FUNC_SMBUS_HWPEC_CALC I2C_FUNC_SMBUS_PEC
85 
86 /*
87  * Data for SMBus Messages
88  */
89 #define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */
90 #define I2C_SMBUS_I2C_BLOCK_MAX 32 /* Not specified but we use same structure */
91 union i2c_smbus_data {
92  __u8 byte;
93  __u16 word;
94  __u8 block[I2C_SMBUS_BLOCK_MAX + 2]; /* block[0] is used for length */
95  /* and one more for PEC */
96 };
97 
98 /* smbus_access read or write markers */
99 #define I2C_SMBUS_READ 1
100 #define I2C_SMBUS_WRITE 0
101 
102 /* SMBus transaction types (size parameter in the above functions)
103  Note: these no longer correspond to the (arbitrary) PIIX4 internal codes! */
104 #define I2C_SMBUS_QUICK 0
105 #define I2C_SMBUS_BYTE 1
106 #define I2C_SMBUS_BYTE_DATA 2
107 #define I2C_SMBUS_WORD_DATA 3
108 #define I2C_SMBUS_PROC_CALL 4
109 #define I2C_SMBUS_BLOCK_DATA 5
110 #define I2C_SMBUS_I2C_BLOCK_BROKEN 6
111 #define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */
112 #define I2C_SMBUS_I2C_BLOCK_DATA 8
113 
114 
115 /* ----- commands for the ioctl like i2c_command call:
116  * note that additional calls are defined in the algorithm and hw
117  * dependent layers - these can be listed here, or see the
118  * corresponding header files.
119  */
120  /* -> bit-adapter specific ioctls */
121 #define I2C_RETRIES 0x0701 /* number of times a device address */
122  /* should be polled when not */
123  /* acknowledging */
124 #define I2C_TIMEOUT 0x0702 /* set timeout - call with int */
125 
126 
127 /* this is for i2c-dev.c */
128 #define I2C_SLAVE 0x0703 /* Change slave address */
129  /* Attn.: Slave address is 7 or 10 bits */
130 #define I2C_SLAVE_FORCE 0x0706 /* Change slave address */
131  /* Attn.: Slave address is 7 or 10 bits */
132  /* This changes the address, even if it */
133  /* is already taken! */
134 #define I2C_TENBIT 0x0704 /* 0 for 7 bit addrs, != 0 for 10 bit */
135 
136 #define I2C_FUNCS 0x0705 /* Get the adapter functionality */
137 #define I2C_RDWR 0x0707 /* Combined R/W transfer (one stop only)*/
138 #define I2C_PEC 0x0708 /* != 0 for SMBus PEC */
139 
140 #define I2C_SMBUS 0x0720 /* SMBus-level access */
141 
142 /* -- i2c.h -- */
143 
144 
145 /* Note: 10-bit addresses are NOT supported! */
146 
147 /* This is the structure as used in the I2C_SMBUS ioctl call */
148 struct i2c_smbus_ioctl_data {
149  char read_write;
150  __u8 command;
151  int size;
152  union i2c_smbus_data *data;
153 };
154 
155 /* This is the structure as used in the I2C_RDWR ioctl call */
156 struct i2c_rdwr_ioctl_data {
157  struct i2c_msg *msgs; /* pointers to i2c_msgs */
158  int nmsgs; /* number of i2c_msgs */
159 };
160 
161 
162 static inline __s32 i2c_smbus_access(int file, char read_write, __u8 command,
163  int size, union i2c_smbus_data *data)
164 {
165  struct i2c_smbus_ioctl_data args;
166 
167  args.read_write = read_write;
168  args.command = command;
169  args.size = size;
170  args.data = data;
171  return ioctl(file,I2C_SMBUS,&args);
172 }
173 
174 
175 static inline __s32 i2c_smbus_write_quick(int file, __u8 value)
176 {
177  return i2c_smbus_access(file,value,0,I2C_SMBUS_QUICK,NULL);
178 }
179 
180 static inline __s32 i2c_smbus_read_byte(int file)
181 {
182  union i2c_smbus_data data;
183  if (i2c_smbus_access(file,I2C_SMBUS_READ,0,I2C_SMBUS_BYTE,&data))
184  return -1;
185  else
186  return 0x0FF & data.byte;
187 }
188 
189 static inline __s32 i2c_smbus_write_byte(int file, __u8 value)
190 {
191  return i2c_smbus_access(file,I2C_SMBUS_WRITE,value,
192  I2C_SMBUS_BYTE,NULL);
193 }
194 
195 static inline __s32 i2c_smbus_read_byte_data(int file, __u8 command)
196 {
197  union i2c_smbus_data data;
198  if (i2c_smbus_access(file,I2C_SMBUS_READ,command,
199  I2C_SMBUS_BYTE_DATA,&data))
200  return -1;
201  else
202  return 0x0FF & data.byte;
203 }
204 
205 static inline __s32 i2c_smbus_write_byte_data(int file, __u8 command,
206  __u8 value)
207 {
208  union i2c_smbus_data data;
209  data.byte = value;
210  return i2c_smbus_access(file,I2C_SMBUS_WRITE,command,
211  I2C_SMBUS_BYTE_DATA, &data);
212 }
213 
214 static inline __s32 i2c_smbus_read_word_data(int file, __u8 command)
215 {
216  union i2c_smbus_data data;
217  if (i2c_smbus_access(file,I2C_SMBUS_READ,command,
218  I2C_SMBUS_WORD_DATA,&data))
219  return -1;
220  else
221  return 0x0FFFF & data.word;
222 }
223 
224 static inline __s32 i2c_smbus_write_word_data(int file, __u8 command,
225  __u16 value)
226 {
227  union i2c_smbus_data data;
228  data.word = value;
229  return i2c_smbus_access(file,I2C_SMBUS_WRITE,command,
230  I2C_SMBUS_WORD_DATA, &data);
231 }
232 
233 static inline __s32 i2c_smbus_process_call(int file, __u8 command, __u16 value)
234 {
235  union i2c_smbus_data data;
236  data.word = value;
237  if (i2c_smbus_access(file,I2C_SMBUS_WRITE,command,
238  I2C_SMBUS_PROC_CALL,&data))
239  return -1;
240  else
241  return 0x0FFFF & data.word;
242 }
243 
244 
245 /* Returns the number of read bytes */
246 static inline __s32 i2c_smbus_read_block_data(int file, __u8 command,
247  __u8 *values)
248 {
249  union i2c_smbus_data data;
250  int i;
251  if (i2c_smbus_access(file,I2C_SMBUS_READ,command,
252  I2C_SMBUS_BLOCK_DATA,&data))
253  return -1;
254  else {
255  for (i = 1; i <= data.block[0]; i++)
256  values[i-1] = data.block[i];
257  return data.block[0];
258  }
259 }
260 
261 static inline __s32 i2c_smbus_write_block_data(int file, __u8 command,
262  __u8 length, const __u8 *values)
263 {
264  union i2c_smbus_data data;
265  int i;
266  if (length > 32)
267  length = 32;
268  for (i = 1; i <= length; i++)
269  data.block[i] = values[i-1];
270  data.block[0] = length;
271  return i2c_smbus_access(file,I2C_SMBUS_WRITE,command,
272  I2C_SMBUS_BLOCK_DATA, &data);
273 }
274 
275 /* Returns the number of read bytes */
276 /* Until kernel 2.6.22, the length is hardcoded to 32 bytes. If you
277  ask for less than 32 bytes, your code will only work with kernels
278  2.6.23 and later. */
279 static inline __s32 i2c_smbus_read_i2c_block_data(int file, __u8 command,
280  __u8 length, __u8 *values)
281 {
282  union i2c_smbus_data data;
283  int i;
284 
285  if (length > 32)
286  length = 32;
287  data.block[0] = length;
288  if (i2c_smbus_access(file,I2C_SMBUS_READ,command,
289  length == 32 ? I2C_SMBUS_I2C_BLOCK_BROKEN :
290  I2C_SMBUS_I2C_BLOCK_DATA,&data))
291  return -1;
292  else {
293  for (i = 1; i <= data.block[0]; i++)
294  values[i-1] = data.block[i];
295  return data.block[0];
296  }
297 }
298 
299 static inline __s32 i2c_smbus_write_i2c_block_data(int file, __u8 command,
300  __u8 length,
301  const __u8 *values)
302 {
303  union i2c_smbus_data data;
304  int i;
305  if (length > 32)
306  length = 32;
307  for (i = 1; i <= length; i++)
308  data.block[i] = values[i-1];
309  data.block[0] = length;
310  return i2c_smbus_access(file,I2C_SMBUS_WRITE,command,
311  I2C_SMBUS_I2C_BLOCK_BROKEN, &data);
312 }
313 
314 /* Returns the number of read bytes */
315 static inline __s32 i2c_smbus_block_process_call(int file, __u8 command,
316  __u8 length, __u8 *values)
317 {
318  union i2c_smbus_data data;
319  int i;
320  if (length > 32)
321  length = 32;
322  for (i = 1; i <= length; i++)
323  data.block[i] = values[i-1];
324  data.block[0] = length;
325  if (i2c_smbus_access(file,I2C_SMBUS_WRITE,command,
326  I2C_SMBUS_BLOCK_PROC_CALL,&data))
327  return -1;
328  else {
329  for (i = 1; i <= data.block[0]; i++)
330  values[i-1] = data.block[i];
331  return data.block[0];
332  }
333 }
334 
335 #endif
336 
337 #endif /* LIB_I2CDEV_H */
int i
Definition: rw_test.cpp:37
string command
Definition: add_radio.cpp:27
png_uint_32 length
Definition: png.c:2173
char buf[128]
Definition: rw_test.cpp:40