chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

Linux設(shè)備與驅(qū)動(dòng)的手動(dòng)解綁與手動(dòng)綁定

Linux閱碼場(chǎng) ? 來(lái)源:Linuxer ? 2020-08-03 16:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

眾所周知,Linux靠設(shè)備與驅(qū)動(dòng)之間的match,來(lái)完成設(shè)備與驅(qū)動(dòng)的bind,從而觸發(fā)驅(qū)動(dòng)的probe()成員函數(shù)被執(zhí)行。每個(gè)bus都有相應(yīng)的match方法,完成match的總的入口函數(shù)是:

static inline int driver_match_device(struct device_driver *drv, struct device *dev){ return drv->bus->match ? drv->bus->match(dev, drv) : 1;}

而這個(gè)總的入口函數(shù)又會(huì)調(diào)用到各自不同總線的match函數(shù),對(duì)于platform bus而言,它的match函數(shù)就是platform_match()

static int platform_match(struct device *dev, struct device_driver *drv){ struct platform_device *pdev = to_platform_device(dev); struct platform_driver *pdrv = to_platform_driver(drv); /* When driver_override is set, only bind to the matching driver */ if (pdev->driver_override) return !strcmp(pdev->driver_override, drv->name); /* Attempt an OF style match first */ if (of_driver_match_device(dev, drv)) return 1; /* Then try ACPI style match */ if (acpi_driver_match_device(dev, drv)) return 1; /* Then try to match against the id table */ if (pdrv->id_table) return platform_match_id(pdrv->id_table, pdev) != NULL; /* fall-back to driver name match */ return (strcmp(pdev->name, drv->name) == 0);}

從代碼可以看出,platform的driver和device之間的match有很多方法成立,比如設(shè)備的name和驅(qū)動(dòng)的name相同:

strcmp(pdev->name, drv->name) == 0

比如,設(shè)備的名字出現(xiàn)在驅(qū)動(dòng)的ID表中:

if (pdrv->id_table) return platform_match_id(pdrv->id_table, pdev) != NULL;

比如device tree里面的compatible字段與驅(qū)動(dòng)的dt兼容性字段匹配:

if (of_driver_match_device(dev, drv)) return 1;

只要符合其中任意一種,driver和device都可以匹配上。

這種自動(dòng)匹配非常簡(jiǎn)單,實(shí)施起來(lái)也非常容易。

但是有時(shí)候,這種自動(dòng)匹配并不一定是我們想要的。比如我們有時(shí)候就是希望XXX設(shè)備用YYY驅(qū)動(dòng),而不是用XXX驅(qū)動(dòng)。工程中有手動(dòng)匹配的需求,最典型的場(chǎng)景是VFIO的場(chǎng)景,想讓設(shè)備與內(nèi)核空間原本綁定的驅(qū)動(dòng)解綁,轉(zhuǎn)而采用內(nèi)核空間的通用VFIO驅(qū)動(dòng),而VFIO驅(qū)動(dòng)又提供了userspace駕馭設(shè)備的能力。

下面我們來(lái)從原理和實(shí)踐上演示這種手動(dòng)的unbind和bind是怎么進(jìn)行的。在《Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》一書(shū)中,我們給出了一個(gè)簡(jiǎn)單的globalfifo設(shè)備和globalfifo驅(qū)動(dòng):

globalfifo-dev.ko(增加platform_device的模塊):

static int __init globalfifodev_init(void){ int ret; globalfifo_pdev=platform_device_alloc("globalfifo",-1); ret = platform_device_add(globalfifo_pdev);... return 0; }module_init(globalfifodev_init);

globalfifo.ko(增加platform_driver的模塊):

static struct platform_driver globalfifo_driver = { .driver = { .name = "globalfifo", .owner = THIS_MODULE, }, .probe = globalfifo_probe, .remove = globalfifo_remove,}; module_platform_driver(globalfifo_driver);

