Masalah Emulator Keyboard Arduino PS / 2

10

Ya, saya sudah mencari di forum Arduino.cc dan di sini. Ya, saya telah menemukan artikel tentang perpustakaan ps2dev. Ya, saya sudah membaca (oke, beberapa saya membaca skim) artikel antarmuka PS / 2 definitif di situs web ini . Ya, saya punya ini berfungsi, agak. Saya perlu beberapa ide untuk membuat lompatan agar berfungsi sepenuhnya. :)

Tidak, saya tidak bisa hanya meniru USB HID Keyboard dan membiarkannya - itu harus emulasi Keyboard PS / 2. Ya, saya mengirim sinyal make and break yang tepat - bahkan menangani kombinasi tombol yang sangat rumit. Seperti berdiri sekarang, saya memiliki kode yang ditulis untuk Arduino saya seperti yang diposting di bawah ini (secara teknis Freeduino 1.22), dan saya telah mengirim penekanan tombol melalui Serial Monitor atau terminal Putty, serta dengan pembungkus / driver Python berguna yang mengirimkan aktual Informasi scancode PS / 2 - dan umumnya membuat hidup saya lebih mudah - juga menghilangkan sebagian beban dari Arduino.

Saat ini, saya memiliki sketsa yang berjalan di Arduino yang mengemulasi Keyboard PS / 2. Secara alami, saya harus mem-boot mesin "target" saya (mesin yang memasukkan PS / 2 Plug), dan saya melihat "jabat tangan" berlangsung. Boot ke WinDoze, buka notepad, dan arahkan penekanan tombol ke layar (berhasil) menggunakan "driver" Python saya. (Pengemudi hanya berlangsung di terminal Serial Monitor / PutTY dan membaca / menulis ke port serial menggunakan modul yang disebut PySerial.) Ini semua dilakukan pada AMD di "target" motherboard ASUS.

Sekarang, tujuannya adalah untuk membuatnya bekerja pada Intel saya di "target" berbasis motherboard Intel, saya pasang, boot, dan tidak ada dadu. Jadi, saya memodifikasi sketsa sedikit untuk mencoba dan memberi diri saya kepala dari apa yang sebenarnya terjadi pada teman Ardy kecil saya. Versi setelah mod ditampilkan di bawah ini. Seperti yang saya pahami (kode "dipinjam" dari posting forum Arduino.cc lain, di sini ) Ini akan mencoba dan membuat koneksi dengan "target" lebih dari PS / 2 pertama, berkedip LED onboard pada 0,5 detik periode sampai koneksi dibuat. Target Intel tidak melewati 0,5 detik periode berkedip dan Koneksi Serial tidak pernah dibuat dengan "host".

Pertanyaan saya adalah ini: apakah ada perbedaan besar dalam cara keyboard ps / 2 membangun komunikasi dengan mesin target mereka? Apakah ini benar-benar perbedaan desain atau haruskah saya mencari sesuatu yang lebih mendasar yang menjadi masalah di sini? Saya pernah mendengar tentang perlunya resistor pull-up pada input data / jam, tetapi itu harus ditangani dalam kode, terutama karena itu BEKERJA pada target lain, hanya saja bukan yang saya butuhkan untuk dikerjakan.

Ada ide? Saya ingin mendapatkan ASAP ini berfungsi - Saya akan terus melakukan debug, setiap petunjuk atau saran akan sangat dihargai. Mereka semua akan diberi pertimbangan penuh karena saya perlu mata segar tentang masalah ini. Mungkin implementasi yang lebih baik di perpustakaan ps2dev diperlukan?

#include "ps2dev.h" // to emulate a PS/2 device

// Orange = 2
// Blue = 3
// Red = 5V (3 in)
// Black = GND (4 in)
// EXT Power, USB for COM only

PS2dev keyboard(3,2); // PS2dev object (2:data, 3:clock)
int enabled = 0; // pseudo variable for state of "keyboard"
boolean serialConnected = false;
int incomingByte = 0;

void ack() {
  //acknowledge commands
  while(keyboard.write(0xFA));
}

