SDIO WiFi模塊分析

分類: 底層開發

Andrew Huang <[email protected]轉載請註明作者及網址.


  手頭的上課s3c6410開發板,帶了SDIO接口的WiFi模塊,但是沒有Linux下的驅動,因此在上網絡驅動時課參考s3c2440的實現試着分析和調試一下SDIO的WiFi驅動。

   我手頭使用模塊是WM-G-MR-09模塊,其主控實際採用了marvell8686的IC來作爲主控芯片,是由臺灣環隆出的模塊。網上能找到最接近的Linux驅動是針對 s3c2440的官方出的 GSPI-8686-LINUX26-BULVERDE-9.70.3.p29-26409.P50.tar
      官方的源碼包提供的動態模塊形式的驅動和命令行工具。經過簡單修改Makefile,並且調步幾個iw_函數的調用後,成功的在linux 2.6.28下編譯成功,但是其中部分代碼拷貝自s3c2440,因此這個驅動必然不會正常運行。因此必須要分析其模塊的來改寫成s3c6410的模塊。

  首先這個模塊是WiFi+Bluetooth 的2合一的模塊。並且帶了SDIO/G-SPI的接口與CPU進行交互.

    
      
    SDIO接口比較明白,是源於SD卡的交互接口,後來擴展到多個硬件模塊的對接,比如SDIO的藍牙,WIFI模塊等。
    G-SPI是一個什麼接口呢?它實際上是SPI總線的擴展。原來在早期推廣SDIO接口,爲了取得更大兼容性,在設計硬件接口時,留出幾個PIN腳完全兼容SPI的接口。這樣就能讓只帶SPI的總線接口的CPU上也能使用SD卡。
   SPI是一個三線工業控制總線,它分別是 SPICLK(時鐘線),MOSI(主設備發送/從設備接收線),MISO(主設備接收/從設備發送),完全的SPI還有一根片選線 (CS線),如果缺省這一根,則只能主設備固定爲某一個設備。
   
    而G-SPI在這四根線上再進入擴展了一個CLK_REQ線和 一個外部中斷線 G-SPI_SINTn
其中外部中斷腳分析驅動象是用於喚醒和休眠的功能,而CLK_REQ是休眠時的時鐘頻率線(?)
兩種接口的對應關係如下。



  而CPU採用哪一種接口完全取決於硬件設計,在模塊的說明到,取決於IF_SEL_1和IF_SEL_2兩個pin腳的接法,即23/24號腳的接線,如果想配成SDIO的接口,兩個腳懸空,否則則成焊上兩個100K的下拉電阻.


在模塊原理圖也說得更清楚,即是否焊上r8,r9兩個電阻就決定軟件使用哪一個接口。
   

 雖然模塊支持兩個接口,但是所有代碼提供都是G-SPI的實始化代碼,硬件上也是如下設計.
 不巧的是手頭的模塊,以及學員手中模塊居然全是沒有焊r8/r9兩個電阻的模塊,即只能用使用SDIO接口。在打電話詢問了做Marvell的FAE的學員,他也無法確定SDIO接口的命令格式與G-SPI的命令格式完全一致,因此用SDIO直接初始化模塊的方案就放棄了。只採用G-SPI的接口來工作。
   
  接收下來確定S3C6410 上是否也支持這種SDIO的管腳上覆用SPI的用法。因爲S3c6410同時支持SDIO和SPI的模塊,但是如果 SDIO的PIN不能被SPI控制器接管,只能採用自行模擬時序的方法來通訊,這樣無疑大大增加了工作量,因此我查詢s3c6410的GPIO的配置,在GPIO的配置上,SPI的管腳是和SDIO複用的。但仔細分仔發現SDIO的管腳並沒有完全與SPI的複用。如果想使用G-SPI,必須在接線直接接在SPI的管腳上,並且把G-SPI外部中斷腳接在某一個外部中斷的GPIO之中。

  

而且關於模塊的中斷腳,這只是一個簡單低電平有效的外部中斷.
   
而這個管腳按照原理圖,它正好接在了GPH4上,即是第6組的第4箇中斷腳


至此,在s3c6410下的模塊驅動移植工作就變成了如下兩個工作.
   1.實現SPI S3c6410的驅動
   2.按對外部中斷腳,實現wan_interrupt響應

其餘工作重用官方驅動即可

SDIO驅動
   仔細分析s3c6410的關於SDIO的接口。發現在S3C6410有三個SDIO的channel 0使用GPG組,Channel 1使用GPH組。而channel 2使用 GPC組。但是隻有channel 2纔有SPI與SDIO管腳複用的可能性。而我手頭開發板其接在channel 1上,即GPH組上。因此軟件採用SPI的難度相當大。而且仔細分析,只能採用SDIO實現方法。




Linux 內核對Marvell網卡支持。

用Marvell關鍵字搜索 Linux 2.6.28 目錄下的drivers/net/wireless目錄,發現libertas就是對MW 8686的支持代碼。從源碼看直接 PCMIA接口(if_cs.c),USB接口(if_usb.c)和SDIO接口(if_sdio.c).並且分析源碼,發現其支持
  •    PCMIA支持 CF8385
  •    USB支持USB8388
  •    SDIO支持 sd8385/sd8686
而最新的linux 2.6.38.5支持的接口更多。把g-spi接口的支持也增加進來(if_spi.c)。芯片支持更加豐富
  • PCMIA支持CF8305/CF8381/CF8385
  • USB支持 USB8388/8682
  • SDIO支持 sd8385/sd8686/sd8688
  • G-SPI支持gspi8385/gspi8686/gspi8688

  
   
  因此在Linux 下可以直接使用SDIO的驅動驅動這一模塊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章