日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何解決Linux驅(qū)動中沒有設(shè)備ID的問題? (linux 驅(qū)動沒有設(shè)備id)

Linux作為一款開源的操作系統(tǒng),被廣泛應(yīng)用于各種硬件平臺和不同領(lǐng)域的應(yīng)用中。在使用過程中,Linux驅(qū)動的開發(fā)和調(diào)試是一個重要的環(huán)節(jié)。尤其是在硬件平臺不斷更新迭代的情況下,驅(qū)動的開發(fā)和維護(hù)顯得尤為關(guān)鍵。然而,在實際開發(fā)中經(jīng)常會遇到驅(qū)動中沒有設(shè)備ID的問題,這不僅會給驅(qū)動開發(fā)帶來困難,也會影響系統(tǒng)的穩(wěn)定性和性能。本文將介紹如何解決Linux驅(qū)動中沒有設(shè)備ID的問題。

一、背景介紹

設(shè)備ID是Linux驅(qū)動開發(fā)中非常重要的一個概念,它是一個唯一標(biāo)識符,用于標(biāo)識硬件設(shè)備。它由兩部分組成:供應(yīng)商ID和設(shè)備ID。供應(yīng)商ID是由PCI-SIG組織分配的一個唯一標(biāo)識符,用于標(biāo)識硬件設(shè)備的廠商,設(shè)備ID則是由廠商自行分配的一個唯一標(biāo)識符,用于標(biāo)識廠商的不同型號設(shè)備。在Linux系統(tǒng)中,設(shè)備ID常常用于與硬件設(shè)備進(jìn)行匹配,從而正確加載相應(yīng)的驅(qū)動程序。

然而,在實際開發(fā)中,有些硬件設(shè)備并沒有一個唯一的設(shè)備ID。這可能是因為設(shè)備是一種新興的技術(shù),還沒有被分配一個標(biāo)準(zhǔn)的設(shè)備ID,或者是因為硬件設(shè)備的自身特性使得無法分配一個唯一的設(shè)備ID。在這種情況下,開發(fā)人員就需要尋找其他的解決方案,以便正確地加載驅(qū)動程序。

二、解決方案

1. 查找設(shè)備的類型和特征

當(dāng)驅(qū)動中沒有可用的設(shè)備ID時,開發(fā)人員可以通過查找設(shè)備的類型和特征來幫助正確地加載驅(qū)動程序。一般而言,每個硬件設(shè)備都有一些獨特的特征,比如設(shè)備的制造商、操作系統(tǒng)所需的驅(qū)動程序、設(shè)備的接口類型等等。通過這些特征,開發(fā)人員可以自行編寫一些匹配規(guī)則,來自定義設(shè)備的匹配方式。這種方式需要開發(fā)人員對設(shè)備有一定的了解,并且需要一定的經(jīng)驗和技術(shù)。

2. 使用PCI子系統(tǒng)的VGA類

對于一些圖形處理器(GPU)設(shè)備,開發(fā)人員可以使用PCI子系統(tǒng)的VGA類來匹配設(shè)備。由于許多圖形處理器是在PCI規(guī)范之前制造的,因此它們并沒有一個唯一的設(shè)備ID。但是,它們有一個通用的接口(VGA),這使得它們可以使用PCI子系統(tǒng)中的VGA類進(jìn)行匹配。當(dāng)驅(qū)動程序加載時,它將檢測是否存在VGA類設(shè)備,如果存在,則加載適當(dāng)?shù)尿?qū)動程序。

3. 創(chuàng)建一個新的設(shè)備ID

在某些情況下,開發(fā)人員可以自己創(chuàng)建一個新的設(shè)備ID。這種方式需要一定的經(jīng)驗和技術(shù),并且需要開發(fā)人員對驅(qū)動系統(tǒng)的工作原理有一定的了解。開發(fā)人員可以使用調(diào)試工具從設(shè)備中獲取一些參數(shù)信息,比如設(shè)備的廠商ID、設(shè)備類型等等。然后,開發(fā)人員可以根據(jù)這些參數(shù)來創(chuàng)建一個新的設(shè)備ID,并將其添加到Linux的設(shè)備數(shù)據(jù)庫中,以便正確地加載驅(qū)動程序。

三、

