Video 4 Linuxフレームワーク概要(2)-v 4 l 2_device


V 4 L 2 PCIベースドライバインスタンスstruct v 4 l 2_device (1)
(注:最初のステップは、まずあなたのブリッジ駆動(例えば、ここではPCIデバイス)に基づいて、v 4 l 2デバイスオブジェクトを追加します.通常、v 4 l 2デバイスは独立して存在しません.)
#include      //   V4L2             
#include 
MODULE_DESCRIPTION("V4L2 PCI Skeleton Driver");
MODULE_AUTHOR("Hans Verkuil");
MODULE_LICENSE("GPL v2");
MODULE_DEVICE_TABLE(pci, skeleton_pci_tbl);
struct skeleton {
struct pci_dev *pdev;
struct v4l2_device v4l2_dev;    //v4l2    ,   ,        ,
                                 //     v4l2           ,      
                                 //         
};
static const struct pci_device_id skeleton_pci_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_FOO, PCI_DEVICE_ID_BAR) },
{ 0, }
};
    //    
   //    

static struct pci_driver skeleton_driver = {
.name = KBUILD_MODNAME,
.probe = skeleton_probe,
.remove = skeleton_remove,
.id_table = skeleton_pci_tbl,
};
module_pci_driver(skeleton_driver); 

struct v4l2_device (2)
(注:ステップ2、登録とログアウト関数の追加)
static int skeleton_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
struct skeleton *skel;
int ret;
pci_enable_device(pdev);
pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
skel = devm_kzalloc(&pdev->dev, sizeof(struct skeleton), GFP_KERNEL);
if (!skel)
return -ENOMEM;
skel->pdev = pdev;
ret = v4l2_device_register(&pdev->dev, &skel->v4l2_dev); //      ,        
if (ret)
goto disable_pci;
dev_info(&pdev->dev, "V4L2 PCI Skeleton Driver loaded
"); return 0; disable_pci: pci_disable_device(pdev); return ret; } static void skeleton_remove(struct pci_dev *pdev) { struct v4l2_device *v4l2_dev = pci_get_drvdata(pdev); struct skeleton *skel = container_of(v4l2_dev, struct skeleton, v4l2_dev); v4l2_device_unregister(&skel->v4l2_dev); // register , pci_disable_device(skel->pdev); }

struct v 4 l 2_をまとめますdevice:
●まず、V 4 L 2駆動のトップクラスの構造である.
●Misnomer:より良い名前はv 4 l 2_root(訳注:この点についてVerkuil本人とカーネルコミュニティは修正を提出したが、関連する修正が多すぎてrejectされた).
●v4l2_device_(un)registerはv 4 l 2_を呼び出すべきであるroot_init/exit.
・保守サブデバイス(v 4 l 2_subdev)リスト.
・サブデバイスに対するnotify()コールバックを有する.
・最後のデバイス参照が解放されるとrelease()コールバックが呼び出される.