linux系统下第二快scsi接口硬盘的第三个逻辑分区应如何表示

linux系统下第二快scsi接口硬盘的第三个逻辑分区应如何表示,第1张

是sdb7。第一个硬盘是sba;第二个硬盘是sdb;在一个硬盘中有4个主分区和一个扩展分区,而逻辑分区又在扩展分区中,所以前sdb1到4是主分区,剩下的是扩展分区里的逻辑分区。

硬盘的接口主要有IDE、SATA、SCSI 、SAS和光纤通道等五种类型。其中IDE和SATA接口硬盘多用于家用产品中,也有部分应用于服务器,SATA是一种新生的硬盘接口类型,已经取代了大部分IDE接口应用。SCSI 、SAS主要应用于服务器上,普通家用设备一般不支持SCSI和SAS接口。

特点

服务器使用的硬盘转速快,可以达到每分钟7200或10000转,甚至更高;它还配置了较大(一般为2MB或4MB)的回写式缓存;平均访问时间比较短;外部传输率和内部传输率更高,采用UltraWideSCSI、Ultra2WideSCSI、Ultra160SCSI、Ultra320SCSI等标准的SCSI硬盘,每秒的数据传输率分别可以达到40MB、80MB、160MB、320MB。

以上内容参考:百度百科-scsi硬盘

1.video4linux基础相关

1.1 v4l的介绍与一些基础知识的介绍

I.首先说明一下video4linux(v4l)。

它是一些视频系统,视频软件,音频软件的基础,经常使用在需要采集图像的场合,如视频监控,webcam,可视电话,经常应用在embedded linux中是linux嵌入式开发中经常使用的系统接口。它是linux内核提供给用户空间的编程接口,各种的视频和音频设备开发相应的驱动程序后,就可以通过v4l提供的系统API来控制视频和音频设备,也就是说v4l分为两层,底层为音视频设备在内核中的驱动,上层为系统提供的API,而对于我们来说需要的就是使用这些系统的API。

II.Linux系统中的文件 *** 作

有关Linux系统中的文件 *** 作不属于本文的内容。但是还是要了解相关系统调用的作用和使用方法。其中包括open(),read(),close(),ioctl(),mmap()。详细的使用不作说明。在Linux系统中各种设备(当然包括视频设备)也都是用文件的形式来使用的。他们存在与dev目录下,所以本质上说,在Linux中各种外设的使用(如果它们已经正确的被驱动),与文件 *** 作本质上是没有什么区别的。

1.2 建立一套简单的v4l函数

这一节将一边介绍v4l的使用方法,一边建立一套简单的函数,应该说是一套很基本的函数,它完成很基本的够能但足够展示如何使用v4l。这些函数可以用来被其他程序使用,封装基本的v4l功能。本文只介绍一些和摄像头相关的编程方法,并且是最基础和最简单的,所以一些内容并没有介绍,一些与其他视频设备(如视频采集卡)和音频设备有关的内容也没有介绍,本人也不是很理解这方面的内容。

这里先给出接下来将要开发出来函数的一个总览。

相关结构体和函数的定义我们就放到一个名为v4l.h的文件中,相关函数的编写就放在一个名为v4l.c的文件中把。

对于这个函数库共有如下的定义(也就是大体v4l.h中的内容):

#ifndef _V4L_H_

#define _V4L_H_

#include <sys/types.h>

#include <linux/videodev.h>//使用v4l必须包含的头文件

这个头文件可以在/usr/include/linux下找到,里面包含了对v4l各种结构的定义,以及各种ioctl的使用方法,所以在下文中有关v4l的相关结构体并不做详细的介绍,可以参看此文件就会得到你想要的内容。

下面是定义的结构体,和相关函数,突然给出这么多的代码很唐突,不过随着一点点解释条理就会很清晰了。

struct _v4l_struct

