一.前言
一般模塊都會有軟復(fù)位的功能,軟復(fù)位在驅(qū)動編寫中很重要。一般初始化時(shí)執(zhí)行軟復(fù)位使得模塊進(jìn)入確定的初始狀態(tài)以提高可靠性,異常時(shí)也可以重新初始化來恢復(fù),所以軟復(fù)位在驅(qū)動中一般是必須要做的動作。對應(yīng)復(fù)雜的IP其復(fù)位過程其實(shí)是很復(fù)雜的,有很多前提和依賴,對于驅(qū)動編寫來說也有一些需要注意的地方甚至是有一些坑,所以本篇單獨(dú)來講講DWC_ether_qos的軟復(fù)位。如果你有遇到DWC_ether_qos軟復(fù)位的問題,建議可以看看本文章,說不定就有你的問題的答案!
二.DWC_ether_qos的軟復(fù)位
軟復(fù)位的作用簡單的可以總結(jié)為復(fù)位控制邏輯(比如狀態(tài)機(jī)等),和相關(guān)的資源(比如寄存器值恢復(fù)到默認(rèn)狀態(tài)等)。
DWC_ether_qos的軟復(fù)位參考手冊P1013,偏移0x1000的寄存器DMA_Mode寄存器的位0,SWR的解釋。
從以上描述可以看出其實(shí)信息量是很多的,換句話說需要注意的地方是很多的,以下做一個(gè)總結(jié)
1.觸發(fā)軟復(fù)位,MAC和DMA控制器會復(fù)位DMA,MTL,MAC這幾個(gè)子系統(tǒng)的內(nèi)部邏輯和相關(guān)寄存器。
2.該位是自清零的,即軟件寫1觸發(fā)軟復(fù)位,硬件復(fù)位完成清零。
3.必須等到DWC_ether_qos所有的時(shí)鐘域都完成復(fù)位才會完成,才會清零該位。
4.該位為0之前,即為1時(shí)不能寫DWC_ether_qos的任何寄存器。
- 該位置位后,不能立馬去回讀該位,需要等待4個(gè)CSR周期后才能讀 ,因?yàn)闋顟B(tài)更新需要時(shí)間(具體的原因就涉及具體的總線協(xié)議了)。這里是驅(qū)動編寫的一個(gè)容易掉坑的地方需要注意。立即讀可能讀出0認(rèn)為復(fù)位完成了(實(shí)際復(fù)位還未完成)馬上去操作其他寄存器會導(dǎo)致不可預(yù)知結(jié)果,這種結(jié)果是隨機(jī)的導(dǎo)致的現(xiàn)象更可能是隨機(jī)加隨機(jī)。
- 復(fù)位需要PHY的所有input時(shí)鐘比如RXC有效 ,這一點(diǎn)也是驅(qū)動編寫容易掉坑的地方,如果RXC引腳映射錯(cuò)誤,PHY未就緒,都可以導(dǎo)致沒有RXC時(shí)鐘而不能完成復(fù)位。如果你遇到不能軟復(fù)位的問題第一步就查這里吧!
- 復(fù)位完成時(shí)間是不確定的 ,需要等到所有時(shí)鐘域完成復(fù)位才算,所以要等最慢的那個(gè)完成才算。底層接口最好只提供set_rst和get_rst兩個(gè)接口,由上層去調(diào)用該兩個(gè)接口實(shí)現(xiàn)等待查詢操作。因?yàn)闀r(shí)間不定,所以調(diào)用者可以使用線程等待,超時(shí)重試等處理,而如果底層接口使用指令死等則效率太低,會占用CPU,并且也不知道設(shè)置死等多長時(shí)間合適(指令死等時(shí)間受主頻等影響,使用定時(shí)器則需要占用硬件外設(shè)且不具備可移植性)。
三.軟復(fù)位不能完成的案例
我驅(qū)動開發(fā)時(shí)就遇到過不能軟復(fù)位的案例,后面調(diào)試發(fā)現(xiàn)一個(gè)是RXC引腳映射錯(cuò)誤導(dǎo)致的,另外一個(gè)就是PHY沒有輸出RXC的時(shí)鐘導(dǎo)致的,所以如果你遇到類似問題先查上述原因吧。
另外觸發(fā)復(fù)位后等待4個(gè)CSR時(shí)鐘以上再去查詢這點(diǎn)也很重要,因?yàn)檫@個(gè)很可能導(dǎo)致隨機(jī)問題,也就是你可能立馬回讀讀到的是1,那么繼續(xù)等待為0復(fù)位完成,沒問題。也可能是立馬讀到0,沒有復(fù)位你認(rèn)為復(fù)位了繼續(xù)去操作寄存器,此時(shí)操作寄存器操作行為不可預(yù)料。所以很可能導(dǎo)致隨機(jī)異常,并且很難定位。這個(gè)時(shí)候你可能會遇到白天有問題,晚上沒問題(因?yàn)闇囟葘?dǎo)致讀寫時(shí)序細(xì)微差異可能導(dǎo)致立馬回讀的狀態(tài)不一樣),重新編譯一下運(yùn)行有問題,再重新編譯一下運(yùn)行沒問題,加個(gè)打印有問題,去掉又沒問題等各種詭異的問題,此時(shí)你可能會覺得這是神學(xué)了,只能燒香拜佛了。實(shí)際上任何問題都有確定的原因的只是你不知道而已,所以驅(qū)動開發(fā)者遇到問題從來不說神學(xué),也從來不瞎試,而是從原理分析,看手冊,梳理原理,梳理路徑,反推,測信號,逐步推進(jìn)等方式去定位根本原因。這就是驅(qū)動開發(fā)與一般開發(fā)的區(qū)別。如果還找不到原因,上廁所時(shí)翻翻手冊吧,你可能會有所發(fā)現(xiàn)。隨手翻手冊,手冊當(dāng)小說看,是驅(qū)動開發(fā)的必備素養(yǎng),基本上我每開發(fā)一個(gè)IP驅(qū)動,至少手冊的所有文字都要看一遍以上,尤其是標(biāo)注*號的,note的,其他就是各個(gè)模塊調(diào)試時(shí)詳讀具體章節(jié)加翻閱,寄存器至少是每一個(gè)寄存器的每一個(gè)bit都要看一遍的。當(dāng)然開發(fā)階段熟讀手冊,勘誤手冊,積累,多調(diào)試不通配置的效果等很重要,這樣才可能遇到問題知道查哪,才有可能上廁所時(shí)靈感迸發(fā)。
四.總結(jié)
驅(qū)動開發(fā)需要注重細(xì)節(jié),了解原理很重要,手冊一定要熟讀,經(jīng)驗(yàn)積累也很重要,一定要充分調(diào)試各個(gè)功能,多去嘗試不同配置對應(yīng)的不同效果。
-
驅(qū)動器
+關(guān)注
關(guān)注
52文章
8099瀏覽量
145817 -
嵌入式
+關(guān)注
關(guān)注
5059文章
18974瀏覽量
302062 -
以太網(wǎng)
+關(guān)注
關(guān)注
40文章
5343瀏覽量
170804 -
寄存器
+關(guān)注
關(guān)注
31文章
5294瀏覽量
119816 -
PHY
+關(guān)注
關(guān)注
2文章
301瀏覽量
51659 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
491瀏覽量
27457
發(fā)布評論請先 登錄
相關(guān)推薦
評論