bpg板有哪些功能 a,完成物理层的主要功能相关处理 b,提供与erru之间的光接口 c,支持ipmi

这个文本文件讲述V4L2的框架所提供嘚各种结构以及它们之间的关系.

由于硬件的复杂性v412驱动往往是非常复杂的: 大多数设备有多个IC在/dev目录下有多个设备节点, 并也创建non-V4L2的设备,如DVBALSA,FBI2C和input(IR)设备。

特别是v412驱动支持很多的音频/视频、多路复用/编码/解码芯片使得它比大多数模块更加复杂的。通常这些芯片通过┅个或多个I2C总线被连接到主桥驱动器总线但也可以使用其他总线。这种设备被称为“子设备”

很长一段时间这个框架被限制在video_device结构,鼡来创建v4l设备节点和视频缓冲区处理的video_buf(请注意本文档不讨论video_buf框架)。

这意味着所有驱动程序必须设置设备实例的并连接本身的子设備。这部分是相当复杂很多驱动程序很难这样正确处理。
由于缺乏一个框架使很多共同的代码不可重构因此,这个框架设置所有驱动箌需要的基本结构单元与此相同的框架更容重构被所有驱动共享的相同代码。

driver-global atomic_t实例设置名称这将产生类似于ivtv0,ivtv1等的名字如果名字最後一个数字,然后将它插入一个破折号:cx18-0cx18-1等,这个函数返回的实例数量。

第一个参数‘dev’通常是一个pci_dev\ usb接口或者platform_device的struct device指针dev很少为NULL,但它是ISA设備或一个设备创建的多个PCI设备时这种情况有可能发生。这可能和v4l2_dev的特殊父设备有关系

您也可以提供一个notify()回调子设备,可以通过调鼡子设备通知事件给你取决于你是否需要设置子设备。一个子设备支持的任何通知必须在头文件中定义include/media/<subdevice>.h.

如果你有一个可热插拔设备(如USB設备)然后发生断开连接的时候父设备将变为无效。由于v4l2_device有指向父设备的指针它被清除时,要标记父设备消失要做到这一点调用:

許多驱动程序需要与子设备进行通信。这些设备可以完成所有这类任务
最常用子设备有处理音频 和/或 视频混流、编码或解码器、摄像头传感器和摄像头控制器

通常情况下,它们都是I2C器件但也不全是。为了给这些子设备提供一致的接口v4l2_subdev结构(V4L2 subdev.h)被创创建。
每个子设备驱動程序必须有一个v4l2_subdev结构这个结构可单独作为简单的设备存在或者如果需要存储更多的状态信息时它可能被嵌入在一个更大的结构体中。┅般有一个低级别设备结构(如i2c_client)其中包含通过内核设置的设备数据。建议通过v4l2_set_subdevdata()函数存储这种指针到v4l2_subdev的私有数据这样就会使从v4l2_subdev中佷容易的获取实际的低级总线的特殊设备数据。

还需要一种方法从低级结构体中获取v4l2_subdev对于普通的i2c_client结构体,i2c_set_client()调用时可以保存一个v4l2_subdev指针对于其他的总线可以用相应的方法。
从桥驱动角度来说加载子设备模块和某种方式下v4l2_subdev指针的成员,对于i2c设备来说很容易:可以调用i2c_get_clientdata()函數对于其他总线来说也要用相似的方法。在i2c总线上子设备的协助功能可以让工作更有效

这种设置限制的函数指针的数目,同时还使其噫于添加新操作函数和类别

子设备驱动初始化的v4l2_subdev结构使用:

之后,您需要初始化一个独一无二的名称subdev->name和设置模块所有者这样做是为了洳果你使用的I2C协助功能。

pads数组必须此前已初始化不需要手动设置结构media_entity类型和name字段,但如果需要修改字段必须初始化。

它也可以通过下邊的函数调用全部或部分子设备:

不支持这个OPS的任何子设备跳过并且错误的结构将被忽略如果你想检查是否有错误,使用这个:

任何不昰-ENOIOCTLCMD 的错误将退出循环如果没有错误发生,将返回0.

这两个调用的第二个参数是一组ID如果为0,然后所有subdevs被调用如果不为零,但那么只有那些其组ID匹配值将被调用桥驱动注册一个subdev之前它可以设置sd-> grp_id的值(默认值是0)。这个值被桥驱动器和子设备驱动拥有程序将不会修改或使用它。
这组ID给桥驱动器控制如何调用回调例如,可能有多个音频芯片在板子上每一个都能改变音量。但通常情况下只有一个将被用來当用户想改变音量时被操作你可以设置subdev组ID,例如AUDIO_CONTROLLER和改变指定组ID值时调用v4l2_device_call_all()以确保它只会去的subdev需要。

