linux下USB驱动及其相关研究(三) --驱动模块的编写

        驱动模块的编写有一定的结构,看起来十分复杂,其实很简单。 首先就是模块的初始化函数,退出函数。初始化函数就是进行注册。

一  最简单的驱动结构:

1.1 申明一个结构体   

 static struct usb_driver naked_usb_driver = {
       name          : "nakedusb" 
 };

1.2 然后在init_module中加入:usb_register(&naked_usb_driver);
     在cleanup_module中加入:usb_deregister(&naked_usb_driver);

二   一个即插即用的驱动

前提是打开拉linux内核的即插即用选项.插上usb之后,/proc/bus/usb中的devices 最下面会多出一个设备。在/proc/scsi/usb-storage 也可以查看当前设备的情况。

2.1  定义一个结构体struct usb_device_id

static struct usb_device_id my_usb_id =
{ idVendor  : 0xXXXX, 
  idProduct : 0xXXXX
};

2.2 定义另外一个结构体 struct usb_driver

static struct usb_driver naked_usb_driver = {
  name          : "nakedusb",
  probe         : naked_usb_probe,
  disconnect    : naked_usb_disconnect,
  id_table      : &my_usb_id
};

2.3  定义结构体中的成员函数

static void* naked_usb_probe(struct usb_device *dev)
{
  printk("<5>usb device probe./n");
  if(dev->descriptor.idVendor == 0xXXXX && dev->descriptor.idProduct == 0xXXXX)   
  {   
      printk("<5>My usb device pluged in./n");
   }
}

static void naked_usb_disconnect(struct usb_device *dev)
{  
  printk("<5>usb device disconnected./n");  
  if(dev->descriptor.idVendor == 0xXXXX && dev->descriptor.idProduct == 0xXXXX)  
  {
    printk("<5>My usb device pluged out./n");   
  }
}  

 三 应用程序接口

     就是说模块需要同应用层做通讯,应该实现一组接口。

3.1 定义一个结构体 struct file_operations

static struct file_operations usb_fops =
{
  open    : usb_open, 
  release : usb_close,
  ioctl   : usb_ioctl,
}  

3.2 重新定义usb_driver结构体,增加fops : &usb_fops

static struct usb_driver naked_usb_driver = {
  name          : "nakedusb",
  probe         : naked_usb_probe,
  disconnect    : naked_usb_disconnect,
  fops          : &usb_fops,
  id_table      : &my_usb_id
};

3.3 在probe例程中加入注册设备文件的代码

static void* naked_usb_probe(struct usb_device *dev)
{
  printk("<5>usb device probe./n");
  if(dev->descriptor.idVendor == 0xXXXX && dev->descriptor.idProduct == 0xXXXX)   
  {    
    printk("<5>My usb device pluged in./n");
    myusb_devfs_handle = devfs_register( 
                                                   usb_devfs_handle, 
                                                   "nakeusb", 
                                                   DEVFS_FL_DEFAULT,  
                                                   USB_MAJOR,  
                                                   0, 
                                                   S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP |S_IWGRP | S_IROTH | S_IWOTH ,
                                                   &usb_fops,
                                                   NULL);
  }
}
或者用register_chrdev()替代devfs_register()也可以。register_chrdev(USB_MAJOR,nakeusb,&usb_fops);
 

3.4 分别定义open、close、ioctl例程。

3.5 在命令行敲:mknod /dev/usb/nakeusb c 180 0其中nakeusb是在devfs_register的第二个参数,180是USB_MAJOR定义,0是第5个参数,c表示是字符型设备。

3.6 使用如下代码,就可以在用户层访问内核层的模块

int fd = open("/dev/usb/nakeusb",O_RDWR); 
if(fd == -1)   
{     
    printf("open w682 failed!/n");
    return -1;
}
ioctl(fd,
  cmd,//定义参数,就是usb_ioctl中的cmd
  &arg//传给驱动程序的参数。
        );
close(fd);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值