日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

致驱动工程师的一封信

發(fā)布時(shí)間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 致驱动工程师的一封信 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引言

作為一個(gè)算是合格的驅(qū)動(dòng)工程師,總是有很多話想說。代碼看的多了總是有些小感悟。可能是吧。那就總結(jié)一下自己看的代碼的一些感悟和技巧。

如何利用你看的這些代碼?如何體現(xiàn)在工作的調(diào)試中。作為驅(qū)動(dòng)工程師,主要的工作就是移植各種驅(qū)動(dòng),接觸各種硬件。接觸最多的就是dts、中斷、gpio、sysfs、proc fs。如何利用sysfs、proc fs及內(nèi)核提供的接口為我們降低調(diào)試難度,快速解決問題呢?

注:部分代碼分析舉例基于linux-4.15。

如何利用dts

首先我們關(guān)注的主要是兩點(diǎn),gpio和irq。其他的選擇忽略。先展示一下我期望的gpio和irq的使用方法。dts如下。

device?{rst-gpio?=?<&gpioc_ctl?10?OF_GPIO_ACTIVE_LOW>;irq-gpio?=?<&gpioc_ctl?11?0>;interrupts-extended?=?<&vic?11?IRQF_TRIGGER_RISING>; };

對(duì)于以上的dts你應(yīng)該再熟悉不過,當(dāng)然這里不是教你如何使用dts,而是關(guān)注gpio和irq最后一個(gè)數(shù)字可以如何利用。

例如rst-gpio的OF_GPIO_ACTIVE_LOW代表什么意思呢?可以理解為低有效。

什么意思呢?舉個(gè)例子,正常情況下,我們需要一個(gè)gpio口控制燈,我們認(rèn)為燈打開就是active狀態(tài)。對(duì)于一個(gè)程序員來說,我們可以封裝一個(gè)函數(shù),寫1就是打開燈,寫0就是關(guān)燈。

但是對(duì)于硬件來說,變化的是gpio口的電平狀態(tài)。如果gpio輸出高電平燈亮,那么這就是高有效。如果硬件設(shè)計(jì)是gpio輸出低電平燈亮,那么就是低有效。

對(duì)于一個(gè)軟件工程師來說,我們的期望是寫1就是亮燈,寫0就是關(guān)燈。我可不管硬件工程師是怎么設(shè)計(jì)的。我們可以認(rèn)為dts是描述具體的硬件。

因此對(duì)于驅(qū)動(dòng)來說,硬件的這種變化,只需要修改dts即可。軟件不用任何修改。軟件可以如下實(shí)現(xiàn)。

int?device_probe(struct?platform_device?*pdev) {rst_gpio?=?of_get_named_gpio_flags(np,?"rst-gpio",?0,?&flags);if?(flags?&?OF_GPIO_ACTIVE_LOW)?{struct?gpio_desc?*desc;desc?=?gpio_to_desc(rst_gpio);set_bit(FLAG_ACTIVE_LOW,?&desc->flags);}irq?=?of_irq_get(np,?0);trigger_type?=?irq_get_trigger_type(irq);request_threaded_irq(irq,?NULL,?irq_handler,?trigger_type,?"irq",?NULL); }

驅(qū)動(dòng)按照以上代碼實(shí)現(xiàn)的話,如果修改中斷觸發(fā)類型或者電平有效狀態(tài)只需要修改dts即可。例如不同的IC復(fù)位電平是不一樣的,有的IC是高電平復(fù)位,有的IC卻是低電平復(fù)位。其實(shí)這就是一個(gè)電平有效狀態(tài)的例子。

如何調(diào)試gpio

移植驅(qū)動(dòng)階段或者調(diào)試階段的工程中,難免想知道當(dāng)前gpio的電平狀態(tài)。當(dāng)然很easy。萬用表戳上去不就行了。

是啊!硬件工程師的思維。作為軟件工程師自然是要軟件的方法。下面介紹兩個(gè)api接口。自己摸索使用吧。點(diǎn)到為止。

static?inline?int?gpio_export(unsigned?gpio,?bool?direction_may_change); static?inline?int?gpio_export_link(struct?device?*dev,?const?char?*name,unsigned?gpio);

