MCU som sänder F1 till bråkig server vid boot

Berätta om dina pågående projekt.
Användarvisningsbild
KLset
Inlägg: 207
Blev medlem: 31 augusti 2014, 17:36:19
Ort: Uppsala

MCU som sänder F1 till bråkig server vid boot

Inlägg av KLset »

Jag har en HP-server som inte vill boota förrän man trycker F1. Det är på grund av att en komponent är bortmonterad som satt där ursprungligen. Tyvärr går det inte att avaktivera det där kravet på att trycka F1 i BIOS.

Nu vill jag ju kunna starta om den utan att behöva vara där och trycka F1, så jag satte ihop en Arduino Mini Pro till att göra jobbet åt mig.

Den ansluter till datorn genom en mini DIN 6-pin (PS/2). Jag bara startar (eller startar om datorn), och så väntar Arduinon tio sekunder, blinkar lite, och sänder sedan F1. Fattas bara lite genomskinlig krympslang runt paketet för att snygga till det lite. Någon som vet var man får tag i det i lämplig storlek?

Jag trodde jag skulle behöva lära mig PS/2-protokollet och skriva en ISR, men det finns ett bibliotek "ps2dev" som går att ladda ned direkt från Arduino IDE:n. Se koden längst ner i inlägget.

Ett lagom helgprojekt. :)
front.jpg
back.jpg

Kod: Markera allt

#include <ps2dev.h>
#include <avr/sleep.h>

PS2dev keyboard(3, 2);  /* clock, data */

void setup()
{
  keyboard.keyboard_init();
  pinMode(LED_BUILTIN, OUTPUT);
  delay(1000 * 10);  /* wait 10 seconds */
}


void loop()
{

  /* blink LED before sending F1 */
  int blinks = 0;
  while (blinks++ < 3) {
    delay(200);
    digitalWrite(LED_BUILTIN, HIGH);
    delay(50);
    digitalWrite(LED_BUILTIN, LOW);
  }

  keyboard.write(keyboard.F1);

  cli();
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_cpu();
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
ecenier
Inlägg: 1105
Blev medlem: 13 december 2007, 17:51:42
Ort: Älvsjö
Kontakt:

Re: MCU som sänder F1 till bråkig server vid boot

Inlägg av ecenier »

:D
Kul!
Tack för att du delar med dig.
Användarvisningsbild
Electricguy
Inlägg: 12304
Blev medlem: 15 augusti 2007, 16:52:14
Ort: Kälmä' typ..

Re: MCU som sänder F1 till bråkig server vid boot

Inlägg av Electricguy »

Hmm, klurigt! Att jag inte har tänkt på den lösningen själv.. Jag leker en del med antika Compaq servrar, och dom är inte direkt gjorda för att boota helt utan handpåläggning, och även där ska man trycka på F1 för att boota operativsystemet. Ska nog ta och sno ihop några såna små rackare och stoppa in i baken på dom :D :tumupp:
Användarvisningsbild
Glenn
Inlägg: 33771
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: MCU som sänder F1 till bråkig server vid boot

Inlägg av Glenn »

Alltså, ens erver som inte kan boota utan handpåläggning är per definition trasig IMHO.

..Vilket ju också TS server var :)
guckrum
Inlägg: 1686
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: MCU som sänder F1 till bråkig server vid boot

Inlägg av guckrum »

Va? Det tar ju "en kvart" att få upp sin server. Tur det finns UPS! :)
Användarvisningsbild
KLset
Inlägg: 207
Blev medlem: 31 augusti 2014, 17:36:19
Ort: Uppsala

Re: MCU som sänder F1 till bråkig server vid boot

Inlägg av KLset »

En uppdatering: Jag hade visst glömt att Arduinon också måste skicka F1 då datorn startas om. Datorn kopplar inte av spänningen på PS/2-porten, så Arduinon förblir påslagen, och då fungerar inte programmet jag visade i första inlägget.

Jag kan inte hitta i PS/2-protokollet att datorn signalerar något i form av "datorn startas/startas om" till tangentbordet, så om man vill få det att fungera konsekvent med många datorer verkar det krävas att man detekterar någon speciell kommandosekvens. Men som tur är kan jag ändra i BIOS så att tangentbordskontrollern skickar 0x02 till tangentbordet vid start/omstart, vilket är att be det att sätta på Num Lock. Det händer inte igen så länge datorn är på, så jag har bestämt att det blir signalen till Arduinon att datorn startas/startas om.

Notera att man måste skicka ett "ack" tillbaka till tangentbordskontrollern för att den ska tro att det finns ett tangentbord där på andra sidan. För vissa kommandon förväntar sig kontrollern att tangentbordet ska skicka tillbaka data, och inte bara skicka "ack", men det funkar.

Kod: Markera allt

#include <ps2dev.h>

PS2dev keyboard(3, 2);  /* clock, data */
unsigned char cmd;
int blinks;

void setup()
{
  keyboard.keyboard_init();
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  while (keyboard.read(&cmd)) ;

  switch (cmd) {
    case 0x02:                       /* host: turn on num lock */
      while(keyboard.write(0xFA)) ;  /* ack */
      delay(4000);                   /* wait for F1 prompt */
  
      blinks = 0;                    /* blink LED before sending F1 */
      while (blinks++ < 5) {
        delay(200);
        digitalWrite(LED_BUILTIN, HIGH);
        delay(50);
        digitalWrite(LED_BUILTIN, LOW);
      }

      while(keyboard.write(keyboard.F1)) ;
      break;

    default:
      while(keyboard.write(0xFA)) ;  /* ack */
      break;
  }
}
Skriv svar