阅读:5701回复:1
【转】Linux系统下编译usb-skeleton.c的经历【转自我的blog】
应斑竹的要求,特地将我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 还没弄清楚什么原因,希望知道的大大给提示下,谢谢!! |
|
最新喜欢:![]() |
沙发#
发布于:2008-03-30 10:10
^_^ 用上了
|
|