|
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中文使用手册中的&ldquo;第18章输入设备.pdf&rdquo;(&mu;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;
- }
- }
- }
|
|