⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2.c

📁 PS2和USB兼容的鼠标源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/********************************************************************************/
/* filename: ps2.c                                                              */
/* version : v1.00                                                              */
/* created : hw-chen                                                            */
/* descript: PS2鼠标函数定义                                                    */
/********************************************************************************/
#include "m8c.h"        // part specific constants and macros
#include "dev.h"
#include "ps2.h"
#include "usb.h"

const char ps2_sample_intervals[]={100,50,25,17,13,10,5};   //* table of intervals corresponding to each rate.
const char ps2_sample_rate[]={10,20,40,60,80,100,200};      //* table of acceptable report rates
st_ps2_parameter ps2_parameter;     //* mouse parameters
st_ps2_xmit      ps2_xmit;          //* transmit buffer
char ps2_last_valid_cmd;            //* PS2保存连续字节命令的上一个命令
char ps2_error_flag;                //* 出错统计
char ps2_port;
void ps2_read_data(void);

/********************************************************************************/
/* function : ps2_recv_start()                                                  */
/* created  : hw-chen                                                           */
/* descript : 循环18次,每次10US,共180US,24M晶振,1US就是24个CLK周期              */
/********************************************************************************/
char ps2_recv_start(void)
{   unsigned char i;
    for(i=0x0;i<18;i++)
    {
    //* start for
    if((PS2_PORT&PS2_SCLK_BIT)==0x0)
    {   break;
    }
    if((PS2_PORT&PS2_DATA_BIT)==0x2)
    {   break;
    }
    wait_usec_timer(8); //* 8US
    //* end for
    }
    if(i>=18)
    {   return 0x1;
    }
    else
    {   return 0x0;
    }
}
/********************************************************************************/
/* function : ps2_recv_mbit()                                                   */
/* created  : hw-chen                                                           */
/* descript : 从HOST接收一位数据                                                */
/********************************************************************************/
char recv_bit;
char ps2_recv_mbit(void)
{   if((PS2_PORT&PS2_SCLK_BIT)==0x0)
    {   return 0xFF;
    }
    ps2_port =PS2_PORT;
    ps2_port&=PS2_CLK_DATA_MSK;
    ps2_port|=PS2_CLK_L_DATA_H;         //* 拉低SCLK,释放DATA
    PS2_PORT =ps2_port;
    wait_usec_timer(35);                //* 35US

    ps2_port&=PS2_CLK_DATA_MSK;
    ps2_port|=PS2_CLK_H_DATA_H;         //* 拉高SCLK,释放DATA
    PS2_PORT =ps2_port;
    wait_usec_timer(15);                //* 15US

    recv_bit=PS2_PORT&PS2_DATA_BIT;
    wait_usec_timer(11);                //* 11US
    return recv_bit;
}

/********************************************************************************/
/* function : ps2_send_check()                                                  */
/* created  : hw-chen                                                           */
/* descript : PS2检查是否可以发送数据                                           */
/********************************************************************************/
char ps2_send_check(void)
{   if((PS2_PORT&PS2_SCLK_BIT)==0x0)    //* 主机禁止发送数据
    {   return 0x0;
    }
    wait_usec_timer(50);                //* 50US
    if((PS2_PORT&PS2_SCLK_BIT)==0x0)    //* 主机禁止发送数据
    {   return 0x0;
    }
    if((PS2_PORT&PS2_DATA_BIT)==0x0)    //* 主机RTS
    {   return 0x0;
    }
    else
    {   return 0x1;
    }
}

/********************************************************************************/
/* function : ps2_send_check_wait()                                             */
/* created  : hw-chen                                                           */
/* descript : PS2检查是否可以发送数据                                           */
/********************************************************************************/
char ps2_send_check_wait(void)
{   if((HOST_RTS))                      //* 主机RTS
    {   return 0x0;
    }
check_wait:
    if((HOST_RTS))                      //* 主机RTS
    {   return 0x0;
    }
    if((PS2_PORT&PS2_SCLK_BIT)==0x0)    //* 主机禁止发送数据
    {   goto check_wait;
    }
    wait_usec_timer(50);                //* 50US
    if((PS2_PORT&PS2_SCLK_BIT)==0x0)    //* 主机禁止发送数据
    {   goto check_wait;
    }
    else
    {   return 0x1;
    }
}

/********************************************************************************/
/* function : ps2_send_mbit()                                                   */
/* created  : hw-chen                                                           */
/* descript : PS2发送数据位                                                     */
/********************************************************************************/
char ps2_send_mbit(char mbit)
{   if((PS2_PORT&PS2_SCLK_BIT)==0x0)    //* 主机禁止发送数据
    {   return 0x0;
    }
    ps2_port =PS2_PORT;
    ps2_port&=PS2_CLK_DATA_MSK;
    if((mbit))
    {   ps2_port|=PS2_CLK_H_DATA_H;     //* 拉高DATA线
    }
    else
    {   ps2_port|=PS2_CLK_H_DATA_L;     //* 拉低DATA线
    }
    PS2_PORT =ps2_port;
    wait_usec_timer(5);                 //* 5US

    ps2_port&=PS2_SCLK_MSK;             //* 拉低SCLK,保持DATA
    PS2_PORT =ps2_port;
    wait_usec_timer(35);                //* 35US

    ps2_port|=PS2_SCLK_BIT;             //* 拉高SCLK,保持DATA
    PS2_PORT =ps2_port;
    wait_usec_timer(11);                //* 11US
    return 0x1;
}

