Mode1 Optical Validation

Dependencies:   max32630fthr

Revision:
61:a2e73c5b87e7
Parent:
60:fdccd048489b
Child:
62:21a7745d02e0
--- a/main.cpp	Tue May 31 22:37:14 2022 +0000
+++ b/main.cpp	Wed Jun 01 01:03:55 2022 +0000
@@ -35,7 +35,7 @@
 #include "platform/mbed_thread.h"
 #include "mbed.h"
 /******************************************************************************
-* https://os.mbed.com/users/phonemacro/code/MAX32664C_MAXM86161_Mode1_Optical/
+* https://os.mbed.com/users/phonemacro/code/MAX32664C_Example_Host_Code
 * Tera Term output is set to 115200 baud rate.
 * ver: 220531
 ******************************************************************************/
@@ -51,9 +51,9 @@
 
 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
 // define one and only one of the following three platforms
-//#define MAXM86146_CFG 1  // tested on MAXM86146EVSYS_sensorBrd+MAXM86161_ADAPTER_REVB+MAX32630FTHR 33.13.12
+#define MAXM86146_CFG 1  // tested on MAXM86146EVSYS_sensorBrd+MAXM86161_ADAPTER_REVB+MAX32630FTHR 33.13.12
 //#define MAXREFDES103_CFG  // not tested
-#define MAXM86161_CFG 1  // tested on MAXM86161+MAX32630FTHR v32.9.22, 32.13.12
+//#define MAXM86161_CFG 1  // tested on MAXM86161+MAX32630FTHR v32.9.22, 32.13.12
 /*****************************************************************************/
 
 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
@@ -86,7 +86,7 @@
 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
 // comment the two below if you want raw sensor+algo data
 //#define ALGO_ONLY 1  // define this if you only want algo data
-//#define RAW  // define this if you want AFE+accel data, no algorithm, tested on 33.13.31
+#define RAW  // define this if you want AFE+accel data, no algorithm, tested on 33.13.31
   //#define RAW_HZ 25   // Raw data rate
   //#define RAW_HZ 50   // Raw data rate
   #define RAW_HZ 100   // Raw data rate
@@ -96,16 +96,15 @@
 #define MAXM86161_OPT_VALIDATION_GRN 1 // Optical validatation
 //#define MAXM86161_OPT_VALIDATION_IR 1 // Optical validatation
 //#define MAXM86161_OPT_VALIDATION_RED 1 // Optical validatation
-//#define MAXM86161_OPT_VALIDATION_XTALK 1 // Optical validatation
-#define SENSOR_ONLY 1
+
 
 // Comment out both of the below for Normal Algorithm Samples Format
-//#define EXTENDED_ALGO 1  // define this if you want the extended algo samples report format
+//#define EXTENDED_ALGO 1  // define this if you want the extended algo samples report format 
 //#define PACKED_NORMAL_ALGO 1  // define this if you want the packed normal algo samples report format, 33.13.31
 //#define PCK_CFG_MASK  1 // define this and the above if you want to config mask out some of the packed data, 33.13.31
 //#define AGC 1 // define this for AGC, otherwise the default is AEC
 
-#define USE_SYN 1
+//#define USE_SYN 1
 
 //#define REDUCE_RPT_PERIOD 0x19  // Report samples every 25 frame.
 //#define USE_FIFO_BUFFER_CNT 5  // Allow the FIFO to accumulate this many samples
@@ -143,17 +142,13 @@
   #endif
 #endif
 
-#if defined(MAXM86161_OPT_VALIDATION_GRN) || defined(MAXM86161_OPT_VALIDATION_RED) || defined(MAXM86161_OPT_VALIDATION_IR) || defined(MAXM86161_OPT_VALIDATION_XTALK)
-    #define TTL_SZ (PPG_SZ)
+#ifdef ALGO_ONLY
+  #define TTL_SZ (ALGO_SZ)
 #else
-  #ifdef ALGO_ONLY
-    #define TTL_SZ (ALGO_SZ)
+  #ifdef RAW
+    #define TTL_SZ (PPG_SZ+ACCEL_SZ)
   #else
-    #ifdef RAW
-      #define TTL_SZ (PPG_SZ+ACCEL_SZ)
-    #else
-      #define TTL_SZ (PPG_SZ+ACCEL_SZ+ALGO_SZ)
-    #endif
+    #define TTL_SZ (PPG_SZ+ACCEL_SZ+ALGO_SZ)
   #endif
 #endif
 
