11'''Helper class to access on board eeprom'''
22
33import logging
4+ import math
45
5- from edgepi .calibration .eeprom_constants import EEPROMAddress
6+ from edgepi .calibration .eeprom_constants import EEPROMInfo
67from edgepi .peripherals .i2c import I2CDevice
78
8-
9+ #TODO: Maybe use protobuff
10+ #TODO: EEPROM should return structured data class of parameters to calibration class.
911class EdgePiEEPROM (I2CDevice ):
1012 '''
1113 Helper class to read eeprom using I2C
@@ -16,6 +18,31 @@ def __init__(self):
1618 self .log = logging .getLogger (__name__ )
1719 super ().__init__ (self .__dev_path )
1820
21+ def __pack_mem_address (self , page_addr : int = None , byte_addr : int = None ):
22+ """
23+ Pack page address and byte address to generate address message. The address message will
24+ let the EEPROM memory address point to know at which address the read/write operation to
25+ take in place
26+ Args:
27+ page_addr (int): page address (0~511)
28+ byte_addr (int): byte address in the page(0~63)
29+ return:
30+ (list): 2-byte address message
31+ """
32+ address = page_addr << 6 | byte_addr
33+ return [(address >> 8 )& 0xFF , address & 0xFF ]
34+
35+ def __byte_address_generation (self , memory_address : int = None ):
36+ """
37+ Generates page address and bytes address from the memory address provided.
38+ Args:
39+ memory_address (int): memory address to start read/write operation. This is in bytes
40+ from 0 - 32768
41+ """
42+ page_addr = math .floor (memory_address / EEPROMInfo .PAGE_SIZE .value )
43+ byte_addr = memory_address % EEPROMInfo .PAGE_SIZE .value
44+ self .log .debug (f'Page address = { page_addr } , byte Address = { byte_addr } ' )
45+ return page_addr , byte_addr
1946
2047 def sequential_read (self , mem_addr : int = None , length : int = None ):
2148 '''
@@ -28,9 +55,11 @@ def sequential_read(self, mem_addr: int = None, length: int = None):
2855 List of read data
2956
3057 '''
31- msg = self .set_read_msg (mem_addr , [0x00 ]* length )
58+ page_addr , byte_addr = self .__byte_address_generation (mem_addr )
59+ mem_addr_list = self .__pack_mem_address (page_addr , byte_addr )
60+ msg = self .set_read_msg (mem_addr_list , [0x00 ]* length )
3261 self .log .debug (f'Reading Address { mem_addr } , { length } bytes, { msg [1 ].data } ' )
33- read_result = self .transfer (EEPROMAddress .DEV_ADDR .value , msg )
62+ read_result = self .transfer (EEPROMInfo .DEV_ADDR .value , msg )
3463 self .log .debug (f'Read data: { msg [1 ].data } ' )
3564 return read_result
3665
@@ -43,9 +72,11 @@ def selective_read(self, mem_addr: int = None):
4372 Returns:
4473 List of read data
4574 '''
75+ page_addr , byte_addr = self .__byte_address_generation (mem_addr )
76+ mem_addr_list = self .__pack_mem_address (page_addr , byte_addr )
4677 msg = self .set_read_msg (mem_addr , [0x00 ])
47- self .log .debug (f'Reading Address { mem_addr } , { msg [1 ].data } ' )
48- read_result = self .transfer (EEPROMAddress .DEV_ADDR .value , msg )
78+ self .log .debug (f'Reading Address { mem_addr_list } , { msg [1 ].data } ' )
79+ read_result = self .transfer (EEPROMInfo .DEV_ADDR .value , msg )
4980 self .log .debug (f'Read data: { msg [1 ].data } ' )
5081 return read_result
5182
@@ -58,9 +89,11 @@ def byte_write_register(self, mem_addr: int = None, data: int = None):
5889 Returns:
5990 N/A
6091 '''
61- msg = self .set_write_msg (mem_addr , [data ])
92+ page_addr , byte_addr = self .__byte_address_generation (mem_addr )
93+ mem_addr_list = self .__pack_mem_address (page_addr , byte_addr )
94+ msg = self .set_write_msg (mem_addr_list , [data ])
6295 self .log .debug (f'Writing { data } to memory address of { mem_addr } , { msg [0 ].data } ' )
63- self .transfer (EEPROMAddress .DEV_ADDR .value , msg )
96+ self .transfer (EEPROMInfo .DEV_ADDR .value , msg )
6497
6598 def page_write_register (self , mem_addr : int = None , data : list = None ):
6699 '''
@@ -71,6 +104,8 @@ def page_write_register(self, mem_addr: int = None, data: list = None):
71104 Returns:
72105 N/A
73106 '''
74- msg = self .set_write_msg (mem_addr , data )
107+ page_addr , byte_addr = self .__byte_address_generation (mem_addr )
108+ mem_addr_list = self .__pack_mem_address (page_addr , byte_addr )
109+ msg = self .set_write_msg (mem_addr_list , data )
75110 self .log .debug (f'Writing { data } to memory address of { mem_addr } , { msg [0 ].data } ' )
76- self .transfer (EEPROMAddress .DEV_ADDR .value , msg )
111+ self .transfer (EEPROMInfo .DEV_ADDR .value , msg )
0 commit comments