こんにちは。浅原と申します。 Vine-Users の過去ログを検索してもみつからなかったので、とりあえずこちらに 投稿させて頂きます。すでに既出の話題でしたらごめんなさい。 私の使用マシンは、Panasonic CF-R1PCAXR (Let's NOTE Light)なのですが インストール時の X サーバでは、Ctr+Alt+F1 といったキーコンビネーションで コンソールに落ちることができなかったりして、いまひとつ安心して X を使え なかったのですが、XFree86 の CVS からとってきた smi ドライバだと、 随分マシな動作をしてくれます。 元ネタは、以下のページです。 http://www.d1.dion.ne.jp/~tnaka/pc_linux/lets2.html cat /proc/pci では以下のようなチップです。 VGA compatible controller: Silicon Motion, Inc. SM720 Lynx3DM (rev 193). 昨日、apt-get upgrade で XFree86 もアップデートされていたようですが、 smi ドライバに関しては新しくなっていないようでしたので、 もし、同じようなチップを使っていらっしゃる方は、パッチを当ててみては 如何でしょうか。 私のところでは、XFree86-4.2.0-0vl18 の srpm に以下のパッチがうまく 当たってパッケージにできています。 それでは、失礼致します。 -- 浅原 雄一 <yuasaha@xxxxxxxxxxxxxxxxx>
diff -uNr xc/programs/Xserver/hw/xfree86/drivers/siliconmotion.orig/regsmi.h xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/regsmi.h --- xc/programs/Xserver/hw/xfree86/drivers/siliconmotion.orig/regsmi.h Tue Nov 28 20:59:19 2000 +++ xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/regsmi.h Fri Jan 25 21:56:09 2002 @@ -26,7 +26,7 @@ sale, use or other dealings in this Software without prior written authorization from the XFree86 Project and SIlicon Motion. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/regsmi.h,v 1.1 2000/11/28 20:59:19 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/regsmi.h,v 1.2 2002/01/25 21:56:09 tsi Exp $ */ #ifndef _REGSMI_H #define _REGSMI_H @@ -57,8 +57,8 @@ } else { - outb(indexPort, index); - return(inb(dataPort)); + outb(pSmi->PIOBase + indexPort, index); + return(inb(pSmi->PIOBase + dataPort)); } } @@ -72,8 +72,8 @@ } else { - outb(indexPort, index); - outb(dataPort, data); + outb(pSmi->PIOBase + indexPort, index); + outb(pSmi->PIOBase + dataPort, data); } } @@ -86,7 +86,7 @@ } else { - return(inb(port)); + return(inb(pSmi->PIOBase + port)); } } @@ -99,7 +99,7 @@ } else { - outb(port, data); + outb(pSmi->PIOBase + port, data); } } diff -uNr xc/programs/Xserver/hw/xfree86/drivers/siliconmotion.orig/smi.h xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi.h --- xc/programs/Xserver/hw/xfree86/drivers/siliconmotion.orig/smi.h Thu Dec 20 21:35:38 2001 +++ xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi.h Thu Apr 4 14:05:47 2002 @@ -26,7 +26,7 @@ sale, use or other dealings in this Software without prior written authorization from the XFree86 Project and Silicon Motion. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi.h,v 1.8 2001/12/20 21:35:38 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi.h,v 1.10 2002/04/04 14:05:47 eich Exp $ */ #ifndef _SMI_H #define _SMI_H @@ -88,6 +88,7 @@ /* Driver data structure; this should contain all needed info for a mode */ typedef struct { + Bool modeInit; CARD16 mode; CARD8 SR17, SR18, SR21, SR31, SR32, SR6A, SR6B, SR81, SRA0; CARD8 CR33, CR33_2, CR3A; @@ -149,6 +150,7 @@ CARD8 * DataPortBase; /* Base of data port */ int DataPortSize; /* Size of data port */ CARD8 * IOBase; /* Base of MMIO VGA ports */ + IOADDRESS PIOBase; /* Base of I/O ports */ unsigned char * FBBase; /* Base of FB */ CARD32 FBOffset; /* Current visual FB starting location */ diff -uNr xc/programs/Xserver/hw/xfree86/drivers/siliconmotion.orig/smi_driver.c xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_driver.c --- xc/programs/Xserver/hw/xfree86/drivers/siliconmotion.orig/smi_driver.c Fri Jan 4 21:22:34 2002 +++ xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_driver.c Thu Apr 4 14:05:47 2002 @@ -26,7 +26,7 @@ sale, use or other dealings in this Software without prior written authorization from The XFree86 Project or Silicon Motion. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_driver.c,v 1.20 2002/01/04 21:22:34 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_driver.c,v 1.24 2002/04/04 14:05:47 eich Exp $ */ #include "xf86Resources.h" #include "xf86RAC.h" @@ -256,6 +256,7 @@ "xf86DestroyI2CDevRec", "xf86I2CBusInit", "xf86I2CDevInit", + "xf86I2CReadBytes", "xf86I2CWriteByte", NULL }; @@ -291,7 +292,6 @@ "cfbScreenInit", "cfb16ScreenInit", "cfb24ScreenInit", - "cfb24_32ScreenInit", "cfb32ScreenInit", "cfb16BresS", "cfb24BresS", @@ -939,6 +939,7 @@ vgaIOBase = hwp->IOBase; vgaCRIndex = vgaIOBase + VGA_CRTC_INDEX_OFFSET; vgaCRReg = vgaIOBase + VGA_CRTC_DATA_OFFSET; + pSmi->PIOBase = hwp->PIOOffset; xf86ErrorFVerb(VERBLEV, "\tSMI_PreInit vgaCRIndex=%x, vgaIOBase=%x, " "MMIOBase=%x\n", vgaCRIndex, vgaIOBase, hwp->MMIOBase); @@ -1564,9 +1565,9 @@ xf86ExecX86int10(pSmi->pVbe->pInt10); /* Enable linear mode. */ - outb(VGA_SEQ_INDEX, 0x18); - tmp = inb(VGA_SEQ_DATA); - outb(VGA_SEQ_DATA, tmp | 0x01); + outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x18); + tmp = inb(pSmi->PIOBase + VGA_SEQ_DATA); + outb(pSmi->PIOBase + VGA_SEQ_DATA, tmp | 0x01); /* Enable DPR/VPR registers. */ tmp = VGAIN8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x21); @@ -1662,14 +1663,13 @@ } /* Restore the standard VGA registers */ - if (xf86IsPrimaryPci(pSmi->PciInfo)) - { - vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_ALL); - } - else - { - vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_MODE); - } + if (xf86IsPrimaryPci(pSmi->PciInfo)) { + vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_CMAP + | VGA_SR_FONTS); + } + + if (restore->modeInit) + vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_MODE); if (!SMI_LYNXM_SERIES(pSmi->Chipset)) { @@ -1981,12 +1981,13 @@ pEnt = xf86GetEntityInfo(pScrn->entityList[0]); - /* Save the chip/graphics state */ - SMI_Save(pScrn); - if (!pSmi->pVbe) { pSmi->pVbe = VBEInit(NULL, pEnt->index); } + + /* Save the chip/graphics state */ + SMI_Save(pScrn); + /* Zero the frame buffer, #258 */ memset(pSmi->FBBase, 0, pSmi->videoRAMBytes); @@ -2400,6 +2401,8 @@ return(FALSE); } + new->modeInit = TRUE; + if (pSmi->rotate) { pSmi->width = pScrn->virtualY; @@ -2412,8 +2415,8 @@ } pSmi->Bpp = pScrn->bitsPerPixel / 8; - outb(VGA_SEQ_INDEX, 0x17); - tmp = inb(VGA_SEQ_DATA); + outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x17); + tmp = inb(pSmi->PIOBase + VGA_SEQ_DATA); if (pSmi->pci_burst) { new->SR17 = tmp | 0x20; @@ -2423,17 +2426,17 @@ new->SR17 = tmp & ~0x20; } - outb(VGA_SEQ_INDEX, 0x18); - new->SR18 = inb(VGA_SEQ_DATA) | 0x11; + outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x18); + new->SR18 = inb(pSmi->PIOBase + VGA_SEQ_DATA) | 0x11; - outb(VGA_SEQ_INDEX, 0x21); - new->SR21 = inb(VGA_SEQ_DATA) & ~0x03; + outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x21); + new->SR21 = inb(pSmi->PIOBase + VGA_SEQ_DATA) & ~0x03; - outb(VGA_SEQ_INDEX, 0x31); - new->SR31 = inb(VGA_SEQ_DATA) & ~0xC0; + outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x31); + new->SR31 = inb(pSmi->PIOBase + VGA_SEQ_DATA) & ~0xC0; - outb(VGA_SEQ_INDEX, 0x32); - new->SR32 = inb(VGA_SEQ_DATA) & ~0x07; + outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x32); + new->SR32 = inb(pSmi->PIOBase + VGA_SEQ_DATA) & ~0x07; if (SMI_LYNXM_SERIES(pSmi->Chipset)) { new->SR32 |= 0x04; @@ -2539,11 +2542,10 @@ } } - - /* CZ 2.11.2001: for gamma correction (TODO: other chipsets?) */ - new->CCR66 = VGAIN8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x66); - if (pSmi->Chipset == SMI_LYNX3DM) { - switch (pScrn->bitsPerPixel) { + /* CZ 2.11.2001: for gamma correction (TODO: other chipsets?) */ + new->CCR66 = VGAIN8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x66); + if (pSmi->Chipset == SMI_LYNX3DM) { + switch (pScrn->bitsPerPixel) { case 8: new->CCR66 = (new->CCR66 & 0xF3) | 0x00; /* 6 bits-RAM */ break; @@ -2558,12 +2560,11 @@ default: LEAVE_PROC("SMI_ModeInit"); return(FALSE); - } - } - /* end CZ */ + } + } - outb(VGA_SEQ_INDEX, 0x30); - if (inb(VGA_SEQ_DATA) & 0x01) + outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x30); + if (inb(pSmi->PIOBase + VGA_SEQ_DATA) & 0x01) { new->SR21 = 0x00; } @@ -2755,7 +2756,7 @@ vgaRegPtr vgaSavePtr = &hwp->SavedReg; SMIRegPtr SMISavePtr = &pSmi->SavedReg; Bool ret; - + ENTER_PROC("SMI_CloseScreen"); if (pScrn->vtSema) @@ -2949,16 +2950,16 @@ vgaHWSetStdFuncs(hwp); /* Enable linear mode */ - outb(VGA_SEQ_INDEX, 0x18); - tmp = inb(VGA_SEQ_DATA); + outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x18); + tmp = inb(pSmi->PIOBase + VGA_SEQ_DATA); pSmi->SR18Value = tmp; /* PDR#521 */ - outb(VGA_SEQ_DATA, tmp | 0x11); + outb(pSmi->PIOBase + VGA_SEQ_DATA, tmp | 0x11); /* Enable 2D/3D Engine and Video Processor */ - outb(VGA_SEQ_INDEX, 0x21); - tmp = inb(VGA_SEQ_DATA); + outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x21); + tmp = inb(pSmi->PIOBase + VGA_SEQ_DATA); pSmi->SR21Value = tmp; /* PDR#521 */ - outb(VGA_SEQ_DATA, tmp & ~0x03); + outb(pSmi->PIOBase + VGA_SEQ_DATA, tmp & ~0x03); LEAVE_PROC("SMI_EnableMmio"); } @@ -2974,12 +2975,12 @@ vgaHWSetStdFuncs(hwp); /* Disable 2D/3D Engine and Video Processor */ - outb(VGA_SEQ_INDEX, 0x21); - outb(VGA_SEQ_DATA, pSmi->SR21Value); /* PDR#521 */ + outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x21); + outb(pSmi->PIOBase + VGA_SEQ_DATA, pSmi->SR21Value); /* PDR#521 */ /* Disable linear mode */ - outb(VGA_SEQ_INDEX, 0x18); - outb(VGA_SEQ_DATA, pSmi->SR18Value); /* PDR#521 */ + outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x18); + outb(pSmi->PIOBase + VGA_SEQ_DATA, pSmi->SR18Value); /* PDR#521 */ LEAVE_PROC("SMI_DisableMmio"); } diff -uNr xc/programs/Xserver/hw/xfree86/drivers/siliconmotion.orig/smi_video.c xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_video.c --- xc/programs/Xserver/hw/xfree86/drivers/siliconmotion.orig/smi_video.c Thu Dec 20 21:35:39 2001 +++ xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_video.c Thu Apr 4 14:05:47 2002 @@ -1,5 +1,4 @@ /* Header: //Mercury/Projects/archives/XFree86/4.0/smi_video.c.-arc 1.14 30 Nov 2000 16:51:40 Frido $ */ - /* Copyright (C) 1994-1999 The XFree86 Project, Inc. All Rights Reserved. Copyright (C) 2000 Silicon Motion, Inc. All Rights Reserved. @@ -41,7 +40,7 @@ Date: 2.11.2001 */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_video.c,v 1.6 2001/12/20 21:35:39 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/siliconmotion/smi_video.c,v 1.7 2002/04/04 14:05:47 eich Exp $ */ #include "smi.h" #include "smi_video.h" @@ -134,7 +133,9 @@ BoxPtr dstBox, short vid_w, short vid_h, short drw_w, short drw_h); static void SMI_BlockHandler(int i, pointer blockData, pointer pTimeout, pointer pReadMask); +#if 0 static void SMI_WaitForSync(ScrnInfoPtr pScrn); +#endif /*static int SMI_SendI2C(ScrnInfoPtr pScrn, CARD8 device, char *devName, SMI_I2CDataPtr i2cData);*/ @@ -263,7 +264,7 @@ /* fixed order! */ -static XF86AttributeRec SMI_VideoAttributes[N_ATTRS] = { +static XF86AttributeRec SMI_VideoAttributesSAA711x[N_ATTRS] = { {XvSettable | XvGettable, 0, N_ENCODINGS-1, XV_ENCODING_NAME}, {XvSettable | XvGettable, 0, 255, XV_BRIGHTNESS_NAME}, {XvSettable | XvGettable, 0, 127, XV_CONTRAST_NAME}, @@ -273,6 +274,11 @@ {XvSettable | XvGettable, 0, 1, XV_INTERLACED_NAME}, }; +static XF86AttributeRec SMI_VideoAttributes[N_ATTRS] = { + {XvSettable | XvGettable, 0, 255, XV_BRIGHTNESS_NAME}, + {XvSettable | XvGettable, 0x000000, 0xFFFFFF, XV_COLORKEY_NAME}, +}; + /**************************************************************************/ static XF86ImageRec SMI_VideoImages[] = @@ -616,7 +622,7 @@ if (numAdaptors != 0) { - DEBUG((VERBLEV, "ScreenInit\n")); + DEBUG((VERBLEV, "ScreenInit %i\n",numAdaptors)); xf86XVScreenInit(pScreen, ptrAdaptors, numAdaptors); } @@ -651,6 +657,9 @@ static int SetAttr(ScrnInfoPtr pScrn, int i, int value) { + SMIPtr pSmi = SMIPTR(pScrn); + SMI_PortPtr pPort = (SMI_PortPtr) pSmi->ptrAdaptor->pPortPrivates[0].ptr; + if (i < XV_ENCODING || i > XV_HUE) return BadMatch; @@ -658,20 +667,21 @@ value = CLAMP(value, SMI_VideoAttributes[i].min_value, SMI_VideoAttributes[i].max_value); -#if 0 - if (pPPriv->I2CDev == SAA7110) { + if (pPort->I2CDev.SlaveAddr == SAA7110) { return SetAttrSAA7110(pScrn, i, value); } - else if (pPPriv->I2CDev == SAA7111) { -#endif + else if (pPort->I2CDev.SlaveAddr == SAA7111) { return SetAttrSAA7111(pScrn, i, value); -#if 0 } + else if (i == XV_BRIGHTNESS) { + WRITE_VPR(pSmi, 0x5C, 0xEDEDED | (value << 24)); + } +#if 0 else { return XvBadAlloc; } #endif - + return Success; } @@ -886,38 +896,39 @@ smiPortPtr->I2CDev.SlaveAddr = SAA7111; smiPortPtr->I2CDev.pI2CBus = pSmi->I2C; - if (!xf86I2CDevInit(&(smiPortPtr->I2CDev))) - { - LEAVE_PROC("SMI_SetupVideo"); - return(NULL); - } - DEBUG((VERBLEV, "SAA7111 intialized\n")); - - if (!xf86I2CWriteVec(&(smiPortPtr->I2CDev), SAA7111InitData, ENTRIES(SAA7111InitData) / 2)) + + if (xf86I2CDevInit(&(smiPortPtr->I2CDev))) { - LEAVE_PROC("SMI_SetupVideo"); - return(NULL); - } - - REGION_INIT(pScreen, &smiPortPtr->clip, NullBox, 0); - - pSmi->ptrAdaptor = ptrAdaptor; - pSmi->BlockHandler = pScreen->BlockHandler; - pScreen->BlockHandler = SMI_BlockHandler; - - xvEncoding = MAKE_ATOM(XV_ENCODING_NAME); - xvHue = MAKE_ATOM(XV_HUE_NAME); - xvSaturation = MAKE_ATOM(XV_SATURATION_NAME); - xvBrightness = MAKE_ATOM(XV_BRIGHTNESS_NAME); - xvContrast = MAKE_ATOM(XV_CONTRAST_NAME); - + + if (xf86I2CWriteVec(&(smiPortPtr->I2CDev), SAA7111InitData, + ENTRIES(SAA7111InitData) / 2)) { + xvEncoding = MAKE_ATOM(XV_ENCODING_NAME); + xvHue = MAKE_ATOM(XV_HUE_NAME); + xvSaturation = MAKE_ATOM(XV_SATURATION_NAME); + xvContrast = MAKE_ATOM(XV_CONTRAST_NAME); + + xvInterlaced = MAKE_ATOM(XV_INTERLACED_NAME); + DEBUG((VERBLEV, "SAA7111 intialized\n")); + + } else { + xf86DestroyI2CDevRec(&(smiPortPtr->I2CDev),FALSE); + smiPortPtr->I2CDev.SlaveAddr = 0; + } + } else + smiPortPtr->I2CDev.SlaveAddr = 0; + + REGION_INIT(pScreen, &smiPortPtr->clip, NullBox, 0); + + pSmi->ptrAdaptor = ptrAdaptor; + pSmi->BlockHandler = pScreen->BlockHandler; + pScreen->BlockHandler = SMI_BlockHandler; + xvColorKey = MAKE_ATOM(XV_COLORKEY_NAME); - xvInterlaced = MAKE_ATOM(XV_INTERLACED_NAME); - - SMI_ResetVideo(pScrn); - - LEAVE_PROC("SMI_SetupVideo"); - return(ptrAdaptor); + xvBrightness = MAKE_ATOM(XV_BRIGHTNESS_NAME); + + SMI_ResetVideo(pScrn); + LEAVE_PROC("SMI_SetupVideo"); + return(ptrAdaptor); } @@ -1253,9 +1264,9 @@ OUT_SEQ(pSmi, 0x21, IN_SEQ(pSmi, 0x21) & ~0x04); WRITE_VPR(pSmi, 0x54, READ_VPR(pSmi, 0x54) | 0x00200000); - +#if 0 SMI_WaitForSync(pScrn); - +#endif /* Video Window I Left and Top Boundaries */ WRITE_VPR(pSmi, 0x14, dstBox.x1 + (dstBox.y1 << 16)); /* Video Window I Right and Bottom Boundaries */ @@ -1444,7 +1455,6 @@ SMI_PortPtr pPort = (SMI_PortPtr) data; ENTER_PROC("SMI_GetPortAttribute"); - if (attribute == xvEncoding) *value = pPort->Attribute[XV_ENCODING]; else if (attribute == xvBrightness) @@ -1756,7 +1766,7 @@ ** S U P P O R T F U N C T I O N S ** ** ** \******************************************************************************/ - +#if 0 static void SMI_WaitForSync( ScrnInfoPtr pScrn @@ -1770,6 +1780,7 @@ VerticalRetraceWait(); } +#endif static Bool RegionsEqual( @@ -2007,9 +2018,9 @@ { vstretch = 0; } - +#if 0 SMI_WaitForSync(pScrn); - +#endif WRITE_VPR(pSmi, 0x00, vpr00 | (1 << 3) | (1 << 20)); WRITE_VPR(pSmi, 0x14, (dstBox->x1) | (dstBox->y1 << 16)); WRITE_VPR(pSmi, 0x18, (dstBox->x2) | (dstBox->y2 << 16)); @@ -2083,7 +2094,6 @@ } dev = xf86CreateI2CDevRec(); - ErrorF("zz %x\n",dev); if (dev == NULL) { LEAVE_PROC("SMI_SendI2C"); @@ -2130,6 +2140,7 @@ XF86OffscreenImagePtr offscreenImages; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; SMIPtr pSmi = SMIPTR(pScrn); + SMI_PortPtr pPort = (SMI_PortPtr) pSmi->ptrAdaptor->pPortPrivates[0].ptr; ENTER_PROC("SMI_InitOffscreenImages"); @@ -2151,9 +2162,14 @@ offscreenImages->setAttribute = SMI_SetSurfaceAttribute; offscreenImages->max_width = pSmi->lcdWidth; offscreenImages->max_height = pSmi->lcdHeight; - offscreenImages->num_attributes = nElems(SMI_VideoAttributes); - offscreenImages->attributes = SMI_VideoAttributes; - + if (!pPort->I2CDev.SlaveAddr) { + offscreenImages->num_attributes = nElems(SMI_VideoAttributes); + offscreenImages->attributes = SMI_VideoAttributes; + } else { + offscreenImages->num_attributes = + nElems(SMI_VideoAttributesSAA711x); + offscreenImages->attributes = SMI_VideoAttributesSAA711x; + } xf86XVRegisterOffscreenImages(pScreen, offscreenImages, 1); LEAVE_PROC("SMI_InitOffscreenImages");