আরডুইনো পিএস / 2 কীবোর্ড এমুলেটর সমস্যা


10

হ্যাঁ, আমি আরডুইনো.সি. ফোরাম এবং এখানে অনুসন্ধান করেছি। হ্যাঁ, আমি পিএস 2 দেব গ্রন্থাগার সম্পর্কিত নিবন্ধগুলি পেয়েছি। হ্যাঁ, আমি এই ওয়েবসাইটটিতে চূড়ান্ত পিএস / 2 ইন্টারফেস নিবন্ধটি পড়েছি (ঠিক আছে, কেউ কেউ স্কিমেড করেছি) । হ্যাঁ, আমার এই কাজ হচ্ছে, দয়ালু। পুরোপুরি কাজ করার জন্য লিপ তৈরি করার জন্য আমার কিছু ধারণা দরকার। :)

না, আমি কেবল একটি ইউএসবি এইচডি কীবোর্ড অনুকরণ করতে পারি না এবং এটিকে রেখে দিতে পারি - এটি পিএস / 2 কীবোর্ড অনুকরণ হওয়া দরকার। হ্যাঁ, আমি যথাযথ মেক এবং ব্রেক সিগন্যাল প্রেরণ করছি - এটি এমনকি খুব জটিল কীস্ট্রোক সমন্বয় পরিচালনা করে। এখনই যেমন দাঁড়িয়ে আছে, আমার আর্দুইনোর জন্য নীচে পোস্ট করা কোড রয়েছে (প্রযুক্তিগতভাবে একটি ফ্রিডিনো 1.22), এবং আমি সিরিয়াল মনিটর বা পুটিটিওয়াই টার্মিনালের মাধ্যমে কীস্ট্রোকগুলি পাঠিয়েছি, পাশাপাশি হ্যান্ড পাইথন মোড়ক / ড্রাইভার সহ যা প্রকৃত প্রেরণ করে পিএস / 2 স্ক্যানকোড তথ্য - এবং সাধারণত আমার জীবনকে আরও সহজ করে তোলে - এছাড়াও আরডুইনো থেকে কিছুটা লোড নিয়ে।

এই মুহুর্তে, আমারে আরডুইনোতে একটি স্কেচ চলছে যা একটি PS / 2 কীবোর্ড অনুকরণ করে। স্বাভাবিকভাবেই, আমাকে আমার "টার্গেট" মেশিনটি বুট করতে হবে (মেশিন যে PS / 2 প্লাগটি যায়) এবং আমি "হ্যান্ডশেক" করতে দেখি। উইনডোজ থেকে বুট করুন, নোটপ্যাড খুলুন এবং আমার পাইথন "ড্রাইভার" ব্যবহার করে স্ক্রিনে (সফলভাবে) কীস্ট্রোক চালনা করুন drive (ড্রাইভারটি কেবল সিরিয়াল মনিটর / পিটিটিওয়াই টার্মিনালের জায়গা নেয় এবং পাইসারিয়াল নামক মডিউলটি ব্যবহার করে সিরিয়াল পোর্টে পড়ে / লেখেন)) এটি ASUS মাদারবোর্ডের "টার্গেট" এর একটি এএমডিতে করা হয়।

এখন, লক্ষ্যটি হ'ল এটি আমার ইন্টেলের সাথে ইনটেল মাদারবোর্ড ভিত্তিক "টার্গেট" ভিত্তিতে কাজ করবে, আমি এটি প্লাগ ইন করব, বুট করব এবং কোনও ডাইস নেই। সুতরাং, আমি আমার ছোট্ট আর্ডি বন্ধুর উপর আসলে কী চলছে তার একটি চেষ্টা করে দেখার জন্য আমি স্কেচটি কিছুটা সংশোধন করেছি। মোডগুলির পরে সংস্করণটি নীচে প্রদর্শিত হবে। যেহেতু আমি এটি বুঝতে পেরেছি (কোডটি অন্য আরডুইনো.সি.সি ফোরাম পোস্ট থেকে "ধার করা" হয়েছিল ) এখানে পিএস / 2 এর মাধ্যমে "টার্গেট" এর সাথে প্রথমে একটি সংযোগ স্থাপনের চেষ্টা করবে এবং অন ​​বোর্ডের নেতৃত্বে .5 সেকেন্ড সময়কালে এলইডি জ্বলজ্বল করবে সংযোগ স্থাপন করা হয়। ইন্টেল লক্ষ্যটি .5 সেকেন্ড পিরিয়ড ব্লিঙ্কগুলি অতিক্রম করে না এবং সিরিয়াল সংযোগটি "হোস্ট" দিয়ে কখনই প্রতিষ্ঠিত হয় না।

