Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1682105
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: 嵌入式

2010-04-16 23:02:13

Andrew Huang
 
1.DM9601介绍
 
   DM9601是台湾Davicom公司推出的USB转RJ45的有线网卡。它不仅提供了Windows各个系列的驱动,也提供了Linux 2.4,Linux 2.6以及WinCE 5.0的驱动源码。是一个用于演示驱动的应用非常好的实例.
  我把驱动移植到X86和ARM开发板上,以便演示如何把一个实用的驱动移植到ARM-Linux下

   原厂自带源码支持 linux 2.6.13版本.并在S3C2440开发板上测试通过.但原厂源码无法在2.6.30.4下编译通过,因为驱动接口发生较大变化,改动过多. 
  还好是是从Linux 2.6.21开始,内核已经开始自带一些USB有线网络驱动代码,其中包括DM9601的网卡的,在Linux 2.6.30.4下即是按官方代码调整而来.
25.0元 

2.RHEL5下安装
aa
 
3.ARM-Linux 2.6.13下移植
 
我们选择这个网卡自带的Linux 2.6驱动来移植到ARM-Linux 2.6.13 下。
这个源码经过简单的修改即可进行工作,这是原厂的源码(分别有Linux 2.4,Linux 2.6.13及WinCE 5.0)
文件: dm9601_src.zip
大小: 79KB
下载: 下载
 
3.1 修改linux 2.6源码Makefile
 
 1) 修改Makefile
      把KERELDIR 改为当前开发板的内核目录
         KERNELDIR ?= /2.6.30.4/linux-2.6.30.4/
 2) 把编译器改为ARM编译器
    在Makefile的开始,加入(注意要与内核的编译器版本一致)
    CC=/usr/local/3.4.1/bin/arm-linux-gcc
   
  3) 注释Makefile中如下语句
#CFLAGS += $(DEBFLAGS)?
新版的OS已经不需要这个选项,否则会提示如下选项
scripts/Makefile.build:49: *** CFLAGS was changed in "/home/hxy/dm9601_drv/Makefile". Fix it to use EXTRA_CFLAGS.  Stop.
 
以下是改好的Makefile
 
# Comment/uncomment the following line to disable/enable debugging
#DEBUG = y
CC = /usr/local/arm/3.4.1/bin/arm-linux-gcc
# Add your debugging flag (or not) to CFLAGS
ifeq ($(DEBUG),y)
  DEBFLAGS = -O -g # "-O" is needed to expand inlines
else
  DEBFLAGS = -O2
endif
EXTRA_CFLAGS += $(DEBFLAGS) -I$(LDDINCDIR)
ifneq ($(KERNELRELEASE),)
# call from kernel build system
obj-m := dm9601.o
else
#KERNELDIR ?= /lib/modules/$(shell uname -r)/build
KERNELDIR ?= /kernel-2.6.13
PWD       := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINCDIR=$(PWD)/../include modules
endif
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
depend .depend dep:
$(CC) $(CFLAGS) -M *.c > .depend
ifeq (.depend,$(wildcard .depend))
include .depend
endif
 
3.2 修改dm9601.h

  加入这个一个网卡的USB产商编号和设备编号在最后#endif前加入,以便内核能识别.

   DM9601_DEV( "ZT6688 USB Ethernet", 0x0a46, 0x6688, DEFAULT_GPIO_RESET)
3.3 编译安装
   make
   在ARM-Linux安装驱动,在开发板运行
     insmod  dm9601.ko
3.4 在开发板测试USB网卡
  1.插入USB网卡,如果网卡指示灯亮起表示开始工作,屏幕也会有相应提示
2.配置IP,因为开发板上已经有DM9000作为第一块网卡,所以这个DM9601将作为eth1来工作
ifconfig eth1 192.168.3.240
3.将其与网络其它3网段机器进行互ping,如果能互相PING通表示网卡完全工作正常
ping 192.168.3.147
4.在ARM-Linux 2.6.13内核发布驱动
DM9601 在2.6.13未集成在内核中,这里演示如何集成到内核内部.
4.1:将驱动源码拷入相应目录
不同类型有不同目录
网卡的驱动都是放在内核目当drivers/net下
 
4.2 :修改配置菜单,把加入驱动选项加入菜单当中.
修改drivers/net目录下的Kconfig文件
增加如下内容
 
 
config DM9601
tristate "DM9601 USB  support"
depends on  NET_ETHERNET
select CRC32
select MII
---help---
  Support for DM9601 chipset.
 A Davicom DM9601 USB Fast Ethernet driver for Linux.
4.3:修改对应目录下的Makefile
修改 drivers/net/Makefile
把源码加入对应配置变量的控制列表下

obj-$(CONFIG_S2IO) += s2io.o
obj-$(CONFIG_SMC91X) += smc91x.o
obj-$(CONFIG_DM9000) += dm9000x.o
obj-$(CONFIG_DM9601) += dm9601.o
obj-$(CONFIG_FEC_8XX) += fec_8xx/

obj-$(CONFIG_ARM) += arm/
obj-$(CONFIG_DEV_APPLETALK) += appletalk/
obj-$(CONFIG_TR) += tokenring/
obj-$(CONFIG_WAN) += wan/
obj-$(CONFIG_ARCNET) += arcnet/
obj-$(CONFIG_NET_PCMCIA) += pcmcia/
obj-$(CONFIG_NET_RADIO) += wireless/

4.4:执行配置菜单,配置驱动的类型
在内核目录下执行 make menuconfig,显示菜单
如果Y,表示在make zImage时静态链接
如果是M,表示用make modules时,这个ko将被编译出来
 
4.5:编译驱动
如果选择静态编译,执行 make zImage,驱动会链接到内核之内
如果选择模块编译 执行 make modules
如果是modules成功后,在源码目录下会生对应的ko文件
 
 
5.ARM-Linux 2.6.30下移植

 5.1 移植要点


必须是支持eabi 的arm-linux-gcc编译,这里是用4.3.3
内核成功编译过一次.并可以被驱动源码目录的Makefile访问


5.2 源码分析
 在2.6.31后,USB网卡整体源码被折分成两大块,一块是通用的usbnet操作.另一块是各产家自行的代码操作
dm9601的驱动包含两块源码 dm9601.c 和usbnet.c

 

文件: dm9601_2.6.30.tar.gz
大小: 693KB
下载: 下载

只要加上固定的2.6的Makefile进行编写

 
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m :=  usbnet.o dm9601.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
KERNELDIR ?= /2.6.30.4/linux-2.6.30.4
PWD := $(shell pwd)
 
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif

5.3 测试网卡
安装驱动
insmod usbnet.ko
insmod dm9601.ko
配置/测试网络
ifconfig eth1 192.168.3.107 up
使用ping 来测试网络正确性.

 
 
阅读(7732) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~