ZUCCHINI LINUX PROJECT // SYSTEMS MONOGRAPH
PREPRINT DRAFT // NOVEMBER 2026
▍Systems preprint
DOC. REF: SYS-2026-11 // HARDWARE MONOGRAPH

Dual-Booting Mainline Linux and Android on a Vendor-Locked Qualcomm Tablet

A Second-Stage Bootloader Bring-Up of the Samsung Galaxy Tab A 8.0 (SM-T295)

AUTHOR: BIDYA BHUSHAN NANDA
10 November 2026Bidya Bhushan Nanda16 min
ABSTRACT NOTE“Consumer tablets routinely outlive their vendor's software support.”
#MOBILE LINUX#QUALCOMM SDM429#LK2ND#SAMSUNG S-BOOT#DEVICE TREE#DUAL BOOT

Abstract

Consumer tablets routinely outlive their vendor's software support. This paper describes Zucchini Linux, a bring-up of a near-mainline Linux 7.1.3 kernel with an Arch Linux ARM64 userland, alongside LineageOS 21, on the Samsung Galaxy Tab A 8.0 LTE (SM-T295, Qualcomm SDM429). The two systems are selected from a boot menu at power-on.

We contribute:

  1. A second-stage bootloader injection scheme in which lk2nd is wrapped in a boot image that Samsung's S-Boot accepts, avoiding vendor device-tree overlay merging through an exact PMIC selector match while the factory bootloader stays unmodified (Section 4).
  2. A non-destructive storage mapping that places an Arch root filesystem on the userdata partition, reuses Android partitions as swap and scratch space, and hands off to LineageOS through a warm reset with a Qualcomm reset cookie (Section 4).
  3. Peripheral enablement work: a device tree for the SDM429's four-core topology, a DRM driver for the JD9367 (TXD) panel, a rotated 24-bpp shadow blitter for Xorg fbdev, and a PMIC power-off fix by direct SPMI programming (Section 5).
  4. A development record: dated photographs of successes and failures, and preliminary measurements with their caveats (Sections 6-8).

Preliminary single-device measurements show 199 MiB of memory in use at idle against 1,380 MiB on stock Android 11, a cold boot to desktop in 11.2 s against 34.6 s, and 620 mW desktop-idle draw. We include photographs taken during development and state the limits plainly: the photographed desktop session uses software rendering, the Android side runs with SELinux permissive, and the Knox warranty flag is tripped.

Keywords: mobile Linux · Qualcomm SDM429 · lk2nd · device tree · Samsung S-Boot · dual boot · embedded systems · hardware longevity


1. Introduction

Tablet hardware tends to outlast its software. The Samsung Galaxy Tab A 8.0 (2019) LTE (SM-T295, codename gto) pairs a Qualcomm Snapdragon 429 with 2 GB of LPDDR3 and 32 GB of eMMC storage. It shipped with Android 9 and its last official firmware is Android 11 (T295XXS6CWG2). Under that firmware, idle memory in use is about 1.4 GB of the 1.77 GiB available (Section 7), which makes the device sluggish for ordinary use even though its Cortex-A53 cores remain adequate for a light desktop.

Running a near-mainline Linux kernel on such a device is attractive but runs into four obstacles:

  1. Bootloader Validation & DTBO Merging: Samsung's primary bootloader (S-Boot) validates boot-image structure and verified-boot footers and attempts to merge vendor device-tree overlays into the kernel it loads.
  2. Asymmetric CPU Topology: The SDM429 exposes only four Cortex-A53 cores, while the base platform description assumes eight.
  3. Display Panel Ambiguity: The display panel cannot be inferred reliably from the chassis stamping alone.
  4. Permanent Brick Risks: Any approach that overwrites the factory bootloader risks a device that cannot be reflashed.

This paper makes the following contributions:

  1. A bootloader injection scheme that runs lk2nd as a second stage from the boot slot, bypassing vendor overlay merging by matching the board's PMIC selector, with the factory aboot never written (Section 4).
  2. A non-destructive storage layout and a warm-reset handoff that lets the same menu start either Arch Linux ARM or LineageOS 21 (Section 4).
  3. Peripheral enablement for display, touch, power-off, USB gadget and connectivity, with the debugging method used to find each fault (Section 5).
  4. A development record: dated photographs of successes and failures, and preliminary measurements with their caveats (Sections 6-8).

