Jump to content

Tuning sysfs: Difference between revisions

From postmarketOS Wiki
K-laus (talk | contribs)
add OR-example
Lazcode (talk | contribs)
Formatting and adding clarification
Line 5: Line 5:
sysfs is a pseudo file system provided by the Linux kernel that exports information about various kernel subsystems, hardware devices, and associated device drivers from the kernel's device model to user space through virtual files. In addition to providing information about various devices and kernel subsystems, exported virtual files are also used for their configuring.
sysfs is a pseudo file system provided by the Linux kernel that exports information about various kernel subsystems, hardware devices, and associated device drivers from the kernel's device model to user space through virtual files. In addition to providing information about various devices and kernel subsystems, exported virtual files are also used for their configuring.


==diff method==
One approach is comparing the contents of these files when TWRP or LineageOS is running and the same for pmOS.
One approach is comparing the contents of these files when TWRP or LineageOS is running and the same for pmOS.


Line 53: Line 54:
You could also run it in even in the stock ROM but it is important that you run the same kernel version in postmarketOS then.
You could also run it in even in the stock ROM but it is important that you run the same kernel version in postmarketOS then.


'''Note:''' On some devices (like Xperia Z) this script will hang on <code>vsync_event</code> files. To continue the script to the next file we just kill the process that processes the <code>vsync_event</code> file:
====Script hanging====
On some devices (like Xperia Z) this script will hang on <code>vsync_event</code> files. To continue the script to the next file we just kill the process that processes the <code>vsync_event</code> file:


<pre class="shell">ps w | grep vsync_event # To find process id of the cat command that was processing vsync_event
<pre class="shell">ps w | grep vsync_event # To find process id of the cat command that was processing vsync_event
kill -SIGTERM <pid> # Kill the process</pre>
kill -SIGTERM <pid> # Kill the process</pre>


'''Note:''' On some devices (like Xperia Z1) this script can reboot the device when executed in TWRP. To fix this, you need to find out which file is causing the reboot and skip it. You can find the file by running the script without output redirection (it should be the last line printed before the reboot - see example below).
====Script reboots system====
On some devices (like Xperia Z1) this script can reboot the device when executed in TWRP. To fix this, you need to find out which file is causing the reboot and skip it. You can find the file by running the script without output redirection (it should be the last line printed before the reboot - see example below).
<pre class="shell">$ adb shell "sh /dumpsys.sh"
<pre class="shell">$ adb shell "sh /dumpsys.sh"
/sys/devices/0.qcom,msm-cpufreq/modalias
/sys/devices/0.qcom,msm-cpufreq/modalias
Line 91: Line 94:
fi</pre>
fi</pre>


==Applying tuning==
To make changes to the device, create "initfs-hook.sh" in the device folder, add "initfs-hook.sh" to the source list, and add the following under package()
<pre class="shell">
install -Dm644 "$srcdir"/initfs-hook.sh \
"$pkgdir"/etc/postmarketos-mkinitfs/hooks/00-${pkgname}.sh
</pre>
The initfs-hook.sh runs commands before booting.  Look at the examples section to see how the file should be used.


== Examples ==
== Examples ==

Revision as of 03:39, 18 November 2018

Note Permission denied errors while running the script are expected and can be ignored

After porting postmarketOS to your device, you might find that still some features don't work. You may need to adjust some values inside the /sys directory.

sysfs is a pseudo file system provided by the Linux kernel that exports information about various kernel subsystems, hardware devices, and associated device drivers from the kernel's device model to user space through virtual files. In addition to providing information about various devices and kernel subsystems, exported virtual files are also used for their configuring.

diff method

One approach is comparing the contents of these files when TWRP or LineageOS is running and the same for pmOS.

The following script dumps the content of /sys/devices. Copy it as dumpsys.sh

#!/bin/sh
# dumpsys.sh
DIR="/sys/devices"

walk() {
    for file in $(ls $1); do
        path="$1/$file"
        if test -L "$path"; then
            continue
        fi
        if test -f "$path"; then
            echo "$path"
            cat "$path"
        fi
        if test -d "$path"; then
            walk "$path"
        fi
    done
}

others() {
    cat /proc/cpuinfo
    cat /proc/cmdline
}

walk "$DIR"
others

Upload it to your device when running TWRP (use adb push) and when running postmarketOS (use scp). Run it and then compare the output.

For TWRP/LineageOS:

adb push dumpsys.sh /
adb shell "sh /dumpsys.sh > /devices-twrp.dump"
adb pull /devices-twrp.dump .

For pmOS:

scp dumpsys.sh user@172.16.42.1:~
# sh dumpsys.sh > devices-pmos.dump
scp user@172.16.42.1:~/devices-pmos.dump .

Then get the differences (example):

diff -u devices-pmos.dump devices-twrp.dump > devices.diff

You could also run it in even in the stock ROM but it is important that you run the same kernel version in postmarketOS then.

Script hanging

On some devices (like Xperia Z) this script will hang on vsync_event files. To continue the script to the next file we just kill the process that processes the vsync_event file:

ps w | grep vsync_event # To find process id of the cat command that was processing vsync_event
kill -SIGTERM <pid> # Kill the process

Script reboots system

On some devices (like Xperia Z1) this script can reboot the device when executed in TWRP. To fix this, you need to find out which file is causing the reboot and skip it. You can find the file by running the script without output redirection (it should be the last line printed before the reboot - see example below).

$ adb shell "sh /dumpsys.sh"
/sys/devices/0.qcom,msm-cpufreq/modalias
platform:0.qcom,msm-cpufreq
...
/sys/devices/mdss_dsi_panel/interval_array         -----> THE FILE THAT CAUSES A REBOOT
------> THE DEVICE REBOOTS

Now that you found the file, you can exclude it by updating the script. Change this part:

if test -f "$path"; then
     echo "$path"
     cat "$path"
fi

To this:

if test -f "$path"; then
    if [ "$path" = "/sys/devices/mdss_dsi_panel/interval_array" ]
    then
        continue
    fi
    echo "$path"
    cat "$path"
fi

If there are two or more entries to skip, combine them with a logical OR (||) like this:

if test -f "$path"; then
    if [ "$path" = "/sys/devices/mdss_dsi_panel/interval_array" ] ||
       [ "$path" = "/sys/devices/iio:device0/self_test_run" ] ||
       [ "$path" = "/sys/devices/iio:device1/self_test_run" ]
    then
        continue
    fi
    echo "$path"
    cat "$path"
fi

Applying tuning

To make changes to the device, create "initfs-hook.sh" in the device folder, add "initfs-hook.sh" to the source list, and add the following under package()

	install -Dm644 "$srcdir"/initfs-hook.sh \
		"$pkgdir"/etc/postmarketos-mkinitfs/hooks/00-${pkgname}.sh

The initfs-hook.sh runs commands before booting. Look at the examples section to see how the file should be used.

Examples

i9070 port

This way, user drebrez figured out two values needed for the framebuffer configuration for the i9070 port.

echo 16 > /sys/devices/platform/mcde_fb/graphics/fb0/bits_per_pixel
echo 960,1600 > /sys/devices/platform/mcde_fb/graphics/fb0/virtual_size