分类: 嵌入式
2009-11-30 10:19:37
本来是留给师弟的东西,发上来共享的,想首发CSDN的,结果那里的blog真是差劲,格式全没了,只好先放这里了
另外,原创文章,转贴请注明作者及出处!谢谢
硬件环境:S3C2410 ,USB无线网卡:D-Link DWL-G122,华硕wl-167g
软件环境:linux 2.4.18-rmk7 ,网卡驱动:RT73的1.0.4.0版本驱动
按顺序安装如下补丁:
iw_handlers.w13-5.diff
iw_handlers.w14-5.diff
iw240_we15-6.diff
patch -p1 < ../xxxx.diff
重新配置内核
make clean清理内核原有编译内容(不能用make mrproper)
进入系统内核配置菜单
make menuconfig
选择 :
Network device support --->
Wireless LAN (non-hamradio) --->
[*] Wireless LAN (non-hamradio) //只需此项,其他的不选
然后保存退出
输入命令,编译内核:
make bzImage
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
无线网卡驱动的移植
1)修改Makefile
a)将原有的CC注释掉,修改编译器路径
#CC := cc
CC :=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
LD :=/opt/host/armv4l/bin/armv4l-unknown-linux-ld
b)下面的include可以不用,直接给定源代码路径和模块目标路径
#include ./config.mk
LINUX_SRC=/HHARM2410-4COM-CDMA/kernel
TARGET_MODDIR=/HHARM2410-4COM-CDMA/kernel/net
c)将原来针对PC机系统的编译改为针对arm920t的
#CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h
CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Os -mapcs -fno-strict-aliasing -fno-common -pipe -mapcs-32 -march=armv4 -mtune=arm9tdmi -mshort-load-bytes -msoft-float -DMODULE -DRTMP_EMBEDDED -I. -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h
2)修改文件
a)修改rtmp.h文件的第437行左右其中有个__TX_BUFFER的定义是错的,需要注释掉union,如下:
////////////////////////////////////////////////////////////////////////////
// The TX_BUFFER structure forms the transmitted USB packet to the device
////////////////////////////////////////////////////////////////////////////
typedef struct __TX_BUFFER{
TXD_STRUC TxDesc;
// union {
UCHAR WirelessPacket[2342];
HEADER_802_11 NullFrame;
PSPOLL_FRAME PsPollPacket;
RTS_FRAME RTSFrame;
// };
} TX_BUFFER, *PTX_BUFFER;
b)修改rtmp_init.c的第2825行左右的代码,如下
#ifdef RTMP_EMBEDDED
if(Length <= 8)
{
/* *(((PUCHAR)pDest)++) = *(((PUCHAR)pSrc)++);
if(--Length == 0) return;
*(((PUCHAR)pDest)++) = *(((PUCHAR)pSrc)++);
if(--Length == 0) return;
*(((PUCHAR)pDest)++) = *(((PUCHAR)pSrc)++);
if(--Length == 0) return;
*(((PUCHAR)pDest)++) = *(((PUCHAR)pSrc)++);
if(--Length == 0) return;
*(((PUCHAR)pDest)++) = *(((PUCHAR)pSrc)++);
if(--Length == 0) return;
*(((PUCHAR)pDest)++) = *(((PUCHAR)pSrc)++);
if(--Length == 0) return;
*(((PUCHAR)pDest)++) = *(((PUCHAR)pSrc)++);
if(--Length == 0) return;
*(((PUCHAR)pDest)++) = *(((PUCHAR)pSrc)++);
if(--Length == 0) return;*/
unsigned char *dest,*src;
int i;
dest=pDest;
src=pSrc;
for (i=0;i
*(dest++)=*(src++);
}
}
else
memcpy(pDest, pSrc, Length);
//printk("end of MoveMemory!");
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3)修改busybox,建议使用busybox-1.1.0
注意:R3的板子不需要修改busybox,但是4COM的需要修改.
在/busybox-1.1.0/networking/ifconfig.c文件的大概380行左右有一句
a1op = Arg1Opt + (sizeof(Arg1Opt) / sizeof(Arg1Opt[0])) - 1;
下一句是mask = op->arg_flags;,将这句话注释掉就好了,暂时不清楚是什么含义,但是不影响使用.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4)busybox-1.1.0的编译
进入busybox文件根目录,输入命令
make menuconfig
样子很象内核配置菜单
主要需要注意的是如下几个选项
Build Options --->
[*] Build BusyBox as a static binary (no shared libs) //这个一定要选,要不arm里没法运行,busybox的共享库可老大了
[*] Do you want to build BusyBox with a Cross Compiler?
(/usr/local/arm/3.3.2/bin/arm-linux-) Cross Compiler prefix //使用3.3.2版本的arm-linux-gcc,不能用HH提供的2.95.3,否则不能编译成功.
Installation Options --->
[*] Don't use /usr //一定得选,否则PC机的该不能用了
Networking Utilities --->
udhcp Server/Client ---> [*] udhcp Client (udhcpc) //udhcpc就是让网卡自动获取IP的
然后make就行了
=============================================================================================================
使用ram方式启动.
首先要把rt73.o文件拷贝到ramdisk文件系统中,执行如下如下命令
gunzip ramdisk.image.gz
mount -o loop ramdisk.image /mnt/emb
cp /home/RT73_Linux_STA_Drv1.0.4.0/Module/rt73.o /mnt/emb/etc/
umount /mnt/emb
gzip ramdisk.image
注意:有文章说rt73.bin和rt73sta.dat需要拷贝到/etc/Wireless/RT73STA文件夹下,其中如果使用1.0.4.0版本的驱动的话可以没有rt73.bin
而rt73sta.dat文件是与AP有关的设置,曾经使用过TP-Link的一款AP必需有此文件,否则无线网卡不能扫描到AP,但是后来又采用过华硕的一款AP却不能有此文件,很怪异.
启动过程如下
SMDK2410 # tftp 30008000 zImage
NetOurIP =c0a802de
NetServerIP = c0a8026f
NetOurGatewayIP = c0a80201
NetOurSubnetMask = ffffff00
ARP broadcast 1
ARP broadcast 2
TFTP from server 192.168.2.111; our IP address is 192.168.2.222
Filename 'zImage'.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#################################################################
####
done
Bytes transferred = 1017536 (f86c0 hex)
SMDK2410 # tftp 30800000 ramdisk.image.gz
NetOurIP =c0a802de
NetServerIP = c0a8026f
NetOurGatewayIP = c0a80201
NetOurSubnetMask = ffffff00
ARP broadcast 1
ARP broadcast 2
TFTP from server 192.168.2.111; our IP address is 192.168.2.222
Filename 'ramdisk.image.gz'.
Load address: 0x30800000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
##############################
done
Bytes transferred = 2813419 (2aedeb hex)
SMDK2410 # go 30008000
## Starting application at 0x30008000 ...
Start linux ..
Setup linux parameters at 0x30000100
Uncompressing Linux.......................................................................... done, booting the kernel.
Linux version 2.4.18-rmk7-pxa1 (root@qld) (gcc version 2.95.2 20000516 (release) [Rebel.com]) #20 .? 5.. 19 15:46:30 PETST 28CPU: ARM/CIRRUS Arm920Tsid(wb) revision 0
Machine: Samsung-SMDK2410
下略- -!
插入无线网卡,显示
/ # hub.c: USB new device connect on bus1/1, assigned device number 2
Manufacturer: Ralink
Product: 802.11 bg WLAN
usb.c: USB device 2 (vend/prod 0x7d1/0x3c03) is not claimed by any active driver.
Length = 18
DescriptorType = 01
USB version = 2.00
Vendor:Product = 07d1:3c03
MaxPacketSize0 = 64
NumConfigurations = 1
Device version = 0.01
Device Class:SubClass:Protocol = 00:00:00
Per-interface classes
Configuration:
bLength = 9
bDescriptorType = 02
wTotalLength = 0020
bNumInterfaces = 01
bConfigurationValue = 01
iConfiguration = 00
bmAttributes = 80
MaxPower = 300mA
Interface: 0
Alternate Setting: 0
bLength = 9
bDescriptorType = 04
bInterfaceNumber = 00
bAlternateSetting = 00
bNumEndpoints = 02
bInterface Class:SubClass:Protocol = ff:ff:ff
iInterface = 00
Endpoint:
bLength = 7
bDescriptorType = 05
bEndpointAddress = 81 (in)
bmAttributes = 02 (Bulk)
wMaxPacketSize = 0040
bInterval = 00
Endpoint:
bLength = 7
bDescriptorType = 05
bEndpointAddress = 01 (out)
bmAttributes = 02 (Bulk)
wMaxPacketSize = 0040
bInterval = 00
此时还没有加载rt73.o驱动
执行一个脚本吧,我把命令都写在脚本里了
脚本内容:
#!/bin/sh
insmod /etc/rt73.o //加载驱动
sleep 1
ifconfig rausb0 up //激活网卡
sleep 1
./bin/udhcpc -i rausb0 //用udhcpc命令来使网卡找到AP,并自动配置IP地址
sleep 1
route add default gw 192.168.1.1 //添加网关
网关地址其实可以通过udhcpc来获取,不过需要修改busybox的代码。