在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Xilinx Linux 如何理解V4L2的管道驅(qū)動程序

454398 ? 來源:賽靈思中文社區(qū)論壇 ? 作者:賽靈思中文社區(qū)論 ? 2020-09-30 13:44 ? 次閱讀

概述

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

3. 文件

3.1. C文件

Xilinx的V4L2的管道(pipeline)驅(qū)動程序在下面四個文件中。
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)里含有整個視頻管道(video pipeline)的配置,對應(yīng)的文檔在Documentation/devicetree/bindings/media/xilinx/xlnx,video.txt。

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

axi_video_cap {
compatible = "xlnx,axi-video";
dmas = , ;
dma-names = "port0", "port1";

ports {
#address-cells = ;
#size-cells = ;

port@0 {
reg = ;
direction = "input";
vcap0_in0: endpoint {
remote-endpoint = ;
};
};
port@1 {
reg = ;
direction = "input";
vcap0_in1: endpoint {
remote-endpoint = ;
};
};
};
};

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

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

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

4.主要函數(shù)

4.1. 函數(shù)xvip_composite_probe()

函數(shù)xvip_composite_probe是整個驅(qū)動的入口,主要工作是初始化驅(qū)動的數(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è)置平臺設(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()注冊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)建一個DMA的列表;再調(diào)用xvip_graph_parse在設(shè)備樹(devicetree)里分析子設(shè)備節(jié)點,根據(jù)設(shè)備樹里"remote-endpoint"屬性創(chuàng)建一個Entity的列表;最后調(diào)用v4l2_async_notifier_register注冊異步處理函數(shù)。系統(tǒng)發(fā)現(xiàn)各個子設(shè)備(subdev)后,調(diào)用異步處理函數(shù)xvip_graph_notify_bound獲取子設(shè)備信息。所有子設(shè)備(subdev)都被發(fā)現(xiàn)后,調(diào)用xvip_graph_notify_complete,為每個entity創(chuàng)建Link和V4L2子設(shè)備,并注冊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()自身比較簡單,先找到第一個"ports"子節(jié)點,再找其中的所有"port"節(jié)點,并為每個"port"子節(jié)點執(zhí)行xvip_graph_dma_init_one(),從而將每個"port"子節(jié)點對應(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é)點的配置,找到DMA,并添加到鏈表"xdev->dmas"中。
xvip_graph_dma_init_one先讀取"port"子節(jié)點的屬性"direction"和"reg"屬性。Devicetre的"port"節(jié)點中,要含有屬性“direction”和"reg"屬性;如果沒有屬性“direction”,會返回錯誤;如果沒有"reg"屬性,代碼會繼續(xù),但是功能會出錯。屬性"direction"的值是"input"或者"output"。
xvip_graph_dma_init_one還為每個port分配struct xvip_dma,再執(zhí)行xvip_dma_init()。
接下來,xvip_graph_dma_init_one把struct xvip_dma加入到隊列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隊列、申請DMA設(shè)備、注冊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ù)點格式,struct v4l2_pix_format pix 或者struct v4l2_pix_format_mplane pix_mp。接下來設(shè)置pad.flags為MEDIA_PAD_FL_SINK或者MEDIA_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隊列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申請DMA設(shè)備,這是一個復(fù)雜和核心的函數(shù)。dma_request_chan()的第二個參數(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()計算屬性"dma-names"里的字符串個數(shù),也就是DMA的個數(shù)。然后根據(jù)DMA的個數(shù),為每一個DMA執(zhí)行of_dma_match_channel()。of_dma_match_channel (dev->of_node, "port%u", )取出"dma-names"的字符串,再和"port%u"對比,這是檢查名字是否對應(yīng),如果一致,就用對應(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實現(xiàn)的"xlnx,video"設(shè)備的設(shè)備樹里的"dmas"和"dma-names","port0"是必須有的固定字符串,不能更改;只有dmas后面的DMA phandle才可以更改。
函數(shù)xvip_dma_init()最后執(zhí)行video_register_device注冊Video設(shè)備。

4.7. 函數(shù)xvip_graph_parse

函數(shù)xvip_graph_parse先調(diào)用xvip_graph_parse_one,找到直接的remote_port;然后再為每一個找到的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)取得下一個endpoint,然后再調(diào)用of_graph_get_remote_port_parent(ep) 得到remote_port的父節(jié)點。of_graph_get_next_endpoint(node, ep)會先嘗試找子節(jié)點ports,再找到子節(jié)點port,然后再在子節(jié)點port里找endpoint;讀取路徑是 { ports { port {endpoint } } },其中ports是可選的。endpoint是port的子節(jié)點,不管其內(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é)點。of_graph_get_remote_endpoint()里讀取了設(shè)備樹里的"remote-endpoint"屬性。
xvip_graph_parse_one()再調(diào)用xvip_graph_find_entity(),在xdev->entities里檢查是否已經(jīng)包含對應(yīng)的entity,如果已經(jīng)包含,則跳過后續(xù)處理;如果沒沒有,則找到的remote_port的父節(jié)點,存放到鏈表xdev->entities,并執(zhí)行操作xdev->num_subdevs++。
最后xdev->entities里包含了所有entity。后來xvip_graph_notify_complet會根據(jù)xdev->entities,為每個entity創(chuàng)建一個設(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é)點,匹配實體(entity)和子設(shè)備(subdev);匹配成功后,再把子設(shè)備(subdev)的指針保存到實體(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會調(diào)用xvip_graph_notify_complete。xvip_graph_notify_complete調(diào)用xvip_graph_build_one為每個entity創(chuàng)建Link;調(diào)用xvip_graph_build_dma做Create links for DMA channels;并為每個實體(entity)注冊V4L2子設(shè)備v4l2_device_register_subdev_nodes ;最后調(diào)用media_device_register注冊media設(shè)備。

4.11. 函數(shù)xvip_graph_build_one

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

4.12. 函數(shù)xvip_graph_build_dma

函數(shù)xvip_graph_build_dma為DMA模塊及其遠端模塊之間創(chuàng)建Link。
函數(shù)xvip_graph_build_dma先調(diào)用函數(shù)of_graph_get_next_endpoint從設(shè)備的設(shè)備樹里找到下一個endpoint(struct device_node)。函數(shù)xvip_graph_build_dma接著調(diào)用v4l2_fwnode_parse_link,得到對應(yīng)的link(struct v4l2_fwnode_link),根據(jù)link中的端口號(local_port),找到對應(yīng)的DMA(struct xvip_dma)。接下來再調(diào)用函數(shù)xvip_graph_find_entity,根據(jù)link中的遠端節(jié)點(remote_node),得到遠端的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號,在xdev->dmas里找DMA,如果找到,就返回對應(yīng)的的struct xvip_dma的指針。

4.14. 函數(shù)xvip_graph_find_entity

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

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

5.1. subdevs

其中subdevs是一個指針,指向(struct v4l2_async_subdev *)的數(shù)組(是指針數(shù)組),包含了這個設(shè)備下的所有subdev的指針,根據(jù)遍歷xdev->entities填滿這個數(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ù)將會被調(diào)用,當(dāng)所有的子設(shè)備全部被加載完畢之后,.complete() 回調(diào)函數(shù)就會被調(diào)用:

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

還有很多代碼可以分析,比如HDMI RX的驅(qū)動、TPG的驅(qū)動、m2m的驅(qū)動。

編輯:hfy
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11406

    瀏覽量

    212082
  • Xilinx
    +關(guān)注

    關(guān)注

    73

    文章

    2177

    瀏覽量

    123729
  • 驅(qū)動程序
    +關(guān)注

    關(guān)注

    19

    文章

    853

    瀏覽量

    48633
收藏 人收藏

    評論

    相關(guān)推薦

    RTC芯片有Linux PCA2131驅(qū)動程序嗎?

    RTC 芯片有 Linux PCA2131驅(qū)動程序嗎? 1) 如果沒有,我可以使用任何兼容的驅(qū)動程序驅(qū)動這個 RTC 芯片嗎? 2) 如果
    發(fā)表于 03-31 06:22

    Linux驅(qū)動程序程序員指南

    電子發(fā)燒友網(wǎng)站提供《Linux驅(qū)動程序程序員指南.pdf》資料免費下載
    發(fā)表于 11-22 15:53 ?0次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動程序</b><b class='flag-5'>程序</b>員指南

    Wilink8 Linux Wi-Fi驅(qū)動程序R8.8版用戶指南

    電子發(fā)燒友網(wǎng)站提供《Wilink8 Linux Wi-Fi驅(qū)動程序R8.8版用戶指南.pdf》資料免費下載
    發(fā)表于 11-05 09:19 ?0次下載
    Wilink8 <b class='flag-5'>Linux</b> Wi-Fi<b class='flag-5'>驅(qū)動程序</b>R8.8版用戶指南

    用于bq275xx電量計的WinCE/Linux驅(qū)動程序

    電子發(fā)燒友網(wǎng)站提供《用于bq275xx電量計的WinCE/Linux驅(qū)動程序.pdf》資料免費下載
    發(fā)表于 10-17 11:17 ?0次下載
    用于bq275xx電量計的WinCE/<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動程序</b>

    LSP 2.10 DaVinci Linux驅(qū)動程序

    電子發(fā)燒友網(wǎng)站提供《LSP 2.10 DaVinci Linux驅(qū)動程序.pdf》資料免費下載
    發(fā)表于 10-09 09:30 ?0次下載
    LSP 2.10 DaVinci <b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動程序</b>

    Linux設(shè)備驅(qū)動程序分類有哪些

    Linux設(shè)備驅(qū)動程序是操作系統(tǒng)與硬件設(shè)備之間的橋梁,負責(zé)實現(xiàn)硬件設(shè)備與操作系統(tǒng)之間的通信和控制。Linux設(shè)備驅(qū)動程序的分類繁多,可以根據(jù)不同的標(biāo)準(zhǔn)進行分類。 按硬件類型分類
    的頭像 發(fā)表于 08-30 15:11 ?927次閱讀

    linux驅(qū)動程序如何加載進內(nèi)核

    Linux系統(tǒng)中,驅(qū)動程序是內(nèi)核與硬件設(shè)備之間的橋梁。它們允許內(nèi)核與硬件設(shè)備進行通信,從而實現(xiàn)對硬件設(shè)備的控制和管理。 驅(qū)動程序的編寫 驅(qū)動程序的編寫是
    的頭像 發(fā)表于 08-30 15:02 ?837次閱讀

    linux驅(qū)動程序主要有哪些功能

    Linux驅(qū)動程序是操作系統(tǒng)與硬件設(shè)備之間進行通信的橋梁,負責(zé)實現(xiàn)硬件設(shè)備與操作系統(tǒng)之間的數(shù)據(jù)交換和控制。Linux驅(qū)動程序的主要功能包括以下幾個方面: 設(shè)備識別與初始化
    的頭像 發(fā)表于 08-30 14:47 ?607次閱讀

    linux驅(qū)動程序的編譯方法是什么

    Linux驅(qū)動程序的編譯方法主要包括兩種: 與內(nèi)核一起編譯 和 編譯成獨立的內(nèi)核模塊 。以下是對這兩種方法的介紹: 一、與內(nèi)核一起編譯 與內(nèi)核一起編譯意味著將驅(qū)動程序的源代碼直接集成到Linu
    的頭像 發(fā)表于 08-30 14:46 ?967次閱讀

    linux驅(qū)動程序的編譯方法有哪兩種

    Linux驅(qū)動程序的編譯方法主要可以歸納為兩種: 手動編譯 和 使用內(nèi)核構(gòu)建系統(tǒng)(Makefile)自動編譯 。 1. 手動編譯 手動編譯驅(qū)動程序通常涉及直接使用GCC(GNU Compiler
    的頭像 發(fā)表于 08-30 14:39 ?1209次閱讀

    linux驅(qū)動程序運行在什么空間

    Linux 驅(qū)動程序是操作系統(tǒng)的一部分,負責(zé)管理硬件設(shè)備與操作系統(tǒng)之間的交互。驅(qū)動程序運行在內(nèi)核空間(Kernel Space),這是操作系統(tǒng)的核心部分,與用戶空間(User Space)相對。內(nèi)核
    的頭像 發(fā)表于 08-30 14:37 ?671次閱讀

    虹科技術(shù) 全新Linux環(huán)境PCAN驅(qū)動程序發(fā)布!CAN/CAN FD通信體驗全面升級!

    全新8.17.0版本的PCAN-Linux驅(qū)動程序正式發(fā)布,專為CAN和CAN FD接口量身打造。無論是CAN 2.0 a/b還是CAN FD的PCAN硬件產(chǎn)品,都能在我們的新驅(qū)動下“馳騁自如
    的頭像 發(fā)表于 08-29 09:36 ?621次閱讀
    虹科技術(shù) 全新<b class='flag-5'>Linux</b>環(huán)境PCAN<b class='flag-5'>驅(qū)動程序</b>發(fā)布!CAN/CAN FD通信體驗全面升級!

    百問網(wǎng)全志系列開發(fā)板攝像頭V4L2編程步驟詳解

    緩沖區(qū)放入視頻輸入隊列尾部,這樣循環(huán)往復(fù)就實現(xiàn)了循環(huán)采集。流程如下圖所示: ?為了更好的理解這個過程,我們可以把“應(yīng)用程序處理數(shù)據(jù)”比喻成“西瓜加工商加工西瓜”,“V4L2驅(qū)動程序
    發(fā)表于 08-13 09:45

    虹科技術(shù) Linux環(huán)境再升級:PLIN驅(qū)動程序正式發(fā)布

    Linux驅(qū)動程序領(lǐng)域再添新成員,PLIN驅(qū)動程序現(xiàn)已正式發(fā)布。
    的頭像 發(fā)表于 06-28 13:34 ?497次閱讀
    虹科技術(shù) <b class='flag-5'>Linux</b>環(huán)境再升級:PLIN<b class='flag-5'>驅(qū)動程序</b>正式發(fā)布

    深入理解Camera的整體五層架構(gòu)

    Linux為視頻采集設(shè)備制定了標(biāo)準(zhǔn)的V4L2接口,并在內(nèi)核中實現(xiàn)了其基礎(chǔ)框架V4L2 Core。用戶空間進程可以通過V4L2接口調(diào)用相關(guān)設(shè)備功能,而不用考慮其實現(xiàn)細節(jié)。
    的頭像 發(fā)表于 04-25 14:41 ?2310次閱讀
    深入<b class='flag-5'>理解</b>Camera的整體五層架構(gòu)
    主站蜘蛛池模板: jizjizjizjiz日本护士出水 | 午夜嘿嘿嘿 | 8000av在线 | 美女张开大腿让男人桶 | 五月婷婷俺也去开心 | 一级特黄女毛毛片 | 久久99热久久精品 | 婷婷免费高清视频在线观看 | 日本黄色免费网站 | 精品在线一区二区三区 | h视频在线播放 | 亚洲黄色一区 | 我要看18毛片 | 亚洲一区二区免费视频 | 福利99| a天堂中文在线 | 国产在线观看网址你懂得 | 激情综合网五月婷婷 | 亚洲伊人成人 | 最新看片网址 | 久久亚洲国产欧洲精品一 | 午夜国产精品免费观看 | 成人国内精品久久久久影院 | 亚洲产国偷v产偷v自拍色戒 | 国产一级特黄高清免费大片 | 波多野结衣在线一区 | 亚洲91| 天天做天天爱天天综合网2021 | 国产91小视频在线观看 | 欧美日韩一区不卡 | 欧美一区二区三区黄色 | 影音先锋色偷偷米奇四色 | 一区二区三区视频免费观看 | 成在线人永久免费播放视频 | 久久伊人操 | 亚洲成a人片77777潘金莲 | 在线免费看片 | 老师受不了了好硬好大 | 欧美八区| 欧美洲视频在线观看 | 久久精品人人做人人看 |