回复 10# outfind
Oh? Thank you very much~
Let me try~
这两天被一个工作上的活拖累了连圣诞都没过好。
我今天试了试,outfind说的,发现我的板子上mmc1没有device信息。这是dmesg里关于MMC的内容。
=====================
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
s3c-sdhci s3c-sdhci.0: clock source 0: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.0: clock source 1: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.0: clock source 2: mmc_bus (44333333 Hz)
to add external irq as a card detect signal......
if (pdata->cfg_ext_cd)......
mmc0: SDHCI controller on samsung-hsmmc using ADMA
request_irq......
sdhci: card inserted.
s3c-sdhci s3c-sdhci.1: clock source 0: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.1: clock source 1: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.1: clock source 2: mmc_bus (44333333 Hz)
to add external irq as a card detect signal......
mmc1: SDHCI controller on samsung-hsmmc using ADMA
-------------------------------------
安装libertas_sdio.ko之后,dmesg里只有以下两个行信息:
=====================
libertas_sdio: Libertas SDIO driver
libertas_sdio: Copyright Pierre Ossman
-------------------------------------
刚用crazyman给的办法查了下无线设备,以前一直不知道怎么查,结果没有任何无线设备。看来读代码是必须的了~
谢谢outfind和crazyman~
回复 13# yystju
嗯,设备并没有加载上,mmc1没有检测到设备,这两行只是告诉你把libertas的模块加载上了
今天看了些libertas的代码,在里边使劲儿加printk希望找出些头绪,不过到目前发现除了if_sdio_init_module肯定是走了,其他代码似乎根本没有动静。
我现在很晕的是,OK6410的硬件手册里边关于WIFI只有板子上的接法,没有WIFI模块的管脚接法。所以根本不知道那根线接到哪。。。只能假定说硬件接法都是一样的(大家都是从三星的板上copy的电路),尤其那两个接GPIO的线,所有板子都如此。由于这样成了"黑盒",自己试图写些代码来探索一下也成了泡影。
另外有个概念搞不懂,mmc和sdio应该都能叫做bus,他们感觉不是一回事儿。可是在google上查linux mmc wifi查出来的也是sdio wifi的差不多的东西。.说他们是一回事儿吧,在/sys/bus/mmc/devices下边可以看见SD卡(mmc0), 而/sys/bus/sdio/devices下边什么都没有。我折腾这么久sdio, 是不是方向正确阿。到底概念上是怎么回事儿啊?
还有,上次提到的那个marvell网站上的驱动个人推断是比较老的2.6版本上的驱动。现在应该用/linuxkernel/driver/net/wireless/libertas那个感觉就行(如果真的可以的话)。但是不知道从marvell下载的firmware是不是能在这个版本的驱动里边用。因为到现在还没能成功到那一步呢。
http://en.wikipedia.org/wiki/MultiMediaCard这里有一张表包含有硬件方面MMC和SDIO的技术特性的对比。(发现SDIO每年还要缴纳$1000的版税...)
http://en.wikipedia.org/wiki/Secure_Digital_card#Secure_Digital_Input_Output_.28SDIO.29wikipedia内容真是无人能及。太详细了。
不过发现没找到论述linux sdio 内核支持架构的文档。
还有这个讲得还是挺好的,如果能再详细点就好了http://hi.baidu.com/kkxxzz/blog/item/e6607b1f2ccc2366f624e496.html
http://blog.csdn.net/zhangqingsup/archive/2010/03/20/5399258.aspx这个看着非常靠谱。关键我linux的内核知识比较匮乏,目前看不懂。明天继续恶补吧~
-------------------------------------
安装libertas_sdio.ko之后,dmesg里只有以下两个行信息:
=====================
libertas_sdio: Libertas SDIO driver
libertas_sdio: Copyright Pierre Ossman
-------------------------------------
从你的提示信息上来看,你是在if_sdio文件中,if_sdio_init_module成功了。
但是后面执行
ret = sdio_register_driver(&if_sdio_driver);
应该是没有成功的
本帖最后由 yystju 于 2010-12-31 15:55 编辑
终于搞定了,来结贴。大家新年快乐~
希望对大家有用。这两天内核代码看了不少,不过深感基础知识比较差,看得懂得不是很多。而且我们用的2.6.28.6的内核相对于从kernel.org下载的修改了不少地方,内核的移植目前还路很远阿。现在都2.6.35了。
I) 代码改动:
总结起来呢,就改了两行代码 (字字血泪啊,哈哈):
1. linux2.6.28/arch/arm/mach-s3c6410/setup_sdhi.c (94):
从...
#if 0
...改为...
#if 1
...2. linux2.6.28/arch/arm/plat-s3c/dev-hsmmc1.c (41):
从...
MMC_CAP_SD_HIGHSPEED),
...改为...
MMC_CAP_SD_HIGHSPEED | MMC_CAP_ON_BOARD),
...II) 配置内容
首先要把8686的firmware都copy到linux2.6.28/firmware/ 并将helper_sd.bin改名叫sd8686_helper.bin(而sd8686.bin名字不变).
然后在make menuconfig里边,
1. 在Device Dirvier->Generic Device Option->External firmware blobs to build into the kernel binary 里边写入"sd8686_helper.bin sd8686.bin"
2. 在Device Dirvier->Network device support->Wireless LAN里边将所有Marvell 8xxx Libertas WLAN driver support设成built-in ("Marvell 8xxx Libertas WLAN driver support with thin firmware ..." 不用).
3. 编译内核然后上传。
然后重新冷启动(见副作用).在启动串口输出或者dmesg里边,你应该能看到类似下边的内容:
======================
...
mmc1: new SDIO card at address 0001
libertas_sdio mmc1:0001:1: firmware: using built-in firmware sd8686_helper.bin
libertas_sdio mmc1:0001:1: firmware: using built-in firmware sd8686.bin
libertas: 00:27:13:ed:28:a4, fw 9.70.3p24, cap 0x00000303
libertas: PREP_CMD: command 0x00a3 failed: 2
libertas: PREP_CMD: command 0x00a3 failed: 2
libertas: eth1: Marvell WLAN 802.11 adapter
...
--------------------------------------
注意:在我的板上叫eth1, 不是wlan0
4. 设置
首先ifconfig eth1 up,然后用iwlist eth1 scan查看能否查到接入点。
然后配置无线,基本上所有的参数都可以从iwlist scan的结果里找到, 除了passwd。(我用的是WEP, 如果大家用的什么LEAP或者WPA,WPA2等等的话估计要自己搞了,我实在是外行。)
======================
iwconfig eth1 essid <ESSID> freq <FREQENCY> channel <CHANNEL> ap <ACCESS POINT> rate 54M auto key restricted s:<passwd>
--------------------------------------
最后设置IP(见局限)
======================
ifconfig eth1 <IP>
--------------------------------------
III) 副作用和局限
1. 只有第一次冷启动可以侦测到mmc1, linux reboot或者 uboot reset都不能。不是很懂原因。不过很可能是MMC_CAP_ON_BOARD造成的。
2. 目前不能DHCP, 因为板子上没有dhclient,而我dhcp交叉编译没搞定。所以我就直接设了个地址,目前工作正常。
3. 设置了的无线网链接过一会儿不用就会断,然后要先ifconfig eth1 down, 再up, 然后重新用iwconfig设置。(貌似telnet上去一个链接,它就不断了~)
4. 用模块方式编译的内核,手动加载驱动时候无论如何都报firmware load failed (ret = -2), 无解。
5. IPV6不会...
IV) 硬件
我只有OK6410。不清楚别的板子上是否需要改动。
V) 重要参考文章或帮助文档
1. http://blog.csdn.net/zhangqingsup/archive/2010/03/20/5399258.aspx
2. http://blog.csdn.net/unbutun/archive/2009/04/03/4022391.aspx
3. http://linux.die.net/man/8/iwconfig
4. http://chgw.blog.hexun.com/10803450_d.html