diff --git a/src/apsctl/RCU.yaml b/src/apsctl/RCU.yaml
index d96227680db9e75c24f32aa4a16a8e51bc83bf89..883cb20c1c84a7582d6cfb2ce7e82f7be08459b6 100644
--- a/src/apsctl/RCU.yaml
+++ b/src/apsctl/RCU.yaml
@@ -239,6 +239,24 @@ variables:
      dim: 96
      mask: Ant_mask
 
+   - name: RCU_GPIO1
+     driver: I2C_RFCHAIN
+     devreg:  [IO1.GPIO1,IO2.GPIO1,IO3.GPIO1]
+     width: 8
+     rw:  ro
+     dtype: uint8
+     dim: 96
+     mask: Ant_mask
+
+   - name: RCU_GPIO2
+     driver: I2C_RFCHAIN
+     devreg:  [IO1.GPIO2,IO2.GPIO2,IO3.GPIO2]
+     width: 8
+     rw:  ro
+     dtype: uint8
+     dim: 96
+     mask: Ant_mask
+
    - name: RCU_LED0
      driver: I2C_RCU
      description: LED on RCU
diff --git a/src/drivers/spibitbang1.cpp b/src/drivers/spibitbang1.cpp
index 2cf5ea3a5c76e7c9da38d0fd40074ff5ad016954..559b51d53d93f50a56ec01733faf1bfaad22be0f 100644
--- a/src/drivers/spibitbang1.cpp
+++ b/src/drivers/spibitbang1.cpp
@@ -13,47 +13,46 @@ c_spibitbang1::c_spibitbang1(const t_driver config1) : drvbase (config1){
   SDIOpin=config1.parameters[1];
   CSpin=config1.parameters[3];
 };
+#define setbit(dev,reg,v) bit[0]=v;parent->seti2c(dev,1,reg,bit)
 
 bool c_spibitbang1::I2Csend(int addr,int reg,int len,t_buffer* data,int direction){
   t_buffer bit[1]={0};
   if (direction==0) {  //Send
     int data2 = ( 0x00 << 23 ) + ( 0x00 << 21 ) + ( reg << 8 ) + data[0];
-    std::cout << "SPI send" << data2 << "\n";          
-    bit[0]={0};parent->seti2c(CS,1,CSpin,bit);
+    std::cout << "SPI send" << data2 << "\n";
+    setbit(CS,CSpin,0);          
     for (int x=0;x<32;x++)
     {
-      bit[0]=(data2>>(31-x)) & 1;  //Not that efficient, but works
-      parent->seti2c(SDIO,1,SDIOpin,bit);
-      bit[0]={1};parent->seti2c(CLK,1,CLKpin,bit);
-      bit[0]={0};parent->seti2c(CLK,1,CLKpin,bit);
+      setbit(SDIO,SDIOpin,(data2>>(31-x)) & 1);          
+      setbit(CLK,CLKpin,1);
+      setbit(CLK,CLKpin,0);          
     }
-    bit[0]={1};parent->seti2c(CS,1,CSpin,bit);
-    bit[0]={1};parent->seti2c(SDIO,1,SDIOpin,bit);
+    setbit(CS,CSpin,1);          
+    setbit(SDIO,SDIOpin,1);          
   } else {
     int data2 = ( 0x01 << 15) + ( 0x00 << 13 ) + reg;
-    bit[0]={0};parent->seti2c(CLK,1,CLKpin,bit);
-    bit[0]={0};parent->seti2c(CS,1,CSpin,bit);//enable
+    setbit(CLK,CLKpin,0);          
+    setbit(CS,CSpin,0);          
     for (int x=0;x<16;x++){
-      bit[0]={0};parent->seti2c(CLK,1,CLKpin,bit);
-      bit[0]=(data2>>(15-x)) & 1;  //Not that efficient, but works
-      parent->seti2c(SDIO,1,SDIOpin,bit);
-      bit[0]={1};parent->seti2c(CLK,1,CLKpin,bit);
+      setbit(CLK,CLKpin,0);          
+      setbit(SDIO,SDIOpin,(data2>>(15-x)) & 1);          
+      setbit(CLK,CLKpin,1);          
     }
-    bit[0]=1;parent->seti2c(SDIOdir,1,SDIOpin,bit);
-    bit[0]=0;parent->seti2c(CLK,1,CLKpin,bit);
+    setbit(SDIOdir,SDIOpin,1);          
+    setbit(CLK,CLKpin,0);          
 
     data2=0;
     for (int x=0;x<8;x++){
         parent->geti2c(SDIO,1,SDIOpin,bit);
         data2<<=1;
         data2+=bit[0];
-        bit[0]=1;parent->seti2c(CLK,1,CLKpin,bit);
-        bit[0]=0;parent->seti2c(CLK,1,CLKpin,bit);
+        setbit(CLK,CLKpin,1);          
+        setbit(CLK,CLKpin,0);          
       }
 
-    bit[0]=1;parent->seti2c(CS,1,CSpin,bit);//disable
-    bit[0]=1;parent->seti2c(SDIO,1,SDIOpin,bit);
-    bit[0]=0;parent->seti2c(SDIOdir,1,SDIOpin,bit);
+    setbit(CS,CSpin,1);          
+    setbit(SDIO,SDIOpin,1);          
+    setbit(SDIOdir,SDIOpin,0);          
     std::cout << "spibitbang  reg="<<reg<<" data="<<data2<<"\n";
     data[0]=data2;
   }