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; }