|
6 | 6 | import ctypes |
7 | 7 |
|
8 | 8 | from qiling.hw.peripheral import QlPeripheral |
| 9 | +from qiling.hw.connectivity import QlConnectivityPeripheral |
9 | 10 | from qiling.hw.const.stm32f4xx_i2c import I2C_CR1, I2C_CR2, I2C_SR1, I2C_SR2, I2C_DR, I2C_OAR1, I2C_OAR2 |
10 | 11 |
|
11 | 12 |
|
12 | | -class STM32F4xxI2c(QlPeripheral): |
| 13 | +class STM32F4xxI2c(QlConnectivityPeripheral): |
13 | 14 | class Type(ctypes.Structure): |
14 | 15 | """ the structure is available in : |
15 | 16 | stm32f423xx.h |
@@ -52,9 +53,6 @@ def __init__(self, ql, label, ev_intn=None, er_intn=None): |
52 | 53 | self.ev_intn = ev_intn # event interrupt |
53 | 54 | self.er_intn = er_intn # error interrupt |
54 | 55 |
|
55 | | - self.devices = [] |
56 | | - self.current = None |
57 | | - |
58 | 56 | self.reset() |
59 | 57 |
|
60 | 58 | def reset(self): |
@@ -141,21 +139,21 @@ def generate_stop(self): |
141 | 139 |
|
142 | 140 | self.i2c.SR1 |= I2C_SR1.STOPF |
143 | 141 | self.i2c.SR1 &= ~I2C_SR1.ADDR |
| 142 | + |
144 | 143 | self.set_slave_mode() |
| 144 | + self.send_event_interrupt() |
145 | 145 |
|
146 | 146 | def send_address(self): |
147 | 147 | if self.i2c.DR == self.i2c.OAR1 >> 1: |
148 | | - for dev in self.devices: |
149 | | - if self.i2c.DR == dev.address: |
150 | | - self.current = dev |
151 | 148 |
|
152 | 149 | # TODO: send ACK |
153 | 150 | self.i2c.SR1 |= I2C_SR1.ADDR | I2C_SR1.TXE |
154 | 151 | self.send_event_interrupt() |
155 | 152 |
|
156 | 153 | def send_data(self): |
157 | 154 | self.i2c.SR1 |= I2C_SR1.BTF | I2C_SR1.TXE |
158 | | - self.current.send(self.i2c.DR) |
| 155 | + |
| 156 | + self.send_to_user(self.i2c.DR) |
159 | 157 | self.send_event_interrupt() |
160 | 158 |
|
161 | 159 | ## I2C Status register 2 (I2C_SR2) |
@@ -189,16 +187,17 @@ def is_7bit_mode(self): |
189 | 187 | def fetch_device_address(self): |
190 | 188 | # dual addressing mode |
191 | 189 | if self.i2c.OAR2 & I2C_OAR2.ENDUAL: |
192 | | - self.i2c.OAR1 = self.devices[0].address << 1 |
193 | | - self.i2c.OAR2 = I2C_OAR2.ENDUAL | (self.devices[1].address << 1) |
| 190 | + self.i2c.OAR1 = self.device_list[0].address << 1 |
| 191 | + self.i2c.OAR2 = I2C_OAR2.ENDUAL | (self.device_list[1].address << 1) |
194 | 192 |
|
195 | 193 | # single device, 10-bit slave address |
196 | 194 | elif self.i2c.OAR1 & I2C_OAR1.ADDMODE: |
197 | | - self.i2c.OAR1 = I2C_OAR1.ADDMODE | self.devices[0].address |
| 195 | + self.i2c.OAR1 = I2C_OAR1.ADDMODE | self.device_list[0].address |
198 | 196 |
|
199 | 197 | # single device, 7-bit slave address |
200 | 198 | else: |
201 | | - self.i2c.OAR1 = self.devices[0].address << 1 |
| 199 | + self.i2c.OAR1 = self.device_list[0].address << 1 |
202 | 200 |
|
203 | | - def connect(self, dev): |
204 | | - self.devices.append(dev) |
| 201 | + @QlConnectivityPeripheral.device_handler |
| 202 | + def step(self): |
| 203 | + pass |
0 commit comments