int kbdCmd(int command) {
  unsigned char val;
  switch (command) {
  case 0xFF: //reset
    ack();
    //the while loop lets us wait for the host to be ready
    while(keyboard.write(0xAA)!=0);
    break;
  case 0xFE: //resend
    ack();
    break;
  case 0xF6: //set defaults
    //enter stream mode
    ack();
    break;
  case 0xF5: //disable data reporting
    //FM
    enabled = 0;
    ack();
    break;
  case 0xF4: //enable data reporting
    //FM
    enabled = 1;
    ack();
    break;
  case 0xF3: //set typematic rate
    ack();
    keyboard.read(&val); //do nothing with the rate
    ack();
    break;
  case 0xF2: //get device id
    ack();
    keyboard.write(0xAB);
    keyboard.write(0x83);
    break;
  case 0xF0: //set scan code set
    ack();
    keyboard.read(&val); //do nothing with the rate
    ack();
    break;
  case 0xEE: //echo
    //ack();
    keyboard.write(0xEE);
    break;
  case 0xED: //set/reset LEDs
    ack();
    keyboard.read(&val); //do nothing with the rate
    ack();
    break;
  }
}

void connectHost() {
  while (Serial.available() <= 0) {
    Serial.print('A');   // send a capital A
    delay(300);
  }
}

void setup() {
  pinMode(13, OUTPUT);
  //establish serial connection with host
  Serial.begin(9600);
  // establish ps/2 connection with target
  while(keyboard.write(0xAA)!=0){
    digitalWrite(13, HIGH);
    delay(500); 
    digitalWrite(13, LOW);
    delay(500);
  }
  delay(100);  
  
  connectHost();
  Serial.println("\nSerial Host Connected");
  Serial.flush();
}

void loop() {
  unsigned char c;
  if( (digitalRead(3)==LOW) || (digitalRead(2) == LOW)) {
    if(digitalRead(3)==LOW){
      Serial.println("pin 3  is LOW");
    } else {
      Serial.println("pin 2 is LOW");
    }
    while(keyboard.read(&c));
    kbdCmd(c);
    Serial.print("Target: 0x");
    Serial.println(c, HEX);
  }  
  else {//if host device wants to send a command:
    //echo ASCII code from terminal and write to ps/2
    if(Serial.available() > 0) {
      incomingByte = Serial.read();
      keyboard.write(incomingByte);      
      Serial.print("Host: 0x");
      Serial.print(incomingByte, HEX);
      Serial.print(" ");
      Serial.print(incomingByte);
      Serial.print(" ");
      Serial.println(incomingByte, BIN);
    }
  }
}
chisaipete
sumber
Beberapa pertanyaan: "Sketsa" adalah Arduino-bahasa untuk "program"? Pengandar python ini tidak tergantung pada mesin target, bukan? Masalah Anda adalah bahwa ia bekerja pada satu mesin target dan bukan pada yang lain, kan? Apakah Anda mencoba mem-boot target yang tidak berfungsi dengan keyboard PS / 2 yang terpasang dan kemudian menukar itu dengan Arduino?
AndreKR
Ya, Sketsa == program dalam bahasa Ardu-bahasa. Saya mencoba ini dan sepertinya tidak berhasil (tapi saya perlu memodifikasi sketsa sehingga tidak menunggu ACK dari target sebelum mengirim karakter.) Saya akan memberi tahu Anda ketika saya mendapat kesempatan untuk mengujinya nanti hari ini.
chisaipete
Jadi, saya menguji program seperti yang Anda sarankan, dan berhasil! Pada akhirnya saya ingin dapat menyalakan siklus target dengan emulator keyboard yang diinstal dan dapat mengubah pengaturan BIOS dengan itu. Jadi, saya pikir jabat tangan start-off tidak aktif?
chisaipete
Ya mungkin. Apakah Anda melihat urutan inisialisasi di bagian paling bawah computer-engineering.org/ps2keyboard ? Saya akan mulai dengan membandingkan urutan saya dengan itu.
AndreKR
1
Maaf, saya telah membiarkan utas ini menjadi basi - Saya belum punya waktu untuk mencoba solusi AndreKR. Selain itu, saya tidak menggunakan resistor pullup, jadi sulit untuk menentukan yang ujungnya tidak memiliki resistor pullup :)
chisaipete

