LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4069|回复: 14

移植D-Link的DWL-G122的一些问题

[复制链接]
发表于 2008-1-2 11:05:57 | 显示全部楼层 |阅读模式
内核版本:2.4.18
开发板:HHARM2410--4COM-CDMA
gcc:华恒提供,经验证就是2.95.3
驱动版本RT73_Linux_STA_Drv1.0.4.0
无线网卡-Link的DWL-G122
首先在PC机上编译和加载都成功,无线网卡使用正常,PC机使用RH9,内核版本2.4.20-8.
然后开始移植,编译过程无错误,生成rt73.o拷贝到板子上,用insmod rt73.o加载无问题,显示:
rtusb init ====>
usb.c: registered new driver rt73
但是使用ifconfig rausb0 显示网卡信息时发现
rausb0    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
         BROADCAST MULTICAST  MTU:1500  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:64
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
物理地址显然不正确.并且在使用ifconfig rausb0 up命令之后,会显示
rt73 driver version - 1.0.4.0
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c0aa8000
*pgd = 30add801, *pmd = 30add801, *pte = 00000000, *ppte = 00000000
Internal error: Oops: ffffffff
CPU: 0
pc : []    lr : []    Not tainted
sp : c0aaddfc  ip : 000001f0  fp : c0aade20
r10: 00000000  r9 : c73a7130  r8 : 00000000
r7 : 00000001  r6 : c025c6c0  r5 : 000001f0  r4 : c025c6c0
r3 : 000001f0  r2 : 00000000  r1 : 00000000  r0 : c025c6c0
Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  Segment user
Control: C000317F  Table: 30AA8000  DAC: 00000015
Process ifconfig (pid: 67, stackpage=c0aad000)
Stack: (0xc0aaddec to 0xc0aae000)
dde0:                            c0042594 c0042154 20000013 ffffffff c025c6c0
de00: 000001f0 00000018 00000001 00000000 00000000 c0aade38 c0aade24 c0042594
de20: c0042110 00000978 c73a7148 c0aade98 c0aade3c c7338308 c0042498 c73a70b0
de40: c73a7080 c73a7098 c7380000 c0227ea0 c7380000 00000000 00000000 c0aadf0c
de60: bffffc84 c09fc400 c7320398 00000000 c0227ea0 00000000 00001002 00000000
de80: c0aadf0c 00000000 c0155458 c0aadeac c0aade9c c015547c c0155430 c09fc400
dea0: c0aadec4 c0aadeb0 c0152a2c c015546c c09fc400 00001043 c0aadee4 c0aadec8
dec0: c0154188 c0152970 00000000 c09fc400 00000000 c0aadf1c c0aadf54 c0aadee8
dee0: c0189244 c0154138 00000014 00000000 00000000 00000000 00008914 00031043
df00: 00000000 000d9d28 bffffed4 73756172 00003062 00000000 00000000 00031043
df20: 00000000 000d9d28 bffffed4 00008914 bffffc84 c09eab60 bffffc84 ffffffe7
df40: c0aac000 000b82b0 c0aadf70 c0aadf58 c018b82c c0188f30 c3968d20 00008914
df60: 00000003 c0aadf80 c0aadf74 c014b6f4 c018b508 c0aadfa4 c0aadf84 c0059e00
df80: c014b6dc bffffc84 bffffedc 00000004 00000036 c001d9a4 00000000 c0aadfa8
dfa0: c001d820 c0059c14 bffffc84 c00238fc 00000003 00008914 bffffc84 00001043
dfc0: bffffc84 bffffedc 00000004 000b8238 00000000 0003c298 000b82b0 00000003
dfe0: 00000002 bffffbb8 00019bd0 00072824 20000010 00000003 bf7ff5ff f7ff7eff
Backtrace:
Function entered at [] from []
Function entered at [] from []
r5 = C73A7148  r4 = 00000978
Function entered at [] from []
Function entered at [] from []
r4 = C09FC400
Function entered at [] from []
r5 = 00001043  r4 = C09FC400
Function entered at [] from []
r7 = C0AADF1C  r6 = 00000000  r5 = C09FC400  r4 = 00000000
Function entered at [] from []
Function entered at [] from []
r6 = 00000003  r5 = 00008914  r4 = C3968D20
Function entered at [] from []
Function entered at [] from []
r8 = C001D9A4  r7 = 00000036  r6 = 00000004  r5 = BFFFFEDC
r4 = BFFFFC84
Code: e3530000 0a000002 e20c3e1f e3530020 (15822000)
Kernel panic: Aiee, killing interrupt handler!
In interrupt handler - not syncing


