Compare commits

...
Sign in to create a new pull request.

39 commits
master ... v3.8

Author SHA1 Message Date
Andree Buschmann
6ccd99a86a Port r29764 to v3.8 branch. Fixes iPod nano 2G LCD issues.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29765 a1c6a512-1295-4272-9138-f99709370657
2011-04-22 19:17:25 +00:00
Andree Buschmann
c351e62620 Merge r29708 to v3.8 branch. Fixes gapless playback (FS#12062).
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29709 a1c6a512-1295-4272-9138-f99709370657
2011-04-13 05:54:52 +00:00
Alex Parker
23ec0a537f Bump version numbers in scripts in preparation for 3.8.1.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29680 a1c6a512-1295-4272-9138-f99709370657
2011-04-04 18:08:48 +00:00
Michael Chicoine
95475eca87 Manual correction for entering quick screen from file browser
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29678 a1c6a512-1295-4272-9138-f99709370657
2011-04-04 01:59:57 +00:00
Bertrik Sikken
d1fdb485b1 Backport several AMSv2 sd fixes/cleanups for the 3.8.1 branch:
r29624,r29628,r29629,r29630,r29647,r29648,r29651,r29652,r29656,r29657,r29660,r29667


git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29676 a1c6a512-1295-4272-9138-f99709370657
2011-04-03 22:33:10 +00:00
Alex Parker
fde22376d4 Backport r29644 to the 3.8 branch - Fix error in Ohm's law formula as provided in FS#12023. Thanks to Leif Andersen.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29650 a1c6a512-1295-4272-9138-f99709370657
2011-03-26 21:14:12 +00:00
Alex Parker
017f61388b Backport r29577 to the 3.8 branch - Fix FS#11894 - Sansa Clip+ Volume Buttons don't switch when Upside Down is activated
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29649 a1c6a512-1295-4272-9138-f99709370657
2011-03-26 21:14:07 +00:00
Andree Buschmann
368e872c52 Backport r29642 to v3.8 branch. Fixes FS#12024.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29643 a1c6a512-1295-4272-9138-f99709370657
2011-03-24 19:02:56 +00:00
Michael Hohmuth
0b2894e2ec SD AMSv2: Restore access to the last 0xF000 sectors of internal drive
Fixes FS#11965 and FS#12001.  Backports r29625, r29637, r29638.
Repairs r29169.  Thanks to saratoga and funman!

git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29641 a1c6a512-1295-4272-9138-f99709370657
2011-03-24 16:59:18 +00:00
Andree Buschmann
90df1b4a76 Backport r29622 to v3.8 branch. Fixes FS#12019, a bug in the AAC SBR decoding.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29623 a1c6a512-1295-4272-9138-f99709370657
2011-03-20 16:02:34 +00:00
Thomas Martitz
eabebcbc90 Fix FS#12012 - Radio Art broken since r29259 - Embedded album art support
Forgot to adapt radio art to the new bufopen user_data argument.

git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29599 a1c6a512-1295-4272-9138-f99709370657
2011-03-16 10:25:20 +00:00
Michael Hohmuth
38bd69905a Backport r29548: autoresume: Manual: Clarify precedence rules for resume positions
Resume positions stored in bookmarks take precedence over autoresume.

Technically, the resume position for the "Resume Playback" function
(which is also saved across power-off/power-on) also takes precedence
over autoresume.  However, there is no way for a user to tell as it is
identical to the autoresume position for the last-played track, so
don't highlight it in the manual.

git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29549 a1c6a512-1295-4272-9138-f99709370657
2011-03-08 23:07:43 +00:00
Andree Buschmann
57e272cf5d Integrate r29513 to v3.8 branch. Fixes FS#11973.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29514 a1c6a512-1295-4272-9138-f99709370657
2011-03-03 20:58:50 +00:00
Andree Buschmann
488df30245 Backport r29476 to v3.8 branch. Disabled ATA_DMA for PP targets.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29503 a1c6a512-1295-4272-9138-f99709370657
2011-03-02 20:13:20 +00:00
Thomas Martitz
bd4f3c9c60 Backport r29463: Fix returning to wps from a plugin.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29464 a1c6a512-1295-4272-9138-f99709370657
2011-02-28 14:41:30 +00:00
Alex Parker
a1d157ba1e Backport r29435 to 3.8 branch.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29439 a1c6a512-1295-4272-9138-f99709370657
2011-02-27 21:01:31 +00:00
Alex Parker
2076ed09eb Fix corrupted metadata on manual track change on hwcodec. Thanks to kugel for the patch.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29431 a1c6a512-1295-4272-9138-f99709370657
2011-02-27 19:12:09 +00:00
Dominik Riebeling
01db859191 Manual: switch to inputenx and load additional characters.
Since we're now loading a file from inputenx directly change to inputenx in
general to avoid issues between those two packages. Fixes manual builds that
broke because of U+0101 and U+0146 glyphs which aren't defined in the utf8
inputenc package.


git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29429 a1c6a512-1295-4272-9138-f99709370657
2011-02-27 16:48:02 +00:00
Frank Gevaerts
de4696ff21 Simplified Chinese update by Li Jie
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29424 a1c6a512-1295-4272-9138-f99709370657
2011-02-27 14:17:00 +00:00
Alex Parker
f57a698eff Tweak dansk.lang, from rasher
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29423 a1c6a512-1295-4272-9138-f99709370657
2011-02-27 12:54:07 +00:00
Alex Parker
a9357262e2 FS#11970 by Mārtiņš Šimis - update Latvian
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29419 a1c6a512-1295-4272-9138-f99709370657
2011-02-27 12:08:40 +00:00
Alex Parker
5c8f69d8a0 FS#11969 by Lev Panov - Russian translation
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29416 a1c6a512-1295-4272-9138-f99709370657
2011-02-26 23:16:21 +00:00
Alex Parker
604ea9fc9a FS#11968 by Peter Lecky - Slovak language update
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29413 a1c6a512-1295-4272-9138-f99709370657
2011-02-26 22:14:48 +00:00
Alex Parker
4e3d8c5f59 Forgot to add the help text for make elfzip.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29407 a1c6a512-1295-4272-9138-f99709370657
2011-02-26 20:50:30 +00:00
Alex Parker
620c8434db Bump versions to 3.8
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29403 a1c6a512-1295-4272-9138-f99709370657
2011-02-26 18:27:59 +00:00
Bertrik Sikken
d5d331b24d Latvian language translation - FS#11967 by Mārtiņš Šimis
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29400 a1c6a512-1295-4272-9138-f99709370657
2011-02-25 20:32:20 +00:00
Michael Chicoine
e9b8b5ba17 Return valid tuner ID even when tuner is not detected properly. Fixes FS#11791
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29379 a1c6a512-1295-4272-9138-f99709370657
2011-02-22 14:03:04 +00:00
Mustapha Senhaji
2122eb8fb3 Add Ismael Castiñeira Álvarez to the credits and on the galego translation files
for his patch FS#11938 committed as r28823


git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29374 a1c6a512-1295-4272-9138-f99709370657
2011-02-22 01:46:54 +00:00
Alex Parker
a4960ea764 Fix yellow
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29370 a1c6a512-1295-4272-9138-f99709370657
2011-02-21 18:48:57 +00:00
Alex Parker
86878f0c2b FS#11938 by Ismael Castiñeira Álvarez - update for Galician language.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29369 a1c6a512-1295-4272-9138-f99709370657
2011-02-21 18:35:40 +00:00
Alex Parker
2f99e609f9 Revert r29327 - "Implement cooperative threads on hosted platforms using C code" on the release branch. Thanks to kugel for the patch.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29364 a1c6a512-1295-4272-9138-f99709370657
2011-02-20 20:26:42 +00:00
Alex Parker
cad99bae1d Also build and keep elfs zip file for the release.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29363 a1c6a512-1295-4272-9138-f99709370657
2011-02-20 20:07:51 +00:00
Alex Parker
4952e59f38 Add "elfzip" target to make which creates a zip of all elf files, as mapzip does for map files.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29361 a1c6a512-1295-4272-9138-f99709370657
2011-02-20 19:57:04 +00:00
Alex Parker
2f857c6b6c * Keep the map files instead of building then throwing them away in the release script.
* Pass the release version to make in the release script instead of having to remember to hack up version.sh in the release branch.

git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29359 a1c6a512-1295-4272-9138-f99709370657
2011-02-20 19:27:26 +00:00
Jonas Häggqvist
43d4dc1aca Add 2 deprecated strings to appease genlang and correct stats
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29356 a1c6a512-1295-4272-9138-f99709370657
2011-02-20 18:16:15 +00:00
Jonas Häggqvist
f9fa70fdaf Update Danish translation.
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29354 a1c6a512-1295-4272-9138-f99709370657
2011-02-20 17:59:37 +00:00
Bertrik Sikken
c358711cd6 FS#11953 - Dutch (nederlands) translation update
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29351 a1c6a512-1295-4272-9138-f99709370657
2011-02-20 16:35:42 +00:00
Alex Parker
24419baf1f Bump scripts to 3.8RC
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29346 a1c6a512-1295-4272-9138-f99709370657
2011-02-20 14:48:15 +00:00
Alex Parker
ef3ec72bfb Branch for 3.8
git-svn-id: svn://svn.rockbox.org/rockbox/branches/v3_8@29345 a1c6a512-1295-4272-9138-f99709370657
2011-02-20 14:14:27 +00:00
69 changed files with 20627 additions and 1280 deletions

View file

@ -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 */

View file

@ -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

View file

@ -16,6 +16,7 @@ hebrew.lang
hrvatski.lang
islenska.lang
italiano.lang
latviesu.lang
lietuviu.lang
magyar.lang
nederlands.lang

View file

@ -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>

View file

@ -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>

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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);

View file

@ -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"

View file

@ -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[];

View file

@ -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 &&

View file

@ -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",

View file

@ -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();

View file

@ -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;
}

View file

@ -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;

View file

@ -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,

View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 */

View file

@ -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

View file

@ -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;
/****************************************************************************

View file

@ -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
{

View file

@ -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)

View file

@ -33,6 +33,6 @@ int tuner_detect_type(void)
if (rda5802_detect()) {
return RDA5802;
}
return 0;
return RDA5802;
}

View file

@ -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

View file

@ -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"

View file

@ -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

View file

@ -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[])
{

View file

@ -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;

View file

@ -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__ */

View file

@ -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();
}

View file

@ -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();
}

View file

@ -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();
}

View file

@ -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);

View file

@ -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

View file

@ -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}

View file

@ -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.

View file

@ -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
View file

@ -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@

View file

@ -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 {

View file

@ -1,6 +1,6 @@
#!/usr/bin/perl
$version="3.0";
$version="3.8.1";
require "tools/builds.pm";

View file

@ -1,6 +1,6 @@
#!/bin/sh
version="3.0"
version="3.8.1"
srcdir=.
tempdir=rockbox-temp

View file

@ -1,6 +1,6 @@
#!/usr/bin/perl
$version="3.0";
$version="3.8.1";
require "tools/builds.pm";

View file

@ -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"

View file

@ -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"