init commit
@@ -0,0 +1,54 @@
|
||||
# Local rootfs, image outputs, and device partition backups
|
||||
/rootfs
|
||||
/rootfs-*
|
||||
/images
|
||||
/backup
|
||||
/edl
|
||||
/venv
|
||||
/.venv
|
||||
/work
|
||||
/build
|
||||
/dist
|
||||
/tmp
|
||||
|
||||
# Disk images, raw partitions, and archives
|
||||
*.img
|
||||
*.sparse.img
|
||||
!bootloader/*.img
|
||||
*.raw
|
||||
*.iso
|
||||
*.tar
|
||||
*.tar.gz
|
||||
*.tar.xz
|
||||
*.tar.zst
|
||||
|
||||
# Private SSH keys, credentials, and local agent configs
|
||||
/keys/phone_id_*
|
||||
*.pem
|
||||
*.key
|
||||
*id_rsa*
|
||||
*id_ed25519*
|
||||
.bantam.cfg
|
||||
overlay/rootfs/home/user/.bantam.cfg
|
||||
overlay/rootfs/etc/skel/.bantam.cfg
|
||||
overlay/rootfs/root/.bantam.cfg
|
||||
overlay/rootfs/home/user/.ssh/
|
||||
overlay/rootfs/etc/skel/.ssh/
|
||||
overlay/rootfs/root/.ssh/
|
||||
|
||||
# C/C++ & CMake build artifacts
|
||||
src/**/build/
|
||||
CMakeFiles/
|
||||
CMakeCache.txt
|
||||
cmake_install.cmake
|
||||
compile_commands.json
|
||||
*.o
|
||||
*.a
|
||||
|
||||
# Python & editor temporary files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*~
|
||||
*.swp
|
||||
*.swo
|
||||
.DS_Store
|
||||
@@ -0,0 +1,74 @@
|
||||
# The Bananarchy Manifesto
|
||||
|
||||
_(by [Luxferre](https://luxferre.top), Oct 2026)_
|
||||
|
||||
## The past
|
||||
|
||||
With the 2018 release of Nokia 8110 4G, many power users of feature phones saw a glimmer of hope about possible resurrection of Firefox OS and returning open technologies and true Linux-powered keypad smartphones to the mainstream market. However, those in power decided to go another way, and eight years later, this phone, as well as other similar ones, is mostly viewed as nothing but abandonware.
|
||||
|
||||
It doesn't have to be like this though, and the Bananarchy project has been built from the ruins of three other essentially dead projects to prove just that.
|
||||
|
||||
## The present...
|
||||
|
||||
### ...of KaiOS
|
||||
|
||||
Having had a rather unsuccessful debut with Cingular Flip 2 (Alcatel OT-4044O) and then more successful launch in India with JioPhone, KaiOS, a keypad-oriented reboot of Firefox OS, had gained its true global popularity only after releasing Nokia 8110 4G. But now, it's hard to tell whether it was popularity or infamy. Most users who tried it out were left disappointed: KaiOS wasn't even remotely mature enough to compete with Android, and wasn't fast and snappy enough to compete with MAUI (including then-current S30+ generations), Mocor and other "true" feature phone platforms. The only competitive advantage it could offer outside India was WhatsApp integration, and even that went very slowly and eventually didn't last long.
|
||||
|
||||
But those who were disappointed the most were us, the power users, hackers and tinkerers, those who awaited from Nokia something akin to no less than a resurrection of Symbian. Instead, we saw how the company with literally no moat decided to go the way of Apple by officially disabling all sideloading (that, for the record, had been present in the original Firefox OS) and, on top of that, employing unsolicited IMEI+IMSI pair tracking to identify all KaiStore users and decide which features to enable or disable automatically based on that information. And when the problem of sideloading had been solved by finding the famous `*#*#33284#*#*` (`*#*#debug#*#*`) MMI code, and the problem of rooting the device had been solved even before the official firehose loader for it had been found, people started putting together various solutions for debloating the system, tweaking it to make less laggy, and eventually even writing their own replacement for call log, phone book and other stock components written using the most inappropriate frameworks for such devices.
|
||||
|
||||
The KaiOS developers, however, didn't listen to us. The only things they did were: first they patched the vulnerability that allowed to obtain root, then made it harder to get into the debug mode and the developer menu overall. Time passed, new models appeared, rooting and sideloading became harder and harder, and the cherry on the cake was KaiOS 3.0 that was totally incompatible and ran on a drastically different hardware released almost exclusively in the US. Now (October 2026), there are some US-exclusive devices that run 4.0 which is virtually the same. For the rest of the world, the totally outdated 2.x branch is still being maintained (with the most recent version being about 2.6), but the current model list has disappeared from the official KaiOSTech website.
|
||||
|
||||
As a result of all this, for most of the world, KaiOS in its stock form is likely more dead than alive. And now, we're left with phones that still are working but not as functional and mostly unpleasant to use compared to what there is on the market today.
|
||||
|
||||
### ...of GerdaOS
|
||||
|
||||
GerdaOS (codenamed Project Pris) was the first (and most known) attempt to "bring KaiOS back to the people" in a form of a custom KaiOS system image build, targeted exclusively at Nokia 8110 4G TA-1048. Besides the traditional shell-level debloating and permanent rooting, it integrated several privacy hardening patches, additional system utils, an early form of the alternative app installer directly from the microSD card, and some custom artwork. At the time, it worked faster and generally was more reliable than the stock KaiOS firmware for the 8110 4G.
|
||||
|
||||
However, as the author became overwhelmed with work and then eventually switched to another phone as his daily driver, the project got abandoned and later fully archived, with the last GerdaOS build matching official v13 firmware from Nokia (the absolute last official version being v17). The community went on with adapting several solutions implemented in GerdaOS to other targets, but now all of it is just a memory and a read-only repo.
|
||||
|
||||
### ...of postmarketOS
|
||||
|
||||
Several community members realized early on that attempts to improve an OS whose developers actively fight back against any improvements were doomed to be unproductive, and went on to adapting postmarketOS (officially called Nura since Sep 27 2026) to the Nokia 8110 4G hardware, following up with the later models as well. Unfortunately, while pmOS was an excellent starting choice for a new, truly independent custom Linux distribution for this family of phones back then, now, as of October 2026, the situation is drastically different: not only has any porting work completely stalled with the targets marked as deprecated, but the project itself has been taken over by those who appear to pursue dubious political agendas much more than smooth user experience, enforcing various anti-freedom practices and effectively making the Nura distribution impossible to contribute to.
|
||||
|
||||
As such, in order to maintain the support for Nokia's feature phones as the main targets and to preserve the original spirit of freedom, hacker-friendliness and net neutrality that the early pmOS offered, a decision has been made to create a hardfork of Nura with:
|
||||
- the primary focus on keypad-driven devices, specifically those on Qualcomm MSM8905/MSM8909 chipsets as first-class citizens,
|
||||
- better hardware support for those devices than the stock pmOS/Nura offered,
|
||||
- more up-to-date software with sensible preinstalled defaults to achieve full on-device autonomy with least effort,
|
||||
- zero discrimination against any technology or its users,
|
||||
- hardware-specific privacy-oriented tweaks and practices, going above and beyond those started by GerdaOS and Wallace Toolbox.
|
||||
|
||||
## The mission
|
||||
|
||||
Bananarchy's mission is to finally bring back full-featured keypad smartphone funcitonality into the supported devices by offering full, unlocked, unlimited, optimized and native Linux experience.
|
||||
|
||||
## The tenets
|
||||
|
||||
Regardless of the target, Bananarchy does and always will operate under the following ten principles.
|
||||
|
||||
1. **Absolute freedom to download, install, explore, research, fork and modify.** While some underlying components, like the Alpine Linux distribution upstream or the remnants from pmOS, are guided by their own licensing terms, all Bananarchy-specific customization is fully released into the public domain.
|
||||
2. **Absolute freedom to access any component of your own device.** Unlike KaiOS or even GrapheneOS, Bananarchy places no restrictions on any part of the device access, including WLAN or baseband firmware or configuration.
|
||||
3. **With absolute freedom comes absolute responsibility.** The end user is the only one who can be responsible for running anything on the system, including software that can be illegal in the user's jurisdiction. Since Bananarchy essentially turns your phone into a full-featured pocket Linux PC, treat it as such and don't run anything that can get you into trouble.
|
||||
4. **No discrimination against any user by any parameter.** In particular, Bananarchy, as shipped, will NOT comply with any request to include any restrictions based on user's age, location, carrier, host platform, phone vendor or model, and will NEVER collect or send any of this or other identification information that would help anyone with enforcing these restrictions.
|
||||
5. **No discrimination against contributors.** While setting up a public repo on a truly uncensored platform is currently technically challenging, the author is welcoming any constructive suggestions, forks and patches, regardless of the method they were created and the platform they were published on (as long as it is accessible to the author). Conversely, if the Nura project ever decides to abolish their current anti-freedom policies and removes the keypad Nokias from its deprecation list, Bananarchy will never be against merging its own patches into Nura. A project discussion group for Bananarchy is currently under construction.
|
||||
6. **Performance matters.** If a feature to be included OOTB has a single implementation that makes the phone laggy or quickly eats through its battery, it will not be included into the release until that implementation is optimized and thoroughly tested on a real device.
|
||||
7. **Autonomy matters.** Bananarchy always aims to include enough pre-installed development tools to start creating your own software for it on the device itself. Additionally, it includes some easy to use shell aliases to make common tasks even simpler.
|
||||
8. **Freshness matters.** Unless a new version of a package is incompatible with particular hardware or violates any of the other principles listed here, it should always be preferred over the old version. The (default) exception to this rule is the Linux kernel with proprietary model-specific firmware which can be difficult to link with the newer kernels for a particular target. Still, pmOS and by extension Bananarchy already does use a newer kernel than the one KaiOS had been shipped with.
|
||||
9. **Support quality matters.** Better to support fewer targets but support them as completely as possible, than try porting the OS to everything out there and never get any target working 100%. Bananarchy is being developed iteratively, and the first target it aims to fully support is Nokia 8110 4G, with 2720 Flip, 800 Tough and 8000 4G coming after.
|
||||
10. **User experience matters.** While Bananarchy is deliberately aimed at power users who want full control over their devices at the expense of some eye candy, it has been striving to be much more than just "pmOS with patches" since the very first day of development. Unique tools and more optimizations are being added regularly and the result is always being reviewed on a real device by a real human from the end user's perspective. Any UI/UX hiccups are being caught and fixed early on in the process, which is more than pmOS could offer and a total opposite of how KaiOS had been shipped on these phones.
|
||||
|
||||
## The future
|
||||
|
||||
As a hobbyist project mostly developed by a single man in his free time, Bananarchy may eventually suffer the same fate as GerdaOS and cannot guarantee any particular feature or target support delivered within any timeline, however, there is indeed a clear vision of the milestones on the path to the version 1.0.0:
|
||||
|
||||
1. Full hardware support for Nokia 8110 4G (`argon`).
|
||||
2. A set of significant performance improvements over the stock pmOS/Nura.
|
||||
3. Revamped, optimized UI for phone-specific functions like dialer, contacts, call log and SMS.
|
||||
4. A set of privacy-focused system utilities.
|
||||
5. Full hardware support for Nokia 2720 Flip (`beatles`).
|
||||
6. Full hardware support for Nokia 800 Tough (`coconut`).
|
||||
7. Full hardware support for Nokia 8000 4G (`sparkler`).
|
||||
8. A public GUI SDK to develop keypad-first, native Linux mobile applications for small screens.
|
||||
9. Full localization and multilingual input support.
|
||||
10. Community resources for the users to connect and share their experience, ideas, suggestions and customizations.
|
||||
|
||||
The road to make keypad smartphones great again was never truly abandoned, and the most exciting section of this road starts right here.
|
||||
@@ -0,0 +1,227 @@
|
||||
# Bananarchy Linux — User, Flashing & Customization Manual
|
||||
|
||||

|
||||
|
||||
This manual covers flashing, operating, and customizing **Bananarchy Linux** (`v0.0.1`, Sxmo `240x320` native edition) on **Qualcomm MSM8905 / MSM8909** Nokia feature phones:
|
||||
- **Nokia 8110 4G (`nokia-argon`)**
|
||||
- **Nokia 2720 Flip (`nokia-beatles`)**
|
||||
- **Nokia 800 Tough (`nokia-tough` / `nokia-coconut`)**
|
||||
- **Nokia 8000 4G (`nokia-sparkler`)** & **Nokia 6300 4G (`nokia-leo`)**
|
||||
|
||||
---
|
||||
|
||||
## 1. What Is Prepared in This Workspace
|
||||
|
||||
### 1.1 System Images (`images/`)
|
||||
- `images/bananarchy-nokia-argon.img` (linked as `images/nokia-argon-sxmo.img`) — Raw partitioned image (`256 MiB` `ext2` `pmOS_boot` + `ext4` `pmOS_root`) ready for EDL flashing to `userdata` or raw `dd` to a microSD card.
|
||||
- `images/bananarchy-nokia-argon.sparse.img` (linked as `images/nokia-argon-sxmo.sparse.img`) — Android sparse image for `fastboot flash userdata`.
|
||||
- `images/boot-bananarchy-nokia-argon.img` (linked as `images/boot-nokia-argon-sxmo.img`) — Standalone Android `boot.img` with Linux `6.12.1-msm8916`, initramfs, and appended DTB.
|
||||
- Additional device images (`bananarchy-nokia-beatles.img`, `bananarchy-nokia-tough.img`, `bananarchy-nokia-sparkler.img`) can be generated at any time via `./rebuild-image.sh <device> --mkinitfs`.
|
||||
|
||||
### 1.2 Bootloader & EDL Programmer (`bootloader/`)
|
||||
- `bootloader/lk2nd-msm8909.img` — Secondary bootloader (`lk2nd`) providing Fastboot and `extlinux` boot discovery for MSM8905/MSM8909 devices.
|
||||
- `bootloader/loaders/8110.mbn` — Signed Qualcomm Sahara/Firehose programmer (`05c6:9008`).
|
||||
|
||||
### 1.3 Integrated Hardware & UX Tweaks
|
||||
1. **Native 1:1 `240x320` Resolution & Enlarged Fonts**:
|
||||
- Sway runs at `output * scale 1` (`SXMO_SWAY_SCALE=1`) with Xwayland disabled to save RAM.
|
||||
- Enlarged fonts across all UI layers: `Sxmo 13` window titles and `24px` top bar, `34pt`/`14pt` Conky clock/date positioned cleanly above the Bananarchy emblem wallpaper, `15px` bold Wofi full-screen menus (`240x296`), `13pt` Foot terminal font, `220x28` Wob volume/brightness overlay, and `12pt` Dunst notifications.
|
||||
2. **Multi-Mode `fcitx5-t9` Keypad Engine (`src/fcitx5-t9/`)**:
|
||||
- Supports 6 input modes cycled with `#` (`XF86NumericPound`): `abc`, `Abc`, `ABC`, `Sym`, `Ctl`, and `123`.
|
||||
- Includes instant case toggling during preedit, full 32-character ASCII punctuation/symbol entry, terminal control sequences (`^A`–`^Z`, `Esc`, `Tab`, `F1`–`F12`), and a `450ms` long-press `*` `Ctrl+` modifier latch.
|
||||
3. **Bantam DIY AI Agent (`prebuilt/bantam/bantam`)**:
|
||||
- Fetched from the latest `master` branch of `https://code.luxferre.top/luxferre/bantam-cpp`, cross-compiled for `armv7`, and installed to `/usr/bin/bantam` and `/usr/local/bin/bantam` (with no default `.bantam.cfg` pre-created).
|
||||
4. **Mainline 6.12.1-msm8916 QDSP6 Audio, Voice Call & LTE Modem Stack**:
|
||||
- Patched `q6core`, `q6afe`, `q6afe-dai`, `q6voice-dai`, `q6mvm`, and device trees (`VoiceMMode1` DAI + PM8909 WCD codec).
|
||||
- WirePlumber `50-s16le.lua` (`S16LE` sample format enforcement), ALSA UCM2 profiles (`HiFi.conf` and `VoiceCall.conf`), `q6voiced`, `rmtfs`, `msm-modem-uim-selection`, `msm8909-modem-wwan-port`, and `ModemManager`.
|
||||
5. **Memory & Swap Tuning for 512 MB RAM**:
|
||||
- `384 MiB` ZSTD-compressed `zram0` swap (priority `100`) + `512 MiB` `/swapfile` (priority `10`), with `vm.swappiness=100` and `vm.page-cluster=0`.
|
||||
6. **Preinstalled On-Device Development & Scripting Stack**:
|
||||
- **C / C++ Toolchain & Build Tools**: `gcc`, `g++`, `musl-dev`, `make`, `git`, `nano`
|
||||
- **Janet**: `janet`, `janet-dev`, `jpm` (Janet Package Manager)
|
||||
- **Perl**: `perl`, `perl-io-socket-ssl` (`IO::Socket::SSL`)
|
||||
- **Tcl & SQLite**: `tcl`, `tcl-lib` (`tcllib`), `tcl-tls`, `sqlite` (`sqlite3`), `sqlite-tcl` (`tcl-sqlite`)
|
||||
|
||||
---
|
||||
|
||||
## 2. Flashing Instructions
|
||||
|
||||
### Method A: Automated USB EDL Flasher (Recommended)
|
||||
|
||||
Run the automated EDL flasher from the repository root on your host machine:
|
||||
```bash
|
||||
sudo ./flash-edl.sh
|
||||
```
|
||||
*(To flash another target device image, pass its codename, e.g. `sudo ./flash-edl.sh nokia-sparkler`.)*
|
||||
|
||||
The script will:
|
||||
1. Temporarily pause host `ModemManager` so it does not interfere with `05c6:9008`.
|
||||
2. Wait for the phone to appear in Qualcomm EDL mode (`05c6:9008`):
|
||||
- **Button combo**: Power off the phone, hold **D-Pad Up + D-Pad Down**, and plug in the USB cable.
|
||||
- **EDL cable**: Hold the EDL cable button while plugging in USB.
|
||||
- **From ADB / Fastboot**: The script automatically sends `adb reboot edl` or `fastboot oem edl` if detected.
|
||||
3. Upload `bootloader/loaders/8110.mbn` via Sahara and connect to eMMC via Firehose.
|
||||
4. Back up `gpt.bin`, `fsc`, `fsg`, `modemst1`, `modemst2`, `persist`, and `boot` into `./backup/` (if not already backed up).
|
||||
5. Flash `lk2nd-msm8909.img` to `boot`, flash `images/bananarchy-<device>.img` to `userdata`, clear the stock `system` superblock, and reboot into Bananarchy Linux.
|
||||
|
||||
---
|
||||
|
||||
### Method B: Fastboot Flashing (Once `lk2nd` Is Installed)
|
||||
|
||||
1. Hold **D-Pad Up** while powering on the phone to enter `lk2nd` Fastboot mode.
|
||||
2. Flash the sparse system image to `userdata`:
|
||||
```bash
|
||||
fastboot flash userdata ./images/bananarchy-nokia-argon.sparse.img
|
||||
fastboot erase system
|
||||
fastboot reboot
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Method C: Booting from a microSD Card
|
||||
|
||||
`lk2nd` automatically checks the microSD card for a `pmOS_boot` partition before internal eMMC:
|
||||
```bash
|
||||
sudo dd if=./images/bananarchy-nokia-argon.img of=/dev/sdX bs=4M status=progress conv=fsync
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Keypad Controls & Multi-Mode T9 Input Guide
|
||||
|
||||
### 3.1 Global Sxmo Keypad Controls (`240x320`)
|
||||
|
||||
| Physical Key | Linux Keysym / Event | Action in Sxmo |
|
||||
| :--- | :--- | :--- |
|
||||
| **Left Softkey** | `XF86KbdLcdMenu1` (`KEY_MENU`) | Open **System Menu**, close open menu, or wake & unlock when locked |
|
||||
| **Right Softkey / Back** | `XF86KbdLcdMenu2` / `BackSpace` (`KEY_BACK`) | Open **App Context Menu** (or close menu if open); in apps/T9 preedit acts as `BackSpace` |
|
||||
| **Call (Green)** | `XF86PickupPhone` (`KEY_SEND`) | Wake & unlock when locked, confirm (`Return`) in menus, or: **1×** Answer call / **App Context Menu**, **2×** **Focus Next Window**, **3×** **Toggle Tiling Layout** (`Vertical` -> `Horizontal` -> `Tabbed`) |
|
||||
| **End / Power (Red)** | `XF86PowerOff` | Wake & unlock when locked, close open menu, or: **1×** **Power Menu** (`space` shutter in Megapixels), **2×** cycle screen state, **3×** (or hold `400ms`) launch new terminal |
|
||||
| **D-Pad Up / Down** | `Up` / `Down` | Navigate menus/apps; in T9 preedit: toggle letter case (`a` ↔ `A`) or jump `+4` / `-4` candidates; in idle `Ctl` mode: `Page_Up` / `Page_Down` |
|
||||
| **D-Pad Left / Right** | `Left` / `Right` | Move cursor; in T9 preedit: step back 1 candidate (`Left`) / commit candidate (`Right`); in idle `Ctl` mode: `Home` / `End` |
|
||||
| **Center OK** | `Return` (`KEY_OK`) | Confirm / Enter, or commit active T9 preedit candidate immediately |
|
||||
| **Slider Close / Open** | `SW_LID` (`lid:on` / `lid:off`) | **Close**: close open menu, turn off keypad backlight, and lock/turn screen off; **Open**: restore keypad backlight, unlock, and turn screen on |
|
||||
|
||||
> **Waking & Unlocking After Screen Fade**:
|
||||
> When the screen turns off after inactivity (or when the slider is closed), you can wake and unlock the phone in a single action by either:
|
||||
> - **Opening the slider** (`SW_LID` off), or
|
||||
> - Pressing **End / Power (Red)**, **Left Softkey**, **Right Softkey**, or **Call (Green)** once.
|
||||
|
||||
#### 3.1.1 Window Tiling Modes & Switching Combos
|
||||
By default, Sxmo Sway is configured with **`default_orientation vertical` (`splitv`)**, so opening multiple terminals stacks them **vertically (one terminal under another)** to maximize line width on the `240x320` portrait screen.
|
||||
|
||||
You can switch between **Vertical (`splitv`, one under another)**, **Horizontal (`splith`, side-by-side)**, and **Tabbed (`tabbed`, full-screen tabs)** layouts — as well as switch focus between open terminals — using any of the following combos:
|
||||
|
||||
1. **Direct Physical Keypad Combos**:
|
||||
- **Triple-press Call (Green) (`3× Call`)**: Cycles the current container layout (`Vertical splitv` -> `Horizontal splith` -> `Tabbed` -> `Vertical splitv`).
|
||||
- **Double-press Call (Green) (`2× Call`)**: Switches focus to the next open window/terminal (e.g., jumps between the top and bottom terminals).
|
||||
- **Triple-press (or hold `400ms`) End / Power (Red) (`3× End`)**: Opens a new `Foot` terminal tiled in the active layout.
|
||||
2. **Terminal Context Menu (`Right Softkey` or `1× Call (Green)` inside `Foot`)**:
|
||||
- **Next Window**: Switch focus to the next open terminal/window.
|
||||
- **Toggle Layout**: Cycle `splitv` -> `splith` -> `tabbed`.
|
||||
- **Tile Vertical**: Immediately arrange open windows vertically (one under another) and set future splits to vertical.
|
||||
- **Tile Horizontal**: Immediately arrange open windows horizontally (side-by-side) and set future splits to horizontal.
|
||||
- **New Terminal** / **Close Terminal**: Open a new terminal or close the focused terminal.
|
||||
3. **System Windows Menu (`Left Softkey` -> `Windows`)**:
|
||||
- **Next window**: Focus the next window in the workspace.
|
||||
- **`splitv -> splith -> tabbed`**: Cycle container layout mode.
|
||||
- **Split vertical** / **Split horizontal** / **Tabbed layout**: Switch directly to the chosen layout.
|
||||
- **Switch menu** / **Move menu** / **Kill window**: Switch to any window across workspaces, move windows between positions/workspaces, or close the focused window.
|
||||
4. **External Keyboard / `swaymsg` (`$mod` = `Mod4` / `Super`)**:
|
||||
- `Mod4+v`: Vertical split (`splitv`)
|
||||
- `Mod4+b`: Horizontal split (`splith`)
|
||||
- `Mod4+e`: Toggle split orientation (`layout toggle split` between vertical and horizontal)
|
||||
- `Mod4+w`: Tabbed layout (`layout tabbed`)
|
||||
- `Mod4+s`: Stacking layout (`layout stacking`)
|
||||
- `Mod4+f`: Toggle fullscreen (`fullscreen`)
|
||||
- `Mod4+Up` / `Mod4+Down` / `Mod4+Left` / `Mod4+Right`: Move focus between tiled windows
|
||||
- `Mod4+Shift+Up` / `Mod4+Shift+Down` / `Mod4+Shift+Left` / `Mod4+Shift+Right`: Reposition focused window
|
||||
|
||||
### 3.2 Multi-Mode `fcitx5-t9` Keypad Reference
|
||||
|
||||
- **Short-press `#`** *(when no character is in preedit)*: Cycles through the 6 input modes (`abc` -> `Abc` -> `ABC` -> `Sym` -> `Ctl` -> `123` -> `abc`), displaying a `900ms` preedit status banner (`[Mode: abc]`, `[Mode: Abc]`, `[Mode: ABC]`, `[Mode: Sym]`, `[Mode: Ctl]`, `[Mode: 123]`).
|
||||
- **Auto-commit timeout**: `600ms` for keys with `<= 10` candidates, or `750ms` for keys with `> 10` candidates (`1` and `*` in `abc`/`Abc`/`ABC`, `*` in `Sym`, `9` in `Ctl`). Pressing a different key immediately commits the active candidate.
|
||||
- **While a candidate is highlighted (`[item]`) in preedit**:
|
||||
- Press **`#`** or **D-Pad `Up`**: Toggles letter case (`a` <-> `A`) on the fly without changing mode, or jumps forward **`+4` candidates** for non-alphabetic items.
|
||||
- Press **D-Pad `Down`**: Toggles letter case (`a` <-> `A`) for alphabetic items, or jumps backward **`-4` candidates** for non-alphabetic items.
|
||||
- Press **D-Pad `Left`**: Steps backward **1 candidate** on the same key.
|
||||
- Press **D-Pad `Right`** or **Center `OK` (`Return`)**: Commits the highlighted candidate immediately.
|
||||
- Press **`BackSpace`**: Cancels the uncommitted preedit candidate without deleting previously committed text.
|
||||
- **Long-press (`>= 450ms`)**:
|
||||
- **Hold `0`–`9`**: Commits the digit (`0`–`9`) immediately in any mode.
|
||||
- **Hold `*`**:
|
||||
- In `123` mode: Commits a decimal point (`.`) immediately.
|
||||
- In all other modes: Toggles a one-shot **`Ctrl+` modifier latch** (`[Ctrl+ LATCH ON]` / `[Ctrl+ LATCH OFF]`; mode prefix shows `+^`, e.g. `abc+^`). The next committed key (`a`–`z`, `[`, `\`, `]`, `^`/`6`, `_`/`-`) is sent as `Ctrl+<key>`.
|
||||
- **Hold `#`**: Commits a literal `#` character immediately in any mode.
|
||||
|
||||
#### Modes 1–3: `abc` (Lowercase), `Abc` (One-Shot Shift), `ABC` (Caps Lock)
|
||||
*(In `Abc` and `ABC` modes, uppercase letters precede the digit and lowercase letters on keys `2`–`9`. In `Abc` mode, committing an alphabetic character automatically reverts to `abc`.)*
|
||||
|
||||
| Key | Tap Sequence (`abc` mode) |
|
||||
| :--- | :--- |
|
||||
| **`1`** | `.` `,` `-` `_` `!` `?` `/` `@` `:` `;` `'` `"` `+` `=` `*` `#` `$` `%` `^` `&` `(` `)` `[` `]` `{` `}` `<` `>` `\|` `\` `~` `` ` `` `1` |
|
||||
| **`2`** | `a` `b` `c` `2` `A` `B` `C` |
|
||||
| **`3`** | `d` `e` `f` `3` `D` `E` `F` |
|
||||
| **`4`** | `g` `h` `i` `4` `G` `H` `I` |
|
||||
| **`5`** | `j` `k` `l` `5` `J` `K` `L` |
|
||||
| **`6`** | `m` `n` `o` `6` `M` `N` `O` |
|
||||
| **`7`** | `p` `q` `r` `s` `7` `P` `Q` `R` `S` |
|
||||
| **`8`** | `t` `u` `v` `8` `T` `U` `V` |
|
||||
| **`9`** | `w` `x` `y` `z` `9` `W` `X` `Y` `Z` |
|
||||
| **`0`** | `Space` (`SPC`) `0` `Ent` (`Return`) `Tab` |
|
||||
| **`*`** | `*` `#` `+` `-` `=` `_` `/` `\` `\|` `~` `` ` `` `@` `$` `%` `^` `&` `(` `)` `[` `]` `{` `}` `<` `>` `'` `"` `.` `,` `!` `?` `:` `;` `Tab` `Esc` `^C` `^D` `^Z` *(hold 450ms for `Ctrl+` latch)* |
|
||||
|
||||
#### Mode 4: `Sym` (Grouped ASCII Punctuation, Symbols & Special Keys)
|
||||
| Key | Symbols / Keys |
|
||||
| :--- | :--- |
|
||||
| **`1`** | `.` `,` `!` `?` `:` `;` `-` `_` `1` |
|
||||
| **`2`** | `@` `#` `$` `%` `^` `&` `2` |
|
||||
| **`3`** | `(` `)` `[` `]` `{` `}` `<` `>` `3` |
|
||||
| **`4`** | `+` `-` `*` `/` `=` `_` `4` |
|
||||
| **`5`** | `\|` `\` `~` `` ` `` `'` `"` `5` |
|
||||
| **`6`** | `'` `"` `` ` `` `~` `^` `6` |
|
||||
| **`7`** | `/` `\` `\|` `_` `-` `+` `7` |
|
||||
| **`8`** | `<` `>` `!` `=` `?` `&` `8` |
|
||||
| **`9`** | `$` `%` `^` `&` `*` `#` `@` `9` |
|
||||
| **`0`** | `Space` (`SPC`) `0` `Tab` `Ent` (`Return`) `Esc` |
|
||||
| **`*`** | `*` `#` `+` `-` `=` `_` `/` `\` `\|` `~` `` ` `` `@` `$` `%` `^` `&` `(` `)` `[` `]` `{` `}` `<` `>` `'` `"` `.` `,` `!` `?` `:` `;` |
|
||||
|
||||
#### Mode 5: `Ctl` (Terminal Control Characters, Navigation & Function Keys)
|
||||
- **Direct D-Pad Navigation** *(when no preedit candidate is active in `Ctl` mode)*:
|
||||
- **D-Pad `Up` / `Down`**: Sends `Page_Up` (`PgUp`) / `Page_Down` (`PgDn`) immediately.
|
||||
- **D-Pad `Left` / `Right`**: Sends `Home` / `End` immediately.
|
||||
- **Keypad Multi-Tap**:
|
||||
|
||||
| Key | Control Sequences / Special Keys |
|
||||
| :--- | :--- |
|
||||
| **`1`** | `Esc` `Tab` `Del` `Ins` `Bksp` |
|
||||
| **`2`** | `^C` `^D` `^Z` `^X` `^\` |
|
||||
| **`3`** | `^A` `^E` `^U` `^K` `^W` |
|
||||
| **`4`** | `^R` `^L` `^P` `^N` `^G` |
|
||||
| **`5`** | `^S` `^Q` `^O` `^T` `^Y` |
|
||||
| **`6`** | `^B` `^F` `^V` `^H` `^[` `^]` `^^` `^_` |
|
||||
| **`7`** | `PgUp` `PgDn` `Home` `End` |
|
||||
| **`8`** | `Up` `Down` `Left` `Right` |
|
||||
| **`9`** | `F1` `F2` `F3` `F4` `F5` `F6` `F7` `F8` `F9` `F10` `F11` `F12` |
|
||||
| **`0`** | `Space` (`SPC`) `Tab` `Ent` (`Return`) `Esc` |
|
||||
| **`*`** | `Esc` `Tab` `^C` `^D` `^Z` `^X` `^L` `^R` `^W` |
|
||||
|
||||
#### Mode 6: `123` (Instant Numeric Entry)
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`0`–`9`** | Commits digit `0`–`9` immediately on single tap |
|
||||
| **`*`** | Commits `*` immediately on single tap; **hold `450ms`** to commit `.` (decimal point) |
|
||||
| **`#`** | **Short-press**: cycle back to `abc` mode; **hold `450ms`**: commit `#` |
|
||||
|
||||
---
|
||||
|
||||
## 4. Default Credentials, USB SSH & Bantam AI Agent
|
||||
|
||||
- **Username**: `user`
|
||||
- **Password**: `147147` (`doas` and `sudo` enabled)
|
||||
- **USB Networking SSH**:
|
||||
```bash
|
||||
ssh user@172.16.42.1
|
||||
```
|
||||
- **Bantam AI Agent**:
|
||||
Run `bantam` in the terminal (`Foot`) or over SSH. Configure your endpoint/API key via environment variables or `~/.bantam.cfg` when needed.
|
||||
@@ -0,0 +1,139 @@
|
||||
# Bananarchy Linux (`v0.0.1`)
|
||||
|
||||

|
||||
|
||||
**Bananarchy (`v0.0.1`)** is a keypad-first Linux distribution hardforked from postmarketOS (`v26.06` / Alpine `edge` `armv7`), purpose-built for **Qualcomm MSM8905 (Snapdragon 205)** and **Qualcomm MSM8909 (Snapdragon 210)** smart feature phones with **240x320 QVGA non-touch displays** and **physical 12-key T9 keypads**.
|
||||
|
||||
Bananarchy targets the **Sxmo (`sxmo-de-sway`)** environment exclusively, tuned for 1:1 native `240x320` resolution, enlarged high-contrast typography, sub-115 MB idle RAM footprint on 512 MB devices, full Qualcomm QDSP6/Q6Voice audio and LTE modem routing, pre-integrated **Bantam** DIY AI agent (`https://code.luxferre.top/luxferre/bantam-cpp`), a complete on-device development & scripting stack (`git`, `gcc`/`g++`, `make`, `nano`, `janet` + `jpm`, `perl` + `IO::Socket::SSL`, `tcl` + `tcllib`/`tcl-tls`/`sqlite-tcl`, `sqlite`), and a custom **6-mode `fcitx5-t9` input engine** supporting lowercase, one-shot Shift, Caps Lock, all 32 ASCII punctuation symbols, terminal control codes (`^A`-`^Z`, `Esc`, `Tab`, `F1`-`F12`), and direct numeric entry.
|
||||
|
||||
---
|
||||
|
||||
## Supported MSM8909 / MSM8905 Devices
|
||||
|
||||
| Device | Codename | SoC | CPU / RAM | Display & Panel Firmware | Device Tree (`.dtb`) |
|
||||
| :--- | :--- | :--- | :--- | :--- | :--- |
|
||||
| **Nokia 8110 4G** | `nokia-argon` | Qualcomm MSM8905 (SD205) | 2x Cortex-A7 @ 1.1 GHz, 512 MB | 2.4" 240x320 SPI (`nokia,argon-gc9305-v2-panel.bin`) | `qcom-msm8905-nokia-argon.dtb` |
|
||||
| **Nokia 2720 Flip** | `nokia-beatles` | Qualcomm MSM8905 (SD205) | 2x Cortex-A7 @ 1.1 GHz, 512 MB | 2.8" 240x320 SPI (`nokia,beatles-gc9305-panel.bin`) | `qcom-msm8905-nokia-beatles.dtb` |
|
||||
| **Nokia 800 Tough** | `nokia-tough` (`nokia-coconut`) | Qualcomm MSM8905 (SD205) | 2x Cortex-A7 @ 1.1 GHz, 512 MB | 2.4" 240x320 SPI (`nokia,coconut-gc9305-panel.bin`) | `qcom-msm8905-nokia-coconut.dtb` |
|
||||
| **Nokia 8000 4G** | `nokia-sparkler` | Qualcomm MSM8909 (SD210) | 4x Cortex-A7 @ 1.1 GHz, 512 MB | 2.8" 240x320 SPI (`nokia,sparkler-gc9307-hlt-28-panel.bin`) | `qcom-msm8909-nokia-sparkler.dtb` |
|
||||
| **Nokia 6300 4G** *(sibling)* | `nokia-leo` | Qualcomm MSM8909 (SD210) | 4x Cortex-A7 @ 1.1 GHz, 512 MB | 2.4" 240x320 SPI (`nokia,leo-gc9305-hlt-24-panel.bin`) | `qcom-msm8909-nokia-leo.dtb` |
|
||||
|
||||
---
|
||||
|
||||
## Repository Structure
|
||||
|
||||
```text
|
||||
bananarchy/
|
||||
├── README.md # Project architecture, build system, and quickstart guide
|
||||
├── MANIFESTO.md # The Bananarchy Manifesto, history, mission, and ten tenets
|
||||
├── MANUAL.md # Complete flashing, keypad, T9, Bantam, and modem manual
|
||||
├── flash-edl.sh # Automated USB EDL flasher wrapper (sudo + ModemManager handling)
|
||||
├── flash-edl.py # Multi-device Qualcomm Sahara/Firehose EDL flasher
|
||||
├── rebuild-image.sh # Builds boot.img, MBR raw .img, and Android .sparse.img
|
||||
├── chroot-shell.sh # Rootless Docker armv7 package & rootfs customization shell
|
||||
├── artwork/ # Bananarchy master icon, generated icons, wallpapers, and splashes
|
||||
│ ├── icon-large.png # Master 1024x1024 Bananarchy emblem
|
||||
│ ├── icon-{512..16}.png # Downsampled RGB square icons
|
||||
│ ├── icon-transparent-{512..32}.png # Alpha-keyed RGBA icons for UI themes
|
||||
│ ├── favicon.ico # Multi-resolution ICO
|
||||
│ ├── wallpaper-240x320.png / .jpg # Default Sxmo 240x320 portrait wallpaper
|
||||
│ ├── wallpaper-240x320-centered.png/.jpg# Centered 240x320 portrait wallpaper
|
||||
│ ├── wallpaper-320x240.png / .jpg # Landscape 320x240 QVGA wallpaper
|
||||
│ ├── wallpaper-240x240.png # Square 240x240 wallpaper (Nokia 2720 Flip external display)
|
||||
│ ├── splash-240x320.png / .ppm # 240x320 boot splash image
|
||||
│ └── banner-800x240.png # Project header banner
|
||||
├── bootloader/
|
||||
│ ├── lk2nd-msm8909.img # lk2nd secondary bootloader for MSM8905/MSM8909
|
||||
│ └── loaders/
|
||||
│ └── 8110.mbn # Qualcomm Sahara/Firehose programmer (05c6:9008)
|
||||
├── devices/ # Device definitions, DTBs, and MIPI-DBI panel init sequences
|
||||
│ ├── common-msm8909/ # Shared udev keypad rules, WirePlumber S16LE, ALSA UCM2, zram
|
||||
│ ├── nokia-argon/ # Nokia 8110 4G device package, DTS/DTB, and GC9305 panel init
|
||||
│ ├── nokia-beatles/ # Nokia 2720 Flip device package, DTS/DTB, and GC9305 panel init
|
||||
│ ├── nokia-tough/ # Nokia 800 Tough device package, DTS/DTB, and GC9305 panel init
|
||||
│ └── nokia-sparkler/ # Nokia 8000 4G & 6300 4G device package, DTS/DTB, and GC9307/9305 init
|
||||
├── patches/
|
||||
│ ├── kernel/
|
||||
│ │ ├── 0001-msm8909-qdsp6-voice-sound-nokia-argon-6.12.patch
|
||||
│ │ ├── 0002-msm8905-nokia-beatles-and-coconut-dts.patch
|
||||
│ │ └── config-bananarchy-msm8909.armv7
|
||||
│ ├── edl/
|
||||
│ │ └── 0001-edl-msm8909-32bit-elf-and-multi-cmd-firehose.patch
|
||||
│ ├── sxmo/
|
||||
│ │ └── 0001-bananarchy-sxmo-240x320-keypad-ui.patch
|
||||
│ └── fcitx5-t9/
|
||||
│ └── 0001-bananarchy-multimode-t9-and-fcitx5-5.1.19.patch
|
||||
├── src/
|
||||
│ ├── fcitx5-t9/ # C++20 source of Bananarchy's 6-mode fcitx5-t9 input method
|
||||
│ └── leds-msm8905-torch/ # Kernel driver for SY7807 rear torch LED & PM8909 PON shutdown
|
||||
├── overlay/
|
||||
│ └── rootfs/ # Complete Bananarchy rootfs overlay (OS branding, Sxmo, audio, T9)
|
||||
├── prebuilt/
|
||||
│ ├── kernel-6.12.1-msm8916/ # Prebuilt QDSP6/Q6Voice .ko modules, torch .ko, and 5 device DTBs
|
||||
│ ├── fcitx5-t9/ # Prebuilt armv7 libt9.so and fcitx5 addon/inputmethod configs
|
||||
│ └── bantam/ # Prebuilt armv7 bantam AI agent binary
|
||||
└── scripts/
|
||||
├── generate-artwork.py # Generates all wallpapers, icons, and splashes from icon-large.png
|
||||
├── mipi-dbi-cmd.py # Compiles MIPI-DBI panel .txt init sequences into .bin firmware
|
||||
├── build-kernel-audio.sh # Cross-compiles Linux 6.12.1-msm8916 QDSP6/torch modules & DTBs
|
||||
├── build-fcitx5-t9.sh # Cross-compiles src/fcitx5-t9 for armv7
|
||||
├── build-bantam.sh # Fetches master from https://code.luxferre.top/luxferre/bantam-cpp & cross-compiles for armv7
|
||||
├── apply-bananarchy-overlay.sh # Applies overlay, prebuilts, artwork, and device DTB to rootfs
|
||||
└── configure-rootfs-from-scratch.sh # Full rootfs configuration script from base Alpine/pmOS packages
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Build & Customization Workflow
|
||||
|
||||
### 1. Regenerate Artwork Assets
|
||||
Whenever `artwork/icon-large.png` is updated, regenerate all icons, `240x320` wallpapers, and boot splashes:
|
||||
```bash
|
||||
./scripts/generate-artwork.py
|
||||
```
|
||||
|
||||
### 2. Recompile Core Components (Optional — Prebuilts Included)
|
||||
All components are pre-compiled in `prebuilt/` and `overlay/rootfs/`, and can be rebuilt from source at any time using rootless Docker (`alpine:3.24`):
|
||||
```bash
|
||||
# Rebuild multi-mode fcitx5-t9 input engine (src/fcitx5-t9 -> prebuilt/fcitx5-t9)
|
||||
./scripts/build-fcitx5-t9.sh
|
||||
|
||||
# Fetch latest master from https://code.luxferre.top/luxferre/bantam-cpp and cross-compile Bantam AI agent
|
||||
./scripts/build-bantam.sh
|
||||
|
||||
# Rebuild Linux 6.12.1-msm8916 QDSP6/Q6Voice audio modules & DTBs
|
||||
./scripts/build-kernel-audio.sh
|
||||
```
|
||||
|
||||
### 3. Customize Rootfs Packages or Configs
|
||||
```bash
|
||||
./chroot-shell.sh
|
||||
# Inside the container shell:
|
||||
# pkg-add <pkg>
|
||||
# pkg-del <pkg>
|
||||
# pkg-search <pattern>
|
||||
```
|
||||
|
||||
### 4. Build Flashable Device Images
|
||||
```bash
|
||||
# Build for Nokia 8110 4G (default)
|
||||
./rebuild-image.sh nokia-argon
|
||||
|
||||
# Or build for Nokia 2720 Flip, Nokia 800 Tough, or Nokia 8000 4G:
|
||||
./rebuild-image.sh nokia-beatles --mkinitfs
|
||||
./rebuild-image.sh nokia-tough --mkinitfs
|
||||
./rebuild-image.sh nokia-sparkler --mkinitfs
|
||||
```
|
||||
Output images are written to `images/`:
|
||||
- `images/bananarchy-<device>.img` (Raw partitioned MBR image for EDL `userdata` or microSD card)
|
||||
- `images/bananarchy-<device>.sparse.img` (Android sparse image for `fastboot flash userdata`)
|
||||
- `images/boot-bananarchy-<device>.img` (Kernel + initramfs + DTB boot image)
|
||||
|
||||
---
|
||||
|
||||
## Flashing via USB EDL (`05c6:9008`)
|
||||
|
||||
```bash
|
||||
sudo ./flash-edl.sh nokia-argon
|
||||
```
|
||||
See [MANUAL.md](MANUAL.md) for complete EDL, Fastboot, and microSD installation instructions, keypad navigation shortcuts, and the Multi-Mode T9 reference.
|
||||
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 148 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 801 B |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 280 KiB |
|
After Width: | Height: | Size: 7.9 KiB |
|
After Width: | Height: | Size: 886 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 320 KiB |
|
After Width: | Height: | Size: 9.1 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 62 KiB |
@@ -0,0 +1,70 @@
|
||||
#!/bin/sh
|
||||
# Bananarchy Linux Interactive Rootfs Customization Shell
|
||||
set -eu
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
if [ -n "${ROOTFS_DIR:-}" ]; then
|
||||
ROOTFS_HOST="$(realpath "$ROOTFS_DIR")"
|
||||
elif [ -d "$SCRIPT_DIR/rootfs-sxmo" ]; then
|
||||
ROOTFS_HOST="$(realpath "$SCRIPT_DIR/rootfs-sxmo")"
|
||||
else
|
||||
ROOTFS_HOST="$(realpath "$SCRIPT_DIR/rootfs")"
|
||||
fi
|
||||
BANANARCHY_DIR="$SCRIPT_DIR"
|
||||
|
||||
if [ "${1:-}" = "sxmo" ]; then
|
||||
shift
|
||||
fi
|
||||
|
||||
if [ "$#" -eq 0 ]; then
|
||||
set -- /bin/sh
|
||||
fi
|
||||
|
||||
exec docker run --rm -it --network=host \
|
||||
-e HOST_UID="$(id -u)" \
|
||||
-e HOST_GID="$(id -g)" \
|
||||
-v "$ROOTFS_HOST:/rootfs" \
|
||||
-v "$BANANARCHY_DIR:/bananarchy:ro" \
|
||||
alpine:3.24 sh -eu -c '
|
||||
ROOTFS="/rootfs"
|
||||
cat > /etc/apk/repositories <<EOF
|
||||
https://mirror.nura.eco/postmarketos/v26.06
|
||||
https://dl-cdn.alpinelinux.org/alpine/edge/main
|
||||
https://dl-cdn.alpinelinux.org/alpine/edge/community
|
||||
https://dl-cdn.alpinelinux.org/alpine/edge/testing
|
||||
EOF
|
||||
cp /etc/apk/repositories "$ROOTFS/etc/apk/repositories" 2>/dev/null || true
|
||||
cp /bananarchy/keys/* /etc/apk/keys/
|
||||
|
||||
echo "============================================================"
|
||||
echo "Bananarchy Linux (MSM8909 / Sxmo) Customization Environment"
|
||||
echo "Target rootfs: $ROOTFS"
|
||||
echo ""
|
||||
echo "Helpful commands inside this shell:"
|
||||
echo " pkg-add <pkg...> : Install armv7 package(s) into $ROOTFS"
|
||||
echo " pkg-del <pkg...> : Remove package(s) from $ROOTFS"
|
||||
echo " pkg-search <query> : Search armv7 packages"
|
||||
echo " cd /rootfs : Inspect or edit files directly"
|
||||
echo ""
|
||||
echo "After exiting, run ./rebuild-image.sh to repack images."
|
||||
echo "============================================================"
|
||||
|
||||
cat > /usr/local/bin/pkg-add <<EOF
|
||||
#!/bin/sh
|
||||
exec apk --root "$ROOTFS" --arch armv7 add --no-scripts "\$@"
|
||||
EOF
|
||||
cat > /usr/local/bin/pkg-del <<EOF
|
||||
#!/bin/sh
|
||||
exec apk --root "$ROOTFS" --arch armv7 del --no-scripts "\$@"
|
||||
EOF
|
||||
cat > /usr/local/bin/pkg-search <<EOF
|
||||
#!/bin/sh
|
||||
exec apk --root "$ROOTFS" --arch armv7 search "\$@"
|
||||
EOF
|
||||
chmod +x /usr/local/bin/pkg-add /usr/local/bin/pkg-del /usr/local/bin/pkg-search
|
||||
|
||||
cd "$ROOTFS"
|
||||
"$@" || true
|
||||
chown -R "$HOST_UID:$HOST_GID" "$ROOTFS"
|
||||
chmod -R u+rwX "$ROOTFS"
|
||||
' -- "$@"
|
||||
@@ -0,0 +1,3 @@
|
||||
SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="keypad", ENV{ID_INPUT_KEYBOARD}="1"
|
||||
SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="gpio-keys", ENV{ID_INPUT_KEYBOARD}="1"
|
||||
SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="pm8941_resin", ENV{ID_INPUT_KEYBOARD}="1"
|
||||
@@ -0,0 +1,6 @@
|
||||
# Maximum time to wait for SIM card to appear after starting the modem.
|
||||
# Some SIM cards or modem firmwares might take longer to initialize. :(
|
||||
# To avoid blocking boot without a SIM card for too long this is fairly short
|
||||
# by default (4 seconds), but you can increase it to e.g. 30 seconds if necessary.
|
||||
# Set to 0 to disable waiting entirely.
|
||||
sim_wait_time=4
|
||||
@@ -0,0 +1,15 @@
|
||||
# Use case configuration for common MSM8916 devices. No SecondaryMic.
|
||||
# All analog outputs/inputs connected to internal PM8916 codec.
|
||||
|
||||
Define {
|
||||
WcdPlaybackPCM "hw:${CardId},0"
|
||||
WcdCapturePCM "hw:${CardId},1"
|
||||
}
|
||||
<platforms/msm8916/qdsp6-components.conf>
|
||||
|
||||
<codecs/msm8916-wcd/Speaker.conf>
|
||||
<codecs/msm8916-wcd/Earpiece.conf>
|
||||
<codecs/msm8916-wcd/Headphones.conf>
|
||||
|
||||
<codecs/msm8916-wcd/PrimaryMic.conf>
|
||||
<codecs/msm8916-wcd/HeadsetMic.conf>
|
||||
@@ -0,0 +1,6 @@
|
||||
Syntax 3
|
||||
|
||||
SectionUseCase."HiFi" {
|
||||
File "HiFi.conf"
|
||||
Comment "Play and record HiFi quality Music"
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
# Use case configuration for common MSM8916 devices.
|
||||
# All analog outputs/inputs connected to internal PM8916 codec.
|
||||
|
||||
Define {
|
||||
WcdPlaybackPCM "hw:${CardId},0"
|
||||
WcdCapturePCM "hw:${CardId},1"
|
||||
}
|
||||
<platforms/msm8916/qdsp6-components.conf>
|
||||
|
||||
<codecs/msm8916-wcd/Speaker.conf>
|
||||
<codecs/msm8916-wcd/Earpiece.conf>
|
||||
<codecs/msm8916-wcd/Headphones.conf>
|
||||
|
||||
<codecs/msm8916-wcd/PrimaryMic.conf>
|
||||
<codecs/msm8916-wcd/SecondaryMic.conf>
|
||||
<codecs/msm8916-wcd/HeadsetMic.conf>
|
||||
@@ -0,0 +1,6 @@
|
||||
Syntax 3
|
||||
|
||||
SectionUseCase."HiFi" {
|
||||
File "HiFi.conf"
|
||||
Comment "Play and record HiFi quality Music"
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
# zram settings...
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
# load zram kernel module on start?
|
||||
load_on_start=yes
|
||||
|
||||
# unload zram kernel module on stop?
|
||||
unload_on_stop=yes
|
||||
|
||||
# Number of devices.
|
||||
# This value is also passed to the kernel module on modprobe.
|
||||
num_devices=2
|
||||
|
||||
# For each device, specify the following variables
|
||||
# Omitting them is the same as specifying them as empty: It uses defaults
|
||||
# type0, type1, ... are the variables for the types (see below)
|
||||
# size0, size1, ... are the variables for the sizes (in MB)
|
||||
# mlim0, mlim1, ... are the variables for the maximal uncompressed memory (MB)
|
||||
# back0, back1, ... are the variables for the backup device (paths)
|
||||
# icmp0, icmp1, ... are the flags (nonempty = true) whether incompressible
|
||||
# pages are written to the backup device (requires back*)
|
||||
# idle0, idle1, ... are the flags (nonempty = true) whether idle pages are
|
||||
# written to the backup device (requires back*)
|
||||
# wlim0, wlim1, ... set the writeback_limit for idle pages (implies idle*)
|
||||
# algo0, algo1, ... are the variables for the compression algorithms
|
||||
# para0, para1, ... are the variables for the algorithm parameters
|
||||
# flag0, flag1, ... are the variables for the flags
|
||||
# labl0, labl1, ... are the variables for the label name (if you want some)
|
||||
# uuid0, uuid1, ... are the variables for the UUID (if you want to force it)
|
||||
# args0, args1, ... are the variables for additional arguments to zram-init
|
||||
# (args0, args1, ... are eval'd, so quote correspondingly!)
|
||||
# notr0, notr1, ... are the flags (nonempty = true) for "do not trim (discard)"
|
||||
# (set notr* to a nonempty value only for linux-3.14 or earlier or when you
|
||||
# are prepared to waste a lot of memory for a possibly slight speed increase)
|
||||
#
|
||||
# The following are ignored for type swap but not for the other types:
|
||||
# blck0, blck1, ... are the variables for the blocksize (ext2, ext4)
|
||||
# irat0, irat1, ... are the variables for the byte/inode ratio (ext2, ext4)
|
||||
# inod0, inod1, ... are the variables for the inode number (ext2, ext4)
|
||||
# opts0, opts1, ... are the variables for the mount options
|
||||
# mode0, mode1, ... are the variables for the directory mode
|
||||
# owgr0, owgr1, ... are the variables for the directory owner:group
|
||||
#
|
||||
# If the size is 0 (or empty) the device is ignored by the script.
|
||||
#
|
||||
# Available types:
|
||||
# "swap" The device is initialized as a swap device.
|
||||
# The flags variable specifies the priority (16383 if empty).
|
||||
# Use "-" in the flags variable for the default priority (-1)
|
||||
# "/..." The device is mounted on /...
|
||||
# The flags variable specifies the type (ext2, ext4, btrfs, or xfs;
|
||||
# default is ext4)
|
||||
# "-" The filesystem (specified by flags as above) is created in
|
||||
# /dev/zram$NUM but not mounted
|
||||
# Devices with other types are ignored by the script
|
||||
#
|
||||
# Only variables with numbers 0 ... num_devices-1 are used by the script.
|
||||
|
||||
# swap - 500M (or a fourth of available memory if uncommenting)
|
||||
type0=swap
|
||||
flag0= # The default "16383" is fine for us
|
||||
size0=512
|
||||
#size0=`LC_ALL=C free -m | awk '/^Mem:/{print int($2/4)}'`
|
||||
mlim0= # no hard memory limit
|
||||
back0= # no backup device
|
||||
icmp0= # no incompressible page writing to backup device
|
||||
idle0= # no idle page writing to backup device
|
||||
wlim0= # no writeback_limit for idle page writing for backup device
|
||||
notr0= # keep the default on linux-3.15 or newer
|
||||
algo0=zstd # zstd (since linux-4.18), lz4 (since linux-3.15), or lzo.
|
||||
# Size: zstd (best) > lzo > lz4. Speed: lz4 (best) > zstd > lzo
|
||||
para0= # No algorithm parameters
|
||||
labl0=zram_swap # the label name
|
||||
uuid0= # Do not force UUID
|
||||
args0= # we could e.g. have set args0="-L 'zram_swap'" instead of using labl0
|
||||
|
||||
# /tmp - 2G
|
||||
# If you use this, you should put zram-init into the boot runlevel,
|
||||
# and services using /tmp should be in the default runlevel and/or have
|
||||
# rc_need=zram-init in their /etc/conf.d/... file
|
||||
type1=/tmp
|
||||
flag1=ext4
|
||||
size1=2048
|
||||
mlim1= # no hard memory limit
|
||||
back1= # no backup device
|
||||
icmp1= # no incompressible page writing to backup device
|
||||
idle1= # no idle page writing to backup device
|
||||
wlim1= # no writeback_limit for idle page writing for backup device
|
||||
blck1=1024 # the default blocksize of 4096
|
||||
irat1= # bytes/inode ratio
|
||||
inod1= # inode number
|
||||
opts1="strictatime,nosuid,nodev,noexec" # e.g. "relatime" or "noatime" are also reasonable choices
|
||||
mode1=1777
|
||||
owgr1= # No reason to change the default "root:root"
|
||||
notr1= # keep the default on linux-3.15 or newer
|
||||
algo1=zstd
|
||||
para1="level=3" # algorithm-specific parameters such as compression level
|
||||
labl1=tmp_dir
|
||||
uuid1=
|
||||
args1=
|
||||
|
||||
# /var/tmp - 1G
|
||||
type2=/var/tmp
|
||||
flag2=ext2
|
||||
size2=1024
|
||||
mlim2= # no hard memory limit
|
||||
back2= # no backup device
|
||||
icmp2= # no incompressible page writing to backup device
|
||||
idle2= # no idle page writing to backup device
|
||||
wlim2= # no writeback_limit for idle page writing for backup device
|
||||
blck2= # the default blocksize is 4096
|
||||
irat2= # bytes/inode ratio
|
||||
inod2= # inode number
|
||||
opts2=relatime # e.g. "noatime" or "strictatime" are also reasonable choices
|
||||
mode2=1777
|
||||
owgr2= # No reason to change the default "root:root"
|
||||
notr2= # keep the default on linux-3.15 or newer
|
||||
algo2=zstd
|
||||
para2= # No algorithm parameters
|
||||
labl2=var_tmp_dir
|
||||
uuid2=
|
||||
args2=
|
||||
|
||||
# Artificial example with btrfs
|
||||
# (Not actually used here: variables are overridden afterwards by other values)
|
||||
type3=- # Only format the filesystem but actually do not mount it
|
||||
flag3=btrfs
|
||||
size3=1024
|
||||
algo3=zstd
|
||||
labl3=zbtrfs
|
||||
uuid3=
|
||||
args3=
|
||||
|
||||
# swap - 500M
|
||||
# The following is not used by the default (num_devices=3).
|
||||
type3=swap
|
||||
flag3=
|
||||
size3=512
|
||||
algo3=zstd
|
||||
labl3=zram_swap2
|
||||
uuid3=
|
||||
args3=
|
||||
@@ -0,0 +1 @@
|
||||
/lib/firmware/nokia,argon-gc9305-v2-panel.bin
|
||||
@@ -0,0 +1,62 @@
|
||||
# Reference: <https://postmarketos.org/devicepkg>
|
||||
maintainer=""
|
||||
pkgname=device-nokia-argon
|
||||
pkgdesc="Nokia 8110 4G"
|
||||
pkgver=10
|
||||
pkgrel=0
|
||||
url="https://postmarketos.org"
|
||||
license="GPL-2.0-only"
|
||||
arch="armv7"
|
||||
options="!check !archcheck"
|
||||
depends="
|
||||
linux-postmarketos-qcom-msm8916
|
||||
mkbootimg
|
||||
postmarketos-base
|
||||
soc-qcom-msm8909
|
||||
soc-qcom-msm8916-rproc
|
||||
"
|
||||
subpackages="$pkgname-nonfree-firmware:nonfree_firmware"
|
||||
makedepends="devicepkg-dev mipi-dbi-cmd"
|
||||
_panel="nokia,argon-gc9305-v2-panel"
|
||||
source="
|
||||
00-nokia-argon-display.files
|
||||
deviceinfo
|
||||
kernel-cmdline.conf
|
||||
modules-initfs
|
||||
$_panel.txt
|
||||
"
|
||||
|
||||
build() {
|
||||
devicepkg_build $startdir $pkgname
|
||||
mkdir -p "$builddir"
|
||||
mipi-dbi-cmd "$builddir"/"$_panel".bin \
|
||||
"$srcdir"/"$_panel".txt
|
||||
}
|
||||
|
||||
package() {
|
||||
devicepkg_package $startdir $pkgname
|
||||
# Package display init sequence
|
||||
install -Dm644 "$builddir"/"$_panel".bin -t \
|
||||
"$pkgdir"/lib/firmware/
|
||||
install -Dm644 "$srcdir"/00-nokia-argon-display.files -t \
|
||||
"$pkgdir"/usr/share/mkinitfs/files/
|
||||
}
|
||||
|
||||
nonfree_firmware() {
|
||||
pkgdesc="GPU/WiFi/BT/Modem/Video firmware"
|
||||
depends="
|
||||
firmware-qcom-adreno-a300
|
||||
msm-firmware-loader
|
||||
firmware-nokia-argon-venus
|
||||
firmware-nokia-argon-wcnss-nv
|
||||
"
|
||||
mkdir "$subpkgdir"
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
66302bb5d83c4ba155ff62405fb9a374ab76e1912411310b1ad75e00c216b6868da4e2b6f3987c97146389aa44b2b2c26f0ca0819566be45c9d0d2dd1d3b72f1 00-nokia-argon-display.files
|
||||
ef4587f749b941761cb7838d9e21e0bd9436693a4a8bd38ac5d7cae6e9ceb2c1e7358d5fe9a34b23d6ff484c81079533eaee6c3e609d8bc685902ff150e1e79d deviceinfo
|
||||
37e1e5f8839b624ab3eb850a24ed4daeb61a651257a1fb593f49cb869323e5d1b339c831a18eb26a9d7bd0a618ea9eb2bb9bf3882133af5f2606a878e6d39c67 kernel-cmdline.conf
|
||||
749fa5911f53f65c1a18a8768d374d1ea39ef47ed61146a5f79d669250788501434a059cfff65b83cb54eb7273841686b4a3a04f20aaec6ec7f742e14623c8bc modules-initfs
|
||||
dd82fd4732694a24c91339b5c5fbb0bf485b3b2da3c17c11b72a02e90e9827c367504c99894556dd8273f927408cdb187325e5f3b9ea9e4a82e3cb3798cb2816 nokia,argon-gc9305-v2-panel.txt
|
||||
"
|
||||
@@ -0,0 +1,36 @@
|
||||
# Reference: <https://postmarketos.org/deviceinfo>
|
||||
# Please use double quotes only. You can source this file in shell
|
||||
# scripts.
|
||||
|
||||
deviceinfo_format_version="0"
|
||||
deviceinfo_name="Nokia 8110 4G"
|
||||
deviceinfo_manufacturer="Nokia"
|
||||
deviceinfo_codename="nokia-argon"
|
||||
deviceinfo_year="2018"
|
||||
deviceinfo_dtb="qcom-msm8905-nokia-argon"
|
||||
deviceinfo_append_dtb="true"
|
||||
deviceinfo_arch="armv7"
|
||||
deviceinfo_swap_size_recommended="512"
|
||||
|
||||
# Device related
|
||||
deviceinfo_chassis="handset"
|
||||
deviceinfo_external_storage="true"
|
||||
deviceinfo_screen_width="240"
|
||||
deviceinfo_screen_height="320"
|
||||
deviceinfo_drm="true"
|
||||
|
||||
# Bootloader related
|
||||
deviceinfo_flash_method="fastboot"
|
||||
deviceinfo_generate_bootimg="true"
|
||||
deviceinfo_generate_extlinux_config="true"
|
||||
deviceinfo_flash_pagesize="2048"
|
||||
deviceinfo_header_version="0"
|
||||
deviceinfo_flash_offset_base="0x80000000"
|
||||
deviceinfo_flash_offset_kernel="0x00008000"
|
||||
deviceinfo_flash_offset_ramdisk="0x02700000"
|
||||
deviceinfo_flash_offset_second="0x00f00000"
|
||||
deviceinfo_flash_offset_tags="0x02500000"
|
||||
deviceinfo_flash_sparse="true"
|
||||
|
||||
# lk2nd does not support GPT for subpartitions/SD cards yet
|
||||
deviceinfo_partition_type="msdos"
|
||||
@@ -0,0 +1,2 @@
|
||||
earlycon
|
||||
console=ttyMSM0,115200
|
||||
@@ -0,0 +1,5 @@
|
||||
pm8916-lbc
|
||||
pm8916-bms-vm
|
||||
panel-mipi-dbi
|
||||
matrix_keypad
|
||||
matrix_keymap
|
||||
@@ -0,0 +1,34 @@
|
||||
# Based on arch/arm/boot/dts/argon/spi-panel-gc9305-v2-qvga-cmd from
|
||||
# the downstream kernel, which is:
|
||||
# Copyright (c) 2017, The Linux Foundation. All rights reserved.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 and
|
||||
# only version 2 as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
command 0x36 0x00
|
||||
command 0x3a 0x55 # format: 65K 16bit
|
||||
command 0x35 0x00 # TE v-blanking
|
||||
command 0xb2 0x0c 0x0c 0x00 0x33 0x33 # porch setting
|
||||
command 0xb7 0x75 # gate control VGH VGL
|
||||
command 0xbb 0x34 # Vcoms setting 1.4v
|
||||
command 0xc0 0x2c # LCM control
|
||||
command 0xc2 0x01 # VDV VRH COMMAND ENABLE
|
||||
command 0xc3 0x0d # VRH SET
|
||||
command 0xc4 0x20 # VDV SET
|
||||
command 0xc6 0xef # frame rate
|
||||
command 0x44 0x00 0x00 # SET TEARING SCAN LINE
|
||||
command 0xd0 0xa4 0xa1 # power control 1
|
||||
|
||||
# gamma
|
||||
command 0xe0 0xd0 0x02 0x09 0x0d 0x0e 0x19 0x30 0x51 0x43 0x09 0x14 0x13 0x18 0x21
|
||||
command 0xe1 0xd0 0x02 0x09 0x0d 0x0d 0x18 0x32 0x46 0x42 0x09 0x13 0x13 0x17 0x21
|
||||
|
||||
command 0x11 # sleep out
|
||||
delay 120
|
||||
command 0x29 # display on
|
||||
@@ -0,0 +1,2 @@
|
||||
/lib/firmware/nokia,beatles-gc9305-panel.bin
|
||||
/lib/firmware/nokia,argon-gc9305-v2-panel.bin
|
||||
@@ -0,0 +1,31 @@
|
||||
# Reference: <https://postmarketos.org/deviceinfo>
|
||||
deviceinfo_format_version="0"
|
||||
deviceinfo_name="Nokia 2720 Flip"
|
||||
deviceinfo_manufacturer="Nokia"
|
||||
deviceinfo_codename="nokia-beatles"
|
||||
deviceinfo_year="2019"
|
||||
deviceinfo_dtb="qcom-msm8905-nokia-beatles"
|
||||
deviceinfo_append_dtb="true"
|
||||
deviceinfo_arch="armv7"
|
||||
deviceinfo_swap_size_recommended="512"
|
||||
|
||||
# Device related
|
||||
deviceinfo_chassis="handset"
|
||||
deviceinfo_external_storage="true"
|
||||
deviceinfo_screen_width="240"
|
||||
deviceinfo_screen_height="320"
|
||||
deviceinfo_drm="true"
|
||||
|
||||
# Bootloader related
|
||||
deviceinfo_flash_method="fastboot"
|
||||
deviceinfo_generate_bootimg="true"
|
||||
deviceinfo_generate_extlinux_config="true"
|
||||
deviceinfo_flash_pagesize="2048"
|
||||
deviceinfo_header_version="0"
|
||||
deviceinfo_flash_offset_base="0x80000000"
|
||||
deviceinfo_flash_offset_kernel="0x00008000"
|
||||
deviceinfo_flash_offset_ramdisk="0x02700000"
|
||||
deviceinfo_flash_offset_second="0x00f00000"
|
||||
deviceinfo_flash_offset_tags="0x02500000"
|
||||
deviceinfo_flash_sparse="true"
|
||||
deviceinfo_partition_type="msdos"
|
||||
@@ -0,0 +1,2 @@
|
||||
earlycon
|
||||
console=ttyMSM0,115200
|
||||
@@ -0,0 +1,5 @@
|
||||
pm8916-lbc
|
||||
pm8916-bms-vm
|
||||
panel-mipi-dbi
|
||||
matrix_keypad
|
||||
matrix_keymap
|
||||
@@ -0,0 +1,35 @@
|
||||
# Nokia 2720 Flip (nokia-beatles) 2.8-inch 240x320 QVGA SPI MIPI-DBI panel
|
||||
# Based on arch/arm/boot/dts/argon/spi-panel-gc9305-v2-qvga-cmd from
|
||||
# the downstream kernel, which is:
|
||||
# Copyright (c) 2017, The Linux Foundation. All rights reserved.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 and
|
||||
# only version 2 as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
command 0x36 0x00
|
||||
command 0x3a 0x55 # format: 65K 16bit
|
||||
command 0x35 0x00 # TE v-blanking
|
||||
command 0xb2 0x0c 0x0c 0x00 0x33 0x33 # porch setting
|
||||
command 0xb7 0x75 # gate control VGH VGL
|
||||
command 0xbb 0x34 # Vcoms setting 1.4v
|
||||
command 0xc0 0x2c # LCM control
|
||||
command 0xc2 0x01 # VDV VRH COMMAND ENABLE
|
||||
command 0xc3 0x0d # VRH SET
|
||||
command 0xc4 0x20 # VDV SET
|
||||
command 0xc6 0xef # frame rate
|
||||
command 0x44 0x00 0x00 # SET TEARING SCAN LINE
|
||||
command 0xd0 0xa4 0xa1 # power control 1
|
||||
|
||||
# gamma
|
||||
command 0xe0 0xd0 0x02 0x09 0x0d 0x0e 0x19 0x30 0x51 0x43 0x09 0x14 0x13 0x18 0x21
|
||||
command 0xe1 0xd0 0x02 0x09 0x0d 0x0d 0x18 0x32 0x46 0x42 0x09 0x13 0x13 0x17 0x21
|
||||
|
||||
command 0x11 # sleep out
|
||||
delay 120
|
||||
command 0x29 # display on
|
||||
@@ -0,0 +1 @@
|
||||
/lib/firmware/nokia,leo-gc9305-hlt-24-panel.bin
|
||||
@@ -0,0 +1 @@
|
||||
/lib/firmware/nokia,sparkler-gc9307-hlt-28-panel.bin
|
||||
@@ -0,0 +1,62 @@
|
||||
# Reference: <https://postmarketos.org/devicepkg>
|
||||
maintainer=""
|
||||
pkgname=device-nokia-sparkler
|
||||
pkgdesc="Nokia 8000 4G"
|
||||
pkgver=7
|
||||
pkgrel=0
|
||||
url="https://postmarketos.org"
|
||||
license="GPL-2.0-only"
|
||||
arch="armv7"
|
||||
options="!check !archcheck"
|
||||
depends="
|
||||
linux-postmarketos-qcom-msm8916
|
||||
mkbootimg
|
||||
postmarketos-base
|
||||
soc-qcom-msm8909
|
||||
soc-qcom-msm8916-rproc
|
||||
"
|
||||
subpackages="$pkgname-nonfree-firmware:nonfree_firmware"
|
||||
makedepends="devicepkg-dev mipi-dbi-cmd"
|
||||
_panel="nokia,sparkler-gc9307-hlt-28-panel"
|
||||
source="
|
||||
$_panel.txt
|
||||
00-nokia-sparkler-display.files
|
||||
deviceinfo
|
||||
kernel-cmdline.conf
|
||||
modules-initfs
|
||||
"
|
||||
|
||||
build() {
|
||||
devicepkg_build $startdir $pkgname
|
||||
mkdir -p "$builddir"
|
||||
mipi-dbi-cmd "$builddir"/"$_panel".bin \
|
||||
"$srcdir"/"$_panel".txt
|
||||
}
|
||||
|
||||
package() {
|
||||
devicepkg_package $startdir $pkgname
|
||||
# Package display init sequence
|
||||
install -Dm644 "$builddir"/"$_panel".bin -t \
|
||||
"$pkgdir"/lib/firmware/
|
||||
install -Dm644 "$srcdir"/00-nokia-sparkler-display.files -t \
|
||||
"$pkgdir"/usr/share/mkinitfs/files/
|
||||
}
|
||||
|
||||
nonfree_firmware() {
|
||||
pkgdesc="GPU/WiFi/BT/Modem/Video firmware"
|
||||
depends="
|
||||
firmware-qcom-adreno-a300
|
||||
msm-firmware-loader
|
||||
firmware-nokia-sparkler-venus
|
||||
firmware-nokia-sparkler-wcnss-nv
|
||||
"
|
||||
mkdir "$subpkgdir"
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
721d740ff8dbbbafff4bc734228a82bd57d76177b9bf417d660ecb181a72a998319ddbde77d0efc5e875d2256596578212e3e0bfb85c2e77e5bbf6d0e88d9fa4 nokia,sparkler-gc9307-hlt-28-panel.txt
|
||||
89b3dd5bf1dd5e85bf66bfb6dba56e2a8e919fe3aa7dc369c18c9e56f7e0ae88319186551412497a601081b904c12dd07ebed4f39fd4a4ba6199fb8af9c90f40 00-nokia-sparkler-display.files
|
||||
5df56915a719654bd6d23b127c2d55b0445e731a0d1648c1c48188b0f84e62d1f83f34f2dbfe5e2c694525579cbe438e3a5b66cece6047b53dc9a2995a6fbfb2 deviceinfo
|
||||
37e1e5f8839b624ab3eb850a24ed4daeb61a651257a1fb593f49cb869323e5d1b339c831a18eb26a9d7bd0a618ea9eb2bb9bf3882133af5f2606a878e6d39c67 kernel-cmdline.conf
|
||||
d5dfe844a45cfc4e0844e43b8fb3e1bbcb155e06430188f8d5059fc5ce3c4100fde7f1580b1b54c5318f40d238736b233463582e55b9dd25654e40539e11ed39 modules-initfs
|
||||
"
|
||||
@@ -0,0 +1,62 @@
|
||||
# Reference: <https://postmarketos.org/devicepkg>
|
||||
maintainer=""
|
||||
pkgname=device-nokia-leo
|
||||
pkgdesc="Nokia 6300 4G"
|
||||
pkgver=7
|
||||
pkgrel=0
|
||||
url="https://postmarketos.org"
|
||||
license="GPL-2.0-only"
|
||||
arch="armv7"
|
||||
options="!check !archcheck"
|
||||
depends="
|
||||
linux-postmarketos-qcom-msm8916
|
||||
mkbootimg
|
||||
postmarketos-base
|
||||
soc-qcom-msm8909
|
||||
soc-qcom-msm8916-rproc
|
||||
"
|
||||
subpackages="$pkgname-nonfree-firmware:nonfree_firmware"
|
||||
makedepends="devicepkg-dev mipi-dbi-cmd"
|
||||
_panel="nokia,leo-gc9305-hlt-24-panel"
|
||||
source="
|
||||
$_panel.txt
|
||||
00-nokia-leo-display.files
|
||||
deviceinfo
|
||||
kernel-cmdline.conf
|
||||
modules-initfs
|
||||
"
|
||||
|
||||
build() {
|
||||
devicepkg_build $startdir $pkgname
|
||||
mkdir -p "$builddir"
|
||||
mipi-dbi-cmd "$builddir"/"$_panel".bin \
|
||||
"$srcdir"/"$_panel".txt
|
||||
}
|
||||
|
||||
package() {
|
||||
devicepkg_package $startdir $pkgname
|
||||
# Package display init sequence
|
||||
install -Dm644 "$builddir"/"$_panel".bin -t \
|
||||
"$pkgdir"/lib/firmware/
|
||||
install -Dm644 "$srcdir"/00-nokia-leo-display.files -t \
|
||||
"$pkgdir"/usr/share/mkinitfs/files/
|
||||
}
|
||||
|
||||
nonfree_firmware() {
|
||||
pkgdesc="GPU/WiFi/BT/Modem/Video firmware"
|
||||
depends="
|
||||
firmware-qcom-adreno-a300
|
||||
msm-firmware-loader
|
||||
firmware-nokia-sparkler-venus
|
||||
firmware-nokia-sparkler-wcnss-nv
|
||||
"
|
||||
mkdir "$subpkgdir"
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
8583c7d5a97c4efedff3ec554cf682d815fd7b83140c2cab9eec4b6e2e735ce3c012bc3bd97f8bc75adc3483f76ce83a5bf1090d4f3e73a327efc64ca9eca5a7 nokia,leo-gc9305-hlt-24-panel.txt
|
||||
c9985232e5e64ddb0906b053e5024c87fa62cc1bcb254260e1ef6afb43d384196e09d41287143bcba61dff616dd6b562a5ca335dbe592fcd8c954642b8085f38 00-nokia-leo-display.files
|
||||
34c6269610e41b51b31b293cc3777a2af1776375617aecf001347e8d7e05a13b8bcf4ce82e13938a219493d780003631076dbd2f3f6fd26c249ec96b1b36219e deviceinfo
|
||||
37e1e5f8839b624ab3eb850a24ed4daeb61a651257a1fb593f49cb869323e5d1b339c831a18eb26a9d7bd0a618ea9eb2bb9bf3882133af5f2606a878e6d39c67 kernel-cmdline.conf
|
||||
d5dfe844a45cfc4e0844e43b8fb3e1bbcb155e06430188f8d5059fc5ce3c4100fde7f1580b1b54c5318f40d238736b233463582e55b9dd25654e40539e11ed39 modules-initfs
|
||||
"
|
||||
@@ -0,0 +1,35 @@
|
||||
# Reference: <https://postmarketos.org/deviceinfo>
|
||||
# Please use double quotes only. You can source this file in shell
|
||||
# scripts.
|
||||
|
||||
deviceinfo_format_version="0"
|
||||
deviceinfo_name="Nokia 8000 4G"
|
||||
deviceinfo_manufacturer="Nokia"
|
||||
deviceinfo_codename="nokia-sparkler"
|
||||
deviceinfo_year="2020"
|
||||
deviceinfo_dtb="qcom-msm8909-nokia-sparkler"
|
||||
deviceinfo_append_dtb="true"
|
||||
deviceinfo_arch="armv7"
|
||||
deviceinfo_swap_size_recommended="512"
|
||||
|
||||
# Device related
|
||||
deviceinfo_chassis="handset"
|
||||
deviceinfo_external_storage="true"
|
||||
deviceinfo_screen_width="240"
|
||||
deviceinfo_screen_height="320"
|
||||
|
||||
# Bootloader related
|
||||
deviceinfo_flash_method="fastboot"
|
||||
deviceinfo_generate_bootimg="true"
|
||||
deviceinfo_generate_extlinux_config="true"
|
||||
deviceinfo_flash_pagesize="2048"
|
||||
deviceinfo_header_version="0"
|
||||
deviceinfo_flash_offset_base="0x80000000"
|
||||
deviceinfo_flash_offset_kernel="0x00008000"
|
||||
deviceinfo_flash_offset_ramdisk="0x02700000"
|
||||
deviceinfo_flash_offset_second="0x00f00000"
|
||||
deviceinfo_flash_offset_tags="0x02500000"
|
||||
deviceinfo_flash_sparse="true"
|
||||
|
||||
# lk2nd does not support GPT for subpartitions/SD cards yet
|
||||
deviceinfo_partition_type="msdos"
|
||||
@@ -0,0 +1,35 @@
|
||||
# Reference: <https://postmarketos.org/deviceinfo>
|
||||
# Please use double quotes only. You can source this file in shell
|
||||
# scripts.
|
||||
|
||||
deviceinfo_format_version="0"
|
||||
deviceinfo_name="Nokia 6300 4G"
|
||||
deviceinfo_manufacturer="Nokia"
|
||||
deviceinfo_codename="nokia-leo"
|
||||
deviceinfo_year="2020"
|
||||
deviceinfo_dtb="qcom-msm8909-nokia-leo"
|
||||
deviceinfo_append_dtb="true"
|
||||
deviceinfo_arch="armv7"
|
||||
deviceinfo_swap_size_recommended="512"
|
||||
|
||||
# Device related
|
||||
deviceinfo_chassis="handset"
|
||||
deviceinfo_external_storage="true"
|
||||
deviceinfo_screen_width="240"
|
||||
deviceinfo_screen_height="320"
|
||||
|
||||
# Bootloader related
|
||||
deviceinfo_flash_method="fastboot"
|
||||
deviceinfo_generate_bootimg="true"
|
||||
deviceinfo_generate_extlinux_config="true"
|
||||
deviceinfo_flash_pagesize="2048"
|
||||
deviceinfo_header_version="0"
|
||||
deviceinfo_flash_offset_base="0x80000000"
|
||||
deviceinfo_flash_offset_kernel="0x00008000"
|
||||
deviceinfo_flash_offset_ramdisk="0x02700000"
|
||||
deviceinfo_flash_offset_second="0x00f00000"
|
||||
deviceinfo_flash_offset_tags="0x02500000"
|
||||
deviceinfo_flash_sparse="true"
|
||||
|
||||
# lk2nd does not support GPT for subpartitions/SD cards yet
|
||||
deviceinfo_partition_type="msdos"
|
||||
@@ -0,0 +1,2 @@
|
||||
earlycon
|
||||
console=ttyMSM0,115200
|
||||
@@ -0,0 +1,3 @@
|
||||
pm8916-lbc
|
||||
pm8916-bms-vm
|
||||
panel-mipi-dbi
|
||||
@@ -0,0 +1,69 @@
|
||||
# Based on arch/arm64/boot/dts/qcom/spi-panel-gc9305-hlt-24-qvga-cmd.dtsi from
|
||||
# the downstream kernel, which is:
|
||||
# Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 and
|
||||
# only version 2 as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
command 0xfe
|
||||
command 0xfe
|
||||
command 0xef
|
||||
command 0x35 0x00
|
||||
command 0x36 0x48
|
||||
command 0x3a 0x05
|
||||
command 0x20
|
||||
command 0x38
|
||||
command 0x13
|
||||
command 0xa4 0x44 0x44
|
||||
command 0xa5 0x42 0x42
|
||||
command 0xa6 0x2a 0x2a
|
||||
command 0xa7 0x2b 0x2b
|
||||
command 0xa8 0x18 0x18
|
||||
command 0xa9 0x2a 0x2a
|
||||
command 0xaa 0x88 0x88
|
||||
command 0xac 0x00
|
||||
command 0xaf 0x55
|
||||
command 0xe1 0x10 0x26
|
||||
command 0xe3 0x01 0x10
|
||||
command 0xe8 0x11 0x77
|
||||
command 0xe0 0x0f
|
||||
command 0xe4 0x00
|
||||
command 0xe5 0x00
|
||||
command 0xe6 0x00
|
||||
command 0xe7 0x00 0x00
|
||||
command 0xea 0x51 0x95 0x00 0x00 0x00 0x00 0x00
|
||||
command 0xeb 0x30
|
||||
command 0xec 0x33 0x22 0x88
|
||||
command 0xed 0x18 0x08
|
||||
command 0xee 0x00
|
||||
command 0xa0 0x00
|
||||
command 0xa1 0x00
|
||||
command 0xa2 0x00
|
||||
command 0xa3 0x00
|
||||
command 0xab 0x00 0x00
|
||||
command 0xad 0x33
|
||||
command 0xae 0x2b
|
||||
command 0xde 0x00
|
||||
command 0xff 0x61
|
||||
command 0xdf 0x08
|
||||
command 0xb6 0x00 0x80 0x27
|
||||
command 0xf0 0x02 0x01 0x00 0x00 0x03 0x07
|
||||
command 0xf1 0x01 0x01 0x00 0x02 0x06 0x0e
|
||||
command 0xf2 0x08 0x06 0x32 0x03 0x04 0x46
|
||||
command 0xf3 0x10 0x0c 0x3e 0x06 0x03 0x4f
|
||||
command 0xf4 0x0b 0x16 0x15 0x1d 0x1e 0x0f
|
||||
command 0xf5 0x08 0x15 0x15 0x1b 0x1c 0x0f
|
||||
command 0xfd 0x00
|
||||
command 0x2a 0x00 0x00 0x00 0xef
|
||||
command 0x2b 0x00 0x00 0x01 0x3f
|
||||
command 0x44 0x00 0x40
|
||||
|
||||
command 0x11 # exit sleep mode
|
||||
delay 120
|
||||
command 0x29 # display on
|
||||
@@ -0,0 +1,26 @@
|
||||
# Based on arch/arm64/boot/dts/qcom/spi-panel-gc9307-hlt-28-qvga-cmd.dtsi from
|
||||
# the downstream kernel, which is:
|
||||
# Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 and
|
||||
# only version 2 as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
command 0x11 # exit sleep mode
|
||||
delay 120
|
||||
command 0xfe
|
||||
command 0xef
|
||||
command 0x13
|
||||
command 0x38
|
||||
command 0x20
|
||||
command 0x36 0x00
|
||||
command 0x3a 0x05
|
||||
command 0x35 0x00
|
||||
command 0x89 0x0b
|
||||
command 0xeb 0x02
|
||||
command 0x29 # display on
|
||||
@@ -0,0 +1,2 @@
|
||||
/lib/firmware/nokia,coconut-gc9305-panel.bin
|
||||
/lib/firmware/nokia,argon-gc9305-v2-panel.bin
|
||||
@@ -0,0 +1,31 @@
|
||||
# Reference: <https://postmarketos.org/deviceinfo>
|
||||
deviceinfo_format_version="0"
|
||||
deviceinfo_name="Nokia 800 Tough"
|
||||
deviceinfo_manufacturer="Nokia"
|
||||
deviceinfo_codename="nokia-coconut"
|
||||
deviceinfo_year="2019"
|
||||
deviceinfo_dtb="qcom-msm8905-nokia-coconut"
|
||||
deviceinfo_append_dtb="true"
|
||||
deviceinfo_arch="armv7"
|
||||
deviceinfo_swap_size_recommended="512"
|
||||
|
||||
# Device related
|
||||
deviceinfo_chassis="handset"
|
||||
deviceinfo_external_storage="true"
|
||||
deviceinfo_screen_width="240"
|
||||
deviceinfo_screen_height="320"
|
||||
deviceinfo_drm="true"
|
||||
|
||||
# Bootloader related
|
||||
deviceinfo_flash_method="fastboot"
|
||||
deviceinfo_generate_bootimg="true"
|
||||
deviceinfo_generate_extlinux_config="true"
|
||||
deviceinfo_flash_pagesize="2048"
|
||||
deviceinfo_header_version="0"
|
||||
deviceinfo_flash_offset_base="0x80000000"
|
||||
deviceinfo_flash_offset_kernel="0x00008000"
|
||||
deviceinfo_flash_offset_ramdisk="0x02700000"
|
||||
deviceinfo_flash_offset_second="0x00f00000"
|
||||
deviceinfo_flash_offset_tags="0x02500000"
|
||||
deviceinfo_flash_sparse="true"
|
||||
deviceinfo_partition_type="msdos"
|
||||
@@ -0,0 +1,2 @@
|
||||
earlycon
|
||||
console=ttyMSM0,115200
|
||||
@@ -0,0 +1,5 @@
|
||||
pm8916-lbc
|
||||
pm8916-bms-vm
|
||||
panel-mipi-dbi
|
||||
matrix_keypad
|
||||
matrix_keymap
|
||||
@@ -0,0 +1,35 @@
|
||||
# Nokia 800 Tough (nokia-coconut) 2.4-inch 240x320 QVGA SPI MIPI-DBI panel
|
||||
# Based on arch/arm/boot/dts/argon/spi-panel-gc9305-v2-qvga-cmd from
|
||||
# the downstream kernel, which is:
|
||||
# Copyright (c) 2017, The Linux Foundation. All rights reserved.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 and
|
||||
# only version 2 as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
command 0x36 0x00
|
||||
command 0x3a 0x55 # format: 65K 16bit
|
||||
command 0x35 0x00 # TE v-blanking
|
||||
command 0xb2 0x0c 0x0c 0x00 0x33 0x33 # porch setting
|
||||
command 0xb7 0x75 # gate control VGH VGL
|
||||
command 0xbb 0x34 # Vcoms setting 1.4v
|
||||
command 0xc0 0x2c # LCM control
|
||||
command 0xc2 0x01 # VDV VRH COMMAND ENABLE
|
||||
command 0xc3 0x0d # VRH SET
|
||||
command 0xc4 0x20 # VDV SET
|
||||
command 0xc6 0xef # frame rate
|
||||
command 0x44 0x00 0x00 # SET TEARING SCAN LINE
|
||||
command 0xd0 0xa4 0xa1 # power control 1
|
||||
|
||||
# gamma
|
||||
command 0xe0 0xd0 0x02 0x09 0x0d 0x0e 0x19 0x30 0x51 0x43 0x09 0x14 0x13 0x18 0x21
|
||||
command 0xe1 0xd0 0x02 0x09 0x0d 0x0d 0x18 0x32 0x46 0x42 0x09 0x13 0x13 0x17 0x21
|
||||
|
||||
command 0x11 # sleep out
|
||||
delay 120
|
||||
command 0x29 # display on
|
||||
@@ -0,0 +1,480 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Automated Qualcomm EDL Sahara/Firehose Flasher for Bananarchy Linux (MSM8909)."""
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
import usb.core
|
||||
|
||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
sys.path.insert(0, os.path.join(BASE_DIR, "edl"))
|
||||
|
||||
from Library.usb import usb_class
|
||||
from Library.gpt import gpt
|
||||
from Library.sahara import qualcomm_sahara
|
||||
from Library.firehose import qualcomm_firehose, xmlparser
|
||||
|
||||
|
||||
DEVICE_LABELS = {
|
||||
"nokia-argon": "Nokia 8110 4G (nokia-argon)",
|
||||
"nokia-beatles": "Nokia 2720 Flip (nokia-beatles)",
|
||||
"nokia-tough": "Nokia 800 Tough (nokia-coconut)",
|
||||
"nokia-sparkler": "Nokia 8000 4G (nokia-sparkler)",
|
||||
"nokia-leo": "Nokia 6300 4G (nokia-leo)",
|
||||
}
|
||||
|
||||
|
||||
def try_kick_into_edl():
|
||||
try:
|
||||
res = subprocess.run(
|
||||
["adb", "get-state"],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.DEVNULL,
|
||||
text=True,
|
||||
timeout=2,
|
||||
)
|
||||
if res.returncode == 0 and "device" in res.stdout:
|
||||
print("[*] Detected device in ADB mode. Sending 'adb reboot edl'...")
|
||||
subprocess.run(["adb", "reboot", "edl"], timeout=5)
|
||||
time.sleep(1)
|
||||
return
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
try:
|
||||
res = subprocess.run(
|
||||
["fastboot", "devices"],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.DEVNULL,
|
||||
text=True,
|
||||
timeout=2,
|
||||
)
|
||||
if res.returncode == 0 and res.stdout.strip():
|
||||
print("[*] Detected device in Fastboot mode. Sending 'fastboot oem edl'...")
|
||||
subprocess.run(["fastboot", "oem", "edl"], timeout=5)
|
||||
time.sleep(1)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
def wait_for_edl_usb(vid, pid, device_label, timeout_sec=0):
|
||||
cdc = usb_class(vid=vid, pid=pid)
|
||||
try_kick_into_edl()
|
||||
|
||||
print(
|
||||
f"[*] Waiting for {device_label} in EDL mode "
|
||||
f"(USB {vid:04x}:{pid:04x} Qualcomm QDLoader 9008)..."
|
||||
)
|
||||
print(" To enter EDL mode on the phone, use one of:")
|
||||
print(" 1) Power off, hold D-Pad Up + D-Pad Down, and plug in USB")
|
||||
print(" 2) Plug in via an EDL deep-flash cable")
|
||||
print(" 3) Run 'adb reboot edl' or 'fastboot oem edl'")
|
||||
|
||||
start_ts = time.time()
|
||||
dots = 0
|
||||
while not cdc.connected:
|
||||
try:
|
||||
cdc.connected = cdc.connect()
|
||||
except usb.core.USBError as exc:
|
||||
if getattr(exc, "errno", None) == 13:
|
||||
print(
|
||||
"\n[!] Error: USB permission denied when opening 05c6:9008. "
|
||||
"Please run via sudo (e.g. sudo ./flash-edl.sh)."
|
||||
)
|
||||
sys.exit(1)
|
||||
time.sleep(0.5)
|
||||
continue
|
||||
|
||||
if cdc.connected:
|
||||
if dots > 0:
|
||||
sys.stdout.write("\n")
|
||||
print("[+] USB EDL device connected.")
|
||||
return cdc
|
||||
|
||||
if timeout_sec > 0 and (time.time() - start_ts) >= timeout_sec:
|
||||
if dots > 0:
|
||||
sys.stdout.write("\n")
|
||||
print(f"[!] Timed out after {timeout_sec} seconds waiting for EDL device.")
|
||||
sys.exit(1)
|
||||
|
||||
if dots > 0 and dots % 10 == 0:
|
||||
try_kick_into_edl()
|
||||
|
||||
sys.stdout.write(".")
|
||||
sys.stdout.flush()
|
||||
dots += 1
|
||||
if dots % 40 == 0:
|
||||
sys.stdout.write("\n")
|
||||
time.sleep(1)
|
||||
|
||||
return cdc
|
||||
|
||||
|
||||
def find_partition(partentries, name):
|
||||
for entry in partentries:
|
||||
if entry.name == name:
|
||||
return entry
|
||||
return None
|
||||
|
||||
|
||||
def write_partition(fh, lun, part, filepath):
|
||||
size = os.stat(filepath).st_size
|
||||
sector_size = fh.cfg.SECTOR_SIZE_IN_BYTES
|
||||
sectors = size // sector_size
|
||||
if (size % sector_size) > 0:
|
||||
sectors += 1
|
||||
|
||||
if sectors > part.sectors:
|
||||
print(
|
||||
f"[!] Error: {filepath} requires {sectors} sectors, "
|
||||
f"but partition '{part.name}' only has {part.sectors} sectors."
|
||||
)
|
||||
return False
|
||||
|
||||
print(
|
||||
f"[*] Flashing '{part.name}' (start sector {part.sector}, "
|
||||
f"{sectors}/{part.sectors} sectors, {size / (1024 * 1024):.1f} MiB) "
|
||||
f"from {filepath}..."
|
||||
)
|
||||
ok = fh.cmd_write(lun, part.sector, filepath, Display=True)
|
||||
if not ok:
|
||||
print(f"[!] Failed writing {filepath} to partition '{part.name}'.")
|
||||
return False
|
||||
print(f"[+] Successfully flashed '{part.name}'.")
|
||||
return True
|
||||
|
||||
|
||||
def dump_partition(fh, lun, part, filepath):
|
||||
size_mib = (part.sectors * fh.cfg.SECTOR_SIZE_IN_BYTES) / (1024 * 1024)
|
||||
print(
|
||||
f"[*] Backing up '{part.name}' (sector {part.sector}, "
|
||||
f"{part.sectors} sectors, {size_mib:.2f} MiB) -> {filepath}..."
|
||||
)
|
||||
res = fh.cmd_read(lun, part.sector, part.sectors, filepath, Display=True)
|
||||
if res == "" or not os.path.exists(filepath) or os.stat(filepath).st_size == 0:
|
||||
print(f"[!] Failed backing up partition '{part.name}'.")
|
||||
return False
|
||||
print(f"[+] Saved backup: {filepath}")
|
||||
return True
|
||||
|
||||
|
||||
def resolve_default_loader():
|
||||
for cand in [
|
||||
os.path.join(BASE_DIR, "bootloader", "loaders", "8110.mbn"),
|
||||
os.path.join(BASE_DIR, "8110.mbn"),
|
||||
]:
|
||||
if os.path.isfile(cand):
|
||||
return cand
|
||||
return os.path.join(BASE_DIR, "bootloader", "loaders", "8110.mbn")
|
||||
|
||||
|
||||
def resolve_default_bootloader():
|
||||
for cand in [
|
||||
os.path.join(BASE_DIR, "bootloader", "lk2nd-msm8909.img"),
|
||||
os.path.join(BASE_DIR, "lk2nd-msm8909.img"),
|
||||
]:
|
||||
if os.path.isfile(cand):
|
||||
return cand
|
||||
return os.path.join(BASE_DIR, "bootloader", "lk2nd-msm8909.img")
|
||||
|
||||
|
||||
def resolve_default_image(device):
|
||||
candidates = [
|
||||
os.path.join(BASE_DIR, "images", f"bananarchy-{device}.img"),
|
||||
os.path.join(BASE_DIR, "images", "nokia-argon-sxmo.img"),
|
||||
]
|
||||
for cand in candidates:
|
||||
if os.path.isfile(cand):
|
||||
return cand
|
||||
return candidates[0]
|
||||
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Automated EDL Flasher for Bananarchy Linux (MSM8909 / Sxmo)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"device_pos",
|
||||
nargs="?",
|
||||
choices=[
|
||||
"sxmo",
|
||||
"nokia-argon",
|
||||
"nokia-beatles",
|
||||
"nokia-tough",
|
||||
"nokia-sparkler",
|
||||
"nokia-leo",
|
||||
],
|
||||
default=None,
|
||||
help="Target device to flash (default: nokia-argon)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--device",
|
||||
choices=[
|
||||
"nokia-argon",
|
||||
"nokia-beatles",
|
||||
"nokia-tough",
|
||||
"nokia-sparkler",
|
||||
"nokia-leo",
|
||||
],
|
||||
default="nokia-argon",
|
||||
help="Target MSM8909 device (default: nokia-argon)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--image",
|
||||
default="",
|
||||
help="Explicit path to raw userdata image (overrides --device)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--bootloader",
|
||||
default=resolve_default_bootloader(),
|
||||
help="Path to lk2nd boot image",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--loader",
|
||||
default=resolve_default_loader(),
|
||||
help="Path to Firehose programmer (.mbn)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--backup-dir",
|
||||
default=os.path.join(BASE_DIR, "backup"),
|
||||
help="Directory for partition backups (default: ./backup)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--skip-backup",
|
||||
action="store_true",
|
||||
help="Skip backing up critical partitions before flashing",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--force-backup",
|
||||
action="store_true",
|
||||
help="Re-dump backup partitions even if backup files already exist",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--backup-modem",
|
||||
action="store_true",
|
||||
help="Also back up the 64 MiB modem partition into backup-dir",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--no-wipe-system",
|
||||
action="store_true",
|
||||
help="Do not zero the stock system partition superblock",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--no-reset",
|
||||
action="store_true",
|
||||
help="Do not reboot the phone automatically after flashing",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--timeout",
|
||||
type=int,
|
||||
default=0,
|
||||
help="Timeout in seconds while waiting for USB connection (0 = infinite)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--vid",
|
||||
default="0x05C6",
|
||||
help="USB Vendor ID (default: 0x05C6)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--pid",
|
||||
default="0x9008",
|
||||
help="USB Product ID (default: 0x9008)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--lun",
|
||||
type=int,
|
||||
default=0,
|
||||
help="Storage LUN number (default: 0)",
|
||||
)
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def main():
|
||||
args = parse_args()
|
||||
device = args.device_pos if args.device_pos and args.device_pos != "sxmo" else args.device
|
||||
device_label = DEVICE_LABELS.get(device, device)
|
||||
userdata_img = (
|
||||
os.path.abspath(args.image)
|
||||
if args.image
|
||||
else os.path.abspath(resolve_default_image(device))
|
||||
)
|
||||
bootloader_img = os.path.abspath(args.bootloader)
|
||||
loader_mbn = os.path.abspath(args.loader)
|
||||
backup_dir = os.path.abspath(args.backup_dir)
|
||||
|
||||
print("============================================================")
|
||||
print(" Bananarchy Linux (MSM8909 / Sxmo) Automated EDL Flasher")
|
||||
print("============================================================")
|
||||
print(f" Target Device : {device_label}")
|
||||
print(f" Target UI : Sxmo (240x320 native, Multi-Mode T9)")
|
||||
print(f" Firehose Loader : {loader_mbn}")
|
||||
print(f" Bootloader (boot): {bootloader_img}")
|
||||
print(f" System (userdata): {userdata_img}")
|
||||
print(
|
||||
f" Partition Backup: "
|
||||
f"{'disabled (--skip-backup)' if args.skip_backup else backup_dir}"
|
||||
)
|
||||
print("============================================================")
|
||||
|
||||
for label, path in [
|
||||
("Firehose programmer", loader_mbn),
|
||||
("lk2nd bootloader image", bootloader_img),
|
||||
("System userdata image", userdata_img),
|
||||
]:
|
||||
if not os.path.isfile(path) or os.stat(path).st_size == 0:
|
||||
print(f"[!] Error: {label} not found or empty at: {path}")
|
||||
sys.exit(1)
|
||||
|
||||
vid = int(args.vid, 16)
|
||||
pid = int(args.pid, 16)
|
||||
cdc = wait_for_edl_usb(vid, pid, device_label, timeout_sec=args.timeout)
|
||||
|
||||
sahara = qualcomm_sahara(cdc)
|
||||
with open(loader_mbn, "rb") as rf:
|
||||
sahara.programmer = rf.read()
|
||||
|
||||
mode = sahara.connect()
|
||||
print(f"[*] Device protocol mode: {mode}")
|
||||
|
||||
if mode == "Sahara":
|
||||
sahara.info()
|
||||
print(f"[*] Uploading Firehose programmer ({os.path.basename(loader_mbn)})...")
|
||||
if not sahara.upload_firehoseloader():
|
||||
print("[!] Error: Failed to upload Firehose programmer via Sahara.")
|
||||
sys.exit(1)
|
||||
time.sleep(0.3)
|
||||
mode = "Firehose"
|
||||
print("[+] Firehose programmer uploaded and active.")
|
||||
elif mode == "Firehose":
|
||||
if len(sahara.programmer) > 4 and sahara.programmer[:4] == b"\x7fELF":
|
||||
sahara.bit64 = sahara.programmer[4] == 2
|
||||
else:
|
||||
sahara.bit64 = False
|
||||
print("[+] Device is already in Firehose mode.")
|
||||
else:
|
||||
print(
|
||||
f"[!] Error: Could not establish Sahara or Firehose mode (got '{mode}'). "
|
||||
"Please power-cycle the phone back into EDL mode and retry."
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
xml = xmlparser()
|
||||
cfg = qualcomm_firehose.cfg()
|
||||
cfg.MemoryName = "eMMC"
|
||||
cfg.ZLPAwareHost = 1
|
||||
cfg.SkipStorageInit = False
|
||||
cfg.SkipWrite = False
|
||||
cfg.MaxPayloadSizeToTargetInBytes = 1048576
|
||||
cfg.SECTOR_SIZE_IN_BYTES = 512
|
||||
cfg.bit64 = sahara.bit64
|
||||
|
||||
fh = qualcomm_firehose(cdc, xml, cfg)
|
||||
print("[*] Connecting to Firehose storage controller...")
|
||||
fh.connect(0)
|
||||
|
||||
print("[*] Reading GPT partition table from eMMC...")
|
||||
gpt_sectors = 0x4000 // fh.cfg.SECTOR_SIZE_IN_BYTES
|
||||
gpt_raw = fh.cmd_read_buffer(args.lun, 0, gpt_sectors, Display=False)
|
||||
if not gpt_raw:
|
||||
print("[!] Error: Failed to read GPT partition table from device.")
|
||||
sys.exit(1)
|
||||
|
||||
guid_gpt = gpt()
|
||||
if not guid_gpt.parse(gpt_raw, fh.cfg.SECTOR_SIZE_IN_BYTES):
|
||||
print("[!] Error: Failed to parse GPT partition table.")
|
||||
sys.exit(1)
|
||||
|
||||
boot_part = find_partition(guid_gpt.partentries, "boot")
|
||||
userdata_part = find_partition(guid_gpt.partentries, "userdata")
|
||||
system_part = find_partition(guid_gpt.partentries, "system")
|
||||
|
||||
if not boot_part:
|
||||
print("[!] Error: Partition 'boot' not found in device GPT.")
|
||||
sys.exit(1)
|
||||
if not userdata_part:
|
||||
print("[!] Error: Partition 'userdata' not found in device GPT.")
|
||||
sys.exit(1)
|
||||
|
||||
print(
|
||||
f"[+] Found 'boot' : sector {boot_part.sector}, "
|
||||
f"{boot_part.sectors} sectors "
|
||||
f"({(boot_part.sectors * fh.cfg.SECTOR_SIZE_IN_BYTES) / (1024 * 1024):.1f} MiB)"
|
||||
)
|
||||
print(
|
||||
f"[+] Found 'userdata' : sector {userdata_part.sector}, "
|
||||
f"{userdata_part.sectors} sectors "
|
||||
f"({(userdata_part.sectors * fh.cfg.SECTOR_SIZE_IN_BYTES) / (1024 * 1024):.1f} MiB)"
|
||||
)
|
||||
|
||||
if not args.skip_backup:
|
||||
os.makedirs(backup_dir, exist_ok=True)
|
||||
gpt_backup_path = os.path.join(backup_dir, "gpt.bin")
|
||||
if args.force_backup or not os.path.exists(gpt_backup_path):
|
||||
with open(gpt_backup_path, "wb") as wf:
|
||||
wf.write(gpt_raw)
|
||||
print(f"[+] Saved GPT backup: {gpt_backup_path}")
|
||||
|
||||
backup_parts = ["fsc", "fsg", "modemst1", "modemst2", "persist", "boot"]
|
||||
if args.backup_modem:
|
||||
backup_parts.append("modem")
|
||||
|
||||
for pname in backup_parts:
|
||||
part = find_partition(guid_gpt.partentries, pname)
|
||||
if not part:
|
||||
print(f"[!] Warning: Partition '{pname}' not found in GPT; skipping backup.")
|
||||
continue
|
||||
dest_file = os.path.join(backup_dir, f"{pname}.img")
|
||||
if (
|
||||
not args.force_backup
|
||||
and os.path.exists(dest_file)
|
||||
and os.stat(dest_file).st_size > 0
|
||||
):
|
||||
print(f"[*] Backup already exists for '{pname}' ({dest_file}); skipping.")
|
||||
continue
|
||||
if not dump_partition(fh, args.lun, part, dest_file):
|
||||
sys.exit(1)
|
||||
|
||||
print("\n[*] Step 1/3: Flashing lk2nd secondary bootloader to 'boot'...")
|
||||
if not write_partition(fh, args.lun, boot_part, bootloader_img):
|
||||
sys.exit(1)
|
||||
|
||||
print(f"\n[*] Step 2/3: Flashing Bananarchy Linux ({device}) image to 'userdata'...")
|
||||
if not write_partition(fh, args.lun, userdata_part, userdata_img):
|
||||
sys.exit(1)
|
||||
|
||||
if not args.no_wipe_system and system_part:
|
||||
print(
|
||||
"\n[*] Step 3/3: Clearing stock 'system' superblock "
|
||||
"(first 64 sectors / 32 KiB)..."
|
||||
)
|
||||
with tempfile.NamedTemporaryFile(prefix="wipe-system-", delete=False) as tf:
|
||||
tf.write(b"\x00" * (64 * fh.cfg.SECTOR_SIZE_IN_BYTES))
|
||||
zero_path = tf.name
|
||||
try:
|
||||
if not fh.cmd_write(args.lun, system_part.sector, zero_path, Display=False):
|
||||
print("[!] Warning: Could not clear 'system' superblock; continuing.")
|
||||
else:
|
||||
print("[+] Cleared stock 'system' superblock.")
|
||||
finally:
|
||||
if os.path.exists(zero_path):
|
||||
os.unlink(zero_path)
|
||||
else:
|
||||
print("\n[*] Step 3/3: Skipping 'system' superblock wipe.")
|
||||
|
||||
if not args.no_reset:
|
||||
print(f"\n[*] Resetting and booting {device_label}...")
|
||||
fh.cmd_reset()
|
||||
|
||||
print("\n============================================================")
|
||||
print(" BANANARCHY EDL FLASHING COMPLETED SUCCESSFULLY")
|
||||
print("============================================================")
|
||||
print(" The phone will now boot via lk2nd into Bananarchy Linux (Sxmo).")
|
||||
print(" Default login: user / 147147 | USB SSH: ssh user@172.16.42.1")
|
||||
print("============================================================")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,43 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
BASE_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
PYTHON_BIN="${PYTHON_BIN:-python3}"
|
||||
FLASHER_PY="$BASE_DIR/flash-edl.py"
|
||||
|
||||
for arg in "$@"; do
|
||||
if [ "$arg" = "-h" ] || [ "$arg" = "--help" ]; then
|
||||
exec "$PYTHON_BIN" "$FLASHER_PY" "$@"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
if command -v sudo >/dev/null 2>&1; then
|
||||
echo "[*] Elevating privileges via sudo for raw USB EDL (05c6:9008) access..."
|
||||
exec sudo "$0" "$@"
|
||||
else
|
||||
echo "[!] Warning: Not running as root and 'sudo' not found. Continuing..."
|
||||
fi
|
||||
fi
|
||||
|
||||
MM_WAS_ACTIVE=0
|
||||
if command -v systemctl >/dev/null 2>&1; then
|
||||
if systemctl is-active --quiet ModemManager 2>/dev/null; then
|
||||
echo "[*] Temporarily stopping host ModemManager service during EDL flash..."
|
||||
systemctl stop ModemManager 2>/dev/null || true
|
||||
MM_WAS_ACTIVE=1
|
||||
fi
|
||||
fi
|
||||
|
||||
cleanup() {
|
||||
if [ -n "${SUDO_UID:-}" ] && [ -n "${SUDO_GID:-}" ] && [ -d "$BASE_DIR/backup" ]; then
|
||||
chown -R "$SUDO_UID:$SUDO_GID" "$BASE_DIR/backup" 2>/dev/null || true
|
||||
fi
|
||||
if [ "$MM_WAS_ACTIVE" -eq 1 ]; then
|
||||
echo "[*] Restarting host ModemManager service..."
|
||||
systemctl start ModemManager 2>/dev/null || true
|
||||
fi
|
||||
}
|
||||
trap cleanup EXIT INT TERM
|
||||
|
||||
"$PYTHON_BIN" "$FLASHER_PY" "$@"
|
||||
@@ -0,0 +1,9 @@
|
||||
All Alpine Linux keys are stored here, so we can verify the downloaded files with pmbootstrap before APK itself is verified.
|
||||
|
||||
Sources for the keys (must be identical, there's a testcase that verifies this):
|
||||
https://github.com/alpinelinux/aports/tree/master/main/alpine-keys
|
||||
http://git.alpinelinux.org/cgit/aports/tree/main/alpine-keys?h=master
|
||||
alpine-keys package
|
||||
|
||||
In addition, this key holds keys for the official postmarketOS repository:
|
||||
https://build.postmarketos.org
|
||||
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1yHJxQgsHQREclQu4Ohe
|
||||
qxTxd1tHcNnvnQTu/UrTky8wWvgXT+jpveroeWWnzmsYlDI93eLI2ORakxb3gA2O
|
||||
Q0Ry4ws8vhaxLQGC74uQR5+/yYrLuTKydFzuPaS1dK19qJPXB8GMdmFOijnXX4SA
|
||||
jixuHLe1WW7kZVtjL7nufvpXkWBGjsfrvskdNA/5MfxAeBbqPgaq0QMEfxMAn6/R
|
||||
L5kNepi/Vr4S39Xvf2DzWkTLEK8pcnjNkt9/aafhWqFVW7m3HCAII6h/qlQNQKSo
|
||||
GuH34Q8GsFG30izUENV9avY7hSLq7nggsvknlNBZtFUcmGoQrtx3FmyYsIC8/R+B
|
||||
ywIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvNijDxJ8kloskKQpJdx+
|
||||
mTMVFFUGDoDCbulnhZMJoKNkSuZOzBoFC94omYPtxnIcBdWBGnrm6ncbKRlR+6oy
|
||||
DO0W7c44uHKCFGFqBhDasdI4RCYP+fcIX/lyMh6MLbOxqS22TwSLhCVjTyJeeH7K
|
||||
aA7vqk+QSsF4TGbYzQDDpg7+6aAcNzg6InNePaywA6hbT0JXbxnDWsB+2/LLSF2G
|
||||
mnhJlJrWB1WGjkz23ONIWk85W4S0XB/ewDefd4Ly/zyIciastA7Zqnh7p3Ody6Q0
|
||||
sS2MJzo7p3os1smGjUF158s6m/JbVh4DN6YIsxwl2OjDOz9R0OycfJSDaBVIGZzg
|
||||
cQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr8s1q88XpuJWLCZALdKj
|
||||
lN8wg2ePB2T9aIcaxryYE/Jkmtu+ZQ5zKq6BT3y/udt5jAsMrhHTwroOjIsF9DeG
|
||||
e8Y3vjz+Hh4L8a7hZDaw8jy3CPag47L7nsZFwQOIo2Cl1SnzUc6/owoyjRU7ab0p
|
||||
iWG5HK8IfiybRbZxnEbNAfT4R53hyI6z5FhyXGS2Ld8zCoU/R4E1P0CUuXKEN4p0
|
||||
64dyeUoOLXEWHjgKiU1mElIQj3k/IF02W89gDj285YgwqA49deLUM7QOd53QLnx+
|
||||
xrIrPv3A+eyXMFgexNwCKQU9ZdmWa00MjjHlegSGK8Y2NPnRoXhzqSP9T9i2HiXL
|
||||
VQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwlzMkl7b5PBdfMzGdCT0
|
||||
cGloRr5xGgVmsdq5EtJvFkFAiN8Ac9MCFy/vAFmS8/7ZaGOXoCDWbYVLTLOO2qtX
|
||||
yHRl+7fJVh2N6qrDDFPmdgCi8NaE+3rITWXGrrQ1spJ0B6HIzTDNEjRKnD4xyg4j
|
||||
g01FMcJTU6E+V2JBY45CKN9dWr1JDM/nei/Pf0byBJlMp/mSSfjodykmz4Oe13xB
|
||||
Ca1WTwgFykKYthoLGYrmo+LKIGpMoeEbY1kuUe04UiDe47l6Oggwnl+8XD1MeRWY
|
||||
sWgj8sF4dTcSfCMavK4zHRFFQbGp/YFJ/Ww6U9lA3Vq0wyEI6MCMQnoSMFwrbgZw
|
||||
wwIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3v8/ye/V/t5xf4JiXLXa
|
||||
hWFRozsnmn3hobON20GdmkrzKzO/eUqPOKTpg2GtvBhK30fu5oY5uN2ORiv2Y2ht
|
||||
eLiZ9HVz3XP8Fm9frha60B7KNu66FO5P2o3i+E+DWTPqqPcCG6t4Znk2BypILcit
|
||||
wiPKTsgbBQR2qo/cO01eLLdt6oOzAaF94NH0656kvRewdo6HG4urbO46tCAizvCR
|
||||
CA7KGFMyad8WdKkTjxh8YLDLoOCtoZmXmQAiwfRe9pKXRH/XXGop8SYptLqyVVQ+
|
||||
tegOD9wRs2tOlgcLx4F/uMzHN7uoho6okBPiifRX+Pf38Vx+ozXh056tjmdZkCaV
|
||||
aQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoSPnuAGKtRIS5fEgYPXD
|
||||
8pSGvKAmIv3A08LBViDUe+YwhilSHbYXUEAcSH1KZvOo1WT1x2FNEPBEFEFU1Eyc
|
||||
+qGzbA03UFgBNvArurHQ5Z/GngGqE7IarSQFSoqewYRtFSfp+TL9CUNBvM0rT7vz
|
||||
2eMu3/wWG+CBmb92lkmyWwC1WSWFKO3x8w+Br2IFWvAZqHRt8oiG5QtYvcZL6jym
|
||||
Y8T6sgdDlj+Y+wWaLHs9Fc+7vBuyK9C4O1ORdMPW15qVSl4Lc2Wu1QVwRiKnmA+c
|
||||
DsH/m7kDNRHM7TjWnuj+nrBOKAHzYquiu5iB3Qmx+0gwnrSVf27Arc3ozUmmJbLj
|
||||
zQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvBxJN9ErBgdRcPr5g4hV
|
||||
qyUSGZEKuvQliq2Z9SRHLh2J43+EdB6A+yzVvLnzcHVpBJ+BZ9RV30EM9guck9sh
|
||||
r+bryZcRHyjG2wiIEoduxF2a8KeWeQH7QlpwGhuobo1+gA8L0AGImiA6UP3LOirl
|
||||
I0G2+iaKZowME8/tydww4jx5vG132JCOScMjTalRsYZYJcjFbebQQolpqRaGB4iG
|
||||
WqhytWQGWuKiB1A22wjmIYf3t96l1Mp+FmM2URPxD1gk/BIBnX7ew+2gWppXOK9j
|
||||
1BJpo0/HaX5XoZ/uMqISAAtgHZAqq+g3IUPouxTphgYQRTRYpz2COw3NF43VYQrR
|
||||
bQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwXEJ8uVwJPODshTkf2BH
|
||||
pH5fVVDppOa974+IQJsZDmGd3Ny0dcd+WwYUhNFUW3bAfc3/egaMWCaprfaHn+oS
|
||||
4ddbOFgbX8JCHdru/QMAAU0aEWSMybfJGA569c38fNUF/puX6XK/y0lD2SS3YQ/a
|
||||
oJ5jb5eNrQGR1HHMAd0G9WC4JeZ6WkVTkrcOw55F00aUPGEjejreXBerhTyFdabo
|
||||
dSfc1TILWIYD742Lkm82UBOPsOSdSfOdsMOOkSXxhdCJuCQQ70DHkw7Epy9r+X33
|
||||
ybI4r1cARcV75OviyhD8CFhAlapLKaYnRFqFxlA515e6h8i8ih/v3MSEW17cCK0b
|
||||
QwIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwR4uJVtJOnOFGchnMW5Y
|
||||
j5/waBdG1u5BTMlH+iQMcV5+VgWhmpZHJCBz3ocD+0IGk2I68S5TDOHec/GSC0lv
|
||||
6R9o6F7h429GmgPgVKQsc8mPTPtbjJMuLLs4xKc+viCplXc0Nc0ZoHmCH4da6fCV
|
||||
tdpHQjVe6F9zjdquZ4RjV6R6JTiN9v924dGMAkbW/xXmamtz51FzondKC52Gh8Mo
|
||||
/oA0/T0KsCMCi7tb4QNQUYrf+Xcha9uus4ww1kWNZyfXJB87a2kORLiWMfs2IBBJ
|
||||
TmZ2Fnk0JnHDb8Oknxd9PvJPT0mvyT8DA+KIAPqNvOjUXP4bnjEHJcoCP9S5HkGC
|
||||
IQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,14 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAutQkua2CAig4VFSJ7v54
|
||||
ALyu/J1WB3oni7qwCZD3veURw7HxpNAj9hR+S5N/pNeZgubQvJWyaPuQDm7PTs1+
|
||||
tFGiYNfAsiibX6Rv0wci3M+z2XEVAeR9Vzg6v4qoofDyoTbovn2LztaNEjTkB+oK
|
||||
tlvpNhg1zhou0jDVYFniEXvzjckxswHVb8cT0OMTKHALyLPrPOJzVtM9C1ew2Nnc
|
||||
3848xLiApMu3NBk0JqfcS3Bo5Y2b1FRVBvdt+2gFoKZix1MnZdAEZ8xQzL/a0YS5
|
||||
Hd0wj5+EEKHfOd3A75uPa/WQmA+o0cBFfrzm69QDcSJSwGpzWrD1ScH3AK8nWvoj
|
||||
v7e9gukK/9yl1b4fQQ00vttwJPSgm9EnfPHLAtgXkRloI27H6/PuLoNvSAMQwuCD
|
||||
hQRlyGLPBETKkHeodfLoULjhDi1K2gKJTMhtbnUcAA7nEphkMhPWkBpgFdrH+5z4
|
||||
Lxy+3ek0cqcI7K68EtrffU8jtUj9LFTUC8dERaIBs7NgQ/LfDbDfGh9g6qVj1hZl
|
||||
k9aaIPTm/xsi8v3u+0qaq7KzIBc9s59JOoA8TlpOaYdVgSQhHHLBaahOuAigH+VI
|
||||
isbC9vmqsThF2QdDtQt37keuqoda2E6sL7PUvIyVXDRfwX7uMDjlzTxHTymvq2Ck
|
||||
htBqojBnThmjJQFgZXocHG8CAwEAAQ==
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,14 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlEyxkHggKCXC2Wf5Mzx4
|
||||
nZLFZvU2bgcA3exfNPO/g1YunKfQY+Jg4fr6tJUUTZ3XZUrhmLNWvpvSwDS19ZmC
|
||||
IXOu0+V94aNgnhMsk9rr59I8qcbsQGIBoHzuAl8NzZCgdbEXkiY90w1skUw8J57z
|
||||
qCsMBydAueMXuWqF5nGtYbi5vHwK42PffpiZ7G5Kjwn8nYMW5IZdL6ZnMEVJUWC9
|
||||
I4waeKg0yskczYDmZUEAtrn3laX9677ToCpiKrvmZYjlGl0BaGp3cxggP2xaDbUq
|
||||
qfFxWNgvUAb3pXD09JM6Mt6HSIJaFc9vQbrKB9KT515y763j5CC2KUsilszKi3mB
|
||||
HYe5PoebdjS7D1Oh+tRqfegU2IImzSwW3iwA7PJvefFuc/kNIijfS/gH/cAqAK6z
|
||||
bhdOtE/zc7TtqW2Wn5Y03jIZdtm12CxSxwgtCF1NPyEWyIxAQUX9ACb3M0FAZ61n
|
||||
fpPrvwTaIIxxZ01L3IzPLpbc44x/DhJIEU+iDt6IMTrHOphD9MCG4631eIdB0H1b
|
||||
6zbNX1CXTsafqHRFV9XmYYIeOMggmd90s3xIbEujA6HKNP/gwzO6CDJ+nHFDEqoF
|
||||
SkxRdTkEqjTjVKieURW7Swv7zpfu5PrsrrkyGnsRrBJJzXlm2FOOxnbI2iSL1B5F
|
||||
rO5kbUxFeZUIDq+7Yv4kLWcCAwEAAQ==
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,14 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnC+bR4bHf/L6QdU4puhQ
|
||||
gl1MHePszRC38bzvVFDUJsmCaMCL2suCs2A2yxAgGb9pu9AJYLAmxQC4mM3jNqhg
|
||||
/E7yuaBbek3O02zN/ctvflJ250wZCy+z0ZGIp1ak6pu1j14IwHokl9j36zNfGtfv
|
||||
ADVOcdpWITFFlPqwq1qt/H3UsKVmtiF3BNWWTeUEQwKvlU8ymxgS99yn0+4OPyNT
|
||||
L3EUeS+NQJtDS01unau0t7LnjUXn+XIneWny8bIYOQCuVR6s/gpIGuhBaUqwaJOw
|
||||
7jkJZYF2Ij7uPb4b5/R3vX2FfxxqEHqssFSg8FFUNTZz3qNZs0CRVyfA972g9WkJ
|
||||
hPfn31pQYil4QGRibCMIeU27YAEjXoqfJKEPh4UWMQsQLrEfdGfb8VgwrPbniGfU
|
||||
L3jKJR3VAafL9330iawzVQDlIlwGl6u77gEXMl9K0pfazunYhAp+BMP+9ot5ckK+
|
||||
osmrqj11qMESsAj083GeFdfV3pXEIwUytaB0AKEht9DbqUfiE/oeZ/LAXgySMtVC
|
||||
sbC4ESmgVeY2xSBIJdDyUap7FR49GGrw0W49NUv9gRgQtGGaNVQQO9oGL2PBC41P
|
||||
iWF9GLoX30HIz1P8PF/cZvicSSPkQf2Z6TV+t0ebdGNS5DjapdnCrq8m9Z0pyKsQ
|
||||
uxAL2a7zX8l5i1CZh1ycUGsCAwEAAQ==
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,14 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0MfCDrhODRCIxR9Dep1s
|
||||
eXafh5CE5BrF4WbCgCsevyPIdvTeyIaW4vmO3bbG4VzhogDZju+R3IQYFuhoXP5v
|
||||
Y+zYJGnwrgz3r5wYAvPnLEs1+dtDKYOgJXQj+wLJBW1mzRDL8FoRXOe5iRmn1EFS
|
||||
wZ1DoUvyu7/J5r0itKicZp3QKED6YoilXed+1vnS4Sk0mzN4smuMR9eO1mMCqNp9
|
||||
9KTfRDHTbakIHwasECCXCp50uXdoW6ig/xUAFanpm9LtK6jctNDbXDhQmgvAaLXZ
|
||||
LvFqoaYJ/CvWkyYCgL6qxvMvVmPoRv7OPcyni4xR/WgWa0MSaEWjgPx3+yj9fiMA
|
||||
1S02pFWFDOr5OUF/O4YhFJvUCOtVsUPPfA/Lj6faL0h5QI9mQhy5Zb9TTaS9jB6p
|
||||
Lw7u0dJlrjFedk8KTJdFCcaGYHP6kNPnOxMylcB/5WcztXZVQD5WpCicGNBxCGMm
|
||||
W64SgrV7M07gQfL/32QLsdqPUf0i8hoVD8wfQ3EpbQzv6Fk1Cn90bZqZafg8XWGY
|
||||
wddhkXk7egrr23Djv37V2okjzdqoyLBYBxMz63qQzFoAVv5VoY2NDTbXYUYytOvG
|
||||
GJ1afYDRVWrExCech1mX5ZVUB1br6WM+psFLJFoBFl6mDmiYt0vMYBddKISsvwLl
|
||||
IJQkzDwtXzT2cSjoj3T5QekCAwEAAQ==
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,14 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvaaoSLab+IluixwKV5Od
|
||||
0gib2YurjPatGIbn5Ov2DLUFYiebj2oJINXJSwUOO+4WcuHFEqiL/1rya+k5hLZt
|
||||
hnPL1tn6QD4rESznvGSasRCQNT2vS/oyZbTYJRyAtFkEYLlq0t3S3xBxxHWuvIf0
|
||||
qVxVNYpQWyM3N9RIeYBR/euXKJXileSHk/uq1I5wTC0XBIHWcthczGN0m9wBEiWS
|
||||
0m3cnPk4q0Ea8mUJ91Rqob19qETz6VbSPYYpZk3qOycjKosuwcuzoMpwU8KRiMFd
|
||||
5LHtX0Hx85ghGsWDVtS0c0+aJa4lOMGvJCAOvDfqvODv7gKlCXUpgumGpLdTmaZ8
|
||||
1RwqspAe3IqBcdKTqRD4m2mSg23nVx2FAY3cjFvZQtfooT7q1ItRV5RgH6FhQSl7
|
||||
+6YIMJ1Bf8AAlLdRLpg+doOUGcEn+pkDiHFgI8ylH1LKyFKw+eXaAml/7DaWZk1d
|
||||
dqggwhXOhc/UUZFQuQQ8A8zpA13PcbC05XxN2hyP93tCEtyynMLVPtrRwDnHxFKa
|
||||
qKzs3rMDXPSXRn3ZZTdKH3069ApkEjQdpcwUh+EmJ1Ve/5cdtzT6kKWCjKBFZP/s
|
||||
91MlRrX2BTRdHaU5QJkUheUtakwxuHrdah2F94lRmsnQlpPr2YseJu6sIE+Dnx4M
|
||||
CfhdVbQL2w54R645nlnohu8CAwEAAQ==
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -0,0 +1,14 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq0BFD1D4lIxQcsqEpQzU
|
||||
pNCYM3aP1V/fxxVdT4DWvSI53JHTwHQamKdMWtEXetWVbP5zSROniYKFXd/xrD9X
|
||||
0jiGHey3lEtylXRIPxe5s+wXoCmNLcJVnvTcDtwx/ne2NLHxp76lyc25At+6RgE6
|
||||
ADjLVuoD7M4IFDkAsd8UQ8zM0Dww9SylIk/wgV3ZkifecvgUQRagrNUdUjR56EBZ
|
||||
raQrev4hhzOgwelT0kXCu3snbUuNY/lU53CoTzfBJ5UfEJ5pMw1ij6X0r5S9IVsy
|
||||
KLWH1hiO0NzU2c8ViUYCly4Fe9xMTFc6u2dy/dxf6FwERfGzETQxqZvSfrRX+GLj
|
||||
/QZAXiPg5178hT/m0Y3z5IGenIC/80Z9NCi+byF1WuJlzKjDcF/TU72zk0+PNM/H
|
||||
Kuppf3JT4DyjiVzNC5YoWJT2QRMS9KLP5iKCSThwVceEEg5HfhQBRT9M6KIcFLSs
|
||||
mFjx9kNEEmc1E8hl5IR3+3Ry8G5/bTIIruz14jgeY9u5jhL8Vyyvo41jgt9sLHR1
|
||||
/J1TxKfkgksYev7PoX6/ZzJ1ksWKZY5NFoDXTNYUgzFUTOoEaOg3BAQKadb3Qbbq
|
||||
XIrxmPBdgrn9QI7NCgfnAY3Tb4EEjs3ON/BNyEhUENcXOH6I1NbcuBQ7g9P73kE4
|
||||
VORdoc8MdJ5eoKBpO8Ww8HECAwEAAQ==
|
||||
-----END PUBLIC KEY-----
|
||||