@@ -184,7 +179,7 @@
 // read_sh_fifo
 /*****************************************************************************/
 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
-//#define OPTIMIZE_FIFO_READ 1  // Assume that the FIFO is filled at the specified rate, so just periodically check then number of samples in the FIFO to save power
+#define OPTIMIZE_FIFO_READ 1  // Assume that the FIFO is filled at the specified rate, so just periodically check then number of samples in the FIFO to save power
 #ifdef OPTIMIZE_FIFO_READ     // tested on MAXM86146EVSYS
     int32_t check_fifo_countdown;
     #define MAX_FIFO_CNT 20   // Only send the 0x00 0x00 (step 2.0), and 0x12 0x00 (step 2.1) commands every MAX_FIFO_CNT frames.
@@ -228,7 +223,7 @@
 #endif
 // 2.2
 #if defined(PACKED_NORMAL_ALGO) || defined(USE_SYN)
-        cmd[0] = 0x20;
+        cmd[0] = 0x20; 
         sh_i2c.write(SH_ADDR, cmd, 1);
 #else
         cmd[0] = 0x12; cmd[1] = 0x00;
@@ -279,7 +274,7 @@
   #if RAW_HZ <= 100
             pc.printf("%d,%d,", ppg[4], ppg[5]);
   #endif
-#endif
+#endif 
 #ifdef MAXM86146_CFG
 #if defined(RAW) || defined(SPO2_CAL_RPT)
             ppg[6] = (rsp[ptr+18] << 16) | (rsp[ptr+19] << 8) | (rsp[ptr+20]);
@@ -302,8 +297,7 @@
 
 #endif  //!defined(ALGO_ONLY)
 
-#if !defined(RAW) && !defined(SENSOR_ONLY)
-
+#ifndef RAW
 #ifdef EXTENDED_ALGO
 //            pc.printf("ptr %d ttlsiz %d ", ptr, TTL_SZ);
             opmode = rsp[ptr];
@@ -443,7 +437,7 @@
             pc.printf("%d,%d,%d,%d,", spo2_lopi,spo2_unrel, spo2_state, scd);
             pc.printf("%d,", ibi_offset);
             pc.printf("%d,", inappro_ori);
-     #endif
+     #endif       
   #else  // print some
             if (heading_printed == 0) {
                 heading_printed = 1;
@@ -483,7 +477,7 @@
 //            ibi_offset = rsp[ptr+20];
 
             sptr += (TTL_SZ);
-
+  
 #if 0
             if (heading_printed == 0) {
                 heading_printed = 1;
@@ -509,7 +503,7 @@
             pc.printf("%d,%d,%d,%d,", spo2_lopi,spo2_unrel,spo2_state, scd);
 #endif
 #endif  // end normal algo size
-#endif // !RAW && !SENSOR_ONLY
+#endif // !RAW
 
             pc.printf("\n\r");
         }
@@ -544,7 +538,17 @@
 }
 #endif // MAXREFDES103_CFG
 
