zoukankan      html  css  js  c++  java
  • Program for Linux USB-devices driver step by step (ONE)

    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
    ");
    
    	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
    ");
    }
    
    /*
    **	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
    ");
    
    		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
    ");
    
    	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);




    衡山日出







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

  • 相关阅读:
    斐波那契数列的量化分析
    GridView编辑删除操作
    Linux crontab 命令格式与具体样例
    VB.NET版机房收费系统---组合查询
    XMLHTTP使用具体解释
    Android 在子线程中更新UI的几种方法
    国产操作系统剽窃Linux内核可耻!
    Android的PVPlayer介绍
    稀疏矩阵
    很好的理解遗传算法的样例
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4667556.html
Copyright © 2011-2022 走看看