亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? smifb.c

?? sm501-712 linux驅動源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
smifb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
{
	*var = *get_con_var(info, con);
	return 0;
}

static int
smifb_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info)
{
	struct fb_cmap *dcmap = get_con_cmap(info, con);

	fb_copy_cmap(dcmap, cmap, kspc ? 0 : 2);
	return 0;
}

static struct fb_ops smifb_ops = {
	owner:			THIS_MODULE,
	fb_get_fix:		smifb_get_fix,
	fb_get_var:		smifb_get_var,
	fb_set_var:		smifb_set_var,
	fb_get_cmap:	smifb_get_cmap,
	fb_set_cmap:	smifb_set_cmap,
};

/*
 *  smifb_switch():
 *	Change to the specified console.  Palette and video mode
 *      are changed to the console's stored parameters.
 */
static int smifb_switch(int con, struct fb_info *info)
{
	struct smifb_info *sfb = (struct smifb_info *)info;
	struct display *disp;
	struct fb_cmap *cmap;

	if (con == sfb->currcon) {
		return 0;
	}

	if (sfb->currcon >= 0) {
		disp = fb_display + sfb->currcon;

		/*
		 * Save the old colormap and video mode.
		 */
		disp->var = sfb->fb.var;
		if (disp->cmap.len)
			fb_copy_cmap(&sfb->fb.cmap, &disp->cmap, 0);
	}

	sfb->currcon = con;
	disp = fb_display + con;

	if (disp->cmap.len)
		cmap = &disp->cmap;
	else
		cmap = fb_default_cmap(1 << disp->var.bits_per_pixel);

	fb_copy_cmap(cmap, &sfb->fb.cmap, 0);

	sfb->fb.var = disp->var;
	sfb->fb.var.activate = FB_ACTIVATE_NOW;

	smifb_set_var(&sfb->fb.var, con, info);

	return 0;
}

/*
 * Formal definition of the VESA spec:
 *  On
 *  	This refers to the state of the display when it is in full operation
 *  Stand-By
 *  	This defines an optional operating state of minimal power reduction with
 *  	the shortest recovery time
 *  Suspend
 *  	This refers to a level of power management in which substantial power
 *  	reduction is achieved by the display.  The display can have a longer
 *  	recovery time from this state than from the Stand-by state
 *  Off
 *  	This indicates that the display is consuming the lowest level of power
 *  	and is non-operational. Recovery from this state may optionally require
 *  	the user to manually power on the monitor
 *
 *  Now, the fbdev driver adds an additional state, (blank), where they
 *  turn off the video (maybe by colormap tricks), but don't mess with the
 *  video itself: think of it semantically between on and Stand-By.
 *
 *  So here's what we should do in our fbdev blank routine:
 *
 *  	VESA_NO_BLANKING (mode 0)	Video on,  front/back light on
 *  	VESA_VSYNC_SUSPEND (mode 1)  	Video on,  front/back light off
 *  	VESA_HSYNC_SUSPEND (mode 2)  	Video on,  front/back light off
 *  	VESA_POWERDOWN (mode 3)		Video off, front/back light off
 *
 *  This will match the matrox implementation.
 */
/*
 * smifb_blank():
 *	Blank the display by setting all palette values to zero.  Note, the
 * 	12 and 16 bpp modes don't really use the palette, so this will not
 *      blank the display in all modes.
 */
static void smifb_blank(int blank, struct fb_info *info)
{
//	struct smifb_info *sfb = (struct smifb_info *)info;

	switch (blank) {
	case VESA_POWERDOWN:
	case VESA_VSYNC_SUSPEND:
	case VESA_HSYNC_SUSPEND:
	case VESA_NO_BLANKING:
	}
}

static int smifb_updatevar(int con, struct fb_info *info)
{
	return 0;
}

/*
 * Alloc struct smifb_info and assign the default value
 */