-void reset_sh(void) {
+/*****************************************************************************/
+// init_sh_algo
+/*****************************************************************************/
+void init_sh_algo(void) {
+    char cmd[64];
+    char rsp[256];
+
+#ifdef OPTIMIZE_FIFO_READ
+    check_fifo_countdown = MAX_FIFO_CNT;
+#endif
+
     // switch to application mode
     rst = 0;
     mfio = 1;
@@ -556,25 +560,11 @@
 #endif
 // 33.13.31 needs at least 1.6s
 //  thread_sleep_for(100);
-}
-
-/*****************************************************************************/
-// init_sh_algo
-/*****************************************************************************/
-void init_sh_algo(void) {
-    char cmd[64];
-    char rsp[256];
-
-    reset_sh();
-
-#ifdef OPTIMIZE_FIFO_READ
-    check_fifo_countdown = MAX_FIFO_CNT;
-#endif
 
     mfio = 0; wait_us(300);
 #ifdef REDUCE_RPT_PERIOD
 //Change report period to 25
-    cmd[0] = 0x10; cmd[1] = 0x02; cmd[2] = REDUCE_RPT_PERIOD;
+    cmd[0] = 0x10; cmd[1] = 0x02; cmd[2] = REDUCE_RPT_PERIOD; 
     sh_i2c.write(SH_ADDR, cmd, 3);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
@@ -720,7 +710,7 @@
 #endif
 
 #if defined(MAXM86161_CFG) //only use Red and IR
-//1.20   map leds to slots
+//1.20   map leds to slots 
     cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x23; cmd[4] = 0x00; cmd[5] = 0x00;
     sh_i2c.write(SH_ADDR, cmd, 6);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
@@ -812,7 +802,7 @@
 #endif
 #if 0
 //write SpO2 coefficients 0x00000000 FFD7FBDD 00AB61FE
-    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x00;
+    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x00; 
     cmd[3] = 0x00; cmd[4] = 0x00; cmd[5] = 0x00; cmd[6] = 0x00;
     cmd[7] = 0xFF; cmd[8] = 0xD7; cmd[9] = 0xFB; cmd[10] = 0xDD;
     cmd[11] = 0x00; cmd[12] = 0xAB; cmd[13] = 0x61; cmd[14] = 0xFE;
@@ -822,7 +812,7 @@
     mfio = 1; mfio = 0; wait_us(300);
     pc.printf("Wr Spo2 Coeff %x\n\r", rsp[0]);
 #endif
-//1.26 rd SpO2 Coefficients
+//1.26 rd SpO2 Coefficients 
     cmd[0] = 0x51; cmd[1] = 0x07; cmd[2] = 0x00;
     sh_i2c.write(SH_ADDR, cmd, 3);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
@@ -881,14 +871,217 @@
     mfio = 1;
 }
 
+
+void set_reg_opt_validation(void) {
+    char cmd[16];
+    char rsp[32];
+ 
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x09; cmd[3] = 0x7D;  // fifo_a_full
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x11; cmd[3] = 0x3F; // ppg2_adc_rge=32768 ppg1_adc_rge=32768 tint=117.3us
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+     cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x13; cmd[3] = 0xC0; // reg ppg config 3
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+#if 0
+    // set seq1 reg
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x20; cmd[3] = 0x21;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+    // set seq2 reg
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x21; cmd[3] = 0x43;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+    // always set seq3 reg to none
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x22; cmd[3] = 0x00;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+#endif
+ 
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x09; cmd[3] = 0x7D;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+
+#if defined(MAXM86161_OPT_VALIDATION_GRN)
+    // Set Green1 current to 1uA, 10uA or 30uA
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0xA7;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+    // Set LED2 current
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0x0;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+
+    // Set Green2 current
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0x0;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+    // Set LED4 current
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x26; cmd[3] = 0x0;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+
+    // Set Red current
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x27; cmd[3] = 0x0;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+
+    // Set IR current
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x28; cmd[3] = 0x0;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+#endif
+#if defined(MAXM86161_OPT_VALIDATION_IR)
+    // Set Green current 
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0x0;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+    // Set IR current to 1uA, 10uA or 30uA
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0xA7;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+    // Set Red current
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0x0;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+#endif
+ 
+#if defined(MAXM86161_OPT_VALIDATION_RED)
+    // Set Green current 
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0x0;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+    // Set IR current
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0x0;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+    // Set Red current to 1uA, 10uA or 30uA
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0xA7;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+#endif
+#if defined(MAXM86161_OPT_VALIDATION_XTALK)
+    // Set Green current 
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0xFF;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+    // Set IR current to 1uA, 10uA or 30uA
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0xFF;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+    // Set Red current
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0xFF;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+#endif
+ 
+    // configure LED Range
+    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x2A; cmd[3] = 0x3F;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
+ 
+ 
+}
+ 
 /*****************************************************************************/
 // init_sh_raw
 /*****************************************************************************/
 void init_sh_raw(void) {
     char cmd[16];
     char rsp[256];
-
-    reset_sh();
+    // switch to application mode
+    rst = 0;
+    mfio = 1;
+    thread_sleep_for(10);
+    rst = 1;
+    thread_sleep_for(1500);
+#ifdef MAXREFDES103_CFG
+    init_max20303_pmic();
+#endif
 
     mfio = 0; wait_us(300);
 
@@ -946,34 +1139,24 @@
     pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]);
 #endif
 
