imx51平台上rj45设备(netusb)驱动移植总结

最近在imx51上移植AX88772B Netusb遇到些问题和总结的些知识归纳如下:

 从官网上下载驱动:

http://www.asix.com.tw/FrootAttach/driver/AX88772B_772A_760_772_178_LINUX_ Driver_v4.1.0_Source.tar.bz2


在这里死的很惨,老大给了我一个驱动编译不过去!相当的尴尬!

不说其他闲杂事了,打开下载的驱动包,将其解压缩,然后打开里面的Makefile:

你可以看到如下配置:

CURRENT    = $(shell uname -r)
TARGET    = asix
OBJS    = asix.o
MDIR    = drivers/net/usb
KDIR    = /lib/modules/$(CURRENT)/build
SUBLEVEL= $(shell uname -r | cut -d '.' -f 3 | cut -d '.' -f 1 | cut -d '-' -f 1 | cut -d '_' -f 1)

ifneq (,$(filter $(SUBLEVEL),14 15 16 17 18 19 20 21))
MDIR = drivers/usb/net
endif

EXTRA_CFLAGS = -DEXPORT_SYMTAB
PWD = $(shell pwd)
DEST = /lib/modules/$(CURRENT)/kernel/$(MDIR)

obj-m      := $(TARGET).o

default:
    make -C $(KDIR) SUBDIRS=$(PWD) modules

$(TARGET).o: $(OBJS)
    $(LD) $(LD_RFLAG) -r -o $@ $(OBJS)

install:
    su -c "cp -v $(TARGET).ko $(DEST) && /sbin/depmod -a"

clean:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean

.PHONY: modules clean

-include $(KDIR)/Rules.make

需要修改成:

#CC=$(CROSS_COMPILE)gcc LD=$(CROSS_COMPILE)ld
#CURRENT    = $(shell uname -r)
CURRENT    = 2.6.35.3-433-g0fae922
TARGET    = asix
OBJS    = asix.o
MDIR    = drivers/net/usb
KDIR    = /home/linux-2.6.35.3-v0201/
SUBLEVEL= 35

ifneq (,$(filter $(SUBLEVEL),14 15 16 17 18 19 20 21))
MDIR = drivers/usb/net
endif

EXTRA_CFLAGS = -DEXPORT_SYMTAB
PWD = $(shell pwd)
DEST = /home/linux-2.6.35.3-v0201/drivers/net/usb

obj-m      := $(TARGET).o

default:
    make -C $(KDIR) SUBDIRS=$(PWD) modules

$(TARGET).o: $(OBJS)
    $(LD) $(LD_RFLAG) -r -o $@ $(OBJS)

install:
    su -c "cp -v $(TARGET).ko $(DEST) && /sbin/depmod -a"

clean:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean

.PHONY: modules clean

-include $(KDIR)/Rules.make

说明:移植此类驱动主要就是修改Makefile文件,要修改的因素为:编译器要从GCC改成ARM-LINUX-GCC,内核源码目录要修改成板子上跑的内核源码的目录,另外还有一点就是要注意内核版本的问题,这里提供的驱动是适应2.6.14至2.6.38内核版本的驱动,所以一般的LINUX内核都能满足。 首先,修改后的Makefile里的前几行

ARCH=arm CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-linux- CC=$(CROSS_COMPILE)gcc LD=$(CROSS_COMPILE)ld
是告诉编译器,我们要编译出来的可执行文件是要在ARM构架的芯片上运行的,不是X86机器上,所以要修改ARCH这个制定平台的全局变量为ARM,然后CROSS_COMPILE这个变量是用来告诉Makefile我们要用ARM-LINUX-GCC编译器编译,所以要告诉它你电脑上ARM-LINUX-GCC程序被安装的目录在哪,其次我们发现原来的Makfile里面有这样的语句:

KDIR = /lib/modules/$(CURRENT)/build

,一开始我也不明白为什么不是内核源码的根目录,但是我进到KDIR = /lib/modules/$(CURRENT)里面才发现那个build文件其实就是个软链接,链接到内核源码的根目录,然而我们板子上是没有这种多余的目录的,所以直接把KDIR这个变量改成你想要利用的源码目录即可。 再往后,看到这样的语句:
SUBLEVEL= $(shell uname -r | cut -d '.' -f 3 | cut -d '.' -f 1 | cut -d '-' -f 1 | cut -d '_' -f 1)
其实这个语句的作用就是从你LINUX的版本中提取出2.6.XX中的XX字段,然后后面用于删选适当的驱动程序,所一也不用这么麻烦,直接吧SUBLEVEL这个变量赋值为你板子上的内核的二级版本号即可(我的是2.6.35,所以我写的是35)。另外,CURRENT变量是保存你当前LINUX系统的版本的,所以直接改成你板子上运行的LINUX版本即可(可用命令 uname -r 查看)。 OK! Makefile改好之后,工作就完成了3/4了,然后直接make,就能得到一个asix.ko的模块.

然后把这个模块上传到板子上,insmod之后即可,然后插入USB有线网卡,就能看到识别到新设备的内核输出。 我们接下去要做得是配置这个新的eth1设备,很简单,直接在minicom里输:

ifconfig eth1 192.168.1.231 netmask 255.255.255.0
即可,然后用ifconfig命令就能查看到eth1设备了。 另外要注意的是,如果直接用网线将eth1和主机相连是互相PING不通的,因为此时板子默认的还是eth0设备,所以要修改配置文件或者把eth1和主机的IP改到另一个网段里,比如192.168.2.*,然后据可以相互通信了~

其中make遇到了两个小问题如下:

错误1:

root@user-G41MT-S2:/home/wwb/ax8877/wwb# make
make -C /home/linux-2.6.35.3-v0201/ SUBDIRS=/home/wwb/ax8877/wwb modules
make[1]: 正在进入目录 `/home/linux-2.6.35.3-v0201'
  CC [M]  /home/wwb/ax8877/wwb/asix.o
arm-linux-gcc: LD=/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-linux-ld: No such file or directory
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-mno-red-zone"
cc1: error: unrecognized command line option "-mcmodel=kernel"
cc1: error: unrecognized command line option "-maccumulate-outgoing-args"
cc1: error: unrecognized command line option "-mno-sse"
cc1: error: unrecognized command line option "-mno-mmx"
cc1: error: unrecognized command line option "-mno-sse2"
cc1: error: unrecognized command line option "-mno-3dnow"
make[2]: *** [/home/wwb/ax8877/wwb/asix.o] 错误 1
make[1]: *** [_module_/home/wwb/ax8877/wwb] 错误 2
make[1]:正在离开目录 `/home/linux-2.6.35.3-v0201'
make: *** [default] 错误 2

解决方法:

export ARCH=arm
export CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-linux-

错误2:

root@user-G41MT-S2:/home/wwb/ax8877/ww/ww# make
make -C /home/linux-2.6.35.3-v0201/ SUBDIRS=/home/wwb/ax8877/ww/ww modules
make[1]: 正在进入目录 `/home/linux-2.6.35.3-v0201'
make[1]: *** /home/linux-2.6.35.3-v0201/arch/arm: 是一个目录。 停止。
make[1]:正在离开目录 `/home/linux-2.6.35.3-v0201'
make: *** [default] 错误 2

解决方法:
出现这个错误是makefile文件中包含:

ARCH=arm
CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-linux-

去掉就OK了!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值