view src/cs/drivers/drv_app/buzzer/pwt.c @ 292:0f688d07b068

block deep sleep on activity in new PWT and vibrator drivers
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 27 Mar 2022 00:29:19 +0000
parents a72feaed133a
children
line wrap: on
line source

/*
 * This C module is a FreeCalypso addition: it implements hw driver functions
 * for Calypso buzzer output in PWT mode.
 */

#include "main/sys_types.h"
#include "pwt.h"
#include "fc-target.h"

#define	ASIC_CONF_REG	(*(volatile SYS_UWORD16 *) 0xFFFEF008)
#define	PWT_MODE_MASK	0x0020

#define	PWT_FRC_REG	(*(volatile SYS_UWORD8 *) 0xFFFE8800)
#define	PWT_VCR_REG	(*(volatile SYS_UWORD8 *) 0xFFFE8801)
#define	PWT_GCR_REG	(*(volatile SYS_UWORD8 *) 0xFFFE8802)

/* flag tells L1 to suppress deep sleep */
SYS_BOOL PWT_tone_is_on;

void PWT_block_on(void)
{
#ifdef TARGET_HAS_BUZZER
	ASIC_CONF_REG |= PWT_MODE_MASK;
	PWT_GCR_REG = 0x01;
#endif
}

void PWT_block_off(void)
{
#ifdef TARGET_HAS_BUZZER
	ASIC_CONF_REG &= ~PWT_MODE_MASK;
	PWT_GCR_REG = 0;
#endif
}

void PWT_play_tone(SYS_UWORD8 note, SYS_UWORD8 volume)
{
#ifdef TARGET_HAS_BUZZER
	PWT_FRC_REG = note;
	PWT_VCR_REG = (volume << 1) | 1;
	PWT_tone_is_on = 1;
#endif
}

void PWT_stop_tone(void)
{
#ifdef TARGET_HAS_BUZZER
	PWT_VCR_REG = 0;
	PWT_tone_is_on = 0;
#endif
}