diff --git a/dsu3plugin/dsu3plugin.cpp b/dsu3plugin/dsu3plugin.cpp --- a/dsu3plugin/dsu3plugin.cpp +++ b/dsu3plugin/dsu3plugin.cpp @@ -28,14 +28,14 @@ struct acceptedMemctrlr_str { - int vid; - int pid; - const char* name; + int vid; + int pid; + const char* name; }; const struct acceptedMemctrlr_str acceptedMemctrlr[]= { -{0x01,0x04,"MCTRL"}, +{0x0f,0x04,"MCTRL"}, {0x01,0x51,"FTSRCTRL"}, {0x20,0x01,"SRCTRLE_0WS" }, {0x20,0x02,"SRCTRLE_1WS" } @@ -45,23 +45,23 @@ const struct acceptedMemctrlr_str accept dsu3plugin::dsu3plugin(QWidget *parent):socexplorerplugin(parent,false) { - this->UI = new dsu3pluginui(); - this->setWidget((QWidget*)this->UI); - this->elfparserInst = new elfparser(); - this->pyObject = new dsu3pluginPywrapper(this); - QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(openFile(QString)),this,SLOT(openFile(QString))); - QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(loadFile()),this,SLOT(flashTarget())); - QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(run()),this,SLOT(run())); - QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(stop()),this,SLOT(stop())); - QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(cacheEnable()),this,SLOT(cacheEnable())); - QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(cacheDisable()),this,SLOT(cacheDisable())); - QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(setCacheEnable(bool)),this,SLOT(setCacheEnable(bool))); + this->UI = new dsu3pluginui(); + this->setWidget((QWidget*)this->UI); + this->elfparserInst = new elfparser(); + this->pyObject = new dsu3pluginPywrapper(this); + QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(openFile(QString)),this,SLOT(openFile(QString))); + QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(loadFile()),this,SLOT(flashTarget())); + QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(run()),this,SLOT(run())); + QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(stop()),this,SLOT(stop())); + QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(cacheEnable()),this,SLOT(cacheEnable())); + QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(cacheDisable()),this,SLOT(cacheDisable())); + QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(setCacheEnable(bool)),this,SLOT(setCacheEnable(bool))); - connect(this->UI,SIGNAL(openFile()),this,SLOT(openFile())); - connect(this->UI,SIGNAL(flashTarget()),this,SLOT(flashTarget())); - connect(this->UI,SIGNAL(run()),this,SLOT(toggleRun())); - connect(this,SIGNAL(updateInfo(elfparser*)),this->UI,SIGNAL(updateInfo(elfparser*))); - this->running = false; + connect(this->UI,SIGNAL(openFile()),this,SLOT(openFile())); + connect(this->UI,SIGNAL(flashTarget()),this,SLOT(flashTarget())); + connect(this->UI,SIGNAL(run()),this,SLOT(toggleRun())); + connect(this,SIGNAL(updateInfo(elfparser*)),this->UI,SIGNAL(updateInfo(elfparser*))); + this->running = false; } @@ -73,211 +73,223 @@ dsu3plugin::~dsu3plugin() void dsu3plugin::openFile() { - QString filename = QFileDialog::getOpenFileName(this,tr("Open elf File"), QDir::homePath(), tr("Elf Files (*)")); - if(filename!="") + QString filename = QFileDialog::getOpenFileName(this,tr("Open elf File"), QDir::homePath(), tr("Elf Files (*)")); + if(filename!="") { - this->openFile(filename); + this->openFile(filename); } } void dsu3plugin::openFile(QString fileName) { - this->elfparserInst->setFilename(fileName); - emit this->updateInfo(this->elfparserInst); + this->elfparserInst->setFilename(fileName); + emit this->updateInfo(this->elfparserInst); } bool dsu3plugin::configureTarget() { - if(parent==NULL) - return false; - unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0); - if(DSUBASEADDRESS == (unsigned int)-1) - DSUBASEADDRESS = 0x90000000; - unsigned int MCTRLBASEADDRESS =-1; - for(int i=0; igetEnumDeviceBaseAddress(this,0x01 , 0x004,0); + if(DSUBASEADDRESS == (unsigned int)-1) + DSUBASEADDRESS = 0x90000000; + unsigned int MCTRLBASEADDRESS =-1; + for(int i=0; igetEnumDeviceBaseAddress(this,acceptedMemctrlr[i].vid , acceptedMemctrlr[i].pid,0); - if(MCTRLBASEADDRESS != (unsigned int)-1) break; + MCTRLBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,acceptedMemctrlr[i].vid , acceptedMemctrlr[i].pid,0); + if(MCTRLBASEADDRESS != (unsigned int)-1) + { + SocExplorerEngine::message(this,QString("Found %1 @%2").arg(acceptedMemctrlr[i].name).arg(MCTRLBASEADDRESS,8,16),1); + break; + } } - if(MCTRLBASEADDRESS == (unsigned int)-1) + if(MCTRLBASEADDRESS == (unsigned int)-1) { - //SocExplorerEngine::message(this,"Can't find FTMemCtrlr",1); - return false; + SocExplorerEngine::message(this,"Can't any compatible memory controller",1); + return false; } - //Force a debug break - WriteRegs(uIntlist()<<0x0000002f,(unsigned int)DSUBASEADDRESS); - WriteRegs(uIntlist()<<0x0000ffff,(unsigned int)DSUBASEADDRESS+0x20); - //Clear time tag counter - WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x8); + //Force a debug break + WriteRegs(uIntlist()<<0x0000002f,(unsigned int)DSUBASEADDRESS); + WriteRegs(uIntlist()<<0x0000ffff,(unsigned int)DSUBASEADDRESS+0x20); + //Clear time tag counter + WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x8); - //Clear ASR registers - WriteRegs(uIntlist()<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x400040); - WriteRegs(uIntlist()<<0x2,(unsigned int)DSUBASEADDRESS+0x400024); - WriteRegs(uIntlist()<<0<<0<<0<<0<<0<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x400060); - WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x48); - WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x000004C); - WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x400040); + //Clear ASR registers + WriteRegs(uIntlist()<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x400040); + WriteRegs(uIntlist()<<0x2,(unsigned int)DSUBASEADDRESS+0x400024); + WriteRegs(uIntlist()<<0<<0<<0<<0<<0<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x400060); + WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x48); + WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x000004C); + WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x400040); - WriteRegs(uIntlist()<<0x2FF<<0xE60<<0,(unsigned int)MCTRLBASEADDRESS); + WriteRegs(uIntlist()<<0x2FF<<0xE60<<0,(unsigned int)MCTRLBASEADDRESS); - WriteRegs(uIntlist()<<0<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x400060); - WriteRegs(uIntlist()<<0x0000FFFF,(unsigned int)DSUBASEADDRESS+0x24); + WriteRegs(uIntlist()<<0<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x400060); + WriteRegs(uIntlist()<<0x0000FFFF,(unsigned int)DSUBASEADDRESS+0x24); - unsigned int buff=0; - // for(int i=0;i<1567;i++) - // { - // parent->Write(&buff,(unsigned int)1,DSUBASEADDRESS+0x300000+(4*i)); - // } - memSet(DSUBASEADDRESS+0x300000,0,1567); - WriteRegs(uIntlist()<<0<<0xF30000E0<<0x00000002<<0x40000000<<0x40000000<<0x40000004<<0x1000000,(unsigned int)DSUBASEADDRESS+0x400000); - WriteRegs(uIntlist()<<0<<0<<0<<0<<0<<0<<0x403ffff0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x300020); - WriteRegs(uIntlist()<<0x000002EF,(unsigned int)DSUBASEADDRESS); + unsigned int buff=0; + // for(int i=0;i<1567;i++) + // { + // parent->Write(&buff,(unsigned int)1,DSUBASEADDRESS+0x300000+(4*i)); + // } + memSet(DSUBASEADDRESS+0x300000,0,1567); + WriteRegs(uIntlist()<<0<<0xF30000E0<<0x00000002<<0x40000000<<0x40000000<<0x40000004<<0x1000000,(unsigned int)DSUBASEADDRESS+0x400000); + WriteRegs(uIntlist()<<0<<0<<0<<0<<0<<0<<0x403ffff0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x300020); + WriteRegs(uIntlist()<<0x000002EF,(unsigned int)DSUBASEADDRESS); - //Disable interrupts - unsigned int APBIRQCTRLRBASEADD = (unsigned int)SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,1,0x0d,0); - if(APBIRQCTRLRBASEADD == (unsigned int)-1) - return false; - WriteRegs(uIntlist()<<0x00000000,APBIRQCTRLRBASEADD+0x040); - WriteRegs(uIntlist()<<0xFFFE0000,APBIRQCTRLRBASEADD+0x080); - WriteRegs(uIntlist()<<0<<0,APBIRQCTRLRBASEADD); + //Disable interrupts + unsigned int APBIRQCTRLRBASEADD = (unsigned int)SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,1,0x0d,0); + if(APBIRQCTRLRBASEADD == (unsigned int)-1) + return false; + WriteRegs(uIntlist()<<0x00000000,APBIRQCTRLRBASEADD+0x040); + WriteRegs(uIntlist()<<0xFFFE0000,APBIRQCTRLRBASEADD+0x080); + WriteRegs(uIntlist()<<0<<0,APBIRQCTRLRBASEADD); - //Set up timer - unsigned int APBTIMERBASEADD = (unsigned int)SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,1,0x11,0); - if(APBTIMERBASEADD == (unsigned int)-1) - return false; - WriteRegs(uIntlist()<<0xffffffff,APBTIMERBASEADD+0x014); - WriteRegs(uIntlist()<<0x00000018,APBTIMERBASEADD+0x04); - WriteRegs(uIntlist()<<0x00000007,APBTIMERBASEADD+0x018); - return true; + //Set up timer + unsigned int APBTIMERBASEADD = (unsigned int)SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,1,0x11,0); + if(APBTIMERBASEADD == (unsigned int)-1) + return false; + WriteRegs(uIntlist()<<0xffffffff,APBTIMERBASEADD+0x014); + WriteRegs(uIntlist()<<0x00000018,APBTIMERBASEADD+0x04); + WriteRegs(uIntlist()<<0x00000007,APBTIMERBASEADD+0x018); + return true; } bool dsu3plugin::cacheDisable() { - return setCacheEnable(false); + return setCacheEnable(false); } bool dsu3plugin::cacheEnable() { - return setCacheEnable(true); + return setCacheEnable(true); } bool dsu3plugin::setCacheEnable(bool enabled) { - if(parent==NULL) - return false; - unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0); - if(DSUBASEADDRESS == (unsigned int)-1) - DSUBASEADDRESS = 0x90000000; - WriteRegs(uIntlist()<<2,DSUBASEADDRESS+0x400024); - if(enabled) + if(parent==NULL) + return false; + unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0); + if(DSUBASEADDRESS == (unsigned int)-1) + DSUBASEADDRESS = 0x90000000; + WriteRegs(uIntlist()<<2,DSUBASEADDRESS+0x400024); + unsigned int reg = ReadReg(DSUBASEADDRESS+0x700000); + if(enabled) { - WriteRegs(uIntlist()<<0x0001000F,DSUBASEADDRESS+0x700000); - //flushes cache. - WriteRegs(uIntlist()<<0x0061000F,DSUBASEADDRESS+0x700000); + WriteRegs(uIntlist()<<(0x0001000F|reg),DSUBASEADDRESS+0x700000); + //flushes cache. + WriteRegs(uIntlist()<<(0x0061000F|reg),DSUBASEADDRESS+0x700000); } - else + else { - WriteRegs(uIntlist()<<0x00000000,DSUBASEADDRESS+0x700000); - WriteRegs(uIntlist()<<0x00600000,DSUBASEADDRESS+0x700000); + WriteRegs(uIntlist()<<((!0x0001000F)®),DSUBASEADDRESS+0x700000); + WriteRegs(uIntlist()<<(0x00600000|reg),DSUBASEADDRESS+0x700000); } - return true; + return true; } bool dsu3plugin::flashTarget() { - stop(); - cacheDisable(); - configureTarget(); - /*Write .text*/ - this->writeSection(".text"); - /*Write .data*/ - this->writeSection(".data"); - return true; + stop(); + cacheDisable(); + configureTarget(); + /*Write .text*/ + this->writeSection(".text"); + /*Write .data*/ + this->writeSection(".data"); + return true; } void dsu3plugin::run() { - unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0); - if(DSUBASEADDRESS == (unsigned int)-1) - DSUBASEADDRESS = 0x90000000; - WriteRegs(uIntlist()<<0,DSUBASEADDRESS+0x020); - this->running = true; - this->UI->setRunning(true); + unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0); + if(DSUBASEADDRESS == (unsigned int)-1) + DSUBASEADDRESS = 0x90000000; + WriteRegs(uIntlist()<<0,DSUBASEADDRESS+0x020); + this->running = true; + this->UI->setRunning(true); } void dsu3plugin::stop() { - unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0); - if(DSUBASEADDRESS == (unsigned int)-1) - DSUBASEADDRESS = 0x90000000; - WriteRegs(uIntlist()<<0xFFFF,DSUBASEADDRESS+0x020); - this->running = false; - this->UI->setRunning(false); + unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0); + if(DSUBASEADDRESS == (unsigned int)-1) + DSUBASEADDRESS = 0x90000000; + WriteRegs(uIntlist()<<0xFFFF,DSUBASEADDRESS+0x020); + this->running = false; + this->UI->setRunning(false); } void dsu3plugin::toggleRun() { - if(this->running) - this->stop(); - else - this->run(); + if(this->running) + this->stop(); + else + this->run(); } void dsu3plugin::WriteRegs(uIntlist Values, unsigned int address) { - unsigned int* buff; - buff = (unsigned int*)malloc(Values.count()*sizeof(unsigned int)); - for(int i=0;iWrite(buff,(unsigned int)Values.count(),address); - free(buff); + parent->Write(buff,(unsigned int)Values.count(),address); + free(buff); +} + +unsigned int dsu3plugin::ReadReg(unsigned int address) +{ + unsigned int buff; + parent->Read(&buff,1,address); + return buff; } void dsu3plugin::writeSection(int index) { - char* buffch=NULL; - unsigned int* buff; - int size = this->elfparserInst->getSectionDatasz(index); - int sizeInt = size/4; - if(parent==NULL) - return; - this->elfparserInst->getSectionData(index,&buffch); - buff = (unsigned int*)malloc(((size/4)+1)*sizeof(unsigned int)); - for(int i=0;ielfparserInst->getSectionDatasz(index); + int sizeInt = size/4; + if(parent==NULL) + return; + this->elfparserInst->getSectionData(index,&buffch); + buff = (unsigned int*)malloc(((size/4)+1)*sizeof(unsigned int)); + for(int i=0;i0;i--) + buff[sizeInt]=0; + for(int i=(size%4);i>0;i--) { - buff[sizeInt] = (buff[sizeInt]<<8) + (0x0FF & ((unsigned int)buffch[size-i])); + buff[sizeInt] = (buff[sizeInt]<<8) + (0x0FF & ((unsigned int)buffch[size-i])); } - sizeInt++; + sizeInt++; } - parent->Write(buff,(unsigned int)sizeInt,(unsigned int)this->elfparserInst->getSectionPaddr(index)); - free(buff); + parent->Write(buff,(unsigned int)sizeInt,(unsigned int)this->elfparserInst->getSectionPaddr(index)); + free(buff); } void dsu3plugin::writeSection(const QString &name) { - for(int i=0;ielfparserInst->getSectioncount();i++) + for(int i=0;ielfparserInst->getSectioncount();i++) { - if(!this->elfparserInst->getSectionName(i).compare(name)) + if(!this->elfparserInst->getSectionName(i).compare(name)) { - printf("about to write section %s @ 0x%x size = %d\n",elfparserInst->getSectionName(i).toStdString().c_str(),elfparserInst->getSectionPaddr(i),elfparserInst->getSectionMemsz(i)); - writeSection(i); + printf("about to write section %s @ 0x%x size = %d\n",elfparserInst->getSectionName(i).toStdString().c_str(),elfparserInst->getSectionPaddr(i),elfparserInst->getSectionMemsz(i)); + writeSection(i); } } } @@ -285,27 +297,27 @@ void dsu3plugin::writeSection(const QStr unsigned int dsu3plugin::Write(unsigned int *Value,unsigned int count,unsigned int address) { - if(parent!=NULL) - return parent->Write(Value,count,address); - return 0; + if(parent!=NULL) + return parent->Write(Value,count,address); + return 0; } bool dsu3plugin::memSet(unsigned int address,int value, unsigned int count) { - unsigned int* buffer = (unsigned int*)malloc(count*sizeof(unsigned int)); - if(buffer!=NULL) + unsigned int* buffer = (unsigned int*)malloc(count*sizeof(unsigned int)); + if(buffer!=NULL) { - memset((void*)buffer,value,count*sizeof(unsigned int)); - parent->Write(buffer,count,address); - free(buffer ); - return true; + memset((void*)buffer,value,count*sizeof(unsigned int)); + parent->Write(buffer,count,address); + free(buffer ); + return true; } - return false; + return false; } unsigned int dsu3plugin::Read(unsigned int *Value,unsigned int count, unsigned int address) { - if(parent!=NULL) - return parent->Read(Value,count,address); - return 0; + if(parent!=NULL) + return parent->Read(Value,count,address); + return 0; } diff --git a/dsu3plugin/dsu3plugin.h b/dsu3plugin/dsu3plugin.h --- a/dsu3plugin/dsu3plugin.h +++ b/dsu3plugin/dsu3plugin.h @@ -57,6 +57,7 @@ signals: void updateInfo(elfparser* parser); private: void WriteRegs(uIntlist Values, unsigned int address); + unsigned int ReadReg(unsigned int address); void writeSection(int index); void writeSection(const QString& name); dsu3pluginui* UI;