Program for Linux USB-devices driver

開始啃硬骨头~ 这里我打算一步步给出USB device driver 的demo。希望有心能可以共同交流学习. 希望认识很多其它对Linux有兴趣的geek.

眼下因为环境和自身能力方面原因还没能做实物的測试,篇章的最后打算给出一个在x86上模拟USB读写的driver。以后可以做实物測试之后再更新this blog

我的联系方式:

jasonleaster@gmail.com(因为偶不能登QQ,所以thunder bird的邮件仅仅要电脑开着就一直在线~)

測试环境:

Ubuntu 14.0

kernel: 3.13.0

以下我比較具体的对代码进行了凝视,要点都在代码中啦~

这段代码不过个样例,相当于第一个驱动设备hello world一样,力求最简单化概括性的给出USB设备插入,拔出相关的处理过程,后面慢慢的写的更深入的时候。代码也就越来越”复杂“

我整理了USB device driver 代码相关的结构体。做了文件夹便于查阅

/**************************************************************
code writer : EOF
code date : 2014.08.18
code file : ./USB_1/usb_1.c
e-mail : jasonleaster@gmail.com code purpose:
This is a demo for how to code for a USB device driver. If there is something wrong with my code, please touch
me by e-mail. Thank you. *************************************************************/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/usb.h>
#include <linux/module.h>
#include <linux/moduleparam.h> /*
** This two Macro used to create a structure --
** 'usb_device_id' by 'USB_DEVICE'
*/
#define VENDOR_ID 0x08f7
#define PRODUCT_ID 0x0002 #define DEVICE_NAME "usb_1" MODULE_AUTHOR("EOF");
MODULE_LICENSE("Dual BSD/GPL"); /*
** id_table stored many USB device's 'usb_device_id' structure
*/
static struct usb_device_id id_table[] =
{
{ USB_DEVICE(VENDOR_ID, PRODUCT_ID)},
{ },
}; /*
** The 'MODULE_DEVICE_TABLE' Macro marks device in the
** module image so that the module can be loaded on demand if
** the device is hotplugged.
*/ MODULE_DEVICE_TABLE(usb,id_table); /*
** The probe() method is invoked by khubd after device enumeration.
**
** @interface :contains information gleaned during the
** enumeration process.
**
** @id : the entry in the driver's 'usb_device_id' table
** that matches the values read from the USB-device.
**
*/
static int usb_probe(struct usb_interface * interface,
const struct usb_device_id *id)
{
dev_info(&interface->dev,"USB device now attached\n"); return 0;
} /*
** disconnect() method is called when the device is unplugged or
** when the module is unloaded.
*/
static void usb_disconnect(struct usb_interface* interface)
{
dev_info(&interface->dev,"USB device now disconnect\n");
} /*
** Each USB device has a 'usb_driver' data structure.
*/
static struct usb_driver usb_driver =
{
.name = DEVICE_NAME,
.probe = usb_probe,
.disconnect = usb_disconnect,
.id_table = id_table,
}; static int usb_init(void)
{
return usb_register(&usb_driver);
} static void usb_exit(void)
{
usb_deregister(&usb_driver);
} module_init(usb_init);
module_exit(usb_exit);

update: 2014.08.18 14:25

逐步完好

这里旨在说明

 'usb_get_dev()' and 'usb_set_intfdata'

http://blog.csdn.net/cinmyheart/article/details/38628387#t21

上面的link。按文件夹查找相关函数定义就可以

/**************************************************************
code writer : EOF
code date : 2014.08.18
code file : ./USB_2/usb_2.c
e-mail : jasonleaster@gmail.com code purpose:
This is a demo for how to code for a USB device driver.
I emphasize to demo for function 'usb_get_dev()' and 'usb_set_intfdata' If there is something wrong with my code, please touch
me by e-mail. Thank you. *************************************************************/ #include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/usb.h>
#include <linux/slab.h> #define VENDOR_ID 0x08f7
#define PRODUCT_ID 0x0002 static struct usb_device_id id_table[] =
{
{USB_DEVICE(VENDOR_ID,PRODUCT_ID)},
{ },
}; MODULE_DEVICE_TABLE(usb,id_table); struct my_usb
{
struct usb_device *udev;
int temp;
}; static int usb_probe(struct usb_interface* interface,const struct usb_device_id*id)
{
struct usb_device* udev = interface_to_usbdev(interface);
struct my_usb * my_dev; my_dev = kzalloc(sizeof(struct my_usb),GFP_KERNEL); if(!my_dev)
{
dev_err(&interface->dev,"Out of memory\n"); return -ENOMEM;
} /*
** increase the reference about probe() method
*/
my_usb->udev = usb_get_dev(udev); usb_set_intfdata(interface,my_usb); dev_info(&interface->dev,"USB device now attached\n"); return 0;
} static void usb_disconnect(struct usb_interface * interface)
{
struct my_usb *my_dev; /*
** Get 'struct my_usb' from interface and then free
** free 'my_dev->udev'.
*/
my_dev = usb_get_intfdata(interface); /*
** decrease the reference about probe() method
*/
usb_put_dev(my_dev->udev); kfree(my_dev); dev_info(&interface->dev,"USB device now disconnected]n");
} static struct usb_driver my_usb_driver =
{
.name = "usb_2",
.probe = usb_probe,
.disconnect = usb_disconnect,
.id_table = id_table,
}; static int usb_init(void)
{
return usb_register(&my_usb_driver);
} static void usb_exit(void)
{
usb_deregister(&my_usb_driver);
} MODULE_AUTHOR("EOF");
MODULE_LICENSE("Dual BSD/GPL"); module_init(usb_init);
module_exit(usb_exit);

