Forum: Mikrocontroller und Digitale Elektronik Edision Proton T265 LED - No Boot after Firmware update fail


von ElC (elc)


Lesenswert?

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

von Karl-werner R. (kwriedel)


Lesenswert?

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
von ElC (elc)


Lesenswert?

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

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

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

von ElC (elc)


Angehängte Dateien:

Lesenswert?

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

von Dieter S. (ds1)


Lesenswert?

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.

von ElC (elc)


Lesenswert?

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

von Dieter S. (ds1)


Lesenswert?

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.

von Dieter S. (ds1)


Lesenswert?

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.

von Dieter S. (ds1)


Lesenswert?

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
von ElC (elc)


Lesenswert?

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

von Dieter S. (ds1)


Lesenswert?

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.

von Dieter S. (ds1)


Angehängte Dateien:

Lesenswert?

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.

von ElC (elc)



Lesenswert?

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
}

von ElC (elc)



Lesenswert?

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
Noch kein Account? Hier anmelden.