@@ -22,17 +22,21 @@ using namespace mbed;
2222
2323I2CEEBlockDevice::I2CEEBlockDevice (
2424 PinName sda, PinName scl, uint8_t addr,
25- bd_size_t size, bd_size_t block, int freq)
26- : _i2c_addr(addr), _size(size), _block(block)
25+ bd_size_t size, bd_size_t block, int freq,
26+ bool address_is_eight_bit)
27+ : _i2c_addr(addr), _size(size), _block(block),
28+ _address_is_eight_bit(address_is_eight_bit)
2729{
2830 _i2c = new (_i2c_buffer) I2C (sda, scl);
2931 _i2c->frequency (freq);
3032}
3133
3234I2CEEBlockDevice::I2CEEBlockDevice (
3335 I2C *i2c_obj, uint8_t addr,
34- bd_size_t size, bd_size_t block)
35- : _i2c_addr(addr), _size(size), _block(block)
36+ bd_size_t size, bd_size_t block,
37+ bool address_is_eight_bit)
38+ : _i2c_addr(addr), _size(size), _block(block),
39+ _address_is_eight_bit(address_is_eight_bit)
3640{
3741 _i2c = i2c_obj;
3842}
@@ -58,43 +62,61 @@ int I2CEEBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
5862 // Check the address and size fit onto the chip.
5963 MBED_ASSERT (is_valid_read (addr, size));
6064
65+ auto *pBuffer = static_cast <char *>(buffer);
66+
6167 _i2c->start ();
6268
63- if (!_i2c->write (_i2c_addr | 0 ) ||
64- !_i2c->write ((char )(addr >> 8 )) ||
65- !_i2c->write ((char )(addr & 0xff ))) {
69+ if (1 != _i2c->write (get_paged_device_address (addr))) {
70+ return BD_ERROR_DEVICE_ERROR;
71+ }
72+
73+ if (!_address_is_eight_bit && 1 != _i2c->write ((char )(addr >> 8u ))) {
74+ return BD_ERROR_DEVICE_ERROR;
75+ }
76+
77+ if (1 != _i2c->write ((char )(addr & 0xffu ))) {
6678 return BD_ERROR_DEVICE_ERROR;
6779 }
6880
6981 _i2c->stop ();
7082
71- if (_i2c->read (_i2c_addr, static_cast < char *>(buffer) , size) < 0 ) {
83+ if (0 != _i2c->read (_i2c_addr, pBuffer , size)) {
7284 return BD_ERROR_DEVICE_ERROR;
7385 }
7486
75- return 0 ;
87+ return BD_ERROR_OK ;
7688}
7789
7890int I2CEEBlockDevice::program (const void *buffer, bd_addr_t addr, bd_size_t size)
7991{
8092 // Check the addr and size fit onto the chip.
8193 MBED_ASSERT (is_valid_program (addr, size));
8294
95+ const auto *pBuffer = static_cast <const char *>(buffer);
96+
8397 // While we have some more data to write.
8498 while (size > 0 ) {
8599 uint32_t off = addr % _block;
86100 uint32_t chunk = (off + size < _block) ? size : (_block - off);
87101
88102 _i2c->start ();
89103
90- if (!_i2c->write (_i2c_addr | 0 ) ||
91- !_i2c->write ((char )(addr >> 8 )) ||
92- !_i2c->write ((char )(addr & 0xff ))) {
104+ if (1 != _i2c->write (get_paged_device_address (addr))) {
105+ return BD_ERROR_DEVICE_ERROR;
106+ }
107+
108+ if (!_address_is_eight_bit && 1 != _i2c->write ((char )(addr >> 8u ))) {
109+ return BD_ERROR_DEVICE_ERROR;
110+ }
111+
112+ if (1 != _i2c->write ((char )(addr & 0xffu ))) {
93113 return BD_ERROR_DEVICE_ERROR;
94114 }
95115
96116 for (unsigned i = 0 ; i < chunk; i++) {
97- _i2c->write (static_cast <const char *>(buffer)[i]);
117+ if (1 != _i2c->write (pBuffer[i])) {
118+ return BD_ERROR_DEVICE_ERROR;
119+ }
98120 }
99121
100122 _i2c->stop ();
@@ -107,10 +129,10 @@ int I2CEEBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size
107129
108130 addr += chunk;
109131 size -= chunk;
110- buffer = static_cast < const char *>(buffer) + chunk;
132+ pBuffer += chunk;
111133 }
112134
113- return 0 ;
135+ return BD_ERROR_OK ;
114136}
115137
116138int I2CEEBlockDevice::erase (bd_addr_t addr, bd_size_t size)
@@ -159,3 +181,14 @@ const char *I2CEEBlockDevice::get_type() const
159181{
160182 return " I2CEE" ;
161183}
184+
185+ uint8_t I2CEEBlockDevice::get_paged_device_address (bd_addr_t address)
186+ {
187+ if (!_address_is_eight_bit) {
188+ return _i2c_addr;
189+ } else {
190+ // Use the three least significant bits of the 2nd byte as the page
191+ // The page will be bits 2-4 of the user defined addresses.
192+ return _i2c_addr | ((address & 0x0700u ) >> 7u );
193+ }
194+ }
0 commit comments