mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 15:15:44 +00:00
@@ -48,6 +48,23 @@ static uint16_t eeprom_i2c_addr(eeprom *dev, uint32_t off)
|
|||||||
| ((off >> dev->i2c_address_shift) & dev->i2c_address_mask);
|
| ((off >> dev->i2c_address_shift) & dev->i2c_address_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void eeprom_set_addr(
|
||||||
|
const eeprom *dev,
|
||||||
|
uint32_t off,
|
||||||
|
uint8_t addr[EEPROM_MAX_ADDRESS_BYTES]
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int shift = 24 - (4 - dev->address_bytes) * 8;
|
||||||
|
|
||||||
|
addr[0] = (uint8_t) (off >> shift);
|
||||||
|
shift -= 8;
|
||||||
|
addr[1] = (uint8_t) (off >> shift);
|
||||||
|
shift -= 8;
|
||||||
|
addr[2] = (uint8_t) (off >> shift);
|
||||||
|
shift -= 8;
|
||||||
|
addr[3] = (uint8_t) (off >> shift);
|
||||||
|
}
|
||||||
|
|
||||||
static ssize_t eeprom_read(
|
static ssize_t eeprom_read(
|
||||||
i2c_dev *base,
|
i2c_dev *base,
|
||||||
void *buf,
|
void *buf,
|
||||||
@@ -80,12 +97,7 @@ static ssize_t eeprom_read(
|
|||||||
*/
|
*/
|
||||||
uint16_t cur = (uint16_t) (todo < 255 ? todo : 255);
|
uint16_t cur = (uint16_t) (todo < 255 ? todo : 255);
|
||||||
|
|
||||||
uint8_t addr[EEPROM_MAX_ADDRESS_BYTES] = {
|
uint8_t addr[EEPROM_MAX_ADDRESS_BYTES];
|
||||||
(uint8_t) off,
|
|
||||||
(uint8_t) (off >> 8),
|
|
||||||
(uint8_t) (off >> 16),
|
|
||||||
(uint8_t) (off >> 24)
|
|
||||||
};
|
|
||||||
i2c_msg msgs[2] = {
|
i2c_msg msgs[2] = {
|
||||||
{
|
{
|
||||||
.addr = i2c_addr,
|
.addr = i2c_addr,
|
||||||
@@ -101,6 +113,7 @@ static ssize_t eeprom_read(
|
|||||||
};
|
};
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
eeprom_set_addr(dev, off, addr);
|
||||||
err = i2c_bus_transfer(dev->base.bus, &msgs[0], RTEMS_ARRAY_SIZE(msgs));
|
err = i2c_bus_transfer(dev->base.bus, &msgs[0], RTEMS_ARRAY_SIZE(msgs));
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
return err;
|
return err;
|
||||||
@@ -141,12 +154,7 @@ static ssize_t eeprom_write(
|
|||||||
uint16_t i2c_addr = eeprom_i2c_addr(dev, off);
|
uint16_t i2c_addr = eeprom_i2c_addr(dev, off);
|
||||||
uint16_t rem = dev->page_size - (off & (dev->page_size - 1));
|
uint16_t rem = dev->page_size - (off & (dev->page_size - 1));
|
||||||
uint16_t cur = (uint16_t) (todo < rem ? todo : rem);
|
uint16_t cur = (uint16_t) (todo < rem ? todo : rem);
|
||||||
uint8_t addr[EEPROM_MAX_ADDRESS_BYTES] = {
|
uint8_t addr[EEPROM_MAX_ADDRESS_BYTES];
|
||||||
(uint8_t) off,
|
|
||||||
(uint8_t) (off >> 8),
|
|
||||||
(uint8_t) (off >> 16),
|
|
||||||
(uint8_t) (off >> 24)
|
|
||||||
};
|
|
||||||
i2c_msg msgs[2] = {
|
i2c_msg msgs[2] = {
|
||||||
{
|
{
|
||||||
.addr = i2c_addr,
|
.addr = i2c_addr,
|
||||||
@@ -165,6 +173,7 @@ static ssize_t eeprom_write(
|
|||||||
ssize_t m;
|
ssize_t m;
|
||||||
rtems_interval timeout;
|
rtems_interval timeout;
|
||||||
|
|
||||||
|
eeprom_set_addr(dev, off, addr);
|
||||||
err = i2c_bus_transfer(dev->base.bus, &msgs[0], RTEMS_ARRAY_SIZE(msgs));
|
err = i2c_bus_transfer(dev->base.bus, &msgs[0], RTEMS_ARRAY_SIZE(msgs));
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
return err;
|
return err;
|
||||||
|
|||||||
Reference in New Issue
Block a user