static struct smifb_info * __devinit
smi_alloc_fb_info(struct pci_dev *dev, char *name)
{
    struct smifb_info *sfb;

    sfb = kmalloc(sizeof(struct smifb_info) + sizeof(struct display) +
                  sizeof(u32) * 16, GFP_KERNEL);

    if (!sfb)
        return NULL;

    memset(sfb, 0, sizeof(struct smifb_info) + sizeof(struct display));

    sfb->currcon        = -1;
    sfb->dev            = dev;

    strcpy(sfb->fb.fix.id, name);

    sfb->fb.fix.type		= FB_TYPE_PACKED_PIXELS;
    sfb->fb.fix.type_aux	= 0;
    sfb->fb.fix.xpanstep	= 0;
    sfb->fb.fix.ypanstep	= 0;
    sfb->fb.fix.ywrapstep	= 0;
    sfb->fb.fix.accel		= FB_ACCEL_NONE;

    sfb->fb.var.nonstd		= 0;
    sfb->fb.var.activate	= FB_ACTIVATE_NOW;
    sfb->fb.var.height		= -1;
    sfb->fb.var.width		= -1;
    sfb->fb.var.accel_flags	= 0;
    sfb->fb.var.vmode		= FB_VMODE_NONINTERLACED;

    strcpy(sfb->fb.modename, sfb->fb.fix.id);
    strcpy(sfb->fb.fontname, "VGA8x8");

    sfb->fb.fbops		= &smifb_ops;
    sfb->fb.changevar	= NULL;
    sfb->fb.switch_con	= smifb_switch;
    sfb->fb.updatevar	= smifb_updatevar;
    sfb->fb.blank		= smifb_blank;
    sfb->fb.flags		= FBINFO_FLAG_DEFAULT;
    sfb->fb.node		= -1;
    sfb->fb.disp		= (struct display *)(sfb + 1);
    sfb->fb.pseudo_palette	= (void *)(sfb->fb.disp + 1);

    return sfb;
}

/*
 * Unmap in the memory mapped IO registers
 *
 */

static void __devinit
smi_unmap_mmio(struct smifb_info *sfb)
{
    if (sfb && SMILFB)
    {
        iounmap(SMILFB);
        SMIRegs = NULL;
    }
}

/*
 * Map in the screen memory
 *
 */
static int __devinit
smi_map_smem(struct smifb_info *sfb, struct pci_dev *dev, u_long smem_len)
{
    sfb->fb.fix.smem_start = pci_resource_start(dev, 0);
    sfb->fb.fix.smem_len  = smem_len;

    sfb->fb.screen_base = SMILFB;

    if (!sfb->fb.screen_base)
    {
        printk("%s: unable to map screen memory\n",sfb->fb.fix.id);
        return -ENOMEM;
    }

    return 0;
}


/*
 * Unmap in the screen memory
 *
 */
static void __devinit
smi_unmap_smem(struct smifb_info *sfb)
{
    if (sfb && sfb->fb.screen_base)
    {
        iounmap(sfb->fb.screen_base);
        sfb->fb.screen_base = NULL;
    }
}

/*
 * We need to wake up the LynxEM+, and make sure its in linear memory mode.
 */
static inline void __devinit
smi_init_hw(void)
{
    outb(0x18, 0x3c4);
    outb(0x11, 0x3c5);
}

static void __devinit
smi_free_fb_info(struct smifb_info *sfb)
{
	if (sfb) {
		fb_alloc_cmap(&sfb->fb.cmap, 0, 0);
		kfree(sfb);
	}
}


u16 SMI_ChipIDs[numChipIDs] = {0x710, 0x712, 0x720};

