BBS水木清华站∶精华区
发信人: Keyboy (峰清扬), 信区: Linux
标 题: 2.2.x核心中PS改制手柄驱动的BUG
发信站: BBS 水木清华站 (Fri Sep 29 14:41:13 2000)
偶觉得PS改到并口的手柄是偶能找到的最价廉物美的外设,十来块一个,用坏
掉也不心痛//grin
这两天在准备给PS改制手柄写win2000的WDM驱动(DirectPadPro不支持NT),到
处找资料,发现原来2.2.16的核心里已经有了类似ddpro的各类改制手柄驱动。
以前版本的核心有没有不清楚。
这两天研究了一下PS手柄的接口资料,发现内核中驱动PS手柄的部分有点问题。
先抄一段PS手柄接口的时序图:
____
SEL- |_________________________________________________
______ _ _ _ _ _ _ _ _________________
CLK |_| |_| |_| |_| |_| |_| |_| |_|
__________
CMD |___________________________________________
DAT -----XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ACK- ----------------------------------------------|___|---
(资料来源:HFB03536@nifty-serve.or.jp)
简单的说,读/写手柄的时候,需要通过并口发送低电平有效的SEL-信号,并交替
发送时钟脉冲的下降和上升信号,并在此时串行发送命令和读取响应,每一个字节
读完,需要等待由手柄发过来的ACK-信号,以确认发送成功。
2.2.16核心里做这些工作的代码是:(drivers/char/joy-console.c)
static int js_psx_command(struct js_console_info *info, int b)
{
int i, cmd, ret=0;
cmd = (b&1)?JS_PSX_COMMAND:0;
for (i=0; i<8; i++) {
/* 降下CLK,并发送一位命令数据 */
JS_PAR_DATA_OUT(cmd | JS_PSX_POWER, info->port);
/* 延迟数微秒, 形成CLK低电平 */
udelay(JS_PSX_DELAY);
/* 读一位数据 */
ret |= ((JS_PAR_STATUS(info->port) ^ JS_PAR_STATUS_INVERT ) &
info->psx) ? (1<<i) : 0;
cmd = (b&1)?JS_PSX_COMMAND:0;
/* 升起CLK */
JS_PAR_DATA_OUT(cmd | JS_PSX_CLOCK | JS_PSX_POWER, info->port);
/* 延迟数微秒, 形成一个完整的时钟 */
udelay(JS_PSX_DELAY);
b >>= 1;
}
return ret;
}
这里漏掉了一点,就是等待手柄送回的ACK-,而ACK-最长可能会延迟达100微秒之久,
在这种情况下,很有可能得到错误的结果。事实上,内核文档中的
joystick-parport.txt里提到PS手柄的支持,说:
2.3 Sony Playstation
~~~~~~~~~~~~~~~~~~~~
WARNING: PSX support is experimental, and at the moment doesn't seem to
work for most people. If you like adventure, you can try yourself.
对比DirectPadPro在Win9x下很稳定的工作,也许和ACK-的关系很大吧....
--
We were moving mountains long before we know we could.
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.115.16.15]
BBS水木清华站∶精华区