Exemplo n.º 1
0
uint16_t i2c_helper::smbus_process_call( uint8_t cmd, uint16_t value )
{
    i2c_smbus_data data;
    data.word = value;
    smbus_write( cmd, &data, I2C_SMBUS_PROC_CALL );
    return data.word;
}
Exemplo n.º 2
0
static void smbus_enable(int offset, int bit)
{
	unsigned int cfg = smbus_read(offset);

	cfg |= bit;
	smbus_write(offset, cfg);
}
Exemplo n.º 3
0
void i2c_helper::smbus_write_block_broken( uint8_t cmd,
        const uint8_t *data,
        uint8_t length )
{
    i2c_smbus_data ldata;
    uint8_t len = length > I2C_SMBUS_BLOCK_MAX
                  ? I2C_SMBUS_BLOCK_MAX : length;
    ldata.block[0] = len;
    memcpy( &ldata.block[1], data, len );
    smbus_write( cmd, &ldata, I2C_SMBUS_I2C_BLOCK_BROKEN );
}
Exemplo n.º 4
0
std::string i2c_helper::smbus_block_process_call( uint8_t cmd,
        const std::string &data )
{
    i2c_smbus_data ldata;
    uint8_t len = data.size( ) > I2C_SMBUS_BLOCK_MAX
                  ? I2C_SMBUS_BLOCK_MAX
                  : static_cast<uint8_t>( data.size( ) );
    ldata.block[0] = len;
    memcpy( &ldata.block[1], len ? &data[0] : "", len );
    smbus_write( cmd, &ldata, I2C_SMBUS_BLOCK_PROC_CALL );
    return std::string( &ldata.block[1], &ldata.block[1] + ldata.block[0] );
}
Exemplo n.º 5
0
/*
 * hpet address assignation and irq setting should be done in bios.
 * but pmon don't do this, we just setup here directly.
 * The operation under is normal. unfortunately, hpet_setup process
 * is before pci initialize.
 *
 * {
 *	struct pci_dev *pdev;
 *
 *	pdev = pci_get_device(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS, NULL);
 *	pci_write_config_word(pdev, SMBUS_PCI_REGB4, HPET_ADDR);
 *
 *	...
 * }
 */
