OptimusG(L-01E,LGL21)にCPUサーマルスロットリングを組み込む

CPUサーマルスロットリングとは

温度が上昇するとクロックを下げて温度上昇を抑える仕組み

もともと組み込んであるのだが、configファイルをみると

/etc/thermald.conf

...
[tsens_tz_sensor7]
sampling         5000
thresholds       60      120
thresholds_clr   57      115
actions          none    shutdown
action_info      0       5000
...
[tsens_tz_sensor10]
sampling         5000
thresholds       60      120
thresholds_clr   57      115
actions          none    shutdown
action_info      0       5000
...

温度(thresholds)が高くなるとシャットダウンしか記述されていない

実際ゲームを長時間やると温度が高くなって本体が電源OFFする

これを以下のように記述してみた

...
[tsens_tz_sensor7]
sampling         5000
thresholds       60     70      90      95      100     105     110     115
thresholds_clr   57     67      85      90      95      100     105     110
actions          none   cpu     cpu     cpu     cpu     cpu     cpu     shutdown
action_info      0      1512000 1242000 1134000  702000  594000  384000  5000
...
[tsens_tz_sensor10]
sampling         5000
thresholds       60     70      90      95      100     105     110     115
thresholds_clr   57     67      85      90      95      100     105     110
actions          none   cpu     cpu     cpu     cpu     cpu     cpu     shutdown
action_info      0      1512000 1242000 1134000  702000  594000  384000  5000
...

CPU Throttling Test アプリでは負荷テストをしながらCPUの温度とクロックをモニタリングできる

実際動かしてみると最高クロックの指定が行われていることがわかる

adb では、以下の操作で最高クロックの内容が確認できる

$ adb root
$ adb shell
# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
1512000
# cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq
1512000
# cat /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq
1512000
# cat /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq
1512000

thermaldというプログラムはcpu0はあまり指定せす、cpu1~cpu3を先に指定しているようである

Optimus-G(L-01E/LGL21)のパーティション情報

8.1, 9.0, 10.0 のカスタムROMビルドでは、systemパーティションをかなり消費する。 ぎりぎりまで使う設定が必要。 L-01EとLGL21の共通のパーティションサイズの確認をする

LGL21(Android 4.0)

C:\adb>adb shell
~ # chmod +x parted
~ # ./parted /dev/block/mmcblk0 p
Model: MMC 016G92 (sd/mmc)
Disk /dev/block/mmcblk0: 15.8GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name        Flags
...
 7      83.9MB  109MB   25.2MB               boot
...
23      193MB   1787MB  1594MB  ext2         system
24      1787MB  2626MB  839MB   ext4         cache
25      2626MB  14.9GB  12.3GB  ext4         userdata
26      14.9GB  15.0GB  8389kB  ext4         persist
27      15.0GB  15.2GB  268MB   ext4         tombstones
28      15.2GB  15.3GB  25.2MB               recovery
29      15.3GB  15.3GB  3146kB               fsg

L-01E (Android 4.2)

C:\adb>adb shell
~ # ./parted /dev/block/mmcblk0 p
Model: MMC 016G92 (sd/mmc)
Disk /dev/block/mmcblk0: 15.8GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number  Start   End     Size    File system  Name        Flags
...
 7      83.9MB  109MB   25.2MB               boot
...
23      193MB   1787MB  1594MB  ext2         system
24      1787MB  2626MB  839MB   ext4         cache
25      2626MB  14.9GB  12.3GB  ext4         userdata
26      14.9GB  15.0GB  8389kB  ext4         persist
27      15.0GB  15.2GB  268MB   ext4         tombstones
28      15.2GB  15.3GB  25.2MB               recovery
...

どちらも同じだった。

fdiskでの再確認

~ # fdisk /dev/block/mmcblk0
Command (m for help): p
Disk /dev/block/mmcblk0: 30777344 sectors, 2740M
Logical sector size: 512
Disk identifier (GUID): 98101b32-bbe2-4bf2-a06e-2bb33d000c20
Partition table holds up to 40 entries
First usable sector is 34, last usable sector is 30777310

