Change in osmo-ccid-firmware[master]: Support for sysmoOCTSIM NCN8025/SX1503 control
Kévin Redon has submitted this change and it was merged. ( https://gerrit.osmocom.org/13030 ) Change subject: Support for sysmoOCTSIM NCN8025/SX1503 control .. Support for sysmoOCTSIM NCN8025/SX1503 control This adds an I2C bit-banging layer, defines the four busses on the sysmoOCTSIM and adds some high-level functions to control the NCN8025 for each SIM slot. Change-Id: Ic5287cf80d2be2070c504e9d40f7c6fc0d37d8b9 --- M sysmoOCTSIM/gcc/Makefile A sysmoOCTSIM/i2c_bitbang.c A sysmoOCTSIM/i2c_bitbang.h M sysmoOCTSIM/main.c A sysmoOCTSIM/ncn8025.c A sysmoOCTSIM/ncn8025.h A sysmoOCTSIM/octsim_i2c.c A sysmoOCTSIM/octsim_i2c.h 8 files changed, 440 insertions(+), 0 deletions(-) Approvals: Jenkins Builder: Verified Kévin Redon: Looks good to me, approved diff --git a/sysmoOCTSIM/gcc/Makefile b/sysmoOCTSIM/gcc/Makefile index 572fb21..5e3c38c 100644 --- a/sysmoOCTSIM/gcc/Makefile +++ b/sysmoOCTSIM/gcc/Makefile @@ -70,6 +70,9 @@ gcc/gcc/startup_same54.o \ hal/src/hal_usb_device.o \ main.o \ +i2c_bitbang.o \ +octsim_i2c.o \ +ncn8025.o \ hpl/osc32kctrl/hpl_osc32kctrl.o \ examples/driver_examples.o \ driver_init.o \ @@ -108,6 +111,9 @@ "gcc/gcc/startup_same54.o" \ "hal/src/hal_usb_device.o" \ "main.o" \ +"i2c_bitbang.o" \ +"octsim_i2c.o" \ +"ncn8025.o" \ "hpl/osc32kctrl/hpl_osc32kctrl.o" \ "examples/driver_examples.o" \ "driver_init.o" \ @@ -152,6 +158,9 @@ "hal/src/hal_usart_async.d" \ "hpl/osc32kctrl/hpl_osc32kctrl.d" \ "main.d" \ +"i2c_bitbang.d" \ +"octsim_i2c.d" \ +"ncn8025.d" \ "examples/driver_examples.d" \ "hal/src/hal_cache.d" \ "hal/src/hal_sleep.d" \ diff --git a/sysmoOCTSIM/i2c_bitbang.c b/sysmoOCTSIM/i2c_bitbang.c new file mode 100644 index 000..b1a9a62 --- /dev/null +++ b/sysmoOCTSIM/i2c_bitbang.c @@ -0,0 +1,189 @@ +/* Bit-banging I2C layer, inspired to a large extent from Linux kernel + * i2c-algo-bit.c code (C) 1995-2000 Simon G. Vogl. This particular + * implementation is (C) 2019 by Harald Welte + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include +#include +#include "i2c_bitbang.h" + +#define setsda(adap, val) gpio_set_pin_level((adap)->pin_sda, val) +#define setscl(adap, val) gpio_set_pin_level((adap)->pin_scl, val) + +static int getsda(const struct i2c_adapter *adap) +{ + int rc; + gpio_set_pin_direction(adap->pin_sda, GPIO_DIRECTION_IN); + rc = gpio_get_pin_level(adap->pin_sda); + gpio_set_pin_direction(adap->pin_sda, GPIO_DIRECTION_OUT); + return rc; +} + +static int getscl(const struct i2c_adapter *adap) +{ + int rc; + gpio_set_pin_direction(adap->pin_scl, GPIO_DIRECTION_IN); + rc = gpio_get_pin_level(adap->pin_scl); + gpio_set_pin_direction(adap->pin_scl, GPIO_DIRECTION_OUT); + return rc; +} + +static inline void sdalo(const struct i2c_adapter *adap) +{ + setsda(adap, 0); + delay_us((adap->udelay+1) / 2); +} + +static inline void sdahi(const struct i2c_adapter *adap) +{ + setsda(adap, 1); + delay_us((adap->udelay+1) / 2); +} + +static inline void scllo(const struct i2c_adapter *adap) +{ + setscl(adap, 0); + delay_us(adap->udelay / 2); +} + + +static int sclhi(const struct i2c_adapter *adap) +{ + setscl(adap, 1); + + /* wait for slow slaves' clock stretching to complete */ + while (!getscl(adap)) { + /* FIXME: abort at some point */ + } + return 0; +} + +static void i2c_start(const struct i2c_adapter *adap) +{ + /* Assert: SCL + SDA are high */ + setsda(adap, 0);/* set SDA to low */ + delay_us(adap->udelay); /* delay */ + scllo(adap);/* Set SCL to low */ +} + +static void i2c_repstart(const struct i2c_adapter *adap) +{ + /* Assert: SCL is low */ + sdahi(adap); + sclhi(adap); + setsda(adap, 0); + delay_us(adap->udelay); + scllo(adap); +} + +static void i2c_stop(const struct i2c_adapter *adap) +{ + /* Assert: SCL is low */ + sdalo(adap);/* set SDA low */ + sclhi(adap);/* set SCL to high */ + setsda(adap, 1);/* set SDA to high */ + delay_us(adap->udelay); /* delay */ +} + +static int i2c_outb(const struct i2c_adapter *adap, uint8_t outdata) +{ + uint8_t sb; + int ack, i; + + /* Assert: SCL is low */ + for (i = 7; i >= 0; i--) { + sb = (outdata >> i) & 1; + setsda(adap, sb); + delay_us((adap->udelay + 1) / 2); + if (sclhi(adap) < 0) + return -ERR_TIMEOUT; + scllo(adap); + } + sdahi(adap); + if (sclhi(adap) < 0) + return -ERR_TIMEOUT; + ack = !getsda(adap); + scllo(adap); + return ack; +} + +static int i2c_inb(const struct i2c_adapter *adap) +{ + uint8_t indata =
Change in osmo-ccid-firmware[master]: Support for sysmoOCTSIM NCN8025/SX1503 control
Kévin Redon has posted comments on this change. ( https://gerrit.osmocom.org/13030 ) Change subject: Support for sysmoOCTSIM NCN8025/SX1503 control .. Patch Set 3: Code-Review+2 -- To view, visit https://gerrit.osmocom.org/13030 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ccid-firmware Gerrit-Branch: master Gerrit-MessageType: comment Gerrit-Change-Id: Ic5287cf80d2be2070c504e9d40f7c6fc0d37d8b9 Gerrit-Change-Number: 13030 Gerrit-PatchSet: 3 Gerrit-Owner: Harald Welte Gerrit-Reviewer: Jenkins Builder (102) Gerrit-Reviewer: Kévin Redon Gerrit-Comment-Date: Tue, 26 Feb 2019 17:27:22 + Gerrit-HasComments: No Gerrit-HasLabels: Yes
Change in osmo-ccid-firmware[master]: Support for sysmoOCTSIM NCN8025/SX1503 control
Hello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/13030 to look at the new patch set (#3). Change subject: Support for sysmoOCTSIM NCN8025/SX1503 control .. Support for sysmoOCTSIM NCN8025/SX1503 control This adds an I2C bit-banging layer, defines the four busses on the sysmoOCTSIM and adds some high-level functions to control the NCN8025 for each SIM slot. Change-Id: Ic5287cf80d2be2070c504e9d40f7c6fc0d37d8b9 --- M sysmoOCTSIM/gcc/Makefile A sysmoOCTSIM/i2c_bitbang.c A sysmoOCTSIM/i2c_bitbang.h M sysmoOCTSIM/main.c A sysmoOCTSIM/ncn8025.c A sysmoOCTSIM/ncn8025.h A sysmoOCTSIM/octsim_i2c.c A sysmoOCTSIM/octsim_i2c.h 8 files changed, 440 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/30/13030/3 -- To view, visit https://gerrit.osmocom.org/13030 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ccid-firmware Gerrit-Branch: master Gerrit-MessageType: newpatchset Gerrit-Change-Id: Ic5287cf80d2be2070c504e9d40f7c6fc0d37d8b9 Gerrit-Change-Number: 13030 Gerrit-PatchSet: 3 Gerrit-Owner: Harald Welte Gerrit-Reviewer: Jenkins Builder (102)
Change in osmo-ccid-firmware[master]: Support for sysmoOCTSIM NCN8025/SX1503 control
Hello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/13030 to look at the new patch set (#2). Change subject: Support for sysmoOCTSIM NCN8025/SX1503 control .. Support for sysmoOCTSIM NCN8025/SX1503 control This adds an I2C bit-banging layer, defines the four busses on the sysmoOCTSIM and adds some high-level functions to control the NCN8025 for each SIM slot. Change-Id: Ic5287cf80d2be2070c504e9d40f7c6fc0d37d8b9 --- M sysmoOCTSIM/gcc/Makefile A sysmoOCTSIM/i2c_bitbang.c A sysmoOCTSIM/i2c_bitbang.h M sysmoOCTSIM/main.c A sysmoOCTSIM/ncn8025.c A sysmoOCTSIM/ncn8025.h A sysmoOCTSIM/octsim_i2c.c A sysmoOCTSIM/octsim_i2c.h 8 files changed, 440 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/30/13030/2 -- To view, visit https://gerrit.osmocom.org/13030 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ccid-firmware Gerrit-Branch: master Gerrit-MessageType: newpatchset Gerrit-Change-Id: Ic5287cf80d2be2070c504e9d40f7c6fc0d37d8b9 Gerrit-Change-Number: 13030 Gerrit-PatchSet: 2 Gerrit-Owner: Harald Welte Gerrit-Reviewer: Jenkins Builder (102)
Change in osmo-ccid-firmware[master]: Support for sysmoOCTSIM NCN8025/SX1503 control
Harald Welte has uploaded this change for review. ( https://gerrit.osmocom.org/13030 Change subject: Support for sysmoOCTSIM NCN8025/SX1503 control .. Support for sysmoOCTSIM NCN8025/SX1503 control This adds an I2C bit-banging layer, defines the four busses on the sysmoOCTSIM and adds some high-level functions to control the NCN8025 for each SIM slot. Change-Id: Ic5287cf80d2be2070c504e9d40f7c6fc0d37d8b9 --- M sysmoOCTSIM/gcc/Makefile A sysmoOCTSIM/i2c_bitbang.c A sysmoOCTSIM/i2c_bitbang.h M sysmoOCTSIM/main.c A sysmoOCTSIM/ncn8025.c A sysmoOCTSIM/ncn8025.h A sysmoOCTSIM/octsim_i2c.c A sysmoOCTSIM/octsim_i2c.h 8 files changed, 438 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/30/13030/1 diff --git a/sysmoOCTSIM/gcc/Makefile b/sysmoOCTSIM/gcc/Makefile index 572fb21..5e3c38c 100644 --- a/sysmoOCTSIM/gcc/Makefile +++ b/sysmoOCTSIM/gcc/Makefile @@ -70,6 +70,9 @@ gcc/gcc/startup_same54.o \ hal/src/hal_usb_device.o \ main.o \ +i2c_bitbang.o \ +octsim_i2c.o \ +ncn8025.o \ hpl/osc32kctrl/hpl_osc32kctrl.o \ examples/driver_examples.o \ driver_init.o \ @@ -108,6 +111,9 @@ "gcc/gcc/startup_same54.o" \ "hal/src/hal_usb_device.o" \ "main.o" \ +"i2c_bitbang.o" \ +"octsim_i2c.o" \ +"ncn8025.o" \ "hpl/osc32kctrl/hpl_osc32kctrl.o" \ "examples/driver_examples.o" \ "driver_init.o" \ @@ -152,6 +158,9 @@ "hal/src/hal_usart_async.d" \ "hpl/osc32kctrl/hpl_osc32kctrl.d" \ "main.d" \ +"i2c_bitbang.d" \ +"octsim_i2c.d" \ +"ncn8025.d" \ "examples/driver_examples.d" \ "hal/src/hal_cache.d" \ "hal/src/hal_sleep.d" \ diff --git a/sysmoOCTSIM/i2c_bitbang.c b/sysmoOCTSIM/i2c_bitbang.c new file mode 100644 index 000..b1a9a62 --- /dev/null +++ b/sysmoOCTSIM/i2c_bitbang.c @@ -0,0 +1,189 @@ +/* Bit-banging I2C layer, inspired to a large extent from Linux kernel + * i2c-algo-bit.c code (C) 1995-2000 Simon G. Vogl. This particular + * implementation is (C) 2019 by Harald Welte + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include +#include +#include "i2c_bitbang.h" + +#define setsda(adap, val) gpio_set_pin_level((adap)->pin_sda, val) +#define setscl(adap, val) gpio_set_pin_level((adap)->pin_scl, val) + +static int getsda(const struct i2c_adapter *adap) +{ + int rc; + gpio_set_pin_direction(adap->pin_sda, GPIO_DIRECTION_IN); + rc = gpio_get_pin_level(adap->pin_sda); + gpio_set_pin_direction(adap->pin_sda, GPIO_DIRECTION_OUT); + return rc; +} + +static int getscl(const struct i2c_adapter *adap) +{ + int rc; + gpio_set_pin_direction(adap->pin_scl, GPIO_DIRECTION_IN); + rc = gpio_get_pin_level(adap->pin_scl); + gpio_set_pin_direction(adap->pin_scl, GPIO_DIRECTION_OUT); + return rc; +} + +static inline void sdalo(const struct i2c_adapter *adap) +{ + setsda(adap, 0); + delay_us((adap->udelay+1) / 2); +} + +static inline void sdahi(const struct i2c_adapter *adap) +{ + setsda(adap, 1); + delay_us((adap->udelay+1) / 2); +} + +static inline void scllo(const struct i2c_adapter *adap) +{ + setscl(adap, 0); + delay_us(adap->udelay / 2); +} + + +static int sclhi(const struct i2c_adapter *adap) +{ + setscl(adap, 1); + + /* wait for slow slaves' clock stretching to complete */ + while (!getscl(adap)) { + /* FIXME: abort at some point */ + } + return 0; +} + +static void i2c_start(const struct i2c_adapter *adap) +{ + /* Assert: SCL + SDA are high */ + setsda(adap, 0);/* set SDA to low */ + delay_us(adap->udelay); /* delay */ + scllo(adap);/* Set SCL to low */ +} + +static void i2c_repstart(const struct i2c_adapter *adap) +{ + /* Assert: SCL is low */ + sdahi(adap); + sclhi(adap); + setsda(adap, 0); + delay_us(adap->udelay); + scllo(adap); +} + +static void i2c_stop(const struct i2c_adapter *adap) +{ + /* Assert: SCL is low */ + sdalo(adap);/* set SDA low */ + sclhi(adap);/* set SCL to high */ + setsda(adap, 1);/* set SDA to high */ + delay_us(adap->udelay); /* delay */ +} + +static int i2c_outb(const struct i2c_adapter *adap, uint8_t outdata) +{ + uint8_t sb; + int ack, i; + + /* Assert: SCL is low */ + for (i = 7; i >= 0; i--) { + sb = (outdata >> i) & 1; + setsda(adap, sb); + delay_us((adap->udelay + 1) / 2); + if (sclhi(adap) < 0) + return -ERR_TIMEOUT; + scllo(adap); + } + sdahi(adap); + if (sclhi(adap) < 0) + return -ERR_TIMEOUT; + ack = !getsda(adap); + scllo(adap); + return ack; +} + +static int i2c_inb(const struct i2c_adapter *adap) +{ + uint8_t indata = 0;