static void hpet_setup(void)
{
	/* set hpet base address */
	smbus_write(SMBUS_PCI_REGB4, HPET_ADDR);

	/* enable decodeing of access to HPET MMIO*/
	smbus_enable(SMBUS_PCI_REG40, (1 << 28));

	/* HPET irq enable */
	smbus_enable(SMBUS_PCI_REG64, (1 << 10));

	hpet_enable_legacy_int();
}
Exemplo n.º 6
0
uint8_t i2c_helper::smbus_block_process_call( uint8_t cmd,
        uint8_t *data,
        uint8_t len )
{
    i2c_smbus_data ldata;

    len = len > I2C_SMBUS_BLOCK_MAX ? I2C_SMBUS_BLOCK_MAX : len;

    memcpy( &ldata.block[1], data, len );

    smbus_write( cmd, &ldata, I2C_SMBUS_BLOCK_PROC_CALL );

    memcpy( data, &ldata.block[1], ldata.block[0] );

    return ldata.block[0];
}
void VIA_TVInit(ScrnInfoPtr pScrn)
{
    TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
    unsigned char idx=0;
    unsigned char i;
    unsigned char protect;
    unsigned char TV_CRTC[TVX_CRTC_NUM] =
       { 0xC0,0xD0,0xD1,0xD2,0xD3,0xE0,0xE3,0xE4,0xE5,
         0xE6,0xE7,0xF0,0xF1,0xF6,0xFE,0xFF  };
    unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={
                  0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09,
		  0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14,
		  0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D,
		  0X1E,0X1F,0X20,0X21,0X3D
                  };

#ifdef DEBUG_CODE_TRACE
    ErrorF("VIAB3D: VIA_TVInit:\n");
#endif

    if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 0)
    {
       /* Overlay window 1 position OK */
       ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x8(16) NTSC\n");
       idx=0;
       pTrident->OverrideHsync=-71;
       pTrident->OverrideVsync=15;
     }
    else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 0)
    {
       /* Overlay window 1 position OK */
       ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x8(16) NTSC\n");
       idx=1;
       pTrident->OverrideHsync=-152;
       pTrident->OverrideVsync=72;
       }
    else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && pScrn->depth==24 && pTrident->TVSignalMode == 0)
    {
       ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x32 NTSC\n");
       idx=2;
       pTrident->OverrideHsync=-65;
       pTrident->OverrideVsync=14;
       }
    else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && pScrn->depth==24 && pTrident->TVSignalMode == 0)
    {
       ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x32 NTSC\n");
       idx=3;
       pTrident->OverrideHsync=-158;
       pTrident->OverrideVsync=72;
       }
    else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 1)
    {
       /* Overlay window 1 position OK */
       ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x8(16) PAL\n");
       idx=4;
       pTrident->OverrideHsync=2;
       pTrident->OverrideVsync=65;
       }
    else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 1)
    {
       ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x8(16) PAL\n");
       /* patch TV screen defection */
       idx=5;
       /* patch 800x600 screen defect */
       OUTB(0x3d4,0x2f);
       OUTB(0x3d5,0xbf);
       pTrident->OverrideHsync=-145;
       pTrident->OverrideVsync=43;
       }
    else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && pScrn->depth==24 && pTrident->TVSignalMode == 1)
    {
       ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x32 PAL\n");
       idx=6;
       pTrident->OverrideHsync=0;
       pTrident->OverrideVsync=63;
       }
    else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && pScrn->depth==24 && pTrident->TVSignalMode == 1)
    {
       ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x32 PAL\n");
       idx=7;
       OUTB(0x3d4,0x2f);
       OUTB(0x3d5,0xbf);
       pTrident->OverrideHsync=-141;
       pTrident->OverrideVsync=42;
       }
    else
    {
       ErrorF("VIAB3D: VIA_TVInit: TV Params default mode\n");
       return;
    }

    /* Unprotect */
    OUTB(0x3C4, 0x11);
    protect = INB(0x3C5);
    OUTB(0x3C5, 0x92);

    /* Set TV hw environment */
    OUTB(0x3c4,0x24);
    OUTB(0x3c5,0x4f);
    OUTB(0x3d4,0xc1);
    OUTB(0x3d5,0x41);
    OUTB(0x3ce,0x23);
    OUTB(0x3cf,0x88);

    /* set CRT + TV */
    OUTB(0x3CE,0x33);
    OUTB(0x3CF,0x20);

    /* set CRTC */
    for( i = 0; i < TVX_CRTC_NUM; i++ )
    {
         OUTB(0x3D4, TV_CRTC[i]);

	 if (pTrident->TVChipset==2) {
            OUTB(0x3D5, TV_CH7005C_Table[idx][i]);
	 }
	 else {
	    OUTB(0x3D5, TVX_VT1621_Table[idx][i]);
	 }
    }


    /* Digital TV interface control */
    switch (pTrident->TVChipset)
    {
           case 1: OUTB(0x3C4,0xD8);
                   OUTB(0x3C5,0x60);
                   OUTB(0x3C4,0xD9);
                   OUTB(0x3C5,0x38);
		   break;
           case 2: OUTB(0x3c4,0xd8);
	           OUTB(0x3c5,0x24);
                   OUTB(0x3C4,0xD9);
                   OUTB(0x3C5,0x18);
		   break;
    }

    switch (pTrident->TVChipset)
    {
           case 1:
                  /* set TVX registers */
                  for (i=0; i < TVX_REG_NUM; i++ )
                  {
                      smbus_write(pScrn,TVX_VT1621_Table[idx][TVX_CRTC_NUM+i], i, TVX_VT1621_PORT);
                  }
		  break;
           case 2:
	          for (i=0; i<TV_CH7005C_TVREG_NUM; i++)
		  {
                      smbus_write(pScrn,TV_CH7005C_Table[idx][TV_CH7005C_CRTC_NUM+i], TV_CH7005C_RegIdx[i], TV_CH7005C_PORT);
		  }
	          break;
    }

    /*VIA_DumpReg(pScrn);*/

    /* protect */
    OUTB(0x3C4, 0x11);
    OUTB(0x3C5, protect);
}
void VIA_RestoreTVDependVGAReg(ScrnInfoPtr pScrn)
{
    TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
    unsigned char protect;
    unsigned char bTmp;
    int i;
    unsigned char VGA_RegIdx_about_TV[VGA_REGNUM_ABOUT_TV]={
                  0xD8,0XD9,/* SR */
                  0X33,/* GR */
                  0XC0,0XD0,0XD1,0XD2,0XD3,0XE0,0XE3,0XE4,0XE5,/* CR */
                  0XE6,0XE7,0XF0,0XF1,0XF6,0XFE,0XFF
                  };
    unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={
                  0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09,
		  0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14,
		  0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D,
		  0X1E,0X1F,0X20,0X21,0X3D
                  };

    /*ErrorF("VIAB3D: VIA_RestoreTVDependVGAReg:\n");*/

    /* Unprotect */
    OUTB(0x3C4, 0x11);
    protect = INB(0x3C5);
    OUTB(0x3C5, 0x92);

    /* Set TV Hw environment */
    OUTB(0x3d4,0xc1);
    OUTB(0x3d5,0x41);

    /* SR_d8,SR_d9 */
    for (i=0; i<2; i++)
    {
        OUTB(0x3c4,VGA_RegIdx_about_TV[i]);
        bTmp=pTrident->DefaultTVDependVGASetting[i];
        OUTB(0x3c5,bTmp);
    }
    /* GR_33 */
    OUTB(0x3ce,0x33);
    bTmp=pTrident->DefaultTVDependVGASetting[2];
    OUTB(0x3cf,bTmp);

    /* CR_c0,d0,d1,d2,d3,e0,e3,e4,e5,e6,e7,f0,f1,f6,fe,ff */
    for (i=3; i<VGA_REGNUM_ABOUT_TV; i++)
    {
        OUTB(0x3d4,VGA_RegIdx_about_TV[i]);
        bTmp=pTrident->DefaultTVDependVGASetting[i];
        OUTB(0x3d5,bTmp);
    }
    switch (pTrident->TVChipset)
    {
         case 1:
                for (i=0; i<TVX_REG_NUM; i++)
                {
                    bTmp=pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i];
                    smbus_write(pScrn,bTmp,i,TVX_VT1621_PORT);
		}
		break;
         case 2:
	        for (i=0; i<TV_CH7005C_TVREG_NUM; i++)
		{
                    bTmp=pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i];
                    smbus_write(pScrn,bTmp,TV_CH7005C_RegIdx[i],TV_CH7005C_PORT);
		}
		break;
       default:
             ErrorF("VIAB3D: VIA_SaveTVDepentVGAReg: Wrong Chipset setting\n");
	     break;
    }
    /* protect */
    OUTB(0x3C4, 0x11);
    OUTB(0x3C5, protect);
}
Exemplo n.º 9
0
void i2c_helper::smbus_write_word_data( uint8_t cmd, uint16_t value )
{
    i2c_smbus_data data;
    data.word = value;
    smbus_write( cmd, &data, I2C_SMBUS_WORD_DATA );
}
Exemplo n.º 10
0
void i2c_helper::smbus_write_byte_data( uint8_t cmd, uint8_t value )
{
    i2c_smbus_data data;
    data.byte = value;
    smbus_write( cmd, &data, I2C_SMBUS_BYTE_DATA );
}
Exemplo n.º 11
0
void i2c_helper::smbus_write_byte( uint8_t value )
{
    smbus_write( value, NULL, I2C_SMBUS_BYTE );
}