aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/common/lib/hardware/i2c-eeprom-block.frt
diff options
context:
space:
mode:
Diffstat (limited to 'amforth-6.5/common/lib/hardware/i2c-eeprom-block.frt')
-rw-r--r--amforth-6.5/common/lib/hardware/i2c-eeprom-block.frt77
1 files changed, 77 insertions, 0 deletions
diff --git a/amforth-6.5/common/lib/hardware/i2c-eeprom-block.frt b/amforth-6.5/common/lib/hardware/i2c-eeprom-block.frt
new file mode 100644
index 0000000..22351fb
--- /dev/null
+++ b/amforth-6.5/common/lib/hardware/i2c-eeprom-block.frt
@@ -0,0 +1,77 @@
+\
+\ I2C EEPROM driver for BLOCK wordset
+\
+\ call i2c.ee.blockinit to activate the driver
+\ for the BLOCK words.
+
+#require blocks.frt
+#require bounds.frt
+#require i2c-eeprom.frt
+#require ms.frt
+
+\ select a eeprom module.
+\ the pages differ in size.
+\ do not overrun them
+#16 constant 24c08
+#16 constant 24c16
+#32 constant 24c32
+#32 constant 24c64
+#64 constant 24c128
+#64 constant 24c256
+#128 constant 24c512
+#256 constant 24c1024
+
+\ runtime configurable parameters, taken from or
+\ calculated in i2c.ee.blockinit. Never change them directly
+variable i2c.ee.hwid
+variable i2c.ee.pagesize
+variable i2c.ee.pages/block
+
+: i2c.ee.read-page ( addr len page hwid -- )
+ dup i2c.begin
+ swap i2c.ee.pagesize @ * i2c.ee.send-addr
+ i2c.restart \ repeated start
+ i2c.rd i2c.tx
+ 1- bounds over >r ?do i2c.rx i c! loop
+ i2c.rxn r> c! \ last byte
+ i2c.end
+;
+
+: i2c.ee.load-buffer ( a-addr u -- ) \ BLOCK API
+ 1- i2c.ee.pages/block @ * \ start address
+ i2c.ee.pages/block @ bounds ?do
+ dup i2c.ee.pagesize @ i i2c.ee.hwid @ i2c.ee.read-page
+ i2c.ee.pagesize @ +
+ loop drop
+;
+
+: i2c.ee.write-page ( addr len page hwid -- )
+ i2c.begin
+ i2c.ee.pagesize @ * i2c.ee.send-addr
+ bounds ?do i c@ i2c.tx loop
+ i2c.end 5 ms \ make sure the eeprom gets ready again
+;
+
+: i2c.ee.save-buffer ( a-addr u -- ) \ BLOCK API
+ 1- i2c.ee.pages/block @ * \ start address
+ i2c.ee.pages/block @ bounds ?do
+ dup i2c.ee.pagesize @ i i2c.ee.hwid @ i2c.ee.write-page
+ i2c.ee.pagesize @ +
+ loop drop
+;
+
+\ adjust the page size and update the #pages per block buffer
+: i2c.ee.setpagesize ( 24cxx -- )
+ blocksize over / i2c.ee.pages/block !
+ i2c.ee.pagesize !
+;
+
+\ for turnkey
+\ does not initialize TWI/I2C interface! (i2c.init.default)
+: i2c.ee.blockinit ( pagesize hwid -- )
+ block:init
+ ['] i2c.ee.load-buffer is load-buffer
+ ['] i2c.ee.save-buffer is save-buffer
+ i2c.ee.hwid !
+ i2c.ee.setpagesize
+;