OpenCores
URL https://opencores.org/ocsvn/openmsp430/openmsp430/trunk

Subversion Repositories openmsp430

[/] [openmsp430/] [trunk/] [fpga/] [altera_de0_nano_soc/] [software/] [libs/] [gfx/] [gfx_controller.c] - Blame information for rev 221

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 221 olivier.gi
#include "gfx_controller.h"
2
#include "timerA.h"
3
 
4
//----------------------------------------------------------
5
// Initialize Graphic controller
6
//----------------------------------------------------------
7
void init_gfx_ctrl (uint16_t gfx_mode, uint16_t refresh_rate) {
8
 
9
  // Local variable definition
10
  uint16_t kb_idx, b_idx;
11
 
12
  // Initialize frame buffer
13
#ifndef VERILOG_SIMULATION
14
  VID_RAM0_ADDR  = PIX_ADDR(0, 0);
15
  for( kb_idx = 0; kb_idx < FRAME_MEMORY_KB_SIZE/2; kb_idx = kb_idx + 1 ) {
16
    for( b_idx = 0; b_idx < 1024; b_idx = b_idx + 1 ) {
17
      VID_RAM0_DATA = 0x0000;
18
    }
19
  }
20
#endif
21
  VID_RAM0_ADDR     = PIX_ADDR(0, 0);
22
 
23
  // Configure Video mode
24
  GFX_CTRL          = gfx_mode | GFX_REFR_START_IRQ_DIS | GFX_REFR_DONE_IRQ_DIS | GFX_GPU_EN;
25
 
26
  // Configure Refresh Rate
27
  LT24_REFRESH_SYNC = LT24_REFR_SYNC | 0x0000;
28
  LT24_REFRESH      = refresh_rate;
29
 
30
  // Global configuration registers
31
  DISPLAY_WIDTH     = SCREEN_WIDTH;
32
  DISPLAY_HEIGHT    = SCREEN_HEIGHT;
33
  DISPLAY_SIZE      = (uint32_t)SCREEN_WIDTH * (uint32_t)SCREEN_HEIGHT;
34
 
35
#ifdef LT24_ROTATE
36
  DISPLAY_CFG       = DISPLAY_NO_X_SWAP | DISPLAY_NO_Y_SWAP | DISPLAY_NO_CL_SWAP;
37
#else
38
  DISPLAY_CFG       = DISPLAY_NO_X_SWAP | DISPLAY_NO_Y_SWAP | DISPLAY_CL_SWAP;
39
#endif
40
 
41
  // Initialize LT24 module
42
  init_lt24 (LT24_CLK_DIV2);
43
 
44
}
45
 
46
//----------------------------------------------------------
47
// Start Graphic controller
48
//----------------------------------------------------------
49
void start_gfx_ctrl (void) {
50
 
51
  start_lt24();
52
 
53
  LT24_REFRESH  = LT24_REFRESH | LT24_REFR_START;
54
 
55
}
56
 
