prepare v0.1.0
This commit is contained in:
		
							
								
								
									
										16
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
Change Log
 | 
			
		||||
=======
 | 
			
		||||
 | 
			
		||||
All notable changes to this project will be documented in this file.
 | 
			
		||||
 | 
			
		||||
The format is based on [Keep a Changelog](http://keepachangelog.com/)
 | 
			
		||||
and this project adheres to [Semantic Versioning](http://semver.org/).
 | 
			
		||||
 | 
			
		||||
# [unreleased]
 | 
			
		||||
 | 
			
		||||
# [v0.1.0]
 | 
			
		||||
 | 
			
		||||
Initial release.
 | 
			
		||||
 | 
			
		||||
[unreleased]: https://egit.irs.uni-stuttgart.de/rust/axi-uartlite/compare/v0.1.0...HEAD
 | 
			
		||||
[v0.1.0]: https://egit.irs.uni-stuttgart.de/rust/axi-uartlite/tag/v0.1.0
 | 
			
		||||
@@ -26,3 +26,6 @@ default = ["1-waker"]
 | 
			
		||||
8-wakers = []
 | 
			
		||||
16-wakers = []
 | 
			
		||||
32-wakers = []
 | 
			
		||||
 | 
			
		||||
[package.metadata.docs.rs]
 | 
			
		||||
rustdoc-args = ["--generate-link-to-definition"]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
AXI UARTLITE driver
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
This is a driver for the AXI UART Lite v2.0 IP core.
 | 
			
		||||
 | 
			
		||||
# Core features
 | 
			
		||||
 | 
			
		||||
- Basic driver which can be created with a given IP core base address and supports as basic
 | 
			
		||||
  byte-level read and write API.
 | 
			
		||||
- Support for [`embedded-io`](https://docs.rs/embedded-io/latest/embedded_io/) and
 | 
			
		||||
  [`embedded-io-async`](https://docs.rs/embedded-io-async/latest/embedded_io_async/)
 | 
			
		||||
 | 
			
		||||
# Features
 | 
			
		||||
 | 
			
		||||
If the asynchronous support for the TX side is used, the number of statically provided wakers
 | 
			
		||||
can be configured using the following features:
 | 
			
		||||
 | 
			
		||||
- `1-waker` which is the default
 | 
			
		||||
- `2-wakers`
 | 
			
		||||
- `4-wakers`
 | 
			
		||||
- `8-wakers`
 | 
			
		||||
- `16-wakers`
 | 
			
		||||
- `32-wakers`
 | 
			
		||||
							
								
								
									
										32
									
								
								justfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								justfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
all: check build embedded clippy fmt docs coverage
 | 
			
		||||
 | 
			
		||||
clippy:
 | 
			
		||||
  cargo clippy -- -D warnings
 | 
			
		||||
 | 
			
		||||
fmt:
 | 
			
		||||
  cargo fmt --all -- --check
 | 
			
		||||
 | 
			
		||||
check:
 | 
			
		||||
  cargo check
 | 
			
		||||
 | 
			
		||||
embedded:
 | 
			
		||||
  cargo build --target thumbv7em-none-eabihf
 | 
			
		||||
 | 
			
		||||
test:
 | 
			
		||||
  cargo nextest r
 | 
			
		||||
  cargo test --doc
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
  cargo build
 | 
			
		||||
 | 
			
		||||
docs:
 | 
			
		||||
  RUSTDOCFLAGS="--cfg docsrs -Z unstable-options --generate-link-to-definition" cargo +nightly doc
 | 
			
		||||
 | 
			
		||||
docs-html:
 | 
			
		||||
  RUSTDOCFLAGS="--cfg docsrs -Z unstable-options --generate-link-to-definition" cargo +nightly doc --open
 | 
			
		||||
 | 
			
		||||
coverage:
 | 
			
		||||
  cargo llvm-cov nextest
 | 
			
		||||
 | 
			
		||||
coverage-html:
 | 
			
		||||
  cargo llvm-cov nextest --html --open
 | 
			
		||||
@@ -14,6 +14,7 @@
 | 
			
		||||
//! - `16-wakers`
 | 
			
		||||
//! - `32-wakers`
 | 
			
		||||
#![no_std]
 | 
			
		||||
#![cfg_attr(docsrs, feature(doc_cfg))]
 | 
			
		||||
 | 
			
		||||
use core::convert::Infallible;
 | 
			
		||||
use registers::Control;
 | 
			
		||||
@@ -82,7 +83,7 @@ impl AxiUartlite {
 | 
			
		||||
    ///   with the same `base_addr` can lead to unintended behavior if not externally synchronized.
 | 
			
		||||
    /// - The driver performs **volatile** reads and writes to the provided address.
 | 
			
		||||
    pub const unsafe fn new(base_addr: u32) -> Self {
 | 
			
		||||
        let regs = unsafe { registers::AxiUartlite::new_mmio_at(base_addr as usize) };
 | 
			
		||||
        let regs = unsafe { registers::Registers::new_mmio_at(base_addr as usize) };
 | 
			
		||||
        Self {
 | 
			
		||||
            rx: Rx {
 | 
			
		||||
                regs: unsafe { regs.clone() },
 | 
			
		||||
@@ -94,7 +95,7 @@ impl AxiUartlite {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[inline(always)]
 | 
			
		||||
    pub const fn regs(&mut self) -> &mut registers::MmioAxiUartlite<'static> {
 | 
			
		||||
    pub const fn regs(&mut self) -> &mut registers::MmioRegisters<'static> {
 | 
			
		||||
        &mut self.tx.regs
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -41,9 +41,10 @@ pub struct Control {
 | 
			
		||||
    reset_tx_fifo: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// AXI UARTLITE register block definition.
 | 
			
		||||
#[derive(derive_mmio::Mmio)]
 | 
			
		||||
#[repr(C)]
 | 
			
		||||
pub struct AxiUartlite {
 | 
			
		||||
pub struct Registers {
 | 
			
		||||
    #[mmio(PureRead)]
 | 
			
		||||
    rx_fifo: RxFifo,
 | 
			
		||||
    tx_fifo: TxFifo,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
use core::convert::Infallible;
 | 
			
		||||
 | 
			
		||||
use crate::registers::{self, AxiUartlite, Status};
 | 
			
		||||
use crate::registers::{self, Registers, Status};
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Default, Copy, Clone, Eq, PartialEq)]
 | 
			
		||||
pub struct RxErrors {
 | 
			
		||||
@@ -36,7 +36,7 @@ impl RxErrors {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub struct Rx {
 | 
			
		||||
    pub(crate) regs: registers::MmioAxiUartlite<'static>,
 | 
			
		||||
    pub(crate) regs: registers::MmioRegisters<'static>,
 | 
			
		||||
    pub(crate) errors: Option<RxErrors>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -57,7 +57,7 @@ impl Rx {
 | 
			
		||||
    #[inline]
 | 
			
		||||
    pub const unsafe fn steal(base_addr: usize) -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            regs: unsafe { AxiUartlite::new_mmio_at(base_addr) },
 | 
			
		||||
            regs: unsafe { Registers::new_mmio_at(base_addr) },
 | 
			
		||||
            errors: None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ use crate::{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
pub struct Tx {
 | 
			
		||||
    pub(crate) regs: registers::MmioAxiUartlite<'static>,
 | 
			
		||||
    pub(crate) regs: registers::MmioRegisters<'static>,
 | 
			
		||||
    pub(crate) errors: Option<RxErrors>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -25,7 +25,7 @@ impl Tx {
 | 
			
		||||
    ///
 | 
			
		||||
    /// The same safey rules specified in [super::AxiUartlite] apply.
 | 
			
		||||
    pub unsafe fn steal(base_addr: usize) -> Self {
 | 
			
		||||
        let regs = unsafe { registers::AxiUartlite::new_mmio_at(base_addr) };
 | 
			
		||||
        let regs = unsafe { registers::Registers::new_mmio_at(base_addr) };
 | 
			
		||||
        Self { regs, errors: None }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -173,7 +173,16 @@ impl Future for TxFuture {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Drop for TxFuture {
 | 
			
		||||
    fn drop(&mut self) {}
 | 
			
		||||
    fn drop(&mut self) {
 | 
			
		||||
        if !TX_DONE[self.waker_idx].load(core::sync::atomic::Ordering::Relaxed) {
 | 
			
		||||
            critical_section::with(|cs| {
 | 
			
		||||
                let context_ref = TX_CONTEXTS[self.waker_idx].borrow(cs);
 | 
			
		||||
                let mut context_mut = context_ref.borrow_mut();
 | 
			
		||||
                context_mut.slice.set_null();
 | 
			
		||||
                context_mut.progress = 0;
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub struct TxAsync {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user