This is an automated email from Gerrit.

"ahmed BOUDJELIDA <aboudjel...@nanoxplore.com>" just uploaded a new patch set 
to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/7807

-- gerrit

commit 1da6a199f518efc069c6184c1dfadb0d834b6fa6
Author: Ahmed BOUDJELIDA <aboudjel...@nanoxplore.com>
Date:   Fri Oct 6 17:05:09 2023 +0200

    contrib/firmware: add missing cases in i2c bit-banging implementation
    
    add case of slave device's register address that can be written in
    two bytes or more.
    add 'Nack' bit at the end of i2c read from slave operation.
    
    Change-Id: I3b8608d29df58601091ded9dff6243a690963700
    Signed-off-by: Ahmed BOUDJELIDA <aboudjel...@nanoxplore.com>

diff --git a/contrib/firmware/angie/c/include/i2c.h 
b/contrib/firmware/angie/c/include/i2c.h
index 06185efb4d..d0404923b3 100644
--- a/contrib/firmware/angie/c/include/i2c.h
+++ b/contrib/firmware/angie/c/include/i2c.h
@@ -19,6 +19,7 @@ void repeated_start(void);
 void stop_cd(void);
 void clock_cd(void);
 void send_ack(void);
+void send_nack(void);
 bool get_ack(void);
 
 uint8_t get_address(uint8_t adr, uint8_t rdwr);
diff --git a/contrib/firmware/angie/c/src/i2c.c 
b/contrib/firmware/angie/c/src/i2c.c
index a7004bfac9..53840100b9 100644
--- a/contrib/firmware/angie/c/src/i2c.c
+++ b/contrib/firmware/angie/c/src/i2c.c
@@ -60,6 +60,16 @@ void send_ack(void)
        delay_us(1);
 }
 
+void send_nack(void)
+{
+       PIN_SDA = 1;
+       delay_us(1);
+       PIN_SCL = 1;
+       delay_us(1);
+       PIN_SCL = 0;
+       delay_us(1);
+}
+
 bool get_ack(void)
 {
        PIN_SDA_DIR = 1;
diff --git a/contrib/firmware/angie/c/src/usb.c 
b/contrib/firmware/angie/c/src/usb.c
index 747fef1246..1d85a60a02 100644
--- a/contrib/firmware/angie/c/src/usb.c
+++ b/contrib/firmware/angie/c/src/usb.c
@@ -757,14 +757,13 @@ void i2c_recieve(void)
        PIN_SDA_DIR = 0;
        if (EP6FIFOBUF[0] == 1) {
                uint8_t rdwr = EP6FIFOBUF[0];   //read
-               uint8_t reg_adr_check = EP6FIFOBUF[1];
-               uint8_t count = EP6FIFOBUF[2];  //request data count
+               uint8_t data_count = EP6FIFOBUF[1]; //data sent count
+               uint8_t count = EP6FIFOBUF[2];  //requested data count
                uint8_t adr = EP6FIFOBUF[3];    //address
-               uint8_t reg_adr = EP6FIFOBUF[4];
                uint8_t address = get_address(adr, rdwr);   //address byte 
(read command)
                uint8_t address_2 = get_address(adr, 0);   //address byte 2 
(write command)
 
-               printf("%d\n", address);
+               printf("%d\n", address - 1);
 
                /*  start:   */
                start_cd();
@@ -773,17 +772,15 @@ void i2c_recieve(void)
                /*  ack:  */
                uint8_t ack = get_ack();
 
-               delay_us(10);
-
                /*   send data   */
-               if (reg_adr_check) { //if there is a byte reg
-                       send_byte(reg_adr);
-                       /*  ack():  */
-                       ack = get_ack();
+               if (data_count) { //if there is a byte reg
+                       for (uint8_t i = 0; i < data_count; i++) {
+                               send_byte(EP6FIFOBUF[i + 4]);
+                               /*  ack():  */
+                               ack = get_ack();
+                       }
                }
 
-               delay_us(10);
-
                /*  repeated start:  */
                repeated_start();
                /*  address:   */
@@ -791,23 +788,22 @@ void i2c_recieve(void)
                /*  get ack:  */
                ack = get_ack();
 
-               delay_us(10);
-
                /*   receive data   */
-               for (uint8_t i = 0; i < count; i++) {
+               for (uint8_t i = 0; i < count - 1; i++) {
                        EP8FIFOBUF[i] = receive_byte();
 
                        /*  send ack:  */
                        send_ack();
                }
 
-               delay_ms(1);
+               EP8FIFOBUF[count - 1] = receive_byte();
+
+               /*  send Nack:  */
+               send_nack();
 
                /*   stop   */
                stop_cd();
 
-               delay_us(10);
-
                EP8BCH = 0; //EP8
                syncdelay(3);
                EP8BCL = count; //EP8
diff --git a/src/jtag/drivers/angie/angie_firmware.bin 
b/src/jtag/drivers/angie/angie_firmware.bin
index da69631d99..1898848658 100644
Binary files a/src/jtag/drivers/angie/angie_firmware.bin and 
b/src/jtag/drivers/angie/angie_firmware.bin differ

-- 

Reply via email to