衡山日出

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Program for Linux USB-devices driver step by step (ONE)的更多相关文章

  1. Linux USB Project

    转自:http://www.linux-usb.org/ Welcome to the home of the Linux USB Project This web site was created ...

  2. Linux usb子系统(三):通过usbfs操作设备的用户空间驱动

    内核中提供了USB设备文件系统(usbdevfs,Linux 2.6改为usbfs,即USB文件系统),它和/proc类似,都是动态产生的.通过在/etc/fstab文件中添加如下一行:none /p ...

  3. Linux usb子系统(二):USB设备驱动usb-skeleton.c

    usb驱动分为通过usbfs操作设备的用户空间驱动,内核空间的内核驱动.两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在usbfs里驱动该设备. 下面转载的一篇分析u ...

  4. Linux usb子系统(一):子系统架构

    一.USB协议基础知识   前序:USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB)  USB2.0版本速度480Mbps(高速USB). ...

  5. Linux usb子系统(一) _写一个usb鼠标驱动

    USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...

  6. Linux usb 驱动程序范例

                     linxu_usb驱动之框架 USB骨架程序可以被看做一个最简单的USB设备驱动的实例. 首先看看USB骨架程序的usb_driver的定义 [cpp] view p ...

  7. AT91 USB Composite Driver Implementation

    AT91 USB Composite Driver Implementation 1. Introduction The USB Composite Device is a general way t ...

  8. Linux USB驱动框架分析(2)【转】

    转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html   看了http://blog.chinaunix.net/uid-11848011 ...

  9. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

随机推荐

  1. thinkphp5 tp5 获取模块名控制器名方法名

    <?php namespace app\index\controller; use think\Db; use think\Controller; class Base extends Cont ...

  2. USB 3.0规范中译本 附录

    本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 附录A 符号编码   表A-1显示了对于数据字符字节到符号的编码. 表 A-2显示了对于特殊符号的编码. R ...

  3. 最全面的iOS和Mac开源项目和第三方库汇总

    标签: UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UIT ...

  4. iOS过场动画调研笔记

    前言 因项目须要,近期一段时间都在调研iOS的过场动画.对于我来说这是一个之前没有太涉及的领域,所以有必要把调研的过程和自己的一些理解纪录下来 为什么要自己定义过场动画? 假设大家有关注Materia ...

  5. 让Apache 和nginx支持跨域訪问

    1,怎样让Apache支持跨域訪问呢? 步骤: 改动httpd.conf,windows中相应的文件夹是:C:\wamp\bin\apache\Apache2.4.4\conf\httpd.conf ...

  6. 【oracle11g ,19】索引管理

    一.索引的分类: 1.逻辑上分为:  单列索引和复合索引  唯一索引和非唯一索引  函数索引 domain索引 2.物理上分:  分区索引和非分区索引 b-tree  bitmap 注意:表和索引最好 ...

  7. iOS 项目的文件夹结构能看出你的开发经验

    近期有师弟去面试iOS开发,他谈论到,面试官既然问他怎么分文件夹结构的,并且还详细问到每一个子文件夹的文件名称. 文件夹结构确实非常重要.面试官问他这些无疑是想窥探他的开发经验.清晰的文件夹结构,可让 ...

  8. 【t082】牛跑步

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 新牛到部队,CG要求它们每天早上搞晨跑,从A农场跑到B农场.从A农场到B农场中有n-2个路口,分别标上 ...

  9. DOM常用的四大对象是什么?

    DOM常用的四大对象是什么? 一.总结 一句话总结: 1.关注结构,关注主干 2.从主干处着手的话,可以发现dom就是四个东西,document(文档),element,attribute,event ...

  10. tcp长连接和短连接

    tcp长连接和短连接 TCP在真正的读写操作之前,server与client之间必须建立一个连接, 当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接, 连接的建立通过三次握手,释放则需要四 ...