android Hid 实现注意事项

在调试A+G sensor通过HID协议在Android上进行数据传输时,遇到数据错乱的问题。分析可能原因是进程调度和底层数据错误。最终解决方案是确保A+G共享同一个静态文件描述符,从而解决文件偏移量同步导致的数据混乱。总结了文件描述符在不同进程和线程中的行为特性。

使用cypress平台上时,调试A+G sensor时,通过HID协议在Android上枚举出hid的设备文件,因为A+G是一体的,所以cypress将A+G的数据通过一个HID通道数据发送,android层主动发送取数据的命令,cpress 这面将数据发送到HID设备文件中,但是遇到有时候A+G的数据错乱,但是有时候又不会。

  1. while (true) {
  2.                while (eventQue.size() > 0 && eventNum <= count) {
  3.                        data[eventNum] = eventQue.front();
  4.                        eventQue.pop();
  5.                        eventNum++;
  6.                }
  7.                if (eventNum > 0)
  8.                        return eventNum;
  9.                num = poll(mModule.pollfds, mModule.count+1, -1);
  10.                if (num <= 0) {
  11.                    err = errno;
  12.                    LOGE("HidSensors: sensor hal poll error: %d %s", err, strerror(err));
  13.                    return -err;
  14.                }
  15.                usleep(50 * 1000);
  16.                for (int i = 0; i < mModule.count+1; i++) {
  17.                    if (mModule.pollfds[i].revents & POLLIN) {
  18.                        if(i == 0){
  19.                            num = read(mModule.pollfds[0].fd,pipedata,sizeof(pipedata));
  20.                            if (num <= 0) {
  21.                                err = errno;
  22.                                LOGE("HidSensors: sensor hal read error: %d %s", err, strerror(err));
  23.                                return -err;
  24.                            }
  25.                            mModule.pollfds[pipedata[0]].fd = pipedata[2];
  26.                            LOGI("HidSensor: sensor hal fd = %d", pipedata[2]);
  27.                        }
  28.                        else
  29.                            mModule.sensors[i-1]->getData(eventQue);
  30.                    }
  31.                    else if (mModule.pollfds[i].revents != 0){
  32.                        mModule.pollfds[i].fd = -1;
  33.                        LOGE("HidSensors: sensor hal poll event error: %d fd: %d type: %d", mModule.pollfds[i].revents, mModule.pollfds[i].fd, mModule.sensors[i-1]->getDevice().getType());
  34.                    }
  35.                    mModule.pollfds[i].revents = 0;
  36.                   }
  37.        }
  38.        return -1;
mModule 中存放主要的数据结构,循环中会调用
  1. mModule.sensors[i-1]->getData(eventQue);

因为数据错乱的原因:我们分析有以下原因:

1.不同的进程调度,怀疑理由:在PC端开不同的线程读取数据,会发生读出的数据错乱,但是很显然,循环是一个线层,通过加锁也无法避免看来不是这个原因。

2.底层数据错误,实际通过PC端数据顺序读取不会出现问题。

后来突然想到每个sensor的实例都要enable一次,enable函数会打开hid的设备文件,意味着A和G的设备描述符不同的,虽然打开文件相同。应该是文件读写指针不对,后来定义了一个静态fd文件描述符,A+G共享一个,后来成功解决数据错乱的原因

结论:

 1. 由于进程级文件描述符表的存在,不同的进程中会出现相同的文件描述符,它们可能指向同一个文件,也可能指向不同的文件    

 2. 两个不同的文件描述符,若指向同一个打开文件句柄,将共享同一文件偏移量。因此,如果通过其中一个文件描述符来修改文件偏移量(由调用read()、write()或lseek()所致),那么从另一    个描述符中也会观察到变化,无论这两个文件描述符是否属于不同进程,还是同一个进程,情况都是如此。

3.但是在同一线程中不会同步偏移量。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值