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描述了整个链路信息,位于高级的层级,所以注册一定要放在最后