{

int fd//保存打开视频文件的设备描述符

struct video_capability capability//该结构及下面的结构为v4l所定义可在上述头文件中找到

struct video_picture picture

struct video_mmap mmap

struct video_mbuf mbuf

unsigned char *map//用于指向图像数据的指针

int frame_current

int frame_using[VIDEO_MAXFRAME]//这两个变量用于双缓冲在后面介绍。

}

typedef struct _v4l_struct v4l_device

//上面的定义的结构体,有的文中章有定义channel的变量,但对于摄像头来说设置这个变量意义不大通常只有一个channel,本文不是为了写出一个大而全且成熟的函数库,只是为了介绍如何使用v4l,再加上本人水平也有限,能够给读者一个路线我就很知足了,所以并没有设置这个变量同时与channel相关的函数也没有给出。

extern int v4l_open(char *, v4l_device *)

extern int v4l_close(v4l_device *)

extern int v4l_get_capability(v4l_device *)

extern int v4l_get_picture(v4l_device *)

extern int v4l_get_mbuf(v4l_device *)

extern int v4l_set_picture(v4l_device *, int, int, int, int, int,)

extern int v4l_grab_picture(v4l_device *, unsigned int)

extern int v4l_mmap_init(v4l_device *)

extern int v4l_grab_init(v4l_device *, int, int)

extern int v4l_grab_frame(v4l_device *, int)

extern int v4l_grab_sync(v4l_device *)

上述函数会在下文中逐渐完成,功能也会逐渐介绍,虽然现在看起来没什么感觉只能从函数名上依稀体会它的功能,或许看起来很烦,不过看完下文就会好了。

前面已经说过使用v4l视频编程的流程和对文件 *** 作并没有什么本质的不同,大概的流程如下:

1.打开视频设备(通常是/dev/video0)

2.获得设备信息。

3.根据需要更改设备的相关设置。

4.获得采集到的图像数据(在这里v4l提供了两种方式,直接通过打开的设备读取数据,使用mmap内存映射的方式获取数据)。

5.对采集到的数据进行 *** 作(如显示到屏幕,图像处理,存储成图片文件)。

6.关闭视频设备。

知道了流程之后,我们就需要根据流程完成相应的函数。

那么我们首先完成第1步打开视频设备,需要完成int v4l_open(char *, v4l_device *)

具体的函数如下

#define DEFAULT_DEVICE “/dev/video0”

int v4l_open(char *dev , v4l_device *vd)

{

if(!dev)dev= DEFAULT_DEVICE

if((vd-fd=open(dev,O_RDWR))<0){perror(“v4l_open:”)return -1}

if(v4l_get_capability(vd))return -1

if(v4l_get_picture(vd))return -1//这两个函数就是即将要完成的获取设备信息的函数

return 0

}

同样对于第6步也十分简单,就是int v4l_close(v4l_device *)的作用。

函数如下:

int v4l_close(v4l_device *vd)

{close(vd->fd)return 0}

现在我们完成第2步中获得设备信息的任务,下面先给出函数在对函数作出相应的说明。

int v4l_get_capability(v4l_device *vd)

{

if (ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)) <0) {

perror("v4l_get_capability:")

return -1

}

return 0

}

int v4l_get_picture(v4l_device *vd)

{

if (ioctl(vd->fd, VIDIOCGPICT, &(vd->picture)) <0) {

perror("v4l_get_picture:")

return -1

}

return 0

}

对于以上两个函数我们不熟悉的地方可有vd->capability和vd->picture两个结构体,和这两个函数中最主要的语句ioctl。对于ioctl的行为它是由驱动程序提供和定义的,在这里当然是由v4l所定义的,其中宏VIDIOCGCAP和VIDIOCGPICT的分别表示获得视频设备的capability和picture。对于其他的宏功能定义可以在你的Linux系统中的/usr/include/linux/videodev.h中找到,这个头文件也包含了capability和picture的定义。例如:

struct video_capability

