drv_lcd.c 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-12-28 unknow copy by STemwin
  9. * 2021-12-29 xiangxistu port for lvgl <lcd_fill_array>
  10. * 2022-6-26 solar Improve the api required for resistive touch screen calibration
  11. */
  12. #include <board.h>
  13. #include "drv_lcd.h"
  14. #include <drv_gpio.h>
  15. #include <string.h>
  16. //#define DRV_DEBUG
  17. #define LOG_TAG "drv.lcd"
  18. #include <drv_log.h>
  19. _lcd_dev lcddev;
  20. SRAM_HandleTypeDef hsram1;
  21. #define LCD_BL GET_PIN(B, 15)
  22. #define LCD_BASE ((uint32_t)(0x6C000000 | 0x0000007E))
  23. #define LCD ((LCD_CONTROLLER_TypeDef *)LCD_BASE)
  24. #define LCD_DEVICE(dev) (struct drv_lcd_device *)(dev)
  25. struct drv_lcd_device
  26. {
  27. struct rt_device parent;
  28. struct rt_device_graphic_info lcd_info;
  29. };
  30. static struct drv_lcd_device _lcd;
  31. //写寄存器函数
  32. //regval:寄存器值
  33. void LCD_WR_REG(uint16_t regval)
  34. {
  35. LCD->REG = regval; //写入要写的寄存器序号
  36. }
  37. //写LCD数据
  38. //data:要写入的值
  39. void LCD_WR_DATA(uint16_t data)
  40. {
  41. LCD->RAM = data;
  42. }
  43. //读LCD数据
  44. //返回值:读到的值
  45. uint16_t LCD_RD_DATA(void)
  46. {
  47. return LCD->RAM;
  48. }
  49. //写寄存器
  50. //LCD_Reg:寄存器地址
  51. //LCD_RegValue:要写入的数据
  52. void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue)
  53. {
  54. LCD->REG = LCD_Reg; //写入要写的寄存器序号
  55. LCD->RAM = LCD_RegValue; //写入数据
  56. }
  57. //读寄存器
  58. //LCD_Reg:寄存器地址
  59. //返回值:读到的数据
  60. uint16_t LCD_ReadReg(uint16_t LCD_Reg)
  61. {
  62. LCD_WR_REG(LCD_Reg); //写入要读的寄存器序号
  63. return LCD_RD_DATA(); //返回读到的值
  64. }
  65. //开始写GRAM
  66. void LCD_WriteRAM_Prepare(void)
  67. {
  68. LCD->REG = lcddev.wramcmd;
  69. }
  70. //LCD写GRAM
  71. //RGB_Code:颜色值
  72. void LCD_WriteRAM(uint16_t RGB_Code)
  73. {
  74. LCD->RAM = RGB_Code; //写十六位GRAM
  75. }
  76. //从ILI93xx读出的数据为GBR格式,而我们写入的时候为RGB格式。
  77. //通过该函数转换
  78. //c:GBR格式的颜色值
  79. //返回值:RGB格式的颜色值
  80. uint16_t LCD_BGR2RGB(uint16_t c)
  81. {
  82. uint16_t r, g, b, rgb;
  83. b = (c >> 0) & 0x1f;
  84. g = (c >> 5) & 0x3f;
  85. r = (c >> 11) & 0x1f;
  86. rgb = (b << 11) + (g << 5) + (r << 0);
  87. return (rgb);
  88. }
  89. //设置光标位置(对RGB屏无效)
  90. //Xpos:横坐标
  91. //Ypos:纵坐标
  92. void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
  93. {
  94. if (lcddev.id == 0X9341 || lcddev.id == 0X5310)
  95. {
  96. LCD_WR_REG(lcddev.setxcmd);
  97. LCD_WR_DATA(Xpos >> 8);
  98. LCD_WR_DATA(Xpos & 0XFF);
  99. LCD_WR_REG(lcddev.setycmd);
  100. LCD_WR_DATA(Ypos >> 8);
  101. LCD_WR_DATA(Ypos & 0XFF);
  102. }
  103. else if (lcddev.id == 0X1963)
  104. {
  105. if (lcddev.dir == 0) //x坐标需要变换
  106. {
  107. Xpos = lcddev.width - 1 - Xpos;
  108. LCD_WR_REG(lcddev.setxcmd);
  109. LCD_WR_DATA(0);
  110. LCD_WR_DATA(0);
  111. LCD_WR_DATA(Xpos >> 8);
  112. LCD_WR_DATA(Xpos & 0XFF);
  113. }
  114. else
  115. {
  116. LCD_WR_REG(lcddev.setxcmd);
  117. LCD_WR_DATA(Xpos >> 8);
  118. LCD_WR_DATA(Xpos & 0XFF);
  119. LCD_WR_DATA((lcddev.width - 1) >> 8);
  120. LCD_WR_DATA((lcddev.width - 1) & 0XFF);
  121. }
  122. LCD_WR_REG(lcddev.setycmd);
  123. LCD_WR_DATA(Ypos >> 8);
  124. LCD_WR_DATA(Ypos & 0XFF);
  125. LCD_WR_DATA((lcddev.height - 1) >> 8);
  126. LCD_WR_DATA((lcddev.height - 1) & 0XFF);
  127. }
  128. else if (lcddev.id == 0X5510)
  129. {
  130. LCD_WR_REG(lcddev.setxcmd);
  131. LCD_WR_DATA(Xpos >> 8);
  132. LCD_WR_REG(lcddev.setxcmd + 1);
  133. LCD_WR_DATA(Xpos & 0XFF);
  134. LCD_WR_REG(lcddev.setycmd);
  135. LCD_WR_DATA(Ypos >> 8);
  136. LCD_WR_REG(lcddev.setycmd + 1);
  137. LCD_WR_DATA(Ypos & 0XFF);
  138. }
  139. }
  140. //读取个某点的颜色值
  141. //x,y:坐标
  142. //返回值:此点的颜色
  143. void LCD_ReadPoint(char *pixel, int x, int y)
  144. {
  145. uint16_t *color = (uint16_t *)pixel;
  146. uint16_t r = 0, g = 0, b = 0;
  147. if (x >= lcddev.width || y >= lcddev.height)
  148. {
  149. *color = 0; //超过了范围,直接返回
  150. return;
  151. }
  152. LCD_SetCursor(x, y);
  153. if (lcddev.id == 0X9341 || lcddev.id == 0X5310 || lcddev.id == 0X1963)
  154. LCD_WR_REG(0X2E); //9341/3510/1963 发送读GRAM指令
  155. else if (lcddev.id == 0X5510)
  156. LCD_WR_REG(0X2E00); //5510 发送读GRAM指令
  157. r = LCD_RD_DATA(); //dummy Read
  158. if (lcddev.id == 0X1963)
  159. {
  160. *color = r;
  161. return; //1963直接读就可以
  162. }
  163. r = LCD_RD_DATA(); //实际坐标颜色
  164. //9341/NT35310/NT35510要分2次读出
  165. b = LCD_RD_DATA();
  166. g = r & 0XFF; //对于9341/5310/5510,第一次读取的是RG的值,R在前,G在后,各占8位
  167. g <<= 8;
  168. *color = (((r >> 11) << 11) | ((g >> 10) << 5) | (b >> 11)); //ILI9341/NT35310/NT35510需要公式转换一下
  169. }
  170. //LCD开启显示
  171. void LCD_DisplayOn(void)
  172. {
  173. if (lcddev.id == 0X9341 || lcddev.id == 0X5310 || lcddev.id == 0X1963)
  174. LCD_WR_REG(0X29); //开启显示
  175. else if (lcddev.id == 0X5510)
  176. LCD_WR_REG(0X2900); //开启显示
  177. }
  178. //LCD关闭显示
  179. void LCD_DisplayOff(void)
  180. {
  181. if (lcddev.id == 0X9341 || lcddev.id == 0X5310 || lcddev.id == 0X1963)
  182. LCD_WR_REG(0X28); //关闭显示
  183. else if (lcddev.id == 0X5510)
  184. LCD_WR_REG(0X2800); //关闭显示
  185. }
  186. //设置LCD的自动扫描方向(对RGB屏无效)
  187. //注意:其他函数可能会受到此函数设置的影响(尤其是9341),
  188. //所以,一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常.
  189. //dir:0~7,代表8个方向(具体定义见lcd.h)
  190. //9341/5310/5510/1963等IC已经实际测试
  191. void LCD_Scan_Dir(uint8_t dir)
  192. {
  193. uint16_t regval = 0;
  194. uint16_t dirreg = 0;
  195. uint16_t temp;
  196. if ((lcddev.dir == 1 && lcddev.id != 0X1963) || (lcddev.dir == 0 && lcddev.id == 0X1963)) //横屏时,对1963不改变扫描方向!竖屏时1963改变方向
  197. {
  198. switch (dir) //方向转换
  199. {
  200. case 0:
  201. dir = 6;
  202. break;
  203. case 1:
  204. dir = 7;
  205. break;
  206. case 2:
  207. dir = 4;
  208. break;
  209. case 3:
  210. dir = 5;
  211. break;
  212. case 4:
  213. dir = 1;
  214. break;
  215. case 5:
  216. dir = 0;
  217. break;
  218. case 6:
  219. dir = 3;
  220. break;
  221. case 7:
  222. dir = 2;
  223. break;
  224. }
  225. }
  226. if (lcddev.id == 0x9341 || lcddev.id == 0X5310 || lcddev.id == 0X5510 || lcddev.id == 0X1963) //9341/5310/5510/1963,特殊处理
  227. {
  228. switch (dir)
  229. {
  230. case L2R_U2D: //从左到右,从上到下
  231. regval |= (0 << 7) | (0 << 6) | (0 << 5);
  232. break;
  233. case L2R_D2U: //从左到右,从下到上
  234. regval |= (1 << 7) | (0 << 6) | (0 << 5);
  235. break;
  236. case R2L_U2D: //从右到左,从上到下
  237. regval |= (0 << 7) | (1 << 6) | (0 << 5);
  238. break;
  239. case R2L_D2U: //从右到左,从下到上
  240. regval |= (1 << 7) | (1 << 6) | (0 << 5);
  241. break;
  242. case U2D_L2R: //从上到下,从左到右
  243. regval |= (0 << 7) | (0 << 6) | (1 << 5);
  244. break;
  245. case U2D_R2L: //从上到下,从右到左
  246. regval |= (0 << 7) | (1 << 6) | (1 << 5);
  247. break;
  248. case D2U_L2R: //从下到上,从左到右
  249. regval |= (1 << 7) | (0 << 6) | (1 << 5);
  250. break;
  251. case D2U_R2L: //从下到上,从右到左
  252. regval |= (1 << 7) | (1 << 6) | (1 << 5);
  253. break;
  254. }
  255. if (lcddev.id == 0X5510)
  256. dirreg = 0X3600;
  257. else
  258. dirreg = 0X36;
  259. if ((lcddev.id != 0X5310) && (lcddev.id != 0X5510) && (lcddev.id != 0X1963))
  260. regval |= 0X08; //5310/5510/1963不需要BGR
  261. LCD_WriteReg(dirreg, regval);
  262. if (lcddev.id != 0X1963) //1963不做坐标处理
  263. {
  264. if (regval & 0X20)
  265. {
  266. if (lcddev.width < lcddev.height) //交换X,Y
  267. {
  268. temp = lcddev.width;
  269. lcddev.width = lcddev.height;
  270. lcddev.height = temp;
  271. }
  272. }
  273. else
  274. {
  275. if (lcddev.width > lcddev.height) //交换X,Y
  276. {
  277. temp = lcddev.width;
  278. lcddev.width = lcddev.height;
  279. lcddev.height = temp;
  280. }
  281. }
  282. }
  283. if (lcddev.id == 0X5510)
  284. {
  285. LCD_WR_REG(lcddev.setxcmd);
  286. LCD_WR_DATA(0);
  287. LCD_WR_REG(lcddev.setxcmd + 1);
  288. LCD_WR_DATA(0);
  289. LCD_WR_REG(lcddev.setxcmd + 2);
  290. LCD_WR_DATA((lcddev.width - 1) >> 8);
  291. LCD_WR_REG(lcddev.setxcmd + 3);
  292. LCD_WR_DATA((lcddev.width - 1) & 0XFF);
  293. LCD_WR_REG(lcddev.setycmd);
  294. LCD_WR_DATA(0);
  295. LCD_WR_REG(lcddev.setycmd + 1);
  296. LCD_WR_DATA(0);
  297. LCD_WR_REG(lcddev.setycmd + 2);
  298. LCD_WR_DATA((lcddev.height - 1) >> 8);
  299. LCD_WR_REG(lcddev.setycmd + 3);
  300. LCD_WR_DATA((lcddev.height - 1) & 0XFF);
  301. }
  302. else
  303. {
  304. LCD_WR_REG(lcddev.setxcmd);
  305. LCD_WR_DATA(0);
  306. LCD_WR_DATA(0);
  307. LCD_WR_DATA((lcddev.width - 1) >> 8);
  308. LCD_WR_DATA((lcddev.width - 1) & 0XFF);
  309. LCD_WR_REG(lcddev.setycmd);
  310. LCD_WR_DATA(0);
  311. LCD_WR_DATA(0);
  312. LCD_WR_DATA((lcddev.height - 1) >> 8);
  313. LCD_WR_DATA((lcddev.height - 1) & 0XFF);
  314. }
  315. }
  316. }
  317. //快速画点
  318. //x,y:坐标
  319. //color:颜色
  320. static void LCD_Fast_DrawPoint(const char *pixel, int x, int y)
  321. {
  322. uint16_t color = *((uint16_t *)pixel);
  323. if (lcddev.id == 0X9341 || lcddev.id == 0X5310)
  324. {
  325. LCD_WR_REG(lcddev.setxcmd);
  326. LCD_WR_DATA(x >> 8);
  327. LCD_WR_DATA(x & 0XFF);
  328. LCD_WR_REG(lcddev.setycmd);
  329. LCD_WR_DATA(y >> 8);
  330. LCD_WR_DATA(y & 0XFF);
  331. }
  332. else if (lcddev.id == 0X5510)
  333. {
  334. LCD_WR_REG(lcddev.setxcmd);
  335. LCD_WR_DATA(x >> 8);
  336. LCD_WR_REG(lcddev.setxcmd + 1);
  337. LCD_WR_DATA(x & 0XFF);
  338. LCD_WR_REG(lcddev.setycmd);
  339. LCD_WR_DATA(y >> 8);
  340. LCD_WR_REG(lcddev.setycmd + 1);
  341. LCD_WR_DATA(y & 0XFF);
  342. }
  343. else if (lcddev.id == 0X1963)
  344. {
  345. if (lcddev.dir == 0)
  346. x = lcddev.width - 1 - x;
  347. LCD_WR_REG(lcddev.setxcmd);
  348. LCD_WR_DATA(x >> 8);
  349. LCD_WR_DATA(x & 0XFF);
  350. LCD_WR_DATA(x >> 8);
  351. LCD_WR_DATA(x & 0XFF);
  352. LCD_WR_REG(lcddev.setycmd);
  353. LCD_WR_DATA(y >> 8);
  354. LCD_WR_DATA(y & 0XFF);
  355. LCD_WR_DATA(y >> 8);
  356. LCD_WR_DATA(y & 0XFF);
  357. }
  358. LCD->REG = lcddev.wramcmd;
  359. LCD->RAM = color;
  360. }
  361. //SSD1963 背光设置
  362. //pwm:背光等级,0~100.越大越亮.
  363. void LCD_SSD_BackLightSet(uint8_t pwm)
  364. {
  365. LCD_WR_REG(0xBE); //配置PWM输出
  366. LCD_WR_DATA(0x05); //1设置PWM频率
  367. LCD_WR_DATA(pwm * 2.55); //2设置PWM占空比
  368. LCD_WR_DATA(0x01); //3设置C
  369. LCD_WR_DATA(0xFF); //4设置D
  370. LCD_WR_DATA(0x00); //5设置E
  371. LCD_WR_DATA(0x00); //6设置F
  372. }
  373. //设置LCD显示方向
  374. //dir:0,竖屏;1,横屏
  375. void LCD_Display_Dir(uint8_t dir)
  376. {
  377. lcddev.dir = dir; //竖屏/横屏
  378. if (dir == 0) //竖屏
  379. {
  380. lcddev.width = 240;
  381. lcddev.height = 320;
  382. if (lcddev.id == 0X9341 || lcddev.id == 0X5310)
  383. {
  384. lcddev.wramcmd = 0X2C;
  385. lcddev.setxcmd = 0X2A;
  386. lcddev.setycmd = 0X2B;
  387. if (lcddev.id == 0X5310)
  388. {
  389. lcddev.width = 320;
  390. lcddev.height = 480;
  391. }
  392. }
  393. else if (lcddev.id == 0x5510)
  394. {
  395. lcddev.wramcmd = 0X2C00;
  396. lcddev.setxcmd = 0X2A00;
  397. lcddev.setycmd = 0X2B00;
  398. lcddev.width = 480;
  399. lcddev.height = 800;
  400. }
  401. else if (lcddev.id == 0X1963)
  402. {
  403. lcddev.wramcmd = 0X2C; //设置写入GRAM的指令
  404. lcddev.setxcmd = 0X2B; //设置写X坐标指令
  405. lcddev.setycmd = 0X2A; //设置写Y坐标指令
  406. lcddev.width = 480; //设置宽度480
  407. lcddev.height = 800; //设置高度800
  408. }
  409. }
  410. else //横屏
  411. {
  412. lcddev.width = 320;
  413. lcddev.height = 240;
  414. if (lcddev.id == 0X9341 || lcddev.id == 0X5310)
  415. {
  416. lcddev.wramcmd = 0X2C;
  417. lcddev.setxcmd = 0X2A;
  418. lcddev.setycmd = 0X2B;
  419. }
  420. else if (lcddev.id == 0x5510)
  421. {
  422. lcddev.wramcmd = 0X2C00;
  423. lcddev.setxcmd = 0X2A00;
  424. lcddev.setycmd = 0X2B00;
  425. lcddev.width = 800;
  426. lcddev.height = 480;
  427. }
  428. else if (lcddev.id == 0X1963)
  429. {
  430. lcddev.wramcmd = 0X2C; //设置写入GRAM的指令
  431. lcddev.setxcmd = 0X2A; //设置写X坐标指令
  432. lcddev.setycmd = 0X2B; //设置写Y坐标指令
  433. lcddev.width = 800; //设置宽度800
  434. lcddev.height = 480; //设置高度480
  435. }
  436. if (lcddev.id == 0X5310)
  437. {
  438. lcddev.width = 480;
  439. lcddev.height = 320;
  440. }
  441. }
  442. LCD_Scan_Dir(DFT_SCAN_DIR); //默认扫描方向
  443. }
  444. //清屏函数
  445. //color:要清屏的填充色
  446. void LCD_Clear(uint32_t color)
  447. {
  448. uint32_t index = 0;
  449. uint32_t totalpoint = lcddev.width;
  450. totalpoint *= lcddev.height; //得到总点数
  451. LCD_SetCursor(0x00, 0x0000); //设置光标位置
  452. LCD_WriteRAM_Prepare(); //开始写入GRAM
  453. for (index = 0; index < totalpoint; index++)
  454. {
  455. LCD->RAM = color;
  456. }
  457. }
  458. void LCD_DrawLine(const char *pixel, rt_uint16_t x1, rt_uint16_t y1, rt_uint16_t x2, rt_uint16_t y2)
  459. {
  460. rt_uint16_t t;
  461. int xerr = 0, yerr = 0, delta_x, delta_y, distance;
  462. int incx, incy, uRow, uCol;
  463. delta_x = x2 - x1; //计算坐标增量
  464. delta_y = y2 - y1;
  465. uRow = x1;
  466. uCol = y1;
  467. if (delta_x > 0)
  468. incx = 1; //设置单步方向
  469. else if (delta_x == 0)
  470. incx = 0; //垂直线
  471. else
  472. {
  473. incx = -1;
  474. delta_x = -delta_x;
  475. }
  476. if (delta_y > 0)
  477. incy = 1;
  478. else if (delta_y == 0)
  479. incy = 0; //水平线
  480. else
  481. {
  482. incy = -1;
  483. delta_y = -delta_y;
  484. }
  485. if (delta_x > delta_y)
  486. distance = delta_x; //选取基本增量坐标轴
  487. else
  488. distance = delta_y;
  489. for (t = 0; t <= distance + 1; t++) //画线输出
  490. {
  491. // LCD_DrawPoint(uRow, uCol); //画点
  492. LCD_Fast_DrawPoint(pixel, uRow, uCol);
  493. xerr += delta_x;
  494. yerr += delta_y;
  495. if (xerr > distance)
  496. {
  497. xerr -= distance;
  498. uRow += incx;
  499. }
  500. if (yerr > distance)
  501. {
  502. yerr -= distance;
  503. uCol += incy;
  504. }
  505. }
  506. }
  507. void LCD_HLine(const char *pixel, int x1, int x2, int y)
  508. {
  509. LCD_DrawLine(pixel, x1, y, x2, y);
  510. }
  511. void LCD_VLine(const char *pixel, int x, int y1, int y2)
  512. {
  513. LCD_DrawLine(pixel, x, y1, x, y2);
  514. }
  515. void LCD_BlitLine(const char *pixel, int x, int y, rt_size_t size)
  516. {
  517. LCD_SetCursor(x, y);
  518. LCD_WriteRAM_Prepare();
  519. uint16_t *p = (uint16_t *)pixel;
  520. for (; size > 0; size--, p++)
  521. LCD->RAM = *p;
  522. }
  523. void lcd_fill_array(rt_uint16_t x_start, rt_uint16_t y_start, rt_uint16_t x_end, rt_uint16_t y_end, void *pcolor)
  524. {
  525. rt_uint16_t *pixel = RT_NULL;
  526. rt_uint16_t cycle_y, x_offset = 0;
  527. pixel = (rt_uint16_t *)pcolor;
  528. for(cycle_y = y_start; cycle_y <= y_end; )
  529. {
  530. LCD_SetCursor(x_start, cycle_y);
  531. LCD_WriteRAM_Prepare();
  532. for(x_offset = 0;x_start + x_offset <= x_end; x_offset++)
  533. {
  534. LCD->RAM = *pixel++;
  535. }
  536. cycle_y++;
  537. }
  538. }
  539. static rt_err_t drv_lcd_init(struct rt_device *device)
  540. {
  541. __HAL_RCC_GPIOD_CLK_ENABLE();
  542. __HAL_RCC_GPIOE_CLK_ENABLE();
  543. __HAL_RCC_GPIOF_CLK_ENABLE();
  544. __HAL_RCC_GPIOG_CLK_ENABLE();
  545. __HAL_RCC_GPIOB_CLK_ENABLE();
  546. FSMC_NORSRAM_TimingTypeDef Timing;
  547. rt_pin_mode(LCD_BL, PIN_MODE_OUTPUT);
  548. /** Perform the SRAM1 memory initialization sequence
  549. */
  550. hsram1.Instance = FSMC_NORSRAM_DEVICE;
  551. hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
  552. /* hsram1.Init */
  553. hsram1.Init.NSBank = FSMC_NORSRAM_BANK4;
  554. hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
  555. hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
  556. hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
  557. hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
  558. hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
  559. hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
  560. hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
  561. hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
  562. hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
  563. hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
  564. hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
  565. hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
  566. hsram1.Init.PageSize = FSMC_PAGE_SIZE_NONE;
  567. /* Timing */
  568. Timing.AddressSetupTime = 5;
  569. Timing.AddressHoldTime = 1;
  570. Timing.DataSetupTime = 9;
  571. Timing.BusTurnAroundDuration = 0;
  572. Timing.CLKDivision = 2;
  573. Timing.DataLatency = 2;
  574. Timing.AccessMode = FSMC_ACCESS_MODE_A;
  575. /* ExtTiming */
  576. if (HAL_SRAM_Init(&hsram1, &Timing, &Timing) != HAL_OK)
  577. {
  578. Error_Handler();
  579. }
  580. rt_thread_mdelay(50);
  581. //尝试9341 ID的读取
  582. LCD_WR_REG(0XD3);
  583. lcddev.id = LCD_RD_DATA(); //dummy read
  584. lcddev.id = LCD_RD_DATA(); //读到0X00
  585. lcddev.id = LCD_RD_DATA(); //读取93
  586. lcddev.id <<= 8;
  587. lcddev.id |= LCD_RD_DATA(); //读取41
  588. if (lcddev.id != 0X9341) //非9341,尝试看看是不是NT35310
  589. {
  590. LCD_WR_REG(0XD4);
  591. lcddev.id = LCD_RD_DATA(); //dummy read
  592. lcddev.id = LCD_RD_DATA(); //读回0X01
  593. lcddev.id = LCD_RD_DATA(); //读回0X53
  594. lcddev.id <<= 8;
  595. lcddev.id |= LCD_RD_DATA(); //这里读回0X10
  596. if (lcddev.id != 0X5310) //也不是NT35310,尝试看看是不是NT35510
  597. {
  598. LCD_WR_REG(0XDA00);
  599. lcddev.id = LCD_RD_DATA(); //读回0X00
  600. LCD_WR_REG(0XDB00);
  601. lcddev.id = LCD_RD_DATA(); //读回0X80
  602. lcddev.id <<= 8;
  603. LCD_WR_REG(0XDC00);
  604. lcddev.id |= LCD_RD_DATA(); //读回0X00
  605. if (lcddev.id == 0x8000)
  606. lcddev.id = 0x5510; //NT35510读回的ID是8000H,为方便区分,我们强制设置为5510
  607. if (lcddev.id != 0X5510) //也不是NT5510,尝试看看是不是SSD1963
  608. {
  609. LCD_WR_REG(0XA1);
  610. lcddev.id = LCD_RD_DATA();
  611. lcddev.id = LCD_RD_DATA(); //读回0X57
  612. lcddev.id <<= 8;
  613. lcddev.id |= LCD_RD_DATA(); //读回0X61
  614. if (lcddev.id == 0X5761)
  615. lcddev.id = 0X1963; //SSD1963读回的ID是5761H,为方便区分,我们强制设置为1963
  616. }
  617. }
  618. }
  619. LOG_I(" LCD ID:%x", lcddev.id); //打印LCD ID
  620. if (lcddev.id == 0X9341) //9341初始化
  621. {
  622. LCD_WR_REG(0xCF);
  623. LCD_WR_DATA(0x00);
  624. LCD_WR_DATA(0xC1);
  625. LCD_WR_DATA(0X30);
  626. LCD_WR_REG(0xED);
  627. LCD_WR_DATA(0x64);
  628. LCD_WR_DATA(0x03);
  629. LCD_WR_DATA(0X12);
  630. LCD_WR_DATA(0X81);
  631. LCD_WR_REG(0xE8);
  632. LCD_WR_DATA(0x85);
  633. LCD_WR_DATA(0x10);
  634. LCD_WR_DATA(0x7A);
  635. LCD_WR_REG(0xCB);
  636. LCD_WR_DATA(0x39);
  637. LCD_WR_DATA(0x2C);
  638. LCD_WR_DATA(0x00);
  639. LCD_WR_DATA(0x34);
  640. LCD_WR_DATA(0x02);
  641. LCD_WR_REG(0xF7);
  642. LCD_WR_DATA(0x20);
  643. LCD_WR_REG(0xEA);
  644. LCD_WR_DATA(0x00);
  645. LCD_WR_DATA(0x00);
  646. LCD_WR_REG(0xC0); //Power control
  647. LCD_WR_DATA(0x1B); //VRH[5:0]
  648. LCD_WR_REG(0xC1); //Power control
  649. LCD_WR_DATA(0x01); //SAP[2:0];BT[3:0]
  650. LCD_WR_REG(0xC5); //VCM control
  651. LCD_WR_DATA(0x30); //3F
  652. LCD_WR_DATA(0x30); //3C
  653. LCD_WR_REG(0xC7); //VCM control2
  654. LCD_WR_DATA(0XB7);
  655. LCD_WR_REG(0x36); // Memory Access Control
  656. LCD_WR_DATA(0x48);
  657. LCD_WR_REG(0x3A);
  658. LCD_WR_DATA(0x55);
  659. LCD_WR_REG(0xB1);
  660. LCD_WR_DATA(0x00);
  661. LCD_WR_DATA(0x1A);
  662. LCD_WR_REG(0xB6); // Display Function Control
  663. LCD_WR_DATA(0x0A);
  664. LCD_WR_DATA(0xA2);
  665. LCD_WR_REG(0xF2); // 3Gamma Function Disable
  666. LCD_WR_DATA(0x00);
  667. LCD_WR_REG(0x26); //Gamma curve selected
  668. LCD_WR_DATA(0x01);
  669. LCD_WR_REG(0xE0); //Set Gamma
  670. LCD_WR_DATA(0x0F);
  671. LCD_WR_DATA(0x2A);
  672. LCD_WR_DATA(0x28);
  673. LCD_WR_DATA(0x08);
  674. LCD_WR_DATA(0x0E);
  675. LCD_WR_DATA(0x08);
  676. LCD_WR_DATA(0x54);
  677. LCD_WR_DATA(0XA9);
  678. LCD_WR_DATA(0x43);
  679. LCD_WR_DATA(0x0A);
  680. LCD_WR_DATA(0x0F);
  681. LCD_WR_DATA(0x00);
  682. LCD_WR_DATA(0x00);
  683. LCD_WR_DATA(0x00);
  684. LCD_WR_DATA(0x00);
  685. LCD_WR_REG(0XE1); //Set Gamma
  686. LCD_WR_DATA(0x00);
  687. LCD_WR_DATA(0x15);
  688. LCD_WR_DATA(0x17);
  689. LCD_WR_DATA(0x07);
  690. LCD_WR_DATA(0x11);
  691. LCD_WR_DATA(0x06);
  692. LCD_WR_DATA(0x2B);
  693. LCD_WR_DATA(0x56);
  694. LCD_WR_DATA(0x3C);
  695. LCD_WR_DATA(0x05);
  696. LCD_WR_DATA(0x10);
  697. LCD_WR_DATA(0x0F);
  698. LCD_WR_DATA(0x3F);
  699. LCD_WR_DATA(0x3F);
  700. LCD_WR_DATA(0x0F);
  701. LCD_WR_REG(0x2B);
  702. LCD_WR_DATA(0x00);
  703. LCD_WR_DATA(0x00);
  704. LCD_WR_DATA(0x01);
  705. LCD_WR_DATA(0x3f);
  706. LCD_WR_REG(0x2A);
  707. LCD_WR_DATA(0x00);
  708. LCD_WR_DATA(0x00);
  709. LCD_WR_DATA(0x00);
  710. LCD_WR_DATA(0xef);
  711. LCD_WR_REG(0x11); //Exit Sleep
  712. rt_thread_mdelay(120);
  713. LCD_WR_REG(0x29); //display on
  714. }
  715. else if (lcddev.id == 0x5310)
  716. {
  717. LCD_WR_REG(0xED);
  718. LCD_WR_DATA(0x01);
  719. LCD_WR_DATA(0xFE);
  720. LCD_WR_REG(0xEE);
  721. LCD_WR_DATA(0xDE);
  722. LCD_WR_DATA(0x21);
  723. LCD_WR_REG(0xF1);
  724. LCD_WR_DATA(0x01);
  725. LCD_WR_REG(0xDF);
  726. LCD_WR_DATA(0x10);
  727. //VCOMvoltage//
  728. LCD_WR_REG(0xC4);
  729. LCD_WR_DATA(0x8F); //5f
  730. LCD_WR_REG(0xC6);
  731. LCD_WR_DATA(0x00);
  732. LCD_WR_DATA(0xE2);
  733. LCD_WR_DATA(0xE2);
  734. LCD_WR_DATA(0xE2);
  735. LCD_WR_REG(0xBF);
  736. LCD_WR_DATA(0xAA);
  737. LCD_WR_REG(0xB0);
  738. LCD_WR_DATA(0x0D);
  739. LCD_WR_DATA(0x00);
  740. LCD_WR_DATA(0x0D);
  741. LCD_WR_DATA(0x00);
  742. LCD_WR_DATA(0x11);
  743. LCD_WR_DATA(0x00);
  744. LCD_WR_DATA(0x19);
  745. LCD_WR_DATA(0x00);
  746. LCD_WR_DATA(0x21);
  747. LCD_WR_DATA(0x00);
  748. LCD_WR_DATA(0x2D);
  749. LCD_WR_DATA(0x00);
  750. LCD_WR_DATA(0x3D);
  751. LCD_WR_DATA(0x00);
  752. LCD_WR_DATA(0x5D);
  753. LCD_WR_DATA(0x00);
  754. LCD_WR_DATA(0x5D);
  755. LCD_WR_DATA(0x00);
  756. LCD_WR_REG(0xB1);
  757. LCD_WR_DATA(0x80);
  758. LCD_WR_DATA(0x00);
  759. LCD_WR_DATA(0x8B);
  760. LCD_WR_DATA(0x00);
  761. LCD_WR_DATA(0x96);
  762. LCD_WR_DATA(0x00);
  763. LCD_WR_REG(0xB2);
  764. LCD_WR_DATA(0x00);
  765. LCD_WR_DATA(0x00);
  766. LCD_WR_DATA(0x02);
  767. LCD_WR_DATA(0x00);
  768. LCD_WR_DATA(0x03);
  769. LCD_WR_DATA(0x00);
  770. LCD_WR_REG(0xB3);
  771. LCD_WR_DATA(0x00);
  772. LCD_WR_DATA(0x00);
  773. LCD_WR_DATA(0x00);
  774. LCD_WR_DATA(0x00);
  775. LCD_WR_DATA(0x00);
  776. LCD_WR_DATA(0x00);
  777. LCD_WR_DATA(0x00);
  778. LCD_WR_DATA(0x00);
  779. LCD_WR_DATA(0x00);
  780. LCD_WR_DATA(0x00);
  781. LCD_WR_DATA(0x00);
  782. LCD_WR_DATA(0x00);
  783. LCD_WR_DATA(0x00);
  784. LCD_WR_DATA(0x00);
  785. LCD_WR_DATA(0x00);
  786. LCD_WR_DATA(0x00);
  787. LCD_WR_DATA(0x00);
  788. LCD_WR_DATA(0x00);
  789. LCD_WR_DATA(0x00);
  790. LCD_WR_DATA(0x00);
  791. LCD_WR_DATA(0x00);
  792. LCD_WR_DATA(0x00);
  793. LCD_WR_DATA(0x00);
  794. LCD_WR_DATA(0x00);
  795. LCD_WR_REG(0xB4);
  796. LCD_WR_DATA(0x8B);
  797. LCD_WR_DATA(0x00);
  798. LCD_WR_DATA(0x96);
  799. LCD_WR_DATA(0x00);
  800. LCD_WR_DATA(0xA1);
  801. LCD_WR_DATA(0x00);
  802. LCD_WR_REG(0xB5);
  803. LCD_WR_DATA(0x02);
  804. LCD_WR_DATA(0x00);
  805. LCD_WR_DATA(0x03);
  806. LCD_WR_DATA(0x00);
  807. LCD_WR_DATA(0x04);
  808. LCD_WR_DATA(0x00);
  809. LCD_WR_REG(0xB6);
  810. LCD_WR_DATA(0x00);
  811. LCD_WR_DATA(0x00);
  812. LCD_WR_REG(0xB7);
  813. LCD_WR_DATA(0x00);
  814. LCD_WR_DATA(0x00);
  815. LCD_WR_DATA(0x3F);
  816. LCD_WR_DATA(0x00);
  817. LCD_WR_DATA(0x5E);
  818. LCD_WR_DATA(0x00);
  819. LCD_WR_DATA(0x64);
  820. LCD_WR_DATA(0x00);
  821. LCD_WR_DATA(0x8C);
  822. LCD_WR_DATA(0x00);
  823. LCD_WR_DATA(0xAC);
  824. LCD_WR_DATA(0x00);
  825. LCD_WR_DATA(0xDC);
  826. LCD_WR_DATA(0x00);
  827. LCD_WR_DATA(0x70);
  828. LCD_WR_DATA(0x00);
  829. LCD_WR_DATA(0x90);
  830. LCD_WR_DATA(0x00);
  831. LCD_WR_DATA(0xEB);
  832. LCD_WR_DATA(0x00);
  833. LCD_WR_DATA(0xDC);
  834. LCD_WR_DATA(0x00);
  835. LCD_WR_REG(0xB8);
  836. LCD_WR_DATA(0x00);
  837. LCD_WR_DATA(0x00);
  838. LCD_WR_DATA(0x00);
  839. LCD_WR_DATA(0x00);
  840. LCD_WR_DATA(0x00);
  841. LCD_WR_DATA(0x00);
  842. LCD_WR_DATA(0x00);
  843. LCD_WR_DATA(0x00);
  844. LCD_WR_REG(0xBA);
  845. LCD_WR_DATA(0x24);
  846. LCD_WR_DATA(0x00);
  847. LCD_WR_DATA(0x00);
  848. LCD_WR_DATA(0x00);
  849. LCD_WR_REG(0xC1);
  850. LCD_WR_DATA(0x20);
  851. LCD_WR_DATA(0x00);
  852. LCD_WR_DATA(0x54);
  853. LCD_WR_DATA(0x00);
  854. LCD_WR_DATA(0xFF);
  855. LCD_WR_DATA(0x00);
  856. LCD_WR_REG(0xC2);
  857. LCD_WR_DATA(0x0A);
  858. LCD_WR_DATA(0x00);
  859. LCD_WR_DATA(0x04);
  860. LCD_WR_DATA(0x00);
  861. LCD_WR_REG(0xC3);
  862. LCD_WR_DATA(0x3C);
  863. LCD_WR_DATA(0x00);
  864. LCD_WR_DATA(0x3A);
  865. LCD_WR_DATA(0x00);
  866. LCD_WR_DATA(0x39);
  867. LCD_WR_DATA(0x00);
  868. LCD_WR_DATA(0x37);
  869. LCD_WR_DATA(0x00);
  870. LCD_WR_DATA(0x3C);
  871. LCD_WR_DATA(0x00);
  872. LCD_WR_DATA(0x36);
  873. LCD_WR_DATA(0x00);
  874. LCD_WR_DATA(0x32);
  875. LCD_WR_DATA(0x00);
  876. LCD_WR_DATA(0x2F);
  877. LCD_WR_DATA(0x00);
  878. LCD_WR_DATA(0x2C);
  879. LCD_WR_DATA(0x00);
  880. LCD_WR_DATA(0x29);
  881. LCD_WR_DATA(0x00);
  882. LCD_WR_DATA(0x26);
  883. LCD_WR_DATA(0x00);
  884. LCD_WR_DATA(0x24);
  885. LCD_WR_DATA(0x00);
  886. LCD_WR_DATA(0x24);
  887. LCD_WR_DATA(0x00);
  888. LCD_WR_DATA(0x23);
  889. LCD_WR_DATA(0x00);
  890. LCD_WR_DATA(0x3C);
  891. LCD_WR_DATA(0x00);
  892. LCD_WR_DATA(0x36);
  893. LCD_WR_DATA(0x00);
  894. LCD_WR_DATA(0x32);
  895. LCD_WR_DATA(0x00);
  896. LCD_WR_DATA(0x2F);
  897. LCD_WR_DATA(0x00);
  898. LCD_WR_DATA(0x2C);
  899. LCD_WR_DATA(0x00);
  900. LCD_WR_DATA(0x29);
  901. LCD_WR_DATA(0x00);
  902. LCD_WR_DATA(0x26);
  903. LCD_WR_DATA(0x00);
  904. LCD_WR_DATA(0x24);
  905. LCD_WR_DATA(0x00);
  906. LCD_WR_DATA(0x24);
  907. LCD_WR_DATA(0x00);
  908. LCD_WR_DATA(0x23);
  909. LCD_WR_DATA(0x00);
  910. LCD_WR_REG(0xC4);
  911. LCD_WR_DATA(0x62);
  912. LCD_WR_DATA(0x00);
  913. LCD_WR_DATA(0x05);
  914. LCD_WR_DATA(0x00);
  915. LCD_WR_DATA(0x84);
  916. LCD_WR_DATA(0x00);
  917. LCD_WR_DATA(0xF0);
  918. LCD_WR_DATA(0x00);
  919. LCD_WR_DATA(0x18);
  920. LCD_WR_DATA(0x00);
  921. LCD_WR_DATA(0xA4);
  922. LCD_WR_DATA(0x00);
  923. LCD_WR_DATA(0x18);
  924. LCD_WR_DATA(0x00);
  925. LCD_WR_DATA(0x50);
  926. LCD_WR_DATA(0x00);
  927. LCD_WR_DATA(0x0C);
  928. LCD_WR_DATA(0x00);
  929. LCD_WR_DATA(0x17);
  930. LCD_WR_DATA(0x00);
  931. LCD_WR_DATA(0x95);
  932. LCD_WR_DATA(0x00);
  933. LCD_WR_DATA(0xF3);
  934. LCD_WR_DATA(0x00);
  935. LCD_WR_DATA(0xE6);
  936. LCD_WR_DATA(0x00);
  937. LCD_WR_REG(0xC5);
  938. LCD_WR_DATA(0x32);
  939. LCD_WR_DATA(0x00);
  940. LCD_WR_DATA(0x44);
  941. LCD_WR_DATA(0x00);
  942. LCD_WR_DATA(0x65);
  943. LCD_WR_DATA(0x00);
  944. LCD_WR_DATA(0x76);
  945. LCD_WR_DATA(0x00);
  946. LCD_WR_DATA(0x88);
  947. LCD_WR_DATA(0x00);
  948. LCD_WR_REG(0xC6);
  949. LCD_WR_DATA(0x20);
  950. LCD_WR_DATA(0x00);
  951. LCD_WR_DATA(0x17);
  952. LCD_WR_DATA(0x00);
  953. LCD_WR_DATA(0x01);
  954. LCD_WR_DATA(0x00);
  955. LCD_WR_REG(0xC7);
  956. LCD_WR_DATA(0x00);
  957. LCD_WR_DATA(0x00);
  958. LCD_WR_DATA(0x00);
  959. LCD_WR_DATA(0x00);
  960. LCD_WR_REG(0xC8);
  961. LCD_WR_DATA(0x00);
  962. LCD_WR_DATA(0x00);
  963. LCD_WR_DATA(0x00);
  964. LCD_WR_DATA(0x00);
  965. LCD_WR_REG(0xC9);
  966. LCD_WR_DATA(0x00);
  967. LCD_WR_DATA(0x00);
  968. LCD_WR_DATA(0x00);
  969. LCD_WR_DATA(0x00);
  970. LCD_WR_DATA(0x00);
  971. LCD_WR_DATA(0x00);
  972. LCD_WR_DATA(0x00);
  973. LCD_WR_DATA(0x00);
  974. LCD_WR_DATA(0x00);
  975. LCD_WR_DATA(0x00);
  976. LCD_WR_DATA(0x00);
  977. LCD_WR_DATA(0x00);
  978. LCD_WR_DATA(0x00);
  979. LCD_WR_DATA(0x00);
  980. LCD_WR_DATA(0x00);
  981. LCD_WR_DATA(0x00);
  982. LCD_WR_REG(0xE0);
  983. LCD_WR_DATA(0x16);
  984. LCD_WR_DATA(0x00);
  985. LCD_WR_DATA(0x1C);
  986. LCD_WR_DATA(0x00);
  987. LCD_WR_DATA(0x21);
  988. LCD_WR_DATA(0x00);
  989. LCD_WR_DATA(0x36);
  990. LCD_WR_DATA(0x00);
  991. LCD_WR_DATA(0x46);
  992. LCD_WR_DATA(0x00);
  993. LCD_WR_DATA(0x52);
  994. LCD_WR_DATA(0x00);
  995. LCD_WR_DATA(0x64);
  996. LCD_WR_DATA(0x00);
  997. LCD_WR_DATA(0x7A);
  998. LCD_WR_DATA(0x00);
  999. LCD_WR_DATA(0x8B);
  1000. LCD_WR_DATA(0x00);
  1001. LCD_WR_DATA(0x99);
  1002. LCD_WR_DATA(0x00);
  1003. LCD_WR_DATA(0xA8);
  1004. LCD_WR_DATA(0x00);
  1005. LCD_WR_DATA(0xB9);
  1006. LCD_WR_DATA(0x00);
  1007. LCD_WR_DATA(0xC4);
  1008. LCD_WR_DATA(0x00);
  1009. LCD_WR_DATA(0xCA);
  1010. LCD_WR_DATA(0x00);
  1011. LCD_WR_DATA(0xD2);
  1012. LCD_WR_DATA(0x00);
  1013. LCD_WR_DATA(0xD9);
  1014. LCD_WR_DATA(0x00);
  1015. LCD_WR_DATA(0xE0);
  1016. LCD_WR_DATA(0x00);
  1017. LCD_WR_DATA(0xF3);
  1018. LCD_WR_DATA(0x00);
  1019. LCD_WR_REG(0xE1);
  1020. LCD_WR_DATA(0x16);
  1021. LCD_WR_DATA(0x00);
  1022. LCD_WR_DATA(0x1C);
  1023. LCD_WR_DATA(0x00);
  1024. LCD_WR_DATA(0x22);
  1025. LCD_WR_DATA(0x00);
  1026. LCD_WR_DATA(0x36);
  1027. LCD_WR_DATA(0x00);
  1028. LCD_WR_DATA(0x45);
  1029. LCD_WR_DATA(0x00);
  1030. LCD_WR_DATA(0x52);
  1031. LCD_WR_DATA(0x00);
  1032. LCD_WR_DATA(0x64);
  1033. LCD_WR_DATA(0x00);
  1034. LCD_WR_DATA(0x7A);
  1035. LCD_WR_DATA(0x00);
  1036. LCD_WR_DATA(0x8B);
  1037. LCD_WR_DATA(0x00);
  1038. LCD_WR_DATA(0x99);
  1039. LCD_WR_DATA(0x00);
  1040. LCD_WR_DATA(0xA8);
  1041. LCD_WR_DATA(0x00);
  1042. LCD_WR_DATA(0xB9);
  1043. LCD_WR_DATA(0x00);
  1044. LCD_WR_DATA(0xC4);
  1045. LCD_WR_DATA(0x00);
  1046. LCD_WR_DATA(0xCA);
  1047. LCD_WR_DATA(0x00);
  1048. LCD_WR_DATA(0xD2);
  1049. LCD_WR_DATA(0x00);
  1050. LCD_WR_DATA(0xD8);
  1051. LCD_WR_DATA(0x00);
  1052. LCD_WR_DATA(0xE0);
  1053. LCD_WR_DATA(0x00);
  1054. LCD_WR_DATA(0xF3);
  1055. LCD_WR_DATA(0x00);
  1056. LCD_WR_REG(0xE2);
  1057. LCD_WR_DATA(0x05);
  1058. LCD_WR_DATA(0x00);
  1059. LCD_WR_DATA(0x0B);
  1060. LCD_WR_DATA(0x00);
  1061. LCD_WR_DATA(0x1B);
  1062. LCD_WR_DATA(0x00);
  1063. LCD_WR_DATA(0x34);
  1064. LCD_WR_DATA(0x00);
  1065. LCD_WR_DATA(0x44);
  1066. LCD_WR_DATA(0x00);
  1067. LCD_WR_DATA(0x4F);
  1068. LCD_WR_DATA(0x00);
  1069. LCD_WR_DATA(0x61);
  1070. LCD_WR_DATA(0x00);
  1071. LCD_WR_DATA(0x79);
  1072. LCD_WR_DATA(0x00);
  1073. LCD_WR_DATA(0x88);
  1074. LCD_WR_DATA(0x00);
  1075. LCD_WR_DATA(0x97);
  1076. LCD_WR_DATA(0x00);
  1077. LCD_WR_DATA(0xA6);
  1078. LCD_WR_DATA(0x00);
  1079. LCD_WR_DATA(0xB7);
  1080. LCD_WR_DATA(0x00);
  1081. LCD_WR_DATA(0xC2);
  1082. LCD_WR_DATA(0x00);
  1083. LCD_WR_DATA(0xC7);
  1084. LCD_WR_DATA(0x00);
  1085. LCD_WR_DATA(0xD1);
  1086. LCD_WR_DATA(0x00);
  1087. LCD_WR_DATA(0xD6);
  1088. LCD_WR_DATA(0x00);
  1089. LCD_WR_DATA(0xDD);
  1090. LCD_WR_DATA(0x00);
  1091. LCD_WR_DATA(0xF3);
  1092. LCD_WR_DATA(0x00);
  1093. LCD_WR_REG(0xE3);
  1094. LCD_WR_DATA(0x05);
  1095. LCD_WR_DATA(0x00);
  1096. LCD_WR_DATA(0xA);
  1097. LCD_WR_DATA(0x00);
  1098. LCD_WR_DATA(0x1C);
  1099. LCD_WR_DATA(0x00);
  1100. LCD_WR_DATA(0x33);
  1101. LCD_WR_DATA(0x00);
  1102. LCD_WR_DATA(0x44);
  1103. LCD_WR_DATA(0x00);
  1104. LCD_WR_DATA(0x50);
  1105. LCD_WR_DATA(0x00);
  1106. LCD_WR_DATA(0x62);
  1107. LCD_WR_DATA(0x00);
  1108. LCD_WR_DATA(0x78);
  1109. LCD_WR_DATA(0x00);
  1110. LCD_WR_DATA(0x88);
  1111. LCD_WR_DATA(0x00);
  1112. LCD_WR_DATA(0x97);
  1113. LCD_WR_DATA(0x00);
  1114. LCD_WR_DATA(0xA6);
  1115. LCD_WR_DATA(0x00);
  1116. LCD_WR_DATA(0xB7);
  1117. LCD_WR_DATA(0x00);
  1118. LCD_WR_DATA(0xC2);
  1119. LCD_WR_DATA(0x00);
  1120. LCD_WR_DATA(0xC7);
  1121. LCD_WR_DATA(0x00);
  1122. LCD_WR_DATA(0xD1);
  1123. LCD_WR_DATA(0x00);
  1124. LCD_WR_DATA(0xD5);
  1125. LCD_WR_DATA(0x00);
  1126. LCD_WR_DATA(0xDD);
  1127. LCD_WR_DATA(0x00);
  1128. LCD_WR_DATA(0xF3);
  1129. LCD_WR_DATA(0x00);
  1130. LCD_WR_REG(0xE4);
  1131. LCD_WR_DATA(0x01);
  1132. LCD_WR_DATA(0x00);
  1133. LCD_WR_DATA(0x01);
  1134. LCD_WR_DATA(0x00);
  1135. LCD_WR_DATA(0x02);
  1136. LCD_WR_DATA(0x00);
  1137. LCD_WR_DATA(0x2A);
  1138. LCD_WR_DATA(0x00);
  1139. LCD_WR_DATA(0x3C);
  1140. LCD_WR_DATA(0x00);
  1141. LCD_WR_DATA(0x4B);
  1142. LCD_WR_DATA(0x00);
  1143. LCD_WR_DATA(0x5D);
  1144. LCD_WR_DATA(0x00);
  1145. LCD_WR_DATA(0x74);
  1146. LCD_WR_DATA(0x00);
  1147. LCD_WR_DATA(0x84);
  1148. LCD_WR_DATA(0x00);
  1149. LCD_WR_DATA(0x93);
  1150. LCD_WR_DATA(0x00);
  1151. LCD_WR_DATA(0xA2);
  1152. LCD_WR_DATA(0x00);
  1153. LCD_WR_DATA(0xB3);
  1154. LCD_WR_DATA(0x00);
  1155. LCD_WR_DATA(0xBE);
  1156. LCD_WR_DATA(0x00);
  1157. LCD_WR_DATA(0xC4);
  1158. LCD_WR_DATA(0x00);
  1159. LCD_WR_DATA(0xCD);
  1160. LCD_WR_DATA(0x00);
  1161. LCD_WR_DATA(0xD3);
  1162. LCD_WR_DATA(0x00);
  1163. LCD_WR_DATA(0xDD);
  1164. LCD_WR_DATA(0x00);
  1165. LCD_WR_DATA(0xF3);
  1166. LCD_WR_DATA(0x00);
  1167. LCD_WR_REG(0xE5);
  1168. LCD_WR_DATA(0x00);
  1169. LCD_WR_DATA(0x00);
  1170. LCD_WR_DATA(0x00);
  1171. LCD_WR_DATA(0x00);
  1172. LCD_WR_DATA(0x02);
  1173. LCD_WR_DATA(0x00);
  1174. LCD_WR_DATA(0x29);
  1175. LCD_WR_DATA(0x00);
  1176. LCD_WR_DATA(0x3C);
  1177. LCD_WR_DATA(0x00);
  1178. LCD_WR_DATA(0x4B);
  1179. LCD_WR_DATA(0x00);
  1180. LCD_WR_DATA(0x5D);
  1181. LCD_WR_DATA(0x00);
  1182. LCD_WR_DATA(0x74);
  1183. LCD_WR_DATA(0x00);
  1184. LCD_WR_DATA(0x84);
  1185. LCD_WR_DATA(0x00);
  1186. LCD_WR_DATA(0x93);
  1187. LCD_WR_DATA(0x00);
  1188. LCD_WR_DATA(0xA2);
  1189. LCD_WR_DATA(0x00);
  1190. LCD_WR_DATA(0xB3);
  1191. LCD_WR_DATA(0x00);
  1192. LCD_WR_DATA(0xBE);
  1193. LCD_WR_DATA(0x00);
  1194. LCD_WR_DATA(0xC4);
  1195. LCD_WR_DATA(0x00);
  1196. LCD_WR_DATA(0xCD);
  1197. LCD_WR_DATA(0x00);
  1198. LCD_WR_DATA(0xD3);
  1199. LCD_WR_DATA(0x00);
  1200. LCD_WR_DATA(0xDC);
  1201. LCD_WR_DATA(0x00);
  1202. LCD_WR_DATA(0xF3);
  1203. LCD_WR_DATA(0x00);
  1204. LCD_WR_REG(0xE6);
  1205. LCD_WR_DATA(0x11);
  1206. LCD_WR_DATA(0x00);
  1207. LCD_WR_DATA(0x34);
  1208. LCD_WR_DATA(0x00);
  1209. LCD_WR_DATA(0x56);
  1210. LCD_WR_DATA(0x00);
  1211. LCD_WR_DATA(0x76);
  1212. LCD_WR_DATA(0x00);
  1213. LCD_WR_DATA(0x77);
  1214. LCD_WR_DATA(0x00);
  1215. LCD_WR_DATA(0x66);
  1216. LCD_WR_DATA(0x00);
  1217. LCD_WR_DATA(0x88);
  1218. LCD_WR_DATA(0x00);
  1219. LCD_WR_DATA(0x99);
  1220. LCD_WR_DATA(0x00);
  1221. LCD_WR_DATA(0xBB);
  1222. LCD_WR_DATA(0x00);
  1223. LCD_WR_DATA(0x99);
  1224. LCD_WR_DATA(0x00);
  1225. LCD_WR_DATA(0x66);
  1226. LCD_WR_DATA(0x00);
  1227. LCD_WR_DATA(0x55);
  1228. LCD_WR_DATA(0x00);
  1229. LCD_WR_DATA(0x55);
  1230. LCD_WR_DATA(0x00);
  1231. LCD_WR_DATA(0x45);
  1232. LCD_WR_DATA(0x00);
  1233. LCD_WR_DATA(0x43);
  1234. LCD_WR_DATA(0x00);
  1235. LCD_WR_DATA(0x44);
  1236. LCD_WR_DATA(0x00);
  1237. LCD_WR_REG(0xE7);
  1238. LCD_WR_DATA(0x32);
  1239. LCD_WR_DATA(0x00);
  1240. LCD_WR_DATA(0x55);
  1241. LCD_WR_DATA(0x00);
  1242. LCD_WR_DATA(0x76);
  1243. LCD_WR_DATA(0x00);
  1244. LCD_WR_DATA(0x66);
  1245. LCD_WR_DATA(0x00);
  1246. LCD_WR_DATA(0x67);
  1247. LCD_WR_DATA(0x00);
  1248. LCD_WR_DATA(0x67);
  1249. LCD_WR_DATA(0x00);
  1250. LCD_WR_DATA(0x87);
  1251. LCD_WR_DATA(0x00);
  1252. LCD_WR_DATA(0x99);
  1253. LCD_WR_DATA(0x00);
  1254. LCD_WR_DATA(0xBB);
  1255. LCD_WR_DATA(0x00);
  1256. LCD_WR_DATA(0x99);
  1257. LCD_WR_DATA(0x00);
  1258. LCD_WR_DATA(0x77);
  1259. LCD_WR_DATA(0x00);
  1260. LCD_WR_DATA(0x44);
  1261. LCD_WR_DATA(0x00);
  1262. LCD_WR_DATA(0x56);
  1263. LCD_WR_DATA(0x00);
  1264. LCD_WR_DATA(0x23);
  1265. LCD_WR_DATA(0x00);
  1266. LCD_WR_DATA(0x33);
  1267. LCD_WR_DATA(0x00);
  1268. LCD_WR_DATA(0x45);
  1269. LCD_WR_DATA(0x00);
  1270. LCD_WR_REG(0xE8);
  1271. LCD_WR_DATA(0x00);
  1272. LCD_WR_DATA(0x00);
  1273. LCD_WR_DATA(0x99);
  1274. LCD_WR_DATA(0x00);
  1275. LCD_WR_DATA(0x87);
  1276. LCD_WR_DATA(0x00);
  1277. LCD_WR_DATA(0x88);
  1278. LCD_WR_DATA(0x00);
  1279. LCD_WR_DATA(0x77);
  1280. LCD_WR_DATA(0x00);
  1281. LCD_WR_DATA(0x66);
  1282. LCD_WR_DATA(0x00);
  1283. LCD_WR_DATA(0x88);
  1284. LCD_WR_DATA(0x00);
  1285. LCD_WR_DATA(0xAA);
  1286. LCD_WR_DATA(0x00);
  1287. LCD_WR_DATA(0xBB);
  1288. LCD_WR_DATA(0x00);
  1289. LCD_WR_DATA(0x99);
  1290. LCD_WR_DATA(0x00);
  1291. LCD_WR_DATA(0x66);
  1292. LCD_WR_DATA(0x00);
  1293. LCD_WR_DATA(0x55);
  1294. LCD_WR_DATA(0x00);
  1295. LCD_WR_DATA(0x55);
  1296. LCD_WR_DATA(0x00);
  1297. LCD_WR_DATA(0x44);
  1298. LCD_WR_DATA(0x00);
  1299. LCD_WR_DATA(0x44);
  1300. LCD_WR_DATA(0x00);
  1301. LCD_WR_DATA(0x55);
  1302. LCD_WR_DATA(0x00);
  1303. LCD_WR_REG(0xE9);
  1304. LCD_WR_DATA(0xAA);
  1305. LCD_WR_DATA(0x00);
  1306. LCD_WR_DATA(0x00);
  1307. LCD_WR_DATA(0x00);
  1308. LCD_WR_REG(0x00);
  1309. LCD_WR_DATA(0xAA);
  1310. LCD_WR_REG(0xCF);
  1311. LCD_WR_DATA(0x00);
  1312. LCD_WR_DATA(0x00);
  1313. LCD_WR_DATA(0x00);
  1314. LCD_WR_DATA(0x00);
  1315. LCD_WR_DATA(0x00);
  1316. LCD_WR_DATA(0x00);
  1317. LCD_WR_DATA(0x00);
  1318. LCD_WR_DATA(0x00);
  1319. LCD_WR_DATA(0x00);
  1320. LCD_WR_DATA(0x00);
  1321. LCD_WR_DATA(0x00);
  1322. LCD_WR_DATA(0x00);
  1323. LCD_WR_DATA(0x00);
  1324. LCD_WR_DATA(0x00);
  1325. LCD_WR_DATA(0x00);
  1326. LCD_WR_DATA(0x00);
  1327. LCD_WR_DATA(0x00);
  1328. LCD_WR_REG(0xF0);
  1329. LCD_WR_DATA(0x00);
  1330. LCD_WR_DATA(0x50);
  1331. LCD_WR_DATA(0x00);
  1332. LCD_WR_DATA(0x00);
  1333. LCD_WR_DATA(0x00);
  1334. LCD_WR_REG(0xF3);
  1335. LCD_WR_DATA(0x00);
  1336. LCD_WR_REG(0xF9);
  1337. LCD_WR_DATA(0x06);
  1338. LCD_WR_DATA(0x10);
  1339. LCD_WR_DATA(0x29);
  1340. LCD_WR_DATA(0x00);
  1341. LCD_WR_REG(0x3A);
  1342. LCD_WR_DATA(0x55); //66
  1343. LCD_WR_REG(0x11);
  1344. rt_thread_mdelay(100);
  1345. LCD_WR_REG(0x29);
  1346. LCD_WR_REG(0x35);
  1347. LCD_WR_DATA(0x00);
  1348. LCD_WR_REG(0x51);
  1349. LCD_WR_DATA(0xFF);
  1350. LCD_WR_REG(0x53);
  1351. LCD_WR_DATA(0x2C);
  1352. LCD_WR_REG(0x55);
  1353. LCD_WR_DATA(0x82);
  1354. LCD_WR_REG(0x2c);
  1355. }
  1356. else if (lcddev.id == 0x5510)
  1357. {
  1358. LCD_WriteReg(0xF000, 0x55);
  1359. LCD_WriteReg(0xF001, 0xAA);
  1360. LCD_WriteReg(0xF002, 0x52);
  1361. LCD_WriteReg(0xF003, 0x08);
  1362. LCD_WriteReg(0xF004, 0x01);
  1363. //AVDD Set AVDD 5.2V
  1364. LCD_WriteReg(0xB000, 0x0D);
  1365. LCD_WriteReg(0xB001, 0x0D);
  1366. LCD_WriteReg(0xB002, 0x0D);
  1367. //AVDD ratio
  1368. LCD_WriteReg(0xB600, 0x34);
  1369. LCD_WriteReg(0xB601, 0x34);
  1370. LCD_WriteReg(0xB602, 0x34);
  1371. //AVEE -5.2V
  1372. LCD_WriteReg(0xB100, 0x0D);
  1373. LCD_WriteReg(0xB101, 0x0D);
  1374. LCD_WriteReg(0xB102, 0x0D);
  1375. //AVEE ratio
  1376. LCD_WriteReg(0xB700, 0x34);
  1377. LCD_WriteReg(0xB701, 0x34);
  1378. LCD_WriteReg(0xB702, 0x34);
  1379. //VCL -2.5V
  1380. LCD_WriteReg(0xB200, 0x00);
  1381. LCD_WriteReg(0xB201, 0x00);
  1382. LCD_WriteReg(0xB202, 0x00);
  1383. //VCL ratio
  1384. LCD_WriteReg(0xB800, 0x24);
  1385. LCD_WriteReg(0xB801, 0x24);
  1386. LCD_WriteReg(0xB802, 0x24);
  1387. //VGH 15V (Free pump)
  1388. LCD_WriteReg(0xBF00, 0x01);
  1389. LCD_WriteReg(0xB300, 0x0F);
  1390. LCD_WriteReg(0xB301, 0x0F);
  1391. LCD_WriteReg(0xB302, 0x0F);
  1392. //VGH ratio
  1393. LCD_WriteReg(0xB900, 0x34);
  1394. LCD_WriteReg(0xB901, 0x34);
  1395. LCD_WriteReg(0xB902, 0x34);
  1396. //VGL_REG -10V
  1397. LCD_WriteReg(0xB500, 0x08);
  1398. LCD_WriteReg(0xB501, 0x08);
  1399. LCD_WriteReg(0xB502, 0x08);
  1400. LCD_WriteReg(0xC200, 0x03);
  1401. //VGLX ratio
  1402. LCD_WriteReg(0xBA00, 0x24);
  1403. LCD_WriteReg(0xBA01, 0x24);
  1404. LCD_WriteReg(0xBA02, 0x24);
  1405. //VGMP/VGSP 4.5V/0V
  1406. LCD_WriteReg(0xBC00, 0x00);
  1407. LCD_WriteReg(0xBC01, 0x78);
  1408. LCD_WriteReg(0xBC02, 0x00);
  1409. //VGMN/VGSN -4.5V/0V
  1410. LCD_WriteReg(0xBD00, 0x00);
  1411. LCD_WriteReg(0xBD01, 0x78);
  1412. LCD_WriteReg(0xBD02, 0x00);
  1413. //VCOM
  1414. LCD_WriteReg(0xBE00, 0x00);
  1415. LCD_WriteReg(0xBE01, 0x64);
  1416. //Gamma Setting
  1417. LCD_WriteReg(0xD100, 0x00);
  1418. LCD_WriteReg(0xD101, 0x33);
  1419. LCD_WriteReg(0xD102, 0x00);
  1420. LCD_WriteReg(0xD103, 0x34);
  1421. LCD_WriteReg(0xD104, 0x00);
  1422. LCD_WriteReg(0xD105, 0x3A);
  1423. LCD_WriteReg(0xD106, 0x00);
  1424. LCD_WriteReg(0xD107, 0x4A);
  1425. LCD_WriteReg(0xD108, 0x00);
  1426. LCD_WriteReg(0xD109, 0x5C);
  1427. LCD_WriteReg(0xD10A, 0x00);
  1428. LCD_WriteReg(0xD10B, 0x81);
  1429. LCD_WriteReg(0xD10C, 0x00);
  1430. LCD_WriteReg(0xD10D, 0xA6);
  1431. LCD_WriteReg(0xD10E, 0x00);
  1432. LCD_WriteReg(0xD10F, 0xE5);
  1433. LCD_WriteReg(0xD110, 0x01);
  1434. LCD_WriteReg(0xD111, 0x13);
  1435. LCD_WriteReg(0xD112, 0x01);
  1436. LCD_WriteReg(0xD113, 0x54);
  1437. LCD_WriteReg(0xD114, 0x01);
  1438. LCD_WriteReg(0xD115, 0x82);
  1439. LCD_WriteReg(0xD116, 0x01);
  1440. LCD_WriteReg(0xD117, 0xCA);
  1441. LCD_WriteReg(0xD118, 0x02);
  1442. LCD_WriteReg(0xD119, 0x00);
  1443. LCD_WriteReg(0xD11A, 0x02);
  1444. LCD_WriteReg(0xD11B, 0x01);
  1445. LCD_WriteReg(0xD11C, 0x02);
  1446. LCD_WriteReg(0xD11D, 0x34);
  1447. LCD_WriteReg(0xD11E, 0x02);
  1448. LCD_WriteReg(0xD11F, 0x67);
  1449. LCD_WriteReg(0xD120, 0x02);
  1450. LCD_WriteReg(0xD121, 0x84);
  1451. LCD_WriteReg(0xD122, 0x02);
  1452. LCD_WriteReg(0xD123, 0xA4);
  1453. LCD_WriteReg(0xD124, 0x02);
  1454. LCD_WriteReg(0xD125, 0xB7);
  1455. LCD_WriteReg(0xD126, 0x02);
  1456. LCD_WriteReg(0xD127, 0xCF);
  1457. LCD_WriteReg(0xD128, 0x02);
  1458. LCD_WriteReg(0xD129, 0xDE);
  1459. LCD_WriteReg(0xD12A, 0x02);
  1460. LCD_WriteReg(0xD12B, 0xF2);
  1461. LCD_WriteReg(0xD12C, 0x02);
  1462. LCD_WriteReg(0xD12D, 0xFE);
  1463. LCD_WriteReg(0xD12E, 0x03);
  1464. LCD_WriteReg(0xD12F, 0x10);
  1465. LCD_WriteReg(0xD130, 0x03);
  1466. LCD_WriteReg(0xD131, 0x33);
  1467. LCD_WriteReg(0xD132, 0x03);
  1468. LCD_WriteReg(0xD133, 0x6D);
  1469. LCD_WriteReg(0xD200, 0x00);
  1470. LCD_WriteReg(0xD201, 0x33);
  1471. LCD_WriteReg(0xD202, 0x00);
  1472. LCD_WriteReg(0xD203, 0x34);
  1473. LCD_WriteReg(0xD204, 0x00);
  1474. LCD_WriteReg(0xD205, 0x3A);
  1475. LCD_WriteReg(0xD206, 0x00);
  1476. LCD_WriteReg(0xD207, 0x4A);
  1477. LCD_WriteReg(0xD208, 0x00);
  1478. LCD_WriteReg(0xD209, 0x5C);
  1479. LCD_WriteReg(0xD20A, 0x00);
  1480. LCD_WriteReg(0xD20B, 0x81);
  1481. LCD_WriteReg(0xD20C, 0x00);
  1482. LCD_WriteReg(0xD20D, 0xA6);
  1483. LCD_WriteReg(0xD20E, 0x00);
  1484. LCD_WriteReg(0xD20F, 0xE5);
  1485. LCD_WriteReg(0xD210, 0x01);
  1486. LCD_WriteReg(0xD211, 0x13);
  1487. LCD_WriteReg(0xD212, 0x01);
  1488. LCD_WriteReg(0xD213, 0x54);
  1489. LCD_WriteReg(0xD214, 0x01);
  1490. LCD_WriteReg(0xD215, 0x82);
  1491. LCD_WriteReg(0xD216, 0x01);
  1492. LCD_WriteReg(0xD217, 0xCA);
  1493. LCD_WriteReg(0xD218, 0x02);
  1494. LCD_WriteReg(0xD219, 0x00);
  1495. LCD_WriteReg(0xD21A, 0x02);
  1496. LCD_WriteReg(0xD21B, 0x01);
  1497. LCD_WriteReg(0xD21C, 0x02);
  1498. LCD_WriteReg(0xD21D, 0x34);
  1499. LCD_WriteReg(0xD21E, 0x02);
  1500. LCD_WriteReg(0xD21F, 0x67);
  1501. LCD_WriteReg(0xD220, 0x02);
  1502. LCD_WriteReg(0xD221, 0x84);
  1503. LCD_WriteReg(0xD222, 0x02);
  1504. LCD_WriteReg(0xD223, 0xA4);
  1505. LCD_WriteReg(0xD224, 0x02);
  1506. LCD_WriteReg(0xD225, 0xB7);
  1507. LCD_WriteReg(0xD226, 0x02);
  1508. LCD_WriteReg(0xD227, 0xCF);
  1509. LCD_WriteReg(0xD228, 0x02);
  1510. LCD_WriteReg(0xD229, 0xDE);
  1511. LCD_WriteReg(0xD22A, 0x02);
  1512. LCD_WriteReg(0xD22B, 0xF2);
  1513. LCD_WriteReg(0xD22C, 0x02);
  1514. LCD_WriteReg(0xD22D, 0xFE);
  1515. LCD_WriteReg(0xD22E, 0x03);
  1516. LCD_WriteReg(0xD22F, 0x10);
  1517. LCD_WriteReg(0xD230, 0x03);
  1518. LCD_WriteReg(0xD231, 0x33);
  1519. LCD_WriteReg(0xD232, 0x03);
  1520. LCD_WriteReg(0xD233, 0x6D);
  1521. LCD_WriteReg(0xD300, 0x00);
  1522. LCD_WriteReg(0xD301, 0x33);
  1523. LCD_WriteReg(0xD302, 0x00);
  1524. LCD_WriteReg(0xD303, 0x34);
  1525. LCD_WriteReg(0xD304, 0x00);
  1526. LCD_WriteReg(0xD305, 0x3A);
  1527. LCD_WriteReg(0xD306, 0x00);
  1528. LCD_WriteReg(0xD307, 0x4A);
  1529. LCD_WriteReg(0xD308, 0x00);
  1530. LCD_WriteReg(0xD309, 0x5C);
  1531. LCD_WriteReg(0xD30A, 0x00);
  1532. LCD_WriteReg(0xD30B, 0x81);
  1533. LCD_WriteReg(0xD30C, 0x00);
  1534. LCD_WriteReg(0xD30D, 0xA6);
  1535. LCD_WriteReg(0xD30E, 0x00);
  1536. LCD_WriteReg(0xD30F, 0xE5);
  1537. LCD_WriteReg(0xD310, 0x01);
  1538. LCD_WriteReg(0xD311, 0x13);
  1539. LCD_WriteReg(0xD312, 0x01);
  1540. LCD_WriteReg(0xD313, 0x54);
  1541. LCD_WriteReg(0xD314, 0x01);
  1542. LCD_WriteReg(0xD315, 0x82);
  1543. LCD_WriteReg(0xD316, 0x01);
  1544. LCD_WriteReg(0xD317, 0xCA);
  1545. LCD_WriteReg(0xD318, 0x02);
  1546. LCD_WriteReg(0xD319, 0x00);
  1547. LCD_WriteReg(0xD31A, 0x02);
  1548. LCD_WriteReg(0xD31B, 0x01);
  1549. LCD_WriteReg(0xD31C, 0x02);
  1550. LCD_WriteReg(0xD31D, 0x34);
  1551. LCD_WriteReg(0xD31E, 0x02);
  1552. LCD_WriteReg(0xD31F, 0x67);
  1553. LCD_WriteReg(0xD320, 0x02);
  1554. LCD_WriteReg(0xD321, 0x84);
  1555. LCD_WriteReg(0xD322, 0x02);
  1556. LCD_WriteReg(0xD323, 0xA4);
  1557. LCD_WriteReg(0xD324, 0x02);
  1558. LCD_WriteReg(0xD325, 0xB7);
  1559. LCD_WriteReg(0xD326, 0x02);
  1560. LCD_WriteReg(0xD327, 0xCF);
  1561. LCD_WriteReg(0xD328, 0x02);
  1562. LCD_WriteReg(0xD329, 0xDE);
  1563. LCD_WriteReg(0xD32A, 0x02);
  1564. LCD_WriteReg(0xD32B, 0xF2);
  1565. LCD_WriteReg(0xD32C, 0x02);
  1566. LCD_WriteReg(0xD32D, 0xFE);
  1567. LCD_WriteReg(0xD32E, 0x03);
  1568. LCD_WriteReg(0xD32F, 0x10);
  1569. LCD_WriteReg(0xD330, 0x03);
  1570. LCD_WriteReg(0xD331, 0x33);
  1571. LCD_WriteReg(0xD332, 0x03);
  1572. LCD_WriteReg(0xD333, 0x6D);
  1573. LCD_WriteReg(0xD400, 0x00);
  1574. LCD_WriteReg(0xD401, 0x33);
  1575. LCD_WriteReg(0xD402, 0x00);
  1576. LCD_WriteReg(0xD403, 0x34);
  1577. LCD_WriteReg(0xD404, 0x00);
  1578. LCD_WriteReg(0xD405, 0x3A);
  1579. LCD_WriteReg(0xD406, 0x00);
  1580. LCD_WriteReg(0xD407, 0x4A);
  1581. LCD_WriteReg(0xD408, 0x00);
  1582. LCD_WriteReg(0xD409, 0x5C);
  1583. LCD_WriteReg(0xD40A, 0x00);
  1584. LCD_WriteReg(0xD40B, 0x81);
  1585. LCD_WriteReg(0xD40C, 0x00);
  1586. LCD_WriteReg(0xD40D, 0xA6);
  1587. LCD_WriteReg(0xD40E, 0x00);
  1588. LCD_WriteReg(0xD40F, 0xE5);
  1589. LCD_WriteReg(0xD410, 0x01);
  1590. LCD_WriteReg(0xD411, 0x13);
  1591. LCD_WriteReg(0xD412, 0x01);
  1592. LCD_WriteReg(0xD413, 0x54);
  1593. LCD_WriteReg(0xD414, 0x01);
  1594. LCD_WriteReg(0xD415, 0x82);
  1595. LCD_WriteReg(0xD416, 0x01);
  1596. LCD_WriteReg(0xD417, 0xCA);
  1597. LCD_WriteReg(0xD418, 0x02);
  1598. LCD_WriteReg(0xD419, 0x00);
  1599. LCD_WriteReg(0xD41A, 0x02);
  1600. LCD_WriteReg(0xD41B, 0x01);
  1601. LCD_WriteReg(0xD41C, 0x02);
  1602. LCD_WriteReg(0xD41D, 0x34);
  1603. LCD_WriteReg(0xD41E, 0x02);
  1604. LCD_WriteReg(0xD41F, 0x67);
  1605. LCD_WriteReg(0xD420, 0x02);
  1606. LCD_WriteReg(0xD421, 0x84);
  1607. LCD_WriteReg(0xD422, 0x02);
  1608. LCD_WriteReg(0xD423, 0xA4);
  1609. LCD_WriteReg(0xD424, 0x02);
  1610. LCD_WriteReg(0xD425, 0xB7);
  1611. LCD_WriteReg(0xD426, 0x02);
  1612. LCD_WriteReg(0xD427, 0xCF);
  1613. LCD_WriteReg(0xD428, 0x02);
  1614. LCD_WriteReg(0xD429, 0xDE);
  1615. LCD_WriteReg(0xD42A, 0x02);
  1616. LCD_WriteReg(0xD42B, 0xF2);
  1617. LCD_WriteReg(0xD42C, 0x02);
  1618. LCD_WriteReg(0xD42D, 0xFE);
  1619. LCD_WriteReg(0xD42E, 0x03);
  1620. LCD_WriteReg(0xD42F, 0x10);
  1621. LCD_WriteReg(0xD430, 0x03);
  1622. LCD_WriteReg(0xD431, 0x33);
  1623. LCD_WriteReg(0xD432, 0x03);
  1624. LCD_WriteReg(0xD433, 0x6D);
  1625. LCD_WriteReg(0xD500, 0x00);
  1626. LCD_WriteReg(0xD501, 0x33);
  1627. LCD_WriteReg(0xD502, 0x00);
  1628. LCD_WriteReg(0xD503, 0x34);
  1629. LCD_WriteReg(0xD504, 0x00);
  1630. LCD_WriteReg(0xD505, 0x3A);
  1631. LCD_WriteReg(0xD506, 0x00);
  1632. LCD_WriteReg(0xD507, 0x4A);
  1633. LCD_WriteReg(0xD508, 0x00);
  1634. LCD_WriteReg(0xD509, 0x5C);
  1635. LCD_WriteReg(0xD50A, 0x00);
  1636. LCD_WriteReg(0xD50B, 0x81);
  1637. LCD_WriteReg(0xD50C, 0x00);
  1638. LCD_WriteReg(0xD50D, 0xA6);
  1639. LCD_WriteReg(0xD50E, 0x00);
  1640. LCD_WriteReg(0xD50F, 0xE5);
  1641. LCD_WriteReg(0xD510, 0x01);
  1642. LCD_WriteReg(0xD511, 0x13);
  1643. LCD_WriteReg(0xD512, 0x01);
  1644. LCD_WriteReg(0xD513, 0x54);
  1645. LCD_WriteReg(0xD514, 0x01);
  1646. LCD_WriteReg(0xD515, 0x82);
  1647. LCD_WriteReg(0xD516, 0x01);
  1648. LCD_WriteReg(0xD517, 0xCA);
  1649. LCD_WriteReg(0xD518, 0x02);
  1650. LCD_WriteReg(0xD519, 0x00);
  1651. LCD_WriteReg(0xD51A, 0x02);
  1652. LCD_WriteReg(0xD51B, 0x01);
  1653. LCD_WriteReg(0xD51C, 0x02);
  1654. LCD_WriteReg(0xD51D, 0x34);
  1655. LCD_WriteReg(0xD51E, 0x02);
  1656. LCD_WriteReg(0xD51F, 0x67);
  1657. LCD_WriteReg(0xD520, 0x02);
  1658. LCD_WriteReg(0xD521, 0x84);
  1659. LCD_WriteReg(0xD522, 0x02);
  1660. LCD_WriteReg(0xD523, 0xA4);
  1661. LCD_WriteReg(0xD524, 0x02);
  1662. LCD_WriteReg(0xD525, 0xB7);
  1663. LCD_WriteReg(0xD526, 0x02);
  1664. LCD_WriteReg(0xD527, 0xCF);
  1665. LCD_WriteReg(0xD528, 0x02);
  1666. LCD_WriteReg(0xD529, 0xDE);
  1667. LCD_WriteReg(0xD52A, 0x02);
  1668. LCD_WriteReg(0xD52B, 0xF2);
  1669. LCD_WriteReg(0xD52C, 0x02);
  1670. LCD_WriteReg(0xD52D, 0xFE);
  1671. LCD_WriteReg(0xD52E, 0x03);
  1672. LCD_WriteReg(0xD52F, 0x10);
  1673. LCD_WriteReg(0xD530, 0x03);
  1674. LCD_WriteReg(0xD531, 0x33);
  1675. LCD_WriteReg(0xD532, 0x03);
  1676. LCD_WriteReg(0xD533, 0x6D);
  1677. LCD_WriteReg(0xD600, 0x00);
  1678. LCD_WriteReg(0xD601, 0x33);
  1679. LCD_WriteReg(0xD602, 0x00);
  1680. LCD_WriteReg(0xD603, 0x34);
  1681. LCD_WriteReg(0xD604, 0x00);
  1682. LCD_WriteReg(0xD605, 0x3A);
  1683. LCD_WriteReg(0xD606, 0x00);
  1684. LCD_WriteReg(0xD607, 0x4A);
  1685. LCD_WriteReg(0xD608, 0x00);
  1686. LCD_WriteReg(0xD609, 0x5C);
  1687. LCD_WriteReg(0xD60A, 0x00);
  1688. LCD_WriteReg(0xD60B, 0x81);
  1689. LCD_WriteReg(0xD60C, 0x00);
  1690. LCD_WriteReg(0xD60D, 0xA6);
  1691. LCD_WriteReg(0xD60E, 0x00);
  1692. LCD_WriteReg(0xD60F, 0xE5);
  1693. LCD_WriteReg(0xD610, 0x01);
  1694. LCD_WriteReg(0xD611, 0x13);
  1695. LCD_WriteReg(0xD612, 0x01);
  1696. LCD_WriteReg(0xD613, 0x54);
  1697. LCD_WriteReg(0xD614, 0x01);
  1698. LCD_WriteReg(0xD615, 0x82);
  1699. LCD_WriteReg(0xD616, 0x01);
  1700. LCD_WriteReg(0xD617, 0xCA);
  1701. LCD_WriteReg(0xD618, 0x02);
  1702. LCD_WriteReg(0xD619, 0x00);
  1703. LCD_WriteReg(0xD61A, 0x02);
  1704. LCD_WriteReg(0xD61B, 0x01);
  1705. LCD_WriteReg(0xD61C, 0x02);
  1706. LCD_WriteReg(0xD61D, 0x34);
  1707. LCD_WriteReg(0xD61E, 0x02);
  1708. LCD_WriteReg(0xD61F, 0x67);
  1709. LCD_WriteReg(0xD620, 0x02);
  1710. LCD_WriteReg(0xD621, 0x84);
  1711. LCD_WriteReg(0xD622, 0x02);
  1712. LCD_WriteReg(0xD623, 0xA4);
  1713. LCD_WriteReg(0xD624, 0x02);
  1714. LCD_WriteReg(0xD625, 0xB7);
  1715. LCD_WriteReg(0xD626, 0x02);
  1716. LCD_WriteReg(0xD627, 0xCF);
  1717. LCD_WriteReg(0xD628, 0x02);
  1718. LCD_WriteReg(0xD629, 0xDE);
  1719. LCD_WriteReg(0xD62A, 0x02);
  1720. LCD_WriteReg(0xD62B, 0xF2);
  1721. LCD_WriteReg(0xD62C, 0x02);
  1722. LCD_WriteReg(0xD62D, 0xFE);
  1723. LCD_WriteReg(0xD62E, 0x03);
  1724. LCD_WriteReg(0xD62F, 0x10);
  1725. LCD_WriteReg(0xD630, 0x03);
  1726. LCD_WriteReg(0xD631, 0x33);
  1727. LCD_WriteReg(0xD632, 0x03);
  1728. LCD_WriteReg(0xD633, 0x6D);
  1729. //LV2 Page 0 enable
  1730. LCD_WriteReg(0xF000, 0x55);
  1731. LCD_WriteReg(0xF001, 0xAA);
  1732. LCD_WriteReg(0xF002, 0x52);
  1733. LCD_WriteReg(0xF003, 0x08);
  1734. LCD_WriteReg(0xF004, 0x00);
  1735. //Display control
  1736. LCD_WriteReg(0xB100, 0xCC);
  1737. LCD_WriteReg(0xB101, 0x00);
  1738. //Source hold time
  1739. LCD_WriteReg(0xB600, 0x05);
  1740. //Gate EQ control
  1741. LCD_WriteReg(0xB700, 0x70);
  1742. LCD_WriteReg(0xB701, 0x70);
  1743. //Source EQ control (Mode 2)
  1744. LCD_WriteReg(0xB800, 0x01);
  1745. LCD_WriteReg(0xB801, 0x03);
  1746. LCD_WriteReg(0xB802, 0x03);
  1747. LCD_WriteReg(0xB803, 0x03);
  1748. //Inversion mode (2-dot)
  1749. LCD_WriteReg(0xBC00, 0x02);
  1750. LCD_WriteReg(0xBC01, 0x00);
  1751. LCD_WriteReg(0xBC02, 0x00);
  1752. //Timing control 4H w/ 4-delay
  1753. LCD_WriteReg(0xC900, 0xD0);
  1754. LCD_WriteReg(0xC901, 0x02);
  1755. LCD_WriteReg(0xC902, 0x50);
  1756. LCD_WriteReg(0xC903, 0x50);
  1757. LCD_WriteReg(0xC904, 0x50);
  1758. LCD_WriteReg(0x3500, 0x00);
  1759. LCD_WriteReg(0x3A00, 0x55); //16-bit/pixel
  1760. LCD_WR_REG(0x1100);
  1761. rt_thread_mdelay(1);
  1762. LCD_WR_REG(0x2900);
  1763. }
  1764. else if (lcddev.id == 0X1963)
  1765. {
  1766. LCD_WR_REG(0xE2); //Set PLL with OSC = 10MHz (hardware), Multiplier N = 35, 250MHz < VCO < 800MHz = OSC*(N+1), VCO = 300MHz
  1767. LCD_WR_DATA(0x1D); //参数1
  1768. LCD_WR_DATA(0x02); //参数2 Divider M = 2, PLL = 300/(M+1) = 100MHz
  1769. LCD_WR_DATA(0x04); //参数3 Validate M and N values
  1770. rt_thread_mdelay(1);
  1771. LCD_WR_REG(0xE0); // Start PLL command
  1772. LCD_WR_DATA(0x01); // enable PLL
  1773. rt_thread_mdelay(10);
  1774. LCD_WR_REG(0xE0); // Start PLL command again
  1775. LCD_WR_DATA(0x03); // now, use PLL output as system clock
  1776. rt_thread_mdelay(12);
  1777. LCD_WR_REG(0x01); //软复位
  1778. rt_thread_mdelay(10);
  1779. LCD_WR_REG(0xE6); //设置像素频率,33Mhz
  1780. LCD_WR_DATA(0x2F);
  1781. LCD_WR_DATA(0xFF);
  1782. LCD_WR_DATA(0xFF);
  1783. LCD_WR_REG(0xB0); //设置LCD模式
  1784. LCD_WR_DATA(0x20); //24位模式
  1785. LCD_WR_DATA(0x00); //TFT 模式
  1786. LCD_WR_DATA((SSD_HOR_RESOLUTION - 1) >> 8); //设置LCD水平像素
  1787. LCD_WR_DATA(SSD_HOR_RESOLUTION - 1);
  1788. LCD_WR_DATA((SSD_VER_RESOLUTION - 1) >> 8); //设置LCD垂直像素
  1789. LCD_WR_DATA(SSD_VER_RESOLUTION - 1);
  1790. LCD_WR_DATA(0x00); //RGB序列
  1791. LCD_WR_REG(0xB4); //Set horizontal period
  1792. LCD_WR_DATA((SSD_HT - 1) >> 8);
  1793. LCD_WR_DATA(SSD_HT - 1);
  1794. LCD_WR_DATA(SSD_HPS >> 8);
  1795. LCD_WR_DATA(SSD_HPS);
  1796. LCD_WR_DATA(SSD_HOR_PULSE_WIDTH - 1);
  1797. LCD_WR_DATA(0x00);
  1798. LCD_WR_DATA(0x00);
  1799. LCD_WR_DATA(0x00);
  1800. LCD_WR_REG(0xB6); //Set vertical period
  1801. LCD_WR_DATA((SSD_VT - 1) >> 8);
  1802. LCD_WR_DATA(SSD_VT - 1);
  1803. LCD_WR_DATA(SSD_VPS >> 8);
  1804. LCD_WR_DATA(SSD_VPS);
  1805. LCD_WR_DATA(SSD_VER_FRONT_PORCH - 1);
  1806. LCD_WR_DATA(0x00);
  1807. LCD_WR_DATA(0x00);
  1808. LCD_WR_REG(0xF0); //设置SSD1963与CPU接口为16bit
  1809. LCD_WR_DATA(0x03); //16-bit(565 format) data for 16bpp
  1810. LCD_WR_REG(0x29); //开启显示
  1811. //设置PWM输出 背光通过占空比可调
  1812. LCD_WR_REG(0xD0); //设置自动白平衡DBC
  1813. LCD_WR_DATA(0x00); //disable
  1814. LCD_WR_REG(0xBE); //配置PWM输出
  1815. LCD_WR_DATA(0x05); //1设置PWM频率
  1816. LCD_WR_DATA(0xFE); //2设置PWM占空比
  1817. LCD_WR_DATA(0x01); //3设置C
  1818. LCD_WR_DATA(0x00); //4设置D
  1819. LCD_WR_DATA(0x00); //5设置E
  1820. LCD_WR_DATA(0x00); //6设置F
  1821. LCD_WR_REG(0xB8); //设置GPIO配置
  1822. LCD_WR_DATA(0x03); //2个IO口设置成输出
  1823. LCD_WR_DATA(0x01); //GPIO使用正常的IO功能
  1824. LCD_WR_REG(0xBA);
  1825. LCD_WR_DATA(0X01); //GPIO[1:0]=01,控制LCD方向
  1826. LCD_SSD_BackLightSet(100); //背光设置为最亮
  1827. }
  1828. //初始化完成以后,提速
  1829. if (lcddev.id == 0X9341 || lcddev.id == 0X5310 || lcddev.id == 0X5510 || lcddev.id == 0X1963) //如果是这几个IC,则设置WR时序为最快
  1830. {
  1831. //重新配置写时序控制寄存器的时序
  1832. FSMC_Bank1E->BWTR[6] &= ~(0XF << 0); //地址建立时间(ADDSET)清零
  1833. FSMC_Bank1E->BWTR[6] &= ~(0XF << 8); //数据保存时间清零
  1834. FSMC_Bank1E->BWTR[6] |= 3 << 0; //地址建立时间(ADDSET)为3个HCLK =18ns
  1835. FSMC_Bank1E->BWTR[6] |= 2 << 8; //数据保存时间(DATAST)为6ns*3个HCLK=18ns
  1836. }
  1837. LCD_Display_Dir(1); //默认为横屏
  1838. rt_pin_write(LCD_BL, PIN_HIGH);
  1839. LCD_Clear(0xffff);
  1840. return RT_EOK;
  1841. }
  1842. struct rt_device_graphic_ops fsmc_lcd_ops =
  1843. {
  1844. LCD_Fast_DrawPoint,
  1845. LCD_ReadPoint,
  1846. LCD_HLine,
  1847. LCD_VLine,
  1848. LCD_BlitLine,
  1849. };
  1850. static rt_err_t drv_lcd_control(struct rt_device *device, int cmd, void *args)
  1851. {
  1852. struct drv_lcd_device *lcd = LCD_DEVICE(device);
  1853. switch (cmd)
  1854. {
  1855. case RTGRAPHIC_CTRL_GET_INFO:
  1856. {
  1857. struct rt_device_graphic_info *info = (struct rt_device_graphic_info *)args;
  1858. RT_ASSERT(info != RT_NULL);
  1859. //this needs to be replaced by the customer
  1860. info->pixel_format = lcd->lcd_info.pixel_format;
  1861. info->bits_per_pixel = lcd->lcd_info.bits_per_pixel;
  1862. info->width = lcddev.width;
  1863. info->height = lcddev.height;
  1864. }
  1865. break;
  1866. }
  1867. return RT_EOK;
  1868. }
  1869. #ifdef RT_USING_DEVICE_OPS
  1870. const static struct rt_device_ops lcd_ops =
  1871. {
  1872. drv_lcd_init,
  1873. RT_NULL,
  1874. RT_NULL,
  1875. RT_NULL,
  1876. RT_NULL,
  1877. drv_lcd_control};
  1878. #endif
  1879. int drv_lcd_hw_init(void)
  1880. {
  1881. rt_err_t result = RT_EOK;
  1882. struct rt_device *device = &_lcd.parent;
  1883. /* memset _lcd to zero */
  1884. memset(&_lcd, 0x00, sizeof(_lcd));
  1885. _lcd.lcd_info.bits_per_pixel = 16;
  1886. _lcd.lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565;
  1887. device->type = RT_Device_Class_Graphic;
  1888. #ifdef RT_USING_DEVICE_OPS
  1889. device->ops = &lcd_ops;
  1890. #else
  1891. device->init = drv_lcd_init;
  1892. device->control = drv_lcd_control;
  1893. #endif
  1894. device->user_data = &fsmc_lcd_ops;
  1895. /* register lcd device */
  1896. rt_device_register(device, "lcd", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);
  1897. return result;
  1898. }
  1899. INIT_DEVICE_EXPORT(drv_lcd_hw_init);
  1900. #ifdef BSP_USING_ONBOARD_LCD_TEST
  1901. void lcd_auto_fill(void *para)
  1902. {
  1903. int num = (int)para;
  1904. do
  1905. {
  1906. LCD_Clear(rt_tick_get());
  1907. rt_thread_mdelay(500);
  1908. }while(--num);
  1909. }
  1910. #include <stdlib.h> /* atoi */
  1911. void lcd_fill(int argc, void **argv)
  1912. {
  1913. static rt_uint8_t lcd_init = 0;
  1914. rt_device_t lcd = RT_NULL;
  1915. if(lcd_init == 0)
  1916. {
  1917. lcd_init = 1;
  1918. lcd = rt_device_find("lcd");
  1919. rt_device_init(lcd);
  1920. }
  1921. if(argc == 1)
  1922. {
  1923. lcd_auto_fill((void *)1);
  1924. }
  1925. else if(argc == 3)
  1926. {
  1927. if(rt_strcmp(argv[1], "-t")==0)
  1928. {
  1929. rt_thread_t tid = RT_NULL;
  1930. tid = rt_thread_create("lcd_fill", lcd_auto_fill, (void *)atoi(argv[2]), 512, 23,10);
  1931. rt_thread_startup(tid);
  1932. }
  1933. }
  1934. }
  1935. MSH_CMD_EXPORT(lcd_fill, lcd fill test for mcu lcd);
  1936. #endif