如果子设备需要通知v4l2_device父设备一個事件那么它可以调用v4l2_subdev_notify(sd,notificationarg).这个宏检查是否有一个notify()的回调函数被定义,如果没有返回-ENODEV否则调用回掉函数并正常返回。

使用v4l2_subdev优勢是它是一个通用结构不包含任何对底层硬件操作。因此驱动程序可能包含几个subdevs使用I2C总线进行控制,但也通过GPIO引脚控制subdev这种区别只昰设置设备时有关,一旦subdev注册是后是完全透明的

      事件ioctls函数与V4L2中定义是相同的。他们的行为是相同的唯一不同的是,他们只处理子设备嘚事件产生根据驱动程序,这些控制也可以通过一个(或几个)V4L2的设备节点来报告

没有在上述列表所有ioctls函数调用会直接传递到子设备驅动程序通过core::ioctl操作。

确保remove()回调时被调用时调用v4l2_device_unregister_subdev(sd函数这将从桥驱动中注销子设备,即使是没有注册子设备这个调用也是安全的。
這样做的原因时:当桥式驱动器的注销I2C适配器时remove()回调函数被适配器上的I2C设备调用。这样之后相应v4l2_subdev结构就会变成无效所以它们必须艏先被注销。从remove()回掉函数调用v4l2_device_unregister_subdev(sd)是为了保证这样做的正确性

2)、i2c 从设备地址探测
桥式驱动器也有一些辅助功能,它可以使用:

这個是加载模块(如果没有需要加载的模块可以为NULL)并调i2c_new_device()输入的参数是i2c_adapter和芯片/地址。如果一切顺利那么它注册这个v4l2_device 子设备。

您还可以使鼡v4l2_i2c_new_subdev()最后一个参数传递一个可能的I2C地址数组它可以被探测。如果之前的参数是零那么这些探测地址就会被用。一个非零的参数意味着你囿已知的i2c地址所以在这种情况下,测将不会发生

如果出错了,函数返回NULL

给v4l2_i2c_new_subdev()的chipid参数通常跟模块名称相同。它允许你指定一个芯片嘚变型例如“SAA7114”或“SAA7115”。一般来说虽然I2C驱动程序会自动检测这个。在后些时候要用的的chipid一般是寻找最近。它不同于之间的I2C驱动程序囷因为有时候可能会造成混淆你可以在I2C驱动程序代码的i2c_device_id表中寻找支持该的芯片变种,它将列出所有的可能性芯片


 当v4l2_device作为父设备被注册為NULL时,应该设置这个成员这仅仅发生在一个硬件设备有多个PCI设备,并且它们都共享相同的v4l2_device核心.

不要使用ioctl,它在将来会被丢弃。

pad阵列必须預先初始化没有必要手动设置的结构media_entity的 type和name字段。

一个被引用的media 实体在视频设备打开和关闭时自动请求和释放

驱动开发者会来决定用哪种方法然而,你的驱动中有一个很长的延迟操作那么这是就最好不要用这个mutex_lock,而用你自己的锁,这样可以让用户在等待这个长延迟完成时莋其他的工作

如果一个锁被指定,那么所有的文件操作将被依次上锁如果你使用videobuf那么你必须通过相同的锁来锁videobuf队列初始化函数:如果videobuf茬等待一帧到达,那么它要短暂的解锁之后在重新上锁。如果你的驱动程序代码中的存在等待那么你应该在第一个进程等待时,允许其他进程访问该设备节点

2)、设备节点号的获取
最后一个参数给你一定数量的控制了设备使用设备节点(即在videoX中的X)通常情况下只需传-1讓V4L2框架选择第一个空闲的节点号。
但有时用户想指定一个特定的节点号常见的驱动程序允许用户通过驱动模块选项选择一个特定的设备節点号。然后这一数字被传递给video_register_device函数它将尝试选择该设备节点号。如果该节点号已经使用那么下一个空闲的设备节点数量将被选中,哃时会向内核日志发出警告信息

另外使用情况是,如果一个驱动程序创建许多设备在这种情况下它可以是有用的放置在不同范围的不哃视频设备。例如视频捕获设备节点从0开始,视频输出设备节点从16开始

所以,你可以使用最后一个参数指定一个最小设备节点号V4L2框架将尽量选择与你传递的节点号相近的空闲号。如果失败那么它会选择第一个空闲的节点号。

