summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/man/man4/Makefile1
-rw-r--r--share/man/man4/aha.416
-rw-r--r--share/man/man4/meteor.4874
3 files changed, 886 insertions, 5 deletions
diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile
index 1264592..4187315 100644
--- a/share/man/man4/Makefile
+++ b/share/man/man4/Makefile
@@ -130,6 +130,7 @@ MAN= aac.4 \
maestro3.4 \
md.4 \
mem.4 \
+ meteor.4 \
miibus.4 \
mlx.4 \
mly.4 \
diff --git a/share/man/man4/aha.4 b/share/man/man4/aha.4
index 1f86c03..0371e1f 100644
--- a/share/man/man4/aha.4
+++ b/share/man/man4/aha.4
@@ -42,7 +42,7 @@ In
.Sh DESCRIPTION
This driver provides access to the
.Tn SCSI
-bus connected to an Adaptec AHA-154xA, AHA-154xB, AHA-154xC,
+bus connected to an Adaptec AHA-154xB, AHA-154xC,
AHA-154xCF, AHA-154xCP, or AHA-1640 host adapter.
x is 0 for controllers without a floppy drive and 2 for controllers
that have them.
@@ -67,15 +67,21 @@ The possible
port addresses for this card are 0x330, 0x334, 0x230, 0x234, 0x130, and
0x134.
.Pp
+The AHA-1640 is a MCA bus card.
+Since the MCA bus is a self-identifying bus, no setting of hints is
+required.
+.Sh BUGS
+The AHA-154xA card does not support residuals on data transfers.
+As a result, this card is no longer supported.
+.Pp
+There have been some reports that the AHA-154xB does not work well
+under heavy load.
+.Pp
The AHA-154xCP is a plug and play controller.
However, its resources are set using the on-board BIOS and cannot be
moved.
Failures to attached for this card are often caused when the resources
set in the BIOS conflict
-.Pp
-The AHA-1640 is a MCA bus card.
-Since the MCA bus is a self-identifying bus, no setting of hints is
-required.
.Sh SEE ALSO
.Xr ahb 4 ,
.Xr ahc 4 ,
diff --git a/share/man/man4/meteor.4 b/share/man/man4/meteor.4
new file mode 100644
index 0000000..49ee517
--- /dev/null
+++ b/share/man/man4/meteor.4
@@ -0,0 +1,874 @@
+.\"
+.\" $FreeBSD$
+.\"
+.Dd August 15, 1995
+.Dt METEOR 4 i386
+.Os
+.Sh NAME
+.Nm meteor
+.Nd "video capture driver interface"
+.Sh DESCRIPTION
+The
+.Nm
+driver defined a video capture interface.
+The
+.Nm
+driver is no longer in the tree, but other devices support this interface
+so the interface portion is documented here.
+.Ss Meteor Capture Modes
+The
+.Nm
+capture driver has three modes of capture operation.
+.Bl -enum
+.It
+Conventional
+.Xr read 2
+interface.
+.Pp
+This mode is the easiest and slowest to use.
+This mode is great for
+capturing a single field at little programming cost.
+.Pp
+In this mode, the user opens the device, sets the capture mode
+and size (see:
+.Dv METEORSETGEO
+.Xr ioctl 2
+call), and uses the
+.Xr read 2
+system
+call to load the data into a buffer.
+.Pp
+.Pa meteor_read.c ;
+read 400x300 RGB24 into a viewable PPM file
+.Bd -literal
+#include <sys/fcntl.h>
+#include <machine/ioctl_meteor.h>
+
+extern int errno;
+#define ROWS 300
+#define COLS 400
+#define SIZE (ROWS * COLS * 4)
+main()
+{
+ struct meteor_geomet geo;
+ char buf[SIZE],b[4],header[16],*p;
+ int i,o,c;
+
+ if ((i = open("/dev/meteor0", O_RDONLY)) < 0) {
+ printf("open failed: %d\\n", errno);
+ exit(1);
+ }
+ /* set up the capture type and size */
+ geo.rows = ROWS;
+ geo.columns = COLS;
+ geo.frames = 1;
+ geo.oformat = METEOR_GEO_RGB24 ;
+
+ if (ioctl(i, METEORSETGEO, &geo) < 0) {
+ printf("ioctl failed: %d\\n", errno);
+ exit(1);
+ }
+
+ c = METEOR_FMT_NTSC;
+
+ if (ioctl(i, METEORSFMT, &c) < 0) {
+ printf("ioctl failed: %d\\n", errno);
+ exit(1);
+ }
+
+ c = METEOR_INPUT_DEV0;
+
+ if (ioctl(i, METEORSINPUT, &c) < 0) {
+ printf("ioctl failed: %d\\n", errno);
+ exit(1);
+ }
+
+ if ((c=read(i, &buf[0], SIZE)) < SIZE) {
+ printf("read failed %d %d %d\\n", c, i, errno);
+ close(i);
+ exit(1);
+ }
+ close(i);
+
+ if ((o = open("rgb24.ppm", O_WRONLY | O_CREAT, 0644)) < 0) {
+ printf("ppm open failed: %d\\n", errno);
+ exit(1);
+ }
+
+ /* make PPM header and save to file */
+ strcpy(&header[0], "P6 400 300 255 ");
+ header[2] = header[6] = header[10] = header[14] = '\\n';
+ write (o, &header[0], 15);
+ /* save the RGB data to PPM file */
+ for (p = &buf[0]; p < &buf[SIZE]; ) {
+ b[2] = *p++; /* blue */
+ b[1] = *p++; /* green */
+ b[0] = *p++; /* red */
+ *p++; /* NULL byte */
+ write(o,&b[0], 3); /* not very efficient */
+ }
+ close(o);
+ exit(0);
+}
+.Ed
+.It
+Memory mapped single capture or unsynchronized continuous capture.
+.Pp
+The single capture mode is designed for conferencing tools such as
+.Nm nv .
+These tools need to control the starting of the image capture and also
+need several frames a second.
+The continuous capture mode is designed
+for applications that want free-running data.
+.Pp
+In this mode, the user opens the device, sets the capture mode
+and size (see:
+.Dv METEORSETGEO
+.Xr ioctl 2
+call),
+.Xr mmap 2 Ns s
+the frame buffer
+memory into the user process space, and issues either the
+single-capture or the continuous capture call (see:
+.Dv METEORCAPTUR
+.Xr ioctl 2
+call) to load the data into the memory mapped buffer.
+.Pp
+As explained in the
+.Dv METEORCAPTUR
+.Xr ioctl 2
+call, the single frame capture
+.Xr ioctl 2
+will block until the capture is complete, the continuous capture
+will return immediately.
+.Pp
+.Pa meteor_mmap_single_continuous.c
+.Bd -literal
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/fcntl.h>
+#include <machine/ioctl_meteor.h>
+
+extern int errno;
+#define ROWS 480
+#define COLS 640
+#define SIZE (ROWS * COLS * 2)
+main()
+{
+ struct meteor_geomet geo;
+ char buf[SIZE];
+ char *mmbuf;
+ int i,c;
+
+ if ((i = open("/dev/meteor0", O_RDONLY)) < 0) {
+ printf("open failed\\n");
+ exit(1);
+ }
+
+ geo.rows = ROWS;
+ geo.columns = COLS;
+ geo.frames = 1;
+ geo.oformat = METEOR_GEO_RGB16 ;
+
+ if (ioctl(i, METEORSETGEO, &geo) < 0) {
+ printf("ioctl failed: %d\\n", errno);
+ exit(1);
+ }
+
+ c = METEOR_FMT_NTSC;
+
+ if (ioctl(i, METEORSFMT, &c) < 0) {
+ printf("ioctl failed: %d\\n", errno);
+ exit(1);
+ }
+
+ c = METEOR_INPUT_DEV0;
+
+ if (ioctl(i, METEORSINPUT, &c) < 0) {
+ printf("ioctl failed: %d\\n", errno);
+ exit(1);
+ }
+
+ mmbuf=(char *)mmap((caddr_t)0, SIZE, PROT_READ,
+ MAP_SHARED, i, (off_t)0);
+
+#ifdef SINGLE_MODE
+ /* single frame capture */
+ c = METEOR_CAP_SINGLE ;
+ ioctl(i, METEORCAPTUR, &c); /* wait for the frame */
+
+ /* directly access the frame buffer array data in mmbuf */
+#else
+ /* continuous frame capture */
+ c = METEOR_CAP_CONTINOUS ;
+ ioctl(i, METEORCAPTUR, &c); /* returns immediately */
+
+ /* directly access the frame buffer array data in mmbuf */
+
+ c = METEOR_CAP_STOP_CONT ;
+ ioctl(i, METEORCAPTUR, &c); /* close will also stop capture */
+#endif
+
+ close(i);
+ exit(0);
+}
+.Ed
+.It
+Memory mapped, multi-frame ring buffer synchronize capture.
+.Pp
+This continuous capture mode is synchronized with the application that
+processes up to 32 frames.
+This gives the advantages of both single and
+continuous capture modes.
+.Pp
+The kernel notifies the application of a new data by raising an
+application defined signal.
+The driver also shares a structure with
+the application that allows them to communicate which frame has been
+written by the kernel and which frame has been read by the application.
+.Pp
+The shared structure starts on the first page after your data.
+The
+structure address can be found by calculation:
+.Pp
+.Dl "(number_rows * number_columns * pixel_depth + 4095) & 0xfffff000"
+or
+.Dl "((number_rows * number_columns * pixel_depth + 4095)/4096) * 4096"
+.Pp
+The shared structure is of type
+.Va struct meteor_mem .
+The two most
+important fields are called
+.Va active
+and
+.Va num_active_buf .
+.Va active
+is a bitmap of frames written by the kernel.
+.Va num_active_bufs
+is
+a count of frames marked in the
+.Va active
+field.
+When a frame is read
+in by the driver, the
+.Va num_active_bufs
+count is tested, if this
+count is below the threshold of number of active frames (value
+in
+.Va meteor_mem Ns 's
+.Va hiwat
+variable), the bit representing frame
+number in the buffer is stored in the
+.Va active
+variable, the
+.Va num_active_bufs
+is incremented, the kernel then raises the specified
+signal to activate the user application.
+The user application's
+responsibility when getting the signal is to check the active bitmap
+to determine the lowest active frame, use the data as the application
+desires, clear the bitmap entry for that frame, and decrement the
+.Va num_active_bufs .
+If the threshold of number of active frames
+.Pq Va hiwat
+has been exceeded, no new frames or signal from the kernel will occur
+until the
+.Va num_active_bufs
+is less than or equal to
+.Va lowat .
+.Pp
+The driver loads the frames in a round-robin fashion.
+It is expected
+that the user removes them in the same order.
+The driver does not
+check to see if the frame is already active.
+.Pp
+The
+.Va frame_size
+and number of frames in the buffer are also provided
+to the
+.Va meteor_mem
+structure, but changing these fields in the
+application will not change the operation of the driver.
+.Pp
+In programming for this mode, the user opens the device, sets the
+geometry,
+.Xr mmap 2 Ns s
+the data/common control structure, then starts the
+continuous capture mode.
+A special signal catcher is required to
+process the frames as they are read by the kernel.
+.Pp
+When specifying the geometry (see:
+.Dv METEORSETGEO
+.Xr ioctl 2
+call),
+it
+is important that the number of frames is set greater than 1.
+.Pp
+.Pa skeleton_capture_n.c
+.Bd -literal
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/fcntl.h>
+#include <sys/signal.h>
+#include <machine/ioctl_meteor.h>
+
+int video; /* made global if you wish to stop capture in signal handler */
+caddr_t data_frames;
+struct meteor_mem *common_mem;
+extern int errno;
+
+#define FRAME_MAX
+
+void
+usr2_catcher()
+{
+#ifdef SIGNAL_STOP
+ struct meteor_capframe capframe; /* for ioctl */
+#endif
+ char *frame;
+
+ /* find frame */
+ frame = (char *) (data_frames + sig_cnt * common_mem->frame_size) ;
+
+ /* add frame processing here */
+ /* deactivate frame */
+ common_mem->active &= ~(1 << (sig_cnt % 16));
+ common_mem->num_active_bufs--;
+
+ /* process next frame on next interrupt */
+ sig_cnt = ((sig_cnt+1) % FRAME_MAX);
+
+#ifdef SIGNAL_STOP
+ if (some_condition_requiring_stopping) {
+ capframe.command=METEOR_CAP_STOP_FRAMES;
+
+ if (ioctl(i, METEORCAPFRM, &capframe) < 0) {
+ printf("METEORCAPFRM failed %d\\n", errno);
+ exit(1);
+ }
+ }
+#endif
+}
+
+main()
+{
+ struct meteor_geomet geo;
+ int height, width, depth, frames, size;
+ struct meteor_capframe capframe;
+
+ if ((i = open("/dev/meteor0", O_RDONLY)) < 0) {
+ printf("open failed\\n");
+ exit(1);
+ }
+ printf("test %d %d\\n", errno, i);
+
+ height = geo.rows = 120;
+ width= geo.columns = 320;
+ frames = geo.frames = FRAME_MAX;
+ depth = 2; /* 2 bytes per pixel for RGB*/
+
+
+ geo.oformat = METEOR_GEO_RGB16;
+
+ if (ioctl(i, METEORSETGEO, &geo) < 0) {
+ printf("METEORSETGEO failed %d\\n", errno);
+ exit(1);
+ }
+
+ c = METEOR_FMT_NTSC;
+
+ if (ioctl(i, METEORSFMT, &c) < 0) {
+ printf("ioctl failed: %d\\n", errno);
+ exit(1);
+ }
+
+ c = METEOR_INPUT_DEV0;
+
+ if (ioctl(i, METEORSINPUT, &c) < 0) {
+ printf("ioctl failed: %d\\n", errno);
+ exit(1);
+ }
+
+ size = ((width*height*depth*frames+4095)/4096)*4096;
+ /* add one page after data for meteor_mem */
+ data_frames = mmap((caddr_t)0, size + 4096, PROT_READ | PROT_WRITE,
+ MAP_SHARED, i, (off_t)0);
+
+ if (data_frames == (caddr_t) MAP_FAILED) return (0);
+
+ /* common_mem is located at page following data */
+ common_mem = (struct meteor_mem *) (y + size);
+
+ signal(SIGUSR2, usr2_catcher); /* catch new frame message */
+
+ capframe.command=METEOR_CAP_N_FRAMES;
+ capframe.signal=SIGUSR2;
+ capframe.lowat=12; /* must be < hiwat */
+ capframe.hiwat=14; /* must be < FRAME_MAX */
+
+ /* start the sync capture */
+ if (ioctl(i, METEORCAPFRM, &capframe) < 0) {
+ printf("METEORCAPFRM failed %d\\n", errno);
+ exit(1);
+ }
+
+ /* this is the background working area, or you can sleep */
+
+
+ /* to stop capture */
+ capframe.command=METEOR_CAP_STOP_FRAMES;
+
+ if (ioctl(i, METEORCAPFRM, &capframe) < 0) {
+ printf("METEORCAPFRM failed %d\\n", errno);
+ exit(1);
+ }
+}
+.Ed
+.El
+.Ss Meteor IOCTL Call and Parameters
+The
+.Nm
+capture driver has
+.Xr ioctl 2
+requests for capturing, reading card
+status, for setting and reading the geometry, and for setting and reading the
+attributes.
+.Pp
+.Bf -symbolic
+IT IS VERY IMPORTANT TO CHECK FOR ERRORS ON THESE RETURNING IOCTLs.
+.Ef
+Errors indicate that something is very wrong with the
+.Xr ioctl 2
+and the
+application should not attempt to proceed further with capturing.
+The
+.Nm
+capture driver still makes attempts to stop the next capture step if
+an error occurred in a previous step but was ignored by the application
+programmer.
+.Bl -enum
+.It
+.Xr ioctl 2
+requests
+.Dv METEORSETGEO
+and
+.Dv METEORGETGEO
+.Pp
+.Dv METEORSETGEO
+and
+.Dv METEORGETGEO
+are used to set and read the input
+size, input device, and output format for frame capture.
+.Pp
+These
+.Xr ioctl 2
+routines use the
+.Va meteor_geomet
+structure that has the
+following entries:
+.Pp
+.Bl -tag -width columns
+.It Va rows
+number of rows (lines high) in output image
+.It Va columns
+number of pixels in a row (width) in output image
+.It Va frames
+number of frames in buffer.
+Should be 1, unless using
+the multi-framed synchronous capture mode
+.Pq Dv METEORCAPFRM
+which REQUIRES frames to be larger than 1.
+.Pp
+Note: if
+.Va rows , columns
+or
+.Va frames
+is not changed, then
+the existing values are used.
+The system defaults
+is 640x480x1.
+.It Va oformat
+you may choose one of the following output format:
+.Bl -tag -width METEOR_GEO_YUV_PACKED
+.It Dv METEOR_GEO_RGB16
+(RGB 16 bits xrrrrrgg gggbbbbb default)
+.It Dv METEOR_GEO_RGB24
+(RGB 24 bits packed in 32 bits:
+00000000 rrrrrrrr gggggggg bbbbbbbb)
+.It Dv METEOR_GEO_YUV_PACKED
+(4-2-2 YUV 16 bits packed byte format:
+u0 y0 v0 y1 u1 y2 v1 y3 ...)
+.It Dv METEOR_GEO_YUV_PLANER
+(4-2-2 YUV 16 bits planer format:
+rows * columns bytes of y
+rows * column / 4 bytes of even u
+rows * column / 4 bytes of even v
+rows * column / 4 bytes of odd u
+rows * column / 4 bytes of odd v)
+.El
+.El
+.Pp
+The
+.Dv METEORSETGEO
+.Xr ioctl 2
+will fail if more than one entry from a category
+is selected.
+It is highly recommended that a
+.Dv METEORSETGEO
+is done
+before capturing data because you cannot guarantee the initial mode
+the card.
+.Pp
+The
+.Dv METEORSETGEO
+will also attempt to reallocate a new contiguous
+kernel buffer if the new geometry exceeds the old geometry.
+On
+other hand, if the new geometry will fit in the existing buffer,
+the existing buffer is used.
+.Pp
+If
+.Dv METEORSETGEO
+fails the
+.Xr ioctl 2
+will return a value of -1 and the
+external variable
+.Va errno
+will be set to:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+invalid
+.Va meteor_geomet
+structure pointer,
+.Va rows , columns , frames
+were invalid.
+.It Bq Er ENOMEM
+could not allocate the contiguous block.
+.El
+.It
+.Xr ioctl 2
+requests
+.Dv METEORSFMT
+and
+.Dv METEORGFMT
+.Pp
+.Dv METEORSFMT
+and
+.Dv METEORGFMT
+are used to set and read the camera input
+standard format.
+.Pp
+Possible formats are:
+.Pp
+.Bl -tag -width METEOR_FMT_AUTOMODE -compact
+.It Dv METEOR_FMT_NTSC
+NTSC (default mode)
+.It Dv METEOR_FMT_PAL
+PAL
+.It Dv METEOR_FMT_SECAM
+SECAM
+.It Dv METEOR_FMT_AUTOMODE
+Autodetect.
+.El
+.It
+.Xr ioctl 2
+requests
+.Dv METEORSINPUT
+and
+.Dv METEORGINPUT
+.Pp
+.Dv METEORSINPUT
+and
+.Dv METEORGINPUT
+are used to set and read the camera
+input device.
+Using the DB9 connector on the
+.Tn Meteor
+card, 4 input
+devices can be connected and an input camera can be selected with this
+.Xr ioctl 2 .
+.Pp
+Possible formats are:
+.Pp
+.Bl -tag -width METEOR_INPUT_DEV_SVIDEO -compact
+.It Dv METEOR_INPUT_DEV0
+(default if none specified)
+.It Dv METEOR_INPUT_DEV_RCA
+(same as METEOR_INPUT_DEV0)
+.It Dv METEOR_INPUT_DEV1
+.It Dv METEOR_INPUT_DEV2
+.It Dv METEOR_INPUT_DEV_SVIDEO
+(same as METEOR_INPUT_DEV2)
+.El
+.It
+.Xr ioctl 2
+request
+.Dv METEORSTATUS
+.Pp
+.Dv METEORSTATUS
+is used to read the status of the
+.Tn Meteor
+capture card
+and returns the following information:
+.Bl -column "METEOR_STATUS_ID_MASK" ""
+.It Dv METEOR_STATUS_ID_MASK " 4 bit ID of the SAA7196 scaler chip."
+.Pp
+.It Dv METEOR_STATUS_DIR " 0 = scaler uses internal source."
+.It " 1 = scaler uses external data of expansion bus."
+.Pp
+.It Dv METEOR_STATUS_OEF " 0 = even field detected."
+.It " 1 = odd field detected."
+.Pp
+.It Dv METEOR_STATUS_SVP " VRAM Port state:"
+.It " 0 = inputs HFL and INCADDR inactive."
+.It " 1 = inputs HFL and INCADDR active."
+.Pp
+.It Dv METEOR_STATUS_STTC " 0 = TV horizontal time constant (slow)."
+.It " 1 = VCR horizontal time constant (fast)."
+.Pp
+.It Dv METEOR_STATUS_HCLK " 0 = Horizontal Phase Lock Loop locked."
+.It " 1 = Horizontal Phase Lock Loop unlocked."
+.Pp
+.It Dv METEOR_STATUS_FIDT " 0 = 50 Hz Field detected."
+.It " 1 = 60 Hz Field detected."
+.Pp
+.It Dv METEOR_STATUS_ALTD " 0 = no line alternating color burst detected."
+.It " 1 = line alternating color burst detected (PAL/SECAM)."
+.Pp
+.It Dv METEOR_STATUS_CODE " 0 = no color information detected."
+.It " 1 = color information detected."
+.El
+.It
+.Xr ioctl 2
+request
+.Dv METEORCAPTUR
+.Pp
+.Dv METEORCAPTUR
+is used to single frame capture or unsynchronized
+continuous capture.
+.Pp
+The single frame capture
+.Xr ioctl 2
+request will return only after a
+frame has been captured and transfered to the frame buffer.
+.Pp
+The unsynchronized continuous capture will return immediately and
+data is directly deposited into the buffer when it is available.
+Since this is unsynchronized, it is possible the data is being
+written by the kernel while being read by the application.
+.Pp
+These
+.Xr ioctl 2
+routines use the following settings:
+.Pp
+.Bl -tag -width METEOR_CAP_CONTINOUS -compact
+.It Dv METEOR_CAP_SINGLE
+capture one frame
+.It Dv METEOR_CAP_CONTINOUS
+unsynchronized continuous capture
+.It Dv METEOR_CAP_STOP_CONT
+stop the unsynchronized continuous
+capture
+.El
+.Pp
+If
+.Dv METEORCAPTUR
+fails the
+.Xr ioctl 2
+will return a value of -1 and the
+external variable
+.Va errno
+will be set to:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+invalid capture command value
+.It Bq Er ENXIO
+there is not internal buffer to hold the frame.
+This indicates the previous set geometry
+.Xr ioctl 2
+failed.
+.It Bq Er EIO
+card is already capturing.
+.El
+.It
+.Xr ioctl 2
+request
+.Dv METEORCAPFRM
+.Pp
+.Dv METEORCAPFRM
+is used for synchronous capture of multiple frames.
+.Pp
+This
+.Xr ioctl 2
+routine uses the
+.Va meteor_capture
+structure that has the
+following entries:
+.Bl -tag -width command
+.It Va command
+possible values for
+.Va command
+are:
+.Bl -tag -width METEOR_CAP_STOP_FRAMES
+.It Dv METEOR_CAP_STOP_FRAMES
+stop the capture; does not use the
+other variable in structure.
+.It Dv METEOR_CAP_N_FRAMES
+start the capture using the other
+variables in the structure as inputs
+.El
+.It Va signal
+signal to send to application when a new
+frame has been captured.
+This signal will
+only be raised if the captured frame is saved.
+.It Va lowat
+see below
+.It Va hiwat
+see below
+.El
+.Pp
+When a new frame is completed, the driver checks the current unread
+frame count stored in shared variable (the shared variable is stored
+in the
+.Va meteor_mem
+structure)
+.Va num_active_buf ;
+if the count is larger
+than
+.Va hiwat ,
+the driver will not store any new frames and will not
+send capture signal to the user application until the
+.Va num_active_buf
+is lower than
+.Va lowat .
+.Pp
+If
+.Dv METEORCAPFRM
+fails the
+.Xr ioctl 2
+will return a value of -1 and the
+external variable
+.Va errno
+will be set to:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+invalid meteor_geomet structure pointer or bad command.
+.It Bq Er ENXIO
+there is not internal buffer to hold the frame.
+This indicates the previous set geometry
+.Xr ioctl 2
+failed.
+.It Bq Er EIO
+card is already capturing.
+.El
+.It
+.Xr ioctl 2
+requests
+.Dv METEORSCHCV
+and
+.Dv METEORGCHCV
+.Pp
+.Dv METEORSCHCV
+and
+.Dv METEORGCHCV
+are used to set and get the chrominance
+gain control and effects the UV output amplitude.
+.Pp
+If
+.Dv METEORSCHCV
+or
+.Dv METEORGCHCV
+fails the
+.Xr ioctl 2
+will return a value
+of -1 and the external variable
+.Va errno
+will be set to:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+invalid unsigned char pointer.
+.El
+.It
+.Xr ioctl 2
+requests
+.Dv METEORGHUE
+and
+.Dv METEORSHUE
+.Pp
+.Dv METEORGHUE
+and
+.Dv METEORSHUE
+are used to get and set the hue.
+The
+signed character has legal values are from +127 which represent
++178.6 degrees to -128 which represents -180 degrees.
+.Pp
+If
+.Dv METEORGHUE
+or
+.Dv METEORSHUE
+fails the
+.Xr ioctl 2
+will return a value of
+-1 and the external variable
+.Va errno
+will be set to:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+invalid signed char pointer.
+.El
+.It
+.Xr ioctl 2
+requests
+.Dv METEORSCOUNT
+and
+.Dv METEORGCOUNT
+.Pp
+.Dv METEORGCOUNT
+is used to get the count of frame errors, DMA errors and
+count of the number of frames captured that have occurred since
+the device was opened.
+.Dv METEORSCOUNT
+can be used to reinitialize the
+counters.
+.Pp
+This
+.Xr ioctl 2
+routines use the
+.Va meteor_counts
+structure that has the
+following entries:
+.Bl -tag -width frame_count
+.It Va fifo_errors
+number of FIFO errors since device was opened.
+.It Va dma_errors
+number of DMA errors since device was opened.
+.It Va frame_count
+number of frames captured since device was opened.
+.El
+.Pp
+If
+.Dv METEORSCOUNT
+or
+.Dv METEORGCOUNT
+fails the
+.Xr ioctl 2
+will return a value
+of -1 and the external variable
+.Va errno
+will be set to:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+invalid meteor_counts structure pointer.
+.El
+.El
+.Sh BUGS
+The
+.Nm
+driver no longer works at all.
+.Sh AUTHORS
+.An Jim Lowe Aq james@miller.cs.uwm.edu ,
+.An Mark Tinguely Aq tinguely@plains.nodak.edu
OpenPOWER on IntegriCloud