21
21
I2CEEBlockDevice::I2CEEBlockDevice (
22
22
PinName sda, PinName scl, uint8_t addr,
23
23
bd_size_t size, bd_size_t block, int freq)
24
- : _i2c(sda, scl), _i2c_addr(addr), _size(size), _block(block)
24
+ : _i2c_addr(addr), _size(size), _block(block)
25
25
{
26
- _i2c.frequency (freq);
26
+ _i2c = new (_i2c_buffer) I2C (sda, scl);
27
+ _i2c->frequency (freq);
28
+ }
29
+
30
+ I2CEEBlockDevice::I2CEEBlockDevice (
31
+ I2C * i2c_obj, uint8_t addr,
32
+ bd_size_t size, bd_size_t block)
33
+ : _i2c_addr(addr), _size(size), _block(block)
34
+ {
35
+ _i2c = i2c_obj;
36
+ }
37
+ I2CEEBlockDevice::~I2CEEBlockDevice ()
38
+ {
39
+ if (_i2c == (I2C*)_i2c_buffer) {
40
+ _i2c->~I2C ();
41
+ }
27
42
}
28
43
29
44
int I2CEEBlockDevice::init ()
@@ -41,15 +56,15 @@ int I2CEEBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
41
56
// Check the address and size fit onto the chip.
42
57
MBED_ASSERT (is_valid_read (addr, size));
43
58
44
- _i2c. start ();
45
- if (!_i2c. write (_i2c_addr | 0 ) ||
46
- !_i2c. write ((char )(addr >> 8 )) ||
47
- !_i2c. write ((char )(addr & 0xff ))) {
59
+ _i2c-> start ();
60
+ if (!_i2c-> write (_i2c_addr | 0 ) ||
61
+ !_i2c-> write ((char )(addr >> 8 )) ||
62
+ !_i2c-> write ((char )(addr & 0xff ))) {
48
63
return BD_ERROR_DEVICE_ERROR;
49
64
}
50
- _i2c. stop ();
65
+ _i2c-> stop ();
51
66
52
- if (_i2c. read (_i2c_addr, static_cast <char *>(buffer), size) < 0 ) {
67
+ if (_i2c-> read (_i2c_addr, static_cast <char *>(buffer), size) < 0 ) {
53
68
return BD_ERROR_DEVICE_ERROR;
54
69
}
55
70
@@ -66,17 +81,17 @@ int I2CEEBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size
66
81
uint32_t off = addr % _block;
67
82
uint32_t chunk = (off + size < _block) ? size : (_block - off);
68
83
69
- _i2c. start ();
70
- if (!_i2c. write (_i2c_addr | 0 ) ||
71
- !_i2c. write ((char )(addr >> 8 )) ||
72
- !_i2c. write ((char )(addr & 0xff ))) {
84
+ _i2c-> start ();
85
+ if (!_i2c-> write (_i2c_addr | 0 ) ||
86
+ !_i2c-> write ((char )(addr >> 8 )) ||
87
+ !_i2c-> write ((char )(addr & 0xff ))) {
73
88
return BD_ERROR_DEVICE_ERROR;
74
89
}
75
90
76
91
for (unsigned i = 0 ; i < chunk; i++) {
77
- _i2c. write (static_cast <const char *>(buffer)[i]);
92
+ _i2c-> write (static_cast <const char *>(buffer)[i]);
78
93
}
79
- _i2c. stop ();
94
+ _i2c-> stop ();
80
95
81
96
int err = _sync ();
82
97
if (err) {
@@ -103,7 +118,7 @@ int I2CEEBlockDevice::_sync()
103
118
// so loop trying to do a zero byte write until it is ACKed
104
119
// by the chip.
105
120
for (int i = 0 ; i < I2CEE_TIMEOUT; i++) {
106
- if (_i2c. write (_i2c_addr | 0 , 0 , 0 ) < 1 ) {
121
+ if (_i2c-> write (_i2c_addr | 0 , 0 , 0 ) < 1 ) {
107
122
return 0 ;
108
123
}
109
124
0 commit comments