cpu_lcd.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. #include <string.h>
  2. #include "FreeRTOS.h"
  3. #include "chip.h"
  4. #include "board.h"
  5. #if LCD_INTERFACE_TYPE == LCD_INTERFACE_CPU
  6. /*
  7. Cpu 屏接口模式。
  8. */
  9. #define LCD_BASE REGS_LCD_BASE
  10. #define CPU_SCR_SOFT (56 * 4)
  11. #define CPU_SCR_CTRL (57 * 4)
  12. #define LCD_PARAM1 4
  13. #define SYS_BASE REGS_SYSCTL_BASE
  14. #define WR_Com(address) WriteCpuCmd(CPU_PANEL_DATA,address);
  15. #define WR_D(data) WriteCpuData(CPU_PANEL_DATA,data);
  16. /*
  17. Cpu 控制信号数据位。
  18. */
  19. #define RS_1 0X200000
  20. #define CS_1 0X100000
  21. #define RD_1 0X080000
  22. #define WR_1 0X040000
  23. #define RS_0 (~0X200000)
  24. #define CS_0 (~0X100000)
  25. #define RD_0 (~0X080000)
  26. #define WR_0 (~0X040000)
  27. void ConfigCpuInit(void)
  28. {
  29. u32 val = 0;
  30. val=readl(LCD_BASE + LCD_PARAM1);
  31. val&=~(BIT(19)|BIT(18)|BIT(17)|BIT(3)|BIT(2)|BIT(1));
  32. val|=(0x06<<1);//CPU MODE RS RD CS NORMAL
  33. writel(val, LCD_BASE + LCD_PARAM1);
  34. }
  35. void ConfigCpuPadmux(u8 Interface)
  36. {
  37. u32 val = 0;
  38. //cpu_screen_rst cpu_scr_cs cpu_scr_wr cpu_scr_rs cpu_scr_rd
  39. val=readl(SYS_BASE + SYS_PAD_CTRL05);
  40. val &= ~0x00FFC000;
  41. // rd rs wr cs reset
  42. val |= 1<<22|1<<20|1<<18|1<<16|1<<14;
  43. writel(val,SYS_BASE + SYS_PAD_CTRL05);
  44. switch(Interface) {
  45. case CPU_PANEL_18BIT_MODE:
  46. val = readl(SYS_BASE + SYS_PAD_CTRL04);
  47. val &= ~0xFFFFFFFF;
  48. //d15 d14 d13 d12 d11 d10 d19 d8 d7 d6 d5 d4 d3 d2 d1 d0
  49. val |= 1<<30|1<<28|1<<26|1<<24|1<<22|1<<20|1<<18|1<<16|1<<14|1<<12|1<<10|1<<8|1<<6|1<<4|1<<2|1<<0;//_018BIT_MODE 接D0-D17
  50. writel(val,SYS_BASE + SYS_PAD_CTRL04);
  51. val = readl(SYS_BASE + SYS_PAD_CTRL05);
  52. val &= ~0x0000000f;
  53. // D17 D16
  54. val |= 1<<2|1<<0;
  55. writel(val,SYS_BASE + SYS_PAD_CTRL05);
  56. break;
  57. case CPU_PANEL_16BIT_MODE:
  58. val =readl(SYS_BASE + SYS_PAD_CTRL04);
  59. val &= ~0xFFFFFFF0;
  60. //d15 d14 d13 d12 d11 d10 d19 d8 d7 d6 d5 d4 d3 d2
  61. val |= 1<<30|1<<28|1<<26|1<<24|1<<22|1<<20|1<<18|1<<16|1<<14|1<<12|1<<10|1<<8|1<<6|1<<4;//_016BIT_MODE 接D2-D17
  62. writel(val,SYS_BASE + SYS_PAD_CTRL04);
  63. val = readl(SYS_BASE + SYS_PAD_CTRL05);
  64. val &= ~0x0000000f;
  65. // D17 D16
  66. val |= 1<<2|1<<0;
  67. writel(val,SYS_BASE + SYS_PAD_CTRL05);
  68. break;
  69. case CPU_PANEL_9BIT_MODE:
  70. val = readl(SYS_BASE + SYS_PAD_CTRL04);
  71. val &= ~0xFFFC0000;
  72. //d15 d14 d13 d12 d11 d10 d19
  73. val |= 1<<30|1<<28|1<<26|1<<24|1<<22|1<<20|1<<18;//_09BIT_MODE 接D9-D17
  74. writel(val,SYS_BASE + SYS_PAD_CTRL04);
  75. val = readl(SYS_BASE + SYS_PAD_CTRL05);
  76. val &= ~0x0000000f;
  77. // D17 D16
  78. val |= 1<<2|1<<0;
  79. writel(val,SYS_BASE + SYS_PAD_CTRL05);
  80. break;
  81. case CPU_PANEL_8BIT_MODE:
  82. val = readl(SYS_BASE + SYS_PAD_CTRL04);
  83. val &= ~0xFFF00000;
  84. //d15 d14 d13 d12 d11 d10
  85. val |= 1<<30|1<<28|1<<26|1<<24|1<<22|1<<20;//_08BIT_MODE 接D10-D17
  86. writel(val,SYS_BASE + SYS_PAD_CTRL04);
  87. val=readl(SYS_BASE + SYS_PAD_CTRL05);
  88. val &= ~0x0000000f;
  89. // D17 D16
  90. val |= 1<<2|1<<0;
  91. writel(val,SYS_BASE + SYS_PAD_CTRL05);
  92. break;
  93. default:
  94. break;
  95. }
  96. }
  97. void CPU_Pannel_Reset(void)
  98. {
  99. u32 val=0;
  100. val=readl(LCD_BASE + CPU_SCR_CTRL);
  101. val|= BIT(9);
  102. writel(val,LCD_BASE + CPU_SCR_CTRL);//cpu reset 1
  103. mdelay(20);
  104. val &= ~(BIT(9));
  105. writel(val,LCD_BASE + CPU_SCR_CTRL);//cpu reset 0
  106. mdelay(20);
  107. val|= BIT(9);
  108. writel(val,LCD_BASE + CPU_SCR_CTRL);//cpu reset 1
  109. mdelay(20);
  110. }
  111. void SetCpuSoftwareMode()
  112. {
  113. u32 val=0;
  114. val=readl(LCD_BASE + CPU_SCR_CTRL);
  115. val |=BIT(0);
  116. writel(val,LCD_BASE + CPU_SCR_CTRL);
  117. }
  118. void SetCpuHardwareMode()
  119. {
  120. u32 val=0;
  121. val=readl(LCD_BASE + CPU_SCR_CTRL);
  122. val &=~(BIT(0));
  123. writel(val,LCD_BASE + CPU_SCR_CTRL);
  124. }
  125. u32 transfor18BitDate(u8 Interface,u16 dat)
  126. {
  127. u32 tempDat = 0x00;
  128. switch(Interface)
  129. {
  130. case CPU_PANEL_18BIT_MODE:
  131. tempDat = (dat>>8)&0xff;
  132. tempDat |= dat & 0xff;
  133. break;
  134. case CPU_PANEL_16BIT_MODE:
  135. tempDat = (dat>>8)&0xff;
  136. tempDat <<= 9;
  137. tempDat |= dat & 0xff;
  138. tempDat <<= 1;
  139. break;
  140. case CPU_PANEL_9BIT_MODE:
  141. tempDat = dat&0xff;
  142. tempDat <<= 10;
  143. break;
  144. case CPU_PANEL_8BIT_MODE:
  145. tempDat = dat&0xff;
  146. tempDat <<= 10;
  147. break;
  148. default:
  149. break;
  150. }
  151. return tempDat;
  152. }
  153. void WriteCpuCmd(u8 Interface,u16 Val)
  154. {
  155. u32 tmpDat;
  156. tmpDat=transfor18BitDate(Interface,Val);
  157. tmpDat |=( RD_1);
  158. tmpDat &=( CS_0);
  159. tmpDat &=( RS_0);
  160. writel(tmpDat,LCD_BASE + CPU_SCR_SOFT);
  161. tmpDat&=( WR_0);
  162. writel(tmpDat,LCD_BASE + CPU_SCR_SOFT);
  163. tmpDat |=( WR_1);
  164. writel(tmpDat,LCD_BASE + CPU_SCR_SOFT);
  165. tmpDat |=( CS_1);
  166. tmpDat &=( RS_0);
  167. writel(tmpDat,LCD_BASE + CPU_SCR_SOFT);
  168. }
  169. void WriteCpuData(u8 Interface,u16 Val)
  170. {
  171. u32 tmpDat;
  172. tmpDat=transfor18BitDate(Interface,Val);
  173. tmpDat |=( RD_1);
  174. tmpDat &=( CS_0);
  175. tmpDat |=( RS_1);
  176. writel(tmpDat,LCD_BASE + CPU_SCR_SOFT);
  177. tmpDat&=( WR_0);
  178. writel(tmpDat,LCD_BASE + CPU_SCR_SOFT);
  179. tmpDat |=( WR_1);
  180. writel(tmpDat,LCD_BASE + CPU_SCR_SOFT);
  181. tmpDat |=( CS_1);
  182. tmpDat |=( RS_1);
  183. writel(tmpDat,LCD_BASE + CPU_SCR_SOFT);
  184. }
  185. void InitalCPU_TCXD035ABFON_8bit(void)
  186. {
  187. uint16_t i,j,k=0;
  188. WR_Com(0x5E); // SET password
  189. WR_D(0xA5);
  190. mdelay(100);
  191. WR_Com(0x49); // SET password
  192. WR_D(0x0E);
  193. WR_D(0x00);
  194. WR_D(0x00);
  195. WR_D(0xA5);
  196. WR_Com(0x61); // Set Power Control
  197. WR_D(0x8F); // n=2, all power on
  198. WR_D(0x44);
  199. WR_D(0x02);
  200. WR_D(0xA5);
  201. WR_Com(0x5A); // Set Power Control
  202. WR_D(0x70); // n=2, all power on
  203. WR_D(0x21);
  204. WR_D(0xA5);
  205. WR_D(0xA5);
  206. WR_Com(0x71); //Set Electronic Volume1
  207. WR_D(0x1E); //VCOM=-0.675V
  208. WR_D( 0x0B); //VGH=15V
  209. WR_D(0x0B); //VGL=-10V
  210. WR_D(0xA5);
  211. WR_Com( 0x72); //Set Electronic Volume2
  212. WR_D(0x17); //GVDD=5.4V
  213. WR_D(0x17); //GVCL=-5.4V
  214. WR_D(0xA5);
  215. WR_D(0xA5);
  216. WR_Com( 0x81); //Set Gamma Positive1
  217. WR_D(0x00);
  218. WR_D(0x16);
  219. WR_D(0x1B);
  220. WR_D(0x1C);
  221. WR_Com(0x82); //Set Gamma Positive2
  222. WR_D(0x1E);
  223. WR_D(0x1F);
  224. WR_D(0x20);
  225. WR_D(0x21);
  226. WR_Com(0x83); //Set Gamma Positive3
  227. WR_D(0x23);
  228. WR_D(0x24);
  229. WR_D(0x26);
  230. WR_D(0x28);
  231. WR_Com(0x84); //Set Gamma Positive4
  232. WR_D(0x2B);
  233. WR_D(0x2F);
  234. WR_D(0x34);
  235. WR_D(0x3F);
  236. WR_Com(0x89); //Set Gamma Negative1
  237. WR_D(0x00);
  238. WR_D(0x16);
  239. WR_D(0x1B);
  240. WR_D(0x1C);
  241. WR_Com(0x8A); //Set Gamma Negative2
  242. WR_D(0x1E);
  243. WR_D(0x1F);
  244. WR_D(0x20);
  245. WR_D(0x21);
  246. WR_Com(0x8B); //Set Gamma Negative3
  247. WR_D(0x23);
  248. WR_D(0x24);
  249. WR_D(0x26);
  250. WR_D(0x28);
  251. WR_Com(0x8C); //Set Gamma Negative4
  252. WR_D(0x2B);
  253. WR_D(0x2F);
  254. WR_D(0x34);
  255. WR_D(0x3F);
  256. WR_Com(0x21); //Set Memory Address Control
  257. WR_D(0x01);
  258. WR_D(0xA5);
  259. WR_D(0xA5);
  260. WR_D(0xA5);
  261. WR_Com(0x13); // SLEEP OUT
  262. WR_D(0xA5); // VOFREG
  263. mdelay(100);
  264. WR_Com(0x25); //Set Page Address
  265. WR_D(0x02); //from page0
  266. WR_D(0xA5); //to page 159
  267. WR_D(0xA5);
  268. WR_D(0xA5);
  269. WR_Com(0x22); //Set Page Address
  270. WR_D(0x00); //from page0
  271. WR_D(0x9F); //to page 159
  272. WR_D(0x00);
  273. WR_D(0xA5);
  274. WR_Com(0x24);
  275. WR_D(0x00);
  276. WR_D(0xA5);
  277. WR_D(0xA5);
  278. WR_D(0xA5);
  279. WR_Com(0x23); //Set Column Address
  280. WR_D(0x00); //from col0
  281. WR_D(0x00);
  282. WR_D(0x00); //to col239
  283. WR_D(0xEF);
  284. WR_Com(0x12);
  285. WR_D(0xA5);
  286. WR_Com(0x3a);
  287. WR_D(0xA5);
  288. for(i=0;i<38400;i++)
  289. WR_D(0xff);
  290. // 16灰阶
  291. for(k=0;k<16;k++) {
  292. for(i=0;i<10;i++) {
  293. for(j=0;j<240;j++)
  294. WR_D(k<<4|k);
  295. }
  296. }
  297. };
  298. void Cpulcd_Init(void)
  299. {
  300. ConfigCpuInit();
  301. ConfigCpuPadmux(CPU_PANEL_DATA);
  302. CPU_Pannel_Reset();
  303. SetCpuSoftwareMode();
  304. InitalCPU_TCXD035ABFON_8bit();
  305. SetCpuHardwareMode();
  306. }
  307. #endif