• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

roclib/src_roc/I2cDevice.cxx (r4864/r4162)

Go to the documentation of this file.
00001 //============================================================================
00006 //============================================================================
00007 
00008 #include "roc/I2cDevice.h"
00009 
00010 #include <stdio.h>
00011 
00012 #include "roc/defines_roc.h"
00013 #include "roc/defines_i2c.h"
00014 #include "roc/defines_spi.h"
00015 
00030 //----------------------------------------------------------------------------
00032 roc::I2cDevice::I2cDevice() :
00033   base::Peripheral(), fUseSPI(false), fPort(0), fSlaveAddr(0)
00034 {
00035 }
00036 
00037 
00038 //----------------------------------------------------------------------------
00040 
00047 roc::I2cDevice::I2cDevice(base::Board* board, int port, uint8_t addr) :
00048   base::Peripheral(board), fUseSPI(false), fPort(port), fSlaveAddr(addr)
00049 {
00050    if (board->is_SPI_I2C()) fUseSPI = true;
00051 }
00052 
00053 //----------------------------------------------------------------------------
00054 
00055 roc::I2cDevice::~I2cDevice()
00056 {
00057 }
00058 
00059 //----------------------------------------------------------------------------
00061 
00075 int roc::I2cDevice::setRegister(uint8_t reg, uint8_t val, bool veri)
00076 {
00077 
00078    bool isput[7];
00079    uint32_t addr[7];
00080    uint32_t data[7];
00081    int rc;
00082 
00083    if (isSPI()) {
00084 
00085       isput[0] = true;   addr[0] = ROC_SPI_COMMAND;        data[0] = 0x20;
00086       isput[1] = true;   addr[1] = ROC_SPI_TXDATA;         data[1] = (0x1 << 24) | (fSlaveAddr << 16) | (reg << 8) | val;
00087       isput[2] = true;   addr[2] = ROC_SPI_TRANSMIT;       data[2] = 0x1;
00088       isput[3] = false;  addr[3] = ROC_SPI_RXDATA;         data[3] = 0x0;
00089       isput[4] = false;  addr[4] = ROC_SPI_MASTER_STATUS;  data[4] = 0x0;
00090 
00091       int nop = 5;
00092 
00093       rc = board().operGen(isput, addr, data, nop);
00094 
00095       if (rc==0) {
00096          if ((data[3] & 0xff00) != 0x2000) {
00097             printf("SPI-I2C RXDATA error\n");
00098             rc = base::Board::operErrBuild(base::Board::kOperBusErr, 0);
00099          }
00100 
00101          if ((data[4] & 1) != 1) {
00102             printf("SPI-I2C MASTER_STATUS CRC-error\n");
00103             rc = base::Board::operErrBuild(base::Board::kOperBusErr, 0);
00104          }
00105       }
00106 
00107    } else {
00108 
00109       isput[0] = true;  addr[0] = ROC_NX_I2C_SWITCH;    data[0] = fPort;
00110       isput[1] = true;  addr[1] = ROC_NX_I2C_SLAVEADDR; data[1] = fSlaveAddr;
00111       isput[2] = true;  addr[2] = ROC_NX_I2C_REGISTER;  data[2] = reg;
00112       isput[3] = true;  addr[3] = ROC_NX_I2C_DATA;      data[3] = val;
00113       isput[4] = false; addr[4] = ROC_NX_I2C_ERROR;
00114       isput[5] = false; addr[5] = ROC_NX_I2C_DATA;
00115       isput[6] = false; addr[6] = ROC_NX_I2C_ERROR;
00116 
00117       int nop = veri ? 7 : 5;
00118 
00119       rc = board().operGen(isput, addr, data, nop);
00120 
00121       if ((rc == 0) && (data[4] != 0)) {            // check I2C bus error on put
00122          rc = base::Board::operErrBuild(base::Board::kOperBusErr, 0);
00123       }
00124 
00125       if (veri) {
00126          if (rc == 0 && data[6] != 0) {          // check I2C bus error on readback
00127             rc = base::Board::operErrBuild(base::Board::kOperBusErr, 1);
00128          }
00129          if (rc == 0 && val != (data[5]&0xff)) { // check readback value
00130             rc = base::Board::kOperVerifyErr;
00131          }
00132       }
00133 
00134    }
00135 
00136    return rc;
00137 }
00138 
00139 //----------------------------------------------------------------------------
00141 
00152 int roc::I2cDevice::getRegister(uint8_t reg, uint8_t& val)
00153 {
00154   bool isput[5];
00155   uint32_t addr[5];
00156   uint32_t data[5];
00157   int rc;
00158 
00159   if (isSPI()) {
00160 
00161      isput[0] = true;   addr[0] = ROC_SPI_COMMAND;        data[0] = 0x30;
00162      isput[1] = true;   addr[1] = ROC_SPI_TXDATA;         data[1] = (0x1 << 24) | (fSlaveAddr << 16) | (reg << 8) | 0;
00163      isput[2] = true;   addr[2] = ROC_SPI_TRANSMIT;       data[2] = 0x1;
00164      isput[3] = false;  addr[3] = ROC_SPI_RXDATA;         data[3] = 0x0;
00165      isput[4] = false;  addr[4] = ROC_SPI_MASTER_STATUS;  data[4] = 0x0;
00166 
00167      int nop = 5;
00168 
00169      rc = board().operGen(isput, addr, data, nop);
00170 
00171      printf("Get I2C register %u\n", reg);
00172 
00173      if (rc==0) {
00174         val = data[3] & 0xff;
00175 
00176         if ((data[3] & 0xff00) != 0x3000) {
00177            printf("SPI-I2C error\n");
00178            rc = base::Board::operErrBuild(base::Board::kOperBusErr, 0);
00179         }
00180 
00181         if ((data[4] & 1) != 1) {
00182            printf("SPI-I2C CRC-error\n");
00183            rc = base::Board::operErrBuild(base::Board::kOperBusErr, 0);
00184         }
00185      }
00186 
00187      return rc;
00188   }
00189 
00190 
00191   isput[0] = true;  addr[0] = ROC_NX_I2C_SWITCH;    data[0] = fPort;
00192   isput[1] = true;  addr[1] = ROC_NX_I2C_SLAVEADDR; data[1] = fSlaveAddr;
00193   isput[2] = true;  addr[2] = ROC_NX_I2C_REGISTER;  data[2] = reg;
00194   isput[3] = false; addr[3] = ROC_NX_I2C_DATA;
00195   isput[4] = false; addr[4] = ROC_NX_I2C_ERROR;
00196 
00197   rc = board().operGen(isput, addr, data, 5);
00198 
00199   val = uint8_t(data[3]);
00200 
00201   if (rc == 0 && data[4] != 0) {            // check I2C bus error on get
00202     rc = base::Board::kOperBusErr;
00203   }
00204   
00205   return rc;
00206 }
00207 
00208 //----------------------------------------------------------------------------
00210 
00220 int roc::I2cDevice::getRegister16(uint8_t reg, uint16_t& val)
00221 {
00222    if (isSPI()) {
00223       printf("No 16-bit read operations for SPI-I2C interface\n");
00224       return 1;
00225    }
00226 
00227    bool isput[7];
00228    uint32_t addr[7];
00229    uint32_t data[7];
00230    int rc;
00231 
00232    isput[0] = true;  addr[0] = ROC_NX_I2C_SWITCH;    data[0] = fPort;
00233    isput[1] = true;  addr[1] = ROC_NX_I2C_SLAVEADDR; data[1] = fSlaveAddr;
00234    isput[2] = true;  addr[2] = ROC_NX_I2C_REGISTER;  data[2] = reg;
00235    isput[3] = true;  addr[3] = ROC_NX_I2C_READ16;    data[3] = 1;
00236    isput[4] = false; addr[4] = ROC_NX_I2C_DATA;
00237    isput[5] = false; addr[5] = ROC_NX_I2C_ERROR;
00238    isput[6] = true;  addr[6] = ROC_NX_I2C_READ16;    data[6] = 0;
00239 
00240    rc = board().operGen(isput, addr, data, 7);
00241 
00242    val = uint16_t(data[4]);
00243 
00244    if (rc == 0 && data[5] != 0) {            // check I2C bus error on get
00245       rc = base::Board::kOperBusErr;
00246    }
00247 
00248    return rc;
00249 }
00250 
00251 //----------------------------------------------------------------------------
00253 
00270 int roc::I2cDevice::setRegisterVerify(uint8_t reg, uint8_t valset, 
00271                                       uint8_t& valget)
00272 {
00273    if (isSPI()) {
00274       valget = valset;
00275       return setRegister(reg, valset, true);
00276    }
00277 
00278 
00279   bool isput[7];
00280   uint32_t addr[7];
00281   uint32_t data[7];
00282   int rc;
00283 
00284   isput[0] = true;  addr[0] = ROC_NX_I2C_SWITCH;    data[0] = fPort;
00285   isput[1] = true;  addr[1] = ROC_NX_I2C_SLAVEADDR; data[1] = fSlaveAddr;
00286   isput[2] = true;  addr[2] = ROC_NX_I2C_REGISTER;  data[2] = reg;
00287   isput[3] = true;  addr[3] = ROC_NX_I2C_DATA;      data[3] = valset;
00288   isput[4] = false; addr[4] = ROC_NX_I2C_ERROR;
00289   isput[5] = false; addr[5] = ROC_NX_I2C_DATA;
00290   isput[6] = false; addr[6] = ROC_NX_I2C_ERROR;
00291 
00292   rc = board().operGen(isput, addr, data, 7);
00293 
00294   valget = uint8_t(data[5]);
00295 
00296   if (rc == 0 && data[4] != 0) {            // check I2C bus error on put
00297     rc = base::Board::operErrBuild(base::Board::kOperBusErr, 0);
00298   }
00299   if (rc == 0 && data[6] != 0) {            // check I2C bus error on readback
00300     rc = base::Board::operErrBuild(base::Board::kOperBusErr, 1);
00301   }
00302   
00303   return rc;
00304 }
00305 
00306 //----------------------------------------------------------------------------
00308 
00324 int roc::I2cDevice::setRegisterArray(uint8_t reg, const uint8_t *val, int nreg,
00325                                      bool veri)
00326 {
00327   for (int i=0; i<nreg; i++) {
00328     int rc = setRegister(reg+i, val[i], veri);
00329     if (rc) return base::Board::operErrBuild(rc, i);
00330   }
00331   return 0;
00332 }
00333 
00334 //----------------------------------------------------------------------------
00336 
00350 int roc::I2cDevice::getRegisterArray(uint8_t reg, uint8_t *val, int nreg)
00351 {
00352   for (int i=0; i<nreg; i++) {
00353     int rc = getRegister(reg+i, val[i]);
00354     if (rc) return base::Board::operErrBuild(rc, i);
00355   }
00356   return 0;
00357 }
00358 
00359 //----------------------------------------------------------------------------
00361 
00376 int roc::I2cDevice::setMailboxRegister(uint8_t reg, const uint8_t *val, int nval)
00377 {
00378   for (int i=0; i<nval; i++) {
00379     int rc = setRegister(reg, val[i]);
00380     if (rc) return base::Board::operErrBuild(rc, i);
00381   }
00382   return 0;
00383 }
00384 
00385 //----------------------------------------------------------------------------
00387 
00401 int roc::I2cDevice::getMailboxRegister(uint8_t reg, uint8_t *val, int nval)
00402 {
00403   for (int i=0; i<nval; i++) {
00404     int rc = getRegister(reg, val[i]);
00405     if (rc) return base::Board::operErrBuild(rc, i);
00406   }
00407   return 0;
00408 }
00409 
00410 //----------------------------------------------------------------------------
00412 
00413 void roc::I2cDevice::addAddrMap(base::Board* board)
00414 {
00415    if (board->is_SPI_I2C()) {
00416       board->addRegAddrMapping("ROC_SPI_COMMAND", ROC_SPI_COMMAND);
00417       board->addRegAddrMapping("ROC_SPI_TXDATA", ROC_SPI_TXDATA);
00418       board->addRegAddrMapping("ROC_SPI_TRANSMIT", ROC_SPI_TRANSMIT);
00419       board->addRegAddrMapping("ROC_SPI_RXDATA", ROC_SPI_RXDATA);
00420       board->addRegAddrMapping("ROC_SPI_MASTER_STATUS", ROC_SPI_MASTER_STATUS);
00421    } else {
00422       board->addRegAddrMapping("ROC_NX_I2C_DATA", ROC_NX_I2C_DATA);
00423       board->addRegAddrMapping("ROC_NX_I2C_SLAVEADDR", ROC_NX_I2C_SLAVEADDR);
00424       board->addRegAddrMapping("ROC_NX_I2C_REGISTER", ROC_NX_I2C_REGISTER);
00425       board->addRegAddrMapping("ROC_NX_I2C_ERROR", ROC_NX_I2C_ERROR);
00426       board->addRegAddrMapping("ROC_NX_I2C_SWITCH", ROC_NX_I2C_SWITCH);
00427       board->addRegAddrMapping("ROC_NX_I2C_READ16", ROC_NX_I2C_READ16);
00428    }
00429 }
00430 
00431 //----------------------------------------------------------------------------

Generated on Tue Dec 10 2013 04:52:23 for ROCsoft by  doxygen 1.7.1