Number  Start (sector)    End (sector)  Size       Code  Name
   1           16384          147455       64.0M   0700  modem
   2          147456          148479        512K   0700  sbl1
   3          148480          149503        512K   0700  sbl2
   4          149504          153599       2048K   0700  sbl3
   5          153600          154623        512K   0700  aboot
   6          154624          155647        512K   0700  rpm
   7          163840          212991       24.0M   0700  boot
   8          212992          214015        512K   0700  tz
   9          214016          214017        1024   0700  pad
  10          214018          220161       3072K   0700  modemst1
  11          220162          226305       3072K   0700  modemst2
  12          229376          230935        780K   0700  m9kefs1
  13          230936          232495        780K   0700  m9kefs2
  14          232496          234055        780K   0700  m9kefs3
  15          245760          262143       8192K   0700  drm
  16          262144          278527       8192K   0700  sns
  17          278528          278543        8192   0700  ssd
  18          278544          311311       16.0M   0700  misc
  19          311312          344079       16.0M   0700  factory
  20          344080          360463       8192K   0700  bnr
  21          360464          361487        512K   0700  encrypt
  22          361488          362511        512K   0700  eksst
  23          376832         3489791       1520M   0700  system
  24         3489792         5128191        800M   0700  cache
  25         5128192        29196287       11.4G   0700  userdata
  26        29196288        29212671       8192K   0700  persist
  27        29212672        29736959        256M   0700  tombstones
  28        29736960        29786111       24.0M   0700  recovery
  29        29786112        29792255       3072K   0700  fsg
  30        29792256        29792271        8192   0700  DDR
  31        29802496        29868031       32.0M   0700  fota
  32        29868032        29933567       32.0M   0700  mpt
  33        29933568        29934591        512K   0700  tzbak

BoardConfig.mkは以下の設定が正解

BOARD_BOOTIMAGE_PARTITION_SIZE := 25165824 # 24M
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 25165824 # 24M
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1572864000 # 1500M

Android のCamera DeivceをDummy(Mock)のCameraにする

L01EのCameraのプロプライエタリが7.1までしか対応できなかったので 8.0以降のCameraを別なビデオドライバを入れて対応させようとする試みです。

新しいカメラとしてv4l2(Video for Linux)のloopbackを使います。

v4l2 loopback デバイスを入れると動画の入出力ができるようになるそうです。

以下のようなコマンドで実行するそうです(ループバックデバイスが /dev/video0の場合)

# ffmpeg -re -i foo.mp4 -f v4l2 /dev/video0

カーネルに組み込む

ソースは、以下を参考にしています。 https://github.com/UDOOboard/Kernel_Unico/blob/master/drivers/video/v4l2loopback.c

v4l2loopback.cをダウンロードし、drivers/video/の下に置きます。

KconfigとMakefileを修正する

drivers/video/Kconfig

config V4L2LOOPBACK
    tristate "V4l2Loopback module"
    depends on ARM
    default n
    ---help---
      V4l2Loopback Module.

drivers/video/Makefile

obj-$(CONFIG_V4L2LOOPBACK)  += v4l2loopback.o

v4l2loopback.cの一部を修正します。 ドライバモジュールの開始部分

