Begining of project
This commit is contained in:
43
DIODE_MODE.md
Normal file
43
DIODE_MODE.md
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# Diode Mode Implementation Details
|
||||||
|
|
||||||
|
To implement diode mode on a microcontroller like the Raspberry Pi Pico, follow this circuit and logic.
|
||||||
|
|
||||||
|
## Circuit Design
|
||||||
|
1. **Pull-up Resistor**: Connect a 10kΩ resistor from 3.3V to the common Signal pin of your Multiplexer.
|
||||||
|
2. **Measurement Point**: Connect an ADC pin (e.g., GPIO 26) to the same Signal pin of the Multiplexer.
|
||||||
|
3. **HDMI Ground**: Connect HDMI Pin 17 (DDC/CEC Ground) and the Shell to the Microcontroller's Ground.
|
||||||
|
|
||||||
|
## Logic (Pseudo-code)
|
||||||
|
```cpp
|
||||||
|
float measureDiode(int channel) {
|
||||||
|
// 1. Select the channel on the Mux
|
||||||
|
setMuxChannel(channel);
|
||||||
|
|
||||||
|
// 2. Wait for voltage to stabilize
|
||||||
|
sleep_ms(5);
|
||||||
|
|
||||||
|
// 3. Read ADC value (0-4095 for 12-bit ADC)
|
||||||
|
uint16_t raw = adc_read();
|
||||||
|
|
||||||
|
// 4. Convert to voltage
|
||||||
|
float voltage = (raw * 3.3f) / 4095.0f;
|
||||||
|
|
||||||
|
return voltage;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Fault Logic for Intake Mode
|
||||||
|
The software uses the following logic to provide "Educated Guesses":
|
||||||
|
|
||||||
|
| Reading | Possible Fault | Hint |
|
||||||
|
|---------|----------------|------|
|
||||||
|
| 0.0V - 0.1V | Short to Ground | Check ESD protection diodes or internal IC short. |
|
||||||
|
| 1.0V - 3.2V | High Resistance / Open | Check for cracked solder joints on the HDMI port. |
|
||||||
|
| 3.3V (VCC) | Full Open | Line is completely disconnected. Port might be ripped. |
|
||||||
|
| 0.3V - 0.7V | Nominal | Line is likely connected to Redriver or APU correctly. |
|
||||||
|
|
||||||
|
## Redriver IC Testing
|
||||||
|
If all lines show nominal diode readings but there is still no video:
|
||||||
|
1. Check the **+5V line** (Pin 18). If it's missing, the console won't trigger the TV's HPD.
|
||||||
|
2. Check the **DDC lines** (SCL/SDA). If these are open, the console cannot read the EDID from the TV.
|
||||||
|
3. If Diode mode is perfect, the issue is likely the **Redriver IC** itself being powered down or having internal logic failure, or the **APU** encoder.
|
||||||
43
HARDWARE.md
Normal file
43
HARDWARE.md
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# HDMI Tester Project
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
This project aims to create a handheld HDMI tester for console repair technicians. It features two modes:
|
||||||
|
- **Intake Mode**: Simple Pass/Fail with diagnostic suggestions.
|
||||||
|
- **Tech Mode**: Detailed diode mode readings for all 19 HDMI pins.
|
||||||
|
|
||||||
|
## Hardware Recommendations
|
||||||
|
|
||||||
|
To measure diode mode (voltage drop across a diode junction), we need a microcontroller with an ADC and the ability to source a small constant current or use a pull-up resistor.
|
||||||
|
|
||||||
|
### 1. Microcontroller: ESP32 or Raspberry Pi Pico
|
||||||
|
- **ESP32**: Integrated Wi-Fi/BT (good for future logging), multiple ADCs.
|
||||||
|
- **RP2040 (Pico)**: Great documentation, dual-core, very affordable, stable ADCs.
|
||||||
|
- **Recommendation**: **Raspberry Pi Pico** for its simplicity and 3.3V logic which is safer for HDMI lines.
|
||||||
|
|
||||||
|
### 2. Multiplexers (Mux)
|
||||||
|
Since the Pico doesn't have 19 ADC pins, we need multiplexers to switch between the HDMI pins.
|
||||||
|
- **CD74HC4067**: 16-channel analog multiplexer. We would need two of these to cover all 19 pins + GND checks.
|
||||||
|
|
||||||
|
### 3. Display
|
||||||
|
- **0.96" or 1.3" OLED (SSD1306/SH1106)**: Simple I2C connection, low power.
|
||||||
|
|
||||||
|
### 4. Input
|
||||||
|
- **Rotary Encoder with Push Button**: Ideal for switching between Intake and Tech modes.
|
||||||
|
|
||||||
|
### 5. HDMI Breakout
|
||||||
|
- A standard HDMI male/female breakout board to interface the pins to the Mux.
|
||||||
|
|
||||||
|
## Theory of Operation (Diode Mode)
|
||||||
|
1. Connect the Red probe (GND in Diode Mode) to the HDMI ground.
|
||||||
|
2. Connect the Black probe (Signal) to the data line.
|
||||||
|
3. The tester will simulate this by:
|
||||||
|
- Setting a pin to 3.3V through a precision resistor (e.g., 10k ohm).
|
||||||
|
- Measuring the voltage at the junction with the HDMI pin via the Mux.
|
||||||
|
- A healthy ESD diode or IC junction will show a specific voltage drop (typically 0.3V - 0.7V).
|
||||||
|
- Open circuit = ~3.3V.
|
||||||
|
- Short to GND = 0V.
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
1. Define the Pinout mapping.
|
||||||
|
2. Create the software structure (C++ or MicroPython).
|
||||||
|
3. Implement the measurement logic.
|
||||||
54
PINOUT.md
Normal file
54
PINOUT.md
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# HDMI Pinout Mapping
|
||||||
|
|
||||||
|
This document maps the 19 HDMI pins to the multiplexer channels.
|
||||||
|
|
||||||
|
## HDMI Type A Connector Pinout
|
||||||
|
1. TMDS Data2+
|
||||||
|
2. TMDS Data2 Shield
|
||||||
|
3. TMDS Data2-
|
||||||
|
4. TMDS Data1+
|
||||||
|
5. TMDS Data1 Shield
|
||||||
|
6. TMDS Data1-
|
||||||
|
7. TMDS Data0+
|
||||||
|
8. TMDS Data0 Shield
|
||||||
|
9. TMDS Data0-
|
||||||
|
10. TMDS Clock+
|
||||||
|
11. TMDS Clock Shield
|
||||||
|
12. TMDS Clock-
|
||||||
|
13. CEC
|
||||||
|
14. Reserved (HEAC+ in 1.4)
|
||||||
|
15. SCL (DDC)
|
||||||
|
16. SDA (DDC)
|
||||||
|
17. DDC/CEC Ground
|
||||||
|
18. +5V Power
|
||||||
|
19. Hot Plug Detect (HEAC- in 1.4)
|
||||||
|
|
||||||
|
## Multiplexer Mapping (2x CD74HC4067)
|
||||||
|
We use two 16-channel muxes.
|
||||||
|
|
||||||
|
### Mux A (High Speed Data)
|
||||||
|
- Channel 0: Pin 1 (Data2+)
|
||||||
|
- Channel 1: Pin 3 (Data2-)
|
||||||
|
- Channel 2: Pin 4 (Data1+)
|
||||||
|
- Channel 3: Pin 6 (Data1-)
|
||||||
|
- Channel 4: Pin 7 (Data0+)
|
||||||
|
- Channel 5: Pin 9 (Data0-)
|
||||||
|
- Channel 6: Pin 10 (Clock+)
|
||||||
|
- Channel 7: Pin 12 (Clock-)
|
||||||
|
|
||||||
|
### Mux B (Control & Power)
|
||||||
|
- Channel 0: Pin 13 (CEC)
|
||||||
|
- Channel 1: Pin 14 (Reserved/HEAC+)
|
||||||
|
- Channel 2: Pin 15 (SCL)
|
||||||
|
- Channel 3: Pin 16 (SDA)
|
||||||
|
- Channel 4: Pin 18 (+5V)
|
||||||
|
- Channel 5: Pin 19 (HPD)
|
||||||
|
|
||||||
|
## Expected Diode Mode Values (General Guide)
|
||||||
|
- TMDS Lines (1, 3, 4, 6, 7, 9, 10, 12): 0.3V - 0.7V
|
||||||
|
- DDC Lines (15, 16): 0.5V - 0.8V
|
||||||
|
- CEC (13): 0.6V - 0.9V
|
||||||
|
- +5V (18): Usually high or varies depending on console (check for shorts!)
|
||||||
|
- HPD (19): 0.6V - 0.9V
|
||||||
|
|
||||||
|
*Note: Shields (2, 5, 8, 11) and GND (17) should be tied to common ground for the measurement.*
|
||||||
40
UI_UX.md
Normal file
40
UI_UX.md
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# UI/UX Flow for HDMI Tester
|
||||||
|
|
||||||
|
The tester uses a 128x64 OLED and a Rotary Encoder.
|
||||||
|
|
||||||
|
## Boot Screen
|
||||||
|
- Display Logo: "HDMI Tester v1.0"
|
||||||
|
- Prompt: "Select Mode"
|
||||||
|
|
||||||
|
## Menu Navigation
|
||||||
|
- Rotate Encoder: Scroll between "INTAKE MODE" and "TECH MODE".
|
||||||
|
- Click Encoder: Confirm selection and start test.
|
||||||
|
|
||||||
|
## Intake Mode Screen (Result)
|
||||||
|
```
|
||||||
|
+---------------------+
|
||||||
|
| INTAKE RESULT |
|
||||||
|
| |
|
||||||
|
| [ FAIL ] |
|
||||||
|
| |
|
||||||
|
| Data1- is SHORTED |
|
||||||
|
| Check ESD Diodes |
|
||||||
|
+---------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tech Mode Screen (Scrolling List)
|
||||||
|
```
|
||||||
|
+---------------------+
|
||||||
|
| P1 Data2+ : 0.51V |
|
||||||
|
| P2 Shield : GND |
|
||||||
|
| P3 Data2- : 0.52V |
|
||||||
|
| P4 Data1+ : 0.50V |
|
||||||
|
| P6 Data1- : 0.02V* |
|
||||||
|
| P7 Data0+ : 0.51V |
|
||||||
|
+---------------------+
|
||||||
|
```
|
||||||
|
*(User can scroll down to see all 19 pins)*
|
||||||
|
|
||||||
|
## Fault Indicators
|
||||||
|
- **Asterisk (*)**: Indicates a value out of range.
|
||||||
|
- **Red/Blinking (if Color LCD)**: Highlights failures.
|
||||||
91
src/main.cpp
Normal file
91
src/main.cpp
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
// Mock classes for Pico/Hardware
|
||||||
|
class OLED {
|
||||||
|
public:
|
||||||
|
void clear() { std::cout << "[OLED] Clear Screen\n"; }
|
||||||
|
void print(std::string text) { std::cout << "[OLED] " << text << "\n"; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Measurement {
|
||||||
|
std::string pinName;
|
||||||
|
float voltage;
|
||||||
|
};
|
||||||
|
|
||||||
|
class HDMITester {
|
||||||
|
private:
|
||||||
|
OLED display;
|
||||||
|
bool techMode = false;
|
||||||
|
|
||||||
|
// Simplified thresholds
|
||||||
|
const float TMDS_MIN = 0.3;
|
||||||
|
const float TMDS_MAX = 0.7;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setMode(bool tech) { techMode = tech; }
|
||||||
|
|
||||||
|
std::vector<Measurement> runTests() {
|
||||||
|
// Simulate reading from ADCs via Muxes
|
||||||
|
return {
|
||||||
|
{"Data2+", 0.51}, {"Data2-", 0.52},
|
||||||
|
{"Data1+", 0.50}, {"Data1-", 0.02}, // Fault here
|
||||||
|
{"Data0+", 0.51}, {"Data0-", 0.51},
|
||||||
|
{"Clock+", 0.49}, {"Clock-", 0.49},
|
||||||
|
{"CEC", 0.65}, {"SCL", 0.70}, {"SDA", 0.71},
|
||||||
|
{"+5V", 1.20}, {"HPD", 0.66}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayIntake(const std::vector<Measurement>& results) {
|
||||||
|
display.clear();
|
||||||
|
bool pass = true;
|
||||||
|
std::string faultHint = "All lines nominal";
|
||||||
|
|
||||||
|
for (auto& m : results) {
|
||||||
|
if (m.voltage < 0.1) {
|
||||||
|
pass = false;
|
||||||
|
faultHint = "Short detected on " + m.pinName + ". Check ESD diodes.";
|
||||||
|
break;
|
||||||
|
} else if (m.voltage > 1.0 && m.pinName != "+5V") {
|
||||||
|
pass = false;
|
||||||
|
faultHint = "Open circuit on " + m.pinName + ". Check HDMI port solder joints.";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pass) {
|
||||||
|
display.print("STATUS: PASS");
|
||||||
|
display.print("Console ready for intake.");
|
||||||
|
} else {
|
||||||
|
display.print("STATUS: FAIL");
|
||||||
|
display.print("Hint: " + faultHint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayTech(const std::vector<Measurement>& results) {
|
||||||
|
display.clear();
|
||||||
|
display.print("--- TECH MODE ---");
|
||||||
|
for (auto& m : results) {
|
||||||
|
std::string status = (m.voltage < 0.1) ? " (SHORT)" : (m.voltage > 1.0 && m.pinName != "+5V") ? " (OPEN)" : " (OK)";
|
||||||
|
display.print(m.pinName + ": " + std::to_string(m.voltage).substr(0,4) + "V" + status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
HDMITester tester;
|
||||||
|
|
||||||
|
std::cout << "--- Simulating Intake Mode ---\n";
|
||||||
|
tester.setMode(false);
|
||||||
|
auto results = tester.runTests();
|
||||||
|
tester.displayIntake(results);
|
||||||
|
|
||||||
|
std::cout << "\n--- Simulating Tech Mode ---\n";
|
||||||
|
tester.setMode(true);
|
||||||
|
tester.displayTech(results);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
52
src/pico_tester.c
Normal file
52
src/pico_tester.c
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include "pico/stdlib.h"
|
||||||
|
#include "hardware/adc.h"
|
||||||
|
|
||||||
|
// Pin Definitions
|
||||||
|
#define MUX_S0 2
|
||||||
|
#define MUX_S1 3
|
||||||
|
#define MUX_S2 4
|
||||||
|
#define MUX_S3 5
|
||||||
|
#define ADC_PIN 26 // ADC0
|
||||||
|
|
||||||
|
void init_hardware() {
|
||||||
|
stdio_init_all();
|
||||||
|
|
||||||
|
// Init Mux Select Pins
|
||||||
|
gpio_init(MUX_S0); gpio_set_dir(MUX_S0, GPIO_OUT);
|
||||||
|
gpio_init(MUX_S1); gpio_set_dir(MUX_S1, GPIO_OUT);
|
||||||
|
gpio_init(MUX_S2); gpio_set_dir(MUX_S2, GPIO_OUT);
|
||||||
|
gpio_init(MUX_S3); gpio_set_dir(MUX_S3, GPIO_OUT);
|
||||||
|
|
||||||
|
// Init ADC
|
||||||
|
adc_init();
|
||||||
|
adc_gpio_init(ADC_PIN);
|
||||||
|
adc_select_input(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_mux(uint8_t channel) {
|
||||||
|
gpio_put(MUX_S0, channel & 0x01);
|
||||||
|
gpio_put(MUX_S1, (channel >> 1) & 0x01);
|
||||||
|
gpio_put(MUX_S2, (channel >> 2) & 0x01);
|
||||||
|
gpio_put(MUX_S3, (channel >> 3) & 0x01);
|
||||||
|
}
|
||||||
|
|
||||||
|
float read_voltage() {
|
||||||
|
uint16_t raw = adc_read();
|
||||||
|
return (raw * 3.3f) / 4095.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
init_hardware();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
printf("\n--- Starting HDMI Scan ---\n");
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
set_mux(i);
|
||||||
|
sleep_ms(10);
|
||||||
|
float v = read_voltage();
|
||||||
|
printf("Channel %d: %.2f V\n", i, v);
|
||||||
|
}
|
||||||
|
sleep_ms(5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user