在Linux驅(qū)動開發(fā)中,設(shè)備ID是非常重要的。它可以用來標(biāo)識硬件設(shè)備,幫助正確地加載驅(qū)動程序。然而,在實際開發(fā)中,有些硬件設(shè)備并沒有一個唯一的設(shè)備ID,這給驅(qū)動的開發(fā)和維護(hù)帶來很大的麻煩。本文介紹了三種解決方案:查找設(shè)備的類型和特征、使用PCI子系統(tǒng)的VGA類和創(chuàng)建一個新的設(shè)備ID。開發(fā)人員可以根據(jù)自己的實際情況選擇適當(dāng)?shù)姆桨?,以便正確地加載驅(qū)動程序。通過解決Linux驅(qū)動中沒有設(shè)備ID的問題,可以提高系統(tǒng)的穩(wěn)定性和性能,使Linux系統(tǒng)更加適用于各種硬件平臺和不同領(lǐng)域的應(yīng)用。

相關(guān)問題拓展閱讀:

  • 如何調(diào)整Linux內(nèi)核啟動中的驅(qū)動初始化順序?

如何調(diào)整Linux內(nèi)核啟動中的驅(qū)動初始化順序?

【問題】 此處我要實現(xiàn)的是將芯片的ID用于網(wǎng)卡MAC地址,網(wǎng)卡驅(qū)動是enc28j60_init。 但是,讀取芯片ID的函數(shù),在as352x_afe_init模塊中,所以要先初始化as352x_afe_init。 此處,內(nèi)核編譯完之后,在生成的system.map中可以看到, enc28j60_init在as352x_afe_init之前,所以,無法去讀芯片ID。 所以我們的目標(biāo)是,將as352x_afe_init驅(qū)動初始化放到enc28j60_init之前, 然后才能讀取芯片ID,才能用于網(wǎng)卡初始化的時候的,將芯片ID設(shè)置成網(wǎng)卡MAC地址。

【解決過程】

【1】

最簡單想到的,是內(nèi)核里面的

archarmmach-as352xcore.c

中,去改devices設(shè)備列表中的順序。

enc28j60_init對應(yīng)的是ssp_device,因為網(wǎng)卡初始化用到的是SPI驅(qū)動去進(jìn)行和通訊的。

as352x_afe_init對應(yīng)的是afe_device。

原先是:

把a(bǔ)fe改到最前面:

但是,實際結(jié)果是,沒有任何影響,連systemp.map生成的,那么模塊初始化順序,都沒有任何變化。 也就說明,想要實現(xiàn)驅(qū)動加載順序的改變,改core.c里面的設(shè)備列表順序是沒有用的。

更多l(xiāng)inux內(nèi)核視頻教程文檔資料免費領(lǐng)取后臺私信

【內(nèi)核】

自行獲取.

Linux內(nèi)核源碼/內(nèi)存調(diào)優(yōu)/文件系統(tǒng)/進(jìn)程管理/設(shè)備驅(qū)動/網(wǎng)絡(luò)協(xié)議棧-學(xué)習(xí)視頻教程-騰訊課堂

【2】

在網(wǎng)上看到很多帖子,其說明的也很清楚了,就是:

Linux內(nèi)核為不同驅(qū)動的加載順序?qū)?yīng)不同的優(yōu)先級,定義了一些宏:

includelinuxinit.h

把自己的驅(qū)動的函數(shù)名用這些宏去定義之后, 就會對應(yīng)不同的加載時候的優(yōu)先級。

其中,我們寫驅(qū)動中所用到的module_init對應(yīng)的是 #define module_init(x) __initcall(x); 而 #define __initcall(fn) device_initcall(fn) 所以,驅(qū)動對應(yīng)的加載的優(yōu)先級為6

在上面的不同的優(yōu)先級中, 數(shù)字越小,優(yōu)先級越高。 同一等級的優(yōu)先級的驅(qū)動,加載順序是鏈接過程決定的,結(jié)果是不確定的,我們無法去手動設(shè)置誰先誰后。 不同等級的驅(qū)動加載的順序是先優(yōu)先級高,后優(yōu)先級低,這是可以確定的。

所以,像我們之前在驅(qū)動中用:

所以,大家都是同一個優(yōu)先級去初始化,

最后這些驅(qū)動加載的順序,可以查看在根目錄下,

生成的system.map:

