阅读完 RK3588 Androd12平台 JNI 和 HAL 间通信深入理解-CSDN博客
我们了解了JNI 和 HAL 层间的通信方式,这一节我们继续讲HAL 和 驱动层的通信。
首先我们讲下RK3588 平台的sensor 驱动软件架构。
一、RK3588 平台安卓12 的sensor驱动软件架构
RK3588平台没有使用单独sensorhub 架构,而是使用的是金典的安卓5层架构:分别为Applications、Framework、Native、HAL和Kernel五大层次,sensor驱动放在kernel层。

二、RK3588平台安卓12 HAL 和 驱动层的通信
这里我们看到HAL 层和 驱动数据传输使用的是input 子系统, 上层enable、disable、setRate 使用的是ioctl 机制。

这里着重介绍下驱动的两个结构体, 一个是struct sensor_operate 用来注册一个i2c device,另一个是struct file_operations misc 设备驱动接口,相当与hal 层直接与驱动层进行通信,不经过common 层。
//驱动注册一个i2c device interface
static struct sensor_operate gsensor_ops = {
.name = MIR3DA_DRV_NAME,
.type = SENSOR_TYPE_ACCEL,
.id_i2c = ACCEL_ID_MIR3DA,
.read_reg = -1,
.read_len = 0,
.id_reg = -1,
.id_data = 0,
.precision = MIR3DA_PRECISION,
.ctrl_reg = -1,
.int_status_reg = 0x00,
.range = {-MIR3DA_RANGE, MIR3DA_RANGE},
.trig = IRQF_TRIGGER_LOW | IRQF_ONESHOT,
.active = sensor_active,
.init = sensor_init,
.report = sensor_report_value,
.suspend = sensor_suspend,
.resume = sensor_resume,
};
static int gsensor_mir3da_probe(struct i2c_client *client,
const struct i2c_device_id *devid)
{
MI_FUN;
return sensor_register_device(client, NULL, devid, &gsensor_ops);
}
//dts 中name 和 id table中一致调用驱动probe函数
static const struct i2c_device_id gsensor_mir3da_id[] = {
{"gs_da223", ACCEL_ID_MIR3DA},
{}
};
//注册一个i2c_driver interface
static struct i2c_driver gsensor_mir3da_driver = {
.probe = gsensor_mir3da_probe,
.remove = gsensor_mir3da_remove,
.shutdown = sensor_shutdown,
.id_table = gsensor_mir3da_id,
.driver = {
.name = "gsensor_mir3da",
#ifdef CONFIG_PM
.pm = &sensor_pm_ops,
#endif
},
};
/* Misc device interface*/
static const struct file_operations mir3da_misc_fops = {
.owner = THIS_MODULE,
.open = mir3da_misc_open,
.release = mir3da_misc_release,
.unlocked_ioctl = mir3da_misc_ioctl,
};
static struct miscdevice misc_mir3da = {
.minor = MISC_DYNAMIC_MINOR,
.name = MIR3DA_MISC_NAME,
.fops = &mir3da_misc_fops,
};
//sensor_init()中调用注册一个misc 设备, hal层操作节点必须使用和驱动一致的name
/* Misc device interface Register */
ret = misc_register(&misc_mir3da);
//设备编译成模块加载到kernel
module_i2c_driver(gsensor_mir3da_driver);

3178

被折叠的 条评论
为什么被折叠?



