jzef

EDID Programmer

May 11th, 2026
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.53 KB | None | 0 0
  1. #include <Wire.h>
  2.  
  3. // =========================================================================
  4. // !!! UWAGA: ZMIEŃ TE NUMERY NA PINY GPIO POŁĄCZONE Z HDMI DDC w Twojej płytce
  5. // Domyślnie ustawiłem GPIO16 (SDA) i GPIO17 (SCL) dla magistrali I2C0
  6. // =========================================================================
  7. #define I2C_SDA_PIN 16
  8. #define I2C_SCL_PIN 17
  9.  
  10. #define EDID_ADDR 0x50 // Standardowy adres I2C pamięci EDID
  11.  
  12. void setup() {
  13. Serial.begin(115200);
  14.  
  15. // Konfiguracja pinów I2C
  16. Wire.setSDA(I2C_SDA_PIN);
  17. Wire.setSCL(I2C_SCL_PIN);
  18. Wire.begin();
  19. Wire.setClock(100000); // Prędkość 100 kHz (standard HDMI DDC)
  20.  
  21. // Czekaj na otwarcie portu szeregowego przez użytkownika na PC
  22. while (!Serial) delay(10);
  23.  
  24. printMenu();
  25. }
  26.  
  27. void loop() {
  28. if (Serial.available() > 0) {
  29. char cmd = Serial.read();
  30. // Czyszczenie bufora z resztek znaków nowej linii
  31. while(Serial.available() > 0 && (Serial.peek() == '\n' || Serial.peek() == '\r')) Serial.read();
  32.  
  33. switch (cmd) {
  34. case '1':
  35. readEDID(128); // Standardowy blok EDID
  36. printMenu();
  37. break;
  38. case '2':
  39. readEDID(256); // Blok EDID + rozszerzenie CEA
  40. printMenu();
  41. break;
  42. case '3':
  43. writeEDID();
  44. printMenu();
  45. break;
  46. default:
  47. printMenu();
  48. break;
  49. }
  50. }
  51. }
  52.  
  53. void printMenu() {
  54. Serial.println("\n=========================================");
  55. Serial.println(" PROGRAMATOR EDID RP2040 ");
  56. Serial.println("=========================================");
  57. Serial.println("1. Odczytaj podstawowy EDID (128 bajtow)");
  58. Serial.println("2. Odczytaj pelny EDID (256 bajtow)");
  59. Serial.println("3. Zapisz EDID (nadpisuje pierwsze 128 bajtow)");
  60. Serial.print("Wybierz opcje (1-3): ");
  61. }
  62.  
  63. void readEDID(int size) {
  64. Serial.println("\n[INFO] Odczytywanie...");
  65. byte buffer[256];
  66.  
  67. // Odczytujemy bajt po bajcie, aby ominąć ograniczenia bufora biblioteki Wire
  68. for (int i = 0; i < size; i++) {
  69. Wire.beginTransmission(EDID_ADDR);
  70. Wire.write(i); // Ustawienie wskaźnika adresu w EEPROM
  71. if (Wire.endTransmission(false) != 0) {
  72. Serial.println("\n[BLAD] Brak odpowiedzi I2C! Sprawdz polaczenie lub numery pinow GPIO.");
  73. return;
  74. }
  75.  
  76. Wire.requestFrom(EDID_ADDR, 1);
  77. if (Wire.available()) {
  78. buffer[i] = Wire.read();
  79. } else {
  80. Serial.println("\n[BLAD] Blad odczytu danych!");
  81. return;
  82. }
  83. }
  84.  
  85. Serial.println("\n--- DANE EDID (HEX) ---");
  86. for (int i = 0; i < size; i++) {
  87. if (buffer[i] < 0x10) Serial.print("0");
  88. Serial.print(buffer[i], HEX);
  89. Serial.print(" ");
  90. if ((i + 1) % 16 == 0) Serial.println();
  91. }
  92. Serial.println("-----------------------");
  93. }
  94.  
  95. void writeEDID() {
  96. Serial.println("\n[INFO] Opcja zapisu. Wklej dokladnie 128 bajtow w formacie HEX.");
  97. Serial.println("Przyklad: 00 FF FF FF FF FF FF 00 4D 10 ...");
  98. Serial.println("Czekam na dane (masz 30 sekund)...");
  99.  
  100. byte newData[128];
  101. int byteCount = 0;
  102. unsigned long startTime = millis();
  103.  
  104. while (byteCount < 128 && (millis() - startTime < 30000)) {
  105. if (Serial.available() >= 2) {
  106. char hex1 = Serial.read();
  107. // Ignoruj spacje i znaki nowej linii
  108. if (hex1 == ' ' || hex1 == '\n' || hex1 == '\r') continue;
  109.  
  110. // Czekaj na drugi znak bajtu
  111. while (Serial.available() == 0 && (millis() - startTime < 30000));
  112. char hex2 = Serial.read();
  113.  
  114. char hexStr[3] = {hex1, hex2, '\0'};
  115. newData[byteCount] = (byte)strtol(hexStr, NULL, 16);
  116. byteCount++;
  117. Serial.print("."); // Wskaźnik postępu pobierania z PC
  118. }
  119. }
  120.  
  121. if (byteCount < 128) {
  122. Serial.println("\n[BLAD] Przerwano! Otrzymano za malo danych.");
  123. return;
  124. }
  125.  
  126. Serial.println("\n[INFO] Dane odebrane poprawnie. Rozpoczynam zapis do EEPROM...");
  127.  
  128. // Zapis do EEPROM bajt po bajcie (najbezpieczniejszy dla roznych typow pamieci)
  129. for (int i = 0; i < 128; i++) {
  130. Wire.beginTransmission(EDID_ADDR);
  131. Wire.write(i); // Adres komórki
  132. Wire.write(newData[i]); // Wartość
  133. byte error = Wire.endTransmission();
  134.  
  135. if (error != 0) {
  136. Serial.print("\n[BLAD] Zapis nie powiodl sie na bajcie: ");
  137. Serial.println(i);
  138. Serial.println("Monitor moze miec zablokowany zapis (Write Protection)!");
  139. return;
  140. }
  141. // Pamiec EEPROM potrzebuje czasu na fizyczny zapis (ok. 5ms)
  142. delay(10);
  143. }
  144.  
  145. Serial.println("\n[SUKCES] Zapisano EDID pomyslnie!");
  146. }
Advertisement
Add Comment
Please, Sign In to add comment