The bug is due to a stupid make misfeature. The article [1] contains much more information but in a nutshell, the following code:

a b: c bla

is equivalent to:

a: c bla b: c bla

This is bad because in parallel runs (make -j typically), "bla" can be run TWICE and even worse, twice in PARALLEL. Obviously the result will be completely unexpected. This is a real bummer because on the other hand, the following code:

%.c %.h: %:in bla

actually expresses the fact that bla produces two files. For some reasons, pattern rules work differently from implicit rules.

This commit attempts to fix the problem with lang.h by rewriting (simplified):

lang.c lang.h: lang.in genlang

as

lang.h: lang.in genlang lang.c: lang.h

This works (it correctly expresses the dependency chain and ensures genlang runs once) but as one drawback: if one manually removes lang.c, then genlang will not re-run since the second rule does nothing. This is minor drawback since no one ever removes lang.c manually and "clean" removes lang.h which triggers a rebuild.

There is not need for a bootloader file to create an uninstall firmware so one needs to provide a model. Also cleanup the install script a bit by factoring message into a function, also print them to the log so that the user can report what was printed on the screen easily. The uninstall script is quite trivial, it remounts the rootfs and restores the backed up OF to its right place.

The fix is to actually remove unused variables. Those were unused from day 1, which I find slightly suspicious so either there is some problem or the code was copy-pasted and modified, making some variables useless.

NOTES:
- bootloader makefile convert an extra font to be installed alongside the bootloader since sysfont is way too small
- the toolsicon bitmap comes from the Oxygen iconset
- touchscreen driver is untested

TODO:
- implement audio routing driver (pcm is handled by pcm-alsa)
- fix playback: it crashes on illegal instruction in DEBUG builds
- find out why the browser starts at / instead of /contents
- implement radio support
- implement return to OF for usb handling
- calibrate battery curve (NB: of can report a battery level on a 0-5 scale but probabl don't want to use that ?)
- implement simulator build (we need a nice image of the player)
- figure out if we can detect jack removal

I did some cleanup of redudant stuff, simplify some logic, also switch to bash because sh in the pain when ones want to locally define variables for functions calls. I also added support to download more stuff like alsa-lib and more recent gccs that use a different naming convention, as well as linux kernels.

I also add some build to build linux toolchains without ct-ng. The biggest problem with ct-ng is that they regularly drop support for old stuff and as a result it rots really quickly for old toolchains. I add a new toolchain for generic linux arm with the minimum requirements, it works fine on Sony NWZ and also on YP-R0.

Finally, rockboxdev.sh now understand options on its command line (see --help). Notably --target to give the list of targets (useful for noninteractive scripts),
--restart to restart at a step, --makeflags and others (instead of the environment variables)

The ZEN/X-Fi (STMP3700) don't handle memory frequency scaling really well, for this reason we run it at a fixed frequency. That frequency was previously set to 64Mhz because when the CPU run at its lowest frequency, we set the VDD voltage to 0.975 V and on STMP3700, VDDD=VDDDMEM and this is too low to run EMI at 130Mhz. This is not a good solution because under heavy load, running the EMI at 64Mhz results in frame drops and a sluggish device. Thus we now run the EMI at 130Mhz all the time now. To do so, increase the minimum VDD voltage to 1.275 V. This may result is a decreased battery life on those targets but it will also avoid all sorts of glictches and all the device to truly run at full speed.

This brings puzzles up-to-date with Simon's tree, along with the rockbox-specific changes I made. Note that I also got rid of some of the ugly floating-point code in rbwrappers.c and replaced it with wrappers for our fixed-point library.

This patch disables the (deliberate) feature of "Select Level", that selecting the current level wouldn't restart but rather resume. (i.e. now selecting any level will always start this from scratch).

There definitely should be a way to restart the current level via menu. Currently the only possibility to do this is via button presses, but (a) these are hard to remember combos, and
(b) they are not defined on all targets. This patch is meant as a lightwight alternative to g#1356(adding a "restart level" option to the menu).

This is pretty ad-hoc, but the only other ways are to rewrite sprintf (which would use too much memory on the c200v2), or implement support for floats in rockbox's formatter, neither of which are acceptable.

Several people asked me recently how to decrypt atj2127 firmware. Someone posted on github (https://github.com/nfd/atj2127decrypt) a decrypt utility clearly reverse engineered from some unknown source. The code is an absolute horror but I concluded that ATJ changed very little between ATJ213x and ATJ2127 so I added support for the ATJ2127, credit to this github code that I stole and rewrite (code was under MIT licence). At the same time do some small code cleanups. Note that there is not 100% sure way that I know to distinguish between the two firmware types, so the code tries to do an educated guess to detect ATJ2127. If this does not work, use --atj21217 option. Also note that contrary to the github tool that decrypts and unpack in one go, this tool only does one step at once. So first decrypt: HEX -> AFI, then unpack AFI -> files. I also added for a different version of AFI. Based on AFI files I have, there are, I think, two versions: the "old" ones (pre-ATJ213x) and "new" ones. The tool only supported the new one but for some reason the ATJ2127 uses the old ones without a mostly empty header. Strangely, even this mostly empty header does not seem to follow the old layout as reverse engineered by the s1mp3 project (https://sourceforge.net/p/s1mp3/code/HEAD/tree/trunk/s1fwx/heads.h), so in fact there might be three versions. In any case, only the header is different, the rest of the file is identical so at the moment I just don't print any header info for "old" files.

Up to now, we'd just ignore whatever font size the puzzle asked for, and instead just go with either the UI font or system font regardless of their size, which led to some horrible-looking puzzles. This patch adds the ability to automatically load fonts of the proper size when they are available, which makes text-based puzzles such as Pattern and Slant function correctly with any UI font.

The font pack, which should be extracted to the system-wide fonts directory consists of 3 small bitmap fonts from 7px to 10px and then anti-aliased Deja Vu fonts from 10px to 36px. It is available in the source tree (apps/plugins/puzzles/fonts.zip), or from
<http://download.rockbox.org/useful/sgt-fonts.zip>.

The devinfo request returned the raw data, now the tool prints the various fields. Also add support for the dhp (destination/headphones/color ...): this one is untested because it's only supported starting from A10 or A20. There is still a problem with the dpcc prop: although it should work for DEVINFO, it does not, despite the fact that the get_dev_info command works and is internally (on the Sony) translated into a dpcc request. I keep the code just in case.

It used to be that each puzzle had a complete copy of the entire puzzles manual and the "quick help" text for every single puzzle. This was obviously a waste, so now each puzzle only has the sections of the manual that apply to it, saving about 100KB or so per puzzle. This also has the added benefit of shrinking binary size enough to allow full help support on the c200v2, which has been enabled.

After compiling the ypz5 target, I have discovered that the keypad system was refusing to compile, due to a much newer button API. This patch adapts the target to the current imx233 implementation. Additonally, some ADC button values have been re-adjusted.