浅析linux中鼠标数据读取

转载 2015年07月07日 20:46:11

浅析linux中鼠标数据读取
luther@gliethttp:~$ ll /dev/input/mice
crw-rw—- 1 root root 13, 63 2009-07-09 15:54 /dev/input/mice
我们就是去读/dev/input/mice设备节点,源码如下:

#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/select.h>
#include <string.h>
// 以下代码源自
// [需要在文本控制台下运行,才能获取到数据,在ubuntu 8.10 GNOME界面只能收到1个字节数据0xfa][luther.gliethttp]
// libminigui-1.6.10/src/ial/native/native.c
// InitIAL==>__mg_cur_input = inputs{"console", InitNativeInput, TermNativeInput},
// mousedev = mousedev_IMPS2;
// input->update_mouse = mouse_update;
/* Mouse button bits*/
#define WHEEL_UP 0x10
#define WHEEL_DOWN 0x08
#define BUTTON_L 0x04
#define BUTTON_M 0x02
#define BUTTON_R 0x01
#define SCALE 3 /* default scaling factor for acceleration */
#define THRESH 5 /* default threshhold for acceleration */
static int xpos; /* current x position of mouse */
static int ypos; /* current y position of mouse */
static int minx; /* minimum allowed x position */
static int maxx; /* maximum allowed x position */
static int miny; /* minimum allowed y position */
static int maxy; /* maximum allowed y position */
static int buttons; /* current state of buttons */
static int scale = SCALE; /* acceleration scale factor */
static int thresh = THRESH;/* acceleration threshhold */
static int mouse_update(int dx, int dy, int dz);
static int IMPS2_Read (int *dx, int *dy, int *dz, int *bp);
static void mouse_setposition (int newx, int newy);
static void mouse_setrange (int newminx, int newminy, int newmaxx, int newmaxy);
int mouse_fd;
int main(void)
{
  int dx,dy,dz;
  static unsigned char imps2_param [] = {243,200,243,100,243,80};//,242};
// 来自vnc4的xc/programs/Xserver/hw/xfree86/input/mouse/mouse.c==> PROT_IMPS2
const char *mdev="/dev/input/mice";
mouse_fd = open (mdev, O_RDWR); // | O_NONBLOCK);
if (mouse_fd < 0) {
  printf("[luther.gliethttp]: RW error [please use root user]: %s\n", mdev);
  mouse_fd = open (mdev, O_RDONLY); // | O_NONBLOCK);
  if (mouse_fd < 0)
    return -1;
} else {
  write (mouse_fd, imps2_param, sizeof (imps2_param)); // 初始化序列, 这样可以读取4个字节数据
  // 0x80用来表示滚轮向上还是向下滚动.de>
  de> // 0xa0表示滚轮向上滚动的同时中键按下
    de>
    de> printf("[luther.gliethttp]: imps2_param ok!\n");
}
mouse_setrange(0, 0, 1024, 768);
for (;;) {
  IMPS2_Read(&dx, &dy, &dz, &buttons);
  mouse_update(dx, dy, dz);
  mouse_setposition(xpos, ypos);
  printf("[%04d,%04d,0x%04x]\n", xpos, ypos, buttons);
}
return 0;
}
static int IMPS2_Read (int *dx, int *dy, int *dz, int *bp)
{
  static unsigned char buf[5];
  static int buttons[7] = { 0, 1, 3, 0, 2, 0, 0}; // 1左键,2中键,3右键
  static int nbytes;
  int n;
  while ((n = read (mouse_fd, &buf [nbytes], 4 - nbytes))) {
    if (n < 0) {
      if (errno == EINTR)
        continue;
      else
        return -1;
    }
    nbytes += n;
    if (nbytes == 4) {
      int wheel;
      // printf("[luther.gliethttp]: %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3]);
      if ((buf[0] & 0xc0) != 0) {
        buf[0] = buf[1];
        buf[1] = buf[2];
        buf[2] = buf[3];
        nbytes = 3;
        return -1;
      }
      /* FORM XFree86 4.0.1 */
      *bp = buttons[(buf[0] & 0x07)];
      *dx = (buf[0] & 0x10) ? buf[1] - 256 : buf[1];
      *dy = (buf[0] & 0x20) ? -(buf[2] - 256) : -buf[2];
      /* Is a wheel event? */
      if ((wheel = buf[3]) != 0) {
        if(wheel > 0x7f) {
          *bp |= WHEEL_UP;
        }
        else {
          *bp |= WHEEL_DOWN;
        }
      }
      *dz = 0;
      nbytes = 0;
      return 1;
    }
  }
  return 0;
}
static int mouse_update(int dx, int dy, int dz)
{
  int r;
  int sign;
  sign = 1;
  if (dx < 0) {
    sign = -1;
    dx = -dx;
  }
  if (dx > thresh)
    dx = thresh + (dx - thresh) * scale;
  dx *= sign;
  xpos += dx;
  if( xpos < minx )
    xpos = minx;
  if( xpos > maxx )
    xpos = maxx;
  sign = 1;
  if (dy < 0) {
    sign = -1;
    dy = -dy;
  }
  if (dy > thresh)
    dy = thresh + (dy - thresh) * scale;
  dy *= sign;
  ypos += dy;
  if ( ypos < miny )
    ypos = miny;
  if ( ypos > maxy )
    ypos = maxy;
  return 1;
}
static void mouse_setposition (int newx, int newy)
{
  if (newx < minx)
    newx = minx;
  if (newx > maxx)
    newx = maxx;
  if (newy < miny)
    newy = miny;
  if (newy > maxy)
    newy = maxy;
  if (newx == xpos && newy == ypos)
    return;
  xpos = newx;
  ypos = newy;
}
static void mouse_setrange (int newminx, int newminy, int newmaxx, int newmaxy)
{
  minx = newminx;
  miny = newminy;
  maxx = newmaxx;
  maxy = newmaxy;
  mouse_setposition ((newminx + newmaxx) / 2, (newminy + newmaxy) / 2);
}
static int mouse_getbutton (void)
{
  return buttons;
}
static void mouse_getxy (int* x, int* y)
{
  *x = xpos;
  *y = ypos;
}

