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