Android is one of the many distributions that currently work on the Openmoko phones. You can compare a distribution with an Operating System on normal computers. It gives the phone all the software needed for operating. For more information about the different flavors, see distributions.
This page is dedicated to porting the Android OS to the Neo 1973 and Neo FreeRunner handsets. Since the Android OS was publically released on 20081021, work is currently underway to port Android to the Neo 1973 and FreeRunner handsets.
As Ben Leslie had pointed out on his blog far before the source code was released, Android was originally designed to work with the ARMv5TE instruction set architecture (ISA), which allows for DSP enhanced instructions. Contrary to the ARMv5TE ISA, the Neo1973 and FreeRunner handsets both feature an arm920t core, which comply to the ARMv4T ISA.
Before the source code was released, kernel trap handlers were implemented to 'emulate' the ARMv5TE ISA. Although the results worked in many cases, trapping is costly and performance suffered as a result. Moreover, without explicitly knowing which conditions were set by various instructions, such as Thumb Mode execution, the result became nondeterministic.
With the release of the Android source code, the Open Source community is no longer limited to dealing with a binary-only product. The Open Handset Alliance (OHA) has let their source code become their product for everyone enrich and benefit from.
Currently, porting efforts are underway in many circles. Patches should be submitted via the official Android channels.
To track the status of which parts of the Android source tree contain ARMv5 specific code, I've created a table of where it is contained, and the status of patches. It can be found at: http://spreadsheets.google.com/pub?key=pzDEXnU19gkeTjpD28t-7fw User:Bricode
Sean McNeil said that he was able to get Androind running (including telephony) in his Freerunner source.
Ben Leslie mentioned on the android-porting list that he was able to get the 'Android' logo to appear on his Neo 1973.
You can start by following the instructions to download and build the Android source from scratch. Please see http://source.android.com/download and follow the instructions for your architecture.
It's generally a good idea to make your efforts known via wiki systems, public mailing lists, forums, and publically open version control systems.
Always take credit for your work but please don't do it in the form of comments. Some code is already hard enough to read without comments polluting the text. The best thing to do is to create a patch and put a header with your information at the top. Collaboration systems such as git might already do this for you (??).
If you create something new and have the ability to designate the license for it, please consider license compatibility issues.
For each ARMv5TE instruction, one could potentially
This is a list of opcodes, extracted from the Android source, that are unsupported for ARMv4T compliant processors (specifically the arm920t). The opcodes represent instructions available for ARMv5, ARMv5T, and ARMv5TE architectures, which are not present in the ARMv4T ISA. The list was obtained by exhaustively editing the recompiling the Android source code until it compiled without error.
Please keep in mind, that in some cases, translating these instructions into a sequence of ARMv4T instructions will be impossible and / or result in nondeterministic execution because of
|
Using the above list of opcodes, one can scan the Android source code for ARMv4T-incompatible instruction sequences.
Code:
#!/bin/sh # $1 is the android directory if [ $# -ne 1 ]; then exit -1 fi cd "${1}" opcodes="blx clz ldrd pld smlabb smlabt smlatt smlal smlawb smlawt smulbb smulbt smultt smulwb smulwt qadd qdadd qdsub qsub strd" for op in ${opcodes}; do echo "* ${op} =====================================" if [ ! -e .files.${op} ]; then files="$(grep -R -i "${op} " * 2>/dev/null)" files="$(echo $files | grep -v "^Binary file" | sed -e 's/:.*//')" files="$(echo $files| grep -v "CREDIT\|README\|^\(kernel/\|.git/\)\|\(\.txt\)$" | sort -u)" echo "${files}" > .files.${op} else files="$(cat .files.${op})" fi for fil in ${files}; do lines="$(grep -n -i "${op} " ${fil} | sed -e 's/:.*//g' )" lines="$(echo $lines | sed -e 's/ /,/g')" echo "** ${fil}: lines {${lines}}" done done |
The list of files below may or may not be complete. There might also be some assembly code that is generated with a python script (verification?).
* blx ===================================== ** bionic/libc/tools/gensyscalls.py: lines {168,186} ** bootloader/legacy/nandwrite/init.S: lines {77} ** bootloader/legacy/usbloader/init.S: lines {95} ** dalvik/vm/arch/arm/CallEABI.S: lines {239} ** dalvik/vm/arch/arm/CallOldABI.S: lines {145} ** development/emulator/qtools/thumbdis.cpp: lines {187,265} ** external/qemu/target-arm/translate.c: lines {1151,1971,2444} ** external/qemu/trace.c: lines {774,1353,1358} ** system/core/libpixelflinger/codeflinger/disassem.c: lines {416} * clz ===================================== ** development/emulator/qtools/armdis.cpp: lines {654} ** external/opencore/codecs_v2/audio/aac/dec/src/pv_normalize.h: lines {67,84} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/norm_l.h: lines {137} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/normalize_amr_wb.h: lines {78,95} ** external/opencore/codecs_v2/audio/mp3/dec/src/pvmp3_normalize.h: lines {67,84} ** external/opencore/codecs_v2/video/avc_h264/dec/src/vlc.cpp: lines {23} ** external/opencore/codecs_v2/video/m4v_h263/enc/src/vlc_encode_inline.h: lines {125,162,168,204,218} ** external/qemu/target-arm/translate.c: lines {1247} ** external/skia/libcorecg/Sk64.cpp: lines {340,341,343} ** external/skia/libcorecg/SkMatrix.cpp: lines {500,501} ** external/skia/libsgl/effects/SkColorMatrixFilter.cpp: lines {135} ** external/skia/libsgl/sgl/SkBitmap.cpp: lines {945,946,947} ** external/skia/libsgl/sgl/SkBitmapShader.cpp: lines {32,33,34} ** external/skia/libsgl/sgl/SkGraphics.cpp: lines {429,437} * ldrd ===================================== ** dalvik/vm/mterp/armv5/OP_AGET_WIDE.S: lines {28} ** dalvik/vm/mterp/armv5/OP_IGET_WIDE.S: lines {37} ** dalvik/vm/mterp/armv5/OP_IGET_WIDE_QUICK.S: lines {10} ** dalvik/vm/mterp/armv5/OP_SGET_WIDE.S: lines {17} ** dalvik/vm/mterp/out/InterpAsm-armv5.S: lines {2653,7464,8318,8390} ** system/core/libpixelflinger/rotate90CW_4x4_16v6.S: lines {40,41,42,43} * pld ===================================== ** bionic/libc/arch-arm/bionic/memcmp.S: lines {37,44,45,56,57,107,108,195,196} ** bionic/libc/arch-arm/bionic/memcmp16.S: lines {37,44,45,67,68,116,117,198,199} ** bionic/libc/arch-arm/bionic/memcpy.S: lines {55,56,57,145,266,293,320} ** bionic/libc/arch-arm/bionic/strlen.c: lines {59,65} ** bionic/libc/kernel/arch-arm/asm/arch/irqs.h: lines {162} ** external/elfutils/src/Makefile: lines {243} ** external/elfutils/src/Makefile.am: lines {32} ** external/elfutils/src/Makefile.in: lines {243} ** external/jpeg/jidctfst.S: lines {69,235,247} ** external/qemu/target-arm/translate.c: lines {1149} ** system/core/libpixelflinger/codeflinger/ARMAssembler.cpp: lines {368} ** system/core/libpixelflinger/codeflinger/ARMAssemblerInterface.cpp: lines {104,108,117} ** system/core/libpixelflinger/t32cb16blend.S: lines {111,112,134,143} * smlabb ===================================== ** external/jpeg/jidctfst.S: lines {110,115,155,156} ** external/neven/Embedded/common/src/b_BasicEm/Math.c: lines {584,589} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_gcc.h: lines {147,166} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v5.h: lines {120,129} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/basic_op_arm_gcc_v5.h: lines {514,533} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/basic_op_arm_v5.h: lines {418,429} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_armv5.h: lines {202} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_gcc_armv5.h: lines {250} ** external/opencore/codecs_v2/video/m4v_h263/enc/src/dct_inline.h: lines {119,155,167,278,326,341} ** external/opencore/codecs_v2/video/m4v_h263/enc/src/fastquant_inline.h: lines {178,225,437,517} ** frameworks/base/libs/audioflinger/AudioMixer.cpp: lines {405,436} * smlabt ===================================== ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_gcc.h: lines {184} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v5.h: lines {138} ** external/opencore/codecs_v2/video/m4v_h263/enc/src/dct_inline.h: lines {131,143,294,310} * smlatt ===================================== ** external/neven/Embedded/common/src/b_BasicEm/Math.c: lines {585,590} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v5.h: lines {157} ** frameworks/base/libs/audioflinger/AudioMixer.cpp: lines {441} * smlal ===================================== ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v4.h: lines {179,223,236,257,267} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v4_gcc.h: lines {264,341} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v5.h: lines {178,188,198} ** external/opencore/codecs_v2/audio/mp3/dec/src/asm/pvmp3_dct_9.s: lines {84,90,96,101,109,114,116,118,121,132,138,150,163,165,167,174,176,178} ** external/opencore/codecs_v2/audio/mp3/dec/src/asm/pvmp3_dct_9_gcc.s: lines {73,79,86,90,98,103,105,107,110,121,127,139,152,154,156,163,165,167} ** external/opencore/codecs_v2/audio/mp3/dec/src/asm/pvmp3_mdct_18.asm: lines {143,162,178,188,192,199,207,217,225,231,237,241,244} ** external/opencore/codecs_v2/audio/mp3/dec/src/asm/pvmp3_mdct_18.s: lines {145,164,180,190,194,201,209,219,227,233,239,243,246} ** external/opencore/codecs_v2/audio/mp3/dec/src/asm/pvmp3_mdct_18_gcc.s: lines {143,162,178,188,192,199,207,217,225,231,237,241,244} ** external/opencore/codecs_v2/audio/mp3/dec/src/asm/pvmp3_polyphase_filter_window.asm: lines {62,63,66,72,76,77,81,82,85,90,94,97,99,100,103,108,113,114,118,119,122,129,136,137,176,179,183,187,190,193} ** external/opencore/codecs_v2/audio/mp3/dec/src/asm/pvmp3_polyphase_filter_window.s: lines {67,68,71,77,81,82,86,87,90,95,99,102,104,105,108,113,118,119,123,124,127,134,141,142,181,184,188,192,195,198} ** external/opencore/codecs_v2/audio/mp3/dec/src/asm/pvmp3_polyphase_filter_window_gcc.s: lines {65,66,69,75,79,80,84,85,88,93,97,100,102,103,106,111,116,117,121,122,125,132,139,140,179,182,186,190,193,196} ** external/opencore/codecs_v2/audio/mp3/dec/src/pv_mp3dec_fxd_op_arm.h: lines {148} ** external/qemu/trace.c: lines {813} ** frameworks/base/opengl/libagl/iterators.S: lines {66,67} ** frameworks/base/opengl/libagl/matrix.h: lines {67,68,96,126,127,282,283,314,315,316} * smlawb ===================================== ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_gcc.h: lines {203,259} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v5.h: lines {166,416} ** frameworks/base/libs/audioflinger/AudioResamplerSinc.cpp: lines {93,109} ** frameworks/base/opengl/libagl/matrix.h: lines {163,203} * smlawt ===================================== ** frameworks/base/libs/audioflinger/AudioResamplerSinc.cpp: lines {114} ** frameworks/base/opengl/libagl/matrix.h: lines {162,202,243,244} * smulbb ===================================== ** external/jpeg/jidctfst.S: lines {109,114,151,153} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_gcc.h: lines {79} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v5.h: lines {71,81} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/basic_op_arm_gcc_v5.h: lines {207,251,297,348,361,375,427,440,487} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/basic_op_arm_v5.h: lines {199,234,274,314,316,326,367,369,404} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/l_mac.h: lines {121,137} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/l_msu.h: lines {123,142} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/l_mult.h: lines {122,140} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/mpy_32.h: lines {132,134,138,164,177,191} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/mpy_32_16.h: lines {127,129,150,163} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/mult.h: lines {121,141} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_armv5.h: lines {115,139,151,163,189,190,212} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_gcc_armv5.h: lines {112,113,164,183,201,218,265} ** external/opencore/codecs_v2/video/m4v_h263/enc/src/fastquant_inline.h: lines {250,457,531} ** external/skia/include/corecg/SkMath.h: lines {170} ** frameworks/base/libs/audioflinger/AudioMixer.cpp: lines {420,462} ** system/core/libpixelflinger/t32cb16blend.S: lines {39,66,74,82} * smulbt ===================================== ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_gcc.h: lines {115} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v5.h: lines {109} ** system/core/libpixelflinger/codeflinger/texturing.cpp: lines {1091} ** system/core/libpixelflinger/t32cb16blend.S: lines {47,55} * smultt ===================================== ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_gcc.h: lines {131} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v5.h: lines {100} ** frameworks/base/libs/audioflinger/AudioMixer.cpp: lines {467} ** frameworks/base/libs/audioflinger/AudioResamplerSinc.cpp: lines {73} * smulwb ===================================== ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_gcc.h: lines {221} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v5.h: lines {373} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_armv5.h: lines {222} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_gcc_armv5.h: lines {283} ** external/opencore/codecs_v2/audio/sbc/enc/src/sbcenc_filter.h: lines {33} ** frameworks/base/opengl/libagl/matrix.h: lines {161,201,242} * smulwt ===================================== ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_gcc.h: lines {202,240} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v5.h: lines {385,415} * qadd ===================================== ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_gcc.h: lines {64} ** external/opencore/codecs_v2/audio/aac/dec/src/fxp_mul32_arm_v5.h: lines {60} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/basic_op_arm_gcc_v5.h: lines {130,256} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/basic_op_arm_v5.h: lines {128,235} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/l_add.h: lines {122,137} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/l_mult.h: lines {123,145} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_armv5.h: lines {71,102,152,176,192} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_gcc_armv5.h: lines {91,115,148,202,234} ** external/openssl/crypto/bn/bn_prime.c: lines {454,455} * qdadd ===================================== ** external/opencore/codecs_v2/audio/aac/dec/src/calc_sbr_synfilterbank.cpp: lines {116,162} ** external/opencore/codecs_v2/audio/aac/dec/src/trans4m_freq_2_time_fxp.cpp: lines {472,494} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/basic_op_arm_gcc_v5.h: lines {212,356,370,385,435,449} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/basic_op_arm_v5.h: lines {200,315,321,331,368,371} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/l_mac.h: lines {122,142} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/mpy_32.h: lines {133,136,140,172,186,201} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/mpy_32_16.h: lines {128,131,158,172} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_armv5.h: lines {116} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_gcc_armv5.h: lines {184} * qdsub ===================================== ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/basic_op_arm_gcc_v5.h: lines {302} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/basic_op_arm_v5.h: lines {275} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/l_msu.h: lines {124,147} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_armv5.h: lines {140} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_gcc_armv5.h: lines {165} * qsub ===================================== ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/basic_op_arm_gcc_v5.h: lines {167} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/basic_op_arm_v5.h: lines {162} ** external/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include/l_sub.h: lines {121,138} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_armv5.h: lines {88,127} ** external/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/pvamrwbdecoder_basic_op_gcc_armv5.h: lines {70,133} * strd ===================================== ** dalvik/vm/mterp/armv5/OP_APUT_WIDE.S: lines {31} ** dalvik/vm/mterp/armv5/OP_IPUT_WIDE.S: lines {39} ** dalvik/vm/mterp/armv5/OP_IPUT_WIDE_QUICK.S: lines {14} ** dalvik/vm/mterp/armv5/OP_SPUT_WIDE.S: lines {21} ** dalvik/vm/mterp/out/InterpAsm-armv5.S: lines {2834,7530,8331,8542} ** dalvik/vm/oo/Object.h: lines {589} ** external/opencore/fileformats/avi/parser/include/pv_avifile_streamlist.h: lines {179} ** external/opencore/fileformats/avi/parser/src/pv_avifile_streamlist.cpp: lines {153} ** system/core/libpixelflinger/rotate90CW_4x4_16v6.S: lines {47,52,56,60} |
The file
system/core/libpixelflinger/codeflinger/ARMAssembler.cpp
will need special attention. It's responsible for dynamic generation of DSP code.
(Please Update Me)