हाँ, मैंने Arduino.cc मंचों और यहाँ खोजा है। हाँ, मैंने ps2dev लाइब्रेरी के बारे में लेख पाया है। हां, मैंने इस वेबसाइट पर निश्चित PS / 2 इंटरफ़ेस लेख (ठीक है, कुछ मैंने स्किम्ड) पढ़ा है । हां, मेरे पास यह काम है, थोड़े। मुझे पूरी तरह से काम करने के लिए छलांग लगाने के लिए कुछ विचारों की आवश्यकता है। :)
नहीं, मैं सिर्फ USB HID कीबोर्ड का अनुकरण नहीं कर सकता और इसे उस पर छोड़ सकता हूं - इसके लिए PS / 2 कीबोर्ड अनुकरण होना चाहिए। हां, मैं उचित मेक और ब्रेक सिग्नल भेज रहा हूं - यह बहुत जटिल कीस्ट्रोक संयोजनों को भी संभालता है। जैसा कि यह अभी खड़ा है, मेरे पास मेरे Arduino के लिए कोड लिखा है जैसा कि नीचे पोस्ट किया गया है (तकनीकी रूप से एक Freeduino 1.22), और मैंने सीरियल मॉनिटर या PuTTY टर्मिनल के माध्यम से कीस्ट्रोक्स भेजा है, साथ ही साथ एक आसान पाइपर रैपर / ड्राइवर जो वास्तविक भेजता है पीएस / 2 स्कैन्कोड जानकारी - और आम तौर पर मेरे जीवन को बहुत आसान बना देता है - अरुडिनो से कुछ लोड भी ले रहा है।
अभी, मेरे पास Arduino पर एक स्केच चल रहा है जो PS / 2 कीबोर्ड का अनुकरण करता है। स्वाभाविक रूप से, मुझे अपने "लक्ष्य" मशीन (पीएस / 2 प्लग में जाने वाली मशीन) को बूट करना होगा, और मुझे "हैंडशेक" जगह दिखाई देगी। WinDoze को बूट करें, नोटपैड खोलें, और मेरे पायथन "ड्राइवर" का उपयोग करके स्क्रीन पर (आगे की ओर) कीस्ट्रोक्स चलाएं। (ड्राइवर बस सीरियल मॉनिटर / PuTTY टर्मिनल की जगह लेता है और PySerial नामक मॉड्यूल का उपयोग करके सीरियल पोर्ट को पढ़ता / लिखता है।) यह सब ASUS मदरबोर्ड "लक्ष्य" में एक एएमडी पर किया जाता है।
अब, लक्ष्य यह है कि मैं अपने इंटेल पर इंटेल मदरबोर्ड आधारित "लक्ष्य" पर काम करूं, मैं इसे प्लग, बूट, और कोई पासा नहीं करता। इसलिए, मैंने स्केच को थोड़ा संशोधित करने की कोशिश की और अपने आप को सिर दे दिया कि वास्तव में मेरे छोटे दोस्त पर क्या चल रहा है। मॉड के बाद का संस्करण नीचे प्रदर्शित किया गया है। जैसा कि मैं इसे समझता हूं (कोड एक अन्य Arduino.cc फोरम पोस्ट से "उधार लिया गया था", यहां ) यह पीएस / 2 से पहले "लक्ष्य" के साथ एक कनेक्शन स्थापित करने और स्थापित करने की कोशिश करेगा। ऑनबोर्ड एलईडी को एक .5 सेकंड की अवधि तक ब्लिंक करना। कनेक्शन स्थापित है। Intel टारगेट .5 सेकंड पीरियड ब्लिंक से अतीत में नहीं मिलता है और "होस्ट" के साथ सीरियल कनेक्शन कभी स्थापित नहीं होता है।
मेरा सवाल यह है: क्या ps / 2 कीबोर्ड जिस तरह से अपने लक्ष्य मशीन के साथ संचार स्थापित करते हैं, उसमें एक बड़ा अंतर है? क्या यह वास्तव में एक डिज़ाइन अंतर है या मुझे इस मुद्दे पर कुछ और बुनियादी तलाश करनी चाहिए? मैंने डेटा / क्लॉक इनपुट पर पुल-अप रेसिस्टर्स की आवश्यकता के बारे में कुछ सुना है, लेकिन इसे कोड में संभाला जाना चाहिए, खासकर क्योंकि यह दूसरे लक्ष्य पर काम कर रहा है, बस मुझे काम करने की आवश्यकता नहीं है।
कोई विचार? मुझे यह काम करना पसंद है ASAP - मैं डिबग करने जा रहा हूं, किसी भी संकेत या सुझाव की बहुत सराहना की जाएगी। इन सभी पर पूरा ध्यान दिया जाएगा क्योंकि मुझे इस मुद्दे पर कुछ नए सिरे से सोचने की जरूरत है। शायद ps2dev लाइब्रेरी में बेहतर कार्यान्वयन की आवश्यकता है?
#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);
}
}
}