From 157f092e171c179f2daac544102a6514dc925e5a Mon Sep 17 00:00:00 2001
From: CNLohr <lohr85@gmail.com>
Date: Sun, 24 Dec 2023 04:42:20 -0500
Subject: [PATCH] Fix #255 - Force the DMDATA0 to 0x00 after successfully
 reading data out in a poll.

---
 ch32v003fun/ch32v003fun.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/ch32v003fun/ch32v003fun.c b/ch32v003fun/ch32v003fun.c
index f7f86c5..ad17c14 100644
--- a/ch32v003fun/ch32v003fun.c
+++ b/ch32v003fun/ch32v003fun.c
@@ -895,7 +895,7 @@ int putchar(int c)
 void handle_debug_input( int numbytes, uint8_t * data ) __attribute__((weak));
 void handle_debug_input( int numbytes, uint8_t * data ) { }
 
-static void internal_handle_input( uint32_t * dmdata0 )
+static void internal_handle_input( volatile uint32_t * dmdata0 )
 {
 	uint32_t dmd0 = *dmdata0;
 	int bytes = (dmd0 & 0x3f) - 4;
@@ -908,11 +908,12 @@ static void internal_handle_input( uint32_t * dmdata0 )
 
 void poll_input()
 {
-	uint32_t lastdmd = (*DMDATA0);
- 	if( !(lastdmd & 0x80) )
+	volatile uint32_t * dmdata0 = (volatile uint32_t *)DMDATA0;
+ 	if( ((*dmdata0) & 0x80) == 0 )
 	{
-		internal_handle_input( (uint32_t*)DMDATA0 );
-		*DMDATA0 = 0x84; // Negative
+		internal_handle_input( dmdata0 );
+		// Should be 0x80 or so, but for some reason there's a bug that retriggers.
+		*dmdata0 = 0x00;
 	}
 }
 
@@ -980,10 +981,6 @@ int putchar(int c)
 		if( timeout-- == 0 ) return 0;
 
 	// Simply seeking input.
-	lastdmd = (*DMDATA0);
-	if( lastdmd ) internal_handle_input( (uint32_t*)DMDATA0 );
-
-	while( (lastdmd = (*DMDATA0)) & 0x80 ) if( timeout-- == 0 ) return 0;
 	if( lastdmd ) internal_handle_input( (uint32_t*)DMDATA0 );
 	*DMDATA0 = 0x85 | ((const char)c<<8);
 	return 1;
-- 
GitLab