⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radeon_mm_i2c.c

📁 x.org上有关ati系列显卡最新驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
        {"Philips FI1236 (or compatible)"               , TUNER_TYPE_FI1236},        {"Philips FI1256 (or compatible)"               , TUNER_TYPE_FI1256},        {"Philips FI1236 (or compatible)"               , TUNER_TYPE_FI1236},        {"Philips FI1216 (or compatible)"               , TUNER_TYPE_FI1216},        {"Philips FI1246 (or compatible)"               , TUNER_TYPE_FI1246},        {"Philips FI1216MF (or compatible)"             , TUNER_TYPE_FI1216},        {"Philips FI1236 (or compatible)"               , TUNER_TYPE_FI1236},        {"TEMIC-FN5AL"          , TUNER_TYPE_TEMIC_FN5AL},        {"FQ1216ME/P"           , TUNER_TYPE_FI1216},        {"FI1236W"              , TUNER_TYPE_FI1236W},	{"Philips FI1216ME (or compatible)"             , TUNER_TYPE_FM1216ME},        /*{"Alps TSCxx"           , -1},*/	{"Philips FM1236/F"     , TUNER_TYPE_FI1236W},	{"Philips FI1216ME (or compatible)"             , TUNER_TYPE_FM1216ME},        {"UNKNOWN-19"           , -1},        {"UNKNOWN-20"           , -1},        {"UNKNOWN-21"           , -1},        {"UNKNOWN-22"           , -1},        {"UNKNOWN-23"           , -1},        {"UNKNOWN-24"           , -1},        {"UNKNOWN-25"           , -1},        {"UNKNOWN-26"           , -1},        {"UNKNOWN-27"           , -1},        {"UNKNOWN-28"           , -1},        {"Microtuner MT2032"            , TUNER_TYPE_MT2032},        {"Microtuner MT2032"            , TUNER_TYPE_MT2032},        {"UNKNOWN-31"           , -1}    };void RADEONResetI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv){    RADEONInfoPtr info = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    RADEONWaitForFifo(pScrn, 2);    OUTREG8(RADEON_I2C_CNTL_1+2, ((I2C_SEL | I2C_EN)>>16));    OUTREG8(RADEON_I2C_CNTL_0+0, (I2C_DONE | I2C_NACK | I2C_HALT | I2C_SOFT_RST | I2C_DRIVE_EN | I2C_DRIVE_SEL));}void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv){    double nm;    RADEONInfoPtr info = RADEONPTR(pScrn);    RADEONPLLPtr  pll = &(info->pll);    pPriv->i2c = NULL;    pPriv->fi1236 = NULL;    pPriv->msp3430 = NULL;    pPriv->tda9885 = NULL;	 pPriv->uda1380 = NULL;    #if 0 /* put back on when saa7114 support is present */    pPriv->saa7114 = NULL;    #endif        /* Blacklist chipsets that lockup - these are usually older mobility chips */    switch(info->Chipset){    	case PCI_CHIP_RADEON_LY:	case PCI_CHIP_RADEON_LZ:	     xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Detected Radeon Mobility M6, disabling multimedia i2c\n");	     return;	case PCI_CHIP_RADEON_LW:	     xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Detected Radeon Mobility M7, disabling multimedia i2c\n"); 	     return;	case PCI_CHIP_RV250_If:	     xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Detected Radeon 9000 - skipping multimedia i2c initialization code.\n");	     return;	case PCI_CHIP_RV370_5460:	     xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Detected Radeon Mobility X300, disabling multimedia i2c\n");	     return;	}        /* no multimedia capabilities detected and no information was provided to substitute for it */    if(!info->MM_TABLE_valid  &&        !(info->tunerType>=0))    {       xf86DrvMsg(pScrn->scrnIndex, X_INFO, "No video input capabilities detected and no information is provided - disabling multimedia i2c\n");       return;    }        if(pPriv->i2c!=NULL) return;  /* for some reason we are asked to init it again.. Stop ! */        if(!xf86LoadSubModule(pScrn,"i2c"))     {        xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"Unable to initialize i2c bus\n");        pPriv->i2c = NULL;        return;    }     xf86LoaderReqSymbols("xf86CreateI2CBusRec",                           "xf86I2CBusInit",                          "xf86DestroyI2CBus",                          "xf86CreateI2CDevRec",                          "xf86DestroyI2CDevRec",                          "xf86I2CDevInit",                          "xf86I2CWriteRead",                          NULL);    pPriv->i2c=CreateI2CBusRec();    pPriv->i2c->scrnIndex=pScrn->scrnIndex;    pPriv->i2c->BusName="Radeon multimedia bus";    pPriv->i2c->DriverPrivate.ptr=(pointer)pPriv;    switch(info->ChipFamily){    	case CHIP_FAMILY_RV350:    	case CHIP_FAMILY_R350:    	case CHIP_FAMILY_R300:	case CHIP_FAMILY_RV250:    	case CHIP_FAMILY_R200:		case CHIP_FAMILY_RV200:            	pPriv->i2c->I2CWriteRead=R200_I2CWriteRead;            	xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Using R200 i2c bus access method\n");		break;	default:            	pPriv->i2c->I2CWriteRead=RADEONI2CWriteRead;            	xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Using Radeon bus access method\n");        }    if(!I2CBusInit(pPriv->i2c))    {        xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"Failed to register i2c bus\n");    }#if 1    switch(info->ChipFamily){	case CHIP_FAMILY_RV200:            nm=(pll->reference_freq * 40000.0)/(1.0*I2C_CLOCK_FREQ);	    break;    	case CHIP_FAMILY_R300:    	case CHIP_FAMILY_R200:    	    if(info->MM_TABLE_valid && (RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].type==TUNER_TYPE_MT2032)){                nm=(pll->reference_freq * 40000.0)/(4.0*I2C_CLOCK_FREQ);	        break;                } 	default:            nm=(pll->reference_freq * 10000.0)/(4.0*I2C_CLOCK_FREQ);        }#else    nm=(pll->xclk * 40000.0)/(1.0*I2C_CLOCK_FREQ);         #endif    for(pPriv->radeon_N=1; pPriv->radeon_N<255; pPriv->radeon_N++)          if((pPriv->radeon_N * (pPriv->radeon_N-1)) > nm)break;    pPriv->radeon_M=pPriv->radeon_N-1;    pPriv->radeon_i2c_timing=2*pPriv->radeon_N;#if 0    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ref=%d M=0x%02x N=0x%02x timing=0x%02x\n", pll->reference_freq, pPriv->radeon_M, pPriv->radeon_N, pPriv->radeon_i2c_timing);    pPriv->radeon_M=0x32;    pPriv->radeon_N=0x33;    pPriv->radeon_i2c_timing=2*pPriv->radeon_N;#endif    RADEONResetI2C(pScrn, pPriv);    #if 0 /* I don't know whether standalone boards are supported with Radeons */      /* looks like none of them have AMC connectors anyway */    if(!info->MM_TABLE_valid)RADEON_read_eeprom(pPriv);#endif            if(!xf86LoadSubModule(pScrn,"fi1236"))    {       xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize fi1236 driver\n");    }    else    {    xf86LoaderReqSymbols(FI1236SymbolsList, NULL);    if(pPriv->fi1236 == NULL)    {        pPriv->fi1236 = xf86_Detect_FI1236(pPriv->i2c, FI1236_ADDR_1);    }    if(pPriv->fi1236 == NULL)    {        pPriv->fi1236 = xf86_Detect_FI1236(pPriv->i2c, FI1236_ADDR_2);    }    }    if(pPriv->fi1236 != NULL)    {         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Detected %s device at 0x%02x\n",                RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].name,               FI1236_ADDR(pPriv->fi1236));         if(info->MM_TABLE_valid)xf86_FI1236_set_tuner_type(pPriv->fi1236, RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].type);                else {                   xf86DrvMsg(pScrn->scrnIndex, X_INFO, "MM_TABLE not found (standalone board ?), forcing tuner type to NTSC\n");                    xf86_FI1236_set_tuner_type(pPriv->fi1236, TUNER_TYPE_FI1236);                }    }        if(info->MM_TABLE_valid && (RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].type==TUNER_TYPE_MT2032)){    if(!xf86LoadSubModule(pScrn,"tda9885"))    {       xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize tda9885 driver\n");    }    else        {    xf86LoaderReqSymbols(TDA9885SymbolsList, NULL);    if(pPriv->tda9885 == NULL)    {        pPriv->tda9885 = xf86_Detect_tda9885(pPriv->i2c, TDA9885_ADDR_1);    }    if(pPriv->tda9885 == NULL)    {        pPriv->tda9885 = xf86_Detect_tda9885(pPriv->i2c, TDA9885_ADDR_2);    }    if(pPriv->tda9885 != NULL)    {        RADEON_TDA9885_Init(pPriv);    }    }    }	if(info->MM_TABLE_valid && ((RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].type==TUNER_TYPE_FM1216ME)							|| (RADEON_tuners[info->MM_TABLE.tuner_type & 0x1f].type==TUNER_TYPE_FI1236W)))	{		if(!xf86LoadSubModule(pScrn,"tda9885"))		{			xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize tda9885 driver\n");		}		else		{			xf86LoaderReqSymbols(TDA9885SymbolsList, NULL);			if(pPriv->tda9885 == NULL)			{				pPriv->tda9885 = xf86_Detect_tda9885(pPriv->i2c, TDA9885_ADDR_1);			}			if(pPriv->tda9885 == NULL)			{				pPriv->tda9885 = xf86_Detect_tda9885(pPriv->i2c, TDA9885_ADDR_2);			}			if(pPriv->tda9885 != NULL)			{				RADEON_TDA9885_Init(pPriv);				pPriv->fi1236->afc_source = (void*)pPriv->tda9885;			}		}	}		if(!xf86LoadSubModule(pScrn,"uda1380"))	{		xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize uda1380 driver\n");	}	else    	{		xf86LoaderReqSymbols(UDA1380SymbolsList, NULL);		if(pPriv->uda1380 == NULL)		{			pPriv->uda1380 = xf86_Detect_uda1380(pPriv->i2c, UDA1380_ADDR_1);		}		if(pPriv->uda1380 == NULL)		{			pPriv->uda1380 = xf86_Detect_uda1380(pPriv->i2c, UDA1380_ADDR_2);		}		if(pPriv->uda1380 != NULL)		{			xf86_uda1380_init(pPriv->uda1380);		}	}        if(!xf86LoadSubModule(pScrn,"msp3430"))    {       xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize msp3430 driver\n");    }     else     {    xf86LoaderReqSymbols(MSP3430SymbolsList, NULL);    if(pPriv->msp3430 == NULL)    {       pPriv->msp3430 = xf86_DetectMSP3430(pPriv->i2c, MSP3430_ADDR_1);    }    if(pPriv->msp3430 == NULL)    {       pPriv->msp3430 = xf86_DetectMSP3430(pPriv->i2c, MSP3430_ADDR_2);    }#if 0 /* this would confuse bt829 with msp3430 */    if(pPriv->msp3430 == NULL)    {       pPriv->msp3430 = xf86_DetectMSP3430(pPriv->i2c, MSP3430_ADDR_3);    }#endif    }    if(pPriv->msp3430 != NULL)    {       xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Detected MSP3430 at 0x%02x\n",                  MSP3430_ADDR(pPriv->msp3430));       pPriv->msp3430->standard = MSP3430_NTSC;       pPriv->msp3430->connector = MSP3430_CONNECTOR_1;       xf86_ResetMSP3430(pPriv->msp3430);       xf86_InitMSP3430(pPriv->msp3430);       xf86_MSP3430SetVolume(pPriv->msp3430, pPriv->mute ? MSP3430_FAST_MUTE : MSP3430_VOLUME(pPriv->volume));    }    #if 0 /* put this back when saa7114 driver is ready */    if(!xf86LoadSubModule(pScrn,"saa7114"))    {       xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to initialize saa7114 driver\n");    }     else     {    xf86LoaderReqSymbols(SAA7114SymbolsList, NULL);    if(pPriv->saa7114 == NULL)    {       pPriv->saa7114 = xf86_DetectSAA7114(pPriv->i2c, SAA7114_ADDR_1);    }    if(pPriv->saa7114 == NULL)    {       pPriv->saa7114 = xf86_DetectSAA7114(pPriv->i2c, SAA7114_ADDR_2);    }    }    if(pPriv->saa7114 != NULL)    {       xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Detected SAA7114 at 0x%02x\n",                  pPriv->saa7114->d.SlaveAddr);       xf86_InitSAA7114(pPriv->saa7114);    }#endif}static void RADEON_TDA9885_Init(RADEONPortPrivPtr pPriv){TDA9885Ptr t=pPriv->tda9885;t->sound_trap=0;t->auto_mute_fm=1; /* ? */t->carrier_mode=0; /* ??? */t->modulation=2; /* negative FM */t->forced_mute_audio=0;t->port1=1;t->port2=1;t->top_adjustment=0x10;t->deemphasis=1; t->audio_gain=0;t->minimum_gain=0;t->gating=0; t->vif_agc=1; /* set to 1 ? - depends on design */t->gating=0; }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -