Linux v4l2架构学习总链接
entity之间什么时候创建连接?怎么连接?
这就要牵扯到subdev注册这部分了
看下面2篇文章
基于RV1126平台imx291分析 --- rkcif_mipi注册
v4l2_async_subdev_notifier_register 分析
在函数v4l2_async_notifier_try_all_subdevs中,会从subdev_list上找到sd和当前设备notifier->waiting上asd进行匹配
这里分四步分析:
一,rkcif_mipi与mipi csi
我们知道mipi csi dts中remote-endpoint是指向rkciff_mipi的,所以2者是可以匹配到的
v4l2_async_notifier_try_all_subdevs() -> v4l2_async_match_notify() -> v4l2_async_notifier_call_bound()
这里会调用到rkcif_mipi中的notify->bound函数
static const struct v4l2_async_notifier_operations subdev_notifier_ops = {
.bound = subdev_notifier_bound,
.complete = subdev_notifier_complete,
};
static int subdev_notifier_bound(struct v4l2_async_notifier *notifier,
struct v4l2_subdev *subdev,
struct v4l2_async_subdev *asd)
{
struct rkcif_device *cif_dev = container_of(notifier,
struct rkcif_device, notifier);
struct rkcif_async_subdev *s_asd = container_of(asd,
struct rkcif_async_subdev, asd);
if (cif_dev->num_sensors == ARRAY_SIZE(cif_dev->sensors))
return -EBUSY;
cif_dev->sensors[cif_dev->num_sensors].lanes = s_asd->lanes;
cif_dev->sensors[cif_dev->num_sensors].mbus = s_asd->mbus;
cif_dev->sensors[cif_dev->num_sensors].sd = subdev;
++cif_dev->num_sensors;
v4l2_dbg(1, rkcif_debug, subdev, "Async registered subdev\n");
return 0;
}
对于rkcif_mipi的bound函数来说,好像并没有entity相关的操作,这里只是把mipi csi的subdev放入cif_dev->sensors的数组中存储。
这里是很有用的,后面会分析到。
实际上entity是在complete中操作的,这个是所有notifier中最后被操作的,所以我们也最后再分析。