在你的driver中調(diào)用以上api后,編譯下載。去/sys/class/gpio目錄看看有什么發(fā)現(xiàn)。

如何調(diào)試irq

調(diào)試的時(shí)候也難免會(huì)確定硬件是否產(chǎn)生中斷。我們?cè)撛趺崔k呢?也很easy。

cat?/proc/interrupts

輸出信息不想多余的介紹。看代碼去。根據(jù)輸出的irq num,假設(shè)是irq_num。請(qǐng)進(jìn)入以下目錄。看看下面都有什么文件。摸索這些文件可以為你調(diào)試帶來哪些方便。

cd?/proc/irq/irq_num

dts和sysfs有什么關(guān)聯(lián)

曾經(jīng)寫過一篇dts解析的文章http://www.wowotech.net/device_model/dt-code-file-struct-parse.html。最后一節(jié)其實(shí)說了一個(gè)很有意思的東西。但是僅僅是寥寥結(jié)尾。并沒有展開。因?yàn)樗魂P(guān)乎我寫的文章的的主題。但是,他卻和調(diào)試息息相關(guān)。

cd /sys/firmware/devicetree/base

該目錄的信息就是整個(gè)dts。將整個(gè)dts的節(jié)點(diǎn)以及屬性全部展現(xiàn)在sysfs中。他對(duì)我們的調(diào)試有什么用呢?Let me tell you。

如果你的項(xiàng)目非常的復(fù)雜,例如一套代碼兼容多種硬件配置。這些硬件配置的差異信息主要是依靠dts進(jìn)行區(qū)分。

當(dāng)編譯kernel的時(shí)候,你發(fā)現(xiàn)你很難確定就是你用的是哪個(gè)dts。可能你就會(huì)憑借自己多年的工作經(jīng)驗(yàn)去猜測(cè)。

是的,你的經(jīng)驗(yàn)很厲害。但是,如何確定你的dts信息是否添加到kernel使用的dts呢?我覺得你應(yīng)該got it。就到這個(gè)目錄去查找是否包含你添加的ndoe和property。

dts中有status屬性可以設(shè)置某個(gè)devicec是否使能。當(dāng)你發(fā)現(xiàn)你的driver的probe沒有執(zhí)行的時(shí)候,我覺得你就需要確定一遍status是不是“ok”、“okay”或者沒有這個(gè)屬性。

遠(yuǎn)不止我所說的這個(gè)功能,還可以判斷當(dāng)前的硬件是匹配哪個(gè)dts文件。你還不去探索一波源碼的設(shè)計(jì)與實(shí)現(xiàn)嗎?節(jié)點(diǎn)為什么出現(xiàn)在某些目錄?為什么有些節(jié)點(diǎn)的屬性cat卻是亂碼?就是亂碼,你沒看錯(cuò)。至于為什么。點(diǎn)到為止。

sysfs可以看出什么貓膩

sysfs有什么用?sysfs可以看出device是否注冊(cè)成功、存在哪些device、driver是否注冊(cè)、device和driver是都匹配、device匹配的driver是哪個(gè)等等。先說第一項(xiàng)技能。deivce是否注冊(cè)。

就以i2c設(shè)備為例說明。/sys/bus/i2c/devices該目錄下面全是i2c總線下面的devices。如何確定自己的device是否注冊(cè)呢?

首選你需要確定自己的device掛接的總線是哪個(gè)i2c(i2c0, i2c1...)。假設(shè)設(shè)備掛接i2c3,從地址假設(shè)0x55。那么devices目錄只需要查看是否有3-0055目錄即可。

如何確定device是否匹配了驅(qū)動(dòng)?進(jìn)入3-0055目錄,其實(shí)你可以看到driver的符號(hào)鏈接。如果沒有,那么就是沒有driver。driver是否注冊(cè)如何確定呢?方法類似。/sys/bus/i2c/drivers目錄就是所有注冊(cè)的i2c driver。方法如上。不再列舉。