int __init smifb_init(void)
{
    struct smifb_info *sfb;
    u_long smem_size;
    char name[16];
    int err;
    u8 val;
	char *m_pLAW;
	ulong m_pLAWPhysical;

	struct pci_dev *pdev = NULL;
	int i = 0;

	do {
		pdev = pci_find_device(0x126f,SMI_ChipIDs[i], pdev);
		if (pdev == NULL)
			i++;
		else {
			hw.chipID = SMI_ChipIDs[i];
			break;
		}
	} while (i< numChipIDs);

    sprintf(name, "smifb");

    err = pci_enable_device(pdev); // enable SMI video chip
    if (err) {
        return err;
    }

    err = -ENOMEM;
    sfb = smi_alloc_fb_info(pdev, name);
    if (!sfb) {
        goto failed;
    }

    smi_init_hw();

	// Map address and memory detection
	m_pLAWPhysical = pci_resource_start(pdev,0);
	switch (hw.chipID) {
		case 0x710:
		case 0x712:
			sfb->fb.fix.mmio_start = m_pLAWPhysical + 0x00700000;
			sfb->fb.fix.mmio_len   = 0x00100000;

    		hw.m_pLFB = SMILFB = ioremap(m_pLAWPhysical, 0x00800000);
    		hw.m_pMMIO = SMIRegs = SMILFB + 0x00700000;
			hw.m_pDPR = hw.m_pLFB + 0x00408000;
			hw.m_pVPR = hw.m_pLFB + 0x0040c000;

    		if (!SMIRegs)
    		{
        		printk("%s: unable to map memory mapped IO\n",sfb->fb.fix.id);
        		return -ENOMEM;
    		}

			smi_seqw(0x62,0x7A);
    		smi_seqw(0x6a,0x0c);
    		smi_seqw(0x6b,0x02);
    		smem_size = 0x00400000;

    		//LynxEM+ memory dection
    		*(u32 *)(SMILFB + 4) = 0xAA551133;
    		if (*(u32 *)(SMILFB + 4) != 0xAA551133)
    		{
    			smem_size = 0x00200000;
        		// Program the MCLK to 130 MHz
        		smi_seqw(0x6a,0x12);
        		smi_seqw(0x6b,0x02);
        		smi_seqw(0x62,0x3e);
     		}
			break;
		case 0x720:
			sfb->fb.fix.mmio_start = m_pLAWPhysical + 0x000c0000;
			sfb->fb.fix.mmio_len   = 0x00040000;

			m_pLAW = ioremap(m_pLAWPhysical, 0x00a00000);
			hw.m_pLFB = SMILFB = m_pLAW + 0x00200000;
			hw.m_pMMIO = SMIRegs = m_pLAW + 0x000c0000;
			hw.m_pDPR = m_pLAW;
			hw.m_pVPR = m_pLAW + 0x800;

			smi_seqw(0x62,0xff);
			smi_seqw(0x6a,0x0d);
			smi_seqw(0x6b,0x02);
			smem_size = 0x00400000;

			break;
	}

	sfb->fb.var.xres = 640;
	sfb->fb.var.yres = 480;
	sfb->fb.var.bits_per_pixel = 16;

   	sfb->fb.var.xres_virtual = sfb->fb.var.xres;

	sfb->fb.var.yres_virtual = sfb->fb.var.yres;

    err = smi_map_smem(sfb, pdev, smem_size);

    if (err) {
		goto failed;
    }

	smifb_set_var(&sfb->fb.var, -1, &sfb->fb);

	err = register_framebuffer(&sfb->fb);
	if (err < 0) {
		goto failed;
    }

	MOD_INC_USE_COUNT;
	printk("Silicon Motion, Inc. LynxEM+ Init complete.\n");

	return 0;

failed:
	smi_unmap_smem(sfb);
	smi_unmap_mmio(sfb);
	smi_free_fb_info(sfb);

	return err;
}_V,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色天天综合久久久久综合片| 中文在线一区二区| 欧美国产禁国产网站cc| 亚洲成人先锋电影| 一本色道久久综合亚洲精品按摩| 日韩免费在线观看| 亚洲欧美一区二区三区极速播放 | 日韩欧美电影一区| 亚洲女子a中天字幕| 风流少妇一区二区| 欧美电视剧在线看免费| 午夜激情综合网| 91亚洲国产成人精品一区二三| 2020国产精品自拍| 六月丁香综合在线视频| 777色狠狠一区二区三区| 亚洲综合色视频| 色婷婷综合久久久久中文 | 一本久久a久久精品亚洲| 国产人久久人人人人爽| 国产一区二区不卡| 欧美成人精品3d动漫h| 人妖欧美一区二区| 91麻豆精品国产91久久久久久| 亚洲一级二级在线| 欧美亚洲一区三区| 亚洲一区二区美女| 欧美色大人视频| 亚洲成人综合视频| 欧美精品777| 蜜桃av噜噜一区二区三区小说| 欧美日韩精品久久久| 五月天视频一区| 91麻豆精品91久久久久久清纯| 午夜精品久久久久久| 欧美二区三区91| 日本不卡一区二区| 日韩欧美中文一区| 国产在线播精品第三| 中文字幕不卡在线观看| 成人福利电影精品一区二区在线观看| 国产欧美精品一区aⅴ影院 | 亚洲三级在线免费| 9l国产精品久久久久麻豆| 中文字幕日韩一区| 色综合久久久网| 亚洲va欧美va人人爽午夜| 欧美蜜桃一区二区三区| 免费成人你懂的| 久久久精品国产免费观看同学| 高清av一区二区| 一区二区三区色| 91精品在线一区二区| 国产乱人伦偷精品视频不卡| 国产精品免费久久| 精品视频999| 国产一区二区伦理| 成人欧美一区二区三区| 欧美日韩国产bt| 精品无人码麻豆乱码1区2区| 国产精品伦理一区二区| 欧美在线影院一区二区| 蓝色福利精品导航| 中文字幕在线观看不卡| 欧美精品三级在线观看| 国产iv一区二区三区| 亚洲国产日韩一级| 久久精品网站免费观看| 色成人在线视频| 国产做a爰片久久毛片| 亚洲人成亚洲人成在线观看图片| 欧美精品 日韩| 成人小视频在线| 日本不卡一区二区三区高清视频| 国产欧美日韩另类一区| 91精品国产综合久久久蜜臀图片| 国产成人精品一区二区三区网站观看| 亚洲线精品一区二区三区| 久久精品视频在线看| 69堂国产成人免费视频| 99在线精品观看| 黄网站免费久久| 三级成人在线视频| 亚洲色图制服丝袜| 国产亚洲一本大道中文在线| 欧美优质美女网站| 99久久精品情趣| 国产麻豆精品久久一二三| 婷婷六月综合网| 亚洲精品乱码久久久久久黑人| 亚洲精品在线免费播放| 欧美一区二区三区人| 欧美色视频在线| 99久久婷婷国产综合精品电影 | 蜜桃精品在线观看| 亚洲国产综合91精品麻豆| 中文字幕一区二区三区在线播放 | 欧美中文字幕亚洲一区二区va在线| 国产精品亚洲专一区二区三区| 午夜精品免费在线观看| 亚洲一区二区三区中文字幕| 国产精品成人免费| 日本一区二区三区dvd视频在线| 日韩一级欧美一级| 欧美日产国产精品| 欧美日韩一本到| 欧美色综合影院| 在线观看不卡视频| 欧美日韩三级一区二区| 一本久久综合亚洲鲁鲁五月天| 99视频精品在线| 99免费精品在线观看| 94-欧美-setu| 色综合久久88色综合天天6| 91丨porny丨在线| 色香蕉成人二区免费| 91福利国产成人精品照片| 在线视频一区二区免费| 欧日韩精品视频| 欧美性色黄大片| 欧美日韩国产美| 日韩精品影音先锋| 久久久久久久久久久久久久久99 | 午夜国产精品一区| 日韩电影免费在线| 麻豆精品新av中文字幕| 国内精品久久久久影院薰衣草| 国内精品在线播放| 国产制服丝袜一区| 成人午夜又粗又硬又大| 91亚洲精华国产精华精华液| 欧美少妇bbb| 精品理论电影在线| 国产精品久久久久久久裸模| 亚洲精品乱码久久久久久久久| 亚洲第一在线综合网站| 日本欧美一区二区三区乱码| 国产在线观看一区二区| 91在线观看成人| 3d动漫精品啪啪1区2区免费| 久久久久久久综合狠狠综合| 18成人在线视频| 视频一区二区中文字幕| 国产精品性做久久久久久| 成人国产免费视频| 欧美日韩视频不卡| 国产拍揄自揄精品视频麻豆| 一区二区三区免费网站| 蜜桃av一区二区在线观看| av网站一区二区三区| 欧美军同video69gay| 久久久久一区二区三区四区| 亚洲六月丁香色婷婷综合久久| 美腿丝袜亚洲色图| 色综合久久中文综合久久牛| 日韩欧美一级二级三级久久久| 最新久久zyz资源站| 蜜桃一区二区三区四区| aaa欧美日韩| 久久久久久久电影| 偷拍日韩校园综合在线| 福利一区二区在线| 欧美一区二区精品| 亚洲精品视频一区| 福利一区二区在线观看| 日韩午夜精品视频| 一区二区三区四区亚洲| 国产xxx精品视频大全| 欧美精品123区| 亚洲精品中文在线观看| 国产精品一卡二卡| 日韩一级片在线观看| 亚洲成a人v欧美综合天堂| 91亚洲男人天堂| 国产日韩欧美高清| 狠狠色丁香婷综合久久| 欧美视频在线一区| 亚洲日穴在线视频| 99在线视频精品| 国产精品久久久久久亚洲毛片| 国产一区二三区| 日韩欧美精品三级| 日韩和欧美的一区| 色婷婷久久99综合精品jk白丝| 中文字幕在线不卡视频| 成人免费不卡视频| 国产视频在线观看一区二区三区| 日本不卡123| 91精品国产乱码| 午夜成人免费电影| 欧美日韩精品一区二区在线播放 | 黑人巨大精品欧美黑白配亚洲| 欧美日韩小视频| 亚洲成a人片在线观看中文| 色婷婷av一区二区三区gif| 一区二区三区久久| 91成人国产精品| 性欧美大战久久久久久久久| 欧美在线观看视频一区二区 | 国产精品高潮久久久久无|