由于其中的platform_driver和platform_device的name都是“globalfifo”,符合此行的匹配規(guī)則:

strcmp(pdev->name, drv->name) == 0

設(shè)備和驅(qū)動(dòng)匹配成功,從sysfs也可以看出:

globalfifo的device和driver各自找到了對(duì)方。

現(xiàn)在我們來(lái)寫(xiě)一個(gè)第三者driver,名字叫做globalxxx,然后我們想把globalfifo device的driver指向globalxxx。因此我們要完成2步:

unbind:解除globalfifo driver與globalfifo device的綁定

bind: 進(jìn)行g(shù)lobalxxxdriver與globalfifo device的綁定

第三者globalxxx驅(qū)動(dòng)代碼類似:

globalxxx.ko(增加platform_driver的模塊):

static struct platform_driver globalxxx_driver = { .driver = { .name = "globalxxx", .owner = THIS_MODULE, }, .probe = globalxxx_probe, .remove = globalxxx_remove,}; module_platform_driver(globalxxx_driver);

下面我們來(lái)完成第一步的unbind,這一步很簡(jiǎn)單,跑到/sys/bus/platform/drivers/globalfifo目錄,把設(shè)備globalfifo的名字寫(xiě)進(jìn)去unbind文件:

當(dāng)然我們也可以來(lái)回折騰著unbind,bind著玩:

這樣我們看到一堆的probe(每次設(shè)備和驅(qū)動(dòng)bind成功,驅(qū)動(dòng)probe都會(huì)執(zhí)行),remove(每次設(shè)備和驅(qū)動(dòng)unbind成功,驅(qū)動(dòng)remove都會(huì)執(zhí)行),最后處于unbind狀態(tài)。

現(xiàn)在我們來(lái)把globalfifo設(shè)備bind到globalxxx驅(qū)動(dòng):

綁定的時(shí)候提示錯(cuò)誤!

綁定的時(shí)候提示錯(cuò)誤!!

綁定的時(shí)候提示錯(cuò)誤?。?!

前面我們用globalfifo的driver去bind globalfifo的device的時(shí)候,是想怎么綁就怎么綁的,想綁多少次就綁多少次的!為什么換了globalxxx來(lái)綁就不行了呢?

愛(ài)情不是你想賣想買就能賣

讓我掙開(kāi) 讓我明白

放手你的愛(ài)

我們來(lái)看看這個(gè)bind sysfs入口工作的函數(shù)bind_store():

static ssize_t bind_store(struct device_driver *drv, const char *buf, size_t count){ ... dev = bus_find_device_by_name(bus, NULL, buf); if (dev && dev->driver == NULL && driver_match_device(drv, dev)) { err = device_driver_attach(drv, dev); if (err > 0) { /* success */ err = count; } else if (err == 0) { /* driver didn't accept device */ err = -ENODEV; } } ...}

看起來(lái),如果要強(qiáng)行bind,仍然需要device_driver_attach()成立,否則內(nèi)核會(huì)返回-ENODEV錯(cuò)誤:

} else if (err == 0) { /* driver didn't accept device */ err = -ENODEV; }

根據(jù)前文對(duì)platform_match()的代碼分析,globalxxx driver和globalfifo device確實(shí)八竿子都打不著!!沒(méi)有任何匹配因子。

下面我們來(lái)把globalxxx的代碼稍微改一下,通過(guò)ID表來(lái)增加一個(gè)匹配因子:

static const struct platform_device_id globalxxx_ids[] = { { .name = "globalfifo", }, {}};MODULE_DEVICE_TABLE(platform, globalxxx_ids); static struct platform_driver globalxxx_driver = { .driver = { .name = "globalxxx", .owner = THIS_MODULE, }, .id_table = globalxxx_ids, .probe = globalxxx_probe, .remove = globalxxx_remove,}; module_platform_driver(globalxxx_driver);

rmmod和insmod globalxxx.ko

然后重新bind:

現(xiàn)在globalfifo device可以在globalxxx和globalfifo這2個(gè)driver里面進(jìn)行自由地bind和unbind!

看到這里,客官們一定覺(jué)得這太特么狗血了!不是說(shuō)可以自由地綁定第三者嗎?為嘛還要求這個(gè)第三者驅(qū)動(dòng)與這個(gè)原先的設(shè)備匹配呢?這有嘛意思呢?

別忘了,在platform_match中還有這么一行:

if (pdev->driver_override) return !strcmp(pdev->driver_override, drv->name);

設(shè)備完全可以自由地宣布她喜歡的第三者driver,哪怕這個(gè)第三者driver和她本身完全沒(méi)有任何的匹配因子,操作的入口就是driver_override sysfs文件。

我們完全可以保留globalxxx驅(qū)動(dòng)的原樣

static struct platform_driver globalxxx_driver = { .driver = { .name = "globalxxx", .owner = THIS_MODULE, }, .probe = globalxxx_probe, .remove = globalxxx_remove,};

不去增加任何的id_table,而換做到globalfifo device里面去寫(xiě)driver_override文件,宣布globalxxx driver可以匹配globalfifo device。

這樣之后,哪怕globalxxx driver和globalfifo device八竿子打不著,也是可以驅(qū)動(dòng)globalfifo device的。工程里面如果我們想用VFIO的方式來(lái)驅(qū)動(dòng)一個(gè)設(shè)備,就可以這樣做:

echo vfio-platform > driver_override

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

    關(guān)注

    12

    文章

    1928

    瀏覽量

    88207
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11628

    瀏覽量

    218010
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4406

    瀏覽量

    66851

