Préampli - Affichage et contrôle (bas-niveau)

Date: 2016-05-14

Tags: DIY elec preamp reverse_engineering

J’avais récupéré un KVM qui avait quelques défauts (image bruitée sur certains canaux, clavier non-fonctionnel avec certains PC) et ne m’était pas utile. De ce fait, je n’ai gardé que le boîtier en acier et la face avant pour l’utiliser dans un projet de préampli.

KVM switch : reverse-engineering

Face avant

Il y a un PCB avec 2 latches 74HC273 et un latch 74HC374, 9 boutons poussoirs, 16 LEDs et un buzzer. Chaque groupe de boutons et de LEDs est relié à un latch, relié à un bus 8 bits. Le second bus sert au contrôle des latches, du buzzer et du switch de droite.

Pinouts

Control_bus :

Data_bus :

Interface bas-niveau

Pour commencer, j’ai utilisé un Arduino Mega en reliant le bus de données sur le port F ([A0..A7]), et le bus de contrôle au port K ([A8..A15]).

La fonction ledOut() permet d’allumer les LEDs vertes et rouges en fonction des variables ledG et ledR (uint8_t).

void ledOut(void) {
    //set bus out
    DDRF = 0xFF;
    // clear latches
    PORTK &= ~_CLR;
    ndelay();
    PORTK |= _CLR;
    // reset bus
    PORTF = 0x00;
    //write bit
    PORTF |= ledG;
    ndelay();
    //write CLK up
    PORTK |= CLKG; //1st row
    ndelay();
    //write CLK down
    PORTK &= ~CLKG;
    //reset bus
    PORTF &= ~ledG;

    //write bus
    PORTF |= ledR;
    ndelay();
    //write CLK up
    PORTK |= CLKR; //2nd row
    ndelay();
    //write CLK down
    PORTK &= ~CLKR;
    //reset bus
    PORTF &= ~ledR;
}

La fonction swIn() écrit l’état des interrupteurs dans les variables swstatus et oldswstatus.

void swIn(void) {
    // save old value
    oldswstatus = swstatus;
    //set bus in
    DDRF = 0x00;
    //write CLK (up)
    PORTK |= CLKS;
    ndelay();
    PORTK &= ~CLKS;
    ndelay();
    //write !OE
    PORTK &= ~_OE;
    ndelay();
    ndelay();
    ndelay();
    //read bus
    swstatus = ~PINF;
    //write OE
    PORTK |= _OE;
    //set bus out
    //DDRF = 0xFF;
    //Serial.print(swstatus);
}

Ici, la macro ndelay() est équivalente à un NOP, soit 1 cycle à 16MHz (62.5ns). Le latch 74HC374 est donné pour supporter un temps de transition de 45ns, en pratique, la transition entre !OE et les sorties donne quelques glitches lorsqu’on attend que 125ns, et le fonctionnement est correct avec une pause de 187.5ns (3 NOPs à la suite).

Références

Electronics Électronique puissance semiconducteur semiconductors power Hardware CPE INSA Xavier Bourgeois

Xavier B.