[270] | 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 | }
|
---|