阅读:2787回复:18
Linux的USB驱动程序架构比windows简练多了,呵呵。
编译、加载、devfs注册做完就可以通过应用程序和设备通讯了,根本没有那么多windows的IRP_XXX,感觉简练多了,容易上手。
倒是开发Linux应用程序没有VC方便。 看什么时候写一点心得和一个几乎“全裸”的Linux USB module以及相应的应用程序,不知有没有人有兴趣呢? :) [编辑 - 11/7/02 by tigerzd] |
|
|
沙发#
发布于:2002-11-07 13:58
太好了,支持!!!
|
|
板凳#
发布于:2002-11-07 14:16
我等着拜读!
|
|
|
地板#
发布于:2002-11-07 16:38
1、编译和加载usb module.
linux中编译和加载一个module很简单,大致需要以下文件: //config.mk文件 #Config.mk CC = gcc KRNLINC = /usr/src/linux-2.4.18-14/include # CFLAGS = -D__KERNEL__ -D__SMP__ -DMODULE -DEXPORT_SYMTAB -c -I$(KRNLINC) //makefile文件 CONFIG = config.mk include $(CONFIG) NakedModule.o: NakedModule.c $(CC) $(CFLAGS) -o $@ $< 其实这两个文件也不一定需要,只是免得每次编译要在控制台输入以下编译命令: gcc -D__KERNEL__ -D__SMP__ -DMODULE -DEXPORT_SYMTAB -c -I/usr/src/linux-2.4.18-14/include -o NakedModule.o NakedModule.c 而有了以上两个文件,你就可以只敲一个make命令就搞定了,呵呵。 注意你的linux版本不一定和我的一样,改/usr/src/linux-2.4.18-14/include就可以了。 //NakedModule.c //包括一大堆,有的不一定用了,管它呢。 #include <linux/module.h> #include <linux/kernel.h> #include <linux/errno.h> #include <asm/uaccess.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/delay.h> #include <linux/ioctl.h> #include <linux/sched.h> #include <linux/smp_lock.h> #include <linux/devfs_fs_kernel.h> #include <linux/usb.h> //以下加一些信息给module,用infmod什么命令看的吧,忘了。 #define DRIVER_VERSION \"v1.0\" #define DRIVER_AUTHOR \"TigerZD\" #define DRIVER_DESC \"Naked Linux USB driver\" MODULE_AUTHOR( DRIVER_AUTHOR ); MODULE_DESCRIPTION( DRIVER_DESC ); MODULE_LICENSE(\"GPL\"); //现在的版本很多用MODULE_INIT的宏了,没看是不是就是换个定//义,反正init_module照样好使。 int init_module(void) { printk(\"<5>Module is loaded!\\n\"); return 0; } // void cleanup_module(void) { printk(\"<5>Module is unloaded!\\n\"); } // 好了,敲一个make,NakedModule.o应该出来了,用insmod NakedModule.o命令加载它,没问题的话在/var/log/messages最后应该有Module is loaded!这句了。用tail /var/log/messages可以简单看到/var/log/messages中最后的信息。 如果加载时告诉你什么东西unreseved的话就比较麻烦,在编译命令中加入-DMODVERSIONS,在c文件中#include <linux/modversions.h>试试,反正我的加不加都可以。 用rmmod NakedModule卸载module。 好了,第一步完了,下一步在module中加入usb设备注册。 [编辑 - 11/7/02 by tigerzd] |
|
|
地下室#
发布于:2002-11-07 16:53
讲得如此详细,是我们的福音啊!
加油加油。 |
|
5楼#
发布于:2002-11-07 17:17
请问一下:
#include <linux/smp_lock.h> 是什么用的? |
|
6楼#
发布于:2002-11-08 10:20
拜读大作,谢谢!
|
|
|
7楼#
发布于:2002-11-08 10:58
2、usb driver注册
linux中的usb设备注册也很简单,这要归功于linux简洁的文件系统结构和usbcore的设计了。 首先需要定义一个usb driver: static struct usb_driver naked_usb_driver = { name : \"nakedusb\" }; 关于usb_driver的定义看linux中的usb.c吧,记住linux中的源代码永远是你最大的财富!这里nakedusb就是你要注册的usb驱动程序的名字。 然后在init_module中加入: usb_register(&naked_usb_driver); cleanup_module中加入: usb_deregister(&naked_usb_driver); 即 static struct usb_driver naked_usb_driver = { name : \"nakedusb\" }; int init_module(void) { printk(\"<5>Module is loaded!\\n\"); usb_register(&naked_usb_driver); return 0; } // void cleanup_module(void) { printk(\"<5>Module is unloaded!\\n\"); usb_deregister(&naked_usb_driver); } 好再敲一次make编译好NakedModule.o,加载,应该是成功的了。到/proc/bus/usb目录下查看drivers文件,应该有5-11:nakedusb一项了,前面的数据是什么不太清楚。messages文件中应该有usb.c:register new usb driver : nakedusb。好,这一步很简单吧,呵呵,一步一步来嘛。:) [编辑 - 11/8/02 by tigerzd] |
|
|
8楼#
发布于:2002-11-08 11:02
请问一下: 是多处理器的加锁访问用的,与windows中的spin_lock(自旋锁)的作用差不多吧。 |
|
|
9楼#
发布于:2002-11-12 13:49
终于写完了,刚提交了,应该很快就可以发表出来吧。希望对大家有所帮助!
:) |
|
|
10楼#
发布于:2002-11-17 10:05
我想在linux下用usb接口打印机,其设备文件为/dev/usb/lp0
内核中的模块为printer,usbcore ,uhci,但我加载了printer模块 后,用cat 11.prn>/dev/usb/lp0 和 open(/dev/usb/lp0)都提示 没有这个设备文件. 请问在linux中,设备文件和打印机模块是如何联系在一起的? 其他如并口的打印机(/dev/lp0 是怎样和内核中相关的模块联系在一起的) 那位如用过linux下usb打印机请介绍一下经验 多谢!! |
|
11楼#
发布于:2002-11-18 08:30
看主页上的文章。
|
|
|
12楼#
发布于:2002-11-18 09:36
我的意思是说:模块和设备文件名是怎样联系上的?linux打印机的模块在linux kernel中已经有了,叫做printer,我加载了他,但我在用
\"/dev/usb/lp0\"时却提示\"没有此设备\",请问为何?这也是我想问MODULE 和设备文件名(/DEV/USB/LP0)关系的原因,多谢!! |
|
13楼#
发布于:2002-11-18 09:44
我的意思是说:模块和设备文件名是怎样联系上的?linux打印机的模块在linux kernel中已经有了,叫做printer,我加载了他,但我在用 删除,重新mknod |
|
14楼#
发布于:2002-11-18 10:34
通过devfs_register联系。
myusb_devfs_handle = devfs_register( usb_devfs_handle, \"nakeusb\",//设为“lp0” DEVFS_FL_DEFAULT, USB_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP |S_IWGRP | S_IROTH | S_IWOTH , &usb_fops, NULL); |
|
|
15楼#
发布于:2002-11-21 12:02
\"myusb_devfs_handle = devfs_register(
usb_devfs_handle, \"nakeusb\",//设为“lp0” DEVFS_FL_DEFAULT, USB_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP |S_IWGRP | S_IROTH | S_IWOTH , &usb_fops, 可是,在kernel的源码中(printer.c),nakeusb对应的不是lp0的名字, |
|
16楼#
发布于:2002-11-23 14:29
请问在用mknode /dev/name c 180 0
中的\"name\" 与驱动程序中的\"nakeusb\" 要相同吗? \"nakeusb\"如下: myusb_devfs_handle = devfs_register( usb_devfs_handle, \"nakeusb\",//设为“lp0” DEVFS_FL_DEFAULT, USB_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP |S_IWGRP | S_IROTH | S_IWOTH , &usb_fops, NULL); |
|
17楼#
发布于:2002-11-26 19:37
无人回答?
|
|
18楼#
发布于:2002-11-28 09:31
厉害,我服了你了,啥时候拜你为师
|
|