ใช่ฉันได้ค้นหาฟอรัม Arduino.cc แล้วและที่นี่ ใช่ฉันได้พบบทความเกี่ยวกับห้องสมุด ps2dev แล้ว ใช่ฉันอ่านแล้ว (ได้บ้างฉันอ่านบางส่วน) บทความอินเตอร์เฟซ PS / 2 ที่ชัดเจนที่เว็บไซต์นี้ ใช่ฉันทำงานได้แล้ว ฉันต้องการความคิดบางอย่างเพื่อทำให้การก้าวกระโดดทำงานได้อย่างเต็มที่ :)
ไม่ฉันไม่สามารถจำลอง USB HID Keyboard และปล่อยให้เป็นแบบนั้นได้มันต้องเป็นแบบจำลอง PS / 2 Keyboard ใช่ฉันกำลังส่งสัญญาณยี่ห้อและตัวแบ่งสัญญาณที่เหมาะสม - มันจัดการกับชุดแป้นพิมพ์ที่ซับซ้อนมาก ตามที่เป็นอยู่ตอนนี้ฉันมีโค้ดที่เขียนขึ้นสำหรับ Arduino ของฉันตามที่โพสต์ด้านล่าง (ในทางเทคนิคคือ Freeduino 1.22) และฉันได้ส่งการกดแป้นผ่านทาง Serial Monitor หรือเทอร์มินัล PuTTY เช่นเดียวกับ ข้อมูลการสแกน PS / 2 - และโดยทั่วไปทำให้ชีวิตของฉันง่ายขึ้นมาก - รวมถึงการโหลดบางอย่างออกจาก Arduino
ตอนนี้ฉันมีร่างที่ทำงานบน Arduino ซึ่งเลียนแบบแป้น PS / 2 โดยธรรมชาติฉันต้องบูตเครื่อง "เป้าหมาย" ของฉัน (เครื่องที่เสียบ PS / 2 เข้าไป) และฉันเห็น "การจับมือกัน" เกิดขึ้น Boot to WinDoze, เปิด notepad, และกดแป้นไดรฟ์ไปที่หน้าจอ (สำเร็จ) โดยใช้ Python "ไดร์เวอร์" ของฉัน (ไดรเวอร์นั้นใช้แทน Terminal Monitor / PuTTY และอ่าน / เขียนไปยังพอร์ตอนุกรมโดยใช้โมดูลที่เรียกว่า PySerial) ทั้งหมดนี้ทำบน AMD ใน "เป้าหมาย" ของเมนบอร์ด ASUS
ตอนนี้เป้าหมายคือให้มันทำงานกับ Intel ในเมนบอร์ดมาเธอร์บอร์ดตาม "เป้าหมาย" ของฉันฉันเสียบมันบูตและไม่มีลูกเต๋า ดังนั้นฉันจึงปรับเปลี่ยนภาพร่างเล็กน้อยเพื่อลองและให้ตัวเองดูว่าเกิดอะไรขึ้นกับเพื่อน Ardy ตัวน้อยของฉัน เวอร์ชั่นหลังจากตัวดัดแปลงแสดงขึ้นด้านล่าง ตามที่ฉันเข้าใจ (โค้ดคือ "ยืม" จากโพสต์ฟอรัม Arduino.cc อีกตัวที่นี่ ) มันจะพยายามสร้างการเชื่อมต่อกับ "เป้าหมาย" บน PS / 2 ก่อนจากนั้นจึงกะพริบ LED ออนบอร์ดที่ระยะเวลา 0.5 วินาที สร้างการเชื่อมต่อแล้ว เป้าหมายของ Intel จะไม่ผ่านช่วงเวลา. 5 วินาทีที่กระพริบและการเชื่อมต่อแบบอนุกรมไม่เคยถูกสร้างขึ้นด้วย "โฮสต์"
คำถามของฉันคือ: มีความแตกต่างที่สำคัญในวิธีที่แป้นพิมพ์ ps / 2 สร้างการสื่อสารกับเครื่องเป้าหมายหรือไม่? มันเป็นความแตกต่างของการออกแบบจริงๆหรือฉันควรจะมองหาบางสิ่งพื้นฐานที่เป็นปัญหาที่นี่หรือ ฉันได้ยินบางสิ่งบางอย่างเกี่ยวกับการต้องการตัวต้านทานแบบดึงขึ้นบนอินพุต / นาฬิกา แต่ควรจัดการในรหัสโดยเฉพาะอย่างยิ่งเนื่องจากมันทำงานบนเป้าหมายอื่นไม่ใช่แค่ที่ฉันต้องการใช้งาน
ความคิดใด ๆ ฉันชอบที่จะใช้การทำงานนี้โดยเร็ว - ฉันจะทำการดีบักต่อไปพอยน์เตอร์หรือคำแนะนำใด ๆ จะได้รับการชื่นชมอย่างมาก พวกเขาทั้งหมดจะได้รับการพิจารณาอย่างเต็มที่เพราะฉันต้องการตาใหม่ ๆ ในเรื่องนี้ อาจจำเป็นต้องใช้การทำงานที่ดีขึ้นในไลบรารี 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);
}
}
}