From: Huang Jiachai Date: Fri, 4 Dec 2015 09:48:12 +0000 (+0800) Subject: video: rockchip: delete some useless file X-Git-Tag: firefly_0821_release~3553 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=b58cbf93e0237d5b48cf8cc4cda37027dee0e137;p=firefly-linux-kernel-4.4.55.git video: rockchip: delete some useless file Change-Id: Idfe4cfcfdbf2957b78eb41d0ec6837b6479c49e4 Signed-off-by: Huang Jiachai --- diff --git a/drivers/video/display/screen/Kconfig b/drivers/video/display/screen/Kconfig deleted file mode 100644 index 10d301f4b460..000000000000 --- a/drivers/video/display/screen/Kconfig +++ /dev/null @@ -1,33 +0,0 @@ -choice - depends on FB_RK29 - prompt "LCD Panel Select for rk2918 platform" - -config LCD_RK29_NULL - bool "NULL" -config LCD_RK29_LG_LP097X02 - bool "RGB LCD_LG_LP097X02 1024X768" - -config LCD_RK29_HSD100PXN - bool "RGB Hannstar HSD100PXN(1024X768)" - -config LCD_RK29_LS035Y8DX02A - bool "RGB LS035Y8DX02A(480X800)" - -config LCD_RK29_LS035Y8DX04A - bool "RGB LS035Y8DX04A(480X800)" - -config LCD_RK29_NT35510 - bool "RGB lcd_nt35510" - -config DEFAULT_OUT_HDMI - bool "HDMI for default panel" - depends on HDMI - ---help--- - if you want set HDMI for default panel, android UI size is HDMI default resolution. - -config LCD_RK29_A050VL01 - bool "RGB A050VL01" - -endchoice - - diff --git a/drivers/video/display/screen/Makefile b/drivers/video/display/screen/Makefile deleted file mode 100644 index abe7fa41937a..000000000000 --- a/drivers/video/display/screen/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -obj-$(CONFIG_LCD_RK29_NULL) += lcd_null.o - -obj-$(CONFIG_LCD_RK29_LG_LP097X02)+= lcd_LG_LP097X02.o - -obj-$(CONFIG_LCD_RK29_LS035Y8DX02A) += lcd_ls035y8dx02a.o -obj-$(CONFIG_LCD_RK29_LS035Y8DX04A) += lcd_ls035y8dx04a.o -obj-$(CONFIG_LCD_RK29_HSD100PXN) += lcd_hsd100pxn.o -obj-$(CONFIG_LCD_RK29_NT35510) += lcd_nt35510.o -obj-$(CONFIG_LCD_RK29_A050VL01) += lcd_A050VL01.o - - - diff --git a/drivers/video/display/screen/lcd_A050VL01.c b/drivers/video/display/screen/lcd_A050VL01.c deleted file mode 100644 index 030eefa6beef..000000000000 --- a/drivers/video/display/screen/lcd_A050VL01.c +++ /dev/null @@ -1,348 +0,0 @@ -/* This Lcd Driver is HSD070IDW1 write by cst 2009.10.27 */ -#include -#include -#include "../../rk29_fb.h" -#include -#include -#include -#include "screen.h" - - -/* Base */ -#define OUT_TYPE SCREEN_RGB -#define OUT_FACE OUT_P888 -#define OUT_CLK 23500000 -#define LCDC_ACLK 150000000 //29 lcdc axi DMA ƵÂÊ - -/* Timing */ -#define H_PW 2 -#define H_BP 2 -#define H_VD 480 -#define H_FP 2 - -#define V_PW 2 -#define V_BP 2 -#define V_VD 800 -#define V_FP 2 - -/* Other */ -#define DCLK_POL 1 -#define SWAP_RB 0 - -#define LCD_WIDTH 480 //need modify -#define LCD_HEIGHT 800 - -#if 1 -#define RXD_PORT RK29_PIN2_PC7 -#define TXD_PORT gLcd_info->txd_pin -#define CLK_PORT gLcd_info->clk_pin -#define CS_PORT gLcd_info->cs_pin -#define RESET_PORT RK29_PIN6_PC6 - -#define CS_OUT() gpio_direction_output(CS_PORT, 1) -#define CS_SET() gpio_set_value(CS_PORT, GPIO_HIGH) -#define CS_CLR() gpio_set_value(CS_PORT, GPIO_LOW) -#define CLK_OUT() gpio_direction_output(CLK_PORT, 0) -#define CLK_SET() gpio_set_value(CLK_PORT, GPIO_HIGH) -#define CLK_CLR() gpio_set_value(CLK_PORT, GPIO_LOW) -#define TXD_OUT() gpio_direction_output(TXD_PORT, 1) -#define TXD_SET() gpio_set_value(TXD_PORT, GPIO_HIGH) -#define TXD_CLR() gpio_set_value(TXD_PORT, GPIO_LOW) -#define RXD_IN() gpio_direction_input(RXD_PORT) -#define RXD_GET() gpio_get_value(RXD_PORT) -#endif - -static struct rk29lcd_info *gLcd_info = NULL; - -#define DRVDelayUs(i) udelay(i*4) - -int init(void); -int standby(u8 enable); - -void set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info ) -{ - /* screen type & face */ - screen->type = OUT_TYPE; - screen->face = OUT_FACE; - - /* Screen size */ - screen->x_res = H_VD; - screen->y_res = V_VD; - - screen->width = LCD_WIDTH; - screen->height = LCD_HEIGHT; - - /* Timing */ - screen->lcdc_aclk = LCDC_ACLK; - screen->pixclock = OUT_CLK; - screen->left_margin = H_BP; - screen->right_margin = H_FP; - screen->hsync_len = H_PW; - screen->upper_margin = V_BP; - screen->lower_margin = V_FP; - screen->vsync_len = V_PW; - - /* Pin polarity */ - screen->pin_hsync = 0; - screen->pin_vsync = 0; - screen->pin_den = 0; - screen->pin_dclk = DCLK_POL; - - /* Swap rule */ - screen->swap_rb = SWAP_RB; - screen->swap_rg = 0; - screen->swap_gb = 0; - screen->swap_delta = 0; - screen->swap_dumy = 0; - - /* Operation function*/ - screen->init = init; - /*screen->init = NULL;*/ - screen->standby = standby; - if(lcd_info) - gLcd_info = lcd_info; -} -//cannot need init,so set screen->init = null at rk29_fb.c file - -#if 1 -void spi_screenreg_command(u16 command) -{ - u8 i,buff; - - TXD_OUT(); - CLK_OUT(); - CS_OUT(); - DRVDelayUs(2); - DRVDelayUs(2); - - CS_SET(); - TXD_SET(); - CLK_SET(); - DRVDelayUs(2); - - buff = 0x20; - CS_CLR(); - for(i = 0; i < 8; i++) - { - if(buff & (1<<(7-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_CLR(); - DRVDelayUs(2); - CLK_SET(); - DRVDelayUs(2); - } - - for(i = 0; i < 8; i++) //reg hight - { - if(command &(1<<(15-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_CLR(); - DRVDelayUs(2); - CLK_SET(); - DRVDelayUs(2); - } - CS_SET(); - CLK_CLR(); - TXD_CLR(); - DRVDelayUs(2); - - buff = 0x00; - CS_CLR(); - for(i = 0; i < 8; i++) - { - if(buff & (1<<(7-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_CLR(); - DRVDelayUs(2); - CLK_SET(); - DRVDelayUs(2); - } - - for(i = 8; i < 16; i++) //reg low - { - if(command &(1<<(15-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_CLR(); - DRVDelayUs(2); - CLK_SET(); - DRVDelayUs(2); - } - CS_SET(); - CLK_CLR(); - TXD_CLR(); - DRVDelayUs(2); -} -void spi_screenreg_command_data(u16 Addr, u16 Data) -{ - u8 i,buff; - - TXD_OUT(); - CLK_OUT(); - CS_OUT(); - DRVDelayUs(2); - DRVDelayUs(2); - - CS_SET(); - TXD_SET(); - CLK_SET(); - DRVDelayUs(2); - - buff = 0x20; - CS_CLR(); - for(i = 0; i < 8; i++) - { - if(buff & (1<<(7-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_CLR(); - DRVDelayUs(2); - CLK_SET(); - DRVDelayUs(2); - } - - for(i = 0; i < 8; i++) //reg hight - { - if(Addr &(1<<(15-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_CLR(); - DRVDelayUs(2); - CLK_SET(); - DRVDelayUs(2); - } - CS_SET(); - CLK_CLR(); - TXD_CLR(); - DRVDelayUs(2); - - buff = 0x00; - CS_CLR(); - for(i = 0; i < 8; i++) - { - if(buff & (1<<(7-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_CLR(); - DRVDelayUs(2); - CLK_SET(); - DRVDelayUs(2); - } - - for(i = 8; i < 16; i++) //reg low - { - if(Addr &(1<<(15-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_CLR(); - DRVDelayUs(2); - CLK_SET(); - DRVDelayUs(2); - } - CS_SET(); - CLK_CLR(); - TXD_CLR(); - DRVDelayUs(2); - - buff = 0x40; - CS_CLR(); - for(i = 0; i < 8; i++) - { - if(buff & (1<<(7-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_CLR(); - DRVDelayUs(2); - CLK_SET(); - DRVDelayUs(2); - } - - for(i = 0; i < 8; i++) //data - { - if(Data &(1<<(7-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_CLR(); - DRVDelayUs(2); - CLK_SET(); - DRVDelayUs(2); - } - - CS_SET(); - CLK_CLR(); - TXD_CLR(); - DRVDelayUs(2); - -} - -int init(void) -{ - if(gLcd_info) - gLcd_info->io_init(); - -#ifdef RESET_PORT - gpio_request(RESET_PORT, NULL); - gpio_direction_output(RESET_PORT, 0); - mdelay(2); - gpio_set_value(RESET_PORT, 1); - mdelay(10); - gpio_free(RESET_PORT); -#endif - - spi_screenreg_command(0x1100); - spi_screenreg_command_data(0xC000,0x8a); - spi_screenreg_command_data(0xC002,0x8a); - spi_screenreg_command_data(0xC200,0x02); - spi_screenreg_command_data(0xC202,0x32); - spi_screenreg_command_data(0xC100,0x40); - spi_screenreg_command_data(0xC700,0x8b); - mdelay(200); - spi_screenreg_command(0x2900); - spi_screenreg_command(0x2C00); - - if(gLcd_info) - gLcd_info->io_deinit(); - return 0; -} -#endif - -extern void rk29_lcd_spim_spin_lock(void); -extern void rk29_lcd_spim_spin_unlock(void); -int standby(u8 enable) -{ - rk29_lcd_spim_spin_lock(); - if(gLcd_info) - gLcd_info->io_init(); - if(enable) { -#ifdef RESET_PORT - gpio_request(RESET_PORT, NULL); - gpio_direction_output(RESET_PORT, 0); - mdelay(2); - gpio_set_value(RESET_PORT, 1); - mdelay(10); - gpio_free(RESET_PORT); -#endif - spi_screenreg_command(0x2800); - spi_screenreg_command(0x1000); - } else { - init(); - } - if(gLcd_info) - gLcd_info->io_deinit(); - rk29_lcd_spim_spin_unlock(); - return 0; -} - diff --git a/drivers/video/display/screen/lcd_LG_LP097X02.c b/drivers/video/display/screen/lcd_LG_LP097X02.c deleted file mode 100644 index cc0ba4f48627..000000000000 --- a/drivers/video/display/screen/lcd_LG_LP097X02.c +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include -#include "../../rk29_fb.h" -#include -#include -#include -#include "screen.h" - -/* Base */ -#define OUT_TYPE SCREEN_RGB -#define OUT_FACE OUT_D888_P666 -#define OUT_CLK 100000000 -#define LCDC_ACLK 500000000 -/* Timing */ -#define H_PW 320 -#define H_BP 480 -#define H_VD 1024 -#define H_FP 260 - -#define V_PW 10 -#define V_BP 6 -#define V_VD 768 -#define V_FP 16 - -#define LCD_WIDTH 196// 142 // 202 -#define LCD_HEIGHT 147 //106// 152 -/* Other */ -#define DCLK_POL 1 // -#define SWAP_RB 0 - -void set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info ) -{ - /* screen type & face */ - screen->type = OUT_TYPE; - screen->face = OUT_FACE; - - /* Screen size */ - screen->x_res = H_VD; - screen->y_res = V_VD; - - screen->width = LCD_WIDTH; - screen->height = LCD_HEIGHT; - - /* Timing */ - screen->lcdc_aclk = LCDC_ACLK; - screen->pixclock = OUT_CLK; - screen->left_margin = H_BP; - screen->right_margin = H_FP; - screen->hsync_len = H_PW; - screen->upper_margin = V_BP; - screen->lower_margin = V_FP; - screen->vsync_len = V_PW; - - /* Pin polarity */ - screen->pin_hsync = 0; - screen->pin_vsync = 0; - screen->pin_den = 0; - screen->pin_dclk = DCLK_POL; - - /* Swap rule */ - screen->swap_rb = SWAP_RB; - screen->swap_rg = 0; - screen->swap_gb = 0; - screen->swap_delta = 0; - screen->swap_dumy = 0; - - /* Operation function*/ - screen->init = NULL; - screen->standby = NULL; -} - - diff --git a/drivers/video/display/screen/lcd_hsd100pxn.c b/drivers/video/display/screen/lcd_hsd100pxn.c deleted file mode 100644 index bc1f2c7b0ac8..000000000000 --- a/drivers/video/display/screen/lcd_hsd100pxn.c +++ /dev/null @@ -1,308 +0,0 @@ -#include -#include -#include -#include -#include -#include "../../rockchip/hdmi/rk_hdmi.h" - - -/* Base */ -#define OUT_TYPE SCREEN_LVDS -#define LVDS_FORMAT LVDS_8BIT_2 -#define OUT_FACE OUT_D888_P666 -#define OUT_CLK 65000000 -#define LCDC_ACLK 300000000//312000000 //29 lcdc axi DMA ƵÂÊ - -/* Timing */ -#define H_PW 10 -#define H_BP 100 -#define H_VD 1024 -#define H_FP 210 - -#define V_PW 10 -#define V_BP 10 -#define V_VD 768 -#define V_FP 18 - -#define LCD_WIDTH 202 -#define LCD_HEIGHT 152 -/* Other */ -#define DCLK_POL 1 -#define DEN_POL 0 -#define VSYNC_POL 0 -#define HSYNC_POL 0 - -#define SWAP_RB 0 -#define SWAP_RG 0 -#define SWAP_GB 0 - - -#ifdef CONFIG_ONE_LCDC_DUAL_OUTPUT_INF -/* scaler Timing */ -//1920*1080*60 - -#define S_OUT_CLK 64512000 -#define S_H_PW 114 -#define S_H_BP 210 -#define S_H_VD 1024 -#define S_H_FP 0 - -#define S_V_PW 4 -#define S_V_BP 10 -#define S_V_VD 768 -#define S_V_FP 0 - -#define S_H_ST 0 -#define S_V_ST 23 - -//1920*1080*50 -#define S1_OUT_CLK 53760000 -#define S1_H_PW 114 -#define S1_H_BP 210 -#define S1_H_VD 1024 -#define S1_H_FP 0 - -#define S1_V_PW 4 -#define S1_V_BP 10 -#define S1_V_VD 768 -#define S1_V_FP 0 - -#define S1_H_ST 0 -#define S1_V_ST 23 -//1280*720*60 -#define S2_OUT_CLK 64512000 -#define S2_H_PW 114 -#define S2_H_BP 210 -#define S2_H_VD 1024 -#define S2_H_FP 0 - -#define S2_V_PW 4 -#define S2_V_BP 10 -#define S2_V_VD 768 -#define S2_V_FP 0 - -#define S2_H_ST 0 -#define S2_V_ST 23 -//1280*720*50 - -#define S3_OUT_CLK 53760000 -#define S3_H_PW 114 -#define S3_H_BP 210 -#define S3_H_VD 1024 -#define S3_H_FP 0 - -#define S3_V_PW 4 -#define S3_V_BP 10 -#define S3_V_VD 768 -#define S3_V_FP 0 - -#define S3_H_ST 0 -#define S3_V_ST 23 - -//720*576*50 -#define S4_OUT_CLK 30000000 -#define S4_H_PW 1 -#define S4_H_BP 88 -#define S4_H_VD 800 -#define S4_H_FP 263 - -#define S4_V_PW 3 -#define S4_V_BP 9 -#define S4_V_VD 480 -#define S4_V_FP 28 - -#define S4_H_ST 0 -#define S4_V_ST 33 -//720*480*60 -#define S5_OUT_CLK 30000000 -#define S5_H_PW 1 -#define S5_H_BP 88 -#define S5_H_VD 800 -#define S5_H_FP 112 - -#define S5_V_PW 3 -#define S5_V_BP 9 -#define S5_V_VD 480 -#define S5_V_FP 28 - -#define S5_H_ST 0 -#define S5_V_ST 29 - -#define S_DCLK_POL 1 - - -static int set_scaler_info(struct rk29fb_screen *screen, u8 hdmi_resolution) -{ - screen->s_clk_inv = S_DCLK_POL; - screen->s_den_inv = 0; - screen->s_hv_sync_inv = 0; - - printk("%s>>>>>>>>mode:%d\n",__func__,hdmi_resolution); - switch(hdmi_resolution){ - case HDMI_1920x1080p_60Hz: - /* Scaler Timing */ - screen->hdmi_resolution = hdmi_resolution; - screen->s_pixclock = S_OUT_CLK; - screen->s_hsync_len = S_H_PW; - screen->s_left_margin = S_H_BP; - screen->s_right_margin = S_H_FP; - screen->s_hsync_len = S_H_PW; - screen->s_upper_margin = S_V_BP; - screen->s_lower_margin = S_V_FP; - screen->s_vsync_len = S_V_PW; - screen->s_hsync_st = S_H_ST; - screen->s_vsync_st = S_V_ST; - break; - case HDMI_1920x1080p_50Hz: - /* Scaler Timing */ - screen->s_pixclock = S1_OUT_CLK; - screen->s_hsync_len = S1_H_PW; - screen->s_left_margin = S1_H_BP; - screen->s_right_margin = S1_H_FP; - screen->s_hsync_len = S1_H_PW; - screen->s_upper_margin = S1_V_BP; - screen->s_lower_margin = S1_V_FP; - screen->s_vsync_len = S1_V_PW; - screen->s_hsync_st = S1_H_ST; - screen->s_vsync_st = S1_V_ST; - break; - case HDMI_1280x720p_60Hz: - /* Scaler Timing */ - screen->hdmi_resolution = hdmi_resolution; - screen->s_pixclock = S2_OUT_CLK; - screen->s_hsync_len = S2_H_PW; - screen->s_left_margin = S2_H_BP; - screen->s_right_margin = S2_H_FP; - screen->s_hsync_len = S2_H_PW; - screen->s_upper_margin = S2_V_BP; - screen->s_lower_margin = S2_V_FP; - screen->s_vsync_len = S2_V_PW; - screen->s_hsync_st = S2_H_ST; - screen->s_vsync_st = S2_V_ST; - break; - case HDMI_1280x720p_50Hz: - /* Scaler Timing */ - screen->hdmi_resolution = hdmi_resolution; - screen->s_pixclock = S3_OUT_CLK; - screen->s_hsync_len = S3_H_PW; - screen->s_left_margin = S3_H_BP; - screen->s_right_margin = S3_H_FP; - screen->s_hsync_len = S3_H_PW; - screen->s_upper_margin = S3_V_BP; - screen->s_lower_margin = S3_V_FP; - screen->s_vsync_len = S3_V_PW; - screen->s_hsync_st = S3_H_ST; - screen->s_vsync_st = S3_V_ST; - break; - case HDMI_720x576p_50Hz_4_3: - case HDMI_720x576p_50Hz_16_9: - /* Scaler Timing */ - screen->hdmi_resolution = hdmi_resolution; - screen->s_pixclock = S4_OUT_CLK; - screen->s_hsync_len = S4_H_PW; - screen->s_left_margin = S4_H_BP; - screen->s_right_margin = S4_H_FP; - screen->s_hsync_len = S4_H_PW; - screen->s_upper_margin = S4_V_BP; - screen->s_lower_margin = S4_V_FP; - screen->s_vsync_len = S4_V_PW; - screen->s_hsync_st = S4_H_ST; - screen->s_vsync_st = S4_V_ST; - break; - case HDMI_720x480p_60Hz_16_9: - case HDMI_720x480p_60Hz_4_3: - /* Scaler Timing */ - screen->hdmi_resolution = hdmi_resolution; - screen->s_pixclock = S5_OUT_CLK; - screen->s_hsync_len = S5_H_PW; - screen->s_left_margin = S5_H_BP; - screen->s_right_margin = S5_H_FP; - screen->s_hsync_len = S5_H_PW; - screen->s_upper_margin = S5_V_BP; - screen->s_lower_margin = S5_V_FP; - screen->s_vsync_len = S5_V_PW; - screen->s_hsync_st = S5_H_ST; - screen->s_vsync_st = S5_V_ST; - break; - default : - printk("%s lcd not support dual display at this hdmi resolution %d \n",__func__,hdmi_resolution); - return -1; - break; - } - - return 0; -} -#else -#define set_scaler_info NULL -#endif - - - -void set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info ) -{ - /* screen type & face */ - screen->type = OUT_TYPE; - screen->face = OUT_FACE; - screen->hw_format = LVDS_FORMAT; - - /* Screen size */ - screen->x_res = H_VD; - screen->y_res = V_VD; - - screen->width = LCD_WIDTH; - screen->height = LCD_HEIGHT; - - /* Timing */ - screen->lcdc_aclk = LCDC_ACLK; - screen->pixclock = OUT_CLK; - screen->left_margin = H_BP; - screen->right_margin = H_FP; - screen->hsync_len = H_PW; - screen->upper_margin = V_BP; - screen->lower_margin = V_FP; - screen->vsync_len = V_PW; - - /* Pin polarity */ - screen->pin_hsync = HSYNC_POL; - screen->pin_vsync = VSYNC_POL; - screen->pin_den = DEN_POL; - screen->pin_dclk = DCLK_POL; - - /* Swap rule */ - screen->swap_rb = SWAP_RB; - screen->swap_rg = SWAP_RG; - screen->swap_gb = SWAP_RG; - screen->swap_delta = 0; - screen->swap_dumy = 0; - - /* Operation function*/ - screen->init = NULL; - screen->standby = NULL; - -#if defined(CONFIG_ONE_LCDC_DUAL_OUTPUT_INF) - screen->sscreen_get = set_scaler_info; - screen->s_pixclock = OUT_CLK; - screen->s_hsync_len = H_PW; - screen->s_left_margin = H_BP; - screen->s_right_margin = H_FP; - screen->s_hsync_len = H_PW; - screen->s_upper_margin = V_BP; - screen->s_lower_margin = V_FP; - screen->s_vsync_len = V_PW; - screen->s_hsync_st = 0; - screen->s_vsync_st = 0; -#endif -} - - -size_t get_fb_size(void) -{ - size_t size = 0; - #if defined(CONFIG_THREE_FB_BUFFER) - size = ((H_VD)*(V_VD)<<2)* 3; //three buffer - #else - size = ((H_VD)*(V_VD)<<2)<<1; //two buffer - #endif - return ALIGN(size,SZ_1M); -} - diff --git a/drivers/video/display/screen/lcd_ls035y8dx02a.c b/drivers/video/display/screen/lcd_ls035y8dx02a.c deleted file mode 100644 index bb983fa301b8..000000000000 --- a/drivers/video/display/screen/lcd_ls035y8dx02a.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright (C) 2011 ROCKCHIP, Inc. - * - * author: hhb@rock-chips.com - * creat date: 2011-03-22 - * route:drivers/video/display/screen/lcd_ls035y8dx02a.c - driver for rk29 phone sdk - * declaration: This program driver have been tested in rk29_phonesdk hardware platform at 2011.03.31. - * about migration: you need just 3 interface functions,such as lcd_init(void),lcd_standby(u8 enable), - * set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info ) - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include -#include "../../rk29_fb.h" -#include -#include -#include -#include "screen.h" - -/* Base */ -#define OUT_TYPE SCREEN_RGB -#define OUT_FACE OUT_P888 -#define OUT_CLK (26*1000000) //***27 uint Hz -#define LCDC_ACLK 300000000 //29 lcdc axi DMA Ƶ�� - -/* Timing */ -#define H_PW 8 //16 -#define H_BP 6//24 -#define H_VD 480//320 -#define H_FP 60//16 - -#define V_PW 2 -#define V_BP 2 -#define V_VD 800//480 -#define V_FP 4 - -#define LCD_WIDTH 480 //need modify -#define LCD_HEIGHT 800 - -/* Other */ -#define DCLK_POL 1 //0 -#define SWAP_RB 0 - -static struct rk29lcd_info *gLcd_info = NULL; -int lcd_init(void); -int lcd_standby(u8 enable); - -#define RXD_PORT RK29_PIN2_PC7 -#define TXD_PORT gLcd_info->txd_pin -#define CLK_PORT gLcd_info->clk_pin -#define CS_PORT gLcd_info->cs_pin -#define RESET_PORT RK29_PIN6_PC6 - -#define CS_OUT() gpio_direction_output(CS_PORT, 1) -#define CS_SET() gpio_set_value(CS_PORT, GPIO_HIGH) -#define CS_CLR() gpio_set_value(CS_PORT, GPIO_LOW) -#define CLK_OUT() gpio_direction_output(CLK_PORT, 0) -#define CLK_SET() gpio_set_value(CLK_PORT, GPIO_HIGH) -#define CLK_CLR() gpio_set_value(CLK_PORT, GPIO_LOW) -#define TXD_OUT() gpio_direction_output(TXD_PORT, 1) -#define TXD_SET() gpio_set_value(TXD_PORT, GPIO_HIGH) -#define TXD_CLR() gpio_set_value(TXD_PORT, GPIO_LOW) -#define RXD_IN() gpio_direction_input(RXD_PORT) -#define RXD_GET() gpio_get_value(RXD_PORT) - -#define DRVDelayUs(i) udelay(i*4) - -u32 spi_screenreg_get(u32 Addr) -{ - u32 i, data = 0; - u32 control_bit; - - TXD_OUT(); - CLK_OUT(); - CS_OUT(); - DRVDelayUs(2); - DRVDelayUs(2); - - CS_SET(); - TXD_SET(); - CLK_CLR(); - DRVDelayUs(30); - - CS_CLR(); - control_bit = 0x0000; - Addr = (control_bit | Addr); - printk("addr is 0x%x \n", Addr); - for(i = 0; i < 9; i++) //reg - { - if(Addr &(1<<(8-i))) - TXD_SET(); - else - TXD_CLR(); - - // \u6a21\u62dfCLK - CLK_SET(); - DRVDelayUs(2); - CLK_CLR(); - DRVDelayUs(2); - } - - CS_SET(); - TXD_SET(); - CLK_CLR(); - DRVDelayUs(10); - - CS_CLR(); - for(i = 0; i < 9; i++) - { - CLK_SET(); - DRVDelayUs(2); - CLK_CLR(); - if(RXD_GET()) - { - data |= 1<<(8-i); - } - else - { - data &= ~(1<<(8-i)); - } - DRVDelayUs(2); - } - CS_SET(); - CLK_CLR(); - TXD_CLR(); - DRVDelayUs(30); - - return data; -} - -void spi_screenreg_set(u32 Addr, u32 Data0, u32 Data1) -{ - - - u32 i; - u32 control_bit; - - TXD_OUT(); - CLK_OUT(); - CS_OUT(); - DRVDelayUs(2); - DRVDelayUs(2); - - CS_SET(); - TXD_SET(); - CLK_CLR(); - DRVDelayUs(30); - - CS_CLR(); - control_bit = 0x0000; - Addr = (control_bit | Addr); - //printk("addr is 0x%x \n", Addr); - for(i = 0; i < 9; i++) //reg - { - if(Addr &(1<<(8-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_SET(); - DRVDelayUs(2); - CLK_CLR(); - DRVDelayUs(2); - } - - CS_SET(); - TXD_SET(); - CLK_CLR(); - DRVDelayUs(10); - - if(0xffff == Data0){ - return; - } - - CS_CLR(); - - control_bit = 0x0100; - Data0 = (control_bit | Data0); - //printk("data0 is 0x%x \n", Data); - for(i = 0; i < 9; i++) //data - { - if(Data0 &(1<<(8-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_SET(); - DRVDelayUs(2); - CLK_CLR(); - DRVDelayUs(2); - } - - CS_SET(); - CLK_CLR(); - TXD_CLR(); - DRVDelayUs(10); - - if(0xffff == Data1) - return; - - CS_CLR(); - - control_bit = 0x0100; - Data1 = (control_bit | Data1); - //printk("data1 is 0x%x \n", Data); - for(i = 0; i < 9; i++) //data - { - if(Data1 &(1<<(8-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_SET(); - DRVDelayUs(2); - CLK_CLR(); - DRVDelayUs(2); - } - - CS_SET(); - CLK_CLR(); - TXD_CLR(); - DRVDelayUs(30); -} - -void set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info ) -{ - /* screen type & face */ - screen->type = OUT_TYPE; - screen->face = OUT_FACE; - - /* Screen size */ - screen->x_res = H_VD; - screen->y_res = V_VD; - screen->width = LCD_WIDTH; - screen->height = LCD_HEIGHT; - - /* Timing */ - screen->lcdc_aclk = LCDC_ACLK; - screen->pixclock = OUT_CLK; - screen->left_margin = H_BP; /*>2*/ - screen->right_margin = H_FP; /*>2*/ - screen->hsync_len = H_PW; /*>2*/ //***all > 326, 4upper_margin = V_BP; /*>2*/ - screen->lower_margin = V_FP; /*>2*/ - screen->vsync_len = V_PW; /*>6*/ - - /* Pin polarity */ - screen->pin_hsync = 0; - screen->pin_vsync = 0; - screen->pin_den = 0; - screen->pin_dclk = DCLK_POL; - - /* Swap rule */ - screen->swap_rb = SWAP_RB; - screen->swap_rg = 0; - screen->swap_gb = 0; - screen->swap_delta = 0; - screen->swap_dumy = 0; - - /* Operation function*/ - screen->init = lcd_init; - screen->standby = lcd_standby; - if(lcd_info) - gLcd_info = lcd_info; -} - -int lcd_init(void) -{ - volatile u32 data; - if(gLcd_info){ - gLcd_info->io_init(); - } - - /* reset lcd to start init lcd by software if there is no hardware reset circuit for the lcd */ -#ifdef RESET_PORT - gpio_request(RESET_PORT, NULL); - gpio_direction_output(RESET_PORT, 0); - mdelay(2); - gpio_set_value(RESET_PORT, 1); - mdelay(10); - gpio_free(RESET_PORT); -#endif - - printk("lcd init...\n"); - spi_screenreg_set(0x29, 0xffff, 0xffff); //display on - spi_screenreg_set(0x11, 0xffff, 0xffff); //sleep out - mdelay(150); - spi_screenreg_set(0x36, 0x0000, 0xffff); //set address mode - - while(0) //this code is not used here - { - data = spi_screenreg_get(0x0a); - printk("------------liuylcd init reg 0x0a=0x%x \n", spi_screenreg_get(0x0a)); - data = spi_screenreg_get(0x0b); - printk("------------liuylcd init reg 0x0b=0x%x \n", spi_screenreg_get(0x0b)); - data = spi_screenreg_get(0x0c); - printk("------------liuylcd init reg 0x0c=0x%x \n", spi_screenreg_get(0x0c)); - data = spi_screenreg_get(0x0d); - printk("------------liuylcd init reg 0x0d=0x%x \n", spi_screenreg_get(0x0d)); - data = spi_screenreg_get(0x0f); - printk("------------liuylcd init reg 0x0f=0x%x \n", spi_screenreg_get(0x0f)); - } - - spi_screenreg_set(0x3a, 0x0070, 0xffff); //set pixel format - spi_screenreg_set(0xb0, 0x0000, 0xffff); //enable command acess - spi_screenreg_set(0xb8, 0x0001, 0xffff); //BLC setting - spi_screenreg_set(0xb9, 0x0001, 0x00ff); //LED PWM - spi_screenreg_set(0xb0, 0x0003, 0xffff); //disable command acess - - if(gLcd_info) - gLcd_info->io_deinit(); - - return 0; -} - -extern void rk29_lcd_spim_spin_lock(void); -extern void rk29_lcd_spim_spin_unlock(void); -int lcd_standby(u8 enable) //***enable =1 means suspend, 0 means resume -{ - rk29_lcd_spim_spin_lock(); - if(gLcd_info) - gLcd_info->io_init(); - - if(enable) { - //printk("lcd suspend\n"); - spi_screenreg_set(0x10, 0xffff, 0xffff); - mdelay(120); - spi_screenreg_set(0x28, 0xffff, 0xffff); - } else { - //printk("lcd resume\n"); - spi_screenreg_set(0x29, 0xffff, 0xffff); - spi_screenreg_set(0x11, 0xffff, 0xffff); - mdelay(130); - spi_screenreg_set(0x36, 0x0000, 0xffff); //set address mode - spi_screenreg_set(0x3a, 0x0070, 0xffff); //set pixel format - spi_screenreg_set(0xb0, 0x0000, 0xffff); //enable command acess - spi_screenreg_set(0xb8, 0x0001, 0xffff); //BLC setting - spi_screenreg_set(0xb9, 0x0001, 0x00ff); //LED PWM - spi_screenreg_set(0xb0, 0x0003, 0xffff); //disable command acess - } - - if(gLcd_info) - gLcd_info->io_deinit(); - rk29_lcd_spim_spin_unlock(); - return 0; -} - diff --git a/drivers/video/display/screen/lcd_ls035y8dx04a.c b/drivers/video/display/screen/lcd_ls035y8dx04a.c deleted file mode 100644 index f1757299f798..000000000000 --- a/drivers/video/display/screen/lcd_ls035y8dx04a.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright (C) 2011 ROCKCHIP, Inc. - * - * author: hhb@rock-chips.com - * creat date: 2011-03-22 - * route:drivers/video/display/screen/lcd_ls035y8dx02a.c - driver for rk29 phone sdk - * declaration: This program driver have been tested in rk29_phonesdk hardware platform at 2011.03.31. - * about migration: you need just 3 interface functions,such as lcd_init(void),lcd_standby(u8 enable), - * set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info ) - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include -#include "../../rk29_fb.h" -#include -#include -#include -#include "screen.h" - -/* Base */ -#define OUT_TYPE SCREEN_RGB -#define OUT_FACE OUT_P888 -#define OUT_CLK (26*1000000) //***27 uint Hz -#define LCDC_ACLK 150000000 //29 lcdc axi DMA Ƶ�� - -/* Timing */ -#define H_PW 8 //16 -#define H_BP 6//24 -#define H_VD 480//320 -#define H_FP 60//16 - -#define V_PW 2 -#define V_BP 2 -#define V_VD 800//480 -#define V_FP 4 - -#define LCD_WIDTH 46 //need modify -#define LCD_HEIGHT 76 - -/* Other */ -#define DCLK_POL 1 //0 -#define SWAP_RB 0 - -static struct rk29lcd_info *gLcd_info = NULL; -int lcd_init(void); -int lcd_standby(u8 enable); - -#define RXD_PORT RK29_PIN2_PC7 -#define TXD_PORT gLcd_info->txd_pin -#define CLK_PORT gLcd_info->clk_pin -#define CS_PORT gLcd_info->cs_pin -#define RESET_PORT RK29_PIN6_PC6 - -#define CS_OUT() gpio_direction_output(CS_PORT, 1) -#define CS_SET() gpio_set_value(CS_PORT, GPIO_HIGH) -#define CS_CLR() gpio_set_value(CS_PORT, GPIO_LOW) -#define CLK_OUT() gpio_direction_output(CLK_PORT, 0) -#define CLK_SET() gpio_set_value(CLK_PORT, GPIO_HIGH) -#define CLK_CLR() gpio_set_value(CLK_PORT, GPIO_LOW) -#define TXD_OUT() gpio_direction_output(TXD_PORT, 1) -#define TXD_SET() gpio_set_value(TXD_PORT, GPIO_HIGH) -#define TXD_CLR() gpio_set_value(TXD_PORT, GPIO_LOW) -#define RXD_IN() gpio_direction_input(RXD_PORT) -#define RXD_GET() gpio_get_value(RXD_PORT) - -#define DRVDelayUs(i) udelay(i*4) - -u32 spi_screenreg_get(u32 Addr) -{ - u32 i, data = 0; - u32 control_bit; - - TXD_OUT(); - CLK_OUT(); - CS_OUT(); - DRVDelayUs(2); - DRVDelayUs(2); - - CS_SET(); - TXD_SET(); - CLK_CLR(); - DRVDelayUs(30); - - CS_CLR(); - control_bit = 0x0000; - Addr = (control_bit | Addr); - printk("addr is 0x%x \n", Addr); - for(i = 0; i < 9; i++) //reg - { - if(Addr &(1<<(8-i))) - TXD_SET(); - else - TXD_CLR(); - - // \u6a21\u62dfCLK - CLK_SET(); - DRVDelayUs(2); - CLK_CLR(); - DRVDelayUs(2); - } - - CS_SET(); - TXD_SET(); - CLK_CLR(); - DRVDelayUs(10); - - CS_CLR(); - for(i = 0; i < 9; i++) - { - CLK_SET(); - DRVDelayUs(2); - CLK_CLR(); - if(RXD_GET()) - { - data |= 1<<(8-i); - } - else - { - data &= ~(1<<(8-i)); - } - DRVDelayUs(2); - } - CS_SET(); - CLK_CLR(); - TXD_CLR(); - DRVDelayUs(30); - - return data; -} - -void spi_screenreg_set(u32 Addr, u32 Data0, u32 Data1) -{ - - - u32 i; - u32 control_bit; - - TXD_OUT(); - CLK_OUT(); - CS_OUT(); - DRVDelayUs(2); - DRVDelayUs(2); - - CS_SET(); - TXD_SET(); - CLK_CLR(); - DRVDelayUs(30); - - CS_CLR(); - control_bit = 0x0000; - Addr = (control_bit | Addr); - //printk("addr is 0x%x \n", Addr); - for(i = 0; i < 9; i++) //reg - { - if(Addr &(1<<(8-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_SET(); - DRVDelayUs(2); - CLK_CLR(); - DRVDelayUs(2); - } - - CS_SET(); - TXD_SET(); - CLK_CLR(); - DRVDelayUs(10); - - if(0xffff == Data0){ - return; - } - - CS_CLR(); - - control_bit = 0x0100; - Data0 = (control_bit | Data0); - //printk("data0 is 0x%x \n", Data); - for(i = 0; i < 9; i++) //data - { - if(Data0 &(1<<(8-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_SET(); - DRVDelayUs(2); - CLK_CLR(); - DRVDelayUs(2); - } - - CS_SET(); - CLK_CLR(); - TXD_CLR(); - DRVDelayUs(10); - - if(0xffff == Data1) - return; - - CS_CLR(); - - control_bit = 0x0100; - Data1 = (control_bit | Data1); - //printk("data1 is 0x%x \n", Data); - for(i = 0; i < 9; i++) //data - { - if(Data1 &(1<<(8-i))) - TXD_SET(); - else - TXD_CLR(); - CLK_SET(); - DRVDelayUs(2); - CLK_CLR(); - DRVDelayUs(2); - } - - CS_SET(); - CLK_CLR(); - TXD_CLR(); - DRVDelayUs(30); -} - -void set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info ) -{ - /* screen type & face */ - screen->type = OUT_TYPE; - screen->face = OUT_FACE; - - /* Screen size */ - screen->x_res = H_VD; - screen->y_res = V_VD; - screen->width = LCD_WIDTH; - screen->height = LCD_HEIGHT; - - /* Timing */ - screen->lcdc_aclk = LCDC_ACLK; - screen->pixclock = OUT_CLK; - screen->left_margin = H_BP; /*>2*/ - screen->right_margin = H_FP; /*>2*/ - screen->hsync_len = H_PW; /*>2*/ //***all > 326, 4upper_margin = V_BP; /*>2*/ - screen->lower_margin = V_FP; /*>2*/ - screen->vsync_len = V_PW; /*>6*/ - - /* Pin polarity */ - screen->pin_hsync = 0; - screen->pin_vsync = 0; - screen->pin_den = 0; - screen->pin_dclk = DCLK_POL; - - /* Swap rule */ - screen->swap_rb = SWAP_RB; - screen->swap_rg = 0; - screen->swap_gb = 0; - screen->swap_delta = 0; - screen->swap_dumy = 0; - - /* Operation function*/ - screen->init = lcd_init; - screen->standby = lcd_standby; - if(lcd_info) - gLcd_info = lcd_info; -} - -int lcd_init(void) -{ - volatile u32 data; - if(gLcd_info){ - gLcd_info->io_init(); - } - - /* reset lcd to start init lcd by software if there is no hardware reset circuit for the lcd */ -#ifdef RESET_PORT - gpio_request(RESET_PORT, NULL); - gpio_direction_output(RESET_PORT, 0); - mdelay(2); - gpio_set_value(RESET_PORT, 1); - mdelay(10); - gpio_free(RESET_PORT); -#endif - - printk("lcd init...\n"); - spi_screenreg_set(0x29, 0xffff, 0xffff); //display on - spi_screenreg_set(0x11, 0xffff, 0xffff); //sleep out - mdelay(150); - spi_screenreg_set(0x36, 0x0000, 0xffff); //set address mode - - while(0) //this code is not used here - { - data = spi_screenreg_get(0x0a); - printk("------------liuylcd init reg 0x0a=0x%x \n", spi_screenreg_get(0x0a)); - data = spi_screenreg_get(0x0b); - printk("------------liuylcd init reg 0x0b=0x%x \n", spi_screenreg_get(0x0b)); - data = spi_screenreg_get(0x0c); - printk("------------liuylcd init reg 0x0c=0x%x \n", spi_screenreg_get(0x0c)); - data = spi_screenreg_get(0x0d); - printk("------------liuylcd init reg 0x0d=0x%x \n", spi_screenreg_get(0x0d)); - data = spi_screenreg_get(0x0f); - printk("------------liuylcd init reg 0x0f=0x%x \n", spi_screenreg_get(0x0f)); - } - - spi_screenreg_set(0x3a, 0x0070, 0xffff); //set pixel format - spi_screenreg_set(0xb0, 0x0000, 0xffff); //enable command acess - spi_screenreg_set(0xb8, 0x0000, 0xffff); //BLC setting - spi_screenreg_set(0xb9, 0x0001, 0x00ff); //LED PWM - //spi_screenreg_set(0xb0, 0x0003, 0xffff); //disable command acess - - if(gLcd_info) - gLcd_info->io_deinit(); - - return 0; -} - -extern void rk29_lcd_spim_spin_lock(void); -extern void rk29_lcd_spim_spin_unlock(void); -int lcd_standby(u8 enable) //***enable =1 means suspend, 0 means resume -{ - rk29_lcd_spim_spin_lock(); - if(gLcd_info) - gLcd_info->io_init(); - printk("lcd standby\n"); - if(enable) { - printk("lcd standby...enable =1 means suspend\n"); - spi_screenreg_set(0x10, 0xffff, 0xffff); - mdelay(120); - spi_screenreg_set(0x28, 0xffff, 0xffff); - } else { - printk("lcd standby...0 means resume\n"); - spi_screenreg_set(0x29, 0xffff, 0xffff); - spi_screenreg_set(0x11, 0xffff, 0xffff); - //mdelay(150); - } - - if(gLcd_info) - gLcd_info->io_deinit(); - rk29_lcd_spim_spin_unlock(); - return 0; -} - diff --git a/drivers/video/display/screen/lcd_nt35510.c b/drivers/video/display/screen/lcd_nt35510.c deleted file mode 100644 index c867d52bc182..000000000000 --- a/drivers/video/display/screen/lcd_nt35510.c +++ /dev/null @@ -1,1633 +0,0 @@ -#include -#include -#include -#include "../../rk29_fb.h" -#include -#include -#include -#include "screen.h" - -/* Base */ -#define OUT_TYPE SCREEN_RGB -#define OUT_FACE OUT_P888 -#define OUT_CLK 26*1000*1000 //***27 -#define LCDC_ACLK 300000000 //29 lcdc axi DMA Ƶ�� //rk29 - -/* Timing */ -#define H_PW 4 //8ǰÏûÓ° -#define H_BP 8//6 -#define H_VD 480//320 //***800 -#define H_FP 8//60 - -#define V_PW 4//12 -#define V_BP 8// 4 -#define V_VD 800//480 //***480 -#define V_FP 8//40 - -#define LCD_WIDTH 57 //lcd size *mm -#define LCD_HEIGHT 94 - -/* Other */ -#define DCLK_POL 1//0 -#define SWAP_RB 0 - -static struct rk29lcd_info *gLcd_info = NULL; - -int init(void); -int standby(u8 enable); - -#define TXD_PORT gLcd_info->txd_pin -#define CLK_PORT gLcd_info->clk_pin -#define CS_PORT gLcd_info->cs_pin - -#define CS_OUT() gpio_direction_output(CS_PORT, 1) -#define CS_SET() gpio_set_value(CS_PORT, GPIO_HIGH) -#define CS_CLR() gpio_set_value(CS_PORT, GPIO_LOW) -#define CLK_OUT() gpio_direction_output(CLK_PORT, 0) -#define CLK_SET() gpio_set_value(CLK_PORT, GPIO_HIGH) -#define CLK_CLR() gpio_set_value(CLK_PORT, GPIO_LOW) -#define TXD_OUT() gpio_direction_output(TXD_PORT, 1) -#define TXD_SET() gpio_set_value(TXD_PORT, GPIO_HIGH) -#define TXD_CLR() gpio_set_value(TXD_PORT, GPIO_LOW) - - -#define DRVDelayUs(i) udelay(i*4) -#if 0 -void spi_screenreg_cmd(u8 Addr) -{ - u32 i; - u32 control_bit; - - TXD_OUT(); - CLK_OUT(); - CS_OUT(); - DRVDelayUs(2); - DRVDelayUs(2); - - CS_SET(); - TXD_SET(); - CLK_CLR(); - DRVDelayUs(30); - - CS_CLR(); - control_bit = 0x0000; - Addr = (control_bit | Addr);//spi_screenreg_set(0x36, 0x0000, 0xffff); - //printk("addr is 0x%x \n", Addr); - for(i = 0; i < 9; i++) //reg - { - if(Addr &(1<<(8-i))) - TXD_SET(); - else - TXD_CLR(); - - // \u6a21\u62dfCLK - CLK_SET(); - DRVDelayUs(2); - CLK_CLR(); - DRVDelayUs(2); - } - - CS_SET(); - TXD_SET(); - CLK_CLR(); - DRVDelayUs(10); -} - - -void spi_screenreg_param(u8 Param) -{ - - u32 i; - u32 control_bit; - - CS_CLR(); - - control_bit = 0x0100; - Param = (control_bit | Param); - //printk("data0 is 0x%x \n", Data); - for(i = 0; i < 9; i++) //data - { - if(Param &(1<<(8-i))) - TXD_SET(); - else - TXD_CLR(); - - // \u6a21\u62dfCLK - CLK_SET(); - DRVDelayUs(2); - CLK_CLR(); - DRVDelayUs(2); - } - - CS_SET(); - CLK_CLR(); - TXD_CLR(); - DRVDelayUs(10); -} -#endif - -void set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info ) -{ - //printk("lcd_hx8357 set_lcd_info \n"); - /* screen type & face */ - screen->type = OUT_TYPE; - screen->face = OUT_FACE; - - /* Screen size */ - screen->x_res = H_VD; - screen->y_res = V_VD; - screen->width = LCD_WIDTH; //rk29 - screen->height = LCD_HEIGHT; //rk29 - - /* Timing */ - screen->lcdc_aclk = LCDC_ACLK; //rk29 - screen->pixclock = OUT_CLK; - screen->left_margin = H_BP; /*>2*/ - screen->right_margin = H_FP; /*>2*/ - screen->hsync_len = H_PW; /*>2*/ //***all > 326, 4upper_margin = V_BP; /*>2*/ - screen->lower_margin = V_FP; /*>2*/ - screen->vsync_len = V_PW; /*>6*/ - - /* Pin polarity */ - screen->pin_hsync = 0; - screen->pin_vsync = 0; - screen->pin_den = 0; - screen->pin_dclk = DCLK_POL; - - /* Swap rule */ - screen->swap_rb = 0; - screen->swap_rg = 0; - screen->swap_gb = 0; - screen->swap_delta = 0; - screen->swap_dumy = 0; - - /* Operation function*/ - screen->init = init; - screen->standby = standby; - if(lcd_info) - gLcd_info = lcd_info; -} - - -void WriteCommand( int Command) -{ - unsigned char i,count1, count2,count3,count4; - count1= Command>>8; - count2= Command; - count3=0x20;//00100000 //дÃüÁî¸ßλ - count4=0x00;//00000000 //дÃüÁîµÍλ======¾ßÌåÇë¿´ICµÄDatasheet - CS_CLR(); - for(i=0;i<8;i++) - { - CLK_CLR(); - if (count3 & 0x80) TXD_SET(); - else TXD_CLR(); - CLK_SET(); - count3<<=1; - } - - for(i=0;i<8;i++) - { - CLK_CLR(); - if (count1 & 0x80) TXD_SET(); - else TXD_CLR(); - CLK_SET(); - count1<<=1; - } - - for(i=0;i<8;i++) - { - CLK_CLR(); - if (count4 & 0x80) TXD_SET(); - else TXD_CLR(); - CLK_SET(); - count4<<=1; - } - - for(i=0;i<8;i++) - { - CLK_CLR(); - if (count2 & 0x80) TXD_SET(); - else TXD_CLR(); - CLK_SET(); - count2<<=1; - } - - CS_SET(); - -} - - - -void WriteParameter(char DH) -{ - unsigned char i, count1, count2,count3,count4; - count1=DH>>8; - count2=DH; - count3=0x60;//дÊý¾Ý¸ßλ - count4=0x40;//дÊý¾ÝµÍλ - - CS_CLR(); - /* - TXD_CLR(); CLK_CLR(); CLK_SET(); //WRITE - TXD_SET(); CLK_CLR(); CLK_SET(); //DATA - TXD_SET(); CLK_CLR(); CLK_SET(); //HIGH BYTE - TXD_CLR(); CLK_CLR(); CLK_SET(); - TXD_CLR(); CLK_CLR(); CLK_SET(); - TXD_CLR(); CLK_CLR(); CLK_SET(); - TXD_CLR(); CLK_CLR(); CLK_SET(); - TXD_CLR(); CLK_CLR(); CLK_SET(); - */ - /* - //ÒòΪÊý¾ÝµÄ¸ßλ»ù±¾ÊDz»Óõģ¬¿ÉÒÔ²»´«¸ßλ£¬Ö±½Ó´«µÍλ - for(i=0;i<8;i++) - { - CLK_CLR(); - if (count3 & 0x80) TXD_SET(); - else TXD_CLR(); - CLK_SET(); - count3<<=1; - } - - for(i=0;i<8;i++) - { - CLK_CLR(); - if (count1 & 0x80) TXD_SET(); - else TXD_CLR(); - CLK_SET(); - count1<<=1; - } - */ - - - for(i=0;i<8;i++) - { - CLK_CLR(); - if (count4 & 0x80) TXD_SET(); - else TXD_CLR(); - CLK_SET(); - count4<<=1; - } - - for(i=0;i<8;i++) - { - CLK_CLR(); - if (count2 & 0x80) TXD_SET(); - else TXD_CLR(); - CLK_SET(); - count2<<=1; - } - - CS_SET(); - -} - - -void init_nt35510(void) -{ - WriteCommand(0X1100); - usleep_range(10*1000, 10*1000); - - WriteCommand(0X1300); - - WriteCommand(0XF000); - WriteParameter(0x55); - - WriteCommand(0XF001); - WriteParameter(0xAA); - - WriteCommand(0XF002); - WriteParameter(0x52); - - WriteCommand(0XF003); - WriteParameter(0x08); - - WriteCommand(0XF004); - WriteParameter(0x01); - - //Gamma setting Red - WriteCommand(0XD100); - WriteParameter(0x00); - - WriteCommand(0XD101); - WriteParameter(0x20); - - WriteCommand(0XD102); - WriteParameter(0x00); - - WriteCommand(0XD103); - WriteParameter(0x2B); - - WriteCommand(0XD104); - WriteParameter(0x00); - - WriteCommand(0XD105); - WriteParameter(0x3C); - - WriteCommand(0XD106); - WriteParameter(0x00); - - WriteCommand(0XD107); - WriteParameter(0x56); - - WriteCommand(0XD108); - WriteParameter(0x00); - - WriteCommand(0XD109); - WriteParameter(0x68); - - WriteCommand(0XD10a); - WriteParameter(0x00); - - WriteCommand(0XD10b); - WriteParameter(0x87); - - WriteCommand(0XD10c); - WriteParameter(0x00); - - WriteCommand(0XD10d); - WriteParameter(0x9E); - - WriteCommand(0XD10e); - WriteParameter(0x00); - - WriteCommand(0XD10f); - WriteParameter(0xC6); - - WriteCommand(0XD110); - WriteParameter(0x00); - - WriteCommand(0XD111); - WriteParameter(0xE4); - - WriteCommand(0XD112); - WriteParameter(0x01); - - WriteCommand(0XD113); - WriteParameter(0x12); - - WriteCommand(0XD114); - WriteParameter(0x01); - - WriteCommand(0XD115); - WriteParameter(0x37); - - WriteCommand(0XD116); - WriteParameter(0x01); - - WriteCommand(0XD117); - WriteParameter(0x75); - - WriteCommand(0XD118); - WriteParameter(0x01); - - WriteCommand(0XD119); - WriteParameter(0xA5); - - WriteCommand(0XD11a); - WriteParameter(0x01); - - WriteCommand(0XD11b); - WriteParameter(0xA6); - - WriteCommand(0XD11c); - WriteParameter(0x01); - - WriteCommand(0XD11d); - WriteParameter(0xD0); - - WriteCommand(0XD11e); - WriteParameter(0x01); - - WriteCommand(0XD11f); - WriteParameter(0xF5); - - WriteCommand(0XD120); - WriteParameter(0x02); - - WriteCommand(0XD121); - WriteParameter(0x0A); - - WriteCommand(0XD122); - WriteParameter(0x02); - - WriteCommand(0XD123); - WriteParameter(0x26); - - WriteCommand(0XD124); - WriteParameter(0x02); - - WriteCommand(0XD125); - WriteParameter(0x3B); - - WriteCommand(0XD126); - WriteParameter(0x02); - - WriteCommand(0XD127); - WriteParameter(0x6B); - - WriteCommand(0XD128); - WriteParameter(0x02); - - WriteCommand(0XD129); - WriteParameter(0x99); - - WriteCommand(0XD12a); - WriteParameter(0x02); - - WriteCommand(0XD12b); - WriteParameter(0xDD); - - WriteCommand(0XD12C); - WriteParameter(0x03); - - WriteCommand(0XD12D); - WriteParameter(0x10); - - WriteCommand(0XD12E); - WriteParameter(0x03); - - WriteCommand(0XD12F); - WriteParameter(0x26); - - WriteCommand(0XD130); - WriteParameter(0x03); - - WriteCommand(0XD131); - WriteParameter(0x32); - - WriteCommand(0XD132); - WriteParameter(0x03); - - WriteCommand(0XD133); - WriteParameter(0x9A); - - //Gamma setting Green - WriteCommand(0XD200); - WriteParameter(0x00); - - WriteCommand(0XD201); - WriteParameter(0xa0); - - WriteCommand(0XD202); - WriteParameter(0x00); - - WriteCommand(0XD203); - WriteParameter(0xa9); - - WriteCommand(0XD204); - WriteParameter(0x00); - - WriteCommand(0XD205); - WriteParameter(0xb5); - - WriteCommand(0XD206); - WriteParameter(0x00); - - WriteCommand(0XD207); - WriteParameter(0xbf); - - WriteCommand(0XD208); - WriteParameter(0x00); - - WriteCommand(0XD209); - WriteParameter(0xc9); - - WriteCommand(0XD20a); - WriteParameter(0x00); - - WriteCommand(0XD20b); - WriteParameter(0xdc); - - WriteCommand(0XD20c); - WriteParameter(0x00); - - WriteCommand(0XD20d); - WriteParameter(0xEE); - - WriteCommand(0XD20e); - WriteParameter(0x01); - - WriteCommand(0XD20f); - WriteParameter(0x0A); - - WriteCommand(0XD210); - WriteParameter(0x01); - - WriteCommand(0XD211); - WriteParameter(0x21); - - WriteCommand(0XD212); - WriteParameter(0x01); - - WriteCommand(0XD213); - WriteParameter(0x48); - - WriteCommand(0XD214); - WriteParameter(0x01); - - WriteCommand(0XD215); - WriteParameter(0x67); - - WriteCommand(0XD216); - WriteParameter(0x01); - - WriteCommand(0XD217); - WriteParameter(0x97); - - WriteCommand(0XD218); - WriteParameter(0x01); - - WriteCommand(0XD219); - WriteParameter(0xBE); - - WriteCommand(0XD21a); - WriteParameter(0x01); - - WriteCommand(0XD21b); - WriteParameter(0xC0); - - WriteCommand(0XD21c); - WriteParameter(0x01); - - WriteCommand(0XD21d); - WriteParameter(0xE1); - - WriteCommand(0XD21e); - WriteParameter(0x02); - - WriteCommand(0XD21f); - WriteParameter(0x04); - - WriteCommand(0XD220); - WriteParameter(0x02); - - WriteCommand(0XD221); - WriteParameter(0x17); - - WriteCommand(0XD222); - WriteParameter(0x02); - - WriteCommand(0XD223); - WriteParameter(0x36); - - WriteCommand(0XD224); - WriteParameter(0x02); - - WriteCommand(0XD225); - WriteParameter(0x50); - - WriteCommand(0XD226); - WriteParameter(0x02); - - WriteCommand(0XD227); - WriteParameter(0x7E); - - WriteCommand(0XD228); - WriteParameter(0x02); - - WriteCommand(0XD229); - WriteParameter(0xAC); - - WriteCommand(0XD22a); - WriteParameter(0x02); - - WriteCommand(0XD22b); - WriteParameter(0xF1); - - WriteCommand(0XD22C); - WriteParameter(0x03); - - WriteCommand(0XD22D); - WriteParameter(0x20); - - WriteCommand(0XD22E); - WriteParameter(0x03); - - WriteCommand(0XD22F); - WriteParameter(0x38); - - WriteCommand(0XD230); - WriteParameter(0x03); - - WriteCommand(0XD231); - WriteParameter(0x43); - - WriteCommand(0XD232); - WriteParameter(0x03); - - WriteCommand(0XD233); - WriteParameter(0x9A); - - - //Gamma setting Blue - WriteCommand(0XD300); - WriteParameter(0x00); - - WriteCommand(0XD301); - WriteParameter(0x50); - - WriteCommand(0XD302); - WriteParameter(0x00); - - WriteCommand(0XD303); - WriteParameter(0x53); - - WriteCommand(0XD304); - WriteParameter(0x00); - - WriteCommand(0XD305); - WriteParameter(0x73); - - WriteCommand(0XD306); - WriteParameter(0x00); - - WriteCommand(0XD307); - WriteParameter(0x89); - - WriteCommand(0XD308); - WriteParameter(0x00); - - WriteCommand(0XD309); - WriteParameter(0x9f); - - WriteCommand(0XD30a); - WriteParameter(0x00); - - WriteCommand(0XD30b); - WriteParameter(0xc1); - - WriteCommand(0XD30c); - WriteParameter(0x00); - - WriteCommand(0XD30d); - WriteParameter(0xda); - - WriteCommand(0XD30e); - WriteParameter(0x01); - - WriteCommand(0XD30f); - WriteParameter(0x02); - - WriteCommand(0XD310); - WriteParameter(0x01); - - WriteCommand(0XD311); - WriteParameter(0x23); - - WriteCommand(0XD312); - WriteParameter(0x01); - - WriteCommand(0XD313); - WriteParameter(0x50); - - WriteCommand(0XD314); - WriteParameter(0x01); - - WriteCommand(0XD315); - WriteParameter(0x6f); - - WriteCommand(0XD316); - WriteParameter(0x01); - - WriteCommand(0XD317); - WriteParameter(0x9f); - - WriteCommand(0XD318); - WriteParameter(0x01); - - WriteCommand(0XD319); - WriteParameter(0xc5); - - WriteCommand(0XD31a); - WriteParameter(0x01); - - WriteCommand(0XD31b); - WriteParameter(0xC6); - - WriteCommand(0XD31c); - WriteParameter(0x01); - - WriteCommand(0XD31d); - WriteParameter(0xE3); - - WriteCommand(0XD31e); - WriteParameter(0x02); - - WriteCommand(0XD31f); - WriteParameter(0x08); - - WriteCommand(0XD320); - WriteParameter(0x02); - - WriteCommand(0XD321); - WriteParameter(0x16); - - WriteCommand(0XD322); - WriteParameter(0x02); - - WriteCommand(0XD323); - WriteParameter(0x2b); - - WriteCommand(0XD324); - WriteParameter(0x02); - - WriteCommand(0XD325); - WriteParameter(0x4d); - - WriteCommand(0XD326); - WriteParameter(0x02); - - WriteCommand(0XD327); - WriteParameter(0x6f); - - WriteCommand(0XD328); - WriteParameter(0x02); - - WriteCommand(0XD329); - WriteParameter(0x8C); - - WriteCommand(0XD32a); - WriteParameter(0x02); - - WriteCommand(0XD32b); - WriteParameter(0xd6); - - WriteCommand(0XD32C); - WriteParameter(0x03); - - WriteCommand(0XD32D); - WriteParameter(0x12); - - WriteCommand(0XD32E); - WriteParameter(0x03); - - WriteCommand(0XD32F); - WriteParameter(0x28); - - WriteCommand(0XD330); - WriteParameter(0x03); - - WriteCommand(0XD331); - WriteParameter(0x3e); - - WriteCommand(0XD332); - WriteParameter(0x03); - - WriteCommand(0XD333); - WriteParameter(0x9A); - - //Gamma setting Red - WriteCommand(0XD400); - WriteParameter(0x00); - - WriteCommand(0XD401); - WriteParameter(0x20); - - WriteCommand(0XD402); - WriteParameter(0x00); - - WriteCommand(0XD403); - WriteParameter(0x2b); - - WriteCommand(0XD404); - WriteParameter(0x00); - - WriteCommand(0XD405); - WriteParameter(0x3c); - - WriteCommand(0XD406); - WriteParameter(0x00); - - WriteCommand(0XD407); - WriteParameter(0x56); - - WriteCommand(0XD408); - WriteParameter(0x00); - - WriteCommand(0XD409); - WriteParameter(0x68); - - WriteCommand(0XD40a); - WriteParameter(0x00); - - WriteCommand(0XD40b); - WriteParameter(0x87); - - WriteCommand(0XD40c); - WriteParameter(0x00); - - WriteCommand(0XD40d); - WriteParameter(0x9e); - - WriteCommand(0XD40e); - WriteParameter(0x00); - - WriteCommand(0XD40f); - WriteParameter(0xc6); - - WriteCommand(0XD410); - WriteParameter(0x00); - - WriteCommand(0XD411); - WriteParameter(0xe4); - - WriteCommand(0XD412); - WriteParameter(0x01); - - WriteCommand(0XD413); - WriteParameter(0x12); - - WriteCommand(0XD414); - WriteParameter(0x01); - - WriteCommand(0XD415); - WriteParameter(0x37); - - WriteCommand(0XD416); - WriteParameter(0x01); - - WriteCommand(0XD417); - WriteParameter(0x75); - - WriteCommand(0XD418); - WriteParameter(0x01); - - WriteCommand(0XD419); - WriteParameter(0xa5); - - WriteCommand(0XD41a); - WriteParameter(0x01); - - WriteCommand(0XD41b); - WriteParameter(0xa6); - - WriteCommand(0XD41c); - WriteParameter(0x01); - - WriteCommand(0XD41d); - WriteParameter(0xd0); - - WriteCommand(0XD41e); - WriteParameter(0x01); - - WriteCommand(0XD41f); - WriteParameter(0xf5); - - WriteCommand(0XD420); - WriteParameter(0x02); - - WriteCommand(0XD421); - WriteParameter(0x0a); - - WriteCommand(0XD422); - WriteParameter(0x02); - - WriteCommand(0XD423); - WriteParameter(0x26); - - WriteCommand(0XD424); - WriteParameter(0x02); - - WriteCommand(0XD425); - WriteParameter(0x3b); - - WriteCommand(0XD426); - WriteParameter(0x02); - - WriteCommand(0XD427); - WriteParameter(0x6b); - - WriteCommand(0XD428); - WriteParameter(0x02); - - WriteCommand(0XD429); - WriteParameter(0x99); - - WriteCommand(0XD42a); - WriteParameter(0x02); - - WriteCommand(0XD42b); - WriteParameter(0xdd); - - WriteCommand(0XD42C); - WriteParameter(0x03); - - WriteCommand(0XD42D); - WriteParameter(0x10); - - WriteCommand(0XD42E); - WriteParameter(0x03); - - WriteCommand(0XD42F); - WriteParameter(0x26); - - WriteCommand(0XD430); - WriteParameter(0x03); - - WriteCommand(0XD431); - WriteParameter(0x32); - - WriteCommand(0XD432); - WriteParameter(0x03); - - WriteCommand(0XD433); - WriteParameter(0x9A); - - //Gamma setting Green - WriteCommand(0XD500); - WriteParameter(0x00); - - WriteCommand(0XD501); - WriteParameter(0xa0); - - WriteCommand(0XD502); - WriteParameter(0x00); - - WriteCommand(0XD503); - WriteParameter(0xa9); - - WriteCommand(0XD504); - WriteParameter(0x00); - - WriteCommand(0XD505); - WriteParameter(0xb5); - - WriteCommand(0XD506); - WriteParameter(0x00); - - WriteCommand(0XD507); - WriteParameter(0xbf); - - WriteCommand(0XD508); - WriteParameter(0x00); - - WriteCommand(0XD509); - WriteParameter(0xc9); - - WriteCommand(0XD50a); - WriteParameter(0x00); - - WriteCommand(0XD50b); - WriteParameter(0xdc); - - WriteCommand(0XD50c); - WriteParameter(0x00); - - WriteCommand(0XD50d); - WriteParameter(0xee); - - WriteCommand(0XD50e); - WriteParameter(0x01); - - WriteCommand(0XD50f); - WriteParameter(0x0a); - - WriteCommand(0XD510); - WriteParameter(0x01); - - WriteCommand(0XD511); - WriteParameter(0x21); - - WriteCommand(0XD512); - WriteParameter(0x01); - - WriteCommand(0XD513); - WriteParameter(0x48); - - WriteCommand(0XD514); - WriteParameter(0x01); - - WriteCommand(0XD515); - WriteParameter(0x67); - - WriteCommand(0XD516); - WriteParameter(0x01); - - WriteCommand(0XD517); - WriteParameter(0x97); - - WriteCommand(0XD518); - WriteParameter(0x01); - - WriteCommand(0XD519); - WriteParameter(0xbe); - - WriteCommand(0XD51a); - WriteParameter(0x01); - - WriteCommand(0XD51b); - WriteParameter(0xc0); - - WriteCommand(0XD51c); - WriteParameter(0x01); - - WriteCommand(0XD51d); - WriteParameter(0xe1); - - WriteCommand(0XD51e); - WriteParameter(0x02); - - WriteCommand(0XD51f); - WriteParameter(0x04); - - WriteCommand(0XD520); - WriteParameter(0x02); - - WriteCommand(0XD521); - WriteParameter(0x17); - - WriteCommand(0XD522); - WriteParameter(0x02); - - WriteCommand(0XD523); - WriteParameter(0x36); - - WriteCommand(0XD524); - WriteParameter(0x02); - - WriteCommand(0XD525); - WriteParameter(0x50); - - WriteCommand(0XD526); - WriteParameter(0x02); - - WriteCommand(0XD527); - WriteParameter(0x7e); - - WriteCommand(0XD528); - WriteParameter(0x02); - - WriteCommand(0XD529); - WriteParameter(0xac); - - WriteCommand(0XD52a); - WriteParameter(0x02); - - WriteCommand(0XD52b); - WriteParameter(0xf1); - - WriteCommand(0XD52C); - WriteParameter(0x03); - - WriteCommand(0XD52D); - WriteParameter(0x20); - - WriteCommand(0XD52E); - WriteParameter(0x03); - - WriteCommand(0XD52F); - WriteParameter(0x38); - - WriteCommand(0XD530); - WriteParameter(0x03); - - WriteCommand(0XD531); - WriteParameter(0x43); - - WriteCommand(0XD532); - WriteParameter(0x03); - - WriteCommand(0XD533); - WriteParameter(0x9A); - - //Gamma setting Blue - WriteCommand(0XD600); - WriteParameter(0x00); - - WriteCommand(0XD601); - WriteParameter(0x50); - - WriteCommand(0XD602); - WriteParameter(0x00); - - WriteCommand(0XD603); - WriteParameter(0x53); - - WriteCommand(0XD604); - WriteParameter(0x00); - - WriteCommand(0XD605); - WriteParameter(0x73); - - WriteCommand(0XD606); - WriteParameter(0x00); - - WriteCommand(0XD607); - WriteParameter(0x89); - - WriteCommand(0XD608); - WriteParameter(0x00); - - WriteCommand(0XD609); - WriteParameter(0x9f); - - WriteCommand(0XD60a); - WriteParameter(0x00); - - WriteCommand(0XD60b); - WriteParameter(0xc1); - - WriteCommand(0XD60c); - WriteParameter(0x00); - - WriteCommand(0XD60d); - WriteParameter(0xda); - - WriteCommand(0XD60e); - WriteParameter(0x01); - - WriteCommand(0XD60f); - WriteParameter(0x02); - - WriteCommand(0XD610); - WriteParameter(0x01); - - WriteCommand(0XD611); - WriteParameter(0x23); - - WriteCommand(0XD612); - WriteParameter(0x01); - - WriteCommand(0XD613); - WriteParameter(0x50); - - WriteCommand(0XD614); - WriteParameter(0x01); - - WriteCommand(0XD615); - WriteParameter(0x6f); - - WriteCommand(0XD616); - WriteParameter(0x01); - - WriteCommand(0XD617); - WriteParameter(0x9f); - - WriteCommand(0XD618); - WriteParameter(0x01); - - WriteCommand(0XD619); - WriteParameter(0xc5); - - WriteCommand(0XD61a); - WriteParameter(0x01); - - WriteCommand(0XD61b); - WriteParameter(0xc6); - - WriteCommand(0XD61c); - WriteParameter(0x01); - - WriteCommand(0XD61d); - WriteParameter(0xe3); - - WriteCommand(0XD61e); - WriteParameter(0x02); - - WriteCommand(0XD61f); - WriteParameter(0x08); - - WriteCommand(0XD620); - WriteParameter(0x02); - - WriteCommand(0XD621); - WriteParameter(0x16); - - WriteCommand(0XD622); - WriteParameter(0x02); - - WriteCommand(0XD623); - WriteParameter(0x2b); - - WriteCommand(0XD624); - WriteParameter(0x02); - - WriteCommand(0XD625); - WriteParameter(0x4d); - - WriteCommand(0XD626); - WriteParameter(0x02); - - WriteCommand(0XD627); - WriteParameter(0x6f); - - WriteCommand(0XD628); - WriteParameter(0x02); - - WriteCommand(0XD629); - WriteParameter(0x8c); - - WriteCommand(0XD62a); - WriteParameter(0x02); - - WriteCommand(0XD62b); - WriteParameter(0xd6); - - WriteCommand(0XD62C); - WriteParameter(0x03); - - WriteCommand(0XD62D); - WriteParameter(0x12); - - WriteCommand(0XD62E); - WriteParameter(0x03); - - WriteCommand(0XD62F); - WriteParameter(0x28); - - WriteCommand(0XD630); - WriteParameter(0x03); - - WriteCommand(0XD631); - WriteParameter(0x3e); - - WriteCommand(0XD632); - WriteParameter(0x03); - - WriteCommand(0XD633); - WriteParameter(0x9A); - - WriteCommand(0XBA00); - WriteParameter(0x14); - - WriteCommand(0XBA01); - WriteParameter(0x14); - - WriteCommand(0XBA02); - WriteParameter(0x14); - - WriteCommand(0XBF00); - WriteParameter(0x01); - - WriteCommand(0XB300); - WriteParameter(0x07); - - WriteCommand(0XB301); - WriteParameter(0x07); - - WriteCommand(0XB302); - WriteParameter(0x07); - - WriteCommand(0XB900); - WriteParameter(0x25); - - WriteCommand(0XB901); - WriteParameter(0x25); - - WriteCommand(0XB902); - WriteParameter(0x25); - - - - WriteCommand(0XBC01); - WriteParameter(0xA0); - - WriteCommand(0XBC02); - WriteParameter(0x00); - - WriteCommand(0XBD01); - WriteParameter(0xA0); - - WriteCommand(0XBD02); - WriteParameter(0x00); - - - WriteCommand(0XF000); - WriteParameter(0x55); - - WriteCommand(0XF001); - WriteParameter(0xAA); - - WriteCommand(0XF002); - WriteParameter(0x52); - - WriteCommand(0XF003); - WriteParameter(0x08); - - WriteCommand(0XF004); - WriteParameter(0x00); - - WriteCommand(0XB100); - WriteParameter(0xCC); - - WriteCommand(0XBC00); - WriteParameter(0x05); - - WriteCommand(0XBC01); - WriteParameter(0x05); - - WriteCommand(0XBC02); - WriteParameter(0x05); - - - WriteCommand(0XBD02); - WriteParameter(0x07); - WriteCommand(0XBD03); - WriteParameter(0x31); - - WriteCommand(0XBE02); - WriteParameter(0x07); - WriteCommand(0XBE03); - WriteParameter(0x31); - - WriteCommand(0XBF02); - WriteParameter(0x07); - WriteCommand(0XBF03); - WriteParameter(0x31); -/* - WriteCommand(0XFF00); - WriteParameter(0xAA); - WriteCommand(0XFF01); - WriteParameter(0x55); - WriteCommand(0XFF02); - WriteParameter(0x25); - WriteCommand(0XFF03); - WriteParameter(0x01); -*/ -/*****************************************************************/ - WriteCommand(0XF000);WriteParameter(0x55);//ENABLE High Mode - WriteCommand(0XF001);WriteParameter(0xAA); - WriteCommand(0XF002);WriteParameter(0x52); - WriteCommand(0XF003);WriteParameter(0x08); - WriteCommand(0XF004);WriteParameter(0x00); - - WriteCommand(0XB400);WriteParameter(0x10); - - WriteCommand(0XFF00);WriteParameter(0xAA);//ENABLE LV3 - WriteCommand(0XFF01);WriteParameter(0x55); - WriteCommand(0XFF02);WriteParameter(0x25); - WriteCommand(0XFF03);WriteParameter(0x01); - - WriteCommand(0XF900);WriteParameter(0x14);//ÖеÈÔöÑÞÏÔʾЧ¹û - WriteCommand(0XF901);WriteParameter(0x00); - WriteCommand(0XF902);WriteParameter(0x0A); - WriteCommand(0XF903);WriteParameter(0x11); - WriteCommand(0XF904);WriteParameter(0x17); - WriteCommand(0XF905);WriteParameter(0x1D); - WriteCommand(0XF906);WriteParameter(0x24); - WriteCommand(0XF907);WriteParameter(0x2A); - WriteCommand(0XF908);WriteParameter(0x31); - WriteCommand(0XF909);WriteParameter(0x37); - WriteCommand(0XF90A);WriteParameter(0x3D); -/* - WriteCommand(0XF900);WriteParameter(0x14);//¸ßµÈÔöÑÞÏÔʾЧ¹û - WriteCommand(0XF901);WriteParameter(0x00); - WriteCommand(0XF902);WriteParameter(0x0D); - WriteCommand(0XF903);WriteParameter(0x1A); - WriteCommand(0XF904);WriteParameter(0x26); - WriteCommand(0XF905);WriteParameter(0x33); - WriteCommand(0XF906);WriteParameter(0x40); - WriteCommand(0XF907);WriteParameter(0x4D); - WriteCommand(0XF908);WriteParameter(0x5A); - WriteCommand(0XF909);WriteParameter(0x66); - WriteCommand(0XF90A);WriteParameter(0x73); -*/ -/******************************************************************/ - WriteCommand(0X3500); - WriteParameter(0x00); - - WriteCommand(0X3a00); - -if(OUT_FACE == OUT_P888) - WriteParameter(0x70); //24bit -else if(OUT_FACE == OUT_P666) - WriteParameter(0x60);//18bit - - WriteCommand(0X3600); - WriteParameter(0x00);//R<->B - - WriteCommand(0X2000); // - - WriteCommand(0X1100); - usleep_range(120*1000, 120*1000); - - WriteCommand(0X2900); - - usleep_range(100*1000, 100*1000); - WriteCommand(0X2C00); -} - - -void resume_nt35510(void) -{ - WriteCommand(0X1100); - msleep(120); - - WriteCommand(0X1300); - - WriteCommand(0XF000); - WriteParameter(0x55); - - WriteCommand(0XF001); - WriteParameter(0xAA); - - WriteCommand(0XF002); - WriteParameter(0x52); - - WriteCommand(0XF003); - WriteParameter(0x08); - - WriteCommand(0XF004); - WriteParameter(0x01); - - - /**************/ - WriteCommand(0XBA00); - WriteParameter(0x14); - - WriteCommand(0XBA01); - WriteParameter(0x14); - - WriteCommand(0XBA02); - WriteParameter(0x14); - - WriteCommand(0XBF00); - WriteParameter(0x01); - - WriteCommand(0XB300); - WriteParameter(0x07); - - WriteCommand(0XB301); - WriteParameter(0x07); - - WriteCommand(0XB302); - WriteParameter(0x07); - - WriteCommand(0XB900); - WriteParameter(0x25); - - WriteCommand(0XB901); - WriteParameter(0x25); - - WriteCommand(0XB902); - WriteParameter(0x25); - - - - WriteCommand(0XBC01); - WriteParameter(0xA0); - - WriteCommand(0XBC02); - WriteParameter(0x00); - - WriteCommand(0XBD01); - WriteParameter(0xA0); - - WriteCommand(0XBD02); - WriteParameter(0x00); - - - WriteCommand(0XF000); - WriteParameter(0x55); - - WriteCommand(0XF001); - WriteParameter(0xAA); - - WriteCommand(0XF002); - WriteParameter(0x52); - - WriteCommand(0XF003); - WriteParameter(0x08); - - WriteCommand(0XF004); - WriteParameter(0x00); - - WriteCommand(0XB100); - WriteParameter(0xCC); - - WriteCommand(0XBC00); - WriteParameter(0x05); - - WriteCommand(0XBC01); - WriteParameter(0x05); - - WriteCommand(0XBC02); - WriteParameter(0x05); - - - WriteCommand(0XBD02); - WriteParameter(0x07); - WriteCommand(0XBD03); - WriteParameter(0x31); - - WriteCommand(0XBE02); - WriteParameter(0x07); - WriteCommand(0XBE03); - WriteParameter(0x31); - - WriteCommand(0XBF02); - WriteParameter(0x07); - WriteCommand(0XBF03); - WriteParameter(0x31); - - WriteCommand(0XFF00); - WriteParameter(0xAA); - WriteCommand(0XFF01); - WriteParameter(0x55); - WriteCommand(0XFF02); - WriteParameter(0x25); - WriteCommand(0XFF03); - WriteParameter(0x01); - - - WriteCommand(0X3500); - WriteParameter(0x00); - - WriteCommand(0X3a00); - -if(OUT_FACE == OUT_P888) - WriteParameter(0x70); //24bit -else if(OUT_FACE == OUT_P666) - WriteParameter(0x60);//18bit - - WriteCommand(0X3600); - WriteParameter(0x00);//R<->B - - WriteCommand(0X2000); // - - WriteCommand(0X1100); - msleep(120); - - WriteCommand(0X2900); - - msleep(100); - WriteCommand(0X2C00); -} - -static DEFINE_MUTEX(lcd_mutex); -extern void rk29_lcd_spim_spin_lock(void); -extern void rk29_lcd_spim_spin_unlock(void); - -static void lcd_resume(struct work_struct *work) -{ - mutex_lock(&lcd_mutex); - rk29_lcd_spim_spin_lock(); - if(gLcd_info) - gLcd_info->io_init(); - init_nt35510(); - //resume_nt35510();//may be fail to wake up LCD some time,so change to init lcd again - printk(KERN_DEBUG "%s\n",__FUNCTION__); - - if(gLcd_info) - gLcd_info->io_deinit(); - - rk29_lcd_spim_spin_unlock(); - mutex_unlock(&lcd_mutex); -} - -static DECLARE_WORK(lcd_resume_work, lcd_resume); -static struct workqueue_struct *lcd_resume_wq; - -static void lcd_late_resume(struct early_suspend *h) -{ - queue_work(lcd_resume_wq, &lcd_resume_work); -} - -static struct early_suspend lcd_early_suspend_desc = { - .level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1, // before fb resume - .resume = lcd_late_resume, -}; - -int init(void) -{ - volatile u32 data; - printk("lcd init...\n"); - if(gLcd_info) - gLcd_info->io_init(); - init_nt35510(); - - if(gLcd_info) - gLcd_info->io_deinit(); - - lcd_resume_wq = create_singlethread_workqueue("lcd"); - register_early_suspend(&lcd_early_suspend_desc); - return 0; -} - -int standby(u8 enable) //***enable =1 means suspend, 0 means resume -{ - if (enable) { - mutex_lock(&lcd_mutex); - rk29_lcd_spim_spin_lock(); - if(gLcd_info) - gLcd_info->io_init(); - - WriteCommand(0X2800); - WriteCommand(0X1100); - msleep(5); - WriteCommand(0X4f00); - WriteParameter(0x01); - if(gLcd_info) - gLcd_info->io_deinit(); - - rk29_lcd_spim_spin_unlock(); - mutex_unlock(&lcd_mutex); - } else { - flush_workqueue(lcd_resume_wq); - } - return 0; -} - - diff --git a/drivers/video/display/screen/lcd_null.c b/drivers/video/display/screen/lcd_null.c deleted file mode 100644 index 9871f653e83c..000000000000 --- a/drivers/video/display/screen/lcd_null.c +++ /dev/null @@ -1,13 +0,0 @@ - -#include -#include -#include "../../rk29_fb.h" -#include -#include -#include - -void set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info) -{ - memset(screen, 0, sizeof(struct rk29fb_screen)); - screen->face = OUT_P666; -} diff --git a/drivers/video/display/screen/screen.h b/drivers/video/display/screen/screen.h deleted file mode 100644 index 40a8c178f10d..000000000000 --- a/drivers/video/display/screen/screen.h +++ /dev/null @@ -1 +0,0 @@ -/* empty */ diff --git a/drivers/video/fb.uu b/drivers/video/fb.uu deleted file mode 100644 index 6923fb9861a0..000000000000 --- a/drivers/video/fb.uu +++ /dev/null @@ -1,1187 +0,0 @@ -begin 644 fb.o -M?T5,1@$!`0````````````$`*``!``````````````#X<0``````!30````` -M`"@`>`!U`!!`+>F?+Y#A`2!"XI(?@.$``#'C^O__&@``4N,0@+T8(#*0Y50P -MD^4``%/C$("]"#/_+^$0@+WH(#"1Y0$`4^,!`*"3'O\OD3`PD.4\()#E`@!3 -MX0H``!HD$)#E`0!3X0<``!HL$)#E.,"0Y0P`4>$#```:(,"0Y0P`4>$#`*`! -M'O\O`200D.4#,(+@`0"#X![_+^$P0"WI#$"=Y0<``.H,4-+G#%#`YP'`C.(# -M`%SA^O__.@,@@N`!`(#@`4!$X@``5.,P@+T(`,"@X_;__^KP3RWI%-!-XO^O -M`.,#4(#@/,"=Y0&P@^(X@)WE`V""X!JLH.$#D*#A>J#OYAX``.H#<-#G`Q#2 -MYT!0G>4'<`K@476'X0-PP.<#<-+G`3"#XA=\H.$$<,#G"0!3X0%`A.+R__\Z -M!%"=Y0L@@N!$<)WE`8!(X@!`UN4`,-7E!P!4*,`/@`!"=Y50W@^$` -M,,7E`##6-0$`@.`+8(;@$SR@,0$PQ34!4(7@``!8XP!`H!,$4(T5!#"@$0`0 -MC17D__\:%-"-XO"/O>CP02WI`4"@X1@0D>4"8*#A#,"4Y01P$>(`4)3E!P`` -M"B`RD.5`,)/E``!3XQ@```H!#!'C%@``"C/_+^$4``#J"#"4Y0'`3.($@)3E -M`S",X`PPP^$#P(;@"`!@$,)_E$`"#Y1[_ -M+^$`````,$`MZ=!`PN$!`*#C`!"@XP!`E.`!4*7@\$#"X0``5>,$``#*`0`` -M&A\`5.,!``"*`@"@X3"`O>@``*#C,("]Z/!'+>D48)'E`5"@X0!`H.$``%;C -M**"0Y1(```J$,)'E`0P3XP@```J\'M#A``!1XPX```H&`*#A_O__ZP!P4>(' -MH*`!"@``"@@``.JZ'M#A``!1XP4```H&`*#A_O__ZP``4>,!```:`'"@XP`` -M`.H5<.#C$("5Y0``6.,&```*N![4X0``4>,B```*"`"@X?[__^L``%'C'@`` -M&@``5^,<```:(#*4Y2@PD^4``%/C&```"C`@E.4"H&K@"@!6X10``(HL$)3E -M)""4Y0$@8N`"`%CA#P``B@4`H.$$$*#A,_\OX0``4./PA[T8A#"5Y1`0E>4! -M#!/C%""5Y:@PE.4T$(3E`3R#$P$\PP,X((3EJ#"$Y?"'O>@5`.#C\(>]Z!!` -M+>D!0*#A+`"?Y?[__^L$,)3E``!3XP4``,H"```:`#"4Y1\`4^,!``"*!`"@ -MX1"`O>@``*#C$("]Z`````!P0"WI:$"1Y0Q0A.(%`*#A_O__ZR`RE.4(,)/E -M``!3XP(```H$`*#A`1"@XS/_+^$@,I3E``"3Y?[__^L%`*#A_O__ZP0`H.'R -M_O_K``"@XW"`O>@?`%#C$$`MZ0!`H.$20."##0``BC@`G^7^___K-#"?Y01! -M@^`40)3E``!4XP0```J?/Y3A`3"#XI,OA.$``#+C^O__&@@`G^7^___K!`"@ -MX1"`O>@`````````````G^7^___J`````'!`+>D`0*#A#%"`X@4`H.'^___K -M($*4Y0``5.,!`*`3<("]&`4`H.'^___K!`"@X7"`O>CP02WI8$"0Y0%0H.'_ -M1,3C#T;$XP0`H.'1___K`&!0X@@``!H($9_E!""@X0$`@.+^___K!`"@X,_,,/C!!"3Y0$0@>($$(/E`#"2Y0(`4^,!<*`3 -M`'"@`S0QDA4`(),5!R""$``@@Q4-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^4` -M,)/E`@`3XP````K^___K``!7XQ)0X`,-```*:&"%Y2`REN4$,)/E``!3XP-0 -MH`$'```*!@"@X0$0H.,S_R_A`%!0X@(```H@,I;E``"3Y?[__^L$`*#A_O__ -MZP``5>,!```*!@"@X7[^_^L%`*#A\(&]Z`````#W12WI##"0Y0%`H.%T$9_E -M:""0Y2`PD^5@,)/E_S3#XP\VP^,#,8'@%&"3Y0(`5N%/```:``!6XTT```I( -M@)3E1#&?Y0,`6.%+``"*('*6Y0``5^-&```*&%"&X@4`H.'^___K3#"7Y0`` -M4^,%```*!!"@X08`H.$S_R_A`$"@X04`H.$0``#JU*"6Y0B&H.'8<);E"CJ@ -MX?]^A^(/<(?B(SJ@X0-PA^#_?L?C#W#'XP<`6.$0```ZA#"6Y0``4^,#```* -M!0"@X15`X./^___K*@``ZO2@EN4(@&?@^'"6Y0HZH.'_?H?B#W"'XB,ZH.$# -M<(?@_W['XP]PQ^,%`*#A_O__ZPP`E.D",$/@"#"#X`<`4^$8``"*_Z[*XQ@P -ME.4/H,KC"("*X"$Y@^,#`*#A&#"$Y2B&H.%(@(3E_O__ZPH`E.D((*#A`S!A -MX#S`P.,$`*#A!,",XQ3`A.4`P(WE_O__ZP``4.,`0*`!"D#@$P(``.H20.#C -M````ZA5`X.,$`*#A_H6]Z`````#__P\`-T`MZ0%0H.$`0*#A_O__ZP``4.,/ -M```*"!"-X@``5>,(0"'E!0``"@T0H.$"`*#C_O__ZP$PH.,\,H3E`P``ZCQ2 -MA.4-$*#A`P"@X_[__^L,`(3B_O__ZSZ`O>@P0"WI%-!-X@0`4>,`0*#A!!"- -MY00PH,,$,(W%(#*0Y20PD^4``%/C%5#@`PH```H$`)WE!!"@X3/_+^$`4%#B -M!0``&@D`@.(($(WB!#"-X@A`C>4,,(WE_O__ZP4`H.$4T(WB,("]Z)0QG^4" -M$*#CD"&?Y1!`+>F4$,+EPR\3Y4_P?_7+/Q/E3_!_]0(XH.$B**#A(SB@X4_P -M?_5H$9_E^\\1Y4_P?_4'PLSC^\\!Y:\?$>5/\'_U41[BYP(`4>,?```:^Q]# -MXB@`4>,$``"*N\]"XI$?0N(H`%'C*`!<@T```)K['T+B*`!1XP0``(J[ST/B -MD1]#XB@`4>,H`%R#.```FDD>0^(,$$'BC`!1XP,``(J['T+B`A!!XD8`4>,P -M``":21Y"X@P00>*,`%'C`P``BKL?0^("$$'B1@!1XR@``)I/\'_UO!"?Y?O/ -M$>5/\'_U!\+,X_O/`>6O'Q'E3_!_]5$>XN<#`%'C$("]&*\?0^(H`%'C`P`` -MBDX>0N(,$$'B*`!1XQ8``)JO'T+B*`!1XP,``(I.'D/B#!!!XB@`4>,/``": -M0AY#X@000>(H`%'C`P``BG8>0N(,$$'B*`!1XP<``)I"+D+B!"!"XB@`4N,0 -M@+V(=CY#X@PP0^(H`%/C$("]B`,"D#B_O__ZQ0`G^7^___K@``,\?[_ -M_^K_S[#^`````/_OT_X%````]T\MZ0S`D.5H<)#E`Y"@X0&PH.$"4*#A(`"< -MY;#!G^4`8)/E8`"0Y?\$P.,/!L#C``&,X!1`D.4'`%3A80``&@``5.-?```* -M,`*4Y0``4.-<```*/`*4Y0``4.,`0.`360``&B`"E.40P)#E``!,%`*`Q`0J@ -M(]`0H./^___K`(!0X@M`X`,Y```*(#*4Y3`BE.5`,)/E!F""X`1@C>4``%/C -M`0``"@0`H.$S_R_A#3"@X0!`H.-_K7^___KT"#)X09`A.`&()+@QC^CX/`@R>$``%7C -MV?__&@``5.,(`*#A!T"@`?[__^L```#J$D#@XP0`H.'^C[WH`````/A/+>D, -MP)#E:*"0Y0-@H.$!<*#A`H"@X2``G.5\P9_E`%"3Y6``D.7_!,#C#P;`XP`! -MC.`40)#E"@!4X50``!H``%3C4@``"C`"E.4``%#C3P``"CP"E.4``%#C`(#@ -M$TP``!H@`I3E#,"0Y0``7.,#```*!`"@X3S_+^$`@*#A1```ZC0RE.4``%/C -MV#"4!0,`5>$`@*`C/@``*@@`4^$#@*`QT!"@XP4@B.`#`%+A`X!E@`$*6.,( -M`*`Q`0J@(_[__^L`L%#B"X#@`S$```H@,I3E,)*4Y4`PD^4%D(G@``!3XP$` -M``H$`*#A,_\OX0TPH.$`4*#C?ZW#XS^@RN,:``#J`0I8XPA`H#$!2J`C!""@ -MX?[__^L(,)KE!""7X`,@TC``,*`S``!3XP0`H.$#```:!P"@X0L0H.$$(*#A -M_O__ZP``4.,(@&3@!)")X`1PA^`-@.`3"```&M`@QN$$4(7@!""2X,0_H^#P -M(,;A``!8XPD0H.$+`*#AX/__&@``6.,+`*#A!8"@`?[__^L```#J$H#@XP@` -MH.'XC[WH``````$`H.$`$)_E_O__Z@`````00"WI`""1Y20PG^4",8/@%""3 -MY0``4N,#```*Q#""XA`0G^4$()+E_O__ZP``H.,0@+WH`````%T```#X3RWI -M`:"@X0"`H.'^___K`&!0X@H```K$,)_EG#"3Y0``4^,&```*"`"@X;00G^4$ -M(*#C_O__ZP``4.(!`*`3````Z@``H.,!<'#B`'"@,P``5N,`<*`#``!7XQT` -M``H`0*#C@)"?Y01PH.$!L(;B!%"9YP@`H.$&(*#A!$"$X@`05>((```*`##5 -MY0``4^,%```*_O__ZP``4.,"```:!C#5YSH`4^,+<(4`@`!4X^[__QH``%?C -M!P"@`04```H'`*#A)!"?Y0,@H./^___K`0!PX@``H#,``%KC`'"*%?B/O>@` -M````Q@```*````#+````(.`*#C"$`AY0T0H.'^___K`&"@ -MX0P`A.+^___K``!6XQX``!JD`93E``!0XP,```J\,93E`0`3XP````K^___K -MA0^$X@!@H./^___K5#"?Y00`H.$%$8/@("&3Y11@@>4!($+B("&#Y?[__^LX -M,)_E'1:%XP``D^7^___K"!"-X@8`H.,(0"'E#1"@X?[__^L$`*#A&/S_ZP8` -MH.$```#J%0#@XWR`O>@``````````'!`+>DD0)_E`%"@X00`H.'^___K!0"@ -MX;[__^L`4*#A!`"@X?[__^L%`*#A<("]Z`````#P3RWI`$"@XX"1G^4\T$WB -M`+"@X03`H.$L$(WE,""-Y00PF><``%/C3P``"@@@D^4"!Q+C3```"DA2D^4` -M`%7C``!;$P"@H!,!H*`#!!"@$2B@C14I```:+0``Z@@@E.4'8(7@##"@X20! -MG^4T((WE!$"6Z02@E.4`X(WE-."=Y03`C>4,P(WE%,"-Y200C>4@P(WE"*"- -MY1#@C>7^___K!#"6Y00@E.4D$)WE`@!3X2#`G>4B```*+P``F@@`E.4`((+@ -M`@!3X1T``#HJ``#J`'"@XPI`B^`'@*#A'*"-Y0`PE>4#`%CAV___.AR@G>4H -M()WE"*"*X@$@@N(H((WE`#";Y2@@G>4#`%+A[___.@%`H.$P,)WE``!3XQ(` -M``H``%7C$```"@`PE>4``%/C#0``"@0PE>4*"%/C"@``&@```.H!0*#A!""9 -MYRP0G>7$((+B/`"?Y2#`C>7^___K!`"9YU[__^L@P)WE!$"$XH``5..I__\: -M`@``Z@&`B.((<(?BU?__ZCS0C>+PC[WH%````,\````"`0``\$$MZ2Q`G^4` -M4*#A`7"@X0)@H.$$`*#A_O__ZP4`H.$'$*#A!B"@X8W__^L$`*#A\$&]Z/[_ -M_^H`````\$`MZ0!`H.%,T$WBZ`&?Y?[__^L(,)3EQ!"$X@%6$^(#```*U`&? -MY25`X./^___K;```ZD@"E.4%(*#A>?__Z[PQG^4@(9/E(`!2XP5`X`-D```* -M%!"#X@$@@N(@(8/E!3&1YP``4^,"```*`5"%XB``5>/Y__\:B'&?Y01@H.$! -M,*#C@!&?Y0PPAN0$((?B!@"@X010A.7^___K&`"$XF@1G^4$((?B_O__ZV#! -MG^4``)?E'2:%XR02E.4`,*#C`,"-Y010C>7^___K`0IPXP`@H.$H`H3E!0`` -MFC0!G^4%$*#A_O__ZP`PH.,H,H3E`0``Z@0`H.'^___KI#&4Y0``4^,.```: -M##&?Y=`0H.-P`)/E_O__ZP``4..D`83E!P``"@$PH.,"*J#CO#&$Y:@AA.4@ -M(*#CL#&$Y;@AA.6T,83EP#&4Y0`@H..L(83E`@!3X0`PX`/`,80%Q#&4Y0`` -M4^,`,.`#Q#&$!1@RE.4``%/C`@``"A0RE.4``%/C`@``&H4_A.(8,H3E%#*$ -MY0APC>(D$(3B!P"@X?[__^N%'X3B!P"@X?[__^M0,)_E!`"@X4!`C>4%48/@ -M%$"%Y?[__^L``%#C$D#@`P4```I`$(WB!0"@X_[__^L&`*#A_O__ZP!`H.,, -M`)_E_O__ZP0`H.%,T(WB\("]Z`````!%`0````````````"%`0``E`$````` -M``"F`0```````/!/+>E48)'E5=]-X@&0H.$!#!;C`$"@X0B@D.46```*$6Z- -MXMA0C>(&`*#A_O__ZP4`H.$D$(3B_O__ZP8`H.$%$*#A_O__ZP``4..*```: -M!`"`XE(?C>)(08WE3&&-Y?[__^L`4%#B@P``&@8`H.&%'X3B_O__ZX```.J` -M`!;C!```&B0`@.*@(*#C_O__ZP!04.)Y```*(#*4Y110D^4``%7C!```&@D` -MH.$D$(3BH""@X_[__^MP``#J"0"@X000H.$U_R_A`+!0XF@``!I4,)GE#P`3 -MXV4``!H@,I3E4#"3Y0``4^,@```*V'"-XA`0H.,'`*#A$5Z-XO[__^L%`*#A -M$!"@X_[__^M2'XWB#0"@XU8SX.=,<8WEY#"-Y4A!C>7^___K(#*4Y0D@H.$% -M$*#A!`"@X0_@H.%0\)/EV#"=Y1`AG>4",-/A2@``&MPPG>44(9WE`C#3X48` -M`!K@,)WE&"&=Y0,`4N%"```Z)'"$XJ`@H.,'$*#A#0"@X?[__^L'`*#A"1"@ -MX:`@H./^___K(#*4Y0V`H.$8,)/E``!3XPL```H$`*#A,_\OX0!04.('```* -M#1"@X0<`H.&@(*#C_O__ZP40H.&X`)_E_O__ZRD``.HD<(3B!`"@X0<0H.&@ -M4(WB_O__ZP00H.%_#X3B_O__ZP<0H.$%`*#A_O__ZQ@RE.4``%/C"0``"A0R -ME.4``%/C!@``"H4?A.(!`%/A`P``"@4`H.'^___K`%!0XA$``!H!"!KC#``` -M"@@PE.5``!;C"P"@$P$`H`-2'XWB`3C#XP@PA.4`4*#CH#"-XDA!C>5,,8WE -M_O__ZP(``.H+4*#A````ZA50X.,%`*#A5=^-XO"/O>CB`0``!38$XP,`4>'P -M02WI`5"@X4K?3>("8*#A`$"@X7T```H-``"*!#!#X@,`4>$U```*`@``BD8, -M4>-4`0`:&```Z@(V!.,#`%'A6P``"@(P@^(#`%'A30$`&H(``.H0-@3C`P!1 -MX00!``H&``"*"C!#X@,`4>&@```*"3"#X@,`4>%"`0`:RP``ZA$V!.,#`%'A -M+@$`"F`UG^4#`%'A.P$`&D\!`.K^___K``!0XT@!``H$4(WB)!"$XJ`@H.,% -M`*#A_O__ZP4`H.'^___K#`"$XO[__^L-(*#A?SW"XS\PP^,(,)/EH""6X@,@ -MTC``,*`S``!3XP8`H`$%$*`!H""@`S4!`!K8``#J#3"@X01PC>)_C,5`0`:"#"8Y:`@ -MEN(#(-(P`#"@,P``4^,&`*`!!Q"@`0@!`!IY``#J_O__ZP``4.,"`0`*I%"- -MXL00A.)$(*#C!0"@X?[__^L,`(3B_O__ZPT@H.%_/<+C/S##XP@PD^5$();B -M`R#2,``PH#,``%/C!@"@`040H`%$(*`#\0``&I0``.H-(*#AZ%"-XG\]PN,_ -M,,/C"#"3Y1@@EN(#(-(P`#"@,P``4^,:```:!A"@X04`H.$8(*#C_O__ZP`` -M4./@```:!0"@X000H.'^___K(@``Z@T@H.'H4(WB?SW"XS\PP^,(,)/E&""6 -MX@,@TC``,*`S``!3XP8``!H&$*#A!0"@X1@@H./^___K``!0X\P``!H"``#J -M!0"@X1@0H..#``#J!`"@X?[__^L``%#CP@``"G_OA.(!S(WB#P"^Z`\`K.@# -M`)[H`P",Z`P`A.+^___K!1"@X0$,C>+^___K`%"@X;P``.H-,*#A!'"-XG^- -MP^,_@,CC"#"8Y:`@EN(#(-(P`#"@,P``4^,&```:!P"@X080H.&@(*#C_O__ -MZP``4..G```:`@``Z@<`H.&@$*#C7@``Z@0`H.'^___K``!0XYT```K^___K -M!Q"@X00`H.'^___K`%"@X?[__^L,`(3B_O__ZP``5>.:```:"#"8Y:`@EN(# -M(-(P`#"@,P``4^./```:!@"@X000C>*@(*#C_O__ZP``4...```*B```Z@T@ -MH.$27HWB?SW"XS\PP^,(,)/E"""6X@,@TC``,*`S``!3XS<``!H%`*#A!A"@ -MX0@@H./^___K``!0XW@``!H@,9WE`3!#XCX`4^-V``"*!`"@X0`PX.,<48WE -M)#&-Y?[__^L``%#C:P``"DH?C>('`*#C$$`AY?[__^L,`(3B_O__ZPT@H.%_ -M/<+C/S##XP@PD^4(();B`R#2,``PH#,``%/C7@``&@8`H.$2'HWB"""@X_[_ -M_^L``%#C7```"E<``.H-(*#A$EZ-XG\]PN,_,,/C"#"3Y0@@EN(#(-(P`#"@ -M,P``4^,&```:!0"@X080H.$((*#C_O__ZP``4.-'```:`P``Z@4`H.$($*#C -M_O__ZT(``.H@,9WE`3!#XCX`4^-```"*)"&=Y1\`4N,]``"*##&?Y0(Q@^`4 -M,)/E``!3XP(``!H!`*#C^!"?Y?[__^LD(9WEZ#"?Y0(Q@^`4,)/E``!3XR\` -M``H$`*#A$CZ-XAPQC>7^___K``!0XR4```I*'XWB"`"@XQ!`(>7^___K'``` -MZO[__^L``%#C'0``"O[__^L(,)3E!A"@X00`H.$!.(/C"#"$Y?[__^L(,)3E -M`3C#XP@PA.4`4*#A_O__ZPT``.H$`*#A_O__ZP``4.,,```*(#*4Y40PD^4` -M`%/C&%#@`P0```H%$*#A!B"@X00`H.$S_R_A`%"@X0P`A.+^___K!@``ZA)0 -MX.,$``#J#5#@XP(``.H54.#C````Z@!0H.,%`*#A2M^-XO"!O>@(1DC````` -M```````,,)#E:,"0Y3``G^4@,)/E8#"3Y?\TP^,/-L/C`S&`X!0`D^4,`%#A -M`@``&@``4.,````*;_[_ZA(`X.,>_R_A`````/!/+>D`0*#AY-!-X@!0H.$D -M$(3B#0"@X:`@H.,-@*#A_O__ZQ1BM>6@H(WB`'"6Y1P``.K^___K#1"@X00` -MH.$",*#C5#"-Y?[__^L-$*#A`+"@X0H`H.'^___K``!;XPD`H.$*$*#A`@`` -M&O[__^L``%#C"0``&@`PEN4&`*#A!""6Y0`P@N4$((/E=#"?Y0`PAN5P,)_E -M!#"&Y?[__^L'8*#A`'"7Y04`5N$(D(;B#0"@X0D0H.'=__\:%#*4Y08`4^$! -M4*`#"P``"@0`H.'^___K``!0XQ)0X`,&```*X!"-X@H`H.,(0"'E_O__ZP!0 -MH.$,`(3B_O__ZP4`H.'DT(WB\(^]Z``!$````B``\$4MZ7S03>)`,(WB`$"@ -MXVPPC>4!<*#A=$"-Y2`PC>)HT(WE`*"@X7`PC>5@@(WB$%"1Y1X``.H&8&3@ -M(""$XA``5N,08*"C8""-Y04PH.%D8(WE`""@XPL``.H#`%/E:,"=Y0`$@.&Q -M`(SA;,"=Y0(`4^4`!(#AL0",X7#`G>4!`%/E``2`X;$`C.$&`%+A@A"@X0-0 -MH.$!((+B`S"#XNW__[H(`*#A"A"@X?[__^L&0(3@#&"7Y08`5.'=__\Z?-"- -MXO"%O>AP0"WIY#"0Y0!`H.$!8*#A`0!3XP%0H),0``":5%"0Y6`PD.4#`%7A -M"0``&D@@D.4"`%7A!@``&E`@D.5<$)#E`0!2X0(``!I$$)#E`0!2X0(```I( -M()3E!5"#X`)0A>`L`9_E%!"@X_[__^L(()3E(#&?Y0,P`N```%/C0@``&N0P -ME.4$`%/C!@``&F!0E.5($)3E5""4Y0$`5>$!4*`A`@!5X0)0H"$$`%7C`""@ -MTP$@H,,%`%/C`""@$P``4N,$4*`3!0"@X?[__^O`,)_E``!0XQ``@^4K```* -M``!6XP(`5A,(()#E*#"4!20PE!4#`%+A!```FI0@G^4`,*#C`P"@X1`P@N5P -M@+WH`#"0Y0,`4^,((*`#=#"?!0,```H"`%/C:#"?Y00@H`,!(*`3`""#Y5@P -MG^4`()/E!`!5XP0`4L,,``#:Y""4Y0,`4N,!(*`##""#!0<```H$`%+C`2"@ -M`PP@@P4$((,%`@``"@(`4N,!(*`#"""#!1`PG^40,)/E"`"3Y7"`O>@``*#C -M<("]Z``````!``(`R#:?Y?!/+>D!8*#A$%"3Y5303>(`0*#A``!5XZ4!``H\ -M(I#E``!2XZ(!`!H(()#E`0`2XY\!`!H,()/E"#"@XS`PS>44,)7E``!2XS0P -MC>4!```*!1"@X4___^ML-I_E"""3Y0``4N,#```:!*"3Y0``6N,*D*`!6``` -M"E`VG^70$*#C3`"3Y?[__^L`D%#BB`$`"C0VG^5$`)3E4!"4Y0@PD^5<()3E -M``!3XR`PH`-!```*5*"4Y0G@H.%@L)3E`,"@XTB`E.4!$(K@!':?Y0(@B^`` -M`(C@"!!!X@@`6.,(@(>0"("'@@@`6^,+,(>0"#"'@@@`6N,*<(>0"'"'@@@` -M0.+@,-/E""!"XN!PU^4`L&'BX*#8Y0"`8.((,(WE`#!BX@R`C>4$<(WE$+"- -MY10PC>40,)7E&0``Z@``4.,`<-/E!+"=Y0'`C.(,@)VU!W`*X#=XH+$7<*"A -M`8#3Y0``4>,(@`O@$+"=M1B!H*$XBZ"Q!W"(X0``4N,(@)WE`K#3Y0,P@^(+ -ML`C@%("=M1NRH*$[N*"Q"W"'X8!PCN4$X([B#'"5Y0<`7.'B__\Z"```Z@/A -MB>60`P#@_O__ZP"`4.(&```: -M"0"@X?[__^L``%KC"`"@$3BBA!4D`0`:(@$`ZN0`E.4`P)?E``!0XS2`C>7_ -M$*`#%#"5Y0(```H!`%#C`@``B@`0H.,!(*#C$@``ZE0@E.5@$)3E`0!2X0H` -M`!I(X)3E#@!2X0<``!I0X)3E7'"4Y0<`7N$#```:1'"4Y0<`7N$`$*`#`P`` -M"DC@E.4"(('@`!"@XPX@@N`!X$+B`0!>XP?@H(,XN"1?N#OE@$`7.,"```*!`!4,`%+A`2""XO'__SH!`(#B"""5Y0(`4.$=```J`""@ -MX_7__^H`<-/E`""@XPPPC>4'<"'@"'"-Y0@PG>4'<&+B4W>@X0%P%^(.<*`1 -M`G#+YP$@@N((`%+C]O__&@PPG>4(`(#B`3"#X@0@E>4$<)WE`@!0X0"PA^#I -M__\Z`<",X@2PC>4(()7E`@!44@,(WE"""5Y20@C>5R```*"#"5Y=`0H.,$`)7ED`,`X/[__^L`<%#BL``` -M"@(`5N,:```:(""=Y20PG>4T$)WED@,#X`$@0^("((?@`@``Z@O`T>4<()WE`S!BX!PPC>5,``#J`0!6XR4``!HD,)WE(."=Y0$0 -M0^(T`)WE`1"'X`3@C>4-``#J`N#0YP$@@N(($)WE`.#!Y03@G>4#P(S@#!!C -MX`@0C>4.`%+A]?__.@P0G>4.`(#@`;"+X@$00>(#`%OA`<"@,0`@H#,,$(TU -M\/__.B`0G>4D()3E)#"=Y200C>4<$)WE`B!CX"`PC>4"(&'@&!"=Y1@@C>4< -M$(WE)```Z@,`5N,B```:(""=Y20PG>4!$$+B-`"=Y0#@8^($0(WIDW$AX`L` -M`.H"X-#G`2""X@/@S.<$X)WE#@!2X0C@G>4.P(S@]___.@0@G>4!L(OB`1"! -MX@(`@.`#`%OA`<"@,0`@H#/R__\Z)!"=Y2@@E.4@,)WE(!"-Y1@0G>4"(&/@ -M)#"-Y0(@8>`<$)WE'""-Y1@0C>4T<(WE1```ZB0@E.4"`%/A!G"@@3,``(H@ -M,I3E!`"@X1@0C>(&<*#A#^"@X33PD^4@,)WE&""=Y0,P@N`(,(/B"```ZB`R -ME.4$`*#A&!"-X@_@H.$T\)/E&#"=Y2`@G>4(,$/B`S!BX!@PC>4=``#J`0!6 -MXP\``!H<()WE)!"=Y2@PE.4"(('@`P!2X14``(H@,I3E!`"@X1@0C>(/X*#A -M-/"3Y20PG>4<()WE`S""X`@P@^(*``#J`P!6XPD``!H@,I3E!`"@X1@0C>(/ -MX*#A-/"3Y1PPG>4D()WE"#!#X@,P8N`<,(WE"0"@X?[__^L``%KC"`"@X3BB -MA!7^___K!P"@X?[__^L(`)7E````Z@``H.-4T(WB\(^]Z`(`5N/2__\:QO__ -MZ@````````````````$`H.,>_R_A'O\OX1[_+^$>_R_A%0#@XQ[_+^'X3RWI -M=&&1Y0!`H.$``%;C$```"F(_H..SH)'A``!:XPP```I\49'E``!5XPD```IP -M@9'E"`!6X08``#H",$/BLY"1X0D`6N$"```Z>'&1Y0<`5>$%```J/*"@XPQ1 -MG^4`<*#C"I"@X3!E!^-(@0?C9!"4Y0``4>,$```:\#"?Y0,@H.,5`.#C`"## -MY?B/O>C@`)_E_O__ZW2PE.4$0)3H;!"4Y0[@B^!XL)3E?,"4Y0(0@>`+$('@ -M<+"4Y80PE.5H()3E#$".X`M`A.#ZOZ#C`0`3XP(0@>"D0*`1`@`3XX1`H!&; -M``O@"P"@X?[__^OZ'Z#C?0^`XO[__^L$$*#A^D^@XY0`!.`$`*#A_O__ZPD` -M4.$`D*`C`9"@,PH`4.$!D(F#``!9XPX``!H(`%3A`("@(P&`H#,&`%3A"&"@ -MD0%@B(,``%;C!@``&@<`6^$``*`C`0"@,P4`6^$!`("#``!0X_B/O0@5`.#C -M^(^]Z$!X?0$D`0```,J:.P``H.,>_R_A##&?Y0`@H./P12WI',"#XK"@T^$, -M`(/BM(#3X100@^*X<-/A"J#@X;)@T^$(@.#AME#3X0=PX.&Z0-/A!F#@X050 -MX.&PH,/A!$#@X;2`P^&X<,/ALF##X;90P^&Z0,/ALE"0X;)`D>&R,)SA!5#@ -MX01`X.&R4(#ALD"!X0,PX.&R,(SA`B""X@@`4N/S__\:@""?Y0`PH.,0`(+B -M(!""XK-0DN&S0)#AL\"1X050X.$$0.#ALU""X;-`@.$,P.#AL\"!X0(P@^(0 -M`%/C\___&D0@G^4`,*#C(`""XD`0@N*S4)+ALT"0X;/`D>$%4.#A!$#@X;-0 -M@N&S0(#A#,#@X;/`@>$",(/B(`!3X_/__QKPA;WH+`$``%`!``"``0```@!0 -MXR0`G]4>_R_1!`!0XQP`G]4>_R_1&#"?Y0@`4.,4()_E`P"@P0(`H-$>_R_A -M\`````@!```@`0``.`$``/!'+>D`@)#E`#"1Y0!PH.$$0)#E`6"@X0@`4^$( -MH&.0`X!H@`0PD>4`H*"#`("@DP,P:N`$0&C@`P!4X0-`H*$``%3C%0#@T_"' -MO=@-,*#A"`"1Y7]=P^.*H*#A/U#%XX1`H.$*`(#@"!"7Y0@PE>4$()#@`R#2 -M,``PH#,``%/C,P``&HB`H.$$(*#A"!"!X/[__^L``%#C+0``&@P`EN4(,)7E -M"@"`X`P0E^4$()#@`R#2,``PH#,``%/C)```&@@0@>`$(*#A_O__ZP``4.,? -M```:$`"6Y0@PE>4*`(#@$!"7Y00@D.`#(-(P`#"@,P``4^,6```:"!"!X`0@ -MH.'^___K``!0XQ$``!H4$)?E``!1XQ````H4`);E``!0XPT```H(,)7E"@"` -MX`0@D.`#(-(P`#"@,P``4^,$```:"!"!X`0@H.'^___K``!0XP$```H-`.#C -M\(>]Z```H./PA[WH\$$MZ0!PD.4`,)'E`%"@X01@D.4!0*#A!P!3X0>`8Y`# -M<&>`!#"1Y0"`H(,`<*"3`S!HX`9@9^`#`%;A`V"@H0``5N,5`.#3\(&]V`@` -MD>6&8*#A"!"5Y8B`H.&'<*#A!B"@X0<0@>`(`(#@_O__ZPP`E.4,$)7E!B"@ -MX0@`@.`'$('@_O__ZQ``E.40$)7E!B"@X0@`@.`'$('@_O__ZQ00E>4``%'C -M"```"A0`E.4``%#C!0``"@@`@.`'$('@!B"@X?[__^L``*#C\(&]Z```H./P -M@;WH\$\MZ0PPD.44T$WB`*"0Y0BPD.4`0*#A##"-Y0``6N,0P)#E`6"@X0C` -MC>44@)#E*@``NB`RD>4<()/E``!2XP(``!H@()/E``!2XR,```H@4)/E``!5 -MX_^?#P,%<*`!%```"@0`H.$&$*#A-?\OX0``4.,:```:$P``Z@``6.,,,)WE -M","=Y;*0V!"U()/AM1";X;4PG.$"4(7B!&"-Y2#"EN4`D(WE#^"@X1SPG.4` -M`%#C!```&@0PE.4*`(?@`P!7X0%PA^+K__\Z!`"@X7\?AN+^___K``"@XP`` -M`.H5`.#C%-"-XO"/O>@00"WI`$"@X0@`D.7^___K#`"4Y?[__^L0`)3E_O__ -MZQ0`E.7^___K`#"@XP0PA.44,(3E$#"$Y0PPA.4(,(3E$("]Z/!!+>D#<*#A -M!#"0Y0!`H.$!4*#A`F"@X0$`4^$>```*_O__ZP``5>,R```*A8"@X0<0H.$( -M`*#A_O__ZP``4.,(`(3E)0``"@@`H.$'$*#A_O__ZP``4.,,`(3E'P``"@@` -MH.$'$*#A_O__ZP``4.,0`(3E&0``"@``5N,48(0%!0``"@@`H.$'$*#A_O__ -MZP``4.,4`(3E$```"@(`5>,`,*#C*`"$Z%``G]4&``#:!`!5XT@`G]4#``#: -M1#"?Y0@`5>-``)_E`P"@P000H.'^___K`%!0X@$``!H%``#J"U#@XP0`H.'^ -M___K'#"?Y04@H..T(,/E!0"@X?"!O>CP````"`$``"`!```X`0``+`$``/!` -M+>D$,)#E'-!-X@!0H.$!8*#A@T"PX70``$H#`%3A<@``.A@0H.,-`*#A_O__ -MZQ0@E>4-`*#A!!"5Y0`@4N(!(*`3T#"@X_[__^L`<%#B9P``&@T@H.$($)7E -M?SW"XP@`G>4_,,/C"#"3Y00@D>`#(-(P`#"@,P``4^,$```:!""@X?[__^L` -M`%#C4P``&@$``.H``%3C-P``&@T@H.$,$)7E?SW"XPP`G>4_,,/C"#"3Y00@ -MD>`#(-(P`#"@,P``4^,$```:!""@X?[__^L``%#C00``&@$``.H``%3C)0`` -M&@T@H.$0$)7E?SW"XQ``G>4_,,/C"#"3Y00@D>`#(-(P`#"@,P``4^,$```: -M!""@X?[__^L``%#C+P``&@$``.H``%3C$P``&A00E>4``%'C$P``"@T@H.$4 -M`)WE?SW"XS\PP^,(,)/E!""1X`,@TC``,*`S``!3XP0``!H$(*#A_O__ZP`` -M4.,;```:!```Z@``5.,"```*!!"@X?[__^L5``#J`#"5Y08`H.$`,(WE_O__ -MZP``4.,2<.`##P``"B`REN4<()/E``!2XP,``!H@,)/E``!3XQ5PX`,#```* -M#0"@X080H.'^___K`'"@X0P`AN+^___K````Z@UPX.,-`*#A_O__ZP```.H& -M<.#C!P"@X1S0C>+P@+WH(#"@X_[__^H``*#C'O\OX0``H.,>_R_A``"@XQ[_ -M+^$``*#C'O\OX0``H.,>_R_A2#"?Y0<@H.-P0"WI`%"@X0`@P^4L,I#E`0`3 -MXW"`O0@L0)_EP&"$X@00H.$H`I7E$$"$XO[__^L&`%3A^?__&BPRE>4!,,/C -M+#*%Y7"`O>CH`0``#````'-`+>D#0*#A`F"@X?[__^L($(WB`#"@XP,@H.$$ -M,"'E`%"@X08`H.'^___K`&"@X?[__^L%`*#A!A"@X?[__^O^___K!`"@X7R` -MO>@00"WI`D"@X?[__^L!&J#C$""?Y0`PH.$$`*#A/#*3Y1!`O>C^___J$`(` -M`!!`+>D"0*#A_O__ZP$:H.,0()_E`#"@X00`H.&L,)/E$$"]Z/[__^H0`@`` -M$$`MZ0)`H.'^___K`1J@XQ`@G^4`,*#A!`"@X?`PD^400+WH_O__ZA`"```0 -M0"WI`D"@X?[__^L!&J#C#""?Y<0P@.($`*#A$$"]Z/[__^H4`@``$T`MZ0)` -MH.'^___K`1J@XQ@@G^4`,*#A!`"@X3#`D^4`P(WE+#"3Y?[__^L<@+WH&`(` -M`!-`+>D"0*#A_O__ZP$:H.,8()_E`#"@X00`H.$XP)/E`,"-Y30PD^7^___K -M'("]Z!@"``!_0"WI-,"2Y3!@DN4!`(#@`0`("`!;C%""?Y63` -MH!,`4(WE$%"-Z?[__^L0T(WB<("]Z!\"``#P02WI`G"@X?[__^L`0*#C`&"@ -MX112MN4"``#JW/__ZP!0E>4`0(3@!@!5X000H.$(((7B!P"@X??__QH$`*#A -M\(&]Z!!`+>D"0*#A_O__ZQPRD.4``%/C`0``&@,`H.$0@+WH!`"@X0,@H.$` -M$*#C$$"]Z,;__^H00"WI`D"@X?[__^L!&J#C$""?Y0`PH.$$`*#A/#"3Y1!` -MO>C^___J$`(``'!`+>E4,)'E`$"@X0%0H.&`,(/C5#"!Y?[__^L(,)3E!1"@ -MX00`H.$!.(/C"#"$Y?[__^L(,)3E`3C#XP@PA.4`4*#A_O__ZP4`H.%P@+WH -M\$`MZ:303>(#8*#A`G"@X?[__^N@(*#C#5"@X0!`H.$D$(#B#0"@X?[__^L` -M$*#C`2"@X0<`H.'^___K#1"@X8@`C>4$`*#AV/__ZP``4.,&`*`!I-"-XO"` -MO>CP12WIK-!-X@-0H.$"H*#A_O__ZP1PC>(`0*#CH""@XZ2`C>*D0(WE)!"` -MX@!@H.$'`*#A_O__ZPH`H.$($*#A!""@X?[__^NDP)WE`<",X@R@:N`%`%KA -M`#"@X14`X",+```J"!"@X00@H.$,`*#A##"-Y:3`C>7^___K!Q"@X1``C>4& -M`*#AL?__ZP``4.,%`*`!K-"-XO"%O>CP0"WII-!-X@-@H.$"<*#A_O__ZZ`@ -MH.,-4*#A`$"@X200@.(-`*#A_O__ZP`0H.,!(*#A!P"@X?[__^L-$*#A&`"- -MY00`H.&:___K``!0XP8`H`&DT(WB\("]Z/!%+>FLT$WB`U"@X0*@H.'^___K -M!&"-X@!`H..@(*#CI("-XJ1`C>4D$(#B`'"@X08`H.'^___K"@"@X00@H.$( -M$*#A_O__ZZ3`G>4!P(SB#*!JX`4`6N$50.`C`#"@X0X``"H$(*#A#`"@X0@0 -MH.$4,(WEI,"-Y?[__^L8`(WE_O__ZP80H.$'`*#A_O__ZP!`H.'^___K``!4 -MXP5`H*$$`*#AK-"-XO"%O>CS02WI`U"@X0)@H.'^___K.!"@XP!`H.$%`*#A -M_O__ZS@PH..3``/@`("@X04`4^$5`.`3)@``&@#0C>6%7X3B!-"-Y?[__^L4 -M,I3E#7"@X04`4^$%```*`!"=Y1@BE.4`,(WE!-"#Y0`0@N4$(('E!@"@X0@0 -MH.$%(*#A#6"@X?[__^L$`*#A_O__ZP``4.,+```*!0"@X?[__^L`,)WE!@!3 -MX0@```H4$I3E!""=Y10RA.4$4(/E`!""Y00@@>4!``#J#0"@X?[__^O^___K -M``"@X_R!O>CP1RWI0M]-X@*0H.$#@*#A_O__ZZ`0H..DH(WB`'"@X0!`H.$$ -M`(WB_O__ZQ12M^48``#JX_[_ZPD0H.$(`%#A`""@(0@@H#$*`*#A_O__ZP`` -M4.,.```:!%"-XJ`@H.,D$(3B!0"@X?[__^L%`*#A!A"@X?[__^L$`*#A!1"@ -MX13__^L``%#C'&*$!0@`H`$'``#J`%"5Y0<`5>$(8(7B`!"@XP8@H.$*`*#A -MX/__&A4`X.-"WXWB\(>]Z/-!+>D#4*#A`G"@X?[__^L(8(WB`("@XP2`)N4` -M0*#A_O__ZP@@H.$&$*#A"#"4Y0<`H.$!.(/C"#"$Y?[__^L`$*#A!`"@X?[_ -M_^L(,)3E`3C#XP@PA.4`8*#A_O__ZP@`5N$&`*"Q!0"@H?R!O>AP0"WI`$"@ -MX0`0H.%\8)_E*`*0Y0!0H./^___K+#*4Y0$P@^,L,H3E!A"@X2@"E.7^___K -M$&"&X@``4.,#```:`5"%X@P`5>/V__\:#0``Z@%@1>(T,)_E!F*#X`$``.HH -M`I3E_O__ZP%01>(&$*#A`0!UXQ!@1N+X__\:+#*4Y0$PP^,L,H3E``"@XW"` -MO>@,``````!0XW!`+>F37Z`#)5Z@$P!`H.$!8*#A``"%X-`0"./^___K``!0 -MXW"`O0@``%3C)&*`Y050@!!$4H`5<("]Z!!`+>D`0*#A2`*0Y?[__^L$`*#A -M$$"]Z/[__^IP0"WI"&"2Y510D.4`P*#C`$"@X0!@@.4"4(7C#&"2Y01@@.4( -M8)+E"&"`Y0Q@DN44P(#E&#"`Y0Q@@.544(#E$,"`Y1`PDN5D,(#E%#"2Y6@P -M@.48,)+E;#"`Y1PPDN5P,(#E(#"2Y70P@.4D,)+E>#"`Y2@PDN5\,(#E+#"2 -MY8`P@.4P,)+EA#"`Y2`RD>44,)/E#`!3X0,`H`$````*,_\OX50@E.4",,+C -M5#"$Y7"`O>AP0"WI`#"@XP`P@.4!0*#A`""1Y0!0H.$(((#E!""1Y0P@@.5D -M()'E$""`Y7@@D>4D((#E?""1Y2@@@.5H()'E%""`Y6P@D>48((#E<""1Y1P@ -M@.5T()'E(""`Y8`@D>4L((#EA"#1Y2`0H.,$,(#E-!"`Y3`@@.5D$)3E`P!1 -MX7"`O0AH`)_E_O__ZP`@E.5L$)3E!,"4Y71@E.4"$('@>""4Y7S@E.4,8(;@ -M`A"!X'`@E.6$,)3E:,"4Y0Y`AN`"0(3@`0`3X_HOH.,,$('@I$"@$0(`$^.$ -M0*`1D@``X/[__^L$$*#A_O__ZP0`A>5P@+WH`,J:.P@@D>4`,*#C`""`Y0P@ -MD>4$((#E"""1Y0@@@.4,()'E%#"`Y1`P@.4,((#E$#"1Y60P@.44,)'E:#"` -MY1@PD>5L,(#E'#"1Y7`P@.4@,)'E=#"`Y20PD>5X,(#E*#"1Y7PP@.4L,)'E -M@#"`Y3`PT>6$,(#E'O\OX0@@D.4(,)'E`P!2X2D``!H,()#E##"1Y0,`4N$E -M```:$""0Y1`PD>4#`%+A(0``&B0@D.4D,)'E`P!2X1T``!HH()#E*#"1Y0,` -M4N$9```:%""0Y10PD>4#`%+A%0``&A@@D.48,)'E`P!2X1$``!H<()#E'#"1 -MY0,`4N$-```:(""0Y2`PD>4#`%+A"0``&BP@D.4L,)'E`P!2X04``!HP`)#E -M,#"1Y0,`4.$``*`3`0"@`Q[_+^$``*#C'O\OX?!!+>D`P.#C`""@XP`PD>4: -M``#J$$"3Y0!@D.4&`%3A%0``.A2`D^4$<)#E!$"(X`<`6.$$0&?@!$!FX`X` -M`#H$`%SA!,"@@04@H($*``"*`&!2X@%@H!,$`%SA`&"@$P``5N,&0*#A`P`` -M"@1`DN4,8)/E!`!6X04@H($`,)/E`0!3X0A0@^+A__\:`@"@X?"!O>@`,.#C -M`""1Y?!%+>D`P*#C`T"@X1X``.H4H)+E$&"2Y0QPD.4(@)#E"G!GX`9@:.`` -M`%?C`'!GL@``5N,`8&:R!F"'X`8`5.$'``":#'"2Y09`H.$$,)#E!<"@X0

CP0"WI`6"@X3S03>(`$*#A -M#0"@X0UPH.'^___K`$"6Y0,``.K^___K``!0XP8``!H`0)3E!@!4X0A0A.(- -M$*#A!0"@X?;__QH`4*#C!0"@X3S0C>+P@+WH\$4MZ00PD>6DT$WB`4"@X0`` -M4^,`4*#A,@``"@`PD>4``%/C+P``"@$`4^$M```*`""@XP)PH.$\8)/E``!2 -MXP@0@^(!(*#C`7"@`1!@%N(!8*`1`@``&@`PD^4$`%/A]/__&K8XU>$"`!/C -M'P``&HHPU>4``%/C%@``"HLPU>4``%/C$P``"J`0H.,-`*#A_O__ZXH`U>4@ -MK`'C_A"@XPV`H.&:``#@_O__ZXLPU>7^$*#C``"-Y9H#`.#^___K!!"@X00` -MC>4-`*#A_O__ZP``4.,&```:``!6XP<`H`$"```:`@``Z@``H.,```#J!@"@ -MX:30C>+PA;WH\$$MZ0`PD.4`4*#A/'"?Y3Q@G^4`0)/E"```Z@00D^4`()/E -M`""!Y000@N4`<(/E!&"#Y?[__^L$,*#A`$"4Y04`4^$#`*#A\___&O"!O>@` -M`1````(@`/!'+>D`0)'E`6"@X0"@H.%0@)_E4'"?Y0!0E.4,``#J_O__ZP`` -M4.,'```*!""4Y00`H.$`,)3E`#""Y00@@^4`@(3E!'"$Y?[__^L%0*#A`%"5 -MY08`5.$(`(3B"A"@X>[__QKPA[WH``$0```"(`#P02WI`6"@X0!`H.$`4)'E -M!```ZO[__^L``%#C`'"@$QH``!H`4)7E!@!5X0@`A>($$*#A]O__&E@PG^70 -M$*#C$`"3Y?[__^L`8%#B"W#@`PX```H/`+3H","&X@!PH.,/`*SH#P"TZ`\` -MK.@/`+3H#P"LZ`,`E.@#`(SH`#"5Y0`PAN4$8(/E`&"%Y010AN4'`*#A\(&] -MZ`````#P02WI`D"@X0%PH.$`8*#A`%"@XP`@A.4$((3E`@``ZO[__^L``%#C -M\(&]&`<`5>$&`*#A!!"@X0%0A>(X8(;B]O__NO"!O>CP3RWI;-!-X@"P4^+8 -MQ9_EE#"=Y0%`H.$4((WE#+"@`9`@G>68X)WE/""@`P``4^,+,*`!E#"-Y10P -MG>4``%[C"."@`Y`@C>4``%/CF."-Y1``C>4$```:D#6?Y0`PD^4``%/C%#"- -MY4,!``H4`)WE`*"@X_[__^N8()WE%."=Y0J`H.$8H(WE"G"@X1P@C>4*$*#A -M#*"-Y0J0H.$@H(WE)*"-Y0'`0.(`,*#A","-Y0!@CN!A``#J`2!6Y0A0G>5- -M`%+C0P``"@D``(HY`%+C!```BC``4N-2```J+0!2XV8``!HA``#J0`!2XV,` -M`!H*``#J:0!2XT4```H"``"*4@!2XUT``!HW``#J;0!2XSH```IX`%+C6``` -M&B0``.HD,)WE"9"#X0&0F>%1```:!@"@X0D0H.$*(*#C_O__ZP=PF.$!P*`3 -M"7"@$0P`C>4DP(T5$```&@>`H.$!X*#C"!"@X23@C>4(D*#A+@``Z@F0D>$_ -M```:!@"@X0D0H.$*(*#C_O__ZP=PF.$<`(WE`P``"@EPH.$!D*#C!Q"@X2$` -M`.H'@*#A`9"@XP@0H.$=``#J``!1XS```!H&`*#A"B"@XP-0H.'^___K`1"@ -MXR``C>44``#J``!1XP-0H`$!<*`#$```"@X``.H``%?C`U"@`0&`H`,+```* -M"0``Z@``5^,#4*`!`:"@`P8```H$``#J``!7XP$@H`,#4*`!&""-!0````H# -M4*#A"#"=Y0%@1N(!,$/B"#"-Y04PH.$(P)WE``!4`$*#C"B"@XP-0H.'^___K`>"@XRC@C>4`8*#A!```Z@!@H.,!``#J`&"@ -MXP-0H.$H8(WE``!7XQT```HP`(WB.!"@X_[__^L,,)WE&,"=Y3!PC>(``%/C -M(."=Y3PPH`,T,(WE8#"=Y0``7.,*$*#A"""@X0<`H.$!,(,3`3##`SA@C>4\ -MX(WE8#"-Y?[__^L``%#C!@``&@<@H.$0`)WE!!"@X1PPG>5V_?_K``!0X[0` -M``HD()WE``!2XQ<``!K,,I_E`P!;X1(```J&,0#CLS"4X0``4^,.```*8C^@ -MX[,PE.$``%/C"@``"G`QE.4``%/C!P``"G0QE.4``%/C!```"GPQE.4``%/C -M^C^@$PPPC14!```:/,"@XPS`C>4`X.#C`""@XPC@C>4+D*#A"W"@X1@@C>4. -M@*#A-```Z@"@E^4``%KC"0``"A0`G>4*$*#A!2"@X?[__^L``%#C`P``&@H` -MH.'^___K!0!0X0D```HH,)WE``!3XQP```H(,)?E!@!3X1D``!H,,)?E(,"= -MY0P`4^$5```:$`"=Y000H.$'(*#A'#"=Y37]_^L``%#C#@``&B3@G>4``%[C -M`P``"@0PE^4,()WE`@!3X6P```H$,)?E#,"=Y0C@G>4#,&S@``!3XP`P8[(. -M`%/A`0``.@@PG>4L@(WE+("=Y3APA^(8()WE"#"-Y0$@@N(8((WE&#"=Y9#` -MG>4,`%/A+#"-Y<7__SH!`'CC"@``"C@@H.,0`)WE!!"@X1PPG>62N"+@#_W_ -MZR3@G>4``%[C`@"@$TL```I+``#J(""=Y01PH.$`4*#C!J""X(K`H.$,0*#A -M&@``Z@3`C>4!_?_K!,"=Y0``4.,1```:"""9Y0PPF>4@X)WE`A!FX```4>,` -M$&&R`P!NX```4.,``&"R`@!6X0$0@.`!``"*`P!>X0```)H*$('@`0!4X0%` -MH($```"*","@X0%0A>(XD(GB#("@X9#`G>4)(*#A$`"=Y0<0H.$,`%7A'#"= -MY07`H.'<__\Z`0!XXP=`H.$$```*.""@XY*X(N#:_/_K!0"@XQD``.J4()WE -M!!"@X1``G>68,)WET_S_ZP``4.,#`(`"`%"@$P0``!H/``#JS?S_ZP``4.,$ -M`(`""P``"I#@G>4+(*#A$`"=Y000H.$.`%7AF#"=Y0%0A>(XL(OB\O__.@`` -MH.,```#J`0"@XVS0C>+PC[WH4`$```P```#P3RWI;-!-X@!`H.$!4*#A#`"- -MXEP0H.,"8*#A_O__ZP``5>,!4*#C8#"=%0(P@Q-@,(T5``!6XV`PG14!,(,3 -M8#"-%3`PE.4!`!/C8#"=%00P@Q-@,(T5"!"4Y00PE.4,()3E``!1XPP0C>44 -M,(WE$""-Y1@PC>544(WE`P``"@``4N,!```*``!3XP,``!K8!9_E_O__ZP$` -MH.-Q`0#J/`!3XS(`4Q,&```*1@!3XP0```I5`%/C`@``"K`%G^7^___K9%"- -MY6`PG>4$`!/C##"=Y05,,(WE_O__Z_H? -MH..5``#@_O__ZU``C>40<)WE`Q"@XPQ@G>4'4:#A!0"@X?[__^L``%;A!``` -M&@4`H.$#$*#C_O__ZP!04>(O```*!U*@X0D0H.,%`*#A_O__ZP``5N$%```: -M!0"@X0D0H./^___K``!1XP%0H`,C```*!0"@X0H0H./^___K``!6X04``!H% -M`*#A"A"@X_[__^L``%'C`E"@`Q@```H%,*#CDP<#X",!5N$"```:`P`3XP-0 -MH`,1```*#S"@XPD0H..3!P?@!P"@X?[__^L``%;A!0``&@<`H.$)$*#C_O__ -MZP``4>,$4*`#!```"@=0H.,T!)_E_O__ZP$PH.-D,(WE3("=Y0PPG>4@!)_E -M&!"=Y8B`@^!84(WE7("-Y?[__^M@,)WE4*"=Y0$`$^,`8*#A"```"E00G>6* -MH*#A$`"=Y0=H1N+^___K3FY&X@"@BN"*$*#A"0``ZE1PG>6&:D#B$`"=Y4=N -M1N('$*#A_O__ZXJ@@.`#H(KBIW"*X(<0H.$&`*#A_O__ZZ0SG^54D)WE!:#3 -MYPD0H.&I4*#A"7"*XC2@C>6`8*#A$`"=Y2!@C>7^___K8#"=Y5"0G>4!`!/C -MB9"@X0"PH.$$```*9`.?Y080H.'^___K`0"`X@,``.I4`Y_E!A"@X?[__^L$ -M`(#B"Y")X&`PG>4%D(G@``!7X0>0B2``D(DP`0`3XP60B>&@`*`3,)"-Y0X` -M`!I+"Z#C^A^@XY`&`.#^___K'SX$XW4(8.(#"H#B(`2@X0,`4.$@#@2381M@ -M@O`2GY4J'H&"F```X/[__^M@,)WE#W#`XPA0A^`D<(WE`0`3XRQ0C>4@`*`3 -M`@``&H4!H.%D$*#C_O__ZV`PG>4'@,#C.("-Y0$`$^/Z'Z`3!A"@`1@`G16< -M`I\%D`D`$)`%`.#^___K^A"@X_[__^N(,I_E!1"@X9,``^`#`*#A'#"-Y?[_ -M_^M,()WE4%"=Y:("(&/@0#"-Y0*`:.!(4(WE/("- -MY2@`C>40`)WE_O__ZSPRG^70$`CC"9!@X`E09>`%H&K@1*"-Y30`D^7^___K -M`%!0XED```H08)WE5!"=Y08`H.$,<)WE_O__Z_@1G^67``K@"@"@X?[__^OH -M$9_E`("@X0H`H.'^___K`0"@X?H?H./^___K%,"=Y0@`H*#A!0"@X?[__^MD,)WE``!3XP!@H.'_<&#B!@``"@``A>`'$*#A"#"@ -MX9PAG^4`H(WE_O__ZS```.H``%CC!@``"@<0H.$(,*#A``"%X'PAG^7^___K -M`&"&X`=P8.`*,*#A!@"%X`<0H.%D(9_E_O__ZU@PG>4``%/C!F"`X`=P8.`& -M`(4`!Q"@`4@AGP41```*`P!3XP8`A0`'$*`!."&?!0P```H!`%/C!`!3$P`` -MH!,!`*`#!@"%``<0H`$<(9\%!```"@(`4^,#```:$"&?Y08`A>`'$*#A_O__ -MZV`PG>4!`!/C!```"@9@@.`'$&#@\""?Y08`A>#^___KZ`"?Y040H.'^___K -M!0"@X?[__^L8,)WE^A^@XQP`G>4$,(3E_O__ZP`0H.%X`)_E_O__ZV`PG>4\ -M<)WE.&"=Y0$@$^)(4)WE1,"=Y300G>5`@)WE+#"4Y1APA.4#,,/C%("$Y2PP -MA.4!,(,3`C"#`R1@A.4<4(3E(,"$Y2@0A.4L,(05+#"$!1``A.4``*`3`@"@ -M`6S0C>+PC[WHAP(``*L"``#4`@``#@,```#*FCMP#@``X`0'`'!D"`"`.`$` -M0$(/`)#0`P``````-P,``%0#``"#`P``A@,``(T#``"/`P``D0,``),#``"5 -M`P``F`,``!-`+>D`0*#C?#"?Y000H.$$(*#A=`"?Y0!`C>7^___K;,"?Y000 -MH.$=`*#C`2R@XU@PG^4`P(WE_O__ZP0`4.$"```*3`"?Y1T0H./^___K1$"? -MY0``H.-`$)_E!""@X?[__^L!"G#C`!"@X0``A.4#``":*`"?Y?[__^L`,*#C -M`#"$Y0``H.,<@+WH$````&0```!X````9P````````"+````E````!!`+>D` -M0%#B&```"@`PU.4``%/C%0``"G@0G^4&(*#C_O__ZP``4.,2```::#"?Y0$@ -MH..<((/E#```ZEPPG^4`0(/E"0``Z@,!D><#(:#A`3"#X@``4.,\,)\%`C"# -M`*!`@P4!```*(`!3X_7__QH!`*#C$("]Z#H0H.,$`*#A_O__ZP``4.,`,*`3 -M$!"?%>S__QKH___JOP``````````````H``````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M`````````````````````````````````````(#`X/#X_/[_`````0,````` -M```"````+`$``#`!```T`0`````````````$````.`$``$`!``!(`0`````` -M```````0````@`$``*`!``#``0`````````````(````4`$``&`!``!P`0`` -M``````````!&````@`(``)`!```IFP``*````!@````G````"0```&`````" -M`````````````````````````#P```"``@``X`$``"F;```H````&````"`` -M```+````8`````(`````````````````````````.````"`#``!8`@``@6P` -M`(`````8````%@````$```!(`````@````````````````````````!7```` -M``0````#``#_5@``.````!@````A````"````*`````(``````````$````` -M`````````%4```"``@``D`$```)\``!@````(````"D````!````0`````,` -M```"````````````````````2````(`"``#@`0```GP``)`````H````'@`` -M``@````H`````P````````````````````````!+````@`(``.`!```"?``` -M>````!`````0`````0```$`````#`````````````````````````#P````@ -M`P``6`(``*AA``!8````*````!<````!````@`````0````#```````````` -M````````50```(`"``#@`0``@6P``%`````X````&0````$````X`````P`` -M``````````````````````!9````@`0``&`#```8/```8````!````!N```` -M`0```-@````*``````````$``````````````$@````@`P``6`(``"!.``!` -M````.````!<````E````>`````8````#````````````````````/``````$ -M`````P``&#P``*@````(````'0````,```"0````!@`````````````````` -M``````!D````@`(``.`!``!*50``8````"`````D````"````&`````&```` -M`````````````````````#P```"`!```8`,``',K``#0````0````!`````$ -M``````$```@`````````````````````````50```"`#``!8`@``3$```*`` -M``!`````)````!````!`````!0````````````````````````!&``````0` -M```#```5-```D````!@````=`````P```(@````&```````````````````` -M`````%<`````!0````0``-0P```X````$````(`````!````V`````P````` -M`````0``````````````9````"`#``!8`@``%3@``*````!`````'@````0` -M``!`````!@````````````````````````!,``````0````#``#T+0``T``` -M``@````D````$````'@````#`````````````````````````$8```"`!``` -M8`,``'4J``!J````.````!0````!````H`````H````````````````````` -M````/0`````%````!```@B,``,@````P````&@````$```"X`````P`````` -M```````````````````\````>`4``!H$```K)```B````"@````-`````0`` -M`'`````#`````````````````````````$L```!X!0``&@0``!8<``!X```` -M.````!<````*````<`````T````#````````````````````/````'@%```: -M!```*R0``(`````H````#`````````!P`````P````,````````````````` -M``!5``````0````#``!_)P``P````"`````B````#@```*`````&```````` -M`````````````````$X```"`!```8`,``((C``#D````6````"`````````` -M5`````P`````````````````````````1@`````%````!```X1X``.`````@ -M````'`````@```"@````"``````````````````````````\````0`8``+`$ -M```<&```,`$``$`````N`````0```,`````#`````P`````````````````` -M`%0```"`!```8`,``.\<``"X````.`$``"``````````@`````P````````` -M````````````````2@`````%````!```[QP````!```@````(@````,```"0 -M`````P````````````````````````!D``````0````#``#2(0``P````"`` -M```5`````P```,`````*`````````````````````````$P`````!0````0` -M`.\<``#X````(````"(````#````:`````,````````````````````````` -M1@```$`&``"P!```JQ0``#`!``!`````+@````$```#``````P`````````` -M``````````````!D````@`0``&`#``!@'```X````"`````1`````@```(`` -M```3`````````````````````````%4`````!0````0``,T8``#@````0``` -M`"P````!````H`````,````#````````````````````2P```$`&``"P!``` -M2A,``#`!``!`````+@````$```#``````P````,````````````````````\ -M````D`8``!H$``#`&@``&`$``&@````>`````P```+`````&`````P`````` -M`````````````%4```!`!@``L`0``,$1```0`0``$````"4````$````P``` -M``,````#````````````````````9``````%````!```?A4````!```@```` -M&@````<```"`````#P````````````````````````!`````"`<``*`%``#[ -M$```,`$``&`````N`````0```,`````#`````P```````````````````$8` -M```(!P``H`4``*`/```P`0``8````"X````!````P`````,````#```````` -M````````````3@`````"``"``0``P\$``#`````0````$`````$```!````` -M`P````````````````````````!5``````(``(`!``".L0``,````!`````0 -M`````0```$`````#`````````````````````````$8```!``0``R````%`V -M`0`0````$````!0````$````,`````$``````````@``````````````/``` -M`$`!``#P````4#8!`!`````0````$`````4````P`````0`````````"```` -M``````````!(````0`$``/`````$^```$````!`````0````!````#`````" -M``````````(``````````````#@```"0`0``+`$```/9``!`````$`````H` -M```!````(`````$``````````@``````````````/````)`!```L`0``4,,` -M`#`````0````"P````$```!``````@`````````"``````````````!(```` -MD`$``"P!``!`G```(````!@````+````$P```$`````#``````````(````` -M`````````#@```#@`0``+`$``&"T``!0````$`````H````!````*`````$` -M`````````@``````````````/````.`!```L`0``@J,``#@````0````"P`` -M``$```!0`````@`````````"```````````````_````X`$``"P!``!`G``` -M.````!`````+`````0```%`````"``````````(``````````````$@```#@ -M`0``+`$``&J"```H````&`````L````3````4`````,``````````@`````` -M````````/````(`'``"P!```.10``(````!0`0```0```"8```#0`````P`` -M``,````````````````````\````@`0````#``#?-@``G@```!H````=```` -M`P```(@````&`````P```````````````````#P```!6!0````,``.XU``!X -M````"@````X````#````(`````4`````````````````````````/``````% -M```@`P``$"\``,@```!`````&`````$```"(`````P`````````````````` -M```````R````T`(``$`"``!:(0$`0````!`````G````!0```$`````%```` -M``````$``````````````#(````@`P``"`(``,?E``"0````0````$@````< -M````4`````4``````````0``````````````/````&`#``#@`0``@6P```$` -M```!`````0````$```````````````````````````````0%!@<'"`D*```` -M`*@#L8"H````L+"H@`````#8`````````!,!````````8P`````````S```` -M`````%8`````````KP```'9I9&5O/0```````'$```!F8B5D`"TM+2TM+2TM -M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+5)+,CDP-B!N;W0@0!O9F9B`&]F9@`\-SYC:&5C:VEN9R!G96YEF4`;F%M90!S=')I9&4`"5D0"5D.B!#5E0@3F%M92`M(`!.;W0@82!#5E0@``````````8! -M````````\`````````#/````````````````````F@```&9B7V=E=%]O<'1I -M;VYS`&9B7W-E=%]S=7-P96YD`&9B7V=E=%]B=69F97)?;V9F`(```````#E`@```````)<"````````*P(```````"H`@```````-`"```` -M````O`(```````!F`@``![$!@;"P7X0``````````+"PJ(`X````L+"P@)0` -M``"PL*F`T````+"O!("<`0``L+"L@#@"``"PL+"`2`(``+"PJ8"(`@``L+"N -M@*@#``"PL*B`Z`,``+"PJH`\!```L+"H@)@$``"PL+"`I`0``+"PJH#8!``` -ML+"L@!`&````````H`<``*D'L8#\!P``L*D$@&0(``"PL*B`$`H``*\'L8#H -M"P``KPBQ@(P-``"PL+"`G`T``+"PJ(#8#0``KPBQ@,P.``"J`[&`M`\``+"P -MJH#H#P``L*\.@(01``"PL*R`P!$``+"K$H#@$P``KS\4@'`6``"L/PF`>!P` -M`+"PL("\'```L*\X@,P=``!?A!Z`E!X``+"PJH`P(```L*\4@`PG``"PL+"` -M%"<``+"PL(`8)P``L+"P@!PG``"PL+"`("<``+"PL(`H)P``KPBQ@*0H``"P -ML+"`K"@``+!?A(#,*0``L+"P@`PJ``"PL*Z`<"L``+"PK(!(+```L*\$@#0M -M``"PL*B`>"T``+"PK(",+@``L*L&@(PP``"PL+"`E#```+"PL("<,```L+"P -M@*0P``"PL+"`K#```+"PL("T,```L+"P@+PP``"PL*J`%#$``*H#L8!@,0`` -ML+"H@(PQ``"PL*B`N#$``+"PJ(#D,0``L+"H@`PR``"H`[&`0#(``*@#L8!T -M,@``J@^Q@.`R``"PL*R`)#,``+"PJ(!8,P``L+"H@(0S``"PL*J`U#,``+"K -M*(`P-```7X0J@,PT``"PJRB`*#4``%^$*H#4-0``K`.Q@*PV``"N/P&`:#<` -M`*P#L8#8-P``L+"J@&PX``"PL*J`K#@``+"PJ(#(.```L+"J@'PY``"PL*J` -M=#H``+"PL(#L.@``L+"P@*P[``"PL*R`0#P``+!?A(#H/```L*L.@$`]``!? -MA"B`/#X``+"PK("4/@``L+"N@`0_``"PL*R`H#\``+"PK(#H/P``L*\:@-Q% -M``"PKQJ``0````0````$````+@(``*0!`````````````#T"``"D`0`````` -M``````!#`@``I`$`````````````2P(``*0!`````````````%("``"D`0`` -M``````````!7`@``I`$`````````````70(``*0!`````````````&$"``"D -M`0````````````!N`@``)`$`````````````6UT86(`+G-T6UT86(K0`N6UT86(K6UT86(K9F)?8VQA6UT86(K9F)?9V5T7V]P=&EO;G,`+G)E;%]?7VMS>6UT86(K -M6UT86(K9F)?8FQA;FL`+G)E;%]?7VMS>6UT86(K9F)?6UT86(K9F)?9FER;7=A6UT86(K9F)?9V5T7VUO9&4`+G)E;%]?7VMS>6UT86(K9F)?961I -M9%]T;U]M;VYS<&5C6UT -M86(K9F)?9&5A;&QO8U]C;6%P`"YR96Q?7U]K6UT86(K9F)?86QL;V-?8VUA<``N -M6UT86)?9W!L -M*V9B7VUO9&5?;W!T:6]N`"YR96Q?7U]K6UT86)?9W!L*V9B7V1E6UT86(K9F)?;6]D95]I6UT86(K9F)?=F%R7W1O7W9I9&5O;6]D90`N -M0`N!```"0``````````````()4``!````!V````40````0` -M```(````!@4```$````"`````````'AD```(```````````````$```````` -M``(%```)```````````````PE0``$````'8```!3````!`````@````F!0`` -M`0````(`````````@&0```@```````````````0`````````(@4```D````` -M`````````$"5```0````=@```%4````$````"````$@%```!`````@`````` -M``"(9```"```````````````!`````````!$!0``"0``````````````4)4` -M`!````!V````5P````0````(````904```$````"`````````)!D```(```` -M```````````$`````````&$%```)``````````````!@E0``$````'8```!9 -M````!`````@```",!0```0````(`````````F&0```@```````````````0` -M````````B`4```D``````````````'"5```0````=@```%L````$````"``` -M`*P%```!`````@````````"@9```"```````````````!`````````"H!0`` -M"0``````````````@)4``!````!V````70````0````(````R`4```$````" -M`````````*AD```(```````````````$`````````,0%```)```````````` -M``"0E0``$````'8```!?````!`````@```#K!0```0````(`````````L&0` -M``@```````````````0`````````YP4```D``````````````*"5```0```` -M=@```&$````$````"`````\&```!`````@````````"X9```"``````````` -M````!``````````+!@``"0``````````````L)4``!````!V````8P````0` -M```(````,@8```$````"`````````,!D```(```````````````$```````` -M`"X&```)``````````````#`E0``$````'8```!E````!`````@```!/!@`` -M`0````(`````````R&0```P```````````````0`````````7@8```$``'"" -M`````````-1D``#H`@```0`````````$`````````%H&```)```````````` -M``#0E0``*`,``'8```!H````!`````@```!M!@```0````,`````````O&<` -M`,P```````````````0`````````:08```D``````````````/B8```@`0`` -M=@```&H````$````"````'<&```!`````P````````"(:```!``````````` -M````!`````````!S!@``"0``````````````&)H```@```!V````;`````0` -M```(````AP8```$````#`````````(QH``#P`0`````````````$```````` -M`)X&```!`````P````````!\:@``#```````````````!`````````":!@`` -M"0``````````````()H``!````!V````;P````0````(````J@8```@````# -M`````````(AJ```0```````````````$`````````*\&```!```````````` -M``"(:@``;````````````````0````````"X!@```P``<```````````]&H` -M`"L```````````````$`````````R`8```$``````````````!]K```````` -M```````````!`````````!$````#```````````````?:P``V`8````````` -M`````0`````````!`````@``````````````,)H````B``!W````MP$```0` -M```0````"0````,``````````````#"\``#<$P`````````````!```````` -M`$0"```".@``P`(``!P+`@#D`@``'`L"`!@#```<"P(`M`,``!SI`0#D`P`` -M`C@``/@#``````"X```(#``!\+@```@,``(`N```"`P``A"X```(#``"(+@`` -M`CH``+@N```<]@$`U"X``!S7`0`0+P``'!P"`%@O```<'`(`H"\``!P<`@#P -M+P``'!P"``PP```<]@$`(#```!S+`0!8,```',P!`&0P```<`P(`=#```!SA -M`0"0,```'=`@!H.````C@``(PX```<'0(`N#@``!S/`0#$.``` -M'<\!``0Z```<^`$`7#H``!SX`0!D.@``'/@!```]```````"H!``"`````*@$``(@````J`0`` -MD````"H!``"8````*@$``*`````J`0``J````"H!``"P````*@$``+@````J -M`0``P````"H!``#(````*@$``-`````J`0``V````"H!``#@````*@$``.@` -M```J`0``\````"H!``#X````*@$````!```J`0``"`$``"H!```0`0``*@$` -M`!@!```J`0``&`$```#(`0`@`0``*@$``"@!```J`0``,`$``"H!```X`0`` -M*@$``$`!```J`0``2`$``"H!``!0`0``*@$``%`!````R`$`6`$``"H!``!@ -M`0``*@$``&@!```J`0``<`$``"H!``!X`0``*@$``(`!```J`0``B`$``"H! -M``"0`0``*@$``)@!```J`0``F`$```#(`0"@`0``*@$``*@!```J`0``L`$` -M`"H!``"X`0``*@$``,`!```J`0``R`$``"H!``#0`0``*@$``-@!```J`0`` -MX`$``"H!``#H`0``*@$``/`!```J`0``^`$``"H!`````@``*@$```@"```J -M`0``$`(``"H!```8`@``*@$``"`"```J`0``*`(``"H!```P`@``*@$``#@" -M```J`0``0`(``"H!``!(`@``*@$``%`"```J`0``6`(``"H!``!@`@``*@$` -M`&@"```J`0``<`(``"H!``!X`@``*@$``'@"````R`$`@`(``"H!``"(`@`` -M*@$``)`"```J`0``F`(``"H!``"@`@``*@$``*@"```J`0``L`(``"H!``"X -M`@``*@$``,`"```J`0``R`(``"H!``#0`@``*@$``-@"```J`0``X`(``"H! -M``#@`@```,@!``0````".```"`````(X```,`````@X``!0````"5`$`&``` -M``)=`0`<`````@X``"0````"+P$`*`````)E`0`L`````@X``#0````",P$` -M.`````(M`0`\`````@X``$0````"-0$`2`````(Q`0!,`````@X``%0````" -M4@$`6`````)C`0!<`````@X``&0````"4`$`:`````)A`0!L`````@X``'0` -M```"2@$`>`````)?`0!\`````@X``(0````"1P$`B`````);`0",`````@X` -M`)0````"1`$`G`````(.``"D`````D$!`*P````"#@``M`````(^`0"X```` -M`ED!`+P````"#@``Q`````([`0#(`````CD!```````";@````````(,```$ -M`````G$````````````````````````````````````````#``$````````` -M`````````P`#``````````````````,`!0`````````````````#``<````` -M`````````````P`(``````````````````,`"@`````````````````#``P` -M`````````````````P`.``````````````````,`$``````````````````# -M`!(``````````````````P`4``````````````````,`%@`````````````` -M```#`!<``````````````````P`9``````````````````,`&@`````````` -M```````#`!P``````````````````P`>``````````````````,`(``````` -M```````````#`"(``````````````````P`D``````````````````,`)@`` -M```````````````#`"@``````````````````P`J``````````````````,` -M*P`````````````````#`"T``````````````````P`O```````````````` -M``,`,0`````````````````#`#,``````````````````P`U```````````` -M``````,`-P`````````````````#`#D``````````````````P`[```````` -M``````````,`/0`````````````````#`#\``````````````````P!!```` -M``````````````,`0P`````````````````#`$4``````````````````P!' -M``````````````````,`20`````````````````#`$L````````````````` -M`P!-``````````````````,`3P`````````````````#`%$````````````` -M`````P!3``````````````````,`50`````````````````#`%<````````` -M`````````P!9``````````````````,`6P`````````````````#`%T````` -M`````````````P!?``````````````````,`80`````````````````#`&,` -M`````````````````P!E``````````````````,`9P`````````````````# -M`&@``````````````````P!J``````````````````,`;``````````````` -M```#`&X``````````````````P!O``````````````````,`<0`````````` -M```````#`'(``````````````````P!S``````````````````,`=``!```` -M```````````$`/'_"0`````````X`````@`!`!4``````````````````0`5 -M````.`````````````$`%0```)0````````````!`!4```#0```````````` -M`0`5````G`$```````````$`%0```#@"```````````!`!@```!$`@`````` -M`````0`;````2`(``$`````"``$`%0```$@"```````````!`!4```"(`@`` -M`````````0`G````J`,``$`````"``$`%0```*@#```````````!`!@```#D -M`P```````````0`T````Z`,``%0````"``$`%0```.@#```````````!`#\` -M```\!```7`````(``0`5````/`0```````````$`&````)`$```````````! -M`$L```"8!```#`````(``0`5````F`0```````````$`&````*`$```````` -M```!`!4```"D!````````````0!7````V`0``#@!```"``$`%0```-@$```` -M```````!`!@````,!@```````````0!?````$`8``)`!```"``$`%0```!`& -M```````````!`!@```"8!P```````````0`5````H`<```````````$`%0`` -M`/P'```````````!`!4```!D"````````````0`8``````H```````````$` -M9P```!`*``#8`0```@`!`!4````0"@```````````0`8````Y`L````````` -M``$`<````.@+``"D`0```@`!`!4```#H"P```````````0`8````B`T````` -M``````$`>````(P-```0`````@`!`!4```",#0```````````0`8````F`T` -M``````````$`A0```)P-```\`````@`!`!4```"<#0```````````0`8```` -MT`T```````````$`D0````````"H`````@`#`!4``````````````````P`8 -M````C`````````````,`G````*@```"H`````@`#`!4```"H```````````` -M`P`8````0`$```````````,`%0```-@-```````````!`!@```"\#@`````` -M`````0"H````S`X``.@````"``$`%0```,P.```````````!`!@```"L#P`` -M`````````0`5````M`\```````````$`&````.0/```````````!`,(```#H -M#P``G`$```(``0`5````Z`\```````````$`&````'@1```````````!`!4` -M``"$$0```````````0`8````O!$```````````$`%0```,`1```````````! -M`!@```"\$P```````````0`5````X!,```````````$`&````&P6```````` -M```!`.4```!P%@``"`8```(``0`5````!P```````````$`&````+@< -M```````````!`!4```"\'````````````0`8````Q!T```````````$`^@`` -M`,P=``#(`````@`!`!4```#,'0```````````0`5````E!X```````````$` -M&````"@@```````````!`!4````P(````````````0`8`````"<````````` -M``$`"@$````````0`````0`%`!@`````````````````!0`:`0``$````&@` -M```!``4`)P$``'@```!H`````0`%`"\!``#@````"0````$`!0`Z`0``[``` -M``(````!``4`10$````````,`````0!J`!@`````````````````:@!7`0`` -M``````@````!``H`&``````````````````*`'D!``#8````&`````$`*@"; -M`0````````@````!``P`&``````````````````,`+@!```3`0``$P````$` -M*@#5`0````````@````!``X`&``````````````````.`.T!``!C````#@`` -M``$`*@`%`@````````@````!`!``&``````````````````0`!X"```S```` -M#P````$`*@`W`@````````@````!`!(`&``````````````````2`$X"``!6 -M````#0````$`*@!E`@`````````````!`'$`<0(```0``````````0!Q`'T" -M```$``````````$`<0")`@````````@````!`!0`&``````````````````4 -M`+,"``"O````(`````$`*@#=`@````````<````!`!8`]0(````````(```` -M`0`7`!@`````````````````%P`1`P``<0```!(````!`"H`+0,````````$ -M`````0!L`!@`````````````````;`!$`P````````@````!`!H`&``````` -M```````````:`%D#``!+````"P````$`*@!N`P```````!0````!`&X`=@,` -M`)0````(`````0!N`!@```"4````````````;@!Z`P``G`````0````!`&X` -M@0,``*````"``````0!N`(\#````````"`````$`'``8```````````````` -M`!P`L`,``(,````7`````0`J`-$#````````"`````$`'@`8```````````` -M`````!X`\`,``!X````5`````0`J``\$````````"`````$`(``8```````` -M`````````"``)@0```8!```-`````0`J`#T$````````"`````$`(@`8```` -M`````````````"(`700``/`````6`````0`J`'T$````````"`````$`)``8 -M`````````````````"0`D`0``,\````)`````0`J`*,$````````"`````$` -M)@`8`````````````````"8`O`0````````/`````0`J`-4$````````"``` -M``$`*``8`````````````````"@`]`0``)H````5`````0`J`!,%```/```` -M#P````$`*@`L!0``0@````D````!`"H`/P4````````(`````0`K`!@````` -M````````````*P!2!0````````P````!`&\`&`````````````````!O`&8% -M````````"`````$`+0`8`````````````````"T`?P4`````````````!`#Q -M_Q4````,)P```````````0`5````%"<```````````$`%0```!@G```````` -M```!`!4````<)P```````````0`5````("<```````````$`%0```"@G```` -M```````!`!@```"8*````````````0`5````I"@```````````$`AP4````` -M```(`````0`O`!@`````````````````+P"B!0``C`$``!$````!`"H`O04` -M```````(`````0`Q`!@`````````````````,0#"T```````````$`&````'@N```````````!`!4` -M``",+@```````````0`5````C#````````````$`#@<``/`````8`````0`% -M`!@```#T````````````!0`?!P``+`$```0````!`&X`)`<``#`!```$```` -M`0!N`"L'```T`0``!`````$`;@`Q!P``"`$``!@````!``4`0@<``#@!```( -M`````0!N`$<'``!``0``"`````$`;@!.!P``2`$```@````!`&X`5`<``"`! -M```8`````0`%`&8'``"``0``(`````$`;@!L!P``H`$``"`````!`&X`=`<` -M`,`!```@`````0!N`'L'```X`0``&`````$`!0",!P``4`$``!`````!`&X` -MD0<``&`!```0`````0!N`)@'``!P`0``$`````$`;@">!P````````@````! -M`#T`&``````````````````]`+@'``"=`0``$`````$`*@#2!P``K0$``!`` -M```!`"H`[`<``+T!```,`````0`J``((``#)`0``#0````$`*@`9"```U@$` -M`!`````!`"H`,P@``.8!```.`````0`J`$L(````````"`````$`/P`8```` -M`````````````#\`90@````````(`````0!!`!@`````````````````00![ -M"`````````@````!`$,`&`````````````````!#`)4(````````"`````$` -M10`8`````````````````$4`K`@````````(`````0!'`!@````````````` -M````1P`8````+`$``````````&X`Q`@``.`!```(`````0!N`,@(```````` -M``````0`\?_2"```E#````@````"``$`%0```)0P```````````!`.`(``"< -M,```"`````(``0`5````G#````````````$`ZP@``*0P```(`````@`!`!4` -M``"D,````````````0#X"```K#````@````"``$`%0```*PP```````````! -M``4)``"T,```"`````(``0`5````M#````````````$`%0```+PP```````` -M```!`!@````,,0```````````0`1"0``%#$``$P````"``$`%0```!0Q```` -M```````!`!\)``!@,0``+`````(``0`5````8#$```````````$`&````(@Q -M```````````!`"P)``",,0``+`````(``0`5````C#$```````````$`&``` -M`+0Q```````````!`#@)``"X,0``+`````(``0`5````N#$```````````$` -M&````.`Q```````````!`$0)``#D,0``*`````(``0`5````Y#$````````` -M``$`&`````@R```````````!`$X)```,,@``-`````(``0`5````##(````` -M``````$`&````#PR```````````!`%L)``!`,@``-`````(``0`5````0#(` -M``````````$`&````'`R```````````!`&0)``!T,@``;`````(``0`5```` -M=#(```````````$`&````-PR```````````!`'`)``#@,@``1`````(``0`5 -M````X#(```````````$`>PD``"0S```T`````@`!`!4````D,P`````````` -M`0"%"0``6#,``"P````"``$`%0```%@S```````````!`!@```"`,P`````` -M`````0"."0``A#,``%`````"``$`%0```(0S```````````!`)<)``#4,P`` -M7`````(``0`5````U#,```````````$`I`D``#`T``"<`````@`!`!4````P -M-````````````0"R"0``S#0``%P````"``$`%0```,PT```````````!`+P) -M```H-0``K`````(``0`5````*#4```````````$`Q@D``-0U``#8`````@`! -M`!4```#4-0```````````0#2"0``K#8``+P````"``$`%0```*PV```````` -M```!`-T)``!H-P``<`````(``0`5````:#<```````````$`%0```-@W```` -M```````!`!@```!H.````````````0`5````;#@```````````$`%0```*PX -M```````````!`.D)``#T`0``$@````$`*@`%"@``!@(``!0````!`"H`(PH` -M```````(`````0!)`!@`````````````````20`_"@````````@````!`$L` -M&`````````````````!+`%T*```,````P`````$`:@`8````#``````````` -M`&H`:@H``.@!```(`````0!N`!@```#H`0``````````;@!N"@`````````` -M```$`/'_=PH``,@X``"T`````@`!`!4```#(.````````````0`5````?#D` -M``````````$`&````'`Z```````````!`!4```!T.@```````````0`5```` -M[#H```````````$`%0```*P[```````````!`!4```!`/````````````0`5 -M````Z#P```````````$`%0```$`]```````````!`!4````\/@`````````` -M`0`8````C#X```````````$`%0```)0^```````````!`!@```#\/@`````` -M`````0`5````!#\```````````$`&````)P_```````````!`!4```"@/P`` -M`````````0`5````Z#\```````````$`&````-1%```````````!`(,*``!0 -M`0``(`T```$`!0`8````4`$```````````4`B@H````````(`````0!-`!@` -M````````````````30"M"@``.`(``!D````!`"H`T`H````````(`````0!/ -M`!@`````````````````3P#K"@``A@(``!$````!`"H`!@L````````(```` -M`0!1`!@`````````````````40`E"P``40(``!4````!`"H`1`L````````( -M`````0!3`!@`````````````````4P!?"P``&@(``!$````!`"H`>@L``"L" -M```-`````0`J`)$+``!F`@``$@````$`*@"M"P``>`(```X````!`"H`Q0L` -M`)<"```1`````0`J`.`+``"H`@``%`````$`*@#^"P``O`(``!0````!`"H` -M'`P``-`"```5`````0`J`#L,``#E`@``%`````$`*@!9#```^0(```\````! -M`"H`<@P````````(`````0!5`!@`````````````````50"+#`````````@` -M```!`%<`&`````````````````!7`*,,````````"`````$`60`8```````` -M`````````%D`P0P````````(`````0!;`!@`````````````````6P#<#``` -M``````@````!`%T`&`````````````````!=`/,,````````"`````$`7P`8 -M`````````````````%\`$0T````````(`````0!A`!@````````````````` -M80`P#0````````@````!`&,`&`````````````````!C`$X-````````"``` -M``$`90`8`````````````````&4`:@T`````````````!`#Q_Q4```#<10`` -M`````````0`8````3$P```````````$`<@T``'`.```(`````0`%`!@```!P -M#@``````````!0"!#0``M`\``#0````2``$`F`T``'0Z``!X````$@`!`*P- -M````````!````!$`<0"U#0``_`<``&@````2``$`O@T``"`!```$````$0!N -M`-`-```H)P``?`$``!(``0#A#0`````````````0````\0T````````````` -M$``````.``"\,```6````!(``0`2#@`````````````0````'PX``.@\``!8 -M````$@`!`"T.`````````````!`````Y#@`````````````0````0@X``#`@ -M``#``"<`0``$@`!`&X1`````````````!````!\$0`````````````0 -M````BQ$``-Q%``#(!@``$@`!`)P1``"@!P``7````!(``0"K$0``O!P``!`! -M```2``$`NQ$``!0G```$````$@`!`-`1`````````````!````#G$0``<"L` -M`-@````2``$`]!$``*0H```(````$@`!``42`````````````!`````.$@`` -M.````%P````2``$`(1(`````````````$````"X2``"4/@``<````!(``0!" -M$@``!`````0````1`'$`2Q(`````````````$````%T2`````````````!`` -M``!L$@`````````````0````=Q(```@````$````$0!Q`(02```,)P``"``` -M`!(``0"2$@`````````````0````HQ(`````````````$````+(2``#8-P`` -ME````!(``0#!$@``!#\``)P````2``$`TA(``#P^``!8````$@`!`.82```` -M`````````!````#S$@``0#T``/P````2``$`"!,``(@"```@`0``$@`!`!<3 -M```,*@``9`$``!(``0`G$P`````````````0````,!,``)P!``"<````$@`! -M`$43`````````````!````!5$P``K#@``!P````2``$`:1,````````````` -M$````'`3`````````````!````"'$P`````````````0````EA,````````` -M````$````)T3`````````````!````"N$P`````````````0````N!,````` -M````````$````,L3`````````````!``````9F)M96TN8P!P=71?9F)?:6YF -M;P`D80`D9`!F8E]S97%?;F5X=`!F8E]S97%?6UT86)?9F)? -M9V5T7V-O;&]R7V1E<'1H`%]?:W-T0!?7VMS>6UT86)?9F)?6UT86)?9F)?8VQA6UT86)?9F)?:6YV97)T7V-M87!S`%]?:W-T6UT86)?9F)?86QL;V-?8VUA<`!20U0`9F)S>7-F6UT86)?9F)?;6]D95]O<'1I;VX`7U]K -M6UT86)?9F)?=F%R7W1O7W9I9&5O;6]D90!?7VMS -M>6UT86)?9F)?9FEN9%]B97-T7V1I%]I;FET`&9B7V1E9F%U;'1?8VUA<`!F8E]G971?;W!T -M:6]NF5R;P!F8E]P%]U;FQO8VL` -M9F)?9&5L971E7W9I9&5O;6]D90!F8E]V861D<@!?7W)E9VES=&5R7V-H0!S97%?<')I;G1F`&=?4FLR.7AX0VAI<`!F8E]P -M87)S95]E9&ED`%]?865A8FE?=6ED:79M;V0`0!F8E]P86Y? -M9&ES<&QA>0!F8E]C;6%P7W1O7W5S97(`5]F -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "rk29_fb.h" - -#ifdef CONFIG_PM -#include -#endif -#ifdef CONFIG_HDMI -#include - -#include -#endif - - -#include -#include -#include -#include -#include -#include -#include - -#include "./display/screen/screen.h" - -#ifdef CONFIG_MFD_RK610 -#include "./display/transmitter/rk610_lcd.h" -#endif -#define ANDROID_USE_THREE_BUFS 0 //android use three buffers to accelerate UI display in rgb plane -#define CURSOR_BUF_SIZE 256 //RK2818 cursor need 256B buf -int rk29_cursor_buf[CURSOR_BUF_SIZE]; -char cursor_img[] = { -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x20,0x00,0x00, -0x00,0x30,0x00,0x00, -0x00,0x28,0x00,0x00, -0x00,0x24,0x00,0x00, -0x00,0x22,0x00,0x00, -0x00,0x21,0x00,0x00, -0x00,0x20,0x80,0x00, -0x00,0x20,0x40,0x00, -0x00,0x20,0x20,0x00, -0x00,0x20,0x10,0x00, -0x00,0x20,0x08,0x00, -0x00,0x20,0x7C,0x00, -0x00,0x22,0x40,0x00, -0x00,0x26,0x40,0x00, -0x00,0x29,0x20,0x00, -0x00,0x31,0x20,0x00, -0x00,0x20,0x90,0x00, -0x00,0x00,0x90,0x00, -0x00,0x00,0x48,0x00, -0x00,0x00,0x48,0x00, -0x00,0x00,0x30,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00 -}; - -#if 0 - #define fbprintk(msg...) printk(msg); -#else - #define fbprintk(msg...) -#endif - - -#if 0 - #define fbprintk2(msg...) printk(msg); -#else - #define fbprintk2(msg...) -#endif - -#define LcdReadBit(inf, addr, msk) ((inf->regbak.addr=inf->preg->addr)&(msk)) -#define LcdWrReg(inf, addr, val) inf->preg->addr=inf->regbak.addr=(val) -#define LcdRdReg(inf, addr) (inf->preg->addr) -#define LcdSetBit(inf, addr, msk) inf->preg->addr=((inf->regbak.addr) |= (msk)) -#define LcdClrBit(inf, addr, msk) inf->preg->addr=((inf->regbak.addr) &= ~(msk)) -#define LcdSetRegisterBit(inf, addr, msk) inf->preg->addr=((inf->preg->addr) |= (msk)) -#define LcdMskReg(inf, addr, msk, val) (inf->regbak.addr)&=~(msk); inf->preg->addr=(inf->regbak.addr|=(val)) - - -#define IsMcuLandscape() ((SCREEN_MCU==inf->cur_screen->type) && (0==inf->mcu_scandir)) -#define IsMcuUseFmk() ( (2==inf->cur_screen->mcu_usefmk) || (1==inf->cur_screen->mcu_usefmk)) - -#define CalScaleW0(x, y) (((u32)x*0x1000)/y) - -struct rk29fb_rgb { - struct fb_bitfield red; - struct fb_bitfield green; - struct fb_bitfield blue; - struct fb_bitfield transp; -}; - -static struct rk29fb_rgb def_rgb_16 = { - red: { offset: 11, length: 5, }, - green: { offset: 5, length: 6, }, - blue: { offset: 0, length: 5, }, - transp: { offset: 0, length: 0, }, -}; - -struct win_set { - volatile u32 y_offset; - volatile u32 c_offset; -}; - -struct win0_par { - u32 refcount; - u32 pseudo_pal[16]; - u32 y_offset; - u32 c_offset; - u32 xpos; //size in panel - u32 ypos; - u32 xsize; //start point in panel - u32 ysize; - u32 format; - - wait_queue_head_t wait; - struct win_set mirror; - struct win_set displ; - struct win_set done; - - u8 par_seted; - u8 addr_seted; -}; - -/* -struct win1_par { - u32 refcount; - u32 pseudo_pal[16]; - int lstblank; - u32 xpos; - u32 ypos; - u32 xsize; - u32 ysize; - u32 format; - u32 addr_offset; -}; -*/ - -struct rk29fb_inf { - struct fb_info *fb1; - struct fb_info *fb0; - - void __iomem *reg_vir_base; // virtual basic address of lcdc register - u32 reg_phy_base; // physical basic address of lcdc register - u32 len; // physical map length of lcdc register - u32 video_mode; - - struct clk *clk; - struct clk *dclk; //lcdc dclk - struct clk *aclk; //lcdc share memory frequency - struct clk *aclk_parent; //lcdc aclk divider frequency source - struct clk *aclk_ddr_lcdc; //DDR LCDC AXI clock disable. - struct clk *aclk_disp_matrix; //DISPLAY matrix AXI clock disable. - struct clk *hclk_cpu_display; //CPU DISPLAY AHB bus clock disable. - struct clk *pd_display; // display power domain - unsigned long dclk_rate; - - /* lcdc reg base address and backup reg */ - LCDC_REG *preg; - LCDC_REG regbak; - - int in_suspend; - int fb0_color_deepth; - /* variable used in mcu panel */ - int mcu_needflush; - int mcu_isrcnt; - u16 mcu_scandir; - struct timer_list mcutimer; - int mcu_status; - u8 mcu_fmksync; - int mcu_usetimer; - int mcu_stopflush; - - int setFlag; - /* external memery */ - char __iomem *screen_base2; - __u32 smem_len2; - unsigned long smem_start2; - - char __iomem *cursor_base; /* cursor Virtual address*/ - __u32 cursor_size; /* Amount of ioremapped VRAM or 0 */ - unsigned long cursor_start; - - struct rk29fb_screen panel1_info; // 1st panel, it's lcd normally - struct rk29fb_screen panel2_info; // 2nd panel - struct rk29fb_screen *cur_screen; -#if 0 //def CONFIG_CPU_FREQ - struct notifier_block freq_transition; -#endif - -}; - -typedef enum _TRSP_MODE -{ - TRSP_CLOSE = 0, - TRSP_FMREG, - TRSP_FMREGEX, - TRSP_FMRAM, - TRSP_FMRAMEX, - TRSP_MASK, - TRSP_INVAL -} TRSP_MODE; -#ifdef FB_WIMO_FLAG -struct wimo_fb_info{ - unsigned long bitperpixel; - unsigned long mode; - unsigned long xaff; - unsigned long yaff; - unsigned long xpos; - unsigned long ypos; - unsigned long xsize; - unsigned long ysize; - unsigned long src_y; - unsigned long src_uv; - unsigned long dst_width; - unsigned long dst_height; - //struct mutex fb_lock; - volatile unsigned long fb_lock; - - -}; -struct wimo_fb_info wimo_info; -unsigned char* ui_buffer; -unsigned char* ui_buffer_map; -//unsigned char* overlay_buffer; -//unsigned char* overlay_buffer_map; -#endif - -struct platform_device *g_pdev = NULL; -//static int win1fb_set_par(struct fb_info *info); - -#if 0 -#define CHK_SUSPEND(inf) \ - if(inf->in_suspend) { \ - fbprintk(">>>>>> fb is in suspend! return! \n"); \ - return -EPERM; \ - } -#else -#define CHK_SUSPEND(inf) -#endif -static DECLARE_WAIT_QUEUE_HEAD(fb0_wait_queue); -static volatile int idle_condition = 1; //1:idel, 0:busy - -static DECLARE_WAIT_QUEUE_HEAD(wq); -static int wq_condition = 0; -static int wq_condition2 = 0; -static int fb1_open_init = 0; -#if ANDROID_USE_THREE_BUFS -static int new_frame_seted = 1; -#endif -static struct wake_lock idlelock; /* only for fb */ -#ifdef CONFIG_FB_ROTATE_VIDEO -//add by zyc -static bool has_set_rotate; -static u32 last_yuv_phy[2] = {0,0}; -#endif -int fb0_first_buff_bits = 32; -int fb0_second_buff_bits = 32; -int fb_compose_layer_count = 0; -static BLOCKING_NOTIFIER_HEAD(rk29fb_notifier_list); -int rk29fb_register_notifier(struct notifier_block *nb) -{ - int ret = 0; - if (g_pdev) { - struct rk29fb_inf *inf = platform_get_drvdata(g_pdev); - if (inf) { - if (inf->cur_screen && inf->cur_screen->type == SCREEN_HDMI) - nb->notifier_call(nb, RK29FB_EVENT_HDMI_ON, inf->cur_screen); - if (inf->fb1 && inf->fb1->par) { - struct win0_par *par = inf->fb1->par; - if (par->refcount) - nb->notifier_call(nb, RK29FB_EVENT_FB1_ON, inf->cur_screen); - } - } - } - ret = blocking_notifier_chain_register(&rk29fb_notifier_list, nb); - - return ret; -} - -int rk29fb_unregister_notifier(struct notifier_block *nb) -{ - return blocking_notifier_chain_unregister(&rk29fb_notifier_list, nb); -} - -static int rk29fb_notify(struct rk29fb_inf *inf, unsigned long event) -{ - return blocking_notifier_call_chain(&rk29fb_notifier_list, event, inf->cur_screen); -} -void rk29_lcd_set(bool on) -{ - struct rk29fb_info *mach_info = g_pdev->dev.platform_data; - if(on == 1 &&mach_info->io_enable) - mach_info->io_enable(); //open lcd out - else if(mach_info->io_disable) - mach_info->io_disable(); //close lcd out - -} -int mcu_do_refresh(struct rk29fb_inf *inf) -{ - if(inf->mcu_stopflush) return 0; - - if(SCREEN_MCU!=inf->cur_screen->type) return 0; - - // use frame mark - if(IsMcuUseFmk()) - { - inf->mcu_needflush = 1; - return 0; - } - - // not use frame mark - if(LcdReadBit(inf, MCU_TIMING_CTRL, m_MCU_HOLDMODE_SELECT)) - { - if(!LcdReadBit(inf, MCU_TIMING_CTRL, m_MCU_HOLDMODE_FRAME_ST)) - { - inf->mcu_needflush = 1; - } - else - { - if(inf->cur_screen->refresh) inf->cur_screen->refresh(REFRESH_PRE); - inf->mcu_needflush = 0; - inf->mcu_isrcnt = 0; - LcdSetRegisterBit(inf, MCU_TIMING_CTRL, m_MCU_HOLDMODE_FRAME_ST); - } - } - return 0; -} - - -void mcutimer_callback(unsigned long arg) -{ - struct rk29fb_inf *inf = platform_get_drvdata(g_pdev); - static int waitcnt = 0; - - mod_timer(&inf->mcutimer, jiffies + HZ/10); - - switch(inf->mcu_status) - { - case MS_IDLE: - inf->mcu_status = MS_MCU; - break; - case MS_MCU: - if(inf->mcu_usetimer) mcu_do_refresh(inf); - break; - case MS_EWAITSTART: - inf->mcu_status = MS_EWAITEND; - waitcnt = 0; - break; - case MS_EWAITEND: - if(0==waitcnt) { - mcu_do_refresh(inf); - } - if(waitcnt++>14) { - inf->mcu_status = MS_EEND; - } - break; - case MS_EEND: - inf->mcu_status = MS_MCU; - break; - default: - inf->mcu_status = MS_MCU; - break; - } -} - -int mcu_refresh(struct rk29fb_inf *inf) -{ - static int mcutimer_inited = 0; - - if(SCREEN_MCU!=inf->cur_screen->type) return 0; - - if(!mcutimer_inited) - { - mcutimer_inited = 1; - init_timer(&inf->mcutimer); - inf->mcutimer.function = mcutimer_callback; - inf->mcutimer.expires = jiffies + HZ/5; - inf->mcu_status = MS_IDLE; - add_timer(&inf->mcutimer); - } - - if(MS_MCU==inf->mcu_status) mcu_do_refresh(inf); - - return 0; -} - -int mcu_ioctl(unsigned int cmd, unsigned long arg) -{ - struct rk29fb_inf *inf = NULL; - if(!g_pdev) return -1; - - inf = dev_get_drvdata(&g_pdev->dev); - - switch(cmd) - { - case MCU_WRCMD: - LcdClrBit(inf, MCU_TIMING_CTRL, m_MCU_RS_SELECT); - LcdWrReg(inf, MCU_BYPASS_WPORT, arg); - LcdSetBit(inf, MCU_TIMING_CTRL, m_MCU_RS_SELECT); - break; - - case MCU_WRDATA: - LcdSetBit(inf, MCU_TIMING_CTRL, m_MCU_RS_SELECT); - LcdWrReg(inf, MCU_BYPASS_WPORT, arg); - break; - - case MCU_SETBYPASS: - LcdMskReg(inf, MCU_TIMING_CTRL, m_MCU_BYPASSMODE_SELECT, v_MCU_BYPASSMODE_SELECT(arg)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - break; - - default: - break; - } - - return 0; -} - -static irqreturn_t mcu_irqfmk(int irq, void *dev_id) -{ - struct platform_device *pdev = (struct platform_device*)dev_id; - struct rk29fb_inf *inf = platform_get_drvdata(pdev); - struct rk29fb_screen *screen; - - if(!inf) return IRQ_HANDLED; - - screen = inf->cur_screen; - - if(0==screen->mcu_usefmk) { - return IRQ_HANDLED; - } - - if(inf->mcu_fmksync == 1) - return IRQ_HANDLED; - - inf->mcu_fmksync = 1; - if(inf->mcu_needflush) - { - inf->mcu_needflush = 0; - inf->mcu_isrcnt = 0; - if(inf->cur_screen->refresh) - inf->cur_screen->refresh(REFRESH_PRE); - LcdSetBit(inf, MCU_TIMING_CTRL, m_MCU_HOLDMODE_FRAME_ST); - } - inf->mcu_fmksync = 0; - - return IRQ_HANDLED; -} - -int init_lcdc(struct fb_info *info) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - u32 msk=0, clr=0; - - fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - - inf->clk = clk_get(NULL, "hclk_lcdc"); - inf->aclk_ddr_lcdc = clk_get(NULL, "aclk_ddr_lcdc"); - inf->aclk_disp_matrix = clk_get(NULL, "aclk_disp_matrix"); - inf->hclk_cpu_display = clk_get(NULL, "hclk_cpu_display"); - inf->pd_display = clk_get(NULL, "pd_display"); - if ((IS_ERR(inf->clk)) || - (IS_ERR(inf->aclk_ddr_lcdc)) || - (IS_ERR(inf->aclk_disp_matrix)) || - (IS_ERR(inf->hclk_cpu_display)) || - (IS_ERR(inf->pd_display))) - { - printk(KERN_ERR "failed to get lcdc_hclk source\n"); - return PTR_ERR(inf->clk); - } - clk_enable(inf->aclk_disp_matrix); - clk_enable(inf->hclk_cpu_display); - clk_enable(inf->clk); - clk_enable(inf->pd_display); - //pmu_set_power_domain(PD_DISPLAY, 1); - clk_enable(inf->aclk_ddr_lcdc); - - // set AHB access rule and disable all windows - LcdWrReg(inf, SYS_CONFIG, 0x60000000); - LcdWrReg(inf, SWAP_CTRL, 0); - LcdWrReg(inf, FIFO_WATER_MARK, 0x00000862);//68 - LcdWrReg(inf, AXI_MS_ID, 0x54321); - - // and mcu holdmode; and set win1 top. - LcdMskReg(inf, MCU_TIMING_CTRL, m_MCU_HOLDMODE_SELECT | m_MCU_HOLDMODE_FRAME_ST | m_MCU_BYPASSMODE_SELECT , - v_MCU_HOLDMODE_SELECT(0)| v_MCU_HOLDMODE_FRAME_ST(0) |v_MCU_BYPASSMODE_SELECT(0)); - - // disable blank out, black out, tristate out, yuv2rgb bypass - LcdMskReg(inf, BLEND_CTRL,m_W2_BLEND_EN | m_W1_BLEND_EN | m_W0_BLEND_EN | m_HWC_BLEND_EN | - m_HWC_BLEND_FACTOR | m_W1_BLEND_FACTOR | m_W0_BLEND_FACTOR, - v_W2_BLEND_EN(0) |v_W1_BLEND_EN(0) | v_W0_BLEND_EN(0) | v_HWC_BLEND_EN(0) | - v_HWC_BLEND_FACTOR(0) | v_W2_BLEND_FACTOR(0) | v_W1_BLEND_FACTOR(0) | v_W0_BLEND_FACTOR(0) - ); - - LcdMskReg(inf, WIN0_COLOR_KEY_CTRL, m_COLORKEY_EN, v_COLORKEY_EN(0)); - LcdMskReg(inf, WIN1_COLOR_KEY_CTRL, m_COLORKEY_EN, v_COLORKEY_EN(0)); - - LcdWrReg(inf, DSP_CTRL1, 0); - - // initialize all interrupt - clr = v_HOR_STARTCLEAR(1) | v_FRM_STARTCLEAR(1) | v_SCANNING_CLEAR(1); - - msk = v_HOR_STARTMASK(1) | v_FRM_STARTMASK(0) | v_SCANNING_MASK(1); - - LcdWrReg(inf, INT_STATUS, clr | msk); - - // let above to take effect - LcdWrReg(inf, REG_CFG_DONE, 0x01); - - return 0; -} - -void load_screen(struct fb_info *info, bool initscreen) -{ - int ret = -EINVAL; - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct rk29fb_screen *screen = inf->cur_screen; - u16 face; - u16 mcu_total, mcu_rwstart, mcu_csstart, mcu_rwend, mcu_csend; - u16 right_margin = screen->right_margin, lower_margin = screen->lower_margin; - u16 x_res = screen->x_res, y_res = screen->y_res; - u32 aclk_rate = 150000000; - - if(!g_pdev){ - printk(">>>>>> %s : %s no g_pdev\n", __FILE__, __FUNCTION__); - return; - } - - fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - - // set the rgb or mcu - LcdMskReg(inf, MCU_TIMING_CTRL, m_MCU_OUTPUT_SELECT, v_MCU_OUTPUT_SELECT((SCREEN_MCU==screen->type)?(1):(0))); - - // set out format and mcu timing - mcu_total = (screen->mcu_wrperiod*150*1000)/1000000; - if(mcu_total>31) mcu_total = 31; - if(mcu_total<3) mcu_total = 3; - mcu_rwstart = (mcu_total+1)/4 - 1; - mcu_rwend = ((mcu_total+1)*3)/4 - 1; - mcu_csstart = (mcu_rwstart>2) ? (mcu_rwstart-3) : (0); - mcu_csend = (mcu_rwend>15) ? (mcu_rwend-1) : (mcu_rwend); - - fbprintk(">> mcu_total=%d, mcu_rwstart=%d, mcu_csstart=%d, mcu_rwend=%d, mcu_csend=%d \n", - mcu_total, mcu_rwstart, mcu_csstart, mcu_rwend, mcu_csend); - - LcdMskReg(inf, MCU_TIMING_CTRL, - m_MCU_CS_ST | m_MCU_CS_END| m_MCU_RW_ST | m_MCU_RW_END | - m_MCU_WRITE_PERIOD | m_MCU_HOLDMODE_SELECT | m_MCU_HOLDMODE_FRAME_ST, - v_MCU_CS_ST(mcu_csstart) | v_MCU_CS_END(mcu_csend) | v_MCU_RW_ST(mcu_rwstart) | - v_MCU_RW_END(mcu_rwend) | v_MCU_WRITE_PERIOD(mcu_total) | - v_MCU_HOLDMODE_SELECT((SCREEN_MCU==screen->type)?(1):(0)) | v_MCU_HOLDMODE_FRAME_ST(0) - ); - - // set synchronous pin polarity and data pin swap rule - switch (screen->face) - { - case OUT_P565: - face = OUT_P565; - LcdMskReg(inf, DSP_CTRL0, m_DITHER_DOWN_EN | m_DITHER_DOWN_MODE, v_DITHER_DOWN_EN(1) | v_DITHER_DOWN_MODE(0)); - break; - case OUT_P666: - face = OUT_P666; - LcdMskReg(inf, DSP_CTRL0, m_DITHER_DOWN_EN | m_DITHER_DOWN_MODE, v_DITHER_DOWN_EN(1) | v_DITHER_DOWN_MODE(1)); - break; - case OUT_D888_P565: - face = OUT_P888; - LcdMskReg(inf, DSP_CTRL0, m_DITHER_DOWN_EN | m_DITHER_DOWN_MODE, v_DITHER_DOWN_EN(1) | v_DITHER_DOWN_MODE(0)); - break; - case OUT_D888_P666: - face = OUT_P888; - LcdMskReg(inf, DSP_CTRL0, m_DITHER_DOWN_EN | m_DITHER_DOWN_MODE, v_DITHER_DOWN_EN(1) | v_DITHER_DOWN_MODE(1)); - break; - case OUT_P888: - face = OUT_P888; - LcdMskReg(inf, DSP_CTRL0, m_DITHER_UP_EN, v_DITHER_UP_EN(1)); - LcdMskReg(inf, DSP_CTRL0, m_DITHER_DOWN_EN | m_DITHER_DOWN_MODE, v_DITHER_DOWN_EN(0) | v_DITHER_DOWN_MODE(0)); - break; - default: - LcdMskReg(inf, DSP_CTRL0, m_DITHER_UP_EN, v_DITHER_UP_EN(0)); - LcdMskReg(inf, DSP_CTRL0, m_DITHER_DOWN_EN | m_DITHER_DOWN_MODE, v_DITHER_DOWN_EN(0) | v_DITHER_DOWN_MODE(0)); - face = screen->face; - break; - } - - LcdMskReg(inf, DSP_CTRL0, - m_DISPLAY_FORMAT | m_HSYNC_POLARITY | m_VSYNC_POLARITY | m_DEN_POLARITY | - m_DCLK_POLARITY | m_COLOR_SPACE_CONVERSION, - v_DISPLAY_FORMAT(face) | v_HSYNC_POLARITY(screen->pin_hsync) | v_VSYNC_POLARITY(screen->pin_vsync) | - v_DEN_POLARITY(screen->pin_den) | v_DCLK_POLARITY(screen->pin_dclk) | v_COLOR_SPACE_CONVERSION(0) - ); - - LcdMskReg(inf, DSP_CTRL1, m_BG_COLOR, v_BG_COLOR(0x000000) ); - - LcdMskReg(inf, SWAP_CTRL, m_OUTPUT_RB_SWAP | m_OUTPUT_RG_SWAP | m_DELTA_SWAP | m_DUMMY_SWAP, - v_OUTPUT_RB_SWAP(screen->swap_rb) | v_OUTPUT_RG_SWAP(screen->swap_rg) | v_DELTA_SWAP(screen->swap_delta) | v_DUMMY_SWAP(screen->swap_dumy)); - - // set horizontal & vertical out timing - if(SCREEN_MCU==inf->cur_screen->type) - { - right_margin = x_res/6; - } - - fbprintk("screen->hsync_len =%d, screen->left_margin =%d, x_res =%d, right_margin = %d \n", - screen->hsync_len , screen->left_margin , x_res , right_margin ); - LcdMskReg(inf, DSP_HTOTAL_HS_END, m_BIT12LO | m_BIT12HI, v_BIT12LO(screen->hsync_len) | - v_BIT12HI(screen->hsync_len + screen->left_margin + x_res + right_margin)); - LcdMskReg(inf, DSP_HACT_ST_END, m_BIT12LO | m_BIT12HI, v_BIT12LO(screen->hsync_len + screen->left_margin + x_res) | - v_BIT12HI(screen->hsync_len + screen->left_margin)); - - LcdMskReg(inf, DSP_VTOTAL_VS_END, m_BIT11LO | m_BIT11HI, v_BIT11LO(screen->vsync_len) | - v_BIT11HI(screen->vsync_len + screen->upper_margin + y_res + lower_margin)); - LcdMskReg(inf, DSP_VACT_ST_END, m_BIT11LO | m_BIT11HI, v_BIT11LO(screen->vsync_len + screen->upper_margin+y_res)| - v_BIT11HI(screen->vsync_len + screen->upper_margin)); - - LcdMskReg(inf, DSP_VS_ST_END_F1, m_BIT11LO | m_BIT11HI, v_BIT11LO(0) | v_BIT11HI(0)); - LcdMskReg(inf, DSP_VACT_ST_END_F1, m_BIT11LO | m_BIT11HI, v_BIT11LO(0) | v_BIT11HI(0)); - - // let above to take effect - LcdWrReg(inf, REG_CFG_DONE, 0x01); - - inf->dclk = clk_get(NULL, "dclk_lcdc"); - if (IS_ERR(inf->dclk)) - { - printk(KERN_ERR "failed to get lcd dclock source\n"); - return ; - } - - inf->aclk = clk_get(NULL, "aclk_lcdc"); - if (IS_ERR(inf->aclk)) - { - printk(KERN_ERR "failed to get lcd clock clk_share_mem source \n"); - return; - } - inf->aclk_parent = clk_get(NULL, "ddr_pll");//general_pll //ddr_pll - if (IS_ERR(inf->aclk_parent)) - { - printk(KERN_ERR "failed to get lcd clock parent source\n"); - return ; - } - - // set lcdc clk - if(SCREEN_MCU==screen->type) screen->pixclock = 150000000; //mcu fix to 150 MHz - - if(initscreen == 0) //not init - { - clk_disable(inf->dclk); - // clk_disable(inf->aclk); - } - - // clk_disable(inf->aclk_ddr_lcdc); - // clk_disable(inf->aclk_disp_matrix); - // clk_disable(inf->hclk_cpu_display); - - // clk_disable(inf->clk); - - - fbprintk(">>>>>> set lcdc dclk need %d HZ, clk_parent = %d hz ret =%d\n ", screen->pixclock, screen->lcdc_aclk, ret); - - ret = clk_set_rate(inf->dclk, screen->pixclock); - if(ret) - { - printk(KERN_ERR ">>>>>> set lcdc dclk failed\n"); - } - inf->fb0->var.pixclock = inf->fb1->var.pixclock = div_u64(1000000000000llu, clk_get_rate(inf->dclk)); - if(initscreen) - { - ret = clk_set_parent(inf->aclk, inf->aclk_parent); - if(screen->lcdc_aclk){ - aclk_rate = screen->lcdc_aclk; - } - ret = clk_set_rate(inf->aclk, aclk_rate); - if(ret){ - printk(KERN_ERR ">>>>>> set lcdc aclk failed\n"); - } - clk_enable(inf->aclk); - } - // clk_enable(inf->aclk_ddr_lcdc); - // clk_enable(inf->aclk_disp_matrix); - // clk_enable(inf->hclk_cpu_display); - // clk_enable(inf->clk); - clk_enable(inf->dclk); - - // init screen panel - if(screen->init) - { - screen->init(); - } -} -#if 0 //def CONFIG_CPU_FREQ -/* -* CPU clock speed change handler. We need to adjust the LCD timing -* parameters when the CPU clock is adjusted by the power management -* subsystem. -*/ -#define TO_INF(ptr,member) container_of(ptr,struct rk29fb_inf,member) - -static int -rk29fb_freq_transition(struct notifier_block *nb, unsigned long val, void *data) -{ - struct rk29fb_inf *inf = TO_INF(nb, freq_transition); - struct rk29fb_screen *screen = inf->cur_screen; - u32 dclk_rate = 0; - - switch (val) - { - case CPUFREQ_PRECHANGE: - break; - case CPUFREQ_POSTCHANGE: - { - dclk_rate = screen->pixclock * 1000000; - - fbprintk(">>>>>> set lcdc dclk need %d HZ, clk_parent = %d hz \n ", screen->pixclock, dclk_rate); - - clk_set_rate(inf->dclk_divider, dclk_rate); - break; - } - } - return 0; -} -#endif - -static inline unsigned int chan_to_field(unsigned int chan, - struct fb_bitfield *bf) -{ - chan &= 0xffff; - chan >>= 16 - bf->length; - return chan << bf->offset; -} - -static int fb_setcolreg(unsigned regno, - unsigned red, unsigned green, unsigned blue, - unsigned transp, struct fb_info *info) -{ - unsigned int val; -// fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - - switch (info->fix.visual) { - case FB_VISUAL_TRUECOLOR: - /* true-colour, use pseudo-palette */ - if (regno < 16) { - u32 *pal = info->pseudo_palette; - val = chan_to_field(red, &info->var.red); - val |= chan_to_field(green, &info->var.green); - val |= chan_to_field(blue, &info->var.blue); - pal[regno] = val; - } - break; - default: - return -1; /* unknown type */ - } - - return 0; -} - -int rk29_set_cursor_en(struct rk29fb_inf *inf, int enable) -{ - if (enable){ - LcdSetBit(inf, SYS_CONFIG, m_HWC_ENABLE); - }else{ - LcdClrBit(inf, SYS_CONFIG, m_HWC_ENABLE); - } - LcdWrReg(inf, REG_CFG_DONE, 0x01); - return 0; -} - -int rk29_set_cursor_pos(struct rk29fb_inf *inf, int x, int y) -{ - struct rk29fb_screen *screen = inf->cur_screen; - - /* set data */ - if (x >= 0x800 || y >= 0x800 ) - return -EINVAL; - //printk("%s: %08x,%08x \n",__func__, x, y); - x += (screen->left_margin + screen->hsync_len); - y += (screen->upper_margin + screen->vsync_len); - LcdWrReg(inf, HWC_DSP_ST, v_BIT11LO(x)|v_BIT11HI(y)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - return 0; -} - - -int rk29_set_cursor_colour_map(struct rk29fb_inf *inf, int bg_col, int fg_col) -{ - LcdMskReg(inf, HWC_COLOR_LUT0, m_HWC_R|m_HWC_G|m_HWC_B,bg_col); - LcdMskReg(inf, HWC_COLOR_LUT2, m_HWC_R|m_HWC_G|m_HWC_B,fg_col); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - return 0; -} - -#define RK29_CURSOR_WRITE_BIT(addr,mask,value) (*((char*)addr)) = (((*((char*)addr))&(~((char)mask)))|((char)value)) -int rk29_set_cursor_img_transform(char *data) -{ int x, y; - char *pmsk = data; - char *dst = (char*)rk29_cursor_buf; - unsigned char dmsk = 0; - unsigned int op,shift,offset; - - /* rk29 cursor is a 2 bpp 32x32 bitmap this routine - * clears it to transparent then combines the cursor - * shape plane with the colour plane to set the - * cursor */ - for (y = 0; y < 32; y++) - { - for (x = 0; x < 32; x++) - { - if ((x % 8) == 0) { - dmsk = *pmsk++; - } else { - dmsk <<= 1; - } - op = (dmsk & 0x80) ? 2 : 3; - shift = (x*2)%8; - offset = x/4; - RK29_CURSOR_WRITE_BIT((dst+offset),(3<device); - rk29_set_cursor_colour_map(inf, 0x000000ff, 0x00ff0000); - rk29_set_cursor_pos(inf, 0, 0); - rk29_set_cursor_img(inf, 0); - rk29_set_cursor_en(inf, 1); - return 0; -} -#if 0 - -int rk29_set_cursor(struct fb_info *info, struct fb_cursor *cursor) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - - //fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - - /* check not being asked to exceed capabilities */ - - if (cursor->image.width > 32) - return -EINVAL; - - if (cursor->image.height > 32) - return -EINVAL; - - if (cursor->image.depth > 1) - return -EINVAL; - - if (cursor->enable) - LcdSetBit(inf, SYS_CONFIG, m_HWC_ENABLE); - else - LcdClrBit(inf, SYS_CONFIG, m_HWC_ENABLE); - - /* set data */ - if (cursor->set & FB_CUR_SETPOS) - { - unsigned int x = cursor->image.dx; - unsigned int y = cursor->image.dy; - - if (x >= 0x800 || y >= 0x800 ) - return -EINVAL; - LcdWrReg(inf, HWC_DSP_ST, v_BIT11LO(x)|v_BIT11HI(y)); - } - - - if (cursor->set & FB_CUR_SETCMAP) - { - unsigned int bg_col = cursor->image.bg_color; - unsigned int fg_col = cursor->image.fg_color; - - fbprintk("%s: update cmap (%08x,%08x)\n", - __func__, bg_col, fg_col); - - LcdMskReg(inf, HWC_COLOR_LUT0, m_HWC_R|m_HWC_G|m_HWC_B, - v_HWC_R(info->cmap.red[bg_col]>>8) | v_HWC_G(info->cmap.green[bg_col]>>8) | v_HWC_B(info->cmap.blue[bg_col]>>8)); - - LcdMskReg(inf, HWC_COLOR_LUT2, m_HWC_R|m_HWC_G|m_HWC_B, - v_HWC_R(info->cmap.red[fg_col]>>8) | v_HWC_G(info->cmap.green[fg_col]>>8) | v_HWC_B(info->cmap.blue[fg_col]>>8)); - } - - if ((cursor->set & FB_CUR_SETSIZE || - cursor->set & (FB_CUR_SETIMAGE | FB_CUR_SETSHAPE)) - && info->screen_base && info->fix.smem_start && info->fix.smem_len) - { - /* rk29 cursor is a 2 bpp 32x32 bitmap this routine - * clears it to transparent then combines the cursor - * shape plane with the colour plane to set the - * cursor */ - int x, y; - const unsigned char *pcol = cursor->image.data; - const unsigned char *pmsk = cursor->mask; - void __iomem *dst; - unsigned long cursor_mem_start; - unsigned char dcol = 0; - unsigned char dmsk = 0; - unsigned int op; - - dst = info->screen_base + info->fix.smem_len - CURSOR_BUF_SIZE; - cursor_mem_start = info->fix.smem_start + info->fix.smem_len - CURSOR_BUF_SIZE; - - fbprintk("%s: setting shape (%d,%d)\n", - __func__, cursor->image.width, cursor->image.height); - - memset(dst, 0, CURSOR_BUF_SIZE); - - for (y = 0; y < cursor->image.height; y++) - { - for (x = 0; x < cursor->image.width; x++) - { - if ((x % 8) == 0) { - dcol = *pcol++; - dmsk = *pmsk++; - } else { - dcol >>= 1; - dmsk >>= 1; - } - - if (dmsk & 1) { - op = (dcol & 1) ? 1 : 3; - op <<= ((x % 4) * 2); - *(u8*)(dst+(x/4)) |= op; - } - } - dst += (32*2)/8; - } - LcdSetBit(inf, SYS_CONFIG,m_HWC_RELOAD_EN); - LcdWrReg(inf, HWC_MST, cursor_mem_start); - // flush end when wq_condition=1 in mcu panel, but not in rgb panel - if(SCREEN_MCU == inf->cur_screen->type) { - wait_event_interruptible_timeout(wq, wq_condition, HZ/20); - wq_condition = 0; - } else { - wq_condition = 0; - wait_event_interruptible_timeout(wq, wq_condition, HZ/20); - } - LcdClrBit(inf, SYS_CONFIG, m_HWC_RELOAD_EN); - } - - return 0; -} -#endif -static int hdmi_get_fbscale(void) -{ -#ifdef CONFIG_HDMI - return hdmi_get_scale(); -#else - return 100; -#endif -} -static void hdmi_set_fbscale(struct fb_info *info) -{ -#ifdef CONFIG_HDMI - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct rk29fb_screen *screen = inf->cur_screen; - struct win0_par *par = info->par; - int scale; - - scale = hdmi_get_scale(); - if(scale == 100) - return; - par->xpos += screen->x_res * (100-scale) / 200; - par->ypos += screen->y_res * (100-scale) / 200; - par->xsize = par->xsize *scale /100; - par->ysize = par->ysize *scale /100; -#endif -} -static int win0_blank(int blank_mode, struct fb_info *info) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - - fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - - CHK_SUSPEND(inf); - - switch(blank_mode) - { - case FB_BLANK_UNBLANK: - LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(1)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - break; - case FB_BLANK_NORMAL: - LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(0)); - break; - default: - LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(0)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); -#ifdef CONFIG_DDR_RECONFIG - msleep(40); -#endif - break; - } - - mcu_refresh(inf); - return 0; -} - -static int win0_set_par(struct fb_info *info) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct rk29fb_screen *screen = inf->cur_screen; - struct fb_var_screeninfo *var = &info->var; - struct fb_fix_screeninfo *fix = &info->fix; - struct win0_par *par = info->par; - u32 xact, yact, xvir, yvir, xpos, ypos, ScaleYrgbX,ScaleYrgbY, ScaleCbrX, ScaleCbrY, y_addr,uv_addr; - hdmi_set_fbscale(info); - xact = var->xres; /* visible resolution */ - yact = var->yres; - xvir = var->xres_virtual; /* virtual resolution */ - yvir = var->yres_virtual; - //u32 xact_st = var->xoffset; /* offset from virtual to visible */ - //u32 yact_st = var->yoffset; /* resolution */ - xpos = par->xpos; - ypos = par->ypos; - - ScaleYrgbX=0x1000; - ScaleYrgbY=0x1000; - ScaleCbrX=0x1000; - ScaleCbrY=0x1000; - - y_addr = 0; //user alloc buf addr y - uv_addr = 0; - - fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); - - CHK_SUSPEND(inf); - - if((var->rotate%360!=0)&& (inf->video_mode)) - { - #ifdef CONFIG_FB_ROTATE_VIDEO - if(xact > screen->x_res) - { - xact = screen->x_res; /* visible resolution */ - yact = screen->y_res; - xvir = screen->x_res; /* virtual resolution */ - yvir = screen->y_res; - } else { - xact = var->xres; /* visible resolution */ - yact = var->yres; - xvir = var->xres_virtual; /* virtual resolution */ - yvir = var->yres_virtual; - printk("xact=%d yact =%d \n",xact,yact); - } - #else //CONFIG_FB_ROTATE_VIDEO - printk("LCDC not support rotate!\n"); - return -EINVAL; - #endif - } - - // calculate the display phy address - y_addr = fix->smem_start + par->y_offset; - uv_addr = fix->mmio_start + par->c_offset; - - ScaleYrgbX = CalScaleW0(xact, par->xsize); - ScaleYrgbY = CalScaleW0(yact, par->ysize); - - switch (par->format) - { - case 2:// yuv422 - ScaleCbrX= CalScaleW0((xact/2), par->xsize); - ScaleCbrY = CalScaleW0(yact, par->ysize); - break; - case 3: // yuv4200 - case 4: // yuv4201 - ScaleCbrX= CalScaleW0(xact/2, par->xsize); - ScaleCbrY = CalScaleW0(yact/2, par->ysize); - break; - case 5:// yuv444 - ScaleCbrX= CalScaleW0(xact, par->xsize); - ScaleCbrY = CalScaleW0(yact, par->ysize); - break; - default: - break; - } - - xpos += (screen->left_margin + screen->hsync_len); - ypos += (screen->upper_margin + screen->vsync_len); - - LcdWrReg(inf, WIN0_YRGB_MST, y_addr); - LcdWrReg(inf, WIN0_CBR_MST, uv_addr); - - LcdMskReg(inf, SYS_CONFIG, m_W0_FORMAT , v_W0_FORMAT(par->format));//(inf->video_mode==0) - - LcdMskReg(inf, WIN0_VIR, m_WORDLO | m_WORDHI, v_VIRWIDTH(xvir) | v_VIRHEIGHT((yvir)) ); - LcdMskReg(inf, WIN0_ACT_INFO, m_WORDLO | m_WORDHI, v_WORDLO(xact) | v_WORDHI(yact)); - LcdMskReg(inf, WIN0_DSP_ST, m_BIT11LO | m_BIT11HI, v_BIT11LO(xpos) | v_BIT11HI(ypos)); - LcdMskReg(inf, WIN0_DSP_INFO, m_BIT12LO | m_BIT12HI, v_BIT12LO(par->xsize) | v_BIT12HI(par->ysize)); - LcdMskReg(inf, WIN0_SCL_FACTOR_YRGB, m_WORDLO | m_WORDHI, v_WORDLO(ScaleYrgbX) | v_WORDHI(ScaleYrgbY)); - LcdMskReg(inf, WIN0_SCL_FACTOR_CBR, m_WORDLO | m_WORDHI, v_WORDLO(ScaleCbrX) | v_WORDHI(ScaleCbrY)); - - switch(par->format) - { - case 0: //rgb888 - LcdMskReg(inf, SWAP_CTRL, m_W0_YRGB_8_SWAP | m_W0_YRGB_16_SWAP | m_W0_YRGB_R_SHIFT_SWAP | m_W0_565_RB_SWAP | m_W0_YRGB_M8_SWAP | m_W0_CBR_8_SWAP, - v_W0_YRGB_8_SWAP(1) | v_W0_YRGB_16_SWAP(1) | v_W0_YRGB_R_SHIFT_SWAP(1) | v_W0_565_RB_SWAP(0) | v_W0_YRGB_M8_SWAP(0) | v_W0_CBR_8_SWAP(0)); - break; - case 1: //rgb565 - LcdMskReg(inf, SWAP_CTRL, m_W0_YRGB_8_SWAP | m_W0_YRGB_16_SWAP | m_W0_YRGB_R_SHIFT_SWAP | m_W0_565_RB_SWAP | m_W0_YRGB_M8_SWAP | m_W0_CBR_8_SWAP, - v_W0_YRGB_8_SWAP(0) | v_W0_YRGB_16_SWAP(0) | v_W0_YRGB_R_SHIFT_SWAP(0) | v_W0_565_RB_SWAP(0) | v_W0_YRGB_M8_SWAP(0) | v_W0_CBR_8_SWAP(0)); - break; - case 4: //yuv4201 - LcdMskReg(inf, SWAP_CTRL, m_W0_YRGB_8_SWAP | m_W0_YRGB_16_SWAP | m_W0_YRGB_R_SHIFT_SWAP | m_W0_565_RB_SWAP | m_W0_YRGB_M8_SWAP | m_W0_CBR_8_SWAP, - v_W0_YRGB_8_SWAP(0) | v_W0_YRGB_16_SWAP(0) | v_W0_YRGB_R_SHIFT_SWAP(0) | v_W0_565_RB_SWAP(0) | - v_W0_YRGB_M8_SWAP(1) | v_W0_CBR_8_SWAP(0)); - break; - default: - LcdMskReg(inf, SWAP_CTRL, m_W0_YRGB_8_SWAP | m_W0_YRGB_16_SWAP | m_W0_YRGB_R_SHIFT_SWAP | m_W0_565_RB_SWAP | m_W0_YRGB_M8_SWAP | m_W0_CBR_8_SWAP, - v_W0_YRGB_8_SWAP(0) | v_W0_YRGB_16_SWAP(0) | v_W0_YRGB_R_SHIFT_SWAP(0) | v_W0_565_RB_SWAP(0) | v_W0_YRGB_M8_SWAP(0) | v_W0_CBR_8_SWAP(0) ); - break; - } - - LcdWrReg(inf, REG_CFG_DONE, 0x01); - - return 0; - -} - -static int win0_pan( struct fb_info *info ) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - // struct fb_var_screeninfo *var0 = &info->var; - struct fb_fix_screeninfo *fix0 = &info->fix; - struct win0_par *par = info->par; - u32 y_addr=0, uv_addr=0; - - fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); - - CHK_SUSPEND(inf); - - y_addr = fix0->smem_start + par->y_offset;//y_offset; - uv_addr = fix0->mmio_start + par->c_offset ;//c_offset; - - LcdWrReg(inf, WIN0_YRGB_MST, y_addr); - LcdWrReg(inf, WIN0_CBR_MST, uv_addr); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - - // enable win0 after the win0 addr is seted - LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE((1==par->addr_seted)?(1):(0))); - mcu_refresh(inf); - - return 0; -} - -static int win1_blank(int blank_mode, struct fb_info *info) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - - fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - - CHK_SUSPEND(inf); - - switch(blank_mode) - { - case FB_BLANK_UNBLANK: - LcdMskReg(inf, SYS_CONFIG, m_W1_ENABLE, v_W1_ENABLE(1)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - break; - case FB_BLANK_NORMAL: - LcdMskReg(inf, SYS_CONFIG, m_W1_ENABLE, v_W1_ENABLE(0)); - break; - default: - LcdMskReg(inf, SYS_CONFIG, m_W1_ENABLE, v_W1_ENABLE(0)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - break; - } - - - mcu_refresh(inf); - return 0; -} - - -#ifdef CONFIG_CLOSE_WIN1_DYNAMIC -static void win1_check_work_func(struct work_struct *work) -{ - struct rk29fb_inf *inf = platform_get_drvdata(g_pdev); - struct fb_info *fb0_inf = inf->fb0; - struct fb_var_screeninfo *var = &fb0_inf->var; - int i=0; - int *p = NULL; - int blank_data,total_data; - int format = 0; - u16 xres_virtual = fb0_inf->var.xres_virtual; //virtual screen size - u16 xpos_virtual = fb0_inf->var.xoffset; //visiable offset in virtual screen - u16 ypos_virtual = fb0_inf->var.yoffset; - - int offset = 0;//(ypos_virtual*xres_virtual + xpos_virtual)*((inf->fb0_color_deepth || fb0_inf->var.bits_per_pixel==32)? 4:2)/4; - switch(var->bits_per_pixel) - { - case 16: - format = 1; - offset = (ypos_virtual*xres_virtual + xpos_virtual)*(inf->fb0_color_deepth ? 4:2); - if(ypos_virtual == 3*var->yres && inf->fb0_color_deepth) - offset -= var->yres * var->xres *2; - break; - default: - format = 0; - offset = (ypos_virtual*xres_virtual + xpos_virtual)*4; - if(ypos_virtual >= 2*var->yres) - { - format = 1; - if(ypos_virtual == 3*var->yres) - { - offset -= var->yres * var->xres *2; - } - } - break; - } - p = (u32)fb0_inf->screen_base + offset; - blank_data = (inf->fb0_color_deepth==32) ? 0xff000000 : 0; - total_data = fb0_inf->var.xres * fb0_inf->var.yres / (format+1); - - // printk("var->bits_per_pixel=%d,ypos_virtual=%d, var->yres=%d,offset=%d,total_data=%d\n",var->bits_per_pixel,ypos_virtual,var->yres,offset,total_data); - - for(i=0; i < total_data; i++) - { - if(*p++ != blank_data) - { - //printk("win1 have no 0 data in %d, total %d\n",i,total_data); - return; - } - } - - win1_blank(FB_BLANK_POWERDOWN, fb0_inf); - // printk("%s close win1!\n",__func__); -} -static DECLARE_DELAYED_WORK(rk29_win1_check_work, win1_check_work_func); -#endif -static int win1_set_par(struct fb_info *info) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct fb_fix_screeninfo *fix = &info->fix; - struct rk29fb_screen *screen = inf->cur_screen; - struct win0_par *par = info->par; - struct fb_var_screeninfo *var = &info->var; - u32 addr; - u16 xres_virtual,xpos,ypos; - u8 trspval,trspmode; - #ifdef CONFIG_CLOSE_WIN1_DYNAMIC - cancel_delayed_work_sync(&rk29_win1_check_work); - #endif - if(((screen->x_res != var->xres) || (screen->y_res != var->yres)) - #ifndef CONFIG_FB_SCALING_OSD_1080P - && !((screen->x_res>1280) && (var->bits_per_pixel == 32)) - #endif - ) - { - hdmi_set_fbscale(info); - } - #ifndef CONFIG_FB_SCALING_OSD_1080P - else if(((screen->x_res==1920) )) - { - if(hdmi_get_fbscale() < 100) - par->ypos -=screen->y_res * (100-hdmi_get_fbscale()) / 200; - } - #endif - //u32 offset=0, addr=0, map_size=0, smem_len=0; - addr=0; - xres_virtual = 0; //virtual screen size - - //u16 xpos_virtual = var->xoffset; //visiable offset in virtual screen - //u16 ypos_virtual = var->yoffset; - - xpos = par->xpos; //visiable offset in panel - ypos = par->ypos; - - trspmode = TRSP_CLOSE; - trspval = 0; - - fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); - - #ifdef CONFIG_FB_SCALING_OSD - if(((screen->x_res != var->xres) || (screen->y_res != var->yres)) - #ifndef CONFIG_FB_SCALING_OSD_1080P - && (screen->x_res<=1280) - #endif - ) - { - addr = fix->mmio_start + par->y_offset* hdmi_get_fbscale()/100; - xres_virtual = screen->x_res* hdmi_get_fbscale()/100; //virtual screen size - } - else - #endif - { - addr = fix->smem_start + par->y_offset; - xres_virtual = var->xres_virtual; //virtual screen size - } - LcdMskReg(inf, SYS_CONFIG, m_W1_ENABLE|m_W1_FORMAT, v_W1_ENABLE(fb1_open_init?0:1)|v_W1_FORMAT(par->format)); - - xpos += (screen->left_margin + screen->hsync_len); - ypos += (screen->upper_margin + screen->vsync_len); - - LcdWrReg(inf, WIN1_YRGB_MST, addr); - - LcdMskReg(inf, WIN1_DSP_ST, m_BIT11LO|m_BIT11HI, v_BIT11LO(xpos) | v_BIT11HI(ypos)); - LcdMskReg(inf, WIN1_DSP_INFO, m_BIT12LO|m_BIT12HI, v_BIT12LO(par->xsize) | v_BIT12HI(par->ysize)); - - LcdMskReg(inf, WIN1_VIR, m_WORDLO , v_WORDLO(xres_virtual)); - - LcdMskReg(inf, BLEND_CTRL, m_W1_BLEND_EN | m_W1_BLEND_FACTOR, - v_W1_BLEND_EN((TRSP_FMREG==trspmode) || (TRSP_MASK==trspmode)) | v_W1_BLEND_FACTOR(trspval)); - - // enable win1 color key and set the color to black(rgb=0) - LcdMskReg(inf, WIN1_COLOR_KEY_CTRL, m_COLORKEY_EN | m_KEYCOLOR, v_COLORKEY_EN(1) | v_KEYCOLOR(0)); - - if(1==par->format) //rgb565 - { - LcdMskReg(inf, SWAP_CTRL, m_W1_8_SWAP | m_W1_16_SWAP | m_W1_R_SHIFT_SWAP | m_W1_565_RB_SWAP, - v_W1_8_SWAP(0) | v_W1_16_SWAP(0) | v_W1_R_SHIFT_SWAP(0) | v_W1_565_RB_SWAP(0) ); - } - else - { - LcdMskReg(inf, SWAP_CTRL, m_W1_8_SWAP | m_W1_16_SWAP | m_W1_R_SHIFT_SWAP | m_W1_565_RB_SWAP, - v_W1_8_SWAP(1) | v_W1_16_SWAP(1) | v_W1_R_SHIFT_SWAP(1) | v_W1_565_RB_SWAP(0) ); - - LcdMskReg(inf, DSP_CTRL0, m_W1_TRANSP_FROM, v_W1_TRANSP_FROM(TRSP_FMRAM==trspmode) ); - } - - LcdWrReg(inf, REG_CFG_DONE, 0x01); - -#ifdef CONFIG_CLOSE_WIN1_DYNAMIC - schedule_delayed_work(&rk29_win1_check_work, msecs_to_jiffies(5000)); -#endif - - return 0; -} - -static int win1_pan( struct fb_info *info ) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct fb_fix_screeninfo *fix1 = &info->fix; - struct win0_par *par = info->par; - u32 addr = 0; - - #ifdef CONFIG_FB_SCALING_OSD - struct rk29fb_screen *screen = inf->cur_screen; - struct fb_var_screeninfo *var = &info->var; - if(((screen->x_res != var->xres) || (screen->y_res != var->yres)) - #ifndef CONFIG_FB_SCALING_OSD_1080P - && (screen->x_res<=1280) - #endif - ) - { - addr = fix1->mmio_start + par->y_offset* hdmi_get_fbscale()/100; - } - else - #endif - { - addr = fix1->smem_start + par->y_offset; - } - - //fbprintk("info->screen_base = %8x ; fix1->smem_len = %d , addr = %8x\n",(u32)info->screen_base, fix1->smem_len, addr); - - LcdWrReg(inf, WIN1_YRGB_MST, addr); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - mcu_refresh(inf); - - return 0; -} - -static int fb0_blank(int blank_mode, struct fb_info *info) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - - if(inf->video_mode == 1) - { - win1_blank(blank_mode, info); - } - else - { - win0_blank(blank_mode, info); - } - return 0; -} - -static int fb0_check_var(struct fb_var_screeninfo *var, struct fb_info *info) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct rk29fb_screen *screen = inf->cur_screen; - u16 xpos = (var->nonstd>>8) & 0xfff; - u16 ypos = (var->nonstd>>20) & 0xfff; - u16 xlcd = screen->x_res; - u16 ylcd = screen->y_res; - - //fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); - - CHK_SUSPEND(inf); - - if( 0==var->xres_virtual || 0==var->yres_virtual || - 0==var->xres || 0==var->yres || var->xres<16 || - ((16!=var->bits_per_pixel)&&(32!=var->bits_per_pixel)) ) - { - printk(">>>>>> fb0_check_var fail 1!!! \n"); - printk(">>>>>> 0==%d || 0==%d ", var->xres_virtual,var->yres_virtual); - printk("0==%d || 0==%d || %d<16 || ", var->xres,var->yres,var->xres<16); - printk("bits_per_pixel=%d \n", var->bits_per_pixel); - return -EINVAL; - } - - if( (var->xoffset+var->xres)>var->xres_virtual || - (var->yoffset+var->yres)>var->yres_virtual*2 ) - { - printk(">>>>>> fb0_check_var fail 2!!! \n"); - printk(">>>>>> (%d+%d)>%d || ", var->xoffset,var->xres,var->xres_virtual); - printk("(%d+%d)>%d || ", var->yoffset,var->yres,var->yres_virtual); - printk("(%d+%d)>%d || (%d+%d)>%d \n", xpos,var->xres,xlcd,ypos,var->yres,ylcd); - return -EINVAL; - } - - if(inf->fb0_color_deepth)var->bits_per_pixel=inf->fb0_color_deepth; - switch(var->bits_per_pixel) - { - case 16: // rgb565 - var->xres_virtual = (var->xres_virtual + 0x1) & (~0x1); - var->xres = (var->xres + 0x1) & (~0x1); - var->xoffset = (var->xoffset) & (~0x1); - break; - default: // rgb888 - var->bits_per_pixel = 32; - break; - } - - return 0; -} - - -static int fb0_set_par(struct fb_info *info) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct fb_var_screeninfo *var = &info->var; - struct fb_fix_screeninfo *fix = &info->fix; - struct rk29fb_screen *screen = inf->cur_screen; - struct win0_par *par = info->par; - - u32 offset=0, smem_len=0; - u16 xres_virtual = var->xres_virtual; //virtual screen size - u16 xpos_virtual = var->xoffset; //visiable offset in virtual screen - u16 ypos_virtual = var->yoffset; - -#ifdef CONFIG_FB_SCALING_OSD - struct rk29_ipp_req ipp_req; - u32 dstoffset=0; - memset(&ipp_req, 0, sizeof(struct rk29_ipp_req)); -#endif - - fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); - wait_event_interruptible(fb0_wait_queue, idle_condition); - idle_condition = 0; - - inf->setFlag = 0; - CHK_SUSPEND(inf); - - if(inf->fb0_color_deepth)var->bits_per_pixel=inf->fb0_color_deepth; - #if !defined(CONFIG_FB_SCALING_OSD) - if((inf->video_mode == 1)&&(screen->y_res < var->yres))ypos_virtual += (var->yres-screen->y_res); - #endif - - switch(var->bits_per_pixel) - { - case 16: // rgb565 - par->format = 1; - if( ypos_virtual == 0) - fb0_first_buff_bits = 16; - else - fb0_second_buff_bits = 16; - - //fix->line_length = 2 * xres_virtual; - fix->line_length = (inf->fb0_color_deepth ? 4:2) * xres_virtual; //32bit and 16bit change - - #ifdef CONFIG_FB_SCALING_OSD - dstoffset = ((ypos_virtual*screen->y_res/var->yres) *screen->x_res + (xpos_virtual*screen->x_res)/var->xres )*2; - ipp_req.src0.fmt = IPP_RGB_565; - ipp_req.dst0.fmt = IPP_RGB_565; - #endif - offset = (ypos_virtual*xres_virtual + xpos_virtual)*(inf->fb0_color_deepth ? 4:2); - if(ypos_virtual == 3*var->yres && inf->fb0_color_deepth) - offset -= var->yres * var->xres *2; - break; - case 32: // rgb888 - default: - par->format = 0; - if( ypos_virtual == 0) - fb0_first_buff_bits = 32; - else - fb0_second_buff_bits = 32; - fix->line_length = 4 * xres_virtual; - #ifdef CONFIG_FB_SCALING_OSD - dstoffset = ((ypos_virtual*screen->y_res/var->yres) *screen->x_res + (xpos_virtual*screen->x_res)/var->xres )*4; - - ipp_req.src0.fmt = IPP_XRGB_8888; - ipp_req.dst0.fmt = IPP_XRGB_8888; - #endif - offset = (ypos_virtual*xres_virtual + xpos_virtual)*4; - - if(ypos_virtual >= 2*var->yres) - { - par->format = 1; - #ifdef CONFIG_FB_SCALING_OSD - dstoffset = (((ypos_virtual-2*var->yres)*screen->y_res/var->yres) *screen->x_res + (xpos_virtual*screen->x_res)/var->xres )*4; - ipp_req.src0.fmt = IPP_RGB_565; - ipp_req.dst0.fmt = IPP_RGB_565; - #endif - if(ypos_virtual == 3*var->yres) - { - offset -= var->yres * var->xres *2; - } - } - break; - } - - smem_len = fix->line_length * var->yres_virtual; - //map_size = PAGE_ALIGN(smem_len); - - if (smem_len > fix->smem_len) // buffer need realloc - { - printk("%s sorry!!! win1 buf is not enough\n",__FUNCTION__); - printk("line_length = %d, yres_virtual = %d, win1_buf only = %dB\n",fix->line_length,var->yres_virtual,fix->smem_len); - printk("you can change buf size MEM_FB_SIZE in board-xxx.c \n"); - } - - - par->addr_seted = 1; -#if ANDROID_USE_THREE_BUFS - if(0==new_frame_seted) { - wq_condition = 0; - wait_event_interruptible_timeout(wq, wq_condition, HZ/20); - } - new_frame_seted = 0; -#endif - - if(inf->video_mode == 1) - { - #ifdef CONFIG_FB_SCALING_OSD - if(((screen->x_res != var->xres) || (screen->y_res != var->yres)) - #ifndef CONFIG_FB_SCALING_OSD_1080P - && (screen->x_res<=1280) - #endif - ) - { - par->xpos = 0; - par->ypos = 0; - par->xsize = screen->x_res; - par->ysize = screen->y_res; - par->y_offset = dstoffset; - - ipp_req.src0.YrgbMst = fix->smem_start + offset; - ipp_req.src0.w = var->xres; - ipp_req.src0.h = var->yres; - - ipp_req.dst0.YrgbMst = fix->mmio_start + dstoffset* hdmi_get_fbscale()/100; - ipp_req.dst0.w = screen->x_res* hdmi_get_fbscale()/100; - ipp_req.dst0.h = screen->y_res* hdmi_get_fbscale()/100; - - ipp_req.src_vir_w = ipp_req.src0.w; - ipp_req.dst_vir_w = ipp_req.dst0.w; - ipp_req.timeout = 100; - ipp_req.flag = IPP_ROT_0; - //ipp_do_blit(&ipp_req); - ipp_blit_sync(&ipp_req); - }else - #endif - { - par->y_offset = offset; - par->xpos = (screen->x_res >= var->xres)?((screen->x_res - var->xres)/2):0; //visiable offset in panel - par->ypos = (screen->y_res >= var->yres)?(screen->y_res - var->yres):0; - par->xsize = var->xres; //visiable size in panel - par->ysize = (screen->y_res >= var->yres) ? var->yres : screen->y_res; - } - win1_set_par(info); - } - else - { - par->y_offset = offset; - par->xpos = 0; - par->ypos = 0; - par->xsize = screen->x_res; - par->ysize = screen->y_res; - win0_set_par(info); - } - inf->setFlag = 1; - idle_condition = 1; - wake_up_interruptible_sync(&fb0_wait_queue); - return 0; -} - -static int fb0_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) -{ - - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct fb_var_screeninfo *var1 = &info->var; - struct rk29fb_screen *screen = inf->cur_screen; - struct win0_par *par = info->par; - - u32 offset = 0; - u16 ypos_virtual = var->yoffset; - u16 xpos_virtual = var->xoffset; - #ifdef CONFIG_FB_SCALING_OSD - struct fb_fix_screeninfo *fix = &info->fix; - struct rk29_ipp_req ipp_req; - u32 dstoffset = 0; - memset(&ipp_req, 0, sizeof(struct rk29_ipp_req)); - #endif - //fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - - CHK_SUSPEND(inf); - - if(inf->fb0_color_deepth)var->bits_per_pixel=inf->fb0_color_deepth; - #if !defined(CONFIG_FB_SCALING_OSD) - if((inf->video_mode == 1)&&(screen->y_res < var->yres))ypos_virtual += (var->yres-screen->y_res); - #endif - - switch(var1->bits_per_pixel) - { - case 16: // rgb565 - var->xoffset = (var->xoffset) & (~0x1); - #ifdef CONFIG_FB_SCALING_OSD - dstoffset = ((ypos_virtual*screen->y_res/var->yres) *screen->x_res + (xpos_virtual*screen->x_res)/var->xres) * 2; - ipp_req.src0.fmt = IPP_RGB_565; - ipp_req.dst0.fmt = IPP_RGB_565; - #endif - offset = (ypos_virtual*var1->xres_virtual + xpos_virtual)*(inf->fb0_color_deepth ? 4:2); - if(ypos_virtual == 3*var->yres && inf->fb0_color_deepth) - offset -= var->yres * var->xres *2; - break; - case 32: // rgb888 - #ifdef CONFIG_FB_SCALING_OSD - dstoffset = ((ypos_virtual*screen->y_res/var->yres) *screen->x_res + (xpos_virtual*screen->x_res)/var->xres )*4; - ipp_req.src0.fmt = IPP_XRGB_8888; - ipp_req.dst0.fmt = IPP_XRGB_8888; - #endif - offset = (ypos_virtual*var1->xres_virtual + xpos_virtual)*4; - if(ypos_virtual >= 2*var->yres) - { - par->format = 1; - #ifdef CONFIG_FB_SCALING_OSD - dstoffset = (((ypos_virtual-2*var->yres)*screen->y_res/var->yres) *screen->x_res + (xpos_virtual*screen->x_res)/var->xres )*4; - ipp_req.src0.fmt = IPP_RGB_565; - ipp_req.dst0.fmt = IPP_RGB_565; - #endif - if(ypos_virtual == 3*var->yres) - { - offset -= var->yres * var->xres *2; - } - } - break; - default: - return -EINVAL; - } - - if(inf->video_mode == 1) - { - #ifdef CONFIG_FB_SCALING_OSD - if(((screen->x_res != var->xres) || (screen->y_res != var->yres)) - #ifndef CONFIG_FB_SCALING_OSD_1080P - && (screen->x_res<=1280) - #endif - ) - { - par->y_offset = dstoffset; - - ipp_req.src0.YrgbMst = fix->smem_start + offset; - ipp_req.src0.w = var->xres; - ipp_req.src0.h = var->yres; - - ipp_req.dst0.YrgbMst = fix->mmio_start + dstoffset* hdmi_get_fbscale()/100; - ipp_req.dst0.w = screen->x_res* hdmi_get_fbscale()/100; - ipp_req.dst0.h = screen->y_res* hdmi_get_fbscale()/100; - - ipp_req.src_vir_w = ipp_req.src0.w; - ipp_req.dst_vir_w = ipp_req.dst0.w; - ipp_req.timeout = 100; - ipp_req.flag = IPP_ROT_0; - //ipp_do_blit(&ipp_req); - ipp_blit_sync(&ipp_req); - win1_pan(info); - return 0; - }else - #endif - par->y_offset = offset; - win1_pan(info); - } - else - { - par->y_offset = offset; - win0_pan(info); - } - // flush end when wq_condition=1 in mcu panel, but not in rgb panel -#if !ANDROID_USE_THREE_BUFS - // flush end when wq_condition=1 in mcu panel, but not in rgb panel - if(SCREEN_MCU == inf->cur_screen->type) { - wait_event_interruptible_timeout(wq, wq_condition, HZ/20); - wq_condition = 0; - } else { - wq_condition = 0; - wait_event_interruptible_timeout(wq, wq_condition, HZ/20); - } -#endif - return 0; -} - -#ifdef FB_WIMO_FLAG -unsigned long temp_vv; -static int frame_num = 0; -static int wimo_set_buff(struct fb_info *info,unsigned long *temp) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - - ui_buffer = temp[0]; - ui_buffer_map = ioremap(temp[0],temp[1]); - if(ui_buffer_map == NULL) - { - printk("can't map a buffer for ui\n"); - return -EFAULT; - } - - printk("ui_buffer %x ",ui_buffer_map); - memset(&wimo_info,0,sizeof(wimo_info) ); - - wimo_info.mode = inf->video_mode; -// wimo_info.bitperpixel = var->bits_per_pixel; - - - wimo_info.dst_width = (temp[2] + 15) & 0xfff0; - wimo_info.dst_height = (temp[3] + 15) & 0xfff0; -} -static int wimo_get_buff(struct fb_info *info) -{ - - struct rk29_ipp_req overlay_req; - struct rk29_ipp_req overlay_req_1; - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - int ret; - memset(&overlay_req, 0 , sizeof(overlay_req)); - memset(&overlay_req_1, 0 , sizeof(overlay_req_1)); - - if(inf->video_mode == 0 ) - { - struct win0_par *par = info->par; - wimo_info.xpos = 0; - wimo_info.ypos = 0; - wimo_info.xsize = 0; - wimo_info.ysize = 0; - wimo_info.mode = 0; - if(par->format == 1) - wimo_info.bitperpixel = 16; - else - wimo_info.bitperpixel =32;// wimo_info.bitperpixel_fb1; - overlay_req.src0.YrgbMst = info->fix.smem_start + par->y_offset;//info->screen_base + par->y_offset;//info_buffer[8]; - overlay_req.src0.CbrMst = info->fix.smem_start + par->y_offset + wimo_info.dst_width * wimo_info.dst_height;//dst_width*dst_height;//+ par->y_offset + dst_width*dst_height;//info_buffer[9]; - overlay_req.src0.w = wimo_info.dst_width ;//dst_width;//info_buffer[2]; - overlay_req.src0.h = wimo_info.dst_height ;//dst_height;//info_buffer[3]; - overlay_req.src0.fmt = (wimo_info.bitperpixel == 16) ? 1 : 0;//3; - overlay_req.dst0.YrgbMst = ui_buffer;//overlay_buffer + info_buffer[4] + info_buffer[5] * dst_width; - overlay_req.dst0.CbrMst = ui_buffer + wimo_info.dst_width * wimo_info.dst_height;//dst_width*dst_height;//(unsigned char*) overlay_buffer + dst_width*dst_height +info_buffer[4] + ( info_buffer[5] * dst_width) / 2;// info_buffer[6] * info_buffer[7]; - overlay_req.dst0.w = wimo_info.dst_width ;//dst_width;//info_buffer[6]; - overlay_req.dst0.h = wimo_info.dst_height ;//dst_height;//info_buffer[7]; - overlay_req.dst0.fmt = (wimo_info.bitperpixel== 16) ? 1 : 0;//3;3; - overlay_req.deinterlace_enable = 0; - overlay_req.timeout = 1000000; - overlay_req.src_vir_w = wimo_info.dst_width ;//dst_width;//info_buffer[2]; - overlay_req.dst_vir_w = wimo_info.dst_width ;//dst_width; - overlay_req.flag = IPP_ROT_0; - ipp_blit_sync(&overlay_req); - - ret = 0; - } - else - { - - int err = 0; - static int wimo_time = 0; - unsigned long *overlay_buffer_map_temp; - unsigned long *map_temp; - unsigned long sign_memset = 0; - struct fb_var_screeninfo *var = &inf->fb1->var; - struct win0_par *par = inf->fb1->par; - wimo_info.mode = 1; - // printk("overlay setbuffer in\n"); - // mutex_lock(&wimo_info.fb_lock); - wimo_info.fb_lock = 1; - { - wimo_info.xaff = var->xres; - wimo_info.yaff = var->yres; - if((wimo_info.xpos != par->xpos) ||(wimo_info.ypos != par->ypos)||(wimo_info.xsize != par->xsize) ||(wimo_info.ysize != par->ysize)) - { - wimo_info.xpos = par->xpos; - wimo_info.ypos = par->ypos; - wimo_info.xsize = par->xsize; - wimo_info.ysize = par->ysize; - sign_memset = 1; - memset(ui_buffer_map,0,wimo_info.dst_height * wimo_info.dst_width);//dst_width*dst_height); - memset(ui_buffer_map + wimo_info.dst_height * wimo_info.dst_width, 0x80,wimo_info.dst_height * wimo_info.dst_width / 2);//dst_width*dst_height,0x80,dst_width*dst_height/2); - printk("wimo_info.xpos %d wimo_info.ypos %d wimo_info.xsize %d wimo_info.ysize %d\n",wimo_info.xpos, wimo_info.ypos, wimo_info.xsize, wimo_info.ysize ); - } - } - //printk("wimo_info.xpos %d wimo_info.ypos %d wimo_info.xsize %d wimo_info.ysize %d\n",wimo_info.xpos, wimo_info.ypos, wimo_info.xsize, wimo_info.ysize ); - if(wimo_info.xaff * 3 < wimo_info.xsize || wimo_info.yaff * 3 < wimo_info.ysize)// 3time or bigger scale up - { - unsigned long mid_width, mid_height; - struct rk29_ipp_req overlay_req_1; - if(wimo_info.xaff * 3 < wimo_info.xsize) - mid_width = wimo_info.xaff * 3; - else - mid_width = wimo_info.xsize; - - if(wimo_info.yaff * 3 < wimo_info.ysize) - mid_height = wimo_info.yaff * 3; - else - mid_height = wimo_info.ysize; - overlay_req.src0.YrgbMst = wimo_info.src_y;//info_buffer[8]; - overlay_req.src0.CbrMst = wimo_info.src_uv;//info_buffer[9]; - overlay_req.src0.w = wimo_info.xaff;// info_buffer[2]; - overlay_req.src0.h = wimo_info.yaff;// info_buffer[3]; - overlay_req.src0.fmt = 3; - overlay_req.dst0.YrgbMst = ui_buffer + 2048000 ;//info_buffer[4] + info_buffer[5] * dst_width; //С³ß´çƬԴÐèÒª2´Î·Å´ó£¬ËùÒÔ½«bufferµÄºó°ë¶ÎÓÃÓÚ»º´æ - overlay_req.dst0.CbrMst = (unsigned char*) ui_buffer + mid_height * mid_width + 2048000; - - overlay_req.dst0.w = mid_width;//info_buffer[6]; - overlay_req.dst0.h = mid_height;//info_buffer[7]; - overlay_req.dst0.fmt = 3; - overlay_req.timeout = 100000; - overlay_req.src_vir_w = wimo_info.xaff;//info_buffer[2]; - overlay_req.dst_vir_w = mid_width;//dst_width; - overlay_req.flag = IPP_ROT_0; - - overlay_req_1.src0.YrgbMst = ui_buffer + 2048000; - overlay_req_1.src0.CbrMst = (unsigned char*) ui_buffer + mid_height * mid_width + 2048000; - overlay_req_1.src0.w = mid_width; - overlay_req_1.src0.h = mid_height;// info_buffer[3]; - overlay_req_1.src0.fmt = 3; - overlay_req_1.dst0.YrgbMst = ui_buffer + ((wimo_info.xpos + 1)&0xfffe) + wimo_info.ypos * wimo_info.dst_width;//info_buffer[4] + info_buffer[5] * dst_width; - overlay_req_1.dst0.CbrMst =(unsigned char*) ui_buffer + wimo_info.dst_width * wimo_info.dst_height + ((wimo_info.xpos + 1)&0xfffe) + ( wimo_info.ypos / 2)* wimo_info.dst_width ; - - overlay_req_1.dst0.w = wimo_info.xsize;//info_buffer[6]; - overlay_req_1.dst0.h = wimo_info.ysize;//info_buffer[7]; - overlay_req_1.dst0.fmt = 3; - overlay_req_1.timeout = 100000; - overlay_req_1.src_vir_w = mid_width;//info_buffer[2]; - overlay_req_1.dst_vir_w = wimo_info.dst_width;//dst_width; - overlay_req_1.flag = IPP_ROT_0; - - - err = ipp_blit_sync(&overlay_req); - dmac_flush_range(ui_buffer_map,ui_buffer_map + wimo_info.dst_height * wimo_info.dst_width * 3/2);//dst_width*dst_height*3/2); - err = ipp_blit_sync(&overlay_req_1); - - } - else - { - overlay_req.src0.YrgbMst = wimo_info.src_y;//info_buffer[8]; - overlay_req.src0.CbrMst = wimo_info.src_uv;//info_buffer[9]; - overlay_req.src0.w = wimo_info.xaff;// info_buffer[2]; - overlay_req.src0.h = wimo_info.yaff;// info_buffer[3]; - overlay_req.src0.fmt = 3; - overlay_req.dst0.YrgbMst = ui_buffer + ((wimo_info.xpos + 1)&0xfffe) + wimo_info.ypos * wimo_info.dst_width;//info_buffer[4] + info_buffer[5] * dst_width; - overlay_req.dst0.CbrMst =(unsigned char*) ui_buffer + wimo_info.dst_width * wimo_info.dst_height + ((wimo_info.xpos + 1)&0xfffe) + ( wimo_info.ypos / 2)* wimo_info.dst_width ; - - overlay_req.dst0.w = wimo_info.xsize;//wimo_info.xsize;//wimo_info.xaff;// wimo_info.xsize;//info_buffer[6]; - overlay_req.dst0.h = (wimo_info.ysize + 1) & 0xfffe;//(wimo_info.ysize + 1) & 0xfffe;//wimo_info.yaff;//(wimo_info.ysize + 1) & 0xfffe;//info_buffer[7]; - overlay_req.dst0.fmt = 3; - overlay_req.timeout = 100000; - overlay_req.src_vir_w = wimo_info.xaff;//info_buffer[2]; - overlay_req.dst_vir_w = wimo_info.dst_width;//wimo_info.dst_width;//wimo_info.yaff;//wimo_info.dst_width;//dst_width; - overlay_req.flag = IPP_ROT_0; - - dmac_flush_range(ui_buffer_map,ui_buffer_map + wimo_info.dst_height * wimo_info.dst_width * 3/2);//dst_width*dst_height*3/2); - err = ipp_blit_sync(&overlay_req); - - } - // printk("overlay setbuffer exit\n"); - ret = 1; - wimo_info.fb_lock = 0; - } - - - return ret; -} -#endif -static int fb0_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - - CHK_SUSPEND(inf); - - switch(cmd) - { - case FB0_IOCTL_STOP_TIMER_FLUSH: //stop timer flush mcu panel after android is runing - if(1==arg) - { - inf->mcu_usetimer = 0; - } - break; - case FBIOPUT_16OR32: - - inf->fb0_color_deepth = arg; - - break; - case FBIOGET_16OR32: - return inf->fb0_color_deepth; - case FBIOGET_IDLEFBUff_16OR32: - if(info->var.yoffset == 0) - { - return fb0_second_buff_bits; - } - else - { - return fb0_first_buff_bits; - } - case FBIOSET_COMPOSE_LAYER_COUNTS: - fb_compose_layer_count = arg; - break; - - case FBIOGET_COMPOSE_LAYER_COUNTS: - - return fb_compose_layer_count; - - case FBIOPUT_FBPHYADD: - return info->fix.smem_start; - case FBIOGET_OVERLAY_STATE: - return inf->video_mode; - case FBIOGET_SCREEN_STATE: - return inf->cur_screen->type; - - case FBIOPUT_SET_CURSOR_EN: - { - int en; - if(copy_from_user(&en, (void*)arg, sizeof(int))) - return -EFAULT; - rk29_set_cursor_en(inf, en); - } - break; - case FBIOPUT_SET_CURSOR_POS: - { - struct fbcurpos pos; - if(copy_from_user(&pos, (void*)arg, sizeof(struct fbcurpos))) - return -EFAULT; - rk29_set_cursor_pos(inf, pos.x , pos.y); - } - break; - case FBIOPUT_SET_CURSOR_IMG: - { - char cursor_buf[CURSOR_BUF_SIZE]; - if(copy_from_user(cursor_buf, (void*)arg, CURSOR_BUF_SIZE)) - return -EFAULT; - rk29_set_cursor_img(inf, cursor_buf); - } - break; - case FBIOPUT_SET_CURSOR_CMAP: - { - struct fb_image img; - if(copy_from_user(&img, (void*)arg, sizeof(struct fb_image))) - return -EFAULT; - rk29_set_cursor_colour_map(inf, img.bg_color, img.fg_color); - } - break; - case FBIOPUT_GET_CURSOR_RESOLUTION: - { - u32 panel_size[2]; - //struct rk29fb_inf *inf = dev_get_drvdata(info->device); - if((inf->fb1->var.rotate &0x1ff ) == 270) { - panel_size[0] = inf->cur_screen->y_res; //inf->cur_screen->y_res; change for hdmi video size - panel_size[1] = inf->cur_screen->x_res; - } else { - panel_size[0] = inf->cur_screen->x_res; - panel_size[1] = inf->cur_screen->y_res; - } - if(copy_to_user((void*)arg, panel_size, 8)) return -EFAULT; - break; - } - case FBIOPUT_GET_CURSOR_EN: - { - u32 en = (inf->regbak.SYS_CONFIG & m_HWC_ENABLE); - if(copy_to_user((void*)arg, &en, 4)) return -EFAULT; - break; - } -#ifdef FB_WIMO_FLAG - case FB0_IOCTL_SET_BUF: - { - unsigned long temp[4]; - copy_from_user(temp, (void*)arg, 20); - wimo_set_buff( info,temp); - - } - break; - case FB0_IOCTL_CLOSE_BUF: - { - if(ui_buffer != NULL && ui_buffer_map !=NULL ) - { - iounmap(ui_buffer_map); - ui_buffer_map = 0; - ui_buffer = 0; - memset(&wimo_info,0,sizeof(wimo_info)); - } - else - printk("somethint wrong with wimo in close"); - - } - break; - - case FB0_IOCTL_COPY_CURBUF: - { - unsigned long temp_data[3]; - copy_from_user(&temp_vv, (void*)arg, 4); - if(ui_buffer != NULL && ui_buffer_map !=NULL ) - { - temp_data[1] = wimo_get_buff(info); - temp_data[0] = wimo_info.bitperpixel; - - } - else - { - temp_data[1] = 1; - temp_data[0] = wimo_info.bitperpixel; - printk("somethint wrong with wimo in getbuf"); - } - temp_data[2] = frame_num++; - //printk("FB0_IOCTL_COPY_CURBUF %d %d %d\n",temp_data[0],temp_data[1],temp_data[2]); - copy_to_user((void*)arg, &temp_data, 12); - break; - } -#endif - default: - break; - } - return 0; -} - -static int fb1_blank(int blank_mode, struct fb_info *info) -{ - win0_blank(blank_mode, info); - return 0; -} - -static int fb1_check_var(struct fb_var_screeninfo *var, struct fb_info *info) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct rk29fb_screen *screen = inf->cur_screen; - - u32 ScaleYRGBY=0x1000; - u16 xpos = (var->nonstd>>8) & 0xfff; //offset in panel - u16 ypos = (var->nonstd>>20) & 0xfff; - u16 xsize = (var->grayscale>>8) & 0xfff; //visiable size in panel - u16 ysize = (var->grayscale>>20) & 0xfff; - u16 xlcd = screen->x_res; //size of panel - u16 ylcd = screen->y_res; - u16 yres = 0; -#if 0 - struct hdmi *hdmi = get_hdmi_struct(0); -#endif - - if((var->rotate & 0x1ff) == 90 ||(var->rotate &0x1ff)== 270) { - #ifdef CONFIG_FB_ROTATE_VIDEO - xlcd = screen->y_res; - ylcd = screen->x_res; - #else //CONFIG_FB_ROTATE_VIDEO - printk("LCDC not support rotate!\n"); - return -EINVAL; - #endif - } - - xpos = (xpos * screen->x_res) / inf->panel1_info.x_res; - ypos = (ypos * screen->y_res) / inf->panel1_info.y_res; - xsize = (xsize * screen->x_res) / inf->panel1_info.x_res; - ysize = (ysize * screen->y_res) / inf->panel1_info.y_res; - - fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); - - CHK_SUSPEND(inf); - - if( 0==var->xres_virtual || 0==var->yres_virtual || - 0==var->xres || 0==var->yres || var->xres<16 || - 0==xsize || 0==ysize || xsize<16 || - ((16!=var->bits_per_pixel)&&(32!=var->bits_per_pixel)) ) - { - printk(">>>>>> win0fb_check_var fail 1!!! \n"); - printk("0==%d || 0==%d || 0==%d || 0==%d || %d<16 \n ||0==%d || 0==%d || %d<16 ||((16!=%d)&&(32!=%d)) \n", - var->xres_virtual, var->yres_virtual, var->xres, var->yres, var->xres, xsize, ysize, xsize, - var->bits_per_pixel, var->bits_per_pixel); - return -EINVAL; - } - - if( (var->xoffset+var->xres)>var->xres_virtual || - (var->yoffset+var->yres)>var->yres_virtual || - (xpos+xsize)>xlcd || (ypos+ysize)>ylcd ) - { - printk(">>>>>> win0fb_check_var fail 2!!! \n"); - printk("(%d+%d)>%d || (%d+%d)>%d || (%d+%d)>%d || (%d+%d)>%d \n ", - var->xoffset, var->xres, var->xres_virtual, var->yoffset, var->yres, - var->yres_virtual, xpos, xsize, xlcd, ypos, ysize, ylcd); - return -EINVAL; - } - - switch(var->nonstd&0x0f) - { - case 0: // rgb - switch(var->bits_per_pixel) - { - case 16: // rgb565 - var->xres_virtual = (var->xres_virtual + 0x1) & (~0x1); - var->xres = (var->xres + 0x1) & (~0x1); - var->xoffset = (var->xoffset) & (~0x1); - break; - default: // rgb888 - var->bits_per_pixel = 32; - break; - } - var->nonstd &= ~0xc0; //not support I2P in this format - break; - case 1: // yuv422 - var->xres_virtual = (var->xres_virtual + 0x3) & (~0x3); - var->xres = (var->xres + 0x3) & (~0x3); - var->xoffset = (var->xoffset) & (~0x3); - break; - case 2: // yuv4200 - var->xres_virtual = (var->xres_virtual + 0x3) & (~0x3); - var->yres_virtual = (var->yres_virtual + 0x1) & (~0x1); - var->xres = (var->xres + 0x3) & (~0x3); - var->yres = (var->yres + 0x1) & (~0x1); - var->xoffset = (var->xoffset) & (~0x3); - var->yoffset = (var->yoffset) & (~0x1); - break; - case 3: // yuv4201 - var->xres_virtual = (var->xres_virtual + 0x3) & (~0x3); - var->yres_virtual = (var->yres_virtual + 0x1) & (~0x1); - var->xres = (var->xres + 0x3) & (~0x3); - var->yres = (var->yres + 0x1) & (~0x1); - var->xoffset = (var->xoffset) & (~0x3); - var->yoffset = (var->yoffset) & (~0x1); - var->nonstd &= ~0xc0; //not support I2P in this format - break; - case 4: // none - case 5: // yuv444 - var->xres_virtual = (var->xres_virtual + 0x3) & (~0x3); - var->xres = (var->xres + 0x3) & (~0x3); - var->xoffset = (var->xoffset) & (~0x3); - var->nonstd &= ~0xc0; //not support I2P in this format - break; - default: - printk(">>>>>> fb1 var->nonstd=%d is invalid! \n", var->nonstd); - return -EINVAL; - } - - if((var->rotate & 0x1ff ) == 90 ||(var->rotate & 0x1ff ) == 270) - { - yres = var->xres; - } - else - { - yres = var->yres; - } - - ScaleYRGBY = CalScaleW0(yres, ysize); - - if((ScaleYRGBY>0x8000) || (ScaleYRGBY<0x200)) - { - return -EINVAL; // multiple of scale down or scale up can't exceed 8 - } -#if 0 - if(inf->video_mode == 1) { - if(hdmi_resolution_changed(hdmi,var->xres,var->yres, 1) == 1) - { - LcdMskReg(inf, DSP_CTRL1, m_BLACK_MODE, v_BLACK_MODE(1)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - init_completion(&hdmi->complete); - hdmi->wait = 1; - wait_for_completion_interruptible_timeout(&hdmi->complete, - msecs_to_jiffies(10000)); - } - } -#endif - return 0; -} - -static int fb1_set_par(struct fb_info *info) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct rk29fb_screen *screen = inf->cur_screen; - struct fb_var_screeninfo *var = &info->var; - struct fb_fix_screeninfo *fix = &info->fix; - struct win0_par *par = info->par; - - u8 format = 0; - u32 cblen=0, crlen=0, map_size=0, smem_len=0; - - //u32 xact = var->xres; /* visible resolution */ - //u32 yact = var->yres; - u32 xvir = var->xres_virtual; /* virtual resolution */ - u32 yvir = var->yres_virtual; - u32 xact_st = var->xoffset; /* offset from virtual to visible */ - u32 yact_st = var->yoffset; /* resolution */ - - u16 xpos = (var->nonstd>>8) & 0xfff; //visiable pos in panel - u16 ypos = (var->nonstd>>20) & 0xfff; - u16 xsize = (var->grayscale>>8) & 0xfff; //visiable size in panel - u16 ysize = (var->grayscale>>20) & 0xfff; - - //u32 ScaleYrgbX=0x1000,ScaleYrgbY=0x1000; - //u32 ScaleCbrX=0x1000, ScaleCbrY=0x1000; - - u8 data_format = var->nonstd&0x0f; - // u32 win0_en = var->reserved[2]; - // u32 y_addr = var->reserved[3]; //user alloc buf addr y - // u32 uv_addr = var->reserved[4]; - - fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); - CHK_SUSPEND(inf); - if((var->rotate & 0x1ff ) == 90 || (var->rotate & 0x1ff ) == 270) - { - #ifdef CONFIG_FB_ROTATE_VIDEO - xpos = (var->nonstd>>20) & 0xfff; //visiable pos in panel - ypos = (var->nonstd>>8) & 0xfff; - xsize = (var->grayscale>>20) & 0xfff; //visiable size in panel - ysize = (var->grayscale>>8) & 0xfff; - #else //CONFIG_FB_ROTATE_VIDEO - printk("LCDC not support rotate!\n"); - return -EINVAL; - #endif - } else{ - xpos = (xpos * screen->x_res) / inf->panel1_info.x_res; - ypos = (ypos * screen->y_res) / inf->panel1_info.y_res; - xsize = (xsize * screen->x_res) / inf->panel1_info.x_res; - ysize = (ysize * screen->y_res) / inf->panel1_info.y_res; - } - /* calculate y_offset,c_offset,line_length,cblen and crlen */ - switch (data_format) - { - case 0: // rgb - switch(var->bits_per_pixel) - { - case 16: // rgb565 - format = 1; - fix->line_length = 2 * xvir; - par->y_offset = (yact_st*xvir + xact_st)*2; - break; - case 32: // rgb888 - format = 0; - fix->line_length = 4 * xvir; - par->y_offset = (yact_st*xvir + xact_st)*4; - break; - default: - return -EINVAL; - } - break; - case 1: // yuv422 - format = 2; - fix->line_length = xvir; - cblen = crlen = (xvir*yvir)/2; - par->y_offset = yact_st*xvir + xact_st; - par->c_offset = yact_st*xvir + xact_st; - break; - case 2: // yuv4200 - format = 3; - fix->line_length = xvir; - cblen = crlen = (xvir*yvir)/4; - - par->y_offset = yact_st*xvir + xact_st; - par->c_offset = (yact_st/2)*xvir + xact_st; - - break; - case 3: // yuv4201 - format = 4; - fix->line_length = xvir; - par->y_offset = (yact_st/2)*2*xvir + (xact_st)*2; - par->c_offset = (yact_st/2)*xvir + xact_st; - cblen = crlen = (xvir*yvir)/4; - break; - case 4: // none - case 5: // yuv444 - format = 5; - fix->line_length = xvir; - par->y_offset = yact_st*xvir + xact_st; - par->c_offset = yact_st*2*xvir + xact_st*2; - cblen = crlen = (xvir*yvir); - break; - default: - return -EINVAL; - } - - smem_len = fix->line_length * yvir + cblen + crlen; - map_size = PAGE_ALIGN(smem_len); - - // fix->smem_start = y_addr; - fix->smem_len = smem_len; - // fix->mmio_start = uv_addr; - - // par->addr_seted = ((-1==(int)y_addr) || (0==(int)y_addr) || (win0_en==0)) ? 0 : 1; - fbprintk("buffer alloced by user fix->smem_start = %8x, fix->smem_len = %8x, fix->mmio_start = %8x \n", (u32)fix->smem_start, (u32)fix->smem_len, (u32)fix->mmio_start); - - par->format = format; - par->xpos = xpos; - par->ypos = ypos; - par->xsize = xsize; - par->ysize = ysize; - win0_set_par(info); - - if ( wq_condition2 == 0 ) { - wait_event_interruptible_timeout(wq, wq_condition2, HZ/20); - } - wq_condition2 = 0; - -#ifdef CONFIG_FB_ROTATE_VIDEO -//need refresh ,zyc add - if((has_set_rotate == true) && (last_yuv_phy[0] != 0) && (last_yuv_phy[1] != 0)) - { - u32 yuv_phy[2]; - struct rk29_ipp_req ipp_req; - static u32 dstoffset = 0; - static int fb_index = 0; - memset(&ipp_req, 0, sizeof(struct rk29_ipp_req)); - yuv_phy[0] = last_yuv_phy[0]; - yuv_phy[1] = last_yuv_phy[1]; - yuv_phy[0] += par->y_offset; - yuv_phy[1] += par->c_offset; - #if 0 - if((var->rotate == 90) ||(var->rotate == 270)) - #else - if(var->rotate%360 != 0) - #endif - { - #ifdef CONFIG_FB_ROTATE_VIDEO - dstoffset = (dstoffset+1)%2; - ipp_req.src0.fmt = 3; - ipp_req.src0.YrgbMst = yuv_phy[0]; - ipp_req.src0.CbrMst = yuv_phy[1]; - ipp_req.src0.w = var->xres; - ipp_req.src0.h = var->yres; - - ipp_req.src_vir_w= (var->xres + 15) & (~15); - ipp_req.dst_vir_w=screen->x_res; - - ipp_req.dst0.fmt = 3; - #ifdef CONFIG_FB_MIRROR_X_Y - if((var->rotate & 0x1ff)!=0 &&(var->rotate&(X_MIRROR|Y_MIRROR))!= 0 ) - { - ipp_req.dst0.YrgbMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*4; - ipp_req.dst0.CbrMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*5; - } - else - { - ipp_req.dst0.YrgbMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*2*dstoffset; - ipp_req.dst0.CbrMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*(2*dstoffset+1); - - } - if(var->xres > screen->x_res) - { - ipp_req.dst0.w = screen->x_res; - ipp_req.dst0.h = screen->y_res; - } else { - ipp_req.dst0.w = var->xres; - ipp_req.dst0.h = var->yres; - } - ipp_req.dst_vir_w = (ipp_req.dst0.w + 15) & (~15); - ipp_req.timeout = 100; - if((var->rotate & 0x1ff) == 90) - ipp_req.flag = IPP_ROT_90; - else if ((var->rotate & 0x1ff) == 180) - ipp_req.flag = IPP_ROT_180; - else if((var->rotate & 0x1ff) == 270) - ipp_req.flag = IPP_ROT_270; - else if((var->rotate & X_MIRROR) == X_MIRROR ) - ipp_req.flag = IPP_ROT_X_FLIP; - else if((var->rotate & Y_MIRROR) == Y_MIRROR) - ipp_req.flag = IPP_ROT_Y_FLIP; - //ipp_do_blit(&ipp_req); - ipp_blit_sync(&ipp_req); - yuv_phy[0] = ipp_req.dst0.YrgbMst; - yuv_phy[1] = ipp_req.dst0.CbrMst; - if((var->rotate & 0x1ff)!=0 &&(var->rotate&(X_MIRROR|Y_MIRROR))!= 0 ) - { - memset(&ipp_req,0,sizeof(struct rk29_ipp_req)); - - if((var->rotate & X_MIRROR) == X_MIRROR) - ipp_req.flag = IPP_ROT_X_FLIP; - else if((var->rotate & Y_MIRROR) == Y_MIRROR) - ipp_req.flag = IPP_ROT_Y_FLIP; - else - printk(">>>>>> %d rotate is not support!\n",var->rotate); - - if(var->xres > screen->x_res) - { - ipp_req.dst0.w = screen->x_res; - ipp_req.dst0.h = screen->y_res; - } else { - ipp_req.dst0.w = var->xres; - ipp_req.dst0.h = var->yres; - } - ipp_req.src0.fmt = 3; - ipp_req.src0.YrgbMst = yuv_phy[0]; - ipp_req.src0.CbrMst = yuv_phy[1]; - ipp_req.src0.w = ipp_req.dst0.w; - ipp_req.src0.h = ipp_req.dst0.h; - - ipp_req.src_vir_w= (ipp_req.dst0.w + 15) & (~15); - ipp_req.dst_vir_w= (ipp_req.dst0.w + 15) & (~15); - - ipp_req.dst0.fmt = 3; - ipp_req.dst0.YrgbMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*2*dstoffset; - ipp_req.dst0.CbrMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*(2*dstoffset+1); - - ipp_req.timeout = 100; - ipp_blit_sync(&ipp_req); - yuv_phy[0] = ipp_req.dst0.YrgbMst; - yuv_phy[1] = ipp_req.dst0.CbrMst; - } - fbprintk("yaddr=0x%x,uvaddr=0x%x\n",ipp_req.dst0.YrgbMst,ipp_req.dst0.CbrMst); - #else - ipp_req.dst0.YrgbMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*2*dstoffset; - ipp_req.dst0.CbrMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*(2*dstoffset+1); - if(var->xres > screen->x_res) - { - ipp_req.dst0.w = screen->x_res; - ipp_req.dst0.h = screen->y_res; - } else { - ipp_req.dst0.w = var->xres; - ipp_req.dst0.h = var->yres; - - } - ipp_req.dst_vir_w = (ipp_req.dst0.w + 15) & (~15); - ipp_req.timeout = 100; - if(var->rotate == 90) - ipp_req.flag = IPP_ROT_90; - else if(var->rotate == 180) - ipp_req.flag = IPP_ROT_180; - else if(var->rotate == 270) - ipp_req.flag = IPP_ROT_270; - //ipp_do_blit(&ipp_req); - ipp_blit_sync(&ipp_req); - - fbprintk("yaddr=0x%x,uvaddr=0x%x\n",ipp_req.dst0.YrgbMst,ipp_req.dst0.CbrMst); - yuv_phy[0] = ipp_req.dst0.YrgbMst; - yuv_phy[1] = ipp_req.dst0.CbrMst; - #endif - fix->smem_start = yuv_phy[0]; - fix->mmio_start = yuv_phy[1]; - #else //CONFIG_FB_ROTATE_VIDEO - printk("LCDC not support rotate!\n"); - #endif - } - else - { - - fix->smem_start = yuv_phy[0]; - fix->mmio_start = yuv_phy[1]; - } - - LcdWrReg(inf, WIN0_YRGB_MST, yuv_phy[0]); - LcdWrReg(inf, WIN0_CBR_MST, yuv_phy[1]); - // enable win0 after the win0 par is seted - LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(par->par_seted && par->addr_seted)); - par->addr_seted = 1; - LcdWrReg(inf, REG_CFG_DONE, 0x01); - if(par->addr_seted ) { - unsigned long flags; - - local_irq_save(flags); - par->mirror.y_offset = yuv_phy[0]; - par->mirror.c_offset = yuv_phy[1]; - local_irq_restore(flags); - - mcu_refresh(inf); - //printk("0x%.8x 0x%.8x mirror\n", par->mirror.y_offset, par->mirror.c_offset); - } - - } - - has_set_rotate = false; -#endif - return 0; -} - -static int fb1_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) -{ - struct win0_par *par = info->par; - // enable win0 after the win0 addr is seted - - win0_pan(info); - par->par_seted = 1; - return 0; -} - -int fb1_open(struct fb_info *info, int user) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct win0_par *par = info->par; - struct rk29fb_screen *screen = inf->cur_screen; - - fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - - par->par_seted = 0; - par->addr_seted = 0; - inf->video_mode = 1; - wq_condition2 = 1; -#ifdef CONFIG_FB_ROTATE_VIDEO - //reinitialize the var when open,zyc - last_yuv_phy[0] = 0; - last_yuv_phy[1] = 0; - has_set_rotate = 0; -#endif - if(par->refcount) { - printk(">>>>>> fb1 has opened! \n"); - return -EACCES; - } else { - par->refcount++; - win0_blank(FB_BLANK_NORMAL, info); - if(screen->x_res>1280) - fb1_open_init=1; - fb0_set_par(inf->fb0); - fb1_open_init=0; - rk29fb_notify(inf, RK29FB_EVENT_FB1_ON); - return 0; - } -} - -int fb1_release(struct fb_info *info, int user) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct win0_par *par = info->par; - struct fb_var_screeninfo *var0 = &info->var; - - fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - if(inf->setFlag == 0) - { - wait_event_interruptible_timeout(wq, inf->setFlag, HZ*10); - } - if(par->refcount) { - par->refcount--; - inf->video_mode = 0; - par->par_seted = 0; - par->addr_seted = 0; - win1_blank(FB_BLANK_NORMAL, info); - - //if(inf->cur_screen->type != SCREEN_HDMI) - fb0_set_par(inf->fb0); - - // unmap memory - info->screen_base = 0; - info->fix.smem_start = 0; - info->fix.smem_len = 0; - // clean the var param - memset(var0, 0, sizeof(struct fb_var_screeninfo)); - rk29fb_notify(inf, RK29FB_EVENT_FB1_OFF); - #ifdef CONFIG_CLOSE_WIN1_DYNAMIC - cancel_delayed_work_sync(&rk29_win1_check_work); - #endif - } - - return 0; -} - -static int fb1_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) -{ - struct rk29fb_inf *inf = dev_get_drvdata(info->device); - struct win0_par *par = info->par; - struct fb_fix_screeninfo *fix0 = &info->fix; - struct fb_var_screeninfo *var = &info->var; - void __user *argp = (void __user *)arg; - -#ifdef CONFIG_FB_ROTATE_VIDEO - struct rk29fb_screen *screen = inf->cur_screen; - struct rk29_ipp_req ipp_req; - static u32 dstoffset = 0; - memset(&ipp_req, 0, sizeof(struct rk29_ipp_req)); -#endif - - fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - fbprintk("win0fb_ioctl cmd = %8x, arg = %8x \n", (u32)cmd, (u32)arg); - - CHK_SUSPEND(inf); - - switch(cmd) - { - case FB1_IOCTL_GET_PANEL_SIZE: //get panel size - { - u32 panel_size[2]; - if((var->rotate & 0x1ff) == 270 ||(var->rotate & 0x1ff) == 90) { - panel_size[0] = inf->panel1_info.y_res; //inf->cur_screen->y_res; change for hdmi video size - panel_size[1] = inf->panel1_info.x_res; - } else { - panel_size[0] = inf->panel1_info.x_res; - panel_size[1] = inf->panel1_info.y_res; - } - - if(copy_to_user(argp, panel_size, 8)) return -EFAULT; - } - break; - - case FB1_IOCTL_SET_YUV_ADDR: //set y&uv address to register direct - { - u32 yuv_phy[2]; -#ifdef FB_WIMO_FLAG - // printk("FB1_IOCTL_SET_YUV_ADDR1 \n"); - // while(wimo_info.fb_lock) - // { - // msleep(10); - // } - // printk("FB1_IOCTL_SET_YUV_ADDR 2\n"); -#endif - if (copy_from_user(yuv_phy, argp, 8)) - return -EFAULT; -#ifdef CONFIG_FB_ROTATE_VIDEO - //add by zyc - if(has_set_rotate == true) - break; - last_yuv_phy[0] = yuv_phy[0]; - last_yuv_phy[1] = yuv_phy[1]; -#endif - - fix0->smem_start = yuv_phy[0]; - fix0->mmio_start = yuv_phy[1]; - yuv_phy[0] += par->y_offset; - yuv_phy[1] += par->c_offset; -#ifdef FB_WIMO_FLAG - wimo_info.src_y = yuv_phy[0]; - wimo_info.src_uv = yuv_phy[1]; - -#endif - - #if 0 - if((var->rotate == 90) ||(var->rotate == 270)) - #else - if(var->rotate%360 != 0) - #endif - { - #ifdef CONFIG_FB_ROTATE_VIDEO - dstoffset = (dstoffset+1)%2; - ipp_req.src0.fmt = 3; - ipp_req.src0.YrgbMst = yuv_phy[0]; - ipp_req.src0.CbrMst = yuv_phy[1]; - ipp_req.src0.w = var->xres ; - ipp_req.src0.h = var->yres ; - ipp_req.src_vir_w= (var->xres + 15) & (~15); - ipp_req.dst_vir_w=screen->x_res; - - ipp_req.dst0.fmt = 3; - #ifdef CONFIG_FB_MIRROR_X_Y - if((var->rotate & 0x1ff)!=0 &&(var->rotate&(X_MIRROR|Y_MIRROR))!= 0 ) - { - ipp_req.dst0.YrgbMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*4; - ipp_req.dst0.CbrMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*5; - } - else - { - ipp_req.dst0.YrgbMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*2*dstoffset; - ipp_req.dst0.CbrMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*(2*dstoffset+1); - - } - if(var->xres > screen->x_res) - { - ipp_req.dst0.w = screen->x_res; - ipp_req.dst0.h = screen->y_res; - } else { - ipp_req.dst0.w = var->xres; - ipp_req.dst0.h = var->yres; - } - ipp_req.dst_vir_w = (ipp_req.dst0.w + 15) & (~15); - ipp_req.timeout = 100; - if((var->rotate & 0x1ff) == 90) - ipp_req.flag = IPP_ROT_90; - else if ((var->rotate & 0x1ff) == 180) - ipp_req.flag = IPP_ROT_180; - else if((var->rotate & 0x1ff) == 270) - ipp_req.flag = IPP_ROT_270; - else if((var->rotate & X_MIRROR) == X_MIRROR ) - ipp_req.flag = IPP_ROT_X_FLIP; - else if((var->rotate & Y_MIRROR) == Y_MIRROR) - ipp_req.flag = IPP_ROT_Y_FLIP; - //ipp_do_blit(&ipp_req); - ipp_blit_sync(&ipp_req); - yuv_phy[0] = ipp_req.dst0.YrgbMst; - yuv_phy[1] = ipp_req.dst0.CbrMst; - if((var->rotate & 0x1ff)!=0 &&(var->rotate&(X_MIRROR|Y_MIRROR))!= 0 ) - { - memset(&ipp_req,0,sizeof(struct rk29_ipp_req)); - - if((var->rotate & X_MIRROR) == X_MIRROR) - ipp_req.flag = IPP_ROT_X_FLIP; - else if((var->rotate & Y_MIRROR) == Y_MIRROR) - ipp_req.flag = IPP_ROT_Y_FLIP; - else - printk(">>>>>> %d rotate is not support!\n",var->rotate); - - if(var->xres > screen->x_res) - { - ipp_req.dst0.w = screen->x_res; - ipp_req.dst0.h = screen->y_res; - } else { - ipp_req.dst0.w = var->xres; - ipp_req.dst0.h = var->yres; - } - ipp_req.src0.fmt = 3; - ipp_req.src0.YrgbMst = yuv_phy[0]; - ipp_req.src0.CbrMst = yuv_phy[1]; - ipp_req.src0.w = ipp_req.dst0.w; - ipp_req.src0.h = ipp_req.dst0.h; - - ipp_req.src_vir_w= (ipp_req.dst0.w + 15) & (~15); - ipp_req.dst_vir_w= (ipp_req.dst0.w + 15) & (~15); - - ipp_req.dst0.fmt = 3; - ipp_req.dst0.YrgbMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*2*dstoffset; - ipp_req.dst0.CbrMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*(2*dstoffset+1); - - ipp_req.timeout = 100; - ipp_blit_sync(&ipp_req); - yuv_phy[0] = ipp_req.dst0.YrgbMst; - yuv_phy[1] = ipp_req.dst0.CbrMst; - } - fbprintk("yaddr=0x%x,uvaddr=0x%x\n",ipp_req.dst0.YrgbMst,ipp_req.dst0.CbrMst); - #else - ipp_req.dst0.YrgbMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*2*dstoffset; - ipp_req.dst0.CbrMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*(2*dstoffset+1); - if(var->xres > screen->x_res) - { - ipp_req.dst0.w = screen->x_res; - ipp_req.dst0.h = screen->y_res; - } else { - ipp_req.dst0.w = var->xres; - ipp_req.dst0.h = var->yres; - - } - ipp_req.dst_vir_w = (ipp_req.dst0.w + 15) & (~15); - ipp_req.timeout = 100; - if(var->rotate == 90) - ipp_req.flag = IPP_ROT_90; - else if(var->rotate == 180) - ipp_req.flag = IPP_ROT_180; - else if(var->rotate == 270) - ipp_req.flag = IPP_ROT_270; - //ipp_do_blit(&ipp_req); - ipp_blit_sync(&ipp_req); - - fbprintk("yaddr=0x%x,uvaddr=0x%x\n",ipp_req.dst0.YrgbMst,ipp_req.dst0.CbrMst); - yuv_phy[0] = ipp_req.dst0.YrgbMst; - yuv_phy[1] = ipp_req.dst0.CbrMst; - #endif - fix0->smem_start = yuv_phy[0]; - fix0->mmio_start = yuv_phy[1]; - #else //CONFIG_FB_ROTATE_VIDEO - printk("LCDC not support rotate!\n"); - #endif - } - - LcdWrReg(inf, WIN0_YRGB_MST, yuv_phy[0]); - LcdWrReg(inf, WIN0_CBR_MST, yuv_phy[1]); - // enable win0 after the win0 par is seted - LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(par->par_seted && par->addr_seted)); - par->addr_seted = 1; - LcdWrReg(inf, REG_CFG_DONE, 0x01); - if(par->par_seted) { - unsigned long flags; - - local_irq_save(flags); - par->mirror.y_offset = yuv_phy[0]; - par->mirror.c_offset = yuv_phy[1]; - local_irq_restore(flags); - - mcu_refresh(inf); - //printk("0x%.8x 0x%.8x mirror\n", par->mirror.y_offset, par->mirror.c_offset); - } - } - break; - - case FB1_IOCTL_SET_ROTATE: //change MCU panel scan direction - fbprintk(">>>>>> change lcdc direction(%d) \n", (int)arg); - #ifdef CONFIG_FB_ROTATE_VIDEO - //zyc add - has_set_rotate = true; - #ifdef CONFIG_FB_MIRROR_X_Y - if( ((arg&0x1ff)%90) == 0 && ( arg&(~0xfff))==0 ) - { - if( (arg&( X_MIRROR | Y_MIRROR ) )== (X_MIRROR | Y_MIRROR) ) - var->rotate = ROTATE_180; - else if((arg&( ROTATE_90 | X_MIRROR | Y_MIRROR ) )== ( ROTATE_90 | X_MIRROR | Y_MIRROR)) - var->rotate = ROTATE_270; - else if((arg&( ROTATE_180 | X_MIRROR | Y_MIRROR ) )== ( ROTATE_180 | X_MIRROR | Y_MIRROR)) - var->rotate = ROTATE_90; - else if((arg&( ROTATE_270 | X_MIRROR | Y_MIRROR ) )== ( ROTATE_270 | X_MIRROR | Y_MIRROR)) - var->rotate = ROTATE_0; - else - #else - if(arg == ROTATE_0 || arg==ROTATE_90 || arg == ROTATE_180 || arg==ROTATE_270) - { - #endif - var->rotate = arg; - } - else - printk(">>>>>> %d rotate is not support!\n",(int)arg); - - #else //CONFIG_FB_ROTATE_VIDEO - printk("LCDC not support rotate!\n"); - #endif - break; - case FB1_IOCTL_SET_WIN0_TOP: - fbprintk(">>>>>> FB1_IOCTL_SET_WIN0_TOP %d\n",arg); - LcdMskReg(inf, DSP_CTRL0, m_W0_ON_TOP, v_W0_ON_TOP(arg)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - break; - default: - break; - } - return 0; -} - -static struct fb_ops fb1_ops = { - .owner = THIS_MODULE, - .fb_open = fb1_open, - .fb_release = fb1_release, - .fb_check_var = fb1_check_var, - .fb_set_par = fb1_set_par, - .fb_blank = fb1_blank, - .fb_pan_display = fb1_pan_display, - .fb_ioctl = fb1_ioctl, - .fb_setcolreg = fb_setcolreg, - .fb_fillrect = cfb_fillrect, - .fb_copyarea = cfb_copyarea, - .fb_imageblit = cfb_imageblit, -}; - -static struct fb_ops fb0_ops = { - .owner = THIS_MODULE, - .fb_check_var = fb0_check_var, - .fb_set_par = fb0_set_par, - .fb_blank = fb0_blank, - .fb_pan_display = fb0_pan_display, - .fb_ioctl = fb0_ioctl, - .fb_setcolreg = fb_setcolreg, - .fb_fillrect = cfb_fillrect, - .fb_copyarea = cfb_copyarea, - .fb_imageblit = cfb_imageblit, - //.fb_cursor = rk29_set_cursor, -}; - -int fb_get_video_mode(void) -{ - struct rk29fb_inf *inf; - if(!g_pdev) - return 0; - inf = platform_get_drvdata(g_pdev); - return inf->video_mode; -} -/* -enable: 1, switch to tv or hdmi; 0, switch to lcd -*/ -int FB_Switch_Screen( struct rk29fb_screen *screen, u32 enable ) -{ - struct rk29fb_inf *inf = platform_get_drvdata(g_pdev); - // struct rk29fb_info *mach_info = g_pdev->dev.platform_data; - struct rk29fb_info *mach_info = g_pdev->dev.platform_data; - - memcpy(&inf->panel2_info, screen, sizeof( struct rk29fb_screen )); - - if(enable)inf->cur_screen = &inf->panel2_info; - else inf->cur_screen = &inf->panel1_info; - - /* Black out, because some display device need clock to standby */ - //LcdMskReg(inf, DSP_CTRL_REG1, m_BLACK_OUT, v_BLACK_OUT(1)); - // LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(0)); - // LcdMskReg(inf, SYS_CONFIG, m_W1_ENABLE, v_W1_ENABLE(0)); - LcdMskReg(inf, DSP_CTRL1, m_BLACK_MODE, v_BLACK_MODE(1)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - wake_lock(&idlelock); - msleep(20); - wake_unlock(&idlelock); - - if(inf->cur_screen->standby) inf->cur_screen->standby(1); - // operate the display_on pin to power down the lcd -#ifdef CONFIG_HDMI_DUAL_DISP - if(inf->panel1_info.sscreen_get!=NULL) - inf->panel1_info.sscreen_get(&inf->panel1_info,inf->panel2_info.hdmi_resolution); - else - printk("warnig : LCD driver do not support dual display"); - if(inf->panel1_info.sscreen_set!=NULL) - inf->panel1_info.sscreen_set(&inf->panel1_info,enable); - else - printk("warnig : LCD driver do not support dual display"); -#else - if(enable && mach_info->io_disable)mach_info->io_disable(); //close lcd out - else if (mach_info->io_enable)mach_info->io_enable(); //open lcd out -#endif - load_screen(inf->fb0, 0); - mcu_refresh(inf); - - fb1_set_par(inf->fb1); - fb0_set_par(inf->fb0); - LcdMskReg(inf, DSP_CTRL1, m_BLACK_MODE, v_BLACK_MODE(0)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - - rk29fb_notify(inf, enable ? RK29FB_EVENT_HDMI_ON : RK29FB_EVENT_HDMI_OFF); - return 0; -} - -static ssize_t dsp_win0_info_read(struct device *device, - struct device_attribute *attr, char *buf) -{ - //char * s = _buf; - struct rk29fb_inf *inf = platform_get_drvdata(g_pdev); - struct rk29fb_screen *screen = inf->cur_screen; - - u16 xpos=0,ypos=0,xsize=0,ysize=0; - - fbprintk("%s\n",__FUNCTION__); - xpos = LcdRdReg(inf, WIN0_DSP_ST) & 0xffff; - ypos = (LcdRdReg(inf, WIN0_DSP_ST)>>16) & 0xffff; - - xpos -= (screen->left_margin + screen->hsync_len); - ypos -= (screen->upper_margin + screen->vsync_len); - - xsize=LcdRdReg(inf, WIN0_DSP_INFO)& 0xffff; - ysize=(LcdRdReg(inf, WIN0_DSP_INFO)>>16) & 0xffff; - fbprintk("%s %d , %d, %d ,%d\n",__FUNCTION__,xpos,ypos,xsize,ysize); - rk29_set_cursor_test(inf->fb0); - - return snprintf(buf, PAGE_SIZE, "%d,%d,%d,%d\n", xpos,ypos,xsize,ysize); -} - -static ssize_t dsp_win0_info_write(struct device *device, - struct device_attribute *attr, const char *buf, size_t count) -{ - printk("%s\n",__FUNCTION__); - printk("%s %x \n",__FUNCTION__,*buf); - return count; -} - -static DEVICE_ATTR(dsp_win0_info, S_IRUGO|S_IWUSR, dsp_win0_info_read, dsp_win0_info_write); - -static irqreturn_t rk29fb_irq(int irq, void *dev_id) -{ - struct platform_device *pdev = (struct platform_device*)dev_id; - struct rk29fb_inf *inf = platform_get_drvdata(pdev); - struct win0_par *par = (struct win0_par *)inf->fb1->par; - if(!inf) - return IRQ_HANDLED; - - //fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - - LcdMskReg(inf, INT_STATUS, m_FRM_STARTCLEAR, v_FRM_STARTCLEAR(1)); - - if(SCREEN_MCU == inf->cur_screen->type) - { - inf->mcu_isrcnt = !inf->mcu_isrcnt; - if(inf->mcu_isrcnt) - return IRQ_HANDLED; - - if(IsMcuUseFmk()) - { - if(LcdReadBit(inf, MCU_TIMING_CTRL, m_MCU_HOLDMODE_FRAME_ST) && (inf->mcu_fmksync == 0)) - { - inf->mcu_fmksync = 1; - if(inf->cur_screen->refresh) - inf->cur_screen->refresh(REFRESH_END); - inf->mcu_fmksync = 0; - } - else - { - return IRQ_HANDLED; - } - } - else - { - if(inf->mcu_needflush) { - if(inf->cur_screen->refresh) - inf->cur_screen->refresh(REFRESH_PRE); - inf->mcu_needflush = 0; - inf->mcu_isrcnt = 0; - LcdSetRegisterBit(inf, MCU_TIMING_CTRL, m_MCU_HOLDMODE_FRAME_ST); - } else { - if(inf->cur_screen->refresh) - inf->cur_screen->refresh(REFRESH_END); - } - } - } -#if ANDROID_USE_THREE_BUFS - new_frame_seted = 1; -#endif - - if(waitqueue_active(&par->wait)) { - if (par->mirror.c_offset == 0) - printk("error: no new buffer to display\n"); - - par->done.y_offset = par->displ.y_offset; - par->done.c_offset = par->displ.c_offset; - par->displ.y_offset = par->mirror.y_offset; - par->displ.c_offset = par->mirror.c_offset; - par->mirror.y_offset = 0; - par->mirror.c_offset = 0; - - //printk("0x%.8x 0x%.8x displaying\n", par->displ.y_offset, par->displ.c_offset); - //printk("0x%.8x 0x%.8x done\n", par->done.y_offset, par->done.c_offset); - wake_up_interruptible(&par->wait); - } - - wq_condition2 = 1; - wq_condition = 1; - wake_up_interruptible(&wq); - - rk29fb_irq_notify_ddr(); - return IRQ_HANDLED; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND - -struct suspend_info { - struct early_suspend early_suspend; - struct rk29fb_inf *inf; -}; - -static void rk29fb_early_suspend(struct early_suspend *h) -{ - struct suspend_info *info = container_of(h, struct suspend_info, - early_suspend); - - struct rk29fb_inf *inf = info->inf; - struct rk29fb_info *mach_info = g_pdev->dev.platform_data; - - fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); - - if(!inf) { - printk("inf==0, rk29fb_suspend fail! \n"); - return; - } - -#ifdef CONFIG_CLOSE_WIN1_DYNAMIC - cancel_delayed_work_sync(&rk29_win1_check_work); -#endif -#ifdef CONFIG_HDMI_DUAL_DISP - if(mach_info->io_disable) // close lcd pwr when output screen is lcd - mach_info->io_disable(); //close lcd out -#else - if((inf->cur_screen != &inf->panel2_info) && mach_info->io_disable) // close lcd pwr when output screen is lcd - mach_info->io_disable(); //close lcd out -#endif - if(inf->cur_screen->standby) - { - fbprintk(">>>>>> power down the screen! \n"); - inf->cur_screen->standby(1); - } - LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE | m_W1_ENABLE, v_W0_ENABLE(0) | v_W1_ENABLE(0)); - - LcdMskReg(inf, DSP_CTRL0, m_HSYNC_POLARITY | m_VSYNC_POLARITY | m_DEN_POLARITY , - v_HSYNC_POLARITY(1) | v_VSYNC_POLARITY(1) | v_DEN_POLARITY(1) ); - - LcdMskReg(inf, DSP_CTRL1, m_BLANK_MODE , v_BLANK_MODE(1)); - LcdMskReg(inf, SYS_CONFIG, m_STANDBY, v_STANDBY(1)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - - if(!inf->in_suspend) - { - fbprintk(">>>>>> diable the lcdc clk! \n"); - wake_lock(&idlelock); - msleep(100); - wake_unlock(&idlelock); - clk_disable(inf->aclk_ddr_lcdc); - clk_disable(inf->aclk_disp_matrix); - clk_disable(inf->hclk_cpu_display); - clk_disable(inf->clk); - if (inf->dclk){ - clk_disable(inf->dclk); - } - if(inf->clk){ - clk_disable(inf->aclk); - } - //clk_disable(inf->pd_display); - - inf->in_suspend = 1; - } -} - -static void rk29fb_early_resume(struct early_suspend *h) -{ - struct suspend_info *info = container_of(h, struct suspend_info, - early_suspend); - - struct rk29fb_inf *inf = info->inf; - struct rk29fb_screen *screen = inf->cur_screen; - struct rk29fb_info *mach_info = g_pdev->dev.platform_data; - - fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); - if(!inf) { - printk("inf==0, rk29fb_resume fail! \n"); - return ; - } - - if(inf->in_suspend) - { - inf->in_suspend = 0; - fbprintk(">>>>>> enable the lcdc clk! \n"); - // clk_enable(inf->pd_display); - clk_enable(inf->aclk_disp_matrix); - clk_enable(inf->hclk_cpu_display); - clk_enable(inf->clk); - clk_enable(inf->aclk_ddr_lcdc); - - if (inf->dclk){ - clk_enable(inf->dclk); - } - if(inf->clk){ - clk_enable(inf->aclk); - } - usleep_range(100*1000, 100*1000); - } - LcdMskReg(inf, DSP_CTRL1, m_BLANK_MODE , v_BLANK_MODE(0)); - LcdMskReg(inf, SYS_CONFIG, m_STANDBY, v_STANDBY(0)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - - LcdMskReg(inf, DSP_CTRL0, m_HSYNC_POLARITY | m_VSYNC_POLARITY | m_DEN_POLARITY , - v_HSYNC_POLARITY(screen->pin_hsync) | v_VSYNC_POLARITY(screen->pin_vsync) | v_DEN_POLARITY(screen->pin_den) ); - - if(inf->cur_screen->standby) - { - fbprintk(">>>>>> power on the screen! \n"); - inf->cur_screen->standby(0); - } - usleep_range(10*1000, 10*1000); - memcpy((u8*)inf->preg, (u8*)&inf->regbak, 0xa4); //resume reg - usleep_range(40*1000, 40*1000); - #ifdef CONFIG_HDMI_DUAL_DISP - if(mach_info->io_enable) // open lcd pwr when output screen is lcd - mach_info->io_enable(); //close lcd out - #else - if((inf->cur_screen != &inf->panel2_info) && mach_info->io_enable) // open lcd pwr when output screen is lcd - mach_info->io_enable(); //close lcd out - #endif -} - -static struct suspend_info suspend_info = { - .early_suspend.suspend = rk29fb_early_suspend, - .early_suspend.resume = rk29fb_early_resume, - .early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB, -}; -#endif -struct fb_info *g_fb0_inf = NULL; //add cym@rk 20101027 for charger logo -static int __devinit rk29fb_probe (struct platform_device *pdev) -{ - struct rk29fb_inf *inf = NULL; - struct resource *res = NULL; - struct resource *mem = NULL; - struct rk29fb_info *mach_info = NULL; - struct rk29fb_screen *screen = NULL; - struct win0_par* par = NULL; - int irq = 0; - int ret = 0; - - fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); - - /* Malloc rk29fb_inf and set it to pdev for drvdata */ - fbprintk(">> Malloc rk29fb_inf and set it to pdev for drvdata \n"); - inf = kmalloc(sizeof(struct rk29fb_inf), GFP_KERNEL); - if(!inf) - { - dev_err(&pdev->dev, ">> inf kmalloc fail!"); - ret = -ENOMEM; - goto release_drvdata; - } - memset(inf, 0, sizeof(struct rk29fb_inf)); - platform_set_drvdata(pdev, inf); - - mach_info = pdev->dev.platform_data; - /* Fill screen info and set current screen */ - fbprintk(">> Fill screen info and set current screen \n"); - #ifdef CONFIG_DEFAULT_OUT_HDMI // set hdmi for default output - hdmi_get_default_resolution(&inf->panel1_info); - #else - set_lcd_info(&inf->panel1_info, mach_info->lcd_info); - #endif - - inf->cur_screen = &inf->panel1_info; - screen = inf->cur_screen; - if(SCREEN_NULL==screen->type) - { - dev_err(&pdev->dev, ">> Please select a display device! \n"); - ret = -EINVAL; - goto release_drvdata; - } - - /* get virtual basic address of lcdc register */ - fbprintk(">> get virtual basic address of lcdc register \n"); - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lcdc reg"); - if (res == NULL) - { - dev_err(&pdev->dev, "failed to get memory registers\n"); - ret = -ENOENT; - goto release_drvdata; - } - inf->reg_phy_base = res->start; - inf->len = (res->end - res->start) + 1; - mem = request_mem_region(inf->reg_phy_base, inf->len, pdev->name); - if (mem == NULL) - { - dev_err(&pdev->dev, "failed to get memory region\n"); - ret = -ENOENT; - goto release_drvdata; - } - fbprintk("inf->reg_phy_base = 0x%08x, inf->len = %d \n", inf->reg_phy_base, inf->len); - inf->reg_vir_base = ioremap(inf->reg_phy_base, inf->len); - if (inf->reg_vir_base == NULL) - { - dev_err(&pdev->dev, "ioremap() of registers failed\n"); - ret = -ENXIO; - goto release_drvdata; - } - inf->preg = (LCDC_REG*)inf->reg_vir_base; - - /* Prepare win1 info */ - fbprintk(">> Prepare win1 info \n"); - inf->fb0 = framebuffer_alloc(sizeof(struct win0_par), &pdev->dev); - if(!inf->fb0) - { - dev_err(&pdev->dev, ">> fb0 framebuffer_alloc fail!"); - inf->fb0 = NULL; - ret = -ENOMEM; - goto release_win1fb; - } - - par = (struct win0_par*)inf->fb0->par; - strcpy(inf->fb0->fix.id, "fb0"); - inf->fb0->fix.type = FB_TYPE_PACKED_PIXELS; - inf->fb0->fix.type_aux = 0; - inf->fb0->fix.xpanstep = 1; - inf->fb0->fix.ypanstep = 1; - inf->fb0->fix.ywrapstep = 0; - inf->fb0->fix.accel = FB_ACCEL_NONE; - inf->fb0->fix.visual = FB_VISUAL_TRUECOLOR; - inf->fb0->fix.smem_len = 0; - inf->fb0->fix.line_length = 0; - inf->fb0->fix.smem_start = 0; - - inf->fb0->var.xres = screen->x_res; - inf->fb0->var.yres = screen->y_res; - inf->fb0->var.bits_per_pixel = 16; - inf->fb0_color_deepth = 0; - inf->fb0->var.xres_virtual = screen->x_res; - inf->fb0->var.yres_virtual = screen->y_res; - inf->fb0->var.width = screen->width; - inf->fb0->var.height = screen->height; - //inf->fb0->var.pixclock = div_u64(1000000000000llu, screen->pixclock); - inf->fb0->var.left_margin = screen->left_margin; - inf->fb0->var.right_margin = screen->right_margin; - inf->fb0->var.upper_margin = screen->upper_margin; - inf->fb0->var.lower_margin = screen->lower_margin; - inf->fb0->var.vsync_len = screen->vsync_len; - inf->fb0->var.hsync_len = screen->hsync_len; - inf->fb0->var.red = def_rgb_16.red; - inf->fb0->var.green = def_rgb_16.green; - inf->fb0->var.blue = def_rgb_16.blue; - inf->fb0->var.transp = def_rgb_16.transp; - - inf->fb0->var.nonstd = 0; //win1 format & ypos & xpos (ypos<<20 + xpos<<8 + format) - inf->fb0->var.grayscale = 0; //win1 transprent mode & value(mode<<8 + value) - inf->fb0->var.activate = FB_ACTIVATE_NOW; - inf->fb0->var.accel_flags = 0; - inf->fb0->var.vmode = FB_VMODE_NONINTERLACED; - - inf->fb0->fbops = &fb0_ops; - inf->fb0->flags = FBINFO_FLAG_DEFAULT; - inf->fb0->pseudo_palette = par->pseudo_pal; - inf->fb0->screen_base = 0; - - memset(par, 0, sizeof(struct win0_par)); - - ret = fb_alloc_cmap(&inf->fb0->cmap, 256, 0); - if (ret < 0) - goto release_cmap; - - g_fb0_inf = inf->fb0; //add cym@rk 20101027 - - /* alloc win1 buf */ - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "win1 buf"); - if (res == NULL) - { - dev_err(&pdev->dev, "failed to get win1 memory \n"); - ret = -ENOENT; - goto release_win1fb; - } - inf->fb0->fix.smem_start = res->start; - inf->fb0->fix.smem_len = res->end - res->start + 1; - inf->fb0->screen_base = ioremap(res->start, inf->fb0->fix.smem_len); - memset(inf->fb0->screen_base, 0, inf->fb0->fix.smem_len); - - #ifdef CONFIG_FB_WORK_IPP - /* alloc win1 ipp buf */ - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "win1 ipp buf"); - if (res == NULL) - { - dev_err(&pdev->dev, "failed to get win1 ipp memory \n"); - ret = -ENOENT; - goto release_win1fb; - } - inf->fb0->fix.mmio_start = res->start; - inf->fb0->fix.mmio_len = res->end - res->start + 1; - #endif - - /* Prepare win0 info */ - fbprintk(">> Prepare win0 info \n"); - inf->fb1 = framebuffer_alloc(sizeof(struct win0_par), &pdev->dev); - if(!inf->fb1) - { - dev_err(&pdev->dev, ">> fb1 framebuffer_alloc fail!"); - inf->fb1 = NULL; - ret = -ENOMEM; - goto release_win0fb; - } - - par = (struct win0_par*)inf->fb1->par; - - strcpy(inf->fb1->fix.id, "fb1"); - inf->fb1->fix.type = FB_TYPE_PACKED_PIXELS; - inf->fb1->fix.type_aux = 0; - inf->fb1->fix.xpanstep = 1; - inf->fb1->fix.ypanstep = 1; - inf->fb1->fix.ywrapstep = 0; - inf->fb1->fix.accel = FB_ACCEL_NONE; - inf->fb1->fix.visual = FB_VISUAL_TRUECOLOR; - inf->fb1->fix.smem_len = 0; - inf->fb1->fix.line_length = 0; - inf->fb1->fix.smem_start = 0; - - inf->fb1->var.xres = screen->x_res; - inf->fb1->var.yres = screen->y_res; - inf->fb1->var.bits_per_pixel = 16; - inf->fb1->var.xres_virtual = screen->x_res; - inf->fb1->var.yres_virtual = screen->y_res; - inf->fb1->var.width = screen->width; - inf->fb1->var.height = screen->height; - //inf->fb1->var.pixclock = div_u64(1000000000000llu, screen->pixclock); - inf->fb1->var.left_margin = screen->left_margin; - inf->fb1->var.right_margin = screen->right_margin; - inf->fb1->var.upper_margin = screen->upper_margin; - inf->fb1->var.lower_margin = screen->lower_margin; - inf->fb1->var.vsync_len = screen->vsync_len; - inf->fb1->var.hsync_len = screen->hsync_len; - inf->fb1->var.red = def_rgb_16.red; - inf->fb1->var.green = def_rgb_16.green; - inf->fb1->var.blue = def_rgb_16.blue; - inf->fb1->var.transp = def_rgb_16.transp; - - inf->fb1->var.nonstd = 0; //win0 format & ypos & xpos (ypos<<20 + xpos<<8 + format) - inf->fb1->var.grayscale = ((inf->fb1->var.yres<<20)&0xfff00000) + ((inf->fb1->var.xres<<8)&0xfff00);//win0 xsize & ysize - inf->fb1->var.activate = FB_ACTIVATE_NOW; - inf->fb1->var.accel_flags = 0; - inf->fb1->var.vmode = FB_VMODE_NONINTERLACED; - - inf->fb1->fbops = &fb1_ops; - inf->fb1->flags = FBINFO_FLAG_DEFAULT; - inf->fb1->pseudo_palette = par->pseudo_pal; - inf->fb1->screen_base = 0; - - memset(par, 0, sizeof(struct win0_par)); - - init_waitqueue_head(&par->wait); - - /* Init all lcdc and lcd before register_framebuffer. */ - /* because after register_framebuffer, the win1fb_check_par and winfb_set_par execute immediately */ - fbprintk(">> Init all lcdc and lcd before register_framebuffer \n"); - init_lcdc(inf->fb0); - - #if 0 //def CONFIG_CPU_FREQ - // inf->freq_transition.notifier_call = rk29fb_freq_transition; - // cpufreq_register_notifier(&inf->freq_transition, CPUFREQ_TRANSITION_NOTIFIER); - #endif - fbprintk("got clock\n"); - - if(mach_info) - { - struct rk29_fb_setting_info fb_setting; - if( OUT_P888==inf->cur_screen->face ) // set lcdc iomux - { - fb_setting.data_num = 24; - } - else if(OUT_P666 == inf->cur_screen->face ) - { - fb_setting.data_num = 18; - } - else - { - fb_setting.data_num = 16; - } - fb_setting.den_en = 1; - fb_setting.vsync_en = 1; - fb_setting.disp_on_en = 1; - fb_setting.standby_en = 1; - if( inf->cur_screen->mcu_usefmk ) - fb_setting.mcu_fmk_en =1; - mach_info->io_init(&fb_setting); - } - - //set_lcd_pin(pdev, 1); - mdelay(10); - g_pdev = pdev; - inf->mcu_usetimer = 1; - inf->mcu_fmksync = 0; - load_screen(inf->fb0, 1); - - /* Register framebuffer(fb0 & fb1) */ - fbprintk(">> Register framebuffer(fb0) \n"); - ret = register_framebuffer(inf->fb0); - if(ret<0) - { - printk(">> fb0 register_framebuffer fail!\n"); - ret = -EINVAL; - goto release_win0fb; - } - fbprintk(">> Register framebuffer(fb1) \n"); - - ret = register_framebuffer(inf->fb1); - if(ret<0) - { - printk(">> fb1 register_framebuffer fail!\n"); - ret = -EINVAL; - goto unregister_win1fb; - } - - ret = device_create_file(inf->fb1->dev, &dev_attr_dsp_win0_info); - if(ret) - { - printk(">> fb1 dsp win0 info device_create_file err\n"); - ret = -EINVAL; - } -#ifdef CONFIG_HAS_EARLYSUSPEND - suspend_info.inf = inf; - register_early_suspend(&suspend_info.early_suspend); -#endif - - /* get and request irq */ - fbprintk(">> get and request irq \n"); - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - dev_err(&pdev->dev, "no irq for device\n"); - ret = -ENOENT; - goto unregister_win1fb; - } - ret = request_irq(irq, rk29fb_irq, IRQF_DISABLED, pdev->name, pdev); - if (ret) { - dev_err(&pdev->dev, "cannot get irq %d - err %d\n", irq, ret); - ret = -EBUSY; - goto release_irq; - } - - if( inf->cur_screen->mcu_usefmk && (mach_info->mcu_fmk_pin != -1) ) - { - ret = request_irq(gpio_to_irq(mach_info->mcu_fmk_pin), mcu_irqfmk, GPIOEdgelFalling, pdev->name, pdev); - if (ret) - { - dev_err(&pdev->dev, "cannot get fmk irq %d - err %d\n", irq, ret); - ret = -EBUSY; - goto release_irq; - } - } - #ifdef CONFIG_MFD_RK610 - rk610_lcd_scaler_set_param(&inf->panel1_info,0); - #endif -#if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO) - fb0_set_par(inf->fb0); - if (fb_prepare_logo(inf->fb0, FB_ROTATE_UR)) { - /* Start display and show logo on boot */ - fb_set_cmap(&inf->fb0->cmap, inf->fb0); - fb_show_logo(inf->fb0, FB_ROTATE_UR); - fb0_blank(FB_BLANK_UNBLANK, inf->fb0); - } -#endif - - printk(" %s ok\n", __FUNCTION__); - return ret; - -release_irq: - if(irq>=0) - free_irq(irq, pdev); -unregister_win1fb: - unregister_framebuffer(inf->fb0); -release_win0fb: - if(inf->fb1) - framebuffer_release(inf->fb1); - inf->fb1 = NULL; -release_cmap: - if(&inf->fb0->cmap) - fb_dealloc_cmap(&inf->fb0->cmap); -release_win1fb: - if(inf->fb0) - framebuffer_release(inf->fb0); - inf->fb0 = NULL; -release_drvdata: - if(inf && inf->reg_vir_base) - iounmap(inf->reg_vir_base); - if(inf && mem) - release_mem_region(inf->reg_phy_base, inf->len); - if(inf) - kfree(inf); - platform_set_drvdata(pdev, NULL); - return ret; -} - -static int __devexit rk29fb_remove(struct platform_device *pdev) -{ - struct rk29fb_inf *inf = platform_get_drvdata(pdev); - struct fb_info *info = NULL; - //pm_message_t msg; - struct rk29fb_info *mach_info = NULL; - int irq = 0; - - fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); - - if(!inf) { - printk("inf==0, rk29_fb_remove fail! \n"); - return -EINVAL; - } - device_remove_file(inf->fb1->dev, &dev_attr_dsp_win0_info); - - irq = platform_get_irq(pdev, 0); - if (irq >0) - { - free_irq(irq, pdev); - } - - mach_info = pdev->dev.platform_data; - if(mach_info->mcu_fmk_pin) - { - free_irq(gpio_to_irq(mach_info->mcu_fmk_pin), pdev); - } - - if(mach_info->io_disable) - mach_info->io_disable(); //close lcd out - - // blank the lcdc - if(inf->fb1) - fb1_blank(FB_BLANK_POWERDOWN, inf->fb1); - if(inf->fb0) - fb0_blank(FB_BLANK_POWERDOWN, inf->fb0); - - // suspend the lcdc - //rk29fb_suspend(pdev, msg); - // unmap memory and release framebuffer - if(inf->fb1) { - info = inf->fb1; - if (info->screen_base) { - //dma_free_writecombine(NULL, PAGE_ALIGN(info->fix.smem_len),info->screen_base, info->fix.smem_start); - info->screen_base = 0; - info->fix.smem_start = 0; - info->fix.smem_len = 0; - } - unregister_framebuffer(inf->fb1); - framebuffer_release(inf->fb1); - inf->fb1 = NULL; - } - if(inf->fb0) { - info = inf->fb0; - if (info->screen_base) { - // dma_free_writecombine(NULL, PAGE_ALIGN(info->fix.smem_len),info->screen_base, info->fix.smem_start); - info->screen_base = 0; - info->fix.smem_start = 0; - info->fix.smem_len = 0; - } - unregister_framebuffer(inf->fb0); - framebuffer_release(inf->fb0); - inf->fb0 = NULL; - } - - #if 0 //def CONFIG_CPU_FREQ - // cpufreq_unregister_notifier(&inf->freq_transition, CPUFREQ_TRANSITION_NOTIFIER); - #endif - - msleep(100); - - if (inf->clk) - { - clk_disable(inf->clk); - clk_put(inf->clk); - inf->clk = NULL; - } - if (inf->dclk) - { - clk_disable(inf->dclk); - clk_put(inf->dclk); - inf->dclk = NULL; - } - - kfree(inf); - platform_set_drvdata(pdev, NULL); - - return 0; -} - -static void rk29fb_shutdown(struct platform_device *pdev) -{ - struct rk29fb_inf *inf = platform_get_drvdata(pdev); - struct rk29fb_info *mach_info = pdev->dev.platform_data;; - - fbprintk("----------------------------rk29fb_shutdown----------------------------\n"); - - if(mach_info->io_disable) - mach_info->io_disable(); //close lcd out - - if(!inf->in_suspend) - { - LcdMskReg(inf, DSP_CTRL1, m_BLANK_MODE , v_BLANK_MODE(1)); - LcdMskReg(inf, SYS_CONFIG, m_STANDBY, v_STANDBY(1)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); - mdelay(100); - clk_disable(inf->aclk_ddr_lcdc); - clk_disable(inf->aclk_disp_matrix); - clk_disable(inf->hclk_cpu_display); - clk_disable(inf->clk); - if(inf->dclk){ - clk_disable(inf->dclk); - } - if(inf->clk){ - clk_disable(inf->aclk); - } - clk_disable(inf->pd_display); - //pmu_set_power_domain(PD_DISPLAY, 0); - inf->in_suspend = 1; - } - -} - -static struct platform_driver rk29fb_driver = { - .probe = rk29fb_probe, - .remove = __devexit_p(rk29fb_remove), - .driver = { - .name = "rk29-fb", - .owner = THIS_MODULE, - }, - .shutdown = rk29fb_shutdown, -}; - -static int __init rk29fb_init(void) -{ - wake_lock_init(&idlelock, WAKE_LOCK_IDLE, "fb"); - return platform_driver_register(&rk29fb_driver); -} - -static void __exit rk29fb_exit(void) -{ - platform_driver_unregister(&rk29fb_driver); -} - -fs_initcall(rk29fb_init); -module_exit(rk29fb_exit); - - -MODULE_AUTHOR(" zyw@rock-chips.com"); -MODULE_DESCRIPTION("Driver for rk29 fb device"); -MODULE_LICENSE("GPL"); - - diff --git a/drivers/video/rk29_fb.h b/drivers/video/rk29_fb.h deleted file mode 100644 index fc0e0f139ba1..000000000000 --- a/drivers/video/rk29_fb.h +++ /dev/null @@ -1,467 +0,0 @@ -/* drivers/video/rk29_fb.h - * - * Copyright (C) 2010 ROCKCHIP, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __ARCH_ARM_MACH_RK29_FB_H -#define __ARCH_ARM_MACH_RK29_FB_H - -/******************************************************************** -** ºê¶¨Òå * -********************************************************************/ -/* ÊäÍùÆÁµÄÊý¾Ý¸ñʽ */ -#define OUT_P888 0 -#define OUT_P666 1 //666µÄÆÁ, ½ÓDATA0-17 -#define OUT_P565 2 //565µÄÆÁ, ½ÓDATA0-15 -#define OUT_S888x 4 -#define OUT_CCIR656 6 -#define OUT_S888 8 -#define OUT_S888DUMY 12 -#define OUT_P16BPP4 24 //Ä£Äⷽʽ,¿ØÖÆÆ÷²¢²»Ö§³Ö -#define OUT_D888_P666 0x21 //666µÄÆÁ, ½ÓDATA2-7, DATA10-15, DATA18-23 -#define OUT_D888_P565 0x22 //565µÄÆÁ, ½ÓDATA3-7, DATA10-15, DATA19-23 - -/* SYS_CONFIG */ -#define m_W2_FORMAT (3<<0) -#define m_W1_FORMAT (1<<2) -#define m_W0_FORMAT (7<<3) -#define m_W0_CBR_DEFLICK_EN (1<<6) -#define m_W0_YRGB_DEFLICK_EN (1<<7) -#define m_INTERIACE_EN (1<<8) -#define m_W2_ENABLE (1<<9) -#define m_W1_ENABLE (1<<10) -#define m_W0_ENABLE (1<<11) -#define m_HWC_ENABLE (1<<12) -#define m_HWC_RELOAD_EN (1<<13) -#define m_W2_INTERLACE_READ (1<<14) -#define m_W1_INTERLACE_READ (1<<15) -#define m_W0_INTERLACE_READ (1<<16) -#define m_STANDBY (1<<17) -#define m_HWC_BURST (3<<18) -#define m_W2_BURST (3<<20) -#define m_W1_BURST (3<<22) -#define m_W0_BURST (3<<24) -#define m_W2_LUT_CTL (1<<26) -#define m_DSIP_LUT_CTL (1<<27) -#define m_HWC_REVERSED_COLOR (1<<28) -#define m_W1_AXI_OUTSTANDING2 (1<<29) -#define m_W0_AXI_OUTSTANDING2 (1<<30) - -#define v_W2_FORMAT(x) (((x)&3)<<0) -#define v_W1_FORMAT(x) (((x)&1)<<2) -#define v_W0_FORMAT(x) (((x)&7)<<3) -#define v_W0_CBR_DEFLICK_EN(x) (((x)&1)<<6) -#define v_W0_YRGB_DEFLICK_EN(x) (((x)&1)<<7) -#define v_INTERIACE_EN(x) (((x)&1)<<8) -#define v_W2_ENABLE(x) (((x)&)1<<9) -#define v_W1_ENABLE(x) (((x)&1)<<10) -#define v_W0_ENABLE(x) (((x)&1)<<11) -#define v_HWC_ENABLE(x) (((x)&1)<<12) -#define v_HWC_RELOAD_EN(x) (((x)&1)<<13) -#define v_W2_INTERLACE_READ(x) (((x)&1)<<14) -#define v_W1_INTERLACE_READ(x) (((x)&1)<<15) -#define v_W0_INTERLACE_READ(x) (((x)&1)<<16) -#define v_STANDBY(x) (((x)&1)<<17) -#define v_HWC_BURST(x) (((x)&3)<<18) -#define v_W2_BURST(x) (((x)&3)<<20) -#define v_W1_BURST(x) (((x)&3)<<22) -#define v_W0_BURST(x) (((x)&3)<<24) -#define v_W2_LUT_CTL(x) (((x)&1)<<26) -#define v_DSIP_LUT_CTL(x) (((x)&1)<<27) -#define v_HWC_REVERSED_COLOR(x) (((x)&1)<<28) -#define v_W1_AXI_OUTSTANDING2(x) (((x)&1)<<29) -#define v_W0_AXI_OUTSTANDING2(x) (((x)&1)<<30) - -//LCDC_SWAP_CTRL -#define m_W1_565_RB_SWAP (1<<0) -#define m_W0_565_RB_SWAP (1<<1) -#define m_W0_YRGB_M8_SWAP (1<<2) -#define m_W0_YRGB_R_SHIFT_SWAP (1<<3) -#define m_W0_CBR_R_SHIFT_SWAP (1<<4) -#define m_W0_YRGB_16_SWAP (1<<5) -#define m_W0_YRGB_8_SWAP (1<<6) -#define m_W0_CBR_16_SWAP (1<<7) -#define m_W0_CBR_8_SWAP (1<<8) -#define m_W1_16_SWAP (1<<9) -#define m_W1_8_SWAP (1<<10) -#define m_W1_R_SHIFT_SWAP (1<<11) -#define m_OUTPUT_BG_SWAP (1<<12) -#define m_OUTPUT_RB_SWAP (1<<13) -#define m_OUTPUT_RG_SWAP (1<<14) -#define m_DELTA_SWAP (1<<15) -#define m_DUMMY_SWAP (1<<16) -#define m_W2_BYTE_SWAP (1<<17) -#define v_W1_565_RB_SWAP(x) (((x)&1)<<0) -#define v_W0_565_RB_SWAP(x) (((x)&1)<<1) -#define v_W0_YRGB_M8_SWAP(x) (((x)&1)<<2) -#define v_W0_YRGB_R_SHIFT_SWAP(x) (((x)&1)<<3) -#define v_W0_CBR_R_SHIFT_SWAP(x) (((x)&1)<<4) -#define v_W0_YRGB_16_SWAP(x) (((x)&1)<<5) -#define v_W0_YRGB_8_SWAP(x) (((x)&1)<<6) -#define v_W0_CBR_16_SWAP(x) (((x)&1)<<7) -#define v_W0_CBR_8_SWAP(x) (((x)&1)<<8) -#define v_W1_16_SWAP(x) (((x)&1)<<9) -#define v_W1_8_SWAP(x) (((x)&1)<<10) -#define v_W1_R_SHIFT_SWAP(x) (((x)&1)<<11) -#define v_OUTPUT_BG_SWAP(x) (((x)&1)<<12) -#define v_OUTPUT_RB_SWAP(x) (((x)&1)<<13) -#define v_OUTPUT_RG_SWAP(x) (((x)&1)<<14) -#define v_DELTA_SWAP(x) (((x)&1)<<15) -#define v_DUMMY_SWAP(x) (((x)&1)<<16) -#define v_W2_BYTE_SWAP(x) (((x)&1)<<17) - -//LCDC_MCU_TIMING_CTRL -#define m_MCU_WRITE_PERIOD (31<<0) -#define m_MCU_CS_ST (31<<5) -#define m_MCU_CS_END (31<<10) -#define m_MCU_RW_ST (31<<15) -#define m_MCU_RW_END (31<<20) -#define m_MCU_HOLDMODE_SELECT (1<<27) -#define m_MCU_HOLDMODE_FRAME_ST (1<<28) -#define m_MCU_RS_SELECT (1<<29) -#define m_MCU_BYPASSMODE_SELECT (1<<30) -#define m_MCU_OUTPUT_SELECT (1<<31) -#define v_MCU_WRITE_PERIOD(x) (((x)&31)<<0) -#define v_MCU_CS_ST(x) (((x)&31)<<5) -#define v_MCU_CS_END(x) (((x)&31)<<10) -#define v_MCU_RW_ST(x) (((x)&31)<<15) -#define v_MCU_RW_END(x) (((x)&31)<<20) -#define v_MCU_HOLD_STATUS(x) (((x)&1)<<26) -#define v_MCU_HOLDMODE_SELECT(x) (((x)&1)<<27) -#define v_MCU_HOLDMODE_FRAME_ST(x) (((x)&1)<<28) -#define v_MCU_RS_SELECT(x) (((x)&1)<<29) -#define v_MCU_BYPASSMODE_SELECT(x) (((x)&1)<<30) -#define v_MCU_OUTPUT_SELECT(x) (((x)&1)<<31) - -//LCDC_ BLEND_CTRL -#define m_HWC_BLEND_EN (1<<0) -#define m_W2_BLEND_EN (1<<1) -#define m_W1_BLEND_EN (1<<2) -#define m_W0_BLEND_EN (1<<3) -#define m_HWC_BLEND_FACTOR (15<<4) -#define m_W2_BLEND_FACTOR (0xff<<8) -#define m_W1_BLEND_FACTOR (0xff<<16) -#define m_W0_BLEND_FACTOR (0xff<<24) - -#define v_HWC_BLEND_EN(x) (((x)&1)<<0) -#define v_W2_BLEND_EN(x) (((x)&1)<<1) -#define v_W1_BLEND_EN(x) (((x)&1)<<2) -#define v_W0_BLEND_EN(x) (((x)&1)<<3) -#define v_HWC_BLEND_FACTOR(x) (((x)&15)<<4) -#define v_W2_BLEND_FACTOR(x) (((x)&0xff)<<8) -#define v_W1_BLEND_FACTOR(x) (((x)&0xff)<<16) -#define v_W0_BLEND_FACTOR(x) (((x)&0xff)<<24) - - -//LCDC_WIN0_COLOR_KEY_CTRL / LCDC_WIN1_COLOR_KEY_CTRL -#define m_KEYCOLOR (0xffffff<<0) -#define m_KEYCOLOR_B (0xff<<0) -#define m_KEYCOLOR_G (0xff<<8) -#define m_KEYCOLOR_R (0xff<<16) -#define m_COLORKEY_EN (1<<24) -#define v_KEYCOLOR(x) (((x)&0xffffff)<<0) -#define v_KEYCOLOR_B(x) (((x)&0xff)<<0) -#define v_KEYCOLOR_G(x) (((x)&0xff)<<8) -#define v_KEYCOLOR_R(x) (((x)&0xff)<<16) -#define v_COLORKEY_EN(x) (((x)&1)<<24) - -//LCDC_DEFLICKER_SCL_OFFSET -#define m_W0_YRGB_VSD_OFFSET (0xff<<0) -#define m_W0_YRGB_VSP_OFFSET (0xff<<8) -#define m_W1_VSD_OFFSET (0xff<<16) -#define m_W1_VSP_OFFSET (0xff<<24) -#define v_W0_YRGB_VSD_OFFSET(x) (((x)&0xff)<<0) -#define v_W0_YRGB_VSP_OFFSET(x) (((x)&0xff)<<8) -#define v_W1_VSD_OFFSET(x) (((x)&0xff)<<16) -#define v_W1_VSP_OFFSET(x) (((x)&0xff)<<24) - -//LCDC_DSP_CTRL_REG0 -#define m_DISPLAY_FORMAT (0xf<<0) -#define m_HSYNC_POLARITY (1<<4) -#define m_VSYNC_POLARITY (1<<5) -#define m_DEN_POLARITY (1<<6) -#define m_DCLK_POLARITY (1<<7) -#define m_COLOR_SPACE_CONVERSION (3<<8) -#define m_DITHER_UP_EN (1<<10) -#define m_DITHER_DOWN_MODE (1<<11) -#define m_DITHER_DOWN_EN (1<<12) -#define m_INTERLACE_FIELD_POLARITY (1<<13) -#define m_YUV_CLIP (1<<14) -#define m_W1_TRANSP_FROM (1<<15) -#define m_W0_TRANSP_FROM (1<<16) -#define m_W0_ON_TOP (1<<17) -#define m_W1_CLIP_EN (1<<18) -#define m_W0_CLIP_EN (1<<19) -#define m_W0_YCBR_PRIORITY_MODE (1<<20) -#define m_CBR_FILTER_656 (1<<21) -#define m_W2_CHIP_EN (1<<22) - -#define v_DISPLAY_FORMAT(x) (((x)&0xf)<<0) -#define v_HSYNC_POLARITY(x) (((x)&1)<<4) -#define v_VSYNC_POLARITY(x) (((x)&1)<<5) -#define v_DEN_POLARITY(x) (((x)&1)<<6) -#define v_DCLK_POLARITY(x) (((x)&1)<<7) -#define v_COLOR_SPACE_CONVERSION(x) (((x)&3)<<8) -#define v_DITHER_UP_EN(x) (((x)&1)<<10) -#define v_DITHER_DOWN_MODE(x) (((x)&1)<<11) -#define v_DITHER_DOWN_EN(x) (((x)&1)<<12) -#define v_INTERLACE_FIELD_POLARITY(x) (((x)&1)<<13) -#define v_YUV_CLIP(x) (((x)&1)<<14) -#define v_W1_TRANSP_FROM(x) (((x)&1)<<15) -#define v_W0_TRANSP_FROM(x) (((x)&1)<<16) -#define v_W0_ON_TOP(x) (((x)&1)<<17) -#define v_W1_CLIP_EN(x) (((x)&1)<<18) -#define v_W0_CLIP_EN(x) (((x)&1)<<19) -#define v_W0_YCBR_PRIORITY_MODE(x) (((x)&1)<<20) -#define v_CBR_FILTER_656(x) (((x)&1)<<21) -#define v_W2_CHIP_EN(x) (((x)&1)<<22) - - -//LCDC_DSP_CTRL_REG1 -#define m_BG_COLOR (0xffffff<<0) -#define m_BG_B (0xff<<0) -#define m_BG_G (0xff<<8) -#define m_BG_R (0xff<<16) -#define m_BLANK_MODE (1<<24) -#define m_BLACK_MODE (1<<25) -#define m_DISP_FILTER_FACTOR (3<<26) -#define m_DISP_FILTER_MODE (1<<28) -#define m_DISP_FILTER_EN (1<<29) -#define v_BG_COLOR(x) (((x)&0xffffff)<<0) -#define v_BG_B(x) (((x)&0xff)<<0) -#define v_BG_G(x) (((x)&0xff)<<8) -#define v_BG_R(x) (((x)&0xff)<<16) -#define v_BLANK_MODE(x) (((x)&1)<<24) -#define v_BLACK_MODE(x) (((x)&1)<<25) -#define v_DISP_FILTER_FACTOR(x) (((x)&3)<<26) -#define v_DISP_FILTER_MODE(x) (((x)&1)<<28) -#define v_DISP_FILTER_EN(x) (((x)&1)<<29) - -//LCDC_INT_STATUS -#define m_HOR_START (1<<0) -#define m_FRM_START (1<<1) -#define m_SCANNING_FLAG (1<<2) -#define m_HOR_STARTMASK (1<<3) -#define m_FRM_STARTMASK (1<<4) -#define m_SCANNING_MASK (1<<5) -#define m_HOR_STARTCLEAR (1<<6) -#define m_FRM_STARTCLEAR (1<<7) -#define m_SCANNING_CLEAR (1<<8) -#define m_SCAN_LINE_NUM (0x7ff<<9) -#define v_HOR_START(x) (((x)&1)<<0) -#define v_FRM_START(x) (((x)&1)<<1) -#define v_SCANNING_FLAG(x) (((x)&1)<<2) -#define v_HOR_STARTMASK(x) (((x)&1)<<3) -#define v_FRM_STARTMASK(x) (((x)&1)<<4) -#define v_SCANNING_MASK(x) (((x)&1)<<5) -#define v_HOR_STARTCLEAR(x) (((x)&1)<<6) -#define v_FRM_STARTCLEAR(x) (((x)&1)<<7) -#define v_SCANNING_CLEAR(x) (((x)&1)<<8) -#define v_SCAN_LINE_NUM(x) (((x)&0x7ff)<<9) - -//AXI MS ID -#define m_W0_YRGB_CH_ID (0xF<<0) -#define m_W0_CBR_CH_ID (0xF<<4) -#define m_W1_YRGB_CH_ID (0xF<<8) -#define m_W2_CH_ID (0xF<<12) -#define m_HWC_CH_ID (0xF<<16) -#define v_W0_YRGB_CH_ID(x) (((x)&0xF)<<0) -#define v_W0_CBR_CH_ID(x) (((x)&0xF)<<4) -#define v_W1_YRGB_CH_ID(x) (((x)&0xF)<<8) -#define v_W2_CH_ID(x) (((x)&0xF)<<12) -#define v_HWC_CH_ID(x) (((x)&0xF)<<16) - - -/* Low Bits Mask */ -#define m_WORDLO (0xffff<<0) -#define m_WORDHI (0xffff<<16) -#define v_WORDLO(x) (((x)&0xffff)<<0) -#define v_WORDHI(x) (((x)&0xffff)<<16) - -#define m_BIT11LO (0x7ff<<0) -#define m_BIT11HI (0x7ff<<16) -#define v_BIT11LO(x) (((x)&0x7ff)<<0) -#define v_BIT11HI(x) (((x)&0x7ff)<<16) - -#define m_BIT12LO (0xfff<<0) -#define m_BIT12HI (0xfff<<16) -#define v_BIT12LO(x) (((x)&0xfff)<<0) -#define v_BIT12HI(x) (((x)&0xfff)<<16) - - -#define m_VIRWIDTH (0xffff<<0) -#define m_VIRHEIGHT (0xffff<<16) -#define v_VIRWIDTH(x) (((x)&0xffff)<<0) -#define v_VIRHEIGHT(x) (((x)&0xffff)<<16) - -#define m_ACTWIDTH (0xffff<<0) -#define m_ACTHEIGHT (0xffff<<16) -#define v_ACTWIDTH(x) (((x)&0xffff)<<0) -#define v_ACTHEIGHT(x) (((x)&0xffff)<<16) - -#define m_VIRST_X (0xffff<<0) -#define m_VIRST_Y (0xffff<<16) -#define v_VIRST_X(x) (((x)&0xffff)<<0) -#define v_VIRST_Y(x) (((x)&0xffff)<<16) - -#define m_PANELST_X (0x3ff<<0) -#define m_PANELST_Y (0x3ff<<16) -#define v_PANELST_X(x) (((x)&0x3ff)<<0) -#define v_PANELST_Y(x) (((x)&0x3ff)<<16) - -#define m_PANELWIDTH (0x3ff<<0) -#define m_PANELHEIGHT (0x3ff<<16) -#define v_PANELWIDTH(x) (((x)&0x3ff)<<0) -#define v_PANELHEIGHT(x) (((x)&0x3ff)<<16) - -#define m_HWC_B (0xff<<0) -#define m_HWC_G (0xff<<8) -#define m_HWC_R (0xff<<16) -#define m_W0_YRGB_HSP_OFFSET (0xff<<24) -#define m_W0_YRGB_HSD_OFFSET (0xff<<24) -#define v_HWC_B(x) (((x)&0xff)<<0) -#define v_HWC_G(x) (((x)&0xff)<<8) -#define v_HWC_R(x) (((x)&0xff)<<16) -#define v_W0_YRGB_HSP_OFFSET(x) (((x)&0xff)<<24) -#define v_W0_YRGB_HSD_OFFSET(x) (((x)&0xff)<<24) - - -//Panel display scanning -#define m_PANEL_HSYNC_WIDTH (0x3ff<<0) -#define m_PANEL_HORIZONTAL_PERIOD (0x3ff<<16) -#define v_PANEL_HSYNC_WIDTH(x) (((x)&0x3ff)<<0) -#define v_PANEL_HORIZONTAL_PERIOD(x) (((x)&0x3ff)<<16) - -#define m_PANEL_END (0x3ff<<0) -#define m_PANEL_START (0x3ff<<16) -#define v_PANEL_END(x) (((x)&0x3ff)<<0) -#define v_PANEL_START(x) (((x)&0x3ff)<<16) - -#define m_PANEL_VSYNC_WIDTH (0x3ff<<0) -#define m_PANEL_VERTICAL_PERIOD (0x3ff<<16) -#define v_PANEL_VSYNC_WIDTH(x) (((x)&0x3ff)<<0) -#define v_PANEL_VERTICAL_PERIOD(x) (((x)&0x3ff)<<16) -//----------- - -#define m_HSCALE_FACTOR (0xffff<<0) -#define m_VSCALE_FACTOR (0xffff<<16) -#define v_HSCALE_FACTOR(x) (((x)&0xffff)<<0) -#define v_VSCALE_FACTOR(x) (((x)&0xffff)<<16) - -#define m_W0_CBR_HSD_OFFSET (0xff<<0) -#define m_W0_CBR_HSP_OFFSET (0xff<<8) -#define m_W0_CBR_VSD_OFFSET (0xff<<16) -#define m_W0_CBR_VSP_OFFSET (0xff<<24) -#define v_W0_CBR_HSD_OFFSET(x) (((x)&0xff)<<0) -#define v_W0_CBR_HSP_OFFSET(x) (((x)&0xff)<<8) -#define v_W0_CBR_VSD_OFFSET(x) (((x)&0xff)<<16) -#define v_W0_CBR_VSP_OFFSET(x) (((x)&0xff)<<24) - - -#define FB0_IOCTL_STOP_TIMER_FLUSH 0x6001 -#define FB0_IOCTL_SET_PANEL 0x6002 - -#ifdef CONFIG_FB_WIMO -#define FB_WIMO_FLAG -#endif -#ifdef FB_WIMO_FLAG -#define FB0_IOCTL_SET_BUF 0x6017 -#define FB0_IOCTL_COPY_CURBUF 0x6018 -#define FB0_IOCTL_CLOSE_BUF 0x6019 -#endif - -#define FB1_IOCTL_GET_PANEL_SIZE 0x5001 -#define FB1_IOCTL_SET_YUV_ADDR 0x5002 -//#define FB1_TOCTL_SET_MCU_DIR 0x5003 -#define FB1_IOCTL_SET_ROTATE 0x5003 -#define FB1_IOCTL_SET_I2P_ODD_ADDR 0x5005 -#define FB1_IOCTL_SET_I2P_EVEN_ADDR 0x5006 -#define FB1_IOCTL_SET_WIN0_TOP 0x5018 - - -/******************************************************************** -** ½á¹¹¶¨Òå * -********************************************************************/ -/* LCDCµÄ¼Ä´æÆ÷½á¹¹ */ - -typedef volatile struct tagLCDC_REG -{ - /* offset 0x00~0xc0 */ - unsigned int SYS_CONFIG; //0x00 SYSTEM configure register - unsigned int SWAP_CTRL; //0x04 Data SWAP control - unsigned int MCU_TIMING_CTRL; //0x08 MCU TIMING control register - unsigned int BLEND_CTRL; //0x0c Blending control register - unsigned int WIN0_COLOR_KEY_CTRL; //0x10 Win0 blending control register - unsigned int WIN1_COLOR_KEY_CTRL; //0x14 Win1 blending control register - unsigned int WIN2_VIR; //0x18 WIN2 virtual display width - unsigned int DSP_CTRL0; //0x1c Display control register0 - unsigned int DSP_CTRL1; //0x20 Display control register1 - unsigned int INT_STATUS; //0x24 Interrupt status register - unsigned int WIN0_VIR; //0x28 WIN0 virtual display width/height - unsigned int WIN0_YRGB_MST; //0x2c Win0 active YRGB memory start address - unsigned int WIN0_CBR_MST; //0x30 Win0 active Cbr memory start address - unsigned int WIN0_ACT_INFO; //0x34 Win0 active window width/height - unsigned int WIN0_DSP_ST; //0x38 Win0 display start point on panel - unsigned int WIN0_DSP_INFO; //0x3c Win0 display width/height on panel - unsigned int WIN1_VIR; //0x40 Win1 virtual display width/height - unsigned int WIN1_YRGB_MST; //0x44 Win1 active memory start address - unsigned int WIN1_DSP_INFO; //0x48 Win1 display width/height on panel - unsigned int WIN1_DSP_ST; //0x4c Win1 display start point on panel - unsigned int WIN2_MST; //0X50 Win2 memory start address - unsigned int WIN2_DSP_INFO; //0x54 Win1 display width/height on panel - unsigned int WIN2_DSP_ST; //0x58 Win1 display start point on panel - unsigned int HWC_MST; //0x5C HWC memory start address - unsigned int HWC_DSP_ST; //0x60 HWC display start point on panel - unsigned int HWC_COLOR_LUT0; //0x64 Hardware cursor color 2¡¯b01 look up table 0 - unsigned int HWC_COLOR_LUT1; //0x68 Hardware cursor color 2¡¯b10 look up table 1 - unsigned int HWC_COLOR_LUT2; //0x6c Hardware cursor color 2¡¯b11 look up table 2 - unsigned int DSP_HTOTAL_HS_END; //0x70 Panel scanning horizontal width and hsync pulse end point - unsigned int DSP_HACT_ST_END; //0x74 Panel active horizontal scanning start/end point - unsigned int DSP_VTOTAL_VS_END; //0x78 Panel scanning vertical height and vsync pulse end point - unsigned int DSP_VACT_ST_END; //0x7c Panel active vertical scanning start/end point - unsigned int DSP_VS_ST_END_F1; //0x80 Vertical scanning start point and vsync pulse end point of even filed in interlace mode - unsigned int DSP_VACT_ST_END_F1; //0x84 Vertical scanning active start/end point of even filed in interlace mode - unsigned int WIN0_SCL_FACTOR_YRGB; //0x88 Win0 YRGB scaling down factor setting - unsigned int WIN0_SCL_FACTOR_CBR; //0x8c Win0 YRGB scaling up factor setting - unsigned int WIN0_SCL_OFFSET; //0x90 Win0 Cbr scaling start point offset - unsigned int FIFO_WATER_MARK; //0x94 Fifo water mark - unsigned int AXI_MS_ID; //0x98 Axi master ID - unsigned int reserved0; //0x9c - unsigned int REG_CFG_DONE; //0xa0 REGISTER CONFIG FINISH - unsigned int reserved1[(0x100-0xa4)/4]; - unsigned int MCU_BYPASS_WPORT; //0x100 MCU BYPASS MODE, DATA Write Only Port - unsigned int reserved2[(0x200-0x104)/4]; - unsigned int MCU_BYPASS_RPORT; //0x200 MCU BYPASS MODE, DATA Read Only Port -} LCDC_REG, *pLCDC_REG; - -//roate -#define ROTATE_0 0 -#define ROTATE_90 90 -#define ROTATE_180 180 -#define ROTATE_270 270 -#define X_MIRROR (1<<10) -#define Y_MIRROR (1<<11) - - -extern void __init rk29_add_device_lcdc(void); -extern int mcu_ioctl(unsigned int cmd, unsigned long arg); - -#define RK29FB_EVENT_HDMI_ON 1 -#define RK29FB_EVENT_HDMI_OFF 2 -#define RK29FB_EVENT_FB1_ON 3 -#define RK29FB_EVENT_FB1_OFF 4 -#include -int rk29fb_register_notifier(struct notifier_block *nb); -int rk29fb_unregister_notifier(struct notifier_block *nb); - -#endif