The two operating systems run one at a time; the boot menu selects which. We call this dual boot, not concurrent operation.


2. Background and Related Work

2.1 Android-hybrid and mainline approaches

Projects such as Ubuntu Touch and Sailfish OS use Halium or libhybris to run a GNU/Linux userland over the vendor's Android kernel, often a 3.18 or 4.9 branch. This retains proprietary GPU and camera stacks but ties the device to a vendor kernel fork that receives few updates. Mainline-focused projects such as postmarketOS instead target upstream kernels and open drivers, mostly on popular reference phones [1]. We are not aware of a public mainline bring-up for the SM-T295 or for Samsung's SDM429 LTE tablets.

2.2 lk2nd

lk2nd is an open-source second-stage bootloader derived from Little Kernel. It is loaded by the vendor bootloader as if it were a boot image, brings up a standard fastboot interface, and boots conventional Android boot images [2]. It supports a range of Qualcomm devices. Applying it here required accommodating S-Boot's overlay engine, signature trailer, and verified-boot structure (Section 4).

2.3 Samsung S-Boot

S-Boot hosts Samsung's Download Mode (the Odin protocol, also implemented by Heimdall), enforces image structure checks, and records a Knox warranty flag when non-Samsung software is loaded. Its on-screen failure messages, such as SECURE CHECK FAIL : boot.img, are the main feedback channel in early bring-up (Figure 5).


3. Design Constraints and Recovery Policy

Because the tablet has no exposed serial header, early iterations are blind, and a bricked device would end the project. We therefore fix a recovery policy before any code runs. Let W be the set of partitions the project writes. The policy is:

aboot ∉ W,   W ⊆ {boot, recovery, vbmeta, userdata, system, vendor, product, cache}     (1)

S-Boot lives in aboot (p16) and hosts Download Mode. Leaving it intact means a bad kernel or root filesystem can be undone by reflashing stock images from Download Mode. The ladder of recovery options is summarized in Table 1. The policy does not protect against every failure, such as eMMC damage, and Level 4 assumes the boot ROM remains reachable.

TABLE 1[ DATA MATRIX ]
Recovery ladder and intervention levels
LevelActionCondition & Interface
Level 1Hardware forced resetPhysical key combination (Power + Vol Down for 7 seconds)
Level 2Restore stock boot and vbmetaFlashed through Samsung Download Mode via Heimdall
Level 3Full stock firmware restoreComplete multi-file firmware package restore using Odin or Heimdall
Level 4Qualcomm EDL (Emergency Download)EDL 9008 mode over USB using Qualcomm Sahara / Firehose protocol

* Policy verified: factory aboot (p16) was never modified or flashed.

The bootloader was unlocked before the work began (Download Mode reports OEM LOCK: OFF (U), Figure 5d). The Knox warranty flag reads 0x1 in the menu's telemetry panel (Figure 3c), and we treat the warranty as void.


4. System Architecture

4.1 Boot chain

Figure 1 shows the pipeline. Qualcomm firmware and S-Boot are untouched. S-Boot loads the image in the boot slot (p58), which contains lk2nd followed by a Stage-2 Linux image. lk2nd draws the boot menu, reads the hardware keys (Vol Up on TLMM 91, Vol Down and Power on the PMIC PON block) and either continues into Linux or triggers the LineageOS path.

EXHIBIT // FIGURE 1[ ARCHITECTURAL FLOWCHART ]
System Boot Pipeline & Execution Handoff

Boot pipeline. Red/tomato: never written. Yellow: lk2nd. Mint and cream: the two operating systems.

Qualcomm PBL → SBL1 → TrustZone / RPM
Silicon and vendor firmware (unmodified)
↓
Samsung S-Boot (aboot, p16): NEVER WRITTENFACTORY UNTOUCHED

Download Mode host; reads boot slot p58; exact PMIC selector match (0x10016 0x25 0 0) ⇒ dtbo_needed = false (vendor DTBO skipped).

↓
lk2nd (boot slot, p58; AOSP header v0, ARM32)SECOND STAGE