int __init init_module(void)
{

これを以下に変更

static int __init v4l2loopback_init_module(void)
{

ドライバモジュールの終了部分

void __exit cleanup_module(void)
{

これを以下に変更

static void __exit v4l2loopback_cleanup_module(void)
{

スタートからロードするように最後に以下を入れます

module_init(v4l2loopback_init_module);
module_exit(v4l2loopback_cleanup_module);

defconfigに以下を追記してカーネルビルドします。

CONFIG_V4L2LOOPBACK=y

v4l2loopbackを入れる前

geehdc:/ # ls /dev/video*
/dev/video0 /dev/video1 /dev/video100 /dev/video2 /dev/video3

v4l2loopbackを入れた後

geehdc:/ # ls /dev/video*
/dev/video0 /dev/video1 /dev/video100 /dev/video2 /dev/video3 /dev/video4

/dev/video4がloopbackデバイスとして追加されたことが分かりました。

次は、Anroidのdeviceツリーに組み込みます。 以下を参考に組み込みます。 https://github.com/antmicro/android-camera-hal.git

L-01E(LGL21)のカーネル実装メモ

今までmako(Nexus4)か geehrc(E975)からgeehdc(L01E,LGL21)のカーネルを移植している

どこをどう変えたのが忘れるのでそのメモ

項目 mako(Nexus4) geehdc(L01E,LGL21)
液晶 LGIT WXGA HITACHI HD
CONFIG_FB_MSM_MIPI_LGIT_VIDEO_WXGA_PT_PANEL=y CONFIG_FB_MSM_MIPI_HITACHI_VIDEO_HD_PT_PANEL=y
CONFIG_FB_MSM_MIPI_LGIT_VIDEO_WXGA_PT=y CONFIG_FB_MSM_MIPI_HITACHI_VIDEO_HD_PT=y
CONFIG_FB_MSM_MIPI_DSI_LGIT=y CONFIG_CONFIG_FB_MSM_MIPI_DSI_HITACHI=y

・ソースの場所:drivers/video/msm

・HITACHIは、KConfig, Makefileに記載がないので自分で記述する

・ファイルは以下の3つ、おそらくバージョン3.4.0のファイルで3.4.113でも使える

mipi_hitachi.h
mipi_hitachi.c
mipi_hitachi_video_hd_pt.c
項目 mako(Nexus4) geehdc(L01E,LGL21)
液晶 LGIT WXGA HITACHI HD

カスタムROMソースの高速ダウンロード

すぐ忘れるので忘備録

・initにdepth=1をつける

・syncに-c(current_branch)を付ける

$ repo init --depth=1 -u https://github.com/JDCTeam/manifests.git -b opt-cm-18.1-rebase
$ repo sync -c -j$(nproc --all) --force-sync --no-clone-bundle --no-tags

オリジナルのboot.imgを弄ってAndroid11のSC04E用のboot.imgを作る

lineage-18.1(Android 11)からboot.imgの仕様が変わっているらしい。

従来boot.imgにはヘッダーの箇所にはANDORID!の文字列、マジックと呼ばれるものから

カーネルramdiskなどのアドレスなど最小限のものしか入っていなかったが、

11からバージョンやセキュリティの日付が入るようになったらしい。

https://source.android.com/docs/core/architecture/bootloader/boot-image-header?hl=ja

boot.imgのヘッダーはバージョンが0,1,2,3,4と変更されてつづけており、 とうとう11では従来のboot.imgの加工ツールが使えなくなっている。

boot.imgのヘッダーバージョン

・バージョン0:Android 8以前

・バージョン1:Android 9

・バージョン2:Android 10

・バージョン3:Android 11

バージョン2まではヘッダーはサイズが拡張されて続けており、 内容の羅列も同じなので強引に従来のboot.imgの加工ツールが使える

しかし11以降は、新ツールで再作成が必要になってくる

新ツールのダウンロード

$ git clone -b lineage-18.1 https://github.com/LineageOS/android_system_tools_mkbootimg.git
$ git clone https://github.com/osm0sis/bootimg-info.git

カーネルのビルド

$ cd jf
$ make VARIANT_DEFCONFIG=jf_dcm_defconfig lineageos_jf_defconfig
$ make -j4 

カーネルのロードモジュールのインストール

$ mkdir ../modules
$ export INSTALL_MOD_PATH=$PWD/../modules
$ make modules_install
$ cd ../modules
$ find . -name '*.ko'             -exec mv {} . \;
$ find . -name 'modules.alias'    -exec mv {} . \;
$ find . -name 'modules.dep'      -exec mv {} . \;
$ find . -name 'modules.softdep'  -exec mv {} . \;
$ rm -rf lib
$ tar cfv ../modules.tar *.ko modules.* 
$ cd ..

差し替えるboot.imgの情報取得

$ ~/bootimg-info/bootimg-info boot.img
 Android Boot Image Info Utility
 Printing information for "boot.img"
 Header:
  magic                           : ANDROID!
  kernel_size                     : 4384264     (0042e608)
  kernel_addr                     : 0x80208000

  ramdisk_size                    : 665444      (000a2764)
  ramdisk_addr                    : 0x82200000
  second_size                     : 0           (00000000)
  second_addr                     : 0x00000000

  tags_addr                       : 0x80200100
  page_size                       : 2048        (00000800)
  header_version                  : 0           (00000000)
  os_version                      : 11.0.0      (1600016a)
  (os_patch_level)                : 2022-10

  name                            :

  cmdline                         : androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3 androidboot.bootdevice=msm_sdcc.1 buildvariant=userdebug
  id                              : 33e2e7d6de691762a64017cc3c48b1c0208e2fc1000000000000000000000000

  extra_cmdline                   :

 Other:
  magic offset                    : 0x00000000
  base address                    : 0x80200000

  kernel offset                   : 0x00008000
  ramdisk offset                  : 0x02000000
  second offset                   : 0x7fe00000
  tags offset                     : 0x00000100

jfltexxのboot.imgのバージョンは0らしい。Android8と同じ。

boot.imgの展開
$ mkdir boot 
$ cd android_system_tools_mkbootimg
$ ./unpack_bootimg.py --boot_img ../boot.img --out ../boot
boot_magic: ANDROID!
kernel_size: 4384264
kernel load address: 0x80208000
ramdisk size: 665444
ramdisk load address: 0x82200000
second bootloader size: 0
second bootloader load address: 0x0
kernel tags load address: 0x80200100
page size: 2048
os version: 11.0.0
os patch level: 2022-10
boot image header version: 0
product name:
command line args: androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3 androidboot.bootdevice=msm_sdcc.1 buildvariant=userdebug
additional command line args:
$ cd ..

boot配下にkernelとramdiskファイルが生成される

差し替え

$ cp jf/arch/arm/boot/zImage boot/kernel

再作成

$ cd android_system_tools_mkbootimg
$ chmod +x mkbootimg.py
$ ./mkbootimg.py \
 --kernel ../boot/kernel \
 --ramdisk ../boot/ramdisk \
 --cmdline 'androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3 androidboot.bootdevice=msm_sdcc.1 buildvariant=userdebug' \
 --base  0x80200000 \
 --ramdisk_offset 0x02000000 \
 --os_version '11.0.0' \
 --os_patch_level '2022-10' \
 -o ../boot.img.new

出来たboot.img.newをboot.imgにして元のzipに入れるだけである。

Galaxy S4(SC-04E)用のcrDroid 8.0、カスタムROMを作った時の忘備録メモ2

メモ) powerモジュールを自作したらPermission deniedのエラーが出る

ベースは、hardware/samsung/power から改変 makoのpower, sc03eのpower を参考に修正した。

出来たがlogcatで権限が足りないエラーが出ている

 E SamsungPowerHAL: Error opening /sys/devices/system/cpu/cpufreq/interactive/boost: Permission denied
 E SamsungPowerHAL: Error opening /sys/devices/system/cpu/cpufreq/interactive/boostpulse: Permission denied
 E SamsungPowerHAL: Error opening /sys/devices/system/cpu/cpufreq/interactive/io_is_busy: Permission denied

ルートではアクセスできる、値も入っている。 init.qcom.power.rcでオーナーの変更が適しているだろうけど、面倒なのでchmodで終わらせる。 以下を追加

rootdir/etc/init.qcom.power.rc

    # power.msm8960 access
    chmod 666 /sys/devices/system/cpu/cpufreq/interactive/boost
    chmod 666 /sys/devices/system/cpu/cpufreq/interactive/boostpulse
    chmod 666 /sys/devices/system/cpu/cpufreq/interactive/io_is_busy
    chmod 666 /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq

メモ)GPSを呼び出すアプリを動かすと落ちる

 E AndroidRuntime: Process: com.ppillai.gpsnmea, PID: 21118
 E AndroidRuntime: java.lang.RuntimeException: Unable to resume activity {com.ppillai.gpsnmea/com.ppillai.gpsnmea.GpsNmeaActivity}: java.lang.IllegalArgumentException: provider doesn't exist: gps
 E AndroidRuntime:        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3666)
 E AndroidRuntime:        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3706)
 E AndroidRuntime:        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2919)

