1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
|
.\" Copyright (c) 2009, Sun Microsystems, Inc. All Rights Reserved
.\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License. You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.
.\" See the License for the specific language governing permissions and limitations under the License. When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the
.\" fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
.Dd July 9, 2018
.Dt IEC61883 4I
.Os
.Sh NAME
.Nm iec61883
.Nd IEC 61883 interfaces
.Sh SYNOPSIS
.In sys/av/iec61883.h
.Sh DESCRIPTION
The set of interfaces described in this man page can be used to control and
exchange data with consumer audio/video devices using protocols specified
in
.%T "IIEC 61883 Consumer Electronic Audio/Video Equipment - Digital Interface"
including Common Isochronous Packet (CIP), Connection Management
Procedures (CMP) and Function Control Protocol (FCP).
.Pp
An
.Nm
compliant driver exports two device nodes for isochronous and
for asynchronous transactions.
See the
.Sx FILES
section of this man page for the namespace definition.
.Ss "Isochronous Transfers"
Two methods are provided to receive/transmit isochronous data: using
.Xr mmap 2
in combination with
.Xr ioctl 2 ,
and
.Xr read 2
or
.Xr write 2 .
.Ss "Mmap/Ioctl"
This method provides better performance and finer-grained control than
read/write, and is a method of choice for most applications.
The data buffer is
mapped into a user process address space, which means no data copying between
the kernel and an application is necessary.
Synchronization between user
processes and the driver is performed using
.Xr ioctl 2
commands.
.Pp
An application allocates resources for isochronous transfer using
.Dv IEC61883_ISOCH_INIT .
Then the data buffer can be mapped into the process
space using
.Xr mmap 2 .
.Pp
A circular data buffer consists of one or more equal size frame buffers
(further referred to as frames, unless to avoid ambiguity with AV frames).
Frames are numbered starting with zero and are always transferred sequentially.
Frames consist equal sized packets.
Each packet contains a CIP header and one or more data blocks.
.Pp
A driver and an application act as a producer and a consumer: producer supplies
.Em full
frames (filled with data) to the consumer, and the producer is not
allowed to access those frames until the consumer claims them
.Em empty .
.Pp
A transfer can be initiated and suspended with
.Dv IEC61883_START
and
.Dv IEC61883_STOP
commands respectively.
.Dv IEC61883_RECV
or
.Dv IEC61883_XMIT
is used for producer-consumer synchronization.
.Ss "Read/Write"
Using this method, an application calls
.Xr read 2
or
.Xr write 2
to receive or transmit a specified amount of data.
Bus-specific overhead, such as isochronous packet headers, is handled by the driver
and is not exposed to applications.
Data returned by
.Xr read 2
contains CIP headers and data blocks.
Empty packets are not returned by
.Xr read 2 .
.Xr write 2
data should meet the same requirements.
.Pp
If one or more channels have been allocated since
.Xr open 2
(see
.Dv IEC61883_ISOCH_INIT ) ,
the data is received/transmitted using channel that was created the last.
.Pp
If no channels were allocated, the driver uses the broadcast channel by default
and allocates the default-size data buffer.
During transmit, the first packet's CIP header is used to auto-detect the data format.
If it is one of the formats supported by the driver, it is properly transmitted (with
inserted empty packets and timestamps).
.Pp
For both methods, if during transmit the driver runs out of data, it transmits
empty packets containing only a CIP header of the next to be transmitted
packet, as defined in
.Em IEC 61883-1 .
.Ss "Connection Management Procedures"
Applications wishing to follow Connection Management Procedures (CMP) in
combination with isochronous transfers should use the
.Xr ioctl 2
.Dv IEC61883_PLUG_INIT ,
.Dv IEC61883_PLUG_FINI ,
.Dv IEC61883_PLUG_REG_READ
and
.Dv IEC61883_PLUG_REG_CAS
commands.
.Ss "Asynchronous Transactions"
.Xr read 2 ,
.Xr write 2 ,
.Xr ioctl 2 ,
and
.Xr poll 2
can be used
with asynchronous nodes.
Asynchronous data exchange between a driver and an
application utilizes a common data structure called asynchronous request (ARQ):
.Bd -literal -offset 2n
typedef struct iec61883_arq {
int arq_type;
int arq_len;
union {
uint32_t quadlet;
uint64_t octlet;
uint8_t buf[8];
} arq_data;
} iec61883_arq_t;
.Ed
.Pp
.Fa arq_type
contains
.Sy ARQ
type:
.Pp
.Bl -tag -width " " -compact
.It Dv IEC61883_ARQ_FCP_CMD
.It Dv IEC61883_ARQ_FCP_RESP
.Pp
.Sy FCP
command and response frame respectively.
Outgoing frames are sent using
.Xr write 2 ,
incoming frames are received with
.Xr read 2 .
.Pp
See
.Em IIEC 61883-1
for the FCP frame structure definition.
.Pp
.It Dv IEC61883_ARQ_BUS_RESET
.Pp
Returned by the driver when a bus reset occurs.
There is no data associated with this request type, and \fBarq_len\fR is set to 0.
.El
.Pp
If
.Fa arq_len
is 4 or 8, then data should be supplied in
.Fa arq_data.quadlet
or
.Fa arq_data.octlet
respectively, otherwise up to 8 bytes can be put in
.Fa arq_data.buf ,
with the rest of the data following immediately after.
.Ss "write(2)"
For a request to be sent to a target, an
.Vt iec61883_arq_t
structure along with associated data is passed to the driver using
.Xr write 2 .
.Xr write 2
blocks until the request is completed.
.Ss "read(2)"
A driver collects incoming ARQs in the internal buffer.
Buffer size can be changed using the
.Xr ioctl 2
command
.Vt IEC61883_FCP_SET_IBUF_SIZE .
.Pp
Reading an ARQ takes one or two steps depending on data length.
An application
first reads
.Ql sizeof (iec61883_arq_t)
bytes: if
.Fa arq_len
is less than or equal 4, which is usually the case, no additional step is needed.
Otherwise,
the remaining
.Ql arq_len - 4
bytes should be read and concatenated.
.Pp
.Xr read 2
blocks until the specified amount of data is available, unless
.Dv O_NONBLOCK
or
.Dv O_NDELAY
flag was set during
.Xr open 2 ,
in which case
.Xr read 2
returns immediately.
.Ss "poll(2)"
Applications can
.Xr poll 2
asynchronous nodes on the
.Dv POLLIN
event.
.Ss "Bus Reset"
In case of a bus reset, the driver notifies an application by generating an
.Sy ARQ
of type
.Dv IEC61883_ARQ_BUS_RESET .
.Pp
If there were established isochronous connections before bus reset, the driver
attempts to restore all connections as described in
.Em IEC 61883
and resume any active transfers that were in progress.
.Sh IOCTLS
The following commands only apply to isochronous nodes:
.Bl -tag -width " "
.It Dv IEC61883_ISOCH_INIT
.Pp
This command allocates a data buffer and isochronous resources (if necessary)
for the isochronous transfer.
The argument is a pointer to the structure:
.Bd -literal -offset 2n
typedef struct iec61883_isoch_init {
int ii_version; /* interface version */
int ii_pkt_size; /* packet size */
int ii_frame_size; /* packets/frame */
int ii_frame_cnt; /* # of frames */
int ii_direction; /* xfer direction */
int ii_bus_speed; /* bus speed */
uint64_t ii_channel; /* channel mask */
int ii_dbs; /* DBS */
int ii_fn; /* FN */
int ii_rate_n; /* rate numerator */
int ii_rate_d; /* rate denominator */
int ii_ts_mode; /* timestamp mode */
int ii_flags; /* flags */
int ii_handle; /* isoch handle */
int ii_frame_rcnt; /* # of frames */
off_t *ii_mmap_off /* mmap offset */
int ii_rchannel; /* channel */
int ii_error; /* error code */
} iec61883_isoch_init_t;
.Ed
.Pp
.Fa ii_version
should be set to
.Dv IEC61883_V1_0 .
.Pp
The driver attempts to allocate a data buffer consisting of
.Fa ii_frame_cnt
frames, with
.Fa ii_frame_size
packets in each frame.
Packet size in bytes is specified by
.Fa ii_pkt_size
specifies and should be a multiple of 512 and compatible with
.Fa ii_bus_speed .
.Pp
.Fa ii_direction
can take one of the following values:
.Bl -tag -width "IEC61883_DIR_RECV"
.It Dv IEC61883_DIR_RECV
Receiving isochronous data.
.It Dv IEC61883_DIR_XMIT
Transmitting isochronous data.
.El
.Pp
.Fa ii_bus_speed
chooses bus speed to be used and can be either
.Dv IEC61883_S100 ,
.Dv IEC61883_S200
or
.Dv IEC61883_S400 .
.Pp
.Fa ii_channel
is a mask that specifies an isochronous channel number to be
used, with the
.Em N Ns th
bit representing channel
.Em N .
When transmitting data, several bits can be set at a time, in which case the
driver chooses one, for example,
.Sy 0x3FF
means a range from 0 to 9.
In case of receive, only one bit can be set.
.Pp
.Fa ii_dbs
specifies data block size in quadlets, for example, DBS value for
.Dv SD-DVCR
is
.Sy 0x78 .
Refer to
.Em IEC 61883
for more details on DBS.
.Pp
.Fa ii_fn
specifies fraction number, which defines the number of blocks in which a
source packet is divided.
Allowed values are from 0 to 3.
Refer to
.Em IEC 61883
for more details on FN.
.Pp
Data rate expected by the AV device can be lower than the bus speed, in which
case the driver has to periodically insert empty packets into the data stream
to avoid device buffer overflows.
This rate is specified with a fraction N/D,
set by
.Fa ii_rate_n
and
.Fa ii_rate_d
respectively.
Any integer numbers can be used, or the following predefined constants:
.Pp
.Bl -tag -width "IEC61883_RATE_N_DV_NTSC" -compact
.It Dv IEC61883_RATE_N_DV_NTSC
.It Dv IEC61883_RATE_D_DV_NTSC
Data rate expected by
.Sy DV-NTSC
devices.
.Pp
.It Dv IEC61883_RATE_N_DV_PAL
.It Dv IEC61883_RATE_D_DV_PAL
Data rate expected by
.Sy DV-PAL
devices.
.El
.Pp
During data transmission, a timestamp based on the current value of the cycle
timer is usually required.
.Fa ii_ts_mode
defines timestamp mode to be used:
.Bl -tag -width IEC61883_TS_NONE
.It Dv IEC61883_TS_SYT
Driver puts a timestamp in the SYT field of the first CIP header of each frame.
.It Dv IEC61883_TS_NONE
No timestamps.
.El
.Pp
.Fa ii_dbs ,
.Fa ii_fn ,
.Fa ii_rate_n ,
.Fa ii_rate_d
and
.Fa ii_ts_mode
are only required for transmission.
In other case these should be set to 0.
.Pp
.Fa ii_flags
should be set to 0.
.Pp
If command succeeds,
.Fa ii_handle
contains a handle that should be used with other isochronous commands.
.Fa ii_frame_rcnt
contains the number of allocated frames (can be less than
.Fa ii_frame_cnt ) .
.Fa ii_mmap_off
contains an offset to be used in
.Xr mmap 2 ,
for example, to map an entire data receive buffer:
.Bd -literal -offset 2n
pa = mmap(NULL, init.ii_pkt_size *
init.ii_frame_size * init.ii_frame_rcnt,
PROT_READ, MAP_PRIVATE, fd, init.ii_mmap_off);
.Ed
.Pp
.Fa ii_rchannel
contains channel number.
.Pp
In case of command success,
.Fa ii_error
is set to 0; otherwise one of the following values can be returned:
.Bl -tag -width IEC61883_ERR_NOCHANNEL
.It Dv IEC61883_ERR_NOMEM
Not enough memory for the data buffer.
.It Dv IEC61883_ERR_NOCHANNEL
Cannot allocate isochronous channel.
.It Dv IEC61883_ERR_PKT_SIZE
Packet size is not allowed at this bus speed.
.It Dv IEC61883_ERR_VERSION
Interface version is not supported.
.It Dv IEC61883_ERR_INVAL
One or more the parameters are invalid
.It Dv IEC61883_ERR_OTHER
Unspecified error type.
.El
.It Dv IEC61883_ISOCH_FINI
.Pp
Argument is a handle returned by
.Dv IEC61883_ISOCH_INIT .
This command frees any resources associated with this handle.
There must be no active transfers
and the data buffer must be unmapped; otherwise the command fails.
.It Dv IEC61883_START
.Pp
This command starts an isochronous transfer.
The argument is a handle returned
by
.Dv IEC61883_ISOCH_INIT .
.It Dv IEC61883_STOP
.Pp
This command stops an isochronous transfer.
The argument is a handle returned by
.Dv IEC61883_ISOCH_INIT .
.It Dv IEC61883_RECV
.Pp
This command is used to receive full frames and return empty frames to the driver.
The argument is a pointer to the structure:
.Bd -literal -offset 2n
typedef struct iec61883_recv {
int rx_handle; /* isoch handle */
int rx_flags; /* flags */
iec61883_xfer_t rx_xfer; /* xfer params */
} iec61883_recv_t;
typedef struct iec61883_xfer {
int xf_empty_idx; /* first empty frame */
int xf_empty_cnt; /* empty frame count */
int xf_full_idx; /* first full frame */
int xf_full_cnt; /* full frame count */
int xf_error; /* error */
} iec61883_xfer_t;
.Ed
.Pp
.Fa rx_flags
should be set to 0.
.Pp
An application sets
.Fa xf_empty_idx
and
.Fa xf_empty_cnt
to indicate frames it no longer needs.
E. g. if a buffer consists of 6 frames,
.Fa xf_empty_idx
is 4,
.Fa xf_empty_cnt
is 3 - means that frames 4, 5 and 0 can now be reused by the driver.
If there are no empty frames, for example, the
first time this command is called,
.Fa xf_empty_cnt
should be set to 0.
.Pp
When the command returns,
.Fa xf_full_idx
and
.Fa xf_full_cnt
specifies the frames that are full.
.Fa xf_error
is always 0.
.Pp
In general, AV frame boundaries are not aligned with the frame buffer
boundaries, because the first received packet might not be the first packet of
an AV frame, and, in contrast with the read/write method, the driver does not
remove empty CIP packets.
.Pp
Applications should detect empty packets by comparing adjacent packets'
continuity counters (DBC field of the CIP header).
.It Dv IEC61883_XMIT
.Pp
This command is used to transmit full frames and get more empty frames from the
driver.
The argument is a pointer to the structure:
.Bd -literal -offset 2n
typedef struct iec61883_xmit {
int tx_handle; /* isoch handle */
int tx_flags; /* flags */
iec61883_xfer_t tx_xfer; /* xfer params */
int tx_miss_cnt; /* missed cycles */
} iec61883_xmit_t;
.Ed
.Pp
.Fa tx_flags
should be set to zero.
.Pp
The application sets
.Fa xf_full_idx
and
.Fa xf_full_cnt
to specify frames it wishes to transmit.
If there are no frames to transmit (e. g. the first time this command is called),
.Fa xf_full_cnt
should be set to 0.
.Pp
When the command returns,
.Fa xf_empty_idx
and
.Fa xf_empty_cnt
specifies empty frames which can be to transmit more data.
.Fa xf_error
is always 0.
.Pp
.Fa tx_miss_cnt
contains the number of isochronous cycles missed since last
transfer due to data buffer under run.
This can happen when an application does not supply data fast enough.
For the purposes of time stamping, the driver considers the first packet in a
frame buffer to be the first packet of an AV frame.
.It Dv IEC61883_PLUG_INIT
.Pp
This command returns a handle for the specified plug.
The argument is a pointer
to the structure:
.Bd -literal -offset 2n
typedef struct iec61883_plug_init {
int pi_ver; /* interface version */
int pi_loc; /* plug location */
int pi_type; /* plug type */
int pi_num; /* plug number */
int pi_flags; /* flags */
int pi_handle; /* plug handle */
int pi_rnum; /* plug number */
} iec61883_plug_init_t;
.Ed
.Pp
.Fa pi_ver
should be set to
.Dv IEC61883_V1_0 .
.Pp
.Fa pi_loc
specifies plug location:
.Bl -tag -width IEC61883_LOC_REMOTE
.It Dv IEC61883_LOC_LOCAL
On the local unit (local plug).
A plug control register (PCR) is allocated.
Command fails if the plug already exists
.It Dv IEC61883_LOC_REMOTE
On the remote unit (remote plug).
The plug should exist on the remote unit,
otherwise the command fails.
.El
.Pp
.Fa pi_type
specifies isochronous plug type:
.Pp
.Bl -tag -width " " -compact
.It Dv IEC61883_PLUG_IN
.It Dv IEC61883_PLUG_OUT
.Pp
Input or output plugs.
.Pp
.It Dv IEC61883_PLUG_MASTER_IN
.It Dv IEC61883_PLUG_MASTER_OUT
.Pp
Master input or master output plug.
These plugs always exist on the local unit.
.El
.Pp
.Fa pi_num
specifies plug number.
This should be 0 for master plugs, and from 0 to 31 for input/output plugs.
Alternatively, a special value
.Dv IEC61883_PLUG_ANY
can be used to let the driver choose a free plug
number, create the plug and return the number in
.Fa pi_rnum .
.Pp
.Fa pi_flags
should be set to 0.
.Pp
If the command succeeds,
.Fa pi_handle
contains a handle that should be used with other plug commands.
.It Dv IEC61883_PLUG_FINI
.Pp
Argument is a handle returned by
.Dv IEC61883_PLUG_INIT .
This command frees any resources associated with this handle, including the PCR.
.It Dv IEC61883_PLUG_REG_READ
.Pp
Read plug register value.
The argument is a pointer to the structure:
.Bd -literal -offset 2n
typedef struct iec61883_plug_reg_val {
int pr_handle; /* plug handle */
uint32_t pr_val; /* register value */
} iec61883_plug_reg_val_t;
.Ed
.Pp
.Fa pr_handle
is a handle returned by
.Dv IEC61883_PLUG_INIT .
Register
value is returned in
.Fa pr_val .
.It Dv IEC61883_PLUG_REG_CAS
.Pp
Atomically compare and swap plug register value.
The argument is a pointer to the structure:
.Bd -literal -offset 2n
typedef struct iec61883_plug_reg_lock {
int pl_handle; /* plug handle */
uint32_t pl_arg; /* compare arg */
uint32_t pl_data; /* write value */
UINT32_t pl_old; /* original value */
} iec61883_plug_reg_lock_t;
.Ed
.Pp
.Fa pr_handle
is a handle returned by IEC61883_PLUG_INIT.
.Pp
Original register value is compared with
.Fa pl_arg
and if they are equal, register value is replaced with
.Fa pl_data .
In any case, the original value is stored in
.Fa pl_old .
.El
.Pp
The following commands only apply to asynchronous nodes:
.Bl -tag -width " "
.It Dv IEC61883_ARQ_GET_IBUF_SIZE
.Pp
This command returns current incoming ARQ buffer size.
The argument is a
pointer to
.Vt int .
.It Dv IEC61883_ARQ_SET_IBUF_SIZE
.Pp
This command changes incoming ARQ buffer size.
The argument is the new buffer
size in bytes.
.El
.Sh FILES
.Bl -tag -width /dev/av/N/async
.It Pa /dev/av/N/async
Device node for asynchronous data
.It Pa /dev/av/N/isoch
Device has been disconnected
.El
.Sh ERRORS
.Bl -tag -width EFAULT
.It Er EIO
Bus operation failed.
DMA failure.
.It Er EFAULT
.Xr ioctl 2
argument points to an illegal address.
.It Er EINVAL
Invalid argument or argument combination.
.It Er ENODEV
Device has been disconnected.
.El
.Sh ARCHITECTURE
All
.Sh INTERFACE STABILITY
Committed
.Sh SEE ALSO
.Xr ioctl 2 ,
.Xr mmap 2 ,
.Xr open 2 ,
.Xr poll 2 ,
.Xr read 2 ,
.Xr write 2 ,
.Xr av1394 4D ,
.Xr attributes 7
.Rs
.%B IIEC 61883 Consumer audio/video equipment - Digital interface
.Re
.Rs
.%B IEEE Std 1394-1995 Standard for a High Performance Serial Bus
.Re
|