00001
00007
00008
00009 #include "nxyter/MainAdc.h"
00010
00011 #include <stdio.h>
00012
00013 #include "roc/defines_roc.h"
00014 #include "roc/defines_spi.h"
00015 #include "nxyter/defines_nxyter.h"
00016
00017
00027
00029 nxyter::MainAdc::MainAdc() :
00030 base::Peripheral(),
00031 fUseSPI(false),
00032 fPort(0),
00033 fMode4nx(0)
00034 {
00035 }
00036
00037
00038
00040
00054 nxyter::MainAdc::MainAdc(base::Board* board, int port, bool mode4nx) :
00055 base::Peripheral(board),
00056 fUseSPI(false),
00057 fPort(port),
00058 fMode4nx(mode4nx)
00059 {
00060
00061 if (board->is_SPI_I2C()) fUseSPI = true;
00062 }
00063
00064
00065
00066 nxyter::MainAdc::~MainAdc()
00067 {
00068 }
00069
00070
00072
00084 int nxyter::MainAdc::setRegister(uint8_t reg, uint8_t val, bool veri)
00085 {
00086 bool isput[6];
00087 uint32_t addr[6];
00088 uint32_t data[6];
00089 int rc;
00090
00091
00092 if (isSPI()) {
00093
00094 isput[0] = true; addr[0] = ROC_SPI_COMMAND; data[0] = 0x20;
00095
00096 isput[1] = true; addr[1] = ROC_SPI_TXDATA; data[1] = (0x12 << 24) | (0x00 << 16) | (reg << 8) | val;
00097 isput[2] = true; addr[2] = ROC_SPI_TRANSMIT; data[2] = 0x1;
00098 isput[3] = false; addr[3] = ROC_SPI_RXDATA; data[3] = 0x0;
00099 isput[4] = false; addr[4] = ROC_SPI_MASTER_STATUS; data[4] = 0x0;
00100
00101 int nop = 5;
00102
00103 rc = board().operGen(isput, addr, data, nop);
00104
00105 if (rc==0) {
00106 if ((data[3] & 0xff00) != 0x2000) {
00107 printf("nxyter::MainAdc::setRegister: SPI RXDATA error\n");
00108 rc = base::Board::operErrBuild(base::Board::kOperBusErr, 0);
00109 }
00110
00111 if ((data[4] & 1) != 1) {
00112 printf("nxyter::MainAdc::setRegister: SPI MASTER STATUS CRC-error\n");
00113 rc = base::Board::operErrBuild(base::Board::kOperBusErr, 0);
00114 }
00115 }
00116
00117 } else {
00118
00119 int adc_addr = (fPort==CON19) ? ROC_NX_ADC_ADDR : ROC_NX_ADC_ADDR2;
00120 int adc_put = (fPort==CON19) ? ROC_NX_ADC_REG : ROC_NX_ADC_REG2;
00121 int adc_get = (fPort==CON19) ? ROC_NX_ADC_ANSWER : ROC_NX_ADC_ANSWER2;
00122
00123 isput[0] = true; addr[0] = adc_addr; data[0] = reg;
00124 isput[1] = true; addr[1] = adc_put; data[1] = val;
00125 isput[2] = true; addr[2] = adc_addr; data[2] = 255;
00126 isput[3] = true; addr[3] = adc_put; data[3] = 1;
00127 isput[4] = true; addr[4] = adc_addr; data[4] = reg;
00128 isput[5] = false; addr[5] = adc_get;
00129
00130 int nop = veri ? 6 : 4;
00131
00132 rc = board().operGen(isput, addr, data, nop);
00133 if (veri) {
00134 if (rc == 0 && val != (data[5]&0xff)) {
00135 rc = base::Board::kOperVerifyErr;
00136 }
00137 }
00138 }
00139
00140 return rc;
00141 }
00142
00143
00145
00155 int nxyter::MainAdc::getRegister(uint8_t reg, uint8_t& val)
00156 {
00157 int rc;
00158
00159 if (isSPI()) {
00160 bool isput[5];
00161 uint32_t addr[5];
00162 uint32_t data[5];
00163
00164 isput[0] = true; addr[0] = ROC_SPI_COMMAND; data[0] = 0x30;
00165
00166 isput[1] = true; addr[1] = ROC_SPI_TXDATA; data[1] = (0x13 << 24) | (0x80 << 16) | (reg << 8) | 0;
00167 isput[2] = true; addr[2] = ROC_SPI_TRANSMIT; data[2] = 0x1;
00168 isput[3] = false; addr[3] = ROC_SPI_RXDATA; data[3] = 0x0;
00169 isput[4] = false; addr[4] = ROC_SPI_MASTER_STATUS; data[4] = 0x0;
00170
00171 int nop = 5;
00172
00173 rc = board().operGen(isput, addr, data, nop);
00174
00175 if (rc==0) {
00176
00177 val = data[3] & 0xff;
00178
00179 if ((data[3] & 0xff00) != 0x3000) {
00180 printf("nxyter::MainAdc::getRegister: SPI RXDATA error\n");
00181 rc = base::Board::operErrBuild(base::Board::kOperBusErr, 0);
00182 }
00183
00184 if ((data[4] & 1) != 1) {
00185 printf("nxyter::MainAdc::getRegister: SPI MASTER STATUS CRC-error\n");
00186 rc = base::Board::operErrBuild(base::Board::kOperBusErr, 0);
00187 }
00188 }
00189
00190 } else {
00191
00192 uint32_t data;
00193
00194
00195 int adc_addr = (fPort==CON19) ? ROC_NX_ADC_ADDR : ROC_NX_ADC_ADDR2;
00196 int adc_get = (fPort==CON19) ? ROC_NX_ADC_ANSWER : ROC_NX_ADC_ANSWER2;
00197
00198 rc = board().operPG(adc_addr, reg,
00199 adc_get, data);
00200 val = uint8_t(data);
00201 }
00202
00203 return rc;
00204 }
00205
00206
00208
00214 int nxyter::MainAdc::setTestMode(int ch, uint8_t mode)
00215 {
00216 int rc;
00217 uint8_t oldchmask;
00218 rc = getRegister(kReg_device_index_A, oldchmask);
00219 if (rc) return base::Board::operErrBuild(rc, 0);
00220 rc = setRegister(kReg_device_index_A, (1<<(ch&0x3)), true);
00221 if (rc) return base::Board::operErrBuild(rc, 1);
00222 rc = setRegister(kReg_test_io, mode);
00223 if (rc) return base::Board::operErrBuild(rc, 2);
00224 rc = setRegister(kReg_device_index_A, oldchmask);
00225 if (rc) return base::Board::operErrBuild(rc, 3);
00226 return 0;
00227 }
00228
00229
00231
00236 int nxyter::MainAdc::setUserPattern(uint16_t pat)
00237 {
00238 int rc;
00239 rc = setRegister(kReg_user_patt1_lsb, uint8_t(pat & 0xff));
00240 if (rc) return base::Board::operErrBuild(rc, 0);
00241 rc = setRegister(kReg_user_patt1_msb, uint8_t((pat>>8) & 0xff));
00242 if (rc) return base::Board::operErrBuild(rc, 1);
00243 return 0;
00244 }
00245
00246
00248
00271 int nxyter::MainAdc::probe()
00272 {
00273 int rc;
00274 uint8_t regs[4] = {kReg_user_patt1_lsb, kReg_user_patt1_msb,
00275 kReg_user_patt2_lsb, kReg_user_patt2_msb};
00276
00277 uint8_t save[4];
00278 uint8_t back[4];
00279 uint8_t patt[4] = {0xde, 0xed, 0xbe, 0xef};
00280
00281
00282 for (int i=0; i<4; i++) {
00283 rc = getRegister(regs[i], save[i]);
00284 if (rc) return base::Board::operErrBuild(rc, i);
00285 }
00286
00287
00288 for (int i=0; i<4; i++) {
00289 rc = setRegister(regs[i], patt[i]);
00290 if (rc) return base::Board::operErrBuild(rc, 4+i);
00291 }
00292
00293
00294 for (int i=0; i<4; i++) {
00295 rc = getRegister(regs[i], back[i]);
00296 if (rc) return base::Board::operErrBuild(rc, 8+i);
00297 if (back[i] != patt[i])
00298 return base::Board::operErrBuild(base::Board::kOperVerifyErr, 8+i);
00299 }
00300
00301
00302 for (int i=0; i<4; i++) {
00303 rc = setRegister(regs[i], save[i], true);
00304 if (rc) return base::Board::operErrBuild(rc, 12+i);
00305 }
00306
00307 return 0;
00308 }
00309
00310
00312
00329 int nxyter::MainAdc::setToDefault()
00330 {
00331 int rc;
00332 rc = setRegister(kReg_chip_port_config, 0x18, true);
00333 if (rc) return base::Board::operErrBuild(rc, 0);
00334 rc = setRegister(kReg_device_index_A, 0x0f, true);
00335 if (rc) return base::Board::operErrBuild(rc, 1);
00336 rc = setRegister(kReg_modes, 0x00, true);
00337 if (rc) return base::Board::operErrBuild(rc, 2);
00338 rc = setRegister(kReg_clock, 0x01, true);
00339 if (rc) return base::Board::operErrBuild(rc, 3);
00340 rc = setRegister(kReg_test_io, 0x00, true);
00341 if (rc) return base::Board::operErrBuild(rc, 4);
00342 rc = setRegister(kReg_output_mode, 0x00, true);
00343 if (rc) return base::Board::operErrBuild(rc, 5);
00344 rc = setRegister(kReg_output_adjust, 0x00, true);
00345 if (rc) return base::Board::operErrBuild(rc, 6);
00346 rc = setRegister(kReg_output_phase, 0x03, true);
00347 if (rc) return base::Board::operErrBuild(rc, 7);
00348 rc = setRegister(kReg_serial_control, 0x03, true);
00349 if (rc) return base::Board::operErrBuild(rc, 8);
00350 rc = setRegister(kReg_serial_ch_stat, 0x00, true);
00351 if (rc) return base::Board::operErrBuild(rc, 9);
00352 return 0;
00353 }
00354
00355
00357
00381 void nxyter::MainAdc::printRegisters(std::ostream& os)
00382 {
00383 for (int i=0; i<35; i++) {
00384 const char* regname = nxyter::MainAdc::registerName(i);
00385 if ((regname==0) || (*regname==0)) continue;
00386 uint8_t val;
00387 getRegister(i,val);
00388
00389 char sbuf[100];
00390 snprintf(sbuf, sizeof(sbuf), "Reg(%2d) %16s: 0x%02x %3u ", i, regname, (unsigned) val, (unsigned) val);
00391
00392 os << sbuf;
00393
00394 for (int j=7; j>=0; j--) os << ((val & (1<<j)) ? " 1" : " 0");
00395 os << std::endl;
00396 }
00397 }
00398
00399
00401
00421 int nxyter::MainAdc::setChannelMux(int nxnum, uint32_t val)
00422 {
00423 if (isSPI()) {
00424 printf("nxyter::MainAdc::setChannelMux() not implemented for SP605/SPI case\n");
00425 return -1;
00426 }
00427
00428 int rc = -1;
00429 if (nxnum==0) rc = board().put(ROC_NX_ADC_PORT_SELECT1, val);
00430 if (nxnum==1) rc = board().put(ROC_NX_ADC_PORT_SELECT2, val);
00431 if (nxnum==2) rc = board().put(ROC_NX_ADC_PORT_SELECT3, val);
00432 if (nxnum==3) rc = board().put(ROC_NX_ADC_PORT_SELECT4, val);
00433 return rc;
00434 }
00435
00436
00438
00445 int nxyter::MainAdc::setChannelLatency(int nxnum, uint32_t val)
00446 {
00447 if (isSPI()) {
00448 printf("nxyter::MainAdc::setChannelLatency() not implemented for SP605/SPI case\n");
00449 return -1;
00450 }
00451
00452 int rc = -1;
00453 if (nxnum==0) rc = board().put(ROC_NX_ADC_LATENCY1, val);
00454 if (nxnum==1) rc = board().put(ROC_NX_ADC_LATENCY2, val);
00455 if (nxnum==2) rc = board().put(ROC_NX_ADC_LATENCY3, val);
00456 if (nxnum==3) rc = board().put(ROC_NX_ADC_LATENCY4, val);
00457 return rc;
00458 }
00459
00460
00462
00469 int nxyter::MainAdc::getChannelLatency(int nxnum, uint32_t& val)
00470 {
00471 if (isSPI()) {
00472 printf("nxyter::MainAdc::getChannelLatency() not implemented for SP605/SPI case\n");
00473 return -1;
00474 }
00475
00476 int rc = -1;
00477 if (nxnum==0) rc = board().get(ROC_NX_ADC_LATENCY1, val);
00478 if (nxnum==1) rc = board().get(ROC_NX_ADC_LATENCY2, val);
00479 if (nxnum==2) rc = board().get(ROC_NX_ADC_LATENCY3, val);
00480 if (nxnum==3) rc = board().get(ROC_NX_ADC_LATENCY4, val);
00481 return rc;
00482 }
00483
00484
00486
00503 int nxyter::MainAdc::setClockDelay(uint32_t delay)
00504 {
00505 uint32_t sr_init;
00506 uint32_t bufg_select;
00507
00508 calcClockDelayRegs(delay, sr_init, bufg_select);
00509
00510 board().Debug(1, "SR_INIT: %8.8x", sr_init);
00511 board().Debug(1, "BUFG_SELECT: %8.8x", bufg_select);
00512
00513 int rc;
00514 rc = setClockDelaySrInit(sr_init);
00515 if (rc) return rc;
00516 rc = setClockDelayBufg(bufg_select);
00517 if (rc) return base::Board::operErrBuild(rc, 1);
00518 return 0;
00519 }
00520
00521
00522
00524
00525 void nxyter::MainAdc::calcClockDelayRegs(uint32_t delay, uint32_t& sr_init, uint32_t& bufg_select)
00526 {
00527 delay = delay & 0x1f;
00528 delay = 31 - delay;
00529
00530 bufg_select = delay & 0x01;
00531 delay = delay >> 1;
00532
00533 sr_init = 255;
00534 sr_init = sr_init << delay;
00535
00536 sr_init += sr_init >> 16;
00537 sr_init &= 0xffff;
00538 }
00539
00540
00542
00543 uint32_t nxyter::MainAdc::findClockDelay(uint32_t sr_init, uint32_t bufg_select)
00544 {
00545 for (uint32_t delay=0; delay<=31; delay++) {
00546 uint32_t sr_init1;
00547 uint32_t bufg_select1;
00548
00549 calcClockDelayRegs(delay, sr_init1, bufg_select1);
00550
00551 if ((sr_init1==sr_init) && (bufg_select1==bufg_select)) return delay;
00552 }
00553
00554 return 0xffff;
00555 }
00556
00557
00559
00573 int nxyter::MainAdc::setClockDelaySrInit(uint32_t val)
00574 {
00575 if (isSPI()) {
00576 printf("nxyter::MainAdc::setClockDelaySrInit() not implemented for SP605/SPI case\n");
00577 return -1;
00578 }
00579
00580 return board().put((fPort==CON19) ? ROC_NX_SR_INIT : ROC_NX_SR_INIT2, val);
00581 }
00582
00583
00585
00592 int nxyter::MainAdc::getClockDelaySrInit(uint32_t& val)
00593 {
00594 if (isSPI()) {
00595 printf("nxyter::MainAdc::getClockDelaySrInit() not implemented for SP605/SPI case\n");
00596 return -1;
00597 }
00598
00599 return board().get((fPort==CON19) ? ROC_NX_SR_INIT : ROC_NX_SR_INIT2, val);
00600 }
00601
00602
00604
00619 int nxyter::MainAdc::setClockDelayBufg(uint32_t val)
00620 {
00621 if (isSPI()) {
00622 printf("nxyter::MainAdc::setClockDelayBufg() not implemented for SP605/SPI case\n");
00623 return -1;
00624 }
00625
00626 return board().put((fPort==CON19) ? ROC_NX_BUFG_SELECT : ROC_NX_BUFG_SELECT2, val);
00627 }
00628
00629
00630
00632
00636 int nxyter::MainAdc::getClockDelayBufg(uint32_t& val)
00637 {
00638 if (isSPI()) {
00639 printf("nxyter::MainAdc::getClockDelayBufg() not implemented for SP605/SPI case\n");
00640 return -1;
00641 }
00642
00643 return board().get((fPort==CON19) ? ROC_NX_BUFG_SELECT : ROC_NX_BUFG_SELECT2, val);
00644 }
00645
00646
00648
00664 int nxyter::MainAdc::getAdcDirect(int num, uint32_t& val)
00665 {
00666
00667
00668
00669 int port = fMode4nx ? CON20 : fPort;
00670 int rc = -1;
00671
00672
00673 if (isSPI()) {
00674 printf("nxyter::MainAdc::getAdcDirect() not implemented for SP605/SPI case\n");
00675 } else {
00676 if (port==CON19) {
00677 if (num==ADC_PORT_A) rc = board().get(ROC_NX_ADC_DIRECT_1a, val);
00678 if (num==ADC_PORT_B) rc = board().get(ROC_NX_ADC_DIRECT_1b, val);
00679 if (num==ADC_PORT_C) rc = board().get(ROC_NX_ADC_DIRECT_1c, val);
00680 if (num==ADC_PORT_D) rc = board().get(ROC_NX_ADC_DIRECT_1d, val);
00681 } else {
00682 if (num==ADC_PORT_A) rc = board().get(ROC_NX_ADC_DIRECT_2a, val);
00683 if (num==ADC_PORT_B) rc = board().get(ROC_NX_ADC_DIRECT_2b, val);
00684 if (num==ADC_PORT_C) rc = board().get(ROC_NX_ADC_DIRECT_2c, val);
00685 if (num==ADC_PORT_D) rc = board().get(ROC_NX_ADC_DIRECT_2d, val);
00686 }
00687 }
00688
00689 return rc;
00690 }
00691
00692
00694
00695 const char* nxyter::MainAdc::registerName(int reg)
00696 {
00697 static const char* names[35] =
00698 { "chip_port_config",
00699 "chip_id",
00700 "chip_grade",
00701 "",
00702 "",
00703 "device_index_A",
00704 "",
00705 "",
00706 "modes",
00707 "clock",
00708 "",
00709 "",
00710 "",
00711 "test_io",
00712 "",
00713 "",
00714 "",
00715 "",
00716 "",
00717 "",
00718 "output_mode",
00719 "output_adjust",
00720 "output_phase",
00721 "",
00722 "",
00723 "user_patt1_lsb",
00724 "user_patt1_msb",
00725 "user_patt2_lsb",
00726 "user_patt2_msb",
00727 "",
00728 "",
00729 "",
00730 "",
00731 "serial_control",
00732 "serial_ch_stat"
00733 };
00734
00735 if (reg == 255) return "device_update";
00736 if (reg < 0 || reg >=35) return "";
00737 return names[reg];
00738 }
00739
00740 void nxyter::MainAdc::addAddrMap(base::Board* board)
00741 {
00742 if (board->is_SPI_I2C()) {
00743 board->addRegAddrMapping("ROC_SPI_COMMAND", ROC_SPI_COMMAND);
00744 board->addRegAddrMapping("ROC_SPI_TXDATA", ROC_SPI_TXDATA);
00745 board->addRegAddrMapping("ROC_SPI_TRANSMIT", ROC_SPI_TRANSMIT);
00746 board->addRegAddrMapping("ROC_SPI_RXDATA", ROC_SPI_RXDATA);
00747 board->addRegAddrMapping("ROC_SPI_MASTER_STATUS", ROC_SPI_MASTER_STATUS);
00748 } else {
00749 board->addRegAddrMapping("ROC_NX_ADC_DIRECT_1a", ROC_NX_ADC_DIRECT_1a);
00750 board->addRegAddrMapping("ROC_NX_ADC_DIRECT_1b", ROC_NX_ADC_DIRECT_1b);
00751 board->addRegAddrMapping("ROC_NX_ADC_DIRECT_1c", ROC_NX_ADC_DIRECT_1c);
00752 board->addRegAddrMapping("ROC_NX_ADC_DIRECT_1d", ROC_NX_ADC_DIRECT_1d);
00753 board->addRegAddrMapping("ROC_NX_ADC_DIRECT_2a", ROC_NX_ADC_DIRECT_2a);
00754 board->addRegAddrMapping("ROC_NX_ADC_DIRECT_2b", ROC_NX_ADC_DIRECT_2b);
00755 board->addRegAddrMapping("ROC_NX_ADC_DIRECT_2c", ROC_NX_ADC_DIRECT_2c);
00756 board->addRegAddrMapping("ROC_NX_ADC_DIRECT_2d", ROC_NX_ADC_DIRECT_2d);
00757 board->addRegAddrMapping("ROC_NX_ADC_REG", ROC_NX_ADC_REG);
00758 board->addRegAddrMapping("ROC_NX_ADC_ADDR", ROC_NX_ADC_ADDR);
00759 board->addRegAddrMapping("ROC_NX_ADC_ANSWER", ROC_NX_ADC_ANSWER);
00760 board->addRegAddrMapping("ROC_NX_ADC_REG2", ROC_NX_ADC_REG2);
00761 board->addRegAddrMapping("ROC_NX_ADC_ADDR2", ROC_NX_ADC_ADDR2);
00762 board->addRegAddrMapping("ROC_NX_ADC_ANSWER2", ROC_NX_ADC_ANSWER2);
00763 board->addRegAddrMapping("ROC_NX_SR_INIT", ROC_NX_SR_INIT);
00764 board->addRegAddrMapping("ROC_NX_BUFG_SELECT", ROC_NX_BUFG_SELECT);
00765 board->addRegAddrMapping("ROC_NX_SR_INIT2", ROC_NX_SR_INIT2);
00766 board->addRegAddrMapping("ROC_NX_BUFG_SELECT2", ROC_NX_BUFG_SELECT2);
00767 board->addRegAddrMapping("ROC_NX_ADC_LATENCY1", ROC_NX_ADC_LATENCY1);
00768 board->addRegAddrMapping("ROC_NX_ADC_LATENCY2", ROC_NX_ADC_LATENCY2);
00769 board->addRegAddrMapping("ROC_NX_ADC_LATENCY3", ROC_NX_ADC_LATENCY3);
00770 board->addRegAddrMapping("ROC_NX_ADC_LATENCY4", ROC_NX_ADC_LATENCY4);
00771 board->addRegAddrMapping("ROC_NX_ADC_PORT_SELECT1", ROC_NX_ADC_PORT_SELECT1);
00772 board->addRegAddrMapping("ROC_NX_ADC_PORT_SELECT2", ROC_NX_ADC_PORT_SELECT2);
00773 board->addRegAddrMapping("ROC_NX_ADC_PORT_SELECT3", ROC_NX_ADC_PORT_SELECT3);
00774 board->addRegAddrMapping("ROC_NX_ADC_PORT_SELECT4", ROC_NX_ADC_PORT_SELECT4);
00775 }
00776 }
00777