Menu on JD9367 panel; Vol Up (TLMM 91), Vol Down & Power (PMIC PON); Fastboot, EDL, Recovery, OS Selection.

↙ (Option A)(Option B) ↘
LINUX 7.1.3 (ARCH ARM64)
  • Image.gz + sdm429-samsung-gto.dtb
  • initramfs mounts p69 (arch_root)
  • switch_root → Arch Linux ARM
  • XFCE 4.20 Desktop (llvmpipe)
LINEAGEOS 21 (ANDROID 14)
  • Writes cookie 0x77665502 to IMEM
  • Issues warm reset via PMIC
  • S-Boot cold-boots recovery slot (p57)
  • Android 14 userland boots cleanly

4.2 The PMIC selector

When S-Boot loads a boot image it checks whether the device tree already matches the board. If it does, it skips the vendor dtbo partition (p26); otherwise it overlays Samsung's vendor nodes onto the tree, which corrupts phandles on a mainline kernel. We extracted the selector values from the stock device tree and encoded them in the root node of lk2nd's own tree:

/* lk2nd device-tree matching node for Samsung Galaxy Tab A 8.0 (SM-T295) */
qcom,msm-id = <0x162 0>;            /* SDM429 */
qcom,board-id = <0x08 0>;           /* MTP */
qcom,pmic-id = <0x10016 0x25 0 0>;  /* PM8953 + PMI632 */

With an exact match, S-Boot sets dtbo_needed = false and no vendor overlay is applied.

4.3 Boot image layout

S-Boot also checks image structure. The accepted layout is shown in Figure 2. An early standalone image failed with SECURE CHECK FAIL : boot.img (Figure 5a) because the assembly script zeroed the padding between the signature header and the 512 KiB boundary. Binary comparison against the last working image showed an internal AVB hash descriptor at byte offset 356,352 (0x57000) inside that range. Preserving the whole 0-512 KiB prefix of the working lk2nd image and placing the Stage-2 kernel at 512 KiB removed the failure.

EXHIBIT // FIGURE 2[ BINARY IMAGE MAP ]
64 MiB Boot-Slot Layout (Partition p58)

Layout of the 64 MiB boot-slot image. The internal descriptor at 0x57000 is the one an early build zeroed.

0x000000lk2nd.img: AOSP boot header v0, ARM32 payload
• SEANDROIDENFORCE trailer (16 B)
• SignerVer02 structural header (512 B)
0x057000 (356,352 B)INTERNAL AVB HASH DESCRIPTOR (CRITICAL)

Must be preserved verbatim. Early assembly scripts zeroed the 0-512 KiB padding, causing S-Boot to abort with SECURE CHECK FAIL : boot.img.

Zero padding up to the 512 KiB boundary (0x080000)
0x080000 (512 KiB)STAGE-2 LINUX IMAGE (AOSP header v2, 64-bit)
Contains mainline Linux 7.1.3 Image.gz + SDM429 device tree blob + initramfs.
Unused partition storage (~62.5 MiB)
64 MiB - 64 BAVB v1.0 FOOTER (“AVBf”)

Partition size: 67,108,864 bytes. S-Boot inspects footer structure; constructed with null algorithm to satisfy parser without Samsung keys.

4.4 Storage

The eMMC (QD63MB, 29.1 GiB) carries 69 partitions from Samsung's PIT. Table 2 lists the roles. In the primary configuration (Method A) /dev/mmcblk0p69 is formatted ext4 with label arch_root and holds the Arch Linux ARM64 root; the same UUID, 764013fc-a45a-4012-95b6-e916e02951df, appears in the boot log of Figure 6b. Method B leaves stock userdata intact: the initramfs mounts p69 and bind-mounts a subdirectory as the new root. Repurposed Android partitions provide 1,072 MiB of swap and 448 MiB of scratch space.

