Нема описа
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. use embedded_hal::digital::v2::OutputPin;
  2. use mkl25z4::{GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, SIM, SPI0, SPI1};
  3. use mkl25z4_hal::clocks::Clocks;
  4. use mkl25z4_hal::gpio::{self, gpioa, gpiob, gpioc, gpiod, gpioe, GpioExt};
  5. use mkl25z4_hal::spi::{self, Phase, Polarity, Spi};
  6. use mkl25z4_hal::time::U32Ext;
  7. pub type DisplayBusy = gpioc::PC4<gpio::Input<gpio::PullUp>>;
  8. pub type DisplayCs = gpioc::PC8<gpio::Output<gpio::PushPull>>;
  9. pub type DisplayDc = gpioc::PC9<gpio::Output<gpio::PushPull>>;
  10. pub type DisplayRst = gpioc::PC10<gpio::Output<gpio::PushPull>>;
  11. pub type DisplayPwr = gpioc::PC11<gpio::Output<gpio::PushPull>>;
  12. pub struct DisplayPins {
  13. /// Display busy (active low).
  14. pub display_busy: gpioc::PC4<gpio::Input<gpio::PullUp>>,
  15. /// Display chip select (active low).
  16. pub display_cs: gpioc::PC8<gpio::Output<gpio::PushPull>>,
  17. /// Display data/command.
  18. pub display_dc: gpioc::PC9<gpio::Output<gpio::PushPull>>,
  19. /// Display reset (active low).
  20. pub display_rst: gpioc::PC10<gpio::Output<gpio::PushPull>>,
  21. /// Display supply voltage enable (active low).
  22. pub display_pwr: gpioc::PC11<gpio::Output<gpio::PushPull>>,
  23. }
  24. pub type DisplayBmeSpi = Spi<
  25. SPI0,
  26. gpioc::PC7<gpio::Alternate5>,
  27. gpioc::PC6<gpio::Alternate5>,
  28. gpioc::PC5<gpio::Alternate2>,
  29. >;
  30. pub struct Pins {
  31. /// 5V supply for the LED (active high).
  32. pub enable_5v: gpioa::PA1<gpio::Output<gpio::PushPull>>,
  33. /// Red display frontlight LEDs (active high).
  34. pub red: gpioe::PE31<gpio::Output<gpio::PushPull>>,
  35. /// Green display frontlight LEDs (active high).
  36. pub green: gpioe::PE30<gpio::Output<gpio::PushPull>>,
  37. /// Blue display frontlight LEDs (active high).
  38. pub blue: gpioe::PE29<gpio::Output<gpio::PushPull>>,
  39. /// Top switch (active low).
  40. pub top_switch: gpioc::PC1<gpio::Input<gpio::Floating>>,
  41. /// Left switches (top to bottom, active low).
  42. pub left_switches: (
  43. gpiod::PD1<gpio::Input<gpio::PullUp>>,
  44. gpiod::PD2<gpio::Input<gpio::PullUp>>,
  45. gpiod::PD3<gpio::Input<gpio::PullUp>>,
  46. gpiod::PD4<gpio::Input<gpio::PullUp>>,
  47. ),
  48. /// Right switches (top to bottom, active low).
  49. pub right_switches: (
  50. gpioa::PA13<gpio::Input<gpio::PullUp>>,
  51. gpioa::PA12<gpio::Input<gpio::PullUp>>,
  52. gpioa::PA5<gpio::Input<gpio::PullUp>>,
  53. gpioa::PA4<gpio::Input<gpio::PullUp>>,
  54. ),
  55. /// Ambient light sensor enable (active high).
  56. pub als_en: gpioe::PE20<gpio::Output<gpio::PushPull>>,
  57. // TODO: ADC for the ambient light sensor.
  58. /// Ambient light sensor.
  59. pub als: gpioe::PE21<gpio::Input<gpio::Floating>>,
  60. // TODO: PWM for the buzzer.
  61. /// Buzzer (active high).
  62. pub buzzer: gpioc::PC3<gpio::Output<gpio::PushPull>>,
  63. /// NRF IRQ line (active low).
  64. pub nrf_irq: gpiob::PB0<gpio::Input<gpio::PullUp>>,
  65. /// NRF chip select (active low).
  66. pub nrf_cs: gpiob::PB1<gpio::Output<gpio::PushPull>>,
  67. /// NRF chip enable.
  68. pub nrf_ce: gpiob::PB2<gpio::Output<gpio::PushPull>>,
  69. /// NRF supply voltage enable (active low).
  70. pub nrf_pwr: gpiob::PB3<gpio::Output<gpio::PushPull>>,
  71. /// SPI for the NRF module.
  72. pub nrf_spi: Spi<
  73. SPI1,
  74. gpiob::PB16<gpio::Alternate2>,
  75. gpiob::PB17<gpio::Alternate2>,
  76. gpiod::PD5<gpio::Alternate2>,
  77. >,
  78. /// BME280 chip select (active low).
  79. pub bme_cs: gpioc::PC2<gpio::Output<gpio::PushPull>>,
  80. pub display: DisplayPins,
  81. /// SPI for both display and BME280.
  82. pub display_bme_spi: DisplayBmeSpi,
  83. }
  84. impl Pins {
  85. pub fn configure(
  86. sim: &mut SIM,
  87. clocks: Clocks,
  88. gpioa: GPIOA,
  89. gpiob: GPIOB,
  90. gpioc: GPIOC,
  91. gpiod: GPIOD,
  92. gpioe: GPIOE,
  93. spi0: SPI0,
  94. spi1: SPI1,
  95. ) -> Pins {
  96. let mut gpioa = gpioa.split(sim);
  97. let mut gpiob = gpiob.split(sim);
  98. let mut gpioc = gpioc.split(sim);
  99. let mut gpiod = gpiod.split(sim);
  100. let mut gpioe = gpioe.split(sim);
  101. // SPI0 for the display/BME module.
  102. let mosi = gpioc.pc7.into_alternate(&mut gpioc.pddr);
  103. let miso = gpioc.pc6.into_alternate(&mut gpioc.pddr);
  104. let sck = gpioc.pc5.into_alternate(&mut gpioc.pddr);
  105. let mode = spi::Mode {
  106. polarity: Polarity::IdleLow,
  107. phase: Phase::CaptureOnFirstTransition,
  108. };
  109. let spi0 = Spi::spi0(spi0, mosi, miso, sck, mode, 500000u32.hz(), clocks, sim);
  110. // SPI1 for the NRF module.
  111. let mosi = gpiob.pb16.into_alternate(&mut gpiob.pddr);
  112. let miso = gpiob.pb17.into_alternate(&mut gpiob.pddr);
  113. let sck = gpiod.pd5.into_alternate(&mut gpiod.pddr);
  114. let mode = spi::Mode {
  115. polarity: Polarity::IdleLow,
  116. phase: Phase::CaptureOnFirstTransition,
  117. };
  118. let spi1 = Spi::spi1(spi1, mosi, miso, sck, mode, 500000u32.hz(), clocks, sim);
  119. let mut pins = Pins {
  120. enable_5v: gpioa.pa1.into_push_pull_output(&mut gpioa.pddr),
  121. red: gpioe.pe31.into_push_pull_output(&mut gpioe.pddr),
  122. green: gpioe.pe30.into_push_pull_output(&mut gpioe.pddr),
  123. blue: gpioe.pe29.into_push_pull_output(&mut gpioe.pddr),
  124. top_switch: gpioc.pc1.into_floating_input(&mut gpioc.pddr),
  125. left_switches: (
  126. gpiod.pd1.into_pull_up_input(&mut gpiod.pddr),
  127. gpiod.pd2.into_pull_up_input(&mut gpiod.pddr),
  128. gpiod.pd3.into_pull_up_input(&mut gpiod.pddr),
  129. gpiod.pd4.into_pull_up_input(&mut gpiod.pddr),
  130. ),
  131. right_switches: (
  132. gpioa.pa13.into_pull_up_input(&mut gpioa.pddr),
  133. gpioa.pa12.into_pull_up_input(&mut gpioa.pddr),
  134. gpioa.pa5.into_pull_up_input(&mut gpioa.pddr),
  135. gpioa.pa4.into_pull_up_input(&mut gpioa.pddr),
  136. ),
  137. als_en: gpioe.pe20.into_push_pull_output(&mut gpioe.pddr),
  138. als: gpioe.pe21.into_floating_input(&mut gpioe.pddr),
  139. buzzer: gpioc.pc3.into_push_pull_output(&mut gpioc.pddr),
  140. nrf_irq: gpiob.pb0.into_pull_up_input(&mut gpiob.pddr),
  141. nrf_cs: gpiob.pb1.into_push_pull_output(&mut gpiob.pddr),
  142. nrf_ce: gpiob.pb2.into_push_pull_output(&mut gpiob.pddr),
  143. nrf_pwr: gpiob.pb3.into_push_pull_output(&mut gpiob.pddr),
  144. nrf_spi: spi1,
  145. bme_cs: gpioc.pc2.into_push_pull_output(&mut gpioc.pddr),
  146. display: DisplayPins {
  147. display_busy: gpioc.pc4.into_pull_up_input(&mut gpioc.pddr),
  148. display_cs: gpioc.pc8.into_push_pull_output(&mut gpioc.pddr),
  149. display_dc: gpioc.pc9.into_push_pull_output(&mut gpioc.pddr),
  150. display_rst: gpioc.pc10.into_push_pull_output(&mut gpioc.pddr),
  151. display_pwr: gpioc.pc11.into_push_pull_output(&mut gpioc.pddr),
  152. },
  153. display_bme_spi: spi0,
  154. };
  155. // Disable all power, set all chip-select lines high.
  156. pins.enable_5v.set_low().ok();
  157. pins.als_en.set_low().ok();
  158. pins.buzzer.set_low().ok();
  159. pins.nrf_cs.set_high().ok();
  160. pins.nrf_pwr.set_high().ok();
  161. pins.bme_cs.set_high().ok();
  162. pins.display.display_cs.set_high().ok();
  163. pins.display.display_pwr.set_high().ok();
  164. pins
  165. }
  166. }