Merge remote-tracking branch 'alanc/master'

This commit is contained in:
Keith Packard 2011-09-21 14:30:19 -07:00
commit 98f4940093
12 changed files with 621 additions and 543 deletions

View File

@ -3442,8 +3442,7 @@ CloseDownClient(ClientPtr client)
* now. If it hasn't gotten to Running, nClients has *not* * now. If it hasn't gotten to Running, nClients has *not*
* been incremented, so *don't* decrement it. * been incremented, so *don't* decrement it.
*/ */
if (client->clientState != ClientStateInitial && if (client->clientState != ClientStateInitial)
client->clientState != ClientStateAuthenticating )
{ {
--nClients; --nClients;
} }
@ -3705,19 +3704,8 @@ ProcEstablishConnection(ClientPtr client)
auth_proto, auth_proto,
(unsigned short)prefix->nbytesAuthString, (unsigned short)prefix->nbytesAuthString,
auth_string); auth_string);
/*
* If Kerberos is being used for this client, the clientState
* will be set to ClientStateAuthenticating at this point.
* More messages need to be exchanged among the X server, Kerberos
* server, and client to figure out if everyone is authorized.
* So we don't want to send the connection setup info yet, since
* the auth step isn't really done.
*/
if (client->clientState == ClientStateCheckingSecurity)
client->clientState = ClientStateCheckedSecurity;
else if (client->clientState != ClientStateAuthenticating)
return(SendConnSetup(client, reason)); return(SendConnSetup(client, reason));
return Success;
} }
void void

View File

@ -103,6 +103,8 @@ xf86InfoRec xf86Info = {
.vtPendingNum = -1, .vtPendingNum = -1,
#endif #endif
.dontVTSwitch = FALSE, .dontVTSwitch = FALSE,
.autoVTSwitch = TRUE,
.ShareVTs = FALSE,
.dontZap = FALSE, .dontZap = FALSE,
.dontZoom = FALSE, .dontZoom = FALSE,
.notrapSignals = FALSE, .notrapSignals = FALSE,

View File

@ -1352,6 +1352,16 @@ ddxProcessArgument(int argc, char **argv, int i)
xf86xkbdirFlag = TRUE; xf86xkbdirFlag = TRUE;
return 0; return 0;
} }
if (!strcmp(argv[i], "-novtswitch"))
{
xf86Info.autoVTSwitch = FALSE;
return 1;
}
if (!strcmp(argv[i], "-sharevts"))
{
xf86Info.ShareVTs = TRUE;
return 1;
}
/* OS-specific processing */ /* OS-specific processing */
return xf86ProcessArgument(argc, argv, i); return xf86ProcessArgument(argc, argv, i);
@ -1408,6 +1418,8 @@ ddxUseMsg(void)
ErrorF("-version show the server version\n"); ErrorF("-version show the server version\n");
ErrorF("-showDefaultModulePath show the server default module path\n"); ErrorF("-showDefaultModulePath show the server default module path\n");
ErrorF("-showDefaultLibPath show the server default library path\n"); ErrorF("-showDefaultLibPath show the server default library path\n");
ErrorF("-novtswitch don't automatically switch VT at reset & exit\n");
ErrorF("-sharevts share VTs with another X server\n");
/* OS-specific usage */ /* OS-specific usage */
xf86UseMsg(); xf86UseMsg();
ErrorF("\n"); ErrorF("\n");

View File

