v4l2 probe时各个device的操作顺序
dev_set_drvdata(&pdev->dev, myisp)
“在现代嵌入式 Linux(尤其是 ARM)中,不再硬编码 platform_device,而是通过 设备树(Device Tree) 描述硬件”。
myisp就是驱动模块对应的自定义设备;
这里把myisp结构体赋值给platform_device->dev->driver_data。
通过devm_xxx从设备树获取参数
获取:寄存器地址、irq、clock等;
media_device_init(struct media_device *mdev)
media_device管理着链路信息,要先对其初始化,给后面的注册v4l2_devcie使用;
因为media_device描述了整个链路信息,位于高级的层级,所以注册一定要放在最后
v4l2_device
v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev)
v4l2_subdev
v4l2_subdev_init(struct v4l2_subdev *sd, const struct v4l2_subdev_ops *ops);
// 初始化与该v4l2_subdev连接的pad
// v4l2_subdev与多少个video_device相连,会有多少个pad
media_entity_pads_init(struct media_entity *entity, u16 num_pads, struct media_pad *pads);
v4l2_device_register_subdev(struct *v4l2_device, struct v4l2_subdev *sd);
video_device
// 初始化video的video buffer queue
vb2_queue_init(queue);
// 初始化与该video_device连接的pad
// video_devcie一般只有一个pad:输出设备有一个source pad,捕获设备有一个sink pad
media_entity_pads_init(entity, 1, &pad)
video_register_device(struct video_device *vdev, VFL_TYPE_VIDEO);
// 这里把video_device抽象为node,所以data是node
video_set_drvdata(vdev, node);
// 创建pad之间的link关系
// 也可以在v4l2_subdev中创建,看谁方便获取所有的pad了
media_create_pad_link();
media_device_register(mdev)
media_device描述了整个链路信息,位于高级的层级,所以注册一定要放在最后
destroy
有人这么做,但是未必是唯一顺序:
- v4l2_device_unregister_subdev()
- media_device_unregister()
- video_unregister_device()
- media_device_cleanup()
- v4l2_device_unregister()
本文来自博客园,作者:moonのsun,转载请注明原文链接:https://www.cnblogs.com/moon-sun-blog/p/19214461

浙公网安备 33010602011771号