16 #include <adi_processor.h> 21 #include <drivers/beep/adi_beep.h> 22 #include <rtos_map/adi_rtos_map.h> 23 #include "adi_beep_def.h" 62 #pragma diag_suppress=Pm123,Pm073,Pm143,Pm050,Pm140,Pm031,Pm152,Pm141 66 static ADI_BEEP_DRIVER adi_beep_Device[1];
70 void Beep_Int_Handler(
void);
74 #define ADI_BEEP_INVALID_HANDLE(h) (&adi_beep_Device[0] != (h)) 80 #define BEEP_IRQ (BEEP_EVT_IRQn) 82 #if ADI_BEEP_CFG_SEQUENCE_REPEAT_VALUE == 0 84 #define INTERRUPT_ON_SEQEND (0) 85 #define INTERRUPT_ON_AEND (1) 88 #define INTERRUPT_ON_SEQEND (1) 89 #define INTERRUPT_ON_AEND (0) 98 ( (INTERRUPT_ON_SEQEND << BITP_BEEP_CFG_SEQATENDIRQ)
99 | (INTERRUPT_ON_AEND << BITP_BEEP_CFG_AENDIRQ)
104 (ADI_BEEP_ALL_INTERRUPTS),
163 uint32_t
const MemorySize,
166 ADI_BEEP_DRIVER *pDevice;
167 ADI_BEEP_DEV_DATA *pData;
182 assert (MemorySize >=
sizeof(ADI_BEEP_DRIVER));
186 pDevice = &adi_beep_Device[DeviceNum];
187 pDevice->pReg = pADI_BEEP0;
188 pDevice->pData = (ADI_BEEP_DEV_DATA*)pMemory;
189 pData = pDevice->pData;
192 if (ADI_BEEP_STATE_UNINITIALIZED != adi_beep_Device[DeviceNum].pData->state)
198 pData->cbFunc = NULL;
199 pData->cbParam = NULL;
203 ADI_BEEP_STATIC_INIT
const* pInitData = &gBeeperStaticConfigData[DeviceNum];
204 ADI_BEEP_TypeDef *pReg = pDevice->pReg;
206 pReg->CFG = pInitData->BEEP_CFG;
207 pReg->STAT = pInitData->BEEP_STAT;
208 pReg->TONEA = pInitData->BEEP_TONEA;
209 pReg->TONEB = pInitData->BEEP_TONEB;
212 NVIC_EnableIRQ(BEEP_IRQ);
215 pData->state = ADI_BEEP_STATE_INITIALIZED;
241 ADI_BEEP_DRIVER *pDevice;
242 ADI_BEEP_DEV_DATA *pData;
243 ADI_BEEP_TypeDef *pReg;
245 pDevice = (ADI_BEEP_DRIVER*)hDevice;
246 pData = pDevice->pData;
247 pReg = pDevice->pReg;
250 if (ADI_BEEP_INVALID_HANDLE(hDevice))
254 if (ADI_BEEP_STATE_UNINITIALIZED == pData->state)
261 NVIC_DisableIRQ(BEEP_IRQ);
263 pData->state = ADI_BEEP_STATE_UNINITIALIZED;
264 pData->cbFunc = NULL;
294 ADI_CALLBACK pfCallback,
295 void*
const pCBParam)
297 ADI_BEEP_DRIVER *pDevice = (ADI_BEEP_DRIVER*)hDevice;
299 ADI_INT_STATUS_ALLOC();
302 if (ADI_BEEP_INVALID_HANDLE(hDevice)) {
306 if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) {
311 ADI_ENTER_CRITICAL_REGION();
312 pDevice->pData->cbFunc = pfCallback;
313 pDevice->pData->cbParam = pCBParam;
314 ADI_EXIT_CRITICAL_REGION();
320 #if ADI_BEEP_INCLUDE_PLAY_SEQUENCE == 1 349 ADI_BEEP_DRIVER *pDevice = (ADI_BEEP_DRIVER*)hDevice;
350 ADI_BEEP_TypeDef *pReg = pDevice->pReg;
351 uint16_t nSeqCnt = 0u;
353 ADI_INT_STATUS_ALLOC();
356 if (ADI_BEEP_INVALID_HANDLE(hDevice)) {
360 if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) {
364 if (NULL == aSequence) {
371 if (((127u * 2u) < count) ||
372 ((count % 2u) != 0u) ||
380 nSeqCnt = ((uint16_t)count) >> 1u;
382 ADI_ENTER_CRITICAL_REGION();
385 pReg->CFG &= (uint16_t)~(BITM_BEEP_CFG_SEQREPEAT | BITM_BEEP_CFG_AENDIRQ | BITM_BEEP_CFG_EN);
387 pReg->TONEA = ( (uint16_t)((uint16_t)aSequence[0].
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
388 |(uint16_t)((uint16_t)aSequence[0].duration << ADI_BEEP_TONE_DUR_BITPOS) );
390 pReg->TONEB = ( (uint16_t)((uint16_t)aSequence[1].
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
391 |(uint16_t)((uint16_t)aSequence[1].duration << ADI_BEEP_TONE_DUR_BITPOS) );
395 pReg->CFG |= (BITM_BEEP_CFG_EN |
396 BITM_BEEP_CFG_BSTARTIRQ |
397 BITM_BEEP_CFG_SEQATENDIRQ |
398 (uint16_t)((uint16_t)(nSeqCnt) << BITP_BEEP_CFG_SEQREPEAT));
401 pDevice->pData->nSeqMax = count;
402 pDevice->pData->nSeqIndex = 2u;
405 pDevice->pData->state |= (ADI_BEEP_STATE_PLAYING);
407 ADI_EXIT_CRITICAL_REGION();
431 ADI_BEEP_DRIVER *pDevice;
432 ADI_BEEP_TypeDef *pReg;
433 ADI_INT_STATUS_ALLOC();
435 pDevice = (ADI_BEEP_DRIVER*)hDevice;
436 pReg = pDevice->pReg;
439 if (ADI_BEEP_INVALID_HANDLE(hDevice)) {
443 if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) {
448 ADI_ENTER_CRITICAL_REGION();
451 pReg->CFG &= (uint16_t)~(BITM_BEEP_CFG_SEQREPEAT | BITM_BEEP_CFG_EN);
454 pReg->TONEA = ( (uint16_t)((uint16_t)note.
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
455 |(uint16_t)((uint16_t)note.
duration << ADI_BEEP_TONE_DUR_BITPOS) );
458 pReg->CFG |= (BITM_BEEP_CFG_EN | BITM_BEEP_CFG_AENDIRQ);
461 pDevice->pData->state |= (ADI_BEEP_STATE_PLAYING);
462 ADI_EXIT_CRITICAL_REGION();
496 ADI_BEEP_DRIVER *pDevice;
497 ADI_BEEP_TypeDef *pReg;
498 ADI_INT_STATUS_ALLOC();
500 pDevice = (ADI_BEEP_DRIVER*)hDevice;
501 pReg = pDevice->pReg;
504 if (ADI_BEEP_INVALID_HANDLE(hDevice)) {
508 if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) {
513 ADI_ENTER_CRITICAL_REGION();
516 pReg->CFG &= (uint16_t)~(BITM_BEEP_CFG_SEQREPEAT | BITM_BEEP_CFG_AENDIRQ |BITM_BEEP_CFG_EN);
518 pReg->TONEA = ( (uint16_t)((uint16_t)noteA.
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
519 |(uint16_t)((uint16_t)noteA.
duration << ADI_BEEP_TONE_DUR_BITPOS) );
521 pReg->TONEB = ( (uint16_t)((uint16_t)noteB.
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
522 |(uint16_t)((uint16_t)noteB.
duration << ADI_BEEP_TONE_DUR_BITPOS) );
525 pReg->CFG |= (BITM_BEEP_CFG_EN | BITM_BEEP_CFG_SEQATENDIRQ |(uint16_t)((uint16_t)count << BITP_BEEP_CFG_SEQREPEAT));
528 pDevice->pData->state |= (ADI_BEEP_STATE_PLAYING);
529 ADI_EXIT_CRITICAL_REGION();
554 ADI_BEEP_DRIVER *pDevice;
555 ADI_BEEP_TypeDef *pReg;
556 ADI_INT_STATUS_ALLOC();
558 pDevice = (ADI_BEEP_DRIVER*)hDevice;
559 pReg = pDevice->pReg;
562 if (ADI_BEEP_INVALID_HANDLE(hDevice)) {
566 if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) {
571 ADI_ENTER_CRITICAL_REGION();
575 pReg->CFG |= BITM_BEEP_CFG_EN;
576 pDevice->pData->state |= (ADI_BEEP_STATE_PLAYING);
579 pReg->CFG &= (uint16_t)~(BITM_BEEP_CFG_EN);
580 pDevice->pData->state &= ~(ADI_BEEP_STATE_PLAYING);
583 ADI_EXIT_CRITICAL_REGION();
605 ADI_BEEP_DRIVER *pDevice;
607 ADI_INT_STATUS_ALLOC();
609 pDevice = (ADI_BEEP_DRIVER*)hDevice;
612 if (ADI_BEEP_INVALID_HANDLE(hDevice)) {
616 if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) {
621 ADI_ENTER_CRITICAL_REGION();
623 if((pDevice->pData->state | ADI_BEEP_STATE_PLAYING) > 0u) {
625 pDevice->pData->state |= ADI_BEEP_STATE_BLOCKED;
629 ADI_EXIT_CRITICAL_REGION();
643 void Beep_Int_Handler(
void)
646 #if ADI_BEEP_INCLUDE_PLAY_SEQUENCE == 1 647 ADI_BEEP_DEV_DATA *pData;
651 ADI_BEEP_TypeDef *pReg = pDevice->pReg;
652 uint16_t fired = ADI_BEEP_ALL_INTERRUPTS;
653 register uint16_t candidate;
656 if (ADI_BEEP_STATE_UNINITIALIZED != pDevice->pData->state) {
659 candidate = pReg->CFG & ADI_BEEP_ALL_INTERRUPTS;
661 candidate = candidate & pReg->STAT;
666 if((candidate & (BITM_BEEP_CFG_SEQATENDIRQ | BITM_BEEP_CFG_AENDIRQ)) > 0u) {
669 if((pDevice->pData->state | ADI_BEEP_STATE_BLOCKED) > 0u) {
670 SEM_POST(pDevice->pData);
674 pDevice->pData->state &= ~(ADI_BEEP_STATE_PLAYING | ADI_BEEP_STATE_BLOCKED);
677 pReg->CFG &= (uint16_t)(~(BITM_BEEP_CFG_EN));
681 if (pDevice->pData->cbFunc != NULL) {
682 pDevice->pData->cbFunc (pDevice->pData->cbParam, (uint32_t)candidate, NULL);
686 #if ADI_BEEP_INCLUDE_PLAY_SEQUENCE == 1 689 if ((BITM_BEEP_CFG_BSTARTIRQ & candidate) != 0u) {
692 pData = pDevice->pData;
695 if(pData->nSeqIndex < pData->nSeqMax) {
697 noteA = (*pData->pSeqArray)[pData->nSeqIndex];
699 noteB = (*pData->pSeqArray)[pData->nSeqIndex];
704 pReg->TONEA = ( (uint16_t)((uint16_t)noteA.
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
705 | (uint16_t)((uint16_t)noteA.
duration << ADI_BEEP_TONE_DUR_BITPOS) );
707 pReg->TONEB = ( (uint16_t)((uint16_t)noteB.
frequency << ADI_BEEP_TONE_FREQ_BITPOS)
708 | (uint16_t)((uint16_t)noteB.
duration << ADI_BEEP_TONE_DUR_BITPOS) );
715 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,...
#define ADI_BEEP_TONEB_DISABLE