/* * 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 #include #include #else //KERNEL #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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 0x3f) { DPRINTK("!!! Check frame rate: clkval = %d, over flow !!!\n",clkval); }*/ tmp = __raw_readl(rVIDCON0); tmp |= (clkval <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;cntAUO_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 /* [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] */