Skip to content
Snippets Groups Projects
Commit ed3e2198 authored by Per Lindgren's avatar Per Lindgren
Browse files

traits work

parent 4bded63e
No related branches found
No related tags found
No related merge requests found
...@@ -19,7 +19,7 @@ fn main() { ...@@ -19,7 +19,7 @@ fn main() {
let mut rcc = p.RCC.constrain(); let mut rcc = p.RCC.constrain();
let mut gpioa = p.GPIOA.split(&mut rcc.ahb1); let mut gpioa = p.GPIOA.split(&mut rcc.ahb1);
let streams = p.DMA1.split(&mut rcc.ahb1); let streams = p.DMA1.split(&mut rcc.ahb1);
let tx_stream = streams.1.into_channel4(); // actually 5 let tx_stream = streams.1.into_channel4(); // S5<C4>
let clocks = rcc.cfgr.freeze(&mut flash.acr); let clocks = rcc.cfgr.freeze(&mut flash.acr);
......
...@@ -7,6 +7,7 @@ use core::ops; ...@@ -7,6 +7,7 @@ use core::ops;
use rcc::AHB1; use rcc::AHB1;
use stm32f4x::USART2; use stm32f4x::USART2;
use stm32f4x::{DMA1, dma2};
#[derive(Debug)] #[derive(Debug)]
pub enum Error { pub enum Error {
...@@ -66,6 +67,26 @@ pub trait DmaExt { ...@@ -66,6 +67,26 @@ pub trait DmaExt {
fn split(self, ahb: &mut AHB1) -> Self::Streams; fn split(self, ahb: &mut AHB1) -> Self::Streams;
} }
pub trait Dma {
// sXcr stream x configuration register
fn cr(&mut self) -> &dma2::S5CR;
// sXfcr stream x FIFO control register
fn fcr(&mut self) -> &dma2::S5FCR;
// sXm0ar stream x memory 0 address register
fn m0ar(&mut self) -> &dma2::S5M0AR;
// sXm1ar stream x memory 0 address register
fn m1ar(&mut self) -> &dma2::S5M1AR;
// sXndtr stream x number of data register
fn ndtr(&mut self) -> &dma2::S5NDTR;
// sXpar stream x peripheral address register
fn par(&mut self) -> &dma2::S5PAR;
}
pub struct Transfer<MODE, BUFFER, STREAM, PAYLOAD> { pub struct Transfer<MODE, BUFFER, STREAM, PAYLOAD> {
_mode: PhantomData<MODE>, _mode: PhantomData<MODE>,
buffer: BUFFER, buffer: BUFFER,
...@@ -183,34 +204,34 @@ pub mod dma1 { ...@@ -183,34 +204,34 @@ pub mod dma1 {
// lisr low interrupt status register // lisr low interrupt status register
// impl<CHANNEL> S5<CHANNEL> { // impl<CHANNEL> S5<CHANNEL> {
impl S5<C4> { impl super::Dma for S5<C4> {
// sXcr stream x configuration register // sXcr stream x configuration register
pub(crate) fn cr(&mut self) -> &dma2::S5CR { fn cr(&mut self) -> &dma2::S5CR {
unsafe { &(*DMA1::ptr()).s5cr } unsafe { &(*DMA1::ptr()).s5cr }
} }
// sXfcr stream x FIFO control register // sXfcr stream x FIFO control register
pub(crate) fn fcr(&mut self) -> &dma2::S5FCR { fn fcr(&mut self) -> &dma2::S5FCR {
unsafe { &(*DMA1::ptr()).s5fcr } unsafe { &(*DMA1::ptr()).s5fcr }
} }
// sXm0ar stream x memory 0 address register // sXm0ar stream x memory 0 address register
pub(crate) fn m0ar(&mut self) -> &dma2::S5M0AR { fn m0ar(&mut self) -> &dma2::S5M0AR {
unsafe { &(*DMA1::ptr()).s5m0ar } unsafe { &(*DMA1::ptr()).s5m0ar }
} }
// sXm1ar stream x memory 0 address register // sXm1ar stream x memory 0 address register
pub(crate) fn m1ar(&mut self) -> &dma2::S5M1AR { fn m1ar(&mut self) -> &dma2::S5M1AR {
unsafe { &(*DMA1::ptr()).s5m1ar } unsafe { &(*DMA1::ptr()).s5m1ar }
} }
// sXndtr stream x number of data register // sXndtr stream x number of data register
pub(crate) fn ndtr(&mut self) -> &dma2::S5NDTR { fn ndtr(&mut self) -> &dma2::S5NDTR {
unsafe { &(*DMA1::ptr()).s5ndtr } unsafe { &(*DMA1::ptr()).s5ndtr }
} }
// sXpar stream x peripheral address register // sXpar stream x peripheral address register
pub(crate) fn par(&mut self) -> &dma2::S5PAR { fn par(&mut self) -> &dma2::S5PAR {
unsafe { &(*DMA1::ptr()).s5par } unsafe { &(*DMA1::ptr()).s5par }
} }
} }
......
...@@ -13,7 +13,7 @@ use cast::u16; ...@@ -13,7 +13,7 @@ use cast::u16;
use hal::serial; use hal::serial;
use nb; use nb;
use stm32f4x::{USART1, USART2, USART6}; use stm32f4x::{USART1, USART2, USART6};
use dma::{Static, Transfer, Usart1TxStream, R}; use dma::{Dma, Static, Transfer, Usart1TxStream, R};
// usart2 // usart2
use gpio::gpioa::{PA2, PA3}; use gpio::gpioa::{PA2, PA3};
...@@ -250,18 +250,16 @@ macro_rules! hal { ...@@ -250,18 +250,16 @@ macro_rules! hal {
where where
A: Unsize<[u8]>, A: Unsize<[u8]>,
B: Static<A>, B: Static<A>,
S: Usart1TxStream<$USARTX> S: Usart1TxStream<$USARTX> + Dma
{ {
// // write!(dma1, "hi {}", 1); {
// let usart2 = self.0; let buffer1 :&[u8] = buffer.borrow();
stream.ndtr()
// let buffer: &[u8] = buffer.borrow(); .write(|w| unsafe { w.ndt().bits(u16(buffer1.len()).unwrap()) });
// stream.ndtr() stream.par()
// .write(|w| unsafe { w.ndt().bits(u16(buffer.len()).unwrap()) }); .write(|w| unsafe { w.bits(&(*$USARTX::ptr()).dr as *const _ as usize as u32) });
// dma1.s6par stream.m0ar()
// .write(|w| unsafe { w.bits(&usart2.dr as *const _ as u32) }); .write(|w| unsafe { w.bits(buffer1.as_ptr() as u32) });
// dma1.s6m0ar
// .write(|w| unsafe { w.bits(buffer.as_ptr() as u32) });
// dma1.s6cr.modify(|_, w| w.en().set_bit()); // dma1.s6cr.modify(|_, w| w.en().set_bit());
...@@ -302,7 +300,7 @@ macro_rules! hal { ...@@ -302,7 +300,7 @@ macro_rules! hal {
// .en() // .en()
// .set_bit() // .set_bit()
// }); // });
}
Transfer::r(buffer, stream, self) Transfer::r(buffer, stream, self)
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment