当前位置: 首页 > news >正文

哈尔滨h5模板建站新型网络营销方式

哈尔滨h5模板建站,新型网络营销方式,网站开发课程论文,网络营销方法选择设备驱动程序是操作系统内核和机器硬件之间的接口#xff0c;由一组函数和一些私有数据组成#xff0c;是应用程序和硬件设备之间的桥梁。在应用程序看来#xff0c;硬件设备只是一个设备文件#xff0c;应用程序可以像操作普通文件一样对硬件设备进行操作。 设备驱动程序是… 设备驱动程序是操作系统内核和机器硬件之间的接口由一组函数和一些私有数据组成是应用程序和硬件设备之间的桥梁。在应用程序看来硬件设备只是一个设备文件应用程序可以像操作普通文件一样对硬件设备进行操作。 设备驱动程序是内核的一部分主要完成以下功能对设备的初始化和释放把数据从内核传送到硬件设备和从硬件设备读取数据读取应用程序数据传送给设备文件和回送应用程序请求的数据检测和处理硬件设备出现的错误。 一、 Linux USB子系统分析 在Linux系统中USB主机驱动程序由3部分组成USB主机控制器驱动HCD、USB核心驱动USBD和不同种类的USB设备类驱动如下所示。其中HCD和USBD被称为协议软件或者协议栈这两部分共同处理与协议相关的操作。 USB设备类驱动可以包含多个不同的功能接口对应不同的驱动程序它们不直接与USB设备硬件打交道而是通过协议软件的抽象处理来完成与设备的不同功能接口之间的通信。 在Linux USB子系统中HCD是直接和硬件进行交互的软件模块是USB协议栈的最底层部分是USB主机控制器硬件和数据传输的一种抽象。 HCD向上仅对USB总线驱动程序服务HCD提供了一个软件接口即HCDI使得各种USB主机控制器的硬件特性都被软件化并受USB总线驱动程序的调用和管理。HCD向下则直接管理和检测主控制器硬件的各种行为。HCD提供的功能主要有主机控制器硬件初始化为USBD层提供相应的接口函数提供根HUBROOT HUB设备配置、控制功能完成4种类型的数据传输等。 USBD部分是整个USB主机驱动的核心主要实现的功能有USB总线管理USB总线设备管理、USB总线带宽管理、USB的4种类型数据传输、USB HUB驱动、为USB设备驱动提供相关接口、提供应用程序访问USB系统的文件接口等。其中USB HUB作为一类特殊的USB设备其驱动程序被包含在USBD层。 在嵌入式Linux系统中已经包含HCD模块和USB核心驱动USBD不需要用户重新编写用户仅仅需要完成USB设备类驱动即可。 二、Linux系统中USB子系统的主要数据结构 Linux系统中USBD通过定义一组宏、数据结构和函数来抽象出所有硬件或是设备具有依赖关系的部分。 USBD中主要有四个数据结构分别是 1.usb_device保存一个USB设备的信息包括设备地址设备描述符配置描述符等。 2.usb_bus保存一个USB总线系统的信息包括总线上设备地址信息根集线器带宽使用情况等。一个USB总线系统至少有一个主机控制器和一个根集线器Linux系统支持多USB总线系统。 3.usb_driver保存客户驱动信息包括驱动名称以及驱动提供给USB内核使用的函数指针等。 4.URBUniversal Request Block是进行USB通信的数据结构USBD通过URB在USB设备类驱动和USBD、USBD和HCD间进行数据传输。 三、Linux系统中USB设备的加载与卸载 当把一个USB设备插入到一个USB HUB的某个端口时集中器就会检测到设备的接入从而在下一次受到主机通过中断交互查询时就会向其报告。集中器的端口在没有设备接入时都处于关闭状态插入设备之后也不会自动打开必须由主机通过控制交互发出命令予以打开。所以在得到集中器的报告之后主机的USB驱动程序就会为新插入的设备调度若干个控制交互并向集中器发出打开这个端口的命令这样新插入的设备就会出现在USB总线上了并为该设备分配唯一的地址。 HUB驱动程序调用函数usb_connect(struct usb_device *dev)和usb_new_device(struct usb_device *dev)解析设备的各种描述符信息分配资源并与相应的设备驱动程序建立联系。 函数usb_new_device主要完成以下工作 1.调用usb_set_address把新分配的设备地址传送给设备。 2.调用usb_get_descriptor获得设备的设备描述符得到设备端点的包的最大长度接下来的控制传输按这个数据包最大长度进行。 3.调用usb_get_configuration得到设备的所有配置描述符、接口描述符和端点描述符信息。 4.调用usb_set_configuration激活当前的配置作为默认工作配置。 5.在目录“proc/bus/usb”中为设备创建节点。 6.在USB子系统中通过函数usb_find_drivers和usb_find_interface_driver为设备的每一个接口寻找相应的驱动程序驱动程序对接口进行配置并为它们分配所需的资源。当每个接口被成功驱动后此设备就能正常工作了。 设备拔下时与之相联的集线器首先检测到设备的拔下信号通过中断传输将信息传送给集线器的驱动集线器的驱动先验证设备是否被拔下如果是则调用usb_disconnect(struct usb_device **pdev)进行处理。设备断开后USB系统找到设备当前活动配置的每个接口的驱动程序调用它们提供的disconnect接口函数中断它们与各个接口的数据传输操作释放它们为每个接口分配的资源。如果此设备是集线器则递归调用usb_disconnect来处理它的子设备释放设备地址通过usbdevfs_remove_device函数释放给设备创建的文件节点通过usb_free_dev释放USBD给设备分配的资源。 四、编写USB驱动程序步骤 1、所有usb驱动都必须创建主要结构体struct usb_driver struct usb_driver -struct module *owner (有他可正确对该驱动程序引用计数应为THIS_MODULE -const char *name (驱动名字运行时可在查看 /sys/bus/usb/drivers/) -const struct usb_device_id *id_table (包含该驱动可支持的所有不同类型的驱动设备,没添探测回调函数不会被调用 -int *probe)(struct usb_interface *intf,const struct usb_device_id *id) (usb驱动探测函数,确认后struct usb_interface 应恰当初始化然后返0如果出错则返负值) -void(*disconnect)(struct usb_interface *intf) (当struct usb_interface 被从系统中移除或驱动正从usb核心中卸载时usb核心将调用此函数 代码实例 [cpp] view plaincopy  static struct usb_driver skel_driver{       .owner  THIS_MODULE,       .name  skeleton,       .id_table  skel_table,       .probe  skel_probe,       .disconnect  skel_disconnect,   };   2、usb_register()注册将struct usb_driver 注册到usb核心传统是在usb驱动程序模块初始化代码中完成该工作的 [cpp] view plaincopy static int __init usb_skel_init(void)   {          ...           usb_register(skel_driver);          ...   }   3、struct usb_device_id usb核心用该表判断哪个设备该使用哪个驱动程序热插拔脚本使用它来确定当一个特定的设备插入到系统时该自动装载哪个驱动程序。 -__u16 match_flags(确定设备和结构体中下列字段中哪一个相匹配 -__u16 idVendor(设备的usb制造商id -__u16 idProduct(设备的usb产品id  4、USB骨架程序的关键几点如下 a -- USB驱动的注册和注销  Usb驱动程序在注册时会发送一个命令给usb_register通常在驱动程序的初始化函数里。 当要从系统卸载驱动程序时需要注销usb子系统。即需要usb_unregister 函数处理。 b -- 当usb设备插入时为了使linux-hotplugLinux中PCI、USB等设备热插拔支持系统自动装载驱动程序你需要创建一个MODULE_DEVICE_TABLE 代码如下这个模块仅支持某一特定设备 [cpp] view plaincopy static struct usb_device_id skel_table []  {        { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },       { } /* Terminating entry */};    MODULE_DEVICE_TABLE (usb, skel_table);   USB_DEVICE宏利用厂商ID和产品ID为我们提供了一个设备的唯一标识。当系统插入一个ID匹配的USB设备到USB总线时驱动会在USB core中注册。驱动程序中probe 函数也就会被调用。usb_device 结构指针、接口号和接口ID都会被传递到函数中。 c -- static void * skel_probe(struct usb_device *dev,unsigned int ifnum, const struct usb_device_id *id) 驱动程序需要确认插入的设备是否可以被接受如果不接受或者在初始化的过程中发生任何错误probe函数返回一个NULL值。否则返回一个含有设备驱动程序状态的指针。通过这个指针就可以访问所有结构中的回调函数。 d -- 在骨架驱动程序里最后一点是我们要注册devfs。 我们创建一个缓冲用来保存那些被发送给usb设备的数据和那些从设备上接受的数据同时USB urb 被初始化并且我们在devfs子系统中注册设备允许devfs用户访问我们的设备。注册过程如下 [cpp] view plaincopy /* initialize the devfs node for this device and register it */       sprintf(name, skel%d, skel-;minor);       skel-devfs  devfs_register (usb_devfs_handle, name,DEVFS_FL_DEFAULT,       USB_MAJOR,USB_SKEL_MINOR_BASE  skel-minor,               S_IFCHR | S_IRUSR | S_IWUSR |S_IRGRP | S_IWGRP | S_IROTH, skel_fops, NULL);   如果devfs_register函数失败不用担心devfs子系统会将此情况报告给用户。 当然最后如果设备从usb总线拔掉设备指针会调用disconnect 函数。驱动程序就需要清除那些被分配了的所有私有数据、关闭urbs并且从devfs上注销调自己。   /* remove our devfs node */devfs_unregister(skel-;devfs); 5、其他 a -- struct usb_host_endpoint(描述usb端点) →(包含)struct usb_endpoint_descriptor(含真正端点信息数据格式是真正驱动关心的字段) 端点描述符 bEndpointAddress 81(in)(第8位为1是输入设备)usb的端点地址包含端点方向 bmAttibutes 03interrupt端点类型为中断传输 wMaxPacketSize 0008每次传8个字节端点每次可处理最大字节长度 bInterval 088ms如端点为中断该值为轮询间隔 b -- usb端点捆绑为接口usb接口只处理一种usb逻辑连接如鼠标键盘等 一个usb设备可有多接口usb扬声器一个usb键盘用于按键一个usb音频流则需两个不同的驱动程序。 usb驱动 通常将struct usb_interface 转成 struct usb_device 用函数 interface_to_usbdev转  c -- struct usb_interface 描述usb接口 →struct usb_host_interface * altsetting(接口结构体数组,包含所有可能用于该接口的可选设置)     →struct usb_host_endpoint    →unsigned num_altsetting(可选设置的数量)    →struct usb_host_interface * cur_altsetting(接口当前活动设置)    →int minorusb核心分配给接口的次设备号成功调用usb_register_dev有效  d -- usb设备非常复杂由许多不同逻辑单元组成简单关系如下 设备通常有一个以上的配置    配置经常有一个以上接口    接口通常有一个以上设置    接口通常有一个以上端点    设备描述-》配置描述-》接口描述-》端点描述  e -- usb sysfs设备命名方案 根集线器-集线器端口号配置。接口    对于usb hub树中层次更高的字树命名方案    根集线器-集线器端口号-集线器端口号配置。接口  f --  linux内核的代码通过一个成为urbusb请求块和所有usb设备通信.   用struct urb描述include/linux/usb.h中定义  -urb用异步同usb设备特定usb端点发送/接收数据使用类似网络代码中的struct skbuff    - urb 被动态创建随时可被驱动程序或usb核心取消内部有引用计数可被多次调用使他们可在最后一个使用者释放他们时自动地销毁    - urb使得流处理或其他复杂的重叠的通信成为可能获得高数据传输速度。     -usb_alloc_urb() 创建urb包 usb_free_urb() 释放urb包     -usb_fill_int_urb()正确初始化将发送到usb设备的中断端点urb      usb_fill_bulk_urb() .. .. .. ... 批量传输端点urb      usb_fill_control_urb() .. .. .. ... 控制端点urb      等时urb在提交给核心时必须手动初始化很不幸没函数    -usb_submit_urb()urb被usb驱动正确创建和初始化后就可提交到usb核心发送到usb设备上了,如果调用成功函数返0urb控制权转给usb核心    -usb_kill_urb() or usb_unlink_urb()取消已经被提交给核心的urb  五、USB驱动开发简单示例 1、嵌入式Linux系统中USB摄像头驱动程序实现 通常USB设备类驱动程序需要提供两个数据结构接口一个针对USBD层一个针对文件系统。USB摄像头驱动程序需要做的第一件事情就是在USB子系统里注册并提供一些相关信息包括该驱动程序支持哪些设备当被支持的设备从总线插入或拔出时会有哪些动作等所有这些信息通过usb_driver的形式传送到USBD中具体实现如下 [cpp] view plaincopy static struct usb_driver cam_driver  {       .name: cam_video,       .probe: cam_probe,       .disconnect: cam_disconnect,       .id_table: cam_ids,   };     其中 cam_video是客户端驱动程序的字符串名称用于避免驱动程序的重复安装和卸载 cam_probe则指向USB驱动程序的探测函数指针提供给USB内核的函数用于判断驱动程序是否能对设备的某个接口进行驱动 cam_disconnect指向USB驱动程序中的断开函数的指针当从系统中被移除或者驱动程序正在从USB核心中卸载时USB核心将调用该函数 cam_ids列表包含了一系列该驱动程序可以支持的所有不同类型的USB设备如没有设置该列表则该驱动程序中的探测回调函数不会被调用。 当一个摄像头连接到USB总线上时USB内核通过调用camDrive.c中的cam_probe函数判断是否支持该设备如果支持为该设备创建设备文件节点以后应用程序就可以通过标准POSIX函数把该设备当成普通文件来访问。摄像头驱动程序定义的文件系统接口如下 [cpp] view plaincopy struct file_operations cam_fops  {       .owner      THIS_MODULE,       .open       cam_v 4l2_open,       .release    cam_v4l2_release,       .ioctl      cam_v4l2_ioctl,       .llseek     no_llseek,       .read       cam_v4l2_read,       .mmap       cam_v4l2_mmap,       .poll       cam_v4l2_poll,   };   在USB摄像头驱动程序的初始化函数中通过usb_register进行设备注册当从系统卸载驱动程序时需要通过usb_deregister进行卸载。当驱动程序向USB子系统注册后插入一个新的USB设备后总是要调用cam_probe函数进行设备驱动程序的查找以确定新的USB设备硬件中的生产厂商ID和产品自定义ID是否与驱动程序相符从而确定是否使用该驱动程序。 2、USB摄像头驱动程序测试 在嵌入式Linux系统中USB摄像头被注册为一个标准的视频设备/dev/video通过影像设备API接口Video4Linux来获取视频和音频数据。 现有的Video4Linux有两个版本v4l和v4l2。通过v4l2 API接口获取视频图像的主要操作步骤如下 a -- 打开视频设备 在Linux系统中摄像头的设备文件为/dev/video0调用系统函数open打开该设备。 fd open (dev_name, O_RDWR); b -- 获取视频设备所支持的V4L2特性 所有的V4L2设备驱动都需要支持VIDIOC_QUERYCAP_ioctl的系统调用。通过该调用确定该驱动程序是否与V4L2规范相兼容同时获取该设备所支持的V4L2特性。在摄像头应用程序的开发过程中需要判定该设备是否支持视频捕获。 ret ioctl(fd, VIDIOC_QUERYCAP, cap); c -- 获取视频设备支持的各种特性 接着利用ioctl(fd,VIDIOC_QUERYCAP,cap)函数读取struct v4l2_capability中有关摄像头的信息。该函数成功返回后这些信息从内核空间拷贝到用户程序空间capability各成员分量中。 ioctl(device_fd, VIDIOCGCAP, vidcap); d -- 设置视频捕获的图像格式 memset(fmt, 0, sizeof(struct v4l2_format)); fmt.type V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width vd-width; fmt.fmt.pix.height vd-height; fmt.fmt.pix.pixelformat vd-formatIn; ret ioctl(fd, VIDIOC_S_FMT, fmt); e -- 视频数据帧捕获 ioctl (fd, VIDIOC_DQBUF, buf); 获取到视频数据之后放到buf缓冲区中通过QT桌面应用开发系统显示到LCD显示屏上通过触摸屏进行交互控制。
http://www.pierceye.com/news/257125/

