Skip to content

Commit 0d38cf8

Browse files
authored
Merge pull request #126 from willemml/fmc_lcd
Add support for some LCD controllers using the FMC
2 parents ae70262 + b96355a commit 0d38cf8

File tree

8 files changed

+1368
-3
lines changed

8 files changed

+1368
-3
lines changed

Cargo.toml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ version = "0.2.3"
4343
default-features = false
4444
version = "1.0.2"
4545

46+
[dependencies.display-interface]
47+
optional = true
48+
version = "0.4.1"
49+
4650
[dev-dependencies]
4751
cortex-m-semihosting = "0.3.3"
4852
panic-halt = "0.2.0"
@@ -59,7 +63,7 @@ usb_hs_phy = []
5963
rt = ["stm32f7/rt"]
6064
stm32f722 = ["stm32f7/stm32f7x2", "device-selected"]
6165
stm32f723 = ["stm32f7/stm32f7x3", "device-selected", "usb_hs_phy"]
62-
stm32f730 = ["stm32f7/stm32f730", "device-selected", "usb_hs_phy"]
66+
stm32f730 = ["stm32f7/stm32f730", "device-selected", "usb_hs_phy", "fmc"]
6367
stm32f732 = ["stm32f7/stm32f7x2", "device-selected"]
6468
stm32f733 = ["stm32f7/stm32f7x3", "device-selected", "usb_hs_phy"]
6569
stm32f745 = ["stm32f7/stm32f745", "device-selected", "fmc"]
@@ -72,6 +76,8 @@ stm32f777 = ["stm32f7/stm32f7x7", "device-selected", "ltdc", "fmc"]
7276
stm32f778 = ["stm32f7/stm32f7x9", "device-selected", "ltdc", "fmc"]
7377
stm32f779 = ["stm32f7/stm32f7x9", "device-selected", "ltdc", "fmc"]
7478

79+
fmc_lcd = ["display-interface"]
80+
7581
usb_fs = ["synopsys-usb-otg", "synopsys-usb-otg/fs"]
7682
usb_hs = ["synopsys-usb-otg", "synopsys-usb-otg/hs"]
7783

src/fmc.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ use crate::gpio::{Alternate, AF12};
6565

6666
/// Storage type for Flexible Memory Controller and its clocks
6767
pub struct FMC {
68-
_fmc: stm32::FMC,
68+
pub fmc: stm32::FMC,
6969
hclk: Hertz,
7070
}
7171

@@ -105,7 +105,7 @@ impl FmcExt for stm32::FMC {
105105
/// New FMC instance
106106
fn fmc(self, clocks: &Clocks) -> FMC {
107107
FMC {
108-
_fmc: self,
108+
fmc: self,
109109
hclk: clocks.hclk(),
110110
}
111111
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
use display_interface::{DataFormat, DisplayError, WriteOnlyDataCommand};
2+
3+
use super::{Lcd, SubBank};
4+
5+
impl<S> WriteOnlyDataCommand for Lcd<S>
6+
where
7+
S: SubBank,
8+
{
9+
fn send_commands(&mut self, cmd: DataFormat<'_>) -> Result<(), DisplayError> {
10+
match cmd {
11+
DataFormat::U8(slice) => {
12+
for value in slice {
13+
self.write_command(u16::from(*value));
14+
}
15+
}
16+
DataFormat::U16(slice) => {
17+
for value in slice {
18+
self.write_command(*value);
19+
}
20+
}
21+
DataFormat::U16BE(slice) | DataFormat::U16LE(slice) => {
22+
// As long as the data bus is 16 bits wide, the byte order doesn't matter.
23+
for value in slice {
24+
self.write_command(*value);
25+
}
26+
}
27+
DataFormat::U8Iter(iter) => {
28+
for value in iter {
29+
self.write_command(u16::from(value));
30+
}
31+
}
32+
DataFormat::U16BEIter(iter) | DataFormat::U16LEIter(iter) => {
33+
// As long as the data bus is 16 bits wide, the byte order doesn't matter.
34+
for value in iter {
35+
self.write_command(value);
36+
}
37+
}
38+
_ => return Err(DisplayError::DataFormatNotImplemented),
39+
}
40+
Ok(())
41+
}
42+
43+
fn send_data(&mut self, buf: DataFormat<'_>) -> Result<(), DisplayError> {
44+
match buf {
45+
DataFormat::U8(slice) => {
46+
for value in slice {
47+
self.write_data(u16::from(*value));
48+
}
49+
}
50+
DataFormat::U16(slice) => {
51+
for value in slice {
52+
self.write_data(*value);
53+
}
54+
}
55+
DataFormat::U16BE(slice) | DataFormat::U16LE(slice) => {
56+
// As long as the data bus is 16 bits wide, the byte order doesn't matter.
57+
for value in slice {
58+
self.write_data(*value);
59+
}
60+
}
61+
DataFormat::U8Iter(iter) => {
62+
for value in iter {
63+
self.write_data(u16::from(value));
64+
}
65+
}
66+
DataFormat::U16BEIter(iter) | DataFormat::U16LEIter(iter) => {
67+
// As long as the data bus is 16 bits wide, the byte order doesn't matter.
68+
for value in iter {
69+
self.write_data(value);
70+
}
71+
}
72+
_ => return Err(DisplayError::DataFormatNotImplemented),
73+
}
74+
Ok(())
75+
}
76+
}

0 commit comments

Comments
 (0)