From bc7d8418568b553bcf431257e7eb75435fc8df64 Mon Sep 17 00:00:00 2001
From: Mark <markboldyrev@gmail.com>
Date: Mon, 19 Jun 2023 21:51:32 +0300
Subject: [PATCH] Replace target reset with power control. 3v3 used for
 compatibility with the unbrick mode.

---
 minichlink/ardulink.c   | 39 +++++++++++++++++++++------------------
 minichlink/minichlink.c |  5 -----
 minichlink/minichlink.h |  2 --
 3 files changed, 21 insertions(+), 25 deletions(-)

diff --git a/minichlink/ardulink.c b/minichlink/ardulink.c
index 82284c6..cd28635 100644
--- a/minichlink/ardulink.c
+++ b/minichlink/ardulink.c
@@ -9,8 +9,9 @@ void * TryInit_Ardulink(const init_hints_t*);
 static int ArdulinkWriteReg32(void * dev, uint8_t reg_7_bit, uint32_t command);
 static int ArdulinkReadReg32(void * dev, uint8_t reg_7_bit, uint32_t * commandresp);
 static int ArdulinkFlushLLCommands(void * dev);
+static int ArdulinkDelayUS(void * dev, int microseconds);
+static int ArdulinkControl3v3(void * dev, int power_on);
 static int ArdulinkExit(void * dev);
-static int ArdulinkTargetReset(void * dev, int reset);
 
 typedef struct {
     struct ProgrammerStructBase psb;
@@ -64,20 +65,12 @@ int ArdulinkFlushLLCommands(void * dev)
     return 0;
 }
 
-int ArdulinkExit(void * dev)
-{
-    serial_dev_close(&((ardulink_ctx_t*)dev)->serial);
-    free(dev);
-    return 0;
-}
-
-int ArdulinkTargetReset(void * dev, int reset) {
+int ArdulinkControl3v3(void * dev, int power_on) {
     char c;
 
-    fprintf(stderr, "Ardulink: target reset %d\n", reset);
+    fprintf(stderr, "Ardulink: target power %d\n", power_on);
 
-    // Assert reset.
-    c = reset ? 'a' : 'A';
+    c = power_on ? 'p' : 'P';
     if (serial_dev_write(&((ardulink_ctx_t*)dev)->serial, &c, 1) == -1)
         return -errno;
 
@@ -91,6 +84,20 @@ int ArdulinkTargetReset(void * dev, int reset) {
     return 0;
 }
 
+int ArdulinkDelayUS(void * dev, int microseconds) {
+    //fprintf(stderr, "Ardulink: faking delay %d\n", microseconds);
+    //usleep(microseconds);
+    return 0;
+}
+
+int ArdulinkExit(void * dev)
+{
+    serial_dev_close(&((ardulink_ctx_t*)dev)->serial);
+    free(dev);
+    return 0;
+}
+
+
 void * TryInit_Ardulink(const init_hints_t* hints)
 {
     ardulink_ctx_t *ctx;
@@ -149,18 +156,14 @@ void * TryInit_Ardulink(const init_hints_t* hints)
         return NULL;
     }
 
-    if (ArdulinkTargetReset(ctx, 1) != 0) {
-        fprintf(stderr, "Ardulink: target reset failed.\n");
-        return NULL;
-    }
-
     fprintf(stderr, "Ardulink: synced.\n");
 
     MCF.WriteReg32 = ArdulinkWriteReg32;
 	MCF.ReadReg32 = ArdulinkReadReg32;
     MCF.FlushLLCommands = ArdulinkFlushLLCommands;
+    MCF.Control3v3 = ArdulinkControl3v3;
+    MCF.DelayUS = ArdulinkDelayUS;
 	MCF.Exit = ArdulinkExit;
-    MCF.TargetReset = ArdulinkTargetReset;
 
 	return ctx;
 }
diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c
index 2bb7a04..efbda9d 100644
--- a/minichlink/minichlink.c
+++ b/minichlink/minichlink.c
@@ -1575,11 +1575,6 @@ static int DefaultHaltMode( void * dev, int mode )
 	}
 #endif
 
-	// pull reset line back to 0 again (NO RESET)
-	if (MCF.TargetReset) {
-		MCF.TargetReset(dev, 0);
-	}
-
 	iss->processor_in_mode = mode;
 	return 0;
 }
diff --git a/minichlink/minichlink.h b/minichlink/minichlink.h
index 77310ef..c5f3bcb 100644
--- a/minichlink/minichlink.h
+++ b/minichlink/minichlink.h
@@ -78,8 +78,6 @@ struct MiniChlinkFunctions
 
 	int (*WriteByte)( void * dev, uint32_t address_to_write, uint8_t data );
 	int (*ReadByte)( void * dev, uint32_t address_to_read, uint8_t * data );
-
-	int (*TargetReset)( void * dev, int reset );
 };
 
 /** If you are writing a driver, the minimal number of functions you can implement are:
-- 
GitLab