Compare commits
39 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ccd99a86a | ||
|
|
c351e62620 | ||
|
|
23ec0a537f | ||
|
|
95475eca87 | ||
|
|
d1fdb485b1 | ||
|
|
fde22376d4 | ||
|
|
017f61388b | ||
|
|
368e872c52 | ||
|
|
0b2894e2ec | ||
|
|
90df1b4a76 | ||
|
|
eabebcbc90 | ||
|
|
38bd69905a | ||
|
|
57e272cf5d | ||
|
|
488df30245 | ||
|
|
bd4f3c9c60 | ||
|
|
a1d157ba1e | ||
|
|
2076ed09eb | ||
|
|
01db859191 | ||
|
|
de4696ff21 | ||
|
|
f57a698eff | ||
|
|
a9357262e2 | ||
|
|
5c8f69d8a0 | ||
|
|
604ea9fc9a | ||
|
|
4e3d8c5f59 | ||
|
|
620c8434db | ||
|
|
d5d331b24d | ||
|
|
e9b8b5ba17 | ||
|
|
2122eb8fb3 | ||
|
|
a4960ea764 | ||
|
|
86878f0c2b | ||
|
|
2f99e609f9 | ||
|
|
cad99bae1d | ||
|
|
4952e59f38 | ||
|
|
2f857c6b6c | ||
|
|
43d4dc1aca | ||
|
|
f9fa70fdaf | ||
|
|
c358711cd6 | ||
|
|
24419baf1f | ||
|
|
ef3ec72bfb |
69 changed files with 20627 additions and 1280 deletions
|
|
@ -53,7 +53,7 @@ static bool wait_for_release = false;
|
|||
static bool short_press = false;
|
||||
#endif
|
||||
|
||||
#define REPEAT_WINDOW_TICKS HZ/10
|
||||
#define REPEAT_WINDOW_TICKS HZ/4
|
||||
static int last_action_tick = 0;
|
||||
|
||||
/* software keylock stuff */
|
||||
|
|
|
|||
|
|
@ -186,13 +186,13 @@ typedef struct
|
|||
real_t det;
|
||||
} acorr_coef;
|
||||
|
||||
/* Within auto_correlation(...) a pre-shift of >>2 is needed to avoid overflow
|
||||
* when multiply-adding the FRACT-variables -- FRACT part is 31 bits. After the
|
||||
* calculation has been finished the result 'ac->det' needs to be
|
||||
* post-shifted by <<(4*2). This pre-/post-shifting is needed for FIXED_POINT
|
||||
* only. */
|
||||
/* Within auto_correlation(...) a pre-shift of >>ACDET_EXP is needed to avoid
|
||||
* overflow when multiply-adding the FRACT-variables -- FRACT part is 31 bits.
|
||||
* After the calculation has been finished the result 'ac->det' needs to be
|
||||
* post-shifted by <<(4*ACDET_EXP). This pre-/post-shifting is needed for
|
||||
* FIXED_POINT only. */
|
||||
#ifdef FIXED_POINT
|
||||
#define ACDET_EXP 2
|
||||
#define ACDET_EXP 3
|
||||
#define ACDET_PRE(A) (A)>>ACDET_EXP
|
||||
#define ACDET_POST(A) (A)<<(4*ACDET_EXP)
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ hebrew.lang
|
|||
hrvatski.lang
|
||||
islenska.lang
|
||||
italiano.lang
|
||||
latviesu.lang
|
||||
lietuviu.lang
|
||||
magyar.lang
|
||||
nederlands.lang
|
||||
|
|
|
|||
|
|
@ -12447,3 +12447,217 @@
|
|||
*: "按照文件大小"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_HW_EQ_WIDTH_WIDE
|
||||
desc: in sound_menu, hardware equalizer tone controls wide bandwidth setting
|
||||
user: core
|
||||
<source>
|
||||
*: none
|
||||
gigabeats: "Wide"
|
||||
</source>
|
||||
<dest>
|
||||
*: none
|
||||
gigabeats: "宽度"
|
||||
</dest>
|
||||
<voice>
|
||||
*: none
|
||||
gigabeats: "宽度"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME
|
||||
desc: resume settings menu
|
||||
user: core
|
||||
<source>
|
||||
*: "Automatic resume"
|
||||
</source>
|
||||
<dest>
|
||||
*: "自动恢复"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "自动回复"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_AUTOMATIC
|
||||
desc: resume on automatic track change
|
||||
user: core
|
||||
<source>
|
||||
*: "Resume on automatic track change"
|
||||
</source>
|
||||
<dest>
|
||||
*: "自动跳转时续播"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "自动跳转时续播"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_HW_EQ_WIDTH_NARROW
|
||||
desc: in sound_menu, hardware equalizer tone controls narrow bandwith setting
|
||||
user: core
|
||||
<source>
|
||||
*: none
|
||||
gigabeats: "Narrow"
|
||||
</source>
|
||||
<dest>
|
||||
*: none
|
||||
gigabeats: "窄"
|
||||
</dest>
|
||||
<voice>
|
||||
*: none
|
||||
gigabeats: "窄"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_ENABLE_YES
|
||||
desc: deprecated
|
||||
user: core
|
||||
<source>
|
||||
*: ""
|
||||
</source>
|
||||
<dest>
|
||||
*: ""
|
||||
</dest>
|
||||
<voice>
|
||||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_HW_EQ_TONE_CONTROLS_ADVANCED
|
||||
desc: in sound_menu, advanced settings for hardware equalizer tone controls
|
||||
user: core
|
||||
<source>
|
||||
*: none
|
||||
gigabeats: "Advanced Tone Control Settings"
|
||||
</source>
|
||||
<dest>
|
||||
*: none
|
||||
gigabeats: "高级音调控制设置"
|
||||
</dest>
|
||||
<voice>
|
||||
*: none
|
||||
gigabeats: "高级音调控制设置"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_RESET_START_DIR
|
||||
desc: reset the browser start directory
|
||||
user: core
|
||||
<source>
|
||||
*: "Start File Browser at /"
|
||||
</source>
|
||||
<dest>
|
||||
*: "文件浏览从根目录开始"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "文件浏览从根目录开始"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_FM_RSSI
|
||||
desc: Signal strength of a received FM station
|
||||
user: core
|
||||
<source>
|
||||
*: none
|
||||
radio: "Signal strength:"
|
||||
</source>
|
||||
<dest>
|
||||
*: none
|
||||
radio: "信号强度:"
|
||||
</dest>
|
||||
<voice>
|
||||
*: none
|
||||
radio: "信号强度:"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_ENABLE
|
||||
desc: deprecated
|
||||
user: core
|
||||
<source>
|
||||
*: ""
|
||||
</source>
|
||||
<dest>
|
||||
*: ""
|
||||
</dest>
|
||||
<voice>
|
||||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_FORCE
|
||||
desc: alternative to yes/no for tristate settings
|
||||
user: core
|
||||
<source>
|
||||
*: "Force"
|
||||
</source>
|
||||
<dest>
|
||||
*: "强制"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "强制"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_HW_EQ_TONE_CONTROLS
|
||||
desc: in sound_menu, hardware equalizer tone controls
|
||||
user: core
|
||||
<source>
|
||||
*: none
|
||||
gigabeats: "Tone Controls"
|
||||
</source>
|
||||
<dest>
|
||||
*: none
|
||||
gigabeats: "音调控制"
|
||||
</dest>
|
||||
<voice>
|
||||
*: none
|
||||
gigabeats: "音调控制"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_CUSTOM
|
||||
desc: enable customization of resume on automatic track change
|
||||
user: core
|
||||
<source>
|
||||
*: "In custom directories only"
|
||||
</source>
|
||||
<dest>
|
||||
*: "仅在指定目录中"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "仅在指定目录中"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_SET_AS_START_DIR
|
||||
desc: used in the onplay menu to set a starting browser dir
|
||||
user: core
|
||||
<source>
|
||||
*: "Start File Browser Here"
|
||||
</source>
|
||||
<dest>
|
||||
*: "从这里开始文件浏览"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "从这里开始文件浏览"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_RECORDING_HISTOGRAM_INTERVAL
|
||||
desc: in record settings menu
|
||||
user: core
|
||||
<source>
|
||||
*: none
|
||||
recording_histogram: "Histogram interval"
|
||||
</source>
|
||||
<dest>
|
||||
*: none
|
||||
recording_histogram: "柱状图间隔"
|
||||
</dest>
|
||||
<voice>
|
||||
*: none
|
||||
recording_histogram: "柱状图间隔"
|
||||
</voice>
|
||||
</phrase>
|
||||
|
|
|
|||
|
|
@ -9230,11 +9230,11 @@
|
|||
</source>
|
||||
<dest>
|
||||
*: none
|
||||
recording: "Tøm optagelsesmappe"
|
||||
recording: "Nulstil optagelsesmappe"
|
||||
</dest>
|
||||
<voice>
|
||||
*: none
|
||||
recording: "Tøm optagelsesmappe"
|
||||
recording: "Nulstil optagelsesmappe"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
|
|
@ -12596,3 +12596,90 @@
|
|||
*: "Filestørrelse"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME
|
||||
desc: resume settings menu
|
||||
user: core
|
||||
<source>
|
||||
*: "Automatic resume"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Automatisk fortsættelse"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Automatisk fortsættelse"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_AUTOMATIC
|
||||
desc: resume on automatic track change
|
||||
user: core
|
||||
<source>
|
||||
*: "Resume on automatic track change"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Fortsæt ved automatisk sporskifte"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Fortsæt ved automatisk sporskifte"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_ENABLE_YES
|
||||
desc: deprecated
|
||||
user: core
|
||||
<source>
|
||||
*: ""
|
||||
</source>
|
||||
<dest>
|
||||
*: ""
|
||||
</dest>
|
||||
<voice>
|
||||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_FM_RSSI
|
||||
desc: Signal strength of a received FM station
|
||||
user: core
|
||||
<source>
|
||||
*: none
|
||||
radio: "Signal strength:"
|
||||
</source>
|
||||
<dest>
|
||||
*: none
|
||||
radio: "Signalstyrke:"
|
||||
</dest>
|
||||
<voice>
|
||||
*: none
|
||||
radio: "Signalstyrke"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_ENABLE
|
||||
desc: deprecated
|
||||
user: core
|
||||
<source>
|
||||
*: ""
|
||||
</source>
|
||||
<dest>
|
||||
*: ""
|
||||
</dest>
|
||||
<voice>
|
||||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_CUSTOM
|
||||
desc: enable customization of resume on automatic track change
|
||||
user: core
|
||||
<source>
|
||||
*: "In custom directories only"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Kun i brugerdefinerede mapper"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Kun i brugerdefinerede mapper"
|
||||
</voice>
|
||||
</phrase>
|
||||
|
|
|
|||
|
|
@ -12630,3 +12630,31 @@
|
|||
*: "En directorios personalizados solamente"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_ENABLE_YES
|
||||
desc: deprecated
|
||||
user: core
|
||||
<source>
|
||||
*: ""
|
||||
</source>
|
||||
<dest>
|
||||
*: ""
|
||||
</dest>
|
||||
<voice>
|
||||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_ENABLE
|
||||
desc: deprecated
|
||||
user: core
|
||||
<source>
|
||||
*: ""
|
||||
</source>
|
||||
<dest>
|
||||
*: ""
|
||||
</dest>
|
||||
<voice>
|
||||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
12662
apps/lang/latviesu.lang
Normal file
12662
apps/lang/latviesu.lang
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -12577,3 +12577,90 @@
|
|||
*: "Bestandsgrootte"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME
|
||||
desc: resume settings menu
|
||||
user: core
|
||||
<source>
|
||||
*: "Automatic resume"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Automatisch hervatten"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Automatisch hervatten"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_AUTOMATIC
|
||||
desc: resume on automatic track change
|
||||
user: core
|
||||
<source>
|
||||
*: "Resume on automatic track change"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Hervat bij automatische nummerwissel"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Hervat bij automatische nummerwissel"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_ENABLE_YES
|
||||
desc: deprecated
|
||||
user: core
|
||||
<source>
|
||||
*: ""
|
||||
</source>
|
||||
<dest>
|
||||
*: ""
|
||||
</dest>
|
||||
<voice>
|
||||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_FM_RSSI
|
||||
desc: Signal strength of a received FM station
|
||||
user: core
|
||||
<source>
|
||||
*: none
|
||||
radio: "Signal strength:"
|
||||
</source>
|
||||
<dest>
|
||||
*: none
|
||||
radio: "Signaalsterkte:"
|
||||
</dest>
|
||||
<voice>
|
||||
*: none
|
||||
radio: "Signaalsterkte"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_ENABLE
|
||||
desc: deprecated
|
||||
user: core
|
||||
<source>
|
||||
*: ""
|
||||
</source>
|
||||
<dest>
|
||||
*: ""
|
||||
</dest>
|
||||
<voice>
|
||||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_CUSTOM
|
||||
desc: enable customization of resume on automatic track change
|
||||
user: core
|
||||
<source>
|
||||
*: "In custom directories only"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Alleen in bepaalde mappen"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Alleen in bepaalde mappen"
|
||||
</voice>
|
||||
</phrase>
|
||||
|
|
|
|||
|
|
@ -12623,3 +12623,45 @@
|
|||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME
|
||||
desc: resume settings menu
|
||||
user: core
|
||||
<source>
|
||||
*: "Automatic resume"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Авто-возобновление"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Автоматическое возобновление"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_AUTOMATIC
|
||||
desc: resume on automatic track change
|
||||
user: core
|
||||
<source>
|
||||
*: "Resume on automatic track change"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Возобновление при автоматической смене трэка"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Возобновление при автоматической смене трэка"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_CUSTOM
|
||||
desc: enable customization of resume on automatic track change
|
||||
user: core
|
||||
<source>
|
||||
*: "In custom directories only"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Только в заданных папках"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Только в заданных папках"
|
||||
</voice>
|
||||
</phrase>
|
||||
|
|
|
|||
|
|
@ -12615,3 +12615,45 @@
|
|||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME
|
||||
desc: resume settings menu
|
||||
user: core
|
||||
<source>
|
||||
*: "Automatic resume"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Automatické Obnovenie Prehrávania"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Automatické obnovenie prehrávania"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_AUTOMATIC
|
||||
desc: resume on automatic track change
|
||||
user: core
|
||||
<source>
|
||||
*: "Resume on automatic track change"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Obnoviť Pri Automatickej Zmene Stopy"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Obnoviť Pri Automatickej Zmene Stopy"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_CUSTOM
|
||||
desc: enable customization of resume on automatic track change
|
||||
user: core
|
||||
<source>
|
||||
*: "In custom directories only"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Len v Zvolených Priečinkoch"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Len v Zvolených Priečinkoch"
|
||||
</voice>
|
||||
</phrase>
|
||||
|
|
|
|||
|
|
@ -12630,3 +12630,31 @@
|
|||
*: "Само у одређеним фолдерима"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_ENABLE_YES
|
||||
desc: deprecated
|
||||
user: core
|
||||
<source>
|
||||
*: ""
|
||||
</source>
|
||||
<dest>
|
||||
*: ""
|
||||
</dest>
|
||||
<voice>
|
||||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_ENABLE
|
||||
desc: deprecated
|
||||
user: core
|
||||
<source>
|
||||
*: ""
|
||||
</source>
|
||||
<dest>
|
||||
*: ""
|
||||
</dest>
|
||||
<voice>
|
||||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
|
|
|
|||
|
|
@ -12486,7 +12486,6 @@
|
|||
touchscreen: "OK"
|
||||
</voice>
|
||||
</phrase>
|
||||
# TODO: Should this be sorter?
|
||||
<phrase>
|
||||
id: LANG_KBD_DELETE
|
||||
desc: in keyboard
|
||||
|
|
@ -12636,3 +12635,31 @@
|
|||
*: "Bara i angivna kataloger"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_ENABLE_YES
|
||||
desc: deprecated
|
||||
user: core
|
||||
<source>
|
||||
*: ""
|
||||
</source>
|
||||
<dest>
|
||||
*: ""
|
||||
</dest>
|
||||
<voice>
|
||||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_AUTORESUME_ENABLE
|
||||
desc: deprecated
|
||||
user: core
|
||||
<source>
|
||||
*: ""
|
||||
</source>
|
||||
<dest>
|
||||
*: ""
|
||||
</dest>
|
||||
<voice>
|
||||
*: ""
|
||||
</voice>
|
||||
</phrase>
|
||||
|
|
|
|||
|
|
@ -286,7 +286,7 @@ bool mp3info(struct mp3entry *entry, const char *filename)
|
|||
if (fd < 0)
|
||||
return true;
|
||||
|
||||
result = !get_mp3_metadata(fd, entry);
|
||||
result = !get_metadata(entry, fd, filename);
|
||||
|
||||
close(fd);
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@
|
|||
#include "string-extra.h"
|
||||
#include "config.h"
|
||||
#include "misc.h"
|
||||
#include "system.h"
|
||||
#include "lcd.h"
|
||||
#include "file.h"
|
||||
#include "filefuncs.h"
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
#include <stdbool.h>
|
||||
#include <inttypes.h>
|
||||
#include "config.h"
|
||||
#include "system.h"
|
||||
#include "screen_access.h"
|
||||
|
||||
extern const unsigned char * const byte_units[];
|
||||
|
|
|
|||
|
|
@ -462,7 +462,7 @@ int get_mp3file_info(int fd, struct mp3info *info)
|
|||
#if CONFIG_CODEC==SWCODEC
|
||||
i += 21;
|
||||
info->enc_delay = ((int)vbrheader[i ] << 4) | (vbrheader[i+1] >> 4);
|
||||
info->enc_padding = ((int)vbrheader[i+1] << 8) | vbrheader[i+2];
|
||||
info->enc_padding = ((int)(vbrheader[i+1]&0xF) << 8) | vbrheader[i+2];
|
||||
/* TODO: This sanity checking is rather silly, seeing as how the LAME
|
||||
header contains a CRC field that can be used to verify integrity. */
|
||||
if (!(info->enc_delay >= 0 && info->enc_delay <= 2880 &&
|
||||
|
|
|
|||
|
|
@ -496,9 +496,9 @@ static void display_helpfile(void)
|
|||
"", "V = IR",
|
||||
"", "I = V/R",
|
||||
"", "and",
|
||||
"", "R = I/V", "", "",
|
||||
"Where", "V", "=", "voltage", "I", "=", "current", "(in", "amps)",
|
||||
"and", "R", "=", "resistance", "(measured", "in", "Ohms)", "", "",
|
||||
"", "R = V/I", "", "",
|
||||
"Where", "V", "=", "voltage, ", "I", "=", "current", "(in", "amps)",
|
||||
"and", "R", "=", "resistance", "(measured", "in", "Ohms).", "", "",
|
||||
/* 28 */
|
||||
/* -- */
|
||||
"The", "primary", "characteristics", "of", "a", "resistor", "are",
|
||||
|
|
|
|||
|
|
@ -23,13 +23,14 @@
|
|||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include "system.h"
|
||||
#include "settings.h"
|
||||
#include "radio.h"
|
||||
#include "buffering.h"
|
||||
#include "playback.h" /* bufopen_user_data */
|
||||
#include "file.h"
|
||||
#include "kernel.h"
|
||||
#include "string-extra.h"
|
||||
#include "misc.h"
|
||||
#include "filefuncs.h"
|
||||
|
||||
#define MAX_RADIOART_IMAGES 10
|
||||
|
|
@ -63,6 +64,7 @@ static int load_radioart_image(struct radioart *ra, const char* preset_name,
|
|||
struct dim *dim)
|
||||
{
|
||||
char path[MAX_PATH];
|
||||
struct bufopen_bitmap_data user_data;
|
||||
#ifndef HAVE_NOISY_IDLE_MODE
|
||||
cpu_idle_mode(false);
|
||||
#endif
|
||||
|
|
@ -80,7 +82,9 @@ static int load_radioart_image(struct radioart *ra, const char* preset_name,
|
|||
ra->dim.height = dim->height;
|
||||
ra->dim.width = dim->width;
|
||||
ra->last_tick = current_tick;
|
||||
ra->handle = bufopen(path, 0, TYPE_BITMAP, &ra->dim);
|
||||
user_data.embedded_albumart = NULL;
|
||||
user_data.dim = &ra->dim;
|
||||
ra->handle = bufopen(path, 0, TYPE_BITMAP, &user_data);
|
||||
if (ra->handle == ERR_BUFFER_FULL)
|
||||
{
|
||||
int i = find_oldest_image();
|
||||
|
|
|
|||
|
|
@ -324,7 +324,8 @@ static int miscscrn(void * param)
|
|||
switch (result)
|
||||
{
|
||||
case GO_TO_PLAYLIST_VIEWER:
|
||||
return GO_TO_PLAYLIST_VIEWER;
|
||||
case GO_TO_WPS:
|
||||
return result;
|
||||
default:
|
||||
return GO_TO_ROOT;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ static long tempbuf_pos;
|
|||
static const char *tags_str[] = { "artist", "album", "genre", "title",
|
||||
"filename", "composer", "comment", "albumartist", "grouping", "year",
|
||||
"discnumber", "tracknumber", "bitrate", "length", "playcount", "rating",
|
||||
"playtime", "lastplayed", "commitid", "mtime" };
|
||||
"playtime", "lastplayed", "commitid", "mtime", "lastoffset" };
|
||||
|
||||
/* Status information of the tagcache. */
|
||||
static struct tagcache_stat tc_stat;
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
#include "metadata.h"
|
||||
|
||||
/**
|
||||
Note: When adding new tags, make sure to update index_entry_ec in
|
||||
Note: When adding new tags, make sure to update index_entry_ec and tags_str in
|
||||
tagcache.c and bump up the header version too.
|
||||
*/
|
||||
enum tag_type { tag_artist = 0, tag_album, tag_genre, tag_title,
|
||||
|
|
|
|||
|
|
@ -586,6 +586,9 @@ Uwe Wiebach
|
|||
Mikhail Titov
|
||||
Dave Slusher
|
||||
Jean-Marie Moraux
|
||||
Ismael Castiñeira Álvarez
|
||||
Mārtiņš Šimis
|
||||
Leif Andersen
|
||||
|
||||
The libmad team
|
||||
The wavpack team
|
||||
|
|
|
|||
|
|
@ -37,11 +37,7 @@ target/hosted/sdl/lcd-remote-bitmap.c
|
|||
#endif
|
||||
target/hosted/sdl/lcd-sdl.c
|
||||
target/hosted/sdl/system-sdl.c
|
||||
#ifdef HAVE_SDL_THREADS
|
||||
target/hosted/sdl/thread-sdl.c
|
||||
#else
|
||||
thread.c
|
||||
#endif
|
||||
target/hosted/sdl/timer-sdl.c
|
||||
#ifdef HAVE_TOUCHSCREEN
|
||||
target/hosted/sdl/key_to_touch-sdl.c
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ const struct sound_settings_info audiohw_settings[] = {
|
|||
#endif
|
||||
};
|
||||
|
||||
static unsigned short wm8975_regs[] =
|
||||
static unsigned short wm8975_regs[WM8975_NUM_REGISTERS] =
|
||||
{
|
||||
[LINVOL] = LINVOL_LZCEN | 23, /* 0dB */
|
||||
[RINVOL] = RINVOL_RIVU | RINVOL_RZCEN | 23, /* 0dB */
|
||||
|
|
@ -68,8 +68,10 @@ static unsigned short wm8975_regs[] =
|
|||
|
||||
static void wm8975_write(int reg, unsigned val)
|
||||
{
|
||||
wm8975_regs[reg] = val;
|
||||
wmcodec_write(reg, val);
|
||||
if (WM8975_NUM_REGISTERS > reg) {
|
||||
wm8975_regs[reg] = val;
|
||||
wmcodec_write(reg, val);
|
||||
}
|
||||
}
|
||||
|
||||
static void wm8975_write_and(int reg, unsigned bits)
|
||||
|
|
@ -141,17 +143,13 @@ static void audiohw_mute(bool mute)
|
|||
#ifdef IPOD_NANO2G
|
||||
void audiohw_preinit(void)
|
||||
{
|
||||
wmcodec_write(RESET, RESET_RESET);
|
||||
wm8975_write(RESET, RESET_RESET);
|
||||
|
||||
wmcodec_write(AINTFCE, AINTFCE_MS | AINTFCE_LRP_I2S_RLO
|
||||
| AINTFCE_IWL_16BIT | AINTFCE_FORMAT_I2S);
|
||||
wm8975_write(AINTFCE, AINTFCE_MS | AINTFCE_LRP_I2S_RLO
|
||||
| AINTFCE_IWL_16BIT | AINTFCE_FORMAT_I2S);
|
||||
|
||||
#ifndef IPOD_NANO2G
|
||||
wmcodec_write(SAMPCTRL, WM8975_44100HZ);
|
||||
#endif
|
||||
|
||||
wmcodec_write(LOUTMIX1, LOUTMIX1_LD2LO | LOUTMIX1_LI2LOVOL(5));
|
||||
wmcodec_write(ROUTMIX2, ROUTMIX2_RD2RO | ROUTMIX2_RI2ROVOL(5));
|
||||
wm8975_write(LOUTMIX1, LOUTMIX1_LD2LO | LOUTMIX1_LI2LOVOL(5));
|
||||
wm8975_write(ROUTMIX2, ROUTMIX2_RD2RO | ROUTMIX2_RI2ROVOL(5));
|
||||
|
||||
wm8975_write(PWRMGMT1, wm8975_regs[PWRMGMT1]);
|
||||
wm8975_write(PWRMGMT2, wm8975_regs[PWRMGMT2]);
|
||||
|
|
@ -164,11 +162,11 @@ void audiohw_postinit(void)
|
|||
wm8975_write(PWRMGMT1, wm8975_regs[PWRMGMT1]);
|
||||
audiohw_mute(false);
|
||||
}
|
||||
#else
|
||||
#else /* !IPOD_NANO2G */
|
||||
void audiohw_preinit(void)
|
||||
{
|
||||
/* POWER UP SEQUENCE */
|
||||
wmcodec_write(RESET, RESET_RESET);
|
||||
wm8975_write(RESET, RESET_RESET);
|
||||
|
||||
/* 2. Enable Vmid and VREF, quick startup. */
|
||||
wm8975_write(PWRMGMT1, wm8975_regs[PWRMGMT1]);
|
||||
|
|
@ -179,30 +177,26 @@ void audiohw_preinit(void)
|
|||
/* 4. Enable DACs, line and headphone output buffers as required. */
|
||||
wm8975_write(PWRMGMT2, wm8975_regs[PWRMGMT2]);
|
||||
|
||||
wmcodec_write(AINTFCE, AINTFCE_MS | AINTFCE_LRP_I2S_RLO
|
||||
| AINTFCE_IWL_16BIT | AINTFCE_FORMAT_I2S);
|
||||
wm8975_write(AINTFCE, AINTFCE_MS | AINTFCE_LRP_I2S_RLO
|
||||
| AINTFCE_IWL_16BIT | AINTFCE_FORMAT_I2S);
|
||||
|
||||
wm8975_write(DAPCTRL, wm8975_regs[DAPCTRL] );
|
||||
|
||||
/* Still need to find out why this is neccessary */
|
||||
#ifdef IPOD_NANO2G
|
||||
wmcodec_write(SAMPCTRL, 0);
|
||||
#else
|
||||
wmcodec_write(SAMPCTRL, WM8975_44100HZ);
|
||||
#endif
|
||||
/* Set sample rate. */
|
||||
wm8975_write(SAMPCTRL, WM8975_44100HZ);
|
||||
|
||||
/* set the volume to -6dB */
|
||||
wmcodec_write(LOUT1VOL, LOUT1VOL_LO1ZC | IPOD_PCM_LEVEL);
|
||||
wmcodec_write(ROUT1VOL, ROUT1VOL_RO1VU | ROUT1VOL_RO1ZC | IPOD_PCM_LEVEL);
|
||||
wm8975_write(LOUT1VOL, LOUT1VOL_LO1ZC | IPOD_PCM_LEVEL);
|
||||
wm8975_write(ROUT1VOL, ROUT1VOL_RO1VU | ROUT1VOL_RO1ZC | IPOD_PCM_LEVEL);
|
||||
|
||||
wmcodec_write(LOUTMIX1, LOUTMIX1_LD2LO| LOUTMIX1_LI2LOVOL(5));
|
||||
wmcodec_write(LOUTMIX2, LOUTMIX2_RI2LOVOL(5));
|
||||
wm8975_write(LOUTMIX1, LOUTMIX1_LD2LO| LOUTMIX1_LI2LOVOL(5));
|
||||
wm8975_write(LOUTMIX2, LOUTMIX2_RI2LOVOL(5));
|
||||
|
||||
wmcodec_write(ROUTMIX1, ROUTMIX1_LI2ROVOL(5));
|
||||
wmcodec_write(ROUTMIX2, ROUTMIX2_RD2RO| ROUTMIX2_RI2ROVOL(5));
|
||||
wm8975_write(ROUTMIX1, ROUTMIX1_LI2ROVOL(5));
|
||||
wm8975_write(ROUTMIX2, ROUTMIX2_RD2RO| ROUTMIX2_RI2ROVOL(5));
|
||||
|
||||
wmcodec_write(MOUTMIX1, 0);
|
||||
wmcodec_write(MOUTMIX2, 0);
|
||||
wm8975_write(MOUTMIX1, 0);
|
||||
wm8975_write(MOUTMIX2, 0);
|
||||
}
|
||||
|
||||
void audiohw_postinit(void)
|
||||
|
|
@ -220,15 +214,15 @@ void audiohw_set_master_vol(int vol_l, int vol_r)
|
|||
/* 0101111 == mute (0x2f) */
|
||||
|
||||
/* OUT1 */
|
||||
wmcodec_write(LOUT1VOL, LOUT1VOL_LO1ZC | vol_l);
|
||||
wmcodec_write(ROUT1VOL, ROUT1VOL_RO1VU | ROUT1VOL_RO1ZC | vol_r);
|
||||
wm8975_write(LOUT1VOL, LOUT1VOL_LO1ZC | vol_l);
|
||||
wm8975_write(ROUT1VOL, ROUT1VOL_RO1VU | ROUT1VOL_RO1ZC | vol_r);
|
||||
}
|
||||
|
||||
void audiohw_set_lineout_vol(int vol_l, int vol_r)
|
||||
{
|
||||
/* OUT2 */
|
||||
wmcodec_write(LOUT2VOL, LOUT2VOL_LO2ZC | vol_l);
|
||||
wmcodec_write(ROUT2VOL, ROUT2VOL_RO2VU | ROUT2VOL_RO2ZC | vol_r);
|
||||
wm8975_write(LOUT2VOL, LOUT2VOL_LO2ZC | vol_l);
|
||||
wm8975_write(ROUT2VOL, ROUT2VOL_RO2VU | ROUT2VOL_RO2ZC | vol_r);
|
||||
}
|
||||
|
||||
void audiohw_enable_lineout(bool enable)
|
||||
|
|
@ -251,7 +245,7 @@ void audiohw_set_bass(int value)
|
|||
|
||||
if ((value >= -6) && (value <= 9)) {
|
||||
/* We use linear bass control with 200 Hz cutoff */
|
||||
wmcodec_write(BASSCTRL, regvalues[value + 6] | BASSCTRL_BC);
|
||||
wm8975_write(BASSCTRL, regvalues[value + 6] | BASSCTRL_BC);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -263,7 +257,7 @@ void audiohw_set_treble(int value)
|
|||
|
||||
if ((value >= -6) && (value <= 9)) {
|
||||
/* We use linear treble control with 4 kHz cutoff */
|
||||
wmcodec_write(TREBCTRL, regvalues[value + 6] | TREBCTRL_TC);
|
||||
wm8975_write(TREBCTRL, regvalues[value + 6] | TREBCTRL_TC);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -273,10 +267,10 @@ void audiohw_close(void)
|
|||
audiohw_mute(true);
|
||||
|
||||
/* 2. Disable all output buffers. */
|
||||
wmcodec_write(PWRMGMT2, 0x0);
|
||||
wm8975_write(PWRMGMT2, 0x0);
|
||||
|
||||
/* 3. Switch off the power supplies. */
|
||||
wmcodec_write(PWRMGMT1, 0x0);
|
||||
wm8975_write(PWRMGMT1, 0x0);
|
||||
}
|
||||
|
||||
/* Note: Disable output before calling this function */
|
||||
|
|
@ -296,24 +290,24 @@ void audiohw_enable_recording(bool source_mic)
|
|||
* the DACs disabled. Also the outputs shouldn't be disabled
|
||||
* when recording from line in (dock connector) - needs testing. */
|
||||
wm8975_regs[PWRMGMT2] &= ~(PWRMGMT2_LOUT1 | PWRMGMT2_ROUT1
|
||||
| PWRMGMT2_LOUT2 | PWRMGMT2_ROUT2);
|
||||
| PWRMGMT2_LOUT2 | PWRMGMT2_ROUT2);
|
||||
wm8975_write(PWRMGMT2, wm8975_regs[PWRMGMT2]);
|
||||
|
||||
wm8975_write_or(LINVOL, LINVOL_LINMUTE);
|
||||
wm8975_write_or(RINVOL, RINVOL_RINMUTE);
|
||||
|
||||
wmcodec_write(ADDCTRL3, ADDCTRL3_VROI);
|
||||
wm8975_write(ADDCTRL3, ADDCTRL3_VROI);
|
||||
|
||||
if (source_mic) {
|
||||
wmcodec_write(ADDCTRL1, ADDCTRL1_VSEL_LOWBIAS | ADDCTRL1_DATSEL_RADC
|
||||
| ADDCTRL1_TOEN);
|
||||
wmcodec_write(ADCLPATH, 0);
|
||||
wmcodec_write(ADCRPATH, ADCRPATH_RINSEL_RIN2 | ADCRPATH_RMICBOOST_20dB);
|
||||
wm8975_write(ADDCTRL1, ADDCTRL1_VSEL_LOWBIAS | ADDCTRL1_DATSEL_RADC
|
||||
| ADDCTRL1_TOEN);
|
||||
wm8975_write(ADCLPATH, 0);
|
||||
wm8975_write(ADCRPATH, ADCRPATH_RINSEL_RIN2 | ADCRPATH_RMICBOOST_20dB);
|
||||
} else {
|
||||
wmcodec_write(ADDCTRL1, ADDCTRL1_VSEL_LOWBIAS | ADDCTRL1_DATSEL_NORMAL
|
||||
| ADDCTRL1_TOEN);
|
||||
wmcodec_write(ADCLPATH, ADCLPATH_LINSEL_LIN1 | ADCLPATH_LMICBOOST_OFF);
|
||||
wmcodec_write(ADCRPATH, ADCRPATH_RINSEL_RIN1 | ADCRPATH_RMICBOOST_OFF);
|
||||
wm8975_write(ADDCTRL1, ADDCTRL1_VSEL_LOWBIAS | ADDCTRL1_DATSEL_NORMAL
|
||||
| ADDCTRL1_TOEN);
|
||||
wm8975_write(ADCLPATH, ADCLPATH_LINSEL_LIN1 | ADCLPATH_LMICBOOST_OFF);
|
||||
wm8975_write(ADCRPATH, ADCRPATH_RINSEL_RIN1 | ADCRPATH_RMICBOOST_OFF);
|
||||
}
|
||||
wm8975_write_and(LINVOL, ~LINVOL_LINMUTE);
|
||||
wm8975_write_and(RINVOL, ~RINVOL_RINMUTE);
|
||||
|
|
@ -325,7 +319,7 @@ void audiohw_disable_recording(void)
|
|||
wm8975_write_or(LINVOL, LINVOL_LINMUTE);
|
||||
wm8975_write_or(RINVOL, RINVOL_RINMUTE);
|
||||
|
||||
wmcodec_write(ADDCTRL3, 0);
|
||||
wm8975_write(ADDCTRL3, 0);
|
||||
|
||||
wm8975_regs[PWRMGMT2] |= PWRMGMT2_DACL | PWRMGMT2_DACR
|
||||
| PWRMGMT2_LOUT1 | PWRMGMT2_ROUT1
|
||||
|
|
@ -361,12 +355,12 @@ void audiohw_set_monitor(bool enable)
|
|||
if (enable) {
|
||||
/* set volume to 0 dB */
|
||||
wm8975_regs[LOUTMIX1] &= ~LOUTMIX1_LI2LOVOL_MASK;
|
||||
wm8975_regs[LOUTMIX1] |= LOUTMIX1_LI2LOVOL(2);
|
||||
wm8975_regs[LOUTMIX1] |= LOUTMIX1_LI2LOVOL(2);
|
||||
wm8975_regs[ROUTMIX2] &= ~ROUTMIX2_RI2ROVOL_MASK;
|
||||
wm8975_regs[ROUTMIX2] |= ROUTMIX2_RI2ROVOL(2);
|
||||
wm8975_regs[ROUTMIX2] |= ROUTMIX2_RI2ROVOL(2);
|
||||
/* set mux to line input */
|
||||
wm8975_write_and(LOUTMIX1, ~7);
|
||||
wm8975_write_and(ROUTMIX1, ~7);
|
||||
wm8975_write_and(LOUTMIX1, ~LOUTMIX1_LMIXSEL_MASK);
|
||||
wm8975_write_and(ROUTMIX1, ~ROUTMIX1_RMIXSEL_MASK);
|
||||
/* enable bypass */
|
||||
wm8975_write_or(LOUTMIX1, LOUTMIX1_LI2LO);
|
||||
wm8975_write_or(ROUTMIX2, ROUTMIX2_RI2RO);
|
||||
|
|
|
|||
|
|
@ -485,7 +485,7 @@ static int button_flip(int button)
|
|||
#if CONFIG_KEYPAD == RECORDER_PAD
|
||||
| BUTTON_F1 | BUTTON_F3
|
||||
#endif
|
||||
#if CONFIG_KEYPAD == SANSA_C200_PAD
|
||||
#if (CONFIG_KEYPAD == SANSA_C200_PAD) || (CONFIG_KEYPAD == SANSA_CLIP_PAD)
|
||||
| BUTTON_VOL_UP | BUTTON_VOL_DOWN
|
||||
#endif
|
||||
#if CONFIG_KEYPAD == PHILIPS_SA9200_PAD
|
||||
|
|
@ -516,7 +516,7 @@ static int button_flip(int button)
|
|||
if (button & BUTTON_F3)
|
||||
newbutton |= BUTTON_F1;
|
||||
#endif
|
||||
#if CONFIG_KEYPAD == SANSA_C200_PAD
|
||||
#if (CONFIG_KEYPAD == SANSA_C200_PAD) || (CONFIG_KEYPAD == SANSA_CLIP_PAD)
|
||||
if (button & BUTTON_VOL_UP)
|
||||
newbutton |= BUTTON_VOL_DOWN;
|
||||
if (button & BUTTON_VOL_DOWN)
|
||||
|
|
|
|||
|
|
@ -717,9 +717,7 @@ Lyre prototype 1 */
|
|||
#define HAVE_WAKEUP_EXT_CB
|
||||
|
||||
|
||||
#if defined(ASSEMBLER_THREADS) \
|
||||
|| defined(HAVE_WIN32_FIBER_THREADS) \
|
||||
|| defined(HAVE_SIGALTSTACK_THREADS)
|
||||
#if (CONFIG_PLATFORM & PLATFORM_ANDROID)
|
||||
#define HAVE_PRIORITY_SCHEDULING
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -207,7 +207,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this if a programmable hotkey is mapped */
|
||||
#define HAVE_HOTKEY
|
||||
|
|
|
|||
|
|
@ -224,7 +224,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this, if you can switch on/off the lineout */
|
||||
#define HAVE_LINEOUT_POWEROFF
|
||||
|
|
|
|||
|
|
@ -209,7 +209,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this, if you can switch on/off the lineout */
|
||||
#define HAVE_LINEOUT_POWEROFF
|
||||
|
|
|
|||
|
|
@ -211,7 +211,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this if a programmable hotkey is mapped */
|
||||
#define HAVE_HOTKEY
|
||||
|
|
|
|||
|
|
@ -214,7 +214,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this if a programmable hotkey is mapped */
|
||||
#define HAVE_HOTKEY
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this, if you can switch on/off the lineout */
|
||||
#define HAVE_LINEOUT_POWEROFF
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this if a programmable hotkey is mapped */
|
||||
#define HAVE_HOTKEY
|
||||
|
|
|
|||
|
|
@ -196,7 +196,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this if a programmable hotkey is mapped */
|
||||
#define HAVE_HOTKEY
|
||||
|
|
|
|||
|
|
@ -184,7 +184,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this if a programmable hotkey is mapped */
|
||||
#define HAVE_HOTKEY
|
||||
|
|
|
|||
|
|
@ -207,7 +207,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this if a programmable hotkey is mapped */
|
||||
#define HAVE_HOTKEY
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this if a programmable hotkey is mapped */
|
||||
#define HAVE_HOTKEY
|
||||
|
|
|
|||
|
|
@ -194,7 +194,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this if a programmable hotkey is mapped */
|
||||
#define HAVE_HOTKEY
|
||||
|
|
|
|||
|
|
@ -192,7 +192,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this if a programmable hotkey is mapped */
|
||||
#define HAVE_HOTKEY
|
||||
|
|
|
|||
|
|
@ -144,7 +144,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this if a programmable hotkey is mapped */
|
||||
//#define HAVE_HOTKEY
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@
|
|||
/* DMA is used only for reading on PP502x because although reads are ~8x faster
|
||||
* writes appear to be ~25% slower.
|
||||
*/
|
||||
#define HAVE_ATA_DMA
|
||||
/* Switched off due to reported instabilities. #define HAVE_ATA_DMA */
|
||||
|
||||
/* Define this if a programmable hotkey is mapped */
|
||||
#define HAVE_HOTKEY
|
||||
|
|
|
|||
|
|
@ -84,19 +84,15 @@
|
|||
* We need more stack when we run under a host
|
||||
* maybe more expensive C lib functions?
|
||||
*
|
||||
* simulator (possibly) doesn't simulate stack usage anyway but well ... */
|
||||
#ifdef HAVE_SIGALTSTACK_THREADS
|
||||
#include <signal.h>
|
||||
/* MINSIGSTKSZ for the OS to deliver the signal + 0x3000 for us */
|
||||
#define DEFAULT_STACK_SIZE (MINSIGSTKSZ+0x3000) /* Bytes */
|
||||
#elif (CONFIG_PLATFORM & PLATFORM_ANDROID) || defined(HAVE_WIN32_FIBER_THREADS)
|
||||
#define DEFAULT_STACK_SIZE 0x1000 /* Bytes */
|
||||
#else /* native threads, sdl threads */
|
||||
* simulator doesn't simulate stack usage anyway but well ... */
|
||||
#if ((CONFIG_PLATFORM & PLATFORM_NATIVE) || defined(SIMULATOR))
|
||||
#define DEFAULT_STACK_SIZE 0x400 /* Bytes */
|
||||
#else
|
||||
#define DEFAULT_STACK_SIZE 0x1000 /* Bytes */
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(ASSEMBLER_THREADS)
|
||||
#if (CONFIG_PLATFORM & (PLATFORM_NATIVE|PLATFORM_ANDROID))
|
||||
/* Need to keep structures inside the header file because debug_menu
|
||||
* needs them. */
|
||||
#ifdef CPU_COLDFIRE
|
||||
|
|
@ -116,7 +112,7 @@ struct regs
|
|||
uint32_t pr; /* 32 - Procedure register */
|
||||
uint32_t start; /* 36 - Thread start address, or NULL when started */
|
||||
};
|
||||
#elif defined(CPU_ARM)
|
||||
#elif defined(CPU_ARM) || (CONFIG_PLATFORM & PLATFORM_ANDROID)
|
||||
struct regs
|
||||
{
|
||||
uint32_t r[8]; /* 0-28 - Registers r4-r11 */
|
||||
|
|
@ -125,36 +121,6 @@ struct regs
|
|||
uint32_t start; /* 40 - Thread start address, or NULL when started */
|
||||
};
|
||||
|
||||
#elif defined(CPU_MIPS)
|
||||
struct regs
|
||||
{
|
||||
uint32_t r[9]; /* 0-32 - Registers s0-s7, fp */
|
||||
uint32_t sp; /* 36 - Stack pointer */
|
||||
uint32_t ra; /* 40 - Return address */
|
||||
uint32_t start; /* 44 - Thread start address, or NULL when started */
|
||||
};
|
||||
#endif /* CONFIG_CPU */
|
||||
#elif (CONFIG_PLATFORM & PLATFORM_HOSTED) || defined(__PCTOOL__)
|
||||
#ifndef HAVE_SDL_THREADS
|
||||
struct regs
|
||||
{
|
||||
void (*start)(void); /* thread's entry point, or NULL when started */
|
||||
void* uc; /* host thread handle */
|
||||
uintptr_t sp; /* Stack pointer, unused */
|
||||
size_t stack_size; /* stack size, not always used */
|
||||
uintptr_t stack; /* pointer to start of the stack buffer */
|
||||
};
|
||||
#else /* SDL threads */
|
||||
struct regs
|
||||
{
|
||||
void *t; /* OS thread */
|
||||
void *told; /* Last thread in slot (explained in thead-sdl.c) */
|
||||
void *s; /* Semaphore for blocking and wakeup */
|
||||
void (*start)(void); /* Start function */
|
||||
};
|
||||
#endif
|
||||
#endif /* PLATFORM_NATIVE */
|
||||
|
||||
#ifdef CPU_PP
|
||||
#ifdef HAVE_CORELOCK_OBJECT
|
||||
/* No reliable atomic instruction available - use Peterson's algorithm */
|
||||
|
|
@ -171,6 +137,24 @@ int corelock_try_lock(struct corelock *cl);
|
|||
void corelock_unlock(struct corelock *cl);
|
||||
#endif /* HAVE_CORELOCK_OBJECT */
|
||||
#endif /* CPU_PP */
|
||||
#elif defined(CPU_MIPS)
|
||||
struct regs
|
||||
{
|
||||
uint32_t r[9]; /* 0-32 - Registers s0-s7, fp */
|
||||
uint32_t sp; /* 36 - Stack pointer */
|
||||
uint32_t ra; /* 40 - Return address */
|
||||
uint32_t start; /* 44 - Thread start address, or NULL when started */
|
||||
};
|
||||
#endif /* CONFIG_CPU */
|
||||
#elif (CONFIG_PLATFORM & PLATFORM_HOSTED)
|
||||
struct regs
|
||||
{
|
||||
void *t; /* OS thread */
|
||||
void *told; /* Last thread in slot (explained in thead-sdl.c) */
|
||||
void *s; /* Semaphore for blocking and wakeup */
|
||||
void (*start)(void); /* Start function */
|
||||
};
|
||||
#endif /* PLATFORM_NATIVE */
|
||||
|
||||
/* NOTE: The use of the word "queue" may also refer to a linked list of
|
||||
threads being maintained that are normally dealt with in FIFO order
|
||||
|
|
@ -267,7 +251,7 @@ struct thread_entry
|
|||
object where thread is blocked - used
|
||||
for implicit unblock and explicit wake
|
||||
states: STATE_BLOCKED/STATE_BLOCKED_W_TMO */
|
||||
#ifdef HAVE_CORELOCK_OBJECT
|
||||
#if NUM_CORES > 1
|
||||
struct corelock *obj_cl; /* Object corelock where thead is blocked -
|
||||
states: STATE_BLOCKED/STATE_BLOCKED_W_TMO */
|
||||
struct corelock waiter_cl; /* Corelock for thread_wait */
|
||||
|
|
@ -324,7 +308,7 @@ struct thread_entry
|
|||
/* Specify current thread in a function taking an ID. */
|
||||
#define THREAD_ID_CURRENT ((unsigned int)-1)
|
||||
|
||||
#ifdef HAVE_CORELOCK_OBJECT
|
||||
#if NUM_CORES > 1
|
||||
/* Operations to be performed just before stopping a thread and starting
|
||||
a new one if specified before calling switch_thread */
|
||||
enum
|
||||
|
|
@ -357,7 +341,7 @@ struct core_entry
|
|||
threads */
|
||||
#endif
|
||||
long next_tmo_check; /* soonest time to check tmo threads */
|
||||
#ifdef HAVE_CORELOCK_OBJECT
|
||||
#if NUM_CORES > 1
|
||||
struct thread_blk_ops blk_ops; /* operations to perform when
|
||||
blocking a thread */
|
||||
struct corelock rtr_cl; /* Lock for rtr list */
|
||||
|
|
|
|||
|
|
@ -236,6 +236,7 @@ extern void audiohw_enable_lineout(bool enable);
|
|||
#define LOUTMIX1_LMIXSEL_LIN3 (2 << 0)
|
||||
#define LOUTMIX1_LMIXSEL_LADCIN (3 << 0)
|
||||
#define LOUTMIX1_LMIXSEL_DIFF (4 << 0)
|
||||
#define LOUTMIX1_LMIXSEL_MASK (7 << 0)
|
||||
#define LOUTMIX1_LI2LOVOL(x) ((x & 7) << 4)
|
||||
#define LOUTMIX1_LI2LOVOL_MASK (7 << 4)
|
||||
#define LOUTMIX1_LI2LO (1 << 7)
|
||||
|
|
@ -253,6 +254,7 @@ extern void audiohw_enable_lineout(bool enable);
|
|||
#define ROUTMIX1_RMIXSEL_RIN3 (2 << 0)
|
||||
#define ROUTMIX1_RMIXSEL_RADCIN (3 << 0)
|
||||
#define ROUTMIX1_RMIXSEL_DIFF (4 << 0)
|
||||
#define ROUTMIX1_RMIXSEL_MASK (7 << 0)
|
||||
#define ROUTMIX1_LI2ROVOL(x) ((x & 7) << 4)
|
||||
#define ROUTMIX1_LI2ROVOL_MASK (7 << 4)
|
||||
#define ROUTMIX1_LI2RO (1 << 7)
|
||||
|
|
@ -290,6 +292,8 @@ extern void audiohw_enable_lineout(bool enable);
|
|||
#define MOUTVOL_MASK 0x7f
|
||||
#define MOUTVOL_MOZC (1 << 7)
|
||||
|
||||
#define WM8975_NUM_REGISTERS 0x2b
|
||||
|
||||
|
||||
/* SAMPCTRL values for the supported samplerates: */
|
||||
#define WM8975_8000HZ 0x4d
|
||||
|
|
|
|||
|
|
@ -68,9 +68,7 @@ void (*tick_funcs[MAX_NUM_TICK_TASKS+1])(void);
|
|||
static struct
|
||||
{
|
||||
struct event_queue *queues[MAX_NUM_QUEUES+1];
|
||||
#ifdef HAVE_CORELOCK_OBJECT
|
||||
struct corelock cl;
|
||||
#endif
|
||||
IF_COP( struct corelock cl; )
|
||||
} all_queues SHAREDBSS_ATTR;
|
||||
|
||||
/****************************************************************************
|
||||
|
|
|
|||
|
|
@ -26,8 +26,6 @@
|
|||
#include "ascodec-target.h"
|
||||
#include "as3514.h"
|
||||
|
||||
int buttonlight_is_on = 0;
|
||||
|
||||
void _backlight_set_brightness(int brightness)
|
||||
{
|
||||
ascodec_write_pmu(AS3543_BACKLIGHT, 2, brightness * 10);
|
||||
|
|
@ -39,8 +37,14 @@ bool _backlight_init(void)
|
|||
ascodec_write_pmu(AS3543_BACKLIGHT, 2, backlight_brightness * 10);
|
||||
|
||||
/* needed for button light */
|
||||
if (amsv2_variant == 1)
|
||||
if (amsv2_variant == 0)
|
||||
{
|
||||
GPIOB_DIR |= 1<<5;
|
||||
}
|
||||
else
|
||||
{
|
||||
ascodec_write_pmu(0x1a, 1, 0x30); /* MUX_PWGD = PWM */
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -65,9 +69,7 @@ void _buttonlight_on(void)
|
|||
{
|
||||
if (amsv2_variant == 0)
|
||||
{
|
||||
GPIOB_DIR |= 1<<5;
|
||||
GPIOB_PIN(5) = (1<<5);
|
||||
buttonlight_is_on = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -80,8 +82,6 @@ void _buttonlight_off(void)
|
|||
if (amsv2_variant == 0)
|
||||
{
|
||||
GPIOB_PIN(5) = 0;
|
||||
GPIOB_DIR &= ~(1<<5);
|
||||
buttonlight_is_on = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -46,10 +46,6 @@
|
|||
#include "disk.h"
|
||||
#endif
|
||||
|
||||
#if defined(SANSA_FUZEV2)
|
||||
#include "backlight-target.h"
|
||||
#endif
|
||||
|
||||
#include "lcd.h"
|
||||
#include <stdarg.h>
|
||||
#include "sysfont.h"
|
||||
|
|
@ -399,9 +395,9 @@ static bool send_cmd(const int drive, const int cmd, const int arg, const int fl
|
|||
!send_cmd(drive, SD_APP_CMD, card_info[drive].rca, MCI_RESP, response))
|
||||
return false;
|
||||
|
||||
#if defined(HAVE_MULTIDRIVE)
|
||||
if(sd_present(SD_SLOT_AS3525))
|
||||
GPIOB_PIN(5) = (1-drive) << 5;
|
||||
#if defined(SANSA_FUZEV2) || defined(SANSA_CLIPPLUS)
|
||||
if (amsv2_variant == 1)
|
||||
GPIOB_PIN(5) = (drive == INTERNAL_AS3525) ? 1 << 5 : 0;
|
||||
#endif
|
||||
|
||||
MCI_ARGUMENT = arg;
|
||||
|
|
@ -423,25 +419,15 @@ static bool send_cmd(const int drive, const int cmd, const int arg, const int fl
|
|||
/*b10 */ | ((cmd == SD_WRITE_MULTIPLE_BLOCK) ? CMD_RW_BIT: 0)
|
||||
/*b11 | CMD_TRANSMODE_BIT unused */
|
||||
/*b12 | CMD_SENT_AUTO_STOP_BIT unused */
|
||||
/*b13 */ | (TRANSFER_CMD ? CMD_WAIT_PRV_DAT_BIT: 0)
|
||||
/*b13 */ | ((cmd != SD_STOP_TRANSMISSION) ? CMD_WAIT_PRV_DAT_BIT: 0)
|
||||
/*b14 | CMD_ABRT_CMD_BIT unused */
|
||||
/*b15 | CMD_SEND_INIT_BIT unused */
|
||||
/*b15 */ | ((cmd == SD_GO_IDLE_STATE) ? CMD_SEND_INIT_BIT: 0)
|
||||
/*b20:16 */ | card_no
|
||||
/*b21 | CMD_SEND_CLK_ONLY unused */
|
||||
/*b22 | CMD_READ_CEATA unused */
|
||||
/*b23 | CMD_CCS_EXPECTED unused */
|
||||
/*b31 */ | CMD_DONE_BIT;
|
||||
|
||||
#if defined(SANSA_FUZEV2)
|
||||
if (amsv2_variant == 0)
|
||||
{
|
||||
extern int buttonlight_is_on;
|
||||
if(buttonlight_is_on)
|
||||
_buttonlight_on();
|
||||
else
|
||||
_buttonlight_off();
|
||||
}
|
||||
#endif
|
||||
wakeup_wait(&command_completion_signal, TIMEOUT_BLOCK);
|
||||
|
||||
/* Handle command responses & errors */
|
||||
|
|
@ -546,56 +532,33 @@ static int sd_init_card(const int drive)
|
|||
#endif
|
||||
/* End of Card Identification Mode ************************************/
|
||||
|
||||
if (sd_v2)
|
||||
{
|
||||
/* Attempt to switch cards to HS timings, non HS cards just ignore this */
|
||||
/* CMD7 w/rca: Select card to put it in TRAN state */
|
||||
if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_NO_RESP, NULL))
|
||||
return -7;
|
||||
|
||||
if(sd_wait_for_tran_state(drive))
|
||||
return -8;
|
||||
|
||||
/* CMD6 */
|
||||
if(!send_cmd(drive, SD_SWITCH_FUNC, 0x80fffff1, MCI_NO_RESP, NULL))
|
||||
return -9;
|
||||
mci_delay();
|
||||
|
||||
/* We need to go back to STBY state now so we can read csd */
|
||||
/* CMD7 w/rca=0: Deselect card to put it in STBY state */
|
||||
if(!send_cmd(drive, SD_DESELECT_CARD, 0, MCI_NO_RESP, NULL))
|
||||
return -10;
|
||||
}
|
||||
/* Card back to full speed */
|
||||
MCI_CLKDIV &= ~(0xFF); /* CLK_DIV_0 : bits 7:0 = 0x00 */
|
||||
|
||||
/* CMD9 send CSD */
|
||||
if(!send_cmd(drive, SD_SEND_CSD, card_info[drive].rca,
|
||||
MCI_RESP|MCI_LONG_RESP, card_info[drive].csd))
|
||||
return -11;
|
||||
|
||||
mci_delay();
|
||||
|
||||
sd_parse_csd(&card_info[drive]);
|
||||
|
||||
if(drive == INTERNAL_AS3525) /* The OF is stored in the first blocks */
|
||||
card_info[INTERNAL_AS3525].numblocks -= AMS_OF_SIZE;
|
||||
|
||||
/* Card back to full speed */
|
||||
MCI_CLKDIV &= ~(0xFF); /* CLK_DIV_0 : bits 7:0 = 0x00 */
|
||||
|
||||
/* CMD7 w/rca: Select card to put it in TRAN state */
|
||||
if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_NO_RESP, NULL))
|
||||
return -12;
|
||||
|
||||
#ifndef BOOTLOADER
|
||||
/* Switch to to 4 bit widebus mode */
|
||||
|
||||
/* CMD7 w/rca: Select card to put it in TRAN state */
|
||||
if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_RESP, &response))
|
||||
return -12;
|
||||
if(sd_wait_for_tran_state(drive) < 0)
|
||||
return -13;
|
||||
/* ACMD6 */
|
||||
if(!send_cmd(drive, SD_SET_BUS_WIDTH, 2, MCI_ACMD|MCI_NO_RESP, NULL))
|
||||
|
||||
/* ACMD6: set bus width to 4-bit */
|
||||
if(!send_cmd(drive, SD_SET_BUS_WIDTH, 2, MCI_ACMD|MCI_RESP, &response))
|
||||
return -15;
|
||||
mci_delay();
|
||||
/* ACMD42 */
|
||||
if(!send_cmd(drive, SD_SET_CLR_CARD_DETECT, 0, MCI_ACMD|MCI_NO_RESP, NULL))
|
||||
/* ACMD42: disconnect the pull-up resistor on CD/DAT3 */
|
||||
if(!send_cmd(drive, SD_SET_CLR_CARD_DETECT, 0, MCI_ACMD|MCI_RESP, &response))
|
||||
return -17;
|
||||
|
||||
/* Now that card is widebus make controller aware */
|
||||
|
|
@ -611,7 +574,7 @@ static int sd_init_card(const int drive)
|
|||
/* Set low power mode */
|
||||
#if defined(SANSA_FUZEV2) || defined(SANSA_CLIPPLUS)
|
||||
if (amsv2_variant == 1)
|
||||
MCI_CLKENA |= 1<<16;
|
||||
MCI_CLKENA |= 1<<(1 + 16);
|
||||
else
|
||||
#endif
|
||||
MCI_CLKENA |= 1<<(drive + 16);
|
||||
|
|
@ -817,6 +780,7 @@ int sd_init(void)
|
|||
static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
|
||||
int count, void* buf, bool write)
|
||||
{
|
||||
unsigned long response;
|
||||
int ret = 0;
|
||||
#ifndef HAVE_MULTIDRIVE
|
||||
const int drive = 0;
|
||||
|
|
@ -826,6 +790,7 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
|
|||
int retry_all = 0;
|
||||
int const retry_data_max = 100; /* Generous, methinks */
|
||||
int retry_data;
|
||||
unsigned int real_numblocks;
|
||||
|
||||
mutex_lock(&sd_mtx);
|
||||
#ifndef BOOTLOADER
|
||||
|
|
@ -855,7 +820,13 @@ sd_transfer_retry_with_reinit:
|
|||
goto sd_transfer_error_no_dma;
|
||||
}
|
||||
|
||||
if((start+count) > card_info[drive].numblocks)
|
||||
/* Check the real block size after the card has been initialized */
|
||||
real_numblocks = card_info[drive].numblocks;
|
||||
/* 'start' represents the real (physical) starting sector
|
||||
* so we must compare it to the real (physical) number of sectors */
|
||||
if (drive == INTERNAL_AS3525)
|
||||
real_numblocks += AMS_OF_SIZE;
|
||||
if ((start+count) > real_numblocks)
|
||||
{
|
||||
ret = -19;
|
||||
goto sd_transfer_error_no_dma;
|
||||
|
|
@ -925,8 +896,7 @@ sd_transfer_retry_with_reinit:
|
|||
dma_enable_channel(0, MCI_FIFO, dma_buf, DMA_PERI_SD,
|
||||
DMAC_FLOWCTRL_PERI_PERI_TO_MEM, false, true, 0, DMA_S8, NULL);
|
||||
|
||||
unsigned long dummy; /* if we don't ask for a response, writing fails */
|
||||
if(!send_cmd(drive, cmd, arg, MCI_RESP, &dummy))
|
||||
if(!send_cmd(drive, cmd, arg, MCI_RESP, &response))
|
||||
{
|
||||
ret = -21;
|
||||
goto sd_transfer_error;
|
||||
|
|
@ -942,7 +912,7 @@ sd_transfer_retry_with_reinit:
|
|||
while(MCI_STATUS & DATA_BUSY) ;
|
||||
}
|
||||
|
||||
if(!send_cmd(drive, SD_STOP_TRANSMISSION, 0, MCI_NO_RESP, NULL))
|
||||
if(!send_cmd(drive, SD_STOP_TRANSMISSION, 0, MCI_RESP, &response))
|
||||
{
|
||||
ret = -22;
|
||||
goto sd_transfer_error;
|
||||
|
|
@ -999,10 +969,7 @@ sd_transfer_error_no_dma:
|
|||
/* .initialized might have been >= 0 but now stale if the ata sd thread
|
||||
* isn't handling an insert because of USB */
|
||||
if (--retry_all >= 0)
|
||||
{
|
||||
ret = 0;
|
||||
goto sd_transfer_retry_with_reinit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1061,12 +1028,12 @@ tCardInfo *card_get_info_target(int card_no)
|
|||
#ifdef HAVE_HOTSWAP
|
||||
bool sd_removable(IF_MD_NONVOID(int drive))
|
||||
{
|
||||
return (drive==1);
|
||||
return (drive == SD_SLOT_AS3525);
|
||||
}
|
||||
|
||||
bool sd_present(IF_MD_NONVOID(int drive))
|
||||
{
|
||||
return (drive == 0) ? true : card_detect_target();
|
||||
return (drive == INTERNAL_AS3525) ? true : card_detect_target();
|
||||
}
|
||||
|
||||
static int sd1_oneshot_callback(struct timeout *tmo)
|
||||
|
|
|
|||
|
|
@ -33,6 +33,6 @@ int tuner_detect_type(void)
|
|||
if (rda5802_detect()) {
|
||||
return RDA5802;
|
||||
}
|
||||
return 0;
|
||||
return RDA5802;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ void power_off(void)
|
|||
void power_init(void)
|
||||
{
|
||||
pmu_write(0x1e, 0xf); /* Vcore = 1.000V */
|
||||
pmu_ldo_set_voltage(2, 0x11); /* LCD = 2.600V */
|
||||
pmu_ldo_set_voltage(2, 0x13); /* LCD = 2.800V */
|
||||
}
|
||||
|
||||
#if CONFIG_CHARGING
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
#include "button.h"
|
||||
#include "kernel.h"
|
||||
#include "backlight.h"
|
||||
#include "system.h"
|
||||
#include "misc.h"
|
||||
#include "button-sdl.h"
|
||||
#include "backlight.h"
|
||||
#include "sim_tasks.h"
|
||||
|
|
|
|||
|
|
@ -34,14 +34,6 @@
|
|||
static SDL_TimerID tick_timer_id;
|
||||
long start_tick;
|
||||
|
||||
#ifndef HAVE_SDL_THREADS
|
||||
/* for the wait_for_interrupt function */
|
||||
static bool do_exit;
|
||||
static SDL_cond *wfi_cond;
|
||||
static SDL_mutex *wfi_mutex;
|
||||
#else
|
||||
#define do_exit false
|
||||
#endif
|
||||
/* Condition to signal that "interrupts" may proceed */
|
||||
static SDL_cond *sim_thread_cond;
|
||||
/* Mutex to serialize changing levels and exclude other threads while
|
||||
|
|
@ -106,9 +98,6 @@ void sim_exit_irq_handler(void)
|
|||
|
||||
status_reg = 0;
|
||||
SDL_UnlockMutex(sim_irq_mtx);
|
||||
#ifndef HAVE_SDL_THREADS
|
||||
SDL_CondSignal(wfi_cond);
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool sim_kernel_init(void)
|
||||
|
|
@ -126,33 +115,15 @@ static bool sim_kernel_init(void)
|
|||
panicf("Cannot create sim_thread_cond\n");
|
||||
return false;
|
||||
}
|
||||
#ifndef HAVE_SDL_THREADS
|
||||
wfi_cond = SDL_CreateCond();
|
||||
if (wfi_cond == NULL)
|
||||
{
|
||||
panicf("Cannot create wfi\n");
|
||||
return false;
|
||||
}
|
||||
wfi_mutex = SDL_CreateMutex();
|
||||
if (wfi_mutex == NULL)
|
||||
{
|
||||
panicf("Cannot create wfi mutex\n");
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void sim_kernel_shutdown(void)
|
||||
{
|
||||
SDL_RemoveTimer(tick_timer_id);
|
||||
#ifndef HAVE_SDL_THREADS
|
||||
do_exit = true;
|
||||
SDL_CondSignal(wfi_cond);
|
||||
#endif
|
||||
disable_irq();
|
||||
SDL_DestroyMutex(sim_irq_mtx);
|
||||
SDL_DestroyCond(sim_thread_cond);
|
||||
SDL_DestroyCond(sim_thread_cond);
|
||||
}
|
||||
|
||||
Uint32 tick_timer(Uint32 interval, void *param)
|
||||
|
|
@ -164,7 +135,7 @@ Uint32 tick_timer(Uint32 interval, void *param)
|
|||
|
||||
new_tick = (SDL_GetTicks() - start_tick) / (1000/HZ);
|
||||
|
||||
while(new_tick != current_tick && !do_exit)
|
||||
while(new_tick != current_tick)
|
||||
{
|
||||
sim_enter_irq_handler();
|
||||
|
||||
|
|
@ -175,7 +146,7 @@ Uint32 tick_timer(Uint32 interval, void *param)
|
|||
sim_exit_irq_handler();
|
||||
}
|
||||
|
||||
return do_exit ? 0 : interval;
|
||||
return interval;
|
||||
}
|
||||
|
||||
void tick_start(unsigned int interval_in_ms)
|
||||
|
|
@ -197,29 +168,4 @@ void tick_start(unsigned int interval_in_ms)
|
|||
}
|
||||
|
||||
tick_timer_id = SDL_AddTimer(interval_in_ms, tick_timer, NULL);
|
||||
#ifndef HAVE_SDL_THREADS
|
||||
SDL_LockMutex(wfi_mutex);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef HAVE_SDL_THREADS
|
||||
static void check_exit(void)
|
||||
{
|
||||
if (UNLIKELY(do_exit))
|
||||
{
|
||||
SDL_DestroyCond(wfi_cond);
|
||||
SDL_UnlockMutex(wfi_mutex);
|
||||
SDL_DestroyMutex(wfi_mutex);
|
||||
sim_do_exit();
|
||||
}
|
||||
}
|
||||
|
||||
void wait_for_interrupt(void)
|
||||
{
|
||||
/* the exit may come at any time, during the CondWait or before,
|
||||
* so check it twice */
|
||||
check_exit();
|
||||
SDL_CondWait(wfi_cond, wfi_mutex);
|
||||
check_exit();
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -184,9 +184,7 @@ static int sdl_event_thread(void * param)
|
|||
|
||||
/* Order here is relevent to prevent deadlocks and use of destroyed
|
||||
sync primitives by kernel threads */
|
||||
#ifdef HAVE_SDL_THREADS
|
||||
sim_thread_shutdown(); /* not needed for native threads */
|
||||
#endif
|
||||
sim_thread_shutdown();
|
||||
sim_kernel_shutdown();
|
||||
|
||||
return 0;
|
||||
|
|
@ -201,13 +199,9 @@ void sim_do_exit(void)
|
|||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
uintptr_t *stackbegin;
|
||||
uintptr_t *stackend;
|
||||
void system_init(void)
|
||||
{
|
||||
SDL_sem *s;
|
||||
/* fake stack, OS manages size (and growth) */
|
||||
stackbegin = stackend = (uintptr_t*)&s;
|
||||
|
||||
#if (CONFIG_PLATFORM & PLATFORM_MAEMO)
|
||||
/* Make glib thread safe */
|
||||
|
|
@ -225,24 +219,21 @@ void system_init(void)
|
|||
/* wait for sdl_event_thread to run so that it can initialize the surfaces
|
||||
* and video subsystem needed for SDL events */
|
||||
SDL_SemWait(s);
|
||||
|
||||
/* cleanup */
|
||||
SDL_DestroySemaphore(s);
|
||||
}
|
||||
|
||||
void system_exception_wait(void)
|
||||
{
|
||||
sim_thread_exception_wait();
|
||||
}
|
||||
|
||||
void system_reboot(void)
|
||||
{
|
||||
#ifdef HAVE_SDL_THREADS
|
||||
sim_thread_exception_wait();
|
||||
#else
|
||||
sim_do_exit();
|
||||
#endif
|
||||
}
|
||||
|
||||
void system_exception_wait(void)
|
||||
{
|
||||
system_reboot();
|
||||
}
|
||||
|
||||
void sys_handle_argv(int argc, char *argv[])
|
||||
{
|
||||
|
|
|
|||
|
|
@ -46,9 +46,6 @@ void sys_poweroff(void);
|
|||
void sys_handle_argv(int argc, char *argv[]);
|
||||
void gui_message_loop(void);
|
||||
void sim_do_exit(void);
|
||||
#ifndef HAVE_SDL_THREADS
|
||||
void wait_for_interrupt(void);
|
||||
#endif
|
||||
|
||||
extern bool background; /* True if the background image is enabled */
|
||||
extern bool showremote;
|
||||
|
|
|
|||
|
|
@ -22,13 +22,11 @@
|
|||
#ifndef __THREADSDL_H__
|
||||
#define __THREADSDL_H__
|
||||
|
||||
#ifdef HAVE_SDL_THREADS
|
||||
/* extra thread functions that only apply when running on hosting platforms */
|
||||
void sim_thread_lock(void *me);
|
||||
void * sim_thread_unlock(void);
|
||||
void sim_thread_exception_wait(void);
|
||||
void sim_thread_shutdown(void); /* Shut down all kernel threads gracefully */
|
||||
#endif
|
||||
|
||||
#endif /* #ifndef __THREADSDL_H__ */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,98 +0,0 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2005 by Thom Johansen
|
||||
* Copyright (C) 2010 by Thomas Martitz (Android-suitable core_sleep())
|
||||
*
|
||||
* Generic ARM threading support
|
||||
*
|
||||
* 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; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include <system.h>
|
||||
/*---------------------------------------------------------------------------
|
||||
* Start the thread running and terminate it if it returns
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
static void __attribute__((naked,used)) start_thread(void)
|
||||
{
|
||||
/* r0 = context */
|
||||
asm volatile (
|
||||
"ldr sp, [r0, #32] \n" /* Load initial sp */
|
||||
"ldr r4, [r0, #40] \n" /* start in r4 since it's non-volatile */
|
||||
"mov r1, #0 \n" /* Mark thread as running */
|
||||
"str r1, [r0, #40] \n"
|
||||
"mov lr, pc \n" /* Call thread function */
|
||||
"bx r4 \n"
|
||||
); /* No clobber list - new thread doesn't care */
|
||||
thread_exit();
|
||||
}
|
||||
|
||||
/* For startup, place context pointer in r4 slot, start_thread pointer in r5
|
||||
* slot, and thread function pointer in context.start. See load_context for
|
||||
* what happens when thread is initially going to run. */
|
||||
#define THREAD_STARTUP_INIT(core, thread, function) \
|
||||
({ (thread)->context.r[0] = (uint32_t)&(thread)->context, \
|
||||
(thread)->context.r[1] = (uint32_t)start_thread, \
|
||||
(thread)->context.start = (uint32_t)function; })
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Store non-volatile context.
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
static inline void store_context(void* addr)
|
||||
{
|
||||
asm volatile(
|
||||
"stmia %0, { r4-r11, sp, lr } \n"
|
||||
: : "r" (addr)
|
||||
);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Load non-volatile context.
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
static inline void load_context(const void* addr)
|
||||
{
|
||||
asm volatile(
|
||||
"ldr r0, [%0, #40] \n" /* Load start pointer */
|
||||
"cmp r0, #0 \n" /* Check for NULL */
|
||||
|
||||
/* If not already running, jump to start */
|
||||
"ldmneia %0, { r0, pc } \n"
|
||||
"ldmia %0, { r4-r11, sp, lr } \n" /* Load regs r4 to r14 from context */
|
||||
: : "r" (addr) : "r0" /* only! */
|
||||
);
|
||||
}
|
||||
|
||||
/*
|
||||
* this core sleep suspends the OS thread rockbox runs under, which greatly
|
||||
* reduces cpu usage (~100% to <10%)
|
||||
*
|
||||
* it returns when when the tick timer is called, other interrupt-like
|
||||
* events occur
|
||||
*
|
||||
* wait_for_interrupt is implemented in kernel-<platform>.c
|
||||
**/
|
||||
|
||||
static inline void core_sleep(void)
|
||||
{
|
||||
enable_irq();
|
||||
wait_for_interrupt();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1,294 +0,0 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <setjmp.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <errno.h>
|
||||
#include "debug.h"
|
||||
|
||||
static volatile bool sig_handler_called;
|
||||
static volatile jmp_buf tramp_buf;
|
||||
static volatile jmp_buf bootstrap_buf;
|
||||
static void (*thread_func)(void);
|
||||
static const int trampoline_sig = SIGUSR1;
|
||||
static pthread_t main_thread;
|
||||
|
||||
static struct ctx {
|
||||
jmp_buf thread_buf;
|
||||
} thread_bufs[MAXTHREADS];
|
||||
static struct ctx* thread_context, *target_context;
|
||||
static int curr_uc;
|
||||
|
||||
static void trampoline(int sig);
|
||||
static void bootstrap_context(void) __attribute__((noinline));
|
||||
|
||||
/* The *_context functions are heavily based on Gnu pth
|
||||
* http://www.gnu.org/software/pth/
|
||||
*
|
||||
* adjusted to work in a multi-thread environment to
|
||||
* offer a ucontext-like API
|
||||
*/
|
||||
|
||||
/*
|
||||
* VARIANT 2: THE SIGNAL STACK TRICK
|
||||
*
|
||||
* This uses sigstack/sigaltstack() and friends and is really the
|
||||
* most tricky part of Pth. When you understand the following
|
||||
* stuff you're a good Unix hacker and then you've already
|
||||
* understood the gory ingredients of Pth. So, either welcome to
|
||||
* the club of hackers, or do yourself a favor and skip this ;)
|
||||
*
|
||||
* The ingenious fact is that this variant runs really on _all_ POSIX
|
||||
* compliant systems without special platform kludges. But be _VERY_
|
||||
* carefully when you change something in the following code. The slightest
|
||||
* change or reordering can lead to horribly broken code. Really every
|
||||
* function call in the following case is intended to be how it is, doubt
|
||||
* me...
|
||||
*
|
||||
* For more details we strongly recommend you to read the companion
|
||||
* paper ``Portable Multithreading -- The Signal Stack Trick for
|
||||
* User-Space Thread Creation'' from Ralf S. Engelschall. A copy of the
|
||||
* draft of this paper you can find in the file rse-pmt.ps inside the
|
||||
* GNU Pth distribution.
|
||||
*/
|
||||
|
||||
static int make_context(struct ctx *ctx, void (*f)(void), char *sp, size_t stack_size)
|
||||
{
|
||||
struct sigaction sa;
|
||||
struct sigaction osa;
|
||||
stack_t ss;
|
||||
stack_t oss;
|
||||
sigset_t osigs;
|
||||
sigset_t sigs;
|
||||
|
||||
disable_irq();
|
||||
/*
|
||||
* Preserve the trampoline_sig signal state, block trampoline_sig,
|
||||
* and establish our signal handler. The signal will
|
||||
* later transfer control onto the signal stack.
|
||||
*/
|
||||
sigemptyset(&sigs);
|
||||
sigaddset(&sigs, trampoline_sig);
|
||||
sigprocmask(SIG_BLOCK, &sigs, &osigs);
|
||||
sa.sa_handler = trampoline;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = SA_ONSTACK;
|
||||
if (sigaction(trampoline_sig, &sa, &osa) != 0)
|
||||
{
|
||||
DEBUGF("%s(): %s\n", __func__, strerror(errno));
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
* Set the new stack.
|
||||
*
|
||||
* For sigaltstack we're lucky [from sigaltstack(2) on
|
||||
* FreeBSD 3.1]: ``Signal stacks are automatically adjusted
|
||||
* for the direction of stack growth and alignment
|
||||
* requirements''
|
||||
*
|
||||
* For sigstack we have to decide ourself [from sigstack(2)
|
||||
* on Solaris 2.6]: ``The direction of stack growth is not
|
||||
* indicated in the historical definition of struct sigstack.
|
||||
* The only way to portably establish a stack pointer is for
|
||||
* the application to determine stack growth direction.''
|
||||
*/
|
||||
ss.ss_sp = sp;
|
||||
ss.ss_size = stack_size;
|
||||
ss.ss_flags = 0;
|
||||
if (sigaltstack(&ss, &oss) < 0)
|
||||
{
|
||||
DEBUGF("%s(): %s\n", __func__, strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now transfer control onto the signal stack and set it up.
|
||||
* It will return immediately via "return" after the setjmp()
|
||||
* was performed. Be careful here with race conditions. The
|
||||
* signal can be delivered the first time sigsuspend() is
|
||||
* called.
|
||||
*/
|
||||
sig_handler_called = false;
|
||||
main_thread = pthread_self();
|
||||
sigfillset(&sigs);
|
||||
sigdelset(&sigs, trampoline_sig);
|
||||
pthread_kill(main_thread, trampoline_sig);
|
||||
while(!sig_handler_called)
|
||||
sigsuspend(&sigs);
|
||||
|
||||
/*
|
||||
* Inform the system that we are back off the signal stack by
|
||||
* removing the alternative signal stack. Be careful here: It
|
||||
* first has to be disabled, before it can be removed.
|
||||
*/
|
||||
sigaltstack(NULL, &ss);
|
||||
ss.ss_flags = SS_DISABLE;
|
||||
if (sigaltstack(&ss, NULL) < 0)
|
||||
{
|
||||
DEBUGF("%s(): %s\n", __func__, strerror(errno));
|
||||
return false;
|
||||
}
|
||||
sigaltstack(NULL, &ss);
|
||||
if (!(ss.ss_flags & SS_DISABLE))
|
||||
{
|
||||
DEBUGF("%s(): %s\n", __func__, strerror(errno));
|
||||
return false;
|
||||
}
|
||||
if (!(oss.ss_flags & SS_DISABLE))
|
||||
sigaltstack(&oss, NULL);
|
||||
|
||||
/*
|
||||
* Restore the old trampoline_sig signal handler and mask
|
||||
*/
|
||||
sigaction(trampoline_sig, &osa, NULL);
|
||||
sigprocmask(SIG_SETMASK, &osigs, NULL);
|
||||
|
||||
/*
|
||||
* Tell the trampoline and bootstrap function where to dump
|
||||
* the new machine context, and what to do afterwards...
|
||||
*/
|
||||
thread_func = f;
|
||||
thread_context = ctx;
|
||||
|
||||
/*
|
||||
* Now enter the trampoline again, but this time not as a signal
|
||||
* handler. Instead we jump into it directly. The functionally
|
||||
* redundant ping-pong pointer arithmentic is neccessary to avoid
|
||||
* type-conversion warnings related to the `volatile' qualifier and
|
||||
* the fact that `jmp_buf' usually is an array type.
|
||||
*/
|
||||
if (setjmp(*((jmp_buf *)&bootstrap_buf)) == 0)
|
||||
longjmp(*((jmp_buf *)&tramp_buf), 1);
|
||||
|
||||
/*
|
||||
* Ok, we returned again, so now we're finished
|
||||
*/
|
||||
enable_irq();
|
||||
return true;
|
||||
}
|
||||
|
||||
static void trampoline(int sig)
|
||||
{
|
||||
(void)sig;
|
||||
/* sanity check, no other thread should be here */
|
||||
if (pthread_self() != main_thread)
|
||||
return;
|
||||
|
||||
if (setjmp(*((jmp_buf *)&tramp_buf)) == 0)
|
||||
{
|
||||
sig_handler_called = true;
|
||||
return;
|
||||
}
|
||||
/* longjump'd back in */
|
||||
bootstrap_context();
|
||||
}
|
||||
|
||||
void bootstrap_context(void)
|
||||
{
|
||||
/* copy to local storage so we can spawn further threads
|
||||
* in the meantime */
|
||||
void (*thread_entry)(void) = thread_func;
|
||||
struct ctx *t = thread_context;
|
||||
|
||||
/*
|
||||
* Save current machine state (on new stack) and
|
||||
* go back to caller until we're scheduled for real...
|
||||
*/
|
||||
if (setjmp(t->thread_buf) == 0)
|
||||
longjmp(*((jmp_buf *)&bootstrap_buf), 1);
|
||||
|
||||
/*
|
||||
* The new thread is now running: GREAT!
|
||||
* Now we just invoke its init function....
|
||||
*/
|
||||
thread_entry();
|
||||
DEBUGF("thread left\n");
|
||||
thread_exit();
|
||||
}
|
||||
|
||||
static inline void set_context(struct ctx *c)
|
||||
{
|
||||
longjmp(c->thread_buf, 1);
|
||||
}
|
||||
|
||||
static inline void swap_context(struct ctx *old, struct ctx *new)
|
||||
{
|
||||
if (setjmp(old->thread_buf) == 0)
|
||||
longjmp(new->thread_buf, 1);
|
||||
}
|
||||
|
||||
static inline void get_context(struct ctx *c)
|
||||
{
|
||||
setjmp(c->thread_buf);
|
||||
}
|
||||
|
||||
|
||||
static void setup_thread(struct regs *context);
|
||||
|
||||
#define INIT_MAIN_THREAD
|
||||
static void init_main_thread(void *addr)
|
||||
{
|
||||
/* get a context for the main thread so that we can jump to it from
|
||||
* other threads */
|
||||
struct regs *context = (struct regs*)addr;
|
||||
context->uc = &thread_bufs[curr_uc++];
|
||||
get_context(context->uc);
|
||||
}
|
||||
|
||||
#define THREAD_STARTUP_INIT(core, thread, function) \
|
||||
({ (thread)->context.stack_size = (thread)->stack_size, \
|
||||
(thread)->context.stack = (uintptr_t)(thread)->stack; \
|
||||
(thread)->context.start = function; })
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Prepare context to make the thread runnable by calling swapcontext on it
|
||||
*/
|
||||
static void setup_thread(struct regs *context)
|
||||
{
|
||||
void (*fn)(void) = context->start;
|
||||
context->uc = &thread_bufs[curr_uc++];
|
||||
while (!make_context(context->uc, fn, (char*)context->stack, context->stack_size))
|
||||
DEBUGF("Thread creation failed. Retrying");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Save the ucontext_t pointer for later use in swapcontext()
|
||||
*
|
||||
* Cannot do getcontext() here, because jumping back to the context
|
||||
* resumes after the getcontext call (i.e. store_context), but we need
|
||||
* to resume from load_context()
|
||||
*/
|
||||
static inline void store_context(void* addr)
|
||||
{
|
||||
struct regs *r = (struct regs*)addr;
|
||||
target_context = r->uc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform context switch
|
||||
*/
|
||||
static inline void load_context(const void* addr)
|
||||
{
|
||||
struct regs *r = (struct regs*)addr;
|
||||
if (UNLIKELY(r->start))
|
||||
{
|
||||
setup_thread(r);
|
||||
r->start = NULL;
|
||||
}
|
||||
swap_context(target_context, r->uc);
|
||||
}
|
||||
|
||||
/*
|
||||
* play nice with the host and sleep while waiting for the tick */
|
||||
extern void wait_for_interrupt(void);
|
||||
static inline void core_sleep(void)
|
||||
{
|
||||
enable_irq();
|
||||
wait_for_interrupt();
|
||||
}
|
||||
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2010 by Thomas Martitz
|
||||
*
|
||||
* Generic ARM threading support
|
||||
*
|
||||
* 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; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
#include <windows.h>
|
||||
#include "system.h"
|
||||
|
||||
#define INIT_MAIN_THREAD
|
||||
|
||||
#define THREAD_STARTUP_INIT(core, thread, function) \
|
||||
({ (thread)->context.stack_size = (thread)->stack_size, \
|
||||
(thread)->context.stack = (uintptr_t)(thread)->stack; \
|
||||
(thread)->context.start = function; })
|
||||
|
||||
static void init_main_thread(void *addr)
|
||||
{
|
||||
struct regs *context = (struct regs*)addr;
|
||||
/* we must convert the current main thread to a fiber to be able to
|
||||
* schedule other fibers */
|
||||
context->uc = ConvertThreadToFiber(NULL);
|
||||
context->stack_size = 0;
|
||||
}
|
||||
|
||||
static inline void store_context(void* addr)
|
||||
{
|
||||
(void)addr;
|
||||
/* nothing to do here, Fibers continue after the SwitchToFiber call */
|
||||
}
|
||||
|
||||
static void start_thread(void)
|
||||
{
|
||||
void (*func)(void) = GetFiberData();
|
||||
func();
|
||||
/* go out if thread function returns */
|
||||
thread_exit();
|
||||
}
|
||||
|
||||
/*
|
||||
* Load context and run it
|
||||
*
|
||||
* Resume execution from the last load_context call for the thread
|
||||
*/
|
||||
|
||||
static inline void load_context(const void* addr)
|
||||
{
|
||||
struct regs *context = (struct regs*)addr;
|
||||
if (UNLIKELY(context->start))
|
||||
{ /* need setup before switching to it */
|
||||
context->uc = CreateFiber(context->stack_size,
|
||||
(LPFIBER_START_ROUTINE)start_thread, context->start);
|
||||
/* can't assign stack pointer, only stack size */
|
||||
context->stack_size = 0;
|
||||
context->start = NULL;
|
||||
}
|
||||
SwitchToFiber(context->uc);
|
||||
}
|
||||
|
||||
/*
|
||||
* play nice with the host and sleep while waiting for the tick */
|
||||
static inline void core_sleep(void)
|
||||
{
|
||||
enable_irq();
|
||||
wait_for_interrupt();
|
||||
}
|
||||
|
||||
|
|
@ -174,13 +174,10 @@ void switch_thread(void)
|
|||
__attribute__((noinline));
|
||||
|
||||
/****************************************************************************
|
||||
* Processor/OS-specific section - include necessary core support
|
||||
* Processor-specific section - include necessary core support
|
||||
*/
|
||||
|
||||
#if defined(HAVE_WIN32_FIBER_THREADS)
|
||||
#include "thread-win32.c"
|
||||
#elif defined(HAVE_SIGALTSTACK_THREADS)
|
||||
#include "thread-unix.c"
|
||||
#if defined(ANDROID)
|
||||
#include "thread-android-arm.c"
|
||||
#elif defined(CPU_ARM)
|
||||
#include "thread-arm.c"
|
||||
#if defined (CPU_PP)
|
||||
|
|
@ -967,7 +964,7 @@ void check_tmo_threads(void)
|
|||
* life again. */
|
||||
if (state == STATE_BLOCKED_W_TMO)
|
||||
{
|
||||
#ifdef HAVE_CORELOCK_OBJECT
|
||||
#if NUM_CORES > 1
|
||||
/* Lock the waiting thread's kernel object */
|
||||
struct corelock *ocl = curr->obj_cl;
|
||||
|
||||
|
|
@ -1782,7 +1779,7 @@ void thread_exit(void)
|
|||
*/
|
||||
void remove_thread(unsigned int thread_id)
|
||||
{
|
||||
#ifdef HAVE_CORELOCK_OBJECT
|
||||
#if NUM_CORES > 1
|
||||
/* core is not constant here because of core switching */
|
||||
unsigned int core = CURRENT_CORE;
|
||||
unsigned int old_core = NUM_CORES;
|
||||
|
|
@ -2311,9 +2308,6 @@ void init_threads(void)
|
|||
thread_exit();
|
||||
#endif /* NUM_CORES */
|
||||
}
|
||||
#ifdef INIT_MAIN_THREAD
|
||||
init_main_thread(&thread->context);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Shared stack scan helper for thread_stack_usage and idle_stack_usage */
|
||||
|
|
@ -2385,7 +2379,7 @@ void thread_get_name(char *buffer, int size,
|
|||
const char *fmt = "%s";
|
||||
if (name == NULL IF_COP(|| name == THREAD_DESTRUCT) || *name == '\0')
|
||||
{
|
||||
name = (const char *)(uintptr_t)thread->id;
|
||||
name = (const char *)(unsigned int)thread->id;
|
||||
fmt = "%04lX";
|
||||
}
|
||||
snprintf(buffer, size, fmt, name);
|
||||
|
|
|
|||
|
|
@ -9,8 +9,10 @@ database has been initialized.
|
|||
When automatic resume is enabled, manually selected tracks resume
|
||||
playback at their last playback position. It does not matter in which
|
||||
way you start the track; tracks are resumed whether they are navigated
|
||||
to through the database browser or file browser, from a playlist or
|
||||
bookmark, or by skipping through tracks in a playlist.
|
||||
to through the database browser or file browser, by starting a
|
||||
playlist, or by skipping through tracks in the current playlist. (As
|
||||
an exception, when a track is resumed by loading a bookmark, the
|
||||
playback position saved in the bookmark takes precedence.)
|
||||
|
||||
Optionally, you can also enable automatic resume for automatic track
|
||||
transitions. In this case, the next track will be resumed as well
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
\newcommand{\ActionStdNextRepeat}{Long \ButtonUp}
|
||||
\newcommand{\ActionStdCancel}{\ButtonLeft}
|
||||
\newcommand{\ActionStdContext}{Long \ButtonSelect}
|
||||
\newcommand{\ActionStdQuickScreen}{Long \ButtonDown}
|
||||
\newcommand{\ActionStdQuickScreen}{\ButtonRec{} + \ButtonSelect}
|
||||
\newcommand{\ActionQuickScreenExit}{\ButtonPower}
|
||||
\newcommand{\ActionStdMenu}{\ButtonPower}
|
||||
\newcommand{\ActionStdOk}{\ButtonSelect{} or \ButtonRight}
|
||||
|
|
@ -121,4 +121,4 @@
|
|||
\newcommand{\PluginCancel}{\ButtonPower}
|
||||
\newcommand{\PluginExit}{Long \ButtonPower}
|
||||
\newcommand{\PluginSelect}{\ButtonSelect}
|
||||
\newcommand{\PluginSelectRepeat}{Long \ButtonSelect}
|
||||
\newcommand{\PluginSelectRepeat}{Long \ButtonSelect}
|
||||
|
|
|
|||
|
|
@ -20,8 +20,10 @@
|
|||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
\documentclass[a4paper,11pt]{scrreprt}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[utf8]{inputenx}
|
||||
\usepackage[T1]{fontenc}
|
||||
% load ix-utf8enc.dfu to get additional characters from the inputenx package.
|
||||
\makeatletter\input{ix-utf8enc.dfu}\makeatother
|
||||
% This manual used to use Palatino as font. This caused issues with small caps
|
||||
% (textsc), so do not use that font as default one anymore.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
$publicrelease="3.7.1";
|
||||
$manualrelease="3.7.1";
|
||||
$voicerelease="3.7";
|
||||
$releasedate="November 26, 2010";
|
||||
$releasenotes="/wiki/ReleaseNotes371";
|
||||
$publicrelease="3.8.1";
|
||||
$manualrelease="3.8.1";
|
||||
$voicerelease="3.8.1";
|
||||
$releasedate="05 April, 2011";
|
||||
$releasenotes="/wiki/ReleaseNotes381";
|
||||
|
||||
%builds = (
|
||||
'archosav300' => {
|
||||
|
|
|
|||
82
tools/configure
vendored
82
tools/configure
vendored
|
|
@ -25,7 +25,6 @@ bindir=
|
|||
libdir=
|
||||
sharedir=
|
||||
|
||||
thread_support="ASSEMBLER_THREADS"
|
||||
app_modelname=
|
||||
app_lcd_width=
|
||||
app_lcd_height=
|
||||
|
|
@ -164,41 +163,6 @@ findsdl(){
|
|||
done
|
||||
}
|
||||
|
||||
# check for availability of sigaltstack to support our thread engine
|
||||
check_sigaltstack() {
|
||||
cat >$tmpdir/check_threads.c <<EOF
|
||||
#include <signal.h>
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
#ifndef NULL
|
||||
#define NULL (void*)0
|
||||
#endif
|
||||
sigaltstack(NULL, NULL);
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
$CC -o $tmpdir/check_threads $tmpdir/check_threads.c 1> /dev/null
|
||||
result=$?
|
||||
rm -rf $tmpdir/check_threads*
|
||||
echo $result
|
||||
}
|
||||
|
||||
# check for availability of Fiber on Win32 to support our thread engine
|
||||
check_fiber() {
|
||||
cat >$tmpdir/check_threads.c <<EOF
|
||||
#include <windows.h>
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
ConvertThreadToFiber(NULL);
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
$CC -o $tmpdir/check_threads $tmpdir/check_threads.c 2>/dev/null
|
||||
result=$?
|
||||
rm -rf $tmpdir/check_threads*
|
||||
echo $result
|
||||
}
|
||||
|
||||
simcc () {
|
||||
|
||||
# default tool setup for native building
|
||||
|
|
@ -211,8 +175,6 @@ simcc () {
|
|||
GCCOPTS="$GCCOPTS -fno-builtin -g"
|
||||
GCCOPTIMIZE=''
|
||||
LDOPTS='-lm' # button-sdl.c uses sqrt()
|
||||
sigaltstack=""
|
||||
fibers=""
|
||||
|
||||
# default output binary name, don't override app_get_platform()
|
||||
if [ "$app_type" != "sdl-app" ]; then
|
||||
|
|
@ -231,7 +193,6 @@ simcc () {
|
|||
CYGWIN*)
|
||||
echo "Cygwin host detected"
|
||||
|
||||
fibers=`check_fiber`
|
||||
LDOPTS="$LDOPTS -mconsole"
|
||||
output="$output.exe"
|
||||
winbuild="yes"
|
||||
|
|
@ -240,33 +201,29 @@ simcc () {
|
|||
MINGW*)
|
||||
echo "MinGW host detected"
|
||||
|
||||
fibers=`check_fiber`
|
||||
LDOPTS="$LDOPTS -mconsole"
|
||||
output="$output.exe"
|
||||
winbuild="yes"
|
||||
;;
|
||||
|
||||
Linux)
|
||||
sigaltstack=`check_sigaltstack`
|
||||
echo "Linux host detected"
|
||||
LDOPTS="$LDOPTS -ldl"
|
||||
;;
|
||||
|
||||
FreeBSD)
|
||||
sigaltstack=`check_sigaltstack`
|
||||
echo "FreeBSD host detected"
|
||||
LDOPTS="$LDOPTS -ldl"
|
||||
;;
|
||||
|
||||
Darwin)
|
||||
sigaltstack=`check_sigaltstack`
|
||||
echo "Darwin host detected"
|
||||
LDOPTS="$LDOPTS -ldl"
|
||||
|
||||
SHARED_FLAG="-dynamiclib -Wl\,-single_module"
|
||||
;;
|
||||
|
||||
SunOS)
|
||||
sigaltstack=`check_sigaltstack`
|
||||
echo "*Solaris host detected"
|
||||
|
||||
GCCOPTS="$GCCOPTS -fPIC"
|
||||
|
|
@ -362,34 +319,11 @@ EOF
|
|||
# add cross-compiler option(s)
|
||||
prefixtools i586-mingw32msvc-
|
||||
LDOPTS="$LDOPTS -mconsole"
|
||||
fibers=`check_fiber`
|
||||
output="rockboxui.exe"
|
||||
endian="little" # windows is little endian
|
||||
echo "Enabling MMX support"
|
||||
GCCOPTS="$GCCOPTS -mmmx"
|
||||
fi
|
||||
|
||||
thread_support=
|
||||
if [ -z "$ARG_THREAD_SUPPORT" ] || [ "$ARG_THREAD_SUPPORT" = "0" ]; then
|
||||
if [ "$sigaltstack" = "0" ]; then
|
||||
thread_support="HAVE_SIGALTSTACK_THREADS"
|
||||
LDOPTS="$LDOPTS -lpthread" # pthread needed
|
||||
echo "Selected sigaltstack threads"
|
||||
elif [ "$fibers" = "0" ]; then
|
||||
thread_support="HAVE_WIN32_FIBER_THREADS"
|
||||
echo "Selected Win32 Fiber threads"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n `echo $app_type | grep "sdl"` ] && [ -z "$thread_support" ] \
|
||||
&& [ "$ARG_THREAD_SUPPORT" != "0" ]; then
|
||||
thread_support="HAVE_SDL_THREADS"
|
||||
if [ "$ARG_THREAD_SUPPORT" = "1" ]; then
|
||||
echo "Selected SDL threads"
|
||||
else
|
||||
echo "WARNING: Falling back to SDL threads"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
|
|
@ -522,7 +456,6 @@ maemocc () {
|
|||
GLOBAL_LDOPTS="$GLOBAL_LDOPTS -Wl,-z,defs"
|
||||
SHARED_FLAG="-shared"
|
||||
endian="little"
|
||||
thread_support="HAVE_SIGALTSTACK_THREADS"
|
||||
|
||||
is_n900=0
|
||||
# Determine maemo version
|
||||
|
|
@ -1061,11 +994,6 @@ help() {
|
|||
--thumb Build with -mthumb (for ARM builds)
|
||||
--no-thumb The opposite of --thumb (don't use thumb even for targets
|
||||
where this is the default
|
||||
--sdl-threads Force use of SDL threads. They have inferior performance,
|
||||
but are better debuggable with GDB
|
||||
--no-sdl-threads Disallow use of SDL threads. This prevents the default
|
||||
behavior of falling back to them if no native thread
|
||||
support was found.
|
||||
--prefix Target installation directory
|
||||
--help Shows this message (must not be used with other options)
|
||||
|
||||
|
|
@ -1087,7 +1015,6 @@ ARG_VOICE=
|
|||
ARG_ARM_EABI=
|
||||
ARG_ARM_THUMB=
|
||||
ARG_PREFIX="$PREFIX"
|
||||
ARG_THREAD_SUPPORT=
|
||||
err=
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
|
|
@ -1108,9 +1035,6 @@ for arg in "$@"; do
|
|||
--no-eabi) ARG_ARM_EABI=0;;
|
||||
--thumb) ARG_ARM_THUMB=1;;
|
||||
--no-thumb) ARG_ARM_THUMB=0;;
|
||||
--sdl-threads)ARG_THREAD_SUPPORT=1;;
|
||||
--no-sdl-threads)
|
||||
ARG_THREAD_SUPPORT=0;;
|
||||
--prefix=*) ARG_PREFIX=`echo "$arg" | cut -d = -f 2`;;
|
||||
--help) help;;
|
||||
*) err=1; echo "[ERROR] Option '$arg' unsupported";;
|
||||
|
|
@ -3402,7 +3326,6 @@ sed > autoconf.h \
|
|||
-e "s<^#undef DO_BOOTCHART<$use_bootchart<g" \
|
||||
-e "s<@config_rtc@<$config_rtc<g" \
|
||||
-e "s<@have_rtc_alarm@<$have_rtc_alarm<g" \
|
||||
-e "s<@thread_support@<$thread_support<g" \
|
||||
-e "s<@RBDIR@<${rbdir}<g" \
|
||||
-e "s<@sharepath@<${sharedir}<g" \
|
||||
-e "s<@binpath@<${bindir}<g" \
|
||||
|
|
@ -3439,9 +3362,6 @@ sed > autoconf.h \
|
|||
@config_rtc@
|
||||
@have_rtc_alarm@
|
||||
|
||||
/* the threading backend we use */
|
||||
#define @thread_support@
|
||||
|
||||
/* lcd dimensions for application builds from configure */
|
||||
@lcd_width@
|
||||
@lcd_height@
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/perl
|
||||
$version="3.5RC";
|
||||
$version="3.8.1";
|
||||
|
||||
require "tools/builds.pm";
|
||||
|
||||
|
|
@ -49,11 +49,19 @@ sub runone {
|
|||
chdir "..";
|
||||
|
||||
my $o="build-$dir/rockbox.zip";
|
||||
my $map="build-$dir/rockbox-maps.zip";
|
||||
my $elf="build-$dir/rockbox-elfs.zip";
|
||||
if (-f $o) {
|
||||
my $newo="output/rockbox-$dir-$version.zip";
|
||||
my $newmap="output/rockbox-$dir-$version-maps.zip";
|
||||
my $newelf="output/rockbox-$dir-$version-elfs.zip";
|
||||
system("mkdir -p output");
|
||||
system("mv $o $newo");
|
||||
print "moved $o to $newo\n" if($verbose);
|
||||
system("mv $map $newmap");
|
||||
print "moved $map to $newmap\n" if($verbose);
|
||||
system("mv $elf $newelf");
|
||||
print "moved $elf to $newelf\n" if($verbose);
|
||||
}
|
||||
|
||||
print "remove all contents in build-$dir\n" if($verbose);
|
||||
|
|
@ -106,13 +114,16 @@ sub buildit {
|
|||
`$c`;
|
||||
|
||||
print "Run 'make'\n" if($verbose);
|
||||
`make`;
|
||||
`make VERSION=$version`;
|
||||
|
||||
print "Run 'make zip'\n" if($verbose);
|
||||
`make zip`;
|
||||
|
||||
print "Run 'make mapzip'\n" if($verbose);
|
||||
`make mapzip`;
|
||||
|
||||
print "Run 'make elfzip'\n" if($verbose);
|
||||
`make elfzip`;
|
||||
}
|
||||
|
||||
sub buildfonts {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
$version="3.0";
|
||||
$version="3.8.1";
|
||||
|
||||
require "tools/builds.pm";
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
version="3.0"
|
||||
version="3.8.1"
|
||||
|
||||
srcdir=.
|
||||
tempdir=rockbox-temp
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
$version="3.0";
|
||||
$version="3.8.1";
|
||||
|
||||
require "tools/builds.pm";
|
||||
|
||||
|
|
|
|||
|
|
@ -259,6 +259,9 @@ zip:
|
|||
mapzip:
|
||||
$(SILENT)find . -name "*.map" | xargs zip rockbox-maps.zip
|
||||
|
||||
elfzip:
|
||||
$(SILENT)find . -name "*.elf" | xargs zip rockbox-elfs.zip
|
||||
|
||||
fullzip:
|
||||
$(SILENT)$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m \"$(MODELNAME)\" -i \"$(TARGET_ID)\" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 2 -o rockbox-full.zip $(TARGET) $(BINARY)
|
||||
|
||||
|
|
@ -334,6 +337,7 @@ help:
|
|||
@echo "7zip - creates a rockbox.7z of your build (no fonts)"
|
||||
@echo "fontzip - creates rockbox-fonts.zip"
|
||||
@echo "mapzip - creates rockbox-maps.zip with all .map files"
|
||||
@echo "elfzip - creates rockbox-elfs.zip with all .elf files"
|
||||
@echo "tools - builds the tools only"
|
||||
@echo "voice - creates the voice clips (voice builds only)"
|
||||
@echo "voicetools - builds the voice tools only"
|
||||
|
|
|
|||
|
|
@ -46,12 +46,9 @@
|
|||
#endif
|
||||
|
||||
#include <fcntl.h>
|
||||
#ifdef HAVE_SDL_THREADS
|
||||
#include <SDL.h>
|
||||
#include <SDL_thread.h>
|
||||
#include "thread-sdl.h"
|
||||
#else
|
||||
#define sim_thread_unlock() NULL
|
||||
#define sim_thread_lock(a)
|
||||
#endif
|
||||
#include "thread.h"
|
||||
#include "kernel.h"
|
||||
#include "debug.h"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue