Xilinx Linux V4L2視頻管道(Video Pipeline)驅(qū)動(dòng)程序分析

1. Author

付漢杰 hankf@xilinx.com 2020-04-13

本文也發(fā)布到了 https://www.cnblogs.com/hankfu/p/12711957.html

2. 概述

Xilinx提供了完整的V4L2的驅(qū)動(dòng)程序屋厘,Xilinx V4L2 driver侈咕。處于最頂層的驅(qū)動(dòng)程序是V4L2框架的視頻管道(Video pipeline)驅(qū)動(dòng)程序瞳筏,也叫橋驅(qū)動(dòng)程序(bridge driver),主要代碼在文件xilinx-vipp.c中。在V4L2框架中,整個(gè)視頻管道(Video pipeline)可以通過媒體設(shè)備(/dev/media)配置,流媒體可以通過視頻設(shè)備(/dev/video)控制。這兩種設(shè)備句各,都是在視頻管道(Video pipeline)驅(qū)動(dòng)程序里創(chuàng)建的。所以晴叨,理解V4L2的管道(pipeline)驅(qū)動(dòng)程序是理解Xilinx所有Video IP 在Linux下工作情況的基礎(chǔ)凿宾。

3. 文件

3.1. C文件

Xilinx的V4L2的管道(pipeline)驅(qū)動(dòng)程序在下面四個(gè)文件中。

  1. drivers\media\platform\xilinx\xilinx-vipp.c
  2. drivers\media\platform\xilinx\xilinx-vipp.h
  3. drivers\media\platform\xilinx\xilinx-dma.c
  4. drivers\media\platform\xilinx\xilinx-dma.h

3.2. 設(shè)備樹(devicetree)

設(shè)備樹(devicetree)里含有整個(gè)視頻管道(video pipeline)的配置兼蕊,對(duì)應(yīng)的文檔在Documentation/devicetree/bindings/media/xilinx/xlnx,video.txt初厚。

下面是一個(gè)設(shè)備樹(devicetree)的例子。

axi_video_cap {
    compatible = "xlnx,axi-video";
    dmas = <&axi_vdma_1 1>, <&axi_vdma_3 1>;
    dma-names = "port0", "port1";
  
    ports {
        #address-cells = <1>;
        #size-cells = <0>;
  
        port@0 {
            reg = <0>;
            direction = "input";
            vcap0_in0: endpoint {
                remote-endpoint = <&scaler0_out>;
            };
        };
        port@1 {
            reg = <1>;
            direction = "input";
            vcap0_in1: endpoint {
                remote-endpoint = <&switch_out1>;
            };
        };
    };
};

3.3. 函數(shù)調(diào)用關(guān)系圖

xvipp 函數(shù)調(diào)用關(guān)系圖

4. 主要函數(shù)

4.1. 函數(shù)xvip_composite_probe()

函數(shù)xvip_composite_probe是整個(gè)驅(qū)動(dòng)的入口孙技,主要工作是初始化驅(qū)動(dòng)的數(shù)據(jù)結(jié)構(gòu)xvip_composite_device里的通用數(shù)據(jù)产禾,包括lock、list(entities和dmas)牵啦,再調(diào)用了xvip_composite_v4l2_init()和xvip_graph_init()亚情,最后調(diào)用platform_set_drvdata設(shè)置平臺(tái)設(shè)備platform_device里的當(dāng)前設(shè)備的數(shù)據(jù)指針。

4.2. 函數(shù)xvip_composite_v4l2_init()

函數(shù)xvip_composite_v4l2_init做的事情比較簡單哈雏,只是初始化了struct media_device楞件,設(shè)置了設(shè)備版本和model名稱、dev/mdev指針僧著,就調(diào)用了v4l2_device_register()注冊(cè)V4L2設(shè)備履因。

xvip_composite_v4l2_init的關(guān)鍵代碼如下:

    xdev->media_dev.dev = xdev->dev;
    strlcpy(xdev->media_dev.model, "Xilinx Video Composite Device",
        sizeof(xdev->media_dev.model));
    xdev->media_dev.hw_revision = 0;
    media_device_init(&xdev->media_dev);
    xdev->v4l2_dev.mdev = &xdev->media_dev;
    ret = v4l2_device_register(xdev->dev, &xdev->v4l2_dev);

4.3. 函數(shù)xvip_graph_init

函數(shù)xvip_graph_init是最重要的函數(shù),函數(shù)調(diào)用層次也最深盹愚。它首先調(diào)用xvip_graph_dma_init根據(jù)設(shè)備樹(devicetree)里的port信息初始化DMA通道,創(chuàng)建一個(gè)DMA的列表站故;再調(diào)用xvip_graph_parse在設(shè)備樹(devicetree)里分析子設(shè)備節(jié)點(diǎn),根據(jù)設(shè)備樹里"remote-endpoint"屬性創(chuàng)建一個(gè)Entity的列表;最后調(diào)用v4l2_async_notifier_register注冊(cè)異步處理函數(shù)皆怕。系統(tǒng)發(fā)現(xiàn)各個(gè)子設(shè)備(subdev)后,調(diào)用異步處理函數(shù)xvip_graph_notify_bound獲取子設(shè)備信息西篓。所有子設(shè)備(subdev)都被發(fā)現(xiàn)后愈腾,調(diào)用xvip_graph_notify_complete,為每個(gè)entity創(chuàng)建Link和V4L2子設(shè)備岂津,并注冊(cè)media設(shè)備虱黄。

xvip_graph_init的關(guān)鍵代碼如下:

    /* Init the DMA channels. */
    ret = xvip_graph_dma_init(xdev);

    /* Parse the graph to extract a list of subdevice DT nodes. */
    ret = xvip_graph_parse(xdev);

    /* Register the subdevices notifier. */
    num_subdevs = xdev->num_subdevs;
    subdevs = devm_kcalloc(xdev->dev, num_subdevs, sizeof(*subdevs), GFP_KERNEL);

    xdev->notifier.subdevs = subdevs;
    xdev->notifier.num_subdevs = num_subdevs;
    xdev->notifier.ops = &xvip_graph_notify_ops;
    ret = v4l2_async_notifier_register(&xdev->v4l2_dev, &xdev->notifier);

4.4. 函數(shù)xvip_graph_dma_init

xvip_graph_dma_init()自身比較簡單,先找到第一個(gè)"ports"子節(jié)點(diǎn)吮成,再找其中的所有"port"節(jié)點(diǎn)橱乱,并為每個(gè)"port"子節(jié)點(diǎn)執(zhí)行xvip_graph_dma_init_one()辜梳,從而將每個(gè)"port"子節(jié)點(diǎn)對(duì)應(yīng)的DMA添加到鏈表dmas中。

xvip_graph_dma_init的關(guān)鍵代碼如下:

    ports = of_get_child_by_name(xdev->dev->of_node, "ports");

    for_each_child_of_node(ports, port) {
        ret = xvip_graph_dma_init_one(xdev, port);
    }

4.5. 函數(shù)xvip_graph_dma_init_one

xvip_graph_dma_init_one()根據(jù)設(shè)備樹(devicetree)的"port"子節(jié)點(diǎn)的配置泳叠,找到DMA作瞄,并添加到鏈表"xdev->dmas"中。
xvip_graph_dma_init_one先讀取"port"子節(jié)點(diǎn)的屬性"direction"和"reg"屬性危纫。Devicetre的"port"節(jié)點(diǎn)中宗挥,要含有屬性“direction”和"reg"屬性;如果沒有屬性“direction”种蝶,會(huì)返回錯(cuò)誤契耿;如果沒有"reg"屬性,代碼會(huì)繼續(xù)螃征,但是功能會(huì)出錯(cuò)宵喂。屬性"direction"的值是"input"或者"output"。
xvip_graph_dma_init_one還為每個(gè)port分配struct xvip_dma会傲,再執(zhí)行xvip_dma_init()锅棕。
接下來,xvip_graph_dma_init_one把struct xvip_dma加入到隊(duì)列xdev->dmas淌山。
xvip_graph_dma_init_one還根據(jù)"direction"的值是"input"或者"output"裸燎,以及xvip_is_mplane的設(shè)置,選擇buffer類型泼疑。

