2522 lines
57 KiB
C
2522 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
|
|
|
|
|
|
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_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);
|
|
|
|
__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
|
|
|
|
static int rotMode = 0;
|
|
|
|
//#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();
|
|
}
|
|
|
|
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)
|
|
{
|
|
rotMode = ~(cmd->params[0]) & (0x1 << 10);
|
|
INFOL(INFO_VERBOSE, ("Rotation set to 0x%08X...", rotMode));
|
|
}
|
|
|
|
/* Second: init the i80 interface */
|
|
INFOL(INFO_VERBOSE, ("/* Second: init the i80 interface */"));
|
|
_InitI80Interface();
|
|
/* 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 */"));
|
|
if (rotMode)
|
|
s3c2416_i80_write(cmd->cmd & 0xFFFF); /* This function already manage HWE, */
|
|
else
|
|
s3c2416_i80_write_Rotate(cmd->cmd & 0xFFFF); /* This function already manage HWE,
|
|
* 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));
|
|
|
|
_SetWriteToData();
|
|
|
|
for (i = 0; i < paramNumbers; i++)
|
|
{
|
|
INFOL(INFO_VERBOSE, (" parameter [%02d] = 0x%04X", i, cmd->params[i]));
|
|
if (rotMode)
|
|
s3c2416_i80_write(cmd->params[i]);
|
|
else
|
|
s3c2416_i80_write_Rotate(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));
|
|
|
|
_SetWriteToData();
|
|
|
|
for (i = 0; i < bufferLen; i++)
|
|
{
|
|
if (rotMode)
|
|
s3c2416_i80_write(buffer[i]);
|
|
else
|
|
s3c2416_i80_write_Rotate(buffer[i]);
|
|
}
|
|
FUNC_OUT();
|
|
return 0;
|
|
}
|
|
|
|
int Epaper_sendCommandEnd(sAUOCommand *cmd)
|
|
{
|
|
FUNC_IN();
|
|
|
|
INFOL(INFO_VERBOSE,("cmd #%08lX START:[#%08lX]", cmd->cmd, AUOCMD_DISPLAY_START));
|
|
if (cmd->cmd == AUOCMD_DISPLAY_START)
|
|
{
|
|
_SetWriteToCommand();
|
|
INFOL(INFO_VERBOSE, ("/* Eight: Send STOP command */"));
|
|
if (rotMode)
|
|
s3c2416_i80_write(AUOCMD_DISPLAY_STOP & 0xFFFF);
|
|
else
|
|
s3c2416_i80_write_Rotate(AUOCMD_DISPLAY_STOP & 0xFFFF);
|
|
_SetWriteToData();
|
|
}
|
|
|
|
INFOL(INFO_VERBOSE, ("/* Nineth: Close all */"));
|
|
_UnselectChip();
|
|
_DeinitI80Interface();
|
|
|
|
FUNC_OUT();
|
|
return 0;
|
|
}
|
|
/* [/MTR] */
|
|
|