Mercurial > ~darius > hgwebdir.cgi > stm32temp
annotate lcd.c @ 89:fc21fb5b171b default tip
Make error message more useful
author | Daniel O'Connor <darius@dons.net.au> |
---|---|
date | Fri, 13 Mar 2015 11:39:59 +1030 |
parents | 662e7f01c991 |
children |
rev | line source |
---|---|
3
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
1 /* |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
2 * Example code (I think) |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
3 * ~/projects/STM32Strive/奋斗STM32开发板例程/奋斗STM32开发板例程/奋斗STM32开发板MINI/STM32奋斗版ucOS II V2.86 uCGUI 3.9 DEMO-V2/STM32奋斗版ucOS II V2.86 uCGUI 3.9 DEMO |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
4 * |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
5 * Schematics |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
6 * Main board docs/Strive\ Mini\ STM32\ Schematic.pdf |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
7 * LCD board docs/Strive Mini LCD STM32 Schematic.pdf |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
8 * MCU reference manual docs/CD00171190.pdf |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
9 * MCU Data sheet (pinout) docs/CD00191185.pdf |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
10 * LCD controller data sheet docs/ili9325-v0.35.pdf |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
11 * LCD controller app notes docs/ILI9325AN_V0.22.pdf |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
12 * XXX: not sure what panel is connected |
3
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
13 * |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
14 */ |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
15 /* LCD board MCU |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
16 1 VCC |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
17 2 TC_SCK PA5/SPI1_SCK |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
18 3 GND |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
19 4 TC_CS PB7/SPI1_CS3 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
20 5 RST PE1 FSMC_NBL1? (unlikely) |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
21 6 TC_DIN PA7/SPI1_MOSI |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
22 7 nOE PD4/FSMC_nOE |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
23 8 TC_DOUT PA6/SPI1_MISO |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
24 9 nWR PD5/FSMC_nWE |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
25 10 TC_INT PB6 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
26 11 CS PD7/FSMC_NE1/FSMC_NCE2 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
27 12 NC |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
28 13 RS PD11/FSMC_A16 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
29 14 NC |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
30 15 D7 PE10/FSMC_D7 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
31 16 NC |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
32 17 D6 PE9/FSMC_D6 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
33 18 NC |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
34 19 D3 PD1/FSMC_D3 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
35 20 D13 PD8/FSMC_D13 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
36 21 D5 PE8/FSMC_D5 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
37 22 D12 PE15/FSMC_D12 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
38 23 D4 PE7/FSMC_D4 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
39 24 GND |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
40 25 NC |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
41 26 D11 PE14/FSMC_D11 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
42 27 D2 PD0/FSMC_D2 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
43 28 D10 PE13/FSMC_D10 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
44 29 D1 PD15/FSMC_D1 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
45 30 D9 PE12/FSMC_D9 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
46 31 D0 PD14/FSMC_D0 |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
47 32 D14 PD9/FSMC_D14 |
3
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
48 33 NC |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
49 34 D8 PE11/FSMC_D8 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
50 35 NC |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
51 36 NC |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
52 37 NC |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
53 38 LCD_PWM PD13/TIM4_CH2 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
54 39 NC |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
55 40 D15 PD10/FSMC_D15 |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
56 */ |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
57 |
4
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
58 #include <stdio.h> |
8
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
59 #include <stdint.h> |
9 | 60 #include <stdlib.h> |
61 #include <ctype.h> | |
3
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
62 #include "stm32f10x.h" |
74e9b3baac1e
Jumbo commit to make things work.
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
63 #include "lcd.h" |
8
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
64 #include "delay.h" |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
65 |
4
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
66 #define Bank1_LCD_C ((uint32_t)0x60000000) /* Register Address */ |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
67 #define Bank1_LCD_D ((uint32_t)0x60020000) /* Data Address */ |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
68 |
9 | 69 #define COLINCVAL 7968 /* 255.0 / 320.0 * 10000 */ |
70 | |
71 void colinc(uint16_t *mag, uint16_t *err, uint16_t amt, uint16_t max) { | |
72 *err += amt; | |
73 if (*err > max) { | |
74 (*mag) = (*mag) + 1; | |
75 (*err) = (*err) - max; | |
76 } | |
77 } | |
78 | |
4
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
79 void |
9 | 80 lcd_writereg(uint16_t index, uint16_t val) { |
4
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
81 *(__IO uint16_t *)(Bank1_LCD_C) = index; |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
82 *(__IO uint16_t *)(Bank1_LCD_D) = val; |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
83 } |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
84 |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
85 uint16_t |
9 | 86 lcd_readreg(uint16_t index) { |
4
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
87 *(__IO uint16_t *)(Bank1_LCD_C) = index; |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
88 return(*(__IO uint16_t *)(Bank1_LCD_D)); |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
89 } |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
90 |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
91 uint16_t |
9 | 92 lcd_readdata(int first) { |
4
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
93 uint16_t a = 0; |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
94 if (first) |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
95 a = *(__IO uint16_t *) (Bank1_LCD_D); /* Dummy */ |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
96 a = *(__IO uint16_t *) (Bank1_LCD_D); /* Read */ |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
97 |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
98 return (a); |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
99 } |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
100 |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
101 void |
9 | 102 lcd_startgram(uint16_t x, uint16_t y) { |
103 lcd_writereg(0x20, x); | |
104 lcd_writereg(0x21, y); | |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
105 *(__IO uint16_t *)(Bank1_LCD_C) = 0x22; /* Start GRAM write */ |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
106 } |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
107 |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
108 void |
9 | 109 lcd_writedata(uint16_t val) { |
4
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
110 *(__IO uint16_t *)(Bank1_LCD_D) = val; |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
111 } |
2c87e30c982d
Add LCD init, touch screen writing etc..
Daniel O'Connor <darius@dons.net.au>
parents:
3
diff
changeset
|
112 |
5
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
113 void |
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
114 lcd_setpwm(uint16_t val) { |
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
115 TIM_OCInitTypeDef TIM_OCInitStructure; |
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
116 |
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
117 /* Channel 2 configuration in PWM mode */ |
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
118 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; |
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
119 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; |
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
120 TIM_OCInitStructure.TIM_Pulse = val; |
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
121 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; |
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
122 |
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
123 TIM_OC2Init(TIM4, &TIM_OCInitStructure); |
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
124 |
efa2c22266e3
PWM control LED backlight.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
125 } |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
126 |
8
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
127 void |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
128 lcd_init(void) { |
9 | 129 uint16_t id, x, y; |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
130 |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
131 /* Initialise LCD panel */ |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
132 |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
133 /* Pull reset pin low */ |
64
ff29436c0224
- Make sure the line is high before pulling low for reset.
Daniel O'Connor <darius@dons.net.au>
parents:
62
diff
changeset
|
134 GPIO_SetBits(GPIOE, GPIO_Pin_1); |
62
bb52e6dad784
The LCD works better when the GPIO clocks are enabled before frobbing them.
Daniel O'Connor <darius@dons.net.au>
parents:
9
diff
changeset
|
135 delay(10); |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
136 GPIO_ResetBits(GPIOE, GPIO_Pin_1); |
64
ff29436c0224
- Make sure the line is high before pulling low for reset.
Daniel O'Connor <darius@dons.net.au>
parents:
62
diff
changeset
|
137 delay(2000); |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
138 GPIO_SetBits(GPIOE, GPIO_Pin_1); |
62
bb52e6dad784
The LCD works better when the GPIO clocks are enabled before frobbing them.
Daniel O'Connor <darius@dons.net.au>
parents:
9
diff
changeset
|
139 delay(500); |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
140 |
9 | 141 id = lcd_readreg(0x00); |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
142 if (id != 0x9325) { |
65 | 143 printf("LCD ID doesn't match, expected 0x9325 got 0x%x\n", id); |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
144 return; |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
145 } |
65 | 146 printf("LCD ID matches\n"); |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
147 |
9 | 148 lcd_writereg(0x00e3, 0x3008); /* Set internal timing (not documented) */ |
149 lcd_writereg(0x00e7, 0x0012); /* Set internal timing (not documented) */ | |
150 lcd_writereg(0x00ef, 0x1231); /* Set internal timing (not documented) */ | |
151 lcd_writereg(0x0000, 0x0001); /* Start Oscillation */ | |
64
ff29436c0224
- Make sure the line is high before pulling low for reset.
Daniel O'Connor <darius@dons.net.au>
parents:
62
diff
changeset
|
152 delay(50000); |
9 | 153 lcd_writereg(0x0001, 0x0100); /* set SS (S720 -> S1) */ |
154 lcd_writereg(0x0002, 0x0700); /* set line inversion (B/C + EOR) */ | |
155 lcd_writereg(0x0004, 0x0000); /* no resizing */ | |
156 lcd_writereg(0x0008, 0x0202); /* set the back porch and front porch (2 lines each) */ | |
157 lcd_writereg(0x0009, 0x0000); /* set non-display area refresh cycle ISC[3:0] */ | |
158 lcd_writereg(0x000a, 0x0000); /* FMARK function */ | |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
159 |
9 | 160 lcd_writereg(0x000c, 0x0000); /* RGB ctl - Internal clock, 18bit interface */ |
161 lcd_writereg(0x000d, 0x0000); /* Frame marker Position */ | |
162 lcd_writereg(0x000f, 0x0000); /* RGB interface polarity */ | |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
163 |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
164 /* Power On sequence */ |
9 | 165 lcd_writereg(0x0010, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ |
166 lcd_writereg(0x0011, 0x0007); /* DC1[2:0], DC0[2:0], VC[2:0] */ | |
167 lcd_writereg(0x0012, 0x0000); /* VREG1OUT voltage */ | |
168 lcd_writereg(0x0013, 0x0000); /* VDV[4:0] for VCOM amplitude */ | |
64
ff29436c0224
- Make sure the line is high before pulling low for reset.
Daniel O'Connor <darius@dons.net.au>
parents:
62
diff
changeset
|
169 delay(200000); /* Dis-charge capacitor power voltage */ |
9 | 170 lcd_writereg(0x0010, 0x1690); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ |
171 lcd_writereg(0x0011, 0x0227); /* R11h = 0x0221 at VCI = 3.3V, DC1[2:0], DC0[2:0], VC[2:0] */ | |
64
ff29436c0224
- Make sure the line is high before pulling low for reset.
Daniel O'Connor <darius@dons.net.au>
parents:
62
diff
changeset
|
172 delay(50000); /* delay 50ms */ |
9 | 173 lcd_writereg(0x0012, 0x001c); /* External reference voltage= Vci; */ |
64
ff29436c0224
- Make sure the line is high before pulling low for reset.
Daniel O'Connor <darius@dons.net.au>
parents:
62
diff
changeset
|
174 delay(50000); /* delay 50ms */ |
9 | 175 lcd_writereg(0x0013, 0x1800); /* R13 = 1200 when R12 = 009D; VDV[4:0] for VCOM amplitude */ |
176 lcd_writereg(0x0029, 0x001c); /* R29 = 000C when R12 = 009D; VCM[5:0] for VCOMH */ | |
177 lcd_writereg(0x002b, 0x000d); /* Frame Rate = 91Hz */ | |
64
ff29436c0224
- Make sure the line is high before pulling low for reset.
Daniel O'Connor <darius@dons.net.au>
parents:
62
diff
changeset
|
178 delay(50000); /* delay 50ms */ |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
179 |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
180 /* Set GRAM area */ |
9 | 181 lcd_writereg(0x0050, 0x0000); /* Horizontal GRAM Start Address */ |
182 lcd_writereg(0x0051, 0x00ef); /* Horizontal GRAM End Address */ | |
183 lcd_writereg(0x0052, 0x0000); /* Vertical GRAM Start Address */ | |
184 lcd_writereg(0x0053, 0x013f); /* Vertical GRAM Start Address */ | |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
185 |
9 | 186 lcd_writereg(0x0060, 0xa700); /* Gate Scan Line, drive G320 -> G1 */ |
187 lcd_writereg(0x0061, 0x0003); /* VLE & REV */ | |
188 lcd_writereg(0x006a, 0x0000); /* set scrolling line */ | |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
189 |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
190 /* Partial Display Control */ |
9 | 191 lcd_writereg(0x0080, 0x0000); /* Image 1 */ |
192 lcd_writereg(0x0081, 0x0000); | |
193 lcd_writereg(0x0082, 0x0000); | |
194 lcd_writereg(0x0083, 0x0000); /* Image 2 */ | |
195 lcd_writereg(0x0084, 0x0000); | |
196 lcd_writereg(0x0085, 0x0000); | |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
197 |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
198 /* Panel Control */ |
9 | 199 lcd_writereg(0x0090, 0x0010); |
200 lcd_writereg(0x0092, 0x0000); | |
201 lcd_writereg(0x0093, 0x0003); | |
202 lcd_writereg(0x0095, 0x0110); | |
203 lcd_writereg(0x0097, 0x0000); /* Undocumented */ | |
204 lcd_writereg(0x0098, 0x0000); /* Undocumented */ | |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
205 |
9 | 206 lcd_writereg(0x0007, 0x0133); /* Display on, 262k colour mode (vs 8) */ |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
207 |
9 | 208 lcd_writereg(0x0003, 0x1030); /* set GRAM write direction and enable BGR, 64K colours, 1 transfers/pixel. */ |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
209 |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
210 /* Adjust the Gamma Curve */ |
9 | 211 lcd_writereg(0x0030, 0x0006); |
212 lcd_writereg(0x0031, 0x0101); | |
213 lcd_writereg(0x0032, 0x0003); | |
214 lcd_writereg(0x0035, 0x0106); | |
215 lcd_writereg(0x0036, 0x0b02); | |
216 lcd_writereg(0x0037, 0x0302); | |
217 lcd_writereg(0x0038, 0x0707); | |
218 lcd_writereg(0x0039, 0x0007); | |
219 lcd_writereg(0x003c, 0x0600); | |
220 lcd_writereg(0x003d, 0x020b); | |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
221 |
65 | 222 fputs("Filling\n", stdout); |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
223 /* Fill panel */ |
9 | 224 lcd_startgram(0, 0); |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
225 |
9 | 226 for (y = 0; y < 320; y++) |
227 for (x = 0; x < 240; x++) | |
228 lcd_writedata(LCD_BLACK); | |
8
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
229 } |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
230 |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
231 void |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
232 lcd_pixel(uint16_t x, uint16_t y, uint16_t colour) { |
9 | 233 if (x > LCD_WIDTH || y > LCD_HEIGHT) |
8
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
234 return; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
235 |
9 | 236 /* Rotate for landscape */ |
237 lcd_startgram(y, x); | |
238 lcd_writedata(colour); | |
7
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
239 } |
9404b9869c27
Make the LCD panel work (timings, GPIOE clock needs to be on, etc)
Daniel O'Connor <darius@dons.net.au>
parents:
5
diff
changeset
|
240 |
8
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
241 /* |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
242 * Draw a circle |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
243 * From http://en.wikipedia.org/wiki/Midpoint_circle_algorithm |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
244 */ |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
245 void |
9 | 246 lcd_circle(uint16_t x0, uint16_t y0, uint16_t radius, uint8_t fill, uint16_t colour) { |
8
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
247 int16_t f; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
248 uint16_t ddF_x, ddF_y, x, y; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
249 |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
250 f = 1 - radius; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
251 ddF_x = 1; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
252 ddF_y = -2 * radius; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
253 x = 0; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
254 y = radius; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
255 |
9 | 256 |
257 if (fill) { | |
258 lcd_line(x0, y0 + radius, x0, y0 - radius, colour); | |
259 lcd_line(x0 + radius, y0, x0 - radius, y0, colour); | |
260 } else { | |
261 lcd_pixel(x0, y0 + radius, colour); | |
262 lcd_pixel(x0, y0 - radius, colour); | |
263 lcd_pixel(x0 + radius, y0, colour); | |
264 lcd_pixel(x0 - radius, y0, colour); | |
265 } | |
266 | |
8
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
267 while(x < y) { |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
268 if(f >= 0) { |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
269 y--; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
270 ddF_y += 2; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
271 f += ddF_y; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
272 } |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
273 x++; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
274 ddF_x += 2; |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
275 f += ddF_x; |
9 | 276 if (fill) { |
277 lcd_line(x0 + x, y0 + y, x0 - x, y0 + y, colour); | |
278 lcd_line(x0 + x, y0 - y, x0 - x, y0 - y, colour); | |
279 lcd_line(x0 + y, y0 + x, x0 - y, y0 + x, colour); | |
280 lcd_line(x0 + y, y0 - x, x0 - y, y0 - x, colour); | |
281 } else { | |
282 lcd_pixel(x0 + x, y0 + y, colour); | |
283 lcd_pixel(x0 - x, y0 + y, colour); | |
284 lcd_pixel(x0 + x, y0 - y, colour); | |
285 lcd_pixel(x0 - x, y0 - y, colour); | |
286 lcd_pixel(x0 + y, y0 + x, colour); | |
287 lcd_pixel(x0 - y, y0 + x, colour); | |
288 lcd_pixel(x0 + y, y0 - x, colour); | |
289 lcd_pixel(x0 - y, y0 - x, colour); | |
290 } | |
8
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
291 } |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
292 } |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
293 |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
294 |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
295 /* |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
296 * Draw a line |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
297 * From http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
298 */ |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
299 void |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
300 lcd_line(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t colour) { |
9 | 301 uint16_t dx, dy; |
302 int16_t sx, sy, err, e2; | |
303 | |
304 dx = abs(x1 - x0); | |
305 dy = abs(y1 - y0); | |
8
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
306 |
9 | 307 if (x0 < x1) |
308 sx = 1; | |
309 else | |
310 sx = -1; | |
311 | |
312 if (y0 < y1) | |
313 sy = 1; | |
314 else | |
315 sy = -1; | |
8
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
316 |
9 | 317 err = dx - dy; |
318 | |
319 while (1) { | |
320 | |
321 lcd_pixel(x0, y0, colour); | |
322 | |
323 if (x0 == x1 && y0 == y1) | |
324 break; | |
325 | |
326 e2 = 2 * err; | |
327 | |
328 if (e2 > -dy) { | |
329 err = err - dy; | |
330 x0 = x0 + sx; | |
331 } | |
332 | |
333 if (e2 < dx) { | |
334 err = err + dx; | |
335 y0 = y0 + sy; | |
8
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
336 } |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
337 } |
58d76cf522ff
Split out code into separate files.
Daniel O'Connor <darius@dons.net.au>
parents:
7
diff
changeset
|
338 } |
9 | 339 |
340 static void | |
341 _lcd_ellipsedraw(uint16_t xc, uint16_t yc, uint16_t x, uint16_t y, uint8_t fill, uint16_t colour) { | |
342 if (fill) { | |
343 lcd_line(xc + x, yc + y, xc - x, yc + y, colour); | |
344 lcd_line(xc - x, yc - y, xc + x, yc - y, colour); | |
345 } else { | |
346 lcd_pixel(xc + x, yc + y, colour); /* 1st quadrant */ | |
347 lcd_pixel(xc - x, yc + y, colour); /* 2nd quadrant */ | |
348 lcd_pixel(xc - x, yc - y, colour); /* 3rd quadrant */ | |
349 lcd_pixel(xc + x, yc - y, colour); /* 4th quadrant */ | |
350 } | |
351 } | |
352 | |
353 /* Draw an ellipse, from | |
354 * http://rooparam.blogspot.com.au/2009/09/midpoint-ellipse-algorithm.html | |
355 */ | |
356 void lcd_ellipse(int xc, int yc, int rx, int ry, uint8_t fill, uint16_t colour) { | |
357 long long int rx_2 = rx * rx, ry_2 = ry * ry; | |
358 long long int p = ry_2 - rx_2 * ry + (ry_2 >> 2); | |
359 int x = 0, y = ry; | |
360 long long int two_ry_2_x = 0, two_rx_2_y = (rx_2 << 1) * y; | |
361 | |
362 _lcd_ellipsedraw(xc, yc, x, y, fill, colour); | |
363 | |
364 while (two_rx_2_y >= two_ry_2_x) { | |
365 x++; | |
366 two_ry_2_x += ry_2 << 1; | |
367 | |
368 p += two_ry_2_x + ry_2; | |
369 | |
370 if (p >= 0){ | |
371 y--; | |
372 two_rx_2_y -= rx_2 << 1; | |
373 | |
374 p -= two_rx_2_y; | |
375 } | |
376 _lcd_ellipsedraw(xc, yc, x, y, fill, colour); | |
377 } | |
378 | |
379 p = (long long int)(ry_2 * (x + 1 / 2.0) * (x + 1 / 2.0) + rx_2 * (y - 1) * (y - 1) - rx_2 * ry_2); | |
380 while (y >= 0) { | |
381 p += rx_2; | |
382 y--; | |
383 two_rx_2_y -= rx_2 << 1; | |
384 p -= two_rx_2_y; | |
385 | |
386 if (p <= 0) { | |
387 x++; | |
388 two_ry_2_x += ry_2 << 1; | |
389 p += two_ry_2_x; | |
390 } | |
391 _lcd_ellipsedraw(xc, yc, x, y, fill, colour); | |
392 } | |
393 } | |
394 | |
395 void lcd_stripes(void) { | |
396 uint16_t x, y, mag, err; | |
397 | |
398 lcd_startgram(0, 0); | |
399 | |
400 mag = err = 0; | |
401 for (y = 0; y < 320; y++) { | |
402 for (x = 0; x < 240; x++) { | |
403 if (((x / 80) % 3) == 0) { | |
404 lcd_writedata(RGB24_565(mag, 0, 0)); | |
405 } else if (((x / 80) % 3) == 1) { | |
406 lcd_writedata(RGB24_565(0, mag, 0)); | |
407 } else { | |
408 lcd_writedata(RGB24_565(0, 0, mag)); | |
409 } | |
410 } | |
411 colinc(&mag, &err, COLINCVAL, 10000); | |
412 } | |
413 } | |
414 uint16_t | |
415 lcd_parsecol(char c) { | |
416 c = toupper(c); | |
417 if (c == 'R') | |
418 return(LCD_RED); | |
419 else if (c == 'G') | |
420 return(LCD_GREEN); | |
421 else if (c == 'B') | |
422 return(LCD_BLUE); | |
423 else if (c == 'L') | |
424 return(LCD_BLACK); | |
425 else | |
426 return(LCD_WHITE); | |
427 | |
428 } | |
429 |