-//#if defined(MAXM86146_CFG) || defined(MAXM86161_CFG)
-#if 0
 // raw enable sh accel
     cmd[0] = 0x44; cmd[1] = 0x04; cmd[2] = 0x01; cmd[3] = 0x00;
     sh_i2c.write(SH_ADDR, cmd, 4);
     mfio = 1; thread_sleep_for(20); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    pc.printf("raw1.10 accel Status: %x\n\r", rsp[0]);
+    pc.printf("raw1.4 Status: %x\n\r", rsp[0]);
 // raw enable AFE
-//    cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01; cmd[3] = 0x00;
+//    cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01; cmd[3] = 0x00; 
 //    sh_i2c.write(SH_ADDR, cmd, 4);
     cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01;  // 3 bytes // tested on 33.13.31/12
     sh_i2c.write(SH_ADDR, cmd, 3);
-//    cmd[0] = 0x44; cmd[1] = 0xFF; cmd[2] = 0x02; cmd[3] = 0x04; cmd[4] = 0x01; cmd[5] = 0x00; cmd[6] = 0x00; cmd[7] = 0x01; cmd[8] = 0x00;
+//    cmd[0] = 0x44; cmd[1] = 0xFF; cmd[2] = 0x02; cmd[3] = 0x04; cmd[4] = 0x01; cmd[5] = 0x00; cmd[6] = 0x00; cmd[7] = 0x01; cmd[8] = 0x00; 
 //    sh_i2c.write(SH_ADDR, cmd, 9);
     mfio = 1; thread_sleep_for(465); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    pc.printf("raw1.11 afe en Status: %x\n\r", rsp[0]);
-#else
-    cmd[0] = 0x44; cmd[1] = 0xFF; cmd[2] = 0x02; cmd[3] = 0x04; cmd[4] = 0x01; cmd[5] = 0x00; cmd[6] = 0x00; cmd[7] = 0x01; cmd[8] = 0x00;
-    sh_i2c.write(SH_ADDR, cmd, 9);
-    mfio = 1; thread_sleep_for(465); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    pc.printf("raw1.10/11 accel, afe en Status: %x\n\r", rsp[0]);
-#endif
+    pc.printf("raw1.6 Status: %x\n\r", rsp[0]);
 
 /// raw 1.20  AFE part id
     cmd[0] = 0x41; cmd[1] = 0x00; cmd[2] = 0xFF;
@@ -990,7 +1173,7 @@
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     pc.printf("1.7 Who Status: %x %x\n\r", rsp[0], rsp[1]);
 
-// raw1.8 sample rate
+// raw1.8 sample rate 
 #if RAW_HZ == 25
     cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x00;  // set AFE reg 0x12 to 25 Hz, ave 1
 #elif RAW_HZ == 50
@@ -1076,289 +1259,15 @@
     mfio = 1; mfio = 0; wait_us(300);
     pc.printf("Seq cntrl3 Status: %x\n\r", rsp[0]);
 #endif
+set_reg_opt_validation();
 mfio = 1;
 }
 
