cs8900_probe函式本身並不難,但是你必須清楚probe函式的重要職能。因為你很有可能要為屬於你的裝置編寫乙個probe函式。
#if defined(config_arch_smdk2410) dev->dev_addr[0] = 0x00; dev->dev_addr[1] = 0x00; dev->dev_addr[2] = 0x3e; dev->dev_addr[3] = 0x26; dev->dev_addr[4] = 0x0a; dev->dev_addr[5] = 0x00; #endif使用類似的**,為我們的網路晶元提供 dev->if_port = if_port_10baset;(支援的多種介面) dev->priv = (void *) &priv;(裝置私有資料結構)
enum ;下面的**對於移植是非常關鍵的。vsmdk2410_eth_io是網絡卡的虛擬位址,irq_eint9是硬體中斷。這兩個值和另外乙個位址(網絡卡的實體地址)必須在標頭檔案中定義,而且要正確的定義。
#if defined(config_arch_smdk2410) dev->base_addr = vsmdk2410_eth_io + 0x300; dev->irq = irq_eint9; #endif /* #if defined(config_arch_smdk2410) */接下來分配i/o埠資源。使用的函式是check_mem_region和request_mem_region。ldd中的理論結合這裡的實踐,相信你很快就掌握驅動程式設計中的這個api了。
下面的**實現了硬體的讀寫。使用的函式是cs8900_read和cs8900_write。雖然只需很短的篇幅就可以解釋這對讀寫函式,但是為了不分散你對cs8900_probe函式的注意力,我還是留到下一節中說,不要著急:) 哦,差點忘了,這裡使用了核心的自旋鎖(spin_lock_init),不過關於自旋鎖的機制已經超出本文的範圍了。你現在只需要知道自旋鎖用於併發控制,以及如何動態初始化自旋鎖就可以了。如果你還想繼續了解,請自行學習與自旋鎖相關的api,它們是:
spinlock_t spin;//定義自旋鎖 spin_lock(lock);//獲得自旋鎖 spin_trylock(lock);//嘗試獲得自旋鎖 spin_unlock(lock);//釋放自旋鎖一句話總結:cs8900_probe函式繼續為裝置進行初始化,並申請各種資源。
cs8900網絡卡驅動簡要解析 4
我們最初分析的函式是 cs8900 init 並由此展開,跟蹤到了 cs8900 probe cs8900 read cs8900 write 等,現在收回來,還是回到 cs8900 init中。在 cs8900 init 裡找到如下一行 ndev open cs8900 start 如果你之前了解...
cs8900網絡卡驅動簡要解析 7
上一次講的cs8900 receive函式是在中斷處理函式中呼叫的,也就是當中斷到來,如果判斷出是資料接收情況,則通過這個函式進行資料接收。那麼如果中斷是由於其他事件觸發的呢,當然就需要其他 了,不過那些 並不難,大家自己看就是了。中斷的內容講完後,cs8900 start函式也算告一段落,我們回到...
cs8900網絡卡驅動簡要解析 1
和所有其他模組一樣,函式init module是cs8900的入口 module init cs8900 init module exit cs8900 cleanup cs8900 init函式填充net device結構體。net device是網路驅動中最為重要的乙個結構,需要認真閱讀,其原型...