Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 28 Mar 1997 13:05:41 GMT
From:      Richard Tobin <richard@cogsci.ed.ac.uk>
To:        Steve Passe <smp@csn.net>
Cc:        multimedia@freebsd.org
Subject:   Tuner AFC
Message-ID:  <27629.199703281305@pitcairn.cogsci.ed.ac.uk>

next in thread | raw e-mail | index | archive | help
It turns out that some of the channels here aren't on precisely the
official frequencies, so I wrote a program to do AFC.

The AFC works using the 3 bottom bits of the tuner status register.
When it's centred, they are 0 1 0.  1 0 0 means it's too low, 0 0 1
too high.  The TEMIC datasheet refers to a 5-level ADC suggesting
that it might return 1 1 0 or 0 1 1 but that doesn't seem to happen
for me.

-- Richard

afc.c:

#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <machine/ioctl_bt848.h>

#define AFC 7
#define MAX_STEP (5 * 16)	/* Don't move more than 5 MHz */

void xerror(char *msg)
{
  perror(msg);
  exit(1);
}

int main(int argc, char **argv)
{
  int fd, f, step, stat;

  fd = open("/dev/tuner0", O_RDONLY);
  if(fd < 0)
    xerror("/dev/tuner0");

  if(ioctl(fd, TVTUNER_GETFREQ, &f) < 0)
    xerror("getfreq ioctl");

  printf("starting at %f MHz\n", f / 16.0);

  for(step = 0; step < MAX_STEP; step++)
    {
      if(ioctl(fd, TVTUNER_GETSTATUS, &stat) < 0)
	xerror("getstatus ioctl");

      if((stat & AFC) == 2)
	{
	  printf("stopped at %f MHz\n", f / 16.0);
	  return 0;
	}

      if((stat & AFC) > 2)
	f++;
      else
	f--;

      if(ioctl(fd, TVTUNER_SETFREQ, &f) < 0)
	xerror("setfreq ioctl");
    }

  printf("abandoned at %f MHz\n", f / 16.0);

  return 0;
}



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