Skip to content

Commit 3709b6c

Browse files
committed
lpc1788 added support for the lcd controller
1 parent 5af1e65 commit 3709b6c

2 files changed

Lines changed: 471 additions & 0 deletions

File tree

targets/chip/lpc1788/io/lcd.hpp

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
#ifndef KLIB_LPC1788_LCD_HPP
2+
#define KLIB_LPC1788_LCD_HPP
3+
4+
#include <klib/io/port.hpp>
5+
#include <klib/io/peripheral.hpp>
6+
7+
#include <targets/core/nxp/lpc178x/lcd.hpp>
8+
9+
#include "pins.hpp"
10+
11+
namespace klib::lpc1788::io::periph::detail::lcd {
12+
enum class mode {
13+
power,
14+
clock,
15+
output_enable,
16+
vsync,
17+
line_end,
18+
hsync,
19+
data,
20+
clock_in,
21+
};
22+
23+
template <typename Pin, mode Type, typename Periph>
24+
struct lcd {
25+
// pin of the peripheral
26+
using pin = Pin;
27+
28+
// type of the pin
29+
constexpr static mode type = Type;
30+
31+
// alternate function
32+
using periph = Periph;
33+
};
34+
}
35+
36+
namespace klib::lpc1788::io::periph::lqfp_208 {
37+
template <
38+
typename Vd0 = pins::package::lqfp_208::p168,
39+
typename Vd1 = pins::package::lqfp_208::p166,
40+
typename Vd2 = pins::package::lqfp_208::p170,
41+
typename Vd3 = pins::package::lqfp_208::p176,
42+
typename Vd4 = pins::package::lqfp_208::p138,
43+
typename Vd5 = pins::package::lqfp_208::p136,
44+
typename Vd6 = pins::package::lqfp_208::p134,
45+
typename Vd7 = pins::package::lqfp_208::p132,
46+
typename Vd8 = pins::package::lqfp_208::p164,
47+
typename Vd9 = pins::package::lqfp_208::p162,
48+
typename Vd10 = pins::package::lqfp_208::p70,
49+
typename Vd11 = pins::package::lqfp_208::p72,
50+
typename Vd12 = pins::package::lqfp_208::p74,
51+
typename Vd13 = pins::package::lqfp_208::p76,
52+
typename Vd14 = pins::package::lqfp_208::p78,
53+
typename Vd15 = pins::package::lqfp_208::p80
54+
>
55+
struct lcd0 {
56+
// peripheral id (e.g lcd0, lcd1)
57+
constexpr static uint32_t id = 0;
58+
59+
// peripheral clock bit position
60+
constexpr static uint32_t clock_id = 0;
61+
62+
// port to the LCD hardware
63+
static inline LCD_Type *const port = LCD;
64+
65+
// configurable data signals
66+
using vd0_pins = std::tuple<
67+
detail::lcd::lcd<pins::package::lqfp_208::p168, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
68+
detail::lcd::lcd<pins::package::lqfp_208::p138, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>
69+
>;
70+
71+
using vd1_pins = std::tuple<
72+
detail::lcd::lcd<pins::package::lqfp_208::p166, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
73+
detail::lcd::lcd<pins::package::lqfp_208::p136, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>
74+
>;
75+
76+
using vd2_pins = std::tuple<
77+
detail::lcd::lcd<pins::package::lqfp_208::p134, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>,
78+
detail::lcd::lcd<pins::package::lqfp_208::p170, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>
79+
>;
80+
81+
using vd3_pins = std::tuple<
82+
detail::lcd::lcd<pins::package::lqfp_208::p132, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>,
83+
detail::lcd::lcd<pins::package::lqfp_208::p106, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_5>,
84+
detail::lcd::lcd<pins::package::lqfp_208::p176, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>
85+
>;
86+
87+
using vd4_pins = std::tuple<
88+
detail::lcd::lcd<pins::package::lqfp_208::p138, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
89+
detail::lcd::lcd<pins::package::lqfp_208::p106, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_4>
90+
>;
91+
92+
using vd5_pins = std::tuple<
93+
detail::lcd::lcd<pins::package::lqfp_208::p136, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
94+
detail::lcd::lcd<pins::package::lqfp_208::p102, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_5>
95+
>;
96+
97+
using vd6_pins = std::tuple<
98+
detail::lcd::lcd<pins::package::lqfp_208::p70, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>,
99+
detail::lcd::lcd<pins::package::lqfp_208::p134, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
100+
detail::lcd::lcd<pins::package::lqfp_208::p170, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_5>
101+
>;
102+
103+
using vd7_pins = std::tuple<
104+
detail::lcd::lcd<pins::package::lqfp_208::p72, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>,
105+
detail::lcd::lcd<pins::package::lqfp_208::p132, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
106+
detail::lcd::lcd<pins::package::lqfp_208::p176, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_5>
107+
>;
108+
109+
using vd8_pins = std::tuple<
110+
detail::lcd::lcd<pins::package::lqfp_208::p164, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
111+
detail::lcd::lcd<pins::package::lqfp_208::p74, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>,
112+
detail::lcd::lcd<pins::package::lqfp_208::p106, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>
113+
>;
114+
115+
using vd9_pins = std::tuple<
116+
detail::lcd::lcd<pins::package::lqfp_208::p162, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
117+
detail::lcd::lcd<pins::package::lqfp_208::p76, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>,
118+
detail::lcd::lcd<pins::package::lqfp_208::p102, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>
119+
>;
120+
121+
using vd10_pins = std::tuple<
122+
detail::lcd::lcd<pins::package::lqfp_208::p70, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
123+
detail::lcd::lcd<pins::package::lqfp_208::p78, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>,
124+
detail::lcd::lcd<pins::package::lqfp_208::p170, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>
125+
>;
126+
127+
using vd11_pins = std::tuple<
128+
detail::lcd::lcd<pins::package::lqfp_208::p72, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
129+
detail::lcd::lcd<pins::package::lqfp_208::p80, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>,
130+
detail::lcd::lcd<pins::package::lqfp_208::p176, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>
131+
>;
132+
133+
using vd12_pins = std::tuple<
134+
detail::lcd::lcd<pins::package::lqfp_208::p74, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
135+
detail::lcd::lcd<pins::package::lqfp_208::p82, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>
136+
>;
137+
138+
using vd13_pins = std::tuple<
139+
detail::lcd::lcd<pins::package::lqfp_208::p76, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
140+
detail::lcd::lcd<pins::package::lqfp_208::p88, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>
141+
>;
142+
143+
using vd14_pins = std::tuple<
144+
detail::lcd::lcd<pins::package::lqfp_208::p78, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
145+
detail::lcd::lcd<pins::package::lqfp_208::p90, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>
146+
>;
147+
148+
using vd15_pins = std::tuple<
149+
detail::lcd::lcd<pins::package::lqfp_208::p80, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>,
150+
detail::lcd::lcd<pins::package::lqfp_208::p92, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_6>
151+
>;
152+
153+
using vd0 = std::tuple_element<klib::io::peripheral::get_index<Vd0, vd0_pins>(), vd0_pins>::type;
154+
using vd1 = std::tuple_element<klib::io::peripheral::get_index<Vd1, vd1_pins>(), vd1_pins>::type;
155+
using vd2 = std::tuple_element<klib::io::peripheral::get_index<Vd2, vd2_pins>(), vd2_pins>::type;
156+
using vd3 = std::tuple_element<klib::io::peripheral::get_index<Vd3, vd3_pins>(), vd3_pins>::type;
157+
using vd4 = std::tuple_element<klib::io::peripheral::get_index<Vd4, vd4_pins>(), vd4_pins>::type;
158+
using vd5 = std::tuple_element<klib::io::peripheral::get_index<Vd5, vd5_pins>(), vd5_pins>::type;
159+
using vd6 = std::tuple_element<klib::io::peripheral::get_index<Vd6, vd6_pins>(), vd6_pins>::type;
160+
using vd7 = std::tuple_element<klib::io::peripheral::get_index<Vd7, vd7_pins>(), vd7_pins>::type;
161+
using vd8 = std::tuple_element<klib::io::peripheral::get_index<Vd8, vd8_pins>(), vd8_pins>::type;
162+
using vd9 = std::tuple_element<klib::io::peripheral::get_index<Vd9, vd9_pins>(), vd9_pins>::type;
163+
using vd10 = std::tuple_element<klib::io::peripheral::get_index<Vd10, vd10_pins>(), vd10_pins>::type;
164+
using vd11 = std::tuple_element<klib::io::peripheral::get_index<Vd11, vd11_pins>(), vd11_pins>::type;
165+
using vd12 = std::tuple_element<klib::io::peripheral::get_index<Vd12, vd12_pins>(), vd12_pins>::type;
166+
using vd13 = std::tuple_element<klib::io::peripheral::get_index<Vd13, vd13_pins>(), vd13_pins>::type;
167+
using vd14 = std::tuple_element<klib::io::peripheral::get_index<Vd14, vd14_pins>(), vd14_pins>::type;
168+
using vd15 = std::tuple_element<klib::io::peripheral::get_index<Vd15, vd15_pins>(), vd15_pins>::type;
169+
170+
// fixed data signals
171+
using vd16 = detail::lcd::lcd<pins::package::lqfp_208::p160, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>;
172+
using vd17 = detail::lcd::lcd<pins::package::lqfp_208::p158, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>;
173+
using vd18 = detail::lcd::lcd<pins::package::lqfp_208::p106, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>;
174+
using vd19 = detail::lcd::lcd<pins::package::lqfp_208::p102, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>;
175+
using vd20 = detail::lcd::lcd<pins::package::lqfp_208::p82, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>;
176+
using vd21 = detail::lcd::lcd<pins::package::lqfp_208::p88, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>;
177+
using vd22 = detail::lcd::lcd<pins::package::lqfp_208::p90, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>;
178+
using vd23 = detail::lcd::lcd<pins::package::lqfp_208::p92, detail::lcd::mode::data, core::lpc178x::io::detail::alternate::func_7>;
179+
180+
// other signals (also fixed)
181+
using power = detail::lcd::lcd<pins::package::lqfp_208::p154, detail::lcd::mode::power, core::lpc178x::io::detail::alternate::func_7>;
182+
using line_end = detail::lcd::lcd<pins::package::lqfp_208::p152, detail::lcd::mode::line_end, core::lpc178x::io::detail::alternate::func_7>;
183+
using clock = detail::lcd::lcd<pins::package::lqfp_208::p150, detail::lcd::mode::clock, core::lpc178x::io::detail::alternate::func_7>;
184+
using clock_in = detail::lcd::lcd<pins::package::lqfp_208::p108, detail::lcd::mode::clock_in, core::lpc178x::io::detail::alternate::func_7>;
185+
using vsync = detail::lcd::lcd<pins::package::lqfp_208::p144, detail::lcd::mode::vsync, core::lpc178x::io::detail::alternate::func_7>;
186+
using hsync = detail::lcd::lcd<pins::package::lqfp_208::p140, detail::lcd::mode::hsync, core::lpc178x::io::detail::alternate::func_7>;
187+
using output_enable = detail::lcd::lcd<pins::package::lqfp_208::p142, detail::lcd::mode::output_enable, core::lpc178x::io::detail::alternate::func_7>;
188+
};
189+
}
190+
191+
namespace klib::lpc1788::io {
192+
template <typename Lcd, graphics::mode Mode = graphics::mode::rgb565>
193+
using lcd = klib::core::lpc178x::io::lcd<Lcd, Mode>;
194+
}
195+
196+
#endif

0 commit comments

Comments
 (0)