##// END OF EJS Templates
fixed bug on dsu3plugin r45 not valid!
paul -
r48:4231bcc776dc default
parent child
Show More
@@ -1,323 +1,323
1 /*------------------------------------------------------------------------------
1 /*------------------------------------------------------------------------------
2 -- This file is a part of the SocExplorer Software
2 -- This file is a part of the SocExplorer Software
3 -- Copyright (C) 2011, Plasma Physics Laboratory - CNRS
3 -- Copyright (C) 2011, Plasma Physics Laboratory - CNRS
4 --
4 --
5 -- This program is free software; you can redistribute it and/or modify
5 -- This program is free software; you can redistribute it and/or modify
6 -- it under the terms of the GNU General Public License as published by
6 -- it under the terms of the GNU General Public License as published by
7 -- the Free Software Foundation; either version 3 of the License, or
7 -- the Free Software Foundation; either version 3 of the License, or
8 -- (at your option) any later version.
8 -- (at your option) any later version.
9 --
9 --
10 -- This program is distributed in the hope that it will be useful,
10 -- This program is distributed in the hope that it will be useful,
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 -- GNU General Public License for more details.
13 -- GNU General Public License for more details.
14 --
14 --
15 -- You should have received a copy of the GNU General Public License
15 -- You should have received a copy of the GNU General Public License
16 -- along with this program; if not, write to the Free Software
16 -- along with this program; if not, write to the Free Software
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 -------------------------------------------------------------------------------*/
18 -------------------------------------------------------------------------------*/
19 /*-- Author : Alexis Jeandet
19 /*-- Author : Alexis Jeandet
20 -- Mail : alexis.jeandet@lpp.polytechnique.fr
20 -- Mail : alexis.jeandet@lpp.polytechnique.fr
21 ----------------------------------------------------------------------------*/
21 ----------------------------------------------------------------------------*/
22 #include "dsu3plugin.h"
22 #include "dsu3plugin.h"
23 #include <QFileDialog>
23 #include <QFileDialog>
24 #include <QDir>
24 #include <QDir>
25 #include "dsu3pluginpywrapper.h"
25 #include "dsu3pluginpywrapper.h"
26 #include <socexplorerengine.h>
26 #include <socexplorerengine.h>
27
27
28
28
29 struct acceptedMemctrlr_str
29 struct acceptedMemctrlr_str
30 {
30 {
31 int vid;
31 int vid;
32 int pid;
32 int pid;
33 const char* name;
33 const char* name;
34 };
34 };
35
35
36 const struct acceptedMemctrlr_str acceptedMemctrlr[]=
36 const struct acceptedMemctrlr_str acceptedMemctrlr[]=
37 {
37 {
38 {0x0f,0x04,"MCTRL"},
38 {0x04,0x0f,"MCTRL"},
39 {0x01,0x51,"FTSRCTRL"},
39 {0x01,0x51,"FTSRCTRL"},
40 {0x20,0x01,"SRCTRLE_0WS" },
40 {0x20,0x01,"SRCTRLE_0WS" },
41 {0x20,0x02,"SRCTRLE_1WS" }
41 {0x20,0x02,"SRCTRLE_1WS" }
42 };
42 };
43
43
44 #define acceptedMemctrlrCnt sizeof acceptedMemctrlr
44 #define acceptedMemctrlrCnt 4
45
45
46 dsu3plugin::dsu3plugin(QWidget *parent):socexplorerplugin(parent,false)
46 dsu3plugin::dsu3plugin(QWidget *parent):socexplorerplugin(parent,false)
47 {
47 {
48 this->UI = new dsu3pluginui();
48 this->UI = new dsu3pluginui();
49 this->setWidget((QWidget*)this->UI);
49 this->setWidget((QWidget*)this->UI);
50 this->elfparserInst = new elfparser();
50 this->elfparserInst = new elfparser();
51 this->pyObject = new dsu3pluginPywrapper(this);
51 this->pyObject = new dsu3pluginPywrapper(this);
52 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(openFile(QString)),this,SLOT(openFile(QString)));
52 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(openFile(QString)),this,SLOT(openFile(QString)));
53 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(loadFile()),this,SLOT(flashTarget()));
53 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(loadFile()),this,SLOT(flashTarget()));
54 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(run()),this,SLOT(run()));
54 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(run()),this,SLOT(run()));
55 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(stop()),this,SLOT(stop()));
55 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(stop()),this,SLOT(stop()));
56 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(cacheEnable()),this,SLOT(cacheEnable()));
56 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(cacheEnable()),this,SLOT(cacheEnable()));
57 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(cacheDisable()),this,SLOT(cacheDisable()));
57 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(cacheDisable()),this,SLOT(cacheDisable()));
58 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(setCacheEnable(bool)),this,SLOT(setCacheEnable(bool)));
58 QObject::connect(((dsu3pluginPywrapper*)this->pyObject),SIGNAL(setCacheEnable(bool)),this,SLOT(setCacheEnable(bool)));
59
59
60 connect(this->UI,SIGNAL(openFile()),this,SLOT(openFile()));
60 connect(this->UI,SIGNAL(openFile()),this,SLOT(openFile()));
61 connect(this->UI,SIGNAL(flashTarget()),this,SLOT(flashTarget()));
61 connect(this->UI,SIGNAL(flashTarget()),this,SLOT(flashTarget()));
62 connect(this->UI,SIGNAL(run()),this,SLOT(toggleRun()));
62 connect(this->UI,SIGNAL(run()),this,SLOT(toggleRun()));
63 connect(this,SIGNAL(updateInfo(elfparser*)),this->UI,SIGNAL(updateInfo(elfparser*)));
63 connect(this,SIGNAL(updateInfo(elfparser*)),this->UI,SIGNAL(updateInfo(elfparser*)));
64 this->running = false;
64 this->running = false;
65 }
65 }
66
66
67
67
68 dsu3plugin::~dsu3plugin()
68 dsu3plugin::~dsu3plugin()
69 {
69 {
70
70
71 }
71 }
72
72
73
73
74 void dsu3plugin::openFile()
74 void dsu3plugin::openFile()
75 {
75 {
76 QString filename = QFileDialog::getOpenFileName(this,tr("Open elf File"), QDir::homePath(), tr("Elf Files (*)"));
76 QString filename = QFileDialog::getOpenFileName(this,tr("Open elf File"), QDir::homePath(), tr("Elf Files (*)"));
77 if(filename!="")
77 if(filename!="")
78 {
78 {
79 this->openFile(filename);
79 this->openFile(filename);
80 }
80 }
81 }
81 }
82
82
83 void dsu3plugin::openFile(QString fileName)
83 void dsu3plugin::openFile(QString fileName)
84 {
84 {
85 this->elfparserInst->setFilename(fileName);
85 this->elfparserInst->setFilename(fileName);
86 emit this->updateInfo(this->elfparserInst);
86 emit this->updateInfo(this->elfparserInst);
87 }
87 }
88
88
89 bool dsu3plugin::configureTarget()
89 bool dsu3plugin::configureTarget()
90 {
90 {
91 if(parent==NULL)
91 if(parent==NULL)
92 return false;
92 return false;
93 unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0);
93 unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0);
94 if(DSUBASEADDRESS == (unsigned int)-1)
94 if(DSUBASEADDRESS == (unsigned int)-1)
95 DSUBASEADDRESS = 0x90000000;
95 DSUBASEADDRESS = 0x90000000;
96 unsigned int MCTRLBASEADDRESS =-1;
96 unsigned int MCTRLBASEADDRESS =-1;
97 for(int i=0; i<acceptedMemctrlrCnt;i++)
97 for(int i=0; i<acceptedMemctrlrCnt;i++)
98 {
98 {
99 MCTRLBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,acceptedMemctrlr[i].vid , acceptedMemctrlr[i].pid,0);
99 MCTRLBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,acceptedMemctrlr[i].vid , acceptedMemctrlr[i].pid,0);
100 if(MCTRLBASEADDRESS != (unsigned int)-1)
100 if(MCTRLBASEADDRESS != (unsigned int)-1)
101 {
101 {
102 SocExplorerEngine::message(this,QString("Found %1 @%2").arg(acceptedMemctrlr[i].name).arg(MCTRLBASEADDRESS,8,16),1);
102 SocExplorerEngine::message(this,QString("Found %1 @%2").arg(acceptedMemctrlr[i].name).arg(MCTRLBASEADDRESS,8,16),1);
103 break;
103 break;
104 }
104 }
105 }
105 }
106 if(MCTRLBASEADDRESS == (unsigned int)-1)
106 if(MCTRLBASEADDRESS == (unsigned int)-1)
107 {
107 {
108 SocExplorerEngine::message(this,"Can't any compatible memory controller",1);
108 SocExplorerEngine::message(this,"Can't any compatible memory controller",1);
109 return false;
109 return false;
110 }
110 }
111
111
112
112
113 //Force a debug break
113 //Force a debug break
114 WriteRegs(uIntlist()<<0x0000002f,(unsigned int)DSUBASEADDRESS);
114 WriteRegs(uIntlist()<<0x0000002f,(unsigned int)DSUBASEADDRESS);
115 WriteRegs(uIntlist()<<0x0000ffff,(unsigned int)DSUBASEADDRESS+0x20);
115 WriteRegs(uIntlist()<<0x0000ffff,(unsigned int)DSUBASEADDRESS+0x20);
116 //Clear time tag counter
116 //Clear time tag counter
117 WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x8);
117 WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x8);
118
118
119 //Clear ASR registers
119 //Clear ASR registers
120 WriteRegs(uIntlist()<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x400040);
120 WriteRegs(uIntlist()<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x400040);
121 WriteRegs(uIntlist()<<0x2,(unsigned int)DSUBASEADDRESS+0x400024);
121 WriteRegs(uIntlist()<<0x2,(unsigned int)DSUBASEADDRESS+0x400024);
122 WriteRegs(uIntlist()<<0<<0<<0<<0<<0<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x400060);
122 WriteRegs(uIntlist()<<0<<0<<0<<0<<0<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x400060);
123 WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x48);
123 WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x48);
124 WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x000004C);
124 WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x000004C);
125 WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x400040);
125 WriteRegs(uIntlist()<<0,(unsigned int)DSUBASEADDRESS+0x400040);
126
126
127
127
128
128
129 WriteRegs(uIntlist()<<0x2FF<<0xE60<<0,(unsigned int)MCTRLBASEADDRESS);
129 WriteRegs(uIntlist()<<0x2FF<<0xE60<<0,(unsigned int)MCTRLBASEADDRESS);
130
130
131
131
132 WriteRegs(uIntlist()<<0<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x400060);
132 WriteRegs(uIntlist()<<0<<0<<0<<0,(unsigned int)DSUBASEADDRESS+0x400060);
133 WriteRegs(uIntlist()<<0x0000FFFF,(unsigned int)DSUBASEADDRESS+0x24);
133 WriteRegs(uIntlist()<<0x0000FFFF,(unsigned int)DSUBASEADDRESS+0x24);
134
134
135 unsigned int buff=0;
135 unsigned int buff=0;
136 // for(int i=0;i<1567;i++)
136 // for(int i=0;i<1567;i++)
137 // {
137 // {
138 // parent->Write(&buff,(unsigned int)1,DSUBASEADDRESS+0x300000+(4*i));
138 // parent->Write(&buff,(unsigned int)1,DSUBASEADDRESS+0x300000+(4*i));
139 // }
139 // }
140 memSet(DSUBASEADDRESS+0x300000,0,1567);
140 memSet(DSUBASEADDRESS+0x300000,0,1567);
141 WriteRegs(uIntlist()<<0<<0xF30000E0<<0x00000002<<0x40000000<<0x40000000<<0x40000004<<0x1000000,(unsigned int)DSUBASEADDRESS+0x400000);
141 WriteRegs(uIntlist()<<0<<0xF30000E0<<0x00000002<<0x40000000<<0x40000000<<0x40000004<<0x1000000,(unsigned int)DSUBASEADDRESS+0x400000);
142 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);
142 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);
143 WriteRegs(uIntlist()<<0x000002EF,(unsigned int)DSUBASEADDRESS);
143 WriteRegs(uIntlist()<<0x000002EF,(unsigned int)DSUBASEADDRESS);
144
144
145 //Disable interrupts
145 //Disable interrupts
146 unsigned int APBIRQCTRLRBASEADD = (unsigned int)SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,1,0x0d,0);
146 unsigned int APBIRQCTRLRBASEADD = (unsigned int)SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,1,0x0d,0);
147 if(APBIRQCTRLRBASEADD == (unsigned int)-1)
147 if(APBIRQCTRLRBASEADD == (unsigned int)-1)
148 return false;
148 return false;
149 WriteRegs(uIntlist()<<0x00000000,APBIRQCTRLRBASEADD+0x040);
149 WriteRegs(uIntlist()<<0x00000000,APBIRQCTRLRBASEADD+0x040);
150 WriteRegs(uIntlist()<<0xFFFE0000,APBIRQCTRLRBASEADD+0x080);
150 WriteRegs(uIntlist()<<0xFFFE0000,APBIRQCTRLRBASEADD+0x080);
151 WriteRegs(uIntlist()<<0<<0,APBIRQCTRLRBASEADD);
151 WriteRegs(uIntlist()<<0<<0,APBIRQCTRLRBASEADD);
152
152
153 //Set up timer
153 //Set up timer
154 unsigned int APBTIMERBASEADD = (unsigned int)SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,1,0x11,0);
154 unsigned int APBTIMERBASEADD = (unsigned int)SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,1,0x11,0);
155 if(APBTIMERBASEADD == (unsigned int)-1)
155 if(APBTIMERBASEADD == (unsigned int)-1)
156 return false;
156 return false;
157 WriteRegs(uIntlist()<<0xffffffff,APBTIMERBASEADD+0x014);
157 WriteRegs(uIntlist()<<0xffffffff,APBTIMERBASEADD+0x014);
158 WriteRegs(uIntlist()<<0x00000018,APBTIMERBASEADD+0x04);
158 WriteRegs(uIntlist()<<0x00000018,APBTIMERBASEADD+0x04);
159 WriteRegs(uIntlist()<<0x00000007,APBTIMERBASEADD+0x018);
159 WriteRegs(uIntlist()<<0x00000007,APBTIMERBASEADD+0x018);
160 return true;
160 return true;
161 }
161 }
162
162
163 bool dsu3plugin::cacheDisable()
163 bool dsu3plugin::cacheDisable()
164 {
164 {
165 return setCacheEnable(false);
165 return setCacheEnable(false);
166 }
166 }
167
167
168 bool dsu3plugin::cacheEnable()
168 bool dsu3plugin::cacheEnable()
169 {
169 {
170 return setCacheEnable(true);
170 return setCacheEnable(true);
171 }
171 }
172
172
173 bool dsu3plugin::setCacheEnable(bool enabled)
173 bool dsu3plugin::setCacheEnable(bool enabled)
174 {
174 {
175 if(parent==NULL)
175 if(parent==NULL)
176 return false;
176 return false;
177 unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0);
177 unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0);
178 if(DSUBASEADDRESS == (unsigned int)-1)
178 if(DSUBASEADDRESS == (unsigned int)-1)
179 DSUBASEADDRESS = 0x90000000;
179 DSUBASEADDRESS = 0x90000000;
180 WriteRegs(uIntlist()<<2,DSUBASEADDRESS+0x400024);
180 WriteRegs(uIntlist()<<2,DSUBASEADDRESS+0x400024);
181 unsigned int reg = ReadReg(DSUBASEADDRESS+0x700000);
181 unsigned int reg = ReadReg(DSUBASEADDRESS+0x700000);
182 if(enabled)
182 if(enabled)
183 {
183 {
184 WriteRegs(uIntlist()<<(0x0001000F|reg),DSUBASEADDRESS+0x700000);
184 WriteRegs(uIntlist()<<(0x0001000F|reg),DSUBASEADDRESS+0x700000);
185 //flushes cache.
185 //flushes cache.
186 WriteRegs(uIntlist()<<(0x0061000F|reg),DSUBASEADDRESS+0x700000);
186 WriteRegs(uIntlist()<<(0x0061000F|reg),DSUBASEADDRESS+0x700000);
187 }
187 }
188 else
188 else
189 {
189 {
190 WriteRegs(uIntlist()<<((!0x0001000F)&reg),DSUBASEADDRESS+0x700000);
190 WriteRegs(uIntlist()<<((!0x0001000F)&reg),DSUBASEADDRESS+0x700000);
191 WriteRegs(uIntlist()<<(0x00600000|reg),DSUBASEADDRESS+0x700000);
191 WriteRegs(uIntlist()<<(0x00600000|reg),DSUBASEADDRESS+0x700000);
192 }
192 }
193 return true;
193 return true;
194 }
194 }
195
195
196 bool dsu3plugin::flashTarget()
196 bool dsu3plugin::flashTarget()
197 {
197 {
198 stop();
198 stop();
199 cacheDisable();
199 cacheDisable();
200 configureTarget();
200 configureTarget();
201 /*Write .text*/
201 /*Write .text*/
202 this->writeSection(".text");
202 this->writeSection(".text");
203 /*Write .data*/
203 /*Write .data*/
204 this->writeSection(".data");
204 this->writeSection(".data");
205 return true;
205 return true;
206 }
206 }
207
207
208 void dsu3plugin::run()
208 void dsu3plugin::run()
209 {
209 {
210 unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0);
210 unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0);
211 if(DSUBASEADDRESS == (unsigned int)-1)
211 if(DSUBASEADDRESS == (unsigned int)-1)
212 DSUBASEADDRESS = 0x90000000;
212 DSUBASEADDRESS = 0x90000000;
213 WriteRegs(uIntlist()<<0,DSUBASEADDRESS+0x020);
213 WriteRegs(uIntlist()<<0,DSUBASEADDRESS+0x020);
214 this->running = true;
214 this->running = true;
215 this->UI->setRunning(true);
215 this->UI->setRunning(true);
216 }
216 }
217
217
218 void dsu3plugin::stop()
218 void dsu3plugin::stop()
219 {
219 {
220 unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0);
220 unsigned int DSUBASEADDRESS = SocExplorerEngine::self()->getEnumDeviceBaseAddress(this,0x01 , 0x004,0);
221 if(DSUBASEADDRESS == (unsigned int)-1)
221 if(DSUBASEADDRESS == (unsigned int)-1)
222 DSUBASEADDRESS = 0x90000000;
222 DSUBASEADDRESS = 0x90000000;
223 WriteRegs(uIntlist()<<0xFFFF,DSUBASEADDRESS+0x020);
223 WriteRegs(uIntlist()<<0xFFFF,DSUBASEADDRESS+0x020);
224 this->running = false;
224 this->running = false;
225 this->UI->setRunning(false);
225 this->UI->setRunning(false);
226 }
226 }
227
227
228 void dsu3plugin::toggleRun()
228 void dsu3plugin::toggleRun()
229 {
229 {
230 if(this->running)
230 if(this->running)
231 this->stop();
231 this->stop();
232 else
232 else
233 this->run();
233 this->run();
234 }
234 }
235
235
236 void dsu3plugin::WriteRegs(uIntlist Values, unsigned int address)
236 void dsu3plugin::WriteRegs(uIntlist Values, unsigned int address)
237 {
237 {
238 unsigned int* buff;
238 unsigned int* buff;
239 buff = (unsigned int*)malloc(Values.count()*sizeof(unsigned int));
239 buff = (unsigned int*)malloc(Values.count()*sizeof(unsigned int));
240 for(int i=0;i<Values.count();i++)
240 for(int i=0;i<Values.count();i++)
241 {
241 {
242 buff[i]=Values.at(i);
242 buff[i]=Values.at(i);
243 }
243 }
244 parent->Write(buff,(unsigned int)Values.count(),address);
244 parent->Write(buff,(unsigned int)Values.count(),address);
245 free(buff);
245 free(buff);
246 }
246 }
247
247
248 unsigned int dsu3plugin::ReadReg(unsigned int address)
248 unsigned int dsu3plugin::ReadReg(unsigned int address)
249 {
249 {
250 unsigned int buff;
250 unsigned int buff;
251 parent->Read(&buff,1,address);
251 parent->Read(&buff,1,address);
252 return buff;
252 return buff;
253 }
253 }
254
254
255 void dsu3plugin::writeSection(int index)
255 void dsu3plugin::writeSection(int index)
256 {
256 {
257 char* buffch=NULL;
257 char* buffch=NULL;
258 unsigned int* buff;
258 unsigned int* buff;
259 int size = this->elfparserInst->getSectionDatasz(index);
259 int size = this->elfparserInst->getSectionDatasz(index);
260 int sizeInt = size/4;
260 int sizeInt = size/4;
261 if(parent==NULL)
261 if(parent==NULL)
262 return;
262 return;
263 this->elfparserInst->getSectionData(index,&buffch);
263 this->elfparserInst->getSectionData(index,&buffch);
264 buff = (unsigned int*)malloc(((size/4)+1)*sizeof(unsigned int));
264 buff = (unsigned int*)malloc(((size/4)+1)*sizeof(unsigned int));
265 for(int i=0;i<sizeInt;i++)
265 for(int i=0;i<sizeInt;i++)
266 {
266 {
267 buff[i] = 0x0FF & ((unsigned int)buffch[4*i]);
267 buff[i] = 0x0FF & ((unsigned int)buffch[4*i]);
268 buff[i] = (buff[i]<<8) + (0x0FF & ((unsigned int)buffch[(4*i)+1]));
268 buff[i] = (buff[i]<<8) + (0x0FF & ((unsigned int)buffch[(4*i)+1]));
269 buff[i] = (buff[i]<<8) + (0x0FF & ((unsigned int)buffch[(4*i)+2]));
269 buff[i] = (buff[i]<<8) + (0x0FF & ((unsigned int)buffch[(4*i)+2]));
270 buff[i] = (buff[i]<<8) + (0x0FF & ((unsigned int)buffch[(4*i)+3]));
270 buff[i] = (buff[i]<<8) + (0x0FF & ((unsigned int)buffch[(4*i)+3]));
271 }
271 }
272 if(size%4)
272 if(size%4)
273 {
273 {
274 buff[sizeInt]=0;
274 buff[sizeInt]=0;
275 for(int i=(size%4);i>0;i--)
275 for(int i=(size%4);i>0;i--)
276 {
276 {
277 buff[sizeInt] = (buff[sizeInt]<<8) + (0x0FF & ((unsigned int)buffch[size-i]));
277 buff[sizeInt] = (buff[sizeInt]<<8) + (0x0FF & ((unsigned int)buffch[size-i]));
278 }
278 }
279 sizeInt++;
279 sizeInt++;
280 }
280 }
281 parent->Write(buff,(unsigned int)sizeInt,(unsigned int)this->elfparserInst->getSectionPaddr(index));
281 parent->Write(buff,(unsigned int)sizeInt,(unsigned int)this->elfparserInst->getSectionPaddr(index));
282 free(buff);
282 free(buff);
283 }
283 }
284
284
285 void dsu3plugin::writeSection(const QString &name)
285 void dsu3plugin::writeSection(const QString &name)
286 {
286 {
287 for(int i=0;i<this->elfparserInst->getSectioncount();i++)
287 for(int i=0;i<this->elfparserInst->getSectioncount();i++)
288 {
288 {
289 if(!this->elfparserInst->getSectionName(i).compare(name))
289 if(!this->elfparserInst->getSectionName(i).compare(name))
290 {
290 {
291 printf("about to write section %s @ 0x%x size = %d\n",elfparserInst->getSectionName(i).toStdString().c_str(),elfparserInst->getSectionPaddr(i),elfparserInst->getSectionMemsz(i));
291 printf("about to write section %s @ 0x%x size = %d\n",elfparserInst->getSectionName(i).toStdString().c_str(),elfparserInst->getSectionPaddr(i),elfparserInst->getSectionMemsz(i));
292 writeSection(i);
292 writeSection(i);
293 }
293 }
294 }
294 }
295 }
295 }
296
296
297
297
298 unsigned int dsu3plugin::Write(unsigned int *Value,unsigned int count,unsigned int address)
298 unsigned int dsu3plugin::Write(unsigned int *Value,unsigned int count,unsigned int address)
299 {
299 {
300 if(parent!=NULL)
300 if(parent!=NULL)
301 return parent->Write(Value,count,address);
301 return parent->Write(Value,count,address);
302 return 0;
302 return 0;
303 }
303 }
304
304
305 bool dsu3plugin::memSet(unsigned int address,int value, unsigned int count)
305 bool dsu3plugin::memSet(unsigned int address,int value, unsigned int count)
306 {
306 {
307 unsigned int* buffer = (unsigned int*)malloc(count*sizeof(unsigned int));
307 unsigned int* buffer = (unsigned int*)malloc(count*sizeof(unsigned int));
308 if(buffer!=NULL)
308 if(buffer!=NULL)
309 {
309 {
310 memset((void*)buffer,value,count*sizeof(unsigned int));
310 memset((void*)buffer,value,count*sizeof(unsigned int));
311 parent->Write(buffer,count,address);
311 parent->Write(buffer,count,address);
312 free(buffer );
312 free(buffer );
313 return true;
313 return true;
314 }
314 }
315 return false;
315 return false;
316 }
316 }
317
317
318 unsigned int dsu3plugin::Read(unsigned int *Value,unsigned int count, unsigned int address)
318 unsigned int dsu3plugin::Read(unsigned int *Value,unsigned int count, unsigned int address)
319 {
319 {
320 if(parent!=NULL)
320 if(parent!=NULL)
321 return parent->Read(Value,count,address);
321 return parent->Read(Value,count,address);
322 return 0;
322 return 0;
323 }
323 }
General Comments 0
You need to be logged in to leave comments. Login now