Các vấn đề giả lập bàn phím Arduino PS / 2


10

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);
    }
  }
}

Một vài câu hỏi: "Phác thảo" là Arduino-lingo cho "chương trình"? Công cụ điều khiển python này là độc lập với máy mục tiêu, phải không? Vấn đề của bạn là nó hoạt động trên một máy mục tiêu chứ không phải trên máy khác, phải không? Bạn đã thử khởi động mục tiêu không hoạt động với bàn phím PS / 2 được gắn vào và sau đó trao đổi mục tiêu đó với Arduino?
AndreKR

Có, Phác thảo == chương trình trong Ardu-lingo. Tôi đã thử cách này và nó dường như không hoạt động (nhưng tôi cần sửa đổi bản phác thảo để nó không đợi ACK từ mục tiêu trước khi gửi ký tự.) Tôi sẽ cho bạn biết khi tôi có cơ hội kiểm tra nó sau ngày hôm nay.
chisaipete

Vì vậy, tôi đã thử nghiệm chương trình như bạn đề xuất, và nó hoạt động! Cuối cùng, tôi muốn có thể cấp nguồn cho mục tiêu với trình giả lập bàn phím được cài đặt và có thể thay đổi cài đặt BIOS với nó. Vì vậy, tôi nghĩ rằng bắt tay khởi động là tắt?
chisaipete

Vâng, có lẽ. Bạn có thấy trình tự khởi tạo ở dưới cùng của máy tính-engineering.org / ps2keyboard không? Tôi sẽ bắt đầu bằng cách so sánh trình tự của tôi với điều đó.
AndreKR

1
Xin lỗi, tôi đã để chủ đề này trở nên cũ kỹ - Tôi chưa có thời gian để thử giải pháp của AndreKR. Bên cạnh đó, tôi không sử dụng điện trở pullup, vì vậy rất khó để xác định đầu nào không có điện trở pullup :)
chisaipete

Câu trả lời:


5

Theo tôi hiểu, bạn kết nối Arduino của bạn với hai máy mục tiêu khác nhau và trên một máy hoạt động và trên máy kia thì không.

Vì vậy, có vẻ như có một sự khác biệt giữa các yêu cầu khởi tạo của hai máy. Trên trang này ở dưới cùng có một danh sách các trình tự khởi tạo có thể. Bắt đầu bằng cách so sánh khởi tạo của bạn với cái đó.

Nó sẽ dễ dàng hơn rất nhiều bằng cách sử dụng một bộ phân tích logic. Tôi đang sử dụng Intronix Logicport , nhưng có cả những cái rẻ hơn và tốt hơn, mặc dù không phải cùng một lúc.

Chạm vào một chiếc xe buýt thu gom mở sẽ hơi cồng kềnh vì bạn không thấy thiết bị nào đang nói. Tuy nhiên, nếu bạn đặt trong một loạt điện trở ở cuối nơi pullup là không , bạn có thể biết được mức điện áp mà thiết bị đang nắm giữ xuống xe buýt. Mỗi bus thu gom mở (như PS / 2) đều cần điện trở pullup, thông thường chúng được tích hợp trong PC. Bạn có thể thấy các mức điện áp khác nhau một cách dễ dàng trên DSO. Chỉ với một LA bạn phải ghi hai lần với các điện áp ngưỡng khác nhau.


Quyết định của ai là người đưa tiền thưởng khó hơn tôi mong đợi nhưng câu trả lời của bạn đã thu được nhiều phiếu nhất và tôi hơi thích. Tôi sẽ thích phần thưởng cho tất cả mọi người!
Kortuk

3

Cho rằng dự án của bạn hoạt động với một bo mạch chủ chứ không phải một bo mạch chủ khác, bạn dường như có một trường hợp kinh điển về "tuân thủ thông số kỹ thuật một phần" - trong dự án của bạn và thậm chí có thể ở một trong các bo mạch chủ. Nhưng hầu hết các bàn phím sẽ hoạt động với bất kỳ bo mạch chủ nào, vì vậy một triển khai mạnh mẽ nên có thể mang theo được. Thách thức là bạn sẽ phải tìm ra lý do tại sao không phải là của bạn.

Bạn có thể làm điều này bằng cách chỉ nhìn chằm chằm vào vấn đề và suy nghĩ về cách thức hoạt động của nó (có lẽ sau khi nghỉ ngơi - hoặc một ngày nào đó câu trả lời đánh bạn khi tắm) nhưng bạn sẽ hiệu quả hơn nếu bạn có thể theo dõi chuyện gì đang xảy ra Đối với các sự cố điện có nghĩa là một phạm vi, đối với các giao thức, một bộ phân tích logic. Có một số tùy chọn giá rẻ có sẵn trong khu vực đó, ví dụ: bảng "cướp biển xe buýt" có một số khả năng cụ thể cho giao thức bàn phím hoặc một cái gì đó dựa trên nền tảng đồ họa có thể có bộ đệm chụp lâu hơn (xem sump.org).

Một điều khác mà bạn có thể thử là sử dụng một thiết bị khác, hoặc là vi điều khiển hoặc một đồ họa, để xây dựng một máy chủ bàn phím và sử dụng nó để kiểm tra dự án của bạn theo các giới hạn của đặc tả.


2

Tôi đã không nhìn vào thư viện ps2dev để xem chính xác nó hoạt động như thế nào, nhưng có một thứ nhảy ra khỏi tôi.

Tại thời điểm này, một nỗ lực duy nhất được thực hiện để kết nối với máy tính "máy chủ". Khi thất bại, toàn bộ giây được chờ (LED trên 0,5 giây, LED tắt 0,5 giây) trước khi thực hiện một nỗ lực khác.

Nếu bo mạch chủ Intel không chờ đủ lâu để phát hiện bàn phím thì có thể nó sẽ không bao giờ được thử kết nối trước khi tiếp tục trình tự khởi động.

Nếu bạn giảm thời gian chờ để nói 0,1 giây (thay đổi dòng trễ (500) thành trễ (50)), bạn có thể gặp may mắn.

Nếu không, hãy thử nhanh hơn nữa. Địa ngục, thậm chí thử nó không chậm trễ chút nào và xem điều đó diễn ra như thế nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.