📄 ps2.c
字号:
/* created : hw-chen */
/* descript : 重新发送数据包,由于数据一直在发送缓冲区,只需要重新复制长度就可以 */
/********************************************************************************/
void ps2_resend(void)
{ ps2_xmit.ps2_xmit = ps2_xmit.ps2_length;
}
/********************************************************************************/
/* function : ps2_set_default_state() */
/* created : hw-chen */
/* descript : 设置鼠标的缺省状态 */
/********************************************************************************/
void ps2_set_default_state(void)
{ ps2_parameter.report_rate = 100; //* 100 reports per second
ps2_parameter.report_interval = 10; //* is equal to a report every 10 msec
ps2_parameter.scale = SC_1_1; //* 1-to-1 scaling
ps2_parameter.stream = 0x1; //* stream mode on
ps2_parameter.resolution = RES_1MM; //* 1 MM resolution
ps2_parameter.enable = 0x0; //* not enabled
ps2_parameter.zmouse = 0x0; //* z-wheel off.
ps2_parameter.wrap = 0x0;
}
/********************************************************************************/
/* function : ps2_disable() */
/* created : hw-chen */
/* descript : 禁止鼠标 */
/********************************************************************************/
void ps2_disable(void)
{ ps2_parameter.enable = 0x0;
}
/********************************************************************************/
/* function : ps2_enable() */
/* created : hw-chen */
/* descript : 允许鼠标操作 */
/********************************************************************************/
void ps2_enable(void)
{ ps2_parameter.enable=0x1;
return;
}
/********************************************************************************/
/* function : ps2_set_sample_rate_ack() */
/* created : hw-chen */
/* descript : ACK设置鼠标采样,由于第二字节是采样率,这里是接收到第一字节,所以这 */
/* 里不处理 */
/********************************************************************************/
void ps2_set_sample_rate_ack(void)
{
}
/********************************************************************************/
/* function : ps2_set_sample_rate() */
/* created : hw-chen */
/* descript : 设置鼠标的采样率 */
/********************************************************************************/
char ps2_set_sample_rate(char rate)
{ char i;
for(i=0x0;i<PS2_NUM_RATES;i++)
{ if((rate==ps2_sample_rate[i]))
{ ps2_parameter.report_interval=ps2_sample_intervals[i];
ps2_parameter.report_rate=rate;
ps2_rst_interval();
return(PS2_ACK);
}
}
return(PS2_RESEND);
}
/********************************************************************************/
/* function : ps2_read_device_type() */
/* created : hw-chen */
/* descript : 读取设备的类型,由于本设计采用了5键鼠标,需要回答0x4,如果是3键 */
/* 鼠标需要回应0x3,否则应答0x0 */
/********************************************************************************/
void ps2_read_device_type(void) /* 0xF2 */
{ ps2_xmit.ps2_buffer[0x0]=0x0;
ps2_xmit.ps2_length = 0x1;
ps2_xmit.ps2_xmit = 0x1;
}
/********************************************************************************/
/* function : ps2_set_remote_mode() */
/* created : hw-chen */
/* descript : 设置成为REM模式 */
/********************************************************************************/
void ps2_set_remote_mode(void)
{ ps2_parameter.stream = 0x0;
}
/********************************************************************************/
/* function : ps2_rst_wrap_mode() */
/* created : hw-chen */
//* descript : 根据IBM建议,如果STREAM模式是允许的,如果WRAP模式RST,鼠标被禁止 */ */
/********************************************************************************/
void ps2_rst_wrap_mode(void)
{ ps2_parameter.wrap=0x0;
if((ps2_parameter.stream))
{ ps2_parameter.enable=0x0;
}
}
/********************************************************************************/
/* function : ps2_set_wrap_mode() */
/* created : hw-chen */
/* descript : 允许WRAP模式 */
/********************************************************************************/
void ps2_set_wrap_mode(void)
{ ps2_parameter.wrap = 1;
}
/********************************************************************************/
/* function : ps2_set_stream_mode() */
/* created : hw-chen */
/* descript : 设置流模式 */
/********************************************************************************/
void ps2_set_stream_mode(void)
{ ps2_parameter.stream = 1;
ps2_rst_interval();
}
/********************************************************************************/
/* function : ps2_read_data() */
/* created : hw-chen */
/* descript : 返回鼠标数据包给主机,回应主机的读数据命令 */
/********************************************************************************/
void ps2_read_data(void)
{ mouse_status.change_flag = 1;
ps2_rst_interval();
mouse_status.change_flag|=mouse_poll_adns(); //* 读取光学器件,查看鼠标是否有移动
ps2_packet_mouse_mdata();
}
/********************************************************************************/
/* function : ps2_status_request() */
/* created : hw-chen */
/* descript : 发送状态响应给主机 */
/********************************************************************************/
void ps2_status_request(void)
{ ps2_xmit.ps2_buffer[0] = 0x20;
ps2_xmit.ps2_buffer[1] = 0x3;
ps2_xmit.ps2_buffer[2] = 100;
ps2_xmit.ps2_length = 0x3;
ps2_xmit.ps2_xmit = 0x3;
return;
}
/********************************************************************************/
/* function : ps2_set_resolution_ack() */
/* created : hw-chen */
/* descript : 设置RESOLUTION的ACK,他是两个字节,第二字节是RESOLUTION,这个函数 */
/* 是第一字节调用的,所以不处理 */
/********************************************************************************/
void ps2_set_resolution_ack(void)
{ return;
}
/********************************************************************************/
/* function : ps2_set_resolution() */
/* created : hw-chen */
/* descript : 设置鼠标的分辨率 */
/********************************************************************************/
char ps2_set_resolution(char bRes)
{ switch (bRes)
{
case RES_1MM: //* only 4 valid resolutions accepted
case RES_2MM:
case RES_4MM:
case RES_8MM:
ps2_parameter.resolution = bRes;
return(PS2_ACK);
default:
break;
}
return(PS2_RESEND); //*
}
/********************************************************************************/
/* function : ps2_set_scaling() */
/* created : hw-chen */
/* descript : 设置SCALING */
/********************************************************************************/
void ps2_set_scaling(void)
{ ps2_parameter.scale = SC_2_1;
}
/********************************************************************************/
/* function : ps2_rst_scaling() */
/* created : hw-chen */
/* descript : 复位SCALING */
/********************************************************************************/
void ps2_rst_scaling(void)
{ ps2_parameter.scale = SC_1_1;
}
unsigned char ps2_interval_count; //interval count, in msec, for reporting mouse packets
void ps2_rst_interval(void)
{ ps2_interval_count = ps2_parameter.report_interval;
}
/********************************************************************************/
/* function : ps2_mouse_tasking() */
/* created : hw-chen */
/* descript : 鼠标在上电后或应答RESET(0xFF)命令就进入RESET模式,进入这个模式后 */
/* 鼠标执行象前面提到的BAT基本保证测试一样的自检并设置如下的缺省值 */
/* 1.采样速率100 采样点/秒 */
/* 2.分辨率4 个计数值/毫米 */
/* 3.缩放比例1:1 */
/* 4.数据报告被禁止 */
/* 然后发送BAT完成代码,这个代码不是0xAA就是0xFC 错误(BAT成功),如果 */
/* 主机收到了不是0xAA的回应,它可能重新给鼠标供电这样来引起鼠标复位 */
/* 并重新执行BAT */
/********************************************************************************/
void ps2_pro_bat(void)
{ dev_wait_x_msecond(250); //* 延时500毫秒
dev_wait_x_msecond(250);
ps2_xmit.ps2_buffer[0]=0xAA; //* send AA 00 to host
ps2_xmit.ps2_buffer[1]=0x00; //* fe
ps2_xmit.ps2_length =0x2;
ps2_xmit.ps2_xmit =0x2;
}
/********************************************************************************/
/* function : ps2_send_next_byte() */
/* created : hw-chen */
/* descript : 鼠标发送下一字节数据 */
/********************************************************************************/
void ps2_send_next_byte(void)
{ if((ps2_send_hostbyte(ps2_xmit.ps2_buffer[ps2_xmit.ps2_length-ps2_xmit.ps2_xmit]))) //send the byte
{ ps2_xmit.ps2_xmit--;
}
return;
}
/********************************************************************************/
/* function : ps2_mouse_tasking() */
/* created : hw-chen */
/* descript : 处理PS2鼠标的任务 */
/********************************************************************************/
void ps2_mouse_tasking(void)
{ if((msecond_status.ms_counter&0x3)==0x0) //* 4MS定时器
{ mouse_status.change_flag|=mouse_poll_buttons(); //* 查看是否有按键动作
}
if((ps2_interval_count!=0x0)) //* PS2的报告时间没有到
{ return;
}
if((ps2_parameter.enable!=0x1))
{ return;
}
if((ps2_parameter.stream!=0x1))
{ return;
}
ps2_rst_interval(); //* reset the interval
mouse_status.change_flag|=mouse_poll_adns(); //* 读取光学器件,查看鼠标是否有移动
if((mouse_status.change_flag)==0x0)
{ return;
}
ps2_packet_mouse_mdata(); //* 发送数据给主机
}
/********************************************************************************/
/* function : ps2_start() */
/* created : hw-chen */
/* descript : 处理PS2鼠标的任务 */
/********************************************************************************/
void ps2_start(void)
{ P10CR = 0x03; //* PS2_PULLUP_ENABLE,OUTPUT_ENABLE;
P11CR = 0x05; //* OPEN_DRAIN,OUTPUT_ENABLE
USBCR = 0x00; //* 禁止USB
USBXCR = 0x00; //* 禁止USB上拉
P1DATA |= (PS2_SCLK_BIT|PS2_DATA_BIT);
}
/********************************************************************************/
/* function : ps2_main_process() */
/* created : hw-chen */
/* descript : 处理PS2的主函数 */
/********************************************************************************/
void ps2_main_process(void)
{ ps2_start(); //* 初始化PS2的IO引脚
ps2_set_default_state(); //* 初始化成为缺省的状态
ps2_pro_bat(); //* send the BAT code
while(1){
/****************************************************************************/
/* 如果正确接收到数据 */
/****************************************************************************/
if((ps2_recv_hostbyte())){
ps2_pro_host_command(ps2_host_byte);
continue;
}
/****************************************************************************/
/* 如果有数据需要发送 */
/****************************************************************************/
if((ps2_xmit.ps2_xmit)){
ps2_send_next_byte();
continue;
}
/****************************************************************************/
/* 如果1MS定时器到 */
/****************************************************************************/
if((msecond_status.ms_flag&ONE_MSEC_FLAG)==ONE_MSEC_FLAG){
msecond_status.ms_flag&=~ONE_MSEC_FLAG;
ps2_mouse_tasking();
continue;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -