重力感应BMA150调试

基于BMA023的代码调试BMA150模块

i2c_board_info 设置 名字与地址 

I2C_BOARD_INFO("bma150",0x38),
.irq = IRQ_EINT(30),

这样在bma023_init     i2c_add_driver(&bma023_i2c_driver);

进入probe     bma023_read_reg(client, BMA023_CHIP_ID_REG);

读取ID  是否正确,

建立工作函数v8sensor_bma023_work_func 读取x y z的坐标, bma023_xyz_read_reg(client, buffer, 6);  buffer指向0x02为寄存器x的位置开始读取6位,进行换算得值。

建立计时函数 多长时间执行 工作函数进行读值sensor->timer.function = v8sensor_bma023_timer_func;。

注册 bma023_register_input_device 进行上报。

input_report_abs(sensor->input_dev, ABS_X, sensor->data.x);
input_report_abs(sensor->input_dev, ABS_Y, sensor->data.y);
input_report_abs(sensor->input_dev, ABS_Z, sensor->data.z);

打印发现已经能正确读取到xyz的值,而且转动机器值也会线性变化,但APK软件不会发生转动。

查看别人的文章:2.实现sensor.so与driver之间的ioctl时遇到的问题:
sensor.so中pull数据时打开的文件是input子系统中逻辑input设备的表示层即event handler层中的evdev.c创建的,如果通过此文件描述符实现ioctl,则只能实现与event handler通信,无法实际控制
Gsnsor driver. event handler层与物理设备的实际driver是通过input.c联系起来的,但input.c中没有实现将event handler层的ioctl传递到实际driver中。
故采用另创建一个设备节点用来实现sensor.so与driver之间的ioctl.

在probe 加入misc_register(&bma023_device);

static struct miscdevice bma023_device = {
.minor = MISC_DYNAMIC_MINOR,
.name = "bma150",
.fops = &v8asensor_bma023_fops,
};

    .ioctl       = v8sensor_bma023_ioctl,

通过v8sensor_bma023_ioctl 把坐标发送到上层。

打印发现此时会实时调用,

           bma023_read_xyz(bma150_client, data);

if(copy_to_user((struct bma023_data *) arg, (struct bma023_data *)data, 6)!=0)
{
     printk("copy_to_user not ok\n");
}    

这样功能就实现了。



还有一些地方不明白,请高手告诉我什么原理。

    init.rc

   添加 chmod 666 /dev/bma150

  v8sensor_bma023_ioctl 这里的cmd怎么通过上层发送过来,如何设置cmd的值。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值