相关文章:

  • 关于网站制作的评价.net网站制作综合实训报告
  • 合肥专业制作网站科技创新绘画作品图片
  • 站内推广的主要目的是商业空间设计心得体会
  • 网站建设丨金手指15phpcms建设网站
  • 怎么网上推广自己的产品郑州seo优化外包顾问阿亮
  • 灵台门户网站建设网站开发费用会计分录
  • wordpress替换公共js北京seo推广服务
  • 公司付的网站费怎么做分录黑色网站配色
  • 体育门户网站源码峰峰做网站
  • 山西网站建设多少钱电商网站建设需要
  • 海西电子商务网站建设wordpress 主题宽度
  • 网站建设首选公司wordpress需要mysql
  • 织梦 旅游网站模板深圳公司招牌制作
  • PHP网站开发如何建立vipwordpress页面伪静态
  • 主题公园旅游景区网站建设网站后台图片模板
  • 慈溪网站建设慈溪WordPress点击文章显示404
  • 网站建设与seo网站开发项目总结范文
  • 做竞彩网站代理犯法么建站公司 网站
  • 浙江建设证书查询seo服务公司深圳
  • 长沙协会网站设计专业服务医疗信息化软件公司排名
  • 北京网站制作一般多少钱黑色网站欣赏
  • 广州建设工程造价管理站wordpress获取文章title
  • 免费购物网站源码网站开发的论文引言
  • 商城网站开发需要哪些人员本机建的网站打开却很慢
  • 网站建设哪专业学会python做网站
  • vs怎么添加图片做网站地方门户网站管理系统
  • 三亚做网站的公司科技网站推荐
  • 电商网站运维怎么做自己做网站创业
  • seo有哪些网站集团公司网站 案例
  • 传媒大学附近网站建设公司天津市工程建设公众信息网官网