2021-11-21 00:20:20 +00:00

2524 lines
57 KiB
C

/*
* drivers/input/keyboard/epaper.c
* AUO epaper Interface on S3C2416 in Qisda eBook
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive
* for more details.
*/
#include "epaper.h"
#ifdef EPAPER_BOOT_CODE
#include <common.h>
#include <regs.h>
#include <asm/io.h>
#else //KERNEL
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/input.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/delay.h>
#include <asm/irq.h>
#include <asm/arch/regs-gpio.h>
#include <asm/arch/regs-timer.h>
#include <asm/arch/regs-lcd.h>
#include <asm/arch/regs-watchdog.h>
#include <linux/clk.h>
#endif
//#define S3C_EPAPER_QISDA_DEBUG
#ifdef S3C_EPAPER_QISDA_DEBUG
#ifdef EPAPER_BOOT_CODE
#define DPRINTK(x...) //Be careful of code size if printf too much
#else //KERNEL
#define DPRINTK(x...) printk("S3C-Epaper-qisda " x)
#endif
#else
#define DPRINTK(x...) /* !!!! */
#endif
#ifdef EPAPER_BOOT_CODE
#define rGPCCON GPCCON
#define rGPCDAT GPCDAT
#define rGPDCON GPDCON
#define rGPDDAT GPDDAT
#define rGPCUDP GPCPU
#define rGPDUDP GPDPU
#define rGPLDAT GPLDAT
#define rGPLCON GPLCON
#define rGPLUDP GPLPU
#define rGPBCON GPBCON
#define rGPBDAT GPBDAT
#define rGPGCON GPGCON
#define rGPGDAT GPGDAT
#define rGPECON GPECON
#define rGPEDAT GPEDAT
#define rGPFCON GPFCON
#define rGPFDAT GPFDAT
#define rVIDCON0 VIDCON0 //VIDEO CONTROL REGTISTER 0
#define rSYSIFCON0 SYSIFCON0 //SYSTEM INTERFACE MAIN LDI
#define rSYSIFCON1 SYSIFCON1 //SYSTEM INTERFACE SUB LDI
#define rSIFCCON0 SIFCCON0 //SYSTEM INTERFACE COMMAND CONTROL
#define rSIFCCON1 SIFCCON1 //SYSTEM IF COMMAND DATA WRITE CONTROL
#define rSIFCCON2 SIFCCON2
#else //KERNEL
#define rGPCCON S3C2410_GPCCON
#define rGPCDAT S3C2410_GPCDAT
#define rGPDCON S3C2410_GPDCON
#define rGPDDAT S3C2410_GPDDAT
#define rGPCUDP S3C2410_GPCUP
#define rGPDUDP S3C2410_GPDUP
#define rGPLDAT S3C2410_GPLDAT
#define rGPLCON S3C2410_GPLCON
#define rGPLUDP S3C2410_GPLUP
#define rGPBCON S3C2410_GPBCON
#define rGPBDAT S3C2410_GPBDAT
#define rGPBUDP S3C2410_GPBUP
#define rGPGCON S3C2410_GPGCON
#define rGPGDAT S3C2410_GPGDAT
#define rGPECON S3C2410_GPECON
#define rGPEDAT S3C2410_GPEDAT
#define rGPFCON S3C2410_GPFCON
#define rGPFDAT S3C2410_GPFDAT
#define rTCFG0 S3C2410_TCFG0 //Configures the two 8-bit presclers
#define rTCFG1 S3C2410_TCFG1 //5-MUX & DMA mode selecton
#define rTCNTB3 S3C2410_TCNTB(3) //Timer 3 count buffer
#define rTCMPB3 S3C2410_TCMPB(3) //Timer 3 compare buffer
#define rTCON S3C2410_TCON //Timer control
#define rVIDCON0 S3C_VIDCON0 //VIDEO CONTROL REGTISTER 0
#define rSYSIFCON0 S3C_SYSIFCON0 //SYSTEM INTERFACE MAIN LDI
#define rSYSIFCON1 S3C_SYSIFCON1 //SYSTEM INTERFACE SUB LDI
#define rSIFCCON0 S3C_SIFCCON0 //SYSTEM INTERFACE COMMAND CONTROL
#define rSIFCCON1 S3C_SIFCCON1 //SYSTEM IF COMMAND DATA WRITE CONTROL
#define rSIFCCON2 S3C_SIFCCON2
#define rVIDTCON2 S3C_VIDTCON2
#endif
#define I80_LANDSCAPE_CS_SETUP (0)
#define I80_LANDSCAPE_WR_SETUP (0)
#define I80_LANDSCAPE_WR_ACT (1)
#define I80_LANDSCAPE_WR_HOLD (0)
#define I80_PORTRAIT_CS_SETUP (0)
#define I80_PORTRAIT_WR_SETUP (2+1) //+1
#define I80_PORTRAIT_WR_ACT (6+2) //+2
#define I80_PORTRAIT_WR_HOLD (2+1) //+1
#define I80_LANDSCAPE_HANDWRITING_CS_SETUP (0)
#define I80_LANDSCAPE_HANDWRITING_WR_SETUP (1)
#define I80_LANDSCAPE_HANDWRITING_WR_ACT (1)
#define I80_LANDSCAPE_HANDWRITING_WR_HOLD (0)
#define I80_PORTRAIT_HANDWRITING_CS_SETUP (0)
#define I80_PORTRAIT_HANDWRITING_WR_SETUP (2)
#define I80_PORTRAIT_HANDWRITING_WR_ACT (6)
#define I80_PORTRAIT_HANDWRITING_WR_HOLD (2)
#define VIDTCON2_LINEVAL_S (11)
#define VIDTCON2_HOZVAL_S (0)
#define VIDCON0_S_CPU_IF_MAIN (2<<22)
#define VIDCON0_S_RGB_PAR (0<<13)
#define VIDCON0_S_VCLK_GATING_OFF (1<<5)
#define VIDCON0_S_CLKDIR_DIVIDED (1<<4)
#define VIDCON0_S_CLKSEL_HCLK (0<<2)
#define VIDCON0_CLKVAL_F_SHIFT (6)
#define VIDCON0_ENVID_ENABLE (1<<1)
#define VIDCON0_ENVID_F_ENABLE (1<<0)
#define SYS_WR_CON (1<<6)
#define SYS_OE_CON (1<<7)
#define rWTCON S3C2410_WTCON //Watch-dog timer mode
#define rWTDAT S3C2410_WTDAT //Watch-dog timer data
#define rWTCNT S3C2410_WTCNT //Watch-dog timer count
#define LCD_DELAY_1MS 18000
#define BUSY_WAIT_TIMEOUT (40*5*2) //panel time out = 1s
#define PROGRESS_BAR_X (29)
#define PROGRESS_BAR_Y (769)
#define PROGRESS_BAR_W (563-28)
#define PROGRESS_BAR_H (785-769)
#define PROGRESS_BAR_90_X (101)
#define PROGRESS_BAR_90_Y (301)
#define PROGRESS_BAR_90_W (400)
#define PROGRESS_BAR_90_H (60)
#define PROGRESS_BAR_FRAME_LINE_W 8
/* Compat tools */
#define tcon_ndelay nDelay
static int tcon_inPortraitMode = 0;
#define tcon_set_write_to_data _SetWriteToData
/*******/
typedef enum {
EN_I80_NONE = -1,
EN_I80_LANDSCAPE = 0,
EN_I80_PORTRAIT,
EN_I80_LANDSCAPE_HANDWRITING,
EN_I80_PORTRAIT_HANDWRITING,
}I80_HWE_SPEED_MODE;
//Global var
static int delayLoopCount =150;//2M
static int partial_update_mode = PARTIAL_DSP_MODE_0;
static int gUser_h_resolution = AUO_EPAPER_PHYSICAL_H_RESOLUTION; //This is logic resolution, not PHYSICAL resolution, depand on rotation degree
static int gUser_v_resolution = AUO_EPAPER_PHYSICAL_V_RESOLUTION; //This is logic resolution, not PHYSICAL resolution, depand on rotation degree
static int gRotateDegree = 0;
static unsigned char lcd_vbpd=0,lcd_vfpd=0,lcd_vspw=0,lcd_hbpd=0,lcd_hfpd=0,lcd_hspw=0;
static unsigned short lcd_horizon_value=0,lcd_line_value=0;
static unsigned char lcd_cs_setup=0,lcd_wr_setup=0,lcd_wr_act=0,lcd_wr_hold=0;
static unsigned char lcd_frame_rate=50;
static I80_HWE_SPEED_MODE gI80_Current_Speed = EN_I80_NONE;
#ifdef EPAPER_BOOT_CODE
//extern unsigned short Loading_Data[];
#else
extern unsigned short shutdown[];
EXPORT_SYMBOL(Epaper_Shutdown_Logo);
EXPORT_SYMBOL(Epaper_Get_Partial_Update_Mode);
EXPORT_SYMBOL(Epaper_Power);
EXPORT_SYMBOL(Epaper_Draw_Point);
#endif
/*
1. loops = 1 --> 25ns
2. loops = 75 --> 1 us
3. loops = 100000 --> 1ms
*/
static inline void nDelay(unsigned long loops) //in ns
{
int i;
__asm__ volatile ("1:\n" "subs %0, %1, #1\n" "bne 1b":"=r" (loops):"0"(loops));
}
static void __mDelay(unsigned long mTime)
{
unsigned long cnt=0;
for(cnt=0;cnt<mTime;cnt++)
nDelay(100000);
}
static void __uDelay(unsigned long uTime)
{
unsigned long cnt=0;
for(cnt=0;cnt<uTime;cnt++)
nDelay(75);
}
void Epaper_Set_I80_Default_Speed(I80_HWE_SPEED_MODE i80_speed, unsigned short w, unsigned short h);
void Epaper_Change_I80_Speed(I80_HWE_SPEED_MODE i80_speed, unsigned short w, unsigned short h)
{
unsigned long tmp;
unsigned char clkval=0;
unsigned short h_cnt,v_cnt;
unsigned long vclk;
struct clk *lcd_clock;
int HCLK ;
if(gI80_Current_Speed == EN_I80_NONE)
{
Epaper_Set_I80_Default_Speed(i80_speed, w, h);
return;
}
lcd_line_value = h;
if((w%32) != 0) //DMA use WINCONx_4WORD_BURST, i.e. 16 bytes, i.e. 32 pixel
w += 32 - (w%32);
//printk("\nNew ( %d, %d)\n", w,h);
lcd_horizon_value = w;
switch(i80_speed)
{
default:
case EN_I80_LANDSCAPE:
lcd_cs_setup = I80_LANDSCAPE_CS_SETUP;
lcd_wr_setup = I80_LANDSCAPE_WR_SETUP;
lcd_wr_act = I80_LANDSCAPE_WR_ACT;
lcd_wr_hold = I80_LANDSCAPE_WR_HOLD;
break;
case EN_I80_PORTRAIT:
lcd_cs_setup = I80_PORTRAIT_CS_SETUP;
lcd_wr_setup = I80_PORTRAIT_WR_SETUP;
lcd_wr_act = I80_PORTRAIT_WR_ACT;
lcd_wr_hold = I80_PORTRAIT_WR_HOLD;
break;
case EN_I80_LANDSCAPE_HANDWRITING:
lcd_cs_setup = I80_LANDSCAPE_HANDWRITING_CS_SETUP;
lcd_wr_setup = I80_LANDSCAPE_HANDWRITING_WR_SETUP;
lcd_wr_act = I80_LANDSCAPE_HANDWRITING_WR_ACT;
lcd_wr_hold = I80_LANDSCAPE_HANDWRITING_WR_HOLD;
break;
case EN_I80_PORTRAIT_HANDWRITING:
lcd_cs_setup = I80_PORTRAIT_HANDWRITING_CS_SETUP;
lcd_wr_setup = I80_PORTRAIT_HANDWRITING_WR_SETUP;
lcd_wr_act = I80_PORTRAIT_HANDWRITING_WR_ACT;
lcd_wr_hold = I80_PORTRAIT_HANDWRITING_WR_HOLD;
break;
}
tmp = __raw_readl(rSYSIFCON0);
tmp = (lcd_cs_setup<<16)|(lcd_wr_setup<<12)|(lcd_wr_act<<8)|(lcd_wr_hold<<4)|(1<<2)|(1<<1)|(1);
__raw_writel(tmp, rSYSIFCON0);
tmp = __raw_readl(rSYSIFCON1);
tmp = (lcd_cs_setup<<16)|(lcd_wr_setup<<12)|(lcd_wr_act<<8)|(lcd_wr_hold<<4)|(1<<2)|(1<<1)|(1);
__raw_writel(tmp, rSYSIFCON1);
tmp = __raw_readl(rVIDTCON2);
tmp = ((lcd_line_value-1)<<VIDTCON2_LINEVAL_S)|((lcd_horizon_value/4)-1);
__raw_writel(tmp, rVIDTCON2);
gI80_Current_Speed = i80_speed;
}
void Epaper_Set_I80_Default_Speed(I80_HWE_SPEED_MODE i80_speed, unsigned short w, unsigned short h)
{
unsigned long tmp;
unsigned char clkval=0;
unsigned short h_cnt,v_cnt;
unsigned long vclk;
struct clk *lcd_clock;
int HCLK ;
lcd_line_value = h;
lcd_horizon_value = w;
switch(i80_speed)
{
default:
case EN_I80_LANDSCAPE:
lcd_cs_setup = I80_LANDSCAPE_CS_SETUP;
lcd_wr_setup = I80_LANDSCAPE_WR_SETUP;
lcd_wr_act = I80_LANDSCAPE_WR_ACT;
lcd_wr_hold = I80_LANDSCAPE_WR_HOLD;
break;
case EN_I80_PORTRAIT:
lcd_cs_setup = I80_PORTRAIT_CS_SETUP;
lcd_wr_setup = I80_PORTRAIT_WR_SETUP;
lcd_wr_act = I80_PORTRAIT_WR_ACT;
lcd_wr_hold = I80_PORTRAIT_WR_HOLD;
break;
case EN_I80_LANDSCAPE_HANDWRITING:
lcd_cs_setup = I80_LANDSCAPE_HANDWRITING_CS_SETUP;
lcd_wr_setup = I80_LANDSCAPE_HANDWRITING_WR_SETUP;
lcd_wr_act = I80_LANDSCAPE_HANDWRITING_WR_ACT;
lcd_wr_hold = I80_LANDSCAPE_HANDWRITING_WR_HOLD;
break;
case EN_I80_PORTRAIT_HANDWRITING:
lcd_cs_setup = I80_PORTRAIT_HANDWRITING_CS_SETUP;
lcd_wr_setup = I80_PORTRAIT_HANDWRITING_WR_SETUP;
lcd_wr_act = I80_PORTRAIT_HANDWRITING_WR_ACT;
lcd_wr_hold = I80_PORTRAIT_HANDWRITING_WR_HOLD;
break;
}
tmp = __raw_readl(rVIDCON0);
tmp = VIDCON0_S_CPU_IF_MAIN|VIDCON0_S_RGB_PAR|VIDCON0_S_VCLK_GATING_OFF|\
VIDCON0_S_CLKDIR_DIVIDED|VIDCON0_S_CLKSEL_HCLK;
__raw_writel(tmp, rVIDCON0);
v_cnt = (lcd_vbpd+lcd_vfpd+lcd_vspw+lcd_line_value);
h_cnt = (lcd_hbpd+lcd_hfpd+lcd_hspw+lcd_horizon_value);
lcd_clock = clk_get(NULL, "hclk");
HCLK = clk_get_rate(lcd_clock);
//printk("\nHCLK=%d\n",HCLK);
clkval = (unsigned int)(HCLK/(v_cnt*h_cnt*lcd_frame_rate)); //clkval=3 if 1024*768*50
//clkval = 0x3f;
vclk = (HCLK/(clkval+1))/1000;
//DPRINTK("VCLK: %dKHz, clkval=%d\n",vclk, clkval);
/*if(clkval > 0x3f)
{
DPRINTK("!!! Check frame rate: clkval = %d, over flow !!!\n",clkval);
}*/
tmp = __raw_readl(rVIDCON0);
tmp |= (clkval <<VIDCON0_CLKVAL_F_SHIFT);
__raw_writel(tmp, rVIDCON0);
tmp = __raw_readl(rSYSIFCON0);
tmp = (lcd_cs_setup<<16)|(lcd_wr_setup<<12)|(lcd_wr_act<<8)|(lcd_wr_hold<<4)|(1<<2)|(1<<1)|(1);
__raw_writel(tmp, rSYSIFCON0);
tmp = __raw_readl(rSYSIFCON1);
tmp = (lcd_cs_setup<<16)|(lcd_wr_setup<<12)|(lcd_wr_act<<8)|(lcd_wr_hold<<4)|(1<<2)|(1<<1)|(1);
__raw_writel(tmp, rSYSIFCON1);
tmp = __raw_readl(rVIDTCON2);
tmp = ((lcd_line_value-1)<<VIDTCON2_LINEVAL_S)|((lcd_horizon_value/4)-1);
__raw_writel(tmp, rVIDTCON2);
gI80_Current_Speed = i80_speed;
}
#ifdef EPAPER_BOOT_CODE
void Epaper_Show_Progress(int percent)
{
T_DISPLAY_FRAME stDisFrame;
int i;
unsigned short u16ProgressBar_x, u16ProgressBar_y, u16ProgressBar_w, u16ProgressBar_h;
static unsigned short progress_bar[PROGRESS_BAR_W*PROGRESS_BAR_H/4];
int line_bytes;
return;
memset((unsigned char*)progress_bar, 0xff, PROGRESS_BAR_W*PROGRESS_BAR_H/4*2);
switch(gRotateDegree)
{
default:
case 0:
{
u16ProgressBar_x = PROGRESS_BAR_X;
u16ProgressBar_y = PROGRESS_BAR_Y;
u16ProgressBar_w = PROGRESS_BAR_W;
u16ProgressBar_h = PROGRESS_BAR_H;
line_bytes = u16ProgressBar_w/4*2;
//draw percent
memset((unsigned char*)progress_bar+(u16ProgressBar_h-(u16ProgressBar_h/100*percent))*line_bytes, 0x0,
(u16ProgressBar_h/100*percent)*line_bytes);
break;
}
case 90:
{
int draw_len = 0;
u16ProgressBar_x = PROGRESS_BAR_90_X;
u16ProgressBar_y = PROGRESS_BAR_90_Y;
u16ProgressBar_w = PROGRESS_BAR_90_W;
u16ProgressBar_h = PROGRESS_BAR_90_H;
line_bytes = u16ProgressBar_w/4*2;
//draw percent
if((u16ProgressBar_w*percent/100)%4 != 0)
{
draw_len = (u16ProgressBar_w*percent/100) + (4)-((u16ProgressBar_w*percent/100)%4);
}
else
draw_len = (u16ProgressBar_w*percent/100);
for(i=0; i< u16ProgressBar_h; i++)
{
memset((unsigned char*)progress_bar + (u16ProgressBar_w/2)*i, 0x0, (draw_len/2));
}
break;
}
}
//draw top frame line, line width = 8
memset((unsigned char*)progress_bar, 0x0, PROGRESS_BAR_FRAME_LINE_W*line_bytes);
//draw right frame line, line width = 8
for(i=0;i<u16ProgressBar_h;i++)
{
memset(((unsigned char*)progress_bar)+((u16ProgressBar_w-PROGRESS_BAR_FRAME_LINE_W)/4*2)+(i*line_bytes), 0x0,
PROGRESS_BAR_FRAME_LINE_W/4*2);
}
//draw left frame line, line width = 8
for(i=0;i<u16ProgressBar_h;i++)
{
memset(((unsigned char*)progress_bar)+(i*line_bytes), 0x0, PROGRESS_BAR_FRAME_LINE_W/4*2);
}
//draw bottom frame line, line width = 8
memset((unsigned char*)progress_bar+(u16ProgressBar_h-PROGRESS_BAR_FRAME_LINE_W)*line_bytes, 0x0,
PROGRESS_BAR_FRAME_LINE_W*line_bytes);
//send data
partial_update_mode = 1;
stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
stDisFrame.tFrameRange.X = u16ProgressBar_x;
stDisFrame.tFrameRange.Y = u16ProgressBar_y;
stDisFrame.tFrameRange.W = u16ProgressBar_w;
stDisFrame.tFrameRange.H = u16ProgressBar_h;
stDisFrame.pFrameData = progress_bar;
if(is_Epaper_Write_Ready())
{
//DPRINTK("\nEpaper Progress %d",percent);
Epaper_Disp(stDisFrame);
}
}
void Epaper_Clean_Panel(void)
{
//unsigned short clean_frame[gUser_h_resolution*gUser_v_resolution/4];
unsigned short clean_frame[AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4];
T_DISPLAY_FRAME stDisFrame;
partial_update_mode = 0;
stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
stDisFrame.tFrameRange.X = 1;
stDisFrame.tFrameRange.Y = 1;
stDisFrame.tFrameRange.W = gUser_h_resolution;
stDisFrame.tFrameRange.H = gUser_v_resolution;
memset((unsigned char*)clean_frame, 0xff, AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4*2);
stDisFrame.pFrameData = clean_frame;
if(is_Epaper_Write_Ready())
{
//DPRINTK("\nEpaper clean panel");
Epaper_Disp(stDisFrame);
}
}
#else //KERNEL
void Epaper_Show_Progress(int percent)
{
T_DISPLAY_FRAME stDisFrame;
int i;
unsigned short u16ProgressBar_x, u16ProgressBar_y, u16ProgressBar_w, u16ProgressBar_h;
static unsigned short progress_bar[PROGRESS_BAR_W*PROGRESS_BAR_H/4];
int line_bytes;
return;
memset((unsigned char*)progress_bar, 0xff, PROGRESS_BAR_W*PROGRESS_BAR_H/4*2);
switch(gRotateDegree)
{
default:
case 0:
{
u16ProgressBar_x = PROGRESS_BAR_X;
u16ProgressBar_y = PROGRESS_BAR_Y;
u16ProgressBar_w = PROGRESS_BAR_W;
u16ProgressBar_h = PROGRESS_BAR_H;
line_bytes = u16ProgressBar_w/4*2;
//draw percent
memset((unsigned char*)progress_bar+(u16ProgressBar_h-(u16ProgressBar_h/100*percent))*line_bytes, 0x0,
(u16ProgressBar_h/100*percent)*line_bytes);
break;
}
case 90:
{
int draw_len = 0;
u16ProgressBar_x = PROGRESS_BAR_90_X;
u16ProgressBar_y = PROGRESS_BAR_90_Y;
u16ProgressBar_w = PROGRESS_BAR_90_W;
u16ProgressBar_h = PROGRESS_BAR_90_H;
line_bytes = u16ProgressBar_w/4*2;
//draw percent
if((u16ProgressBar_w*percent/100)%4 != 0)
{
draw_len = (u16ProgressBar_w*percent/100) + (4)-((u16ProgressBar_w*percent/100)%4);
}
else
draw_len = (u16ProgressBar_w*percent/100);
for(i=0; i< u16ProgressBar_h; i++)
{
memset((unsigned char*)progress_bar + (u16ProgressBar_w/2)*i, 0x0, (draw_len/2));
}
break;
}
}
//draw top frame line, line width = 8
memset((unsigned char*)progress_bar, 0x0, PROGRESS_BAR_FRAME_LINE_W*line_bytes);
//draw right frame line, line width = 8
for(i=0;i<u16ProgressBar_h;i++)
{
memset(((unsigned char*)progress_bar)+((u16ProgressBar_w-PROGRESS_BAR_FRAME_LINE_W)/4*2)+(i*line_bytes), 0x0,
PROGRESS_BAR_FRAME_LINE_W/4*2);
}
//draw left frame line, line width = 8
for(i=0;i<u16ProgressBar_h;i++)
{
memset(((unsigned char*)progress_bar)+(i*line_bytes), 0x0, PROGRESS_BAR_FRAME_LINE_W/4*2);
}
//draw bottom frame line, line width = 8
memset((unsigned char*)progress_bar+(u16ProgressBar_h-PROGRESS_BAR_FRAME_LINE_W)*line_bytes, 0x0,
PROGRESS_BAR_FRAME_LINE_W*line_bytes);
//send data
partial_update_mode = 1;
stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
stDisFrame.tFrameRange.X = u16ProgressBar_x;
stDisFrame.tFrameRange.Y = u16ProgressBar_y;
stDisFrame.tFrameRange.W = u16ProgressBar_w;
stDisFrame.tFrameRange.H = u16ProgressBar_h;
stDisFrame.pFrameData = progress_bar;
if(is_Epaper_Write_Ready())
{
//DPRINTK("\nEpaper Progress %d",percent);
Epaper_Disp(stDisFrame);
}
}
void Epaper_Clean_Panel(void)
{
//unsigned short clean_frame[gUser_h_resolution*gUser_v_resolution/4];
static unsigned short clean_frame[AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4];
T_DISPLAY_FRAME stDisFrame;
partial_update_mode = 0;
stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
stDisFrame.tFrameRange.X = 1;
stDisFrame.tFrameRange.Y = 1;
stDisFrame.tFrameRange.W = gUser_h_resolution;
stDisFrame.tFrameRange.H = gUser_v_resolution;
memset((unsigned char*)clean_frame, 0xff, AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4*2);
stDisFrame.pFrameData = clean_frame;
if(is_Epaper_Write_Ready())
{
//DPRINTK("\nEpaper clean panel");
Epaper_Disp(stDisFrame);
}
}
void Epaper_Pre_Display_Image(void)
{
//unsigned short clean_frame[gUser_h_resolution*gUser_v_resolution/4];
static unsigned short clean_frame[AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4];
T_DISPLAY_FRAME stDisFrame;
partial_update_mode = 0;
stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PRE_DISPLAY_START;
stDisFrame.tFrameRange.X = 1;
stDisFrame.tFrameRange.Y = 1;
stDisFrame.tFrameRange.W = gUser_h_resolution;
stDisFrame.tFrameRange.H = gUser_v_resolution;
memset((unsigned char*)clean_frame, 0xff, AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4*2);
stDisFrame.pFrameData = clean_frame;
if(is_Epaper_Write_Ready())
{
//DPRINTK("\nEpaper clean panel");
Epaper_Disp(stDisFrame);
}
}
void Epaper_Shutdown_Logo(void)
{
#if 0
T_DISPLAY_FRAME stDisFrame;
stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
partial_update_mode = 0;
stDisFrame.tFrameRange.X = 1;
stDisFrame.tFrameRange.Y = 1;
stDisFrame.tFrameRange.W = gUser_h_resolution;
stDisFrame.tFrameRange.H = gUser_v_resolution;
stDisFrame.pFrameData = shutdown;
if(is_Epaper_Write_Ready())
{
printk("\nEpaper shutdown logo");
Epaper_Disp(stDisFrame);
}
#else
static unsigned short clean_frame[AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4];
//static unsigned short clean_frame[1024*768/4];
T_DISPLAY_FRAME stDisFrame;
partial_update_mode = 0;
stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
stDisFrame.tFrameRange.X = 1;
stDisFrame.tFrameRange.Y = 1;
stDisFrame.tFrameRange.W = gUser_h_resolution;
stDisFrame.tFrameRange.H = gUser_v_resolution;
memset((unsigned char*)clean_frame, 0x00, AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4*2);
stDisFrame.pFrameData = clean_frame;
if(is_Epaper_Write_Ready())
{
//DPRINTK("\nEpaper clean panel");
Epaper_Disp(stDisFrame);
}
#endif
}
void Epaper_Draw_Point(int x, int y)
{
unsigned short pint_data[4*4/4];
T_DISPLAY_FRAME stDisFrame;
if( ((x/2)*2) == x)
return;
stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
partial_update_mode = 4;
stDisFrame.tFrameRange.X = x;
stDisFrame.tFrameRange.Y = y;
stDisFrame.tFrameRange.W = 4;
stDisFrame.tFrameRange.H = 4;
stDisFrame.pFrameData = pint_data;
if(is_Epaper_Write_Ready())
{
Epaper_Disp(stDisFrame);
}
}
#endif //EPAPER_BOOT_CODE
//This is logic resolution, not PHYSICAL resolution, depand on rotation degree
void Epaper_Set_Resolution(int h_res, int v_res)
{
gUser_h_resolution = h_res;
gUser_v_resolution = v_res;
}
int is_Epaper_Write_Ready_No_Wait(void)
{
unsigned long tmp;
int iBusyCnt=0;
tmp = __raw_readl(rGPBDAT);
if((tmp & (1<<2))==0)
{
//DPRINTK("<= BAN =>panel is BUSY\n");
return 0;
}
return 1;
}
int is_Epaper_Write_Ready(void)
{
unsigned long tmp;
int iBusyCnt=0;
int i=0;
wait_queue_head_t busy_wq;
init_waitqueue_head(&busy_wq);
tmp = __raw_readl(rGPBDAT);
while((tmp & (1<<2))==0)
{
//DPRINTK("<= BAN =>panel is BUSY\n");
sleep_on_timeout(&busy_wq, 4);
//msleep(100);
/*for(i=0; i<20; i++)
__mDelay(1);*/
iBusyCnt ++;
if(iBusyCnt>= BUSY_WAIT_TIMEOUT)
{
//DPRINTK("<= BAN =>Panel Disp Fail: BUSY time out\n");
return 0;
}
tmp = __raw_readl(rGPBDAT);
}
return 1;
}
int is_Epaper_Write_Ready_Wait(unsigned long waitTime) //ms
{
unsigned long tmp;
int iBusyCnt=0;
int i=0;
wait_queue_head_t busy_wq;
init_waitqueue_head(&busy_wq);
tmp = __raw_readl(rGPBDAT);
while((tmp & (1<<2))==0)
{
sleep_on_timeout(&busy_wq, 4);
//DPRINTK("<= BAN =>panel is BUSY\n");
//msleep(100);
/*for(i=0; i<20; i++)
__mDelay(1);*/
iBusyCnt ++;
if(iBusyCnt>= (waitTime/20))
{
DPRINTK("<= BAN =>Panel Disp Fail: BUSY time out\n");
return 0;
}
tmp = __raw_readl(rGPBDAT);
}
return 1;
}
int is_Epaper_Write_Ready_Busy_Wait(unsigned long waitTime) //ms
{
unsigned long tmp;
int iBusyCnt=0;
int i=0;
wait_queue_head_t busy_wq;
init_waitqueue_head(&busy_wq);
tmp = __raw_readl(rGPBDAT);
while((tmp & (1<<2))==0)
{
//sleep_on_timeout(&busy_wq, 4);
//DPRINTK("<= BAN =>panel is BUSY\n");
//msleep(100);
for(i=0; i<20; i++)
__mDelay(1);
iBusyCnt ++;
if(iBusyCnt>= (waitTime/20))
{
DPRINTK("<= BAN =>Panel Disp Fail: BUSY time out\n");
return 0;
}
tmp = __raw_readl(rGPBDAT);
}
return 1;
}
static inline void s3c2416_i80_write(int data)
{
int tmp;
tmp = __raw_readl(rSIFCCON0); // nWE enable
tmp |= SYS_WR_CON;
__raw_writel(tmp, rSIFCCON0);
if ( !tcon_inPortraitMode )
tcon_ndelay(25);
__raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
tmp = __raw_readl(rSIFCCON0); // nWE disables
tmp &= ~SYS_WR_CON;
__raw_writel(tmp, rSIFCCON0);
}
static inline void s3c2416_i80_write_Rotate(int data)
{
int tmp;
tmp = __raw_readl(rSIFCCON0); // nWE enable
tmp |= SYS_WR_CON;
__raw_writel(tmp, rSIFCCON0);
//__uDelay(1);
nDelay(25); //down to 1.5M
__raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
tmp = __raw_readl(rSIFCCON0); // nWE disable
tmp &= ~SYS_WR_CON;
__raw_writel(tmp, rSIFCCON0);
}
static inline void s3c2416_i80_write_HandWriting(int data)
{
int tmp;
tmp = __raw_readl(rSIFCCON0); // nWE enable
tmp |= SYS_WR_CON;
__raw_writel(tmp, rSIFCCON0);
nDelay(15); //down to 2M
__raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
tmp = __raw_readl(rSIFCCON0); // nWE disable
tmp &= ~SYS_WR_CON;
__raw_writel(tmp, rSIFCCON0);
}
static inline void s3c2416_i80_write_Rotate_HandWriting(int data)
{
int tmp;
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nWE enable
tmp |= SYS_WR_CON;
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
__raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
tmp = __raw_readl(rSIFCCON0); // nWE disable
tmp &= ~SYS_WR_CON;
__raw_writel(tmp, rSIFCCON0);
}
static inline void s3c2416_i80_write_LUT(int data)
{
int tmp;
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nWE enable
tmp |= SYS_WR_CON;
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
__raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nWE disable
tmp &= ~SYS_WR_CON;
__raw_writel(tmp, rSIFCCON0);
}
static inline void s3c2416_i80_read(unsigned short* data)
{
int tmp;
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nRD enable
tmp |= SYS_OE_CON;
__raw_writel(tmp, rSIFCCON0);
//__mDelay(1); //Ivan : must do
__uDelay(1);
*data = __raw_readl(rSIFCCON2); //CMD = rSIFCCON2;
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nRD disable
tmp &= ~SYS_OE_CON;
__raw_writel(tmp, rSIFCCON0);
}
static int DISP_CMD_OUT(unsigned short CMD, unsigned short* pdata, int data_length)
{
unsigned long tmp;
unsigned long cnt;
int ret = 0;
tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
tmp |= (1<<2);
__raw_writel(tmp, rSYSIFCON0);
tmp = __raw_readl(rSIFCCON0); // command mode enable
tmp |= (1<<0);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
tmp |= (1<<8);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // RS low
tmp &= ~(1<<1);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nWE enable
tmp |= (1<<6);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
__raw_writel(CMD, rSIFCCON1); //rSIFCCON1 = CMD;
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nWE disable
tmp &= ~(1<<6);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // RS Hi
tmp |= (1<<1);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
if(data_length > 0)
{
switch(CMD)
{
case AUO_EPAPER_CMD_INIT:
{
s3c2416_i80_write(*pdata);
break;
}
case AUO_EPAPER_CMD_LUT_START:
{
for(cnt=0;cnt<data_length;cnt++)
{
__uDelay(1);
if(is_Epaper_Write_Ready_Busy_Wait(10000))
{
__uDelay(1);
s3c2416_i80_write_LUT((unsigned short)pdata[cnt]);
}
else
{
DPRINTK("EPD: Can not send LUT data\n");
ret = -1;
goto DISP_CMD_OUT_ERROR;
}
}
if(is_Epaper_Write_Ready())
{
tmp = __raw_readl(rSIFCCON0); //rSIFCCON0 &= ~(1<<1); // RS low
tmp &= ~(1<<1); // RS low
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
s3c2416_i80_write(AUO_EPAPER_CMD_LUT_STOP);
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // RS Hi
tmp |= (1<<1);
__raw_writel(tmp, rSIFCCON0);
}
else
{
DPRINTK("EPD: Can not send AUO_EPAPER_CMD_LUT_STOP\n");
ret = -1;
goto DISP_CMD_OUT_ERROR;
}
break;
}
default:
DPRINTK("unkonwn command\n");
break;
}
}
DISP_CMD_OUT_ERROR:
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
}
//Send 1 command and read parameters
static void DISP_DATA_IN(unsigned short CMD, unsigned short* val_array, int val_count)
{
unsigned long tmp;
int cnt;
tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
tmp |= (1<<2);
__raw_writel(tmp, rSYSIFCON0);
tmp = __raw_readl(rSIFCCON0); // command mode enable
tmp |= (1<<0);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
tmp |= (1<<8);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // RS low
tmp &= ~(1<<1);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nWE enable
tmp |= (1<<6);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
__raw_writel(CMD, rSIFCCON1); //rSIFCCON1 = CMD;
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nWE disable
tmp &= ~(1<<6);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // RS Hi
tmp |= (1<<1);
__raw_writel(tmp, rSIFCCON0);
switch(CMD)
{
case AUO_EPAPER_CMD_TEMPER:
{
for(cnt=0;cnt<val_count;cnt++)
{
__mDelay(1);
s3c2416_i80_read(&val_array[cnt]);
}
break;
}
case AUO_EPAPER_CMD_LUT_READ:
{
DPRINTK("\nLUT Read");
for(cnt=0;cnt<val_count;cnt++)
{
if(is_Epaper_Write_Ready())
{
s3c2416_i80_read(&val_array[cnt]);
}
}
if(is_Epaper_Write_Ready())
{
tmp = __raw_readl(rSIFCCON0); //rSIFCCON0 &= ~(1<<1); // RS low
tmp &= ~(1<<1); // RS low
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
s3c2416_i80_write(AUO_EPAPER_CMD_LUT_STOP);
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // RS Hi
tmp |= (1<<1);
__raw_writel(tmp, rSIFCCON0);
}
break;
}
default:
DPRINTK("unkonwn command\n");
break;
}
__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
}
static DISP_DATA_OUT(unsigned short CMD, unsigned short* pdata, T_DISPLAY_REGION REGION)
{
unsigned long tmp;
unsigned long cnt;
tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
tmp |= (1<<2);
__raw_writel(tmp, rSYSIFCON0);
tmp = __raw_readl(rSIFCCON0); // command mode enable
tmp |= (1<<0);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
tmp |= (1<<8);
__raw_writel(tmp, rSIFCCON0);
//__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // RS low
tmp &= ~(1<<1);
__raw_writel(tmp, rSIFCCON0);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
DPRINTK("busy...\n");
if(!is_Epaper_Write_Ready())
{
//busy
tmp = __raw_readl(rSIFCCON0); // RS Hi
tmp |= (1<<1);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//end
//__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nWE enable
tmp |= (1<<6);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
DPRINTK("busy...\n");
if(!is_Epaper_Write_Ready())
{
//busy
//__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nWE disable
tmp &= ~(1<<6);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // RS Hi
tmp |= (1<<1);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//end
__raw_writel(CMD, rSIFCCON1); //rSIFCCON1 = CMD;
//__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nWE disable
tmp &= ~(1<<6);
__raw_writel(tmp, rSIFCCON0);
//__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // RS Hi
tmp |= (1<<1);
__raw_writel(tmp, rSIFCCON0);
__mDelay(1);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
DPRINTK("busy...\n");
if(!is_Epaper_Write_Ready())
{
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//end
/* BAN 20090406 + for test panel*/
switch(CMD)
{
case AUO_EPAPER_CMD_FULLDISP:
{
break;
}
case AUO_EPAPER_CMD_PARTIALDISP:
case AUO_EPAPER_CMD_PRE_DISPLAY_START:
{
unsigned short current_mode=0;
DPRINTK("<= BAN =>AUO_EPAPER_CMD_PARTIALDISP, region=(%d(%d,%d) %d X %d)\n",partial_update_mode, REGION.X,REGION.Y,REGION.W,REGION.H);
//__uDelay(1);
//MOD + X
current_mode = ((unsigned short)partial_update_mode )<<12;
//if(partial_update_mode == PARTIAL_DSP_MODE_4)
// current_mode |= 0x8000; //Set "Write"
__mDelay(1);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
DPRINTK("busy...\n");
if(!is_Epaper_Write_Ready())
{
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//end
printk(" EPAPER: ---- RX: 0x%04X\n", current_mode|REGION.X);
s3c2416_i80_write(current_mode|REGION.X);
__mDelay(1);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
DPRINTK("busy...\n");
if(!is_Epaper_Write_Ready())
{
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//Y
printk(" EPAPER: ---- RY: 0x%04X\n", REGION.Y);
s3c2416_i80_write(REGION.Y);
__mDelay(1);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
DPRINTK("busy...\n");
if(!is_Epaper_Write_Ready())
{
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//W
printk(" EPAPER: ---- RW: 0x%04X\n", REGION.W);
s3c2416_i80_write(REGION.W);
__mDelay(1);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
DPRINTK("busy...\n");
if(!is_Epaper_Write_Ready())
{
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//H
printk(" EPAPER: ---- RH: 0x%04X\n", REGION.H);
s3c2416_i80_write(REGION.H);
__mDelay(1);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
DPRINTK("busy...\n");
if(!is_Epaper_Write_Ready())
{
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
if((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W))
{
DPRINTK("busy...\n");
if(gRotateDegree!=0)
{
DPRINTK("\nHand writing + Rotate");
for(cnt=0; cnt<(REGION.W*REGION.H/4); cnt++)
{
s3c2416_i80_write_Rotate_HandWriting((unsigned short)pdata[cnt]); //rSIFCCON1 = CMD;
}
}
else
{
DPRINTK("\nHand writing");
for(cnt=0; cnt<(REGION.W*REGION.H/4); cnt++)
{
s3c2416_i80_write_HandWriting((unsigned short)pdata[cnt]); //rSIFCCON1 = CMD;
}
}
}
else if(gRotateDegree!=0)
{
DPRINTK("\nRotate");
for(cnt=0; cnt<(REGION.W*REGION.H/4); cnt++)
{
s3c2416_i80_write_Rotate((unsigned short)pdata[cnt]); //rSIFCCON1 = CMD;
}
}
else
{
DPRINTK("\nnormal");
for(cnt=0; cnt<(REGION.W*REGION.H/4); cnt++)
{
s3c2416_i80_write((unsigned short)pdata[cnt]); //rSIFCCON1 = CMD;
}
}
break;
}
case AUO_EPAPER_CMD_STOP:
break;
default:
DPRINTK("unkonwn command\n");
break;
}
/* BAN 20090406 + for test panel*/
// STOP
tmp = __raw_readl(rSIFCCON0); //rSIFCCON0 &= ~(1<<1); // RS low
tmp &= ~(1<<1); // RS low
__raw_writel(tmp, rSIFCCON0);
//__uDelay(1);
switch(CMD)
{
default:
case AUO_EPAPER_CMD_PARTIALDISP:
{
s3c2416_i80_write(AUO_EPAPER_CMD_STOP);
break;
}
case AUO_EPAPER_CMD_PRE_DISPLAY_START:
{
s3c2416_i80_write(AUO_EPAPER_CMD_PRE_DISPLAY_STOP);
break;
}
}
//__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // RS Hi
tmp |= (1<<1);
__raw_writel(tmp, rSIFCCON0);
//__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
return 0;
}
//Send mode, x, y, w, h only
static int DISP_PRE_DATA_OUT(unsigned short CMD, T_DISPLAY_REGION REGION)
{
unsigned long tmp;
unsigned long cnt;
unsigned short current_mode=0;
if((CMD != AUO_EPAPER_CMD_PARTIALDISP) && (CMD != AUO_EPAPER_CMD_PRE_DISPLAY_START))
return -1;
tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
tmp |= (1<<2);
__raw_writel(tmp, rSYSIFCON0);
tmp = __raw_readl(rSIFCCON0); // command mode enable
tmp |= (1<<0);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
tmp |= (1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // RS low
tmp &= ~(1<<1);
__raw_writel(tmp, rSIFCCON0);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
if(!is_Epaper_Write_Ready())
{
//busy
tmp = __raw_readl(rSIFCCON0); // RS Hi
tmp |= (1<<1);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//end
tmp = __raw_readl(rSIFCCON0); // nWE enable
tmp |= (1<<6);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
if(!is_Epaper_Write_Ready())
{
//busy
//__uDelay(1);
tmp = __raw_readl(rSIFCCON0); // nWE disable
tmp &= ~(1<<6);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // RS Hi
tmp |= (1<<1);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//end
__raw_writel(CMD, rSIFCCON1); //rSIFCCON1 = CMD;
tmp = __raw_readl(rSIFCCON0); // nWE disable
tmp &= ~(1<<6);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // RS Hi
tmp |= (1<<1);
__raw_writel(tmp, rSIFCCON0);
__mDelay(1);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
if(!is_Epaper_Write_Ready())
{
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//end
//MOD + X
//partial_update_mode = 0xC;
current_mode = ((unsigned short)partial_update_mode )<<12;
__mDelay(1);
s3c2416_i80_write(current_mode|REGION.X);
__mDelay(1);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
if(!is_Epaper_Write_Ready())
{
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//end
//Y
s3c2416_i80_write(REGION.Y);
__mDelay(1);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
if(!is_Epaper_Write_Ready())
{
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//end
//W
s3c2416_i80_write(REGION.W);
__mDelay(1);
//check busy again
if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
{
if(!is_Epaper_Write_Ready())
{
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
DPRINTK("ERROR, Still BUSY");
return -1;
}
}
//end
//H
s3c2416_i80_write(REGION.H);
__mDelay(1);
//printk("\nEPAPER (x,y,w,h)=(%d,%d,%d,%d)\n", REGION.X, REGION.Y, REGION.W, REGION.H);
if((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W))
{
if(gRotateDegree!=0) //Rotate + handwriting
{
Epaper_Change_I80_Speed(EN_I80_PORTRAIT_HANDWRITING, REGION.W, REGION.H);
}
else //only handwriting
{
Epaper_Change_I80_Speed(EN_I80_LANDSCAPE_HANDWRITING, REGION.W, REGION.H);
}
}
else
{
if(gRotateDegree!=0) //Rotate
{
Epaper_Change_I80_Speed(EN_I80_PORTRAIT, REGION.W, REGION.H);
}
else //not rotate
{
Epaper_Change_I80_Speed(EN_I80_LANDSCAPE, REGION.W, REGION.H);
}
}
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
tmp = __raw_readl(rSIFCCON0); // command mode disable //must do this, or HWE will not send
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
return 0;
}
void Epaper_SetLcdPort(void)
{
unsigned long tmp;
printk("TCON init - ");
// set gpio for lcd
tmp =__raw_readl(rGPCCON);
//tmp = (tmp & ~(0xffff03ff))|(0xaaaa02aa);
tmp = (tmp & ~(0xffff033f))|(0xaaaa022a); //Do not config SYS_CS1(GPC3)
__raw_writel(tmp, rGPCCON);
printk("Cybook Orizon Layout\n");
tmp =__raw_readl(rGPDCON); //tmp=0x40000
tmp = (tmp & ~(0x0CFFFF))|(0x04AAAA);
__raw_writel(tmp, rGPDCON); // GPD9 is RST_N
__raw_writel(0, rGPCUDP); //rGPCUDP = 0;
__raw_writel(0, rGPDUDP); //rGPDUDP = 0;
Epaper_Set_I80_Default_Speed(EN_I80_LANDSCAPE, AUO_EPAPER_PHYSICAL_H_RESOLUTION, AUO_EPAPER_PHYSICAL_V_RESOLUTION);
// POWER pin config
tmp =__raw_readl(rGPBCON);
tmp = (tmp & ~(3<<6))|(1<<6);
__raw_writel(tmp, rGPBCON);
// BUSY pin config
tmp =__raw_readl(rGPBCON);
tmp = (tmp & ~(3<<4));
__raw_writel(tmp, rGPBCON);
/*
tmp =__raw_readl(rGPBUDP);
tmp = (tmp & ~(3<<4));
//tmp = 0;
__raw_writel(tmp, rGPBUDP);*/
// SLEEP pin config
tmp =__raw_readl(rGPBCON);
tmp = (tmp & ~(3<<2))|(1<<2);
__raw_writel(tmp, rGPBCON);
__mDelay(1);
//SLEEP Pin High
/* tmp = __raw_readl(rGPBDAT);
tmp |= (1<<1);
__raw_writel(tmp, rGPBDAT);
udelay(1000);*/
// Panel power on
tmp = __raw_readl(rGPBDAT);
tmp |= (1<<3);
//SLP_N high
tmp |= (1<<1);
__raw_writel(tmp, rGPBDAT);
msleep(100);
// LCD module reset
tmp = __raw_readl(rGPDDAT);
tmp |= (1<<9);
__raw_writel(tmp, rGPDDAT);
tmp = __raw_readl(rGPDDAT); // goes to LOW
tmp &= ~(1<<9);
__raw_writel(tmp, rGPDDAT);
__uDelay(5);
tmp = __raw_readl(rGPDDAT); // goes to HIGH
tmp |= (1<<9);
__raw_writel(tmp, rGPDDAT);
// delay about 10ms
msleep(10);
}
void EPaper_CloseLcdPort(void)
{
unsigned long tmp;
//gpc0 input
s3c2410_gpio_pullup(S3C2410_GPC0,1);
s3c2410_gpio_cfgpin(S3C2410_GPC0, S3C2410_GPC0_INP);
//gpc1 input
s3c2410_gpio_pullup(S3C2410_GPC1,1);
s3c2410_gpio_cfgpin(S3C2410_GPC1, S3C2410_GPC1_INP);
//gpc2 input
s3c2410_gpio_pullup(S3C2410_GPC2,1);
s3c2410_gpio_cfgpin(S3C2410_GPC2, S3C2410_GPC2_INP);
//gpc4 input
s3c2410_gpio_pullup(S3C2410_GPC4,1);
s3c2410_gpio_cfgpin(S3C2410_GPC4, S3C2410_GPC4_INP);
//gpc8 input
s3c2410_gpio_pullup(S3C2410_GPC8,1);
s3c2410_gpio_cfgpin(S3C2410_GPC8, S3C2410_GPC8_INP);
//gpc9 input
s3c2410_gpio_pullup(S3C2410_GPC9,1);
s3c2410_gpio_cfgpin(S3C2410_GPC9, S3C2410_GPC9_INP);
//gpc10 input
s3c2410_gpio_pullup(S3C2410_GPC10,1);
s3c2410_gpio_cfgpin(S3C2410_GPC10, S3C2410_GPC10_INP);
//gpc11 input
s3c2410_gpio_pullup(S3C2410_GPC11,1);
s3c2410_gpio_cfgpin(S3C2410_GPC11, S3C2410_GPC11_INP);
//gpc12 input
s3c2410_gpio_pullup(S3C2410_GPC12,1);
s3c2410_gpio_cfgpin(S3C2410_GPC12, S3C2410_GPC12_INP);
//gpc13 input
s3c2410_gpio_pullup(S3C2410_GPC13,1);
s3c2410_gpio_cfgpin(S3C2410_GPC13, S3C2410_GPC13_INP);
//gpc14 input
s3c2410_gpio_pullup(S3C2410_GPC14,1);
s3c2410_gpio_cfgpin(S3C2410_GPC14, S3C2410_GPC14_INP);
//gpc15 input
s3c2410_gpio_pullup(S3C2410_GPC15,1);
s3c2410_gpio_cfgpin(S3C2410_GPC15, S3C2410_GPC15_INP);
//gpd0 input
s3c2410_gpio_pullup(S3C2410_GPD0,1);
s3c2410_gpio_cfgpin(S3C2410_GPD0, S3C2410_GPD0_INP);
//gpd1 input
s3c2410_gpio_pullup(S3C2410_GPD1,1);
s3c2410_gpio_cfgpin(S3C2410_GPD1, S3C2410_GPD1_INP);
//gpd2 input
s3c2410_gpio_pullup(S3C2410_GPD2,1);
s3c2410_gpio_cfgpin(S3C2410_GPD2, S3C2410_GPD2_INP);
//gpd3 input
s3c2410_gpio_pullup(S3C2410_GPD3,1);
s3c2410_gpio_cfgpin(S3C2410_GPD3, S3C2410_GPD3_INP);
//gpd4 input
s3c2410_gpio_pullup(S3C2410_GPD4,1);
s3c2410_gpio_cfgpin(S3C2410_GPD4, S3C2410_GPD4_INP);
//gpd5 input
s3c2410_gpio_pullup(S3C2410_GPD5,1);
s3c2410_gpio_cfgpin(S3C2410_GPD5, S3C2410_GPD5_INP);
//gpd6 input
s3c2410_gpio_pullup(S3C2410_GPD6,1);
s3c2410_gpio_cfgpin(S3C2410_GPD6, S3C2410_GPD6_INP);
//gpd7 input
s3c2410_gpio_pullup(S3C2410_GPD7,1);
s3c2410_gpio_cfgpin(S3C2410_GPD7, S3C2410_GPD7_INP);
//gpd9 output
s3c2410_gpio_pullup(S3C2410_GPD9,1);
s3c2410_gpio_cfgpin(S3C2410_GPD9, S3C2410_GPD9_OUTP);
s3c2410_gpio_setpin(S3C2410_GPD9,0);
//gpb1 input
s3c2410_gpio_pullup(S3C2410_GPB1,1);
s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_INP);
//gpb2 input
s3c2410_gpio_pullup(S3C2410_GPB2,1);
s3c2410_gpio_cfgpin(S3C2410_GPB2, S3C2410_GPB2_INP);
//gpb3 output
/*
s3c2410_gpio_pullup(S3C2410_GPB3,1);
s3c2410_gpio_cfgpin(S3C2410_GPB3, S3C2410_GPB3_OUTP);
s3c2410_gpio_setpin(S3C2410_GPB3,0);
*/
/*tmp = __raw_readl(rGPCDAT);
DPRINTK("\nGPC=0x%x", tmp);
tmp = __raw_readl(rGPDDAT);
DPRINTK("\nGPD=0x%x", tmp);*/
gRotateDegree = 0;
}
int Epaper_Disp(T_DISPLAY_FRAME tFrame)
{
unsigned long tmp;
int iBusyCnt=0;
DPRINTK("<= BAN =>I80 Write\n");
DISP_DATA_OUT(tFrame.u16EpaperCommand,tFrame.pFrameData,tFrame.tFrameRange);
return 0;
}
void Epaper_Set_Partial_Update_Mode(int mode)
{
partial_update_mode = mode;
}
int Epaper_Get_Partial_Update_Mode(void)
{
return partial_update_mode;
}
void Epaper_Enter_Standby_Mode(int isEnter)
{
unsigned long tmp;
if(isEnter)
{
//send 0x0001 to T-CON to enter standby mode
DISP_CMD_OUT(AUO_EPAPER_CMD_STANDBY, NULL, 0);
}
else
{
//send 0x0002 to T-CON to leave standby mode
DISP_CMD_OUT(AUO_EPAPER_CMD_WAKEUP, NULL, 0);
}
}
void Epaper_Enter_Sleep_Mode(int isEnter)
{
unsigned long tmp;
if(isEnter)
{
tmp = __raw_readl(rGPBDAT);
tmp &= ~(1<<1);
__raw_writel(tmp, rGPBDAT);
}
else
{
tmp = __raw_readl(rGPBDAT);
tmp |= (1<<1);
__raw_writel(tmp, rGPBDAT);
}
}
void Epaper_Power(int isEnable)
{
unsigned long tmp;
if(isEnable)
{
tmp = __raw_readl(rGPBDAT);
tmp |= (1<<3);
__raw_writel(tmp, rGPBDAT);
}
else
{
tmp = __raw_readl(rGPBDAT);
tmp &= ~(1<<3);
__raw_writel(tmp, rGPBDAT);
}
}
void Epaper_Read_R_TEMP(unsigned short* val0, unsigned short* val1, unsigned short* val2, unsigned short* val3)
{
unsigned long tmp;
unsigned short val[4];
memset(val, 0x0, 8);
DISP_DATA_IN(AUO_EPAPER_CMD_TEMPER, val, 4);
*val0 = val[0];
*val1 = val[1];
*val2 = val[2];
*val3 = val[3];
}
void Epaper_Display_Refresh(void)
{
DISP_CMD_OUT(AUO_EPAPER_CMD_REFRESH, NULL, 0);
}
int Epaper_Init(int h_Res, int v_Res, int temp_ave, int data_filter, int rotation, int data_inverse, int inputdata_arrangement, int outputdata_arrangement,int UD, int SHL)
{
unsigned short u16InitPara=0;
if(is_Epaper_Write_Ready())
{
//TEMP_AVE_EN
if((temp_ave != 0) && (temp_ave != 1))
return -1;
u16InitPara = u16InitPara | (temp_ave<<13);
//M23_FILTER
//ROT
gRotateDegree = rotation;
if(rotation == 0)
{
gUser_h_resolution = h_Res;
gUser_v_resolution = v_Res;
Epaper_Change_I80_Speed(EN_I80_LANDSCAPE, gUser_h_resolution, gUser_v_resolution);
}
else if(rotation == 90)
{
u16InitPara = u16InitPara | (1<<10);
gUser_h_resolution = v_Res;
gUser_v_resolution = h_Res;
Epaper_Change_I80_Speed(EN_I80_PORTRAIT, gUser_h_resolution, gUser_v_resolution);
}
else if(rotation == 180)
{
u16InitPara = u16InitPara | (2<<10);
gUser_h_resolution = h_Res;
gUser_v_resolution = v_Res;
Epaper_Change_I80_Speed(EN_I80_PORTRAIT, gUser_h_resolution, gUser_v_resolution); //not test
}
else if(rotation == 270)
{
u16InitPara = u16InitPara | (3<<10);
gUser_h_resolution = v_Res;
gUser_v_resolution = h_Res;
Epaper_Change_I80_Speed(EN_I80_PORTRAIT, gUser_h_resolution, gUser_v_resolution);//not test
}
else
{
gUser_h_resolution = h_Res;
gUser_v_resolution = v_Res;
Epaper_Change_I80_Speed(EN_I80_LANDSCAPE, gUser_h_resolution, gUser_v_resolution);
}
//DI
//BN
//CHDA
//RES
if(AUO_EPAPER_PHYSICAL_H_RESOLUTION==1024 && AUO_EPAPER_PHYSICAL_V_RESOLUTION==768)
u16InitPara = u16InitPara | (1<<2);
else if(AUO_EPAPER_PHYSICAL_H_RESOLUTION==800 && AUO_EPAPER_PHYSICAL_V_RESOLUTION==600)
{
}
else
{
}
//UD
//SHL
u16InitPara = u16InitPara | 1;
DISP_CMD_OUT(AUO_EPAPER_CMD_INIT, &u16InitPara, 1);
DPRINTK("\nInit size=%d, Init data =0x%x\n", sizeof(unsigned short),u16InitPara);
return 0;
}
return -1;
}
//u32LUTLength: length in (unsigned short)
int Epaper_Update_LUT(unsigned short* u16LUT, unsigned long u32LUTLength)
{
unsigned long cnt=0;
if(is_Epaper_Write_Ready_Wait(10000))
{
return DISP_CMD_OUT(AUO_EPAPER_CMD_LUT_START, u16LUT, u32LUTLength);
}
else
return -1;
}
//u32LUTLength: length in (unsigned short)
int Epaper_Read_LUT(unsigned short* u16LUT, unsigned long u32LUTLength)
{
DISP_DATA_IN(AUO_EPAPER_CMD_LUT_READ, u16LUT, u32LUTLength);
return 0;
}
void Epaper_Reset(void)
{
DISP_CMD_OUT(AUO_EPAPER_CMD_RESET, NULL, 0);
}
int Epaper_Pre_DMA_Disp_Start(T_DISPLAY_FRAME tFrame)
{
DISP_PRE_DATA_OUT(tFrame.u16EpaperCommand, tFrame.tFrameRange);
return 0;
}
int Epaper_Pre_DMA_Disp_Stop(T_DISPLAY_FRAME tFrame)
{
if(tFrame.u16EpaperCommand == AUO_EPAPER_CMD_PRE_DISPLAY_START)
DISP_CMD_OUT(AUO_EPAPER_CMD_PRE_DISPLAY_STOP, NULL, 0);
else
DISP_CMD_OUT(AUO_EPAPER_CMD_STOP, NULL, 0);
return 0;
}
/* ########################################################################## */
#undef printk
#include <linux/auofb_ioctl.h>
/* [MTR] Add generic command function */
enum InfoLevel
{
INFO_ERROR = 0,
INFO_WARNING,
INFO_NORMAL,
INFO_DEBUG,
INFO_VERBOSE,
};
#define EPAPER_DEBUG
#define VERBOSE_LEVEL INFO_VERBOSE
#ifndef VERBOSE_LEVEL
#define VERBOSE_LEVEL INFO_WARNING
#endif
#ifdef EPAPER_DEBUG
static int _dbgFL = 0;
#define FUNC_IN() do { int i; _dbgFL++; printk(KERN_ERR "+"); for (i = 0; i < _dbgFL; i++) printk("-"); printk(">> %s() >>\n", __func__); } while(0)
#define FUNC_OUT() do { int i; printk(KERN_ERR "+"); for (i = 0; i < _dbgFL; i++) printk("-"); printk("<< %s() <<\n", __func__); _dbgFL--; } while(0)
#define FUNC_OUTR(val) do { int i; printk(KERN_ERR "+"); for (i = 0; i < _dbgFL; i++) printk("-"); printk("<< %s() = %d <<\n", __func__, val); _dbgFL--; } while(0)
#define INFOL(level, s) do { if (level <= VERBOSE_LEVEL) { int i; printk(KERN_ERR "+"); for (i = 0; i < _dbgFL; i++) printk("-"); printk("||%s:%s(): ", __FILE__, __func__); printk s; printk("\n"); } } while(0)
#define INFO(s) do { int i; printk(KERN_ERR "+"); for (i = 0; i < _dbgFL; i++) printk("-"); printk("||%s:%s(): ", __FILE__, __func__); printk s; printk("\n"); } while(0)
#else
#define FUNC_IN() do {} while(0)
#define FUNC_OUT() do {} while(0)
#define FUNC_OUTR(val) do {} while(0)
#define INFOL(level, s) do { if (level <= VERBOSE_LEVEL) { printk("<%d>%s:%s(): ", level, __FILE__, __func__); printk s; printk("\n"); } } while(0)
#define INFO(s) do { printk("%s:%s(): ", __FILE__, __func__); printk s; printk("\n"); } while(0)
#endif
//#define GET_COMMAND_PARAM_NUM(command) ((command >> 20) & 0x0F)
//#define GET_COMMAND_HAVE_DATA(command) ((command >> 28) & 0x01)
//#define GET_COMMAND_NEED_WAIT(command) ((command >> 29) & 0x01)
/* On the i80 port,
* i80 TCON
* -----------
* RS -> D/C
* CS0 -> CSEL
* nWE -> HWE
* OE -> HRD
*/
static inline void _InitI80Interface(void)
{
unsigned long tmp;
FUNC_IN();
tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
tmp |= (1<<2);
__raw_writel(tmp, rSYSIFCON0);
tmp = __raw_readl(rSIFCCON0); // command mode enable
tmp |= (1<<0);
__raw_writel(tmp, rSIFCCON0);
FUNC_OUT();
}
static inline void _DeinitI80Interface(void)
{
unsigned long tmp;
FUNC_IN();
tmp = __raw_readl(rSIFCCON0); // command mode disable
tmp &= ~(1<<0);
__raw_writel(tmp, rSIFCCON0);
FUNC_OUT();
}
static inline void _SetWriteToData(void)
{
unsigned long tmp;
FUNC_IN();
tmp = __raw_readl(rSIFCCON0);
// RS high -> D/nC set Data mode
tmp |= (1<<1);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
FUNC_OUT();
}
static inline void _SetWriteToCommand(void)
{
unsigned long tmp;
FUNC_IN();
tmp = __raw_readl(rSIFCCON0);
// RS low -> D/nC set Command mode
tmp &= ~(1<<1);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
FUNC_OUT();
}
static inline void _EnableWrite(void)
{
unsigned long tmp;
FUNC_IN();
tmp = __raw_readl(rSIFCCON0);
// nWE -> HWE enable
tmp |= (1<<6);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
FUNC_OUT();
}
static inline void _DisableWrite(void)
{
unsigned long tmp;
FUNC_IN();
tmp = __raw_readl(rSIFCCON0);
// nWE -> HWE disable
tmp &= ~(1<<6);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
FUNC_OUT();
}
static inline void _EnableRead(void)
{
unsigned long tmp;
FUNC_IN();
tmp = __raw_readl(rSIFCCON0); // nRD enable
tmp |= SYS_OE_CON;
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
FUNC_OUT();
}
static inline void _DisableRead(void)
{
unsigned long tmp;
FUNC_IN();
tmp = __raw_readl(rSIFCCON0); // nRD disable
tmp &= ~SYS_OE_CON;
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
FUNC_OUT();
}
static inline void _SelectChip(void)
{
unsigned long tmp;
FUNC_IN();
tmp = __raw_readl(rSIFCCON0); // Chip Select
tmp |= (1<<8);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
FUNC_OUT();
}
static inline void _UnselectChip(void)
{
unsigned long tmp;
FUNC_IN();
tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
tmp &= ~(1<<8);
__raw_writel(tmp, rSIFCCON0);
__uDelay(1);
FUNC_OUT();
}
#define tcon_i80bus_write s3c2416_i80_write
int Epaper_sendCommandStart(sAUOCommand *cmd)
{
FUNC_IN();
INFOL(INFO_VERBOSE,("cmd #%08lX", cmd->cmd));
/* First: verify that the K1900 is ready */
INFOL(INFO_VERBOSE, ("/* First: verify that the K1900 is ready */"));
if (GET_COMMAND_NEED_WAIT(cmd->cmd) != 0x00)
{
INFOL(INFO_VERBOSE, ("Wait for non BUSY..."));
is_Epaper_Write_Ready();
}
if (cmd->cmd == AUOCMD_INIT_SET)
{
tcon_inPortraitMode = ~(cmd->params[0]) & (0x1 << 10);
if (tcon_inPortraitMode)
Epaper_Change_I80_Speed(EN_I80_PORTRAIT, 800, 600);
else
Epaper_Change_I80_Speed(EN_I80_LANDSCAPE, 600, 800);
INFOL(INFO_VERBOSE, ("Rotation set to 0x%08X...", tcon_inPortraitMode));
}
/* Second: init the i80 interface */
INFOL(INFO_VERBOSE, ("/* Second: init the i80 interface */"));
//tcon_i80bus_init_interface();
/* Third: Select the chip and set to Command mode */
INFOL(INFO_VERBOSE, ("/* Third: Select the chip and set to Command mode */"));
_SelectChip();
_SetWriteToCommand();
/* Fourth: Send command */
INFOL(INFO_VERBOSE, ("/* Fourth: Send command */"));
tcon_i80bus_write(cmd->cmd & 0xFFFF); /* This function already manage
* no need to do it here. */
/* Sixth: If parameters is needed, send them */
INFOL(INFO_VERBOSE, ("/* Sixth: If parameters is needed, send them */"));
if (GET_COMMAND_PARAM_NUM(cmd->cmd) > 0)
{
int i, paramNumbers = GET_COMMAND_PARAM_NUM(cmd->cmd);
INFOL(INFO_VERBOSE, ("YES! We have %d parameters", paramNumbers));
tcon_set_write_to_data();
for (i = 0; i < paramNumbers; i++)
{
INFOL(INFO_VERBOSE, (" parameter [%02d] = 0x%04X", i, cmd->params[i]));
tcon_i80bus_write(cmd->params[i]);
}
}
FUNC_OUT();
return 0;
}
int Epaper_sendData(unsigned short *buffer, unsigned long bufferLen)
{
/* Seventh: Send data if needed */
unsigned long i;
//FUNC_IN();
//INFOL(INFO_VERBOSE, ("Bufferlen: %ld", bufferLen));
tcon_set_write_to_data();
for (i = 0; i < bufferLen; i++)
{
tcon_i80bus_write(buffer[i]);
}
//FUNC_OUT();
return 0;
}
int Epaper_sendCommandEnd(sAUOCommand *cmd)
{
FUNC_IN();
INFOL(INFO_VERBOSE,("cmd #%08lX START:[#%08X]", cmd->cmd, AUOCMD_DISPLAY_START));
if (cmd->cmd == AUOCMD_DISPLAY_START)
{
_SetWriteToCommand();
INFOL(INFO_VERBOSE, ("/* Eight: Send STOP command */"));
tcon_i80bus_write(AUOCMD_DISPLAY_STOP & 0xFFFF);
_SetWriteToData();
}
INFOL(INFO_VERBOSE, ("/* Nineth: Close all */"));
_UnselectChip();
_DeinitI80Interface();
//tcon_i80bus_deinit_interface();
FUNC_OUT();
return 0;
}
/* [/MTR] */