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水木清华站∶精华区