28
28
def reverseByteOrder (data ):
29
29
"""Reverses the byte order of an int (16-bit) or long (32-bit) value."""
30
30
# Courtesy Vishal Sapre
31
- byteCount = len (hex (data )[2 :].replace ('L' ,'' )[::2 ])
32
- val = 0
31
+ byteCount = len (hex (data )[2 :].replace ('L' , '' )[::2 ])
32
+ val = 0
33
33
for i in range (byteCount ):
34
- val = (val << 8 ) | (data & 0xff )
34
+ val = (val << 8 ) | (data & 0xff )
35
35
data >>= 8
36
36
return val
37
37
38
+
38
39
def get_default_bus ():
39
40
"""Return the default bus number based on the device platform. For a
40
41
Raspberry Pi either bus 0 or 1 (based on the Pi revision) will be returned.
@@ -49,11 +50,13 @@ def get_default_bus():
49
50
# Revision 2 Pi uses I2C bus 1.
50
51
return 1
51
52
elif plat == Platform .BEAGLEBONE_BLACK :
52
- # Beaglebone Black has multiple I2C buses, default to 1 (P9_19 and P9_20).
53
+ # Beaglebone Black has multiple I2C buses, default to 1 (P9_19 and
54
+ # P9_20).
53
55
return 1
54
56
else :
55
57
raise RuntimeError ('Could not determine default I2C bus for platform.' )
56
58
59
+
57
60
def get_i2c_device (address , busnum = None , i2c_interface = None , ** kwargs ):
58
61
"""Return an I2C device for the specified address and on the specified bus.
59
62
If busnum isn't specified, the default I2C bus for the platform will attempt
@@ -63,6 +66,7 @@ def get_i2c_device(address, busnum=None, i2c_interface=None, **kwargs):
63
66
busnum = get_default_bus ()
64
67
return Device (address , busnum , i2c_interface , ** kwargs )
65
68
69
+
66
70
def require_repeated_start ():
67
71
"""Enable repeated start conditions for I2C register reads. This is the
68
72
normal behavior for I2C, however on some platforms like the Raspberry Pi
@@ -76,8 +80,10 @@ def require_repeated_start():
76
80
# repeated start condition like the kernel smbus I2C driver functions
77
81
# define. As a workaround this bit in the BCM2708 driver sysfs tree can
78
82
# be changed to enable I2C repeated starts.
79
- subprocess .check_call ('chmod 666 /sys/module/i2c_bcm2708/parameters/combined' , shell = True )
80
- subprocess .check_call ('echo -n 1 > /sys/module/i2c_bcm2708/parameters/combined' , shell = True )
83
+ subprocess .check_call (
84
+ 'chmod 666 /sys/module/i2c_bcm2708/parameters/combined' , shell = True )
85
+ subprocess .check_call (
86
+ 'echo -n 1 > /sys/module/i2c_bcm2708/parameters/combined' , shell = True )
81
87
# Other platforms are a no-op because they (presumably) have the correct
82
88
# behavior and send repeated starts.
83
89
@@ -87,6 +93,7 @@ class Device(object):
87
93
python smbus library, or other smbus compatible I2C interface. Allows reading
88
94
and writing 8-bit, 16-bit, and byte array values to registers
89
95
on the device."""
96
+
90
97
def __init__ (self , address , busnum , i2c_interface = None ):
91
98
"""Create an instance of the I2C device at the specified address on the
92
99
specified I2C bus number."""
@@ -98,56 +105,60 @@ def __init__(self, address, busnum, i2c_interface=None):
98
105
else :
99
106
# Otherwise use the provided class to create an smbus interface.
100
107
self ._bus = i2c_interface (busnum )
101
- self ._logger = logging .getLogger ('Adafruit_I2C.Device.Bus.{0}.Address.{1:#0X}' \
102
- .format (busnum , address ))
108
+ self ._logger = logging .getLogger ('Adafruit_I2C.Device.Bus.{0}.Address.{1:#0X}'
109
+ .format (busnum , address ))
110
+ self .regvals = [None ] * 256
103
111
104
112
def writeRaw8 (self , value ):
105
113
"""Write an 8-bit value on the bus (without register)."""
106
114
value = value & 0xFF
107
115
self ._bus .write_byte (self ._address , value )
108
116
self ._logger .debug ("Wrote 0x%02X" ,
109
- value )
117
+ value )
110
118
111
119
def write8 (self , register , value ):
112
120
"""Write an 8-bit value to the specified register."""
113
- value = value & 0xFF
114
- self ._bus .write_byte_data (self ._address , register , value )
115
- self ._logger .debug ("Wrote 0x%02X to register 0x%02X" ,
116
- value , register )
121
+ if self .regvals [register ] is None or self .regvals [register ] != value :
122
+ value = value & 0xFF
123
+ self ._bus .write_byte_data (self ._address , register , value )
124
+ self .regvals [register ] = value
125
+ self ._logger .debug (
126
+ "Wrote 0x%02X to register 0x%02X" , value , register )
117
127
118
128
def write16 (self , register , value ):
119
129
"""Write a 16-bit value to the specified register."""
120
130
value = value & 0xFFFF
121
131
self ._bus .write_word_data (self ._address , register , value )
122
132
self ._logger .debug ("Wrote 0x%04X to register pair 0x%02X, 0x%02X" ,
123
- value , register , register + 1 )
133
+ value , register , register + 1 )
124
134
125
135
def writeList (self , register , data ):
126
136
"""Write bytes to the specified register."""
127
137
self ._bus .write_i2c_block_data (self ._address , register , data )
128
138
self ._logger .debug ("Wrote to register 0x%02X: %s" ,
129
- register , data )
139
+ register , data )
130
140
131
141
def readList (self , register , length ):
132
142
"""Read a length number of bytes from the specified register. Results
133
143
will be returned as a bytearray."""
134
- results = self ._bus .read_i2c_block_data (self ._address , register , length )
144
+ results = self ._bus .read_i2c_block_data (
145
+ self ._address , register , length )
135
146
self ._logger .debug ("Read the following from register 0x%02X: %s" ,
136
- register , results )
147
+ register , results )
137
148
return results
138
149
139
150
def readRaw8 (self ):
140
151
"""Read an 8-bit value on the bus (without register)."""
141
152
result = self ._bus .read_byte (self ._address ) & 0xFF
142
153
self ._logger .debug ("Read 0x%02X" ,
143
- result )
154
+ result )
144
155
return result
145
156
146
157
def readU8 (self , register ):
147
158
"""Read an unsigned byte from the specified register."""
148
159
result = self ._bus .read_byte_data (self ._address , register ) & 0xFF
149
160
self ._logger .debug ("Read 0x%02X from register 0x%02X" ,
150
- result , register )
161
+ result , register )
151
162
return result
152
163
153
164
def readS8 (self , register ):
@@ -161,9 +172,9 @@ def readU16(self, register, little_endian=True):
161
172
"""Read an unsigned 16-bit value from the specified register, with the
162
173
specified endianness (default little endian, or least significant byte
163
174
first)."""
164
- result = self ._bus .read_word_data (self ._address ,register ) & 0xFFFF
175
+ result = self ._bus .read_word_data (self ._address , register ) & 0xFFFF
165
176
self ._logger .debug ("Read 0x%04X from register pair 0x%02X, 0x%02X" ,
166
- result , register , register + 1 )
177
+ result , register , register + 1 )
167
178
# Swap bytes if using big endian because read_word_data assumes little
168
179
# endian on ARM (little endian) systems.
169
180
if not little_endian :
0 commit comments