rda_lcdc.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. #ifndef __RDA_LCDC_H__
  2. #define __RDA_LCDC_H__
  3. #include "hwregs.h"
  4. #define FALSE (1==0)
  5. #define TRUE (1==1)
  6. typedef unsigned char uint8_t;
  7. typedef uint8_t u8;
  8. typedef unsigned int u32;
  9. typedef unsigned short u16;
  10. #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
  11. #define ALT_MUX_SELECT 0x11a09018
  12. #define RDA_LCDC_BASE 0x8807000
  13. #define ST7701_MIPI_DEFINE
  14. #ifndef bool
  15. #define bool char
  16. #endif
  17. /*LCDC reg offset start*/
  18. #define LCDC_COMMAND 0x0
  19. #define LCDC_STATUS 0x04
  20. #define LCDC_EOF_IRQ 0x08
  21. #define LCDC_EOF_IRQ_MASK 0xC
  22. #define LCD_CTRL 0x10
  23. #define LCD_TIMING 0x14
  24. #define LCDC_MEM_ADDRESS 0x18
  25. #define LCD_STRIDE_OFFSET 0x1C
  26. #define LCDC_SINGLE_ACCESS 0x20
  27. #define LCDC_SPILCD_CONFIG 0x24
  28. #define LCDC_SPILCD_RD 0x28
  29. #define LCDC_DCT_SHIFT_UV_REG1 0x2C
  30. #define DPI_CONFIG 0x30
  31. #define DPI_FRAME0_ADDR 0x34
  32. #define DPI_FRAME0_CON 0x38
  33. #define DPI_FRAME1_ADRR 0x3C
  34. #define DPI_FRAME1_CON 0x40
  35. #define DPI_FRAME2_ADRR 0x44
  36. #define DPI_FRAME2_CON 0x48
  37. #define DPI_SIZE 0x4C
  38. #define DPI_FIFO_CTRL 0x50
  39. #define DPI_THROT 0x54
  40. #define DPI_POL 0x58
  41. #define DPI_TIME0 0x5C
  42. #define DPI_TIME1 0x60
  43. #define DPI_TIME2 0x64
  44. #define DPI_TIME3 0x68
  45. #define DPI_STATUS 0x6C
  46. #define LCDC_DITHER_CTRL 0x70
  47. #define LCDC_DITHER_MATRIX0_0 0x74
  48. #define LCDC_DITHER_MATRIX0_1 0x78
  49. #define LCDC_DITHER_MATRIX1 0x7C
  50. #define TECON 0x80
  51. #define TECON2 0x84
  52. #define DSI_REG_OFFSET 0x400
  53. /* rgb order */
  54. #define RGB_ORDER_RGB (0<<3)
  55. #define RGB_ORDER_BGR (1<<3)
  56. /* pixel format */
  57. #define RGB_PIX_FMT_RGB565 (0<<4)
  58. #define RGB_PIX_FMT_RGB888 (1<<4)
  59. #define RGB_PIX_FMT_XRGB888 (2<<4)
  60. #define RGB_PIX_FMT_RGBX888 (3<<4)
  61. #define MIPI_DSI_ENABLE (1<<9)
  62. #define MIPI_DSI_DISABLE (0<<9)
  63. //DPI_CONFIG
  64. #define LCDC_REG_PEND_REQ(n) (((n)&31)<<21)
  65. #define LCDC_MIPI_CMD_SEL (1<<20)
  66. #define LCDC_REG_EMPTY_CTRL(n) (((n)&3)<<14)
  67. #define LCDC_R_RGB_FORMAT(n) (((n)&3)<<12)
  68. #define LCDC_R_DSI_ENABLE (1<<9)
  69. #define LCDC_R_OUTOFF_DATA (1<<8)
  70. #define LCDC_R_OUTOFF_CLK (1<<7)
  71. #define LCDC_R_OUTOFF_ALL (1<<6)
  72. #define LCDC_R_PIX_FMT(n) (((n)&3)<<4)
  73. #define LCDC_R_RGB_ORDER (1<<3)
  74. #define LCDC_R_FRAME2_ENABLE (1<<2)
  75. #define LCDC_R_FRAME1_ENABLE (1<<1)
  76. #define LCDC_R_RGB_ENABLE (1<<0)
  77. #define MIPI_CMD_SEL_CMD (1<<20)
  78. #define REG_PEND_REQ(n) (((n)&0x1F)<<21)
  79. #define DPI_FRAME_LINE_STEP(n) (((n)&0x1FFF)<<16)
  80. #define DPI_FRAME_VALID (1<<0)
  81. //dpi size
  82. #define VERTICAL_PIX_NUM(n) (((n)&0x7FF)<<16)
  83. #define HORIZONTAL_PIX_NUM(n) (((n)&0x7FF)<<0)
  84. //dct_shift_uv_reg1
  85. #define DCT_SHIFT_UV_ENABLE (1<<30)
  86. #define LCDC_RGB_WAIT (1<<30)
  87. /*dpi_fifo_ctrl*/
  88. #define DPI_DATA_FIFO_LOWTHRES(n) (((n)&0x3FF)<<16)
  89. #define DPI_DATA_FIFO_RST_AUTO (1<<1)
  90. #define DPI_DATA_FIFO_RST (1<<0)
  91. #define MIPI_DSI_LANE(n) (((n)&0x3)<<0)
  92. //gd_eof_irq
  93. #define LCDC_EOF_CAUSE (1 << 0)
  94. #define LCDC_VSYNC_RISE (1 << 2)
  95. #define LCDC_VSYNC_FALL (1 << 3)
  96. #define LCDC_DPI_OVERFLOW (1 << 4)
  97. #define LCDC_DPI_FRAMEOVER (1 << 5)
  98. #define LCDC_MIPI_INT (1 << 6)
  99. #define LCDC_EOF_STATUS (1 << 16)
  100. #define LCDC_IRQ_CLEAR_ALL (~0)
  101. //gd_eof_irq_mask
  102. #define LCDC_EOF_MASK (1<<0)
  103. #define LCDC_VSYNC_RISE_MASK (1<<1)
  104. #define LCDC_VSYNC_FALL_MASK (1<<2)
  105. #define LCDC_DPI_OVERFLOW_MASK (1<<3)
  106. #define LCDC_DPI_FRAMEOVER_MAS (1<<4)
  107. #define LCDC_MIPI_INT_MASK (1<<5)
  108. #define LCDC_IRQ_MASK_ALL (0x3f)
  109. /*dsi irq status*/
  110. #define DSI_TX_END_FLAG (1 << 0)
  111. #define DSI_RX_END_FLAG (1 << 1)
  112. #define DSI_CMD_Q_END_FLAG (1 << 5)
  113. /* lcd mode */
  114. #define LCD_DSI_MODE (0x1)
  115. //DPI_STATUS
  116. #define LCDC_CURRENT_FRAME_SHIFT (4)
  117. #define LCDC_CURRENT_FRAME(n) (((n)&3)<<4)
  118. #define LCDC_FRAME_RUNING (1<<3)
  119. #define LCDC_FRAME2_OVER (1<<2)
  120. #define LCDC_FRAME1_OVER (1<<1)
  121. #define LCDC_FRAME0_OVER (1<<0)
  122. //DPI_FRAM0_CON
  123. typedef union {
  124. REG32 v;
  125. struct {
  126. REG32 r_frame0_valid : 1; // [0]
  127. REG32 __15_1 : 15;
  128. REG32 r_frame0_line_step : 13; // [28:16]
  129. REG32 __31_29 : 3;
  130. } b;
  131. } REG_LCDC_DPI_FRAM0_CON_T;
  132. //DPI_FRAM1_CON
  133. typedef union {
  134. REG32 v;
  135. struct {
  136. REG32 r_frame1_valid : 1; // [0]
  137. REG32 __15_1 : 15;
  138. REG32 r_frame1_line_step : 13; // [28:16]
  139. REG32 __31_29 : 3;
  140. } b;
  141. } REG_LCDC_DPI_FRAM1_CON_T;
  142. enum rda_lcd_interface {
  143. LCD_IF_DBI = 0, // 8080
  144. LCD_IF_DPI = 1, // RGB
  145. LCD_IF_DSI = 2 // MIPI
  146. };
  147. struct dsi_timing {
  148. u32 off;
  149. u32 value;
  150. };
  151. struct rda_dsi_phy_ctrl {
  152. u32 pll[6];
  153. struct dsi_timing video_timing[13];
  154. struct dsi_timing cmd_timing[8];
  155. };
  156. struct mipi_panel_info {
  157. u8 data_lane;
  158. u8 mipi_mode;
  159. u8 pixel_format;
  160. u8 dsi_format;
  161. u8 trans_mode;
  162. u8 rgb_order;
  163. bool bllp_enable;
  164. u32 h_sync_active;
  165. u32 h_back_porch;
  166. u32 h_front_porch;
  167. u32 v_sync_active;
  168. u32 v_back_porch;
  169. u32 v_front_porch;
  170. u8 frame_rate;
  171. u8 te_sel;
  172. u32 dsi_pclk_rate;
  173. const struct rda_dsi_phy_ctrl *dsi_phy_db;
  174. };
  175. struct lcd_panel_info {
  176. char name[32];
  177. u16 width;
  178. u16 height;
  179. u16 bpp;
  180. u16 lcd_interface;
  181. u32 lcd_base;
  182. u32 lcd_base1;
  183. bool use_pwm;
  184. int reset_gpio;
  185. struct mipi_panel_info mipi_pinfo;
  186. void (*open)(void);
  187. bool (*match_id)(void);
  188. };
  189. //#define LCDC_OUTL(addr, data) do {*(volatile u32*)(addr) = (data);flush_dcache_range((addr), (addr) + sizeof(u32));} while(0)
  190. #define LCDC_OUTL(addr, data) do {*(volatile u32*)(addr) = (data);} while(0)
  191. #define LCDC_INL(addr) *(volatile u32*)(addr)
  192. #define LCDC_OR_WITH_REG(addr, data) \
  193. do{ \
  194. LCDC_OUTL(addr,data | LCDC_INL(addr)); \
  195. }while(0);
  196. #define LCDC_AND_WITH_REG(addr, data) \
  197. do{ \
  198. LCDC_OUTL(addr,data & LCDC_INL(addr)); \
  199. }while(0);
  200. void _lcdDelayMs(int ms_delay);
  201. void rda_write_dsi_reg(u32 offset, u32 value);
  202. u32 rda_read_dsi_reg(u32 offset);
  203. void rda_write_dsi_reg1(u32 offset, u32 value);
  204. u32 rda_read_dsi_reg1(u32 offset);
  205. void set_lcdc_for_cmd(u32 addr, int group_num);
  206. void set_lcdc_for_video(const struct lcd_panel_info *lcd);
  207. void rda_lcdc_set(void);
  208. int rda_lcdc_irq_status(void);
  209. void reset_lcdc_fifo(void);
  210. void rda_lcdc_reset(void);
  211. void lcdc_irq_mask_set(u32 mask);
  212. void lcdc_irq_mask_clear(u32 mask);
  213. void rda_lcdc_pre_enable(const struct lcd_panel_info *lcd, int on);
  214. void enable_lcdc_clk(int on);
  215. #endif /*__RDA_LCDC_H*/