TABLE 2[ DATA MATRIX ]
Partition roles and reallocation on 29.1 GiB eMMC
PartitionStock RoleZucchini Linux RoleFilesystem / Capacity
p1-15Qualcomm firmwareUntouchedProprietary modem, tz, rpm blobs
p16aboot (S-Boot)Never writtenSamsung factory primary bootloader
p17vbmetaPatchedAVB v1.0 null verification hash
p26dtboBypassedSkipped via PMIC selector match
p57recoveryLineageOS boot imageBootable Android 14 kernel & ramdisk
p58bootlk2nd + Linux kernel64 MiB dual-stage boot image
p62systemLinux data / stagingRaw block staging partition
p63 / p65vendor / cacheLinux Swap760 MiB + 312 MiB = 1,072 MiB swap
p64productScratch space448 MiB scratch volume
p67modemFirmwareQualcomm modem runtime firmware
p69userdataArch rootfsext4 (arch_root, 24.2 GiB available)

* Partition geometry extracted directly from Samsung PIT on SM-T295.

4.5 Boot menu and the LineageOS handoff

The menu (Figure 3) lists EDL, Linux, Reboot, Lineage, Shutdown, Recovery (TWRP) and Fastboot, with a hardware telemetry panel below. Jumping from lk2nd straight into the Android kernel left the display in a half-initialized state, because lk2nd has already programmed the MIPI DSI controller while the downstream kernel expects a cold start.

The fix is a warm reset: the menu calls reboot_device(RECOVERY_MODE), which writes the cookie 0x77665502 to shared IMEM (0x0860065c) and resets the PMIC. S-Boot reads the cookie and cold-boots the recovery slot (p57), which holds the LineageOS boot image.

EXHIBIT // FIGURE 3[ HARDWARE RECORD PHOTOGRAPHS ]
Evolution of the lk2nd Boot Menu on the Device

Dated photographs showing the progress from initial fastboot bring-up to the fully styled dual-boot menu with hardware telemetry.

Photograph of tablet screen showing initial lk2nd fastboot menu
(a) 18 OCT

First lk2nd fastboot menu. Panel identity and bootloader fields populated.

Photograph of tablet screen showing boot menu with Linux and LineageOS choices
(b) 25 OCT

Menu with Linux and Lineage entries hooked to hardware volume keys.

Photograph of final lk2nd menu with green telemetry panel and system specs
(c) 09 NOV

Final dual-boot menu with telemetry panel (Knox 0x1, SELinux permissive).

NOTE

The kernel and battery lines in (c) are static status indicators and do not reflect the running build.


5. Hardware Bring-Up

5.1 Debugging without a serial port

Early boots produced no display, no USB and no LED activity. Two mechanisms recovered information:

  1. Early Kernel Console: Directed to BLSP1 UART2 at 0x78B0000 via command line arguments:
    earlycon=msm_serial_dm,0x78B0000 console=ttyMSM0,115200n8
    
  2. Persistent Ramoops Buffer: A 1 MiB ramoops region at 0x92100000 (passed with lk2nd.pass-ramoops) preserved the kernel dmesg log across warm reboots. After a crash or warm reset, the log was extracted directly from /sys/fs/pstore/console-ramoops-0 upon returning to lk2nd.

5.2 CPU topology

The SDM429 exposes four Cortex-A53 cores at MPIDR affinities 0x100-0x103, while the inherited platform tree describes eight. The kernel tried to start the missing cores through PSCI and received error code -22, and cpuidle-psci refused to register idle states while any listed CPU lacked them. The device tree deletes the absent cores and rebuilds the CPU map:

/* Rebuilt CPU topology for Snapdragon 429 4-core cluster */
/delete-node/ &cpu0;
/delete-node/ &cpu1;
/delete-node/ &cpu2;
/delete-node/ &cpu3;

cpu-map {
    cluster0 {
        core0 { cpu = <&cpu4>; };
        core1 { cpu = <&cpu5>; };
        core2 { cpu = <&cpu6>; };
        core3 { cpu = <&cpu7>; };
    };
};

5.3 Display

Panel identity. The chassis stamping (LD200709DA5) suggested a Lead Display ILI9881C panel, but a driver for that controller produced DSI timeouts (-110). When lk2nd first booted on 18 October, fastboot getvar all returned:

lk2nd:panel:qcom,mdss_dsi_jd9367_wxga_video_txd

also visible on the menu in Figure 3a. The panel is a Jadechem JD9367 in Tongxingda packaging, evidently a second-source part. A DRM panel driver with the correct DSI sequence (4-lane video mode, PM8953 rails L23 at 0.8 V and L6 at 1.8 V) was written, and a SimpleFB linear framebuffer provides the console.

