aboutsummaryrefslogtreecommitdiffstats
path: root/app/i2c_bb.c
diff options
context:
space:
mode:
authorroot <root@ka-ata-killa.ourano.james.local>2021-03-03 15:24:13 +0000
committerroot <root@ka-ata-killa.ourano.james.local>2021-03-03 16:03:28 +0000
commit49148e76706e5e24c2ba7f6ccc1d7ec4736ab2f3 (patch)
treef65cb7440711ea1708c25fe78819e9986b2d8566 /app/i2c_bb.c
parent129a103238d69bd90b4fe9a44bbed943b9488fc2 (diff)
downloadserial_over_dp-49148e76706e5e24c2ba7f6ccc1d7ec4736ab2f3.tar.gz
serial_over_dp-49148e76706e5e24c2ba7f6ccc1d7ec4736ab2f3.tar.bz2
serial_over_dp-49148e76706e5e24c2ba7f6ccc1d7ec4736ab2f3.zip
support cheap chinese blue pill boards, make usb dfu compatible with dfuse
Diffstat (limited to 'app/i2c_bb.c')
-rw-r--r--app/i2c_bb.c70
1 files changed, 34 insertions, 36 deletions
diff --git a/app/i2c_bb.c b/app/i2c_bb.c
index f392b5e..cfa6742 100644
--- a/app/i2c_bb.c
+++ b/app/i2c_bb.c
@@ -106,57 +106,54 @@ static void i2c_bb_sm (int od, int d, int oc, int c)
}
// Check for STOP
- if (oc && c && !od && d) {
+ if (oc && c && !od && d)
state = ST_LOST;
- }
switch (state) {
case ST_LOST:
i2c_bb_sda (1);
i2c_bb_scl (1);
break;
+
case ST_ADDRESS_7...ST_ADDRESS_0:
- if (! (!oc && c)) {
+ if (! (!oc && c))
break;
- }
//rising scl of a7...a0
sr = (sr << 1) | !!d;
if (state == ST_ADDRESS_0) {
- if ( (sr & ~I2C_READ) == OUR_ADDRESS) {
+ if ((sr & ~I2C_READ) == OUR_ADDRESS) {
state++;
rnw = d;
- } else {
+ } else
state = ST_LOST;
- }
- } else {
+ } else
state++;
- }
break;
+
case ST_ADDRESS_ACK:
- if (! (oc && !c)) {
+ if (! (oc && !c))
break;
- }
//falling scl of a0
i2c_bb_sda (0);
- if (rnw) {
+ if (rnw)
state++;
- } else {
+
+ else
state = ST_PREP_REG_7;
- }
break;
+
case ST_OUT_7:
- if (! (oc && !c)) {
+ if (! (oc && !c))
break;
- }
//falling scl of ack
i2c_bb_sda (1);
@@ -168,32 +165,32 @@ static void i2c_bb_sm (int od, int d, int oc, int c)
i2c_bb_scl (1);
state++;
break;
+
case ST_OUT_6...ST_OUT_0:
- if (! (oc && !c)) {
+ if (! (oc && !c))
break;
- }
//falling scl of d6...d0
i2c_bb_sda (sr & 0x80);
sr <<= 1;
state++;
break;
+
case ST_PREP_OUT_ACK:
- if (! (oc && !c)) {
+ if (! (oc && !c))
break;
- }
//falling scl of d0
i2c_bb_sda (1);
state++;
break;
+
case ST_OUT_ACK:
- if (! (!oc && c)) {
+ if (! (!oc && c))
break;
- }
//rising scl of ack
@@ -207,74 +204,74 @@ static void i2c_bb_sm (int od, int d, int oc, int c)
}
break;
+
case ST_PREP_REG_7:
- if (! (oc && !c)) {
+ if (! (oc && !c))
break;
- }
//falling scl of ack
i2c_bb_sda (1);
sr = 0;
state++;
break;
+
case ST_REG_7...ST_REG_0:
- if (! (!oc && c)) {
+ if (! (!oc && c))
break;
- }
//rising scl of r7..r0
sr = (sr << 1) | !!d;
state++;
break;
+
case ST_REG_ACK:
- if (! (oc && !c)) {
+ if (! (oc && !c))
break;
- }
//falling scl of r0
reg = sr;
i2c_bb_sda (0);
state = ST_PREP_IN_7;
break;
+
case ST_PREP_IN_7:
- if (! (oc && !c)) {
+ if (! (oc && !c))
break;
- }
//falling scl of ack
i2c_bb_sda (1);
sr = 0;
state++;
break;
+
case ST_IN_7...ST_IN_0:
- if (! (!oc && c)) {
+ if (! (!oc && c))
break;
- }
//rising scl of i7..i0
sr = (sr << 1) | !!d;
state++;
break;
+
case ST_IN_ACK:
- if (! (oc && !c)) {
+ if (! (oc && !c))
break;
- }
//falling scl of i0
i2c_bb_sda (0);
state++;
break;
+
case ST_REG_WRITE:
- if (! (oc && !c)) {
+ if (! (oc && !c))
break;
- }
//falling scl of ack
i2c_bb_sda (1);
@@ -286,6 +283,7 @@ static void i2c_bb_sm (int od, int d, int oc, int c)
sr = 0;
state = ST_IN_7;
break;
+
default:
state = ST_LOST;
}