基于Linux下USB主机接口设计

[09-13 16:55:47]   来源:http://www.88dzw.com  接口定义   阅读:8370

文章摘要:3.2 注册和注销USB驱动程序注册,就是把在初始化函数中填好的use_driver结构作为参数传递给use_register()函数即可,函数的调用方法为:result =usb_register(&skel_driver);当要从系统卸载驱动程序时,也是将use_driver结构作为参数传递给usb_deregister函数处理。函数的调用格式为:当USB设备插入时,为了使linux-hotplug系统自动装载驱动程序,需要创建一个MODULE_DEVICE_TABLE。核心代码如下(这个模块仅支持某一特定设备):3.3 probe()函数probe()函数的编写格式为:static vo

基于Linux下USB主机接口设计,标签:接口技术,微机原理与接口技术,http://www.88dzw.com


  3.2 注册和注销

  USB驱动程序注册,就是把在初始化函数中填好的use_driver结构作为参数传递给use_register()函数即可,函数的调用方法为:result =usb_register(&skel_driver);当要从系统卸载驱动程序时,也是将use_driver结构作为参数传递给usb_deregister函数处理。函数的调用格式为:


  当USB设备插入时,为了使linux-hotplug系统自动装载驱动程序,需要创建一个MODULE_DEVICE_TABLE。核心代码如下(这个模块仅支持某一特定设备):


  3.3 probe()函数

  probe()函数的编写格式为:static void*skel_probe(struct usb_device*dev,unsigned int ifnum,const struct usb_device_id* id);驱动程序需要确认插入的设备是否可以被接收,如果不接收,或者在初始化的过程中发生任何错误,probe()函数返回一个NULL值。否则返回一个含有设备驱动程序状态的指针,通过这个指针,就可以访问所有结构中的回调函数。

  在驱动程序里,最后一点是要注册devfs(设备文件系统)。首先创建一个缓冲用来保存那些被发送给USB设备的数据和那些从设备上接收的数据,并为设备传输创建一个USB请求块(URB)以向设备写入数据,同时USB urb被初始化,然后在devfs子系统中注册设备,允许devfs用户访问USB的设备。注册过程如下:


  如果devfs_register函数失败,devfs子系统会将此情况报告给用户。如果设备从USB总线拔掉,设备指针会调用disconnect函数。驱动程序就需要清除那些被分配了的所有私有数据,关闭urbs,并且从devfs上注销调自己。

  3.4 open(),write()和read()函数

  首先,要打开此设备。在open()函数中MODULE_INC_USE_COUNT宏是一个关键,它起到一个计数的作用,有一个用户态程序打开一个设备,计数器就加1。read()函数首先从open()函数中保存的fi。write()函数和read()函数是完成驱动对读写等操作的响应。在skel write中,一个FLL_BULK_URB函数,就完成了urb系统callbak和的skel_write_bulk_callback之间的联系。read函数与write函数稍有不同在于:程序并没有用urb将数据从设备传送到驱动程序,而是用usb_bulk_msg函数代替,这个函数能够不需要创建urbs和操作urb函数的情况下,来发送数据给设备,或者从设备来接收数据。调用usb_bulk_msg函数并传到一个存储空间,用来缓冲和放置驱动收到的数据,若没有收到数据表示失败并返回一个错误信息。usb_bulk_msg函数,当对USB设备进行一次读或者写时,usb_bulk_msg函数是非常有用的;然而,当需要连续地对设备进行读/写时,应建立一个自己的urbs,同时将urbs提交给USB子系统。

  MOD_DEC_USE_COUNT宏也会被调用到,首先确认当前是否有其他的程序正在访问这个设备,如果是最后一个用户在使用,可以关闭任何正在发生的写,操作如下:


  USB设备可以在任何时间点从系统中取走,即使程序目前正在访问它。USB驱动程序必须要能够很好地处理解决此问题,它需要能够切断任何当前的读写,同时通知用户空间程序:USB设备已经被取走。

上一页  [1] [2] [3] [4]  下一页


Tag:接口定义接口技术,微机原理与接口技术接口定义
分类导航
最新更新
热门排行