@ -66,6 +66,8 @@ typedef struct {
int vtPendingNum; int vtPendingNum;
#endif #endif
Bool dontVTSwitch; Bool dontVTSwitch;
Bool autoVTSwitch;
Bool ShareVTs;
Bool dontZap; Bool dontZap;
Bool dontZoom; Bool dontZoom;
Bool notrapSignals; /* don't exit cleanly - die at fault */ Bool notrapSignals; /* don't exit cleanly - die at fault */

View File

@ -1,4 +1,3 @@
#ifdef HAVE_XORG_CONFIG_H #ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h> #include <xorg-config.h>
#endif #endif
@ -19,35 +18,37 @@
const FI1236_parameters tuner_parms[NUM_TUNERS] = const FI1236_parameters tuner_parms[NUM_TUNERS] =
{ {
/* 0 - FI1236 */ /* 0 - FI1236 */
{ 733 ,884 ,12820 ,2516 ,7220 ,0xA2 ,0x94, 0x34, 0x8e }, { 733, 884, 12820, 2516, 7220, 0xA2, 0x94, 0x34, 0x8e },
/* !!!based on documentation - it should be: /* !!!based on documentation - it should be:
{733 ,16*55.25 ,16*801.25 ,16*160 ,16*454 ,0xA0 ,0x90, 0x30, 0x8e},*/ {733, 16*55.25, 16*801.25, 16*160, 16*454, 0xA0, 0x90, 0x30, 0x8e},*/
/* 1 - FI1216 */ /* 1 - FI1216 */
{ 623 ,16*48.75 ,16*855.25 ,16*170 ,16*450 ,0xA0 ,0x90, 0x30, 0x8e }, { 623, 16*48.75, 16*855.25, 16*170, 16*450, 0xA0, 0x90, 0x30, 0x8e },
/* 2 - TEMIC FN5AL */ /* 2 - TEMIC FN5AL */
{ 623 ,16*45.75 ,16*855.25 ,16*169 ,16*454 ,0xA0 ,0x90, 0x30, 0x8e }, { 623, 16*45.75, 16*855.25, 16*169, 16*454, 0xA0, 0x90, 0x30, 0x8e },
/* 3 - MT2032.. */ /* 3 - MT2032.. */
{ 733 ,768 ,13760 , 0 , 0 , 0 , 0, 0, 0 }, { 733, 768, 13760, 0, 0, 0, 0, 0, 0 },
/* 4 - FI1246 */ /* 4 - FI1246 */
{ 623 ,16*45.75 ,16*855.25 ,16*170 ,16*450 ,0xA0 ,0x90, 0x30, 0x8e }, { 623, 16*45.75, 16*855.25, 16*170, 16*450, 0xA0, 0x90, 0x30, 0x8e },
/* 5 - FI1256 */ /* 5 - FI1256 */
{ 623 ,16*49.75 ,16*863.25 ,16*170 ,16*450 ,0xA0 ,0x90, 0x30, 0x8e }, { 623, 16*49.75, 16*863.25, 16*170, 16*450, 0xA0, 0x90, 0x30, 0x8e },
/* 6 - FI1236W */ /* 6 - FI1236W */
/*{ 733 ,884 ,12820 ,2516 ,7220 ,0x1 ,0x2, 0x4, 0x8e },*/ /*{ 733, 884, 12820, 2516, 7220, 0x1, 0x2, 0x4, 0x8e },*/
{ 732, 16*55.25, 16*801.25, 16*160, 16*442, 0x1, 0x2, 0x4, 0x8e }, { 732, 16*55.25, 16*801.25, 16*160, 16*442, 0x1, 0x2, 0x4, 0x8e },
/* 7 - FM1216ME */ /* 7 - FM1216ME */
{ 623 ,16*48.25 ,16*863.25 ,16*158.00 ,16*442.00 ,0x1 ,0x2, 0x4, 0x8e } { 623, 16*48.25, 16*863.25, 16*158.00, 16*442.00, 0x1, 0x2, 0x4, 0x8e }
}; };
FI1236Ptr Detect_FI1236(I2CBusPtr b, I2CSlaveAddr addr) FI1236Ptr
Detect_FI1236 (I2CBusPtr b, I2CSlaveAddr addr)
{ {
FI1236Ptr f; FI1236Ptr f;
I2CByte a; I2CByte a;
f = calloc(1,sizeof(FI1236Rec)); f = calloc(1,sizeof(FI1236Rec));
if(f == NULL) return NULL; if (f == NULL)
return NULL;
f->d.DevName = strdup("FI12xx Tuner"); f->d.DevName = strdup("FI12xx Tuner");
f->d.SlaveAddr = addr; f->d.SlaveAddr = addr;
f->d.pI2CBus = b; f->d.pI2CBus = b;
@ -61,294 +62,331 @@ FI1236Ptr Detect_FI1236(I2CBusPtr b, I2CSlaveAddr addr)
f->last_afc_hint=TUNER_OFF; f->last_afc_hint=TUNER_OFF;
f->video_if=45.7812; f->video_if=45.7812;
if(!I2C_WriteRead(&(f->d), NULL, 0, &a, 1)) if (!I2C_WriteRead(&(f->d), NULL, 0, &a, 1)) {
{
free(f); free(f);
return NULL; return NULL;
} }
FI1236_set_tuner_type(f, TUNER_TYPE_FI1236); FI1236_set_tuner_type(f, TUNER_TYPE_FI1236);
if(!I2CDevInit(&(f->d))) if (!I2CDevInit(&(f->d))) {
{
free(f); free(f);
return NULL; return NULL;
} }
return f; return f;
} }
static void MT2032_dump_parameters(FI1236Ptr f, MT2032_parameters *m) static void
MT2032_dump_parameters (FI1236Ptr f, MT2032_parameters *m)
{ {
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: input f_rf=%g f_if1=%g f_if2=%g f_ref=%g f_ifbw=%g f_step=%g\n", xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
"MT2032: input f_rf=%g f_if1=%g f_if2=%g f_ref=%g f_ifbw=%g f_step=%g\n",
m->f_rf, m->f_if1, m->f_if2, m->f_ref, m->f_ifbw, m->f_step); m->f_rf, m->f_if1, m->f_if2, m->f_ref, m->f_ifbw, m->f_step);
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: computed f_lo1=%g f_lo2=%g LO1I=%d LO2I=%d SEL=%d STEP=%d NUM=%d\n", xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
"MT2032: computed f_lo1=%g f_lo2=%g LO1I=%d LO2I=%d SEL=%d STEP=%d NUM=%d\n",
m->f_lo1, m->f_lo2, m->LO1I, m->LO2I, m->SEL, m->STEP, m->NUM); m->f_lo1, m->f_lo2, m->LO1I, m->LO2I, m->SEL, m->STEP, m->NUM);
} }
static void MT2032_getid(FI1236Ptr f) static void
MT2032_getid (FI1236Ptr f)
{ {
CARD8 out[4]; CARD8 out[4];
CARD8 in; CARD8 in;
in=0x11; in = 0x11;
I2C_WriteRead(&(f->d), (I2CByte *)&in, 1, out, 4); I2C_WriteRead(&(f->d), (I2CByte *)&in, 1, out, 4);
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: Company code 0x%02x%02x, part code 0x%02x, revision code 0x%02x\n", xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
"MT2032: Company code 0x%02x%02x, part code 0x%02x, revision code 0x%02x\n",
out[0], out[1], out[2], out[3]); out[0], out[1], out[2], out[3]);
} }
/* might be buggy */ /* might be buggy */
#if 0 #if 0
static void MT2032_shutdown(FI1236Ptr f) static void
MT2032_shutdown (FI1236Ptr f)
{ {
CARD8 data[10]; CARD8 data[10];
data[0]=0x00; /* start with register 0x00 */ data[0] = 0x00; /* start with register 0x00 */
data[1]=0x1A; data[1] = 0x1A;
data[2]=0x44; data[2] = 0x44;
data[3]=0x20; data[3] = 0x20;
I2C_WriteRead(&(f->d), (I2CByte *)data, 4, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 4, NULL, 0);
data[0]=0x05; /* now start with register 0x05 */ data[0] = 0x05; /* now start with register 0x05 */
data[1]=0xD7; data[1] = 0xD7;
data[2]=0x14; data[2] = 0x14;
data[3]=0x05; data[3] = 0x05;
I2C_WriteRead(&(f->d), (I2CByte *)data, 4, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 4, NULL, 0);
data[0]=0x0B; /* now start with register 0x05 */ data[0] = 0x0B; /* now start with register 0x05 */
data[1]=0x8F; data[1] = 0x8F;
data[2]=0x07; data[2] = 0x07;
data[3]=0x43; data[3] = 0x43;
I2C_WriteRead(&(f->d), (I2CByte *)data, 4, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 4, NULL, 0);
usleep(15000); usleep(15000);
} }
#endif #endif
static void MT2032_dump_status(FI1236Ptr f); static void MT2032_dump_status (FI1236Ptr f);
static void MT2032_init(FI1236Ptr f) static void
MT2032_init (FI1236Ptr f)
{ {
CARD8 data[10]; CARD8 data[10];
CARD8 value; CARD8 value;
CARD8 xogc = 0x00; CARD8 xogc = 0x00;
MT2032_getid(f); MT2032_getid(f);
data[0]=0x02; /* start with register 0x02 */ data[0] = 0x02; /* start with register 0x02 */
data[1]=0xFF; data[1] = 0xFF;
data[2]=0x0F; data[2] = 0x0F;
data[3]=0x1F; data[3] = 0x1F;
I2C_WriteRead(&(f->d), (I2CByte *)data, 4, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 4, NULL, 0);
data[0]=0x06; /* now start with register 0x06 */ data[0] = 0x06; /* now start with register 0x06 */
data[1]=0xE4; data[1] = 0xE4;
data[2]=0x8F; data[2] = 0x8F;
data[3]=0xC3; data[3] = 0xC3;
data[4]=0x4E; data[4] = 0x4E;
data[5]=0xEC; data[5] = 0xEC;
I2C_WriteRead(&(f->d), (I2CByte *)data, 6, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 6, NULL, 0);
data[0]=0x0d; /* now start with register 0x0d */ data[0] = 0x0d; /* now start with register 0x0d */
data[1]=0x32; data[1] = 0x32;
I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0);
while(1) { while (1) {
usleep(15000); /* wait 15 milliseconds */ usleep(15000); /* wait 15 milliseconds */
data[0]=0x0e; /* register number 7, status */ data[0] = 0x0e; /* register number 7, status */
value=0xFF; value = 0xFF;
if(!I2C_WriteRead(&(f->d), (I2CByte *)data, 1, &value, 1)) if (!I2C_WriteRead(&(f->d), (I2CByte *)data, 1, &value, 1))
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: failed to read XOK\n"); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: XOK=%d\n", value & 0x01); "MT2032: failed to read XOK\n");
if(value & 1) break; xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
"MT2032: XOK=%d\n", value & 0x01);
if (value & 1)
break;
data[0]=0x07; data[0] = 0x07;
if(!I2C_WriteRead(&(f->d), (I2CByte *)data, 1, &value, 1)) if (!I2C_WriteRead(&(f->d), (I2CByte *)data, 1, &value, 1))
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: failed to read XOGC\n"); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
"MT2032: failed to read XOGC\n");
xogc=value & 0x7; xogc=value & 0x7;
if(xogc==4){ if (xogc == 4)
break; /* XOGC has reached 4.. stop */ break; /* XOGC has reached 4.. stop */
}
xogc--; xogc--;
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: try XOGC=%d\n", xogc); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
"MT2032: try XOGC=%d\n", xogc);
usleep(15000); usleep(15000);
data[0]=0x07; /* register number 7, control byte 2 */ data[0] = 0x07; /* register number 7, control byte 2 */
data[1]=0x08 | xogc; data[1] = 0x08 | xogc;
I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0);
} }
f->xogc=xogc; f->xogc = xogc;
/* wait before continuing */ /* wait before continuing */
usleep(15000); /* wait 50 milliseconds */ usleep(15000); /* wait 50 milliseconds */
MT2032_dump_status(f); MT2032_dump_status(f);
} }
static int MT2032_no_spur_in_band(MT2032_parameters *m) static int
MT2032_no_spur_in_band (MT2032_parameters *m)
{ {
int n_max, n1, n2; int n_max, n1, n2;
double f_test; double f_test;
n_max=5; n_max = 5;
n1=1; n1 = 1;
while(1){ while (1) {
n2=-n1; n2 = -n1;
f_test=n1*(m->f_lo1-m->f_lo2); f_test = n1 * (m->f_lo1 - m->f_lo2);
while(1){ while (1) {
n2--; n2--;
f_test=f_test-m->f_lo2; f_test = f_test - m->f_lo2;
xf86DrvMsg(0, X_INFO, "testing f_test=%g n1=%d n2=%d f_lo1=%g f_lo2=%g f_if2=%g\n", f_test, n1, n2, m->f_lo1, m->f_lo2, m->f_if2); xf86DrvMsg(0, X_INFO,
xf86DrvMsg(0, X_INFO, "d_f=%g f_ifbw=%g\n",fabs(fabs(f_test)-m->f_if2), m->f_ifbw); "testing f_test=%g n1=%d n2=%d f_lo1=%g f_lo2=%g f_if2=%g\n",
if((fabs(fabs(f_test)-m->f_if2)*2.0)<=m->f_ifbw)return 0; f_test, n1, n2, m->f_lo1, m->f_lo2, m->f_if2);
if(n2<=-n_max)break; xf86DrvMsg(0, X_INFO, "d_f=%g f_ifbw=%g\n",
fabs(fabs(f_test) - m->f_if2), m->f_ifbw);
if ((fabs(fabs(f_test) - m->f_if2) * 2.0) <= m->f_ifbw)
return 0;
if (n2 <= -n_max)
break;
/* this line in the manual is bogus. I say it is faster /* this line in the manual is bogus. I say it is faster
and more correct to go over all harmonics.. */ and more correct to go over all harmonics.. */
#if 0 #if 0
if(f_test<(m->f_lo2-m->f_if2-m->f_ifbw))break; if (f_test < (m->f_lo2 - m->f_if2 - m->f_ifbw))
#endif break;
#endif
} }
n1++; n1++;
if(n1>=n_max)return 1; if (n1 >= n_max)
return 1;
} }
} }
static void MT2032_calculate_register_settings(MT2032_parameters *m, double f_rf, double f_if1, double f_if2, double f_ref, double f_ifbw, double f_step) static void
MT2032_calculate_register_settings (MT2032_parameters *m, double f_rf,
double f_if1, double f_if2, double f_ref, double f_ifbw, double f_step)
{ {
int n; int n;
m->f_rf=f_rf; m->f_rf = f_rf;
m->f_if1=f_if1; m->f_if1 = f_if1;
m->f_if2=f_if2; m->f_if2 = f_if2;
m->f_ref=f_ref; m->f_ref = f_ref;
m->f_ifbw=f_ifbw; m->f_ifbw = f_ifbw;
m->f_step=f_step; m->f_step = f_step;
m->f_lo1=f_rf+f_if1; m->f_lo1 = f_rf+f_if1;
m->LO1I=lrint(m->f_lo1/f_ref); m->LO1I = lrint(m->f_lo1 / f_ref);
m->f_lo1=f_ref*m->LO1I; m->f_lo1 = f_ref * m->LO1I;
m->f_lo2=m->f_lo1-f_rf-f_if2; m->f_lo2 = m->f_lo1 - f_rf - f_if2;
/* check for spurs */ /* check for spurs */
n=1; n = 1;
while(n<3){ while (n < 3) {
if(MT2032_no_spur_in_band(m))break; if (MT2032_no_spur_in_band(m))
if(m->f_lo1<(f_rf+f_if1)){ break;
m->LO1I+=n;
} else { if (m->f_lo1 < (f_rf + f_if1))
m->LO1I-=n; m->LO1I += n;
} else
m->f_lo1=m->LO1I*f_ref; m->LO1I -= n;
m->f_lo2=m->f_lo1-f_rf-f_if2;
m->f_lo1 = m->LO1I * f_ref;
m->f_lo2 = m->f_lo1 - f_rf - f_if2;
n++; n++;
} }
/* xf86DrvMsg(0, X_INFO, "MT2032: n=%d\n", n); */ /* xf86DrvMsg(0, X_INFO, "MT2032: n=%d\n", n); */
/* select VCO */ /* select VCO */
/* m->f_lo1>1100.0 */ /* m->f_lo1>1100.0 */
if(m->f_lo1<1370.0)m->SEL=4; if (m->f_lo1 < 1370.0)
else m->SEL = 4;
if(m->f_lo1<1530.0)m->SEL=3; else if (m->f_lo1 < 1530.0)
else m->SEL = 3;
if(m->f_lo1<1720.0)m->SEL=2; else if (m->f_lo1 < 1720.0)
else m->SEL = 2;
if(m->f_lo1<1890.0)m->SEL=1; else if (m->f_lo1 < 1890.0)
m->SEL = 1;
else /* m->f_lo1 < 1958.0 */ else /* m->f_lo1 < 1958.0 */
m->SEL=0; m->SEL = 0;
/* calculate the rest of the registers */ /* calculate the rest of the registers */
m->LO2I=floor(m->f_lo2/f_ref); m->LO2I = floor(m->f_lo2 / f_ref);
m->STEP=floor(3780.0*f_step/f_ref); m->STEP = floor(3780.0 * f_step / f_ref);
m->NUM=floor(3780.0*(m->f_lo2/f_ref-m->LO2I)); m->NUM = floor(3780.0 * (m->f_lo2 / f_ref - m->LO2I));
m->NUM=m->STEP*lrint((1.0*m->NUM)/(1.0*m->STEP)); m->NUM = m->STEP * lrint((1.0 * m->NUM) / (1.0 * m->STEP));
} }
static int MT2032_wait_for_lock(FI1236Ptr f) static int
MT2032_wait_for_lock (FI1236Ptr f)
{ {
int n; int n;
CARD8 data[10]; CARD8 data[10];
CARD8 value; CARD8 value;
n=12; n=12;
while(1){ while(1) {
data[0]=0x0e; /* register number 7, status */ data[0] = 0x0e; /* register number 7, status */
I2C_WriteRead(&(f->d), (I2CByte *)data, 1, &value, 1); I2C_WriteRead(&(f->d), (I2CByte *)data, 1, &value, 1);
/* xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: LO1LK=%d LO2LK=%d\n", (value & 0x04)>>2, (value & 0x02)>>1); */ /* xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
if((value & 6)==6) break; "MT2032: LO1LK=%d LO2LK=%d\n",
usleep(1500); (value & 0x04)>>2, (value & 0x02)>>1); */
if ((value & 6)==6)
break;
usleep (1500);
n--; n--;
if(n<0)break; if (n < 0)
break;
} }
if(n<0){ if (n < 0) {
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: failed to set frequency\n"); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
"MT2032: failed to set frequency\n");
return 0; return 0;
} }
return 1; return 1;
} }
static void MT2032_implement_settings(FI1236Ptr f, MT2032_parameters *m) static void
MT2032_implement_settings (FI1236Ptr f, MT2032_parameters *m)
{ {
CARD8 data[10]; CARD8 data[10];
CARD8 value; CARD8 value;
data[0]=0x00; /* start with register 0x00 */ data[0] = 0x00; /* start with register 0x00 */
data[1]=(m->LO1I>>3)-1; data[1] = (m->LO1I >> 3) - 1;
data[2]=(m->SEL<<4)|(m->LO1I & 0x7); data[2] = (m->SEL << 4) | (m->LO1I & 0x7);
data[3]=0x86; data[3] = 0x86;
I2C_WriteRead(&(f->d), (I2CByte *)data, 4, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 4, NULL, 0);
data[0]=0x05; /* start with register 0x05 */ data[0] = 0x05; /* start with register 0x05 */
data[1]=((m->LO2I & 0x7)<<5)|((m->LO2I>>3)-1); data[1] = ((m->LO2I & 0x7) << 5) | ((m->LO2I >> 3) - 1);
if(m->f_rf<400.0)data[2]=0xe4; if (m->f_rf < 400.0)
else data[2]=0xf4; data[2] = 0xe4;
I2C_WriteRead(&(f->d), (I2CByte *)data, 3, NULL, 0); else
data[2] = 0xf4;
I2C_WriteRead(&(f->d), (I2CByte *)data, 3, NULL, 0);
data[0]=0x07; /* register number 7, control byte 2 */ data[0] = 0x07; /* register number 7, control byte 2 */
I2C_WriteRead(&(f->d), (I2CByte *)data, 1, &value, 1); I2C_WriteRead(&(f->d), (I2CByte *)data, 1, &value, 1);
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: using XOGC=%d\n", (value & 0x07)); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
data[1]=8 | (value & 0x7); "MT2032: using XOGC=%d\n", (value & 0x07));
I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0); data[1] = 8 | (value & 0x7);
I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0);
data[0]=0x0b; /* start with register 0x0b */ data[0] = 0x0b; /* start with register 0x0b */
data[1]=m->NUM & 0xff; data[1] = m->NUM & 0xff;
data[2]=(1<<7)|((m->NUM >> 8) & 0x0f); data[2] = (1<<7) | ((m->NUM >> 8) & 0x0f);
I2C_WriteRead(&(f->d), (I2CByte *)data, 3, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 3, NULL, 0);
MT2032_wait_for_lock(f); MT2032_wait_for_lock(f);
} }
static void MT2032_optimize_VCO(FI1236Ptr f, MT2032_parameters *m) static void
MT2032_optimize_VCO (FI1236Ptr f, MT2032_parameters *m)
{ {
CARD8 data[10]; CARD8 data[10];
CARD8 value; CARD8 value;
CARD8 TAD1; CARD8 TAD1;
data[0]=0x0f; /* register number 7, status */ data[0] = 0x0f; /* register number 7, status */
I2C_WriteRead(&(f->d), (I2CByte *)data, 1, &value, 1); I2C_WriteRead(&(f->d), (I2CByte *)data, 1, &value, 1);
TAD1=value & 0x07; TAD1=value & 0x07;
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: TAD1=%d SEL=%d\n", TAD1, m->SEL); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
if(TAD1 < 2)return; "MT2032: TAD1=%d SEL=%d\n", TAD1, m->SEL);
if(TAD1==2){ if (TAD1 < 2)
if(m->SEL==0)return; return;
if (TAD1 == 2) {
if (m->SEL == 0)
return;
m->SEL--; m->SEL--;
} else { } else {
if(m->SEL>=4)return; if (m->SEL >= 4)
return;
m->SEL++; m->SEL++;
} }
data[0]=0x01; /* start with register 1 */ data[0] = 0x01; /* start with register 1 */
data[1]=(m->SEL<<4)|(m->LO1I & 0x7); data[1] = (m->SEL << 4) | (m->LO1I & 0x7);
I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0);
} }
static int FI1236_get_afc_hint(FI1236Ptr f) static int
FI1236_get_afc_hint (FI1236Ptr f)
{ {
CARD8 out; CARD8 out;
CARD8 AFC; CARD8 AFC;
if ((f->type == TUNER_TYPE_FM1216ME) || (f->type == TUNER_TYPE_FI1236W)) if ((f->type == TUNER_TYPE_FM1216ME) || (f->type == TUNER_TYPE_FI1236W)) {
{
TDA9885Ptr t = (TDA9885Ptr)f->afc_source; TDA9885Ptr t = (TDA9885Ptr)f->afc_source;
if (t == NULL) if (t == NULL)
return TUNER_OFF; return TUNER_OFF;
@ -357,195 +395,214 @@ static int FI1236_get_afc_hint(FI1236Ptr f)
tda9885_dumpstatus(t); tda9885_dumpstatus(t);
AFC = t->afc_status & 0x0f; AFC = t->afc_status & 0x0f;
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "AFC: FI1236_get_afc_hint: %i\n", AFC); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
if (AFC == 0) return TUNER_TUNED; "AFC: FI1236_get_afc_hint: %i\n", AFC);
else if (AFC <= 0x07)return TUNER_JUST_BELOW; if (AFC == 0)
else if (AFC < 0x0f )return TUNER_JUST_ABOVE; return TUNER_TUNED;
else if (AFC == 0x0f)return TUNER_TUNED; else if (AFC <= 0x07)
} return TUNER_JUST_BELOW;
else else if (AFC < 0x0f)
{ return TUNER_JUST_ABOVE;
else if (AFC == 0x0f)
return TUNER_TUNED;
} else {
I2C_WriteRead(&(f->d), NULL, 0, &out, 1); I2C_WriteRead(&(f->d), NULL, 0, &out, 1);
AFC=out & 0x7; AFC = out & 0x7;
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "AFC: FI1236_get_afc_hint: %i\n", AFC); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
if(AFC==2)return TUNER_TUNED; "AFC: FI1236_get_afc_hint: %i\n", AFC);
if(AFC==3)return TUNER_JUST_BELOW; if (AFC == 2)
if(AFC==1)return TUNER_JUST_ABOVE; return TUNER_TUNED;
if (AFC == 3)
return TUNER_JUST_BELOW;
if (AFC == 1)
return TUNER_JUST_ABOVE;
return TUNER_OFF; return TUNER_OFF;
} }
return TUNER_OFF; return TUNER_OFF;
} }
static int MT2032_get_afc_hint(FI1236Ptr f) static int
MT2032_get_afc_hint (FI1236Ptr f)
{ {
CARD8 in; CARD8 in;
CARD8 out[2]; CARD8 out[2];
CARD8 AFC; CARD8 AFC;
in=0x0e; in = 0x0e;
I2C_WriteRead(&(f->d), (I2CByte *)&in, 1, out, 2); I2C_WriteRead(&(f->d), (I2CByte *)&in, 1, out, 2);
AFC=(out[0]>>4) & 0x7; AFC = (out[0] >> 4) & 0x7;
#if 0 #if 0
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "AFC=%d TAD1=%d TAD2=%d\n", AFC, out[1] & 0x7, (out[1]>>4)& 0x07); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "AFC=%d TAD1=%d TAD2=%d\n",
AFC, out[1] & 0x7, (out[1]>>4)& 0x07);
#endif #endif
if(AFC==2)return TUNER_TUNED; if (AFC == 2)
if(AFC==3)return TUNER_JUST_BELOW; return TUNER_TUNED;
if(AFC==1)return TUNER_JUST_ABOVE; if (AFC == 3)
return TUNER_OFF; return TUNER_JUST_BELOW;
if (AFC == 1)
return TUNER_JUST_ABOVE;
return TUNER_OFF;
} }
/* this function is for external use only */ /* this function is for external use only */
int TUNER_get_afc_hint(FI1236Ptr f) int
TUNER_get_afc_hint (FI1236Ptr f)
{ {
if(f->afc_timer_installed)return TUNER_STILL_TUNING; if (f->afc_timer_installed)
return f->last_afc_hint; return TUNER_STILL_TUNING;
return f->last_afc_hint;
} }
static void MT2032_dump_status(FI1236Ptr f) static void
MT2032_dump_status (FI1236Ptr f)
{ {
CARD8 in; CARD8 in;
CARD8 out[2]; CARD8 out[2];
CARD8 AFC; CARD8 AFC;
CARD8 LDONrb; CARD8 LDONrb;
CARD8 LO1LK, LO2LK, XOK; CARD8 LO1LK, LO2LK, XOK;
CARD8 TAD2, TAD1; CARD8 TAD2, TAD1;
in=0x0e; in = 0x0e;
I2C_WriteRead(&(f->d), (I2CByte *)&in, 1, out, 2); I2C_WriteRead(&(f->d), (I2CByte *)&in, 1, out, 2);
XOK=out[0] & 1; XOK = out[0] & 1;
LO1LK=(out[0]>>2) &1; LO1LK = (out[0] >> 2) & 1;
LO2LK=(out[0]>>1) &1; LO2LK = (out[0] >> 1) & 1;
LDONrb=(out[0]>>3) &1; LDONrb = (out[0] >> 3) & 1;
AFC=(out[0]>>4) & 0x7; AFC = (out[0] >> 4) & 0x7;
TAD1=(out[1] & 0x7); TAD1 = (out[1] & 0x7);
TAD2=(out[1]>>4) & 0x7; TAD2 = (out[1] >> 4) & 0x7;
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: status: XOK=%d LO1LK=%d LO2LK=%d LDONrb=%d AFC=%d TAD1=%d TAD2=%d\n", xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
"MT2032: status: XOK=%d LO1LK=%d LO2LK=%d LDONrb=%d AFC=%d TAD1=%d TAD2=%d\n",
XOK, LO1LK, LO2LK, LDONrb, AFC, TAD1, TAD2); XOK, LO1LK, LO2LK, LDONrb, AFC, TAD1, TAD2);
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: status: OSCILLATOR:%s PLL1:%s PLL2:%s\n", xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
XOK ? "ok":"off", LO1LK ? "locked" : "off" , LO2LK ? "locked" : "off"); "MT2032: status: OSCILLATOR:%s PLL1:%s PLL2:%s\n",
XOK ? "ok" : "off",
LO1LK ? "locked" : "off",
LO2LK ? "locked" : "off");
} }
static void MT2032_tune(FI1236Ptr f, double freq, double step) static void MT2032_tune(FI1236Ptr f, double freq, double step)
{ {
MT2032_parameters m; MT2032_parameters m;
CARD8 data[10]; CARD8 data[10];
int i; int i;
/* NTSC IF is 44mhz.. but 733/16=45.8125 and all TDAXXXX docs mention
/* NTSC IF is 44mhz.. but 733/16=45.8125 and all TDAXXXX docs mention
45.75, 39, 58.75 and 30. */ 45.75, 39, 58.75 and 30. */
#if 0 #if 0
MT2032_calculate_register_settings(&m, freq, 1090.0, 45.125, 5.25, 6.0, step); MT2032_calculate_register_settings(&m, freq, 1090.0, 45.125, 5.25, 6.0, step);
MT2032_calculate_register_settings(&m, freq, 1090.0, 45.74, 5.25, 6.0, step); MT2032_calculate_register_settings(&m, freq, 1090.0, 45.74, 5.25, 6.0, step);
#endif #endif
MT2032_calculate_register_settings(&m, freq, 1090.0, f->video_if, 5.25, 3.0, step); MT2032_calculate_register_settings(&m, freq, 1090.0, f->video_if, 5.25, 3.0, step);
MT2032_dump_parameters(f, &m); MT2032_dump_parameters(f, &m);
MT2032_implement_settings(f, &m); MT2032_implement_settings(f, &m);
/* MT2032_dump_parameters(f, &m); */ /* MT2032_dump_parameters(f, &m); */
for(i=0;i<3;i++){ for (i = 0; i < 3; i++) {
MT2032_optimize_VCO(f, &m); MT2032_optimize_VCO(f, &m);
if(MT2032_wait_for_lock(f)){ if (MT2032_wait_for_lock(f)) {
data[0]=0x02; /* LO Gain control register 0x02 */ data[0] = 0x02; /* LO Gain control register 0x02 */
data[1]=0x20; data[1] = 0x20;
I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0);
return; return;
} }
data[0]=0x07; data[0] = 0x07;
data[1]=0x88|f->xogc; data[1] = 0x88 | f->xogc;
I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0);
usleep(15000); usleep(15000);
data[1]=0x08|f->xogc; data[1] = 0x08 | f->xogc;
I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)data, 2, NULL, 0);
} }
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "MT2032: failed to set frequency\n"); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
"MT2032: failed to set frequency\n");
} }
void FI1236_set_tuner_type(FI1236Ptr f, int type) void
FI1236_set_tuner_type (FI1236Ptr f, int type)
{ {
f->type=type; f->type = type;
if(type>=NUM_TUNERS)type = NUM_TUNERS-1; if (type >= NUM_TUNERS)
if(type<0)type = 0; type = NUM_TUNERS-1;
memcpy(&(f->parm), &(tuner_parms[type]), sizeof(FI1236_parameters)); if (type < 0)
f->original_frequency=f->parm.min_freq; type = 0;
f->afc_delta=0; memcpy(&(f->parm), &(tuner_parms[type]), sizeof(FI1236_parameters));
if(type==TUNER_TYPE_MT2032){ f->original_frequency = f->parm.min_freq;
f->afc_delta = 0;
if (type == TUNER_TYPE_MT2032) {
MT2032_init(f); MT2032_init(f);
return; return;
} }
} }
static CARD32 AFC_TimerCallback(OsTimerPtr timer, CARD32 time, pointer data){ static CARD32
FI1236Ptr f=(FI1236Ptr)data; AFC_TimerCallback(OsTimerPtr timer, CARD32 time, pointer data)
if(FI1236_AFC(f))return 150; {
FI1236Ptr f = (FI1236Ptr)data;
if (FI1236_AFC(f))
return 150;
else { else {
f->afc_timer_installed=FALSE; f->afc_timer_installed = FALSE;
f->afc_count=0; f->afc_count = 0;
return 0; return 0;
} }
} }
void FI1236_tune(FI1236Ptr f, CARD32 frequency) void
FI1236_tune(FI1236Ptr f, CARD32 frequency)
{ {
CARD16 divider; CARD16 divider;
CARD8 data; CARD8 data;
if(frequency < f->parm.min_freq) frequency = f->parm.min_freq; if (frequency < f->parm.min_freq) frequency = f->parm.min_freq;
if(frequency > f->parm.max_freq) frequency = f->parm.max_freq; if (frequency > f->parm.max_freq) frequency = f->parm.max_freq;
divider = (f->parm.fcar+(CARD16)frequency) & 0x7fff; divider = (f->parm.fcar + (CARD16)frequency) & 0x7fff;
f->tuner_data.div1 = (CARD8)((divider>>8)&0x7f); f->tuner_data.div1 = (CARD8)((divider >> 8)&0x7f);
f->tuner_data.div2 = (CARD8)(divider & 0xff); f->tuner_data.div2 = (CARD8)(divider & 0xff);
f->tuner_data.control = f->parm.control; f->tuner_data.control = f->parm.control;
if(frequency < f->parm.threshold1) if (frequency < f->parm.threshold1)
{
f->tuner_data.band = f->parm.band_low; f->tuner_data.band = f->parm.band_low;
}
else if (frequency < f->parm.threshold2) else if (frequency < f->parm.threshold2)
{
f->tuner_data.band = f->parm.band_mid; f->tuner_data.band = f->parm.band_mid;
}
else else
{
f->tuner_data.band = f->parm.band_high; f->tuner_data.band = f->parm.band_high;
}
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "Setting tuner band to %d\n", f->tuner_data.band); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
"Setting tuner band to %d\n", f->tuner_data.band);
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "Setting tuner frequency to %d\n", (int)frequency); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
"Setting tuner frequency to %d\n", (int)frequency);
if ((f->type == TUNER_TYPE_FM1216ME) || (f->type == TUNER_TYPE_FI1236W)) if ((f->type == TUNER_TYPE_FM1216ME) || (f->type == TUNER_TYPE_FI1236W)) {
{
f->tuner_data.aux = 0x20; f->tuner_data.aux = 0x20;
I2C_WriteRead(&(f->d), (I2CByte *)&(f->tuner_data), 5, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)&(f->tuner_data), 5, NULL, 0);
I2C_WriteRead(&(f->d), NULL, 0, &data, 1); I2C_WriteRead(&(f->d), NULL, 0, &data, 1);
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "Tuner status %x\n", data); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "Tuner status %x\n", data);
} }
else else
I2C_WriteRead(&(f->d), (I2CByte *)&(f->tuner_data), 4, NULL, 0); I2C_WriteRead(&(f->d), (I2CByte *)&(f->tuner_data), 4, NULL, 0);
} }
void TUNER_set_frequency(FI1236Ptr f, CARD32 frequency) void
TUNER_set_frequency(FI1236Ptr f, CARD32 frequency)
{ {
if(frequency < f->parm.min_freq) frequency = f->parm.min_freq; if (frequency < f->parm.min_freq) frequency = f->parm.min_freq;
if(frequency > f->parm.max_freq) frequency = f->parm.max_freq; if (frequency > f->parm.max_freq) frequency = f->parm.max_freq;
f->afc_delta=0; f->afc_delta=0;
f->original_frequency=frequency; f->original_frequency=frequency;
if(f->type==TUNER_TYPE_MT2032) if (f->type == TUNER_TYPE_MT2032)
{
MT2032_tune(f, (1.0*frequency)/16.0, 0.0625); MT2032_tune(f, (1.0*frequency)/16.0, 0.0625);
} else else
{
FI1236_tune(f, frequency); FI1236_tune(f, frequency);
}
if(!f->afc_timer_installed) if (!f->afc_timer_installed) {
{
f->afc_timer_installed=TRUE; f->afc_timer_installed=TRUE;
/* RegisterBlockAndWakeupHandlers(FI1236_BlockHandler, AFCWakeup, f); */ /* RegisterBlockAndWakeupHandlers(FI1236_BlockHandler, AFCWakeup, f); */
TimerSet(NULL, 0, 300, AFC_TimerCallback, f); TimerSet(NULL, 0, 300, AFC_TimerCallback, f);
@ -554,52 +611,65 @@ void TUNER_set_frequency(FI1236Ptr f, CARD32 frequency)
} }
int FI1236_AFC(FI1236Ptr f) int
FI1236_AFC(FI1236Ptr f)
{ {
#if 0 #if 0
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "AFC: f=%p f->count=%d f->original_frequency=%d f->afc_delta=%d\n", f, f->afc_count, f->original_frequency, f->afc_delta); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
#endif "AFC: f=%p f->count=%d f->original_frequency=%d f->afc_delta=%d\n",
f, f->afc_count, f->original_frequency, f->afc_delta);
#endif
f->afc_count++; f->afc_count++;
if(f->type==TUNER_TYPE_MT2032) if (f->type == TUNER_TYPE_MT2032) {
{ f->last_afc_hint = MT2032_get_afc_hint(f);
f->last_afc_hint=MT2032_get_afc_hint(f); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "AFC: afc_hint=%d\n", f->last_afc_hint); "AFC: afc_hint=%d\n", f->last_afc_hint);
if(f->last_afc_hint==TUNER_TUNED)return 0; if (f->last_afc_hint == TUNER_TUNED)
if(f->afc_count>3)f->last_afc_hint=TUNER_OFF; return 0;
if(f->last_afc_hint==TUNER_OFF) if (f->afc_count > 3)
{ f->last_afc_hint = TUNER_OFF;
f->afc_delta=0; if (f->last_afc_hint == TUNER_OFF)
} else f->afc_delta = 0;
f->afc_delta+=f->last_afc_hint; else
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "AFC: Setting tuner frequency to %g\n", (0.5*(2*f->original_frequency+f->afc_delta))/16.0); f->afc_delta += f->last_afc_hint;
MT2032_tune(f, (1.0*f->original_frequency+0.5*f->afc_delta)/16.0, 0.03125);
if(f->last_afc_hint==TUNER_OFF)return 0; xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
"AFC: Setting tuner frequency to %g\n",
(0.5 * (2 * f->original_frequency + f->afc_delta)) / 16.0);
MT2032_tune(f,
(1.0 * f->original_frequency+ 0.5 * f->afc_delta) / 16.0,
0.03125);
if (f->last_afc_hint == TUNER_OFF)
return 0;
return 1; /* call me again */ return 1; /* call me again */
} else } else {
{ f->last_afc_hint = FI1236_get_afc_hint(f);
f->last_afc_hint=FI1236_get_afc_hint(f); if (f->last_afc_hint == TUNER_TUNED) {
if(f->last_afc_hint==TUNER_TUNED)
{
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "AFC: TUNER_TUNNED\n"); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "AFC: TUNER_TUNNED\n");
return 0; return 0;
} }
if(f->afc_count>3)f->last_afc_hint=TUNER_OFF; if (f->afc_count > 3)
if(f->last_afc_hint==TUNER_OFF) f->last_afc_hint = TUNER_OFF;
{
if (f->last_afc_hint == TUNER_OFF)
f->afc_delta=0; f->afc_delta=0;
} else else
f->afc_delta+=f->last_afc_hint; f->afc_delta+=f->last_afc_hint;
xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO, "AFC: Setting tuner frequency to %g\n", (0.5*(2*f->original_frequency+f->afc_delta))/16.0);
FI1236_tune(f, f->original_frequency+f->afc_delta); xf86DrvMsg(f->d.pI2CBus->scrnIndex, X_INFO,
if(f->last_afc_hint==TUNER_OFF)return 0; "AFC: Setting tuner frequency to %g\n",
(0.5 * (2 * f->original_frequency + f->afc_delta)) / 16.0);
FI1236_tune(f, f->original_frequency + f->afc_delta);
if (f->last_afc_hint == TUNER_OFF)
return 0;
return 1; /* call me again */ return 1; /* call me again */
} }
return 0; /* done */ return 0; /* done */
} }
void fi1236_dump_status(FI1236Ptr f) void
fi1236_dump_status(FI1236Ptr f)
{ {
if(f->type==TUNER_TYPE_MT2032){ if (f->type == TUNER_TYPE_MT2032)
MT2032_dump_status(f); MT2032_dump_status(f);
}
} }