device.mkにGPSの記述が抜けている。追加する。

# GPS
PRODUCT_PACKAGES += \
    android.hardware.gnss@1.0-impl \
    android.hardware.gnss@1.0-service \
    gps.msm8960 \
    libloc_eng \
    libloc_core \
    libgps.utils

メモ)GPSモジュールを含めてビルドすると以下のエラーになる。

hardware/libhardware/include/hardware/gnss-base.h:17:5: error: expected identifier
    GNSS_CONSTELLATION_UNKNOWN = 0,
hardware/libhardware/include/hardware/gnss-base.h:18:5: error: expected identifier
    GNSS_CONSTELLATION_GPS = 1,
hardware/libhardware/include/hardware/gnss-base.h:19:5: error: expected identifier
    GNSS_CONSTELLATION_SBAS = 2,
..

hardware/libhardware/include/hardware/gps.hをみるとgnss-base.hを含む記述があり、device/samsung/jf-common/include/hardware/gps.hをみるとその記述が入っていない

7.1まではgps.hだけだったが、8.xからgps.hとgnss-base.hになった。

#include <hardware/hardware.h>
#include "gnss-base.h"
__BEGIN_DECLS

gps.hにgnss-base.hのincludeの記述を追加して、gnss-base.hをローカルのincludeへコピーする