57
//----------------------------------------------------------
58
// Initialize LT24 controller
59
//----------------------------------------------------------
60
void init_lt24 (uint16_t lt24_clk_div) {
61
 
62
  // Enable LCD, generate a reset and set LCD clock
63
  LT24_CFG       = 0x0000;
64
  ta_wait_no_lpm(WT_1MS);
65
  LT24_CFG       = LT24_ON | lt24_clk_div | LT24_RESET;
66
  ta_wait_no_lpm(WT_1MS);
67
  LT24_CFG       = LT24_ON | lt24_clk_div;
68
  ta_wait_no_lpm(WT_500MS+WT_20MS);
69
 
70
  // Set color mode to 16bits/pixel
71
  LT24_CMD       = 0x003A | LT24_CMD_HAS_PARAM;
72
  LT24_CMD_PARAM = 0x0055;
73
  while((LT24_STATUS & LT24_STATUS_WAIT_PARAM)==0);
74
  LT24_CMD       = 0x0000;
75
 
76
  // Define image rotation on the display
77
  // (MADCTL command: see pages 127 and 209 of the ILI9341 spec)
78
#ifdef LT24_ROTATE
79
  LT24_CMD       = 0x0036 | LT24_CMD_HAS_PARAM;
80
  LT24_CMD_PARAM = 0x0028;
81
  while((LT24_STATUS & LT24_STATUS_WAIT_PARAM)==0);
82
  LT24_CMD       = 0x0000;
83
#else
84
  LT24_CMD       = 0x0036 | LT24_CMD_HAS_PARAM;
85
  LT24_CMD_PARAM = 0x0008;
86
  while((LT24_STATUS & LT24_STATUS_WAIT_PARAM)==0);
87
  LT24_CMD       = 0x0000;
88
#endif
89
 
90
  // Send CASET
91
  LT24_CMD       = 0x002A | LT24_CMD_HAS_PARAM;
92
  LT24_CMD_PARAM = ( 0              & 0xFF00)>>8;   // CASET_SC[15:8]
93
  while((LT24_STATUS & LT24_STATUS_WAIT_PARAM)==0);
94
  LT24_CMD_PARAM = ( 0              & 0x00FF);      // CASET_SC[7:0]
95
  while((LT24_STATUS & LT24_STATUS_WAIT_PARAM)==0);
96
#ifdef LT24_ROTATE
97
  LT24_CMD_PARAM = ( SCREEN_WIDTH   & 0xFF00)>>8;   // CASET_EC[15:8]
98
#else
99
  LT24_CMD_PARAM = ( SCREEN_HEIGHT  & 0xFF00)>>8;   // CASET_EC[15:8]
100
#endif
101
  while((LT24_STATUS & LT24_STATUS_WAIT_PARAM)==0);
102
#ifdef LT24_ROTATE
103
  LT24_CMD_PARAM = ( SCREEN_WIDTH  & 0x00FF);      // CASET_EC[7:0]
104
#else
105
  LT24_CMD_PARAM = ( SCREEN_HEIGHT   & 0x00FF);      // CASET_EC[7:0]
106
#endif
107
  while((LT24_STATUS & LT24_STATUS_WAIT_PARAM)==0);
108
  LT24_CMD       = 0x0000;
109
 
110
  // Send PASET
111
  LT24_CMD       = 0x002B | LT24_CMD_HAS_PARAM;
112
  LT24_CMD_PARAM = ( 0              & 0xFF00)>>8;  // PASET_SC[15:8]
113
  while((LT24_STATUS & LT24_STATUS_WAIT_PARAM)==0);
114
  LT24_CMD_PARAM = ( 0              & 0x00FF);     // PASET_SC[7:0]
115
  while((LT24_STATUS & LT24_STATUS_WAIT_PARAM)==0);
116
#ifdef LT24_ROTATE
117
  LT24_CMD_PARAM = ( SCREEN_HEIGHT  & 0xFF00)>>8;  // PASET_EC[15:8]
118
#else
119
  LT24_CMD_PARAM = ( SCREEN_WIDTH  & 0xFF00)>>8;  // PASET_EC[15:8]
120
#endif
121
  while((LT24_STATUS & LT24_STATUS_WAIT_PARAM)==0);
122
#ifdef LT24_ROTATE
123
  LT24_CMD_PARAM = ( SCREEN_HEIGHT  & 0x00FF);     // PASET_EC[7:0]
124
#else
125
  LT24_CMD_PARAM = ( SCREEN_WIDTH   & 0x00FF);     // PASET_EC[7:0]
126
#endif
127
  while((LT24_STATUS & LT24_STATUS_WAIT_PARAM)==0);
128
  LT24_CMD       = 0x0000;
129
 
130
  // Initialize the LT24 display memory
131
#ifndef VERILOG_SIMULATION
132
  LT24_CMD_DFILL = 0x0000;
133
  while((LT24_STATUS & LT24_STATUS_DFILL_BUSY)!=0);
134
#endif
135
 
136
  // Display on
137
  LT24_CMD       = 0x0035 | LT24_CMD_NO_PARAM;
138
  LT24_CMD_PARAM = 0x0000;
139
 
140
  return;
141
}
142
 