/********************************************************************************/
/* function : ps2_recv_byte()                                                   */
/* created  : hw-chen                                                           */
/* descript : 从HOST接收一字节数据                                              */
/********************************************************************************/
char ps2_host_byte=0x0;
char ps2_parity=0x0;
char ps2_stop=0x1;
char ps2_fbit=0x1;
char ps2_recv_byte(void)
{   char read;
    char i;
    ps2_host_byte=0x0;
    ps2_parity=0x0;
    ps2_stop=0x1;
    ps2_fbit=0x1;
    for(i=0x0;i<0x8;i++)            //* 接收8位数据位
    {
    //* start for
    read=ps2_recv_mbit();
    if((read==0xFF))
    {   return 0x0;
    }
    if((read==PS2_DATA_BIT))
    {   ps2_host_byte|=ps2_fbit;
        ps2_parity++;
    }
    ps2_fbit<<=0x1;
    //* end for
    }
    read=ps2_recv_mbit();           //* 获取奇偶校验位
    if((read==0xFF))
    {   return 0x0;
    }
    if((read==PS2_DATA_BIT))
    {   ps2_parity++;
    }
read_get_stop:
    read=ps2_recv_mbit();           //* 获取停止位
    if((read==0xFF))
    {   return 0x0;
    }
    if((read!=PS2_DATA_BIT))        //* 停止位出错
    {   ps2_stop=0x0;
        goto read_get_stop;
    }
    if((ps2_send_mbit(0x0)==0x0))   //* 发送ACK
    {   return 0x0;
    }
    if((ps2_parity&0x1)!=0x1)       //* PS2采用的是奇校验,收到的数据应该有奇数个1(包括校验位)
    {   return 0x0;
    }
    else
    {   return ps2_stop;            //* 如果停止位正确,就正确了,出错前面已经返回了
    }
}

/********************************************************************************/
/* function : ps2_send_byte()                                                   */
/* created  : hw-chen                                                           */
/* descript : PS2发送数据给主机                                                 */
/********************************************************************************/
char ps2_send_byte(unsigned char mdata)
{   char mbit;
    char i;
    ps2_parity=0x0;
    ps2_fbit=0x1;
    if((ps2_send_mbit(0x0)==0x0))           //* 发送开始位
    {   return 0x0;
    }
    for(i=0x0;i<0x8;i++)                    //* 发送数据位,LSB优先
    {   
    //* start for
    mbit=(mdata&ps2_fbit);
    if((ps2_send_mbit(mbit)==0x0))      
    {   return 0x0;
    }
    if((mbit))
    {   ps2_parity++;
    }
    ps2_fbit<<=0x1;
    //* end for
    }
    if((ps2_parity&0x1))
    {   ps2_parity=0x0;
    }
    else
    {   ps2_parity=0x1;
    }
    if((ps2_send_mbit(ps2_parity)==0x0))    //* 发送奇校验位
    {   return 0x0;
    }
    if((ps2_send_mbit(0x1)==0x0))           //* 发送停止位
    {   return 0x0;
    }
    return 0x1;
}

/********************************************************************************/
/* function : ps2_recv_sbyte()                                                  */
/* created  : hw-chen                                                           */
/********************************************************************************/
char ps2_recv_sbyte(void)
{   if((ps2_recv_start()==0x0))
    {   return 0x0;
    }
    if((ps2_recv_byte()==0x0))
    {   return 0x0;
    }
    else
    {   return 0x1;
    }
}

/********************************************************************************/
/* function : ps2_send_sbyte()                                                  */
/* created  : hw-chen                                                           */
/********************************************************************************/
char ps2_send_sbyte(unsigned char mdata)
{   if((ps2_send_check()==0x0))
    {   return 0x0;
    }
    if((ps2_send_byte(mdata)==0x0))
    {   return 0x0;
    }
    else
    {   return 0x1;
    }
}

/********************************************************************************/
/* function : ps2_put_sbyte()                                                   */
/* created  : hw-chen                                                           */
/********************************************************************************/
char ps2_put_sbyte(unsigned char mdata)
{   if((ps2_send_check_wait()==0x0))
    {   return 0x0;
    }
    if((ps2_send_byte(mdata)==0x0))
    {   return 0x0;
    }
    else
    {   return 0x1;
    }
}

/********************************************************************************/
/* function : ps2_recv_hostbyte()                                               */
/* created  : hw-chen                                                           */
/* descript : 从HOST接收一字节数据,数据保存在ps2_host_byte变量里面              */
/********************************************************************************/
char ps2_recv_hostbyte(void)
{   char retval;
    globle_isr_disable();
    relase_ps2_pins();
    retval=ps2_recv_sbyte();
    relase_ps2_pins();
    globle_isr_enable();
    return retval;
}

/********************************************************************************/
/* function : ps2_send_hostbyte()                                               */
/* created  : hw-chen                                                           */
/* descript : PS2发送一字节数据给主机,发送成功返回0x1                           */
/********************************************************************************/
char ps2_send_hostbyte(unsigned char mdata)
{   char retval;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -