?? au1200fb.patch
字號:
++ fbdev = &_au1200fb_devices[plane];+ memset((void *)fbdev, 0, sizeof(struct au1200fb_device));+ fbdev->plane = plane;++ /* Allocate the framebuffer to the maximum screen size */+ fbdev->fb_len = (win->w[plane].xres * win->w[plane].yres * bpp) / 8;++ fbdev->fb_mem = dma_alloc_noncoherent(dev, PAGE_ALIGN(fbdev->fb_len), + &fbdev->fb_phys, GFP_KERNEL);+ if (!fbdev->fb_mem) {+ print_err("fail to allocate frambuffer (size: %dK))", + fbdev->fb_len / 1024);+ return -ENOMEM;+ }++ /*+ * Set page reserved so that mmap will work. This is necessary+ * since we'll be remapping normal memory.+ */+ for (page = (unsigned long)fbdev->fb_phys;+ page < PAGE_ALIGN((unsigned long)fbdev->fb_phys + fbdev->fb_len);+ page += PAGE_SIZE) {+ SetPageReserved(pfn_to_page(page >> PAGE_SHIFT)); // LCD DMA is NOT coherent on Au1200+ }+ print_dbg("Framebuffer memory map at %p", fbdev->fb_mem);+ print_dbg("phys=0x%08x, size=%dK", fbdev->fb_phys, fbdev->fb_len / 1024);++ /* Init FB data */+ if ((ret = au1200fb_init_fbinfo(fbdev)) < 0)+ goto failed;++ /* Register new framebuffer */+ if ((ret = register_framebuffer(&fbdev->fb_info)) < 0) {+ print_err("cannot register new framebuffer");+ goto failed;+ }+ + au1200fb_fb_set_par(&fbdev->fb_info);++#if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO)+ if (plane == 0)+ if (fb_prepare_logo(&fbdev->fb_info)) {+ /* Start display and show logo on boot */+ fb_set_cmap(&fbdev->fb_info.cmap, &fbdev->fb_info);++ fb_show_logo(&fbdev->fb_info);+ }+#endif+ }++ /* Now hook interrupt too */+ if ((ret = request_irq(AU1200_LCD_INT, au1200fb_handle_irq,+ SA_INTERRUPT | SA_SHIRQ, "lcd", (void *)dev)) < 0) {+ print_err("fail to request interrupt line %d (err: %d)",+ AU1200_LCD_INT, ret);+ goto failed;+ }++ return 0;++failed:+ /* NOTE: This only does the current plane/window that failed; others are still active */+ if (fbdev->fb_mem)+ dma_free_noncoherent(dev, PAGE_ALIGN(fbdev->fb_len), fbdev->fb_mem, fbdev->fb_phys);+ if (fbdev->fb_info.cmap.len != 0)+ fb_dealloc_cmap(&fbdev->fb_info.cmap);+ if (fbdev->fb_info.pseudo_palette)+ kfree(fbdev->fb_info.pseudo_palette);+ if (plane == 0)+ free_irq(AU1200_LCD_INT, (void*)dev);+ return ret;+}++int au1200fb_drv_remove(struct device *dev)+{+ struct au1200fb_device *fbdev;+ int plane;++ if (!dev)+ return -ENODEV;++ /* Turn off the panel */+ au1200_setpanel(NULL);++ for (plane = 0; plane < CONFIG_FB_AU1200_DEVS; ++plane)+ {+ fbdev = &_au1200fb_devices[plane];++ /* Clean up all probe data */+ unregister_framebuffer(&fbdev->fb_info);+ if (fbdev->fb_mem)+ dma_free_noncoherent(dev, PAGE_ALIGN(fbdev->fb_len), fbdev->fb_mem, fbdev->fb_phys);+ if (fbdev->fb_info.cmap.len != 0)+ fb_dealloc_cmap(&fbdev->fb_info.cmap);+ if (fbdev->fb_info.pseudo_palette)+ kfree(fbdev->fb_info.pseudo_palette);+ }++ free_irq(AU1200_LCD_INT, (void *)dev);++ return 0;+}++int au1200fb_drv_suspend(struct device *dev, u32 state, u32 level)+{+ /* TODO */+ return 0;+}++int au1200fb_drv_resume(struct device *dev, u32 level)+{+ /* TODO */+ return 0;+}++static struct device_driver au1200fb_driver = {+ .name = "au1200-lcd",+ .bus = &platform_bus_type,+ .probe = au1200fb_drv_probe,+ .remove = au1200fb_drv_remove,+ .suspend = au1200fb_drv_suspend,+ .resume = au1200fb_drv_resume,+};++/*-------------------------------------------------------------------------*/++/* Kernel driver */++static void au1200fb_setup(void)+{+ char* options = NULL;+ char* this_opt;+ int num_panels = ARRAY_SIZE(known_lcd_panels);+ int panel_idx = -1;++ fb_get_options(DRIVER_NAME, &options);++ if (options) {+ while ((this_opt = strsep(&options,",")) != NULL) {+ /* Panel option - can be panel name, "bs" for board-switch, or number/index */+ if (!strncmp(this_opt, "panel:", 6)) {+ int i;+ long int li;+ char *endptr;+ this_opt += 6;+ /* First check for index, which allows to short circuit this mess */+ li = simple_strtol(this_opt, &endptr, 0);+ if (*endptr == '\0') {+ panel_idx = (int)li;+ }+ else if (strcmp(this_opt, "bs") == 0) {+ extern int board_au1200fb_panel(void);+ panel_idx = board_au1200fb_panel();+ }++ else+ for (i = 0; i < num_panels; i++) {+ if (!strcmp(this_opt, known_lcd_panels[i].name)) {+ panel_idx = i;+ break;+ }+ }++ if ((panel_idx < 0) || (panel_idx >= num_panels)) {+ print_warn("Panel %s not supported!", this_opt);+ }+ else+ panel_index = panel_idx;+ }++ else if (strncmp(this_opt, "nohwcursor", 10) == 0) {+ nohwcursor = 1;+ }++ /* Unsupported option */+ else {+ print_warn("Unsupported option \"%s\"", this_opt);+ }+ }+ } +}++#ifdef CONFIG_PM+int au1200fb_pm_callback(au1xxx_power_dev_t *dev, + au1xxx_request_t request, void *data) {+ int retval = 0;+ unsigned int d = 0;+ unsigned int brightness = 0;++ if (request == AU1XXX_PM_SLEEP) {+ retval = board_au1200fb_panel_shutdown();+ }+ else if (request == AU1XXX_PM_WAKEUP) {+ if(dev->prev_state == SLEEP_STATE)+ {+ int plane;+ au1200_setpanel(panel);+ for (plane = 0; plane < CONFIG_FB_AU1200_DEVS; ++plane) {+ struct au1200fb_device *fbdev;+ fbdev = &_au1200fb_devices[plane];+ au1200fb_fb_set_par(&fbdev->fb_info);+ }+ }++ d = *((unsigned int*)data);+ if(d <=10) brightness = 26;+ else if(d<=20) brightness = 51;+ else if(d<=30) brightness = 77;+ else if(d<=40) brightness = 102;+ else if(d<=50) brightness = 128;+ else if(d<=60) brightness = 153;+ else if(d<=70) brightness = 179;+ else if(d<=80) brightness = 204;+ else if(d<=90) brightness = 230;+ else brightness = 255;+ set_brightness(brightness);+ }+ else if (request == AU1XXX_PM_GETSTATUS) {+ return dev->cur_state;+ }+ else if (request == AU1XXX_PM_ACCESS) {+ if (dev->cur_state != SLEEP_STATE)+ return retval;+ else {+ au1200_setpanel(panel);+ }+ }+ else if (request == AU1XXX_PM_IDLE) {+ }+ else if (request == AU1XXX_PM_CLEANUP) {+ }++ return retval; +}+#endif++int __init au1200fb_init(void)+{+ print_info("" DRIVER_DESC "");+ + /* Setup driver with options */+ au1200fb_setup();++ /* Point to the panel selected */+ panel = &known_lcd_panels[panel_index];+ win = &windows[window_index];++ printk(DRIVER_NAME ": Panel %d %s\n", panel_index, panel->name);+ printk(DRIVER_NAME ": Win %d %s\n", window_index, win->name);++ /* Kickstart the panel, the framebuffers/windows come soon enough */+ au1200_setpanel(panel);++ #ifdef CONFIG_PM+ LCD_pm_dev = new_au1xxx_power_device("LCD", &au1200fb_pm_callback, NULL);+ if ( LCD_pm_dev == NULL)+ printk(KERN_INFO "Unable to create a power management device entry for the au1200fb.\n");+ else+ printk(KERN_INFO "Power management device entry for the au1200fb loaded.\n");+ #endif++ return driver_register(&au1200fb_driver);+}++void __exit au1200fb_cleanup(void)+{+ driver_unregister(&au1200fb_driver);+}++module_init(au1200fb_init);+module_exit(au1200fb_cleanup);++MODULE_DESCRIPTION(DRIVER_DESC);+MODULE_LICENSE("GPL");diff -Naur linux26-cvs/drivers/video/au1200fb.h linux26-new/drivers/video/au1200fb.h--- linux26-cvs/drivers/video/au1200fb.h 1969-12-31 18:00:00.000000000 -0600+++ linux26-new/drivers/video/au1200fb.h 2005-06-27 16:05:54.000000000 -0500@@ -0,0 +1,288 @@+/*+ * BRIEF MODULE DESCRIPTION+ * Hardware definitions for the Au1200 LCD controller+ *+ * Copyright 2004 AMD+ * Author: AMD+ *+ * This program is free software; you can redistribute it and/or modify it+ * under the terms of the GNU General Public License as published by the+ * Free Software Foundation; either version 2 of the License, or (at your+ * option) any later version.+ *+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+ *+ * You should have received a copy of the GNU General Public License along+ * with this program; if not, write to the Free Software Foundation, Inc.,+ * 675 Mass Ave, Cambridge, MA 02139, USA.+ */++#ifndef _AU1200LCD_H+#define _AU1200LCD_H++/********************************************************************/+#define AU1200_LCD_ADDR 0xB5000000++#define uint8 unsigned char+#define uint32 unsigned int++typedef volatile struct+{+ uint32 reserved0;+ uint32 screen;+ uint32 backcolor;+ uint32 horztiming;+ uint32 verttiming;+ uint32 clkcontrol;+ uint32 pwmdiv;+ uint32 pwmhi;+ uint32 reserved1;+ uint32 winenable;+ uint32 colorkey;+ uint32 colorkeymsk;+ struct+ {+ uint32 cursorctrl;+ uint32 cursorpos;+ uint32 cursorcolor0;+ uint32 cursorcolor1;+ uint32 cursorcolor2;+ uint32 cursorcolor3;+ } hwc;+ uint32 intstatus;+ uint32 intenable;+ uint32 outmask;+ uint32 fifoctrl;+ uint32 reserved2[(0x0100-0x0058)/4];+ struct+ {+ uint32 winctrl0;+ uint32 winctrl1;+ uint32 winctrl2;+ uint32 winbuf0;+ uint32 winbuf1;+ uint32 winbufctrl;+ uint32 winreserved0;+ uint32 winreserved1;+ } window[4];++ uint32 reserved3[(0x0400-0x0180)/4];++ uint32 palette[(0x0800-0x0400)/4];++ uint8 cursorpattern[256];++} AU1200_LCD;++/* lcd_screen */+#define LCD_SCREEN_SEN (1<<31)+#define LCD_SCREEN_SX (0x07FF<<19)+#define LCD_SCREEN_SY (0x07FF<< 8)+#define LCD_SCREEN_SWP (1<<7)+#define LCD_SCREEN_SWD (1<<6)+#define LCD_SCREEN_PT (7<<0)+#define LCD_SCREEN_PT_TFT (0<<0)+#define LCD_SCREEN_SX_N(WIDTH) ((WIDTH-1)<<19)+#define LCD_SCREEN_SY_N(HEIGHT) ((HEIGHT-1)<<8)+#define LCD_SCREEN_PT_CSTN (1<<0)+#define LCD_SCREEN_PT_CDSTN (2<<0)+#define LCD_SCREEN_PT_M8STN (3<<0)+#define LCD_SCREEN_PT_M4STN (4<<0)++/* lcd_backcolor */+#define LCD_BACKCOLOR_SBGR (0xFF<<16)+#define LCD_BACKCOLOR_SBGG (0xFF<<8)+#define LCD_BACKCOLOR_SBGB (0xFF<<0)+#define LCD_BACKCOLOR_SBGR_N(N) ((N)<<16)+#define LCD_BACKCOLOR_SBGG_N(N) ((N)<<8)+#define LCD_BACKCOLOR_SBGB_N(N) ((N)<<0)++/* lcd_winenable */+#define LCD_WINENABLE_WEN3 (1<<3)+#define LCD_WINENABLE_WEN2 (1<<2)+#define LCD_WINENABLE_WEN1 (1<<1)+#define LCD_WINENABLE_WEN0 (1<<0)++/* lcd_colorkey */+#define LCD_COLORKEY_CKR (0xFF<<16)+#define LCD_COLORKEY_CKG (0xFF<<8)+#define LCD_COLORKEY_CKB (0xFF<<0)+#define LCD_COLORKEY_CKR_N(N) ((N)<<16)+#define LCD_COLORKEY_CKG_N(N) ((N)<<8)+#define LCD_COLORKEY_CKB_N(N) ((N)<<0)++/* lcd_colorkeymsk */+#define LCD_COLORKEYMSK_CKMR (0xFF<<16)+#define LCD_COLORKEYMSK_CKMG (0xFF<<8)+#define LCD_COLORKEYMSK_CKMB (0xFF<<0)+#define LCD_COLORKEYMSK_CKMR_N(N) ((N)<<16)+#define LCD_COLORKEYMSK_CKMG_N(N) ((N)<<8)+#define LCD_COLORKEYMSK_CKMB_N(N) ((N)<<0)++/* lcd windows control 0 */+#define LCD_WINCTRL0_OX (0x07FF<<21)+#define LCD_WINCTRL0_OY (0x07FF<<10)+#define LCD_WINCTRL0_A (0x00FF<<2)+#define LCD_WINCTRL0_AEN (1<<1)+#define LCD_WINCTRL0_OX_N(N) ((N)<<21)+#define LCD_WINCTRL0_OY_N(N) ((N)<<10)+#define LCD_WINCTRL0_A_N(N) ((N)<<2)++/* lcd windows control 1 */+#define LCD_WINCTRL1_PRI (3<<30)+#define LCD_WINCTRL1_PIPE (1<<29)+#define LCD_WINCTRL1_FRM (0xF<<25)+#define LCD_WINCTRL1_CCO (1<<24)+#define LCD_WINCTRL1_PO (3<<22)+#define LCD_WINCTRL1_SZX (0x07FF<<11)+#define LCD_WINCTRL1_SZY (0x07FF<<0)+#define LCD_WINCTRL1_FRM_1BPP (0<<25)+#define LCD_WINCTRL1_FRM_2BPP (1<<25)+#define LCD_WINCTRL1_FRM_4BPP (2<<25)+#define LCD_WINCTRL1_FRM_8BPP (3<<25)+#define LCD_WINCTRL1_FRM_12BPP (4<<25)+#define LCD_WINCTRL1_FRM_16BPP655 (5<<25)+#define LCD_WINCTRL1_FRM_16BPP565 (6<<25)+#define LCD_WINCTRL1_FRM_16BPP556 (7<<25)+#define LCD_WINCTRL1_FRM_16BPPI1555 (8<<25)+#define LCD_WINCTRL1_FRM_16BPPI5551 (9<<25)+#define LCD_WINCTRL1_FRM_16BPPA1555 (10<<25)+#define LCD_WINCTRL1_FRM_16BPPA5551 (11<<25)+#define LCD_WINCTRL1_FRM_24BPP (12<<25)+#define LCD_WINCTRL1_FRM_32BPP (13<<25)+#define LCD_WINCTRL1_PRI_N(N) ((N)<<30)+#define LCD_WINCTRL1_PO_00 (0<<22)+#define LCD_WINCTRL1_PO_01 (1<<22)+#define LCD_WINCTRL1_PO_10 (2<<22)+#define LCD_WINCTRL1_PO_11 (3<<22
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -