*
* $Header: README,v 4.300 91/06/09 01:31:52 root Rel41 $ SONY;
*
********************************************************************************
*									       *
*			sample program for NWB-226 			       *
*									       *
********************************************************************************

	̃fBNgɂ́A4 ̃TvvO README 
	܂܂Ă܂B

	README ɂ͊{CuŃT|[gĂȂu9 s RS-422 
	RlN^vgRṽR}h𗘗p@ƁAeTvvO
	Ă܂̂ŁAŃvOۂ̎QlɂĂ
	B
	

<< ioctl gpăR}h𑗐M@ >>

	{Cuł̓T|[gĂȂ u9 s RS-422 RlN^
	vgRṽR}hgpɂ́Aioctl(2) VXeR[ 
	VCIOCSCMD R}hg܂B
	ł́ANEWS-OS 瑗Mp[^̃tH[}bgA 
	VCIOCSCMD R}h̎gA сÂ߂Ɋ{Cu
	pӂĂ֐ɂĐ܂B
	ۂ̗́Asample_4.c ɂ܂B

1) p[^̃tH[}bg 
 
	VTR Rg[C^[tF[X{[h NWB 226 ֑M
	p[^̃tH[}bĝ͎悤ɂȂĂ܂B
  
	+---------------+---------------------------------------------------+
	|     VC_CMD    |         RS-422 connector protocol command         |
	+---------------+---------------------------------------------------+
	| index |  scmd |  dlen | data1 | data2 |  ...  | data17 | checksum |
	+-------+-------+-------+-------+-------+-------+--------+----------+
	| 1byte | 1byte | 1byte | 1byte | 1byte |  ...  | 1byte  |  1byte   |
	+---------------+---------------------------------------------------+

	[index:CfbNX]
	[scmd:TuR}h]	R}h̎ނ\Ă܂B

		index	scmd	@\

		0x00	0x00	R}hȂ
		0x01	0x00	VTR ւ̃R}h
		0x02	0x00	VTR ̃^[
			0x01	VTR  NAK
		0x07	0x00	VTR ɂt[YRg[̗v
		0x08	0x00	VTR ɂt[YRg[̃^[

	[dlen:f[^]		data1 ` dataN ܂ł̒oCg
				\Ă܂[ ő 17 oCg ] B

	[data[1-17]:p[^]u9 s RS-422 RlN^vgRv
				R}hB

	[checksum:`FbNT]	u9 s RS-422 RlN^vgRv
				`FbNTB
				data1`dataN ܂ł̘ả1oCgB

[ tH[}bg̗ ]
  
+--------+-------+------+------+-------+-------+-------+-------+-------+-------+
|R}h| index | scmd | dlen | data1 | data2 | data3 | data4 |  ...  | chksum|
+--------+-------+------+------+-------+-------+-------+-------+-------+-------+
|  play  |  01   |  00  |  02  |  20   |  01   |       |       |       |  21   |
+--------+-------+------+------+-------+-------+-------+-------+-------+-------+
|  stop  |  01   |  00  |  02  |  20   |  00   |       |       |       |  20   |
+--------+-------+------+------+-------+-------+-------+-------+-------+-------+
| status |       |      |      |       |       |       |       |       |       |
| sense  |  01   |  00  |  03  |  61   |  20   |  XX   |       |       |  XX   |
+--------+-------+------+------+-------+-------+-------+-------+-------+-------+
| freeze |  07   |  00  |  06  |  XX   |  XX   |  XX   |  XX   |  XX   |  XX   |
+--------+-------+------+------+-------+-------+-------+-------+-------+-------+
  

2) \ vcio

	ŗp\̂ɂẮAuVTR Rg[C^[tF[X
	{[h\tgEFAvB
	A\ vcio ̃o vc_flags ́Ał͎svtO
	Ďg܂B

3) [UT|[g֐

	ioctl VXeR[ VCIOCSCMD R}hgpɓėp
	Ă郋[`ɂĐ܂B

    vtr_chksum() ----------------------------------------------------------
	
	`	vtr_chksum(&buf[3], num)
		u_char *buf;
		int num;

	Mp[^̍Ō̃`FbNTvZA̒lԂ܂B
	ŏ̈ŁA data1 ̓Ăobt@̃AhXAQԖڂ
	Ń`FbNTvZׂp[^w肵܂B

    vtr_errcode() ----------------------------------------------------------
  
	`	vtr_errcode(&vcio)
		struct vcio vcio;

	R}h̃^[l͂܂B
	ioctl VXeR[̌ʁA\ vcio ̃o vc_buf Ƀ^[l
	ԂĂ܂B̃^[llԂ̂ł̂A܂
	G[ł̂͂AꂼɉlԂ܂B
	^[l̊erbg͈ȉ̂悤ɂȈӖ܂B

   bit      7       6       5       4       3       2       1       0
	+-------+-------+-------+-------+-------+-------+-------+-------+
	|     		  channel-A  error data				| 
	+-------+-------+-------+-------+-------+-------+-------+-------+

   bit     15      14      13      12      11      10       9       8
	+-------+-------+-------+-------+-------+-------+-------+-------+
	|       |       |       |       |  DAT	| FREZ	| CTLR	|  VTR	|
	+-------+-------+-------+-------+-------+-------+-------+-------+

   bit     23      22      21      20      19      18      17      16
	+-------+-------+-------+-------+-------+-------+-------+-------+
	|     		  channel-B  error data				| 
	+-------+-------+-------+-------+-------+-------+-------+-------+

   bit     31      30      29      28      27      26      25      24
	+-------+-------+-------+-------+-------+-------+-------+-------+
	|       |       |       |       |  DAT	| FREZ	| CTLR	|  VTR	|
	+-------+-------+-------+-------+-------+-------+-------+-------+

	1,2 oCgڂ VTR ̃`l AA3,4 oCgڂ̓`l B Ɋւ
	G[A̓f[^\܂B

	2,4 oCgڂ̉ 4 rbg̓G[̎ށA̓f[^Ԃǂ
	frbgłB̃rbĝAǂꂪĂ邩ɂ
	1,3 oCgڂ error data قȂ܂Bꂼ̈Ӗ͈ȉ̂悤
	Ȃ܂B


	[VTR]	VTR ŐG[łB
		̂Ƃ error data ͈ȉ̂悤ɂȂ܂B

       MSB								 LSB
	+-------+-------+-------+-------+-------+-------+--------+---------+
	| VTR-	| VTR-	| VTR-	| VTR-	|	| VTR-	| VTR-	 | VTR-    |
	| time	|framing|overrun|parity	|  ---	|chksum	|timecode|undefined|
	|   out	| error	| error	| error	|	| error	|missing |command  |
	+-------+-------+-------+-------+-------+-------+--------+---------+

		time out ---------------+
		framing error		|
		overrun error		|--- u9 s RS-422 RlN^vg
		parity error		|     Rv NAK R}h
		chksum error		|     
		undefined command ------+
		timecode missing -----------  current time sense R}h
					      G[


	[CTLR]	t@[EFAvOŐG[łB
		̂Ƃ error data ͈ȉ̂悤ɂȂ܂B

       MSB								 LSB
	+-------+-------+-------+-------+-------+-------+-------+---------+
	| CTLR-	| CTLR-	| CTLR-	| CTLR-	|	| CTLR-	|	| CTLR-   |
	| time	|framing|overrun|parity	|  ---	|chksum	|  ---	|undefined|
	|   out	| error	| error	| error	|	| error	|	|command  |
	+-------+-------+-------+-------+-------+-------+-------+---------+

		time out ---------------+
		framing error		|
		overrun error		|--- NWB-226 ŌoꂽG[
		parity error		|
		chksum error		|
		undefined command ------+


	[FREZ]	t[YvAюs̏Ԃ\܂B
		̂Ƃ error data ͈ȉ̂悤ɂȂ܂B

       MSB								 LSB
	+-------+-------+--------+---------+--------+-------+-------+---------+
	| 	|OTHERS | FREZ-	 | FREZ-   |freeze  | FREZ- |freeze |freeze   |
	|  ---	|	|timecode|timecode |  in    | error | cancel|   done  |
	|   	| 	|missing |missmatch|progress|       |	    |         |
	+-------+-------+--------+---------+--------+-------+-------+---------+

		time code missing ------ ^CR[hǂނƂłȂ
		time code missmatch ---- t[Yv^CR[h݂
					 ^CR[h菬Ȃ
		freeze in progress ----- t[YRg[
		error ------------------ t[YRg[G[
		freeze cancel ---------- t[YLZR}hŒfꂽ
		freeze done ------------ t[YɎsꂽ

		OTHERS ----------------- LȊÕG[
					 (VTR, CTLR, FREZ, DAT ׂĂ܂)


	[DAT]	VTR  ACK,NAK уG[ȊÕf[^ԂĂƂ
		܂B̂Ƃ error data ɂ́Af[^̎ނʂrbg
		܂B

       MSB								 LSB
	+-------+-------+-------+-------+-------+-------+-------+-------+
	| 	| 	| 	|1 byte	|device	| user 	| time	|status	|
	|  ---	|  ---	|  ---	|  data	|  type	|   bit	|  code	|  data	|
	|   	| 	| 	| 	|	| 	|	|	|
	+-------+-------+-------+-------+-------+-------+-------+-------+

		user bit --------------- user bit f[^Ԃꂽ
		time code -------------- time code f[^Ԃꂽ
		status data ------------ status f[^Ԃꂽ
		device type ------------ device type request R}h̃^[
		1 byte data ------------ 1 byte ̃f[^Ԃꂽ
					      da input sense,
					      da sys emphasis sense,
					      da input emphasis sense,
					      da pb emphasis sense,
					      da sample freq sense,
						R}h̃^[

	ȏ̂悤ɂ̃[`ĂԂƂɂāA㉺ 16 rbgƂ
	ꂼ̃`l̏ԂԂ܂B

4) t[YR}hƕpꍇ

	{Ců֐ vtr_freeze() gpƁAt[Yۂ
	sꂽ_ŁAhCoVOi SIGIO Œm点Ă܂B
	̃VOiɊւ鏈́AuVTR Rg[C^[tF[X{[h
	NWB-226 \tgEFAṽt[Y@\̍ƁAq̎gp
	QƂĂB

5) ioctl VCIOCSCMD gp 
 
	ł́Aplay R}hgp sample_4.c ƂĐ܂B

	vO̐ 

	u9 s RS-422 RlN^vgRv play R}h́A
  
		20 01
  
	ƂtH[}bgĂ܂B

	ÃC^[tF[X{[hɑMۂ̃tH[}bgɒƁA
  
		index  scmd  dlen  data1  data2  checksum
		 01     00    03    20     01      21
  
	ƂȂ܂B
  
[ vO̐ ]  

		/* C[` */

		#include <sys/types.h>
		#include <sys/ioctl.h>
		#include <newsvme/vvcrsreg.h> 

	̃foCXhCogpۂɂ́AKCN[hĂB

		if ((fd = vtr_open(0)) < 0) {
			perror("/dev/vvcrs0");
			exit(1);
		}

		if (error = vtr_load(fd)) {
			vtr_perror(error);
			exit(1);
		}

	foCXI[vAt@[EFAvO[hAs܂B

		if (error = vtr_play(fd, exec)) {
			vtr_perror(error);
			exit(1);
		}

	C[` VTR  play R}h𑗂郋[`Ăяo܂

		vtr_close(fd);

	foCXN[Y܂B
	
		/* play R}h𑗐M */

		vtr_play(fd, e)

		int fd,		/* file descriptor */
		    e;		/* e=0:  command set */
				/* e!=0: command execute */

	C[`ŃI[vfoCX̃t@CfBXNv^ƁA
	svtOłB

		vciod[0].vc_buf = vc_rtn[0];
		vciod[1].vc_buf = vc_rtn[1];

	^[li[ꏊmۂĂ܂B

		buf[0] = 0x01;
		buf[1] = 0x00;
		buf[2] = 0x03;
		buf[3] = 0x20;
		buf[4] = 0x01;

	Mp[^obt@Ɋi[Ă܂B

		buf[5] = vtr_chksum(&buf[3],2);

	`FbNTvZAobt@Ɋi[܂B

		if (e)
			vcio.vc_flags |= VCEXEC;
		else
			vcio.vc_flags &= ~VCEXEC;

	svꂽǂɂătOZbgA̓Zbg܂B

		vcio.vc_count = 6;

	MSp[^Zbg܂B

		vcio.vc_buf = buf;

	Mp[^̃Zbgꂽobt@̐擪AhXZbg܂B

		if (ioctl(fd, VCIOCSCMD, &vcio) < 0) {

	p[^𑗐M܂B

		while (errno == EINTR) {
			errno = 0;
			if (ioctl(fd, VCIOCCONT, &vcio) == 0 )
				goto out;
		}

	t[YshCoVOiƁAioctl VXe
	R[G[(EINTR)ƂȂ蒆f邽߁AVOiɂG[
	Ȃ΂𖳎 ioctl p܂B
	̂߂ɂ ioctl VXeR[̃R}h VCIOCCONT gp܂B

		if (ioctl(fd, VCIOCGERRCHAN, &err_chan) < 0)
			return(-1);
		switch (err_chan) {
		case 1:
			return(-10);
		case 2:
			return(-20);
		case 3:
			return(-30);
		default:
			return(-1);

	 ioctl VXeR[G[ȂAǂ̃`lŃG[
	N̂𒲂ׂɍsAG[̐`lɂĒl
	Ԃ܂B̎A

		err_chan	1	ch-A error
				2	ch-B error
				3	ch-A and B error

	\܂B

		p = vciod;
		if (ioctl(fd, VCIOCGRTN, &p) < 0) {
			return(-1);
		}

	`ľM̈Ƀ^[lǂ݂ɍs܂B
	̂ƂpR}h VCIOCGRTN łB
	
	 vtr_play [`Ă΂钼OɃp[^̃ZbgsȂ
	[`Ă΂ĂÃ[`Ŏsvꂽꍇɂ́AO
	R}hɑ΂郊^[lœǂ܂ȂĂ͂ȂȂ߁A\̂
	zƂāAioctl VXeR[Ăяo܂B
	̂Ƃ vciod[0] Ƀ`l A ̃^[lAvciod[1] Ƀ`l B 
	̃^[l܂B

		vciod[0].vc_zaddr = 0;
		error = vtr_errcode(&vciod[0]);
		vciod[1].vc_zaddr = 1;
		error |= vtr_errcode(&vciod[1]);

	`l A, B ꂼ̃f[^͂AG[R[h𓾂܂B

		return(error);

	G[R[hԂ܂B


<< TvvO̓e >>

	1) sample_1.c
		t[YgpvOłB
		ŏ VTR  play ԂɂĂĂ
			[ 00  10  20 b 10 t[ ]
		Ńt[Yvo܂B
		̂܂܃t[Ys鎞_܂ pause ֐ő҂A
		̌ VTR  stop ܂B
		t[YIƂ̃Xe[^X́A sigio() [`
		Ŋ֐ vtr_gfstat() gĒׂ܂B
		t[YɏIĂȂ΁Avtr_perror() ֐
		ăG[bZ[W\܂B

	2) sample_2.c
		CuԂ^CR[h̒lɂ́At[f[^
		6, 7 rbgڂɃhbvt[[hAJ[t[[h
		f[^Ă邽߁Â܂ܕ\̂ł͐mȒlƂȂ
		܂B
		̂߂ɁAꂽ^CR[h̒lx BCD ɒ 6,7 
		rbgڂ}XNĂĂ 10 iɒ@Ă܂B
		ȂAvO vtr_ctsense R}ḧ VC_TIMER1 ́A
		gp󋵂ɂ̂ɕύXĂB

	3) sample_3.c
		VTR ̗`lɓɃR}h𑗐M邽߂̃TvłB
		܂A`lI[vāAt@[EFAvO
		[hAs܂B
		̌A
			channel-A: stop -> play -> fwd -> stop
			channel-B: stop -> play -> stop
		ƂsȂ܂B

	4) sample_4.c
		{CuŃT|[gĂȂR}h ioctl 
		găfoCXɑM@̂łB
		

<< RpC̎d >>

	ǂ̃TvvOA -lvc IvVtăRpC܂B

	j myname# cc sample_1.c -o sample_1 -lvc
