Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- // =========================================================================
- // !!! UWAGA: ZMIEŃ TE NUMERY NA PINY GPIO POŁĄCZONE Z HDMI DDC w Twojej płytce
- // Domyślnie ustawiłem GPIO16 (SDA) i GPIO17 (SCL) dla magistrali I2C0
- // =========================================================================
- #define I2C_SDA_PIN 16
- #define I2C_SCL_PIN 17
- #define EDID_ADDR 0x50 // Standardowy adres I2C pamięci EDID
- void setup() {
- Serial.begin(115200);
- // Konfiguracja pinów I2C
- Wire.setSDA(I2C_SDA_PIN);
- Wire.setSCL(I2C_SCL_PIN);
- Wire.begin();
- Wire.setClock(100000); // Prędkość 100 kHz (standard HDMI DDC)
- // Czekaj na otwarcie portu szeregowego przez użytkownika na PC
- while (!Serial) delay(10);
- printMenu();
- }
- void loop() {
- if (Serial.available() > 0) {
- char cmd = Serial.read();
- // Czyszczenie bufora z resztek znaków nowej linii
- while(Serial.available() > 0 && (Serial.peek() == '\n' || Serial.peek() == '\r')) Serial.read();
- switch (cmd) {
- case '1':
- readEDID(128); // Standardowy blok EDID
- printMenu();
- break;
- case '2':
- readEDID(256); // Blok EDID + rozszerzenie CEA
- printMenu();
- break;
- case '3':
- writeEDID();
- printMenu();
- break;
- default:
- printMenu();
- break;
- }
- }
- }
- void printMenu() {
- Serial.println("\n=========================================");
- Serial.println(" PROGRAMATOR EDID RP2040 ");
- Serial.println("=========================================");
- Serial.println("1. Odczytaj podstawowy EDID (128 bajtow)");
- Serial.println("2. Odczytaj pelny EDID (256 bajtow)");
- Serial.println("3. Zapisz EDID (nadpisuje pierwsze 128 bajtow)");
- Serial.print("Wybierz opcje (1-3): ");
- }
- void readEDID(int size) {
- Serial.println("\n[INFO] Odczytywanie...");
- byte buffer[256];
- // Odczytujemy bajt po bajcie, aby ominąć ograniczenia bufora biblioteki Wire
- for (int i = 0; i < size; i++) {
- Wire.beginTransmission(EDID_ADDR);
- Wire.write(i); // Ustawienie wskaźnika adresu w EEPROM
- if (Wire.endTransmission(false) != 0) {
- Serial.println("\n[BLAD] Brak odpowiedzi I2C! Sprawdz polaczenie lub numery pinow GPIO.");
- return;
- }
- Wire.requestFrom(EDID_ADDR, 1);
- if (Wire.available()) {
- buffer[i] = Wire.read();
- } else {
- Serial.println("\n[BLAD] Blad odczytu danych!");
- return;
- }
- }
- Serial.println("\n--- DANE EDID (HEX) ---");
- for (int i = 0; i < size; i++) {
- if (buffer[i] < 0x10) Serial.print("0");
- Serial.print(buffer[i], HEX);
- Serial.print(" ");
- if ((i + 1) % 16 == 0) Serial.println();
- }
- Serial.println("-----------------------");
- }
- void writeEDID() {
- Serial.println("\n[INFO] Opcja zapisu. Wklej dokladnie 128 bajtow w formacie HEX.");
- Serial.println("Przyklad: 00 FF FF FF FF FF FF 00 4D 10 ...");
- Serial.println("Czekam na dane (masz 30 sekund)...");
- byte newData[128];
- int byteCount = 0;
- unsigned long startTime = millis();
- while (byteCount < 128 && (millis() - startTime < 30000)) {
- if (Serial.available() >= 2) {
- char hex1 = Serial.read();
- // Ignoruj spacje i znaki nowej linii
- if (hex1 == ' ' || hex1 == '\n' || hex1 == '\r') continue;
- // Czekaj na drugi znak bajtu
- while (Serial.available() == 0 && (millis() - startTime < 30000));
- char hex2 = Serial.read();
- char hexStr[3] = {hex1, hex2, '\0'};
- newData[byteCount] = (byte)strtol(hexStr, NULL, 16);
- byteCount++;
- Serial.print("."); // Wskaźnik postępu pobierania z PC
- }
- }
- if (byteCount < 128) {
- Serial.println("\n[BLAD] Przerwano! Otrzymano za malo danych.");
- return;
- }
- Serial.println("\n[INFO] Dane odebrane poprawnie. Rozpoczynam zapis do EEPROM...");
- // Zapis do EEPROM bajt po bajcie (najbezpieczniejszy dla roznych typow pamieci)
- for (int i = 0; i < 128; i++) {
- Wire.beginTransmission(EDID_ADDR);
- Wire.write(i); // Adres komórki
- Wire.write(newData[i]); // Wartość
- byte error = Wire.endTransmission();
- if (error != 0) {
- Serial.print("\n[BLAD] Zapis nie powiodl sie na bajcie: ");
- Serial.println(i);
- Serial.println("Monitor moze miec zablokowany zapis (Write Protection)!");
- return;
- }
- // Pamiec EEPROM potrzebuje czasu na fizyczny zapis (ok. 5ms)
- delay(10);
- }
- Serial.println("\n[SUKCES] Zapisano EDID pomyslnie!");
- }
Advertisement
Add Comment
Please, Sign In to add comment