diff --git a/src/cmd.cpp b/src/cmd.cpp index fe986963221ab66a4986f828a0c28c4c7cb38353..b16f3d368b11b6c0956818e53a96eb31305091cc 100644 --- a/src/cmd.cpp +++ b/src/cmd.cpp @@ -262,7 +262,7 @@ CMDstatus CMD::Mread(int argc, char* argv[], TermOutput& termout, Serverdat *sd) generic.add_options() ("help,h", "shows this help text") ("offs", po::value<uint>(),"offset from base address (per dword) (default=0)") - ("nvalues", po::value<uint>(),"number of dwords to read (default=all)") + ("nvalues", po::value<int>(),"number of dwords to read (default=all)") ; po::options_description hidden("hidden options"); hidden.add_options() @@ -298,7 +298,7 @@ CMDstatus CMD::Mread(int argc, char* argv[], TermOutput& termout, Serverdat *sd) if(vm.count("file")) { addr_str = vm["file"].as<string>(); } if(vm.count("offs")) { offs = vm["offs"].as<uint>(); } if(vm.count("nvalues")) { nvalues = vm["nvalues"].as<int>(); } - if(sd->unb->read(termout, addr_str, offs,nvalues)) ret.status = CMD_STATUS_OK; + if(sd->unb->read(termout, addr_str, offs, nvalues)) ret.status = CMD_STATUS_OK; } else throw runtime_error("missing argument(s)"); } catch(po::error& e) { diff --git a/src/common.cpp b/src/common.cpp index b852127d62c9da5a3af155ed4da9e699028f4e79..16fbf6e7afb333a2255468af31f151b83c1da6ed 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -125,7 +125,7 @@ bool Common::read(TermOutput& termout, const string addr, const uint offs, const if(type == "mm") { RegisterMap *regmap = node->get_RegisterMap(termout.strout); - uint32_t nvalues = (len<0 ? (regmap->getSpan(relative_addr) / sizeof(uint32_t)) : len); + uint32_t nvalues = (len<0 ? regmap->getSpan(relative_addr) : len); std::vector<int> datavec; if(node->mread(termout.strout, relative_addr, offs, datavec, nvalues)) { retcnt++; diff --git a/src/io/tcpsocket.h b/src/io/tcpsocket.h index c7e5526258706eeb125c5e9b5026d68d24017c1a..b493d424ab624bfaebbe241b9f921be1e77276df 100644 --- a/src/io/tcpsocket.h +++ b/src/io/tcpsocket.h @@ -49,7 +49,6 @@ class TCPCSSocket { TCPCSSocket(int descr = -1); ~TCPCSSocket(); void Shutdown() { shutdown(sock,SHUT_RDWR); } - void Close() { close(sock); } size_t rx(unsigned char* buf, size_t size) throw(const char*); size_t _rx(unsigned char* buf, size_t size) throw(const char*); size_t tx(const unsigned char* data, size_t size) throw(const char*); diff --git a/src/io/unbos.cpp b/src/io/unbos.cpp index 7d860700107f61d3b3a7120b55ea12a43c0f1ccf..2c2d90d9819e758d6f98e553d96a88407fcd7630 100644 --- a/src/io/unbos.cpp +++ b/src/io/unbos.cpp @@ -43,7 +43,6 @@ UNBos::UNBos(const std::string ipaddr) bool UNBos::TransmitRead(const uint32_t opcode, const uint32_t addr, const uint nvalues) { - //cout << "UNBos::TransmitRead() addr=" << (unsigned)addr << " nrvals=" << (unsigned)nvalues << endl; size_t pktlength = sizeof(struct unbos_cmd_struct); uint8_t *pkt = new uint8_t[pktlength]; memset(pkt, 0, pktlength); @@ -104,19 +103,20 @@ void random_sleep(double tmax_in_sec) -bool UNBos::Read(const uint32_t opcode, const uint32_t addr, const uint nvalues, - uint32_t *buf) +bool UNBos::Read(const uint32_t opcode, const uint32_t addr, const uint nvalues, uint32_t *buf) { if(buf==NULL || nvalues==0) throw runtime_error("UNBos::Read buf=NULL"); int retries=0; int retstat=0; uint nreceived=0; +cout << "UNBos::Read from addr=0x" << hex << addr << " span=" << dec << nvalues << endl; + while(nreceived < nvalues) { uint _nvalues = nvalues-nreceived; if(_nvalues>UCP_BLOCK_SZ) _nvalues=UCP_BLOCK_SZ; - uint32_t _addr=addr+(nreceived*sizeof(uint32_t)); + uint32_t _addr=(addr) + (nreceived*sizeof(uint32_t)); while(retries < 3) { TransmitRead(opcode, _addr, _nvalues); @@ -138,10 +138,6 @@ bool UNBos::Read(const uint32_t opcode, const uint32_t addr, const uint nvalues, bool UNBos::TransmitWrite(const uint32_t opcode, const uint32_t addr, const uint nvalues, const uint32_t *buf) { - //cout << "UNBos::TransmitWrite() addr=" << (unsigned)addr << " nrvals=" << (unsigned)nvalues << endl; - //for(uint i=0;i<nvalues;i++) cout << (unsigned)buf[i] << " "; - //cout << endl; - size_t pktlength = sizeof(struct unbos_cmd_struct) + nvalues*sizeof(uint32_t); uint8_t *pkt = new uint8_t[pktlength]; memset(pkt, 0, pktlength); @@ -192,11 +188,13 @@ bool UNBos::Write(const uint32_t opcode, const uint32_t addr, const uint nvalues int retstat=0; uint nsent=0; +cout << "UNBos::Write to addr=0x" << hex << addr << " span=" << dec << nvalues << endl; + while(nsent < nvalues) { uint _nvalues = nvalues-nsent; if(_nvalues>UCP_BLOCK_SZ) _nvalues=UCP_BLOCK_SZ; - uint32_t _addr=addr+(nsent*sizeof(uint32_t)); + uint32_t _addr=(addr) + (nsent*sizeof(uint32_t)); while(retries < 3) { TransmitWrite(opcode, _addr, _nvalues, &buf[nsent]); diff --git a/src/periph/system.cpp b/src/periph/system.cpp index 08a0bbfb3f694844df7e1a7893e3b9c5358c592b..8f5fdbcf4636ea373af8d15659a0504215ad2f42 100644 --- a/src/periph/system.cpp +++ b/src/periph/system.cpp @@ -40,22 +40,14 @@ extern int debug; Periph_system::Periph_system(UNBos &commdev, const string design_name) : unbos(commdev) { - // TODO ----------------------------------------------^ needed as input? - // later read file from ROM - string ccfg_fname = design_name + ".ccfg"; - cout << "ccfg filename: " << ccfg_fname << endl; - ifstream ifs; - ifs.open(ccfg_fname); - if (!ifs.is_open()) { - cerr << "Error opening config file: " << ccfg_fname << " using old version" << endl; - registerMap = new RegisterMap(read_reg_map()); // used old version style - } else { - registerMap = new RegisterMap(import_ccfg_file(ifs)); - registerMap->add_register("dev/name", 0, 0, 0xffffffff, 0, "RO"); - registerMap->add_register("dev/stamps", 0, 0, 0xffffffff, 0, "RO"); - registerMap->add_register("dev/note", 0, 0, 0xffffffff, 0, "RO"); - registerMap->add_register("dev/sensors", 0, 0, 0xffffffff, 0, "RO"); - } + registerMap = new RegisterMap(read_reg_map()); + + // Add composite registers: + registerMap->add_register("dev/system", 0, 0, 0xffffffff, 0, "RO"); + registerMap->add_register("dev/name", 0, 0, 0xffffffff, 0, "RO"); + registerMap->add_register("dev/stamps", 0, 0, 0xffffffff, 0, "RO"); + registerMap->add_register("dev/note", 0, 0, 0xffffffff, 0, "RO"); + registerMap->add_register("dev/sensors", 0, 0, 0xffffffff, 0, "RO"); } bool Periph_system::Read(const string addr_str, const uint32_t offset, const uint32_t nvalues, uint32_t *data_ptr) @@ -119,7 +111,6 @@ bool Periph_system::read_system_info(ostringstream& strs) } char str[1000]; // FIXME: get rid of magic constants in masks: - sprintf(str," g_sim = %d\n", ((data & 0x00000400) != 0)); strs << str; sprintf(str," Firmware version = %d.%d\n",(data & 0x00F00000) >> 20, (data & 0x000F0000) >> 16); strs << str; sprintf(str," Hardware version = %d\n", ((data & 0x00000300) >> 8)); strs << str; @@ -166,7 +157,7 @@ bool Periph_system::mwrite(std::ostringstream& strs, const std::string addr, string Periph_system::read_design_name(void) { - uint32_t nof_design_name_regs = 8; + uint32_t nof_design_name_regs = 4; uint32_t nvalues = nof_design_name_regs; uint32_t *data = new uint32_t[nvalues * sizeof(uint32_t)+1]; bool retval = Read("mm/system/info/info", 2, nvalues, data); @@ -178,10 +169,10 @@ string Periph_system::read_design_name(void) string Periph_system::read_design_note(void) { - uint32_t nof_design_name_regs = 8; + uint32_t nof_design_name_regs = 4; uint32_t nvalues = nof_design_name_regs; uint32_t *data = new uint32_t[nvalues * sizeof(uint32_t)+1]; - bool retval = Read("mm/system/info/info", 13, nvalues,data); + bool retval = Read("mm/system/info/info", 20, nvalues,data); data[nvalues] = 0; // add end of string char char *str_ptr = (char *)data; string note = string(str_ptr); @@ -194,7 +185,7 @@ bool Periph_system::read_stamps(ostringstream& strs) uint32_t nof_regs = 3; uint32_t nvalues = nof_regs; uint32_t *data = new uint32_t[nvalues * sizeof(uint32_t)+1]; - bool retval = Read("mm/system/info/info", 10, nvalues, data); + bool retval = Read("mm/system/info/info", 15, nvalues, data); strs << " Stamp: date=" << data[0] << endl; strs << " Stamp: time=" << data[1] << endl; @@ -252,14 +243,11 @@ bool Periph_system::write_wdi_override(ostringstream& strs) return Write("mm/wdi/wdi/reset_word", 0, 1, &data); } -/* - * Obsolete function for backwards compatibility - */ RegisterMap Periph_system::read_reg_map(void) { RegisterMap reg; - uint32_t nvalues = 1024; - uint32_t addr = reg.getValidAddr("mm/rom_system/info/info", 0, nvalues); + uint32_t nvalues = REG_ADDR_ROM_SYSTEM_SPAN; + uint32_t addr = REG_ADDR_ROM_SYSTEM; uint32_t *data = new uint32_t[nvalues * sizeof(uint32_t)]; if(!unbos.readRegister(addr, nvalues, data)) { delete[] data; @@ -267,40 +255,23 @@ RegisterMap Periph_system::read_reg_map(void) } for(uint i=0; i < nvalues; i++) { + /* + cout << "data[" << dec << i << "]=0x" << hex << std::setw(8) << std::setfill('0') << data[i] << " "; + for(int j=0;j<4;j++) { + char c = (char)(data[i]>>(8*j)) ; + if (c=='\0') printf("\\0"); else cout << c; + } + cout << endl; + */ data[i] = ntohl(data[i]); } char *str_ptr = (char *)data; + string reg_map_str(str_ptr); + cout << "Periph_system::read_reg_map:\n" << reg_map_str << endl; delete[] data; - - istringstream vecstr(reg_map_str); - string regname; - uint base, span; - RegisterMap newRegisterMap; - try { - while (!vecstr.eof()) { - vecstr >> regname; - if (vecstr.fail() || vecstr.bad()) { - throw runtime_error("Invalid regname"); - } - vecstr >> hex >> base; - vecstr >> dec >> span; - - if (vecstr.fail() || vecstr.bad()) { - throw runtime_error("Invalid base/span"); - } - if(base==0 || span==0) { - throw runtime_error("Corrupt base/span on "+regname+ - " "+to_string(base)+" "+to_string(span)); - } - newRegisterMap.add_register(regname, base, span, 0xffffffff, 0, "RW"); - } - } catch(runtime_error& e) { - cerr << "Periph_system::read_reg_map: " << e.what() << endl; - syslog(LOG_ERR,"Periph_system::read_reg_map: %s\n", e.what()); - throw; - } - return newRegisterMap; + istringstream iss_regmap(reg_map_str); + return ccfg_to_regmap(iss_regmap); } diff --git a/src/registers.cpp b/src/registers.cpp index 6a78b0b14c0bc12dccc6bbcb7521607f2f3c1e5e..f31d8b91ba0954e611d1c23db3d2addb96a1a4f2 100644 --- a/src/registers.cpp +++ b/src/registers.cpp @@ -87,7 +87,7 @@ std::vector<std::string> RegisterMap::getRegnames_full(std::string prefix) uint32_t RegisterMap::getValidAddr(const std::string name, const uint32_t offset, const uint32_t size) { uint32_t _offset = offset * sizeof(uint32_t); - uint32_t end = (size + offset) * sizeof(uint32_t); + uint32_t end = (size + offset);// * sizeof(uint32_t); uint32_t base = getBaseAddr(name); uint32_t span = getSpan(name); diff --git a/src/registers.h b/src/registers.h index 59f422da06311221a92415c3a6832ca45e9acc17..cd87ac9af1ae78956556c1b09edd051a0ddf563a 100644 --- a/src/registers.h +++ b/src/registers.h @@ -23,6 +23,9 @@ #include <map> #include <vector> +#define REG_ADDR_ROM_SYSTEM (0x10000) +#define REG_ADDR_ROM_SYSTEM_SPAN (8192) + class RegisterMap { diff --git a/src/tools/ccfg.cpp b/src/tools/ccfg.cpp index 53fb751eb92da33c76a22653d344cfae93355bed..3131f2370661902e593a52f7d8e3710abaf46a27 100644 --- a/src/tools/ccfg.cpp +++ b/src/tools/ccfg.cpp @@ -31,7 +31,7 @@ using namespace std; using namespace boost::numeric::ublas; -RegisterMap import_ccfg_file(std::ifstream& ifs) +RegisterMap ccfg_to_regmap(std::istringstream& iss) { RegisterMap regmap; ostringstream err_str; @@ -60,7 +60,7 @@ RegisterMap import_ccfg_file(std::ifstream& ifs) BlockRAM_re = string(RE_CCFG_LINE_BlockRAM); char line[250]; - while(ifs.getline(line, sizeof(line))) { + while(iss.getline(line, sizeof(line))) { if (regex_match(line, comment_re)) { //cout << "import_ccfg_file match: comment ok" << endl; @@ -75,14 +75,14 @@ RegisterMap import_ccfg_file(std::ifstream& ifs) // DistrRAM 0x00000000 len=32 RO system info info ss >> prefx; - ss >> hex >> base; - base *= 4; // to byte addresses + ss >> hex >> base; // in dword addresses + //base *= 4; // to byte addresses ss >> c; // 'l' ss >> c; // 'e' ss >> c; // 'n' ss >> c; // '=' - ss >> dec >> span; - span *= 4; // to bytes + ss >> dec >> span; // in dwords + //span *= 4; // to bytes ss >> perm; ss >> peripheral; ss >> regname; @@ -104,8 +104,8 @@ RegisterMap import_ccfg_file(std::ifstream& ifs) // BitField 0x000000E0 b[31:0] WO ctrl pio_wdi nios_reset ss >> prefx; - ss >> hex >> base; - base *= 4; // to byte addresses + ss >> hex >> base; // in dword addresses + //base *= 4; // to byte addresses ss >> c; // 'b' ss >> c; // '[' ss >> dec >> mask_to; @@ -121,8 +121,8 @@ RegisterMap import_ccfg_file(std::ifstream& ifs) //cout << "mask_to=" << dec << mask_to << " mask_from=" << mask_from << endl; //cout << " mask=0x" << hex << mask << endl; - span=1; - span *= 4; // to bytes + span = 1; // in dwords + //span *= 4; // to bytes ss >> perm; ss >> peripheral; ss >> regname; @@ -142,14 +142,14 @@ RegisterMap import_ccfg_file(std::ifstream& ifs) // BlockRAM 0x00001000 len=1024 RW eth1g eth data ss >> prefx; - ss >> hex >> base; - base *= 4; // to byte addresses + ss >> hex >> base; // in dword addresses + //base *= 4; // to byte addresses ss >> c; // 'l' ss >> c; // 'e' ss >> c; // 'n' ss >> c; // '=' - ss >> dec >> span; - span *= 4; // to bytes + ss >> dec >> span; // in dwords + //span *= 4; // to bytes ss >> perm; ss >> peripheral; ss >> regname; @@ -164,10 +164,9 @@ RegisterMap import_ccfg_file(std::ifstream& ifs) cerr << "import_ccfg_file: error! illegal line: [" << line << "]" << endl; } } - ifs.close(); - //cout << "regmap:" << endl; - //regmap.print_screen(); + cout << "regmap:" << endl; + regmap.print_screen(); return regmap; } diff --git a/src/tools/ccfg.h b/src/tools/ccfg.h index de4e7887cf5d664d02ddeb5fcb86c3b95f0a2e9a..34cf5055d7a45705e31755fd8b46ecb3a707b7df 100644 --- a/src/tools/ccfg.h +++ b/src/tools/ccfg.h @@ -33,6 +33,6 @@ namespace ublas = boost::numeric::ublas; -RegisterMap import_ccfg_file(std::ifstream& ifs); +RegisterMap ccfg_to_regmap(std::istringstream& iss); #endif