X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Fdac.h;h=c720f756521257e5c93ec6b2eb8f493112731c1d;hb=7911a6f01bc8a19f220f98e2fdc8595f65996853;hp=eacab9896a46b7035de86569a999f983e9e5c15b;hpb=378202ca397dbdeba1f7071e1a4707483765f408;p=bertos.git diff --git a/bertos/drv/dac.h b/bertos/drv/dac.h index eacab989..c720f756 100644 --- a/bertos/drv/dac.h +++ b/bertos/drv/dac.h @@ -51,19 +51,22 @@ #include #include #include + #include + #include CPU_HEADER(dac) struct DacContext; +struct Dac; -typedef int (*DacWriteFunc_t) (struct DacContext *ctx, unsigned channel, uint16_t sample); -typedef void (*SetChannelMaskFunc_t) (struct DacContext *ctx, uint32_t mask); -typedef void (*SetSamplingRate_t) (struct DacContext *ctx, uint32_t rate); -typedef void (*DmaConversionBufFunc_t) (struct DacContext *ctx, void *buf, size_t len); -typedef bool (*DmaConversionIsFinished_t) (struct DacContext *ctx); -typedef void (*DmaStartStreamingFunc_t) (struct DacContext *ctx, void *buf, size_t len, size_t slicelen); -typedef void *(*DmaWaitConversionFunc_t) (struct DacContext *ctx); -typedef void (*DmaStopFunc_t) (struct DacContext *ctx); +typedef int (*DacWriteFunc_t) (struct Dac *dac, unsigned channel, uint16_t sample); +typedef void (*SetChannelMaskFunc_t) (struct Dac *dac, uint32_t mask); +typedef void (*SetSamplingRate_t) (struct Dac *dac, uint32_t rate); +typedef void (*DmaConversionBufFunc_t) (struct Dac *dac, void *buf, size_t len); +typedef bool (*DmaConversionIsFinished_t) (struct Dac *dac); +typedef void (*DmaStartStreamingFunc_t) (struct Dac *dac, void *buf, size_t len, size_t slice_len); +typedef void (*DmaStopFunc_t) (struct Dac *dac); +typedef void (*DmaCallbackFunc_t) (struct Dac *dac, void *_buf, size_t len); typedef struct DacContext { @@ -73,77 +76,81 @@ typedef struct DacContext DmaConversionBufFunc_t conversion; DmaConversionIsFinished_t isFinished; DmaStartStreamingFunc_t start; - DmaWaitConversionFunc_t wait; DmaStopFunc_t stop; - size_t slicelen; + DmaCallbackFunc_t callback; + size_t slice_len; DB(id_t _type); + } DacContext; -INLINE int dac_write(DacContext *ctx, unsigned channel, uint16_t sample) +typedef struct Dac +{ + DacContext ctx; + struct DacHardware *hw; +} Dac; + +INLINE int dac_write(Dac *dac, unsigned channel, uint16_t sample) { - ASSERT(ctx->write); - return ctx->write(ctx, channel, sample); + ASSERT(dac->ctx.write); + return dac->ctx.write(dac, channel, sample); } -INLINE void dac_setChannelMask(struct DacContext *ctx, uint32_t mask) +INLINE void dac_setChannelMask(struct Dac *dac, uint32_t mask) { - ASSERT(ctx->setCh); - ctx->setCh(ctx, mask); + ASSERT(dac->ctx.setCh); + dac->ctx.setCh(dac, mask); } -INLINE void dac_setSamplingRate(struct DacContext *ctx, uint32_t rate) +INLINE void dac_setSamplingRate(Dac *dac, uint32_t rate) { - ASSERT(ctx->setSampleRate); - ctx->setSampleRate(ctx, rate); + ASSERT(dac->ctx.setSampleRate); + dac->ctx.setSampleRate(dac, rate); } -/** +/* * Convert \param len samples stored into \param buf. */ -INLINE void dac_dmaConversionBuffer(struct DacContext *ctx, void *buf, size_t len) +INLINE void dac_dmaConversionBuffer(Dac *dac, void *buf, size_t len) { - ASSERT(ctx->conversion); - ctx->conversion(ctx, buf, len); + ASSERT(dac->ctx.conversion); + dac->ctx.conversion(dac, buf, len); } -/** +/* * Check if a dma transfer is finished. * * Useful for kernel-less applications. */ -INLINE bool dac_dmaIsFinished(struct DacContext *ctx) +INLINE bool dac_dmaIsFinished(Dac *dac) { - ASSERT(ctx->isFinished); - return ctx->isFinished(ctx); + ASSERT(dac->ctx.isFinished); + return dac->ctx.isFinished(dac); } -/** +/* * \param slicelen Must be a divisor of len, ie. len % slicelen == 0. */ -INLINE void dac_dmaStartStreaming(struct DacContext *ctx, void *buf, size_t len, size_t slicelen) +INLINE void dac_dmaStartStreaming(Dac *dac, void *buf, size_t len, size_t slice_len, DmaCallbackFunc_t callback) { - ASSERT(ctx->start); - ASSERT(len % slicelen == 0); - ctx->slicelen = slicelen; - ctx->start(ctx, buf, len, slicelen); -} + ASSERT(dac->ctx.start); + ASSERT(len % slice_len == 0); + ASSERT(callback); -INLINE void *dac_dmaWaitConversion(struct DacContext *ctx) -{ - ASSERT(ctx->wait); - return ctx->wait(ctx); + dac->ctx.callback = callback; + dac->ctx.slice_len = slice_len; + dac->ctx.start(dac, buf, len, slice_len); } -INLINE void dac_dmaStop(struct DacContext *ctx) +INLINE void dac_dmaStop(Dac *dac) { - ASSERT(ctx->stop); - ctx->stop(ctx); + ASSERT(dac->ctx.stop); + dac->ctx.stop(dac); } #define dac_bits() DAC_BITS -void dac_init(void); +void dac_init(Dac *dac); /** \} */ //defgroup dac #endif /* DRV_DAC_H */