Arduino PS / 2 कीबोर्ड एमुलेटर मुद्दे


10

हाँ, मैंने 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);
    }
  }
}

कुछ सवाल: "स्केच" "कार्यक्रम" के लिए अरुडिनो-लिंगो है? यह अजगर चालक सामान लक्ष्य मशीन से स्वतंत्र है, है ना? आपकी समस्या यह है कि यह एक लक्ष्य मशीन पर काम करता है और दूसरे पर नहीं, है ना? क्या आपने गैर-कार्यशील लक्ष्य को PS / 2 कीबोर्ड के साथ जोड़ने की कोशिश की और फिर Arduino के साथ स्वैप किया?
आंद्रेकेआर

हाँ, अर्कू-लिंगो में स्केच == कार्यक्रम। मैंने यह कोशिश की और यह काम करने के लिए प्रतीत नहीं हुआ (लेकिन मुझे स्केच को संशोधित करने की आवश्यकता है ताकि यह पात्रों को भेजने से पहले लक्ष्य से ACKs की प्रतीक्षा न करें।) मैं आपको बता दूंगा कि मुझे इसका परीक्षण करने का मौका कब मिलेगा। बाद में आज।
चिसिपिटे

इसलिए, मैंने आपके सुझाव के अनुसार कार्यक्रम का परीक्षण किया, और यह काम करता है! अंत में मैं कीबोर्ड एमुलेटर स्थापित करने के साथ लक्ष्य को पावर साइकिल करने में सक्षम होना चाहता हूं और इसके साथ BIOS सेटिंग्स को बदलने में सक्षम हो सकता हूं। तो, मैं सोच रहा हूं कि स्टार्ट-अप हैंडशेक ऑफ है?
चिसिपिटे

हां शायद। क्या आपने कंप्यूटर- पेंटरिंग ऑर्ग / ओ 2 एसबोर्ड पर बहुत ही प्रारंभिक अनुक्रम देखा था ? मैं अपने अनुक्रम की तुलना करके शुरू करूँगा।
आंद्रेकेआर

1
क्षमा करें, मैंने इस धागे को बासी होने दिया है - मेरे पास आंद्रेकेआर के समाधान की कोशिश करने का समय नहीं है। इसके अलावा, मैं पुलअप
रेसिस्टर्स

जवाबों:


5

जैसा कि मैं समझता हूं, आप अपने Arduino को दो अलग-अलग लक्ष्य मशीनों से जोड़ते हैं और एक पर यह काम करता है और दूसरे पर नहीं।

तो ऐसा लगता है कि दो मशीनों की प्रारंभिक आवश्यकताओं के बीच अंतर है। पर यह पेज निचले भाग पर वहाँ एक संभव प्रारंभ अनुक्रम की एक सूची है। अपने आरंभ को उस एक से तुलना करके शुरू करें।

लॉजिक एनालाइजर का इस्तेमाल करके यह काफी आसान हो जाएगा। मैं इंट्रोनिक्स लॉजिकपोर्ट का उपयोग कर रहा हूं , लेकिन दोनों सस्ता और बेहतर हैं, हालांकि एक ही समय में नहीं।

ओपन-कलेक्टर बस में टैप करना थोड़ा बोझिल है क्योंकि आप यह नहीं देखते हैं कि कौन सी डिवाइस बात कर रही है। हालांकि, यदि आप अंत में एक श्रृंखला रोकनेवाला में डालते हैं जहां पुलअप नहीं है , तो आप वोल्टेज स्तर से बता सकते हैं कि कौन सा उपकरण बस को पकड़े हुए है। प्रत्येक ओपन-कलेक्टर बस (जैसे पीएस / 2) को पुलअप प्रतिरोधों की आवश्यकता होती है, आमतौर पर वे पीसी में निर्मित होते हैं। आप एक DSO पर विभिन्न वोल्टेज स्तर आसानी से देख सकते हैं। केवल एक ला के साथ आपको दो बार अलग-अलग थ्रेशोल्ड वोल्टेज के साथ रिकॉर्ड करना होगा।


बाउंटी किसे देना है, इसका फैसला तब कठिन था, लेकिन मुझे उम्मीद थी कि आपके जवाब ने सबसे ज्यादा वोट बटोरे और मुझे थोड़ा पसंद आया। मैं सभी को इनाम देना पसंद करता!
13

3

यह देखते हुए कि आपकी परियोजना एक मदरबोर्ड के साथ काम करती है और दूसरी नहीं, आपको लगता है कि आपके प्रोजेक्ट में "आंशिक कल्पना अनुपालन" का एक क्लासिक मामला है, और शायद मदरबोर्ड में से एक में भी। लेकिन अधिकांश कीबोर्ड किसी भी मदरबोर्ड के साथ काम करेंगे, इसलिए एक मजबूत कार्यान्वयन पोर्टेबल होना चाहिए। चुनौती यह है कि आप यह पता लगाने जा रहे हैं कि आपका क्यों नहीं है।

आप इसे केवल समस्या को देखते हुए और यह सोचकर कर सकते हैं कि यह कैसे काम करने वाला है (शायद एक ब्रेक के बाद - या एक दिन जवाब आपको शॉवर में मारता है) लेकिन आप निगरानी कर सकते हैं तो आप अधिक प्रभावी होंगे। क्या हो रहा है। बिजली के मुद्दों के लिए जो एक गुंजाइश का मतलब है, प्रोटोकॉल के लिए एक तर्क विश्लेषक। उस क्षेत्र में कुछ सस्ते विकल्प उपलब्ध हैं, उदाहरण के लिए "बस समुद्री डाकू" बोर्ड जिसमें कीबोर्ड प्रोटोकॉल या कुछ FPGA- आधारित के लिए कुछ विशिष्ट क्षमता है जो एक लंबे समय तक कैप्चर बफर हो सकता है (देखें sump.org)।

एक और चीज जो आप कोशिश कर सकते हैं, वह एक अन्य उपकरण का उपयोग करना होगा, या तो एक माइक्रोकंट्रोलर या एक एफपीजीए, एक कीबोर्ड होस्ट बनाने के लिए और विनिर्देश की सीमा के लिए अपनी परियोजना का परीक्षण करने के लिए उपयोग करना।


2

मैंने ps2dev पुस्तकालय को देखने के लिए बिल्कुल नहीं देखा कि यह कैसे काम करता है, लेकिन एक चीज मेरे बारे में बताती है।

फिलहाल "होस्ट" कंप्यूटर से कनेक्ट करने का एक ही प्रयास किया जाता है। जब वह विफल हो जाता है, तो एक दूसरे प्रयास से पहले प्रतीक्षा की जाती है (0.5s पर एलईडी, 0.5 से एलईडी बंद)।

यदि इंटेल मदरबोर्ड कीबोर्ड डिटेक्शन के लिए लंबे समय तक इंतजार नहीं कर रहा है, तो हो सकता है कि इसे अपने बूट अनुक्रम को जारी रखने से पहले कनेक्शन का प्रयास कभी न हो।

यदि आप 0.1s (देरी (500) लाइनों को विलंब करने के लिए (50)) कहने के लिए प्रतीक्षा समय कम करते हैं, तो आपके पास कुछ भाग्य हो सकता है।

यदि नहीं, तो और भी तेज़ प्रयास करें। नरक, यहां तक ​​कि बिना किसी देरी के इसे आज़माएं और देखें कि यह कैसे जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.