关于AM335X移植SDIO WIFI的简易教程(转)
最近應(yīng)一個(gè)朋友邀請(qǐng),幫他移植了SDIO WIFI到3.2版本內(nèi)核。因?yàn)橹耙呀?jīng)成功移植了3.14內(nèi)核,所以整個(gè)過(guò)程花了一個(gè)下午就完成了。
話不多說(shuō),先交待一下平臺(tái):
CPU:TI?AM3352?600M
OS:ubuntu core 12.04 for arm
SDK版本:TI SDK 06.00.00(非常老的一個(gè)版本,但比較穩(wěn)定。也是比較通用的工業(yè)核心板自帶系統(tǒng))
內(nèi)核版本:3.2.0(SDK 06.00.00自帶)
SDIO WIFI:RTL8189e WIFI模塊
AM335xSDK 06_00_00_00下載地址:
http://software-dl.ti.com/sitara_linux/esd/AM335xSDK/06_00_00_00/index_FDS.html
OS下載地址:
12.04是比較古老的系統(tǒng)了,官網(wǎng)已經(jīng)沒(méi)有下載連接了。可以到我的網(wǎng)盤(pán)去下載。
http://pan.baidu.com/s/1hskhqdQ
先說(shuō)說(shuō)SDIO WIFI移植的通用流程:
1、第一步當(dāng)然是確認(rèn)PIN MUX了。一般來(lái)說(shuō),如下幾個(gè)PIN(采用4線SDIO)是不能少的。
wlan_en(這個(gè)也可以沒(méi)有,默認(rèn)拉高就可以)
mmcX_cmd
mmcX_clk
mmcX_data0
mmcX_data1
mmcX_data2
mmcX_data3
注:上面的X是你選用的MMC總線,對(duì)335來(lái)說(shuō)可能是0,1,2
2、確認(rèn)了以上管腳和對(duì)應(yīng)的pin mux后,就可以進(jìn)入代碼修改環(huán)節(jié):
AM335在內(nèi)核中對(duì)應(yīng)的BSP代碼位于:
arch/arm/mach-omap2/board-am335xevm.c
先在其中修改或增加一個(gè)節(jié)點(diǎn):
/* Module pin mux for wlan and bluetooth */
static struct pinmux_config mmc2_qca9377_pin_mux[] = {
//add by alan for mmc3(mmcblk2)
{"gpmc_oen_ren.gpio2_3", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP},
{"gpmc_clk.mmc2_clk", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT_PULLUP},
{"gpmc_csn3.mmc2_cmd", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT_PULLUP},
{"gpmc_ad12.mmc2_dat0", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT_PULLUP},
{"gpmc_ad13.mmc2_dat1", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT_PULLUP},
{"gpmc_ad14.mmc2_dat2", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT_PULLUP},
{"gpmc_ad15.mmc2_dat3", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT_PULLUP},
{NULL, 0},
};
*****************注:1、本次使用的模塊是rtl8189的,模塊與9377是pin2pin兼容的,所以就沒(méi)有改名字
***************** 2、配置完必須檢查這里的管腳有沒(méi)有在其它的地方進(jìn)行配置,如果有把它們都屏蔽掉。
3、在內(nèi)核中添加對(duì)應(yīng)的init函數(shù)。
static void mmc2_qca9377_init(int evm_id, int profile)
{
setup_pin_mux(mmc2_qca9377_pin_mux);
am335x_mmc[1].mmc = 3;
am335x_mmc[1].name = "rtl8189es";
am335x_mmc[1].caps = MMC_CAP_4_BIT_DATA | MMC_CAP_NONREMOVABLE | MMC_CAP_SD_HIGHSPEED;
am335x_mmc[1].nonremovable = true;
am335x_mmc[1].gpio_cd = -EINVAL;
am335x_mmc[1].gpio_wp = -EINVAL;
am335x_mmc[1].ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34; /* 3V3 */
/* mmc will be initialized when mmc0_init is called */
return;
}
**************** 注:這里有一個(gè)非常容易犯錯(cuò)的地方,這個(gè)項(xiàng)目中我們用的mmc總線為2,眾所周知AM335x共有三組SDIO,分別是mmc0,mmc1,mmc2
**************** 你們會(huì)很驚奇地發(fā)現(xiàn),我們?cè)谶@里用了am335x_mmc[1],明明是mmc2為什么[]中是1呢?答案是我們?cè)趯?shí)際應(yīng)用中沒(méi)有配置mmc1,所以這里要用1;
**************** 至于"am335x_mmc[1].mmc = 3"中的3代表是的物理的總線位置(mmc0對(duì)應(yīng)1,mmc1對(duì)應(yīng)2,mmc2對(duì)應(yīng)3)
4、添加最為重要的函數(shù),就是mmc的電源管理配置和clock ref
static void wl12xx_init(int evm_id, int profile)
{
struct device *dev;
struct omap_mmc_platform_data *pdata;
int ret;
//配置wlan_en管腳,我們用的是gpio2,3
am335xevm_wlan_data.wlan_enable_gpio = GPIO_TO_PIN(2, 3);
if (wl12xx_set_platform_data(&am335xevm_wlan_data))
pr_err("error setting wl12xx data\n");
//注意這里am335x_mmc[1]中的1原因和步驟3中注釋的一樣,如果你的情況不同請(qǐng)改掉
dev = am335x_mmc[1].dev;
if (!dev) {
pr_err("wl12xx mmc device initialization failed\n");
goto out;
}
pdata = dev->platform_data;
if (!pdata) {
pr_err("Platfrom data of wl12xx device not set\n");
goto out;
}
ret = gpio_request_one(am335xevm_wlan_data.wlan_enable_gpio,
GPIOF_OUT_INIT_LOW, "wlan_en");
if (ret) {
pr_err("Error requesting wlan enable gpio: %d\n", ret);
goto out;
}
pdata->slots[0].set_power = wl12xx_set_power;
out:
return;
}
//wl12xx_init中用到了下面函數(shù)
/* wlan enable pin */
#define AM33XX_CONTROL_PADCONF_GPMC_CSN0_OFFSET 0x087C
static int wl12xx_set_power(struct device *dev, int slot, int on, int vdd)
{
int pad_mux_value;
if (on) {
gpio_direction_output(am335xevm_wlan_data.wlan_enable_gpio, 1);
/* Enable pullup on the WLAN enable pin for keeping wlan active during suspend
in wowlan mode */
mdelay(70);
} else {
gpio_direction_output(am335xevm_wlan_data.wlan_enable_gpio, 0);
}
return 0;
}
5、到這里對(duì)bsp的修改就差不多了,剩下一個(gè)步驟。確認(rèn)以上的函數(shù)被內(nèi)核加載。
我們的板子把EEPROM寫(xiě)死成了Starter Kit的配置,如果你的不同,請(qǐng)檢查對(duì)應(yīng)的啟動(dòng)序列。
/* EVM - Starter Kit */
static struct evm_dev_cfg evm_sk_dev_cfg[] = {
/******************確認(rèn)代碼中包含如下兩項(xiàng)***/
{mmc2_qca9377_init, DEV_ON_BASEBOARD, PROFILE_ALL},
{wl12xx_init, DEV_ON_BASEBOARD, PROFILE_ALL},
6、把模塊驅(qū)動(dòng)加入內(nèi)核中,我們放在drivers/net/wireless/
把rtl8189ES_linux_v4.3.18.2_17395.20160422.tar解壓在這里。
由于我們用cfg80211的試來(lái)驅(qū)動(dòng),所以要檢查
drivers/net/wireless/rtl8189ES_linux_v4.3.18.2_17395.20160422/include/autoconf.h中宏定義
#define CONFIG_IOCTL_CFG80211
被打開(kāi)
修改
drivers/net/wireless/Makefile
obj-$(CONFIG_RTL8189ES) += rtl8189ES_linux_v4.3.18.2_17395.20160422/
drivers/net/wireless/Kconfig
source "drivers/net/wireless/rtl8189ES_linux_v4.3.18.2_17395.20160422/Kconfig"
7、配置對(duì)應(yīng)的內(nèi)核選項(xiàng):
在內(nèi)核目錄運(yùn)行make menuconfig(先確認(rèn)對(duì)應(yīng)的ARCH是否是arm)
確認(rèn)如下配置:
Networking support->Wireless->cfg80211 - wireless configuration API 配置為<M>
Device Drivers->Network device support->Wireless LAN->Realtek 8189E SDIO WiFi 配置為<M>
8、編譯,上機(jī)測(cè)試(大家用的方法可能都不太一樣,如里這里有疑問(wèn)請(qǐng)對(duì)照自己的方法)
make uImage && make modules
將內(nèi)核和模塊放到你的目標(biāo)板上測(cè)試吧。
9、寫(xiě)在最后:
移植SDIO WIFI有幾個(gè)基本知識(shí),知道后會(huì)事半功倍.首先你的SDIO總線要配置正確,如果配置好了在dmesg中能看到類似下面的信息:
mmc2:new high speed SDIO card at address 0001
再就是很多SDIO WIFI是需要fireware的,一般放在/lib/firemware;請(qǐng)留你的dmesg信息。我們用的rtl8189不需要另外的firmware固件。
明白了一個(gè)SDIO WIFI的移植方法后,可以舉一反三。這樣其它的SDIO WIFI也不在話下啦。。。
有興趣的朋友可以關(guān)注一下我的一個(gè)開(kāi)源硬件項(xiàng)目zcore-am335x mini:
資料鏈接:https://pan.baidu.com/s/1qYJB1Vm 密碼:5t5u
相關(guān)介紹:http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/127477.aspx
http://www.eeboard.com/bbs/thread-42233-1-1.html
http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/127565.aspx
轉(zhuǎn)載于:https://www.cnblogs.com/xihong2014/p/6951347.html
總結(jié)
以上是生活随笔為你收集整理的关于AM335X移植SDIO WIFI的简易教程(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: UVA 12716 GCD XOR(数论
- 下一篇: weak_ptr打破环状引用