$ cp hardware/libhardware/include/hardware/gnss-base.h device/samsung/jf-common/include/hardware/

BoardConfig.mkに以下をセットしないとgps.msm8960.soが生成されない。 (hardware/qcom/gps/Android.mk,hardware/qcom/gps/msm8960配下のAndroid.mkを参照)

# GPS
BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE := $(TARGET_BOARD_PLATFORM)
BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET := true
TARGET_NO_RPC := true
#USE_DEVICE_SPECIFIC_GPS := true

メモ)アプリ「レコーダ」が動作しない。録音ボタンを押すと落ちる

 D AndroidRuntime: Shutting down VM
 E AndroidRuntime: FATAL EXCEPTION: main
 E AndroidRuntime: Process: org.lineageos.recorder, PID: 4397
 E AndroidRuntime: java.lang.IllegalArgumentException: The key must be an application-specific resource id.
 E AndroidRuntime:        at android.view.View.setTag(View.java:21742)
 E AndroidRuntime:        at android.support.transition.Scene.setCurrentScene(Scene.java:195)
 E AndroidRuntime:        at android.support.transition.TransitionManager.beginDelayedTransition(TransitionManager.java:407)
 E AndroidRuntime:        at android.support.transition.TransitionManager.beginDelayedTransition(TransitionManager.java:368)
 E AndroidRuntime:        at org.lineageos.recorder.RecorderActivity.refresh(RecorderActivity.java:330)

落ちている箇所

packages/app/src/main/java/org/lineageos/recorder/RecorderActivity.java(300)

    updateSystemUIColors();
    TransitionManager.beginDelayedTransition(mConstraintRoot);
    set.applyTo(mConstraintRoot);

