media_entity_cleanup(&sd->entity);//销毁级联的entity pad//set private datav4l2_set_subdevdata(&dev->sd, dev);//如果是i2c client设备,还可以用如下api设置 private datastaticinlinevoidi2c_set_clientdata(structi2c_client *dev,void*data){ dev_set_drvdata(&dev->dev, data); }staticinlinevoid*...
对于常用的i2c_client结构体,i2c_set_clientdata函数可用于保存一个v4l2_subdev指针,i2c_get_clientdata可以获取一个v4l2_subdev指针;对于其他总线可能需要使用其他相关函数。 [include/media/v4l2-subdev.h]// 将i2c_client的指针保存到v4l2_subdev结构体的dev_priv成员中staticinlinevoidv4l2_set_subdevdata(structv4l2...
每个子设备驱动程序必须包含一个v4l2_subdev结构。可以使用v4l2_set_subdevdata和i2c_set_clientdata等函数来存储和访问底层设备数据。顶层的v4l2_subdev_ops结构包含指向各类别ops结构的指针,每个类别都有自己的ops结构,限制了函数指针的数量并方便添加新操作。初始化与集成:初始化v4l2_subdev结构并将其与...
每个子设备驱动程序必须包含一个v4l2_subdev结构,并且可以使用v4l2_set_subdevdata()和i2c_set_clientdata()等函数来存储和访问底层设备数据。顶层的v4l2_subdev_ops结构包含指向各类别ops结构的指针,每个类别都有自己的ops结构,限制了函数指针的数量并方便添加新操作。在实际驱动程序中,初始化v4l2_subdev...
static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p) { sd->dev_priv = p; } static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd) { return sd->dev_priv; } 设置/获取host私有数据 static inline void v4l2_set_subdev_hostdata(struct v4l2_subdev *sd, vo...
control's drvdata points to the subdev */ platform_set_drvdata(pdev, &priv->subdev); /* Set the control device reference */ icd->control = &pdev->dev; ici = to_soc_camera_host(icd->parent); v4l2_subdev_init(&priv->subdev, &platform_subdev_ops); v4l2_set_subdevdata(&priv->subd...
v4l2_set_subdevdata(&priv->subdev, p); strncpy(priv->, dev_name(&pdev->dev), V4L2_SUBDEV_NAME_SIZE); ret = v4l2_device_register_subdev(&ici->v4l2_dev, &priv->subdev); if (ret) goto evdrs; return ret; evdrs: platform_set_drvdata(pdev, NULL); ...
v4l2_get_subdevdata(sd); struct camera *priv = to_camera(sd); unsigned int val = 0; int ret = 0; dev_dbg(&client->dev, "%s: 0x%llx\n", __func__, reg->reg); ret = regmap_read(priv->regmap, reg->reg & 0xffff, &val); if...
如果在调用v4l2_device_register前已经设置好了,则不会被修改。如果dev为NULL,则必须在调用v4l2_device_register前设置v4l2_dev->name。可以基于驱动名和驱动的全局atomic_t类型的实例编号,通过v4l2_device_set_name()设置name。 这样会生成类似ivtv0、ivtv1等名字。若驱动名以数字结尾,则会在编号和驱动名间插入一...
{ - struct i2c_client *client = v4l2_get_subdevdata(sd); struct au8522_state *state = to_state(sd); - if (!v4l2_chip_match_i2c_client(client, ®->match)) - return -EINVAL; - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; au8522_writereg(state, reg->reg, reg->val & 0x...