tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2788回复:18

Linux的USB驱动程序架构比windows简练多了,呵呵。

楼主#
更多 发布于:2002-11-07 13:37
编译、加载、devfs注册做完就可以通过应用程序和设备通讯了,根本没有那么多windows的IRP_XXX,感觉简练多了,容易上手。
倒是开发Linux应用程序没有VC方便。
看什么时候写一点心得和一个几乎“全裸”的Linux USB module以及相应的应用程序,不知有没有人有兴趣呢? :)

[编辑 -  11/7/02 by  tigerzd]

最新喜欢:

jxchen045jxchen... jeanyejeanye
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
lrx666
驱动太牛
驱动太牛
  • 注册日期2001-08-17
  • 最后登录2010-10-25
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望47点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-28 09:31
厉害,我服了你了,啥时候拜你为师
spin
驱动小牛
驱动小牛
  • 注册日期2001-04-17
  • 最后登录2015-10-27
  • 粉丝1
  • 关注0
  • 积分46分
  • 威望354点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-26 19:37
无人回答?
spin
驱动小牛
驱动小牛
  • 注册日期2001-04-17
  • 最后登录2015-10-27
  • 粉丝1
  • 关注0
  • 积分46分
  • 威望354点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
地板#
发布于: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);



 
spin
驱动小牛
驱动小牛
  • 注册日期2001-04-17
  • 最后登录2015-10-27
  • 粉丝1
  • 关注0
  • 积分46分
  • 威望354点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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的名字,
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于: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);
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-18 09:44
我的意思是说:模块和设备文件名是怎样联系上的?linux打印机的模块在linux kernel中已经有了,叫做printer,我加载了他,但我在用
 \"/dev/usb/lp0\"时却提示\"没有此设备\",请问为何?这也是我想问MODULE 和设备文件名(/DEV/USB/LP0)关系的原因,多谢!!

删除,重新mknod
spin
驱动小牛
驱动小牛
  • 注册日期2001-04-17
  • 最后登录2015-10-27
  • 粉丝1
  • 关注0
  • 积分46分
  • 威望354点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-18 09:36
我的意思是说:模块和设备文件名是怎样联系上的?linux打印机的模块在linux kernel中已经有了,叫做printer,我加载了他,但我在用
 \"/dev/usb/lp0\"时却提示\"没有此设备\",请问为何?这也是我想问MODULE 和设备文件名(/DEV/USB/LP0)关系的原因,多谢!!
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-18 08:30
看主页上的文章。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
spin
驱动小牛
驱动小牛
  • 注册日期2001-04-17
  • 最后登录2015-10-27
  • 粉丝1
  • 关注0
  • 积分46分
  • 威望354点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
9楼#
发布于: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打印机请介绍一下经验

 多谢!!




tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-12 13:49
终于写完了,刚提交了,应该很快就可以发表出来吧。希望对大家有所帮助!
 :)
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-08 11:02
请问一下:
#include <linux/smp_lock.h>
是什么用的?

是多处理器的加锁访问用的,与windows中的spin_lock(自旋锁)的作用差不多吧。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于: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]
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-08 10:20
拜读大作,谢谢!
生命驱动,活力无限!
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-11-07 17:17
请问一下:
#include <linux/smp_lock.h>
是什么用的?
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-11-07 16:53
讲得如此详细,是我们的福音啊!
加油加油。
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-11-07 14:16
我等着拜读!
生命驱动,活力无限!
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-11-07 13:58
太好了,支持!!!
游客

返回顶部