-
-
-void set_reg_opt_validation(void) {
-    char cmd[16];
-    char rsp[32];
-
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x09; cmd[3] = 0x7D;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x11; cmd[3] = 0x3F;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x30;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x13; cmd[3] = 0xC0;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-#if 1
-    // set seq1 reg
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x20; cmd[3] = 0x21;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    // set seq2 reg
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x21; cmd[3] = 0x03;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-#endif
-    // always set seq3 reg to none
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x22; cmd[3] = 0x00;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x09; cmd[3] = 0x7D;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-#if defined(MAXM86161_OPT_VALIDATION_GRN)
-    // Set Green current to 1uA, 10uA or 30uA
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0xA7;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    // Set IR current
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0x0;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    // Set Red current
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0x0;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-#endif
-#if defined(MAXM86161_OPT_VALIDATION_IR)
-    // Set Green current 
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0x0;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    // Set IR current to 1uA, 10uA or 30uA
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0xA7;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    // Set Red current
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0x0;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-#endif
-
-#if defined(MAXM86161_OPT_VALIDATION_RED)
-    // Set Green current 
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0x0;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    // Set IR current
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0x0;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    // Set Red current to 1uA, 10uA or 30uA
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0xA7;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-#endif
-#if defined(MAXM86161_OPT_VALIDATION_XTALK)
-    // Set Green current 
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0xFF;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    // Set IR current to 1uA, 10uA or 30uA
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0xFF;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-    // Set Red current
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0xFF;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-#endif
-
-    // configure LED Range
-    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x2A; cmd[3] = 0x3F;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("wr afe reg Status: %x\n\r", rsp[0]);
-
-
-}
-
-
-/*****************************************************************************/
-// init_sh_opt_validation  Mode1 optical validation for MAXM86161
-/*****************************************************************************/
-void init_sh_opt_validation(void) {
-    char cmd[16];
-    char rsp[32];
-
-    reset_sh();
-
-    mfio = 0;wait_us(300);
-//1.0 read operating mode
-    cmd[0] = 0x02; cmd[1] = 0x00;
-    sh_i2c.write(SH_ADDR, cmd, 2);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 2);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    pc.printf("\n\r 0x02 0x00 Status, Read Operating Mode: %x %x\n\r", rsp[0], rsp[1]);
-//1.1 rd ver
-    cmd[0] = 0xFF; cmd[1] = 0x03;
-    sh_i2c.write(SH_ADDR, cmd, 2);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 4);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("Ver: %d %d %d %d\n\r", rsp[0], rsp[1], rsp[2], rsp[3]);
-
-//  Sensor Data only
-    cmd[0] = 0x10; cmd[1] = 0x00; cmd[2] = 0x01;
-    sh_i2c.write(SH_ADDR, cmd, 3);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("Sensor data Status: %x\n\r", rsp[0]);
-
-//  HRM, SpO2
-    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0A; cmd[3] = 0x00;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("HR, SPO2 Status: %x\n\r", rsp[0]);
-//  Disable AEC
-    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0B; cmd[3] = 0x00;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("Disable AEC Status: %x\n\r", rsp[0]);
-//  Disable Auto PD
-    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x12; cmd[3] = 0x00;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("Disable Auto PD Status: %x\n\r", rsp[0]);
-//  Disable SCD
-    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0C; cmd[3] = 0x00;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("Disable SCD Status: %x\n\r", rsp[0]);
-
-
-//  Enable Algo, normal report
-    cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x01;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(465); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("Disable SCD Status: %x\n\r", rsp[0]);
-
-#if 1
-//1.31 rd AFE part id
-    cmd[0] = 0x41; cmd[1] = 0x00; cmd[2] = 0xFF;
-    sh_i2c.write(SH_ADDR, cmd, 3);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 2);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("1.31 part id afe %x %x\n\r", rsp[0], rsp[1]);
-//1.32 rd accel who
-    cmd[0] = 0x41; cmd[1] = 0x04; cmd[2] = 0x0F;
-    sh_i2c.write(SH_ADDR, cmd, 3);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 2);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("1.32 who accel %x %x\n\r", rsp[0], rsp[1]);
-#endif
-
-    set_reg_opt_validation();
-
-mfio = 1;
-}
 /*****************************************************************************/
 // main
 /*****************************************************************************/
 int main()
 {
-    char cmd[16];
-    char rsp[32];
     sh_i2c.frequency(400000);
     int32_t ledcnt = 0;
     rLED = LED_OFF;  gLED = LED_ON;  bLED = LED_OFF;
@@ -1367,7 +1276,6 @@
 #if 0 // test disable algo
     char cmd[8];
     char rsp[256];
-
     // 3.1 Disable algo
     mfio = 1; mfio = 0; wait_us(300);
     cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x00;
@@ -1381,8 +1289,6 @@
     //ticker.attach(callback(&blink_timer), BLINKING_RATE_MS);  /* set timer for one second */
 #ifdef RAW
     init_sh_raw();
-#elif defined(MAXM86161_OPT_VALIDATION_RED) || defined(MAXM86161_OPT_VALIDATION_IR) || defined(MAXM86161_OPT_VALIDATION_GRN)
-    init_sh_opt_validation();
 #else
     init_sh_algo();
 #endif
@@ -1392,7 +1298,7 @@
     Timer tmr1;
     while (1) {
         tmr1.start();
-#if defined(RAW)
+#if defined(RAW) 
   #if RAW_HZ == 25
         if (tmr1.read_ms() >= 40) {
   #elif RAW_HZ == 50
@@ -1421,7 +1327,6 @@
 #endif
             tmr1.reset();
             read_sh_fifo();
-
             if ((ledcnt++ % 50) == 0)
                 gLED = !gLED;
         }