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

📄 w90p710fb.c

📁 winbond w90p710 lcd frame buffer driver。
💻 C
📖 第 1 页 / 共 3 页
字号:
	outpw(REG_LCD_LCDCON, (inpw(REG_LCD_LCDCON) | LCD_LCDCON_BPP_24));	bursty = 1;#endif#ifdef CONFIG_W90P710_LCD_TFT_16BPP	outpw(REG_LCD_LCDCON, (inpw(REG_LCD_LCDCON) | LCD_LCDCON_BPP_16));						//for 16BPP	bursty = 1 << 1;#endif#ifdef CONFIG_W90P710_LCD_TFT_8BPP	outpw(REG_LCD_LCDCON, (inpw(REG_LCD_LCDCON) | LCD_LCDCON_BPP_08 | LCD_LCDCON_VDLUTEN));	//for 8BPP	bursty = 1 << 2;#endif #ifdef CONFIG_W90P710_LCD_TFT_4BPP	outpw(REG_LCD_LCDCON, (inpw(REG_LCD_LCDCON) | LCD_LCDCON_BPP_04 | LCD_LCDCON_VDLUTEN));	//for 4BPP	bursty = 1 << 3;#endif#ifdef CONFIG_W90P710_LCD_TFT_2BPP	outpw(REG_LCD_LCDCON, (inpw(REG_LCD_LCDCON) | LCD_LCDCON_BPP_02 | LCD_LCDCON_VDLUTEN));	//for 2BPP	bursty = 1 << 4;#endif#ifdef CONFIG_W90P710_LCD_TFT_1BPP	outpw(REG_LCD_LCDCON, (inpw(REG_LCD_LCDCON) | LCD_LCDCON_BPP_01 | LCD_LCDCON_VDLUTEN));	//for 1BPP	bursty = 1 << 5;#endif                    	#else	//STN panel settings#ifdef CONFIG_W90P710_LCD_STN_16BPP	outpw(REG_LCD_LCDCON, LCD_LCDCON_BPP_16);							//for 16BPP	bursty = 1 << 1;#endif#ifdef CONFIG_W90P710_LCD_STN_8BPP	outpw(REG_LCD_LCDCON, LCD_LCDCON_BPP_08 | LCD_LCDCON_VDLUTEN);			//for 8BPP	bursty = 1 << 2;#endif #ifdef CONFIG_W90P710_LCD_STN_4BPP	outpw(REG_LCD_LCDCON, LCD_LCDCON_BPP_04 | LCD_LCDCON_VDLUTEN);			//for 4BPP	bursty = 1 << 3;#endif#ifdef CONFIG_W90P710_LCD_STN_2BPP	outpw(REG_LCD_LCDCON, LCD_LCDCON_BPP_02 | LCD_LCDCON_VDLUTEN);			//for 2BPP	bursty = 1 << 4;#endif#ifdef CONFIG_W90P710_LCD_STN_1BPP	outpw(REG_LCD_LCDCON, LCD_LCDCON_BPP_01 | LCD_LCDCON_VDLUTEN);			//for 1BPP	bursty = 1 << 5;#endif #endif                    /* Clear the framebuffer */    memset((void *)fbi->fb.fix.smem_start, 0xFF, FB_Size);    //printk("FB_Size = %d \n",FB_Size);    udelay(200);        /* Configure Dummy Display Color Pattern Register */    outpw(REG_LCD_DDISPCP, 0x00000000);         /* Configure Valid Display Window Starting Coordinate */    outpw(REG_LCD_DISPWINS, 0x00000000);     #ifdef CONFIG_W90P710_LCD_TFT_CASIO        /* Configure Valid Display Window Starting Coordinate */    outpw(REG_LCD_DISPWINS, 0x00020008);             /* Configure Valid Display Window Ending Coordinate */    outpw(REG_LCD_DISPWINE,(((FB_Y_RES + 2) << 16) | (FB_X_RES + 8)));#else	/* Configure Valid Display Window Starting Coordinate */    outpw(REG_LCD_DISPWINS, 0x00000000);             /* Configure Valid Display Window Ending Coordinate */    outpw(REG_LCD_DISPWINE,((FB_Y_RES << 16) | FB_X_RES));#endif#ifdef CONFIG_W90P710_LCD_TFT  #ifdef CONFIG_W90P710_LCD_TFT_CASIO	/* Configure LCD Timing Generation */    outpw(REG_LCD_LCDTCON1, 0x0070051A);      outpw(REG_LCD_LCDTCON2, 0x01E800F2);      outpw(REG_LCD_LCDTCON3, 0x00100000);      outpw(REG_LCD_LCDTCON4, 0x00060101);      outpw(REG_LCD_LCDTCON5, 0x00000006);#else      /* Configure LCD Timing Generation */    outpw(REG_LCD_LCDTCON1, 0x05F09C17);      outpw(REG_LCD_LCDTCON2, 0x027F01E0);      outpw(REG_LCD_LCDTCON3, 0x0030840A);      outpw(REG_LCD_LCDTCON4, 0x00060101);      outpw(REG_LCD_LCDTCON5, 0x00000006);    #endif#ifdef CONFIG_W90P710_LCD_TFT_AUO960240	outpw(REG_LCD_LCDTCON1, 0x0003B166);      outpw(REG_LCD_LCDTCON2, 0x03BF00F1);      outpw(REG_LCD_LCDTCON3, 0x00105401);      //outpw(REG_LCD_LCDTCON2, 0x03BF00F0);      //outpw(REG_LCD_LCDTCON3, 0x00207401);      outpw(REG_LCD_LCDTCON4, 0x00020101);      outpw(REG_LCD_LCDTCON5, 0x0000000E);#endif    #ifdef CONFIG_W90P710_LCD_TFT_TOPPOLY240320	outpw(REG_LCD_LCDTCON1, 0x00904C09);    outpw(REG_LCD_LCDTCON2, 0x00F10140);      outpw(REG_LCD_LCDTCON3, 0x00200802);      outpw(REG_LCD_LCDTCON4, 0x000C0101);      outpw(REG_LCD_LCDTCON5, 0x0000000E);  #endif#else    /* Configure LCD Timing Generation */    outpw(REG_LCD_LCDTCON1, 0x00F00401);      outpw(REG_LCD_LCDTCON2, 0x014200F0);      outpw(REG_LCD_LCDTCON3, 0x00000000);      outpw(REG_LCD_LCDTCON4, 0x000A0103);      outpw(REG_LCD_LCDTCON5, 0x00000000);      outpw(REG_LCD_LCDTCON6, 0x00000000);          /* Configure TMED Dithering Pattern */    outpw(REG_LCD_TMDDITHP1 , 0x01010001);            outpw(REG_LCD_TMDDITHP2 , 0x030380C0);          outpw(REG_LCD_TMDDITHP3 , 0xE0E0C0E0);          outpw(REG_LCD_TMDDITHP4 , 0xF0F0E0F0);       outpw(REG_LCD_TMDDITHP5 , 0xF8F8F8F0);           outpw(REG_LCD_TMDDITHP6 , 0xFCFCFCF8);          outpw(REG_LCD_TMDDITHP7 , 0xFFFCFFF8);     #endif   			/* Make sure the TRANSBURSTY can be divided by 8(data burst) * 1(word) */	if(((FB_X_RES / bursty) % 16) == 0)	{		/* Configure LCD FIFO1 transfer parameters */    	outpw(REG_LCD_FIFO1PRM, LCD_FIFO1PRM_F1BURSTY_16DATABURST | LCD_FIFO1PRM_F1TRANSZ_4BYTE);    	}	else if(((FB_X_RES / bursty) % 8) == 0)    {	    	/* Configure LCD FIFO1 transfer parameters */    	outpw(REG_LCD_FIFO1PRM, LCD_FIFO1PRM_F1BURSTY_08DATABURST | LCD_FIFO1PRM_F1TRANSZ_4BYTE);        }    else    {    	/* Select another transfer type */    	/* Configure LCD FIFO1 transfer parameters */    	outpw(REG_LCD_FIFO1PRM, LCD_FIFO1PRM_F1BURSTY_04DATABURST | LCD_FIFO1PRM_F1TRANSZ_4BYTE);        }		/* Configure LCD Interrupt Enable Register */    outpw(REG_LCD_LCDINTENB,LCD_LCDINTENB_VSEN);         /* Configure LCD Interrupt Clear Register */    outpw(REG_LCD_LCDINTC, LCD_LCDINTC_VSIC);#ifdef CONFIG_W90P710_LCD_TFT_24BPP        /* FIFO1 transfer data count register */    outpw(REG_LCD_F1DREQCNT, (FB_X_RES << 16) | FB_Y_RES);        /* FIFO 1 real column count register */    outpw(REG_LCD_FIFO1RELACOLCNT, FB_X_RES);#endif           #if defined(CONFIG_W90P710_LCD_TFT_16BPP) || defined(CONFIG_W90P710_LCD_STN_16BPP)       /* FIFO1 transfer data count register */    outpw(REG_LCD_F1DREQCNT, ((FB_X_RES << 16) >> 1) | FB_Y_RES);         /* FIFO 1 real column count register */    outpw(REG_LCD_FIFO1RELACOLCNT, FB_X_RES >> 1);#endif#if defined(CONFIG_W90P710_LCD_TFT_8BPP) || defined(CONFIG_W90P710_LCD_STN_8BPP) 	 /* FIFO1 transfer data count register */    outpw(REG_LCD_F1DREQCNT, ((FB_X_RES << 16) >> 2) | FB_Y_RES);           /* FIFO 1 real column count register */    outpw(REG_LCD_FIFO1RELACOLCNT, FB_X_RES >> 2);#endif#if defined(CONFIG_W90P710_LCD_TFT_4BPP) || defined(CONFIG_W90P710_LCD_STN_4BPP) 	 /* FIFO1 transfer data count register */    outpw(REG_LCD_F1DREQCNT, ((FB_X_RES << 16) >> 3) | FB_Y_RES);         /* FIFO 1 real column count register */    outpw(REG_LCD_FIFO1RELACOLCNT, FB_X_RES >> 3);        /* Setting palette */     outpw(REG_LCD_LUTENTY1, 0x03020100);	outpw(REG_LCD_LUTENTY2, 0x07060504);	outpw(REG_LCD_LUTENTY3, 0x0B0A0908);	outpw(REG_LCD_LUTENTY4, 0x0F0E0D0C);	#endif#if defined(CONFIG_W90P710_LCD_TFT_2BPP) || defined(CONFIG_W90P710_LCD_STN_2BPP) 	 /* FIFO1 transfer data count register */    outpw(REG_LCD_F1DREQCNT, ((FB_X_RES << 16) >> 4) | FB_Y_RES);         /* FIFO 1 real column count register */    outpw(REG_LCD_FIFO1RELACOLCNT, FB_X_RES >> 4);        /* Setting palette */     outpw(REG_LCD_LUTENTY1, 0x03020100); #endif#if defined(CONFIG_W90P710_LCD_TFT_1BPP) || defined(CONFIG_W90P710_LCD_STN_1BPP) 	 /* FIFO1 transfer data count register */    outpw(REG_LCD_F1DREQCNT, ((FB_X_RES << 16) >> 5) | FB_Y_RES);         /* FIFO 1 real column count register */    outpw(REG_LCD_FIFO1RELACOLCNT, FB_X_RES >> 5);        /* Setting palette */       outpw(REG_LCD_LUTENTY1, 0x00000100);#endif                            Enable_LCD();    #ifdef CONFIG_W90P710_LCD_TFT_AUO960240	/*Init AUO panel */	InitAUOLCD();		#endif    LEAVE();   }int __init w90p710fb_init(void){    struct w90p710fb_info *fbi;    int ret;    //unsigned int status = 0;		ENTER();	        fbi = w90p710fb_init_fbinfo();    ret = -ENOMEM;    if (!fbi)	goto failed;    ret = w90p710fb_map_video_memory(fbi);    if (ret)	goto failed;#if 1        ret = request_irq(INT_LCD , w90p710fb_handle_irq, SA_INTERRUPT,			  fbi->fb.fix.id, fbi);	if (ret) {		printk(KERN_ERR "w90p710fb: request_irq failed: %d\n", ret);		goto failed;	}#endif	    w90p710_lcd_init(fbi);    w90p710fb_set_var(&fbi->fb.var, -1, &fbi->fb);		ret = register_framebuffer(&fbi->fb);    if (ret < 0)      goto failed;    printk("Installed W90P710 frame buffer\n");	    MOD_INC_USE_COUNT ;        LEAVE();        return 0;failed:    if (fbi)	kfree(fbi);    return ret;}int __init w90p710fb_setup(char *options){    return 0;}#if 1/* *  w90p710fb_handle_irq: Handle 'LCD DONE' interrupts. */static void w90p710fb_handle_irq(int irq, void *dev_id, struct pt_regs *regs){	unsigned int interruptStatus;    			//spin_lock_irq( &wb_osd_lock);        interruptStatus = inpw(REG_LCD_LCDINTS);	/* It's Timing Generator output a VSYNC pulse */            /* It's Timing Generator output a VSYNC pulse */    if(interruptStatus & LCD_LCDINTS_VSIS)    {	    _lcd_VSYNC = 1;        _lcd_VSYNCCount++;    	    /* Write one to clear this interrupt status */	                    outpw(REG_LCD_LCDINTC, ~interruptStatus | LCD_LCDINTC_VSIC); 	        }     //printk("I \n");}#endifvoid Disable_LCD(void){	ENTER();		 /* Disable FIFO */    outpw(REG_LCD_FIFOCON, inpw(REG_LCD_FIFOCON) & ~(LCD_FIFOCON_FIFOEN_FIFO1 | LCD_FIFOCON_FIFOEN_FIFO2));         /* Disable LCD Controller */    outpw(REG_LCD_LCDCON, inpw(REG_LCD_LCDCON) & ~LCD_LCDCON_LCDCEN);        /* Reset LCD Controller */    outpw(REG_LCD_LCDCON, LCD_LCDCON_LCDRST);        LEAVE();}void Enable_LCD(void){	ENTER();		/* Configure LCD FIFOs controller register and tigger the engine */    outpw(REG_LCD_FIFOCON, LCD_FIFOCON_FIFOEN_FIFO1);        /* LCD Controller Enable */    outpw(REG_LCD_LCDCON, inpw(REG_LCD_LCDCON) | LCD_LCDCON_LCDCEN);        LEAVE();}#ifdef CONFIG_W90P710_LCD_TFT_CASIOvoid InitCasioLCD(void){	UINT32 GPIO_Value = 0;		ENTER();		/* using USI interface */	// set environment	GPIO_Value = inpw(REG_GPIO_CFG5);	GPIO_Value = GPIO_Value & 0xFFF00FFF;	GPIO_Value = GPIO_Value | 0x000AA000;	outpw(REG_GPIO_CFG5, GPIO_Value);	//outpw(REG_USI_DIVIDER, 0x3);	// SCK = PCLK/8 (10MHz)	//outpw(REG_USI_DIVIDER, 0x4);	// SCK = PCLK/10 (8MHz)	outpw(REG_USI_DIVIDER, 0x27);	// SCK = PCLK/80 (1MHz)	outpw(REG_USI_SSR, 0x00);		// CS active low	outpw(REG_USI_CNTRL, 0x64);	// Tx: rising edge, Rx: rising edge									// Tx_BIT_LEN = 12 bit, Tx_NUM = 1		/* sending command to panel */	outpw(REG_USI_SSR, inpw(REG_USI_SSR) | 0x01);	// CS0 active	// configure VDISP	outpw(REG_USI_Tx0, 0xC80);	usiIsBusy();		outpw(REG_USI_SSR, inpw(REG_USI_SSR) & 0xfe);	// CS0 deactive	outpw(REG_USI_SSR, inpw(REG_USI_SSR) | 0x01);	// CS0 active		// configure PANEL3	outpw(REG_USI_Tx0, 0xAFB);	usiIsBusy();		outpw(REG_USI_SSR, inpw(REG_USI_SSR) & 0xfe);	// CS0 deactive	outpw(REG_USI_SSR, inpw(REG_USI_SSR) | 0x01);	// CS0 active		// configure FUNC1	outpw(REG_USI_Tx0, 0x618);	usiIsBusy();		outpw(REG_USI_SSR, inpw(REG_USI_SSR) & 0xfe);	// CS0 deactive	outpw(REG_USI_SSR, inpw(REG_USI_SSR) | 0x01);	// CS0 active		// configure FUNC2	outpw(REG_USI_Tx0, 0xE20);	usiIsBusy();	outpw(REG_USI_SSR, inpw(REG_USI_SSR) & 0xfe);	// CS0 deactive	outpw(REG_USI_SSR, inpw(REG_USI_SSR) | 0x01);	// CS0 active		// configure BRIGHT	outpw(REG_USI_Tx0, 0x022);	usiIsBusy();		outpw(REG_USI_SSR, inpw(REG_USI_SSR) & 0xfe);	// CS0 deactive		/* Select pixel format */	outpw(REG_LCD_LCDCON, inpw(REG_LCD_LCDCON) | LCD_LCDCON_CASIOSHOWTYPE_R1G2B3R4G5B6);			LEAVE();}#endif#ifdef CONFIG_W90P710_LCD_TFT_AUO960240void InitAUOLCD(void){		int i;	UINT32 GPIO_Value = 0;	UINT16 delay = 10;	ENTER();		/* using USI interface */	// set environment	GPIO_Value = inpw(REG_GPIO_CFG5);	GPIO_Value = GPIO_Value & 0xFFF00FFF;	GPIO_Value = GPIO_Value | 0x000AA000;	outpw(REG_GPIO_CFG5, GPIO_Value);		outpw(REG_USI_DIVIDER, 0x27);	// SCK = PCLK/80 (1MHz)	outpw(REG_USI_SSR, 0x00);		// CS active low	outpw(REG_USI_CNTRL, 0x84);		// Tx: rising edge, Rx: rising edge									// Tx_BIT_LEN = 16 bit, Tx_NUM = 1		for(i=0;i<delay;i++);	outpw(REG_USI_SSR, inpw(REG_USI_SSR) | 0x01);	// CS0 active	outpw(REG_USI_Tx0, 0x516);	usiIsBusy();		outpw(REG_USI_SSR, inpw(REG_USI_SSR) & 0xfe);	// CS0 deactive		for(i=0;i<delay;i++);	outpw(REG_USI_SSR, inpw(REG_USI_SSR) | 0x01);	// CS0 active	outpw(REG_USI_Tx0, 0x408);	usiIsBusy();		outpw(REG_USI_SSR, inpw(REG_USI_SSR) & 0xfe);	// CS0 deactive		for(i=0;i<delay;i++);	outpw(REG_USI_SSR, inpw(REG_USI_SSR) | 0x01);	// CS0 active	outpw(REG_USI_Tx0, 0x7F1);	usiIsBusy();		outpw(REG_USI_SSR, inpw(REG_USI_SSR) & 0xfe);	// CS0 deactive		for(i=0;i<delay;i++);	outpw(REG_USI_SSR, inpw(REG_USI_SSR) | 0x01);	// CS0 active	outpw(REG_USI_Tx0, 0x8C0);	usiIsBusy();		outpw(REG_USI_SSR, inpw(REG_USI_SSR) & 0xfe);	// CS0 deactive		for(i=0;i<delay;i++);	outpw(REG_USI_SSR, inpw(REG_USI_SSR) | 0x01);	// CS0 active	outpw(REG_USI_Tx0, 0x616);	usiIsBusy();		outpw(REG_USI_SSR, inpw(REG_USI_SSR) & 0xfe);	// CS0 deactive		//configure R5	for(i=0;i<delay;i++);	outpw(REG_USI_SSR, inpw(REG_USI_SSR) | 0x01);	// CS0 active	outpw(REG_USI_Tx0, 0x5D7);	usiIsBusy();		outpw(REG_USI_SSR, inpw(REG_USI_SSR) & 0xfe);	// CS0 deactive		LEAVE();}#endifint usiIsBusy(void){	outpw(REG_USI_CNTRL, inpw(REG_USI_CNTRL)|0x01);	while(inpw(REG_USI_CNTRL) & 0x01);	return 1;}#ifdef MODULEmodule_init(w90p710fb_init);#endif

⌨️ 快捷键说明

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