{

char name[32]

int type

int channels

int audios

int maxwidth

int maxheight

int minwidth

int minheight

}capability结构它包括了视频设备的名称,频道数,音频设备数,支持的最大最小宽度和高度等信息。

struct video_picture

{

__u16 brightness

__u16 hue

__u16 colour

__u16 contrast

__u16 whiteness

__u16 depth

__u16 palette

}picture结构包括了亮度,对比度,色深,调色板等等信息。头文件里还列出了palette相关的值,这里并没有给出。

了解了以上也就了解了这两个简单函数的作用,现在我们已经获取到了相关视频设备的capabilty和picture属性。

这里直接给出另外一个函数

int v4l_get_mbuf(v4l_device *vd)

{

if (ioctl(vd->fd, VIDIOCGMBUF ,&(vd->mbuf)) <0) {

perror("v4l_get_mbuf:")

return -1

}

return 0

}

int v4l_get_mbuf(v4l_device *vd)

{

if (ioctl(vd->fd, VIDIOCGMBUF ,&(vd->mbuf)) <0) {

perror("v4l_get_mbuf:")

return -1

}

return 0

}

对于结构体video_mbuf在v4l中的定义如下,video_mbuf结构体是为了服务使用mmap内存映射来获取图像的方法而设置的结构体,通过这个结构体可以获得摄像头设备存储图像的内存大小。具体的定义如下,各变量的使用也会在下文详细说明。

struct video_mbuf

{

int size 可映射的摄像头内存大小

int frames 摄像头可同时存储的帧数

int offsets[VIDEO_MAX_FRAME]每一帧图像的偏移量

}

下面完成第3步按照需要更改设备的相应设置,事实上可以更改的设置很多,本文以更改picture属性为例说明更改属性的一般方法。

那么我们就完成extern int v4l_set_picture(v4l_device *, int, int, int, int, int,)这个函数吧

int v4l_set_picture(v4l_device *vd,int br,int hue,int col,int cont,int white)

{

if(br) vd->picture.brightnesss=br

if(hue) vd->picture.hue=hue

if(col) vd->picture.color=col

if(cont) vd->picture.contrast=cont

if(white) vd->picture.whiteness=white

if(ioctl(vd->fd,VIDIOCSPICT,&(vd->picture))<0)

{perror("v4l_set_picture: ")return -1}

return 0

}

int v4l_get_mbuf(v4l_device *vd)

{

if (ioctl(vd->fd, VIDIOCGMBUF ,&(vd->mbuf)) <0) {

perror("v4l_get_mbuf:")

return -1

}

return 0

}

对于结构体video_mbuf在v4l中的定义如下,video_mbuf结构体是为了服务使用mmap内存映射来获取图像的方法而设置的结构体,通过这个结构体可以获得摄像头设备存储图像的内存大小。具体的定义如下,各变量的使用也会在下文详细说明。

struct video_mbuf

{

int size 可映射的摄像头内存大小

int frames 摄像头可同时存储的帧数

int offsets[VIDEO_MAX_FRAME]每一帧图像的偏移量

}

下面完成第3步按照需要更改设备的相应设置,事实上可以更改的设置很多,本文以更改picture属性为例说明更改属性的一般方法。

那么我们就完成extern int v4l_set_picture(v4l_device *, int, int, int, int, int,)这个函数吧

int v4l_set_picture(v4l_device *vd,int br,int hue,int col,int cont,int white)

{

if(br) vd->picture.brightnesss=br

if(hue) vd->picture.hue=hue

if(col) vd->picture.color=col

if(cont) vd->picture.contrast=cont

if(white) vd->picture.whiteness=white

if(ioctl(vd->fd,VIDIOCSPICT,&(vd->picture))<0)

{perror("v4l_set_picture: ")return -1}

return 0

}

上述函数就是更改picture相关属性的例子,其核心还是v4l给我们提供的ioctl的相关调用,通过这个函数可以修改如亮度,对比度等相关的值。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7281001.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存