lcd.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. #include "stm32f10x.h"
  2. #include "rtthread.h"
  3. #include <rtgui/rtgui.h>
  4. #include <rtgui/driver.h>
  5. #include <rtgui/rtgui_server.h>
  6. #include <rtgui/rtgui_system.h>
  7. #define lcd_hw_version 1
  8. /*
  9. 1 FMT0371
  10. 2 ILI9325
  11. */
  12. #if (lcd_hw_version == 1)
  13. #include "fmt0371/FMT0371.h"
  14. #endif
  15. #if (lcd_hw_version == 2)
  16. #include "ili9325/ili9320.h"
  17. #endif
  18. rt_err_t rt_hw_lcd_init(void);
  19. void rt_hw_lcd_update(rtgui_rect_t *rect);
  20. rt_uint8_t * rt_hw_lcd_get_framebuffer(void);
  21. void rt_hw_lcd_set_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y);
  22. void rt_hw_lcd_get_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y);
  23. void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y);
  24. void rt_hw_lcd_draw_vline(rtgui_color_t *c, rt_base_t x, rt_base_t y1, rt_base_t y2);
  25. void rt_hw_lcd_draw_raw_hline(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y);
  26. struct rtgui_graphic_driver _rtgui_lcd_driver =
  27. {
  28. "lcd",
  29. 2,
  30. 240,
  31. 320,
  32. rt_hw_lcd_update,
  33. rt_hw_lcd_get_framebuffer,
  34. rt_hw_lcd_set_pixel,
  35. rt_hw_lcd_get_pixel,
  36. rt_hw_lcd_draw_hline,
  37. rt_hw_lcd_draw_vline,
  38. rt_hw_lcd_draw_raw_hline
  39. };
  40. extern void info_init(void);
  41. extern void player_init(void);
  42. void radio_rtgui_init(void)
  43. {
  44. rtgui_rect_t rect;
  45. rtgui_system_server_init();
  46. /* register dock panel */
  47. rect.x1 = 0;
  48. rect.y1 = 0;
  49. rect.x2 = 240;
  50. rect.y2 = 25;
  51. rtgui_panel_register("info", &rect);
  52. /* register main panel */
  53. rect.x1 = 0;
  54. rect.y1 = 25;
  55. rect.x2 = 320;
  56. rect.y2 = 320;
  57. rtgui_panel_register("main", &rect);
  58. rtgui_panel_set_default_focused("main");
  59. rt_hw_lcd_init();
  60. info_init();
  61. player_init();
  62. }
  63. #if (lcd_hw_version == 1)
  64. void rt_hw_lcd_update(rtgui_rect_t *rect)
  65. {
  66. /* nothing for none-DMA mode driver */
  67. }
  68. rt_uint8_t * rt_hw_lcd_get_framebuffer(void)
  69. {
  70. return RT_NULL; /* no framebuffer driver */
  71. }
  72. void rt_hw_lcd_set_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y)
  73. {
  74. unsigned short p;
  75. /* get color pixel */
  76. p = rtgui_color_to_565p(*c);
  77. /* set X point */
  78. LCD_ADDR = 0x02;
  79. LCD_DATA = x;
  80. /* set Y point */
  81. LCD_ADDR = 0x03;
  82. LCD_DATA16(y);
  83. /* write pixel */
  84. LCD_ADDR = 0x0E;
  85. LCD_DATA16(p);
  86. }
  87. void rt_hw_lcd_get_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y)
  88. {
  89. unsigned short p;
  90. /* set X point */
  91. LCD_ADDR = 0x02;
  92. LCD_DATA = x;
  93. /* set Y point */
  94. LCD_ADDR = 0x03;
  95. LCD_DATA16( y );
  96. /* read pixel */
  97. LCD_ADDR = 0x0F;
  98. LCD_DATA16_READ(p);
  99. *c = rtgui_color_from_565p(p);
  100. }
  101. void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y)
  102. {
  103. unsigned short p;
  104. /* get color pixel */
  105. p = rtgui_color_to_565p(*c);
  106. /* set X point */
  107. LCD_ADDR = 0x02;
  108. LCD_DATA = x1;
  109. /* set Y point */
  110. LCD_ADDR = 0x03;
  111. LCD_DATA16( y );
  112. /* write pixel */
  113. LCD_ADDR = 0x0E;
  114. while (x1 < x2)
  115. {
  116. LCD_DATA16(p);
  117. x1 ++;
  118. }
  119. }
  120. void rt_hw_lcd_draw_vline(rtgui_color_t *c, rt_base_t x, rt_base_t y1, rt_base_t y2)
  121. {
  122. unsigned short p;
  123. /* get color pixel */
  124. p = rtgui_color_to_565p(*c);
  125. /* set X point */
  126. LCD_ADDR = 0x02;
  127. LCD_DATA = x;
  128. while (y1 < y2)
  129. {
  130. /* set Y point */
  131. LCD_ADDR = 0x03;
  132. LCD_DATA16( y1 );
  133. /* write pixel */
  134. LCD_ADDR = 0x0E;
  135. LCD_DATA16(p);
  136. y1 ++;
  137. }
  138. }
  139. void rt_hw_lcd_draw_raw_hline(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y)
  140. {
  141. rt_uint16_t *ptr;
  142. /* get pixel */
  143. ptr = (rt_uint16_t*) pixels;
  144. /* set X point */
  145. LCD_ADDR = 0x02;
  146. LCD_DATA = x1;
  147. /* set Y point */
  148. LCD_ADDR = 0x03;
  149. LCD_DATA16( y );
  150. /* write pixel */
  151. LCD_ADDR = 0x0E;
  152. while (x1 < x2)
  153. {
  154. LCD_DATA16(*ptr);
  155. x1 ++;
  156. ptr ++;
  157. }
  158. }
  159. rt_err_t rt_hw_lcd_init(void)
  160. {
  161. GPIO_InitTypeDef GPIO_InitStructure;
  162. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
  163. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  164. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  165. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  166. GPIO_Init(GPIOF,&GPIO_InitStructure);
  167. GPIO_SetBits(GPIOF,GPIO_Pin_9);
  168. ftm0371_port_init();
  169. ftm0371_init();
  170. #ifndef DRIVER_TEST
  171. /* add lcd driver into graphic driver */
  172. rtgui_graphic_driver_add(&_rtgui_lcd_driver);
  173. #endif
  174. return RT_EOK;
  175. }
  176. #include <finsh.h>
  177. void hline(rt_base_t x1, rt_base_t x2, rt_base_t y, rt_uint32_t pixel)
  178. {
  179. rt_hw_lcd_draw_hline(&pixel, x1, x2, y);
  180. }
  181. FINSH_FUNCTION_EXPORT(hline, draw a hline);
  182. void vline(int x, int y1, int y2, rt_uint32_t pixel)
  183. {
  184. rt_hw_lcd_draw_vline(&pixel, x, y1, y2);
  185. }
  186. FINSH_FUNCTION_EXPORT(vline, draw a vline);
  187. void cls()
  188. {
  189. rt_size_t index;
  190. rtgui_color_t white = RTGUI_RGB(0xff, 0xff, 0xff);
  191. for (index = 0; index < 320; index ++)
  192. rt_hw_lcd_draw_hline(&white, 0, 240, index);
  193. }
  194. FINSH_FUNCTION_EXPORT(cls, clear screen);
  195. #endif
  196. #if (lcd_hw_version == 2)
  197. void rt_hw_lcd_update(rtgui_rect_t *rect)
  198. {
  199. /* nothing for none-DMA mode driver */
  200. }
  201. rt_uint8_t * rt_hw_lcd_get_framebuffer(void)
  202. {
  203. return RT_NULL; /* no framebuffer driver */
  204. }
  205. /* 设置像素点 颜色,X,Y */
  206. void rt_hw_lcd_set_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y)
  207. {
  208. unsigned short p;
  209. if ( (x>320)||(y>240) ) return;
  210. /* get color pixel */
  211. p = rtgui_color_to_565p(*c);
  212. ili9320_SetCursor(x,y);
  213. LCD_WriteRAM_Prepare();
  214. LCD_WriteRAM(p);
  215. }
  216. /* 获取像素点颜色 */
  217. void rt_hw_lcd_get_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y)
  218. {
  219. unsigned short p;
  220. ili9320_SetCursor(x,y);
  221. //if (DeviceCode==0x7783)
  222. //{
  223. // p = (LCD_ReadRAM());
  224. //}
  225. //else
  226. //{
  227. p = (ili9320_BGR2RGB(LCD_ReadRAM()));
  228. //}
  229. *c = rtgui_color_from_565p(p);
  230. }
  231. /* 画水平线 */
  232. void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y)
  233. {
  234. unsigned short p;
  235. /* get color pixel */
  236. p = rtgui_color_to_565p(*c);
  237. /* [5:4]-ID~ID0 [3]-AM-1垂直-0水平 */
  238. LCD_WriteReg(0x0003,(1<<12)|(1<<5)|(0<<4) | (0<<3) );
  239. ili9320_SetCursor(x1, y);
  240. LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
  241. while (x1 < x2)
  242. {
  243. //LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
  244. LCD_WriteRAM(p);
  245. x1++;
  246. //ili9320_SetCursor(x1, y);
  247. }
  248. }
  249. /* 垂直线 */
  250. void rt_hw_lcd_draw_vline(rtgui_color_t *c, rt_base_t x, rt_base_t y1, rt_base_t y2)
  251. {
  252. unsigned short p;
  253. /* get color pixel */
  254. p = rtgui_color_to_565p(*c);
  255. /* [5:4]-ID~ID0 [3]-AM-1垂直-0水平 */
  256. LCD_WriteReg(0x0003,(1<<12)|(1<<5)|(0<<4) | (1<<3) );
  257. ili9320_SetCursor(x, y1);
  258. LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
  259. while (y1 < y2)
  260. {
  261. //LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
  262. LCD_WriteRAM(p);
  263. y1++;
  264. //ili9320_SetCursor(x, y1);
  265. }
  266. }
  267. /* ?? */
  268. void rt_hw_lcd_draw_raw_hline(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y)
  269. {
  270. rt_uint16_t *ptr;
  271. /* get pixel */
  272. ptr = (rt_uint16_t*) pixels;
  273. /* [5:4]-ID~ID0 [3]-AM-1垂直-0水平 */
  274. //LCD_WriteReg(0x0003,(1<<12)|(1<<5)|(0<<4) | (0<<3) );
  275. ili9320_SetCursor(x1, y);
  276. LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
  277. while (x1 < x2)
  278. {
  279. LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
  280. LCD_WriteRAM( *ptr );
  281. x1 ++;
  282. ptr ++;
  283. ili9320_SetCursor(x1, y);
  284. }
  285. }
  286. rt_err_t rt_hw_lcd_init(void)
  287. {
  288. GPIO_InitTypeDef GPIO_InitStructure;
  289. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
  290. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  291. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  292. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  293. GPIO_Init(GPIOF,&GPIO_InitStructure);
  294. GPIO_SetBits(GPIOF,GPIO_Pin_9);
  295. ili9320_Initializtion();
  296. #ifndef DRIVER_TEST
  297. /* add lcd driver into graphic driver */
  298. rtgui_graphic_driver_add(&_rtgui_lcd_driver);
  299. #endif
  300. return RT_EOK;
  301. }
  302. #include <finsh.h>
  303. void hline(rt_base_t x1, rt_base_t x2, rt_base_t y, rt_uint32_t pixel)
  304. {
  305. rt_hw_lcd_draw_hline(&pixel, x1, x2, y);
  306. }
  307. FINSH_FUNCTION_EXPORT(hline, draw a hline);
  308. void vline(int x, int y1, int y2, rt_uint32_t pixel)
  309. {
  310. rt_hw_lcd_draw_vline(&pixel, x, y1, y2);
  311. }
  312. FINSH_FUNCTION_EXPORT(vline, draw a vline);
  313. void cls()
  314. {
  315. ili9320_Clear(0xF800);
  316. }
  317. FINSH_FUNCTION_EXPORT(cls, clear screen);
  318. #endif