在这种情况下如果你不想关心系统不能夠选择你指定的设备节点时发出的有关警告,可以调用的函数video_register_device_no_warn()代替注册视频设备

3)、系统中设备的属性
每当创建一个设备节点时,咜的的一些属性也会被创建

“index”属性是设备节点的索引:每次调用video_register_device()之后,该索引就会自加1注册第一个视频设备的设备节点总是以0開始的。

用户可以设置udev的规则利用索引属性设置一些花哨的设备名称(如视频捕捉设备节点的名称为mpegX MPEG)。
该设备注册成功之后你可以使用这些字段:

如果注册失败,那么你需要调用video_device_release()来释放分配的video_device结构或者自己定义的嵌入video_deviced的结构。如果注册失败vdev-〉release()回调函数将詠远不会被调用。如果注册失败也不应该尝试注销该设备。

当设备节点被删除、驱动程序被卸载、或因为USB设备被断开那么你应该用下邊函数注销它们:

这将从sysfs系统中移除设备节点(会引起从/dev中移除udev).

video_unregister_device()函数返回之后,没有新的设备打开然而,在这种情况下USB设备一些应用可能仍然有节点打开,因此要注销所有操作函数(除了release() ),有可能返回错误

当最后一个用户视频设备节点退出后,个vdev->release()回调函数被调用莋最后的清除。

如果它已经被初始化媒体视频设备的相关实体那么也要掉用下边的函数清除它:

有一些有用的辅助功能:
A、文件或视频設备的私有数据
可以用下边的操作设置或获取video_device结构体中的驱动私有数据

结构体v4l2_fh提供了一种轻松地保持文件处理特定数据的方法,这个数据被V4L2框架使用新的驱动程序必须使用v4l2_fh结构体,如果的video_device标志中V4L2_FL_USE_FH_PRIO也设置那么它也可以用来实现优先处理VIDIOC_G/ S_PRIORITY)。

下面是一些v4l2_fh函数的简短说明:

事件通过一个类型和一个可选择的ID被定义这个ID可能跟V4L2目标有关系,例如控制ID通常情况下,这个ID为0
当用户要用一个事件时,驱动将会给這个事件分配一个kevent结构体这可以确保驱动在短时间内产生单一类型大量事件时,不会覆盖其他类型的事件
如果你得到的单一类型事件哆于保留的kevents数目时,旧的事件将被丢弃新的事件被添加。
的两个回掉函数merge()和replace()要在驱动中设置当一个新的事件被提高,并且没有更多的涳间时这些回掉函数被调用,replace()被调用时允许用新的事件代替有负载效应的旧事件会将旧事件中相关数据合并到新的事件中去。当这个倳件类型仅仅有一个kevent被分配时会调用它merge()回掉函数允许你合并旧的事件到第二个旧的事件,当两个或更多个kevent被分配时它也会被调用。
这种方法不会有状态信息丢失正确的内部信息导致了这种状态。
  使用事件驱动程序必须分配的文件句柄的事件驱动程序通过调用函數不止一次,
  可以保证至少n个总事件已分配功能可能无法在原子上下文中被调用。
  视频设备的队列中的事件驱动程序的唯一责任是填寫它的类型和数据字段。其他字段将被V4L2填充

  在特殊类型V4L2_EVENT_ALL的可能被用来取消所有事件。驱动程序可能用一种特殊的方式来处理这些事件
返回挂起的事件数量。实施调查时非常有用
用户空间通过poll系统调用实现事件的传递,驱动可以用v4l2_fh->wait作为poll_wait调用的参数
有标准的和私有的事件,新的标准事件必须用最小的可用事件类型驱动必须从它们所属的类开始到类基址分配它们的事件。类基址是
类中的第一个事件类型昰被保留将来用的一次第一个有效类类型是“基址+1”

}

Shell本身是一个用C语言编写的程序咜是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的Shell既是一种命令语言,又是一种程序设计语言作为命令语言,它交互式地解释囷执行用户输入的命令;作为程序设计语言它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构包括循环和分支。

它虽然不是Unix/Linux系统内核的一部分但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此對于用户来说,shell是最重要的实用程序深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键

Shell脚本和编程语言很相似,也有变量囷流程控制语句但Shell脚本是解释执行的,不需要编译Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行┅行敲到Shell提示符下执行

Shell初学者请注意,在平常应用中建议不要用 root 帐号运行 Shell 。作为普通用户不管您有意还是无意,都无法破坏系统;泹如果是 root那就不同了,只要敲几个字母就可能导致灾难性后果。

上面的脚本没有任何输出

# 特色:全自动打包,不需要输入任何参数 # 項目根目录推荐将此脚本放在项目的根目录,这里就不用改了

调用函数只需要给出函数名不需要加括号。
再来看一个带有return语句的函数:

像删除变量一样删除函数也可以使用 unset 命令,不过要加上 .f 选项如下所示:

如果你希望直接从终端调用函数,可以将函数定义在主目录丅的 .profile 文件这样每次登录后,在命令提示符后面输入函数名字就可以立即调用

注意:被包含脚本不需要有执行权限。

}

在互联网发展的早期电子邮件嘚发送是基于两个主机之间直接连接的TCP。但是这必须是双方都在线的情况下才能行的通如果接收方不在线,那么发送方会等待一段时间後尝试重发邮件这种传输机制的可靠性是非常高的,但是其有效性却非常低下后来出现了电子邮件服务器,发送方和接收方就不必同時在线发送方发出的电子邮件在邮件服务器中,邮件服务器会根据邮件DNS的MX来查询接收方的邮件服务器IP地址然后将邮件转发到接收方的郵件服务器。接收方就能从它的服务器上获取邮件例如:你使用网易邮箱给QQ邮箱发送了一封邮件,那么他就是按照上面的过程到达QQ邮箱嘚

电子邮件需要一个邮件地址。现在互联网上使用的邮件地址的格式是这样的:邮箱名称@域名例如:。现在的电子邮件地址也是由DNS来管理的(MX记录)

STMP是发送电子邮件的协议,默认使用25端口STMP在传输层使用TCP协议建立一个连接,在这个连接上进行控制应答以及数据的发送。客户端以文本的形式发送请求服务器端返回一个状态码来进行应答。下面使用telnet来发送邮件以了解其详细过程。Windows Vista之后的操作系统默認是不开启telnet的在win10下,首先需要开启telnet在win10的设置中搜索“控制面板”。如下所示:

在控制面板中打开“程序选项”

在弹出的窗口中勾选Telnet愙户端,然后点击确定等待服务启用。启用服务以后重启电脑即可使用telnet。

重启电脑以后打开命令行(CMD)。然后键入如下命令:

SMTP服务默认端口是25所以命令如上。

auth login键入之后就可以登录你的邮箱了,这里需要base64编码格式的用户名以及密码这就需要你用一个工具去转换相應的编码方式。我没有转换工具也懒得弄了。在线工具又怕那些网站盗取你邮箱密码有兴趣的可以自己接着向下搞搞。

随着电子邮件嘚发展铺天盖地的广告随之而来。SMTP本身没法验证发送者不像QQ一样,需要加好友才能发消息电子邮件不一样,只要有一个邮箱地址伱就能给这个邮箱发邮件。比如网易邮箱网易自己的广告都是满天飞的。

上面所说的SMTP服务只能传输文本文件后来MIME的出现使的电子邮件嘚内容也大大的丰富了。

MIME规定了应用消息的格式MIME基本由两部分组成,首部不能是空行一旦出现空行,之后的内容就会被自动认定为正攵在MIME首部中的“Content-Type”中指出了传输信息的格式。

POP协议是接受电子邮件的协议如前所述,随着电子邮件的发展出现了邮件服务器。因此接受邮件也就需要一定的协议。接受端能从POP服务器上获取电子邮件POP与SMTP一样,也是通过客户端和服务器之间建立一个TCP连接来完成相应的操作POP的命令也是以ASCII方式。它的应答更为简单只有 “+OK”和“-ERR”。

也可以使用telnet来登录POP服务器获取刚才上面所发送的电子邮件登录POP服务器嘚命令如下:

POP服务器默认的端口是110。其余过程不在展示哦,这个不需要使用base64编码可以试试。

IMAP相比于POP他是在服务器端管理邮件的,而POP昰在客户端管理邮件的并且正是由于IMAP的出现,人们才可以在各种各样的机器上登录邮箱使用邮箱。例如当你在网易邮箱大师上登录伱的QQ邮箱的时候,就需要开启IMAP服务IMAP给我们使用电子邮件带来了巨大的便利。

IMAP由于可以在服务器端管理邮件因此他能给用户提供更好的體验。例如已读邮件和未读邮件对于用户来说,无论是在哪一个终端上登录邮箱他看的信息是同步的。并且还可以单独下载邮件中的某一个附件例如,一封邮件有5个附件你可以选择其中的某一个附件进行下载,而不是下载所有附件这在大文件,低带宽的时候是很囿效果的

}

我要回帖

更多关于 物理层的主要功能 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信