mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
Finally commit FS#5111 - piezo clicker for ipods!
Origional implementation by Robert Keevil with contributions from Frederik Vestre, Stoyan Stratev, Craig Elliott, Michael Sparmann, Thomas Schott, Rosso Maltese, and syncs from a bunch of other people! git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30995 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
b7508a766d
commit
be716c0be8
20 changed files with 481 additions and 2 deletions
|
@ -270,3 +270,7 @@ recording_digital
|
||||||
#if MEMORYSIZE <= 2
|
#if MEMORYSIZE <= 2
|
||||||
lowmem
|
lowmem
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_HARDWARE_CLICK)
|
||||||
|
hardware_click
|
||||||
|
#endif
|
||||||
|
|
|
@ -12917,3 +12917,37 @@
|
||||||
*: "Shortcuts"
|
*: "Shortcuts"
|
||||||
</voice>
|
</voice>
|
||||||
</phrase>
|
</phrase>
|
||||||
|
<phrase>
|
||||||
|
id: LANG_KEYCLICK_SOFTWARE
|
||||||
|
desc: in keyclick settings menu
|
||||||
|
user: core
|
||||||
|
<source>
|
||||||
|
*: none
|
||||||
|
hardware_click: "Headphone Keyclick"
|
||||||
|
</source>
|
||||||
|
<dest>
|
||||||
|
*: none
|
||||||
|
hardware_click: "Headphone Keyclick"
|
||||||
|
</dest>
|
||||||
|
<voice>
|
||||||
|
*: none
|
||||||
|
hardware_click: "Headphone Keyclick"
|
||||||
|
</voice>
|
||||||
|
</phrase>
|
||||||
|
<phrase>
|
||||||
|
id: LANG_KEYCLICK_HARDWARE
|
||||||
|
desc: in keyclick settings menu
|
||||||
|
user: core
|
||||||
|
<source>
|
||||||
|
*: none
|
||||||
|
hardware_click: "Speaker Keyclick"
|
||||||
|
</source>
|
||||||
|
<dest>
|
||||||
|
*: none
|
||||||
|
hardware_click: "Speaker Keyclick"
|
||||||
|
</dest>
|
||||||
|
<voice>
|
||||||
|
*: none
|
||||||
|
hardware_click: "Speaker Keyclick"
|
||||||
|
</voice>
|
||||||
|
</phrase>
|
||||||
|
|
|
@ -118,6 +118,10 @@
|
||||||
#include "m5636.h"
|
#include "m5636.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_HARDWARE_CLICK
|
||||||
|
#include "piezo.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if (CONFIG_PLATFORM & PLATFORM_NATIVE)
|
#if (CONFIG_PLATFORM & PLATFORM_NATIVE)
|
||||||
#define MAIN_NORETURN_ATTR NORETURN_ATTR
|
#define MAIN_NORETURN_ATTR NORETURN_ATTR
|
||||||
#else
|
#else
|
||||||
|
@ -507,6 +511,10 @@ static void init(void)
|
||||||
radio_init();
|
radio_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_HARDWARE_CLICK
|
||||||
|
piezo_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Keep the order of this 3 (viewportmanager handles statusbars)
|
/* Keep the order of this 3 (viewportmanager handles statusbars)
|
||||||
* Must be done before any code uses the multi-screen API */
|
* Must be done before any code uses the multi-screen API */
|
||||||
CHART(">gui_syncstatusbar_init");
|
CHART(">gui_syncstatusbar_init");
|
||||||
|
|
|
@ -229,9 +229,15 @@ MAKE_MENU(limits_menu, ID2P(LANG_LIMITS_MENU), 0, Icon_NOICON,
|
||||||
#if CONFIG_CODEC == SWCODEC
|
#if CONFIG_CODEC == SWCODEC
|
||||||
MENUITEM_SETTING(keyclick, &global_settings.keyclick, NULL);
|
MENUITEM_SETTING(keyclick, &global_settings.keyclick, NULL);
|
||||||
MENUITEM_SETTING(keyclick_repeats, &global_settings.keyclick_repeats, NULL);
|
MENUITEM_SETTING(keyclick_repeats, &global_settings.keyclick_repeats, NULL);
|
||||||
|
#ifdef HAVE_HARDWARE_CLICK
|
||||||
|
MENUITEM_SETTING(keyclick_hardware, &global_settings.keyclick_hardware, NULL);
|
||||||
|
MAKE_MENU(keyclick_menu, ID2P(LANG_KEYCLICK), 0, Icon_NOICON,
|
||||||
|
&keyclick, &keyclick_hardware, &keyclick_repeats);
|
||||||
|
#else
|
||||||
MAKE_MENU(keyclick_menu, ID2P(LANG_KEYCLICK), 0, Icon_NOICON,
|
MAKE_MENU(keyclick_menu, ID2P(LANG_KEYCLICK), 0, Icon_NOICON,
|
||||||
&keyclick, &keyclick_repeats);
|
&keyclick, &keyclick_repeats);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if CONFIG_CODEC == MAS3507D
|
#if CONFIG_CODEC == MAS3507D
|
||||||
|
|
26
apps/misc.c
26
apps/misc.c
|
@ -94,6 +94,10 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_HARDWARE_CLICK
|
||||||
|
#include "piezo.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* units used with output_dyn_value */
|
/* units used with output_dyn_value */
|
||||||
const unsigned char * const byte_units[] =
|
const unsigned char * const byte_units[] =
|
||||||
{
|
{
|
||||||
|
@ -873,14 +877,32 @@ void system_sound_play(enum system_sound sound)
|
||||||
void keyclick_click(int button)
|
void keyclick_click(int button)
|
||||||
{
|
{
|
||||||
/* Settings filters */
|
/* Settings filters */
|
||||||
if (global_settings.keyclick &&
|
if (
|
||||||
(global_settings.keyclick_repeats || !(button & BUTTON_REPEAT)))
|
#ifdef HAVE_HARDWARE_CLICK
|
||||||
|
(global_settings.keyclick || global_settings.keyclick_hardware)
|
||||||
|
#else
|
||||||
|
global_settings.keyclick
|
||||||
|
#endif
|
||||||
|
&& (global_settings.keyclick_repeats || !(button & BUTTON_REPEAT)))
|
||||||
{
|
{
|
||||||
/* Button filters */
|
/* Button filters */
|
||||||
if (button != BUTTON_NONE && !(button & BUTTON_REL)
|
if (button != BUTTON_NONE && !(button & BUTTON_REL)
|
||||||
&& !(button & (SYS_EVENT|BUTTON_MULTIMEDIA)) )
|
&& !(button & (SYS_EVENT|BUTTON_MULTIMEDIA)) )
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_HARDWARE_CLICK
|
||||||
|
if (global_settings.keyclick)
|
||||||
|
{
|
||||||
|
system_sound_play(SOUND_KEYCLICK);
|
||||||
|
}
|
||||||
|
if (global_settings.keyclick_hardware)
|
||||||
|
{
|
||||||
|
#if !defined(SIMULATOR)
|
||||||
|
piezo_button_beep(false, false);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#else
|
||||||
system_sound_play(SOUND_KEYCLICK);
|
system_sound_play(SOUND_KEYCLICK);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -835,6 +835,13 @@ struct user_settings
|
||||||
#endif
|
#endif
|
||||||
} hw_eq_bands[AUDIOHW_EQ_BAND_NUM];
|
} hw_eq_bands[AUDIOHW_EQ_BAND_NUM];
|
||||||
#endif /* AUDIOHW_HAVE_EQ */
|
#endif /* AUDIOHW_HAVE_EQ */
|
||||||
|
|
||||||
|
#ifdef HAVE_HARDWARE_CLICK
|
||||||
|
#if CONFIG_CODEC == SWCODEC
|
||||||
|
bool keyclick_hardware; /* hardware piezo keyclick */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
char start_directory[MAX_PATHNAME+1];
|
char start_directory[MAX_PATHNAME+1];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1757,12 +1757,23 @@ const struct settings_list settings[] = {
|
||||||
#endif /* HAVE_WHEEL_ACCELERATION */
|
#endif /* HAVE_WHEEL_ACCELERATION */
|
||||||
#if CONFIG_CODEC == SWCODEC
|
#if CONFIG_CODEC == SWCODEC
|
||||||
/* keyclick */
|
/* keyclick */
|
||||||
|
#ifdef HAVE_HARDWARE_CLICK
|
||||||
|
CHOICE_SETTING(0, keyclick, LANG_KEYCLICK_SOFTWARE, 0,
|
||||||
|
"keyclick", "off,weak,moderate,strong", NULL, 4,
|
||||||
|
ID2P(LANG_OFF), ID2P(LANG_WEAK), ID2P(LANG_MODERATE),
|
||||||
|
ID2P(LANG_STRONG)),
|
||||||
|
OFFON_SETTING(0, keyclick_repeats, LANG_KEYCLICK_REPEATS, false,
|
||||||
|
"keyclick repeats", NULL),
|
||||||
|
OFFON_SETTING(0, keyclick_hardware, LANG_KEYCLICK_HARDWARE, false,
|
||||||
|
"hardware keyclick", NULL),
|
||||||
|
#else
|
||||||
CHOICE_SETTING(0, keyclick, LANG_KEYCLICK, 0,
|
CHOICE_SETTING(0, keyclick, LANG_KEYCLICK, 0,
|
||||||
"keyclick", "off,weak,moderate,strong", NULL, 4,
|
"keyclick", "off,weak,moderate,strong", NULL, 4,
|
||||||
ID2P(LANG_OFF), ID2P(LANG_WEAK), ID2P(LANG_MODERATE),
|
ID2P(LANG_OFF), ID2P(LANG_WEAK), ID2P(LANG_MODERATE),
|
||||||
ID2P(LANG_STRONG)),
|
ID2P(LANG_STRONG)),
|
||||||
OFFON_SETTING(0, keyclick_repeats, LANG_KEYCLICK_REPEATS, false,
|
OFFON_SETTING(0, keyclick_repeats, LANG_KEYCLICK_REPEATS, false,
|
||||||
"keyclick repeats", NULL),
|
"keyclick repeats", NULL),
|
||||||
|
#endif
|
||||||
#endif /* CONFIG_CODEC == SWCODEC */
|
#endif /* CONFIG_CODEC == SWCODEC */
|
||||||
TEXT_SETTING(0, playlist_catalog_dir, "playlist catalog directory",
|
TEXT_SETTING(0, playlist_catalog_dir, "playlist catalog directory",
|
||||||
PLAYLIST_CATALOG_DEFAULT_DIR, NULL, NULL),
|
PLAYLIST_CATALOG_DEFAULT_DIR, NULL, NULL),
|
||||||
|
|
|
@ -1160,6 +1160,7 @@ target/arm/ata-pp5020.c
|
||||||
target/arm/ipod/adc-ipod-pcf.c
|
target/arm/ipod/adc-ipod-pcf.c
|
||||||
target/arm/ipod/backlight-4g_color.c
|
target/arm/ipod/backlight-4g_color.c
|
||||||
target/arm/ipod/button-clickwheel.c
|
target/arm/ipod/button-clickwheel.c
|
||||||
|
target/arm/ipod/piezo.c
|
||||||
target/arm/ipod/lcd-as-gray.S
|
target/arm/ipod/lcd-as-gray.S
|
||||||
target/arm/ipod/lcd-gray.c
|
target/arm/ipod/lcd-gray.c
|
||||||
target/arm/ipod/power-ipod.c
|
target/arm/ipod/power-ipod.c
|
||||||
|
@ -1178,6 +1179,7 @@ target/arm/i2s-pp.c
|
||||||
target/arm/ipod/adc-ipod-pcf.c
|
target/arm/ipod/adc-ipod-pcf.c
|
||||||
target/arm/ipod/backlight-4g_color.c
|
target/arm/ipod/backlight-4g_color.c
|
||||||
target/arm/ipod/button-clickwheel.c
|
target/arm/ipod/button-clickwheel.c
|
||||||
|
target/arm/ipod/piezo.c
|
||||||
target/arm/ipod/lcd-color_nano.c
|
target/arm/ipod/lcd-color_nano.c
|
||||||
target/arm/ipod/lcd-as-color-nano.S
|
target/arm/ipod/lcd-as-color-nano.S
|
||||||
target/arm/ipod/power-ipod.c
|
target/arm/ipod/power-ipod.c
|
||||||
|
@ -1196,6 +1198,7 @@ target/arm/i2s-pp.c
|
||||||
target/arm/ipod/adc-ipod-pcf.c
|
target/arm/ipod/adc-ipod-pcf.c
|
||||||
target/arm/ipod/backlight-nano_video.c
|
target/arm/ipod/backlight-nano_video.c
|
||||||
target/arm/ipod/button-clickwheel.c
|
target/arm/ipod/button-clickwheel.c
|
||||||
|
target/arm/ipod/piezo.c
|
||||||
target/arm/ipod/lcd-color_nano.c
|
target/arm/ipod/lcd-color_nano.c
|
||||||
target/arm/ipod/lcd-as-color-nano.S
|
target/arm/ipod/lcd-as-color-nano.S
|
||||||
target/arm/ipod/power-ipod.c
|
target/arm/ipod/power-ipod.c
|
||||||
|
@ -1214,6 +1217,7 @@ target/arm/i2s-pp.c
|
||||||
target/arm/ipod/adc-ipod-pcf.c
|
target/arm/ipod/adc-ipod-pcf.c
|
||||||
target/arm/ipod/backlight-nano_video.c
|
target/arm/ipod/backlight-nano_video.c
|
||||||
target/arm/ipod/button-clickwheel.c
|
target/arm/ipod/button-clickwheel.c
|
||||||
|
target/arm/ipod/piezo.c
|
||||||
target/arm/ipod/power-ipod.c
|
target/arm/ipod/power-ipod.c
|
||||||
target/arm/ipod/powermgmt-ipod-pcf.c
|
target/arm/ipod/powermgmt-ipod-pcf.c
|
||||||
target/arm/ipod/video/lcd-as-video.S
|
target/arm/ipod/video/lcd-as-video.S
|
||||||
|
@ -1268,6 +1272,7 @@ target/arm/i2s-pp.c
|
||||||
target/arm/ipod/adc-ipod-pcf.c
|
target/arm/ipod/adc-ipod-pcf.c
|
||||||
target/arm/ipod/backlight-mini1g_mini2g.c
|
target/arm/ipod/backlight-mini1g_mini2g.c
|
||||||
target/arm/ipod/button-mini1g.c
|
target/arm/ipod/button-mini1g.c
|
||||||
|
target/arm/ipod/piezo.c
|
||||||
target/arm/ipod/lcd-as-gray.S
|
target/arm/ipod/lcd-as-gray.S
|
||||||
target/arm/ipod/lcd-gray.c
|
target/arm/ipod/lcd-gray.c
|
||||||
target/arm/ipod/power-ipod.c
|
target/arm/ipod/power-ipod.c
|
||||||
|
@ -1286,6 +1291,7 @@ target/arm/i2s-pp.c
|
||||||
target/arm/ipod/adc-ipod-pcf.c
|
target/arm/ipod/adc-ipod-pcf.c
|
||||||
target/arm/ipod/backlight-mini1g_mini2g.c
|
target/arm/ipod/backlight-mini1g_mini2g.c
|
||||||
target/arm/ipod/button-clickwheel.c
|
target/arm/ipod/button-clickwheel.c
|
||||||
|
target/arm/ipod/piezo.c
|
||||||
target/arm/ipod/lcd-as-gray.S
|
target/arm/ipod/lcd-as-gray.S
|
||||||
target/arm/ipod/lcd-gray.c
|
target/arm/ipod/lcd-gray.c
|
||||||
target/arm/ipod/power-ipod.c
|
target/arm/ipod/power-ipod.c
|
||||||
|
@ -1639,6 +1645,7 @@ target/arm/s5l8700/pcm-s5l8700.c
|
||||||
target/arm/s5l8700/wmcodec-s5l8700.c
|
target/arm/s5l8700/wmcodec-s5l8700.c
|
||||||
target/arm/s5l8700/ipodnano2g/audio-nano2g.c
|
target/arm/s5l8700/ipodnano2g/audio-nano2g.c
|
||||||
target/arm/s5l8700/ipodnano2g/adc-nano2g.c
|
target/arm/s5l8700/ipodnano2g/adc-nano2g.c
|
||||||
|
target/arm/s5l8700/ipodnano2g/piezo-nano2g.c
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -212,6 +212,8 @@
|
||||||
/* Define this if you can read an absolute wheel position */
|
/* Define this if you can read an absolute wheel position */
|
||||||
#define HAVE_WHEEL_POSITION
|
#define HAVE_WHEEL_POSITION
|
||||||
|
|
||||||
|
#define HAVE_HARDWARE_CLICK
|
||||||
|
|
||||||
#define BOOTFILE_EXT "ipod"
|
#define BOOTFILE_EXT "ipod"
|
||||||
#define BOOTFILE "rockbox." BOOTFILE_EXT
|
#define BOOTFILE "rockbox." BOOTFILE_EXT
|
||||||
#define BOOTDIR "/.rockbox"
|
#define BOOTDIR "/.rockbox"
|
||||||
|
|
|
@ -199,6 +199,8 @@
|
||||||
/* Define this if you can read an absolute wheel position */
|
/* Define this if you can read an absolute wheel position */
|
||||||
#define HAVE_WHEEL_POSITION
|
#define HAVE_WHEEL_POSITION
|
||||||
|
|
||||||
|
#define HAVE_HARDWARE_CLICK
|
||||||
|
|
||||||
#define BOOTFILE_EXT "ipod"
|
#define BOOTFILE_EXT "ipod"
|
||||||
#define BOOTFILE "rockbox." BOOTFILE_EXT
|
#define BOOTFILE "rockbox." BOOTFILE_EXT
|
||||||
#define BOOTDIR "/.rockbox"
|
#define BOOTDIR "/.rockbox"
|
||||||
|
|
|
@ -202,6 +202,8 @@
|
||||||
/* Define this if you have adjustable CPU frequency */
|
/* Define this if you have adjustable CPU frequency */
|
||||||
#define HAVE_ADJUSTABLE_CPU_FREQ
|
#define HAVE_ADJUSTABLE_CPU_FREQ
|
||||||
|
|
||||||
|
#define HAVE_HARDWARE_CLICK
|
||||||
|
|
||||||
#define BOOTFILE_EXT "ipod"
|
#define BOOTFILE_EXT "ipod"
|
||||||
#define BOOTFILE "rockbox." BOOTFILE_EXT
|
#define BOOTFILE "rockbox." BOOTFILE_EXT
|
||||||
#define BOOTDIR "/.rockbox"
|
#define BOOTDIR "/.rockbox"
|
||||||
|
|
|
@ -205,6 +205,8 @@
|
||||||
/* Define this if you can read an absolute wheel position */
|
/* Define this if you can read an absolute wheel position */
|
||||||
#define HAVE_WHEEL_POSITION
|
#define HAVE_WHEEL_POSITION
|
||||||
|
|
||||||
|
#define HAVE_HARDWARE_CLICK
|
||||||
|
|
||||||
#define BOOTFILE_EXT "ipod"
|
#define BOOTFILE_EXT "ipod"
|
||||||
#define BOOTFILE "rockbox." BOOTFILE_EXT
|
#define BOOTFILE "rockbox." BOOTFILE_EXT
|
||||||
#define BOOTDIR "/.rockbox"
|
#define BOOTDIR "/.rockbox"
|
||||||
|
|
|
@ -199,6 +199,8 @@
|
||||||
/* Define this if you can read an absolute wheel position */
|
/* Define this if you can read an absolute wheel position */
|
||||||
#define HAVE_WHEEL_POSITION
|
#define HAVE_WHEEL_POSITION
|
||||||
|
|
||||||
|
#define HAVE_HARDWARE_CLICK
|
||||||
|
|
||||||
#define BOOTFILE_EXT "ipod"
|
#define BOOTFILE_EXT "ipod"
|
||||||
#define BOOTFILE "rockbox." BOOTFILE_EXT
|
#define BOOTFILE "rockbox." BOOTFILE_EXT
|
||||||
#define BOOTDIR "/.rockbox"
|
#define BOOTDIR "/.rockbox"
|
||||||
|
|
|
@ -191,6 +191,8 @@
|
||||||
/* Define this if you can read an absolute wheel position */
|
/* Define this if you can read an absolute wheel position */
|
||||||
#define HAVE_WHEEL_POSITION
|
#define HAVE_WHEEL_POSITION
|
||||||
|
|
||||||
|
#define HAVE_HARDWARE_CLICK
|
||||||
|
|
||||||
/* Define this if you have adjustable CPU frequency */
|
/* Define this if you have adjustable CPU frequency */
|
||||||
#define HAVE_ADJUSTABLE_CPU_FREQ
|
#define HAVE_ADJUSTABLE_CPU_FREQ
|
||||||
|
|
||||||
|
|
|
@ -218,6 +218,8 @@
|
||||||
/* Define this if you can read an absolute wheel position */
|
/* Define this if you can read an absolute wheel position */
|
||||||
#define HAVE_WHEEL_POSITION
|
#define HAVE_WHEEL_POSITION
|
||||||
|
|
||||||
|
#define HAVE_HARDWARE_CLICK
|
||||||
|
|
||||||
/* define this if the device has larger sectors when accessed via USB */
|
/* define this if the device has larger sectors when accessed via USB */
|
||||||
/* (only relevant in disk.c, fat.c now always supports large virtual sectors) */
|
/* (only relevant in disk.c, fat.c now always supports large virtual sectors) */
|
||||||
#define MAX_LOG_SECTOR_SIZE 2048
|
#define MAX_LOG_SECTOR_SIZE 2048
|
||||||
|
|
|
@ -65,10 +65,18 @@
|
||||||
#if CONFIG_CODEC == SWCODEC
|
#if CONFIG_CODEC == SWCODEC
|
||||||
|
|
||||||
#ifdef HAVE_RECORDING
|
#ifdef HAVE_RECORDING
|
||||||
|
#ifdef HAVE_HARDWARE_CLICK
|
||||||
|
#define BASETHREADS 18
|
||||||
|
#else
|
||||||
|
#define BASETHREADS 17
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_HARDWARE_CLICK
|
||||||
#define BASETHREADS 17
|
#define BASETHREADS 17
|
||||||
#else
|
#else
|
||||||
#define BASETHREADS 16
|
#define BASETHREADS 16
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define BASETHREADS 11
|
#define BASETHREADS 11
|
||||||
|
|
209
firmware/target/arm/ipod/piezo.c
Normal file
209
firmware/target/arm/ipod/piezo.c
Normal file
|
@ -0,0 +1,209 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* __________ __ ___.
|
||||||
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
|
* \/ \/ \/ \/ \/
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006-2007 Robert Keevil
|
||||||
|
*
|
||||||
|
* All files in this archive are subject to the GNU General Public License.
|
||||||
|
* See the file COPYING in the source tree root for full license agreement.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "thread.h"
|
||||||
|
#include "system.h"
|
||||||
|
#include "kernel.h"
|
||||||
|
#include "usb.h"
|
||||||
|
#include "logf.h"
|
||||||
|
#include "piezo.h"
|
||||||
|
|
||||||
|
static long piezo_stack[DEFAULT_STACK_SIZE/sizeof(long)];
|
||||||
|
static const char piezo_thread_name[] = "piezo";
|
||||||
|
static struct event_queue piezo_queue;
|
||||||
|
static unsigned int duration;
|
||||||
|
static bool beeping;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
Q_PIEZO_BEEP = 1,
|
||||||
|
Q_PIEZO_BEEP_FOR_TICK,
|
||||||
|
Q_PIEZO_BEEP_FOR_USEC,
|
||||||
|
Q_PIEZO_STOP
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void piezo_hw_init(void)
|
||||||
|
{
|
||||||
|
#ifndef SIMULATOR
|
||||||
|
/*logf("PIEZO: hw_init");*/
|
||||||
|
outl(inl(0x70000010) & ~0xc, 0x70000010);
|
||||||
|
outl(inl(0x6000600c) | 0x20000, 0x6000600c); /* enable device */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void piezo_hw_tick(unsigned int form_and_period)
|
||||||
|
{
|
||||||
|
#ifndef SIMULATOR
|
||||||
|
outl(0x80000000 | form_and_period, 0x7000a000); /* set pitch */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void piezo_hw_stop(void)
|
||||||
|
{
|
||||||
|
#ifndef SIMULATOR
|
||||||
|
outl(0x0, 0x7000a000); /* piezo off */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void piezo_thread(void)
|
||||||
|
{
|
||||||
|
struct queue_event ev;
|
||||||
|
long piezo_usec_off;
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
queue_wait(&piezo_queue, &ev);
|
||||||
|
switch(ev.id)
|
||||||
|
{
|
||||||
|
case Q_PIEZO_BEEP:
|
||||||
|
piezo_hw_tick((unsigned int)ev.data);
|
||||||
|
beeping = true;
|
||||||
|
break;
|
||||||
|
case Q_PIEZO_BEEP_FOR_TICK:
|
||||||
|
piezo_hw_tick((unsigned int)ev.data);
|
||||||
|
beeping = true;
|
||||||
|
sleep(duration);
|
||||||
|
if (beeping)
|
||||||
|
piezo_hw_stop();
|
||||||
|
beeping = false;
|
||||||
|
/* remove anything that appeared while sleeping */
|
||||||
|
queue_clear(&piezo_queue);
|
||||||
|
break;
|
||||||
|
case Q_PIEZO_BEEP_FOR_USEC:
|
||||||
|
piezo_usec_off = USEC_TIMER + duration;
|
||||||
|
piezo_hw_tick((unsigned int)ev.data);
|
||||||
|
beeping = true;
|
||||||
|
while (TIME_BEFORE(USEC_TIMER, piezo_usec_off))
|
||||||
|
if (duration >= 5000) yield();
|
||||||
|
if (beeping)
|
||||||
|
piezo_hw_stop();
|
||||||
|
beeping = false;
|
||||||
|
/* remove anything that appeared while sleeping */
|
||||||
|
queue_clear(&piezo_queue);
|
||||||
|
break;
|
||||||
|
case Q_PIEZO_STOP:
|
||||||
|
if (beeping)
|
||||||
|
piezo_hw_stop();
|
||||||
|
beeping = false;
|
||||||
|
break;
|
||||||
|
#ifndef SIMULATOR
|
||||||
|
case SYS_USB_CONNECTED:
|
||||||
|
/*logf("USB: Piezo core");*/
|
||||||
|
piezo_hw_stop();
|
||||||
|
queue_clear(&piezo_queue);
|
||||||
|
usb_acknowledge(SYS_USB_CONNECTED_ACK);
|
||||||
|
usb_wait_for_disconnect(&piezo_queue);
|
||||||
|
break ;
|
||||||
|
#endif
|
||||||
|
case SYS_TIMEOUT:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
yield();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void piezo_play(unsigned short inv_freq, unsigned char form)
|
||||||
|
{
|
||||||
|
queue_post(&piezo_queue, Q_PIEZO_BEEP,
|
||||||
|
(intptr_t)((unsigned int)form << 16 | inv_freq));
|
||||||
|
}
|
||||||
|
|
||||||
|
void piezo_play_for_tick(unsigned short inv_freq,
|
||||||
|
unsigned char form, unsigned int dur)
|
||||||
|
{
|
||||||
|
duration = dur;
|
||||||
|
queue_post(&piezo_queue, Q_PIEZO_BEEP_FOR_TICK,
|
||||||
|
(intptr_t)((unsigned int)form << 16 | inv_freq));
|
||||||
|
}
|
||||||
|
|
||||||
|
void piezo_play_for_usec(unsigned short inv_freq,
|
||||||
|
unsigned char form, unsigned int dur)
|
||||||
|
{
|
||||||
|
duration = dur;
|
||||||
|
queue_post(&piezo_queue, Q_PIEZO_BEEP_FOR_USEC,
|
||||||
|
(intptr_t)((unsigned int)form << 16 | inv_freq));
|
||||||
|
}
|
||||||
|
|
||||||
|
void piezo_stop(void)
|
||||||
|
{
|
||||||
|
queue_post(&piezo_queue, Q_PIEZO_STOP, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void piezo_clear(void)
|
||||||
|
{
|
||||||
|
queue_clear(&piezo_queue);
|
||||||
|
piezo_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool piezo_busy(void)
|
||||||
|
{
|
||||||
|
return !queue_empty(&piezo_queue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* conversion factor based on the following data
|
||||||
|
|
||||||
|
period Hz
|
||||||
|
10 8547
|
||||||
|
20 4465
|
||||||
|
30 3024
|
||||||
|
40 2286
|
||||||
|
50 1846
|
||||||
|
60 1537
|
||||||
|
70 1320
|
||||||
|
80 1165
|
||||||
|
90 1030
|
||||||
|
100 928
|
||||||
|
|
||||||
|
someone with better recording/analysing equipment should be able
|
||||||
|
to get more accurate figures
|
||||||
|
*/
|
||||||
|
unsigned int piezo_hz(unsigned int hz)
|
||||||
|
{
|
||||||
|
if (hz > 0)
|
||||||
|
return 91225/hz;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void piezo_init(void)
|
||||||
|
{
|
||||||
|
/*logf("PIEZO: init");*/
|
||||||
|
piezo_hw_init();
|
||||||
|
queue_init(&piezo_queue, true);
|
||||||
|
create_thread(piezo_thread, piezo_stack, sizeof(piezo_stack), 0,
|
||||||
|
piezo_thread_name IF_PRIO(, PRIORITY_REALTIME)
|
||||||
|
IF_COP(, CPU));
|
||||||
|
}
|
||||||
|
|
||||||
|
void piezo_button_beep(bool beep, bool force)
|
||||||
|
{
|
||||||
|
/* old on clickwheel action - piezo_play_for_usec(50, 0x80, 400);
|
||||||
|
old on button action - piezo_play_for_usec(50, 0x80, 3000); */
|
||||||
|
|
||||||
|
if (force)
|
||||||
|
piezo_clear();
|
||||||
|
|
||||||
|
if (queue_empty(&piezo_queue))
|
||||||
|
{
|
||||||
|
if (beep)
|
||||||
|
piezo_play_for_tick(40, 0x80, HZ/5);
|
||||||
|
else
|
||||||
|
piezo_play_for_usec(91, 0x80, 4000);
|
||||||
|
}
|
||||||
|
}
|
30
firmware/target/arm/ipod/piezo.h
Normal file
30
firmware/target/arm/ipod/piezo.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* __________ __ ___.
|
||||||
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
|
* \/ \/ \/ \/ \/
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006-2007 Robert Keevil
|
||||||
|
*
|
||||||
|
* All files in this archive are subject to the GNU General Public License.
|
||||||
|
* See the file COPYING in the source tree root for full license agreement.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void piezo_init(void);
|
||||||
|
void piezo_play(unsigned short inv_freq, unsigned char form);
|
||||||
|
void piezo_play_for_tick(unsigned short inv_freq,
|
||||||
|
unsigned char form, unsigned int dur);
|
||||||
|
void piezo_play_for_usec(unsigned short inv_freq,
|
||||||
|
unsigned char form, unsigned int dur);
|
||||||
|
void piezo_stop(void);
|
||||||
|
void piezo_clear(void);
|
||||||
|
bool piezo_busy(void);
|
||||||
|
unsigned int piezo_hz(unsigned int hz);
|
||||||
|
void piezo_button_beep(bool beep, bool force);
|
95
firmware/target/arm/s5l8700/ipodnano2g/piezo-nano2g.c
Normal file
95
firmware/target/arm/s5l8700/ipodnano2g/piezo-nano2g.c
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* __________ __ ___.
|
||||||
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
|
* \/ \/ \/ \/ \/
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006-2007 Robert Keevil
|
||||||
|
*
|
||||||
|
* All files in this archive are subject to the GNU General Public License.
|
||||||
|
* See the file COPYING in the source tree root for full license agreement.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "system.h"
|
||||||
|
#include "kernel.h"
|
||||||
|
#include "piezo.h"
|
||||||
|
|
||||||
|
static unsigned int duration;
|
||||||
|
static bool beeping;
|
||||||
|
|
||||||
|
void INT_TIMERD(void)
|
||||||
|
{
|
||||||
|
/* clear interrupt */
|
||||||
|
TDCON = TDCON;
|
||||||
|
if (!(--duration))
|
||||||
|
{
|
||||||
|
beeping = 0;
|
||||||
|
TDCMD = (1 << 1); /* TD_CLR */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void piezo_start(unsigned short cycles, unsigned short periods)
|
||||||
|
{
|
||||||
|
#ifndef SIMULATOR
|
||||||
|
duration = periods;
|
||||||
|
beeping = 1;
|
||||||
|
/* configure timer for 100 kHz */
|
||||||
|
TDCMD = (1 << 1); /* TD_CLR */
|
||||||
|
TDPRE = 30 - 1; /* prescaler */
|
||||||
|
TDCON = (1 << 13) | /* TD_INT1_EN */
|
||||||
|
(0 << 12) | /* TD_INT0_EN */
|
||||||
|
(0 << 11) | /* TD_START */
|
||||||
|
(2 << 8) | /* TD_CS = PCLK / 16 */
|
||||||
|
(1 << 4); /* TD_MODE_SEL = PWM mode */
|
||||||
|
TDDATA0 = cycles; /* set interval period */
|
||||||
|
TDDATA1 = cycles << 1; /* set interval period */
|
||||||
|
TDCMD = (1 << 0); /* TD_EN */
|
||||||
|
|
||||||
|
/* enable timer interrupt */
|
||||||
|
INTMSK |= INTMSK_TIMERD;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void piezo_stop(void)
|
||||||
|
{
|
||||||
|
#ifndef SIMULATOR
|
||||||
|
TDCMD = (1 << 1); /* TD_CLR */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void piezo_clear(void)
|
||||||
|
{
|
||||||
|
piezo_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool piezo_busy(void)
|
||||||
|
{
|
||||||
|
return beeping;
|
||||||
|
}
|
||||||
|
|
||||||
|
void piezo_init(void)
|
||||||
|
{
|
||||||
|
beeping = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void piezo_button_beep(bool beep, bool force)
|
||||||
|
{
|
||||||
|
if (force)
|
||||||
|
while (beeping)
|
||||||
|
yield();
|
||||||
|
|
||||||
|
if (!beeping)
|
||||||
|
{
|
||||||
|
if (beep)
|
||||||
|
piezo_start(22, 457);
|
||||||
|
else
|
||||||
|
piezo_start(40, 4);
|
||||||
|
}
|
||||||
|
}
|
24
firmware/target/arm/s5l8700/ipodnano2g/piezo.h
Normal file
24
firmware/target/arm/s5l8700/ipodnano2g/piezo.h
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* __________ __ ___.
|
||||||
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
|
* \/ \/ \/ \/ \/
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006-2007 Robert Keevil
|
||||||
|
*
|
||||||
|
* All files in this archive are subject to the GNU General Public License.
|
||||||
|
* See the file COPYING in the source tree root for full license agreement.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void piezo_init(void);
|
||||||
|
void piezo_stop(void);
|
||||||
|
void piezo_clear(void);
|
||||||
|
bool piezo_busy(void);
|
||||||
|
void piezo_button_beep(bool beep, bool force);
|
Loading…
Add table
Add a link
Reference in a new issue