rk3188--7.android gsensor驱动分析

g_sensor好像很简单,就是注册i2c设备,然后通过一个任务队列,每隔delay时间向上报x,y,z数据.
在drivers/input/sensors/accel/bma2x2.c中
module_init(BMA2X2_init);
static int __init BMA2X2_init(void)
{
//注册了一个i2c设备驱动
return i2c_add_driver(&bma2x2_driver);
}
在probe函数中
static int bma2x2_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
int err = 0;
int tempvalue;
unsigned char tmp_chip_id;
struct input_dev *dev;

struct bma2x2_data *data = kzalloc(sizeof(struct bma2x2_data), GFP_KERNEL);
//获取设备的具体型号
tempvalue = i2c_smbus_read_word_data(client, BMA2X2_CHIP_ID_REG);
tmp_chip_id = tempvalue&0x00ff;
switch (tmp_chip_id) {
case BMA255_CHIP_ID:
    data->sensor_type = BMA255_TYPE;
    break;
case BMA250E_CHIP_ID:
    data->sensor_type = BMA250E_TYPE;
    break;
case BMA222E_CHIP_ID:
    data->sensor_type = BMA222E_TYPE;
    break;
case BMA280_CHIP_ID:
    data->sensor_type = BMA280_TYPE;
    break;
default:
    data->sensor_type = -1;
}

if (data->sensor_type != -1) {
    data->chip_id = tmp_chip_id;
} else{
    err = -ENODEV;
    goto kfree_exit;
}
i2c_set_clientdata(client, data);
data->bma2x2_client = client;
mutex_init(&data->value_mutex);
mutex_init(&data->mode_mutex);
mutex_init(&data->enable_mutex);
bma2x2_set_bandwidth(client, BMA2X2_BW_SET);
bma2x2_set_range(client, BMA2X2_RANGE_SET);
bma2x2_set_Int_Enable(client, 8, 1);
bma2x2_set_Int_Enable(client, 10, 1);
bma2x2_set_Int_Enable(client, 11, 1);

INIT_DELAYED_WORK(&data->work, bma2x2_work_func);
atomic_set(&data->delay, BMA2X2_MAX_DELAY);       //将delay设为8ms
atomic_set(&data->enable, 0);

dev = input_allocate_device();
dev->name = SENSOR_NAME;
dev->id.bustype = BUS_I2C;

input_set_capability(dev, EV_REL, LOW_G_INTERRUPT);
input_set_capability(dev, EV_REL, HIGH_G_INTERRUPT);
input_set_capability(dev, EV_REL, SLOP_INTERRUPT);
input_set_capability(dev, EV_REL, DOUBLE_TAP_INTERRUPT);
input_set_capability(dev, EV_REL, SINGLE_TAP_INTERRUPT);
input_set_capability(dev, EV_ABS, ORIENT_INTERRUPT);
input_set_capability(dev, EV_ABS, FLAT_INTERRUPT);
input_set_abs_params(dev, ABS_X, ABSMIN, ABSMAX, 0, 0);
input_set_abs_params(dev, ABS_Y, ABSMIN, ABSMAX, 0, 0);
input_set_abs_params(dev, ABS_Z, ABSMIN, ABSMAX, 0, 0);

input_set_drvdata(dev, data);

input_register_device(dev);

data->input = dev;

schedule_work(&data->work);

return 0;

}

static int bma2x2_read_accel_xyz(struct i2c_client *client, signed char sensor_type, struct bma2x2acc *acc)
{
int comres = 0;
unsigned char data[6];
comres = bma2x2_smbus_read_byte_block(client, BMA2X2_ACC_X12_LSB__REG, data, 6);
acc->x = (data[1]<<8)|data[0];
acc->y = (data[3]<<8)|data[2];
acc->z = (data[5]<<8)|data[4];

return comres;

}

static void bma2x2_work_func(struct work_struct *work)
{
struct bma2x2_data bma2x2 = container_of((struct delayed_work )work, struct bma2x2_data, work);
static struct bma2x2acc acc;
unsigned long delay = msecs_to_jiffies(atomic_read(&bma2x2->delay));
bma2x2_read_accel_xyz(bma2x2->bma2x2_client, bma2x2->sensor_type, &acc);
input_report_abs(bma2x2->input, ABS_X, -acc.y);
input_report_abs(bma2x2->input, ABS_Y, acc.x);
input_report_abs(bma2x2->input, ABS_Z, acc.z);
input_sync(bma2x2->input);
schedule_delayed_work(&bma2x2->work, delay); //每隔8ms上报一次
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Rockchip RK3566是一款由Rockchip推出的高性能应用处理器,其集成了四核ARM Cortex-A55 CPU和ARM Mali-G52 GPU。在移植U-Boot 2023.04时,我们需要考虑以下几个方面的工作: 1. 了解RK3566芯片的硬件架构和技术规格,包括处理器核心、内存控制器、外设接口等。这将有助于理解U-Boot如何与硬件交互,并进行相应的配置。 2. 下载并准备U-Boot 2023.04的源代码。在Rockchip官方网站或开源社区中可以找到最的U-Boot源代码。将其下载并解压到开发机上。 3. 设置交叉编译环境。因为U-Boot是一个跨平台的项目,所以需要配置适合RK3566的交叉编译器,确保能够正确编译U-Boot源代码。 4. 配置U-Boot。根据RK3566的硬件架构和技术规格,需要进行相应的配置,包括处理器、内存、外设等设置。这些设置在U-Boot的配置文件中进行,可以根据需求进行修改。 5. 编译U-Boot。在配置好U-Boot后,使用交叉编译器编译U-Boot源代码。编译完成后,将生成的U-Boot二进制文件烧录到RK3566的启动设备上,如eMMC或SD卡。 6. 测试U-Boot。将准备好的启动设备插入RK3566开发板中,根据开发板的启动方式,进入U-Boot命令行界面。在命令行界面中可以进行各种操作和调试,如加载内核、启动操作系统等。 7. 调试和优化。在移植和测试U-Boot过程中,可能会出现一些问题和不稳定的情况。需要通过调试和优化来解决这些问题,确保U-Boot的正常运行和稳定性。 总之,移植U-Boot 2023.04到Rockchip RK3566需要了解芯片的硬件架构和技术规格,配置和编译U-Boot源代码,进行测试和调试。这样可以确保U-Boot能够与RK3566正常交互,并为后续的操作系统加载和启动提供基础支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值