143
//----------------------------------------------------------
144
// Start LT24 controller
145
//----------------------------------------------------------
146
void start_lt24(void) {
147
 
148
  // Display on
149
  LT24_CMD       = 0x0029 | LT24_CMD_NO_PARAM;
150
  LT24_CMD_PARAM = 0x0000;
151
  ta_wait_no_lpm(WT_10MS);
152
 
153
  // Go out of SLEEP
154
  LT24_CMD       = 0x0011 | LT24_CMD_NO_PARAM;
155
  LT24_CMD_PARAM = 0x0000;
156
  ta_wait_no_lpm(WT_100MS);
157
 
158
  return;
159
}
160
 
161
//----------------------------------------------------------
162
// Wait for the refresh to be done
163
//----------------------------------------------------------
164
void sync_screen_refresh_done(void) {
165
 
166
  // Clear IRQ flag
167
  GFX_IRQ |= GFX_IRQ_REFRESH_DONE;
168
 
169
  // Wait for flag to be set
170
  while((GFX_IRQ & GFX_IRQ_REFRESH_DONE)==0);
171
 
172
  return;
173
}
174
 
175
//----------------------------------------------------------
176
// Wait for the refresh to start
177
//----------------------------------------------------------
178
void sync_screen_refresh_start(void) {
179
 
180
  // Clear IRQ flag
181
  GFX_IRQ |= GFX_IRQ_REFRESH_START;
182
 
183
  // Wait for flag to be set
184
  while((GFX_IRQ & GFX_IRQ_REFRESH_START)==0);
185
 
186
  return;
187
}
188
 
189
//==========================================================
190
// GPU FUNCTIONS
191
//==========================================================
192
 
193
void gpu_fill (uint32_t addr, uint16_t width, uint16_t length, uint16_t color, uint16_t configuration) {
194
 
195
  while((GPU_STAT & GPU_STAT_FIFO_CNT_EMPTY)<7);
196
  GPU_CMD   = GPU_REC_WIDTH  | width;
197
  GPU_CMD   = GPU_REC_HEIGHT | length;
198
  GPU_CMD   = GPU_DST_PX_ADDR; GPU_CMD32 = addr;
199
  GPU_CMD   = GPU_EXEC_FILL  | configuration ;
200
  GPU_CMD   = color;
201
}
202
 
203
 
204
void gpu_copy (uint32_t src_addr, uint32_t dst_addr, uint16_t width, uint16_t length, uint16_t configuration) {
205
 
206
  while((GPU_STAT & GPU_STAT_FIFO_CNT_EMPTY)<9);
207
  GPU_CMD  = GPU_REC_WIDTH  | width;
208
  GPU_CMD  = GPU_REC_HEIGHT | length;
209
  GPU_CMD  = GPU_DST_PX_ADDR; GPU_CMD32 = dst_addr;
210
  GPU_CMD  = GPU_SRC_PX_ADDR; GPU_CMD32 = src_addr;
211
  GPU_CMD  = GPU_EXEC_COPY  | configuration ;
212
}
213
 
214
 
215
void gpu_copy_transparent (uint32_t src_addr, uint32_t dst_addr, uint16_t width, uint16_t length, uint16_t trans_color, uint16_t configuration) {
216
 
217
  while((GPU_STAT & GPU_STAT_FIFO_CNT_EMPTY)<9);
218
  GPU_CMD  = GPU_REC_WIDTH  | width;
219
  GPU_CMD  = GPU_REC_HEIGHT | length;
220
  GPU_CMD  = GPU_SET_TRANS;   GPU_CMD   = trans_color;
221
  GPU_CMD  = GPU_DST_PX_ADDR; GPU_CMD32 = dst_addr;
222
  GPU_CMD  = GPU_SRC_PX_ADDR; GPU_CMD32 = src_addr;
223
  GPU_CMD  = GPU_EXEC_COPY_TRANS  | configuration ;
224
}
225
 
226
inline void gpu_wait_done (void) {
227
    while((GPU_STAT & GPU_STAT_BUSY)!=0);
228
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.