📄 ps2.c
字号:
/********************************************************************************/
/* 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 + -