123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- #pragma once
- #include "AP_HAL_ChibiOS.h"
- #define SHARED_DMA_MAX_STREAM_ID (8*2)
- #define SHARED_DMA_NONE 255
- class ChibiOS::Shared_DMA
- {
- public:
- FUNCTOR_TYPEDEF(dma_allocate_fn_t, void, Shared_DMA *);
- FUNCTOR_TYPEDEF(dma_deallocate_fn_t, void, Shared_DMA *);
-
-
- Shared_DMA(uint8_t stream_id1, uint8_t stream_id2,
- dma_allocate_fn_t allocate,
- dma_allocate_fn_t deallocate);
-
- static void init(void);
-
-
- void lock(void);
-
- bool lock_nonblock(void);
-
-
-
-
- void unlock(void);
-
- void unlock_from_IRQ(void);
-
- void unlock_from_lockzone(void);
-
-
- void unregister(void);
-
-
- bool has_contention(void) const { return contention; }
-
-
- static void lock_all(void);
-
- private:
- dma_allocate_fn_t allocate;
- dma_allocate_fn_t deallocate;
- uint8_t stream_id1;
- uint8_t stream_id2;
- bool have_lock;
-
-
- bool contention;
-
- void lock_core(void);
-
- static void lock_stream(uint8_t stream_id);
-
- void unlock_stream(uint8_t stream_id);
-
- void unlock_stream_from_IRQ(uint8_t stream_id);
-
- bool lock_stream_nonblocking(uint8_t stream_id);
-
- static struct dma_lock {
-
- #if CH_CFG_USE_SEMAPHORES == TRUE
- binary_semaphore_t semaphore;
- #endif
-
- dma_deallocate_fn_t deallocate;
-
- Shared_DMA *obj;
- } locks[SHARED_DMA_MAX_STREAM_ID+1];
- };
|