View File

@ -334,6 +334,10 @@ as root (i.e, with real-uid 0).
.B \-nosilk .B \-nosilk
Disable Silken Mouse support. Disable Silken Mouse support.
.TP 8 .TP 8
.B \-novtswitch
Disable the automatic switching on X server reset and shutdown to the
VT that was active when the server started, if supported by the OS.
.TP 8
.B \-pixmap24 .B \-pixmap24
Set the internal pixmap format for depth 24 pixmaps to 24 bits per pixel. Set the internal pixmap format for depth 24 pixmaps to 24 bits per pixel.
The default is usually 32 bits per pixel. There is normally little The default is usually 32 bits per pixel. There is normally little
@ -376,6 +380,9 @@ and
.B \-ggamma .B \-ggamma
options. options.
.TP 8 .TP 8
.B \-sharevts
Share virtual terminals with another X server, if supported by the OS.
.TP 8
.BI \-screen " screen-name" .BI \-screen " screen-name"
Use the __xconfigfile__(__filemansuffix__) file Use the __xconfigfile__(__filemansuffix__) file
.B Screen .B Screen

View File

@ -45,7 +45,6 @@ static int devConsoleFd = -1;
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT) #if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
static int VTnum = -1; static int VTnum = -1;
static int initialVT = -1; static int initialVT = -1;
static Bool ShareVTs = FALSE;
#endif #endif
#ifdef PCCONS_SUPPORT #ifdef PCCONS_SUPPORT
@ -266,7 +265,7 @@ xf86OpenConsole()
} }
#endif #endif
acquire_vt: acquire_vt:
if (!ShareVTs) { if (!xf86Info.ShareVTs) {
/* /*
* now get the VT * now get the VT
*/ */
@ -304,7 +303,7 @@ acquire_vt:
{ {
FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed"); FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed");
} }
} else { /* ShareVTs */ } else { /* xf86Info.ShareVTs */
close(xf86Info.consoleFd); close(xf86Info.consoleFd);
} }
break; break;
@ -320,7 +319,8 @@ acquire_vt:
{ {
/* serverGeneration != 1 */ /* serverGeneration != 1 */
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT) #if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
if (!ShareVTs) if (xf86Info.consType == SYSCONS || xf86Info.consType == PCVT) if (!xf86Info.ShareVTs &&
(xf86Info.consType == SYSCONS || xf86Info.consType == PCVT))
{ {
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0) if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0)
{ {
@ -393,7 +393,7 @@ xf86OpenSyscons()
if (ioctl(fd, VT_GETACTIVE, &initialVT) < 0) if (ioctl(fd, VT_GETACTIVE, &initialVT) < 0)
initialVT = -1; initialVT = -1;
#endif #endif
if (ShareVTs) if (xf86Info.ShareVTs)
xf86Info.vtno = initialVT; xf86Info.vtno = initialVT;
if (xf86Info.vtno == -1) if (xf86Info.vtno == -1)
@ -655,7 +655,7 @@ xf86CloseConsole()
struct vt_mode VT; struct vt_mode VT;
#endif #endif
if (ShareVTs) return; if (xf86Info.ShareVTs) return;
switch (xf86Info.consType) switch (xf86Info.consType)
{ {
@ -723,11 +723,6 @@ xf86ProcessArgument(int argc, char *argv[], int i)
return 1; return 1;
} }
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT) #if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
if (!strcmp(argv[i], "-sharevts"))
{
ShareVTs = TRUE;
return 1;
}
if ((argv[i][0] == 'v') && (argv[i][1] == 't')) if ((argv[i][0] == 'v') && (argv[i][1] == 't'))
{ {
if (sscanf(argv[i], "vt%2d", &VTnum) == 0 || if (sscanf(argv[i], "vt%2d", &VTnum) == 0 ||

View File

@ -39,8 +39,6 @@
#include <sys/stat.h> #include <sys/stat.h>
static Bool KeepTty = FALSE; static Bool KeepTty = FALSE;
static Bool VTSwitch = TRUE;
static Bool ShareVTs = FALSE;
static int activeVT = -1; static int activeVT = -1;
static char vtname[11]; static char vtname[11];
@ -109,7 +107,7 @@ xf86OpenConsole(void)
"xf86OpenConsole: Cannot open /dev/tty0 (%s)\n", "xf86OpenConsole: Cannot open /dev/tty0 (%s)\n",
strerror(errno)); strerror(errno));
if (ShareVTs) if (xf86Info.ShareVTs)
{ {
SYSCALL(ret = ioctl(fd, VT_GETSTATE, &vts)); SYSCALL(ret = ioctl(fd, VT_GETSTATE, &vts));
if (ret < 0) if (ret < 0)
@ -184,7 +182,7 @@ xf86OpenConsole(void)
} }
#endif #endif
if (!ShareVTs) if (!xf86Info.ShareVTs)
{ {
struct termios nTty; struct termios nTty;
@ -240,7 +238,7 @@ xf86OpenConsole(void)
* of Init?$#*&Device(). So I just place it here */ * of Init?$#*&Device(). So I just place it here */
} }
} else { /* serverGeneration != 1 */ } else { /* serverGeneration != 1 */
if (!ShareVTs && VTSwitch) if (!xf86Info.ShareVTs && xf86Info.autoVTSwitch)
{ {
/* now get the VT */ /* now get the VT */
switch_to(xf86Info.vtno, "xf86OpenConsole"); switch_to(xf86Info.vtno, "xf86OpenConsole");
@ -254,7 +252,7 @@ xf86CloseConsole(void)
struct vt_mode VT; struct vt_mode VT;
int ret; int ret;
if (ShareVTs) { if (xf86Info.ShareVTs) {
close(xf86Info.consoleFd); close(xf86Info.consoleFd);
return; return;
} }
@ -286,7 +284,7 @@ xf86CloseConsole(void)
strerror(errno)); strerror(errno));
} }
if (VTSwitch) if (xf86Info.autoVTSwitch)
{ {
/* /*
* Perform a switch back to the active VT when we were started * Perform a switch back to the active VT when we were started
@ -311,16 +309,7 @@ xf86ProcessArgument(int argc, char *argv[], int i)
KeepTty = TRUE; KeepTty = TRUE;
return 1; return 1;
} }
if (!strcmp(argv[i], "-novtswitch"))
{
VTSwitch = FALSE;
return 1;
}
if (!strcmp(argv[i], "-sharevts"))
{
ShareVTs = TRUE;
return 1;
}
if ((argv[i][0] == 'v') && (argv[i][1] == 't')) if ((argv[i][0] == 'v') && (argv[i][1] == 't'))
{ {
if (sscanf(argv[i], "vt%2d", &xf86Info.vtno) == 0) if (sscanf(argv[i], "vt%2d", &xf86Info.vtno) == 0)
@ -340,6 +329,4 @@ xf86UseMsg(void)
ErrorF("vtXX use the specified VT number\n"); ErrorF("vtXX use the specified VT number\n");
ErrorF("-keeptty "); ErrorF("-keeptty ");
ErrorF("don't detach controlling tty (for debugging only)\n"); ErrorF("don't detach controlling tty (for debugging only)\n");
ErrorF("-novtswitch don't immediately switch to new VT\n");
ErrorF("-sharevts share VTs with another X server\n");
} }

View File

@ -63,6 +63,22 @@ static char consoleDev[PATH_MAX] = "/dev/fb";
Used by hw/xfree86/common/xf86AutoConfig.c for VIS_GETIDENTIFIER */ Used by hw/xfree86/common/xf86AutoConfig.c for VIS_GETIDENTIFIER */
_X_HIDDEN char xf86SolarisFbDev[PATH_MAX] = "/dev/fb"; _X_HIDDEN char xf86SolarisFbDev[PATH_MAX] = "/dev/fb";
static void
switch_to(int vt, const char *from)
{
int ret;
SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_ACTIVATE, vt));
if (ret != 0)
xf86Msg(X_WARNING, "%s: VT_ACTIVATE failed: %s\n",
from, strerror(errno));
SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_WAITACTIVE, vt));
if (ret != 0)
xf86Msg(X_WARNING, "%s: VT_WAITACTIVE failed: %s\n",
from, strerror(errno));
}
void void
xf86OpenConsole(void) xf86OpenConsole(void)
{ {
@ -170,6 +186,11 @@ xf86OpenConsole(void)
xf86Info.vtno = VTnum; xf86Info.vtno = VTnum;
from = X_CMDLINE; from = X_CMDLINE;
} }
else if (xf86Info.ShareVTs)
{
xf86Info.vtno = vtinfo.v_active;
from = X_CMDLINE;
}
else else
{ {
if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) || if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) ||
@ -201,16 +222,15 @@ OPENCONSOLE:
chown(consoleDev, getuid(), getgid()); chown(consoleDev, getuid(), getgid());
#ifdef HAS_USL_VTS #ifdef HAS_USL_VTS
if (xf86Info.ShareVTs)
return;
if (vtEnabled) if (vtEnabled)
{ {
/* /*
* Now get the VT * Now get the VT
*/ */
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0) switch_to(xf86Info.vtno, "xf86OpenConsole");
xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) != 0)
xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n");
#ifdef VT_SET_CONSUSER /* added in snv_139 */ #ifdef VT_SET_CONSUSER /* added in snv_139 */
if (strcmp(display, "0") == 0) if (strcmp(display, "0") == 0)
@ -249,16 +269,13 @@ OPENCONSOLE:
else /* serverGeneration != 1 */ else /* serverGeneration != 1 */
{ {
#ifdef HAS_USL_VTS #ifdef HAS_USL_VTS
if (vtEnabled) if (vtEnabled && !xf86Info.ShareVTs)
{ {
/* /*
* Now re-get the VT * Now re-get the VT
*/ */
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0) if (xf86Info.autoVTSwitch)
xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n"); switch_to(xf86Info.vtno, "xf86OpenConsole");
if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) != 0)
xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n");
#ifdef VT_SET_CONSUSER /* added in snv_139 */ #ifdef VT_SET_CONSUSER /* added in snv_139 */
if (strcmp(display, "0") == 0) if (strcmp(display, "0") == 0)
@ -347,7 +364,8 @@ xf86CloseConsole(void)
} }
/* Activate the VT that X was started on */ /* Activate the VT that X was started on */
ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86StartVT); if (xf86Info.autoVTSwitch)
switch_to(xf86StartVT, "xf86CloseConsole");
} }
#endif /* HAS_USL_VTS */ #endif /* HAS_USL_VTS */