xvip_graph_dma_init_one的關(guān)鍵代碼如下:

    // Read direction and reg properties
    ret = of_property_read_string(node, "direction", &direction);

    of_property_read_u32(node, "reg", &index);

    dma = devm_kzalloc(xdev->dev, sizeof(*dma), GFP_KERNEL);
    
    ret = xvip_dma_init(xdev, dma, type, index);
    
    list_add_tail(&dma->list, &xdev->dmas);

4.6. 函數(shù)xvip_dma_init

xvip_dma_init是核心的函數(shù)德绿,完成了最關(guān)鍵的任務(wù):初始化buffer隊(duì)列、申請(qǐng)DMA設(shè)備退渗、注冊(cè)Video設(shè)備移稳。
函數(shù)xvip_dma_init()先初始化struct xvip_dma的數(shù)據(jù)成員,包括dma->lock会油、dma->pipe.lock个粱、dma->queued_bufs、dma->queued_lock翻翩;再根據(jù)buffer類型都许,初始化v4l2_format里的像數(shù)點(diǎn)格式,struct v4l2_pix_format pix 或者struct v4l2_pix_format_mplane pix_mp嫂冻。接下來設(shè)置pad.flags為MEDIA_PAD_FL_SINK或者M(jìn)EDIA_PAD_FL_SOURCE胶征,調(diào)用media_entity_pads_init初始化初始化media entity。
函數(shù)xvip_dma_init()然后繼續(xù)初始化video_device的各種成員和操作函數(shù)桨仿,包括fops睛低、v4l2_dev、queue、vfl_type钱雷、vfl_dir骂铁、lock、和ioctl_ops急波。video_device的fops被設(shè)置為xvip_dma_fops从铲,ioctl_ops被設(shè)置為xvip_dma_ioctl_ops。
函數(shù)xvip_dma_init()再接著初始化buffer隊(duì)列struct vb2_queue queue澄暮,其中ops被設(shè)置為xvip_dma_queue_qops名段,mem_ops被設(shè)置為vb2_dma_contig_memops,執(zhí)行vb2_queue_init泣懊。
函數(shù)xvip_dma_init()再接著執(zhí)行dma_request_chan申請(qǐng)DMA設(shè)備伸辟,這是一個(gè)復(fù)雜和核心的函數(shù)。dma_request_chan()的第二個(gè)參數(shù)是DMA通道的名稱馍刮,名字是格式是"port%u"信夫,比如"port0",也就是設(shè)備樹的屬性"dma-names"里的字符串卡啰。其中of_dma_request_slave_channel()調(diào)用的of_find_property(np, "dmas", NULL)静稻,通過屬性"dmas",取得了dma匈辱。of_property_count_strings()計(jì)算屬性"dma-names"里的字符串個(gè)數(shù)振湾,也就是DMA的個(gè)數(shù)。然后根據(jù)DMA的個(gè)數(shù)亡脸,為每一個(gè)DMA執(zhí)行of_dma_match_channel()押搪。of_dma_match_channel (dev->of_node, "port%u", )取出"dma-names"的字符串,再和"port%u"對(duì)比浅碾,這是檢查名字是否對(duì)應(yīng)大州,如果一致,就用對(duì)應(yīng)的DMA垂谢,取得struct of_phandle_args dma_spec厦画,再把struct of_phandle_args dma_spec轉(zhuǎn)換為struct of_dma *ofdma。of_dma_xlate接下來轉(zhuǎn)換為struct dma_chan埂陆。of_dma_request_slave_channel使用了字符串"dmas"苛白。of_dma_match_channel()使用了字符串"dmas"和"dma-names"。所以Xilinx-vipp.c實(shí)現(xiàn)的"xlnx,video"設(shè)備的設(shè)備樹里的"dmas"和"dma-names"焚虱,"port0"是必須有的固定字符串,不能更改懂版;只有dmas后面的DMA phandle才可以更改鹃栽。
函數(shù)xvip_dma_init()最后執(zhí)行video_register_device注冊(cè)Video設(shè)備。

