注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

LINUX驱动学习——内核USB驱动编写六skeleton.c模块的加载  

2012-12-27 10:29:43|  分类: USB系列 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

LINUX驱动学习——内核USB驱动编写六skeleton.c模块的加载

 

前面以skeleton这个内核自带的程序比较基础的分析了一下USB的驱动的基本方法,然后就是编写好了如何加载到内核中去,不然,这个驱动不就白写了。

首先要对驱动的源码进行简单的改动,因为USB是利用PID和VID来区别不同的设备的,所以这里要把你的具体的两个号儿与这两个值对应上,而在默认的驱动里:

/* Define these values to match your devices */

#define USB_SKEL_VENDOR_ID      0xfff0

#define USB_SKEL_PRODUCT_ID    0xfff0

其实就是把这两个宏定义与你的具体的硬件对应一下。

下来的活儿就很简单了,主要是修改Kconfig文件makefile文件,增加具体的编译对象。

在具体的编译过程中,会有一些错误,这个网上有解决办法,大家可以查一下就可以了。

 

#include <stdio.h>
  #include <sys/types.h>
  #include <unistd.h>
  #include <fcntl.h>
  #include <linux/input.h>

int main (void)
  {
     int fd,i,count;
     struct input_event ev_mouse[2];
     fd = open ("/dev/input/sekl0",O_RDWR);
     if (fd < 0) {
          printf ("fd open failed\n");
          exit(0);
     }
     printf ("\skeleton opened, fd=%d\n",fd);
     //在此处调用read write函数即可。

省略…………
    close (fd);
    return 0;
}

 

这里需要说明的是,默认的生成的NODE结点是skel0,但是是可以修改的,位置在下面的类中:

static struct usb_class_driver skel_class = {

         .name =            "skel%d",

         .fops =               &skel_fops,

         .minor_base = USB_SKEL_MINOR_BASE,

};

这样skeleton.c基本就分析了。

有一些细节需要顺带说一下,那就是,在用户空间使用open,write,ioctl等函数是如何与内核空间进行通信的。

以open为例:

用户空间为:

int open( const char * pathname,int flags, mode_t mode);

返回值 

       1.调用成功:

              返回文件描述符(整型变量0~255)。由open 返回的文件描述符一定是该进程尚未使用的最小描述符。

       2.失败

              只要有一个权限被禁止则返回-1。

内核空间为:

static int skel_open(struct inode *inode, struct file *file)

返回值为 成功或失败代码

我们发现这两个函数的参数还是有相当大的区别的,那他们如何对应上的呢?肯定是内核捣得鬼。

这里面其实很简单,内核中会调用一系列的宏来创建对应的inode 和file这两个数据结构,并且由内核进行管理,具体的动作可以看转载的“linux设备驱动模型一字符设备open系统调用流程

努力要从今日始,日日复今日,今日何其少!

  评论这张
 
阅读(684)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017