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)) {
00122 rc = base::Board::operErrBuild(base::Board::kOperBusErr, 0);
00123 }
00124
00125 if (veri) {
00126 if (rc == 0 && data[6] != 0) {
00127 rc = base::Board::operErrBuild(base::Board::kOperBusErr, 1);
00128 }
00129 if (rc == 0 && val != (data[5]&0xff)) {
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) {
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) {
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) {
00297 rc = base::Board::operErrBuild(base::Board::kOperBusErr, 0);
00298 }
00299 if (rc == 0 && data[6] != 0) {
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