frameworks/support/transition/src/android/support/transition/TransitionManager.java

    public static void beginDelayedTransition(@NonNull final ViewGroup sceneRoot,
            @Nullable Transition transition) {
        if (!sPendingTransitions.contains(sceneRoot) && ViewCompat.isLaidOut(sceneRoot)) {
            if (Transition.DBG) {
                Log.d(LOG_TAG, "beginDelayedTransition: root, transition = "
                        + sceneRoot + ", " + transition);
            }
            sPendingTransitions.add(sceneRoot);
            if (transition == null) {
                transition = sDefaultTransition;
            }
            final Transition transitionClone = transition.clone();
            sceneChangeSetup(sceneRoot, transitionClone);
            Scene.setCurrentScene(sceneRoot, null);
            sceneChangeRunTransition(sceneRoot, transitionClone);
        }
    }

frameworks/support/transition/src/android/support/transition/Scene.java

    static void setCurrentScene(View view, Scene scene) {
        view.setTag(R.id.transition_current_scene, scene);
    }

R.id.transition_current_sceneが無いのかと思ったがあった。

$ cat frameworks/support/transition/res/values/ids.xml

<resources>
    <item name="transition_scene_layoutid_cache" type="id"/>
    <item name="transition_current_scene" type="id"/>

アプリのソースが他とちがうのか確認。同じだった。

$ git clone -b lineage-15.1 --single-branch https://github.com/LineageOS/android_packages_apps_Recorder.git
$ diff -u -r  ~/crdroid-8.0/packages/apps/Recorder ~/temp/android_packages_apps_Recorder

frameworksのsupportを比較するが、差がほとんどない。原因がわからないので、Recorderはビルドから外そう

$ git clone -b lineage-15.1 --single-branch https://github.com/LineageOS/android_frameworks_support.git

$ diff -u -r  ~/crdroid-8.0/frameworks/support/transition ~/temp/android_frameworks_support/transition

メモ)frameworks/supportのdiffで気づいた点を直す

testコードでは差があるが、testコードなので無視し、メインで関係するところを修正

--- /home/labo/crdroid-8.0/frameworks/support/transition/api14/android/support/transition/GhostViewApi14.java   2022-10-21 17:26:12.699904900 +0900
+++ /home/labo/temp/android_frameworks_support/transition/api14/android/support/transition/GhostViewApi14.java  2022-10-31 12:00:31.397353400 +0900
@@ -150,8 +150,8 @@
         final int[] viewLocation = new int[2];
         getLocationOnScreen(location);
         mView.getLocationOnScreen(viewLocation);
-        viewLocation[0] -= mView.getTranslationX();
-        viewLocation[1] -= mView.getTranslationY();
+        viewLocation[0] = (int) (viewLocation[0] - mView.getTranslationX());
+        viewLocation[1] = (int) (viewLocation[1] - mView.getTranslationY());
         mDeltaX = viewLocation[0] - location[0];
         mDeltaY = viewLocation[1] - location[1];
         // Monitor invalidation of the target view.

メモ)Recorderアプリをビルド対象から外す

vendor/lineage/config/common_full.mk

# Inherit common Lineage stuff
$(call inherit-product, vendor/lineage/config/common.mk)

PRODUCT_SIZE := full

-# Recorder
-PRODUCT_PACKAGES += \
-    Recorder

メモ)カーネルを8.0に変更する

$ git clone -b lineage-15.0 --single-branch https://github.com/LineageOS/android_kernel_samsung_jf.git

binderを32ビットに変更する

BoardConfig.mkを修正する

#TARGET_USES_64_BIT_BINDER := true

起動に失敗するので8.1のカーネルを使って、defconfigは8.0用にして使う

主な違いは

CONFIG_NET_NS=y

CONFIG_DEFAULT_TCP_CONG="cubic"

CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDER_IPC_32BIT=y
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"

かな。出来たけど、イマイチ遅いので公開はしない。