আমার প্রশ্নটি হ'ল পিএস / ২ কিবোর্ডগুলি তাদের টার্গেট মেশিনের সাথে যোগাযোগ স্থাপনের ক্ষেত্রে একটি বড় পার্থক্য রয়েছে? এটি কি আসলেই কোনও ডিজাইনের পার্থক্য বা আমার এখানে আরও সমস্যাযুক্ত আরও কিছু মৌলিক বিষয় সন্ধান করা উচিত? আমি ডেটা / ঘড়ির ইনপুটগুলিতে পুল-আপ রেজিস্টারগুলির প্রয়োজন সম্পর্কে কিছু শুনেছি, তবে কোডটিতে এটি হ্যান্ডেল করা উচিত, বিশেষত কারণ এটি অন্য লক্ষ্য নিয়ে কাজ করছে, কেবল এটির কাজ করা আমার প্রয়োজন নয়।

কোন ধারনা? আমি এই কাজটি 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);
    }
  }
}

কয়েকটি প্রশ্ন: "স্কেচ" "প্রোগ্রাম" এর জন্য আরডুইনো-লিংগো? এই অজগর ড্রাইভার স্টাফ লক্ষ্য মেশিনের থেকে স্বাধীন, তাই না? আপনার সমস্যাটি হ'ল এটি এক টার্গেট মেশিনে কাজ করে অন্যদিকে নয়, তাই না? আপনি কি পিএস / 2 কীবোর্ড সংযুক্ত করে অ-কর্মক্ষম লক্ষ্যটি বুট করার চেষ্টা করেছিলেন এবং তারপরে আরডুইনো দিয়ে অদলবদল করেছেন?
AndreKR

হ্যাঁ, স্ক্রিচ == প্রোগ্রামটি আরডু-লিঙ্গোতে। আমি এটি চেষ্টা করেছি এবং এটি কাজ করছে বলে মনে হচ্ছে না (তবে আমাকে স্কেচটি পরিবর্তন করতে হবে যাতে অক্ষরগুলি প্রেরণের আগে এটি লক্ষ্য থেকে ACKs এর জন্য অপেক্ষা না করে)) আমি যখন এটি পরীক্ষা করার সুযোগ পাব তখন আমি আপনাকে জানাব আজকেই তবে কিছু পরে.
চিসাইপেট

সুতরাং, আপনার প্রস্তাব অনুসারে আমি প্রোগ্রামটি পরীক্ষা করেছি এবং এটি কার্যকর! শেষ পর্যন্ত আমি কীবোর্ড এমুলেটর ইনস্টল করে টার্গেটটি পাওয়ার চক্র করতে সক্ষম হতে এবং এর সাথে BIOS সেটিংস পরিবর্তন করতে সক্ষম হতে চাই। তো, আমি ভাবছি স্টার্ট-আপ হ্যান্ডশেক বন্ধ আছে?
চিসাইপেট

হ্যাঁ সম্ভবত. আপনি কম্পিউটার -engineering.org/ps2 কিবোর্ডের একেবারে নীচে প্রাথমিককরণ ক্রমটি দেখেছেন ? আমি আমার ক্রমটি এর সাথে তুলনা করে শুরু করব।
AndreKR

1
দুঃখিত, আমি এই থ্রেডটি বাসি ছেড়ে দিয়েছি - আন্দ্রেকেআর এর সমাধানটি চেষ্টা করার আমার কাছে সময় নেই। তদতিরিক্ত, আমি পুলআপ প্রতিরোধক ব্যবহার করছি না, সুতরাং কোন প্রান্তে
পুলআপ

উত্তর:


5

আমি যেমন বুঝতে পেরেছি আপনি নিজের আরডুইনোকে দুটি ভিন্ন লক্ষ্য মেশিনের সাথে সংযুক্ত করেন এবং একটিতে এটি কাজ করে এবং অন্যদিকে এটি কার্যকর হয় না।

সুতরাং মনে হচ্ছে দুটি মেশিনের প্রারম্ভিককরণের প্রয়োজনীয়তার মধ্যে পার্থক্য রয়েছে। চালু এই পৃষ্ঠার খুব নীচে থাকা সেখানে একটি সম্ভাব্য আরম্ভের অনুক্রম একটি তালিকা করা হয়। আপনার আরম্ভের সাথে তুলনা করে শুরু করুন।

লজিক বিশ্লেষক ব্যবহার করে এটি অনেক সহজ হবে। আমি ব্যবহার করছি ইনট্রোনিক্স লজিকপোর্ট , তবে একই সাথে না হলেও সস্তা এবং আরও ভাল দুটি রয়েছে।

