epaper.c 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294
  1. /*
  2. * drivers/input/keyboard/epaper.c
  3. * AUO epaper Interface on S3C2416 in Qisda eBook
  4. *
  5. * This file is subject to the terms and conditions of the GNU General Public
  6. * License. See the file COPYING in the main directory of this archive
  7. * for more details.
  8. */
  9. #include "epaper.h"
  10. #ifdef EPAPER_BOOT_CODE
  11. #include <common.h>
  12. #include <regs.h>
  13. #include <asm/io.h>
  14. #else //KERNEL
  15. #include <linux/module.h>
  16. #include <linux/kernel.h>
  17. #include <linux/init.h>
  18. #include <linux/interrupt.h>
  19. #include <linux/input.h>
  20. #include <linux/platform_device.h>
  21. #include <linux/miscdevice.h>
  22. #include <linux/delay.h>
  23. #include <asm/hardware.h>
  24. #include <asm/io.h>
  25. #include <asm/delay.h>
  26. #include <asm/irq.h>
  27. #include <asm/arch/regs-gpio.h>
  28. #include <asm/arch/regs-timer.h>
  29. #include <asm/arch/regs-lcd.h>
  30. #include <asm/arch/regs-watchdog.h>
  31. #include <linux/clk.h>
  32. #endif
  33. //#define S3C_EPAPER_QISDA_DEBUG
  34. #ifdef S3C_EPAPER_QISDA_DEBUG
  35. #ifdef EPAPER_BOOT_CODE
  36. #define DPRINTK(x...) //Be careful of code size if printf too much
  37. #else //KERNEL
  38. #define DPRINTK(x...) printk("S3C-Epaper-qisda " x)
  39. #endif
  40. #else
  41. #define DPRINTK(x...) /* !!!! */
  42. #endif
  43. #ifdef EPAPER_BOOT_CODE
  44. #define rGPCCON GPCCON
  45. #define rGPCDAT GPCDAT
  46. #define rGPDCON GPDCON
  47. #define rGPDDAT GPDDAT
  48. #define rGPCUDP GPCPU
  49. #define rGPDUDP GPDPU
  50. #define rGPLDAT GPLDAT
  51. #define rGPLCON GPLCON
  52. #define rGPLUDP GPLPU
  53. #define rGPBCON GPBCON
  54. #define rGPBDAT GPBDAT
  55. #define rGPGCON GPGCON
  56. #define rGPGDAT GPGDAT
  57. #define rGPECON GPECON
  58. #define rGPEDAT GPEDAT
  59. #define rGPFCON GPFCON
  60. #define rGPFDAT GPFDAT
  61. #define rVIDCON0 VIDCON0 //VIDEO CONTROL REGTISTER 0
  62. #define rSYSIFCON0 SYSIFCON0 //SYSTEM INTERFACE MAIN LDI
  63. #define rSYSIFCON1 SYSIFCON1 //SYSTEM INTERFACE SUB LDI
  64. #define rSIFCCON0 SIFCCON0 //SYSTEM INTERFACE COMMAND CONTROL
  65. #define rSIFCCON1 SIFCCON1 //SYSTEM IF COMMAND DATA WRITE CONTROL
  66. #define rSIFCCON2 SIFCCON2
  67. #else //KERNEL
  68. #define rGPCCON S3C2410_GPCCON
  69. #define rGPCDAT S3C2410_GPCDAT
  70. #define rGPDCON S3C2410_GPDCON
  71. #define rGPDDAT S3C2410_GPDDAT
  72. #define rGPCUDP S3C2410_GPCUP
  73. #define rGPDUDP S3C2410_GPDUP
  74. #define rGPLDAT S3C2410_GPLDAT
  75. #define rGPLCON S3C2410_GPLCON
  76. #define rGPLUDP S3C2410_GPLUP
  77. #define rGPBCON S3C2410_GPBCON
  78. #define rGPBDAT S3C2410_GPBDAT
  79. #define rGPBUDP S3C2410_GPBUP
  80. #define rGPGCON S3C2410_GPGCON
  81. #define rGPGDAT S3C2410_GPGDAT
  82. #define rGPECON S3C2410_GPECON
  83. #define rGPEDAT S3C2410_GPEDAT
  84. #define rGPFCON S3C2410_GPFCON
  85. #define rGPFDAT S3C2410_GPFDAT
  86. #define rTCFG0 S3C2410_TCFG0 //Configures the two 8-bit presclers
  87. #define rTCFG1 S3C2410_TCFG1 //5-MUX & DMA mode selecton
  88. #define rTCNTB3 S3C2410_TCNTB(3) //Timer 3 count buffer
  89. #define rTCMPB3 S3C2410_TCMPB(3) //Timer 3 compare buffer
  90. #define rTCON S3C2410_TCON //Timer control
  91. #define rVIDCON0 S3C_VIDCON0 //VIDEO CONTROL REGTISTER 0
  92. #define rSYSIFCON0 S3C_SYSIFCON0 //SYSTEM INTERFACE MAIN LDI
  93. #define rSYSIFCON1 S3C_SYSIFCON1 //SYSTEM INTERFACE SUB LDI
  94. #define rSIFCCON0 S3C_SIFCCON0 //SYSTEM INTERFACE COMMAND CONTROL
  95. #define rSIFCCON1 S3C_SIFCCON1 //SYSTEM IF COMMAND DATA WRITE CONTROL
  96. #define rSIFCCON2 S3C_SIFCCON2
  97. #define rVIDTCON2 S3C_VIDTCON2
  98. #endif
  99. #define I80_LANDSCAPE_CS_SETUP (0)
  100. #define I80_LANDSCAPE_WR_SETUP (0)
  101. #define I80_LANDSCAPE_WR_ACT (1)
  102. #define I80_LANDSCAPE_WR_HOLD (0)
  103. #define I80_PORTRAIT_CS_SETUP (0)
  104. #define I80_PORTRAIT_WR_SETUP (2+1) //+1
  105. #define I80_PORTRAIT_WR_ACT (6+2) //+2
  106. #define I80_PORTRAIT_WR_HOLD (2+1) //+1
  107. #define I80_LANDSCAPE_HANDWRITING_CS_SETUP (0)
  108. #define I80_LANDSCAPE_HANDWRITING_WR_SETUP (1)
  109. #define I80_LANDSCAPE_HANDWRITING_WR_ACT (1)
  110. #define I80_LANDSCAPE_HANDWRITING_WR_HOLD (0)
  111. #define I80_PORTRAIT_HANDWRITING_CS_SETUP (0)
  112. #define I80_PORTRAIT_HANDWRITING_WR_SETUP (2)
  113. #define I80_PORTRAIT_HANDWRITING_WR_ACT (6)
  114. #define I80_PORTRAIT_HANDWRITING_WR_HOLD (2)
  115. #define VIDTCON2_LINEVAL_S (11)
  116. #define VIDTCON2_HOZVAL_S (0)
  117. #define VIDCON0_S_CPU_IF_MAIN (2<<22)
  118. #define VIDCON0_S_RGB_PAR (0<<13)
  119. #define VIDCON0_S_VCLK_GATING_OFF (1<<5)
  120. #define VIDCON0_S_CLKDIR_DIVIDED (1<<4)
  121. #define VIDCON0_S_CLKSEL_HCLK (0<<2)
  122. #define VIDCON0_CLKVAL_F_SHIFT (6)
  123. #define VIDCON0_ENVID_ENABLE (1<<1)
  124. #define VIDCON0_ENVID_F_ENABLE (1<<0)
  125. #define SYS_WR_CON (1<<6)
  126. #define SYS_OE_CON (1<<7)
  127. #define rWTCON S3C2410_WTCON //Watch-dog timer mode
  128. #define rWTDAT S3C2410_WTDAT //Watch-dog timer data
  129. #define rWTCNT S3C2410_WTCNT //Watch-dog timer count
  130. #define LCD_DELAY_1MS 18000
  131. #define BUSY_WAIT_TIMEOUT (40*5*2) //panel time out = 1s
  132. #define PROGRESS_BAR_X (29)
  133. #define PROGRESS_BAR_Y (769)
  134. #define PROGRESS_BAR_W (563-28)
  135. #define PROGRESS_BAR_H (785-769)
  136. #define PROGRESS_BAR_90_X (101)
  137. #define PROGRESS_BAR_90_Y (301)
  138. #define PROGRESS_BAR_90_W (400)
  139. #define PROGRESS_BAR_90_H (60)
  140. #define PROGRESS_BAR_FRAME_LINE_W 8
  141. typedef enum {
  142. EN_I80_NONE = -1,
  143. EN_I80_LANDSCAPE = 0,
  144. EN_I80_PORTRAIT,
  145. EN_I80_LANDSCAPE_HANDWRITING,
  146. EN_I80_PORTRAIT_HANDWRITING,
  147. }I80_HWE_SPEED_MODE;
  148. //Global var
  149. static int delayLoopCount =150;//2M
  150. static int partial_update_mode = PARTIAL_DSP_MODE_0;
  151. static int gUser_h_resolution = AUO_EPAPER_PHYSICAL_H_RESOLUTION; //This is logic resolution, not PHYSICAL resolution, depand on rotation degree
  152. static int gUser_v_resolution = AUO_EPAPER_PHYSICAL_V_RESOLUTION; //This is logic resolution, not PHYSICAL resolution, depand on rotation degree
  153. static int gRotateDegree = 0;
  154. static unsigned char lcd_vbpd=0,lcd_vfpd=0,lcd_vspw=0,lcd_hbpd=0,lcd_hfpd=0,lcd_hspw=0;
  155. static unsigned short lcd_horizon_value=0,lcd_line_value=0;
  156. static unsigned char lcd_cs_setup=0,lcd_wr_setup=0,lcd_wr_act=0,lcd_wr_hold=0;
  157. static unsigned char lcd_frame_rate=50;
  158. static I80_HWE_SPEED_MODE gI80_Current_Speed = EN_I80_NONE;
  159. #ifdef EPAPER_BOOT_CODE
  160. //extern unsigned short Loading_Data[];
  161. #else
  162. extern unsigned short shutdown[];
  163. EXPORT_SYMBOL(Epaper_Shutdown_Logo);
  164. EXPORT_SYMBOL(Epaper_Get_Partial_Update_Mode);
  165. EXPORT_SYMBOL(Epaper_Power);
  166. EXPORT_SYMBOL(Epaper_Draw_Point);
  167. #endif
  168. /*
  169. 1. loops = 1 --> 25ns
  170. 2. loops = 75 --> 1 us
  171. 3. loops = 100000 --> 1ms
  172. */
  173. static inline void nDelay(unsigned long loops) //in ns
  174. {
  175. int i;
  176. __asm__ volatile ("1:\n" "subs %0, %1, #1\n" "bne 1b":"=r" (loops):"0"(loops));
  177. }
  178. static void __mDelay(unsigned long mTime)
  179. {
  180. unsigned long cnt=0;
  181. for(cnt=0;cnt<mTime;cnt++)
  182. nDelay(100000);
  183. }
  184. static void __uDelay(unsigned long uTime)
  185. {
  186. unsigned long cnt=0;
  187. for(cnt=0;cnt<uTime;cnt++)
  188. nDelay(75);
  189. }
  190. void Epaper_Change_I80_Speed(I80_HWE_SPEED_MODE i80_speed, unsigned short w, unsigned short h)
  191. {
  192. unsigned long tmp;
  193. unsigned char clkval=0;
  194. unsigned short h_cnt,v_cnt;
  195. unsigned long vclk;
  196. struct clk *lcd_clock;
  197. int HCLK ;
  198. if(gI80_Current_Speed == EN_I80_NONE)
  199. {
  200. Epaper_Set_I80_Default_Speed(i80_speed, w, h);
  201. return;
  202. }
  203. lcd_line_value = h;
  204. if((w%32) != 0) //DMA use WINCONx_4WORD_BURST, i.e. 16 bytes, i.e. 32 pixel
  205. w += 32 - (w%32);
  206. //printk("\nNew ( %d, %d)\n", w,h);
  207. lcd_horizon_value = w;
  208. switch(i80_speed)
  209. {
  210. default:
  211. case EN_I80_LANDSCAPE:
  212. lcd_cs_setup = I80_LANDSCAPE_CS_SETUP;
  213. lcd_wr_setup = I80_LANDSCAPE_WR_SETUP;
  214. lcd_wr_act = I80_LANDSCAPE_WR_ACT;
  215. lcd_wr_hold = I80_LANDSCAPE_WR_HOLD;
  216. break;
  217. case EN_I80_PORTRAIT:
  218. lcd_cs_setup = I80_PORTRAIT_CS_SETUP;
  219. lcd_wr_setup = I80_PORTRAIT_WR_SETUP;
  220. lcd_wr_act = I80_PORTRAIT_WR_ACT;
  221. lcd_wr_hold = I80_PORTRAIT_WR_HOLD;
  222. break;
  223. case EN_I80_LANDSCAPE_HANDWRITING:
  224. lcd_cs_setup = I80_LANDSCAPE_HANDWRITING_CS_SETUP;
  225. lcd_wr_setup = I80_LANDSCAPE_HANDWRITING_WR_SETUP;
  226. lcd_wr_act = I80_LANDSCAPE_HANDWRITING_WR_ACT;
  227. lcd_wr_hold = I80_LANDSCAPE_HANDWRITING_WR_HOLD;
  228. break;
  229. case EN_I80_PORTRAIT_HANDWRITING:
  230. lcd_cs_setup = I80_PORTRAIT_HANDWRITING_CS_SETUP;
  231. lcd_wr_setup = I80_PORTRAIT_HANDWRITING_WR_SETUP;
  232. lcd_wr_act = I80_PORTRAIT_HANDWRITING_WR_ACT;
  233. lcd_wr_hold = I80_PORTRAIT_HANDWRITING_WR_HOLD;
  234. break;
  235. }
  236. tmp = __raw_readl(rSYSIFCON0);
  237. tmp = (lcd_cs_setup<<16)|(lcd_wr_setup<<12)|(lcd_wr_act<<8)|(lcd_wr_hold<<4)|(1<<2)|(1<<1)|(1);
  238. __raw_writel(tmp, rSYSIFCON0);
  239. tmp = __raw_readl(rSYSIFCON1);
  240. tmp = (lcd_cs_setup<<16)|(lcd_wr_setup<<12)|(lcd_wr_act<<8)|(lcd_wr_hold<<4)|(1<<2)|(1<<1)|(1);
  241. __raw_writel(tmp, rSYSIFCON1);
  242. tmp = __raw_readl(rVIDTCON2);
  243. tmp = ((lcd_line_value-1)<<VIDTCON2_LINEVAL_S)|((lcd_horizon_value/4)-1);
  244. __raw_writel(tmp, rVIDTCON2);
  245. gI80_Current_Speed = i80_speed;
  246. }
  247. void Epaper_Set_I80_Default_Speed(I80_HWE_SPEED_MODE i80_speed, unsigned short w, unsigned short h)
  248. {
  249. unsigned long tmp;
  250. unsigned char clkval=0;
  251. unsigned short h_cnt,v_cnt;
  252. unsigned long vclk;
  253. struct clk *lcd_clock;
  254. int HCLK ;
  255. lcd_line_value = h;
  256. lcd_horizon_value = w;
  257. switch(i80_speed)
  258. {
  259. default:
  260. case EN_I80_LANDSCAPE:
  261. lcd_cs_setup = I80_LANDSCAPE_CS_SETUP;
  262. lcd_wr_setup = I80_LANDSCAPE_WR_SETUP;
  263. lcd_wr_act = I80_LANDSCAPE_WR_ACT;
  264. lcd_wr_hold = I80_LANDSCAPE_WR_HOLD;
  265. break;
  266. case EN_I80_PORTRAIT:
  267. lcd_cs_setup = I80_PORTRAIT_CS_SETUP;
  268. lcd_wr_setup = I80_PORTRAIT_WR_SETUP;
  269. lcd_wr_act = I80_PORTRAIT_WR_ACT;
  270. lcd_wr_hold = I80_PORTRAIT_WR_HOLD;
  271. break;
  272. case EN_I80_LANDSCAPE_HANDWRITING:
  273. lcd_cs_setup = I80_LANDSCAPE_HANDWRITING_CS_SETUP;
  274. lcd_wr_setup = I80_LANDSCAPE_HANDWRITING_WR_SETUP;
  275. lcd_wr_act = I80_LANDSCAPE_HANDWRITING_WR_ACT;
  276. lcd_wr_hold = I80_LANDSCAPE_HANDWRITING_WR_HOLD;
  277. break;
  278. case EN_I80_PORTRAIT_HANDWRITING:
  279. lcd_cs_setup = I80_PORTRAIT_HANDWRITING_CS_SETUP;
  280. lcd_wr_setup = I80_PORTRAIT_HANDWRITING_WR_SETUP;
  281. lcd_wr_act = I80_PORTRAIT_HANDWRITING_WR_ACT;
  282. lcd_wr_hold = I80_PORTRAIT_HANDWRITING_WR_HOLD;
  283. break;
  284. }
  285. tmp = __raw_readl(rVIDCON0);
  286. tmp = VIDCON0_S_CPU_IF_MAIN|VIDCON0_S_RGB_PAR|VIDCON0_S_VCLK_GATING_OFF|\
  287. VIDCON0_S_CLKDIR_DIVIDED|VIDCON0_S_CLKSEL_HCLK;
  288. __raw_writel(tmp, rVIDCON0);
  289. v_cnt = (lcd_vbpd+lcd_vfpd+lcd_vspw+lcd_line_value);
  290. h_cnt = (lcd_hbpd+lcd_hfpd+lcd_hspw+lcd_horizon_value);
  291. lcd_clock = clk_get(NULL, "hclk");
  292. HCLK = clk_get_rate(lcd_clock);
  293. //printk("\nHCLK=%d\n",HCLK);
  294. clkval = (unsigned int)(HCLK/(v_cnt*h_cnt*lcd_frame_rate)); //clkval=3 if 1024*768*50
  295. //clkval = 0x3f;
  296. vclk = (HCLK/(clkval+1))/1000;
  297. //DPRINTK("VCLK: %dKHz, clkval=%d\n",vclk, clkval);
  298. /*if(clkval > 0x3f)
  299. {
  300. DPRINTK("!!! Check frame rate: clkval = %d, over flow !!!\n",clkval);
  301. }*/
  302. tmp = __raw_readl(rVIDCON0);
  303. tmp |= (clkval <<VIDCON0_CLKVAL_F_SHIFT);
  304. __raw_writel(tmp, rVIDCON0);
  305. tmp = __raw_readl(rSYSIFCON0);
  306. tmp = (lcd_cs_setup<<16)|(lcd_wr_setup<<12)|(lcd_wr_act<<8)|(lcd_wr_hold<<4)|(1<<2)|(1<<1)|(1);
  307. __raw_writel(tmp, rSYSIFCON0);
  308. tmp = __raw_readl(rSYSIFCON1);
  309. tmp = (lcd_cs_setup<<16)|(lcd_wr_setup<<12)|(lcd_wr_act<<8)|(lcd_wr_hold<<4)|(1<<2)|(1<<1)|(1);
  310. __raw_writel(tmp, rSYSIFCON1);
  311. tmp = __raw_readl(rVIDTCON2);
  312. tmp = ((lcd_line_value-1)<<VIDTCON2_LINEVAL_S)|((lcd_horizon_value/4)-1);
  313. __raw_writel(tmp, rVIDTCON2);
  314. gI80_Current_Speed = i80_speed;
  315. }
  316. #ifdef EPAPER_BOOT_CODE
  317. void Epaper_Show_Progress(int percent)
  318. {
  319. T_DISPLAY_FRAME stDisFrame;
  320. int i;
  321. unsigned short u16ProgressBar_x, u16ProgressBar_y, u16ProgressBar_w, u16ProgressBar_h;
  322. static unsigned short progress_bar[PROGRESS_BAR_W*PROGRESS_BAR_H/4];
  323. int line_bytes;
  324. return;
  325. memset((unsigned char*)progress_bar, 0xff, PROGRESS_BAR_W*PROGRESS_BAR_H/4*2);
  326. switch(gRotateDegree)
  327. {
  328. default:
  329. case 0:
  330. {
  331. u16ProgressBar_x = PROGRESS_BAR_X;
  332. u16ProgressBar_y = PROGRESS_BAR_Y;
  333. u16ProgressBar_w = PROGRESS_BAR_W;
  334. u16ProgressBar_h = PROGRESS_BAR_H;
  335. line_bytes = u16ProgressBar_w/4*2;
  336. //draw percent
  337. memset((unsigned char*)progress_bar+(u16ProgressBar_h-(u16ProgressBar_h/100*percent))*line_bytes, 0x0,
  338. (u16ProgressBar_h/100*percent)*line_bytes);
  339. break;
  340. }
  341. case 90:
  342. {
  343. int draw_len = 0;
  344. u16ProgressBar_x = PROGRESS_BAR_90_X;
  345. u16ProgressBar_y = PROGRESS_BAR_90_Y;
  346. u16ProgressBar_w = PROGRESS_BAR_90_W;
  347. u16ProgressBar_h = PROGRESS_BAR_90_H;
  348. line_bytes = u16ProgressBar_w/4*2;
  349. //draw percent
  350. if((u16ProgressBar_w*percent/100)%4 != 0)
  351. {
  352. draw_len = (u16ProgressBar_w*percent/100) + (4)-((u16ProgressBar_w*percent/100)%4);
  353. }
  354. else
  355. draw_len = (u16ProgressBar_w*percent/100);
  356. for(i=0; i< u16ProgressBar_h; i++)
  357. {
  358. memset((unsigned char*)progress_bar + (u16ProgressBar_w/2)*i, 0x0, (draw_len/2));
  359. }
  360. break;
  361. }
  362. }
  363. //draw top frame line, line width = 8
  364. memset((unsigned char*)progress_bar, 0x0, PROGRESS_BAR_FRAME_LINE_W*line_bytes);
  365. //draw right frame line, line width = 8
  366. for(i=0;i<u16ProgressBar_h;i++)
  367. {
  368. memset(((unsigned char*)progress_bar)+((u16ProgressBar_w-PROGRESS_BAR_FRAME_LINE_W)/4*2)+(i*line_bytes), 0x0,
  369. PROGRESS_BAR_FRAME_LINE_W/4*2);
  370. }
  371. //draw left frame line, line width = 8
  372. for(i=0;i<u16ProgressBar_h;i++)
  373. {
  374. memset(((unsigned char*)progress_bar)+(i*line_bytes), 0x0, PROGRESS_BAR_FRAME_LINE_W/4*2);
  375. }
  376. //draw bottom frame line, line width = 8
  377. memset((unsigned char*)progress_bar+(u16ProgressBar_h-PROGRESS_BAR_FRAME_LINE_W)*line_bytes, 0x0,
  378. PROGRESS_BAR_FRAME_LINE_W*line_bytes);
  379. //send data
  380. partial_update_mode = 1;
  381. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  382. stDisFrame.tFrameRange.X = u16ProgressBar_x;
  383. stDisFrame.tFrameRange.Y = u16ProgressBar_y;
  384. stDisFrame.tFrameRange.W = u16ProgressBar_w;
  385. stDisFrame.tFrameRange.H = u16ProgressBar_h;
  386. stDisFrame.pFrameData = progress_bar;
  387. if(is_Epaper_Write_Ready())
  388. {
  389. //DPRINTK("\nEpaper Progress %d",percent);
  390. Epaper_Disp(stDisFrame);
  391. }
  392. }
  393. void Epaper_Clean_Panel(void)
  394. {
  395. //unsigned short clean_frame[gUser_h_resolution*gUser_v_resolution/4];
  396. unsigned short clean_frame[AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4];
  397. T_DISPLAY_FRAME stDisFrame;
  398. partial_update_mode = 0;
  399. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  400. stDisFrame.tFrameRange.X = 1;
  401. stDisFrame.tFrameRange.Y = 1;
  402. stDisFrame.tFrameRange.W = gUser_h_resolution;
  403. stDisFrame.tFrameRange.H = gUser_v_resolution;
  404. memset((unsigned char*)clean_frame, 0xff, AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4*2);
  405. stDisFrame.pFrameData = clean_frame;
  406. if(is_Epaper_Write_Ready())
  407. {
  408. //DPRINTK("\nEpaper clean panel");
  409. Epaper_Disp(stDisFrame);
  410. }
  411. }
  412. #else //KERNEL
  413. void Epaper_Show_Progress(int percent)
  414. {
  415. T_DISPLAY_FRAME stDisFrame;
  416. int i;
  417. unsigned short u16ProgressBar_x, u16ProgressBar_y, u16ProgressBar_w, u16ProgressBar_h;
  418. static unsigned short progress_bar[PROGRESS_BAR_W*PROGRESS_BAR_H/4];
  419. int line_bytes;
  420. return;
  421. memset((unsigned char*)progress_bar, 0xff, PROGRESS_BAR_W*PROGRESS_BAR_H/4*2);
  422. switch(gRotateDegree)
  423. {
  424. default:
  425. case 0:
  426. {
  427. u16ProgressBar_x = PROGRESS_BAR_X;
  428. u16ProgressBar_y = PROGRESS_BAR_Y;
  429. u16ProgressBar_w = PROGRESS_BAR_W;
  430. u16ProgressBar_h = PROGRESS_BAR_H;
  431. line_bytes = u16ProgressBar_w/4*2;
  432. //draw percent
  433. memset((unsigned char*)progress_bar+(u16ProgressBar_h-(u16ProgressBar_h/100*percent))*line_bytes, 0x0,
  434. (u16ProgressBar_h/100*percent)*line_bytes);
  435. break;
  436. }
  437. case 90:
  438. {
  439. int draw_len = 0;
  440. u16ProgressBar_x = PROGRESS_BAR_90_X;
  441. u16ProgressBar_y = PROGRESS_BAR_90_Y;
  442. u16ProgressBar_w = PROGRESS_BAR_90_W;
  443. u16ProgressBar_h = PROGRESS_BAR_90_H;
  444. line_bytes = u16ProgressBar_w/4*2;
  445. //draw percent
  446. if((u16ProgressBar_w*percent/100)%4 != 0)
  447. {
  448. draw_len = (u16ProgressBar_w*percent/100) + (4)-((u16ProgressBar_w*percent/100)%4);
  449. }
  450. else
  451. draw_len = (u16ProgressBar_w*percent/100);
  452. for(i=0; i< u16ProgressBar_h; i++)
  453. {
  454. memset((unsigned char*)progress_bar + (u16ProgressBar_w/2)*i, 0x0, (draw_len/2));
  455. }
  456. break;
  457. }
  458. }
  459. //draw top frame line, line width = 8
  460. memset((unsigned char*)progress_bar, 0x0, PROGRESS_BAR_FRAME_LINE_W*line_bytes);
  461. //draw right frame line, line width = 8
  462. for(i=0;i<u16ProgressBar_h;i++)
  463. {
  464. memset(((unsigned char*)progress_bar)+((u16ProgressBar_w-PROGRESS_BAR_FRAME_LINE_W)/4*2)+(i*line_bytes), 0x0,
  465. PROGRESS_BAR_FRAME_LINE_W/4*2);
  466. }
  467. //draw left frame line, line width = 8
  468. for(i=0;i<u16ProgressBar_h;i++)
  469. {
  470. memset(((unsigned char*)progress_bar)+(i*line_bytes), 0x0, PROGRESS_BAR_FRAME_LINE_W/4*2);
  471. }
  472. //draw bottom frame line, line width = 8
  473. memset((unsigned char*)progress_bar+(u16ProgressBar_h-PROGRESS_BAR_FRAME_LINE_W)*line_bytes, 0x0,
  474. PROGRESS_BAR_FRAME_LINE_W*line_bytes);
  475. //send data
  476. partial_update_mode = 1;
  477. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  478. stDisFrame.tFrameRange.X = u16ProgressBar_x;
  479. stDisFrame.tFrameRange.Y = u16ProgressBar_y;
  480. stDisFrame.tFrameRange.W = u16ProgressBar_w;
  481. stDisFrame.tFrameRange.H = u16ProgressBar_h;
  482. stDisFrame.pFrameData = progress_bar;
  483. if(is_Epaper_Write_Ready())
  484. {
  485. //DPRINTK("\nEpaper Progress %d",percent);
  486. Epaper_Disp(stDisFrame);
  487. }
  488. }
  489. void Epaper_Clean_Panel(void)
  490. {
  491. //unsigned short clean_frame[gUser_h_resolution*gUser_v_resolution/4];
  492. static unsigned short clean_frame[AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4];
  493. T_DISPLAY_FRAME stDisFrame;
  494. partial_update_mode = 0;
  495. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  496. stDisFrame.tFrameRange.X = 1;
  497. stDisFrame.tFrameRange.Y = 1;
  498. stDisFrame.tFrameRange.W = gUser_h_resolution;
  499. stDisFrame.tFrameRange.H = gUser_v_resolution;
  500. memset((unsigned char*)clean_frame, 0xff, AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4*2);
  501. stDisFrame.pFrameData = clean_frame;
  502. if(is_Epaper_Write_Ready())
  503. {
  504. //DPRINTK("\nEpaper clean panel");
  505. Epaper_Disp(stDisFrame);
  506. }
  507. }
  508. void Epaper_Pre_Display_Image(void)
  509. {
  510. //unsigned short clean_frame[gUser_h_resolution*gUser_v_resolution/4];
  511. static unsigned short clean_frame[AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4];
  512. T_DISPLAY_FRAME stDisFrame;
  513. partial_update_mode = 0;
  514. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PRE_DISPLAY_START;
  515. stDisFrame.tFrameRange.X = 1;
  516. stDisFrame.tFrameRange.Y = 1;
  517. stDisFrame.tFrameRange.W = gUser_h_resolution;
  518. stDisFrame.tFrameRange.H = gUser_v_resolution;
  519. memset((unsigned char*)clean_frame, 0xff, AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4*2);
  520. stDisFrame.pFrameData = clean_frame;
  521. if(is_Epaper_Write_Ready())
  522. {
  523. //DPRINTK("\nEpaper clean panel");
  524. Epaper_Disp(stDisFrame);
  525. }
  526. }
  527. void Epaper_Shutdown_Logo(void)
  528. {
  529. #if 0
  530. T_DISPLAY_FRAME stDisFrame;
  531. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  532. partial_update_mode = 0;
  533. stDisFrame.tFrameRange.X = 1;
  534. stDisFrame.tFrameRange.Y = 1;
  535. stDisFrame.tFrameRange.W = gUser_h_resolution;
  536. stDisFrame.tFrameRange.H = gUser_v_resolution;
  537. stDisFrame.pFrameData = shutdown;
  538. if(is_Epaper_Write_Ready())
  539. {
  540. printk("\nEpaper shutdown logo");
  541. Epaper_Disp(stDisFrame);
  542. }
  543. #else
  544. static unsigned short clean_frame[AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4];
  545. //static unsigned short clean_frame[1024*768/4];
  546. T_DISPLAY_FRAME stDisFrame;
  547. partial_update_mode = 0;
  548. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  549. stDisFrame.tFrameRange.X = 1;
  550. stDisFrame.tFrameRange.Y = 1;
  551. stDisFrame.tFrameRange.W = gUser_h_resolution;
  552. stDisFrame.tFrameRange.H = gUser_v_resolution;
  553. memset((unsigned char*)clean_frame, 0x00, AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4*2);
  554. stDisFrame.pFrameData = clean_frame;
  555. if(is_Epaper_Write_Ready())
  556. {
  557. //DPRINTK("\nEpaper clean panel");
  558. Epaper_Disp(stDisFrame);
  559. }
  560. #endif
  561. }
  562. void Epaper_Draw_Point(int x, int y)
  563. {
  564. unsigned short pint_data[4*4/4];
  565. T_DISPLAY_FRAME stDisFrame;
  566. if( ((x/2)*2) == x)
  567. return;
  568. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  569. partial_update_mode = 4;
  570. stDisFrame.tFrameRange.X = x;
  571. stDisFrame.tFrameRange.Y = y;
  572. stDisFrame.tFrameRange.W = 4;
  573. stDisFrame.tFrameRange.H = 4;
  574. stDisFrame.pFrameData = pint_data;
  575. if(is_Epaper_Write_Ready())
  576. {
  577. Epaper_Disp(stDisFrame);
  578. }
  579. }
  580. #endif //EPAPER_BOOT_CODE
  581. //This is logic resolution, not PHYSICAL resolution, depand on rotation degree
  582. void Epaper_Set_Resolution(int h_res, int v_res)
  583. {
  584. gUser_h_resolution = h_res;
  585. gUser_v_resolution = v_res;
  586. }
  587. int is_Epaper_Write_Ready_No_Wait(void)
  588. {
  589. unsigned long tmp;
  590. int iBusyCnt=0;
  591. tmp = __raw_readl(rGPBDAT);
  592. if((tmp & (1<<2))==0)
  593. {
  594. //DPRINTK("<= BAN =>panel is BUSY\n");
  595. return 0;
  596. }
  597. return 1;
  598. }
  599. int is_Epaper_Write_Ready(void)
  600. {
  601. unsigned long tmp;
  602. int iBusyCnt=0;
  603. int i=0;
  604. wait_queue_head_t busy_wq;
  605. init_waitqueue_head(&busy_wq);
  606. tmp = __raw_readl(rGPBDAT);
  607. while((tmp & (1<<2))==0)
  608. {
  609. //DPRINTK("<= BAN =>panel is BUSY\n");
  610. sleep_on_timeout(&busy_wq, 4);
  611. //msleep(100);
  612. /*for(i=0; i<20; i++)
  613. __mDelay(1);*/
  614. iBusyCnt ++;
  615. if(iBusyCnt>= BUSY_WAIT_TIMEOUT)
  616. {
  617. //DPRINTK("<= BAN =>Panel Disp Fail: BUSY time out\n");
  618. return 0;
  619. }
  620. tmp = __raw_readl(rGPBDAT);
  621. }
  622. return 1;
  623. }
  624. int is_Epaper_Write_Ready_Wait(unsigned long waitTime) //ms
  625. {
  626. unsigned long tmp;
  627. int iBusyCnt=0;
  628. int i=0;
  629. wait_queue_head_t busy_wq;
  630. init_waitqueue_head(&busy_wq);
  631. tmp = __raw_readl(rGPBDAT);
  632. while((tmp & (1<<2))==0)
  633. {
  634. sleep_on_timeout(&busy_wq, 4);
  635. //DPRINTK("<= BAN =>panel is BUSY\n");
  636. //msleep(100);
  637. /*for(i=0; i<20; i++)
  638. __mDelay(1);*/
  639. iBusyCnt ++;
  640. if(iBusyCnt>= (waitTime/20))
  641. {
  642. DPRINTK("<= BAN =>Panel Disp Fail: BUSY time out\n");
  643. return 0;
  644. }
  645. tmp = __raw_readl(rGPBDAT);
  646. }
  647. return 1;
  648. }
  649. int is_Epaper_Write_Ready_Busy_Wait(unsigned long waitTime) //ms
  650. {
  651. unsigned long tmp;
  652. int iBusyCnt=0;
  653. int i=0;
  654. wait_queue_head_t busy_wq;
  655. init_waitqueue_head(&busy_wq);
  656. tmp = __raw_readl(rGPBDAT);
  657. while((tmp & (1<<2))==0)
  658. {
  659. //sleep_on_timeout(&busy_wq, 4);
  660. //DPRINTK("<= BAN =>panel is BUSY\n");
  661. //msleep(100);
  662. for(i=0; i<20; i++)
  663. __mDelay(1);
  664. iBusyCnt ++;
  665. if(iBusyCnt>= (waitTime/20))
  666. {
  667. DPRINTK("<= BAN =>Panel Disp Fail: BUSY time out\n");
  668. return 0;
  669. }
  670. tmp = __raw_readl(rGPBDAT);
  671. }
  672. return 1;
  673. }
  674. static inline void s3c2416_i80_write(int data)
  675. {
  676. int tmp;
  677. tmp = __raw_readl(rSIFCCON0); // nWE enable
  678. tmp |= SYS_WR_CON;
  679. __raw_writel(tmp, rSIFCCON0);
  680. __raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
  681. tmp = __raw_readl(rSIFCCON0); // nWE disables
  682. tmp &= ~SYS_WR_CON;
  683. __raw_writel(tmp, rSIFCCON0);
  684. }
  685. static inline void s3c2416_i80_write_Rotate(int data)
  686. {
  687. int tmp;
  688. tmp = __raw_readl(rSIFCCON0); // nWE enable
  689. tmp |= SYS_WR_CON;
  690. __raw_writel(tmp, rSIFCCON0);
  691. //__uDelay(1);
  692. nDelay(25); //down to 1.5M
  693. __raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
  694. tmp = __raw_readl(rSIFCCON0); // nWE disable
  695. tmp &= ~SYS_WR_CON;
  696. __raw_writel(tmp, rSIFCCON0);
  697. }
  698. static inline void s3c2416_i80_write_HandWriting(int data)
  699. {
  700. int tmp;
  701. tmp = __raw_readl(rSIFCCON0); // nWE enable
  702. tmp |= SYS_WR_CON;
  703. __raw_writel(tmp, rSIFCCON0);
  704. nDelay(15); //down to 2M
  705. __raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
  706. tmp = __raw_readl(rSIFCCON0); // nWE disable
  707. tmp &= ~SYS_WR_CON;
  708. __raw_writel(tmp, rSIFCCON0);
  709. }
  710. static inline void s3c2416_i80_write_Rotate_HandWriting(int data)
  711. {
  712. int tmp;
  713. __uDelay(1);
  714. tmp = __raw_readl(rSIFCCON0); // nWE enable
  715. tmp |= SYS_WR_CON;
  716. __raw_writel(tmp, rSIFCCON0);
  717. __uDelay(1);
  718. __raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
  719. tmp = __raw_readl(rSIFCCON0); // nWE disable
  720. tmp &= ~SYS_WR_CON;
  721. __raw_writel(tmp, rSIFCCON0);
  722. }
  723. static inline void s3c2416_i80_write_LUT(int data)
  724. {
  725. int tmp;
  726. __uDelay(1);
  727. tmp = __raw_readl(rSIFCCON0); // nWE enable
  728. tmp |= SYS_WR_CON;
  729. __raw_writel(tmp, rSIFCCON0);
  730. __uDelay(1);
  731. __raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
  732. __uDelay(1);
  733. tmp = __raw_readl(rSIFCCON0); // nWE disable
  734. tmp &= ~SYS_WR_CON;
  735. __raw_writel(tmp, rSIFCCON0);
  736. }
  737. static inline void s3c2416_i80_read(unsigned short* data)
  738. {
  739. int tmp;
  740. __uDelay(1);
  741. tmp = __raw_readl(rSIFCCON0); // nRD enable
  742. tmp |= SYS_OE_CON;
  743. __raw_writel(tmp, rSIFCCON0);
  744. //__mDelay(1); //Ivan : must do
  745. __uDelay(1);
  746. *data = __raw_readl(rSIFCCON2); //CMD = rSIFCCON2;
  747. __uDelay(1);
  748. tmp = __raw_readl(rSIFCCON0); // nRD disable
  749. tmp &= ~SYS_OE_CON;
  750. __raw_writel(tmp, rSIFCCON0);
  751. }
  752. static int DISP_CMD_OUT(unsigned short CMD, unsigned short* pdata, int data_length)
  753. {
  754. unsigned long tmp;
  755. unsigned long cnt;
  756. int ret = 0;
  757. tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
  758. tmp |= (1<<2);
  759. __raw_writel(tmp, rSYSIFCON0);
  760. tmp = __raw_readl(rSIFCCON0); // command mode enable
  761. tmp |= (1<<0);
  762. __raw_writel(tmp, rSIFCCON0);
  763. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
  764. tmp |= (1<<8);
  765. __raw_writel(tmp, rSIFCCON0);
  766. __uDelay(1);
  767. tmp = __raw_readl(rSIFCCON0); // RS low
  768. tmp &= ~(1<<1);
  769. __raw_writel(tmp, rSIFCCON0);
  770. __uDelay(1);
  771. tmp = __raw_readl(rSIFCCON0); // nWE enable
  772. tmp |= (1<<6);
  773. __raw_writel(tmp, rSIFCCON0);
  774. __uDelay(1);
  775. __raw_writel(CMD, rSIFCCON1); //rSIFCCON1 = CMD;
  776. __uDelay(1);
  777. tmp = __raw_readl(rSIFCCON0); // nWE disable
  778. tmp &= ~(1<<6);
  779. __raw_writel(tmp, rSIFCCON0);
  780. __uDelay(1);
  781. tmp = __raw_readl(rSIFCCON0); // RS Hi
  782. tmp |= (1<<1);
  783. __raw_writel(tmp, rSIFCCON0);
  784. __uDelay(1);
  785. if(data_length > 0)
  786. {
  787. switch(CMD)
  788. {
  789. case AUO_EPAPER_CMD_INIT:
  790. {
  791. s3c2416_i80_write(*pdata);
  792. break;
  793. }
  794. case AUO_EPAPER_CMD_LUT_START:
  795. {
  796. for(cnt=0;cnt<data_length;cnt++)
  797. {
  798. __uDelay(1);
  799. if(is_Epaper_Write_Ready_Busy_Wait(10000))
  800. {
  801. __uDelay(1);
  802. s3c2416_i80_write_LUT((unsigned short)pdata[cnt]);
  803. }
  804. else
  805. {
  806. DPRINTK("EPD: Can not send LUT data\n");
  807. ret = -1;
  808. goto DISP_CMD_OUT_ERROR;
  809. }
  810. }
  811. if(is_Epaper_Write_Ready())
  812. {
  813. tmp = __raw_readl(rSIFCCON0); //rSIFCCON0 &= ~(1<<1); // RS low
  814. tmp &= ~(1<<1); // RS low
  815. __raw_writel(tmp, rSIFCCON0);
  816. __uDelay(1);
  817. s3c2416_i80_write(AUO_EPAPER_CMD_LUT_STOP);
  818. __uDelay(1);
  819. tmp = __raw_readl(rSIFCCON0); // RS Hi
  820. tmp |= (1<<1);
  821. __raw_writel(tmp, rSIFCCON0);
  822. }
  823. else
  824. {
  825. DPRINTK("EPD: Can not send AUO_EPAPER_CMD_LUT_STOP\n");
  826. ret = -1;
  827. goto DISP_CMD_OUT_ERROR;
  828. }
  829. break;
  830. }
  831. default:
  832. DPRINTK("unkonwn command\n");
  833. break;
  834. }
  835. }
  836. DISP_CMD_OUT_ERROR:
  837. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  838. tmp &= ~(1<<8);
  839. __raw_writel(tmp, rSIFCCON0);
  840. tmp = __raw_readl(rSIFCCON0); // command mode disable
  841. tmp &= ~(1<<0);
  842. __raw_writel(tmp, rSIFCCON0);
  843. }
  844. //Send 1 command and read parameters
  845. static void DISP_DATA_IN(unsigned short CMD, unsigned short* val_array, int val_count)
  846. {
  847. unsigned long tmp;
  848. int cnt;
  849. tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
  850. tmp |= (1<<2);
  851. __raw_writel(tmp, rSYSIFCON0);
  852. tmp = __raw_readl(rSIFCCON0); // command mode enable
  853. tmp |= (1<<0);
  854. __raw_writel(tmp, rSIFCCON0);
  855. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
  856. tmp |= (1<<8);
  857. __raw_writel(tmp, rSIFCCON0);
  858. __uDelay(1);
  859. tmp = __raw_readl(rSIFCCON0); // RS low
  860. tmp &= ~(1<<1);
  861. __raw_writel(tmp, rSIFCCON0);
  862. __uDelay(1);
  863. tmp = __raw_readl(rSIFCCON0); // nWE enable
  864. tmp |= (1<<6);
  865. __raw_writel(tmp, rSIFCCON0);
  866. __uDelay(1);
  867. __raw_writel(CMD, rSIFCCON1); //rSIFCCON1 = CMD;
  868. __uDelay(1);
  869. tmp = __raw_readl(rSIFCCON0); // nWE disable
  870. tmp &= ~(1<<6);
  871. __raw_writel(tmp, rSIFCCON0);
  872. __uDelay(1);
  873. tmp = __raw_readl(rSIFCCON0); // RS Hi
  874. tmp |= (1<<1);
  875. __raw_writel(tmp, rSIFCCON0);
  876. switch(CMD)
  877. {
  878. case AUO_EPAPER_CMD_TEMPER:
  879. {
  880. for(cnt=0;cnt<val_count;cnt++)
  881. {
  882. __mDelay(1);
  883. s3c2416_i80_read(&val_array[cnt]);
  884. }
  885. break;
  886. }
  887. case AUO_EPAPER_CMD_LUT_READ:
  888. {
  889. DPRINTK("\nLUT Read");
  890. for(cnt=0;cnt<val_count;cnt++)
  891. {
  892. if(is_Epaper_Write_Ready())
  893. {
  894. s3c2416_i80_read(&val_array[cnt]);
  895. }
  896. }
  897. if(is_Epaper_Write_Ready())
  898. {
  899. tmp = __raw_readl(rSIFCCON0); //rSIFCCON0 &= ~(1<<1); // RS low
  900. tmp &= ~(1<<1); // RS low
  901. __raw_writel(tmp, rSIFCCON0);
  902. __uDelay(1);
  903. s3c2416_i80_write(AUO_EPAPER_CMD_LUT_STOP);
  904. __uDelay(1);
  905. tmp = __raw_readl(rSIFCCON0); // RS Hi
  906. tmp |= (1<<1);
  907. __raw_writel(tmp, rSIFCCON0);
  908. }
  909. break;
  910. }
  911. default:
  912. DPRINTK("unkonwn command\n");
  913. break;
  914. }
  915. __uDelay(1);
  916. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  917. tmp &= ~(1<<8);
  918. __raw_writel(tmp, rSIFCCON0);
  919. tmp = __raw_readl(rSIFCCON0); // command mode disable
  920. tmp &= ~(1<<0);
  921. __raw_writel(tmp, rSIFCCON0);
  922. }
  923. static DISP_DATA_OUT(unsigned short CMD, unsigned short* pdata, T_DISPLAY_REGION REGION)
  924. {
  925. unsigned long tmp;
  926. unsigned long cnt;
  927. tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
  928. tmp |= (1<<2);
  929. __raw_writel(tmp, rSYSIFCON0);
  930. tmp = __raw_readl(rSIFCCON0); // command mode enable
  931. tmp |= (1<<0);
  932. __raw_writel(tmp, rSIFCCON0);
  933. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
  934. tmp |= (1<<8);
  935. __raw_writel(tmp, rSIFCCON0);
  936. //__uDelay(1);
  937. tmp = __raw_readl(rSIFCCON0); // RS low
  938. tmp &= ~(1<<1);
  939. __raw_writel(tmp, rSIFCCON0);
  940. //check busy again
  941. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  942. {
  943. DPRINTK("busy...\n");
  944. if(!is_Epaper_Write_Ready())
  945. {
  946. //busy
  947. tmp = __raw_readl(rSIFCCON0); // RS Hi
  948. tmp |= (1<<1);
  949. __raw_writel(tmp, rSIFCCON0);
  950. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  951. tmp &= ~(1<<8);
  952. __raw_writel(tmp, rSIFCCON0);
  953. tmp = __raw_readl(rSIFCCON0); // command mode disable
  954. tmp &= ~(1<<0);
  955. __raw_writel(tmp, rSIFCCON0);
  956. DPRINTK("ERROR, Still BUSY");
  957. return -1;
  958. }
  959. }
  960. //end
  961. //__uDelay(1);
  962. tmp = __raw_readl(rSIFCCON0); // nWE enable
  963. tmp |= (1<<6);
  964. __raw_writel(tmp, rSIFCCON0);
  965. __uDelay(1);
  966. //check busy again
  967. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  968. {
  969. DPRINTK("busy...\n");
  970. if(!is_Epaper_Write_Ready())
  971. {
  972. //busy
  973. //__uDelay(1);
  974. tmp = __raw_readl(rSIFCCON0); // nWE disable
  975. tmp &= ~(1<<6);
  976. __raw_writel(tmp, rSIFCCON0);
  977. tmp = __raw_readl(rSIFCCON0); // RS Hi
  978. tmp |= (1<<1);
  979. __raw_writel(tmp, rSIFCCON0);
  980. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  981. tmp &= ~(1<<8);
  982. __raw_writel(tmp, rSIFCCON0);
  983. tmp = __raw_readl(rSIFCCON0); // command mode disable
  984. tmp &= ~(1<<0);
  985. __raw_writel(tmp, rSIFCCON0);
  986. DPRINTK("ERROR, Still BUSY");
  987. return -1;
  988. }
  989. }
  990. //end
  991. __raw_writel(CMD, rSIFCCON1); //rSIFCCON1 = CMD;
  992. //__uDelay(1);
  993. tmp = __raw_readl(rSIFCCON0); // nWE disable
  994. tmp &= ~(1<<6);
  995. __raw_writel(tmp, rSIFCCON0);
  996. //__uDelay(1);
  997. tmp = __raw_readl(rSIFCCON0); // RS Hi
  998. tmp |= (1<<1);
  999. __raw_writel(tmp, rSIFCCON0);
  1000. __mDelay(1);
  1001. //check busy again
  1002. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1003. {
  1004. DPRINTK("busy...\n");
  1005. if(!is_Epaper_Write_Ready())
  1006. {
  1007. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1008. tmp &= ~(1<<8);
  1009. __raw_writel(tmp, rSIFCCON0);
  1010. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1011. tmp &= ~(1<<0);
  1012. __raw_writel(tmp, rSIFCCON0);
  1013. DPRINTK("ERROR, Still BUSY");
  1014. return -1;
  1015. }
  1016. }
  1017. //end
  1018. /* BAN 20090406 + for test panel*/
  1019. switch(CMD)
  1020. {
  1021. case AUO_EPAPER_CMD_FULLDISP:
  1022. {
  1023. break;
  1024. }
  1025. case AUO_EPAPER_CMD_PARTIALDISP:
  1026. case AUO_EPAPER_CMD_PRE_DISPLAY_START:
  1027. {
  1028. unsigned short current_mode=0;
  1029. 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);
  1030. //__uDelay(1);
  1031. //MOD + X
  1032. current_mode = ((unsigned short)partial_update_mode )<<12;
  1033. //if(partial_update_mode == PARTIAL_DSP_MODE_4)
  1034. // current_mode |= 0x8000; //Set "Write"
  1035. __mDelay(1);
  1036. //check busy again
  1037. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1038. {
  1039. DPRINTK("busy...\n");
  1040. if(!is_Epaper_Write_Ready())
  1041. {
  1042. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1043. tmp &= ~(1<<8);
  1044. __raw_writel(tmp, rSIFCCON0);
  1045. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1046. tmp &= ~(1<<0);
  1047. __raw_writel(tmp, rSIFCCON0);
  1048. DPRINTK("ERROR, Still BUSY");
  1049. return -1;
  1050. }
  1051. }
  1052. //end
  1053. printk(" EPAPER: ---- RX: 0x%04X\n", current_mode|REGION.X);
  1054. s3c2416_i80_write(current_mode|REGION.X);
  1055. __mDelay(1);
  1056. //check busy again
  1057. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1058. {
  1059. DPRINTK("busy...\n");
  1060. if(!is_Epaper_Write_Ready())
  1061. {
  1062. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1063. tmp &= ~(1<<8);
  1064. __raw_writel(tmp, rSIFCCON0);
  1065. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1066. tmp &= ~(1<<0);
  1067. __raw_writel(tmp, rSIFCCON0);
  1068. DPRINTK("ERROR, Still BUSY");
  1069. return -1;
  1070. }
  1071. }
  1072. //Y
  1073. printk(" EPAPER: ---- RY: 0x%04X\n", REGION.Y);
  1074. s3c2416_i80_write(REGION.Y);
  1075. __mDelay(1);
  1076. //check busy again
  1077. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1078. {
  1079. DPRINTK("busy...\n");
  1080. if(!is_Epaper_Write_Ready())
  1081. {
  1082. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1083. tmp &= ~(1<<8);
  1084. __raw_writel(tmp, rSIFCCON0);
  1085. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1086. tmp &= ~(1<<0);
  1087. __raw_writel(tmp, rSIFCCON0);
  1088. DPRINTK("ERROR, Still BUSY");
  1089. return -1;
  1090. }
  1091. }
  1092. //W
  1093. printk(" EPAPER: ---- RW: 0x%04X\n", REGION.W);
  1094. s3c2416_i80_write(REGION.W);
  1095. __mDelay(1);
  1096. //check busy again
  1097. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1098. {
  1099. DPRINTK("busy...\n");
  1100. if(!is_Epaper_Write_Ready())
  1101. {
  1102. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1103. tmp &= ~(1<<8);
  1104. __raw_writel(tmp, rSIFCCON0);
  1105. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1106. tmp &= ~(1<<0);
  1107. __raw_writel(tmp, rSIFCCON0);
  1108. DPRINTK("ERROR, Still BUSY");
  1109. return -1;
  1110. }
  1111. }
  1112. //H
  1113. printk(" EPAPER: ---- RH: 0x%04X\n", REGION.H);
  1114. s3c2416_i80_write(REGION.H);
  1115. __mDelay(1);
  1116. //check busy again
  1117. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1118. {
  1119. DPRINTK("busy...\n");
  1120. if(!is_Epaper_Write_Ready())
  1121. {
  1122. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1123. tmp &= ~(1<<8);
  1124. __raw_writel(tmp, rSIFCCON0);
  1125. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1126. tmp &= ~(1<<0);
  1127. __raw_writel(tmp, rSIFCCON0);
  1128. DPRINTK("ERROR, Still BUSY");
  1129. return -1;
  1130. }
  1131. }
  1132. if((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W))
  1133. {
  1134. DPRINTK("busy...\n");
  1135. if(gRotateDegree!=0)
  1136. {
  1137. DPRINTK("\nHand writing + Rotate");
  1138. for(cnt=0; cnt<(REGION.W*REGION.H/4); cnt++)
  1139. {
  1140. s3c2416_i80_write_Rotate_HandWriting((unsigned short)pdata[cnt]); //rSIFCCON1 = CMD;
  1141. }
  1142. }
  1143. else
  1144. {
  1145. DPRINTK("\nHand writing");
  1146. for(cnt=0; cnt<(REGION.W*REGION.H/4); cnt++)
  1147. {
  1148. s3c2416_i80_write_HandWriting((unsigned short)pdata[cnt]); //rSIFCCON1 = CMD;
  1149. }
  1150. }
  1151. }
  1152. else if(gRotateDegree!=0)
  1153. {
  1154. DPRINTK("\nRotate");
  1155. for(cnt=0; cnt<(REGION.W*REGION.H/4); cnt++)
  1156. {
  1157. s3c2416_i80_write_Rotate((unsigned short)pdata[cnt]); //rSIFCCON1 = CMD;
  1158. }
  1159. }
  1160. else
  1161. {
  1162. DPRINTK("\nnormal");
  1163. for(cnt=0; cnt<(REGION.W*REGION.H/4); cnt++)
  1164. {
  1165. s3c2416_i80_write((unsigned short)pdata[cnt]); //rSIFCCON1 = CMD;
  1166. }
  1167. }
  1168. break;
  1169. }
  1170. case AUO_EPAPER_CMD_STOP:
  1171. break;
  1172. default:
  1173. DPRINTK("unkonwn command\n");
  1174. break;
  1175. }
  1176. /* BAN 20090406 + for test panel*/
  1177. // STOP
  1178. tmp = __raw_readl(rSIFCCON0); //rSIFCCON0 &= ~(1<<1); // RS low
  1179. tmp &= ~(1<<1); // RS low
  1180. __raw_writel(tmp, rSIFCCON0);
  1181. //__uDelay(1);
  1182. switch(CMD)
  1183. {
  1184. default:
  1185. case AUO_EPAPER_CMD_PARTIALDISP:
  1186. {
  1187. s3c2416_i80_write(AUO_EPAPER_CMD_STOP);
  1188. break;
  1189. }
  1190. case AUO_EPAPER_CMD_PRE_DISPLAY_START:
  1191. {
  1192. s3c2416_i80_write(AUO_EPAPER_CMD_PRE_DISPLAY_STOP);
  1193. break;
  1194. }
  1195. }
  1196. //__uDelay(1);
  1197. tmp = __raw_readl(rSIFCCON0); // RS Hi
  1198. tmp |= (1<<1);
  1199. __raw_writel(tmp, rSIFCCON0);
  1200. //__uDelay(1);
  1201. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1202. tmp &= ~(1<<8);
  1203. __raw_writel(tmp, rSIFCCON0);
  1204. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1205. tmp &= ~(1<<0);
  1206. __raw_writel(tmp, rSIFCCON0);
  1207. return 0;
  1208. }
  1209. //Send mode, x, y, w, h only
  1210. static int DISP_PRE_DATA_OUT(unsigned short CMD, T_DISPLAY_REGION REGION)
  1211. {
  1212. unsigned long tmp;
  1213. unsigned long cnt;
  1214. unsigned short current_mode=0;
  1215. if((CMD != AUO_EPAPER_CMD_PARTIALDISP) && (CMD != AUO_EPAPER_CMD_PRE_DISPLAY_START))
  1216. return -1;
  1217. tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
  1218. tmp |= (1<<2);
  1219. __raw_writel(tmp, rSYSIFCON0);
  1220. tmp = __raw_readl(rSIFCCON0); // command mode enable
  1221. tmp |= (1<<0);
  1222. __raw_writel(tmp, rSIFCCON0);
  1223. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
  1224. tmp |= (1<<8);
  1225. __raw_writel(tmp, rSIFCCON0);
  1226. tmp = __raw_readl(rSIFCCON0); // RS low
  1227. tmp &= ~(1<<1);
  1228. __raw_writel(tmp, rSIFCCON0);
  1229. //check busy again
  1230. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1231. {
  1232. if(!is_Epaper_Write_Ready())
  1233. {
  1234. //busy
  1235. tmp = __raw_readl(rSIFCCON0); // RS Hi
  1236. tmp |= (1<<1);
  1237. __raw_writel(tmp, rSIFCCON0);
  1238. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1239. tmp &= ~(1<<8);
  1240. __raw_writel(tmp, rSIFCCON0);
  1241. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1242. tmp &= ~(1<<0);
  1243. __raw_writel(tmp, rSIFCCON0);
  1244. DPRINTK("ERROR, Still BUSY");
  1245. return -1;
  1246. }
  1247. }
  1248. //end
  1249. tmp = __raw_readl(rSIFCCON0); // nWE enable
  1250. tmp |= (1<<6);
  1251. __raw_writel(tmp, rSIFCCON0);
  1252. __uDelay(1);
  1253. //check busy again
  1254. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1255. {
  1256. if(!is_Epaper_Write_Ready())
  1257. {
  1258. //busy
  1259. //__uDelay(1);
  1260. tmp = __raw_readl(rSIFCCON0); // nWE disable
  1261. tmp &= ~(1<<6);
  1262. __raw_writel(tmp, rSIFCCON0);
  1263. tmp = __raw_readl(rSIFCCON0); // RS Hi
  1264. tmp |= (1<<1);
  1265. __raw_writel(tmp, rSIFCCON0);
  1266. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1267. tmp &= ~(1<<8);
  1268. __raw_writel(tmp, rSIFCCON0);
  1269. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1270. tmp &= ~(1<<0);
  1271. __raw_writel(tmp, rSIFCCON0);
  1272. DPRINTK("ERROR, Still BUSY");
  1273. return -1;
  1274. }
  1275. }
  1276. //end
  1277. __raw_writel(CMD, rSIFCCON1); //rSIFCCON1 = CMD;
  1278. tmp = __raw_readl(rSIFCCON0); // nWE disable
  1279. tmp &= ~(1<<6);
  1280. __raw_writel(tmp, rSIFCCON0);
  1281. tmp = __raw_readl(rSIFCCON0); // RS Hi
  1282. tmp |= (1<<1);
  1283. __raw_writel(tmp, rSIFCCON0);
  1284. __mDelay(1);
  1285. //check busy again
  1286. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1287. {
  1288. if(!is_Epaper_Write_Ready())
  1289. {
  1290. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1291. tmp &= ~(1<<8);
  1292. __raw_writel(tmp, rSIFCCON0);
  1293. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1294. tmp &= ~(1<<0);
  1295. __raw_writel(tmp, rSIFCCON0);
  1296. DPRINTK("ERROR, Still BUSY");
  1297. return -1;
  1298. }
  1299. }
  1300. //end
  1301. //MOD + X
  1302. //partial_update_mode = 0xC;
  1303. current_mode = ((unsigned short)partial_update_mode )<<12;
  1304. __mDelay(1);
  1305. s3c2416_i80_write(current_mode|REGION.X);
  1306. __mDelay(1);
  1307. //check busy again
  1308. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1309. {
  1310. if(!is_Epaper_Write_Ready())
  1311. {
  1312. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1313. tmp &= ~(1<<8);
  1314. __raw_writel(tmp, rSIFCCON0);
  1315. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1316. tmp &= ~(1<<0);
  1317. __raw_writel(tmp, rSIFCCON0);
  1318. DPRINTK("ERROR, Still BUSY");
  1319. return -1;
  1320. }
  1321. }
  1322. //end
  1323. //Y
  1324. s3c2416_i80_write(REGION.Y);
  1325. __mDelay(1);
  1326. //check busy again
  1327. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1328. {
  1329. if(!is_Epaper_Write_Ready())
  1330. {
  1331. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1332. tmp &= ~(1<<8);
  1333. __raw_writel(tmp, rSIFCCON0);
  1334. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1335. tmp &= ~(1<<0);
  1336. __raw_writel(tmp, rSIFCCON0);
  1337. DPRINTK("ERROR, Still BUSY");
  1338. return -1;
  1339. }
  1340. }
  1341. //end
  1342. //W
  1343. s3c2416_i80_write(REGION.W);
  1344. __mDelay(1);
  1345. //check busy again
  1346. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1347. {
  1348. if(!is_Epaper_Write_Ready())
  1349. {
  1350. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1351. tmp &= ~(1<<8);
  1352. __raw_writel(tmp, rSIFCCON0);
  1353. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1354. tmp &= ~(1<<0);
  1355. __raw_writel(tmp, rSIFCCON0);
  1356. DPRINTK("ERROR, Still BUSY");
  1357. return -1;
  1358. }
  1359. }
  1360. //end
  1361. //H
  1362. s3c2416_i80_write(REGION.H);
  1363. __mDelay(1);
  1364. //printk("\nEPAPER (x,y,w,h)=(%d,%d,%d,%d)\n", REGION.X, REGION.Y, REGION.W, REGION.H);
  1365. if((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W))
  1366. {
  1367. if(gRotateDegree!=0) //Rotate + handwriting
  1368. {
  1369. Epaper_Change_I80_Speed(EN_I80_PORTRAIT_HANDWRITING, REGION.W, REGION.H);
  1370. }
  1371. else //only handwriting
  1372. {
  1373. Epaper_Change_I80_Speed(EN_I80_LANDSCAPE_HANDWRITING, REGION.W, REGION.H);
  1374. }
  1375. }
  1376. else
  1377. {
  1378. if(gRotateDegree!=0) //Rotate
  1379. {
  1380. Epaper_Change_I80_Speed(EN_I80_PORTRAIT, REGION.W, REGION.H);
  1381. }
  1382. else //not rotate
  1383. {
  1384. Epaper_Change_I80_Speed(EN_I80_LANDSCAPE, REGION.W, REGION.H);
  1385. }
  1386. }
  1387. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1388. tmp &= ~(1<<8);
  1389. __raw_writel(tmp, rSIFCCON0);
  1390. tmp = __raw_readl(rSIFCCON0); // command mode disable //must do this, or HWE will not send
  1391. tmp &= ~(1<<0);
  1392. __raw_writel(tmp, rSIFCCON0);
  1393. return 0;
  1394. }
  1395. void Epaper_SetLcdPort(void)
  1396. {
  1397. unsigned long tmp;
  1398. printk("TCON init - ");
  1399. // set gpio for lcd
  1400. tmp =__raw_readl(rGPCCON);
  1401. //tmp = (tmp & ~(0xffff03ff))|(0xaaaa02aa);
  1402. tmp = (tmp & ~(0xffff033f))|(0xaaaa022a); //Do not config SYS_CS1(GPC3)
  1403. __raw_writel(tmp, rGPCCON);
  1404. printk("Cybook Orizon Layout\n");
  1405. tmp =__raw_readl(rGPDCON); //tmp=0x40000
  1406. tmp = (tmp & ~(0x0CFFFF))|(0x04AAAA);
  1407. __raw_writel(tmp, rGPDCON); // GPD9 is RST_N
  1408. __raw_writel(0, rGPCUDP); //rGPCUDP = 0;
  1409. __raw_writel(0, rGPDUDP); //rGPDUDP = 0;
  1410. Epaper_Set_I80_Default_Speed(EN_I80_LANDSCAPE, AUO_EPAPER_PHYSICAL_H_RESOLUTION, AUO_EPAPER_PHYSICAL_V_RESOLUTION);
  1411. // POWER pin config
  1412. tmp =__raw_readl(rGPBCON);
  1413. tmp = (tmp & ~(3<<6))|(1<<6);
  1414. __raw_writel(tmp, rGPBCON);
  1415. // BUSY pin config
  1416. tmp =__raw_readl(rGPBCON);
  1417. tmp = (tmp & ~(3<<4));
  1418. __raw_writel(tmp, rGPBCON);
  1419. /*
  1420. tmp =__raw_readl(rGPBUDP);
  1421. tmp = (tmp & ~(3<<4));
  1422. //tmp = 0;
  1423. __raw_writel(tmp, rGPBUDP);*/
  1424. // SLEEP pin config
  1425. tmp =__raw_readl(rGPBCON);
  1426. tmp = (tmp & ~(3<<2))|(1<<2);
  1427. __raw_writel(tmp, rGPBCON);
  1428. __mDelay(1);
  1429. //SLEEP Pin High
  1430. /* tmp = __raw_readl(rGPBDAT);
  1431. tmp |= (1<<1);
  1432. __raw_writel(tmp, rGPBDAT);
  1433. udelay(1000);*/
  1434. // Panel power on
  1435. tmp = __raw_readl(rGPBDAT);
  1436. tmp |= (1<<3);
  1437. //SLP_N high
  1438. tmp |= (1<<1);
  1439. __raw_writel(tmp, rGPBDAT);
  1440. msleep(100);
  1441. // LCD module reset
  1442. tmp = __raw_readl(rGPDDAT);
  1443. tmp |= (1<<9);
  1444. __raw_writel(tmp, rGPDDAT);
  1445. tmp = __raw_readl(rGPDDAT); // goes to LOW
  1446. tmp &= ~(1<<9);
  1447. __raw_writel(tmp, rGPDDAT);
  1448. __uDelay(5);
  1449. tmp = __raw_readl(rGPDDAT); // goes to HIGH
  1450. tmp |= (1<<9);
  1451. __raw_writel(tmp, rGPDDAT);
  1452. // delay about 10ms
  1453. msleep(10);
  1454. }
  1455. void EPaper_CloseLcdPort(void)
  1456. {
  1457. unsigned long tmp;
  1458. //gpc0 input
  1459. s3c2410_gpio_pullup(S3C2410_GPC0,1);
  1460. s3c2410_gpio_cfgpin(S3C2410_GPC0, S3C2410_GPC0_INP);
  1461. //gpc1 input
  1462. s3c2410_gpio_pullup(S3C2410_GPC1,1);
  1463. s3c2410_gpio_cfgpin(S3C2410_GPC1, S3C2410_GPC1_INP);
  1464. //gpc2 input
  1465. s3c2410_gpio_pullup(S3C2410_GPC2,1);
  1466. s3c2410_gpio_cfgpin(S3C2410_GPC2, S3C2410_GPC2_INP);
  1467. //gpc4 input
  1468. s3c2410_gpio_pullup(S3C2410_GPC4,1);
  1469. s3c2410_gpio_cfgpin(S3C2410_GPC4, S3C2410_GPC4_INP);
  1470. //gpc8 input
  1471. s3c2410_gpio_pullup(S3C2410_GPC8,1);
  1472. s3c2410_gpio_cfgpin(S3C2410_GPC8, S3C2410_GPC8_INP);
  1473. //gpc9 input
  1474. s3c2410_gpio_pullup(S3C2410_GPC9,1);
  1475. s3c2410_gpio_cfgpin(S3C2410_GPC9, S3C2410_GPC9_INP);
  1476. //gpc10 input
  1477. s3c2410_gpio_pullup(S3C2410_GPC10,1);
  1478. s3c2410_gpio_cfgpin(S3C2410_GPC10, S3C2410_GPC10_INP);
  1479. //gpc11 input
  1480. s3c2410_gpio_pullup(S3C2410_GPC11,1);
  1481. s3c2410_gpio_cfgpin(S3C2410_GPC11, S3C2410_GPC11_INP);
  1482. //gpc12 input
  1483. s3c2410_gpio_pullup(S3C2410_GPC12,1);
  1484. s3c2410_gpio_cfgpin(S3C2410_GPC12, S3C2410_GPC12_INP);
  1485. //gpc13 input
  1486. s3c2410_gpio_pullup(S3C2410_GPC13,1);
  1487. s3c2410_gpio_cfgpin(S3C2410_GPC13, S3C2410_GPC13_INP);
  1488. //gpc14 input
  1489. s3c2410_gpio_pullup(S3C2410_GPC14,1);
  1490. s3c2410_gpio_cfgpin(S3C2410_GPC14, S3C2410_GPC14_INP);
  1491. //gpc15 input
  1492. s3c2410_gpio_pullup(S3C2410_GPC15,1);
  1493. s3c2410_gpio_cfgpin(S3C2410_GPC15, S3C2410_GPC15_INP);
  1494. //gpd0 input
  1495. s3c2410_gpio_pullup(S3C2410_GPD0,1);
  1496. s3c2410_gpio_cfgpin(S3C2410_GPD0, S3C2410_GPD0_INP);
  1497. //gpd1 input
  1498. s3c2410_gpio_pullup(S3C2410_GPD1,1);
  1499. s3c2410_gpio_cfgpin(S3C2410_GPD1, S3C2410_GPD1_INP);
  1500. //gpd2 input
  1501. s3c2410_gpio_pullup(S3C2410_GPD2,1);
  1502. s3c2410_gpio_cfgpin(S3C2410_GPD2, S3C2410_GPD2_INP);
  1503. //gpd3 input
  1504. s3c2410_gpio_pullup(S3C2410_GPD3,1);
  1505. s3c2410_gpio_cfgpin(S3C2410_GPD3, S3C2410_GPD3_INP);
  1506. //gpd4 input
  1507. s3c2410_gpio_pullup(S3C2410_GPD4,1);
  1508. s3c2410_gpio_cfgpin(S3C2410_GPD4, S3C2410_GPD4_INP);
  1509. //gpd5 input
  1510. s3c2410_gpio_pullup(S3C2410_GPD5,1);
  1511. s3c2410_gpio_cfgpin(S3C2410_GPD5, S3C2410_GPD5_INP);
  1512. //gpd6 input
  1513. s3c2410_gpio_pullup(S3C2410_GPD6,1);
  1514. s3c2410_gpio_cfgpin(S3C2410_GPD6, S3C2410_GPD6_INP);
  1515. //gpd7 input
  1516. s3c2410_gpio_pullup(S3C2410_GPD7,1);
  1517. s3c2410_gpio_cfgpin(S3C2410_GPD7, S3C2410_GPD7_INP);
  1518. //gpd9 output
  1519. s3c2410_gpio_pullup(S3C2410_GPD9,1);
  1520. s3c2410_gpio_cfgpin(S3C2410_GPD9, S3C2410_GPD9_OUTP);
  1521. s3c2410_gpio_setpin(S3C2410_GPD9,0);
  1522. //gpb1 input
  1523. s3c2410_gpio_pullup(S3C2410_GPB1,1);
  1524. s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_INP);
  1525. //gpb2 input
  1526. s3c2410_gpio_pullup(S3C2410_GPB2,1);
  1527. s3c2410_gpio_cfgpin(S3C2410_GPB2, S3C2410_GPB2_INP);
  1528. //gpb3 output
  1529. /*
  1530. s3c2410_gpio_pullup(S3C2410_GPB3,1);
  1531. s3c2410_gpio_cfgpin(S3C2410_GPB3, S3C2410_GPB3_OUTP);
  1532. s3c2410_gpio_setpin(S3C2410_GPB3,0);
  1533. */
  1534. /*tmp = __raw_readl(rGPCDAT);
  1535. DPRINTK("\nGPC=0x%x", tmp);
  1536. tmp = __raw_readl(rGPDDAT);
  1537. DPRINTK("\nGPD=0x%x", tmp);*/
  1538. gRotateDegree = 0;
  1539. }
  1540. int Epaper_Disp(T_DISPLAY_FRAME tFrame)
  1541. {
  1542. unsigned long tmp;
  1543. int iBusyCnt=0;
  1544. DPRINTK("<= BAN =>I80 Write\n");
  1545. DISP_DATA_OUT(tFrame.u16EpaperCommand,tFrame.pFrameData,tFrame.tFrameRange);
  1546. return 0;
  1547. }
  1548. void Epaper_Set_Partial_Update_Mode(int mode)
  1549. {
  1550. partial_update_mode = mode;
  1551. }
  1552. int Epaper_Get_Partial_Update_Mode(void)
  1553. {
  1554. return partial_update_mode;
  1555. }
  1556. void Epaper_Enter_Standby_Mode(int isEnter)
  1557. {
  1558. unsigned long tmp;
  1559. if(isEnter)
  1560. {
  1561. //send 0x0001 to T-CON to enter standby mode
  1562. DISP_CMD_OUT(AUO_EPAPER_CMD_STANDBY, NULL, 0);
  1563. }
  1564. else
  1565. {
  1566. //send 0x0002 to T-CON to leave standby mode
  1567. DISP_CMD_OUT(AUO_EPAPER_CMD_WAKEUP, NULL, 0);
  1568. }
  1569. }
  1570. void Epaper_Enter_Sleep_Mode(int isEnter)
  1571. {
  1572. unsigned long tmp;
  1573. if(isEnter)
  1574. {
  1575. tmp = __raw_readl(rGPBDAT);
  1576. tmp &= ~(1<<1);
  1577. __raw_writel(tmp, rGPBDAT);
  1578. }
  1579. else
  1580. {
  1581. tmp = __raw_readl(rGPBDAT);
  1582. tmp |= (1<<1);
  1583. __raw_writel(tmp, rGPBDAT);
  1584. }
  1585. }
  1586. void Epaper_Power(int isEnable)
  1587. {
  1588. unsigned long tmp;
  1589. if(isEnable)
  1590. {
  1591. tmp = __raw_readl(rGPBDAT);
  1592. tmp |= (1<<3);
  1593. __raw_writel(tmp, rGPBDAT);
  1594. }
  1595. else
  1596. {
  1597. tmp = __raw_readl(rGPBDAT);
  1598. tmp &= ~(1<<3);
  1599. __raw_writel(tmp, rGPBDAT);
  1600. }
  1601. }
  1602. void Epaper_Read_R_TEMP(unsigned short* val0, unsigned short* val1, unsigned short* val2, unsigned short* val3)
  1603. {
  1604. unsigned long tmp;
  1605. unsigned short val[4];
  1606. memset(val, 0x0, 8);
  1607. DISP_DATA_IN(AUO_EPAPER_CMD_TEMPER, val, 4);
  1608. *val0 = val[0];
  1609. *val1 = val[1];
  1610. *val2 = val[2];
  1611. *val3 = val[3];
  1612. }
  1613. void Epaper_Display_Refresh(void)
  1614. {
  1615. DISP_CMD_OUT(AUO_EPAPER_CMD_REFRESH, NULL, 0);
  1616. }
  1617. 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)
  1618. {
  1619. unsigned short u16InitPara=0;
  1620. if(is_Epaper_Write_Ready())
  1621. {
  1622. //TEMP_AVE_EN
  1623. if((temp_ave != 0) && (temp_ave != 1))
  1624. return -1;
  1625. u16InitPara = u16InitPara | (temp_ave<<13);
  1626. //M23_FILTER
  1627. //ROT
  1628. gRotateDegree = rotation;
  1629. if(rotation == 0)
  1630. {
  1631. gUser_h_resolution = h_Res;
  1632. gUser_v_resolution = v_Res;
  1633. Epaper_Change_I80_Speed(EN_I80_LANDSCAPE, gUser_h_resolution, gUser_v_resolution);
  1634. }
  1635. else if(rotation == 90)
  1636. {
  1637. u16InitPara = u16InitPara | (1<<10);
  1638. gUser_h_resolution = v_Res;
  1639. gUser_v_resolution = h_Res;
  1640. Epaper_Change_I80_Speed(EN_I80_PORTRAIT, gUser_h_resolution, gUser_v_resolution);
  1641. }
  1642. else if(rotation == 180)
  1643. {
  1644. u16InitPara = u16InitPara | (2<<10);
  1645. gUser_h_resolution = h_Res;
  1646. gUser_v_resolution = v_Res;
  1647. Epaper_Change_I80_Speed(EN_I80_PORTRAIT, gUser_h_resolution, gUser_v_resolution); //not test
  1648. }
  1649. else if(rotation == 270)
  1650. {
  1651. u16InitPara = u16InitPara | (3<<10);
  1652. gUser_h_resolution = v_Res;
  1653. gUser_v_resolution = h_Res;
  1654. Epaper_Change_I80_Speed(EN_I80_PORTRAIT, gUser_h_resolution, gUser_v_resolution);//not test
  1655. }
  1656. else
  1657. {
  1658. gUser_h_resolution = h_Res;
  1659. gUser_v_resolution = v_Res;
  1660. Epaper_Change_I80_Speed(EN_I80_LANDSCAPE, gUser_h_resolution, gUser_v_resolution);
  1661. }
  1662. //DI
  1663. //BN
  1664. //CHDA
  1665. //RES
  1666. if(AUO_EPAPER_PHYSICAL_H_RESOLUTION==1024 && AUO_EPAPER_PHYSICAL_V_RESOLUTION==768)
  1667. u16InitPara = u16InitPara | (1<<2);
  1668. else if(AUO_EPAPER_PHYSICAL_H_RESOLUTION==800 && AUO_EPAPER_PHYSICAL_V_RESOLUTION==600)
  1669. {
  1670. }
  1671. else
  1672. {
  1673. }
  1674. //UD
  1675. //SHL
  1676. u16InitPara = u16InitPara | 1;
  1677. DISP_CMD_OUT(AUO_EPAPER_CMD_INIT, &u16InitPara, 1);
  1678. DPRINTK("\nInit size=%d, Init data =0x%x\n", sizeof(unsigned short),u16InitPara);
  1679. return 0;
  1680. }
  1681. return -1;
  1682. }
  1683. //u32LUTLength: length in (unsigned short)
  1684. int Epaper_Update_LUT(unsigned short* u16LUT, unsigned long u32LUTLength)
  1685. {
  1686. unsigned long cnt=0;
  1687. if(is_Epaper_Write_Ready_Wait(10000))
  1688. {
  1689. return DISP_CMD_OUT(AUO_EPAPER_CMD_LUT_START, u16LUT, u32LUTLength);
  1690. }
  1691. else
  1692. return -1;
  1693. }
  1694. //u32LUTLength: length in (unsigned short)
  1695. int Epaper_Read_LUT(unsigned short* u16LUT, unsigned long u32LUTLength)
  1696. {
  1697. DISP_DATA_IN(AUO_EPAPER_CMD_LUT_READ, u16LUT, u32LUTLength);
  1698. return 0;
  1699. }
  1700. void Epaper_Reset(void)
  1701. {
  1702. DISP_CMD_OUT(AUO_EPAPER_CMD_RESET, NULL, 0);
  1703. }
  1704. int Epaper_Pre_DMA_Disp_Start(T_DISPLAY_FRAME tFrame)
  1705. {
  1706. DISP_PRE_DATA_OUT(tFrame.u16EpaperCommand, tFrame.tFrameRange);
  1707. return 0;
  1708. }
  1709. int Epaper_Pre_DMA_Disp_Stop(T_DISPLAY_FRAME tFrame)
  1710. {
  1711. if(tFrame.u16EpaperCommand == AUO_EPAPER_CMD_PRE_DISPLAY_START)
  1712. DISP_CMD_OUT(AUO_EPAPER_CMD_PRE_DISPLAY_STOP, NULL, 0);
  1713. else
  1714. DISP_CMD_OUT(AUO_EPAPER_CMD_STOP, NULL, 0);
  1715. return 0;
  1716. }
  1717. /* ########################################################################## */
  1718. #undef printk
  1719. #include <linux/auofb_ioctl.h>
  1720. /* [MTR] Add generic command function */
  1721. enum InfoLevel
  1722. {
  1723. INFO_ERROR = 0,
  1724. INFO_WARNING,
  1725. INFO_NORMAL,
  1726. INFO_DEBUG,
  1727. INFO_VERBOSE,
  1728. };
  1729. //#define EPAPER_DEBUG
  1730. //#define VERBOSE_LEVEL INFO_VERBOSE
  1731. #ifndef VERBOSE_LEVEL
  1732. #define VERBOSE_LEVEL INFO_WARNING
  1733. #endif
  1734. #ifdef EPAPER_DEBUG
  1735. static int _dbgFL = 0;
  1736. #define FUNC_IN() do { int i; _dbgFL++; printk(KERN_ERR "+"); for (i = 0; i < _dbgFL; i++) printk("-"); printk(">> %s() >>\n", __func__); } while(0)
  1737. #define FUNC_OUT() do { int i; printk(KERN_ERR "+"); for (i = 0; i < _dbgFL; i++) printk("-"); printk("<< %s() <<\n", __func__); _dbgFL--; } while(0)
  1738. #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)
  1739. #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)
  1740. #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)
  1741. #else
  1742. #define FUNC_IN() do {} while(0)
  1743. #define FUNC_OUT() do {} while(0)
  1744. #define FUNC_OUTR(val) do {} while(0)
  1745. #define INFOL(level, s) do { if (level <= VERBOSE_LEVEL) { printk("<%d>%s:%s(): ", level, __FILE__, __func__); printk s; printk("\n"); } } while(0)
  1746. #define INFO(s) do { printk("%s:%s(): ", __FILE__, __func__); printk s; printk("\n"); } while(0)
  1747. #endif
  1748. /* [/MTR] */