diff --git a/nanosoc/nanosoc_system/verilog/nanosoc_system.v b/nanosoc/nanosoc_system/verilog/nanosoc_system.v
index 4e4b3c1edca353754c7723f7d48e1765125a3daf..05bbd3003b69949cb8a2bc26f8fe2db571e92989 100644
--- a/nanosoc/nanosoc_system/verilog/nanosoc_system.v
+++ b/nanosoc/nanosoc_system/verilog/nanosoc_system.v
@@ -56,7 +56,7 @@ module nanosoc_system #(
     parameter INCLUDE_JTAG            = 0,   // Do not Include JTAG feature
       
     // DMA Parameters  
-    parameter    DMAC_0_CHANNEL_NUM   = 2,   // DMAC 0 Number of DMA Channels 
+    parameter    DMAC_0_CHANNEL_NUM   = 4,   // DMAC 0 Number of DMA Channels : Add EXTDATA TX, RX
     parameter    DMAC_1_CHANNEL_NUM   = 2,   // DMAC 1 Number of DMA Channels
       
     // SoCDebug Parameters  
@@ -907,7 +907,9 @@ wire       EXT_DAT_TXD_TREADY ;
     // Expansion DRQ Wiring
     //--------------------------
     assign EXP_DLAST [1:0] = 2'b00;
-    assign DMAC_0_DMA_REQ  = EXP_DRQ;
+    assign DMAC_0_DMA_REQ[1:0]  = EXP_DRQ;
+    assign DMAC_0_DMA_REQ[2]    = EXT_DAT_RXD_TREADY;
+    assign DMAC_0_DMA_REQ[3]    = EXT_DAT_TXD_TVALID;
     
     // Instantiate Subsystem
     //--------------------------
