crashtest-r0ket/misc/openbeacon/lpc13xx/openbeacon-sensor/src/sound.c

94 lines
2.2 KiB
C

/***************************************************************
*
* OpenBeacon.org - piezo speaker sound functions
*
* Copyright 2010 Milosch Meriac <meriac@openbeacon.de>
*
***************************************************************
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <openbeacon.h>
#include <sound.h>
#ifdef SOUND_ENABLE
#define ARRAY_COUNT(x) (sizeof(x)/sizeof(x[0]))
void
snd_beep (uint16_t frequency)
{
uint32_t t;
LPC_TMR32B1->TCR = 0;
if (frequency)
{
t = (SYSTEM_CORE_CLOCK / 2) / frequency;
LPC_TMR32B1->MR0 = LPC_TMR32B1->MR1 = t;
if (LPC_TMR32B1->TC >= t)
LPC_TMR32B1->TC = t;
LPC_TMR32B1->TCR = 1;
}
}
static inline uint16_t
snd_get_frequency_for_tone (uint8_t tone)
{
static const uint16_t frequency[] = { 26263, 29366, 32963, 34923, 39200, 44000, 49388 };
return (((uint32_t) frequency[tone % ARRAY_COUNT (frequency)]) * (1 << (tone/ARRAY_COUNT(frequency))))/100;
}
void
snd_tone (uint8_t tone)
{
static uint8_t lasttone = 0;
if (tone != lasttone)
{
if (tone)
{
LPC_SYSCON->SYSAHBCLKCTRL |= EN_CT32B1;
LPC_TMR32B1->EMR = 1 | (0x3 << 4) | (0x3 << 6);
snd_beep (tone ? snd_get_frequency_for_tone (tone - 1) : 0);
}
else
{
LPC_TMR32B1->EMR = 0;
LPC_SYSCON->SYSAHBCLKCTRL &= ~EN_CT32B1;
}
lasttone = tone;
}
}
void
snd_init (void)
{
/* Set sound port to PIO1_1 and PIO1_2 */
LPC_GPIO1->DIR |= 0x6;
LPC_IOCON->JTAG_TDO_PIO1_1 = 3;
LPC_IOCON->JTAG_nTRST_PIO1_2 = 3;
/* run 32 bit timer for sound generation */
LPC_SYSCON->SYSAHBCLKCTRL |= EN_CT32B1;
LPC_TMR32B1->TCR = 2;
LPC_TMR32B1->MCR = 1 << 4;
LPC_TMR32B1->EMR = 0;
}
#endif /*SOUND_ENABLE */