跟踪驱动程序的源码,在rtmp_init.c文件中凡事用kmalloc的都报这个错误,然后我把kmalloc的第二个参数改成GFP_ATOMIC(原来是GFP_KERNEL),编译能通过而且在使用ifconfig rausb0 up在kmalloc处不报错了,但是报Scheduling in interrupt,而且依然不能识别mac地址,发现错误是函数RTUSBReadMACRegister的返回值不对,而RTUSBReadMACRegister是在rtusb_io.c里实现的,它的返回值事实上是由函数RTUSB_VendorRequest决定的......然后又找到RTUSB_VendorRequest的实现,也是在rtusb_io.c里,其中有一句if (in_interrupt()),显然问题就在这里了,但是不太明白为什么.我知道GFP_ATOMIC和GFP_KERNEL的区别,但是不使用GFP_ATOMIC的话,kmalloc就报错,太郁闷了,不知道有没有人遇到过类似的问题.希望能指点一下,谢谢!!
 楼主| 发表于 2008-1-14 10:16:27 | 显示全部楼层
光有人看,没人回复啊,郁闷 ~~,我发现在这个结构体中,将 WirelessPacket申请的空间减少,则在kmalloc时就会运行一段时间后才报错,估计是申请内存的问题
可是开发板的内存有64M呢,应该没问题啊
typedef struct __TX_BUFFER{
        TXD_STRUC                TxDesc;
        HEADER_802_11        NullFrame;
        PSPOLL_FRAME        PsPollPacket;
        RTS_FRAME                RTSFrame;
        UCHAR                        WirelessPacket[2342];
} TX_BUFFER, *PTX_BUFFER;
回复 支持 反对

使用道具 举报

发表于 2008-3-11 00:19:16 | 显示全部楼层
尚未打开网口时,这时候未调用open函数,没识别mac地址

先为其配置好ip地址,然后在up,就可以自动识别mac了

可以用下面的命令试试
ifconfig rausb0 inet 192.168.0.110 netmask 255.255.255.0 up
回复 支持 反对

使用道具 举报

发表于 2008-3-12 22:27:41 | 显示全部楼层
老兄,可以把你的Makefile贴出来参考下吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-8 14:26:22 | 显示全部楼层
有人想看makefile,我先贴出来一下,还有,所有文件中的"\"这个符号都必须删除,否则2.95.3是不能编译通过的.但是3.3.2可以.....很怪.

还要改config.mk,里面指定LINUX_SRC和TARGET_MODDIR

######################################################################
#        Module Name: Makefile
#        Abstract: Makefile for rt73 linux driver on kernel series 2.4
######################################################################

CC := /opt/host/armv4l/bin/armv4l-unknown-linux-gcc
LD := /opt/host/armv4l/bin/armv4l-unknown-linux-ld
#CC := /usr/local/arm/3.3.2/bin/arm-linux-gcc
#LD := /usr/local/arm/3.3.2/bin/arm-linux-ld
#CC := /usr/local/arm/2.95.3/bin/arm-linux-gcc
#LD := /usr/local/arm/2.95.3/bin/arm-linux-ld
#CC := cc

include ./config.mk

WFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs
CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -march=armv4 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h
#CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h

## Comment/uncomment the following line to enable/disable debugging
#CFLAGS += -DDBG

CFLAGS += $(WFLAGS)

OBJ = rt73.o

rt73.o: rtmp_main.o mlme.o connect.o rtusb_bulk.o rtusb_io.o sync.o assoc.o auth.o auth_rsp.o rtusb_data.o rtmp_init.o  sanity.o rtmp_wep.o rtmp_info.o rtmp_tkip.o wpa.o md5.o                  
        $(LD) -r $^ -o $@


