当前位置: 首页 > Linux

USB系列-2-DNW源码

时间:2023-04-07 01:41:24 Linux

#include#include#include#include#include#include#include#defineSECBULK_MAJOR102#defineSECBULK_MINOR0#defineDRIVER_NAME"secbulk"#defineBULKOUT_BUFFER_SIZE512structsecbulk_dev{结构usb_device*udev;结构互斥体io_mutex;字符*bulkout_buffer;__u8bulk_out_endpointAddr;};staticstructusb_class_driversecbulk_class;staticstructusb_device_idsecbulk_table[]={{USB_DEVICE(0x04e8,0x1234)},//c{}};staticstructusb_driversecbulk_driver;staticvoidsecbulk_disconnect(structusb_interface*interface){结构secbulk_dev*dev=NULL;printk(KERN_INFO"secbulk:secbulk断开连接!\n");dev=usb_get_intfdata(接口);如果(空!=开发)kfree(开发);usb_deregister_dev(接口,&secbulk_class);return;}staticssize_tsecbulk_read(structfile*file,char__user*buf,size_tlen,loff_t*loff){return-EPERM;}staticssize_tsecbulk_write(structfile*file,constchar__user*buf,size_tlen,loff_t*loff){size_tto_write;结构secbulk_dev*dev=file->private_data;诠释;int实际长度;size_ttotal_writed;total_writed=0;while(len>0){to_write=min(len,BULKOUT_BUFFER_SIZE);if(copy_from_user(dev->bulkout_buffer,buf+total_writed,to_write))//得到用户空间数据{printk(KERN_ERR"secbulk:copy_from_userfailed!\n");返回-EFAULT;}ret=usb_bulk_msg(dev->udev,usb_sndbulkpipe(dev->udev,dev->bulk_out_endpointAddr),//构建批量传输信息,传输给usbCore处理dev->bulkout_buffer,to_write,&actual_length,3*HZ);如果(ret||actual_length!=to_write){printk(KERN_ERR"secbulk:usb_bulk_msg失败!\n");返回-EFAULT;}len-=to_write;total_writed+=to_write;}returntotal_writed;}staticintsecbulk_open(structinode*node,structfile*file){structusb_interface*interface;结构secbulk_dev*开发;interface=usb_find_interface(&secbulk_driver,iminor(node));如果(!接口)返回-ENODEV;dev=usb_get_intfdata(接口);dev->bulkout_buffer=kzalloc(BULKOUT_BUFFER_SIZE,GFP_KERNEL);如果(!(dev->bulkout_buffer))返回-ENOMEM;如果(!mutex_trylock(&dev->io_mutex))返回-EBUSY;文件->private_data=dev;return0;}staticintsecbulk_release(structinode*node,structfile*file){structsecbulk_dev*dev;dev=(structsecbulk_dev*)(file->private_data);kfree(开发->bulkout_buffer);mutex_unlock(&dev->io_mutex);返回0;}静态结构file_operaionssecbulk_fops={.owner=THIS_MODULE,.read=secbulk_read,.write=secbulk_write,.open=secbulk_open,.release=secbulk_release,};staticstructusb_class_driversecbulk_class={.name="secbulk%d",&opsbulk%d=.fop,.minor_base=100,};staticintsecbulk_probe(structusb_interface*interface,conststructusb_device_id*id){intret;结构secbulk_dev*开发;结构usb_host_interface*iface_desc;结构usb_endpoint_descriptor*端点;:secbulkprobing...\n");dev=kzalloc(sizeof(*dev),GFP_KERNEL);//分配一个指针空间,只是为了索引内核空间if(!dev){ret=-ENOMEM;gotoerror;}iface_desc=interface->cur_altsetting;for(i=0;idesc.bNumEndpoints;i++)//从USBCore传入的接口获取输出endpoint{endpoint=&(iface_desc->endpoint[i].desc);如果(!dev->bulk_out_endpointAddr&&usb_endpoint_is_bulk_out(endpoint)){printk(KERN_INFO"secbulk:bulkoutendpointfound!\n");dev->bulk_out_endpointAddr=endpoint->bEndpointAddress;休息;}}if(!(dev->bulk_out_endpointAddr)){ret=-EBUSY;转到错误;}ret=usb_register_dev(接口,&secbulk_class);//将usb驱动注册成字符设备驱动提供给用户程序if(ret){printk(KERN_ERR"secbulk:usb_register_devfailed!\n");返还;}dev->udev=usb_get_dev(interface_to_usbdev(interface));usb_set_intfdata(接口,开发);mutex_init(&dev->io_mutex);返回0;错误:if(!dev)kfree(dev);返回ret;}staticstructusb_driversecbulk_driver={.name="secbulk",.probe=secbulk_probe,.disconnect=secbulk_disconnect,.id_table=secbulk_table,.supports_autosuspend=0,};staticint__initsecbulk_init(void){整数结果;printk(KERN_INFO"secbulk:secbulk加载\n");结果=usb_register(&secbulk_driver);//1注册secbulk_driver,这里我们注册usb_driver,当USB插入时,//会调用add_dev,然后将ID号与驱动支持的id进行比较。如果比较通过,它将调用probeif(result){printk(KERN_ERR"secbulk:usb_registerfailed:%d",result);返回结果;}return0;}staticvoid__exitsecbulk_exit(void){usb_deregister(&secbulk_driver);printk(KERN_INFO"secbulk:secbulkunloaded\n");}module_init(secbulk_init);module_exit(secbulk_exit);MODULE_LICENSE("GPL");