From 9a150e326a655c9bd2fbead1be43748ca640764c Mon Sep 17 00:00:00 2001 From: Ahmed BOUDJELIDA Date: Thu, 12 Dec 2024 10:27:14 +0100 Subject: [PATCH] contrib/firmware/angie: add dev-board power detection Add a check if i2c SDA pin state is HIGH. if its HIGH, the dev-board is ON, we receive number of Ack. in its LOW, the board is OFF, we send this information back to driver. Change-Id: Ia40d3910675cc10e0208d8bc0060a19c12b1409d Signed-off-by: Ahmed BOUDJELIDA Reviewed-on: https://review.openocd.org/c/openocd/+/8716 Tested-by: jenkins Reviewed-by: Antonio Borneo --- contrib/firmware/angie/c/include/i2c.h | 1 + contrib/firmware/angie/c/src/i2c.c | 13 +++++ contrib/firmware/angie/c/src/main.c | 2 +- contrib/firmware/angie/c/src/usb.c | 58 +++++++++++----------- src/jtag/drivers/angie/angie_firmware.bin | Bin 10216 -> 4487 bytes 5 files changed, 44 insertions(+), 30 deletions(-) diff --git a/contrib/firmware/angie/c/include/i2c.h b/contrib/firmware/angie/c/include/i2c.h index d0404923b..7a199c15a 100644 --- a/contrib/firmware/angie/c/include/i2c.h +++ b/contrib/firmware/angie/c/include/i2c.h @@ -14,6 +14,7 @@ #include #include +bool get_status(void); void start_cd(void); void repeated_start(void); void stop_cd(void); diff --git a/contrib/firmware/angie/c/src/i2c.c b/contrib/firmware/angie/c/src/i2c.c index 9aadc2c25..4cf82955f 100644 --- a/contrib/firmware/angie/c/src/i2c.c +++ b/contrib/firmware/angie/c/src/i2c.c @@ -12,6 +12,19 @@ #include "delay.h" #include "reg_ezusb.h" +bool get_status(void) +{ + PIN_SDA_DIR = 1; + OEA = 0xF7; + delay_us(1); + bool sda_state = PIN_SDA; + PIN_T0 = sda_state; + delay_us(1); + OEA = 0xFF; + delay_us(1); + return sda_state; +} + void start_cd(void) { PIN_SDA_DIR = 0; // SP6 SDA: OUT diff --git a/contrib/firmware/angie/c/src/main.c b/contrib/firmware/angie/c/src/main.c index 042a1eca7..657694b6c 100644 --- a/contrib/firmware/angie/c/src/main.c +++ b/contrib/firmware/angie/c/src/main.c @@ -11,9 +11,9 @@ *****************************************************************************/ #include "usb.h" +#include "serial.h" #include "delay.h" #include "reg_ezusb.h" -#include #include extern void sudav_isr(void)__interrupt SUDAV_ISR; diff --git a/contrib/firmware/angie/c/src/usb.c b/contrib/firmware/angie/c/src/usb.c index f3bc99ba1..9b48e8353 100644 --- a/contrib/firmware/angie/c/src/usb.c +++ b/contrib/firmware/angie/c/src/usb.c @@ -55,7 +55,7 @@ __code struct usb_config_descriptor config_descriptor = { ((NUM_ENDPOINTS * 2) * sizeof(struct usb_endpoint_descriptor)), .bnuminterfaces = 2, .bconfigurationvalue = 1, - .iconfiguration = 4, /* String describing this configuration */ + .iconfiguration = 2, /* String describing this configuration */ .bmattributes = 0x80, /* Only MSB set according to USB spec */ .maxpower = 50 /* 100 mA */ }; @@ -69,7 +69,7 @@ __code struct usb_interface_descriptor interface_descriptor00 = { .binterfaceclass = 0XFF, .binterfacesubclass = 0x00, .binterfaceprotocol = 0x00, - .iinterface = 5 + .iinterface = 0 }; __code struct usb_endpoint_descriptor bulk_ep2_endpoint_descriptor = { @@ -99,7 +99,7 @@ __code struct usb_interface_descriptor interface_descriptor01 = { .binterfaceclass = 0x0A, .binterfacesubclass = 0x00, .binterfaceprotocol = 0x00, - .iinterface = 6 + .iinterface = 0 }; __code struct usb_endpoint_descriptor bulk_ep6_out_endpoint_descriptor = { @@ -200,8 +200,8 @@ void ep6_isr(void)__interrupt EP6_ISR } void ep8_isr(void)__interrupt EP8_ISR { - EXIF &= ~0x10; /* Clear USBINT: Main global interrupt */ - EPIRQ = 0x80; /* Clear individual EP8IN IRQ */ + EXIF &= ~0x10; /* Clear USBINT: Main global interrupt */ + EPIRQ = 0x80; /* Clear individual EP8IN IRQ */ } void ibn_isr(void)__interrupt IBN_ISR { @@ -761,16 +761,16 @@ void ep_init(void) void i2c_recieve(void) { - PIN_SDA_DIR = 0; if (EP6FIFOBUF[0] == 1) { - uint8_t rdwr = EP6FIFOBUF[0]; //read - uint8_t data_count = EP6FIFOBUF[1]; //data sent count + uint8_t rdwr = EP6FIFOBUF[0]; //read: 1 + uint8_t reg_byte_check = EP6FIFOBUF[1]; //register given: 1 else: 0 uint8_t count = EP6FIFOBUF[2]; //requested data count uint8_t adr = EP6FIFOBUF[3]; //address 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 - 1); + /* i2c bus state byte */ + EP8FIFOBUF[0] = get_status(); /* start: */ start_cd(); @@ -780,12 +780,10 @@ void i2c_recieve(void) uint8_t ack = get_ack(); /* send data */ - 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(); - } + for (int i = 0; i < reg_byte_check; i++) { + send_byte(EP6FIFOBUF[i + 4]); + /* ack(): */ + ack = get_ack(); } /* repeated start: */ @@ -796,14 +794,14 @@ void i2c_recieve(void) ack = get_ack(); /* receive data */ - for (uint8_t i = 0; i < count - 1; i++) { + for (int i = 1; i < count; i++) { EP8FIFOBUF[i] = receive_byte(); /* send ack: */ send_ack(); } - EP8FIFOBUF[count - 1] = receive_byte(); + EP8FIFOBUF[count] = receive_byte(); /* send Nack: */ send_nack(); @@ -811,44 +809,46 @@ void i2c_recieve(void) /* stop */ stop_cd(); - EP8BCH = 0; //EP8 + EP8BCH = (count + 1) >> 8; //EP8 syncdelay(3); - EP8BCL = count; //EP8 + EP8BCL = count + 1; //EP8 EP6BCL = 0x80; //EP6 syncdelay(3); EP6BCL = 0x80; //EP6 } else { - uint8_t rdwr = EP6FIFOBUF[0]; //write + uint8_t rdwr = EP6FIFOBUF[0]; //write: 0 uint8_t count = EP6FIFOBUF[1]; //data count uint8_t adr = EP6FIFOBUF[2]; //address uint8_t address = get_address(adr, rdwr); //address byte (read command) uint8_t ack_cnt = 0; -/* start(): */ + // i2c bus state byte + EP8FIFOBUF[0] = get_status(); + + /* start(): */ start_cd(); -/* address: */ + /* address: */ send_byte(address); //write -/* ack(): */ + /* ack(): */ if (!get_ack()) ack_cnt++; -/* send data */ - for (uint8_t i = 0; i < count; i++) { + /* send data */ + for (int i = 0; i < count; i++) { send_byte(EP6FIFOBUF[i + 3]); - /* get ack: */ if (!get_ack()) ack_cnt++; } -/* stop */ + /* stop */ stop_cd(); - EP8FIFOBUF[0] = ack_cnt; + EP8FIFOBUF[1] = ack_cnt; EP8BCH = 0; //EP8 syncdelay(3); - EP8BCL = 1; //EP8 + EP8BCL = 2; //EP8 EP6BCL = 0x80; //EP6 syncdelay(3); diff --git a/src/jtag/drivers/angie/angie_firmware.bin b/src/jtag/drivers/angie/angie_firmware.bin index 68486ef8f09865c663966cf80cc334ec93405b5c..6ba2babb1731581b81e23560c39ccd8164733627 100644 GIT binary patch literal 4487 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