summaryrefslogtreecommitdiff
path: root/firmware/export
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/export')
-rw-r--r--firmware/export/audio.h106
-rw-r--r--firmware/export/config-h100.h6
-rw-r--r--firmware/export/config-h120.h6
-rw-r--r--firmware/export/config-h300.h7
-rw-r--r--firmware/export/config-iaudiox5.h6
-rw-r--r--firmware/export/id3.h91
-rw-r--r--firmware/export/pcm_playback.h16
-rw-r--r--firmware/export/pcm_record.h46
-rw-r--r--firmware/export/system.h81
-rw-r--r--firmware/export/thread.h3
-rw-r--r--firmware/export/tlv320.h10
-rw-r--r--firmware/export/uda1380.h13
12 files changed, 315 insertions, 76 deletions
diff --git a/firmware/export/audio.h b/firmware/export/audio.h
index 9099cb3765..d3f544de94 100644
--- a/firmware/export/audio.h
+++ b/firmware/export/audio.h
@@ -20,6 +20,20 @@
20#define AUDIO_H 20#define AUDIO_H
21 21
22#include <stdbool.h> 22#include <stdbool.h>
23#include <sys/types.h>
24/* These must always be included with audio.h for this to compile under
25 cetain conditions. Do it here or else spread the complication around to
26 many files. */
27#if CONFIG_CODEC == SWCODEC
28#include "pcm_sampr.h"
29#include "pcm_playback.h"
30#ifdef HAVE_RECORDING
31#include "pcm_record.h"
32#include "id3.h"
33#include "enc_base.h"
34#endif /* HAVE_RECORDING */
35#endif /* CONFIG_CODEC == SWCODEC */
36
23 37
24#ifdef SIMULATOR 38#ifdef SIMULATOR
25#define audio_play(x) sim_audio_play(x) 39#define audio_play(x) sim_audio_play(x)
@@ -31,9 +45,6 @@
31#define AUDIO_STATUS_PRERECORD 8 45#define AUDIO_STATUS_PRERECORD 8
32#define AUDIO_STATUS_ERROR 16 46#define AUDIO_STATUS_ERROR 16
33 47
34#define AUDIO_STATUS_STAYON_FLAGS \
35 (AUDIO_STATUS_PLAY | AUDIO_STATUS_PAUSE | AUDIO_STATUS_RECORD | AUDIO_)
36
37#define AUDIOERR_DISK_FULL 1 48#define AUDIOERR_DISK_FULL 1
38 49
39#define AUDIO_GAIN_LINEIN 0 50#define AUDIO_GAIN_LINEIN 0
@@ -72,10 +83,11 @@ void audio_resume(void);
72void audio_next(void); 83void audio_next(void);
73void audio_prev(void); 84void audio_prev(void);
74int audio_status(void); 85int audio_status(void);
75bool audio_query_poweroff(void); 86#if CONFIG_CODEC == SWCODEC
76int audio_track_count(void); /* SWCODEC only */ 87int audio_track_count(void); /* SWCODEC only */
77long audio_filebufused(void); /* SWCODEC only */ 88long audio_filebufused(void); /* SWCODEC only */
78void audio_pre_ff_rewind(void); /* SWCODEC only */ 89void audio_pre_ff_rewind(void); /* SWCODEC only */
90#endif /* CONFIG_CODEC == SWCODEC */
79void audio_ff_rewind(long newtime); 91void audio_ff_rewind(long newtime);
80void audio_flush_and_reload_tracks(void); 92void audio_flush_and_reload_tracks(void);
81struct mp3entry* audio_current_track(void); 93struct mp3entry* audio_current_track(void);
@@ -89,18 +101,28 @@ void audio_error_clear(void);
89int audio_get_file_pos(void); 101int audio_get_file_pos(void);
90void audio_beep(int duration); 102void audio_beep(int duration);
91void audio_init_playback(void); 103void audio_init_playback(void);
104unsigned char *audio_get_buffer(bool talk_buf, size_t *buffer_size);
92 105
93/* audio recording functions */ 106/* channel modes */
94void audio_init_recording(unsigned int buffer_offset); 107enum rec_channel_modes
95void audio_close_recording(void); 108{
96void audio_record(const char *filename); 109 __CHN_MODE_START_INDEX = -1,
97void audio_stop_recording(void); 110
98void audio_pause_recording(void); 111 CHN_MODE_STEREO,
99void audio_resume_recording(void); 112 CHN_MODE_MONO,
100void audio_new_file(const char *filename); 113
114 CHN_NUM_MODES
115};
116
117#if CONFIG_CODEC == SWCODEC
118/* channel mode capability bits */
119#define CHN_CAP_STEREO (1 << CHN_MODE_STEREO)
120#define CHN_CAP_MONO (1 << CHN_MODE_MONO)
121#define CHN_CAP_ALL (CHN_CAP_STEREO | CHN_CAP_MONO)
122#endif /* CONFIG_CODEC == SWCODEC */
101 123
102/* audio sources */ 124/* audio sources */
103enum 125enum audio_sources
104{ 126{
105 AUDIO_SRC_PLAYBACK = -1, /* for audio playback (default) */ 127 AUDIO_SRC_PLAYBACK = -1, /* for audio playback (default) */
106 AUDIO_SRC_MIC, /* monitor mic */ 128 AUDIO_SRC_MIC, /* monitor mic */
@@ -123,33 +145,57 @@ enum
123 AUDIO_SRC_MAX = AUDIO_NUM_SOURCES-1 145 AUDIO_SRC_MAX = AUDIO_NUM_SOURCES-1
124}; 146};
125 147
126/* channel modes */ 148#ifdef HAVE_RECORDING
127enum 149/* parameters for audio_set_recording_options */
150struct audio_recording_options
128{ 151{
129 CHN_MODE_MONO = 1, 152 int rec_source;
130 CHN_MODE_STEREO, 153 int rec_frequency;
154 int rec_channels;
155 int rec_prerecord_time;
156#if CONFIG_CODEC == SWCODEC
157 int rec_source_flags; /* for rec_set_source */
158 struct encoder_config enc_config;
159#else
160 int rec_quality;
161 bool rec_editable;
162#endif
131}; 163};
132void audio_set_recording_options(int frequency, int quality, 164
133 int source, int channel_mode, 165/* audio recording functions */
134 bool editable, int prerecord_time); 166void audio_init_recording(unsigned int buffer_offset);
167void audio_close_recording(void);
168void audio_record(const char *filename);
169void audio_stop_recording(void);
170void audio_pause_recording(void);
171void audio_resume_recording(void);
172void audio_new_file(const char *filename);
173void audio_set_recording_options(struct audio_recording_options *options);
135void audio_set_recording_gain(int left, int right, int type); 174void audio_set_recording_gain(int left, int right, int type);
136unsigned long audio_recorded_time(void); 175unsigned long audio_recorded_time(void);
137unsigned long audio_num_recorded_bytes(void); 176unsigned long audio_num_recorded_bytes(void);
138#if 0 177
139#ifdef HAVE_SPDIF_POWER
140void audio_set_spdif_power_setting(bool on);
141#endif
142#endif
143unsigned long audio_get_spdif_sample_rate(void);
144unsigned long audio_prev_elapsed(void);
145#if CONFIG_CODEC == SWCODEC 178#if CONFIG_CODEC == SWCODEC
146/* audio encoder functions (defined in playback.c) */ 179/* SWCODEC recoring functions */
147int audio_get_encoder_id(void); 180/* playback.c */
148void audio_load_encoder(int enc_id); 181bool audio_load_encoder(int afmt);
149void audio_remove_encoder(void); 182void audio_remove_encoder(void);
183unsigned char *audio_get_recording_buffer(size_t *buffer_size);
150#endif /* CONFIG_CODEC == SWCODEC */ 184#endif /* CONFIG_CODEC == SWCODEC */
185#endif /* HAVE_RECORDING */
151 186
187#ifdef HAVE_SPDIF_IN
188#ifdef HAVE_SPDIF_POWER
189void audio_set_spdif_power_setting(bool on);
190bool audio_get_spdif_power_setting(void);
191#endif
192/* returns index into rec_master_sampr_list */
193int audio_get_spdif_sample_rate(void);
194/* > 0: monitor EBUin, 0: Monitor IISrecv, <0: reset only */
195void audio_spdif_set_monitor(int monitor_spdif);
196#endif /* HAVE_SPDIF_IN */
152 197
198unsigned long audio_prev_elapsed(void);
153 199
154 200
155/***********************************************************************/ 201/***********************************************************************/
diff --git a/firmware/export/config-h100.h b/firmware/export/config-h100.h
index 6f74078e1e..285ab88930 100644
--- a/firmware/export/config-h100.h
+++ b/firmware/export/config-h100.h
@@ -84,6 +84,12 @@
84/* define this if you have recording possibility */ 84/* define this if you have recording possibility */
85#define HAVE_RECORDING 1 85#define HAVE_RECORDING 1
86 86
87/* define hardware samples rate caps mask */
88#define HW_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
89
90/* define the bitmask of recording sample rates */
91#define REC_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
92
87#define HAVE_AGC 93#define HAVE_AGC
88 94
89#ifndef SIMULATOR 95#ifndef SIMULATOR
diff --git a/firmware/export/config-h120.h b/firmware/export/config-h120.h
index 1476102100..b22ff0eb22 100644
--- a/firmware/export/config-h120.h
+++ b/firmware/export/config-h120.h
@@ -77,6 +77,12 @@
77/* define this if you have recording possibility */ 77/* define this if you have recording possibility */
78#define HAVE_RECORDING 1 78#define HAVE_RECORDING 1
79 79
80/* define hardware samples rate caps mask */
81#define HW_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
82
83/* define the bitmask of recording sample rates */
84#define REC_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
85
80#define HAVE_AGC 86#define HAVE_AGC
81 87
82#define BATTERY_CAPACITY_DEFAULT 1300 /* default battery capacity */ 88#define BATTERY_CAPACITY_DEFAULT 1300 /* default battery capacity */
diff --git a/firmware/export/config-h300.h b/firmware/export/config-h300.h
index 31f0f6729f..748635dcb4 100644
--- a/firmware/export/config-h300.h
+++ b/firmware/export/config-h300.h
@@ -72,6 +72,12 @@
72/* define this if you have recording possibility */ 72/* define this if you have recording possibility */
73#define HAVE_RECORDING 1 73#define HAVE_RECORDING 1
74 74
75/* define hardware samples rate caps mask */
76#define HW_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
77
78/* define the bitmask of recording sample rates */
79#define REC_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
80
75#define HAVE_AGC 81#define HAVE_AGC
76 82
77#define BATTERY_CAPACITY_DEFAULT 1300 /* default battery capacity */ 83#define BATTERY_CAPACITY_DEFAULT 1300 /* default battery capacity */
@@ -157,4 +163,3 @@
157 163
158/* Define this for FM radio input available */ 164/* Define this for FM radio input available */
159#define HAVE_FMRADIO_IN 165#define HAVE_FMRADIO_IN
160
diff --git a/firmware/export/config-iaudiox5.h b/firmware/export/config-iaudiox5.h
index 80b010a6b0..d4c904ed23 100644
--- a/firmware/export/config-iaudiox5.h
+++ b/firmware/export/config-iaudiox5.h
@@ -9,6 +9,12 @@
9/* define this if you have recording possibility */ 9/* define this if you have recording possibility */
10#define HAVE_RECORDING 1 10#define HAVE_RECORDING 1
11 11
12/* define the bitmask of hardware sample rates */
13#define HW_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
14
15/* define the bitmask of recording sample rates */
16#define REC_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
17
12/* define this if you have a bitmap LCD display */ 18/* define this if you have a bitmap LCD display */
13#define HAVE_LCD_BITMAP 1 19#define HAVE_LCD_BITMAP 1
14 20
diff --git a/firmware/export/id3.h b/firmware/export/id3.h
index 1d07affbfa..dd099e0204 100644
--- a/firmware/export/id3.h
+++ b/firmware/export/id3.h
@@ -24,13 +24,19 @@
24#include "file.h" 24#include "file.h"
25 25
26/* Audio file types. */ 26/* Audio file types. */
27enum { 27enum
28{
28 AFMT_UNKNOWN = 0, /* Unknown file format */ 29 AFMT_UNKNOWN = 0, /* Unknown file format */
29 30
31 /* start formats */
32
30 AFMT_MPA_L1, /* MPEG Audio layer 1 */ 33 AFMT_MPA_L1, /* MPEG Audio layer 1 */
31 AFMT_MPA_L2, /* MPEG Audio layer 2 */ 34 AFMT_MPA_L2, /* MPEG Audio layer 2 */
32 AFMT_MPA_L3, /* MPEG Audio layer 3 */ 35 AFMT_MPA_L3, /* MPEG Audio layer 3 */
33 36
37 AFMT_AIFF, /* Audio Interchange File Format */
38
39#if CONFIG_CODEC == SWCODEC
34 AFMT_PCM_WAV, /* Uncompressed PCM in a WAV file */ 40 AFMT_PCM_WAV, /* Uncompressed PCM in a WAV file */
35 AFMT_OGG_VORBIS, /* Ogg Vorbis */ 41 AFMT_OGG_VORBIS, /* Ogg Vorbis */
36 AFMT_FLAC, /* FLAC */ 42 AFMT_FLAC, /* FLAC */
@@ -40,54 +46,91 @@ enum {
40 AFMT_ALAC, /* Apple Lossless Audio Codec */ 46 AFMT_ALAC, /* Apple Lossless Audio Codec */
41 AFMT_AAC, /* Advanced Audio Coding (AAC) in M4A container */ 47 AFMT_AAC, /* Advanced Audio Coding (AAC) in M4A container */
42 AFMT_SHN, /* Shorten */ 48 AFMT_SHN, /* Shorten */
43 AFMT_AIFF, /* Audio Interchange File Format */
44 AFMT_SID, /* SID File Format */ 49 AFMT_SID, /* SID File Format */
45 AFMT_ADX, /* ADX */ 50 AFMT_ADX, /* ADX File Format */
51#endif
46 52
47 /* New formats must be added to the end of this list */ 53 /* add new formats at any index above this line to have a sensible order -
54 specified array index inits are used */
55 /* format arrays defined in id3.c */
48 56
49 AFMT_NUM_CODECS, 57 AFMT_NUM_CODECS,
50 58
51#if CONFIG_CODEC == SWCODEC 59#if CONFIG_CODEC == SWCODEC && defined(HAVE_RECORDING)
52 /* masks to decompose parts */ 60 /* masks to decompose parts */
53 CODEC_AFMT_MASK = 0x0fff, 61 CODEC_AFMT_MASK = 0x0fff,
54 CODEC_TYPE_MASK = 0x7000, 62 CODEC_TYPE_MASK = 0x7000,
55 63
56 /* switch for specifying codec type when requesting a filename */ 64 /* switch for specifying codec type when requesting a filename */
57 CODEC_TYPE_DECODER = (0 << 12), /* default */ 65 CODEC_TYPE_DECODER = (0 << 12), /* default */
58 CODEC_TYPE_ENCODER = (1 << 12) 66 CODEC_TYPE_ENCODER = (1 << 12),
59#endif 67#endif /* CONFIG_CODEC == SWCODEC && defined(HAVE_RECORDING) */
60}; 68};
61 69
62#if CONFIG_CODEC == SWCODEC 70#if CONFIG_CODEC == SWCODEC
63#define AFMT_ENTRY(label, codec_fname, codec_enc_fname, enc_ext) \ 71#define CODEC_EXTENSION "codec"
64 { label, codec_fname, codec_enc_fname, enc_ext } 72
65#else 73#ifdef HAVE_RECORDING
66#define AFMT_ENTRY(label, codec_fname, codec_enc_fname, enc_ext) \ 74#define ENCODER_SUFFIX "_enc"
67 { label } 75enum rec_format_indexes
68#endif 76{
77 __REC_FORMAT_START_INDEX = -1,
78
79 /* start formats */
80
81 REC_FORMAT_PCM_WAV,
82 REC_FORMAT_WAVPACK,
83 REC_FORMAT_MPA_L3,
84
85 /* add new formats at any index above this line to have a sensible order -
86 specified array index inits are used
87 REC_FORMAT_CFG_NUM_BITS should allocate enough bits to hold the range
88 REC_FORMAT_CFG_VALUE_LIST should be in same order as indexes
89 */
90
91 REC_NUM_FORMATS,
92
93 REC_FORMAT_DEFAULT = REC_FORMAT_PCM_WAV,
94 REC_FORMAT_CFG_NUM_BITS = 2
95};
96
97#define REC_FORMAT_CFG_VAL_LIST "wave,wvpk,mpa3"
98
99/* get REC_FORMAT_* corresponding AFMT_* */
100extern const int rec_format_afmt[REC_NUM_FORMATS];
101/* get AFMT_* corresponding REC_FORMAT_* */
102extern const int afmt_rec_format[AFMT_NUM_CODECS];
103
104#define AFMT_ENTRY(label, root_fname, enc_root_fname, ext_list) \
105 { label, root_fname, enc_root_fname, ext_list }
106#else /* !HAVE_RECORDING */
107#define AFMT_ENTRY(label, root_fname, enc_root_fname, ext_list) \
108 { label, root_fname, ext_list }
109#endif /* HAVE_RECORDING */
110#else /* !SWCODEC */
111
112#define AFMT_ENTRY(label, root_fname, enc_root_fname, ext_list) \
113 { label, ext_list }
114#endif /* CONFIG_CODEC == SWCODEC */
69 115
70/* record describing the audio format */ 116/* record describing the audio format */
71struct afmt_entry 117struct afmt_entry
72{ 118{
73#if CONFIG_CODEC == SWCODEC
74 char label[8]; /* format label */ 119 char label[8]; /* format label */
75 char *codec_fn; /* filename of decoder codec */ 120#if CONFIG_CODEC == SWCODEC
76 char *codec_enc_fn; /* filename of encoder codec */ 121 char *codec_root_fn; /* root codec filename (sans _enc and .codec) */
77 char *ext; /* default extension for file (enc only for now) */ 122#ifdef HAVE_RECORDING
78#else 123 char *codec_enc_root_fn; /* filename of encoder codec */
79 char label[4]; 124#endif
80#endif 125#endif
126 char *ext_list; /* double NULL terminated extension
127 list for type with the first as
128 the default for recording */
81}; 129};
82 130
83/* database of labels and codecs. add formats per above enum */ 131/* database of labels and codecs. add formats per above enum */
84extern const struct afmt_entry audio_formats[AFMT_NUM_CODECS]; 132extern const struct afmt_entry audio_formats[AFMT_NUM_CODECS];
85 133
86#if CONFIG_CODEC == SWCODEC
87/* recording quality to AFMT_* */
88extern const int rec_quality_info_afmt[9];
89#endif
90
91struct mp3entry { 134struct mp3entry {
92 char path[MAX_PATH]; 135 char path[MAX_PATH];
93 char* title; 136 char* title;
diff --git a/firmware/export/pcm_playback.h b/firmware/export/pcm_playback.h
index a4cd93969b..9c3e96ba63 100644
--- a/firmware/export/pcm_playback.h
+++ b/firmware/export/pcm_playback.h
@@ -19,11 +19,23 @@
19#ifndef PCM_PLAYBACK_H 19#ifndef PCM_PLAYBACK_H
20#define PCM_PLAYBACK_H 20#define PCM_PLAYBACK_H
21 21
22#include <sys/types.h>
23
24/* Typedef for registered callback (play and record) */
25typedef void (*pcm_more_callback_type)(unsigned char **start,
26 size_t *size);
27
22void pcm_init(void); 28void pcm_init(void);
29
30/* set the pcm frequency - use values in hw_sampr_list
31 * use -1 for the default frequency
32 */
23void pcm_set_frequency(unsigned int frequency); 33void pcm_set_frequency(unsigned int frequency);
34/* apply settings to hardware immediately */
35void pcm_apply_settings(bool reset);
24 36
25/* This is for playing "raw" PCM data */ 37/* This is for playing "raw" PCM data */
26void pcm_play_data(void (*get_more)(unsigned char** start, size_t* size), 38void pcm_play_data(pcm_more_callback_type get_more,
27 unsigned char* start, size_t size); 39 unsigned char* start, size_t size);
28 40
29void pcm_calculate_peaks(int *left, int *right); 41void pcm_calculate_peaks(int *left, int *right);
@@ -35,4 +47,4 @@ void pcm_play_pause(bool play);
35bool pcm_is_paused(void); 47bool pcm_is_paused(void);
36bool pcm_is_playing(void); 48bool pcm_is_playing(void);
37 49
38#endif 50#endif /* PCM_PLAYBACK_H */
diff --git a/firmware/export/pcm_record.h b/firmware/export/pcm_record.h
index b217335340..c1187a4c6c 100644
--- a/firmware/export/pcm_record.h
+++ b/firmware/export/pcm_record.h
@@ -20,24 +20,44 @@
20#ifndef PCM_RECORD_H 20#ifndef PCM_RECORD_H
21#define PCM_RECORD_H 21#define PCM_RECORD_H
22 22
23void enc_set_parameters(int chunk_size, int num_chunks, 23#define DMA_REC_ERROR_DMA ((size_t)-1)
24 int samp_per_chunk, char *head_ptr, int head_size, 24#ifdef HAVE_SPDIF_IN
25 int enc_id); 25#define DMA_REC_ERROR_SPDIF ((size_t)-2)
26void enc_get_inputs(int *buffer_size, int *channels, int *quality); 26#endif
27unsigned int* enc_alloc_chunk(void); 27/* Use AUDIO_SRC_* enumeration values */
28void enc_free_chunk(void); 28void pcm_set_monitor(int monitor);
29int enc_wavbuf_near_empty(void); 29void pcm_set_rec_source(int source);
30char* enc_get_wav_data(int size); 30
31extern void (*enc_set_header_callback)(void *head_buffer, int head_size, 31/**
32 int num_pcm_samples, bool is_file_header); 32 * RAW pcm data recording
33 * These calls are nescessary only when using the raw pcm apis directly.
34 */
35
36/* Initialize pcm recording interface */
37void pcm_init_recording(void);
38/* Uninitialze pcm recording interface */
39void pcm_close_recording(void);
40
41/* Start recording "raw" PCM data */
42void pcm_record_data(pcm_more_callback_type more_ready,
43 unsigned char *start, size_t size);
33 44
45/* Stop tranferring data into supplied buffer */
46void pcm_stop_recording(void);
47
48void pcm_calculate_rec_peaks(int *left, int *right);
49
50/** General functions for high level codec recording **/
51void pcm_rec_error_clear(void);
34unsigned long pcm_rec_status(void); 52unsigned long pcm_rec_status(void);
35void pcm_rec_init(void); 53void pcm_rec_init(void);
36void pcm_rec_mux(int source); 54void pcm_rec_mux(int source);
37int pcm_rec_current_bitrate(void); 55int pcm_rec_current_bitrate(void);
56int pcm_rec_encoder_afmt(void); /* AFMT_* value, AFMT_UNKNOWN if none */
57int pcm_rec_rec_format(void); /* Format index or -1 otherwise */
58unsigned long pcm_rec_sample_rate(void);
38int pcm_get_num_unprocessed(void); 59int pcm_get_num_unprocessed(void);
39void pcm_rec_get_peaks(int *left, int *right);
40 60
41/* audio.h contains audio recording functions */ 61/* audio.h contains audio_* recording functions */
42 62
43#endif 63#endif /* PCM_RECORD_H */
diff --git a/firmware/export/system.h b/firmware/export/system.h
index 4a33d80466..9b90a6e80c 100644
--- a/firmware/export/system.h
+++ b/firmware/export/system.h
@@ -21,7 +21,6 @@
21#define __SYSTEM_H__ 21#define __SYSTEM_H__
22 22
23#include "cpu.h" 23#include "cpu.h"
24#include "config.h"
25#include "stdbool.h" 24#include "stdbool.h"
26 25
27extern void system_reboot (void); 26extern void system_reboot (void);
@@ -111,6 +110,23 @@ const char *get_cpu_boost_tracker(void);
111#define MAX(a, b) (((a)>(b))?(a):(b)) 110#define MAX(a, b) (((a)>(b))?(a):(b))
112#endif 111#endif
113 112
113/* return number of elements in array a */
114#define ARRAYLEN(a) (sizeof(a)/sizeof((a)[0]))
115
116/* return p incremented by specified number of bytes */
117#define SKIPBYTES(p, count) ((typeof (p))((char *)(p) + (count)))
118
119#define P2_M1(p2) ((1 << (p2))-1)
120
121/* align up or down to nearest 2^p2 */
122#define ALIGN_DOWN_P2(n, p2) ((n) & ~P2_M1(p2))
123#define ALIGN_UP_P2(n, p2) ALIGN_DOWN_P2((n) + P2_M1(p2),p2)
124
125/* align up or down to nearest integer multiple of a */
126#define ALIGN_DOWN(n, a) ((n)/(a)*(a))
127#define ALIGN_UP(n, a) ALIGN_DOWN((n)+((a)-1),a)
128
129/* live endianness conversion */
114#ifdef ROCKBOX_LITTLE_ENDIAN 130#ifdef ROCKBOX_LITTLE_ENDIAN
115#define letoh16(x) (x) 131#define letoh16(x) (x)
116#define letoh32(x) (x) 132#define letoh32(x) (x)
@@ -120,6 +136,8 @@ const char *get_cpu_boost_tracker(void);
120#define betoh32(x) swap32(x) 136#define betoh32(x) swap32(x)
121#define htobe16(x) swap16(x) 137#define htobe16(x) swap16(x)
122#define htobe32(x) swap32(x) 138#define htobe32(x) swap32(x)
139#define swap_odd_even_be32(x) (x)
140#define swap_odd_even_le32(x) swap_odd_even32(x)
123#else 141#else
124#define letoh16(x) swap16(x) 142#define letoh16(x) swap16(x)
125#define letoh32(x) swap32(x) 143#define letoh32(x) swap32(x)
@@ -129,6 +147,37 @@ const char *get_cpu_boost_tracker(void);
129#define betoh32(x) (x) 147#define betoh32(x) (x)
130#define htobe16(x) (x) 148#define htobe16(x) (x)
131#define htobe32(x) (x) 149#define htobe32(x) (x)
150#define swap_odd_even_be32(x) swap_odd_even32(x)
151#define swap_odd_even_le32(x) (x)
152#endif
153
154/* static endianness conversion */
155#define SWAP_16(x) ((typeof(x))(unsigned short)(((unsigned short)(x) >> 8) | \
156 ((unsigned short)(x) << 8)))
157
158#define SWAP_32(x) ((typeof(x))(unsigned long)( ((unsigned long)(x) >> 24) | \
159 (((unsigned long)(x) & 0xff0000ul) >> 8) | \
160 (((unsigned long)(x) & 0xff00ul) << 8) | \
161 ((unsigned long)(x) << 24)))
162
163#ifdef ROCKBOX_LITTLE_ENDIAN
164#define LE_TO_H16(x) (x)
165#define LE_TO_H32(x) (x)
166#define H_TO_LE16(x) (x)
167#define H_TO_LE32(x) (x)
168#define BE_TO_H16(x) SWAP_16(x)
169#define BE_TO_H32(x) SWAP_32(x)
170#define H_TO_BE16(x) SWAP_16(x)
171#define H_TO_BE32(x) SWAP_32(x)
172#else
173#define LE_TO_H16(x) SWAP_16(x)
174#define LE_TO_H32(x) SWAP_32(x)
175#define H_TO_LE16(x) SWAP_16(x)
176#define H_TO_LE32(x) SWAP_32(x)
177#define BE_TO_H16(x) (x)
178#define BE_TO_H32(x) (x)
179#define H_TO_BE16(x) (x)
180#define H_TO_BE32(x) (x)
132#endif 181#endif
133 182
134 183
@@ -181,6 +230,7 @@ enum {
181 : /* %0 */ I_CONSTRAINT((char)(mask)), \ 230 : /* %0 */ I_CONSTRAINT((char)(mask)), \
182 /* %1 */ "z"(address-GBR)) 231 /* %1 */ "z"(address-GBR))
183 232
233
184#endif /* CONFIG_CPU == SH7034 */ 234#endif /* CONFIG_CPU == SH7034 */
185 235
186#ifndef SIMULATOR 236#ifndef SIMULATOR
@@ -388,7 +438,20 @@ static inline unsigned long swap32(unsigned long value)
388#define invalidate_icache() 438#define invalidate_icache()
389 439
390#endif 440#endif
391#else 441
442#ifndef CPU_COLDFIRE
443static inline unsigned long swap_odd_even32(unsigned long value)
444{
445 /*
446 result[31..24],[15.. 8] = value[23..16],[ 7.. 0]
447 result[23..16],[ 7.. 0] = value[31..24],[15.. 8]
448 */
449 unsigned long t = value & 0xff00ff00;
450 return (t >> 8) | ((t ^ value) << 8);
451}
452#endif
453
454#else /* SIMULATOR */
392 455
393static inline unsigned short swap16(unsigned short value) 456static inline unsigned short swap16(unsigned short value)
394 /* 457 /*
@@ -412,8 +475,18 @@ static inline unsigned long swap32(unsigned long value)
412 return (lo << 16) | hi; 475 return (lo << 16) | hi;
413} 476}
414 477
478static inline unsigned long swap_odd_even32(unsigned long value)
479{
480 /*
481 result[31..24],[15.. 8] = value[23..16],[ 7.. 0]
482 result[23..16],[ 7.. 0] = value[31..24],[15.. 8]
483 */
484 unsigned long t = value & 0xff00ff00;
485 return (t >> 8) | ((t ^ value) << 8);
486}
487
415#define invalidate_icache() 488#define invalidate_icache()
416 489
417#endif 490#endif /* !SIMULATOR */
418 491
419#endif 492#endif /* __SYSTEM_H__ */
diff --git a/firmware/export/thread.h b/firmware/export/thread.h
index 17e6e3aa88..72c692ec3b 100644
--- a/firmware/export/thread.h
+++ b/firmware/export/thread.h
@@ -142,7 +142,10 @@ void switch_thread(bool save_context, struct thread_entry **blocked_list);
142void sleep_thread(int ticks); 142void sleep_thread(int ticks);
143void block_thread(struct thread_entry **thread, int timeout); 143void block_thread(struct thread_entry **thread, int timeout);
144void wakeup_thread(struct thread_entry **thread); 144void wakeup_thread(struct thread_entry **thread);
145#ifdef HAVE_PRIORITY_SCHEDULING
145int thread_set_priority(struct thread_entry *thread, int priority); 146int thread_set_priority(struct thread_entry *thread, int priority);
147int thread_get_priority(struct thread_entry *thread);
148#endif
146void init_threads(void); 149void init_threads(void);
147int thread_stack_usage(const struct thread_entry *thread); 150int thread_stack_usage(const struct thread_entry *thread);
148int thread_get_status(const struct thread_entry *thread); 151int thread_get_status(const struct thread_entry *thread);
diff --git a/firmware/export/tlv320.h b/firmware/export/tlv320.h
index dfcbec4373..023ec9d874 100644
--- a/firmware/export/tlv320.h
+++ b/firmware/export/tlv320.h
@@ -24,6 +24,16 @@
24 24
25extern void tlv320_init(void); 25extern void tlv320_init(void);
26extern void tlv320_reset(void); 26extern void tlv320_reset(void);
27/**
28 * Sets internal sample rate for DAC and ADC relative to MCLK
29 * Selection for frequency:
30 * Fs: tlv: with:
31 * 11025: 0 = MCLK/2 MCLK/2 SCLK, LRCK: Audio Clk / 16
32 * 22050: 0 = MCLK/2 MCLK SCLK, LRCK: Audio Clk / 8
33 * 44100: 1 = MCLK MCLK SCLK, LRCK: Audio Clk / 4 (default)
34 * 88200: 2 = MCLK*2 MCLK SCLK, LRCK: Audio Clk / 2
35 */
36extern void tlv320_set_frequency(unsigned fsel);
27extern void tlv320_enable_output(bool enable); 37extern void tlv320_enable_output(bool enable);
28extern void tlv320_set_headphone_vol(int vol_l, int vol_r); 38extern void tlv320_set_headphone_vol(int vol_l, int vol_r);
29extern void tlv320_set_recvol(int left, int right, int type); 39extern void tlv320_set_recvol(int left, int right, int type);
diff --git a/firmware/export/uda1380.h b/firmware/export/uda1380.h
index 9c761c6a7d..639ca8aa5c 100644
--- a/firmware/export/uda1380.h
+++ b/firmware/export/uda1380.h
@@ -28,8 +28,17 @@ extern void uda1380_set_bass(int value);
28extern void uda1380_set_treble(int value); 28extern void uda1380_set_treble(int value);
29extern int uda1380_mute(int mute); 29extern int uda1380_mute(int mute);
30extern void uda1380_close(void); 30extern void uda1380_close(void);
31extern void uda1380_set_nsorder(int order); 31/**
32 32 * Sets frequency settings for DAC and ADC relative to MCLK
33 *
34 * Selection for frequency ranges:
35 * Fs: range: with:
36 * 11025: 0 = 6.25 to 12.5 SCLK, LRCK: Audio Clk / 16
37 * 22050: 1 = 12.5 to 25 SCLK, LRCK: Audio Clk / 8
38 * 44100: 2 = 25 to 50 SCLK, LRCK: Audio Clk / 4 (default)
39 * 88200: 3 = 50 to 100 SCLK, LRCK: Audio Clk / 2
40 */
41extern void uda1380_set_frequency(unsigned fsel);
33extern void uda1380_enable_recording(bool source_mic); 42extern void uda1380_enable_recording(bool source_mic);
34extern void uda1380_disable_recording(void); 43extern void uda1380_disable_recording(void);
35extern void uda1380_set_recvol(int left, int right, int type); 44extern void uda1380_set_recvol(int left, int right, int type);