diff --git a/minichlink/Makefile b/minichlink/Makefile
index 741b8e112f99b40779d329bca4ebf2774614bef8..dd978769d836763bfe16fb12fd646875a68999e6 100644
--- a/minichlink/Makefile
+++ b/minichlink/Makefile
@@ -1,4 +1,4 @@
-TOOLS:=minichlink
+TOOLS:=minichlink minichlink.so
 
 all : $(TOOLS)
 
@@ -13,6 +13,9 @@ endif
 minichlink : minichlink.c pgm-wch-linke.c pgm-esp32s2-ch32xx.c nhc-link042.c
 	gcc -o $@ $^ $(LDFLAGS) $(CFLAGS)
 
+minichlink.so : minichlink.c pgm-wch-linke.c pgm-esp32s2-ch32xx.c nhc-link042.c
+	gcc -o $@ $^ $(LDFLAGS) $(CFLAGS) -shared -fPIC
+
 install_udev_rules :
 	cp 99-WCH-LinkE.rules /etc/udev/rules.d/
 	service udev restart
@@ -22,4 +25,4 @@ inspect_bootloader : minichlink
 	riscv64-unknown-elf-objdump -S -D test.bin -b binary -m riscv:rv32 | less
 
 clean :
-	rm -rf $(TOOLS)
+	rm -rf $(TOOLS) 
diff --git a/minichlink/README.md b/minichlink/README.md
index 6b8d8c6533af2502a3947fd3641a9fdc95299f7e..a38f46d765e59a36b4eec4426d91dc71b567c55c 100644
--- a/minichlink/README.md
+++ b/minichlink/README.md
@@ -24,6 +24,8 @@ Usage: minichlink [args]
 		the SWIO pin (PD1) on boot, your part can never again be programmed!
 	-d Configure NRST as NRST
 	-w [binary image to write]
+	-s [debug register] [value]
+	-g [debug register]
 	-o [memory address, decimal or 0x, try 0x08000000] [size, decimal or 0x, try 16384] [output binary image]
 ```
  
diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c
index 32ec98e8c6614808a9640f8502eca75d57eed226..052c1ce510b0b1fcc23d3f46e21328b21290ae06 100644
--- a/minichlink/minichlink.c
+++ b/minichlink/minichlink.c
@@ -175,6 +175,70 @@ keep_going:
 					}
 				} while( 1 );
 			}
+			case 's':
+			{
+				iarg+=2;
+				if( iarg >= argc )
+				{
+					fprintf( stderr, "Debug set commands require 2 parameters, a register and a value.\n" );
+					goto unimplemented;
+				}
+
+				uint32_t datareg = SimpleReadNumberInt( argv[iarg-1], DMDATA0 );
+				uint32_t value = SimpleReadNumberInt( argv[iarg], 0 ); 
+
+				if( MCF.WriteReg32 && MCF.FlushLLCommands )
+				{
+					MCF.FlushLLCommands( dev );	
+					MCF.WriteReg32( dev, datareg, value );
+					MCF.FlushLLCommands( dev );
+				}
+				else
+					goto unimplemented;
+				break;
+			}
+			case 'g':
+			{
+				iarg+=1;
+				if( iarg >= argc )
+				{
+					fprintf( stderr, "Debug get commands require 1 parameter, a register.\n" );
+					fprintf( stderr, "One of the following:\n"
+						"	DMDATA0        0x04\n"
+						"	DMDATA1        0x05\n"
+						"	DMCONTROL      0x10\n"
+						"	DMSTATUS       0x11\n"
+						"	DMHARTINFO     0x12\n"
+						"	DMABSTRACTCS   0x16\n"
+						"	DMCOMMAND      0x17\n"
+						"	DMABSTRACTAUTO 0x18\n"
+						"	DMPROGBUF0     0x20\n"
+						"	DMPROGBUF1     0x21\n"
+						"	DMPROGBUF2     0x22\n"
+						"	DMPROGBUF3     0x23\n"
+						"	DMPROGBUF4     0x24\n"
+						"	DMPROGBUF5     0x25\n"
+						"	DMPROGBUF6     0x26\n"
+						"	DMPROGBUF7     0x27\n"
+						"	DMCPBR       0x7C\n"
+						"	DMCFGR       0x7D\n"
+						"	DMSHDWCFGR   0x7E\n" );
+
+					goto unimplemented;
+				}
+
+				uint32_t datareg = SimpleReadNumberInt( argv[iarg-1], DMDATA0 );
+
+				if( MCF.WriteReg32 && MCF.FlushLLCommands )
+				{
+					uint32_t value;
+					int ret = MCF.ReadReg32( dev, datareg, &value );
+					printf( "REGISTER %02x: %08x, %d\n", datareg, value, ret );
+				}
+				else
+					goto unimplemented;
+				break;
+			}
 			case 'p':
 			{
 				if( MCF.PrintChipInfo )
@@ -405,6 +469,8 @@ help:
 	fprintf( stderr, " -h Place into Halt\n" );
 	fprintf( stderr, " -D Configure NRST as GPIO\n" );
 	fprintf( stderr, " -d Configure NRST as NRST\n" );
+	fprintf( stderr, " -s [debug register] [value]\n" );
+	fprintf( stderr, " -g [debug register]\n" );
 //	fprintf( stderr, " -P Enable Read Protection (UNTESTED)\n" );
 //	fprintf( stderr, " -p Disable Read Protection (UNTESTED)\n" );
 	fprintf( stderr, " -w [binary image to write] [address, decimal or 0x, try0x08000000]\n" );