Jawaban:

5

Seperti yang saya mengerti, Anda menghubungkan Arduino Anda ke dua mesin target yang berbeda dan yang satu berfungsi dan yang lain tidak.

Jadi sepertinya ada perbedaan antara persyaratan inisialisasi kedua mesin. Pada halaman ini di bagian paling bawah ada daftar urutan inisialisasi yang mungkin. Mulailah dengan membandingkan inisialisasi Anda dengan yang itu.

Ini akan jauh lebih mudah dengan menggunakan penganalisa logika. Saya menggunakan Log Inport Intronix , tetapi ada yang lebih murah dan lebih baik, meskipun tidak pada saat yang sama.

Mengetuk bus kolektor terbuka agak rumit karena Anda tidak melihat perangkat mana yang berbicara. Namun, jika Anda memasukkan resistor seri di ujung di mana pullup tidak , Anda dapat mengetahui dari level tegangan perangkat mana yang menahan bus. Setiap bus kolektor terbuka (seperti PS / 2) membutuhkan resistor pullup, biasanya mereka dibangun di dalam PC. Anda dapat melihat level tegangan yang berbeda dengan mudah pada DSO. Dengan hanya LA Anda harus merekam dua kali dengan voltase ambang yang berbeda.

AndreKR
sumber
Keputusan siapa yang memberikan hadiah itu lebih sulit dari yang saya harapkan tetapi jawaban Anda mengumpulkan suara terbanyak dan saya sedikit lebih suka. Saya lebih suka hadiahi semua orang!
Kortuk
3

Mengingat bahwa proyek Anda bekerja dengan satu motherboard dan bukan yang lain, Anda tampaknya memiliki kasus klasik "kepatuhan sebagian spesifikasi" - dalam proyek Anda, dan mungkin bahkan di salah satu motherboard. Tetapi sebagian besar keyboard akan bekerja dengan motherboard apa pun, jadi implementasi yang kuat harus portabel. Tantangannya adalah Anda harus mencari tahu mengapa Anda tidak.

Anda mungkin dapat melakukan ini hanya dengan menatap masalah dan memikirkan bagaimana seharusnya bekerja (mungkin setelah istirahat - atau suatu hari jawabannya mengenai Anda di kamar mandi) tetapi Anda akan lebih efektif jika Anda dapat memantau apa yang sedang terjadi. Untuk masalah listrik yang berarti ruang lingkup, untuk yang protokol analisa logika. Ada beberapa opsi murah yang tersedia di area itu, misalnya papan "bus bajak laut" yang memiliki beberapa kemampuan khusus untuk keyboard keyboard atau sesuatu berbasiskan FPGA yang bisa memiliki buffer tangkapan yang lebih panjang (lihat sump.org).

Hal lain yang bisa Anda coba adalah menggunakan perangkat lain, baik mikrokontroler atau FPGA, untuk membangun host keyboard dan menggunakannya untuk menguji proyek Anda ke batas spesifikasi.

Chris Stratton
sumber
2

Saya belum melihat perpustakaan ps2dev untuk melihat persis bagaimana cara kerjanya, tetapi satu hal tidak melompat ke arah saya.

Saat ini satu upaya dilakukan untuk terhubung ke komputer "host". Ketika itu gagal, satu detik penuh menunggu (LED menyala 0,5s, LED mati 0,5s) sebelum upaya lain dilakukan.

Jika motherboard Intel tidak menunggu cukup lama untuk deteksi keyboard maka mungkin tidak pernah mendapatkan upaya koneksi sebelum melanjutkan urutan bootnya.

Jika Anda mengurangi waktu tunggu untuk mengatakan 0,1s (ubah keterlambatan (500) baris menjadi keterlambatan (50)) Anda mungkin beruntung.

Jika tidak, coba lebih cepat lagi. Sial, bahkan coba tanpa penundaan sama sekali dan lihat bagaimana hasilnya.

Majenko
sumber