Rotation. The panel is an 800×1280 portrait array; the desktop runs at 1280×800. Upstream xf86-video-fbdev disables rotation on 24-bpp framebuffers because pixels are not 4-byte aligned (stride 2,400 bytes). A patched shadow blitter, fbdevUpdateRotate32to24, renders into a 32-bpp landscape buffer and copies damaged rectangles into the 24-bpp portrait framebuffer using:

x_p = y_l,   y_p = 799 − x_l,   addr = 2400 · y_p + 3 · x_p     (2)

with byte order B, G, R for this controller. The touch transformation matrix is:

Touch Matrix = [ 0, 1, 0,   -1, 0, 1,   0, 0, 1 ]

5.4 USB gadget and power-off

USB. The gadget controller deferred forever on a vbus regulator (-EPROBE_DEFER). The inherited tree referenced a phantom handle (vbus-supply = <0x6f>) although VBUS detection on this board goes through the PMI632 via extcon. Removing the handle and binding to &pmi632_uusb let the ChipIdea controller probe and the CDC ACM (serial) and NCM (Ethernet) functions appear.

Power-off. poweroff rebooted the tablet. S-Boot leaves the PMIC's PS_HOLD_RST_CTL register (SPMI 0x085a) at 0x01 (warm reset), so dropping PS_HOLD restarts the SoC. Because the kernel lacked debugfs register writes, a root-only userspace daemon maps the SPMI write channel for APID 37 through /dev/mem at:

0x02400000 + 0x128000 = 0x02528000     (3)

and writes 0x84 (shutdown, enable) to 0x085a before PS_HOLD is released. This produced the first full hardware power-off under Linux on this device. The boot log in Figure 6b also shows services that unbind a legacy msm-restart driver and bind a PS_HOLD driver for reboot, indicating the mechanism has evolved since this first fix.

5.5 Other peripherals

TABLE 3[ DATA MATRIX ]
Peripheral hardware status and Linux driver binding summary
BlockHardware ComponentLinux Driver / SubsystemBus / Hardware Notes
TouchscreenFocalTech FT8201edt_ft5x06I2C 0x38; IRQ GPIO 65
Wi-Fi / BTQualcomm WCN3660Bwcn36xx, btqcomsmdDual-band 2.4/5 GHz; BT 4.2 LE
Audio Amplifiers2× Awinic AW87319awinic,aw87319I2C 0x58 and 0x59 stereo channels
Audio DSPHexagon QDSP6 v5qcom_q6v5_pasPipeWire ALSA userland interface
Fuel GaugeQualcomm PMI632pmi632_charger5,100 mAh lithium cell; JEITA limits
USB GadgetChipIdea HS OTGci_hdrcCDC ACM serial console + NCM Ethernet
Storage ControllerQualcomm SDHCIsdhci_msmeMMC 5.1, HS400 mode, 200 MHz bus

* All drivers confirmed probing on Linux 7.1.3 near-mainline.

A kernel-module version check (-22, "disagrees about version of symbol module_layout") blocked the out-of-tree camera modules on the 7.2.8 branch; a small script that zeroes the __versions section of each module bypasses the CRC check without rebuilding the kernel. Camera bring-up remains incomplete (Section 9).


6. Development Record

The photographs below were taken during development; dates come from the camera files. Figure 4 summarizes the sequence.

EXHIBIT // FIGURE 4[ EMPIRICAL BRING-UP LOG ]
Chronological Development Sequence (15 Oct - 9 Nov 2026)

Timeline reconstructed from photographs, 15 October to 9 November 2026.

15 OCTFAIL
Layout Rejected
Secure check fails on boot.img (AVB offset 0x57000 zeroed).
17 OCTPASS
Custom Image Accepted
Preserved 0-512 KiB prefix; S-Boot boots orange state warning.
18 OCTBOOT
lk2nd Fastboot Reached
Fastboot getvar reports JD9367 panel ID; keys hooked.
21 OCTDESKTOP
Arch + XFCE Up
First graphical desktop on Linux 7.1.3 (llvmpipe software raster).
23 OCTCHECK
vbmeta Iteration
Download Mode secure check tests; device ID verified.
24 OCTDEBUG
LineageOS 21 First Run
eMMC enumerates as mmcblk1; initramfs root device mismatch.
25 OCTSTORAGE
Storage Mounted
p69 ext4 mounted; dual-boot selector menu operational.
26 OCTTUNE
Peripherals & Notices
XFCE panel crash debugged; Android notification shade boots.
09 NOVSUCCESS
Dual-Boot Validated
Final menu with hardware telemetry; Arch Linux & LineageOS 21 live.

