On 09/04/2016 10:05 PM, Helen Koike wrote: > Hi Hans, > > Thank you for your review. > > On 2016-08-22 07:57 AM, Hans Verkuil wrote: >> Hi Helen, >> >> A few small code comments are below. >> >> Note that if I try to capture I see these two messages in the kernel log: >> >> [588197.368145] vimc vimc.0: Entity type for entity Sensor A was not initialized! >> [588197.368169] vimc vimc.0: Entity type for entity Sensor B was not initialized! > > > I correct this, I am sending it in v6. > > >> >> I also can't capture anything: v4l2-ctl --stream-mmap just sits there, waiting for >> frames, I guess. >> >> I'm not sure if that has to do with the two warnings above. > > > This is weird, v4l2-ctl --stream-mmap works for me even with those > messages above, could you try again with the v6 please? Yup, v6 fixed it for me. Not sure what was the cause, but it's now working fine. Once I have Laurent's Ack I'll take it. Thanks for all your hard work, I'm sure you expected this to get in sooner, but better late than never! Hans > > >> >> I am assuming that the initial pipeline is correct and that you should be able >> to start streaming. If not, then attempting to start streaming should return an >> error. >> >> On 08/18/2016 12:09 AM, Helen Koike wrote: >>> From: Helen Fornazier <helen.fornazier@xxxxxxxxx> >>> >>> First version of the Virtual Media Controller. >>> Add a simple version of the core of the driver, the capture and >>> sensor nodes in the topology, generating a grey image in a hardcoded >>> format. >>> >>> Signed-off-by: Helen Koike <helen.koike@xxxxxxxxxxxxx> >> >> <snip> >> >>> +static int vimc_cap_querycap(struct file *file, void *priv, >>> + struct v4l2_capability *cap) >>> +{ >>> + struct vimc_cap_device *vcap = video_drvdata(file); >>> + >>> + strlcpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver)); >>> + strlcpy(cap->card, KBUILD_MODNAME, sizeof(cap->card)); >>> + snprintf(cap->bus_info, sizeof(cap->bus_info), >>> + "platform:%s", vcap->v4l2_dev->name); >>> + >>> + cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; >> >> This line should be moved to vimc_cap_create: >> >> vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; >> >> This is new. The v4l2 core will fill in the querycap capabilities for you >> based on vdev->device_caps. >> >>> + >>> + return 0; >>> +} >> >> <snip> >> >>> +static int vimc_device_register(struct vimc_device *vimc) >>> +{ >>> + unsigned int i; >>> + int ret = 0; >>> + >>> + /* Allocate memory for the vimc_ent_devices pointers */ >>> + vimc->ved = devm_kcalloc(vimc->mdev.dev, vimc->pipe_cfg->num_ents, >>> + sizeof(*vimc->ved), GFP_KERNEL); >>> + if (!vimc->ved) >>> + return -ENOMEM; >>> + >>> + /* Register the media device */ >>> + ret = media_device_register(&vimc->mdev); >>> + if (ret) { >>> + dev_err(vimc->mdev.dev, >>> + "media device register failed (err=%d)\n", ret); >>> + return ret; >>> + } >>> + >>> + /* Link the media device within the v4l2_device */ >>> + vimc->v4l2_dev.mdev = &vimc->mdev; >>> + >>> + /* Register the v4l2 struct */ >>> + ret = v4l2_device_register(vimc->mdev.dev, &vimc->v4l2_dev); >>> + if (ret) { >>> + dev_err(vimc->mdev.dev, >>> + "v4l2 device register failed (err=%d)\n", ret); >>> + return ret; >>> + } >>> + >>> + /* Initialize entities */ >>> + for (i = 0; i < vimc->pipe_cfg->num_ents; i++) { >>> + struct vimc_ent_device *(*create_func)(struct v4l2_device *, >>> + const char *const, >>> + u16, >>> + const unsigned long *); >>> + >>> + /* Register the specific node */ >>> + switch (vimc->pipe_cfg->ents[i].node) { >>> + case VIMC_ENT_NODE_SENSOR: >>> + create_func = vimc_sen_create; >>> + break; >>> + >>> + case VIMC_ENT_NODE_CAPTURE: >>> + create_func = vimc_cap_create; >>> + break; >>> + >>> + /* TODO: Instantiate the specific topology node */ >>> + case VIMC_ENT_NODE_INPUT: >>> + case VIMC_ENT_NODE_DEBAYER: >>> + case VIMC_ENT_NODE_SCALER: >>> + default: >>> + /* TODO: remove this when all the entities specific >>> + * code are implemented >>> + */ >>> + create_func = vimc_raw_create; >>> + break; >>> + } >>> + >>> + vimc->ved[i] = create_func(&vimc->v4l2_dev, >>> + vimc->pipe_cfg->ents[i].name, >>> + vimc->pipe_cfg->ents[i].pads_qty, >>> + vimc->pipe_cfg->ents[i].pads_flag); >>> + if (IS_ERR(vimc->ved[i])) { >>> + ret = PTR_ERR(vimc->ved[i]); >>> + vimc->ved[i] = NULL; >>> + goto err; >>> + } >>> + >>> + /* Set use_count to keep track of the ved structure */ >>> + vimc->ved[i]->ent->use_count = i; >>> + } >>> + >>> + /* Initialize the links between entities */ >>> + for (i = 0; i < vimc->pipe_cfg->num_links; i++) { >>> + const struct vimc_ent_link *link = &vimc->pipe_cfg->links[i]; >>> + >>> + ret = media_create_pad_link(vimc->ved[link->src_ent]->ent, >>> + link->src_pad, >>> + vimc->ved[link->sink_ent]->ent, >>> + link->sink_pad, >>> + link->flags); >>> + if (ret) >>> + goto err; >>> + } >>> + >>> + /* Expose all subdev's nodes*/ >>> + ret = v4l2_device_register_subdev_nodes(&vimc->v4l2_dev); >>> + if (ret) { >>> + dev_err(vimc->mdev.dev, >>> + "vimc subdev nodes registration failed (err=%d)\n", >>> + ret); >>> + goto err; >>> + } >>> + >>> + return 0; >>> + >>> +err: >>> + /* Destroy de so far created topology */ >> >> s/de/the/ >> >>> + vimc_device_unregister(vimc); >>> + >>> + return ret; >>> +} >> >> Regards, >> >> Hans >> > > > Regards, > Helen > -- > To unsubscribe from this list: send the line "unsubscribe linux-media" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html