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);
}
}
}