Between 15 and 17 October S-Boot rejected, then accepted, a custom image (Figure 5a-c). On 18 October lk2nd reached fastboot (Figure 3a) and revealed the panel identity (Section 5.3). On 21 October the Arch Linux ARM XFCE desktop ran on kernel 7.1.3-g6406df31eeed-dirty (Figure 7a). The 23 October Download Mode capture (Figure 5d) shows a vbmeta check failing during a flashing iteration.

EXHIBIT // FIGURE 5[ HARDWARE RECORD PHOTOGRAPHS ]
S-Boot's Responses During Early Bootloader Iterations

Visual diagnostic feedback from Samsung S-Boot during raw binary payload development.

Red error text on tablet: SECURE CHECK FAIL : boot.img
(a) 15 OCT

Secure check fails on boot.img (AVB offset 0x57000 zeroed).

Samsung boot logo with raw horizontal pixel garbage lines
(b) 15 OCT

Boot logo displayed with uninitialized framebuffer garbage.

Orange state warning: The phone is not running Samsung official software
(c) 17 OCT

Custom image accepted. S-Boot displays unlocked orange state warning.

Samsung Download Mode screen showing technical device variables
(d) 23 OCT

Download Mode during flashing iteration; OEM LOCK: OFF (U).

NOTE

The warning in (c) means S-Boot successfully loaded non-Samsung software, which was the primary bootloader milestone.

Two boot logs bracket the storage work (Figure 6). On 24 October the kernel enumerates the eMMC as mmcblk1 with partitions p1-p69, while the init script waits for /dev/mmcblk0p69 and aborts with [FATAL] not found after 10 s. The log also shows missing firmware for the wireless subsystem (wcnss.mdt, error -2), no sound cards, and deferred camera probes, so many peripherals were not yet working. By 25 October the root filesystem mounts as mmcblk0p69 and systemd reaches its targets, with one failing binfmt_misc mount.

EXHIBIT // FIGURE 6[ HARDWARE RECORD PHOTOGRAPHS ]
Boot Logs and Desktop Fault Analysis from the Tablet Screen

Console dmesg logs captured via persistent ramoops and on-screen XFCE desktop debugging.

Terminal boot log showing fatal error waiting for root device
(a) 24 OCT

Root device not found: init script waits for mmcblk0p69 while eMMC is mmcblk1.

Green systemd OK boot messages scrolling on tablet screen
(b) 25 OCT

Root successfully mounted from mmcblk0p69; systemd reaches target multi-user.

Photograph of tablet screen showing Failed to restart the panel error dialog
(c) 26 OCT

A panel crash in XFCE desktop session (dbus-launch exited with status 1).

NOTE

Log in (b) records unbinding of legacy msm-restart and successful systemd target transitions.

On 26 October the Android side showed three system notices (Figure 7c): the build is signed with public keys, SELinux is not enforcing, and a serial console is enabled. These affect the security posture discussed in Section 8. Figure 7 collects the userland screens.

EXHIBIT // FIGURE 7[ HARDWARE RECORD PHOTOGRAPHS ]
Userland Graphical Environments on the SM-T295 Tablet

Photographic evidence of Arch Linux ARM desktop and LineageOS 21 operational userlands.

XFCE About OS dialog on physical tablet screen
(a) 21 OCT

XFCE About Dialog: zucchini-linux, kernel 7.1.3, 1.8 GiB RAM, llvmpipe.

LineageOS setup wizard Welcome screen
(b) 24 OCT

LineageOS 21 first-run setup wizard running Android 14.

Android system notification shade showing three development notices
(c) 26 OCT

Android notices: public keys, SELinux permissive, serial console enabled.

LineageOS clock and lock screen on physical tablet
(d) 09 NOV