ওপেন-কালেক্টর বাসে ট্যাপ করা কিছুটা কষ্টকর কারণ আপনি দেখতে পাচ্ছেন না কোন ডিভাইসটি কথা বলছে। যাইহোক, আপনি যদি শেষদিকে সিরিজ প্রতিরোধক স্থাপন করেন যেখানে পুলআপটি নেই , আপনি ভোল্টেজের স্তরের মাধ্যমে বলতে পারবেন কোন ডিভাইসটি বাসটি চেপে ধরেছে। প্রতিটি ওপেন-কালেক্টর বাসের (পিএস / 2 এর মতো) পুলআপ প্রতিরোধকের প্রয়োজন, সাধারণত সেগুলি পিসিতে নির্মিত হয় are আপনি ডিএসওতে সহজেই বিভিন্ন ভোল্টেজের স্তর দেখতে পাবেন। কেবল একটি এলএ দিয়ে আপনাকে বিভিন্ন প্রান্তিক ভোল্টেজের সাথে দুবার রেকর্ড করতে হবে।


কাকে এই অনুগ্রহ দেওয়া হবে তার সিদ্ধান্তটি তখনই আমার প্রত্যাশা ছিল কিন্তু আপনার উত্তর সর্বাধিক ভোট পেয়েছে এবং আমি সামান্য পছন্দ করি। আমি সবাই পুরষ্কার পছন্দ হত!
কর্টুক

3

আপনার প্রকল্পটি একটি মাদারবোর্ডের সাথে কাজ করে এবং অন্যটি নয়, আপনার প্রকল্পে "আংশিক স্পেক কমপ্লায়েন্স" - আপনার প্রকল্পে এবং এমনকি মাদারবোর্ডগুলির মধ্যে একটিতেও ক্লাসিক কেস রয়েছে বলে মনে হচ্ছে। তবে বেশিরভাগ কীবোর্ডগুলি যে কোনও মাদারবোর্ডের সাথে কাজ করবে, সুতরাং একটি দৃ implementation় বাস্তবায়ন পোর্টেবল হতে হবে। চ্যালেঞ্জটি হ'ল আপনাকে কেন তা নয় তা নির্ধারণ করতে হবে।

আপনি কেবল সমস্যাটিকে লক্ষ্য করে এবং এটি কীভাবে কাজ করার কথা ভাবাচ্ছে তা নিয়েই এটি করতে সক্ষম হতে পারেন (সম্ভবত বিরতির পরে - বা একদিন উত্তরটি ঝরনার মধ্যে আপনাকে আঘাত করবে) তবে আপনি যদি নিরীক্ষণ করতে পারেন তবে আপনি আরও কার্যকর হবেন কি হচ্ছে. বৈদ্যুতিক সমস্যার জন্য যার অর্থ একটি সুযোগ, প্রোটোকলগুলির জন্য একটি যুক্তি বিশ্লেষক। সেই অঞ্চলে কিছু সস্তা বিকল্প রয়েছে, উদাহরণস্বরূপ "বাস পাইরেট" বোর্ডের কীবোর্ড প্রোটোকল বা এফপিজিএ ভিত্তিক এমন কিছু সুনির্দিষ্ট ক্ষমতা রয়েছে যা দীর্ঘ সময় ধরে ক্যাপচার বাফার করতে পারে (দেখুন স্যাম্প.org)।

আর একটি জিনিস যা আপনি চেষ্টা করতে পারেন তা হ'ল মাইক্রোকন্ট্রোলার বা একটি এফপিজিএ, অন্য একটি ডিভাইস ব্যবহার করে কীবোর্ড হোস্ট তৈরি করতে হবে এবং আপনার প্রকল্পটির নির্দিষ্টকরণের সীমাটি পরীক্ষা করতে এটি ব্যবহার করতে হবে।


2

এটি ঠিক কীভাবে কাজ করে তা দেখতে আমি পিএস 2 দেব গ্রন্থাগারের দিকে নজর দিইনি তবে একটি জিনিস আমার দিকে ঝাঁপিয়ে পড়ে।

এই মুহুর্তে "হোস্ট" কম্পিউটারের সাথে সংযোগ স্থাপনের জন্য একক প্রচেষ্টা করা হচ্ছে। যখন এটি ব্যর্থ হয়, পুরো চেষ্টা দ্বিতীয় অপেক্ষা করার আগে অপেক্ষা করা হয় (0.5s উপর LED, 0.5s থেকে LED)

যদি ইন্টেল মাদারবোর্ডটি কীবোর্ড সনাক্তকরণের জন্য যথেষ্ট দীর্ঘক্ষণ অপেক্ষা না করে তবে বুট ক্রমটি চালিয়ে যাওয়ার আগে এটি কখনও সংযোগের প্রচেষ্টা পাবে না।

আপনি যদি 0.1 সেকেন্ড বলার জন্য অপেক্ষার সময়টি হ্রাস করেন (দেরি (500) লাইনকে বিলম্বের জন্য পরিবর্তন করুন (50%) আপনার কিছু ভাগ্য হতে পারে।

যদি তা না হয় তবে আরও দ্রুত চেষ্টা করুন। জাহান্নাম, এমনকি কোনও বিলম্ব না করেও চেষ্টা করুন এবং দেখুন কীভাবে তা ঘটে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.