## NDDIR/ifcfg-rausb0
ND_CONF=/etc/sysconfig/network-scripts/ifcfg-rausb0

ifdef NDDIR
        NDDIR := $(NDDIR)
else
        NDDIR := /etc/sysconfig/network-scripts
endif

ifdef MOD_CONF
        MOD_CONF := $(MOD_CONF)       
else
        MOD_CONF := /etc/modules.conf
endif

ifdef MODDIR
        MOD_ROOT := $(MODDIR)
else
        MOD_ROOT := /lib/modules/$(shell uname -r)/extra
endif


all: $(OBJ)
        @touch config.mk
               
clean:
        rm -rf *.o *~ core .*.cmd *.ko *.mod.c .tmp_versions built-in.o

install:
        @touch config.mk
        install -m 755 -o 0 -g 0 -d $(MOD_ROOT)
        install -m 644 -o 0 -g 0 $(OBJ) $(MOD_ROOT)
       
        @echo "Network device directory $(NDDIR)";
        @echo "Module configuration file $(MOD_CONF)";       
       
        @if [ -d "$(NDDIR)" ] ; then \
                if [ ! -f "$(ND_CONF)" ]; then \
                        echo "Create 'ifcfg-rausb0' in $(NDDIR)/"; \
                        cp ifcfg-rausb0 $(NDDIR)/ ; \
                fi; \
        fi
       
        @if ! grep -q 'rausb0' $(MOD_CONF) ; then \
                echo "append 'alias rausb0 rt73' to $(MOD_CONF)"; \
                echo "alias rausb0 rt73" >> $(MOD_CONF) ; \
        fi
        /sbin/depmod -a

config:
        @touch config.mk
        @./Configure
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-8 14:28:13 | 显示全部楼层
Post by sailing_0325;1825089
尚未打开网口时,这时候未调用open函数,没识别mac地址

先为其配置好ip地址,然后在up,就可以自动识别mac了

可以用下面的命令试试
ifconfig rausb0 inet 192.168.0.110 netmask 255.255.255.0 up


这个方法没用...MAC还是都是00...唉~
回复 支持 反对

使用道具 举报

发表于 2008-4-13 10:35:08 | 显示全部楼层
LINUX_SRC和TARGET_MODDIR
LINUX_SRC指定开发板内核的位置那TARGET——MODDIR是什么作用。应该怎么修改。还有删除所有文件中的“/”符号是什么意思?那我看你的Makefile里面的"/"也没有删除啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-16 14:08:35 | 显示全部楼层
TARGET_MODDIR你可以参考原来的内容,把路径改成嵌入式内核源码的就行了
回复 支持 反对

使用道具 举报

发表于 2008-4-16 15:54:46 | 显示全部楼层
请问一下楼主,小弟现在也在做rt73驱动的移植
交叉编译器是用的3.3.2版,板子内核是2.4.18-rmk7-pxal
驱动版本RT73_Linux_STA_Drv1.0.4.0
驱动的Makefile照你说的改了,编译通不过,错误如下:
/usr/local/arm/3.3.2/bin/arm-linux-gcc -D__KERNEL__ -I/home/cvtech/jx2410/linux/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe  -march=armv4 -DMODULE -DMODVERSIONS -include /home/cvtech/jx2410/linux/include/linux/modversions.h -Wall -Wstrict-prototypes -Wno-trigraphs   -c -o rtmp_main.o rtmp_main.c
rtmp_main.c: In function `usb_rtusb_probe':
rtmp_main.c:678: error: structure has no member named `wireless_handlers'
rtmp_main.c:684: error: structure has no member named `weight'
make: *** [rtmp_main.o] Error 1
请楼主指点一下这是什么原因啊,是不是内核版本太低,头文件定义的结构体中没这个成员变量啊啊?
回复 支持 反对

使用道具 举报

发表于 2008-4-17 20:45:41 | 显示全部楼层
楼上的你QQ多少 !可以交流下!我 QQ25330973
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表