RK3588 Androd12平台 HAL 和 驱动间通信深入理解

阅读完 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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值