commit 6942acf5cfdb8ea541905686b236e20da98ca093 Author: Luxferre Date: Mon Oct 19 09:23:54 2026 +0300 init commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c5e23f0 --- /dev/null +++ b/.gitignore @@ -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 diff --git a/MANIFESTO.md b/MANIFESTO.md new file mode 100644 index 0000000..7ece0e8 --- /dev/null +++ b/MANIFESTO.md @@ -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. diff --git a/MANUAL.md b/MANUAL.md new file mode 100644 index 0000000..ccbcaff --- /dev/null +++ b/MANUAL.md @@ -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 --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-.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+`. + - **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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a99582a --- /dev/null +++ b/README.md @@ -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-del +# pkg-search +``` + +### 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-.img` (Raw partitioned MBR image for EDL `userdata` or microSD card) +- `images/bananarchy-.sparse.img` (Android sparse image for `fastboot flash userdata`) +- `images/boot-bananarchy-.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. diff --git a/artwork/banner-800x240.png b/artwork/banner-800x240.png new file mode 100644 index 0000000..9be64bc Binary files /dev/null and b/artwork/banner-800x240.png differ diff --git a/artwork/favicon.ico b/artwork/favicon.ico new file mode 100644 index 0000000..005886e Binary files /dev/null and b/artwork/favicon.ico differ diff --git a/artwork/icon-128.png b/artwork/icon-128.png new file mode 100644 index 0000000..c6ba48c Binary files /dev/null and b/artwork/icon-128.png differ diff --git a/artwork/icon-16.png b/artwork/icon-16.png new file mode 100644 index 0000000..0023ea2 Binary files /dev/null and b/artwork/icon-16.png differ diff --git a/artwork/icon-192.png b/artwork/icon-192.png new file mode 100644 index 0000000..7df7372 Binary files /dev/null and b/artwork/icon-192.png differ diff --git a/artwork/icon-24.png b/artwork/icon-24.png new file mode 100644 index 0000000..5b68e2c Binary files /dev/null and b/artwork/icon-24.png differ diff --git a/artwork/icon-256.png b/artwork/icon-256.png new file mode 100644 index 0000000..bbc50fd Binary files /dev/null and b/artwork/icon-256.png differ diff --git a/artwork/icon-32.png b/artwork/icon-32.png new file mode 100644 index 0000000..469f61f Binary files /dev/null and b/artwork/icon-32.png differ diff --git a/artwork/icon-48.png b/artwork/icon-48.png new file mode 100644 index 0000000..9bbde71 Binary files /dev/null and b/artwork/icon-48.png differ diff --git a/artwork/icon-512.png b/artwork/icon-512.png new file mode 100644 index 0000000..95614e9 Binary files /dev/null and b/artwork/icon-512.png differ diff --git a/artwork/icon-64.png b/artwork/icon-64.png new file mode 100644 index 0000000..614fd08 Binary files /dev/null and b/artwork/icon-64.png differ diff --git a/artwork/icon-large.png b/artwork/icon-large.png new file mode 100644 index 0000000..7f1d845 Binary files /dev/null and b/artwork/icon-large.png differ diff --git a/artwork/icon-transparent-128.png b/artwork/icon-transparent-128.png new file mode 100644 index 0000000..ac0d58e Binary files /dev/null and b/artwork/icon-transparent-128.png differ diff --git a/artwork/icon-transparent-256.png b/artwork/icon-transparent-256.png new file mode 100644 index 0000000..c3b41f7 Binary files /dev/null and b/artwork/icon-transparent-256.png differ diff --git a/artwork/icon-transparent-32.png b/artwork/icon-transparent-32.png new file mode 100644 index 0000000..3e015a3 Binary files /dev/null and b/artwork/icon-transparent-32.png differ diff --git a/artwork/icon-transparent-48.png b/artwork/icon-transparent-48.png new file mode 100644 index 0000000..316826e Binary files /dev/null and b/artwork/icon-transparent-48.png differ diff --git a/artwork/icon-transparent-512.png b/artwork/icon-transparent-512.png new file mode 100644 index 0000000..800d1f3 Binary files /dev/null and b/artwork/icon-transparent-512.png differ diff --git a/artwork/icon-transparent-64.png b/artwork/icon-transparent-64.png new file mode 100644 index 0000000..096caab Binary files /dev/null and b/artwork/icon-transparent-64.png differ diff --git a/artwork/splash-240x320.png b/artwork/splash-240x320.png new file mode 100644 index 0000000..77b9ddd Binary files /dev/null and b/artwork/splash-240x320.png differ diff --git a/artwork/splash-240x320.ppm b/artwork/splash-240x320.ppm new file mode 100644 index 0000000..96d9b6f --- /dev/null +++ b/artwork/splash-240x320.ppm @@ -0,0 +1,1068 @@ +P6 +240 320 +255 + 0 D&S1a;mDzL„R‹V�Y‘Z�[ŽYŠV„Q{LqEd>U4G)5 " + 4U3wI—]±nÅ|؆äŒé�î’ð’ ò‘ +ñ’ð’ï‘ð�ð�ñ�ñ�ð�ó‘ñ‘ð’ð‘ î’ê‘äŽÚˆÉ·sœb~K]79! 2 [9‹U³n΂â�î‘ò’ ð‘íŽê‰å†â„àƒßƒà…߇àˆàŠâ‹ +äŒ æŒ åŒ åŒ â‹ +አá‰á†à…à…à„á…ä‡èŠìŽï‘ñ’ ð’ å�Ð�¶o�W^;70d<™`É|äŒï‘ï�ë‹ä†à„Þ…àˆå� ê”ð�õ¤ ùª'ý¯+ÿ³0ÿµ2ÿ´5ÿ³8ÿ´8þ³9ü²:ý±=ü±<ý²;ü²9ü²:þ²7ÿ²5ÿ³4ÿ²0þ¯-úª&õ¤ ï�è”ä� à†݂݃ä…ê‹ï‘ï“æŽÉ|˜_c;/  =#O»vâŽñ• ò‘ì‹ã…à…àŠæ“ï�ø¨'ÿ±-ÿ¶5þ¶<ø±=ë§8Ø™9ĉ7®x.—h'ƒY!uL gB];V5Q1O/P/Q1U5\:dApK ~V“d%ªt+¾†6Ò”9å¢:ô­=û²:þ³0ý¯+÷§ï›æ“ߊ߆â†ëŠò�ð“ àŒ·t€OA% <#�R¿zæ�ñ“íŒå‡á‡äŒì˜ù§"ÿ³/ÿ·9ù°;áŸ6½†1—i,uP!U7;$# + 5 P3rK–g(¼„.ß�4ø°6ÿ¶6ÿ²+ø© êšâŒà…å†ì�ñ“èŽÀy�Q<#" oD·uç‘ó’êˆß‚Ý…å�ò¡ÿ²-ÿ¸8ó­;Ò“4£p+oJA( ;H&S.Y3 O)%" H&U1N,G)< A'oI n(Î’3ó¬:ÿ·5ÿ±,ò¢æ�Þ…àƒêŠò’ æ�·umB! @(˜aÙŠô– +ð�åˆßˆè‘ô£ ÿ³1ú²:Üœ9§t,jE3 %F%nC"mC"oE qF#b4T*?#C'D(B)C)G*G*G)C(="P(`5pD"nD!kC"mC#H&$  + 2iD§s+Ú›5ø°7þ².ó¢ æ‘݈â‡îŽò•؉—^A( X5´oè‘ñ“çŠâ†ç‘ õ¥ÿ¶1þ´;Ô—9‘f(L3 +O+b9 `8%O(i>j?jAmC!^4^4vH+zI(wG)rE(pE,qF+rF)xH){I'yI,_2^5kAiBg@fAN)`6"`9O*.  N0’d'Ò”6û±6ÿ´0ó¤å� +à„ä‰ð’é�´qZ8a>Àyî”ð�ã‡áˆê˜û¯)ÿ·:àŸ9žj*L0 /M1T1T,mB$l?!Z1I'A _7"iA"iB!mD&X-4 +     0Q*i@$g>"e=!^4!AF$Y1l> qB$T,T1!O1 / K/˜h(Ý�4ÿµ7ù­+ç•ß…àƒìŒî“Ã}jB _<Å{î”ê�à„áŠð ÿµ1ö±=»‚3b?  )I-e=#wI(~M*l=#_0m@"J(#  +)1+( ! $ & +* + H%o?%_/j;!€L,yH(d<$J*,  `>µ~-ò®8ÿ´/ï áŒá„éŒð“Ä|d>[6Áyï”ë‹Ü†àŽ +ô¤!ÿ¶1è§:žl*@) +:"]9"uI*�P.vJ+`;#@&3S'k=#=9n?%T+5=%Y6 qC'yH(sF'_8!:" :%˜h'ç¦5ÿ¹2õ¦á� ݃çŠð”Åy\8 @(¯oí“í‹á†æ� õ¦ÿ¹3ßž5€Y"(  4_8 }M)ˆR.vH)W4 4 = l="A  <pA&E% ,Q0qE&ƒP+}L'a:4  ' ~W#Ù�5ÿ¸5ö¦"äŒ Þƒê‰ì’²rD)# –^å�ì�ß‚âŒô¥ÿ»3Ý�7zR! %P/tI)�P/qE)P2. +O,kA"= :o@%X1  *L.nB%{K+mD(K-$  tMÚš7ÿ»5õ¦ጠނêŒäŽ”]$ m@Ö†ò’â„Þ†ïžÿ·/å¢9€W#6 d<%„O-~L,[7#- # H%h>$g=!7  +  ! +  3g; l@$M(& + &N1rE'}J)h?#<%  yQáŸ8ÿ¹2íŸÚ„Ü‚ì�Ö†tD 2³mñ”è‰ß†é˜ÿ´1ð©9Ž`%$ + >%j@&|J*h?$?$ + & > W1oC$tC&[1'  F$I%P)W,V+-, Z-Z,S)M&F#' " +W/tF%rD$\2@ % :!h> {K(lC'B' +„Z!è¦8ÿ´1æ—Ú‚æˆð“¹r8#uHÞ‹íŽ߃ã� +þ¯+ÿ·=ªx/2  K/qE(yI(i;@!!  ( 9H(Z2i; pA%oB&d9L') 7 «y1vG$Y,]0Y.[0= 29*  '74;_0[0]/]/i8¦s0D + +* L'a8i@%h?"b:V2I(>/ ! " <b6wF%pD'M0 ) £n*ø³<ü¬*å� Þ…í�â�{M - ±l ð“ å†Ü…ïžÿº7Д7V7 /S+a/_-Z,K CF P*]4c8 `8 W4N+=&  7 ‚Wä«#å®0\+^0]/[.[07 6^-`0[.Q' + + +S(^.b0`0> 1^0]/^0`3V%ÔŸ'é±�^?  1G)Y4d: i=e: Z.I@FT)`/d1Z-7 N1Î�6ÿ¸;ð ݆ä…ï• µp/]9Ú‡ñ�߃ã� ÿ°+ð®=„Y$ * V1€Pœj¶…Ë–Õ– Ó’ Ίºw™\o=M#- : mF¨yÞ«öÁÿÉ +¢nQ#a3]0`0W-% ) T)]1]0^0_10+_/a3_1^1Z-*  V)a1^0b4Q$‹YÿÊ +ùÁ à««| sH?* +Hp9•U³pÇ„Ï�Ñ–Κ¾Œ§uŒ\a:1€T!î©9ÿ¯,ä�܃ì�Ú‰b=�Yë“ê†ß†ïžÿ¹3ÄŠ2:$ W0˜jÑœñ¼üÆü¿õ± ñ¨ +ó® +ò¨ +ó§ü¿ö· ë¦̇£d‘bO-* +! $ +0 N){R±�â¯ûÈÿÍ þÈûÃ÷ÃrDU%_1^0`2=% P)\0[/^0`4\,@>\,_4_2]0^1V,( 3 _0_1`1Y*d8òÀýÆÿÈÿÌ +üÇæ°·…TN,.# + + L+�\š\Ã{ì¢ú´ÿÀ ò­ +ð¥ +ö¯ ó¨ ô® û¼ûÇñ¾Ø¥ªyi@/ +6½ƒ0ÿ¶6î�à…è‰í•“]- ºsð“ +àƒß‹ û­'ú´;�_( * pH¿‹ò¼ÿÎ ÿÊô³è�ç�í¬ ñºùÆî® î²÷ÊôÄöÅù¾ø¹ýÆò½ؤÇ”̘Û§ð½ûÊ üÇÿÈÿÌýÇ +ç¹Ä™ ­‡3\6W,]/^1Z., AY)_0_1\1U"–S&].M$–[$T%\1_2_2Z*D+ Y,`3^0[/W3£{.Öå¶þÇ ÿÌÿÉýÈúÆï¼Ú§Ê—Ǖעð½ÿÈø¼ ú¾÷ÅöÅùÉï¶î« øÈð¼ï® éŸ æ�ñ¯ýÈÿÐ õÅÏœ…X6 €S!ö­7ø®&àŒ ã„î– ¾x#4L-Ö†ë�á�å”ÿ¸6Û™5N2' uIÍšúÅÿÉøÆñ³çŸ è£ ó· øÄ÷ÄõÂ÷Äì¥ó¸õÆôÃóÃóÅôÅòÂôÄùÉûÌýÊûÊöÇõÄùÆç¶½•%Ÿ}+£�3º™4çÇ;”m(L^2^1N%uL%‘b(V(V*R!Ÿ\å™'A / ×’%­mU%U*V)‡Z%�W)$L%`3`3L!ƒ\%éÉ=¿�0©„2§ƒ-¼˜$á²øÂøÃ÷ÂüÉþËüÍûË÷ÇõÂõÆõÆôÄóÅõÆö¼ë¤ôÄòÂõÅöÅô¸í¥ èž ï¯÷ÄýËúÈÖ¤‚T2 G+ד4ÿ·3ç”߃ë�Û‰V3m@æ‘ç‹Þƒð�ÿº9ªt._5Æ’ ûÆýÇøÂô»é¤ é¡ +õ¸ +ûÅ÷ÆôÃôÂòÂ÷Ãë¢ ö¾ôÅôÄôÄôÃóÃôÄóÃñÂñÁñÂôÃóÄವŽ.›}2º˜1çÄ1ÿÝ.ÿá)ÿã%è¿7]3Y,H# ‰`&ÿä;ˤ1n@½wú¨±kž^þ­Ì‚m<¼•4ÿåA¡v/ F!].U,Ú´7ÿè&ÿá$ÿÞ&îÇ*ß-¡~.¯†)Û¬ôÁ ôÃñÃòÂòÃôÄõÅõÄõÅõÅõÅõÅøÂê£ ÷ÀóÃòÂóÃôÆùÆö¼ ë¥ éŸðºõÃöÉúÊÍœmD"   m)ÿ¶9ðžà…æ‹è•wJ‰Sí”ä‡âˆö©$ú´>R 3 œlõ¾ÿÉõÀøÂð± æ› +ñ® +øÅõÆôÃõÂôÃöÆøÇò² ç¡øÄôÄôÄôÄôÄôÄôÄóÄôÄöÆôÃôÃ⸿œ2à¼4ÿß6ÿß6ê¿3Ì£+¿–,ǘ.УW/êšÿ©«t!Ú¹5þâ(˜o&7g;Ì£=Æ™.À•)ÉŸ(ç·+ÿ×,ÿÞ,è¿.Åž-ß²÷ÂõÃ÷ÇõÅôÄõÅõÅõÅõÅõÅõÄøÇê¦ñ¯ ùÆöÆôÃõÂôÂõÅøÆñµ èœ ï« ÷ÂóÂûÉõÅ«}C jHó­9üª)ä‰ä‡ï•—^  žbò” à„à� ý±1ç¥{O†WöÅ÷ÅõÁ÷ÆùÂç�îª úÉø½æ� +ñ±úÈöÇöÈöÇôÅõÅôÄôÄôÄôÄóÄóÅñÁüËôÅ¡|#¬Ž1üÙ,üÒ÷ÐûÓ6xQ#, Û²1þØðË*ºƒ'󛿒K%= Þ�û ¹y#ã¾0þÕëÂ/C"[9òË;ûÕøÏÿÛ&¾˜2™p#ë»þÍòÁòÄòÅôÄôÄôÄõÅõÅôÅöÇöÈõÇøÉô· ãœõ¸ûÊò° æœ +÷¾÷ÆôÁõÄøÈ–b!oJÿ¶:ð�Þ„ï“´r ™`÷– à…ë™ÿ¸?‚U‰WúÆ÷ÄôÁ÷Âòµ è¡ ï« üÈô¼ãš ô³ +÷ÈóÄõÅõÅõÅõÅôÄôÄôÄôÄôÄôÃóÃÿÐت�j+Ƨ3ÿß"ùÐúÒþØ1†\% ’k$ÿÙ#ûÒæÁ.Ã"ù�ë—W,D å‘ü¡Á~Ù²,ûÓÿØ"­�-nE÷Ï9ûÔõÌÿÛ!Õ¯5Žj*Ì¡ÿÎ÷ÁóÂôÄôÄôÄôÄõÅõÅõÅõÄõÄôÄöÈö¹ æš +ô¶ûÊò± èžð° +÷ÁõÁôÃüÉ–f wOÿ¸;ì�à„ò• £h +‚Nñ˜ à†ê–ÿ¹@�_'…S÷ÇöÄôÁöÆñ¸å˜ åœ úÆ÷º㘠ó¶ ÷ÈóÃôÄõÅõÄôÄõÅôÄôÄôÄöÄñÂöÊûÍ­‰‘p0æÁ1ÿÛöÌùÓýØ1Œd'[9óÈ0÷ÏýÔݳ*̆ùœôŸq;Z/ñ›ù�̈́Х-þÕöÍùÑ.nD pJ÷Î5þÓòÉÿØïÈ0 {0­„!øÉ úÉòÁöÄõÅôÄõÅõÅõÅôÄôÄôÄôÃõÇô¾ç› +òµúÊê¡ ç• ï²÷ÆòÂôÂûÊ•e …X!ÿº<ê™á„ó— ŒT`:î•â†æ‘ ÿ¹:¡l,{LõÅöÅóÂõÃõÄõÀë¥ ñ³ø» â™ ô· ÷ÇóÃôÄõÅôÄôÄõÅõÅõÅõÅôÄòÂÿÎ庎n)®Œ5ûØ-ýÓôÉûÓûÐ6„]#@ Û±4üÕóËý×Ó§0ÖŠ÷›ô˜ ˆIt<ó—ö›ÚŒÇ�,ÿÕôËûÓæ¼5N*iDñÇ8ýÖòÉúÑÿÙ$»–3’m%ß°ÿÐóÃõÄôÄõÅôÄôÄôÄôÄôÄôÄóÃöÆ÷½ ä› ö¶ +õ¹é¥õ»÷ÃõÃõÂõÁùÊ‘_™e%ÿº9è’á†ð–h@?%â‘çˆãŒ ÿµ6»3  p@óÀ÷ÆôÁôÄõÃõÃõÃøÇø¼ â˜õ· öÇóÃôÄôÄôÄôÄôÄõÅõÅõÅóÃöÃÿÐ +š‰h,Ô²4ÿÞ$÷ÏôÊþÖðÇ8tJ. n:ÊŸ.ÿÚ!õËõÍùÖÏ *å‘ ó–î‹ +°hŸ\îŒ î”é• +Êš'ùÒ÷ÍõÍÿÙ!Ö¬2|E.  +Y5â¹3ÿØôËõÍÿÜÞ¹,Žk+·�"þÏ øÆòÂõÅôÄôÄôÄôÄôÄôÄôÄôÃõÆø½ä› +ô· +ùÉöÃöÃõÃôÄõÁõÃøÈƒT´z0ÿ¹3â� åˆç‘I)$ Ñ„ëŒà‡ý°0Ð�<b3ë¸ùÇòÂôÄõÃõÃõÂ÷Åõ½ã— ò· öÈôÃôÄôÄôÄôÄôÃóÄõÅôÆóÂýÌñÆžz&¡€0ôÏ0ÿÙöÎõÍÿÚ$à¶8[6 R&ç¬(ÿ×$õÍ÷Ð÷ÏùÒ"Ùží–ð˜ë‰Úˆ< - +Ђíˆí“ñ™Ö›óÎ"÷Ï÷Ð÷ÌÿÖ#ñ²)\+ F#Î¥1ÿÜ%÷Ì÷Ìÿ×ùÕ,ª„1œs$îÀüÌñÂôÄôÄôÄôÄôÄôÄôÄóÅõÃõÆô¿æš õ¶÷ÆôÂôÄôÄôÄòÃ÷ÅóÀtB  +Í�4ÿ³1àŠê‹ׇ$  °oï�à‚÷¨(æ£;2 P&ß­üÉòÁõÃôÃõÃõÂöÆö¾ äœ +ô·öÈóÃôÄõÅôÄôÄôÄõÂóÄôÄóÂÿÐÖ¬ˆh*¿Ÿ1ÿÜ'ùÐõÌ ÷ÎÿÛ-Ë¢4D"ŒWø½öÎöÎöÐøÐôÎ#áœï˜ð™å„ò›u@`2ñšå…ï–ò™ÞšðÉ"úÐ÷ÎöÍõÎø¿œd8 +º�/ÿÜ-ùÑöÎøÐÿÝ"ͨ/’h)Ò¦ÿÑóÂôÃôÄóÄôÄôÄôÄôÄôÄóÃöÇ÷½ä�ó¹÷ÇôÂõÃõÃõÃóÁùÈçµ`1. â¢8ù¬)à†ð“°q �Qõ• +á‚ñ�ù²?U1; Ï™ýÌóÀõÄ÷Ç÷Æ÷Æ÷Æ÷¾ ç� +ô¶öÈóÃôÄôÄôÄôÄôÄôÄõÄôÂóÄÿÐ ¸‘‹m-ã¿2ÿÜöÍôÌøÒÿØ0«�,,Q0ß¡"ñºøÐöÍöÏúÓïÆ)á– ð™ðšå„ø›­i –Yü¡ ä„ð—ó™á” é¾$ûÒöÎ÷Í÷Ðð½ã¦'Z8# –l%ûÕ2üÔõÍöÍÿÙìÈ)›t-µŒ!ýÏ õÅòÂôÅôÄôÄôÄôÄôÄõÄôÅôÉõ¾æ� ôº÷ÇöÅ÷Æ÷ÇõÅô¿ûÊÛ§H#H.ø³<ð¤ ߇ñ— RH,ê’å„é”ÿ»=Q & ´‚ÿÍ +òÀóÅ÷Àê© è¤è¤é¥ +çž ó· öÈóÃôÄôÄôÄôÄôÄôÄôÅóÂøÅøÈžz%��3üØ-þÖöÐöÎüÔ ðÌ3ˆ[") +»�*ó´ïºøÑöÎöÏüÕ ä¶(å”óœñšæ†ó–ׇ3 # +É}ù�å†ñ˜óšé”à¯#ûÔöÍ÷Í÷Ðñ¿ï²Æš2"  yLìÂ2ÿØöÍ÷ÎüÔþÙ+®‰0žu#õÆùÉòÁôÄôÄôÄôÄôÄôÄôÅõÃ÷Çò½æ¡ê¦ è¦ è¥ë¨÷¼õÄñ¿þÌ Ä‘2 +tMÿ¾=è›â‡ë”N0 Ì�ìˆâŠ +ÿ¹8¯w/�aþÍòÁóÄøÄæ¡ î¬ ó¹ ô·ó¸ô¿õÆóÄõÄôÄôÄôÄôÄôÄôÄòÁüÈí¿�k%¹š3ÿÝ$úÐøÐöÎÿÚ&à¹5i?L" lGûÓ)é¨ ôÂøÐ÷Î÷ÏúÕ!Û¥"ì—òœñšç†î’ðš[*Ké—ô™æ†ñ˜óšð–Øœ öÐ øÎ÷ÍöÏõÇæ§ ÿÕ,|T  +O$a4Õ­2ÿÝ&øÎ÷ÐøÐÿÝ"Ä 2‰c)ä¸ýËóÀõÄôÄôÄôÄóÅôÄôÄõÅöÆöÁô¸ó¹ ó¹ ñ¯ çžöÀõÄòÁþͤr +¤p+ÿ½7â� é‰Ñ„ �cò�Ü‚ù¬'ß›9 i<ñÀ÷ÄñÃúÆê¤ +í¬ùÉöÅõÆöÆõÅóÄôÄôÄôÄôÄôÄôÄôÄóÀýÌá·‹i(ѯ/ÿÜ!÷Ì÷Ð÷ÎÿÝ-Φ7J$P%X4/ +Ö¨1ÿÕè¨öÆ÷Ï÷ÎùÐóÌ&Ô–ó›ðšñšè‡í“ú£w?g/ø¢ò˜å†ñ˜òšõ›Ò�ìÅ)ùÐöÍöÎøËè¨üÒã·49 Q/W,A ™4ÿÞ)÷ÐøÐöÌÿÛز2ˆc'×­ÿÌôÀõÄôÄôÄóÅôÄôÄôÄõÄôÅõÆôÇõÆúÈñ° êŸ øÆõÂôÂúÇQ  +Д3û¯+Ü…ð’�b[6ò“߃ì›ù´>O1B ݪýÉõ¿÷Èî¯ è¢øÇôÃöÂôÃôÄôÄôÄôÄôÄôÄõÃõÃõÄòÀþÍØ®�j/ß¾2ÿÛöÍ÷Ï÷ÎÿÛ1·�3/+ +n@<‡^$ÿÙ+öËè¬øËöÏöÍýÓà¸0ÑŠ÷žïšñšç‡î•ý¥ ‹Ny?û£ ò—æˆð—ð™öœ׊Ø­.üÓõËöÎúÏê«öÉÿÝ(˜n$4pC 4 ' +¯„-ÿÜ.øÐöÎôÊÿ×éÅ1“k,ѦÿÎóÀôÄôÄóÅôÄôÄõÄôÄôÄôÃôÄöÂõÂùÈë§ ïªøÈòÂùÈå³ S+>&ô¯;î Þ„ï“[6 +Óƒê‰å� +ÿº7�`&! + ¬~ÿÎó¿øÅ÷ºä� +ùÁóÅôÄôÄôÄôÄôÄõÅôÅôÄôÄõÃõÄóÀþÌÕ¨’n.ëÈ5ÿ×öÏöÏøÐþÕ4šv, F%q=!"  08 Ù¯3þ×öÈê¬øÐõÎöËýׯ›/Ú�ó�ïšñ˜å†ð–ü¤œZˆJû£ ò™ç‡ï•î™ñ›å� Á‘+ûÔõÌöÎúÐé­öÇü×å»0F/ + +j;R. +‹e%úÔ0ûÑ÷ÌöËüÕôÏ/’l0ÊžþÎòÁôÄõÃõÃõÃõÃõÃõÃõÃõÃõÃõÂôÃùÃæžó¶ ÷ÇòÁþÌÂ�"- +~R!ÿ½=è‘éŠÓ‡! •Zô‘ã„ü°1Ï’: +|MúÇöÁôÃøÃèž ó¶õÇôÂôÄôÄôÄôÄôÄõÅõÄôÄôÄôÄôÀÿËÕ§’p-òÍ.ýÖùÎúÏûÓúÔ6ƒ\%d7Z0 $ +[1T%‡[þÕ%øÍ÷Çë­ùÑ÷ÍøÍòÏ(´�*ê–ð™ð›ï–æ‡ò—ý¤¨c’Rû£ñ™çˆí“îšð˜ñ›·~%íÇ)øÐöÎúÒê¯öÅöÎÿÙ&•j#R`4+P*p?  rOóÌ4üÕøÎ÷ÏûÔõÐ1št2ÊŸþÍõÀôÄõÃõÃõÃõÂõÃõÃõÃõÃõÃöÂôÆö½ åž +õÂõÄóÁþÌ’` +À‰2þµ1àˆñ’ŸcK*ê�â‚îœù¶@J-H"á¬úÇòÂùÇí© ë©øÇôÃõÂôÃôÄôÄôÄôÄôÄõÃõÃôÄòÂüÊÙ¯˜t0ñÌ,ûÓöÎ÷ÏûÔøÒ8‡Z & +/n? 5`2U+2Ò§,üÔõÎôÃë­ûÒ÷ÍýÔܸ0·zõ�ì˜ï›î”ç‰ï™û¤§b“Pý£ +ð™èŠë‘ï›í˜÷ŸÁ}Ò«,ü×öÍûÔë±ó¿øÏúÑâº.A +W(j7 + o? ="!zHòÊ8ýÖ÷Î÷ÍùÒøÒ,©�2جýÊóÂõÃõÃõÃõÃõÃõÃõÃõÃõÃôÄóÃ÷Çï° é¦ ùÆóÂöÄíº]1: ñ¯<ñ¡ß…ì“O.Áwê…à‡ ÿ¹7—c&! ´€ÿÍ +óÀ÷Æô¸ç� øÃóÂõÃõÃõÃôÃõÃõÃõÃõÃõÃõÃòÃúÇ縨ƒ0ðÊ.þÒöÎôÏúÓöÒ:yQX'J* S-d8<o>( jIüÒ)ôÊúÐì°ïµûÓöÌÿÚ"¾•0΃ôžì—ï›ì�è�ðšú¤�Z‡Hü¢ ñ™ë�êŒðší˜öœÚŒµ‰+ýØ!öÎúÓð»ë­úÑóÊÿÖ'‡` ,r;G#W0[5C$`*j<ðÇ:ýÕ÷Ì÷ÎúÑúÒ/­†6ß°üÈóÁôÂõÃõÃõÃôÂôÂôÂõÃõÃõÃóÄøÇé¢ ð²öÆò¿ýÊÆ”!/ +‚Sÿº:Ꭰ+댾| oDñ“ ß}ö§&×™7 yKúÇôÁôÂ÷Äçœ ô¸õÆõÂõÃõÃõÃôÂõÃõÃõÃõÃõÃôÃ÷Ä‰2îÉ2ýÖøÎ÷ÍúÑöÑ4lK`7Q,( l="A!O)`1, Å™/ÿ×óÊøÉã¥úÉ÷ÐúÍùÑ%¦v+é• ñ™í™ïœè‹ë‘ð›ú¥ ‹Ns;ù£ ñšî‘çˆðšî˜ñ˜ò›©u&ïÇ)úÑõÐûÍ å£öÅõÍþÓÚ®2< +].W,2k="3I%h8b>ñÇ4üÓöÎ÷ÏûÓôÍ0¶�1é¹øÄóÁõÃõÃõÃõÃõÃôÂõÃõÃõÃôÄõÅô¾ æ� ö¿ôÃôÀþË�ZË�4ù­&Þ…ð— pE  Ù„ç‡è’ÿ·9^=< Û¦ýÉòÁùÆì©ê§ +úÇóÃõÃõÃõÃõÃõÃõÃôÂôÂõÃôÃõÃ÷Å ½“+å½2þÕøÎùÏùÑùÒ5rNW.T-T.h: R-W(X3øÎ/ùÍúÐïµë®úÒõÌþÕÙ³.¬oö¡í—ï™î›æˆí”ïšù¤ w@_,óžò›ð•æ‡ð™ï˜í™ù¡µv˦-þØöÌúÒì²í±úÑöÍýÖ1uKN#W/]3^2M'`1d?óË4ûÔùÐøÏüÔðÆ-É›(ô õÂóÂõÃõÃõÃôÂõÃõÃõÃõÃôÄõÃùÆî®ë¤ ùÅòÁùÆä²K%M1ù¶=ë™éŠ×ˆ! ˆTó‘ +á†þµ5½‚0 •gÿÎòÁõÆö»ä› +øÀõÄõÃõÃõÃôÃóÃôÄôÄôÄôÄôÄóÃûÊÉŸ%ݶ2þÔôÎ÷ÏùÐüÙ5�d(1 R+Q(4p@#G"A#W+£}&ÿÚ$÷ËûÏä¥öÃøÏöÉÿÙ!°ˆ/Ç€öŸí˜î™ñ™å‡ï˜ð™ó b0Hæ—ôœò™ç†ï—î›í™ô�Õ‰¦~*ý×#õËöÏøÇæ¦úÏõÎÿÙ!¶Ž*S'G(8p@ ;O'X. . +�TøÕ5ûÒùÐöÍüÓëÀ,Ο øÆóÄõÃõÃõÃõÃõÃõÃõÃõÃõÃõÃôÃùÃç  ò· õÆòÀýÌ +ª{!«v-ÿ¹6ãˆò’ �X.ÞŠå„íŸú·=C*S*ç·úÅóÃùÅæ¢ ð² ÷ÆöÂöÂôÃõÃôÃóÃóÃóÃôÄôÄóÃÿËѨ!˦6þ×÷Ì÷ÎõÍÿÝ/™o)P!Y5 W1R&W-e8  Y+à®&ýÒøÐò¿ê«üÑõÍùÌðË*–i%é– ïšî™ïšî”æˆòšðšä–F 4 Ú�ö�òœéˆì’î›î™î˜ò› +šièÂ(ùÐõÍüÒì°ò¹úÒøÑëº'd5  \4_1O%[3S0X&‹a%ÿÝ-öÎøÏõÍýÕÙ±1ÌŸ ýÊóÂõÃõÃõÃõÃõÃõÃõÃõÃõÃõÃ÷Åõ¸ ä  øÄóÄôÂñÁoA- +ì­;ï¢ãƒà‹2–]îŽÞ…ÿ»7§s*j6Î�ýÉ õ¿öÆó³ æ¡ øÆõÃ÷ÃôÄõÃõÃõÃôÄôÄôÄôÄóÃùÊÞ¶¸“7üÖ)øÏ÷ÏôÌÿÚ*¶�2%T-`6 b6P%f77 †Xè¨öÅúÑç©ôÁúÒõÌÿ×Ç¥2£hø¡ì—î™ñœéŽéŒó›ôžÐ†+ +! É~ú¡ñœíŽè‹ïœí™ì—û¡µr¼™+ÿÙõÍøÒõÇç¨øÏöÈ쫘i , f9 Q'f:) W-^4"«,ÿÚ&öÌ÷ÏöÎÿØ%Ú4Ú¬ûÊóÂõÃõÃõÃõÃõÃõÃõÃôÃöÂõÂøÇê¦ð¯ ÷ÆòÀúÊÚ›v=‡Z"ÿº7Þ‡í�œ`1ߌÞƒïžð®B, 2Û�üÀöÂõÁ÷Äèž ô¹õÆõÃõÃõÃõÃõÃõÃôÄôÄôÄóÄõÅ󯥄3îÊ-ýÔøÑöÏþØ$ͧ7. J(`6K(b3`3T. . ܯ-óµè±öÃç¨üÑ÷ÏöÌÿÙ"Ÿ|*ʃô�í˜ï™òšå‡ì‘ï™ù£¹u­iü¥ð›ï•ä†ï™ì™î˜óœÞ�œq#úÕ#øÎõÐûÓè¬óÀï¸ê¯è½1<G'_5a2Y3W-T-& Åœ0ÿÙ"öÎúÐûÑõÐ*¯…/ê¼øÆóÄôÃõÃõÃõÃõÃõÃõÃõÃôÄôÅö¾åž +öÂõÄòÃùÃÛ‹; á 6ð£ Þ„ã�6—\ñ’à‡ÿº7�c'†HðŸôÅóÃ÷Çò¯ ê¥ úÆöÂõÃõÃõÃõÃõÃõÃôÄôÄõÅòÃÿÎ ¬ˆ(Ω2ÿÚøÏùÐüÔïÅ8O.F%\.Bn=i7k=" }XÿÔô¿èªè«ñ¾úÓöÎûÒêÆ*šh!ðœ +î—îšñšñ—ä…ð–î–ú£ ˜[„Lû¥ð™ñšä…ï”îšî™ì–õ §jÛ¸+þÕöÍøÒóÂè«ë­ï¾ÿÙ$”h'a7h7sAFU-P,=ä»6ýØøÐøÒÿÖÞ¸.«ƒ)üÌ òÃõÃõÃõÃõÃõÃõÃõÃõÃôÄõÃ÷Éë¬ íªùÆóÂõÆñ¥ŒM{Qÿ»4㊠+ñ“œa, â‹æˆò¤èª=   Ætö· +öÅòÄøÂæŸ +ô¼÷ÄôÃõÃõÃõÃõÃõÃõÃôÄôÄóÄþÌϦª‡1ÿÚ!öÍøÐøÏÿÛ1�Y"> [-l<S*5+( Ö¨.ýÔöÅäšå¤ùÎöÐõÎÿÚ¾š.ºuú¢í—î™ñ›ì’æˆóšî–ïžj;X,í›ñ™ï›éŠì�ðší™ì˜÷ É€±Š+ÿÛôÍõÎùÐèªãœõÅüÔáµ3; % 3S*r@"Z,H% lEúÖ3ùÑøÑ÷ÎÿÛ¸“6ÚÿÍòÁõÃõÃõÃõÃõÃõÃõÃôÄõÅõÅöÂæž +÷¾ôÄõÄ÷» Ëz& +ß¡6õ©#äŠä�2 †Tò“ã‹ÿ¾<˜g*h8å•õÁõÂöÇð¯ +è§ ÷ÇõÂõÃõÃôÄôÄôÄôÄôÄóÅóÅ÷ÅðÕs(ïÊ-ûÒøÐõËÿÝ(µŒ.%  F#h9M*rNþÔ+öÊ÷ÇÛŒñ·øÑõÎøÎúÔ(›q(à�ó›ï™î™ð›çˆì�ñšñšÝ�@ / +Ò‡õœï˜î’ç‡ðší™î™ïšé™ žl#îÉ'õÑöÌõÑô¾Ý�÷Æ÷Íþ×.€V$ M+i8 M%#£w*ÿÞ(õÎöÐùÏ÷Ñ.—t-æ¹øÆôÃöÂöÃõÃõÃõÃõÃôÄôÄôÃöÈì­ î¬öÇñÁôÃé›y@�V ÿ¼<ã�ò’�Y  Ö„æ…ï¢ô³?/ ±dò« +òÃôÀøÃæŸ +ô» öÅõÃõÃõÃôÄôÄôÄôÄôÅóÆóÃÿÑ«† Ÿ0ÿÛ÷ÎöÎý×Û²4W+$ + T,c4J%  Æœ0ÿ×ûÏöÀà˜ +úËõÎõÌü×Ô²+¥j÷Ÿë˜ð˜ïšï—å„ð—í˜ö ¾u¤d÷ í–ò™å†ð–îší™í˜ø ±pÆ¡(ÿ×õËôÎüÎäž ô»ûÓÿØΣ2$  F#b4V/3 *S%Ç¡.ÿÙöÌõÏÿÚ Ñ¬3�u"þÎ +óÀõÄõÃõÃõÃõÃõÃôÄôÄôÄôÅöÀç¡ öÀóÀñÂó± +¿l  å¤=ò¤#ä…Ù†$ tFñ‘ à„ÿ»3«w.V(âŒõºð¾ôÃñ±ê£ øÇôÃõÃõÄõÃôÄôÄôÄôÄôÄõÄûÊÛ¯–u+ý×%øÏ÷Ñ÷ÑùÒ1kBT'BQ*qA"]1^/7V6ùÏ2÷É"íÄ-æ«î²ûÕõÌôËþÙ §*Ђõœë˜í™ï›ë�æ‰ð›ì—÷¢ ‘S n>ôŸí—ó›é‹ì�ñ›í˜ì™ò›Ü�¤y'úÔ$ôÍõÌüÓò»å¨ñÉ*ñÅ#ûÒ,iF-\-Z-q@#Y/F U+\4ïË0úÐ÷Î÷ÍÿÜ(£|-ΡþËõÁõÃõÃõÃõÃõÃôÄôÄôÄôÄøÉí© +î­öÁð¾ô¿é’e2�`$ÿ¹6Þ‡ñ‘ yHÅyç‡é–øµ?G(¡Vô¦øÅøÃúÆé  ò´öÆõÃõÃõÃõÃôÄôÄôÄôÄõÄôÃüÎ –q#Õ±1þÖöÏõÍÿÝ(¥{,= d5j:k:BDp= # +®‚*ÿß.°ƒ$˜`³z"ÖŸ)ïÅ$øÐøÐåÁ)šh!ñ› +ï—ð˜í—ðšæˆì’ð›ðšî›a2< ä’õšðšð”ç‡òší™ì™ë˜÷Ÿ¦mÙµ'ûÓøÏòÉ ß«.¸{¢e³€$þÚ'Ù,  e8D=f7l<e6@ •n$ÿÙ)õË÷ÎûÓèÁ.–n"öÆ ôÃõÃõÃõÃõÃõÃõÃõÃõÃõÃõÆõ»çžøÁõÄõÆø¬ ©]/ í«;ë�è‰ÃxM/ï‘ß‚ü®+¾†0.Ózú·õÀ Þ¦â¨æ  ûÇôÃõÃõÃõÃõÃôÄôÄôÄôÄóÄþÌË¢�}/ÿÜ$÷Í÷ÎûÔá¹1S)^2^/: a4a3K*õÉ-ñÉ%‹Y ^Ç„!Û�%è½$úÒÿÙ·�,¿y÷Ÿï—ð—ï˜î•ã„ðšî™øžÔ†4 ¼tû¢ð™ó›æ‡î”î›í™î˜÷�Ï„²ˆ*ÿØ ùÐìÁ$ݦ(É‹Ÿ\�Wä»'úÔ/eAW-_45\.a5R&Ö«1üÖõÏöÎÿÜ&¯ˆ1»’ÿÎóÁõÃõÃõÃõÃõÃõÃõÃõÃõÂýÉé£ â£ݧî½ú¾Ù�7 +¥r,ÿ¶3á†î�L, cð�ã� ÿ¹:cBo:ê•þÇ Ú¡Û˜#Ü— Ó� Þ©õÂõÃõÃõÃõÃôÄôÄôÄõÅôÃùÍ Žm#á¾2ýÔøÐ÷ÎÿÛ,ˆa# ?b2- yB 9¢w%ÿã&Î�%˜Y©jÕ–%× 'øÏ"ùÐôÎ(§s%ê• ñ˜ð˜ð˜ñšèŒçŠïœî—ü¤ + ]ˆKû¤ ñ™òœë�èŠðšî˜ð—î˜óš¯r"ëÆ,úÓøÏ!Û¥(Ù™#¨f›XÁ“#ÿà(¾‘-0 sA#2 ]3E! wOÿ×0øÐùÐûÓìÇ-‹g#óÃõÂõÃõÃõÃõÃõÃõÃõÃôÂöÅÞ¬Ó’"Þ— Þ˜"ל!ûÉ í�w?I.ù·<è–î�Ÿa# Û†ä†ö¦$Þž7 ¥]ô© ÷ÃÕ’ø¦Ë„Û•$Ò•"î»÷ÅõÃõÃôÃôÄôÄõÄòÄýÏ›�|.ÿÞ"÷ÎøÏþØ Û±6- K'_2 +[/h:@ ìÀ0ÿÙ%¬s¯g´rؘ*ß®%ûÓþÖÓ«,Ã|÷Ÿî—ò˜ðšñšä†í’í˜î˜îœ_/M#ë•õ›íšï—ä„ñ–ï™ï˜î—÷ŸÏ�Çž,ÿÖùÏã¶%ß )µs·l¨qûÓ(öÊ/X2 ]4`4 V/S-%Ëž1ÿÚ"øÏ÷ÏÿÝ$¬…/·‹ÿÎóÁõÃöÂõÃõÃôÂôÂõÄóÀ Ñ”!Ú•'Å‚!ø¬ܘòÀö± +®e +Ê�3ú¯'â†Ý‡% i>ð‘ +á‡ÿ¹4“d#6 Ð|÷ºå°ã˜îŸŒQÎ�*Þ¡!óÂõÃõÃôÃóÃóÃôÄöÄöÃúÌŒi#â»*üÔøÏ ÷ÎþØ2zR$0s@ ;- p@ : •m(ÿà)ç¹( `¶iÄ… ל&ïÅ#øÏúÔ$¸…*ç’ô›ï˜ñ—ò›ì‘ç†ñšê—òžÇ}& +·qøŸí—ðšçˆìŽð›ð˜ð™ó™ï— ¹�'òÍ$÷ÏóÉ$Û¢&ÊŠ#»m«hݯ%ÿà#ª(- l=72t@!? fAúÔ4ùÑùÏ!üÒìÆ0ˆc#ïÂ÷ÃóÄõÃôÂõÃôÂôÂôÃöÇÜ£Ô‘-ŽS#æœëžáª÷¾Ù„D! yOÿ¼4à‹ï‘ oD´lðŠì˜ö´;A)r9 é— øÂÔ™ï¢Ì…™_!ÞŸ,ߥøÇôÂõÃõÃôÄôÄôÄõÄÿÍÈ¡ž}+ÿÛ#öÌöÍþØ!Σ0/ 8 uB_4 _7S.7 ä¸2þÞÎ�'²m ³nØ—%Ö¤(ùÓúÓÞ¸,Ä}öžñ˜ò™ñ˜ôšæˆí’òšë“ø¡ ˆOr>òŸ î”ì—í“æ‡òšñ˜ñ™ò˜÷žË‚Õ­-üÔûÒÚ§'Ü�%¸q¸qÎ�&ûÖîÀ.H&G%c8  [/|E#?)»“/ÿÜ!÷Ì÷ÍÿÜ'¬‰.·�þÏóÂöÃõÃõÃõÃôÃóÃøÊá­Û›)™a$Ã}ù¨Ó”õÃïž D* íª:îžꊺq0ä‹èƒú¯-Ë�4 + +©[ñªï½ Ï�ö¨¤d¬o(àŸ-æ³øÇôÂõÃõÃôÄôÄõÄóÄüÏ ‘q%ض.þÖ÷ÎøÎýÖ2wLL!wBe4! W/h<  +‚Z"ÿÙ)ûÓË™*Ñ‘*ê«&Õ•$çº%úÒûÕ Ã“,ãŽò›ð™ò™òšñ–å‡ô›ç‹ä…ß�G"4 Ô‡é‹â†ñ˜æ‡ï”òšñ™ñ™ñšé“ +ÄŽ)øÑ"ùÏëÀ#Õ™"ï¯"Ð�$Ç’$øÎ ÿÖ$ s' Y0_5 +j6vB"K"e:÷Ñ,ùÏöÎüÒìÄ.�k!öÆôÃõÄõÃõÃõÃõÃôÄöÇî»Ü�'´w+¢b÷©ÏŒì¹÷³¶j°x+ý´+䆿Œ3tDõ� äŠÿ»7‰X!8 +×}ú¼ã±à”òŸ‚M¿†.Ü�(ñÁ öÄôÂõÃõÃôÄôÄóÄüÊØ­‘s-þÚ&úÏøÏþ×!Ì£.GV0O%\0# S+sA!0 ( +Ó¬0ýÖøÏõÌ$Ý®-Õ�(Ïš'øÏ!úÒçÁ-ȃ óœð˜ñ™ð™õœêŒêŽôžå‡ïŽ ¶lšXìŽ â�ð™í‘è‹ó›ð™ñ™ð™öœІá¸(ùÑùÏ×§&Ò•$Ñ‘"ï¶æ¨ô¿ëÁ3E#!f8 \4( ]/L$U.H»“(ÿÛöÎøÎÿÞ#ž|.ÆœúÍôÁõÃõÃõÃõÃôÄôÄöÆÝ¢Í’/‹Rã™ß–âªûÂÜŠC! b=ÿ»8å� ö�tF·mñŠîšö²<<$q9 î– ÿÈÕ â™Ƀ}KÕ•.Û¢ùÇõÁõÃõÃõÃôÄôÄñÂÿÑŸ~¡/ÿÚ÷ÐúÎÿÚ-�\"0b6Y+uA#> zSýØ*öÎøÏøÐü×òË'õÌ!öÐûÔÌ›-ãŽó�ð™ñ™ñ™ò˜æ„ñ™ñ™ä…ö�yDW,ë–æ†ï•ò›ç†ï–ð™ñ™ñ™ò›é’Ï™&øÓ÷ÎöÇ"ä¥ê¨í¬á— +áš ÿÝ* s'/ m; Z-_07lHüÖ*øÐ÷Î ÿØÑ®.‘oþÎ +óÁõÃõÃõÃõÃôÄôÄùÊã«Ùœ+�[ Ã|!èœÒ˜ýÈò¡ y?%æ§:ñ¤ðЏo( +âˆæ†þ®,Ê�4¥\õª ÿÊ º…%ŽT‚Kžg"áš(Ú¢ùÉôÁõÃõÃõÃôÄôÄ÷ÅîÁ†i(óÍ*ûÑ÷ÑþÖé¾4=4m8u@:, +ש2ýÖõÎ÷Ð÷ÎøÍùÑ÷ÒûÑîÇ'ËŠ òœðšð›ð™òœëŽé‰õžèŒï�Û�< # Ä|ô—å‡óžé�é‹óœñ™ñ™ñ˜ô›ÓŒêÀ+þÖð¸ä‘ì¦ç¦î«å¡úÍê¼3<2h9g6>/ Ú°2þÚ÷ÏúÏùÔ+‡f(â³÷ÇôÂõÃôÄôÄôÄõÅúÊâ«áž!­x#~O ’X´y)øÃø° +ªa±{,ÿ·/äˆà‡) ^:ó‘ â‡ÿº:ˆX$*Ðzý½ÔŸƇ)lj(Ÿf(Ò•#àšà¨÷ÈôÂõÃõÃõÃôÄóÃÿÏÀ—��,ÿÜ!öÍ÷ÏÿÞ*¨|, =a4[01 wQÿÖ0õÌ÷Ï÷Î÷Î÷ÎøÏõÑü×ئ,à‘ ô›ð™ñ›ðšñšä†ï”ò™â‚üŸ Ÿ^…Kü£ãƒï—ï™ä„ñ—ñ™ñ™ñ™ô›ç’ Ø¡(û×ùÇâŽè› í®ì­õ½ùÍÿÛ*Œf%% +V/c6?"  �k&ÿÝ(öÏöÍÿÝ"¬Š1¬†ÿÎòÁõÃôÄôÄôÄõÄùÈè²á� Þž�d&Æ)ÆŠ.Æ‘ û½ Ò‚4 pGÿ½:äŽ +ð� +]:™^ñ‹é“ø³;E(X, ê‘üÄ٦NJ úµ÷±ì©Ì’ ò¾õÃõÄõÃõÃõÃôÄóÃþГs%Ò¯/ÿ×öÍùÑ÷Ï4b46h4k: T*I&' Ï£2þÙ õÌ÷Î÷ÎöÍöÎ÷ÎùÒïÊ(Í‹$óšñ™ñ™ñ™óœì‘å‡ôœëŽç‰í™U)A ä“î�é‹ò�çŠêŒóšï™ðšï™õ›×�ìÃ'üÓô¹ê¦ï°ó»ï²è¯þÔ à³34 F%Q'd9h:< S)ïÄ3ûÓöÎýÔá¼1‹h"ûÉ ôÂõÃôÄõÅôÄõÄöÅøÅÒ–êªüµýºÒ’!Ò›ûÄ ê˜e41 ð­8ìží‹œ_Èzêˆ÷§"Ö—4€Cõ¦÷ÆöÆ߬º‡&Í�Í�"á±øÇôÂóÃôÃõÃöÃõÄøÅ꽉l+ùÒ)øÏöÌÿÙ$Û+T! ~E!b6( :R- +iDýÖ2öÏ÷Î÷Î÷Î÷Î÷ÎõÍüÕÙ¦/Ü�õœð™ò™òšó›æ‡í’óœç‰ï‘ ¹rªeõ™ æ‡ðœî•å…ñ˜ð™ñ™ïš󛿒 Ù¤'üÓùÒøÆê®é¯ùÄë¶ï¹ÿÙ/†`%N-=" \4|H&N"¯‡&ÿÛõÎöÍýØ*•p+à°ûÉõÃôÅôÄôÄôÅõÄ÷Æì¹Ñ’"Ö•¼…#áªõÃôÇö¬ ’OÆŠ.ú°'æ‡Í|6å‹ä†ÿµ/£m$ŽMù± öÆôÂþÊ »�%ݪêµöÃõÃöÂöÂöÅõÃõÃòÂÿÍÄ�¤„1ÿÜ$õÍöÍÿÙ-‚[#A4 K(V- Á˜2ÿÚ"öÍ÷Î÷Î÷Î÷ÎöÏøÑïÊ)ɉ#òšñ™ñ™ñ™ó›î”èˆòšò›é‰î�t@b1é�èŠï›ïšçŠë‘óœñ˜ñ™ð™õšÐŒëÄ(ùÑøÏúÐ÷Åçªô¸Ú› +üÎ"ݱ51 O+R,0AuKýÕ(÷Î÷Íÿݶ“0´ŠÿÐõÂôÅõÅöÅøÄõÃôÄõÅê·ã°µ‡*÷Æ +õÂõÆü¸ žY �^ ÿ»2âˆåŒ="j?ô�åŒ ÿ¸9h@†H÷¬øÅøÄZŠ&ûÇ úÆõÃõÅó¸ +ë¦ð· õÄôÃñÂþПy"̨0ÿÙ÷ÍûÓíÄ/B% f8V0 c@ûÒ2øÐ÷Ï÷Î÷Î÷Î÷ÎõÍþØ Í 1؉öœð™ñ™ð™ó›æ‡ï“òšñ™ï�Æt3 & ·hì�îšïšï•å‡òšñ™ñ™ñ™ôšã� Ë›.ÿÔøÌ÷ÎúÓåªí²ôÂôËÿØ.„]# M*h:6á¶-þÔ÷Ïþ×àº-�n$üÌ õÂ÷ÄöÆò» +ë¨ñµ õÅõÂõÅüͽ‘#ã´úÇöÆû´˜VQ1þ¸9ä’ð�rD›^öŒïœó®;2£l!ð£ôºýÊݰǘ%ýËóÂõÄöÅð´ ê£ñµ +õÅôÃõÃñÅ Œj&ïÇ,üÔ÷ÎÿÚ$Ø0' uA!: Åš0ÿÙ"öÎ÷Ð÷Î÷ÎøÍöÎûÑîÉ-¸}'óœï™ðšð™ðšî”èŠôšð™ï˜ò” +˜QƒAí‘ î™ï™óšéŒí’ñ™ð˜ð˜î˜÷�Â!æ¿-ûÒ÷Î÷ÏøÌøÍúÑöÍýÔÛ®3. 2p?") ¯…-ÿÜ$öÏøÑûÔ+�n&æ¹úÇöÃöÆó¹ ê£î² öÄôÃòÂûÊÏ Õ¦þÌõ¿ñ¨ ¹&!é£8ï¡ð‹¡cÇxìˆú­%Ñ”4  ÑùµäšÿÎÏ£×§ûËõÃöÄõÆ÷Ãö¼õÀôÄôÂüÈÙ¬–v.ÿØ'øÎ÷ÏÿÛ*‹c#C#p> eCüÒ4÷Î÷ÎøÎøÎøÎøÍõËÿÙ—0Іø ñ™ïšðšï—å‡ ë�ò™ï˜ñ˜í�y>]-ä‡ð™ï˜òší’ã…ï”ò˜ñ˜ñ˜ø›Û�¸�.þÖ$ôÍ÷Ï÷Ï÷ÏöÍ÷ÎõÌÿ×2zS! +j< F#{T!ÿÙ-÷ÐøÎÿÝ$¢‚/ÇŸÿÍõÃöÆõÂô»÷¿öÄóÃóÃùÈã³ÈšÿÎè¡ö³ +Ù¨$( ¿‚,û±*ë‰Ê|0 ãˆç‡ÿ¹1¥p*6Û§ÿÌæ ò°Å™+ç¶ûÈöÄõÄöÇñ¼ñ¹õÅôÄóÁÿι�­Œ/ÿÛõÍúÒùÏ.W4 Z2U,! Ę1ÿÙ$ôËöÍ÷ÎøÎøÎ÷ÎûÑêÅ0«o#óž ñ™ñ™ñ™ò™ï–ç‹î“ñ˜ï™ô˜Ôz> +# ¾jôšì™ð™í”æ‰î•ñ˜ð˜ò™ñ—öž°t ß¹-úÔöÌ÷Î÷Î÷Î÷ÎõÌýÖ!Ó§4' O+^1I)ïÅ.ýÔöÎÿÛ½œ.¨‚ÿÐõÁôÄõÇô½ñ¸ ÷ÅôÄôÄöÆðÀ Å–(ð°æžþÆê¶C"Œ\!ÿ¼2çŒæ�3T0ñ� æ�ÿ½:}OP+ïºöÅøÂäš Î’$õÅ ÷ÃöÄöÄ÷Æõ» õ¾ôÅôÅóÃÿÏ  {!ͪ/ÿØõÎÿÖݱ31 & k>"3`:ûÒ5øÏöÍöÍ÷ÎøÎøÎöÌÿÚ#³‰0É~ù í™ï™ñ™ñ™ò™ò™ñ™ñ—ïšî‘ ˜P{=ï�íší˜ï˜ñ˜ï™î™ïšñšï™÷�Õˆ©„,ÿØ%öÌ÷Î÷Î÷Î÷Î÷ÎõÍýÕ1sK0f:!( % Ï£1ÿÚöÎÿÖÛ¸.�m"ýË õÁõÄ÷Å÷Àó¸ +öÃóÄôÄôÃøÊÑ— ß” +öÀöÂöÂ`:_9ÿ»7ç“ ñ’ X3yJô�ë•þ¹V0 +  +Í¡.ÿÙ÷ÏÿÚѯ.�w$ÿÎòÂôÄöÇó¸ì¨ +÷ÇõÅöÁë¡õ¾½�(òÁ õÄùÉä°9 yOÿ»9æŒä‰4V2ñŽ å‰ +ÿº=mH2 ß«úÉõÆó ¿‘+÷Àé ø¾õÅùÈë§ ò·öÆöÄôÃÿЛ{&Ô´.ÿØõÍÿ٠Т+' +! ]3m?:a<üÑ8øÎõÍöÍ÷Í÷Î÷ÐöÏÿÝ&ª‚/Ï‚ú¢ð˜ñ™ñ™ïšïšïšïšîšñ™ï› Ÿ[ & “Mìšð™í˜ï™ñ™ñ™ñ™òšñšî™ö�Í„ž{(ÿØ"ôÌ÷Î÷Î÷Î÷ÎøÏöÍüÔ1hCP*^3W+F$ 1 e:_6&¶Œ)ÿÜ÷Ïÿ×ã¾/•s%ûÊ òÃõÄöÈõ½ë¥ +÷ÅõÅøÄë¡ùÀ À“#ê»øÆ÷ÇîºG%W7ÿº7ç‘ î� Q0sDö�é�ý¶=P/B#ê¶öÇöÅê¼Á”#ú¿ é  ùÃõÄøÆê£ +ò½÷ÅöÄöÄýÌ “t(äÂ.þÖõÍÿÜ!³ˆ)E o?b41 ¼’0ÿÜ'öÍ÷Î÷Î÷Î÷Î÷ÍüÕä¿3žjú£ +ñ›ñšñ™ñ™ñ™ð™ð›ðší˜õ ¾y)  ªiô í–ñ™òšñ™ñ™ñ™ðší˜ì—ò� +›d Úµ(ûÔõÌ÷Î÷ÎöÎ÷ÎóËýÕÓ©5$ c>çÀHtH![,d4I$ ( ]3pB#D žs%ÿß$÷ÑýÔñË+’q$ôÄ ôÄõÅõÆöÂë¤ +öÃõÄúÆê£ú¾Ƙ"ã³úÈöÅ÷ÄX2<" ø³;ì˜ïŽ nBŽUõ�ì–ô®=5Q-ò½õÄøÆä¶Ä™ú¼ é¢ùÇöÄöÄé¢ õ¿öÄõÃöÄ÷Ç •u$ïË(ýÓõÎÿÜ(žt&V(Q+ +a<úÑ2ùÒøÐ÷Ï÷Ï÷Ï÷ÎõÌÿÙ ¥+Ï…ü¤ñ›òšòšòšñ™ñ™ó›ò›ñšì›f4L%á‘ô™ñ™ñ™ñ™ñ™ñ™ï™í˜ê–ñ›Ðƒ«�&ÿÞ%ýÕÿØþÕÿÖÿ×ÿÙ$ÿ×'Ù®>P,‹e"üÏ3ÿã1¨{,Ld3b3=K'[,�_ÿÝ(øÐûÔúÔ+•v'ì½öÆõÅõÅöÅê¤ö¿÷ÄùÇì¦ù¸ÏŸ'Û«üËõÄýÊhA%ì©5ð¢ï�‰S£côŒïžè¥7#^6øÂõÂûÇà±Ëž'ø· ì¦øÈöÄöÁé¢ öÂõÃõÃ÷ÅñÁ •t&÷Ð*üÒöÎÿÚ*Œe'¼’.ÿÛ%õÎöÏõÏöÏøÐùÑÿÙã¼,œeõ£ô›ò›ð™ð˜ð˜ð˜ð™ñšñšý¥ºt ž_ý¤ð˜ñ™ð—í–î—ò›ö¡ù¤÷ ø£¥k#ˤ4ܶ1Ô­/ر.Û´.Ò§*ºŽ)’g*‹_"׫(ÿÝ"ôÈä²ñ¸¯rd/j6 K&wNÿÙ'úÑúÒÿÙ(˜y0ä¶øÈõÄõÅ÷Çë¦õºøÅ÷Çï­÷³Ô¥Ó£#þÌóÂÿËwLÜ›0ö©#ï�¢cµoòŠö¥&Ú™6g>ùÆóÂûÇܬУ#ö³í«÷ÈôÅ÷¾è£ õÅôÄôÄ÷Çé¼”s(ûÕ'úÑ÷ÍÿÙ*~X ]:øÎ-õÍÿ×"ÿÞ'ÿÛ)ÿÖ(öÍ*íÁ+íÅ/�o(¸uê—ì™ +õŸ +ý£ þ£ü¢ø õ�ñ›ó™ô¡j9Q&é˜ö�ò›ùžü£õž ä‘Ì|²gœV‘Q…Q€W …_%„^#‹e%•l*�t*²Š-Õ¬$ýÓþÍã°Ú§ð· þÃðµ.‘Y,M"& cBþÖ,úÒúÑÿÜ(�|3Û®úÉóÄôÄùÇì¨ +ô·öÆ÷Çñ²õ¯Ø«ËŸþËòÂÿÍ�V ÌŽ1ý°*쌵o Æxî‰û­,ÊŒ7qFûÇòÁûÉÕ¨Ö¦ ò«ï­ ÷ÇôÆó¼é¤ öÆôÄôÄùÈ丗w0þÖ&ùÏøÎÿØ+vOÁ˜,ÿØ!ÿÕ'Ó©-¨‚+¤x)�o'—i#˜f$”f%}R…T…M‚K…J’R§a¾qÓƒã�ê˜ ú§·s! Ÿ`ô ׄ½pŸY…J~I’`$±ƒ,Ì¢1åº2ûÒ3ÿß5ÿÜ4ôÍ:ß»;Úµ5îÄ'ÿÔÿÔ ò¸ +áŸè¯ þÍæ´"�`; X7üÓ-ûÓøÑÿÞ'¡�-Ô¨ûÊóÃõÄùÇîª +òµöÇ÷Çôµ ñ¨Þ­Ç›þËòÁÿÎ Œ_·{-ÿ¶/êŒÄx  Ô~ë‰þ±0¸}3zLþÈòÀúÊÔ¦Ôšë› +ê¡ ùÃõÆò¹ê¤ öÆóÃôÄúÉᵘx5ÿ×&ùÏ÷Îÿ×-pIe@üÒ/ÿØ"¶Ž1< eD&άGå½<óÎ5þÖ.ÿØ,ÿ×(øÎ&ïÇ'å¼-Ô¬(˜+±…, q"”a ‰T€G†JO I H„R–i%¯†,Ò¨+îÅ+ÿØ+ÿâ(ÿä(ÿÝ-éÆ3Å¢3¯Ž2¶”,Ϥâ³ï¿ùÅì© çžúÀÿÒ´ƒJ%Q0ùÏ0üÓøÑÿÞ%¥…,ФüËóÃõÄùÈï« ñ³öÇöÅî¬ éœ Ù¢Æ™ýÊòÁÿÎ +”f£l$ÿº2é�Ѐ  Ûƒì‰ÿ´3¦n& QýÉóÁûÊÓ¦×�êŸ ê¦ öÃõÆô¶ê¦øÆôÃõÄûÉà³›{5ÿØ(øÏøÐÿÖ-lF Äš5ÿà'å¿1T+K �k&Ù±.æ¼âº%á¸+ä»*ìÃ$öÌ!þÓÿÖÿÚÿÝÿÞ"ÿÛ%ÿ×.õÐ0å»0Τ.¾”(©€&‘h!zQb:J(5 & +  + ++ ?"X6sN�h&°‡)Ì£.â¼-øÔ.ÿÜ,ÿÝ!ÿÛÿÚýÖ$éÄ0ʨ7´‘5µ‘+ÇŸ à´ôÂöÃõÆó¿æŸ ï¨ +ÿÊûÊ‘]€T'? M,øÍ0üÔøÐÿÞ$©‰1Í¡üËóÃõÄøÈï­ò°öÆöÄî® è¡ Ú¢Ä—"üÉñÀÿÏ –h•b ÿ»4é�Ø„ % à†ëŠÿµ3™d$ƒTýÉòÁüËÍ£Ù©ûÂõÁõÄøÇóµë§ øÆôÂõÄûÈ᳞6ÿØ(ùÐ÷ÐÿÖ,jEpIýÖ5ÿÝ#Û0Gh9òÄûÌöÆò èºÙ®Ï¥#Ê¡,Ê¡1Ò¬2ݸ0ëÅ*øÐ#ÿØÿØÿÖÿÕÿ×ÿ×ÿÚ ÿÚ%ÿØ(þÐ*òÅ.åº/Ú°+Ï£.Ř-½�#²…%ª}' v$˜o!•l!–k"–i!˜l#œr$¡v$«(µŠ)Á—+Ѧ.àµ/ïÃ1üÏ1ÿØ/ÿÛ)ÿÙÿ×üÓüÒýÕýÔ$íÆ2Ы8³‘3²Ž+Ì¡ê¼þËÿÌöÃñÀõÃñµߘ +ï¬ ÿÉ÷ňRª|%ÿç:—n) +L,÷Ì0üÔøÐÿÞ#ªŠ/΢üËóÃõÄøÈð­ð¯÷ÆôÄöÂ÷Âä³Á“ýÊòÁÿÏ ™j!‰Xÿ¼1êŒá‰( +, åˆë‰ÿ¸6�^" +„TýÉòÁüË֨͡üÉôÃöÃ÷Èò¶ì§ øÆôÂõÄûÈâµ›|5ÿØ(ùÐ÷Ðÿ×.lF*Ð¥4þÙ%ÿÞ&³‰(NÈ™!ûÊñÁõÃöÅøÇúÈúÈôÄ èµب ÊŸ$¿•*¸‘/¸”0Ç¡2Û´.ìÅ+ùÐ&ÿÕ$ÿÖýÔúÑõÍöÍùÑüÔþÕÿØÿÙÿÙ!ÿÛ"ÿÙ"ÿÚ$ÿÚ&ÿÚ'ÿÛ(ÿÛ'ÿÜ'ÿÜ(ÿÜ&ÿÜ$ÿÚ"ÿ×!ûÓùÑúÐûÏøÏøÏøÏöÏðÊ'Ý·0¡5¼˜.Ë¡ç·üÉýÎùÇöÃóÃôÆøÃì¨ +☠+óµ +öÂÿÏ–b­|&ÿæ'úÓè»3; M,÷Í0üÔøÐÿÞ#©Š+ѦüËóÃõÄøÈð®ï¯÷ÆôÃóÃûÈಿ’ýÊòÁÿÏ ™i~Pÿ¼4ê�çŒ1 2 é‹ê‹ÿ·8„X OûÈóÂüËÌ¡ Ó§ûÊôÃöÃ÷Çñ¶ë§ +øÆôÂõÃúÇæ¸›{2ÿÖ'ùÐ÷Ðÿ×.pIqLÿ×/öÎÿÛÆ›)|KÿÔôÂôÂôÂôÃõÃõÂõÃ÷ÅùÅûÆÿËýÌò ܯÄš ²‹$ª‚,¯‡.½”3Ï¥4ݶ.ëÄ*øÏ%þÔ ÿÕÿÕþÓüÒúÎøÍ÷ÌôËõËõÌöÍöÍõÎ÷ÎøÏúÐüÒýÓþÔýÓüÒøÏ!ôÍ%ôÌ$ôÌ!ïÄí½à²Û­è»ùÉýË÷ÆôÁóÀóÃôÇøÇö¸ êŸ ë¤ ù¿óÂúÇÏ›|MÿÜ,÷ÏõÍÿÚ(�e& +Q.ùÍ0üÔ÷ÑÿÝ%¨†*Ô©ûÊóÃõÄøÈñ®î¯÷ÇôÃôÄüÈß³¿“"ûÊòÁÿÍ ’c vHÿ¼9è�éŽ7"6 êŒêŒÿ¸9~Q wGùÄóÃûËÑ¥#Ô§ûÊóÃõÃ÷Æñ¶ë§ +øÆôÂõÃøÆì¼ Ÿ-üÓ)ùÐ÷ÐÿÙ+wP" Í¢/þØöÏøÐþÜ-‘\!È�ÿÏñ¿ôÂõÃõÃõÃöÃöÅ÷ÆôÁì± +ò·ô½÷ÀüÈýÍ÷ í¶Ú¬Ę¬ƒ"¢)¤�.®‹.½™5ʤ0Ô¯/Û¶1ã»*ê îÅ%ñÉ%òË&óÌ&óÌ'óÌ'òË'ñÉ(êÅ'å¿0ß»8ص3Ò°1ʨ5Ç¡0ϧ(ذæ¼ðÀñÀõÂùÄùÆøÅõÂóÂòÂòÄóÆöÅô¸ +ë£ é  +ô¸ +ûÈõÃò½ÿÌ ŠY»‘)ÿÜöÎ÷ÎüÔå¹5; V3ûÑ.úÒøÑÿÜ&§…4Û®úÉóÄõÄøÉð®î¯÷ÇôÃôÄúÊß²Ƙ$üÊòÁþÌ�\ nDÿ¼9é’ ëŽ<$9 ë�é�ÿ·9{O#n=ô¾õÄûËÖ©#Ô¦úÊóÃõÃ÷Çõ¹ +ë§ +øÆõÂõÃöÄñÀ Ÿ}(øÐ*ûÐöÏÿÜ(€YpKÿÖ/öÍ÷Ï÷ÎýÚß²2}DöÂóÂôÃõÃôÃøÆùÈ÷Å÷ÅúÅó³ ì©å Û“ ô· ì³çž ë¡ÿËüÉùÈôÃ ë¹ Ý°ѧÆœ½–´�'­ˆ(¬ˆ#¬‰#®‹&¯Œ&°�'¯�(±�'³‘'±�%³‘(¸•,¾˜$É ÔªÞ²ç¹ ð¿ôÂõÃ÷ÄöÄ÷ÄôÄòÂõÂôÄõÆ÷Æ÷¾ð±æ¢ç¡ +ó´úÅöÈõÅôÃùÆÚ©rFõÍ&øÐ÷ÏøÐöÎÿÛ,–j& ];ýÓ+ùÒùÐþÙ)¦„9ãµøÇôÄõÄøÈð®ò³ öÇôÃôÅûÊݱËœüÉòÃúÉ„R#h@ÿ»9ê’ ìŽ ?$ ;! ì�èŽÿ¸6vL'd5é¶øÆûÊݰÓ¦úÊóÄõÅöÆî­ ê¥ øÆôÂôÄôÄõÆ Ÿ|&ðË+ûÒôÏÿÜ'‹b"# É¡2þÙôÌöÏ÷ÐõÍÿß'ši$ŸiÿÐ ðÀõÃöÆë¬í¦ úÆøÄì« +ë¤î§ï«é¦é§ ò³õ¶õº ùÄ÷ÃòÃôÃ÷ÅúÇýÊþÍþÍýÍúËùÊøÈõÆõÆõÅôÆôÇõÇùÈûÉüÊýÊýËüÉúÈøÆõÃôÂõÂôÃóÃôÄõÅöÇøÆ÷Âò·ì§ çž é¥ òµ øÄ÷ÇôÄõÄöÆôÂÿÒŒ_­…'ÿÝõÎøÐøÑöÐúÖç¹69 hCÿÖ*øÑùÑûÔ+§„1ê¼÷ÆõÅõÄ÷Èï­ì¨ +÷ÅôÄôÄüÉܯÒ£üÊôÄôÄuE(f>ÿº7è’ +êŽ >% 8 ëŒêŽÿ¸6xM)[/Ü«úÊùÈç¹Õ¨#ùÊóÄôÆøÅê¤ é øÆóÃóÃóÃúÊ +¥�,æÁ0ýÔõÎÿÜ(–m( +uNý×-÷Î÷ÎöÏ÷ÐöÏùÑñÊ/sBÏœþÎôÃúÆð­à‹ç•ì  ä— á�ß�ã“ èŸ ô±ê¢ ë¤ìª è£ â öÂõÄõÃôÂôÂòÃòÂòÂóÃôÄôÄõÅöÅöÆöÆõÅõÅõÃôÂôÁóÁóÁóÂôÂôÂõÂõÃõÅöÇöÈ÷Åö¿ñ·ëª +ê¡ ì£ ñ°õ¿öÇõÆôÃôÃóÃôÄóÂÿÑÏ™ UúÕ+øÏ÷ÐøÑøÑ÷ÐöÎÿÚ)–m(uOÿÙ)÷ÐúÒöÐ-¨…*ñà õÅôÄõÄùÈî§çž +øÂõÅõÄûÊÚ­ܬûÉöÆëºi;)g>ÿº7é“ +é� ;$4 é‹ë�ÿ·5~R*V*ÉšþÏ÷Æï¿ جøÈôÄôÅ÷ÆùÀ ç¤ ÷ÃôÄôÄòÂþά‰&Ú¶0ÿÖõÍÿÜ'£y( ,Ó¨0ÿÙ öÎ÷Ï÷Ð÷Ð÷ÑõÍÿÝ$­„1a-ð¿ýÌóÃúÇø¾é›âŽáŒê¢ð´è è–å�èš å› +ø½ +ñ·ê¨öÂõÃõÃõÃõÃôÄôÄôÄôÄôÄôÄöÄöÄöÄõÅõÅõÅöÄõÃõÃôÃõÄõÃöÅøÆ÷ÅõÃó½ð´î«ê¤ +è¢ +ì¥ +ó± ö½÷ÆöÈôÅõÃôÃôÄôÃóÃñÁüËë¼!l3µŠ3ÿÝ'ôÎøÑøÑ÷Ð÷ÐõÐúÓê¾1@"ƒ]ÿÜ'÷ÏýÕïÉ0¬†.÷ÇóÃôÅõÅùÆë§ öº ôÇóÄõÄùÊש!å¶úÈúÉ߬`2)j@ÿº8é“ +çŽ5 / é‰ë‹ÿ·5‚V)Y+°�ÿÒôÅóà +á¬õÅõÄöÅöÅõÃé£öÁóÄõÄóÃÿÏ·�ͪ.ÿÙõÌÿÜ$±…({R ÿÙ0÷ÐøÑøÏ÷ÎøÏ÷ÐùÓêÅ-³)ºu"|>íºÿÎðÀôÄ÷Äò¶ ã›ò¹ôÆúÇüÂö½üÉê§èŸùÈöÇôÄöÃõÃõÃõÃôÄôÄôÄôÄôÄôÄõÃõÃõÃôÄôÄôÄôÄôÄôÄòÁð± +ñµñ³íªë§ê¥ é¤ +ë¨ñ®ò¸öÀøÃøÄøÆöÆõÄõÃöÃõÃôÄóÄðÀøÇì½xAÅzÈ&æ¿.ü×÷Ï÷Ð÷Ð÷Ð÷ÐôÍÿÛ'’k% “k'ÿÝ&øÏÿÖâ½4¯‰+ýÊóÂõÃöÄ÷Åê¦ ó½ôÆôÄ÷ÃùÉÚ§î½ öÆþÎǘZ,*pCÿ»7ê‘ +å‹0 & +ã‡ì‹ÿ¶4Š[$b2!’bÿÒ óÃ÷Åò¿õÆöÆöÄöÄ÷Äë£ õ¿ôÅõÄôÄþÎÉŸÁ�7ÿÚ õÌÿÛ!¿“+*Ôª2ýÙöÐ÷Ð÷Ï÷ÎøÏöÎÿØ!»•-Ì…ÿ® ½uz=Ú¨ÿÍ ò½ñ¾óÁöÀôÀð¿î¼ öÄüÊøÆùÂä—ñ° ÷ÄôÄöÃõÃõÃõÃôÄôÄôÄôÄôÄôÄõÃõÃõÃôÄôÄôÄôÄôÄôÅö¿ë§ ð° +ñ³ð´ô»÷ÀøÄ÷ÅöÄôÂöÄùÇöÄë»å¶ð¾÷ÃöÂõÃôÃðÀüÌâ²n9±iÿ¬ à� »’/ÿÚ$öÏ÷Ð÷Ð÷Ð÷ÐöÏúÓæº3<  +¢y)ÿÝ%÷ÏÿØÔ±4º’ ýÌóÁõÃõÄöÃê¤ ô¿ôÅõÄ÷ÅøÈîº ôÃôÄÿѬ|\/(zMÿ¼4é�â‰)  ÛƒíŠÿµ4™e$ +l;$wGüÊöÄöÆöÅð» ôÀ ÷ÄõÄùÇì¤ñ»ôÆõÄôÄûËÜ®²�0ÿÙ#öÌÿÚË )! yQ ÿÙ0õÎöÏöÏ÷Ï÷Î÷ÏûÒéÅ,«s"õ¢ +ñ™ÿ¨Ìo3¯}ùÆúÄò»ó¾öÂöÄë¸بÚ©é·ûÉ ó©êšûÅóÂóÁóÁôÂôÃõÃôÂõÃõÃõÃõÃõÃõÃõÃõÃõÃõÃôÄóÃôÄôÃöÀõÃöÅöÄõÃ÷ÄøÆúÉûÉ÷Ãé¸Õ§É›$Ô¦ì» õÄöÄöÄóÂöÆÿÒÉ™l4¶nø¢ +ð–ù£º}!ä¿,üÕöÏ÷Ð÷Ð÷Ð÷ÐôÍÿÚ*œn&¯†(ÿÜ#õÏÿÛ!Æ¢7É�ýÌóÂõÃõÅõÁë¤ +öÃôÄöÅõÃò¼ +úÃøÅôÄÿÐ ŒZe8"$…Vÿ¼2è�Ü„" + Õ~íŠÿ´2¨r% tE(e3éµýÉï¹ é­ê¨ê®÷ÆôÄúÈì©ñ´ õÇôÄõÄøÈ껪‡-üÔ'÷ÎÿØ׫0' $ Ч0ýØõÎøÐøÐ÷Ð÷Ð÷ÍÿÙ#¶Ž-цú¡ðšð™÷¡Þ�BKÑžÿÉÿÇ÷ÀöÁûÅö ߯ʛʚÀ€Ü�öÃúÈþÌýÊûÈøÆ÷ÄôÂóÃóÂóÂóÂôÂóÂôÂóÂóÁóÁòÂóÃôÂõÃøÅúÇúÈúÉûÈ÷Ä î¾à±Р Ä™%Á•"Ô£éºöÆ÷ÅôÃóÁùÅÿÑñ¤m|;Ï‚ø í•ð—÷žÞ’¶�+þØ$õÍ÷ÏöÏöÏ÷ÐöÐûÔê¼6B¾•)ÿÛõÍÿÛ$·”6تúÊôÂôÄõÇõ»é¥ øÅóÃöÆí¶ ë¨ë¨ï±øÇ÷Æq@oB( ’_ÿ»1é�Ó€  ÈwïŠý²/¶}2vI*_*È–ÿÏî´ð±+ñ°$ì­÷ÄóÄùÈî®î® ÷ÇôÅõÄõÄ÷Ç­‡+ðÈ*úÑýÖáµ30 {U!þ×.öÎøÐøÐøÐ÷ÑöÏüÔåÀ,«sø  ñ™ñšñšï˜ôœó ¸mv8‘YݧÿÌÿÈõÁó¾÷ÂùÅî» Ø¦Ç™#½‘&¾�%Èœ"Ô§!ß±êºñÀ ÷ÆùÈüÊýÊýÊýËüËüÊüËüËüËýÊüÉùÈôÅ í¾ãµÖ¨Å—#¶‹#²ˆ)¸‹'Ƙ%Ý®î¶úÁ úÈõÄòÀðÀ÷ÅÿÍ ð´‚�C©^ó�øží—ñ™ð˜ð™û¢¶yÚ¸,üÖöÌ÷Î÷Î÷ÏøÏôÎÿÚ(¡t+Ê¡,ÿÚöÍýØ&®Œ2ç¸øÇôÂôÄöÇò´ë© +øÆóÃ÷Åî³í«î¨ë¬þÎÝ­b-zJ- £k"ÿº0ëŒÇyµnð‹ù¬.Ç�6 rF%f0›lÿÑ ñÀ ë´-æ¦!è£õ¿õÅ÷Èò´ê¨ +÷ÆôÄöÄôÃþ̶Ž'áº0þÔüÕè¼28 3Ú®3ýÖöÍøÏøÏøÏùÏöÎÿÚ"°…*Ô„ùžð˜ð˜ñ™ñ™ð˜ð—ù í›µk‚=“[Ô úÄþÉùÃõ¾ôÁùÆýÇøÃ é¸تÉš ¹�#­„.¥1¨‚'±Š&¹�,¾”*˜ÅšÅšÇœÅš×Á–º’)´Œ'²‰$±ˆ&¶Š.¼�$À–#Ê�Ùªê¶õÀ ûÆú¸ëœê£õ¾ó¿øÇÿÎ +î½®}w=’PÞ�ÿ¨ ô›ò˜ñšñ™ñ™ñ™÷œÞŽ °ƒ&ûÖ$öËøÍ÷Î÷ÍøÍöÏùÓîÂ4I'# Ô«1ÿØøÏõÑ,¬‹2ò öÃõÃóÃ÷Çí­ î­ ùÇõÄöÁê¦è£è¤ò» +ÿÓ´…a+~M-¶z)ÿ¶,슺p£bò‹ó¦'Üš7f?$y?n>øÃ÷Ãê©óªõ­ðµ ÷ÇõÇö»é£ ÷ÄôÃõÄôÄÿËÈžͪ0ÿÙûÔíÃ1=  ˆ`"ÿÚ-öÍøÐøÐøÐøÐ÷ÏþÖß»+¡hõœ +ï™ò™ñ™ñ™ñ™ñ™ñ™ï˜ñšú¢ ¾o"4 - j@«zâ«üÆÿÊûÆ÷ÁöÀ÷ÁùÃÿÈá°Á�/¹‰2µŠ1±Š+®†)®�2¥z=º‘0Ò§ФÐ¥ѧÖ« ۬߰å·í¾øÄ ÿÌÿÍÿÈø»ì«ã�á–å–é˜ð§ ÿÊ +üÆÙ§šmI(žTø õ�ð–óšò™ò™ñ™ñ™ñ™î˜õ�²tÕ°+þÕöÌ÷Î÷Î÷Î÷ÏôÌÿÚ'œs* - àµ2þÖûÒèÅ.¯‹(ûÈôÁõÂôÂùÆì¥ ò³÷ÇöÆò¸ +í¨î¨ç¥óÂþÌ…Tq9pE(  Í‹-ý°(d�TóŒïŸë¥;'X5†O'R#ΚþÊì©ò§ï¨ï´ ÷ÆôÅøÁé¢ ö¿ôÃõÃõÃüÊÜ®¼™3ÿÚ!úÓñÈ2D%5 Þ´3üÕöÎøÐøÐøÐøÐ÷ÍþÜ$¥}*Ї÷œï—ò˜ò™ñ˜ñ™ñ™ð˜ñ›ñ˜Û`.9 tH®yÞ¥ ù¾þÇýÇùÄ÷ÃÙ£ˆ'Á‹/Ì”'З0Ò�5Κ:ÅŒ0Þ§ýÇúÄýÇþÉýÈüÈúÆ÷ÄôÁó¿î¯ê£èŸ éŸí¥ô° +þ¿ +ÿÈö¹â©"²~rF1 R& Õyî”ñšñ˜ò™ñ™îšîšïšî˜ô™Þަ{)ûÔ(öÍ÷Î÷Î÷Î÷Î÷ÎúÑê½4@!5ç¼0üÕþÖÚ¶4¾”&ýÊôÂõÃôÃøÃé¢ +ö»ôÅöÆñ¸ ê¦ì¦ ç¨ùÇâ°c-„K$`:"à›2ù©#îŠ�UrCõ�í™ø±>< J+‰R&U'ˆ[þÌòºè¢ì¨ +ûÇôÄôÅùÆë¤ +ó¹öÅõÃõÄøÇí½¯Ž.ùÖ&ûÓõË0K) ˆ_#ÿÚ-öÍøÐøÏøÐøÐ÷Ïþ×Öµ,¢hø¢ï—ñ˜î”í“ò™ñ™ñšóœí“ê‰ ¡Y1 U0{O¤uÈ•è°æ¯'Ô›0×›*ã¡â¢ÝŸÏ‘!Å‹(ܧõÀð¾òÀóÁóÂôÂôÃóÂò¾ê¤óªý¼ÿÂþÃñ¸Õ¡­€„[U3* +�Nçˆê�óšò™ñ™ñší–î”ï™î–ù¡³sά-ÿ×õÌ÷Î÷Î÷ÏøÏôÌÿÚ+Ÿs*9ê¿1úÓÿØʧ3΢üÊôÂõÃõÄö¾è¢ +øÂôÄôÄùÇò¯ ä›î· ÿ̨zS#ŠR'U2,ñ§5ó¢ïŒuET0òŒ ê”ÿ·ôŸî�ç‰ð›î˜ð˜ð˜ð˜ï™õ›Ý’ç»*ù×÷ÐøÑøÑõÎÿÛ&�d%- ˜k,�t­Ï¡ÿÎúÈðÀúÇݯ"Z1 kA$„M(2A# ü¯5ð�ñŠ R0ÍuìŠÿ·7‰WtD%‡O'1G#â´ýÌí¿¸“.ùÑÿÕÀ–-�u'ÿÛ&ôÌ÷Ð÷Ð÷ÐûÔ#â¦í–òšñ˜ð™ñ™òšò˜ñœæˆô˜ ¹u( ¤b÷›å†ñ›î˜ð˜ð˜ð™ñ™ð›ï˜å¦øÓ#÷Ð÷Ð÷ÐõÎÿÛ"µ‰) +EQ%S%\-žm"é¸ÿÐ Þ«!S.)}K%wG% +yLÿ¹4î‘ Ö} +”Tîˆø©&ʉ. V3�R&Y5 …[ÿÐÿÒ»”+ܵ%ÿÓ òÆ*T0À•-ÿÚ õÍ÷ÐøÐøÔóÄ!è›òšñ™ñ™ñ™ñ™ñ™ò™ì”éˆÚˆ C1Âx ëŠ ë�ñšð˜ð˜ñ™ñ™ñ™óšé™í¾!øÕøÐ÷ÐöÏÿØÒ¥1# ( V*m<$p?$d1 wB¾�.W3P1ŠP#\6 ¼~&ü±)ó�¡]J*êƒì—õ¬3@! :„M'uE& 1 Û©$ÿ×â·¯Š-ûÐÿÔ»Ž* (Ù¬/ÿÙöÏøÐ÷ÐøÑ!ç¤ï˜ò™ñ™ñ™ñ™ñ™ñ™ñšçˆ܈e4GÊ}å‡ï—ð˜ñ™ñ™ñ™ñ™ñšñ™äŸõÎ"÷Ð÷Ð÷ÐüÖåº/5  H!c3k8$^/">mA&…N'B4 ñ¦.ñŸð‹ [3 Éué‰ +ÿ·3‹X J&[/Z.N( +Ž_ÿÐú˨�(Û²$þÐüÔ(yM! 6é½0þ×øÑøÐùÔé·æ•ó™ñ™ñ™ñ™ñ™ñ™òšì‘Ýx@_/Özî‘òšñ™ñ™ñ™ñ™ñ™òœè•ç²ùÔ÷ÐøÑúÕôÉ-I( +  O)\.Z-L& + +yIÿ¶2é� Õ} +�Rðˆø«(Ñ�0I(f:X2b60B å°üÍÙ®©+úÑúÓä¹2A!E(òÊ1ûÕùÐùÔòÌ'ß›ð˜ï™ñ™ñ™ñ™ï›ïšï—éŠ —O‡Bê‰ ð˜î™ïšòšñ™ñ™ñ™ò™àšïÈ%ùÔùÑøÓýÐ/\7  + / 32/ "  2h:!`3f7K*À,û­+î‹�ZB&éˆî™û²5J), mA#lCmCM+¥výÎ øÊÂ’ á´!ÿÜõË8‘h3Z:ýÔ-÷ÐöÎûÔ&ä¬ë–òšî™ñ™ñ™ñ™ð—÷ž÷—Ës9-½eô— öŸî—ð˜ñ™ñ™ïšóšî—âªùÔ%öÏôÍÿÙ(qL +6Y+a/e1d1f4`1M%$  +N*pF"pDsD&/< ö©3ï›î‰S- Ârï‹ÿ·4™b!Z3nDhBf=!,d=üÉ÷ÆÿÎÍ•-’]]-S$6oM"ýØ:ÿØ"ÿÝñÅ!å™ +õœï›ï™ð˜î—ï—ú¤àŽÁpd5Y+ Âq׆ù¤ð˜î–ñ˜ðšñ›ö�çš +ìÁÿÛþØ$ÿß9‰c'1Q$Y(e5b3c4e6f7g7 O) & g#@") m?%T. l@&],b3`2`3b2 >* Z-j7"j9"a/¶x%”[>  2 +}H½|&n9g7 g9[., <æ¹-üÐ ÿØ®ƒ/ÏœÿÎ þË ûÈ'‘f') + R+k>%'9r? ].&= õ¨7ñ�ô‹W.®fï�þ´,´v*H+‡P&nB% 1h%ŠR'X5&›b"ÿ±.ïŒÄrR-ê‰ïœ÷ª7< sG%†N&:$I&d;"  C ^2 ]0"5 +#  +  +rHûÑúÎ÷Ñ!§�/îÁüÈùÂ|L j="Q+.€K&{I(! + í¢2ñ�ïˆ g9 +¸nê‹ÿ´1¤i)J-†M%lB& h=#P* " 6]. FŽi*…`((  V/è½)øÍÿÕ¸‘)Ρ ÿÎþËšeN)n?" c>%�K%S0 “\"ÿ´2èˆ Çu \2ë… íœôª:? pC&‚J%A(G%qA%# +Ah5X)oG è¿;ÿÞ5Ú®2ƒ]"6  `7ëÉ<ýÕýÑÓ¦%±‚$úÆýÍÉ’", + l>"K(<"~K&wF) / î¡3ô¡ ì‡ o> »oë‰ÿ·7ªp(=&€L'uF'  m?#K) Dj7V'b6é¼"ä¸Ù°)ÿÕ)ÿß)á¸2�s(L+yOöÕCôØ+÷Ï ì½­w$ðÀöÇêºT/D$g>!  qD(‚M%N/!•\ ÿ¸3ñ� Íx + W/ìˆîŸø®;G% jB$…N$Y3 N'g=#  W*^-OÝ®÷È÷Çé¹Ç�(á»*ÿàÿÞ&ðÉ1³‹.\9=¨}(úÏ8Ы2â¶üξ†%çµöÆýÌ –k b9!I(H-‚N'uF& 4 +ì¡3õ£ô�n;³hñŽþµ1¸v*6 ƒL%ƒL&( +l@#9 + j;¿�#ûÊýÉóÁóÂøÆñ Ȟ&ͦ3ù×'ÿÛÿÜ#ûÑ3Á“.hB& +  1 nG±‡,÷Ì5óÌ6´‹/Ô¨þÏé®ß›þÍøÉàª85iA'"  xH*ƒM&@&¥`!ÿ³1ñ� ÉtK'ë‡ð™ü°8S.a;"ˆM"g=$W1]2 ‹a%ÿ×÷ÃôÄôÄóÄôÂöÅüÊש¹‘2ëÅ0ÿØøÎÿÚ#ýÓ1È›2h= C$“l)Ù­3ÿÚ2ÿè4Ó±;¨‚,ݰùÉõÄå  +ó´øÅÿИi +Z2\3 X8#�J#hA( B"õ¨8ñšïˆZ1¥`íŠú®+Ê…- zI'‚K%=!3sD%% +F% ëµøÆöÂõÃõÃõÃõÃôÂýÊ嵨€*Ы3ÿÙ%÷Î÷ÐÿÛ#øÐ0¯„-> > œu)éÀ8þÕ&ÿÝîÊ+­‹3»‘&öÆúÈóÃô½á—ö½ûÇñ¼P+" pA%:8zK'zJ)* +½|.ÿ³2ëˆ ³f4 Þ‚ê‘ÿ¸8zFD*‚K%sC&4i< I'É” ûÌòÂõÃõÃõÃõÃõÃóÁøÇòIJ†$¹’5ü×*ýÕöÌùÑÿÜ%â¸2tJ    + 1 ‘g#ê¿4ÿÚ&üÒÿØɧ2•t,Ò¨ÿÍùÄöÃùÈï® +æŸõÁþÊÊ–# D#j;$7uC&€I%R1!l<ÿ¶8í˜ç‚=!‚LïŒ ö§$é 7+ f?&J%d7W-f:# ¾þÉòÂõÃôÂôÂõÃõÃõÃôÂöÃÿÌ +Ëœ®„2ñÉ1ÿØõÍöÌþÓþÔ/³ˆ2C" ) @P+[4b8!g:#i<$j=$k=#j="g;#`6S.A#,iBÕª4ÿÝ,ûÒýÓ÷Ó,­Œ8Ÿ&îÁýÊóÂõÄõÃúÈéŸ ò°òÂýÉ ¤p^5U*f6…M$rD( !á˜/ù«&ð‹‘WÇuï� +ÿ¸7«l'&{J(}I"`2i>"4% ÃxýÁóÄõÃõÃôÂôÂôÂõÃõÃôÃôÁÿÌᮨ|*Úµ1ÿÛ öÍöÍ÷ÏÿÛ(å¹5tK ) L(e: pA$l>#`7U/I'B"?>@D"L'U.^6g j:S,7   , D%a6sA#k<#K'#   ! +!  / �i%îÂ1ÿÛ&õÌùÎÿ×"Á�0žy)å·ÿÍõÀõÂöÃóÃ÷Æùº +ã— ö¼öÅ÷Áö¾]4L+^1b4„N&T3!Q+û¬2ñœðŠ_5�\ñ�ø«+Þ“2! d<'}H#rA l>!% d8æšöÂôÃôÂôÂôÂôÃ÷Ãõ»÷ÁõÄôÄóÁùÅúǰ…#¯ˆ/úÓ(þÖöÎõÏõÎÿÙ ìÂ-’e&U%]+> + N(c6"_6!;& +9K)[4h;"l>!n?$n?%m?$m>$k<"c9!U/C", $ zOÛ°3ÿÜ,ûÓôÊÿ×ïÊ-§ƒ.µŒ#úÆúÇòÁôÄõÃôÃôÆù½ ã™ó¶ øÅõÁúÂó½M+ d: U*wC#lC) ×�-û¯*ñ� ¨bÏ{ë� ÿ¶9¦j' uG+{DwG#N)2 ʃ"ò°÷ÄóÁôÃóÁ÷Åñ®çš +ð²÷ÆôÃõÃôÂõÂÿÎÈ›™r-ã¼0ÿÛöÍöÎôÌúÒÿÛ,Ó©4vH$@V,b5h="j;"d5W.J(@!71/4? O*`6oA#qB$d9F'" # . 9D%J)O,R-R-P+L)E%<-  \8˜5ÿ×/þØõÌøÏÿÜ%Ö²5žz.רÿÍôÂôÂõÄõÃõÂõÅùÁ å™ ñ° +öÆõÂöÂùÄö¹b9L'c6`0{L+$œ^!ÿ¹8ë‘ Û~) S,ë†íšÿ·:p>7!{I(yFq?"'  �^ð¢ó¶ôÅõÁôÃùÄò°è˜ ê�ùÃôÄôÄôÄôÃõÀÿÍß²–p&Á�2ÿÛ!ûÓ÷ÏøÐ÷ÏÿÚ þØ3¿“/W42 R,c8!f:!Y2H(F!_/].3 4Q&Z.R(L(\3f:!n>$p@%o?#j< a8]6[4[4^5a6f:k=!k="h#Y2> %  , Y2k"R)V)g81:i:!X/- +9 uN¸�.òÈ0ÿÛ&üÖõÏõÏ÷ÐúÓúÖ"â¾5º•4Í£øÈ ùÇôÁõÃõÃõÃõÄöÂôÅ÷Åì¦ +æ�öÀ öÆöÂöÃöÃôÃôÂ÷Èëªö®ˆY +' I'f:"e8_-~K,?&A ìž4ö¨&ô‘ ¢` ºmò‘ ú±.ߘ5/ 8!xJ*wEp@ c5m@#m?"T'wIôÆöÄí¦ +èŸüà +í¼ ò¾ ùÄôÁóÄ÷Çð«çžõºöÈôÄõÃôÄôÄòÃôÁÿÎï¿­…˜u*Ç¥2úÖ+ÿÚ÷ÐôÎöÏöÍ÷Îþ×ÿÞ&÷Í0Ц0šs(^;,  J'j="e= F& ! V0m?$M)J$~Q¯…-ãº2ÿØ+ÿÛùÑõÏôÐöÎüÔüÖ!ôÏ!ç¿!Ô¨ð¿þÍôÃôÃöÃõÃõÃöÃôÃöÇø¿æŸ ë¦ùÅõÄõÂõÃõÃõÃõÃôÃõ¾î Ý #T(X/d7 d<"V/U*e4…O,N-'ØŒ.ý®-ò� Ás!( Õ{ï“þ´1É‚. B(}K(|J#`4, 6H*6¯€ÿÍ öÅò¬äšך#Ü¥ò¾÷ÆôÃôÃøÉõ· æž ï­úÅõÅõÂõÃôÄóÄòÃõÆÿÐæ¸¨‚—t+È¥.øÐ*ÿÚùÒõÏ÷ÐøÏ÷ÐúÒÿÚÿÛ%øÐ,Û²/°Š-…`#^;="  8`4c7C"  +8c8`7!9 +' <b@�f$»’.ã»/þÖ,ÿÝ&þÖøÐôÏôÏöÎþÕþÙ åÂ+Ï©2ä¶õÃûÉøÇôÅôÄõÃöÃõÃõÃôÄúÆñ³ ãš ò°øÇõÃõÃõÃõÃõÃõÃôÁùÇéŸ÷°ˆYFX0? # K(tB(€M'P2Ãy*ÿ³2ï’Û€-?àƒð•ÿ¶9³r+M.„O'„N'J* E!ã­!üËö ڛñ·Ï“'Е(å®ùÆöÃõÃöÇùÂë¤ +ç¡ö½öÇôÂöÂõÃôÄóÄóÂøÈÿÏã¶­…!šr'¹”/íÉ,ÿÜ"þØ÷ÑöÑöÑõÏõÎ÷ÐþÖÿÛ"ÿÚ)ûÏ0è½0Ê¡+ªƒ(Še"wOqCf8L!. +9 U([.O&P.^>vR”m'µ‹,Ò¨.êÂ1ûÓ*ÿÚ#ÿÙûÔ÷ÏõÎ÷Î÷ÏùÒÿÙÿ×$ܹ/´“4¹“*àµøÅøÃôÂôÃõÄõÃöÂôÄõÂ÷ÅøÃì§çœ +õ»÷ÇõÂõÃõÃõÃõÃõÃõÂùÇï±ð¢ Ë”*) + =%wH(�K&R1# ®l%ÿµ2ï—æ‰H'T.ë‰ï˜ÿ³9 a% O/‚M(~K%J- pDûÈñ¼Ù¡!Ö™&Ñ’$öÀãªàªøÆôÃôÃöÅùÈñ² ç›ð­ùÄõÆóÄôÃôÄôÄôÄóÂùÇÿÎ麲‹•r'«‡.Úµ/ýÓ%ÿÜüÖöÏõÎ÷ÐöÏõÎ÷ÏùÑüÔÿÚÿÛ ÿÜ#ÿ×&öÍ)îÃ*å»*ܱ,Ò§.É�+À”&»�&»�'»�&¾“(Ç�.Τ,׬&åº)ðÅ(ùÑ(ÿ×'ÿÚ%ÿÚ"ÿÚúÕöÏóÍôÍôÍôÍ÷Ðþ×ÿÝ!öÐ(Í«3¥†3¬†+Ù®ùËøÆõÁõÂõÃõÂõÃõÃõÃôÄùÇô·ç�í© +÷ÄõÅôÂõÃõÃõÃõÃõÃõÃôÇø¼ ç™ó´$U3L,‚N,�L'W4#œ^!ÿ³6ñ™ï�`7o>îŽíœÿ²9”W K.}J&}K$S2•cÿÍòº +Ï”#á©ÿÍè±à©øÆôÃôÄõÅõÄøÆøÀí¦è¡ õ¶ ùÆôÆóÃôÄôÄôÄóÄóÂùÄÿÎôÃÌŸ£|!™w+µ“,ܹ-ûÕ$ÿÜþ×ùÑöÎöÎ÷Ï÷ÎõÏöÎöÏöÎøÑúÓüÔþÖÿ×ÿØÿÙÿÚ ÿÚ"ÿÚ!ÿÚÿ×ÿÖþÕüÓùÐøÎöÍõÎõÎöÐöÏöÎõÏøÐüÕÿØùÒ'Ú¸1³’2 ~,¸‘ãµüÍüË÷ÁôÂôÃõÂõÃõÃöÂõÂöÆ÷Áë§ ç� ó¸øÆóÃôÂôÂõÃõÃõÃôÂõÃôÄú +å™þº”d$ K+…N)†M'Y6$‹Rÿ³4òžò’wC}GðŽñŸÿ²7�U$J-}J#ƒK"X4# «z$ÿÍóÁÚ¥ Ý¥ Ý£ ÷ÄöÃôÃôÃõÄ÷ÃôÂóÄ÷Çõ¸ê ê¤ö¼øÈóÅòÃõÃõÃôÄôÃòÂõÃýÌýÌè¹À•›v$˜v-³�-Ö²-ôÏ&ÿÙ!ÿÚþÖúÑ÷ÐöÎõÎöÎöÎöÏõÍõÍõÍõÌõÍôÌõÍõÍõÍóÍôÍôÍôÍõÍöÍõÍôÎöÏøÒýÖÿÙÿÚ õÐ(Ùµ1µ“2˜w0¡}'ÌŸñÁ ÿÍúÇôÂõÃõÃôÃôÂõÃôÃõÂ÷ÅùÅð° å�î¬úÂöÆóÃöÃõÃõÃõÃõÃõÄõÃôÄúÅèšø±Ã�&' H,~J)ƒM%X4!ƒMÿ¯1òŸó�†K‡Ló‘õ ÿ²9†OC(L&…L#b9% * +¿�%ÿÏ ÷Ææ±ò¾ öÅôÂõÅøÅôÂõÃõÃôÃôÃ÷Å÷Æî±è�ì¨ öÀøÇôÄôÂöÂõÂõÂôÂóÁóÁ÷ÇÿÍüËâµ½•¢{"˜t*£ƒ/½š/Ú´.îÈ+üÔ(ÿÚ#ÿÛÿÚÿ×üÓùÑöÏôÎôÎõÏôÍöÎöÎöÎõÏõÎ÷ÏøÑûÔÿØÿÙÿÚ!þÖ#òË'ܸ,ÁŸ/¦ˆ1œz/¤€$À˜å¸üÌýÌöÄóÁôÂõÃõÃõÃõÂôÂöÂöÅ÷Çô¶çŸé¢õ½øÆõÄõÃõÃôÂôÃõÃõÃõÃõÄôÄúÅçŸôª×¢%= X5#J$}J)M-†Lþ®3õžóŽ�P‘Tö’ð£ü°7…P=#}K'„J j@% 5 Ξ%ÿÎöÄöÅôÂõÅã²ä³ýËôÃôÂôÄôÄôÄôÃ÷ÇöÁï«ç� í«ö¾ùÆöÅôÂôÂõÃõÃõÃôÄñÄòÂúÆþÎýÎíÀÔ¨¸�¥%šy(š{.¥†,³“0¡0Ô³'äÁ,îÊ*ôÏ"ùÒ$üÖ#ýØ!ý× þ× þØ ý×!üÔ#÷Ñ"ñÍ$èÅ)ݹ-Ь+ÁŸ0°�-£‚1ž{*¥~$º‘Ö¨î¾þÍþÎûÆöÂôÃõÃõÃõÃõÃôÂõÃôÂõÄùÆô¸è¡ +èžôµ ÷ÇöÅõÃõÃôÂôÂõÃõÃõÃõÂõÂõÄúÅè�ò¦è¯%O* j@(…K%K'E*†Lÿ°3ô¡óŽ�T’Uó�ñ¡#þ±4‘X 2vI'€K"rG)'B Ó $ÿÍ òÁôÃôÅñ Ɩ&Æ–!úÈúÉñÂôÄôÄôÅóÄôÄöÈöÁî¬ç ì¨ò»÷ÆöÅôÃõÂöÂõÃõÃõÃôÃóÁóÀöÃüÊÿÎþÍöÅ ä¹ÓªÁ™¬†¡|œz(˜w%šz%œ~$ž€%Ÿ�+¡ƒ- ƒ.¡„-£„'¢‚$ (Ÿ}%œ|* ~#­ˆ ¼–!Í¥ã¶óà üÌÿÍüÊöÄôÂôÂõÄöÃöÃõÃöÃõÃôÃöÃ÷Æ÷Åò¶ç¢ çž ñ²÷ÅöÆôÃôÃöÃöÇøÆ÷ÆöÅõÅöÄ÷Ä÷ÇùÁå›ò§ ì´(U2 sG(ˆN"‚Q,<#ŒSÿ±4ó£"ô�•VŒNñ�ò¡ÿµ<ža%"lD*�N#~L(H,; Éš#ÿÏòÁóÃøÃúÊ Çš#¨~&ä¶ÿÎöÃòÂôÅôÄôÄóÃôÅöÇöÁï¯êŸê¢òµøÂ÷ÇõÆôÃôÃõÃõÃôÂõÄôÃôÂóÁóÁõÂøÆûÊÿÌÿÎýÍøÊ ñÄ ì¾ æ¹ àµÞ±ݱܰÞ±ã³ä· éºðÁ öÇýËÿÌÿÌýËùÆöÃóÁóÁôÂõÃõÃõÃõÃõÃôÂôÂóÃôÅøÆ÷Áñ²ê¢è ó±ùÃöÇõÂõÂôÄ÷Æ÷Áï®ë¨ ð® ó´öºøÁæ´é¯å™õ­î¶#Y23!xI*…M%xH,2 ˜\!ÿ±2óŸó‘•VƒLð‘ï¡ÿµ<²m(  +f<&†O$…O$]:$)¹‰&ÿÐôÂõÂôÄýÏ೤{(»‘óÆýËòÂóÃôÄôÄôÄóÄôÅöÇ÷Äóµë¥è  îªõ¹øÃ÷ÇõÄõÄöÄôÂõÃõÂõÃõÃõÃôÃôÃóÂôÁôÀöÂöÄ÷ÄùÅøÇùÈûÊûÊûÉúÉúÆøÅ÷ÄôÃòÃñÂôÁôÁôÃõÃõÃõÃõÃõÃõÃõÃõÄõÄõÄøÆùÄõºî«éžë£ ó·øÅ÷ÇóÄòÃöÂ÷ÅøÅò¯ çœ +í¦ +ð¯ï¬í§ë¤éŸ +Ù”ÖŽû¸ é·$V1M0J+ƒN&nA( ©g#ÿ±4ðžð�‰QsAìˆïœÿ¶9Â~-)  U4 ƒN*ƒL%mE&$¡p!ÿÍùÉôÄñÃúÉ÷É»“"œq&Ò¦þÍ øÈòÂóÄôÄõÃöÃóÃôÄöÆøÅö½ï­è¢ +ç¢ +ï¬ õ¼ôÀî¶ ó½õÅóÂ÷ÂõÃôÄôÄôÄôÄõÃôÃôÄôÃóÃóÃóÂôÃôÄôÄóÄóÄõÃõÃôÃôÃõÄôÃôÄôÃõÃõÃõÃõÃõÄõÄõÃõÃô¿õ¾õ¿ï¯ ë¡ è î«ö½øÆöÅôÃóÃóÃöÆ÷Æò·çžé¡õ¼øÇ÷Æ÷ÇøÅøÄùÃá¦í¶ ئ&F" & g@$�M$€M'Z9$ ( Áz(ÿ³1ñ›ï‹yF[3âƒðšþ³6ÔŽ0B :$yI)I!tF&<#}QõÄ!ÿÏðÂñÃóÃÿÍ书|%§}#ä¶ÿÍøÅôÂóÄôÄõÃõÃõÂôÃõÄ÷Ç÷Ãõ¹ î«î® +æ¥è�ñ¬ ÷ÁøÆõÄôÄôÃôÃôÄôÄóÃóÃóÃóÃóÃóÃóÃôÄôÄôÄôÄôÄõÃõÃõÃôÃôÂôÂôÂõÂôÃõÃõÂ÷Åìµ ò¼õÅõÅí² ç¥ì¬ îªôµøÃùÆõÅôÃõÂôÃöÆöÇó¹ ê¡çž òµ +øÆõÅôÂõÂõÂõÃòÂôÄÿÑ·Š)5 9vI(†L#K*>(?ÙŒ,ÿ³-ó˜èŠf<H&Ø}î•ø®.ë�5e:g@(~K#I"_6%( X/Ú¦&ÿÐñÄñÂñÃùÉÿÎ Ô¨¡v&²†"ç¹ÿÎúÅòÁôÂõÃõÃõÃõÃõÃôÄõÆøÇöÅî·ç  î§ +åŸ í¨÷ÄóÄõÃôÄóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÄóÄóÄóÃóÃóÃôÂôÂõÃõÃõÂ÷Æì° ê± öÇôÄô»ï² ô¿øÆøÅõÃôÃôÃôÃõÆùÅõ· ê¤ç�ò±øÄöÆõÂõÃõÂõÃõÃòÁüÈúÈ“i5 +T.€L'…K!pE*(\2ë›-ÿ¯.ò—݃Q,2Àoñ‘õª)ø¬8’W"  O0 €L'„M!wH%?: ¤røÆúËòÂôÄõÂýËøÉ Ë�Ÿt%®…ä·ÿÎúÉòÂóÂôÄõÃöÂõÃôÃôÂõÄóÀó½øÇøÂé¥ì§ öÇõÃõÄóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃôÃôÃõÄõÃõÃõÄó¼ +æ¨øÅôÃöÃ÷ÅõÄõÂôÃôÃóÄøÆúÃñ´ ç  +é� ð°öÅ÷ÇôÃôÃõÄõÃôÃóÂôÁÿÎ ß®!nCBqB$�L"€H*Q3! ‡Où©1úª%ó”Év7 +£^ñ�òŸ!ü³8´v)+ +0oC%‚L#K#^58 l>اÿÐöÇñÂòÃòÂýÌöÇÆœ—q"¥€Ü®ýÊ þÌõÄòÁôÃõÃõÃõÃõÃõÃöÅôÂôÃ÷ÆæŸñ°öÈõÂôÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÄôÃõÃôÃöÂë® öÂôÄõÃõÃöÃõÃôÃõÅ÷Áð¯çŸêŸ ò²øÅ÷ÉôÄõÂõÃõÃõÃöÂóÁúÈýʳ‚V)a2„L)…M'qC&0$ ²q&ÿ´4õ¢ð�¥_ +|Fç‡ï˜ú²3ß–3e9J.yH'€L#xI#U)Mœjî¿ÿÎõÃòÁóÂôÄÿÌöÉ É Ÿv"�x"Åší¿ÿÌýÉõÃóÁôÂõÃõÃõÃõÃõÂõÅ÷¿å˜ô»õÅôÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃôÃõÃõÃôÃ÷ÃõÃõÃõÃõÃ÷ÂôÃ÷Åó´èœï¤ õ· øÃúÆö¾ðµøÁõÃõÃõÃóÁöÄÿÏ Þ®€RS%t@"‡M(‚M(T3  +W/à’1ÿ¶1ô�è‰~HJ)Êvó“öª*ùª5Ÿ_" #a;"ƒL$…O$vB$R&b3¸†ùÅÿÌôÂóÃôÂöÃþÌüË Û®­„—n%«‚"Ó§õÄÿÎûÊöÄóÂóÂôÁõÃôÂöÆô´çš÷ÃóÃôÂóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃôÂôÂõÃôÂôÃõÃöÃõÃõÃôÃôÅö½ çœ÷º øÇ÷ÄöÆúÂ ê  ä’ ò°öÆòÁôÂÿÎòÀ¥q^+c1}J&€K&kA)*’Tûª2ü¬+ô•Õ{T.  £[íŠñŸý´5Ò‹0T-9#sD'…M'�K'h:P"rBǘþËÿÍôÃòÂóÁóÂúÇÿÍðÁÉœ¦{%šs%°†!Õ¦ðÁýÍýÌúÈöÃòÁñÁøÆíª ê£øÅóÂóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃôÂõÃõÃôÂôÃôÃõÃôÃ÷Æè£ñ±ùÉöÄö½ð¬ê�ë› êž +ð¶õÃÿÌ÷É»‹j;\)zE"…N(qD&;& +M'Ì€+ÿ²0óŸî‹«_& j8Ú~ó™û®/öª7™\$# K,yF'„L#I%h5Y%€OÈšùËÿÌöÂóÂôÃóÁøÅÿËþÍ +ì»È›¨‚$œu'¥"½”Ù¬íÁ üÊ ÿÌþÉÿÈì¢î«öÆñÁòÂòÂòÂòÃóÃóÃóÃóÂóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃóÃôÂõÃõÃõÃõÃôÁôÂøÅô¶ë¡ +üÅ +ñ¶î£ +è›í¥ö¸öÀøÁÿÌøÇÁ”tFZ'w?ŽS+€M*Q1  ”Yöª7ý²/ñ˜Ý~v>3®aê�ñ£!þ³4ÙŽ3k<  R1!|H'ˆM"}J#d4V'yJÅ’øÅÿÎ÷ÄñÁôÂõÁóÂöÇþÌþËïÁש¹�¢|#�t%§~$¹�Ï á²ñ½ëŸõ¸ûËúÉûÉùÈøÇöÅõÅôÃôÅòÂòÁòÁñÁñÀñÁôÄôÂôÃóÃóÃóÃóÃóÃóÃõÂôÂôÃõÄöÅöÆùÄ è–ë›é¡èŸï®ö½õÂøÅÿËôÀ»ŠrDS%j8ˆQ%ƒN+W5  \4Õ�3ÿ¸5ø¦ ð’´g8e8Ò{òšõ­,ù®8ºw*D% P1 yH'†O%}I$c5T&rB³†î¼ÿÎ üÊôÁóÀôÂóÂòÁöÄûÈÿËýËïÀݯÊ�µ‹¬ƒ#¯†&°}%ΈЙÊ¢Ô§Ú¬߯æµéº +õ à«Ù¦ Û¨ Ú§"Ú§"Ú§ ؤ"å³öÅóÁóÂòÂòÃóÃóÃôÄôÆöÆ÷Äõ½ñ²ì¦é� è›îªó¸÷ÁöÄüÇÿÍ íº³m>T%m8ƒN%wK(Q2 8 ¬m(û«5û«)ñ˜Ú�u@ & žZìŽõ ú°0ð¤6£e%2  H,qC$„O$‚L&n9Z)i9škÔ¥úÈÿÍùÆóÂñÀóÁôÃóÂõÁ÷ÄûÈþËÿÍýÊòÅ +ì¼è«ʇӤʣ›&¼’!¼�ʛўΘ*å­%á©$áª%áª)á«'à©/Ë—$òÃöÇõÆöÇöÅöÃöÀò¹ï¯ì§ é éžë¡ +ð­ô¹õÂ÷ÃûÅÿÌúÅØ¥œjf6[)u?‰R-yK+K/ , +š[ñŸ4ÿ±2õžé‹¤_1P+½oò•ô¢û±1é�2’Y#+ + 9#g<%„P)‹R)zC#a/[*yJ±€â°üÉÿÍùÇôÂóÁóÁôÂôÂóÁóÁôÃöÃõÇúÉó²ì¢ù¹ úÁúÄ÷Ä ûÆ +ܡަ&Η(Ì–(Ϙ%ј#Ñ™!ëµÞ¤ì®ò²îªì¥ê¡ ê¡ å“é›ì¥ï®ò¸ôÀõÄõÅ÷ÇÿÊþÇã±±€yJ_.g2}H#†P+nA(=% %ˆQë˜3ÿ³8û¤#ô”ÁpV1 j<Ìxñ—ø§%þ²2â˜0�W + %P0uG(‰S+„N'm9Y(^-O±€ß­øÇÿÎ ÿÌùÇôÂóÁñÂñÂóÃóÂôÂøÅòµ +é£ é¢è è çŸé¡ í¯è®%ùÃõ¾ùÄߦ"ò¹ð² ç¡ ì¥î¨ï¬ôµð§é›÷ÃõÅõÆöÈûËþÎùÈ᯴‚€Q].])s>#…O,}K)V4 ($ €NÝ’4ÿ°1ù§"õ–×|uA zFÕ€ö›ø©&ü²6â›4™`#<.U4uH'ƒP*}H$i6Y*^.yH�m“ã³øÆÿÎ ÿÎýÌøÇõÄôÂðÀóÃôÄõÁõÀö¾öÁã«Óš"ן ߪÞ§á§Ó™!Õž ܦõÀ +öÃõÂöÂø»éœûÄýÏýÏúËî½Ñ ©x~Nb0Y)i7 yI+xM-\; 5  5 �W ã—2ÿ¯6ù§$õ•Û~‡L# $ …LÔ�ô™ø§'ü´4ð¡7®o*Y2,L0mC%€N+€M'tA!e2]*b2uH�`®Ë›á°ñ¿ûÈþË ÿÌ +þÊüÉúÉ÷ÇøÆõÃî»í» î¼ ï¼ +ñ¼ ó¾ +ó¾ úÄ ÿÉýÊÿËÿËì¥êªÜ­À‘Ÿs‚Rk:c0i4t@"{J(qF)R4/ + +L(©h&ñ 3ÿ´5ý©$ó™Ú}‹N*# yEÌvð‘ö¦"ý±0ø­6͈.}K1   <$\9!uH'�O,€L+wB$i7].X,\/k;~K’]¥s·†Ç”Õ¢ݬä²é¸î¼ï¼ñ½ï¼ì¸æ²à«Õ¢È•¸…£s�]w@k:]-\-d3n=%tF)sH(a?#D+$ * sDÃ}+ö¨3ÿ±-ú¤$ó•Óy‚H)  i7½hë‹÷ ÿ­(ÿ²8éŸ6´r+h<)   4K-^=!nE(xJ'{K)wF%sA"k7f3d/`0b2d5i8l:p=o>p?o>l<i8g4e2c/c0f2i7"m=%m@)kB(c=&S3 9#  ^7«m'å�3ÿ²7ÿ°)ù¢ì�Àpr@  + M%œXÙ~ò•ø§%ÿ²1ÿ°8â™6°n%o@2 + +" 2B)O0Z7c<#gA$jB&kC'nE(oE'oD&nD(mC(lB'iA)g@(e>%a:#\7"S2 H,9$' + ) d9¤h&Þ˜5þ±7ÿ²1ý¨&÷™ß‚¥]U-& m:³dà„ô–ü¥&ÿ¯,ü¯7êž4Á|+†S!L*"   +    +  G'~M¶w+ãš4û®5ÿ²0ü¨&óšâˆ·gt>-  8 y@¶eÞ…õ˜ÿ¦!ÿ¯)ÿ±3ù©5ß”3ºw-ŒS _37 +2 +X2…S´x-Ý”6ø©8ÿ´8ÿ²/ÿª$÷™à…·j~D9 2 o:¨`Ò}ì‘ùžÿ¨!ÿ¯)ÿ±5ù¬6ì¢8ÖŽ3ºw+™]%zF]1B*  %< Y0uD”Z$¶t*ÔŽ1ê£8ù¯8ÿµ7ÿ±-þ©#ú¡!î”Õ€ª`q<4 + J%zE«cÐ|å�ó™ú£"ÿª(ÿ¯-ÿ²3þ±5ú¬6ñ¥7å™2׌.Ç€0¶u(¬l" d!–\ŽW‰S…Q…RˆSŽV•]�c!§i#±r$¿{.ψ/á˜1ï£6ù«6ÿ¯4ÿ²3ÿ².ÿ­)û£$ô›çŽÐ{«c~GO("  < c7ŠN­dÈw݆ë‘òšú£ þ¨!ÿ«$ÿ¬)ÿ®)ÿ°*ÿ²-ÿ²/ÿ³0ÿ³0ÿ²1ÿ²2ÿ²0ÿ²0ÿ²/ÿ²-ÿ²,ÿ¯*ÿ­+ÿ¬'þ©$ú£#õ›!ì“ÞˆËx²g�Rh;@"  + D$[2tAŒOžZ®e¾pÉwÏ}ÕƒÙ‡܈Þ‰ÞŠÛˆÙ†ÕƒÐ}Êx¿q°g¡\ŽPwA`4H'/ +  +# +( ) ) ' # +  ȨÿÖ +ÿÖ +ÿÖ +ÿÖ +÷Ï +Û¸ ˜€ Þº ÿÖ +ÿÖ +èà ص ÿÖ +ÿÖ +ta¬‘ÿÖ +ܹ Þº ÿÖ +ÿÖ +èà ص ÿÖ +ÿÖ +ta¬‘ÿÖ +ܹ Þº ÿÖ +ÿÖ +èà ´—ÿÖ +ÿÖ +ÿÖ +ýÔ +ñÊ +ͬ€l C8®’ç øÐ +Ù¶ �w¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—­’ÿÖ +ÿÖ +lZbRÿÖ +ÿÖ +¸›ȨÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ìÆ $!ÿÖ +ÿÖ +ÿÖ +ÿÖ +-&ص ÿÖ +ÿÖ +Ò°¬‘ÿÖ +ܹ !ÿÖ +ÿÖ +ÿÖ +ÿÖ +-&ص ÿÖ +ÿÖ +Ò°¬‘ÿÖ +ܹ !ÿÖ +ÿÖ +ÿÖ +ÿÖ +-&´—ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +Ò° + „oÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +�y¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—0(þÕ +ÿÖ +ß» ×µ ÿÖ +ÿÖ +;1ȨÿÖ +ÿÖ +ž…ÿÖ +ÿÖ +˜€eUÿÖ +ÿÖ +ýÔ +ÿÖ +p^ص ÿÖ +ÿÖ +ÿÖ +3+¬‘ÿÖ +ܹ eUÿÖ +ÿÖ +ýÔ +ÿÖ +p^ص ÿÖ +ÿÖ +ÿÖ +3+¬‘ÿÖ +ܹ eUÿÖ +ÿÖ +ýÔ +ÿÖ +p^´—ÿÖ +ÿÖ +1)0(Ö´ ÿÖ +ÿÖ +hWUGÿÖ +ÿÖ +åÀ H< + 3+É©�y¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—¯“ÿÖ +ÿÖ +]NSEÿÖ +ÿÖ +ºœȨÿÖ +ÿÖ +"ÿÖ +ÿÖ +ä§ŒÿÖ +Ú· Ó±ÿÖ +²–ص ÿÖ +ÿÖ +ÿÖ +‘z¬‘ÿÖ +ܹ §ŒÿÖ +Ú· Ó±ÿÖ +²–ص ÿÖ +ÿÖ +ÿÖ +‘z¬‘ÿÖ +ܹ §ŒÿÖ +Ú· Ó±ÿÖ +²–´—ÿÖ +ÿÖ +1)cSÿÖ +ÿÖ +£‰Ô²ÿÖ +ÿÖ +A6 +`P¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—2*ÿÖ +ÿÖ +Ò°ʪÿÖ +ÿÖ +=3ȨÿÖ +ÿÖ +!ÿÖ +ÿÖ +±•éÄ ÿÖ +£‰š‚ÿÖ +ñÊ +ص ÿÖ +Ù¶ ÿÖ +ëÅ ¬‘ÿÖ +ܹ éÄ ÿÖ +£‰š‚ÿÖ +ñÊ +ص ÿÖ +Ù¶ ÿÖ +ëÅ ¬‘ÿÖ +ܹ éÄ ÿÖ +£‰š‚ÿÖ +ñÊ +´—ÿÖ +ÿÖ +1)H<ÿÖ +ÿÖ +°”*#ÿÖ +ÿÖ +ص ¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—²–ÿÖ +ÿÖ +M@D9ÿÖ +ÿÖ +½ŸȨÿÖ +ÿÖ +™�ÿÖ +ÿÖ +]N/'ÿÖ +ÿÖ +lZcSÿÖ +ÿÖ +:1ص ÿÖ +´—ƦÿÖ +QD¬‘ÿÖ +ܹ /'ÿÖ +ÿÖ +lZcSÿÖ +ÿÖ +:1ص ÿÖ +´—ƦÿÖ +QD¬‘ÿÖ +ܹ /'ÿÖ +ÿÖ +lZcSÿÖ +ÿÖ +:1´—ÿÖ +ÿÖ +1)dTÿÖ +ÿÖ +”}]NÿÖ +ÿÖ +¡‡¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—5,ÿÖ +ÿÖ +Ä¥¼žÿÖ +ÿÖ +@6ȨÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +Ö´ o]r_ÿÖ +ÿÖ +4,*#ÿÖ +ÿÖ +}iص ÿÖ +´—gVÿÖ +¯“¬‘ÿÖ +ܹ r_ÿÖ +ÿÖ +4,*#ÿÖ +ÿÖ +}iص ÿÖ +´—gVÿÖ +¯“¬‘ÿÖ +ܹ r_ÿÖ +ÿÖ +4,*#ÿÖ +ÿÖ +}i´—ÿÖ +ÿÖ +1)0(Ö´ ÿÖ +ÿÖ +90wdÿÖ +ÿÖ +…p¨�ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +´—µ˜ÿÖ +ÿÖ +ÿÖ +ÿÖ +À¡ȨÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ã¿ �w ´—ÿÖ +öÎ +ïÉ ÿÖ +¿¡ص ÿÖ +´—÷Ï +úÒ +¬‘ÿÖ +ܹ ´—ÿÖ +öÎ +ïÉ ÿÖ +¿¡ص ÿÖ +´—÷Ï +úÒ +¬‘ÿÖ +ܹ ´—ÿÖ +öÎ +ïÉ ÿÖ +¿¡´—ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +â¾ _P€lÿÖ +ÿÖ +j¨�ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +´—7.ÿÖ +ÿÖ +ÿÖ +ÿÖ +B7ȨÿÖ +ÿÖ +o]ÿÖ +ÿÖ +©ŽòË +ÿÖ +丛ÿÖ +øÐ + + ص ÿÖ +´—§ŒÿÖ +o]¬‘ÿÖ +ܹ òË +ÿÖ +丛ÿÖ +øÐ + + ص ÿÖ +´—§ŒÿÖ +o]¬‘ÿÖ +ܹ òË +ÿÖ +丛ÿÖ +øÐ + + ´—ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +þÕ +“|xdÿÖ +ÿÖ +…p¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—·šÿÖ +ÿÖ +£ȨÿÖ +ÿÖ +£ÿÖ +ÿÖ +<2ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +F;ص ÿÖ +´—H<ÿÖ +ͬ¬‘ÿÖ +ܹ <2ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +F;ص ÿÖ +´—H<ÿÖ +ͬ¬‘ÿÖ +ܹ <2ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +F;´—ÿÖ +ÿÖ +1)!Ò°ÿÖ +ÿÖ +_P^OÿÖ +ÿÖ +¡‡¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—m[ÿÖ +ÿÖ +yeȨÿÖ +ÿÖ + ‡ÿÖ +ÿÖ +C8jÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +‰sص ÿÖ +´—ä¿ ÿÖ +ص ÿÖ +ܹ jÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +‰sص ÿÖ +´—ä¿ ÿÖ +ص ÿÖ +ܹ jÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +‰s´—ÿÖ +ÿÖ +1)5,ÿÖ +ÿÖ +Û¸ +$ÿÖ +ÿÖ +ص ¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—m[ÿÖ +ÿÖ +yeȨÿÖ +ÿÖ +ºœÿÖ +ÿÖ +C8Á¢ÿÖ +ôÍ +ñÊ +ÿÖ +Ì«ص ÿÖ +´—‡rÿÖ +ÿÖ +ÿÖ +ܹ Á¢ÿÖ +ôÍ +ñÊ +ÿÖ +Ì«ص ÿÖ +´—‡rÿÖ +ÿÖ +ÿÖ +ܹ Á¢ÿÖ +ôÍ +ñÊ +ÿÖ +Ì«´—ÿÖ +ÿÖ +1)¹œÿÖ +ÿÖ +\MÖ´ ÿÖ +ÿÖ +A6 +`P¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—m[ÿÖ +ÿÖ +yeȨÿÖ +ÿÖ +aQýÔ +ÿÖ +ûÓ + ùÑ +ÿÖ +¿¡ºœÿÖ +ýÔ +ص ÿÖ +´—)"ÿÖ +ÿÖ +ÿÖ +ܹ  ùÑ +ÿÖ +¿¡ºœÿÖ +ýÔ +ص ÿÖ +´—)"ÿÖ +ÿÖ +ÿÖ +ܹ  ùÑ +ÿÖ +¿¡ºœÿÖ +ýÔ +´—ÿÖ +ÿÖ +1)F;ÿÖ +ÿÖ +Õ³ VHÿÖ +ÿÖ +åÀ H< 3+É©�y¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—m[ÿÖ +ÿÖ +yeȨÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +„oH<ÿÖ +ÿÖ +‡r€lÿÖ +ÿÖ +SEص ÿÖ +´—ȨÿÖ +ÿÖ +ܹ H<ÿÖ +ÿÖ +‡r€lÿÖ +ÿÖ +SEص ÿÖ +´—ȨÿÖ +ÿÖ +ܹ H<ÿÖ +ÿÖ +‡r€lÿÖ +ÿÖ +SE´—ÿÖ +ÿÖ +1)Ï®ÿÖ +ÿÖ +SEˆsÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +ÿÖ +�y¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—m[ÿÖ +ÿÖ +yeȨÿÖ +ÿÖ +ÿÖ +ÿÖ +úÒ +åÀ µ˜WIŠtÿÖ +ÿÖ +PCF;ÿÖ +ÿÖ +–~ص ÿÖ +´—iXÿÖ +ÿÖ +ܹ ŠtÿÖ +ÿÖ +PCF;ÿÖ +ÿÖ +–~ص ÿÖ +´—iXÿÖ +ÿÖ +ܹ ŠtÿÖ +ÿÖ +PCF;ÿÖ +ÿÖ +–~´—ÿÖ +ÿÖ +1)\MÿÖ +ÿÖ +ͬE:°”éÄ øÐ +Ú· �w¨�ÿÖ +ÿÖ +90-&ÿÖ +ÿÖ +´—m[ÿÖ +ÿÖ +ye```²²²YYY´´´<<<™™™©©©qqq ```²²²YYY´´´FFFŸŸŸ®®®ŠŠŠJJJ   ¨¨¨ooo&&&˜˜˜®®®xxxJJJ   ¨¨¨ooo™™™...§§§´´´´´´´´´```...´´´<<< žžž&&&žžž...–––***žžž£££SSSeeeSSSeee<<<™™™©©©qqq ***žžž£££```²²²YYY´´´***”””©©©www ```���OOO‰‰‰žžž©©©+++ + + +???BBB```���OOO‰‰‰žžž ±±±***iiivvvªªª### ~~~UUU“““PPP‹‹‹PPPªªª### ~~~UUU™™™...+++™™™...¨¨¨††† žžž&&&žžž...–––ooo[[[FFFžžžžžž©©©+++ + + +???BBBooo[[[FFF```���OOO‰‰‰žžž§§§DDDggg```[[[„„„$$$jjj›››$$$™™™```[[[„„„$$$jjj›››¡¡¡(((gggbbb222���@@@‡‡‡¬¬¬???ˆˆˆ222���@@@‡‡‡™™™...+++™™™...���‰‰‰ žžž&&&žžž...–––   NNNˆˆˆHHHqqqHHHqqq$$$™™™   NNNˆˆˆ```[[[„„„$$$jjj›››---£££444œœœ```UUUqqq|||+++›››‚‚‚„„„KKK```UUUqqq|||+++›››///¬¬¬´´´��� ©©©""" zzzššš+++™™™)))›››©©©""" zzzššš™™™...+++™™™...���???eee žžž&&&žžž...–––KKK´´´™™™™™™‚‚‚„„„KKKKKK´´´```UUUqqq|||+++›››@@@��� °°°```UUU444   ›››$$$QQQ”””EEE```UUU444   ››› £££--- gggpppMMM¢¢¢§§§bbb“““+++™™™)))ŽŽŽ***›››MMM¢¢¢§§§bbb“““™™™...+++™™™...���™™™&&&žžž%%%žžž...•••|||žžžHHH===|||===|||$$$QQQ”””EEE|||žžžHHH```UUU444   ›››AAA���!!!°°°```UUU›››&&&———```UUU›››///———'''ŸŸŸFFF}}}¬¬¬???ˆˆˆFFF}}}™™™...+++™™™...���```eeežžž ŸŸŸ///���;;;���   ’’’(((’’’(((&&&———;;;���   ```UUU›››---£££333œœœ```UUU›››bbb ___†††```UUU›››®®®--- fff„„„###žžž:::“““PPP‰‰‰PPP###žžž:::™™™...+++™™™...���§§§žžž §§§... iiippp    %%%ZZZnnn333‡‡‡333‡‡‡bbb ___†††    %%%ZZZnnn```UUU›››§§§BBB }}}ggg```UUU›››NNNœœœ¬¬¬‡‡‡```UUU›››FFFžžž­­­ˆˆˆ………´´´¥¥¥ZZZ&&&˜˜˜¯¯¯xxx………´´´¥¥¥ZZZ™™™´´´´´´´´´´´´§§§´´´´´´´´´```...���€€€žžž999›››¬¬¬‚‚‚kkkgggŸŸŸ(((ˆˆˆ333ˆˆˆ333NNNœœœ¬¬¬‡‡‡kkkgggŸŸŸ(((```UUU›››,,,•••ªªªxxx + + +(((’’’(((’’’ \ No newline at end of file diff --git a/artwork/wallpaper-240x240.png b/artwork/wallpaper-240x240.png new file mode 100644 index 0000000..b312c98 Binary files /dev/null and b/artwork/wallpaper-240x240.png differ diff --git a/artwork/wallpaper-240x320-centered.jpg b/artwork/wallpaper-240x320-centered.jpg new file mode 100644 index 0000000..e29a9fe Binary files /dev/null and b/artwork/wallpaper-240x320-centered.jpg differ diff --git a/artwork/wallpaper-240x320-centered.png b/artwork/wallpaper-240x320-centered.png new file mode 100644 index 0000000..ee54999 Binary files /dev/null and b/artwork/wallpaper-240x320-centered.png differ diff --git a/artwork/wallpaper-240x320.jpg b/artwork/wallpaper-240x320.jpg new file mode 100644 index 0000000..835cd1b Binary files /dev/null and b/artwork/wallpaper-240x320.jpg differ diff --git a/artwork/wallpaper-240x320.png b/artwork/wallpaper-240x320.png new file mode 100644 index 0000000..07d15f9 Binary files /dev/null and b/artwork/wallpaper-240x320.png differ diff --git a/artwork/wallpaper-320x240.jpg b/artwork/wallpaper-320x240.jpg new file mode 100644 index 0000000..a6cf932 Binary files /dev/null and b/artwork/wallpaper-320x240.jpg differ diff --git a/artwork/wallpaper-320x240.png b/artwork/wallpaper-320x240.png new file mode 100644 index 0000000..deca3de Binary files /dev/null and b/artwork/wallpaper-320x240.png differ diff --git a/bootloader/lk2nd-msm8909.img b/bootloader/lk2nd-msm8909.img new file mode 100644 index 0000000..723167d Binary files /dev/null and b/bootloader/lk2nd-msm8909.img differ diff --git a/bootloader/loaders/8110.mbn b/bootloader/loaders/8110.mbn new file mode 100644 index 0000000..83fd347 Binary files /dev/null and b/bootloader/loaders/8110.mbn differ diff --git a/chroot-shell.sh b/chroot-shell.sh new file mode 100755 index 0000000..24904d9 --- /dev/null +++ b/chroot-shell.sh @@ -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 </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 : Install armv7 package(s) into $ROOTFS" + echo " pkg-del : Remove package(s) from $ROOTFS" + echo " pkg-search : 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 < /usr/local/bin/pkg-del < /usr/local/bin/pkg-search < + + + + + + + diff --git a/devices/common-msm8909/ucm2/msm8916-1mic/msm8916-1mic.conf b/devices/common-msm8909/ucm2/msm8916-1mic/msm8916-1mic.conf new file mode 100644 index 0000000..ce507e8 --- /dev/null +++ b/devices/common-msm8909/ucm2/msm8916-1mic/msm8916-1mic.conf @@ -0,0 +1,6 @@ +Syntax 3 + +SectionUseCase."HiFi" { + File "HiFi.conf" + Comment "Play and record HiFi quality Music" +} diff --git a/devices/common-msm8909/ucm2/msm8916/HiFi.conf b/devices/common-msm8909/ucm2/msm8916/HiFi.conf new file mode 100644 index 0000000..dfa8da9 --- /dev/null +++ b/devices/common-msm8909/ucm2/msm8916/HiFi.conf @@ -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" +} + + + + + + + + + diff --git a/devices/common-msm8909/ucm2/msm8916/msm8916.conf b/devices/common-msm8909/ucm2/msm8916/msm8916.conf new file mode 100644 index 0000000..ce507e8 --- /dev/null +++ b/devices/common-msm8909/ucm2/msm8916/msm8916.conf @@ -0,0 +1,6 @@ +Syntax 3 + +SectionUseCase."HiFi" { + File "HiFi.conf" + Comment "Play and record HiFi quality Music" +} diff --git a/devices/common-msm8909/zram-init b/devices/common-msm8909/zram-init new file mode 100644 index 0000000..4373d1d --- /dev/null +++ b/devices/common-msm8909/zram-init @@ -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= diff --git a/devices/nokia-argon/00-nokia-argon-display.files b/devices/nokia-argon/00-nokia-argon-display.files new file mode 100644 index 0000000..d29b0c5 --- /dev/null +++ b/devices/nokia-argon/00-nokia-argon-display.files @@ -0,0 +1 @@ +/lib/firmware/nokia,argon-gc9305-v2-panel.bin diff --git a/devices/nokia-argon/APKBUILD b/devices/nokia-argon/APKBUILD new file mode 100644 index 0000000..0f4a91a --- /dev/null +++ b/devices/nokia-argon/APKBUILD @@ -0,0 +1,62 @@ +# Reference: +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 +" diff --git a/devices/nokia-argon/deviceinfo b/devices/nokia-argon/deviceinfo new file mode 100644 index 0000000..8674961 --- /dev/null +++ b/devices/nokia-argon/deviceinfo @@ -0,0 +1,36 @@ +# Reference: +# 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" diff --git a/devices/nokia-argon/kernel-cmdline.conf b/devices/nokia-argon/kernel-cmdline.conf new file mode 100644 index 0000000..2235027 --- /dev/null +++ b/devices/nokia-argon/kernel-cmdline.conf @@ -0,0 +1,2 @@ +earlycon +console=ttyMSM0,115200 diff --git a/devices/nokia-argon/modules-initfs b/devices/nokia-argon/modules-initfs new file mode 100644 index 0000000..b7b5425 --- /dev/null +++ b/devices/nokia-argon/modules-initfs @@ -0,0 +1,5 @@ +pm8916-lbc +pm8916-bms-vm +panel-mipi-dbi +matrix_keypad +matrix_keymap diff --git a/devices/nokia-argon/nokia,argon-gc9305-v2-panel.bin b/devices/nokia-argon/nokia,argon-gc9305-v2-panel.bin new file mode 100644 index 0000000..5aba36d Binary files /dev/null and b/devices/nokia-argon/nokia,argon-gc9305-v2-panel.bin differ diff --git a/devices/nokia-argon/nokia,argon-gc9305-v2-panel.txt b/devices/nokia-argon/nokia,argon-gc9305-v2-panel.txt new file mode 100644 index 0000000..e4af300 --- /dev/null +++ b/devices/nokia-argon/nokia,argon-gc9305-v2-panel.txt @@ -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 diff --git a/devices/nokia-argon/qcom-msm8905-nokia-argon.dtb b/devices/nokia-argon/qcom-msm8905-nokia-argon.dtb new file mode 100644 index 0000000..3927f65 Binary files /dev/null and b/devices/nokia-argon/qcom-msm8905-nokia-argon.dtb differ diff --git a/devices/nokia-argon/qcom-msm8905-nokia-argon.dts b/devices/nokia-argon/qcom-msm8905-nokia-argon.dts new file mode 100644 index 0000000..66066ee --- /dev/null +++ b/devices/nokia-argon/qcom-msm8905-nokia-argon.dts @@ -0,0 +1,2238 @@ +/dts-v1/; + +/ { + #address-cells = <0x01>; + #size-cells = <0x01>; + interrupt-parent = <0x01>; + model = "Nokia 8110 4G"; + compatible = "nokia,argon", "qcom,msm8905", "qcom,msm8909"; + chassis-type = "handset"; + + aliases { + mmc0 = "/soc@0/sdhci@7824000"; + mmc1 = "/soc@0/sdhci@7864000"; + serial0 = "/soc@0/serial@78af000"; + }; + + chosen { + stdout-path = "serial0"; + }; + + clocks { + + xo-board { + compatible = "fixed-clock"; + #clock-cells = <0x00>; + clock-frequency = <0x124f800>; + phandle = <0x18>; + }; + + sleep-clk { + compatible = "fixed-clock"; + #clock-cells = <0x00>; + clock-frequency = <0x8000>; + phandle = <0x28>; + }; + }; + + cpus { + #address-cells = <0x01>; + #size-cells = <0x00>; + + cpu@0 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x00>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x07>; + qcom,saw = <0x08>; + phandle = <0x80>; + }; + + cpu@1 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x01>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x09>; + qcom,saw = <0x0a>; + phandle = <0x81>; + }; + + cpu@2 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x02>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x0b>; + qcom,saw = <0x0c>; + phandle = <0x82>; + }; + + cpu@3 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x03>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x0d>; + qcom,saw = <0x0e>; + phandle = <0x83>; + }; + + l2-cache { + compatible = "cache"; + cache-level = <0x02>; + phandle = <0x02>; + }; + + idle-states { + + cpu-sleep-0 { + compatible = "qcom,idle-state-spc"; + idle-state-name = "standalone-power-collapse"; + entry-latency-us = <0xb4>; + exit-latency-us = <0xf0>; + min-residency-us = <0x4ec>; + local-timer-stop; + phandle = <0x06>; + }; + }; + }; + + cpu-opp-table { + compatible = "operating-points-v2-kryo-cpu", "operating-points-v2"; + nvmem-cells = <0x0f>; + opp-shared; + phandle = <0x05>; + + opp-199999951 { + opp-hz = <0x00 0xbebc1cf>; + required-opps = <0x10>; + opp-supported-hw = <0xff>; + }; + + opp-399999902 { + opp-hz = <0x00 0x17d7839e>; + required-opps = <0x11>; + opp-supported-hw = <0xff>; + }; + + opp-533333202 { + opp-hz = <0x00 0x1fca04d2>; + required-opps = <0x11>; + opp-supported-hw = <0xff>; + }; + + opp-799999804 { + opp-hz = <0x00 0x2faf073c>; + required-opps = <0x12>; + opp-supported-hw = <0xff>; + }; + + opp-998400000 { + opp-hz = <0x00 0x3b826000>; + required-opps = <0x12>; + opp-supported-hw = <0x05>; + }; + + opp-1094400000 { + opp-hz = <0x00 0x413b3800>; + required-opps = <0x13>; + opp-supported-hw = <0x05>; + }; + + opp-1248000000 { + opp-hz = <0x00 0x4a62f800>; + required-opps = <0x13>; + opp-supported-hw = <0x01>; + }; + + opp-1267200000 { + opp-hz = <0x00 0x4b87f000>; + required-opps = <0x13>; + opp-supported-hw = <0x01>; + }; + }; + + firmware { + + scm { + compatible = "qcom,scm-msm8916", "qcom,scm"; + clocks = <0x14 0x3d 0x14 0x3f 0x14 0x3e>; + clock-names = "core", "bus", "iface"; + qcom,dload-mode = <0x15 0x6100>; + }; + }; + + memory@80000000 { + device_type = "memory"; + reg = <0x80000000 0x00>; + }; + + pmu { + compatible = "arm,cortex-a7-pmu"; + interrupts = <0x01 0x07 0xf04>; + }; + + reserved-memory { + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + tz-apps@87a00000 { + reg = <0x87a00000 0x200000>; + no-map; + }; + + rfsa@87ce0000 { + reg = <0x87ce0000 0x20000>; + no-map; + }; + + smem@87d00000 { + compatible = "qcom,smem"; + reg = <0x87d00000 0x100000>; + no-map; + hwlocks = <0x16 0x03>; + qcom,rpm-msg-ram = <0x17>; + }; + + tz@87e00000 { + reg = <0x87e00000 0x200000>; + no-map; + }; + + mpss@88000000 { + reg = <0x88000000 0x5500000>; + no-map; + phandle = <0x36>; + }; + + wcnss@8d500000 { + reg = <0x8d500000 0x700000>; + no-map; + phandle = <0x74>; + }; + + mba@8dc00000 { + reg = <0x8dc00000 0x100000>; + no-map; + phandle = <0x35>; + }; + + rmtfs@9f700000 { + compatible = "qcom,rmtfs-mem"; + reg = <0x9f700000 0x300000>; + no-map; + qcom,client-id = <0x01>; + }; + }; + + smd { + compatible = "qcom,smd"; + + rpm { + interrupts = <0x00 0xa8 0x01>; + qcom,ipc = <0x03 0x08 0x00>; + qcom,smd-edge = <0x0f>; + + rpm-requests { + compatible = "qcom,rpm-msm8909"; + qcom,smd-channels = "rpm_requests"; + + clock-controller { + compatible = "qcom,rpmcc-msm8909", "qcom,rpmcc"; + #clock-cells = <0x01>; + clocks = <0x18>; + clock-names = "xo"; + phandle = <0x78>; + }; + + power-controller { + compatible = "qcom,msm8909-rpmpd"; + #power-domain-cells = <0x01>; + operating-points-v2 = <0x19>; + phandle = <0x04>; + + opp-table { + compatible = "operating-points-v2"; + phandle = <0x19>; + + opp1 { + opp-level = <0x01>; + phandle = <0x10>; + }; + + opp2 { + opp-level = <0x02>; + }; + + opp3 { + opp-level = <0x03>; + phandle = <0x11>; + }; + + opp4 { + opp-level = <0x04>; + phandle = <0x12>; + }; + + opp5 { + opp-level = <0x05>; + }; + + opp6 { + opp-level = <0x06>; + phandle = <0x13>; + }; + }; + }; + + pm8909-regulators { + compatible = "qcom,rpm-pm8909-regulators"; + + s2 { + regulator-min-microvolt = <0x1c3a90>; + regulator-max-microvolt = <0x1c3a90>; + phandle = <0x30>; + }; + + l1 { + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0xf4240>; + }; + + l2 { + regulator-min-microvolt = <0x124f80>; + regulator-max-microvolt = <0x124f80>; + }; + + l4 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + }; + + l5 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x2f>; + }; + + l6 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x6d>; + }; + + l7 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x34>; + }; + + l8 { + regulator-min-microvolt = <0x2b7cd0>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x49>; + }; + + l9 { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x325aa0>; + phandle = <0x7a>; + }; + + l10 { + regulator-min-microvolt = <0x12b128>; + regulator-max-microvolt = <0x13d620>; + phandle = <0x79>; + }; + + l11 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2d0370>; + regulator-system-load = <0x30d40>; + regulator-allow-set-load; + phandle = <0x50>; + }; + + l12 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2d0370>; + phandle = <0x51>; + }; + + l13 { + regulator-min-microvolt = <0x2eebb8>; + regulator-max-microvolt = <0x2eebb8>; + phandle = <0x31>; + }; + + l14 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2dc6c0>; + }; + + l15 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2dc6c0>; + }; + + l17 { + regulator-min-microvolt = <0x2b7cd0>; + regulator-max-microvolt = <0x2b7cd0>; + phandle = <0x6c>; + }; + + l18 { + regulator-min-microvolt = <0x2932e0>; + regulator-max-microvolt = <0x2932e0>; + }; + }; + }; + }; + }; + + smp2p-hexagon { + compatible = "qcom,smp2p"; + qcom,smem = <0x1b3 0x1ac>; + interrupts = <0x00 0x1b 0x01>; + qcom,ipc = <0x03 0x08 0x0e>; + qcom,local-pid = <0x00>; + qcom,remote-pid = <0x01>; + + master-kernel { + qcom,entry-name = "master-kernel"; + #qcom,smem-state-cells = <0x01>; + phandle = <0x33>; + }; + + slave-kernel { + qcom,entry-name = "slave-kernel"; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x32>; + }; + }; + + smp2p-wcnss { + compatible = "qcom,smp2p"; + qcom,smem = <0x1c3 0x1af>; + interrupts = <0x00 0x8f 0x01>; + qcom,ipc = <0x03 0x08 0x12>; + qcom,local-pid = <0x00>; + qcom,remote-pid = <0x04>; + + master-kernel { + qcom,entry-name = "master-kernel"; + #qcom,smem-state-cells = <0x01>; + phandle = <0x76>; + }; + + slave-kernel { + qcom,entry-name = "slave-kernel"; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x75>; + }; + }; + + smsm { + compatible = "qcom,smsm"; + #address-cells = <0x01>; + #size-cells = <0x00>; + qcom,ipc-1 = <0x03 0x08 0x0d>; + qcom,ipc-3 = <0x03 0x08 0x13>; + + apps@0 { + reg = <0x00>; + #qcom,smem-state-cells = <0x01>; + phandle = <0x38>; + }; + + hexagon@1 { + reg = <0x01>; + interrupts = <0x00 0x1a 0x01>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x37>; + }; + + wcnss@6 { + reg = <0x06>; + interrupts = <0x00 0x90 0x01>; + interrupt-controller; + #interrupt-cells = <0x02>; + }; + }; + + soc@0 { + compatible = "simple-bus"; + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + rng@22000 { + compatible = "qcom,prng"; + reg = <0x22000 0x200>; + clocks = <0x14 0x44>; + clock-names = "core"; + }; + + qfprom@5c000 { + compatible = "qcom,qfprom"; + reg = <0x5c000 0x1000>; + #address-cells = <0x01>; + #size-cells = <0x01>; + + speedbin@c { + reg = <0x0c 0x01>; + bits = <0x02 0x03>; + phandle = <0x0f>; + }; + + s0-p1@a0 { + reg = <0xa0 0x01>; + bits = <0x00 0x06>; + phandle = <0x1d>; + }; + + s0-p2@a0 { + reg = <0xa0 0x02>; + bits = <0x06 0x06>; + phandle = <0x1e>; + }; + + s1-p1@a1 { + reg = <0xa1 0x02>; + bits = <0x04 0x06>; + phandle = <0x1f>; + }; + + s1-p2@a2 { + reg = <0xa2 0x01>; + bits = <0x02 0x06>; + phandle = <0x20>; + }; + + s2-p1@a3 { + reg = <0xa3 0x01>; + bits = <0x00 0x06>; + phandle = <0x21>; + }; + + s2-p2@a3 { + reg = <0xa3 0x02>; + bits = <0x06 0x06>; + phandle = <0x22>; + }; + + s3-p1@a4 { + reg = <0xa4 0x02>; + bits = <0x04 0x06>; + phandle = <0x23>; + }; + + s3-p2@a5 { + reg = <0xa5 0x01>; + bits = <0x02 0x06>; + phandle = <0x24>; + }; + + s4-p1@a6 { + reg = <0xa6 0x01>; + bits = <0x00 0x06>; + phandle = <0x25>; + }; + + s4-p2@a6 { + reg = <0xa6 0x02>; + bits = <0x06 0x06>; + phandle = <0x26>; + }; + + base1@dc { + reg = <0xdc 0x01>; + bits = <0x00 0x08>; + phandle = <0x1b>; + }; + + base2@dd { + reg = <0xdd 0x01>; + bits = <0x00 0x08>; + phandle = <0x1c>; + }; + + mode@de { + reg = <0xde 0x01>; + bits = <0x00 0x03>; + phandle = <0x1a>; + }; + }; + + sram@60000 { + compatible = "qcom,rpm-msg-ram"; + reg = <0x60000 0x8000>; + phandle = <0x17>; + }; + + sram@290000 { + compatible = "qcom,rpm-stats"; + reg = <0x290000 0x10000>; + }; + + thermal-sensor@4a9000 { + compatible = "qcom,msm8909-tsens", "qcom,tsens-v0_1"; + reg = <0x4a9000 0x1000 0x4a8000 0x1000>; + nvmem-cells = <0x1a 0x1b 0x1c 0x1d 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25 0x26>; + nvmem-cell-names = "mode", "base1", "base2", "s0_p1", "s0_p2", "s1_p1", "s1_p2", "s2_p1", "s2_p2", "s3_p1", "s3_p2", "s4_p1", "s4_p2"; + interrupts = <0x00 0xb8 0x04>; + interrupt-names = "uplow"; + #thermal-sensor-cells = <0x01>; + #qcom,sensors = <0x05>; + phandle = <0x7e>; + }; + + restart@4ab000 { + compatible = "qcom,pshold"; + reg = <0x4ab000 0x04>; + }; + + pinctrl@1000000 { + compatible = "qcom,msm8909-tlmm"; + reg = <0x1000000 0x300000>; + interrupts = <0x00 0xd0 0x04>; + gpio-controller; + #gpio-cells = <0x02>; + gpio-ranges = <0x27 0x00 0x00 0x75>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x27>; + + blsp-i2c1-default-state { + pins = "gpio6", "gpio7"; + function = "blsp_i2c1"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x57>; + }; + + blsp-i2c1-sleep-state { + pins = "gpio6", "gpio7"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x58>; + }; + + blsp-i2c2-default-state { + pins = "gpio111", "gpio112"; + function = "blsp_i2c2"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5b>; + }; + + blsp-i2c2-sleep-state { + pins = "gpio111", "gpio112"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5c>; + }; + + blsp-i2c3-default-state { + pins = "gpio29", "gpio30"; + function = "blsp_i2c3"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5f>; + }; + + blsp-i2c3-sleep-state { + pins = "gpio29", "gpio30"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x60>; + }; + + blsp-i2c4-default-state { + pins = "gpio14", "gpio15"; + function = "blsp_i2c4"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x63>; + }; + + blsp-i2c4-sleep-state { + pins = "gpio14", "gpio15"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x64>; + }; + + blsp-i2c5-default-state { + pins = "gpio18", "gpio19"; + function = "blsp_i2c5"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x67>; + }; + + blsp-i2c5-sleep-state { + pins = "gpio18", "gpio19"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x68>; + }; + + blsp-i2c6-default-state { + pins = "gpio10", "gpio11"; + function = "blsp_i2c6"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x6f>; + }; + + blsp-i2c6-sleep-state { + pins = "gpio10", "gpio11"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x70>; + }; + + blsp-spi1-default-state { + pins = "gpio4", "gpio5", "gpio6", "gpio7"; + function = "blsp_spi1"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x59>; + }; + + blsp-spi1-sleep-state { + pins = "gpio4", "gpio5", "gpio6", "gpio7"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x5a>; + }; + + blsp-spi2-default-state { + pins = "gpio20", "gpio21", "gpio111", "gpio112"; + function = "blsp_spi2"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x5d>; + }; + + blsp-spi2-sleep-state { + pins = "gpio20", "gpio21", "gpio111", "gpio112"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x5e>; + }; + + blsp-spi3-default-state { + pins = "gpio0", "gpio1", "gpio2", "gpio3"; + function = "blsp_spi3"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x61>; + }; + + blsp-spi3-sleep-state { + pins = "gpio0", "gpio1", "gpio2", "gpio3"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x62>; + }; + + blsp-spi4-default-state { + pins = "gpio12", "gpio13", "gpio14", "gpio15"; + function = "blsp_spi4"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x65>; + }; + + blsp-spi4-sleep-state { + pins = "gpio12", "gpio13", "gpio14", "gpio15"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x66>; + }; + + blsp-spi5-default-state { + pins = "gpio16", "gpio17", "gpio18", "gpio19"; + function = "blsp_spi5"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x69>; + }; + + blsp-spi5-sleep-state { + pins = "gpio16", "gpio17", "gpio18", "gpio19"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x6a>; + }; + + blsp-spi6-default-state { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "blsp_spi6"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x71>; + }; + + blsp-spi6-sleep-state { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x72>; + }; + + blsp-uart1-default-state { + pins = "gpio4", "gpio5"; + function = "blsp_uart1"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x53>; + }; + + blsp-uart1-sleep-state { + pins = "gpio4", "gpio5"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x54>; + }; + + blsp-uart2-default-state { + pins = "gpio20", "gpio21"; + function = "blsp_uart2"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x55>; + }; + + blsp-uart2-sleep-state { + pins = "gpio20", "gpio21"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x56>; + }; + + sdc1-clk-on-state { + pins = "sdc1_clk"; + bias-disable; + drive-strength = <0x10>; + phandle = <0x43>; + }; + + sdc1-clk-off-state { + pins = "sdc1_clk"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x46>; + }; + + sdc1-cmd-on-state { + pins = "sdc1_cmd"; + bias-disable; + drive-strength = <0x0a>; + phandle = <0x44>; + }; + + sdc1-cmd-off-state { + pins = "sdc1_cmd"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x47>; + }; + + sdc1-data-on-state { + pins = "sdc1_data"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x45>; + }; + + sdc1-data-off-state { + pins = "sdc1_data"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x48>; + }; + + sdc2-clk-on-state { + pins = "sdc2_clk"; + drive-strength = <0x10>; + bias-disable; + phandle = <0x4a>; + }; + + sdc2-clk-off-state { + pins = "sdc2_clk"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x4d>; + }; + + sdc2-cmd-on-state { + pins = "sdc2_cmd"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x4b>; + }; + + sdc2-cmd-off-state { + pins = "sdc2_cmd"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x4e>; + }; + + sdc2-data-on-state { + pins = "sdc2_data"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x4c>; + }; + + sdc2-data-off-state { + pins = "sdc2_data"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x4f>; + }; + + wcnss-active-state { + pins = "gpio40", "gpio41", "gpio42", "gpio43", "gpio44"; + function = "wcss_wlan"; + drive-strength = <0x06>; + bias-pull-up; + phandle = <0x77>; + }; + + cdc-pdm-lines { + + pdm-lines-on { + pins = "gpio59", "gpio60", "gpio61", "gpio62", "gpio63", "gpio64"; + function = "cdc_pdm0"; + drive-strength = <0x08>; + bias-disable; + phandle = <0x3a>; + }; + + pdm-lines-off { + pins = "gpio59", "gpio60", "gpio61", "gpio62", "gpio63", "gpio64"; + function = "cdc_pdm0"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x3b>; + }; + }; + + gpio-key-active-state { + pins = "gpio90", "gpio98"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-up; + phandle = <0x86>; + }; + + lid-switch-active-state { + pins = "gpio36", "gpio92"; + function = "gpio"; + drive-strength = <0x06>; + bias-pull-up; + phandle = <0x87>; + }; + + matrix-keypad-row-gpio-state { + pins = "gpio94", "gpio95", "gpio96", "gpio97"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-up; + phandle = <0x88>; + }; + + matrix-keypad-col-default-state { + pins = "gpio52", "gpio56", "gpio7", "gpio99", "gpio6"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x89>; + }; + + panel-gpios-default-state { + pins = "gpio24", "gpio25", "gpio110"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x6e>; + }; + }; + + clock-controller@1800000 { + compatible = "qcom,gcc-msm8909"; + reg = <0x1800000 0x80000>; + #clock-cells = <0x01>; + #reset-cells = <0x01>; + #power-domain-cells = <0x01>; + clocks = <0x18 0x28 0x00 0x00>; + clock-names = "xo", "sleep_clk", "dsi0pll", "dsi0pllbyte"; + phandle = <0x14>; + }; + + hwlock@1905000 { + compatible = "qcom,tcsr-mutex"; + reg = <0x1905000 0x20000>; + #hwlock-cells = <0x01>; + phandle = <0x16>; + }; + + syscon@1937000 { + compatible = "qcom,tcsr-msm8909", "syscon"; + reg = <0x1937000 0x30000>; + phandle = <0x15>; + }; + + spmi@200f000 { + compatible = "qcom,spmi-pmic-arb"; + reg = <0x200f000 0x1000 0x2400000 0x400000 0x2c00000 0x400000 0x3800000 0x200000 0x200a000 0x2100>; + reg-names = "core", "chnls", "obsrvr", "intr", "cnfg"; + interrupt-names = "periph_irq"; + interrupts = <0x00 0xbe 0x04>; + qcom,ee = <0x00>; + qcom,channel = <0x00>; + #address-cells = <0x02>; + #size-cells = <0x00>; + interrupt-controller; + #interrupt-cells = <0x04>; + phandle = <0x2e>; + + pmic@0 { + compatible = "qcom,pm8909", "qcom,spmi-pmic"; + reg = <0x00 0x00>; + #address-cells = <0x01>; + #size-cells = <0x00>; + + pon@800 { + compatible = "qcom,pm8916-pon"; + reg = <0x800>; + mode-bootloader = <0x02>; + mode-recovery = <0x01>; + + pwrkey { + compatible = "qcom,pm8941-pwrkey"; + interrupts = <0x00 0x08 0x00 0x03>; + debounce = <0x3d09>; + bias-pull-up; + linux,code = <0x74>; + }; + + resin { + compatible = "qcom,pm8941-resin"; + interrupts = <0x00 0x08 0x01 0x03>; + debounce = <0x3d09>; + bias-pull-up; + status = "okay"; + linux,code = <0x6c>; + }; + + watchdog { + compatible = "qcom,pm8916-wdt"; + interrupts = <0x00 0x08 0x06 0x01>; + timeout-sec = <0x3c>; + }; + }; + + charger@1000 { + compatible = "qcom,pm8916-lbc"; + reg = <0x1000 0x1200 0x1300 0x1600>; + reg-names = "chgr", "bat_if", "usb", "misc"; + interrupts = <0x00 0x10 0x00 0x03 0x00 0x10 0x05 0x03 0x00 0x10 0x06 0x03 0x00 0x10 0x07 0x03 0x00 0x12 0x00 0x03 0x00 0x12 0x01 0x03 0x00 0x13 0x00 0x03 0x00 0x13 0x01 0x03 0x00 0x13 0x02 0x03 0x00 0x13 0x04 0x03>; + interrupt-names = "vbat_det", "fast_chg", "chg_fail", "chg_done", "bat_pres", "temp_ok", "coarse_det", "usb_vbus", "chg_gone", "overtemp"; + status = "okay"; + qcom,fast-charge-safe-current = <0x57e40>; + qcom,fast-charge-safe-voltage = <0x426030>; + monitored-battery = <0x29>; + phandle = <0x2a>; + }; + + extcon@1300 { + compatible = "qcom,pm8941-misc"; + reg = <0x1300>; + interrupts = <0x00 0x13 0x01 0x03>; + interrupt-names = "usb_vbus"; + status = "disabled"; + }; + + vm-bms@4000 { + compatible = "qcom,pm8916-bms-vm"; + reg = <0x4000>; + interrupts = <0x00 0x40 0x00 0x01 0x00 0x40 0x01 0x01 0x00 0x40 0x02 0x01 0x00 0x40 0x03 0x01 0x00 0x40 0x04 0x01 0x00 0x40 0x05 0x01>; + interrupt-names = "cv_leave", "cv_enter", "ocv_good", "ocv_thr", "fifo", "state_chg"; + status = "okay"; + monitored-battery = <0x29>; + power-supplies = <0x2a>; + }; + + rtc@6000 { + compatible = "qcom,pm8941-rtc"; + reg = <0x6000>; + interrupts = <0x00 0x61 0x01 0x01>; + }; + + mpps@a000 { + compatible = "qcom,pm8916-mpp", "qcom,spmi-mpp"; + reg = <0xa000>; + gpio-controller; + #gpio-cells = <0x02>; + gpio-ranges = <0x2b 0x00 0x00 0x04>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x2b>; + + mpp2-state { + pins = "mpp2"; + function = "digital"; + power-source = <0x00>; + output-low; + qcom,dtest = <0x01>; + phandle = <0x2d>; + }; + }; + + gpios@c000 { + compatible = "qcom,pm8916-gpio", "qcom,spmi-gpio"; + reg = <0xc000>; + gpio-controller; + gpio-ranges = <0x2c 0x00 0x00 0x04>; + #gpio-cells = <0x02>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x2c>; + + keypad-backlight-default-state { + pins = "gpio1"; + function = "normal"; + output-low; + power-source = <0x03>; + phandle = <0x8a>; + }; + }; + }; + + pmic@1 { + compatible = "qcom,pm8909", "qcom,spmi-pmic"; + reg = <0x01 0x00>; + #address-cells = <0x01>; + #size-cells = <0x00>; + + pwm { + compatible = "qcom,pm8916-pwm"; + #pwm-cells = <0x02>; + status = "okay"; + pinctrl-0 = <0x2d>; + pinctrl-names = "default"; + phandle = <0x85>; + }; + + vibrator@c000 { + compatible = "qcom,pm8916-vib"; + reg = <0xc000>; + status = "okay"; + }; + + audio-codec@f000 { + compatible = "qcom,pm8916-wcd-analog-codec"; + reg = <0xf000>; + reg-names = "pmic-codec-core"; + interrupt-parent = <0x2e>; + interrupts = <0x01 0xf0 0x00 0x00 0x01 0xf0 0x01 0x00 0x01 0xf0 0x02 0x00 0x01 0xf0 0x03 0x00 0x01 0xf0 0x04 0x00 0x01 0xf0 0x05 0x00 0x01 0xf0 0x06 0x00 0x01 0xf0 0x07 0x00 0x01 0xf1 0x00 0x00 0x01 0xf1 0x01 0x00 0x01 0xf1 0x02 0x00 0x01 0xf1 0x03 0x00 0x01 0xf1 0x04 0x00 0x01 0xf1 0x05 0x00>; + interrupt-names = "cdc_spk_cnp_int", "cdc_spk_clip_int", "cdc_spk_ocp_int", "mbhc_ins_rem_det1", "mbhc_but_rel_det", "mbhc_but_press_det", "mbhc_ins_rem_det", "mbhc_switch_int", "cdc_ear_ocp_int", "cdc_hphr_ocp_int", "cdc_hphl_ocp_det", "cdc_ear_cnp_int", "cdc_hphr_cnp_int", "cdc_hphl_cnp_int"; + #sound-dai-cells = <0x01>; + status = "okay"; + qcom,hphl-jack-type-normally-open; + qcom,micbias1-ext-cap; + qcom,micbias2-ext-cap; + qcom,mbhc-vthreshold-low = <0x55 0x78 0xe1 0x1c2 0x1f4>; + qcom,mbhc-vthreshold-high = <0x55 0x78 0xe1 0x1c2 0x1f4>; + vdd-cdc-io-supply = <0x2f>; + vdd-cdc-tx-rx-cx-supply = <0x30>; + vdd-micbias-supply = <0x31>; + phandle = <0x41>; + }; + }; + }; + + dma-controller@4044000 { + compatible = "qcom,bam-v1.7.0"; + reg = <0x4044000 0x19000>; + interrupts = <0x00 0x1d 0x04>; + #dma-cells = <0x01>; + qcom,ee = <0x00>; + num-channels = <0x06>; + qcom,num-ees = <0x01>; + qcom,powered-remotely; + phandle = <0x39>; + }; + + remoteproc@4080000 { + compatible = "qcom,msm8909-mss-pil"; + reg = <0x4080000 0x100 0x4020000 0x40>; + reg-names = "qdsp6", "rmb"; + interrupts-extended = <0x01 0x00 0x18 0x01 0x32 0x00 0x01 0x32 0x01 0x01 0x32 0x02 0x01 0x32 0x03 0x01>; + interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack"; + power-domains = <0x04 0x00 0x04 0x04>; + power-domain-names = "cx", "mx"; + clocks = <0x14 0x79 0x14 0x7a 0x14 0x3c 0x18>; + clock-names = "iface", "bus", "mem", "xo"; + qcom,smem-states = <0x33 0x00>; + qcom,smem-state-names = "stop"; + resets = <0x14 0x29>; + reset-names = "mss_restart"; + qcom,halt-regs = <0x15 0x18000 0x19000 0x1a000>; + status = "okay"; + pll-supply = <0x34>; + + mba { + memory-region = <0x35>; + }; + + mpss { + memory-region = <0x36>; + }; + + bam-dmux { + compatible = "qcom,bam-dmux"; + interrupt-parent = <0x37>; + interrupts = <0x01 0x03 0x0b 0x03>; + interrupt-names = "pc", "pc-ack"; + qcom,smem-states = <0x38 0x01 0x38 0x0b>; + qcom,smem-state-names = "pc", "pc-ack"; + dmas = <0x39 0x04 0x39 0x05>; + dma-names = "tx", "rx"; + }; + + smd-edge { + interrupts = <0x00 0x19 0x01>; + qcom,smd-edge = <0x00>; + qcom,ipc = <0x03 0x08 0x0c>; + qcom,remote-pid = <0x01>; + label = "hexagon"; + + apr { + compatible = "qcom,apr-v2"; + qcom,smd-channels = "apr_audio_svc"; + qcom,apr-domain = <0x04>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "okay"; + + apr-service@3 { + reg = <0x03>; + compatible = "qcom,q6core"; + }; + + apr-service@4 { + compatible = "qcom,q6afe"; + reg = <0x04>; + + dais { + compatible = "qcom,q6afe-dais"; + #address-cells = <0x01>; + #size-cells = <0x00>; + #sound-dai-cells = <0x01>; + phandle = <0x3e>; + + dai@16 { + reg = <0x10>; + qcom,sd-lines = <0x00 0x01>; + }; + + dai@20 { + reg = <0x15>; + qcom,sd-lines = <0x00 0x01>; + }; + }; + + clock-controller { + compatible = "qcom,q6afe-clocks"; + #clock-cells = <0x02>; + phandle = <0x42>; + }; + }; + + apr-service@7 { + compatible = "qcom,q6asm"; + reg = <0x07>; + + dais { + compatible = "qcom,q6asm-dais"; + #address-cells = <0x01>; + #size-cells = <0x00>; + #sound-dai-cells = <0x01>; + phandle = <0x3c>; + + dai@0 { + reg = <0x00>; + direction = <0x02>; + }; + + dai@1 { + reg = <0x01>; + direction = <0x01>; + }; + + dai@2 { + reg = <0x02>; + direction = <0x02>; + }; + + dai@3 { + reg = <0x03>; + direction = <0x02>; + is-compress-dai; + }; + }; + }; + + apr-service@8 { + compatible = "qcom,q6adm"; + reg = <0x08>; + + routing { + compatible = "qcom,q6adm-routing"; + #sound-dai-cells = <0x00>; + phandle = <0x3f>; + }; + }; + + apr-service@9 { + compatible = "qcom,q6mvm"; + reg = <0x09>; + + dais { + compatible = "qcom,q6voice-dais"; + #sound-dai-cells = <0x01>; + phandle = <0x3d>; + }; + }; + + apr-service@a { + compatible = "qcom,q6cvs"; + reg = <0x0a>; + }; + + apr-service@b { + compatible = "qcom,q6cvp"; + reg = <0x0b>; + }; + }; + }; + }; + + sound@7702000 { + status = "okay"; + compatible = "qcom,msm8916-qdsp6-sndcard"; + reg = <0x7702000 0x04 0x7702004 0x04>; + reg-names = "mic-iomux", "spkr-iomux"; + model = "msm8916"; + audio-routing = "AMIC1", "MIC BIAS External1", "AMIC2", "MIC BIAS Internal2", "AMIC3", "MIC BIAS External1"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x3a>; + pinctrl-1 = <0x3b>; + + dai-link-multimedia1 { + link-name = "MultiMedia1"; + + cpu { + sound-dai = <0x3c 0x00>; + }; + }; + + dai-link-multimedia2 { + link-name = "MultiMedia2"; + + cpu { + sound-dai = <0x3c 0x01>; + }; + }; + + dai-link-multimedia3 { + link-name = "MultiMedia3"; + + cpu { + sound-dai = <0x3c 0x02>; + }; + }; + + dai-link-multimedia4 { + link-name = "MultiMedia4"; + + cpu { + sound-dai = <0x3c 0x03>; + }; + }; + + dai-link-voicemmode1 { + link-name = "VoiceMMode1"; + + cpu { + sound-dai = <0x3d 0x01>; + }; + }; + + dai-link-primary { + link-name = "Primary MI2S"; + + cpu { + sound-dai = <0x3e 0x10>; + }; + + platform { + sound-dai = <0x3f>; + }; + + codec { + sound-dai = <0x40 0x00 0x41 0x00>; + }; + }; + + dai-link-secondary { + link-name = "Secondary MI2S"; + status = "disabled"; + + cpu { + sound-dai = <0x3e 0x12>; + }; + + platform { + sound-dai = <0x3f>; + }; + }; + + dai-link-tertiary { + link-name = "Tertiary MI2S"; + + cpu { + sound-dai = <0x3e 0x15>; + }; + + platform { + sound-dai = <0x3f>; + }; + + codec { + sound-dai = <0x40 0x01 0x41 0x01>; + }; + }; + + dai-link-quaternary { + link-name = "Quaternary MI2S"; + status = "disabled"; + + cpu { + sound-dai = <0x3e 0x16>; + }; + + platform { + sound-dai = <0x3f>; + }; + }; + }; + + audio-codec@771c000 { + compatible = "qcom,msm8916-wcd-digital-codec"; + reg = <0x771c000 0x400>; + clocks = <0x18 0x42 0x32 0x01>; + clock-names = "ahbix-clk", "mclk"; + assigned-clocks = <0x42 0x32 0x01>; + assigned-clock-rates = <0x927c00>; + #sound-dai-cells = <0x01>; + phandle = <0x40>; + }; + + sdhci@7824000 { + compatible = "qcom,msm8916-sdhci", "qcom,sdhci-msm-v4"; + reg = <0x7824900 0x11c 0x7824000 0x800>; + reg-names = "hc_mem", "core_mem"; + interrupts = <0x00 0x7b 0x04 0x00 0x8a 0x04>; + interrupt-names = "hc_irq", "pwr_irq"; + clocks = <0x14 0x80 0x14 0x7f 0x18>; + clock-names = "core", "iface", "xo"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x43 0x44 0x45>; + pinctrl-1 = <0x46 0x47 0x48>; + mmc-hs200-1_8v; + mmc-ddr-1_8v; + bus-width = <0x08>; + non-removable; + status = "okay"; + vmmc-supply = <0x49>; + vqmmc-supply = <0x2f>; + }; + + sdhci@7864000 { + compatible = "qcom,msm8916-sdhci", "qcom,sdhci-msm-v4"; + reg = <0x7864900 0x11c 0x7864000 0x800>; + reg-names = "hc_mem", "core_mem"; + interrupts = <0x00 0x7d 0x04 0x00 0xdd 0x04>; + interrupt-names = "hc_irq", "pwr_irq"; + clocks = <0x14 0x82 0x14 0x81 0x18>; + clock-names = "core", "iface", "xo"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4a 0x4b 0x4c>; + pinctrl-1 = <0x4d 0x4e 0x4f>; + bus-width = <0x04>; + status = "okay"; + vmmc-supply = <0x50>; + vqmmc-supply = <0x51>; + non-removable; + }; + + dma-controller@7884000 { + compatible = "qcom,bam-v1.7.0"; + reg = <0x7884000 0x23000>; + interrupts = <0x00 0xee 0x04>; + clocks = <0x14 0x3a>; + clock-names = "bam_clk"; + #dma-cells = <0x01>; + qcom,ee = <0x00>; + qcom,controlled-remotely; + phandle = <0x52>; + }; + + serial@78af000 { + compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; + reg = <0x78af000 0x200>; + interrupts = <0x00 0x6b 0x04>; + clocks = <0x14 0x56 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x00 0x52 0x01>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x53>; + pinctrl-1 = <0x54>; + status = "okay"; + }; + + serial@78b0000 { + compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; + reg = <0x78b0000 0x200>; + interrupts = <0x00 0x6c 0x04>; + clocks = <0x14 0x57 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x02 0x52 0x03>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x55>; + pinctrl-1 = <0x56>; + status = "disabled"; + }; + + i2c@78b5000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b5000 0x500>; + interrupts = <0x00 0x5f 0x04>; + clocks = <0x14 0x4a 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x04 0x52 0x05>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x57>; + pinctrl-1 = <0x58>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b5000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b5000 0x500>; + interrupts = <0x00 0x5f 0x04>; + clocks = <0x14 0x4b 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x04 0x52 0x05>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x59>; + pinctrl-1 = <0x5a>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b6000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b6000 0x500>; + interrupts = <0x00 0x60 0x04>; + clocks = <0x14 0x4c 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x06 0x52 0x07>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5b>; + pinctrl-1 = <0x5c>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b6000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b6000 0x500>; + interrupts = <0x00 0x60 0x04>; + clocks = <0x14 0x4d 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x06 0x52 0x07>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5d>; + pinctrl-1 = <0x5e>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b7000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b7000 0x500>; + interrupts = <0x00 0x61 0x04>; + clocks = <0x14 0x4e 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x08 0x52 0x09>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5f>; + pinctrl-1 = <0x60>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b7000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b7000 0x500>; + interrupts = <0x00 0x61 0x04>; + clocks = <0x14 0x4f 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x08 0x52 0x09>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x61>; + pinctrl-1 = <0x62>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b8000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b8000 0x500>; + interrupts = <0x00 0x62 0x04>; + clocks = <0x14 0x50 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0a 0x52 0x0b>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x63>; + pinctrl-1 = <0x64>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b8000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b8000 0x500>; + interrupts = <0x00 0x62 0x04>; + clocks = <0x14 0x51 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0a 0x52 0x0b>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x65>; + pinctrl-1 = <0x66>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b9000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b9000 0x500>; + interrupts = <0x00 0x63 0x04>; + clocks = <0x14 0x52 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0c 0x52 0x0d>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x67>; + pinctrl-1 = <0x68>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b9000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b9000 0x500>; + interrupts = <0x00 0x63 0x04>; + clocks = <0x14 0x53 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0c 0x52 0x0d>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x69>; + pinctrl-1 = <0x6a>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "okay"; + + display@0 { + compatible = "nokia,argon-gc9305-v2-panel", "panel-mipi-dbi-spi"; + reg = <0x00>; + backlight = <0x6b>; + reset-gpios = <0x27 0x19 0x00>; + dc-gpios = <0x27 0x6e 0x00>; + spi-max-frequency = <0x2faf080>; + power-supply = <0x6c>; + io-supply = <0x6d>; + width-mm = <0x24>; + height-mm = <0x30>; + pinctrl-0 = <0x6e>; + pinctrl-names = "default"; + + panel-timing { + hactive = <0xf0>; + vactive = <0x140>; + hback-porch = <0x00>; + vback-porch = <0x00>; + hfront-porch = <0x00>; + vfront-porch = <0x00>; + hsync-len = <0x00>; + vsync-len = <0x00>; + clock-frequency = "", "#("; + }; + }; + }; + + i2c@78ba000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78ba000 0x500>; + interrupts = <0x00 0x64 0x04>; + clocks = <0x14 0x54 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0e 0x52 0x0f>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x6f>; + pinctrl-1 = <0x70>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78ba000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78ba000 0x500>; + interrupts = <0x00 0x64 0x04>; + clocks = <0x14 0x55 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0e 0x52 0x0f>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x71>; + pinctrl-1 = <0x72>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + usb@78d9000 { + compatible = "qcom,ci-hdrc"; + reg = <0x78d9000 0x200 0x78d9200 0x200>; + interrupts = <0x00 0x86 0x04 0x00 0x8c 0x04>; + clocks = <0x14 0x8d 0x14 0x8f>; + clock-names = "iface", "core"; + assigned-clocks = <0x14 0x8f>; + assigned-clock-rates = <0x4c4b400>; + resets = <0x14 0x27>; + reset-names = "core"; + phy_type = "ulpi"; + dr_mode = "otg"; + hnp-disable; + srp-disable; + adp-disable; + ahb-burst-config = <0x00>; + phy-names = "usb-phy"; + phys = <0x73>; + status = "okay"; + #reset-cells = <0x01>; + extcon = <0x2a>; + + ulpi { + + phy { + compatible = "qcom,usb-hs-phy-msm8909", "qcom,usb-hs-phy"; + #phy-cells = <0x00>; + clocks = <0x18 0x14 0x8c>; + clock-names = "ref", "sleep"; + resets = <0x14 0x21 0x14 0x26>; + reset-names = "phy", "por"; + qcom,init-seq = [00 73]; + v1p8-supply = <0x34>; + v3p3-supply = <0x31>; + extcon = <0x2a>; + phandle = <0x73>; + }; + }; + }; + + remoteproc@a21b000 { + compatible = "qcom,pronto-v3-pil", "qcom,pronto"; + reg = <0xa204000 0x2000 0xa202000 0x1000 0xa21b000 0x3000>; + reg-names = "ccu", "dxe", "pmu"; + memory-region = <0x74>; + interrupts-extended = <0x01 0x00 0x95 0x01 0x75 0x00 0x01 0x75 0x01 0x01 0x75 0x02 0x01 0x75 0x03 0x01>; + interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack"; + power-domains = <0x04 0x00 0x04 0x03>; + power-domain-names = "cx", "mx"; + qcom,smem-states = <0x76 0x00>; + qcom,smem-state-names = "stop"; + pinctrl-names = "default"; + pinctrl-0 = <0x77>; + status = "okay"; + vddpx-supply = <0x34>; + phandle = <0x7b>; + + iris { + clocks = <0x78 0x10>; + clock-names = "xo"; + vddxo-supply = <0x34>; + vddrfa-supply = <0x79>; + vddpa-supply = <0x7a>; + vdddig-supply = <0x2f>; + compatible = "qcom,wcn3620"; + }; + + smd-edge { + interrupts = <0x00 0x8e 0x01>; + qcom,ipc = <0x03 0x08 0x11>; + qcom,smd-edge = <0x06>; + qcom,remote-pid = <0x04>; + label = "pronto"; + + wcnss { + compatible = "qcom,wcnss"; + qcom,smd-channels = "WCNSS_CTRL"; + qcom,mmio = <0x7b>; + + bluetooth { + compatible = "qcom,wcnss-bt"; + }; + + wifi { + compatible = "qcom,wcnss-wlan"; + interrupts = <0x00 0x91 0x04 0x00 0x92 0x04>; + interrupt-names = "tx", "rx"; + qcom,smem-states = <0x38 0x0a 0x38 0x09>; + qcom,smem-state-names = "tx-enable", "tx-rings-empty"; + }; + }; + }; + }; + + interrupt-controller@b000000 { + compatible = "qcom,msm-qgic2"; + reg = <0xb000000 0x1000 0xb002000 0x1000>; + interrupt-controller; + #interrupt-cells = <0x03>; + phandle = <0x01>; + }; + + mailbox@b011000 { + compatible = "qcom,msm8916-apcs-kpss-global", "syscon"; + reg = <0xb011000 0x1000>; + #mbox-cells = <0x01>; + clocks = <0x7c 0x14 0x01>; + clock-names = "pll", "aux"; + #clock-cells = <0x00>; + phandle = <0x03>; + }; + + clock@b016000 { + compatible = "qcom,msm8916-a53pll"; + reg = <0xb016000 0x40>; + #clock-cells = <0x00>; + clocks = <0x18>; + clock-names = "xo"; + operating-points-v2 = <0x7d>; + phandle = <0x7c>; + + opp-table { + compatible = "operating-points-v2"; + phandle = <0x7d>; + + opp-998400000 { + opp-hz = <0x00 0x3b826000>; + }; + + opp-1094400000 { + opp-hz = <0x00 0x413b3800>; + }; + + opp-1190400000 { + opp-hz = <0x00 0x46f41000>; + }; + + opp-1248000000 { + opp-hz = <0x00 0x4a62f800>; + }; + + opp-1267200000 { + opp-hz = <0x00 0x4b87f000>; + }; + }; + }; + + timer@b020000 { + compatible = "arm,armv7-timer-mem"; + reg = <0xb020000 0x1000>; + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + frame@b021000 { + reg = <0xb021000 0x1000 0xb022000 0x1000>; + interrupts = <0x00 0x08 0x04 0x00 0x07 0x04>; + frame-number = <0x00>; + }; + + frame@b023000 { + reg = <0xb023000 0x1000>; + interrupts = <0x00 0x09 0x04>; + frame-number = <0x01>; + status = "disabled"; + }; + + frame@b024000 { + reg = <0xb024000 0x1000>; + interrupts = <0x00 0x0a 0x04>; + frame-number = <0x02>; + status = "disabled"; + }; + + frame@b025000 { + reg = <0xb025000 0x1000>; + interrupts = <0x00 0x0b 0x04>; + frame-number = <0x03>; + status = "disabled"; + }; + + frame@b026000 { + reg = <0xb026000 0x1000>; + interrupts = <0x00 0x0c 0x04>; + frame-number = <0x04>; + status = "disabled"; + }; + + frame@b027000 { + reg = <0xb027000 0x1000>; + interrupts = <0x00 0x0d 0x04>; + frame-number = <0x05>; + status = "disabled"; + }; + + frame@b028000 { + reg = <0xb028000 0x1000>; + interrupts = <0x00 0x0e 0x04>; + frame-number = <0x06>; + status = "disabled"; + }; + }; + + power-manager@b088000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb088000 0x1000>; + phandle = <0x07>; + }; + + power-manager@b089000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb089000 0x1000>; + phandle = <0x08>; + }; + + power-manager@b098000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb098000 0x1000>; + phandle = <0x09>; + }; + + power-manager@b099000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb099000 0x1000>; + phandle = <0x0a>; + }; + + power-manager@b0a8000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb0a8000 0x1000>; + phandle = <0x0b>; + }; + + power-manager@b0a9000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb0a9000 0x1000>; + phandle = <0x0c>; + }; + + power-manager@b0b8000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb0b8000 0x1000>; + phandle = <0x0d>; + }; + + power-manager@b0b9000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb0b9000 0x1000>; + phandle = <0x0e>; + }; + }; + + thermal-zones { + + cpu0-2-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x03>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "passive"; + phandle = <0x7f>; + }; + + cpu_crit { + temperature = <0x186a0>; + hysteresis = <0x7d0>; + type = "critical"; + }; + }; + + cooling-maps { + + map0 { + trip = <0x7f>; + cooling-device = <0x80 0xffffffff 0xffffffff 0x81 0xffffffff 0xffffffff 0x82 0xffffffff 0xffffffff 0x83 0xffffffff 0xffffffff>; + }; + }; + }; + + cpu1-3-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x04>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "passive"; + phandle = <0x84>; + }; + + cpu_crit { + temperature = <0x186a0>; + hysteresis = <0x7d0>; + type = "critical"; + }; + }; + + cooling-maps { + + map0 { + trip = <0x84>; + cooling-device = <0x80 0xffffffff 0xffffffff 0x81 0xffffffff 0xffffffff 0x82 0xffffffff 0xffffffff 0x83 0xffffffff 0xffffffff>; + }; + }; + }; + + gpu-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x02>; + + trips { + + trip-point0 { + temperature = <0x15f90>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + + camera-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x01>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + + modem-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x00>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + }; + + timer { + compatible = "arm,armv7-timer"; + interrupts = <0x01 0x02 0xf08 0x01 0x03 0xf08 0x01 0x04 0xf08 0x01 0x01 0xf08>; + }; + + backlight { + compatible = "pwm-backlight"; + pwms = <0x85 0x00 0x186a0>; + brightness-levels = <0x00 0x04 0x08 0x10 0x20 0x40 0x80 0xff>; + num-interpolated-steps = <0x02>; + default-brightness-level = <0x0a>; + phandle = <0x6b>; + }; + + battery { + compatible = "simple-battery"; + voltage-min-design-microvolt = <0x33e140>; + voltage-max-design-microvolt = <0x432380>; + energy-full-design-microwatt-hours = <0x594390>; + charge-full-design-microamp-hours = <0x16e360>; + ocv-capacity-celsius = <0x19>; + ocv-capacity-table-0 = <0x42d560 0x64 0x417da0 0x5f 0x409b10 0x5a 0x3fef30 0x55 0x3f7230 0x50 0x3ef148 0x4b 0x3e6890 0x46 0x3da540 0x41 0x3cda20 0x3c 0x3c45b0 0x37 0x3be408 0x32 0x3b3440 0x2d 0x3a9800 0x28 0x39fbc0 0x23 0x39bd40 0x1e 0x396368 0x19 0x391d18 0x14 0x38cb10 0x10 0x387cf0 0x0d 0x384e10 0x0b 0x384640 0x0a 0x384258 0x09 0x383a88 0x08 0x3832b8 0x07 0x381b48 0x06 0x37c940 0x05 0x371d60 0x04 0x363ad0 0x03 0x34d370 0x02 0x32b090 0x01 0x2dc6c0 0x00>; + phandle = <0x29>; + }; + + gpio-keys { + compatible = "gpio-keys"; + pinctrl-0 = <0x86 0x87>; + pinctrl-names = "default"; + + key-up { + wakeup-source; + gpios = <0x27 0x5a 0x01>; + linux,code = <0x67>; + debounce-interval = <0x0f>; + linux,can-disable; + }; + + key-back { + wakeup-source; + gpios = <0x27 0x62 0x01>; + linux,code = <0x0e>; + debounce-interval = <0x0f>; + linux,can-disable; + }; + + switch-lid-close { + wakeup-source; + gpios = <0x27 0x5c 0x01>; + linux,input-type = <0x05>; + linux,code = <0x00>; + }; + + switch-lid-open { + gpios = <0x27 0x24 0x01>; + linux,input-type = <0x05>; + linux,code = <0x0a>; + }; + }; + + keypad { + compatible = "gpio-matrix-keypad"; + col-scan-delay-ms = <0x07>; + debounce-delay-ms = <0x0a>; + gpio-activelow; + pinctrl-0 = <0x88 0x89>; + pinctrl-names = "default"; + row-gpios = <0x27 0x61 0x01 0x27 0x60 0x01 0x27 0x5f 0x01 0x27 0x5e 0x01>; + col-gpios = <0x27 0x34 0x01 0x27 0x38 0x01 0x27 0x07 0x01 0x27 0x63 0x01 0x27 0x06 0x01>; + linux,keymap = <0x1bd 0x10002 0x20005 0x30008 0x4020a 0x1000069 0x1010003 0x1020006 0x1030009 0x104000b 0x20002b8 0x2010004 0x2020007 0x203000a 0x204020b 0x300001c 0x301006a 0x30202b9>; + }; + + leds { + compatible = "gpio-leds"; + pinctrl-0 = <0x8a>; + pinctrl-names = "default"; + + led-0 { + function = "kbd_backlight"; + color = <0x00>; + gpios = <0x2c 0x01 0x00>; + }; + }; +}; diff --git a/devices/nokia-beatles/00-nokia-beatles-display.files b/devices/nokia-beatles/00-nokia-beatles-display.files new file mode 100644 index 0000000..36036a2 --- /dev/null +++ b/devices/nokia-beatles/00-nokia-beatles-display.files @@ -0,0 +1,2 @@ +/lib/firmware/nokia,beatles-gc9305-panel.bin +/lib/firmware/nokia,argon-gc9305-v2-panel.bin diff --git a/devices/nokia-beatles/deviceinfo b/devices/nokia-beatles/deviceinfo new file mode 100644 index 0000000..637528d --- /dev/null +++ b/devices/nokia-beatles/deviceinfo @@ -0,0 +1,31 @@ +# Reference: +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" diff --git a/devices/nokia-beatles/kernel-cmdline.conf b/devices/nokia-beatles/kernel-cmdline.conf new file mode 100644 index 0000000..2235027 --- /dev/null +++ b/devices/nokia-beatles/kernel-cmdline.conf @@ -0,0 +1,2 @@ +earlycon +console=ttyMSM0,115200 diff --git a/devices/nokia-beatles/modules-initfs b/devices/nokia-beatles/modules-initfs new file mode 100644 index 0000000..b7b5425 --- /dev/null +++ b/devices/nokia-beatles/modules-initfs @@ -0,0 +1,5 @@ +pm8916-lbc +pm8916-bms-vm +panel-mipi-dbi +matrix_keypad +matrix_keymap diff --git a/devices/nokia-beatles/nokia,beatles-gc9305-panel.bin b/devices/nokia-beatles/nokia,beatles-gc9305-panel.bin new file mode 100644 index 0000000..5aba36d Binary files /dev/null and b/devices/nokia-beatles/nokia,beatles-gc9305-panel.bin differ diff --git a/devices/nokia-beatles/nokia,beatles-gc9305-panel.txt b/devices/nokia-beatles/nokia,beatles-gc9305-panel.txt new file mode 100644 index 0000000..518302e --- /dev/null +++ b/devices/nokia-beatles/nokia,beatles-gc9305-panel.txt @@ -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 diff --git a/devices/nokia-beatles/qcom-msm8905-nokia-beatles.dtb b/devices/nokia-beatles/qcom-msm8905-nokia-beatles.dtb new file mode 100644 index 0000000..beda68e Binary files /dev/null and b/devices/nokia-beatles/qcom-msm8905-nokia-beatles.dtb differ diff --git a/devices/nokia-beatles/qcom-msm8905-nokia-beatles.dts b/devices/nokia-beatles/qcom-msm8905-nokia-beatles.dts new file mode 100644 index 0000000..8b55b05 --- /dev/null +++ b/devices/nokia-beatles/qcom-msm8905-nokia-beatles.dts @@ -0,0 +1,2238 @@ +/dts-v1/; + +/ { + #address-cells = <0x01>; + #size-cells = <0x01>; + interrupt-parent = <0x01>; + model = "Nokia 2720 Flip"; + compatible = "nokia,beatles", "nokia,argon", "qcom,msm8905", "qcom,msm8909"; + chassis-type = "handset"; + + aliases { + mmc0 = "/soc@0/sdhci@7824000"; + mmc1 = "/soc@0/sdhci@7864000"; + serial0 = "/soc@0/serial@78af000"; + }; + + chosen { + stdout-path = "serial0"; + }; + + clocks { + + xo-board { + compatible = "fixed-clock"; + #clock-cells = <0x00>; + clock-frequency = <0x124f800>; + phandle = <0x18>; + }; + + sleep-clk { + compatible = "fixed-clock"; + #clock-cells = <0x00>; + clock-frequency = <0x8000>; + phandle = <0x28>; + }; + }; + + cpus { + #address-cells = <0x01>; + #size-cells = <0x00>; + + cpu@0 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x00>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x07>; + qcom,saw = <0x08>; + phandle = <0x80>; + }; + + cpu@1 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x01>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x09>; + qcom,saw = <0x0a>; + phandle = <0x81>; + }; + + cpu@2 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x02>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x0b>; + qcom,saw = <0x0c>; + phandle = <0x82>; + }; + + cpu@3 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x03>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x0d>; + qcom,saw = <0x0e>; + phandle = <0x83>; + }; + + l2-cache { + compatible = "cache"; + cache-level = <0x02>; + phandle = <0x02>; + }; + + idle-states { + + cpu-sleep-0 { + compatible = "qcom,idle-state-spc"; + idle-state-name = "standalone-power-collapse"; + entry-latency-us = <0xb4>; + exit-latency-us = <0xf0>; + min-residency-us = <0x4ec>; + local-timer-stop; + phandle = <0x06>; + }; + }; + }; + + cpu-opp-table { + compatible = "operating-points-v2-kryo-cpu", "operating-points-v2"; + nvmem-cells = <0x0f>; + opp-shared; + phandle = <0x05>; + + opp-199999951 { + opp-hz = <0x00 0xbebc1cf>; + required-opps = <0x10>; + opp-supported-hw = <0xff>; + }; + + opp-399999902 { + opp-hz = <0x00 0x17d7839e>; + required-opps = <0x11>; + opp-supported-hw = <0xff>; + }; + + opp-533333202 { + opp-hz = <0x00 0x1fca04d2>; + required-opps = <0x11>; + opp-supported-hw = <0xff>; + }; + + opp-799999804 { + opp-hz = <0x00 0x2faf073c>; + required-opps = <0x12>; + opp-supported-hw = <0xff>; + }; + + opp-998400000 { + opp-hz = <0x00 0x3b826000>; + required-opps = <0x12>; + opp-supported-hw = <0x05>; + }; + + opp-1094400000 { + opp-hz = <0x00 0x413b3800>; + required-opps = <0x13>; + opp-supported-hw = <0x05>; + }; + + opp-1248000000 { + opp-hz = <0x00 0x4a62f800>; + required-opps = <0x13>; + opp-supported-hw = <0x01>; + }; + + opp-1267200000 { + opp-hz = <0x00 0x4b87f000>; + required-opps = <0x13>; + opp-supported-hw = <0x01>; + }; + }; + + firmware { + + scm { + compatible = "qcom,scm-msm8916", "qcom,scm"; + clocks = <0x14 0x3d 0x14 0x3f 0x14 0x3e>; + clock-names = "core", "bus", "iface"; + qcom,dload-mode = <0x15 0x6100>; + }; + }; + + memory@80000000 { + device_type = "memory"; + reg = <0x80000000 0x00>; + }; + + pmu { + compatible = "arm,cortex-a7-pmu"; + interrupts = <0x01 0x07 0xf04>; + }; + + reserved-memory { + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + tz-apps@87a00000 { + reg = <0x87a00000 0x200000>; + no-map; + }; + + rfsa@87ce0000 { + reg = <0x87ce0000 0x20000>; + no-map; + }; + + smem@87d00000 { + compatible = "qcom,smem"; + reg = <0x87d00000 0x100000>; + no-map; + hwlocks = <0x16 0x03>; + qcom,rpm-msg-ram = <0x17>; + }; + + tz@87e00000 { + reg = <0x87e00000 0x200000>; + no-map; + }; + + mpss@88000000 { + reg = <0x88000000 0x5500000>; + no-map; + phandle = <0x36>; + }; + + wcnss@8d500000 { + reg = <0x8d500000 0x700000>; + no-map; + phandle = <0x74>; + }; + + mba@8dc00000 { + reg = <0x8dc00000 0x100000>; + no-map; + phandle = <0x35>; + }; + + rmtfs@9f700000 { + compatible = "qcom,rmtfs-mem"; + reg = <0x9f700000 0x300000>; + no-map; + qcom,client-id = <0x01>; + }; + }; + + smd { + compatible = "qcom,smd"; + + rpm { + interrupts = <0x00 0xa8 0x01>; + qcom,ipc = <0x03 0x08 0x00>; + qcom,smd-edge = <0x0f>; + + rpm-requests { + compatible = "qcom,rpm-msm8909"; + qcom,smd-channels = "rpm_requests"; + + clock-controller { + compatible = "qcom,rpmcc-msm8909", "qcom,rpmcc"; + #clock-cells = <0x01>; + clocks = <0x18>; + clock-names = "xo"; + phandle = <0x78>; + }; + + power-controller { + compatible = "qcom,msm8909-rpmpd"; + #power-domain-cells = <0x01>; + operating-points-v2 = <0x19>; + phandle = <0x04>; + + opp-table { + compatible = "operating-points-v2"; + phandle = <0x19>; + + opp1 { + opp-level = <0x01>; + phandle = <0x10>; + }; + + opp2 { + opp-level = <0x02>; + }; + + opp3 { + opp-level = <0x03>; + phandle = <0x11>; + }; + + opp4 { + opp-level = <0x04>; + phandle = <0x12>; + }; + + opp5 { + opp-level = <0x05>; + }; + + opp6 { + opp-level = <0x06>; + phandle = <0x13>; + }; + }; + }; + + pm8909-regulators { + compatible = "qcom,rpm-pm8909-regulators"; + + s2 { + regulator-min-microvolt = <0x1c3a90>; + regulator-max-microvolt = <0x1c3a90>; + phandle = <0x30>; + }; + + l1 { + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0xf4240>; + }; + + l2 { + regulator-min-microvolt = <0x124f80>; + regulator-max-microvolt = <0x124f80>; + }; + + l4 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + }; + + l5 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x2f>; + }; + + l6 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x6d>; + }; + + l7 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x34>; + }; + + l8 { + regulator-min-microvolt = <0x2b7cd0>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x49>; + }; + + l9 { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x325aa0>; + phandle = <0x7a>; + }; + + l10 { + regulator-min-microvolt = <0x12b128>; + regulator-max-microvolt = <0x13d620>; + phandle = <0x79>; + }; + + l11 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2d0370>; + regulator-system-load = <0x30d40>; + regulator-allow-set-load; + phandle = <0x50>; + }; + + l12 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2d0370>; + phandle = <0x51>; + }; + + l13 { + regulator-min-microvolt = <0x2eebb8>; + regulator-max-microvolt = <0x2eebb8>; + phandle = <0x31>; + }; + + l14 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2dc6c0>; + }; + + l15 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2dc6c0>; + }; + + l17 { + regulator-min-microvolt = <0x2b7cd0>; + regulator-max-microvolt = <0x2b7cd0>; + phandle = <0x6c>; + }; + + l18 { + regulator-min-microvolt = <0x2932e0>; + regulator-max-microvolt = <0x2932e0>; + }; + }; + }; + }; + }; + + smp2p-hexagon { + compatible = "qcom,smp2p"; + qcom,smem = <0x1b3 0x1ac>; + interrupts = <0x00 0x1b 0x01>; + qcom,ipc = <0x03 0x08 0x0e>; + qcom,local-pid = <0x00>; + qcom,remote-pid = <0x01>; + + master-kernel { + qcom,entry-name = "master-kernel"; + #qcom,smem-state-cells = <0x01>; + phandle = <0x33>; + }; + + slave-kernel { + qcom,entry-name = "slave-kernel"; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x32>; + }; + }; + + smp2p-wcnss { + compatible = "qcom,smp2p"; + qcom,smem = <0x1c3 0x1af>; + interrupts = <0x00 0x8f 0x01>; + qcom,ipc = <0x03 0x08 0x12>; + qcom,local-pid = <0x00>; + qcom,remote-pid = <0x04>; + + master-kernel { + qcom,entry-name = "master-kernel"; + #qcom,smem-state-cells = <0x01>; + phandle = <0x76>; + }; + + slave-kernel { + qcom,entry-name = "slave-kernel"; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x75>; + }; + }; + + smsm { + compatible = "qcom,smsm"; + #address-cells = <0x01>; + #size-cells = <0x00>; + qcom,ipc-1 = <0x03 0x08 0x0d>; + qcom,ipc-3 = <0x03 0x08 0x13>; + + apps@0 { + reg = <0x00>; + #qcom,smem-state-cells = <0x01>; + phandle = <0x38>; + }; + + hexagon@1 { + reg = <0x01>; + interrupts = <0x00 0x1a 0x01>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x37>; + }; + + wcnss@6 { + reg = <0x06>; + interrupts = <0x00 0x90 0x01>; + interrupt-controller; + #interrupt-cells = <0x02>; + }; + }; + + soc@0 { + compatible = "simple-bus"; + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + rng@22000 { + compatible = "qcom,prng"; + reg = <0x22000 0x200>; + clocks = <0x14 0x44>; + clock-names = "core"; + }; + + qfprom@5c000 { + compatible = "qcom,qfprom"; + reg = <0x5c000 0x1000>; + #address-cells = <0x01>; + #size-cells = <0x01>; + + speedbin@c { + reg = <0x0c 0x01>; + bits = <0x02 0x03>; + phandle = <0x0f>; + }; + + s0-p1@a0 { + reg = <0xa0 0x01>; + bits = <0x00 0x06>; + phandle = <0x1d>; + }; + + s0-p2@a0 { + reg = <0xa0 0x02>; + bits = <0x06 0x06>; + phandle = <0x1e>; + }; + + s1-p1@a1 { + reg = <0xa1 0x02>; + bits = <0x04 0x06>; + phandle = <0x1f>; + }; + + s1-p2@a2 { + reg = <0xa2 0x01>; + bits = <0x02 0x06>; + phandle = <0x20>; + }; + + s2-p1@a3 { + reg = <0xa3 0x01>; + bits = <0x00 0x06>; + phandle = <0x21>; + }; + + s2-p2@a3 { + reg = <0xa3 0x02>; + bits = <0x06 0x06>; + phandle = <0x22>; + }; + + s3-p1@a4 { + reg = <0xa4 0x02>; + bits = <0x04 0x06>; + phandle = <0x23>; + }; + + s3-p2@a5 { + reg = <0xa5 0x01>; + bits = <0x02 0x06>; + phandle = <0x24>; + }; + + s4-p1@a6 { + reg = <0xa6 0x01>; + bits = <0x00 0x06>; + phandle = <0x25>; + }; + + s4-p2@a6 { + reg = <0xa6 0x02>; + bits = <0x06 0x06>; + phandle = <0x26>; + }; + + base1@dc { + reg = <0xdc 0x01>; + bits = <0x00 0x08>; + phandle = <0x1b>; + }; + + base2@dd { + reg = <0xdd 0x01>; + bits = <0x00 0x08>; + phandle = <0x1c>; + }; + + mode@de { + reg = <0xde 0x01>; + bits = <0x00 0x03>; + phandle = <0x1a>; + }; + }; + + sram@60000 { + compatible = "qcom,rpm-msg-ram"; + reg = <0x60000 0x8000>; + phandle = <0x17>; + }; + + sram@290000 { + compatible = "qcom,rpm-stats"; + reg = <0x290000 0x10000>; + }; + + thermal-sensor@4a9000 { + compatible = "qcom,msm8909-tsens", "qcom,tsens-v0_1"; + reg = <0x4a9000 0x1000 0x4a8000 0x1000>; + nvmem-cells = <0x1a 0x1b 0x1c 0x1d 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25 0x26>; + nvmem-cell-names = "mode", "base1", "base2", "s0_p1", "s0_p2", "s1_p1", "s1_p2", "s2_p1", "s2_p2", "s3_p1", "s3_p2", "s4_p1", "s4_p2"; + interrupts = <0x00 0xb8 0x04>; + interrupt-names = "uplow"; + #thermal-sensor-cells = <0x01>; + #qcom,sensors = <0x05>; + phandle = <0x7e>; + }; + + restart@4ab000 { + compatible = "qcom,pshold"; + reg = <0x4ab000 0x04>; + }; + + pinctrl@1000000 { + compatible = "qcom,msm8909-tlmm"; + reg = <0x1000000 0x300000>; + interrupts = <0x00 0xd0 0x04>; + gpio-controller; + #gpio-cells = <0x02>; + gpio-ranges = <0x27 0x00 0x00 0x75>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x27>; + + blsp-i2c1-default-state { + pins = "gpio6", "gpio7"; + function = "blsp_i2c1"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x57>; + }; + + blsp-i2c1-sleep-state { + pins = "gpio6", "gpio7"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x58>; + }; + + blsp-i2c2-default-state { + pins = "gpio111", "gpio112"; + function = "blsp_i2c2"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5b>; + }; + + blsp-i2c2-sleep-state { + pins = "gpio111", "gpio112"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5c>; + }; + + blsp-i2c3-default-state { + pins = "gpio29", "gpio30"; + function = "blsp_i2c3"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5f>; + }; + + blsp-i2c3-sleep-state { + pins = "gpio29", "gpio30"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x60>; + }; + + blsp-i2c4-default-state { + pins = "gpio14", "gpio15"; + function = "blsp_i2c4"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x63>; + }; + + blsp-i2c4-sleep-state { + pins = "gpio14", "gpio15"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x64>; + }; + + blsp-i2c5-default-state { + pins = "gpio18", "gpio19"; + function = "blsp_i2c5"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x67>; + }; + + blsp-i2c5-sleep-state { + pins = "gpio18", "gpio19"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x68>; + }; + + blsp-i2c6-default-state { + pins = "gpio10", "gpio11"; + function = "blsp_i2c6"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x6f>; + }; + + blsp-i2c6-sleep-state { + pins = "gpio10", "gpio11"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x70>; + }; + + blsp-spi1-default-state { + pins = "gpio4", "gpio5", "gpio6", "gpio7"; + function = "blsp_spi1"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x59>; + }; + + blsp-spi1-sleep-state { + pins = "gpio4", "gpio5", "gpio6", "gpio7"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x5a>; + }; + + blsp-spi2-default-state { + pins = "gpio20", "gpio21", "gpio111", "gpio112"; + function = "blsp_spi2"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x5d>; + }; + + blsp-spi2-sleep-state { + pins = "gpio20", "gpio21", "gpio111", "gpio112"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x5e>; + }; + + blsp-spi3-default-state { + pins = "gpio0", "gpio1", "gpio2", "gpio3"; + function = "blsp_spi3"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x61>; + }; + + blsp-spi3-sleep-state { + pins = "gpio0", "gpio1", "gpio2", "gpio3"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x62>; + }; + + blsp-spi4-default-state { + pins = "gpio12", "gpio13", "gpio14", "gpio15"; + function = "blsp_spi4"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x65>; + }; + + blsp-spi4-sleep-state { + pins = "gpio12", "gpio13", "gpio14", "gpio15"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x66>; + }; + + blsp-spi5-default-state { + pins = "gpio16", "gpio17", "gpio18", "gpio19"; + function = "blsp_spi5"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x69>; + }; + + blsp-spi5-sleep-state { + pins = "gpio16", "gpio17", "gpio18", "gpio19"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x6a>; + }; + + blsp-spi6-default-state { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "blsp_spi6"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x71>; + }; + + blsp-spi6-sleep-state { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x72>; + }; + + blsp-uart1-default-state { + pins = "gpio4", "gpio5"; + function = "blsp_uart1"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x53>; + }; + + blsp-uart1-sleep-state { + pins = "gpio4", "gpio5"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x54>; + }; + + blsp-uart2-default-state { + pins = "gpio20", "gpio21"; + function = "blsp_uart2"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x55>; + }; + + blsp-uart2-sleep-state { + pins = "gpio20", "gpio21"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x56>; + }; + + sdc1-clk-on-state { + pins = "sdc1_clk"; + bias-disable; + drive-strength = <0x10>; + phandle = <0x43>; + }; + + sdc1-clk-off-state { + pins = "sdc1_clk"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x46>; + }; + + sdc1-cmd-on-state { + pins = "sdc1_cmd"; + bias-disable; + drive-strength = <0x0a>; + phandle = <0x44>; + }; + + sdc1-cmd-off-state { + pins = "sdc1_cmd"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x47>; + }; + + sdc1-data-on-state { + pins = "sdc1_data"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x45>; + }; + + sdc1-data-off-state { + pins = "sdc1_data"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x48>; + }; + + sdc2-clk-on-state { + pins = "sdc2_clk"; + drive-strength = <0x10>; + bias-disable; + phandle = <0x4a>; + }; + + sdc2-clk-off-state { + pins = "sdc2_clk"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x4d>; + }; + + sdc2-cmd-on-state { + pins = "sdc2_cmd"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x4b>; + }; + + sdc2-cmd-off-state { + pins = "sdc2_cmd"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x4e>; + }; + + sdc2-data-on-state { + pins = "sdc2_data"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x4c>; + }; + + sdc2-data-off-state { + pins = "sdc2_data"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x4f>; + }; + + wcnss-active-state { + pins = "gpio40", "gpio41", "gpio42", "gpio43", "gpio44"; + function = "wcss_wlan"; + drive-strength = <0x06>; + bias-pull-up; + phandle = <0x77>; + }; + + cdc-pdm-lines { + + pdm-lines-on { + pins = "gpio59", "gpio60", "gpio61", "gpio62", "gpio63", "gpio64"; + function = "cdc_pdm0"; + drive-strength = <0x08>; + bias-disable; + phandle = <0x3a>; + }; + + pdm-lines-off { + pins = "gpio59", "gpio60", "gpio61", "gpio62", "gpio63", "gpio64"; + function = "cdc_pdm0"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x3b>; + }; + }; + + gpio-key-active-state { + pins = "gpio90", "gpio98"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-up; + phandle = <0x86>; + }; + + lid-switch-active-state { + pins = "gpio36", "gpio92"; + function = "gpio"; + drive-strength = <0x06>; + bias-pull-up; + phandle = <0x87>; + }; + + matrix-keypad-row-gpio-state { + pins = "gpio94", "gpio95", "gpio96", "gpio97"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-up; + phandle = <0x88>; + }; + + matrix-keypad-col-default-state { + pins = "gpio52", "gpio56", "gpio7", "gpio99", "gpio6"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x89>; + }; + + panel-gpios-default-state { + pins = "gpio24", "gpio25", "gpio110"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x6e>; + }; + }; + + clock-controller@1800000 { + compatible = "qcom,gcc-msm8909"; + reg = <0x1800000 0x80000>; + #clock-cells = <0x01>; + #reset-cells = <0x01>; + #power-domain-cells = <0x01>; + clocks = <0x18 0x28 0x00 0x00>; + clock-names = "xo", "sleep_clk", "dsi0pll", "dsi0pllbyte"; + phandle = <0x14>; + }; + + hwlock@1905000 { + compatible = "qcom,tcsr-mutex"; + reg = <0x1905000 0x20000>; + #hwlock-cells = <0x01>; + phandle = <0x16>; + }; + + syscon@1937000 { + compatible = "qcom,tcsr-msm8909", "syscon"; + reg = <0x1937000 0x30000>; + phandle = <0x15>; + }; + + spmi@200f000 { + compatible = "qcom,spmi-pmic-arb"; + reg = <0x200f000 0x1000 0x2400000 0x400000 0x2c00000 0x400000 0x3800000 0x200000 0x200a000 0x2100>; + reg-names = "core", "chnls", "obsrvr", "intr", "cnfg"; + interrupt-names = "periph_irq"; + interrupts = <0x00 0xbe 0x04>; + qcom,ee = <0x00>; + qcom,channel = <0x00>; + #address-cells = <0x02>; + #size-cells = <0x00>; + interrupt-controller; + #interrupt-cells = <0x04>; + phandle = <0x2e>; + + pmic@0 { + compatible = "qcom,pm8909", "qcom,spmi-pmic"; + reg = <0x00 0x00>; + #address-cells = <0x01>; + #size-cells = <0x00>; + + pon@800 { + compatible = "qcom,pm8916-pon"; + reg = <0x800>; + mode-bootloader = <0x02>; + mode-recovery = <0x01>; + + pwrkey { + compatible = "qcom,pm8941-pwrkey"; + interrupts = <0x00 0x08 0x00 0x03>; + debounce = <0x3d09>; + bias-pull-up; + linux,code = <0x74>; + }; + + resin { + compatible = "qcom,pm8941-resin"; + interrupts = <0x00 0x08 0x01 0x03>; + debounce = <0x3d09>; + bias-pull-up; + status = "okay"; + linux,code = <0x6c>; + }; + + watchdog { + compatible = "qcom,pm8916-wdt"; + interrupts = <0x00 0x08 0x06 0x01>; + timeout-sec = <0x3c>; + }; + }; + + charger@1000 { + compatible = "qcom,pm8916-lbc"; + reg = <0x1000 0x1200 0x1300 0x1600>; + reg-names = "chgr", "bat_if", "usb", "misc"; + interrupts = <0x00 0x10 0x00 0x03 0x00 0x10 0x05 0x03 0x00 0x10 0x06 0x03 0x00 0x10 0x07 0x03 0x00 0x12 0x00 0x03 0x00 0x12 0x01 0x03 0x00 0x13 0x00 0x03 0x00 0x13 0x01 0x03 0x00 0x13 0x02 0x03 0x00 0x13 0x04 0x03>; + interrupt-names = "vbat_det", "fast_chg", "chg_fail", "chg_done", "bat_pres", "temp_ok", "coarse_det", "usb_vbus", "chg_gone", "overtemp"; + status = "okay"; + qcom,fast-charge-safe-current = <0x57e40>; + qcom,fast-charge-safe-voltage = <0x426030>; + monitored-battery = <0x29>; + phandle = <0x2a>; + }; + + extcon@1300 { + compatible = "qcom,pm8941-misc"; + reg = <0x1300>; + interrupts = <0x00 0x13 0x01 0x03>; + interrupt-names = "usb_vbus"; + status = "disabled"; + }; + + vm-bms@4000 { + compatible = "qcom,pm8916-bms-vm"; + reg = <0x4000>; + interrupts = <0x00 0x40 0x00 0x01 0x00 0x40 0x01 0x01 0x00 0x40 0x02 0x01 0x00 0x40 0x03 0x01 0x00 0x40 0x04 0x01 0x00 0x40 0x05 0x01>; + interrupt-names = "cv_leave", "cv_enter", "ocv_good", "ocv_thr", "fifo", "state_chg"; + status = "okay"; + monitored-battery = <0x29>; + power-supplies = <0x2a>; + }; + + rtc@6000 { + compatible = "qcom,pm8941-rtc"; + reg = <0x6000>; + interrupts = <0x00 0x61 0x01 0x01>; + }; + + mpps@a000 { + compatible = "qcom,pm8916-mpp", "qcom,spmi-mpp"; + reg = <0xa000>; + gpio-controller; + #gpio-cells = <0x02>; + gpio-ranges = <0x2b 0x00 0x00 0x04>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x2b>; + + mpp2-state { + pins = "mpp2"; + function = "digital"; + power-source = <0x00>; + output-low; + qcom,dtest = <0x01>; + phandle = <0x2d>; + }; + }; + + gpios@c000 { + compatible = "qcom,pm8916-gpio", "qcom,spmi-gpio"; + reg = <0xc000>; + gpio-controller; + gpio-ranges = <0x2c 0x00 0x00 0x04>; + #gpio-cells = <0x02>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x2c>; + + keypad-backlight-default-state { + pins = "gpio1"; + function = "normal"; + output-low; + power-source = <0x03>; + phandle = <0x8a>; + }; + }; + }; + + pmic@1 { + compatible = "qcom,pm8909", "qcom,spmi-pmic"; + reg = <0x01 0x00>; + #address-cells = <0x01>; + #size-cells = <0x00>; + + pwm { + compatible = "qcom,pm8916-pwm"; + #pwm-cells = <0x02>; + status = "okay"; + pinctrl-0 = <0x2d>; + pinctrl-names = "default"; + phandle = <0x85>; + }; + + vibrator@c000 { + compatible = "qcom,pm8916-vib"; + reg = <0xc000>; + status = "okay"; + }; + + audio-codec@f000 { + compatible = "qcom,pm8916-wcd-analog-codec"; + reg = <0xf000>; + reg-names = "pmic-codec-core"; + interrupt-parent = <0x2e>; + interrupts = <0x01 0xf0 0x00 0x00 0x01 0xf0 0x01 0x00 0x01 0xf0 0x02 0x00 0x01 0xf0 0x03 0x00 0x01 0xf0 0x04 0x00 0x01 0xf0 0x05 0x00 0x01 0xf0 0x06 0x00 0x01 0xf0 0x07 0x00 0x01 0xf1 0x00 0x00 0x01 0xf1 0x01 0x00 0x01 0xf1 0x02 0x00 0x01 0xf1 0x03 0x00 0x01 0xf1 0x04 0x00 0x01 0xf1 0x05 0x00>; + interrupt-names = "cdc_spk_cnp_int", "cdc_spk_clip_int", "cdc_spk_ocp_int", "mbhc_ins_rem_det1", "mbhc_but_rel_det", "mbhc_but_press_det", "mbhc_ins_rem_det", "mbhc_switch_int", "cdc_ear_ocp_int", "cdc_hphr_ocp_int", "cdc_hphl_ocp_det", "cdc_ear_cnp_int", "cdc_hphr_cnp_int", "cdc_hphl_cnp_int"; + #sound-dai-cells = <0x01>; + status = "okay"; + qcom,hphl-jack-type-normally-open; + qcom,micbias1-ext-cap; + qcom,micbias2-ext-cap; + qcom,mbhc-vthreshold-low = <0x55 0x78 0xe1 0x1c2 0x1f4>; + qcom,mbhc-vthreshold-high = <0x55 0x78 0xe1 0x1c2 0x1f4>; + vdd-cdc-io-supply = <0x2f>; + vdd-cdc-tx-rx-cx-supply = <0x30>; + vdd-micbias-supply = <0x31>; + phandle = <0x41>; + }; + }; + }; + + dma-controller@4044000 { + compatible = "qcom,bam-v1.7.0"; + reg = <0x4044000 0x19000>; + interrupts = <0x00 0x1d 0x04>; + #dma-cells = <0x01>; + qcom,ee = <0x00>; + num-channels = <0x06>; + qcom,num-ees = <0x01>; + qcom,powered-remotely; + phandle = <0x39>; + }; + + remoteproc@4080000 { + compatible = "qcom,msm8909-mss-pil"; + reg = <0x4080000 0x100 0x4020000 0x40>; + reg-names = "qdsp6", "rmb"; + interrupts-extended = <0x01 0x00 0x18 0x01 0x32 0x00 0x01 0x32 0x01 0x01 0x32 0x02 0x01 0x32 0x03 0x01>; + interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack"; + power-domains = <0x04 0x00 0x04 0x04>; + power-domain-names = "cx", "mx"; + clocks = <0x14 0x79 0x14 0x7a 0x14 0x3c 0x18>; + clock-names = "iface", "bus", "mem", "xo"; + qcom,smem-states = <0x33 0x00>; + qcom,smem-state-names = "stop"; + resets = <0x14 0x29>; + reset-names = "mss_restart"; + qcom,halt-regs = <0x15 0x18000 0x19000 0x1a000>; + status = "okay"; + pll-supply = <0x34>; + + mba { + memory-region = <0x35>; + }; + + mpss { + memory-region = <0x36>; + }; + + bam-dmux { + compatible = "qcom,bam-dmux"; + interrupt-parent = <0x37>; + interrupts = <0x01 0x03 0x0b 0x03>; + interrupt-names = "pc", "pc-ack"; + qcom,smem-states = <0x38 0x01 0x38 0x0b>; + qcom,smem-state-names = "pc", "pc-ack"; + dmas = <0x39 0x04 0x39 0x05>; + dma-names = "tx", "rx"; + }; + + smd-edge { + interrupts = <0x00 0x19 0x01>; + qcom,smd-edge = <0x00>; + qcom,ipc = <0x03 0x08 0x0c>; + qcom,remote-pid = <0x01>; + label = "hexagon"; + + apr { + compatible = "qcom,apr-v2"; + qcom,smd-channels = "apr_audio_svc"; + qcom,apr-domain = <0x04>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "okay"; + + apr-service@3 { + reg = <0x03>; + compatible = "qcom,q6core"; + }; + + apr-service@4 { + compatible = "qcom,q6afe"; + reg = <0x04>; + + dais { + compatible = "qcom,q6afe-dais"; + #address-cells = <0x01>; + #size-cells = <0x00>; + #sound-dai-cells = <0x01>; + phandle = <0x3e>; + + dai@16 { + reg = <0x10>; + qcom,sd-lines = <0x00 0x01>; + }; + + dai@20 { + reg = <0x15>; + qcom,sd-lines = <0x00 0x01>; + }; + }; + + clock-controller { + compatible = "qcom,q6afe-clocks"; + #clock-cells = <0x02>; + phandle = <0x42>; + }; + }; + + apr-service@7 { + compatible = "qcom,q6asm"; + reg = <0x07>; + + dais { + compatible = "qcom,q6asm-dais"; + #address-cells = <0x01>; + #size-cells = <0x00>; + #sound-dai-cells = <0x01>; + phandle = <0x3c>; + + dai@0 { + reg = <0x00>; + direction = <0x02>; + }; + + dai@1 { + reg = <0x01>; + direction = <0x01>; + }; + + dai@2 { + reg = <0x02>; + direction = <0x02>; + }; + + dai@3 { + reg = <0x03>; + direction = <0x02>; + is-compress-dai; + }; + }; + }; + + apr-service@8 { + compatible = "qcom,q6adm"; + reg = <0x08>; + + routing { + compatible = "qcom,q6adm-routing"; + #sound-dai-cells = <0x00>; + phandle = <0x3f>; + }; + }; + + apr-service@9 { + compatible = "qcom,q6mvm"; + reg = <0x09>; + + dais { + compatible = "qcom,q6voice-dais"; + #sound-dai-cells = <0x01>; + phandle = <0x3d>; + }; + }; + + apr-service@a { + compatible = "qcom,q6cvs"; + reg = <0x0a>; + }; + + apr-service@b { + compatible = "qcom,q6cvp"; + reg = <0x0b>; + }; + }; + }; + }; + + sound@7702000 { + status = "okay"; + compatible = "qcom,msm8916-qdsp6-sndcard"; + reg = <0x7702000 0x04 0x7702004 0x04>; + reg-names = "mic-iomux", "spkr-iomux"; + model = "msm8916"; + audio-routing = "AMIC1", "MIC BIAS External1", "AMIC2", "MIC BIAS Internal2", "AMIC3", "MIC BIAS External1"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x3a>; + pinctrl-1 = <0x3b>; + + dai-link-multimedia1 { + link-name = "MultiMedia1"; + + cpu { + sound-dai = <0x3c 0x00>; + }; + }; + + dai-link-multimedia2 { + link-name = "MultiMedia2"; + + cpu { + sound-dai = <0x3c 0x01>; + }; + }; + + dai-link-multimedia3 { + link-name = "MultiMedia3"; + + cpu { + sound-dai = <0x3c 0x02>; + }; + }; + + dai-link-multimedia4 { + link-name = "MultiMedia4"; + + cpu { + sound-dai = <0x3c 0x03>; + }; + }; + + dai-link-voicemmode1 { + link-name = "VoiceMMode1"; + + cpu { + sound-dai = <0x3d 0x01>; + }; + }; + + dai-link-primary { + link-name = "Primary MI2S"; + + cpu { + sound-dai = <0x3e 0x10>; + }; + + platform { + sound-dai = <0x3f>; + }; + + codec { + sound-dai = <0x40 0x00 0x41 0x00>; + }; + }; + + dai-link-secondary { + link-name = "Secondary MI2S"; + status = "disabled"; + + cpu { + sound-dai = <0x3e 0x12>; + }; + + platform { + sound-dai = <0x3f>; + }; + }; + + dai-link-tertiary { + link-name = "Tertiary MI2S"; + + cpu { + sound-dai = <0x3e 0x15>; + }; + + platform { + sound-dai = <0x3f>; + }; + + codec { + sound-dai = <0x40 0x01 0x41 0x01>; + }; + }; + + dai-link-quaternary { + link-name = "Quaternary MI2S"; + status = "disabled"; + + cpu { + sound-dai = <0x3e 0x16>; + }; + + platform { + sound-dai = <0x3f>; + }; + }; + }; + + audio-codec@771c000 { + compatible = "qcom,msm8916-wcd-digital-codec"; + reg = <0x771c000 0x400>; + clocks = <0x18 0x42 0x32 0x01>; + clock-names = "ahbix-clk", "mclk"; + assigned-clocks = <0x42 0x32 0x01>; + assigned-clock-rates = <0x927c00>; + #sound-dai-cells = <0x01>; + phandle = <0x40>; + }; + + sdhci@7824000 { + compatible = "qcom,msm8916-sdhci", "qcom,sdhci-msm-v4"; + reg = <0x7824900 0x11c 0x7824000 0x800>; + reg-names = "hc_mem", "core_mem"; + interrupts = <0x00 0x7b 0x04 0x00 0x8a 0x04>; + interrupt-names = "hc_irq", "pwr_irq"; + clocks = <0x14 0x80 0x14 0x7f 0x18>; + clock-names = "core", "iface", "xo"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x43 0x44 0x45>; + pinctrl-1 = <0x46 0x47 0x48>; + mmc-hs200-1_8v; + mmc-ddr-1_8v; + bus-width = <0x08>; + non-removable; + status = "okay"; + vmmc-supply = <0x49>; + vqmmc-supply = <0x2f>; + }; + + sdhci@7864000 { + compatible = "qcom,msm8916-sdhci", "qcom,sdhci-msm-v4"; + reg = <0x7864900 0x11c 0x7864000 0x800>; + reg-names = "hc_mem", "core_mem"; + interrupts = <0x00 0x7d 0x04 0x00 0xdd 0x04>; + interrupt-names = "hc_irq", "pwr_irq"; + clocks = <0x14 0x82 0x14 0x81 0x18>; + clock-names = "core", "iface", "xo"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4a 0x4b 0x4c>; + pinctrl-1 = <0x4d 0x4e 0x4f>; + bus-width = <0x04>; + status = "okay"; + vmmc-supply = <0x50>; + vqmmc-supply = <0x51>; + non-removable; + }; + + dma-controller@7884000 { + compatible = "qcom,bam-v1.7.0"; + reg = <0x7884000 0x23000>; + interrupts = <0x00 0xee 0x04>; + clocks = <0x14 0x3a>; + clock-names = "bam_clk"; + #dma-cells = <0x01>; + qcom,ee = <0x00>; + qcom,controlled-remotely; + phandle = <0x52>; + }; + + serial@78af000 { + compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; + reg = <0x78af000 0x200>; + interrupts = <0x00 0x6b 0x04>; + clocks = <0x14 0x56 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x00 0x52 0x01>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x53>; + pinctrl-1 = <0x54>; + status = "okay"; + }; + + serial@78b0000 { + compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; + reg = <0x78b0000 0x200>; + interrupts = <0x00 0x6c 0x04>; + clocks = <0x14 0x57 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x02 0x52 0x03>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x55>; + pinctrl-1 = <0x56>; + status = "disabled"; + }; + + i2c@78b5000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b5000 0x500>; + interrupts = <0x00 0x5f 0x04>; + clocks = <0x14 0x4a 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x04 0x52 0x05>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x57>; + pinctrl-1 = <0x58>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b5000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b5000 0x500>; + interrupts = <0x00 0x5f 0x04>; + clocks = <0x14 0x4b 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x04 0x52 0x05>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x59>; + pinctrl-1 = <0x5a>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b6000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b6000 0x500>; + interrupts = <0x00 0x60 0x04>; + clocks = <0x14 0x4c 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x06 0x52 0x07>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5b>; + pinctrl-1 = <0x5c>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b6000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b6000 0x500>; + interrupts = <0x00 0x60 0x04>; + clocks = <0x14 0x4d 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x06 0x52 0x07>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5d>; + pinctrl-1 = <0x5e>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b7000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b7000 0x500>; + interrupts = <0x00 0x61 0x04>; + clocks = <0x14 0x4e 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x08 0x52 0x09>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5f>; + pinctrl-1 = <0x60>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b7000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b7000 0x500>; + interrupts = <0x00 0x61 0x04>; + clocks = <0x14 0x4f 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x08 0x52 0x09>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x61>; + pinctrl-1 = <0x62>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b8000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b8000 0x500>; + interrupts = <0x00 0x62 0x04>; + clocks = <0x14 0x50 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0a 0x52 0x0b>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x63>; + pinctrl-1 = <0x64>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b8000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b8000 0x500>; + interrupts = <0x00 0x62 0x04>; + clocks = <0x14 0x51 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0a 0x52 0x0b>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x65>; + pinctrl-1 = <0x66>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b9000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b9000 0x500>; + interrupts = <0x00 0x63 0x04>; + clocks = <0x14 0x52 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0c 0x52 0x0d>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x67>; + pinctrl-1 = <0x68>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b9000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b9000 0x500>; + interrupts = <0x00 0x63 0x04>; + clocks = <0x14 0x53 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0c 0x52 0x0d>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x69>; + pinctrl-1 = <0x6a>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "okay"; + + display@0 { + compatible = "nokia,beatles-gc9305-panel", "nokia,argon-gc9305-v2-panel", "panel-mipi-dbi-spi"; + reg = <0x00>; + backlight = <0x6b>; + reset-gpios = <0x27 0x19 0x00>; + dc-gpios = <0x27 0x6e 0x00>; + spi-max-frequency = <0x2faf080>; + power-supply = <0x6c>; + io-supply = <0x6d>; + width-mm = <0x24>; + height-mm = <0x30>; + pinctrl-0 = <0x6e>; + pinctrl-names = "default"; + + panel-timing { + hactive = <0xf0>; + vactive = <0x140>; + hback-porch = <0x00>; + vback-porch = <0x00>; + hfront-porch = <0x00>; + vfront-porch = <0x00>; + hsync-len = <0x00>; + vsync-len = <0x00>; + clock-frequency = "", "#("; + }; + }; + }; + + i2c@78ba000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78ba000 0x500>; + interrupts = <0x00 0x64 0x04>; + clocks = <0x14 0x54 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0e 0x52 0x0f>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x6f>; + pinctrl-1 = <0x70>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78ba000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78ba000 0x500>; + interrupts = <0x00 0x64 0x04>; + clocks = <0x14 0x55 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0e 0x52 0x0f>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x71>; + pinctrl-1 = <0x72>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + usb@78d9000 { + compatible = "qcom,ci-hdrc"; + reg = <0x78d9000 0x200 0x78d9200 0x200>; + interrupts = <0x00 0x86 0x04 0x00 0x8c 0x04>; + clocks = <0x14 0x8d 0x14 0x8f>; + clock-names = "iface", "core"; + assigned-clocks = <0x14 0x8f>; + assigned-clock-rates = <0x4c4b400>; + resets = <0x14 0x27>; + reset-names = "core"; + phy_type = "ulpi"; + dr_mode = "otg"; + hnp-disable; + srp-disable; + adp-disable; + ahb-burst-config = <0x00>; + phy-names = "usb-phy"; + phys = <0x73>; + status = "okay"; + #reset-cells = <0x01>; + extcon = <0x2a>; + + ulpi { + + phy { + compatible = "qcom,usb-hs-phy-msm8909", "qcom,usb-hs-phy"; + #phy-cells = <0x00>; + clocks = <0x18 0x14 0x8c>; + clock-names = "ref", "sleep"; + resets = <0x14 0x21 0x14 0x26>; + reset-names = "phy", "por"; + qcom,init-seq = [00 73]; + v1p8-supply = <0x34>; + v3p3-supply = <0x31>; + extcon = <0x2a>; + phandle = <0x73>; + }; + }; + }; + + remoteproc@a21b000 { + compatible = "qcom,pronto-v3-pil", "qcom,pronto"; + reg = <0xa204000 0x2000 0xa202000 0x1000 0xa21b000 0x3000>; + reg-names = "ccu", "dxe", "pmu"; + memory-region = <0x74>; + interrupts-extended = <0x01 0x00 0x95 0x01 0x75 0x00 0x01 0x75 0x01 0x01 0x75 0x02 0x01 0x75 0x03 0x01>; + interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack"; + power-domains = <0x04 0x00 0x04 0x03>; + power-domain-names = "cx", "mx"; + qcom,smem-states = <0x76 0x00>; + qcom,smem-state-names = "stop"; + pinctrl-names = "default"; + pinctrl-0 = <0x77>; + status = "okay"; + vddpx-supply = <0x34>; + phandle = <0x7b>; + + iris { + clocks = <0x78 0x10>; + clock-names = "xo"; + vddxo-supply = <0x34>; + vddrfa-supply = <0x79>; + vddpa-supply = <0x7a>; + vdddig-supply = <0x2f>; + compatible = "qcom,wcn3620"; + }; + + smd-edge { + interrupts = <0x00 0x8e 0x01>; + qcom,ipc = <0x03 0x08 0x11>; + qcom,smd-edge = <0x06>; + qcom,remote-pid = <0x04>; + label = "pronto"; + + wcnss { + compatible = "qcom,wcnss"; + qcom,smd-channels = "WCNSS_CTRL"; + qcom,mmio = <0x7b>; + + bluetooth { + compatible = "qcom,wcnss-bt"; + }; + + wifi { + compatible = "qcom,wcnss-wlan"; + interrupts = <0x00 0x91 0x04 0x00 0x92 0x04>; + interrupt-names = "tx", "rx"; + qcom,smem-states = <0x38 0x0a 0x38 0x09>; + qcom,smem-state-names = "tx-enable", "tx-rings-empty"; + }; + }; + }; + }; + + interrupt-controller@b000000 { + compatible = "qcom,msm-qgic2"; + reg = <0xb000000 0x1000 0xb002000 0x1000>; + interrupt-controller; + #interrupt-cells = <0x03>; + phandle = <0x01>; + }; + + mailbox@b011000 { + compatible = "qcom,msm8916-apcs-kpss-global", "syscon"; + reg = <0xb011000 0x1000>; + #mbox-cells = <0x01>; + clocks = <0x7c 0x14 0x01>; + clock-names = "pll", "aux"; + #clock-cells = <0x00>; + phandle = <0x03>; + }; + + clock@b016000 { + compatible = "qcom,msm8916-a53pll"; + reg = <0xb016000 0x40>; + #clock-cells = <0x00>; + clocks = <0x18>; + clock-names = "xo"; + operating-points-v2 = <0x7d>; + phandle = <0x7c>; + + opp-table { + compatible = "operating-points-v2"; + phandle = <0x7d>; + + opp-998400000 { + opp-hz = <0x00 0x3b826000>; + }; + + opp-1094400000 { + opp-hz = <0x00 0x413b3800>; + }; + + opp-1190400000 { + opp-hz = <0x00 0x46f41000>; + }; + + opp-1248000000 { + opp-hz = <0x00 0x4a62f800>; + }; + + opp-1267200000 { + opp-hz = <0x00 0x4b87f000>; + }; + }; + }; + + timer@b020000 { + compatible = "arm,armv7-timer-mem"; + reg = <0xb020000 0x1000>; + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + frame@b021000 { + reg = <0xb021000 0x1000 0xb022000 0x1000>; + interrupts = <0x00 0x08 0x04 0x00 0x07 0x04>; + frame-number = <0x00>; + }; + + frame@b023000 { + reg = <0xb023000 0x1000>; + interrupts = <0x00 0x09 0x04>; + frame-number = <0x01>; + status = "disabled"; + }; + + frame@b024000 { + reg = <0xb024000 0x1000>; + interrupts = <0x00 0x0a 0x04>; + frame-number = <0x02>; + status = "disabled"; + }; + + frame@b025000 { + reg = <0xb025000 0x1000>; + interrupts = <0x00 0x0b 0x04>; + frame-number = <0x03>; + status = "disabled"; + }; + + frame@b026000 { + reg = <0xb026000 0x1000>; + interrupts = <0x00 0x0c 0x04>; + frame-number = <0x04>; + status = "disabled"; + }; + + frame@b027000 { + reg = <0xb027000 0x1000>; + interrupts = <0x00 0x0d 0x04>; + frame-number = <0x05>; + status = "disabled"; + }; + + frame@b028000 { + reg = <0xb028000 0x1000>; + interrupts = <0x00 0x0e 0x04>; + frame-number = <0x06>; + status = "disabled"; + }; + }; + + power-manager@b088000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb088000 0x1000>; + phandle = <0x07>; + }; + + power-manager@b089000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb089000 0x1000>; + phandle = <0x08>; + }; + + power-manager@b098000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb098000 0x1000>; + phandle = <0x09>; + }; + + power-manager@b099000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb099000 0x1000>; + phandle = <0x0a>; + }; + + power-manager@b0a8000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb0a8000 0x1000>; + phandle = <0x0b>; + }; + + power-manager@b0a9000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb0a9000 0x1000>; + phandle = <0x0c>; + }; + + power-manager@b0b8000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb0b8000 0x1000>; + phandle = <0x0d>; + }; + + power-manager@b0b9000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb0b9000 0x1000>; + phandle = <0x0e>; + }; + }; + + thermal-zones { + + cpu0-2-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x03>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "passive"; + phandle = <0x7f>; + }; + + cpu_crit { + temperature = <0x186a0>; + hysteresis = <0x7d0>; + type = "critical"; + }; + }; + + cooling-maps { + + map0 { + trip = <0x7f>; + cooling-device = <0x80 0xffffffff 0xffffffff 0x81 0xffffffff 0xffffffff 0x82 0xffffffff 0xffffffff 0x83 0xffffffff 0xffffffff>; + }; + }; + }; + + cpu1-3-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x04>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "passive"; + phandle = <0x84>; + }; + + cpu_crit { + temperature = <0x186a0>; + hysteresis = <0x7d0>; + type = "critical"; + }; + }; + + cooling-maps { + + map0 { + trip = <0x84>; + cooling-device = <0x80 0xffffffff 0xffffffff 0x81 0xffffffff 0xffffffff 0x82 0xffffffff 0xffffffff 0x83 0xffffffff 0xffffffff>; + }; + }; + }; + + gpu-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x02>; + + trips { + + trip-point0 { + temperature = <0x15f90>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + + camera-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x01>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + + modem-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x00>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + }; + + timer { + compatible = "arm,armv7-timer"; + interrupts = <0x01 0x02 0xf08 0x01 0x03 0xf08 0x01 0x04 0xf08 0x01 0x01 0xf08>; + }; + + backlight { + compatible = "pwm-backlight"; + pwms = <0x85 0x00 0x186a0>; + brightness-levels = <0x00 0x04 0x08 0x10 0x20 0x40 0x80 0xff>; + num-interpolated-steps = <0x02>; + default-brightness-level = <0x0a>; + phandle = <0x6b>; + }; + + battery { + compatible = "simple-battery"; + voltage-min-design-microvolt = <0x33e140>; + voltage-max-design-microvolt = <0x432380>; + energy-full-design-microwatt-hours = <0x594390>; + charge-full-design-microamp-hours = <0x16e360>; + ocv-capacity-celsius = <0x19>; + ocv-capacity-table-0 = <0x42d560 0x64 0x417da0 0x5f 0x409b10 0x5a 0x3fef30 0x55 0x3f7230 0x50 0x3ef148 0x4b 0x3e6890 0x46 0x3da540 0x41 0x3cda20 0x3c 0x3c45b0 0x37 0x3be408 0x32 0x3b3440 0x2d 0x3a9800 0x28 0x39fbc0 0x23 0x39bd40 0x1e 0x396368 0x19 0x391d18 0x14 0x38cb10 0x10 0x387cf0 0x0d 0x384e10 0x0b 0x384640 0x0a 0x384258 0x09 0x383a88 0x08 0x3832b8 0x07 0x381b48 0x06 0x37c940 0x05 0x371d60 0x04 0x363ad0 0x03 0x34d370 0x02 0x32b090 0x01 0x2dc6c0 0x00>; + phandle = <0x29>; + }; + + gpio-keys { + compatible = "gpio-keys"; + pinctrl-0 = <0x86 0x87>; + pinctrl-names = "default"; + + key-up { + wakeup-source; + gpios = <0x27 0x5a 0x01>; + linux,code = <0x67>; + debounce-interval = <0x0f>; + linux,can-disable; + }; + + key-back { + wakeup-source; + gpios = <0x27 0x62 0x01>; + linux,code = <0x0e>; + debounce-interval = <0x0f>; + linux,can-disable; + }; + + switch-lid-close { + wakeup-source; + gpios = <0x27 0x5c 0x01>; + linux,input-type = <0x05>; + linux,code = <0x00>; + }; + + switch-lid-open { + gpios = <0x27 0x24 0x01>; + linux,input-type = <0x05>; + linux,code = <0x0a>; + }; + }; + + keypad { + compatible = "gpio-matrix-keypad"; + col-scan-delay-ms = <0x07>; + debounce-delay-ms = <0x0a>; + gpio-activelow; + pinctrl-0 = <0x88 0x89>; + pinctrl-names = "default"; + row-gpios = <0x27 0x61 0x01 0x27 0x60 0x01 0x27 0x5f 0x01 0x27 0x5e 0x01>; + col-gpios = <0x27 0x34 0x01 0x27 0x38 0x01 0x27 0x07 0x01 0x27 0x63 0x01 0x27 0x06 0x01>; + linux,keymap = <0x1bd 0x10002 0x20005 0x30008 0x4020a 0x1000069 0x1010003 0x1020006 0x1030009 0x104000b 0x20002b8 0x2010004 0x2020007 0x203000a 0x204020b 0x300001c 0x301006a 0x30202b9>; + }; + + leds { + compatible = "gpio-leds"; + pinctrl-0 = <0x8a>; + pinctrl-names = "default"; + + led-0 { + function = "kbd_backlight"; + color = <0x00>; + gpios = <0x2c 0x01 0x00>; + }; + }; +}; diff --git a/devices/nokia-sparkler/00-nokia-leo-display.files b/devices/nokia-sparkler/00-nokia-leo-display.files new file mode 100644 index 0000000..e69c096 --- /dev/null +++ b/devices/nokia-sparkler/00-nokia-leo-display.files @@ -0,0 +1 @@ +/lib/firmware/nokia,leo-gc9305-hlt-24-panel.bin diff --git a/devices/nokia-sparkler/00-nokia-sparkler-display.files b/devices/nokia-sparkler/00-nokia-sparkler-display.files new file mode 100644 index 0000000..d0bd734 --- /dev/null +++ b/devices/nokia-sparkler/00-nokia-sparkler-display.files @@ -0,0 +1 @@ +/lib/firmware/nokia,sparkler-gc9307-hlt-28-panel.bin diff --git a/devices/nokia-sparkler/APKBUILD b/devices/nokia-sparkler/APKBUILD new file mode 100644 index 0000000..6fb2dbb --- /dev/null +++ b/devices/nokia-sparkler/APKBUILD @@ -0,0 +1,62 @@ +# Reference: +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 +" diff --git a/devices/nokia-sparkler/APKBUILD.nokia-leo b/devices/nokia-sparkler/APKBUILD.nokia-leo new file mode 100644 index 0000000..124d9de --- /dev/null +++ b/devices/nokia-sparkler/APKBUILD.nokia-leo @@ -0,0 +1,62 @@ +# Reference: +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 +" diff --git a/devices/nokia-sparkler/deviceinfo b/devices/nokia-sparkler/deviceinfo new file mode 100644 index 0000000..ee48fb4 --- /dev/null +++ b/devices/nokia-sparkler/deviceinfo @@ -0,0 +1,35 @@ +# Reference: +# 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" diff --git a/devices/nokia-sparkler/deviceinfo.nokia-leo b/devices/nokia-sparkler/deviceinfo.nokia-leo new file mode 100644 index 0000000..c2c350a --- /dev/null +++ b/devices/nokia-sparkler/deviceinfo.nokia-leo @@ -0,0 +1,35 @@ +# Reference: +# 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" diff --git a/devices/nokia-sparkler/kernel-cmdline.conf b/devices/nokia-sparkler/kernel-cmdline.conf new file mode 100644 index 0000000..2235027 --- /dev/null +++ b/devices/nokia-sparkler/kernel-cmdline.conf @@ -0,0 +1,2 @@ +earlycon +console=ttyMSM0,115200 diff --git a/devices/nokia-sparkler/modules-initfs b/devices/nokia-sparkler/modules-initfs new file mode 100644 index 0000000..ee51527 --- /dev/null +++ b/devices/nokia-sparkler/modules-initfs @@ -0,0 +1,3 @@ +pm8916-lbc +pm8916-bms-vm +panel-mipi-dbi diff --git a/devices/nokia-sparkler/nokia,leo-gc9305-hlt-24-panel.bin b/devices/nokia-sparkler/nokia,leo-gc9305-hlt-24-panel.bin new file mode 100644 index 0000000..2bde61e Binary files /dev/null and b/devices/nokia-sparkler/nokia,leo-gc9305-hlt-24-panel.bin differ diff --git a/devices/nokia-sparkler/nokia,leo-gc9305-hlt-24-panel.txt b/devices/nokia-sparkler/nokia,leo-gc9305-hlt-24-panel.txt new file mode 100644 index 0000000..5b56224 --- /dev/null +++ b/devices/nokia-sparkler/nokia,leo-gc9305-hlt-24-panel.txt @@ -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 diff --git a/devices/nokia-sparkler/nokia,sparkler-gc9307-hlt-28-panel.bin b/devices/nokia-sparkler/nokia,sparkler-gc9307-hlt-28-panel.bin new file mode 100644 index 0000000..1bea9d3 Binary files /dev/null and b/devices/nokia-sparkler/nokia,sparkler-gc9307-hlt-28-panel.bin differ diff --git a/devices/nokia-sparkler/nokia,sparkler-gc9307-hlt-28-panel.txt b/devices/nokia-sparkler/nokia,sparkler-gc9307-hlt-28-panel.txt new file mode 100644 index 0000000..6c660e7 --- /dev/null +++ b/devices/nokia-sparkler/nokia,sparkler-gc9307-hlt-28-panel.txt @@ -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 diff --git a/devices/nokia-sparkler/qcom-msm8909-nokia-leo.dtb b/devices/nokia-sparkler/qcom-msm8909-nokia-leo.dtb new file mode 100644 index 0000000..757a605 Binary files /dev/null and b/devices/nokia-sparkler/qcom-msm8909-nokia-leo.dtb differ diff --git a/devices/nokia-sparkler/qcom-msm8909-nokia-leo.dts b/devices/nokia-sparkler/qcom-msm8909-nokia-leo.dts new file mode 100644 index 0000000..b8b5d48 --- /dev/null +++ b/devices/nokia-sparkler/qcom-msm8909-nokia-leo.dts @@ -0,0 +1,1945 @@ +/dts-v1/; + +/ { + #address-cells = <0x01>; + #size-cells = <0x01>; + interrupt-parent = <0x01>; + model = "Nokia 6300 4G"; + compatible = "nokia,leo", "qcom,msm8909"; + chassis-type = "handset"; + + aliases { + mmc0 = "/soc@0/sdhci@7824000"; + mmc1 = "/soc@0/sdhci@7864000"; + serial0 = "/soc@0/serial@78af000"; + }; + + chosen { + stdout-path = "serial0"; + }; + + clocks { + + xo-board { + compatible = "fixed-clock"; + #clock-cells = <0x00>; + clock-frequency = <0x124f800>; + phandle = <0x18>; + }; + + sleep-clk { + compatible = "fixed-clock"; + #clock-cells = <0x00>; + clock-frequency = <0x8000>; + phandle = <0x28>; + }; + }; + + cpus { + #address-cells = <0x01>; + #size-cells = <0x00>; + + cpu@0 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x00>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x07>; + qcom,saw = <0x08>; + phandle = <0x75>; + }; + + cpu@1 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x01>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x09>; + qcom,saw = <0x0a>; + phandle = <0x76>; + }; + + cpu@2 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x02>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x0b>; + qcom,saw = <0x0c>; + phandle = <0x77>; + }; + + cpu@3 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x03>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x0d>; + qcom,saw = <0x0e>; + phandle = <0x78>; + }; + + l2-cache { + compatible = "cache"; + cache-level = <0x02>; + phandle = <0x02>; + }; + + idle-states { + + cpu-sleep-0 { + compatible = "qcom,idle-state-spc"; + idle-state-name = "standalone-power-collapse"; + entry-latency-us = <0xb4>; + exit-latency-us = <0xf0>; + min-residency-us = <0x4ec>; + local-timer-stop; + phandle = <0x06>; + }; + }; + }; + + cpu-opp-table { + compatible = "operating-points-v2-kryo-cpu", "operating-points-v2"; + nvmem-cells = <0x0f>; + opp-shared; + phandle = <0x05>; + + opp-199999951 { + opp-hz = <0x00 0xbebc1cf>; + required-opps = <0x10>; + opp-supported-hw = <0xff>; + }; + + opp-399999902 { + opp-hz = <0x00 0x17d7839e>; + required-opps = <0x11>; + opp-supported-hw = <0xff>; + }; + + opp-533333202 { + opp-hz = <0x00 0x1fca04d2>; + required-opps = <0x11>; + opp-supported-hw = <0xff>; + }; + + opp-799999804 { + opp-hz = <0x00 0x2faf073c>; + required-opps = <0x12>; + opp-supported-hw = <0xff>; + }; + + opp-998400000 { + opp-hz = <0x00 0x3b826000>; + required-opps = <0x12>; + opp-supported-hw = <0x05>; + }; + + opp-1094400000 { + opp-hz = <0x00 0x413b3800>; + required-opps = <0x13>; + opp-supported-hw = <0x05>; + }; + + opp-1248000000 { + opp-hz = <0x00 0x4a62f800>; + required-opps = <0x13>; + opp-supported-hw = <0x01>; + }; + + opp-1267200000 { + opp-hz = <0x00 0x4b87f000>; + required-opps = <0x13>; + opp-supported-hw = <0x01>; + }; + }; + + firmware { + + scm { + compatible = "qcom,scm-msm8916", "qcom,scm"; + clocks = <0x14 0x3d 0x14 0x3f 0x14 0x3e>; + clock-names = "core", "bus", "iface"; + qcom,dload-mode = <0x15 0x6100>; + }; + }; + + memory@80000000 { + device_type = "memory"; + reg = <0x80000000 0x00>; + }; + + pmu { + compatible = "arm,cortex-a7-pmu"; + interrupts = <0x01 0x07 0xf04>; + }; + + reserved-memory { + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + tz-apps@87a00000 { + reg = <0x87a00000 0x200000>; + no-map; + }; + + rfsa@87ce0000 { + reg = <0x87ce0000 0x20000>; + no-map; + }; + + smem@87d00000 { + compatible = "qcom,smem"; + reg = <0x87d00000 0x100000>; + no-map; + hwlocks = <0x16 0x03>; + qcom,rpm-msg-ram = <0x17>; + }; + + tz@87e00000 { + reg = <0x87e00000 0x200000>; + no-map; + }; + + mpss@88000000 { + reg = <0x88000000 0x5000000>; + no-map; + phandle = <0x32>; + }; + + mba@8dc00000 { + reg = <0x8dc00000 0x100000>; + no-map; + phandle = <0x31>; + }; + + reserved@84a00000 { + reg = <0x84a00000 0x400000>; + no-map; + }; + + wcnss@8d000000 { + reg = <0x8d000000 0x700000>; + no-map; + phandle = <0x69>; + }; + + rmtfs@9e900000 { + compatible = "qcom,rmtfs-mem"; + reg = <0x9e900000 0x300000>; + no-map; + qcom,client-id = <0x01>; + }; + }; + + smd { + compatible = "qcom,smd"; + + rpm { + interrupts = <0x00 0xa8 0x01>; + qcom,ipc = <0x03 0x08 0x00>; + qcom,smd-edge = <0x0f>; + + rpm-requests { + compatible = "qcom,rpm-msm8909"; + qcom,smd-channels = "rpm_requests"; + + clock-controller { + compatible = "qcom,rpmcc-msm8909", "qcom,rpmcc"; + #clock-cells = <0x01>; + clocks = <0x18>; + clock-names = "xo"; + phandle = <0x6d>; + }; + + power-controller { + compatible = "qcom,msm8909-rpmpd"; + #power-domain-cells = <0x01>; + operating-points-v2 = <0x19>; + phandle = <0x04>; + + opp-table { + compatible = "operating-points-v2"; + phandle = <0x19>; + + opp1 { + opp-level = <0x01>; + phandle = <0x10>; + }; + + opp2 { + opp-level = <0x02>; + }; + + opp3 { + opp-level = <0x03>; + phandle = <0x11>; + }; + + opp4 { + opp-level = <0x04>; + phandle = <0x12>; + }; + + opp5 { + opp-level = <0x05>; + }; + + opp6 { + opp-level = <0x06>; + phandle = <0x13>; + }; + }; + }; + + pm8909-regulators { + compatible = "qcom,rpm-pm8909-regulators"; + + s2 { + regulator-min-microvolt = <0x1c3a90>; + regulator-max-microvolt = <0x1c3a90>; + }; + + l1 { + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0xf4240>; + }; + + l2 { + regulator-min-microvolt = <0x124f80>; + regulator-max-microvolt = <0x124f80>; + }; + + l4 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + }; + + l5 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x3d>; + }; + + l6 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x61>; + }; + + l7 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x30>; + }; + + l8 { + regulator-min-microvolt = <0x2b7cd0>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x3c>; + }; + + l9 { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x325aa0>; + phandle = <0x6f>; + }; + + l10 { + regulator-min-microvolt = <0x12b128>; + regulator-max-microvolt = <0x13d620>; + phandle = <0x6e>; + }; + + l11 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2d0370>; + regulator-allow-set-load; + regulator-system-load = <0x30d40>; + phandle = <0x44>; + }; + + l12 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2d0370>; + phandle = <0x45>; + }; + + l13 { + regulator-min-microvolt = <0x2eebb8>; + regulator-max-microvolt = <0x2eebb8>; + phandle = <0x68>; + }; + + l14 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2dc6c0>; + }; + + l15 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2dc6c0>; + }; + + l17 { + regulator-min-microvolt = <0x2b7cd0>; + regulator-max-microvolt = <0x2b7cd0>; + phandle = <0x60>; + }; + + l18 { + regulator-min-microvolt = <0x2932e0>; + regulator-max-microvolt = <0x2932e0>; + }; + }; + }; + }; + }; + + smp2p-hexagon { + compatible = "qcom,smp2p"; + qcom,smem = <0x1b3 0x1ac>; + interrupts = <0x00 0x1b 0x01>; + qcom,ipc = <0x03 0x08 0x0e>; + qcom,local-pid = <0x00>; + qcom,remote-pid = <0x01>; + + master-kernel { + qcom,entry-name = "master-kernel"; + #qcom,smem-state-cells = <0x01>; + phandle = <0x2f>; + }; + + slave-kernel { + qcom,entry-name = "slave-kernel"; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x2e>; + }; + }; + + smp2p-wcnss { + compatible = "qcom,smp2p"; + qcom,smem = <0x1c3 0x1af>; + interrupts = <0x00 0x8f 0x01>; + qcom,ipc = <0x03 0x08 0x12>; + qcom,local-pid = <0x00>; + qcom,remote-pid = <0x04>; + + master-kernel { + qcom,entry-name = "master-kernel"; + #qcom,smem-state-cells = <0x01>; + phandle = <0x6b>; + }; + + slave-kernel { + qcom,entry-name = "slave-kernel"; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x6a>; + }; + }; + + smsm { + compatible = "qcom,smsm"; + #address-cells = <0x01>; + #size-cells = <0x00>; + qcom,ipc-1 = <0x03 0x08 0x0d>; + qcom,ipc-3 = <0x03 0x08 0x13>; + + apps@0 { + reg = <0x00>; + #qcom,smem-state-cells = <0x01>; + phandle = <0x34>; + }; + + hexagon@1 { + reg = <0x01>; + interrupts = <0x00 0x1a 0x01>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x33>; + }; + + wcnss@6 { + reg = <0x06>; + interrupts = <0x00 0x90 0x01>; + interrupt-controller; + #interrupt-cells = <0x02>; + }; + }; + + soc@0 { + compatible = "simple-bus"; + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + rng@22000 { + compatible = "qcom,prng"; + reg = <0x22000 0x200>; + clocks = <0x14 0x44>; + clock-names = "core"; + }; + + qfprom@5c000 { + compatible = "qcom,qfprom"; + reg = <0x5c000 0x1000>; + #address-cells = <0x01>; + #size-cells = <0x01>; + + speedbin@c { + reg = <0x0c 0x01>; + bits = <0x02 0x03>; + phandle = <0x0f>; + }; + + s0-p1@a0 { + reg = <0xa0 0x01>; + bits = <0x00 0x06>; + phandle = <0x1d>; + }; + + s0-p2@a0 { + reg = <0xa0 0x02>; + bits = <0x06 0x06>; + phandle = <0x1e>; + }; + + s1-p1@a1 { + reg = <0xa1 0x02>; + bits = <0x04 0x06>; + phandle = <0x1f>; + }; + + s1-p2@a2 { + reg = <0xa2 0x01>; + bits = <0x02 0x06>; + phandle = <0x20>; + }; + + s2-p1@a3 { + reg = <0xa3 0x01>; + bits = <0x00 0x06>; + phandle = <0x21>; + }; + + s2-p2@a3 { + reg = <0xa3 0x02>; + bits = <0x06 0x06>; + phandle = <0x22>; + }; + + s3-p1@a4 { + reg = <0xa4 0x02>; + bits = <0x04 0x06>; + phandle = <0x23>; + }; + + s3-p2@a5 { + reg = <0xa5 0x01>; + bits = <0x02 0x06>; + phandle = <0x24>; + }; + + s4-p1@a6 { + reg = <0xa6 0x01>; + bits = <0x00 0x06>; + phandle = <0x25>; + }; + + s4-p2@a6 { + reg = <0xa6 0x02>; + bits = <0x06 0x06>; + phandle = <0x26>; + }; + + base1@dc { + reg = <0xdc 0x01>; + bits = <0x00 0x08>; + phandle = <0x1b>; + }; + + base2@dd { + reg = <0xdd 0x01>; + bits = <0x00 0x08>; + phandle = <0x1c>; + }; + + mode@de { + reg = <0xde 0x01>; + bits = <0x00 0x03>; + phandle = <0x1a>; + }; + }; + + sram@60000 { + compatible = "qcom,rpm-msg-ram"; + reg = <0x60000 0x8000>; + phandle = <0x17>; + }; + + sram@290000 { + compatible = "qcom,rpm-stats"; + reg = <0x290000 0x10000>; + }; + + thermal-sensor@4a9000 { + compatible = "qcom,msm8909-tsens", "qcom,tsens-v0_1"; + reg = <0x4a9000 0x1000 0x4a8000 0x1000>; + nvmem-cells = <0x1a 0x1b 0x1c 0x1d 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25 0x26>; + nvmem-cell-names = "mode", "base1", "base2", "s0_p1", "s0_p2", "s1_p1", "s1_p2", "s2_p1", "s2_p2", "s3_p1", "s3_p2", "s4_p1", "s4_p2"; + interrupts = <0x00 0xb8 0x04>; + interrupt-names = "uplow"; + #thermal-sensor-cells = <0x01>; + #qcom,sensors = <0x05>; + phandle = <0x73>; + }; + + restart@4ab000 { + compatible = "qcom,pshold"; + reg = <0x4ab000 0x04>; + }; + + pinctrl@1000000 { + compatible = "qcom,msm8909-tlmm"; + reg = <0x1000000 0x300000>; + interrupts = <0x00 0xd0 0x04>; + gpio-controller; + #gpio-cells = <0x02>; + gpio-ranges = <0x27 0x00 0x00 0x75>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x27>; + + blsp-i2c1-default-state { + pins = "gpio6", "gpio7"; + function = "blsp_i2c1"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x4b>; + }; + + blsp-i2c1-sleep-state { + pins = "gpio6", "gpio7"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x4c>; + }; + + blsp-i2c2-default-state { + pins = "gpio111", "gpio112"; + function = "blsp_i2c2"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x4f>; + }; + + blsp-i2c2-sleep-state { + pins = "gpio111", "gpio112"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x50>; + }; + + blsp-i2c3-default-state { + pins = "gpio29", "gpio30"; + function = "blsp_i2c3"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x53>; + }; + + blsp-i2c3-sleep-state { + pins = "gpio29", "gpio30"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x54>; + }; + + blsp-i2c4-default-state { + pins = "gpio14", "gpio15"; + function = "blsp_i2c4"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x57>; + }; + + blsp-i2c4-sleep-state { + pins = "gpio14", "gpio15"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x58>; + }; + + blsp-i2c5-default-state { + pins = "gpio18", "gpio19"; + function = "blsp_i2c5"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5b>; + }; + + blsp-i2c5-sleep-state { + pins = "gpio18", "gpio19"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5c>; + }; + + blsp-i2c6-default-state { + pins = "gpio10", "gpio11"; + function = "blsp_i2c6"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x63>; + }; + + blsp-i2c6-sleep-state { + pins = "gpio10", "gpio11"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x64>; + }; + + blsp-spi1-default-state { + pins = "gpio4", "gpio5", "gpio6", "gpio7"; + function = "blsp_spi1"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x4d>; + }; + + blsp-spi1-sleep-state { + pins = "gpio4", "gpio5", "gpio6", "gpio7"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x4e>; + }; + + blsp-spi2-default-state { + pins = "gpio20", "gpio21", "gpio111", "gpio112"; + function = "blsp_spi2"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x51>; + }; + + blsp-spi2-sleep-state { + pins = "gpio20", "gpio21", "gpio111", "gpio112"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x52>; + }; + + blsp-spi3-default-state { + pins = "gpio0", "gpio1", "gpio2", "gpio3"; + function = "blsp_spi3"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x55>; + }; + + blsp-spi3-sleep-state { + pins = "gpio0", "gpio1", "gpio2", "gpio3"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x56>; + }; + + blsp-spi4-default-state { + pins = "gpio12", "gpio13", "gpio14", "gpio15"; + function = "blsp_spi4"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x59>; + }; + + blsp-spi4-sleep-state { + pins = "gpio12", "gpio13", "gpio14", "gpio15"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x5a>; + }; + + blsp-spi5-default-state { + pins = "gpio16", "gpio17", "gpio18", "gpio19"; + function = "blsp_spi5"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x5d>; + }; + + blsp-spi5-sleep-state { + pins = "gpio16", "gpio17", "gpio18", "gpio19"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x5e>; + }; + + blsp-spi6-default-state { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "blsp_spi6"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x65>; + }; + + blsp-spi6-sleep-state { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x66>; + }; + + blsp-uart1-default-state { + pins = "gpio4", "gpio5"; + function = "blsp_uart1"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x47>; + }; + + blsp-uart1-sleep-state { + pins = "gpio4", "gpio5"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x48>; + }; + + blsp-uart2-default-state { + pins = "gpio20", "gpio21"; + function = "blsp_uart2"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x49>; + }; + + blsp-uart2-sleep-state { + pins = "gpio20", "gpio21"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x4a>; + }; + + sdc1-clk-on-state { + pins = "sdc1_clk"; + bias-disable; + drive-strength = <0x10>; + phandle = <0x36>; + }; + + sdc1-clk-off-state { + pins = "sdc1_clk"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x39>; + }; + + sdc1-cmd-on-state { + pins = "sdc1_cmd"; + bias-disable; + drive-strength = <0x0a>; + phandle = <0x37>; + }; + + sdc1-cmd-off-state { + pins = "sdc1_cmd"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x3a>; + }; + + sdc1-data-on-state { + pins = "sdc1_data"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x38>; + }; + + sdc1-data-off-state { + pins = "sdc1_data"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x3b>; + }; + + sdc2-clk-on-state { + pins = "sdc2_clk"; + drive-strength = <0x10>; + bias-disable; + phandle = <0x3e>; + }; + + sdc2-clk-off-state { + pins = "sdc2_clk"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x41>; + }; + + sdc2-cmd-on-state { + pins = "sdc2_cmd"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x3f>; + }; + + sdc2-cmd-off-state { + pins = "sdc2_cmd"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x42>; + }; + + sdc2-data-on-state { + pins = "sdc2_data"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x40>; + }; + + sdc2-data-off-state { + pins = "sdc2_data"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x43>; + }; + + wcnss-active-state { + pins = "gpio40", "gpio41", "gpio42", "gpio43", "gpio44"; + function = "wcss_wlan"; + drive-strength = <0x06>; + bias-pull-up; + phandle = <0x6c>; + }; + + gpio-key-active-state { + pins = "gpio90"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-up; + phandle = <0x7b>; + }; + + matrix-keypad-row-default-state { + pins = "gpio94", "gpio95", "gpio96", "gpio97"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-up; + phandle = <0x7c>; + }; + + matrix-keypad-col-default-state { + pins = "gpio0", "gpio3", "gpio7", "gpio99", "gpio6", "gpio1"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x7d>; + }; + + panel-gpios-default-state { + pins = "gpio24", "gpio25", "gpio110"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x62>; + }; + }; + + clock-controller@1800000 { + compatible = "qcom,gcc-msm8909"; + reg = <0x1800000 0x80000>; + #clock-cells = <0x01>; + #reset-cells = <0x01>; + #power-domain-cells = <0x01>; + clocks = <0x18 0x28 0x00 0x00>; + clock-names = "xo", "sleep_clk", "dsi0pll", "dsi0pllbyte"; + phandle = <0x14>; + }; + + hwlock@1905000 { + compatible = "qcom,tcsr-mutex"; + reg = <0x1905000 0x20000>; + #hwlock-cells = <0x01>; + phandle = <0x16>; + }; + + syscon@1937000 { + compatible = "qcom,tcsr-msm8909", "syscon"; + reg = <0x1937000 0x30000>; + phandle = <0x15>; + }; + + spmi@200f000 { + compatible = "qcom,spmi-pmic-arb"; + reg = <0x200f000 0x1000 0x2400000 0x400000 0x2c00000 0x400000 0x3800000 0x200000 0x200a000 0x2100>; + reg-names = "core", "chnls", "obsrvr", "intr", "cnfg"; + interrupt-names = "periph_irq"; + interrupts = <0x00 0xbe 0x04>; + qcom,ee = <0x00>; + qcom,channel = <0x00>; + #address-cells = <0x02>; + #size-cells = <0x00>; + interrupt-controller; + #interrupt-cells = <0x04>; + + pmic@0 { + compatible = "qcom,pm8909", "qcom,spmi-pmic"; + reg = <0x00 0x00>; + #address-cells = <0x01>; + #size-cells = <0x00>; + + pon@800 { + compatible = "qcom,pm8916-pon"; + reg = <0x800>; + mode-bootloader = <0x02>; + mode-recovery = <0x01>; + + pwrkey { + compatible = "qcom,pm8941-pwrkey"; + interrupts = <0x00 0x08 0x00 0x03>; + debounce = <0x3d09>; + bias-pull-up; + linux,code = <0x74>; + }; + + resin { + compatible = "qcom,pm8941-resin"; + interrupts = <0x00 0x08 0x01 0x03>; + debounce = <0x3d09>; + bias-pull-up; + status = "okay"; + linux,code = <0x20b>; + }; + + watchdog { + compatible = "qcom,pm8916-wdt"; + interrupts = <0x00 0x08 0x06 0x01>; + timeout-sec = <0x3c>; + }; + }; + + charger@1000 { + compatible = "qcom,pm8916-lbc"; + reg = <0x1000 0x1200 0x1300 0x1600>; + reg-names = "chgr", "bat_if", "usb", "misc"; + interrupts = <0x00 0x10 0x00 0x03 0x00 0x10 0x05 0x03 0x00 0x10 0x06 0x03 0x00 0x10 0x07 0x03 0x00 0x12 0x00 0x03 0x00 0x12 0x01 0x03 0x00 0x13 0x00 0x03 0x00 0x13 0x01 0x03 0x00 0x13 0x02 0x03 0x00 0x13 0x04 0x03>; + interrupt-names = "vbat_det", "fast_chg", "chg_fail", "chg_done", "bat_pres", "temp_ok", "coarse_det", "usb_vbus", "chg_gone", "overtemp"; + status = "okay"; + qcom,fast-charge-safe-current = <0x41eb0>; + qcom,fast-charge-safe-voltage = <0x3f52f0>; + monitored-battery = <0x29>; + phandle = <0x2a>; + }; + + extcon@1300 { + compatible = "qcom,pm8941-misc"; + reg = <0x1300>; + interrupts = <0x00 0x13 0x01 0x03>; + interrupt-names = "usb_vbus"; + status = "disabled"; + }; + + vm-bms@4000 { + compatible = "qcom,pm8916-bms-vm"; + reg = <0x4000>; + interrupts = <0x00 0x40 0x00 0x01 0x00 0x40 0x01 0x01 0x00 0x40 0x02 0x01 0x00 0x40 0x03 0x01 0x00 0x40 0x04 0x01 0x00 0x40 0x05 0x01>; + interrupt-names = "cv_leave", "cv_enter", "ocv_good", "ocv_thr", "fifo", "state_chg"; + status = "okay"; + monitored-battery = <0x29>; + power-supplies = <0x2a>; + }; + + rtc@6000 { + compatible = "qcom,pm8941-rtc"; + reg = <0x6000>; + interrupts = <0x00 0x61 0x01 0x01>; + }; + + mpps@a000 { + compatible = "qcom,pm8916-mpp", "qcom,spmi-mpp"; + reg = <0xa000>; + gpio-controller; + #gpio-cells = <0x02>; + gpio-ranges = <0x2b 0x00 0x00 0x04>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x2b>; + + mpp2-state { + pins = "mpp2"; + function = "digital"; + power-source = <0x00>; + output-low; + qcom,dtest = <0x01>; + phandle = <0x2d>; + }; + }; + + gpios@c000 { + compatible = "qcom,pm8916-gpio", "qcom,spmi-gpio"; + reg = <0xc000>; + gpio-controller; + gpio-ranges = <0x2c 0x00 0x00 0x04>; + #gpio-cells = <0x02>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x2c>; + + keypad-backlight-default-state { + pins = "gpio1"; + function = "normal"; + power-source = <0x02>; + output-low; + phandle = <0x7e>; + }; + }; + }; + + pmic@1 { + compatible = "qcom,pm8909", "qcom,spmi-pmic"; + reg = <0x01 0x00>; + #address-cells = <0x01>; + #size-cells = <0x00>; + + pwm { + compatible = "qcom,pm8916-pwm"; + #pwm-cells = <0x02>; + status = "okay"; + pinctrl-0 = <0x2d>; + pinctrl-names = "default"; + phandle = <0x7a>; + }; + + vibrator@c000 { + compatible = "qcom,pm8916-vib"; + reg = <0xc000>; + status = "disabled"; + }; + }; + }; + + dma-controller@4044000 { + compatible = "qcom,bam-v1.7.0"; + reg = <0x4044000 0x19000>; + interrupts = <0x00 0x1d 0x04>; + #dma-cells = <0x01>; + qcom,ee = <0x00>; + num-channels = <0x06>; + qcom,num-ees = <0x01>; + qcom,powered-remotely; + phandle = <0x35>; + }; + + remoteproc@4080000 { + compatible = "qcom,msm8909-mss-pil"; + reg = <0x4080000 0x100 0x4020000 0x40>; + reg-names = "qdsp6", "rmb"; + interrupts-extended = <0x01 0x00 0x18 0x01 0x2e 0x00 0x01 0x2e 0x01 0x01 0x2e 0x02 0x01 0x2e 0x03 0x01>; + interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack"; + power-domains = <0x04 0x00 0x04 0x04>; + power-domain-names = "cx", "mx"; + clocks = <0x14 0x79 0x14 0x7a 0x14 0x3c 0x18>; + clock-names = "iface", "bus", "mem", "xo"; + qcom,smem-states = <0x2f 0x00>; + qcom,smem-state-names = "stop"; + resets = <0x14 0x29>; + reset-names = "mss_restart"; + qcom,halt-regs = <0x15 0x18000 0x19000 0x1a000>; + status = "okay"; + pll-supply = <0x30>; + + mba { + memory-region = <0x31>; + }; + + mpss { + memory-region = <0x32>; + }; + + bam-dmux { + compatible = "qcom,bam-dmux"; + interrupt-parent = <0x33>; + interrupts = <0x01 0x03 0x0b 0x03>; + interrupt-names = "pc", "pc-ack"; + qcom,smem-states = <0x34 0x01 0x34 0x0b>; + qcom,smem-state-names = "pc", "pc-ack"; + dmas = <0x35 0x04 0x35 0x05>; + dma-names = "tx", "rx"; + }; + + smd-edge { + interrupts = <0x00 0x19 0x01>; + qcom,smd-edge = <0x00>; + qcom,ipc = <0x03 0x08 0x0c>; + qcom,remote-pid = <0x01>; + label = "hexagon"; + }; + }; + + sdhci@7824000 { + compatible = "qcom,msm8916-sdhci", "qcom,sdhci-msm-v4"; + reg = <0x7824900 0x11c 0x7824000 0x800>; + reg-names = "hc_mem", "core_mem"; + interrupts = <0x00 0x7b 0x04 0x00 0x8a 0x04>; + interrupt-names = "hc_irq", "pwr_irq"; + clocks = <0x14 0x80 0x14 0x7f 0x18>; + clock-names = "core", "iface", "xo"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x36 0x37 0x38>; + pinctrl-1 = <0x39 0x3a 0x3b>; + mmc-hs200-1_8v; + mmc-ddr-1_8v; + bus-width = <0x08>; + non-removable; + status = "okay"; + vmmc-supply = <0x3c>; + vqmmc-supply = <0x3d>; + }; + + sdhci@7864000 { + compatible = "qcom,msm8916-sdhci", "qcom,sdhci-msm-v4"; + reg = <0x7864900 0x11c 0x7864000 0x800>; + reg-names = "hc_mem", "core_mem"; + interrupts = <0x00 0x7d 0x04 0x00 0xdd 0x04>; + interrupt-names = "hc_irq", "pwr_irq"; + clocks = <0x14 0x82 0x14 0x81 0x18>; + clock-names = "core", "iface", "xo"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x3e 0x3f 0x40>; + pinctrl-1 = <0x41 0x42 0x43>; + bus-width = <0x04>; + status = "okay"; + vmmc-supply = <0x44>; + vqmmc-supply = <0x45>; + non-removable; + }; + + dma-controller@7884000 { + compatible = "qcom,bam-v1.7.0"; + reg = <0x7884000 0x23000>; + interrupts = <0x00 0xee 0x04>; + clocks = <0x14 0x3a>; + clock-names = "bam_clk"; + #dma-cells = <0x01>; + qcom,ee = <0x00>; + qcom,controlled-remotely; + phandle = <0x46>; + }; + + serial@78af000 { + compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; + reg = <0x78af000 0x200>; + interrupts = <0x00 0x6b 0x04>; + clocks = <0x14 0x56 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x00 0x46 0x01>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x47>; + pinctrl-1 = <0x48>; + status = "okay"; + }; + + serial@78b0000 { + compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; + reg = <0x78b0000 0x200>; + interrupts = <0x00 0x6c 0x04>; + clocks = <0x14 0x57 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x02 0x46 0x03>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x49>; + pinctrl-1 = <0x4a>; + status = "disabled"; + }; + + i2c@78b5000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b5000 0x500>; + interrupts = <0x00 0x5f 0x04>; + clocks = <0x14 0x4a 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x04 0x46 0x05>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4b>; + pinctrl-1 = <0x4c>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b5000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b5000 0x500>; + interrupts = <0x00 0x5f 0x04>; + clocks = <0x14 0x4b 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x04 0x46 0x05>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4d>; + pinctrl-1 = <0x4e>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b6000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b6000 0x500>; + interrupts = <0x00 0x60 0x04>; + clocks = <0x14 0x4c 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x06 0x46 0x07>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4f>; + pinctrl-1 = <0x50>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b6000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b6000 0x500>; + interrupts = <0x00 0x60 0x04>; + clocks = <0x14 0x4d 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x06 0x46 0x07>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x51>; + pinctrl-1 = <0x52>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b7000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b7000 0x500>; + interrupts = <0x00 0x61 0x04>; + clocks = <0x14 0x4e 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x08 0x46 0x09>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x53>; + pinctrl-1 = <0x54>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b7000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b7000 0x500>; + interrupts = <0x00 0x61 0x04>; + clocks = <0x14 0x4f 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x08 0x46 0x09>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x55>; + pinctrl-1 = <0x56>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b8000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b8000 0x500>; + interrupts = <0x00 0x62 0x04>; + clocks = <0x14 0x50 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x0a 0x46 0x0b>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x57>; + pinctrl-1 = <0x58>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b8000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b8000 0x500>; + interrupts = <0x00 0x62 0x04>; + clocks = <0x14 0x51 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x0a 0x46 0x0b>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x59>; + pinctrl-1 = <0x5a>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b9000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b9000 0x500>; + interrupts = <0x00 0x63 0x04>; + clocks = <0x14 0x52 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x0c 0x46 0x0d>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5b>; + pinctrl-1 = <0x5c>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b9000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b9000 0x500>; + interrupts = <0x00 0x63 0x04>; + clocks = <0x14 0x53 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x0c 0x46 0x0d>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5d>; + pinctrl-1 = <0x5e>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "okay"; + + display@0 { + compatible = "nokia,leo-gc9305-hlt-24-panel", "panel-mipi-dbi-spi"; + reg = <0x00>; + backlight = <0x5f>; + reset-gpios = <0x27 0x19 0x00>; + dc-gpios = <0x27 0x6e 0x00>; + spi-max-frequency = <0x2faf080>; + power-supply = <0x60>; + io-supply = <0x61>; + pinctrl-0 = <0x62>; + pinctrl-names = "default"; + status = "okay"; + width-mm = <0x24>; + height-mm = <0x30>; + + panel-timing { + hactive = <0xf0>; + vactive = <0x140>; + hback-porch = <0x00>; + vback-porch = <0x00>; + hfront-porch = <0x00>; + vfront-porch = <0x00>; + hsync-len = <0x00>; + vsync-len = <0x00>; + clock-frequency = "", "#("; + }; + }; + }; + + i2c@78ba000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78ba000 0x500>; + interrupts = <0x00 0x64 0x04>; + clocks = <0x14 0x54 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x0e 0x46 0x0f>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x63>; + pinctrl-1 = <0x64>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78ba000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78ba000 0x500>; + interrupts = <0x00 0x64 0x04>; + clocks = <0x14 0x55 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x0e 0x46 0x0f>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x65>; + pinctrl-1 = <0x66>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + usb@78d9000 { + compatible = "qcom,ci-hdrc"; + reg = <0x78d9000 0x200 0x78d9200 0x200>; + interrupts = <0x00 0x86 0x04 0x00 0x8c 0x04>; + clocks = <0x14 0x8d 0x14 0x8f>; + clock-names = "iface", "core"; + assigned-clocks = <0x14 0x8f>; + assigned-clock-rates = <0x4c4b400>; + resets = <0x14 0x27>; + reset-names = "core"; + phy_type = "ulpi"; + dr_mode = "otg"; + hnp-disable; + srp-disable; + adp-disable; + ahb-burst-config = <0x00>; + phy-names = "usb-phy"; + phys = <0x67>; + status = "okay"; + #reset-cells = <0x01>; + extcon = <0x2a>; + + ulpi { + + phy { + compatible = "qcom,usb-hs-phy-msm8909", "qcom,usb-hs-phy"; + #phy-cells = <0x00>; + clocks = <0x18 0x14 0x8c>; + clock-names = "ref", "sleep"; + resets = <0x14 0x21 0x14 0x26>; + reset-names = "phy", "por"; + qcom,init-seq = [00 73]; + v1p8-supply = <0x30>; + v3p3-supply = <0x68>; + extcon = <0x2a>; + phandle = <0x67>; + }; + }; + }; + + remoteproc@a21b000 { + compatible = "qcom,pronto-v3-pil", "qcom,pronto"; + reg = <0xa204000 0x2000 0xa202000 0x1000 0xa21b000 0x3000>; + reg-names = "ccu", "dxe", "pmu"; + memory-region = <0x69>; + interrupts-extended = <0x01 0x00 0x95 0x01 0x6a 0x00 0x01 0x6a 0x01 0x01 0x6a 0x02 0x01 0x6a 0x03 0x01>; + interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack"; + power-domains = <0x04 0x00 0x04 0x03>; + power-domain-names = "cx", "mx"; + qcom,smem-states = <0x6b 0x00>; + qcom,smem-state-names = "stop"; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + status = "okay"; + vddpx-supply = <0x30>; + phandle = <0x70>; + + iris { + clocks = <0x6d 0x10>; + clock-names = "xo"; + vddxo-supply = <0x30>; + vddrfa-supply = <0x6e>; + vddpa-supply = <0x6f>; + vdddig-supply = <0x3d>; + compatible = "qcom,wcn3620"; + }; + + smd-edge { + interrupts = <0x00 0x8e 0x01>; + qcom,ipc = <0x03 0x08 0x11>; + qcom,smd-edge = <0x06>; + qcom,remote-pid = <0x04>; + label = "pronto"; + + wcnss { + compatible = "qcom,wcnss"; + qcom,smd-channels = "WCNSS_CTRL"; + qcom,mmio = <0x70>; + + bluetooth { + compatible = "qcom,wcnss-bt"; + }; + + wifi { + compatible = "qcom,wcnss-wlan"; + interrupts = <0x00 0x91 0x04 0x00 0x92 0x04>; + interrupt-names = "tx", "rx"; + qcom,smem-states = <0x34 0x0a 0x34 0x09>; + qcom,smem-state-names = "tx-enable", "tx-rings-empty"; + }; + }; + }; + }; + + interrupt-controller@b000000 { + compatible = "qcom,msm-qgic2"; + reg = <0xb000000 0x1000 0xb002000 0x1000>; + interrupt-controller; + #interrupt-cells = <0x03>; + phandle = <0x01>; + }; + + mailbox@b011000 { + compatible = "qcom,msm8916-apcs-kpss-global", "syscon"; + reg = <0xb011000 0x1000>; + #mbox-cells = <0x01>; + clocks = <0x71 0x14 0x01>; + clock-names = "pll", "aux"; + #clock-cells = <0x00>; + phandle = <0x03>; + }; + + clock@b016000 { + compatible = "qcom,msm8916-a53pll"; + reg = <0xb016000 0x40>; + #clock-cells = <0x00>; + clocks = <0x18>; + clock-names = "xo"; + operating-points-v2 = <0x72>; + phandle = <0x71>; + + opp-table { + compatible = "operating-points-v2"; + phandle = <0x72>; + + opp-998400000 { + opp-hz = <0x00 0x3b826000>; + }; + + opp-1094400000 { + opp-hz = <0x00 0x413b3800>; + }; + + opp-1190400000 { + opp-hz = <0x00 0x46f41000>; + }; + + opp-1248000000 { + opp-hz = <0x00 0x4a62f800>; + }; + + opp-1267200000 { + opp-hz = <0x00 0x4b87f000>; + }; + }; + }; + + timer@b020000 { + compatible = "arm,armv7-timer-mem"; + reg = <0xb020000 0x1000>; + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + frame@b021000 { + reg = <0xb021000 0x1000 0xb022000 0x1000>; + interrupts = <0x00 0x08 0x04 0x00 0x07 0x04>; + frame-number = <0x00>; + }; + + frame@b023000 { + reg = <0xb023000 0x1000>; + interrupts = <0x00 0x09 0x04>; + frame-number = <0x01>; + status = "disabled"; + }; + + frame@b024000 { + reg = <0xb024000 0x1000>; + interrupts = <0x00 0x0a 0x04>; + frame-number = <0x02>; + status = "disabled"; + }; + + frame@b025000 { + reg = <0xb025000 0x1000>; + interrupts = <0x00 0x0b 0x04>; + frame-number = <0x03>; + status = "disabled"; + }; + + frame@b026000 { + reg = <0xb026000 0x1000>; + interrupts = <0x00 0x0c 0x04>; + frame-number = <0x04>; + status = "disabled"; + }; + + frame@b027000 { + reg = <0xb027000 0x1000>; + interrupts = <0x00 0x0d 0x04>; + frame-number = <0x05>; + status = "disabled"; + }; + + frame@b028000 { + reg = <0xb028000 0x1000>; + interrupts = <0x00 0x0e 0x04>; + frame-number = <0x06>; + status = "disabled"; + }; + }; + + power-manager@b088000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb088000 0x1000>; + phandle = <0x07>; + }; + + power-manager@b089000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb089000 0x1000>; + phandle = <0x08>; + }; + + power-manager@b098000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb098000 0x1000>; + phandle = <0x09>; + }; + + power-manager@b099000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb099000 0x1000>; + phandle = <0x0a>; + }; + + power-manager@b0a8000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb0a8000 0x1000>; + phandle = <0x0b>; + }; + + power-manager@b0a9000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb0a9000 0x1000>; + phandle = <0x0c>; + }; + + power-manager@b0b8000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb0b8000 0x1000>; + phandle = <0x0d>; + }; + + power-manager@b0b9000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb0b9000 0x1000>; + phandle = <0x0e>; + }; + }; + + thermal-zones { + + cpu0-2-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x73 0x03>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "passive"; + phandle = <0x74>; + }; + + cpu_crit { + temperature = <0x186a0>; + hysteresis = <0x7d0>; + type = "critical"; + }; + }; + + cooling-maps { + + map0 { + trip = <0x74>; + cooling-device = <0x75 0xffffffff 0xffffffff 0x76 0xffffffff 0xffffffff 0x77 0xffffffff 0xffffffff 0x78 0xffffffff 0xffffffff>; + }; + }; + }; + + cpu1-3-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x73 0x04>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "passive"; + phandle = <0x79>; + }; + + cpu_crit { + temperature = <0x186a0>; + hysteresis = <0x7d0>; + type = "critical"; + }; + }; + + cooling-maps { + + map0 { + trip = <0x79>; + cooling-device = <0x75 0xffffffff 0xffffffff 0x76 0xffffffff 0xffffffff 0x77 0xffffffff 0xffffffff 0x78 0xffffffff 0xffffffff>; + }; + }; + }; + + gpu-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x73 0x02>; + + trips { + + trip-point0 { + temperature = <0x15f90>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + + camera-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x73 0x01>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + + modem-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x73 0x00>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + }; + + timer { + compatible = "arm,armv7-timer"; + interrupts = <0x01 0x02 0xf08 0x01 0x03 0xf08 0x01 0x04 0xf08 0x01 0x01 0xf08>; + }; + + backlight { + compatible = "pwm-backlight"; + pwms = <0x7a 0x00 0x186a0>; + brightness-levels = <0x00 0x04 0x08 0x10 0x20 0x40 0x80 0xff>; + num-interpolated-steps = <0x02>; + default-brightness-level = <0x0a>; + phandle = <0x5f>; + }; + + battery { + compatible = "simple-battery"; + voltage-min-design-microvolt = <0x33e140>; + voltage-max-design-microvolt = <0x401640>; + energy-full-design-microwatt-hours = <0x56f9a0>; + charge-full-design-microamp-hours = <0x16e360>; + ocv-capacity-celsius = <0x19>; + ocv-capacity-table-0 = <0x3fdf90 0x64 0x3ee590 0x5f 0x3e39b0 0x5a 0x3d89e8 0x55 0x3cc2b0 0x50 0x3c64f0 0x4b 0x3befc0 0x46 0x3b7e78 0x41 0x3afd90 0x3c 0x3a74d8 0x37 0x3a1b00 0x32 0x39e068 0x2d 0x39b570 0x28 0x399a18 0x23 0x3982a8 0x1e 0x3957b0 0x19 0x391160 0x14 0x38bb70 0x10 0x386580 0x0d 0x384a28 0x0b 0x384640 0x0a 0x384258 0x09 0x383a88 0x08 0x382ed0 0x07 0x3807c0 0x06 0x379678 0x05 0x36dee0 0x04 0x35e4e0 0x03 0x349cc0 0x02 0x329538 0x01 0x2dc6c0 0x00>; + phandle = <0x29>; + }; + + gpio-keys { + compatible = "gpio-keys"; + pinctrl-0 = <0x7b>; + pinctrl-names = "default"; + + key-star { + wakeup-source; + gpios = <0x27 0x5a 0x01>; + linux,code = <0x20a>; + debounce-interval = <0x0f>; + linux,can-disable; + }; + }; + + keypad { + status = "okay"; + compatible = "gpio-matrix-keypad"; + col-scan-delay-us = <0x07>; + debounce-delay-ms = <0x0a>; + gpio-activelow; + pinctrl-0 = <0x7c 0x7d>; + pinctrl-names = "default"; + row-gpios = <0x27 0x61 0x01 0x27 0x60 0x01 0x27 0x5f 0x01 0x27 0x5e 0x01>; + col-gpios = <0x27 0x00 0x01 0x27 0x03 0x01 0x27 0x07 0x01 0x27 0x63 0x01 0x27 0x06 0x01 0x27 0x01 0x01>; + linux,keymap = <0x2b8 0x10002 0x20005 0x30008 0x4020a 0x501bd 0x100008b 0x1010003 0x1020006 0x1030009 0x104000b 0x10501be 0x2000069 0x2010004 0x2020007 0x203000a 0x204020b 0x20502b9 0x300006c 0x301000e 0x302006a 0x303001c 0x3040067>; + }; + + leds { + compatible = "gpio-leds"; + pinctrl-0 = <0x7e>; + pinctrl-names = "default"; + + led-0 { + function = "kbd_backlight"; + color = <0x00>; + gpios = <0x2c 0x01 0x00>; + }; + }; +}; diff --git a/devices/nokia-sparkler/qcom-msm8909-nokia-sparkler.dtb b/devices/nokia-sparkler/qcom-msm8909-nokia-sparkler.dtb new file mode 100644 index 0000000..cc6d819 Binary files /dev/null and b/devices/nokia-sparkler/qcom-msm8909-nokia-sparkler.dtb differ diff --git a/devices/nokia-sparkler/qcom-msm8909-nokia-sparkler.dts b/devices/nokia-sparkler/qcom-msm8909-nokia-sparkler.dts new file mode 100644 index 0000000..9c1f778 --- /dev/null +++ b/devices/nokia-sparkler/qcom-msm8909-nokia-sparkler.dts @@ -0,0 +1,1945 @@ +/dts-v1/; + +/ { + #address-cells = <0x01>; + #size-cells = <0x01>; + interrupt-parent = <0x01>; + model = "Nokia 8000 4G"; + compatible = "nokia,sparkler", "qcom,msm8909"; + chassis-type = "handset"; + + aliases { + mmc0 = "/soc@0/sdhci@7824000"; + mmc1 = "/soc@0/sdhci@7864000"; + serial0 = "/soc@0/serial@78af000"; + }; + + chosen { + stdout-path = "serial0"; + }; + + clocks { + + xo-board { + compatible = "fixed-clock"; + #clock-cells = <0x00>; + clock-frequency = <0x124f800>; + phandle = <0x18>; + }; + + sleep-clk { + compatible = "fixed-clock"; + #clock-cells = <0x00>; + clock-frequency = <0x8000>; + phandle = <0x28>; + }; + }; + + cpus { + #address-cells = <0x01>; + #size-cells = <0x00>; + + cpu@0 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x00>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x07>; + qcom,saw = <0x08>; + phandle = <0x75>; + }; + + cpu@1 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x01>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x09>; + qcom,saw = <0x0a>; + phandle = <0x76>; + }; + + cpu@2 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x02>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x0b>; + qcom,saw = <0x0c>; + phandle = <0x77>; + }; + + cpu@3 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x03>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x0d>; + qcom,saw = <0x0e>; + phandle = <0x78>; + }; + + l2-cache { + compatible = "cache"; + cache-level = <0x02>; + phandle = <0x02>; + }; + + idle-states { + + cpu-sleep-0 { + compatible = "qcom,idle-state-spc"; + idle-state-name = "standalone-power-collapse"; + entry-latency-us = <0xb4>; + exit-latency-us = <0xf0>; + min-residency-us = <0x4ec>; + local-timer-stop; + phandle = <0x06>; + }; + }; + }; + + cpu-opp-table { + compatible = "operating-points-v2-kryo-cpu", "operating-points-v2"; + nvmem-cells = <0x0f>; + opp-shared; + phandle = <0x05>; + + opp-199999951 { + opp-hz = <0x00 0xbebc1cf>; + required-opps = <0x10>; + opp-supported-hw = <0xff>; + }; + + opp-399999902 { + opp-hz = <0x00 0x17d7839e>; + required-opps = <0x11>; + opp-supported-hw = <0xff>; + }; + + opp-533333202 { + opp-hz = <0x00 0x1fca04d2>; + required-opps = <0x11>; + opp-supported-hw = <0xff>; + }; + + opp-799999804 { + opp-hz = <0x00 0x2faf073c>; + required-opps = <0x12>; + opp-supported-hw = <0xff>; + }; + + opp-998400000 { + opp-hz = <0x00 0x3b826000>; + required-opps = <0x12>; + opp-supported-hw = <0x05>; + }; + + opp-1094400000 { + opp-hz = <0x00 0x413b3800>; + required-opps = <0x13>; + opp-supported-hw = <0x05>; + }; + + opp-1248000000 { + opp-hz = <0x00 0x4a62f800>; + required-opps = <0x13>; + opp-supported-hw = <0x01>; + }; + + opp-1267200000 { + opp-hz = <0x00 0x4b87f000>; + required-opps = <0x13>; + opp-supported-hw = <0x01>; + }; + }; + + firmware { + + scm { + compatible = "qcom,scm-msm8916", "qcom,scm"; + clocks = <0x14 0x3d 0x14 0x3f 0x14 0x3e>; + clock-names = "core", "bus", "iface"; + qcom,dload-mode = <0x15 0x6100>; + }; + }; + + memory@80000000 { + device_type = "memory"; + reg = <0x80000000 0x00>; + }; + + pmu { + compatible = "arm,cortex-a7-pmu"; + interrupts = <0x01 0x07 0xf04>; + }; + + reserved-memory { + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + tz-apps@87a00000 { + reg = <0x87a00000 0x200000>; + no-map; + }; + + rfsa@87ce0000 { + reg = <0x87ce0000 0x20000>; + no-map; + }; + + smem@87d00000 { + compatible = "qcom,smem"; + reg = <0x87d00000 0x100000>; + no-map; + hwlocks = <0x16 0x03>; + qcom,rpm-msg-ram = <0x17>; + }; + + tz@87e00000 { + reg = <0x87e00000 0x200000>; + no-map; + }; + + mpss@88000000 { + reg = <0x88000000 0x5000000>; + no-map; + phandle = <0x32>; + }; + + mba@8dc00000 { + reg = <0x8dc00000 0x100000>; + no-map; + phandle = <0x31>; + }; + + reserved@84a00000 { + reg = <0x84a00000 0x400000>; + no-map; + }; + + wcnss@8d000000 { + reg = <0x8d000000 0x700000>; + no-map; + phandle = <0x69>; + }; + + rmtfs@9e900000 { + compatible = "qcom,rmtfs-mem"; + reg = <0x9e900000 0x300000>; + no-map; + qcom,client-id = <0x01>; + }; + }; + + smd { + compatible = "qcom,smd"; + + rpm { + interrupts = <0x00 0xa8 0x01>; + qcom,ipc = <0x03 0x08 0x00>; + qcom,smd-edge = <0x0f>; + + rpm-requests { + compatible = "qcom,rpm-msm8909"; + qcom,smd-channels = "rpm_requests"; + + clock-controller { + compatible = "qcom,rpmcc-msm8909", "qcom,rpmcc"; + #clock-cells = <0x01>; + clocks = <0x18>; + clock-names = "xo"; + phandle = <0x6d>; + }; + + power-controller { + compatible = "qcom,msm8909-rpmpd"; + #power-domain-cells = <0x01>; + operating-points-v2 = <0x19>; + phandle = <0x04>; + + opp-table { + compatible = "operating-points-v2"; + phandle = <0x19>; + + opp1 { + opp-level = <0x01>; + phandle = <0x10>; + }; + + opp2 { + opp-level = <0x02>; + }; + + opp3 { + opp-level = <0x03>; + phandle = <0x11>; + }; + + opp4 { + opp-level = <0x04>; + phandle = <0x12>; + }; + + opp5 { + opp-level = <0x05>; + }; + + opp6 { + opp-level = <0x06>; + phandle = <0x13>; + }; + }; + }; + + pm8909-regulators { + compatible = "qcom,rpm-pm8909-regulators"; + + s2 { + regulator-min-microvolt = <0x1c3a90>; + regulator-max-microvolt = <0x1c3a90>; + }; + + l1 { + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0xf4240>; + }; + + l2 { + regulator-min-microvolt = <0x124f80>; + regulator-max-microvolt = <0x124f80>; + }; + + l4 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + }; + + l5 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x3d>; + }; + + l6 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x61>; + }; + + l7 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x30>; + }; + + l8 { + regulator-min-microvolt = <0x2b7cd0>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x3c>; + }; + + l9 { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x325aa0>; + phandle = <0x6f>; + }; + + l10 { + regulator-min-microvolt = <0x12b128>; + regulator-max-microvolt = <0x13d620>; + phandle = <0x6e>; + }; + + l11 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2d0370>; + regulator-allow-set-load; + regulator-system-load = <0x30d40>; + phandle = <0x44>; + }; + + l12 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2d0370>; + phandle = <0x45>; + }; + + l13 { + regulator-min-microvolt = <0x2eebb8>; + regulator-max-microvolt = <0x2eebb8>; + phandle = <0x68>; + }; + + l14 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2dc6c0>; + }; + + l15 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2dc6c0>; + }; + + l17 { + regulator-min-microvolt = <0x2b7cd0>; + regulator-max-microvolt = <0x2b7cd0>; + phandle = <0x60>; + }; + + l18 { + regulator-min-microvolt = <0x2932e0>; + regulator-max-microvolt = <0x2932e0>; + }; + }; + }; + }; + }; + + smp2p-hexagon { + compatible = "qcom,smp2p"; + qcom,smem = <0x1b3 0x1ac>; + interrupts = <0x00 0x1b 0x01>; + qcom,ipc = <0x03 0x08 0x0e>; + qcom,local-pid = <0x00>; + qcom,remote-pid = <0x01>; + + master-kernel { + qcom,entry-name = "master-kernel"; + #qcom,smem-state-cells = <0x01>; + phandle = <0x2f>; + }; + + slave-kernel { + qcom,entry-name = "slave-kernel"; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x2e>; + }; + }; + + smp2p-wcnss { + compatible = "qcom,smp2p"; + qcom,smem = <0x1c3 0x1af>; + interrupts = <0x00 0x8f 0x01>; + qcom,ipc = <0x03 0x08 0x12>; + qcom,local-pid = <0x00>; + qcom,remote-pid = <0x04>; + + master-kernel { + qcom,entry-name = "master-kernel"; + #qcom,smem-state-cells = <0x01>; + phandle = <0x6b>; + }; + + slave-kernel { + qcom,entry-name = "slave-kernel"; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x6a>; + }; + }; + + smsm { + compatible = "qcom,smsm"; + #address-cells = <0x01>; + #size-cells = <0x00>; + qcom,ipc-1 = <0x03 0x08 0x0d>; + qcom,ipc-3 = <0x03 0x08 0x13>; + + apps@0 { + reg = <0x00>; + #qcom,smem-state-cells = <0x01>; + phandle = <0x34>; + }; + + hexagon@1 { + reg = <0x01>; + interrupts = <0x00 0x1a 0x01>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x33>; + }; + + wcnss@6 { + reg = <0x06>; + interrupts = <0x00 0x90 0x01>; + interrupt-controller; + #interrupt-cells = <0x02>; + }; + }; + + soc@0 { + compatible = "simple-bus"; + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + rng@22000 { + compatible = "qcom,prng"; + reg = <0x22000 0x200>; + clocks = <0x14 0x44>; + clock-names = "core"; + }; + + qfprom@5c000 { + compatible = "qcom,qfprom"; + reg = <0x5c000 0x1000>; + #address-cells = <0x01>; + #size-cells = <0x01>; + + speedbin@c { + reg = <0x0c 0x01>; + bits = <0x02 0x03>; + phandle = <0x0f>; + }; + + s0-p1@a0 { + reg = <0xa0 0x01>; + bits = <0x00 0x06>; + phandle = <0x1d>; + }; + + s0-p2@a0 { + reg = <0xa0 0x02>; + bits = <0x06 0x06>; + phandle = <0x1e>; + }; + + s1-p1@a1 { + reg = <0xa1 0x02>; + bits = <0x04 0x06>; + phandle = <0x1f>; + }; + + s1-p2@a2 { + reg = <0xa2 0x01>; + bits = <0x02 0x06>; + phandle = <0x20>; + }; + + s2-p1@a3 { + reg = <0xa3 0x01>; + bits = <0x00 0x06>; + phandle = <0x21>; + }; + + s2-p2@a3 { + reg = <0xa3 0x02>; + bits = <0x06 0x06>; + phandle = <0x22>; + }; + + s3-p1@a4 { + reg = <0xa4 0x02>; + bits = <0x04 0x06>; + phandle = <0x23>; + }; + + s3-p2@a5 { + reg = <0xa5 0x01>; + bits = <0x02 0x06>; + phandle = <0x24>; + }; + + s4-p1@a6 { + reg = <0xa6 0x01>; + bits = <0x00 0x06>; + phandle = <0x25>; + }; + + s4-p2@a6 { + reg = <0xa6 0x02>; + bits = <0x06 0x06>; + phandle = <0x26>; + }; + + base1@dc { + reg = <0xdc 0x01>; + bits = <0x00 0x08>; + phandle = <0x1b>; + }; + + base2@dd { + reg = <0xdd 0x01>; + bits = <0x00 0x08>; + phandle = <0x1c>; + }; + + mode@de { + reg = <0xde 0x01>; + bits = <0x00 0x03>; + phandle = <0x1a>; + }; + }; + + sram@60000 { + compatible = "qcom,rpm-msg-ram"; + reg = <0x60000 0x8000>; + phandle = <0x17>; + }; + + sram@290000 { + compatible = "qcom,rpm-stats"; + reg = <0x290000 0x10000>; + }; + + thermal-sensor@4a9000 { + compatible = "qcom,msm8909-tsens", "qcom,tsens-v0_1"; + reg = <0x4a9000 0x1000 0x4a8000 0x1000>; + nvmem-cells = <0x1a 0x1b 0x1c 0x1d 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25 0x26>; + nvmem-cell-names = "mode", "base1", "base2", "s0_p1", "s0_p2", "s1_p1", "s1_p2", "s2_p1", "s2_p2", "s3_p1", "s3_p2", "s4_p1", "s4_p2"; + interrupts = <0x00 0xb8 0x04>; + interrupt-names = "uplow"; + #thermal-sensor-cells = <0x01>; + #qcom,sensors = <0x05>; + phandle = <0x73>; + }; + + restart@4ab000 { + compatible = "qcom,pshold"; + reg = <0x4ab000 0x04>; + }; + + pinctrl@1000000 { + compatible = "qcom,msm8909-tlmm"; + reg = <0x1000000 0x300000>; + interrupts = <0x00 0xd0 0x04>; + gpio-controller; + #gpio-cells = <0x02>; + gpio-ranges = <0x27 0x00 0x00 0x75>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x27>; + + blsp-i2c1-default-state { + pins = "gpio6", "gpio7"; + function = "blsp_i2c1"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x4b>; + }; + + blsp-i2c1-sleep-state { + pins = "gpio6", "gpio7"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x4c>; + }; + + blsp-i2c2-default-state { + pins = "gpio111", "gpio112"; + function = "blsp_i2c2"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x4f>; + }; + + blsp-i2c2-sleep-state { + pins = "gpio111", "gpio112"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x50>; + }; + + blsp-i2c3-default-state { + pins = "gpio29", "gpio30"; + function = "blsp_i2c3"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x53>; + }; + + blsp-i2c3-sleep-state { + pins = "gpio29", "gpio30"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x54>; + }; + + blsp-i2c4-default-state { + pins = "gpio14", "gpio15"; + function = "blsp_i2c4"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x57>; + }; + + blsp-i2c4-sleep-state { + pins = "gpio14", "gpio15"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x58>; + }; + + blsp-i2c5-default-state { + pins = "gpio18", "gpio19"; + function = "blsp_i2c5"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5b>; + }; + + blsp-i2c5-sleep-state { + pins = "gpio18", "gpio19"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5c>; + }; + + blsp-i2c6-default-state { + pins = "gpio10", "gpio11"; + function = "blsp_i2c6"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x63>; + }; + + blsp-i2c6-sleep-state { + pins = "gpio10", "gpio11"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x64>; + }; + + blsp-spi1-default-state { + pins = "gpio4", "gpio5", "gpio6", "gpio7"; + function = "blsp_spi1"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x4d>; + }; + + blsp-spi1-sleep-state { + pins = "gpio4", "gpio5", "gpio6", "gpio7"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x4e>; + }; + + blsp-spi2-default-state { + pins = "gpio20", "gpio21", "gpio111", "gpio112"; + function = "blsp_spi2"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x51>; + }; + + blsp-spi2-sleep-state { + pins = "gpio20", "gpio21", "gpio111", "gpio112"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x52>; + }; + + blsp-spi3-default-state { + pins = "gpio0", "gpio1", "gpio2", "gpio3"; + function = "blsp_spi3"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x55>; + }; + + blsp-spi3-sleep-state { + pins = "gpio0", "gpio1", "gpio2", "gpio3"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x56>; + }; + + blsp-spi4-default-state { + pins = "gpio12", "gpio13", "gpio14", "gpio15"; + function = "blsp_spi4"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x59>; + }; + + blsp-spi4-sleep-state { + pins = "gpio12", "gpio13", "gpio14", "gpio15"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x5a>; + }; + + blsp-spi5-default-state { + pins = "gpio16", "gpio17", "gpio18", "gpio19"; + function = "blsp_spi5"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x5d>; + }; + + blsp-spi5-sleep-state { + pins = "gpio16", "gpio17", "gpio18", "gpio19"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x5e>; + }; + + blsp-spi6-default-state { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "blsp_spi6"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x65>; + }; + + blsp-spi6-sleep-state { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x66>; + }; + + blsp-uart1-default-state { + pins = "gpio4", "gpio5"; + function = "blsp_uart1"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x47>; + }; + + blsp-uart1-sleep-state { + pins = "gpio4", "gpio5"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x48>; + }; + + blsp-uart2-default-state { + pins = "gpio20", "gpio21"; + function = "blsp_uart2"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x49>; + }; + + blsp-uart2-sleep-state { + pins = "gpio20", "gpio21"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x4a>; + }; + + sdc1-clk-on-state { + pins = "sdc1_clk"; + bias-disable; + drive-strength = <0x10>; + phandle = <0x36>; + }; + + sdc1-clk-off-state { + pins = "sdc1_clk"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x39>; + }; + + sdc1-cmd-on-state { + pins = "sdc1_cmd"; + bias-disable; + drive-strength = <0x0a>; + phandle = <0x37>; + }; + + sdc1-cmd-off-state { + pins = "sdc1_cmd"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x3a>; + }; + + sdc1-data-on-state { + pins = "sdc1_data"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x38>; + }; + + sdc1-data-off-state { + pins = "sdc1_data"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x3b>; + }; + + sdc2-clk-on-state { + pins = "sdc2_clk"; + drive-strength = <0x10>; + bias-disable; + phandle = <0x3e>; + }; + + sdc2-clk-off-state { + pins = "sdc2_clk"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x41>; + }; + + sdc2-cmd-on-state { + pins = "sdc2_cmd"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x3f>; + }; + + sdc2-cmd-off-state { + pins = "sdc2_cmd"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x42>; + }; + + sdc2-data-on-state { + pins = "sdc2_data"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x40>; + }; + + sdc2-data-off-state { + pins = "sdc2_data"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x43>; + }; + + wcnss-active-state { + pins = "gpio40", "gpio41", "gpio42", "gpio43", "gpio44"; + function = "wcss_wlan"; + drive-strength = <0x06>; + bias-pull-up; + phandle = <0x6c>; + }; + + gpio-key-active-state { + pins = "gpio90"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-up; + phandle = <0x7b>; + }; + + matrix-keypad-row-default-state { + pins = "gpio94", "gpio95", "gpio96", "gpio97"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-up; + phandle = <0x7c>; + }; + + matrix-keypad-col-default-state { + pins = "gpio0", "gpio3", "gpio7", "gpio99", "gpio6", "gpio1"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x7d>; + }; + + panel-gpios-default-state { + pins = "gpio24", "gpio25", "gpio110"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x62>; + }; + }; + + clock-controller@1800000 { + compatible = "qcom,gcc-msm8909"; + reg = <0x1800000 0x80000>; + #clock-cells = <0x01>; + #reset-cells = <0x01>; + #power-domain-cells = <0x01>; + clocks = <0x18 0x28 0x00 0x00>; + clock-names = "xo", "sleep_clk", "dsi0pll", "dsi0pllbyte"; + phandle = <0x14>; + }; + + hwlock@1905000 { + compatible = "qcom,tcsr-mutex"; + reg = <0x1905000 0x20000>; + #hwlock-cells = <0x01>; + phandle = <0x16>; + }; + + syscon@1937000 { + compatible = "qcom,tcsr-msm8909", "syscon"; + reg = <0x1937000 0x30000>; + phandle = <0x15>; + }; + + spmi@200f000 { + compatible = "qcom,spmi-pmic-arb"; + reg = <0x200f000 0x1000 0x2400000 0x400000 0x2c00000 0x400000 0x3800000 0x200000 0x200a000 0x2100>; + reg-names = "core", "chnls", "obsrvr", "intr", "cnfg"; + interrupt-names = "periph_irq"; + interrupts = <0x00 0xbe 0x04>; + qcom,ee = <0x00>; + qcom,channel = <0x00>; + #address-cells = <0x02>; + #size-cells = <0x00>; + interrupt-controller; + #interrupt-cells = <0x04>; + + pmic@0 { + compatible = "qcom,pm8909", "qcom,spmi-pmic"; + reg = <0x00 0x00>; + #address-cells = <0x01>; + #size-cells = <0x00>; + + pon@800 { + compatible = "qcom,pm8916-pon"; + reg = <0x800>; + mode-bootloader = <0x02>; + mode-recovery = <0x01>; + + pwrkey { + compatible = "qcom,pm8941-pwrkey"; + interrupts = <0x00 0x08 0x00 0x03>; + debounce = <0x3d09>; + bias-pull-up; + linux,code = <0x74>; + }; + + resin { + compatible = "qcom,pm8941-resin"; + interrupts = <0x00 0x08 0x01 0x03>; + debounce = <0x3d09>; + bias-pull-up; + status = "okay"; + linux,code = <0x20b>; + }; + + watchdog { + compatible = "qcom,pm8916-wdt"; + interrupts = <0x00 0x08 0x06 0x01>; + timeout-sec = <0x3c>; + }; + }; + + charger@1000 { + compatible = "qcom,pm8916-lbc"; + reg = <0x1000 0x1200 0x1300 0x1600>; + reg-names = "chgr", "bat_if", "usb", "misc"; + interrupts = <0x00 0x10 0x00 0x03 0x00 0x10 0x05 0x03 0x00 0x10 0x06 0x03 0x00 0x10 0x07 0x03 0x00 0x12 0x00 0x03 0x00 0x12 0x01 0x03 0x00 0x13 0x00 0x03 0x00 0x13 0x01 0x03 0x00 0x13 0x02 0x03 0x00 0x13 0x04 0x03>; + interrupt-names = "vbat_det", "fast_chg", "chg_fail", "chg_done", "bat_pres", "temp_ok", "coarse_det", "usb_vbus", "chg_gone", "overtemp"; + status = "okay"; + qcom,fast-charge-safe-current = <0x41eb0>; + qcom,fast-charge-safe-voltage = <0x3f52f0>; + monitored-battery = <0x29>; + phandle = <0x2a>; + }; + + extcon@1300 { + compatible = "qcom,pm8941-misc"; + reg = <0x1300>; + interrupts = <0x00 0x13 0x01 0x03>; + interrupt-names = "usb_vbus"; + status = "disabled"; + }; + + vm-bms@4000 { + compatible = "qcom,pm8916-bms-vm"; + reg = <0x4000>; + interrupts = <0x00 0x40 0x00 0x01 0x00 0x40 0x01 0x01 0x00 0x40 0x02 0x01 0x00 0x40 0x03 0x01 0x00 0x40 0x04 0x01 0x00 0x40 0x05 0x01>; + interrupt-names = "cv_leave", "cv_enter", "ocv_good", "ocv_thr", "fifo", "state_chg"; + status = "okay"; + monitored-battery = <0x29>; + power-supplies = <0x2a>; + }; + + rtc@6000 { + compatible = "qcom,pm8941-rtc"; + reg = <0x6000>; + interrupts = <0x00 0x61 0x01 0x01>; + }; + + mpps@a000 { + compatible = "qcom,pm8916-mpp", "qcom,spmi-mpp"; + reg = <0xa000>; + gpio-controller; + #gpio-cells = <0x02>; + gpio-ranges = <0x2b 0x00 0x00 0x04>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x2b>; + + mpp2-state { + pins = "mpp2"; + function = "digital"; + power-source = <0x00>; + output-low; + qcom,dtest = <0x01>; + phandle = <0x2d>; + }; + }; + + gpios@c000 { + compatible = "qcom,pm8916-gpio", "qcom,spmi-gpio"; + reg = <0xc000>; + gpio-controller; + gpio-ranges = <0x2c 0x00 0x00 0x04>; + #gpio-cells = <0x02>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x2c>; + + keypad-backlight-default-state { + pins = "gpio1"; + function = "normal"; + power-source = <0x02>; + output-low; + phandle = <0x7e>; + }; + }; + }; + + pmic@1 { + compatible = "qcom,pm8909", "qcom,spmi-pmic"; + reg = <0x01 0x00>; + #address-cells = <0x01>; + #size-cells = <0x00>; + + pwm { + compatible = "qcom,pm8916-pwm"; + #pwm-cells = <0x02>; + status = "okay"; + pinctrl-0 = <0x2d>; + pinctrl-names = "default"; + phandle = <0x7a>; + }; + + vibrator@c000 { + compatible = "qcom,pm8916-vib"; + reg = <0xc000>; + status = "disabled"; + }; + }; + }; + + dma-controller@4044000 { + compatible = "qcom,bam-v1.7.0"; + reg = <0x4044000 0x19000>; + interrupts = <0x00 0x1d 0x04>; + #dma-cells = <0x01>; + qcom,ee = <0x00>; + num-channels = <0x06>; + qcom,num-ees = <0x01>; + qcom,powered-remotely; + phandle = <0x35>; + }; + + remoteproc@4080000 { + compatible = "qcom,msm8909-mss-pil"; + reg = <0x4080000 0x100 0x4020000 0x40>; + reg-names = "qdsp6", "rmb"; + interrupts-extended = <0x01 0x00 0x18 0x01 0x2e 0x00 0x01 0x2e 0x01 0x01 0x2e 0x02 0x01 0x2e 0x03 0x01>; + interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack"; + power-domains = <0x04 0x00 0x04 0x04>; + power-domain-names = "cx", "mx"; + clocks = <0x14 0x79 0x14 0x7a 0x14 0x3c 0x18>; + clock-names = "iface", "bus", "mem", "xo"; + qcom,smem-states = <0x2f 0x00>; + qcom,smem-state-names = "stop"; + resets = <0x14 0x29>; + reset-names = "mss_restart"; + qcom,halt-regs = <0x15 0x18000 0x19000 0x1a000>; + status = "okay"; + pll-supply = <0x30>; + + mba { + memory-region = <0x31>; + }; + + mpss { + memory-region = <0x32>; + }; + + bam-dmux { + compatible = "qcom,bam-dmux"; + interrupt-parent = <0x33>; + interrupts = <0x01 0x03 0x0b 0x03>; + interrupt-names = "pc", "pc-ack"; + qcom,smem-states = <0x34 0x01 0x34 0x0b>; + qcom,smem-state-names = "pc", "pc-ack"; + dmas = <0x35 0x04 0x35 0x05>; + dma-names = "tx", "rx"; + }; + + smd-edge { + interrupts = <0x00 0x19 0x01>; + qcom,smd-edge = <0x00>; + qcom,ipc = <0x03 0x08 0x0c>; + qcom,remote-pid = <0x01>; + label = "hexagon"; + }; + }; + + sdhci@7824000 { + compatible = "qcom,msm8916-sdhci", "qcom,sdhci-msm-v4"; + reg = <0x7824900 0x11c 0x7824000 0x800>; + reg-names = "hc_mem", "core_mem"; + interrupts = <0x00 0x7b 0x04 0x00 0x8a 0x04>; + interrupt-names = "hc_irq", "pwr_irq"; + clocks = <0x14 0x80 0x14 0x7f 0x18>; + clock-names = "core", "iface", "xo"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x36 0x37 0x38>; + pinctrl-1 = <0x39 0x3a 0x3b>; + mmc-hs200-1_8v; + mmc-ddr-1_8v; + bus-width = <0x08>; + non-removable; + status = "okay"; + vmmc-supply = <0x3c>; + vqmmc-supply = <0x3d>; + }; + + sdhci@7864000 { + compatible = "qcom,msm8916-sdhci", "qcom,sdhci-msm-v4"; + reg = <0x7864900 0x11c 0x7864000 0x800>; + reg-names = "hc_mem", "core_mem"; + interrupts = <0x00 0x7d 0x04 0x00 0xdd 0x04>; + interrupt-names = "hc_irq", "pwr_irq"; + clocks = <0x14 0x82 0x14 0x81 0x18>; + clock-names = "core", "iface", "xo"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x3e 0x3f 0x40>; + pinctrl-1 = <0x41 0x42 0x43>; + bus-width = <0x04>; + status = "okay"; + vmmc-supply = <0x44>; + vqmmc-supply = <0x45>; + non-removable; + }; + + dma-controller@7884000 { + compatible = "qcom,bam-v1.7.0"; + reg = <0x7884000 0x23000>; + interrupts = <0x00 0xee 0x04>; + clocks = <0x14 0x3a>; + clock-names = "bam_clk"; + #dma-cells = <0x01>; + qcom,ee = <0x00>; + qcom,controlled-remotely; + phandle = <0x46>; + }; + + serial@78af000 { + compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; + reg = <0x78af000 0x200>; + interrupts = <0x00 0x6b 0x04>; + clocks = <0x14 0x56 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x00 0x46 0x01>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x47>; + pinctrl-1 = <0x48>; + status = "okay"; + }; + + serial@78b0000 { + compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; + reg = <0x78b0000 0x200>; + interrupts = <0x00 0x6c 0x04>; + clocks = <0x14 0x57 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x02 0x46 0x03>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x49>; + pinctrl-1 = <0x4a>; + status = "disabled"; + }; + + i2c@78b5000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b5000 0x500>; + interrupts = <0x00 0x5f 0x04>; + clocks = <0x14 0x4a 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x04 0x46 0x05>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4b>; + pinctrl-1 = <0x4c>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b5000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b5000 0x500>; + interrupts = <0x00 0x5f 0x04>; + clocks = <0x14 0x4b 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x04 0x46 0x05>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4d>; + pinctrl-1 = <0x4e>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b6000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b6000 0x500>; + interrupts = <0x00 0x60 0x04>; + clocks = <0x14 0x4c 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x06 0x46 0x07>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4f>; + pinctrl-1 = <0x50>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b6000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b6000 0x500>; + interrupts = <0x00 0x60 0x04>; + clocks = <0x14 0x4d 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x06 0x46 0x07>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x51>; + pinctrl-1 = <0x52>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b7000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b7000 0x500>; + interrupts = <0x00 0x61 0x04>; + clocks = <0x14 0x4e 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x08 0x46 0x09>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x53>; + pinctrl-1 = <0x54>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b7000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b7000 0x500>; + interrupts = <0x00 0x61 0x04>; + clocks = <0x14 0x4f 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x08 0x46 0x09>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x55>; + pinctrl-1 = <0x56>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b8000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b8000 0x500>; + interrupts = <0x00 0x62 0x04>; + clocks = <0x14 0x50 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x0a 0x46 0x0b>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x57>; + pinctrl-1 = <0x58>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b8000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b8000 0x500>; + interrupts = <0x00 0x62 0x04>; + clocks = <0x14 0x51 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x0a 0x46 0x0b>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x59>; + pinctrl-1 = <0x5a>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b9000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b9000 0x500>; + interrupts = <0x00 0x63 0x04>; + clocks = <0x14 0x52 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x0c 0x46 0x0d>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5b>; + pinctrl-1 = <0x5c>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b9000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b9000 0x500>; + interrupts = <0x00 0x63 0x04>; + clocks = <0x14 0x53 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x0c 0x46 0x0d>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5d>; + pinctrl-1 = <0x5e>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "okay"; + + display@0 { + compatible = "nokia,sparkler-gc9307-hlt-28-panel", "panel-mipi-dbi-spi"; + reg = <0x00>; + backlight = <0x5f>; + reset-gpios = <0x27 0x19 0x00>; + dc-gpios = <0x27 0x6e 0x00>; + spi-max-frequency = <0x2faf080>; + power-supply = <0x60>; + io-supply = <0x61>; + pinctrl-0 = <0x62>; + pinctrl-names = "default"; + status = "okay"; + width-mm = <0x2a>; + height-mm = <0x38>; + + panel-timing { + hactive = <0xf0>; + vactive = <0x140>; + hback-porch = <0x00>; + vback-porch = <0x00>; + hfront-porch = <0x00>; + vfront-porch = <0x00>; + hsync-len = <0x00>; + vsync-len = <0x00>; + clock-frequency = "", "#("; + }; + }; + }; + + i2c@78ba000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78ba000 0x500>; + interrupts = <0x00 0x64 0x04>; + clocks = <0x14 0x54 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x0e 0x46 0x0f>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x63>; + pinctrl-1 = <0x64>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78ba000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78ba000 0x500>; + interrupts = <0x00 0x64 0x04>; + clocks = <0x14 0x55 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x46 0x0e 0x46 0x0f>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x65>; + pinctrl-1 = <0x66>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + usb@78d9000 { + compatible = "qcom,ci-hdrc"; + reg = <0x78d9000 0x200 0x78d9200 0x200>; + interrupts = <0x00 0x86 0x04 0x00 0x8c 0x04>; + clocks = <0x14 0x8d 0x14 0x8f>; + clock-names = "iface", "core"; + assigned-clocks = <0x14 0x8f>; + assigned-clock-rates = <0x4c4b400>; + resets = <0x14 0x27>; + reset-names = "core"; + phy_type = "ulpi"; + dr_mode = "otg"; + hnp-disable; + srp-disable; + adp-disable; + ahb-burst-config = <0x00>; + phy-names = "usb-phy"; + phys = <0x67>; + status = "okay"; + #reset-cells = <0x01>; + extcon = <0x2a>; + + ulpi { + + phy { + compatible = "qcom,usb-hs-phy-msm8909", "qcom,usb-hs-phy"; + #phy-cells = <0x00>; + clocks = <0x18 0x14 0x8c>; + clock-names = "ref", "sleep"; + resets = <0x14 0x21 0x14 0x26>; + reset-names = "phy", "por"; + qcom,init-seq = [00 73]; + v1p8-supply = <0x30>; + v3p3-supply = <0x68>; + extcon = <0x2a>; + phandle = <0x67>; + }; + }; + }; + + remoteproc@a21b000 { + compatible = "qcom,pronto-v3-pil", "qcom,pronto"; + reg = <0xa204000 0x2000 0xa202000 0x1000 0xa21b000 0x3000>; + reg-names = "ccu", "dxe", "pmu"; + memory-region = <0x69>; + interrupts-extended = <0x01 0x00 0x95 0x01 0x6a 0x00 0x01 0x6a 0x01 0x01 0x6a 0x02 0x01 0x6a 0x03 0x01>; + interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack"; + power-domains = <0x04 0x00 0x04 0x03>; + power-domain-names = "cx", "mx"; + qcom,smem-states = <0x6b 0x00>; + qcom,smem-state-names = "stop"; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + status = "okay"; + vddpx-supply = <0x30>; + phandle = <0x70>; + + iris { + clocks = <0x6d 0x10>; + clock-names = "xo"; + vddxo-supply = <0x30>; + vddrfa-supply = <0x6e>; + vddpa-supply = <0x6f>; + vdddig-supply = <0x3d>; + compatible = "qcom,wcn3620"; + }; + + smd-edge { + interrupts = <0x00 0x8e 0x01>; + qcom,ipc = <0x03 0x08 0x11>; + qcom,smd-edge = <0x06>; + qcom,remote-pid = <0x04>; + label = "pronto"; + + wcnss { + compatible = "qcom,wcnss"; + qcom,smd-channels = "WCNSS_CTRL"; + qcom,mmio = <0x70>; + + bluetooth { + compatible = "qcom,wcnss-bt"; + }; + + wifi { + compatible = "qcom,wcnss-wlan"; + interrupts = <0x00 0x91 0x04 0x00 0x92 0x04>; + interrupt-names = "tx", "rx"; + qcom,smem-states = <0x34 0x0a 0x34 0x09>; + qcom,smem-state-names = "tx-enable", "tx-rings-empty"; + }; + }; + }; + }; + + interrupt-controller@b000000 { + compatible = "qcom,msm-qgic2"; + reg = <0xb000000 0x1000 0xb002000 0x1000>; + interrupt-controller; + #interrupt-cells = <0x03>; + phandle = <0x01>; + }; + + mailbox@b011000 { + compatible = "qcom,msm8916-apcs-kpss-global", "syscon"; + reg = <0xb011000 0x1000>; + #mbox-cells = <0x01>; + clocks = <0x71 0x14 0x01>; + clock-names = "pll", "aux"; + #clock-cells = <0x00>; + phandle = <0x03>; + }; + + clock@b016000 { + compatible = "qcom,msm8916-a53pll"; + reg = <0xb016000 0x40>; + #clock-cells = <0x00>; + clocks = <0x18>; + clock-names = "xo"; + operating-points-v2 = <0x72>; + phandle = <0x71>; + + opp-table { + compatible = "operating-points-v2"; + phandle = <0x72>; + + opp-998400000 { + opp-hz = <0x00 0x3b826000>; + }; + + opp-1094400000 { + opp-hz = <0x00 0x413b3800>; + }; + + opp-1190400000 { + opp-hz = <0x00 0x46f41000>; + }; + + opp-1248000000 { + opp-hz = <0x00 0x4a62f800>; + }; + + opp-1267200000 { + opp-hz = <0x00 0x4b87f000>; + }; + }; + }; + + timer@b020000 { + compatible = "arm,armv7-timer-mem"; + reg = <0xb020000 0x1000>; + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + frame@b021000 { + reg = <0xb021000 0x1000 0xb022000 0x1000>; + interrupts = <0x00 0x08 0x04 0x00 0x07 0x04>; + frame-number = <0x00>; + }; + + frame@b023000 { + reg = <0xb023000 0x1000>; + interrupts = <0x00 0x09 0x04>; + frame-number = <0x01>; + status = "disabled"; + }; + + frame@b024000 { + reg = <0xb024000 0x1000>; + interrupts = <0x00 0x0a 0x04>; + frame-number = <0x02>; + status = "disabled"; + }; + + frame@b025000 { + reg = <0xb025000 0x1000>; + interrupts = <0x00 0x0b 0x04>; + frame-number = <0x03>; + status = "disabled"; + }; + + frame@b026000 { + reg = <0xb026000 0x1000>; + interrupts = <0x00 0x0c 0x04>; + frame-number = <0x04>; + status = "disabled"; + }; + + frame@b027000 { + reg = <0xb027000 0x1000>; + interrupts = <0x00 0x0d 0x04>; + frame-number = <0x05>; + status = "disabled"; + }; + + frame@b028000 { + reg = <0xb028000 0x1000>; + interrupts = <0x00 0x0e 0x04>; + frame-number = <0x06>; + status = "disabled"; + }; + }; + + power-manager@b088000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb088000 0x1000>; + phandle = <0x07>; + }; + + power-manager@b089000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb089000 0x1000>; + phandle = <0x08>; + }; + + power-manager@b098000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb098000 0x1000>; + phandle = <0x09>; + }; + + power-manager@b099000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb099000 0x1000>; + phandle = <0x0a>; + }; + + power-manager@b0a8000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb0a8000 0x1000>; + phandle = <0x0b>; + }; + + power-manager@b0a9000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb0a9000 0x1000>; + phandle = <0x0c>; + }; + + power-manager@b0b8000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb0b8000 0x1000>; + phandle = <0x0d>; + }; + + power-manager@b0b9000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb0b9000 0x1000>; + phandle = <0x0e>; + }; + }; + + thermal-zones { + + cpu0-2-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x73 0x03>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "passive"; + phandle = <0x74>; + }; + + cpu_crit { + temperature = <0x186a0>; + hysteresis = <0x7d0>; + type = "critical"; + }; + }; + + cooling-maps { + + map0 { + trip = <0x74>; + cooling-device = <0x75 0xffffffff 0xffffffff 0x76 0xffffffff 0xffffffff 0x77 0xffffffff 0xffffffff 0x78 0xffffffff 0xffffffff>; + }; + }; + }; + + cpu1-3-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x73 0x04>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "passive"; + phandle = <0x79>; + }; + + cpu_crit { + temperature = <0x186a0>; + hysteresis = <0x7d0>; + type = "critical"; + }; + }; + + cooling-maps { + + map0 { + trip = <0x79>; + cooling-device = <0x75 0xffffffff 0xffffffff 0x76 0xffffffff 0xffffffff 0x77 0xffffffff 0xffffffff 0x78 0xffffffff 0xffffffff>; + }; + }; + }; + + gpu-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x73 0x02>; + + trips { + + trip-point0 { + temperature = <0x15f90>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + + camera-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x73 0x01>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + + modem-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x73 0x00>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + }; + + timer { + compatible = "arm,armv7-timer"; + interrupts = <0x01 0x02 0xf08 0x01 0x03 0xf08 0x01 0x04 0xf08 0x01 0x01 0xf08>; + }; + + backlight { + compatible = "pwm-backlight"; + pwms = <0x7a 0x00 0x186a0>; + brightness-levels = <0x00 0x04 0x08 0x10 0x20 0x40 0x80 0xff>; + num-interpolated-steps = <0x02>; + default-brightness-level = <0x0a>; + phandle = <0x5f>; + }; + + battery { + compatible = "simple-battery"; + voltage-min-design-microvolt = <0x33e140>; + voltage-max-design-microvolt = <0x401640>; + energy-full-design-microwatt-hours = <0x56f9a0>; + charge-full-design-microamp-hours = <0x16e360>; + ocv-capacity-celsius = <0x19>; + ocv-capacity-table-0 = <0x3fdf90 0x64 0x3ee590 0x5f 0x3e39b0 0x5a 0x3d89e8 0x55 0x3cc2b0 0x50 0x3c64f0 0x4b 0x3befc0 0x46 0x3b7e78 0x41 0x3afd90 0x3c 0x3a74d8 0x37 0x3a1b00 0x32 0x39e068 0x2d 0x39b570 0x28 0x399a18 0x23 0x3982a8 0x1e 0x3957b0 0x19 0x391160 0x14 0x38bb70 0x10 0x386580 0x0d 0x384a28 0x0b 0x384640 0x0a 0x384258 0x09 0x383a88 0x08 0x382ed0 0x07 0x3807c0 0x06 0x379678 0x05 0x36dee0 0x04 0x35e4e0 0x03 0x349cc0 0x02 0x329538 0x01 0x2dc6c0 0x00>; + phandle = <0x29>; + }; + + gpio-keys { + compatible = "gpio-keys"; + pinctrl-0 = <0x7b>; + pinctrl-names = "default"; + + key-star { + wakeup-source; + gpios = <0x27 0x5a 0x01>; + linux,code = <0x20a>; + debounce-interval = <0x0f>; + linux,can-disable; + }; + }; + + keypad { + status = "okay"; + compatible = "gpio-matrix-keypad"; + col-scan-delay-us = <0x07>; + debounce-delay-ms = <0x0a>; + gpio-activelow; + pinctrl-0 = <0x7c 0x7d>; + pinctrl-names = "default"; + row-gpios = <0x27 0x61 0x01 0x27 0x60 0x01 0x27 0x5f 0x01 0x27 0x5e 0x01>; + col-gpios = <0x27 0x00 0x01 0x27 0x03 0x01 0x27 0x07 0x01 0x27 0x63 0x01 0x27 0x06 0x01 0x27 0x01 0x01>; + linux,keymap = <0x1bd 0x10002 0x20005 0x30008 0x4020a 0x5008b 0x10002b8 0x1010003 0x1020006 0x1030009 0x104000b 0x105000e 0x2000069 0x2010004 0x2020007 0x203000a 0x204020b 0x20501be 0x300001c 0x30102b9 0x302006a 0x3030067 0x304006c>; + }; + + leds { + compatible = "gpio-leds"; + pinctrl-0 = <0x7e>; + pinctrl-names = "default"; + + led-0 { + function = "kbd_backlight"; + color = <0x00>; + gpios = <0x2c 0x01 0x00>; + }; + }; +}; diff --git a/devices/nokia-tough/00-nokia-coconut-display.files b/devices/nokia-tough/00-nokia-coconut-display.files new file mode 100644 index 0000000..74d22aa --- /dev/null +++ b/devices/nokia-tough/00-nokia-coconut-display.files @@ -0,0 +1,2 @@ +/lib/firmware/nokia,coconut-gc9305-panel.bin +/lib/firmware/nokia,argon-gc9305-v2-panel.bin diff --git a/devices/nokia-tough/deviceinfo b/devices/nokia-tough/deviceinfo new file mode 100644 index 0000000..452d08f --- /dev/null +++ b/devices/nokia-tough/deviceinfo @@ -0,0 +1,31 @@ +# Reference: +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" diff --git a/devices/nokia-tough/kernel-cmdline.conf b/devices/nokia-tough/kernel-cmdline.conf new file mode 100644 index 0000000..2235027 --- /dev/null +++ b/devices/nokia-tough/kernel-cmdline.conf @@ -0,0 +1,2 @@ +earlycon +console=ttyMSM0,115200 diff --git a/devices/nokia-tough/modules-initfs b/devices/nokia-tough/modules-initfs new file mode 100644 index 0000000..b7b5425 --- /dev/null +++ b/devices/nokia-tough/modules-initfs @@ -0,0 +1,5 @@ +pm8916-lbc +pm8916-bms-vm +panel-mipi-dbi +matrix_keypad +matrix_keymap diff --git a/devices/nokia-tough/nokia,coconut-gc9305-panel.bin b/devices/nokia-tough/nokia,coconut-gc9305-panel.bin new file mode 100644 index 0000000..5aba36d Binary files /dev/null and b/devices/nokia-tough/nokia,coconut-gc9305-panel.bin differ diff --git a/devices/nokia-tough/nokia,coconut-gc9305-panel.txt b/devices/nokia-tough/nokia,coconut-gc9305-panel.txt new file mode 100644 index 0000000..c792514 --- /dev/null +++ b/devices/nokia-tough/nokia,coconut-gc9305-panel.txt @@ -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 diff --git a/devices/nokia-tough/qcom-msm8905-nokia-coconut.dtb b/devices/nokia-tough/qcom-msm8905-nokia-coconut.dtb new file mode 100644 index 0000000..7b4e2c2 Binary files /dev/null and b/devices/nokia-tough/qcom-msm8905-nokia-coconut.dtb differ diff --git a/devices/nokia-tough/qcom-msm8905-nokia-coconut.dts b/devices/nokia-tough/qcom-msm8905-nokia-coconut.dts new file mode 100644 index 0000000..bdc02dd --- /dev/null +++ b/devices/nokia-tough/qcom-msm8905-nokia-coconut.dts @@ -0,0 +1,2238 @@ +/dts-v1/; + +/ { + #address-cells = <0x01>; + #size-cells = <0x01>; + interrupt-parent = <0x01>; + model = "Nokia 800 Tough"; + compatible = "nokia,coconut", "nokia,argon", "qcom,msm8905", "qcom,msm8909"; + chassis-type = "handset"; + + aliases { + mmc0 = "/soc@0/sdhci@7824000"; + mmc1 = "/soc@0/sdhci@7864000"; + serial0 = "/soc@0/serial@78af000"; + }; + + chosen { + stdout-path = "serial0"; + }; + + clocks { + + xo-board { + compatible = "fixed-clock"; + #clock-cells = <0x00>; + clock-frequency = <0x124f800>; + phandle = <0x18>; + }; + + sleep-clk { + compatible = "fixed-clock"; + #clock-cells = <0x00>; + clock-frequency = <0x8000>; + phandle = <0x28>; + }; + }; + + cpus { + #address-cells = <0x01>; + #size-cells = <0x00>; + + cpu@0 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x00>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x07>; + qcom,saw = <0x08>; + phandle = <0x80>; + }; + + cpu@1 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x01>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x09>; + qcom,saw = <0x0a>; + phandle = <0x81>; + }; + + cpu@2 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x02>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x0b>; + qcom,saw = <0x0c>; + phandle = <0x82>; + }; + + cpu@3 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + reg = <0x03>; + next-level-cache = <0x02>; + enable-method = "qcom,msm8909-smp"; + clocks = <0x03>; + #cooling-cells = <0x02>; + power-domains = <0x04 0x01>; + power-domain-names = "perf"; + operating-points-v2 = <0x05>; + cpu-idle-states = <0x06>; + qcom,acc = <0x0d>; + qcom,saw = <0x0e>; + phandle = <0x83>; + }; + + l2-cache { + compatible = "cache"; + cache-level = <0x02>; + phandle = <0x02>; + }; + + idle-states { + + cpu-sleep-0 { + compatible = "qcom,idle-state-spc"; + idle-state-name = "standalone-power-collapse"; + entry-latency-us = <0xb4>; + exit-latency-us = <0xf0>; + min-residency-us = <0x4ec>; + local-timer-stop; + phandle = <0x06>; + }; + }; + }; + + cpu-opp-table { + compatible = "operating-points-v2-kryo-cpu", "operating-points-v2"; + nvmem-cells = <0x0f>; + opp-shared; + phandle = <0x05>; + + opp-199999951 { + opp-hz = <0x00 0xbebc1cf>; + required-opps = <0x10>; + opp-supported-hw = <0xff>; + }; + + opp-399999902 { + opp-hz = <0x00 0x17d7839e>; + required-opps = <0x11>; + opp-supported-hw = <0xff>; + }; + + opp-533333202 { + opp-hz = <0x00 0x1fca04d2>; + required-opps = <0x11>; + opp-supported-hw = <0xff>; + }; + + opp-799999804 { + opp-hz = <0x00 0x2faf073c>; + required-opps = <0x12>; + opp-supported-hw = <0xff>; + }; + + opp-998400000 { + opp-hz = <0x00 0x3b826000>; + required-opps = <0x12>; + opp-supported-hw = <0x05>; + }; + + opp-1094400000 { + opp-hz = <0x00 0x413b3800>; + required-opps = <0x13>; + opp-supported-hw = <0x05>; + }; + + opp-1248000000 { + opp-hz = <0x00 0x4a62f800>; + required-opps = <0x13>; + opp-supported-hw = <0x01>; + }; + + opp-1267200000 { + opp-hz = <0x00 0x4b87f000>; + required-opps = <0x13>; + opp-supported-hw = <0x01>; + }; + }; + + firmware { + + scm { + compatible = "qcom,scm-msm8916", "qcom,scm"; + clocks = <0x14 0x3d 0x14 0x3f 0x14 0x3e>; + clock-names = "core", "bus", "iface"; + qcom,dload-mode = <0x15 0x6100>; + }; + }; + + memory@80000000 { + device_type = "memory"; + reg = <0x80000000 0x00>; + }; + + pmu { + compatible = "arm,cortex-a7-pmu"; + interrupts = <0x01 0x07 0xf04>; + }; + + reserved-memory { + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + tz-apps@87a00000 { + reg = <0x87a00000 0x200000>; + no-map; + }; + + rfsa@87ce0000 { + reg = <0x87ce0000 0x20000>; + no-map; + }; + + smem@87d00000 { + compatible = "qcom,smem"; + reg = <0x87d00000 0x100000>; + no-map; + hwlocks = <0x16 0x03>; + qcom,rpm-msg-ram = <0x17>; + }; + + tz@87e00000 { + reg = <0x87e00000 0x200000>; + no-map; + }; + + mpss@88000000 { + reg = <0x88000000 0x5500000>; + no-map; + phandle = <0x36>; + }; + + wcnss@8d500000 { + reg = <0x8d500000 0x700000>; + no-map; + phandle = <0x74>; + }; + + mba@8dc00000 { + reg = <0x8dc00000 0x100000>; + no-map; + phandle = <0x35>; + }; + + rmtfs@9f700000 { + compatible = "qcom,rmtfs-mem"; + reg = <0x9f700000 0x300000>; + no-map; + qcom,client-id = <0x01>; + }; + }; + + smd { + compatible = "qcom,smd"; + + rpm { + interrupts = <0x00 0xa8 0x01>; + qcom,ipc = <0x03 0x08 0x00>; + qcom,smd-edge = <0x0f>; + + rpm-requests { + compatible = "qcom,rpm-msm8909"; + qcom,smd-channels = "rpm_requests"; + + clock-controller { + compatible = "qcom,rpmcc-msm8909", "qcom,rpmcc"; + #clock-cells = <0x01>; + clocks = <0x18>; + clock-names = "xo"; + phandle = <0x78>; + }; + + power-controller { + compatible = "qcom,msm8909-rpmpd"; + #power-domain-cells = <0x01>; + operating-points-v2 = <0x19>; + phandle = <0x04>; + + opp-table { + compatible = "operating-points-v2"; + phandle = <0x19>; + + opp1 { + opp-level = <0x01>; + phandle = <0x10>; + }; + + opp2 { + opp-level = <0x02>; + }; + + opp3 { + opp-level = <0x03>; + phandle = <0x11>; + }; + + opp4 { + opp-level = <0x04>; + phandle = <0x12>; + }; + + opp5 { + opp-level = <0x05>; + }; + + opp6 { + opp-level = <0x06>; + phandle = <0x13>; + }; + }; + }; + + pm8909-regulators { + compatible = "qcom,rpm-pm8909-regulators"; + + s2 { + regulator-min-microvolt = <0x1c3a90>; + regulator-max-microvolt = <0x1c3a90>; + phandle = <0x30>; + }; + + l1 { + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0xf4240>; + }; + + l2 { + regulator-min-microvolt = <0x124f80>; + regulator-max-microvolt = <0x124f80>; + }; + + l4 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + }; + + l5 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x2f>; + }; + + l6 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x6d>; + }; + + l7 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x34>; + }; + + l8 { + regulator-min-microvolt = <0x2b7cd0>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x49>; + }; + + l9 { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x325aa0>; + phandle = <0x7a>; + }; + + l10 { + regulator-min-microvolt = <0x12b128>; + regulator-max-microvolt = <0x13d620>; + phandle = <0x79>; + }; + + l11 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2d0370>; + regulator-system-load = <0x30d40>; + regulator-allow-set-load; + phandle = <0x50>; + }; + + l12 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2d0370>; + phandle = <0x51>; + }; + + l13 { + regulator-min-microvolt = <0x2eebb8>; + regulator-max-microvolt = <0x2eebb8>; + phandle = <0x31>; + }; + + l14 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2dc6c0>; + }; + + l15 { + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x2dc6c0>; + }; + + l17 { + regulator-min-microvolt = <0x2b7cd0>; + regulator-max-microvolt = <0x2b7cd0>; + phandle = <0x6c>; + }; + + l18 { + regulator-min-microvolt = <0x2932e0>; + regulator-max-microvolt = <0x2932e0>; + }; + }; + }; + }; + }; + + smp2p-hexagon { + compatible = "qcom,smp2p"; + qcom,smem = <0x1b3 0x1ac>; + interrupts = <0x00 0x1b 0x01>; + qcom,ipc = <0x03 0x08 0x0e>; + qcom,local-pid = <0x00>; + qcom,remote-pid = <0x01>; + + master-kernel { + qcom,entry-name = "master-kernel"; + #qcom,smem-state-cells = <0x01>; + phandle = <0x33>; + }; + + slave-kernel { + qcom,entry-name = "slave-kernel"; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x32>; + }; + }; + + smp2p-wcnss { + compatible = "qcom,smp2p"; + qcom,smem = <0x1c3 0x1af>; + interrupts = <0x00 0x8f 0x01>; + qcom,ipc = <0x03 0x08 0x12>; + qcom,local-pid = <0x00>; + qcom,remote-pid = <0x04>; + + master-kernel { + qcom,entry-name = "master-kernel"; + #qcom,smem-state-cells = <0x01>; + phandle = <0x76>; + }; + + slave-kernel { + qcom,entry-name = "slave-kernel"; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x75>; + }; + }; + + smsm { + compatible = "qcom,smsm"; + #address-cells = <0x01>; + #size-cells = <0x00>; + qcom,ipc-1 = <0x03 0x08 0x0d>; + qcom,ipc-3 = <0x03 0x08 0x13>; + + apps@0 { + reg = <0x00>; + #qcom,smem-state-cells = <0x01>; + phandle = <0x38>; + }; + + hexagon@1 { + reg = <0x01>; + interrupts = <0x00 0x1a 0x01>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x37>; + }; + + wcnss@6 { + reg = <0x06>; + interrupts = <0x00 0x90 0x01>; + interrupt-controller; + #interrupt-cells = <0x02>; + }; + }; + + soc@0 { + compatible = "simple-bus"; + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + rng@22000 { + compatible = "qcom,prng"; + reg = <0x22000 0x200>; + clocks = <0x14 0x44>; + clock-names = "core"; + }; + + qfprom@5c000 { + compatible = "qcom,qfprom"; + reg = <0x5c000 0x1000>; + #address-cells = <0x01>; + #size-cells = <0x01>; + + speedbin@c { + reg = <0x0c 0x01>; + bits = <0x02 0x03>; + phandle = <0x0f>; + }; + + s0-p1@a0 { + reg = <0xa0 0x01>; + bits = <0x00 0x06>; + phandle = <0x1d>; + }; + + s0-p2@a0 { + reg = <0xa0 0x02>; + bits = <0x06 0x06>; + phandle = <0x1e>; + }; + + s1-p1@a1 { + reg = <0xa1 0x02>; + bits = <0x04 0x06>; + phandle = <0x1f>; + }; + + s1-p2@a2 { + reg = <0xa2 0x01>; + bits = <0x02 0x06>; + phandle = <0x20>; + }; + + s2-p1@a3 { + reg = <0xa3 0x01>; + bits = <0x00 0x06>; + phandle = <0x21>; + }; + + s2-p2@a3 { + reg = <0xa3 0x02>; + bits = <0x06 0x06>; + phandle = <0x22>; + }; + + s3-p1@a4 { + reg = <0xa4 0x02>; + bits = <0x04 0x06>; + phandle = <0x23>; + }; + + s3-p2@a5 { + reg = <0xa5 0x01>; + bits = <0x02 0x06>; + phandle = <0x24>; + }; + + s4-p1@a6 { + reg = <0xa6 0x01>; + bits = <0x00 0x06>; + phandle = <0x25>; + }; + + s4-p2@a6 { + reg = <0xa6 0x02>; + bits = <0x06 0x06>; + phandle = <0x26>; + }; + + base1@dc { + reg = <0xdc 0x01>; + bits = <0x00 0x08>; + phandle = <0x1b>; + }; + + base2@dd { + reg = <0xdd 0x01>; + bits = <0x00 0x08>; + phandle = <0x1c>; + }; + + mode@de { + reg = <0xde 0x01>; + bits = <0x00 0x03>; + phandle = <0x1a>; + }; + }; + + sram@60000 { + compatible = "qcom,rpm-msg-ram"; + reg = <0x60000 0x8000>; + phandle = <0x17>; + }; + + sram@290000 { + compatible = "qcom,rpm-stats"; + reg = <0x290000 0x10000>; + }; + + thermal-sensor@4a9000 { + compatible = "qcom,msm8909-tsens", "qcom,tsens-v0_1"; + reg = <0x4a9000 0x1000 0x4a8000 0x1000>; + nvmem-cells = <0x1a 0x1b 0x1c 0x1d 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25 0x26>; + nvmem-cell-names = "mode", "base1", "base2", "s0_p1", "s0_p2", "s1_p1", "s1_p2", "s2_p1", "s2_p2", "s3_p1", "s3_p2", "s4_p1", "s4_p2"; + interrupts = <0x00 0xb8 0x04>; + interrupt-names = "uplow"; + #thermal-sensor-cells = <0x01>; + #qcom,sensors = <0x05>; + phandle = <0x7e>; + }; + + restart@4ab000 { + compatible = "qcom,pshold"; + reg = <0x4ab000 0x04>; + }; + + pinctrl@1000000 { + compatible = "qcom,msm8909-tlmm"; + reg = <0x1000000 0x300000>; + interrupts = <0x00 0xd0 0x04>; + gpio-controller; + #gpio-cells = <0x02>; + gpio-ranges = <0x27 0x00 0x00 0x75>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x27>; + + blsp-i2c1-default-state { + pins = "gpio6", "gpio7"; + function = "blsp_i2c1"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x57>; + }; + + blsp-i2c1-sleep-state { + pins = "gpio6", "gpio7"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x58>; + }; + + blsp-i2c2-default-state { + pins = "gpio111", "gpio112"; + function = "blsp_i2c2"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5b>; + }; + + blsp-i2c2-sleep-state { + pins = "gpio111", "gpio112"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5c>; + }; + + blsp-i2c3-default-state { + pins = "gpio29", "gpio30"; + function = "blsp_i2c3"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x5f>; + }; + + blsp-i2c3-sleep-state { + pins = "gpio29", "gpio30"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x60>; + }; + + blsp-i2c4-default-state { + pins = "gpio14", "gpio15"; + function = "blsp_i2c4"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x63>; + }; + + blsp-i2c4-sleep-state { + pins = "gpio14", "gpio15"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x64>; + }; + + blsp-i2c5-default-state { + pins = "gpio18", "gpio19"; + function = "blsp_i2c5"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x67>; + }; + + blsp-i2c5-sleep-state { + pins = "gpio18", "gpio19"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x68>; + }; + + blsp-i2c6-default-state { + pins = "gpio10", "gpio11"; + function = "blsp_i2c6"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x6f>; + }; + + blsp-i2c6-sleep-state { + pins = "gpio10", "gpio11"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x70>; + }; + + blsp-spi1-default-state { + pins = "gpio4", "gpio5", "gpio6", "gpio7"; + function = "blsp_spi1"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x59>; + }; + + blsp-spi1-sleep-state { + pins = "gpio4", "gpio5", "gpio6", "gpio7"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x5a>; + }; + + blsp-spi2-default-state { + pins = "gpio20", "gpio21", "gpio111", "gpio112"; + function = "blsp_spi2"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x5d>; + }; + + blsp-spi2-sleep-state { + pins = "gpio20", "gpio21", "gpio111", "gpio112"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x5e>; + }; + + blsp-spi3-default-state { + pins = "gpio0", "gpio1", "gpio2", "gpio3"; + function = "blsp_spi3"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x61>; + }; + + blsp-spi3-sleep-state { + pins = "gpio0", "gpio1", "gpio2", "gpio3"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x62>; + }; + + blsp-spi4-default-state { + pins = "gpio12", "gpio13", "gpio14", "gpio15"; + function = "blsp_spi4"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x65>; + }; + + blsp-spi4-sleep-state { + pins = "gpio12", "gpio13", "gpio14", "gpio15"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x66>; + }; + + blsp-spi5-default-state { + pins = "gpio16", "gpio17", "gpio18", "gpio19"; + function = "blsp_spi5"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x69>; + }; + + blsp-spi5-sleep-state { + pins = "gpio16", "gpio17", "gpio18", "gpio19"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x6a>; + }; + + blsp-spi6-default-state { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "blsp_spi6"; + drive-strength = <0x0c>; + bias-disable; + phandle = <0x71>; + }; + + blsp-spi6-sleep-state { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x72>; + }; + + blsp-uart1-default-state { + pins = "gpio4", "gpio5"; + function = "blsp_uart1"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x53>; + }; + + blsp-uart1-sleep-state { + pins = "gpio4", "gpio5"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x54>; + }; + + blsp-uart2-default-state { + pins = "gpio20", "gpio21"; + function = "blsp_uart2"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x55>; + }; + + blsp-uart2-sleep-state { + pins = "gpio20", "gpio21"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x56>; + }; + + sdc1-clk-on-state { + pins = "sdc1_clk"; + bias-disable; + drive-strength = <0x10>; + phandle = <0x43>; + }; + + sdc1-clk-off-state { + pins = "sdc1_clk"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x46>; + }; + + sdc1-cmd-on-state { + pins = "sdc1_cmd"; + bias-disable; + drive-strength = <0x0a>; + phandle = <0x44>; + }; + + sdc1-cmd-off-state { + pins = "sdc1_cmd"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x47>; + }; + + sdc1-data-on-state { + pins = "sdc1_data"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x45>; + }; + + sdc1-data-off-state { + pins = "sdc1_data"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x48>; + }; + + sdc2-clk-on-state { + pins = "sdc2_clk"; + drive-strength = <0x10>; + bias-disable; + phandle = <0x4a>; + }; + + sdc2-clk-off-state { + pins = "sdc2_clk"; + bias-disable; + drive-strength = <0x02>; + phandle = <0x4d>; + }; + + sdc2-cmd-on-state { + pins = "sdc2_cmd"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x4b>; + }; + + sdc2-cmd-off-state { + pins = "sdc2_cmd"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x4e>; + }; + + sdc2-data-on-state { + pins = "sdc2_data"; + bias-pull-up; + drive-strength = <0x0a>; + phandle = <0x4c>; + }; + + sdc2-data-off-state { + pins = "sdc2_data"; + bias-pull-up; + drive-strength = <0x02>; + phandle = <0x4f>; + }; + + wcnss-active-state { + pins = "gpio40", "gpio41", "gpio42", "gpio43", "gpio44"; + function = "wcss_wlan"; + drive-strength = <0x06>; + bias-pull-up; + phandle = <0x77>; + }; + + cdc-pdm-lines { + + pdm-lines-on { + pins = "gpio59", "gpio60", "gpio61", "gpio62", "gpio63", "gpio64"; + function = "cdc_pdm0"; + drive-strength = <0x08>; + bias-disable; + phandle = <0x3a>; + }; + + pdm-lines-off { + pins = "gpio59", "gpio60", "gpio61", "gpio62", "gpio63", "gpio64"; + function = "cdc_pdm0"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x3b>; + }; + }; + + gpio-key-active-state { + pins = "gpio90", "gpio98"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-up; + phandle = <0x86>; + }; + + lid-switch-active-state { + pins = "gpio36", "gpio92"; + function = "gpio"; + drive-strength = <0x06>; + bias-pull-up; + phandle = <0x87>; + }; + + matrix-keypad-row-gpio-state { + pins = "gpio94", "gpio95", "gpio96", "gpio97"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-up; + phandle = <0x88>; + }; + + matrix-keypad-col-default-state { + pins = "gpio52", "gpio56", "gpio7", "gpio99", "gpio6"; + function = "gpio"; + drive-strength = <0x02>; + bias-disable; + phandle = <0x89>; + }; + + panel-gpios-default-state { + pins = "gpio24", "gpio25", "gpio110"; + function = "gpio"; + drive-strength = <0x02>; + bias-pull-down; + phandle = <0x6e>; + }; + }; + + clock-controller@1800000 { + compatible = "qcom,gcc-msm8909"; + reg = <0x1800000 0x80000>; + #clock-cells = <0x01>; + #reset-cells = <0x01>; + #power-domain-cells = <0x01>; + clocks = <0x18 0x28 0x00 0x00>; + clock-names = "xo", "sleep_clk", "dsi0pll", "dsi0pllbyte"; + phandle = <0x14>; + }; + + hwlock@1905000 { + compatible = "qcom,tcsr-mutex"; + reg = <0x1905000 0x20000>; + #hwlock-cells = <0x01>; + phandle = <0x16>; + }; + + syscon@1937000 { + compatible = "qcom,tcsr-msm8909", "syscon"; + reg = <0x1937000 0x30000>; + phandle = <0x15>; + }; + + spmi@200f000 { + compatible = "qcom,spmi-pmic-arb"; + reg = <0x200f000 0x1000 0x2400000 0x400000 0x2c00000 0x400000 0x3800000 0x200000 0x200a000 0x2100>; + reg-names = "core", "chnls", "obsrvr", "intr", "cnfg"; + interrupt-names = "periph_irq"; + interrupts = <0x00 0xbe 0x04>; + qcom,ee = <0x00>; + qcom,channel = <0x00>; + #address-cells = <0x02>; + #size-cells = <0x00>; + interrupt-controller; + #interrupt-cells = <0x04>; + phandle = <0x2e>; + + pmic@0 { + compatible = "qcom,pm8909", "qcom,spmi-pmic"; + reg = <0x00 0x00>; + #address-cells = <0x01>; + #size-cells = <0x00>; + + pon@800 { + compatible = "qcom,pm8916-pon"; + reg = <0x800>; + mode-bootloader = <0x02>; + mode-recovery = <0x01>; + + pwrkey { + compatible = "qcom,pm8941-pwrkey"; + interrupts = <0x00 0x08 0x00 0x03>; + debounce = <0x3d09>; + bias-pull-up; + linux,code = <0x74>; + }; + + resin { + compatible = "qcom,pm8941-resin"; + interrupts = <0x00 0x08 0x01 0x03>; + debounce = <0x3d09>; + bias-pull-up; + status = "okay"; + linux,code = <0x6c>; + }; + + watchdog { + compatible = "qcom,pm8916-wdt"; + interrupts = <0x00 0x08 0x06 0x01>; + timeout-sec = <0x3c>; + }; + }; + + charger@1000 { + compatible = "qcom,pm8916-lbc"; + reg = <0x1000 0x1200 0x1300 0x1600>; + reg-names = "chgr", "bat_if", "usb", "misc"; + interrupts = <0x00 0x10 0x00 0x03 0x00 0x10 0x05 0x03 0x00 0x10 0x06 0x03 0x00 0x10 0x07 0x03 0x00 0x12 0x00 0x03 0x00 0x12 0x01 0x03 0x00 0x13 0x00 0x03 0x00 0x13 0x01 0x03 0x00 0x13 0x02 0x03 0x00 0x13 0x04 0x03>; + interrupt-names = "vbat_det", "fast_chg", "chg_fail", "chg_done", "bat_pres", "temp_ok", "coarse_det", "usb_vbus", "chg_gone", "overtemp"; + status = "okay"; + qcom,fast-charge-safe-current = <0x57e40>; + qcom,fast-charge-safe-voltage = <0x426030>; + monitored-battery = <0x29>; + phandle = <0x2a>; + }; + + extcon@1300 { + compatible = "qcom,pm8941-misc"; + reg = <0x1300>; + interrupts = <0x00 0x13 0x01 0x03>; + interrupt-names = "usb_vbus"; + status = "disabled"; + }; + + vm-bms@4000 { + compatible = "qcom,pm8916-bms-vm"; + reg = <0x4000>; + interrupts = <0x00 0x40 0x00 0x01 0x00 0x40 0x01 0x01 0x00 0x40 0x02 0x01 0x00 0x40 0x03 0x01 0x00 0x40 0x04 0x01 0x00 0x40 0x05 0x01>; + interrupt-names = "cv_leave", "cv_enter", "ocv_good", "ocv_thr", "fifo", "state_chg"; + status = "okay"; + monitored-battery = <0x29>; + power-supplies = <0x2a>; + }; + + rtc@6000 { + compatible = "qcom,pm8941-rtc"; + reg = <0x6000>; + interrupts = <0x00 0x61 0x01 0x01>; + }; + + mpps@a000 { + compatible = "qcom,pm8916-mpp", "qcom,spmi-mpp"; + reg = <0xa000>; + gpio-controller; + #gpio-cells = <0x02>; + gpio-ranges = <0x2b 0x00 0x00 0x04>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x2b>; + + mpp2-state { + pins = "mpp2"; + function = "digital"; + power-source = <0x00>; + output-low; + qcom,dtest = <0x01>; + phandle = <0x2d>; + }; + }; + + gpios@c000 { + compatible = "qcom,pm8916-gpio", "qcom,spmi-gpio"; + reg = <0xc000>; + gpio-controller; + gpio-ranges = <0x2c 0x00 0x00 0x04>; + #gpio-cells = <0x02>; + interrupt-controller; + #interrupt-cells = <0x02>; + phandle = <0x2c>; + + keypad-backlight-default-state { + pins = "gpio1"; + function = "normal"; + output-low; + power-source = <0x03>; + phandle = <0x8a>; + }; + }; + }; + + pmic@1 { + compatible = "qcom,pm8909", "qcom,spmi-pmic"; + reg = <0x01 0x00>; + #address-cells = <0x01>; + #size-cells = <0x00>; + + pwm { + compatible = "qcom,pm8916-pwm"; + #pwm-cells = <0x02>; + status = "okay"; + pinctrl-0 = <0x2d>; + pinctrl-names = "default"; + phandle = <0x85>; + }; + + vibrator@c000 { + compatible = "qcom,pm8916-vib"; + reg = <0xc000>; + status = "okay"; + }; + + audio-codec@f000 { + compatible = "qcom,pm8916-wcd-analog-codec"; + reg = <0xf000>; + reg-names = "pmic-codec-core"; + interrupt-parent = <0x2e>; + interrupts = <0x01 0xf0 0x00 0x00 0x01 0xf0 0x01 0x00 0x01 0xf0 0x02 0x00 0x01 0xf0 0x03 0x00 0x01 0xf0 0x04 0x00 0x01 0xf0 0x05 0x00 0x01 0xf0 0x06 0x00 0x01 0xf0 0x07 0x00 0x01 0xf1 0x00 0x00 0x01 0xf1 0x01 0x00 0x01 0xf1 0x02 0x00 0x01 0xf1 0x03 0x00 0x01 0xf1 0x04 0x00 0x01 0xf1 0x05 0x00>; + interrupt-names = "cdc_spk_cnp_int", "cdc_spk_clip_int", "cdc_spk_ocp_int", "mbhc_ins_rem_det1", "mbhc_but_rel_det", "mbhc_but_press_det", "mbhc_ins_rem_det", "mbhc_switch_int", "cdc_ear_ocp_int", "cdc_hphr_ocp_int", "cdc_hphl_ocp_det", "cdc_ear_cnp_int", "cdc_hphr_cnp_int", "cdc_hphl_cnp_int"; + #sound-dai-cells = <0x01>; + status = "okay"; + qcom,hphl-jack-type-normally-open; + qcom,micbias1-ext-cap; + qcom,micbias2-ext-cap; + qcom,mbhc-vthreshold-low = <0x55 0x78 0xe1 0x1c2 0x1f4>; + qcom,mbhc-vthreshold-high = <0x55 0x78 0xe1 0x1c2 0x1f4>; + vdd-cdc-io-supply = <0x2f>; + vdd-cdc-tx-rx-cx-supply = <0x30>; + vdd-micbias-supply = <0x31>; + phandle = <0x41>; + }; + }; + }; + + dma-controller@4044000 { + compatible = "qcom,bam-v1.7.0"; + reg = <0x4044000 0x19000>; + interrupts = <0x00 0x1d 0x04>; + #dma-cells = <0x01>; + qcom,ee = <0x00>; + num-channels = <0x06>; + qcom,num-ees = <0x01>; + qcom,powered-remotely; + phandle = <0x39>; + }; + + remoteproc@4080000 { + compatible = "qcom,msm8909-mss-pil"; + reg = <0x4080000 0x100 0x4020000 0x40>; + reg-names = "qdsp6", "rmb"; + interrupts-extended = <0x01 0x00 0x18 0x01 0x32 0x00 0x01 0x32 0x01 0x01 0x32 0x02 0x01 0x32 0x03 0x01>; + interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack"; + power-domains = <0x04 0x00 0x04 0x04>; + power-domain-names = "cx", "mx"; + clocks = <0x14 0x79 0x14 0x7a 0x14 0x3c 0x18>; + clock-names = "iface", "bus", "mem", "xo"; + qcom,smem-states = <0x33 0x00>; + qcom,smem-state-names = "stop"; + resets = <0x14 0x29>; + reset-names = "mss_restart"; + qcom,halt-regs = <0x15 0x18000 0x19000 0x1a000>; + status = "okay"; + pll-supply = <0x34>; + + mba { + memory-region = <0x35>; + }; + + mpss { + memory-region = <0x36>; + }; + + bam-dmux { + compatible = "qcom,bam-dmux"; + interrupt-parent = <0x37>; + interrupts = <0x01 0x03 0x0b 0x03>; + interrupt-names = "pc", "pc-ack"; + qcom,smem-states = <0x38 0x01 0x38 0x0b>; + qcom,smem-state-names = "pc", "pc-ack"; + dmas = <0x39 0x04 0x39 0x05>; + dma-names = "tx", "rx"; + }; + + smd-edge { + interrupts = <0x00 0x19 0x01>; + qcom,smd-edge = <0x00>; + qcom,ipc = <0x03 0x08 0x0c>; + qcom,remote-pid = <0x01>; + label = "hexagon"; + + apr { + compatible = "qcom,apr-v2"; + qcom,smd-channels = "apr_audio_svc"; + qcom,apr-domain = <0x04>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "okay"; + + apr-service@3 { + reg = <0x03>; + compatible = "qcom,q6core"; + }; + + apr-service@4 { + compatible = "qcom,q6afe"; + reg = <0x04>; + + dais { + compatible = "qcom,q6afe-dais"; + #address-cells = <0x01>; + #size-cells = <0x00>; + #sound-dai-cells = <0x01>; + phandle = <0x3e>; + + dai@16 { + reg = <0x10>; + qcom,sd-lines = <0x00 0x01>; + }; + + dai@20 { + reg = <0x15>; + qcom,sd-lines = <0x00 0x01>; + }; + }; + + clock-controller { + compatible = "qcom,q6afe-clocks"; + #clock-cells = <0x02>; + phandle = <0x42>; + }; + }; + + apr-service@7 { + compatible = "qcom,q6asm"; + reg = <0x07>; + + dais { + compatible = "qcom,q6asm-dais"; + #address-cells = <0x01>; + #size-cells = <0x00>; + #sound-dai-cells = <0x01>; + phandle = <0x3c>; + + dai@0 { + reg = <0x00>; + direction = <0x02>; + }; + + dai@1 { + reg = <0x01>; + direction = <0x01>; + }; + + dai@2 { + reg = <0x02>; + direction = <0x02>; + }; + + dai@3 { + reg = <0x03>; + direction = <0x02>; + is-compress-dai; + }; + }; + }; + + apr-service@8 { + compatible = "qcom,q6adm"; + reg = <0x08>; + + routing { + compatible = "qcom,q6adm-routing"; + #sound-dai-cells = <0x00>; + phandle = <0x3f>; + }; + }; + + apr-service@9 { + compatible = "qcom,q6mvm"; + reg = <0x09>; + + dais { + compatible = "qcom,q6voice-dais"; + #sound-dai-cells = <0x01>; + phandle = <0x3d>; + }; + }; + + apr-service@a { + compatible = "qcom,q6cvs"; + reg = <0x0a>; + }; + + apr-service@b { + compatible = "qcom,q6cvp"; + reg = <0x0b>; + }; + }; + }; + }; + + sound@7702000 { + status = "okay"; + compatible = "qcom,msm8916-qdsp6-sndcard"; + reg = <0x7702000 0x04 0x7702004 0x04>; + reg-names = "mic-iomux", "spkr-iomux"; + model = "msm8916"; + audio-routing = "AMIC1", "MIC BIAS External1", "AMIC2", "MIC BIAS Internal2", "AMIC3", "MIC BIAS External1"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x3a>; + pinctrl-1 = <0x3b>; + + dai-link-multimedia1 { + link-name = "MultiMedia1"; + + cpu { + sound-dai = <0x3c 0x00>; + }; + }; + + dai-link-multimedia2 { + link-name = "MultiMedia2"; + + cpu { + sound-dai = <0x3c 0x01>; + }; + }; + + dai-link-multimedia3 { + link-name = "MultiMedia3"; + + cpu { + sound-dai = <0x3c 0x02>; + }; + }; + + dai-link-multimedia4 { + link-name = "MultiMedia4"; + + cpu { + sound-dai = <0x3c 0x03>; + }; + }; + + dai-link-voicemmode1 { + link-name = "VoiceMMode1"; + + cpu { + sound-dai = <0x3d 0x01>; + }; + }; + + dai-link-primary { + link-name = "Primary MI2S"; + + cpu { + sound-dai = <0x3e 0x10>; + }; + + platform { + sound-dai = <0x3f>; + }; + + codec { + sound-dai = <0x40 0x00 0x41 0x00>; + }; + }; + + dai-link-secondary { + link-name = "Secondary MI2S"; + status = "disabled"; + + cpu { + sound-dai = <0x3e 0x12>; + }; + + platform { + sound-dai = <0x3f>; + }; + }; + + dai-link-tertiary { + link-name = "Tertiary MI2S"; + + cpu { + sound-dai = <0x3e 0x15>; + }; + + platform { + sound-dai = <0x3f>; + }; + + codec { + sound-dai = <0x40 0x01 0x41 0x01>; + }; + }; + + dai-link-quaternary { + link-name = "Quaternary MI2S"; + status = "disabled"; + + cpu { + sound-dai = <0x3e 0x16>; + }; + + platform { + sound-dai = <0x3f>; + }; + }; + }; + + audio-codec@771c000 { + compatible = "qcom,msm8916-wcd-digital-codec"; + reg = <0x771c000 0x400>; + clocks = <0x18 0x42 0x32 0x01>; + clock-names = "ahbix-clk", "mclk"; + assigned-clocks = <0x42 0x32 0x01>; + assigned-clock-rates = <0x927c00>; + #sound-dai-cells = <0x01>; + phandle = <0x40>; + }; + + sdhci@7824000 { + compatible = "qcom,msm8916-sdhci", "qcom,sdhci-msm-v4"; + reg = <0x7824900 0x11c 0x7824000 0x800>; + reg-names = "hc_mem", "core_mem"; + interrupts = <0x00 0x7b 0x04 0x00 0x8a 0x04>; + interrupt-names = "hc_irq", "pwr_irq"; + clocks = <0x14 0x80 0x14 0x7f 0x18>; + clock-names = "core", "iface", "xo"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x43 0x44 0x45>; + pinctrl-1 = <0x46 0x47 0x48>; + mmc-hs200-1_8v; + mmc-ddr-1_8v; + bus-width = <0x08>; + non-removable; + status = "okay"; + vmmc-supply = <0x49>; + vqmmc-supply = <0x2f>; + }; + + sdhci@7864000 { + compatible = "qcom,msm8916-sdhci", "qcom,sdhci-msm-v4"; + reg = <0x7864900 0x11c 0x7864000 0x800>; + reg-names = "hc_mem", "core_mem"; + interrupts = <0x00 0x7d 0x04 0x00 0xdd 0x04>; + interrupt-names = "hc_irq", "pwr_irq"; + clocks = <0x14 0x82 0x14 0x81 0x18>; + clock-names = "core", "iface", "xo"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4a 0x4b 0x4c>; + pinctrl-1 = <0x4d 0x4e 0x4f>; + bus-width = <0x04>; + status = "okay"; + vmmc-supply = <0x50>; + vqmmc-supply = <0x51>; + non-removable; + }; + + dma-controller@7884000 { + compatible = "qcom,bam-v1.7.0"; + reg = <0x7884000 0x23000>; + interrupts = <0x00 0xee 0x04>; + clocks = <0x14 0x3a>; + clock-names = "bam_clk"; + #dma-cells = <0x01>; + qcom,ee = <0x00>; + qcom,controlled-remotely; + phandle = <0x52>; + }; + + serial@78af000 { + compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; + reg = <0x78af000 0x200>; + interrupts = <0x00 0x6b 0x04>; + clocks = <0x14 0x56 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x00 0x52 0x01>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x53>; + pinctrl-1 = <0x54>; + status = "okay"; + }; + + serial@78b0000 { + compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; + reg = <0x78b0000 0x200>; + interrupts = <0x00 0x6c 0x04>; + clocks = <0x14 0x57 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x02 0x52 0x03>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x55>; + pinctrl-1 = <0x56>; + status = "disabled"; + }; + + i2c@78b5000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b5000 0x500>; + interrupts = <0x00 0x5f 0x04>; + clocks = <0x14 0x4a 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x04 0x52 0x05>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x57>; + pinctrl-1 = <0x58>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b5000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b5000 0x500>; + interrupts = <0x00 0x5f 0x04>; + clocks = <0x14 0x4b 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x04 0x52 0x05>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x59>; + pinctrl-1 = <0x5a>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b6000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b6000 0x500>; + interrupts = <0x00 0x60 0x04>; + clocks = <0x14 0x4c 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x06 0x52 0x07>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5b>; + pinctrl-1 = <0x5c>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b6000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b6000 0x500>; + interrupts = <0x00 0x60 0x04>; + clocks = <0x14 0x4d 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x06 0x52 0x07>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5d>; + pinctrl-1 = <0x5e>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b7000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b7000 0x500>; + interrupts = <0x00 0x61 0x04>; + clocks = <0x14 0x4e 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x08 0x52 0x09>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x5f>; + pinctrl-1 = <0x60>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b7000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b7000 0x500>; + interrupts = <0x00 0x61 0x04>; + clocks = <0x14 0x4f 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x08 0x52 0x09>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x61>; + pinctrl-1 = <0x62>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b8000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b8000 0x500>; + interrupts = <0x00 0x62 0x04>; + clocks = <0x14 0x50 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0a 0x52 0x0b>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x63>; + pinctrl-1 = <0x64>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b8000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b8000 0x500>; + interrupts = <0x00 0x62 0x04>; + clocks = <0x14 0x51 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0a 0x52 0x0b>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x65>; + pinctrl-1 = <0x66>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + i2c@78b9000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78b9000 0x500>; + interrupts = <0x00 0x63 0x04>; + clocks = <0x14 0x52 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0c 0x52 0x0d>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x67>; + pinctrl-1 = <0x68>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78b9000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78b9000 0x500>; + interrupts = <0x00 0x63 0x04>; + clocks = <0x14 0x53 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0c 0x52 0x0d>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x69>; + pinctrl-1 = <0x6a>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "okay"; + + display@0 { + compatible = "nokia,coconut-gc9305-panel", "nokia,argon-gc9305-v2-panel", "panel-mipi-dbi-spi"; + reg = <0x00>; + backlight = <0x6b>; + reset-gpios = <0x27 0x19 0x00>; + dc-gpios = <0x27 0x6e 0x00>; + spi-max-frequency = <0x2faf080>; + power-supply = <0x6c>; + io-supply = <0x6d>; + width-mm = <0x24>; + height-mm = <0x30>; + pinctrl-0 = <0x6e>; + pinctrl-names = "default"; + + panel-timing { + hactive = <0xf0>; + vactive = <0x140>; + hback-porch = <0x00>; + vback-porch = <0x00>; + hfront-porch = <0x00>; + vfront-porch = <0x00>; + hsync-len = <0x00>; + vsync-len = <0x00>; + clock-frequency = "", "#("; + }; + }; + }; + + i2c@78ba000 { + compatible = "qcom,i2c-qup-v2.2.1"; + reg = <0x78ba000 0x500>; + interrupts = <0x00 0x64 0x04>; + clocks = <0x14 0x54 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0e 0x52 0x0f>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x6f>; + pinctrl-1 = <0x70>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + spi@78ba000 { + compatible = "qcom,spi-qup-v2.2.1"; + reg = <0x78ba000 0x500>; + interrupts = <0x00 0x64 0x04>; + clocks = <0x14 0x55 0x14 0x3a>; + clock-names = "core", "iface"; + dmas = <0x52 0x0e 0x52 0x0f>; + dma-names = "tx", "rx"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x71>; + pinctrl-1 = <0x72>; + #address-cells = <0x01>; + #size-cells = <0x00>; + status = "disabled"; + }; + + usb@78d9000 { + compatible = "qcom,ci-hdrc"; + reg = <0x78d9000 0x200 0x78d9200 0x200>; + interrupts = <0x00 0x86 0x04 0x00 0x8c 0x04>; + clocks = <0x14 0x8d 0x14 0x8f>; + clock-names = "iface", "core"; + assigned-clocks = <0x14 0x8f>; + assigned-clock-rates = <0x4c4b400>; + resets = <0x14 0x27>; + reset-names = "core"; + phy_type = "ulpi"; + dr_mode = "otg"; + hnp-disable; + srp-disable; + adp-disable; + ahb-burst-config = <0x00>; + phy-names = "usb-phy"; + phys = <0x73>; + status = "okay"; + #reset-cells = <0x01>; + extcon = <0x2a>; + + ulpi { + + phy { + compatible = "qcom,usb-hs-phy-msm8909", "qcom,usb-hs-phy"; + #phy-cells = <0x00>; + clocks = <0x18 0x14 0x8c>; + clock-names = "ref", "sleep"; + resets = <0x14 0x21 0x14 0x26>; + reset-names = "phy", "por"; + qcom,init-seq = [00 73]; + v1p8-supply = <0x34>; + v3p3-supply = <0x31>; + extcon = <0x2a>; + phandle = <0x73>; + }; + }; + }; + + remoteproc@a21b000 { + compatible = "qcom,pronto-v3-pil", "qcom,pronto"; + reg = <0xa204000 0x2000 0xa202000 0x1000 0xa21b000 0x3000>; + reg-names = "ccu", "dxe", "pmu"; + memory-region = <0x74>; + interrupts-extended = <0x01 0x00 0x95 0x01 0x75 0x00 0x01 0x75 0x01 0x01 0x75 0x02 0x01 0x75 0x03 0x01>; + interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack"; + power-domains = <0x04 0x00 0x04 0x03>; + power-domain-names = "cx", "mx"; + qcom,smem-states = <0x76 0x00>; + qcom,smem-state-names = "stop"; + pinctrl-names = "default"; + pinctrl-0 = <0x77>; + status = "okay"; + vddpx-supply = <0x34>; + phandle = <0x7b>; + + iris { + clocks = <0x78 0x10>; + clock-names = "xo"; + vddxo-supply = <0x34>; + vddrfa-supply = <0x79>; + vddpa-supply = <0x7a>; + vdddig-supply = <0x2f>; + compatible = "qcom,wcn3620"; + }; + + smd-edge { + interrupts = <0x00 0x8e 0x01>; + qcom,ipc = <0x03 0x08 0x11>; + qcom,smd-edge = <0x06>; + qcom,remote-pid = <0x04>; + label = "pronto"; + + wcnss { + compatible = "qcom,wcnss"; + qcom,smd-channels = "WCNSS_CTRL"; + qcom,mmio = <0x7b>; + + bluetooth { + compatible = "qcom,wcnss-bt"; + }; + + wifi { + compatible = "qcom,wcnss-wlan"; + interrupts = <0x00 0x91 0x04 0x00 0x92 0x04>; + interrupt-names = "tx", "rx"; + qcom,smem-states = <0x38 0x0a 0x38 0x09>; + qcom,smem-state-names = "tx-enable", "tx-rings-empty"; + }; + }; + }; + }; + + interrupt-controller@b000000 { + compatible = "qcom,msm-qgic2"; + reg = <0xb000000 0x1000 0xb002000 0x1000>; + interrupt-controller; + #interrupt-cells = <0x03>; + phandle = <0x01>; + }; + + mailbox@b011000 { + compatible = "qcom,msm8916-apcs-kpss-global", "syscon"; + reg = <0xb011000 0x1000>; + #mbox-cells = <0x01>; + clocks = <0x7c 0x14 0x01>; + clock-names = "pll", "aux"; + #clock-cells = <0x00>; + phandle = <0x03>; + }; + + clock@b016000 { + compatible = "qcom,msm8916-a53pll"; + reg = <0xb016000 0x40>; + #clock-cells = <0x00>; + clocks = <0x18>; + clock-names = "xo"; + operating-points-v2 = <0x7d>; + phandle = <0x7c>; + + opp-table { + compatible = "operating-points-v2"; + phandle = <0x7d>; + + opp-998400000 { + opp-hz = <0x00 0x3b826000>; + }; + + opp-1094400000 { + opp-hz = <0x00 0x413b3800>; + }; + + opp-1190400000 { + opp-hz = <0x00 0x46f41000>; + }; + + opp-1248000000 { + opp-hz = <0x00 0x4a62f800>; + }; + + opp-1267200000 { + opp-hz = <0x00 0x4b87f000>; + }; + }; + }; + + timer@b020000 { + compatible = "arm,armv7-timer-mem"; + reg = <0xb020000 0x1000>; + #address-cells = <0x01>; + #size-cells = <0x01>; + ranges; + + frame@b021000 { + reg = <0xb021000 0x1000 0xb022000 0x1000>; + interrupts = <0x00 0x08 0x04 0x00 0x07 0x04>; + frame-number = <0x00>; + }; + + frame@b023000 { + reg = <0xb023000 0x1000>; + interrupts = <0x00 0x09 0x04>; + frame-number = <0x01>; + status = "disabled"; + }; + + frame@b024000 { + reg = <0xb024000 0x1000>; + interrupts = <0x00 0x0a 0x04>; + frame-number = <0x02>; + status = "disabled"; + }; + + frame@b025000 { + reg = <0xb025000 0x1000>; + interrupts = <0x00 0x0b 0x04>; + frame-number = <0x03>; + status = "disabled"; + }; + + frame@b026000 { + reg = <0xb026000 0x1000>; + interrupts = <0x00 0x0c 0x04>; + frame-number = <0x04>; + status = "disabled"; + }; + + frame@b027000 { + reg = <0xb027000 0x1000>; + interrupts = <0x00 0x0d 0x04>; + frame-number = <0x05>; + status = "disabled"; + }; + + frame@b028000 { + reg = <0xb028000 0x1000>; + interrupts = <0x00 0x0e 0x04>; + frame-number = <0x06>; + status = "disabled"; + }; + }; + + power-manager@b088000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb088000 0x1000>; + phandle = <0x07>; + }; + + power-manager@b089000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb089000 0x1000>; + phandle = <0x08>; + }; + + power-manager@b098000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb098000 0x1000>; + phandle = <0x09>; + }; + + power-manager@b099000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb099000 0x1000>; + phandle = <0x0a>; + }; + + power-manager@b0a8000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb0a8000 0x1000>; + phandle = <0x0b>; + }; + + power-manager@b0a9000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb0a9000 0x1000>; + phandle = <0x0c>; + }; + + power-manager@b0b8000 { + compatible = "qcom,msm8909-acc"; + reg = <0xb0b8000 0x1000>; + phandle = <0x0d>; + }; + + power-manager@b0b9000 { + compatible = "qcom,msm8909-saw2-v3.0-cpu", "qcom,saw2"; + reg = <0xb0b9000 0x1000>; + phandle = <0x0e>; + }; + }; + + thermal-zones { + + cpu0-2-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x03>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "passive"; + phandle = <0x7f>; + }; + + cpu_crit { + temperature = <0x186a0>; + hysteresis = <0x7d0>; + type = "critical"; + }; + }; + + cooling-maps { + + map0 { + trip = <0x7f>; + cooling-device = <0x80 0xffffffff 0xffffffff 0x81 0xffffffff 0xffffffff 0x82 0xffffffff 0xffffffff 0x83 0xffffffff 0xffffffff>; + }; + }; + }; + + cpu1-3-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x04>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "passive"; + phandle = <0x84>; + }; + + cpu_crit { + temperature = <0x186a0>; + hysteresis = <0x7d0>; + type = "critical"; + }; + }; + + cooling-maps { + + map0 { + trip = <0x84>; + cooling-device = <0x80 0xffffffff 0xffffffff 0x81 0xffffffff 0xffffffff 0x82 0xffffffff 0xffffffff 0x83 0xffffffff 0xffffffff>; + }; + }; + }; + + gpu-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x02>; + + trips { + + trip-point0 { + temperature = <0x15f90>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + + camera-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x01>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + + modem-thermal { + polling-delay-passive = <0xfa>; + polling-delay = <0x00>; + thermal-sensors = <0x7e 0x00>; + + trips { + + trip-point0 { + temperature = <0x14c08>; + hysteresis = <0x7d0>; + type = "hot"; + }; + }; + }; + }; + + timer { + compatible = "arm,armv7-timer"; + interrupts = <0x01 0x02 0xf08 0x01 0x03 0xf08 0x01 0x04 0xf08 0x01 0x01 0xf08>; + }; + + backlight { + compatible = "pwm-backlight"; + pwms = <0x85 0x00 0x186a0>; + brightness-levels = <0x00 0x04 0x08 0x10 0x20 0x40 0x80 0xff>; + num-interpolated-steps = <0x02>; + default-brightness-level = <0x0a>; + phandle = <0x6b>; + }; + + battery { + compatible = "simple-battery"; + voltage-min-design-microvolt = <0x33e140>; + voltage-max-design-microvolt = <0x432380>; + energy-full-design-microwatt-hours = <0x594390>; + charge-full-design-microamp-hours = <0x16e360>; + ocv-capacity-celsius = <0x19>; + ocv-capacity-table-0 = <0x42d560 0x64 0x417da0 0x5f 0x409b10 0x5a 0x3fef30 0x55 0x3f7230 0x50 0x3ef148 0x4b 0x3e6890 0x46 0x3da540 0x41 0x3cda20 0x3c 0x3c45b0 0x37 0x3be408 0x32 0x3b3440 0x2d 0x3a9800 0x28 0x39fbc0 0x23 0x39bd40 0x1e 0x396368 0x19 0x391d18 0x14 0x38cb10 0x10 0x387cf0 0x0d 0x384e10 0x0b 0x384640 0x0a 0x384258 0x09 0x383a88 0x08 0x3832b8 0x07 0x381b48 0x06 0x37c940 0x05 0x371d60 0x04 0x363ad0 0x03 0x34d370 0x02 0x32b090 0x01 0x2dc6c0 0x00>; + phandle = <0x29>; + }; + + gpio-keys { + compatible = "gpio-keys"; + pinctrl-0 = <0x86 0x87>; + pinctrl-names = "default"; + + key-up { + wakeup-source; + gpios = <0x27 0x5a 0x01>; + linux,code = <0x67>; + debounce-interval = <0x0f>; + linux,can-disable; + }; + + key-back { + wakeup-source; + gpios = <0x27 0x62 0x01>; + linux,code = <0x0e>; + debounce-interval = <0x0f>; + linux,can-disable; + }; + + switch-lid-close { + wakeup-source; + gpios = <0x27 0x5c 0x01>; + linux,input-type = <0x05>; + linux,code = <0x00>; + }; + + switch-lid-open { + gpios = <0x27 0x24 0x01>; + linux,input-type = <0x05>; + linux,code = <0x0a>; + }; + }; + + keypad { + compatible = "gpio-matrix-keypad"; + col-scan-delay-ms = <0x07>; + debounce-delay-ms = <0x0a>; + gpio-activelow; + pinctrl-0 = <0x88 0x89>; + pinctrl-names = "default"; + row-gpios = <0x27 0x61 0x01 0x27 0x60 0x01 0x27 0x5f 0x01 0x27 0x5e 0x01>; + col-gpios = <0x27 0x34 0x01 0x27 0x38 0x01 0x27 0x07 0x01 0x27 0x63 0x01 0x27 0x06 0x01>; + linux,keymap = <0x1bd 0x10002 0x20005 0x30008 0x4020a 0x1000069 0x1010003 0x1020006 0x1030009 0x104000b 0x20002b8 0x2010004 0x2020007 0x203000a 0x204020b 0x300001c 0x301006a 0x30202b9>; + }; + + leds { + compatible = "gpio-leds"; + pinctrl-0 = <0x8a>; + pinctrl-names = "default"; + + led-0 { + function = "kbd_backlight"; + color = <0x00>; + gpios = <0x2c 0x01 0x00>; + }; + }; +}; diff --git a/flash-edl.py b/flash-edl.py new file mode 100755 index 0000000..b4b6bab --- /dev/null +++ b/flash-edl.py @@ -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() diff --git a/flash-edl.sh b/flash-edl.sh new file mode 100755 index 0000000..d10d6e3 --- /dev/null +++ b/flash-edl.sh @@ -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" "$@" diff --git a/keys/README b/keys/README new file mode 100644 index 0000000..2b71610 --- /dev/null +++ b/keys/README @@ -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 diff --git a/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub new file mode 100644 index 0000000..bb4bdc8 --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub new file mode 100644 index 0000000..6cbfad7 --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-524d27bb.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-524d27bb.rsa.pub new file mode 100644 index 0000000..1d34c93 --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-524d27bb.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub new file mode 100644 index 0000000..83f0658 --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-58199dcc.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-58199dcc.rsa.pub new file mode 100644 index 0000000..2b99a0d --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-58199dcc.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-58cbb476.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-58cbb476.rsa.pub new file mode 100644 index 0000000..a9ead55 --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-58cbb476.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-58e4f17d.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-58e4f17d.rsa.pub new file mode 100644 index 0000000..8f99094 --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-58e4f17d.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-5e69ca50.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-5e69ca50.rsa.pub new file mode 100644 index 0000000..097740e --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-5e69ca50.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-60ac2099.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-60ac2099.rsa.pub new file mode 100644 index 0000000..2b8a4a9 --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-60ac2099.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub new file mode 100644 index 0000000..f2165ae --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-61666e3f.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-61666e3f.rsa.pub new file mode 100644 index 0000000..aa63d81 --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-61666e3f.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-616a9724.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-616a9724.rsa.pub new file mode 100644 index 0000000..59c330e --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-616a9724.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-616abc23.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-616abc23.rsa.pub new file mode 100644 index 0000000..915bc56 --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-616abc23.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-616ac3bc.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-616ac3bc.rsa.pub new file mode 100644 index 0000000..1e49d24 --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-616ac3bc.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-616adfeb.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-616adfeb.rsa.pub new file mode 100644 index 0000000..bb15efe --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-616adfeb.rsa.pub @@ -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----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-616ae350.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-616ae350.rsa.pub new file mode 100644 index 0000000..0ecbccc --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-616ae350.rsa.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyduVzi1mWm+lYo2Tqt/0 +XkCIWrDNP1QBMVPrE0/ZlU2bCGSoo2Z9FHQKz/mTyMRlhNqTfhJ5qU3U9XlyGOPJ +piM+b91g26pnpXJ2Q2kOypSgOMOPA4cQ42PkHBEqhuzssfj9t7x47ppS94bboh46 +xLSDRff/NAbtwTpvhStV3URYkxFG++cKGGa5MPXBrxIp+iZf9GnuxVdST5PGiVGP +ODL/b69sPJQNbJHVquqUTOh5Ry8uuD2WZuXfKf7/C0jC/ie9m2+0CttNu9tMciGM +EyKG1/Xhk5iIWO43m4SrrT2WkFlcZ1z2JSf9Pjm4C2+HovYpihwwdM/OdP8Xmsnr +DzVB4YvQiW+IHBjStHVuyiZWc+JsgEPJzisNY0Wyc/kNyNtqVKpX6dRhMLanLmy+ +f53cCSI05KPQAcGj6tdL+D60uKDkt+FsDa0BTAobZ31OsFVid0vCXtsbplNhW1IF +HwsGXBTVcfXg44RLyL8Lk/2dQxDHNHzAUslJXzPxaHBLmt++2COa2EI1iWlvtznk +Ok9WP8SOAIj+xdqoiHcC4j72BOVVgiITIJNHrbppZCq6qPR+fgXmXa+sDcGh30m6 +9Wpbr28kLMSHiENCWTdsFij+NQTd5S47H7XTROHnalYDuF1RpS+DpQidT5tUimaT +JZDr++FjKrnnijbyNF8b98UCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-616db30d.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-616db30d.rsa.pub new file mode 100644 index 0000000..ceffa3a --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-616db30d.rsa.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnpUpyWDWjlUk3smlWeA0 +lIMW+oJ38t92CRLHH3IqRhyECBRW0d0aRGtq7TY8PmxjjvBZrxTNDpJT6KUk4LRm +a6A6IuAI7QnNK8SJqM0DLzlpygd7GJf8ZL9SoHSH+gFsYF67Cpooz/YDqWrlN7Vw +tO00s0B+eXy+PCXYU7VSfuWFGK8TGEv6HfGMALLjhqMManyvfp8hz3ubN1rK3c8C +US/ilRh1qckdbtPvoDPhSbTDmfU1g/EfRSIEXBrIMLg9ka/XB9PvWRrekrppnQzP +hP9YE3x/wbFc5QqQWiRCYyQl/rgIMOXvIxhkfe8H5n1Et4VAorkpEAXdsfN8KSVv +LSMazVlLp9GYq5SUpqYX3KnxdWBgN7BJoZ4sltsTpHQ/34SXWfu3UmyUveWj7wp0 +x9hwsPirVI00EEea9AbP7NM2rAyu6ukcm4m6ATd2DZJIViq2es6m60AE6SMCmrQF +wmk4H/kdQgeAELVfGOm2VyJ3z69fQuywz7xu27S6zTKi05Qlnohxol4wVb6OB7qG +LPRtK9ObgzRo/OPumyXqlzAi/Yvyd1ZQk8labZps3e16bQp8+pVPiumWioMFJDWV +GZjCmyMSU8V6MB6njbgLHoyg2LCukCAeSjbPGGGYhnKLm1AKSoJh3IpZuqcKCk5C +8CM1S15HxV78s9dFntEqIokCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/keys/alpine-devel@lists.alpinelinux.org-66ba20fe.rsa.pub b/keys/alpine-devel@lists.alpinelinux.org-66ba20fe.rsa.pub new file mode 100644 index 0000000..e8bb476 --- /dev/null +++ b/keys/alpine-devel@lists.alpinelinux.org-66ba20fe.rsa.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtfB12w4ZgqsXWZDfUAV/ +6Y4aHUKIu3q4SXrNZ7CXF9nXoAVYrS7NAxJdAodsY3vPCN0g5O8DFXR+390LdOuQ ++HsGKCc1k5tX5ZXld37EZNTNSbR0k+NKhd9h6X3u6wqPOx7SIKxwAQR8qeeFq4pP +rt9GAGlxtuYgzIIcKJPwE0dZlcBCg+GnptCUZXp/38BP1eYC+xTXSL6Muq1etYfg +odXdb7Yl+2h1IHuOwo5rjgY5kpY7GcAs8AjGk3lDD/av60OTYccknH0NCVSmPoXK +vrxDBOn0LQRNBLcAfnTKgHrzy0Q5h4TNkkyTgxkoQw5ObDk9nnabTxql732yy9BY +s+hM9+dSFO1HKeVXreYSA2n1ndF18YAvAumzgyqzB7I4pMHXq1kC/8bONMJxwSkS +Ym6CoXKyavp7RqGMyeVpRC7tV+blkrrUml0BwNkxE+XnwDRB3xDV6hqgWe0XrifD +YTfvd9ScZQP83ip0r4IKlq4GMv/R5shcCRJSkSZ6QSGshH40JYSoiwJf5FHbj9ND +7do0UAqebWo4yNx63j/wb2ULorW3AClv0BCFSdPsIrCStiGdpgJDBR2P2NZOCob3 +G9uMj+wJD6JJg2nWqNJxkANXX37Qf8plgzssrhrgOvB0fjjS7GYhfkfmZTJ0wPOw +A8+KzFseBh4UFGgue78KwgkCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/keys/build.postmarketos.org.rsa.pub b/keys/build.postmarketos.org.rsa.pub new file mode 100644 index 0000000..227f668 --- /dev/null +++ b/keys/build.postmarketos.org.rsa.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlXE4h6kp8aCzn6BjuOnz +Z1lcFSY+WRZ2vGUb5hEZ+YG75xYZW+yELr8P8+HSUrpBXF/HTQYKH/cNJc5zmOny +EsmcZskIYB0qgZPg02GXBV8VfjL+Es+y166g14IH2YKkdfplqHYVpCmnkmaZXQZu +ZAOEL2hyuzTAYYFhCZWHYYgdWfpnKDDlVcnw1Q3/LhADBlN63CW0UMWc5oJ7MwlY +SKriM60cHvER1YD5bdbGG/JTBFnB4djliLtvRNp+w3emwHmDhFmnYITN2WOHbYpV +P+RIfzq0IP978sKGJmd0RPuwl2ruifBYikm/F79Ko8lT2gVE40B7wqbInIGquTr1 +deERIr47jcPRGl+01Svm0SxbXD1/zBNjo4wvMsZEW7Te689mFjxsXHnD7OEUQqh/ +D1DhbnKJwpKwClYOi/aVDyGJunqavSR0QYPqN3nP+uXdBC4wuLI9gRS/yXNaxpMy +9AKwlD3uUhKzmJMJIu3L1/TH/vY9M5xZ2lnFduTZmL/X/4sjhyTb1ycFwU9UIY4C +u2CP/YLqiiquokgzpRfYwJyOP4quBVRC46Tejx5PzTCvnhro7LAzDoS756iBv9E/ +2oxwC5VafGSChO+N8SyEBy532Gs+rcZDwUE7M9Y1GbQHW3ALMTwxstWqZ3GKWKd1 +Cw6JQoywUhR09tFwQrYZao0CAwEAAQ== +-----END PUBLIC KEY----- diff --git a/overlay/rootfs/etc/apk/repositories b/overlay/rootfs/etc/apk/repositories new file mode 100644 index 0000000..49dd802 --- /dev/null +++ b/overlay/rootfs/etc/apk/repositories @@ -0,0 +1,4 @@ +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 diff --git a/overlay/rootfs/etc/conf.d/msm-modem-uim-selection b/overlay/rootfs/etc/conf.d/msm-modem-uim-selection new file mode 100644 index 0000000..6d257d9 --- /dev/null +++ b/overlay/rootfs/etc/conf.d/msm-modem-uim-selection @@ -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 diff --git a/overlay/rootfs/etc/conf.d/zram-init b/overlay/rootfs/etc/conf.d/zram-init new file mode 100644 index 0000000..4373d1d --- /dev/null +++ b/overlay/rootfs/etc/conf.d/zram-init @@ -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= diff --git a/overlay/rootfs/etc/doas.d/50-sxmo.conf b/overlay/rootfs/etc/doas.d/50-sxmo.conf new file mode 100644 index 0000000..d079a5e --- /dev/null +++ b/overlay/rootfs/etc/doas.d/50-sxmo.conf @@ -0,0 +1,30 @@ +permit persist :wheel +permit nopass :wheel as root cmd busybox args poweroff +permit nopass :wheel as root cmd busybox args reboot +permit nopass :wheel as root cmd poweroff +permit nopass :wheel as root cmd /sbin/poweroff +permit nopass :wheel as root cmd reboot +permit nopass :wheel as root cmd /sbin/reboot +permit nopass :wheel as root cmd halt +permit nopass :wheel as root cmd /sbin/halt +permit nopass :wheel as root cmd openrc-shutdown +permit nopass :wheel as root cmd /sbin/openrc-shutdown +permit nopass :wheel as root cmd sxmo_wifitoggle.sh +permit nopass setenv { SXMO_OS } :wheel as root cmd sxmo_bluetoothtoggle.sh +permit nopass :wheel as root cmd rc-service args bluetooth restart +permit nopass :wheel as root cmd systemctl args restart bluetooth +permit nopass :wheel as root cmd tinydm-set-session +permit nopass :wheel as root cmd rc-service args eg25-manager stop +permit nopass :wheel as root cmd rc-service args eg25-manager start +permit nopass :wheel as root cmd rc-service args modemmanager stop +permit nopass :wheel as root cmd rc-service args modemmanager start +permit nopass :wheel as root cmd systemctl args start eg25-manager +permit nopass :wheel as root cmd systemctl args stop eg25-manager +permit nopass :wheel as root cmd systemctl args start ModemManager +permit nopass :wheel as root cmd systemctl args stop ModemManager +permit nopass :wheel as root cmd rtcwake +permit nopass :wheel as root cmd tee args -a /sys/power/wake_lock +permit nopass :wheel as root cmd tee args -a /sys/power/wake_unlock +permit nopass :wheel as root cmd tee args /sys/power/wakeup_count +permit nopass :wheel as root cmd rc-service args hexagonrpcd-adsp-sensorspd stop +permit nopass :wheel as root cmd systemctl args stop hexagonrpcd-adsp-sensorspd diff --git a/overlay/rootfs/etc/init.d/postmarketos-zram-swap b/overlay/rootfs/etc/init.d/postmarketos-zram-swap new file mode 100755 index 0000000..92bd944 --- /dev/null +++ b/overlay/rootfs/etc/init.d/postmarketos-zram-swap @@ -0,0 +1,28 @@ +#!/sbin/openrc-run +# SPDX-License-Identifier: GPL-2.0-only + +depend() { + need localmount + after bootmisc modules + provide swap +} + +start() { + ebegin "Starting zram swap" + if [ ! -f /usr/share/misc/source_deviceinfo ]; then + eend 1 "deviceinfo not found" + return 1 + fi + + zramstart + eend $? +} + +stop() { + if [ "$RC_RUNLEVEL" = "shutdown" ]; then + return 0 + fi + ebegin "Stopping zram swap" + zramstop + eend $? +} diff --git a/overlay/rootfs/etc/init.d/swapfile b/overlay/rootfs/etc/init.d/swapfile new file mode 100755 index 0000000..3067f9c --- /dev/null +++ b/overlay/rootfs/etc/init.d/swapfile @@ -0,0 +1,27 @@ +#!/sbin/openrc-run + +depend() { + after localmount + before display-manager tinydm +} + +start() { + ebegin "Activating swap file" + swapfile + eend $? +} + +stop() { + if [ "$RC_RUNLEVEL" = "shutdown" ]; then + return 0 + fi + ebegin "Deactivating swap file" + swapoff /swapfile >/dev/null 2>&1 || true + eend 0 +} + +restart() { + ebegin "Restarting swap file" + start + eend $? +} diff --git a/overlay/rootfs/etc/issue b/overlay/rootfs/etc/issue new file mode 100644 index 0000000..f4825bf --- /dev/null +++ b/overlay/rootfs/etc/issue @@ -0,0 +1,2 @@ +Welcome to Bananarchy Linux v0.0.1 (msm8909) on \l + diff --git a/overlay/rootfs/etc/modules b/overlay/rootfs/etc/modules new file mode 100644 index 0000000..4a73ac1 --- /dev/null +++ b/overlay/rootfs/etc/modules @@ -0,0 +1,4 @@ +af_packet +ipv6 +panel_mipi_dbi +leds_msm8905_torch diff --git a/overlay/rootfs/etc/motd b/overlay/rootfs/etc/motd new file mode 100644 index 0000000..24c89ec --- /dev/null +++ b/overlay/rootfs/etc/motd @@ -0,0 +1,8 @@ +============================================================ + BANANARCHY LINUX v0.0.1 (Qualcomm MSM8905 / MSM8909) + 240x320 Native Sxmo * Multi-Mode T9 * QDSP6 Voice +------------------------------------------------------------ + * Keypad '#' cycles T9 modes: abc / Abc / ABC / Sym / Ctl / 123 + * Keypad '*' is Space (hold 450ms for Ctrl+ latch) + * Run 'bantam' for the Bantam DIY AI agent +============================================================ diff --git a/overlay/rootfs/etc/os-release b/overlay/rootfs/etc/os-release new file mode 100644 index 0000000..756d2b4 --- /dev/null +++ b/overlay/rootfs/etc/os-release @@ -0,0 +1,11 @@ +PRETTY_NAME="Bananarchy Linux v0.0.1 (msm8909)" +NAME="Bananarchy" +VERSION_ID="v0.0.1" +VERSION="v0.0.1 (msm8909)" +ID="bananarchy" +ID_LIKE="postmarketos alpine" +HOME_URL="https://bananahackers.net/" +SUPPORT_URL="https://wiki.nura.eco/wiki/Nokia_8110_4G_(nokia-argon)" +BUG_REPORT_URL="https://gitlab.postmarketos.org/postmarketOS/pmaports/issues" +LOGO="bananarchy" +ANSI_COLOR="1;33" diff --git a/overlay/rootfs/etc/skel/.config/foot/foot.ini b/overlay/rootfs/etc/skel/.config/foot/foot.ini new file mode 100644 index 0000000..a263aad --- /dev/null +++ b/overlay/rootfs/etc/skel/.config/foot/foot.ini @@ -0,0 +1,40 @@ +# Space to setup configversion +# configversion: 13fb3d2d9f97f4420f7506e72b90e77d +font=monospace:size=13 +dpi-aware=no +pad=2x2 + +[colors-dark] +# alpha=1.0 +foreground=eaeaea +background=000000 +regular0=000000 # black +regular1=d54e53 # red +regular2=b9ca4a # green +regular3=e6c547 # yellow +regular4=7aa6da # blue +regular5=c397d8 # magenta +regular6=70c0ba # cyan +regular7=eaeaea # white +bright0=666666 # bright black +bright1=ff3334 # bright red +bright2=9ec400 # bright green +bright3=e7c547 # bright yellow +bright4=7aa6da # bright blue +bright5=b77ee0 # bright magenta +bright6=54ced6 # bright cyan +bright7=ffffff # bright white + +[scrollback] +lines=5000 + +[key-bindings] +scrollback-up-page=Shift+Page_Up +scrollback-down-page=Shift+Page_Down +scrollback-up-half-page=Page_Up +scrollback-down-half-page=Page_Down +scrollback-up-line=Shift+Up +scrollback-down-line=Shift+Down +scrollback-home=Shift+Home +scrollback-end=Shift+End + diff --git a/overlay/rootfs/etc/skel/.config/sxmo/conky.conf b/overlay/rootfs/etc/skel/.config/sxmo/conky.conf new file mode 100644 index 0000000..8c00ea7 --- /dev/null +++ b/overlay/rootfs/etc/skel/.config/sxmo/conky.conf @@ -0,0 +1,18 @@ +-- Space to setup configversion +-- configversion: 19ec5c7f9e83bc6534d657f6180feba2 +conky.config = { + out_to_x = false, + out_to_wayland = true, + alignment = 'top_middle', + gap_y = 12, + own_window_argb_value = 0, + own_window_type = 'desktop', + default_shade_color = 'black', + draw_shades = true, + font = 'Sxmo:size=13', + use_xft = true, + update_interval = 15, +} + +conky.text = [[${alignc}${font Sxmo:size=34:style=Bold}${time %H:%M}${font} +${alignc}${font Sxmo:size=14:style=Bold}${time %a %d %b %Y}${font}]] diff --git a/overlay/rootfs/etc/skel/.config/sxmo/hooks/sxmo_hook_inputhandler.sh b/overlay/rootfs/etc/skel/.config/sxmo/hooks/sxmo_hook_inputhandler.sh new file mode 100755 index 0000000..ed3f8d4 --- /dev/null +++ b/overlay/rootfs/etc/skel/.config/sxmo/hooks/sxmo_hook_inputhandler.sh @@ -0,0 +1,540 @@ +#!/bin/sh +# configversion: 113bf453dd3310afff192d841089e5ac +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script handles input actions, it is called by lisgd for gestures +# and by dwm for button presses. Gestures are tied to actions in +# sxmo_hook_lisgdstart.sh . + +ACTION="$1" + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +stop_proximity_lock() { + sxmo_jobs.sh stop proximity_lock +} + +exec 0</dev/null 2>&1 || true + sxmo_state.sh set unlock + sxmo_wm.sh display on + ;; + "voldown_one") + sxmo_audio.sh vol down 5 + exit + ;; + "voldown_two") + sxmo_audio.sh vol down 10 + exit + ;; + "voldown_three") + sxmo_audio.sh vol down 15 + exit + ;; + "volup_one") + sxmo_audio.sh vol up 5 + exit + ;; + "volup_two") + sxmo_audio.sh vol up 10 + exit + ;; + "volup_three") + sxmo_audio.sh vol up 15 + exit + ;; + esac + #we're locked, don't process the rest of the script + exit 0 +fi + +#special context-sensitive handling +case "$WMCLASS" in + *"mpv"*) + case "$ACTION" in + "oneright") + sxmo_type.sh -k Left + exit 0 + ;; + "oneleft") + sxmo_type.sh -k Right + exit 0 + ;; + "oneup") + sxmo_type.sh m + exit 0 + ;; + "onedown") + sxmo_type.sh p + exit 0 + ;; + esac + ;; + *"acme"*) + case "$ACTION" in + "volup_one") + xdotool click 3 + exit 0 + ;; + "voldown_one") + xdotool click 2 + exit 0 + ;; + esac + ;; + *"links"*) + case "$ACTION" in + # you're probably dragging the scrollbar + *"uprightedge") exit 0 ;; + *"downrightedge") exit 0 ;; + *"onedown") + sxmo_type.sh -M Ctrl -M Shift -k b + exit 0 + ;; + *"oneup") + sxmo_type.sh -M Ctrl -M Shift -k f + exit 0 + ;; + esac + ;; + *"netsurf"*) + case "$ACTION" in + # you're probably dragging the scrollbar + *"uprightedge") exit 0 ;; + *"downrightedge") exit 0 ;; + *"onedown") + sxmo_type.sh -k Page_Up + exit 0 + ;; + *"oneup") + sxmo_type.sh -k Page_Down + exit 0 + ;; + esac + ;; + *"firefox"*|*"librewolf"*) + case "$ACTION" in + # you're probably dragging the scrollbar + *"uprightedge") exit 0 ;; + *"downrightedge") exit 0 ;; + esac + ;; + *"foot"*|*"st"*|*"vte"*|"terminal") # Terminals + case "$WMCLASS" in # Handle programs without touch support + *"st"*) + case "$WMNAME" in + *"weechat"*|*'gomuks'*) + case "$ACTION" in + *"onedown") + sxmo_type.sh -k Page_Up + exit 0 + ;; + *"oneup") + sxmo_type.sh -k Page_Down + exit 0 + ;; + esac + ;; + *"less"*|*"amfora"*) + case "$ACTION" in + *"onedown") + sxmo_type.sh u + exit 0 + ;; + *"oneup") + sxmo_type.sh d + exit 0 + ;; + esac + ;; + *'irssi'*) + case "$ACTION" in + "onedown") + sxmo_type.sh -M Alt p + exit 0 + ;; + "oneup") + sxmo_type.sh -M Alt n + exit 0 + ;; + esac + ;; + *'epy'*|*'epr'*) + case "$ACTION" in + "onedown") + sxmo_type.sh h + exit 0 + ;; + "oneup") + sxmo_type.sh l + exit 0 + ;; + esac + ;; + *'nnn'*|'lf') + case "$ACTION" in + "onedown") + sxmo_type.sh -k Down + exit 0 + ;; + "oneup") + sxmo_type.sh -k Up + exit 0 + ;; + esac + ;; + esac + ;; + esac + + case "$WMNAME" in # Handle programs + *"weechat"*) + case "$ACTION" in + *"oneleft") + sxmo_type.sh -M Alt -k a + exit 0 + ;; + *"oneright") + sxmo_type.sh -M Alt -k less + exit 0 + ;; + esac + ;; + *" sms") + case "$ACTION" in + *"upbottomedge") + number="$(printf %s "$WMNAME" | sed -e 's|^\"||' -e 's|\"$||' | cut -f1 -d' ')" + sxmo_terminal.sh sxmo_modemtext.sh conversationloop "$number" + exit 0 + ;; + esac + ;; + *"tuir"*) + if [ "$ACTION" = "rightbottomedge" ]; then + sxmo_type.sh o + exit 0 + elif [ "$ACTION" = "leftbottomedge" ]; then + sxmo_type.sh s + exit 0 + fi + ;; + *"less"*) + case "$ACTION" in + "leftbottomedge") + sxmo_type.sh q + exit 0 + ;; + "leftrightedge_short") + sxmo_type.sh q + exit 0 + ;; + *"oneleft") + sxmo_type.sh ":n" -k Return + exit 0 + ;; + *"oneright") + sxmo_type.sh ":p" -k Return + exit 0 + ;; + esac + ;; + *"amfora"*) + case "$ACTION" in + "downright") + sxmo_type.sh -k Tab + exit 0 + ;; + "upleft") + sxmo_type.sh -M Shift -k Tab + exit 0 + ;; + *"oneright") + sxmo_type.sh -k Return + exit 0 + ;; + "upright") + sxmo_type.sh -M Ctrl t + exit 0 + ;; + *"oneleft") + sxmo_type.sh b + exit 0 + ;; + "downleft") + sxmo_type.sh -M Ctrl w + exit 0 + ;; + esac + ;; + *"epy"*|*"epr"*) + case "$ACTION" in + *"left"|"voldown_one") + sxmo_type.sh l + exit 0 + ;; + *"right"|"volup_one") + sxmo_type.sh h + exit 0 + ;; + "voldown_three"|"twodownbottomedge") + sxmo_type.sh q + exit + ;; + esac + ;; + *'nnn'*|'lf') + case "$ACTION" in + *"left") + sxmo_type.sh -k Right + exit 0 + ;; + *"right") + sxmo_type.sh -k Left + exit 0 + ;; + esac + ;; + esac + + case "$WMCLASS" in # Handle general scrolling without touch support + *"st"*) + case "$ACTION" in + *"onedown") + sxmo_type.sh -M Ctrl -M Shift -k b + exit 0 + ;; + *"oneup") + sxmo_type.sh -M Ctrl -M Shift -k f + exit 0 + ;; + esac + ;; + "org.gnome.vte.application"|"terminal") + case "$ACTION" in + # For VTE, fallback to doing nothing, + # you're probably dragging the scrollbar + *"uprightedge") exit 0 ;; + *"downrightedge") exit 0 ;; + esac + ;; + esac + ;; +esac + +#standard handling +case "$ACTION" in + "menuright"*|"menuright_one") + if sxmo_dmenu.sh isopen; then + sxmo_dmenu.sh close + else + sxmo_appmenu.sh "$WMCLASS" "$WMNAME" + fi + exit 0 + ;; + "menuleft"*|"menuleft_one") + if sxmo_dmenu.sh isopen; then + sxmo_dmenu.sh close + else + sxmo_appmenu.sh sys + fi + exit 0 + ;; + "enter_one") + if pidof -q sxmo_RepeatRing.sh; then + sxmo_hook_pickup.sh + else + sxmo_appmenu.sh "$WMCLASS" "$WMNAME" + fi + exit 0 + ;; + "enter_two") + swaymsg focus next >/dev/null 2>&1 || sxmo_wm.sh switchfocus + exit 0 + ;; + "enter_three") + sxmo_wm.sh togglelayout + exit 0 + ;; + "powerbutton_one") + if echo "$WMCLASS" | grep -i "megapixels"; then + sxmo_type.sh -k space + else + sxmo_appmenu.sh power + fi + exit 0 + ;; + "powerbutton_two") + sxmo_state.sh click 2 + exit 0 + ;; + "powerbutton_three") + sxmo_terminal.sh + exit 0 + ;; + "voldown_one") + if [ -n "$SXMO_NO_VIRTUAL_KEYBOARD" ]; then + sxmo_killwindow.sh + else + sxmo_keyboard.sh toggle + fi + exit + ;; + "voldown_two") + sxmo_wm.sh togglelayout + exit + ;; + "voldown_three") + sxmo_killwindow.sh + exit + ;; + "volup_one") + sxmo_appmenu.sh "$WMCLASS" "$WMNAME" + exit + ;; + "volup_two") + sxmo_appmenu.sh sys + exit + ;; + "volup_three") + sxmo_wmmenu.sh + exit + ;; + "rightleftedge") + sxmo_wm.sh previousworkspace + exit 0 + ;; + "leftrightedge") + sxmo_wm.sh nextworkspace + exit 0 + ;; + "twoleft") + sxmo_wm.sh movepreviousworkspace + exit 0 + ;; + "tworight") + sxmo_wm.sh movenextworkspace + exit 0 + ;; + "righttopedge") + sxmo_brightness.sh up + exit 0 + ;; + "lefttopedge") + sxmo_brightness.sh down + exit 0 + ;; + "upleftedge") + sxmo_audio.sh vol up + exit 0 + ;; + "downleftedge") + sxmo_audio.sh vol down + exit 0 + ;; + "upbottomedge") + if [ -n "$SXMO_NO_VIRTUAL_KEYBOARD" ]; then + sxmo_terminal.sh + else + sxmo_keyboard.sh open + fi + exit 0 + ;; + "downbottomedge") + if [ -n "$SXMO_NO_VIRTUAL_KEYBOARD" ]; then + sxmo_killwindow.sh + else + sxmo_keyboard.sh close + fi + exit 0 + ;; + "downtopedge") + sxmo_dmenu.sh isopen || sxmo_appmenu.sh "$WMCLASS" "$WMNAME" + exit 0 + ;; + "twodowntopedge") + sxmo_hook_quickactions.sh + exit 0 + ;; + "uptopedge") + sxmo_dmenu.sh close + dunstctl close-all + exit 0 + ;; + "twodownbottomedge") + sxmo_killwindow.sh + exit 0 + ;; + "uprightedge") + sxmo_type.sh -k Up + exit 0 + ;; + "downrightedge") + sxmo_type.sh -k Down + exit 0 + ;; + "leftrightedge_short") + sxmo_type.sh -k Left + exit 0 + ;; + "rightrightedge_short") + sxmo_type.sh -k Right + exit 0 + ;; + "rightbottomedge") + sxmo_type.sh -k Return + exit 0 + ;; + "leftbottomedge") + sxmo_type.sh -k BackSpace + exit 0 + ;; + "topleftcorner") + sxmo_appmenu.sh sys + exit 0 + ;; + "toprightcorner") + sxmo_appmenu.sh scripts + exit 0 + ;; + "bottomleftcorner") + sxmo_dmenu.sh close + sxmo_keyboard.sh close + if [ -n "$WMCLASS" ]; then + sxmo_state.sh set lock + else + sxmo_state.sh set screenoff + fi + exit 0 + ;; + "bottomrightcorner") + sxmo_rotate.sh + exit 0 + ;; +esac diff --git a/overlay/rootfs/etc/skel/.config/sxmo/sway b/overlay/rootfs/etc/skel/.config/sxmo/sway new file mode 100644 index 0000000..de6396b --- /dev/null +++ b/overlay/rootfs/etc/skel/.config/sxmo/sway @@ -0,0 +1,296 @@ +# Default config for sway +# configversion: 076611fe8cc699bcaa01092a8e4481c0 +# +# Copy this to ~/.config/sway/config and edit it to your liking. +# +# Read `man 5 sway` for a complete reference. + +### Variables +# +# Logo key. Use Mod1 for Alt. +set $mod Mod4 +# Home row direction keys, like vim +set $left h +set $down j +set $up k +set $right l +# Your preferred terminal emulator +set $term sxmo_terminal.sh +# Your preferred application launcher +# Note: pass the final command to swaymsg so that the resulting window can be opened +# on the original workspace that the command was run on. +set $menu bemenu-run + +font "Sxmo 13" +xwayland disable +output * scale 1 bg /usr/share/wallpapers/bananarchy.png fill +default_orientation vertical + +exec_always sxmo_swayinitconf.sh + +exec_always dbus-update-activation-environment WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP + +mode "menu" { + bindsym --locked XF86PowerOff exec sh -c "sxmo_dmenu.sh close; if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; fi" + bindsym --locked XF86PickupPhone exec sh -c "if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; else wtype -k Return; fi" + bindsym --locked XF86KbdLcdMenu1 exec sh -c "sxmo_dmenu.sh close; if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; fi" + bindsym --locked XF86KbdLcdMenu2 exec sh -c "sxmo_dmenu.sh close; if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; fi" + bindsym XF86AudioRaiseVolume exec wtype -k Up + bindsym XF86AudioLowerVolume exec wtype -k Down + bindswitch --locked lid:on exec sh -c "sxmo_dmenu.sh close; brightnessctl -d white:kbd_backlight set 0; sxmo_state.sh set screenoff" + bindswitch --locked lid:off exec sh -c "brightnessctl -d white:kbd_backlight set 255; sxmo_state.sh set unlock; sxmo_wm.sh display on" +} + +# Mode specifically for use with Nokia N900 hardware keyboard +mode "N900" { + # follow the standard sxmo keybinds as far as possible + bindsym t exec $term; mode "default" + bindsym q mode "default" + bindsym Shift+p exec sxmo_appmenu.sh sys; mode "default" + bindsym p exec sxmo_appmenu.sh; mode "default" + bindsym d exec $menu; mode "default" + bindsym Shift+q kill; mode "default" + bindsym i exec sxmo_wmmenu.sh windowswitcher; mode "default" + bindsym Shift+c reload; mode "default" + bindsym f fullscreen; mode "default" + bindsym Shift+space floating toggle; mode "default" + bindsym a focus parent; mode "default" +} + +### Key bindings +# +# Basics: +# + input * xkb_options compose:ralt + + # Nokia N900 hardware keyboard + input "1:1:TWL4030_Keypad" { + xkb_model "nokiarx51" + xkb_layout "us" + # ralt has special meaning on N900 keyboard so do not use as + # compose key + xkb_options compose:rwin + } + + # Start a terminal + bindsym $mod+Return exec $term + + # Launch appmenu + bindsym $mod+p exec sxmo_appmenu.sh + bindsym $mod+Shift+p exec sxmo_appmenu.sh sys + + # Wm menu switcher + bindsym $mod+i exec sxmo_wmmenu.sh windowswitcher + + # Kill focused window + bindsym $mod+Shift+q kill + + # Start your launcher + bindsym $mod+d exec $menu + + # Drag floating windows by holding down $mod and left mouse button. + # Resize them with right mouse button + $mod. + # Despite the name, also works for non-floating windows. + # Change normal to inverse to use left mouse button for resizing and right + # mouse button for dragging. + floating_modifier $mod normal + + # Reload the configuration file + bindsym $mod+Shift+c reload + + # Exit sway (logs you out of your Wayland session) + bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'sxmo_power.sh logout' +# +# Moving around: +# + # Move your focus around + bindsym $mod+$left focus left + bindsym $mod+$down focus down + bindsym $mod+$up focus up + bindsym $mod+$right focus right + # Or use $mod+[up|down|left|right] + bindsym $mod+Left focus left + bindsym $mod+Down focus down + bindsym $mod+Up focus up + bindsym $mod+Right focus right + + # Move the focused window with the same, but add Shift + bindsym $mod+Shift+$left move left + bindsym $mod+Shift+$down move down + bindsym $mod+Shift+$up move up + bindsym $mod+Shift+$right move right + # Ditto, with arrow keys + bindsym $mod+Shift+Left move left + bindsym $mod+Shift+Down move down + bindsym $mod+Shift+Up move up + bindsym $mod+Shift+Right move right + + # Move the focused workspace to output + bindsym $mod+Shift+Ctrl+$left move workspace output left + bindsym $mod+Shift+Ctrl+$down move workspace output down + bindsym $mod+Shift+Ctrl+$up move workspace output up + bindsym $mod+Shift+Ctrl+$right move workspace output right +# +# Workspaces: +# + # Switch to workspace + bindsym $mod+1 workspace number 1 + bindsym $mod+2 workspace number 2 + bindsym $mod+3 workspace number 3 + bindsym $mod+4 workspace number 4 + bindsym $mod+5 workspace number 5 + bindsym $mod+6 workspace number 6 + bindsym $mod+7 workspace number 7 + bindsym $mod+8 workspace number 8 + bindsym $mod+9 workspace number 9 + bindsym $mod+0 workspace number 10 + # Move focused container to workspace + bindsym $mod+Shift+1 move container to workspace number 1 + bindsym $mod+Shift+2 move container to workspace number 2 + bindsym $mod+Shift+3 move container to workspace number 3 + bindsym $mod+Shift+4 move container to workspace number 4 + bindsym $mod+Shift+5 move container to workspace number 5 + bindsym $mod+Shift+6 move container to workspace number 6 + bindsym $mod+Shift+7 move container to workspace number 7 + bindsym $mod+Shift+8 move container to workspace number 8 + bindsym $mod+Shift+9 move container to workspace number 9 + bindsym $mod+Shift+0 move container to workspace number 10 + # Note: workspaces can have any name you want, not just numbers. + # We just use 1-10 as the default. +# +# Layout stuff: +# + # You can "split" the current object of your focus with + # $mod+b or $mod+v, for horizontal and vertical splits + # respectively. + bindsym $mod+b splith + bindsym $mod+v splitv + + # Switch the current container between different layout styles + bindsym $mod+s layout stacking + bindsym $mod+w layout tabbed + bindsym $mod+e layout toggle split + + # Make the current focus fullscreen + bindsym $mod+f fullscreen + + # Toggle the current focus between tiling and floating mode + bindsym $mod+Shift+space floating toggle + + # Swap focus between the tiling area and the floating area + bindsym $mod+space focus mode_toggle + + # Move focus to the parent container + bindsym $mod+a focus parent + + # Manual locker + bindsym $mod+g exec sxmo_state.sh set locker + + # Shutdown + bindsym $mod+t exec sxmo_appmenu.sh power + +# +# Scratchpad: +# + # Sway has a "scratchpad", which is a bag of holding for windows. + # You can send windows there and get them back later. + + # Move the currently focused window to the scratchpad + bindsym $mod+Shift+minus move scratchpad + + # Show the next scratchpad window or hide the focused scratchpad window. + # If there are multiple scratchpad windows, this command cycles through them. + bindsym $mod+minus scratchpad show +# +# Resizing containers: +# +mode "resize" { + # left will shrink the containers width + # right will grow the containers width + # up will shrink the containers height + # down will grow the containers height + bindsym $left resize shrink width 30px + bindsym $down resize grow height 30px + bindsym $up resize shrink height 30px + bindsym $right resize grow width 30px + + # Ditto, with arrow keys + bindsym Left resize shrink width 30px + bindsym Down resize grow height 30px + bindsym Up resize shrink height 30px + bindsym Right resize grow width 30px + + # Return to default mode + bindsym Return mode "default" + bindsym Escape mode "default" +} +bindsym $mod+r mode "resize" + +# +# Status Bar: +# +# Read `man 5 sway-bar` for more information about this section. +bar { + position top + height 24 + font "Sxmo 13" + + # When the status_command prints a new line to stdout, swaybar updates. + # The default just shows the current date and time. + status_command sxmo_status_watch.sh -o pango + + pango_markup enabled + + colors { + statusline #ffffff + background #323232 + inactive_workspace #323232 #323232 #ffffff + font "Sxmo 13" + } +} + +for_window [app_id="pinentry-.*"] floating true +for_window [app_id="foot" title=".*sxmo/modem/.*/draft.txt.*"] resize set height 25 +for_window [title="megapixels"] inhibit_idle open +for_window [title="ep[yr].*"] inhibit_idle visible + +default_border pixel 2 +titlebar_border_thickness 2 +hide_edge_borders smart + +# Need playerctl installed and running +bindsym --locked XF86AudioPlay exec playerctl play-pause +bindsym --locked XF86AudioPause exec playerctl play-pause +bindsym --locked XF86AudioStop exec playerctl stop +bindsym --locked XF86AudioNext exec playerctl next +bindsym --locked XF86AudioPrev exec playerctl previous + +bindsym --locked XF86MonBrightnessUp exec sxmo_brightness.sh up +bindsym --locked XF86MonBrightnessDown exec sxmo_brightness.sh down + +# Nokia N900-specific key bindings: +# 1. Bind lock key (XF86ScreenSaver) +# Use keycode due to https://github.com/swaywm/sway/issues/8438 +bindcode --release --locked --input-device="1:1:gpio_keys" 160 exec sxmo_state.sh set unlock +# 2. Workaround the lack of a free ModX key on hardware keyboard +bindsym --input-device="1:1:TWL4030_Keypad" Shift+space mode "N900" + +bindsym Print exec sxmo_screenshot.sh + +bindsym button2 kill + +bindswitch --locked lid:on exec sh -c "brightnessctl -d white:kbd_backlight set 0; sxmo_state.sh set screenoff" +bindswitch --locked lid:off exec sh -c "brightnessctl -d white:kbd_backlight set 255; sxmo_state.sh set unlock; sxmo_wm.sh display on" + +# Nokia 8110 4G hardware keypad bindings (User:Ybon) +bindsym --locked --no-repeat XF86KbdLcdMenu1 exec sxmo_hook_inputhandler.sh menuleft_one +bindsym --locked --no-repeat XF86KbdLcdMenu2 exec sxmo_hook_inputhandler.sh menuright_one +bindsym --locked --no-repeat XF86PickupPhone exec sxmo_multikey.sh pickup enter_one enter_two enter_three + +include /etc/sway/config.d/* + +exec 'printf %s "$SWAYSOCK" > "$XDG_RUNTIME_DIR"/sxmo.swaysock' + +exec sxmo_hook_start.sh + +# vim: ft=swayconfig diff --git a/overlay/rootfs/etc/udev/rules.d/70-nokia-argon-keypad.rules b/overlay/rootfs/etc/udev/rules.d/70-nokia-argon-keypad.rules new file mode 100644 index 0000000..f85a430 --- /dev/null +++ b/overlay/rootfs/etc/udev/rules.d/70-nokia-argon-keypad.rules @@ -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" diff --git a/overlay/rootfs/etc/udev/rules.d/90-nokia-argon-leds.rules b/overlay/rootfs/etc/udev/rules.d/90-nokia-argon-leds.rules new file mode 100644 index 0000000..b813e09 --- /dev/null +++ b/overlay/rootfs/etc/udev/rules.d/90-nokia-argon-leds.rules @@ -0,0 +1 @@ +SUBSYSTEM=="leds", ACTION=="add", RUN+="/bin/chgrp video /sys/class/leds/%k/brightness", RUN+="/bin/chmod 0664 /sys/class/leds/%k/brightness" diff --git a/overlay/rootfs/home/user/.config/dunst/dunstrc b/overlay/rootfs/home/user/.config/dunst/dunstrc new file mode 100644 index 0000000..2759edb --- /dev/null +++ b/overlay/rootfs/home/user/.config/dunst/dunstrc @@ -0,0 +1,37 @@ +# Space to setup configversion +# configversion: 75e8b9c31a47e01f21724c1e3beefc69 +[global] + width = 230 + height = 120 + offset = (5,26) + padding = 4 + horizontal_padding = 6 + frame_width = 2 + frame_color = "#005577" + idle_threshold = 120 + font = Monospace 12 + markup = full + max_icon_size = 24 + dmenu = sxmo_dmenu.sh -p dunst: + follow=mouse + mouse_left_click = do_action, close_current + +[shortcuts] + close_all = ctrl+shift+space + +[urgency_low] + background = "#222222" + foreground = "#cccccc" + timeout = 8 + +[urgency_normal] + background = "#1c1c1c" + foreground = "#ffffff" + frame_color = "#005577" + timeout = 12 + +[urgency_critical] + background = "#900000" + foreground = "#ffffff" + frame_color = "#ff0000" + timeout = 0 diff --git a/overlay/rootfs/home/user/.config/fcitx5/conf/classicui.conf b/overlay/rootfs/home/user/.config/fcitx5/conf/classicui.conf new file mode 100644 index 0000000..1c0446c --- /dev/null +++ b/overlay/rootfs/home/user/.config/fcitx5/conf/classicui.conf @@ -0,0 +1,9 @@ +Vertical Candidate List=False +WheelForPaging=True +Font="Sans Bold 13" +MenuFont="Sans 13" +TrayFont="Sans Bold 13" +PreferTextIcon=True +ShowLayoutNameInIcon=True +UseInputMethodLanguageToDisplayText=True +Theme=default-dark diff --git a/overlay/rootfs/home/user/.config/fcitx5/config b/overlay/rootfs/home/user/.config/fcitx5/config new file mode 100644 index 0000000..c1038b9 --- /dev/null +++ b/overlay/rootfs/home/user/.config/fcitx5/config @@ -0,0 +1,15 @@ +[Hotkey] +EnumerateWithTriggerKeys=True + +[Behavior] +ActiveByDefault=True +resetStateWhenFocusIn=No +ShareInputState=All +PreeditEnabledByDefault=True +ShowInputMethodInformation=True +showInputMethodInformationWhenFocusIn=False +CompactInputMethodInformation=True +ShowFirstInputMethodInformation=True +DefaultPageSize=7 +OverrideXkbOption=False +PreloadInputMethod=True diff --git a/overlay/rootfs/home/user/.config/fcitx5/profile b/overlay/rootfs/home/user/.config/fcitx5/profile new file mode 100644 index 0000000..4faba4c --- /dev/null +++ b/overlay/rootfs/home/user/.config/fcitx5/profile @@ -0,0 +1,16 @@ +[Groups/0] +# Group Name +Name=Default +# Layout +Default Layout=us +# Default Input Method +DefaultIM=t9 + +[Groups/0/Items/0] +# Name +Name=t9 +# Layout +Layout= + +[GroupOrder] +0=Default diff --git a/overlay/rootfs/home/user/.config/foot/foot.ini b/overlay/rootfs/home/user/.config/foot/foot.ini new file mode 100644 index 0000000..a263aad --- /dev/null +++ b/overlay/rootfs/home/user/.config/foot/foot.ini @@ -0,0 +1,40 @@ +# Space to setup configversion +# configversion: 13fb3d2d9f97f4420f7506e72b90e77d +font=monospace:size=13 +dpi-aware=no +pad=2x2 + +[colors-dark] +# alpha=1.0 +foreground=eaeaea +background=000000 +regular0=000000 # black +regular1=d54e53 # red +regular2=b9ca4a # green +regular3=e6c547 # yellow +regular4=7aa6da # blue +regular5=c397d8 # magenta +regular6=70c0ba # cyan +regular7=eaeaea # white +bright0=666666 # bright black +bright1=ff3334 # bright red +bright2=9ec400 # bright green +bright3=e7c547 # bright yellow +bright4=7aa6da # bright blue +bright5=b77ee0 # bright magenta +bright6=54ced6 # bright cyan +bright7=ffffff # bright white + +[scrollback] +lines=5000 + +[key-bindings] +scrollback-up-page=Shift+Page_Up +scrollback-down-page=Shift+Page_Down +scrollback-up-half-page=Page_Up +scrollback-down-half-page=Page_Down +scrollback-up-line=Shift+Up +scrollback-down-line=Shift+Down +scrollback-home=Shift+Home +scrollback-end=Shift+End + diff --git a/overlay/rootfs/home/user/.config/gtk-3.0/settings.ini b/overlay/rootfs/home/user/.config/gtk-3.0/settings.ini new file mode 100644 index 0000000..e978463 --- /dev/null +++ b/overlay/rootfs/home/user/.config/gtk-3.0/settings.ini @@ -0,0 +1,3 @@ +[Settings] +gtk-application-prefer-dark-theme=1 +gtk-font-name=Sans 13 diff --git a/overlay/rootfs/home/user/.config/sxmo/conky.conf b/overlay/rootfs/home/user/.config/sxmo/conky.conf new file mode 100644 index 0000000..8c00ea7 --- /dev/null +++ b/overlay/rootfs/home/user/.config/sxmo/conky.conf @@ -0,0 +1,18 @@ +-- Space to setup configversion +-- configversion: 19ec5c7f9e83bc6534d657f6180feba2 +conky.config = { + out_to_x = false, + out_to_wayland = true, + alignment = 'top_middle', + gap_y = 12, + own_window_argb_value = 0, + own_window_type = 'desktop', + default_shade_color = 'black', + draw_shades = true, + font = 'Sxmo:size=13', + use_xft = true, + update_interval = 15, +} + +conky.text = [[${alignc}${font Sxmo:size=34:style=Bold}${time %H:%M}${font} +${alignc}${font Sxmo:size=14:style=Bold}${time %a %d %b %Y}${font}]] diff --git a/overlay/rootfs/home/user/.config/sxmo/hooks/sxmo_hook_inputhandler.sh b/overlay/rootfs/home/user/.config/sxmo/hooks/sxmo_hook_inputhandler.sh new file mode 100755 index 0000000..ed3f8d4 --- /dev/null +++ b/overlay/rootfs/home/user/.config/sxmo/hooks/sxmo_hook_inputhandler.sh @@ -0,0 +1,540 @@ +#!/bin/sh +# configversion: 113bf453dd3310afff192d841089e5ac +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script handles input actions, it is called by lisgd for gestures +# and by dwm for button presses. Gestures are tied to actions in +# sxmo_hook_lisgdstart.sh . + +ACTION="$1" + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +stop_proximity_lock() { + sxmo_jobs.sh stop proximity_lock +} + +exec 0</dev/null 2>&1 || true + sxmo_state.sh set unlock + sxmo_wm.sh display on + ;; + "voldown_one") + sxmo_audio.sh vol down 5 + exit + ;; + "voldown_two") + sxmo_audio.sh vol down 10 + exit + ;; + "voldown_three") + sxmo_audio.sh vol down 15 + exit + ;; + "volup_one") + sxmo_audio.sh vol up 5 + exit + ;; + "volup_two") + sxmo_audio.sh vol up 10 + exit + ;; + "volup_three") + sxmo_audio.sh vol up 15 + exit + ;; + esac + #we're locked, don't process the rest of the script + exit 0 +fi + +#special context-sensitive handling +case "$WMCLASS" in + *"mpv"*) + case "$ACTION" in + "oneright") + sxmo_type.sh -k Left + exit 0 + ;; + "oneleft") + sxmo_type.sh -k Right + exit 0 + ;; + "oneup") + sxmo_type.sh m + exit 0 + ;; + "onedown") + sxmo_type.sh p + exit 0 + ;; + esac + ;; + *"acme"*) + case "$ACTION" in + "volup_one") + xdotool click 3 + exit 0 + ;; + "voldown_one") + xdotool click 2 + exit 0 + ;; + esac + ;; + *"links"*) + case "$ACTION" in + # you're probably dragging the scrollbar + *"uprightedge") exit 0 ;; + *"downrightedge") exit 0 ;; + *"onedown") + sxmo_type.sh -M Ctrl -M Shift -k b + exit 0 + ;; + *"oneup") + sxmo_type.sh -M Ctrl -M Shift -k f + exit 0 + ;; + esac + ;; + *"netsurf"*) + case "$ACTION" in + # you're probably dragging the scrollbar + *"uprightedge") exit 0 ;; + *"downrightedge") exit 0 ;; + *"onedown") + sxmo_type.sh -k Page_Up + exit 0 + ;; + *"oneup") + sxmo_type.sh -k Page_Down + exit 0 + ;; + esac + ;; + *"firefox"*|*"librewolf"*) + case "$ACTION" in + # you're probably dragging the scrollbar + *"uprightedge") exit 0 ;; + *"downrightedge") exit 0 ;; + esac + ;; + *"foot"*|*"st"*|*"vte"*|"terminal") # Terminals + case "$WMCLASS" in # Handle programs without touch support + *"st"*) + case "$WMNAME" in + *"weechat"*|*'gomuks'*) + case "$ACTION" in + *"onedown") + sxmo_type.sh -k Page_Up + exit 0 + ;; + *"oneup") + sxmo_type.sh -k Page_Down + exit 0 + ;; + esac + ;; + *"less"*|*"amfora"*) + case "$ACTION" in + *"onedown") + sxmo_type.sh u + exit 0 + ;; + *"oneup") + sxmo_type.sh d + exit 0 + ;; + esac + ;; + *'irssi'*) + case "$ACTION" in + "onedown") + sxmo_type.sh -M Alt p + exit 0 + ;; + "oneup") + sxmo_type.sh -M Alt n + exit 0 + ;; + esac + ;; + *'epy'*|*'epr'*) + case "$ACTION" in + "onedown") + sxmo_type.sh h + exit 0 + ;; + "oneup") + sxmo_type.sh l + exit 0 + ;; + esac + ;; + *'nnn'*|'lf') + case "$ACTION" in + "onedown") + sxmo_type.sh -k Down + exit 0 + ;; + "oneup") + sxmo_type.sh -k Up + exit 0 + ;; + esac + ;; + esac + ;; + esac + + case "$WMNAME" in # Handle programs + *"weechat"*) + case "$ACTION" in + *"oneleft") + sxmo_type.sh -M Alt -k a + exit 0 + ;; + *"oneright") + sxmo_type.sh -M Alt -k less + exit 0 + ;; + esac + ;; + *" sms") + case "$ACTION" in + *"upbottomedge") + number="$(printf %s "$WMNAME" | sed -e 's|^\"||' -e 's|\"$||' | cut -f1 -d' ')" + sxmo_terminal.sh sxmo_modemtext.sh conversationloop "$number" + exit 0 + ;; + esac + ;; + *"tuir"*) + if [ "$ACTION" = "rightbottomedge" ]; then + sxmo_type.sh o + exit 0 + elif [ "$ACTION" = "leftbottomedge" ]; then + sxmo_type.sh s + exit 0 + fi + ;; + *"less"*) + case "$ACTION" in + "leftbottomedge") + sxmo_type.sh q + exit 0 + ;; + "leftrightedge_short") + sxmo_type.sh q + exit 0 + ;; + *"oneleft") + sxmo_type.sh ":n" -k Return + exit 0 + ;; + *"oneright") + sxmo_type.sh ":p" -k Return + exit 0 + ;; + esac + ;; + *"amfora"*) + case "$ACTION" in + "downright") + sxmo_type.sh -k Tab + exit 0 + ;; + "upleft") + sxmo_type.sh -M Shift -k Tab + exit 0 + ;; + *"oneright") + sxmo_type.sh -k Return + exit 0 + ;; + "upright") + sxmo_type.sh -M Ctrl t + exit 0 + ;; + *"oneleft") + sxmo_type.sh b + exit 0 + ;; + "downleft") + sxmo_type.sh -M Ctrl w + exit 0 + ;; + esac + ;; + *"epy"*|*"epr"*) + case "$ACTION" in + *"left"|"voldown_one") + sxmo_type.sh l + exit 0 + ;; + *"right"|"volup_one") + sxmo_type.sh h + exit 0 + ;; + "voldown_three"|"twodownbottomedge") + sxmo_type.sh q + exit + ;; + esac + ;; + *'nnn'*|'lf') + case "$ACTION" in + *"left") + sxmo_type.sh -k Right + exit 0 + ;; + *"right") + sxmo_type.sh -k Left + exit 0 + ;; + esac + ;; + esac + + case "$WMCLASS" in # Handle general scrolling without touch support + *"st"*) + case "$ACTION" in + *"onedown") + sxmo_type.sh -M Ctrl -M Shift -k b + exit 0 + ;; + *"oneup") + sxmo_type.sh -M Ctrl -M Shift -k f + exit 0 + ;; + esac + ;; + "org.gnome.vte.application"|"terminal") + case "$ACTION" in + # For VTE, fallback to doing nothing, + # you're probably dragging the scrollbar + *"uprightedge") exit 0 ;; + *"downrightedge") exit 0 ;; + esac + ;; + esac + ;; +esac + +#standard handling +case "$ACTION" in + "menuright"*|"menuright_one") + if sxmo_dmenu.sh isopen; then + sxmo_dmenu.sh close + else + sxmo_appmenu.sh "$WMCLASS" "$WMNAME" + fi + exit 0 + ;; + "menuleft"*|"menuleft_one") + if sxmo_dmenu.sh isopen; then + sxmo_dmenu.sh close + else + sxmo_appmenu.sh sys + fi + exit 0 + ;; + "enter_one") + if pidof -q sxmo_RepeatRing.sh; then + sxmo_hook_pickup.sh + else + sxmo_appmenu.sh "$WMCLASS" "$WMNAME" + fi + exit 0 + ;; + "enter_two") + swaymsg focus next >/dev/null 2>&1 || sxmo_wm.sh switchfocus + exit 0 + ;; + "enter_three") + sxmo_wm.sh togglelayout + exit 0 + ;; + "powerbutton_one") + if echo "$WMCLASS" | grep -i "megapixels"; then + sxmo_type.sh -k space + else + sxmo_appmenu.sh power + fi + exit 0 + ;; + "powerbutton_two") + sxmo_state.sh click 2 + exit 0 + ;; + "powerbutton_three") + sxmo_terminal.sh + exit 0 + ;; + "voldown_one") + if [ -n "$SXMO_NO_VIRTUAL_KEYBOARD" ]; then + sxmo_killwindow.sh + else + sxmo_keyboard.sh toggle + fi + exit + ;; + "voldown_two") + sxmo_wm.sh togglelayout + exit + ;; + "voldown_three") + sxmo_killwindow.sh + exit + ;; + "volup_one") + sxmo_appmenu.sh "$WMCLASS" "$WMNAME" + exit + ;; + "volup_two") + sxmo_appmenu.sh sys + exit + ;; + "volup_three") + sxmo_wmmenu.sh + exit + ;; + "rightleftedge") + sxmo_wm.sh previousworkspace + exit 0 + ;; + "leftrightedge") + sxmo_wm.sh nextworkspace + exit 0 + ;; + "twoleft") + sxmo_wm.sh movepreviousworkspace + exit 0 + ;; + "tworight") + sxmo_wm.sh movenextworkspace + exit 0 + ;; + "righttopedge") + sxmo_brightness.sh up + exit 0 + ;; + "lefttopedge") + sxmo_brightness.sh down + exit 0 + ;; + "upleftedge") + sxmo_audio.sh vol up + exit 0 + ;; + "downleftedge") + sxmo_audio.sh vol down + exit 0 + ;; + "upbottomedge") + if [ -n "$SXMO_NO_VIRTUAL_KEYBOARD" ]; then + sxmo_terminal.sh + else + sxmo_keyboard.sh open + fi + exit 0 + ;; + "downbottomedge") + if [ -n "$SXMO_NO_VIRTUAL_KEYBOARD" ]; then + sxmo_killwindow.sh + else + sxmo_keyboard.sh close + fi + exit 0 + ;; + "downtopedge") + sxmo_dmenu.sh isopen || sxmo_appmenu.sh "$WMCLASS" "$WMNAME" + exit 0 + ;; + "twodowntopedge") + sxmo_hook_quickactions.sh + exit 0 + ;; + "uptopedge") + sxmo_dmenu.sh close + dunstctl close-all + exit 0 + ;; + "twodownbottomedge") + sxmo_killwindow.sh + exit 0 + ;; + "uprightedge") + sxmo_type.sh -k Up + exit 0 + ;; + "downrightedge") + sxmo_type.sh -k Down + exit 0 + ;; + "leftrightedge_short") + sxmo_type.sh -k Left + exit 0 + ;; + "rightrightedge_short") + sxmo_type.sh -k Right + exit 0 + ;; + "rightbottomedge") + sxmo_type.sh -k Return + exit 0 + ;; + "leftbottomedge") + sxmo_type.sh -k BackSpace + exit 0 + ;; + "topleftcorner") + sxmo_appmenu.sh sys + exit 0 + ;; + "toprightcorner") + sxmo_appmenu.sh scripts + exit 0 + ;; + "bottomleftcorner") + sxmo_dmenu.sh close + sxmo_keyboard.sh close + if [ -n "$WMCLASS" ]; then + sxmo_state.sh set lock + else + sxmo_state.sh set screenoff + fi + exit 0 + ;; + "bottomrightcorner") + sxmo_rotate.sh + exit 0 + ;; +esac diff --git a/overlay/rootfs/home/user/.config/sxmo/hooks/sxmo_hook_lisgdstart.sh b/overlay/rootfs/home/user/.config/sxmo/hooks/sxmo_hook_lisgdstart.sh new file mode 100755 index 0000000..93ebf43 --- /dev/null +++ b/overlay/rootfs/home/user/.config/sxmo/hooks/sxmo_hook_lisgdstart.sh @@ -0,0 +1,75 @@ +#!/bin/sh +# configversion: 32e953d311555ad8dd7b4c13d5a0fff4 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +LISGD_THRESHOLD="${SXMO_LISGD_THRESHOLD:-125}" +LISGD_THRESHOLD_PRESSED="${SXMO_LISGD_THRESHOLD_PRESSED:-60}" +LISGD_INPUT_DEVICE="${SXMO_LISGD_INPUT_DEVICE:-"/dev/input/by-path/first-touchscreen"}" + +case "$SXMO_WM" in + dwm|i3) + case "$(xrandr | grep primary | cut -d' ' -f 5)" in + right) orientation=1;; + left) orientation=3;; + inverted) orientation=2;; + *) orientation=0;; + esac + ;; +esac + +#-g format: +# fingers,swipe,edge,distance,command +#order matters, only the first match gets executed +lisgd "$@" -d "$LISGD_INPUT_DEVICE" ${orientation:+-o $orientation} \ + -s "${LISGD_EDGE_SIZE:-1.0}" -t "$LISGD_THRESHOLD" -T "$LISGD_THRESHOLD_PRESSED" \ + -g "1,DRUL,BR,*,setsid -f sxmo_hook_inputhandler.sh bottomrightcorner" \ + -g "1,DLUR,BL,*,setsid -f sxmo_hook_inputhandler.sh bottomleftcorner" \ + -g "1,ULDR,TL,*,setsid -f sxmo_hook_inputhandler.sh topleftcorner" \ + -g "1,URDL,TR,*,setsid -f sxmo_hook_inputhandler.sh toprightcorner" \ + -g "1,LR,B,L,setsid -f sxmo_hook_inputhandler.sh rightbottomedge" \ + -g "1,RL,B,L,setsid -f sxmo_hook_inputhandler.sh leftbottomedge" \ + -g "1,LR,L,*,setsid -f sxmo_hook_inputhandler.sh rightleftedge" \ + -g "1,RL,R,*,setsid -f sxmo_hook_inputhandler.sh leftrightedge" \ + -g "1,DU,L,*,P,setsid -f sxmo_hook_inputhandler.sh upleftedge" \ + -g "1,UD,L,*,P,setsid -f sxmo_hook_inputhandler.sh downleftedge" \ + -g "1,LR,T,*,P,setsid -f sxmo_hook_inputhandler.sh righttopedge" \ + -g "1,RL,T,*,P,setsid -f sxmo_hook_inputhandler.sh lefttopedge" \ + -g "1,DU,B,*,setsid -f sxmo_hook_inputhandler.sh upbottomedge" \ + -g "1,UD,B,*,setsid -f sxmo_hook_inputhandler.sh downbottomedge" \ + -g "1,UD,T,*,setsid -f sxmo_hook_inputhandler.sh downtopedge" \ + -g "1,DU,T,*,setsid -f sxmo_hook_inputhandler.sh uptopedge" \ + -g "2,UD,T,*,setsid -f sxmo_hook_inputhandler.sh twodowntopedge" \ + -g "2,UD,B,*,setsid -f sxmo_hook_inputhandler.sh twodownbottomedge" \ + -g "1,DU,R,*,P,setsid -f sxmo_hook_inputhandler.sh uprightedge" \ + -g "1,UD,R,*,P,setsid -f sxmo_hook_inputhandler.sh downrightedge" \ + -g "1,LR,R,S,setsid -f sxmo_hook_inputhandler.sh rightrightedge_short" \ + -g "1,RL,L,S,setsid -f sxmo_hook_inputhandler.sh leftrightedge_short" \ + -g "1,RL,*,L,setsid -f sxmo_hook_inputhandler.sh longoneleft" \ + -g "1,LR,*,L,setsid -f sxmo_hook_inputhandler.sh longoneright" \ + -g "1,DU,*,L,setsid -f sxmo_hook_inputhandler.sh longoneup" \ + -g "1,UD,*,L,setsid -f sxmo_hook_inputhandler.sh longonedown" \ + -g "1,RL,*,M,setsid -f sxmo_hook_inputhandler.sh mediumoneleft" \ + -g "1,LR,*,M,setsid -f sxmo_hook_inputhandler.sh mediumoneright" \ + -g "1,DU,*,M,setsid -f sxmo_hook_inputhandler.sh mediumoneup" \ + -g "1,UD,*,M,setsid -f sxmo_hook_inputhandler.sh mediumonedown" \ + -g "1,RL,*,*,setsid -f sxmo_hook_inputhandler.sh oneleft" \ + -g "1,LR,*,*,setsid -f sxmo_hook_inputhandler.sh oneright" \ + -g "1,DU,*,*,setsid -f sxmo_hook_inputhandler.sh oneup" \ + -g "1,UD,*,*,setsid -f sxmo_hook_inputhandler.sh onedown" \ + -g "1,DRUL,*,*,setsid -f sxmo_hook_inputhandler.sh upleft" \ + -g "1,URDL,*,*,setsid -f sxmo_hook_inputhandler.sh downleft" \ + -g "1,DLUR,*,*,setsid -f sxmo_hook_inputhandler.sh upright" \ + -g "1,ULDR,*,*,setsid -f sxmo_hook_inputhandler.sh downright" \ + -g "2,RL,*,*,setsid -f sxmo_hook_inputhandler.sh twoleft" \ + -g "2,LR,*,*,setsid -f sxmo_hook_inputhandler.sh tworight" \ + -g "2,DU,*,*,setsid -f sxmo_hook_inputhandler.sh twoup" \ + -g "2,UD,*,*,setsid -f sxmo_hook_inputhandler.sh twodown" \ + -g "3,RL,*,*,setsid -f sxmo_hook_inputhandler.sh threeleft" \ + -g "3,LR,*,*,setsid -f sxmo_hook_inputhandler.sh threeright" \ + -g "3,DU,*,*,setsid -f sxmo_hook_inputhandler.sh threeup" \ + -g "3,UD,*,*,setsid -f sxmo_hook_inputhandler.sh threedown" diff --git a/overlay/rootfs/home/user/.config/sxmo/hooks/sxmo_hook_start.sh b/overlay/rootfs/home/user/.config/sxmo/hooks/sxmo_hook_start.sh new file mode 100755 index 0000000..80f1f22 --- /dev/null +++ b/overlay/rootfs/home/user/.config/sxmo/hooks/sxmo_hook_start.sh @@ -0,0 +1,159 @@ +#!/bin/sh +# configversion: c73f9334f62c4c1addcaf074cbcb91e8 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# Runs upon system start and starts various background services + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# Create xdg user directories, such as ~/Pictures +xdg-user-dirs-update + +sxmo_jobs.sh start daemon_manager superd + +# let time to superd to start correctly +while ! superctl status > /dev/null 2>&1; do + sleep 0.5 +done + +# Not dangerous if "locker" isn't an available state +sxmo_state.sh set locker + +if [ -n "$SXMO_ROTATE_START" ]; then + sxmo_rotate.sh +fi + +# Load our sound daemons + +if [ -z "$SXMO_NO_AUDIO" ]; then + if ! [ -d /run/systemd/system ]; then + if [ "$(command -v pulseaudio)" ]; then + superctl start pulseaudio + elif [ "$(command -v pipewire)" ]; then + # pipewire-pulse will start pipewire + superctl start pipewire-pulse + superctl start wireplumber + fi + fi + + # monitor for headphone for statusbar + superctl start sxmo_soundmonitor +fi + +# Periodically update some status bar components +sxmo_hook_statusbar.sh all +sxmo_jobs.sh start statusbar_periodics sxmo_run_aligned.sh 60 \ + sxmo_hook_statusbar.sh periodics + +# dunst is required for warnings. +superctl start dunst + +# start adaptive brightness at boot +# superctl start sxmo_adaptivebrightness + +# load some other little things here too. +case "$SXMO_WM" in + river) + superctl start sxmo_wob + [ "$(command -v bonsaid)" ] && superctl start bonsaid + [ "$(command -v fcitx5)" ] && superctl start fcitx5 + superctl start sxmo_riverbar + ;; + sway) + superctl start sxmo_wob + superctl start sxmo_menumode_toggler + [ "$(command -v bonsaid)" ] && superctl start bonsaid + [ "$(command -v fcitx5)" ] && superctl start fcitx5 + ;; + dwm|i3) + superctl start sxmo_xob + + # Auto hide cursor with touchscreen, Show it with a mouse + if command -v "unclutter-xfixes" > /dev/null; then + set -- unclutter-xfixes + else + set -- unclutter + fi + superctl start "$1" + + superctl start autocutsel + superctl start autocutsel-primary + superctl start sxmo-x11-status + [ "$(command -v bonsaid)" ] && superctl start bonsaid + [ "$(command -v fcitx5)" ] && superctl start fcitx5 + [ -n "$SXMO_MONITOR" ] && xrandr --output "$SXMO_MONITOR" --primary + # Set onboard to auto-hide in config first + if [ "$KEYBOARD" = "onboard" ]; then + onboard "$KEYBOARD_ARGS" + fi + case "$SXMO_WM" in + i3) + xbindkeys -f "$XDG_CONFIG_HOME/sxmo/xbindkeysrc_$SXMO_BINDING_PROVIDER" + ;; + esac + ;; +esac + +# Turn on auto-suspend +if sxmo_wakelock.sh isenabled; then + sxmo_wakelock.sh lock sxmo_not_suspendable infinite + superctl start sxmo_autosuspend +fi + +# To setup initial unlock state +sxmo_state.sh set unlock + +# Turn on lisgd +if [ ! -e "$XDG_CACHE_HOME"/sxmo/sxmo.nogesture ]; then + superctl start sxmo_hook_lisgd +fi + +if [ -z "$SXMO_NO_MODEM" ] && command -v ModemManager > /dev/null; then + # Turn on the dbus-monitors for modem-related tasks + superctl start sxmo_modemmonitor + + # place a wakelock for 120s to allow the modem to fully warm up (eg25 + + # elogind/systemd would do this for us, but we don't use those.) + sxmo_wakelock.sh lock sxmo_modem_warming_up 120s +fi + +# Start the desktop wallpaper +superctl start sxmo_bg + +# Start the desktop widget (e.g. clock) +superctl start sxmo_conky + +# Monitor the battery +superctl start sxmo_battery_monitor + +# It watch network changes and update the status bar icon by example +superctl start sxmo_networkmonitor + +# The daemon that display notifications popup messages +superctl start sxmo_notificationmonitor + +# Play a funky startup tune if you want (disabled by default) +#mpv --quiet --no-video ~/welcome.ogg & + +# mmsd and vvmd +if [ -z "$SXMO_NO_MODEM" ]; then + if [ -f "${SXMO_MMS_BASE_DIR:-"$HOME"/.mms/modemmanager}/mms" ]; then + superctl start mmsd-tng + fi + + if [ -f "${SXMO_VVM_BASE_DIR:-"$HOME"/.vvm/modemmanager}/vvm" ]; then + superctl start vvmd + fi +fi + +# add some warnings if things are not setup correctly +if ! command -v "sxmo_deviceprofile_$SXMO_DEVICE_NAME.sh"; then + sxmo_notify_user.sh --urgency=critical \ + "No deviceprofile found $SXMO_DEVICE_NAME. See: https://sxmo.org/deviceprofile" +fi + +sxmo_migrate.sh state || sxmo_notify_user.sh --urgency=critical \ + "Config needs migration" "$? file(s) in your sxmo configuration are out of date and disabled - using defaults until you migrate (run sxmo_migrate.sh)" diff --git a/overlay/rootfs/home/user/.config/sxmo/hooks/sxmo_hook_wallpaper.sh b/overlay/rootfs/home/user/.config/sxmo/hooks/sxmo_hook_wallpaper.sh new file mode 100755 index 0000000..f828c91 --- /dev/null +++ b/overlay/rootfs/home/user/.config/sxmo/hooks/sxmo_hook_wallpaper.sh @@ -0,0 +1,29 @@ +#!/bin/sh -e +# configversion: 9c6286bbff8167b35278cf97aae4d7e6 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# This script is executed once, and must output the wallpaper to display + +installed_wallpapers() { + xdg_data_path wallpapers 0 "\0" | xargs -r0I{} find "{}" -name "$SXMO_OS.*" +} + +sxmo_wallpaper() { + xdg_data_path sxmo/background.jpg +} + +all_wallpapers() { + installed_wallpapers + sxmo_wallpaper +} + +if [ -n "$SXMO_BG_IMG" ]; then + printf "%s" "$SXMO_BG_IMG" + exit +fi + +all_wallpapers | head -n1 diff --git a/overlay/rootfs/home/user/.config/sxmo/profile b/overlay/rootfs/home/user/.config/sxmo/profile new file mode 100644 index 0000000..c378277 --- /dev/null +++ b/overlay/rootfs/home/user/.config/sxmo/profile @@ -0,0 +1,78 @@ +#!/bin/sh +# configversion: e7cdaa3a889d251bed8a89ce8c622995 + +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# Please modify this file to your liking + +# Important Instructions: +# All processes you launch from this script must +# be non-blocking: launch them in the background (using &) +# or ensure they return quickly. Only after this script +# finishes will the window manager be loaded + +# You will sometime get SMS or calls from not +# country code prefixed phone numbers. To make +# it easy to fixup configure the default countryu. +#export DEFAULT_COUNTRY=FR + +### Configuration Parameters ### + +# Note that this is just a subset of all available +# parameters, see the sxmo documentation for more. + +# Use firefox as default browser if installed +command -v firefox >/dev/null && export BROWSER=firefox + +# Prepopulate Subreddits menu with custom subreddits +#export SXMO_SUBREDDITS="postmarketos pinephoneOfficial pinephone unixporn" + +# Change the default terminal command +export TERMCMD="sxmo_terminal.sh" + +# Change the used terminal command +# export SXMO_TERMINAL="st" + +# When scrolling past the beginning or end of a menu, wrap it around: +#export DMENU_WRAP_AROUND=1 + +# Enable audio feedback on keypress +#export KEYBOARD_ARGS="-o | clickclack -f $(xdg_data_path sxmo/keytap.wav)" + +# Or, enable vibration feedback on keypress +#export KEYBOARD_ARGS="-o | clickclack -V" + +# Set the scale factor in sway +# export SXMO_SWAY_SCALE=2 + +# To load specific part of configuration depending on the running environment +case "$SXMO_WM" in + sway) + ;; + dwm) + ;; +esac + +#Set RINGTONE to audio file to play for incoming call +export SXMO_RINGTONE="$(xdg_data_path sxmo/ring.ogg)" + +#Set TEXTSOUND to audio file to play when received text message +export SXMO_TEXTSOUND="$(xdg_data_path sxmo/notify.ogg)" + +#Set RINGTIME to number of seconds the phone will ring +export SXMO_RINGTIME=20 + +#Set RINGNUMBER to number of times phone will ring or repeat ringtone +#(whichever of SXMO_RINGTIME or SXMO_RINGNUMBER runs less will limit how long phone rings) +export SXMO_RINGNUMBER=10 + +#Set to the default text for a new text message. +export SXMO_DEFAULT_DRAFT="Enter new message here." + +export GTK_IM_MODULE=fcitx +export QT_IM_MODULE=fcitx +export XMODIFIERS=@im=fcitx +export SXMO_MENU=wofi + +export SXMO_BG_IMG="/usr/share/wallpapers/bananarchy.png" diff --git a/overlay/rootfs/home/user/.config/sxmo/sway b/overlay/rootfs/home/user/.config/sxmo/sway new file mode 100644 index 0000000..de6396b --- /dev/null +++ b/overlay/rootfs/home/user/.config/sxmo/sway @@ -0,0 +1,296 @@ +# Default config for sway +# configversion: 076611fe8cc699bcaa01092a8e4481c0 +# +# Copy this to ~/.config/sway/config and edit it to your liking. +# +# Read `man 5 sway` for a complete reference. + +### Variables +# +# Logo key. Use Mod1 for Alt. +set $mod Mod4 +# Home row direction keys, like vim +set $left h +set $down j +set $up k +set $right l +# Your preferred terminal emulator +set $term sxmo_terminal.sh +# Your preferred application launcher +# Note: pass the final command to swaymsg so that the resulting window can be opened +# on the original workspace that the command was run on. +set $menu bemenu-run + +font "Sxmo 13" +xwayland disable +output * scale 1 bg /usr/share/wallpapers/bananarchy.png fill +default_orientation vertical + +exec_always sxmo_swayinitconf.sh + +exec_always dbus-update-activation-environment WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP + +mode "menu" { + bindsym --locked XF86PowerOff exec sh -c "sxmo_dmenu.sh close; if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; fi" + bindsym --locked XF86PickupPhone exec sh -c "if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; else wtype -k Return; fi" + bindsym --locked XF86KbdLcdMenu1 exec sh -c "sxmo_dmenu.sh close; if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; fi" + bindsym --locked XF86KbdLcdMenu2 exec sh -c "sxmo_dmenu.sh close; if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; fi" + bindsym XF86AudioRaiseVolume exec wtype -k Up + bindsym XF86AudioLowerVolume exec wtype -k Down + bindswitch --locked lid:on exec sh -c "sxmo_dmenu.sh close; brightnessctl -d white:kbd_backlight set 0; sxmo_state.sh set screenoff" + bindswitch --locked lid:off exec sh -c "brightnessctl -d white:kbd_backlight set 255; sxmo_state.sh set unlock; sxmo_wm.sh display on" +} + +# Mode specifically for use with Nokia N900 hardware keyboard +mode "N900" { + # follow the standard sxmo keybinds as far as possible + bindsym t exec $term; mode "default" + bindsym q mode "default" + bindsym Shift+p exec sxmo_appmenu.sh sys; mode "default" + bindsym p exec sxmo_appmenu.sh; mode "default" + bindsym d exec $menu; mode "default" + bindsym Shift+q kill; mode "default" + bindsym i exec sxmo_wmmenu.sh windowswitcher; mode "default" + bindsym Shift+c reload; mode "default" + bindsym f fullscreen; mode "default" + bindsym Shift+space floating toggle; mode "default" + bindsym a focus parent; mode "default" +} + +### Key bindings +# +# Basics: +# + input * xkb_options compose:ralt + + # Nokia N900 hardware keyboard + input "1:1:TWL4030_Keypad" { + xkb_model "nokiarx51" + xkb_layout "us" + # ralt has special meaning on N900 keyboard so do not use as + # compose key + xkb_options compose:rwin + } + + # Start a terminal + bindsym $mod+Return exec $term + + # Launch appmenu + bindsym $mod+p exec sxmo_appmenu.sh + bindsym $mod+Shift+p exec sxmo_appmenu.sh sys + + # Wm menu switcher + bindsym $mod+i exec sxmo_wmmenu.sh windowswitcher + + # Kill focused window + bindsym $mod+Shift+q kill + + # Start your launcher + bindsym $mod+d exec $menu + + # Drag floating windows by holding down $mod and left mouse button. + # Resize them with right mouse button + $mod. + # Despite the name, also works for non-floating windows. + # Change normal to inverse to use left mouse button for resizing and right + # mouse button for dragging. + floating_modifier $mod normal + + # Reload the configuration file + bindsym $mod+Shift+c reload + + # Exit sway (logs you out of your Wayland session) + bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'sxmo_power.sh logout' +# +# Moving around: +# + # Move your focus around + bindsym $mod+$left focus left + bindsym $mod+$down focus down + bindsym $mod+$up focus up + bindsym $mod+$right focus right + # Or use $mod+[up|down|left|right] + bindsym $mod+Left focus left + bindsym $mod+Down focus down + bindsym $mod+Up focus up + bindsym $mod+Right focus right + + # Move the focused window with the same, but add Shift + bindsym $mod+Shift+$left move left + bindsym $mod+Shift+$down move down + bindsym $mod+Shift+$up move up + bindsym $mod+Shift+$right move right + # Ditto, with arrow keys + bindsym $mod+Shift+Left move left + bindsym $mod+Shift+Down move down + bindsym $mod+Shift+Up move up + bindsym $mod+Shift+Right move right + + # Move the focused workspace to output + bindsym $mod+Shift+Ctrl+$left move workspace output left + bindsym $mod+Shift+Ctrl+$down move workspace output down + bindsym $mod+Shift+Ctrl+$up move workspace output up + bindsym $mod+Shift+Ctrl+$right move workspace output right +# +# Workspaces: +# + # Switch to workspace + bindsym $mod+1 workspace number 1 + bindsym $mod+2 workspace number 2 + bindsym $mod+3 workspace number 3 + bindsym $mod+4 workspace number 4 + bindsym $mod+5 workspace number 5 + bindsym $mod+6 workspace number 6 + bindsym $mod+7 workspace number 7 + bindsym $mod+8 workspace number 8 + bindsym $mod+9 workspace number 9 + bindsym $mod+0 workspace number 10 + # Move focused container to workspace + bindsym $mod+Shift+1 move container to workspace number 1 + bindsym $mod+Shift+2 move container to workspace number 2 + bindsym $mod+Shift+3 move container to workspace number 3 + bindsym $mod+Shift+4 move container to workspace number 4 + bindsym $mod+Shift+5 move container to workspace number 5 + bindsym $mod+Shift+6 move container to workspace number 6 + bindsym $mod+Shift+7 move container to workspace number 7 + bindsym $mod+Shift+8 move container to workspace number 8 + bindsym $mod+Shift+9 move container to workspace number 9 + bindsym $mod+Shift+0 move container to workspace number 10 + # Note: workspaces can have any name you want, not just numbers. + # We just use 1-10 as the default. +# +# Layout stuff: +# + # You can "split" the current object of your focus with + # $mod+b or $mod+v, for horizontal and vertical splits + # respectively. + bindsym $mod+b splith + bindsym $mod+v splitv + + # Switch the current container between different layout styles + bindsym $mod+s layout stacking + bindsym $mod+w layout tabbed + bindsym $mod+e layout toggle split + + # Make the current focus fullscreen + bindsym $mod+f fullscreen + + # Toggle the current focus between tiling and floating mode + bindsym $mod+Shift+space floating toggle + + # Swap focus between the tiling area and the floating area + bindsym $mod+space focus mode_toggle + + # Move focus to the parent container + bindsym $mod+a focus parent + + # Manual locker + bindsym $mod+g exec sxmo_state.sh set locker + + # Shutdown + bindsym $mod+t exec sxmo_appmenu.sh power + +# +# Scratchpad: +# + # Sway has a "scratchpad", which is a bag of holding for windows. + # You can send windows there and get them back later. + + # Move the currently focused window to the scratchpad + bindsym $mod+Shift+minus move scratchpad + + # Show the next scratchpad window or hide the focused scratchpad window. + # If there are multiple scratchpad windows, this command cycles through them. + bindsym $mod+minus scratchpad show +# +# Resizing containers: +# +mode "resize" { + # left will shrink the containers width + # right will grow the containers width + # up will shrink the containers height + # down will grow the containers height + bindsym $left resize shrink width 30px + bindsym $down resize grow height 30px + bindsym $up resize shrink height 30px + bindsym $right resize grow width 30px + + # Ditto, with arrow keys + bindsym Left resize shrink width 30px + bindsym Down resize grow height 30px + bindsym Up resize shrink height 30px + bindsym Right resize grow width 30px + + # Return to default mode + bindsym Return mode "default" + bindsym Escape mode "default" +} +bindsym $mod+r mode "resize" + +# +# Status Bar: +# +# Read `man 5 sway-bar` for more information about this section. +bar { + position top + height 24 + font "Sxmo 13" + + # When the status_command prints a new line to stdout, swaybar updates. + # The default just shows the current date and time. + status_command sxmo_status_watch.sh -o pango + + pango_markup enabled + + colors { + statusline #ffffff + background #323232 + inactive_workspace #323232 #323232 #ffffff + font "Sxmo 13" + } +} + +for_window [app_id="pinentry-.*"] floating true +for_window [app_id="foot" title=".*sxmo/modem/.*/draft.txt.*"] resize set height 25 +for_window [title="megapixels"] inhibit_idle open +for_window [title="ep[yr].*"] inhibit_idle visible + +default_border pixel 2 +titlebar_border_thickness 2 +hide_edge_borders smart + +# Need playerctl installed and running +bindsym --locked XF86AudioPlay exec playerctl play-pause +bindsym --locked XF86AudioPause exec playerctl play-pause +bindsym --locked XF86AudioStop exec playerctl stop +bindsym --locked XF86AudioNext exec playerctl next +bindsym --locked XF86AudioPrev exec playerctl previous + +bindsym --locked XF86MonBrightnessUp exec sxmo_brightness.sh up +bindsym --locked XF86MonBrightnessDown exec sxmo_brightness.sh down + +# Nokia N900-specific key bindings: +# 1. Bind lock key (XF86ScreenSaver) +# Use keycode due to https://github.com/swaywm/sway/issues/8438 +bindcode --release --locked --input-device="1:1:gpio_keys" 160 exec sxmo_state.sh set unlock +# 2. Workaround the lack of a free ModX key on hardware keyboard +bindsym --input-device="1:1:TWL4030_Keypad" Shift+space mode "N900" + +bindsym Print exec sxmo_screenshot.sh + +bindsym button2 kill + +bindswitch --locked lid:on exec sh -c "brightnessctl -d white:kbd_backlight set 0; sxmo_state.sh set screenoff" +bindswitch --locked lid:off exec sh -c "brightnessctl -d white:kbd_backlight set 255; sxmo_state.sh set unlock; sxmo_wm.sh display on" + +# Nokia 8110 4G hardware keypad bindings (User:Ybon) +bindsym --locked --no-repeat XF86KbdLcdMenu1 exec sxmo_hook_inputhandler.sh menuleft_one +bindsym --locked --no-repeat XF86KbdLcdMenu2 exec sxmo_hook_inputhandler.sh menuright_one +bindsym --locked --no-repeat XF86PickupPhone exec sxmo_multikey.sh pickup enter_one enter_two enter_three + +include /etc/sway/config.d/* + +exec 'printf %s "$SWAYSOCK" > "$XDG_RUNTIME_DIR"/sxmo.swaysock' + +exec sxmo_hook_start.sh + +# vim: ft=swayconfig diff --git a/overlay/rootfs/home/user/.config/wofi/config b/overlay/rootfs/home/user/.config/wofi/config new file mode 100644 index 0000000..601b590 --- /dev/null +++ b/overlay/rootfs/home/user/.config/wofi/config @@ -0,0 +1,12 @@ +# Space to setup configversion +# configversion: eb37989d3b93bf46e0df32db4ffd833e +matching=multi-contains +width=240 +height=296 +halign=fill +orientation=vertical +content_halign=fill +insensitive=true +prompt= +show=dmenu +no_actions=true diff --git a/overlay/rootfs/home/user/.config/wofi/style.css b/overlay/rootfs/home/user/.config/wofi/style.css new file mode 100644 index 0000000..d0795ad --- /dev/null +++ b/overlay/rootfs/home/user/.config/wofi/style.css @@ -0,0 +1,51 @@ +/* Space to setup configversion */ +/* configversion: 2ecca20b604bc0b37d13aba5a0fabc07 */ +* { + font-family: monospace; + font-size: 15px; +} + +window { + margin: 0px; + border: 2px solid #005577; + background-color: #1c1c1c; +} + +#input { + margin: 0px; + padding: 4px 6px; + border-radius: 0px; + border: 1px solid #005577; + background-color: #383838; + color: #ffffff; + font-size: 15px; + font-weight: bold; +} + +#inner-box { + margin: 0px; +} + +#outer-box { + margin: 1px; +} + +#scroll { + margin: 0px; + color: #ffdd00; +} + +#text { + margin: 1px 4px; + color: #ffffff; +} + +#entry { + padding: 3px 2px; + margin: 0px; +} + +#entry:selected { + background-color: #005577; + font-weight: bold; +} diff --git a/overlay/rootfs/lib/firmware/nokia,argon-gc9305-v2-panel.bin b/overlay/rootfs/lib/firmware/nokia,argon-gc9305-v2-panel.bin new file mode 100644 index 0000000..5aba36d Binary files /dev/null and b/overlay/rootfs/lib/firmware/nokia,argon-gc9305-v2-panel.bin differ diff --git a/overlay/rootfs/lib/firmware/nokia,beatles-gc9305-panel.bin b/overlay/rootfs/lib/firmware/nokia,beatles-gc9305-panel.bin new file mode 100644 index 0000000..5aba36d Binary files /dev/null and b/overlay/rootfs/lib/firmware/nokia,beatles-gc9305-panel.bin differ diff --git a/overlay/rootfs/lib/firmware/nokia,coconut-gc9305-panel.bin b/overlay/rootfs/lib/firmware/nokia,coconut-gc9305-panel.bin new file mode 100644 index 0000000..5aba36d Binary files /dev/null and b/overlay/rootfs/lib/firmware/nokia,coconut-gc9305-panel.bin differ diff --git a/overlay/rootfs/lib/firmware/nokia,leo-gc9305-hlt-24-panel.bin b/overlay/rootfs/lib/firmware/nokia,leo-gc9305-hlt-24-panel.bin new file mode 100644 index 0000000..2bde61e Binary files /dev/null and b/overlay/rootfs/lib/firmware/nokia,leo-gc9305-hlt-24-panel.bin differ diff --git a/overlay/rootfs/lib/firmware/nokia,sparkler-gc9307-hlt-28-panel.bin b/overlay/rootfs/lib/firmware/nokia,sparkler-gc9307-hlt-28-panel.bin new file mode 100644 index 0000000..1bea9d3 Binary files /dev/null and b/overlay/rootfs/lib/firmware/nokia,sparkler-gc9307-hlt-28-panel.bin differ diff --git a/overlay/rootfs/usr/bin/bantam b/overlay/rootfs/usr/bin/bantam new file mode 100755 index 0000000..161396b Binary files /dev/null and b/overlay/rootfs/usr/bin/bantam differ diff --git a/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,argon.sh b/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,argon.sh new file mode 100755 index 0000000..7c0b24d --- /dev/null +++ b/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,argon.sh @@ -0,0 +1,24 @@ +#!/bin/sh +export SXMO_WM=sway +export SXMO_ROTATION=normal + +# Native 1:1 240x320 QVGA resolution +export SXMO_SWAY_SCALE=1 + +# Physical button mappings +export SXMO_POWER_BUTTON="0:0:pm8916_pon" +export SXMO_VOLUME_UP_BUTTON="0:103:KEY_UP" +export SXMO_VOLUME_DOWN_BUTTON="0:108:KEY_DOWN" +export SXMO_MENU_LEFT_BUTTON="0:139:KEY_MENU" +export SXMO_MENU_RIGHT_BUTTON="0:158:KEY_BACK" +export SXMO_ENTER_BUTTON="0:352:KEY_OK" + +# Nokia 8110 4G has a physical keypad and no touchscreen +export SXMO_NO_VIRTUAL_KEYBOARD=1 +export KEYBOARD_ARGS="-H 1 -L 1" +export SXMO_MENU=wofi +export SXMO_WOFI_LANDSCAPE_WIDTH=320 +export SXMO_WOFI_LANDSCAPE_HEIGHT=200 +export SXMO_BEMENU_PORTRAIT_LINES=10 +export SXMO_BEMENU_LANDSCAPE_LINES=6 +export BEMENU_OPTS="--fn 'Sxmo 13' -H 24" diff --git a/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,beatles.sh b/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,beatles.sh new file mode 100755 index 0000000..7c0b24d --- /dev/null +++ b/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,beatles.sh @@ -0,0 +1,24 @@ +#!/bin/sh +export SXMO_WM=sway +export SXMO_ROTATION=normal + +# Native 1:1 240x320 QVGA resolution +export SXMO_SWAY_SCALE=1 + +# Physical button mappings +export SXMO_POWER_BUTTON="0:0:pm8916_pon" +export SXMO_VOLUME_UP_BUTTON="0:103:KEY_UP" +export SXMO_VOLUME_DOWN_BUTTON="0:108:KEY_DOWN" +export SXMO_MENU_LEFT_BUTTON="0:139:KEY_MENU" +export SXMO_MENU_RIGHT_BUTTON="0:158:KEY_BACK" +export SXMO_ENTER_BUTTON="0:352:KEY_OK" + +# Nokia 8110 4G has a physical keypad and no touchscreen +export SXMO_NO_VIRTUAL_KEYBOARD=1 +export KEYBOARD_ARGS="-H 1 -L 1" +export SXMO_MENU=wofi +export SXMO_WOFI_LANDSCAPE_WIDTH=320 +export SXMO_WOFI_LANDSCAPE_HEIGHT=200 +export SXMO_BEMENU_PORTRAIT_LINES=10 +export SXMO_BEMENU_LANDSCAPE_LINES=6 +export BEMENU_OPTS="--fn 'Sxmo 13' -H 24" diff --git a/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,coconut.sh b/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,coconut.sh new file mode 100755 index 0000000..7c0b24d --- /dev/null +++ b/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,coconut.sh @@ -0,0 +1,24 @@ +#!/bin/sh +export SXMO_WM=sway +export SXMO_ROTATION=normal + +# Native 1:1 240x320 QVGA resolution +export SXMO_SWAY_SCALE=1 + +# Physical button mappings +export SXMO_POWER_BUTTON="0:0:pm8916_pon" +export SXMO_VOLUME_UP_BUTTON="0:103:KEY_UP" +export SXMO_VOLUME_DOWN_BUTTON="0:108:KEY_DOWN" +export SXMO_MENU_LEFT_BUTTON="0:139:KEY_MENU" +export SXMO_MENU_RIGHT_BUTTON="0:158:KEY_BACK" +export SXMO_ENTER_BUTTON="0:352:KEY_OK" + +# Nokia 8110 4G has a physical keypad and no touchscreen +export SXMO_NO_VIRTUAL_KEYBOARD=1 +export KEYBOARD_ARGS="-H 1 -L 1" +export SXMO_MENU=wofi +export SXMO_WOFI_LANDSCAPE_WIDTH=320 +export SXMO_WOFI_LANDSCAPE_HEIGHT=200 +export SXMO_BEMENU_PORTRAIT_LINES=10 +export SXMO_BEMENU_LANDSCAPE_LINES=6 +export BEMENU_OPTS="--fn 'Sxmo 13' -H 24" diff --git a/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,leo.sh b/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,leo.sh new file mode 100755 index 0000000..7c0b24d --- /dev/null +++ b/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,leo.sh @@ -0,0 +1,24 @@ +#!/bin/sh +export SXMO_WM=sway +export SXMO_ROTATION=normal + +# Native 1:1 240x320 QVGA resolution +export SXMO_SWAY_SCALE=1 + +# Physical button mappings +export SXMO_POWER_BUTTON="0:0:pm8916_pon" +export SXMO_VOLUME_UP_BUTTON="0:103:KEY_UP" +export SXMO_VOLUME_DOWN_BUTTON="0:108:KEY_DOWN" +export SXMO_MENU_LEFT_BUTTON="0:139:KEY_MENU" +export SXMO_MENU_RIGHT_BUTTON="0:158:KEY_BACK" +export SXMO_ENTER_BUTTON="0:352:KEY_OK" + +# Nokia 8110 4G has a physical keypad and no touchscreen +export SXMO_NO_VIRTUAL_KEYBOARD=1 +export KEYBOARD_ARGS="-H 1 -L 1" +export SXMO_MENU=wofi +export SXMO_WOFI_LANDSCAPE_WIDTH=320 +export SXMO_WOFI_LANDSCAPE_HEIGHT=200 +export SXMO_BEMENU_PORTRAIT_LINES=10 +export SXMO_BEMENU_LANDSCAPE_LINES=6 +export BEMENU_OPTS="--fn 'Sxmo 13' -H 24" diff --git a/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,sparkler.sh b/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,sparkler.sh new file mode 100755 index 0000000..7c0b24d --- /dev/null +++ b/overlay/rootfs/usr/bin/sxmo_deviceprofile_nokia,sparkler.sh @@ -0,0 +1,24 @@ +#!/bin/sh +export SXMO_WM=sway +export SXMO_ROTATION=normal + +# Native 1:1 240x320 QVGA resolution +export SXMO_SWAY_SCALE=1 + +# Physical button mappings +export SXMO_POWER_BUTTON="0:0:pm8916_pon" +export SXMO_VOLUME_UP_BUTTON="0:103:KEY_UP" +export SXMO_VOLUME_DOWN_BUTTON="0:108:KEY_DOWN" +export SXMO_MENU_LEFT_BUTTON="0:139:KEY_MENU" +export SXMO_MENU_RIGHT_BUTTON="0:158:KEY_BACK" +export SXMO_ENTER_BUTTON="0:352:KEY_OK" + +# Nokia 8110 4G has a physical keypad and no touchscreen +export SXMO_NO_VIRTUAL_KEYBOARD=1 +export KEYBOARD_ARGS="-H 1 -L 1" +export SXMO_MENU=wofi +export SXMO_WOFI_LANDSCAPE_WIDTH=320 +export SXMO_WOFI_LANDSCAPE_HEIGHT=200 +export SXMO_BEMENU_PORTRAIT_LINES=10 +export SXMO_BEMENU_LANDSCAPE_LINES=6 +export BEMENU_OPTS="--fn 'Sxmo 13' -H 24" diff --git a/overlay/rootfs/usr/bin/sxmo_inputhandler.sh b/overlay/rootfs/usr/bin/sxmo_inputhandler.sh new file mode 100755 index 0000000..6ab0f12 --- /dev/null +++ b/overlay/rootfs/usr/bin/sxmo_inputhandler.sh @@ -0,0 +1,2 @@ +#!/bin/sh +exec sxmo_hook_inputhandler.sh "$@" diff --git a/overlay/rootfs/usr/bin/sxmo_power.sh b/overlay/rootfs/usr/bin/sxmo_power.sh new file mode 100755 index 0000000..707286b --- /dev/null +++ b/overlay/rootfs/usr/bin/sxmo_power.sh @@ -0,0 +1,41 @@ +#!/bin/sh +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +usage() { + printf "usage: %s [reboot|poweroff|logout|togglewm]\n" "$(basename "$0")" +} + +case "$1" in + reboot) + sxmo_hook_power.sh reboot || true + sxmo_jobs.sh stop all >/dev/null 2>&1 || true + sync + (sleep 5; doas /sbin/reboot -f >/dev/null 2>&1) & + doas /sbin/reboot || doas reboot || doas /sbin/reboot -f + ;; + poweroff) + sxmo_hook_power.sh poweroff || true + sxmo_jobs.sh stop all >/dev/null 2>&1 || true + sync + (sleep 5; doas /sbin/poweroff -f >/dev/null 2>&1) & + doas /sbin/poweroff || doas poweroff || doas /sbin/poweroff -f + ;; + logout) + sxmo_hook_logout.sh || true + case "$SXMO_WM" in + "i3") i3-msg exit ;; + "sway") swaymsg exit ;; + "river") riverctl exit ;; + "dwm") pkill dwm ;; + esac + ;; + togglewm) sxmo_togglewm.sh ;; + *) + usage + exit 1 + ;; +esac diff --git a/overlay/rootfs/usr/bin/sxmo_swayinitconf.sh b/overlay/rootfs/usr/bin/sxmo_swayinitconf.sh new file mode 100755 index 0000000..f9b2f12 --- /dev/null +++ b/overlay/rootfs/usr/bin/sxmo_swayinitconf.sh @@ -0,0 +1,96 @@ +#!/bin/sh +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# Run from sway. + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +monitor="${SXMO_MONITOR:-"$(swaymsg -t get_outputs | jq -r '.[0] | .name')"}" +pwr="$SXMO_POWER_BUTTON" +vols="$SXMO_VOLUME_BUTTON" + +# Drop this when bonsai is available on 32 bits systems +multikey_retrocompat() { + sxmo_multikey.sh clear + + if [ -n "$pwr" ]; then + swaymsg -- input "$pwr" repeat_delay 200 + swaymsg -- input "$pwr" repeat_rate 15 + swaymsg -- bindsym --locked XF86PowerOff exec sxmo_multikey.sh \ + powerbutton \ + powerbutton_one \ + powerbutton_two \ + powerbutton_three + else + swaymsg -- bindsym --locked XF86PowerOff exec \ + sxmo_hook_inputhandler.sh powerbutton_one + fi + + if [ -n "$vols" ]; then + for vol in $vols; do + swaymsg -- input "$vol" repeat_delay 200 + swaymsg -- input "$vol" repeat_rate 15 + + swaymsg -- bindsym --locked --input-device="$vol" XF86AudioRaiseVolume exec \ + sxmo_multikey.sh \ + volup \ + volup_one \ + volup_two \ + volup_three + + swaymsg -- bindsym --locked --input-device="$vol" XF86AudioLowerVolume exec \ + sxmo_multikey.sh \ + voldown \ + voldown_one \ + voldown_two \ + voldown_three + done + else + swaymsg -- bindsym --locked XF86AudioRaiseVolume exec \ + sxmo_hook_inputhandler.sh volup_one + swaymsg -- bindsym --locked XF86AudioLowerVolume exec \ + sxmo_hook_inputhandler.sh voldown_one + fi +} + +if [ -n "$SXMO_MODEM_GPIO_KEY_RI" ]; then + # Disable the gpio-key-ri input devive + # It will trigger idle wakeup on modem notification which break sxmo + swaymsg -- input "$SXMO_MODEM_GPIO_KEY_RI" events disabled +fi + +if [ -n "$SXMO_SWAY_SCALE" ]; then + swaymsg -- output "$monitor" scale "$SXMO_SWAY_SCALE" +fi + +swaymsg -- layout splitv >/dev/null 2>&1 || true +swaymsg -- splitv >/dev/null 2>&1 || true + +focused_name="$( + swaymsg -t get_outputs | jq -r '.[] | select(.focused == true) | .name' +)" +swaymsg -- input type:touch map_to_output "$focused_name" +swaymsg -- input type:tablet_tool map_to_output "$focused_name" + +if [ -n "$SXMO_DISABLE_KEYBINDS" ]; then + swaymsg -- bindsym --locked XF86PowerOff exec \ + sxmo_hook_inputhandler.sh powerbutton_one + exit 0 +fi + +if ! command -v bonsaictl > /dev/null; then + multikey_retrocompat + exit +fi + +swaymsg -- bindsym --locked --no-repeat XF86PowerOff exec bonsaictl -e power_pressed +swaymsg -- bindsym --locked --release XF86PowerOff exec bonsaictl -e power_released + +swaymsg -- bindsym --locked --no-repeat XF86AudioRaiseVolume exec bonsaictl -e volup_pressed +swaymsg -- bindsym --locked --release XF86AudioRaiseVolume exec bonsaictl -e volup_released + +swaymsg -- bindsym --locked --no-repeat XF86AudioLowerVolume exec bonsaictl -e voldown_pressed +swaymsg -- bindsym --locked --release XF86AudioLowerVolume exec bonsaictl -e voldown_released diff --git a/overlay/rootfs/usr/bin/sxmo_timezonechange.sh b/overlay/rootfs/usr/bin/sxmo_timezonechange.sh new file mode 100755 index 0000000..ff7cdbd --- /dev/null +++ b/overlay/rootfs/usr/bin/sxmo_timezonechange.sh @@ -0,0 +1,50 @@ +#!/bin/sh +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +change_alpine() { + echo "Changing timezone to $1" + + doas setup-timezone -z "$1" + sxmo_hook_statusbar.sh time + + echo "Timezone changed ok" +} + +change_systemd() { + echo "Changing timezone to $1" + + timedatectl set-timezone "$1" + sxmo_hook_statusbar.sh time + + echo "Timezone changed ok" +} + +menu() { + zoneinfo_dir=$(xdg_data_path zoneinfo) + T="$( + find "$zoneinfo_dir" -type f | + sed "s#^${zoneinfo_dir}/##g" | + sort | + sxmo_dmenu.sh -p Timezone -i + )" || exit 0 + sxmo_terminal.sh "$0" "$T" +} + +if [ $# -gt 0 ]; then + trap "read -r" EXIT + set -e + + case "$SXMO_OS" in + alpine|postmarketos|bananarchy) change_alpine "$@";; + arch|archarm|debian) change_systemd "$@";; + nixos) echo "Change the timezone in configuration.nix with time.timeZone = \"[timezone]\"";; + *) echo "Changing the timezone isn't implemented on your distro yet";; + esac +else + menu +fi diff --git a/overlay/rootfs/usr/bin/sxmo_upgrade.sh b/overlay/rootfs/usr/bin/sxmo_upgrade.sh new file mode 100755 index 0000000..fcfd8dc --- /dev/null +++ b/overlay/rootfs/usr/bin/sxmo_upgrade.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +trap "read -r" EXIT + +update_apk() { + echo "Updating all packages from repositories" + doas apk update + + echo "Upgrading all packages" + doas apk upgrade -aiv + + echo "Upgrade complete - reboot for all changes to take effect" +} + +update_pacman() { + echo "Upgrading all packages" + doas pacman -Syu + + echo "Upgrade complete - reboot for all changes to take effect" +} + +update_nixos() { + echo "Upgrading all packages" + # nohup needed because nixos-rebuild might restart the display manager + # (and thus the terminal we're running in) before the update is complete + doas nohup nixos-rebuild switch --upgrade > /tmp/sxmo-last-upgrade.log & + coreutils --coreutils-prog=tail -f /tmp/sxmo-last-upgrade.log --pid=$! + + echo "Upgrade complete - reboot for all changes to take effect" +} + +sxmo_wakelock.sh lock sxmo_upgrading infinite + +case "$SXMO_OS" in + alpine|postmarketos|bananarchy) update_apk;; + arch|archarm) update_pacman;; + nixos) update_nixos;; +esac + +sxmo_wakelock.sh unlock sxmo_upgrading diff --git a/overlay/rootfs/usr/bin/sxmo_wm.sh b/overlay/rootfs/usr/bin/sxmo_wm.sh new file mode 100755 index 0000000..8ee80ea --- /dev/null +++ b/overlay/rootfs/usr/bin/sxmo_wm.sh @@ -0,0 +1,533 @@ +#!/bin/sh +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# shellcheck disable=SC2317 disable=SC2329 +# include common definitions +# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh +. sxmo_hook_icons.sh +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +swi3msg() { + case "$SXMO_WM" in + sway) swaymsg "$@" ;; + i3) i3-msg "$@" ;; + esac +} + +# Output Power Management {{{ +xorgdisplay() { + case "$1" in + off) + xset dpms 0 0 3 + xset dpms force off + ;; + on) + xset dpms 0 0 0 + xset dpms force on + ;; + "") + if xset q | grep -q "Off: 3"; then + printf "off\n" + else + printf "on\n" + fi + ;; + *) + printf 'sxmo_wm.sh display: unknown command "%s"\n' "$1" >&2 + printf 'Usage: sxmo_wm.sh display [on|off]\n' >&2 + ;; + esac +} + +wldisplay() { + case "$1" in + on) wlopm --on "*" ;; + off) wlopm --off "*";; + "") + if wlopm | grep -q "on"; then + printf "on\n" + else + printf "off\n" + fi + ;; + *) + printf 'sxmo_wm.sh display: unknown command "%s"\n' "$1" >&2 + printf 'Usage: sxmo_wm.sh display [on|off]\n' >&2 + ;; + esac +} + +wm_generic_dpms() { + sxmo_log "WARNING: $0: the dpms subcommand is deprecated, use display instead" + + # The dpms command was origionally implemented with on/off being the + # opposite of what they should have been. Swap them for backwards + # compatability. + case "$1" in + on) + shift + set -- "off" "$@" + ;; + off) + shift + set -- "on" "$@" + ;; + esac + + dispatch display "$@" +} +# }}} + +# inputevent {{{ +xorginputevent() { + if [ "$1" = "touchscreen" ]; then + TOUCH_POINTER_ID="$SXMO_TOUCHSCREEN_ID" + elif [ "$1" = "stylus" ]; then + TOUCH_POINTER_ID="$SXMO_STYLUS_ID" + fi + + if [ -z "$TOUCH_POINTER_ID" ]; then + echo "not found" + return 0 + fi + + STATE=off + if xinput list-props "$TOUCH_POINTER_ID" | \ + grep "Device Enabled" | \ + grep -q "1$"; then + STATE=on + fi + + if [ -z "$2" ]; then + printf %s "$STATE" + elif [ "$2" = on ] && [ "$STATE" != on ]; then + xinput enable "$TOUCH_POINTER_ID" + elif [ "$2" = off ] && [ "$STATE" != off ] ; then + xinput disable "$TOUCH_POINTER_ID" + fi +} + +swayinputevent() { + if [ "$1" = "touchscreen" ]; then + TOUCH_POINTER_ID="touch" + elif [ "$1" = "stylus" ]; then + TOUCH_POINTER_ID="tablet_tool" + fi + + # If we dont have any matching input + if ! swaymsg -t get_inputs \ + | jq -r ".[] | select(.type == \"$TOUCH_POINTER_ID\" )" \ + | grep -q .; then + + if [ -z "$2" ]; then + printf "not found" + exit 0 + else + exit 0 + fi + fi + + STATE=on + if swaymsg -t get_inputs \ + | jq -r ".[] | select(.type == \"$TOUCH_POINTER_ID\" ) | .libinput.send_events" \ + | grep -q "disabled"; then + STATE=off + fi + + if [ -z "$2" ]; then + printf %s "$STATE" + elif [ "$2" = on ] && [ "$STATE" != on ]; then + swaymsg "input type:$TOUCH_POINTER_ID events enabled" > /dev/null + elif [ "$2" = off ] && [ "$STATE" != off ] ; then + swaymsg "input type:$TOUCH_POINTER_ID events disabled" > /dev/null + fi +} +# }}} + +# focusedwindow {{{ +_xorgfocusedwindow() { + xprop -id "$(xdotool getactivewindow 2>/dev/null)" 2>/dev/null | awk ' + /^WM_CLASS/ { + sub(/^WM_CLASS[^=]*= ?"[^"]*", "/, "") + sub(/"$/, "") + class = $0 + } + /^WM_NAME/ { + sub(/^WM_NAME[^=]*= ?"/, "") + sub(/"$/, "") + title = $0 + } + END { printf "%s\n%s\n", tolower(class), tolower(title) } + ' +} + +_swi3_focusedwindow() { + swi3msg -t get_tree | jq -r ' + recurse(.nodes[]) | + select(.focused == true) | + { + app_id: (if .app_id != null then + .app_id + else + .window_properties.class + end) | gsub("\n"; "\\n") | ascii_downcase, + name: (.name | gsub("\n"; "\\n") | ascii_downcase), + } | + select(.app_id != null and .name != null) | + "\(.app_id)\n\(.name)" + ' +} + +_raw_focusedwindow() { + case "$SXMO_WM" in + dwm) _xorgfocusedwindow ;; + sway|i3) _swi3_focusedwindow ;; + river) lswt -j | jq -r ' + .toplevels | + map(select(.activated))[0] | + (."app-id" | ascii_downcase), (.title | ascii_downcase) + ' + esac +} + +wm_generic_focusedwindow() { + if [ "$1" = "-r" ]; then + _raw_focusedwindow + else + # This script originally output this format, which is a bit + # harder to parse. Keep it for backwards compatibility in case + # anyone was using it. + _raw_focusedwindow | { + read -r app + read -r title + printf "app: %s\ntitle: %s\n" "$app" "$title" + } + fi +} +# }}} + +# paste {{{ +wlpaste() { + wl-paste +} + +xorgpaste() { + xclip -o +} +# }}} + +# exec {{{ +wm_generic__swi3exec_inner() { + cmd="$(cat "$1")" + rm "$1" + eval "$cmd" +} + +swi3exec() { + set -e + + cmdfile="$(mktemp)" + jq -r --null-input '$ARGS.positional | @sh' --args -- "$@" > "$cmdfile" + + swi3msg exec "sxmo_wm.sh _swi3exec_inner '$cmdfile'" > /dev/null +} + +riverexec() { + riverctl spawn "$@" +} + +xorgexec() { + if [ -z "$DISPLAY" ]; then + export DISPLAY=:0 + fi + "$@" & +} +# }}} + +# execwait {{{ +wm_generic__execwait_inner() { + notify_file="$1/done" + shift + + # This opens the pipe for writing, when this process exits it will be + # closed, which will send eof to the monitoring process. + exec 3>"$notify_file" + + "$@" +} + +_execwait() { + set -e + runner="$1" + shift + + notify_dir="$(mktemp -d)" + mkfifo "$notify_dir/done" + + "$runner" sxmo_wm.sh _execwait_inner "$notify_dir" "$@" + + exec 3<"$notify_dir/done" + + # The exec line won't finish until the inner file has been opened for + # writing, so it's safe to remove the temp dir here. + rm -r "$notify_dir" + + # Wait for the notification file to be closed + read -r _ <&3 || true +} + +swi3execwait() { + _execwait swi3exec "$@" +} + +riverexecwait() { + _execwait riverexec "$@" +} + +xorgexecwait() { + if [ -z "$DISPLAY" ]; then + export DISPLAY=:0 + fi + exec "$@" +} +# }}} + +# toggle layout {{{ +swi3togglelayout() { + swi3msg "layout toggle splitv splith tabbed" > /dev/null +} + +dwmtogglelayout() { + if [ -z "$DISPLAY" ]; then + export DISPLAY=:0 + fi + xdotool key --clearmodifiers key Super+space +} + +rivertogglelayout() { + riverctl toggle-fullscreen +} +# }}} + +# switch focus {{{ +i3switchfocus() { + sxmo_wmmenu.sh i3windowswitcher +} + +swayswitchfocus() { + sxmo_wmmenu.sh swaywindowswitcher +} + +dwmswitchfocus() { + if [ -z "$DISPLAY" ]; then + export DISPLAY=:0 + fi + xdotool key --clearmodifiers Super+x +} +# }}} + +# workspace switching {{{ +_swi3getcurrentworkspace() { + swi3msg -t get_workspaces | jq -r '.[] | select(.focused).name' +} + +_swi3getnextworkspace() { + value="$(($(_swi3getcurrentworkspace)+1))" + if [ "$value" -eq "$((${SXMO_WORKSPACE_WRAPPING:-4}+1))" ]; then + printf 1 + else + printf %s "$value" + fi +} + +_swi3getpreviousworkspace() { + value="$(($(_swi3getcurrentworkspace)-1))" + if [ "$value" -lt 1 ]; then + if [ "${SXMO_WORKSPACE_WRAPPING:-4}" -ne 0 ]; then + printf %s "${SXMO_WORKSPACE_WRAPPING:-4}" + else + return 1 # cant have previous workspace + fi + else + printf %s "$value" + fi +} + +swi3nextworkspace() { + swi3msg "workspace $(_swi3getnextworkspace)" > /dev/null +} + +rivernextworkspace() { + river-shifttags +} + +dwmnextworkspace() { + if [ -z "$DISPLAY" ]; then + export DISPLAY=:0 + fi + xdotool key --clearmodifiers Super+Shift+r +} + +swi3previousworkspace() { + swi3msg "workspace $(_swi3getpreviousworkspace )" > /dev/null +} + +dwmpreviousworkspace() { + if [ -z "$DISPLAY" ]; then + export DISPLAY=:0 + fi + xdotool key --clearmodifiers Super+Shift+e +} + +riverpreviousworkspace() { + river-shifttags --shift -1 +} + +swi3movenextworkspace() { + swi3msg "move container to workspace $(_swi3getnextworkspace)" > /dev/null +} + +dwmmovenextworkspace() { + if [ -z "$DISPLAY" ]; then + export DISPLAY=:0 + fi + xdotool key --clearmodifiers Super+r +} + +swi3movepreviousworkspace() { + swi3msg "move container to workspace $(_swi3getpreviousworkspace )" > /dev/null +} + +dwmmovepreviousworkspace() { + if [ -z "$DISPLAY" ]; then + export DISPLAY=:0 + fi + xdotool key --clearmodifiers Super+e +} + +swi3workspace() { + swi3msg "workspace $1" > /dev/null +} + +riverworkspace() { + tags=$((1 << ($1 - 1))) + riverctl set-focused-tags "$tags" +} + +dwmworkspace() { + if [ -z "$DISPLAY" ]; then + export DISPLAY=:0 + fi + xdotool key --clearmodifiers "Super+$1" +} + +swi3moveworkspace() { + swi3msg "move container to workspace $1" > /dev/null +} + +rivermoveworkspace() { + tags=$((1 << ($1 - 1))) + riverctl set-view-tags "$tags" +} + +dwmmoveworkspace() { + if [ -z "$DISPLAY" ]; then + export DISPLAY=:0 + fi + xdotool key --clearmodifiers "Super+shift+$1" +} +# }}} + +# toggle bar {{{ +swi3togglebar() { + swi3msg "bar mode toggle" > /dev/null +} + +dwmtogglebar() { + if [ -z "$DISPLAY" ]; then + export DISPLAY=:0 + fi + xdotool key --clearmodifiers "Super+b" +} + +rivertogglebar() { + if superctl status sxmo_riverbar | grep -q started; then + superctl stop sxmo_riverbar + else + superctl start sxmo_riverbar + fi +} +# }}} + +# configmenuentry {{{ +wm_generic_configmenuentry() { + case "$SXMO_WM" in + dwm) + printf "%s\n" "$icon_cfg Edit configuration ^ 0 ^ sxmo_terminal.sh $EDITOR $XDG_CONFIG_HOME/sxmo/xinit" + ;; + i3) + printf "%s\n" "$icon_cfg Edit configuration ^ 0 ^ sxmo_terminal.sh $EDITOR $XDG_CONFIG_HOME/sxmo/i3" + ;; + river) + printf "%s\n" "$icon_cfg Edit configuration ^ 0 ^ sxmo_terminal.sh $EDITOR $XDG_CONFIG_HOME/sxmo/river" + ;; + sway) + printf "%s\n" "$icon_cfg Edit configuration ^ 0 ^ sxmo_terminal.sh $EDITOR $XDG_CONFIG_HOME/sxmo/sway" + ;; + esac +} +# }}} + +dispatch() { + if [ "$#" -lt 1 ]; then + echo "Usage: sxmo_wm.sh " >&2 + return 1 + fi + + action="$1" + shift + + # invoke action covering single wm + if type "$SXMO_WM$action" >/dev/null 2>&1; then + "$SXMO_WM$action" "$@" + return + fi + + # invoke action covering multiple wms + if [ "$SXMO_WM" = "sway" ] || [ "$SXMO_WM" = "i3" ]; then + if type "swi3$action" >/dev/null 2>&1; then + "swi3$action" "$@" + return + fi + fi + + # invoke action covering all of xorg/wayland + case "$SXMO_WM" in + dwm|i3) + if type "xorg$action" >/dev/null 2>&1; then + "xorg$action" "$@" + return + fi + ;; + sway|river) + # We don't yet support everything + if type "wl$action" >/dev/null 2>&1; then + "wl$action" "$@" + return + fi + ;; + esac + + # invoke action covering all wms + if type "wm_generic_$action" >/dev/null 2>&1; then + "wm_generic_$action" "$@" + return + else + printf "%s not implemented for %s\n" "$action" "$SXMO_WM" >&2 + return 1 + fi +} + +dispatch "$@" diff --git a/overlay/rootfs/usr/bin/sxmo_wmmenu.sh b/overlay/rootfs/usr/bin/sxmo_wmmenu.sh new file mode 100755 index 0000000..1d9c417 --- /dev/null +++ b/overlay/rootfs/usr/bin/sxmo_wmmenu.sh @@ -0,0 +1,429 @@ +#!/bin/sh +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# this script is a menu which lets the user perform some WM actions. + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh +# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh +. sxmo_hook_icons.sh + +set -e + +_movetowssubmenu() { + for ws in $(seq "${SXMO_WORKSPACE_WRAPPING:-4}"); do + printf "%s Move to WS %s\n" "$ws" "$ws" + done +} + +# A menu which allows to move windows or toggle floating. +swaymovemenu() { + CHOICES="$(cat < + + + + + + + diff --git a/overlay/rootfs/usr/share/alsa/ucm2/msm8916-1mic/msm8916-1mic.conf b/overlay/rootfs/usr/share/alsa/ucm2/msm8916-1mic/msm8916-1mic.conf new file mode 100644 index 0000000..ce507e8 --- /dev/null +++ b/overlay/rootfs/usr/share/alsa/ucm2/msm8916-1mic/msm8916-1mic.conf @@ -0,0 +1,6 @@ +Syntax 3 + +SectionUseCase."HiFi" { + File "HiFi.conf" + Comment "Play and record HiFi quality Music" +} diff --git a/overlay/rootfs/usr/share/alsa/ucm2/msm8916/HiFi.conf b/overlay/rootfs/usr/share/alsa/ucm2/msm8916/HiFi.conf new file mode 100644 index 0000000..dfa8da9 --- /dev/null +++ b/overlay/rootfs/usr/share/alsa/ucm2/msm8916/HiFi.conf @@ -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" +} + + + + + + + + + diff --git a/overlay/rootfs/usr/share/alsa/ucm2/msm8916/msm8916.conf b/overlay/rootfs/usr/share/alsa/ucm2/msm8916/msm8916.conf new file mode 100644 index 0000000..ce507e8 --- /dev/null +++ b/overlay/rootfs/usr/share/alsa/ucm2/msm8916/msm8916.conf @@ -0,0 +1,6 @@ +Syntax 3 + +SectionUseCase."HiFi" { + File "HiFi.conf" + Comment "Play and record HiFi quality Music" +} diff --git a/overlay/rootfs/usr/share/fcitx5/addon/t9.conf b/overlay/rootfs/usr/share/fcitx5/addon/t9.conf new file mode 100644 index 0000000..fc4092a --- /dev/null +++ b/overlay/rootfs/usr/share/fcitx5/addon/t9.conf @@ -0,0 +1,12 @@ +[Addon] +Name=t9 +Category=InputMethod +Enabled=True +Library=t9 +Type=SharedLibrary +OnDemand=False +RegisterInputMethod=True +Configurable=False + +[Addon/Dependencies] +0=core diff --git a/overlay/rootfs/usr/share/fcitx5/inputmethod/t9.conf b/overlay/rootfs/usr/share/fcitx5/inputmethod/t9.conf new file mode 100644 index 0000000..b1f0e4a --- /dev/null +++ b/overlay/rootfs/usr/share/fcitx5/inputmethod/t9.conf @@ -0,0 +1,7 @@ +[InputMethod] +Name=T9 +Icon=input-keyboard +Label=T9 +LangCode=en +Addon=t9 +Configurable=False diff --git a/overlay/rootfs/usr/share/icons/hicolor/128x128/apps/bananarchy.png b/overlay/rootfs/usr/share/icons/hicolor/128x128/apps/bananarchy.png new file mode 100644 index 0000000..ac0d58e Binary files /dev/null and b/overlay/rootfs/usr/share/icons/hicolor/128x128/apps/bananarchy.png differ diff --git a/overlay/rootfs/usr/share/icons/hicolor/16x16/apps/bananarchy.png b/overlay/rootfs/usr/share/icons/hicolor/16x16/apps/bananarchy.png new file mode 100644 index 0000000..0023ea2 Binary files /dev/null and b/overlay/rootfs/usr/share/icons/hicolor/16x16/apps/bananarchy.png differ diff --git a/overlay/rootfs/usr/share/icons/hicolor/24x24/apps/bananarchy.png b/overlay/rootfs/usr/share/icons/hicolor/24x24/apps/bananarchy.png new file mode 100644 index 0000000..5b68e2c Binary files /dev/null and b/overlay/rootfs/usr/share/icons/hicolor/24x24/apps/bananarchy.png differ diff --git a/overlay/rootfs/usr/share/icons/hicolor/256x256/apps/bananarchy.png b/overlay/rootfs/usr/share/icons/hicolor/256x256/apps/bananarchy.png new file mode 100644 index 0000000..c3b41f7 Binary files /dev/null and b/overlay/rootfs/usr/share/icons/hicolor/256x256/apps/bananarchy.png differ diff --git a/overlay/rootfs/usr/share/icons/hicolor/32x32/apps/bananarchy.png b/overlay/rootfs/usr/share/icons/hicolor/32x32/apps/bananarchy.png new file mode 100644 index 0000000..3e015a3 Binary files /dev/null and b/overlay/rootfs/usr/share/icons/hicolor/32x32/apps/bananarchy.png differ diff --git a/overlay/rootfs/usr/share/icons/hicolor/48x48/apps/bananarchy.png b/overlay/rootfs/usr/share/icons/hicolor/48x48/apps/bananarchy.png new file mode 100644 index 0000000..316826e Binary files /dev/null and b/overlay/rootfs/usr/share/icons/hicolor/48x48/apps/bananarchy.png differ diff --git a/overlay/rootfs/usr/share/icons/hicolor/512x512/apps/bananarchy.png b/overlay/rootfs/usr/share/icons/hicolor/512x512/apps/bananarchy.png new file mode 100644 index 0000000..800d1f3 Binary files /dev/null and b/overlay/rootfs/usr/share/icons/hicolor/512x512/apps/bananarchy.png differ diff --git a/overlay/rootfs/usr/share/icons/hicolor/64x64/apps/bananarchy.png b/overlay/rootfs/usr/share/icons/hicolor/64x64/apps/bananarchy.png new file mode 100644 index 0000000..096caab Binary files /dev/null and b/overlay/rootfs/usr/share/icons/hicolor/64x64/apps/bananarchy.png differ diff --git a/overlay/rootfs/usr/share/mkinitfs/files/00-nokia-argon-display.files b/overlay/rootfs/usr/share/mkinitfs/files/00-nokia-argon-display.files new file mode 100644 index 0000000..a2efc23 --- /dev/null +++ b/overlay/rootfs/usr/share/mkinitfs/files/00-nokia-argon-display.files @@ -0,0 +1,5 @@ +/lib/firmware/nokia,argon-gc9305-v2-panel.bin +/lib/firmware/nokia,beatles-gc9305-panel.bin +/lib/firmware/nokia,coconut-gc9305-panel.bin +/lib/firmware/nokia,sparkler-gc9307-hlt-28-panel.bin +/lib/firmware/nokia,leo-gc9305-hlt-24-panel.bin diff --git a/overlay/rootfs/usr/share/pixmaps/bananarchy-icon.png b/overlay/rootfs/usr/share/pixmaps/bananarchy-icon.png new file mode 100644 index 0000000..c6ba48c Binary files /dev/null and b/overlay/rootfs/usr/share/pixmaps/bananarchy-icon.png differ diff --git a/overlay/rootfs/usr/share/pixmaps/bananarchy-splash.png b/overlay/rootfs/usr/share/pixmaps/bananarchy-splash.png new file mode 100644 index 0000000..77b9ddd Binary files /dev/null and b/overlay/rootfs/usr/share/pixmaps/bananarchy-splash.png differ diff --git a/overlay/rootfs/usr/share/pixmaps/bananarchy.png b/overlay/rootfs/usr/share/pixmaps/bananarchy.png new file mode 100644 index 0000000..ac0d58e Binary files /dev/null and b/overlay/rootfs/usr/share/pixmaps/bananarchy.png differ diff --git a/overlay/rootfs/usr/share/sxmo/appcfg/conky.conf b/overlay/rootfs/usr/share/sxmo/appcfg/conky.conf new file mode 100644 index 0000000..8c00ea7 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/appcfg/conky.conf @@ -0,0 +1,18 @@ +-- Space to setup configversion +-- configversion: 19ec5c7f9e83bc6534d657f6180feba2 +conky.config = { + out_to_x = false, + out_to_wayland = true, + alignment = 'top_middle', + gap_y = 12, + own_window_argb_value = 0, + own_window_type = 'desktop', + default_shade_color = 'black', + draw_shades = true, + font = 'Sxmo:size=13', + use_xft = true, + update_interval = 15, +} + +conky.text = [[${alignc}${font Sxmo:size=34:style=Bold}${time %H:%M}${font} +${alignc}${font Sxmo:size=14:style=Bold}${time %a %d %b %Y}${font}]] diff --git a/overlay/rootfs/usr/share/sxmo/appcfg/dunst.conf b/overlay/rootfs/usr/share/sxmo/appcfg/dunst.conf new file mode 100644 index 0000000..2759edb --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/appcfg/dunst.conf @@ -0,0 +1,37 @@ +# Space to setup configversion +# configversion: 75e8b9c31a47e01f21724c1e3beefc69 +[global] + width = 230 + height = 120 + offset = (5,26) + padding = 4 + horizontal_padding = 6 + frame_width = 2 + frame_color = "#005577" + idle_threshold = 120 + font = Monospace 12 + markup = full + max_icon_size = 24 + dmenu = sxmo_dmenu.sh -p dunst: + follow=mouse + mouse_left_click = do_action, close_current + +[shortcuts] + close_all = ctrl+shift+space + +[urgency_low] + background = "#222222" + foreground = "#cccccc" + timeout = 8 + +[urgency_normal] + background = "#1c1c1c" + foreground = "#ffffff" + frame_color = "#005577" + timeout = 12 + +[urgency_critical] + background = "#900000" + foreground = "#ffffff" + frame_color = "#ff0000" + timeout = 0 diff --git a/overlay/rootfs/usr/share/sxmo/appcfg/foot.ini b/overlay/rootfs/usr/share/sxmo/appcfg/foot.ini new file mode 100644 index 0000000..a263aad --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/appcfg/foot.ini @@ -0,0 +1,40 @@ +# Space to setup configversion +# configversion: 13fb3d2d9f97f4420f7506e72b90e77d +font=monospace:size=13 +dpi-aware=no +pad=2x2 + +[colors-dark] +# alpha=1.0 +foreground=eaeaea +background=000000 +regular0=000000 # black +regular1=d54e53 # red +regular2=b9ca4a # green +regular3=e6c547 # yellow +regular4=7aa6da # blue +regular5=c397d8 # magenta +regular6=70c0ba # cyan +regular7=eaeaea # white +bright0=666666 # bright black +bright1=ff3334 # bright red +bright2=9ec400 # bright green +bright3=e7c547 # bright yellow +bright4=7aa6da # bright blue +bright5=b77ee0 # bright magenta +bright6=54ced6 # bright cyan +bright7=ffffff # bright white + +[scrollback] +lines=5000 + +[key-bindings] +scrollback-up-page=Shift+Page_Up +scrollback-down-page=Shift+Page_Down +scrollback-up-half-page=Page_Up +scrollback-down-half-page=Page_Down +scrollback-up-line=Shift+Up +scrollback-down-line=Shift+Down +scrollback-home=Shift+Home +scrollback-end=Shift+End + diff --git a/overlay/rootfs/usr/share/sxmo/appcfg/sway_template b/overlay/rootfs/usr/share/sxmo/appcfg/sway_template new file mode 100644 index 0000000..de6396b --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/appcfg/sway_template @@ -0,0 +1,296 @@ +# Default config for sway +# configversion: 076611fe8cc699bcaa01092a8e4481c0 +# +# Copy this to ~/.config/sway/config and edit it to your liking. +# +# Read `man 5 sway` for a complete reference. + +### Variables +# +# Logo key. Use Mod1 for Alt. +set $mod Mod4 +# Home row direction keys, like vim +set $left h +set $down j +set $up k +set $right l +# Your preferred terminal emulator +set $term sxmo_terminal.sh +# Your preferred application launcher +# Note: pass the final command to swaymsg so that the resulting window can be opened +# on the original workspace that the command was run on. +set $menu bemenu-run + +font "Sxmo 13" +xwayland disable +output * scale 1 bg /usr/share/wallpapers/bananarchy.png fill +default_orientation vertical + +exec_always sxmo_swayinitconf.sh + +exec_always dbus-update-activation-environment WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP + +mode "menu" { + bindsym --locked XF86PowerOff exec sh -c "sxmo_dmenu.sh close; if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; fi" + bindsym --locked XF86PickupPhone exec sh -c "if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; else wtype -k Return; fi" + bindsym --locked XF86KbdLcdMenu1 exec sh -c "sxmo_dmenu.sh close; if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; fi" + bindsym --locked XF86KbdLcdMenu2 exec sh -c "sxmo_dmenu.sh close; if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; fi" + bindsym XF86AudioRaiseVolume exec wtype -k Up + bindsym XF86AudioLowerVolume exec wtype -k Down + bindswitch --locked lid:on exec sh -c "sxmo_dmenu.sh close; brightnessctl -d white:kbd_backlight set 0; sxmo_state.sh set screenoff" + bindswitch --locked lid:off exec sh -c "brightnessctl -d white:kbd_backlight set 255; sxmo_state.sh set unlock; sxmo_wm.sh display on" +} + +# Mode specifically for use with Nokia N900 hardware keyboard +mode "N900" { + # follow the standard sxmo keybinds as far as possible + bindsym t exec $term; mode "default" + bindsym q mode "default" + bindsym Shift+p exec sxmo_appmenu.sh sys; mode "default" + bindsym p exec sxmo_appmenu.sh; mode "default" + bindsym d exec $menu; mode "default" + bindsym Shift+q kill; mode "default" + bindsym i exec sxmo_wmmenu.sh windowswitcher; mode "default" + bindsym Shift+c reload; mode "default" + bindsym f fullscreen; mode "default" + bindsym Shift+space floating toggle; mode "default" + bindsym a focus parent; mode "default" +} + +### Key bindings +# +# Basics: +# + input * xkb_options compose:ralt + + # Nokia N900 hardware keyboard + input "1:1:TWL4030_Keypad" { + xkb_model "nokiarx51" + xkb_layout "us" + # ralt has special meaning on N900 keyboard so do not use as + # compose key + xkb_options compose:rwin + } + + # Start a terminal + bindsym $mod+Return exec $term + + # Launch appmenu + bindsym $mod+p exec sxmo_appmenu.sh + bindsym $mod+Shift+p exec sxmo_appmenu.sh sys + + # Wm menu switcher + bindsym $mod+i exec sxmo_wmmenu.sh windowswitcher + + # Kill focused window + bindsym $mod+Shift+q kill + + # Start your launcher + bindsym $mod+d exec $menu + + # Drag floating windows by holding down $mod and left mouse button. + # Resize them with right mouse button + $mod. + # Despite the name, also works for non-floating windows. + # Change normal to inverse to use left mouse button for resizing and right + # mouse button for dragging. + floating_modifier $mod normal + + # Reload the configuration file + bindsym $mod+Shift+c reload + + # Exit sway (logs you out of your Wayland session) + bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'sxmo_power.sh logout' +# +# Moving around: +# + # Move your focus around + bindsym $mod+$left focus left + bindsym $mod+$down focus down + bindsym $mod+$up focus up + bindsym $mod+$right focus right + # Or use $mod+[up|down|left|right] + bindsym $mod+Left focus left + bindsym $mod+Down focus down + bindsym $mod+Up focus up + bindsym $mod+Right focus right + + # Move the focused window with the same, but add Shift + bindsym $mod+Shift+$left move left + bindsym $mod+Shift+$down move down + bindsym $mod+Shift+$up move up + bindsym $mod+Shift+$right move right + # Ditto, with arrow keys + bindsym $mod+Shift+Left move left + bindsym $mod+Shift+Down move down + bindsym $mod+Shift+Up move up + bindsym $mod+Shift+Right move right + + # Move the focused workspace to output + bindsym $mod+Shift+Ctrl+$left move workspace output left + bindsym $mod+Shift+Ctrl+$down move workspace output down + bindsym $mod+Shift+Ctrl+$up move workspace output up + bindsym $mod+Shift+Ctrl+$right move workspace output right +# +# Workspaces: +# + # Switch to workspace + bindsym $mod+1 workspace number 1 + bindsym $mod+2 workspace number 2 + bindsym $mod+3 workspace number 3 + bindsym $mod+4 workspace number 4 + bindsym $mod+5 workspace number 5 + bindsym $mod+6 workspace number 6 + bindsym $mod+7 workspace number 7 + bindsym $mod+8 workspace number 8 + bindsym $mod+9 workspace number 9 + bindsym $mod+0 workspace number 10 + # Move focused container to workspace + bindsym $mod+Shift+1 move container to workspace number 1 + bindsym $mod+Shift+2 move container to workspace number 2 + bindsym $mod+Shift+3 move container to workspace number 3 + bindsym $mod+Shift+4 move container to workspace number 4 + bindsym $mod+Shift+5 move container to workspace number 5 + bindsym $mod+Shift+6 move container to workspace number 6 + bindsym $mod+Shift+7 move container to workspace number 7 + bindsym $mod+Shift+8 move container to workspace number 8 + bindsym $mod+Shift+9 move container to workspace number 9 + bindsym $mod+Shift+0 move container to workspace number 10 + # Note: workspaces can have any name you want, not just numbers. + # We just use 1-10 as the default. +# +# Layout stuff: +# + # You can "split" the current object of your focus with + # $mod+b or $mod+v, for horizontal and vertical splits + # respectively. + bindsym $mod+b splith + bindsym $mod+v splitv + + # Switch the current container between different layout styles + bindsym $mod+s layout stacking + bindsym $mod+w layout tabbed + bindsym $mod+e layout toggle split + + # Make the current focus fullscreen + bindsym $mod+f fullscreen + + # Toggle the current focus between tiling and floating mode + bindsym $mod+Shift+space floating toggle + + # Swap focus between the tiling area and the floating area + bindsym $mod+space focus mode_toggle + + # Move focus to the parent container + bindsym $mod+a focus parent + + # Manual locker + bindsym $mod+g exec sxmo_state.sh set locker + + # Shutdown + bindsym $mod+t exec sxmo_appmenu.sh power + +# +# Scratchpad: +# + # Sway has a "scratchpad", which is a bag of holding for windows. + # You can send windows there and get them back later. + + # Move the currently focused window to the scratchpad + bindsym $mod+Shift+minus move scratchpad + + # Show the next scratchpad window or hide the focused scratchpad window. + # If there are multiple scratchpad windows, this command cycles through them. + bindsym $mod+minus scratchpad show +# +# Resizing containers: +# +mode "resize" { + # left will shrink the containers width + # right will grow the containers width + # up will shrink the containers height + # down will grow the containers height + bindsym $left resize shrink width 30px + bindsym $down resize grow height 30px + bindsym $up resize shrink height 30px + bindsym $right resize grow width 30px + + # Ditto, with arrow keys + bindsym Left resize shrink width 30px + bindsym Down resize grow height 30px + bindsym Up resize shrink height 30px + bindsym Right resize grow width 30px + + # Return to default mode + bindsym Return mode "default" + bindsym Escape mode "default" +} +bindsym $mod+r mode "resize" + +# +# Status Bar: +# +# Read `man 5 sway-bar` for more information about this section. +bar { + position top + height 24 + font "Sxmo 13" + + # When the status_command prints a new line to stdout, swaybar updates. + # The default just shows the current date and time. + status_command sxmo_status_watch.sh -o pango + + pango_markup enabled + + colors { + statusline #ffffff + background #323232 + inactive_workspace #323232 #323232 #ffffff + font "Sxmo 13" + } +} + +for_window [app_id="pinentry-.*"] floating true +for_window [app_id="foot" title=".*sxmo/modem/.*/draft.txt.*"] resize set height 25 +for_window [title="megapixels"] inhibit_idle open +for_window [title="ep[yr].*"] inhibit_idle visible + +default_border pixel 2 +titlebar_border_thickness 2 +hide_edge_borders smart + +# Need playerctl installed and running +bindsym --locked XF86AudioPlay exec playerctl play-pause +bindsym --locked XF86AudioPause exec playerctl play-pause +bindsym --locked XF86AudioStop exec playerctl stop +bindsym --locked XF86AudioNext exec playerctl next +bindsym --locked XF86AudioPrev exec playerctl previous + +bindsym --locked XF86MonBrightnessUp exec sxmo_brightness.sh up +bindsym --locked XF86MonBrightnessDown exec sxmo_brightness.sh down + +# Nokia N900-specific key bindings: +# 1. Bind lock key (XF86ScreenSaver) +# Use keycode due to https://github.com/swaywm/sway/issues/8438 +bindcode --release --locked --input-device="1:1:gpio_keys" 160 exec sxmo_state.sh set unlock +# 2. Workaround the lack of a free ModX key on hardware keyboard +bindsym --input-device="1:1:TWL4030_Keypad" Shift+space mode "N900" + +bindsym Print exec sxmo_screenshot.sh + +bindsym button2 kill + +bindswitch --locked lid:on exec sh -c "brightnessctl -d white:kbd_backlight set 0; sxmo_state.sh set screenoff" +bindswitch --locked lid:off exec sh -c "brightnessctl -d white:kbd_backlight set 255; sxmo_state.sh set unlock; sxmo_wm.sh display on" + +# Nokia 8110 4G hardware keypad bindings (User:Ybon) +bindsym --locked --no-repeat XF86KbdLcdMenu1 exec sxmo_hook_inputhandler.sh menuleft_one +bindsym --locked --no-repeat XF86KbdLcdMenu2 exec sxmo_hook_inputhandler.sh menuright_one +bindsym --locked --no-repeat XF86PickupPhone exec sxmo_multikey.sh pickup enter_one enter_two enter_three + +include /etc/sway/config.d/* + +exec 'printf %s "$SWAYSOCK" > "$XDG_RUNTIME_DIR"/sxmo.swaysock' + +exec sxmo_hook_start.sh + +# vim: ft=swayconfig diff --git a/overlay/rootfs/usr/share/sxmo/appcfg/wob.ini b/overlay/rootfs/usr/share/sxmo/appcfg/wob.ini new file mode 100644 index 0000000..144c86a --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/appcfg/wob.ini @@ -0,0 +1,6 @@ +# Space to setup configversion +# configversion: 4de2da84af48414f557742c29bde606e +anchor = top +width = 220 +height = 28 +margin = 28 diff --git a/overlay/rootfs/usr/share/sxmo/appcfg/wofi.css b/overlay/rootfs/usr/share/sxmo/appcfg/wofi.css new file mode 100644 index 0000000..d0795ad --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/appcfg/wofi.css @@ -0,0 +1,51 @@ +/* Space to setup configversion */ +/* configversion: 2ecca20b604bc0b37d13aba5a0fabc07 */ +* { + font-family: monospace; + font-size: 15px; +} + +window { + margin: 0px; + border: 2px solid #005577; + background-color: #1c1c1c; +} + +#input { + margin: 0px; + padding: 4px 6px; + border-radius: 0px; + border: 1px solid #005577; + background-color: #383838; + color: #ffffff; + font-size: 15px; + font-weight: bold; +} + +#inner-box { + margin: 0px; +} + +#outer-box { + margin: 1px; +} + +#scroll { + margin: 0px; + color: #ffdd00; +} + +#text { + margin: 1px 4px; + color: #ffffff; +} + +#entry { + padding: 3px 2px; + margin: 0px; +} + +#entry:selected { + background-color: #005577; + font-weight: bold; +} diff --git a/overlay/rootfs/usr/share/sxmo/background.jpg b/overlay/rootfs/usr/share/sxmo/background.jpg new file mode 100644 index 0000000..4d5f7cb Binary files /dev/null and b/overlay/rootfs/usr/share/sxmo/background.jpg differ diff --git a/overlay/rootfs/usr/share/sxmo/conky.conf b/overlay/rootfs/usr/share/sxmo/conky.conf new file mode 100644 index 0000000..8c00ea7 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/conky.conf @@ -0,0 +1,18 @@ +-- Space to setup configversion +-- configversion: 19ec5c7f9e83bc6534d657f6180feba2 +conky.config = { + out_to_x = false, + out_to_wayland = true, + alignment = 'top_middle', + gap_y = 12, + own_window_argb_value = 0, + own_window_type = 'desktop', + default_shade_color = 'black', + draw_shades = true, + font = 'Sxmo:size=13', + use_xft = true, + update_interval = 15, +} + +conky.text = [[${alignc}${font Sxmo:size=34:style=Bold}${time %H:%M}${font} +${alignc}${font Sxmo:size=14:style=Bold}${time %a %d %b %Y}${font}]] diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_after_call.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_after_call.sh new file mode 100755 index 0000000..8213e5f --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_after_call.sh @@ -0,0 +1,6 @@ +#!/bin/sh +# configversion: 77910b44307f185952a7db643cc56d36 + +# This script is executed after the last call finished + +sxmo_playerctl.sh resume_all diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_apps.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_apps.sh new file mode 100755 index 0000000..5e1e257 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_apps.sh @@ -0,0 +1,234 @@ +#!/bin/sh +# configversion: f1282bb39c782471bb788ccf8df0bb76 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors +# shellcheck disable=SC2154 + +# include common definitions \ +# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh +. sxmo_hook_icons.sh + +write_line() { + printf "%s ^ 0 ^ %s\n" "$1" "$2" +} + +write_line_app() { + executable="$1" + label="$2" + command="$3" + if command -v "$executable" >/dev/null; then + write_line "$label" "$command" + fi +} + +[ -n "$PLAN9" ] && write_line_app acme "$icon_edt Acme" "acme -c 1 -f $PLAN9/font/pelm/ascii.16.font" +write_line_app adventure "$icon_trm Adventure" "sxmo_terminal.sh adventure" +write_line_app aerc "$icon_eml Aerc" "sxmo_terminal.sh aerc" +write_line_app alacritty "$icon_trm Alacritty" "alacritty" +write_line_app amberol "$icon_mus Amberol" "amberol $XDG_MUSIC_DIR" +write_line_app harbour-amazfish-ui "$icon_wat Amazfish" "harbour-amazfish-ui" +write_line_app amfora "$icon_glb Amfora" "sxmo_terminal.sh amfora" +write_line_app angelfish "$icon_glb Angelfish" "angelfish" +write_line_app animatch "$icon_gam Animatch" "animatch" +write_line_app alpine "$icon_eml Alpine" "sxmo_terminal.sh alpine" +write_line_app anbox-launch "$icon_and Anbox" "anbox" +write_line_app anki "$icon_str Anki" "anki" +write_line_app audacity "$icon_mic Audacity" "audacity" +write_line_app badwolf "$icon_glb Badwolf" "badwolf" +write_line_app baobab "$icon_pie Baobab" "baobab" +write_line_app bluetuith "$icon_bth Bluetuith" "sxmo_terminal.sh bluetuith" +write_line_app calcurse "$icon_clk Calcurse" "sxmo_terminal.sh calcurse" +write_line_app celluloid "$icon_mvi Celluloid" "celluloid" +write_line_app chatty "$icon_msg Chatty" "chatty" +([ -z "$WAYLAND_DISPLAY" ] && command -v clipmenu >/dev/null) && \ + write_line_app clipmenu "$icon_bok Clipmenu" "clipmenu" +write_line_app cmus "$icon_mus Cmus" "sxmo_terminal.sh cmus" +write_line_app com.github.geigi.cozy "$icon_mus Cozy" "com.github.geigi.cozy" +write_line_app cpupower-gui "$icon_cfg Cpupower-gui" "cpupower-gui" +write_line_app deja-dup "$icon_bkp Déjà Dup" "deja-dup" +write_line_app dialect "$icon_tsl Dialect" "dialect" +write_line_app dino "$icon_msg Dino" "GDK_SCALE=1 dino" +write_line_app dissent "$icon_dis Dissent" "dissent" +write_line_app dolphin "$icon_dir Dolphin" "dolphin" +write_line_app drawing "$icon_drw Drawing" "drawing" +write_line_app eartag "$icon_mus Ear Tag" "eartag" +write_line_app elinks "$icon_glb ELinks" "sxmo_terminal.sh elinks" +write_line_app emacs "$icon_ema Emacs (Terminal)" "sxmo_terminal.sh emacs -nw" +write_line_app emacs "$icon_ema Emacs (X)" "emacs" +write_line_app eog "$icon_img Eye of Gnome" "eog" +write_line_app epiphany "$icon_glb Epiphany" "epiphany" +write_line_app epy "$icon_bok Epy" "sxmo_terminal.sh epy" +write_line_app epr "$icon_bok Epr" "sxmo_terminal.sh epr" +write_line_app errands "$icon_lst Errands" "errands" +write_line_app evince "$icon_bok Evince" "evince" +write_line_app falkon "$icon_flk Falkon" "falkon" +write_line_app file-roller "$icon_zip File Roller" "file-roller" +write_line_app firefox "$icon_ffx Firefox" "firefox" +write_line_app firefox-esr "$icon_ffx Firefox ESR" "firefox-esr" +write_line_app flare "$icon_msg Flare" "flare" +write_line_app flowtime "$icon_hrg Flowtime" "flowtime" +write_line_app foliate "$icon_bok Foliate" "foliate" +( [ -n "$WAYLAND_DISPLAY" ] && command -v foot >/dev/null) && \ + write_line "$icon_trm Foot" "foot $SHELL" +write_line_app foxtrotgps "$icon_gps Foxtrotgps" "foxtrotgps" +write_line_app fractal "$icon_msg Fractal" "fractal" +write_line_app fragments "$icon_rld Fragments" "fragments" +write_line_app g4music "$icon_mus G4Music" "g4music" +write_line_app geany "$icon_edt Geany" "geany" +write_line_app geary "$icon_eml Geary" "geary" +write_line_app gedit "$icon_edt Gedit" "gedit" +write_line_app geeqie "$icon_img Geeqie" "geeqie" +write_line_app geopard "$icon_glb Geopard" "geopard" +write_line_app gerbil "$icon_glb Gerbil" "gerbil" +write_line_app giara "$icon_red Giara" "giara" +write_line_app gnome-2048 "$icon_gam Gnome 2048" "gnome-2048" +write_line_app authenticator "$icon_2fa Gnome Authenticator" "authenticator" +write_line_app gnome-calculator "$icon_clc Gnome Calculator" "gnome-calculator" +write_line_app gnome-calendar "$icon_cal Gnome Calendar" "gnome-calendar" +write_line_app gnome-calls "$icon_phn Gnome Calls" "gnome-calls" +write_line_app gnome-characters "$icon_emj Gnome Characters" "gnome-characters" +write_line_app gnome-chess "$icon_chs Gnome Chess" "gnome-chess" +write_line_app gnome-clocks "$icon_clk Gnome Clocks" "gnome-clocks" +write_line_app kgx "$icon_trm Gnome Console" "kgx" +write_line_app gnome-contacts "$icon_usr Gnome Contacts" "gnome-contacts" +write_line_app gnome-disks "$icon_dsk Gnome Disks" "gnome-disks" +write_line_app gnome-firmware "$icon_cfg Gnome Firmware" "gnome-firmware" +write_line_app gnome-font-viewer "$icon_ltr Gnome Fonts" "gnome-font-viewer" +write_line_app gnome-maps "$icon_map Gnome Maps" "gnome-maps" +write_line_app metronome "$icon_mtr Gnome Metronome" "metronome" +write_line_app gnome-podcasts "$icon_pod Gnome Podcasts" "gnome-podcasts" +write_line_app gnome-software "$icon_bag Gnome Software" "gnome-software" +write_line_app gnome-sound-recorder "$icon_mic Gnome Sound Recorder" "gnome-sound-recorder" +write_line_app gnome-sudoku "$icon_num Gnome Sudoku" "gnome-sudoku" +write_line_app gnome-taquin "$icon_pzl Gnome Taquin" "gnome-taquin" +write_line_app gnome-text-editor "$icon_edt Gnome Text Editor" "gnome-text-editor" +write_line_app gnome-weather "$icon_wtr Gnome Weather" "gnome-weather" +write_line_app gomuks "$icon_msg Gomuks" "sxmo_terminal.sh gomuks" +write_line_app gpodder "$icon_pod gPodder" "gpodder" +write_line_app gucharmap "$icon_inf Gucharmap" "gucharmap" +write_line_app hexchat "$icon_msg Hexchat" "hexchat" +write_line_app htop "$icon_spd Htop" "sxmo_terminal.sh htop" +write_line_app iamb "$icon_msg Iamb" "sxmo_terminal.sh iamb" +write_line_app irssi "$icon_msg Irssi" "sxmo_terminal.sh irssi" +write_line_app ii "$icon_msg Ii" "sxmo_terminal.sh ii" +write_line_app ipython "$icon_trm IPython" "sxmo_terminal.sh ipython" +write_line_app index "$icon_dir Index" "index" +write_line_app itinerary "$icon_map Itinerary" "itinerary" +write_line_app jami-qt "$icon_msg Jami" "jami-qt" +write_line_app kasts "$icon_pod Kasts" "kasts" +write_line_app kcalc "$icon_clc KCalc" "kcalc" +write_line_app kid3-cli "$icon_mus Kid3 Cli" "sxmo_terminal.sh kid3-cli" +write_line_app kid3-qml "$icon_mus Kid3 QML" "kid3-qml" +write_line_app kmail "$icon_eml KMail" "kmail" +write_line_app komikku "$icon_bok Komikku" "komikku" +write_line_app kontact "$icon_msg Kontact" "kontact" +write_line_app konversation "$icon_msg Konversation" "konversation" +write_line_app koreader "$icon_bok KOReader" "koreader" +write_line_app krita "$icon_img Krita" "krita --nosplash" +write_line_app kwrite "$icon_edt Kwrite" "kwrite" +write_line_app lagrange "$icon_glb Lagrange" "lagrange" +write_line_app lf "$icon_dir Lf" "sxmo_terminal.sh lf" +write_line_app librewolf "$icon_glb LibreWolf" "librewolf" +write_line_app links "$icon_glb Links" "sxmo_terminal.sh links" +write_line_app links "$icon_glb Links (GUI)" "links -g" +write_line_app org.localsend.localsend_app "$icon_fsn LocalSend" "org.localsend.localsend_app" +write_line_app lollypop "$icon_mus Lollypop" "lollypop" +write_line_app loupe "$icon_img Loupe" "loupe" +write_line_app lpa-gtk "$icon_sim Lpa Gtk" "lpa-gtk" +write_line_app luakit "$icon_glb Luakit" "luakit" +write_line_app luanti "$icon_gam Luanti" "luanti" +write_line_app marble "$icon_map Marble" "marble" +write_line_app megapixels "$icon_cam Megapixels" "megapixels" +write_line_app mepo "$icon_map Mepo" "mepo" +write_line_app micro "$icon_edt Micro" "sxmo_terminal.sh micro" +write_line_app midori "$icon_glb Midori" "midori" +write_line_app moment "$icon_msg Moment" "moment" +write_line_app mupdf "$icon_bok Mupdf" "mupdf" +write_line_app mupdf-gl "$icon_bok Mupdf-gl" "mupdf-gl" +write_line_app mutt "$icon_eml Mutt" "sxmo_terminal.sh mutt" +write_line_app mumble "$icon_grp Mumble" mumble +write_line_app nano "$icon_edt Nano" "sxmo_terminal.sh nano" +write_line_app nautilus "$icon_dir Nautilus" "nautilus" +write_line_app navit "$icon_gps Navit" "navit" +write_line_app ncmpcpp "$icon_mus Ncmpcpp" "sxmo_terminal.sh ncmpcpp" +write_line_app neomutt "$icon_eml Neomutt" "sxmo_terminal.sh neomutt" +write_line_app nethack "$icon_trm Nethack" "sxmo_terminal.sh nethack" +write_line_app nheko "$icon_msg Nheko" "nheko" +write_line_app nvim "$icon_nvi Neovim" "sxmo_terminal.sh nvim" +write_line_app netsurf "$icon_glb Netsurf" "netsurf" +write_line_app newsboat "$icon_rss Newsboat" "sxmo_terminal.sh newsboat" +write_line_app com.gitlab.newsflash "$icon_rss Newsflash" com.gitlab.newsflash +write_line_app newsraft "$icon_rss Newsraft" "sxmo_terminal.sh newsraft" +write_line_app nnn "$icon_dir Nnn" "sxmo_terminal.sh nnn" +write_line_app numberstation "$icon_2fa Numberstation" "numberstation" +write_line_app nyxt "$icon_glb Nyxt" "nyxt" +write_line_app offpunk "$icon_glb Offpunk" "sxmo_terminal.sh offpunk" +write_line_app onboard-settings "$icon_cfg Onboard Settings" onboard-settings +write_line_app osmin "$icon_map Osmin" "osmin" +write_line_app papers "$icon_bok Papers" "papers" +write_line_app passes "$icon_psp Passes" "passes" +write_line_app pavucontrol "$icon_mus Pavucontrol" "pavucontrol" +write_line_app pidgin "$icon_msg Pidgin" "pidgin" +write_line_app tubefeeder "$icon_mvi Pipeline" "tubefeeder" +write_line_app podboat "$icon_pod Podboat" "sxmo_terminal.sh podboat" +write_line_app polari "$icon_msg Polari" "polari" +write_line_app dev.tchx84.Portfolio "$icon_dir Portfolio" "dev.tchx84.Portfolio" +write_line_app profanity "$icon_msg Profanity" "sxmo_terminal.sh profanity" +write_line_app ptyxis "$icon_trm Ptyxis" "ptyxis" +write_line_app pulsemixer "$icon_mus Pulsemixer" "sxmo_terminal.sh pulsemixer" +write_line_app pure-maps "$icon_map Pure Maps" "pure-maps" +write_line_app qalc "$icon_clc Qalc" "sxmo_terminal.sh qalc" +write_line_app qutebrowser "$icon_glb Qutebrowser" "qutebrowser" +write_line_app radio-cli "$icon_rad Radio Cli" "sxmo_terminal.sh radio-cli" +write_line_app railway "$icon_trn Railway" "railway" +write_line_app ranger "$icon_dir Ranger" "sxmo_terminal.sh ranger" +write_line_app resources "$icon_spd Resources" "resources" +write_line_app sacc "$icon_glb Sacc" "sxmo_terminal.sh sacc i-logout.cz/1/bongusta" +write_line_app secrets "$icon_lck Secrets" "secrets" +write_line_app screen "$icon_msg Screen" "sxmo_terminal.sh screen" +write_line_app seahorse "$icon_key Seahorse" "seahorse" +write_line_app senpai "$icon_msg Senpai" "sxmo_terminal.sh senpai" +write_line_app shortwave "$icon_rad Shortwave" "shortwave" +write_line_app sic "$icon_msg Sic" "sxmo_terminal.sh sic" +write_line_app siglo "$icon_clk Siglo" "siglo" +write_line_app simple-scan "$icon_scn Simple Scan" "simple-scan" +write_line_app snapshot "$icon_cam Snapshot" "snapshot" +write_line_app solanum "$icon_pom Solanum" "solanum" +([ -z "$WAYLAND_DISPLAY" ] && command -v st >/dev/null) && \ + write_line "$icon_trm St" "st -e $SHELL" +write_line_app supertuxkart "$icon_krt SuperTuxKart" "supertuxkart" +write_line_app surf "$icon_glb Surf" "surf" +write_line_app syncthing "$icon_rld Syncthing" "syncthing" +write_line_app syncthing-gtk "$icon_rld Syncthing GTK" "syncthing-gtk" +([ -z "$WAYLAND_DISPLAY" ] && command -v tabbed >/dev/null) && \ + write_line_app tabbed "$icon_grd Tabbed" "sxmo_tabbed.sh" +write_line_app telegram-desktop "$icon_tgm Telegram" "telegram-desktop" +write_line_app termite "$icon_trm Termite" "termite -e $SHELL" +write_line_app thunar "$icon_dir Thunar" "sxmo_terminal.sh thunar" +write_line_app thunderbird "$icon_thu Thunderbird" "thunderbird" +write_line_app tilix "$icon_trm Tilix" "tilix" +write_line_app com.github.bleakgrey.tootle "$icon_msg Tootle" "com.github.bleakgrey.tootle" +write_line_app re.sonny.Tangram "$icon_glb Tangram" "re.sonny.Tangram" +write_line_app totem "$icon_mvi Totem" "totem" +write_line_app dev.geopjr.Tuba "$icon_msg Tuba" "dev.geopjr.Tuba" +write_line_app tuir "$icon_red Tuir" "sxmo_terminal.sh tuir" +write_line_app tut "$icon_msg Tut" "sxmo_terminal.sh tut" +write_line_app warp "$icon_fsn Warp" "warp" +write_line_app waydroid "$icon_and Waydroid" "waydroid show-full-ui" +write_line_app weechat "$icon_msg Weechat" "sxmo_terminal.sh weechat" +write_line_app wike "$icon_bok Wike" "wike" +write_line_app w3m "$icon_glb W3m" "sxmo_terminal.sh w3m duck.com" +write_line_app vim "$icon_vim Vim" "sxmo_terminal.sh vim" +write_line_app vimb "$icon_glb Vimb" "vimb" +write_line_app vimb "$icon_glb Vimb (Incognito)" "vimb -i" +write_line_app vis "$icon_vim Vis" "sxmo_terminal.sh vis" +write_line_app vlc "$icon_vlc Vlc" "vlc" +write_line_app vte-2.91 "$icon_trm VTE 3" "vte-2.91" +write_line_app vte-2.91-gtk4 "$icon_trm VTE 3 (GTK-4)" "vte-2.91-gtk4" +([ -z "$WAYLAND_DISPLAY" ] && command -v xcalc >/dev/null) && \ + write_line "$icon_clc Xcalc" "xcalc" +write_line_app xfce4-terminal "$icon_trm XFCE4 Terminal" "xfce4-terminal" +write_line_app xournal "$icon_bok Xournal" "xournal" +write_line_app xournalpp "$icon_bok Xournalpp" "xournalpp" +write_line_app zapzap "$icon_wap ZapZap" "zapzap" +write_line_app zathura "$icon_bok Zathura" "zathura" diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_battery.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_battery.sh new file mode 100755 index 0000000..a799d3c --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_battery.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# configversion: d031535bc22ba19d69704317b8d50560 + +load_data() { + data="$(upower -i "$1" | grep . | sed -e 's|^ \+||' -e 's|: \+|:|')" + type="$(printf "%b" "$data" | grep -m1 -v : | sed -e 's|^ \+||')" +} + +data_get() { + printf "%b" "$data" | grep "^$1:" | cut -d: -f2 +} + +SET_LED_PATH="$XDG_RUNTIME_DIR/sxmo_hook_battery_set_led" + +device_changed() { + name="$(data_get "native-path")" + state="$(data_get "state")" + percentage="$(data_get "percentage" | cut -d% -f1)" + + if [ -z "$name" ] || [ -z "$state" ]; then + return + fi + + if [ "$state" = unknown ]; then + return + fi + + if [ "$percentage" -lt 25 ] && [ ! -f "$SET_LED_PATH" ]; then + touch "$SET_LED_PATH" + sxmo_led.sh set red 100 + elif [ -f "$SET_LED_PATH" ]; then + rm "$SET_LED_PATH" + sxmo_led.sh set red 0 + fi + + sxmo_hook_statusbar.sh battery "$name" "$state" "$percentage" +} + +object="$1" +event="$2" + +load_data "$object" + +if [ "$type" != "battery" ]; then + exit +fi + +case "$event" in + "device changed") + device_changed "$object" + ;; +esac diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_block_call.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_block_call.sh new file mode 100755 index 0000000..2ec9b57 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_block_call.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# configversion: 4408f29a464ab22d7c978fa0475cf80e + +# This hook is executed to check if a call should be blocked +# If the hook return 0 the call will be blocked + +INCOMINGNUMBER="$1" + +cut -f1 "$SXMO_BLOCKFILE" 2>/dev/null | grep -q "^$INCOMINGNUMBER$" diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_block_suspend.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_block_suspend.sh new file mode 100755 index 0000000..76a27b4 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_block_suspend.sh @@ -0,0 +1,102 @@ +#!/bin/sh +# configversion: 44e4686f5216b279ed5ec39f70e270c7 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This hook checks for tasks that should block suspend, but don't report it to +# the wakelock system we use. When it exits it means the system can suspend. +# +# A check consists of two components: +# - How to check if it is active (blocking suspend) +# - Optionally, how to wait for the next check. Currently the only implemented +# method is exponential backoff (called delay) which is the default if none +# is provided. +# +# NOTE: If you're trying to extend this hook, skip to the while loop at the bottom + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# Basic exponential backoff, this should save some resources if we're blocked by +# the same thing for a while +delay() { + sleep "$delay_time" + delay_time="$((delay_time*2))" + if [ "$delay_time" -gt 45 ]; then + delay_time=45 + fi +} + +wait_item() { + delay_time=1 + while $1 > /dev/null 2>&1; do + sxmo_log "Blocking suspend for $1" + waited=1 + ${2:-delay} + done +} + +# +# helper functions for checking blockers +# + +suspend_disabled() { + test -e "$XDG_CACHE_HOME/sxmo/sxmo.nosuspend" +} + +in_call() { + pgrep -f sxmo_modemcall.sh +} + +in_call_dino() { + command -v pw-link && [ -n "$(pw-link -o Dino)" ] +} + +hotspot_active() { + nmcli -t c show --active | grep -q ^Hotspot +} + +ssh_connected() { + netstat -tn | awk ' + BEGIN { status = 1 } + $4 ~ /:22$/ { status = 0; exit } + END { exit status } + ' +} + +active_mosh() { + command -v mosh-server && pgrep -f mosh-server +} + +active_mpc() { + if ! command -v mpc; then + return 1 + fi + + mpc status | grep -q '\[playing\]\|Updating' +} + +playing_mpris() { + command -v playerctl && playerctl -a status | grep -q "Playing" +} + +photos_processing() { + pgrep -f postprocess +} + +# +# Wait for all blockers +# +while [ "$waited" != "0" ]; do + waited=0 + wait_item suspend_disabled + wait_item in_call + wait_item in_call_dino + wait_item hotspot_active + wait_item ssh_connected + wait_item active_mosh + wait_item active_mpc + wait_item playing_mpris + wait_item photos_processing +done diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_contextmenu.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_contextmenu.sh new file mode 100755 index 0000000..1d3bfa8 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_contextmenu.sh @@ -0,0 +1,843 @@ +#!/bin/sh +# configversion: 8ab90a06ea6971affb4f1854b3361e09 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script will output the content of the contextual menu +# It should stdout the title as the first line followed by the entries + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh +# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh +. sxmo_hook_icons.sh + +WMCLASS="$1" +WMNAME="$2" + +superd_service_isrunning() { + superctl status "$1" | grep -q started +} + +sxmo_service_isrunning() { + sxmo_jobs.sh running "$1" -q +} + +case "$WMCLASS" in + scripts) + # Scripts menu + CHOICES="$(sxmo_hook_scripts.sh)" + WINNAME=Scripts + ;; + applications) + # Apps menu + CHOICES="$(sxmo_hook_apps.sh)" + WINNAME=Apps + ;; + modem) + # modem related + CHOICES=" + $icon_plk Modem PIN ^ 0 ^ sxmo_unlocksim.sh + $icon_phn Modem Monitor $( + superd_service_isrunning sxmo_modemmonitor && + printf %b "$icon_ton ^ 1 ^ superctl stop sxmo_modemmonitor" || + printf %b "$icon_tof ^ 1 ^ superctl start sxmo_modemmonitor" + ) && sxmo_hook_statusbar.sh modem + $icon_wrh Restart System Daemons ^ 1 ^ sxmo_hook_restart_modem_daemons.sh && sxmo_hook_statusbar.sh modem + $icon_inf Modem Info ^ 0 ^ sxmo_modeminfo.sh + $icon_phl Modem Log ^ 0 ^ sxmo_modemlog.sh + $icon_img Config MMS ^ 1 ^ sxmo_mmsdconfig.sh + $icon_img Config VVM ^ 1 ^ sxmo_vvmdconfig.sh + " + WINNAME=Modem + ;; + config) + # System Control menu + CHOICES=" + $icon_aru Brightness ^ 1 ^ sxmo_brightness.sh up + $icon_ard Brightness ^ 1 ^ sxmo_brightness.sh down + $icon_cfg Touch $( + sxmo_wm.sh inputevent touchscreen | grep -q on && \ + printf %b "$icon_ton ^ 1 ^ sxmo_wm.sh inputevent touchscreen off" || \ + printf %b "$icon_tof ^ 1 ^ sxmo_wm.sh inputevent touchscreen on" + ) + $icon_cfg Stylus $( + sxmo_wm.sh inputevent stylus | grep -q on && \ + printf %b "$icon_ton ^ 1 ^ sxmo_wm.sh inputevent stylus off" || \ + printf %b "$icon_tof ^ 1 ^ sxmo_wm.sh inputevent stylus on" + ) + $icon_cfg Gestures $( + superd_service_isrunning "sxmo_hook_lisgd" && + printf "%s" "$icon_ton" || printf "%s" "$icon_tof" + ) ^ 1 ^ supertoggle_daemon 'sxmo_hook_lisgd' && (rm $XDG_CACHE_HOME/sxmo/sxmo.nogesture 2>/dev/null || touch $XDG_CACHE_HOME/sxmo/sxmo.nogesture) + $icon_cfg Toggle Bar ^ 0 ^ sxmo_wm.sh togglebar + $icon_bth Bluetooth $( + rfkill list bluetooth -no ID,SOFT,HARD | grep -vq " blocked" && + printf %b "$icon_ton" || printf %b "$icon_tof"; + printf %b "^ 1 ^ doas sxmo_bluetoothtoggle.sh && sxmo_hook_statusbar.sh bluetooth" + ) + $(test "$SXMO_WM" = dwm && printf %b "$icon_cfg Invert Colors ^ 1 ^ xcalib -a -invert") + $icon_clk Change Timezone ^ 1 ^ sxmo_timezonechange.sh + $icon_zzz Auto-suspend $( + [ -e "$XDG_CACHE_HOME"/sxmo/sxmo.nosuspend ] && printf "%s" "$icon_tof" || printf "%s" "$icon_ton" + ) ^ 1 ^ (rm $XDG_CACHE_HOME/sxmo/sxmo.nosuspend 2>/dev/null || touch $XDG_CACHE_HOME/sxmo/sxmo.nosuspend) + $icon_zzz Auto-screen-off $( + [ -e "$XDG_CACHE_HOME/sxmo/sxmo.noidle" ] && printf "%s" "$icon_tof" || printf "%s" "$icon_ton" + ) ^ 1 ^ (rm $XDG_CACHE_HOME/sxmo/sxmo.noidle 2>/dev/null || touch $XDG_CACHE_HOME/sxmo/sxmo.noidle) && sxmo_state.sh set unlock + $icon_ror Autorotate $( + sxmo_jobs.sh running autorotate -q && + printf "%s" "$icon_ton" || printf "%s" "$icon_tof" + ) ^ 1 ^ toggle_daemon 'Autorotate' autorotate sxmo_autorotate.sh + $([ -n "$SXMO_KEYBOARD_SLIDER_EVENT_DEVICE" ] && echo "$icon_ror Autorotate on Keyboard Open/Close $( + sxmo_jobs.sh running kb_autorotate -q && + printf "%s" "$icon_ton" || printf "%s" "$icon_tof" + ) ^ 1 ^ toggle_daemon 'Keyboard Autorotate' kb_autorotate sxmo_keyboard_autorotate.sh") + $icon_ror Rotate ^ 1 ^ sxmo_rotate.sh rotate + $icon_brightness Adaptive Brightness $( + superd_service_isrunning sxmo_adaptivebrightness && + printf "%s" "$icon_ton" || printf "%s" "$icon_tof" + ) ^ 1 ^ supertoggle_daemon sxmo_adaptivebrightness + $icon_trm Hooks ^ 0 ^ sxmo_hookmenu.sh + $icon_upc Upgrade Pkgs ^ 0 ^ sxmo_terminal.sh sxmo_upgrade.sh + $icon_sfl Migrate configuration ^ 0 ^ sxmo_terminal.sh sxmo_migrate.sh + $(sxmo_wm.sh configmenuentry) + $(command -v pmos-tweaks >/dev/null && echo "$icon_cfg PostmarketOS Tweaks ^ 0 ^ GDK_SCALE=1 pmos-tweaks") + $icon_cfg Suspend Blockers ^ 0 ^ sxmo_terminal.sh sxmo_debug_suspend.sh + $icon_inf Log ^ 0 ^ sxmo_terminal.sh tail -n 100 -f ${XDG_STATE_HOME:-$HOME}/sxmo.log + $icon_inf Version ^ 0 ^ sxmo_terminal.sh sxmo_version.sh --block + " + WINNAME=Config + ;; + power) + # Power menu + CHOICES=" + $icon_lck Lock ^ 0 ^ sxmo_state.sh set lock + $icon_lck Lock (Screen off) ^ 0 ^ sxmo_state.sh set screenoff + $icon_out Logout ^ 0 ^ confirm Logout && sxmo_power.sh logout + $icon_rol Switch WM ^ 0 ^ sxmo_power.sh togglewm + $icon_rld Reboot ^ 0 ^ confirm Reboot && sxmo_power.sh reboot + $icon_pwr Poweroff ^ 0 ^ confirm Poweroff && sxmo_power.sh poweroff + " + WINNAME=Power + ;; + *mpv*) + # MPV + CHOICES=" + $icon_pau Pause ^ 0 ^ sxmo_type -k Space + $icon_fbw Seek ^ 1 ^ sxmo_type -k Left + $icon_ffw Seek ^ 1 ^ sxmo_type -k Right + $icon_aru App Volume Up ^ 1 ^ sxmo_type 0 + $icon_ard App Volume Down ^ 1 ^ sxmo_type 9 + $icon_aru Speed up ^ 1 ^ sxmo_type -k bracketRight + $icon_ard Speed down ^ 1 ^ sxmo_type -k bracketLeft + $icon_cam Screenshot ^ 1 ^ sxmo_type s + $icon_itm Loopmark ^ 1 ^ sxmo_type l + $icon_inf Info ^ 1 ^ sxmo_type i + $icon_inf Seek Info ^ 1 ^ sxmo_type o + " + WINNAME=Mpv + ;; + io.bassi.amberol) + CHOICES=" + $icon_pau Play/Pause ^ 0 ^ playerctl play-pause + $icon_prv Previous Track ^ 1 ^ playerctl previous + $icon_nxt Next Track ^ 1 ^ playerctl next + " + WINNAME=Amberol + ;; + *feh*) + # Feh + CHOICES=" + $icon_arr Next ^ 1 ^ sxmo_type -k Space + $icon_arl Previous ^ 1 ^ sxmo_type -k BackSpace + $icon_zmi Zoom in ^ 1 ^ sxmo_type -k up + $icon_zmo Zoom out ^ 1 ^ sxmo_type -k down + $icon_exp Zoom to fit ^ 1 ^ sxmo_type -k slash + $icon_shr Zoom to fill ^ 1 ^ sxmo_type '!' + $icon_rol Rotate ^ 1 ^ sxmo_type -k less + $icon_ror Rotate ^ 1 ^ sxmo_type -k greater + $icon_a2y Flip ^ 1 ^ sxmo_type -k underscore + $icon_a2x Mirror ^ 1 ^ sxmo_type -k bar + $icon_inf Toggle filename ^ 1 ^ sxmo_type d + " + WINNAME=Feh + ;; + *sxiv*) + # Sxiv + CHOICES=" + $icon_arr Next ^ 1 ^ sxmo_type -k Space + $icon_arl Previous ^ 1 ^ sxmo_type -k BackSpace + $icon_zmi Zoom in ^ 1 ^ sxmo_type -k equal + $icon_zmo Zoom out ^ 1 ^ sxmo_type -k minus + $icon_rol Rotate ^ 1 ^ sxmo_type -k less + $icon_ror Rotate ^ 1 ^ sxmo_type -k greater + $icon_a2y Flip ^ 1 ^ sxmo_type -k question + $icon_a2x Mirror ^ 1 ^ sxmo_type -k bar + $icon_grd Thumbnail ^ 0 ^ sxmo_type -k Return + " + WINNAME=Sxiv + ;; + *imv*) + # imv + CHOICES=" + $icon_arr Next ^ 1 ^ sxmo_type -k Right + $icon_arl Previous ^ 1 ^ sxmo_type -k Left + $icon_zmi Zoom in ^ 1 ^ sxmo_type -k i + $icon_zmo Zoom out ^ 1 ^ sxmo_type -k minus + $icon_exp Zoom to fit ^ 1 ^ sxmo_type -k r + $icon_ror Rotate ^ 1 ^ sxmo_type -M ctrl r + $icon_inf Toggle filename ^ 1 ^ sxmo_type -k d + " + WINNAME=Imv + ;; + *kasts*) + CHOICES=" + $icon_mus Audio ^ 0 ^ sxmo_audio.sh + $icon_bth Bluetooth ^ 0 ^ sxmo_bluetoothmenu.sh + " + WINNAME="Kasts" + ;; + *sthotkeys*) + # St hotkeys + CHOICES=" + Send Ctrl-C ^ 0 ^ sxmo_type -M Ctrl -k c + Send Ctrl-Z ^ 0 ^ sxmo_type -M Ctrl -k z + Send Ctrl-L ^ 0 ^ sxmo_type -M Ctrl -k l + Send Ctrl-D ^ 0 ^ sxmo_type -M Ctrl -k d + Send Ctrl-A ^ 0 ^ sxmo_type -M Ctrl -k a + Send Ctrl-B ^ 0 ^ sxmo_type -M Ctrl -k b + Send ESC:w ^ 0 ^ sxmo_type -k Escape -s 300 -M Shift -k semicolon -m Shift -k w -k Return + Send ESC:wq ^ 0 ^ sxmo_type -k Escape -s 300 -M Shift -k semicolon -m Shift -k w -k q -k Return + Send ESC:wq! ^ 0 ^ sxmo_type -k Escape -s 300 -M Shift -k semicolon -m Shift -k q -k exclam -k Return + " + WINNAME=St + ;; + *foot*|st|st-*|*terminal*|org.gnome.vte.application|org.gnome.vte.app.gtk4|*alacritty*) + + # These git commands only launch the editor. + case "$WMNAME" in + *"git add"*|*"git bugreport"*|*"git commit"*|*"git merge"*|*"git notes"*|*"git rebase"*|*"git replace"*|*"git send-email"*|*"git svn"*) + WMNAME="$WMCLASS $EDITOR" + ;; + esac + + # First we try to handle the app running inside the terminal: + case " $WMNAME " in + *" vi "*|*" vim "*|*" vis "*|*" nvim "*|*neovim*|*kakoune*) + #Vim in foot + CHOICES=" + $icon_cls Save and Quit ^ 0 ^ sxmo_type -k Escape -s 300 ':wq' -k Return + $icon_sav Save ^ 0 ^ sxmo_type -k Escape -s 300 ':w' -k Return + $icon_cls Quit without saving ^ 0 ^ sxmo_type -k Escape -s 300 ':q!' -k Return + $icon_aru Scroll up ^ 1 ^ sxmo_type -M Ctrl u + $icon_ard Scroll down ^ 1 ^ sxmo_type -M Ctrl d + $icon_trm Command prompt ^ 0 ^ sxmo_type -k Escape -s 300 ':' + $icon_pst Paste Selection ^ 0 ^ sxmo_type -k Escape -s 300 -k quotedbl -k asterisk -k p + $icon_pst Paste Clipboard ^ 0 ^ sxmo_type -k Escape -s 300 -k quotedbl -k plus -k p + $icon_fnd Search ^ 0 ^ sxmo_type -k Escape -s 300 / + $icon_arr Next buffer ^ 1 ^ sxmo_type -k Escape -s 300 ':bn' -k Return + $icon_arl Previous buffer ^ 1 ^ sxmo_type -k Escape -s 300 ':bp' -k Return + $icon_zmi Zoom in ^ 1 ^ sxmo_type -k Prior + $icon_zmo Zoom out ^ 1 ^ sxmo_type -k Next + $icon_mnu Terminal menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS + " + WINNAME=Vim + ;; + *nano*) + #Nano in foot + CHOICES=" + $icon_aru Scroll up ^ 1 ^ sxmo_type -k Prior + $icon_ard Scroll down ^ 1 ^ sxmo_type -k Next + $icon_sav Save ^ 0 ^ sxmo_type -M Ctrl o + $icon_cls Quit ^ 0 ^ sxmo_type -M Ctrl x + $icon_pst Paste ^ 0 ^ sxmo_type -M Ctrl u + $icon_itm Type complete ^ 0 ^ sxmo_type -M Shift -M Ctrl u + $icon_cpy Copy complete ^ 0 ^ sxmo_type -M Shift -M Ctrl i + $icon_zmi Zoom in ^ 1 ^ sxmo_type -k Prior + $icon_zmo Zoom out ^ 1 ^ sxmo_type -k Next + $icon_mnu Terminal menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS + " + WINNAME=Nano + ;; + *micro*) + #Micro + CHOICES=" + $icon_aru Scroll up ^ 1 ^ sxmo_type -k Prior + $icon_ard Scroll down ^ 1 ^ sxmo_type -k Next + $icon_prv Previous Tab ^ 1 ^ sxmo_type -M Alt , -m Alt + $icon_nxt Next Tab ^ 1 ^ sxmo_type -M Alt . -m Alt + $icon_sav Save ^ 1 ^ sxmo_type -M Ctrl s -m Ctrl + $icon_cls Quit ^ 0 ^ sxmo_type -M Ctrl q -m Ctrl + $icon_fnd Find ^ 0 ^ sxmo_type -M Ctrl f -m Ctrl + $icon_fnd Find Previous ^ 1 ^ sxmo_type -M Ctrl p -m Ctrl + $icon_fnd Find Next ^ 1 ^ sxmo_type -M Ctrl n -m Ctrl + $icon_trm Command Bar ^ 0 ^ sxmo_type -M Ctrl e -m Ctrl + $icon_cpy Copy ^ 0 ^ sxmo_type -M Ctrl c -m Ctrl + $icon_pst Paste ^ 0 ^ sxmo_type -M Ctrl v -m Ctrl + $icon_mnu Terminal menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS + " + WINNAME=Micro + ;; + *tuir*) + #tuir (reddit client) in foot + CHOICES=" + $icon_aru Previous ^ 1 ^ sxmo_type k + $icon_ard Next ^ 1 ^ sxmo_type j + $icon_aru Scroll up ^ 1 ^ sxmo_type -k Prior + $icon_ard Scroll down ^ 1 ^ sxmo_type -k Next + $icon_ret Open ^ 0 ^ sxmo_type o + $icon_arl Back ^ 0 ^ sxmo_type h + $icon_arr Comments ^ 0 ^ sxmo_type l + $icon_edt Post ^ 0 ^ sxmo_type c + $icon_rld Refresh ^ 0 ^ sxmo_type r + $icon_cls Quit ^ 0 ^ sxmo_type q + $icon_zmi Zoom in ^ 1 ^ sxmo_type -k Prior + $icon_zmo Zoom out ^ 1 ^ sxmo_type -k Next + $icon_mnu Terminal menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS + " + WINNAME=tuir + ;; + *w3m*) + #w3m + CHOICES=" + $icon_arl Back ^ 1 ^ sxmo_type b + $icon_glb Goto URL ^ 1 ^ sxmo_type u + $icon_arr Next Link ^ 1 ^ sxmo_type -k Tab + $icon_arl Previous Link ^ 1 ^ sxmo_type -M Shift -k Tab + $icon_tab Open tab ^ 0 ^ sxmo_type t + $icon_cls Close tab ^ 0 ^ sxmo_type -M Ctrl q + $icon_itm Next tab ^ 1 ^ sxmo_type -k braceRight + $icon_itm Previous tab ^ 1 ^ sxmo_type -k braceLeft + $icon_zmi Zoom in ^ 1 ^ sxmo_type -k Prior + $icon_zmo Zoom out ^ 1 ^ sxmo_type -k Next + $icon_mnu Terminal menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS + " + WINNAME=w3m + ;; + *ncmpcpp*) + #ncmpcpp + CHOICES=" + $icon_lst Playlist ^ 0 ^ sxmo_type 1 + $icon_fnd Browser ^ 0 ^ sxmo_type 2 + $icon_fnd Search ^ 0 ^ sxmo_type 3 + $icon_nxt Next track ^ 0 ^ sxmo_type -k greater + $icon_prv Previous track ^ 0 ^ sxmo_type -k less + $icon_pau Pause ^ 0 ^ sxmo_type p + $icon_stp Stop ^ 0 ^ sxmo_type s + $icon_rld Toggle repeat ^ 0 ^ sxmo_type r + $icon_sfl Toggle random ^ 0 ^ sxmo_type z + $icon_itm Toggle consume ^ 0 ^ sxmo_type R + $icon_mnu Terminal menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS + " + WINNAME=ncmpcpp + ;; + *aerc*) + #aerc + CHOICES=" + $icon_pau Archive ^ 1 ^ sxmo_type ':archive flat' -k Return + $icon_nxt Next Tab ^ 0 ^ sxmo_type ':next-tab' -k Return + $icon_prv Previous Tab ^ 0 ^ sxmo_type ':prev-tab' -k Return + $icon_cls Close Tab ^ 0 ^ sxmo_type ':close' -k Return + $icon_itm Next Part ^ 1 ^ sxmo_type ':next-part' -k Return + $icon_trm xdg-open Part ^ 0 ^ sxmo_type ':open' -k Return + " + WINNAME=aerc + ;; + *less*|*"git blame"*|*"git diff"*|*"git grep"*|*"git help"*|*"git log"*|*"git stash"*|*"git tag"*|*"git var"*) + #less + CHOICES=" + $icon_arr Page next ^ 1 ^ sxmo_type ':n' -k Return + $icon_arl Page previous ^ 1 ^ sxmo_type ':p' -k Return + $icon_cls Quit ^ 0 ^ sxmo_type q + $icon_zmi Zoom in ^ 1 ^ sxmo_type -M Ctrl + + $icon_zmo Zoom out ^ 1 ^ sxmo_type -M Ctrl -k Minus + $icon_aru Scroll up ^ 1 ^ sxmo_type -k Prior + $icon_ard Scroll down ^ 1 ^ sxmo_type -k Next + $icon_mnu Terminal menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS + " + WINNAME=less + ;; + *git*) + # git am, branch, config, tag (and other commands which launch both). + CHOICES=" + $icon_fil ${PAGER:-less} menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS '${PAGER:-less}' + $icon_edt $EDITOR menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS '$EDITOR' + $icon_mnu Terminal menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS + " + WINNAME=git + ;; + *senpai*) + CHOICES=" + $icon_aru Scroll up ^ 1 ^ sxmo_type -k Prior + $icon_ard Scroll down ^ 1 ^ sxmo_type -k Next + $icon_ac1 Previous Buffer ^ 1 ^ sxmo_type -M Alt -k Left + $icon_ac4 Next Buffer ^ 1 ^ sxmo_type -M Alt -k Right + $icon_lst Toggle Channels ^ 0 ^ sxmo_type -k F7 + $icon_usr Toggle Members ^ 0 ^ sxmo_type -k F8 + " + WINNAME=senpai + ;; + *weechat*) + #weechat + CHOICES=" + $icon_msg Hotlist Next ^ 1 ^ sxmo_type -M Alt a + $icon_arl History Previous ^ 1 ^ sxmo_type -M Alt -k Less + $icon_arr History Next ^ 1 ^ sxmo_type -M Alt -k Greater + $icon_trm Buffer ^ 0 ^ sxmo_type '/buffer ' + $icon_aru Scroll up ^ 1 ^ sxmo_type -k Prior + $icon_ard Scroll down ^ 1 ^ sxmo_type -k Next + $icon_mnu Terminal menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS + " + WINNAME=weechat + ;; + *" sms "*|*"missed call"*) + number="$(printf "%s\n" "$WMNAME" | xargs -0 pnc find | tr -d '\n')" + #sms + CHOICES=" + $icon_msg Conversation ^ 0 ^ sxmo_terminal.sh sxmo_modemtext.sh conversationloop $number + $icon_msg Reply ^ 0 ^ sxmo_modemtext.sh sendtextmenu $number + $icon_phn Call ^ 0 ^ sxmo_modemdial.sh $number + $([ -d "$SXMO_LOGDIR/$number/attachments" ] && echo "$icon_att View Attachments ^ 1 ^ sxmo_files.sh $SXMO_LOGDIR/$number/attachments --date-sort") + $( + + found_numbers="$(printf %s "$number" | xargs -I{} pnc find "{}")" + printf "%s\n" "$found_numbers" | while read -r line; do + sxmo_contacts.sh --name "$line" | grep -q '???' && echo "$icon_usr Add $line ^ 1 ^ sxmo_contactmenu.sh newcontact $line" + done + # if this is a group chain, then allow to add entire chain as a contact too + if [ "$(printf "%s\n" "$found_numbers" | wc -l)" -gt 1 ]; then + sxmo_contacts.sh --name "$number" | grep -q '???' && echo "$icon_usr Add $number ^ 1 ^ sxmo_contactmenu.sh newcontact $number" + fi + + ) + $icon_aru Scroll up ^ 1 ^ sxmo_type -M Shift -M Ctrl b + $icon_ard Scroll down ^ 1 ^ sxmo_type -M Shift -M Ctrl f + $icon_mnu Terminal menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS + " + WINNAME=phone + ;; + *cmus*) + # cmus + # requires `:set set_term_title=false` in cmus to match the application + CHOICES=" + $icon_itm Play ^ 0 ^ cmus-remote -p + $icon_pau Pause ^ 0 ^ cmus-remote -u + $icon_stp Stop ^ 0 ^ cmus-remote -s + $icon_nxt Next track ^ 0 ^ cmus-remote -n + $icon_prv Previous track ^ 0 ^ cmus-remote -r + $icon_rld Toggle repeat ^ 0 ^ cmus-remote -R + $icon_sfl Toggle random ^ 0 ^ cmus-remote -S + $icon_mnu Terminal menu ^ 0 ^ sxmo_appmenu.sh $WMCLASS + " + WINNAME=cmus + ;; + *iamb*) + CHOICES=" + $icon_aru Page Up ^ 1 ^ sxmo_type.sh -k Escape -M Ctrl -k b + $icon_tab Toggle Selection ^ 0 ^ sxmo_type.sh -k Escape -M Ctrl -k W m + $icon_ard Page Down ^ 1 ^ sxmo_type.sh -k Escape -M Ctrl -k f + $icon_ret Reply To Message ^ 0 ^ sxmo_type.sh -k Escape :reply -k Return + $icon_tab New Tab ^ 0 ^ sxmo_type.sh -k Escape :tab rooms -k Return + $icon_arl Previous Tab ^ 0 ^ sxmo_type.sh -k Escape :tabp -k Return + $icon_arr Next Tab ^ 0 ^ sxmo_type.sh -k Escape :tabn -k Return + $icon_cls Close Tab ^ 0 ^ sxmo_type.sh -k Escape :tabclose -k Return + $icon_win Split View ^ 0 ^ sxmo_type.sh -k Escape :split -k Return + $icon_win Split View Vertical ^ 0 ^ sxmo_type.sh -k Escape :vsplit -k Return + $icon_msg All Chats ^ 0 ^ sxmo_type.sh -k Escape :chats -k Return + $icon_msg Direct Messages ^ 0 ^ sxmo_type.sh -k Escape :dms -k Return + $icon_grp Rooms ^ 0 ^ sxmo_type.sh -k Escape :rooms -k Return + $icon_glb Spaces ^ 0 ^ sxmo_type.sh -k Escape :spaces -k Return + $icon_sav Download ^ 0 ^ sxmo_type.sh -k Escape :download -k Return + $icon_cls Close View/Quit ^ 0 ^ sxmo_type.sh -k Escape :quit -k Return + " + WINNAME=iamb + ;; + *) + # Now we fallback to the default terminal menu + case "$WMCLASS" in + st|st-*) + CHOICES=" + $icon_itm Type complete ^ 0 ^ sxmo_type -M Ctrl -M Shift -k u + $icon_itm Toggle Selmode ^ 0 ^ sxmo_type -M Ctrl -M Shift -k s + $icon_cpy Copy complete ^ 0 ^ sxmo_type -M Ctrl -M Shift -k i + $icon_cpy Copy selection ^ 0 ^ sxmo_type -M Ctrl -M Shift -k c + $icon_pst Paste ^ 0 ^ sxmo_type -M Ctrl -M Shift -k v + $icon_zmi Zoom in ^ 1 ^ sxmo_type -M Ctrl -M Shift -k Prior + $icon_zmo Zoom out ^ 1 ^ sxmo_type -M Ctrl -M Shift -k Next + $icon_aru Scroll up ^ 1 ^ sxmo_type -M Ctrl -M Shift -k b + $icon_ard Scroll down ^ 1 ^ sxmo_type -M Ctrl -M Shift -k f + $icon_a2x Invert ^ 1 ^ sxmo_type -M Ctrl -M Shift -k x + $icon_kbd Hotkeys ^ 0 ^ sxmo_appmenu.sh sthotkeys + " + WINNAME=St + ;; + *foot*) + CHOICES=" + $icon_win Next Window ^ 0 ^ swaymsg focus next + $icon_rld Toggle Layout ^ 0 ^ sxmo_wm.sh togglelayout + $icon_mnu Tile Vertical ^ 0 ^ swaymsg layout splitv && swaymsg splitv + $icon_grd Tile Horizontal ^ 0 ^ swaymsg layout splith && swaymsg splith + $icon_trm New Terminal ^ 0 ^ sxmo_terminal.sh + $icon_cls Close Terminal ^ 0 ^ sxmo_killwindow.sh + $icon_cpy Copy ^ 0 ^ sxmo_type -M Shift -M Ctrl c + $icon_pst Paste ^ 0 ^ sxmo_type -M Shift -M Ctrl v + $icon_zmi Zoom in ^ 1 ^ sxmo_type -M Ctrl + + $icon_zmo Zoom out ^ 1 ^ sxmo_type -M Ctrl -k Minus + $icon_aru Scroll up ^ 1 ^ sxmo_type -M Shift -k Prior + $icon_ard Scroll down ^ 1 ^ sxmo_type -M Shift -k Next + $icon_lnk URL Mode ^ 0 ^ sxmo_type -M Shift -M Ctrl -k u + $icon_kbd Hotkeys ^ 0 ^ sxmo_appmenu.sh sthotkeys + $icon_fnd Search Field ^ 0 ^ sxmo_type -M Ctrl -M Shift -k r + $icon_aru Search Back ^ 0 ^ sxmo_type -M Ctrl -k r + $icon_ard Search Forward ^ 0 ^ sxmo_type -M Ctrl -k s + $icon_itm Search Extend ^ 0 ^ sxmo_type -M Ctrl -k w + " + WINNAME=Foot + ;; + *terminal*|org.gnome.vte.application|org.gnome.vte.app.gtk4) + CHOICES="$icon_kbd Hotkeys ^ 0 ^ sxmo_appmenu.sh sthotkeys" + WINNAME=Terminal + ;; + *alacritty*) + CHOICES=" + $icon_cpy Copy ^ 0 ^ sxmo_type -M Shift -M Ctrl c + $icon_pst Paste ^ 0 ^ sxmo_type -M Shift -M Ctrl v + $icon_vim VI Mode ^ 0 ^ sxmo_type -M Ctrl -M Shift -k Space + $icon_fnd Search Forward ^ 0 ^ sxmo_type -M Ctrl -M Shift -k f + $icon_fnd Search Backward ^ 0 ^ sxmo_type -M Ctrl -M Shift -k b + $icon_aru Search Previous ^ 0 ^ sxmo_type -k Enter + $icon_ard Search Next ^ 0 ^ sxmo_type -M Shift -k Enter + $icon_kbd Hotkeys ^ 0 ^ sxmo_appmenu.sh sthotkeys + " + WINNAME=Alacritty + ;; + esac + esac + ;; + *okular*) + # Okular + CHOICES=" + $icon_cfg Touch $( + sxmo_wm.sh inputevent touchscreen | grep -q on && \ + printf %b "$icon_ton ^ 0 ^ sxmo_wm.sh inputevent touchscreen off" || \ + printf %b "$icon_tof ^ 0 ^ sxmo_wm.sh inputevent touchscreen on" + ) + $icon_cfg Fullscreen ^ 0 ^ sxmo_type -k Ctrl -k Shift -k F + $icon_cfg Menubar ^ 0 ^ sxmo_type -k Ctrl -k M + $icon_cfg Toolbars ^ 0 ^ sxmo_type -k F7 + $icon_cfg SXMO Bar ^ 0 ^ sxmo_wm.sh togglebar + " + WINNAME=Xournal + ;; + *xournal*) + # Xournalpp + CHOICES=" + $icon_cfg Touch $( + sxmo_wm.sh inputevent touchscreen | grep -q on && \ + printf %b "$icon_ton ^ 0 ^ sxmo_wm.sh inputevent touchscreen off" || \ + printf %b "$icon_tof ^ 0 ^ sxmo_wm.sh inputevent touchscreen on" + ) + $icon_flt Open ^ 0 ^ sxmo_type -k Ctrl -k o + $icon_zmi Zoom ^ 1 ^ sxmo_type -k Ctrl -k plus + $icon_zmo Zoom ^ 1 ^ sxmo_type -k Ctrl -k minus + $icon_zmi Next Page ^ 1 ^ sxmo_type -k Next + $icon_zmo Prev Page ^ 1 ^ sxmo_type -k Prior + $icon_cfg Menubar ^ 0 ^ sxmo_type -k F10 + $icon_cfg Toolbars ^ 0 ^ sxmo_type -k F9 + $icon_cfg SXMO Bar ^ 0 ^ sxmo_wm.sh togglebar + " + WINNAME=Xournal + ;; + *zathura*) + # Zathura + CHOICES=" + $icon_flt Open ^ 0 ^ sxmo_type -k o + $icon_zmi Zoom ^ 1 ^ sxmo_type -k plus + $icon_zmo Zoom ^ 1 ^ sxmo_type -k minus + $icon_arl History ^ 1 ^ sxmo_type -M Ctrl -k o + $icon_arr History ^ 1 ^ sxmo_type -M Ctrl -k i + $icon_cfg Invert ^ 0 ^ sxmo_type -M Ctrl -k r + $icon_flt Index ^ 0 ^ sxmo_type -k Tab + $icon_cfg Fit ^ 0 ^ sxmo_type -k a + $icon_cfg Width mode ^ 0 ^ sxmo_type -k s + " + WINNAME=Zathura + ;; + *netsurf*) + # Netsurf + CHOICES=" + $icon_flt Pipe URL ^ 0 ^ sxmo_urlhandler.sh + $icon_lnk Enter URL ^ 0 ^ sxmo_type.sh -M Ctrl -k l + $icon_zmi Zoom ^ 1 ^ sxmo_type -M Ctrl -k plus + $icon_zmo Zoom ^ 1 ^ sxmo_type -M Ctrl -k minus + $icon_arl History ^ 1 ^ sxmo_type -M Alt -k Left + $icon_arr History ^ 1 ^ sxmo_type -M Alt -k Right + " + WINNAME=Netsurf + ;; + *surf*) + # Surf + CHOICES=" + $icon_glb Navigate ^ 0 ^ sxmo_type -M Ctrl g + $icon_lnk Link Menu ^ 0 ^ sxmo_type -M Ctrl d + $icon_flt Pipe URL ^ 0 ^ sxmo_urlhandler.sh + $icon_fnd Search Page ^ 0 ^ sxmo_type -M Ctrl f + $icon_fnd Find Next ^ 0 ^ sxmo_type -M Ctrl n + $icon_zmi Zoom ^ 1 ^ sxmo_type -M Shift -M Ctrl k + $icon_zmo Zoom ^ 1 ^ sxmo_type -M Shift -M Ctrl j + $icon_aru Scroll ^ 1 ^ sxmo_type -M Shift -k Space + $icon_ard Scroll ^ 1 ^ sxmo_type -k Space + $icon_itm JS Toggle ^ 1 ^ sxmo_type -M Shift -M Ctrl s + $icon_arl History ^ 1 ^ sxmo_type -M Ctrl h + $icon_arr History ^ 1 ^ sxmo_type -M Ctrl l + $icon_rld Refresh ^ 0 ^ sxmo_type -M Shift -M Ctrl r + " + WINNAME=Surf + ;; + *falkon*) + # Falkon + CHOICES=" + $icon_flt Pipe URL ^ 0 ^ sxmo_urlhandler.sh + $icon_tab New Tab ^ 0 ^ sxmo_type -M Ctrl t + $icon_win New Window ^ 0 ^ sxmo_type -M Ctrl n + $icon_cls Close Tab ^ 0 ^ sxmo_type -M Ctrl w + $icon_zmi Zoom ^ 1 ^ sxmo_type -M Ctrl -k plus + $icon_zmo Zoom ^ 1 ^ sxmo_type -M Ctrl -k minus + $icon_arl History ^ 1 ^ sxmo_type -M Alt -k Left + $icon_arr History ^ 1 ^ sxmo_type -M Alt -k Right + $icon_win Home ^ 0 ^ sxmo_type -M Alt -k Home + $icon_zmo Full Screen ^ 0 ^ sxmo_type -k F11 + $icon_rld Refresh ^ 0 ^ sxmo_type -M Shift -M Ctrl r + " + WINNAME=Falkon + ;; + *firefox*|*navigator*) + # Firefox + CHOICES=" + $icon_flt Pipe URL ^ 0 ^ sxmo_urlhandler.sh + $icon_tab New Tab ^ 0 ^ sxmo_type -M Ctrl t + $icon_win New Window ^ 0 ^ sxmo_type -M Ctrl n + $icon_cls Close Tab ^ 0 ^ sxmo_type -M Ctrl w + $icon_zmi Zoom ^ 1 ^ sxmo_type -M Ctrl -k plus + $icon_zmo Zoom ^ 1 ^ sxmo_type -M Ctrl -k minus + $icon_arl History ^ 1 ^ sxmo_type -M Alt -k Left + $icon_arr History ^ 1 ^ sxmo_type -M Alt -k Right + $icon_win Home ^ 0 ^ sxmo_type -M Alt -k Home + $icon_zmo Full Screen ^ 0 ^ sxmo_type -k F11 + $icon_rld Refresh ^ 0 ^ sxmo_type -M Shift -M Ctrl r + " + WINNAME=Firefox + ;; + *krita*) + # Krita + CHOICES=" + $icon_fnd Open ^ 0 ^ sxmo_type -M Ctrl o + $icon_sav Save ^ 0 ^ sxmo_type -M Ctrl s + $icon_pst Paste ^ 0 ^ sxmo_type -M Ctrl v + $icon_del Delete ^ 0 ^ sxmo_type -k Delete + $icon_win Select ^ 0 ^ sxmo_type -M Ctrl r + $icon_modem_disabled Deselect ^ 0 ^ sxmo_type -M Ctrl -M Shift a + $icon_wn2 Crop ^ 0 ^ sxmo_type c + $icon_flt Fill ^ 0 ^ sxmo_type f + $icon_modem_connected Gradient ^ 0 ^ sxmo_type g + $icon_dof HSV Adjust ^ 0 ^ sxmo_type -M Ctrl u + $icon_cls Close Image ^ 0 ^ sxmo_type -M Ctrl w + " + WINNAME=Krita + ;; + *vimb*) + CHOICES=" + $icon_glb Navigate ^ 0 ^ sxmo_type -k Escape o + $icon_zmi Zoom ^ 1 ^ sxmo_type -k Escape zi + $icon_zmo Zoom ^ 1 ^ sxmo_type -k Escape zo + $icon_arl History ^ 1 ^ sxmo_type -M Ctrl o + $icon_arr History ^ 1 ^ sxmo_type -M Ctrl i + $icon_rld Refresh ^ 0 ^ sxmo_type -k Escape r + " + WINNAME=Vimb + ;; + *geopard*) + # Geopard + CHOICES=" + $icon_flt Pipe URL ^ 0 ^ sxmo_urlhandler.sh + $icon_pls New Tab ^ 0 ^ sxmo_type -M Ctrl t + $icon_cls Close Tab ^ 0 ^ sxmo_type -M Ctrl w + $icon_bok Open Bookmarks ^ 0 ^ sxmo_type -M Ctrl b + $icon_pls Add Bookmark ^ 0 ^ sxmo_type -M Ctrl d + $icon_edt Edit Bookmarks ^ 0 ^ sxmo_terminal.sh $EDITOR ~/.local/share/geopard/bookmarks.gemini + $icon_zmi Increase Font Size ^ 1 ^ sxmo_type -M Ctrl -k plus + $icon_zmo Decrease Font Size ^ 1 ^ sxmo_type -M Ctrl -k minus + $icon_arl History Back ^ 1 ^ sxmo_type -M Alt -k Left + $icon_arr History Forward ^ 1 ^ sxmo_type -M Alt -k Right + $icon_fnd URL Bar ^ 0 ^ sxmo_type -k F6 + $icon_rld Refresh ^ 0 ^ sxmo_type -k F6 -k Return + " + WINNAME=Geopard + ;; + *lagrange*) + # Lagrange + CHOICES=" + $icon_mnu Toggle sidebar ^ 0 ^ sxmo_type -M Shift -M Ctrl p + $icon_bok Open bookmarks ^ 0 ^ sxmo_type -M Ctrl l && sxmo_type 'about:bookmarks' -k Return + $icon_pls Add bookmark ^ 0 ^ sxmo_type -M Ctrl d + $icon_zmi Zoom ^ 1 ^ sxmo_type -M Ctrl -k equal + $icon_zmo Zoom ^ 1 ^ sxmo_type -M Ctrl -k minus + $icon_aru Parent dir ^ 1 ^ sxmo_type -M Alt -k Up + $icon_arl History ^ 1 ^ sxmo_type -M Alt -k Left + $icon_arr History ^ 1 ^ sxmo_type -M Alt -k Right + $icon_rld Refresh ^ 0 ^ sxmo_type -M Ctrl r + " + WINNAME=Lagrange + ;; + org.gnome.maps) + CHOICES=" + $icon_gps Toggle Geoclue ^ 0 ^ superctl status geoclue-agent |grep started >/dev/null && superctl stop geoclue-agent || superctl start geoclue-agent + $icon_zmi Zoom in ^ 1 ^ sxmo_type -M ctrl = + $icon_zmo Zoom out ^ 1 ^ sxmo_type -M ctrl -k minus + $icon_fnd Explore POI ^ 0 ^ sxmo_type -M ctrl -M Shift F + $icon_fnd Search ^ 0 ^ sxmo_type -M ctrl f + $icon_lst Show last results ^ 0 ^ sxmo_type -M ctrl r + $icon_map Toggle route planner ^ 0 ^ sxmo_type -M ctrl d + $icon_gps Show current location ^ 0 ^ sxmo_type -M ctrl l + " + WINNAME=Maps + ;; + *mepo*) + # Mepo + # The choices / hotkeys for the contextmenu are generated through mepo's + # own scripting to be in congruence since the same menu can be launched + # via mepo's UI as well, this compatibility is available as of mepo 0.4 + CHOICES="$(mepo_ui_central_menu.sh menuoptions | awk -F^ '{ print $1 "^ 0 ^ sxmo_type" $3 }')" + WINNAME=Mepo + ;; + *foxtrot*) + # Foxtrot GPS + CHOICES=" + $icon_zmi Zoom ^ 1 ^ sxmo_type i + $icon_zmo Zoom ^ 1 ^ sxmo_type o + $icon_itm Panel Toggle ^ 1 ^ sxmo_type m + $icon_itm GPSD Toggle ^ 1 ^ sxmo_type a + " + WINNAME=Maps + ;; + *badwolf*) + # Badwolf Browser + CHOICES=" + $icon_tab New Tab ^ 0 ^ sxmo_type -M Ctrl -k t + $icon_cls Close Tab ^ 0 ^ sxmo_type -M Alt -k d + $icon_fnd Reset Zoom ^ 0 ^ sxmo_type -M Ctrl -k 0 + $icon_arr History ^ 1 ^ sxmo_type -M Ctrl ] + $icon_arl History ^ 1 ^ sxmo_type -M Ctrl [ + $icon_arr Next Tab ^ 1 ^ sxmo_type -M Alt -k Right + $icon_arl Previous Tab ^ 1 ^ sxmo_type -M Alt -k Left + $icon_rld Refresh ^ 0 ^ sxmo_type -M Shift -M Ctrl -k r + $icon_fnd Search ^ 0 ^ sxmo_type -M Shift -M Ctrl -k f + $icon_arr Next (Search) ^ 0 ^ sxmo_type -M Shift -M Ctrl -k g + $icon_arl Previous (Search) ^ 0 ^ sxmo_type -M Shift -M Ctrl -M Shift -k g + $icon_flt URL Bar ^ 0 ^ sxmo_type -M Shift -M Ctrl l + $icon_fnd Open Web Inspector ^ 0 ^ sxmo_type -k F12 + " + WINNAME=Badwolf + ;; + *acme*) + # Acme + CHOICES=" + $icon_mse 2 (Right) [2s delay] ^ 0 ^ sleep 2 && xdotool click 3 + $icon_mse 3 (Middle) [2s delay] ^ 0 ^ sleep 2 && xdotool click 2 + $icon_itm Autocomplete ^ 0 ^ sxmo_type.sh -M Ctrl -k f + $icon_exp Select Last Typed Text ^ 0 ^ sxmo_type.sh -M Escape + $icon_del Delete To Start Of Line ^ 0 ^ sxmo_type.sh -M Ctrl -k U + $icon_arl Move To Start Of Line ^ 0 ^ sxmo_type.sh -M Ctrl -k A + $icon_arr Move To End Of Line ^ 0 ^ sxmo_type.sh -M Ctrl -k E + " + WINNAME=Acme + ;; + *mupdf*) + # Mupdf + CHOICES=" + $icon_nxt Next Page ^ 0 ^ sxmo_type -k Space + $icon_prv Previous Page ^ 0 ^ sxmo_type -k b + $icon_chk Mark Page ^ 0 ^ sxmo_type -k m + $icon_ret Pop To Last Mark ^ 0 ^ sxmo_type -k t + $icon_zmi Zoom In ^ 1 ^ sxmo_type -k + + $icon_zmo Zoom Out ^ 1 ^ sxmo_type -k - + $icon_fnd Fit Width ^ 0 ^ sxmo_type -k W + $icon_fnd Fit Height ^ 0 ^ sxmo_type -k H + $icon_fnd Zoom To Fit ^ 0 ^ sxmo_type -k Z + $icon_fnd Reset Zoom ^ 0 ^ sxmo_type -k z + $icon_rol Rotate Counterclockwise ^ 0 ^ sxmo_type -k [ + $icon_ror Rotate Clockwise ^ 0 ^ sxmo_type -k ] + $icon_fnd Search ^ 0 ^ sxmo_type -k / + " + WINNAME=Mupdf + ;; + *tabbed*) + # Tabbed + CHOICES=" + $icon_tab New Tab ^ 0 ^ sxmo_type.sh -M Ctrl -M Shift -M Enter + $icon_arl Previous Tab ^ 1 ^ sxmo_type.sh -M Ctrl -M Shift -k h + $icon_arr Next Tab ^ 1 ^ sxmo_type.sh -M Ctrl -M Shift -k l + $icon_arl Move Tab Left ^ 1 ^ sxmo_type.sh -M Ctrl -M Shift -k j + $icon_arr Move Tab Right ^ 1 ^ sxmo_type.sh -M Ctrl -M Shift -k k + $icon_mnu Menu Prompt ^ 0 ^ sxmo_type.sh -M Ctrl -k U0060 + $icon_cls Close Tab ^ 0 ^ sxmo_type.sh -M Ctrl -k q + " + WINNAME=Tabbed + ;; + *links*) + # Links Browser + CHOICES=" + $icon_mnu Menu ^ 0 ^ sxmo_type.sh -k Escape + $icon_ret Follow Link ^ 0 ^ sxmo_type.sh -k Enter + $icon_arl History ^ 1 ^ sxmo_type.sh -k z + $icon_arr History ^ 1 ^ sxmo_type.sh -k x + $icon_glb Enter URL ^ 0 ^ sxmo_type.sh -k g + $icon_glb Edit Current URL ^ 0 ^ sxmo_type.sh -k G + $icon_glb View Highlighted URL ^ 0 ^ sxmo_type.sh -M Ctrl -k g + $icon_cam Toggle Images ^ 0 ^ sxmo_type.sh -k U002A + $icon_aru Scroll Up ^ 1 ^ sxmo_type.sh -k p + $icon_ard Scroll Down ^ 1 ^ sxmo_type.sh -k l + $icon_arl Scroll Left ^ 1 ^ sxmo_type.sh -k U005B + $icon_arr Scroll Right ^ 1 ^ sxmo_type.sh -k U005D + " + WINNAME=Links + ;; + *) + # Default system menu (no matches) + CHOICES=" + $icon_grd Scripts ^ 0 ^ sxmo_appmenu.sh scripts + $icon_grd Apps ^ 0 ^ sxmo_appmenu.sh applications + $([ "$SXMO_MENU" = "wofi" ] && echo "$icon_grd All Apps ^ 0 ^ wofi -O alphabetical -i --show drun") + $([ "$SXMO_MENU" != "wofi" ] && command -v j4-dmenu-desktop > /dev/null && echo "$icon_grd All Apps ^ 0 ^ j4-dmenu-desktop --dmenu=sxmo_dmenu.sh --term=sxmo_terminal.sh") + $icon_grd Binaries ^ 0 ^ sxmo_brun.sh + $icon_dir Files ^ 0 ^ sxmo_files.sh + $icon_phn Dialer ^ 0 ^ sxmo_modemdial.sh + $icon_msg Texts ^ 0 ^ sxmo_modemtext.sh + $icon_usr Contacts ^ 0 ^ sxmo_contactmenu.sh + $( + rfkill list bluetooth -no ID,SOFT,HARD | grep -vq " blocked" && + printf %b "$icon_bth Bluetooth ^ 1 ^ sxmo_bluetoothmenu.sh" + ) + $(command -v megapixels >/dev/null && echo "$icon_cam Camera ^ 0 ^ GDK_SCALE=2 megapixels") + $( + if brightness="$(brightnessctl -l -m | grep -e "white:torch" -e "white:flash" | cut -d ',' -f 3)" && [ -n "$brightness" ]; then + printf "%s Flashlight " "$icon_fll" + [ "$brightness" -gt 0 ] && + printf %b "$icon_ton" || printf %b "$icon_tof"; + printf %b "^ 1 ^ sxmo_flashtoggle.sh" + fi + ) + $icon_net Networks ^ 0 ^ sxmo_networks.sh + $icon_mus Audio ^ 0 ^ sxmo_audio.sh + $icon_phn Modem ^ 0 ^ sxmo_appmenu.sh modem + $icon_win Windows ^ 0 ^ sxmo_wmmenu.sh + $icon_cfg Config ^ 0 ^ sxmo_appmenu.sh config + $icon_inf Help ^ 0 ^ sxmo_terminal.sh man sxmo + $icon_pwr Power ^ 0 ^ sxmo_appmenu.sh power + " + WINNAME=Sys + ;; +esac + +printf "%b\n" "$WINNAME" +printf "%b\n" "$CHOICES" diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_contextmenu_fallback.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_contextmenu_fallback.sh new file mode 100755 index 0000000..da7f09b --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_contextmenu_fallback.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# configversion: 723b508e3ab28c10933e4c7cc730fb76 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +WINNAME="$1" +CHOICE="$2" + +sxmo_log "Unknown choice <$CHOICE> selected from contextmenu <$WINNAME>" diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_desktop_widget.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_desktop_widget.sh new file mode 100755 index 0000000..9d39688 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_desktop_widget.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# configversion: 010bc500cc208fefa91cc3c4f473f436 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This hook launches a desktop widget (e.g. a clock) (blocking) +# It could be used on Wayland + +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +pangodraw() { + date +"%H:%M" #date with some pango markup syntax (https://docs.gtk.org/Pango/pango_markup.html) + date +"%a %d %b %Y" + + # here you can output whatever you want to end up in the widget + # make sure to use pango markup syntax if you want colours etc, ANSI is not supported by wayout + # for instance, you can show details about the activated network connections: + #nmcli -w 3 -c no -p -f DEVICE,STATE,NAME,TYPE con show | grep activated | sed 's/activated/ /' | sed '/^\s*$/d' 2> /dev/null + # make sure to end with an empty line, to denote the end of data for wayout + echo +} + +trap 'kill -- $WAYOUT' TERM INT EXIT + +# For wayland we use wayout: +( + sleep 1 # wayout misses output sent to it as it's starting + while : ; do + pangodraw + sxmo_aligned_sleep 60 + done +) | wayout --font "Sxmo" \ + --foreground-color "#ffffff" \ + --fontsize "60" \ + --height 500 \ + --feed-par & +WAYOUT="$!" +wait diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_dial.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_dial.sh new file mode 100755 index 0000000..332016f --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_dial.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# configversion: 70258557287cafa1a27fa6701c6583e6 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script is executed (synchronously) before you dial an outgoing call + +# Pause all player automatically +sxmo_playerctl.sh pause_all diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_discard.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_discard.sh new file mode 100755 index 0000000..219ad07 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_discard.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# configversion: 01fd10d27b7d66531ea7ecb4f92ce00d +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script is executed (asynchronously) when you discard an incoming call +# i.e., click Hangup on Pickup menu when call is coming in (without picking +# up the call). + +# kill existing ring playback +sxmo_jobs.sh stop ringing + +sxmo_playerctl.sh resume_all diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_hangup.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_hangup.sh new file mode 100755 index 0000000..7ed7f35 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_hangup.sh @@ -0,0 +1,4 @@ +#!/bin/sh +# configversion: 226734e9b1dd5ffb1a8c45a6c88bd741 + +# This script is executed (asynchronously) when you hangup an incoming call diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_icons.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_icons.sh new file mode 100755 index 0000000..f3a258c --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_icons.sh @@ -0,0 +1,254 @@ +#!/bin/sh +# configversion: ab89c16587dedc087007d14790de9d5d +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# we disable shellcheck SC2034 (variable not used) +# for all the variables we define here +# shellcheck disable=SC2034 + +#this script is meant to be sourced +#the glyphs are often in the private use area and +#therefore require a font like those in https://github.com/ryanoasis/nerd-fonts/ for proper display +# note that you should *not* use glyphs in range U+F500 - U+FD46 as these wont render. +# this is a known bug in nerdfonts: https://github.com/ryanoasis/nerd-fonts/issues/365 + +icon_2fa="󰦯" # authenticaton +icon_a2x="⇄" +icon_a2y="⇅" +icon_ac1="↖" +icon_ac2="↗" +icon_ac3="↘" +icon_ac4="↙" +icon_and="ï…»" +icon_ard="↓" +icon_arl="â†�" +icon_arr="→" +icon_aru="↑" +icon_att="" +icon_audio="♫" +icon_bag="ïŠ�" # shopping bag +icon_bel="" +icon_bkp="ó°�¯" # backup +icon_bok="" +icon_brightness="ó°ƒ�" +icon_bth="" # bluetooth +icon_cal="ï�³" +icon_cam="" +icon_cfg="" #configuration cog +icon_chk="" +icon_chs="♜" #chess +icon_clc="󰃬" #calculator +icon_clk="ó°¥”" +icon_cls="ó°…–" #close +icon_com="" # (Laptop) Computer (💻) +icon_cpy="" +icon_del="" #delete +icon_dir="ï�¼" #directory folder +icon_dis="󰙯" # discord +icon_dof="" # dot off +icon_don="ï„‘" # dot on +icon_dop="" # dot point +icon_dot="󰇘" # searching, connecting, etc. +icon_drw="ó°�¬" # Drawing tablet +icon_dsk="ó°‹Š" # hard disk +icon_ear="" # earpiece +icon_edt="ó°Žž" #editor +icon_ema="" # emacs +icon_emj="" # emoji, smiley +icon_eml="󰇮" #email +icon_exp="ó°�Œ" #expand +icon_fbw="ï�Š" +icon_ffw="ï�Ž" #fast forward +icon_ffx="󰈹" #firefox +icon_fil="" #file +icon_flk="ï‡�" #falkon +icon_fll="󰉄" #flashlight +icon_flt="ï‚°" #filter/pipe +icon_fnd="ó°�‰" #search/find +icon_fsn="󰈪" # file send +icon_gam="ó°Š´" # gaming controller (🎮) +icon_glb="" #globe +icon_gps='' #gps +icon_grd="ó°€»" +icon_grp="" #group +icon_hdp="" #headphones +icon_hom="" +icon_hrg="" # hourglass +icon_hst="ó°‹Ž" #headset🗣ï¸� +icon_img="ó°�œ" +icon_inf="ï„©" #info +icon_itm="" #item (default) +icon_kbd="" #keyboard +icon_key="ï‚„" +icon_krt="ó°µ¹" # kart +icon_lck="" +icon_lnk="ïƒ�" +icon_lst="" #list +icon_ltr="ó°¬´" # letters +icon_map="ó°��" +icon_mdd="ó°„¢" # modem disabled state +icon_mic="ó°�¬" +icon_mmc="ó°�­" +icon_mnu="" +icon_mod="" # modem +icon_mov="ó°��" +icon_mse="ó°�½" # computer mouse (🖱ï¸�) +icon_msg="ó°�¦" #text +icon_mtr="ó°Ÿš" # metronome +icon_mus="󰎈" +icon_mut="" #mute +icon_mvi="ó°Ž�" #movie +icon_net="󰀂" +icon_nto="ï�ž" #no touch +icon_num="ï“·" # numbers +icon_nvi="îš®" # neovim +icon_nxt="" #next +icon_out="ó°�ƒ" #logout +icon_pau="ï�Œ" +icon_phl="ó°�¹" #phonelog +icon_phn="ó°�²" #phone +icon_phx="ó°�µ" #hangup +icon_pie="" # pie chart +icon_plk="ó°�¸" # phone locked +icon_pls="ï�§" +icon_pom="" # pomodoro timer +icon_pod="" # podcast +icon_prn="" # printer (🖨ï¸�) +icon_prv="ï†�" #previous +icon_psp="ó°Ÿ£" # passport +icon_pst="" +icon_pwr="â�»" #power +icon_pzl="ó°�±" # puzzle +icon_rad="ó°�¹" # radio +icon_red="ïŠ�" #reddit +icon_ret="󰌑" #return +icon_rld="" +icon_rol="" #rotate left +icon_ror="" #rotate right +icon_rss="" +icon_sav="󰆓" #save +icon_scn="ó°š«" #scanner +icon_sfl="ï�´" #shuffle, random +icon_shr="ó°�„" #shrink +icon_sim="ó°’§" # sim card +icon_snd="" #send +icon_spd="ó°“…" # speedometer +icon_spk="" #speaker +icon_spl="" +icon_spm="" +icon_stp="ïŠ�" #stop +icon_str="" #star +icon_tab="ï‹�" +icon_tgm='' #telegram +icon_thu="ï�°" # thunderbird +icon_tmr="ó°€ " #timer +icon_tof="" +icon_ton="" +icon_trh="" # trash +icon_trm='' #terminal +icon_trn="" # train +icon_tsl="ó°—Š" # translate +icon_upc="ó°� " #up in circle +icon_usb="" # usb +icon_usr="󰀄" # user, avatar +icon_vid="" #video +icon_vim='' +icon_vlc="ó°•¼" +icon_wap="" # whatsapp +icon_wif="" +icon_wfo="ó°–ª" # wifi off +icon_wfh="󰀂" # wifi hotspot +icon_win="ï‹�" #window +icon_wat="î­¼" # watch (⌚) +icon_wn2="ï‹’" +icon_wrh="ï‚­" +icon_wtr="îˆ�" #weather +icon_ytb="ï…ª" #youtube +icon_zip="ó°—„" # archive +icon_zmi="ó°›­" # Zoom in/magnify +icon_zmo="󰛬" # Zoom out/demagnify +icon_zzz="" #sleep/suspend/crust +icon_nte="ï‹«" + +# modem states + +icon_modem_nomodem="ó°¥�" # cell with x +icon_modem_locked="ó°¥�" # cell with lock +icon_modem_initializing="󰥑" # cell with gear +icon_modem_disabled="ó°¥�" # cell with slash +icon_modem_disabling="$icon_arr$icon_modem_disabled" # -> disabled +icon_modem_enabled="󱟽" # cell with check +icon_modem_enabling="$icon_arr$icon_modem_enabled" # -> enabled +icon_modem_registered="󱋘" # cell with wifi with slash +icon_modem_searching="$icon_arr$icon_modem_registered" # -> registered +icon_modem_connected="ó°º�" # cell with wifi +icon_modem_connecting="$icon_aru$icon_modem_connected" # up arrow connected +icon_modem_disconnecting="$icon_ard$icon_modem_connected" # down arrow connected +icon_modem_failed="ó°½�" # cell with ! + +# modem techs +icon_modem_fiveg="󰩯" # 5gnr +icon_modem_fourg="󰜔" # lte +icon_modem_threeg="󰜓" # a lot (see sxmo_hook_statusbar.sh) +icon_modem_hspa="󰜕" # hspa +icon_modem_hspa_plus="󰜖" # hspa plus +icon_modem_twog="󰜒" # edge, pots, gsm, gprs, etc. +icon_modem_notech="󰞃" # disabled cell bars + +# modem signal strengths +icon_modem_signal_0="󰢿" +icon_modem_signal_1="ó°¢¼" +icon_modem_signal_2="ó°¢½" +icon_modem_signal_3="ó°¢¾" + +# wifi signal strengths +icon_wifi_signal_exclam="󰤫" +icon_wifi_key_signal_0="󰤬" +icon_wifi_signal_0="󰤯" +icon_wifi_key_signal_1="󰤡" +icon_wifi_signal_1="󰤟" +icon_wifi_key_signal_2="󰤤" +icon_wifi_signal_2="󰤢" +icon_wifi_key_signal_3="󰤧" +icon_wifi_signal_3="󰤥" +icon_wifi_key_signal_4="󰤪" +icon_wifi_signal_4="󰤨" +icon_wifi_disconnected="󰤮" + +# battery indicators +icon_bat_c_0="󰢟" +icon_bat_c_1="󱊤" +icon_bat_c_2="󱊥" +icon_bat_c_3="ó°‚…" +icon_bat_c_10="󰢜" +icon_bat_c_20="󰂆" +icon_bat_c_30="󰂇" +icon_bat_c_40="󰂈" +icon_bat_c_50="ó°¢�" +icon_bat_c_60="󰂉" +icon_bat_c_70="󰢞" +icon_bat_c_80="ó°‚Š" +icon_bat_c_90="ó°‚‹" +icon_bat_c_full="ó°‚…" +icon_bat_warning="ó±ƒ�" +icon_bat_0="ó°‚Ž" +icon_bat_1="󱊡" +icon_bat_2="󱊢" +icon_bat_3="󱊣" +icon_bat_10="ó°�º" +icon_bat_20="ó°�»" +icon_bat_30="ó°�¼" +icon_bat_40="ó°�½" +icon_bat_50="ó°�¾" +icon_bat_60="ó°�¿" +icon_bat_70="ó°‚€" +icon_bat_80="ó°‚�" +icon_bat_90="ó°‚‚" +icon_bat_full="ó°�¹" + +# sxmo state indicators +icon_state_proximity="" +icon_state_screenoff="ï„‘" +icon_state_lock="" +icon_state_unlock="" diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_inputhandler.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_inputhandler.sh new file mode 100755 index 0000000..ed3f8d4 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_inputhandler.sh @@ -0,0 +1,540 @@ +#!/bin/sh +# configversion: 113bf453dd3310afff192d841089e5ac +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script handles input actions, it is called by lisgd for gestures +# and by dwm for button presses. Gestures are tied to actions in +# sxmo_hook_lisgdstart.sh . + +ACTION="$1" + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +stop_proximity_lock() { + sxmo_jobs.sh stop proximity_lock +} + +exec 0</dev/null 2>&1 || true + sxmo_state.sh set unlock + sxmo_wm.sh display on + ;; + "voldown_one") + sxmo_audio.sh vol down 5 + exit + ;; + "voldown_two") + sxmo_audio.sh vol down 10 + exit + ;; + "voldown_three") + sxmo_audio.sh vol down 15 + exit + ;; + "volup_one") + sxmo_audio.sh vol up 5 + exit + ;; + "volup_two") + sxmo_audio.sh vol up 10 + exit + ;; + "volup_three") + sxmo_audio.sh vol up 15 + exit + ;; + esac + #we're locked, don't process the rest of the script + exit 0 +fi + +#special context-sensitive handling +case "$WMCLASS" in + *"mpv"*) + case "$ACTION" in + "oneright") + sxmo_type.sh -k Left + exit 0 + ;; + "oneleft") + sxmo_type.sh -k Right + exit 0 + ;; + "oneup") + sxmo_type.sh m + exit 0 + ;; + "onedown") + sxmo_type.sh p + exit 0 + ;; + esac + ;; + *"acme"*) + case "$ACTION" in + "volup_one") + xdotool click 3 + exit 0 + ;; + "voldown_one") + xdotool click 2 + exit 0 + ;; + esac + ;; + *"links"*) + case "$ACTION" in + # you're probably dragging the scrollbar + *"uprightedge") exit 0 ;; + *"downrightedge") exit 0 ;; + *"onedown") + sxmo_type.sh -M Ctrl -M Shift -k b + exit 0 + ;; + *"oneup") + sxmo_type.sh -M Ctrl -M Shift -k f + exit 0 + ;; + esac + ;; + *"netsurf"*) + case "$ACTION" in + # you're probably dragging the scrollbar + *"uprightedge") exit 0 ;; + *"downrightedge") exit 0 ;; + *"onedown") + sxmo_type.sh -k Page_Up + exit 0 + ;; + *"oneup") + sxmo_type.sh -k Page_Down + exit 0 + ;; + esac + ;; + *"firefox"*|*"librewolf"*) + case "$ACTION" in + # you're probably dragging the scrollbar + *"uprightedge") exit 0 ;; + *"downrightedge") exit 0 ;; + esac + ;; + *"foot"*|*"st"*|*"vte"*|"terminal") # Terminals + case "$WMCLASS" in # Handle programs without touch support + *"st"*) + case "$WMNAME" in + *"weechat"*|*'gomuks'*) + case "$ACTION" in + *"onedown") + sxmo_type.sh -k Page_Up + exit 0 + ;; + *"oneup") + sxmo_type.sh -k Page_Down + exit 0 + ;; + esac + ;; + *"less"*|*"amfora"*) + case "$ACTION" in + *"onedown") + sxmo_type.sh u + exit 0 + ;; + *"oneup") + sxmo_type.sh d + exit 0 + ;; + esac + ;; + *'irssi'*) + case "$ACTION" in + "onedown") + sxmo_type.sh -M Alt p + exit 0 + ;; + "oneup") + sxmo_type.sh -M Alt n + exit 0 + ;; + esac + ;; + *'epy'*|*'epr'*) + case "$ACTION" in + "onedown") + sxmo_type.sh h + exit 0 + ;; + "oneup") + sxmo_type.sh l + exit 0 + ;; + esac + ;; + *'nnn'*|'lf') + case "$ACTION" in + "onedown") + sxmo_type.sh -k Down + exit 0 + ;; + "oneup") + sxmo_type.sh -k Up + exit 0 + ;; + esac + ;; + esac + ;; + esac + + case "$WMNAME" in # Handle programs + *"weechat"*) + case "$ACTION" in + *"oneleft") + sxmo_type.sh -M Alt -k a + exit 0 + ;; + *"oneright") + sxmo_type.sh -M Alt -k less + exit 0 + ;; + esac + ;; + *" sms") + case "$ACTION" in + *"upbottomedge") + number="$(printf %s "$WMNAME" | sed -e 's|^\"||' -e 's|\"$||' | cut -f1 -d' ')" + sxmo_terminal.sh sxmo_modemtext.sh conversationloop "$number" + exit 0 + ;; + esac + ;; + *"tuir"*) + if [ "$ACTION" = "rightbottomedge" ]; then + sxmo_type.sh o + exit 0 + elif [ "$ACTION" = "leftbottomedge" ]; then + sxmo_type.sh s + exit 0 + fi + ;; + *"less"*) + case "$ACTION" in + "leftbottomedge") + sxmo_type.sh q + exit 0 + ;; + "leftrightedge_short") + sxmo_type.sh q + exit 0 + ;; + *"oneleft") + sxmo_type.sh ":n" -k Return + exit 0 + ;; + *"oneright") + sxmo_type.sh ":p" -k Return + exit 0 + ;; + esac + ;; + *"amfora"*) + case "$ACTION" in + "downright") + sxmo_type.sh -k Tab + exit 0 + ;; + "upleft") + sxmo_type.sh -M Shift -k Tab + exit 0 + ;; + *"oneright") + sxmo_type.sh -k Return + exit 0 + ;; + "upright") + sxmo_type.sh -M Ctrl t + exit 0 + ;; + *"oneleft") + sxmo_type.sh b + exit 0 + ;; + "downleft") + sxmo_type.sh -M Ctrl w + exit 0 + ;; + esac + ;; + *"epy"*|*"epr"*) + case "$ACTION" in + *"left"|"voldown_one") + sxmo_type.sh l + exit 0 + ;; + *"right"|"volup_one") + sxmo_type.sh h + exit 0 + ;; + "voldown_three"|"twodownbottomedge") + sxmo_type.sh q + exit + ;; + esac + ;; + *'nnn'*|'lf') + case "$ACTION" in + *"left") + sxmo_type.sh -k Right + exit 0 + ;; + *"right") + sxmo_type.sh -k Left + exit 0 + ;; + esac + ;; + esac + + case "$WMCLASS" in # Handle general scrolling without touch support + *"st"*) + case "$ACTION" in + *"onedown") + sxmo_type.sh -M Ctrl -M Shift -k b + exit 0 + ;; + *"oneup") + sxmo_type.sh -M Ctrl -M Shift -k f + exit 0 + ;; + esac + ;; + "org.gnome.vte.application"|"terminal") + case "$ACTION" in + # For VTE, fallback to doing nothing, + # you're probably dragging the scrollbar + *"uprightedge") exit 0 ;; + *"downrightedge") exit 0 ;; + esac + ;; + esac + ;; +esac + +#standard handling +case "$ACTION" in + "menuright"*|"menuright_one") + if sxmo_dmenu.sh isopen; then + sxmo_dmenu.sh close + else + sxmo_appmenu.sh "$WMCLASS" "$WMNAME" + fi + exit 0 + ;; + "menuleft"*|"menuleft_one") + if sxmo_dmenu.sh isopen; then + sxmo_dmenu.sh close + else + sxmo_appmenu.sh sys + fi + exit 0 + ;; + "enter_one") + if pidof -q sxmo_RepeatRing.sh; then + sxmo_hook_pickup.sh + else + sxmo_appmenu.sh "$WMCLASS" "$WMNAME" + fi + exit 0 + ;; + "enter_two") + swaymsg focus next >/dev/null 2>&1 || sxmo_wm.sh switchfocus + exit 0 + ;; + "enter_three") + sxmo_wm.sh togglelayout + exit 0 + ;; + "powerbutton_one") + if echo "$WMCLASS" | grep -i "megapixels"; then + sxmo_type.sh -k space + else + sxmo_appmenu.sh power + fi + exit 0 + ;; + "powerbutton_two") + sxmo_state.sh click 2 + exit 0 + ;; + "powerbutton_three") + sxmo_terminal.sh + exit 0 + ;; + "voldown_one") + if [ -n "$SXMO_NO_VIRTUAL_KEYBOARD" ]; then + sxmo_killwindow.sh + else + sxmo_keyboard.sh toggle + fi + exit + ;; + "voldown_two") + sxmo_wm.sh togglelayout + exit + ;; + "voldown_three") + sxmo_killwindow.sh + exit + ;; + "volup_one") + sxmo_appmenu.sh "$WMCLASS" "$WMNAME" + exit + ;; + "volup_two") + sxmo_appmenu.sh sys + exit + ;; + "volup_three") + sxmo_wmmenu.sh + exit + ;; + "rightleftedge") + sxmo_wm.sh previousworkspace + exit 0 + ;; + "leftrightedge") + sxmo_wm.sh nextworkspace + exit 0 + ;; + "twoleft") + sxmo_wm.sh movepreviousworkspace + exit 0 + ;; + "tworight") + sxmo_wm.sh movenextworkspace + exit 0 + ;; + "righttopedge") + sxmo_brightness.sh up + exit 0 + ;; + "lefttopedge") + sxmo_brightness.sh down + exit 0 + ;; + "upleftedge") + sxmo_audio.sh vol up + exit 0 + ;; + "downleftedge") + sxmo_audio.sh vol down + exit 0 + ;; + "upbottomedge") + if [ -n "$SXMO_NO_VIRTUAL_KEYBOARD" ]; then + sxmo_terminal.sh + else + sxmo_keyboard.sh open + fi + exit 0 + ;; + "downbottomedge") + if [ -n "$SXMO_NO_VIRTUAL_KEYBOARD" ]; then + sxmo_killwindow.sh + else + sxmo_keyboard.sh close + fi + exit 0 + ;; + "downtopedge") + sxmo_dmenu.sh isopen || sxmo_appmenu.sh "$WMCLASS" "$WMNAME" + exit 0 + ;; + "twodowntopedge") + sxmo_hook_quickactions.sh + exit 0 + ;; + "uptopedge") + sxmo_dmenu.sh close + dunstctl close-all + exit 0 + ;; + "twodownbottomedge") + sxmo_killwindow.sh + exit 0 + ;; + "uprightedge") + sxmo_type.sh -k Up + exit 0 + ;; + "downrightedge") + sxmo_type.sh -k Down + exit 0 + ;; + "leftrightedge_short") + sxmo_type.sh -k Left + exit 0 + ;; + "rightrightedge_short") + sxmo_type.sh -k Right + exit 0 + ;; + "rightbottomedge") + sxmo_type.sh -k Return + exit 0 + ;; + "leftbottomedge") + sxmo_type.sh -k BackSpace + exit 0 + ;; + "topleftcorner") + sxmo_appmenu.sh sys + exit 0 + ;; + "toprightcorner") + sxmo_appmenu.sh scripts + exit 0 + ;; + "bottomleftcorner") + sxmo_dmenu.sh close + sxmo_keyboard.sh close + if [ -n "$WMCLASS" ]; then + sxmo_state.sh set lock + else + sxmo_state.sh set screenoff + fi + exit 0 + ;; + "bottomrightcorner") + sxmo_rotate.sh + exit 0 + ;; +esac diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_lisgdstart.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_lisgdstart.sh new file mode 100755 index 0000000..93ebf43 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_lisgdstart.sh @@ -0,0 +1,75 @@ +#!/bin/sh +# configversion: 32e953d311555ad8dd7b4c13d5a0fff4 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +LISGD_THRESHOLD="${SXMO_LISGD_THRESHOLD:-125}" +LISGD_THRESHOLD_PRESSED="${SXMO_LISGD_THRESHOLD_PRESSED:-60}" +LISGD_INPUT_DEVICE="${SXMO_LISGD_INPUT_DEVICE:-"/dev/input/by-path/first-touchscreen"}" + +case "$SXMO_WM" in + dwm|i3) + case "$(xrandr | grep primary | cut -d' ' -f 5)" in + right) orientation=1;; + left) orientation=3;; + inverted) orientation=2;; + *) orientation=0;; + esac + ;; +esac + +#-g format: +# fingers,swipe,edge,distance,command +#order matters, only the first match gets executed +lisgd "$@" -d "$LISGD_INPUT_DEVICE" ${orientation:+-o $orientation} \ + -s "${LISGD_EDGE_SIZE:-1.0}" -t "$LISGD_THRESHOLD" -T "$LISGD_THRESHOLD_PRESSED" \ + -g "1,DRUL,BR,*,setsid -f sxmo_hook_inputhandler.sh bottomrightcorner" \ + -g "1,DLUR,BL,*,setsid -f sxmo_hook_inputhandler.sh bottomleftcorner" \ + -g "1,ULDR,TL,*,setsid -f sxmo_hook_inputhandler.sh topleftcorner" \ + -g "1,URDL,TR,*,setsid -f sxmo_hook_inputhandler.sh toprightcorner" \ + -g "1,LR,B,L,setsid -f sxmo_hook_inputhandler.sh rightbottomedge" \ + -g "1,RL,B,L,setsid -f sxmo_hook_inputhandler.sh leftbottomedge" \ + -g "1,LR,L,*,setsid -f sxmo_hook_inputhandler.sh rightleftedge" \ + -g "1,RL,R,*,setsid -f sxmo_hook_inputhandler.sh leftrightedge" \ + -g "1,DU,L,*,P,setsid -f sxmo_hook_inputhandler.sh upleftedge" \ + -g "1,UD,L,*,P,setsid -f sxmo_hook_inputhandler.sh downleftedge" \ + -g "1,LR,T,*,P,setsid -f sxmo_hook_inputhandler.sh righttopedge" \ + -g "1,RL,T,*,P,setsid -f sxmo_hook_inputhandler.sh lefttopedge" \ + -g "1,DU,B,*,setsid -f sxmo_hook_inputhandler.sh upbottomedge" \ + -g "1,UD,B,*,setsid -f sxmo_hook_inputhandler.sh downbottomedge" \ + -g "1,UD,T,*,setsid -f sxmo_hook_inputhandler.sh downtopedge" \ + -g "1,DU,T,*,setsid -f sxmo_hook_inputhandler.sh uptopedge" \ + -g "2,UD,T,*,setsid -f sxmo_hook_inputhandler.sh twodowntopedge" \ + -g "2,UD,B,*,setsid -f sxmo_hook_inputhandler.sh twodownbottomedge" \ + -g "1,DU,R,*,P,setsid -f sxmo_hook_inputhandler.sh uprightedge" \ + -g "1,UD,R,*,P,setsid -f sxmo_hook_inputhandler.sh downrightedge" \ + -g "1,LR,R,S,setsid -f sxmo_hook_inputhandler.sh rightrightedge_short" \ + -g "1,RL,L,S,setsid -f sxmo_hook_inputhandler.sh leftrightedge_short" \ + -g "1,RL,*,L,setsid -f sxmo_hook_inputhandler.sh longoneleft" \ + -g "1,LR,*,L,setsid -f sxmo_hook_inputhandler.sh longoneright" \ + -g "1,DU,*,L,setsid -f sxmo_hook_inputhandler.sh longoneup" \ + -g "1,UD,*,L,setsid -f sxmo_hook_inputhandler.sh longonedown" \ + -g "1,RL,*,M,setsid -f sxmo_hook_inputhandler.sh mediumoneleft" \ + -g "1,LR,*,M,setsid -f sxmo_hook_inputhandler.sh mediumoneright" \ + -g "1,DU,*,M,setsid -f sxmo_hook_inputhandler.sh mediumoneup" \ + -g "1,UD,*,M,setsid -f sxmo_hook_inputhandler.sh mediumonedown" \ + -g "1,RL,*,*,setsid -f sxmo_hook_inputhandler.sh oneleft" \ + -g "1,LR,*,*,setsid -f sxmo_hook_inputhandler.sh oneright" \ + -g "1,DU,*,*,setsid -f sxmo_hook_inputhandler.sh oneup" \ + -g "1,UD,*,*,setsid -f sxmo_hook_inputhandler.sh onedown" \ + -g "1,DRUL,*,*,setsid -f sxmo_hook_inputhandler.sh upleft" \ + -g "1,URDL,*,*,setsid -f sxmo_hook_inputhandler.sh downleft" \ + -g "1,DLUR,*,*,setsid -f sxmo_hook_inputhandler.sh upright" \ + -g "1,ULDR,*,*,setsid -f sxmo_hook_inputhandler.sh downright" \ + -g "2,RL,*,*,setsid -f sxmo_hook_inputhandler.sh twoleft" \ + -g "2,LR,*,*,setsid -f sxmo_hook_inputhandler.sh tworight" \ + -g "2,DU,*,*,setsid -f sxmo_hook_inputhandler.sh twoup" \ + -g "2,UD,*,*,setsid -f sxmo_hook_inputhandler.sh twodown" \ + -g "3,RL,*,*,setsid -f sxmo_hook_inputhandler.sh threeleft" \ + -g "3,LR,*,*,setsid -f sxmo_hook_inputhandler.sh threeright" \ + -g "3,DU,*,*,setsid -f sxmo_hook_inputhandler.sh threeup" \ + -g "3,UD,*,*,setsid -f sxmo_hook_inputhandler.sh threedown" diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_lock.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_lock.sh new file mode 100755 index 0000000..83e80ab --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_lock.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# configversion: 70028f54f5d7428d4e3178de5c98978b +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors +# +# See man 7 sxmo.states. +# +# This will: +# - blink blue led once +# - turn screen on +# - disable input +# - set up a daemon to automatically transition to screenoff state after 8s. + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# This hook is called when the system reaches a locked state + +sxmo_led.sh blink blue & + +[ "$SXMO_WM" = "sway" ] && swaymsg mode default +sxmo_wm.sh display on +sxmo_wm.sh inputevent touchscreen off + +sxmo_jobs.sh stop periodic_blink +sxmo_jobs.sh stop periodic_wakelock_check + +# Go down after 8 seconds of inactivity +if [ -e "$XDG_CACHE_HOME/sxmo/sxmo.noidle" ]; then + sxmo_jobs.sh stop idle_locker +else + sxmo_jobs.sh start idle_locker sxmo_idle.sh -w \ + timeout "${SXMO_LOCK_IDLE_TIME:-8}" "sxmo_state.sh idle" +fi + +wait diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_locker.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_locker.sh new file mode 100755 index 0000000..4f72e5a --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_locker.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# configversion: 615d3d009ed6b473a5a8cc5f2f4d82a4 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +sxmo_jobs.sh start idle_locker sxmo_idle.sh -w \ + timeout 10 'sxmo_wm.sh display off' \ + resume 'sxmo_wm.sh display on' + +case "$SXMO_WM" in + sway|river) + swaylockd + ;; + dwm) + i3lock + ;; +esac + +# need & cause we are still holding flock +sxmo_state.sh set unlock & diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_lockstatusbar.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_lockstatusbar.sh new file mode 100755 index 0000000..1ff9334 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_lockstatusbar.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# configversion: 8c70b4331421862ea438b53fa6f991f8 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# For use with peanutbutter (peanutbutter --font Sxmo --statuscommand sxmo_hook_lockstatusbar.sh) +# This filters out the last component (which is usually the time and is already displayed more prominently + +# make sure status bar icons are suited for peanutbutter +sxmo_hook_statusbar.sh state_change + +# obtain status output to pass to peanutbutter (this keeps running and updating to stdout) +exec sxmo_status_watch.sh -o pango diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_logout.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_logout.sh new file mode 100755 index 0000000..3d9bb30 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_logout.sh @@ -0,0 +1,5 @@ +#!/bin/sh +# configversion: 129937e97deb858f929aeaa989f81810 + +# This script is called with both toggle wm and when loging out (i.e., restarting) +# current window manager. diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_missed_call.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_missed_call.sh new file mode 100755 index 0000000..0cedcd0 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_missed_call.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# configversion: a50cff93f5d111104e24e83545e9f870 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script is executed (asynchronously) when you missed a call +# You can use it to play a ring tone + +# The following parameters are provided: +# $1 = Contact Name or Number (if not in contacts) + +# kill existing ring playback +sxmo_jobs.sh stop ringing diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_mnc.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_mnc.sh new file mode 100755 index 0000000..05bb7eb --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_mnc.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# configversion: 45730300738694a1dcf23a31c63e90ee +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +if ! command -v mnc > /dev/null; then + exit 0 +fi + +crontab -l | grep sxmo_rtcwake | mnc + + diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_modem.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_modem.sh new file mode 100755 index 0000000..ffa6804 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_modem.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# configversion: 5af98b088d38ff15338bc0e0a9fe9d33 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This hook is called when the ModemManager1.Modem signals a StateChanged + +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# see networkmanager documentation for state names +# oldstate="$1" +newstate="$2" +# reason="$3" # 0 or 1 + +sxmo_debug "$2 (old: $1 [reason: $3])" + +case "$newstate" in + "locked") + sxmo_log "State is locked. Attempting to unlock." + if ! pgrep -f "sxmo_unlocksim.sh" >/dev/null; then + sxmo_unlocksim.sh + fi + ;; + "enabling") + sxmo_log "State is enabling. Clearing stale call files." + rm "$XDG_RUNTIME_DIR"/sxmo_calls/* 2>/dev/null + rm -f "$SXMO_NOTIFDIR"/incomingcall* 2>/dev/null + ;; + "registered") + sxmo_log "State is registered. Checking for calls and messages." + + # kill the pin-entry dmenu if still open + pkill -f sxmo_unlocksim.sh + + sxmo_modem.sh checkforfinishedcalls + sxmo_modem.sh checkforincomingcalls + sxmo_modem.sh checkfornewtexts + sxmo_modem.sh checkforstucksms + if [ -f "${SXMO_MMS_BASE_DIR:-"$HOME"/.mms/modemmanager}/mms" ]; then + sxmo_mms.sh checkforlostmms + fi + + # An example of something else to do here! + #if ! ping -Iwwan0 -q -c 1 -W 10 www.google.com >/dev/null; then + # sxmo_log "ping failed." + # nmcli c down "MINTY" + # nmcli c up "MINTY" + #else + # sxmo_log "ping ok." + #fi + ;; +esac diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_mute_ring.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_mute_ring.sh new file mode 100755 index 0000000..5e22754 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_mute_ring.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# configversion: c67b950eca8aca26d6966b7a2ffe19be +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script is executed (asynchronously) when you mute (Ignore) an +# incoming call, i.e., ignore the call ringing in. + +# kill existing ring playback +sxmo_jobs.sh stop ringing + +sxmo_playerctl.sh resume_all diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_network_down.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_network_down.sh new file mode 100755 index 0000000..7a64d59 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_network_down.sh @@ -0,0 +1,19 @@ +#!/bin/sh +# configversion: 29ec7910bd4c699ad1a8c84f74e6aeb5 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2023 Sxmo Contributors + +# This is called when any network goes down. +# $1 = device name (eg. wlan0) +# $2 = device type (eg. wifi) + +# Some examples: + +# Notify the user when a network goes down. +# sxmo_notify_user.sh "$2 ($1) down." + +# Toggle the data connection when wifi goes down. +#if [ "$2" = "wifi" ]; then +# nmcli c down MYMINT +# nmcli c up MYMINT +#fi diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_network_pre_down.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_network_pre_down.sh new file mode 100755 index 0000000..3601df3 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_network_pre_down.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# configversion: ca99324b5d4805618119d354a47cd0ca +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2023 Sxmo Contributors + +# This is called when any network prepares to go down. +# $1 = device name (eg. wlan0) +# $2 = device type (eg. wifi) + +# Some examples: + +# Notify the user when a network goes down. +# sxmo_notify_user.sh "$2 ($1) preparing to go down." diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_network_pre_up.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_network_pre_up.sh new file mode 100755 index 0000000..ae72953 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_network_pre_up.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# configversion: c962c5ea510e22718562938674098cb8 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2023 Sxmo Contributors + +# This is called when any network prepares to go up. +# $1 = device name (eg. wlan0) +# $2 = device type (eg. wifi) + +# Some examples: + +# Notify the user when a network goes down. +# sxmo_notify_user.sh "$2 ($1) preparing to go up." diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_network_up.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_network_up.sh new file mode 100755 index 0000000..ca95a20 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_network_up.sh @@ -0,0 +1,16 @@ +#!/bin/sh +# configversion: aec40a4fa4dcd04cc52ef8001970445d +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2023 Sxmo Contributors + +# This is called when a network goes up. +# $1 = device name (e.g. wlan0) +# $2 = device type (e.g. wifi) + +# Notify the user if a network goes up. +# sxmo_notify_user.sh "$2 ($1) up." + +# tell us wifi strength +#if [ "$2" = "wifi" ]; then +# sxmo_notify_user.sh "SIGNAL STRENGTH: $(nmcli -f IN-USE,SIGNAL,SSID device wifi |awk '/^\*/{if (NR!=1) {print $2}}')" +#fi diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_notification.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_notification.sh new file mode 100755 index 0000000..cec3da3 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_notification.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# configversion: 2b365df8fa90b8b424b7e1922d130a1f +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# Runs when a notification arrives, +# Arguments: +# $1 - The notification file which contains the notification text. + +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +#if [ ! -f "$XDG_CONFIG_HOME"/sxmo/.novibrate ]; then +# VIBS=5 +# VIBI=0 +# while [ "$VIBI" -lt "$VIBS" ]; do +# sxmo_vibrate 400 "${SXMO_VIBRATE_STRENGTH:-1}" & +# sleep 0.5 +# VIBI="$(echo "$VIBI+1" | bc)" +# done +#fi diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_notifications.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_notifications.sh new file mode 100755 index 0000000..5c907e7 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_notifications.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# configversion: 66bf3b04f23700d735c73c06814d35c2 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This hook is called when a notification (sxmo_notificationmonitor.sh) +# is added or removed. +# $1 is the number of notifications on the system (0 if none). + +if [ "$1" -eq 0 ]; then + sxmo_led.sh set green 0 +else + sxmo_led.sh set green 100 +fi +sxmo_hook_statusbar.sh notifications diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_pickup.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_pickup.sh new file mode 100755 index 0000000..06d02b4 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_pickup.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# configversion: 2c55ea6c81d96a9c2873a0b92fef4f74 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script is executed (asynchronously) when you pick up an incoming call + +# kill existing ring playback +sxmo_jobs.sh stop ringing + +# Pause all player automatically +sxmo_playerctl.sh pause_all diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_postwake.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_postwake.sh new file mode 100755 index 0000000..2f857f0 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_postwake.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# configversion: 6363277a2c0b710bfa69218635da22d0 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +if [ -z "$SXMO_NO_MODEM" ]; then + MMCLI="$(mmcli -m any -J 2>/dev/null)" + if [ -z "$MMCLI" ]; then + sxmo_notify_user.sh "Modem crashed! 30s recovery." + sxmo_wakelock.sh lock sxmo_modem_crashed 30s + fi +fi + +# Add here whatever you want to do diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_power.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_power.sh new file mode 100755 index 0000000..2c1158b --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_power.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# configversion: 6231f22a7daf07776a7cfc2c108d4a7a +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script is executed before reboot and poweroff the system +# +# The following parameters are provided: +# $1 = Action (poweroff or reboot) + +brightnessctl -d white:torch set 0 >/dev/null 2>&1 || true +brightnessctl -d white:kbd_backlight set 0 >/dev/null 2>&1 || true +brightnessctl -d backlight set 0 >/dev/null 2>&1 || true +sync + diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_quickactions.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_quickactions.sh new file mode 100755 index 0000000..bf65139 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_quickactions.sh @@ -0,0 +1,59 @@ +#!/bin/sh +# configversion: abf430b9c661f8b4f955feb586077187 + +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2025 Sxmo Contributors + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh +# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh +. sxmo_hook_icons.sh + +# WARNING: The menus in this script will be displayed over the lockscreen + +player_options() { + case "$(playerctl status 2>/dev/null)" in + "") ;; # no player found + *"Playing"*) cat - <<-EOF + $icon_arl Previous + $icon_pau Pause + $icon_arr Next + EOF + ;; + *) printf "%s Play" "$icon_itm" ;; + esac +} + +while true +do + PICKED="$(grep . <<-EOF | sxmo_dmenu.sh --show-over-lockscreen + $icon_cls Close Menu + $icon_pwr Screen Off + $icon_bth Bluetooth $(rfkill list bluetooth | grep "yes" >/dev/null \ + && printf %b "$icon_tof" \ + || printf %b "$icon_ton") + $(player_options) + $(if brightness="$(brightnessctl -l -m | grep -e "white:torch" -e "white:flash" | cut -d ',' -f 3)" && [ -n "$brightness" ]; then + printf "%s Flashlight " "$icon_fll" + [ "$brightness" -gt 0 ] && + printf %b "$icon_ton" || printf %b "$icon_tof"; + fi) + $icon_wifi_signal_4 Wifi $(rfkill list wifi | grep "yes" >/dev/null \ + && printf %b "$icon_tof" \ + || printf %b "$icon_ton") +EOF +)" + + case "$PICKED" in + *'Close Menu'|'') exit 0 ;; + *"Bluetooth"*) doas sxmo_bluetoothtoggle.sh ;; + *"Previous") playerctl previous ;; + *"Pause") playerctl pause ;; + *"Play") playerctl play ;; + *"Next") playerctl next ;; + *"Screen Off") sxmo_state.sh set screenoff && exit 0;; + *"Flashlight"*) sxmo_flashtoggle.sh ;; + *"Wifi"*) doas sxmo_wifitoggle.sh ;; + esac +done diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_restart_modem_daemons.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_restart_modem_daemons.sh new file mode 100755 index 0000000..549aa76 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_restart_modem_daemons.sh @@ -0,0 +1,93 @@ +#!/bin/sh +# configversion: 3329dea80a28c8eb4c54b8828e50758f +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script restart the modem-related daemons on the system +# e.g., eg25-manager, modemmonitor, etc. + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +daemon_start() { + if ! daemon_exists "$1"; then + sxmo_notify_user.sh "$1 does not exist on the system" + return 1 + fi + if daemon_isrunning "$1"; then + sxmo_notify_user.sh "$1 is already running" + return 0 + fi + if [ -d /run/systemd/system ]; then + [ "$1" = "modemmanager" ] && set -- ModemManager + doas systemctl start "$1" + else + doas rc-service "$1" start + fi +} + +daemon_stop() { + if ! daemon_exists "$1"; then + sxmo_notify_user.sh "$1 does not exist on the system" + return 1 + fi + if ! daemon_isrunning "$1"; then + sxmo_notify_user.sh "$1 is already stopped" + return 0 + fi + if [ -d /run/systemd/system ]; then + [ "$1" = "modemmanager" ] && set -- ModemManager + doas systemctl stop "$1" + else + doas rc-service "$1" stop + fi +} + +daemon_isrunning() { + if ! daemon_exists "$1"; then + sxmo_log "$1 does not exist on the system" + return 1 + fi + if [ -d /run/systemd/system ]; then + [ "$1" = "modemmanager" ] && set -- ModemManager + systemctl is-active --quiet "$1" + else + rc-service "$1" status | grep -q started + fi +} + +daemon_exists() { + + if [ -d /run/systemd/system ]; then + [ "$1" = "modemmanager" ] && set -- ModemManager + systemctl status "$1" > /dev/null 2>&1 + [ $? -ne 4 ] + else + [ -f /etc/init.d/"$1" ] + fi +} + +if command -v eg25-manager > /dev/null; then + sxmo_notify_user.sh "Stopping eg25-manager..." + daemon_stop eg25-manager + sleep 2 + sxmo_notify_user.sh "Starting eg25-manager..." + daemon_start eg25-manager + if ! daemon_isrunning eg25-manager; then + sxmo_notify_user.sh --urgency=critical "The eg25-manager failed to start!" + exit 1 + fi +fi + +sxmo_notify_user.sh "Stopping modemmanager..." +daemon_stop modemmanager +sleep 2 +sxmo_notify_user.sh "Starting modemmanager..." +daemon_start modemmanager +if ! daemon_isrunning modemmanager; then + sxmo_notify_user.sh --urgency=critical "The modemmanager failed to start!" + exit 1 +fi +# we want 120s before sleeping again +sxmo_wakelock.sh lock sxmo_modem_manually_reset 120s diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_ring.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_ring.sh new file mode 100755 index 0000000..a5b5aea --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_ring.sh @@ -0,0 +1,90 @@ +#!/bin/sh +# configversion: 09ad3901daff9cc5473c32bd02533148 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script is executed (asynchronously) when you get an incoming call +# You can use it to play a ring tone + +# $1 = Contact Name or Number (if not in contacts) + +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# Only vibrate if you already got an active call +if sxmo_modemcall.sh list_active_calls \ + | grep -v ringing-in \ + | grep -q .; then + sxmo_vibrate 1500 "${SXMO_VIBRATE_STRENGTH:-1}" + exit +fi + +# Shallow if you have more than one ringing call +if ! sxmo_modemcall.sh list_active_calls \ + | grep -c ringing-in \ + | grep -q 1; then + exit +fi + +finish() { + trap - INT TERM EXIT + jobs -p | xargs -r kill + wait + exit +} + +ring() { + mpv --no-resume-playback --quiet --no-video \ + --loop="${SXMO_RINGNUMBER:-10}" "$SXMO_RINGTONE" >/dev/null & +} + +vibrate() { + while : ; do + trap 'finish' INT TERM EXIT + sxmo_vibrate 1500 "${SXMO_VIBRATE_STRENGTH:-1}" & + wait "$!" + + sleep 0.5 & + wait "$!" + done & +} + +# SILENT MODE +if [ -f "$XDG_CONFIG_HOME"/sxmo/.busy ]; then + end="$(cat "$XDG_CONFIG_HOME"/sxmo/.busy)" + if [ -z "$end" ] || [ "$(date +%s)" -lt "$end" ]; then + exit + fi +fi + +# RING & VIBRATE MODE (DEFAULT) +if [ ! -f "$XDG_CONFIG_HOME"/sxmo/.noring ] && [ ! -f "$XDG_CONFIG_HOME"/sxmo/.novibrate ]; then + sxmo_log "RING AND VIBRATE" + + # In order for this to work, you will need to install playerctl and run playerctld + # In order for this to work with mpv, you will need to install mpv-mdis. + sxmo_playerctl.sh pause_all + + ring + vibrate + +# RING-ONLY MODE +elif [ ! -f "$XDG_CONFIG_HOME"/sxmo/.noring ] && [ -f "$XDG_CONFIG_HOME"/sxmo/.novibrate ]; then + sxmo_log "RING ONLY" + + # In order for this to work, you will need to install playerctl and run playerctld + # In order for this to work with mpv, you will need to install mpv-mdis. + sxmo_playerctl.sh pause_all + + ring + +# VIBRATE-ONLY MODE +elif [ ! -f "$XDG_CONFIG_HOME"/sxmo/.novibrate ] && [ -f "$XDG_CONFIG_HOME"/sxmo/.noring ]; then + smxo_log "VIBRATE ONLY" + + vibrate +fi + +trap 'finish' INT TERM EXIT +sleep "${SXMO_RINGTIME:-20}" & +wait "$!" diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_rotate.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_rotate.sh new file mode 100755 index 0000000..fcc7b6d --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_rotate.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# configversion: 70b9e11c69ccd120bda1e1aebcc7f9cd +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script is executed after the screen is rotated. +# You can use this to change your conky/wayout layout or status +# bar to something more appropriate to the current orientation. + +# The following parameters are provided: +# $1 = the new orientation +# possible values are "normal", "invert", "left" and "right" diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_screenoff.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_screenoff.sh new file mode 100755 index 0000000..52e8fad --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_screenoff.sh @@ -0,0 +1,51 @@ +#!/bin/sh +# configversion: 66b67db06146e3b2dd3ae9a6f1411c5e +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors +# +# See man 7 sxmo.states. +# +# This will: +# - turn screen off +# - turn input off +# - launch a demon to blink purple led every 2s +# - check wakelocks and if none suspend after 3s hold + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# This hook is called when the system reaches a off state (screen off) + +sxmo_led.sh blink red blue & + +[ "$SXMO_WM" = "sway" ] && swaymsg mode default +sxmo_wm.sh display off +sxmo_wm.sh inputevent touchscreen off + +if [ ! -e "$XDG_CACHE_HOME"/sxmo/sxmo.nosuspend ]; then + sxmo_jobs.sh start periodic_blink \ + sxmo_run_periodically.sh -w 2 -- sxmo_led.sh blink red blue +fi + +case "$SXMO_WM" in + dwm) + # dmenu will grab input focus (i.e. power button) so kill it before going to + # screenoff unless proximity lock is running (i.e. there's a phone call). + if ! sxmo_jobs.sh running proximity_lock -q; then + sxmo_dmenu.sh close + fi + ;; +esac + +sxmo_jobs.sh stop idle_locker + +wait + +case "$SXMO_WM" in + sway) + if command -v peanutbutter > /dev/null; then + peanutbutter --font Sxmo --statuscommand sxmo_hook_lockstatusbar.sh && sxmo_hook_statusbar.sh state_change & + fi + ;; +esac diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_scripts.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_scripts.sh new file mode 100755 index 0000000..ba45f8f --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_scripts.sh @@ -0,0 +1,44 @@ +#!/bin/sh +# configversion: 79862f7af2e87209475e387e7abd17c0 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script will output the content of the scripts menu + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh +# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh +. sxmo_hook_icons.sh + +write_line() { + printf "%s ^ 0 ^ %s\n" "$1" "$2" +} + +get_title() { + title="" + eval "$(head "$1" | grep '# title="[^\\"]*"' | sed 's/^# //g')" + if [ -n "$title" ]; then + echo "$title" + else + basename="$(basename "$1")" + echo "$icon_itm $basename" + fi +} + +if [ -f "$XDG_CONFIG_HOME/sxmo/userscripts" ]; then + cat "$XDG_CONFIG_HOME/sxmo/userscripts" +elif [ -d "$XDG_CONFIG_HOME/sxmo/userscripts" ]; then + find -L "$XDG_CONFIG_HOME/sxmo/userscripts" -type f -o -type l | sort -f | while read -r script; do + title="$(get_title "$script")" + write_line "$title" "$script" + done +fi + +write_line "$icon_cfg Edit Userscripts" "sxmo_terminal.sh $EDITOR $XDG_CONFIG_HOME/sxmo/userscripts/*" + +# System Scripts +find "$(xdg_data_path sxmo/appscripts)" -type f -o -type l | sort -f | while read -r script; do + title="$(get_title "$script")" + write_line "$title" "$script" +done diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_sendsms.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_sendsms.sh new file mode 100755 index 0000000..5f128a0 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_sendsms.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# configversion: 4989e41f31ddd70f1bbf97685429ed1a +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script is executed after you send a text +#You can use it to play a notification sound or forward the sms elsewhere + +#The following parameters are provided: +# $1 = Contact Name or Number (if number not in contacts) +# $2 = Text +# mms / group chats will also include these parameters: +# $3 = MMS payload ID +# $4 = Group Contact Name or Number (if number not included in contacts) + +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +if [ ! -f "$XDG_CONFIG_HOME"/sxmo/.noring ]; then + mpv --quiet --no-video "$(xdg_data_path sxmo/notify.ogg)" > /dev/null 2>&1 +fi diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_sms.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_sms.sh new file mode 100755 index 0000000..9108556 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_sms.sh @@ -0,0 +1,41 @@ +#!/bin/sh +# configversion: 26b9fe022a43d084906232c0de6739dd +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This script is executed after you received a text, mms, or vvm +# You can use it to play a notification sound or forward the sms elsewhere + +# The following parameters are provided: +# $1 = Contact Name or Number (if number not in contacts) +# $2 = Text (or 'VVM' if a vvm) +# mms and vvm will include these parameters: +# $3 = MMS or VVM payload ID +# Finally, mms may include this parameter: +# $4 = Group Contact Name or Number (if number not in contacts) + +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# do nothing if active call +if sxmo_modemcall.sh list_active_calls | grep -q active; then + exit +fi + +# do nothing if silent mode +if [ -f "$XDG_CONFIG_HOME"/sxmo/.busy ]; then + end="$(cat "$XDG_CONFIG_HOME"/sxmo/.busy)" + if [ -z "$end" ] || [ "$(date +%s)" -lt "$end" ]; then + exit + fi +fi + +if [ ! -f "$XDG_CONFIG_HOME"/sxmo/.noring ]; then + mpv --no-resume-playback --quiet --no-video "$SXMO_TEXTSOUND" >> /dev/null 2>&1 & +fi + +if [ ! -f "$XDG_CONFIG_HOME"/sxmo/.novibrate ]; then + sxmo_vibrate 500 "${SXMO_VIBRATE_STRENGTH:-1}" & +fi + +wait diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_smslog.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_smslog.sh new file mode 100755 index 0000000..36c58ea --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_smslog.sh @@ -0,0 +1,42 @@ +#!/bin/sh +# configversion: 299a9ddd77ef0f09695cea6c8d9340e3 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# Allow user to override what we log in the sms.txt file. Note if you change +# this you probably should change sxmo_hook_tailtextlog.sh + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh +# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh +. sxmo_hook_icons.sh + +ACTION="$1" # recv or sent +LOGDIRNUM="$2" # The directory name in SXMO_LOG +NUM="$3" # The sender's phone number +TIME="$4" +TEXT="$5" +MMSID="$6" # optional + +if [ "$ACTION" = "recv" ]; then + VERB="Received" +else + VERB="Sent" +fi + +# if group chain also print the sender +if [ "$NUM" != "$LOGDIRNUM" ] && [ "$ACTION" = "recv" ]; then + printf "%s from %s at %s:\n%b\n" \ + "$VERB" "$NUM" "$TIME" "$TEXT" +else + printf "%s at %s:\n%b\n" \ + "$VERB" "$TIME" "$TEXT" +fi + +# print any attachments +for attachment in "$SXMO_LOGDIR/$LOGDIRNUM/attachments/${MMSID}".*; do + [ -f "$attachment" ] && printf "%s %s\n" "$icon_att" "$(basename "$attachment")" +done + +printf "\n" diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_start.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_start.sh new file mode 100755 index 0000000..80f1f22 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_start.sh @@ -0,0 +1,159 @@ +#!/bin/sh +# configversion: c73f9334f62c4c1addcaf074cbcb91e8 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# Runs upon system start and starts various background services + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# Create xdg user directories, such as ~/Pictures +xdg-user-dirs-update + +sxmo_jobs.sh start daemon_manager superd + +# let time to superd to start correctly +while ! superctl status > /dev/null 2>&1; do + sleep 0.5 +done + +# Not dangerous if "locker" isn't an available state +sxmo_state.sh set locker + +if [ -n "$SXMO_ROTATE_START" ]; then + sxmo_rotate.sh +fi + +# Load our sound daemons + +if [ -z "$SXMO_NO_AUDIO" ]; then + if ! [ -d /run/systemd/system ]; then + if [ "$(command -v pulseaudio)" ]; then + superctl start pulseaudio + elif [ "$(command -v pipewire)" ]; then + # pipewire-pulse will start pipewire + superctl start pipewire-pulse + superctl start wireplumber + fi + fi + + # monitor for headphone for statusbar + superctl start sxmo_soundmonitor +fi + +# Periodically update some status bar components +sxmo_hook_statusbar.sh all +sxmo_jobs.sh start statusbar_periodics sxmo_run_aligned.sh 60 \ + sxmo_hook_statusbar.sh periodics + +# dunst is required for warnings. +superctl start dunst + +# start adaptive brightness at boot +# superctl start sxmo_adaptivebrightness + +# load some other little things here too. +case "$SXMO_WM" in + river) + superctl start sxmo_wob + [ "$(command -v bonsaid)" ] && superctl start bonsaid + [ "$(command -v fcitx5)" ] && superctl start fcitx5 + superctl start sxmo_riverbar + ;; + sway) + superctl start sxmo_wob + superctl start sxmo_menumode_toggler + [ "$(command -v bonsaid)" ] && superctl start bonsaid + [ "$(command -v fcitx5)" ] && superctl start fcitx5 + ;; + dwm|i3) + superctl start sxmo_xob + + # Auto hide cursor with touchscreen, Show it with a mouse + if command -v "unclutter-xfixes" > /dev/null; then + set -- unclutter-xfixes + else + set -- unclutter + fi + superctl start "$1" + + superctl start autocutsel + superctl start autocutsel-primary + superctl start sxmo-x11-status + [ "$(command -v bonsaid)" ] && superctl start bonsaid + [ "$(command -v fcitx5)" ] && superctl start fcitx5 + [ -n "$SXMO_MONITOR" ] && xrandr --output "$SXMO_MONITOR" --primary + # Set onboard to auto-hide in config first + if [ "$KEYBOARD" = "onboard" ]; then + onboard "$KEYBOARD_ARGS" + fi + case "$SXMO_WM" in + i3) + xbindkeys -f "$XDG_CONFIG_HOME/sxmo/xbindkeysrc_$SXMO_BINDING_PROVIDER" + ;; + esac + ;; +esac + +# Turn on auto-suspend +if sxmo_wakelock.sh isenabled; then + sxmo_wakelock.sh lock sxmo_not_suspendable infinite + superctl start sxmo_autosuspend +fi + +# To setup initial unlock state +sxmo_state.sh set unlock + +# Turn on lisgd +if [ ! -e "$XDG_CACHE_HOME"/sxmo/sxmo.nogesture ]; then + superctl start sxmo_hook_lisgd +fi + +if [ -z "$SXMO_NO_MODEM" ] && command -v ModemManager > /dev/null; then + # Turn on the dbus-monitors for modem-related tasks + superctl start sxmo_modemmonitor + + # place a wakelock for 120s to allow the modem to fully warm up (eg25 + + # elogind/systemd would do this for us, but we don't use those.) + sxmo_wakelock.sh lock sxmo_modem_warming_up 120s +fi + +# Start the desktop wallpaper +superctl start sxmo_bg + +# Start the desktop widget (e.g. clock) +superctl start sxmo_conky + +# Monitor the battery +superctl start sxmo_battery_monitor + +# It watch network changes and update the status bar icon by example +superctl start sxmo_networkmonitor + +# The daemon that display notifications popup messages +superctl start sxmo_notificationmonitor + +# Play a funky startup tune if you want (disabled by default) +#mpv --quiet --no-video ~/welcome.ogg & + +# mmsd and vvmd +if [ -z "$SXMO_NO_MODEM" ]; then + if [ -f "${SXMO_MMS_BASE_DIR:-"$HOME"/.mms/modemmanager}/mms" ]; then + superctl start mmsd-tng + fi + + if [ -f "${SXMO_VVM_BASE_DIR:-"$HOME"/.vvm/modemmanager}/vvm" ]; then + superctl start vvmd + fi +fi + +# add some warnings if things are not setup correctly +if ! command -v "sxmo_deviceprofile_$SXMO_DEVICE_NAME.sh"; then + sxmo_notify_user.sh --urgency=critical \ + "No deviceprofile found $SXMO_DEVICE_NAME. See: https://sxmo.org/deviceprofile" +fi + +sxmo_migrate.sh state || sxmo_notify_user.sh --urgency=critical \ + "Config needs migration" "$? file(s) in your sxmo configuration are out of date and disabled - using defaults until you migrate (run sxmo_migrate.sh)" diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_statusbar.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_statusbar.sh new file mode 100755 index 0000000..f16a80e --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_statusbar.sh @@ -0,0 +1,488 @@ +#!/bin/sh +# configversion: bcbb01ae41a24f018e11f41c6b2668c6 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# we disable shellcheck SC2154 (unreferenced variable used) +# shellcheck disable=SC2154 + +# include common definitions +# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh +. sxmo_hook_icons.sh +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# You can modify the statusbar ordering and feel here. +# Note that order number runs from 0 (far left) to 100 (far +# right). Our preference is to have "static" icons on the +# right and "variable" icons (that come and go) on the left. + +set_time() { + if pidof peanutbutter > /dev/null; then + #peanutbutter already features a clock, no need for one in the icon bar + sxmobar -d time + else + date "+${SXMO_STATUS_DATE_FORMAT:-%H:%M}" | while read -r date; do + sxmobar -a time 99 "$date" + done + fi +} + +set_state() { + if [ ! -f "$SXMO_STATE" ]; then + return + fi + + if sxmo_jobs.sh running proximity_lock -q; then + sxmobar -a -e bold -f orange state 90 "$icon_state_proximity" # circle with dot + return + fi + + if command -v peanutbutter > /dev/null; then + # no need for a state icon in this (default) scenario, the state will be obvious, either peanutbutter is on or it isn't + sxmobar -d state + return + fi + + case "$(sxmo_state.sh get)" in + screenoff) + sxmobar -a -e bold -f red state 90 "$icon_state_screenoff" # filled circle + ;; + lock) + sxmobar -a -e bold -f red state 90 "$icon_state_lock" # open circle with slash + ;; + unlock) + sxmobar -a -e bold state 90 "$icon_state_unlock" # open circle + ;; + esac +} + +# from right to left: indicate signal, technologies, mm state +set_modem() { + MMCLI="$(mmcli -m any -J 2>/dev/null)" + + bgcolor=default + fgcolor=default + style=normal + + if [ -z "$MMCLI" ]; then + MODEMSTATE="nomodem" + else + MODEMSTATE="$(printf %s "$MMCLI" | jq -r .modem.generic.state)" + fi + + case "$MODEMSTATE" in + nomodem) + fgcolor=red + MODEMSTATECMP="$icon_modem_nomodem" + ;; + locked) + fgcolor=red + MODEMSTATECMP="$icon_modem_locked" + ;; + initializing) + fgcolor=red + MODEMSTATECMP="$icon_modem_initializing" + ;; + disabled) # low power state + fgcolor=red + MODEMSTATECMP="$icon_modem_disabled" + ;; + disabling) + fgcolor=red + MODEMSTATECMP="$icon_modem_disabling" + ;; + enabling) # modem enabled but neither registered (cell) nor connected (data) + fgcolor=red + MODEMSTATECMP="$icon_modem_enabling" + ;; + enabled) + fgcolor=red + MODEMSTATECMP="$icon_modem_enabled" + ;; + searching) # i.e. registering + fgcolor=red + MODEMSTATECMP="$icon_modem_searching" + ;; + registered) # i.e. phone but no data + fgcolor=orange + MODEMSTATECMP="$icon_modem_registered" + ;; + connecting) + fgcolor=orange + MODEMSTATECMP="$icon_modem_connecting" + ;; + disconnecting) # i.e., going back to registered state + fgcolor=orange + MODEMSTATECMP="$icon_modem_disconnecting" + ;; + connected) + MODEMSTATECMP="$icon_modem_connected" + ;; + *) + # FAILED, UNKNOWN + # see https://www.freedesktop.org/software/ModemManager/doc/latest/ModemManager/ModemManager-Flags-and-Enumerations.html#MMModemState + fgcolor=red + MODEMSTATECMP="$icon_modem_failed" # cell with ! + sxmo_log "WARNING: MODEMSTATE: $MODEMSTATE" + ;; + esac + + sxmobar -a -f "$fgcolor" -b "$bgcolor" -t "$style" \ + modem-state 10 "$MODEMSTATECMP" + + if [ "$MODEMSTATE" = nomodem ]; then + sxmobar -d modem-tech + sxmobar -d modem-signal + return + fi + + MODEMTECHCMP="$icon_modem_notech" + bgcolor=default + fgcolor=default + style=normal + + # see https://www.freedesktop.org/software/ModemManager/api/latest/ModemManager-Flags-and-Enumerations.html#MMModemAccessTechnology + USEDTECHS="$(printf %s "$MMCLI" | jq -r '.modem.generic."access-technologies"[]')" + case "$USEDTECHS" in + *5gnr*) + MODEMTECHCMP="$icon_modem_fiveg" + ;; + *lte*) # lte, lte_nb_iot, lte_cat_m + MODEMTECHCMP="$icon_modem_fourg" + ;; + *umts*|*hsupa*|*hsdpa*|*1xrtt*|*evdo*) + MODEMTECHCMP="$icon_modem_threeg" + ;; + *hspa_plus*) + MODEMTECHCMP="$icon_modem_hspa_plus" # 3g + ;; + *hspa*) + MODEMTECHCMP="$icon_modem_hspa" # 3g + ;; + *edge*) + MODEMTECHCMP="E" # 2G+ + ;; + *pots*) + MODEMTECHCMP="P" # 0G + ;; + *gsm*) # gsm, gsm_compact + MODEMTECHCMP="$icon_modem_twog" + ;; + *gprs*) + MODEMTECHCMP="G" # 2G + ;; + *) + sxmo_log "WARNING: USEDTECHS: $USEDTECHS" + fgcolor=red + ;; + esac + + if [ "$MODEMSTATE" != failed ] && [ "$MODEMSTATE" != unknown ]; then + sxmobar -a -f "$fgcolor" -b "$bgcolor" -t "$style" \ + modem-tech 11 "$MODEMTECHCMP" + fi + + MODEMSIGNALCMP="$icon_modem_signal_0" + bgcolor=default + fgcolor=default + style=normal + + case "$MODEMSTATE" in + registered|connected|connecting|disconnecting) + MODEMSIGNAL="$(printf %s "$MMCLI" | jq -r '.modem.generic."signal-quality".value')" + if [ "$MODEMSIGNAL" -lt 33 ]; then + MODEMSIGNALCMP="$icon_modem_signal_1" + elif [ "$MODEMSIGNAL" -lt 66 ]; then + MODEMSIGNALCMP="$icon_modem_signal_2" + else + MODEMSIGNALCMP="$icon_modem_signal_3" + fi + ;; + esac + + if [ "$MODEMSTATE" != failed ] && [ "$MODEMSTATE" != unknown ]; then + sxmobar -a -f "$fgcolor" -b "$bgcolor" -t "$style" \ + modem-signal 12 "$MODEMSIGNALCMP" + fi +} + +# $1 = type (wifi, tun) +# $2 = interface name (wlan0, tun0) +set_wifi() { + + if rfkill list wifi | grep -q "yes"; then + sxmobar -d wifi-status + return + fi + + CONN="$(nmcli -t con show --active)" + + if ! printf %b "$CONN" | cut -d':' -f3 | grep -q wireless; then + sxmobar -a -f red wifi-status 30 "$icon_wifi_disconnected" + return + fi + + # we simply assume Hotspot as first bit of name + # for hotspot as this is what we create. + if printf %b "$CONN" | grep -q ^Hotspot; then + sxmobar -a wifi-status 30 "$icon_wfh" + return + fi + + # if they have a vpn nmcli c shown --active should also list: + # tun0 ef5fcce9-fdae-4ffe-a540-b16fc7b42852 tun tun0 + if printf %b "$CONN" | cut -d':' -f3 | grep -q -E "^tun$|^wireguard$"; then + wifivpn=1 + else + wifivpn=0 + fi + + wifi_signal="$(nmcli -f IN-USE,SIGNAL,SSID device wifi | awk '/^\*/{if (NR!=1) {print $2}}')" + if [ -z "$wifi_signal" ]; then + icon_wif="$icon_wifi_signal_exclam" + elif [ "$wifi_signal" -lt 20 ]; then + if [ "$wifivpn" -eq 1 ]; then + icon_wif="$icon_wifi_key_signal_0" + else + icon_wif="$icon_wifi_signal_0" + fi + elif [ "$wifi_signal" -lt 40 ]; then + if [ "$wifivpn" -eq 1 ]; then + icon_wif="$icon_wifi_key_signal_1" + else + icon_wif="$icon_wifi_signal_1" + fi + elif [ "$wifi_signal" -lt 60 ]; then + if [ "$wifivpn" -eq 1 ]; then + icon_wif="$icon_wifi_key_signal_2" + else + icon_wif="$icon_wifi_signal_2" + fi + elif [ "$wifi_signal" -lt 80 ]; then + if [ "$wifivpn" -eq 1 ]; then + icon_wif="$icon_wifi_key_signal_3" + else + icon_wif="$icon_wifi_signal_3" + fi + else + if [ "$wifivpn" -eq 1 ]; then + icon_wif="$icon_wifi_key_signal_4" + else + icon_wif="$icon_wifi_signal_4" + fi + fi + + sxmobar -a wifi-status 30 "$icon_wif" +} + +# $1 = type (wifi, tun) +# $2 = interface name (wlan0, tun0) +set_ethernet() { + conname="$(nmcli -t device show "$2" | grep ^GENERAL.CONNECTION | cut -d: -f2-)" + if [ "$conname" = "--" ]; then + # not used device + sxmobar -d ethernet-status-"$2" 30 + return + fi + + if nmcli -t connection show "$conname" | grep ^ipv4.method | grep -q :shared; then + sxmobar -a ethernet-status-"$2" 30 "$icon_lnk" + else + sxmobar -d ethernet-status-"$2" 30 + fi +} + +# $1: type (reported by nmcli, e.g., wifi, tun) +# $2: interface name (reported by nmcli, e.g., wlan0, tun0) +set_network() { + case "$1" in + wifi|tun) set_wifi "$@" ;; + ethernet) set_ethernet "$@" ;; + esac +} + +set_battery() { + name="$1" + state="$2" + percentage="$3" + + fgcolor=default + bgcolor=default + style=normal + BATCMP= + + case "$state" in + fully-charged) + BATCMP="$icon_bat_c_full" + ;; + charging) + if [ "$percentage" -lt 10 ]; then + BATCMP="$icon_bat_c_0" + elif [ "$percentage" -lt 20 ]; then + BATCMP="$icon_bat_c_10" + elif [ "$percentage" -lt 30 ]; then + BATCMP="$icon_bat_c_20" + elif [ "$percentage" -lt 40 ]; then + BATCMP="$icon_bat_c_30" + elif [ "$percentage" -lt 50 ]; then + BATCMP="$icon_bat_c_40" + elif [ "$percentage" -lt 60 ]; then + BATCMP="$icon_bat_c_50" + elif [ "$percentage" -lt 70 ]; then + BATCMP="$icon_bat_c_60" + elif [ "$percentage" -lt 80 ]; then + BATCMP="$icon_bat_c_70" + elif [ "$percentage" -lt 90 ]; then + BATCMP="$icon_bat_c_80" + elif [ "$percentage" -lt 95 ]; then + BATCMP="$icon_bat_c_90" + else + # Treat 'Full' status as same as 'fully-charged' + fgcolor=green + BATCMP="$icon_bat_c_full" + fi + ;; + discharging) + if [ "$percentage" -lt 10 ]; then + fgcolor=red + BATCMP="$icon_bat_warning" + elif [ "$percentage" -lt 20 ]; then + fgcolor=red + BATCMP="$icon_bat_10" + elif [ "$percentage" -lt 30 ]; then + fgcolor=orange + BATCMP="$icon_bat_20" + elif [ "$percentage" -lt 40 ]; then + fgcolor=orange + BATCMP="$icon_bat_30" + elif [ "$percentage" -lt 50 ]; then + fgcolor=orange + BATCMP="$icon_bat_40" + elif [ "$percentage" -lt 60 ]; then + BATCMP="$icon_bat_50" + elif [ "$percentage" -lt 70 ]; then + BATCMP="$icon_bat_60" + elif [ "$percentage" -lt 80 ]; then + BATCMP="$icon_bat_70" + elif [ "$percentage" -lt 90 ]; then + BATCMP="$icon_bat_80" + elif [ "$percentage" -lt 95 ]; then + BATCMP="$icon_bat_90" + else + # Treat 'Full' status as same as 'fully-charged' + BATCMP="$icon_bat_full" + fi + ;; + esac + + sxmobar -a -t "$style" -b "$bgcolor" -f "$fgcolor" \ + "battery-icon-$name" 40 "$BATCMP" + + if [ -z "$SXMO_BAR_SHOW_BAT_PER" ]; then + sxmobar -d "battery-status-$name" + else + sxmobar -a "battery-status-$name" 41 "$percentage%" + fi +} + +set_notifications() { + [ -z "$SXMO_DISABLE_LEDS" ] && return + NNOTIFICATIONS="$(find "$SXMO_NOTIFDIR" -type f | wc -l)" + if [ "$NNOTIFICATIONS" = 0 ]; then + sxmobar -d notifs + else + sxmobar -a -f red notifs 5 "!: $NNOTIFICATIONS" + fi +} + +set_volume() { + VOLCMP="" + + if sxmo_audio.sh mic ismuted; then + VOLCMP="$icon_mmc" + else + case "$(sxmo_audio.sh device getinput 2>/dev/null)" in + *Headset*) + VOLCMP="$icon_hst" + ;; + *) + VOLCMP="$icon_mic" + ;; + esac + fi + + if sxmo_audio.sh vol ismuted; then + VOLCMP="$VOLCMP $icon_mut" + else + case "$(sxmo_audio.sh device get 2>/dev/null)" in + *Speaker*|"") + # nothing for default or pulse devices + ;; + *Headphone*) + VOLCMP="$VOLCMP $icon_hdp" + ;; + *Earpiece*) + VOLCMP="$VOLCMP $icon_ear" + ;; + esac + VOL="$(sxmo_audio.sh vol get)" + if [ "$VOL" -gt 66 ]; then + VOLCMP="$VOLCMP $icon_spk" + elif [ "$VOL" -gt 33 ]; then + VOLCMP="$VOLCMP $icon_spm" + elif [ "$VOL" -ge 0 ]; then + VOLCMP="$VOLCMP $icon_spl" + fi + fi + sxmobar -a volume 50 "$VOLCMP" +} + +set_notch() { + if [ -n "$SXMO_NOTCH" ] && ! pidof peanutbutter > /dev/null; then + sxmobar -a notch "${SXMO_NOTCH_PRIO:-29}" "$SXMO_NOTCH" + else + sxmobar -d notch + fi +} + +sxmo_debug "$@" +case "$1" in + network) + shift + set_network "$@" + ;; + battery) + shift + set_battery "$@" + ;; + time|modem|volume|state|notifications|notch) + set_"$1" + ;; + periodics|state_change) # 55 s loop and screenlock triggers + set_time + if [ -z "$SXMO_NO_MODEM" ]; then + set_modem + fi + set_notch + set_state + set_network wifi wlan0 + ;; + all) + sxmobar -r + set_time + if [ -z "$SXMO_NO_MODEM" ]; then + set_modem + fi + if [ -z "$SXMO_NO_AUDIO" ]; then + set_volume + fi + set_state + set_notifications + set_notch + set_network wifi wlan0 + ;; + *) + exit # swallow it ! + ;; +esac diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_stop.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_stop.sh new file mode 100755 index 0000000..79bdfe1 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_stop.sh @@ -0,0 +1,7 @@ +#!/bin/sh +# configversion: 9ebf1802276513c4eefc8da4e5f2eda9 + +# Runs after wm has been stopped., useful for cleanup + +# clean up misc. stale files (if any) +rm -rf "$XDG_RUNTIME_DIR"/sxmo* diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_tailtextlog.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_tailtextlog.sh new file mode 100755 index 0000000..3ec3ba0 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_tailtextlog.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# configversion: 10dbe6b2a440db545baeeef27c58e076 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# This hook displays the sms log for a numbers passed as $1 + +LOGDIRNUM="$1" + +# Wrap this in a terminal if not already done +if [ -z "$TERMNAME" ]; then + TERMNAME="$LOGDIRNUM SMS" + + # If it's already open, switch to it. + if [ "$SXMO_WM" = "sway" ] && [ -z "$SSH_CLIENT" ]; then + regesc_termname="$(echo "$TERMNAME" | sed 's|+|\\+|g')" + if swaymsg -q "[title=\"^$regesc_termname\$\"]" focus; then + exit 0 + fi + fi + + export TERMNAME + exec sxmo_terminal.sh "$0" "$@" +fi + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +mkcontactssedcmd() { + pnc find "$LOGDIRNUM" | while read -r NUMBER; do + CONTACT="$(sxmo_contacts.sh --name-or-number "$NUMBER")" + if [ ! "$CONTACT" = "$NUMBER" ]; then + printf %s "s/$NUMBER/$CONTACT/;" + fi + done +} + +# Replace certain dates with human readable versions +TODAY="$(date +%F)" +YESTERDAY="$(date -d "- 1 day" +%F)" +TWO_DAYS="$(date -d "- 2 day" +%F)" +DATESEDCMD="s/ at ${TODAY}T/ today at /; s/ at ${YESTERDAY}T/ yesterday at /; s/ at ${TWO_DAYS}T/ two days ago at /; s/[-+][0-9][0-9][0-9][0-9]://; s/\(-[0-9][0-9]\)T\([0-9][0-9]\)/\1 \2/;" + +# TODO +#ALIGNSEDCMD="s/^Sent//;s/^Received//;" + +# Colorize Sent and Received lines +RECEIVED_COLOR="2" +SENT_COLOR="3" +COLORSEDCMD="s#^\(Sent.*\)#$(tput setaf "$SENT_COLOR")\1$(tput op)#;s#^\(Received.*\)#$(tput setaf "$RECEIVED_COLOR")\1$(tput op)#;" + +# Replace phone numbers in the filename with contacts from contact book +CONTACTSSEDCMD="$(mkcontactssedcmd)" + +tail -n9999 -f "$SXMO_LOGDIR/$LOGDIRNUM/sms.txt" |\ + sed -e "$CONTACTSSEDCMD" -e "$DATESEDCMD" -e "$COLORSEDCMD" diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_unlock.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_unlock.sh new file mode 100755 index 0000000..7950b07 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_unlock.sh @@ -0,0 +1,51 @@ +#!/bin/sh +# configversion: 5697e0579ea20a4a6b8dc05f5814d0c6 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# include common definitions +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# This hook is called when the system becomes unlocked again + +sxmo_led.sh blink red green & + +sxmo_wm.sh display on +sxmo_wm.sh inputevent touchscreen on + +sxmo_jobs.sh stop periodic_blink +sxmo_jobs.sh stop periodic_wakelock_check + +# Go to the next idle state after 120 seconds of inactivity +if [ -e "$XDG_CACHE_HOME/sxmo/sxmo.noidle" ]; then + sxmo_jobs.sh stop idle_locker +else + case "$SXMO_WM" in + river) + sxmo_jobs.sh start idle_locker sxmo_idle.sh -w \ + timeout "${SXMO_UNLOCK_IDLE_TIME:-120}" 'sh -c " + exec sxmo_state.sh idle + "' + ;; + sway) + sxmo_jobs.sh start idle_locker sxmo_idle.sh -w \ + timeout "${SXMO_UNLOCK_IDLE_TIME:-120}" 'sh -c " + swaymsg mode default; + exec sxmo_state.sh idle + "' + ;; + i3) + # Idle fails to trigger if formatted like sway + sxmo_jobs.sh start idle_locker sxmo_idle.sh -w \ + timeout "${SXMO_UNLOCK_IDLE_TIME:-120}" \ + 'sh -c "i3-msg mode default; exec sxmo_state.sh idle"' + ;; + dwm) + sxmo_jobs.sh start idle_locker sxmo_idle.sh -w \ + timeout "${SXMO_UNLOCK_IDLE_TIME:-120}" "sxmo_state.sh idle" + ;; + esac +fi + +wait diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_wallpaper.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_wallpaper.sh new file mode 100755 index 0000000..f828c91 --- /dev/null +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_wallpaper.sh @@ -0,0 +1,29 @@ +#!/bin/sh -e +# configversion: 9c6286bbff8167b35278cf97aae4d7e6 +# SPDX-License-Identifier: AGPL-3.0-only +# Copyright 2022 Sxmo Contributors + +# shellcheck source=scripts/core/sxmo_common.sh +. sxmo_common.sh + +# This script is executed once, and must output the wallpaper to display + +installed_wallpapers() { + xdg_data_path wallpapers 0 "\0" | xargs -r0I{} find "{}" -name "$SXMO_OS.*" +} + +sxmo_wallpaper() { + xdg_data_path sxmo/background.jpg +} + +all_wallpapers() { + installed_wallpapers + sxmo_wallpaper +} + +if [ -n "$SXMO_BG_IMG" ]; then + printf "%s" "$SXMO_BG_IMG" + exit +fi + +all_wallpapers | head -n1 diff --git a/overlay/rootfs/usr/share/wallpapers/bananarchy-240x240.png b/overlay/rootfs/usr/share/wallpapers/bananarchy-240x240.png new file mode 100644 index 0000000..b312c98 Binary files /dev/null and b/overlay/rootfs/usr/share/wallpapers/bananarchy-240x240.png differ diff --git a/overlay/rootfs/usr/share/wallpapers/bananarchy-centered.png b/overlay/rootfs/usr/share/wallpapers/bananarchy-centered.png new file mode 100644 index 0000000..ee54999 Binary files /dev/null and b/overlay/rootfs/usr/share/wallpapers/bananarchy-centered.png differ diff --git a/overlay/rootfs/usr/share/wallpapers/bananarchy-landscape.png b/overlay/rootfs/usr/share/wallpapers/bananarchy-landscape.png new file mode 100644 index 0000000..deca3de Binary files /dev/null and b/overlay/rootfs/usr/share/wallpapers/bananarchy-landscape.png differ diff --git a/overlay/rootfs/usr/share/wallpapers/bananarchy.jpg b/overlay/rootfs/usr/share/wallpapers/bananarchy.jpg new file mode 100644 index 0000000..4d5f7cb Binary files /dev/null and b/overlay/rootfs/usr/share/wallpapers/bananarchy.jpg differ diff --git a/overlay/rootfs/usr/share/wallpapers/bananarchy.png b/overlay/rootfs/usr/share/wallpapers/bananarchy.png new file mode 100644 index 0000000..6d32a39 Binary files /dev/null and b/overlay/rootfs/usr/share/wallpapers/bananarchy.png differ diff --git a/overlay/rootfs/usr/share/wallpapers/postmarketos.jpg b/overlay/rootfs/usr/share/wallpapers/postmarketos.jpg new file mode 100644 index 0000000..4d5f7cb Binary files /dev/null and b/overlay/rootfs/usr/share/wallpapers/postmarketos.jpg differ diff --git a/patches/edl/0001-edl-msm8909-32bit-elf-and-multi-cmd-firehose.patch b/patches/edl/0001-edl-msm8909-32bit-elf-and-multi-cmd-firehose.patch new file mode 100644 index 0000000..6dd9e6c --- /dev/null +++ b/patches/edl/0001-edl-msm8909-32bit-elf-and-multi-cmd-firehose.patch @@ -0,0 +1,168 @@ +diff --git a/Library/firehose.py b/Library/firehose.py +index 4e7b8a4..55cf187 100644 +--- a/Library/firehose.py ++++ b/Library/firehose.py +@@ -134,6 +134,17 @@ class qualcomm_firehose: + return False + + ++ def wait_response(self): ++ data = bytearray() ++ while b" old): + if Display: + print_progress(prog, 100, prefix='Progress:', suffix='Complete', bar_length=50) ++ old = prog + bytesToWrite -= wlen + pos+=wlen + #time.sleep(0.05) +@@ -177,7 +189,12 @@ class qualcomm_firehose: + print_progress(100, 100, prefix='Progress:', suffix='Complete', bar_length=50) + self.cdc.write(b'',self.cfg.MaxPayloadSizeToTargetInBytes) + time.sleep(0.2) +- info = self.xml.getlog(self.cdc.read(self.cfg.MaxXMLSizeInBytes)) ++ info, rsp = self.wait_response() ++ if rsp.get("value") == "ACK": ++ return True ++ else: ++ print(f"Error:{info}") ++ return False + else: + print(f"Error:{rsp}") + return False +@@ -210,6 +227,7 @@ class qualcomm_firehose: + if (prog > old): + if Display: + print_progress(prog, 100, prefix='Progress:', suffix='Complete', bar_length=50) ++ old = prog + bytesToWrite -= wlen + pos+=wlen + #time.sleep(0.05) +@@ -217,12 +235,11 @@ class qualcomm_firehose: + print_progress(100, 100, prefix='Progress:', suffix='Complete', bar_length=50) + self.cdc.write(b'',self.cfg.MaxPayloadSizeToTargetInBytes) + time.sleep(0.2) +- info = self.xml.getlog(self.cdc.read(self.cfg.MaxXMLSizeInBytes)) +- rsp=self.xml.getresponse(self.cdc.read(self.cfg.MaxXMLSizeInBytes)) +- if rsp["value"]=="ACK": ++ info, rsp = self.wait_response() ++ if rsp.get("value")=="ACK": + return True + else: +- print(f"Error:{info[1]}") ++ print(f"Error:{info}") + else: + print(f"Error:{rsp}") + return False +@@ -258,12 +275,11 @@ class qualcomm_firehose: + if Display and prog!=100: + print_progress(100, 100, prefix='Progress:', suffix='Complete', bar_length=50) + time.sleep(0.2) +- info = self.xml.getlog(self.cdc.read(self.cfg.MaxXMLSizeInBytes)) +- rsp=self.xml.getresponse(self.cdc.read(self.cfg.MaxXMLSizeInBytes)) +- if rsp["value"]=="ACK": ++ info, rsp = self.wait_response() ++ if rsp.get("value")=="ACK": + return resData + else: +- print(f"Error:{info[1]}") ++ print(f"Error:{info}") + return "" + else: + print(f"Error:{rsp[2]}") +@@ -302,12 +318,11 @@ class qualcomm_firehose: + if Display and prog!=100: + print_progress(100, 100, prefix='Progress:', suffix='Complete', bar_length=50) + time.sleep(0.2) +- info = self.xml.getlog(self.cdc.read(self.cfg.MaxXMLSizeInBytes)) +- rsp = self.xml.getresponse(self.cdc.read(self.cfg.MaxXMLSizeInBytes)) +- if rsp["value"]=="ACK": ++ info, rsp = self.wait_response() ++ if rsp.get("value")=="ACK": + return tmp + else: +- print(f"Error:{tmp}") ++ print(f"Error:{info}") + return "" + else: + print(f"Error:{rsp[1]}") +diff --git a/Library/gpt.py b/Library/gpt.py +index cd972b9..c3ab4f6 100644 +--- a/Library/gpt.py ++++ b/Library/gpt.py +@@ -116,6 +116,7 @@ class gpt: + self.num_part_entries = num_part_entries + self.part_entry_size = part_entry_size + self.part_entry_start_lba = part_entry_start_lba ++ self.gpt_header = list(gpt.gpt_header) + if num_part_entries is None: + self.gpt_header += [('num_part_entries', 'I'),] + if part_entry_size is None: +diff --git a/Library/utils.py b/Library/utils.py +index 06abf2c..9a61b0b 100644 +--- a/Library/utils.py ++++ b/Library/utils.py +@@ -1,7 +1,13 @@ + import sys + import struct +-from capstone import * +-from keystone import * ++try: ++ from capstone import * ++except ImportError: ++ pass ++try: ++ from keystone import * ++except ImportError: ++ pass + import codecs + + class elf: +diff --git a/edl.py b/edl.py +old mode 100644 +new mode 100755 +index 6b9ecbc..f81142d +--- a/edl.py ++++ b/edl.py +@@ -6,6 +6,8 @@ Licensed under MIT License, (c) B. Kerler 2018-2019 + import argparse + import time + import os ++import sys ++sys.path.insert(0, os.path.dirname(os.path.realpath(__file__))) + from Library.utils import * + from Library.usb import usb_class + from Library.gpt import gpt +@@ -80,7 +82,7 @@ def main(): + parser.add_argument('-maxpayload',metavar="",help='[Option] The max bytes to transfer in firehose mode (default=1048576)', type=int, default=1048576) + parser.add_argument('-skipwrite', help='[Option] Do not write actual data to disk (use this for UFS provisioning)', action="store_true") + parser.add_argument('-skipstorageinit', help='[Option] Do not initialize storage device (use this for UFS provisioning)',action="store_true") +- parser.add_argument('-memory', metavar="",help='[Option] Memory type (default=UFS)',default='UFS') ++ parser.add_argument('-memory', metavar="",help='[Option] Memory type (default=eMMC)',default='eMMC') + parser.add_argument('-sectorsize', metavar="",help='[Option] Define Disk Sector Size (default=512)',type=int,default=512) + parser.add_argument('-lun', metavar="",help='[Option] Define LUN',type=int,default=0) + #parser.add_argument('-debug', help='[Option] Enable debug output', action="store_true") +@@ -176,7 +178,10 @@ def main(): + mode="Firehose" + print("Successfully uploaded programmer :)") + else: +- sahara.bit64=True ++ if sahara.programmer and len(sahara.programmer) > 4 and sahara.programmer[:4] == b"\x7fELF": ++ sahara.bit64 = (sahara.programmer[4] == 2) ++ else: ++ sahara.bit64 = True + + if mode=="Firehose": + cfg=qualcomm_firehose.cfg() diff --git a/patches/fcitx5-t9/0001-bananarchy-multimode-t9-and-fcitx5-5.1.19.patch b/patches/fcitx5-t9/0001-bananarchy-multimode-t9-and-fcitx5-5.1.19.patch new file mode 100644 index 0000000..2ecad22 --- /dev/null +++ b/patches/fcitx5-t9/0001-bananarchy-multimode-t9-and-fcitx5-5.1.19.patch @@ -0,0 +1,1127 @@ +diff --git a/src/t9-addon.conf b/src/t9-addon.conf +index 2c571ed..fc4092a 100644 +--- a/src/t9-addon.conf ++++ b/src/t9-addon.conf +@@ -5,4 +5,8 @@ Enabled=True + Library=t9 + Type=SharedLibrary + OnDemand=False ++RegisterInputMethod=True + Configurable=False ++ ++[Addon/Dependencies] ++0=core +diff --git a/src/t9.cpp b/src/t9.cpp +index f4a4b5a..1298345 100644 +--- a/src/t9.cpp ++++ b/src/t9.cpp +@@ -5,11 +5,257 @@ + #include + #include + +-#include ++#include ++#include ++#include ++#include + +-const std::map T9Engine::keypadMap = { +- {1, ".,-!?/@:;1"}, {2, "abc2"}, {3, "def3"}, {4, "ghi4"}, {5, "jkl5"}, +- {6, "mno6"}, {7, "pqrs7"}, {8, "tuv8"}, {9, "wxyz9"}, {10, " 0"}}; ++#include ++ ++namespace { ++ ++struct wl_proxy; ++struct wl_interface; ++ ++using WlProxyGetVersionFn = uint32_t (*)(struct wl_proxy*); ++using WlProxyMarshalFlagsFn = struct wl_proxy* (*)( ++ struct wl_proxy*, uint32_t, const struct wl_interface*, uint32_t, uint32_t, ++ ...); ++ ++void sendWaylandVkModifiers(fcitx::InputContext* ic, uint32_t modsDepressed) { ++ if (!ic || ic->frontendName() != std::string_view("wayland_v2")) { ++ return; ++ } ++ static void* wlHandle = dlopen("libwayland-client.so.0", RTLD_LAZY); ++ static auto getVer = ++ wlHandle ? reinterpret_cast( ++ dlsym(wlHandle, "wl_proxy_get_version")) ++ : nullptr; ++ static auto marshalFlags = ++ wlHandle ? reinterpret_cast( ++ dlsym(wlHandle, "wl_proxy_marshal_flags")) ++ : nullptr; ++ if (!getVer || !marshalFlags) { ++ return; ++ } ++ auto* raw = reinterpret_cast(ic); ++ std::string_view typeName(typeid(*ic).name()); ++ if (typeName.find("VirtualInputContext") != std::string_view::npos) { ++ raw = *reinterpret_cast(raw + 3 * sizeof(void*)); ++ if (!raw) { ++ return; ++ } ++ } ++ if (!raw[54]) { ++ return; ++ } ++ void* vkObj = *reinterpret_cast(raw + 40); ++ if (!vkObj) { ++ return; ++ } ++ auto* proxy = *reinterpret_cast( ++ reinterpret_cast(vkObj) + 2 * sizeof(void*)); ++ if (!proxy) { ++ return; ++ } ++ constexpr uint32_t kZwpVirtualKeyboardV1ModifiersOpcode = 2; ++ uint32_t ver = getVer(proxy); ++ marshalFlags(proxy, kZwpVirtualKeyboardV1ModifiersOpcode, nullptr, ver, 0, ++ modsDepressed, 0u, 0u, 0u); ++} ++ ++constexpr int kKey1 = 1; ++constexpr int kKey2 = 2; ++constexpr int kKey3 = 3; ++constexpr int kKey4 = 4; ++constexpr int kKey5 = 5; ++constexpr int kKey6 = 6; ++constexpr int kKey7 = 7; ++constexpr int kKey8 = 8; ++constexpr int kKey9 = 9; ++constexpr int kKey0 = 10; ++constexpr int kKeyStar = 11; ++constexpr int kKeyPound = 12; ++ ++T9Item makeChar(char c) { ++ std::string s(1, c); ++ std::string lbl = (c == ' ') ? "SPC" : s; ++ return T9Item{lbl, s, FcitxKey_None, fcitx::KeyState::NoState, 0}; ++} ++ ++std::vector makeCharItems(const std::string& chars) { ++ std::vector out; ++ out.reserve(chars.size()); ++ for (char c : chars) { ++ out.push_back(makeChar(c)); ++ } ++ return out; ++} ++ ++T9Item makeKey(const std::string& label, fcitx::KeySym sym, uint32_t xkbCode, ++ fcitx::KeyStates states = fcitx::KeyState::NoState) { ++ return T9Item{label, "", sym, states, xkbCode}; ++} ++ ++T9Item makeCtrlKey(const std::string& label, fcitx::KeySym sym, ++ uint32_t xkbCode) { ++ return T9Item{label, "", sym, fcitx::KeyState::Ctrl, xkbCode}; ++} ++ ++bool charToCtrlKey(char ch, fcitx::KeySym* symOut, uint32_t* xkbCodeOut) { ++ char lower = static_cast(std::tolower(static_cast(ch))); ++ switch (lower) { ++ case 'a': ++ *symOut = FcitxKey_a; ++ *xkbCodeOut = 38; ++ return true; ++ case 'b': ++ *symOut = FcitxKey_b; ++ *xkbCodeOut = 56; ++ return true; ++ case 'c': ++ *symOut = FcitxKey_c; ++ *xkbCodeOut = 54; ++ return true; ++ case 'd': ++ *symOut = FcitxKey_d; ++ *xkbCodeOut = 40; ++ return true; ++ case 'e': ++ *symOut = FcitxKey_e; ++ *xkbCodeOut = 26; ++ return true; ++ case 'f': ++ *symOut = FcitxKey_f; ++ *xkbCodeOut = 41; ++ return true; ++ case 'g': ++ *symOut = FcitxKey_g; ++ *xkbCodeOut = 42; ++ return true; ++ case 'h': ++ *symOut = FcitxKey_h; ++ *xkbCodeOut = 43; ++ return true; ++ case 'i': ++ *symOut = FcitxKey_i; ++ *xkbCodeOut = 31; ++ return true; ++ case 'j': ++ *symOut = FcitxKey_j; ++ *xkbCodeOut = 44; ++ return true; ++ case 'k': ++ *symOut = FcitxKey_k; ++ *xkbCodeOut = 45; ++ return true; ++ case 'l': ++ *symOut = FcitxKey_l; ++ *xkbCodeOut = 46; ++ return true; ++ case 'm': ++ *symOut = FcitxKey_m; ++ *xkbCodeOut = 58; ++ return true; ++ case 'n': ++ *symOut = FcitxKey_n; ++ *xkbCodeOut = 57; ++ return true; ++ case 'o': ++ *symOut = FcitxKey_o; ++ *xkbCodeOut = 32; ++ return true; ++ case 'p': ++ *symOut = FcitxKey_p; ++ *xkbCodeOut = 33; ++ return true; ++ case 'q': ++ *symOut = FcitxKey_q; ++ *xkbCodeOut = 24; ++ return true; ++ case 'r': ++ *symOut = FcitxKey_r; ++ *xkbCodeOut = 27; ++ return true; ++ case 's': ++ *symOut = FcitxKey_s; ++ *xkbCodeOut = 39; ++ return true; ++ case 't': ++ *symOut = FcitxKey_t; ++ *xkbCodeOut = 28; ++ return true; ++ case 'u': ++ *symOut = FcitxKey_u; ++ *xkbCodeOut = 30; ++ return true; ++ case 'v': ++ *symOut = FcitxKey_v; ++ *xkbCodeOut = 55; ++ return true; ++ case 'w': ++ *symOut = FcitxKey_w; ++ *xkbCodeOut = 25; ++ return true; ++ case 'x': ++ *symOut = FcitxKey_x; ++ *xkbCodeOut = 53; ++ return true; ++ case 'y': ++ *symOut = FcitxKey_y; ++ *xkbCodeOut = 29; ++ return true; ++ case 'z': ++ *symOut = FcitxKey_z; ++ *xkbCodeOut = 52; ++ return true; ++ case '[': ++ *symOut = FcitxKey_bracketleft; ++ *xkbCodeOut = 34; ++ return true; ++ case '\\': ++ *symOut = FcitxKey_backslash; ++ *xkbCodeOut = 51; ++ return true; ++ case ']': ++ *symOut = FcitxKey_bracketright; ++ *xkbCodeOut = 35; ++ return true; ++ case '^': ++ case '6': ++ *symOut = FcitxKey_6; ++ *xkbCodeOut = 15; ++ return true; ++ case '_': ++ case '-': ++ *symOut = FcitxKey_minus; ++ *xkbCodeOut = 20; ++ return true; ++ default: ++ return false; ++ } ++} ++ ++int mapHardwareKey(const fcitx::Key& key) { ++ uint32_t code = key.code(); ++ // XKB keycodes: KEY_1..KEY_9 = 10..18, KEY_0 = 19 ++ if (code >= 10 && code <= 19) { ++ return static_cast(code - 9); ++ } ++ // KEY_NUMERIC_STAR (evdev 522 -> XKB 530) ++ if (code == 530 || key.sym() == FcitxKey_asterisk || ++ static_cast(key.sym()) == 0x1008ffaa) { ++ return kKeyStar; ++ } ++ // KEY_NUMERIC_POUND (evdev 523 -> XKB 531) ++ if (code == 531 || key.sym() == FcitxKey_numbersign || ++ static_cast(key.sym()) == 0x1008ffab) { ++ return kKeyPound; ++ } ++ return -1; ++} ++ ++} // namespace + + T9Engine::T9Engine(fcitx::Instance* instance) + : instance(instance), factory([this](fcitx::InputContext& ic) { +@@ -18,146 +264,652 @@ T9Engine::T9Engine(fcitx::Instance* instance) + instance->inputContextManager().registerProperty("t9State", &factory); + } + ++std::vector T9Engine::listInputMethods() { ++ std::vector result; ++ result.emplace_back("t9", "T9", "en", "t9") ++ .setLabel("T9") ++ .setIcon("input-keyboard") ++ .setConfigurable(false); ++ return result; ++} ++ + void T9Engine::keyEvent(const fcitx::InputMethodEntry& entry, + fcitx::KeyEvent& keyEvent) { + FCITX_UNUSED(entry); +- FCITX_INFO() << keyEvent.key().code() ++ FCITX_INFO() << "T9 keyEvent code=" << keyEvent.key().code() ++ << " sym=" << keyEvent.key().sym() + << " isRelease=" << keyEvent.isRelease(); +- int EVDEV_OFFSET = 9; +- +- fcitx::Key key = keyEvent.key(); +- std::string output; +- int keyCode = key.code() - EVDEV_OFFSET; +- auto match = keypadMap.find(keyCode); + auto* ic = keyEvent.inputContext(); + auto* state = ic->propertyFor(&factory); +- if (match == keypadMap.end()) { +- // This is for other keys, just forward (on press, and ignore the release) +- FCITX_INFO() << "not a number" << output; +- state->cancelCommit(); +- return; +- } else { +- state->keyEvent(keyEvent, match->second, keyCode); ++ if (state->handleKeyEvent(keyEvent)) { ++ keyEvent.filterAndAccept(); + } +- keyEvent.filterAndAccept(); ++} ++ ++void T9Engine::reset(const fcitx::InputMethodEntry& entry, ++ fcitx::InputContextEvent& event) { ++ FCITX_UNUSED(entry); ++ auto* ic = event.inputContext(); ++ auto* state = ic->propertyFor(&factory); ++ state->reset(); + } + + FCITX_ADDON_FACTORY(T9EngineFactory); + +-void T9State::handleT9(const std::string& chars, int keyCode) { +- FCITX_INFO() << "handleT9: keyCode=" << keyCode +- << " lastKeyCode=" << lastKeyCode +- << " currentIndex=" << currentIndex +- << " chars.length()=" << chars.length(); +- if (lastKeyCode != -1 && keyCode != lastKeyCode) { +- cancelCommit(); +- commit(); ++std::string T9State::modePrefix() const { ++ std::string p; ++ switch (mode) { ++ case T9Mode::Lower: ++ p = "abc"; ++ break; ++ case T9Mode::Shift: ++ p = "Abc"; ++ break; ++ case T9Mode::Upper: ++ p = "ABC"; ++ break; ++ case T9Mode::Sym: ++ p = "Sym"; ++ break; ++ case T9Mode::Ctrl: ++ p = "Ctl"; ++ break; ++ case T9Mode::Num: ++ p = "123"; ++ break; + } +- if (keyCode == lastKeyCode) { +- if (++currentIndex >= chars.length()) { +- currentIndex = 0; ++ if (ctrlLatch) { ++ p += "+^"; ++ } ++ return p; ++} ++ ++std::vector T9State::getItemsForKey(int keyId) const { ++ if (mode == T9Mode::Sym) { ++ switch (keyId) { ++ case kKey1: ++ return makeCharItems(".,!?:;-_1"); ++ case kKey2: ++ return makeCharItems("@#$%^&2"); ++ case kKey3: ++ return makeCharItems("()[]{}<>3"); ++ case kKey4: ++ return makeCharItems("+-*/=_4"); ++ case kKey5: ++ return makeCharItems("|\\~`'\"5"); ++ case kKey6: ++ return makeCharItems("'\"`~^6"); ++ case kKey7: ++ return makeCharItems("/\\|_-+7"); ++ case kKey8: ++ return makeCharItems("<>!=?&8"); ++ case kKey9: ++ return makeCharItems("$%^&*#@9"); ++ case kKey0: { ++ auto v = makeCharItems(" 0"); ++ v.push_back(makeKey("Tab", FcitxKey_Tab, 23)); ++ v.push_back(makeKey("Ent", FcitxKey_Return, 36)); ++ v.push_back(makeKey("Esc", FcitxKey_Escape, 9)); ++ return v; ++ } ++ case kKeyStar: ++ return makeCharItems("*#+-=_/\\|~`@$%^&()[]{}<>'\".,!?:;"); ++ default: ++ return {}; + } + } +- cancelCommit(); +- std::string output; +- output += chars[currentIndex]; +- currentChar = output; +- scheduleCommit(); +- lastKeyCode = keyCode; +- showPreview(chars, currentIndex); ++ ++ if (mode == T9Mode::Ctrl) { ++ switch (keyId) { ++ case kKey1: ++ return { ++ makeKey("Esc", FcitxKey_Escape, 9), ++ makeKey("Tab", FcitxKey_Tab, 23), ++ makeKey("Del", FcitxKey_Delete, 119), ++ makeKey("Ins", FcitxKey_Insert, 118), ++ makeKey("Bksp", FcitxKey_BackSpace, 22), ++ }; ++ case kKey2: ++ return { ++ makeCtrlKey("^C", FcitxKey_c, 54), ++ makeCtrlKey("^D", FcitxKey_d, 40), ++ makeCtrlKey("^Z", FcitxKey_z, 52), ++ makeCtrlKey("^X", FcitxKey_x, 53), ++ makeCtrlKey("^\\", FcitxKey_backslash, 51), ++ }; ++ case kKey3: ++ return { ++ makeCtrlKey("^A", FcitxKey_a, 38), ++ makeCtrlKey("^E", FcitxKey_e, 26), ++ makeCtrlKey("^U", FcitxKey_u, 30), ++ makeCtrlKey("^K", FcitxKey_k, 45), ++ makeCtrlKey("^W", FcitxKey_w, 25), ++ }; ++ case kKey4: ++ return { ++ makeCtrlKey("^R", FcitxKey_r, 27), ++ makeCtrlKey("^L", FcitxKey_l, 46), ++ makeCtrlKey("^P", FcitxKey_p, 33), ++ makeCtrlKey("^N", FcitxKey_n, 57), ++ makeCtrlKey("^G", FcitxKey_g, 42), ++ }; ++ case kKey5: ++ return { ++ makeCtrlKey("^S", FcitxKey_s, 39), ++ makeCtrlKey("^Q", FcitxKey_q, 24), ++ makeCtrlKey("^O", FcitxKey_o, 32), ++ makeCtrlKey("^T", FcitxKey_t, 28), ++ makeCtrlKey("^Y", FcitxKey_y, 29), ++ }; ++ case kKey6: ++ return { ++ makeCtrlKey("^B", FcitxKey_b, 56), ++ makeCtrlKey("^F", FcitxKey_f, 41), ++ makeCtrlKey("^V", FcitxKey_v, 55), ++ makeCtrlKey("^H", FcitxKey_h, 43), ++ makeCtrlKey("^[", FcitxKey_bracketleft, 34), ++ makeCtrlKey("^]", FcitxKey_bracketright, 35), ++ makeCtrlKey("^^", FcitxKey_6, 15), ++ makeCtrlKey("^_", FcitxKey_minus, 20), ++ }; ++ case kKey7: ++ return { ++ makeKey("PgUp", FcitxKey_Page_Up, 112), ++ makeKey("PgDn", FcitxKey_Page_Down, 117), ++ makeKey("Home", FcitxKey_Home, 110), ++ makeKey("End", FcitxKey_End, 115), ++ }; ++ case kKey8: ++ return { ++ makeKey("Up", FcitxKey_Up, 111), ++ makeKey("Down", FcitxKey_Down, 116), ++ makeKey("Left", FcitxKey_Left, 113), ++ makeKey("Right", FcitxKey_Right, 114), ++ }; ++ case kKey9: ++ return { ++ makeKey("F1", FcitxKey_F1, 67), makeKey("F2", FcitxKey_F2, 68), ++ makeKey("F3", FcitxKey_F3, 69), makeKey("F4", FcitxKey_F4, 70), ++ makeKey("F5", FcitxKey_F5, 71), makeKey("F6", FcitxKey_F6, 72), ++ makeKey("F7", FcitxKey_F7, 73), makeKey("F8", FcitxKey_F8, 74), ++ makeKey("F9", FcitxKey_F9, 75), makeKey("F10", FcitxKey_F10, 76), ++ makeKey("F11", FcitxKey_F11, 95), makeKey("F12", FcitxKey_F12, 96), ++ }; ++ case kKey0: ++ return { ++ makeChar(' '), ++ makeKey("Tab", FcitxKey_Tab, 23), ++ makeKey("Ent", FcitxKey_Return, 36), ++ makeKey("Esc", FcitxKey_Escape, 9), ++ }; ++ case kKeyStar: ++ return { ++ makeKey("Esc", FcitxKey_Escape, 9), ++ makeKey("Tab", FcitxKey_Tab, 23), ++ makeCtrlKey("^C", FcitxKey_c, 54), ++ makeCtrlKey("^D", FcitxKey_d, 40), ++ makeCtrlKey("^Z", FcitxKey_z, 52), ++ makeCtrlKey("^X", FcitxKey_x, 53), ++ makeCtrlKey("^L", FcitxKey_l, 46), ++ makeCtrlKey("^R", FcitxKey_r, 27), ++ makeCtrlKey("^W", FcitxKey_w, 25), ++ }; ++ default: ++ return {}; ++ } ++ } ++ ++ bool upperFirst = (mode == T9Mode::Shift || mode == T9Mode::Upper); ++ switch (keyId) { ++ case kKey1: ++ return makeCharItems(".,-_!?/@:;'\"+=*#$%^&()[]{}<>|\\~`1"); ++ case kKey2: ++ return makeCharItems(upperFirst ? "ABC2abc" : "abc2ABC"); ++ case kKey3: ++ return makeCharItems(upperFirst ? "DEF3def" : "def3DEF"); ++ case kKey4: ++ return makeCharItems(upperFirst ? "GHI4ghi" : "ghi4GHI"); ++ case kKey5: ++ return makeCharItems(upperFirst ? "JKL5jkl" : "jkl5JKL"); ++ case kKey6: ++ return makeCharItems(upperFirst ? "MNO6mno" : "mno6MNO"); ++ case kKey7: ++ return makeCharItems(upperFirst ? "PQRS7pqrs" : "pqrs7PQRS"); ++ case kKey8: ++ return makeCharItems(upperFirst ? "TUV8tuv" : "tuv8TUV"); ++ case kKey9: ++ return makeCharItems(upperFirst ? "WXYZ9wxyz" : "wxyz9WXYZ"); ++ case kKey0: { ++ auto v = makeCharItems(" 0"); ++ v.push_back(makeKey("Ent", FcitxKey_Return, 36)); ++ v.push_back(makeKey("Tab", FcitxKey_Tab, 23)); ++ return v; ++ } ++ case kKeyStar: { ++ auto v = makeCharItems("*#+-=_/\\|~`@$%^&()[]{}<>'\".,!?:;"); ++ v.push_back(makeKey("Tab", FcitxKey_Tab, 23)); ++ v.push_back(makeKey("Esc", FcitxKey_Escape, 9)); ++ v.push_back(makeCtrlKey("^C", FcitxKey_c, 54)); ++ v.push_back(makeCtrlKey("^D", FcitxKey_d, 40)); ++ v.push_back(makeCtrlKey("^Z", FcitxKey_z, 52)); ++ return v; ++ } ++ default: ++ return {}; ++ } + } + +-void T9State::keyEvent(fcitx::KeyEvent& keyEvent, const std::string& chars, +- int keyCode) { +- // This is for keypad +- FCITX_INFO() << "key pad press"; +- if (keyEvent.isRelease()) { +- isPressing = false; +- if (isLongPress == true) { +- // Release after a long press, ignore as we already processed +- // the action. +- isLongPress = false; +- return; ++void T9State::cycleMode() { ++ switch (mode) { ++ case T9Mode::Lower: ++ mode = T9Mode::Shift; ++ break; ++ case T9Mode::Shift: ++ mode = T9Mode::Upper; ++ break; ++ case T9Mode::Upper: ++ mode = T9Mode::Sym; ++ break; ++ case T9Mode::Sym: ++ mode = T9Mode::Ctrl; ++ break; ++ case T9Mode::Ctrl: ++ mode = T9Mode::Num; ++ break; ++ case T9Mode::Num: ++ mode = T9Mode::Lower; ++ break; ++ } ++ showStatusBanner("[Mode: " + modePrefix() + "]"); ++} ++ ++void T9State::toggleCurrentCase() { ++ if (activeItems.empty() || currentIndex < 0 || ++ static_cast(currentIndex) >= activeItems.size()) { ++ return; ++ } ++ const std::string& cur = activeItems[currentIndex].commitText; ++ if (cur.size() == 1 && std::isalpha(static_cast(cur[0]))) { ++ char target = std::isupper(static_cast(cur[0])) ++ ? static_cast( ++ std::tolower(static_cast(cur[0]))) ++ : static_cast( ++ std::toupper(static_cast(cur[0]))); ++ for (size_t i = 0; i < activeItems.size(); ++i) { ++ if (activeItems[i].commitText.size() == 1 && ++ activeItems[i].commitText[0] == target) { ++ currentIndex = static_cast(i); ++ break; ++ } + } +- handleT9(chars, keyCode); ++ scheduleCommit(); ++ showPreview(activeItems, currentIndex); + } else { +- if (isLongPress) { +- // Action already process +- return; ++ stepCandidate(4); ++ } ++} ++ ++void T9State::stepCandidate(int delta) { ++ if (activeItems.empty()) { ++ return; ++ } ++ int n = static_cast(activeItems.size()); ++ currentIndex = ((currentIndex + delta) % n + n) % n; ++ scheduleCommit(); ++ showPreview(activeItems, currentIndex); ++} ++ ++bool T9State::handleKeyEvent(fcitx::KeyEvent& keyEvent) { ++ fcitx::Key key = keyEvent.key(); ++ uint32_t code = key.code(); ++ fcitx::KeySym sym = key.sym(); ++ ++ // Handle preedit navigation when an uncommitted character is active ++ if (!activeItems.empty()) { ++ if (sym == FcitxKey_BackSpace || code == 22) { ++ if (!keyEvent.isRelease()) { ++ cancelCommit(); ++ lastKeyId = -1; ++ currentIndex = 0; ++ activeItems.clear(); ++ } ++ return true; + } +- auto now = std::chrono::steady_clock::now(); +- if (!isPressing) { +- keyPressTime = now; +- isPressing = true; +- } else { +- auto duration = std::chrono::duration_cast( +- now - keyPressTime) +- .count(); +- if (duration >= 500) { +- isLongPress = true; +- std::string output; +- output += chars.back(); +- currentChar = output; ++ if (sym == FcitxKey_Left || code == 113) { ++ if (!keyEvent.isRelease()) { ++ stepCandidate(-1); ++ } ++ return true; ++ } ++ if (sym == FcitxKey_Right || code == 114 || sym == FcitxKey_Return || ++ code == 36) { ++ if (!keyEvent.isRelease()) { + commit(); + } ++ return true; ++ } ++ if (sym == FcitxKey_Up || code == 111) { ++ if (!keyEvent.isRelease()) { ++ toggleCurrentCase(); ++ } ++ return true; ++ } ++ if (sym == FcitxKey_Down || code == 116) { ++ if (!keyEvent.isRelease()) { ++ if (activeItems[currentIndex].commitText.size() == 1 && ++ std::isalpha(static_cast( ++ activeItems[currentIndex].commitText[0]))) { ++ toggleCurrentCase(); ++ } else { ++ stepCandidate(-4); ++ } ++ } ++ return true; ++ } ++ } ++ ++ if (mode == T9Mode::Ctrl) { ++ if (sym == FcitxKey_Up || code == 111) { ++ if (!keyEvent.isRelease()) { ++ forwardKeyTap(FcitxKey_Page_Up, fcitx::KeyState::NoState, 112); ++ } ++ return true; ++ } ++ if (sym == FcitxKey_Down || code == 116) { ++ if (!keyEvent.isRelease()) { ++ forwardKeyTap(FcitxKey_Page_Down, fcitx::KeyState::NoState, 117); ++ } ++ return true; ++ } ++ if (sym == FcitxKey_Left || code == 113) { ++ if (!keyEvent.isRelease()) { ++ forwardKeyTap(FcitxKey_Home, fcitx::KeyState::NoState, 110); ++ } ++ return true; ++ } ++ if (sym == FcitxKey_Right || code == 114) { ++ if (!keyEvent.isRelease()) { ++ forwardKeyTap(FcitxKey_End, fcitx::KeyState::NoState, 115); ++ } ++ return true; ++ } ++ } ++ ++ int keyId = mapHardwareKey(key); ++ if (keyId < 0) { ++ if (!keyEvent.isRelease()) { ++ commit(); ++ } ++ return false; ++ } ++ ++ if (keyEvent.isRelease()) { ++ cancelLongPressTimer(); ++ int releasedId = pressedKeyId; ++ pressedKeyId = -1; ++ if (isLongPressHandled) { ++ isLongPressHandled = false; ++ return true; ++ } ++ if (releasedId != keyId && releasedId != -1) { ++ return true; ++ } ++ if (keyId == kKeyPound) { ++ if (!activeItems.empty()) { ++ toggleCurrentCase(); ++ } else { ++ cycleMode(); ++ } ++ return true; ++ } ++ if (mode == T9Mode::Num) { ++ if (bannerTimer) { ++ bannerTimer.reset(); ++ resetUI(); ++ } ++ if (keyId >= kKey1 && keyId <= kKey9) { ++ sendItem(makeChar(static_cast('0' + keyId))); ++ } else if (keyId == kKey0) { ++ sendItem(makeChar('0')); ++ } else if (keyId == kKeyStar) { ++ sendItem(makeChar('*')); ++ } ++ return true; ++ } ++ handleMultiTap(keyId); ++ return true; ++ } ++ ++ // Key press event ++ if (pressedKeyId != keyId) { ++ pressedKeyId = keyId; ++ isLongPressHandled = false; ++ startLongPressTimer(keyId); ++ } ++ return true; ++} ++ ++void T9State::startLongPressTimer(int keyId) { ++ cancelLongPressTimer(); ++ longPressTimer = engine->instance->eventLoop().addTimeEvent( ++ CLOCK_MONOTONIC, fcitx::now(CLOCK_MONOTONIC) + 450000, 0, ++ [this, keyId](fcitx::EventSourceTime*, uint64_t) { ++ onLongPress(keyId); ++ return true; ++ }); ++} ++ ++void T9State::cancelLongPressTimer() { ++ if (longPressTimer) { ++ longPressTimer.reset(); ++ } ++} ++ ++void T9State::onLongPress(int keyId) { ++ isLongPressHandled = true; ++ if (!activeItems.empty()) { ++ commit(); ++ } ++ if (keyId >= kKey1 && keyId <= kKey9) { ++ sendItem(makeChar(static_cast('0' + keyId))); ++ resetUI(); ++ } else if (keyId == kKey0) { ++ sendItem(makeChar('0')); ++ resetUI(); ++ } else if (keyId == kKeyStar) { ++ if (mode == T9Mode::Num) { ++ sendItem(makeChar('.')); ++ resetUI(); ++ } else { ++ ctrlLatch = !ctrlLatch; ++ showStatusBanner(ctrlLatch ? "[Ctrl+ LATCH ON]" : "[Ctrl+ LATCH OFF]"); + } ++ } else if (keyId == kKeyPound) { ++ sendItem(makeChar('#')); ++ resetUI(); ++ } ++} ++ ++void T9State::handleMultiTap(int keyId) { ++ if (bannerTimer) { ++ bannerTimer.reset(); ++ } ++ if (lastKeyId != -1 && keyId != lastKeyId) { ++ commit(); ++ } ++ if (keyId == lastKeyId && !activeItems.empty()) { ++ currentIndex = (currentIndex + 1) % static_cast(activeItems.size()); ++ } else { ++ activeItems = getItemsForKey(keyId); ++ currentIndex = 0; ++ lastKeyId = keyId; + } ++ if (activeItems.empty()) { ++ return; ++ } ++ uint64_t delayUs = (activeItems.size() > 10) ? 750000 : 600000; ++ scheduleCommit(delayUs); ++ showPreview(activeItems, currentIndex); + } ++ + void T9State::reset() { ++ cancelLongPressTimer(); + cancelCommit(); +- lastKeyCode = -1; ++ if (bannerTimer) { ++ bannerTimer.reset(); ++ } ++ lastKeyId = -1; ++ pressedKeyId = -1; + currentIndex = 0; +- currentChar.clear(); +- isLongPress = false; +- isPressing = false; ++ activeItems.clear(); ++ isLongPressHandled = false; ++ ctrlLatch = false; + } ++ ++void T9State::forwardKeyTap(fcitx::KeySym sym, fcitx::KeyStates states, ++ uint32_t xkbCode) { ++ if (states.test(fcitx::KeyState::Ctrl)) { ++ constexpr uint32_t kXkbModCtrl = (1u << 2); ++ sendWaylandVkModifiers(ic, kXkbModCtrl); ++ ic->forwardKey(fcitx::Key(sym, fcitx::KeyState::Ctrl, xkbCode), false); ++ sendWaylandVkModifiers(ic, 0u); ++ } else { ++ ic->forwardKey(fcitx::Key(sym, states, xkbCode), false); ++ } ++} ++ ++void T9State::sendItem(const T9Item& item) { ++ if (ctrlLatch && !item.commitText.empty()) { ++ fcitx::KeySym cSym = FcitxKey_None; ++ uint32_t cCode = 0; ++ ctrlLatch = false; ++ if (charToCtrlKey(item.commitText[0], &cSym, &cCode)) { ++ forwardKeyTap(cSym, fcitx::KeyState::Ctrl, cCode); ++ return; ++ } ++ } ++ ctrlLatch = false; ++ if (item.sym != FcitxKey_None) { ++ forwardKeyTap(item.sym, item.states, item.xkbCode); ++ } else if (!item.commitText.empty()) { ++ ic->commitString(item.commitText); ++ if (mode == T9Mode::Shift && ++ std::isalpha(static_cast(item.commitText[0]))) { ++ mode = T9Mode::Lower; ++ } ++ } ++} ++ + void T9State::commit() { +- if (!currentChar.empty()) { +- FCITX_INFO() << "commitString with char=" << currentChar; +- ic->commitString(currentChar); ++ if (commitTimer) { ++ commitTimer.reset(); ++ } ++ if (!activeItems.empty() && currentIndex >= 0 && ++ static_cast(currentIndex) < activeItems.size()) { ++ T9Item chosen = activeItems[currentIndex]; ++ activeItems.clear(); ++ lastKeyId = -1; ++ currentIndex = 0; ++ resetUI(); ++ sendItem(chosen); ++ } else { ++ activeItems.clear(); ++ lastKeyId = -1; ++ currentIndex = 0; + resetUI(); + } +- currentChar.clear(); +- lastKeyCode = -1; +- currentIndex = 0; + } +-void T9State::scheduleCommit() { +- FCITX_INFO() << "call of scheduleCommit with char=" << currentChar; ++ ++void T9State::scheduleCommit(uint64_t delayUs) { ++ if (commitTimer) { ++ commitTimer.reset(); ++ } + commitTimer = engine->instance->eventLoop().addTimeEvent( +- CLOCK_MONOTONIC, fcitx::now(CLOCK_MONOTONIC) + 500000, 0, ++ CLOCK_MONOTONIC, fcitx::now(CLOCK_MONOTONIC) + delayUs, 0, + [this](fcitx::EventSourceTime*, uint64_t) { + commit(); + return true; + }); + } ++ + void T9State::cancelCommit() { +- FCITX_INFO() << "cancelCommit"; + if (commitTimer) { +- FCITX_INFO() << "reset timer"; + commitTimer.reset(); + } + resetUI(); + } ++ + void T9State::resetUI() { + ic->inputPanel().reset(); + ic->updatePreedit(); ++ ic->updateUserInterface(fcitx::UserInterfaceComponent::InputPanel); + } +-void T9State::showPreview(const std::string& chars, int index) { +- std::string preedit; ++ ++void T9State::showStatusBanner(const std::string& msg) { ++ if (bannerTimer) { ++ bannerTimer.reset(); ++ } + auto& inputPanel = ic->inputPanel(); +- for (size_t i = 0; i < chars.length(); ++i) { ++ inputPanel.reset(); ++ fcitx::Text text; ++ text.append(msg); ++ if (ic->capabilityFlags().test(fcitx::CapabilityFlag::Preedit)) { ++ inputPanel.setClientPreedit(text); ++ ic->updatePreedit(); ++ } else { ++ inputPanel.setPreedit(text); ++ } ++ ic->updateUserInterface(fcitx::UserInterfaceComponent::InputPanel); ++ bannerTimer = engine->instance->eventLoop().addTimeEvent( ++ CLOCK_MONOTONIC, fcitx::now(CLOCK_MONOTONIC) + 900000, 0, ++ [this](fcitx::EventSourceTime*, uint64_t) { ++ resetUI(); ++ return true; ++ }); ++} ++ ++void T9State::showPreview(const std::vector& items, int index) { ++ int total = static_cast(items.size()); ++ if (total == 0) { ++ return; ++ } ++ constexpr int kMaxVisible = 7; ++ int start = 0; ++ int end = total; ++ if (total > kMaxVisible) { ++ start = index - (kMaxVisible / 2); ++ if (start < 0) { ++ start = 0; ++ } ++ end = start + kMaxVisible; ++ if (end > total) { ++ end = total; ++ start = end - kMaxVisible; ++ } ++ } ++ ++ std::string preedit = modePrefix() + ": "; ++ if (start > 0) { ++ preedit += "< "; ++ } ++ for (int i = start; i < end; ++i) { + if (i == index) { + preedit += "["; +- preedit += chars[i]; ++ preedit += items[i].label; + preedit += "]"; + } else { +- preedit += chars[i]; ++ preedit += items[i].label; + } +- if (i < chars.length() - 1) { ++ if (i < end - 1) { + preedit += " "; + } + } ++ if (end < total) { ++ preedit += " >"; ++ } + ++ auto& inputPanel = ic->inputPanel(); ++ inputPanel.reset(); + fcitx::Text text; + text.append(preedit); + if (ic->capabilityFlags().test(fcitx::CapabilityFlag::Preedit)) { +diff --git a/src/t9.h b/src/t9.h +index 09f8581..b88cf85 100644 +--- a/src/t9.h ++++ b/src/t9.h +@@ -2,55 +2,92 @@ + #define _FCITX5_T9_T9_H_ + + #include ++#include ++#include + #include + #include + #include + #include + #include + +-#include ++#include ++#include + #include ++#include ++#include + + class T9Engine; + ++enum class T9Mode { ++ Lower = 0, // abc: lowercase first, then digit, then uppercase ++ Shift = 1, // Abc: uppercase for next character, then auto-reverts to Lower ++ Upper = 2, // ABC: uppercase first, then digit, then lowercase ++ Sym = 3, // Sym: full ASCII punctuation & symbols grouped across 1-9, 0, * ++ Ctrl = 4, // Ctl: terminal control chars (^A-^Z) & navigation/function keys ++ Num = 5 // 123: instant single-tap numeric entry ++}; ++ ++struct T9Item { ++ std::string label; ++ std::string commitText; ++ fcitx::KeySym sym = FcitxKey_None; ++ fcitx::KeyStates states = fcitx::KeyState::NoState; ++ uint32_t xkbCode = 0; ++}; ++ + class T9State : public fcitx::InputContextProperty { + public: + T9State(T9Engine* engine, fcitx::InputContext* ic) : engine(engine), ic(ic) {} + +- void keyEvent(fcitx::KeyEvent& keyEvent, const std::string& chars, +- int keyCode); +- void updateUI(); ++ bool handleKeyEvent(fcitx::KeyEvent& keyEvent); + void cancelCommit(); + void reset(); + + private: +- void scheduleCommit(); ++ std::vector getItemsForKey(int keyId) const; ++ std::string modePrefix() const; ++ void cycleMode(); ++ void toggleCurrentCase(); ++ void stepCandidate(int delta); ++ void startLongPressTimer(int keyId); ++ void cancelLongPressTimer(); ++ void onLongPress(int keyId); ++ void scheduleCommit(uint64_t delayUs = 600000); + void commit(); ++ void sendItem(const T9Item& item); ++ void forwardKeyTap(fcitx::KeySym sym, fcitx::KeyStates states, ++ uint32_t xkbCode); + void resetUI(); +- void showPreview(const std::string& chars, int index); +- void handleT9(const std::string& chars, int keyCode); ++ void showPreview(const std::vector& items, int index); ++ void showStatusBanner(const std::string& msg); ++ void handleMultiTap(int keyId); ++ + T9Engine* engine; + fcitx::InputContext* ic; +- int lastKeyCode = -1; ++ T9Mode mode = T9Mode::Lower; ++ bool ctrlLatch = false; ++ int lastKeyId = -1; ++ int pressedKeyId = -1; + int currentIndex = 0; +- std::string currentChar; +- std::unique_ptr commitTimer; +- fcitx::InputContext* currentIC = nullptr; +- std::chrono::steady_clock::time_point keyPressTime; +- bool isLongPress = false; +- bool isPressing = false; ++ std::vector activeItems; ++ std::unique_ptr commitTimer; ++ std::unique_ptr longPressTimer; ++ std::unique_ptr bannerTimer; ++ bool isLongPressHandled = false; + }; + + class T9Engine : public fcitx::InputMethodEngineV2 { + public: +- T9Engine(fcitx::Instance* instance); ++ explicit T9Engine(fcitx::Instance* instance); ++ std::vector listInputMethods() override; + void keyEvent(const fcitx::InputMethodEntry& entry, + fcitx::KeyEvent& keyEvent) override; ++ void reset(const fcitx::InputMethodEntry& entry, ++ fcitx::InputContextEvent& event) override; + fcitx::Instance* instance; + + private: + fcitx::FactoryFor factory; +- static const std::map keypadMap; + }; + + class T9EngineFactory : public fcitx::AddonFactory { diff --git a/patches/kernel/0001-msm8909-qdsp6-voice-sound-nokia-argon-6.12.patch b/patches/kernel/0001-msm8909-qdsp6-voice-sound-nokia-argon-6.12.patch new file mode 100644 index 0000000..ac9b0d3 --- /dev/null +++ b/patches/kernel/0001-msm8909-qdsp6-voice-sound-nokia-argon-6.12.patch @@ -0,0 +1,1573 @@ +From b6d30de989bc00081e7a6ca5bb15ab0eafc4642e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Otto=20Pfl=C3=BCger?= +Date: Wed, 28 Jun 2023 14:47:49 +0200 +Subject: [PATCH 01/11] ASoC: qcom: q6core: expose ADSP core firmware version +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add a q6core_get_adsp_version() function that returns the version of the +ADSP firmware (2.6, 2.7 or 2.8), also known as the AVS version (see [1] +in downstream kernel). + +Some APIs differ between these versions, e.g. the AFE clock APIs. + +[1]: https://github.com/msm8916-mainline/linux-downstream/blob/LA.BR.1.2.9.1_rb1.5/sound/soc/msm/qdsp6v2/q6core.c#L193 + +Signed-off-by: Otto Pflüger +--- + sound/soc/qcom/qdsp6/q6core.c | 65 +++++++++++++++++++++++++++++++++++ + sound/soc/qcom/qdsp6/q6core.h | 9 +++++ + 2 files changed, 74 insertions(+) + +diff --git a/sound/soc/qcom/qdsp6/q6core.c b/sound/soc/qcom/qdsp6/q6core.c +index 49cfb32cd20917..855ab4ff1e598a 100644 +--- a/sound/soc/qcom/qdsp6/q6core.c ++++ b/sound/soc/qcom/qdsp6/q6core.c +@@ -20,6 +20,9 @@ + #define AVCS_CMDRSP_ADSP_EVENT_GET_STATE 0x0001290D + #define AVCS_GET_VERSIONS 0x00012905 + #define AVCS_GET_VERSIONS_RSP 0x00012906 ++#define AVCS_CMDRSP_Q6_ID_2_6 0x00040000 ++#define AVCS_CMDRSP_Q6_ID_2_7 0x00040001 ++#define AVCS_CMDRSP_Q6_ID_2_8 0x00040002 + #define AVCS_CMD_GET_FWK_VERSION 0x001292c + #define AVCS_CMDRSP_GET_FWK_VERSION 0x001292d + +@@ -63,6 +66,7 @@ struct q6core { + bool get_state_supported; + bool get_version_supported; + bool is_version_requested; ++ enum q6core_version adsp_version; + }; + + static struct q6core *g_core; +@@ -108,6 +112,14 @@ static int q6core_callback(struct apr_device *adev, struct apr_resp_pkt *data) + if (!core->fwk_version) + return -ENOMEM; + ++ /* ++ * Since GET_VERSIONS is not called when GET_FWK_VERSION ++ * is successful and these commands may return completely ++ * different versions, assume that the version is 2.8 here. ++ * Older versions do not support GET_FWK_VERSION and we do ++ * not care if the version is newer than 2.8. ++ */ ++ core->adsp_version = Q6_ADSP_VERSION_2_8; + core->fwk_version_supported = true; + core->resp_received = true; + +@@ -115,6 +127,7 @@ static int q6core_callback(struct apr_device *adev, struct apr_resp_pkt *data) + } + case AVCS_GET_VERSIONS_RSP: { + struct avcs_cmdrsp_get_version *v; ++ int i; + + v = data->payload; + +@@ -125,6 +138,32 @@ static int q6core_callback(struct apr_device *adev, struct apr_resp_pkt *data) + if (!core->svc_version) + return -ENOMEM; + ++ for (i = 0; i < g_core->svc_version->num_services; i++) { ++ struct avcs_svc_info *info; ++ ++ info = &g_core->svc_version->svc_api_info[i]; ++ if (info->service_id != APR_SVC_ADSP_CORE) ++ continue; ++ ++ switch (info->version) { ++ case AVCS_CMDRSP_Q6_ID_2_6: ++ core->adsp_version = Q6_ADSP_VERSION_2_6; ++ break; ++ case AVCS_CMDRSP_Q6_ID_2_7: ++ core->adsp_version = Q6_ADSP_VERSION_2_7; ++ break; ++ case AVCS_CMDRSP_Q6_ID_2_8: ++ core->adsp_version = Q6_ADSP_VERSION_2_8; ++ break; ++ default: ++ dev_err(&adev->dev, "Unknown AVS version 0x%08x\n", ++ info->version); ++ break; ++ } ++ ++ break; ++ } ++ + core->get_version_supported = true; + core->resp_received = true; + +@@ -293,6 +332,31 @@ int q6core_get_svc_api_info(int svc_id, struct q6core_svc_api_info *ainfo) + } + EXPORT_SYMBOL_GPL(q6core_get_svc_api_info); + ++/** ++ * q6core_get_adsp_version() - Get the core version number. ++ * ++ * Return: version code or Q6_ADSP_VERSION_UNKNOWN on failure ++ */ ++enum q6core_version q6core_get_adsp_version(void) ++{ ++ int ret; ++ ++ if (!g_core) ++ return Q6_ADSP_VERSION_UNKNOWN; ++ ++ mutex_lock(&g_core->lock); ++ if (!g_core->is_version_requested) { ++ if (q6core_get_fwk_versions(g_core) == -ENOTSUPP) ++ q6core_get_svc_versions(g_core); ++ g_core->is_version_requested = true; ++ } ++ ret = g_core->adsp_version; ++ mutex_unlock(&g_core->lock); ++ ++ return ret; ++} ++EXPORT_SYMBOL_GPL(q6core_get_adsp_version); ++ + /** + * q6core_is_adsp_ready() - Get status of adsp + * +@@ -334,6 +398,7 @@ static int q6core_probe(struct apr_device *adev) + dev_set_drvdata(&adev->dev, g_core); + + mutex_init(&g_core->lock); ++ g_core->adsp_version = Q6_ADSP_VERSION_UNKNOWN; + g_core->adev = adev; + init_waitqueue_head(&g_core->wait); + return 0; +diff --git a/sound/soc/qcom/qdsp6/q6core.h b/sound/soc/qcom/qdsp6/q6core.h +index 4105b1d730be88..472e06bf8efc79 100644 +--- a/sound/soc/qcom/qdsp6/q6core.h ++++ b/sound/soc/qcom/qdsp6/q6core.h +@@ -9,7 +9,16 @@ struct q6core_svc_api_info { + uint32_t api_branch_version; + }; + ++/* Versions must be in order! */ ++enum q6core_version { ++ Q6_ADSP_VERSION_UNKNOWN, ++ Q6_ADSP_VERSION_2_6, ++ Q6_ADSP_VERSION_2_7, ++ Q6_ADSP_VERSION_2_8, ++}; ++ + bool q6core_is_adsp_ready(void); ++enum q6core_version q6core_get_adsp_version(void); + int q6core_get_svc_api_info(int svc_id, struct q6core_svc_api_info *ainfo); + + #endif /* __Q6CORE_H__ */ + +From c8d723a0e008f875858c413348e2160ba343f47e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Otto=20Pfl=C3=BCger?= +Date: Sun, 29 Oct 2023 15:33:26 +0100 +Subject: [PATCH 02/11] ASoC: qcom: q6afe: provide fallback for digital codec + clock +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When q6afe is used as a clock provider through q6afe-clocks.c, it uses +an interface for setting clocks that is not present in older firmware +versions. However, using Q6AFE_LPASS_CLK_ID_INTERNAL_DIGITAL_CODEC_CORE +as the codec MCLK in the device tree can be useful on older platforms +too. Provide a fallback that sets this clock using the old method when +an old firmware version is detected. + +MSM8916 did not need this because of a workaround that controls this +clock directly through the GCC driver, but newer SoCs do not have this +clock in their GCC drivers because it is meant to be controlled by the +DSP. + +Signed-off-by: Otto Pflüger +--- + sound/soc/qcom/qdsp6/q6afe.c | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +diff --git a/sound/soc/qcom/qdsp6/q6afe.c b/sound/soc/qcom/qdsp6/q6afe.c +index 7b59d514b432a2..ff3f7e12112aab 100644 +--- a/sound/soc/qcom/qdsp6/q6afe.c ++++ b/sound/soc/qcom/qdsp6/q6afe.c +@@ -1203,6 +1203,32 @@ int q6afe_set_lpass_clock(struct device *dev, int clk_id, int attri, + struct q6afe *afe = dev_get_drvdata(dev->parent); + struct afe_clk_set cset = {0,}; + ++ /* ++ * v2 clocks specified in the device tree may not be supported by the ++ * firmware. If this is the digital codec core clock, fall back to the ++ * old method for setting it. ++ */ ++ if (q6core_get_adsp_version() < Q6_ADSP_VERSION_2_7) { ++ struct q6afe_port *port; ++ struct afe_digital_clk_cfg dcfg = {0,}; ++ int ret; ++ ++ if (clk_id != Q6AFE_LPASS_CLK_ID_INTERNAL_DIGITAL_CODEC_CORE) ++ return -EINVAL; ++ ++ port = q6afe_port_get_from_id(dev, PRIMARY_MI2S_RX); ++ if (IS_ERR(port)) ++ return PTR_ERR(port); ++ ++ dcfg.i2s_cfg_minor_version = AFE_API_VERSION_I2S_CONFIG; ++ dcfg.clk_val = freq; ++ dcfg.clk_root = 5; ++ ret = q6afe_set_digital_codec_core_clock(port, &dcfg); ++ ++ q6afe_port_put(port); ++ return ret; ++ } ++ + cset.clk_set_minor_version = AFE_API_VERSION_CLOCK_SET; + cset.clk_id = clk_id; + cset.clk_freq_in_hz = freq; + +From a281e48154f357b119cb784ea5c2b338eff9a593 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Otto=20Pfl=C3=BCger?= +Date: Sun, 29 Oct 2023 15:52:32 +0100 +Subject: [PATCH 03/11] ASoC: qcom: q6afe-dai: check ADSP version when setting + sysclk +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Some older DSP firmware versions only provide AFE_PARAM_ID_*_CLK_CONFIG +requests for setting clocks, while newer ones only provide the +incompatible AFE_PARAM_ID_CLOCK_SET. The q6afe driver implements both, +but requires different clock IDs for the different firmware versions. + +Implement the LPAIF_*_CLK clocks using newer clock IDs when the DSP +firmware does not support the old clocks so that users don't have to +care about the firmware version when setting clocks. + +Signed-off-by: Otto Pflüger +--- + sound/soc/qcom/qdsp6/q6afe-dai.c | 98 +++++++++++++++++++++++++++----- + 1 file changed, 84 insertions(+), 14 deletions(-) + +diff --git a/sound/soc/qcom/qdsp6/q6afe-dai.c b/sound/soc/qcom/qdsp6/q6afe-dai.c +index 0f47aadaabe171..6d842d20b70198 100644 +--- a/sound/soc/qcom/qdsp6/q6afe-dai.c ++++ b/sound/soc/qcom/qdsp6/q6afe-dai.c +@@ -14,6 +14,7 @@ + #include + #include "q6dsp-lpass-ports.h" + #include "q6dsp-common.h" ++#include "q6core.h" + #include "q6afe.h" + + +@@ -484,36 +485,105 @@ static int q6slim_set_channel_map(struct snd_soc_dai *dai, + return 0; + } + ++static int q6afe_get_bit_clk_id(unsigned int dai_id) ++{ ++ switch (dai_id) { ++ case PRIMARY_MI2S_RX: ++ case PRIMARY_MI2S_TX: ++ return Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT; ++ case SECONDARY_MI2S_RX: ++ case SECONDARY_MI2S_TX: ++ return Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT; ++ case TERTIARY_MI2S_RX: ++ case TERTIARY_MI2S_TX: ++ return Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT; ++ case QUATERNARY_MI2S_RX: ++ case QUATERNARY_MI2S_TX: ++ return Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT; ++ case QUINARY_MI2S_RX: ++ case QUINARY_MI2S_TX: ++ return Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT; ++ ++ case PRIMARY_TDM_RX_0 ... PRIMARY_TDM_TX_7: ++ return Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT; ++ case SECONDARY_TDM_RX_0 ... SECONDARY_TDM_TX_7: ++ return Q6AFE_LPASS_CLK_ID_SEC_TDM_IBIT; ++ case TERTIARY_TDM_RX_0 ... TERTIARY_TDM_TX_7: ++ return Q6AFE_LPASS_CLK_ID_TER_TDM_IBIT; ++ case QUATERNARY_TDM_RX_0 ... QUATERNARY_TDM_TX_7: ++ return Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT; ++ case QUINARY_TDM_RX_0 ... QUINARY_TDM_TX_7: ++ return Q6AFE_LPASS_CLK_ID_QUIN_TDM_IBIT; ++ ++ default: ++ return -EINVAL; ++ } ++} ++ ++static int q6afe_get_osr_clk_id(unsigned int dai_id) ++{ ++ switch (dai_id) { ++ case QUINARY_MI2S_RX: ++ case QUINARY_MI2S_TX: ++ return Q6AFE_LPASS_CLK_ID_QUI_MI2S_OSR; ++ ++ case QUINARY_TDM_RX_0 ... QUINARY_TDM_TX_7: ++ return Q6AFE_LPASS_CLK_ID_QUIN_TDM_OSR; ++ ++ default: ++ return -EINVAL; ++ } ++} ++ + static int q6afe_mi2s_set_sysclk(struct snd_soc_dai *dai, + int clk_id, unsigned int freq, int dir) + { + struct q6afe_dai_data *dai_data = dev_get_drvdata(dai->dev); + struct q6afe_port *port = dai_data->port[dai->id]; ++ int clk_src; ++ int clk_root; ++ bool use_new_clks = q6core_get_adsp_version() >= Q6_ADSP_VERSION_2_7; + + switch (clk_id) { + case LPAIF_DIG_CLK: +- return q6afe_port_set_sysclk(port, clk_id, 0, 5, freq, dir); ++ if (use_new_clks) { ++ clk_src = Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO; ++ clk_root = Q6AFE_LPASS_CLK_ROOT_DEFAULT; ++ clk_id = Q6AFE_LPASS_CLK_ID_INTERNAL_DIGITAL_CODEC_CORE; ++ } else { ++ clk_src = 0; ++ clk_root = 5; ++ } ++ break; + case LPAIF_BIT_CLK: + case LPAIF_OSR_CLK: +- return q6afe_port_set_sysclk(port, clk_id, +- Q6AFE_LPASS_CLK_SRC_INTERNAL, +- Q6AFE_LPASS_CLK_ROOT_DEFAULT, +- freq, dir); ++ if (use_new_clks) { ++ clk_src = Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO; ++ clk_root = Q6AFE_LPASS_CLK_ROOT_DEFAULT; ++ if (clk_id == LPAIF_OSR_CLK) ++ clk_id = q6afe_get_osr_clk_id(dai->id); ++ else ++ clk_id = q6afe_get_bit_clk_id(dai->id); ++ } else { ++ clk_src = Q6AFE_LPASS_CLK_SRC_INTERNAL; ++ clk_root = Q6AFE_LPASS_CLK_ROOT_DEFAULT; ++ } ++ break; + case Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT ... Q6AFE_LPASS_CLK_ID_QUI_MI2S_OSR: + case Q6AFE_LPASS_CLK_ID_MCLK_1 ... Q6AFE_LPASS_CLK_ID_INT_MCLK_1: + case Q6AFE_LPASS_CLK_ID_WSA_CORE_MCLK ... Q6AFE_LPASS_CLK_ID_VA_CORE_2X_MCLK: +- return q6afe_port_set_sysclk(port, clk_id, +- Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, +- Q6AFE_LPASS_CLK_ROOT_DEFAULT, +- freq, dir); ++ clk_src = Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO; ++ clk_root = Q6AFE_LPASS_CLK_ROOT_DEFAULT; ++ break; + case Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT ... Q6AFE_LPASS_CLK_ID_QUIN_TDM_EBIT: +- return q6afe_port_set_sysclk(port, clk_id, +- Q6AFE_LPASS_CLK_ATTRIBUTE_INVERT_COUPLE_NO, +- Q6AFE_LPASS_CLK_ROOT_DEFAULT, +- freq, dir); ++ clk_src = Q6AFE_LPASS_CLK_ATTRIBUTE_INVERT_COUPLE_NO; ++ clk_root = Q6AFE_LPASS_CLK_ROOT_DEFAULT; ++ break; ++ default: ++ return 0; + } + +- return 0; ++ return q6afe_port_set_sysclk(port, clk_id, clk_src, clk_root, freq, dir); + } + + static const struct snd_soc_dapm_route q6afe_dapm_routes[] = { + +From 5edd23fb20aa78cb8456ca2cd412f0322d4071ca Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Otto=20Pfl=C3=BCger?= +Date: Sat, 14 Oct 2023 16:29:16 +0200 +Subject: [PATCH 04/11] ASoC: qcom: q6afe: remove "port already open" error +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The clock fallback for older firmware versions now represents a use case +for having multiple references to a port. Stop logging an error when a +port is requested more than once because this does not indicate a problem +anymore and causes unnecessary spam in dmesg. + +Signed-off-by: Otto Pflüger +--- + sound/soc/qcom/qdsp6/q6afe.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/sound/soc/qcom/qdsp6/q6afe.c b/sound/soc/qcom/qdsp6/q6afe.c +index ff3f7e12112aab..7b5d90e1452932 100644 +--- a/sound/soc/qcom/qdsp6/q6afe.c ++++ b/sound/soc/qcom/qdsp6/q6afe.c +@@ -1777,10 +1777,8 @@ struct q6afe_port *q6afe_port_get_from_id(struct device *dev, int id) + + /* if port is multiple times bind/unbind before callback finishes */ + port = q6afe_find_port(afe, id); +- if (port) { +- dev_err(dev, "AFE Port already open\n"); ++ if (port) + return port; +- } + + port_id = port_maps[id].port_id; + + +From d813b49d565ccc7a0247b746afc8149a82cd73c7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Otto=20Pfl=C3=BCger?= +Date: Thu, 29 Jun 2023 13:51:20 +0200 +Subject: [PATCH 05/11] arm64: dts: msm8916: use q6afe-clocks for digital codec + mclk +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +(breaks audio with dsp disabled, but useful for testing) + +Signed-off-by: Otto Pflüger +--- + arch/arm64/boot/dts/qcom/msm8916.dtsi | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi +index 16ebf5349c9596..2698e5fff1ae6a 100644 +--- a/arch/arm64/boot/dts/qcom/msm8916.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + + / { +@@ -2055,6 +2056,11 @@ + compatible = "qcom,q6afe"; + reg = ; + ++ q6afecc: clock-controller { ++ compatible = "qcom,q6afe-clocks"; ++ #clock-cells = <2>; ++ }; ++ + q6afedai: dais { + compatible = "qcom,q6afe-dais"; + #address-cells = <1>; +@@ -2168,11 +2174,14 @@ + lpass_codec: audio-codec@771c000 { + compatible = "qcom,msm8916-wcd-digital-codec"; + reg = <0x0771c000 0x400>; +- clocks = <&gcc GCC_ULTAUDIO_AHBFABRIC_IXFABRIC_CLK>, +- <&gcc GCC_CODEC_DIGCODEC_CLK>; ++ clocks = <&xo_board>, ++ <&q6afecc LPASS_CLK_ID_INTERNAL_DIGITAL_CODEC_CORE ++ LPASS_CLK_ATTRIBUTE_COUPLE_NO>; + clock-names = "ahbix-clk", "mclk"; + #sound-dai-cells = <1>; + status = "disabled"; ++ assigned-clocks = <&q6afecc LPASS_CLK_ID_INTERNAL_DIGITAL_CODEC_CORE LPASS_CLK_ATTRIBUTE_COUPLE_NO>; ++ assigned-clock-rates = <9600000>; + }; + + sdhc_1: mmc@7824900 { + +From 85b826377e27a2a4b02a23823d28556bd0a406f6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Otto=20Pfl=C3=BCger?= +Date: Tue, 7 Mar 2023 18:44:50 +0100 +Subject: [PATCH 06/11] ARM: dts: qcom: pm8909: add audio codec +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Otto Pflüger +--- + arch/arm/boot/dts/qcom/qcom-pm8909.dtsi | 38 +++++++++++++++++++++++++ + 1 file changed, 38 insertions(+) + +diff --git a/arch/arm/boot/dts/qcom/qcom-pm8909.dtsi b/arch/arm/boot/dts/qcom/qcom-pm8909.dtsi +index b632a1883d7732..00862a9a6eda24 100644 +--- a/arch/arm/boot/dts/qcom/qcom-pm8909.dtsi ++++ b/arch/arm/boot/dts/qcom/qcom-pm8909.dtsi +@@ -142,5 +142,43 @@ + reg = <0xc000>; + status = "disabled"; + }; ++ ++ wcd_codec: audio-codec@f000 { ++ compatible = "qcom,pm8916-wcd-analog-codec"; ++ reg = <0xf000>; ++ reg-names = "pmic-codec-core"; ++ interrupt-parent = <&spmi_bus>; ++ interrupts = <0x1 0xf0 0x0 IRQ_TYPE_NONE>, ++ <0x1 0xf0 0x1 IRQ_TYPE_NONE>, ++ <0x1 0xf0 0x2 IRQ_TYPE_NONE>, ++ <0x1 0xf0 0x3 IRQ_TYPE_NONE>, ++ <0x1 0xf0 0x4 IRQ_TYPE_NONE>, ++ <0x1 0xf0 0x5 IRQ_TYPE_NONE>, ++ <0x1 0xf0 0x6 IRQ_TYPE_NONE>, ++ <0x1 0xf0 0x7 IRQ_TYPE_NONE>, ++ <0x1 0xf1 0x0 IRQ_TYPE_NONE>, ++ <0x1 0xf1 0x1 IRQ_TYPE_NONE>, ++ <0x1 0xf1 0x2 IRQ_TYPE_NONE>, ++ <0x1 0xf1 0x3 IRQ_TYPE_NONE>, ++ <0x1 0xf1 0x4 IRQ_TYPE_NONE>, ++ <0x1 0xf1 0x5 IRQ_TYPE_NONE>; ++ interrupt-names = "cdc_spk_cnp_int", ++ "cdc_spk_clip_int", ++ "cdc_spk_ocp_int", ++ "mbhc_ins_rem_det1", ++ "mbhc_but_rel_det", ++ "mbhc_but_press_det", ++ "mbhc_ins_rem_det", ++ "mbhc_switch_int", ++ "cdc_ear_ocp_int", ++ "cdc_hphr_ocp_int", ++ "cdc_hphl_ocp_det", ++ "cdc_ear_cnp_int", ++ "cdc_hphr_cnp_int", ++ "cdc_hphl_cnp_int"; ++ #sound-dai-cells = <1>; ++ ++ status = "disabled"; ++ }; + }; + }; + +From a9017ac6cb931d1bfd5aebcc822ad5bf973e0808 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Otto=20Pfl=C3=BCger?= +Date: Tue, 7 Mar 2023 18:45:09 +0100 +Subject: [PATCH 07/11] ARM: dts: qcom: msm8909: add sound +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Otto Pflüger +--- + arch/arm/boot/dts/qcom/qcom-msm8909.dtsi | 110 +++++++++++++++++++++++ + 1 file changed, 110 insertions(+) + +diff --git a/arch/arm/boot/dts/qcom/qcom-msm8909.dtsi b/arch/arm/boot/dts/qcom/qcom-msm8909.dtsi +index 54732effd2d30c..4c2d64531c7dc5 100644 +--- a/arch/arm/boot/dts/qcom/qcom-msm8909.dtsi ++++ b/arch/arm/boot/dts/qcom/qcom-msm8909.dtsi +@@ -9,6 +9,10 @@ + #include + #include + #include ++#include ++#include ++#include ++#include + + / { + #address-cells = <1>; +@@ -807,6 +811,25 @@ + drive-strength = <6>; + bias-pull-up; + }; ++ ++ cdc-pdm-lines { ++ cdc_pdm_lines_act: pdm-lines-on { ++ pins = "gpio59", "gpio60", "gpio61", ++ "gpio62", "gpio63", "gpio64"; ++ function = "cdc_pdm0"; ++ ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ cdc_pdm_lines_sus: pdm-lines-off { ++ pins = "gpio59", "gpio60", "gpio61", ++ "gpio62", "gpio63", "gpio64"; ++ function = "cdc_pdm0"; ++ ++ drive-strength = <2>; ++ bias-pull-down; ++ }; ++ }; + }; + + gcc: clock-controller@1800000 { +@@ -924,9 +947,96 @@ + qcom,remote-pid = <1>; + + label = "hexagon"; ++ ++ apr: apr { ++ compatible = "qcom,apr-v2"; ++ qcom,smd-channels = "apr_audio_svc"; ++ qcom,apr-domain = ; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ ++ apr-service@3 { ++ reg = ; ++ compatible = "qcom,q6core"; ++ }; ++ ++ q6afe: apr-service@4 { ++ compatible = "qcom,q6afe"; ++ reg = ; ++ q6afedai: dais { ++ compatible = "qcom,q6afe-dais"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #sound-dai-cells = <1>; ++ }; ++ q6afecc: clock-controller { ++ compatible = "qcom,q6afe-clocks"; ++ #clock-cells = <2>; ++ }; ++ }; ++ ++ q6asm: apr-service@7 { ++ compatible = "qcom,q6asm"; ++ reg = ; ++ q6asmdai: dais { ++ compatible = "qcom,q6asm-dais"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #sound-dai-cells = <1>; ++ }; ++ }; ++ ++ q6adm: apr-service@8 { ++ compatible = "qcom,q6adm"; ++ reg = ; ++ q6routing: routing { ++ compatible = "qcom,q6adm-routing"; ++ #sound-dai-cells = <0>; ++ }; ++ }; ++ ++ q6mvm: apr-service@9 { ++ compatible = "qcom,q6mvm"; ++ reg = ; ++ ++ q6voicedai: dais { ++ compatible = "qcom,q6voice-dais"; ++ #sound-dai-cells = <1>; ++ }; ++ }; ++ ++ q6cvs: apr-service@a { ++ compatible = "qcom,q6cvs"; ++ reg = ; ++ }; ++ ++ q6cvp: apr-service@b { ++ compatible = "qcom,q6cvp"; ++ reg = ; ++ }; ++ }; + }; + }; + ++ sound: sound@7702000 { ++ status = "disabled"; ++ compatible = "qcom,msm8916-qdsp6-sndcard"; ++ reg = <0x07702000 0x4>, <0x07702004 0x4>; ++ reg-names = "mic-iomux", "spkr-iomux"; ++ }; ++ ++ lpass_codec: audio-codec@771c000 { ++ compatible = "qcom,msm8916-wcd-digital-codec"; ++ reg = <0x0771c000 0x400>; ++ clocks = <&xo_board>, ++ <&q6afecc LPASS_CLK_ID_INTERNAL_DIGITAL_CODEC_CORE LPASS_CLK_ATTRIBUTE_COUPLE_NO>; ++ clock-names = "ahbix-clk", "mclk"; ++ assigned-clocks = <&q6afecc LPASS_CLK_ID_INTERNAL_DIGITAL_CODEC_CORE LPASS_CLK_ATTRIBUTE_COUPLE_NO>; ++ assigned-clock-rates = <9600000>; ++ #sound-dai-cells = <1>; ++ }; ++ + sdhc_1: sdhci@7824000 { + compatible = "qcom,msm8916-sdhci", "qcom,sdhci-msm-v4"; + reg = <0x07824900 0x11c>, <0x07824000 0x800>; + +From 7bdef6582b207977d13bae286b2658ce9da010ff Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Otto=20Pfl=C3=BCger?= +Date: Tue, 7 Mar 2023 18:46:14 +0100 +Subject: [PATCH 08/11] ARM: dts: qcom: msm8905-nokia-argon: add sound +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Otto Pflüger +--- + .../dts/qcom/qcom-msm8905-nokia-argon.dts | 149 ++++++++++++++++++ + 1 file changed, 149 insertions(+) + +diff --git a/arch/arm/boot/dts/qcom/qcom-msm8905-nokia-argon.dts b/arch/arm/boot/dts/qcom/qcom-msm8905-nokia-argon.dts +index 724c5be8c5b06a..dd0b6391f2505e 100644 +--- a/arch/arm/boot/dts/qcom/qcom-msm8905-nokia-argon.dts ++++ b/arch/arm/boot/dts/qcom/qcom-msm8905-nokia-argon.dts +@@ -6,6 +6,9 @@ + #include + #include + #include ++#include ++#include ++#include + + / { + model = "Nokia 8110 4G"; +@@ -154,6 +157,10 @@ + }; + }; + ++&apr { ++ status = "okay"; ++}; ++ + &blsp_spi5 { + status = "okay"; + +@@ -224,6 +231,37 @@ + status = "okay"; + }; + ++&q6afedai { ++ dai@16 { ++ reg = ; ++ qcom,sd-lines = <0 1>; ++ }; ++ dai@20 { ++ reg = ; ++ qcom,sd-lines = <0 1>; ++ }; ++}; ++ ++&q6asmdai { ++ dai@0 { ++ reg = <0>; ++ direction = ; ++ }; ++ dai@1 { ++ reg = <1>; ++ direction = ; ++ }; ++ dai@2 { ++ reg = <2>; ++ direction = ; ++ }; ++ dai@3 { ++ reg = <3>; ++ direction = ; ++ is-compress-dai; ++ }; ++}; ++ + &sdhc_1 { + status = "okay"; + }; +@@ -233,6 +271,103 @@ + status = "okay"; + }; + ++&sound { ++ status = "okay"; ++ model = "msm8916"; ++ ++ audio-routing = ++ "AMIC1", "MIC BIAS External1", ++ "AMIC2", "MIC BIAS Internal2", ++ "AMIC3", "MIC BIAS External1"; ++ ++ pinctrl-names = "default", "sleep"; ++ pinctrl-0 = <&cdc_pdm_lines_act>; ++ pinctrl-1 = <&cdc_pdm_lines_sus>; ++ ++ dai-link-multimedia1 { ++ link-name = "MultiMedia1"; ++ cpu { ++ sound-dai = <&q6asmdai MSM_FRONTEND_DAI_MULTIMEDIA1>; ++ }; ++ }; ++ ++ dai-link-multimedia2 { ++ link-name = "MultiMedia2"; ++ cpu { ++ sound-dai = <&q6asmdai MSM_FRONTEND_DAI_MULTIMEDIA2>; ++ }; ++ }; ++ ++ dai-link-multimedia3 { ++ link-name = "MultiMedia3"; ++ cpu { ++ sound-dai = <&q6asmdai MSM_FRONTEND_DAI_MULTIMEDIA3>; ++ }; ++ }; ++ ++ dai-link-multimedia4 { ++ link-name = "MultiMedia4"; ++ cpu { ++ sound-dai = <&q6asmdai MSM_FRONTEND_DAI_MULTIMEDIA4>; ++ }; ++ }; ++ ++ dai-link-voicemmode1 { ++ link-name = "VoiceMMode1"; ++ cpu { ++ sound-dai = <&q6voicedai VOICEMMODE1>; ++ }; ++ }; ++ ++ sound_dai_primary: dai-link-primary { ++ link-name = "Primary MI2S"; ++ cpu { ++ sound-dai = <&q6afedai PRIMARY_MI2S_RX>; ++ }; ++ platform { ++ sound-dai = <&q6routing>; ++ }; ++ codec { ++ sound-dai = <&lpass_codec 0>, <&wcd_codec 0>; ++ }; ++ }; ++ ++ sound_dai_secondary: dai-link-secondary { ++ link-name = "Secondary MI2S"; ++ status = "disabled"; /* Needs extra codec configuration */ ++ cpu { ++ sound-dai = <&q6afedai SECONDARY_MI2S_RX>; ++ }; ++ platform { ++ sound-dai = <&q6routing>; ++ }; ++ }; ++ ++ sound_dai_tertiary: dai-link-tertiary { ++ link-name = "Tertiary MI2S"; ++ cpu { ++ sound-dai = <&q6afedai TERTIARY_MI2S_TX>; ++ }; ++ platform { ++ sound-dai = <&q6routing>; ++ }; ++ codec { ++ sound-dai = <&lpass_codec 1>, <&wcd_codec 1>; ++ }; ++ }; ++ ++ sound_dai_quaternary: dai-link-quaternary { ++ link-name = "Quaternary MI2S"; ++ status = "disabled"; /* Needs extra codec configuration */ ++ cpu { ++ sound-dai = <&q6afedai QUATERNARY_MI2S_RX>; ++ }; ++ platform { ++ sound-dai = <&q6routing>; ++ }; ++ }; ++}; ++ + &usb { + extcon = <&pm8909_charger>; + status = "okay"; +@@ -242,6 +377,20 @@ + extcon = <&pm8909_charger>; + }; + ++&wcd_codec { ++ status = "okay"; ++ ++ qcom,hphl-jack-type-normally-open; ++ qcom,micbias1-ext-cap; ++ qcom,micbias2-ext-cap; ++ qcom,mbhc-vthreshold-low = <85 120 225 450 500>; ++ qcom,mbhc-vthreshold-high = <85 120 225 450 500>; ++ ++ vdd-cdc-io-supply = <&pm8909_l5>; ++ vdd-cdc-tx-rx-cx-supply = <&pm8909_s2>; ++ vdd-micbias-supply = <&pm8909_l13>; ++}; ++ + &wcnss { + status = "okay"; + }; + +From a7af0a9402f776885be06ec1da6f049aa5c860f2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Otto=20Pfl=C3=BCger?= +Date: Tue, 21 Mar 2023 16:06:01 +0100 +Subject: [PATCH 09/11] ARM: dts: qcom: msm8909-nokia-leo-common: add sound +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Otto Pflüger +--- + .../qcom/qcom-msm8909-nokia-leo-common.dtsi | 164 +++++++++++++++++- + 1 file changed, 155 insertions(+), 9 deletions(-) + +diff --git a/arch/arm/boot/dts/qcom/qcom-msm8909-nokia-leo-common.dtsi b/arch/arm/boot/dts/qcom/qcom-msm8909-nokia-leo-common.dtsi +index 709f4813d41359..f4b63bf83a9524 100644 +--- a/arch/arm/boot/dts/qcom/qcom-msm8909-nokia-leo-common.dtsi ++++ b/arch/arm/boot/dts/qcom/qcom-msm8909-nokia-leo-common.dtsi +@@ -122,6 +122,10 @@ + }; + }; + ++&apr { ++ status = "okay"; ++}; ++ + &blsp_spi5 { + status = "okay"; + +@@ -163,15 +167,6 @@ + status = "okay"; + }; + +-&sdhc_1 { +- status = "okay"; +-}; +- +-&sdhc_2 { +- non-removable; +- status = "okay"; +-}; +- + &pm8909_bms { + monitored-battery = <&bat>; + power-supplies = <&pm8909_charger>; +@@ -198,6 +193,143 @@ + status = "okay"; + }; + ++&q6afedai { ++ dai@16 { ++ reg = ; ++ qcom,sd-lines = <0 1>; ++ }; ++ dai@20 { ++ reg = ; ++ qcom,sd-lines = <0 1>; ++ }; ++}; ++ ++&q6asmdai { ++ dai@0 { ++ reg = <0>; ++ direction = ; ++ }; ++ dai@1 { ++ reg = <1>; ++ direction = ; ++ }; ++ dai@2 { ++ reg = <2>; ++ direction = ; ++ }; ++ dai@3 { ++ reg = <3>; ++ direction = ; ++ is-compress-dai; ++ }; ++}; ++ ++&sdhc_1 { ++ status = "okay"; ++}; ++ ++&sdhc_2 { ++ non-removable; ++ status = "okay"; ++}; ++ ++&sound { ++ status = "okay"; ++ model = "msm8916"; ++ ++ audio-routing = ++ "AMIC1", "MIC BIAS External1", ++ "AMIC2", "MIC BIAS Internal2", ++ "AMIC3", "MIC BIAS External1"; ++ ++ pinctrl-names = "default", "sleep"; ++ pinctrl-0 = <&cdc_pdm_lines_act>; ++ pinctrl-1 = <&cdc_pdm_lines_sus>; ++ ++ dai-link-multimedia1 { ++ link-name = "MultiMedia1"; ++ cpu { ++ sound-dai = <&q6asmdai MSM_FRONTEND_DAI_MULTIMEDIA1>; ++ }; ++ }; ++ ++ dai-link-multimedia2 { ++ link-name = "MultiMedia2"; ++ cpu { ++ sound-dai = <&q6asmdai MSM_FRONTEND_DAI_MULTIMEDIA2>; ++ }; ++ }; ++ ++ dai-link-multimedia3 { ++ link-name = "MultiMedia3"; ++ cpu { ++ sound-dai = <&q6asmdai MSM_FRONTEND_DAI_MULTIMEDIA3>; ++ }; ++ }; ++ ++ dai-link-multimedia4 { ++ link-name = "MultiMedia4"; ++ cpu { ++ sound-dai = <&q6asmdai MSM_FRONTEND_DAI_MULTIMEDIA4>; ++ }; ++ }; ++ ++ dai-link-voicemmode1 { ++ link-name = "VoiceMMode1"; ++ cpu { ++ sound-dai = <&q6voicedai VOICEMMODE1>; ++ }; ++ }; ++ ++ sound_dai_primary: dai-link-primary { ++ link-name = "Primary MI2S"; ++ cpu { ++ sound-dai = <&q6afedai PRIMARY_MI2S_RX>; ++ }; ++ platform { ++ sound-dai = <&q6routing>; ++ }; ++ codec { ++ sound-dai = <&lpass_codec 0>, <&wcd_codec 0>; ++ }; ++ }; ++ ++ sound_dai_secondary: dai-link-secondary { ++ link-name = "Secondary MI2S"; ++ status = "disabled"; /* Needs extra codec configuration */ ++ cpu { ++ sound-dai = <&q6afedai SECONDARY_MI2S_RX>; ++ }; ++ platform { ++ sound-dai = <&q6routing>; ++ }; ++ }; ++ ++ sound_dai_tertiary: dai-link-tertiary { ++ link-name = "Tertiary MI2S"; ++ cpu { ++ sound-dai = <&q6afedai TERTIARY_MI2S_TX>; ++ }; ++ platform { ++ sound-dai = <&q6routing>; ++ }; ++ codec { ++ sound-dai = <&lpass_codec 1>, <&wcd_codec 1>; ++ }; ++ }; ++ ++ sound_dai_quaternary: dai-link-quaternary { ++ link-name = "Quaternary MI2S"; ++ status = "disabled"; /* Needs extra codec configuration */ ++ cpu { ++ sound-dai = <&q6afedai QUATERNARY_MI2S_RX>; ++ }; ++ platform { ++ sound-dai = <&q6routing>; ++ }; ++ }; ++}; ++ + &usb { + extcon = <&pm8909_charger>; + status = "okay"; +@@ -207,6 +339,20 @@ + extcon = <&pm8909_charger>; + }; + ++&wcd_codec { ++ status = "okay"; ++ ++ qcom,hphl-jack-type-normally-open; ++ qcom,micbias1-ext-cap; ++ qcom,micbias2-ext-cap; ++ qcom,mbhc-vthreshold-low = <75 150 225 450 500>; ++ qcom,mbhc-vthreshold-high = <75 150 225 450 500>; ++ ++ vdd-cdc-io-supply = <&pm8909_l5>; ++ vdd-cdc-tx-rx-cx-supply = <&pm8909_s2>; ++ vdd-micbias-supply = <&pm8909_l13>; ++}; ++ + &wcnss { + status = "okay"; + }; + +From 06de84fe8dd5c8f62292ef215538bd07e5d3fee2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Otto=20Pfl=C3=BCger?= +Date: Thu, 20 Apr 2023 18:45:03 +0200 +Subject: [PATCH 10/11] ASoC: qdsp6: q6voice-dai: Add VoiceMMode1 DAI +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +VoiceMMode1 is used instead of CS-Voice on newer firmwares. + +Signed-off-by: Otto Pflüger +--- + include/dt-bindings/sound/qcom,q6voice.h | 7 + + sound/soc/qcom/qdsp6/q6mvm.c | 14 ++ + sound/soc/qcom/qdsp6/q6voice-dai.c | 184 +++++++++++++++++++---- + sound/soc/qcom/qdsp6/q6voice.h | 16 +- + 4 files changed, 180 insertions(+), 41 deletions(-) + +diff --git a/include/dt-bindings/sound/qcom,q6voice.h b/include/dt-bindings/sound/qcom,q6voice.h +index fe5aa3a3fce49b..0d0a718c55bd40 100644 +--- a/include/dt-bindings/sound/qcom,q6voice.h ++++ b/include/dt-bindings/sound/qcom,q6voice.h +@@ -3,5 +3,12 @@ + #define __DT_BINDINGS_Q6_VOICE_H__ + + #define CS_VOICE 0 ++#define VOIP 1 ++#define VOLTE 1 ++#define VOICE2 1 ++#define QCHAT 1 ++#define VOWLAN 1 ++#define VOICEMMODE1 1 ++#define VOICEMMODE2 2 + + #endif /* __DT_BINDINGS_Q6_VOICE_H__ */ +diff --git a/sound/soc/qcom/qdsp6/q6mvm.c b/sound/soc/qcom/qdsp6/q6mvm.c +index f1f8d520ba0d9b..ace0d9ca302572 100644 +--- a/sound/soc/qcom/qdsp6/q6mvm.c ++++ b/sound/soc/qcom/qdsp6/q6mvm.c +@@ -51,6 +51,20 @@ static inline const char *q6mvm_session_name(enum q6voice_path_type path) + switch (path) { + case Q6VOICE_PATH_VOICE: + return "default modem voice"; ++ case Q6VOICE_PATH_VOIP: ++ return "10004000"; ++ case Q6VOICE_PATH_VOLTE: ++ return "10C02000"; ++ case Q6VOICE_PATH_VOICE2: ++ return "10DC1000"; ++ case Q6VOICE_PATH_QCHAT: ++ return "10803000"; ++ case Q6VOICE_PATH_VOWLAN: ++ return "10002000"; ++ case Q6VOICE_PATH_VOICEMMODE1: ++ return "11C05000"; ++ case Q6VOICE_PATH_VOICEMMODE2: ++ return "11DC5000"; + default: + return NULL; + } +diff --git a/sound/soc/qcom/qdsp6/q6voice-dai.c b/sound/soc/qcom/qdsp6/q6voice-dai.c +index f3ae9d75f82b7a..356d9ca5b9974a 100644 +--- a/sound/soc/qcom/qdsp6/q6voice-dai.c ++++ b/sound/soc/qcom/qdsp6/q6voice-dai.c +@@ -11,20 +11,44 @@ + + #define DRV_NAME "q6voice-dai" + ++static enum q6voice_path_type q6voice_get_path(unsigned int dai_id) ++{ ++ switch (dai_id) { ++ case CS_VOICE: ++ return Q6VOICE_PATH_VOICE; ++ case VOICEMMODE1: ++ return Q6VOICE_PATH_VOICEMMODE1; ++ } ++ ++ return Q6VOICE_PATH_COUNT; ++} ++ + static int q6voice_dai_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) + { + struct q6voice *v = snd_soc_dai_get_drvdata(dai); ++ enum q6voice_path_type path = q6voice_get_path(dai->driver->id); + +- return q6voice_start(v, Q6VOICE_PATH_VOICE, substream->stream); ++ if (path == Q6VOICE_PATH_COUNT) { ++ dev_err(dai->dev, "Invalid DAI ID %u\n", dai->driver->id); ++ return -EINVAL; ++ } ++ ++ return q6voice_start(v, path, substream->stream); + } + + static void q6voice_dai_shutdown(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) + { + struct q6voice *v = snd_soc_dai_get_drvdata(dai); ++ enum q6voice_path_type path = q6voice_get_path(dai->driver->id); ++ ++ if (path == Q6VOICE_PATH_COUNT) { ++ dev_err(dai->dev, "Invalid DAI ID %u\n", dai->driver->id); ++ return; ++ } + +- q6voice_stop(v, Q6VOICE_PATH_VOICE, substream->stream); ++ q6voice_stop(v, path, substream->stream); + } + + static struct snd_soc_dai_ops q6voice_dai_ops = { +@@ -57,6 +81,30 @@ static struct snd_soc_dai_driver q6voice_dais[] = { + }, + .ops = &q6voice_dai_ops, + }, ++ { ++ .id = VOICEMMODE1, ++ .name = "VOICEMMODE1", ++ /* The constraints here are not really meaningful... */ ++ .playback = { ++ .stream_name = "VOICEMMODE1 Playback", ++ .formats = SNDRV_PCM_FMTBIT_S16_LE, ++ .rates = SNDRV_PCM_RATE_8000, ++ .rate_min = 8000, ++ .rate_max = 8000, ++ .channels_min = 1, ++ .channels_max = 1, ++ }, ++ .capture = { ++ .stream_name = "VOICEMMODE1 Capture", ++ .formats = SNDRV_PCM_FMTBIT_S16_LE, ++ .rates = SNDRV_PCM_RATE_8000, ++ .rate_min = 8000, ++ .rate_max = 8000, ++ .channels_min = 1, ++ .channels_max = 1, ++ }, ++ .ops = &q6voice_dai_ops, ++ }, + }; + + /* FIXME: Use codec2codec instead */ +@@ -77,21 +125,26 @@ static int q6voice_dai_open(struct snd_soc_component *component, + return 0; + } + +-static int q6voice_get_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) ++static int q6voice_get_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol, bool capture) + { + struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); + struct snd_soc_component *c = snd_soc_dapm_to_component(dapm); + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + struct q6voice *v = snd_soc_component_get_drvdata(c); +- bool capture = !!mc->shift; ++ enum q6voice_path_type path = q6voice_get_path(mc->shift); ++ ++ if (path == Q6VOICE_PATH_COUNT) { ++ dev_err(c->dev, "Invalid DAI ID %u\n", mc->shift); ++ return -EINVAL; ++ } + + ucontrol->value.integer.value[0] = +- q6voice_get_port(v, Q6VOICE_PATH_VOICE, capture) == mc->reg; ++ q6voice_get_port(v, path, capture) == mc->reg; + return 0; + } + +-static int q6voice_put_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) ++static int q6voice_put_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol, bool capture) + { + struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); + struct snd_soc_component *c = snd_soc_dapm_to_component(dapm); +@@ -99,61 +152,114 @@ static int q6voice_put_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ + (struct soc_mixer_control *)kcontrol->private_value; + struct q6voice *v = snd_soc_component_get_drvdata(c); + bool val = !!ucontrol->value.integer.value[0]; +- bool capture = !!mc->shift; ++ enum q6voice_path_type path = q6voice_get_path(mc->shift); ++ ++ if (path == Q6VOICE_PATH_COUNT) { ++ dev_err(c->dev, "Invalid DAI ID %u\n", mc->shift); ++ return -EINVAL; ++ } + + if (val) +- q6voice_set_port(v, Q6VOICE_PATH_VOICE, capture, mc->reg); +- else if (q6voice_get_port(v, Q6VOICE_PATH_VOICE, capture) == mc->reg) +- q6voice_set_port(v, Q6VOICE_PATH_VOICE, capture, 0); ++ q6voice_set_port(v, path, capture, mc->reg); ++ else if (q6voice_get_port(v, path, capture) == mc->reg) ++ q6voice_set_port(v, path, capture, 0); + + snd_soc_dapm_mixer_update_power(dapm, kcontrol, val, NULL); + return 1; + } + +-static const struct snd_kcontrol_new voice_tx_mixer_controls[] = { +- SOC_SINGLE_EXT("PRI_MI2S_TX", PRIMARY_MI2S_TX, 1, 1, 0, +- q6voice_get_mixer, q6voice_put_mixer), +- SOC_SINGLE_EXT("SEC_MI2S_TX", SECONDARY_MI2S_TX, 1, 1, 0, +- q6voice_get_mixer, q6voice_put_mixer), +- SOC_SINGLE_EXT("TERT_MI2S_TX", TERTIARY_MI2S_TX, 1, 1, 0, +- q6voice_get_mixer, q6voice_put_mixer), +- SOC_SINGLE_EXT("QUAT_MI2S_TX", QUATERNARY_MI2S_TX, 1, 1, 0, +- q6voice_get_mixer, q6voice_put_mixer), +- SOC_SINGLE_EXT("QUIN_MI2S_TX", QUINARY_MI2S_TX, 1, 1, 0, +- q6voice_get_mixer, q6voice_put_mixer), ++static int q6voice_get_mixer_capture(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) ++{ ++ return q6voice_get_mixer(kcontrol, ucontrol, true); ++} ++ ++static int q6voice_get_mixer_playback(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) ++{ ++ return q6voice_get_mixer(kcontrol, ucontrol, false); ++} ++ ++static int q6voice_put_mixer_capture(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) ++{ ++ return q6voice_put_mixer(kcontrol, ucontrol, true); ++} ++ ++static int q6voice_put_mixer_playback(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) ++{ ++ return q6voice_put_mixer(kcontrol, ucontrol, false); ++} ++ ++static const struct snd_kcontrol_new cs_voice_tx_mixer_controls[] = { ++ SOC_SINGLE_EXT("PRI_MI2S_TX", PRIMARY_MI2S_TX, CS_VOICE, 1, 0, ++ q6voice_get_mixer_capture, q6voice_put_mixer_capture), ++ SOC_SINGLE_EXT("SEC_MI2S_TX", SECONDARY_MI2S_TX, CS_VOICE, 1, 0, ++ q6voice_get_mixer_capture, q6voice_put_mixer_capture), ++ SOC_SINGLE_EXT("TERT_MI2S_TX", TERTIARY_MI2S_TX, CS_VOICE, 1, 0, ++ q6voice_get_mixer_capture, q6voice_put_mixer_capture), ++ SOC_SINGLE_EXT("QUAT_MI2S_TX", QUATERNARY_MI2S_TX, CS_VOICE, 1, 0, ++ q6voice_get_mixer_capture, q6voice_put_mixer_capture), ++ SOC_SINGLE_EXT("QUIN_MI2S_TX", QUINARY_MI2S_TX, CS_VOICE, 1, 0, ++ q6voice_get_mixer_capture, q6voice_put_mixer_capture), ++}; ++ ++static const struct snd_kcontrol_new voicemmode1_tx_mixer_controls[] = { ++ SOC_SINGLE_EXT("PRI_MI2S_TX", PRIMARY_MI2S_TX, VOICEMMODE1, 1, 0, ++ q6voice_get_mixer_capture, q6voice_put_mixer_capture), ++ SOC_SINGLE_EXT("SEC_MI2S_TX", SECONDARY_MI2S_TX, VOICEMMODE1, 1, 0, ++ q6voice_get_mixer_capture, q6voice_put_mixer_capture), ++ SOC_SINGLE_EXT("TERT_MI2S_TX", TERTIARY_MI2S_TX, VOICEMMODE1, 1, 0, ++ q6voice_get_mixer_capture, q6voice_put_mixer_capture), ++ SOC_SINGLE_EXT("QUAT_MI2S_TX", QUATERNARY_MI2S_TX, VOICEMMODE1, 1, 0, ++ q6voice_get_mixer_capture, q6voice_put_mixer_capture), ++ SOC_SINGLE_EXT("QUIN_MI2S_TX", QUINARY_MI2S_TX, VOICEMMODE1, 1, 0, ++ q6voice_get_mixer_capture, q6voice_put_mixer_capture), + }; + + static const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = { +- SOC_SINGLE_EXT("CS-Voice", PRIMARY_MI2S_RX, 0, 1, 0, +- q6voice_get_mixer, q6voice_put_mixer) ++ SOC_SINGLE_EXT("CS-Voice", PRIMARY_MI2S_RX, CS_VOICE, 1, 0, ++ q6voice_get_mixer_playback, q6voice_put_mixer_playback), ++ SOC_SINGLE_EXT("VoiceMMode1", PRIMARY_MI2S_RX, VOICEMMODE1, 1, 0, ++ q6voice_get_mixer_playback, q6voice_put_mixer_playback), + }; + + static const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = { +- SOC_SINGLE_EXT("CS-Voice", SECONDARY_MI2S_RX, 0, 1, 0, +- q6voice_get_mixer, q6voice_put_mixer) ++ SOC_SINGLE_EXT("CS-Voice", SECONDARY_MI2S_RX, CS_VOICE, 1, 0, ++ q6voice_get_mixer_playback, q6voice_put_mixer_playback), ++ SOC_SINGLE_EXT("VoiceMMode1", SECONDARY_MI2S_RX, VOICEMMODE1, 1, 0, ++ q6voice_get_mixer_playback, q6voice_put_mixer_playback), + }; + + static const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = { +- SOC_SINGLE_EXT("CS-Voice", TERTIARY_MI2S_RX, 0, 1, 0, +- q6voice_get_mixer, q6voice_put_mixer) ++ SOC_SINGLE_EXT("CS-Voice", TERTIARY_MI2S_RX, CS_VOICE, 1, 0, ++ q6voice_get_mixer_playback, q6voice_put_mixer_playback), ++ SOC_SINGLE_EXT("VoiceMMode1", TERTIARY_MI2S_RX, VOICEMMODE1, 1, 0, ++ q6voice_get_mixer_playback, q6voice_put_mixer_playback), + }; + + static const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = { +- SOC_SINGLE_EXT("CS-Voice", QUATERNARY_MI2S_RX, 0, 1, 0, +- q6voice_get_mixer, q6voice_put_mixer) ++ SOC_SINGLE_EXT("CS-Voice", QUATERNARY_MI2S_RX, CS_VOICE, 1, 0, ++ q6voice_get_mixer_playback, q6voice_put_mixer_playback), ++ SOC_SINGLE_EXT("VoiceMMode1", QUATERNARY_MI2S_RX, VOICEMMODE1, 1, 0, ++ q6voice_get_mixer_playback, q6voice_put_mixer_playback), + }; + + static const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = { +- SOC_SINGLE_EXT("CS-Voice", QUINARY_MI2S_RX, 0, 1, 0, +- q6voice_get_mixer, q6voice_put_mixer) ++ SOC_SINGLE_EXT("CS-Voice", QUINARY_MI2S_RX, CS_VOICE, 1, 0, ++ q6voice_get_mixer_playback, q6voice_put_mixer_playback), ++ SOC_SINGLE_EXT("VoiceMMode1", QUINARY_MI2S_RX, VOICEMMODE1, 1, 0, ++ q6voice_get_mixer_playback, q6voice_put_mixer_playback), + }; + + static const struct snd_soc_dapm_widget q6voice_dapm_widgets[] = { + SND_SOC_DAPM_AIF_IN("CS-VOICE_DL1", "CS-VOICE Playback", 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_OUT("CS-VOICE_UL1", "CS-VOICE Capture", 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_MIXER("CS-Voice Capture Mixer", SND_SOC_NOPM, 0, 0, +- voice_tx_mixer_controls, +- ARRAY_SIZE(voice_tx_mixer_controls)), ++ cs_voice_tx_mixer_controls, ++ ARRAY_SIZE(cs_voice_tx_mixer_controls)), ++ SND_SOC_DAPM_AIF_IN("VOICEMMODE1_DL1", "VOICEMMODE1 Playback", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_OUT("VOICEMMODE1_UL1", "VOICEMMODE1 Capture", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_MIXER("VoiceMMode1 Capture Mixer", SND_SOC_NOPM, 0, 0, ++ voicemmode1_tx_mixer_controls, ++ ARRAY_SIZE(voicemmode1_tx_mixer_controls)), + SND_SOC_DAPM_MIXER("PRI_MI2S_RX Voice Mixer", SND_SOC_NOPM, 0, 0, + primary_mi2s_rx_mixer_controls, + ARRAY_SIZE(primary_mi2s_rx_mixer_controls)), +@@ -178,12 +284,24 @@ static const struct snd_soc_dapm_route q6voice_dapm_routes[] = { + { "CS-Voice Capture Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX" }, + { "CS-Voice Capture Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX" }, + { "CS-VOICE_UL1", NULL, "CS-Voice Capture Mixer" }, ++ { "VoiceMMode1 Capture Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX" }, ++ { "VoiceMMode1 Capture Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX" }, ++ { "VoiceMMode1 Capture Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX" }, ++ { "VoiceMMode1 Capture Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX" }, ++ { "VoiceMMode1 Capture Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX" }, ++ { "VOICEMMODE1_UL1", NULL, "VoiceMMode1 Capture Mixer" }, + + { "PRI_MI2S_RX Voice Mixer", "CS-Voice", "CS-VOICE_DL1" }, + { "SEC_MI2S_RX Voice Mixer", "CS-Voice", "CS-VOICE_DL1" }, + { "TERT_MI2S_RX Voice Mixer", "CS-Voice", "CS-VOICE_DL1" }, + { "QUAT_MI2S_RX Voice Mixer", "CS-Voice", "CS-VOICE_DL1" }, + { "QUIN_MI2S_RX Voice Mixer", "CS-Voice", "CS-VOICE_DL1" }, ++ { "PRI_MI2S_RX Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL1" }, ++ { "SEC_MI2S_RX Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL1" }, ++ { "TERT_MI2S_RX Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL1" }, ++ { "QUAT_MI2S_RX Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL1" }, ++ { "QUIN_MI2S_RX Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL1" }, ++ + { "PRI_MI2S_RX", NULL, "PRI_MI2S_RX Voice Mixer" }, + { "SEC_MI2S_RX", NULL, "SEC_MI2S_RX Voice Mixer" }, + { "TERT_MI2S_RX", NULL, "TERT_MI2S_RX Voice Mixer" }, +diff --git a/sound/soc/qcom/qdsp6/q6voice.h b/sound/soc/qcom/qdsp6/q6voice.h +index 5b2d2dd679b34d..13b058c7303ac9 100644 +--- a/sound/soc/qcom/qdsp6/q6voice.h ++++ b/sound/soc/qcom/qdsp6/q6voice.h +@@ -3,14 +3,14 @@ + #define _Q6_VOICE_H + + enum q6voice_path_type { +- Q6VOICE_PATH_VOICE = 0, +- /* TODO: Q6VOICE_PATH_VOIP = 1, */ +- /* TODO: Q6VOICE_PATH_VOLTE = 2, */ +- /* TODO: Q6VOICE_PATH_VOICE2 = 3, */ +- /* TODO: Q6VOICE_PATH_QCHAT = 4, */ +- /* TODO: Q6VOICE_PATH_VOWLAN = 5, */ +- /* TODO: Q6VOICE_PATH_VOICEMMODE1 = 6, */ +- /* TODO: Q6VOICE_PATH_VOICEMMODE2 = 7, */ ++ Q6VOICE_PATH_VOICE = 0, ++ Q6VOICE_PATH_VOIP = 1, ++ Q6VOICE_PATH_VOLTE = 2, ++ Q6VOICE_PATH_VOICE2 = 3, ++ Q6VOICE_PATH_QCHAT = 4, ++ Q6VOICE_PATH_VOWLAN = 5, ++ Q6VOICE_PATH_VOICEMMODE1 = 6, ++ Q6VOICE_PATH_VOICEMMODE2 = 7, + Q6VOICE_PATH_COUNT + }; + + +From 878528f878a0ba52d3f972a600e7da05b6532540 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Otto=20Pfl=C3=BCger?= +Date: Tue, 12 Dec 2023 14:29:48 +0100 +Subject: [PATCH 11/11] fixup! ASoC: qcom: q6afe: provide fallback for digital + codec clock + +--- + sound/soc/qcom/qdsp6/q6afe.c | 55 +++++++++++++++++++----------------- + 1 file changed, 29 insertions(+), 26 deletions(-) + +diff --git a/sound/soc/qcom/qdsp6/q6afe.c b/sound/soc/qcom/qdsp6/q6afe.c +index 7b5d90e1452932..82b54abe519081 100644 +--- a/sound/soc/qcom/qdsp6/q6afe.c ++++ b/sound/soc/qcom/qdsp6/q6afe.c +@@ -1123,14 +1123,14 @@ static int q6afe_port_set_param(struct q6afe_port *port, void *data, + psize, port->token); + } + +-static int q6afe_port_set_param_v2(struct q6afe_port *port, void *data, +- int param_id, int module_id, int psize) ++static int q6afe_set_param_v2(struct q6afe *afe, struct q6afe_port *port, ++ void *data, int param_id, int module_id, int psize, ++ int token) + { + struct afe_port_cmd_set_param_v2 *param; + struct afe_port_param_data_v2 *pdata; +- struct q6afe *afe = port->afe; + struct apr_pkt *pkt; +- u16 port_id = port->id; ++ u16 port_id = port ? port->id : 0; + int ret, pkt_size; + void *p, *pl; + +@@ -1151,7 +1151,7 @@ static int q6afe_port_set_param_v2(struct q6afe_port *port, void *data, + pkt->hdr.pkt_size = pkt_size; + pkt->hdr.src_port = 0; + pkt->hdr.dest_port = 0; +- pkt->hdr.token = port->token; ++ pkt->hdr.token = token; + pkt->hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2; + + param->port_id = port_id; +@@ -1172,6 +1172,13 @@ static int q6afe_port_set_param_v2(struct q6afe_port *port, void *data, + return ret; + } + ++static int q6afe_port_set_param_v2(struct q6afe_port *port, void *data, ++ int param_id, int module_id, int psize) ++{ ++ return q6afe_set_param_v2(port->afe, port, data, param_id, module_id, ++ psize, port->token); ++} ++ + static int q6afe_port_set_lpass_clock(struct q6afe_port *port, + struct afe_clk_cfg *cfg) + { +@@ -1203,30 +1210,26 @@ int q6afe_set_lpass_clock(struct device *dev, int clk_id, int attri, + struct q6afe *afe = dev_get_drvdata(dev->parent); + struct afe_clk_set cset = {0,}; + +- /* +- * v2 clocks specified in the device tree may not be supported by the +- * firmware. If this is the digital codec core clock, fall back to the +- * old method for setting it. +- */ + if (q6core_get_adsp_version() < Q6_ADSP_VERSION_2_7) { +- struct q6afe_port *port; + struct afe_digital_clk_cfg dcfg = {0,}; +- int ret; + +- if (clk_id != Q6AFE_LPASS_CLK_ID_INTERNAL_DIGITAL_CODEC_CORE) +- return -EINVAL; +- +- port = q6afe_port_get_from_id(dev, PRIMARY_MI2S_RX); +- if (IS_ERR(port)) +- return PTR_ERR(port); +- +- dcfg.i2s_cfg_minor_version = AFE_API_VERSION_I2S_CONFIG; +- dcfg.clk_val = freq; +- dcfg.clk_root = 5; +- ret = q6afe_set_digital_codec_core_clock(port, &dcfg); +- +- q6afe_port_put(port); +- return ret; ++ switch (clk_id) { ++ /* ++ * DSP firmware versions below 2.7 do not support configuring internal ++ * digital codec core clk using AFE_PARAM_ID_CLOCK_SET ++ */ ++ case Q6AFE_LPASS_CLK_ID_INTERNAL_DIGITAL_CODEC_CORE: ++ dcfg.i2s_cfg_minor_version = AFE_API_VERSION_I2S_CONFIG; ++ dcfg.clk_val = freq; ++ dcfg.clk_root = 5; ++ return q6afe_set_param_v2(afe, NULL, &dcfg, ++ AFE_PARAM_ID_INT_DIGITAL_CDC_CLK_CONFIG, ++ AFE_MODULE_AUDIO_DEV_INTERFACE, ++ sizeof(dcfg), ++ AFE_CLK_TOKEN); ++ default: ++ break; ++ } + } + + cset.clk_set_minor_version = AFE_API_VERSION_CLOCK_SET; diff --git a/patches/kernel/0002-msm8905-nokia-beatles-and-coconut-dts.patch b/patches/kernel/0002-msm8905-nokia-beatles-and-coconut-dts.patch new file mode 100644 index 0000000..ac1f151 --- /dev/null +++ b/patches/kernel/0002-msm8905-nokia-beatles-and-coconut-dts.patch @@ -0,0 +1,44 @@ +--- a/devices/nokia-argon/qcom-msm8905-nokia-argon.dts 2026-10-18 12:03:41.241108254 +0300 ++++ b/devices/nokia-beatles/qcom-msm8905-nokia-beatles.dts 2026-10-18 12:03:41.241443705 +0300 +@@ -4,8 +4,8 @@ + #address-cells = <0x01>; + #size-cells = <0x01>; + interrupt-parent = <0x01>; +- model = "Nokia 8110 4G"; +- compatible = "nokia,argon", "qcom,msm8905", "qcom,msm8909"; ++ model = "Nokia 2720 Flip"; ++ compatible = "nokia,beatles", "nokia,argon", "qcom,msm8905", "qcom,msm8909"; + chassis-type = "handset"; + + aliases { +@@ -1733,7 +1733,7 @@ + status = "okay"; + + display@0 { +- compatible = "nokia,argon-gc9305-v2-panel", "panel-mipi-dbi-spi"; ++ compatible = "nokia,beatles-gc9305-panel", "nokia,argon-gc9305-v2-panel", "panel-mipi-dbi-spi"; + reg = <0x00>; + backlight = <0x6b>; + reset-gpios = <0x27 0x19 0x00>; +--- a/devices/nokia-argon/qcom-msm8905-nokia-argon.dts 2026-10-18 12:03:41.241108254 +0300 ++++ b/devices/nokia-tough/qcom-msm8905-nokia-coconut.dts 2026-10-18 12:03:41.241598417 +0300 +@@ -4,8 +4,8 @@ + #address-cells = <0x01>; + #size-cells = <0x01>; + interrupt-parent = <0x01>; +- model = "Nokia 8110 4G"; +- compatible = "nokia,argon", "qcom,msm8905", "qcom,msm8909"; ++ model = "Nokia 800 Tough"; ++ compatible = "nokia,coconut", "nokia,argon", "qcom,msm8905", "qcom,msm8909"; + chassis-type = "handset"; + + aliases { +@@ -1733,7 +1733,7 @@ + status = "okay"; + + display@0 { +- compatible = "nokia,argon-gc9305-v2-panel", "panel-mipi-dbi-spi"; ++ compatible = "nokia,coconut-gc9305-panel", "nokia,argon-gc9305-v2-panel", "panel-mipi-dbi-spi"; + reg = <0x00>; + backlight = <0x6b>; + reset-gpios = <0x27 0x19 0x00>; diff --git a/patches/kernel/config-bananarchy-msm8909.armv7 b/patches/kernel/config-bananarchy-msm8909.armv7 new file mode 100644 index 0000000..413afbd --- /dev/null +++ b/patches/kernel/config-bananarchy-msm8909.armv7 @@ -0,0 +1,7060 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm 6.12.1 Kernel Configuration +# +CONFIG_CC_VERSION_TEXT="armv7-alpine-linux-musleabihf-gcc (Alpine 15.2.0) 15.2.0" +CONFIG_CC_IS_GCC=y +CONFIG_GCC_VERSION=150200 +CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=24501 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=24501 +CONFIG_LLD_VERSION=0 +CONFIG_RUSTC_VERSION=0 +CONFIG_RUSTC_LLVM_VERSION=0 +CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y +CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y +CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_TABLE_SORT=y +CONFIG_THREAD_INFO_IN_TASK=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +# CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set +CONFIG_LOCALVERSION="-msm8916" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_BUILD_SALT="" +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_XZ=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_KERNEL_LZ4=y +CONFIG_KERNEL_GZIP=y +# CONFIG_KERNEL_LZMA is not set +# CONFIG_KERNEL_XZ is not set +# CONFIG_KERNEL_LZO is not set +# CONFIG_KERNEL_LZ4 is not set +CONFIG_DEFAULT_INIT="" +CONFIG_DEFAULT_HOSTNAME="(none)" +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_POSIX_MQUEUE=y +CONFIG_POSIX_MQUEUE_SYSCTL=y +# CONFIG_WATCH_QUEUE is not set +CONFIG_CROSS_MEMORY_ATTACH=y +# CONFIG_USELIB is not set +CONFIG_AUDIT=y +CONFIG_HAVE_ARCH_AUDITSYSCALL=y +CONFIG_AUDITSYSCALL=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y +CONFIG_GENERIC_IRQ_IPI=y +CONFIG_IRQ_MSI_IOMMU=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# CONFIG_GENERIC_IRQ_DEBUGFS is not set +# end of IRQ subsystem + +CONFIG_GENERIC_IRQ_MULTI_HANDLER=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_ARCH_HAS_TICK_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +# CONFIG_NO_HZ_FULL is not set +# CONFIG_NO_HZ is not set +CONFIG_HIGH_RES_TIMERS=y +# end of Timers subsystem + +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y + +# +# BPF subsystem +# +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_BPF_JIT_ALWAYS_ON=y +CONFIG_BPF_JIT_DEFAULT_ON=y +CONFIG_BPF_UNPRIV_DEFAULT_OFF=y +# CONFIG_BPF_PRELOAD is not set +CONFIG_BPF_LSM=y +# end of BPF subsystem + +CONFIG_PREEMPT_BUILD=y +# CONFIG_PREEMPT_NONE is not set +# CONFIG_PREEMPT_VOLUNTARY is not set +CONFIG_PREEMPT=y +CONFIG_PREEMPT_COUNT=y +CONFIG_PREEMPTION=y +# CONFIG_SCHED_CORE is not set + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set +CONFIG_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_SCHED_AVG_IRQ=y +CONFIG_SCHED_HW_PRESSURE=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_TASK_XACCT=y +CONFIG_TASK_IO_ACCOUNTING=y +CONFIG_PSI=y +# CONFIG_PSI_DEFAULT_DISABLED is not set +# end of CPU/Task time and stats accounting + +CONFIG_CPU_ISOLATION=y + +# +# RCU Subsystem +# +CONFIG_TREE_RCU=y +CONFIG_PREEMPT_RCU=y +# CONFIG_RCU_EXPERT is not set +CONFIG_TREE_SRCU=y +CONFIG_NEED_SRCU_NMI_SAFE=y +CONFIG_TASKS_RCU_GENERIC=y +CONFIG_NEED_TASKS_RCU=y +CONFIG_TASKS_RCU=y +CONFIG_TASKS_RUDE_RCU=y +CONFIG_TASKS_TRACE_RCU=y +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +# end of RCU Subsystem + +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +# CONFIG_IKHEADERS is not set +CONFIG_LOG_BUF_SHIFT=17 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +# CONFIG_PRINTK_INDEX is not set +CONFIG_GENERIC_SCHED_CLOCK=y + +# +# Scheduler features +# +CONFIG_UCLAMP_TASK=y +CONFIG_UCLAMP_BUCKETS_COUNT=5 +# end of Scheduler features + +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC10_NO_ARRAY_BOUNDS=y +CONFIG_CC_NO_ARRAY_BOUNDS=y +CONFIG_GCC_NO_STRINGOP_OVERFLOW=y +CONFIG_CC_NO_STRINGOP_OVERFLOW=y +CONFIG_SLAB_OBJ_EXT=y +CONFIG_CGROUPS=y +CONFIG_PAGE_COUNTER=y +# CONFIG_CGROUP_FAVOR_DYNMODS is not set +CONFIG_MEMCG=y +# CONFIG_MEMCG_V1 is not set +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_WRITEBACK=y +CONFIG_CGROUP_SCHED=y +CONFIG_GROUP_SCHED_WEIGHT=y +CONFIG_FAIR_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +# CONFIG_RT_GROUP_SCHED is not set +CONFIG_SCHED_MM_CID=y +CONFIG_UCLAMP_TASK_GROUP=y +CONFIG_CGROUP_PIDS=y +# CONFIG_CGROUP_RDMA is not set +CONFIG_CGROUP_FREEZER=y +CONFIG_CPUSETS=y +# CONFIG_CPUSETS_V1 is not set +CONFIG_PROC_PID_CPUSET=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +# CONFIG_CGROUP_MISC is not set +CONFIG_SOCK_CGROUP_DATA=y +CONFIG_NAMESPACES=y +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_USER_NS=y +CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_CHECKPOINT_RESTORE=y +CONFIG_SCHED_AUTOGROUP=y +# CONFIG_RELAY is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_RD_GZIP=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_RD_XZ=y +CONFIG_RD_LZO=y +CONFIG_RD_LZ4=y +CONFIG_RD_ZSTD=y +# CONFIG_BOOT_CONFIG is not set +CONFIG_INITRAMFS_PRESERVE_MTIME=y +CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_HAVE_LD_DEAD_CODE_DATA_ELIMINATION=y +CONFIG_LD_ORPHAN_WARN=y +CONFIG_LD_ORPHAN_WARN_LEVEL="warn" +CONFIG_SYSCTL=y +CONFIG_HAVE_UID16=y +# CONFIG_EXPERT is not set +CONFIG_UID16=y +CONFIG_MULTIUSER=y +CONFIG_SYSFS_SYSCALL=y +CONFIG_FHANDLE=y +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_IO_URING=y +CONFIG_ADVISE_SYSCALLS=y +CONFIG_MEMBARRIER=y +CONFIG_KCMP=y +CONFIG_RSEQ=y +CONFIG_CACHESTAT_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_SELFTEST is not set +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_HAVE_PERF_EVENTS=y +CONFIG_PERF_USE_VMALLOC=y + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# end of Kernel Performance Events And Counters + +CONFIG_SYSTEM_DATA_VERIFICATION=y +CONFIG_PROFILING=y +CONFIG_TRACEPOINTS=y + +# +# Kexec and crash features +# +# end of Kexec and crash features +# end of General setup + +CONFIG_ARM=y +CONFIG_ARM_HAS_GROUP_RELOCS=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_HAVE_PROC_CPU=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_ARM_PATCH_PHYS_VIRT=y +CONFIG_GENERIC_BUG=y +CONFIG_PGTABLE_LEVELS=2 + +# +# System Type +# +CONFIG_MMU=y +CONFIG_ARCH_MMAP_RND_BITS_MIN=8 +CONFIG_ARCH_MMAP_RND_BITS_MAX=16 +CONFIG_ARCH_MULTIPLATFORM=y + +# +# Platform selection +# + +# +# CPU Core family selection +# +# CONFIG_ARCH_MULTI_V6 is not set +CONFIG_ARCH_MULTI_V7=y +CONFIG_ARCH_MULTI_V6_V7=y +# end of Platform selection + +# CONFIG_ARCH_VIRT is not set +# CONFIG_ARCH_AIROHA is not set +# CONFIG_ARCH_RDA is not set +# CONFIG_ARCH_SUNPLUS is not set +# CONFIG_ARCH_UNIPHIER is not set +# CONFIG_ARCH_ACTIONS is not set +# CONFIG_ARCH_ALPINE is not set +# CONFIG_ARCH_ARTPEC is not set +# CONFIG_ARCH_ASPEED is not set +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_BCM is not set +# CONFIG_ARCH_BERLIN is not set +# CONFIG_ARCH_DIGICOLOR is not set +# CONFIG_ARCH_EXYNOS is not set +# CONFIG_ARCH_HIGHBANK is not set +# CONFIG_ARCH_HISI is not set +# CONFIG_ARCH_HPE is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_KEYSTONE is not set +# CONFIG_ARCH_MEDIATEK is not set +# CONFIG_ARCH_MESON is not set +# CONFIG_ARCH_MILBEAUT is not set +# CONFIG_ARCH_MMP is not set +# CONFIG_ARCH_MSTARV7 is not set +# CONFIG_ARCH_MVEBU is not set +# CONFIG_ARCH_NPCM is not set + +# +# TI OMAP/AM/DM/DRA Family +# +# CONFIG_ARCH_OMAP3 is not set +# CONFIG_ARCH_OMAP4 is not set +# CONFIG_SOC_OMAP5 is not set +# CONFIG_SOC_AM33XX is not set +# CONFIG_SOC_AM43XX is not set +# CONFIG_SOC_DRA7XX is not set +# end of TI OMAP/AM/DM/DRA Family + +CONFIG_ARCH_QCOM=y +# CONFIG_ARCH_QCOM_RESERVE_SMEM is not set +# CONFIG_ARCH_REALTEK is not set +# CONFIG_ARCH_ROCKCHIP is not set +# CONFIG_ARCH_S5PV210 is not set +# CONFIG_ARCH_RENESAS is not set +# CONFIG_ARCH_INTEL_SOCFPGA is not set +# CONFIG_PLAT_SPEAR is not set +# CONFIG_ARCH_STI is not set +# CONFIG_ARCH_STM32 is not set +# CONFIG_ARCH_SUNXI is not set +# CONFIG_ARCH_TEGRA is not set +# CONFIG_ARCH_U8500 is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VEXPRESS is not set +# CONFIG_ARCH_WM8850 is not set +# CONFIG_ARCH_ZYNQ is not set + +# +# Processor Type +# +CONFIG_CPU_V7=y +CONFIG_CPU_THUMB_CAPABLE=y +CONFIG_CPU_32v6K=y +CONFIG_CPU_32v7=y +CONFIG_CPU_ABRT_EV7=y +CONFIG_CPU_PABRT_V7=y +CONFIG_CPU_CACHE_V7=y +CONFIG_CPU_CACHE_VIPT=y +CONFIG_CPU_COPY_V6=y +CONFIG_CPU_TLB_V7=y +CONFIG_CPU_HAS_ASID=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +# CONFIG_ARM_LPAE is not set +CONFIG_ARM_THUMB=y +# CONFIG_ARM_THUMBEE is not set +CONFIG_ARM_VIRT_EXT=y +CONFIG_SWP_EMULATE=y +CONFIG_CPU_LITTLE_ENDIAN=y +# CONFIG_CPU_BIG_ENDIAN is not set +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set +# CONFIG_CPU_BPREDICT_DISABLE is not set +CONFIG_CPU_SPECTRE=y +CONFIG_HARDEN_BRANCH_PREDICTOR=y +CONFIG_HARDEN_BRANCH_HISTORY=y +CONFIG_KUSER_HELPERS=y +CONFIG_VDSO=y +CONFIG_MIGHT_HAVE_CACHE_L2X0=y +# CONFIG_CACHE_L2X0 is not set +CONFIG_ARM_L1_CACHE_SHIFT_6=y +CONFIG_ARM_L1_CACHE_SHIFT=6 +CONFIG_ARM_DMA_MEM_BUFFERABLE=y +CONFIG_DEBUG_ALIGN_RODATA=y +# CONFIG_ARM_ERRATA_430973 is not set +# CONFIG_ARM_ERRATA_643719 is not set +# CONFIG_ARM_ERRATA_720789 is not set +# CONFIG_ARM_ERRATA_754322 is not set +# CONFIG_ARM_ERRATA_754327 is not set +# CONFIG_ARM_ERRATA_764369 is not set +# CONFIG_ARM_ERRATA_764319 is not set +# CONFIG_ARM_ERRATA_775420 is not set +# CONFIG_ARM_ERRATA_798181 is not set +# CONFIG_ARM_ERRATA_773022 is not set +# CONFIG_ARM_ERRATA_818325_852422 is not set +# CONFIG_ARM_ERRATA_821420 is not set +# CONFIG_ARM_ERRATA_825619 is not set +# CONFIG_ARM_ERRATA_857271 is not set +# CONFIG_ARM_ERRATA_852421 is not set +# CONFIG_ARM_ERRATA_852423 is not set +# CONFIG_ARM_ERRATA_857272 is not set +# end of System Type + +# +# Bus support +# +# CONFIG_ARM_ERRATA_814220 is not set +# end of Bus support + +# +# Kernel Features +# +CONFIG_HAVE_SMP=y +CONFIG_SMP=y +CONFIG_SMP_ON_UP=y +CONFIG_CURRENT_POINTER_IN_TPIDRURO=y +CONFIG_IRQSTACKS=y +CONFIG_ARM_CPU_TOPOLOGY=y +CONFIG_SCHED_MC=y +CONFIG_SCHED_SMT=y +CONFIG_HAVE_ARM_ARCH_TIMER=y +# CONFIG_MCPM is not set +# CONFIG_BIG_LITTLE is not set +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_3G_OPT is not set +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_1G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_NR_CPUS=8 +CONFIG_HOTPLUG_CPU=y +CONFIG_ARM_PSCI=y +CONFIG_HZ_FIXED=0 +# CONFIG_HZ_100 is not set +# CONFIG_HZ_200 is not set +# CONFIG_HZ_250 is not set +CONFIG_HZ_300=y +# CONFIG_HZ_500 is not set +# CONFIG_HZ_1000 is not set +CONFIG_HZ=300 +CONFIG_SCHED_HRTICK=y +# CONFIG_THUMB2_KERNEL is not set +CONFIG_ARM_PATCH_IDIV=y +CONFIG_AEABI=y +# CONFIG_OABI_COMPAT is not set +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_FLATMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_HIGHMEM=y +CONFIG_HIGHPTE=y +CONFIG_ARM_PAN=y +CONFIG_CPU_SW_DOMAIN_PAN=y +CONFIG_HW_PERF_EVENTS=y +CONFIG_ARM_MODULE_PLTS=y +CONFIG_ARCH_FORCE_MAX_ORDER=10 +CONFIG_ALIGNMENT_TRAP=y +# CONFIG_UACCESS_WITH_MEMCPY is not set +# CONFIG_PARAVIRT is not set +# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set +# CONFIG_XEN is not set +CONFIG_CC_HAVE_STACKPROTECTOR_TLS=y +CONFIG_STACKPROTECTOR_PER_TASK=y +# end of Kernel Features + +# +# Boot options +# +CONFIG_USE_OF=y +CONFIG_ARCH_WANT_FLAT_DTB_INSTALL=y +# CONFIG_ATAGS is not set +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +# CONFIG_ARM_APPENDED_DTB is not set +CONFIG_CMDLINE="" +CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y +CONFIG_ARCH_DEFAULT_CRASH_DUMP=y +CONFIG_AUTO_ZRELADDR=y +CONFIG_EFI_STUB=y +CONFIG_EFI=y +CONFIG_DMI=y +# end of Boot options + +# +# CPU Power Management +# + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_STAT=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=m +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y + +# +# CPU frequency scaling drivers +# +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_ARM_QCOM_CPUFREQ_NVMEM=y +# CONFIG_ARM_QCOM_CPUFREQ_HW is not set +# end of CPU Frequency scaling + +# +# CPU Idle +# +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y +# CONFIG_CPU_IDLE_GOV_LADDER is not set +CONFIG_CPU_IDLE_GOV_MENU=y +# CONFIG_CPU_IDLE_GOV_TEO is not set +CONFIG_DT_IDLE_STATES=y +CONFIG_DT_IDLE_GENPD=y + +# +# ARM CPU Idle Drivers +# +# CONFIG_ARM_CPUIDLE is not set +CONFIG_ARM_PSCI_CPUIDLE=y +CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y +# CONFIG_ARM_HIGHBANK_CPUIDLE is not set +CONFIG_ARM_QCOM_SPM_CPUIDLE=y +# end of ARM CPU Idle Drivers +# end of CPU Idle +# end of CPU Power Management + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_VFP=y +CONFIG_VFPv3=y +CONFIG_NEON=y +CONFIG_KERNEL_MODE_NEON=y +# end of Floating point emulation + +# +# Power management options +# +# CONFIG_SUSPEND is not set +# CONFIG_HIBERNATION is not set +CONFIG_PM=y +# CONFIG_PM_DEBUG is not set +# CONFIG_APM_EMULATION is not set +CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +CONFIG_CPU_PM=y +# CONFIG_ENERGY_MODEL is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARM_CPU_SUSPEND=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +# end of Power management options + +CONFIG_AS_VFP_VMRS_FPINST=y +CONFIG_CPU_MITIGATIONS=y +CONFIG_ARCH_HAS_DMA_OPS=y + +# +# General architecture-dependent options +# +CONFIG_HOTPLUG_CORE_SYNC=y +CONFIG_HOTPLUG_CORE_SYNC_DEAD=y +CONFIG_KPROBES=y +CONFIG_JUMP_LABEL=y +# CONFIG_STATIC_KEYS_SELFTEST is not set +CONFIG_OPTPROBES=y +CONFIG_UPROBES=y +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_ARCH_USE_BUILTIN_BSWAP=y +CONFIG_KRETPROBES=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_OPTPROBES=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y +CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_KEEPINITRD=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_ARCH_32BIT_OFF_T=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_MMU_LAZY_TLB_REFCOUNT=y +CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y +CONFIG_HAVE_ARCH_SECCOMP=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP=y +CONFIG_SECCOMP_FILTER=y +# CONFIG_SECCOMP_CACHE_DEBUG is not set +CONFIG_HAVE_ARCH_STACKLEAK=y +CONFIG_HAVE_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_REL=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_HAVE_EXIT_THREAD=y +CONFIG_ARCH_MMAP_RND_BITS=8 +CONFIG_HAVE_PAGE_SIZE_4KB=y +CONFIG_PAGE_SIZE_4KB=y +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_PAGE_SHIFT=12 +CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_OLD_SIGACTION=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_HAVE_ARCH_VMAP_STACK=y +CONFIG_VMAP_STACK=y +CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y +CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y +# CONFIG_LOCK_EVENT_COUNTS is not set +CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_HAVE_ARCH_PFN_VALID=y + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +# end of GCOV-based kernel profiling + +CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +CONFIG_FUNCTION_ALIGNMENT=0 +CONFIG_CC_HAS_MIN_FUNCTION_ALIGNMENT=y +CONFIG_CC_HAS_SANE_FUNCTION_ALIGNMENT=y +# end of General architecture-dependent options + +CONFIG_RT_MUTEXES=y +CONFIG_MODULES=y +# CONFIG_MODULE_DEBUG is not set +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set +# CONFIG_MODVERSIONS is not set +CONFIG_MODULE_SRCVERSION_ALL=y +# CONFIG_MODULE_SIG is not set +CONFIG_MODULE_COMPRESS=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +CONFIG_MODULE_COMPRESS_ZSTD=y +CONFIG_MODULE_COMPRESS_ALL=y +CONFIG_MODULE_DECOMPRESS=y +# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" +# CONFIG_TRIM_UNUSED_KSYMS is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_CGROUP_RWSTAT=y +CONFIG_BLK_CGROUP_PUNT_BIO=y +CONFIG_BLK_DEV_BSG_COMMON=y +CONFIG_BLK_ICQ=y +# CONFIG_BLK_DEV_BSGLIB is not set +CONFIG_BLK_DEV_INTEGRITY=y +CONFIG_BLK_DEV_WRITE_MOUNTED=y +# CONFIG_BLK_DEV_ZONED is not set +CONFIG_BLK_DEV_THROTTLING=y +# CONFIG_BLK_WBT is not set +# CONFIG_BLK_CGROUP_IOLATENCY is not set +# CONFIG_BLK_CGROUP_IOCOST is not set +# CONFIG_BLK_CGROUP_IOPRIO is not set +CONFIG_BLK_DEBUG_FS=y +# CONFIG_BLK_SED_OPAL is not set +# CONFIG_BLK_INLINE_ENCRYPTION is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_EFI_PARTITION=y +# end of Partition Types + +CONFIG_BLK_MQ_VIRTIO=y +CONFIG_BLK_PM=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y + +# +# IO Schedulers +# +CONFIG_MQ_IOSCHED_DEADLINE=y +CONFIG_MQ_IOSCHED_KYBER=y +CONFIG_IOSCHED_BFQ=y +CONFIG_BFQ_GROUP_IOSCHED=y +# CONFIG_BFQ_CGROUP_DEBUG is not set +# end of IO Schedulers + +CONFIG_ASN1=y +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y +CONFIG_FREEZER=y + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_ELF_FDPIC is not set +CONFIG_ELFCORE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y +CONFIG_BINFMT_SCRIPT=y +CONFIG_ARCH_HAS_BINFMT_FLAT=y +# CONFIG_BINFMT_FLAT is not set +CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y +CONFIG_BINFMT_MISC=m +CONFIG_COREDUMP=y +# end of Executable file formats + +# +# Memory Management options +# +CONFIG_SWAP=y +# CONFIG_ZSWAP is not set +CONFIG_ZSMALLOC=m +# CONFIG_ZSMALLOC_STAT is not set +CONFIG_ZSMALLOC_CHAIN_SIZE=8 + +# +# Slab allocator options +# +CONFIG_SLUB=y +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLAB_BUCKETS is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# CONFIG_RANDOM_KMALLOC_CACHES is not set +# end of Slab allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_EXCLUSIVE_SYSTEM_RAM=y +CONFIG_SPLIT_PTE_PTLOCKS=y +CONFIG_COMPACTION=y +CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 +# CONFIG_PAGE_REPORTING is not set +CONFIG_MIGRATION=y +CONFIG_CONTIG_ALLOC=y +CONFIG_PCP_BATCH_SCALE_MAX=5 +CONFIG_BOUNCE=y +CONFIG_KSM=y +CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y +CONFIG_CMA=y +# CONFIG_CMA_DEBUGFS is not set +# CONFIG_CMA_SYSFS is not set +CONFIG_CMA_AREAS=8 +CONFIG_GENERIC_EARLY_IOREMAP=y +# CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CPU_CACHE_ALIASING=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y +CONFIG_VM_EVENT_COUNTERS=y +# CONFIG_PERCPU_STATS is not set +# CONFIG_GUP_TEST is not set +# CONFIG_DMAPOOL_TEST is not set +CONFIG_KMAP_LOCAL=y +CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY=y +CONFIG_MEMFD_CREATE=y +# CONFIG_ANON_VMA_NAME is not set +# CONFIG_USERFAULTFD is not set +CONFIG_LRU_GEN=y +CONFIG_LRU_GEN_ENABLED=y +# CONFIG_LRU_GEN_STATS is not set +CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y +CONFIG_PER_VMA_LOCK=y +CONFIG_LOCK_MM_AND_FIND_VMA=y +CONFIG_EXECMEM=y + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring +# end of Memory Management options + +CONFIG_NET=y +CONFIG_NET_INGRESS=y +CONFIG_NET_EGRESS=y +CONFIG_NET_XGRESS=y +CONFIG_SKB_EXTENSIONS=y +CONFIG_NET_DEVMEM=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_DIAG is not set +CONFIG_UNIX=y +CONFIG_AF_UNIX_OOB=y +# CONFIG_UNIX_DIAG is not set +# CONFIG_TLS is not set +# CONFIG_XFRM_USER is not set +# CONFIG_NET_KEY is not set +# CONFIG_XDP_SOCKETS is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +# CONFIG_IP_FIB_TRIE_STATS is not set +CONFIG_IP_MULTIPLE_TABLES=y +# CONFIG_IP_ROUTE_MULTIPATH is not set +# CONFIG_IP_ROUTE_VERBOSE is not set +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE_DEMUX is not set +CONFIG_NET_IP_TUNNEL=m +# CONFIG_IP_MROUTE is not set +CONFIG_SYN_COOKIES=y +# CONFIG_NET_IPVTI is not set +CONFIG_NET_UDP_TUNNEL=m +# CONFIG_NET_FOU is not set +# CONFIG_NET_FOU_IP_TUNNELS is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 +CONFIG_INET_TUNNEL=m +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_INET_UDP_DIAG is not set +# CONFIG_INET_RAW_DIAG is not set +# CONFIG_INET_DIAG_DESTROY is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +CONFIG_IPV6=m +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +# CONFIG_INET6_AH is not set +# CONFIG_INET6_ESP is not set +# CONFIG_INET6_IPCOMP is not set +# CONFIG_IPV6_MIP6 is not set +# CONFIG_IPV6_ILA is not set +# CONFIG_IPV6_VTI is not set +CONFIG_IPV6_SIT=m +# CONFIG_IPV6_SIT_6RD is not set +CONFIG_IPV6_NDISC_NODETYPE=y +# CONFIG_IPV6_TUNNEL is not set +CONFIG_IPV6_MULTIPLE_TABLES=y +# CONFIG_IPV6_SUBTREES is not set +# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6_SEG6_LWTUNNEL is not set +# CONFIG_IPV6_SEG6_HMAC is not set +# CONFIG_IPV6_RPL_LWTUNNEL is not set +# CONFIG_IPV6_IOAM6_LWTUNNEL is not set +# CONFIG_NETLABEL is not set +# CONFIG_MPTCP is not set +# CONFIG_NETWORK_SECMARK is not set +CONFIG_NET_PTP_CLASSIFY=y +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +CONFIG_NETFILTER=y +CONFIG_NETFILTER_ADVANCED=y +CONFIG_BRIDGE_NETFILTER=m + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_INGRESS=y +CONFIG_NETFILTER_EGRESS=y +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_FAMILY_BRIDGE=y +CONFIG_NETFILTER_BPF_LINK=y +# CONFIG_NETFILTER_NETLINK_HOOK is not set +# CONFIG_NETFILTER_NETLINK_ACCT is not set +# CONFIG_NETFILTER_NETLINK_QUEUE is not set +# CONFIG_NETFILTER_NETLINK_LOG is not set +# CONFIG_NETFILTER_NETLINK_OSF is not set +CONFIG_NF_CONNTRACK=m +CONFIG_NF_LOG_SYSLOG=m +CONFIG_NF_CONNTRACK_MARK=y +# CONFIG_NF_CONNTRACK_ZONES is not set +# CONFIG_NF_CONNTRACK_PROCFS is not set +CONFIG_NF_CONNTRACK_EVENTS=y +# CONFIG_NF_CONNTRACK_TIMEOUT is not set +# CONFIG_NF_CONNTRACK_TIMESTAMP is not set +# CONFIG_NF_CONNTRACK_LABELS is not set +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +# CONFIG_NF_CONNTRACK_AMANDA is not set +# CONFIG_NF_CONNTRACK_FTP is not set +# CONFIG_NF_CONNTRACK_H323 is not set +# CONFIG_NF_CONNTRACK_IRC is not set +# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set +# CONFIG_NF_CONNTRACK_SNMP is not set +# CONFIG_NF_CONNTRACK_PPTP is not set +# CONFIG_NF_CONNTRACK_SANE is not set +# CONFIG_NF_CONNTRACK_SIP is not set +# CONFIG_NF_CONNTRACK_TFTP is not set +# CONFIG_NF_CT_NETLINK is not set +CONFIG_NF_NAT=m +CONFIG_NF_NAT_REDIRECT=y +CONFIG_NF_NAT_MASQUERADE=y +CONFIG_NF_TABLES=m +CONFIG_NF_TABLES_INET=y +# CONFIG_NF_TABLES_NETDEV is not set +# CONFIG_NFT_NUMGEN is not set +CONFIG_NFT_CT=m +# CONFIG_NFT_CONNLIMIT is not set +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +# CONFIG_NFT_REDIR is not set +CONFIG_NFT_NAT=m +# CONFIG_NFT_TUNNEL is not set +# CONFIG_NFT_QUOTA is not set +CONFIG_NFT_REJECT=m +CONFIG_NFT_REJECT_INET=m +CONFIG_NFT_COMPAT=m +# CONFIG_NFT_HASH is not set +CONFIG_NFT_FIB=m +# CONFIG_NFT_FIB_INET is not set +# CONFIG_NFT_SOCKET is not set +# CONFIG_NFT_OSF is not set +# CONFIG_NFT_TPROXY is not set +# CONFIG_NFT_SYNPROXY is not set +# CONFIG_NF_FLOW_TABLE is not set +CONFIG_NETFILTER_XTABLES=m + +# +# Xtables combined modules +# +CONFIG_NETFILTER_XT_MARK=m +# CONFIG_NETFILTER_XT_CONNMARK is not set + +# +# Xtables targets +# +# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set +# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set +# CONFIG_NETFILTER_XT_TARGET_CT is not set +# CONFIG_NETFILTER_XT_TARGET_DSCP is not set +# CONFIG_NETFILTER_XT_TARGET_HL is not set +# CONFIG_NETFILTER_XT_TARGET_HMARK is not set +# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set +# CONFIG_NETFILTER_XT_TARGET_LED is not set +CONFIG_NETFILTER_XT_TARGET_LOG=m +# CONFIG_NETFILTER_XT_TARGET_MARK is not set +CONFIG_NETFILTER_XT_NAT=m +# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set +# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set +# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set +# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set +CONFIG_NETFILTER_XT_TARGET_REDIRECT=m +CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m +# CONFIG_NETFILTER_XT_TARGET_TEE is not set +# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set +# CONFIG_NETFILTER_XT_TARGET_TRACE is not set +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set + +# +# Xtables matches +# +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +# CONFIG_NETFILTER_XT_MATCH_BPF is not set +# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set +# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set +# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +# CONFIG_NETFILTER_XT_MATCH_CPU is not set +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set +# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set +# CONFIG_NETFILTER_XT_MATCH_ECN is not set +# CONFIG_NETFILTER_XT_MATCH_ESP is not set +# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_HELPER is not set +# CONFIG_NETFILTER_XT_MATCH_HL is not set +# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set +# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set +CONFIG_NETFILTER_XT_MATCH_IPVS=m +# CONFIG_NETFILTER_XT_MATCH_L2TP is not set +# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set +# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_MAC is not set +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set +# CONFIG_NETFILTER_XT_MATCH_OSF is not set +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set +# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set +# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set +# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set +# CONFIG_NETFILTER_XT_MATCH_REALM is not set +# CONFIG_NETFILTER_XT_MATCH_RECENT is not set +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set +# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set +# CONFIG_NETFILTER_XT_MATCH_STATE is not set +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +# CONFIG_NETFILTER_XT_MATCH_STRING is not set +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +# CONFIG_NETFILTER_XT_MATCH_TIME is not set +# CONFIG_NETFILTER_XT_MATCH_U32 is not set +# end of Core Netfilter Configuration + +# CONFIG_IP_SET is not set +CONFIG_IP_VS=m +# CONFIG_IP_VS_IPV6 is not set +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +# CONFIG_IP_VS_PROTO_ESP is not set +# CONFIG_IP_VS_PROTO_AH is not set +# CONFIG_IP_VS_PROTO_SCTP is not set + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +# CONFIG_IP_VS_WRR is not set +# CONFIG_IP_VS_LC is not set +# CONFIG_IP_VS_WLC is not set +# CONFIG_IP_VS_FO is not set +# CONFIG_IP_VS_OVF is not set +# CONFIG_IP_VS_LBLC is not set +# CONFIG_IP_VS_LBLCR is not set +# CONFIG_IP_VS_DH is not set +# CONFIG_IP_VS_SH is not set +# CONFIG_IP_VS_MH is not set +# CONFIG_IP_VS_SED is not set +# CONFIG_IP_VS_NQ is not set +# CONFIG_IP_VS_TWOS is not set + +# +# IPVS SH scheduler +# +CONFIG_IP_VS_SH_TAB_BITS=8 + +# +# IPVS MH scheduler +# +CONFIG_IP_VS_MH_TAB_INDEX=12 + +# +# IPVS application helper +# +CONFIG_IP_VS_NFCT=y + +# +# IP: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV4=m +CONFIG_IP_NF_IPTABLES_LEGACY=m +# CONFIG_NF_SOCKET_IPV4 is not set +# CONFIG_NF_TPROXY_IPV4 is not set +CONFIG_NF_TABLES_IPV4=y +CONFIG_NFT_REJECT_IPV4=m +# CONFIG_NFT_DUP_IPV4 is not set +CONFIG_NFT_FIB_IPV4=m +# CONFIG_NF_TABLES_ARP is not set +# CONFIG_NF_DUP_IPV4 is not set +# CONFIG_NF_LOG_ARP is not set +# CONFIG_NF_LOG_IPV4 is not set +CONFIG_NF_REJECT_IPV4=m +CONFIG_IP_NF_IPTABLES=m +# CONFIG_IP_NF_MATCH_AH is not set +# CONFIG_IP_NF_MATCH_ECN is not set +# CONFIG_IP_NF_MATCH_RPFILTER is not set +# CONFIG_IP_NF_MATCH_TTL is not set +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +# CONFIG_IP_NF_TARGET_SYNPROXY is not set +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +# CONFIG_IP_NF_TARGET_NETMAP is not set +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_MANGLE=m +# CONFIG_IP_NF_TARGET_ECN is not set +# CONFIG_IP_NF_TARGET_TTL is not set +CONFIG_IP_NF_RAW=m +# CONFIG_IP_NF_SECURITY is not set +# CONFIG_IP_NF_ARPFILTER is not set +# end of IP: Netfilter Configuration + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_IPTABLES_LEGACY=m +# CONFIG_NF_SOCKET_IPV6 is not set +# CONFIG_NF_TPROXY_IPV6 is not set +CONFIG_NF_TABLES_IPV6=y +CONFIG_NFT_REJECT_IPV6=m +# CONFIG_NFT_DUP_IPV6 is not set +CONFIG_NFT_FIB_IPV6=m +# CONFIG_NF_DUP_IPV6 is not set +CONFIG_NF_REJECT_IPV6=m +CONFIG_NF_LOG_IPV6=m +CONFIG_IP6_NF_IPTABLES=m +# CONFIG_IP6_NF_MATCH_AH is not set +# CONFIG_IP6_NF_MATCH_EUI64 is not set +# CONFIG_IP6_NF_MATCH_FRAG is not set +# CONFIG_IP6_NF_MATCH_OPTS is not set +# CONFIG_IP6_NF_MATCH_HL is not set +# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set +# CONFIG_IP6_NF_MATCH_MH is not set +# CONFIG_IP6_NF_MATCH_RPFILTER is not set +# CONFIG_IP6_NF_MATCH_RT is not set +# CONFIG_IP6_NF_MATCH_SRH is not set +# CONFIG_IP6_NF_TARGET_HL is not set +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_REJECT=m +# CONFIG_IP6_NF_TARGET_SYNPROXY is not set +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_RAW=m +# CONFIG_IP6_NF_SECURITY is not set +CONFIG_IP6_NF_NAT=m +CONFIG_IP6_NF_TARGET_MASQUERADE=m +# CONFIG_IP6_NF_TARGET_NPT is not set +# end of IPv6: Netfilter Configuration + +CONFIG_NF_DEFRAG_IPV6=m +# CONFIG_NF_TABLES_BRIDGE is not set +# CONFIG_NF_CONNTRACK_BRIDGE is not set +# CONFIG_BRIDGE_NF_EBTABLES is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_RDS is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_L2TP is not set +CONFIG_STP=m +CONFIG_GARP=m +CONFIG_MRP=m +CONFIG_BRIDGE=m +CONFIG_BRIDGE_IGMP_SNOOPING=y +CONFIG_BRIDGE_VLAN_FILTERING=y +# CONFIG_BRIDGE_MRP is not set +# CONFIG_BRIDGE_CFM is not set +# CONFIG_NET_DSA is not set +CONFIG_VLAN_8021Q=m +CONFIG_VLAN_8021Q_GVRP=y +CONFIG_VLAN_8021Q_MVRP=y +CONFIG_LLC=m +# CONFIG_LLC2 is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +# CONFIG_6LOWPAN is not set +# CONFIG_IEEE802154 is not set +CONFIG_NET_SCHED=y + +# +# Queueing/Scheduling +# +# CONFIG_NET_SCH_HTB is not set +# CONFIG_NET_SCH_HFSC is not set +# CONFIG_NET_SCH_PRIO is not set +# CONFIG_NET_SCH_MULTIQ is not set +# CONFIG_NET_SCH_RED is not set +# CONFIG_NET_SCH_SFB is not set +# CONFIG_NET_SCH_SFQ is not set +# CONFIG_NET_SCH_TEQL is not set +# CONFIG_NET_SCH_TBF is not set +# CONFIG_NET_SCH_CBS is not set +# CONFIG_NET_SCH_ETF is not set +# CONFIG_NET_SCH_TAPRIO is not set +# CONFIG_NET_SCH_GRED is not set +# CONFIG_NET_SCH_NETEM is not set +# CONFIG_NET_SCH_DRR is not set +# CONFIG_NET_SCH_MQPRIO is not set +# CONFIG_NET_SCH_SKBPRIO is not set +# CONFIG_NET_SCH_CHOKE is not set +# CONFIG_NET_SCH_QFQ is not set +# CONFIG_NET_SCH_CODEL is not set +# CONFIG_NET_SCH_FQ_CODEL is not set +# CONFIG_NET_SCH_CAKE is not set +# CONFIG_NET_SCH_FQ is not set +# CONFIG_NET_SCH_HHF is not set +# CONFIG_NET_SCH_PIE is not set +# CONFIG_NET_SCH_PLUG is not set +# CONFIG_NET_SCH_ETS is not set +# CONFIG_NET_SCH_DEFAULT is not set + +# +# Classification +# +CONFIG_NET_CLS=y +# CONFIG_NET_CLS_BASIC is not set +# CONFIG_NET_CLS_ROUTE4 is not set +# CONFIG_NET_CLS_FW is not set +# CONFIG_NET_CLS_U32 is not set +# CONFIG_NET_CLS_FLOW is not set +CONFIG_NET_CLS_CGROUP=m +# CONFIG_NET_CLS_BPF is not set +# CONFIG_NET_CLS_FLOWER is not set +# CONFIG_NET_CLS_MATCHALL is not set +# CONFIG_NET_EMATCH is not set +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_SCH_FIFO=y +# CONFIG_DCB is not set +CONFIG_DNS_RESOLVER=m +# CONFIG_BATMAN_ADV is not set +# CONFIG_OPENVSWITCH is not set +# CONFIG_VSOCKETS is not set +# CONFIG_NETLINK_DIAG is not set +# CONFIG_MPLS is not set +# CONFIG_NET_NSH is not set +# CONFIG_HSR is not set +# CONFIG_NET_SWITCHDEV is not set +CONFIG_NET_L3_MASTER_DEV=y +CONFIG_QRTR=y +CONFIG_QRTR_SMD=y +CONFIG_QRTR_TUN=m +# CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y +CONFIG_MAX_SKB_FRAGS=17 +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_XPS=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CGROUP_NET_CLASSID=y +CONFIG_NET_RX_BUSY_POLL=y +CONFIG_BQL=y +# CONFIG_BPF_STREAM_PARSER is not set +CONFIG_NET_FLOW_LIMIT=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_DROP_MONITOR is not set +# end of Network testing +# end of Networking options + +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +CONFIG_BT=y +CONFIG_BT_BREDR=y +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=m +CONFIG_BT_LE=y +CONFIG_BT_LE_L2CAP_ECRED=y +CONFIG_BT_LEDS=y +# CONFIG_BT_MSFTEXT is not set +# CONFIG_BT_AOSPEXT is not set +CONFIG_BT_DEBUGFS=y + +# +# Bluetooth device drivers +# +CONFIG_BT_INTEL=m +CONFIG_BT_BCM=m +CONFIG_BT_RTL=m +CONFIG_BT_QCA=m +CONFIG_BT_HCIBTUSB=m +# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set +CONFIG_BT_HCIBTUSB_POLL_SYNC=y +CONFIG_BT_HCIBTUSB_BCM=y +# CONFIG_BT_HCIBTUSB_MTK is not set +CONFIG_BT_HCIBTUSB_RTL=y +# CONFIG_BT_HCIBTSDIO is not set +# CONFIG_BT_HCIUART is not set +# CONFIG_BT_HCIBCM203X is not set +# CONFIG_BT_HCIBPA10X is not set +# CONFIG_BT_HCIBFUSB is not set +# CONFIG_BT_HCIVHCI is not set +# CONFIG_BT_MRVL is not set +# CONFIG_BT_ATH3K is not set +# CONFIG_BT_MTKSDIO is not set +# CONFIG_BT_MTKUART is not set +CONFIG_BT_QCOMSMD=m +# CONFIG_BT_VIRTIO is not set +# CONFIG_BT_NXPUART is not set +# end of Bluetooth device drivers + +# CONFIG_AF_RXRPC is not set +# CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set +CONFIG_FIB_RULES=y +CONFIG_WIRELESS=y +CONFIG_CFG80211=y +# CONFIG_NL80211_TESTMODE is not set +# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set +CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y +CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y +CONFIG_CFG80211_DEFAULT_PS=y +# CONFIG_CFG80211_DEBUGFS is not set +CONFIG_CFG80211_CRDA_SUPPORT=y +# CONFIG_CFG80211_WEXT is not set +CONFIG_MAC80211=y +CONFIG_MAC80211_HAS_RC=y +CONFIG_MAC80211_RC_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" +# CONFIG_MAC80211_MESH is not set +CONFIG_MAC80211_LEDS=y +# CONFIG_MAC80211_MESSAGE_TRACING is not set +# CONFIG_MAC80211_DEBUG_MENU is not set +CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 +CONFIG_RFKILL=y +CONFIG_RFKILL_LEDS=y +CONFIG_RFKILL_INPUT=y +# CONFIG_RFKILL_GPIO is not set +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +# CONFIG_CEPH_LIB is not set +CONFIG_NFC=m +# CONFIG_NFC_DIGITAL is not set +CONFIG_NFC_NCI=m +# CONFIG_NFC_NCI_SPI is not set +# CONFIG_NFC_NCI_UART is not set +# CONFIG_NFC_HCI is not set + +# +# Near Field Communication (NFC) devices +# +# CONFIG_NFC_VIRTUAL_NCI is not set +# CONFIG_NFC_FDP is not set +# CONFIG_NFC_PN533_USB is not set +# CONFIG_NFC_PN533_I2C is not set +# CONFIG_NFC_PN532_UART is not set +# CONFIG_NFC_MRVL_USB is not set +# CONFIG_NFC_ST_NCI_I2C is not set +# CONFIG_NFC_ST_NCI_SPI is not set +CONFIG_NFC_NXP_NCI=m +CONFIG_NFC_NXP_NCI_I2C=m +CONFIG_NFC_S3FWRN5=m +CONFIG_NFC_S3FWRN5_I2C=m +# CONFIG_NFC_S3FWRN82_UART is not set +# end of Near Field Communication (NFC) devices + +# CONFIG_PSAMPLE is not set +# CONFIG_NET_IFE is not set +# CONFIG_LWTUNNEL is not set +CONFIG_DST_CACHE=y +CONFIG_GRO_CELLS=y +CONFIG_NET_SELFTESTS=m +CONFIG_NET_SOCK_MSG=y +CONFIG_PAGE_POOL=y +# CONFIG_PAGE_POOL_STATS is not set +# CONFIG_FAILOVER is not set +CONFIG_ETHTOOL_NETLINK=y + +# +# Device Drivers +# +CONFIG_ARM_AMBA=y +CONFIG_HAVE_PCI=y +CONFIG_GENERIC_PCI_IOMAP=y +# CONFIG_PCI is not set +# CONFIG_PCCARD is not set + +# +# Generic Driver Options +# +CONFIG_AUXILIARY_BUS=y +CONFIG_UEVENT_HELPER=y +CONFIG_UEVENT_HELPER_PATH="" +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y + +# +# Firmware loader +# +CONFIG_FW_LOADER=y +CONFIG_FW_LOADER_DEBUG=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_FW_LOADER_USER_HELPER is not set +CONFIG_FW_LOADER_COMPRESS=y +CONFIG_FW_LOADER_COMPRESS_XZ=y +CONFIG_FW_LOADER_COMPRESS_ZSTD=y +# CONFIG_FW_UPLOAD is not set +# end of Firmware loader + +CONFIG_WANT_DEV_COREDUMP=y +CONFIG_ALLOW_DEV_COREDUMP=y +CONFIG_DEV_COREDUMP=y +# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set +CONFIG_GENERIC_CPU_DEVICES=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_SOC_BUS=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_SPI=y +CONFIG_REGMAP_SPMI=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGMAP_IRQ=y +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set +CONFIG_GENERIC_ARCH_TOPOLOGY=y +# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set +# end of Generic Driver Options + +# +# Bus devices +# +CONFIG_ARM_CCI=y +CONFIG_ARM_CCI400_COMMON=y +# CONFIG_MOXTET is not set +# CONFIG_QCOM_EBI2 is not set +# CONFIG_QCOM_SSC_BLOCK_BUS is not set +# CONFIG_VEXPRESS_CONFIG is not set +# CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set +# end of Bus devices + +# +# Cache Drivers +# +# end of Cache Drivers + +# CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# CONFIG_ARM_SCMI_PROTOCOL is not set +# end of ARM System Control and Management Interface Protocol + +# CONFIG_ARM_SCPI_PROTOCOL is not set +CONFIG_DMIID=y +# CONFIG_DMI_SYSFS is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +# CONFIG_SYSFB_SIMPLEFB is not set +# CONFIG_TRUSTED_FOUNDATIONS is not set +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +CONFIG_EFI_ESRT=y +CONFIG_EFI_VARS_PSTORE=y +CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE=y +CONFIG_EFI_PARAMS_FROM_FDT=y +CONFIG_EFI_RUNTIME_WRAPPERS=y +CONFIG_EFI_GENERIC_STUB=y +CONFIG_EFI_ARMSTUB_DTB_LOADER=y +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_RESET_ATTACK_MITIGATION is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +# CONFIG_EFI_DISABLE_RUNTIME is not set +# CONFIG_EFI_COCO_SECRET is not set +# end of EFI (Extensible Firmware Interface) Support + +CONFIG_ARM_PSCI_FW=y +# CONFIG_ARM_PSCI_CHECKER is not set + +# +# Qualcomm firmware drivers +# +CONFIG_QCOM_SCM=y +CONFIG_QCOM_TZMEM=y +CONFIG_QCOM_TZMEM_MODE_GENERIC=y +# CONFIG_QCOM_TZMEM_MODE_SHMBRIDGE is not set +# CONFIG_QCOM_QSEECOM is not set +# end of Qualcomm firmware drivers + +CONFIG_HAVE_ARM_SMCCC=y +CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y +CONFIG_ARM_SMCCC_SOC_ID=y + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + +# CONFIG_GNSS is not set +# CONFIG_MTD is not set +CONFIG_DTC=y +CONFIG_OF=y +# CONFIG_OF_UNITTEST is not set +CONFIG_OF_FLATTREE=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_KOBJ=y +CONFIG_OF_DYNAMIC=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_IRQ=y +CONFIG_OF_RESERVED_MEM=y +CONFIG_OF_RESOLVE=y +CONFIG_OF_OVERLAY=y +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_NULL_BLK is not set +CONFIG_ZRAM=m +CONFIG_ZRAM_BACKEND_LZ4=y +CONFIG_ZRAM_BACKEND_LZ4HC=y +CONFIG_ZRAM_BACKEND_ZSTD=y +CONFIG_ZRAM_BACKEND_DEFLATE=y +CONFIG_ZRAM_BACKEND_842=y +CONFIG_ZRAM_BACKEND_LZO=y +# CONFIG_ZRAM_DEF_COMP_LZORLE is not set +# CONFIG_ZRAM_DEF_COMP_LZO is not set +# CONFIG_ZRAM_DEF_COMP_LZ4 is not set +# CONFIG_ZRAM_DEF_COMP_LZ4HC is not set +CONFIG_ZRAM_DEF_COMP_ZSTD=y +# CONFIG_ZRAM_DEF_COMP_DEFLATE is not set +# CONFIG_ZRAM_DEF_COMP_842 is not set +CONFIG_ZRAM_DEF_COMP="zstd" +# CONFIG_ZRAM_WRITEBACK is not set +# CONFIG_ZRAM_TRACK_ENTRY_ACTIME is not set +# CONFIG_ZRAM_MEMORY_TRACKING is not set +# CONFIG_ZRAM_MULTI_COMP is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +# CONFIG_BLK_DEV_DRBD is not set +CONFIG_BLK_DEV_NBD=m +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_VIRTIO_BLK is not set +# CONFIG_BLK_DEV_RBD is not set +CONFIG_BLK_DEV_UBLK=m +CONFIG_BLKDEV_UBLK_LEGACY_OPCODES=y + +# +# NVME Support +# +# CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_TARGET is not set +# end of NVME Support + +# +# Misc devices +# +# CONFIG_AD525X_DPOT is not set +# CONFIG_DUMMY_IRQ is not set +# CONFIG_RPMB is not set +# CONFIG_ICS932S401 is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HI6421V600_IRQ is not set +# CONFIG_QCOM_COINCELL is not set +CONFIG_QCOM_FASTRPC=m +# CONFIG_APDS9802ALS is not set +# CONFIG_ISL29003 is not set +# CONFIG_ISL29020 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_SENSORS_BH1770 is not set +# CONFIG_SENSORS_APDS990X is not set +# CONFIG_HMC6352 is not set +# CONFIG_DS1682 is not set +# CONFIG_LATTICE_ECP3_CONFIG is not set +# CONFIG_SRAM is not set +# CONFIG_XILINX_SDFEC is not set +# CONFIG_HISI_HIKEY_USB is not set +# CONFIG_OPEN_DICE is not set +# CONFIG_VCPU_STALL_DETECTOR is not set +# CONFIG_NSM is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_AT24 is not set +# CONFIG_EEPROM_AT25 is not set +# CONFIG_EEPROM_MAX6875 is not set +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_EEPROM_93XX46 is not set +# CONFIG_EEPROM_IDT_89HPESX is not set +# CONFIG_EEPROM_EE1004 is not set +# end of EEPROM support + +# +# Texas Instruments shared transport line discipline +# +# CONFIG_TI_ST is not set +# end of Texas Instruments shared transport line discipline + +# CONFIG_SENSORS_LIS3_SPI is not set +# CONFIG_SENSORS_LIS3_I2C is not set +# CONFIG_ALTERA_STAPL is not set +# CONFIG_ECHO is not set +# CONFIG_MISC_RTSX_USB is not set +# CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set +# end of Misc devices + +# +# SCSI device support +# +CONFIG_SCSI_MOD=y +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=y +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_PROC_FS is not set + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set +CONFIG_BLK_DEV_BSG=y +# CONFIG_CHR_DEV_SCH is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +CONFIG_SCSI_SCAN_ASYNC=y + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# end of SCSI Transports + +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_VIRTIO is not set +# CONFIG_SCSI_DH is not set +# end of SCSI device support + +# CONFIG_ATA is not set +CONFIG_MD=y +# CONFIG_BLK_DEV_MD is not set +CONFIG_MD_BITMAP_FILE=y +# CONFIG_BCACHE is not set +CONFIG_BLK_DEV_DM_BUILTIN=y +CONFIG_BLK_DEV_DM=y +# CONFIG_DM_DEBUG is not set +CONFIG_DM_BUFIO=m +# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set +CONFIG_DM_BIO_PRISON=m +CONFIG_DM_PERSISTENT_DATA=m +# CONFIG_DM_UNSTRIPED is not set +CONFIG_DM_CRYPT=m +# CONFIG_DM_SNAPSHOT is not set +CONFIG_DM_THIN_PROVISIONING=m +# CONFIG_DM_CACHE is not set +# CONFIG_DM_WRITECACHE is not set +# CONFIG_DM_ERA is not set +# CONFIG_DM_CLONE is not set +# CONFIG_DM_MIRROR is not set +# CONFIG_DM_RAID is not set +# CONFIG_DM_ZERO is not set +# CONFIG_DM_MULTIPATH is not set +# CONFIG_DM_DELAY is not set +# CONFIG_DM_DUST is not set +# CONFIG_DM_INIT is not set +# CONFIG_DM_UEVENT is not set +# CONFIG_DM_FLAKEY is not set +CONFIG_DM_VERITY=m +# CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set +# CONFIG_DM_VERITY_FEC is not set +# CONFIG_DM_SWITCH is not set +# CONFIG_DM_LOG_WRITES is not set +CONFIG_DM_INTEGRITY=m +CONFIG_DM_AUDIT=y +# CONFIG_TARGET_CORE is not set +CONFIG_NETDEVICES=y +CONFIG_MII=m +CONFIG_NET_CORE=y +# CONFIG_BONDING is not set +CONFIG_DUMMY=m +CONFIG_WIREGUARD=m +# CONFIG_WIREGUARD_DEBUG is not set +# CONFIG_EQUALIZER is not set +# CONFIG_NET_TEAM is not set +CONFIG_MACVLAN=m +CONFIG_MACVTAP=m +CONFIG_IPVLAN_L3S=y +CONFIG_IPVLAN=m +# CONFIG_IPVTAP is not set +CONFIG_VXLAN=m +# CONFIG_GENEVE is not set +# CONFIG_BAREUDP is not set +# CONFIG_GTP is not set +# CONFIG_PFCP is not set +# CONFIG_AMT is not set +# CONFIG_MACSEC is not set +# CONFIG_NETCONSOLE is not set +CONFIG_TUN=m +CONFIG_TAP=m +# CONFIG_TUN_VNET_CROSS_LE is not set +CONFIG_VETH=m +# CONFIG_VIRTIO_NET is not set +# CONFIG_NLMON is not set +# CONFIG_NETKIT is not set +# CONFIG_NET_VRF is not set +CONFIG_ETHERNET=y +CONFIG_NET_VENDOR_ALACRITECH=y +# CONFIG_ALTERA_TSE is not set +CONFIG_NET_VENDOR_AMAZON=y +CONFIG_NET_VENDOR_AQUANTIA=y +CONFIG_NET_VENDOR_ARC=y +CONFIG_NET_VENDOR_ASIX=y +# CONFIG_SPI_AX88796C is not set +CONFIG_NET_VENDOR_BROADCOM=y +# CONFIG_B44 is not set +# CONFIG_BCMGENET is not set +# CONFIG_SYSTEMPORT is not set +CONFIG_NET_VENDOR_CADENCE=y +# CONFIG_MACB is not set +CONFIG_NET_VENDOR_CAVIUM=y +CONFIG_NET_VENDOR_CIRRUS=y +# CONFIG_CS89x0_PLATFORM is not set +CONFIG_NET_VENDOR_CORTINA=y +# CONFIG_GEMINI_ETHERNET is not set +CONFIG_NET_VENDOR_DAVICOM=y +# CONFIG_DM9000 is not set +# CONFIG_DM9051 is not set +# CONFIG_DNET is not set +CONFIG_NET_VENDOR_ENGLEDER=y +# CONFIG_TSNEP is not set +CONFIG_NET_VENDOR_EZCHIP=y +# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set +CONFIG_NET_VENDOR_FARADAY=y +# CONFIG_FTMAC100 is not set +# CONFIG_FTGMAC100 is not set +CONFIG_NET_VENDOR_FUNGIBLE=y +CONFIG_NET_VENDOR_GOOGLE=y +CONFIG_NET_VENDOR_HISILICON=y +# CONFIG_HIX5HD2_GMAC is not set +# CONFIG_HISI_FEMAC is not set +# CONFIG_HIP04_ETH is not set +# CONFIG_HNS_DSAF is not set +# CONFIG_HNS_ENET is not set +CONFIG_NET_VENDOR_HUAWEI=y +CONFIG_NET_VENDOR_I825XX=y +CONFIG_NET_VENDOR_INTEL=y +CONFIG_NET_VENDOR_ADI=y +CONFIG_NET_VENDOR_LITEX=y +# CONFIG_LITEX_LITEETH is not set +CONFIG_NET_VENDOR_MARVELL=y +# CONFIG_MVMDIO is not set +CONFIG_NET_VENDOR_MELLANOX=y +# CONFIG_MLXSW_CORE is not set +# CONFIG_MLXFW is not set +CONFIG_NET_VENDOR_META=y +CONFIG_NET_VENDOR_MICREL=y +# CONFIG_KS8842 is not set +# CONFIG_KS8851 is not set +# CONFIG_KS8851_MLL is not set +CONFIG_NET_VENDOR_MICROCHIP=y +# CONFIG_ENC28J60 is not set +# CONFIG_ENCX24J600 is not set +# CONFIG_LAN865X is not set +# CONFIG_VCAP is not set +CONFIG_NET_VENDOR_MICROSEMI=y +CONFIG_NET_VENDOR_MICROSOFT=y +CONFIG_NET_VENDOR_NI=y +# CONFIG_NI_XGE_MANAGEMENT_ENET is not set +CONFIG_NET_VENDOR_NATSEMI=y +CONFIG_NET_VENDOR_NETRONOME=y +CONFIG_NET_VENDOR_8390=y +# CONFIG_AX88796 is not set +# CONFIG_ETHOC is not set +# CONFIG_OA_TC6 is not set +CONFIG_NET_VENDOR_PENSANDO=y +CONFIG_NET_VENDOR_QUALCOMM=y +# CONFIG_QCA7000_SPI is not set +# CONFIG_QCA7000_UART is not set +# CONFIG_QCOM_EMAC is not set +CONFIG_RMNET=m +CONFIG_NET_VENDOR_RENESAS=y +CONFIG_NET_VENDOR_ROCKER=y +CONFIG_NET_VENDOR_SAMSUNG=y +# CONFIG_SXGBE_ETH is not set +CONFIG_NET_VENDOR_SEEQ=y +CONFIG_NET_VENDOR_SOLARFLARE=y +CONFIG_NET_VENDOR_SMSC=y +# CONFIG_SMC91X is not set +# CONFIG_SMSC911X is not set +CONFIG_NET_VENDOR_SOCIONEXT=y +CONFIG_NET_VENDOR_STMICRO=y +# CONFIG_STMMAC_ETH is not set +CONFIG_NET_VENDOR_SYNOPSYS=y +# CONFIG_DWC_XLGMAC is not set +CONFIG_NET_VENDOR_VERTEXCOM=y +# CONFIG_MSE102X is not set +CONFIG_NET_VENDOR_VIA=y +# CONFIG_VIA_VELOCITY is not set +CONFIG_NET_VENDOR_WANGXUN=y +CONFIG_NET_VENDOR_WIZNET=y +# CONFIG_WIZNET_W5100 is not set +# CONFIG_WIZNET_W5300 is not set +CONFIG_NET_VENDOR_XILINX=y +# CONFIG_XILINX_EMACLITE is not set +# CONFIG_XILINX_LL_TEMAC is not set +# CONFIG_QCOM_IPA is not set +CONFIG_PHYLINK=m +CONFIG_PHYLIB=m +CONFIG_SWPHY=y +# CONFIG_LED_TRIGGER_PHY is not set +CONFIG_PHYLIB_LEDS=y +CONFIG_FIXED_PHY=m +# CONFIG_SFP is not set + +# +# MII PHY device drivers +# +# CONFIG_AIR_EN8811H_PHY is not set +# CONFIG_AMD_PHY is not set +# CONFIG_ADIN_PHY is not set +# CONFIG_ADIN1100_PHY is not set +# CONFIG_AQUANTIA_PHY is not set +CONFIG_AX88796B_PHY=m +# CONFIG_BROADCOM_PHY is not set +# CONFIG_BCM54140_PHY is not set +# CONFIG_BCM7XXX_PHY is not set +# CONFIG_BCM84881_PHY is not set +# CONFIG_BCM87XX_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_CORTINA_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_INTEL_XWAY_PHY is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_MARVELL_PHY is not set +# CONFIG_MARVELL_10G_PHY is not set +# CONFIG_MARVELL_88Q2XXX_PHY is not set +# CONFIG_MARVELL_88X2222_PHY is not set +# CONFIG_MAXLINEAR_GPHY is not set +# CONFIG_MEDIATEK_GE_PHY is not set +# CONFIG_MICREL_PHY is not set +# CONFIG_MICROCHIP_T1S_PHY is not set +# CONFIG_MICROCHIP_PHY is not set +# CONFIG_MICROCHIP_T1_PHY is not set +# CONFIG_MICROSEMI_PHY is not set +# CONFIG_MOTORCOMM_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_NXP_CBTX_PHY is not set +# CONFIG_NXP_C45_TJA11XX_PHY is not set +# CONFIG_NXP_TJA11XX_PHY is not set +# CONFIG_NCN26000_PHY is not set +# CONFIG_AT803X_PHY is not set +# CONFIG_QCA83XX_PHY is not set +# CONFIG_QCA808X_PHY is not set +# CONFIG_QCA807X_PHY is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_RENESAS_PHY is not set +# CONFIG_ROCKCHIP_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_TERANETICS_PHY is not set +# CONFIG_DP83822_PHY is not set +# CONFIG_DP83TC811_PHY is not set +# CONFIG_DP83848_PHY is not set +# CONFIG_DP83867_PHY is not set +# CONFIG_DP83869_PHY is not set +# CONFIG_DP83TD510_PHY is not set +# CONFIG_DP83TG720_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_XILINX_GMII2RGMII is not set +# CONFIG_MICREL_KS8995MA is not set +# CONFIG_PSE_CONTROLLER is not set +CONFIG_MDIO_DEVICE=m +CONFIG_MDIO_BUS=m +CONFIG_FWNODE_MDIO=m +CONFIG_OF_MDIO=m +CONFIG_MDIO_DEVRES=m +# CONFIG_MDIO_BITBANG is not set +# CONFIG_MDIO_BCM_UNIMAC is not set +# CONFIG_MDIO_HISI_FEMAC is not set +# CONFIG_MDIO_MVUSB is not set +# CONFIG_MDIO_MSCC_MIIM is not set +# CONFIG_MDIO_IPQ4019 is not set +# CONFIG_MDIO_IPQ8064 is not set + +# +# MDIO Multiplexers +# +# CONFIG_MDIO_BUS_MUX_GPIO is not set +# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set +# CONFIG_MDIO_BUS_MUX_MMIOREG is not set + +# +# PCS device drivers +# +# CONFIG_PCS_XPCS is not set +# end of PCS device drivers + +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +CONFIG_USB_NET_DRIVERS=y +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +CONFIG_USB_RTL8152=m +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=m +CONFIG_USB_NET_AX8817X=m +CONFIG_USB_NET_AX88179_178A=m +CONFIG_USB_NET_CDCETHER=m +# CONFIG_USB_NET_CDC_EEM is not set +CONFIG_USB_NET_CDC_NCM=m +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +CONFIG_USB_NET_NET1080=m +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +CONFIG_USB_NET_RNDIS_HOST=m +CONFIG_USB_NET_CDC_SUBSET_ENABLE=m +CONFIG_USB_NET_CDC_SUBSET=m +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +CONFIG_USB_NET_ZAURUS=m +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_HSO is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_RTL8153_ECM=m +CONFIG_WLAN=y +CONFIG_WLAN_VENDOR_ADMTEK=y +CONFIG_WLAN_VENDOR_ATH=y +# CONFIG_ATH_DEBUG is not set +# CONFIG_ATH9K is not set +# CONFIG_ATH9K_HTC is not set +# CONFIG_CARL9170 is not set +# CONFIG_ATH6KL is not set +# CONFIG_AR5523 is not set +# CONFIG_ATH10K is not set +CONFIG_WCN36XX=m +# CONFIG_WCN36XX_DEBUGFS is not set +# CONFIG_ATH11K is not set +CONFIG_WLAN_VENDOR_ATMEL=y +# CONFIG_AT76C50X_USB is not set +CONFIG_WLAN_VENDOR_BROADCOM=y +# CONFIG_B43 is not set +# CONFIG_B43LEGACY is not set +# CONFIG_BRCMSMAC is not set +# CONFIG_BRCMFMAC is not set +CONFIG_WLAN_VENDOR_INTEL=y +CONFIG_WLAN_VENDOR_INTERSIL=y +# CONFIG_P54_COMMON is not set +CONFIG_WLAN_VENDOR_MARVELL=y +# CONFIG_LIBERTAS is not set +# CONFIG_LIBERTAS_THINFIRM is not set +# CONFIG_MWIFIEX is not set +CONFIG_WLAN_VENDOR_MEDIATEK=y +# CONFIG_MT7601U is not set +# CONFIG_MT76x0U is not set +# CONFIG_MT76x2U is not set +# CONFIG_MT7663U is not set +# CONFIG_MT7663S is not set +# CONFIG_MT7921S is not set +# CONFIG_MT7921U is not set +# CONFIG_MT7925U is not set +CONFIG_WLAN_VENDOR_MICROCHIP=y +# CONFIG_WILC1000_SDIO is not set +# CONFIG_WILC1000_SPI is not set +CONFIG_WLAN_VENDOR_PURELIFI=y +# CONFIG_PLFXLC is not set +CONFIG_WLAN_VENDOR_RALINK=y +# CONFIG_RT2X00 is not set +CONFIG_WLAN_VENDOR_REALTEK=y +# CONFIG_RTL8187 is not set +CONFIG_RTL_CARDS=y +# CONFIG_RTL8192CU is not set +# CONFIG_RTL8192DU is not set +# CONFIG_RTL8XXXU is not set +# CONFIG_RTW88 is not set +# CONFIG_RTW89 is not set +CONFIG_WLAN_VENDOR_RSI=y +# CONFIG_RSI_91X is not set +CONFIG_WLAN_VENDOR_SILABS=y +# CONFIG_WFX is not set +CONFIG_WLAN_VENDOR_ST=y +# CONFIG_CW1200 is not set +CONFIG_WLAN_VENDOR_TI=y +# CONFIG_WL1251 is not set +# CONFIG_WL12XX is not set +# CONFIG_WL18XX is not set +# CONFIG_WLCORE is not set +CONFIG_WLAN_VENDOR_ZYDAS=y +# CONFIG_ZD1211RW is not set +CONFIG_WLAN_VENDOR_QUANTENNA=y +# CONFIG_MAC80211_HWSIM is not set +# CONFIG_VIRT_WIFI is not set +# CONFIG_WAN is not set + +# +# Wireless WAN +# +CONFIG_WWAN=y +CONFIG_WWAN_DEBUGFS=y +# CONFIG_WWAN_HWSIM is not set +CONFIG_QCOM_BAM_DMUX=m +CONFIG_RPMSG_WWAN_CTRL=m +# end of Wireless WAN + +# CONFIG_NETDEVSIM is not set +# CONFIG_NET_FAILOVER is not set +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +CONFIG_INPUT_LEDS=y +CONFIG_INPUT_FF_MEMLESS=y +# CONFIG_INPUT_SPARSEKMAP is not set +CONFIG_INPUT_MATRIXKMAP=m +CONFIG_INPUT_VIVALDIFMAP=m + +# +# Userland interfaces +# +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ADC is not set +# CONFIG_KEYBOARD_ADP5588 is not set +# CONFIG_KEYBOARD_ADP5589 is not set +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_QT1050 is not set +# CONFIG_KEYBOARD_QT1070 is not set +# CONFIG_KEYBOARD_QT2160 is not set +# CONFIG_KEYBOARD_DLINK_DIR685 is not set +# CONFIG_KEYBOARD_LKKBD is not set +CONFIG_KEYBOARD_GPIO=y +# CONFIG_KEYBOARD_GPIO_POLLED is not set +# CONFIG_KEYBOARD_TCA6416 is not set +# CONFIG_KEYBOARD_TCA8418 is not set +CONFIG_KEYBOARD_MATRIX=m +# CONFIG_KEYBOARD_LM8323 is not set +# CONFIG_KEYBOARD_LM8333 is not set +# CONFIG_KEYBOARD_MAX7359 is not set +# CONFIG_KEYBOARD_MPR121 is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_PINEPHONE is not set +# CONFIG_KEYBOARD_SAMSUNG is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_OMAP4 is not set +CONFIG_KEYBOARD_TM2_TOUCHKEY=m +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CAP11XX is not set +# CONFIG_KEYBOARD_BCM is not set +# CONFIG_KEYBOARD_CYPRESS_SF is not set +CONFIG_INPUT_MOUSE=y +# CONFIG_MOUSE_PS2 is not set +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_APPLETOUCH is not set +# CONFIG_MOUSE_BCM5974 is not set +# CONFIG_MOUSE_CYAPA is not set +# CONFIG_MOUSE_ELAN_I2C is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_MOUSE_GPIO is not set +# CONFIG_MOUSE_SYNAPTICS_I2C is not set +# CONFIG_MOUSE_SYNAPTICS_USB is not set +CONFIG_INPUT_JOYSTICK=y +# CONFIG_JOYSTICK_ANALOG is not set +# CONFIG_JOYSTICK_A3D is not set +# CONFIG_JOYSTICK_ADC is not set +# CONFIG_JOYSTICK_ADI is not set +# CONFIG_JOYSTICK_COBRA is not set +# CONFIG_JOYSTICK_GF2K is not set +# CONFIG_JOYSTICK_GRIP is not set +# CONFIG_JOYSTICK_GRIP_MP is not set +# CONFIG_JOYSTICK_GUILLEMOT is not set +# CONFIG_JOYSTICK_INTERACT is not set +# CONFIG_JOYSTICK_SIDEWINDER is not set +# CONFIG_JOYSTICK_TMDC is not set +# CONFIG_JOYSTICK_IFORCE is not set +# CONFIG_JOYSTICK_WARRIOR is not set +# CONFIG_JOYSTICK_MAGELLAN is not set +# CONFIG_JOYSTICK_SPACEORB is not set +# CONFIG_JOYSTICK_SPACEBALL is not set +# CONFIG_JOYSTICK_STINGER is not set +# CONFIG_JOYSTICK_TWIDJOY is not set +# CONFIG_JOYSTICK_ZHENHUA is not set +# CONFIG_JOYSTICK_AS5011 is not set +# CONFIG_JOYSTICK_JOYDUMP is not set +CONFIG_JOYSTICK_XPAD=m +CONFIG_JOYSTICK_XPAD_FF=y +CONFIG_JOYSTICK_XPAD_LEDS=y +# CONFIG_JOYSTICK_PSXPAD_SPI is not set +# CONFIG_JOYSTICK_PXRC is not set +# CONFIG_JOYSTICK_QWIIC is not set +# CONFIG_JOYSTICK_FSIA6B is not set +# CONFIG_JOYSTICK_SENSEHAT is not set +# CONFIG_JOYSTICK_SEESAW is not set +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_AD7877 is not set +# CONFIG_TOUCHSCREEN_AD7879 is not set +# CONFIG_TOUCHSCREEN_ADC is not set +# CONFIG_TOUCHSCREEN_AR1021_I2C is not set +CONFIG_TOUCHSCREEN_ATMEL_MXT=m +# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set +# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set +# CONFIG_TOUCHSCREEN_BU21013 is not set +# CONFIG_TOUCHSCREEN_BU21029 is not set +# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set +# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set +# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set +# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set +CONFIG_TOUCHSCREEN_CYTTSP5=m +# CONFIG_TOUCHSCREEN_DYNAPRO is not set +# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set +# CONFIG_TOUCHSCREEN_EETI is not set +# CONFIG_TOUCHSCREEN_EGALAX is not set +# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set +# CONFIG_TOUCHSCREEN_EXC3000 is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set +CONFIG_TOUCHSCREEN_GOODIX=m +# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C is not set +# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI is not set +CONFIG_TOUCHSCREEN_HIDEEP=m +CONFIG_TOUCHSCREEN_HIMAX_HX852X=m +# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set +# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set +# CONFIG_TOUCHSCREEN_ILI210X is not set +# CONFIG_TOUCHSCREEN_ILITEK is not set +# CONFIG_TOUCHSCREEN_S6SY761 is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_EKTF2127 is not set +# CONFIG_TOUCHSCREEN_ELAN is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set +# CONFIG_TOUCHSCREEN_WACOM_I2C is not set +# CONFIG_TOUCHSCREEN_MAX11801 is not set +CONFIG_TOUCHSCREEN_MMS114=m +CONFIG_TOUCHSCREEN_MELFAS_MIP4=m +CONFIG_TOUCHSCREEN_MSG2638=m +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set +CONFIG_TOUCHSCREEN_IMAGIS=m +# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +CONFIG_TOUCHSCREEN_EDT_FT5X06=m +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_PIXCIR is not set +# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_TOUCHSCREEN_TSC_SERIO is not set +# CONFIG_TOUCHSCREEN_TSC2004 is not set +# CONFIG_TOUCHSCREEN_TSC2005 is not set +# CONFIG_TOUCHSCREEN_TSC2007 is not set +# CONFIG_TOUCHSCREEN_RM_TS is not set +# CONFIG_TOUCHSCREEN_SILEAD is not set +# CONFIG_TOUCHSCREEN_SIS_I2C is not set +# CONFIG_TOUCHSCREEN_ST1232 is not set +CONFIG_TOUCHSCREEN_STMFTS=m +# CONFIG_TOUCHSCREEN_SUR40 is not set +# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set +# CONFIG_TOUCHSCREEN_SX8654 is not set +# CONFIG_TOUCHSCREEN_TPS6507X is not set +# CONFIG_TOUCHSCREEN_ZET6223 is not set +# CONFIG_TOUCHSCREEN_ZFORCE is not set +# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set +# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set +# CONFIG_TOUCHSCREEN_IQS5XX is not set +# CONFIG_TOUCHSCREEN_IQS7211 is not set +CONFIG_TOUCHSCREEN_ZINITIX=m +# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_AD714X is not set +# CONFIG_INPUT_ATMEL_CAPTOUCH is not set +# CONFIG_INPUT_BMA150 is not set +# CONFIG_INPUT_E3X0_BUTTON is not set +CONFIG_INPUT_PM8941_PWRKEY=y +CONFIG_INPUT_PM8XXX_VIBRATOR=m +# CONFIG_INPUT_MMA8450 is not set +# CONFIG_INPUT_GPIO_BEEPER is not set +# CONFIG_INPUT_GPIO_DECODER is not set +CONFIG_INPUT_GPIO_VIBRA=m +# CONFIG_INPUT_ATI_REMOTE2 is not set +# CONFIG_INPUT_KEYSPAN_REMOTE is not set +# CONFIG_INPUT_KXTJ9 is not set +# CONFIG_INPUT_POWERMATE is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INPUT_CM109 is not set +CONFIG_INPUT_REGULATOR_HAPTIC=m +CONFIG_INPUT_UINPUT=m +# CONFIG_INPUT_PCF8574 is not set +# CONFIG_INPUT_PWM_BEEPER is not set +CONFIG_INPUT_PWM_VIBRA=m +# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set +# CONFIG_INPUT_DA7280_HAPTICS is not set +# CONFIG_INPUT_ADXL34X is not set +# CONFIG_INPUT_IMS_PCU is not set +# CONFIG_INPUT_IQS269A is not set +# CONFIG_INPUT_IQS626A is not set +# CONFIG_INPUT_IQS7222 is not set +# CONFIG_INPUT_CMA3000 is not set +# CONFIG_INPUT_DRV260X_HAPTICS is not set +# CONFIG_INPUT_DRV2665_HAPTICS is not set +# CONFIG_INPUT_DRV2667_HAPTICS is not set +CONFIG_RMI4_CORE=m +CONFIG_RMI4_I2C=m +CONFIG_RMI4_SPI=m +CONFIG_RMI4_SMB=m +CONFIG_RMI4_F03=y +CONFIG_RMI4_F03_SERIO=m +CONFIG_RMI4_2D_SENSOR=y +CONFIG_RMI4_F11=y +CONFIG_RMI4_F12=y +CONFIG_RMI4_F30=y +CONFIG_RMI4_F34=y +CONFIG_RMI4_F3A=y +# CONFIG_RMI4_F54 is not set +CONFIG_RMI4_F55=y + +# +# Hardware I/O ports +# +CONFIG_SERIO=m +CONFIG_SERIO_SERPORT=m +# CONFIG_SERIO_AMBAKMI is not set +# CONFIG_SERIO_LIBPS2 is not set +# CONFIG_SERIO_RAW is not set +# CONFIG_SERIO_ALTERA_PS2 is not set +# CONFIG_SERIO_PS2MULT is not set +# CONFIG_SERIO_ARC_PS2 is not set +# CONFIG_SERIO_APBPS2 is not set +# CONFIG_SERIO_GPIO_PS2 is not set +# CONFIG_USERIO is not set +# CONFIG_GAMEPORT is not set +# end of Hardware I/O ports +# end of Input device support + +# +# Character devices +# +CONFIG_TTY=y +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=16 +CONFIG_LEGACY_TIOCSTI=y +CONFIG_LDISC_AUTOLOAD=y + +# +# Serial drivers +# +CONFIG_SERIAL_EARLYCON=y +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_AMBA_PL010 is not set +# CONFIG_SERIAL_AMBA_PL011 is not set +# CONFIG_SERIAL_EARLYCON_SEMIHOST is not set +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX310X is not set +# CONFIG_SERIAL_UARTLITE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_SERIAL_MSM=y +CONFIG_SERIAL_MSM_CONSOLE=y +# CONFIG_SERIAL_SIFIVE is not set +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_SC16IS7XX is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_XILINX_PS_UART is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_SERIAL_FSL_LPUART is not set +# CONFIG_SERIAL_FSL_LINFLEXUART is not set +# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set +# CONFIG_SERIAL_ST_ASC is not set +# CONFIG_SERIAL_SPRD is not set +# end of Serial drivers + +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_N_GSM is not set +CONFIG_NULL_TTY=y +# CONFIG_HVC_DCC is not set +# CONFIG_RPMSG_TTY is not set +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y +# CONFIG_VIRTIO_CONSOLE is not set +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_HW_RANDOM_TIMERIOMEM is not set +# CONFIG_HW_RANDOM_BA431 is not set +# CONFIG_HW_RANDOM_VIRTIO is not set +# CONFIG_HW_RANDOM_CCTRNG is not set +# CONFIG_HW_RANDOM_XIPHERA is not set +CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=y +CONFIG_DEVMEM=y +CONFIG_DEVPORT=y +# CONFIG_TCG_TPM is not set +# CONFIG_XILLYBUS is not set +# CONFIG_XILLYUSB is not set +# end of Character devices + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=m +CONFIG_I2C_MUX=y + +# +# Multiplexer I2C Chip support +# +# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set +# CONFIG_I2C_MUX_GPIO is not set +# CONFIG_I2C_MUX_GPMUX is not set +# CONFIG_I2C_MUX_LTC4306 is not set +# CONFIG_I2C_MUX_PCA9541 is not set +# CONFIG_I2C_MUX_PCA954x is not set +# CONFIG_I2C_MUX_PINCTRL is not set +# CONFIG_I2C_MUX_REG is not set +# CONFIG_I2C_DEMUX_PINCTRL is not set +# CONFIG_I2C_MUX_MLXCPLD is not set +# end of Multiplexer I2C Chip support + +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_ALGOBIT=y + +# +# I2C Hardware Bus support +# + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_CBUS_GPIO is not set +# CONFIG_I2C_DESIGNWARE_CORE is not set +# CONFIG_I2C_EMEV2 is not set +CONFIG_I2C_GPIO=y +# CONFIG_I2C_GPIO_FAULT_INJECTOR is not set +# CONFIG_I2C_NOMADIK is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PCA_PLATFORM is not set +CONFIG_I2C_QCOM_CCI=m +CONFIG_I2C_QUP=y +# CONFIG_I2C_RK3X is not set +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_XILINX is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_ROBOTFUZZ_OSIF is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_VIRTIO is not set +# end of I2C Hardware Bus support + +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_SLAVE is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# end of I2C support + +# CONFIG_I3C is not set +CONFIG_SPI=y +CONFIG_SPI_MASTER=y +# CONFIG_SPI_MEM is not set + +# +# SPI Master Controller Drivers +# +# CONFIG_SPI_ALTERA is not set +# CONFIG_SPI_AXI_SPI_ENGINE is not set +CONFIG_SPI_BITBANG=y +# CONFIG_SPI_CADENCE is not set +# CONFIG_SPI_CADENCE_QUADSPI is not set +# CONFIG_SPI_CH341 is not set +# CONFIG_SPI_DESIGNWARE is not set +CONFIG_SPI_GPIO=y +# CONFIG_SPI_FSL_SPI is not set +# CONFIG_SPI_MICROCHIP_CORE is not set +# CONFIG_SPI_MICROCHIP_CORE_QSPI is not set +# CONFIG_SPI_OC_TINY is not set +# CONFIG_SPI_PL022 is not set +# CONFIG_SPI_QCOM_QSPI is not set +CONFIG_SPI_QUP=y +# CONFIG_SPI_SC18IS602 is not set +# CONFIG_SPI_SIFIVE is not set +# CONFIG_SPI_MXIC is not set +# CONFIG_SPI_XCOMM is not set +# CONFIG_SPI_XILINX is not set +# CONFIG_SPI_AMD is not set + +# +# SPI Multiplexer support +# +# CONFIG_SPI_MUX is not set + +# +# SPI Protocol Masters +# +CONFIG_SPI_SPIDEV=m +# CONFIG_SPI_LOOPBACK_TEST is not set +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_SPI_SLAVE is not set +CONFIG_SPI_DYNAMIC=y +CONFIG_SPMI=y +# CONFIG_SPMI_HISI3670 is not set +CONFIG_SPMI_MSM_PMIC_ARB=y +# CONFIG_HSI is not set +CONFIG_PPS=y +# CONFIG_PPS_DEBUG is not set + +# +# PPS clients support +# +# CONFIG_PPS_CLIENT_KTIMER is not set +# CONFIG_PPS_CLIENT_LDISC is not set +# CONFIG_PPS_CLIENT_GPIO is not set + +# +# PPS generators support +# + +# +# PTP clock support +# +CONFIG_PTP_1588_CLOCK=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# +CONFIG_PTP_1588_CLOCK_KVM=y +# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set +# CONFIG_PTP_1588_CLOCK_IDTCM is not set +# CONFIG_PTP_1588_CLOCK_FC3W is not set +# CONFIG_PTP_1588_CLOCK_MOCK is not set +# end of PTP clock support + +CONFIG_PINCTRL=y +CONFIG_GENERIC_PINCTRL_GROUPS=y +CONFIG_PINMUX=y +CONFIG_GENERIC_PINMUX_FUNCTIONS=y +CONFIG_PINCONF=y +CONFIG_GENERIC_PINCONF=y +# CONFIG_PINCTRL_AW9523 is not set +# CONFIG_PINCTRL_CY8C95X0 is not set +# CONFIG_PINCTRL_MCP23S08 is not set +# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set +# CONFIG_PINCTRL_OCELOT is not set +CONFIG_PINCTRL_SINGLE=y +# CONFIG_PINCTRL_STMFX is not set +# CONFIG_PINCTRL_SX150X is not set +CONFIG_PINCTRL_MSM=y +# CONFIG_PINCTRL_APQ8064 is not set +# CONFIG_PINCTRL_APQ8084 is not set +# CONFIG_PINCTRL_IPQ4019 is not set +# CONFIG_PINCTRL_IPQ8064 is not set +# CONFIG_PINCTRL_MSM8226 is not set +# CONFIG_PINCTRL_MSM8660 is not set +# CONFIG_PINCTRL_MSM8960 is not set +# CONFIG_PINCTRL_MDM9607 is not set +# CONFIG_PINCTRL_MDM9615 is not set +# CONFIG_PINCTRL_MSM8X74 is not set +CONFIG_PINCTRL_MSM8909=y +CONFIG_PINCTRL_MSM8916=y +# CONFIG_PINCTRL_SDX55 is not set +# CONFIG_PINCTRL_SDX65 is not set +CONFIG_PINCTRL_QCOM_SPMI_PMIC=y +# CONFIG_PINCTRL_QCOM_SSBI_PMIC is not set +# CONFIG_PINCTRL_LPASS_LPI is not set + +# +# Renesas pinctrl drivers +# +# end of Renesas pinctrl drivers + +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_FASTPATH_LIMIT=512 +CONFIG_OF_GPIO=y +CONFIG_GPIOLIB_IRQCHIP=y +CONFIG_GPIO_CDEV=y +CONFIG_GPIO_CDEV_V1=y + +# +# Memory mapped GPIO drivers +# +# CONFIG_GPIO_74XX_MMIO is not set +# CONFIG_GPIO_ALTERA is not set +# CONFIG_GPIO_CADENCE is not set +# CONFIG_GPIO_DWAPB is not set +# CONFIG_GPIO_FTGPIO010 is not set +# CONFIG_GPIO_GENERIC_PLATFORM is not set +# CONFIG_GPIO_GRGPIO is not set +# CONFIG_GPIO_HLWD is not set +# CONFIG_GPIO_LOGICVC is not set +# CONFIG_GPIO_MB86S7X is not set +# CONFIG_GPIO_MPC8XXX is not set +# CONFIG_GPIO_PL061 is not set +# CONFIG_GPIO_SIFIVE is not set +# CONFIG_GPIO_SYSCON is not set +# CONFIG_GPIO_XILINX is not set +# CONFIG_GPIO_ZEVIO is not set +# CONFIG_GPIO_AMD_FCH is not set +# end of Memory mapped GPIO drivers + +# +# I2C GPIO expanders +# +# CONFIG_GPIO_ADNP is not set +# CONFIG_GPIO_FXL6408 is not set +# CONFIG_GPIO_DS4520 is not set +# CONFIG_GPIO_GW_PLD is not set +# CONFIG_GPIO_MAX7300 is not set +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCA9570 is not set +# CONFIG_GPIO_PCF857X is not set +# CONFIG_GPIO_TPIC2810 is not set +# end of I2C GPIO expanders + +# +# MFD GPIO expanders +# +# CONFIG_HTC_EGPIO is not set +# end of MFD GPIO expanders + +# +# SPI GPIO expanders +# +# CONFIG_GPIO_74X164 is not set +# CONFIG_GPIO_MAX3191X is not set +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_PISOSR is not set +# CONFIG_GPIO_XRA1403 is not set +# end of SPI GPIO expanders + +# +# USB GPIO expanders +# +# end of USB GPIO expanders + +# +# Virtual GPIO drivers +# +# CONFIG_GPIO_AGGREGATOR is not set +# CONFIG_GPIO_LATCH is not set +# CONFIG_GPIO_MOCKUP is not set +# CONFIG_GPIO_VIRTIO is not set +# CONFIG_GPIO_SIM is not set +# end of Virtual GPIO drivers + +# +# GPIO Debugging utilities +# +# CONFIG_GPIO_VIRTUSER is not set +# end of GPIO Debugging utilities + +# CONFIG_W1 is not set +CONFIG_POWER_RESET=y +# CONFIG_POWER_RESET_BRCMKONA is not set +# CONFIG_POWER_RESET_GPIO is not set +# CONFIG_POWER_RESET_GPIO_RESTART is not set +CONFIG_POWER_RESET_MSM=y +CONFIG_POWER_RESET_QCOM_PON=y +# CONFIG_POWER_RESET_LTC2952 is not set +# CONFIG_POWER_RESET_REGULATOR is not set +# CONFIG_POWER_RESET_RESTART is not set +# CONFIG_POWER_RESET_VERSATILE is not set +# CONFIG_POWER_RESET_SYSCON is not set +# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set +CONFIG_REBOOT_MODE=y +# CONFIG_SYSCON_REBOOT_MODE is not set +# CONFIG_NVMEM_REBOOT_MODE is not set +# CONFIG_POWER_SEQUENCING is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +CONFIG_POWER_SUPPLY_HWMON=y +# CONFIG_GENERIC_ADC_BATTERY is not set +# CONFIG_IP5XXX_POWER is not set +# CONFIG_TEST_POWER is not set +# CONFIG_CHARGER_ADP5061 is not set +# CONFIG_BATTERY_CW2015 is not set +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set +# CONFIG_BATTERY_SBS is not set +# CONFIG_CHARGER_SBS is not set +# CONFIG_MANAGER_SBS is not set +# CONFIG_BATTERY_BQ27XXX is not set +# CONFIG_BATTERY_MAX17040 is not set +CONFIG_BATTERY_MAX17042=m +# CONFIG_BATTERY_MAX1720X is not set +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_GPIO is not set +# CONFIG_CHARGER_MANAGER is not set +# CONFIG_CHARGER_LT3651 is not set +# CONFIG_CHARGER_LTC4162L is not set +# CONFIG_CHARGER_DETECTOR_MAX14656 is not set +# CONFIG_CHARGER_MAX77976 is not set +# CONFIG_CHARGER_QCOM_SMBB is not set +CONFIG_SMB1360=m +# CONFIG_SMB1360_DEBUG is not set +CONFIG_BATTERY_PM8916_BMS_VM=m +CONFIG_CHARGER_PM8916_LBC=m +# CONFIG_CHARGER_BQ2415X is not set +# CONFIG_CHARGER_BQ24190 is not set +# CONFIG_CHARGER_BQ24257 is not set +# CONFIG_CHARGER_BQ24735 is not set +# CONFIG_CHARGER_BQ2515X is not set +# CONFIG_CHARGER_BQ25890 is not set +# CONFIG_CHARGER_BQ25980 is not set +# CONFIG_CHARGER_BQ256XX is not set +# CONFIG_CHARGER_SMB347 is not set +# CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +CONFIG_BATTERY_RT5033=m +CONFIG_CHARGER_RT5033=m +# CONFIG_CHARGER_RT9455 is not set +# CONFIG_CHARGER_RT9467 is not set +# CONFIG_CHARGER_RT9471 is not set +# CONFIG_CHARGER_UCS1002 is not set +# CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_UG3105 is not set +# CONFIG_CHARGER_QCOM_SMB2 is not set +# CONFIG_FUEL_GAUGE_MM8013 is not set +CONFIG_HWMON=y +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Native drivers +# +# CONFIG_SENSORS_AD7314 is not set +# CONFIG_SENSORS_AD7414 is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADM1025 is not set +# CONFIG_SENSORS_ADM1026 is not set +# CONFIG_SENSORS_ADM1029 is not set +# CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM1177 is not set +# CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ADT7310 is not set +# CONFIG_SENSORS_ADT7410 is not set +# CONFIG_SENSORS_ADT7411 is not set +# CONFIG_SENSORS_ADT7462 is not set +# CONFIG_SENSORS_ADT7470 is not set +# CONFIG_SENSORS_ADT7475 is not set +# CONFIG_SENSORS_AHT10 is not set +# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set +# CONFIG_SENSORS_AS370 is not set +# CONFIG_SENSORS_ASC7621 is not set +# CONFIG_SENSORS_ASUS_ROG_RYUJIN is not set +# CONFIG_SENSORS_AXI_FAN_CONTROL is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_CHIPCAP2 is not set +# CONFIG_SENSORS_CORSAIR_CPRO is not set +# CONFIG_SENSORS_CORSAIR_PSU is not set +# CONFIG_SENSORS_DS620 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_F75375S is not set +# CONFIG_SENSORS_FTSTEUTATES is not set +# CONFIG_SENSORS_GIGABYTE_WATERFORCE is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_G760A is not set +# CONFIG_SENSORS_G762 is not set +# CONFIG_SENSORS_GPIO_FAN is not set +# CONFIG_SENSORS_HIH6130 is not set +# CONFIG_SENSORS_HS3001 is not set +# CONFIG_SENSORS_IIO_HWMON is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_JC42 is not set +# CONFIG_SENSORS_POWERZ is not set +# CONFIG_SENSORS_POWR1220 is not set +# CONFIG_SENSORS_LINEAGE is not set +# CONFIG_SENSORS_LTC2945 is not set +# CONFIG_SENSORS_LTC2947_I2C is not set +# CONFIG_SENSORS_LTC2947_SPI is not set +# CONFIG_SENSORS_LTC2990 is not set +# CONFIG_SENSORS_LTC2991 is not set +# CONFIG_SENSORS_LTC2992 is not set +# CONFIG_SENSORS_LTC4151 is not set +# CONFIG_SENSORS_LTC4215 is not set +# CONFIG_SENSORS_LTC4222 is not set +# CONFIG_SENSORS_LTC4245 is not set +# CONFIG_SENSORS_LTC4260 is not set +# CONFIG_SENSORS_LTC4261 is not set +# CONFIG_SENSORS_LTC4282 is not set +# CONFIG_SENSORS_MAX1111 is not set +# CONFIG_SENSORS_MAX127 is not set +# CONFIG_SENSORS_MAX16065 is not set +# CONFIG_SENSORS_MAX1619 is not set +# CONFIG_SENSORS_MAX1668 is not set +# CONFIG_SENSORS_MAX197 is not set +# CONFIG_SENSORS_MAX31722 is not set +# CONFIG_SENSORS_MAX31730 is not set +# CONFIG_SENSORS_MAX31760 is not set +# CONFIG_MAX31827 is not set +# CONFIG_SENSORS_MAX6620 is not set +# CONFIG_SENSORS_MAX6621 is not set +# CONFIG_SENSORS_MAX6639 is not set +# CONFIG_SENSORS_MAX6650 is not set +# CONFIG_SENSORS_MAX6697 is not set +# CONFIG_SENSORS_MAX31790 is not set +# CONFIG_SENSORS_MC34VR500 is not set +# CONFIG_SENSORS_MCP3021 is not set +# CONFIG_SENSORS_TC654 is not set +# CONFIG_SENSORS_TPS23861 is not set +# CONFIG_SENSORS_MR75203 is not set +# CONFIG_SENSORS_ADCXX is not set +# CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM70 is not set +# CONFIG_SENSORS_LM73 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_LM95234 is not set +# CONFIG_SENSORS_LM95241 is not set +# CONFIG_SENSORS_LM95245 is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_PC87427 is not set +# CONFIG_SENSORS_NTC_THERMISTOR is not set +# CONFIG_SENSORS_NCT6683 is not set +# CONFIG_SENSORS_NCT6775_I2C is not set +# CONFIG_SENSORS_NCT7802 is not set +# CONFIG_SENSORS_NCT7904 is not set +# CONFIG_SENSORS_NPCM7XX is not set +# CONFIG_SENSORS_NZXT_KRAKEN2 is not set +# CONFIG_SENSORS_NZXT_KRAKEN3 is not set +# CONFIG_SENSORS_NZXT_SMART2 is not set +# CONFIG_SENSORS_OCC_P8_I2C is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_PMBUS is not set +# CONFIG_SENSORS_PT5161L is not set +# CONFIG_SENSORS_PWM_FAN is not set +# CONFIG_SENSORS_SBTSI is not set +# CONFIG_SENSORS_SBRMI is not set +# CONFIG_SENSORS_SHT15 is not set +# CONFIG_SENSORS_SHT21 is not set +# CONFIG_SENSORS_SHT3x is not set +# CONFIG_SENSORS_SHT4x is not set +# CONFIG_SENSORS_SHTC1 is not set +# CONFIG_SENSORS_DME1737 is not set +# CONFIG_SENSORS_EMC1403 is not set +# CONFIG_SENSORS_EMC2103 is not set +# CONFIG_SENSORS_EMC2305 is not set +# CONFIG_SENSORS_EMC6W201 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_SCH5627 is not set +# CONFIG_SENSORS_SCH5636 is not set +# CONFIG_SENSORS_STTS751 is not set +# CONFIG_SENSORS_ADC128D818 is not set +# CONFIG_SENSORS_ADS7828 is not set +# CONFIG_SENSORS_ADS7871 is not set +# CONFIG_SENSORS_AMC6821 is not set +# CONFIG_SENSORS_INA209 is not set +# CONFIG_SENSORS_INA2XX is not set +# CONFIG_SENSORS_INA238 is not set +# CONFIG_SENSORS_INA3221 is not set +# CONFIG_SENSORS_SPD5118 is not set +# CONFIG_SENSORS_TC74 is not set +# CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_TMP102 is not set +# CONFIG_SENSORS_TMP103 is not set +# CONFIG_SENSORS_TMP108 is not set +# CONFIG_SENSORS_TMP401 is not set +# CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_TMP464 is not set +# CONFIG_SENSORS_TMP513 is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_W83773G is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83795 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83L786NG is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +CONFIG_THERMAL=y +# CONFIG_THERMAL_NETLINK is not set +# CONFIG_THERMAL_STATISTICS is not set +# CONFIG_THERMAL_DEBUGFS is not set +# CONFIG_THERMAL_CORE_TESTING is not set +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_OF=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +# CONFIG_THERMAL_GOV_FAIR_SHARE is not set +CONFIG_THERMAL_GOV_STEP_WISE=y +# CONFIG_THERMAL_GOV_BANG_BANG is not set +# CONFIG_THERMAL_GOV_USER_SPACE is not set +CONFIG_CPU_THERMAL=y +CONFIG_CPU_FREQ_THERMAL=y +CONFIG_DEVFREQ_THERMAL=y +CONFIG_THERMAL_EMULATION=y +# CONFIG_THERMAL_MMIO is not set +# CONFIG_GENERIC_ADC_THERMAL is not set + +# +# Qualcomm thermal drivers +# +CONFIG_QCOM_TSENS=y +# CONFIG_QCOM_SPMI_ADC_TM5 is not set +CONFIG_QCOM_SPMI_TEMP_ALARM=y +# CONFIG_QCOM_LMH is not set +# end of Qualcomm thermal drivers + +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_CORE=y +# CONFIG_WATCHDOG_NOWAYOUT is not set +CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y +CONFIG_WATCHDOG_OPEN_TIMEOUT=0 +CONFIG_WATCHDOG_SYSFS=y +# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set + +# +# Watchdog Pretimeout Governors +# +# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +# CONFIG_GPIO_WATCHDOG is not set +# CONFIG_XILINX_WATCHDOG is not set +# CONFIG_ZIIRAVE_WATCHDOG is not set +# CONFIG_ARM_SP805_WATCHDOG is not set +# CONFIG_CADENCE_WATCHDOG is not set +# CONFIG_FTWDT010_WATCHDOG is not set +# CONFIG_DW_WATCHDOG is not set +# CONFIG_MAX63XX_WATCHDOG is not set +CONFIG_QCOM_WDT=y +# CONFIG_ARM_SMC_WATCHDOG is not set +CONFIG_PM8916_WATCHDOG=y +# CONFIG_MEN_A21_WDT is not set + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSB is not set +CONFIG_BCMA_POSSIBLE=y +# CONFIG_BCMA is not set + +# +# Multifunction device drivers +# +CONFIG_MFD_CORE=m +# CONFIG_MFD_ADP5585 is not set +# CONFIG_MFD_ACT8945A is not set +# CONFIG_MFD_AS3711 is not set +# CONFIG_MFD_SMPRO is not set +# CONFIG_MFD_AS3722 is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_MFD_AAT2870_CORE is not set +# CONFIG_MFD_ATMEL_FLEXCOM is not set +# CONFIG_MFD_ATMEL_HLCDC is not set +# CONFIG_MFD_BCM590XX is not set +# CONFIG_MFD_BD9571MWV is not set +# CONFIG_MFD_AXP20X_I2C is not set +# CONFIG_MFD_CS42L43_I2C is not set +# CONFIG_MFD_MADERA is not set +# CONFIG_MFD_MAX5970 is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_DA9052_SPI is not set +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9055 is not set +# CONFIG_MFD_DA9062 is not set +# CONFIG_MFD_DA9063 is not set +# CONFIG_MFD_DA9150 is not set +# CONFIG_MFD_DLN2 is not set +# CONFIG_MFD_GATEWORKS_GSC is not set +# CONFIG_MFD_MC13XXX_SPI is not set +# CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_MFD_MP2629 is not set +# CONFIG_MFD_HI6421_PMIC is not set +# CONFIG_MFD_HI6421_SPMI is not set +# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_88PM886_PMIC is not set +# CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77541 is not set +# CONFIG_MFD_MAX77620 is not set +# CONFIG_MFD_MAX77650 is not set +# CONFIG_MFD_MAX77686 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX77714 is not set +# CONFIG_MFD_MAX77843 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +# CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6370 is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_MENF21BMC is not set +# CONFIG_MFD_OCELOT is not set +# CONFIG_EZX_PCAP is not set +# CONFIG_MFD_CPCAP is not set +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_NTXEC is not set +# CONFIG_MFD_RETU is not set +# CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_PM8XXX is not set +# CONFIG_MFD_QCOM_RPM is not set +CONFIG_MFD_SPMI_PMIC=y +# CONFIG_MFD_SY7636A is not set +# CONFIG_MFD_RT4831 is not set +CONFIG_MFD_RT5033=m +# CONFIG_MFD_RT5120 is not set +# CONFIG_MFD_RC5T583 is not set +# CONFIG_MFD_RK8XX_I2C is not set +# CONFIG_MFD_RK8XX_SPI is not set +# CONFIG_MFD_RN5T618 is not set +# CONFIG_MFD_SEC_CORE is not set +# CONFIG_MFD_SI476X_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SKY81452 is not set +# CONFIG_MFD_STMPE is not set +CONFIG_MFD_SYSCON=y +# CONFIG_MFD_LP3943 is not set +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_TI_LMU is not set +# CONFIG_MFD_PALMAS is not set +# CONFIG_TPS6105X is not set +# CONFIG_TPS65010 is not set +# CONFIG_TPS6507X is not set +# CONFIG_MFD_TPS65086 is not set +# CONFIG_MFD_TPS65090 is not set +# CONFIG_MFD_TPS65217 is not set +# CONFIG_MFD_TI_LP873X is not set +# CONFIG_MFD_TI_LP87565 is not set +# CONFIG_MFD_TPS65218 is not set +# CONFIG_MFD_TPS65219 is not set +# CONFIG_MFD_TPS6586X is not set +# CONFIG_MFD_TPS65910 is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS65912_SPI is not set +# CONFIG_MFD_TPS6594_I2C is not set +# CONFIG_MFD_TPS6594_SPI is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL6040_CORE is not set +# CONFIG_MFD_WL1273_CORE is not set +# CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_TC3589X is not set +# CONFIG_MFD_TQMX86 is not set +# CONFIG_MFD_LOCHNAGAR is not set +# CONFIG_MFD_ARIZONA_I2C is not set +# CONFIG_MFD_ARIZONA_SPI is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM831X_I2C is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_ROHM_BD718XX is not set +# CONFIG_MFD_ROHM_BD71828 is not set +# CONFIG_MFD_ROHM_BD957XMUF is not set +# CONFIG_MFD_ROHM_BD96801 is not set +# CONFIG_MFD_STPMIC1 is not set +# CONFIG_MFD_STMFX is not set +# CONFIG_MFD_ATC260X_I2C is not set +# CONFIG_MFD_QCOM_PM8008 is not set +# CONFIG_MFD_CS40L50_I2C is not set +# CONFIG_MFD_CS40L50_SPI is not set +# CONFIG_RAVE_SP_CORE is not set +# CONFIG_MFD_INTEL_M10_BMC_SPI is not set +# CONFIG_MFD_RSMU_I2C is not set +# CONFIG_MFD_RSMU_SPI is not set +# end of Multifunction device drivers + +CONFIG_REGULATOR=y +# CONFIG_REGULATOR_DEBUG is not set +CONFIG_REGULATOR_FIXED_VOLTAGE=y +# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set +# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set +# CONFIG_REGULATOR_NETLINK_EVENTS is not set +# CONFIG_REGULATOR_88PG86X is not set +# CONFIG_REGULATOR_ACT8865 is not set +# CONFIG_REGULATOR_AD5398 is not set +# CONFIG_REGULATOR_AW37503 is not set +# CONFIG_REGULATOR_DA9121 is not set +# CONFIG_REGULATOR_DA9210 is not set +# CONFIG_REGULATOR_DA9211 is not set +# CONFIG_REGULATOR_FAN53555 is not set +# CONFIG_REGULATOR_FAN53880 is not set +# CONFIG_REGULATOR_GPIO is not set +# CONFIG_REGULATOR_ISL9305 is not set +# CONFIG_REGULATOR_ISL6271A is not set +# CONFIG_REGULATOR_LP3971 is not set +# CONFIG_REGULATOR_LP3972 is not set +# CONFIG_REGULATOR_LP872X is not set +# CONFIG_REGULATOR_LP8755 is not set +# CONFIG_REGULATOR_LTC3589 is not set +# CONFIG_REGULATOR_LTC3676 is not set +# CONFIG_REGULATOR_MAX1586 is not set +# CONFIG_REGULATOR_MAX77503 is not set +# CONFIG_REGULATOR_MAX77857 is not set +# CONFIG_REGULATOR_MAX8649 is not set +# CONFIG_REGULATOR_MAX8660 is not set +# CONFIG_REGULATOR_MAX8893 is not set +# CONFIG_REGULATOR_MAX8952 is not set +# CONFIG_REGULATOR_MAX8973 is not set +# CONFIG_REGULATOR_MAX20086 is not set +# CONFIG_REGULATOR_MAX20411 is not set +# CONFIG_REGULATOR_MAX77826 is not set +# CONFIG_REGULATOR_MCP16502 is not set +# CONFIG_REGULATOR_MP5416 is not set +# CONFIG_REGULATOR_MP8859 is not set +# CONFIG_REGULATOR_MP886X is not set +# CONFIG_REGULATOR_MPQ7920 is not set +# CONFIG_REGULATOR_MT6311 is not set +# CONFIG_REGULATOR_MT6315 is not set +# CONFIG_REGULATOR_PCA9450 is not set +# CONFIG_REGULATOR_PF8X00 is not set +# CONFIG_REGULATOR_PFUZE100 is not set +# CONFIG_REGULATOR_PV88060 is not set +# CONFIG_REGULATOR_PV88080 is not set +# CONFIG_REGULATOR_PV88090 is not set +# CONFIG_REGULATOR_PWM is not set +# CONFIG_REGULATOR_QCOM_REFGEN is not set +CONFIG_REGULATOR_QCOM_SMD_RPM=y +CONFIG_REGULATOR_QCOM_SPMI=y +# CONFIG_REGULATOR_QCOM_USB_VBUS is not set +# CONFIG_REGULATOR_RAA215300 is not set +# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set +# CONFIG_REGULATOR_RT4801 is not set +# CONFIG_REGULATOR_RT4803 is not set +CONFIG_REGULATOR_RT5033=m +# CONFIG_REGULATOR_RT5190A is not set +# CONFIG_REGULATOR_RT5739 is not set +# CONFIG_REGULATOR_RT5759 is not set +# CONFIG_REGULATOR_RT6160 is not set +# CONFIG_REGULATOR_RT6190 is not set +# CONFIG_REGULATOR_RT6245 is not set +# CONFIG_REGULATOR_RTQ2134 is not set +# CONFIG_REGULATOR_RTMV20 is not set +# CONFIG_REGULATOR_RTQ6752 is not set +# CONFIG_REGULATOR_RTQ2208 is not set +# CONFIG_REGULATOR_SLG51000 is not set +# CONFIG_REGULATOR_SY8106A is not set +# CONFIG_REGULATOR_SY8824X is not set +# CONFIG_REGULATOR_SY8827N is not set +# CONFIG_REGULATOR_TPS51632 is not set +# CONFIG_REGULATOR_TPS62360 is not set +# CONFIG_REGULATOR_TPS6286X is not set +# CONFIG_REGULATOR_TPS6287X is not set +# CONFIG_REGULATOR_TPS65023 is not set +# CONFIG_REGULATOR_TPS6507X is not set +CONFIG_REGULATOR_TPS65132=y +# CONFIG_REGULATOR_TPS6524X is not set +# CONFIG_REGULATOR_VCTRL is not set +# CONFIG_REGULATOR_VQMMC_IPQ4019 is not set +# CONFIG_REGULATOR_QCOM_LABIBB is not set +# CONFIG_RC_CORE is not set +CONFIG_CEC_CORE=m + +# +# CEC support +# +# CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + +CONFIG_MEDIA_SUPPORT=m +CONFIG_MEDIA_SUPPORT_FILTER=y +CONFIG_MEDIA_SUBDRV_AUTOSELECT=y + +# +# Media device types +# +CONFIG_MEDIA_CAMERA_SUPPORT=y +# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set +# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set +# CONFIG_MEDIA_RADIO_SUPPORT is not set +# CONFIG_MEDIA_SDR_SUPPORT is not set +CONFIG_MEDIA_PLATFORM_SUPPORT=y +# CONFIG_MEDIA_TEST_SUPPORT is not set +# end of Media device types + +CONFIG_VIDEO_DEV=m +CONFIG_MEDIA_CONTROLLER=y + +# +# Video4Linux options +# +CONFIG_VIDEO_V4L2_I2C=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +CONFIG_V4L2_MEM2MEM_DEV=m +CONFIG_V4L2_FLASH_LED_CLASS=m +CONFIG_V4L2_FWNODE=m +CONFIG_V4L2_ASYNC=m +# end of Video4Linux options + +# +# Media controller options +# +# end of Media controller options + +# +# Media drivers +# + +# +# Drivers filtered as selected at 'Filter media drivers' +# + +# +# Media drivers +# +CONFIG_MEDIA_USB_SUPPORT=y + +# +# Webcam devices +# +# CONFIG_USB_GSPCA is not set +# CONFIG_USB_PWC is not set +# CONFIG_USB_S2255 is not set +# CONFIG_VIDEO_USBTV is not set +CONFIG_USB_VIDEO_CLASS=m +CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y + +# +# Webcam, TV (analog/digital) USB devices +# +# CONFIG_VIDEO_EM28XX is not set +CONFIG_MEDIA_PLATFORM_DRIVERS=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_V4L_MEM2MEM_DRIVERS=y +# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set +# CONFIG_VIDEO_MUX is not set + +# +# Allegro DVT media platform drivers +# + +# +# Amlogic media platform drivers +# + +# +# Amphion drivers +# + +# +# Aspeed media platform drivers +# + +# +# Atmel media platform drivers +# + +# +# Cadence media platform drivers +# +# CONFIG_VIDEO_CADENCE_CSI2RX is not set +# CONFIG_VIDEO_CADENCE_CSI2TX is not set + +# +# Chips&Media media platform drivers +# + +# +# Intel media platform drivers +# + +# +# Marvell media platform drivers +# + +# +# Mediatek media platform drivers +# + +# +# Microchip Technology, Inc. media platform drivers +# + +# +# Nuvoton media platform drivers +# + +# +# NVidia media platform drivers +# + +# +# NXP media platform drivers +# + +# +# Qualcomm media platform drivers +# +CONFIG_VIDEO_QCOM_CAMSS=m +CONFIG_VIDEO_QCOM_VENUS=m + +# +# Raspberry Pi media platform drivers +# + +# +# Renesas media platform drivers +# + +# +# Rockchip media platform drivers +# + +# +# Samsung media platform drivers +# + +# +# STMicroelectronics media platform drivers +# + +# +# Sunxi media platform drivers +# + +# +# Texas Instruments drivers +# + +# +# Verisilicon media platform drivers +# + +# +# VIA media platform drivers +# + +# +# Xilinx media platform drivers +# +# CONFIG_VIDEO_XILINX is not set +CONFIG_UVC_COMMON=m +CONFIG_VIDEOBUF2_CORE=m +CONFIG_VIDEOBUF2_V4L2=m +CONFIG_VIDEOBUF2_MEMOPS=m +CONFIG_VIDEOBUF2_DMA_CONTIG=m +CONFIG_VIDEOBUF2_VMALLOC=m +CONFIG_VIDEOBUF2_DMA_SG=m +# end of Media drivers + +CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y + +# +# Media ancillary drivers +# +CONFIG_VIDEO_CAMERA_SENSOR=y +# CONFIG_VIDEO_ALVIUM_CSI2 is not set +# CONFIG_VIDEO_AR0521 is not set +# CONFIG_VIDEO_GC0308 is not set +# CONFIG_VIDEO_GC05A2 is not set +# CONFIG_VIDEO_GC08A3 is not set +# CONFIG_VIDEO_GC2145 is not set +# CONFIG_VIDEO_HI556 is not set +# CONFIG_VIDEO_HI846 is not set +# CONFIG_VIDEO_HI847 is not set +# CONFIG_VIDEO_IMX208 is not set +# CONFIG_VIDEO_IMX214 is not set +# CONFIG_VIDEO_IMX219 is not set +# CONFIG_VIDEO_IMX258 is not set +# CONFIG_VIDEO_IMX274 is not set +# CONFIG_VIDEO_IMX283 is not set +# CONFIG_VIDEO_IMX290 is not set +# CONFIG_VIDEO_IMX296 is not set +# CONFIG_VIDEO_IMX319 is not set +# CONFIG_VIDEO_IMX334 is not set +# CONFIG_VIDEO_IMX335 is not set +# CONFIG_VIDEO_IMX355 is not set +# CONFIG_VIDEO_IMX412 is not set +# CONFIG_VIDEO_IMX415 is not set +# CONFIG_VIDEO_MT9M001 is not set +# CONFIG_VIDEO_MT9M111 is not set +# CONFIG_VIDEO_MT9M114 is not set +# CONFIG_VIDEO_MT9P031 is not set +# CONFIG_VIDEO_MT9T112 is not set +# CONFIG_VIDEO_MT9V011 is not set +# CONFIG_VIDEO_MT9V032 is not set +# CONFIG_VIDEO_MT9V111 is not set +# CONFIG_VIDEO_OG01A1B is not set +# CONFIG_VIDEO_OV01A10 is not set +# CONFIG_VIDEO_OV02A10 is not set +# CONFIG_VIDEO_OV08D10 is not set +# CONFIG_VIDEO_OV08X40 is not set +# CONFIG_VIDEO_OV13858 is not set +# CONFIG_VIDEO_OV13B10 is not set +# CONFIG_VIDEO_OV2640 is not set +# CONFIG_VIDEO_OV2659 is not set +# CONFIG_VIDEO_OV2680 is not set +# CONFIG_VIDEO_OV2685 is not set +# CONFIG_VIDEO_OV4689 is not set +# CONFIG_VIDEO_OV5640 is not set +# CONFIG_VIDEO_OV5645 is not set +# CONFIG_VIDEO_OV5647 is not set +# CONFIG_VIDEO_OV5648 is not set +# CONFIG_VIDEO_OV5670 is not set +# CONFIG_VIDEO_OV5675 is not set +# CONFIG_VIDEO_OV5693 is not set +# CONFIG_VIDEO_OV5695 is not set +# CONFIG_VIDEO_OV64A40 is not set +# CONFIG_VIDEO_OV6650 is not set +# CONFIG_VIDEO_OV7251 is not set +# CONFIG_VIDEO_OV7640 is not set +# CONFIG_VIDEO_OV7670 is not set +# CONFIG_VIDEO_OV772X is not set +# CONFIG_VIDEO_OV7740 is not set +# CONFIG_VIDEO_OV8856 is not set +# CONFIG_VIDEO_OV8858 is not set +# CONFIG_VIDEO_OV8865 is not set +# CONFIG_VIDEO_OV9282 is not set +# CONFIG_VIDEO_OV9640 is not set +# CONFIG_VIDEO_OV9650 is not set +# CONFIG_VIDEO_RDACM20 is not set +# CONFIG_VIDEO_RDACM21 is not set +# CONFIG_VIDEO_RJ54N1 is not set +# CONFIG_VIDEO_S5C73M3 is not set +# CONFIG_VIDEO_S5K5BAF is not set +# CONFIG_VIDEO_S5K6A3 is not set +# CONFIG_VIDEO_VGXY61 is not set +# CONFIG_VIDEO_CCS is not set +# CONFIG_VIDEO_ET8EK8 is not set + +# +# Camera ISPs +# +# CONFIG_VIDEO_THP7312 is not set +# end of Camera ISPs + +# +# Lens drivers +# +# CONFIG_VIDEO_AD5820 is not set +# CONFIG_VIDEO_AK7375 is not set +# CONFIG_VIDEO_DW9714 is not set +# CONFIG_VIDEO_DW9719 is not set +# CONFIG_VIDEO_DW9768 is not set +# CONFIG_VIDEO_DW9807_VCM is not set +# end of Lens drivers + +# +# Flash devices +# +# CONFIG_VIDEO_ADP1653 is not set +# CONFIG_VIDEO_LM3560 is not set +# CONFIG_VIDEO_LM3646 is not set +# end of Flash devices + +# +# audio, video and radio I2C drivers auto-selected by 'Autoselect ancillary drivers' +# + +# +# Video and audio decoders +# + +# +# Video serializers and deserializers +# +# CONFIG_VIDEO_DS90UB913 is not set +# CONFIG_VIDEO_DS90UB953 is not set +# CONFIG_VIDEO_DS90UB960 is not set +# CONFIG_VIDEO_MAX96714 is not set +# CONFIG_VIDEO_MAX96717 is not set +# end of Video serializers and deserializers + +# +# SPI I2C drivers auto-selected by 'Autoselect ancillary drivers' +# + +# +# Media SPI Adapters +# +# CONFIG_VIDEO_GS1662 is not set +# end of Media SPI Adapters +# end of Media ancillary drivers + +# +# Graphics support +# +CONFIG_APERTURE_HELPERS=y +CONFIG_SCREEN_INFO=y +CONFIG_VIDEO=y +# CONFIG_AUXDISPLAY is not set +CONFIG_DRM=y +CONFIG_DRM_MIPI_DBI=m +CONFIG_DRM_MIPI_DSI=y +# CONFIG_DRM_DEBUG_MM is not set +CONFIG_DRM_KMS_HELPER=y +# CONFIG_DRM_PANIC is not set +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_FBDEV_OVERALLOC=100 +# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set +CONFIG_DRM_DISPLAY_DP_AUX_BUS=m +CONFIG_DRM_DISPLAY_HELPER=m +CONFIG_DRM_BRIDGE_CONNECTOR=y +# CONFIG_DRM_DISPLAY_DP_AUX_CEC is not set +# CONFIG_DRM_DISPLAY_DP_AUX_CHARDEV is not set +CONFIG_DRM_DISPLAY_DP_HELPER=y +CONFIG_DRM_DISPLAY_HDMI_HELPER=y +CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER=y +CONFIG_DRM_EXEC=m +CONFIG_DRM_GEM_DMA_HELPER=m +CONFIG_DRM_GEM_SHMEM_HELPER=y +CONFIG_DRM_SCHED=m + +# +# I2C encoder or helper chips +# +# CONFIG_DRM_I2C_CH7006 is not set +# CONFIG_DRM_I2C_SIL164 is not set +# CONFIG_DRM_I2C_NXP_TDA998X is not set +# CONFIG_DRM_I2C_NXP_TDA9950 is not set +# end of I2C encoder or helper chips + +# +# ARM devices +# +# CONFIG_DRM_HDLCD is not set +# CONFIG_DRM_MALI_DISPLAY is not set +# CONFIG_DRM_KOMEDA is not set +# end of ARM devices + +# CONFIG_DRM_VGEM is not set +# CONFIG_DRM_VKMS is not set +CONFIG_DRM_UDL=m +# CONFIG_DRM_ARMADA is not set +# CONFIG_DRM_TILCDC is not set +# CONFIG_DRM_VIRTIO_GPU is not set +CONFIG_DRM_MSM=m +CONFIG_DRM_MSM_GPU_STATE=y +CONFIG_DRM_MSM_MDSS=y +# CONFIG_DRM_MSM_MDP4 is not set +CONFIG_DRM_MSM_MDP5=y +# CONFIG_DRM_MSM_DPU is not set +# CONFIG_DRM_MSM_DP is not set +CONFIG_DRM_MSM_DSI=y +CONFIG_DRM_MSM_DSI_28NM_PHY=y +# CONFIG_DRM_MSM_DSI_20NM_PHY is not set +# CONFIG_DRM_MSM_DSI_28NM_8960_PHY is not set +# CONFIG_DRM_MSM_DSI_14NM_PHY is not set +# CONFIG_DRM_MSM_DSI_10NM_PHY is not set +# CONFIG_DRM_MSM_DSI_7NM_PHY is not set +# CONFIG_DRM_MSM_HDMI is not set +# CONFIG_DRM_FSL_DCU is not set +CONFIG_DRM_PANEL=y + +# +# Display Panels +# +# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set +# CONFIG_DRM_PANEL_ARM_VERSATILE is not set +# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set +# CONFIG_DRM_PANEL_AUO_A030JTN01 is not set +# CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set +# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set +# CONFIG_DRM_PANEL_BOE_TH101MB31UIG002_28A is not set +# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set +# CONFIG_DRM_PANEL_BOE_TV101WUM_LL2 is not set +# CONFIG_DRM_PANEL_EBBG_FT8719 is not set +# CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set +# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set +# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set +# CONFIG_DRM_PANEL_DSI_CM is not set +# CONFIG_DRM_PANEL_LVDS is not set +# CONFIG_DRM_PANEL_HIMAX_HX83102 is not set +# CONFIG_DRM_PANEL_HIMAX_HX83112A is not set +# CONFIG_DRM_PANEL_HIMAX_HX8394 is not set +# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9805 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9806E is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9882T is not set +# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set +# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set +# CONFIG_DRM_PANEL_JADARD_JD9365DA_H3 is not set +# CONFIG_DRM_PANEL_JDI_LPM102A188A is not set +# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set +# CONFIG_DRM_PANEL_JDI_R63452 is not set +# CONFIG_DRM_PANEL_KHADAS_TS050 is not set +# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set +# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set +# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set +# CONFIG_DRM_PANEL_LINCOLNTECH_LCD197 is not set +# CONFIG_DRM_PANEL_LG_LB035Q02 is not set +# CONFIG_DRM_PANEL_LG_LG4573 is not set +# CONFIG_DRM_PANEL_LG_SW43408 is not set +# CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966 is not set +# CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set +# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set +# CONFIG_DRM_PANEL_NEWVISION_NV3051D is not set +# CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36523 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36672E is not set +# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set +# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set +# CONFIG_DRM_PANEL_ORISETECH_OTA5601A is not set +# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set +# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set +# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set +# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM692E5 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM69380 is not set +# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set +CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01=m +# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set +# CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set +# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E3FA7 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set +CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0=m +# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set +# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set +# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set +# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set +# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set +# CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set +# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set +# CONFIG_DRM_PANEL_SONY_TD4353_JDI is not set +# CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set +# CONFIG_DRM_PANEL_STARTEK_KD070FHFID015 is not set +# CONFIG_DRM_PANEL_EDP is not set +CONFIG_DRM_PANEL_SIMPLE=m +# CONFIG_DRM_PANEL_SYNAPTICS_R63353 is not set +# CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set +# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set +# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set +# CONFIG_DRM_PANEL_TPO_TPG110 is not set +# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set +# CONFIG_DRM_PANEL_VISIONOX_R66451 is not set +# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set +# CONFIG_DRM_PANEL_VISIONOX_VTDR6130 is not set +# CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set +# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set + +# +# MSM8916 panel drivers generated with linux-mdss-dsi-panel-driver-generator +# +CONFIG_DRM_PANEL_MSM8916_GENERATED=m +CONFIG_DRM_PANEL_ACER_A1_724_HX8394D=m +CONFIG_DRM_PANEL_ALCATEL_AUO_HX8394D=m +CONFIG_DRM_PANEL_ALCATEL_IDOL3_NT35596=m +CONFIG_DRM_PANEL_ALCATEL_IDOL3_R63315=m +CONFIG_DRM_PANEL_ASUS_Z00L_OTM1284A=m +CONFIG_DRM_PANEL_ASUS_Z010D_R69339=m +CONFIG_DRM_PANEL_GPLUS_FL8005A_HX8394D=m +CONFIG_DRM_PANEL_HUAWEI_BOE_OTM8019A=m +CONFIG_DRM_PANEL_HUAWEI_KIWI_CMI_NT35532=m +CONFIG_DRM_PANEL_HUAWEI_KIWI_TIANMA_NT35596=m +CONFIG_DRM_PANEL_HUAWEI_TIANMA_NT35521=m +CONFIG_DRM_PANEL_LONGCHEER_BOOYI_OTM1287=m +CONFIG_DRM_PANEL_LONGCHEER_DIJING_ILI9881C=m +CONFIG_DRM_PANEL_LONGCHEER_TRULY_NT35695=m +CONFIG_DRM_PANEL_LONGCHEER_TRULY_OTM1288A=m +CONFIG_DRM_PANEL_LONGCHEER_YUSHUN_NT35520=m +CONFIG_DRM_PANEL_LONGCHEER_YUSHUN_NT35521S=m +CONFIG_DRM_PANEL_MOTOROLA_HARPIA_BOE=m +CONFIG_DRM_PANEL_MOTOROLA_HARPIA_TIANMA=m +CONFIG_DRM_PANEL_MOTOROLA_OSPREY_INX=m +CONFIG_DRM_PANEL_MOTOROLA_SURNIA_BOE=m +CONFIG_DRM_PANEL_MOTOROLA_SURNIA_INX=m +CONFIG_DRM_PANEL_SAMSUNG_EA8061_AMS549BU19_ID400418=m +CONFIG_DRM_PANEL_SAMSUNG_EA8061V_AMS497EE01=m +CONFIG_DRM_PANEL_SAMSUNG_HX8389C_GH9607501A=m +CONFIG_DRM_PANEL_SAMSUNG_NT51017_B4P096WX5VP09=m +CONFIG_DRM_PANEL_SAMSUNG_S6288A0=m +CONFIG_DRM_PANEL_SAMSUNG_S6D2AA0X62_LPM053A250A=m +CONFIG_DRM_PANEL_SAMSUNG_S6D78A0_GH9607501A=m +CONFIG_DRM_PANEL_SAMSUNG_S6E3FA2_AMS549EH01=m +CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS427AP24=m +CONFIG_DRM_PANEL_SAMSUNG_S6E8AA5X01_AMS497HY01=m +CONFIG_DRM_PANEL_SAMSUNG_S6E8AA5X01_AMS520KT01=m +CONFIG_DRM_PANEL_SAMSUNG_SC7798A_BV045WVM=m +CONFIG_DRM_PANEL_WINGTECH_AUO_NT35521=m +CONFIG_DRM_PANEL_WINGTECH_AUO_R61308=m +CONFIG_DRM_PANEL_WINGTECH_BOE_HX8394F=m +CONFIG_DRM_PANEL_WINGTECH_BOE_NT35521S=m +CONFIG_DRM_PANEL_WINGTECH_EBBG_OTM1285A=m +CONFIG_DRM_PANEL_WINGTECH_OTM_ILI9881C=m +CONFIG_DRM_PANEL_WINGTECH_QIMEI_ILI9881=m +CONFIG_DRM_PANEL_WINGTECH_SHARP_R69431=m +CONFIG_DRM_PANEL_WINGTECH_TIANMA_HX8394D=m +CONFIG_DRM_PANEL_WINGTECH_TM_OTM1901A=m +CONFIG_DRM_PANEL_WINGTECH_YASSY_ILI9881=m +# end of MSM8916 panel drivers generated with linux-mdss-dsi-panel-driver-generator +# end of Display Panels + +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y + +# +# Display Interface Bridges +# +# CONFIG_DRM_CHIPONE_ICN6211 is not set +# CONFIG_DRM_CHRONTEL_CH7033 is not set +CONFIG_DRM_DISPLAY_CONNECTOR=m +# CONFIG_DRM_ITE_IT6505 is not set +# CONFIG_DRM_LONTIUM_LT8912B is not set +# CONFIG_DRM_LONTIUM_LT9211 is not set +# CONFIG_DRM_LONTIUM_LT9611 is not set +# CONFIG_DRM_LONTIUM_LT9611UXC is not set +# CONFIG_DRM_ITE_IT66121 is not set +# CONFIG_DRM_LVDS_CODEC is not set +# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set +# CONFIG_DRM_NWL_MIPI_DSI is not set +# CONFIG_DRM_NXP_PTN3460 is not set +# CONFIG_DRM_PARADE_PS8622 is not set +# CONFIG_DRM_PARADE_PS8640 is not set +# CONFIG_DRM_SAMSUNG_DSIM is not set +# CONFIG_DRM_SIL_SII8620 is not set +# CONFIG_DRM_SII902X is not set +# CONFIG_DRM_SII9234 is not set +# CONFIG_DRM_SIMPLE_BRIDGE is not set +# CONFIG_DRM_THINE_THC63LVD1024 is not set +# CONFIG_DRM_TOSHIBA_TC358762 is not set +# CONFIG_DRM_TOSHIBA_TC358764 is not set +# CONFIG_DRM_TOSHIBA_TC358767 is not set +# CONFIG_DRM_TOSHIBA_TC358768 is not set +# CONFIG_DRM_TOSHIBA_TC358775 is not set +# CONFIG_DRM_TI_DLPC3433 is not set +# CONFIG_DRM_TI_TFP410 is not set +# CONFIG_DRM_TI_SN65DSI83 is not set +# CONFIG_DRM_TI_SN65DSI86 is not set +# CONFIG_DRM_TI_TPD12S015 is not set +# CONFIG_DRM_ANALOGIX_ANX6345 is not set +# CONFIG_DRM_ANALOGIX_ANX78XX is not set +# CONFIG_DRM_ANALOGIX_ANX7625 is not set +CONFIG_DRM_I2C_ADV7511=m +CONFIG_DRM_I2C_ADV7511_AUDIO=y +CONFIG_DRM_I2C_ADV7511_CEC=y +# CONFIG_DRM_CDNS_DSI is not set +# CONFIG_DRM_CDNS_MHDP8546 is not set +# end of Display Interface Bridges + +# CONFIG_DRM_ETNAVIV is not set +# CONFIG_DRM_LOGICVC is not set +# CONFIG_DRM_ARCPGU is not set +# CONFIG_DRM_GM12U320 is not set +CONFIG_DRM_PANEL_MIPI_DBI=m +CONFIG_DRM_SIMPLEDRM=y +# CONFIG_TINYDRM_HX8357D is not set +# CONFIG_TINYDRM_ILI9163 is not set +# CONFIG_TINYDRM_ILI9225 is not set +# CONFIG_TINYDRM_ILI9341 is not set +# CONFIG_TINYDRM_ILI9486 is not set +# CONFIG_TINYDRM_MI0283QT is not set +# CONFIG_TINYDRM_REPAPER is not set +# CONFIG_TINYDRM_ST7586 is not set +# CONFIG_TINYDRM_ST7735R is not set +# CONFIG_DRM_PL111 is not set +# CONFIG_DRM_TVE200 is not set +# CONFIG_DRM_LIMA is not set +# CONFIG_DRM_PANFROST is not set +# CONFIG_DRM_PANTHOR is not set +# CONFIG_DRM_MCDE is not set +# CONFIG_DRM_TIDSS is not set +# CONFIG_DRM_GUD is not set +# CONFIG_DRM_SSD130X is not set +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y + +# +# Frame buffer Devices +# +CONFIG_FB=y +CONFIG_FB_EFI=y +# CONFIG_FB_OPENCORES is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_SMSCUFX is not set +# CONFIG_FB_UDL is not set +# CONFIG_FB_IBM_GXT4500 is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_SSD1307 is not set +CONFIG_FB_CORE=y +CONFIG_FB_NOTIFY=y +# CONFIG_FIRMWARE_EDID is not set +CONFIG_FB_DEVICE=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYSMEM_FOPS=y +CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_DMAMEM_HELPERS=y +CONFIG_FB_IOMEM_FOPS=y +CONFIG_FB_IOMEM_HELPERS=y +CONFIG_FB_SYSMEM_HELPERS=y +CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set +# end of Frame buffer Devices + +# +# Backlight & LCD device support +# +CONFIG_LCD_CLASS_DEVICE=m +# CONFIG_LCD_L4F00242T03 is not set +# CONFIG_LCD_LMS283GF05 is not set +# CONFIG_LCD_LTV350QV is not set +# CONFIG_LCD_ILI922X is not set +# CONFIG_LCD_ILI9320 is not set +# CONFIG_LCD_TDO24M is not set +# CONFIG_LCD_VGG2432A4 is not set +# CONFIG_LCD_PLATFORM is not set +# CONFIG_LCD_AMS369FG06 is not set +# CONFIG_LCD_LMS501KF03 is not set +# CONFIG_LCD_HX8357 is not set +# CONFIG_LCD_OTM3225A is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_KTD253 is not set +# CONFIG_BACKLIGHT_KTD2801 is not set +# CONFIG_BACKLIGHT_KTZ8866 is not set +CONFIG_BACKLIGHT_PWM=y +# CONFIG_BACKLIGHT_QCOM_WLED is not set +# CONFIG_BACKLIGHT_ADP8860 is not set +# CONFIG_BACKLIGHT_ADP8870 is not set +# CONFIG_BACKLIGHT_LM3509 is not set +# CONFIG_BACKLIGHT_LM3630A is not set +# CONFIG_BACKLIGHT_LM3639 is not set +# CONFIG_BACKLIGHT_LP855X is not set +# CONFIG_BACKLIGHT_MP3309C is not set +# CONFIG_BACKLIGHT_GPIO is not set +# CONFIG_BACKLIGHT_LV5207LP is not set +# CONFIG_BACKLIGHT_BD6107 is not set +# CONFIG_BACKLIGHT_ARCXCNN is not set +# CONFIG_BACKLIGHT_LED is not set +# end of Backlight & LCD device support + +CONFIG_VIDEOMODE_HELPERS=y +CONFIG_HDMI=y + +# +# Console display driver support +# +CONFIG_DUMMY_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=30 +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set +# end of Console display driver support + +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_LOGO_LINUX_CLUT224=y +# end of Graphics support + +# CONFIG_DRM_ACCEL is not set +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +CONFIG_SND_PCM_ELD=y +CONFIG_SND_PCM_IEC958=y +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_UMP=m +# CONFIG_SND_UMP_LEGACY_RAWMIDI is not set +CONFIG_SND_COMPRESS_OFFLOAD=y +CONFIG_SND_JACK=y +CONFIG_SND_JACK_INPUT_DEV=y +# CONFIG_SND_OSSEMUL is not set +CONFIG_SND_PCM_TIMER=y +# CONFIG_SND_HRTIMER is not set +CONFIG_SND_DYNAMIC_MINORS=y +CONFIG_SND_MAX_CARDS=32 +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_PROC_FS=y +CONFIG_SND_VERBOSE_PROCFS=y +CONFIG_SND_CTL_FAST_LOOKUP=y +# CONFIG_SND_DEBUG is not set +# CONFIG_SND_CTL_INPUT_VALIDATION is not set +# CONFIG_SND_UTIMER is not set +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_DRIVERS=y +# CONFIG_SND_DUMMY is not set +CONFIG_SND_ALOOP=m +# CONFIG_SND_PCMTEST is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_SERIAL_GENERIC is not set +# CONFIG_SND_MPU401 is not set + +# +# HD-Audio +# +# end of HD-Audio + +CONFIG_SND_HDA_PREALLOC_SIZE=64 +CONFIG_SND_ARM=y +# CONFIG_SND_ARMAACI is not set +CONFIG_SND_SPI=y +CONFIG_SND_USB=y +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_USB_AUDIO_MIDI_V2=y +CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y +# CONFIG_SND_USB_UA101 is not set +# CONFIG_SND_USB_CAIAQ is not set +# CONFIG_SND_USB_6FIRE is not set +# CONFIG_SND_USB_HIFACE is not set +# CONFIG_SND_BCD2000 is not set +# CONFIG_SND_USB_POD is not set +# CONFIG_SND_USB_PODHD is not set +# CONFIG_SND_USB_TONEPORT is not set +# CONFIG_SND_USB_VARIAX is not set +CONFIG_SND_SOC=y +CONFIG_SND_SOC_COMPRESS=y +CONFIG_SND_SOC_TOPOLOGY=y +# CONFIG_SND_SOC_ADI is not set +# CONFIG_SND_SOC_AMD_ACP is not set +# CONFIG_SND_AMD_ACP_CONFIG is not set +# CONFIG_SND_ATMEL_SOC is not set +# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set +# CONFIG_SND_DESIGNWARE_I2S is not set + +# +# SoC Audio for Freescale CPUs +# + +# +# Common SoC Audio options for Freescale CPUs: +# +# CONFIG_SND_SOC_FSL_ASRC is not set +# CONFIG_SND_SOC_FSL_SAI is not set +# CONFIG_SND_SOC_FSL_AUDMIX is not set +# CONFIG_SND_SOC_FSL_SSI is not set +# CONFIG_SND_SOC_FSL_SPDIF is not set +# CONFIG_SND_SOC_FSL_ESAI is not set +# CONFIG_SND_SOC_FSL_MICFIL is not set +# CONFIG_SND_SOC_FSL_XCVR is not set +# CONFIG_SND_SOC_FSL_RPMSG is not set +# CONFIG_SND_SOC_IMX_AUDMUX is not set +# end of SoC Audio for Freescale CPUs + +# CONFIG_SND_SOC_CHV3_I2S is not set +# CONFIG_SND_I2S_HI6210_I2S is not set +# CONFIG_SND_SOC_IMG is not set +# CONFIG_SND_SOC_MTK_BTCVSD is not set +CONFIG_SND_SOC_QCOM=m +CONFIG_SND_SOC_LPASS_CPU=m +CONFIG_SND_SOC_LPASS_PLATFORM=m +CONFIG_SND_SOC_LPASS_APQ8016=m +# CONFIG_SND_SOC_STORM is not set +CONFIG_SND_SOC_APQ8016_SBC=m +CONFIG_SND_SOC_QCOM_COMMON=m +CONFIG_SND_SOC_QDSP6_COMMON=m +CONFIG_SND_SOC_QDSP6_CORE=m +CONFIG_SND_SOC_QDSP6_AFE=m +CONFIG_SND_SOC_QDSP6_AFE_DAI=m +CONFIG_SND_SOC_QDSP6_AFE_CLOCKS=m +CONFIG_SND_SOC_QDSP6_ADM=m +CONFIG_SND_SOC_QDSP6_ROUTING=m +CONFIG_SND_SOC_QDSP6_ASM=m +CONFIG_SND_SOC_QDSP6_ASM_DAI=m +CONFIG_SND_SOC_QDSP6_APM_DAI=m +CONFIG_SND_SOC_QDSP6_APM_LPASS_DAI=m +CONFIG_SND_SOC_QDSP6_APM=m +CONFIG_SND_SOC_QDSP6_PRM_LPASS_CLOCKS=m +CONFIG_SND_SOC_QDSP6_PRM=m +CONFIG_SND_SOC_QDSP6=m +CONFIG_SND_SOC_QDSP6_Q6VOICE_DAI=m +CONFIG_SND_SOC_QDSP6_Q6VOICE=m +# CONFIG_SND_SOC_MSM8996 is not set +# CONFIG_SND_SOC_SC7180 is not set +# CONFIG_SND_SOC_SOF_TOPLEVEL is not set + +# +# STMicroelectronics STM32 SOC audio support +# +# end of STMicroelectronics STM32 SOC audio support + +# CONFIG_SND_SOC_XILINX_I2S is not set +# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set +# CONFIG_SND_SOC_XILINX_SPDIF is not set +# CONFIG_SND_SOC_XTFPGA_I2S is not set +CONFIG_SND_SOC_I2C_AND_SPI=y + +# +# CODEC drivers +# +# CONFIG_SND_SOC_AC97_CODEC is not set +# CONFIG_SND_SOC_ADAU1372_I2C is not set +# CONFIG_SND_SOC_ADAU1372_SPI is not set +# CONFIG_SND_SOC_ADAU1701 is not set +# CONFIG_SND_SOC_ADAU1761_I2C is not set +# CONFIG_SND_SOC_ADAU1761_SPI is not set +# CONFIG_SND_SOC_ADAU7002 is not set +# CONFIG_SND_SOC_ADAU7118_HW is not set +# CONFIG_SND_SOC_ADAU7118_I2C is not set +# CONFIG_SND_SOC_AK4104 is not set +# CONFIG_SND_SOC_AK4118 is not set +CONFIG_SND_SOC_AK4375=m +# CONFIG_SND_SOC_AK4458 is not set +# CONFIG_SND_SOC_AK4554 is not set +# CONFIG_SND_SOC_AK4613 is not set +# CONFIG_SND_SOC_AK4619 is not set +# CONFIG_SND_SOC_AK4642 is not set +# CONFIG_SND_SOC_AK5386 is not set +# CONFIG_SND_SOC_AK5558 is not set +# CONFIG_SND_SOC_ALC5623 is not set +# CONFIG_SND_SOC_AUDIO_IIO_AUX is not set +CONFIG_SND_SOC_AW8738=m +# CONFIG_SND_SOC_AW88395 is not set +# CONFIG_SND_SOC_AW88261 is not set +# CONFIG_SND_SOC_AW87390 is not set +# CONFIG_SND_SOC_AW88399 is not set +# CONFIG_SND_SOC_BD28623 is not set +# CONFIG_SND_SOC_BT_SCO is not set +# CONFIG_SND_SOC_CHV3_CODEC is not set +# CONFIG_SND_SOC_CS35L32 is not set +# CONFIG_SND_SOC_CS35L33 is not set +# CONFIG_SND_SOC_CS35L34 is not set +# CONFIG_SND_SOC_CS35L35 is not set +# CONFIG_SND_SOC_CS35L36 is not set +# CONFIG_SND_SOC_CS35L41_SPI is not set +# CONFIG_SND_SOC_CS35L41_I2C is not set +# CONFIG_SND_SOC_CS35L45_SPI is not set +# CONFIG_SND_SOC_CS35L45_I2C is not set +# CONFIG_SND_SOC_CS35L56_I2C is not set +# CONFIG_SND_SOC_CS35L56_SPI is not set +# CONFIG_SND_SOC_CS42L42 is not set +# CONFIG_SND_SOC_CS42L51_I2C is not set +# CONFIG_SND_SOC_CS42L52 is not set +# CONFIG_SND_SOC_CS42L56 is not set +# CONFIG_SND_SOC_CS42L73 is not set +# CONFIG_SND_SOC_CS42L83 is not set +# CONFIG_SND_SOC_CS4234 is not set +# CONFIG_SND_SOC_CS4265 is not set +# CONFIG_SND_SOC_CS4270 is not set +# CONFIG_SND_SOC_CS4271_I2C is not set +# CONFIG_SND_SOC_CS4271_SPI is not set +# CONFIG_SND_SOC_CS42XX8_I2C is not set +# CONFIG_SND_SOC_CS43130 is not set +# CONFIG_SND_SOC_CS4341 is not set +# CONFIG_SND_SOC_CS4349 is not set +# CONFIG_SND_SOC_CS53L30 is not set +# CONFIG_SND_SOC_CS530X_I2C is not set +# CONFIG_SND_SOC_CX2072X is not set +# CONFIG_SND_SOC_DA7213 is not set +# CONFIG_SND_SOC_DMIC is not set +CONFIG_SND_SOC_HDMI_CODEC=m +# CONFIG_SND_SOC_ES7134 is not set +# CONFIG_SND_SOC_ES7241 is not set +# CONFIG_SND_SOC_ES8311 is not set +# CONFIG_SND_SOC_ES8316 is not set +# CONFIG_SND_SOC_ES8326 is not set +# CONFIG_SND_SOC_ES8328_I2C is not set +# CONFIG_SND_SOC_ES8328_SPI is not set +# CONFIG_SND_SOC_GTM601 is not set +# CONFIG_SND_SOC_HDA is not set +# CONFIG_SND_SOC_ICS43432 is not set +# CONFIG_SND_SOC_IDT821034 is not set +# CONFIG_SND_SOC_MAX98088 is not set +# CONFIG_SND_SOC_MAX98090 is not set +CONFIG_SND_SOC_MAX98357A=m +# CONFIG_SND_SOC_MAX98504 is not set +# CONFIG_SND_SOC_MAX9867 is not set +# CONFIG_SND_SOC_MAX98927 is not set +# CONFIG_SND_SOC_MAX98520 is not set +# CONFIG_SND_SOC_MAX98373_I2C is not set +# CONFIG_SND_SOC_MAX98388 is not set +# CONFIG_SND_SOC_MAX98390 is not set +# CONFIG_SND_SOC_MAX98396 is not set +# CONFIG_SND_SOC_MAX9860 is not set +CONFIG_SND_SOC_MSM8916_WCD_ANALOG=m +CONFIG_SND_SOC_MSM8916_WCD_DIGITAL=m +# CONFIG_SND_SOC_PCM1681 is not set +# CONFIG_SND_SOC_PCM1789_I2C is not set +# CONFIG_SND_SOC_PCM179X_I2C is not set +# CONFIG_SND_SOC_PCM179X_SPI is not set +# CONFIG_SND_SOC_PCM186X_I2C is not set +# CONFIG_SND_SOC_PCM186X_SPI is not set +# CONFIG_SND_SOC_PCM3060_I2C is not set +# CONFIG_SND_SOC_PCM3060_SPI is not set +# CONFIG_SND_SOC_PCM3168A_I2C is not set +# CONFIG_SND_SOC_PCM3168A_SPI is not set +# CONFIG_SND_SOC_PCM5102A is not set +# CONFIG_SND_SOC_PCM512x_I2C is not set +# CONFIG_SND_SOC_PCM512x_SPI is not set +# CONFIG_SND_SOC_PCM6240 is not set +# CONFIG_SND_SOC_PEB2466 is not set +# CONFIG_SND_SOC_RT5616 is not set +# CONFIG_SND_SOC_RT5631 is not set +# CONFIG_SND_SOC_RT5640 is not set +# CONFIG_SND_SOC_RT5659 is not set +# CONFIG_SND_SOC_RT9120 is not set +# CONFIG_SND_SOC_RTQ9128 is not set +# CONFIG_SND_SOC_SGTL5000 is not set +CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m +# CONFIG_SND_SOC_SIMPLE_MUX is not set +# CONFIG_SND_SOC_SMA1303 is not set +# CONFIG_SND_SOC_SPDIF is not set +# CONFIG_SND_SOC_SRC4XXX_I2C is not set +# CONFIG_SND_SOC_SSM2305 is not set +# CONFIG_SND_SOC_SSM2518 is not set +# CONFIG_SND_SOC_SSM2602_SPI is not set +# CONFIG_SND_SOC_SSM2602_I2C is not set +# CONFIG_SND_SOC_SSM3515 is not set +# CONFIG_SND_SOC_SSM4567 is not set +# CONFIG_SND_SOC_STA32X is not set +# CONFIG_SND_SOC_STA350 is not set +# CONFIG_SND_SOC_STI_SAS is not set +# CONFIG_SND_SOC_TAS2552 is not set +# CONFIG_SND_SOC_TAS2562 is not set +# CONFIG_SND_SOC_TAS2764 is not set +# CONFIG_SND_SOC_TAS2770 is not set +# CONFIG_SND_SOC_TAS2780 is not set +# CONFIG_SND_SOC_TAS2781_I2C is not set +# CONFIG_SND_SOC_TAS5086 is not set +# CONFIG_SND_SOC_TAS571X is not set +# CONFIG_SND_SOC_TAS5720 is not set +# CONFIG_SND_SOC_TAS5805M is not set +# CONFIG_SND_SOC_TAS6424 is not set +# CONFIG_SND_SOC_TDA7419 is not set +# CONFIG_SND_SOC_TFA9879 is not set +CONFIG_SND_SOC_TFA989X=m +# CONFIG_SND_SOC_TLV320ADC3XXX is not set +# CONFIG_SND_SOC_TLV320AIC23_I2C is not set +# CONFIG_SND_SOC_TLV320AIC23_SPI is not set +# CONFIG_SND_SOC_TLV320AIC31XX is not set +# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set +# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set +# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set +# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set +# CONFIG_SND_SOC_TLV320ADCX140 is not set +# CONFIG_SND_SOC_TS3A227E is not set +# CONFIG_SND_SOC_TSCS42XX is not set +# CONFIG_SND_SOC_TSCS454 is not set +# CONFIG_SND_SOC_UDA1334 is not set +# CONFIG_SND_SOC_WM8510 is not set +# CONFIG_SND_SOC_WM8523 is not set +# CONFIG_SND_SOC_WM8524 is not set +# CONFIG_SND_SOC_WM8580 is not set +# CONFIG_SND_SOC_WM8711 is not set +# CONFIG_SND_SOC_WM8728 is not set +# CONFIG_SND_SOC_WM8731_I2C is not set +# CONFIG_SND_SOC_WM8731_SPI is not set +# CONFIG_SND_SOC_WM8737 is not set +# CONFIG_SND_SOC_WM8741 is not set +# CONFIG_SND_SOC_WM8750 is not set +# CONFIG_SND_SOC_WM8753 is not set +# CONFIG_SND_SOC_WM8770 is not set +# CONFIG_SND_SOC_WM8776 is not set +# CONFIG_SND_SOC_WM8782 is not set +# CONFIG_SND_SOC_WM8804_I2C is not set +# CONFIG_SND_SOC_WM8804_SPI is not set +# CONFIG_SND_SOC_WM8903 is not set +# CONFIG_SND_SOC_WM8904 is not set +# CONFIG_SND_SOC_WM8940 is not set +# CONFIG_SND_SOC_WM8960 is not set +# CONFIG_SND_SOC_WM8961 is not set +# CONFIG_SND_SOC_WM8962 is not set +# CONFIG_SND_SOC_WM8974 is not set +# CONFIG_SND_SOC_WM8978 is not set +# CONFIG_SND_SOC_WM8985 is not set +# CONFIG_SND_SOC_ZL38060 is not set +# CONFIG_SND_SOC_MAX9759 is not set +# CONFIG_SND_SOC_MT6351 is not set +# CONFIG_SND_SOC_MT6357 is not set +# CONFIG_SND_SOC_MT6358 is not set +# CONFIG_SND_SOC_MT6660 is not set +# CONFIG_SND_SOC_NAU8315 is not set +# CONFIG_SND_SOC_NAU8540 is not set +# CONFIG_SND_SOC_NAU8810 is not set +# CONFIG_SND_SOC_NAU8821 is not set +# CONFIG_SND_SOC_NAU8822 is not set +# CONFIG_SND_SOC_NAU8824 is not set +# CONFIG_SND_SOC_TPA6130A2 is not set +# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set +# CONFIG_SND_SOC_LPASS_VA_MACRO is not set +# CONFIG_SND_SOC_LPASS_RX_MACRO is not set +# CONFIG_SND_SOC_LPASS_TX_MACRO is not set +# end of CODEC drivers + +# CONFIG_SND_SIMPLE_CARD is not set +# CONFIG_SND_AUDIO_GRAPH_CARD is not set +# CONFIG_SND_AUDIO_GRAPH_CARD2 is not set +# CONFIG_SND_TEST_COMPONENT is not set +# CONFIG_SND_VIRTIO is not set +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HIDRAW=y +CONFIG_UHID=m +CONFIG_HID_GENERIC=y + +# +# Special HID drivers +# +CONFIG_HID_A4TECH=m +CONFIG_HID_ACCUTOUCH=m +CONFIG_HID_ACRUX=m +CONFIG_HID_ACRUX_FF=y +CONFIG_HID_APPLE=m +CONFIG_HID_APPLEIR=m +# CONFIG_HID_ASUS is not set +CONFIG_HID_AUREAL=m +CONFIG_HID_BELKIN=m +CONFIG_HID_BETOP_FF=m +CONFIG_HID_BIGBEN_FF=m +CONFIG_HID_CHERRY=m +CONFIG_HID_CHICONY=m +CONFIG_HID_CORSAIR=m +CONFIG_HID_COUGAR=m +CONFIG_HID_MACALLY=m +CONFIG_HID_PRODIKEYS=m +CONFIG_HID_CMEDIA=m +CONFIG_HID_CP2112=m +CONFIG_HID_CREATIVE_SB0540=m +CONFIG_HID_CYPRESS=m +CONFIG_HID_DRAGONRISE=m +CONFIG_DRAGONRISE_FF=y +CONFIG_HID_EMS_FF=m +CONFIG_HID_ELAN=m +CONFIG_HID_ELECOM=m +CONFIG_HID_ELO=m +CONFIG_HID_EVISION=m +CONFIG_HID_EZKEY=m +CONFIG_HID_FT260=m +CONFIG_HID_GEMBIRD=m +CONFIG_HID_GFRM=m +CONFIG_HID_GLORIOUS=m +CONFIG_HID_HOLTEK=m +CONFIG_HOLTEK_FF=y +CONFIG_HID_VIVALDI_COMMON=m +CONFIG_HID_GOODIX_SPI=m +CONFIG_HID_GOOGLE_STADIA_FF=m +CONFIG_HID_VIVALDI=m +CONFIG_HID_GT683R=m +CONFIG_HID_KEYTOUCH=m +CONFIG_HID_KYE=m +CONFIG_HID_UCLOGIC=m +CONFIG_HID_WALTOP=m +CONFIG_HID_VIEWSONIC=m +# CONFIG_HID_VRC2 is not set +CONFIG_HID_XIAOMI=m +CONFIG_HID_GYRATION=m +CONFIG_HID_ICADE=m +CONFIG_HID_ITE=m +CONFIG_HID_JABRA=m +CONFIG_HID_TWINHAN=m +CONFIG_HID_KENSINGTON=m +CONFIG_HID_LCPOWER=m +CONFIG_HID_LED=m +CONFIG_HID_LENOVO=m +CONFIG_HID_LETSKETCH=m +CONFIG_HID_LOGITECH=m +CONFIG_HID_LOGITECH_DJ=m +CONFIG_HID_LOGITECH_HIDPP=m +# CONFIG_LOGITECH_FF is not set +# CONFIG_LOGIRUMBLEPAD2_FF is not set +# CONFIG_LOGIG940_FF is not set +# CONFIG_LOGIWHEELS_FF is not set +CONFIG_HID_MAGICMOUSE=m +CONFIG_HID_MALTRON=m +CONFIG_HID_MAYFLASH=m +CONFIG_HID_MEGAWORLD_FF=m +CONFIG_HID_REDRAGON=y +CONFIG_HID_MICROSOFT=m +CONFIG_HID_MONTEREY=m +CONFIG_HID_MULTITOUCH=m +CONFIG_HID_NINTENDO=m +CONFIG_NINTENDO_FF=y +CONFIG_HID_NTI=m +CONFIG_HID_NTRIG=m +CONFIG_HID_NVIDIA_SHIELD=m +CONFIG_NVIDIA_SHIELD_FF=y +CONFIG_HID_ORTEK=m +CONFIG_HID_PANTHERLORD=m +CONFIG_PANTHERLORD_FF=y +CONFIG_HID_PENMOUNT=m +CONFIG_HID_PETALYNX=m +CONFIG_HID_PICOLCD=m +CONFIG_HID_PICOLCD_FB=y +CONFIG_HID_PICOLCD_BACKLIGHT=y +CONFIG_HID_PICOLCD_LCD=y +CONFIG_HID_PICOLCD_LEDS=y +CONFIG_HID_PLANTRONICS=m +CONFIG_HID_PLAYSTATION=m +# CONFIG_PLAYSTATION_FF is not set +CONFIG_HID_PXRC=m +CONFIG_HID_RAZER=m +CONFIG_HID_PRIMAX=m +CONFIG_HID_RETRODE=m +CONFIG_HID_ROCCAT=m +CONFIG_HID_SAITEK=m +CONFIG_HID_SAMSUNG=m +CONFIG_HID_SEMITEK=m +CONFIG_HID_SIGMAMICRO=m +CONFIG_HID_SONY=m +CONFIG_SONY_FF=y +CONFIG_HID_SPEEDLINK=m +CONFIG_HID_STEAM=m +CONFIG_STEAM_FF=y +CONFIG_HID_STEELSERIES=m +CONFIG_HID_SUNPLUS=m +CONFIG_HID_RMI=m +CONFIG_HID_GREENASIA=m +CONFIG_GREENASIA_FF=y +CONFIG_HID_SMARTJOYPLUS=m +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=m +CONFIG_HID_TOPSEED=m +CONFIG_HID_TOPRE=m +CONFIG_HID_THINGM=m +CONFIG_HID_THRUSTMASTER=m +CONFIG_THRUSTMASTER_FF=y +CONFIG_HID_UDRAW_PS3=m +CONFIG_HID_U2FZERO=m +CONFIG_HID_WACOM=m +CONFIG_HID_WIIMOTE=m +CONFIG_HID_WINWING=m +CONFIG_HID_XINMO=m +CONFIG_HID_ZEROPLUS=m +CONFIG_ZEROPLUS_FF=y +CONFIG_HID_ZYDACRON=m +CONFIG_HID_SENSOR_HUB=m +CONFIG_HID_SENSOR_CUSTOM_SENSOR=m +CONFIG_HID_ALPS=m +# CONFIG_HID_MCP2200 is not set +CONFIG_HID_MCP2221=m +# end of Special HID drivers + +# +# HID-BPF support +# +# end of HID-BPF support + +# +# USB HID support +# +CONFIG_USB_HID=y +CONFIG_HID_PID=y +CONFIG_USB_HIDDEV=y +# end of USB HID support + +CONFIG_I2C_HID=y +# CONFIG_I2C_HID_OF is not set +# CONFIG_I2C_HID_OF_ELAN is not set +# CONFIG_I2C_HID_OF_GOODIX is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=y +CONFIG_USB_LED_TRIG=y +CONFIG_USB_ULPI_BUS=y +# CONFIG_USB_CONN_GPIO is not set +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y + +# +# Miscellaneous USB options +# +CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_FEW_INIT_RETRIES is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +CONFIG_USB_OTG=y +# CONFIG_USB_OTG_PRODUCTLIST is not set +# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set +# CONFIG_USB_OTG_FSM is not set +# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set +CONFIG_USB_AUTOSUSPEND_DELAY=2 +CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1 +# CONFIG_USB_MON is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_XHCI_HCD is not set +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_TT_NEWSCHED=y +# CONFIG_USB_EHCI_FSL is not set +# CONFIG_USB_EHCI_HCD_PLATFORM is not set +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_MAX3421_HCD is not set +# CONFIG_USB_OHCI_HCD is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HCD_TEST_MODE is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +CONFIG_USB_PRINTER=m +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_REALTEK is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +# CONFIG_USB_STORAGE_ENE_UB6250 is not set +CONFIG_USB_UAS=m + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USBIP_CORE is not set + +# +# USB dual-mode controller drivers +# +# CONFIG_USB_CDNS_SUPPORT is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_DWC3 is not set +# CONFIG_USB_DWC2 is not set +CONFIG_USB_CHIPIDEA=y +CONFIG_USB_CHIPIDEA_UDC=y +CONFIG_USB_CHIPIDEA_HOST=y +CONFIG_USB_CHIPIDEA_MSM=y +CONFIG_USB_CHIPIDEA_NPCM=y +CONFIG_USB_CHIPIDEA_IMX=y +CONFIG_USB_CHIPIDEA_GENERIC=y +CONFIG_USB_CHIPIDEA_TEGRA=y +# CONFIG_USB_ISP1760 is not set + +# +# USB port drivers +# +CONFIG_USB_SERIAL=m +# CONFIG_USB_SERIAL_GENERIC is not set +CONFIG_USB_SERIAL_SIMPLE=m +# CONFIG_USB_SERIAL_AIRCABLE is not set +# CONFIG_USB_SERIAL_ARK3116 is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_CH341 is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +CONFIG_USB_SERIAL_CP210X=m +# CONFIG_USB_SERIAL_CYPRESS_M8 is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IPAQ is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT_TI is not set +# CONFIG_USB_SERIAL_F81232 is not set +# CONFIG_USB_SERIAL_F8153X is not set +# CONFIG_USB_SERIAL_GARMIN is not set +# CONFIG_USB_SERIAL_IPW is not set +# CONFIG_USB_SERIAL_IUU is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KLSI is not set +# CONFIG_USB_SERIAL_KOBIL_SCT is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_METRO is not set +# CONFIG_USB_SERIAL_MOS7720 is not set +# CONFIG_USB_SERIAL_MOS7840 is not set +# CONFIG_USB_SERIAL_MXUPORT is not set +# CONFIG_USB_SERIAL_NAVMAN is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_OTI6858 is not set +# CONFIG_USB_SERIAL_QCAUX is not set +# CONFIG_USB_SERIAL_QUALCOMM is not set +# CONFIG_USB_SERIAL_SPCP8X5 is not set +# CONFIG_USB_SERIAL_SAFE is not set +# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set +# CONFIG_USB_SERIAL_SYMBOL is not set +# CONFIG_USB_SERIAL_TI is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_OPTION is not set +# CONFIG_USB_SERIAL_OMNINET is not set +# CONFIG_USB_SERIAL_OPTICON is not set +# CONFIG_USB_SERIAL_XSENS_MT is not set +# CONFIG_USB_SERIAL_WISHBONE is not set +# CONFIG_USB_SERIAL_SSU100 is not set +# CONFIG_USB_SERIAL_QT2 is not set +# CONFIG_USB_SERIAL_UPD78F0730 is not set +# CONFIG_USB_SERIAL_XR is not set +# CONFIG_USB_SERIAL_DEBUG is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_QCOM_EUD is not set +# CONFIG_APPLE_MFI_FASTCHARGE is not set +# CONFIG_USB_SISUSBVGA is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_EHSET_TEST_FIXTURE is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_YUREX is not set +# CONFIG_USB_EZUSB_FX2 is not set +# CONFIG_USB_HUB_USB251XB is not set +CONFIG_USB_HSIC_USB3503=y +# CONFIG_USB_HSIC_USB4604 is not set +# CONFIG_USB_LINK_LAYER_TEST is not set +# CONFIG_USB_CHAOSKEY is not set +# CONFIG_USB_ONBOARD_DEV is not set + +# +# USB Physical Layer drivers +# +# CONFIG_NOP_USB_XCEIV is not set +# CONFIG_USB_GPIO_VBUS is not set +# CONFIG_USB_ISP1301 is not set +# CONFIG_USB_ULPI is not set +# end of USB Physical Layer drivers + +CONFIG_USB_GADGET=y +# CONFIG_USB_GADGET_DEBUG_FILES is not set +# CONFIG_USB_GADGET_DEBUG_FS is not set +CONFIG_USB_GADGET_VBUS_DRAW=2 +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 +CONFIG_U_SERIAL_CONSOLE=y + +# +# USB Peripheral Controller +# +# CONFIG_USB_FUSB300 is not set +# CONFIG_USB_GR_UDC is not set +# CONFIG_USB_R8A66597 is not set +# CONFIG_USB_PXA27X is not set +# CONFIG_USB_MV_UDC is not set +# CONFIG_USB_MV_U3D is not set +# CONFIG_USB_SNP_UDC_PLAT is not set +# CONFIG_USB_M66592 is not set +# CONFIG_USB_BDC_UDC is not set +# CONFIG_USB_NET2272 is not set +# CONFIG_USB_GADGET_XILINX is not set +# CONFIG_USB_MAX3420_UDC is not set +# CONFIG_USB_DUMMY_HCD is not set +# end of USB Peripheral Controller + +CONFIG_USB_LIBCOMPOSITE=m +CONFIG_USB_F_ACM=m +CONFIG_USB_U_SERIAL=m +CONFIG_USB_U_ETHER=m +CONFIG_USB_U_AUDIO=m +CONFIG_USB_F_SERIAL=m +CONFIG_USB_F_OBEX=m +CONFIG_USB_F_NCM=m +CONFIG_USB_F_ECM=m +CONFIG_USB_F_EEM=m +CONFIG_USB_F_RNDIS=m +CONFIG_USB_F_MASS_STORAGE=m +CONFIG_USB_F_FS=m +CONFIG_USB_F_UAC1=m +CONFIG_USB_F_UAC2=m +CONFIG_USB_F_UVC=m +CONFIG_USB_F_MIDI=m +CONFIG_USB_F_HID=m +CONFIG_USB_F_PRINTER=m +CONFIG_USB_CONFIGFS=m +CONFIG_USB_CONFIGFS_SERIAL=y +CONFIG_USB_CONFIGFS_ACM=y +CONFIG_USB_CONFIGFS_OBEX=y +CONFIG_USB_CONFIGFS_NCM=y +CONFIG_USB_CONFIGFS_ECM=y +# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set +CONFIG_USB_CONFIGFS_RNDIS=y +CONFIG_USB_CONFIGFS_EEM=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +# CONFIG_USB_CONFIGFS_F_LB_SS is not set +CONFIG_USB_CONFIGFS_F_FS=y +CONFIG_USB_CONFIGFS_F_UAC1=y +# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set +CONFIG_USB_CONFIGFS_F_UAC2=y +CONFIG_USB_CONFIGFS_F_MIDI=y +# CONFIG_USB_CONFIGFS_F_MIDI2 is not set +CONFIG_USB_CONFIGFS_F_HID=y +CONFIG_USB_CONFIGFS_F_UVC=y +CONFIG_USB_CONFIGFS_F_PRINTER=y + +# +# USB Gadget precomposed configurations +# +# CONFIG_USB_ZERO is not set +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_ETH is not set +# CONFIG_USB_G_NCM is not set +# CONFIG_USB_GADGETFS is not set +# CONFIG_USB_FUNCTIONFS is not set +# CONFIG_USB_MASS_STORAGE is not set +# CONFIG_USB_G_SERIAL is not set +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +# CONFIG_USB_CDC_COMPOSITE is not set +# CONFIG_USB_G_ACM_MS is not set +# CONFIG_USB_G_MULTI is not set +# CONFIG_USB_G_HID is not set +# CONFIG_USB_G_DBGP is not set +# CONFIG_USB_G_WEBCAM is not set +# CONFIG_USB_RAW_GADGET is not set +# end of USB Gadget precomposed configurations + +# CONFIG_TYPEC is not set +CONFIG_USB_ROLE_SWITCH=y +CONFIG_MMC=y +CONFIG_PWRSEQ_EMMC=y +CONFIG_PWRSEQ_SIMPLE=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=32 +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_ARMMMCI is not set +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_IO_ACCESSORS=y +CONFIG_MMC_SDHCI_PLTFM=y +# CONFIG_MMC_SDHCI_OF_ARASAN is not set +# CONFIG_MMC_SDHCI_OF_AT91 is not set +# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set +# CONFIG_MMC_SDHCI_CADENCE is not set +# CONFIG_MMC_SDHCI_F_SDH30 is not set +# CONFIG_MMC_SDHCI_MILBEAUT is not set +CONFIG_MMC_SDHCI_MSM=y +# CONFIG_MMC_SPI is not set +# CONFIG_MMC_DW is not set +# CONFIG_MMC_VUB300 is not set +# CONFIG_MMC_USHC is not set +# CONFIG_MMC_USDHI6ROL0 is not set +CONFIG_MMC_CQHCI=y +# CONFIG_MMC_HSQ is not set +# CONFIG_MMC_MTK is not set +# CONFIG_MMC_SDHCI_XENON is not set +# CONFIG_SCSI_UFSHCD is not set +# CONFIG_MEMSTICK is not set +CONFIG_LEDS_EXPRESSWIRE=y +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_CLASS_FLASH=m +CONFIG_LEDS_CLASS_MULTICOLOR=y +# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set + +# +# LED drivers +# +# CONFIG_LEDS_AN30259A is not set +# CONFIG_LEDS_AW200XX is not set +CONFIG_LEDS_AW2013=m +# CONFIG_LEDS_BCM6328 is not set +# CONFIG_LEDS_BCM6358 is not set +# CONFIG_LEDS_CR0014114 is not set +# CONFIG_LEDS_EL15203000 is not set +# CONFIG_LEDS_LM3530 is not set +# CONFIG_LEDS_LM3532 is not set +# CONFIG_LEDS_LM3642 is not set +# CONFIG_LEDS_LM3692X is not set +# CONFIG_LEDS_PCA9532 is not set +CONFIG_LEDS_GPIO=y +# CONFIG_LEDS_LP3944 is not set +# CONFIG_LEDS_LP3952 is not set +# CONFIG_LEDS_LP50XX is not set +# CONFIG_LEDS_LP55XX_COMMON is not set +# CONFIG_LEDS_LP8860 is not set +# CONFIG_LEDS_PCA955X is not set +# CONFIG_LEDS_PCA963X is not set +# CONFIG_LEDS_PCA995X is not set +# CONFIG_LEDS_DAC124S085 is not set +# CONFIG_LEDS_PWM is not set +# CONFIG_LEDS_REGULATOR is not set +# CONFIG_LEDS_BD2606MVV is not set +# CONFIG_LEDS_BD2802 is not set +# CONFIG_LEDS_LT3593 is not set +# CONFIG_LEDS_TCA6507 is not set +# CONFIG_LEDS_TLC591XX is not set +# CONFIG_LEDS_LM355x is not set +CONFIG_LEDS_IS31FL319X=m +# CONFIG_LEDS_IS31FL32XX is not set + +# +# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) +# +# CONFIG_LEDS_BLINKM is not set +# CONFIG_LEDS_SYSCON is not set +# CONFIG_LEDS_MLXREG is not set +# CONFIG_LEDS_USER is not set +# CONFIG_LEDS_SPI_BYTE is not set +# CONFIG_LEDS_LM3697 is not set + +# +# Flash and Torch LED drivers +# +# CONFIG_LEDS_AAT1290 is not set +# CONFIG_LEDS_AS3645A is not set +CONFIG_LEDS_KTD2692=m +# CONFIG_LEDS_LM3601X is not set +# CONFIG_LEDS_QCOM_FLASH is not set +# CONFIG_LEDS_RT4505 is not set +# CONFIG_LEDS_RT8515 is not set +CONFIG_LEDS_SGM3140=m +CONFIG_LEDS_SY7802=m + +# +# RGB LED drivers +# +# CONFIG_LEDS_GROUP_MULTICOLOR is not set +CONFIG_LEDS_KTD202X=m +# CONFIG_LEDS_NCP5623 is not set +# CONFIG_LEDS_PWM_MULTICOLOR is not set +CONFIG_LEDS_QCOM_LPG=y + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_ONESHOT=m +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=m +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_ACTIVITY=m +CONFIG_LEDS_TRIGGER_GPIO=m +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y + +# +# iptables trigger is under Netfilter config (LED target) +# +CONFIG_LEDS_TRIGGER_TRANSIENT=m +CONFIG_LEDS_TRIGGER_CAMERA=m +CONFIG_LEDS_TRIGGER_PANIC=y +CONFIG_LEDS_TRIGGER_NETDEV=m +CONFIG_LEDS_TRIGGER_PATTERN=m +CONFIG_LEDS_TRIGGER_TTY=m +# CONFIG_LEDS_TRIGGER_INPUT_EVENTS is not set + +# +# Simple LED drivers +# +# CONFIG_ACCESSIBILITY is not set +# CONFIG_INFINIBAND is not set +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +CONFIG_RTC_SYSTOHC=y +CONFIG_RTC_SYSTOHC_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set +CONFIG_RTC_NVMEM=y + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_ABB5ZES3 is not set +# CONFIG_RTC_DRV_ABEOZ9 is not set +# CONFIG_RTC_DRV_ABX80X is not set +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_HYM8563 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_MAX31335 is not set +# CONFIG_RTC_DRV_NCT3018Y is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_ISL12022 is not set +# CONFIG_RTC_DRV_ISL12026 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8523 is not set +# CONFIG_RTC_DRV_PCF85063 is not set +# CONFIG_RTC_DRV_PCF85363 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_BQ32K is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8010 is not set +# CONFIG_RTC_DRV_RX8111 is not set +# CONFIG_RTC_DRV_RX8581 is not set +# CONFIG_RTC_DRV_RX8025 is not set +# CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_RV3028 is not set +# CONFIG_RTC_DRV_RV3032 is not set +# CONFIG_RTC_DRV_RV8803 is not set +# CONFIG_RTC_DRV_SD2405AL is not set +# CONFIG_RTC_DRV_SD3078 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T93 is not set +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1302 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1343 is not set +# CONFIG_RTC_DRV_DS1347 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6916 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RX4581 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_PCF2123 is not set +# CONFIG_RTC_DRV_MCP795 is not set +CONFIG_RTC_I2C_AND_SPI=y + +# +# SPI and I2C RTC drivers +# +# CONFIG_RTC_DRV_DS3232 is not set +# CONFIG_RTC_DRV_PCF2127 is not set +# CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RX6110 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1685_FAMILY is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_DS2404 is not set +# CONFIG_RTC_DRV_EFI is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_ZYNQMP is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_PL030 is not set +# CONFIG_RTC_DRV_PL031 is not set +# CONFIG_RTC_DRV_CADENCE is not set +# CONFIG_RTC_DRV_FTRTC010 is not set +CONFIG_RTC_DRV_PM8XXX=y +# CONFIG_RTC_DRV_R7301 is not set + +# +# HID Sensor RTC drivers +# +CONFIG_RTC_DRV_HID_SENSOR_TIME=m +# CONFIG_RTC_DRV_GOLDFISH is not set +CONFIG_DMADEVICES=y +# CONFIG_DMADEVICES_DEBUG is not set + +# +# DMA Devices +# +CONFIG_DMA_ENGINE=y +CONFIG_DMA_VIRTUAL_CHANNELS=y +CONFIG_DMA_OF=y +# CONFIG_ALTERA_MSGDMA is not set +# CONFIG_AMBA_PL08X is not set +# CONFIG_DW_AXI_DMAC is not set +# CONFIG_FSL_EDMA is not set +# CONFIG_FSL_QDMA is not set +# CONFIG_INTEL_IDMA64 is not set +# CONFIG_NBPFAXI_DMA is not set +# CONFIG_PL330_DMA is not set +# CONFIG_XILINX_DMA is not set +# CONFIG_XILINX_XDMA is not set +# CONFIG_XILINX_ZYNQMP_DPDMA is not set +# CONFIG_AMD_QDMA is not set +# CONFIG_QCOM_ADM is not set +CONFIG_QCOM_BAM_DMA=y +# CONFIG_QCOM_GPI_DMA is not set +# CONFIG_QCOM_HIDMA_MGMT is not set +# CONFIG_QCOM_HIDMA is not set +# CONFIG_DW_DMAC is not set +# CONFIG_SF_PDMA is not set + +# +# DMA Clients +# +# CONFIG_ASYNC_TX_DMA is not set +# CONFIG_DMATEST is not set + +# +# DMABUF options +# +CONFIG_SYNC_FILE=y +# CONFIG_SW_SYNC is not set +CONFIG_UDMABUF=y +# CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set +# CONFIG_DMABUF_SELFTESTS is not set +CONFIG_DMABUF_HEAPS=y +# CONFIG_DMABUF_SYSFS_STATS is not set +# CONFIG_DMABUF_HEAPS_SYSTEM is not set +CONFIG_DMABUF_HEAPS_CMA=y +# end of DMABUF options + +# CONFIG_UIO is not set +# CONFIG_VFIO is not set +# CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRTIO_ANCHOR=y +CONFIG_VIRTIO=y +CONFIG_VIRTIO_MENU=y +# CONFIG_VIRTIO_BALLOON is not set +# CONFIG_VIRTIO_INPUT is not set +# CONFIG_VIRTIO_MMIO is not set +# CONFIG_VIRTIO_DEBUG is not set +# CONFIG_VDPA is not set +CONFIG_VHOST_MENU=y +# CONFIG_VHOST_NET is not set +# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set + +# +# Microsoft Hyper-V guest support +# +# end of Microsoft Hyper-V guest support + +# CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set +# CONFIG_STAGING is not set +# CONFIG_GOLDFISH is not set +# CONFIG_CHROME_PLATFORMS is not set +# CONFIG_CZNIC_PLATFORMS is not set +# CONFIG_MELLANOX_PLATFORM is not set +CONFIG_HAVE_CLK=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y + +# +# Clock driver for ARM Reference designs +# +# CONFIG_CLK_ICST is not set +# CONFIG_CLK_SP810 is not set +# end of Clock driver for ARM Reference designs + +# CONFIG_LMK04832 is not set +# CONFIG_COMMON_CLK_MAX9485 is not set +# CONFIG_COMMON_CLK_SI5341 is not set +# CONFIG_COMMON_CLK_SI5351 is not set +# CONFIG_COMMON_CLK_SI514 is not set +# CONFIG_COMMON_CLK_SI544 is not set +# CONFIG_COMMON_CLK_SI570 is not set +# CONFIG_COMMON_CLK_CDCE706 is not set +# CONFIG_COMMON_CLK_CDCE925 is not set +# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_COMMON_CLK_AXI_CLKGEN is not set +# CONFIG_COMMON_CLK_PWM is not set +# CONFIG_COMMON_CLK_RS9_PCIE is not set +# CONFIG_COMMON_CLK_SI521XX is not set +# CONFIG_COMMON_CLK_VC3 is not set +# CONFIG_COMMON_CLK_VC5 is not set +# CONFIG_COMMON_CLK_VC7 is not set +# CONFIG_COMMON_CLK_FIXED_MMIO is not set +CONFIG_QCOM_GDSC=y +CONFIG_COMMON_CLK_QCOM=y +CONFIG_QCOM_A53PLL=y +# CONFIG_QCOM_A7PLL is not set +CONFIG_QCOM_CLK_APCS_MSM8916=y +# CONFIG_QCOM_CLK_APCS_SDX55 is not set +CONFIG_QCOM_CLK_SMD_RPM=y +# CONFIG_APQ_GCC_8084 is not set +# CONFIG_APQ_MMCC_8084 is not set +# CONFIG_IPQ_APSS_PLL is not set +# CONFIG_IPQ_APSS_6018 is not set +# CONFIG_IPQ_GCC_4019 is not set +# CONFIG_IPQ_GCC_6018 is not set +# CONFIG_IPQ_GCC_806X is not set +# CONFIG_IPQ_LCC_806X is not set +# CONFIG_IPQ_GCC_8074 is not set +# CONFIG_IPQ_GCC_9574 is not set +# CONFIG_IPQ_NSSCC_QCA8K is not set +# CONFIG_MSM_GCC_8660 is not set +CONFIG_MSM_GCC_8909=y +CONFIG_MSM_GCC_8916=y +CONFIG_MSM_GCC_8939=y +# CONFIG_MSM_GCC_8960 is not set +# CONFIG_MSM_LCC_8960 is not set +# CONFIG_MDM_GCC_9607 is not set +# CONFIG_MDM_GCC_9615 is not set +# CONFIG_MSM_MMCC_8960 is not set +# CONFIG_MSM_GCC_8953 is not set +# CONFIG_MSM_GCC_8974 is not set +# CONFIG_MSM_MMCC_8974 is not set +# CONFIG_MSM_GCC_8976 is not set +# CONFIG_MSM_MMCC_8994 is not set +# CONFIG_MSM_GCC_8994 is not set +# CONFIG_MSM_GCC_8996 is not set +# CONFIG_MSM_MMCC_8996 is not set +# CONFIG_MSM_GCC_8998 is not set +# CONFIG_MSM_GPUCC_8998 is not set +# CONFIG_MSM_MMCC_8998 is not set +# CONFIG_QCM_GCC_2290 is not set +# CONFIG_QCM_DISPCC_2290 is not set +# CONFIG_QCS_GCC_404 is not set +# CONFIG_SA_GCC_8775P is not set +# CONFIG_SA_GPUCC_8775P is not set +# CONFIG_QCS_TURING_404 is not set +# CONFIG_QCS_Q6SSTOP_404 is not set +# CONFIG_QDU_GCC_1000 is not set +# CONFIG_SDX_GCC_55 is not set +# CONFIG_SDX_GCC_65 is not set +# CONFIG_SDX_GCC_75 is not set +# CONFIG_SPMI_PMIC_CLKDIV is not set +# CONFIG_QCOM_HFPLL is not set +# CONFIG_KPSS_XCC is not set +# CONFIG_KRAITCC is not set +# CONFIG_XILINX_VCU is not set +# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set +CONFIG_HWSPINLOCK=y +CONFIG_HWSPINLOCK_QCOM=y + +# +# Clock Source drivers +# +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +CONFIG_CLKSRC_QCOM=y +# CONFIG_MICROCHIP_PIT64B is not set +# end of Clock Source drivers + +CONFIG_MAILBOX=y +# CONFIG_ARM_MHU is not set +# CONFIG_ARM_MHU_V2 is not set +# CONFIG_PLATFORM_MHU is not set +# CONFIG_PL320_MBOX is not set +# CONFIG_ALTERA_MBOX is not set +# CONFIG_MAILBOX_TEST is not set +CONFIG_QCOM_APCS_IPC=y +# CONFIG_QCOM_IPCC is not set +CONFIG_IOMMU_IOVA=y +CONFIG_IOMMU_API=y +CONFIG_IOMMU_SUPPORT=y + +# +# Generic IOMMU Pagetable Support +# +CONFIG_IOMMU_IO_PGTABLE=y +CONFIG_IOMMU_IO_PGTABLE_LPAE=y +# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set +# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set +# end of Generic IOMMU Pagetable Support + +# CONFIG_IOMMU_DEBUGFS is not set +CONFIG_IOMMU_DEFAULT_DMA_STRICT=y +# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set +# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_OF_IOMMU=y +CONFIG_IOMMU_DMA=y +# CONFIG_MSM_IOMMU is not set +# CONFIG_IOMMUFD is not set +CONFIG_ARM_SMMU=y +# CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS is not set +CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT=y +CONFIG_ARM_SMMU_QCOM=y +# CONFIG_ARM_SMMU_QCOM_DEBUG is not set +CONFIG_QCOM_IOMMU=y + +# +# Remoteproc drivers +# +CONFIG_REMOTEPROC=y +CONFIG_REMOTEPROC_CDEV=y +CONFIG_QCOM_PIL_INFO=m +CONFIG_QCOM_RPROC_COMMON=m +CONFIG_QCOM_Q6V5_COMMON=m +# CONFIG_QCOM_Q6V5_ADSP is not set +CONFIG_QCOM_Q6V5_MSS=m +# CONFIG_QCOM_Q6V5_PAS is not set +# CONFIG_QCOM_Q6V5_WCSS is not set +CONFIG_QCOM_SYSMON=y +CONFIG_QCOM_WCNSS_PIL=m +# end of Remoteproc drivers + +# +# Rpmsg drivers +# +CONFIG_RPMSG=y +CONFIG_RPMSG_CHAR=y +CONFIG_RPMSG_CTRL=y +# CONFIG_RPMSG_NS is not set +# CONFIG_RPMSG_QCOM_GLINK_RPM is not set +# CONFIG_RPMSG_QCOM_GLINK_SMEM is not set +CONFIG_RPMSG_QCOM_SMD=y +# CONFIG_RPMSG_VIRTIO is not set +# end of Rpmsg drivers + +# CONFIG_SOUNDWIRE is not set + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# +# end of Amlogic SoC drivers + +# +# Broadcom SoC drivers +# +# end of Broadcom SoC drivers + +# +# NXP/Freescale QorIQ SoC drivers +# +# CONFIG_QUICC_ENGINE is not set +# end of NXP/Freescale QorIQ SoC drivers + +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + +# +# i.MX SoC drivers +# +# end of i.MX SoC drivers + +# +# Enable LiteX SoC Builder specific drivers +# +# CONFIG_LITEX_SOC_CONTROLLER is not set +# end of Enable LiteX SoC Builder specific drivers + +# CONFIG_WPCM450_SOC is not set + +# +# Qualcomm SoC drivers +# +# CONFIG_QCOM_AOSS_QMP is not set +# CONFIG_QCOM_COMMAND_DB is not set +# CONFIG_QCOM_GENI_SE is not set +# CONFIG_QCOM_GSBI is not set +# CONFIG_QCOM_LLCC is not set +CONFIG_QCOM_MDT_LOADER=m +CONFIG_QCOM_MEMSHARE_QMI_SERVICE=m +# CONFIG_QCOM_OCMEM is not set +CONFIG_QCOM_PD_MAPPER=m +CONFIG_QCOM_PDR_HELPERS=m +CONFIG_QCOM_PDR_MSG=m +# CONFIG_QCOM_PMIC_PDCHARGER_ULOG is not set +CONFIG_QCOM_QMI_HELPERS=y +# CONFIG_QCOM_RAMP_CTRL is not set +CONFIG_QCOM_RMTFS_MEM=y +# CONFIG_QCOM_RPM_MASTER_STATS is not set +# CONFIG_QCOM_RPMH is not set +CONFIG_QCOM_SMEM=y +CONFIG_QCOM_SMD_RPM=y +CONFIG_QCOM_SMEM_STATE=y +CONFIG_QCOM_SMP2P=y +CONFIG_QCOM_SMSM=y +CONFIG_QCOM_SOCINFO=y +CONFIG_QCOM_SPM=y +CONFIG_QCOM_STATS=y +CONFIG_QCOM_WCNSS_CTRL=m +CONFIG_QCOM_APR=m +# CONFIG_QCOM_ICC_BWMON is not set +# CONFIG_QCOM_PBS is not set +# end of Qualcomm SoC drivers + +# CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +# end of Xilinx SoC drivers +# end of SOC (System On Chip) specific Drivers + +# +# PM Domains +# + +# +# Amlogic PM Domains +# +# end of Amlogic PM Domains + +# +# Broadcom PM Domains +# +# end of Broadcom PM Domains + +# +# i.MX PM Domains +# +# end of i.MX PM Domains + +# +# Qualcomm PM Domains +# +CONFIG_QCOM_CPR=y +CONFIG_QCOM_RPMPD=y +# end of Qualcomm PM Domains +# end of PM Domains + +CONFIG_PM_DEVFREQ=y + +# +# DEVFREQ Governors +# +CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y +CONFIG_DEVFREQ_GOV_PERFORMANCE=y +CONFIG_DEVFREQ_GOV_POWERSAVE=y +CONFIG_DEVFREQ_GOV_USERSPACE=y +CONFIG_DEVFREQ_GOV_PASSIVE=m + +# +# DEVFREQ Drivers +# +# CONFIG_PM_DEVFREQ_EVENT is not set +CONFIG_EXTCON=y + +# +# Extcon Device Drivers +# +# CONFIG_EXTCON_ADC_JACK is not set +# CONFIG_EXTCON_FSA9480 is not set +# CONFIG_EXTCON_GPIO is not set +# CONFIG_EXTCON_LC824206XA is not set +# CONFIG_EXTCON_MAX3355 is not set +# CONFIG_EXTCON_PTN5150 is not set +CONFIG_EXTCON_QCOM_SPMI_MISC=y +# CONFIG_EXTCON_RT8973A is not set +CONFIG_EXTCON_SM5502=y +CONFIG_EXTCON_USB_GPIO=y +# CONFIG_MEMORY is not set +CONFIG_IIO=y +CONFIG_IIO_BUFFER=y +CONFIG_IIO_BUFFER_CB=m +CONFIG_IIO_BUFFER_DMA=m +CONFIG_IIO_BUFFER_DMAENGINE=m +CONFIG_IIO_BUFFER_HW_CONSUMER=m +CONFIG_IIO_KFIFO_BUF=m +CONFIG_IIO_TRIGGERED_BUFFER=m +# CONFIG_IIO_CONFIGFS is not set +CONFIG_IIO_TRIGGER=y +CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 +# CONFIG_IIO_SW_DEVICE is not set +# CONFIG_IIO_SW_TRIGGER is not set +# CONFIG_IIO_TRIGGERED_EVENT is not set + +# +# Accelerometers +# +# CONFIG_ADIS16201 is not set +# CONFIG_ADIS16209 is not set +# CONFIG_ADXL313_I2C is not set +# CONFIG_ADXL313_SPI is not set +# CONFIG_ADXL345_I2C is not set +# CONFIG_ADXL345_SPI is not set +# CONFIG_ADXL355_I2C is not set +# CONFIG_ADXL355_SPI is not set +# CONFIG_ADXL367_SPI is not set +# CONFIG_ADXL367_I2C is not set +# CONFIG_ADXL372_SPI is not set +# CONFIG_ADXL372_I2C is not set +# CONFIG_ADXL380_SPI is not set +# CONFIG_ADXL380_I2C is not set +# CONFIG_BMA180 is not set +# CONFIG_BMA220 is not set +# CONFIG_BMA400 is not set +CONFIG_BMC150_ACCEL=m +CONFIG_BMC150_ACCEL_I2C=m +CONFIG_BMC150_ACCEL_SPI=m +# CONFIG_BMI088_ACCEL is not set +# CONFIG_DA280 is not set +# CONFIG_DA311 is not set +# CONFIG_DMARD06 is not set +# CONFIG_DMARD09 is not set +# CONFIG_DMARD10 is not set +# CONFIG_FXLS8962AF_I2C is not set +# CONFIG_FXLS8962AF_SPI is not set +CONFIG_HID_SENSOR_ACCEL_3D=m +CONFIG_IIO_ST_ACCEL_3AXIS=m +CONFIG_IIO_ST_ACCEL_I2C_3AXIS=m +CONFIG_IIO_ST_ACCEL_SPI_3AXIS=m +# CONFIG_IIO_KX022A_SPI is not set +# CONFIG_IIO_KX022A_I2C is not set +# CONFIG_KXSD9 is not set +CONFIG_KXCJK1013=m +# CONFIG_MC3230 is not set +# CONFIG_MMA7455_I2C is not set +# CONFIG_MMA7455_SPI is not set +# CONFIG_MMA7660 is not set +# CONFIG_MMA8452 is not set +# CONFIG_MMA9551 is not set +# CONFIG_MMA9553 is not set +# CONFIG_MSA311 is not set +# CONFIG_MXC4005 is not set +# CONFIG_MXC6255 is not set +# CONFIG_SCA3000 is not set +# CONFIG_SCA3300 is not set +# CONFIG_STK8312 is not set +# CONFIG_STK8BA50 is not set +# end of Accelerometers + +# +# Analog to digital converters +# +# CONFIG_AD4000 is not set +# CONFIG_AD4130 is not set +# CONFIG_AD4695 is not set +# CONFIG_AD7091R5 is not set +# CONFIG_AD7091R8 is not set +# CONFIG_AD7124 is not set +# CONFIG_AD7173 is not set +# CONFIG_AD7192 is not set +# CONFIG_AD7266 is not set +# CONFIG_AD7280 is not set +# CONFIG_AD7291 is not set +# CONFIG_AD7292 is not set +# CONFIG_AD7298 is not set +# CONFIG_AD7380 is not set +# CONFIG_AD7476 is not set +# CONFIG_AD7606_IFACE_PARALLEL is not set +# CONFIG_AD7606_IFACE_SPI is not set +# CONFIG_AD7766 is not set +# CONFIG_AD7768_1 is not set +# CONFIG_AD7780 is not set +# CONFIG_AD7791 is not set +# CONFIG_AD7793 is not set +# CONFIG_AD7887 is not set +# CONFIG_AD7923 is not set +# CONFIG_AD7944 is not set +# CONFIG_AD7949 is not set +# CONFIG_AD799X is not set +# CONFIG_AD9467 is not set +# CONFIG_CC10001_ADC is not set +# CONFIG_ENVELOPE_DETECTOR is not set +# CONFIG_HI8435 is not set +# CONFIG_HX711 is not set +# CONFIG_INA2XX_ADC is not set +# CONFIG_LTC2309 is not set +# CONFIG_LTC2471 is not set +# CONFIG_LTC2485 is not set +# CONFIG_LTC2496 is not set +# CONFIG_LTC2497 is not set +# CONFIG_MAX1027 is not set +# CONFIG_MAX11100 is not set +# CONFIG_MAX1118 is not set +# CONFIG_MAX11205 is not set +# CONFIG_MAX11410 is not set +# CONFIG_MAX1241 is not set +# CONFIG_MAX1363 is not set +# CONFIG_MAX34408 is not set +# CONFIG_MAX9611 is not set +# CONFIG_MCP320X is not set +# CONFIG_MCP3422 is not set +# CONFIG_MCP3564 is not set +# CONFIG_MCP3911 is not set +# CONFIG_NAU7802 is not set +# CONFIG_PAC1921 is not set +# CONFIG_PAC1934 is not set +CONFIG_QCOM_VADC_COMMON=y +# CONFIG_QCOM_SPMI_RRADC is not set +# CONFIG_QCOM_SPMI_IADC is not set +CONFIG_QCOM_SPMI_VADC=y +# CONFIG_QCOM_SPMI_ADC5 is not set +# CONFIG_RICHTEK_RTQ6056 is not set +# CONFIG_SD_ADC_MODULATOR is not set +# CONFIG_TI_ADC081C is not set +# CONFIG_TI_ADC0832 is not set +# CONFIG_TI_ADC084S021 is not set +# CONFIG_TI_ADC12138 is not set +# CONFIG_TI_ADC108S102 is not set +# CONFIG_TI_ADC128S052 is not set +# CONFIG_TI_ADC161S626 is not set +# CONFIG_TI_ADS1015 is not set +# CONFIG_TI_ADS1119 is not set +# CONFIG_TI_ADS7924 is not set +# CONFIG_TI_ADS1100 is not set +# CONFIG_TI_ADS1298 is not set +# CONFIG_TI_ADS7950 is not set +# CONFIG_TI_ADS8344 is not set +# CONFIG_TI_ADS8688 is not set +# CONFIG_TI_ADS124S08 is not set +# CONFIG_TI_ADS131E08 is not set +# CONFIG_TI_LMP92064 is not set +# CONFIG_TI_TLC4541 is not set +# CONFIG_TI_TSC2046 is not set +# CONFIG_VF610_ADC is not set +# CONFIG_XILINX_XADC is not set +# end of Analog to digital converters + +# +# Analog to digital and digital to analog converters +# +# CONFIG_AD74115 is not set +# CONFIG_AD74413R is not set +# end of Analog to digital and digital to analog converters + +# +# Analog Front Ends +# +# CONFIG_IIO_RESCALE is not set +# end of Analog Front Ends + +# +# Amplifiers +# +# CONFIG_AD8366 is not set +# CONFIG_ADA4250 is not set +# CONFIG_HMC425 is not set +# end of Amplifiers + +# +# Capacitance to digital converters +# +# CONFIG_AD7150 is not set +# CONFIG_AD7746 is not set +# end of Capacitance to digital converters + +# +# Chemical Sensors +# +# CONFIG_AOSONG_AGS02MA is not set +# CONFIG_ATLAS_PH_SENSOR is not set +# CONFIG_ATLAS_EZO_SENSOR is not set +# CONFIG_BME680 is not set +# CONFIG_CCS811 is not set +# CONFIG_ENS160 is not set +# CONFIG_IAQCORE is not set +# CONFIG_PMS7003 is not set +# CONFIG_SCD30_CORE is not set +# CONFIG_SCD4X is not set +# CONFIG_SENSIRION_SGP30 is not set +# CONFIG_SENSIRION_SGP40 is not set +# CONFIG_SPS30_I2C is not set +# CONFIG_SPS30_SERIAL is not set +# CONFIG_SENSEAIR_SUNRISE_CO2 is not set +# CONFIG_VZ89X is not set +# end of Chemical Sensors + +# +# Hid Sensor IIO Common +# +CONFIG_HID_SENSOR_IIO_COMMON=m +CONFIG_HID_SENSOR_IIO_TRIGGER=m +# end of Hid Sensor IIO Common + +CONFIG_IIO_INV_SENSORS_TIMESTAMP=m + +# +# IIO SCMI Sensors +# +# end of IIO SCMI Sensors + +# +# SSP Sensor Common +# +# CONFIG_IIO_SSP_SENSORHUB is not set +# end of SSP Sensor Common + +CONFIG_IIO_ST_SENSORS_I2C=m +CONFIG_IIO_ST_SENSORS_SPI=m +CONFIG_IIO_ST_SENSORS_CORE=m + +# +# Digital to analog converters +# +# CONFIG_AD3552R is not set +# CONFIG_AD5064 is not set +# CONFIG_AD5360 is not set +# CONFIG_AD5380 is not set +# CONFIG_AD5421 is not set +# CONFIG_AD5446 is not set +# CONFIG_AD5449 is not set +# CONFIG_AD5592R is not set +# CONFIG_AD5593R is not set +# CONFIG_AD5504 is not set +# CONFIG_AD5624R_SPI is not set +# CONFIG_AD9739A is not set +# CONFIG_LTC2688 is not set +# CONFIG_AD5686_SPI is not set +# CONFIG_AD5696_I2C is not set +# CONFIG_AD5755 is not set +# CONFIG_AD5758 is not set +# CONFIG_AD5761 is not set +# CONFIG_AD5764 is not set +# CONFIG_AD5766 is not set +# CONFIG_AD5770R is not set +# CONFIG_AD5791 is not set +# CONFIG_AD7293 is not set +# CONFIG_AD7303 is not set +# CONFIG_AD8801 is not set +# CONFIG_DPOT_DAC is not set +# CONFIG_DS4424 is not set +# CONFIG_LTC1660 is not set +# CONFIG_LTC2632 is not set +# CONFIG_LTC2664 is not set +# CONFIG_M62332 is not set +# CONFIG_MAX517 is not set +# CONFIG_MAX5522 is not set +# CONFIG_MAX5821 is not set +# CONFIG_MCP4725 is not set +# CONFIG_MCP4728 is not set +# CONFIG_MCP4821 is not set +# CONFIG_MCP4922 is not set +# CONFIG_TI_DAC082S085 is not set +# CONFIG_TI_DAC5571 is not set +# CONFIG_TI_DAC7311 is not set +# CONFIG_TI_DAC7612 is not set +# CONFIG_VF610_DAC is not set +# end of Digital to analog converters + +# +# IIO dummy driver +# +# end of IIO dummy driver + +# +# Filters +# +# end of Filters + +# +# Frequency Synthesizers DDS/PLL +# + +# +# Clock Generator/Distribution +# +# CONFIG_AD9523 is not set +# end of Clock Generator/Distribution + +# +# Phase-Locked Loop (PLL) frequency synthesizers +# +# CONFIG_ADF4350 is not set +# CONFIG_ADF4371 is not set +# CONFIG_ADF4377 is not set +# CONFIG_ADMFM2000 is not set +# CONFIG_ADMV1013 is not set +# CONFIG_ADMV4420 is not set +# CONFIG_ADRF6780 is not set +# end of Phase-Locked Loop (PLL) frequency synthesizers +# end of Frequency Synthesizers DDS/PLL + +# +# Digital gyroscope sensors +# +# CONFIG_ADIS16080 is not set +# CONFIG_ADIS16130 is not set +# CONFIG_ADIS16136 is not set +# CONFIG_ADIS16260 is not set +# CONFIG_ADXRS290 is not set +# CONFIG_ADXRS450 is not set +CONFIG_BMG160=m +CONFIG_BMG160_I2C=m +CONFIG_BMG160_SPI=m +# CONFIG_FXAS21002C is not set +CONFIG_HID_SENSOR_GYRO_3D=m +# CONFIG_MPU3050_I2C is not set +# CONFIG_IIO_ST_GYRO_3AXIS is not set +# CONFIG_ITG3200 is not set +# end of Digital gyroscope sensors + +# +# Health Sensors +# + +# +# Heart Rate Monitors +# +# CONFIG_AFE4403 is not set +# CONFIG_AFE4404 is not set +# CONFIG_MAX30100 is not set +# CONFIG_MAX30102 is not set +# end of Heart Rate Monitors +# end of Health Sensors + +# +# Humidity sensors +# +# CONFIG_AM2315 is not set +# CONFIG_DHT11 is not set +# CONFIG_ENS210 is not set +# CONFIG_HDC100X is not set +# CONFIG_HDC2010 is not set +# CONFIG_HDC3020 is not set +CONFIG_HID_SENSOR_HUMIDITY=m +# CONFIG_HTS221 is not set +# CONFIG_HTU21 is not set +# CONFIG_SI7005 is not set +# CONFIG_SI7020 is not set +# end of Humidity sensors + +# +# Inertial measurement units +# +# CONFIG_ADIS16400 is not set +# CONFIG_ADIS16460 is not set +# CONFIG_ADIS16475 is not set +# CONFIG_ADIS16480 is not set +CONFIG_BMI160=m +CONFIG_BMI160_I2C=m +# CONFIG_BMI160_SPI is not set +# CONFIG_BMI323_I2C is not set +# CONFIG_BMI323_SPI is not set +# CONFIG_BOSCH_BNO055_SERIAL is not set +# CONFIG_BOSCH_BNO055_I2C is not set +# CONFIG_FXOS8700_I2C is not set +# CONFIG_FXOS8700_SPI is not set +# CONFIG_KMX61 is not set +# CONFIG_INV_ICM42600_I2C is not set +# CONFIG_INV_ICM42600_SPI is not set +CONFIG_INV_MPU6050_IIO=m +CONFIG_INV_MPU6050_I2C=m +# CONFIG_INV_MPU6050_SPI is not set +CONFIG_IIO_ST_LSM6DSX=m +CONFIG_IIO_ST_LSM6DSX_I2C=m +CONFIG_IIO_ST_LSM6DSX_SPI=m +# CONFIG_IIO_ST_LSM9DS0 is not set +# end of Inertial measurement units + +# +# Light sensors +# +# CONFIG_ADJD_S311 is not set +# CONFIG_ADUX1020 is not set +# CONFIG_AL3010 is not set +# CONFIG_AL3320A is not set +# CONFIG_APDS9300 is not set +# CONFIG_APDS9306 is not set +# CONFIG_APDS9960 is not set +# CONFIG_AS73211 is not set +# CONFIG_BH1745 is not set +# CONFIG_BH1750 is not set +# CONFIG_BH1780 is not set +# CONFIG_CM32181 is not set +# CONFIG_CM3232 is not set +CONFIG_CM3323=m +# CONFIG_CM3605 is not set +# CONFIG_CM36651 is not set +# CONFIG_GP2AP002 is not set +# CONFIG_GP2AP020A00F is not set +# CONFIG_SENSORS_ISL29018 is not set +# CONFIG_SENSORS_ISL29028 is not set +# CONFIG_ISL29125 is not set +# CONFIG_ISL76682 is not set +CONFIG_HID_SENSOR_ALS=m +CONFIG_HID_SENSOR_PROX=m +# CONFIG_JSA1212 is not set +# CONFIG_ROHM_BU27008 is not set +# CONFIG_ROHM_BU27034 is not set +# CONFIG_RPR0521 is not set +# CONFIG_LTR390 is not set +CONFIG_LTR501=m +# CONFIG_LTRF216A is not set +# CONFIG_LV0104CS is not set +# CONFIG_MAX44000 is not set +# CONFIG_MAX44009 is not set +# CONFIG_NOA1305 is not set +# CONFIG_OPT3001 is not set +# CONFIG_OPT4001 is not set +# CONFIG_PA12203001 is not set +# CONFIG_SI1133 is not set +# CONFIG_SI1145 is not set +CONFIG_STK3310=m +# CONFIG_ST_UVIS25 is not set +# CONFIG_TCS3414 is not set +# CONFIG_TCS3472 is not set +# CONFIG_SENSORS_TSL2563 is not set +# CONFIG_TSL2583 is not set +# CONFIG_TSL2591 is not set +CONFIG_TSL2772=m +# CONFIG_TSL4531 is not set +# CONFIG_US5182D is not set +# CONFIG_VCNL4000 is not set +# CONFIG_VCNL4035 is not set +# CONFIG_VEML6030 is not set +# CONFIG_VEML6040 is not set +# CONFIG_VEML6070 is not set +# CONFIG_VEML6075 is not set +# CONFIG_VL6180 is not set +# CONFIG_ZOPT2201 is not set +# end of Light sensors + +# +# Magnetometer sensors +# +# CONFIG_AF8133J is not set +# CONFIG_AK8974 is not set +CONFIG_AK8975=m +# CONFIG_AK09911 is not set +CONFIG_BMC150_MAGN=m +CONFIG_BMC150_MAGN_I2C=m +# CONFIG_BMC150_MAGN_SPI is not set +# CONFIG_MAG3110 is not set +CONFIG_HID_SENSOR_MAGNETOMETER_3D=m +# CONFIG_MMC35240 is not set +CONFIG_IIO_ST_MAGN_3AXIS=m +CONFIG_IIO_ST_MAGN_I2C_3AXIS=m +CONFIG_IIO_ST_MAGN_SPI_3AXIS=m +# CONFIG_SENSORS_HMC5843_I2C is not set +# CONFIG_SENSORS_HMC5843_SPI is not set +# CONFIG_SENSORS_RM3100_I2C is not set +# CONFIG_SENSORS_RM3100_SPI is not set +# CONFIG_TI_TMAG5273 is not set +CONFIG_YAMAHA_YAS530=m +# end of Magnetometer sensors + +# +# Multiplexers +# +# CONFIG_IIO_MUX is not set +# end of Multiplexers + +# +# Inclinometer sensors +# +CONFIG_HID_SENSOR_INCLINOMETER_3D=m +CONFIG_HID_SENSOR_DEVICE_ROTATION=m +# end of Inclinometer sensors + +# +# Triggers - standalone +# +CONFIG_IIO_INTERRUPT_TRIGGER=m +CONFIG_IIO_SYSFS_TRIGGER=m +# end of Triggers - standalone + +# +# Linear and angular position sensors +# +CONFIG_HID_SENSOR_CUSTOM_INTEL_HINGE=m +# end of Linear and angular position sensors + +# +# Digital potentiometers +# +# CONFIG_AD5110 is not set +# CONFIG_AD5272 is not set +# CONFIG_DS1803 is not set +# CONFIG_MAX5432 is not set +# CONFIG_MAX5481 is not set +# CONFIG_MAX5487 is not set +# CONFIG_MCP4018 is not set +# CONFIG_MCP4131 is not set +# CONFIG_MCP4531 is not set +# CONFIG_MCP41010 is not set +# CONFIG_TPL0102 is not set +# CONFIG_X9250 is not set +# end of Digital potentiometers + +# +# Digital potentiostats +# +# CONFIG_LMP91000 is not set +# end of Digital potentiostats + +# +# Pressure sensors +# +# CONFIG_ABP060MG is not set +# CONFIG_ROHM_BM1390 is not set +# CONFIG_BMP280 is not set +# CONFIG_DLHL60D is not set +# CONFIG_DPS310 is not set +CONFIG_HID_SENSOR_PRESS=m +# CONFIG_HP03 is not set +# CONFIG_HSC030PA is not set +# CONFIG_ICP10100 is not set +# CONFIG_MPL115_I2C is not set +# CONFIG_MPL115_SPI is not set +# CONFIG_MPL3115 is not set +# CONFIG_MPRLS0025PA is not set +# CONFIG_MS5611 is not set +# CONFIG_MS5637 is not set +# CONFIG_SDP500 is not set +# CONFIG_IIO_ST_PRESS is not set +# CONFIG_T5403 is not set +# CONFIG_HP206C is not set +# CONFIG_ZPA2326 is not set +# end of Pressure sensors + +# +# Lightning sensors +# +# CONFIG_AS3935 is not set +# end of Lightning sensors + +# +# Proximity and distance sensors +# +# CONFIG_HX9023S is not set +# CONFIG_IRSD200 is not set +# CONFIG_ISL29501 is not set +# CONFIG_LIDAR_LITE_V2 is not set +# CONFIG_MB1232 is not set +# CONFIG_PING is not set +# CONFIG_RFD77402 is not set +# CONFIG_SRF04 is not set +# CONFIG_SX9310 is not set +# CONFIG_SX9324 is not set +# CONFIG_SX9360 is not set +# CONFIG_SX9500 is not set +# CONFIG_SRF08 is not set +# CONFIG_VCNL3020 is not set +# CONFIG_VL53L0X_I2C is not set +# CONFIG_AW96103 is not set +# end of Proximity and distance sensors + +# +# Resolver to digital converters +# +# CONFIG_AD2S90 is not set +# CONFIG_AD2S1200 is not set +# CONFIG_AD2S1210 is not set +# end of Resolver to digital converters + +# +# Temperature sensors +# +# CONFIG_LTC2983 is not set +# CONFIG_MAXIM_THERMOCOUPLE is not set +CONFIG_HID_SENSOR_TEMP=m +# CONFIG_MLX90614 is not set +# CONFIG_MLX90632 is not set +# CONFIG_MLX90635 is not set +# CONFIG_TMP006 is not set +# CONFIG_TMP007 is not set +# CONFIG_TMP117 is not set +# CONFIG_TSYS01 is not set +# CONFIG_TSYS02D is not set +# CONFIG_MAX30208 is not set +# CONFIG_MAX31856 is not set +# CONFIG_MAX31865 is not set +# CONFIG_MCP9600 is not set +# end of Temperature sensors + +CONFIG_PWM=y +# CONFIG_PWM_ATMEL_TCB is not set +CONFIG_PWM_CLK=y +# CONFIG_PWM_FSL_FTM is not set +# CONFIG_PWM_GPIO is not set +# CONFIG_PWM_PCA9685 is not set +# CONFIG_PWM_XILINX is not set + +# +# IRQ chip support +# +CONFIG_IRQCHIP=y +CONFIG_ARM_GIC=y +CONFIG_ARM_GIC_MAX_NR=1 +# CONFIG_AL_FIC is not set +# CONFIG_LAN966X_OIC is not set +# CONFIG_XILINX_INTC is not set +# CONFIG_QCOM_PDC is not set +CONFIG_QCOM_MPM=y +# end of IRQ chip support + +# CONFIG_IPACK_BUS is not set +CONFIG_RESET_CONTROLLER=y +# CONFIG_RESET_GPIO is not set +# CONFIG_RESET_QCOM_AOSS is not set +# CONFIG_RESET_QCOM_PDC is not set +# CONFIG_RESET_TI_SYSCON is not set +# CONFIG_RESET_TI_TPS380X is not set + +# +# PHY Subsystem +# +CONFIG_GENERIC_PHY=y +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# +# CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + +# CONFIG_PHY_CADENCE_TORRENT is not set +# CONFIG_PHY_CADENCE_DPHY is not set +# CONFIG_PHY_CADENCE_DPHY_RX is not set +# CONFIG_PHY_CADENCE_SIERRA is not set +# CONFIG_PHY_CADENCE_SALVO is not set +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_LAN966X_SERDES is not set +# CONFIG_PHY_CPCAP_USB is not set +# CONFIG_PHY_MAPPHONE_MDM6600 is not set +# CONFIG_PHY_OCELOT_SERDES is not set +# CONFIG_PHY_QCOM_APQ8064_SATA is not set +# CONFIG_PHY_QCOM_EDP is not set +# CONFIG_PHY_QCOM_IPQ4019_USB is not set +# CONFIG_PHY_QCOM_IPQ806X_SATA is not set +# CONFIG_PHY_QCOM_PCIE2 is not set +# CONFIG_PHY_QCOM_QMP is not set +# CONFIG_PHY_QCOM_QUSB2 is not set +# CONFIG_PHY_QCOM_SNPS_EUSB2 is not set +# CONFIG_PHY_QCOM_EUSB2_REPEATER is not set +# CONFIG_PHY_QCOM_M31_USB is not set +CONFIG_PHY_QCOM_USB_HS=y +# CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2 is not set +# CONFIG_PHY_QCOM_USB_HSIC is not set +# CONFIG_PHY_QCOM_USB_HS_28NM is not set +# CONFIG_PHY_QCOM_USB_SS is not set +# CONFIG_PHY_QCOM_IPQ806X_USB is not set +# CONFIG_PHY_QCOM_SGMII_ETH is not set +# CONFIG_PHY_TUSB1210 is not set +# end of PHY Subsystem + +# CONFIG_POWERCAP is not set +# CONFIG_MCB is not set + +# +# Performance monitor support +# +CONFIG_ARM_CCI_PMU=m +CONFIG_ARM_CCI400_PMU=y +CONFIG_ARM_CCI5xx_PMU=y +# CONFIG_ARM_CCN is not set +CONFIG_ARM_PMU=y +CONFIG_ARM_V7_PMU=y +# CONFIG_ARM_PMUV3 is not set +# end of Performance monitor support + +# CONFIG_RAS is not set + +# +# Android +# +CONFIG_ANDROID_BINDER_IPC=y +# CONFIG_ANDROID_BINDERFS is not set +CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder" +# CONFIG_ANDROID_BINDER_IPC_SELFTEST is not set +# end of Android + +CONFIG_TRACE_GPU_MEM=y +# CONFIG_DAX is not set +CONFIG_NVMEM=y +# CONFIG_NVMEM_SYSFS is not set +CONFIG_NVMEM_LAYOUTS=y + +# +# Layout Types +# +# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set +# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set +# CONFIG_NVMEM_LAYOUT_U_BOOT_ENV is not set +# end of Layout Types + +CONFIG_NVMEM_QCOM_QFPROM=y +# CONFIG_NVMEM_QCOM_SEC_QFPROM is not set +# CONFIG_NVMEM_RMEM is not set +# CONFIG_NVMEM_SPMI_SDAM is not set + +# +# HW tracing support +# +# CONFIG_STM is not set +# CONFIG_INTEL_TH is not set +# end of HW tracing support + +# CONFIG_FPGA is not set +# CONFIG_FSI is not set +# CONFIG_TEE is not set +CONFIG_PM_OPP=y +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set +CONFIG_INTERCONNECT=y +# CONFIG_INTERCONNECT_QCOM is not set +CONFIG_INTERCONNECT_CLK=y +# CONFIG_COUNTER is not set +# CONFIG_MOST is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set +# end of Device Drivers + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +# CONFIG_VALIDATE_FS_PARSER is not set +CONFIG_FS_IOMAP=y +CONFIG_FS_STACK=y +CONFIG_BUFFER_HEAD=y +CONFIG_LEGACY_DIRECT_IO=y +# CONFIG_EXT2_FS is not set +# CONFIG_EXT3_FS is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_USE_FOR_EXT2=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_XFS_FS=m +CONFIG_XFS_SUPPORT_V4=y +CONFIG_XFS_SUPPORT_ASCII_CI=y +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_POSIX_ACL is not set +# CONFIG_XFS_RT is not set +# CONFIG_XFS_ONLINE_SCRUB is not set +# CONFIG_XFS_WARN is not set +# CONFIG_XFS_DEBUG is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_BTRFS_FS=m +CONFIG_BTRFS_FS_POSIX_ACL=y +# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set +# CONFIG_BTRFS_DEBUG is not set +# CONFIG_BTRFS_ASSERT is not set +# CONFIG_BTRFS_FS_REF_VERIFY is not set +# CONFIG_NILFS2_FS is not set +CONFIG_F2FS_FS=m +CONFIG_F2FS_STAT_FS=y +CONFIG_F2FS_FS_XATTR=y +CONFIG_F2FS_FS_POSIX_ACL=y +# CONFIG_F2FS_FS_SECURITY is not set +# CONFIG_F2FS_CHECK_FS is not set +# CONFIG_F2FS_FAULT_INJECTION is not set +CONFIG_F2FS_FS_COMPRESSION=y +CONFIG_F2FS_FS_LZO=y +CONFIG_F2FS_FS_LZORLE=y +CONFIG_F2FS_FS_LZ4=y +CONFIG_F2FS_FS_LZ4HC=y +CONFIG_F2FS_FS_ZSTD=y +CONFIG_F2FS_IOSTAT=y +# CONFIG_F2FS_UNFAIR_RWSEM is not set +# CONFIG_BCACHEFS_FS is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_EXPORTFS=y +# CONFIG_EXPORTFS_BLOCK_OPS is not set +CONFIG_FILE_LOCKING=y +# CONFIG_FS_ENCRYPTION is not set +# CONFIG_FS_VERITY is not set +CONFIG_FSNOTIFY=y +CONFIG_DNOTIFY=y +CONFIG_INOTIFY_USER=y +CONFIG_FANOTIFY=y +# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set +CONFIG_QUOTA=y +# CONFIG_QUOTA_NETLINK_INTERFACE is not set +# CONFIG_QUOTA_DEBUG is not set +# CONFIG_QFMT_V1 is not set +# CONFIG_QFMT_V2 is not set +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=y +CONFIG_FUSE_FS=m +CONFIG_CUSE=m +# CONFIG_VIRTIO_FS is not set +CONFIG_FUSE_PASSTHROUGH=y +CONFIG_OVERLAY_FS=m +# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set +CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y +# CONFIG_OVERLAY_FS_INDEX is not set +# CONFIG_OVERLAY_FS_METACOPY is not set +# CONFIG_OVERLAY_FS_DEBUG is not set + +# +# Caches +# +CONFIG_NETFS_SUPPORT=m +# CONFIG_NETFS_STATS is not set +# CONFIG_NETFS_DEBUG is not set +# CONFIG_FSCACHE is not set +# end of Caches + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +CONFIG_UDF_FS=m +# end of CD-ROM/DVD Filesystems + +# +# DOS/FAT/EXFAT/NT Filesystems +# +CONFIG_FAT_FS=y +# CONFIG_MSDOS_FS is not set +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_FAT_DEFAULT_UTF8 is not set +CONFIG_EXFAT_FS=m +CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" +# CONFIG_NTFS3_FS is not set +# CONFIG_NTFS_FS is not set +# end of DOS/FAT/EXFAT/NT Filesystems + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PROC_CHILDREN=y +CONFIG_KERNFS=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TMPFS_XATTR=y +# CONFIG_TMPFS_QUOTA is not set +CONFIG_CONFIGFS_FS=y +CONFIG_EFIVAR_FS=m +# end of Pseudo filesystems + +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_ORANGEFS_FS is not set +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_ECRYPT_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +CONFIG_SQUASHFS=m +# CONFIG_SQUASHFS_FILE_CACHE is not set +CONFIG_SQUASHFS_FILE_DIRECT=y +CONFIG_SQUASHFS_DECOMP_SINGLE=y +# CONFIG_SQUASHFS_CHOICE_DECOMP_BY_MOUNT is not set +CONFIG_SQUASHFS_COMPILE_DECOMP_SINGLE=y +# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI is not set +# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU is not set +CONFIG_SQUASHFS_XATTR=y +CONFIG_SQUASHFS_ZLIB=y +# CONFIG_SQUASHFS_LZ4 is not set +# CONFIG_SQUASHFS_LZO is not set +CONFIG_SQUASHFS_XZ=y +# CONFIG_SQUASHFS_ZSTD is not set +# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX6FS_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_PSTORE=y +CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 +CONFIG_PSTORE_COMPRESS=y +CONFIG_PSTORE_CONSOLE=y +CONFIG_PSTORE_PMSG=y +# CONFIG_PSTORE_FTRACE is not set +CONFIG_PSTORE_RAM=y +# CONFIG_PSTORE_BLK is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_EROFS_FS=y +# CONFIG_EROFS_FS_DEBUG is not set +CONFIG_EROFS_FS_XATTR=y +CONFIG_EROFS_FS_POSIX_ACL=y +CONFIG_EROFS_FS_SECURITY=y +CONFIG_EROFS_FS_BACKED_BY_FILE=y +CONFIG_EROFS_FS_ZIP=y +CONFIG_EROFS_FS_ZIP_LZMA=y +CONFIG_EROFS_FS_ZIP_DEFLATE=y +CONFIG_EROFS_FS_ZIP_ZSTD=y +# CONFIG_EROFS_FS_ONDEMAND is not set +# CONFIG_EROFS_FS_PCPU_KTHREAD is not set +CONFIG_NETWORK_FILESYSTEMS=y +# CONFIG_NFS_FS is not set +# CONFIG_NFSD is not set +# CONFIG_CEPH_FS is not set +CONFIG_CIFS=m +CONFIG_CIFS_STATS2=y +CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y +# CONFIG_CIFS_UPCALL is not set +# CONFIG_CIFS_XATTR is not set +CONFIG_CIFS_DEBUG=y +# CONFIG_CIFS_DEBUG2 is not set +# CONFIG_CIFS_DEBUG_DUMP_KEYS is not set +# CONFIG_CIFS_DFS_UPCALL is not set +# CONFIG_CIFS_SWN_UPCALL is not set +# CONFIG_CIFS_COMPRESSION is not set +# CONFIG_SMB_SERVER is not set +CONFIG_SMBFS=m +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +# CONFIG_NLS_UTF8 is not set +CONFIG_NLS_UCS2_UTILS=m +# CONFIG_DLM is not set +# CONFIG_UNICODE is not set +CONFIG_IO_WQ=y +# end of File systems + +# +# Security options +# +CONFIG_KEYS=y +# CONFIG_KEYS_REQUEST_CACHE is not set +# CONFIG_PERSISTENT_KEYRINGS is not set +# CONFIG_TRUSTED_KEYS is not set +# CONFIG_ENCRYPTED_KEYS is not set +CONFIG_KEY_DH_OPERATIONS=y +CONFIG_SECURITY_DMESG_RESTRICT=y +CONFIG_PROC_MEM_ALWAYS_FORCE=y +# CONFIG_PROC_MEM_FORCE_PTRACE is not set +# CONFIG_PROC_MEM_NO_FORCE is not set +CONFIG_SECURITY=y +CONFIG_SECURITYFS=y +# CONFIG_SECURITY_NETWORK is not set +# CONFIG_SECURITY_PATH is not set +# CONFIG_HARDENED_USERCOPY is not set +# CONFIG_FORTIFY_SOURCE is not set +# CONFIG_STATIC_USERMODEHELPER is not set +# CONFIG_SECURITY_SMACK is not set +# CONFIG_SECURITY_TOMOYO is not set +# CONFIG_SECURITY_APPARMOR is not set +# CONFIG_SECURITY_LOADPIN is not set +# CONFIG_SECURITY_YAMA is not set +# CONFIG_SECURITY_SAFESETID is not set +# CONFIG_SECURITY_LOCKDOWN_LSM is not set +# CONFIG_SECURITY_LANDLOCK is not set +# CONFIG_SECURITY_IPE is not set +CONFIG_INTEGRITY=y +# CONFIG_INTEGRITY_SIGNATURE is not set +CONFIG_INTEGRITY_AUDIT=y +# CONFIG_IMA is not set +# CONFIG_EVM is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,ipe,bpf" + +# +# Kernel hardening options +# + +# +# Memory initialization +# +CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y +# CONFIG_INIT_STACK_NONE is not set +# CONFIG_INIT_STACK_ALL_PATTERN is not set +CONFIG_INIT_STACK_ALL_ZERO=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set +# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set +# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set +CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y +# CONFIG_ZERO_CALL_USED_REGS is not set +# end of Memory initialization + +# +# Hardening of kernel data structures +# +# CONFIG_LIST_HARDENED is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# end of Hardening of kernel data structures + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set +# end of Kernel hardening options +# end of Security options + +CONFIG_XOR_BLOCKS=m +CONFIG_ASYNC_CORE=m +CONFIG_ASYNC_XOR=m +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_SIG=y +CONFIG_CRYPTO_SIG2=y +CONFIG_CRYPTO_SKCIPHER=y +CONFIG_CRYPTO_SKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=y +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_AKCIPHER=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_KPP=y +CONFIG_CRYPTO_ACOMP2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_USER is not set +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_NULL2=y +# CONFIG_CRYPTO_PCRYPT is not set +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_AUTHENC=y +# CONFIG_CRYPTO_TEST is not set +CONFIG_CRYPTO_SIMD=y +# end of Crypto core or helper + +# +# Public-key cryptography +# +CONFIG_CRYPTO_RSA=y +CONFIG_CRYPTO_DH=y +# CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set +CONFIG_CRYPTO_ECC=y +CONFIG_CRYPTO_ECDH=y +# CONFIG_CRYPTO_ECDSA is not set +# CONFIG_CRYPTO_ECRDSA is not set +# CONFIG_CRYPTO_CURVE25519 is not set +# end of Public-key cryptography + +# +# Block ciphers +# +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +CONFIG_CRYPTO_DES=m +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers + +# +# Length-preserving ciphers and modes +# +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_ARC4 is not set +# CONFIG_CRYPTO_CHACHA20 is not set +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_CTR=y +# CONFIG_CRYPTO_CTS is not set +CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +CONFIG_CRYPTO_XTS=y +CONFIG_CRYPTO_NHPOLY1305=m +# end of Length-preserving ciphers and modes + +# +# AEAD (authenticated encryption with associated data) ciphers +# +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_GCM=y +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=m +# end of AEAD (authenticated encryption with associated data) ciphers + +# +# Hashes, digests, and MACs +# +CONFIG_CRYPTO_BLAKE2B=m +CONFIG_CRYPTO_CMAC=y +CONFIG_CRYPTO_GHASH=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=m +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_POLY1305 is not set +# CONFIG_CRYPTO_RMD160 is not set +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=y +CONFIG_CRYPTO_SHA3=y +# CONFIG_CRYPTO_SM3_GENERIC is not set +# CONFIG_CRYPTO_STREEBOG is not set +# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_WP512 is not set +# CONFIG_CRYPTO_XCBC is not set +CONFIG_CRYPTO_XXHASH=m +# end of Hashes, digests, and MACs + +# +# CRCs (cyclic redundancy checks) +# +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRC32=m +CONFIG_CRYPTO_CRCT10DIF=y +CONFIG_CRYPTO_CRC64_ROCKSOFT=y +# end of CRCs (cyclic redundancy checks) + +# +# Compression +# +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set +# CONFIG_CRYPTO_842 is not set +# CONFIG_CRYPTO_LZ4 is not set +# CONFIG_CRYPTO_LZ4HC is not set +# CONFIG_CRYPTO_ZSTD is not set +# end of Compression + +# +# Random number generation +# +CONFIG_CRYPTO_ANSI_CPRNG=y +CONFIG_CRYPTO_DRBG_MENU=y +CONFIG_CRYPTO_DRBG_HMAC=y +# CONFIG_CRYPTO_DRBG_HASH is not set +# CONFIG_CRYPTO_DRBG_CTR is not set +CONFIG_CRYPTO_DRBG=y +CONFIG_CRYPTO_JITTERENTROPY=y +CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64 +CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32 +CONFIG_CRYPTO_JITTERENTROPY_OSR=1 +CONFIG_CRYPTO_KDF800108_CTR=y +# end of Random number generation + +# +# Userspace interface +# +CONFIG_CRYPTO_USER_API=m +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m +CONFIG_CRYPTO_USER_API_RNG=m +# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set +CONFIG_CRYPTO_USER_API_AEAD=m +CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y +# end of Userspace interface + +CONFIG_CRYPTO_HASH_INFO=y + +# +# Accelerated Cryptographic Algorithms for CPU (arm) +# +CONFIG_CRYPTO_CURVE25519_NEON=m +CONFIG_CRYPTO_GHASH_ARM_CE=y +CONFIG_CRYPTO_NHPOLY1305_NEON=m +CONFIG_CRYPTO_POLY1305_ARM=m +CONFIG_CRYPTO_BLAKE2S_ARM=y +CONFIG_CRYPTO_BLAKE2B_NEON=m +CONFIG_CRYPTO_SHA1_ARM=y +CONFIG_CRYPTO_SHA1_ARM_NEON=y +CONFIG_CRYPTO_SHA1_ARM_CE=y +CONFIG_CRYPTO_SHA2_ARM_CE=y +CONFIG_CRYPTO_SHA256_ARM=y +CONFIG_CRYPTO_SHA512_ARM=y +CONFIG_CRYPTO_AES_ARM=y +CONFIG_CRYPTO_AES_ARM_BS=y +CONFIG_CRYPTO_AES_ARM_CE=y +CONFIG_CRYPTO_CHACHA20_NEON=m +CONFIG_CRYPTO_CRC32_ARM_CE=y +# CONFIG_CRYPTO_CRCT10DIF_ARM_CE is not set +# end of Accelerated Cryptographic Algorithms for CPU (arm) + +CONFIG_CRYPTO_HW=y +# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set +# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set +CONFIG_CRYPTO_DEV_QCE=y +CONFIG_CRYPTO_DEV_QCE_SKCIPHER=y +CONFIG_CRYPTO_DEV_QCE_SHA=y +CONFIG_CRYPTO_DEV_QCE_AEAD=y +CONFIG_CRYPTO_DEV_QCE_ENABLE_ALL=y +# CONFIG_CRYPTO_DEV_QCE_ENABLE_SKCIPHER is not set +# CONFIG_CRYPTO_DEV_QCE_ENABLE_SHA is not set +# CONFIG_CRYPTO_DEV_QCE_ENABLE_AEAD is not set +CONFIG_CRYPTO_DEV_QCE_SW_MAX_LEN=512 +CONFIG_CRYPTO_DEV_QCOM_RNG=y +# CONFIG_CRYPTO_DEV_VIRTIO is not set +# CONFIG_CRYPTO_DEV_SAFEXCEL is not set +# CONFIG_CRYPTO_DEV_CCREE is not set +# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set +CONFIG_ASYMMETRIC_KEY_TYPE=y +CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y +CONFIG_X509_CERTIFICATE_PARSER=y +CONFIG_PKCS8_PRIVATE_KEY_PARSER=m +CONFIG_PKCS7_MESSAGE_PARSER=y +# CONFIG_PKCS7_TEST_KEY is not set +# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set +# CONFIG_FIPS_SIGNATURE_SELFTEST is not set + +# +# Certificates for signature checking +# +CONFIG_SYSTEM_TRUSTED_KEYRING=y +CONFIG_SYSTEM_TRUSTED_KEYS="" +# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set +# CONFIG_SECONDARY_TRUSTED_KEYRING is not set +# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set +# end of Certificates for signature checking + +CONFIG_BINARY_PRINTF=y + +# +# Library routines +# +CONFIG_RAID6_PQ=m +CONFIG_RAID6_PQ_BENCHMARK=y +CONFIG_LINEAR_RANGES=y +# CONFIG_PACKING is not set +CONFIG_BITREVERSE=y +CONFIG_HAVE_ARCH_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +# CONFIG_CORDIC is not set +# CONFIG_PRIME_NUMBERS is not set +CONFIG_RATIONAL=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=y +CONFIG_CRYPTO_LIB_GF128MUL=y +CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y +CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m +CONFIG_CRYPTO_LIB_CHACHA=m +CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m +CONFIG_CRYPTO_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_DES=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 +CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m +CONFIG_CRYPTO_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + +# CONFIG_CRC_CCITT is not set +CONFIG_CRC16=y +CONFIG_CRC_T10DIF=y +CONFIG_CRC64_ROCKSOFT=y +CONFIG_CRC_ITU_T=m +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +CONFIG_CRC64=y +# CONFIG_CRC4 is not set +# CONFIG_CRC7 is not set +CONFIG_LIBCRC32C=y +# CONFIG_CRC8 is not set +CONFIG_XXHASH=y +CONFIG_AUDIT_GENERIC=y +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_842_COMPRESS=m +CONFIG_842_DECOMPRESS=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=m +CONFIG_LZO_DECOMPRESS=y +CONFIG_LZ4_COMPRESS=m +CONFIG_LZ4HC_COMPRESS=m +CONFIG_LZ4_DECOMPRESS=y +CONFIG_ZSTD_COMMON=y +CONFIG_ZSTD_COMPRESS=m +CONFIG_ZSTD_DECOMPRESS=y +CONFIG_XZ_DEC=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_ARM64=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_RISCV=y +CONFIG_XZ_DEC_MICROLZMA=y +CONFIG_XZ_DEC_BCJ=y +# CONFIG_XZ_DEC_TEST is not set +CONFIG_DECOMPRESS_GZIP=y +CONFIG_DECOMPRESS_BZIP2=y +CONFIG_DECOMPRESS_LZMA=y +CONFIG_DECOMPRESS_XZ=y +CONFIG_DECOMPRESS_LZO=y +CONFIG_DECOMPRESS_LZ4=y +CONFIG_DECOMPRESS_ZSTD=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_REED_SOLOMON=y +CONFIG_REED_SOLOMON_ENC8=y +CONFIG_REED_SOLOMON_DEC8=y +CONFIG_XARRAY_MULTI=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +CONFIG_DMA_OPS_HELPERS=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_DMA_DECLARE_COHERENT=y +CONFIG_ARCH_HAS_SETUP_DMA_OPS=y +CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y +CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y +CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y +CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y +CONFIG_DMA_NEED_SYNC=y +CONFIG_DMA_NONCOHERENT_MMAP=y +CONFIG_ARCH_HAS_DMA_ALLOC=y +CONFIG_DMA_CMA=y + +# +# Default contiguous memory area size: +# +CONFIG_CMA_SIZE_MBYTES=16 +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_ALIGNMENT=8 +# CONFIG_DMA_API_DEBUG is not set +# CONFIG_DMA_MAP_BENCHMARK is not set +CONFIG_SGL_ALLOC=y +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_GLOB=y +# CONFIG_GLOB_SELFTEST is not set +CONFIG_NLATTR=y +CONFIG_CLZ_TAB=y +# CONFIG_IRQ_POLL is not set +CONFIG_MPILIB=y +CONFIG_DIMLIB=y +CONFIG_LIBFDT=y +CONFIG_OID_REGISTRY=y +CONFIG_UCS2_STRING=y +CONFIG_HAVE_GENERIC_VDSO=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_VDSO_32=y +CONFIG_FONT_SUPPORT=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_SG_POOL=y +CONFIG_ARCH_STACKWALK=y +CONFIG_STACKDEPOT=y +CONFIG_STACKDEPOT_MAX_FRAMES=64 +CONFIG_SBITMAP=y +# CONFIG_LWQ_TEST is not set +# end of Library routines + +CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y + +# +# Kernel hacking +# + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_CONSOLE_LOGLEVEL_QUIET=4 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +CONFIG_DYNAMIC_DEBUG=y +CONFIG_DYNAMIC_DEBUG_CORE=y +CONFIG_SYMBOLIC_ERRNAME=y +CONFIG_DEBUG_BUGVERBOSE=y +# end of printk and dmesg options + +# CONFIG_DEBUG_KERNEL is not set + +# +# Compile-time checks and compiler options +# +CONFIG_AS_HAS_NON_CONST_ULEB128=y +CONFIG_FRAME_WARN=1024 +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_HEADERS_INSTALL is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +# end of Compile-time checks and compiler options + +# +# Generic Kernel Debugging Instruments +# +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x0 +CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" +CONFIG_DEBUG_FS=y +CONFIG_DEBUG_FS_ALLOW_ALL=y +# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set +# CONFIG_DEBUG_FS_ALLOW_NONE is not set +CONFIG_HAVE_ARCH_KGDB=y +CONFIG_ARCH_HAS_UBSAN=y +# CONFIG_UBSAN is not set +CONFIG_HAVE_KCSAN_COMPILER=y +# end of Generic Kernel Debugging Instruments + +# +# Networking Debugging +# +# end of Networking Debugging + +# +# Memory Debugging +# +# CONFIG_PAGE_EXTENSION is not set +CONFIG_SLUB_DEBUG=y +# CONFIG_SLUB_DEBUG_ON is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_DEBUG_RODATA_TEST is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +# CONFIG_PER_VMA_LOCK_STATS is not set +# CONFIG_SHRINKER_DEBUG is not set +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +CONFIG_DEBUG_MEMORY_INIT=y +# CONFIG_MEM_ALLOC_PROFILING is not set +CONFIG_HAVE_ARCH_KASAN=y +CONFIG_HAVE_ARCH_KASAN_VMALLOC=y +CONFIG_CC_HAS_KASAN_GENERIC=y +CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y +# CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +# end of Memory Debugging + +# +# Debug Oops, Lockups and Hangs +# +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=0 +CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y +# CONFIG_TEST_LOCKUP is not set +# end of Debug Oops, Lockups and Hangs + +# +# Scheduler Debugging +# +CONFIG_SCHED_INFO=y +# CONFIG_SCHEDSTATS is not set +# end of Scheduler Debugging + +# CONFIG_DEBUG_TIMEKEEPING is not set + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_WW_MUTEX_SELFTEST is not set +# end of Lock Debugging (spinlocks, mutexes, etc...) + +# CONFIG_DEBUG_IRQFLAGS is not set +CONFIG_STACKTRACE=y +# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set + +# +# Debug kernel data structures +# +# end of Debug kernel data structures + +# +# RCU Debugging +# +CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 +# CONFIG_RCU_CPU_STALL_CPUTIME is not set +# end of RCU Debugging + +CONFIG_NOP_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y +CONFIG_BUILDTIME_MCOUNT_SORT=y +CONFIG_TRACE_CLOCK=y +CONFIG_RING_BUFFER=y +CONFIG_EVENT_TRACING=y +CONFIG_CONTEXT_SWITCH_TRACER=y +CONFIG_TRACING=y +CONFIG_GENERIC_TRACER=y +CONFIG_TRACING_SUPPORT=y +CONFIG_FTRACE=y +# CONFIG_BOOTTIME_TRACING is not set +CONFIG_FUNCTION_TRACER=y +CONFIG_FUNCTION_GRAPH_TRACER=y +CONFIG_DYNAMIC_FTRACE=y +CONFIG_DYNAMIC_FTRACE_WITH_REGS=y +# CONFIG_FUNCTION_PROFILER is not set +# CONFIG_STACK_TRACER is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_PREEMPT_TRACER is not set +# CONFIG_SCHED_TRACER is not set +# CONFIG_HWLAT_TRACER is not set +# CONFIG_OSNOISE_TRACER is not set +# CONFIG_TIMERLAT_TRACER is not set +# CONFIG_FTRACE_SYSCALLS is not set +# CONFIG_TRACER_SNAPSHOT is not set +CONFIG_BRANCH_PROFILE_NONE=y +# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set +# CONFIG_PROFILE_ALL_BRANCHES is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +CONFIG_KPROBE_EVENTS=y +# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set +CONFIG_UPROBE_EVENTS=y +CONFIG_BPF_EVENTS=y +CONFIG_DYNAMIC_EVENTS=y +CONFIG_PROBE_EVENTS=y +CONFIG_FTRACE_MCOUNT_RECORD=y +CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT=y +# CONFIG_SYNTH_EVENTS is not set +# CONFIG_USER_EVENTS is not set +# CONFIG_HIST_TRIGGERS is not set +# CONFIG_TRACE_EVENT_INJECT is not set +# CONFIG_TRACEPOINT_BENCHMARK is not set +# CONFIG_RING_BUFFER_BENCHMARK is not set +# CONFIG_TRACE_EVAL_MAP_FILE is not set +# CONFIG_FTRACE_RECORD_RECURSION is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_FTRACE_SORT_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set +# CONFIG_PREEMPTIRQ_DELAY_TEST is not set +# CONFIG_KPROBE_EVENT_GEN_TEST is not set +# CONFIG_RV is not set +# CONFIG_SAMPLES is not set +CONFIG_STRICT_DEVMEM=y +# CONFIG_IO_STRICT_DEVMEM is not set + +# +# arm Debugging +# +# CONFIG_ARM_DEBUG_WX is not set +# CONFIG_UNWINDER_FRAME_POINTER is not set +CONFIG_UNWINDER_ARM=y +CONFIG_ARM_UNWIND=y +# CONFIG_DEBUG_USER is not set +CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" +CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" +# CONFIG_ARM_KPROBES_TEST is not set +# CONFIG_PID_IN_CONTEXTIDR is not set +# CONFIG_CORESIGHT is not set +# end of arm Debugging + +# +# Kernel Testing and Coverage +# +# CONFIG_KUNIT is not set +# CONFIG_FUNCTION_ERROR_INJECTION is not set +CONFIG_ARCH_HAS_KCOV=y +CONFIG_CC_HAS_SANCOV_TRACE_PC=y +# CONFIG_KCOV is not set +CONFIG_RUNTIME_TESTING_MENU=y +# CONFIG_TEST_DHRY is not set +# CONFIG_LKDTM is not set +# CONFIG_TEST_MIN_HEAP is not set +# CONFIG_TEST_DIV64 is not set +# CONFIG_TEST_MULDIV64 is not set +# CONFIG_REED_SOLOMON_TEST is not set +# CONFIG_ATOMIC64_SELFTEST is not set +# CONFIG_TEST_HEXDUMP is not set +# CONFIG_TEST_KSTRTOX is not set +# CONFIG_TEST_PRINTF is not set +# CONFIG_TEST_SCANF is not set +# CONFIG_TEST_BITMAP is not set +# CONFIG_TEST_UUID is not set +# CONFIG_TEST_XARRAY is not set +# CONFIG_TEST_MAPLE_TREE is not set +# CONFIG_TEST_RHASHTABLE is not set +# CONFIG_TEST_IDA is not set +# CONFIG_TEST_LKM is not set +# CONFIG_TEST_BITOPS is not set +# CONFIG_TEST_VMALLOC is not set +# CONFIG_TEST_BPF is not set +# CONFIG_TEST_BLACKHOLE_DEV is not set +# CONFIG_FIND_BIT_BENCHMARK is not set +# CONFIG_TEST_FIRMWARE is not set +# CONFIG_TEST_SYSCTL is not set +# CONFIG_TEST_UDELAY is not set +# CONFIG_TEST_STATIC_KEYS is not set +# CONFIG_TEST_DYNAMIC_DEBUG is not set +# CONFIG_TEST_KMOD is not set +# CONFIG_TEST_MEMCAT_P is not set +# CONFIG_TEST_MEMINIT is not set +# CONFIG_TEST_FREE_PAGES is not set +CONFIG_ARCH_USE_MEMTEST=y +# CONFIG_MEMTEST is not set +# end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking +# end of Kernel hacking diff --git a/patches/sxmo/0001-bananarchy-sxmo-240x320-keypad-ui.patch b/patches/sxmo/0001-bananarchy-sxmo-240x320-keypad-ui.patch new file mode 100644 index 0000000..09033f4 --- /dev/null +++ b/patches/sxmo/0001-bananarchy-sxmo-240x320-keypad-ui.patch @@ -0,0 +1,226 @@ +# Bananarchy Sxmo 240x320 Native Resolution & Physical Keypad Patch +# Targets: Nokia 8110 4G (nokia-argon), Nokia 2720 Flip (nokia-beatles), +# Nokia 800 Tough (nokia-coconut), Nokia 8000 4G (nokia-sparkler) +# +# Full modified files are tracked in overlay/rootfs/: +# - usr/bin/sxmo_deviceprofile_nokia,{argon,beatles,coconut,sparkler,leo}.sh +# - usr/share/sxmo/appcfg/{sway_template,conky.conf,wofi.config,wofi.css,foot.ini,wob.ini,dunst.conf} +# - usr/share/sxmo/default_hooks/{sxmo_hook_inputhandler.sh,sxmo_hook_start.sh} +# - home/user/.config/sxmo/{profile,sway,conky.conf} +--- a/usr/share/sxmo/appcfg/profile_template 2026-05-10 19:25:12.000000000 +0300 ++++ b/overlay/rootfs/home/user/.config/sxmo/profile 2026-10-18 12:06:20.163476428 +0300 +@@ -69,3 +69,10 @@ + + #Set to the default text for a new text message. + export SXMO_DEFAULT_DRAFT="Enter new message here." ++ ++export GTK_IM_MODULE=fcitx ++export QT_IM_MODULE=fcitx ++export XMODIFIERS=@im=fcitx ++export SXMO_MENU=wofi ++ ++export SXMO_BG_IMG="/usr/share/wallpapers/bananarchy.png" +--- a/usr/share/sxmo/appcfg/i3_template 2026-05-10 19:25:12.000000000 +0300 ++++ b/overlay/rootfs/usr/share/sxmo/appcfg/sway_template 2026-10-18 14:06:00.979385569 +0300 +@@ -1,9 +1,9 @@ +-# Default config for i3 +-# configversion: 7fd9eb1f82c8403c974da53df81b9d1e ++# Default config for sway ++# configversion: 076611fe8cc699bcaa01092a8e4481c0 + # +-# Copy this to ~/.config/i3/config and edit it to your liking. ++# Copy this to ~/.config/sway/config and edit it to your liking. + # +-# Please see https://i3wm.org/docs/userguide.html for a complete reference! ++# Read `man 5 sway` for a complete reference. + + ### Variables + # +@@ -17,25 +17,59 @@ + # Your preferred terminal emulator + set $term sxmo_terminal.sh + # Your preferred application launcher +-# Note: pass the final command to i3msg so that the resulting window can be opened ++# Note: pass the final command to swaymsg so that the resulting window can be opened + # on the original workspace that the command was run on. +-set $menu dmenu_run ++set $menu bemenu-run + +-font pango:Sxmo 11 ++font "Sxmo 13" ++xwayland disable ++output * scale 1 bg /usr/share/wallpapers/bananarchy.png fill ++ ++exec_always sxmo_swayinitconf.sh ++ ++exec_always dbus-update-activation-environment WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP + + mode "menu" { +- # This is slower than remapping the keys using a keymap, but we don't need +- # to know the device names, so use it as a fallback so this functionality +- # keeps working if a deviceprofile doesn't exist. +- bindsym XF86PowerOff exec xdotool type Return +- bindsym XF86AudioRaiseVolume exec xdotool type Up +- bindsym XF86AudioLowerVolume exec xdotool type Down ++ bindsym --locked XF86PowerOff exec sh -c "sxmo_dmenu.sh close; if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; fi" ++ bindsym --locked XF86PickupPhone exec sh -c "if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; else wtype -k Return; fi" ++ bindsym --locked XF86KbdLcdMenu1 exec sh -c "sxmo_dmenu.sh close; if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; fi" ++ bindsym --locked XF86KbdLcdMenu2 exec sh -c "sxmo_dmenu.sh close; if sxmo_state.sh is_locked; then sxmo_state.sh set unlock; sxmo_wm.sh display on; fi" ++ bindsym XF86AudioRaiseVolume exec wtype -k Up ++ bindsym XF86AudioLowerVolume exec wtype -k Down ++ bindswitch --locked lid:on exec sh -c "sxmo_dmenu.sh close; brightnessctl -d white:kbd_backlight set 0; sxmo_state.sh set screenoff" ++ bindswitch --locked lid:off exec sh -c "brightnessctl -d white:kbd_backlight set 255; sxmo_state.sh set unlock; sxmo_wm.sh display on" ++} ++ ++# Mode specifically for use with Nokia N900 hardware keyboard ++mode "N900" { ++ # follow the standard sxmo keybinds as far as possible ++ bindsym t exec $term; mode "default" ++ bindsym q mode "default" ++ bindsym Shift+p exec sxmo_appmenu.sh sys; mode "default" ++ bindsym p exec sxmo_appmenu.sh; mode "default" ++ bindsym d exec $menu; mode "default" ++ bindsym Shift+q kill; mode "default" ++ bindsym i exec sxmo_wmmenu.sh windowswitcher; mode "default" ++ bindsym Shift+c reload; mode "default" ++ bindsym f fullscreen; mode "default" ++ bindsym Shift+space floating toggle; mode "default" ++ bindsym a focus parent; mode "default" + } + + ### Key bindings + # + # Basics: + # ++ input * xkb_options compose:ralt ++ ++ # Nokia N900 hardware keyboard ++ input "1:1:TWL4030_Keypad" { ++ xkb_model "nokiarx51" ++ xkb_layout "us" ++ # ralt has special meaning on N900 keyboard so do not use as ++ # compose key ++ xkb_options compose:rwin ++ } + + # Start a terminal + bindsym $mod+Return exec $term +@@ -58,13 +92,13 @@ + # Despite the name, also works for non-floating windows. + # Change normal to inverse to use left mouse button for resizing and right + # mouse button for dragging. +- floating_modifier $mod ++ floating_modifier $mod normal + + # Reload the configuration file + bindsym $mod+Shift+c reload + +- # Exit i3 (logs you out of your i3 session) +- bindsym $mod+Shift+e exec i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your i3 session.' -b 'Yes, exit i3' 'i3-msg exit' ++ # Exit sway (logs you out of your Wayland session) ++ bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'sxmo_power.sh logout' + # + # Moving around: + # +@@ -157,7 +191,7 @@ + # + # Scratchpad: + # +- # i3 has a "scratchpad", which is a bag of holding for windows. ++ # Sway has a "scratchpad", which is a bag of holding for windows. + # You can send windows there and get them back later. + + # Move the currently focused window to the scratchpad +@@ -194,48 +228,68 @@ + # + # Status Bar: + # +-# Read `man 5 i3bar` for more information about this section. ++# Read `man 5 sway-bar` for more information about this section. + bar { + position top ++ height 24 ++ font "Sxmo 13" + +- # When the status_command prints a new line to stdout, i3bar updates. ++ # When the status_command prints a new line to stdout, swaybar updates. + # The default just shows the current date and time. +- status_command sxmo_status_watch.sh -o plain +- font pango:Sxmo 11 ++ status_command sxmo_status_watch.sh -o pango + +- padding 0 20px 8px 8px ++ pango_markup enabled + + colors { + statusline #ffffff + background #323232 + inactive_workspace #323232 #323232 #ffffff +- ++ font "Sxmo 13" + } + } + +-for_window [class="pinentry-.*"] floating enable +-for_window [class="st" title=".*sxmo/modem/.*/draft.txt.*"] resize set height 25 +-for_window [class="megapixels"] inhibit_idle open +-for_window [class="ep[yr].*"] inhibit_idle visible +-for_window [class="tabbed"] border pixel 0 +-no_focus [class="svkbd"] +- +-smart_gaps on ++for_window [app_id="pinentry-.*"] floating true ++for_window [app_id="foot" title=".*sxmo/modem/.*/draft.txt.*"] resize set height 25 ++for_window [title="megapixels"] inhibit_idle open ++for_window [title="ep[yr].*"] inhibit_idle visible ++ ++default_border pixel 2 ++titlebar_border_thickness 2 ++hide_edge_borders smart + + # Need playerctl installed and running +-bindsym XF86AudioPlay exec playerctl play-pause +-bindsym XF86AudioPause exec playerctl play-pause +-bindsym XF86AudioStop exec playerctl stop +-bindsym XF86AudioNext exec playerctl next +-bindsym XF86AudioPrev exec playerctl previous +- +-bindsym XF86MonBrightnessUp exec sxmo_brightness.sh up +-bindsym XF86MonBrightnessDown exec sxmo_brightness.sh down ++bindsym --locked XF86AudioPlay exec playerctl play-pause ++bindsym --locked XF86AudioPause exec playerctl play-pause ++bindsym --locked XF86AudioStop exec playerctl stop ++bindsym --locked XF86AudioNext exec playerctl next ++bindsym --locked XF86AudioPrev exec playerctl previous ++ ++bindsym --locked XF86MonBrightnessUp exec sxmo_brightness.sh up ++bindsym --locked XF86MonBrightnessDown exec sxmo_brightness.sh down ++ ++# Nokia N900-specific key bindings: ++# 1. Bind lock key (XF86ScreenSaver) ++# Use keycode due to https://github.com/swaywm/sway/issues/8438 ++bindcode --release --locked --input-device="1:1:gpio_keys" 160 exec sxmo_state.sh set unlock ++# 2. Workaround the lack of a free ModX key on hardware keyboard ++bindsym --input-device="1:1:TWL4030_Keypad" Shift+space mode "N900" + + bindsym Print exec sxmo_screenshot.sh + + bindsym button2 kill + +-exec i3 --get-socketpath > "$XDG_RUNTIME_DIR"/sxmo.i3sock ++bindswitch --locked lid:on exec sh -c "brightnessctl -d white:kbd_backlight set 0; sxmo_state.sh set screenoff" ++bindswitch --locked lid:off exec sh -c "brightnessctl -d white:kbd_backlight set 255; sxmo_state.sh set unlock; sxmo_wm.sh display on" ++ ++# Nokia 8110 4G hardware keypad bindings (User:Ybon) ++bindsym --locked --no-repeat XF86KbdLcdMenu1 exec sxmo_hook_inputhandler.sh menuleft_one ++bindsym --locked --no-repeat XF86KbdLcdMenu2 exec sxmo_hook_inputhandler.sh menuright_one ++bindsym --locked --no-repeat XF86PickupPhone exec sxmo_hook_inputhandler.sh enter_one ++ ++include /etc/sway/config.d/* ++ ++exec 'printf %s "$SWAYSOCK" > "$XDG_RUNTIME_DIR"/sxmo.swaysock' ++ ++exec sxmo_hook_start.sh + +-# vim: ft=i3config ++# vim: ft=swayconfig diff --git a/prebuilt/bantam/bantam b/prebuilt/bantam/bantam new file mode 100755 index 0000000..161396b Binary files /dev/null and b/prebuilt/bantam/bantam differ diff --git a/prebuilt/fcitx5-t9/usr/lib/fcitx5/libt9.so b/prebuilt/fcitx5-t9/usr/lib/fcitx5/libt9.so new file mode 100755 index 0000000..ef7c52f Binary files /dev/null and b/prebuilt/fcitx5-t9/usr/lib/fcitx5/libt9.so differ diff --git a/prebuilt/fcitx5-t9/usr/lib/fcitx5/t9.so b/prebuilt/fcitx5-t9/usr/lib/fcitx5/t9.so new file mode 100755 index 0000000..ef7c52f Binary files /dev/null and b/prebuilt/fcitx5-t9/usr/lib/fcitx5/t9.so differ diff --git a/prebuilt/fcitx5-t9/usr/share/fcitx5/addon/t9.conf b/prebuilt/fcitx5-t9/usr/share/fcitx5/addon/t9.conf new file mode 100644 index 0000000..fc4092a --- /dev/null +++ b/prebuilt/fcitx5-t9/usr/share/fcitx5/addon/t9.conf @@ -0,0 +1,12 @@ +[Addon] +Name=t9 +Category=InputMethod +Enabled=True +Library=t9 +Type=SharedLibrary +OnDemand=False +RegisterInputMethod=True +Configurable=False + +[Addon/Dependencies] +0=core diff --git a/prebuilt/fcitx5-t9/usr/share/fcitx5/inputmethod/t9.conf b/prebuilt/fcitx5-t9/usr/share/fcitx5/inputmethod/t9.conf new file mode 100644 index 0000000..b1f0e4a --- /dev/null +++ b/prebuilt/fcitx5-t9/usr/share/fcitx5/inputmethod/t9.conf @@ -0,0 +1,7 @@ +[InputMethod] +Name=T9 +Icon=input-keyboard +Label=T9 +LangCode=en +Addon=t9 +Configurable=False diff --git a/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8905-nokia-argon.dtb b/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8905-nokia-argon.dtb new file mode 100644 index 0000000..3927f65 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8905-nokia-argon.dtb differ diff --git a/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8905-nokia-beatles.dtb b/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8905-nokia-beatles.dtb new file mode 100644 index 0000000..beda68e Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8905-nokia-beatles.dtb differ diff --git a/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8905-nokia-coconut.dtb b/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8905-nokia-coconut.dtb new file mode 100644 index 0000000..7b4e2c2 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8905-nokia-coconut.dtb differ diff --git a/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8909-nokia-leo.dtb b/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8909-nokia-leo.dtb new file mode 100644 index 0000000..1578220 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8909-nokia-leo.dtb differ diff --git a/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8909-nokia-sparkler.dtb b/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8909-nokia-sparkler.dtb new file mode 100644 index 0000000..e2a7291 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8909-nokia-sparkler.dtb differ diff --git a/prebuilt/kernel-6.12.1-msm8916/leds/leds-msm8905-torch.ko b/prebuilt/kernel-6.12.1-msm8916/leds/leds-msm8905-torch.ko new file mode 100644 index 0000000..4a9058f Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/leds/leds-msm8905-torch.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6adm.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6adm.ko new file mode 100644 index 0000000..cfc027b Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6adm.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6adm.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6adm.ko.zst new file mode 100644 index 0000000..0e12c99 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6adm.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe-clocks.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe-clocks.ko new file mode 100644 index 0000000..c132516 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe-clocks.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe-clocks.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe-clocks.ko.zst new file mode 100644 index 0000000..7dd3afd Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe-clocks.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe-dai.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe-dai.ko new file mode 100644 index 0000000..51e9dc9 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe-dai.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe-dai.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe-dai.ko.zst new file mode 100644 index 0000000..87a9bc6 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe-dai.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe.ko new file mode 100644 index 0000000..52e5460 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe.ko.zst new file mode 100644 index 0000000..07e8b8c Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6afe.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6apm-dai.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6apm-dai.ko new file mode 100644 index 0000000..ed2b688 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6apm-dai.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6apm-dai.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6apm-dai.ko.zst new file mode 100644 index 0000000..4d43162 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6apm-dai.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6apm-lpass-dais.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6apm-lpass-dais.ko new file mode 100644 index 0000000..940c554 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6apm-lpass-dais.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6apm-lpass-dais.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6apm-lpass-dais.ko.zst new file mode 100644 index 0000000..71d0e1b Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6apm-lpass-dais.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6asm-dai.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6asm-dai.ko new file mode 100644 index 0000000..d834c96 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6asm-dai.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6asm-dai.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6asm-dai.ko.zst new file mode 100644 index 0000000..80ce3ca Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6asm-dai.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6asm.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6asm.ko new file mode 100644 index 0000000..fa6c877 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6asm.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6asm.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6asm.ko.zst new file mode 100644 index 0000000..91e2e64 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6asm.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6core.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6core.ko new file mode 100644 index 0000000..06985db Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6core.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6core.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6core.ko.zst new file mode 100644 index 0000000..5cf5b8e Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6core.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6cvp.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6cvp.ko new file mode 100644 index 0000000..079c44a Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6cvp.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6cvp.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6cvp.ko.zst new file mode 100644 index 0000000..b3f7c85 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6cvp.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6cvs.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6cvs.ko new file mode 100644 index 0000000..762edf8 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6cvs.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6cvs.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6cvs.ko.zst new file mode 100644 index 0000000..7f83c51 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6cvs.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6mvm.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6mvm.ko new file mode 100644 index 0000000..e756b23 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6mvm.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6mvm.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6mvm.ko.zst new file mode 100644 index 0000000..66eeef6 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6mvm.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6prm-clocks.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6prm-clocks.ko new file mode 100644 index 0000000..e85c87a Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6prm-clocks.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6prm-clocks.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6prm-clocks.ko.zst new file mode 100644 index 0000000..c04685e Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6prm-clocks.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6prm.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6prm.ko new file mode 100644 index 0000000..7226a6c Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6prm.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6prm.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6prm.ko.zst new file mode 100644 index 0000000..7fc5a5d Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6prm.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6routing.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6routing.ko new file mode 100644 index 0000000..e387311 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6routing.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6routing.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6routing.ko.zst new file mode 100644 index 0000000..157746c Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6routing.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice-common.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice-common.ko new file mode 100644 index 0000000..67f26b2 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice-common.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice-common.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice-common.ko.zst new file mode 100644 index 0000000..4a7d3c6 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice-common.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice-dai.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice-dai.ko new file mode 100644 index 0000000..7264518 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice-dai.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice-dai.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice-dai.ko.zst new file mode 100644 index 0000000..ed68b39 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice-dai.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice.ko new file mode 100644 index 0000000..023495b Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice.ko.zst new file mode 100644 index 0000000..bc3e874 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/q6voice.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/snd-q6apm.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/snd-q6apm.ko new file mode 100644 index 0000000..d4b9390 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/snd-q6apm.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/snd-q6apm.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/snd-q6apm.ko.zst new file mode 100644 index 0000000..2070f2b Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/snd-q6apm.ko.zst differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/snd-q6dsp-common.ko b/prebuilt/kernel-6.12.1-msm8916/qdsp6/snd-q6dsp-common.ko new file mode 100644 index 0000000..ab425e5 Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/snd-q6dsp-common.ko differ diff --git a/prebuilt/kernel-6.12.1-msm8916/qdsp6/snd-q6dsp-common.ko.zst b/prebuilt/kernel-6.12.1-msm8916/qdsp6/snd-q6dsp-common.ko.zst new file mode 100644 index 0000000..0b4938e Binary files /dev/null and b/prebuilt/kernel-6.12.1-msm8916/qdsp6/snd-q6dsp-common.ko.zst differ diff --git a/rebuild-image.sh b/rebuild-image.sh new file mode 100755 index 0000000..e0e91e2 --- /dev/null +++ b/rebuild-image.sh @@ -0,0 +1,272 @@ +#!/bin/sh +# Bananarchy Linux (MSM8909 / Sxmo) Image Builder +# Supports: nokia-argon (8110 4G), nokia-beatles (2720 Flip), +# nokia-tough (800 Tough), nokia-sparkler (8000 4G), nokia-leo (6300 4G) +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 + +mkdir -p "${IMAGES_DIR:-$SCRIPT_DIR/images}" +IMAGES_HOST="$(realpath "${IMAGES_DIR:-$SCRIPT_DIR/images}")" +BANANARCHY_DIR="$SCRIPT_DIR" + +TARGET_DEVICE="nokia-argon" +RUN_MKINITFS="" + +for arg in "$@"; do + case "$arg" in + --mkinitfs) + RUN_MKINITFS="--mkinitfs" + ;; + sxmo|all|nokia-argon|argon) + TARGET_DEVICE="nokia-argon" + ;; + nokia-beatles|beatles) + TARGET_DEVICE="nokia-beatles" + ;; + nokia-tough|nokia-coconut|tough|coconut) + TARGET_DEVICE="nokia-tough" + ;; + nokia-sparkler|sparkler) + TARGET_DEVICE="nokia-sparkler" + ;; + nokia-leo|leo) + TARGET_DEVICE="nokia-leo" + ;; + *) + echo "Usage: $0 [nokia-argon|nokia-beatles|nokia-tough|nokia-sparkler|nokia-leo] [--mkinitfs]" >&2 + exit 1 + ;; + esac +done + +mkdir -p "$IMAGES_HOST" + +if [ -x "$BANANARCHY_DIR/scripts/apply-bananarchy-overlay.sh" ]; then + "$BANANARCHY_DIR/scripts/apply-bananarchy-overlay.sh" "$ROOTFS_HOST" "$TARGET_DEVICE" +fi + +exec docker run --rm --network=host \ + -e HOST_UID="$(id -u)" \ + -e HOST_GID="$(id -g)" \ + -e TARGET_DEVICE="$TARGET_DEVICE" \ + -e RUN_MKINITFS="$RUN_MKINITFS" \ + -v "$ROOTFS_HOST:/rootfs" \ + -v "$IMAGES_HOST:/images" \ + -v "$BANANARCHY_DIR:/bananarchy:ro" \ + alpine:3.24 sh -eu -c ' + cat > /etc/apk/repositories </dev/null + + ROOTFS="/rootfs" + BOOT_UUID="a1b2c3d4-8110-4000-8000-000000000001" + ROOT_UUID="a1b2c3d4-8110-4000-8000-000000000002" + + echo "============================================================" + echo "Building Bananarchy Linux (Sxmo 240x320) for: $TARGET_DEVICE" + echo "Source rootfs: $ROOTFS" + echo "============================================================" + + echo "[1/5] Normalizing rootfs permissions and UIDs/GIDs..." + chown -R 0:0 "$ROOTFS" + chmod 700 "$ROOTFS/root" 2>/dev/null || true + chmod 1777 "$ROOTFS/tmp" "$ROOTFS/var/tmp" 2>/dev/null || true + chmod 555 "$ROOTFS/var/empty" 2>/dev/null || true + chmod 750 "$ROOTFS/etc/doas.d" "$ROOTFS/etc/polkit-1/rules.d" 2>/dev/null || true + if [ -e "$ROOTFS/etc/shadow" ]; then + chown 0:42 "$ROOTFS/etc/shadow" + chmod 640 "$ROOTFS/etc/shadow" + fi + if [ -e "$ROOTFS/etc/shadow-" ]; then + chown 0:42 "$ROOTFS/etc/shadow-" + chmod 640 "$ROOTFS/etc/shadow-" + fi + rm -f "$ROOTFS/etc/doas.d/wheel.conf" + if [ -e "$ROOTFS/etc/doas.d/50-sxmo.conf" ]; then + chmod 600 "$ROOTFS/etc/doas.d/50-sxmo.conf" + fi + if [ -e "$ROOTFS/etc/sudoers.d/wheel" ]; then + chmod 440 "$ROOTFS/etc/sudoers.d/wheel" + fi + MB_GID="$(awk -F: "/^messagebus:/ {print \$3}" "$ROOTFS/etc/group" 2>/dev/null || true)" + MB_GID="${MB_GID:-103}" + if [ -e "$ROOTFS/usr/libexec/dbus-daemon-launch-helper" ]; then + chown "0:$MB_GID" "$ROOTFS/usr/libexec/dbus-daemon-launch-helper" + chmod 4750 "$ROOTFS/usr/libexec/dbus-daemon-launch-helper" + fi + PK_UID="$(awk -F: "/^polkitd:/ {print \$3}" "$ROOTFS/etc/passwd" 2>/dev/null || true)" + PK_GID="$(awk -F: "/^polkitd:/ {print \$3}" "$ROOTFS/etc/group" 2>/dev/null || true)" + if [ -n "$PK_UID" ] && [ -n "$PK_GID" ] && [ -d "$ROOTFS/etc/polkit-1/rules.d" ]; then + chown "$PK_UID:$PK_GID" "$ROOTFS/etc/polkit-1/rules.d" + chmod 750 "$ROOTFS/etc/polkit-1/rules.d" + fi + if [ -e "$ROOTFS/usr/sbin/unix_chkpwd" ]; then + chown 0:42 "$ROOTFS/usr/sbin/unix_chkpwd" + chmod 2755 "$ROOTFS/usr/sbin/unix_chkpwd" + fi + if [ -e "$ROOTFS/usr/bin/wall" ]; then + chown 0:5 "$ROOTFS/usr/bin/wall" + chmod 2755 "$ROOTFS/usr/bin/wall" + fi + for suid_bin in \ + "$ROOTFS/bin/su" \ + "$ROOTFS/bin/mount" \ + "$ROOTFS/bin/umount" \ + "$ROOTFS/usr/bin/doas" \ + "$ROOTFS/usr/bin/sudo" \ + "$ROOTFS/usr/bin/pkexec" \ + "$ROOTFS/usr/lib/polkit-1/polkit-agent-helper-1" \ + "$ROOTFS/usr/bin/fusermount3" \ + "$ROOTFS/usr/bin/passwd" \ + "$ROOTFS/usr/bin/gpasswd" \ + "$ROOTFS/usr/bin/chsh" \ + "$ROOTFS/usr/bin/chfn" \ + "$ROOTFS/usr/bin/chage" \ + "$ROOTFS/usr/bin/expiry"; do + if [ -e "$suid_bin" ] && [ ! -L "$suid_bin" ]; then + chmod 4755 "$suid_bin" + fi + done + if [ -d "$ROOTFS/home/user" ]; then + chown -R 10000:10000 "$ROOTFS/home/user" + fi + + depmod -b "$ROOTFS" 6.12.1-msm8916 + + if [ "$RUN_MKINITFS" = "--mkinitfs" ] || [ ! -f "$ROOTFS/boot/boot.img" ]; then + echo "[2/5] Running depmod and mkinitfs inside $ROOTFS..." + rm -rf "$ROOTFS/tmp/hostbin" + mkdir -p "$ROOTFS/tmp/hostbin" + cp /bin/busybox.static "$ROOTFS/tmp/hostbin/busybox.static" + for app in $(/bin/busybox.static --list); do + ln -sf /tmp/hostbin/busybox.static "$ROOTFS/tmp/hostbin/$app" + done + for bin in \ + /sbin/depmod \ + /usr/sbin/mkinitfs \ + /usr/bin/boot-deploy \ + /usr/bin/generate-kernel-cmdline \ + /usr/bin/mkbootimg \ + /usr/bin/mkbootimg-osm0sis \ + /usr/bin/zstd; do + if [ -e "$bin" ]; then + cp -L "$bin" "$ROOTFS/tmp/hostbin/" + fi + done + rm -f "$ROOTFS/tmp/hostbin/df" + cat > "$ROOTFS/tmp/hostbin/df" </dev/null || true + cp -a /lib/libz.so* /usr/lib/libzstd.so* /usr/lib/liblzma.so* /lib/libcrypto.so* "$ROOTFS/tmp/hostbin/" 2>/dev/null || true + ln -sf /tmp/hostbin/busybox.static "$ROOTFS/bin/sh" + + chroot "$ROOTFS" /tmp/hostbin/busybox.static sh -e -c " + export PATH=/tmp/hostbin:/usr/sbin:/usr/bin:/sbin:/bin + export LD_LIBRARY_PATH=/tmp/hostbin:/lib:/usr/lib + /tmp/hostbin/mkinitfs + " + + ln -sf /bin/busybox "$ROOTFS/bin/sh" + rm -rf "$ROOTFS/tmp/hostbin" "$ROOTFS/lib/ld-musl-x86_64.so.1" "$ROOTFS/proc/1" + else + echo "[2/5] Using existing $ROOTFS/boot/boot.img (pass --mkinitfs to regenerate)..." + fi + + cp "$ROOTFS/boot/boot.img" "/images/boot-bananarchy-$TARGET_DEVICE.img" + if [ "$TARGET_DEVICE" = "nokia-argon" ]; then + cp "$ROOTFS/boot/boot.img" "/images/boot-nokia-argon-sxmo.img" + fi + + echo "[3/5] Creating ext2 boot (256 MiB) and ext4 root filesystems..." + BOOT_IMG="/tmp/boot.ext2" + ROOT_IMG="/tmp/root.ext4" + rm -f "$BOOT_IMG" "$ROOT_IMG" + + BOOT_MB=256 + truncate -s "${BOOT_MB}M" "$BOOT_IMG" + mke2fs -t ext2 -F -q -L "pmOS_boot" -U "$BOOT_UUID" -d "$ROOTFS/boot" "$BOOT_IMG" + + USED_KB="$(du -sk "$ROOTFS" | awk "{print \$1}")" + ROOT_MB=$(( (USED_KB / 1024) * 125 / 100 + 160 )) + + SAVED_BOOT="/tmp/saved-boot" + rm -rf "$SAVED_BOOT" + mv "$ROOTFS/boot" "$SAVED_BOOT" + mkdir -p "$ROOTFS/boot" + chown 0:0 "$ROOTFS/boot" + chmod 755 "$ROOTFS/boot" + + truncate -s "${ROOT_MB}M" "$ROOT_IMG" + mke2fs -t ext4 -O ^metadata_csum -F -q -L "pmOS_root" -i 8192 -U "$ROOT_UUID" -d "$ROOTFS" "$ROOT_IMG" + + rm -rf "$ROOTFS/boot" + mv "$SAVED_BOOT" "$ROOTFS/boot" + + echo "[4/5] Assembling partitioned MBR raw image and Android sparse image..." + RAW_IMG="/images/bananarchy-$TARGET_DEVICE.img" + SPARSE_IMG="/images/bananarchy-$TARGET_DEVICE.sparse.img" + TOTAL_MB=$(( 1 + BOOT_MB + ROOT_MB )) + rm -f "$RAW_IMG" "$SPARSE_IMG" + truncate -s "${TOTAL_MB}M" "$RAW_IMG" + + BOOT_SECTORS=$(( BOOT_MB * 2048 )) + ROOT_START_SECTOR=$(( 2048 + BOOT_SECTORS )) + + sfdisk --quiet "$RAW_IMG" <&2 + exit 1 +fi + +case "$DEVICE" in + nokia-argon|argon) + DEVICE="nokia-argon" + DTB_FILE="qcom-msm8905-nokia-argon.dtb" + ;; + nokia-beatles|beatles) + DEVICE="nokia-beatles" + DTB_FILE="qcom-msm8905-nokia-beatles.dtb" + ;; + nokia-tough|nokia-coconut|tough|coconut) + DEVICE="nokia-tough" + DTB_FILE="qcom-msm8905-nokia-coconut.dtb" + ;; + nokia-sparkler|sparkler) + DEVICE="nokia-sparkler" + DTB_FILE="qcom-msm8909-nokia-sparkler.dtb" + ;; + nokia-leo|leo) + DEVICE="nokia-sparkler" + DTB_FILE="qcom-msm8909-nokia-leo.dtb" + ;; + *) + echo "Error: Unsupported device '$DEVICE'." >&2 + echo "Supported devices: nokia-argon, nokia-beatles, nokia-tough, nokia-sparkler, nokia-leo" >&2 + exit 1 + ;; +esac + +echo "[1/4] Installing Bananarchy rootfs overlay (artwork, branding, Sxmo 240x320, UCM, udev)..." +rm -f "$TARGET_ROOTFS/usr/bin/bantam" "$TARGET_ROOTFS/usr/local/bin/bantam" "$TARGET_ROOTFS/etc/doas.d/wheel.conf" +cp -af "$BASE_DIR/overlay/rootfs/." "$TARGET_ROOTFS/" +chown 0:0 "$TARGET_ROOTFS/etc/doas.d/50-sxmo.conf" 2>/dev/null || true +chmod 600 "$TARGET_ROOTFS/etc/doas.d/50-sxmo.conf" 2>/dev/null || true + +echo "[2/4] Installing prebuilt QDSP6/Q6Voice kernel modules, torch LED module, and DTBs..." +if [ -d "$TARGET_ROOTFS/lib/modules/6.12.1-msm8916/kernel/sound/soc/qcom/qdsp6" ]; then + cp -af "$BASE_DIR/prebuilt/kernel-6.12.1-msm8916/qdsp6/"*.ko* \ + "$TARGET_ROOTFS/lib/modules/6.12.1-msm8916/kernel/sound/soc/qcom/qdsp6/" +fi +if [ -d "$BASE_DIR/prebuilt/kernel-6.12.1-msm8916/leds" ] && \ + [ -d "$TARGET_ROOTFS/lib/modules/6.12.1-msm8916/kernel/drivers/leds" ]; then + cp -af "$BASE_DIR/prebuilt/kernel-6.12.1-msm8916/leds/"*.ko* \ + "$TARGET_ROOTFS/lib/modules/6.12.1-msm8916/kernel/drivers/leds/" +fi +mkdir -p "$TARGET_ROOTFS/boot/dtbs" +cp -af "$BASE_DIR/prebuilt/kernel-6.12.1-msm8916/dtbs/"*.dtb "$TARGET_ROOTFS/boot/dtbs/" +cp -af "$BASE_DIR/prebuilt/kernel-6.12.1-msm8916/dtbs/$DTB_FILE" "$TARGET_ROOTFS/boot/$DTB_FILE" + +echo "[3/4] Installing prebuilt multi-mode fcitx5-t9 and Bantam AI agent..." +cp -af "$BASE_DIR/prebuilt/fcitx5-t9/usr/." "$TARGET_ROOTFS/usr/" +cp -af "$BASE_DIR/prebuilt/bantam/bantam" "$TARGET_ROOTFS/usr/bin/bantam" +cp -af "$BASE_DIR/prebuilt/bantam/bantam" "$TARGET_ROOTFS/usr/local/bin/bantam" +rm -f \ + "$TARGET_ROOTFS/home/user/.bantam.cfg" \ + "$TARGET_ROOTFS/etc/skel/.bantam.cfg" \ + "$TARGET_ROOTFS/root/.bantam.cfg" + +echo "[4/4] Installing deviceinfo for $DEVICE ($DTB_FILE)..." +if [ -f "$BASE_DIR/devices/$DEVICE/deviceinfo" ]; then + cp -a "$BASE_DIR/devices/$DEVICE/deviceinfo" "$TARGET_ROOTFS/etc/deviceinfo" +fi + +echo "Bananarchy overlay applied to $TARGET_ROOTFS for device $DEVICE." diff --git a/scripts/build-bantam.sh b/scripts/build-bantam.sh new file mode 100755 index 0000000..9c6ec1f --- /dev/null +++ b/scripts/build-bantam.sh @@ -0,0 +1,103 @@ +#!/bin/sh +# Fetch the latest master branch of Bantam AI agent from +# https://code.luxferre.top/luxferre/bantam-cpp and cross-compile for armv7 +set -eu + +BASE_DIR="$(cd "$(dirname "$0")/.." && pwd)" +BANTAM_REPO_URL="${BANTAM_REPO_URL:-https://code.luxferre.top/luxferre/bantam-cpp}" +BANTAM_BRANCH="${BANTAM_BRANCH:-master}" +ROOTFS_DIR="${ROOTFS_DIR:-$BASE_DIR/rootfs}" +if [ -e "$ROOTFS_DIR" ]; then + ROOTFS_DIR="$(realpath "$ROOTFS_DIR")" +fi + +exec docker run --rm --network=host \ + -e HOST_UID="$(id -u)" \ + -e HOST_GID="$(id -g)" \ + -e BANTAM_REPO_URL="$BANTAM_REPO_URL" \ + -e BANTAM_BRANCH="$BANTAM_BRANCH" \ + -v "$BASE_DIR:/bananarchy" \ + -v "$ROOTFS_DIR:/target-rootfs" \ + alpine:3.24 sh -eu -c ' + cat > /etc/apk/repositories </dev/null + + # Keep target-rootfs clean of -dev headers; use an ephemeral armv7 build sysroot + if [ -d /target-rootfs/etc/apk ]; then + apk --root /target-rootfs --arch armv7 del --no-scripts \ + curl-dev readline-dev ncurses-dev >/dev/null 2>&1 || true + fi + + echo "[1/4] Preparing ephemeral armv7 sysroot (musl-dev, curl-dev, readline-dev)..." + mkdir -p /tmp/armv7-sysroot/etc/apk/keys + cp /etc/apk/repositories /tmp/armv7-sysroot/etc/apk/repositories + cp /etc/apk/keys/* /tmp/armv7-sysroot/etc/apk/keys/ + apk --root /tmp/armv7-sysroot --initdb --arch armv7 add --no-scripts \ + alpine-baselayout \ + musl-dev \ + linux-headers \ + curl-dev \ + readline-dev \ + ncurses-dev >/dev/null + + echo "[2/4] Cloning latest $BANTAM_BRANCH from $BANTAM_REPO_URL..." + rm -rf /tmp/bantam-cpp + git clone --depth 1 --branch "$BANTAM_BRANCH" "$BANTAM_REPO_URL" /tmp/bantam-cpp + cd /tmp/bantam-cpp + echo " Commit: $(git rev-parse --short HEAD) ($(git log -1 --format=%s))" + + echo "[3/4] Cross-compiling Bantam AI agent for armv7..." + mkdir -p \ + /bananarchy/prebuilt/bantam \ + /bananarchy/overlay/rootfs/usr/bin \ + /bananarchy/overlay/rootfs/usr/local/bin + + armv7-alpine-linux-musleabihf-g++ \ + -std=c++20 -Wall -Wextra -Wpedantic -O2 \ + -D_POSIX_C_SOURCE=200809L -D_DEFAULT_SOURCE \ + -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_XOPEN_SOURCE=700 \ + --sysroot=/tmp/armv7-sysroot \ + -I. \ + -I/tmp/armv7-sysroot/usr/include \ + main.cpp config.cpp util.cpp json.cpp llm.cpp tools.cpp session.cpp render.cpp editor.cpp \ + -L/tmp/armv7-sysroot/usr/lib \ + -lcurl -lreadline -lncursesw \ + -o /bananarchy/prebuilt/bantam/bantam + + armv7-alpine-linux-musleabihf-strip --strip-unneeded /bananarchy/prebuilt/bantam/bantam + chmod 755 /bananarchy/prebuilt/bantam/bantam + + echo "[4/4] Installing Bantam into prebuilt/, overlay/rootfs/, and target rootfs..." + cp -a /bananarchy/prebuilt/bantam/bantam /bananarchy/overlay/rootfs/usr/bin/bantam + cp -a /bananarchy/prebuilt/bantam/bantam /bananarchy/overlay/rootfs/usr/local/bin/bantam + if [ -d /target-rootfs/usr/bin ]; then + cp -a /bananarchy/prebuilt/bantam/bantam /target-rootfs/usr/bin/bantam + cp -a /bananarchy/prebuilt/bantam/bantam /target-rootfs/usr/local/bin/bantam + fi + + # Ensure no default .bantam.cfg is included anywhere + rm -f \ + /bananarchy/overlay/rootfs/home/user/.bantam.cfg \ + /bananarchy/overlay/rootfs/etc/skel/.bantam.cfg \ + /bananarchy/overlay/rootfs/root/.bantam.cfg \ + /target-rootfs/home/user/.bantam.cfg \ + /target-rootfs/etc/skel/.bantam.cfg \ + /target-rootfs/root/.bantam.cfg + + chown "$HOST_UID:$HOST_GID" /target-rootfs/usr/bin/bantam /target-rootfs/usr/local/bin/bantam 2>/dev/null || true + chown -R "$HOST_UID:$HOST_GID" /bananarchy/prebuilt/bantam /bananarchy/overlay/rootfs/usr + ls -lh /bananarchy/prebuilt/bantam/bantam +' diff --git a/scripts/build-fcitx5-t9.sh b/scripts/build-fcitx5-t9.sh new file mode 100755 index 0000000..97501f9 --- /dev/null +++ b/scripts/build-fcitx5-t9.sh @@ -0,0 +1,76 @@ +#!/bin/sh +# Cross-compile Bananarchy multi-mode fcitx5-t9 engine (abc/Abc/ABC/Sym/Ctl/123) for armv7 +set -eu + +BASE_DIR="$(cd "$(dirname "$0")/.." && pwd)" +ROOTFS_DIR="${ROOTFS_DIR:-$BASE_DIR/rootfs}" +if [ -e "$ROOTFS_DIR" ]; then + ROOTFS_DIR="$(realpath "$ROOTFS_DIR")" +fi + +exec docker run --rm --network=host \ + -e HOST_UID="$(id -u)" \ + -e HOST_GID="$(id -g)" \ + -v "$BASE_DIR:/bananarchy" \ + -v "$ROOTFS_DIR:/target-rootfs" \ + alpine:3.24 sh -eu -c ' + cat > /etc/apk/repositories </dev/null + + echo "[1/3] Preparing ephemeral armv7 sysroot (musl-dev, fcitx5-dev)..." + mkdir -p /tmp/armv7-sysroot/etc/apk/keys + cp /etc/apk/repositories /tmp/armv7-sysroot/etc/apk/repositories + cp /etc/apk/keys/* /tmp/armv7-sysroot/etc/apk/keys/ + apk --root /tmp/armv7-sysroot --initdb --arch armv7 add --no-scripts \ + alpine-baselayout \ + musl-dev \ + linux-headers \ + fcitx5-dev >/dev/null + + echo "[2/3] Compiling Bananarchy multi-mode fcitx5-t9 engine for armv7..." + mkdir -p \ + /bananarchy/prebuilt/fcitx5-t9/usr/lib/fcitx5 \ + /bananarchy/prebuilt/fcitx5-t9/usr/share/fcitx5/addon \ + /bananarchy/prebuilt/fcitx5-t9/usr/share/fcitx5/inputmethod + + armv7-alpine-linux-musleabihf-g++ \ + -shared -fPIC -O2 -std=c++20 \ + --sysroot=/tmp/armv7-sysroot \ + -I/tmp/armv7-sysroot/usr/include/Fcitx5/Core \ + -I/tmp/armv7-sysroot/usr/include/Fcitx5/Config \ + -I/tmp/armv7-sysroot/usr/include/Fcitx5/Utils \ + -I/bananarchy/src/fcitx5-t9/src \ + /bananarchy/src/fcitx5-t9/src/t9.cpp \ + -L/tmp/armv7-sysroot/usr/lib \ + -lFcitx5Core -lFcitx5Config -lFcitx5Utils \ + -o /bananarchy/prebuilt/fcitx5-t9/usr/lib/fcitx5/libt9.so + + armv7-alpine-linux-musleabihf-strip --strip-unneeded \ + /bananarchy/prebuilt/fcitx5-t9/usr/lib/fcitx5/libt9.so + cp -f /bananarchy/prebuilt/fcitx5-t9/usr/lib/fcitx5/libt9.so \ + /bananarchy/prebuilt/fcitx5-t9/usr/lib/fcitx5/t9.so + + cp /bananarchy/src/fcitx5-t9/src/t9-addon.conf \ + /bananarchy/prebuilt/fcitx5-t9/usr/share/fcitx5/addon/t9.conf + cp /bananarchy/src/fcitx5-t9/src/t9-inputmethod.conf \ + /bananarchy/prebuilt/fcitx5-t9/usr/share/fcitx5/inputmethod/t9.conf + + echo "[3/3] Updating overlay/rootfs and target rootfs with compiled fcitx5-t9..." + cp -a /bananarchy/prebuilt/fcitx5-t9/usr/. /bananarchy/overlay/rootfs/usr/ + if [ -d /target-rootfs/usr/lib/fcitx5 ]; then + cp -a /bananarchy/prebuilt/fcitx5-t9/usr/. /target-rootfs/usr/ + fi + chown -R "$HOST_UID:$HOST_GID" /bananarchy/prebuilt/fcitx5-t9 /bananarchy/overlay/rootfs/usr + ls -lh /bananarchy/prebuilt/fcitx5-t9/usr/lib/fcitx5/libt9.so +' diff --git a/scripts/build-kernel-audio.sh b/scripts/build-kernel-audio.sh new file mode 100755 index 0000000..6944fc6 --- /dev/null +++ b/scripts/build-kernel-audio.sh @@ -0,0 +1,97 @@ +#!/bin/sh +# Cross-compile Linux 6.12.1-msm8916 QDSP6/Q6Voice audio modules and MSM8905/MSM8909 DTBs +set -eu + +BASE_DIR="$(cd "$(dirname "$0")/.." && pwd)" +ROOTFS_DIR="${ROOTFS_DIR:-$BASE_DIR/rootfs}" +if [ -e "$ROOTFS_DIR" ]; then + ROOTFS_DIR="$(realpath "$ROOTFS_DIR")" +fi +KERNEL_TAG="v6.12.1-msm8916" +KERNEL_URL="https://github.com/msm8916-mainline/linux/archive/refs/tags/${KERNEL_TAG}.tar.gz" + +exec docker run --rm --network=host \ + -e HOST_UID="$(id -u)" \ + -e HOST_GID="$(id -g)" \ + -e KERNEL_TAG="$KERNEL_TAG" \ + -e KERNEL_URL="$KERNEL_URL" \ + -v "$BASE_DIR:/bananarchy" \ + -v "$ROOTFS_DIR:/target-rootfs:ro" \ + alpine:3.24 sh -eu -c ' + cat > /etc/apk/repositories </dev/null + dtc -I dts -O dtb -o /bananarchy/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8905-nokia-coconut.dtb \ + /bananarchy/devices/nokia-tough/qcom-msm8905-nokia-coconut.dts 2>/dev/null + + chown -R "$HOST_UID:$HOST_GID" /bananarchy/prebuilt/kernel-6.12.1-msm8916 /bananarchy/src/leds-msm8905-torch + echo "Kernel audio modules, torch LED module, and DTBs built successfully." +' diff --git a/scripts/configure-rootfs-from-scratch.sh b/scripts/configure-rootfs-from-scratch.sh new file mode 100755 index 0000000..78ff0a8 --- /dev/null +++ b/scripts/configure-rootfs-from-scratch.sh @@ -0,0 +1,704 @@ +#!/bin/sh +set -eu + +BANANARCHY_DIR="${BANANARCHY_DIR:-/bananarchy}" +WORK="${WORK:-/work}" + +echo "[1/4] Installing lightweight host helper tools in container..." +cat > /etc/apk/repositories < Ensuring fcitx5-gtk3 and Bananarchy development/scripting packages are installed in $ROOTFS..." + apk --root "$ROOTFS" --arch armv7 add --no-scripts \ + fcitx5-gtk3 \ + git \ + gcc \ + g++ \ + musl-dev \ + make \ + nano \ + janet \ + janet-dev \ + jpm \ + perl \ + perl-io-socket-ssl \ + tcl \ + tcl-lib \ + tcl-tls \ + sqlite \ + sqlite-tcl + + echo " -> Installing busybox and busybox-extras symlinks..." + for applet in $(/bin/busybox --list-full); do + target="$ROOTFS/$applet" + mkdir -p "$(dirname "$target")" + if [ ! -e "$target" ] && [ ! -L "$target" ]; then + ln -s /bin/busybox "$target" + fi + done + if [ -x /bin/busybox-extras ]; then + for applet in $(/bin/busybox-extras --list-full); do + target="$ROOTFS/$applet" + mkdir -p "$(dirname "$target")" + if [ ! -e "$target" ] && [ ! -L "$target" ]; then + ln -s /bin/busybox-extras "$target" + fi + done + fi + if [ -e "$ROOTFS/sbin/losetup" ] && [ ! -e "$ROOTFS/usr/sbin/losetup" ]; then + ln -sf /sbin/losetup "$ROOTFS/usr/sbin/losetup" + fi + + echo " -> Setting up temporary x86_64 hostbin for chroot execution..." + rm -rf "$ROOTFS/tmp/hostbin" + mkdir -p "$ROOTFS/tmp/hostbin" + cp /bin/busybox.static "$ROOTFS/tmp/hostbin/busybox.static" + for app in $(/bin/busybox.static --list); do + ln -sf /tmp/hostbin/busybox.static "$ROOTFS/tmp/hostbin/$app" + done + for bin in \ + /sbin/depmod \ + /usr/sbin/mkinitfs \ + /usr/bin/boot-deploy \ + /usr/bin/generate-kernel-cmdline \ + /usr/bin/mkbootimg \ + /usr/bin/mkbootimg-osm0sis \ + /usr/bin/zstd; do + if [ -e "$bin" ]; then + cp -L "$bin" "$ROOTFS/tmp/hostbin/" + fi + done + rm -f "$ROOTFS/tmp/hostbin/df" + cat > "$ROOTFS/tmp/hostbin/df" <<'EOF' +#!/tmp/hostbin/sh +printf "Filesystem 1024-blocks Used Available Capacity Mounted on\n/dev/root 52428800 5242880 47185920 10%% /\n" +EOF + chmod +x "$ROOTFS/tmp/hostbin/df" + mkdir -p "$ROOTFS/proc/1/root" + cp /lib/ld-musl-x86_64.so.1 "$ROOTFS/lib/" + cp -a /usr/lib/libgcc_s.so* "$ROOTFS/tmp/hostbin/" 2>/dev/null || true + cp -a /lib/libz.so* /usr/lib/libzstd.so* /usr/lib/liblzma.so* /lib/libcrypto.so* "$ROOTFS/tmp/hostbin/" 2>/dev/null || true + + ln -sf /tmp/hostbin/busybox.static "$ROOTFS/bin/sh" + + echo " -> Creating system groups, users, and default user (UID 10000)..." + chroot "$ROOTFS" /tmp/hostbin/busybox.static sh -e -c ' + export PATH="/tmp/hostbin:/usr/sbin:/usr/bin:/sbin:/bin" + export LD_LIBRARY_PATH="/tmp/hostbin:/lib:/usr/lib" + + addgroup -S -g 42 shadow 2>/dev/null || true + chown root:shadow /etc/shadow + [ -e /etc/shadow- ] && chown root:shadow /etc/shadow- + + addgroup -S -g 86 avahi 2>/dev/null || true + adduser -S -u 86 -D -H -h /dev/null -s /sbin/nologin -G avahi -g "Avahi System User" avahi 2>/dev/null || true + + addgroup -S klogd 2>/dev/null || true + adduser -S -D -H -h /dev/null -s /sbin/nologin -G klogd -g klogd klogd 2>/dev/null || true + + addgroup -S chrony 2>/dev/null || true + adduser -S -D -H -h /dev/null -s /sbin/nologin -G chrony -g chrony chrony 2>/dev/null || true + + addgroup -S messagebus 2>/dev/null || true + adduser -S -D -H -h /dev/null -s /sbin/nologin -G messagebus -g messagebus messagebus 2>/dev/null || true + + addgroup -S dnsmasq 2>/dev/null || true + adduser -S -D -H -h /dev/null -s /sbin/nologin -G dnsmasq -g dnsmasq dnsmasq 2>/dev/null || true + + addgroup -S geoclue 2>/dev/null || true + adduser -S -D -h /var/lib/geoclue -s /sbin/nologin -G geoclue geoclue 2>/dev/null || true + + addgroup -S plugdev 2>/dev/null || true + addgroup -S pipewire 2>/dev/null || true + addgroup -S seat 2>/dev/null || true + addgroup -S feedbackd 2>/dev/null || true + + addgroup -S polkitd 2>/dev/null || true + adduser -S -D -H -h /var/empty -s /sbin/nologin -G polkitd -g polkitd polkitd 2>/dev/null || true + + addgroup -S colord 2>/dev/null || true + adduser -S -D -H -h /var/lib/colord -s /sbin/nologin -G colord -g colord colord 2>/dev/null || true + + addgroup -S greetd 2>/dev/null || true + adduser -S -D -H -h /var/lib/greetd -s /sbin/nologin -G greetd -g greetd greetd 2>/dev/null || true + addgroup greetd video 2>/dev/null || true + + if ! grep -q "^user:" /etc/passwd 2>/dev/null; then + adduser -D -u 10000 -s /bin/ash user 2>/dev/null || true + fi + + for grp in audio input netdev plugdev video wheel seat feedbackd dialout tty pipewire; do + addgroup -S "$grp" 2>/dev/null || true + addgroup user "$grp" 2>/dev/null || true + done + + echo "user:147147" | chpasswd + passwd -l root >/dev/null 2>&1 || true + ' + + echo " -> Configuring sudo/doas, hostname, locale, timezone, inittab, and sysctl..." + mkdir -p "$ROOTFS/etc/doas.d" "$ROOTFS/etc/sudoers.d" + rm -f "$ROOTFS/etc/doas.d/wheel.conf" + + cat > "$ROOTFS/etc/sudoers.d/wheel" < "$ROOTFS/etc/hostname" + cat > "$ROOTFS/etc/hosts" < "$ROOTFS/etc/locale.conf" + if [ -f "$ROOTFS/usr/share/zoneinfo/UTC" ]; then + cp "$ROOTFS/usr/share/zoneinfo/UTC" "$ROOTFS/etc/localtime" + echo "UTC" > "$ROOTFS/etc/timezone" + fi + + touch "$ROOTFS/etc/apk/interactive" + mkdir -p "$ROOTFS/run/openrc" + touch "$ROOTFS/run/openrc/shutdowntime" + dbus-uuidgen --ensure="$ROOTFS/etc/machine-id" + + if grep -q "^#ttyS0::respawn:/sbin/getty" "$ROOTFS/etc/inittab"; then + sed -i 's|^#ttyS0::respawn:/sbin/getty.*|ttyMSM0::respawn:/sbin/getty -L 115200 ttyMSM0 vt100|' "$ROOTFS/etc/inittab" + fi + + if ! grep -qx "panel_mipi_dbi" "$ROOTFS/etc/modules" 2>/dev/null; then + echo "panel_mipi_dbi" >> "$ROOTFS/etc/modules" + fi + + mkdir -p "$ROOTFS/etc/udev/rules.d" + cat > "$ROOTFS/etc/udev/rules.d/90-nokia-argon-leds.rules" < "$ROOTFS/etc/sysctl.d/90-nokia-argon-lowram.conf" < Installing patched audio DTB, 20 QDSP6 kernel modules, UCM, and WirePlumber S16LE rules..." + cp "$BANANARCHY_DIR/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8905-nokia-argon.dtb" \ + "$ROOTFS/boot/dtbs/qcom-msm8905-nokia-argon.dtb" + cp "$BANANARCHY_DIR/prebuilt/kernel-6.12.1-msm8916/qdsp6/"*.ko* \ + "$ROOTFS/lib/modules/6.12.1-msm8916/kernel/sound/soc/qcom/qdsp6/" + depmod -b "$ROOTFS" 6.12.1-msm8916 + + sed -i 's/"CS-Voice"/"VoiceMMode1"/g' \ + "$ROOTFS/usr/share/alsa/ucm2/platforms/msm8916/qdsp6.conf" + + mkdir -p \ + "$ROOTFS/usr/share/wireplumber/wireplumber.conf.d" \ + "$ROOTFS/etc/wireplumber/wireplumber.conf.d" \ + "$ROOTFS/etc/skel/.config/wireplumber/wireplumber.conf.d" \ + "$ROOTFS/home/user/.config/wireplumber/wireplumber.conf.d" + + cat > "$ROOTFS/usr/share/wireplumber/wireplumber.conf.d/msm8916-s16le.conf" < Installing fcitx5-t9 addon and T9 profile..." + cp -a "$BANANARCHY_DIR/prebuilt/fcitx5-t9/usr/"* "$ROOTFS/usr/" + + mkdir -p \ + "$ROOTFS/usr/share/superd/services" \ + "$ROOTFS/etc/skel/.config/superd/services/enabled" \ + "$ROOTFS/home/user/.config/superd/services/enabled" \ + "$ROOTFS/etc/skel/.config/fcitx5" \ + "$ROOTFS/home/user/.config/fcitx5" + + cat > "$ROOTFS/usr/share/superd/services/fcitx5.service" < "$ROOTFS/etc/skel/.config/fcitx5/profile" < "$ROOTFS/etc/profile.d/fcitx5-t9.sh" </dev/null; then + cat >> "$ROOTFS/etc/skel/.profile" < Enabling OpenRC runlevel services..." + mkdir -p \ + "$ROOTFS/etc/runlevels/sysinit" \ + "$ROOTFS/etc/runlevels/boot" \ + "$ROOTFS/etc/runlevels/default" \ + "$ROOTFS/etc/runlevels/shutdown" + rm -f "$ROOTFS/etc/runlevels/boot/hwclock" + + for svc in devfs dmesg msm-firmware-loader udev udev-trigger udev-settle; do + if [ -e "$ROOTFS/etc/init.d/$svc" ]; then + ln -sf "/etc/init.d/$svc" "$ROOTFS/etc/runlevels/sysinit/$svc" + fi + done + + for svc in osclock swclock-offset-boot modules sysctl hostname bootmisc logbookd tmpfs msm-firmware-loader-unpack; do + if [ -e "$ROOTFS/etc/init.d/$svc" ]; then + ln -sf "/etc/init.d/$svc" "$ROOTFS/etc/runlevels/boot/$svc" + fi + done + + for svc in \ + udev-postmount \ + rmtfs \ + msm-modem-uim-selection \ + msm8909-modem-wwan-port \ + q6voiced \ + modemmanager \ + networkmanager \ + wpa_supplicant \ + bluetooth \ + dbus \ + cgroups \ + haveged \ + chronyd \ + rfkill \ + sleep-inhibitor \ + sshd \ + swapfile \ + local \ + postmarketos-zram-swap \ + nftables \ + iio-sensor-proxy \ + hkdm \ + kill-plymouth; do + if [ -e "$ROOTFS/etc/init.d/$svc" ]; then + ln -sf "/etc/init.d/$svc" "$ROOTFS/etc/runlevels/default/$svc" + fi + done + + for svc in mount-ro killprocs savecache swclock-offset-shutdown; do + if [ -e "$ROOTFS/etc/init.d/$svc" ]; then + ln -sf "/etc/init.d/$svc" "$ROOTFS/etc/runlevels/shutdown/$svc" + fi + done + + if [ "$UI_TYPE" = "sxmo" ]; then + echo " -> Applying Sxmo UI & User:Ybon keypad/RAM/display tweaks..." + for svc in seatd tinydm; do + if [ -e "$ROOTFS/etc/init.d/$svc" ]; then + ln -sf "/etc/init.d/$svc" "$ROOTFS/etc/runlevels/default/$svc" + fi + done + + mkdir -p "$ROOTFS/var/lib/tinydm" + ln -sf /usr/share/wayland-sessions/swmo.desktop "$ROOTFS/var/lib/tinydm/default-session.desktop" + + cat > "$ROOTFS/usr/bin/sxmo_deviceprofile_nokia,argon.sh" < "$ROOTFS/usr/bin/sxmo_inputhandler.sh" <<'EOF' +#!/bin/sh +exec sxmo_hook_inputhandler.sh "$@" +EOF + chmod 755 "$ROOTFS/usr/bin/sxmo_inputhandler.sh" + + sed -i 's|--input-device="$pwr" ||g' "$ROOTFS/usr/bin/sxmo_swayinitconf.sh" + + if ! grep -q "superctl start fcitx5" "$ROOTFS/usr/share/sxmo/default_hooks/sxmo_hook_start.sh"; then + sed -i 's|superctl start bonsaid|[ "$(command -v bonsaid)" ] \&\& superctl start bonsaid\n\t\t[ "$(command -v fcitx5)" ] \&\& superctl start fcitx5|' \ + "$ROOTFS/usr/share/sxmo/default_hooks/sxmo_hook_start.sh" + fi + + mkdir -p "$ROOTFS/etc/skel/.cache/sxmo" "$ROOTFS/home/user/.cache/sxmo" + touch "$ROOTFS/etc/skel/.cache/sxmo/sxmo.nogesture" "$ROOTFS/home/user/.cache/sxmo/sxmo.nogesture" + + cat > "$ROOTFS/usr/share/sxmo/appcfg/wofi.config" < "$ROOTFS/usr/share/sxmo/appcfg/wofi.css" < "$ROOTFS/usr/share/sxmo/appcfg/conky.conf" <> "$target_home/.config/sxmo/profile" < Generating initramfs, boot.img, and extlinux.conf via mkinitfs..." + chroot "$ROOTFS" /tmp/hostbin/busybox.static sh -e -c ' + export PATH="/tmp/hostbin:/usr/sbin:/usr/bin:/sbin:/bin" + export LD_LIBRARY_PATH="/tmp/hostbin:/lib:/usr/lib" + /tmp/hostbin/mkinitfs + ' + + echo " -> Restoring armv7 /bin/sh symlink and cleaning up temporary hostbin..." + ln -sf /bin/busybox "$ROOTFS/bin/sh" + rm -rf "$ROOTFS/tmp/hostbin" "$ROOTFS/lib/ld-musl-x86_64.so.1" "$ROOTFS/proc/1" + + echo " -> Verifying $ROOTFS boot artifacts:" + ls -lh "$ROOTFS/boot/initramfs" "$ROOTFS/boot/boot.img" "$ROOTFS/boot/extlinux/extlinux.conf" + cat "$ROOTFS/boot/extlinux/extlinux.conf" +} + +BOOT_UUID_SXMO="a1b2c3d4-8110-4000-8000-000000000001" +ROOT_UUID_SXMO="a1b2c3d4-8110-4000-8000-000000000002" + +configure_common_rootfs "$WORK/rootfs-sxmo" "sxmo" "$BOOT_UUID_SXMO" "$ROOT_UUID_SXMO" + +echo "BANANARCHY ROOTFS CONFIGURATION COMPLETED SUCCESSFULLY!" diff --git a/scripts/generate-artwork.py b/scripts/generate-artwork.py new file mode 100755 index 0000000..3598eed --- /dev/null +++ b/scripts/generate-artwork.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python3 +"""Generate Bananarchy OS artwork assets from artwork/icon-large.png.""" + +import math +import os +import sys +from PIL import Image, ImageDraw, ImageFont + + +BASE_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) +ARTWORK_DIR = os.path.join(BASE_DIR, "artwork") +SOURCE_ICON = os.path.join(ARTWORK_DIR, "icon-large.png") + + +def load_font(size, bold=True): + candidates = [ + "/usr/share/fonts/TTF/DejaVuSansMono-Bold.ttf" if bold else "/usr/share/fonts/TTF/DejaVuSansMono.ttf", + "/usr/share/fonts/TTF/DejaVuSans-Bold.ttf" if bold else "/usr/share/fonts/TTF/DejaVuSans.ttf", + "/usr/share/fonts/liberation/LiberationMono-Bold.ttf", + "/usr/share/fonts/gnu-free/FreeMonoBold.ttf", + ] + for path in candidates: + if os.path.isfile(path): + try: + return ImageFont.truetype(path, size) + except Exception: + pass + return ImageFont.load_default() + + +def make_transparent_icon(src_rgb): + """Create an RGBA version with the outer black background keyed to alpha.""" + w, h = src_rgb.size + cx, cy = w / 2.0, h / 2.0 + # The circular emblem spans radius ~495px on a 1024x1024 canvas + outer_r = min(w, h) * 0.486 + feather = min(w, h) * 0.012 + + rgba = src_rgb.convert("RGBA") + px = rgba.load() + for y in range(h): + dy = y - cy + for x in range(w): + dx = x - cx + dist = math.hypot(dx, dy) + r, g, b, _ = px[x, y] + lum = max(r, g, b) + if dist > outer_r + feather and lum < 18: + px[x, y] = (0, 0, 0, 0) + elif dist > outer_r - feather and lum < 28: + # Smooth alpha ramp near outer ring + t = (outer_r + feather - dist) / (2.0 * feather) + t = max(0.0, min(1.0, t)) + alpha = int(round(255.0 * max(t, min(1.0, (lum - 2) / 26.0)))) + px[x, y] = (r, g, b, alpha) + return rgba + + +def make_canvas(width, height, bg=(1, 1, 1)): + return Image.new("RGB", (width, height), bg) + + +def paste_centered(canvas, icon_rgb, box_size, center_x, center_y): + resized = icon_rgb.resize((box_size, box_size), Image.Resampling.LANCZOS) + x0 = int(round(center_x - box_size / 2.0)) + y0 = int(round(center_y - box_size / 2.0)) + canvas.paste(resized, (x0, y0)) + return canvas + + +def main(): + if not os.path.isfile(SOURCE_ICON): + print(f"Error: Source icon not found at {SOURCE_ICON}", file=sys.stderr) + sys.exit(1) + + os.makedirs(ARTWORK_DIR, exist_ok=True) + src = Image.open(SOURCE_ICON).convert("RGB") + src_rgba = make_transparent_icon(src) + + # 1. Standard square RGB icons + square_sizes = [512, 256, 192, 128, 64, 48, 32, 24, 16] + for sz in square_sizes: + out_path = os.path.join(ARTWORK_DIR, f"icon-{sz}.png") + src.resize((sz, sz), Image.Resampling.LANCZOS).save(out_path, "PNG", optimize=True) + + # 2. Transparent RGBA icons for freedesktop / UI themes + for sz in [512, 256, 128, 64, 48, 32]: + out_path = os.path.join(ARTWORK_DIR, f"icon-transparent-{sz}.png") + src_rgba.resize((sz, sz), Image.Resampling.LANCZOS).save(out_path, "PNG", optimize=True) + + # 3. Multi-size favicon.ico + ico_path = os.path.join(ARTWORK_DIR, "favicon.ico") + src_rgba.save( + ico_path, + format="ICO", + sizes=[(16, 16), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)], + ) + + # 4. Sxmo 240x320 portrait wallpaper (emblem placed below Conky clock area) + # Top bar is 24px (0..24), Conky clock occupies y=28..118, emblem sits in y=126..314 + wp_portrait = make_canvas(240, 320, (1, 1, 1)) + paste_centered(wp_portrait, src, 188, 120, 220) + wp_portrait.save(os.path.join(ARTWORK_DIR, "wallpaper-240x320.png"), "PNG", optimize=True) + wp_portrait.save(os.path.join(ARTWORK_DIR, "wallpaper-240x320.jpg"), "JPEG", quality=95, subsampling=0) + + # 5. Centered 240x320 portrait wallpaper + wp_centered = make_canvas(240, 320, (1, 1, 1)) + paste_centered(wp_centered, src, 216, 120, 160) + wp_centered.save(os.path.join(ARTWORK_DIR, "wallpaper-240x320-centered.png"), "PNG", optimize=True) + wp_centered.save(os.path.join(ARTWORK_DIR, "wallpaper-240x320-centered.jpg"), "JPEG", quality=95, subsampling=0) + + # 6. Landscape 320x240 QVGA wallpaper + wp_landscape = make_canvas(320, 240, (1, 1, 1)) + paste_centered(wp_landscape, src, 208, 160, 120) + wp_landscape.save(os.path.join(ARTWORK_DIR, "wallpaper-320x240.png"), "PNG", optimize=True) + wp_landscape.save(os.path.join(ARTWORK_DIR, "wallpaper-320x240.jpg"), "JPEG", quality=95, subsampling=0) + + # 7. Square 240x240 wallpaper (Nokia 2720 Flip external screen) + wp_square = make_canvas(240, 240, (1, 1, 1)) + paste_centered(wp_square, src, 216, 120, 120) + wp_square.save(os.path.join(ARTWORK_DIR, "wallpaper-240x240.png"), "PNG", optimize=True) + + # 8. Boot splash 240x320 (PNG + raw PPM for framebuffer/initramfs) + splash = make_canvas(240, 320, (1, 1, 1)) + paste_centered(splash, src, 196, 120, 134) + draw = ImageDraw.Draw(splash) + font_title = load_font(20, bold=True) + font_sub = load_font(11, bold=False) + + title_text = "BANANARCHY" + tb = draw.textbbox((0, 0), title_text, font=font_title) + tw = tb[2] - tb[0] + draw.text(((240 - tw) // 2, 248), title_text, fill=(255, 214, 10), font=font_title) + + sub_text = "MSM8909 LINUX // SXMO" + sb = draw.textbbox((0, 0), sub_text, font=font_sub) + sw = sb[2] - sb[0] + draw.text(((240 - sw) // 2, 276), sub_text, fill=(180, 180, 180), font=font_sub) + + splash.save(os.path.join(ARTWORK_DIR, "splash-240x320.png"), "PNG", optimize=True) + splash.save(os.path.join(ARTWORK_DIR, "splash-240x320.ppm"), "PPM") + + # 9. Project documentation banner (800x240) + banner = make_canvas(800, 240, (1, 1, 1)) + paste_centered(banner, src, 204, 118, 120) + bdraw = ImageDraw.Draw(banner) + font_btitle = load_font(44, bold=True) + font_bsub = load_font(16, bold=True) + font_bdesc = load_font(12, bold=False) + + bdraw.text((238, 46), "BANANARCHY", fill=(255, 214, 10), font=font_btitle) + bdraw.text( + (240, 108), + "Keypad-First Linux Hardfork for Qualcomm MSM8909", + fill=(240, 240, 240), + font=font_bsub, + ) + bdraw.text( + (240, 142), + "Nokia 8110 4G | Nokia 2720 Flip | Nokia 800 Tough | Nokia 8000 4G", + fill=(255, 140, 26), + font=font_bdesc, + ) + bdraw.text( + (240, 170), + "240x320 Native Sxmo * Multi-Mode T9 Input * QDSP6 Voice & Modem", + fill=(170, 170, 170), + font=font_bdesc, + ) + banner.save(os.path.join(ARTWORK_DIR, "banner-800x240.png"), "PNG", optimize=True) + + print(f"Generated Bananarchy artwork suite in {ARTWORK_DIR}:") + for name in sorted(os.listdir(ARTWORK_DIR)): + p = os.path.join(ARTWORK_DIR, name) + if os.path.isfile(p): + print(f" {name:32s} {os.stat(p).st_size:8d} bytes") + + +if __name__ == "__main__": + main() diff --git a/scripts/mipi-dbi-cmd.py b/scripts/mipi-dbi-cmd.py new file mode 100755 index 0000000..6d4c8d4 --- /dev/null +++ b/scripts/mipi-dbi-cmd.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +"""Compile MIPI-DBI panel init command text files into binary firmware blobs.""" + +import sys + + +MAGIC_HEADER = b"MIPI DBI\x00\x00\x00\x00\x00\x00\x00\x01" + + +def compile_mipi_dbi(txt_path, bin_path): + out = bytearray(MAGIC_HEADER) + with open(txt_path, "r", encoding="utf-8") as f: + for lineno, raw_line in enumerate(f, 1): + line = raw_line.split("#", 1)[0].strip() + if not line: + continue + parts = line.split() + op = parts[0].lower() + if op == "command": + if len(parts) < 2: + raise ValueError(f"{txt_path}:{lineno}: 'command' requires at least 1 byte") + cmd = int(parts[1], 0) + args = [int(x, 0) for x in parts[2:]] + out.append(cmd & 0xFF) + out.append(len(args) & 0xFF) + for a in args: + out.append(a & 0xFF) + elif op == "delay": + if len(parts) != 2: + raise ValueError(f"{txt_path}:{lineno}: 'delay' requires 1 integer argument (ms)") + ms = int(parts[1], 0) + out.append(0x00) + out.append(0x01) + out.append(ms & 0xFF) + else: + raise ValueError(f"{txt_path}:{lineno}: unknown directive '{op}'") + + with open(bin_path, "wb") as wf: + wf.write(out) + + +def main(): + if len(sys.argv) != 3: + print(f"Usage: {sys.argv[0]} ", file=sys.stderr) + sys.exit(1) + compile_mipi_dbi(sys.argv[2], sys.argv[1]) + + +if __name__ == "__main__": + main() diff --git a/src/fcitx5-t9/CMakeLists.txt b/src/fcitx5-t9/CMakeLists.txt new file mode 100644 index 0000000..9b93b51 --- /dev/null +++ b/src/fcitx5-t9/CMakeLists.txt @@ -0,0 +1,12 @@ +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +cmake_minimum_required(VERSION 3.21) +project(fcitx5-t9 VERSION 0.0.1) + +find_package(Fcitx5Core REQUIRED) + +# Setup some compiler option that is generally useful and compatible with Fcitx 5 (C++17) +# include("${FCITX_INSTALL_CMAKECONFIG_DIR}/Fcitx5Utils/Fcitx5CompilerSettings.cmake") + +add_subdirectory(src) diff --git a/src/fcitx5-t9/src/CMakeLists.txt b/src/fcitx5-t9/src/CMakeLists.txt new file mode 100644 index 0000000..c51492c --- /dev/null +++ b/src/fcitx5-t9/src/CMakeLists.txt @@ -0,0 +1,12 @@ +add_library(t9 SHARED t9.cpp) +target_link_libraries(t9 PRIVATE Fcitx5::Core) +set_target_properties(t9 PROPERTIES PREFIX "") +install(TARGETS t9 DESTINATION "${FCITX_INSTALL_LIBDIR}/fcitx5") + +# Addon config file +configure_file(t9-addon.conf t9-addon.conf) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/t9-addon.conf" RENAME t9.conf DESTINATION "${FCITX_INSTALL_PKGDATADIR}/addon") + +# Input Method registration file +configure_file(t9-inputmethod.conf t9-inputmethod.conf) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/t9-inputmethod.conf" RENAME t9.conf DESTINATION "${FCITX_INSTALL_PKGDATADIR}/inputmethod") diff --git a/src/fcitx5-t9/src/t9-addon.conf b/src/fcitx5-t9/src/t9-addon.conf new file mode 100644 index 0000000..fc4092a --- /dev/null +++ b/src/fcitx5-t9/src/t9-addon.conf @@ -0,0 +1,12 @@ +[Addon] +Name=t9 +Category=InputMethod +Enabled=True +Library=t9 +Type=SharedLibrary +OnDemand=False +RegisterInputMethod=True +Configurable=False + +[Addon/Dependencies] +0=core diff --git a/src/fcitx5-t9/src/t9-inputmethod.conf b/src/fcitx5-t9/src/t9-inputmethod.conf new file mode 100644 index 0000000..b1f0e4a --- /dev/null +++ b/src/fcitx5-t9/src/t9-inputmethod.conf @@ -0,0 +1,7 @@ +[InputMethod] +Name=T9 +Icon=input-keyboard +Label=T9 +LangCode=en +Addon=t9 +Configurable=False diff --git a/src/fcitx5-t9/src/t9.cpp b/src/fcitx5-t9/src/t9.cpp new file mode 100644 index 0000000..1298345 --- /dev/null +++ b/src/fcitx5-t9/src/t9.cpp @@ -0,0 +1,922 @@ +#include "t9.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +namespace { + +struct wl_proxy; +struct wl_interface; + +using WlProxyGetVersionFn = uint32_t (*)(struct wl_proxy*); +using WlProxyMarshalFlagsFn = struct wl_proxy* (*)( + struct wl_proxy*, uint32_t, const struct wl_interface*, uint32_t, uint32_t, + ...); + +void sendWaylandVkModifiers(fcitx::InputContext* ic, uint32_t modsDepressed) { + if (!ic || ic->frontendName() != std::string_view("wayland_v2")) { + return; + } + static void* wlHandle = dlopen("libwayland-client.so.0", RTLD_LAZY); + static auto getVer = + wlHandle ? reinterpret_cast( + dlsym(wlHandle, "wl_proxy_get_version")) + : nullptr; + static auto marshalFlags = + wlHandle ? reinterpret_cast( + dlsym(wlHandle, "wl_proxy_marshal_flags")) + : nullptr; + if (!getVer || !marshalFlags) { + return; + } + auto* raw = reinterpret_cast(ic); + std::string_view typeName(typeid(*ic).name()); + if (typeName.find("VirtualInputContext") != std::string_view::npos) { + raw = *reinterpret_cast(raw + 3 * sizeof(void*)); + if (!raw) { + return; + } + } + if (!raw[54]) { + return; + } + void* vkObj = *reinterpret_cast(raw + 40); + if (!vkObj) { + return; + } + auto* proxy = *reinterpret_cast( + reinterpret_cast(vkObj) + 2 * sizeof(void*)); + if (!proxy) { + return; + } + constexpr uint32_t kZwpVirtualKeyboardV1ModifiersOpcode = 2; + uint32_t ver = getVer(proxy); + marshalFlags(proxy, kZwpVirtualKeyboardV1ModifiersOpcode, nullptr, ver, 0, + modsDepressed, 0u, 0u, 0u); +} + +constexpr int kKey1 = 1; +constexpr int kKey2 = 2; +constexpr int kKey3 = 3; +constexpr int kKey4 = 4; +constexpr int kKey5 = 5; +constexpr int kKey6 = 6; +constexpr int kKey7 = 7; +constexpr int kKey8 = 8; +constexpr int kKey9 = 9; +constexpr int kKey0 = 10; +constexpr int kKeyStar = 11; +constexpr int kKeyPound = 12; + +T9Item makeChar(char c) { + std::string s(1, c); + std::string lbl = (c == ' ') ? "SPC" : s; + return T9Item{lbl, s, FcitxKey_None, fcitx::KeyState::NoState, 0}; +} + +std::vector makeCharItems(const std::string& chars) { + std::vector out; + out.reserve(chars.size()); + for (char c : chars) { + out.push_back(makeChar(c)); + } + return out; +} + +T9Item makeKey(const std::string& label, fcitx::KeySym sym, uint32_t xkbCode, + fcitx::KeyStates states = fcitx::KeyState::NoState) { + return T9Item{label, "", sym, states, xkbCode}; +} + +T9Item makeCtrlKey(const std::string& label, fcitx::KeySym sym, + uint32_t xkbCode) { + return T9Item{label, "", sym, fcitx::KeyState::Ctrl, xkbCode}; +} + +bool charToCtrlKey(char ch, fcitx::KeySym* symOut, uint32_t* xkbCodeOut) { + char lower = static_cast(std::tolower(static_cast(ch))); + switch (lower) { + case 'a': + *symOut = FcitxKey_a; + *xkbCodeOut = 38; + return true; + case 'b': + *symOut = FcitxKey_b; + *xkbCodeOut = 56; + return true; + case 'c': + *symOut = FcitxKey_c; + *xkbCodeOut = 54; + return true; + case 'd': + *symOut = FcitxKey_d; + *xkbCodeOut = 40; + return true; + case 'e': + *symOut = FcitxKey_e; + *xkbCodeOut = 26; + return true; + case 'f': + *symOut = FcitxKey_f; + *xkbCodeOut = 41; + return true; + case 'g': + *symOut = FcitxKey_g; + *xkbCodeOut = 42; + return true; + case 'h': + *symOut = FcitxKey_h; + *xkbCodeOut = 43; + return true; + case 'i': + *symOut = FcitxKey_i; + *xkbCodeOut = 31; + return true; + case 'j': + *symOut = FcitxKey_j; + *xkbCodeOut = 44; + return true; + case 'k': + *symOut = FcitxKey_k; + *xkbCodeOut = 45; + return true; + case 'l': + *symOut = FcitxKey_l; + *xkbCodeOut = 46; + return true; + case 'm': + *symOut = FcitxKey_m; + *xkbCodeOut = 58; + return true; + case 'n': + *symOut = FcitxKey_n; + *xkbCodeOut = 57; + return true; + case 'o': + *symOut = FcitxKey_o; + *xkbCodeOut = 32; + return true; + case 'p': + *symOut = FcitxKey_p; + *xkbCodeOut = 33; + return true; + case 'q': + *symOut = FcitxKey_q; + *xkbCodeOut = 24; + return true; + case 'r': + *symOut = FcitxKey_r; + *xkbCodeOut = 27; + return true; + case 's': + *symOut = FcitxKey_s; + *xkbCodeOut = 39; + return true; + case 't': + *symOut = FcitxKey_t; + *xkbCodeOut = 28; + return true; + case 'u': + *symOut = FcitxKey_u; + *xkbCodeOut = 30; + return true; + case 'v': + *symOut = FcitxKey_v; + *xkbCodeOut = 55; + return true; + case 'w': + *symOut = FcitxKey_w; + *xkbCodeOut = 25; + return true; + case 'x': + *symOut = FcitxKey_x; + *xkbCodeOut = 53; + return true; + case 'y': + *symOut = FcitxKey_y; + *xkbCodeOut = 29; + return true; + case 'z': + *symOut = FcitxKey_z; + *xkbCodeOut = 52; + return true; + case '[': + *symOut = FcitxKey_bracketleft; + *xkbCodeOut = 34; + return true; + case '\\': + *symOut = FcitxKey_backslash; + *xkbCodeOut = 51; + return true; + case ']': + *symOut = FcitxKey_bracketright; + *xkbCodeOut = 35; + return true; + case '^': + case '6': + *symOut = FcitxKey_6; + *xkbCodeOut = 15; + return true; + case '_': + case '-': + *symOut = FcitxKey_minus; + *xkbCodeOut = 20; + return true; + default: + return false; + } +} + +int mapHardwareKey(const fcitx::Key& key) { + uint32_t code = key.code(); + // XKB keycodes: KEY_1..KEY_9 = 10..18, KEY_0 = 19 + if (code >= 10 && code <= 19) { + return static_cast(code - 9); + } + // KEY_NUMERIC_STAR (evdev 522 -> XKB 530) + if (code == 530 || key.sym() == FcitxKey_asterisk || + static_cast(key.sym()) == 0x1008ffaa) { + return kKeyStar; + } + // KEY_NUMERIC_POUND (evdev 523 -> XKB 531) + if (code == 531 || key.sym() == FcitxKey_numbersign || + static_cast(key.sym()) == 0x1008ffab) { + return kKeyPound; + } + return -1; +} + +} // namespace + +T9Engine::T9Engine(fcitx::Instance* instance) + : instance(instance), factory([this](fcitx::InputContext& ic) { + return new T9State(this, &ic); + }) { + instance->inputContextManager().registerProperty("t9State", &factory); +} + +std::vector T9Engine::listInputMethods() { + std::vector result; + result.emplace_back("t9", "T9", "en", "t9") + .setLabel("T9") + .setIcon("input-keyboard") + .setConfigurable(false); + return result; +} + +void T9Engine::keyEvent(const fcitx::InputMethodEntry& entry, + fcitx::KeyEvent& keyEvent) { + FCITX_UNUSED(entry); + FCITX_INFO() << "T9 keyEvent code=" << keyEvent.key().code() + << " sym=" << keyEvent.key().sym() + << " isRelease=" << keyEvent.isRelease(); + auto* ic = keyEvent.inputContext(); + auto* state = ic->propertyFor(&factory); + if (state->handleKeyEvent(keyEvent)) { + keyEvent.filterAndAccept(); + } +} + +void T9Engine::reset(const fcitx::InputMethodEntry& entry, + fcitx::InputContextEvent& event) { + FCITX_UNUSED(entry); + auto* ic = event.inputContext(); + auto* state = ic->propertyFor(&factory); + state->reset(); +} + +FCITX_ADDON_FACTORY(T9EngineFactory); + +std::string T9State::modePrefix() const { + std::string p; + switch (mode) { + case T9Mode::Lower: + p = "abc"; + break; + case T9Mode::Shift: + p = "Abc"; + break; + case T9Mode::Upper: + p = "ABC"; + break; + case T9Mode::Sym: + p = "Sym"; + break; + case T9Mode::Ctrl: + p = "Ctl"; + break; + case T9Mode::Num: + p = "123"; + break; + } + if (ctrlLatch) { + p += "+^"; + } + return p; +} + +std::vector T9State::getItemsForKey(int keyId) const { + if (mode == T9Mode::Sym) { + switch (keyId) { + case kKey1: + return makeCharItems(".,!?:;-_1"); + case kKey2: + return makeCharItems("@#$%^&2"); + case kKey3: + return makeCharItems("()[]{}<>3"); + case kKey4: + return makeCharItems("+-*/=_4"); + case kKey5: + return makeCharItems("|\\~`'\"5"); + case kKey6: + return makeCharItems("'\"`~^6"); + case kKey7: + return makeCharItems("/\\|_-+7"); + case kKey8: + return makeCharItems("<>!=?&8"); + case kKey9: + return makeCharItems("$%^&*#@9"); + case kKey0: { + auto v = makeCharItems(" 0"); + v.push_back(makeKey("Tab", FcitxKey_Tab, 23)); + v.push_back(makeKey("Ent", FcitxKey_Return, 36)); + v.push_back(makeKey("Esc", FcitxKey_Escape, 9)); + return v; + } + case kKeyStar: + return makeCharItems("*#+-=_/\\|~`@$%^&()[]{}<>'\".,!?:;"); + default: + return {}; + } + } + + if (mode == T9Mode::Ctrl) { + switch (keyId) { + case kKey1: + return { + makeKey("Esc", FcitxKey_Escape, 9), + makeKey("Tab", FcitxKey_Tab, 23), + makeKey("Del", FcitxKey_Delete, 119), + makeKey("Ins", FcitxKey_Insert, 118), + makeKey("Bksp", FcitxKey_BackSpace, 22), + }; + case kKey2: + return { + makeCtrlKey("^C", FcitxKey_c, 54), + makeCtrlKey("^D", FcitxKey_d, 40), + makeCtrlKey("^Z", FcitxKey_z, 52), + makeCtrlKey("^X", FcitxKey_x, 53), + makeCtrlKey("^\\", FcitxKey_backslash, 51), + }; + case kKey3: + return { + makeCtrlKey("^A", FcitxKey_a, 38), + makeCtrlKey("^E", FcitxKey_e, 26), + makeCtrlKey("^U", FcitxKey_u, 30), + makeCtrlKey("^K", FcitxKey_k, 45), + makeCtrlKey("^W", FcitxKey_w, 25), + }; + case kKey4: + return { + makeCtrlKey("^R", FcitxKey_r, 27), + makeCtrlKey("^L", FcitxKey_l, 46), + makeCtrlKey("^P", FcitxKey_p, 33), + makeCtrlKey("^N", FcitxKey_n, 57), + makeCtrlKey("^G", FcitxKey_g, 42), + }; + case kKey5: + return { + makeCtrlKey("^S", FcitxKey_s, 39), + makeCtrlKey("^Q", FcitxKey_q, 24), + makeCtrlKey("^O", FcitxKey_o, 32), + makeCtrlKey("^T", FcitxKey_t, 28), + makeCtrlKey("^Y", FcitxKey_y, 29), + }; + case kKey6: + return { + makeCtrlKey("^B", FcitxKey_b, 56), + makeCtrlKey("^F", FcitxKey_f, 41), + makeCtrlKey("^V", FcitxKey_v, 55), + makeCtrlKey("^H", FcitxKey_h, 43), + makeCtrlKey("^[", FcitxKey_bracketleft, 34), + makeCtrlKey("^]", FcitxKey_bracketright, 35), + makeCtrlKey("^^", FcitxKey_6, 15), + makeCtrlKey("^_", FcitxKey_minus, 20), + }; + case kKey7: + return { + makeKey("PgUp", FcitxKey_Page_Up, 112), + makeKey("PgDn", FcitxKey_Page_Down, 117), + makeKey("Home", FcitxKey_Home, 110), + makeKey("End", FcitxKey_End, 115), + }; + case kKey8: + return { + makeKey("Up", FcitxKey_Up, 111), + makeKey("Down", FcitxKey_Down, 116), + makeKey("Left", FcitxKey_Left, 113), + makeKey("Right", FcitxKey_Right, 114), + }; + case kKey9: + return { + makeKey("F1", FcitxKey_F1, 67), makeKey("F2", FcitxKey_F2, 68), + makeKey("F3", FcitxKey_F3, 69), makeKey("F4", FcitxKey_F4, 70), + makeKey("F5", FcitxKey_F5, 71), makeKey("F6", FcitxKey_F6, 72), + makeKey("F7", FcitxKey_F7, 73), makeKey("F8", FcitxKey_F8, 74), + makeKey("F9", FcitxKey_F9, 75), makeKey("F10", FcitxKey_F10, 76), + makeKey("F11", FcitxKey_F11, 95), makeKey("F12", FcitxKey_F12, 96), + }; + case kKey0: + return { + makeChar(' '), + makeKey("Tab", FcitxKey_Tab, 23), + makeKey("Ent", FcitxKey_Return, 36), + makeKey("Esc", FcitxKey_Escape, 9), + }; + case kKeyStar: + return { + makeKey("Esc", FcitxKey_Escape, 9), + makeKey("Tab", FcitxKey_Tab, 23), + makeCtrlKey("^C", FcitxKey_c, 54), + makeCtrlKey("^D", FcitxKey_d, 40), + makeCtrlKey("^Z", FcitxKey_z, 52), + makeCtrlKey("^X", FcitxKey_x, 53), + makeCtrlKey("^L", FcitxKey_l, 46), + makeCtrlKey("^R", FcitxKey_r, 27), + makeCtrlKey("^W", FcitxKey_w, 25), + }; + default: + return {}; + } + } + + bool upperFirst = (mode == T9Mode::Shift || mode == T9Mode::Upper); + switch (keyId) { + case kKey1: + return makeCharItems(".,-_!?/@:;'\"+=*#$%^&()[]{}<>|\\~`1"); + case kKey2: + return makeCharItems(upperFirst ? "ABC2abc" : "abc2ABC"); + case kKey3: + return makeCharItems(upperFirst ? "DEF3def" : "def3DEF"); + case kKey4: + return makeCharItems(upperFirst ? "GHI4ghi" : "ghi4GHI"); + case kKey5: + return makeCharItems(upperFirst ? "JKL5jkl" : "jkl5JKL"); + case kKey6: + return makeCharItems(upperFirst ? "MNO6mno" : "mno6MNO"); + case kKey7: + return makeCharItems(upperFirst ? "PQRS7pqrs" : "pqrs7PQRS"); + case kKey8: + return makeCharItems(upperFirst ? "TUV8tuv" : "tuv8TUV"); + case kKey9: + return makeCharItems(upperFirst ? "WXYZ9wxyz" : "wxyz9WXYZ"); + case kKey0: { + auto v = makeCharItems(" 0"); + v.push_back(makeKey("Ent", FcitxKey_Return, 36)); + v.push_back(makeKey("Tab", FcitxKey_Tab, 23)); + return v; + } + case kKeyStar: { + auto v = makeCharItems("*#+-=_/\\|~`@$%^&()[]{}<>'\".,!?:;"); + v.push_back(makeKey("Tab", FcitxKey_Tab, 23)); + v.push_back(makeKey("Esc", FcitxKey_Escape, 9)); + v.push_back(makeCtrlKey("^C", FcitxKey_c, 54)); + v.push_back(makeCtrlKey("^D", FcitxKey_d, 40)); + v.push_back(makeCtrlKey("^Z", FcitxKey_z, 52)); + return v; + } + default: + return {}; + } +} + +void T9State::cycleMode() { + switch (mode) { + case T9Mode::Lower: + mode = T9Mode::Shift; + break; + case T9Mode::Shift: + mode = T9Mode::Upper; + break; + case T9Mode::Upper: + mode = T9Mode::Sym; + break; + case T9Mode::Sym: + mode = T9Mode::Ctrl; + break; + case T9Mode::Ctrl: + mode = T9Mode::Num; + break; + case T9Mode::Num: + mode = T9Mode::Lower; + break; + } + showStatusBanner("[Mode: " + modePrefix() + "]"); +} + +void T9State::toggleCurrentCase() { + if (activeItems.empty() || currentIndex < 0 || + static_cast(currentIndex) >= activeItems.size()) { + return; + } + const std::string& cur = activeItems[currentIndex].commitText; + if (cur.size() == 1 && std::isalpha(static_cast(cur[0]))) { + char target = std::isupper(static_cast(cur[0])) + ? static_cast( + std::tolower(static_cast(cur[0]))) + : static_cast( + std::toupper(static_cast(cur[0]))); + for (size_t i = 0; i < activeItems.size(); ++i) { + if (activeItems[i].commitText.size() == 1 && + activeItems[i].commitText[0] == target) { + currentIndex = static_cast(i); + break; + } + } + scheduleCommit(); + showPreview(activeItems, currentIndex); + } else { + stepCandidate(4); + } +} + +void T9State::stepCandidate(int delta) { + if (activeItems.empty()) { + return; + } + int n = static_cast(activeItems.size()); + currentIndex = ((currentIndex + delta) % n + n) % n; + scheduleCommit(); + showPreview(activeItems, currentIndex); +} + +bool T9State::handleKeyEvent(fcitx::KeyEvent& keyEvent) { + fcitx::Key key = keyEvent.key(); + uint32_t code = key.code(); + fcitx::KeySym sym = key.sym(); + + // Handle preedit navigation when an uncommitted character is active + if (!activeItems.empty()) { + if (sym == FcitxKey_BackSpace || code == 22) { + if (!keyEvent.isRelease()) { + cancelCommit(); + lastKeyId = -1; + currentIndex = 0; + activeItems.clear(); + } + return true; + } + if (sym == FcitxKey_Left || code == 113) { + if (!keyEvent.isRelease()) { + stepCandidate(-1); + } + return true; + } + if (sym == FcitxKey_Right || code == 114 || sym == FcitxKey_Return || + code == 36) { + if (!keyEvent.isRelease()) { + commit(); + } + return true; + } + if (sym == FcitxKey_Up || code == 111) { + if (!keyEvent.isRelease()) { + toggleCurrentCase(); + } + return true; + } + if (sym == FcitxKey_Down || code == 116) { + if (!keyEvent.isRelease()) { + if (activeItems[currentIndex].commitText.size() == 1 && + std::isalpha(static_cast( + activeItems[currentIndex].commitText[0]))) { + toggleCurrentCase(); + } else { + stepCandidate(-4); + } + } + return true; + } + } + + if (mode == T9Mode::Ctrl) { + if (sym == FcitxKey_Up || code == 111) { + if (!keyEvent.isRelease()) { + forwardKeyTap(FcitxKey_Page_Up, fcitx::KeyState::NoState, 112); + } + return true; + } + if (sym == FcitxKey_Down || code == 116) { + if (!keyEvent.isRelease()) { + forwardKeyTap(FcitxKey_Page_Down, fcitx::KeyState::NoState, 117); + } + return true; + } + if (sym == FcitxKey_Left || code == 113) { + if (!keyEvent.isRelease()) { + forwardKeyTap(FcitxKey_Home, fcitx::KeyState::NoState, 110); + } + return true; + } + if (sym == FcitxKey_Right || code == 114) { + if (!keyEvent.isRelease()) { + forwardKeyTap(FcitxKey_End, fcitx::KeyState::NoState, 115); + } + return true; + } + } + + int keyId = mapHardwareKey(key); + if (keyId < 0) { + if (!keyEvent.isRelease()) { + commit(); + } + return false; + } + + if (keyEvent.isRelease()) { + cancelLongPressTimer(); + int releasedId = pressedKeyId; + pressedKeyId = -1; + if (isLongPressHandled) { + isLongPressHandled = false; + return true; + } + if (releasedId != keyId && releasedId != -1) { + return true; + } + if (keyId == kKeyPound) { + if (!activeItems.empty()) { + toggleCurrentCase(); + } else { + cycleMode(); + } + return true; + } + if (mode == T9Mode::Num) { + if (bannerTimer) { + bannerTimer.reset(); + resetUI(); + } + if (keyId >= kKey1 && keyId <= kKey9) { + sendItem(makeChar(static_cast('0' + keyId))); + } else if (keyId == kKey0) { + sendItem(makeChar('0')); + } else if (keyId == kKeyStar) { + sendItem(makeChar('*')); + } + return true; + } + handleMultiTap(keyId); + return true; + } + + // Key press event + if (pressedKeyId != keyId) { + pressedKeyId = keyId; + isLongPressHandled = false; + startLongPressTimer(keyId); + } + return true; +} + +void T9State::startLongPressTimer(int keyId) { + cancelLongPressTimer(); + longPressTimer = engine->instance->eventLoop().addTimeEvent( + CLOCK_MONOTONIC, fcitx::now(CLOCK_MONOTONIC) + 450000, 0, + [this, keyId](fcitx::EventSourceTime*, uint64_t) { + onLongPress(keyId); + return true; + }); +} + +void T9State::cancelLongPressTimer() { + if (longPressTimer) { + longPressTimer.reset(); + } +} + +void T9State::onLongPress(int keyId) { + isLongPressHandled = true; + if (!activeItems.empty()) { + commit(); + } + if (keyId >= kKey1 && keyId <= kKey9) { + sendItem(makeChar(static_cast('0' + keyId))); + resetUI(); + } else if (keyId == kKey0) { + sendItem(makeChar('0')); + resetUI(); + } else if (keyId == kKeyStar) { + if (mode == T9Mode::Num) { + sendItem(makeChar('.')); + resetUI(); + } else { + ctrlLatch = !ctrlLatch; + showStatusBanner(ctrlLatch ? "[Ctrl+ LATCH ON]" : "[Ctrl+ LATCH OFF]"); + } + } else if (keyId == kKeyPound) { + sendItem(makeChar('#')); + resetUI(); + } +} + +void T9State::handleMultiTap(int keyId) { + if (bannerTimer) { + bannerTimer.reset(); + } + if (lastKeyId != -1 && keyId != lastKeyId) { + commit(); + } + if (keyId == lastKeyId && !activeItems.empty()) { + currentIndex = (currentIndex + 1) % static_cast(activeItems.size()); + } else { + activeItems = getItemsForKey(keyId); + currentIndex = 0; + lastKeyId = keyId; + } + if (activeItems.empty()) { + return; + } + uint64_t delayUs = (activeItems.size() > 10) ? 750000 : 600000; + scheduleCommit(delayUs); + showPreview(activeItems, currentIndex); +} + +void T9State::reset() { + cancelLongPressTimer(); + cancelCommit(); + if (bannerTimer) { + bannerTimer.reset(); + } + lastKeyId = -1; + pressedKeyId = -1; + currentIndex = 0; + activeItems.clear(); + isLongPressHandled = false; + ctrlLatch = false; +} + +void T9State::forwardKeyTap(fcitx::KeySym sym, fcitx::KeyStates states, + uint32_t xkbCode) { + if (states.test(fcitx::KeyState::Ctrl)) { + constexpr uint32_t kXkbModCtrl = (1u << 2); + sendWaylandVkModifiers(ic, kXkbModCtrl); + ic->forwardKey(fcitx::Key(sym, fcitx::KeyState::Ctrl, xkbCode), false); + sendWaylandVkModifiers(ic, 0u); + } else { + ic->forwardKey(fcitx::Key(sym, states, xkbCode), false); + } +} + +void T9State::sendItem(const T9Item& item) { + if (ctrlLatch && !item.commitText.empty()) { + fcitx::KeySym cSym = FcitxKey_None; + uint32_t cCode = 0; + ctrlLatch = false; + if (charToCtrlKey(item.commitText[0], &cSym, &cCode)) { + forwardKeyTap(cSym, fcitx::KeyState::Ctrl, cCode); + return; + } + } + ctrlLatch = false; + if (item.sym != FcitxKey_None) { + forwardKeyTap(item.sym, item.states, item.xkbCode); + } else if (!item.commitText.empty()) { + ic->commitString(item.commitText); + if (mode == T9Mode::Shift && + std::isalpha(static_cast(item.commitText[0]))) { + mode = T9Mode::Lower; + } + } +} + +void T9State::commit() { + if (commitTimer) { + commitTimer.reset(); + } + if (!activeItems.empty() && currentIndex >= 0 && + static_cast(currentIndex) < activeItems.size()) { + T9Item chosen = activeItems[currentIndex]; + activeItems.clear(); + lastKeyId = -1; + currentIndex = 0; + resetUI(); + sendItem(chosen); + } else { + activeItems.clear(); + lastKeyId = -1; + currentIndex = 0; + resetUI(); + } +} + +void T9State::scheduleCommit(uint64_t delayUs) { + if (commitTimer) { + commitTimer.reset(); + } + commitTimer = engine->instance->eventLoop().addTimeEvent( + CLOCK_MONOTONIC, fcitx::now(CLOCK_MONOTONIC) + delayUs, 0, + [this](fcitx::EventSourceTime*, uint64_t) { + commit(); + return true; + }); +} + +void T9State::cancelCommit() { + if (commitTimer) { + commitTimer.reset(); + } + resetUI(); +} + +void T9State::resetUI() { + ic->inputPanel().reset(); + ic->updatePreedit(); + ic->updateUserInterface(fcitx::UserInterfaceComponent::InputPanel); +} + +void T9State::showStatusBanner(const std::string& msg) { + if (bannerTimer) { + bannerTimer.reset(); + } + auto& inputPanel = ic->inputPanel(); + inputPanel.reset(); + fcitx::Text text; + text.append(msg); + if (ic->capabilityFlags().test(fcitx::CapabilityFlag::Preedit)) { + inputPanel.setClientPreedit(text); + ic->updatePreedit(); + } else { + inputPanel.setPreedit(text); + } + ic->updateUserInterface(fcitx::UserInterfaceComponent::InputPanel); + bannerTimer = engine->instance->eventLoop().addTimeEvent( + CLOCK_MONOTONIC, fcitx::now(CLOCK_MONOTONIC) + 900000, 0, + [this](fcitx::EventSourceTime*, uint64_t) { + resetUI(); + return true; + }); +} + +void T9State::showPreview(const std::vector& items, int index) { + int total = static_cast(items.size()); + if (total == 0) { + return; + } + constexpr int kMaxVisible = 7; + int start = 0; + int end = total; + if (total > kMaxVisible) { + start = index - (kMaxVisible / 2); + if (start < 0) { + start = 0; + } + end = start + kMaxVisible; + if (end > total) { + end = total; + start = end - kMaxVisible; + } + } + + std::string preedit = modePrefix() + ": "; + if (start > 0) { + preedit += "< "; + } + for (int i = start; i < end; ++i) { + if (i == index) { + preedit += "["; + preedit += items[i].label; + preedit += "]"; + } else { + preedit += items[i].label; + } + if (i < end - 1) { + preedit += " "; + } + } + if (end < total) { + preedit += " >"; + } + + auto& inputPanel = ic->inputPanel(); + inputPanel.reset(); + fcitx::Text text; + text.append(preedit); + if (ic->capabilityFlags().test(fcitx::CapabilityFlag::Preedit)) { + inputPanel.setClientPreedit(text); + ic->updatePreedit(); + } else { + inputPanel.setPreedit(text); + } + ic->updateUserInterface(fcitx::UserInterfaceComponent::InputPanel); +} diff --git a/src/fcitx5-t9/src/t9.h b/src/fcitx5-t9/src/t9.h new file mode 100644 index 0000000..b88cf85 --- /dev/null +++ b/src/fcitx5-t9/src/t9.h @@ -0,0 +1,101 @@ +#ifndef _FCITX5_T9_T9_H_ +#define _FCITX5_T9_T9_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +class T9Engine; + +enum class T9Mode { + Lower = 0, // abc: lowercase first, then digit, then uppercase + Shift = 1, // Abc: uppercase for next character, then auto-reverts to Lower + Upper = 2, // ABC: uppercase first, then digit, then lowercase + Sym = 3, // Sym: full ASCII punctuation & symbols grouped across 1-9, 0, * + Ctrl = 4, // Ctl: terminal control chars (^A-^Z) & navigation/function keys + Num = 5 // 123: instant single-tap numeric entry +}; + +struct T9Item { + std::string label; + std::string commitText; + fcitx::KeySym sym = FcitxKey_None; + fcitx::KeyStates states = fcitx::KeyState::NoState; + uint32_t xkbCode = 0; +}; + +class T9State : public fcitx::InputContextProperty { + public: + T9State(T9Engine* engine, fcitx::InputContext* ic) : engine(engine), ic(ic) {} + + bool handleKeyEvent(fcitx::KeyEvent& keyEvent); + void cancelCommit(); + void reset(); + + private: + std::vector getItemsForKey(int keyId) const; + std::string modePrefix() const; + void cycleMode(); + void toggleCurrentCase(); + void stepCandidate(int delta); + void startLongPressTimer(int keyId); + void cancelLongPressTimer(); + void onLongPress(int keyId); + void scheduleCommit(uint64_t delayUs = 600000); + void commit(); + void sendItem(const T9Item& item); + void forwardKeyTap(fcitx::KeySym sym, fcitx::KeyStates states, + uint32_t xkbCode); + void resetUI(); + void showPreview(const std::vector& items, int index); + void showStatusBanner(const std::string& msg); + void handleMultiTap(int keyId); + + T9Engine* engine; + fcitx::InputContext* ic; + T9Mode mode = T9Mode::Lower; + bool ctrlLatch = false; + int lastKeyId = -1; + int pressedKeyId = -1; + int currentIndex = 0; + std::vector activeItems; + std::unique_ptr commitTimer; + std::unique_ptr longPressTimer; + std::unique_ptr bannerTimer; + bool isLongPressHandled = false; +}; + +class T9Engine : public fcitx::InputMethodEngineV2 { + public: + explicit T9Engine(fcitx::Instance* instance); + std::vector listInputMethods() override; + void keyEvent(const fcitx::InputMethodEntry& entry, + fcitx::KeyEvent& keyEvent) override; + void reset(const fcitx::InputMethodEntry& entry, + fcitx::InputContextEvent& event) override; + fcitx::Instance* instance; + + private: + fcitx::FactoryFor factory; +}; + +class T9EngineFactory : public fcitx::AddonFactory { + public: + fcitx::AddonInstance* create(fcitx::AddonManager* manager) override { + FCITX_UNUSED(manager); + return new T9Engine(manager->instance()); + } +}; + +#endif // _FCITX5_T9_T9_H_ diff --git a/src/leds-msm8905-torch/Makefile b/src/leds-msm8905-torch/Makefile new file mode 100644 index 0000000..1850349 --- /dev/null +++ b/src/leds-msm8905-torch/Makefile @@ -0,0 +1 @@ +obj-m += leds-msm8905-torch.o diff --git a/src/leds-msm8905-torch/leds-msm8905-torch.c b/src/leds-msm8905-torch/leds-msm8905-torch.c new file mode 100644 index 0000000..ae2d135 --- /dev/null +++ b/src/leds-msm8905-torch/leds-msm8905-torch.c @@ -0,0 +1,258 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Qualcomm MSM8905 / Nokia 8110 4G (nokia-argon) SY7807 Rear Flashlight Driver + * + * Drives the SY7807 boost LED controller on TLMM GPIO_32 (cci_timer1) using + * GCC camss_gp1_clk_src at 150 kHz (50% duty cycle in continuous Torch mode), + * matching the hardware sequence from the stock Nokia 8110 4G kernel. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MSM8905_TLMM_GPIO32_PHYS 0x01020000UL +#define MSM8905_TLMM_GPIO32_SIZE 0x1000UL +#define GPIO32_CFG_REG 0x0000U +#define GPIO32_CFG_CCI_TIMER1 0x0008U /* 2mA, no pull, func=2 (cci_timer1) */ +#define GPIO32_CFG_GPIO_OFF 0x0001U /* 2mA, pull-down, func=0 (gpio in) */ + +#define MSM8905_GCC_CAMSS_PHYS 0x01850000UL +#define MSM8905_GCC_CAMSS_SIZE 0x6000UL +#define GCC_CAMSS_GP1_CBCR_STOCK 0x0004U /* Stock MSM8909 gcc_camss_gp1_clk CBCR */ +#define GCC_CAMSS_GP1_CMD_RCGR 0x5000U /* camss_gp1_clk_src CMD_RCGR */ +#define GCC_CAMSS_GP1_CFG_RCGR 0x5004U /* camss_gp1_clk_src CFG_RCGR */ +#define GCC_CAMSS_GP1_M_REG 0x5008U /* M = 1 */ +#define GCC_CAMSS_GP1_N_REG 0x500cU /* ~(128 - 1) = 0xff80 (19.2MHz / 128 = 150kHz) */ +#define GCC_CAMSS_GP1_D_REG 0x5010U /* ~128 = 0xff7f (50% duty cycle) */ +#define GCC_CAMSS_GP1_CBCR_MAIN 0x5018U /* Mainline gcc_camss_gp1_clk CBCR */ + +#define RCGR_CFG_150KHZ_XO 0x2001U /* Dual-edge M/N:D (mode=2), XO (src=0), div=1 */ +#define RCGR_M_150KHZ 0x0001U +#define RCGR_N_150KHZ 0xff80U +#define RCGR_D_TORCH_50PCT 0xff7fU +#define RCGR_CMD_ENABLE_UPDATE 0x0003U /* ROOT_EN | CMD_UPDATE */ + +/* PM8909 PON registers for PS_HOLD shutdown vs warm reset configuration */ +#define QPNP_PON_PS_HOLD_RST_CTL 0x085aU +#define QPNP_PON_PS_HOLD_RST_CTL2 0x085bU +#define QPNP_PON_S2_CNTL_EN 0x80U +#define QPNP_PON_RST_TYPE_MASK 0x0fU +#define PON_POWER_OFF_WARM_RESET 0x01U +#define PON_POWER_OFF_SHUTDOWN 0x04U +#define PON_POWER_OFF_HARD_RESET 0x07U + +static void __iomem *tlmm_gpio32_base; +static void __iomem *gcc_camss_base; +static struct regmap *pon_regmap; +static DEFINE_SPINLOCK(torch_lock); +static enum led_brightness current_brightness = LED_OFF; + +static void msm8905_torch_hw_enable(enum led_brightness value) +{ + unsigned long flags; + u32 d_count; + u32 d_reg; + + /* + * Scale PWM duty cycle up to 50% (d_count = 64 of N = 128) at max brightness + * so the SY7807 remains in continuous Torch mode without triggering its + * high-current Flash Strobe safety timeout. + */ + d_count = (u32)value * 64U / 255U; + if (d_count < 8U) + d_count = 8U; + if (d_count > 64U) + d_count = 64U; + d_reg = (~(2U * d_count)) & 0xffffU; + + spin_lock_irqsave(&torch_lock, flags); + + writel_relaxed(RCGR_CFG_150KHZ_XO, gcc_camss_base + GCC_CAMSS_GP1_CFG_RCGR); + writel_relaxed(RCGR_M_150KHZ, gcc_camss_base + GCC_CAMSS_GP1_M_REG); + writel_relaxed(RCGR_N_150KHZ, gcc_camss_base + GCC_CAMSS_GP1_N_REG); + writel_relaxed(d_reg, gcc_camss_base + GCC_CAMSS_GP1_D_REG); + writel_relaxed(RCGR_CMD_ENABLE_UPDATE, gcc_camss_base + GCC_CAMSS_GP1_CMD_RCGR); + wmb(); + + writel_relaxed(0x1U, gcc_camss_base + GCC_CAMSS_GP1_CBCR_STOCK); + writel_relaxed(0x1U, gcc_camss_base + GCC_CAMSS_GP1_CBCR_MAIN); + writel_relaxed(GPIO32_CFG_CCI_TIMER1, tlmm_gpio32_base + GPIO32_CFG_REG); + wmb(); + + current_brightness = value; + spin_unlock_irqrestore(&torch_lock, flags); +} + +static void msm8905_torch_hw_disable(void) +{ + unsigned long flags; + + spin_lock_irqsave(&torch_lock, flags); + + writel_relaxed(GPIO32_CFG_GPIO_OFF, tlmm_gpio32_base + GPIO32_CFG_REG); + writel_relaxed(0x0U, gcc_camss_base + GCC_CAMSS_GP1_CBCR_STOCK); + writel_relaxed(0x0U, gcc_camss_base + GCC_CAMSS_GP1_CBCR_MAIN); + writel_relaxed(0x0U, gcc_camss_base + GCC_CAMSS_GP1_CMD_RCGR); + wmb(); + + current_brightness = LED_OFF; + spin_unlock_irqrestore(&torch_lock, flags); +} + +static void msm8905_torch_brightness_set(struct led_classdev *led_cdev, + enum led_brightness value) +{ + if (value == LED_OFF) + msm8905_torch_hw_disable(); + else + msm8905_torch_hw_enable(value); +} + +static enum led_brightness msm8905_torch_brightness_get(struct led_classdev *led_cdev) +{ + return current_brightness; +} + +static struct led_classdev msm8905_torch_led = { + .name = "white:torch", + .max_brightness = LED_FULL, + .brightness_set = msm8905_torch_brightness_set, + .brightness_get = msm8905_torch_brightness_get, + .flags = LED_CORE_SUSPENDRESUME, +}; + +static int msm8905_pon_reboot_notify(struct notifier_block *nb, + unsigned long action, void *data) +{ + unsigned int ctl1 = 0; + unsigned int ctl2 = 0; + unsigned int rst_type; + + msm8905_torch_hw_disable(); + + if (!pon_regmap) + return NOTIFY_DONE; + + if (action == SYS_POWER_OFF || action == SYS_HALT) + rst_type = PON_POWER_OFF_SHUTDOWN; + else + rst_type = PON_POWER_OFF_WARM_RESET; + + /* + * Match Qualcomm qpnp_pon_system_pwr_off(): + * 1. Disable S2_CNTL_EN (bit 7 of 0x085b) + * 2. Wait >10 sleep clock cycles (~500 us) + * 3. Program PS_HOLD_RST_CTL (0x085a) to SHUTDOWN (0x04) or WARM_RESET (0x01) + * 4. Re-enable S2_CNTL_EN (bit 7 of 0x085b) and wait ~500 us + */ + if (regmap_read(pon_regmap, QPNP_PON_PS_HOLD_RST_CTL2, &ctl2) == 0) + regmap_write(pon_regmap, QPNP_PON_PS_HOLD_RST_CTL2, ctl2 & ~QPNP_PON_S2_CNTL_EN); + else + regmap_write(pon_regmap, QPNP_PON_PS_HOLD_RST_CTL2, 0x00U); + + udelay(500); + + if (regmap_read(pon_regmap, QPNP_PON_PS_HOLD_RST_CTL, &ctl1) == 0) + ctl1 = (ctl1 & ~QPNP_PON_RST_TYPE_MASK) | rst_type; + else + ctl1 = rst_type; + regmap_write(pon_regmap, QPNP_PON_PS_HOLD_RST_CTL, ctl1); + + udelay(500); + + regmap_write(pon_regmap, QPNP_PON_PS_HOLD_RST_CTL2, + (ctl2 & ~QPNP_PON_S2_CNTL_EN) | QPNP_PON_S2_CNTL_EN); + udelay(500); + + pr_info("leds-msm8905-torch: configured PM8909 PON PS_HOLD_RST_CTL=0x%02x for %s\n", + ctl1, (rst_type == PON_POWER_OFF_SHUTDOWN) ? "shutdown" : "reboot"); + return NOTIFY_OK; +} + +static struct notifier_block msm8905_pon_reboot_nb = { + .notifier_call = msm8905_pon_reboot_notify, + .priority = 128, +}; + +static void msm8905_pon_lookup_regmap(void) +{ + struct device_node *np; + struct platform_device *pon_pdev; + + np = of_find_compatible_node(NULL, NULL, "qcom,pm8916-pon"); + if (!np) + return; + + pon_pdev = of_find_device_by_node(np); + of_node_put(np); + if (!pon_pdev) + return; + + if (pon_pdev->dev.parent) + pon_regmap = dev_get_regmap(pon_pdev->dev.parent, NULL); + + put_device(&pon_pdev->dev); +} + +static int __init msm8905_torch_init(void) +{ + int ret; + + if (!of_machine_is_compatible("qcom,msm8905") && + !of_machine_is_compatible("qcom,msm8909") && + !of_machine_is_compatible("nokia,argon")) { + return -ENODEV; + } + + tlmm_gpio32_base = ioremap(MSM8905_TLMM_GPIO32_PHYS, MSM8905_TLMM_GPIO32_SIZE); + if (!tlmm_gpio32_base) + return -ENOMEM; + + gcc_camss_base = ioremap(MSM8905_GCC_CAMSS_PHYS, MSM8905_GCC_CAMSS_SIZE); + if (!gcc_camss_base) { + iounmap(tlmm_gpio32_base); + return -ENOMEM; + } + + msm8905_torch_hw_disable(); + + ret = led_classdev_register(NULL, &msm8905_torch_led); + if (ret) { + iounmap(gcc_camss_base); + iounmap(tlmm_gpio32_base); + return ret; + } + + msm8905_pon_lookup_regmap(); + register_reboot_notifier(&msm8905_pon_reboot_nb); + + pr_info("leds-msm8905-torch: registered white:torch on GPIO_32 (cci_timer1 150kHz PWM), pon_regmap=%s\n", + pon_regmap ? "ready" : "none"); + return 0; +} + +static void __exit msm8905_torch_exit(void) +{ + unregister_reboot_notifier(&msm8905_pon_reboot_nb); + led_classdev_unregister(&msm8905_torch_led); + msm8905_torch_hw_disable(); + iounmap(gcc_camss_base); + iounmap(tlmm_gpio32_base); +} + +module_init(msm8905_torch_init); +module_exit(msm8905_torch_exit); + +MODULE_DESCRIPTION("Qualcomm MSM8905 / Nokia 8110 4G SY7807 Torch LED & PM8909 PON Shutdown driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:leds-msm8905-torch");