原文標(biāo)題:宋寶華:Linux設(shè)備與驅(qū)動(dòng)的手動(dòng)解綁與手動(dòng)綁定

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【免費(fèi)送書(shū)】成為硬核Linux開(kāi)發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)》

    Linux系統(tǒng)的設(shè)備驅(qū)動(dòng)開(kāi)發(fā),一直給人門檻較高的印象,主要因內(nèi)核機(jī)制抽象、需深度理解硬件原理、開(kāi)發(fā)調(diào)試難度大所致。2021年,一本講解驅(qū)動(dòng)開(kāi)發(fā)的專著問(wèn)世即獲市場(chǎng)青睞,暢銷近萬(wàn)冊(cè)——這便
    的頭像 發(fā)表于 11-18 08:06 ?462次閱讀
    【免費(fèi)送書(shū)】成為硬核<b class='flag-5'>Linux</b>開(kāi)發(fā)者:《<b class='flag-5'>Linux</b> <b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)(第 2 版)》

    原理圖手動(dòng)連線太繁瑣,自動(dòng)連線來(lái)救場(chǎng)!

    原理圖繪圖中有比較多且繁瑣的操作,還極其容易出錯(cuò)。比如:1.逐條網(wǎng)絡(luò)命名:在原理圖中為大量重要的電源、時(shí)鐘、差分對(duì)網(wǎng)絡(luò)手動(dòng)添加有意義的名稱(如DDR_DQ[0],PCIe_CLK100M_P),極其
    的頭像 發(fā)表于 11-10 18:30 ?449次閱讀
    原理圖<b class='flag-5'>手動(dòng)</b>連線太繁瑣,自動(dòng)連線來(lái)救場(chǎng)!

    如何判斷電能質(zhì)量在線監(jiān)測(cè)裝置時(shí)鐘模塊需要進(jìn)行手動(dòng)校準(zhǔn)?

    判斷電能質(zhì)量在線監(jiān)測(cè)裝置時(shí)鐘模塊是否需要手動(dòng)校準(zhǔn),核心是識(shí)別 “ 自動(dòng)同步失效 ” 或 “ 時(shí)鐘偏差超出對(duì)應(yīng)精度等級(jí)允許范圍 ” 兩類場(chǎng)景,結(jié)合裝置狀態(tài)提示、數(shù)據(jù)對(duì)比、功能異常等直觀信號(hào),按 “先查
    的頭像 發(fā)表于 10-15 17:52 ?371次閱讀

    無(wú)人機(jī)自動(dòng)巡檢系統(tǒng):從手動(dòng)操作到智能化的技術(shù)變革

    ? ? ? ?無(wú)人機(jī)自動(dòng)巡檢系統(tǒng):從手動(dòng)操作到智能化的技術(shù)變革 ? ? ? ?在無(wú)人機(jī)技術(shù)發(fā)展過(guò)程中,其操控方式經(jīng)歷了從完全依賴飛手手動(dòng)操作到逐步實(shí)現(xiàn)自動(dòng)化、智能化巡檢的重大飛躍。早期手動(dòng)飛行模式
    的頭像 發(fā)表于 09-11 13:16 ?479次閱讀

    阿圖什小臺(tái)式測(cè)徑儀的自動(dòng)模式與手動(dòng)模式分別是什么?

    ”指示設(shè)備對(duì)電機(jī)轉(zhuǎn)速的控制方式,分為“手動(dòng)模式M”和“自動(dòng)模式A”。 模式切換方法 在主界面下按“模式”按鍵,設(shè)備在自動(dòng)和手動(dòng)模式間切換。 “自動(dòng)模式A”下,
    發(fā)表于 07-29 15:01

    API讓電商“飛”起來(lái),告別手動(dòng)操作

    ? 在當(dāng)今快節(jié)奏的電商環(huán)境中,手動(dòng)處理訂單、更新庫(kù)存或管理客戶數(shù)據(jù)不僅耗時(shí)耗力,還容易出錯(cuò)。許多商家因此陷入效率瓶頸,影響業(yè)務(wù)增長(zhǎng)。幸運(yùn)的是,API(應(yīng)用程序編程接口)技術(shù)為電商自動(dòng)化提供了強(qiáng)大支持
    的頭像 發(fā)表于 07-16 10:31 ?290次閱讀
    API讓電商“飛”起來(lái),告別<b class='flag-5'>手動(dòng)</b>操作

    季豐電子推出低高溫手動(dòng)探針臺(tái)設(shè)備

    為滿足客戶對(duì)低溫測(cè)試的要求,季豐電子成功自研了低高溫手動(dòng)探針臺(tái),目前已在季豐張江FA投入使用,該機(jī)臺(tái)填補(bǔ)了傳統(tǒng)常規(guī)型手動(dòng)探針臺(tái)無(wú)法實(shí)現(xiàn)低溫測(cè)試環(huán)境的空白。
    的頭像 發(fā)表于 06-05 13:38 ?710次閱讀

    harmony OS NEXT-雙向數(shù)據(jù)綁定MVVM以及$$語(yǔ)法糖介紹

    保持同步的機(jī)制,當(dāng)數(shù)據(jù)發(fā)生變化時(shí),UI自動(dòng)更新;反之,當(dāng)用于通過(guò)UI代碼操作修改數(shù)據(jù)時(shí),數(shù)據(jù)模型也會(huì)同步更新,這種機(jī)制簡(jiǎn)化了開(kāi)發(fā),減少了手動(dòng)DOM或UI組件的代碼量,舉個(gè)簡(jiǎn)單的例子,比如輸入框和變量的綁定,用戶輸入變量更新,變量在其他地方修改時(shí)輸入框的內(nèi)容也發(fā)生變化
    的頭像 發(fā)表于 04-29 16:52 ?1117次閱讀

    視覺(jué)運(yùn)控一體機(jī)在DELTA并聯(lián)機(jī)械手動(dòng)態(tài)跟隨抓取的應(yīng)用

    正運(yùn)動(dòng)DELTA并聯(lián)機(jī)械手動(dòng)態(tài)跟隨抓取解決方案
    的頭像 發(fā)表于 04-29 10:34 ?512次閱讀
    視覺(jué)運(yùn)控一體機(jī)在DELTA并聯(lián)機(jī)械<b class='flag-5'>手動(dòng)</b>態(tài)跟隨抓取的應(yīng)用

    Princetel 推出新的手動(dòng)電纜卷筒在線配置器

    新的數(shù)字工具使工程師能夠配置和下載手動(dòng)電纜卷筒的 3D CAD 模型 Princetel 成立于 2000 年,是一家垂直一體化公司,專門設(shè)計(jì)和制造光纖旋轉(zhuǎn)接頭 (FORJ)、按訂單生產(chǎn)的電氣滑環(huán)
    發(fā)表于 04-18 15:41

    手動(dòng)檢測(cè)的終結(jié)者:機(jī)器人氣密性測(cè)試設(shè)備來(lái)襲

    在制造業(yè)的精密檢測(cè)領(lǐng)域,氣密性測(cè)試一直是保證產(chǎn)品質(zhì)量的關(guān)鍵環(huán)節(jié)。然而,傳統(tǒng)的手動(dòng)檢測(cè)方法存在效率低下、誤差較大等問(wèn)題,已經(jīng)無(wú)法滿足現(xiàn)代工業(yè)對(duì)高質(zhì)量和高效率的追求。隨著科技的進(jìn)步,機(jī)器人氣密性測(cè)試設(shè)備
    的頭像 發(fā)表于 04-16 14:50 ?543次閱讀
    <b class='flag-5'>手動(dòng)</b>檢測(cè)的終結(jié)者:機(jī)器人氣密性測(cè)試<b class='flag-5'>設(shè)備</b>來(lái)襲

    告別手動(dòng)時(shí)代:揭秘蔡司探針清潔的智能革命

    您是否正面臨以下測(cè)量挑戰(zhàn)? 手動(dòng)清潔三坐標(biāo)探針耗時(shí)耗力,影響生產(chǎn)進(jìn)度? 微小探針清潔困難,容易造成損壞,損失慘重? 探針因積塵或靜電干擾測(cè)量結(jié)果,缺乏有效解決方案? 蔡司探針自動(dòng)清潔裝置將是您的理想
    發(fā)表于 03-05 14:59 ?398次閱讀
    告別<b class='flag-5'>手動(dòng)</b>時(shí)代:揭秘蔡司探針清潔的智能革命

    迅為RK3568開(kāi)發(fā)板驅(qū)動(dòng)指南Linux中通用SPI設(shè)備驅(qū)動(dòng)

    迅為RK3568開(kāi)發(fā)板驅(qū)動(dòng)指南Linux中通用SPI設(shè)備驅(qū)動(dòng)
    的頭像 發(fā)表于 01-23 11:02 ?3437次閱讀
    迅為RK3568開(kāi)發(fā)板<b class='flag-5'>驅(qū)動(dòng)</b>指南<b class='flag-5'>Linux</b>中通用SPI<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    AN-1390:手動(dòng)選擇頻段以縮短PLL鎖定時(shí)間

    電子發(fā)燒友網(wǎng)站提供《AN-1390:手動(dòng)選擇頻段以縮短PLL鎖定時(shí)間.pdf》資料免費(fèi)下載
    發(fā)表于 01-13 13:59 ?0次下載
    AN-1390:<b class='flag-5'>手動(dòng)</b>選擇頻段以縮短PLL鎖定時(shí)間

    RobotStudio 6.08的手動(dòng)操作方法

    本文給大家介紹一下 RobotStudio 6.08的手動(dòng)操作方法 RobotStudio 6.08手動(dòng)操作? RobotStudio 6.08是學(xué)習(xí)和調(diào)試ABB機(jī)器人必須掌握的使用軟件。 在開(kāi)始
    的頭像 發(fā)表于 12-18 09:53 ?6406次閱讀
    RobotStudio 6.08的<b class='flag-5'>手動(dòng)</b>操作方法