4.7. 函數(shù)xvip_graph_parse

函數(shù)xvip_graph_parse先調(diào)用xvip_graph_parse_one,找到直接的remote_port民鼓;然后再為每一個(gè)找到的remote_port執(zhí)行一次xvip_graph_parse_one薇芝。

4.8. 函數(shù)xvip_graph_parse_one

xvip_graph_parse_one()里先調(diào)用of_graph_get_next_endpoint(node, ep)取得下一個(gè)endpoint,然后再調(diào)用of_graph_get_remote_port_parent(ep) 得到remote_port的父節(jié)點(diǎn)丰嘉。of_graph_get_next_endpoint(node, ep)會(huì)先嘗試找子節(jié)點(diǎn)ports,再找到子節(jié)點(diǎn)port夯到,然后再在子節(jié)點(diǎn)port里找endpoint;讀取路徑是 { ports { port {endpoint } } }饮亏,其中ports是可選的耍贾。endpoint是port的子節(jié)點(diǎn),不管其內(nèi)部的屬性名稱路幸,所以也可以用屬性名稱remote-endpoint荐开。of_graph_get_remote_port_parent(ep)通過調(diào)用of_graph_get_remote_endpoint()得到remote_port,再調(diào)用of_graph_get_port_parent()得到父節(jié)點(diǎn)简肴。of_graph_get_remote_endpoint()里讀取了設(shè)備樹里的"remote-endpoint"屬性晃听。
xvip_graph_parse_one()再調(diào)用xvip_graph_find_entity(),在xdev->entities里檢查是否已經(jīng)包含對(duì)應(yīng)的entity砰识,如果已經(jīng)包含能扒,則跳過后續(xù)處理;如果沒沒有辫狼,則找到的remote_port的父節(jié)點(diǎn)初斑,存放到鏈表xdev->entities,并執(zhí)行操作xdev->num_subdevs++予借。
最后xdev->entities里包含了所有entity越平。后來xvip_graph_notify_complet會(huì)根據(jù)xdev->entities,為每個(gè)entity創(chuàng)建一個(gè)設(shè)備灵迫。

4.9. 函數(shù)xvip_graph_notify_bound

系統(tǒng)發(fā)現(xiàn)子設(shè)備(subdev)后秦叛,調(diào)用異步處理函數(shù)xvip_graph_notify_bound獲取子設(shè)備信息。xvip_graph_notify_bound根據(jù)設(shè)備樹節(jié)點(diǎn)瀑粥,匹配實(shí)體(entity)和子設(shè)備(subdev)挣跋;匹配成功后,再把子設(shè)備(subdev)的指針保存到實(shí)體(entity)狞换。

xvip_graph_notify_bound的關(guān)鍵代碼如下:

        entity->entity = &subdev->entity;
        entity->subdev = subdev;

4.10. 函數(shù)xvip_graph_notify_complete

系統(tǒng)所有子設(shè)備(subdev)都被發(fā)現(xiàn)后避咆,Linux會(huì)調(diào)用xvip_graph_notify_complete。xvip_graph_notify_complete調(diào)用xvip_graph_build_one為每個(gè)entity創(chuàng)建Link修噪;調(diào)用xvip_graph_build_dma做Create links for DMA channels查库;并為每個(gè)實(shí)體(entity)注冊(cè)V4L2子設(shè)備v4l2_device_register_subdev_nodes ;最后調(diào)用media_device_register注冊(cè)media設(shè)備黄琼。

