1 | /*
|
---|
2 | * I2Céä¿¡é¢é£
|
---|
3 | *
|
---|
4 | * Copyright (c) 2016 Wakayama.rb Ruby Board developers
|
---|
5 | *
|
---|
6 | * This software is released under the MIT License.
|
---|
7 | * https://github.com/wakayamarb/wrbb-v2lib-firm/blob/master/MITL
|
---|
8 | *
|
---|
9 | */
|
---|
10 | #include <arduino.h>
|
---|
11 | /*#include <wire.h>*/
|
---|
12 |
|
---|
13 | #include <mruby.h>
|
---|
14 | #include <mruby/data.h>
|
---|
15 | #include <mruby/class.h>
|
---|
16 |
|
---|
17 | #include "../llbruby.h"
|
---|
18 | #include "sKernel.h"
|
---|
19 |
|
---|
20 | #define WIRE_MAX 6
|
---|
21 |
|
---|
22 | i2c_t *RbWire[WIRE_MAX]; /*0:Wire1, 1:Wire3, 2:Wire2, 3:Wire6 4:Wire7*/
|
---|
23 |
|
---|
24 | /******************************************************/
|
---|
25 | /* ã¡ã¢ãªã®éæ¾æã«èµ°ã*/
|
---|
26 | /******************************************************/
|
---|
27 | static void i2c_free(mrb_state *mrb, void *ptr)
|
---|
28 | {
|
---|
29 | i2c_t* i2c = (i2c_t*)(ptr);
|
---|
30 | mrb_free(mrb, i2c);
|
---|
31 | }
|
---|
32 |
|
---|
33 | /******************************************************/
|
---|
34 | /* ãã®æ§é ä½ã®æå³ã¯ããããã£ã¦ããªã*/
|
---|
35 | /******************************************************/
|
---|
36 | static struct mrb_data_type i2c_type = {"I2c", i2c_free};
|
---|
37 |
|
---|
38 | /******************************************************/
|
---|
39 | /* I2Cãåæåãã¾ã: I2c.new*/
|
---|
40 | /* I2c.new(num)ã*/
|
---|
41 | /* num: éä¿¡çªå·(0:SDA-0/SCL-1, 1:SDA-5/SCL-6, 2:SDA-7/SCL-8, 3:SDA-12/SCL-11, 4:SDA-9(26)/SCL-3)*/
|
---|
42 | /**/
|
---|
43 | /* æ»ãå¤*/
|
---|
44 | /* I2cã®ã¤ã³ã¹ã¿ã³ã¹*/
|
---|
45 | /******************************************************/
|
---|
46 | static mrb_value mrb_i2c_initialize(mrb_state *mrb, mrb_value self)
|
---|
47 | {
|
---|
48 | /* Initialize data type first, otherwise segmentation fault occurs.*/
|
---|
49 | DATA_TYPE(self) = &i2c_type;
|
---|
50 | DATA_PTR(self) = NULL;
|
---|
51 |
|
---|
52 | mrb_int num;
|
---|
53 |
|
---|
54 | mrb_get_args(mrb, "i", &num);
|
---|
55 |
|
---|
56 | if (num <= 0 && num >= WIRE_MAX) {
|
---|
57 | return mrb_nil_value(); /*æ»ãå¤ã¯ç¡ãã§ããã*/
|
---|
58 | }
|
---|
59 |
|
---|
60 | i2c_t* i2c = mrb_malloc(mrb, sizeof(i2c_t));
|
---|
61 | i2c_init(i2c, num, num);
|
---|
62 |
|
---|
63 | DATA_PTR(self) = i2c;
|
---|
64 | return self;
|
---|
65 | }
|
---|
66 |
|
---|
67 | /******************************************************/
|
---|
68 | /* ã¢ãã¬ã¹ã«ãã¼ã¿ãæ¸ãè¾¼ã¿ã¾ã: I2c.write*/
|
---|
69 | /* I2c.write( deviceID, address, data )*/
|
---|
70 | /* deviceID: ããã¤ã¹ID*/
|
---|
71 | /* address: æ¸ãè¾¼ã¿ã¢ãã¬ã¹*/
|
---|
72 | /* data: ãã¼ã¿*/
|
---|
73 | /**/
|
---|
74 | /* æ»ãå¤ã¯ä»¥ä¸ã®ã¨ãã*/
|
---|
75 | /* 0: æå*/
|
---|
76 | /* 4: ãã®ä»ã®ã¨ã©ã¼*/
|
---|
77 | /******************************************************/
|
---|
78 | mrb_value mrb_i2c_write(mrb_state *mrb, mrb_value self)
|
---|
79 | {
|
---|
80 | int deviceID, addr, dat;
|
---|
81 |
|
---|
82 | mrb_get_args(mrb, "iii", &deviceID, &addr, &dat);
|
---|
83 |
|
---|
84 | i2c_t* i2c = (i2c_t *)(mrb_get_datatype(mrb, self, &i2c_type));
|
---|
85 |
|
---|
86 | return mrb_fixnum_value(i2c_write(i2c, addr, (char *)&dat, sizeof(dat), 1));
|
---|
87 | }
|
---|
88 |
|
---|
89 | /******************************************************/
|
---|
90 | /* ã¢ãã¬ã¹ãããã¼ã¿ãèªã¿è¾¼ã¿: I2c.read*/
|
---|
91 | /* I2c.read( deviceID, addressL[, addressH] )*/
|
---|
92 | /* deviceID: ããã¤ã¹ID*/
|
---|
93 | /* addressL: èªã¿è¾¼ã¿ä¸ä½ã¢ãã¬ã¹*/
|
---|
94 | /* addressH: èªã¿è¾¼ã¿ä¸ä½ã¢ãã¬ã¹*/
|
---|
95 | /**/
|
---|
96 | /* æ»ãå¤ã¯èªã¿è¾¼ãã å¤*/
|
---|
97 | /******************************************************/
|
---|
98 | mrb_value mrb_i2c_read(mrb_state *mrb, mrb_value self)
|
---|
99 | {
|
---|
100 | int deviceID, addrL;
|
---|
101 | int addrH = 0;
|
---|
102 | int dat = 0;
|
---|
103 | /*byte datH;*/
|
---|
104 |
|
---|
105 | int n = mrb_get_args(mrb, "ii|i", &deviceID, &addrL, &addrH);
|
---|
106 |
|
---|
107 | i2c_t* i2c = (i2c_t *)(mrb_get_datatype(mrb, self, &i2c_type));
|
---|
108 |
|
---|
109 | i2c_read(i2c, addrL | (addrH << 8), (char *)&dat, sizeof(dat), 1);
|
---|
110 |
|
---|
111 | return mrb_fixnum_value(dat);
|
---|
112 | }
|
---|
113 |
|
---|
114 | /******************************************************/
|
---|
115 | /* I2Cããã¤ã¹ã«å¯¾ãã¦éä¿¡ãéå§ããããã®æºåããã: I2c.begin*/
|
---|
116 | /* I2c.begin( deviceID )*/
|
---|
117 | /* ãã®é¢æ°ã¯éä¿¡ãããã¡ãåæåããã ãã§ãå®éã®åä½ã¯è¡ããªããç¹°ãè¿ãå¼ã¶ã¨ãéä¿¡ãããã¡ãå
|
---|
118 | é ã«æ»ãã*/
|
---|
119 | /* deviceID: ããã¤ã¹ID 0ï½0x7Fã¾ã§ã®ç´ç²ãªã¢ãã¬ã¹*/
|
---|
120 | /******************************************************/
|
---|
121 | mrb_value mrb_i2c_beginTransmission(mrb_state *mrb, mrb_value self)
|
---|
122 | {
|
---|
123 | int deviceID;
|
---|
124 |
|
---|
125 | mrb_get_args(mrb, "i", &deviceID);
|
---|
126 |
|
---|
127 | i2c_t* i2c = (i2c_t *)(mrb_get_datatype(mrb, self, &i2c_type));
|
---|
128 |
|
---|
129 | i2c_start(i2c);
|
---|
130 | i2c_byte_write(i2c, deviceID);
|
---|
131 |
|
---|
132 | return mrb_nil_value(); /*æ»ãå¤ã¯ç¡ãã§ããã*/
|
---|
133 | }
|
---|
134 |
|
---|
135 | /******************************************************/
|
---|
136 | /* éä¿¡ãããã¡ã®æ«å°¾ã«æ°å¤ã追å ãã: I2c.lwrite*/
|
---|
137 | /* I2c.lwrite( data )*/
|
---|
138 | /* data: ã»ããããå¤*/
|
---|
139 | /**/
|
---|
140 | /* æ»ãå¤ã¯ãéä¿¡ãããã¤ãæ°(ãããã¡ã«æºãããã¤ãæ°)ãè¿ãã*/
|
---|
141 | /* éä¿¡ãããã¡(260ãã¤ã)ã«ç©ºã容éãç¡ããã°å¤±æãã¦0ãè¿ã*/
|
---|
142 | /******************************************************/
|
---|
143 | mrb_value mrb_i2c_lwrite(mrb_state *mrb, mrb_value self)
|
---|
144 | {
|
---|
145 | int dat;
|
---|
146 |
|
---|
147 | mrb_get_args(mrb, "i", &dat);
|
---|
148 |
|
---|
149 | i2c_t* i2c = (i2c_t *)(mrb_get_datatype(mrb, self, &i2c_type));
|
---|
150 |
|
---|
151 | return mrb_fixnum_value(i2c_byte_write(i2c, dat));
|
---|
152 | }
|
---|
153 |
|
---|
154 | /******************************************************/
|
---|
155 | /* ããã¤ã¹ã«å¯¾ãã¦I2Cã®éä¿¡ã·ã¼ã±ã³ã¹ãçºè¡ãã: I2c.end*/
|
---|
156 | /* I2c.end()*/
|
---|
157 | /* I2Cã®éä¿¡ã¯ãã®é¢æ°ãå®è¡ãã¦åãã¦å®éã«è¡ãããã*/
|
---|
158 | /**/
|
---|
159 | /* æ»ãå¤ã¯ä»¥ä¸ã®ã¨ãã*/
|
---|
160 | /* 0: æå*/
|
---|
161 | /* 4: ãã®ä»ã®ã¨ã©ã¼*/
|
---|
162 | /******************************************************/
|
---|
163 | mrb_value mrb_i2c_endTransmission(mrb_state *mrb, mrb_value self)
|
---|
164 | {
|
---|
165 | i2c_t* i2c = (i2c_t *)(mrb_get_datatype(mrb, self, &i2c_type));
|
---|
166 |
|
---|
167 | return mrb_fixnum_value(i2c_stop(i2c));
|
---|
168 | }
|
---|
169 |
|
---|
170 | /******************************************************/
|
---|
171 | /* ããã¤ã¹ã«å¯¾ãã¦åä¿¡ã·ã¼ã±ã³ã¹ãçºè¡ããã¼ã¿ãèªã¿åºã: I2c.request*/
|
---|
172 | /* I2c.request( address, count )*/
|
---|
173 | /* num: éä¿¡çªå·(0:SDA-0/SCL-1, 1:SDA-5/SCL-6, 2:SDA-7/SCL-8, 3:SDA-12/SCL-11, 4:SDA-9(26)/SCL-3)*/
|
---|
174 | /* address: èªã¿è¾¼ã¿éå§ã¢ãã¬ã¹*/
|
---|
175 | /* count: èªã¿åºãæ°*/
|
---|
176 | /**/
|
---|
177 | /* æ»ãå¤ã¯ãå®éã«åä¿¡ãããã¤ãæ°ã*/
|
---|
178 | /******************************************************/
|
---|
179 | mrb_value mrb_i2c_requestFrom(mrb_state *mrb, mrb_value self)
|
---|
180 | {
|
---|
181 | int addr, cnt, ret;
|
---|
182 | char rxdata[16];
|
---|
183 |
|
---|
184 | mrb_get_args(mrb, "ii", &addr, &cnt);
|
---|
185 |
|
---|
186 | i2c_t* i2c = (i2c_t *)(mrb_get_datatype(mrb, self, &i2c_type));
|
---|
187 |
|
---|
188 | ret = i2c_read(i2c, addr, rxdata, cnt, 1);
|
---|
189 |
|
---|
190 | return mrb_fixnum_value(ret);
|
---|
191 | }
|
---|
192 |
|
---|
193 | /******************************************************/
|
---|
194 | /* ããã¤ã¹ã«å¯¾ãã¦åä¿¡ã·ã¼ã±ã³ã¹ãçºè¡ããã¼ã¿ãèªã¿åºã: I2c.lread*/
|
---|
195 | /* I2c.lread()*/
|
---|
196 | /**/
|
---|
197 | /* æ»ãå¤ã¯èªã¿è¾¼ãã å¤*/
|
---|
198 | /******************************************************/
|
---|
199 | mrb_value mrb_i2c_lread(mrb_state *mrb, mrb_value self)
|
---|
200 | {
|
---|
201 | i2c_t* i2c = (i2c_t *)(mrb_get_datatype(mrb, self, &i2c_type));
|
---|
202 | return mrb_fixnum_value(i2c_byte_read(i2c, 1));
|
---|
203 | }
|
---|
204 |
|
---|
205 | /******************************************************/
|
---|
206 | /* ããã¤ã¹ã«å¯¾ãã¦åä¿¡ãããã¡å
|
---|
207 | ã«ãããã¼ã¿æ°ã調ã¹ã: I2c.available*/
|
---|
208 | /* I2c.available()*/
|
---|
209 | /**/
|
---|
210 | /* æ»ãå¤ã¯ãã¼ã¿æ°*/
|
---|
211 | /******************************************************/
|
---|
212 | mrb_value mrb_i2c_available(mrb_state *mrb, mrb_value self)
|
---|
213 | {
|
---|
214 | i2c_t* i2c = (i2c_t *)(mrb_get_datatype(mrb, self, &i2c_type));
|
---|
215 | return mrb_fixnum_value(1/*i2c_available(i2c)*/);
|
---|
216 | }
|
---|
217 | #if 0
|
---|
218 | /******************************************************/
|
---|
219 | /* å¨æ³¢æ°ãå¤æ´ãã: I2c.freq*/
|
---|
220 | /* I2c.freq( Hz )*/
|
---|
221 | /* Hz: ã¯ããã¯ã®å¨æ³¢æ°ãHzåä½ã§æå®ããã*/
|
---|
222 | /* æå¹ãªå¤ã¯1ï½200000ç¨åº¦ãåºæ¬çã«ã½ããã§ãã£ã¦ããã®ã§400kHzã¯åºãªãã*/
|
---|
223 | /******************************************************/
|
---|
224 | mrb_value mrb_i2c_freq(mrb_state *mrb, mrb_value self)
|
---|
225 | {
|
---|
226 | int fq;
|
---|
227 |
|
---|
228 | mrb_get_args(mrb, "i", &fq);
|
---|
229 |
|
---|
230 | i2c_frequency(i2c, fq);
|
---|
231 |
|
---|
232 | return mrb_nil_value(); /* æ»ãå¤ã¯ç¡ãã§ããã */
|
---|
233 | }
|
---|
234 | #endif
|
---|
235 | /******************************************************/
|
---|
236 | /* ã©ã¤ãã©ãªãå®ç¾©ãã¾ã*/
|
---|
237 | /******************************************************/
|
---|
238 | void i2c_Init(mrb_state *mrb)
|
---|
239 | {
|
---|
240 | /*0:Wire1, 1:Wire3, 2:Wire2, 3:Wire6 4:Wire7*/
|
---|
241 | RbWire[0] = NULL;
|
---|
242 | RbWire[1] = &Wire1;
|
---|
243 | RbWire[2] = &Wire2;
|
---|
244 | RbWire[3] = &Wire3;
|
---|
245 | RbWire[4] = &Wire4;
|
---|
246 | RbWire[5] = &Wire5;
|
---|
247 |
|
---|
248 | struct RClass *i2cModule = mrb_define_class(mrb, "I2c", mrb->object_class);
|
---|
249 | MRB_SET_INSTANCE_TT(i2cModule, MRB_TT_DATA);
|
---|
250 |
|
---|
251 | mrb_define_method(mrb, i2cModule, "initialize", mrb_i2c_initialize, MRB_ARGS_REQ(1));
|
---|
252 | mrb_define_method(mrb, i2cModule, "write", mrb_i2c_write, MRB_ARGS_REQ(3));
|
---|
253 | mrb_define_method(mrb, i2cModule, "read", mrb_i2c_read, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1));
|
---|
254 | mrb_define_method(mrb, i2cModule, "begin", mrb_i2c_beginTransmission, MRB_ARGS_REQ(1));
|
---|
255 | mrb_define_method(mrb, i2cModule, "lwrite", mrb_i2c_lwrite, MRB_ARGS_REQ(1));
|
---|
256 | mrb_define_method(mrb, i2cModule, "end", mrb_i2c_endTransmission, MRB_ARGS_NONE());
|
---|
257 | mrb_define_method(mrb, i2cModule, "request", mrb_i2c_requestFrom, MRB_ARGS_REQ(2));
|
---|
258 | mrb_define_method(mrb, i2cModule, "lread", mrb_i2c_lread, MRB_ARGS_NONE());
|
---|
259 | mrb_define_method(mrb, i2cModule, "available", mrb_i2c_available, MRB_ARGS_NONE());
|
---|
260 | }
|
---|