init commit

This commit is contained in:
Luxferre
2026-10-19 09:23:54 +03:00
commit 6942acf5cf
307 changed files with 35003 additions and 0 deletions
+54
View File
@@ -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
+74
View File
@@ -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.
+227
View File
@@ -0,0 +1,227 @@
# Bananarchy Linux — User, Flashing & Customization Manual
![Bananarchy Banner](artwork/banner-800x240.png)
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.
+139
View File
@@ -0,0 +1,139 @@
# Bananarchy Linux (`v0.0.1`)
![Bananarchy Banner](artwork/banner-800x240.png)
**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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 801 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 886 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.
Binary file not shown.
+70
View File
@@ -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"
}
+142
View File
@@ -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
+62
View File
@@ -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
"
+36
View File
@@ -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"
+2
View File
@@ -0,0 +1,2 @@
earlycon
console=ttyMSM0,115200
+5
View File
@@ -0,0 +1,5 @@
pm8916-lbc
pm8916-bms-vm
panel-mipi-dbi
matrix_keypad
matrix_keymap
Binary file not shown.
@@ -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
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,2 @@
/lib/firmware/nokia,beatles-gc9305-panel.bin
/lib/firmware/nokia,argon-gc9305-v2-panel.bin
+31
View File
@@ -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
+5
View File
@@ -0,0 +1,5 @@
pm8916-lbc
pm8916-bms-vm
panel-mipi-dbi
matrix_keypad
matrix_keymap
Binary file not shown.
@@ -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
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
/lib/firmware/nokia,leo-gc9305-hlt-24-panel.bin
@@ -0,0 +1 @@
/lib/firmware/nokia,sparkler-gc9307-hlt-28-panel.bin
+62
View File
@@ -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
"
+62
View File
@@ -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
"
+35
View File
@@ -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
+3
View File
@@ -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
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,2 @@
/lib/firmware/nokia,coconut-gc9305-panel.bin
/lib/firmware/nokia,argon-gc9305-v2-panel.bin
+31
View File
@@ -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"
+2
View File
@@ -0,0 +1,2 @@
earlycon
console=ttyMSM0,115200
+5
View File
@@ -0,0 +1,5 @@
pm8916-lbc
pm8916-bms-vm
panel-mipi-dbi
matrix_keypad
matrix_keymap
Binary file not shown.
@@ -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
Binary file not shown.
File diff suppressed because it is too large Load Diff
Executable
+480
View File
@@ -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()
Executable
+43
View File
@@ -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" "$@"
+9
View File
@@ -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-----

Some files were not shown because too many files have changed in this diff Show More