View File

@ -1,4 +1,3 @@
.\" $XFree86$
.TH CVT 1 __vendorversion__ .TH CVT 1 __vendorversion__
.SH NAME .SH NAME
cvt - calculate VESA CVT mode lines cvt - calculate VESA CVT mode lines
@ -32,7 +31,7 @@ Create a mode with reduced blanking. This allows for higher frequency signals,
with a lower or equal dotclock. Not for Cathode Ray Tube based displays though. with a lower or equal dotclock. Not for Cathode Ray Tube based displays though.
.SH "SEE ALSO" .SH "SEE ALSO"
__xconfigfile__(__filemansuffix__) __xconfigfile__(__filemansuffix__), gtf(__appmansuffix__)
.SH AUTHOR .SH AUTHOR
Luc Verhaegen. Luc Verhaegen.
.PP .PP

View File

@ -1,4 +1,3 @@
.\" $XFree86$
.TH GTF 1 __vendorversion__ .TH GTF 1 __vendorversion__
.SH NAME .SH NAME
gtf - calculate VESA GTF mode lines gtf - calculate VESA GTF mode lines
@ -35,7 +34,7 @@ default format.
Print the mode parameters in a format suitable for Print the mode parameters in a format suitable for
.BR fbset(8) . .BR fbset(8) .
.SH "SEE ALSO" .SH "SEE ALSO"
__xconfigfile__(__filemansuffix__) __xconfigfile__(__filemansuffix__), cvt(__appmansuffix__)
.SH AUTHOR .SH AUTHOR
Andy Ritger. Andy Ritger.
.PP .PP

View File

@ -57,12 +57,11 @@ extern _X_EXPORT void ReplyNotSwappd (
void * /* pbuf */) _X_NORETURN; void * /* pbuf */) _X_NORETURN;
typedef enum {ClientStateInitial, typedef enum {ClientStateInitial,
ClientStateAuthenticating, /* 1 is unused now, was ClientStateAuthenticating */
ClientStateRunning, ClientStateRunning = 2,
ClientStateRetained, ClientStateRetained,
ClientStateGone, ClientStateGone
ClientStateCheckingSecurity, } ClientState;
ClientStateCheckedSecurity} ClientState;
#ifdef XFIXES #ifdef XFIXES
typedef struct _saveSet { typedef struct _saveSet {