From aed04bac2e129c410a6992e4115916198e3601d4 Mon Sep 17 00:00:00 2001 From: Eric Lee Date: Sun, 15 Jan 2017 23:06:06 +0800 Subject: [PATCH] Initial commit for SMARC-FiMX6 Android Support --- embedian/common/display/display_mode_fb0.conf | 5 + embedian/common/display/display_mode_fb2.conf | 7 + embedian/common/display/display_mode_fb4.conf | 7 + embedian/common/firmware/SPL.mmc | Bin 0 -> 35840 bytes embedian/common/firmware/SPL.nand | Bin 0 -> 35840 bytes embedian/common/firmware/WL8_System_parameters.ini | 89 + embedian/common/firmware/readme_variscite.txt | 8 + embedian/common/input/20b8000_kpp.idc | 25 + embedian/common/input/20b8000_kpp.kl | 13 + embedian/common/input/ADS7846_Touchscreen.idc | 28 + embedian/common/input/CTW6120_Touchscreen.idc | 40 + embedian/common/input/Dell_Dell_USB_Keyboard.idc | 25 + embedian/common/input/Dell_Dell_USB_Keyboard.kl | 102 + embedian/common/input/eGalax_Touch_Screen.idc | 5 + embedian/common/input/ft5x06_ts.idc | 30 + embedian/common/input/imx-keypad.idc | 25 + embedian/common/input/imx-keypad.kl | 13 + embedian/common/recovery/Android.mk | 13 + embedian/common/recovery/recovery_ui.cpp | 89 + embedian/common/security/README | 34 + embedian/common/security/media.x509.pem | 28 + embedian/common/security/platform.x509.pem | 28 + embedian/common/security/shared.x509.pem | 28 + embedian/common/security/testkey.x509.pem | 28 + embedian/common/tools/fsl-sdcard-partition-f2fs.sh | 163 + embedian/common/tools/fsl-sdcard-partition.sh | 163 + embedian/common/tools/split_bootimg.pl | 221 + embedian/imx6/AndroidProducts.mk | 30 + embedian/imx6/BoardConfigCommon.mk | 102 + embedian/imx6/bootanimation.zip | Bin 0 -> 3022846 bytes embedian/imx6/etc/apns-conf.xml | 301 + embedian/imx6/etc/init.usb.rc | 116 + embedian/imx6/etc/ota.conf | 3 + embedian/imx6/etc/ppp/init.gprs-pppd | 79 + embedian/imx6/etc/ueventd.freescale.rc | 52 + embedian/imx6/imx6.mk | 348 + embedian/imx6/imx6_target_fs.mk | 18 + embedian/imx6/init.recovery.freescale.rc | 7 + embedian/imx6/releasetools.py | 23 + embedian/imx6/sepolicy/bluetooth.te | 2 + embedian/imx6/sepolicy/bootanim.te | 1 + embedian/imx6/sepolicy/device.te | 1 + embedian/imx6/sepolicy/dnsmasq.te | 5 + embedian/imx6/sepolicy/domain.te | 21 + embedian/imx6/sepolicy/file_contexts | 28 + embedian/imx6/sepolicy/fs_use | 4 + embedian/imx6/sepolicy/genfs_contexts | 2 + embedian/imx6/sepolicy/init.te | 10 + embedian/imx6/sepolicy/install_recovery.te | 2 + embedian/imx6/sepolicy/kernel.te | 6 + embedian/imx6/sepolicy/logd.te | 3 + embedian/imx6/sepolicy/mediaserver.te | 6 + embedian/imx6/sepolicy/netd.te | 1 + embedian/imx6/sepolicy/platform_app.te | 1 + embedian/imx6/sepolicy/recovery.te | 11 + embedian/imx6/sepolicy/rild.te | 2 + embedian/imx6/sepolicy/sensors.te | 29 + embedian/imx6/sepolicy/shell.te | 4 + embedian/imx6/sepolicy/surfaceflinger.te | 1 + embedian/imx6/sepolicy/system_app.te | 9 + embedian/imx6/sepolicy/system_server.te | 5 + embedian/imx6/sepolicy/toolbox.te | 3 + embedian/imx6/sepolicy/untrusted_app.te | 8 + embedian/imx6/sepolicy/zygote.te | 2 + embedian/imx6/smarc_mx6.mk | 141 + embedian/imx6/soc/imx6dq.mk | 22 + embedian/imx6/vendorsetup.sh | 4 + embedian/smarc_mx6/AndroidBoard.mk | 7 + embedian/smarc_mx6/BoardConfig.mk | 164 + embedian/smarc_mx6/audio_effects.conf | 176 + embedian/smarc_mx6/audio_policy.conf | 101 + embedian/smarc_mx6/bluetooth/bdroid_buildcfg.h | 55 + embedian/smarc_mx6/build_id.mk | 22 + embedian/smarc_mx6/fstab_emmc-f2fs.freescale | 26 + embedian/smarc_mx6/fstab_emmc.freescale | 25 + embedian/smarc_mx6/fstab_sd-f2fs.freescale | 26 + embedian/smarc_mx6/fstab_sd.freescale | 25 + embedian/smarc_mx6/init.freescale.rc | 288 + embedian/smarc_mx6/init.i.MX6DL.rc | 13 + embedian/smarc_mx6/init.i.MX6Q.rc | 13 + embedian/smarc_mx6/init.rc | 761 ++ .../drawable-sw720dp-nodpi/default_wallpaper.jpg | Bin 0 -> 1339456 bytes .../frameworks/base/core/res/res/values/config.xml | 229 + .../base/core/res/res/xml/power_profile.xml | 61 + .../base/core/res/res/xml/storage_list.xml | 53 + .../SettingsProvider/res/values/defaults.xml | 28 + .../packages/apps/Bluetooth/res/values/config.xml | 18 + .../Launcher2/res/drawable-nodpi/wallpaper_00.jpg | Bin 0 -> 705174 bytes .../res/drawable-nodpi/wallpaper_00_small.jpg | Bin 0 -> 13626 bytes .../Launcher2/res/drawable-nodpi/wallpaper_01.jpg | Bin 0 -> 310909 bytes .../res/drawable-nodpi/wallpaper_01_small.jpg | Bin 0 -> 12800 bytes .../Launcher2/res/drawable-nodpi/wallpaper_02.jpg | Bin 0 -> 620816 bytes .../res/drawable-nodpi/wallpaper_02_small.jpg | Bin 0 -> 14004 bytes .../Launcher2/res/drawable-nodpi/wallpaper_03.jpg | Bin 0 -> 273356 bytes .../res/drawable-nodpi/wallpaper_03_small.jpg | Bin 0 -> 7365 bytes .../Launcher2/res/drawable-nodpi/wallpaper_04.jpg | Bin 0 -> 300867 bytes .../res/drawable-nodpi/wallpaper_04_small.jpg | Bin 0 -> 10012 bytes .../Launcher2/res/drawable-nodpi/wallpaper_05.jpg | Bin 0 -> 534777 bytes .../res/drawable-nodpi/wallpaper_05_small.jpg | Bin 0 -> 13986 bytes .../Launcher2/res/drawable-nodpi/wallpaper_06.jpg | Bin 0 -> 216166 bytes .../res/drawable-nodpi/wallpaper_06_small.jpg | Bin 0 -> 6537 bytes .../Launcher2/res/drawable-nodpi/wallpaper_07.jpg | Bin 0 -> 558982 bytes .../res/drawable-nodpi/wallpaper_07_small.jpg | Bin 0 -> 14451 bytes .../Launcher2/res/drawable-nodpi/wallpaper_08.jpg | Bin 0 -> 796555 bytes .../res/drawable-nodpi/wallpaper_08_small.jpg | Bin 0 -> 16071 bytes .../Launcher2/res/drawable-nodpi/wallpaper_09.jpg | Bin 0 -> 608479 bytes .../res/drawable-nodpi/wallpaper_09_small.jpg | Bin 0 -> 12412 bytes .../Launcher2/res/drawable-nodpi/wallpaper_10.jpg | Bin 0 -> 300281 bytes .../res/drawable-nodpi/wallpaper_10_small.jpg | Bin 0 -> 12834 bytes .../apps/Launcher2/res/values-sw720dp/dimens.xml | 20 + .../packages/apps/Launcher2/res/values/config.xml | 3 + .../apps/Launcher2/res/values/wallpapers.xml | 40 + .../packages/apps/Settings/res/values/bools.xml | 19 + .../packages/apps/Settings/res/values/config.xml | 21 + .../packages/apps/Settings/res/values/strings.xml | 22 + embedian/smarc_mx6/required_hardware.xml | 52 + embedian/smarc_mx6/ubi/ubinize.ini | 33 + install | 231 + ...ecovery-fix-working-the-recovering-script.patch | 73 + .../0001-added-build-wl18xx-compact.patch | 27 + ...edian-fix-make-options-for-kernel-and-etc.patch | 25 + ...isable-default-build-device-fsl-common-wi.patch | 31 + .../0001-fix-buid-this-module-for-android.patch | 25 + ...wl18xx-wlan-update-firmware-and-conf-file.patch | 13127 +++++++++++++++++++ ...pan-update-initscripts-bluetooth-firmware.patch | 8529 ++++++++++++ .../0001-fix-build-this-module-for-android.patch | 25 + .../external/toybox.git/0001-fix-hwclock-w.patch | 65 + ...dd-ti_wl-wifi-support-for-Embedian-boards.patch | 98 + ...error-in-boot-process-IR-service-exeption.patch | 33 + ...ix-mNavigationBarCanMove-variable-for-sma.patch | 26 + ...001-embedian-added-support-sgtl5000-codec.patch | 110 + ...fix-errors-in-the-descriptor-when-request.patch | 238 + ...01-fix-exepcen.null-error-in-boot-process.patch | 29 + .../0001-Fix-build-for-Android.patch | 336 + .../0001-fix-build-this-module-for-android.patch | 40 + ...ix-one-camera-support-supported-variants-.patch | 40 + ...ix-crash-camera2.apk-if-used-only-back-mi.patch | 30 + ...ix-crash-Camera3-apk-under-certain-lcd-de.patch | 31 + ...0004-embedian-fix-video-recording-support.patch | 25 + .../0001-embedian-added-bt-header-files.patch | 421 + ...added-boot-console-options-for-embedian-b.patch | 42 + ...added-parse-and-work-extended-events-crda.patch | 95 + ...bedian-fix-firmware-loda-for-ti_wl-module.patch | 61 + sh/emb-mksdcard.sh | 158 + 144 files changed, 28902 insertions(+) create mode 100644 embedian/common/display/display_mode_fb0.conf create mode 100644 embedian/common/display/display_mode_fb2.conf create mode 100644 embedian/common/display/display_mode_fb4.conf create mode 100644 embedian/common/firmware/SPL.mmc create mode 100644 embedian/common/firmware/SPL.nand create mode 100644 embedian/common/firmware/WL8_System_parameters.ini create mode 100644 embedian/common/firmware/readme_variscite.txt create mode 100644 embedian/common/input/20b8000_kpp.idc create mode 100644 embedian/common/input/20b8000_kpp.kl create mode 100644 embedian/common/input/ADS7846_Touchscreen.idc create mode 100644 embedian/common/input/CTW6120_Touchscreen.idc create mode 100644 embedian/common/input/Dell_Dell_USB_Keyboard.idc create mode 100644 embedian/common/input/Dell_Dell_USB_Keyboard.kl create mode 100644 embedian/common/input/eGalax_Touch_Screen.idc create mode 100644 embedian/common/input/ft5x06_ts.idc create mode 100644 embedian/common/input/imx-keypad.idc create mode 100644 embedian/common/input/imx-keypad.kl create mode 100644 embedian/common/recovery/Android.mk create mode 100644 embedian/common/recovery/recovery_ui.cpp create mode 100644 embedian/common/security/README create mode 100644 embedian/common/security/media.x509.pem create mode 100644 embedian/common/security/platform.x509.pem create mode 100644 embedian/common/security/shared.x509.pem create mode 100644 embedian/common/security/testkey.x509.pem create mode 100644 embedian/common/tools/fsl-sdcard-partition-f2fs.sh create mode 100644 embedian/common/tools/fsl-sdcard-partition.sh create mode 100644 embedian/common/tools/split_bootimg.pl create mode 100644 embedian/imx6/AndroidProducts.mk create mode 100644 embedian/imx6/BoardConfigCommon.mk create mode 100644 embedian/imx6/bootanimation.zip create mode 100644 embedian/imx6/etc/apns-conf.xml create mode 100644 embedian/imx6/etc/init.usb.rc create mode 100644 embedian/imx6/etc/ota.conf create mode 100644 embedian/imx6/etc/ppp/init.gprs-pppd create mode 100644 embedian/imx6/etc/ueventd.freescale.rc create mode 100644 embedian/imx6/imx6.mk create mode 100644 embedian/imx6/imx6_target_fs.mk create mode 100644 embedian/imx6/init.recovery.freescale.rc create mode 100644 embedian/imx6/releasetools.py create mode 100644 embedian/imx6/sepolicy/bluetooth.te create mode 100644 embedian/imx6/sepolicy/bootanim.te create mode 100644 embedian/imx6/sepolicy/device.te create mode 100644 embedian/imx6/sepolicy/dnsmasq.te create mode 100644 embedian/imx6/sepolicy/domain.te create mode 100644 embedian/imx6/sepolicy/file_contexts create mode 100644 embedian/imx6/sepolicy/fs_use create mode 100644 embedian/imx6/sepolicy/genfs_contexts create mode 100644 embedian/imx6/sepolicy/init.te create mode 100644 embedian/imx6/sepolicy/install_recovery.te create mode 100644 embedian/imx6/sepolicy/kernel.te create mode 100644 embedian/imx6/sepolicy/logd.te create mode 100644 embedian/imx6/sepolicy/mediaserver.te create mode 100644 embedian/imx6/sepolicy/netd.te create mode 100644 embedian/imx6/sepolicy/platform_app.te create mode 100644 embedian/imx6/sepolicy/recovery.te create mode 100644 embedian/imx6/sepolicy/rild.te create mode 100644 embedian/imx6/sepolicy/sensors.te create mode 100644 embedian/imx6/sepolicy/shell.te create mode 100644 embedian/imx6/sepolicy/surfaceflinger.te create mode 100644 embedian/imx6/sepolicy/system_app.te create mode 100644 embedian/imx6/sepolicy/system_server.te create mode 100644 embedian/imx6/sepolicy/toolbox.te create mode 100644 embedian/imx6/sepolicy/untrusted_app.te create mode 100644 embedian/imx6/sepolicy/zygote.te create mode 100644 embedian/imx6/smarc_mx6.mk create mode 100644 embedian/imx6/soc/imx6dq.mk create mode 100644 embedian/imx6/vendorsetup.sh create mode 100644 embedian/smarc_mx6/AndroidBoard.mk create mode 100644 embedian/smarc_mx6/BoardConfig.mk create mode 100644 embedian/smarc_mx6/audio_effects.conf create mode 100644 embedian/smarc_mx6/audio_policy.conf create mode 100644 embedian/smarc_mx6/bluetooth/bdroid_buildcfg.h create mode 100644 embedian/smarc_mx6/build_id.mk create mode 100644 embedian/smarc_mx6/fstab_emmc-f2fs.freescale create mode 100644 embedian/smarc_mx6/fstab_emmc.freescale create mode 100644 embedian/smarc_mx6/fstab_sd-f2fs.freescale create mode 100644 embedian/smarc_mx6/fstab_sd.freescale create mode 100644 embedian/smarc_mx6/init.freescale.rc create mode 100644 embedian/smarc_mx6/init.i.MX6DL.rc create mode 100644 embedian/smarc_mx6/init.i.MX6Q.rc create mode 100644 embedian/smarc_mx6/init.rc create mode 100644 embedian/smarc_mx6/overlay/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.jpg create mode 100644 embedian/smarc_mx6/overlay/frameworks/base/core/res/res/values/config.xml create mode 100644 embedian/smarc_mx6/overlay/frameworks/base/core/res/res/xml/power_profile.xml create mode 100644 embedian/smarc_mx6/overlay/frameworks/base/core/res/res/xml/storage_list.xml create mode 100644 embedian/smarc_mx6/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Bluetooth/res/values/config.xml create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_00.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_00_small.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_01.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_01_small.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_02.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_02_small.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_03.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_03_small.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_04.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_04_small.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_05.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_05_small.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_06.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_06_small.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_07.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_07_small.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_08.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_08_small.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_09.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_09_small.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_10.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/drawable-nodpi/wallpaper_10_small.jpg create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/values-sw720dp/dimens.xml create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/values/config.xml create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Launcher2/res/values/wallpapers.xml create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Settings/res/values/bools.xml create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Settings/res/values/config.xml create mode 100644 embedian/smarc_mx6/overlay/packages/apps/Settings/res/values/strings.xml create mode 100644 embedian/smarc_mx6/required_hardware.xml create mode 100644 embedian/smarc_mx6/ubi/ubinize.ini create mode 100755 install create mode 100644 platform/bootable/recovery.git/0001-recovery-fix-working-the-recovering-script.patch create mode 100644 platform/build.git/0001-added-build-wl18xx-compact.patch create mode 100644 platform/build.git/0002-embedian-fix-make-options-for-kernel-and-etc.patch create mode 100644 platform/device/fsl.git/0001-embedian-disable-default-build-device-fsl-common-wi.patch create mode 100644 platform/device/ti/proprietary-open.git/0001-fix-buid-this-module-for-android.patch create mode 100644 platform/device/ti/proprietary-open.git/0002-wl18xx-wlan-update-firmware-and-conf-file.patch create mode 100644 platform/device/ti/proprietary-open.git/0003-wl18xx-wpan-update-initscripts-bluetooth-firmware.patch create mode 100644 platform/external/i2c-tools.git/0001-fix-build-this-module-for-android.patch create mode 100644 platform/external/toybox.git/0001-fix-hwclock-w.patch create mode 100644 platform/external/wpa_supplicant_8.git/0001-Add-ti_wl-wifi-support-for-Embedian-boards.patch create mode 100644 platform/frameworks/base.git/0001-fix-error-in-boot-process-IR-service-exeption.patch create mode 100644 platform/frameworks/base.git/0002-embedian-fix-mNavigationBarCanMove-variable-for-sma.patch create mode 100644 platform/hardware/imx.git/0001-embedian-added-support-sgtl5000-codec.patch create mode 100644 platform/hardware/imx.git/0002-libcamera3-fix-errors-in-the-descriptor-when-request.patch create mode 100644 platform/hardware/libhardware.git/0001-fix-exepcen.null-error-in-boot-process.patch create mode 100644 platform/hardware/ti/wl18xx-ti-utils.git/0001-Fix-build-for-Android.patch create mode 100644 platform/hardware/ti/wpan.git/0001-fix-build-this-module-for-android.patch create mode 100644 platform/packages/apps/Camera2.git/0001-embedian-fix-one-camera-support-supported-variants-.patch create mode 100644 platform/packages/apps/Camera2.git/0002-embedian-fix-crash-camera2.apk-if-used-only-back-mi.patch create mode 100644 platform/packages/apps/Camera2.git/0003-embedian-fix-crash-Camera3-apk-under-certain-lcd-de.patch create mode 100644 platform/packages/apps/Camera2.git/0004-embedian-fix-video-recording-support.patch create mode 100644 platform/system/bt.git/0001-embedian-added-bt-header-files.patch create mode 100644 platform/system/core.git/0001-embedian-added-boot-console-options-for-embedian-b.patch create mode 100644 platform/system/core.git/0002-embedian-added-parse-and-work-extended-events-crda.patch create mode 100644 platform/system/netd.git/0001-embedian-fix-firmware-loda-for-ti_wl-module.patch create mode 100755 sh/emb-mksdcard.sh diff --git a/embedian/common/display/display_mode_fb0.conf b/embedian/common/display/display_mode_fb0.conf new file mode 100644 index 0000000..9e86cd5 --- /dev/null +++ b/embedian/common/display/display_mode_fb0.conf @@ -0,0 +1,5 @@ +S:1920x1080p-60 +U:1920x1080p-60 +S:1280x720p-60 +U:1280x720p-60 +D:1024x768p-60 diff --git a/embedian/common/display/display_mode_fb2.conf b/embedian/common/display/display_mode_fb2.conf new file mode 100644 index 0000000..535ba20 --- /dev/null +++ b/embedian/common/display/display_mode_fb2.conf @@ -0,0 +1,7 @@ +S:1920x1080p-60 +U:1920x1080p-60 +S:1280x720p-60 +U:1280x720p-60 +D:1024x768p-60 +S:720x576p-50 +S:720x480p-60 diff --git a/embedian/common/display/display_mode_fb4.conf b/embedian/common/display/display_mode_fb4.conf new file mode 100644 index 0000000..535ba20 --- /dev/null +++ b/embedian/common/display/display_mode_fb4.conf @@ -0,0 +1,7 @@ +S:1920x1080p-60 +U:1920x1080p-60 +S:1280x720p-60 +U:1280x720p-60 +D:1024x768p-60 +S:720x576p-50 +S:720x480p-60 diff --git a/embedian/common/firmware/SPL.mmc b/embedian/common/firmware/SPL.mmc new file mode 100644 index 0000000000000000000000000000000000000000..104f089c8898bd5dd92b14129b0e4f08fe4b4be6 GIT binary patch literal 35840 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 literal 0 HcmV?d00001 diff --git a/embedian/common/firmware/SPL.nand b/embedian/common/firmware/SPL.nand new file mode 100644 index 0000000000000000000000000000000000000000..d724fdbba74cdc3f63886bf94306dfb4d81c3ad2 GIT binary patch literal 35840 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 +#include +#include +#include + +#include "common.h" +#include "device.h" +#include "screen_ui.h" + + +const char* ITEMS[] = { "reboot system now", + "apply update from ADB", + "wipe data/factory reset", + "wipe cache partition", + NULL }; + +class ImxUI : public ScreenRecoveryUI { + +}; + + +class ImxDevice : public Device { + public: + ImxDevice() : + Device(new ImxUI) { + } + + int HandleMenuKey(int key_code, int visible) { + if(GetUI()->HasThreeButtons()) { + if (visible) { + switch (key_code) { + case KEY_DOWN: + case KEY_VOLUMEDOWN: + return kHighlightDown; + case KEY_UP: + case KEY_VOLUMEUP: + return kHighlightUp; + case KEY_ENTER: + return kInvokeItem; + }; + }; + } else { + if (visible) { + switch (key_code) { + case KEY_ENTER: + return kInvokeItem; + default: + return kHighlightDown; + } + } + } + + return kNoAction; + } + + BuiltinAction InvokeMenuItem(int menu_position) { + switch (menu_position) { + case 0: return REBOOT; + case 1: return APPLY_ADB_SIDELOAD; + case 2: return WIPE_DATA; + case 3: return WIPE_CACHE; + default: return NO_ACTION; + } + } + + const char* const* GetMenuItems() { return ITEMS; } + +}; + +Device* make_device() { + return new ImxDevice; +} diff --git a/embedian/common/security/README b/embedian/common/security/README new file mode 100644 index 0000000..24f984c --- /dev/null +++ b/embedian/common/security/README @@ -0,0 +1,34 @@ +The following commands were used to generate the test key pairs: + + development/tools/make_key testkey '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com' + development/tools/make_key platform '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com' + development/tools/make_key shared '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com' + development/tools/make_key media '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com' + +The following standard test keys are currently included: + +testkey -- a generic key for packages that do not otherwise specify a key. +platform -- a test key for packages that are part of the core platform. +shared -- a test key for things that are shared in the home/contacts process. +media -- a test key for packages that are part of the media/download system. + +These test keys are used strictly in development, and should never be assumed +to convey any sort of validity. When $BUILD_SECURE=true, the code should not +honor these keys in any context. + + +signing using the openssl commandline (for boot/system images) +-------------------------------------------------------------- + +1. convert pk8 format key to pem format + % openssl pkcs8 -inform DER -nocrypt -in testkey.pk8 -out testkey.pem + +2. create a signature using the pem format key + % openssl dgst -binary -sha1 -sign testkey.pem FILE > FILE.sig + +extracting public keys for embedding +------------------------------------ +it's a Java tool +but it generates C code +take a look at commands/recovery/Android.mk +you'll see it running $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar diff --git a/embedian/common/security/media.x509.pem b/embedian/common/security/media.x509.pem new file mode 100644 index 0000000..c4428c5 --- /dev/null +++ b/embedian/common/security/media.x509.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIIErjCCA5agAwIBAgIJANGuV7GVtHcoMA0GCSqGSIb3DQEBBQUAMIGWMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g +VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE +AxMHQW5kcm9pZDEkMCIGCSqGSIb3DQEJARYVYW5kcm9pZEBmcmVlc2NhbGUuY29t +MB4XDTExMDcxNDE3MjkyM1oXDTM4MTEyOTE3MjkyM1owgZYxCzAJBgNVBAYTAlVT +MRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRAw +DgYDVQQKEwdBbmRyb2lkMRAwDgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRy +b2lkMSQwIgYJKoZIhvcNAQkBFhVhbmRyb2lkQGZyZWVzY2FsZS5jb20wggEgMA0G +CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQDdn40WhF7QU0dnhDk2R/M2ENvzL3kh +FInjlkmA7brQTkdEGrKSlbkb98H8CRokHRg+tAUOVIAWRKZK3aRYcBROKEQZ+Cqh +rI6sAo/I5xQFaLzqA+SZD7P6TKrfl7krggz7aXcjrecZ5zi7a8qxPrlrQAblydJx +iA7S4Yp0w4ifDc3p7Isvoh2KfcRNLgR/cjmdr9k4Bz1BQja7TwJNO2u7B7f5wUE8 +T2RD2tKdVQ0Rvny75LIyPweXEcvG9Rl8RDMh+T6q36bzRGQrOvCovAAP8Aa2LkLt +dyAN1ebpctMZyenJOugxwxjrC5g+wKtW7L+rS6BDbEl656mQGmjpuKJzAgEDo4H+ +MIH7MB0GA1UdDgQWBBTC86zcjmgdEs1OSUf+qAnsts0GJTCBywYDVR0jBIHDMIHA +gBTC86zcjmgdEs1OSUf+qAnsts0GJaGBnKSBmTCBljELMAkGA1UEBhMCVVMxEzAR +BgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxEDAOBgNV +BAoTB0FuZHJvaWQxEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWQx +JDAiBgkqhkiG9w0BCQEWFWFuZHJvaWRAZnJlZXNjYWxlLmNvbYIJANGuV7GVtHco +MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKRMeA4zF0dtnDf7cgC0 +pRxKxxAyxiruYhBxHkNpu0lvKYHzT9pPliyZA/EREheeTmwS6knva5XS4EO7R3LW +Uu7PCNSll8wde2uthY/56G0AiUv2ppj/IP3FXB3L1IfEINKvb/VUOOvCIihnYiSd +PUTih26gj+9bhVhV5dop0mU3xygrWqeVrPz51zzHkhyAzNOaNgEm3RhCxaX9Q/na +yDawkxfhe/RnnKmtBq/Q0PLFO1RDj4DRcilnk9oCDsRoJ6zCN5u1Jbdb0iainsnA +zCEegp21bvPsuLnpf8af4IIUlZUC0L/9wamAnwqc9KvawC8raJXwlhMI8L8IskBh +NE8= +-----END CERTIFICATE----- diff --git a/embedian/common/security/platform.x509.pem b/embedian/common/security/platform.x509.pem new file mode 100644 index 0000000..d8946fa --- /dev/null +++ b/embedian/common/security/platform.x509.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIIErjCCA5agAwIBAgIJANLLpXKW6+viMA0GCSqGSIb3DQEBBQUAMIGWMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g +VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE +AxMHQW5kcm9pZDEkMCIGCSqGSIb3DQEJARYVYW5kcm9pZEBmcmVlc2NhbGUuY29t +MB4XDTExMDcxNDE3Mjg1MVoXDTM4MTEyOTE3Mjg1MVowgZYxCzAJBgNVBAYTAlVT +MRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRAw +DgYDVQQKEwdBbmRyb2lkMRAwDgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRy +b2lkMSQwIgYJKoZIhvcNAQkBFhVhbmRyb2lkQGZyZWVzY2FsZS5jb20wggEgMA0G +CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQDKfcwUjBnUhpE4R0mcj0JjbWI2cmnY +9ESTNSS4oZ5wdNgI72JpDXD8uBwFYTsLqQFJkuveSf70AnONPAE3MQgyzC88iiWn +SvEk/av1zIcJmV2HV/GTxQIH6lqunz7HJ9TIIwantKVUMLswKIJPmK2vN8zWGrQi +8T3UEZl0vazjx8jXbTqpLZHYoMI//kOHe215zK6gv/kiABIsMi0eOYF7CwWLC+Tv +kTV2UxjhgwVKvfB5Wo4c/VEaQde4V9Eb4NCC3+dy7GBDCoBL5feXmUQy+sk5mj/m +a49UM+/emM9uU2ZsYdCYEfoy56PdMQXlEz6R48no5UqngBsAbwNTEyYXAgEDo4H+ +MIH7MB0GA1UdDgQWBBQTc1KDaqoJ28HDTxiGGEiM46nn4DCBywYDVR0jBIHDMIHA +gBQTc1KDaqoJ28HDTxiGGEiM46nn4KGBnKSBmTCBljELMAkGA1UEBhMCVVMxEzAR +BgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxEDAOBgNV +BAoTB0FuZHJvaWQxEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWQx +JDAiBgkqhkiG9w0BCQEWFWFuZHJvaWRAZnJlZXNjYWxlLmNvbYIJANLLpXKW6+vi +MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAvsBa20U1sq1Wm/dvb9 +WlYmHlUawSQguFAa9FoK3uyr4sWMjXERsvBMn45AS/9sVAp15ViFKOp+JeYPYVSz +B4YgvE2X3xy/oSI16STDObgd5EMRYhEU9OIk6CDJZoYnqn3gbJ9Bi8pvHA8jPgY+ +TzoAGGmy2+QqJxsr2TM5bP6FzoLyHv1OmIEBE99xZyWwXnMyfUVmWjey+7OeEz4j +Bg9oYJ2/g3zbcQKmq1fIsCyi/tdms+FIf0rpZRKcjgUPyUuPvNe3ffV8FJo6S3aS +UZ5qQU9yXfL/As8xJT3FpPAXTYaauV0+kh7Hv0nOi8D5Sxel3sUTyEQ5VrewGCvP +Hx0= +-----END CERTIFICATE----- diff --git a/embedian/common/security/shared.x509.pem b/embedian/common/security/shared.x509.pem new file mode 100644 index 0000000..0c1f264 --- /dev/null +++ b/embedian/common/security/shared.x509.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIIErjCCA5agAwIBAgIJAIFL7eJJNuK8MA0GCSqGSIb3DQEBBQUAMIGWMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g +VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE +AxMHQW5kcm9pZDEkMCIGCSqGSIb3DQEJARYVYW5kcm9pZEBmcmVlc2NhbGUuY29t +MB4XDTExMDcxNDE3MjkwOVoXDTM4MTEyOTE3MjkwOVowgZYxCzAJBgNVBAYTAlVT +MRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRAw +DgYDVQQKEwdBbmRyb2lkMRAwDgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRy +b2lkMSQwIgYJKoZIhvcNAQkBFhVhbmRyb2lkQGZyZWVzY2FsZS5jb20wggEgMA0G +CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQDZ0vPfz61oxKfoGNrNwBP8hcharJrV +40t2jXsnhP6UIigPYxqPDO1Ag/TNoPBJE58sI9BkmmRnzvPF94dh6f26/IMwhNij +LI/LVb0Kg9xjSnKoV4QqQNUHx4d6HruJzXOlk4iskQCOBGOKZWfInDlkHIpz4nIb +vXt246APfc2MtRHmAdJlqGnd6dtV5z2BS8kW/82UHAHUMPHOyk/mU1mTk6ot3NQH +P0IokyFHsU+25mUZ2XH22mNjDehqSNJ52qT/XSY7H7Yhf8eQTkHg2coSP+NNvzoe +wfVEyeHBOAQIQkCNqgyO/hxY0eNGpE27DI1HmRrg2fn3FTfkYmELeoL1AgEDo4H+ +MIH7MB0GA1UdDgQWBBR1vyzIVmDNTwPL8qiEY79k6dAxWTCBywYDVR0jBIHDMIHA +gBR1vyzIVmDNTwPL8qiEY79k6dAxWaGBnKSBmTCBljELMAkGA1UEBhMCVVMxEzAR +BgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxEDAOBgNV +BAoTB0FuZHJvaWQxEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWQx +JDAiBgkqhkiG9w0BCQEWFWFuZHJvaWRAZnJlZXNjYWxlLmNvbYIJAIFL7eJJNuK8 +MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBABXjlQcUHtxHZLbmOSO9 +Kjb8IQYayAYO/j8ss27lhj1+v1jG4yvF8+RyQP5FjqMEiGrjyQ8wgW0b6s0sndYO +N1N0a00is9HurDnLl0yz4X/jcMRCBzOBtv+h9VraUg0KGe+IehHqMTRtsGJIlCYX +cjq0jomQTrwXTNTDnJsqt0mB4PHVlolLnZXcz5Kde0orRV8vbSDtBkmkwDAtmwqy +TueRU9aY4U5yZJubHmj1H9Psf5S4rxMFXhyjLvhwqOCcxAX+TP7hIRkvHp18xcF+ +dCNit+cMyRwOofDEwNMdcJc2vwJBkolE7wBjUPL6g6pJVWL4QT0e6bHtcFk7wuLR +gNY= +-----END CERTIFICATE----- diff --git a/embedian/common/security/testkey.x509.pem b/embedian/common/security/testkey.x509.pem new file mode 100644 index 0000000..c1e61dd --- /dev/null +++ b/embedian/common/security/testkey.x509.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIIErjCCA5agAwIBAgIJAJP+xgQI4Pg9MA0GCSqGSIb3DQEBBQUAMIGWMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g +VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE +AxMHQW5kcm9pZDEkMCIGCSqGSIb3DQEJARYVYW5kcm9pZEBmcmVlc2NhbGUuY29t +MB4XDTExMDcxNDE3MjgzMloXDTM4MTEyOTE3MjgzMlowgZYxCzAJBgNVBAYTAlVT +MRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRAw +DgYDVQQKEwdBbmRyb2lkMRAwDgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRy +b2lkMSQwIgYJKoZIhvcNAQkBFhVhbmRyb2lkQGZyZWVzY2FsZS5jb20wggEgMA0G +CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQCt5C1JPWTkEA6IlZcdIZP42tAlpffB ++4dQlcRrBz8hFFbIrQcjmDCtR19ZuW2a8xfp3ajQM5fYcjGIzlaVjw086+D9wW/A +PQQa22s47fWMqHIbBeywFo9BFMTHuUzSn2nUAkKnnxbspFv3I87+B+KJFv9j2PCI +BiQ3hAZGeJgyqrya0A23+Mmq3gEuficod3JrfUXpLQ0iA+XJNKnIO97jok1zTAx3 +5AfOnMTE/mZcgq6xKE6zKUNWbJQqzWEGTI5JkEA+XDemq1lqVYwXkyYz0lnVcYuE +ZKGOgpJ46LZ/0/Q4rvOx+4oPqtE+I71bLot3P8Pky1japwUB+Pjv6EgPAgEDo4H+ +MIH7MB0GA1UdDgQWBBQdbzxKnQtVHwnQ0AKG8hXz1bcUhDCBywYDVR0jBIHDMIHA +gBQdbzxKnQtVHwnQ0AKG8hXz1bcUhKGBnKSBmTCBljELMAkGA1UEBhMCVVMxEzAR +BgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxEDAOBgNV +BAoTB0FuZHJvaWQxEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWQx +JDAiBgkqhkiG9w0BCQEWFWFuZHJvaWRAZnJlZXNjYWxlLmNvbYIJAJP+xgQI4Pg9 +MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAA/axkqE1FHxanus2roy +EOZegREl9rilmAQVj+WoWzc2pH0/wmXC/tltlNtYkbK1VrkYSNtaQHpN6ikBzm1+ +UiPTk0nTDQohzswmodUF3WF0CeG0gZYmfTptxSHcKNQjHT1Ogex5fKtNPYdPkpoS +Cn8EaE1QPW9YL5Yr2GkPa8f7JSmN4DxR7TFcsUuOzetb90SYkWYh00hKK7RoR4id +7NJqnk9/Rxhr7Uyx3n24Aao+Snc6qAtD68IkzRwpwVRX4W/x40gTtGarr8tR+PIg +SqoaAen3FYQB+QghozDOAcRCX10bpAspVJpAU6jdkiKAhDaOz1L7gK/JEhLswyMf +htc= +-----END CERTIFICATE----- diff --git a/embedian/common/tools/fsl-sdcard-partition-f2fs.sh b/embedian/common/tools/fsl-sdcard-partition-f2fs.sh new file mode 100644 index 0000000..92e5d80 --- /dev/null +++ b/embedian/common/tools/fsl-sdcard-partition-f2fs.sh @@ -0,0 +1,163 @@ +#!/bin/bash + +# android-tools-fsutils should be installed as +# "sudo apt-get install android-tools-fsutils" + +# partition size in MB +BOOTLOAD_RESERVE=8 +BOOT_ROM_SIZE=16 +SYSTEM_ROM_SIZE=800 +CACHE_SIZE=512 +RECOVERY_ROM_SIZE=16 +DEVICE_SIZE=8 +MISC_SIZE=6 +DATAFOOTER_SIZE=2 + +help() { + +bn=`basename $0` +cat << EOF +usage $bn