Няма описание
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.

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