是的,我已经搜索了Arduino.cc论坛和此处。是的,我找到了有关ps2dev库的文章。是的,我已经在该网站上阅读了(好的,我略读了一些)权威的PS / 2接口文章。是的,我有这个工作。我需要一些想法来实现全面工作的飞跃。:)
不,我不能只是仿真USB HID键盘而已-它需要是PS / 2键盘仿真。是的,我正在发送适当的接通和断开信号-它甚至可以处理非常复杂的按键组合。就目前而言,我已经为我的Arduino编写了如下代码(技术上是Freeduino 1.22),并且我已经通过Serial Monitor或PuTTY终端发送了击键,并且使用了方便的Python包装器/驱动器来发送实际的PS / 2扫描码信息-通常会使我的生活变得更轻松-也减轻了Arduino的负担。
现在,我在Arduino上运行了一个模拟PS / 2键盘的草图。自然,我必须启动“目标”计算机(PS / 2 Plug进入的计算机),然后看到“握手”发生。引导至WinDoze,打开记事本,然后使用我的Python“驱动程序”将键击成功驱动到屏幕。(驱动程序只是代替了Serial Monitor / PuTTY终端,并使用称为PySerial的模块读取/写入串行端口。)所有这些操作均在ASUS主板“目标”中的AMD上完成。
现在,目标是使其在基于英特尔母板的“目标”上的英特尔处理器上运行,我将其插入,启动并且没有骰子。因此,我对草图进行了一些修改,以尝试使自己了解我的小阿迪朋友的实际情况。mods之后的版本如下所示。据我了解(代码是从另一个Arduino.cc论坛帖子“借来的”,此处)它将首先尝试通过PS / 2与“目标”建立连接,并在.5秒内闪烁板载LED,直到建立连接。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);
}
}
}