此處就是由于 ct __initcall_i2c_dev_init6 ct __initcall_as352x_afe_i2c_init6 ct __initcall_as352x_afe_init6 在c00198e4 t __initcall_enc28j60_init6之前,所以我這里才要去改。。。 知道原理,能想到的,就是要么把a(bǔ)s352x_afe_init改到enc28j60_init之前一級,即優(yōu)先級為5。即在驅(qū)動中,調(diào)用:fs_initcall(as352x_afe_init);要么把enc28j60_init改到as352x_afe_init之后,即優(yōu)先級為7即在驅(qū)動中,調(diào)用:late_initcall(enc28j60_init);但是,此處麻煩就麻煩在,如果把a(bǔ)s352x_afe_init改到enc28j60_init之前一級,發(fā)現(xiàn)后面網(wǎng)卡初始化enc28j60_init中,雖然讀取芯片ID對了,但是后面的IP-auto configure 有問題。所以放棄。 如果把enc28j60_init改到as352x_afe_init之后,但是,從system.map中看到的是,優(yōu)先級為7的驅(qū)動中,明顯有幾個驅(qū)動,也是和網(wǎng)卡初始化相關(guān)的,所以,這樣改,嘗試后,還是失敗了。 所以,沒法簡單的通過調(diào)整現(xiàn)有的驅(qū)動的順序,去實現(xiàn)順序的調(diào)整。最后,被逼無奈,想到了一個可以實現(xiàn)我們需求的辦法,那就是,單獨定義一個優(yōu)先級,把a(bǔ)fe相關(guān)的初始化都放到那里面去,這樣,就可以保證,其他沒什么相關(guān)的沖突了。最后證實,這樣是可以實現(xiàn)目的的。

具體添加一個新的優(yōu)先級的步驟如下: 1.定義新的優(yōu)先級 includelinuxinit.h中:

2.用對應(yīng)新的宏,定義我們的驅(qū)動:

做到這里,本以為可以了,但是編譯后,在system.map中,發(fā)現(xiàn)之前優(yōu)先級為7的那幾個函數(shù),被放到system.map最后了,而不是預(yù)想的,在優(yōu)先級7之后,在

之前。最后,發(fā)現(xiàn)時沒有把對應(yīng)的鏈接文件中的宏加進(jìn)去:

3.includea-genericvmlinux.lds.h

最后,再重新編譯,就可以實現(xiàn)我們要的,和afe相關(guān)的驅(qū)動初始化,都在網(wǎng)卡enc28j60_init之前了。也就可以在網(wǎng)卡里面讀芯片ID了。當(dāng)然,對應(yīng)編譯生成的system.map文件中,對應(yīng)的通過module_init定義的驅(qū)動,優(yōu)先級也都變成7了。而late_initcall對應(yīng)優(yōu)先級8了。 注:當(dāng)前開發(fā)板arm的板子,所以,對應(yīng)的load 腳本在:

linux-2.6.28.4archarmkernelvmlinux.lds 看起來,應(yīng)該是這個文件: linux-2.6.28.4archarmkernelvmlinux.lds.S 生成上面那個腳本的。vmlinux.lds中的這一行:

就是將之前那些對應(yīng)的init類型的函數(shù),展開,放到這對應(yīng)的位置。

【3】 不過,最后的最后,竟然發(fā)現(xiàn)網(wǎng)卡還是工作不正常,結(jié)果第二天,無意間發(fā)現(xiàn)是網(wǎng)卡地址設(shè)置導(dǎo)致網(wǎng)卡工作不正常的。 也就是說,實際是直接將afe設(shè)置到原先的優(yōu)先級5就可以的,而不用這么麻煩去改系統(tǒng)的東西的…

不過,至少這也是一種辦法,雖然不是那么的好…

linux 驅(qū)動沒有設(shè)備id的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux 驅(qū)動沒有設(shè)備id,如何解決Linux驅(qū)動中沒有設(shè)備ID的問題?,如何調(diào)整Linux內(nèi)核啟動中的驅(qū)動初始化順序?的信息別忘了在本站進(jìn)行查找喔。

成都網(wǎng)站營銷推廣找創(chuàng)新互聯(lián),全國分站站群網(wǎng)站搭建更好做SEO營銷。
創(chuàng)新互聯(lián)(www.cdcxhl.com)四川成都IDC基礎(chǔ)服務(wù)商,價格厚道。提供成都服務(wù)器托管租用、綿陽服務(wù)器租用托管、重慶服務(wù)器托管租用、貴陽服務(wù)器機(jī)房服務(wù)器托管租用。


分享文章:如何解決Linux驅(qū)動中沒有設(shè)備ID的問題? (linux 驅(qū)動沒有設(shè)備id)
分享路徑:http://www.5511xx.com/article/djhgjho.html