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

本文介绍了一种针对i8320内核版本及tinyx不支持MT的问题解决方案,通过修改内核配置及驱动实现多点触控功能,并提供了具体的驱动源码及应用程序读取示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译内核:
参考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

 

 

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值