Hallo Ohne das es jetzt auf den Nägeln brennt. Hier gibt es noch einen Edision Proton T265 LED DVB-T2 Receiver bei dem nach einem fehlgeschlagenem Firmware Update kein Booten mehr möglich ist. Das Gerät hängt einfach. Edision war nicht kooporativ... keinen Antwort auf meine Nachfrage. Hilfreiche Hinweise sind willkommen. MfG elC PS: Will jemand einen Tizzbird F20 Mediaplayer wiederbeleben kann ich helfen
Der hat ja einen 8 Pin Flash Winbond 25Q32FVSIG im SO8-Wide Gehäuse drauf. Da das Firmwarefile ja auch genau 4MByte hat, könnte es sein, dass es 1:1 zu brennen wäre.
:
Bearbeitet durch User
Hallo Danke für den Hinweis! Mit dem Receiver hatte ich mich noch gar nicht beschäftigt, nur kurz geöffnet für eine Sichtprobe. Gerade habe ich das Winbond 25Q32FVSIG Datenblatt geladen und kurz überflogen. Bei den 3 Buchstaben SPI bin ich wach geworden und sofort kam die Idee für das Flashen meinen esp32 zu nutzen... Auf den Boden zurückgekehrt ist das Flashen nicht so simpel. Kurz gegoogled wurde eine Library entdeckt, mit Beispielprogramm. Mal sehen... Irgendwann in den nächsten Wochen werde ich das mal angehen. Im Moment steht noch der Akkutausch meines Nokia 5 an. In 5 Jahren ca. 50 mal genutzt (nur mp3 / GPS) und der Akku bläht sich auf. LiPo Akkus fand ich schon immer seltsam. Ob ich den Winbond zum Flashen auslöten muss/kann? Ein neuer Chip kostet ~ 3Euro, das würde sich rechnen. Nochmal Danke für den Wegweiser! MfG
ElC schrieb: > Winbond 25Q32FVSIG (...) > Auf den Boden zurückgekehrt ist das Flashen nicht so simpel. Der TL866 unterstützt dieses Flash-ROM auch. So weit wie dieser Programmer verbreitet ist, findest Du vielleicht eine hilfreiche Person in Deiner Nähe? Für den Filder-Raum, südlich von Stuttgart, würde ich mich anbieten. Grüßle, Volker
Hallo Aktuell sind andere Sachen wichtiger und es wird noch viele Wochen dauern bis das Gerät verarztet wird... Deshalb nur kurz einige Infos. Es ist tatsächlich ein Winbond 25Q32FVSIG verbaut. Es sieht so aus als wenn die Pins auf Lötpads geführt sind, allerdings nicht nachgemessen. Hilfreich erscheinen mir diese beiden Links: http://www.technoblogy.com/show?2JMU https://onecircuit.blogspot.com/2021/06/0000-0000-0110-0111.html Es wird für mich kein Problem sein den Code an den esp32 anzupassen. Ob es möglich sein wird zu flashen ohne den Chip auszulöten, z.B. mit Leitungen an den Lötpads? Ist das zu naiv gedacht? MfG
ElC schrieb: > > Ob es möglich sein wird zu flashen ohne den Chip auszulöten, z.B. mit > Leitungen an den Lötpads? Ist das zu naiv gedacht? Kommt darauf an was der SoC/Mikrocontroller macht, wenn die Pins für den SPI Zugriff bereits als Ausgänge konfiguriert sind gibt es Probleme. Abgesehen davon: hast Du schon geschaut ob es eine serielle Schnittstelle gibt? Die vier Pins an dem unbestückten Header links neben dem Kühlkörper wären ein Kandidat. Falls das eine serielle Schnittstelle ist kommt da eventuell noch etwas (z.B. vom Bootloader) und gibt Hinweise wo das Problem liegt.
Interessanter Hinweis, allerdings wüsste ich so gar nicht wie ich da vorgehen könnte... Ich gehe im Moment davon aus, dass der Chip auf jeden Fall geflasht werden muss. Ist auch eine angenehme Programmieraufgabe. Da sehe ich Licht am Ende des Tunnels. Es sei denn das Flashen geht über die Schnittstelle, wenn es denn eine ist. Aber was ist das für eine, da fängt das Problem für mich schon an. Außer mit RS232 unter Win32asm besteht da null Erfahrung. MfG
ElC schrieb: > Interessanter Hinweis, allerdings wüsste ich so gar nicht wie ich da > vorgehen könnte... Hast Du ein Oszilloskop? Dann könntest Du schauen ob sich an einem der vier Pins nach dem Einschalten des Geräts etwas tut. Bei einer seriellen Schnittstelle wird wohl GND, Tx, Rx und Vcc (vermutlich 3.3 Volt) an den Pins anliegen. Diese DVB Receiver haben sehr häufig eine interne serielle Schnittstelle, manchmal gibt es im Booloader Möglichkeiten die eigentliche Firmware einzuspielen.
Wenn man ein wenig im Netz sucht und in den Flash Dump des Edision Proton T265 schaut dann sieht es so aus als ob es Tools gibt die über die serielle Schnittstelle den Flash programmieren können ("Sunplus Loader"). Voraussetzung ist dass der Booloader im Flash noch intakt ist. Außederm scheinen je nach Version des Tools nur bstimmte Flash Typen unterstützt zu werden.
Nachtrag zu weiter oben: Mit diesem Tool scheint ein Programmieren des Flash auch dann noch über die serielle Schnittstelle zu funktionieren wenn der Bootloader im Flash defekt ist (scheinbar hat der DVB SoC auch noch einen ROM Bootloader): https://dvbpro.ru/vosstanovlenie-pristavki-na-sunplus-sphe-posle-neudachnoj-proshivki/ Die Anleitung für "ConsoleDown" ist auf Englisch mit ein paar Screenshots. Der SoC im Edision Proton T265 sollte ein SPHE8600 sein (mit MIPS CPU).
:
Bearbeitet durch User
Wow, danke für dein Engagement! Erst mal alles runter geladen und der Google Übersetzer ist auch hifreich. Hier gibt es noch zwei alte vollkommen isolierte Notebooks (98SE/XP3), beide mit RS232. Diverse Adapter sind auch in der Schublade, inclusive USB zu RS232... Die Notebooks können beide auch schnell mit einem Image wieder neu aufgesetzt werden, wegen der Virengefahr bei Software aus unbekannter Quelle. Auf jeden Fall genug Stoff für die Wiederbelebungsversuche, entweder flashen oder via RS232. Heute hat erst mal das Nokia 5 einen neuen Akku bekommen, weiter gehts mit dem Breadboard Bedienpult... und dann kommt der Edison an die Reihe. MfG
ElC schrieb: > > Die Notebooks können beide auch schnell mit einem Image wieder neu > aufgesetzt werden, wegen der Virengefahr bei Software aus unbekannter > Quelle. Vieles spricht dafür dass es sich bei "ConsoleDown" (bzw. "UARTLOADER.zip") um ein Tool des DVB SoC Herstellers Sunplus handelt. Du musst halt noch herausfinden ob die serielle Schnittstelle an den vier Pins anliegt oder woanders. Ich gehe aber stark davon aus dass es sie auf jeden Fall als unbestückten Header bzw. Testpads geben wird. Bei den vier Pins am unbestückten Header scheinen zwei Pins wohl GND zu sein, dann sind die beiden anderen Rx bzw. Tx (falls es die serielle Schnittstelle ist). Idealerweise noch die Spannung an den beiden Pins messen und dann einen geeigneten UART-USB Adapter (bzw. Pegelwandler bei echtem RS232 Port) auswählen.
Der Vollständigkeit halber: die vier Pins an dem unbestückten Header sind für die serielle Schnittstelle, siehe Bild. Allerdings sind die UART Pegel von Rx und Tx invertiert, dafür sind die zwei Transistoren und die Widerstände zuständig (der Spannungspegel beträgt 5 Volt). Es gibt USB-UART Interface Chips bei denen man Tx und Rx per Konfiguration im EEPROM invertieren kann, z.B. beim FT232RL.
Hallo Ich bin erst jetzt dazu gekommen die Geschichte in Angriff zu nehmen. Ist ja allgemein bekannt, dass wir Rentner keine Zeit haben... :-) Der erste Versuch mit eingebautem Chip hat nicht funktioniert. Das kann aber durchaus an meiner ersten fehlerhaften Software gelegen haben. Die SPI Geschichte in David's code war mir erst so gar nicht klar. Also den chip ausgelötet und mittels selbst gebautem Adapter mit dem esp32 verbunden. Alles etwas abenteuerlich, da kein professioneller Adapter vorhanden. Inzwischen wurde der Winbond 25Q32FVSIG erfolgreich geflasht. Schätze ich habe nur eine Chance den Chip wieder einzulöten. Ein nochmaliges Auslöten/Einlöten wird die Hardware nicht überstehen. Bevor ich jetzt weiter mache würde mich eure Meinung interessieren. Wurde meinerseits etwas übersehen oder bin ich auf einem ganz falschen Pfad? Reicht es wirklich nur den Winbond neu zu flashen? Wie auch immer es weitergeht. Das flashen scheint zu funktionieren. Anbei einige Fotos und der Arduino code. Dank geht an David Johnson-Davies - www.technoblogy.com für den DataFlash code! MfG PS: Schon klar, ich soll keine langen source codes einfügen... zip im Anhang
1 | // **************************************************************************************
|
2 | // el Comandante guerilla.bplaced.net
|
3 | // --------------------------------------------------------------------------------------
|
4 | // Information:
|
5 | // VSPI sd-card interface, Custom VSPI Pins, flash Winbond W25Q32FVSIG chip (4 MB)
|
6 | // Read datas from a file on sd-card and flash datas to Winbond 25Q32FVSIG chip (4 MB)
|
7 | // Written for the esp32 device, should work with any other mcu with SPI- Interface
|
8 | // Status:
|
9 | // Bricked Edision Proton T265 LED DVB-T receiver after firmware flash failure
|
10 | // Goal:
|
11 | // Bring the Edision Proton T265 LED DVB-T receiver back on stage
|
12 | // --------------------------------------------------------------------------------------
|
13 | // Firmware download:
|
14 | // https://www.edision.gr/de/detail/proton-t265-led
|
15 | // --------------------------------------------------------------------------------------
|
16 | // Details:
|
17 | // - Download the firmware
|
18 | // - Copy the firmware file (renamed to: flashdat.bin) to a FAT32 formatted sd-card
|
19 | // - Connect a sd-card breakout modul to the esp32 device
|
20 | // - Insert the sd-card with the firmware file
|
21 | // - Connect the Winbond W25Q32FVSIG chip (4 MB) to the esp32 device using the adapter
|
22 | // - Start the Arduino IDE and load this ino file
|
23 | // - Upload the file to the esp32 device
|
24 | // - Be patient, flashing and verifying could take a few minutes
|
25 | // **************************************************************************************
|
26 | |
27 | #include <SPI.h> |
28 | #include <SD.h> |
29 | |
30 | // ######################################################################################
|
31 | // Change values in this area to match your envoirement and desires
|
32 | // --------------------------------------------------------------------------------------
|
33 | // Winbond DataFlash commands
|
34 | #define PAGEPROG 0x02
|
35 | #define READSTATUS 0x05
|
36 | #define READDATA 0x03
|
37 | #define WRITEENABLE 0x06
|
38 | #define CHIPERASE 0x60
|
39 | #define READID 0x90
|
40 | |
41 | // Custom VSPI Pins for the SD-Card breakout board and the flash ram - must match the wired hardware
|
42 | #define sck 27
|
43 | #define miso 32
|
44 | #define mosi 33
|
45 | #define cs 2 // chip select sd-card breakout board
|
46 | |
47 | // Custom Pins for the flash chip - must match the wired hardware
|
48 | #define sckF 21
|
49 | #define misoF 22
|
50 | #define mosiF 23
|
51 | #define csF 4 // chip select flash ram chip
|
52 | // ######################################################################################
|
53 | |
54 | // Vars
|
55 | uint32_t errors; |
56 | uint8_t errorSDCard; |
57 | uint8_t errorFlash; |
58 | uint8_t filedata; |
59 | uint8_t flashdata; |
60 | uint32_t filesize; |
61 | uint32_t i; |
62 | uint32_t vspiBusFrequency = 2000000; // >= 4000000 sd-card mount could fail |
63 | File file; // file object |
64 | String szFilepath = "/flashdat.bin"; // file to load |
65 | |
66 | // Create a new SPI class on HSPI or VSPI
|
67 | SPIClass vspi = SPIClass(VSPI); |
68 | |
69 | |
70 | // ======================================================================================
|
71 | // Simple DataFlash - see http://www.technoblogy.com/show?2JMU
|
72 | //
|
73 | // David Johnson-Davies - www.technoblogy.com - 17th July 2019
|
74 | //
|
75 | // CC BY 4.0 Licensed under a Creative Commons Attribution 4.0 International license:
|
76 | // http://creativecommons.org/licenses/by/4.0/
|
77 | // --------------------------------------------------------------------------------------
|
78 | // Adapter circuit modified (without diodes):
|
79 | // https://onecircuit.blogspot.com/2021/06/0000-0000-0110-0111.html
|
80 | // --------------------------------------------------------------------------------------
|
81 | |
82 | class DF { |
83 | public:
|
84 | boolean Setup(); |
85 | void BeginRead(unsigned long addr); |
86 | void BeginWrite(void); |
87 | uint8_t ReadByte(void); |
88 | void WriteByte(uint8_t data); |
89 | void EndRead(void); |
90 | void EndWrite(void); |
91 | private:
|
92 | unsigned long addr; |
93 | uint8_t Read(void); |
94 | void Write(uint8_t); |
95 | void Busy(void); |
96 | void WriteEnable(void); |
97 | };
|
98 | |
99 | boolean DF::Setup () { |
100 | uint8_t manID, devID; |
101 | //pinMode(power, OUTPUT); digitalWrite(power, HIGH);
|
102 | digitalWrite(csF, HIGH); pinMode(csF, OUTPUT); |
103 | pinMode(sckF, OUTPUT); |
104 | pinMode(mosiF, OUTPUT); |
105 | pinMode(misoF, INPUT); |
106 | digitalWrite(sckF, LOW); digitalWrite(mosiF, HIGH); |
107 | delay(1); |
108 | digitalWrite(csF, LOW); |
109 | delay(100); |
110 | Write(READID); Write(0);Write(0);Write(0); |
111 | manID = Read(); |
112 | devID = Read(); |
113 | digitalWrite(csF, HIGH); |
114 | return (devID == 0x15); // Found correct device |
115 | }
|
116 | |
117 | void DF::Write (uint8_t data) { |
118 | shiftOut(mosiF, sckF, MSBFIRST, data); |
119 | }
|
120 | |
121 | void DF::Busy () { |
122 | digitalWrite(csF, 0); |
123 | Write(READSTATUS); |
124 | while (Read() & 1 != 0); |
125 | digitalWrite(csF, 1); |
126 | }
|
127 | |
128 | void DF::WriteEnable () { |
129 | digitalWrite(csF, 0); |
130 | Write(WRITEENABLE); |
131 | digitalWrite(csF, 1); |
132 | }
|
133 | |
134 | void DF::BeginRead (unsigned long start) { |
135 | addr = start; |
136 | Busy(); |
137 | digitalWrite(csF, 0); |
138 | Write(READDATA); |
139 | Write(addr>>16); |
140 | Write(addr>>8); |
141 | Write(addr); |
142 | }
|
143 | |
144 | uint8_t DF::Read () { |
145 | return shiftIn(misoF, sckF, MSBFIRST); |
146 | }
|
147 | |
148 | void DF::EndRead(void) { |
149 | digitalWrite(csF, 1); |
150 | }
|
151 | |
152 | void DF::BeginWrite () { |
153 | addr = 0; |
154 | Busy(); |
155 | // Erase DataFlash
|
156 | WriteEnable(); |
157 | digitalWrite(csF, 0); |
158 | Write(CHIPERASE); |
159 | digitalWrite(csF, 1); |
160 | Busy(); |
161 | }
|
162 | |
163 | uint8_t DF::ReadByte () { |
164 | return Read(); |
165 | }
|
166 | |
167 | void DF::WriteByte (uint8_t data) { |
168 | // New page
|
169 | if ((addr & 0xFF) == 0) { |
170 | digitalWrite(csF, 1); |
171 | Busy(); |
172 | WriteEnable(); |
173 | digitalWrite(csF, 0); |
174 | Write(PAGEPROG); |
175 | Write(addr>>16); |
176 | Write(addr>>8); |
177 | Write(0); |
178 | }
|
179 | Write(data); |
180 | addr++; |
181 | }
|
182 | |
183 | void DF::EndWrite (void) { |
184 | digitalWrite(csF, 1); |
185 | }
|
186 | |
187 | DF DataFlash; |
188 | |
189 | |
190 | |
191 | // Setup
|
192 | void setup() |
193 | {
|
194 | // serial monitor - init
|
195 | Serial.begin(115200); |
196 | //while (!Serial);
|
197 | delay (2000); |
198 | Serial.println("-----------------------------------------------------------"); |
199 | Serial.println("Testing"); |
200 | Serial.println("-----------------------------------------------------------"); |
201 | Serial.println("Serial Monitor: Okay"); |
202 | |
203 | Serial.println("-----------------------------------------------------------"); |
204 | Serial.println("Test SD-Card"); |
205 | Serial.println("-----------------------------------------------------------"); |
206 | // sd-card - vspi init
|
207 | digitalWrite(cs, HIGH); // slave select pin csSD (sd-card) |
208 | vspi.begin(sck, miso, mosi, cs); // init sd-card spi communication protocol |
209 | Serial.println("SD-Card VSPI: Okay"); |
210 | |
211 | // sd-card - mount
|
212 | errorSDCard = 0; |
213 | if (!SD.begin(cs, vspi, vspiBusFrequency)) |
214 | {Serial.println("SD-Card Mount: Error"); errorSDCard++;} |
215 | else
|
216 | {Serial.println("SD-Card Mount: Okay");} |
217 | |
218 | // sd-card - check
|
219 | if(SD.cardType() == CARD_NONE) |
220 | {Serial.println("SD-Card Type: None"); errorSDCard++;} |
221 | else
|
222 | {Serial.println("SD-Card Type: Okay");} |
223 | |
224 | // sd-card - open file and read filesize
|
225 | file = SD.open(szFilepath, FILE_READ); |
226 | if (file) |
227 | {Serial.print("File Open: "); Serial.println(szFilepath); filesize = file.size(); Serial.print("File Size: "); Serial.println(filesize);} |
228 | else
|
229 | {Serial.print("File Open: Error "); errorSDCard++;} |
230 | |
231 | filedata = file.read(); |
232 | Serial.print("File Byte 0: "); Serial.println(filedata, HEX); |
233 | filedata = file.read(); |
234 | Serial.print("File Byte 1: "); Serial.println(filedata, HEX); |
235 | file.seek(filesize); |
236 | filedata = file.read(); |
237 | Serial.print("File Byte "); Serial.print(filesize, DEC); Serial.print(": "); Serial.println(filedata, HEX); |
238 | file.seek(0); |
239 | filedata = file.read(); |
240 | Serial.print("File Byte 0: "); Serial.println(filedata, HEX); |
241 | |
242 | Serial.println("-----------------------------------------------------------"); |
243 | Serial.println("Test Flash"); |
244 | Serial.println("-----------------------------------------------------------"); |
245 | // flash ram - setup
|
246 | errorFlash = 0; |
247 | if (!DataFlash.Setup()) |
248 | {Serial.println("Flash chip: Not found"); errorFlash++;} |
249 | else
|
250 | {Serial.println("Flash chip: Found");} |
251 | |
252 | // flash write test
|
253 | filedata = 0x4B; |
254 | Serial.print("Flash Write Test: "); Serial.println(filedata, HEX); |
255 | DataFlash.BeginWrite(); |
256 | DataFlash.WriteByte(filedata); |
257 | DataFlash.EndWrite(); |
258 | |
259 | // flash read test
|
260 | DataFlash.BeginRead(0); |
261 | filedata = 0; |
262 | filedata = DataFlash.ReadByte(); |
263 | Serial.print("Flash Read Test: "); Serial.println(filedata, HEX); |
264 | DataFlash.EndRead(); |
265 | |
266 | Serial.println("-----------------------------------------------------------"); |
267 | Serial.println("Test Result"); |
268 | Serial.println("-----------------------------------------------------------"); |
269 | if (errorSDCard == 0 && errorFlash == 0) |
270 | {Serial.println("Okay");} |
271 | else
|
272 | {Serial.println("Error"); return;} |
273 | |
274 | Serial.println(""); |
275 | |
276 | Serial.println("-----------------------------------------------------------"); |
277 | Serial.println("Flashing..."); |
278 | Serial.println("-----------------------------------------------------------"); |
279 | delay (1000); |
280 | |
281 | // file pointer
|
282 | file.seek(0); |
283 | |
284 | // flash write begin
|
285 | DataFlash.BeginWrite(); |
286 | // flash write loop
|
287 | for (i = 0; i < filesize; i++) |
288 | {
|
289 | filedata = file.read(); // read byte from file |
290 | DataFlash.WriteByte(filedata); // write byte to flash |
291 | }
|
292 | // flash write end
|
293 | DataFlash.EndWrite(); |
294 | |
295 | // empty line
|
296 | Serial.println(""); |
297 | |
298 | Serial.println("-----------------------------------------------------------"); |
299 | Serial.println("Verifying..."); |
300 | Serial.println("-----------------------------------------------------------"); |
301 | delay (1000); |
302 | |
303 | // file pointer
|
304 | file.seek(0); |
305 | |
306 | // flash read begin
|
307 | DataFlash.BeginRead(0); |
308 | |
309 | // flash read loop
|
310 | errors = 0; |
311 | for (i = 0; i < filesize; i++) |
312 | {
|
313 | filedata = file.read(); |
314 | flashdata = DataFlash.ReadByte(); |
315 | //Serial.print("Verify: "); Serial.print("File = "); Serial.print(filedata, HEX); Serial.print(" --- Flash = "); Serial.println(flashdata, HEX);
|
316 | if (flashdata != filedata) |
317 | {errors++;} |
318 | }
|
319 | |
320 | // flash read end
|
321 | DataFlash.EndRead(); |
322 | |
323 | // empty line
|
324 | Serial.println(""); |
325 | |
326 | Serial.println("-----------------------------------------------------------"); |
327 | Serial.println("End of program"); |
328 | Serial.println("-----------------------------------------------------------"); |
329 | // file close
|
330 | file.close(); |
331 | Serial.print("Errors: "); Serial.println(errors); |
332 | }
|
333 | |
334 | |
335 | |
336 | // Loop
|
337 | void loop() |
338 | {
|
339 | // notting to do
|
340 | }
|
Hallo Ich bin erst jetzt dazu gekommen die Geschichte in Angriff zu nehmen. Ist ja allgemein bekannt, dass wir Rentner keine Zeit haben... :-) Der erste Versuch mit eingebautem Chip hat nicht funktioniert. Das kann aber durchaus an meiner ersten fehlerhaften Software gelegen haben. Die SPI Geschichte in David's code war mir erst so gar nicht klar. Also den chip ausgelötet und mittels selbst gebautem Adapter mit dem esp32 verbunden. Alles etwas abenteuerlich, da kein professioneller Adapter vorhanden. Inzwischen wurde der Winbond 25Q32FVSIG erfolgreich geflasht. Nach dem Einbau des Winbond 25Q32FVSIG ist der Edision Proton T265 LED back on stage. Yeah! Im Anhang das aktualisierte Arduino Flash Programm und einige Bilder der ganzen Aktion. Das Arduino Flash Programm ist mit dem Adapter natürlich universell einsetzbar, nicht nur für den Edision Proton T265 LED. Achtet bitte auf die passende Spannung, der Winbond will 3V3! Der esp32 liefert 3V3, andere mcu's arbeiten mit 5V. Dank geht an David Johnson-Davies - www.technoblogy.com für den DataFlash code! Dieser Post wurde aktualisiert und auf den neuesten Stand gebracht. MfG
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.