diff --git a/nanosoc/sldma230_tech b/nanosoc/sldma230_tech
index 0f0bf3dee094e9e6801210c1d5f190dea912395d..7105d696b8d67e4b70c9c54cb14c807a311a24b3 160000
--- a/nanosoc/sldma230_tech
+++ b/nanosoc/sldma230_tech
@@ -1 +1 @@
-Subproject commit 0f0bf3dee094e9e6801210c1d5f190dea912395d
+Subproject commit 7105d696b8d67e4b70c9c54cb14c807a311a24b3
diff --git a/software/drivers/dma_pl230_driver.h b/software/drivers/dma_pl230_driver.h
index 082b196ab13b993867815b4ff5f91ff5cf1588a0..7116f998852e71c1521f72e2aee35be8167eac21 100644
--- a/software/drivers/dma_pl230_driver.h
+++ b/software/drivers/dma_pl230_driver.h
@@ -8,7 +8,7 @@ extern "C" {
 
 #define DMA_PL230_BASE        (CMSDK_APB_BASE + 0xF000UL)
 
-#define MAX_NUM_OF_DMA_CHANNELS   2
+#define MAX_NUM_OF_DMA_CHANNELS   4
 
 /*------------- PL230 uDMA (PL230) --------------------------------------*/
 /** @addtogroup DMA_PL230 CMSDK uDMA controller
diff --git a/testcodes/dataio_dma230_tests/data_in.csv b/testcodes/dataio_dma230_tests/data_in.csv
new file mode 100644
index 0000000000000000000000000000000000000000..bcc1e4425ed3a795097bdf1627046f1a91dbe268
--- /dev/null
+++ b/testcodes/dataio_dma230_tests/data_in.csv
@@ -0,0 +1,6 @@
+0000100101000110,0000110001000110,0000110001000110,0000100101000110,0000011001000110,0000011001000110,0000010101000110,0000100001000110,0000110101000110,0000101101000110,0000100001000110,0000010001000110,0000001101000110,0000100001000110,0000100101000110,0000101001000110,0000100101000111,0000010101000111,0000010101000111,0000010101000111,0000011101000111,0000100101000111,0000101001000111,0000100001000111,0000010001000111,0000001001000111,0000010001000111,0000100001000111,0000101101000111,0000100101000111,0000011001000111,0000010001000111,0000010001000111,0000011001000111,0000100101000111,0000101001000111,0000100101000111,0000010101000111,0000001001000111,0000010101000111
+0000010100101010,1111110100101010,0000010100101010,0000000100101001,1111111000101010,0000011000101001,0000000100101001,0000010100101000,0000010100101000,0000000100101000,0000101100101000,0000101000101000,0000011100100111,0000101000101000,0000101100100111,0000110100100111,0000101100100111,0000100100100111,0000111000100111,0000101000100111,0000001100100111,0000101000100111,0000011100100110,0000001000100110,0000011100100110,0000011100100110,0000100100100110,0000101000100110,0000001100100101,0000101000100101,0000010100100101,0000000000100101,0000011000100101,0000010000100101,0000001000100100,0000010000100100,1111111100100101,0000011000100100,0000001000100100,1111110000100100
+0000000000000000,0000000000000001,0000000000000011,0000000000000111,0000000000001111,0000000000011111,0000000000111111,0000000001111111,0000000011111111,0000000111111111,0000001111111111,0000011111111111,0000111111111111,0001111111111111,0011111111111111,0111111111111111,1111111111111111
+1111111111111111,1111111111111110,1111111111111100,1111111111111000,1111111111110000,1111111111100000,1111111111000000,1111111110000000,1111111100000000,1111111000000000,1111110000000000,1111100000000000,1111000000000000,1110000000000000,1100000000000000,1000000000000000,0000000000000000
+0000000000000000,0000000000000001,0000000000000010,0000000000000100,0000000000001000,0000000000010000,0000000000100000,0000000001000000,0000000010000000,0000000100000000,0000001000000000,0000010000000000,0000100000000000,0001000000000000,0010000000000000,0100000000000000,1000000000000000
+
diff --git a/testcodes/dataio_dma230_tests/dataio_dma230_tests.c b/testcodes/dataio_dma230_tests/dataio_dma230_tests.c
new file mode 100644
index 0000000000000000000000000000000000000000..dfa0d3c83075390b9de31fab08aa02c72c8530de
--- /dev/null
+++ b/testcodes/dataio_dma230_tests/dataio_dma230_tests.c
@@ -0,0 +1,142 @@
+#include "CMSDK_CM0.h"
+#include <string.h>
+#include "uart_stdout.h"
+#include <stdio.h>
+
+#include "dataio_functions.h"
+
+#include "dma_pl230_driver.h"
+#include "dma_pl230_driver.c"
+
+#define CSV_RECORD_LEN  (16+1)
+#define CSV_RECORD_COUNT  (5)
+
+static volatile dma_pl230_channel_data dataio_ip_chain[2];
+static volatile dma_pl230_channel_data dataio_op_chain[2];
+
+int  pl230_dma_detect(void);
+int  ID_Check(const unsigned int id_array[], unsigned int offset);
+
+// associate DMA channel numbers
+#define DMA_CHAN_DATAIO_IP (3)
+#define DMA_CHAN_DATAIO_OP (2)
+#define DATA_UART  ((CMSDK_UART_TypeDef   *) CMSDK_UART1_BASE   )
+
+void dataio_ip_driver_dma8( uint32_t nbytes, uint8_t *input)
+{
+    int c = DMA_CHAN_DATAIO_IP;
+
+// program DMA transfers as single chains
+
+    dataio_ip_chain[0].SrcEndPointer = DMA_PL230_PTR_END(&(DATA_UART->DATA),PL230_XFER_B,1);
+    dataio_ip_chain[0].DstEndPointer = DMA_PL230_PTR_END(input,PL230_XFER_B,nbytes);
+    dataio_ip_chain[0].Control       = DMA_PL230_CTRL_SRCFIX(PL230_CTRL_CYCLE_BASIC,PL230_XFER_B,nbytes,PL230_CTRL_RPWR_1);
+
+    dma_pl230_table->Primary[c].SrcEndPointer = DMA_PL230_PTR_END(&(dataio_ip_chain[0].SrcEndPointer), PL230_XFER_W, (1*4));
+    dma_pl230_table->Primary[c].DstEndPointer = DMA_PL230_PTR_END(&(dma_pl230_table->Alternate[c]), PL230_XFER_W, (1*4));
+    dma_pl230_table->Primary[c].Control       = DMA_PL230_CTRL_DSTFIX(PL230_CTRL_CYCLE_DEV_CHAIN_PRI,PL230_XFER_W,(1*4),PL230_CTRL_RPWR_4);
+
+    // enable DMA controller channels
+    DMA_PL230_DMAC->DMA_CFG = 0; /* Disable DMA controller for initialization */
+    dma_pl230_init(1<<DMA_CHAN_DATAIO_IP);
+
+    // test to ensure output DMA has started
+    while (!(dma_pl230_channel_active(1<<DMA_CHAN_DATAIO_IP)))
+      ;
+    while (dma_pl230_channel_active(1<<DMA_CHAN_DATAIO_IP))
+      ;
+    DMA_PL230_DMAC->DMA_CFG = 0; /* Disable DMA controller for initialization */
+    dma_pl230_init(0); // none active
+    return;
+}
+
+void dataio_op_driver_dma8( uint32_t nbytes, uint8_t *result)
+{
+    int c = DMA_CHAN_DATAIO_OP;
+// program DMA transfers as single chains
+
+    dataio_op_chain[0].SrcEndPointer = DMA_PL230_PTR_END(result,PL230_XFER_B,nbytes);
+    dataio_op_chain[0].DstEndPointer = DMA_PL230_PTR_END(&(DATA_UART->DATA),PL230_XFER_B,1);
+    dataio_op_chain[0].Control       = DMA_PL230_CTRL_DSTFIX(PL230_CTRL_CYCLE_BASIC,PL230_XFER_B,nbytes,PL230_CTRL_RPWR_1);
+
+    dma_pl230_table->Primary[c].SrcEndPointer = DMA_PL230_PTR_END(&(dataio_op_chain[0].SrcEndPointer), PL230_XFER_W,(1*4));
+    dma_pl230_table->Primary[c].DstEndPointer = DMA_PL230_PTR_END(&(dma_pl230_table->Alternate[c]), PL230_XFER_W,(1*4));
+    dma_pl230_table->Primary[c].Control       = DMA_PL230_CTRL_DSTFIX(PL230_CTRL_CYCLE_DEV_CHAIN_PRI,PL230_XFER_W,(1*4),PL230_CTRL_RPWR_4);
+
+    // enable DMA controller channels
+    DMA_PL230_DMAC->DMA_CFG = 0; /* Disable DMA controller for initialization */
+    dma_pl230_init(1<<DMA_CHAN_DATAIO_OP);
+
+    // test to ensure output DMA has started
+    while (!(dma_pl230_channel_active(1<<DMA_CHAN_DATAIO_OP)))
+      ;
+    while (dma_pl230_channel_active(1<<DMA_CHAN_DATAIO_OP))
+      ;
+    DMA_PL230_DMAC->DMA_CFG = 0; /* Disable DMA controller for initialization */
+    dma_pl230_init(0); // none active
+    return;
+}
+
+
+int main(void) {
+  unsigned char ch;
+  char         rx_buf[20];
+  char         tx_buf[20];
+  char *       p;
+  unsigned int rx_record_len;
+  unsigned int rx_record_count;
+  unsigned int rx_count;
+  unsigned int value;
+  unsigned int end_of_record ;
+  unsigned int end_of_data ;
+
+  UartStdOutInit();
+  printf("Data Channel CSV Reader/Writer using DMA230 (ASC binary -> Hex) tests\n");
+
+// Reset DMA table structures
+  dma_pl230_data_struct_init(); // initialize
+
+  DataIO_enable();
+
+  end_of_data = 0;
+  rx_record_len = CSV_RECORD_LEN - 1; // due to soft reset in testbench!
+  rx_record_count = CSV_RECORD_COUNT; // due to soft reset in testbench!
+
+  do { // record at a time
+    dataio_ip_driver_dma8(rx_record_len, (uint8_t *)rx_buf);
+    rx_count = 0;
+    value    = 0;
+    end_of_record = 0;
+    rx_record_len = CSV_RECORD_LEN;
+    p = rx_buf;
+    do { // parse process CSV entry
+        ch = *p++;
+        if  (ch == '0') { value = (value << 1);      rx_count++; }
+        if  (ch == '1') { value = (value << 1) + 1;  rx_count++; }
+        if  (ch == ',')  end_of_record = 1;
+        if ((ch == '\n') || (ch == '\r')) end_of_record = 1;
+//        if ((ch == '\n') || (ch == '\r')) end_of_data = (rx_count == 0) ? 1 : 0;
+    } while ((rx_count <= 16) && (end_of_record == 0) );
+    if (ch == '\n') end_of_data = (rx_record_count-- > 1) ? 0 : 1 ;
+    if (rx_count > 0) {
+      if (ch == ',')
+        printf(","); // ',' per CSV record
+      else
+        printf(".\n"); // newline delimiter
+
+      if (ch == ',')
+        sprintf(tx_buf,"0x%04x,", value);
+      else
+        sprintf(tx_buf,"0x%04x\n", value);
+
+      tx_buf[8]=0; // string zero terminate
+      dataio_op_driver_dma8(7, (uint8_t *)tx_buf);
+    }
+  } while (end_of_data == 0); // outer record loop
+
+  printf("** DATA FILE PROCESSING ** TEST PASSED **\n");
+
+  UartEndSimulation();
+  return 0;
+
+}
diff --git a/testcodes/dataio_dma230_tests/dataio_dma230_tests.hex b/testcodes/dataio_dma230_tests/dataio_dma230_tests.hex
new file mode 100644
index 0000000000000000000000000000000000000000..909e9b59319a830997d934e67d4ee3ca2ca9349a
--- /dev/null
+++ b/testcodes/dataio_dma230_tests/dataio_dma230_tests.hex
@@ -0,0 +1,3156 @@
+20
+06
+00
+30
+95
+05
+00
+00
+9D
+05
+00
+00
+9F
+05
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+A1
+05
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+A3
+05
+00
+00
+A5
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+A7
+05
+00
+00
+00
+F0
+02
+F8
+00
+F0
+4B
+F8
+0C
+A0
+30
+C8
+08
+38
+24
+18
+2D
+18
+A2
+46
+67
+1E
+AB
+46
+54
+46
+5D
+46
+AC
+42
+01
+D1
+00
+F0
+3D
+F8
+7E
+46
+0F
+3E
+0F
+CC
+B6
+46
+01
+26
+33
+42
+00
+D0
+FB
+1A
+A2
+46
+AB
+46
+33
+43
+18
+47
+28
+0B
+00
+00
+48
+0B
+00
+00
+10
+3A
+02
+D3
+78
+C8
+78
+C1
+FA
+D8
+52
+07
+01
+D3
+30
+C8
+30
+C1
+01
+D5
+04
+68
+0C
+60
+70
+47
+00
+00
+00
+23
+00
+24
+00
+25
+00
+26
+10
+3A
+01
+D3
+78
+C1
+FB
+D8
+52
+07
+00
+D3
+30
+C1
+00
+D5
+0B
+60
+70
+47
+10
+B5
+64
+29
+02
+D1
+00
+F0
+45
+FB
+10
+BD
+78
+29
+02
+D1
+00
+F0
+76
+FB
+10
+BD
+00
+20
+10
+BD
+1F
+B5
+1F
+BD
+10
+B5
+10
+BD
+00
+F0
+ED
+FC
+11
+46
+FF
+F7
+F7
+FF
+00
+F0
+18
+F9
+00
+F0
+05
+FD
+03
+B4
+FF
+F7
+F2
+FF
+03
+BC
+00
+F0
+3B
+FA
+10
+B5
+B5
+4C
+00
+21
+63
+68
+08
+46
+0A
+01
+98
+50
+D2
+18
+50
+60
+90
+60
+10
+64
+50
+64
+90
+64
+49
+1C
+04
+29
+F4
+DB
+01
+20
+20
+60
+10
+BD
+10
+B5
+AC
+48
+00
+68
+C0
+02
+C0
+0E
+40
+1C
+42
+01
+10
+28
+01
+DD
+A9
+48
+10
+E0
+08
+28
+01
+DD
+A8
+48
+0C
+E0
+04
+28
+01
+DD
+FF
+20
+08
+E0
+02
+28
+01
+DD
+7F
+20
+04
+E0
+01
+28
+01
+DD
+3F
+20
+00
+E0
+1F
+20
+01
+21
+C9
+07
+00
+23
+00
+2B
+01
+D0
+89
+18
+81
+43
+9A
+4C
+9E
+A0
+61
+60
+00
+F0
+A5
+FA
+00
+21
+63
+68
+08
+46
+0A
+01
+98
+50
+D2
+18
+50
+60
+90
+60
+10
+64
+50
+64
+90
+64
+49
+1C
+04
+29
+F4
+DB
+01
+20
+20
+60
+10
+BD
+70
+B5
+06
+46
+9B
+A0
+00
+F0
+D7
+FB
+8E
+4C
+25
+68
+E8
+02
+C1
+0E
+9D
+A0
+49
+1C
+00
+F0
+87
+FA
+28
+06
+01
+0F
+A2
+A0
+00
+F0
+82
+FA
+E9
+07
+C9
+0F
+A7
+A0
+00
+F0
+7D
+FA
+20
+68
+00
+06
+00
+0F
+14
+D0
+08
+28
+12
+D0
+09
+28
+10
+D0
+AA
+A0
+00
+F0
+BA
+FB
+20
+68
+00
+06
+05
+0F
+28
+06
+01
+0F
+96
+A0
+00
+F0
+6A
+FA
+00
+2D
+03
+D0
+08
+2D
+01
+D0
+09
+2D
+F1
+D1
+00
+20
+60
+60
+76
+48
+40
+68
+A0
+60
+00
+20
+C0
+43
+E0
+62
+0F
+20
+60
+63
+30
+40
+A0
+62
+A0
+61
+00
+2E
+01
+D0
+01
+20
+60
+60
+70
+BD
+70
+B5
+6E
+4D
+06
+46
+28
+68
+00
+28
+01
+D1
+FF
+F7
+6A
+FF
+6B
+4C
+02
+E0
+93
+A0
+00
+F0
+8D
+FB
+20
+68
+00
+06
+01
+0F
+03
+D0
+08
+29
+01
+D0
+09
+29
+F4
+D1
+00
+20
+60
+60
+68
+68
+A0
+60
+0F
+20
+E0
+62
+60
+63
+30
+40
+A0
+62
+A0
+61
+02
+20
+28
+60
+00
+2E
+01
+D0
+01
+20
+60
+60
+70
+BD
+5C
+49
+89
+6A
+00
+07
+00
+0F
+08
+40
+70
+47
+70
+B5
+8C
+4A
+8A
+4B
+13
+60
+09
+18
+49
+1E
+51
+60
+40
+1E
+80
+05
+89
+49
+80
+0C
+40
+18
+90
+60
+52
+48
+11
+46
+40
+68
+0C
+31
+01
+63
+01
+46
+7C
+31
+41
+63
+84
+49
+81
+63
+4E
+4D
+00
+24
+6C
+60
+08
+20
+FF
+F7
+B7
+FF
+08
+20
+FF
+F7
+DA
+FF
+00
+28
+FA
+D0
+08
+20
+FF
+F7
+D5
+FF
+00
+28
+FA
+D1
+6C
+60
+FF
+F7
+AA
+FF
+70
+BD
+0A
+18
+70
+B5
+76
+49
+20
+31
+52
+1E
+0A
+60
+73
+4A
+4A
+60
+40
+1E
+80
+05
+75
+4A
+80
+0C
+80
+18
+88
+60
+3C
+48
+0C
+31
+40
+68
+01
+62
+01
+46
+6C
+31
+41
+62
+6E
+49
+81
+62
+38
+4D
+00
+24
+6C
+60
+04
+20
+FF
+F7
+8C
+FF
+04
+20
+FF
+F7
+AF
+FF
+00
+28
+FA
+D0
+04
+20
+FF
+F7
+AA
+FF
+00
+28
+FA
+D1
+6C
+60
+FF
+F7
+7F
+FF
+70
+BD
+F0
+B5
+8B
+B0
+00
+F0
+28
+F9
+63
+48
+00
+F0
+C9
+F9
+FF
+F7
+E7
+FE
+00
+F0
+7F
+F9
+00
+27
+10
+26
+05
+25
+05
+A9
+30
+46
+FF
+F7
+98
+FF
+00
+21
+0C
+46
+0B
+46
+11
+26
+05
+AA
+10
+78
+52
+1C
+30
+28
+0E
+D0
+31
+28
+0F
+D0
+2C
+28
+11
+D0
+0A
+28
+0F
+D0
+0D
+28
+0D
+D0
+10
+29
+01
+D8
+00
+2B
+EF
+D0
+0A
+28
+09
+D0
+0F
+E0
+64
+00
+49
+1C
+F5
+E7
+64
+00
+49
+1C
+64
+1C
+F1
+E7
+01
+23
+EF
+E7
+2A
+46
+6D
+1E
+01
+2A
+01
+D8
+01
+27
+00
+E0
+00
+27
+00
+29
+0F
+D0
+2C
+28
+17
+D0
+47
+A0
+00
+F0
+8F
+F9
+22
+46
+46
+A1
+68
+46
+00
+F0
+98
+F9
+00
+20
+69
+46
+08
+72
+07
+20
+FF
+F7
+89
+FF
+00
+2F
+BF
+D0
+42
+A0
+00
+F0
+7F
+F9
+00
+F0
+25
+F9
+00
+20
+0B
+B0
+F0
+BD
+49
+A0
+00
+F0
+77
+F9
+22
+46
+48
+A1
+E6
+E7
+00
+00
+00
+30
+00
+F0
+00
+40
+FF
+03
+00
+00
+FF
+01
+00
+00
+64
+6D
+61
+20
+73
+74
+72
+75
+63
+74
+75
+72
+65
+20
+62
+6C
+6F
+63
+6B
+20
+61
+64
+64
+72
+65
+73
+73
+20
+3D
+20
+25
+78
+0A
+00
+00
+00
+49
+6E
+69
+74
+69
+61
+6C
+69
+7A
+65
+20
+50
+4C
+32
+33
+30
+00
+00
+00
+00
+2D
+20
+23
+20
+6F
+66
+20
+63
+68
+61
+6E
+6E
+65
+6C
+73
+20
+61
+6C
+6C
+6F
+77
+65
+64
+20
+3A
+20
+25
+64
+0A
+00
+00
+00
+2D
+20
+43
+75
+72
+72
+65
+6E
+74
+20
+73
+74
+61
+74
+75
+73
+20
+20
+20
+20
+20
+20
+20
+20
+3A
+20
+25
+78
+0A
+00
+00
+00
+2D
+20
+43
+75
+72
+72
+65
+6E
+74
+20
+6D
+61
+73
+74
+65
+72
+20
+65
+6E
+61
+62
+6C
+65
+20
+3A
+20
+25
+78
+0A
+00
+00
+00
+2D
+20
+77
+61
+69
+74
+20
+66
+6F
+72
+20
+44
+4D
+41
+20
+49
+44
+4C
+45
+2F
+53
+54
+41
+4C
+4C
+45
+44
+2F
+44
+4F
+4E
+45
+00
+00
+00
+00
+00
+50
+00
+40
+80
+01
+00
+30
+09
+00
+24
+0C
+3E
+80
+24
+EA
+09
+00
+24
+C0
+DC
+0B
+00
+00
+2E
+0A
+00
+00
+30
+78
+25
+30
+34
+78
+0A
+00
+2A
+2A
+20
+44
+41
+54
+41
+20
+46
+49
+4C
+45
+20
+50
+52
+4F
+43
+45
+53
+53
+49
+4E
+47
+20
+2A
+2A
+20
+54
+45
+53
+54
+20
+50
+41
+53
+53
+45
+44
+20
+2A
+2A
+0A
+00
+00
+2C
+00
+00
+00
+30
+78
+25
+30
+34
+78
+2C
+00
+04
+49
+03
+48
+08
+60
+70
+47
+02
+49
+01
+48
+08
+60
+70
+47
+00
+1C
+4E
+0E
+08
+00
+00
+30
+07
+48
+80
+47
+07
+48
+00
+47
+FE
+E7
+FE
+E7
+FE
+E7
+FE
+E7
+FE
+E7
+FE
+E7
+04
+48
+05
+49
+05
+4A
+06
+4B
+70
+47
+00
+00
+85
+05
+00
+00
+C1
+00
+00
+00
+20
+02
+00
+30
+20
+06
+00
+30
+20
+04
+00
+30
+20
+04
+00
+30
+10
+B5
+C0
+B2
+00
+F0
+36
+F8
+10
+BD
+10
+B5
+00
+F0
+41
+F8
+00
+F0
+30
+F8
+10
+BD
+00
+20
+C0
+43
+70
+47
+10
+B5
+C0
+B2
+00
+F0
+28
+F8
+10
+BD
+FE
+E7
+27
+48
+00
+21
+81
+60
+27
+49
+01
+61
+01
+21
+81
+60
+26
+48
+03
+21
+01
+61
+81
+60
+25
+49
+20
+20
+88
+61
+70
+47
+25
+48
+23
+49
+01
+60
+24
+49
+81
+61
+01
+21
+C1
+60
+C3
+21
+81
+60
+01
+69
+C9
+07
+FC
+D0
+1D
+49
+20
+20
+88
+61
+1A
+48
+00
+21
+81
+60
+30
+21
+01
+61
+03
+21
+81
+60
+70
+47
+16
+49
+8A
+68
+D2
+07
+04
+D0
+4A
+68
+D2
+07
+FC
+D1
+08
+60
+70
+47
+10
+4A
+53
+68
+DB
+07
+FC
+D1
+10
+60
+F7
+E7
+0D
+48
+0E
+49
+42
+68
+4B
+68
+92
+07
+D2
+17
+9B
+07
+DB
+17
+52
+1C
+5B
+1C
+1A
+42
+F5
+D1
+42
+68
+92
+07
+01
+D5
+00
+68
+03
+E0
+48
+68
+80
+07
+01
+D5
+08
+68
+C0
+B2
+70
+47
+04
+20
+FF
+F7
+D7
+FF
+FE
+E7
+00
+60
+00
+40
+6A
+18
+00
+00
+00
+E0
+00
+40
+00
+10
+01
+40
+8E
+0C
+01
+00
+00
+20
+00
+40
+24
+F4
+00
+00
+20
+49
+03
+20
+88
+60
+00
+20
+70
+47
+1E
+48
+00
+21
+81
+60
+03
+21
+81
+60
+00
+20
+70
+47
+1A
+48
+40
+68
+C0
+07
+C0
+17
+40
+1C
+70
+47
+17
+48
+40
+68
+C0
+07
+C0
+0F
+70
+47
+00
+B5
+01
+46
+FF
+F7
+F7
+FF
+00
+28
+FB
+D1
+12
+48
+01
+60
+08
+46
+00
+BD
+00
+B5
+02
+46
+13
+78
+00
+2B
+02
+D0
+18
+46
+FF
+F7
+EE
+FF
+52
+1C
+00
+2B
+F6
+D1
+00
+BD
+0A
+48
+40
+68
+80
+07
+C0
+0F
+70
+47
+07
+48
+40
+68
+80
+07
+C0
+17
+40
+1C
+70
+47
+00
+B5
+FF
+F7
+F7
+FF
+00
+28
+FB
+D1
+02
+48
+00
+68
+C0
+B2
+00
+BD
+00
+00
+00
+50
+00
+40
+70
+47
+00
+00
+0F
+B4
+05
+49
+10
+B5
+03
+AA
+02
+98
+00
+F0
+D1
+F9
+10
+BC
+08
+BC
+04
+B0
+18
+47
+00
+00
+0C
+00
+00
+30
+0F
+B4
+1C
+B5
+07
+4B
+06
+AA
+7B
+44
+69
+46
+00
+90
+05
+98
+00
+F0
+A7
+F9
+00
+20
+69
+46
+00
+F0
+B6
+F9
+1C
+BC
+08
+BC
+04
+B0
+18
+47
+7D
+03
+00
+00
+70
+B5
+04
+46
+85
+69
+00
+68
+C1
+06
+01
+D5
+30
+26
+00
+E0
+20
+26
+C0
+07
+07
+D0
+70
+BD
+62
+68
+30
+46
+A1
+68
+90
+47
+20
+6A
+40
+1C
+20
+62
+6D
+1E
+F6
+D5
+70
+BD
+70
+B5
+04
+46
+85
+69
+00
+78
+C0
+07
+07
+D1
+70
+BD
+62
+68
+A1
+68
+20
+20
+90
+47
+20
+6A
+40
+1C
+20
+62
+6D
+1E
+F6
+D5
+70
+BD
+00
+00
+F7
+B5
+00
+25
+75
+29
+10
+68
+00
+99
+14
+A6
+11
+D0
+C0
+46
+C0
+46
+00
+28
+02
+DA
+40
+42
+11
+A6
+08
+E0
+00
+99
+09
+68
+8A
+07
+01
+D5
+0F
+A6
+02
+E0
+49
+07
+04
+D5
+0E
+A6
+01
+25
+01
+E0
+C0
+46
+C0
+46
+00
+9F
+00
+24
+24
+37
+04
+E0
+00
+F0
+81
+F9
+30
+31
+39
+55
+64
+1C
+00
+28
+F8
+D1
+2B
+46
+32
+46
+21
+46
+00
+98
+00
+F0
+EB
+F8
+FE
+BD
+00
+00
+00
+00
+00
+00
+2D
+00
+00
+00
+2B
+00
+00
+00
+20
+00
+00
+00
+70
+B5
+04
+46
+0D
+46
+21
+46
+10
+68
+C0
+46
+C0
+46
+21
+88
+09
+05
+02
+D5
+0F
+4A
+7A
+44
+02
+E0
+0E
+4A
+7A
+44
+0E
+32
+23
+46
+00
+21
+24
+33
+05
+E0
+06
+07
+00
+09
+36
+0F
+96
+5D
+5E
+54
+49
+1C
+00
+28
+F7
+D1
+20
+78
+00
+23
+00
+07
+05
+D5
+70
+2D
+03
+D0
+00
+29
+01
+D0
+02
+23
+11
+32
+20
+46
+00
+F0
+B8
+F8
+70
+BD
+4C
+03
+00
+00
+F3
+B5
+04
+46
+00
+20
+81
+B0
+20
+62
+20
+46
+E1
+68
+88
+47
+00
+28
+7D
+D0
+25
+28
+02
+D0
+62
+68
+A1
+68
+83
+E0
+45
+4F
+00
+25
+7F
+44
+20
+46
+E1
+68
+88
+47
+20
+28
+06
+46
+08
+DB
+31
+2E
+06
+D2
+B8
+19
+20
+38
+00
+78
+00
+28
+01
+D0
+05
+43
+F0
+E7
+A8
+07
+01
+D5
+04
+20
+85
+43
+00
+20
+E0
+61
+07
+46
+A0
+61
+2A
+2E
+0A
+D0
+30
+46
+00
+F0
+52
+F9
+00
+28
+27
+D0
+B8
+00
+00
+19
+30
+3E
+00
+90
+86
+61
+19
+E0
+02
+98
+BA
+00
+12
+19
+02
+C8
+91
+61
+02
+90
+20
+46
+E1
+68
+88
+47
+01
+2F
+06
+46
+17
+D1
+E0
+69
+00
+28
+1F
+DA
+20
+20
+85
+43
+1C
+E0
+00
+98
+0A
+21
+80
+69
+48
+43
+00
+99
+80
+19
+30
+38
+88
+61
+20
+46
+E1
+68
+88
+47
+06
+46
+00
+F0
+2A
+F9
+00
+28
+EF
+D1
+01
+2F
+0A
+D0
+2E
+2E
+08
+D1
+20
+46
+E1
+68
+88
+47
+06
+46
+20
+20
+05
+43
+7F
+1C
+02
+2F
+C3
+DB
+A0
+69
+00
+28
+03
+DA
+40
+42
+A0
+61
+01
+20
+05
+43
+E8
+07
+01
+D0
+10
+20
+85
+43
+00
+2E
+24
+D0
+30
+46
+41
+38
+19
+28
+03
+D8
+01
+20
+C0
+02
+05
+43
+20
+36
+20
+46
+25
+60
+31
+46
+02
+9A
+15
+46
+FF
+F7
+D3
+FB
+00
+28
+0C
+D0
+01
+28
+07
+D0
+ED
+1D
+E8
+08
+00
+E0
+0D
+E0
+C0
+00
+08
+30
+02
+90
+77
+E7
+2D
+1D
+02
+95
+74
+E7
+62
+68
+30
+46
+A1
+68
+90
+47
+20
+6A
+40
+1C
+6C
+E7
+20
+6A
+FE
+BD
+00
+00
+10
+03
+00
+00
+10
+B5
+04
+46
+03
+E0
+FF
+F7
+FB
+FD
+40
+1C
+08
+D0
+20
+78
+05
+49
+64
+1C
+00
+28
+F6
+D1
+0A
+20
+FF
+F7
+F1
+FD
+10
+BD
+00
+20
+C0
+43
+10
+BD
+00
+00
+0C
+00
+00
+30
+70
+47
+70
+47
+70
+47
+FF
+B5
+04
+46
+0D
+46
+81
+B0
+24
+30
+00
+90
+21
+68
+88
+06
+04
+D5
+10
+22
+E0
+69
+91
+43
+21
+60
+00
+E0
+01
+20
+A8
+42
+01
+DD
+47
+1B
+00
+E0
+00
+27
+04
+98
+A1
+69
+7A
+19
+10
+18
+08
+1A
+A0
+61
+20
+78
+C0
+06
+02
+D4
+20
+46
+FF
+F7
+A1
+FE
+00
+26
+08
+E0
+03
+98
+62
+68
+A1
+68
+80
+5D
+90
+47
+20
+6A
+40
+1C
+76
+1C
+20
+62
+04
+98
+86
+42
+F3
+DB
+20
+78
+C0
+06
+0A
+D5
+20
+46
+FF
+F7
+8D
+FE
+06
+E0
+62
+68
+A1
+68
+30
+20
+90
+47
+20
+6A
+40
+1C
+20
+62
+38
+46
+7F
+1E
+00
+28
+F4
+DC
+07
+E0
+00
+98
+62
+68
+A1
+68
+40
+5D
+90
+47
+20
+6A
+40
+1C
+20
+62
+28
+46
+6D
+1E
+00
+28
+F3
+DC
+20
+46
+FF
+F7
+87
+FE
+20
+78
+00
+06
+02
+D5
+02
+20
+05
+B0
+F0
+BD
+01
+20
+FB
+E7
+00
+00
+01
+69
+4A
+1C
+02
+61
+08
+78
+70
+47
+00
+B5
+8F
+B0
+02
+91
+00
+21
+05
+91
+05
+49
+01
+93
+79
+44
+03
+91
+11
+46
+04
+90
+68
+46
+FF
+F7
+DF
+FE
+0F
+B0
+00
+BD
+00
+00
+E5
+FF
+FF
+FF
+0A
+68
+10
+70
+52
+1C
+0A
+60
+70
+47
+00
+00
+08
+4B
+70
+B5
+0D
+46
+7B
+44
+FF
+F7
+E1
+FF
+04
+46
+28
+46
+FF
+F7
+71
+FD
+00
+28
+02
+D0
+00
+20
+C0
+43
+70
+BD
+20
+46
+70
+BD
+00
+00
+D7
+FA
+FF
+FF
+01
+46
+80
+08
+08
+1A
+02
+09
+10
+18
+02
+0A
+10
+18
+02
+0C
+10
+18
+C0
+08
+82
+00
+12
+18
+52
+00
+89
+1A
+01
+E0
+40
+1C
+0A
+39
+0A
+29
+FB
+D2
+70
+47
+75
+46
+00
+F0
+25
+F8
+AE
+46
+05
+00
+69
+46
+53
+46
+C0
+08
+C0
+00
+85
+46
+18
+B0
+20
+B5
+FF
+F7
+28
+FD
+60
+BC
+00
+27
+49
+08
+B6
+46
+00
+26
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+40
+3D
+49
+00
+8D
+46
+70
+47
+10
+B5
+04
+46
+C0
+46
+C0
+46
+20
+46
+FF
+F7
+F4
+FA
+10
+BD
+00
+00
+00
+48
+70
+47
+C0
+01
+00
+30
+30
+38
+0A
+28
+01
+D2
+01
+20
+70
+47
+00
+20
+70
+47
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+41
+42
+43
+44
+45
+46
+40
+30
+58
+00
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+61
+62
+63
+64
+65
+66
+40
+30
+78
+00
+04
+00
+00
+08
+00
+00
+00
+00
+00
+00
+00
+02
+00
+01
+00
+00
+10
+00
+44
+61
+74
+61
+20
+43
+68
+61
+6E
+6E
+65
+6C
+20
+43
+53
+56
+20
+52
+65
+61
+64
+65
+72
+2F
+57
+72
+69
+74
+65
+72
+20
+75
+73
+69
+6E
+67
+20
+44
+4D
+41
+32
+33
+30
+20
+28
+41
+53
+43
+20
+62
+69
+6E
+61
+72
+79
+20
+2D
+3E
+20
+48
+65
+78
+29
+20
+74
+65
+73
+74
+73
+0A
+00
+00
+44
+0C
+00
+00
+00
+00
+00
+30
+10
+00
+00
+00
+04
+01
+00
+00
+54
+0C
+00
+00
+10
+00
+00
+30
+10
+06
+00
+00
+20
+01
+00
+00
+00
+00
+00
+00
+00
+01
+00
+30
+00
+1C
+4E
+0E
+00
+00
+00
+00
diff --git a/testcodes/dataio_dma230_tests/dataio_functions.c b/testcodes/dataio_dma230_tests/dataio_functions.c
new file mode 100644
index 0000000000000000000000000000000000000000..716f091b952b56edeaa76ea1d2c347bc00231fe3
--- /dev/null
+++ b/testcodes/dataio_dma230_tests/dataio_functions.c
@@ -0,0 +1,84 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright (c) 2025 SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+#include "CMSDK_CM0.h"
+
+#define DATA_UART  ((CMSDK_UART_TypeDef   *) CMSDK_UART1_BASE   )
+
+#define UART_STATE_TXFULL CMSDK_UART_STATE_TXBF_Msk
+#define UART_STATE_RXFULL CMSDK_UART_STATE_RXBF_Msk
+
+#define UART_CTRL_TXEN         CMSDK_UART_CTRL_TXEN_Msk
+#define UART_CTRL_RXEN         CMSDK_UART_CTRL_RXEN_Msk
+#define UART_CTRL_TXRXEN       (CMSDK_UART_CTRL_TXEN_Msk + CMSDK_UART_CTRL_RXEN_Msk)
+#define UART_CTRL_TXIRQEN      (CMSDK_UART_CTRL_TXIRQEN_Msk + UART_CTRL_TXRXEN)
+#define UART_CTRL_RXIRQEN      (CMSDK_UART_CTRL_RXIRQEN_Msk + UART_CTRL_TXRXEN)
+
+
+unsigned int DataIO_enable(void) {
+//  DATA_UART->CTRL    = 0x00;             // re-initialise/flush
+  DATA_UART->CTRL    = UART_CTRL_TXRXEN; // enble TX and RX
+  return(0);
+}
+
+unsigned int DataIO_init(void) {
+  DATA_UART->CTRL    = 0x00;             // re-initialise/flush
+  DATA_UART->CTRL    = UART_CTRL_TXRXEN; // enble TX and RX
+  return(0);
+}
+
+// Output ready check
+unsigned int DataIO_putc_ready(void) {
+  return((DATA_UART->STATE & UART_STATE_TXFULL) == 0); // ready if TXBUF empty
+}
+
+// Output Busy check
+unsigned int DataIO_putc_busy(void) {
+  return((DATA_UART->STATE & UART_STATE_TXFULL) != 0); // busy if TXBUF full
+}
+
+// Output a character
+unsigned char DataIO_putc(unsigned char my_ch) {
+  while (DataIO_putc_busy()) ; // busy wait
+  DATA_UART->DATA = my_ch; // output the character
+  return (my_ch);
+}
+
+
+// Output a (zero-terminated) string
+void DataIO_puts(unsigned char * mytext) {
+  unsigned char string_ch;
+  do {
+    string_ch = *mytext;
+    if (string_ch != (char) 0x0) {
+      DataIO_putc(string_ch);  // Normal data
+      }
+    *mytext++;
+  } while (string_ch != 0);
+  return;
+}
+
+// Input ready check
+unsigned int DataIO_getc_ready(void) {
+  return((DATA_UART->STATE & UART_STATE_RXFULL) != 0); // ready if RXBUF set
+}
+
+
+// Input Busy check
+unsigned int DataIO_getc_busy(void) {
+  return((DATA_UART->STATE & UART_STATE_RXFULL) == 0); // busy if RXBUF not set
+}
+
+// Input a character
+unsigned char DataIO_getc(void) {
+  while (DataIO_getc_busy()) ; // busy wait
+  return (DATA_UART->DATA);
+}
diff --git a/testcodes/dataio_dma230_tests/dataio_functions.h b/testcodes/dataio_dma230_tests/dataio_functions.h
new file mode 100644
index 0000000000000000000000000000000000000000..9d49f950a8e6f3202abd54f6623ff1ae17be3460
--- /dev/null
+++ b/testcodes/dataio_dma230_tests/dataio_functions.h
@@ -0,0 +1,69 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright (c) 2025 SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+// IO enable
+extern unsigned int DataIO_enable(void);
+extern unsigned int DataIO_init(void);
+
+// Output ready check
+extern unsigned char DataIO_putc_ready(void);
+
+// Output busy check
+extern unsigned int DataIO_putc_busy(void);
+
+// Output a character
+extern unsigned char DataIO_putc(unsigned char my_ch);
+
+// DataIO string output
+extern void DataIO_puts(unsigned char * mytext);
+
+// Input ready check
+extern unsigned int DataIO_getc_ready(void);
+
+// Input busy check
+extern unsigned int DataIO_getc_busy(void);
+
+// Input a character
+extern unsigned char DataIO_getc(void);
+
+/* example usage
+
+#include "CMSDK_CM0.h"
+#include <string.h>
+#include "uart_stdout.h"
+#include <stdio.h>
+
+#include "DataIO_functions.h"
+
+int main(void) {
+  unsigned char ch;
+  char tx_buf[32];
+  
+  
+  UartStdOutInit(); // console channel init
+  printf("Data Channel CSV Reader/Writer (ASC binary -> Hex) tests\n");
+  DataIO_init();  // datachannel init
+    do { // rx process CSV entry
+      if (DataIO_getc_ready()) {
+        ch = DataIO_Getc();
+        // ...
+      }
+    
+    DataIO_puts((unsigned char*) tx_buf);
+    
+    do { // tx process
+      if (DataIO_putc_ready()) {
+        DataIO_putc(tx_buf[<i>]);
+      }
+
+*/
+
+
diff --git a/testcodes/dataio_dma230_tests/makefile b/testcodes/dataio_dma230_tests/makefile
new file mode 100644
index 0000000000000000000000000000000000000000..3f00c77513120faa17e2301e390d061bfe2dff2d
--- /dev/null
+++ b/testcodes/dataio_dma230_tests/makefile
@@ -0,0 +1,259 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0
+
+# Shared software directory
+SOFTWARE_DIR = $(SOCLABS_NANOSOC_TECH_DIR)/software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = dataio_dma230_tests
+
+# Endian Option
+COMPILE_BIGEND = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST       = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -Ospace -I $(DEVICE_DIR)/Include  -I $(CORE_DIR) \
+		   -I $(SOFTWARE_DIR)/common/retarget -I $(SOFTWARE_DIR)/drivers $(USER_DEFINE)
+ARM_ASM_OPTIONS  = 
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		   --no_debug --rw_base 0x30000000 --ro_base 0x00000000 --map  --info sizes
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst $(TESTNAME).bin
+
+$(TESTNAME).o :  $(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+dma_pl230_driver.o :  $(SOFTWARE_DIR)/drivers/dma_pl230_driver.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@
+
+dataio_functions.o :  dataio_functions.c dataio_functions.h $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o dataio_functions.o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o dataio_functions.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output $@
+
+$(TESTNAME).bin : $(TESTNAME).ELF
+	fromelf --bin $< --output $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF
+	fromelf -c -d -e -s -z -v $< --output $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+        -I $(SOFTWARE_DIR)/common/retarget  \
+		-I $(SOFTWARE_DIR)/drivers \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/testcodes/dataio_tests/dataio_functions.c b/testcodes/dataio_tests/dataio_functions.c
index ade2e12ee35c2b9902be93a731f886a0aae7b89f..716f091b952b56edeaa76ea1d2c347bc00231fe3 100644
--- a/testcodes/dataio_tests/dataio_functions.c
+++ b/testcodes/dataio_tests/dataio_functions.c
@@ -24,7 +24,7 @@
 
 
 unsigned int DataIO_enable(void) {
-  DATA_UART->CTRL    = 0x00;             // re-initialise/flush
+//  DATA_UART->CTRL    = 0x00;             // re-initialise/flush
   DATA_UART->CTRL    = UART_CTRL_TXRXEN; // enble TX and RX
   return(0);
 }
diff --git a/testcodes/dataio_tests/dataio_tests.hex b/testcodes/dataio_tests/dataio_tests.hex
index 68a237a52d1c19c1703ffb4f6697313c5917db6f..85dd1772dc4bfc7466953a45420cc6b3e2e88bff 100644
--- a/testcodes/dataio_tests/dataio_tests.hex
+++ b/testcodes/dataio_tests/dataio_tests.hex
@@ -250,11 +250,11 @@ AB
 43
 18
 47
-48
+44
 07
 00
 00
-68
+64
 07
 00
 00
@@ -322,7 +322,7 @@ B5
 D1
 00
 F0
-D9
+D7
 F9
 10
 BD
@@ -340,7 +340,7 @@ B5
 BD
 00
 F0
-26
+24
 FB
 11
 46
@@ -354,7 +354,7 @@ F0
 F8
 00
 F0
-3E
+3C
 FB
 03
 B4
@@ -382,11 +382,11 @@ F8
 A0
 00
 F0
-71
+6F
 F9
 00
 F0
-2E
+2C
 F9
 00
 20
@@ -400,7 +400,7 @@ F9
 46
 00
 F0
-4F
+4D
 F9
 00
 28
@@ -408,7 +408,7 @@ F9
 D0
 00
 F0
-56
+54
 F9
 05
 46
@@ -482,7 +482,7 @@ D0
 A0
 00
 F0
-3F
+3D
 F9
 32
 46
@@ -492,7 +492,7 @@ A1
 46
 00
 F0
-48
+46
 F9
 00
 20
@@ -504,7 +504,7 @@ F9
 46
 00
 F0
-0F
+0D
 F9
 05
 98
@@ -516,7 +516,7 @@ D0
 A0
 00
 F0
-2E
+2C
 F9
 00
 F0
@@ -532,7 +532,7 @@ BD
 A0
 00
 F0
-26
+24
 F9
 32
 46
@@ -978,15 +978,11 @@ E0
 F4
 00
 00
-21
-48
-00
-21
-81
-60
+20
+49
 03
-21
-81
+20
+88
 60
 00
 20
@@ -1614,7 +1610,7 @@ C0
 46
 FF
 F7
-75
+77
 FD
 00
 28
@@ -1932,7 +1928,7 @@ FF
 46
 FF
 F7
-BB
+BD
 FD
 00
 28
@@ -1950,7 +1946,7 @@ BD
 BD
 00
 00
-6B
+6F
 FB
 FF
 FF
@@ -1980,7 +1976,7 @@ B0
 B5
 FF
 F7
-86
+88
 FD
 60
 BC
@@ -2028,7 +2024,7 @@ C0
 46
 FF
 F7
-BB
+BD
 FC
 10
 BD
@@ -2114,7 +2110,7 @@ D2
 00
 10
 00
-64
+60
 08
 00
 00
@@ -2130,7 +2126,7 @@ D2
 01
 00
 00
-6C
+68
 08
 00
 00
diff --git a/testcodes/software_list.txt b/testcodes/software_list.txt
index ebe811048e0ae468b6f0ccb3911cab45b6338594..b8d329a8f7b11bdf11a06cba861e1f96be706682 100644
--- a/testcodes/software_list.txt
+++ b/testcodes/software_list.txt
@@ -18,3 +18,4 @@ memory_tests
 romtable_tests
 interrupt_demo
 dataio_tests
+dataio_dma230_tests
diff --git a/verif/tb/verilog/nanosoc_tb.v b/verif/tb/verilog/nanosoc_tb.v
index 3ab628e10101c8afd73be3e997ee34036b2277ab..f8f9d31061e25f5c0938122009ce8df0c9737518 100644
--- a/verif/tb/verilog/nanosoc_tb.v
+++ b/verif/tb/verilog/nanosoc_tb.v
@@ -209,8 +209,8 @@ initial begin
   pullup(P1[ 4]);
   pullup(P1[ 5]);
   pullup(P1[ 6]);
-//  pullup(P1[ 7]);
-  pulldown(P1[ 7]);
+//  pullup(P1[ 7]); // FT1248 mode
+  pulldown(P1[ 7]); // EXTIO mode
   pullup(P1[ 8]);
   pullup(P1[ 9]);
   pullup(P1[10]);
@@ -789,7 +789,7 @@ nanosoc_ft1248x1_track
 `define DMAC_TRACK_PATH u_track_pl230_udma
 
 `ifndef COCOTB_SIM
-  nanosoc_dma_log_to_file #(.FILENAME("logs/dma230.log"),.NUM_CHNLS(2),.NUM_CHNL_BITS(1),.TIMESTAMP(1))
+  nanosoc_dma_log_to_file #(.FILENAME("logs/dma230.log"),.NUM_CHNLS(4),.NUM_CHNL_BITS(2),.TIMESTAMP(1))
     u_nanosoc_dma_log_to_file (
     .hclk          (`DMAC_TRACK_PATH.hclk),
     .hresetn       (`DMAC_TRACK_PATH.hresetn),
diff --git a/verif/trace/verilog/nanosoc_dma_log_to_file.v b/verif/trace/verilog/nanosoc_dma_log_to_file.v
index 68f61eb4a29ee9a53046621be0209cf20a36797c..306cc23327d88de408002c7905db7af7c8a547ca 100644
--- a/verif/trace/verilog/nanosoc_dma_log_to_file.v
+++ b/verif/trace/verilog/nanosoc_dma_log_to_file.v
@@ -11,8 +11,8 @@
 
 module nanosoc_dma_log_to_file
   #(parameter FILENAME = "dma.log",
-    parameter NUM_CHNLS = 2,
-    parameter NUM_CHNL_BITS = 1,
+    parameter NUM_CHNLS = 4,
+    parameter NUM_CHNL_BITS = 2,
     parameter TIMESTAMP = 1)
   (
   input  wire        hclk,
@@ -166,7 +166,7 @@ wire hsel = 1'b1;
    initial
      begin
        fd= $fopen(FILENAME,"w");
-       dma_req_last <= 2'b00;
+       dma_req_last <= {NUM_CHNLS{1'b0}};
        cyc_count <= 0;
        if (fd == 0)
           $write("** %m : output log file failed to open **\n");