yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
阅读:5524回复:1

【转】Linux系统下编译usb-skeleton.c的经历【转自我的blog】

楼主#
更多 发布于:2007-10-10 17:06
应斑竹的要求,特地将我blog上的文章转贴过来,欢迎大家指正!

这几天一直被这个骨架整得死去活来,不过还好到现在算是有了些眉目了。

当然,首先不管怎么说,先把Linux内核给编译了再说。至于如何编译内核,网络上很多文章都说到了,我这里就不多说了(或许以后有空会整理一篇上来吧……)。

编译完内核后,首先找到usb-skeleton.c文件(感觉像废话,估计不懂得usb-skeleton.c的人也不会想到来看这篇文章了,不过还是提出来吧,该文件位于/usr/src/linux/drivers/usb目录下),然后为了备份起见,最好拷贝到其他目录(当然也可以改名,我就是这么做的,拷贝到/usr/src目录下,并且改名为myusb.c)。

接下来,先打开usb-skeleton.c(不管你以何种方式打开,只要能保证可以修改其中的内容就行),找到以下两个函数:usb_skel_init和usb_skel_exit(大约在文件的尾部吧),并分别在其中增加一条打印指令:
printk(KERN_ALERT "Entering myusb init\n"); // 加入usb_skel_init函数中
printk(KERN_ALERT "Entering myusb exit\n"); // 加入usb_skel_exit函数中
至于原因,下面会说道。
然后创建一个Makefile文件,内容如下(我是参照《Linux Device Driver,3rd》中的第一个例子写的):
[backcolor=rgb(51,]# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
 obj-m := myusb.o
# Otherwise we were called directly from the command line;
# invoke the kernel build system.
else
 KERNELDIR ?= /lib/modules/$(shell uname -r)/build
 PWD := $(shell pwd)
default:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif

这里有两个问题需要注意;
1、Makefile文件的文件名一定是Makefile,不能是makefile。
2、在文件内容中的default语句下,注意$(MAKE)……前一定要有Tab符,原因据说是Tab符表示$是命令,尚未查清。
再接下来就简单了,在命令行模式中进入到以上两个文件所在目录(我的是/usr/src),使用make命令进行编译,如下(黑底字为命令执行结果):
[root@MyPCname src]# make
[backcolor=rgb(0,]make -C /lib/modules/2.6.15.1/build M=/usr/src modules
make[1]: Entering directory '/usr/src/linux'
  CC [M]  /usr/src/myusb.o
In file included from include/asm/mpspec.h:5,
   from include/asm/smp.h:18,
   from include/linux/smp.h:19,
   from include/linux/topology.h:38,
   from include/linux/mmzone.h:426,
   from include/linux/gfp.h:4,
   from include/linux/slab.h:15,
   from /usr/src/myusb.c:20:
include/asm/mpspec_def.h:78: warning: 'packed' attribute ignored for field of type 'unsigned char [5u]'
  Building modules, stage 2.
  MODPOST
  CC /usr/src/myusb.mod.o
In file included from include/asm/mpspec.h:5,
   from include/asm/smp.h:18,
   from include/linux/smp.h:19,
   from include/linux/sched.h:10,
   from include/linux/module.h:10,
   from /usr/src/myusb.mod.c:1:
include/asm/mpspec_def.h:78: warning: 'packed' attribute ignored for field of type 'unsigned char [5u]'
  LD [M]  /usr/src/myusb.ko
make[1]: Leaving directory '/usr/src/linux'
我们可以看到以上结果中,虽然包含了警告,但是在目录下的确生成了几个文件,用ls查看一下:
[root@MyPCname src]# ls
[backcolor=rgb(0,]Makefile myusb.c  myusb.ko myusb.mod.c myusb.mod.o myusb.o
说明编译成功,我们来试试新生成的USB驱动文件能不能用呢(是不是有点兴奋,^_^)。
怎么试呢?在做以下操作前务必切换到文本编译模式(即命令行模式),否则你将无法看到效果。
切换到命令行模式后(至于怎么切换,请自行翻阅资料,因为各种系统有各种切换快捷键),输入以下命令(觉得以下命令眼熟吧?是的,就是从《Linux Device Driver,3rd》中搬来的):
[root@MyPCname src]# insmod ./myusb.ko
[backcolor=rgb(0,]Entering myusb init
看到了么?输出了我们添加过的那条语句!没错,我们添加的语句就是用来调试的,测试系统是否调用过这个函数。
我们再试试卸载命令:
[root@MyPCname src]# rmmod ./myusb.ko
[backcolor=rgb(255,][backcolor=rgb(0,]Entering myusb exit
哈哈,是不是很开心呢?我们的“首个”USB驱动搞定咯~
不过,我在文本模式多呆一会,发现屏幕上输出了以下问题:
[root@MyPCname src]# [backcolor=rgb(0,]ACPI-0412: *** Error: Handler for [EmbeddedControl] returned AE_TIME
 ACPI_0508: *** Error: Method execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node f7ed19c0), AE_TIME
 ACPI_0508: *** Error: Method execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node f7ed3880), AE_TIME
还没弄清楚什么原因,希望知道的大大给提示下,谢谢!!

最新喜欢:

xaxiaoxaxiao
xaxiao
驱动小牛
驱动小牛
  • 注册日期2007-09-11
  • 最后登录2010-02-10
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望199点
  • 贡献值0点
  • 好评度197点
  • 原创分2分
  • 专家分0分
沙发#
发布于:2008-03-30 10:10
^_^ 用上了
游客

返回顶部