epaper.c 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522
  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. /* Compat tools */
  142. #define tcon_ndelay nDelay
  143. static int tcon_inPortraitMode = 0;
  144. #define tcon_set_write_to_data _SetWriteToData
  145. /*******/
  146. typedef enum {
  147. EN_I80_NONE = -1,
  148. EN_I80_LANDSCAPE = 0,
  149. EN_I80_PORTRAIT,
  150. EN_I80_LANDSCAPE_HANDWRITING,
  151. EN_I80_PORTRAIT_HANDWRITING,
  152. }I80_HWE_SPEED_MODE;
  153. //Global var
  154. static int delayLoopCount =150;//2M
  155. static int partial_update_mode = PARTIAL_DSP_MODE_0;
  156. static int gUser_h_resolution = AUO_EPAPER_PHYSICAL_H_RESOLUTION; //This is logic resolution, not PHYSICAL resolution, depand on rotation degree
  157. static int gUser_v_resolution = AUO_EPAPER_PHYSICAL_V_RESOLUTION; //This is logic resolution, not PHYSICAL resolution, depand on rotation degree
  158. static int gRotateDegree = 0;
  159. static unsigned char lcd_vbpd=0,lcd_vfpd=0,lcd_vspw=0,lcd_hbpd=0,lcd_hfpd=0,lcd_hspw=0;
  160. static unsigned short lcd_horizon_value=0,lcd_line_value=0;
  161. static unsigned char lcd_cs_setup=0,lcd_wr_setup=0,lcd_wr_act=0,lcd_wr_hold=0;
  162. static unsigned char lcd_frame_rate=50;
  163. static I80_HWE_SPEED_MODE gI80_Current_Speed = EN_I80_NONE;
  164. #ifdef EPAPER_BOOT_CODE
  165. //extern unsigned short Loading_Data[];
  166. #else
  167. extern unsigned short shutdown[];
  168. EXPORT_SYMBOL(Epaper_Shutdown_Logo);
  169. EXPORT_SYMBOL(Epaper_Get_Partial_Update_Mode);
  170. EXPORT_SYMBOL(Epaper_Power);
  171. EXPORT_SYMBOL(Epaper_Draw_Point);
  172. #endif
  173. /*
  174. 1. loops = 1 --> 25ns
  175. 2. loops = 75 --> 1 us
  176. 3. loops = 100000 --> 1ms
  177. */
  178. static inline void nDelay(unsigned long loops) //in ns
  179. {
  180. int i;
  181. __asm__ volatile ("1:\n" "subs %0, %1, #1\n" "bne 1b":"=r" (loops):"0"(loops));
  182. }
  183. static void __mDelay(unsigned long mTime)
  184. {
  185. unsigned long cnt=0;
  186. for(cnt=0;cnt<mTime;cnt++)
  187. nDelay(100000);
  188. }
  189. static void __uDelay(unsigned long uTime)
  190. {
  191. unsigned long cnt=0;
  192. for(cnt=0;cnt<uTime;cnt++)
  193. nDelay(75);
  194. }
  195. void Epaper_Set_I80_Default_Speed(I80_HWE_SPEED_MODE i80_speed, unsigned short w, unsigned short h);
  196. void Epaper_Change_I80_Speed(I80_HWE_SPEED_MODE i80_speed, unsigned short w, unsigned short h)
  197. {
  198. unsigned long tmp;
  199. unsigned char clkval=0;
  200. unsigned short h_cnt,v_cnt;
  201. unsigned long vclk;
  202. struct clk *lcd_clock;
  203. int HCLK ;
  204. if(gI80_Current_Speed == EN_I80_NONE)
  205. {
  206. Epaper_Set_I80_Default_Speed(i80_speed, w, h);
  207. return;
  208. }
  209. lcd_line_value = h;
  210. if((w%32) != 0) //DMA use WINCONx_4WORD_BURST, i.e. 16 bytes, i.e. 32 pixel
  211. w += 32 - (w%32);
  212. //printk("\nNew ( %d, %d)\n", w,h);
  213. lcd_horizon_value = w;
  214. switch(i80_speed)
  215. {
  216. default:
  217. case EN_I80_LANDSCAPE:
  218. lcd_cs_setup = I80_LANDSCAPE_CS_SETUP;
  219. lcd_wr_setup = I80_LANDSCAPE_WR_SETUP;
  220. lcd_wr_act = I80_LANDSCAPE_WR_ACT;
  221. lcd_wr_hold = I80_LANDSCAPE_WR_HOLD;
  222. break;
  223. case EN_I80_PORTRAIT:
  224. lcd_cs_setup = I80_PORTRAIT_CS_SETUP;
  225. lcd_wr_setup = I80_PORTRAIT_WR_SETUP;
  226. lcd_wr_act = I80_PORTRAIT_WR_ACT;
  227. lcd_wr_hold = I80_PORTRAIT_WR_HOLD;
  228. break;
  229. case EN_I80_LANDSCAPE_HANDWRITING:
  230. lcd_cs_setup = I80_LANDSCAPE_HANDWRITING_CS_SETUP;
  231. lcd_wr_setup = I80_LANDSCAPE_HANDWRITING_WR_SETUP;
  232. lcd_wr_act = I80_LANDSCAPE_HANDWRITING_WR_ACT;
  233. lcd_wr_hold = I80_LANDSCAPE_HANDWRITING_WR_HOLD;
  234. break;
  235. case EN_I80_PORTRAIT_HANDWRITING:
  236. lcd_cs_setup = I80_PORTRAIT_HANDWRITING_CS_SETUP;
  237. lcd_wr_setup = I80_PORTRAIT_HANDWRITING_WR_SETUP;
  238. lcd_wr_act = I80_PORTRAIT_HANDWRITING_WR_ACT;
  239. lcd_wr_hold = I80_PORTRAIT_HANDWRITING_WR_HOLD;
  240. break;
  241. }
  242. tmp = __raw_readl(rSYSIFCON0);
  243. tmp = (lcd_cs_setup<<16)|(lcd_wr_setup<<12)|(lcd_wr_act<<8)|(lcd_wr_hold<<4)|(1<<2)|(1<<1)|(1);
  244. __raw_writel(tmp, rSYSIFCON0);
  245. tmp = __raw_readl(rSYSIFCON1);
  246. tmp = (lcd_cs_setup<<16)|(lcd_wr_setup<<12)|(lcd_wr_act<<8)|(lcd_wr_hold<<4)|(1<<2)|(1<<1)|(1);
  247. __raw_writel(tmp, rSYSIFCON1);
  248. tmp = __raw_readl(rVIDTCON2);
  249. tmp = ((lcd_line_value-1)<<VIDTCON2_LINEVAL_S)|((lcd_horizon_value/4)-1);
  250. __raw_writel(tmp, rVIDTCON2);
  251. gI80_Current_Speed = i80_speed;
  252. }
  253. void Epaper_Set_I80_Default_Speed(I80_HWE_SPEED_MODE i80_speed, unsigned short w, unsigned short h)
  254. {
  255. unsigned long tmp;
  256. unsigned char clkval=0;
  257. unsigned short h_cnt,v_cnt;
  258. unsigned long vclk;
  259. struct clk *lcd_clock;
  260. int HCLK ;
  261. lcd_line_value = h;
  262. lcd_horizon_value = w;
  263. switch(i80_speed)
  264. {
  265. default:
  266. case EN_I80_LANDSCAPE:
  267. lcd_cs_setup = I80_LANDSCAPE_CS_SETUP;
  268. lcd_wr_setup = I80_LANDSCAPE_WR_SETUP;
  269. lcd_wr_act = I80_LANDSCAPE_WR_ACT;
  270. lcd_wr_hold = I80_LANDSCAPE_WR_HOLD;
  271. break;
  272. case EN_I80_PORTRAIT:
  273. lcd_cs_setup = I80_PORTRAIT_CS_SETUP;
  274. lcd_wr_setup = I80_PORTRAIT_WR_SETUP;
  275. lcd_wr_act = I80_PORTRAIT_WR_ACT;
  276. lcd_wr_hold = I80_PORTRAIT_WR_HOLD;
  277. break;
  278. case EN_I80_LANDSCAPE_HANDWRITING:
  279. lcd_cs_setup = I80_LANDSCAPE_HANDWRITING_CS_SETUP;
  280. lcd_wr_setup = I80_LANDSCAPE_HANDWRITING_WR_SETUP;
  281. lcd_wr_act = I80_LANDSCAPE_HANDWRITING_WR_ACT;
  282. lcd_wr_hold = I80_LANDSCAPE_HANDWRITING_WR_HOLD;
  283. break;
  284. case EN_I80_PORTRAIT_HANDWRITING:
  285. lcd_cs_setup = I80_PORTRAIT_HANDWRITING_CS_SETUP;
  286. lcd_wr_setup = I80_PORTRAIT_HANDWRITING_WR_SETUP;
  287. lcd_wr_act = I80_PORTRAIT_HANDWRITING_WR_ACT;
  288. lcd_wr_hold = I80_PORTRAIT_HANDWRITING_WR_HOLD;
  289. break;
  290. }
  291. tmp = __raw_readl(rVIDCON0);
  292. tmp = VIDCON0_S_CPU_IF_MAIN|VIDCON0_S_RGB_PAR|VIDCON0_S_VCLK_GATING_OFF|\
  293. VIDCON0_S_CLKDIR_DIVIDED|VIDCON0_S_CLKSEL_HCLK;
  294. __raw_writel(tmp, rVIDCON0);
  295. v_cnt = (lcd_vbpd+lcd_vfpd+lcd_vspw+lcd_line_value);
  296. h_cnt = (lcd_hbpd+lcd_hfpd+lcd_hspw+lcd_horizon_value);
  297. lcd_clock = clk_get(NULL, "hclk");
  298. HCLK = clk_get_rate(lcd_clock);
  299. //printk("\nHCLK=%d\n",HCLK);
  300. clkval = (unsigned int)(HCLK/(v_cnt*h_cnt*lcd_frame_rate)); //clkval=3 if 1024*768*50
  301. //clkval = 0x3f;
  302. vclk = (HCLK/(clkval+1))/1000;
  303. //DPRINTK("VCLK: %dKHz, clkval=%d\n",vclk, clkval);
  304. /*if(clkval > 0x3f)
  305. {
  306. DPRINTK("!!! Check frame rate: clkval = %d, over flow !!!\n",clkval);
  307. }*/
  308. tmp = __raw_readl(rVIDCON0);
  309. tmp |= (clkval <<VIDCON0_CLKVAL_F_SHIFT);
  310. __raw_writel(tmp, rVIDCON0);
  311. tmp = __raw_readl(rSYSIFCON0);
  312. tmp = (lcd_cs_setup<<16)|(lcd_wr_setup<<12)|(lcd_wr_act<<8)|(lcd_wr_hold<<4)|(1<<2)|(1<<1)|(1);
  313. __raw_writel(tmp, rSYSIFCON0);
  314. tmp = __raw_readl(rSYSIFCON1);
  315. tmp = (lcd_cs_setup<<16)|(lcd_wr_setup<<12)|(lcd_wr_act<<8)|(lcd_wr_hold<<4)|(1<<2)|(1<<1)|(1);
  316. __raw_writel(tmp, rSYSIFCON1);
  317. tmp = __raw_readl(rVIDTCON2);
  318. tmp = ((lcd_line_value-1)<<VIDTCON2_LINEVAL_S)|((lcd_horizon_value/4)-1);
  319. __raw_writel(tmp, rVIDTCON2);
  320. gI80_Current_Speed = i80_speed;
  321. }
  322. #ifdef EPAPER_BOOT_CODE
  323. void Epaper_Show_Progress(int percent)
  324. {
  325. T_DISPLAY_FRAME stDisFrame;
  326. int i;
  327. unsigned short u16ProgressBar_x, u16ProgressBar_y, u16ProgressBar_w, u16ProgressBar_h;
  328. static unsigned short progress_bar[PROGRESS_BAR_W*PROGRESS_BAR_H/4];
  329. int line_bytes;
  330. return;
  331. memset((unsigned char*)progress_bar, 0xff, PROGRESS_BAR_W*PROGRESS_BAR_H/4*2);
  332. switch(gRotateDegree)
  333. {
  334. default:
  335. case 0:
  336. {
  337. u16ProgressBar_x = PROGRESS_BAR_X;
  338. u16ProgressBar_y = PROGRESS_BAR_Y;
  339. u16ProgressBar_w = PROGRESS_BAR_W;
  340. u16ProgressBar_h = PROGRESS_BAR_H;
  341. line_bytes = u16ProgressBar_w/4*2;
  342. //draw percent
  343. memset((unsigned char*)progress_bar+(u16ProgressBar_h-(u16ProgressBar_h/100*percent))*line_bytes, 0x0,
  344. (u16ProgressBar_h/100*percent)*line_bytes);
  345. break;
  346. }
  347. case 90:
  348. {
  349. int draw_len = 0;
  350. u16ProgressBar_x = PROGRESS_BAR_90_X;
  351. u16ProgressBar_y = PROGRESS_BAR_90_Y;
  352. u16ProgressBar_w = PROGRESS_BAR_90_W;
  353. u16ProgressBar_h = PROGRESS_BAR_90_H;
  354. line_bytes = u16ProgressBar_w/4*2;
  355. //draw percent
  356. if((u16ProgressBar_w*percent/100)%4 != 0)
  357. {
  358. draw_len = (u16ProgressBar_w*percent/100) + (4)-((u16ProgressBar_w*percent/100)%4);
  359. }
  360. else
  361. draw_len = (u16ProgressBar_w*percent/100);
  362. for(i=0; i< u16ProgressBar_h; i++)
  363. {
  364. memset((unsigned char*)progress_bar + (u16ProgressBar_w/2)*i, 0x0, (draw_len/2));
  365. }
  366. break;
  367. }
  368. }
  369. //draw top frame line, line width = 8
  370. memset((unsigned char*)progress_bar, 0x0, PROGRESS_BAR_FRAME_LINE_W*line_bytes);
  371. //draw right frame line, line width = 8
  372. for(i=0;i<u16ProgressBar_h;i++)
  373. {
  374. memset(((unsigned char*)progress_bar)+((u16ProgressBar_w-PROGRESS_BAR_FRAME_LINE_W)/4*2)+(i*line_bytes), 0x0,
  375. PROGRESS_BAR_FRAME_LINE_W/4*2);
  376. }
  377. //draw left frame line, line width = 8
  378. for(i=0;i<u16ProgressBar_h;i++)
  379. {
  380. memset(((unsigned char*)progress_bar)+(i*line_bytes), 0x0, PROGRESS_BAR_FRAME_LINE_W/4*2);
  381. }
  382. //draw bottom frame line, line width = 8
  383. memset((unsigned char*)progress_bar+(u16ProgressBar_h-PROGRESS_BAR_FRAME_LINE_W)*line_bytes, 0x0,
  384. PROGRESS_BAR_FRAME_LINE_W*line_bytes);
  385. //send data
  386. partial_update_mode = 1;
  387. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  388. stDisFrame.tFrameRange.X = u16ProgressBar_x;
  389. stDisFrame.tFrameRange.Y = u16ProgressBar_y;
  390. stDisFrame.tFrameRange.W = u16ProgressBar_w;
  391. stDisFrame.tFrameRange.H = u16ProgressBar_h;
  392. stDisFrame.pFrameData = progress_bar;
  393. if(is_Epaper_Write_Ready())
  394. {
  395. //DPRINTK("\nEpaper Progress %d",percent);
  396. Epaper_Disp(stDisFrame);
  397. }
  398. }
  399. void Epaper_Clean_Panel(void)
  400. {
  401. //unsigned short clean_frame[gUser_h_resolution*gUser_v_resolution/4];
  402. unsigned short clean_frame[AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4];
  403. T_DISPLAY_FRAME stDisFrame;
  404. partial_update_mode = 0;
  405. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  406. stDisFrame.tFrameRange.X = 1;
  407. stDisFrame.tFrameRange.Y = 1;
  408. stDisFrame.tFrameRange.W = gUser_h_resolution;
  409. stDisFrame.tFrameRange.H = gUser_v_resolution;
  410. memset((unsigned char*)clean_frame, 0xff, AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4*2);
  411. stDisFrame.pFrameData = clean_frame;
  412. if(is_Epaper_Write_Ready())
  413. {
  414. //DPRINTK("\nEpaper clean panel");
  415. Epaper_Disp(stDisFrame);
  416. }
  417. }
  418. #else //KERNEL
  419. void Epaper_Show_Progress(int percent)
  420. {
  421. T_DISPLAY_FRAME stDisFrame;
  422. int i;
  423. unsigned short u16ProgressBar_x, u16ProgressBar_y, u16ProgressBar_w, u16ProgressBar_h;
  424. static unsigned short progress_bar[PROGRESS_BAR_W*PROGRESS_BAR_H/4];
  425. int line_bytes;
  426. return;
  427. memset((unsigned char*)progress_bar, 0xff, PROGRESS_BAR_W*PROGRESS_BAR_H/4*2);
  428. switch(gRotateDegree)
  429. {
  430. default:
  431. case 0:
  432. {
  433. u16ProgressBar_x = PROGRESS_BAR_X;
  434. u16ProgressBar_y = PROGRESS_BAR_Y;
  435. u16ProgressBar_w = PROGRESS_BAR_W;
  436. u16ProgressBar_h = PROGRESS_BAR_H;
  437. line_bytes = u16ProgressBar_w/4*2;
  438. //draw percent
  439. memset((unsigned char*)progress_bar+(u16ProgressBar_h-(u16ProgressBar_h/100*percent))*line_bytes, 0x0,
  440. (u16ProgressBar_h/100*percent)*line_bytes);
  441. break;
  442. }
  443. case 90:
  444. {
  445. int draw_len = 0;
  446. u16ProgressBar_x = PROGRESS_BAR_90_X;
  447. u16ProgressBar_y = PROGRESS_BAR_90_Y;
  448. u16ProgressBar_w = PROGRESS_BAR_90_W;
  449. u16ProgressBar_h = PROGRESS_BAR_90_H;
  450. line_bytes = u16ProgressBar_w/4*2;
  451. //draw percent
  452. if((u16ProgressBar_w*percent/100)%4 != 0)
  453. {
  454. draw_len = (u16ProgressBar_w*percent/100) + (4)-((u16ProgressBar_w*percent/100)%4);
  455. }
  456. else
  457. draw_len = (u16ProgressBar_w*percent/100);
  458. for(i=0; i< u16ProgressBar_h; i++)
  459. {
  460. memset((unsigned char*)progress_bar + (u16ProgressBar_w/2)*i, 0x0, (draw_len/2));
  461. }
  462. break;
  463. }
  464. }
  465. //draw top frame line, line width = 8
  466. memset((unsigned char*)progress_bar, 0x0, PROGRESS_BAR_FRAME_LINE_W*line_bytes);
  467. //draw right frame line, line width = 8
  468. for(i=0;i<u16ProgressBar_h;i++)
  469. {
  470. memset(((unsigned char*)progress_bar)+((u16ProgressBar_w-PROGRESS_BAR_FRAME_LINE_W)/4*2)+(i*line_bytes), 0x0,
  471. PROGRESS_BAR_FRAME_LINE_W/4*2);
  472. }
  473. //draw left frame line, line width = 8
  474. for(i=0;i<u16ProgressBar_h;i++)
  475. {
  476. memset(((unsigned char*)progress_bar)+(i*line_bytes), 0x0, PROGRESS_BAR_FRAME_LINE_W/4*2);
  477. }
  478. //draw bottom frame line, line width = 8
  479. memset((unsigned char*)progress_bar+(u16ProgressBar_h-PROGRESS_BAR_FRAME_LINE_W)*line_bytes, 0x0,
  480. PROGRESS_BAR_FRAME_LINE_W*line_bytes);
  481. //send data
  482. partial_update_mode = 1;
  483. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  484. stDisFrame.tFrameRange.X = u16ProgressBar_x;
  485. stDisFrame.tFrameRange.Y = u16ProgressBar_y;
  486. stDisFrame.tFrameRange.W = u16ProgressBar_w;
  487. stDisFrame.tFrameRange.H = u16ProgressBar_h;
  488. stDisFrame.pFrameData = progress_bar;
  489. if(is_Epaper_Write_Ready())
  490. {
  491. //DPRINTK("\nEpaper Progress %d",percent);
  492. Epaper_Disp(stDisFrame);
  493. }
  494. }
  495. void Epaper_Clean_Panel(void)
  496. {
  497. //unsigned short clean_frame[gUser_h_resolution*gUser_v_resolution/4];
  498. static unsigned short clean_frame[AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4];
  499. T_DISPLAY_FRAME stDisFrame;
  500. partial_update_mode = 0;
  501. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  502. stDisFrame.tFrameRange.X = 1;
  503. stDisFrame.tFrameRange.Y = 1;
  504. stDisFrame.tFrameRange.W = gUser_h_resolution;
  505. stDisFrame.tFrameRange.H = gUser_v_resolution;
  506. memset((unsigned char*)clean_frame, 0xff, AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4*2);
  507. stDisFrame.pFrameData = clean_frame;
  508. if(is_Epaper_Write_Ready())
  509. {
  510. //DPRINTK("\nEpaper clean panel");
  511. Epaper_Disp(stDisFrame);
  512. }
  513. }
  514. void Epaper_Pre_Display_Image(void)
  515. {
  516. //unsigned short clean_frame[gUser_h_resolution*gUser_v_resolution/4];
  517. static unsigned short clean_frame[AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4];
  518. T_DISPLAY_FRAME stDisFrame;
  519. partial_update_mode = 0;
  520. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PRE_DISPLAY_START;
  521. stDisFrame.tFrameRange.X = 1;
  522. stDisFrame.tFrameRange.Y = 1;
  523. stDisFrame.tFrameRange.W = gUser_h_resolution;
  524. stDisFrame.tFrameRange.H = gUser_v_resolution;
  525. memset((unsigned char*)clean_frame, 0xff, AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4*2);
  526. stDisFrame.pFrameData = clean_frame;
  527. if(is_Epaper_Write_Ready())
  528. {
  529. //DPRINTK("\nEpaper clean panel");
  530. Epaper_Disp(stDisFrame);
  531. }
  532. }
  533. void Epaper_Shutdown_Logo(void)
  534. {
  535. #if 0
  536. T_DISPLAY_FRAME stDisFrame;
  537. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  538. partial_update_mode = 0;
  539. stDisFrame.tFrameRange.X = 1;
  540. stDisFrame.tFrameRange.Y = 1;
  541. stDisFrame.tFrameRange.W = gUser_h_resolution;
  542. stDisFrame.tFrameRange.H = gUser_v_resolution;
  543. stDisFrame.pFrameData = shutdown;
  544. if(is_Epaper_Write_Ready())
  545. {
  546. printk("\nEpaper shutdown logo");
  547. Epaper_Disp(stDisFrame);
  548. }
  549. #else
  550. static unsigned short clean_frame[AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4];
  551. //static unsigned short clean_frame[1024*768/4];
  552. T_DISPLAY_FRAME stDisFrame;
  553. partial_update_mode = 0;
  554. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  555. stDisFrame.tFrameRange.X = 1;
  556. stDisFrame.tFrameRange.Y = 1;
  557. stDisFrame.tFrameRange.W = gUser_h_resolution;
  558. stDisFrame.tFrameRange.H = gUser_v_resolution;
  559. memset((unsigned char*)clean_frame, 0x00, AUO_EPAPER_PHYSICAL_H_RESOLUTION*AUO_EPAPER_PHYSICAL_V_RESOLUTION/4*2);
  560. stDisFrame.pFrameData = clean_frame;
  561. if(is_Epaper_Write_Ready())
  562. {
  563. //DPRINTK("\nEpaper clean panel");
  564. Epaper_Disp(stDisFrame);
  565. }
  566. #endif
  567. }
  568. void Epaper_Draw_Point(int x, int y)
  569. {
  570. unsigned short pint_data[4*4/4];
  571. T_DISPLAY_FRAME stDisFrame;
  572. if( ((x/2)*2) == x)
  573. return;
  574. stDisFrame.u16EpaperCommand = AUO_EPAPER_CMD_PARTIALDISP;
  575. partial_update_mode = 4;
  576. stDisFrame.tFrameRange.X = x;
  577. stDisFrame.tFrameRange.Y = y;
  578. stDisFrame.tFrameRange.W = 4;
  579. stDisFrame.tFrameRange.H = 4;
  580. stDisFrame.pFrameData = pint_data;
  581. if(is_Epaper_Write_Ready())
  582. {
  583. Epaper_Disp(stDisFrame);
  584. }
  585. }
  586. #endif //EPAPER_BOOT_CODE
  587. //This is logic resolution, not PHYSICAL resolution, depand on rotation degree
  588. void Epaper_Set_Resolution(int h_res, int v_res)
  589. {
  590. gUser_h_resolution = h_res;
  591. gUser_v_resolution = v_res;
  592. }
  593. int is_Epaper_Write_Ready_No_Wait(void)
  594. {
  595. unsigned long tmp;
  596. int iBusyCnt=0;
  597. tmp = __raw_readl(rGPBDAT);
  598. if((tmp & (1<<2))==0)
  599. {
  600. //DPRINTK("<= BAN =>panel is BUSY\n");
  601. return 0;
  602. }
  603. return 1;
  604. }
  605. int is_Epaper_Write_Ready(void)
  606. {
  607. unsigned long tmp;
  608. int iBusyCnt=0;
  609. int i=0;
  610. wait_queue_head_t busy_wq;
  611. init_waitqueue_head(&busy_wq);
  612. tmp = __raw_readl(rGPBDAT);
  613. while((tmp & (1<<2))==0)
  614. {
  615. //DPRINTK("<= BAN =>panel is BUSY\n");
  616. sleep_on_timeout(&busy_wq, 4);
  617. //msleep(100);
  618. /*for(i=0; i<20; i++)
  619. __mDelay(1);*/
  620. iBusyCnt ++;
  621. if(iBusyCnt>= BUSY_WAIT_TIMEOUT)
  622. {
  623. //DPRINTK("<= BAN =>Panel Disp Fail: BUSY time out\n");
  624. return 0;
  625. }
  626. tmp = __raw_readl(rGPBDAT);
  627. }
  628. return 1;
  629. }
  630. int is_Epaper_Write_Ready_Wait(unsigned long waitTime) //ms
  631. {
  632. unsigned long tmp;
  633. int iBusyCnt=0;
  634. int i=0;
  635. wait_queue_head_t busy_wq;
  636. init_waitqueue_head(&busy_wq);
  637. tmp = __raw_readl(rGPBDAT);
  638. while((tmp & (1<<2))==0)
  639. {
  640. sleep_on_timeout(&busy_wq, 4);
  641. //DPRINTK("<= BAN =>panel is BUSY\n");
  642. //msleep(100);
  643. /*for(i=0; i<20; i++)
  644. __mDelay(1);*/
  645. iBusyCnt ++;
  646. if(iBusyCnt>= (waitTime/20))
  647. {
  648. DPRINTK("<= BAN =>Panel Disp Fail: BUSY time out\n");
  649. return 0;
  650. }
  651. tmp = __raw_readl(rGPBDAT);
  652. }
  653. return 1;
  654. }
  655. int is_Epaper_Write_Ready_Busy_Wait(unsigned long waitTime) //ms
  656. {
  657. unsigned long tmp;
  658. int iBusyCnt=0;
  659. int i=0;
  660. wait_queue_head_t busy_wq;
  661. init_waitqueue_head(&busy_wq);
  662. tmp = __raw_readl(rGPBDAT);
  663. while((tmp & (1<<2))==0)
  664. {
  665. //sleep_on_timeout(&busy_wq, 4);
  666. //DPRINTK("<= BAN =>panel is BUSY\n");
  667. //msleep(100);
  668. for(i=0; i<20; i++)
  669. __mDelay(1);
  670. iBusyCnt ++;
  671. if(iBusyCnt>= (waitTime/20))
  672. {
  673. DPRINTK("<= BAN =>Panel Disp Fail: BUSY time out\n");
  674. return 0;
  675. }
  676. tmp = __raw_readl(rGPBDAT);
  677. }
  678. return 1;
  679. }
  680. static inline void s3c2416_i80_write(int data)
  681. {
  682. int tmp;
  683. tmp = __raw_readl(rSIFCCON0); // nWE enable
  684. tmp |= SYS_WR_CON;
  685. __raw_writel(tmp, rSIFCCON0);
  686. __raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
  687. tmp = __raw_readl(rSIFCCON0); // nWE disables
  688. tmp &= ~SYS_WR_CON;
  689. __raw_writel(tmp, rSIFCCON0);
  690. }
  691. static inline void s3c2416_i80_write_Rotate(int data)
  692. {
  693. int tmp;
  694. tmp = __raw_readl(rSIFCCON0); // nWE enable
  695. tmp |= SYS_WR_CON;
  696. __raw_writel(tmp, rSIFCCON0);
  697. //__uDelay(1);
  698. nDelay(25); //down to 1.5M
  699. __raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
  700. tmp = __raw_readl(rSIFCCON0); // nWE disable
  701. tmp &= ~SYS_WR_CON;
  702. __raw_writel(tmp, rSIFCCON0);
  703. }
  704. static inline void s3c2416_i80_write_HandWriting(int data)
  705. {
  706. int tmp;
  707. tmp = __raw_readl(rSIFCCON0); // nWE enable
  708. tmp |= SYS_WR_CON;
  709. __raw_writel(tmp, rSIFCCON0);
  710. nDelay(15); //down to 2M
  711. __raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
  712. tmp = __raw_readl(rSIFCCON0); // nWE disable
  713. tmp &= ~SYS_WR_CON;
  714. __raw_writel(tmp, rSIFCCON0);
  715. }
  716. static inline void s3c2416_i80_write_Rotate_HandWriting(int data)
  717. {
  718. int tmp;
  719. __uDelay(1);
  720. tmp = __raw_readl(rSIFCCON0); // nWE enable
  721. tmp |= SYS_WR_CON;
  722. __raw_writel(tmp, rSIFCCON0);
  723. __uDelay(1);
  724. __raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
  725. tmp = __raw_readl(rSIFCCON0); // nWE disable
  726. tmp &= ~SYS_WR_CON;
  727. __raw_writel(tmp, rSIFCCON0);
  728. }
  729. static inline void s3c2416_i80_write_LUT(int data)
  730. {
  731. int tmp;
  732. __uDelay(1);
  733. tmp = __raw_readl(rSIFCCON0); // nWE enable
  734. tmp |= SYS_WR_CON;
  735. __raw_writel(tmp, rSIFCCON0);
  736. __uDelay(1);
  737. __raw_writel(data, rSIFCCON1); //rSIFCCON1 = CMD;
  738. __uDelay(1);
  739. tmp = __raw_readl(rSIFCCON0); // nWE disable
  740. tmp &= ~SYS_WR_CON;
  741. __raw_writel(tmp, rSIFCCON0);
  742. }
  743. static inline void s3c2416_i80_read(unsigned short* data)
  744. {
  745. int tmp;
  746. __uDelay(1);
  747. tmp = __raw_readl(rSIFCCON0); // nRD enable
  748. tmp |= SYS_OE_CON;
  749. __raw_writel(tmp, rSIFCCON0);
  750. //__mDelay(1); //Ivan : must do
  751. __uDelay(1);
  752. *data = __raw_readl(rSIFCCON2); //CMD = rSIFCCON2;
  753. __uDelay(1);
  754. tmp = __raw_readl(rSIFCCON0); // nRD disable
  755. tmp &= ~SYS_OE_CON;
  756. __raw_writel(tmp, rSIFCCON0);
  757. }
  758. static int DISP_CMD_OUT(unsigned short CMD, unsigned short* pdata, int data_length)
  759. {
  760. unsigned long tmp;
  761. unsigned long cnt;
  762. int ret = 0;
  763. tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
  764. tmp |= (1<<2);
  765. __raw_writel(tmp, rSYSIFCON0);
  766. tmp = __raw_readl(rSIFCCON0); // command mode enable
  767. tmp |= (1<<0);
  768. __raw_writel(tmp, rSIFCCON0);
  769. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
  770. tmp |= (1<<8);
  771. __raw_writel(tmp, rSIFCCON0);
  772. __uDelay(1);
  773. tmp = __raw_readl(rSIFCCON0); // RS low
  774. tmp &= ~(1<<1);
  775. __raw_writel(tmp, rSIFCCON0);
  776. __uDelay(1);
  777. tmp = __raw_readl(rSIFCCON0); // nWE enable
  778. tmp |= (1<<6);
  779. __raw_writel(tmp, rSIFCCON0);
  780. __uDelay(1);
  781. __raw_writel(CMD, rSIFCCON1); //rSIFCCON1 = CMD;
  782. __uDelay(1);
  783. tmp = __raw_readl(rSIFCCON0); // nWE disable
  784. tmp &= ~(1<<6);
  785. __raw_writel(tmp, rSIFCCON0);
  786. __uDelay(1);
  787. tmp = __raw_readl(rSIFCCON0); // RS Hi
  788. tmp |= (1<<1);
  789. __raw_writel(tmp, rSIFCCON0);
  790. __uDelay(1);
  791. if(data_length > 0)
  792. {
  793. switch(CMD)
  794. {
  795. case AUO_EPAPER_CMD_INIT:
  796. {
  797. s3c2416_i80_write(*pdata);
  798. break;
  799. }
  800. case AUO_EPAPER_CMD_LUT_START:
  801. {
  802. for(cnt=0;cnt<data_length;cnt++)
  803. {
  804. __uDelay(1);
  805. if(is_Epaper_Write_Ready_Busy_Wait(10000))
  806. {
  807. __uDelay(1);
  808. s3c2416_i80_write_LUT((unsigned short)pdata[cnt]);
  809. }
  810. else
  811. {
  812. DPRINTK("EPD: Can not send LUT data\n");
  813. ret = -1;
  814. goto DISP_CMD_OUT_ERROR;
  815. }
  816. }
  817. if(is_Epaper_Write_Ready())
  818. {
  819. tmp = __raw_readl(rSIFCCON0); //rSIFCCON0 &= ~(1<<1); // RS low
  820. tmp &= ~(1<<1); // RS low
  821. __raw_writel(tmp, rSIFCCON0);
  822. __uDelay(1);
  823. s3c2416_i80_write(AUO_EPAPER_CMD_LUT_STOP);
  824. __uDelay(1);
  825. tmp = __raw_readl(rSIFCCON0); // RS Hi
  826. tmp |= (1<<1);
  827. __raw_writel(tmp, rSIFCCON0);
  828. }
  829. else
  830. {
  831. DPRINTK("EPD: Can not send AUO_EPAPER_CMD_LUT_STOP\n");
  832. ret = -1;
  833. goto DISP_CMD_OUT_ERROR;
  834. }
  835. break;
  836. }
  837. default:
  838. DPRINTK("unkonwn command\n");
  839. break;
  840. }
  841. }
  842. DISP_CMD_OUT_ERROR:
  843. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  844. tmp &= ~(1<<8);
  845. __raw_writel(tmp, rSIFCCON0);
  846. tmp = __raw_readl(rSIFCCON0); // command mode disable
  847. tmp &= ~(1<<0);
  848. __raw_writel(tmp, rSIFCCON0);
  849. }
  850. //Send 1 command and read parameters
  851. static void DISP_DATA_IN(unsigned short CMD, unsigned short* val_array, int val_count)
  852. {
  853. unsigned long tmp;
  854. int cnt;
  855. tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
  856. tmp |= (1<<2);
  857. __raw_writel(tmp, rSYSIFCON0);
  858. tmp = __raw_readl(rSIFCCON0); // command mode enable
  859. tmp |= (1<<0);
  860. __raw_writel(tmp, rSIFCCON0);
  861. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
  862. tmp |= (1<<8);
  863. __raw_writel(tmp, rSIFCCON0);
  864. __uDelay(1);
  865. tmp = __raw_readl(rSIFCCON0); // RS low
  866. tmp &= ~(1<<1);
  867. __raw_writel(tmp, rSIFCCON0);
  868. __uDelay(1);
  869. tmp = __raw_readl(rSIFCCON0); // nWE enable
  870. tmp |= (1<<6);
  871. __raw_writel(tmp, rSIFCCON0);
  872. __uDelay(1);
  873. __raw_writel(CMD, rSIFCCON1); //rSIFCCON1 = CMD;
  874. __uDelay(1);
  875. tmp = __raw_readl(rSIFCCON0); // nWE disable
  876. tmp &= ~(1<<6);
  877. __raw_writel(tmp, rSIFCCON0);
  878. __uDelay(1);
  879. tmp = __raw_readl(rSIFCCON0); // RS Hi
  880. tmp |= (1<<1);
  881. __raw_writel(tmp, rSIFCCON0);
  882. switch(CMD)
  883. {
  884. case AUO_EPAPER_CMD_TEMPER:
  885. {
  886. for(cnt=0;cnt<val_count;cnt++)
  887. {
  888. __mDelay(1);
  889. s3c2416_i80_read(&val_array[cnt]);
  890. }
  891. break;
  892. }
  893. case AUO_EPAPER_CMD_LUT_READ:
  894. {
  895. DPRINTK("\nLUT Read");
  896. for(cnt=0;cnt<val_count;cnt++)
  897. {
  898. if(is_Epaper_Write_Ready())
  899. {
  900. s3c2416_i80_read(&val_array[cnt]);
  901. }
  902. }
  903. if(is_Epaper_Write_Ready())
  904. {
  905. tmp = __raw_readl(rSIFCCON0); //rSIFCCON0 &= ~(1<<1); // RS low
  906. tmp &= ~(1<<1); // RS low
  907. __raw_writel(tmp, rSIFCCON0);
  908. __uDelay(1);
  909. s3c2416_i80_write(AUO_EPAPER_CMD_LUT_STOP);
  910. __uDelay(1);
  911. tmp = __raw_readl(rSIFCCON0); // RS Hi
  912. tmp |= (1<<1);
  913. __raw_writel(tmp, rSIFCCON0);
  914. }
  915. break;
  916. }
  917. default:
  918. DPRINTK("unkonwn command\n");
  919. break;
  920. }
  921. __uDelay(1);
  922. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  923. tmp &= ~(1<<8);
  924. __raw_writel(tmp, rSIFCCON0);
  925. tmp = __raw_readl(rSIFCCON0); // command mode disable
  926. tmp &= ~(1<<0);
  927. __raw_writel(tmp, rSIFCCON0);
  928. }
  929. static DISP_DATA_OUT(unsigned short CMD, unsigned short* pdata, T_DISPLAY_REGION REGION)
  930. {
  931. unsigned long tmp;
  932. unsigned long cnt;
  933. tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
  934. tmp |= (1<<2);
  935. __raw_writel(tmp, rSYSIFCON0);
  936. tmp = __raw_readl(rSIFCCON0); // command mode enable
  937. tmp |= (1<<0);
  938. __raw_writel(tmp, rSIFCCON0);
  939. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
  940. tmp |= (1<<8);
  941. __raw_writel(tmp, rSIFCCON0);
  942. //__uDelay(1);
  943. tmp = __raw_readl(rSIFCCON0); // RS low
  944. tmp &= ~(1<<1);
  945. __raw_writel(tmp, rSIFCCON0);
  946. //check busy again
  947. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  948. {
  949. DPRINTK("busy...\n");
  950. if(!is_Epaper_Write_Ready())
  951. {
  952. //busy
  953. tmp = __raw_readl(rSIFCCON0); // RS Hi
  954. tmp |= (1<<1);
  955. __raw_writel(tmp, rSIFCCON0);
  956. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  957. tmp &= ~(1<<8);
  958. __raw_writel(tmp, rSIFCCON0);
  959. tmp = __raw_readl(rSIFCCON0); // command mode disable
  960. tmp &= ~(1<<0);
  961. __raw_writel(tmp, rSIFCCON0);
  962. DPRINTK("ERROR, Still BUSY");
  963. return -1;
  964. }
  965. }
  966. //end
  967. //__uDelay(1);
  968. tmp = __raw_readl(rSIFCCON0); // nWE enable
  969. tmp |= (1<<6);
  970. __raw_writel(tmp, rSIFCCON0);
  971. __uDelay(1);
  972. //check busy again
  973. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  974. {
  975. DPRINTK("busy...\n");
  976. if(!is_Epaper_Write_Ready())
  977. {
  978. //busy
  979. //__uDelay(1);
  980. tmp = __raw_readl(rSIFCCON0); // nWE disable
  981. tmp &= ~(1<<6);
  982. __raw_writel(tmp, rSIFCCON0);
  983. tmp = __raw_readl(rSIFCCON0); // RS Hi
  984. tmp |= (1<<1);
  985. __raw_writel(tmp, rSIFCCON0);
  986. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  987. tmp &= ~(1<<8);
  988. __raw_writel(tmp, rSIFCCON0);
  989. tmp = __raw_readl(rSIFCCON0); // command mode disable
  990. tmp &= ~(1<<0);
  991. __raw_writel(tmp, rSIFCCON0);
  992. DPRINTK("ERROR, Still BUSY");
  993. return -1;
  994. }
  995. }
  996. //end
  997. __raw_writel(CMD, rSIFCCON1); //rSIFCCON1 = CMD;
  998. //__uDelay(1);
  999. tmp = __raw_readl(rSIFCCON0); // nWE disable
  1000. tmp &= ~(1<<6);
  1001. __raw_writel(tmp, rSIFCCON0);
  1002. //__uDelay(1);
  1003. tmp = __raw_readl(rSIFCCON0); // RS Hi
  1004. tmp |= (1<<1);
  1005. __raw_writel(tmp, rSIFCCON0);
  1006. __mDelay(1);
  1007. //check busy again
  1008. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1009. {
  1010. DPRINTK("busy...\n");
  1011. if(!is_Epaper_Write_Ready())
  1012. {
  1013. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1014. tmp &= ~(1<<8);
  1015. __raw_writel(tmp, rSIFCCON0);
  1016. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1017. tmp &= ~(1<<0);
  1018. __raw_writel(tmp, rSIFCCON0);
  1019. DPRINTK("ERROR, Still BUSY");
  1020. return -1;
  1021. }
  1022. }
  1023. //end
  1024. /* BAN 20090406 + for test panel*/
  1025. switch(CMD)
  1026. {
  1027. case AUO_EPAPER_CMD_FULLDISP:
  1028. {
  1029. break;
  1030. }
  1031. case AUO_EPAPER_CMD_PARTIALDISP:
  1032. case AUO_EPAPER_CMD_PRE_DISPLAY_START:
  1033. {
  1034. unsigned short current_mode=0;
  1035. 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);
  1036. //__uDelay(1);
  1037. //MOD + X
  1038. current_mode = ((unsigned short)partial_update_mode )<<12;
  1039. //if(partial_update_mode == PARTIAL_DSP_MODE_4)
  1040. // current_mode |= 0x8000; //Set "Write"
  1041. __mDelay(1);
  1042. //check busy again
  1043. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1044. {
  1045. DPRINTK("busy...\n");
  1046. if(!is_Epaper_Write_Ready())
  1047. {
  1048. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1049. tmp &= ~(1<<8);
  1050. __raw_writel(tmp, rSIFCCON0);
  1051. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1052. tmp &= ~(1<<0);
  1053. __raw_writel(tmp, rSIFCCON0);
  1054. DPRINTK("ERROR, Still BUSY");
  1055. return -1;
  1056. }
  1057. }
  1058. //end
  1059. printk(" EPAPER: ---- RX: 0x%04X\n", current_mode|REGION.X);
  1060. s3c2416_i80_write(current_mode|REGION.X);
  1061. __mDelay(1);
  1062. //check busy again
  1063. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1064. {
  1065. DPRINTK("busy...\n");
  1066. if(!is_Epaper_Write_Ready())
  1067. {
  1068. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1069. tmp &= ~(1<<8);
  1070. __raw_writel(tmp, rSIFCCON0);
  1071. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1072. tmp &= ~(1<<0);
  1073. __raw_writel(tmp, rSIFCCON0);
  1074. DPRINTK("ERROR, Still BUSY");
  1075. return -1;
  1076. }
  1077. }
  1078. //Y
  1079. printk(" EPAPER: ---- RY: 0x%04X\n", REGION.Y);
  1080. s3c2416_i80_write(REGION.Y);
  1081. __mDelay(1);
  1082. //check busy again
  1083. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1084. {
  1085. DPRINTK("busy...\n");
  1086. if(!is_Epaper_Write_Ready())
  1087. {
  1088. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1089. tmp &= ~(1<<8);
  1090. __raw_writel(tmp, rSIFCCON0);
  1091. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1092. tmp &= ~(1<<0);
  1093. __raw_writel(tmp, rSIFCCON0);
  1094. DPRINTK("ERROR, Still BUSY");
  1095. return -1;
  1096. }
  1097. }
  1098. //W
  1099. printk(" EPAPER: ---- RW: 0x%04X\n", REGION.W);
  1100. s3c2416_i80_write(REGION.W);
  1101. __mDelay(1);
  1102. //check busy again
  1103. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1104. {
  1105. DPRINTK("busy...\n");
  1106. if(!is_Epaper_Write_Ready())
  1107. {
  1108. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1109. tmp &= ~(1<<8);
  1110. __raw_writel(tmp, rSIFCCON0);
  1111. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1112. tmp &= ~(1<<0);
  1113. __raw_writel(tmp, rSIFCCON0);
  1114. DPRINTK("ERROR, Still BUSY");
  1115. return -1;
  1116. }
  1117. }
  1118. //H
  1119. printk(" EPAPER: ---- RH: 0x%04X\n", REGION.H);
  1120. s3c2416_i80_write(REGION.H);
  1121. __mDelay(1);
  1122. //check busy again
  1123. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1124. {
  1125. DPRINTK("busy...\n");
  1126. if(!is_Epaper_Write_Ready())
  1127. {
  1128. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1129. tmp &= ~(1<<8);
  1130. __raw_writel(tmp, rSIFCCON0);
  1131. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1132. tmp &= ~(1<<0);
  1133. __raw_writel(tmp, rSIFCCON0);
  1134. DPRINTK("ERROR, Still BUSY");
  1135. return -1;
  1136. }
  1137. }
  1138. if((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W))
  1139. {
  1140. DPRINTK("busy...\n");
  1141. if(gRotateDegree!=0)
  1142. {
  1143. DPRINTK("\nHand writing + Rotate");
  1144. for(cnt=0; cnt<(REGION.W*REGION.H/4); cnt++)
  1145. {
  1146. s3c2416_i80_write_Rotate_HandWriting((unsigned short)pdata[cnt]); //rSIFCCON1 = CMD;
  1147. }
  1148. }
  1149. else
  1150. {
  1151. DPRINTK("\nHand writing");
  1152. for(cnt=0; cnt<(REGION.W*REGION.H/4); cnt++)
  1153. {
  1154. s3c2416_i80_write_HandWriting((unsigned short)pdata[cnt]); //rSIFCCON1 = CMD;
  1155. }
  1156. }
  1157. }
  1158. else if(gRotateDegree!=0)
  1159. {
  1160. DPRINTK("\nRotate");
  1161. for(cnt=0; cnt<(REGION.W*REGION.H/4); cnt++)
  1162. {
  1163. s3c2416_i80_write_Rotate((unsigned short)pdata[cnt]); //rSIFCCON1 = CMD;
  1164. }
  1165. }
  1166. else
  1167. {
  1168. DPRINTK("\nnormal");
  1169. for(cnt=0; cnt<(REGION.W*REGION.H/4); cnt++)
  1170. {
  1171. s3c2416_i80_write((unsigned short)pdata[cnt]); //rSIFCCON1 = CMD;
  1172. }
  1173. }
  1174. break;
  1175. }
  1176. case AUO_EPAPER_CMD_STOP:
  1177. break;
  1178. default:
  1179. DPRINTK("unkonwn command\n");
  1180. break;
  1181. }
  1182. /* BAN 20090406 + for test panel*/
  1183. // STOP
  1184. tmp = __raw_readl(rSIFCCON0); //rSIFCCON0 &= ~(1<<1); // RS low
  1185. tmp &= ~(1<<1); // RS low
  1186. __raw_writel(tmp, rSIFCCON0);
  1187. //__uDelay(1);
  1188. switch(CMD)
  1189. {
  1190. default:
  1191. case AUO_EPAPER_CMD_PARTIALDISP:
  1192. {
  1193. s3c2416_i80_write(AUO_EPAPER_CMD_STOP);
  1194. break;
  1195. }
  1196. case AUO_EPAPER_CMD_PRE_DISPLAY_START:
  1197. {
  1198. s3c2416_i80_write(AUO_EPAPER_CMD_PRE_DISPLAY_STOP);
  1199. break;
  1200. }
  1201. }
  1202. //__uDelay(1);
  1203. tmp = __raw_readl(rSIFCCON0); // RS Hi
  1204. tmp |= (1<<1);
  1205. __raw_writel(tmp, rSIFCCON0);
  1206. //__uDelay(1);
  1207. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1208. tmp &= ~(1<<8);
  1209. __raw_writel(tmp, rSIFCCON0);
  1210. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1211. tmp &= ~(1<<0);
  1212. __raw_writel(tmp, rSIFCCON0);
  1213. return 0;
  1214. }
  1215. //Send mode, x, y, w, h only
  1216. static int DISP_PRE_DATA_OUT(unsigned short CMD, T_DISPLAY_REGION REGION)
  1217. {
  1218. unsigned long tmp;
  1219. unsigned long cnt;
  1220. unsigned short current_mode=0;
  1221. if((CMD != AUO_EPAPER_CMD_PARTIALDISP) && (CMD != AUO_EPAPER_CMD_PRE_DISPLAY_START))
  1222. return -1;
  1223. tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
  1224. tmp |= (1<<2);
  1225. __raw_writel(tmp, rSYSIFCON0);
  1226. tmp = __raw_readl(rSIFCCON0); // command mode enable
  1227. tmp |= (1<<0);
  1228. __raw_writel(tmp, rSIFCCON0);
  1229. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
  1230. tmp |= (1<<8);
  1231. __raw_writel(tmp, rSIFCCON0);
  1232. tmp = __raw_readl(rSIFCCON0); // RS low
  1233. tmp &= ~(1<<1);
  1234. __raw_writel(tmp, rSIFCCON0);
  1235. //check busy again
  1236. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1237. {
  1238. if(!is_Epaper_Write_Ready())
  1239. {
  1240. //busy
  1241. tmp = __raw_readl(rSIFCCON0); // RS Hi
  1242. tmp |= (1<<1);
  1243. __raw_writel(tmp, rSIFCCON0);
  1244. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1245. tmp &= ~(1<<8);
  1246. __raw_writel(tmp, rSIFCCON0);
  1247. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1248. tmp &= ~(1<<0);
  1249. __raw_writel(tmp, rSIFCCON0);
  1250. DPRINTK("ERROR, Still BUSY");
  1251. return -1;
  1252. }
  1253. }
  1254. //end
  1255. tmp = __raw_readl(rSIFCCON0); // nWE enable
  1256. tmp |= (1<<6);
  1257. __raw_writel(tmp, rSIFCCON0);
  1258. __uDelay(1);
  1259. //check busy again
  1260. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1261. {
  1262. if(!is_Epaper_Write_Ready())
  1263. {
  1264. //busy
  1265. //__uDelay(1);
  1266. tmp = __raw_readl(rSIFCCON0); // nWE disable
  1267. tmp &= ~(1<<6);
  1268. __raw_writel(tmp, rSIFCCON0);
  1269. tmp = __raw_readl(rSIFCCON0); // RS Hi
  1270. tmp |= (1<<1);
  1271. __raw_writel(tmp, rSIFCCON0);
  1272. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1273. tmp &= ~(1<<8);
  1274. __raw_writel(tmp, rSIFCCON0);
  1275. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1276. tmp &= ~(1<<0);
  1277. __raw_writel(tmp, rSIFCCON0);
  1278. DPRINTK("ERROR, Still BUSY");
  1279. return -1;
  1280. }
  1281. }
  1282. //end
  1283. __raw_writel(CMD, rSIFCCON1); //rSIFCCON1 = CMD;
  1284. tmp = __raw_readl(rSIFCCON0); // nWE disable
  1285. tmp &= ~(1<<6);
  1286. __raw_writel(tmp, rSIFCCON0);
  1287. tmp = __raw_readl(rSIFCCON0); // RS Hi
  1288. tmp |= (1<<1);
  1289. __raw_writel(tmp, rSIFCCON0);
  1290. __mDelay(1);
  1291. //check busy again
  1292. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1293. {
  1294. if(!is_Epaper_Write_Ready())
  1295. {
  1296. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1297. tmp &= ~(1<<8);
  1298. __raw_writel(tmp, rSIFCCON0);
  1299. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1300. tmp &= ~(1<<0);
  1301. __raw_writel(tmp, rSIFCCON0);
  1302. DPRINTK("ERROR, Still BUSY");
  1303. return -1;
  1304. }
  1305. }
  1306. //end
  1307. //MOD + X
  1308. //partial_update_mode = 0xC;
  1309. current_mode = ((unsigned short)partial_update_mode )<<12;
  1310. __mDelay(1);
  1311. s3c2416_i80_write(current_mode|REGION.X);
  1312. __mDelay(1);
  1313. //check busy again
  1314. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1315. {
  1316. if(!is_Epaper_Write_Ready())
  1317. {
  1318. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1319. tmp &= ~(1<<8);
  1320. __raw_writel(tmp, rSIFCCON0);
  1321. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1322. tmp &= ~(1<<0);
  1323. __raw_writel(tmp, rSIFCCON0);
  1324. DPRINTK("ERROR, Still BUSY");
  1325. return -1;
  1326. }
  1327. }
  1328. //end
  1329. //Y
  1330. s3c2416_i80_write(REGION.Y);
  1331. __mDelay(1);
  1332. //check busy again
  1333. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1334. {
  1335. if(!is_Epaper_Write_Ready())
  1336. {
  1337. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1338. tmp &= ~(1<<8);
  1339. __raw_writel(tmp, rSIFCCON0);
  1340. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1341. tmp &= ~(1<<0);
  1342. __raw_writel(tmp, rSIFCCON0);
  1343. DPRINTK("ERROR, Still BUSY");
  1344. return -1;
  1345. }
  1346. }
  1347. //end
  1348. //W
  1349. s3c2416_i80_write(REGION.W);
  1350. __mDelay(1);
  1351. //check busy again
  1352. if((!is_Epaper_Write_Ready_No_Wait())&&((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W)))
  1353. {
  1354. if(!is_Epaper_Write_Ready())
  1355. {
  1356. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1357. tmp &= ~(1<<8);
  1358. __raw_writel(tmp, rSIFCCON0);
  1359. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1360. tmp &= ~(1<<0);
  1361. __raw_writel(tmp, rSIFCCON0);
  1362. DPRINTK("ERROR, Still BUSY");
  1363. return -1;
  1364. }
  1365. }
  1366. //end
  1367. //H
  1368. s3c2416_i80_write(REGION.H);
  1369. __mDelay(1);
  1370. //printk("\nEPAPER (x,y,w,h)=(%d,%d,%d,%d)\n", REGION.X, REGION.Y, REGION.W, REGION.H);
  1371. if((partial_update_mode == PARTIAL_DSP_MODE_4)||(partial_update_mode == PARTIAL_DSP_MODE_4_W))
  1372. {
  1373. if(gRotateDegree!=0) //Rotate + handwriting
  1374. {
  1375. Epaper_Change_I80_Speed(EN_I80_PORTRAIT_HANDWRITING, REGION.W, REGION.H);
  1376. }
  1377. else //only handwriting
  1378. {
  1379. Epaper_Change_I80_Speed(EN_I80_LANDSCAPE_HANDWRITING, REGION.W, REGION.H);
  1380. }
  1381. }
  1382. else
  1383. {
  1384. if(gRotateDegree!=0) //Rotate
  1385. {
  1386. Epaper_Change_I80_Speed(EN_I80_PORTRAIT, REGION.W, REGION.H);
  1387. }
  1388. else //not rotate
  1389. {
  1390. Epaper_Change_I80_Speed(EN_I80_LANDSCAPE, REGION.W, REGION.H);
  1391. }
  1392. }
  1393. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) disable
  1394. tmp &= ~(1<<8);
  1395. __raw_writel(tmp, rSIFCCON0);
  1396. tmp = __raw_readl(rSIFCCON0); // command mode disable //must do this, or HWE will not send
  1397. tmp &= ~(1<<0);
  1398. __raw_writel(tmp, rSIFCCON0);
  1399. return 0;
  1400. }
  1401. void Epaper_SetLcdPort(void)
  1402. {
  1403. unsigned long tmp;
  1404. printk("TCON init - ");
  1405. // set gpio for lcd
  1406. tmp =__raw_readl(rGPCCON);
  1407. //tmp = (tmp & ~(0xffff03ff))|(0xaaaa02aa);
  1408. tmp = (tmp & ~(0xffff033f))|(0xaaaa022a); //Do not config SYS_CS1(GPC3)
  1409. __raw_writel(tmp, rGPCCON);
  1410. printk("Cybook Orizon Layout\n");
  1411. tmp =__raw_readl(rGPDCON); //tmp=0x40000
  1412. tmp = (tmp & ~(0x0CFFFF))|(0x04AAAA);
  1413. __raw_writel(tmp, rGPDCON); // GPD9 is RST_N
  1414. __raw_writel(0, rGPCUDP); //rGPCUDP = 0;
  1415. __raw_writel(0, rGPDUDP); //rGPDUDP = 0;
  1416. Epaper_Set_I80_Default_Speed(EN_I80_LANDSCAPE, AUO_EPAPER_PHYSICAL_H_RESOLUTION, AUO_EPAPER_PHYSICAL_V_RESOLUTION);
  1417. // POWER pin config
  1418. tmp =__raw_readl(rGPBCON);
  1419. tmp = (tmp & ~(3<<6))|(1<<6);
  1420. __raw_writel(tmp, rGPBCON);
  1421. // BUSY pin config
  1422. tmp =__raw_readl(rGPBCON);
  1423. tmp = (tmp & ~(3<<4));
  1424. __raw_writel(tmp, rGPBCON);
  1425. /*
  1426. tmp =__raw_readl(rGPBUDP);
  1427. tmp = (tmp & ~(3<<4));
  1428. //tmp = 0;
  1429. __raw_writel(tmp, rGPBUDP);*/
  1430. // SLEEP pin config
  1431. tmp =__raw_readl(rGPBCON);
  1432. tmp = (tmp & ~(3<<2))|(1<<2);
  1433. __raw_writel(tmp, rGPBCON);
  1434. __mDelay(1);
  1435. //SLEEP Pin High
  1436. /* tmp = __raw_readl(rGPBDAT);
  1437. tmp |= (1<<1);
  1438. __raw_writel(tmp, rGPBDAT);
  1439. udelay(1000);*/
  1440. // Panel power on
  1441. tmp = __raw_readl(rGPBDAT);
  1442. tmp |= (1<<3);
  1443. //SLP_N high
  1444. tmp |= (1<<1);
  1445. __raw_writel(tmp, rGPBDAT);
  1446. msleep(100);
  1447. // LCD module reset
  1448. tmp = __raw_readl(rGPDDAT);
  1449. tmp |= (1<<9);
  1450. __raw_writel(tmp, rGPDDAT);
  1451. tmp = __raw_readl(rGPDDAT); // goes to LOW
  1452. tmp &= ~(1<<9);
  1453. __raw_writel(tmp, rGPDDAT);
  1454. __uDelay(5);
  1455. tmp = __raw_readl(rGPDDAT); // goes to HIGH
  1456. tmp |= (1<<9);
  1457. __raw_writel(tmp, rGPDDAT);
  1458. // delay about 10ms
  1459. msleep(10);
  1460. }
  1461. void EPaper_CloseLcdPort(void)
  1462. {
  1463. unsigned long tmp;
  1464. //gpc0 input
  1465. s3c2410_gpio_pullup(S3C2410_GPC0,1);
  1466. s3c2410_gpio_cfgpin(S3C2410_GPC0, S3C2410_GPC0_INP);
  1467. //gpc1 input
  1468. s3c2410_gpio_pullup(S3C2410_GPC1,1);
  1469. s3c2410_gpio_cfgpin(S3C2410_GPC1, S3C2410_GPC1_INP);
  1470. //gpc2 input
  1471. s3c2410_gpio_pullup(S3C2410_GPC2,1);
  1472. s3c2410_gpio_cfgpin(S3C2410_GPC2, S3C2410_GPC2_INP);
  1473. //gpc4 input
  1474. s3c2410_gpio_pullup(S3C2410_GPC4,1);
  1475. s3c2410_gpio_cfgpin(S3C2410_GPC4, S3C2410_GPC4_INP);
  1476. //gpc8 input
  1477. s3c2410_gpio_pullup(S3C2410_GPC8,1);
  1478. s3c2410_gpio_cfgpin(S3C2410_GPC8, S3C2410_GPC8_INP);
  1479. //gpc9 input
  1480. s3c2410_gpio_pullup(S3C2410_GPC9,1);
  1481. s3c2410_gpio_cfgpin(S3C2410_GPC9, S3C2410_GPC9_INP);
  1482. //gpc10 input
  1483. s3c2410_gpio_pullup(S3C2410_GPC10,1);
  1484. s3c2410_gpio_cfgpin(S3C2410_GPC10, S3C2410_GPC10_INP);
  1485. //gpc11 input
  1486. s3c2410_gpio_pullup(S3C2410_GPC11,1);
  1487. s3c2410_gpio_cfgpin(S3C2410_GPC11, S3C2410_GPC11_INP);
  1488. //gpc12 input
  1489. s3c2410_gpio_pullup(S3C2410_GPC12,1);
  1490. s3c2410_gpio_cfgpin(S3C2410_GPC12, S3C2410_GPC12_INP);
  1491. //gpc13 input
  1492. s3c2410_gpio_pullup(S3C2410_GPC13,1);
  1493. s3c2410_gpio_cfgpin(S3C2410_GPC13, S3C2410_GPC13_INP);
  1494. //gpc14 input
  1495. s3c2410_gpio_pullup(S3C2410_GPC14,1);
  1496. s3c2410_gpio_cfgpin(S3C2410_GPC14, S3C2410_GPC14_INP);
  1497. //gpc15 input
  1498. s3c2410_gpio_pullup(S3C2410_GPC15,1);
  1499. s3c2410_gpio_cfgpin(S3C2410_GPC15, S3C2410_GPC15_INP);
  1500. //gpd0 input
  1501. s3c2410_gpio_pullup(S3C2410_GPD0,1);
  1502. s3c2410_gpio_cfgpin(S3C2410_GPD0, S3C2410_GPD0_INP);
  1503. //gpd1 input
  1504. s3c2410_gpio_pullup(S3C2410_GPD1,1);
  1505. s3c2410_gpio_cfgpin(S3C2410_GPD1, S3C2410_GPD1_INP);
  1506. //gpd2 input
  1507. s3c2410_gpio_pullup(S3C2410_GPD2,1);
  1508. s3c2410_gpio_cfgpin(S3C2410_GPD2, S3C2410_GPD2_INP);
  1509. //gpd3 input
  1510. s3c2410_gpio_pullup(S3C2410_GPD3,1);
  1511. s3c2410_gpio_cfgpin(S3C2410_GPD3, S3C2410_GPD3_INP);
  1512. //gpd4 input
  1513. s3c2410_gpio_pullup(S3C2410_GPD4,1);
  1514. s3c2410_gpio_cfgpin(S3C2410_GPD4, S3C2410_GPD4_INP);
  1515. //gpd5 input
  1516. s3c2410_gpio_pullup(S3C2410_GPD5,1);
  1517. s3c2410_gpio_cfgpin(S3C2410_GPD5, S3C2410_GPD5_INP);
  1518. //gpd6 input
  1519. s3c2410_gpio_pullup(S3C2410_GPD6,1);
  1520. s3c2410_gpio_cfgpin(S3C2410_GPD6, S3C2410_GPD6_INP);
  1521. //gpd7 input
  1522. s3c2410_gpio_pullup(S3C2410_GPD7,1);
  1523. s3c2410_gpio_cfgpin(S3C2410_GPD7, S3C2410_GPD7_INP);
  1524. //gpd9 output
  1525. s3c2410_gpio_pullup(S3C2410_GPD9,1);
  1526. s3c2410_gpio_cfgpin(S3C2410_GPD9, S3C2410_GPD9_OUTP);
  1527. s3c2410_gpio_setpin(S3C2410_GPD9,0);
  1528. //gpb1 input
  1529. s3c2410_gpio_pullup(S3C2410_GPB1,1);
  1530. s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_INP);
  1531. //gpb2 input
  1532. s3c2410_gpio_pullup(S3C2410_GPB2,1);
  1533. s3c2410_gpio_cfgpin(S3C2410_GPB2, S3C2410_GPB2_INP);
  1534. //gpb3 output
  1535. /*
  1536. s3c2410_gpio_pullup(S3C2410_GPB3,1);
  1537. s3c2410_gpio_cfgpin(S3C2410_GPB3, S3C2410_GPB3_OUTP);
  1538. s3c2410_gpio_setpin(S3C2410_GPB3,0);
  1539. */
  1540. /*tmp = __raw_readl(rGPCDAT);
  1541. DPRINTK("\nGPC=0x%x", tmp);
  1542. tmp = __raw_readl(rGPDDAT);
  1543. DPRINTK("\nGPD=0x%x", tmp);*/
  1544. gRotateDegree = 0;
  1545. }
  1546. int Epaper_Disp(T_DISPLAY_FRAME tFrame)
  1547. {
  1548. unsigned long tmp;
  1549. int iBusyCnt=0;
  1550. DPRINTK("<= BAN =>I80 Write\n");
  1551. DISP_DATA_OUT(tFrame.u16EpaperCommand,tFrame.pFrameData,tFrame.tFrameRange);
  1552. return 0;
  1553. }
  1554. void Epaper_Set_Partial_Update_Mode(int mode)
  1555. {
  1556. partial_update_mode = mode;
  1557. }
  1558. int Epaper_Get_Partial_Update_Mode(void)
  1559. {
  1560. return partial_update_mode;
  1561. }
  1562. void Epaper_Enter_Standby_Mode(int isEnter)
  1563. {
  1564. unsigned long tmp;
  1565. if(isEnter)
  1566. {
  1567. //send 0x0001 to T-CON to enter standby mode
  1568. DISP_CMD_OUT(AUO_EPAPER_CMD_STANDBY, NULL, 0);
  1569. }
  1570. else
  1571. {
  1572. //send 0x0002 to T-CON to leave standby mode
  1573. DISP_CMD_OUT(AUO_EPAPER_CMD_WAKEUP, NULL, 0);
  1574. }
  1575. }
  1576. void Epaper_Enter_Sleep_Mode(int isEnter)
  1577. {
  1578. unsigned long tmp;
  1579. if(isEnter)
  1580. {
  1581. tmp = __raw_readl(rGPBDAT);
  1582. tmp &= ~(1<<1);
  1583. __raw_writel(tmp, rGPBDAT);
  1584. }
  1585. else
  1586. {
  1587. tmp = __raw_readl(rGPBDAT);
  1588. tmp |= (1<<1);
  1589. __raw_writel(tmp, rGPBDAT);
  1590. }
  1591. }
  1592. void Epaper_Power(int isEnable)
  1593. {
  1594. unsigned long tmp;
  1595. if(isEnable)
  1596. {
  1597. tmp = __raw_readl(rGPBDAT);
  1598. tmp |= (1<<3);
  1599. __raw_writel(tmp, rGPBDAT);
  1600. }
  1601. else
  1602. {
  1603. tmp = __raw_readl(rGPBDAT);
  1604. tmp &= ~(1<<3);
  1605. __raw_writel(tmp, rGPBDAT);
  1606. }
  1607. }
  1608. void Epaper_Read_R_TEMP(unsigned short* val0, unsigned short* val1, unsigned short* val2, unsigned short* val3)
  1609. {
  1610. unsigned long tmp;
  1611. unsigned short val[4];
  1612. memset(val, 0x0, 8);
  1613. DISP_DATA_IN(AUO_EPAPER_CMD_TEMPER, val, 4);
  1614. *val0 = val[0];
  1615. *val1 = val[1];
  1616. *val2 = val[2];
  1617. *val3 = val[3];
  1618. }
  1619. void Epaper_Display_Refresh(void)
  1620. {
  1621. DISP_CMD_OUT(AUO_EPAPER_CMD_REFRESH, NULL, 0);
  1622. }
  1623. 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)
  1624. {
  1625. unsigned short u16InitPara=0;
  1626. if(is_Epaper_Write_Ready())
  1627. {
  1628. //TEMP_AVE_EN
  1629. if((temp_ave != 0) && (temp_ave != 1))
  1630. return -1;
  1631. u16InitPara = u16InitPara | (temp_ave<<13);
  1632. //M23_FILTER
  1633. //ROT
  1634. gRotateDegree = rotation;
  1635. if(rotation == 0)
  1636. {
  1637. gUser_h_resolution = h_Res;
  1638. gUser_v_resolution = v_Res;
  1639. Epaper_Change_I80_Speed(EN_I80_LANDSCAPE, gUser_h_resolution, gUser_v_resolution);
  1640. }
  1641. else if(rotation == 90)
  1642. {
  1643. u16InitPara = u16InitPara | (1<<10);
  1644. gUser_h_resolution = v_Res;
  1645. gUser_v_resolution = h_Res;
  1646. Epaper_Change_I80_Speed(EN_I80_PORTRAIT, gUser_h_resolution, gUser_v_resolution);
  1647. }
  1648. else if(rotation == 180)
  1649. {
  1650. u16InitPara = u16InitPara | (2<<10);
  1651. gUser_h_resolution = h_Res;
  1652. gUser_v_resolution = v_Res;
  1653. Epaper_Change_I80_Speed(EN_I80_PORTRAIT, gUser_h_resolution, gUser_v_resolution); //not test
  1654. }
  1655. else if(rotation == 270)
  1656. {
  1657. u16InitPara = u16InitPara | (3<<10);
  1658. gUser_h_resolution = v_Res;
  1659. gUser_v_resolution = h_Res;
  1660. Epaper_Change_I80_Speed(EN_I80_PORTRAIT, gUser_h_resolution, gUser_v_resolution);//not test
  1661. }
  1662. else
  1663. {
  1664. gUser_h_resolution = h_Res;
  1665. gUser_v_resolution = v_Res;
  1666. Epaper_Change_I80_Speed(EN_I80_LANDSCAPE, gUser_h_resolution, gUser_v_resolution);
  1667. }
  1668. //DI
  1669. //BN
  1670. //CHDA
  1671. //RES
  1672. if(AUO_EPAPER_PHYSICAL_H_RESOLUTION==1024 && AUO_EPAPER_PHYSICAL_V_RESOLUTION==768)
  1673. u16InitPara = u16InitPara | (1<<2);
  1674. else if(AUO_EPAPER_PHYSICAL_H_RESOLUTION==800 && AUO_EPAPER_PHYSICAL_V_RESOLUTION==600)
  1675. {
  1676. }
  1677. else
  1678. {
  1679. }
  1680. //UD
  1681. //SHL
  1682. u16InitPara = u16InitPara | 1;
  1683. DISP_CMD_OUT(AUO_EPAPER_CMD_INIT, &u16InitPara, 1);
  1684. DPRINTK("\nInit size=%d, Init data =0x%x\n", sizeof(unsigned short),u16InitPara);
  1685. return 0;
  1686. }
  1687. return -1;
  1688. }
  1689. //u32LUTLength: length in (unsigned short)
  1690. int Epaper_Update_LUT(unsigned short* u16LUT, unsigned long u32LUTLength)
  1691. {
  1692. unsigned long cnt=0;
  1693. if(is_Epaper_Write_Ready_Wait(10000))
  1694. {
  1695. return DISP_CMD_OUT(AUO_EPAPER_CMD_LUT_START, u16LUT, u32LUTLength);
  1696. }
  1697. else
  1698. return -1;
  1699. }
  1700. //u32LUTLength: length in (unsigned short)
  1701. int Epaper_Read_LUT(unsigned short* u16LUT, unsigned long u32LUTLength)
  1702. {
  1703. DISP_DATA_IN(AUO_EPAPER_CMD_LUT_READ, u16LUT, u32LUTLength);
  1704. return 0;
  1705. }
  1706. void Epaper_Reset(void)
  1707. {
  1708. DISP_CMD_OUT(AUO_EPAPER_CMD_RESET, NULL, 0);
  1709. }
  1710. int Epaper_Pre_DMA_Disp_Start(T_DISPLAY_FRAME tFrame)
  1711. {
  1712. DISP_PRE_DATA_OUT(tFrame.u16EpaperCommand, tFrame.tFrameRange);
  1713. return 0;
  1714. }
  1715. int Epaper_Pre_DMA_Disp_Stop(T_DISPLAY_FRAME tFrame)
  1716. {
  1717. if(tFrame.u16EpaperCommand == AUO_EPAPER_CMD_PRE_DISPLAY_START)
  1718. DISP_CMD_OUT(AUO_EPAPER_CMD_PRE_DISPLAY_STOP, NULL, 0);
  1719. else
  1720. DISP_CMD_OUT(AUO_EPAPER_CMD_STOP, NULL, 0);
  1721. return 0;
  1722. }
  1723. /* ########################################################################## */
  1724. #undef printk
  1725. #include <linux/auofb_ioctl.h>
  1726. /* [MTR] Add generic command function */
  1727. enum InfoLevel
  1728. {
  1729. INFO_ERROR = 0,
  1730. INFO_WARNING,
  1731. INFO_NORMAL,
  1732. INFO_DEBUG,
  1733. INFO_VERBOSE,
  1734. };
  1735. #define EPAPER_DEBUG
  1736. #define VERBOSE_LEVEL INFO_VERBOSE
  1737. #ifndef VERBOSE_LEVEL
  1738. #define VERBOSE_LEVEL INFO_WARNING
  1739. #endif
  1740. #ifdef EPAPER_DEBUG
  1741. static int _dbgFL = 0;
  1742. #define FUNC_IN() do { int i; _dbgFL++; printk(KERN_ERR "+"); for (i = 0; i < _dbgFL; i++) printk("-"); printk(">> %s() >>\n", __func__); } while(0)
  1743. #define FUNC_OUT() do { int i; printk(KERN_ERR "+"); for (i = 0; i < _dbgFL; i++) printk("-"); printk("<< %s() <<\n", __func__); _dbgFL--; } while(0)
  1744. #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)
  1745. #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)
  1746. #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)
  1747. #else
  1748. #define FUNC_IN() do {} while(0)
  1749. #define FUNC_OUT() do {} while(0)
  1750. #define FUNC_OUTR(val) do {} while(0)
  1751. #define INFOL(level, s) do { if (level <= VERBOSE_LEVEL) { printk("<%d>%s:%s(): ", level, __FILE__, __func__); printk s; printk("\n"); } } while(0)
  1752. #define INFO(s) do { printk("%s:%s(): ", __FILE__, __func__); printk s; printk("\n"); } while(0)
  1753. #endif
  1754. //#define GET_COMMAND_PARAM_NUM(command) ((command >> 20) & 0x0F)
  1755. //#define GET_COMMAND_HAVE_DATA(command) ((command >> 28) & 0x01)
  1756. //#define GET_COMMAND_NEED_WAIT(command) ((command >> 29) & 0x01)
  1757. /* On the i80 port,
  1758. * i80 TCON
  1759. * -----------
  1760. * RS -> D/C
  1761. * CS0 -> CSEL
  1762. * nWE -> HWE
  1763. * OE -> HRD
  1764. */
  1765. static inline void _InitI80Interface(void)
  1766. {
  1767. unsigned long tmp;
  1768. FUNC_IN();
  1769. tmp = __raw_readl(rSYSIFCON0); //polarity of RS, set 1 for normal access
  1770. tmp |= (1<<2);
  1771. __raw_writel(tmp, rSYSIFCON0);
  1772. tmp = __raw_readl(rSIFCCON0); // command mode enable
  1773. tmp |= (1<<0);
  1774. __raw_writel(tmp, rSIFCCON0);
  1775. FUNC_OUT();
  1776. }
  1777. static inline void _DeinitI80Interface(void)
  1778. {
  1779. unsigned long tmp;
  1780. FUNC_IN();
  1781. tmp = __raw_readl(rSIFCCON0); // command mode disable
  1782. tmp &= ~(1<<0);
  1783. __raw_writel(tmp, rSIFCCON0);
  1784. FUNC_OUT();
  1785. }
  1786. static inline void _SetWriteToData(void)
  1787. {
  1788. unsigned long tmp;
  1789. FUNC_IN();
  1790. tmp = __raw_readl(rSIFCCON0);
  1791. // RS high -> D/nC set Data mode
  1792. tmp |= (1<<1);
  1793. __raw_writel(tmp, rSIFCCON0);
  1794. __uDelay(1);
  1795. FUNC_OUT();
  1796. }
  1797. static inline void _SetWriteToCommand(void)
  1798. {
  1799. unsigned long tmp;
  1800. FUNC_IN();
  1801. tmp = __raw_readl(rSIFCCON0);
  1802. // RS low -> D/nC set Command mode
  1803. tmp &= ~(1<<1);
  1804. __raw_writel(tmp, rSIFCCON0);
  1805. __uDelay(1);
  1806. FUNC_OUT();
  1807. }
  1808. static inline void _EnableWrite(void)
  1809. {
  1810. unsigned long tmp;
  1811. FUNC_IN();
  1812. tmp = __raw_readl(rSIFCCON0);
  1813. // nWE -> HWE enable
  1814. tmp |= (1<<6);
  1815. __raw_writel(tmp, rSIFCCON0);
  1816. __uDelay(1);
  1817. FUNC_OUT();
  1818. }
  1819. static inline void _DisableWrite(void)
  1820. {
  1821. unsigned long tmp;
  1822. FUNC_IN();
  1823. tmp = __raw_readl(rSIFCCON0);
  1824. // nWE -> HWE disable
  1825. tmp &= ~(1<<6);
  1826. __raw_writel(tmp, rSIFCCON0);
  1827. __uDelay(1);
  1828. FUNC_OUT();
  1829. }
  1830. static inline void _EnableRead(void)
  1831. {
  1832. unsigned long tmp;
  1833. FUNC_IN();
  1834. tmp = __raw_readl(rSIFCCON0); // nRD enable
  1835. tmp |= SYS_OE_CON;
  1836. __raw_writel(tmp, rSIFCCON0);
  1837. __uDelay(1);
  1838. FUNC_OUT();
  1839. }
  1840. static inline void _DisableRead(void)
  1841. {
  1842. unsigned long tmp;
  1843. FUNC_IN();
  1844. tmp = __raw_readl(rSIFCCON0); // nRD disable
  1845. tmp &= ~SYS_OE_CON;
  1846. __raw_writel(tmp, rSIFCCON0);
  1847. __uDelay(1);
  1848. FUNC_OUT();
  1849. }
  1850. static inline void _SelectChip(void)
  1851. {
  1852. unsigned long tmp;
  1853. FUNC_IN();
  1854. tmp = __raw_readl(rSIFCCON0); // Chip Select
  1855. tmp |= (1<<8);
  1856. __raw_writel(tmp, rSIFCCON0);
  1857. __uDelay(1);
  1858. FUNC_OUT();
  1859. }
  1860. static inline void _UnselectChip(void)
  1861. {
  1862. unsigned long tmp;
  1863. FUNC_IN();
  1864. tmp = __raw_readl(rSIFCCON0); // nCS0(Main) enable
  1865. tmp &= ~(1<<8);
  1866. __raw_writel(tmp, rSIFCCON0);
  1867. __uDelay(1);
  1868. FUNC_OUT();
  1869. }
  1870. #define tcon_i80bus_write s3c2416_i80_write
  1871. int Epaper_sendCommandStart(sAUOCommand *cmd)
  1872. {
  1873. FUNC_IN();
  1874. INFOL(INFO_VERBOSE,("cmd #%08lX", cmd->cmd));
  1875. /* First: verify that the K1900 is ready */
  1876. INFOL(INFO_VERBOSE, ("/* First: verify that the K1900 is ready */"));
  1877. if (GET_COMMAND_NEED_WAIT(cmd->cmd) != 0x00)
  1878. {
  1879. INFOL(INFO_VERBOSE, ("Wait for non BUSY..."));
  1880. is_Epaper_Write_Ready();
  1881. }
  1882. if (cmd->cmd == AUOCMD_INIT_SET)
  1883. {
  1884. tcon_inPortraitMode = ~(cmd->params[0]) & (0x1 << 10);
  1885. if (tcon_inPortraitMode)
  1886. Epaper_Change_I80_Speed(EN_I80_PORTRAIT, 800, 600);
  1887. else
  1888. Epaper_Change_I80_Speed(EN_I80_LANDSCAPE, 600, 800);
  1889. INFOL(INFO_VERBOSE, ("Rotation set to 0x%08X...", tcon_inPortraitMode));
  1890. }
  1891. /* Second: init the i80 interface */
  1892. INFOL(INFO_VERBOSE, ("/* Second: init the i80 interface */"));
  1893. //tcon_i80bus_init_interface();
  1894. /* Third: Select the chip and set to Command mode */
  1895. INFOL(INFO_VERBOSE, ("/* Third: Select the chip and set to Command mode */"));
  1896. _SelectChip();
  1897. _SetWriteToCommand();
  1898. /* Fourth: Send command */
  1899. INFOL(INFO_VERBOSE, ("/* Fourth: Send command */"));
  1900. tcon_i80bus_write(cmd->cmd & 0xFFFF); /* This function already manage
  1901. * no need to do it here. */
  1902. /* Sixth: If parameters is needed, send them */
  1903. INFOL(INFO_VERBOSE, ("/* Sixth: If parameters is needed, send them */"));
  1904. if (GET_COMMAND_PARAM_NUM(cmd->cmd) > 0)
  1905. {
  1906. int i, paramNumbers = GET_COMMAND_PARAM_NUM(cmd->cmd);
  1907. INFOL(INFO_VERBOSE, ("YES! We have %d parameters", paramNumbers));
  1908. tcon_set_write_to_data();
  1909. for (i = 0; i < paramNumbers; i++)
  1910. {
  1911. INFOL(INFO_VERBOSE, (" parameter [%02d] = 0x%04X", i, cmd->params[i]));
  1912. tcon_i80bus_write(cmd->params[i]);
  1913. }
  1914. }
  1915. FUNC_OUT();
  1916. return 0;
  1917. }
  1918. int Epaper_sendData(unsigned short *buffer, unsigned long bufferLen)
  1919. {
  1920. /* Seventh: Send data if needed */
  1921. unsigned long i;
  1922. //FUNC_IN();
  1923. //INFOL(INFO_VERBOSE, ("Bufferlen: %ld", bufferLen));
  1924. tcon_set_write_to_data();
  1925. for (i = 0; i < bufferLen; i++)
  1926. {
  1927. tcon_i80bus_write(buffer[i]);
  1928. }
  1929. //FUNC_OUT();
  1930. return 0;
  1931. }
  1932. int Epaper_sendCommandEnd(sAUOCommand *cmd)
  1933. {
  1934. FUNC_IN();
  1935. INFOL(INFO_VERBOSE,("cmd #%08lX START:[#%08X]", cmd->cmd, AUOCMD_DISPLAY_START));
  1936. if (cmd->cmd == AUOCMD_DISPLAY_START)
  1937. {
  1938. _SetWriteToCommand();
  1939. INFOL(INFO_VERBOSE, ("/* Eight: Send STOP command */"));
  1940. tcon_i80bus_write(AUOCMD_DISPLAY_STOP & 0xFFFF);
  1941. _SetWriteToData();
  1942. }
  1943. INFOL(INFO_VERBOSE, ("/* Nineth: Close all */"));
  1944. _UnselectChip();
  1945. _DeinitI80Interface();
  1946. //tcon_i80bus_deinit_interface();
  1947. FUNC_OUT();
  1948. return 0;
  1949. }
  1950. /* [/MTR] */