Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 28 May 1997 00:36:56 +0200 (MET DST)
From:      Luigi Rizzo <luigi@labinfo.iet.unipi.it>
To:        hasty@rah.star-gate.com (Amancio Hasty)
Cc:        luigi@iet.unipi.it, multimedia@FreeBSD.ORG
Subject:   Re: bt848 status, comments and diffs
Message-ID:  <199705272236.AAA16301@labinfo.iet.unipi.it>
In-Reply-To: <199705271548.IAA13533@rah.star-gate.com> from "Amancio Hasty" at May 27, 97 08:47:48 am

next in thread | previous in thread | raw e-mail | index | archive | help
> Hi Luigi,
> 
> interlace is for ntsc interlace frames see the bt848 databook for 
> a brief description . In your case, modifiy the driver so interlace

ok, I think I have got it. you have several different options

    1. odd only;
    2. even only
    3. odd or even as separate fields
    4. odd + even, interlaced

> Tonite, I will review the mods on a quick qlance they look great!

I have given a first shot at the yuvpacked code (the simpler one).
I would write it as follows:

yuvpacked(...)
{
	... init stuff ...

	inst = OP_WRITE  | OP_SOL | OP_EOL | bt_enable_cnt << 12 | (cols*2);

        if (i_flag == 1 /* want even only */)
                I2( OP_SYNC | OP_RESYNC | BKTR_VRE, 0 );
        else /* odd or full frame start with an odd field */
                I2( OP_SYNC | OP_RESYNC | BKTR_VRO, 0 );

	I2( OP_SYNC | OP_RESYNC | BKTR_FM1, 0 );

	for (i = 0; i < (rows/interlace) - 1; i++) {
		I2( inst, target_buffer );
		target_buffer += interlace*cols*2;
	}
	if (interlace == 1) {
		/* last row, generate interrupt */
		I2( inst | OP_IRQ, target_buffer );
	} else {
		/* last row of odd field, no interrupt */
		I2( inst, target_buffer );
        	/* want BOTH: odd done, wait even */
                I2( OP_SYNC | OP_RESYNC | BKTR_VRE, 0 );

                target_buffer =  (u_long) buffer + cols*2;

                I2( OP_SYNC | OP_RESYNC | BKTR_FM1, 0 );
        
                for (i = 0; i < (rows/interlace) - 1 ; i++) {
                        I2( inst, target_buffer );
                        target_buffer += interlace * ( cols*2);
                }
		/* generate IRQ on last row */
                I2( inst | OP_IRQ, target_buffer );
        }
	I2( OP_JUMP , (u_long ) vtophys(bktr->dma_prog) );
        *dma_prog++ = 0;  /* NULL WORD */
}

The above code is based on the assumption that the IRQ is generated
at the end of the instruction. The manual does not mention this,
but I don't think it would make sense the other way round.

Also, the way it is structured, it does not permit to capture both
fields non interlaced (case 3 above), but that should be easy to fix.

	Cheers
	Luigi
-----------------------------+--------------------------------------
Luigi Rizzo                  |  Dip. di Ingegneria dell'Informazione
email: luigi@iet.unipi.it    |  Universita' di Pisa
tel: +39-50-568533           |  via Diotisalvi 2, 56126 PISA (Italy)
fax: +39-50-568522           |  http://www.iet.unipi.it/~luigi/
_____________________________|______________________________________



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199705272236.AAA16301>