基于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的值。