GadgetSeed  0.9.6
com_i2c.c
[詳解]
1 /** @file
2  @brief I2Cコマンド
3 
4  @date 2015.07.20
5  @author Takashi SHUDO
6 
7  @section i2c_command i2cコマンド
8 
9  i2c コマンドには以下のサブコマンドがあります。
10 
11  | サブコマンド | 機能 | 詳細 |
12  |:------------------|:------------------------------|:----------------------|
13  | detect | @copybrief com_i2c_detect | @ref com_i2c_detect |
14  | dump | @copybrief com_i2c_dump | @ref com_i2c_dump |
15  | get | @copybrief com_i2c_get | @ref com_i2c_get |
16  | put | @copybrief com_i2c_put | @ref com_i2c_put |
17 */
18 
19 #include "asm.h"
20 #include "shell.h"
21 #include "lineedit.h"
22 #include "console.h"
23 #include "timer.h"
24 #include "str.h"
25 #include "tprintf.h"
26 #include "device.h"
27 #include "device/i2c_ioctl.h"
28 
29 #define MAX_I2C_DATA 256
30 
31 struct st_device *i2c_dev;
32 static const char def_dev_name[] = DEF_DEV_NAME_I2C;
33 static char *dev_name = (char *)def_dev_name;
34 static unsigned char reg_data[MAX_I2C_DATA];
35 
36 /*
37  I2Cデバイス検出
38 */
39 static int check_devaddr(unsigned int addr)
40 {
41  int rtn = 0;
42  unsigned char data = 0;
43 
44  lock_device(i2c_dev, 0);
45 
47  ioctl_device(i2c_dev, IOCMD_I2C_SLAVE_ADDR7, addr, 0);
48 
49  if(read_device(i2c_dev, &data, 1) >= 0) {
50  rtn = 1; // デバイス応答
51  }
52 
53  unlock_device(i2c_dev);
54 
55  return rtn;
56 }
57 
58 
59 static int detect(int argc, uchar *argv[]);
60 
61 /**
62  @brief I2Cデバイスを検出する
63 */
64 static const struct st_shell_command com_i2c_detect = {
65  .name = "detect",
66  .command = detect,
67  .usage_str = "[i2c_device_name]"
68 };
69 
70 static int detect(int argc, uchar *argv[])
71 {
72  unsigned int i;
73 
74  if(argc > 1) {
75  dev_name = (char *)argv[1];
76  }
77 
78  tprintf("[%s]\n", dev_name);
79 
80  i2c_dev = open_device(dev_name);
81  if(i2c_dev == 0) {
82  tprintf("Cannot open device \"%s\"\n", dev_name);
83  return -1;
84  }
85 
86  tprintf(" ");
87  for(i=0; i<0x10; i++) {
88  tprintf(" %1X", i);
89  }
90 
91 #if 0 // デバイスアドレス 0 は試さない
92  tprintf("\n00 : --");
93  for(i=1; i<0x80; i++) {
94 #else
95  for(i=0; i<0x80; i++) {
96 #endif
97  if((i % 0x10) == 0) {
98  tprintf("\n%02X :", i);
99  }
100 
101  if(check_devaddr(i) > 0) {
102  tprintf(" %02X", i);
103  } else {
104  tprintf(" --");
105  }
106  }
107 
108  tprintf("\n");
109 
110  close_device(i2c_dev);
111 
112  return 0;
113 }
114 
115 
116 static int dump(int argc, uchar *argv[]);
117 
118 /**
119  @brief I2Cデバイスのレジスタをダンプ表示する
120 */
121 static const struct st_shell_command com_i2c_dump = {
122  .name = "dump",
123  .command = dump,
124  .usage_str = "<device_address>"
125 };
126 
127 static int dump(int argc, uchar *argv[])
128 {
129  int rtn = 0;
130  unsigned int dev_addr;
131  unsigned int size = MAX_I2C_DATA;
132  unsigned int i, j;
133 
134  if(argc < 2) {
135  print_command_usage(&com_i2c_dump);
136  return 0;
137  }
138 
139  dev_addr = hstou(argv[1]);
140 
141  if(argc > 2) {
142  size = dstou(argv[2]);
143  if(size > MAX_I2C_DATA) {
144  size = MAX_I2C_DATA;
145  }
146  }
147 
148  i2c_dev = open_device(dev_name);
149  if(i2c_dev == 0) {
150  tprintf("Cannot open device \"%s\"\n", dev_name);
151  return -1;
152  }
153 
154  lock_device(i2c_dev, 0);
155 
157  ioctl_device(i2c_dev, IOCMD_I2C_SLAVE_ADDR7, dev_addr, 0);
158  seek_device(i2c_dev, SEEK_SET, 0);
159  rtn = read_device(i2c_dev, reg_data, size);
160 
161  unlock_device(i2c_dev);
162 
163  close_device(i2c_dev);
164 
165  for(j=0; j<size; j+=16) {
166  tprintf("%02X : ", j);
167  for(i=0; i<8; i++) {
168  tprintf("%02X ", (int)reg_data[j+i]);
169  }
170  tprintf(" ");
171  for(i=8; i<16; i++) {
172  tprintf("%02X ", (int)reg_data[j+i]);
173  }
174  tprintf("\n");
175  }
176 
177  return rtn;
178 }
179 
180 
181 
182 static int get(int argc, uchar *argv[]);
183 
184 /**
185  @brief I2Cデバイスのレジスタを1バイト読み出し表示する
186 */
187 static const struct st_shell_command com_i2c_get = {
188  .name = "get",
189  .command = get,
190  .usage_str = "<device_addr> <reg_addr> [size]"
191 };
192 
193 static int get(int argc, uchar *argv[])
194 {
195  int rtn = 0;
196  unsigned int dev_addr;
197  unsigned int size = 1;
198  int reg_addr;
199  unsigned int i;
200 
201  if(argc < 3) {
202  print_command_usage(&com_i2c_get);
203  return 0;
204  }
205 
206  dev_addr = hstou(argv[1]);
207  reg_addr = hstoi(argv[2]);
208 
209  if(argc > 3) {
210  size = dstou(argv[3]);
211  if(size > MAX_I2C_DATA) {
212  size = MAX_I2C_DATA;
213  }
214  }
215 
216  i2c_dev = open_device(dev_name);
217  if(i2c_dev == 0) {
218  tprintf("Cannot open device \"%s\"\n", dev_name);
219  return -1;
220  }
221 
222  lock_device(i2c_dev, 0);
223 
225  ioctl_device(i2c_dev, IOCMD_I2C_SLAVE_ADDR7, dev_addr, 0);
226  seek_device(i2c_dev, reg_addr, SEEK_SET);
227  rtn = read_device(i2c_dev, reg_data, size);
228 
229  unlock_device(i2c_dev);
230 
231  close_device(i2c_dev);
232 
233  tprintf("DEV-ADDR %02X - %02X :", dev_addr, reg_addr);
234  for(i=0; i<size; i++) {
235  tprintf(" %02X", (int)reg_data[i]);
236  }
237  tprintf("\n");
238 
239  return rtn;
240 }
241 
242 
243 static int put(int argc, uchar *argv[]);
244 
245 /**
246  @brief I2Cデバイスのレジスタに1バイト書き込む
247 */
248 static const struct st_shell_command com_i2c_put = {
249  .name = "put",
250  .command = put,
251  .usage_str = "<device_addr> <reg_addr> <val>"
252 };
253 
254 static int put(int argc, uchar *argv[])
255 {
256  int rtn = 0;
257  unsigned int dev_addr;
258  int reg_addr;
259  unsigned char data;
260 
261  if(argc < 3) {
262  print_command_usage(&com_i2c_put);
263  return 0;
264  }
265 
266  dev_addr = hstou(argv[1]);
267  reg_addr = hstou(argv[2]);
268  data = hstou(argv[3]);
269 
270  i2c_dev = open_device(dev_name);
271  if(i2c_dev == 0) {
272  tprintf("Cannot open device \"%s\"\n", dev_name);
273  return -1;
274  }
275 
276  lock_device(i2c_dev, 0);
277 
279  ioctl_device(i2c_dev, IOCMD_I2C_SLAVE_ADDR7, dev_addr, 0);
280  seek_device(i2c_dev, reg_addr, SEEK_SET);
281  rtn = putc_device(i2c_dev, data);
282 
283  unlock_device(i2c_dev);
284 
285  close_device(i2c_dev);
286 
287  return rtn;
288 }
289 
290 
291 static const struct st_shell_command * const com_i2c_list[] = {
293  &com_i2c_dump,
294  &com_i2c_get,
295  &com_i2c_put,
296  0
297 };
298 
299 const struct st_shell_command com_i2c = {
300  .name = "i2c",
301  .manual_str = "I2C operation commands",
302  .sublist = com_i2c_list
303 }; ///< I2Cデバイス情報取得、制御
static const struct st_shell_command com_i2c_put
I2Cデバイスのレジスタに1バイト書き込む
Definition: com_i2c.c:248
unsigned char uchar
GadgetSeedの文字(列)は unsigned char 型となる
Definition: str.h:13
シェルコマンド構造体
Definition: shell.h:33
コマンドシェル
#define IOCMD_I2C_MEMADDRSIZE
Memory Address Size 8bit or 16bit etc
Definition: i2c_ioctl.h:36
static const struct st_shell_command com_i2c_get
I2Cデバイスのレジスタを1バイト読み出し表示する
Definition: com_i2c.c:187
struct st_device * open_device(char *name)
デバイスをオープンする
Definition: device.c:262
ラインエディタ
文字列処理
int read_device(struct st_device *dev, void *buf, unsigned int count)
デバイスよりデータを読み出す
Definition: device.c:378
static const struct st_shell_command com_i2c_dump
I2Cデバイスのレジスタをダンプ表示する
Definition: com_i2c.c:121
int seek_device(struct st_device *dev, int offset, int whence)
デバイスのアクセスポイントを設定する
Definition: device.c:545
unsigned int dstou(uchar *str)
10進数文字列 unsigned int 変換
Definition: str.c:558
カーネルタイマ
#define I2C_MEM_ADDR_SIZE_8BIT
I2Cスレーブデバイスメモリアドレスサイズは8ビット
Definition: i2c_ioctl.h:26
unsigned int hstou(uchar *str)
16進数文字列 unsigned int 変換
Definition: str.c:180
int unlock_device(struct st_device *dev)
デバイスをアンロックする
Definition: device.c:343
Cortex-M4
uchar name[12]
コマンド名文字列
Definition: shell.h:34
int putc_device(struct st_device *dev, unsigned char data)
デバイスにデータを1バイト書き込む
Definition: device.c:502
#define IOCMD_I2C_SLAVE_ADDR7
Set Save 7bit Address
Definition: i2c_ioctl.h:33
int tprintf(const char *fmt,...)
簡易printf
Definition: tprintf.c:85
#define DEF_DEV_NAME_I2C
標準I2Cコントローラデバイス名
Definition: i2c_ioctl.h:15
#define SEEK_SET
設定
Definition: device.h:21
コンソールI/O
int hstoi(uchar *str)
16進数文字列 int 変換
Definition: str.c:145
int close_device(struct st_device *dev)
デバイスをクローズする
Definition: device.c:291
デバイスドライバAPI
デバイスドライバ構造体
Definition: device.h:25
I2Cドライバ ioctl 用マクロ定義
int ioctl_device(struct st_device *dev, unsigned int com, unsigned int arg, void *param)
デバイスを制御する
Definition: device.c:525
機能限定printf
static const struct st_shell_command com_i2c_detect
I2Cデバイスを検出する
Definition: com_i2c.c:64
int lock_device(struct st_device *dev, unsigned int timeout)
デバイスをロックする
Definition: device.c:310