轉載請指明出處。
參考《關於AM335X移植SDIO WIFI的簡易教程》
http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/127565.aspx
經過一周的摸索,基本上實現了wifi的功能。以下記錄下移植的步驟
系統環境為:linux3.2.0 ,內核 2.6.32
1、第一步當然是確認PIN MUX了。一般來說,如下幾個PIN(采用4線SDIO)是不能少的。
wlan_en(這個也可以沒有,默認拉高就可以)
mmcX_cmd
mmcX_clk
mmcX_data0
mmcX_data1
mmcX_data2
mmcX_data3
注:上面的X是你選用的MMC總線,對335來說可能是0,1,2
2、確認了以上管腳和對應的pin mux后,就可以進入代碼修改環節:
AM335在內核中對應的BSP代碼位於:
arch/arm/mach-omap2/board-am335xevm.c
先在其中修改或增加一個節點:
/* Module pin mux for wlan and bluetooth */ // mxh 20170606
static struct pinmux_config mmc2_ap6212_pin_mux[] = {
{"gpmc_a7.gpio1_23", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT}, //電源
{"gpmc_a6.gpio1_22", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT}, //WAKE_HoST
{"gpmc_clk.mmc2_clk", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT},
{"gpmc_csn3.mmc2_cmd", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT},
{"gpmc_a1.mmc2_dat0", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT},
{"gpmc_a2.mmc2_dat1", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT},
{"gpmc_a3.mmc2_dat2", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT},
{"gpmc_ad15.mmc2_dat3", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT},
{NULL, 0},
};
***************** 注意:配置完必須檢查這里的管腳有沒有在其它的地方進行配置,如果有把它們都屏蔽掉。
3、在內核中添加對應的init函數。
// mxh add 20170606
static void mmc2_ap6212_init(int evm_id, int profile)
{
printk(KERN_ERR"=============init AP6212 ==========\n");
setup_pin_mux(mmc2_ap6212_pin_mux);
/* 已加到 am335x_mmc數組定義中
am335x_mmc[1].mmc = 3;
am335x_mmc[1].name = "bcmsdh_sdmmc";
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;
*/
/* mmc will be initialized when mmc0_init is called */
/*
gpio_request(GPIO_TO_PIN(1, 23), "AP6212_VC");
gpio_direction_output(GPIO_TO_PIN(1, 23), 1);
gpio_export(GPIO_TO_PIN(1, 23), 0);
*/
/*
gpio_request(GPIO_TO_PIN(1, 22), "AP6212_WL_WAKE");
gpio_direction_output(GPIO_TO_PIN(1, 22), 0);
gpio_export(GPIO_TO_PIN(1, 22), 0);
*/
return;
}
**************** 注:這里有一個非常容易犯錯的地方,這個項目中我們用的mmc總線為2,眾所周知AM335x共有三組SDIO,分別是mmc0,mmc1,mmc2
**************** 你們會很驚奇地發現,我們在這里用了am335x_mmc[1],明明是mmc2為什么[]中是1呢?答案是我們在實際應用中沒有配置mmc1,所以這里要用1;
**************** 至於"am335x_mmc[1].mmc = 3"中的3代表是的物理的總線位置(mmc0對應1,mmc1對應2,mmc2對應3)
因為在am335x數據定義中已定義了 mmc[1],所有在此函數中只保留了一個管腳設置調用。
4、到這里對bsp的修改就差不多了,把初始化函數內核加載。
static struct evm_dev_cfg myd_am335x_dev_cfg[] = {
{evm_nand_init, DEV_ON_BASEBOARD, PROFILE_ALL},
{mmc0_init, DEV_ON_BASEBOARD, PROFILE_ALL},
。。。
{mmc2_ap6212_init, DEV_ON_BASEBOARD, PROFILE_ALL}, //mxh add 20170606
5、把模塊驅動加入內核中,我們放在drivers/net/wireless/bcmdhd
把bcmdhd.1.201.59.x.cn.tgz解壓在這里。
修改
drivers/net/wireless/Makefile
obj-$(CONFIG_BCMDHD) += bcmdhd/
drivers/net/wireless/Kconfig
source "drivers/net/wireless/bcmdhd/Kconfig"
6、配置對應的內核選項:
在內核目錄運行make menuconfig(先確認對應的ARCH是否是arm)
確認如下配置:
Networking support->Wireless->cfg80211 - wireless configuration API 配置為<*>
Device Drivers->Network device support->Wireless LAN-> <*> Broadcom FullMAC wireless cards support 配置
設置固件路徑
(/opt/firmware/ap6212/fw_bcm43438a0.bin) Firmware path
(/opt/firmware/ap6212/nvram_ap6212.txt) NVRAM path
中斷設置選擇Interrupt type (In-Band Interrupt)
配置保存后,確認.config中包含以下幾項
CONFIG_BCMDHD=y
CONFIG_BCMDHD_FW_PATH="/opt/firmware/ap6212/fw_bcm43438a0.bin"
CONFIG_BCMDHD_NVRAM_PATH="/opt/firmware/ap6212/nvram_ap6212.txt"
CONFIG_BCMDHD_SDIO=y
# CONFIG_BCMDHD_OOB is not set
CONFIG_BCMDHD_SDIO_IRQ=y
2017/10/16增加:
編譯系統時出現如下錯誤的解決方法:
(1)8875:變量WIPHY_FLAG_HAVE_AP_SME 沒有定義,直接把此句注釋;
(2)1354:sdio_reset_comm 沒有定義,修改為if(1==0)
7、燒寫系統后並重啟后
在/opt/firmware/ap6212中拷入固件
參考相關文檔使用wpa_supplicant配置網絡。(目前dhcp命名無效,所以采用ifconfig 分配地址的方式並使wlan0 up)
ping 192.168.1.1 OK