4.11. 函數(shù)xvip_graph_build_one

函數(shù)xvip_graph_build_dma在每個(gè)entity及其遠(yuǎn)端模塊之間創(chuàng)建Link樊销。
函數(shù)xvip_graph_build_one先調(diào)用函數(shù)of_graph_get_next_endpoint從設(shè)備的設(shè)備樹里找到下一個(gè)endpoint(struct device_node)。與之前描述一樣,of_graph_get_next_endpoint的讀取路徑是 { ports { port {endpoint} } }围苫,endpoint是port的子節(jié)點(diǎn)裤园,不管其內(nèi)部的屬性名稱,所以也可以用屬性名稱remote-endpoint剂府。函數(shù)xvip_graph_build_dma接著調(diào)用v4l2_fwnode_parse_link拧揽,得到對(duì)應(yīng)的link(struct v4l2_fwnode_link)。接著根據(jù)link中的端口號(hào)(local_port)取得pad信息腺占,判斷出是否是目的端(sink)端口淤袜;如果是目的端(sink)端口,則忽略湾笛。另外還忽略DMA饮怯,它由xvip_graph_build_dma處理。接下來再調(diào)用函數(shù)xvip_graph_find_entity嚎研,根據(jù)link中的遠(yuǎn)端節(jié)點(diǎn)(remote_node)蓖墅,得到遠(yuǎn)端的entity。最后調(diào)用media_create_pad_link临扮,當(dāng)前entity作為源端(source)论矾,遠(yuǎn)端entity作為目的端(sink)的media_entity和media_pad,創(chuàng)建媒體pad的鏈接(link)

4.12. 函數(shù)xvip_graph_build_dma

函數(shù)xvip_graph_build_dma為DMA模塊及其遠(yuǎn)端模塊之間創(chuàng)建Link杆勇。
函數(shù)xvip_graph_build_dma先調(diào)用函數(shù)of_graph_get_next_endpoint從設(shè)備的設(shè)備樹里找到下一個(gè)endpoint(struct device_node)贪壳。函數(shù)xvip_graph_build_dma接著調(diào)用v4l2_fwnode_parse_link,得到對(duì)應(yīng)的link(struct v4l2_fwnode_link)蚜退,根據(jù)link中的端口號(hào)(local_port)闰靴,找到對(duì)應(yīng)的DMA(struct xvip_dma)。接下來再調(diào)用函數(shù)xvip_graph_find_entity钻注,根據(jù)link中的遠(yuǎn)端節(jié)點(diǎn)(remote_node)蚂且,得到遠(yuǎn)端的entity。然后設(shè)置源端(source)/目的端(sink)的media_entity和media_pad幅恋,最后調(diào)用media_create_pad_link創(chuàng)建媒體pad的鏈接(link)杏死。

4.13. 函數(shù)xvip_graph_find_dma

函數(shù)xvip_graph_build_dma根據(jù)指定的port號(hào),在xdev->dmas里找DMA捆交,如果找到淑翼,就返回對(duì)應(yīng)的的struct xvip_dma的指針。

4.14. 函數(shù)xvip_graph_find_entity

函數(shù)xvip_graph_find_entity根據(jù)指定的設(shè)備節(jié)點(diǎn)(struct device_node)品追,在xdev->entities里找entity玄括,如果找到,就返回對(duì)應(yīng)的的struct xvip_graph_entity的指針肉瓦。

5. 關(guān)鍵數(shù)據(jù)

5.1. subdevs

其中subdevs是一個(gè)指針惠豺,指向(struct v4l2_async_subdev *)的數(shù)組(是指針數(shù)組)银还,包含了這個(gè)設(shè)備下的所有subdev的指針风宁,根據(jù)遍歷xdev->entities填滿這個(gè)數(shù)組洁墙。xdev->entities由processedxvip_graph_parse_one()根據(jù)設(shè)備樹找到相關(guān)的子設(shè)備填充。

5.2. group ID