LineageOS 21 lock screen at 04:51 confirming full touch input & telephony.

NOTE

(a) was straightened from an oblique photograph taken at the lab workbench.


7. Evaluation (Preliminary)

7.1 Setup and caveats

All measurements are from one SM-T295 unit, one run per condition, by the author. Boot time is from power-button press to an interactive UI. Memory is used RAM at idle with Wi-Fi connected and no applications open. Power is read from the PMI632 fuel gauge at a nominal 3.85 V, and runtime is projected as 19.1 Wh divided by the draw. These are indicative, not statistically established; Section 8.3 lists what is missing.

7.2 Boot time

TABLE 4[ DATA MATRIX ]
Cold boot to interactive UI duration breakdown (seconds)
Operating StackS-Boot StageLoader / KernelUserland StageTotal Cold Boot
Zucchini Linux (Arch + XFCE)1.8 s2.9 s (lk2nd 1.0s + decomp 1.9s)6.5 s11.2 s
LineageOS 21 (Android 14)1.8 s3.2 s18.4 s28.5 s*
Stock One UI (Android 11)1.8 s4.1 s28.7 s34.6 s

* *The LineageOS stage values sum to 23.4 s, not 28.5 s; we report the end-to-end figure and flag the mismatch for re-measurement.

Zucchini Linux reaches the desktop in 11.2 s, which is 67.6% faster than the stock firmware's 34.6 s.

7.3 Memory

TABLE 5[ DATA MATRIX ]
Idle memory consumption across operating stacks (1.77 GiB / 1,812 MiB total available)
Operating StackUsed RAMFree RAMRAM Utilization
Stock One UI (Android 11)1,380 MiB432 MiB76.2%
LineageOS 21 (Android 14)740 MiB1,072 MiB40.8%
Zucchini Linux (Arch ARM64)199 MiB1,613 MiB11.0%

* Idle memory measured with Wi-Fi connected and zero user apps running.

Idle memory in use on Zucchini Linux is 85.6% lower than on stock Android. The used-percentage column is recomputed from the used and total figures.

EXHIBIT // FIGURE 8A[ EMPIRICAL BENCHMARK ]
Cold Boot Duration to Interactive Desktop / LauncherSingle SM-T295 unit, power-button press to interactive UI input.
Zucchini Linux (Arch ARM64)11.2 s (Fastest)
LineageOS 21 (Android 14)28.5 s
Stock One UI (Android 11)34.6 s
NOTE

Zucchini Linux boots 67.6% faster than stock Samsung firmware by avoiding ART runtime initialization and vendor services.

EXHIBIT // FIGURE 8B[ EMPIRICAL BENCHMARK ]
Idle RAM Consumption (1.77 GiB Total Pool)Read via /proc/meminfo at idle, Wi-Fi connected, no apps active.
Zucchini Linux (Arch ARM64)199 MiB (11.0%)
LineageOS 21 (Android 14)740 MiB (40.8%)
Stock One UI (Android 11)1,380 MiB (76.2%)
NOTE

199 MiB idle memory leaves 89.0% of physical RAM available for user processes, vs 23.8% on stock Samsung One UI.

7.4 Power

TABLE 6[ DATA MATRIX ]
Power draw and projected battery runtime (19.1 Wh nominal pack)
Operating ModePower Draw (mW)Projected Runtime (Hours)
Linux, screen off, Wi-Fi connected145 mW131.7 Hours (~5.5 days)
Linux desktop idle, 50% backlight620 mW30.8 Hours
Linux, full screen + 4-core CPU stress2,850 mW6.7 Hours
Stock Android idle, 50% backlight980 mW19.5 Hours

* Power measured via Qualcomm PMI632 fuel gauge at nominal 3.85 V.

7.5 Graphics

The XFCE session in Figure 7a reports the renderer as llvmpipe (LLVM 23.1.3), meaning software rasterization. Earlier project notes record glmark2-es2 scores for the open Freedreno driver on the Adreno 504 at 1280×800 of 142 overall against 156 for Qualcomm's Android driver (91.0%). The configuration under which those scores were collected is not captured in the evidence we hold, so we treat them as unverified until re-measured under the procedure of Section 7.1.


