drv_lcd.c 58 KB

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