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);
}
}
}
Jawaban:
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.
sumber
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.
sumber
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.
sumber