組ID(struct v4l2_subdev里有成員grp_id戒财。v4l2_subdev_init()里把其初始化為0热监。Xilinx沒有設(shè)置grp_id,所以都是0.)

5.3. xvip_graph_notify_ops

xvip_graph_notify_ops指向bound和complete函數(shù)饮寞,如果成功匹配設(shè)備孝扛,.bound()回調(diào)函數(shù)將會(huì)被調(diào)用,當(dāng)所有的子設(shè)備全部被加載完畢之后幽崩,.complete() 回調(diào)函數(shù)就會(huì)被調(diào)用:

6. 后續(xù)任務(wù)

還有很多代碼可以分析苦始,比如HDMI RX的驅(qū)動(dòng)、TPG的驅(qū)動(dòng)慌申、m2m的驅(qū)動(dòng)陌选。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蹄溉,隨后出現(xiàn)的幾起案子咨油,更是在濱河造成了極大的恐慌,老刑警劉巖柒爵,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件役电,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡棉胀,警方通過查閱死者的電腦和手機(jī)法瑟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唁奢,“玉大人霎挟,你說我怎么就攤上這事⊥郧疲” “怎么了氓扛?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長论笔。 經(jīng)常有香客問我采郎,道長,這世上最難降的妖魔是什么狂魔? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任蒜埋,我火速辦了婚禮,結(jié)果婚禮上最楷,老公的妹妹穿的比我還像新娘整份。我一直安慰自己待错,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布烈评。 她就那樣靜靜地躺著火俄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讲冠。 梳的紋絲不亂的頭發(fā)上瓜客,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音竿开,去河邊找鬼谱仪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛否彩,可吹牛的內(nèi)容都是我干的疯攒。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼列荔,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼敬尺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肌毅,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤筷转,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后悬而,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呜舒,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年笨奠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袭蝗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡般婆,死狀恐怖到腥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蔚袍,我是刑警寧澤乡范,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站啤咽,受9級(jí)特大地震影響晋辆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宇整,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一瓶佳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鳞青,春花似錦霸饲、人聲如沸为朋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽习寸。三九已至,卻和暖如春器仗,著一層夾襖步出監(jiān)牢的瞬間融涣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國打工精钮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剃斧。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓轨香,卻偏偏與公主長得像,于是被迫代替她去往敵國和親幼东。 傳聞我的和親對(duì)象是個(gè)殘疾皇子臂容,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 本文開啟 linux 內(nèi)核 V4L2 框架部分的學(xué)習(xí)之旅,本文僅先對(duì) V4L2 的框架做一個(gè)綜述性的概括介紹根蟹,然后...
    yellowmax閱讀 7,589評(píng)論 0 13
  • USB設(shè)備驅(qū)動(dòng)程序用來驅(qū)動(dòng)相應(yīng)的USB設(shè)備脓杉,USB設(shè)備驅(qū)動(dòng)用usb_driver表示,它主要用來將USB設(shè)備掛接到...
    Joe_HUST閱讀 6,297評(píng)論 1 5
  • 進(jìn)程 創(chuàng)建 創(chuàng)建進(jìn)程用fork()函數(shù)简逮。fork()為子進(jìn)程創(chuàng)建新的地址空間并且拷貝頁表球散。子進(jìn)程的虛擬地址空間...
    梅花怒閱讀 1,916評(píng)論 0 7
  • 本文對(duì) V4L2 中比較容易理解的骨干結(jié)構(gòu)進(jìn)行介紹,涉及兩個(gè)核心結(jié)構(gòu)體:v4l2_device散庶, v4l2_sub...
    yellowmax閱讀 3,116評(píng)論 0 4
  • 本文對(duì) V4L2 的運(yùn)行時(shí)數(shù)據(jù)流設(shè)備管理做一個(gè)詳細(xì)的介紹蕉堰,包括什么叫「運(yùn)行時(shí)設(shè)備管理」,它是干什么用的悲龟,怎么使用等...
    yellowmax閱讀 6,759評(píng)論 0 4