Vâng, tôi đã tìm kiếm các diễn đàn Arduino.cc và ở đây. Có, tôi đã tìm thấy các bài viết liên quan đến thư viện ps2dev. Có, tôi đã đọc (được thôi, một số tôi đã đọc lướt qua) bài viết giao diện PS / 2 dứt khoát tại trang web này . Vâng, tôi có công việc này, kinda. Tôi cần một số ý tưởng để thực hiện bước nhảy vọt để làm việc đầy đủ. :)
Không, tôi không thể mô phỏng Bàn phím USB HID và để nó ở đó - nó cần phải được mô phỏng Bàn phím PS / 2. Có, tôi đang gửi tín hiệu ngắt và ngắt thích hợp - thậm chí nó còn xử lý các tổ hợp phím rất phức tạp. Hiện tại, tôi có mã được viết cho Arduino của mình như được đăng dưới đây (về mặt kỹ thuật là Freeduino 1.22) và tôi đã gửi tổ hợp phím thông qua thiết bị đầu cuối serial Monitor hoặc PuTTY, cũng như với trình điều khiển / trình bao bọc Python tiện dụng gửi thực tế Thông tin scancode PS / 2 - và nói chung làm cho cuộc sống của tôi dễ dàng hơn nhiều - cũng lấy một phần tải ra khỏi Arduino.
Ngay bây giờ, tôi có một bản phác thảo chạy trên Arduino mô phỏng Bàn phím PS / 2. Đương nhiên, tôi phải khởi động máy "mục tiêu" của mình (máy mà phích cắm PS / 2 đi vào) và tôi thấy "bắt tay" diễn ra. Khởi động lên WinDoze, mở notepad và điều khiển tổ hợp phím đến màn hình (thành công) bằng "trình điều khiển" Python của tôi. (Trình điều khiển chỉ đơn giản là thay thế thiết bị đầu cuối Màn hình nối tiếp / PuTTY và đọc / ghi vào cổng nối tiếp bằng mô-đun có tên PySerial.) Tất cả điều này được thực hiện trên "mục tiêu" của bo mạch chủ AMD.
Bây giờ, mục tiêu là làm cho nó hoạt động trên "mục tiêu" dựa trên bo mạch chủ Intel của tôi, tôi cắm nó vào, khởi động và không có xúc xắc. Vì vậy, tôi đã sửa đổi bản phác thảo một chút để thử và tự tìm hiểu về những gì thực sự xảy ra với người bạn Ardy bé nhỏ của mình. Phiên bản sau khi các mod được hiển thị dưới đây. Theo tôi hiểu (mã đã được "mượn" từ một bài đăng trên diễn đàn Arduino.cc khác, tại đây ) Nó sẽ thử và thiết lập kết nối với "mục tiêu" trên PS / 2 trước, nhấp nháy đèn LED trên bo mạch ở khoảng thời gian 0,5 giây cho đến khi kết nối được thiết lập. Mục tiêu Intel không vượt qua giai đoạn 0,5 giây nhấp nháy và Kết nối nối tiếp không bao giờ được thiết lập với "máy chủ".
Câu hỏi của tôi là: có sự khác biệt lớn trong cách bàn phím ps / 2 thiết lập giao tiếp với máy mục tiêu của họ không? Nó thực sự là một sự khác biệt trong thiết kế hay tôi nên tìm kiếm một cái gì đó cơ bản hơn đó là vấn đề ở đây? Tôi đã nghe một cái gì đó về việc cần các điện trở kéo lên trên các đầu vào dữ liệu / đồng hồ, nhưng điều đó nên được xử lý trong mã, đặc biệt là vì nó LÀM VIỆC trên một mục tiêu khác, không phải là mục tiêu tôi cần để làm việc.
Có ý kiến gì không? Tôi muốn làm việc này càng sớm càng tốt - Tôi sẽ tiếp tục gỡ lỗi, mọi gợi ý hoặc gợi ý sẽ được đánh giá cao. Tất cả họ sẽ được xem xét đầy đủ bởi vì tôi cần một đôi mắt mới về vấn đề này. Có lẽ thực hiện tốt hơn trong thư viện ps2dev là cần thiết?
#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);
}
}
}