你以為就這些簡(jiǎn)單的功能了嗎?其實(shí)不是,還有很多待你探討。主要是各種目錄之間的關(guān)系,device注冊(cè)會(huì)出現(xiàn)什么目錄?那么driver呢?各種符號(hào)鏈接會(huì)在那些目錄?等等。

如何排查driver的probe沒有執(zhí)行問題

我想這類問題是移植過程中極容易出現(xiàn)的第一個(gè)攔路虎。這里需要聲明一點(diǎn)。可能有些驅(qū)動(dòng)工程師認(rèn)為probe沒有執(zhí)行就是driver沒有注冊(cè)成功。其實(shí)這兩個(gè)沒有半毛錢關(guān)系。

probe是否執(zhí)行只和device和driver的是否匹配成功有關(guān)。我們有什么思路排查這類問題呢?主要排查方法可以如下。

  • 通過sysfs確定對(duì)應(yīng)的device是否注冊(cè)成功。

  • 通過sysfs確定對(duì)應(yīng)的driver是否注冊(cè)成功。

  • 通過sysfs中dts的展開信息得到compatible屬性的值,然后和driver的compatible進(jìn)行對(duì)比。

  • 如果發(fā)現(xiàn)device沒有注冊(cè),如何確定問題。首先通過sysfs中dts展開文件查看是否有你添加的device信息。

    如果沒有的話,沒有device注冊(cè)就是正常的,去找到正確的dts添加正確的device信息。

    如果發(fā)現(xiàn)sysfs有device的dts信息。那么就看看status屬性的值是不是ok的。

    如果也是ok的。那么就非常奇怪了。這種情況一般出現(xiàn)在kernel的device注冊(cè)路徑出錯(cuò)了。曾經(jīng)就有一個(gè)小伙伴提出問題,現(xiàn)象就是這樣。

    最后我?guī)退_定問題原因是dts中reg屬性的地址是0xc0。這是一個(gè)大于0x7f的值。在i2c總線注冊(cè)驅(qū)動(dòng)的時(shí)候會(huì)解析當(dāng)前總線下的所有device。然后注冊(cè)所有的從設(shè)備。就是這里的地址檢查出了問題,因此這個(gè)device沒有注冊(cè)上。

    如果發(fā)現(xiàn)driver沒有注冊(cè),那么去看看對(duì)應(yīng)的Makefile是否參與編譯。如果參與了編譯,就查看log信息,是不是驅(qū)動(dòng)注冊(cè)的時(shí)候有錯(cuò)誤信息。

    最后一點(diǎn)的compatible屬性的值只需要cat一下,然后compare即可。不多說。

    后記

    sysfs還有很多的其他的調(diào)試信息可以查看。因此,我建議驅(qū)動(dòng)工程師都應(yīng)該掌握sysfs的使用和原理。看看代碼實(shí)現(xiàn)。

    我始終堅(jiān)信只有更好地掌握技術(shù)的原理才能更好地利用技術(shù)。文章內(nèi)容不想展開。我告訴你的結(jié)果,你永遠(yuǎn)記憶不深刻,而且我說的也不一定對(duì)。還是需要自己專研。我只是給你指條明路,剩下的就需要自己去走。

    最后說一句,代碼不會(huì)騙你,還會(huì)告訴你別人不能告訴你的。

    作者:smcdef ? http://www.wowotech.net/device_model/429.html 免責(zé)聲明:本文素材來源網(wǎng)絡(luò),版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請(qǐng)與我聯(lián)系刪除。


    推薦閱讀:

    專輯|Linux文章匯總

    專輯|程序人生

    專輯|C語言

    我的知識(shí)小密圈

    關(guān)注公眾號(hào),后臺(tái)回復(fù)「1024」獲取學(xué)習(xí)資料網(wǎng)盤鏈接。

    歡迎點(diǎn)贊,關(guān)注,轉(zhuǎn)發(fā),在看,您的每一次鼓勵(lì),我都將銘記于心~

    嵌入式Linux

    微信掃描二維碼,關(guān)注我的公眾號(hào)

    總結(jié)

    以上是生活随笔為你收集整理的致驱动工程师的一封信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。