46 #include <adi_processor.h> 51 #include <drivers/beep/adi_beep.h> 52 #include <rtos_map/adi_rtos_map.h> 53 #include "adi_beep_def.h" 92 #pragma diag_suppress=Pm123,Pm073,Pm143,Pm050,Pm140,Pm031,Pm152,Pm141 96 static ADI_BEEP_DRIVER adi_beep_Device[1];
100 void Beep_Int_Handler(
void);
104 #define ADI_BEEP_INVALID_HANDLE(h) (&adi_beep_Device[0] != (h)) 110 #define BEEP_IRQ (BEEP_EVT_IRQn) 112 #if ADI_BEEP_CFG_SEQUENCE_REPEAT_VALUE == 0 114 #define INTERRUPT_ON_SEQEND (0) 115 #define INTERRUPT_ON_AEND (1) 118 #define INTERRUPT_ON_SEQEND (1) 119 #define INTERRUPT_ON_AEND (0) 128 ( (INTERRUPT_ON_SEQEND << BITP_BEEP_CFG_SEQATENDIRQ)
129 | (INTERRUPT_ON_AEND << BITP_BEEP_CFG_AENDIRQ)
134 (ADI_BEEP_ALL_INTERRUPTS),
193 uint32_t
const MemorySize,
196 ADI_BEEP_DRIVER *pDevice;
197 ADI_BEEP_DEV_DATA *pData;
212 assert (MemorySize >=
sizeof(ADI_BEEP_DRIVER));
216 pDevice = &adi_beep_Device[DeviceNum];
217 pDevice->pReg = pADI_BEEP0;
218 pDevice->pData = (ADI_BEEP_DEV_DATA*)pMemory;
219 pData = pDevice->pData;
222 if (ADI_BEEP_STATE_UNINITIALIZED != adi_beep_Device[DeviceNum].pData->state)
228 pData->cbFunc = NULL;
229 pData->cbParam = NULL;
233 ADI_BEEP_STATIC_INIT
const* pInitData = &gBeeperStaticConfigData[DeviceNum];
234 ADI_BEEP_TypeDef *pReg = pDevice->pReg;
236 pReg->CFG = pInitData->BEEP_CFG;
237 pReg->STAT = pInitData->BEEP_STAT;
238 pReg->TONEA = pInitData->BEEP_TONEA;
239 pReg->TONEB = pInitData->BEEP_TONEB;
242 NVIC_EnableIRQ(BEEP_IRQ);
245 pData->state = ADI_BEEP_STATE_INITIALIZED;
271 ADI_BEEP_DRIVER *pDevice;
272 ADI_BEEP_DEV_DATA *pData;
273 ADI_BEEP_TypeDef *pReg;
275 pDevice = (ADI_BEEP_DRIVER*)hDevice;
276 pData = pDevice->pData;
277 pReg = pDevice->pReg;
280 if (ADI_BEEP_INVALID_HANDLE(hDevice))
284 if (ADI_BEEP_STATE_UNINITIALIZED == pData->state)
291 NVIC_DisableIRQ(BEEP_IRQ);
293 pData->state = ADI_BEEP_STATE_UNINITIALIZED;
294 pData->cbFunc = NULL;
324 ADI_CALLBACK pfCallback,
325 void*
const pCBParam)
327 ADI_BEEP_DRIVER *pDevice = (ADI_BEEP_DRIVER*)hDevice;
329 ADI_INT_STATUS_ALLOC();
332 if (ADI_BEEP_INVALID_HANDLE(hDevice)) {
336 if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) {
341 ADI_ENTER_CRITICAL_REGION();
342 pDevice->pData->cbFunc = pfCallback;
343 pDevice->pData->cbParam = pCBParam;
344 ADI_EXIT_CRITICAL_REGION();
350 #if ADI_BEEP_INCLUDE_PLAY_SEQUENCE == 1 379 ADI_BEEP_DRIVER *pDevice = (ADI_BEEP_DRIVER*)hDevice;
380 ADI_BEEP_TypeDef *pReg = pDevice->pReg;
381 uint16_t nSeqCnt = 0u;
383 ADI_INT_STATUS_ALLOC();
386 if (ADI_BEEP_INVALID_HANDLE(hDevice)) {
390 if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) {
394 if (NULL == aSequence) {
401 if (((127u * 2u) < count) ||
402 ((count % 2u) != 0u) ||
410 nSeqCnt = ((uint16_t)count) >> 1u;
412 ADI_ENTER_CRITICAL_REGION();
415 pReg->CFG &= (uint16_t)~(BITM_BEEP_CFG_SEQREPEAT | BITM_BEEP_CFG_AENDIRQ | BITM_BEEP_CFG_EN);
417 pReg->TONEA = ( (uint16_t)((uint16_t)aSequence[0].
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
418 |(uint16_t)((uint16_t)aSequence[0].duration << ADI_BEEP_TONE_DUR_BITPOS) );
420 pReg->TONEB = ( (uint16_t)((uint16_t)aSequence[1].
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
421 |(uint16_t)((uint16_t)aSequence[1].duration << ADI_BEEP_TONE_DUR_BITPOS) );
425 pReg->CFG |= (BITM_BEEP_CFG_EN |
426 BITM_BEEP_CFG_BSTARTIRQ |
427 BITM_BEEP_CFG_SEQATENDIRQ |
428 (uint16_t)((uint16_t)(nSeqCnt) << BITP_BEEP_CFG_SEQREPEAT));
431 pDevice->pData->nSeqMax = count;
432 pDevice->pData->nSeqIndex = 2u;
435 pDevice->pData->state |= (ADI_BEEP_STATE_PLAYING);
437 ADI_EXIT_CRITICAL_REGION();
461 ADI_BEEP_DRIVER *pDevice;
462 ADI_BEEP_TypeDef *pReg;
463 ADI_INT_STATUS_ALLOC();
465 pDevice = (ADI_BEEP_DRIVER*)hDevice;
466 pReg = pDevice->pReg;
469 if (ADI_BEEP_INVALID_HANDLE(hDevice)) {
473 if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) {
478 ADI_ENTER_CRITICAL_REGION();
481 pReg->CFG &= (uint16_t)~(BITM_BEEP_CFG_SEQREPEAT | BITM_BEEP_CFG_EN);
484 pReg->TONEA = ( (uint16_t)((uint16_t)note.
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
485 |(uint16_t)((uint16_t)note.
duration << ADI_BEEP_TONE_DUR_BITPOS) );
488 pReg->CFG |= (BITM_BEEP_CFG_EN | BITM_BEEP_CFG_AENDIRQ);
491 pDevice->pData->state |= (ADI_BEEP_STATE_PLAYING);
492 ADI_EXIT_CRITICAL_REGION();
526 ADI_BEEP_DRIVER *pDevice;
527 ADI_BEEP_TypeDef *pReg;
528 ADI_INT_STATUS_ALLOC();
530 pDevice = (ADI_BEEP_DRIVER*)hDevice;
531 pReg = pDevice->pReg;
534 if (ADI_BEEP_INVALID_HANDLE(hDevice)) {
538 if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) {
543 ADI_ENTER_CRITICAL_REGION();
546 pReg->CFG &= (uint16_t)~(BITM_BEEP_CFG_SEQREPEAT | BITM_BEEP_CFG_AENDIRQ |BITM_BEEP_CFG_EN);
548 pReg->TONEA = ( (uint16_t)((uint16_t)noteA.
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
549 |(uint16_t)((uint16_t)noteA.
duration << ADI_BEEP_TONE_DUR_BITPOS) );
551 pReg->TONEB = ( (uint16_t)((uint16_t)noteB.
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
552 |(uint16_t)((uint16_t)noteB.
duration << ADI_BEEP_TONE_DUR_BITPOS) );
555 pReg->CFG |= (BITM_BEEP_CFG_EN | BITM_BEEP_CFG_SEQATENDIRQ |(uint16_t)((uint16_t)count << BITP_BEEP_CFG_SEQREPEAT));
558 pDevice->pData->state |= (ADI_BEEP_STATE_PLAYING);
559 ADI_EXIT_CRITICAL_REGION();
584 ADI_BEEP_DRIVER *pDevice;
585 ADI_BEEP_TypeDef *pReg;
586 ADI_INT_STATUS_ALLOC();
588 pDevice = (ADI_BEEP_DRIVER*)hDevice;
589 pReg = pDevice->pReg;
592 if (ADI_BEEP_INVALID_HANDLE(hDevice)) {
596 if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) {
601 ADI_ENTER_CRITICAL_REGION();
605 pReg->CFG |= BITM_BEEP_CFG_EN;
606 pDevice->pData->state |= (ADI_BEEP_STATE_PLAYING);
609 pReg->CFG &= (uint16_t)~(BITM_BEEP_CFG_EN);
610 pDevice->pData->state &= ~(ADI_BEEP_STATE_PLAYING);
613 ADI_EXIT_CRITICAL_REGION();
635 ADI_BEEP_DRIVER *pDevice;
637 ADI_INT_STATUS_ALLOC();
639 pDevice = (ADI_BEEP_DRIVER*)hDevice;
642 if (ADI_BEEP_INVALID_HANDLE(hDevice)) {
646 if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) {
651 ADI_ENTER_CRITICAL_REGION();
653 if((pDevice->pData->state | ADI_BEEP_STATE_PLAYING) > 0u) {
655 pDevice->pData->state |= ADI_BEEP_STATE_BLOCKED;
659 ADI_EXIT_CRITICAL_REGION();
673 void Beep_Int_Handler(
void)
676 #if ADI_BEEP_INCLUDE_PLAY_SEQUENCE == 1 677 ADI_BEEP_DEV_DATA *pData;
681 ADI_BEEP_TypeDef *pReg = pDevice->pReg;
682 uint16_t fired = ADI_BEEP_ALL_INTERRUPTS;
683 register uint16_t candidate;
686 if (ADI_BEEP_STATE_UNINITIALIZED != pDevice->pData->state) {
689 candidate = pReg->CFG & ADI_BEEP_ALL_INTERRUPTS;
691 candidate = candidate & pReg->STAT;
696 if((candidate & (BITM_BEEP_CFG_SEQATENDIRQ | BITM_BEEP_CFG_AENDIRQ)) > 0u) {
699 if((pDevice->pData->state | ADI_BEEP_STATE_BLOCKED) > 0u) {
700 SEM_POST(pDevice->pData);
704 pDevice->pData->state &= ~(ADI_BEEP_STATE_PLAYING | ADI_BEEP_STATE_BLOCKED);
707 pReg->CFG &= (uint16_t)(~(BITM_BEEP_CFG_EN));
711 if (pDevice->pData->cbFunc != NULL) {
712 pDevice->pData->cbFunc (pDevice->pData->cbParam, (uint32_t)candidate, NULL);
716 #if ADI_BEEP_INCLUDE_PLAY_SEQUENCE == 1 719 if ((BITM_BEEP_CFG_BSTARTIRQ & candidate) != 0u) {
722 pData = pDevice->pData;
725 if(pData->nSeqIndex < pData->nSeqMax) {
727 noteA = (*pData->pSeqArray)[pData->nSeqIndex];
729 noteB = (*pData->pSeqArray)[pData->nSeqIndex];
734 pReg->TONEA = ( (uint16_t)((uint16_t)noteA.
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
735 | (uint16_t)((uint16_t)noteA.
duration << ADI_BEEP_TONE_DUR_BITPOS) );
737 pReg->TONEB = ( (uint16_t)((uint16_t)noteB.
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
738 | (uint16_t)((uint16_t)noteB.
duration << ADI_BEEP_TONE_DUR_BITPOS) );
745 pReg->STAT |= (uint16_t)(fired & ADI_BEEP_ALL_INTERRUPTS);
ADI_BEEP_RESULT adi_beep_PlayNote(ADI_BEEP_HANDLE const hDevice, ADI_BEEP_NOTE note)
Play a single note/beep.
ADI_BEEP_RESULT adi_beep_Open(ADI_BEEP_DEV_ID const DeviceNum, void *const pMemory, uint32_t const MemorySize, ADI_BEEP_HANDLE *const phDevice)
BEEP Initialization.
ADI_BEEP_NOTE_FREQUENCY frequency
#define ADI_BEEP_TONEB_FREQUENCY
ADI_BEEP_NOTE_DURATION duration
#define ADI_BEEP_TONEA_DURATION
ADI_BEEP_RESULT adi_beep_PlaySequence(ADI_BEEP_HANDLE const hDevice, ADI_BEEP_NOTE aSequence[], uint8_t count)
Play a beeper tone sequence.
#define ADI_BEEP_TONEB_DURATION
ADI_BEEP_RESULT adi_beep_PlayTwoTone(ADI_BEEP_HANDLE const hDevice, ADI_BEEP_NOTE noteA, ADI_BEEP_NOTE noteB, uint8_t count)
Play a a repeating two-tone beep. Similar to an alarm.
#define ADI_BEEP_CFG_SEQUENCE_REPEAT_VALUE
ADI_BEEP_RESULT adi_beep_Wait(ADI_BEEP_HANDLE const hDevice)
Wait for the current playback to finish. This is a blocking call, that will not return until the curr...
ADI_BEEP_RESULT adi_beep_Close(ADI_BEEP_HANDLE const hDevice)
Uninitialize and deallocate a BEEP device.
ADI_BEEP_RESULT adi_beep_RegisterCallback(ADI_BEEP_HANDLE const hDevice, ADI_CALLBACK pfCallback, void *const pCBParam)
Register a callback for the beeper driver.
ADI_BEEP_DEV_ID
Beeper Device IDs.
#define ADI_BEEP_TONEA_FREQUENCY
#define ADI_BEEP_TONEA_DISABLE
ADI_BEEP_RESULT adi_beep_Enable(ADI_BEEP_HANDLE const hDevice, bool const bFlag)
Enable or disable the beeper. Other APIs will automatically enable the beeper if required, so this function is best used in the following situations:
#define ADI_BEEP_TONEB_DISABLE