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

📄 ps2.c

📁 PS2和USB兼容的鼠标源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/* 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 + -