编译i8320内核,让其支持多点触摸

编译内核:
参考http://www.limofans.com/forum.ph ... tid=5353&page=1
不过里面有一个地方是错误的:
CONFIG_KPL不能取消,取消后会造成dcm模块无法加载,无法控制led亮度。
编译KPL需要添加包含目录:
CFLAGS_KERNEL = -march=armv7-a -I./drivers/txsr/Inc

多点:
i8320内核版本及tinyx版本不支持现在流行的MT。有几个方法可以解决这个问题。
1)升级内核输入部分、升级tinyx。(需要做很多工作)
2)把驱动该为双鼠标模式(现在的版本支持,需要把驱动编译成可加载模块,以便调试。这个不难,谁有时间可以尝试一下)
3)改一下驱动,让应用程序直接访问。(30分钟搞定,目前gba0.7使用的方法)

在sysfs里面增加一个目录directtouchop,应用程序直接读取
static DEVICE_ATTR(directtouchop, S_IRUGO | S_IWUSR, direct_touch_show, direct_touch_store);

 

直接读取驱动源码:
http://www.115disk.com/viewfile.php?file_id=18271&file_key=h9CbSNpM

 


应用程序读取sysfs示例:
void read_touch(void)
{
 char buf[1024];
 int finger_type,finger_switched,x1,y1,x2,y2;
 FILE * file=fopen("/sys/class/input/input1/directtouchop","r");
 while(fscanf(file,"%d,%d,%d,%d,%d,%d",&finger_type,&finger_switched,&x1,&y1,&x2,&y2)!=EOF) {
  process_finger_type(finger_type,finger_switched,800-y1,x1,800-y2,x2);
 }
 fclose(file);

}

 


void clear_touch(void)
{
 char a='1';
 FILE * file=fopen("/sys/class/input/input1/directtouchop","w");
 fwrite(&a,1,1,file);
 fclose(file);
}

static unsigned short syna_old_x_position = 0;
static unsigned short syna_old_y_position = 0;
static unsigned short syna_old_x2_position = 0;
static unsigned short syna_old_y2_position = 0;
static int syna_old_old_finger_type=0;
static int syna_old_finger_type = 0;

int distance(int x1, int y1, int x2, int y2)
{
 int diffx,diffy;
 if(x1>x2) {
  diffx=x1-x2;
 }
 else  diffx=x2-x1;
 if(y1>y2)
  diffy=y1-y2;
 else
  diffy=y2-y1;
 if(diffy>diffx)
  return diffy;
 else
  return diffx;
}


void process_finger_type(int finger_type,int finger_switched,int x_position,int y_position, int x2_position,int y2_position)
{
 if ((finger_type > 0) && (finger_type < 7))  // press
 {
  //same point filtering
  if( finger_type == syna_old_finger_type)
  {
   if(distance(x_position,y_position,syna_old_x_position,syna_old_y_position)<30&&
    distance(x2_position,y2_position,syna_old_x2_position,syna_old_y2_position)<30)
   {
    return;
   }
  }
  //end same point filtering
  dprintf("finger_type=%d finger_switched=%d/n",finger_type,finger_switched);
  syna_old_x_position = x_position;
  syna_old_y_position = y_position;
  syna_old_x2_position = x2_position;
  syna_old_y2_position = y2_position;

  if((syna_old_finger_type==3) || (syna_old_finger_type==4))
  {
   if((finger_type == 2) || (finger_type == 5)) {
    if((syna_old_old_finger_type == 1) || (syna_old_old_finger_type == 6)) {
     buttonRelease(finger1);
    }
   }
   else if((finger_type == 1) || (finger_type == 6)) {
    if((syna_old_old_finger_type == 2) || (syna_old_old_finger_type == 5)) {
     buttonRelease(finger2);
    }
   }
  }

  int skip_report=0;
  //send press event
  if((finger_type == 1) || (finger_type == 2) || (finger_type == 5) || (finger_type == 6)) {
   if(finger_type == 1) {
    if(syna_old_finger_type == 2) {
     buttonRelease(finger2);
    }
    else if(syna_old_finger_type==3) {
     skip_report=1;
     buttonRelease(finger2);
    }
   }
   else if(finger_type == 2) {
    if(syna_old_finger_type == 1) {
     buttonRelease(finger1);
    }
                                else if(syna_old_finger_type==3) {
                                        skip_report=1;
                                        buttonRelease(finger1);
                                }

   }
   if(skip_report) {
 
   }
   else if(finger_switched == 0) {
    buttonPress(finger1,x_position,y_position);
   }
   else {
    buttonPress(finger2,x2_position,y2_position);
   }
  }
  else if((finger_type == 3) || (finger_type == 4)) {
   if((syna_old_finger_type == 1)||(syna_old_finger_type == 6)){
    buttonPress(finger2,x2_position,y2_position);
   }
   else if((syna_old_finger_type == 2)||(syna_old_finger_type == 5)) {
    buttonPress(finger1,x_position,y_position);
   }
   else {
    buttonPress(finger1,x_position,y_position);
    buttonPress(finger2,x2_position,y2_position);
   }


  }
 }
 //end press event((finger_type > 0) && (finger_type < 7))

 /    release event processing start   //
 else if(finger_type == 0)
 {
  buttonRelease(finger1);
  buttonRelease(finger2);

  finger_switched = 0;
  syna_old_x_position = -1;
  syna_old_y_position = -1;
  syna_old_x2_position = -1;
  syna_old_y2_position = -1;

 }

 syna_old_finger_type = finger_type;
 if((syna_old_finger_type != 3) && (syna_old_finger_type != 4))
  syna_old_old_finger_type = finger_type;

}

 

 

完整代码下载:

http://www.115disk.com/viewfile.php?file_id=18272&file_key=hLSWgjG3

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值