SC05G用のTWRPファイルを作る

lineageのソースツリーに組み込んでboot.imgを作るのが面倒なのでカーネルソースとhacking Toolでどうにかならないかのメモ

lineagegccは/usr/bin/phython を呼び出すらしい。 /usr/bin/pythonが必要。それもpython3

/usr/bin/pythonは/usr/bin/python3.8 だよと設定する

# update-alternatives --install /usr/bin/python python /usr/bin/python3.8 0  
  
In file included from drivers/gud/TlcTui/platforms/exynos7420/../../../../video/exynos/decon/decon.h:40:0,
                 from drivers/gud/TlcTui/platforms/exynos7420/tui-hal.c:28:
drivers/gud/TlcTui/platforms/exynos7420/../../../../video/exynos/decon/dsim.h:167:16: error: duplicate member 'alpm_support'
  unsigned int  alpm_support; // 0 : unsupport, 1 : 30hz, 2 : 1hz
  
diff -u ./drivers/gud/TlcTui/platforms/exynos7420/tui-hal.c
  

dsim.h

#ifdef CONFIG_LCD_ALPM
        unsigned int    alpm;
        unsigned int    current_alpm;
        struct mutex    alpm_lock;
        unsigned char mtpForALPM[36];
        unsigned char prev_VT[2];
        unsigned char alpm_support;                     // because zero2 use 2panel(ha2, hf3)
#endif

#ifdef CONFIG_LCD_DOZE_MODE
        unsigned int    alpm_support;   // 0 : unsupport, 1 : 30hz, 2 : 1hz
        unsigned int    hlpm_support;   // 0 : unsupport, 1 : 30hz
        unsigned int alpm_mode;
        unsigned int curr_alpm_mode;
#endif


これからするとLCD_ALPMを使う場合は、CONFIG_LCD_DOZE_MODEは使わない設定になる。

-CONFIG_LCD_DOZE_MODE=y
+#CONFIG_LCD_DOZE_MODE is not set


他でコンパイルエラーが出る。lineage 15.1

15.1では
#CONFIG_LCD_DOZE_MODE is not set
にしている


TWRPのSprint版からカーネルとdt.img(dtsの集合体)を差し替える

まずは https://github.com/xiaolu/mkbootimg_tools で出来るか挑戦


$ git clone https://github.com/xiaolu/mkbootimg_tools

unpack先のフォルダ作成
$ cd ~/work
$ mkdir test

unpack

$ ~/mkbootimg_tools/mkboot /mnt/windows/twrp-3.2.1-0-zerofltespr.img test
Unpack & decompress /mnt/windows/twrp-3.2.1-0-zerofltespr.img to test
  board          : SYSMAGIC002RU
  kernel         : kernel
  ramdisk        : ramdisk
  page size      : 2048
  kernel size    : 18304264
  ramdisk size   : 6394582
  dtb size       : 720896
  base           : 0x10000000
  kernel offset  : 0x00008000
  ramdisk offset : 0x01000000
  tags offset    : 0x00000100
  dtb img        : dt.img
  cmd line       :
ramdisk is gzip format.
Unpack completed.

unpackはできた感じ。

$ ls
dt.img  img_info  kernel  ramdisk  ramdisk.packed


dt.imgを作る

カーネルのmake 終了後、dtbファイルが作成されたことを確認する

ls arch/arm64/boot/dts/*.dtb
arch/arm64/boot/dts/exynos7420-zeroflte_jpn_00.dtb  arch/arm64/boot/dts/exynos7420-zeroflte_jpn_03.dtb
arch/arm64/boot/dts/exynos7420-zeroflte_jpn_01.dtb  arch/arm64/boot/dts/exynos7420-zeroflte_jpn_04.dtb
arch/arm64/boot/dts/exynos7420-zeroflte_jpn_02.dtb

ls arch/arm64/boot/
Image  Image.gz  Image.gz-dtb  Makefile  dts  install.sh

Image.gz-dtbってなんだ?grepすると以下のようになっていた。
カーネルと各dtbファイルを連結させているファイルになっている。
使えない。

arch/arm64/boot/.Image.gz-dtb.cmd:cmd_arch/arm64/boot/Image.gz-dtb := (cat arch/arm64/boot/Image.gz arch/arm64/boot/dts/exynos7420-zeroflte_jpn_00.dtb arch/arm64/boot/dts/exynos7420-zeroflte_jpn_01.dtb arch/arm64/boot/dts/exynos7420-zeroflte_jpn_02.dtb arch/arm64/boot/dts/exynos7420-zeroflte_jpn_03.dtb arch/arm64/boot/dts/exynos7420-zeroflte_jpn_04.dtb > arch/arm64/boot/Image.gz-dtb) || (rm -f arch/arm64/boot/Image.gz-dtb; false)

dtbToolを実行する



dtbtoolは以下のようなコマンド形式になっているが、qcomが前提になっており、exynosには使えなかった。

./dtbTool -s $(BOARD_KERNEL_PAGESIZE) -o $(OUT_DIR)/arch/$(ARCH)/boot/dtb -p $(OUT_DIR)/scripts/dtc/ $(OUT_DIR)/arch/$(ARCH)/boot/dts/

~/mkbootimg_tools/dtbTool -s 2048 -o arch/arm64/boot/dt.img -p scripts/dtc/ arch/arm64/boot/dts/

Found file: exynos7420-zeroflte_jpn_00.dtb ... skip, failed to scan for 'qcom,msm-id = <' tag
...

exynos用に作っている人を探す

git clone https://github.com/kumajaya/mkdtbhbootimg/

mkdir out
~/mkdtbhbootimg/bin/unpackbootimg -i /mnt/windows/twrp-3.2.1-0-zerofltespr.img -o out

$ ~/mkdtbhbootimg/bin/mkdtbhbootimg

error: no output filename specified
usage: mkbootimg
       --kernel <filename>
       --ramdisk <filename>
       [ --second <2ndbootloader-filename> ]
       [ --cmdline <kernel-commandline> ]
       [ --board <boardname> ]
       [ --base <address> ]
       [ --pagesize <pagesize> ]
       [ --ramdisk_offset <address> ]
       [ --dt_dir <dtb path> ]
       [ --dt <filename> ]
       [ --signature <filename> ]
       -o|--output <filename>


使っている例
https://github.com/kumajaya/android_kernel_samsung_universal5422/blob/master/README.md

$ mkdtbhbootimg --kernel zImage \
                --ramdisk boot/boot.img-ramdisk.gz \
                --dt_dir /home/user/android/build/universal5422/arch/arm/boot/dts/ \
                -o boot-new.img

~/mkdtbhbootimg/bin/mkdtbhbootimg --kernel android_kernel_samsung_exynos7420-8.1/arch/arm64/boot/Image.gz \
                --ramdisk boot/boot.img-ramdisk.gz \
                --ramdisk work/out/twrp-3.2.1-0-zerofltespr.img-ramdisk.gz \
                --dt_dir android_kernel_samsung_exynos7420-8.1/arch/arm64/boot/dts \
                -o boot-new.img

mkdtbhbootimg: model_info-platform of \ 
 android_kernel_samsung_exynos7420-8.1/arch/arm64/boot/dts/exynos7420-zeroflte_jpn_00.dtb is invalid, skipping

このプログラムは、ソースの中に以下の定義があり合致していないとダメらしい

#define DTBH_MAGIC         "DTBH"
#define DTBH_VERSION       2
#define DTBH_PLATFORM      "k3g"
#define DTBH_SUBTYPE       "k3g_eur_open"
/* Hardcoded entry */
#define DTBH_PLATFORM_CODE 0x1e92
#define DTBH_SUBTYPE_CODE  0x7d64f612

DTBH_PLATFORMやDTBH_SUBTYPEをみている、それもコードで

        model_info-platform = "android";
        model_info-subtype = "samsung";

https://github.com/jesec/android_device_samsung_universal9810-common/blob/lineage-16.0/include/samsung_dtbh.h

#define DTBH_MAGIC         "DTBH"
#define DTBH_VERSION       2
#define DTBH_PLATFORM      "android"
#define DTBH_SUBTYPE       "samsung"
 /* Hardcoded entry */
#define DTBH_PLATFORM_CODE 0x000050a6
#define DTBH_SUBTYPE_CODE  0x217584da

/* DTBH_MAGIC + DTBH_VERSION + DTB counts */
#define DT_HEADER_PHYS_SIZE 12

https://github.com/Exhigh/android_device_samsung_exynos7420-common/blob/nx-9.0/include/samsung_dtbh.h

#define DTBH_MAGIC         "DTBH"
#define DTBH_VERSION       2
#define DTBH_PLATFORM      "android"
#define DTBH_SUBTYPE       "samsung"
 /* Hardcoded entry */
#define DTBH_PLATFORM_CODE 0x000050a6
#define DTBH_SUBTYPE_CODE  0x217584da

/* DTBH_MAGIC + DTBH_VERSION + DTB counts */
#define DT_HEADER_PHYS_SIZE 12

つまりこのソースはコンパイルするしかない。そのためにはlineageのソースの中で実装する必要がある

Android.mk

LOCAL_MODULE := mkdtbhbootimg

device.mk に追記するしかない。