阿哥论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 1100|回复: 0

uC/GUI(3.90)在NIOSII(9.0)上的移植之鼠标驱动(DE2-35)(原创)

[复制链接]

4

主题

0

好友

16

积分

IT工程师

Rank: 1

升级  32%

发表于 2013-1-3 17:28:27 |显示全部楼层
uC/GUI(3.90)在NIOSII(9.0)上的移植之鼠标驱动(DE2-35)(原创)

<div id="cnblogs_post_body">参考资料:
nios2+ucGUI 鼠标驱动的加入(DE1开发板)

前言:在上文uC/GUI(3.90)在NIOSII(9.0)上的移植之LCD驱动(DE2-35)速成(原创)中,我提到过DE2_Media_Computer工程(针对DE2-35的SOPC系统框架工程文件),下面的鼠标驱动的移植也是针对这个工程,先贴个图:

因为PS2的IP核是现成的,所以直接使用此工程模版即可,在进行移植之前,建议大家看完如下两个文档:
1.UCGUI中文使用手册中的“第18章输入设备.pdf”(μC/GUI 提供触摸屏,鼠标,和键盘支持)
2.PS2_Controller.pdf
鼠标移植:
1.在NiOS2 IDE中初始化PS2鼠标设备
包含头文件,并声明PS2设备变量
#include "sys/alt_irq.h"
#include "system.h"
#include "altera_up_ps2_mouse.h"
alt_up_ps2_dev *ps2;
int PS2_Init()
{
    ps2 = alt_up_ps2_open_dev("/dev/PS2_Port");
    alt_up_ps2_init(ps2);
    alt_up_ps2_clear_fifo(ps2);
    if (ps2->device_type == PS2_MOUSE)
    {
        int status = alt_up_ps2_write_data_byte_with_ack(ps2, 0xf4);
        if (status==0)
        {
        printf("Mouse.../n");
        alt_up_ps2_mouse_set_mode(ps2,MOUSE_STREAM_MODE);
        alt_irq_register( PS2_PORT_IRQ, 0,MOUSE_ISR );
        alt_up_ps2_enable_read_interrupt(ps2);
        }
        return (1);
    }
    return (0);
}
此函数中初始化了ps2设备并且根据其回应的字符确定连接的设备为鼠标不是键盘,当设备初始化结束后需alt_irq_register( PS2_IRQ, 0,MOUSE_ISR );alt_up_ps2_enable_read_interrupt(ps2);这两个函数为鼠标中断服务函数的注册和使能,当这两个函数执行正常之后就可以正常使用鼠标了。
2.中断服务函数的实现
//PS2鼠标中断服务程序
void MOUSE_ISR(void* context, alt_u32 id)
{
    char Data;
    alt_up_ps2_read_data_byte(ps2, &Data); //这句代码实现从IP核读取鼠标发送的一个字节的数据
    GUI_MOUSE_DRIVER_PS2_OnRx(Data);     //ucGUI内核提供的一个ps2鼠标处理内核函数
}
3.ucGUI内核中ps2鼠标处理函数的修改(GUI->Core->GUI_MOUSE_DriverPS2.c)
(1)GUI_MOUSE_DRIVER_PS2_OnRx
描述:必须从接受中断程序调用
附加信息:该PS2鼠标驱动是一种串行驱动程序,意思是它每次接受一个字节,你需要保证这些函数从你的接受中断调用,每次接受一个字节(字符)。
<div class="blockcode"><div id="code0">

  • void GUI_MOUSE_DRIVER_PS2_OnRx(unsigned char Data) {
  •   if (!_NumBytesInBuffer) {
  •     /* check for start frame */
  •     if ((Data & 0x0c) == 0x08) {
  •       _abInBuffer[0] = Data;
  •       _NumBytesInBuffer++;
  •     }
  •   } else {
  •     _abInBuffer[_NumBytesInBuffer] = Data;
  •     _NumBytesInBuffer++;
  •     if (_NumBytesInBuffer >= 3) {
  •       _EvaPacket();
  •       _NumBytesInBuffer = 0;
  •     }
  •   }
  • }
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

回顶部