【Linux核心驅動】編譯Linux下mt7612u的驅動__Linux

來源:互聯網
上載者:User

最近項目中使用了一個wifi模組,主控是mt7612u,為usb介面。使用的Linux版本為2.6.35,在編譯驅動的過程中遇到不少問題,特在此記錄。 擷取源碼

MTK官網驅動。包含Windows、Linux以及Mac下的驅動。 我修改的Github驅動。 添加新的Platform

在源碼中內建了一些硬體平台的配置資訊,如果沒有適配於你所使用平台的資訊,需要手動添加配置資訊。 修改根目錄的Makefile

在38行附近可以找到如下代碼:

#PLATFORM: Target platformPLATFORM = PC#PLATFORM = 5VT#PLATFORM = IKANOS_V160

下面我需要添加一個ARM架構的platform,並使之生效:

#PLATFORM: Target platform#PLATFORM = PCPLATFORM = ARM#PLATFORM = 5VT#PLATFORM = IKANOS_V160

注意,只能有一個platform生效,否則會出現衝突。

在111行附近,可以找到與平台相關的環境變數,主要包括核心源碼路徑和交叉編譯器的路徑:

ifeq ($(PLATFORM),5VT)LINUX_SRC = /home/ralink-2860-sdk-5vt-distribution/linux-2.6.17CROSS_COMPILE = /opt/crosstool/uClibc_v5te_le_gcc_4_1_1/bin/arm-linux-endif

模仿上面的代碼,我們添加ARM平台的兩個環境變數設定:

ifeq ($(PLATFORM),ARM)                                                                      LINUX_SRC = /home/ryan/develop/kernel/linux-2.6.35.3                                        CROSS_COMPILE = /home/common/cross_compiler/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-                              endif
修改os/linux/config.mk

在1280行附近可以找到platform相關的定義,這裡主要是CFLAGS的定義,決定了驅動支援哪些特性,以及特殊的編譯選項:

################################################## Platform Related definitions#  #################################################ifeq ($(PLATFORM),5VT)                                                                                                    #WFLAGS += -DCONFIG_5VT_ENHANCEendif

接下來添加ARM架構的platform資訊:

ifeq ($(PLATFORM),ARM)                                                                                                    WFLAGS += -DRT_LITTLE_ENDIAN -wEXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/includeendif

因為ARM使用小端儲存,所以要定義宏RT_LITTLE_ENDIAN,-w的目的是不顯示警告資訊,因為很多代碼由於曆史原因,會產生大量警告,不利於快速定位錯誤資訊。 選擇網卡的工作模式

網卡一般有兩種模式,AP和STA。AP是被串連的一方,STA是發起串連的一方。因為我的需求是AP,所以需要配置為AP。

開啟根目錄的Makefile,在第2行可以找到RT28xx_MODE這個變數,預設是STA,我們把它改為AP。 選擇晶片集

許多晶片廠商針對同一型號的晶片,提供多種不同的介面,比如USB,PCI等。某個晶片經過小幅修改可能又變了一個型號,但是他們實際上使用相同的驅動,他們可以作為一個系列。在選擇晶片集的時候,我們需要將使用相同介面的同一系列的所有晶片都選上,在Makefile中,會針對他們相同和不同的特性做出相應的配置。

在根目錄的Makefile中的21行附近可以找到CHIPSET這個變數。上面有一些注釋,如下:

# CHIPSET# rt2860, rt2870, rt2880, rt2070, rt3070, rt3090, rt3572, rt3062, rt3562, rt3593, rt3573# rt3562(for rt3592), rt3050, rt3350, rt3352, rt5350, rt5370, rt5390, rt5572, rt5592, # rt8592(for rt85592), # mt7601e, mt7601u,# mt7620,# mt7650e, mt7630e, mt7610e, mt7650u, mt7630u, mt7610u# mt7662e, mt7632e, mt7612e, mt7662u, mt7632u, mt7612u

每一行表示一個系列,e結尾表示PCI介面,u結尾表示USB介面,針對mt7612u,需要選擇mt7662u, mt7632u, mt7612u。

所以CHIPSET變數配置如下:

ifeq ($(CHIPSET),)CHIPSET = mt7612u mt7632u mt7662uendif

這裡注意,第一個值將作為驅動的名字,所以我把mt7612u放在第一個。 編譯

完成了上面的配置,下面就可以進行編譯了,直接在源碼根目錄執行make即可,通常情況下,通常你會遇到很多錯誤,一點點修改即可。 我遇到的問題

WARNING: “cfg80211_find_vendor_ie” [/home/ryan/develop/module/mt7612u/os/linux/mt7662u_ap.ko] undefined!

這個問題的原因是這個函式宣告了,但沒有定義。通過在核心中搜尋,我們發現並沒有這個函數,但是在3.10的核心中搜尋卻可以找到,基本可以確定是核心版本問題導致的。
解決方案就是使用條件編譯將調用這個函數的程式碼封裝含起來,條件就是核心版本。通過搜尋,我們可以知道在cfg80211_ap.c這個檔案中的第113行調用了這個函數:

wmm_ie = cfg80211_find_vendor_ie(WFA_OUI, WMM_OUI_TYPE, pBeacon->beacon_tail, pBeacon->beacon_tail_len);

通過Google搜尋,修改為如下形式

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) wmm_ie = cfg80211_find_vendor_ie(WFA_OUI, WMM_OUI_TYPE, pBeacon->beacon_ta#endif

WARNING: “RTMP_CFG80211_VIF_P2P_GO_ON” [/home/ryan/develop/module/mt7612u/os/linux/mt7662u_ap.ko] undefined!
這與上面的問題原因相同,函式宣告但是未定義。但是這個函數並不是核心中的函數,而是驅動源碼中的函數。
通過搜尋,可以得知函數實際上定義了,但是因為我們沒有啟用P2P功能,所以它並沒有被編譯,此時絕對不能想當然的開啟P2P支援,在不瞭解一個功能的時候,如果使用它會引入更多的錯誤。
因為我們沒有啟用P2P,但是出現這個警告表示我們確實調用了這個函數,但是正常來說本不該調用,下面是調用的位置,在cfg80211_ap.c中的287行:

if (RTMP_CFG80211_VIF_P2P_GO_ON(pAd))     BeaconTransmit.field.MODE = MODE_OFDM; /* Use 6Mbps */else    BeaconTransmit.field.MODE = MODE_CCK;   

解決方式仍然是添加條件編譯,仍然是通過Google搜尋,我找到了正確的添加方式:

#ifdef RT_CFG80211_P2P_SUPPORTif (RTMP_CFG80211_VIF_P2P_GO_ON(pAd))     BeaconTransmit.field.MODE = MODE_OFDM; /* Use 6Mbps */else#endif    BeaconTransmit.field.MODE = MODE_CCK;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.