相关文章推荐

浅析linux中鼠标数据读取

浅析linux中鼠标数据读取 luther@gliethttp:~$ ll /dev/input/mice crw-rw---- 1 root root 13, 63 2009-07-09 15:...

浅析linux中鼠标数据读取

我们就是去读/dev/input/mice设备节点,源码如下: #include #include #include #include #include /* Mouse but...

浅析usbhid驱动如何源源不断的获取usb鼠标数据

浅析usbhid驱动如何源源不断的获取usb鼠标数据 hid_probe ==>usb_hid_configure     pipe = usb_rcvintpipe(dev, endpoi...

浅析linux下鼠标驱动的实现

浅析linux下鼠标、键盘驱动的实现       对于鼠标驱动和前面分析过的键盘驱动都是共用input模型,所以,对于事件上报和处理的方式都没有区别,只是mouse鼠标驱动当上报完dx,dy,l...

和菜鸟一起学linux总线驱动之初识USB鼠标抓包数据

小日本可恶的暂时抢走了钓鱼岛,但是,相信凭借全国人民的齐心协力,钓鱼岛是逃不掉的。至于要不要武力解决,这个不是我们说了算的。最好还是不能动武,到时候受害者还是老板姓。相信时间会解释一切,在此只能默默祈...

Linux设备驱动模型浅析1---sysfs及基本数据结构:kobject,kset,ktype

Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。其实,就是 在用户态可以通过对sys文件系统的访问,来看内核...

内核阅读之浅析Linux2.6.34内核桥接数据转发(二)

按照内核阅读之浅析Linux2.6.34内核桥接数据转发(一)中的总体框架,依次浅析各个主要关键函数,看看里面具体实现了什么。 首先是int netif_receive_skb()函数,所有从硬件那...

内核阅读之浅析Linux2.6.34内核桥接数据转发(三)

如有错误之处,欢迎指正学习。 handle_bridge()函数,该函数在Linux2.6.34\net\core\Dev.c 这里回调了br_handle_frame_hook()函...

浅析Linux驱动模型中的底层数据结构kobject和kset

1、kobject         Linux内核用kobject来表示一个内核对象。它和Sysfs文件系统联系密切,在内核中注册到系统中的每个kobject对象在sysfs文件系统中对对应着一个文件...

linux驱动之usb鼠标按键的读取

上一篇博文只是usb总线驱动程序的框架,下面来真正写一个usb驱动程序。 USB鼠标驱动,鼠标输入HID类型,其数据传输采用中断URB,鼠标端点类型为IN 目的:usb鼠标按键的驱动代码编写:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)