Chinaunix首页 | 论坛 | 博客
  • 博客访问: 439546
  • 博文数量: 123
  • 博客积分: 2686
  • 博客等级: 少校
  • 技术积分: 1349
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-23 22:11
文章分类
文章存档

2012年(3)

2011年(10)

2010年(100)

2009年(10)

我的朋友

分类: LINUX

2010-04-09 19:51:42

环境:Fedora 12 (linux-2.6.31.5)
内核: linux-2.6.31.5
GCC: 4.4.2
 
STEP 1: 启动Fedora 12,查看Fedora 12的内核版本号,GCC版本号。明白这些后方便以后排错。
 
STEP 2:下载一个与Fedora 12相同版本的内核源代码linux-2.6.31.5,否则实验时一般会出现奇怪错误。为什么需要这个内核代码?因为Fedora 12自身带的内核代码没有usbip的代码。
 
STEP 3:解压源代码到/usr/src/kernels/.
 
STEP 4: 进入/usr/src/kernels/linux-2.6.31/drivers/staging目录,把里面的usb整个目录复制到/home/usbip.
 

mkdir /home/usbip

cp -r /usr/src/kernels/linux-2.6.31/drivers/staging /home/usbip

STEP 5:进入/home/usbip目录,为usbip编写新的Makefile,可以参考usbip-0.1.7里面的Makefile。在Makefile中,KSOURCE的值一定要是你的发行版正在使用的内核的源代码的目录,这样make的时候,使用的就是正在使用的内核的配置进行编译,那么编译的过程中不容易出错,产生的模块在加载的时候就不会出错,编译模块用的配置和当前运行的内核配置一样,那么二者同时运行时就肯定不会出错,因为用的配置一样,GCC也一样什么都一样!!(这个浪费了我N多时间)。Makefile如下:

DEBUG ?= n
KSOURCE ?= /usr/src/kernels/2.6.31.5-127.fc12.i686.PAE


#%.x:%.c
#    gcc -o $@ $<

#KBUILD_VERBOSE:=1

HCD_HEADER:=$(KSOURCE)/drivers/usb/core/hcd.h

usbip_common_mod-objs := usbip_common.o usbip_event.o
usbip-objs      := stub_dev.o stub_main.o stub_rx.o stub_tx.o
vhci-hcd-objs     := vhci_sysfs.o vhci_tx.o vhci_rx.o vhci_hcd.o

obj-m += usbip_common_mod.o
obj-m += usbip.o
obj-m += vhci-hcd.o

EXTRA_CFLAGS += -DHCD_HEADER=\"$(HCD_HEADER)\"

ifeq ($(DEBUG),y)
    EXTRA_CFLAGS += -DCONFIG_USB_DEBUG
endif


default:
    make -C $(KSOURCE) M=`pwd` modules

check:
    #make -C $(KSOURCE) LANG=C KBUILD_VERBOSE=${KBUILD_VERBOSE} C=1 M=`pwd` modules checkstack namespacecheck headers_check
    make -C $(KSOURCE) LANG=C KBUILD_VERBOSE=${KBUILD_VERBOSE} C=1 M=`pwd` modules

.PHONY: cscope
cscope:
    cscope -b -k -R

.PHONY: clean
clean:
    make -C $(KSOURCE) LANG=C KBUILD_VERBOSE=${KBUILD_VERBOSE} M=`pwd` clean
    rm -f *.x *~


STEP 6:make. 产生一个错误:
 

在包含自 /home/usbip/vhci_sysfs.c:21 的文件中:
/home/usbip/vhci.h:21:32: 错误:../../usb/core/hcd.h:没有那个文件或目录
In file included from /home/usbip/vhci_sysfs.c:21:
/home/usbip/vhci.h:129: 警告:‘struct usb_hcd’在形参表内部声明
/home/usbip/vhci.h:129: 警告:它的作用域仅限于此定义或声明,这可能并不是您想要的
/home/usbip/vhci.h: 在函数‘hcd_to_vhci’中:
/home/usbip/vhci.h:131: 错误:提领指向不完全类型的指针
/home/usbip/vhci.h: 在函数‘vhci_to_hcd’中:
/home/usbip/vhci.h:136: 错误:提领指向不完全类型的指针
/home/usbip/vhci.h:136: 警告:在‘__mptr’的声明中,类型默认为‘int’
/home/usbip/vhci.h:136: 错误:对未定义类型‘struct usb_hcd’的使用无效
/home/usbip/vhci.h: 在函数‘vhci_dev’中:
/home/usbip/vhci.h:141: 错误:提领指向不完全类型的指针
make[2]: *** [/home/usbip/vhci_sysfs.o] 错误 1
make[1]: *** [_module_/home/usbip] 错误 2
make[1]: Leaving directory `/usr/src/kernels/linux-2.6.31.5'
make: *** [default] 错误 2

这个错误是上面的Makefile犯下的,我的解决办法是直接在vhci_sysfs.c中用绝对路径把hcd.h包含进来。在vhci_sysfs.c中知道这个错误和vhci.h有关。打开vhci.h,

#include "../../usb/core/hcd.h"  

改成:

#include "/usr/src/kernels/linux-2.6.31.5/drviers/usb/core/hcd.h"

STEP 7: 加载模块,modprobe subip.产生一个错误:

[root@localhost usbip]# modprobe usbip
FATAL: Module usbip not found.

解决办法是,把产生的模块复制到/lib/moduels/${uname -r}/kernel.再执行模块依赖关系分析命令depmod,然后加载模块。

[root@localhost usbip]# cp *.ko /lib/modules/2.6.31.5-127.fc12.i686.PAE/kernel/
[root@localhost usbip]# depmod
[root@localhost usbip]# modprobe usbip

STEP 8:至此,模块能够加载成功,为修改和调试usbip代码搭建好了开发平台。

STEP 9: 在此步骤之前,在同一个虚拟机上面装好了2个linux系统。在一个linux系统中,加载模块:

modprobe usbip
modprobe usbip_common_mod

为了确保系统每次启动自动加载模块,修改gedit /etc/modules,加入:

usbip
usbip_common_mod


STEP 10:按照usbip-0.1.7/src/README里的提示安装usbip命令工具包。OK!

参考:

http://www.symantec.com/connect/articles/compiling-drivers-linux-and-adding-them-your-linux-automation-image


附:

 

像这种错误:

[root@localhost usbip]# modprobe -f usbip
FATAL: Error inserting usbip (/lib/modules/2.6.31.5-127.fc12.i686.PAE/kernel/usbip.ko): Invalid module format

一般是由以下原因造成的:

  • 所用内核源码版本号与目前使用的内核不同;
  • 编译目标不同,比如编译的是i686,装好的是i386
  • 使用编译器版本不同;
  • 目前使用的内核不是自己编译出来的。
阅读(8614) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~