月度归档:2014年06月

关于CFE Uboot对内存的自动识别理解

自动识别的bootloader很简单,先初始化总线,然后尝试往一个内存地址写1个字节的数据,再读回来比较是否写成功。一般而言,内存大小总是用2的指数来标称,例如写4M地址成功,则加倍,写8M地址,如果再成功,就写16M地址….以此类推,1G的内存也不需要很多次,得到实际的内存大小之后再初始化内存相关的内容,这些代码在新版本的u-boot里面就有,熟悉C语言的话可以去看看,cfe需要输入命令才能确定内存的大小,那是很古老的代码的做法,也可能是为了保护某些东西不让人改变,防止山寨,但不符合开源精神….

焊了64M的内存往往要加一个电阻,实际上是增加一条地址线,原来电炉设计的时候是32M的内存,兼容64M,但是厂商为了节省成本,只焊了32M的,多余的地址线上也断开了。这种情况,没有22欧姆的电阻,直接短接也是可以的。

还有cfe的代码也是可以下载到的,去官网可以找到,有兴趣可以更改代码,增加自动识别内存,代码很简单,初始化总线以后尝试写内存在读回,比较结果,一个for循环就可以完成,前提是要找到初始化内存的位置

Linux SDK之uClinux、Broadcom、Atheros、Realtek、Ralink、Marvell、Intel

接触的Linux SDK越来越多,整理整理,分享分享,不求系统全面,对您有帮助便足矣
文中大部分是与AP/Router SoC解决方案(单芯片WIFI 路由器解决方案)相关的Linux SDK

SDK(Software Development Kit)软件开发工具包
一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合

想想,最早接触到的SDK是在Cortex-M3项目开发中,也叫BSP(板级支持包),
这种SDK里大部分是芯片资源(硬件平台)的驱动和测试程序,少有软件框架和操作系统的源码

uClinux
在用的ATMEL9200和9G25的SDK包就是uClinux的风格,Ralink的Ralink_Ap_SoC_SDK也是uClinux的风格,
不用多说,直接上地址:http://www.uclinux.org/

Ralink平台
MTK/Ralink,在用他们的AP/Router SoC方案,比如RT3050/3052,对应SDK的版本是Ralink_Ap_SoC_SDK_3301.tar.bz2,应该是从uClinux基础上修改而来,
http://www.tw-mcse.net/mcic/Ralink_ApSoC_SDK_3301.tar.bz2
华硕的RT-N56U/RT-N65U有在google code上公开源码,地址:http://code.google.com/p/rt-n56u/

Atheros平台
Qualcomm/Atheros,也在用他们的AP/Router SoC方案,比如AR9331/9344,说起Atheros不得不提TP-Link,TP-Link大量使用Atheros的方案,其中TL-WDR4300/4310就是用的AR9344,
TP-Link根据GPL协议开放了一些源码,地址:http://www.tp-link.com/en/support/gpl/
比如下载TL-WDR4300的源码包(GPL_2.6.31),是在Atheros官方提供的SDK包(LSDK-9.2.0和LSDK-WLAN-9.2.0)基础上进行了修改,但是没有开放LSDK-WLAN-9.2.0,不过没关系,LSDK-WLAN-9.2.0在CSDN上可以下载,地址:http://download.csdn.net/detail/nolycjyf/3722308
对于Atheros的WLAN驱动,另插一句,还记得madwifi、ath9k吗,没错,是同族的

Realtek平台
因为芯片封装上都有一只大螃蟹,所以大家喜欢叫他螃蟹,
在sourceforge上找到了它的一个SDK(RTL819x-SDK-v3.2.3),也是AP/Router SoC方案,感兴趣的可以下来看看,
地址:http://sourceforge.net/projects/rtl819x/?source=directory

Broadcom平台
想换成这个平台,这个平台的SDK资料相对少一点,但还是找到了一点踪迹,
华硕的RT-N16有在google code上开放源码,RT-N16用的就是Broadcom的BCM4716
地址:http://code.google.com/p/rt-n16/

Marvell平台
遗憾是没有找到任何有关Marvell平台的SDK资料

Intel平台
当然不能忘了Intel平台

找了这么多SDK源码包拿来干什么?
首先学习软件框架,Makefile会告诉你真相
然后就是Linux驱动,尤其WLAN/WIFI驱动
当然咀嚼源码的收获不用我多说了

AR9331/AR9341网口修正方法

看到之前AR9341网口顺序修改讨论帖http://www.right.com.cn/forum/thread-121913-1-1.html一直没个结果,于是晚上抽空摸索了1个小时终于搞定,顺带附上AR9331网口修正方法。



我使用的是官方attitude_adjustment源码编译的,就以attitude_adjustment的目录结构为例,红色为要修改的地方



AR9331修正方法:以编译tl-wr741n-v4固件为例,找到文件mach-tl-wr741nd-v4.c,在目录attitude_adjustment/target/linux/ar71xx/files/arch/mips/ath79/下,将代码

ath79_setup_ar933x_phy4_switch(true, true); 改为ath79_setup_ar933x_phy4_switch(false, false);或者直接删掉。



AR9341修正方法:以编译tl-wr841n-v8固件为例,在刚才的目录下找到文件mach-tl-wr841n-v8.c,将代码

ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_SW_PHY_SWAP);改为ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_SW_ONLY_MODE);

ath79_switch_data.phy_poll_mask = BIT(0);改为ath79_switch_data.phy_poll_mask = BIT(4);

ath79_eth0_data.phy_mask = BIT(0);改为ath79_eth0_data.phy_mask = BIT(4);



经测试,上述修改方法适用于pppoe拨号、DHCP动态IP地址和静态IP地址环境。

led灯的修正请根据具体机型修改匹配。

lan指示灯如果不对,可以修改下target/linux/ar71xx/base-files/etc/uci-defaults/leds这个文件(aa版本)
这样修改,我发的是自己制作的补丁的一部分(水星MW300R v4.0):
找到tl-wr841n-v8)部分,按如下修改:
         ucidef_set_led_netdev “wan” “WAN” “tp-link:green:wan” “eth0”
–        ucidef_set_led_switch “lan1” “LAN1” “tp-link:green:lan1” “switch0” “0x04”
–        ucidef_set_led_switch “lan2” “LAN2” “tp-link:green:lan2” “switch0” “0x08”
–        ucidef_set_led_switch “lan3” “LAN3” “tp-link:green:lan3” “switch0” “0x10”
–        ucidef_set_led_switch “lan4” “LAN4” “tp-link:green:lan4” “switch0” “0x02”
+        ucidef_set_led_switch “lan1” “LAN1” “tp-link:green:lan1” “switch0” “0x02”
+        ucidef_set_led_switch “lan2” “LAN2” “tp-link:green:lan2” “switch0” “0x04”
+        ucidef_set_led_switch “lan3” “LAN3” “tp-link:green:lan3” “switch0” “0x08”
+        ucidef_set_led_switch “lan4” “LAN4” “tp-link:green:lan4” “switch0” “0x10”
         ucidef_set_led_wlan “wlan” “WLAN” “tp-link:green:wlan” “phy0tpt”

参考官方http://dev.openwrt.org/changeset/35038