打印
[嵌入式linux]

rk3399+PAJ7620手势感应调式

[复制链接]
510|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qq7643066|  楼主 | 2020-10-18 15:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qq7643066 于 2020-10-18 15:22 编辑

PAJ7620传感器是原相科技(Pixart)的一款内部集成光学阵列式传感器,以使复杂的手势和光标模式输出,内部集成了九种手势的识别:上、下、左、右、向前、向后、顺时针、逆时针以及挥动的手势动作识别、模块以i2c通信,传感器功能很强大,更详细模块说明的可参考数据手册。
      手势传感器可以用来做大量丰富的应用开发,如下:





还有有些oppo手机的手势隔空操作,可以翻转桌面和图片等操作,估计也是手势传感器来实现的。


驱动思路和原理

       paj7620的驱动步骤在手册的programing sequence and function application里有详细的步骤说明,我在这里就总结一下注意事项。传感器的读时序中间有stop信号,因此在封装读函数需要调用两次i2c_transfer,,在下面的代码会看到。


设备树编写

讲完传感器的介绍后,我们首先开始在设备树文件描述手势传感器,手势传感器是i2c协议通信的,我选择rk3399的i2c4组进行通信,因此可以如下描述即可。
&i2c1 {
    clock-frequency = <400000>;
    status = "okay";
    paj7620: paj7620@73 {
             compatible = "pxi,paj7620";
             reg = <0x73>;
         };
};



从设备的地址可在数据手册上找到,它是7bit的地址0x73。

设备驱动编写:

          这里我采用轮徇的方式去获取传感器的手势动作状态,并且将手势传感器实现成一个输入设备,因此可以用一个结构体这样描述它
struct gesture_sensor{
    struct i2c_client *client;                     //记录i2c的client
    struct delayed_work poll_work;     //工作队列
    struct input_dev *inputdev;             //输入设备
};

复制代码
根据传感器的时序进行封装paj7620的i2c读写函数
//paj7620写寄存器
static int paj_write_reg(struct i2c_client *client ,unsigned char addr,unsigned char data)
{
    unsigned char buf[2]={addr,data};
    return  i2c_master_send(client,buf,2);
}
//paj7620读寄存器
//paj7620的读中间是p(停止)信号,因此要将read操作分成两次transfer
static unsigned char  paj_read_reg(struct i2c_client *client ,unsigned char addr)
{
    int ret;
    struct i2c_msg msg[2];
    unsigned char data;
    msg[0].addr=client->addr;
    msg[0].flags =0;//写
    msg[0].len=1;
    msg[0].buf=&addr;
    ret=i2c_transfer(client->adapter,msg,1);
    if(ret<0)
    {
        printk("i2c_transfer read error %d\n",ret);
        return ret;
    }
    msg[1].addr = client->addr;
    msg[1].flags |= I2C_M_RD;//读
    msg[1].len = 1;
    msg[1].buf = &data;
    ret = i2c_transfer(client->adapter,&msg[1], 1);
    if(ret < 0)
    {
        printk("i2c_transfer read error %d\n",ret);
        return ret;
    }
    return data;
}



在工作队列中将数据获取,并且上报给用户层。代码太长,此处将不粘贴,详细的代码可参考附件或私信我。

功能测试:

      在这里,我做了一个应用层的demo来获取手势数据,在串口终端里运行gesturedemo,我们进行手势动作识别测试,效果如下,可以获取9种识别的手势:
# gesturedemo /dev/input/event1
gesture:down
gesture:up
gesture:left
gesture:right
gesture:forward
gesture:backward
gesture:clockwise
gesture:count clockwise
gesture:wave
我们基于rk3399开发板,Android7.1已经调好



使用特权

评论回复

相关帖子

沙发
1348795481| | 2020-10-20 08:54 | 只看该作者
驱动源码在哪里下载,正好需要

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:承接MID、Android TV等项目定制 QQ:7643066

107

主题

422

帖子

5

粉丝