From 58bb4b9b4cc7d0e5eee9d2c5b0cb16237d889e4c Mon Sep 17 00:00:00 2001 From: Amaury Pouly Date: Fri, 6 Dec 2013 01:56:04 +0100 Subject: hwstub: implement i2c and i2c eeprom dump Change-Id: Iff1b4f40affb88c104e7322e25cdbe34f8886476 --- utils/hwstub/tools/lua/stmp/i2c.lua | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'utils/hwstub/tools/lua/stmp') diff --git a/utils/hwstub/tools/lua/stmp/i2c.lua b/utils/hwstub/tools/lua/stmp/i2c.lua index 209f1df4e2..dee5aaedb6 100644 --- a/utils/hwstub/tools/lua/stmp/i2c.lua +++ b/utils/hwstub/tools/lua/stmp/i2c.lua @@ -73,4 +73,38 @@ function STMP.i2c.transmit(slave_addr, buffer, send_stop) else return true end +end + +function STMP.i2c.receive(slave_addr, length) + if length > 4 then + error("PIO mode cannot receive mode than 4 bytes at once") + end + -- send address + HW.I2C.CTRL0.RETAIN_CLOCK.set() + STMP.i2c.transmit(bit32.bor(slave_addr, 1), {}, false, true) + HW.I2C.CTRL0.DIRECTION.clr() + HW.I2C.CTRL0.XFER_COUNT.write(length) + HW.I2C.CTRL0.SEND_NAK_ON_LAST.set() + HW.I2C.CTRL0.POST_SEND_STOP.set() + HW.I2C.CTRL0.RETAIN_CLOCK.clr() + HW.I2C.CTRL0.RUN.set() + while HW.I2C.CTRL0.RUN.read() == 1 do + end + if HW.I2C.CTRL1.NO_SLAVE_ACK_IRQ.read() == 1 then + if STMP.is_imx233() then + HW.I2C.CTRL1.CLR_GOT_A_NAK.set() + end + STMP.i2c.reset() + return nil + end + if HW.I2C.CTRL1.EARLY_TERM_IRQ.read() == 1 or HW.I2C.CTRL1.MASTER_LOSS_IRQ.read() == 1 then + return nil + else + local data = HW.I2C.DATA.read() + local res = {} + for i = 0, length - 1 do + table.insert(res, bit32.band(0xff, bit32.rshift(data, 8 * i))) + end + return res + end end \ No newline at end of file -- cgit v1.2.3