8. Discussion

8.1 Security posture

Verified boot constrains the design. S-Boot rejects images that lack AVB structures, so the boot slot carries an AVB v1.0 footer produced with a null algorithm, which satisfies the structural parser without vendor keys. This means the boot slot is not cryptographically protected.

The Knox flag is tripped (Figure 3c), the Android build is signed with public test keys and runs with SELinux permissive, and a serial console is enabled (Figure 7c). The Android side is therefore a development configuration, not a hardened one. lk2nd runs as a normal-world bootloader loaded by S-Boot; we did not modify TrustZone.

8.2 Upstreaming

The device tree uses documented bindings for the touch (focaltech,ft8201), amplifier (awinic,aw87319) and wireless (qcom,wcn3660b) parts, and the panel is a standard DRM panel driver. The CPU-deletion pattern should be reusable for other SDM429/SDM439 four-core variants. We have not yet submitted patches.

8.3 Threats to validity

  • Single Device & Operator: Measurements are taken on a single SM-T295 unit across single runs by a single operator; no variance or confidence intervals are reported.
  • Boot Stage Mismatch: Boot time stages for LineageOS do not sum to the reported total (Table 4, flagged explicitly).
  • Unverified Graphics Benchmark: The graphics acceleration result is unverified, and the photographed desktop session in Figure 7a uses software rendering (llvmpipe).
  • Reproduction Guide Allocation: The partition table lists the Linux-side roles; the final allocation of the Android-side partitions to LineageOS must be stated explicitly in the reproduction guide.
  • Static Telemetry Panel: The menu's telemetry panel contains static text (for example a kernel version and battery capacity) that lags the running build.

9. Conclusion and Future Work

An abandoned, bootloader-restricted tablet can run a near-mainline Linux desktop and LineageOS 21 from one boot menu, with the factory bootloader left intact so recovery stays possible. The path required matching a PMIC selector, preserving a verified-boot descriptor, correcting a panel identity, fixing CPU topology, and programming a PMIC register from userspace.

Next steps are:

  1. Hardware-accelerated graphics with documented and reproducible measurements (Freedreno on Adreno 504).
  2. The camera pipeline (Galaxycore GC8034 rear, GC2375H front sensors).
  3. A sensor bridge daemon for automated display orientation rotation.
  4. Validated 4G LTE cellular data and SMS through ModemManager.
  5. Repeated empirical measurements with variance metrics.
  6. Upstream device-tree patch submission to the mainline Linux kernel.

References

  1. postmarketOS contributors, "postmarketOS: real Linux distribution for phones," postmarketos.org.
  2. lk2nd contributors, "lk2nd: a second-stage bootloader based on Little Kernel," github.com/msm8916-mainline/lk2nd.
  3. Qualcomm Technologies, Inc., "Snapdragon 429 Mobile Platform Product Brief & Technical Specifications."
  4. Google LLC, "Android Verified Boot 2.0 Specification," source.android.com.
  5. Samsung Electronics Co., Ltd., "Open Source Release Center: SM-T295 Source Code," opensource.samsung.com.
  6. Mesa Project, "Freedreno: open-source Gallium3D driver for Qualcomm Adreno GPUs," docs.mesa3d.org.
  7. Linux kernel documentation, "Devicetree bindings for Qualcomm Technologies, Inc. SoCs," kernel.org.
  8. Awinic Technology Co., Ltd., "AW87319 High Efficiency Smart K Audio Amplifier Data Sheet."
  9. FocalTech Systems Co., Ltd., "FT8201 True Multi-Touch Capacitive Touch Panel Controller."
  10. Jadechem Inc., "JD9367 WXGA Video Mode Display Driver Controller Specification."
SUGGESTED CITATION:
Nanda, B. B. (2026). Dual-Booting Mainline Linux and Android on a Vendor-Locked Qualcomm Tablet: A Second-Stage Bootloader Bring-Up of the Samsung Galaxy Tab A 8.0 (SM-T295). Zucchini Linux Project Preprint Draft, November 2026. New Delhi: Maharaja Agrasen Institute of Technology.
© 2026 Bidya Bhushan Nanda. Licensed under CC BY-NC-ND 4.0.
← BACK TO BLOG DOSSIERS