?? 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 + -