Joachim Breitner wrote about a Convenient sandboxed development environment and thus reminded me to blog about MicroVM. I ve toyed around with it a little but not yet seriously used it as I m currently not coding.
MicroVM is a nix based project to configure and run minimal VMs. It can mount and thus reuse the hosts nix store inside the VM and thus has a very small disk footprint. I use MicroVM on a debian system using the nix package manager.
The MicroVM author uses the project to host production services. Otherwise I consider it also a nice way to learn about NixOS after having started with the nix package manager and before making the big step to NixOS as my main system.
The guests root filesystem is a tmpdir, so one must explicitly define folders that should be mounted from the host and thus be persistent across VM reboots.
I defined the VM as a nix flake since this is how I started from the MicroVM projects example:
description = "Haskell dev MicroVM";
inputs.impermanence.url = "github:nix-community/impermanence";
inputs.microvm.url = "github:astro/microvm.nix";
inputs.microvm.inputs.nixpkgs.follows = "nixpkgs";
outputs = self, impermanence, microvm, nixpkgs :
let
persistencePath = "/persistent";
system = "x86_64-linux";
user = "thk";
vmname = "haskell";
nixosConfiguration = nixpkgs.lib.nixosSystem
inherit system;
modules = [
microvm.nixosModules.microvm
impermanence.nixosModules.impermanence
( pkgs, ... :
environment.persistence.$ persistencePath =
hideMounts = true;
users.$ user =
directories = [
"git" ".stack"
];
;
;
environment.sessionVariables =
TERM = "screen-256color";
;
environment.systemPackages = with pkgs; [
ghc
git
(haskell-language-server.override supportedGhcVersions = [ "94" ]; )
htop
stack
tmux
tree
vcsh
zsh
];
fileSystems.$ persistencePath .neededForBoot = nixpkgs.lib.mkForce true;
microvm =
forwardPorts = [
from = "host"; host.port = 2222; guest.port = 22;
from = "guest"; host.port = 5432; guest.port = 5432; # postgresql
];
hypervisor = "qemu";
interfaces = [
type = "user"; id = "usernet"; mac = "00:00:00:00:00:02";
];
mem = 4096;
shares = [
# use "virtiofs" for MicroVMs that are started by systemd
proto = "9p";
tag = "ro-store";
# a host's /nix/store will be picked up so that no
# squashfs/erofs will be built for it.
source = "/nix/store";
mountPoint = "/nix/.ro-store";
proto = "virtiofs";
tag = "persistent";
source = "~/.local/share/microvm/vms/$ vmname /persistent";
mountPoint = persistencePath;
socket = "/run/user/1000/microvm-$ vmname -persistent";
];
socket = "/run/user/1000/microvm-control.socket";
vcpu = 3;
volumes = [];
writableStoreOverlay = "/nix/.rwstore";
;
networking.hostName = vmname;
nix.enable = true;
nix.nixPath = ["nixpkgs=$ builtins.storePath <nixpkgs> "];
nix.settings =
extra-experimental-features = ["nix-command" "flakes"];
trusted-users = [user];
;
security.sudo =
enable = true;
wheelNeedsPassword = false;
;
services.getty.autologinUser = user;
services.openssh =
enable = true;
;
system.stateVersion = "24.11";
systemd.services.loadnixdb =
description = "import hosts nix database";
path = [pkgs.nix];
wantedBy = ["multi-user.target"];
requires = ["nix-daemon.service"];
script = "cat $ persistencePath /nix-store-db-dump nix-store --load-db";
;
time.timeZone = nixpkgs.lib.mkDefault "Europe/Berlin";
users.users.$ user =
extraGroups = [ "wheel" "video" ];
group = "user";
isNormalUser = true;
openssh.authorizedKeys.keys = [
"ssh-rsa REDACTED"
];
password = "";
;
users.users.root.password = "";
users.groups.user = ;
)
];
;
in
packages.$ system .default = nixosConfiguration.config.microvm.declaredRunner;
;
I start the microVM with a templated systemd user service:
The above service definition creates a dump of the hosts nix store db so that it can be imported in the guest. This is necessary so that the guest can actually use what is available in /nix/store. There is an effort for an overlayed nix store that would be preferable to this hack.
Finally the microvm is started inside a tmux session named microvm . This way I can use the VM with SSH or through the console and also access the qemu console.
And for completeness the virtiofsd service:
[Unit]
Description=serve host persistent folder for dev VM
AssertPathIsDirectory=%h/.local/share/microvm/vms/%i/persistent
[Service]
ExecStart=%h/.local/state/nix/profile/bin/virtiofsd \
--socket-path=$ XDG_RUNTIME_DIR /microvm-%i-persistent \
--shared-dir=%h/.local/share/microvm/vms/%i/persistent \
--gid-map :995:%G:1: \
--uid-map :1000:%U:1:
I ended 2022 with a musical retrospective and very much enjoyed writing
that blog post. As such, I have decided to do the same for 2023! From now on,
this will probably be an annual thing :)
Albums
In 2023, I added 73 new albums to my collection nearly 2 albums every three
weeks! I listed them below in the order in which I acquired them.
I purchased most of these albums when I could and borrowed the rest at
libraries. If you want to browse though, I added links to the album covers
pointing either to websites where you can buy them or to Discogs when digital
copies weren't available.
Once again this year, it seems that Punk (mostly O !) and Metal dominate my
list, mostly fueled by Angry Metal Guy and the amazing Montr al
Skinhead/Punk concert scene.
Concerts
A trend I started in 2022 was to go to as many concerts of artists I like as
possible. I'm happy to report I went to around 80% more concerts in 2023 than
in 2022! Looking back at my list, April was quite a busy month...
Here are the concerts I went to in 2023:
March 8th: Godspeed You! Black Emperor
April 11th: Alexandra Str liski
April 12th: Bikini Kill
April 21th: Brigada Flores Magon, Union Thugs
April 28th: Komintern Sect, The Outcasts, Violent Way, Ultra Razzia, Over the
Hill
May 3rd: First Fragment
May 12th: Rhapsody of Fire, Wind Rose
May 13th: Aeternam
June 2nd: Mortier, La Gachette
June 17th: Ultra Razzia, Total Nada, BLEMISH
June 30th: Avishai Cohen Trio
July 9th: Richard Galliano
August 18th: Gojira, Mastodon, Lorna Shore
September 14th: Jinjer
September 22nd: CUIR, Salvaje Punk, Hysteric Polemix, Perestroika, Ultra Razzia, Ilusion, Over the Hill, Asbestos
October 6th: Rancoeur, Street Code, Tenaz, Mortimer, Guernica, High Anxiety
Although metalfinder continues to work as intended, I'm very glad to have
discovered the Montr al underground scene has departed from Facebook/Instagram
and adopted en masseGancio, a FOSS community agenda that supports
ActivityPub. Our local instance, askapunk.net
is pretty much all I could ask for :)
That's it for 2023!
Welcome to the September 2023 report from the Reproducible Builds project
In these reports, we outline the most important things that we have been up to over the past month. As a quick recap, whilst anyone may inspect the source code of free software for malicious flaws, almost all software is distributed to end users as pre-compiled binaries.
Andreas Herrmann gave a talk at All Systems Go 2023 titled Fast, correct, reproducible builds with Nix and Bazel . Quoting from the talk description:
You will be introduced to Google s open source build system Bazel, and will learn how it provides fast builds, how correctness and reproducibility is relevant, and how Bazel tries to ensure correctness. But, we will also see where Bazel falls short in ensuring correctness and reproducibility. You will [also] learn about the purely functional package manager Nix and how it approaches correctness and build isolation. And we will see where Bazel has an advantage over Nix when it comes to providing fast feedback during development.
Andreas also shows how you can get the best of both worlds and combine Nix and Bazel, too. A video of the talk is available.
diffoscope is our in-depth and content-aware diff utility that can locate and diagnose reproducibility issues. This month, Chris Lamb fixed compatibility with file(1) version 5.45 [] and updated some documentation []. In addition, Vagrant Cascadian extended support for GNU Guix [][] and updated the version in that distribution as well. [].
Yet another reminder that our upcoming Reproducible Builds Summit is set to take place from October 31st November 2nd 2023 in Hamburg, Germany.
If you haven t been before, our summits are a unique gathering that brings together attendees from diverse projects, united by a shared vision of advancing the Reproducible Builds effort. During this enriching event, participants will have the opportunity to engage in discussions, establish connections and exchange ideas to drive progress in this vital field.
If you re interested in joining us this year, please make sure to read the event page, the news item, or the invitation email that Mattia Rizzolo sent out recently, all of which have more details about the event and location.
We are also still looking for sponsors to support the event, so please reach out to the organising team if you are able to help. Also note that PackagingCon 2023 is taking place in Berlin just before our summit.
On the Reproducible Builds website, Greg Chabala updated the JVM-related documentation to update a link to the BUILDSPEC.md file. [] And Fay Stegerman fixed the builds failing because of a YAML syntax error.
Distribution work
In Debian, this month:
Debian bug #940234 was originally opened in September 2019 by Aurelien Jarno to request that Debian add a new requirement that repeatedly building the source package in the same environment produces identical .dsc file modulo the GPG signature . This month, however, Russ Allbery closed the bug due to concerns about the viability of source reproducibility.
Bastian Blank posted a mail to a number of Debian mailing lists titled Upcoming changes to Debian Linux kernel packages . Under Kernel modules will be signed with an ephemeral key, Bastian wrote: Yes, this will make the build unreproducible, but no better solution currently exists.
September saw F-Droid add ten new reproducible apps, and one existing app switched to reproducible builds. In addition, two reproducible apps were archived and one was disabled for a current total of 199 apps published with Reproducible Builds and using the upstream developer s signature. [] In addition, an extensive blog post was posted on f-droid.org titled Reproducible builds, signing keys, and binary repos .
Upstream patches
The Reproducible Builds project detects, dissects and attempts to fix as many currently-unreproducible packages as possible. We endeavour to send all of our patches upstream where appropriate. This month, we wrote a large number of such patches, including:
Since version 2.6.4, Composer (the PHP package manager) is now fully reproducible. See the work in the corresponding PR.
Testing framework
The Reproducible Builds project operates a comprehensive testing framework (available at tests.reproducible-builds.org) in order to check packages and other artifacts for reproducibility. In August, a number of changes were made by Holger Levsen:
Disable armhf and i386 builds due to Debian bug #1052257. [][][][]
Run diffoscope with a lower ionice priority. []
Log every build in a simple text file [] and create persistent stamp files when running diffoscope to ease debugging [].
Run schedulers one hour after dinstall again. []
Temporarily use diffoscope from the host, and not from a schroot running the tested suite. [][]
Fail the diffoscope distribution test if the diffoscope version cannot be determined. []
Fix a spelling error in the email to IRC gateway. []
Force (and document) the reconfiguration of all jobs, due to the recent rise of zombies. [][][][]
Deal with a rare condition when killing processes which should not be there. []
Install the Debian backports kernel in an attempt to address Debian bug #1052257. [][]
In addition, Mattia Rizzolo fixed a call to diffoscope --version (as suggested by Fay Stegerman on our mailing list) [], worked on an openQA credential issue [] and also made some changes to the machine-readable reproducible metadata, reproducible-tracker.json []. Lastly, Roland Clobus added instructions for manual configuration of the openQA secrets [].
If you are interested in contributing to the Reproducible Builds project, please visit our Contribute page on our website. However, you can get in touch with us via:
Welcome to the August 2023 report from the Reproducible Builds project!
In these reports we outline the most important things that we have been up to over the past month. As a quick recap, whilst anyone may inspect the source code of free software for malicious flaws, almost all software is distributed to end users as pre-compiled binaries.
The motivation behind the reproducible builds effort is to ensure no flaws have been introduced during this compilation process by promising identical results are always generated from a given source, thus allowing multiple third-parties to come to a consensus on whether a build was compromised. If you are interested in contributing to the project, please visit our Contribute page on our website.
The move has generated a fair amount of push back among developers who worry about its future legal and technical implications, along with a potential for supply chain attacks, should the maintainer account publishing these binaries be compromised.
[ ] an overview about reproducible builds, the past, the presence and the future. How it started with a small [meeting] at DebConf13 (and before), how it grew from being a Debian effort to something many projects work on together, until in 2021 it was mentioned in an executive order of the president of the United States. (HTML slides)
Reproducible Builds Summit
Just another reminder that our upcoming Reproducible Builds Summit is set to take place from October 31st November 2nd 2023 in Hamburg, Germany.
Our summits are a unique gathering that brings together attendees from diverse projects, united by a shared vision of advancing the Reproducible Builds effort. During this enriching event, participants will have the opportunity to engage in discussions, establish connections and exchange ideas to drive progress in this vital field.
If you re interested in joining us this year, please make sure to read the event page, the news item, or the invitation email that Mattia Rizzolo sent out, which have more details about the event and location.
We are also still looking for sponsors to support the event, so do reach out to the organizing team if you are able to help. (Also of note that PackagingCon 2023 is taking place in Berlin just before our summit, and their schedule has just been published.)
Vagrant Cascadian on the Sustain podcast
Vagrant Cascadian was interviewed on the SustainOSS podcast on reproducible builds:
Vagrant walks us through his role in the project where the aim is to ensure identical results in software builds across various machines and times, enhancing software security and creating a seamless developer experience. Discover how this mission, supported by the Software Freedom Conservancy and a broad community, is changing the face of Linux distros, Arch Linux, openSUSE, and F-Droid. They also explore the challenges of managing random elements in software, and Vagrant s vision to make reproducible builds a standard best practice that will ideally become automatic for users. Vagrant shares his work in progress and their commitment to the last mile problem.
Website updates
Rahul Bajaj updated our website to add a series of environment variations related to reproducible builds [], Russ Cox added the Go programming language to our projects page [] and Vagrant Cascadian fixed a number of broken links and typos around the website [][][].
Software development
In diffoscope development this month, versions 247, 248 and 249 were uploaded to Debian unstable by Chris Lamb, who also added documentation for the new specialize_as method and expanding the documentation of the existing specialize as well []. In addition, Fay Stegerman added specialize_as and used it to optimise .smali comparisons when decompiling Android .apk files [], Felix Yan and Mattia Rizzolo corrected some typos in code comments [,], Greg Chabala merged the RUN commands into single layer in the package s Dockerfile [] thus greatly reducing the final image size. Lastly, Roland Clobus updated tool descriptions to mark that the xb-tool has moved package within Debian [].
reprotest is our tool for building the same source code twice in different environments and then checking the binaries produced by each build for any differences. This month, Vagrant Cascadian updated the packaging to be compatible with Tox version 4. This was originally filed as Debian bug #1042918 and Holger Levsen uploaded this to change to Debian unstable as version 0.7.26 [].
Upstream patches
The Reproducible Builds project detects, dissects and attempts to fix as many currently-unreproducible packages as possible. We endeavour to send all of our patches upstream where appropriate. This month, we wrote a large number of such patches, including:
Testing framework
The Reproducible Builds project operates a comprehensive testing framework (available at tests.reproducible-builds.org) in order to check packages and other artifacts for reproducibility. In August, a number of changes were made by Holger Levsen:
Disable Debian live image creation jobs until an OpenQA credential problem has been fixed. []
Run our maintenance scripts every 3 hours instead of every 2. []
Export data for unstable to the reproducible-tracker.json data file. []
Stop varying the build path, we want reproducible builds. []
Temporarily stop updating the pbuilder.tgz for Debian unstable due to #1050784. [][]
Correctly document that we are not variying usrmerge. [][]
Mark two armhf nodes (wbq0 and jtx1a) as down; investigation is needed. []
Misc:
Force reconfiguration of all Jenkins jobs, due to the recent rise of zombie processes. []
In the node health checks, also try to restart failed ntpsec, postfix and vnstat services. [][][]
System health checks:
Detect Debian live build failures due to missing credentials. [][]
Ignore specific types of known zombie processes. [][]
In addition, Vagrant Cascadian updated the scripts to use a predictable build path that is consistent with the one used on buildd.debian.org. [][]
If you are interested in contributing to the Reproducible Builds project, please visit our Contribute page on our website. However, you can get in touch with us via:
This is a short announcement to say that I have changed my main
OpenPGP key. A signed statement is available with the
cryptographic details but, in short, the reason is that I stopped
using my old YubiKey NEO that I have worn on my keyring since
2015.
I now have a YubiKey 5 which supports ED25519 which features much
shorter keys and faster decryption. It allowed me to move all my
secret subkeys on the key (including encryption keys) while retaining
reasonable performance.
I have written extensive documentation on how to do that OpenPGP key
rotation and also YubiKey OpenPGP operations.
Warning on storing encryption keys on a YubiKey
People wishing to move their private encryption keys to such a
security token should be very careful as there are special
precautions to take for disaster recovery.
I am toying with the idea of writing an article specifically about
disaster recovery for secrets and backups, dealing specifically with
cases of death or disabilities.
Autocrypt changes
One nice change is the impact on Autocrypt headers, which are
considerably shorter.
Before, the header didn't even fit on a single line in an email, it
overflowed to five lines:
Note that I have implemented my own kind of ridiculous Autocrypt
support for the NotmuchEmacs email client I use, see this
elisp code. To import keys, I pipe the message into this
script which is basically just:
sq autocrypt decode gpg --import
... thanks to Sequoia best-of-class Autocrypt support.
Note on OpenPGP usage
While some have claimed OpenPGP's death, I believe those are
overstated. Maybe it's just me, but I still use OpenPGP for my
password management, to authenticate users and messages, and it's the
interface to my YubiKey for authenticating with SSH servers.
I understand people feel that OpenPGP is possibly insecure,
counter-intuitive and full of problems, but I think most of those
problems should instead be attributed to its current flagship
implementation, GnuPG. I have tried to work with GnuPG for years, and
it keeps surprising me with evilness and oddities.
I have high hopes that the Sequoia project can bring some sanity
into this space, and I also hope that RFC4880bis can eventually
get somewhere so we have a more solid specification with more robust
crypto. It's kind of a shame that this has dragged on for so
long, but Update: there's a separate draft called
openpgp-crypto-refresh that might actually be adopted as the
"OpenPGP RFC" soon! And
it doesn't keep real work from happening in Sequoia and other
implementations. Thunderbird rewrote their OpenPGP implementation with
RNP (which was, granted, a bumpy road because it lost
compatibility with GnuPG) and Sequoia now has a certificate store
with trust management (but still no secret storage), preliminary
OpenPGP card support and even a basic GnuPG compatibility
layer. I'm also curious to try out the OpenPGP CA
capabilities.
So maybe it's just because I'm becoming an old fart that doesn't want
to change tools, but so far I haven't seen a good incentive in
switching away from OpenPGP, and haven't found a good set of tools
that completely replace it. Maybe OpenSSH's keys and CA can eventually
replace it, but I suspect they will end up rebuilding most of OpenPGP
anyway, just more slowly. If they do, let's hope they avoid the
mistakes our community has done in the past at least...
(TL;DR: I ve been trying out btrfs in some places instead of ext4, I ve hit absolutely zero issues and there are a few features that make me plan to use it more.)
Despite (or perhaps because of) working on storage products for a reasonable chunk of my career I have tended towards a conservative approach to my filesystems. By the time I came to Linux ext2 was well established, the move to ext3 was a logical one (the joys of added journalling for faster recovery after unclean shutdowns) and for a long time my default stack has been MD raid with LVM2 on top and then ext4 as the filesystem.
I ve dabbled with other filesystems; I ran XFS for a while on my VDR machine, and also when I had a large tradspool with INN, but never really had a hard requirement for it. I ve ended up adminning a machine that had JFS in the past, largely for historical reasons, but don t really remember any issues (vague recollections of NFS problems but that might just have been NFS being NFS).
However. ZFS has gathered itself a significant fan base and that makes me wonder about what it can offer and whether I want that. Firstly, let s be clear that I m never going to run a primary filesystem that isn t part of the mainline kernel. So ZFS itself is out, because I run Linux. So what do I want that I can t get with ext4? Firstly, I d like data checksumming. As storage gets larger there s a bigger chance of silent data corruption and while I have backups of the important stuff that doesn t help if you don t know you need to use them. Secondly, these days I have machines running containers, VMs, or with lots of source checkouts with a reasonable amount of overlap in their data. Disk space has got cheaper, but I d still like to be able to do some sort of deduplication of common blocks.
So, I ve been trying out btrfs. When I installed my desktop I went with btrfs for / and /home (I kept /boot as ext4). The thought process was that this was a local machine (so easy access if it all went wrong) and I take regular backups (so if it all went wrong I could recover). That was a year and a half ago and it s been pretty dull; I mostly forget I m running btrfs instead of ext4. This is on a machine that tracks Debian testing, so currently on kernel 6.1 but originally installed with 5.10. So it seems modern btrfs is reasonably stable for a machine that isn t driven especially hard. Good start.
The fact I forget what filesystem I m running points to the fact that I m not actually doing anything special here. I get the advantage of data checksumming, but not much else. 2 things spring to mind. Firstly, I don t do snapshots. Given I run testing it might be wiser if I did take a snapshot before every apt-get upgrade, and I have a friend who does just that, but even when I ve run unstable I ve never had a machine get itself into a state that I couldn t recover so I haven t spent time investigating. I note Ubuntu has apt-btrfs-snapshot but it doesn t seem to have any updates for years.
The other thing I didn t do when I installed my desktop is take advantage of subvolumes. I m still trying to get my head around exactly what I want them for, but they provide a partial replacement for LVM when it comes to carving up disk space. Instead of the separate / and /home LVs I created I could have created a single LV that would have a single btrfs filesystem on it. / and /home would then be separate subvolumes, allowing me to snapshot each individually. Quotas can also be applied separately so there s still the potential to prevent one subvolume taking all available space.
Encouraged by the lack of hassle with my desktop I decided to try moving my sbuild machine over to use btrfs for its build chroots. For Reasons this is a VM kindly hosted by a friend, rather than something local. To be honest these days I would probably go for local hosting, but it works and there s no strong reason to move. The point is it s remote, and so if migrating went wrong and I had to ask for assistance I d be bothering someone who s doing me a favour as it is.
The build VM is, of course, running LVM, and there was luckily some free space available. I m reasonably sure the underlying storage involves spinning rust, so I did a laborious set of pvmove commands to make sure all the available space was at the start of the PV, and created a new btrfs volume there. I was advised that while btrfs-convert would do the job it was better to create a fresh filesystem where possible. This time I did create an initial root subvolume.
Configuring up sbuild was then much simpler than I d expected. My setup originally started out as a set of tarballs for the chroots that would get untarred + used for the builds, which is pretty slow. Once overlayfs was mature enough I switched to that. I d had a conversation with Enrico about his nspawn/btrfs setup, but it turned out Russ Allbery had written an excellent set of instructions on sbuild with btrfs. I tweaked my existing setup based on his details, and I was in business. Each chroot is a separate subvolume - I don t actually end up having to mount them individually, but it means that only the chroot in use gets snapshotted. For example during a build the following can be observed:
# btrfs subvolume list /
ID 257 gen 111534 top level 5 path root
ID 271 gen 111525 top level 257 path srv/chroot/unstable-amd64-sbuild
ID 275 gen 27873 top level 257 path srv/chroot/bullseye-amd64-sbuild
ID 276 gen 27873 top level 257 path srv/chroot/buster-amd64-sbuild
ID 343 gen 111533 top level 257 path srv/chroot/snapshots/unstable-amd64-sbuild-328059a0-e74b-4d9f-be70-24b59ccba121
I was a little confused about whether I d got something wrong because the snapshot top level is listed as 257 rather than 271, but digging further with btrfs subvolume show on the 2 mounted directories correctly showed the snapshot had a parent equal to the chroot, not /.
As a final step I ran jdupes via jdupes -1Br / to deduplicate things across the filesystem. It didn t end up providing a significant saving unfortunately - I guess there s a reasonable amount of change between Debian releases - but I think tried it on my desktop, which tends to have a large number of similar source trees checked out. There I managed to save about 5% on /home, which didn t seem too shabby.
The sbuild setup has been in place for a couple of months now, and I ve run quite a few builds on it while preparing for the freeze. So I m fairly confident in the stability of the setup and my next move is to transition my local house server over to btrfs for its containers (which all run under systemd-nspawn). Those are generally running a Debian stable base so there should be a decent amount of commonality for deduping.
I m not saying I m yet at the point where I ll default to btrfs on new installs, but I m definitely looking at it for situations where I think I can get benefits from deduplication, or being able to divide up disk space without hard partitioning space.
(And, just to answer the worry I had when I started, I ve got nowhere near ENOSPC problems, but I believe they re handled much more gracefully these days. And my experience of ZFS when it got above 90% utilization was far from ideal too.)
Advent of Code, for those not in the know,
is a yearly Advent calendar (since 2015) of coding puzzles many people
participate in for a plenary of reasons ranging from speed coding to code
golf with stops at learning a new language or practicing already known
ones.
I usually write boring C++, but any language and then some can be used.
There are reports of people implementing it in hardware, solving them by
hand on paper or using Microsoft Excel
so, after solving a puzzle the easy way yesterday, this time
I thought: CHALLENGE ACCEPTED! as I somehow remembered an old 2008
article about solving Sudoku with aptitude
(Daniel Burrows via archive.org as the blog is long gone)
and the good same old a package management system that can solve [puzzles] based on package dependency rules is not something that I think would be useful or worth having (Russell Coker).
Day 8 has a rather lengthy
problem description and can reasonably be approached in a bunch of
different way. One unreasonable approach might be to massage the
problem description into Debian packages and let apt help me solve the
problem (specifically Part 2, which you unlock by solving Part 1. You
can do that now, I will wait here.)
Be warned: I am spoiling Part 2 in the following, so solve it yourself
first if you are interested.
I will try to be reasonable consistent in naming things in the following
and so have chosen: The input we get are lines like acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab cdfeb fcadb cdfeb cdbaf.
The letters are wires mixed up and connected to the segments of the
displays: A group of these letters is hence a digit (the first 10)
which represent one of the digits 0 to 9 and (after the pipe) the four
displays which match (after sorting) one of the digits which means
this display shows this digit. We are interested in which digits are
displayed to solve the puzzle. To help us we also know which segments
form which digit, we just don't know the wiring in the back.
So we should identify which wire maps to which segment!
We are introducing the packages wire-X-connects-to-Y for this which
each provide & conflict1 with the virtual packages segment-Y and
wire-X-connects.
The later ensures that for a given wire we can only pick one segment and
the former ensures that not multiple wires map onto the same segment.
As an example: wire a's possible association with segment b is
described as:
Note that we do not know if this is true! We generate packages for
all possible (and then some) combinations and hope dependency resolution
will solve the problem for us. So don't worry, the hard part will be
done by apt, we just have to provide all (im)possibilities!
What we need now is to translate the 10 digits (and 4 outputs) from
something like acedgfb into digit-0-is-eight and not, say
digit-0-is-one. A clever solution might realize that a one consists
only of two segments so a digit wiring up seven segments can not be
a 1 (and must be 8 instead), but again we aren't here to be clever:
We want apt to figure that out for us! So what we do is simply making
every digit-0-is-N (im)possible choice available as a package and
apply constraints: A given digit-N can only display one number and
each N is unique as digit so for both we deploy Provides
& Conflicts again.
We also need to reason about the segments in the digits: Each of the
digit packages gets Depends on wire-X-connects-to-Y where X is each
possible wire (e.g. acedgfb) and Y each segment forming the digit
(e.g. cf for one). The different choices for X are or'ed together,
so that either of them satisfies the Y.
We know something else too through: The segments which are not used by
the digit can not be wired to any of the Xs. We model this with
Conflicts on wire-X-connects-to-Y.
As an example: If digit-0s acedgfb would be displaying a one
(remember, it can't) the following package would be installable:
Repeat such stanzas for all 10 possible digits for digit-0 and then
repeat this for all the other nine digit-N. We produce pretty much the
same stanzas for display-0(-is-one), just that we omit the second
Provides & Conflicts from above (digit-is-one) as in the display
digits can be repeated. The rest is the same (modulo using display
instead of digit as name of course).
Lastly we create a package dubbed solution which depends on all 10
digit-N and 4 display-N all of them virtual packages apt will have
to choose an installable provider from and we are nearly done!
The resulting Packages file2 we can give to apt while requesting to
install the package solution and it will spit out not only the display
values we are interested in but also which number each digit represents
and which wire is connected to which segment. Nifty!
$ ./skip-aoc 'acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab cdfeb fcadb cdfeb cdbaf'
[ ]
The following additional packages will be installed:
digit-0-is-eight digit-1-is-five digit-2-is-two digit-3-is-three
digit-4-is-seven digit-5-is-nine digit-6-is-six digit-7-is-four
digit-8-is-zero digit-9-is-one display-1-is-five display-2-is-three
display-3-is-five display-4-is-three wire-a-connects-to-c
wire-b-connects-to-f wire-c-connects-to-g wire-d-connects-to-a
wire-e-connects-to-b wire-f-connects-to-d wire-g-connects-to-e
[ ]
0 upgraded, 22 newly installed, 0 to remove and 0 not upgraded.
We are only interested in the numbers on the display through, so grepping
the apt output (-V is our friend here) a bit should let us end up with
what we need as calculating3 is (unsurprisingly) not a strong suit of
our package relationship language so we need a few shell commands to
help us with the rest.
$ ./skip-aoc 'acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab cdfeb fcadb cdfeb cdbaf' -qq
5353
I have written the skip-aoc script as a testcase for apt,
so to run it you need to place it in
/path/to/source/of/apt/test/integration and built apt first, but that
is only due to my laziness. We could write a standalone script
interfacing with the system installed apt directly and in any apt
version since
~2011.
To hand in the solution for the puzzle we just need to run this on each
line of the input (~200 lines) and add all numbers together. In other
words: Behold this beautiful shell one-liner:
parallel -I ' ' ./skip-aoc ' ' -qq < input.txt paste -s -d'+' - bc
(You may want to run parallel with -P to properly grill your CPU as
that process can take a while otherwise and it still does anyhow as
I haven't optimized it at all the testing framework does a lot of
pointless things wasting time here, but we aren't aiming for the
leaderboard so )
That might or even likely will fail through as I have so far omitted a
not unimportant detail: The default APT resolver is not able to solve
this puzzle with the given problem description we need another solver!
Thankfully that is as easy as installing apt-cudf (and with it aspcud)
which the script is using via --solver aspcud to make apt hand over the
puzzle to a "proper" solver (or better: A solver who is supposed to be
good at "answering set" questions). The buildds are using this for
experimental and/or backports builds and also for installability checks
via dose3 btw, so you might have encountered it before.
Be careful however: Just because aspcud can solve this puzzle doesn't
mean it is a good default resolver for your day to day apt. One of the
reasons the default resolver has such a hard time solving this here is
that or-groups have usually an order in which the first is preferred over
every later option and so fort. This is of no concern here as all these
alternatives will collapse to a single solution anyhow, but if there are
multiple viable solutions (which is often the case) picking the "wrong"
alternative can have bad consequences. A classic example would be
exim4 postfix nullmailer. They are all MTAs
but behave very different. The non-default solvers also tend to lack
certain features like keeping track of auto-installed packages or
installing Recommends/Suggests. That said, Julian is working on
another solver
as I write this which might deal with more of these issues.
And lastly: I am also relatively sure that with a bit of massaging the
default resolver could be made to understand the problem, but I can't
play all day with this maybe some other day.
Disclaimer: Originally posted in the daily megathread
on reddit, the version here is just slightly better understandable as
I have hopefully renamed all the packages to have more conventional
names and tried to explain what I am actually doing.
No cows were harmed in this improved version, either.
If you would upload those packages somewhere, it would be good
style to add Replaces as well, but it is of minor concern for apt
so I am leaving them out here for readability.
We have generated 49 wires, 100 digits, 40 display and 1 solution
package for a grant total of 190 packages. We are also making use of
a few purely virtual ones, but that doesn't add up to many packages
in total. So few packages are practically childs play for apt given it
usually deals with thousand times more. The instability for those
packages tends to be a lot better through as only 22 of 190 packages
we generated can (and will) be installed. Britney will hate you if
your uploads to Debian unstable are even remotely as bad as this.
What we could do is introduce 10.000 packages which denote every
possible display value from 0000 to 9999. We would then need to
duplicate our 10.190 packages for each line (namespace them) and then
add a bit more than a million packages with the correct dependencies
for summing up the individual packages for apt to be able to display
the final result all by itself. That would take a while through as at
that point we are looking at working with ~22 million packages with
a gazillion amount of dependencies probably overworking every solver
we would throw at it a bit of shell glue seems the better option for
now.
This article was written by David Kalnischkies on apt-get a life and republished here by pulling it from a syndication feed. You should check there for updates and more articles about apt and EDSP.
This post is part of a series called "PACKRAT". If this is the first post
you've found, it'd be worth reading the
intro post first and then looking over
all posts in the series.
When working with SDRs, information about the signals your radio is receiving
are communicated by streams of
IQ
data. IQ is short for In-phase and Quadrature , which means 90 degrees
out of phase. Values in the IQ stream are
complex numbers, so
converting them to a native complex type in your language
helps greatly when processing the IQ data for meaning.
I won t get too deep into what IQ is or why complex numbers (mostly since I
don t think I fully understand it well enough to explain it yet), but here s
some basics in case this is your first interaction with IQ data before
going off and reading more.
Before we get started
at any point, if you feel lost in this post, it's OK to take a break to do
a bit of learning elsewhere in the internet. I'm still new to this, so I'm
sure my overview in one paragraph here won't help clarify things too much.
This took me months to sort out on my own. It's not you, really! I particularly
enjoyed reading
visual-dsp.switchb.org
when it came to learning about how IQ represents signals, and
Software-Defined Radio for Engineers
for a more general reference.
Each value in the stream is taken at a precisely spaced sampling interval
(called the sampling rate of the radio). Jitter in that sampling interval, or a
drift in the requested and actual sampling rate (usually represented in PPM, or
parts per million how many samples out of one million are missing) can cause
errors in frequency. In the case of a PPM error, one radio may think it s
100.1MHz and the other may think it s 100.2MHz, and jitter will result in added
noise in the resulting stream.
A single IQ sample is both the real and imaginary values, together. The complex
number (both parts) is the sample. The number of samples per second is the
number of real and imaginary value pairs per second.
Each sample is reading the electrical energy coming off the antenna at that
exact time instant. We re looking to see how that goes up and down over time to
determine what frequencies we re observing around us. If the IQ stream is only
real-valued measures (e.g., float values rather than complex values reading
voltage from a wire), you can still send and receive signals, but those signals
will be mirrored across your 0Hz boundary. That means if you re tuned to
100MHz, and you have a nearby transmitter at 99.9MHz, you d see it at 100.1MHz.
If you want to get an intuitive understanding of this concept before getting
into the heavy math, a good place to start is looking at how Quadrature
encoders
work. Using complex numbers means we can see up in frequency as well as
down in frequency, and understand that those are different signals.
The reason why we need negative frequencies is that our 0Hz is the center of
our SDR s tuned frequency, not actually at 0Hz in nature. Generally speaking,
it s doing loads in hardware (and firmware!) to mix the raw RF signals with a
local oscillator to a frequency that can be sampled at the requested rate
(fundamentally the same concept as a superheterodyne
receiver), so a
frequency of -10MHz means that signal is 10 MHz below the center of our SDR s
tuned frequency.
The sampling rate dictates the amount of frequency representable in the data
stream. You ll sometimes see this called the
Nyquist frequency. The Nyquist
Frequency is one half of the sampling rate. Intuitively, if you think about the
amount of bandwidth observable as being 1:1 with the sampling rate of the stream,
and the middle of your bandwidth is 0 Hz, you would only have enough space to
go up in frequency for half of your bandwidth or half of your sampling rate.
Same for going down in frequency.
Float 32 / Complex 64
IQ samples that are being processed by software are commonly processed as
an interleaved pair of 32 bit floating point numbers, or a 64 bit complex
number. The first float32 is the real value, and the second is the imaginary
value.
I#0
Q#0
I#1
Q#1
I#2
Q#2
The complex number 1+1i is represented as 1.0 1.0 and the complex number
-1-1i is represented as -1.0 -1.0. Unless otherwise specified, all the
IQ samples and pseudocode to follow assumes interleaved float32 IQ data
streams.
Example interleaved float32 file (10Hz Wave at 1024 Samples per Second)
RTL-SDR
IQ samples from the RTL-SDR are encoded as a stream of interleaved unsigned
8 bit integers (uint8 or u8). The first sample is the real (in-phase or I)
value, and the second is the imaginary (quadrature or Q) value. Together each
pair of values makes up a complex number at a specific time instant.
I#0
Q#0
I#1
Q#1
I#2
Q#2
The complex number 1+1i is represented as 0xFF 0xFF and the complex number
-1-1i is represented as 0x00 0x00. The complex number 0+0i is not easily
representable since half of 0xFF is 127.5.
Complex Number
Representation
1+1i
[]uint8 0xFF, 0xFF
-1+1i
[]uint8 0x00, 0xFF
-1-1i
[]uint8 0x00, 0x00
0+0i
[]uint8 0x80, 0x80 or []uint8 0x7F, 0x7F
And finally, here s some pseudocode to convert an rtl-sdr style IQ sample
to a floating point complex number:
HackRF
IQ samples from the HackRF are encoded as a stream of interleaved signed
8 bit integers (int8 or i8). The first sample is the real (in-phase or I)
value, and the second is the imaginary (quadrature or Q) value. Together each
pair of values makes up a complex number at a specific time instant.
I#0
Q#0
I#1
Q#1
I#2
Q#2
Formats that use signed integers do have one quirk due to
two s complement,
which is that the smallest negative number representable s absolute
value is one more than the largest positive number. int8 values can
range between -128 to 127, which means there s bit of ambiguity in
how +1, 0 and -1 are represented. Either you can create perfectly symmetric
ranges of values between +1 and -1, but 0 is not representable, have more
possible values in the negative range, or allow values above (or just below)
the maximum in the range to be allowed.
Within my implementation, my approach has been to scale based on the max
integer value of the type, so the lowest possible signed value is actually
slightly smaller than -1. Generally, if your code is seeing values that low
the difference in step between -1 and slightly less than -1 isn t very
significant, even with only 8 bits. Just a curiosity to be aware of.
Complex Number
Representation
1+1i
[]int8 127, 127
-1+1i
[]int8 -128, 127
-1-1i
[]int8 -128, -128
0+0i
[]int8 0, 0
And finally, here s some pseudocode to convert a hackrf style IQ sample to a
floating point complex number:
PlutoSDR
IQ samples from the PlutoSDR are encoded as a stream of interleaved signed
16 bit integers (int16 or i16). The first sample is the real (in-phase or I)
value, and the second is the imaginary (quadrature or Q) value. Together each
pair of values makes up a complex number at a specific time instant.
Almost no SDRs capture at a 16 bit depth natively, often you ll see 12 bit
integers (as is the case with the PlutoSDR) being sent around as 16 bit
integers. This leads to the next possible question, which is are values LSB
or MSB aligned? The PlutoSDR sends data LSB aligned (which is to say, the
largest real or imaginary value in the stream will not exceed 4095), but
expects data being transmitted to be MSB aligned (which is to say the lowest
set bit possible is the 5th bit in the number, or values can only be set in
increments of 16).
As a result, the quirk observed with the HackRF (that the range of values
between 0 and -1 is different than the range of values between 0 and +1) does
not impact us so long as we do not use the whole 16 bit range.
Complex Number
Representation
1+1i
[]int16 32767, 32767
-1+1i
[]int16 -32768, 32767
-1-1i
[]int16 -32768, -32768
0+0i
[]int16 0, 0
And finally, here s some pseudocode to convert a PlutoSDR style IQ sample to a
floating point complex number, including moving the sample from LSB to MSB
aligned:
...in = []int16-15072, 496// shift left 4 bits (16 bits - 12 bits = 4 bits)
// to move from LSB aligned to MSB aligned.
in[0] = in[0] <<4in[1] = in[1] <<4real = (float(in[0]))/32767imag = (float(in[1]))/32767out = complex(real, imag)
....
Next Steps
Now that we can read (and write!) IQ data, we can get started first on the
transmitter, which we can (in turn) use to test receiving our own BPSK signal,
coming next in Part 2!
Active noise cancellation (ANC) has been all the rage lately in the headphones
and in-ear monitors market. It seems after Apple got heavily praised for their
AirPods Pro, every somewhat serious electronics manufacturer released their
own design incorporating this technology.
The first headphones with ANC I remember trying on (in the early 2010s) were
the Bose QuietComfort 15. Although the concept did work (they indeed cancelled
some sounds), they weren't amazing and did a great job of convincing me ANC
was some weird fad for people who flew often.
As the years passed, chip size decreased, battery capacity improved and machine
learning blossomed truly a perfect storm for the wireless ANC headphones
market. I had mostly stayed a sceptic of this tech until recently a kind friend
offered to let me try a pair of Sony WH-1000X M3.
Having tested them thoroughly, I have to say I'm really tempted to buy them
from him, as they truly are fantastic headphones1. They are
very light, comfortable, work without a proprietary app and sound very good
with the ANC on2 if a little bass-heavy for my taste3.
The ANC itself is truly astounding and is leaps and bounds beyond what was
available five years ago. It still isn't perfect and doesn't cancel ALL sounds,
but transforms the low hum of the subway I find myself sitting in too often
these days into a light *swoosh*. When you turn the ANC on, HVAC simply
disappears. Most impressive to me is the way they completely cancel the dreaded
sound of your footsteps resonating in your headphones when you walk with them.
I won't be keeping them though.
Whilst I really like what Sony has achieved here, I've grown to understand ANC
simply isn't for me. Some of the drawbacks of ANC somewhat bother me: the ear
pressure it creates is tolerable, but is an additional energy drain over long
periods of time and eventually gives me headaches. I've also found ANC
accentuates the motion sickness I suffer from, probably because it messes up
with some part of the inner ear balance system.
Most of all, I found that it didn't provide noticeable improvements over good
passive noise cancellation solutions, at least in terms of how high I have to
turn the volume up to hear music or podcasts clearly. The human brain works in
mysterious ways and it seems ANC cancelling a class of noises (low hums,
constant noises, etc.) makes other noises so much more noticeable. People
talking or bursty high pitched noises bothered me much more with ANC on than
without.
So for now, I'll keep using my trusty Senheiser HD 280 Pro4 at work
and good in-ear monitors with Comply foam tips on the go.
This blog post certainly doesn't aim to be a comprehensive
review of these headphones. See Zeos' review if you want something
more in-depth.
As most ANC headphones, they don't sound as good when used
passively through the 3.5mm port, but that's just a testament of how a great
job Sony did of tuning the DSP.
Easily fixed using an EQ.
Retrofitted with aftermarket sheepskin earpads, they provide more
than 32db of passive noise reduction.
So I had another major email crash
with my syncmaildirsetup. This time I was at
least able to confirm the issue, and I still haven't lost mail thanks
to backups and sheer luck (again).
The crash
It is not really worth going over the crash in details, it's fairly
similar to the last one: something bad happened and smd started
destroying everything. The hint is that it takes a long time to do
what usually takes seconds. It helps that I now have a second monitor
showing logs.
I still lost much more mail than the last time. I used to have "301
723 messages", according to notmuch. But then when I ran smd-pull
by hand, it was telling me:
95K emails scanned
Oops. You can see notmuch happily noticing the destroyed files on
the server:
jun 28 16:33:40 marcos notmuch[28532]: No new mail. Removed 65498 messages. Detected 1699 file renames.
jun 28 16:36:05 marcos notmuch[29746]: No new mail. Removed 68883 messages. Detected 2488 file renames.
jun 28 16:41:40 marcos notmuch[31972]: No new mail. Removed 118295 messages. Detected 3657 file renames.
The final count ended up being 81 042 messages, according to
notmuch. A whopping 220 000 mails deleted.
The interesting bit, this time around, is that I caught smd in the act
of running two processes in parallel:
jun 28 16:30:09 curie systemd[2845]: Finished pull emails with syncmaildir.
jun 28 16:30:09 curie systemd[2845]: Starting push emails with syncmaildir...
jun 28 16:30:09 curie systemd[2845]: Starting pull emails with syncmaildir...
On marcos (the server), guessed the number of messages delivered since
the last backup to be 71, just looking at timestamps in the mail
log. Made a list:
This brought me back to the state after the backup plus the mails
delivered during the day, which means I had to catchup with all my
holiday's read emails (1440 mails!) but thankfully I made a dump of
the notmuch database on curie at the start of the procedure, so this
actually restored a sane state:
pv notmuch.dump notmuch restore
Phew!
Workaround
I have filed this as a bug in upstream issue 18. Considering I
filed 11 issues and only 3 of those were closed, I'm not holding my
breath. I nevertheless filed PR 19 in the hope that this will fix
my particular issue, but I'm not even sure this is the right
fix...
Fix
At this point, I'm really ready to give up on SMD. It's really, really
nice to be able to sync mail over SSH because I don't need to store my
IMAP password on disk. But surely there are more reliable syncing
mechanisms. I do not remember ever losing that much mail before. At
worst, offlineimap would duplicate emails like mad, but never destroy
my entire mail spool that way.
As mentioned
before, there
are other programs that sync mail. I'm looking at:
offlineimap3: requires IMAP, used the py2 version in the past,
might just still work, first sync painful (IIRC), ways to tunnel
over SSH, see comment below
isync/mbsync: might be faster, I remember having trouble
switching from offlineimap to this, has support for TLS client
certs, running over SSH, and generally has good words from multiple
Debian and notmuch people
getmail: just downloads email, might not be enough
nncp: treat the local spool as another mail server, might not
be compatible with my "multiple clients" setup
doveadm-sync: requires dovecot on both ends, but supports
using SSH to sync, will try this next, may have
performance problems, see comment below
interimap: syncs two IMAP servers, apparently faster than
doveadm and offlineimap
mail-sync: notify support, happens over any piped transport
(e.g. ssh), diff/patch system, requires binary on both ends,
mentions UUCP in the manpage, seems awfully complicated to setup,
mentions rsmtp which is a nice name for rsendmail
In the last few months I presented several talks. Topics ranged from a round table on free
software, to sharing some of my work as SRE in the Cloud Services team at the Wikimedia Foundation.
For some of them the videos are now published, so I would like to write a reference here, mostly as
a way to collect such events for my own record. Isn t that what a blog is all about, after
all?
Before you continue reading, let me mention that the two talks I ll reference were given in my
native Spanish. The videos are hosted on YouTube and autogenerated subtitles should be available,
with doubtful quality though. Also, there was at least one additional private talk that I m not
allowed to comment on here today.
I was invited to participate in a Docker community event called Kroquecon, which was
aimed at pushing the spanish-speaking Kubernetes community around the world. The event name is a
word play with Kubernetes , conference and croqueta , typical Spanish food. The talk happened
on 2021-04-29, and I was part of a round table about free software, communities and how to join and
participate in such projects. I commented on my experience in both the Debian project, Netfilter
and my several years in Google Summer of Code (3 as student, 2 as mentor).
Video of the event:
The other event was the CNCF-supported Kubernetes Community Days Spain (KCD Spain). During
Kroquecon I was encouraged to submit a talk proposal for this event, to talk about something
related to our use of Kubernetes in the Wikimedia Cloud Services team at the Wikimedia Foundation.
The proposal was originally rejected. Then, a couple of weeks before the event itself, I was
contacted by the organizers with a greenlight to give it because the other speaker couldn t make
it. My coworker David Caro joined me in the presentation. It was titled Conoce Wikimedia
Toolforge, plataforma basada en Kubernetes (or Meet Wikimedia Toolforge, Kubernetes-based
platform ).
We explained what Wikimedia Cloud Services is, focusing on Toolforge, and in particular how we use
Kubernetes to enable the platform s most interesting use cases. We covered several interesting
topics, including how we handle multi-tenancy, or the problems we had with the etcd & ceph combo.
The slides we used are available.
Video of the event:
I ve mentioned in the past my twisted EE network setup from when I moved in to my current house. The 4GEE WiFi Mini (also known as the EE Osprey 2 Mini or the EE40VB, and actually a rebadged Alcatel Y853VB) has been sitting unused since then, so I figured I d see about trying to get a shell on it.
TL;DR: Of course it s running Linux, there s a couple of test points internally which bring out the serial console, but after finding those and logging in I discovered it s running ADB on port 5555 quite happily available without authentication both via wifi and the USB port. So if you have physical or local network access, instant root shell. Well done, folks. And then I bricked it before I could do anything more interesting.
There s a lack of information about this device out there - most of the links I can find are around removing the SIM lock - so I thought I d document the pieces I found just in case anyone else is trying to figure it out. It s based around a Qualcomm MDM9607 SoC, paired with 64M RAM and 256M NAND flash. Wifi is via an RTL8192ES. Kernel is 3.18.20. Busybox is v1.23.1. It s running dnsmasq but I didn t grab the version. Of course there s no source or offer of source provided.
Taking it apart is fairly easy. There s a single screw to remove, just beside the SIM slot. The coloured rim can then be carefully pried away from the back, revealing the battery. There are then 4 screws in the corners which need removed in order to be able to lift out the actual PCB and gain access to the serial console test points.
My mistake was going poking around trying to figure out where the updates are downloaded from - I know I m running a slightly older release than what s current, and the device can do an automatic download + update. Top tip; don t run Jrdrecovery. It ll error on finding /cache/update.zip and wipe the main partition anyway. That ll leave you in a boot loop where the device boots the recovery partition which tries to install /cache/update.zip which of course still doesn t exist.
So. Where next? First, I need to get the device into a state where I can actually do something other than watch it boot into recovery, fail to flash and reboot. Best guess at present is to try and get it to enter the Qualcomm EDL (Emergency Download) mode. That might be possible with a custom USB cable that grounds D+ on boot. Alternatively I need to probe some of the other test points on the PCB and see if grounding any of those helps enter EDL mode. I then need a suitable firehose OEM-signed programmer image. And then I need to actually get hold of a proper EE40VB firmware image, either via one of the OTA update files or possibly via an Alcatel ADSU image (though no idea how to get hold of one, other than by posting to a random GSM device forum and hoping for the kindness of strangers). More updates if/when I make progress
Qualcomm bootloader log
Format: Log Type - Time(microsec) - Message - Optional Info
Log Type: B - Since Boot(Power On Reset), D - Delta, S - Statistic
S - QC_IMAGE_VERSION_STRING=BOOT.BF.3.1.2-00053
S - IMAGE_VARIANT_STRING=LAATANAZA
S - OEM_IMAGE_VERSION_STRING=linux3
S - Boot Config, 0x000002e1
B - 105194 - SBL1, Start
D - 61885 - QSEE Image Loaded, Delta - (451964 Bytes)
D - 30286 - RPM Image Loaded, Delta - (151152 Bytes)
B - 459330 - Roger:boot_jrd_oem_main
B - 461526 - Welcome to key_check_poweron!!!
B - 466436 - REG0x00, rc=47
B - 469120 - REG0x01, rc=1f
B - 472018 - REG0x02, rc=1c
B - 474885 - REG0x03, rc=47
B - 477782 - REG0x04, rc=b2
B - 480558 - REG0x05, rc=
B - 483272 - REG0x06, rc=9e
B - 486139 - REG0x07, rc=
B - 488854 - REG0x08, rc=a4
B - 491721 - REG0x09, rc=80
B - 494130 - bq24295_probe: vflt/vsys/vprechg=0mV/0mV/0mV, tprechg/tfastchg=0Min/0Min, [0C, 0C]
B - 511546 - come to calculate vol and temperature!!
B - 511637 - ##############battery_core_convert_vntc: NTC_voltage=1785690
B - 517280 - battery_core_convert_vntc: <-44C, 1785690uV>, present=0
B - 529358 - bq24295_set_current_limit: setting=0mA, mode=-1, input/fastchg/prechg/termchg=-1mA/0mA/0mA/0mA
B - 534360 - bq24295_set_charge_current, rc=0,reg_val=0,i=0
B - 539636 - bq24295_enable_charge: setting=0, chg_enable=-1, otg_enable=0
B - 546072 - bq24295_enable_charging: enable_charging=0
B - 552172 - bq24295_set_current_limit: setting=0mA, mode=-1, input/fastchg/prechg/termchg=-1mA/0mA/0mA/0mA
B - 561566 - bq24295_set_charge_current, rc=0,reg_val=0,i=0
B - 567056 - bq24295_enable_charge: setting=0, chg_enable=0, otg_enable=0
B - 579286 - come to calculate vol and temperature!!
B - 579378 - ##############battery_core_convert_vntc: NTC_voltage=1785777
B - 585539 - battery_core_convert_vntc: <-44C, 1785777uV>, present=0
B - 597617 - charge_main: battery is plugout!!
B - 597678 - Welcome to pca955x_probe!!!
B - 601063 - pca955x_probe: PCA955X probed successfully!
D - 27511 - APPSBL Image Loaded, Delta - (179348 Bytes)
B - 633271 - QSEE Execution, Start
D - 213 - QSEE Execution, Delta
B - 638944 - >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Start writting JRD RECOVERY BOOT
B - 650107 - >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Start writting RECOVERY BOOT
B - 653218 - >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>read_buf[0] == 0
B - 659044 - SBL1, End
D - 556137 - SBL1, Delta
S - Throughput, 2000 KB/s (782884 Bytes, 278155 us)
S - DDR Frequency, 240 MHz
littlekernel aboot log
Android Bootloader - UART_DM Initialized!!!
[0] welcome to lk
[0] SCM call: 0x2000601 failed with :fffffffc
[0] Failed to initialize SCM
[10] platform_init()
[10] target_init()
[10] smem ptable found: ver: 4 len: 17
[10] ERROR: No devinfo partition found
[10] Neither 'config' nor 'frp' partition found
[30] voltage of NTC is 1789872!
[30] voltage of BAT is 3179553!
[30] usb present is 1!
[30] Loading (boot) image (4171776): start
[530] Loading (boot) image (4171776): done
[540] DTB Total entry: 25, DTB version: 3
[540] Using DTB entry 0x00000129/00010000/0x00000008/0 for device 0x00000129/00010000/0x00010008/0
[560] JRD_CHG_OFF_FEATURE!
[560] come to jrd_target_pause_for_battery_charge!
[570] power_on_status.hard_reset = 0x0
[570] power_on_status.smpl = 0x0
[570] power_on_status.rtc = 0x0
[580] power_on_status.dc_chg = 0x0
[580] power_on_status.usb_chg = 0x0
[580] power_on_status.pon1 = 0x1
[590] power_on_status.cblpwr = 0x0
[590] power_on_status.kpdpwr = 0x0
[590] power_on_status.bugflag = 0x0
[590] cmdline: noinitrd rw console=ttyHSL0,115200,n8 androidboot.hardware=qcom ehci-hcd.park=3 msm_rtb.filter=0x37 lpm_levels.sleep_disabled=1 earlycon=msm_hsl_uart,0x78b3000 androidboot.serialno=7e6ba58c androidboot.baseband=msm rootfstype=ubifs rootflags=b
[620] Updating device tree: start
[720] Updating device tree: done
[720] booting linux @ 0x80008000, ramdisk @ 0x80008000 (0), tags/device tree @ 0x81e00000
Linux kernel console boot log
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 3.18.20 (linux3@linux3) (gcc version 4.9.2 (GCC) ) #1 PREEMPT Thu Aug 10 11:57:07 CST 2017
[ 0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c53c7d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] Machine model: Qualcomm Technologies, Inc. MDM 9607 MTP
[ 0.000000] Early serial console at I/O port 0x0 (options '')
[ 0.000000] bootconsole [uart0] enabled
[ 0.000000] Reserved memory: reserved region for node 'modem_adsp_region@0': base 0x82a00000, size 56 MiB
[ 0.000000] Reserved memory: reserved region for node 'external_image_region@0': base 0x87c00000, size 4 MiB
[ 0.000000] Removed memory: created DMA memory pool at 0x82a00000, size 56 MiB
[ 0.000000] Reserved memory: initialized node modem_adsp_region@0, compatible id removed-dma-pool
[ 0.000000] Removed memory: created DMA memory pool at 0x87c00000, size 4 MiB
[ 0.000000] Reserved memory: initialized node external_image_region@0, compatible id removed-dma-pool
[ 0.000000] cma: Reserved 4 MiB at 0x87800000
[ 0.000000] Memory policy: Data cache writeback
[ 0.000000] CPU: All CPU(s) started in SVC mode.
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 17152
[ 0.000000] Kernel command line: noinitrd rw console=ttyHSL0,115200,n8 androidboot.hardware=qcom ehci-hcd.park=3 msm_rtb.filter=0x37 lpm_levels.sleep_disabled=1 earlycon=msm_hsl_uart,0x78b3000 androidboot.serialno=7e6ba58c androidboot.baseband=msm rootfstype=ubifs rootflags=bulk_read root=ubi0:rootfs ubi.mtd=16
[ 0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[ 0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[ 0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[ 0.000000] Memory: 54792K/69632K available (5830K kernel code, 399K rwdata, 2228K rodata, 276K init, 830K bss, 14840K reserved)
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
[ 0.000000] vmalloc : 0xc8800000 - 0xff000000 ( 872 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xc8000000 ( 128 MB)
[ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB)
[ 0.000000] .text : 0xc0008000 - 0xc07e6c38 (8060 kB)
[ 0.000000] .init : 0xc07e7000 - 0xc082c000 ( 276 kB)
[ 0.000000] .data : 0xc082c000 - 0xc088fdc0 ( 400 kB)
[ 0.000000] .bss : 0xc088fe84 - 0xc095f798 ( 831 kB)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] Preemptible hierarchical RCU implementation.
[ 0.000000] NR_IRQS:16 nr_irqs:16 16
[ 0.000000] GIC CPU mask not found - kernel will fail to boot.
[ 0.000000] GIC CPU mask not found - kernel will fail to boot.
[ 0.000000] mpm_init_irq_domain(): Cannot find irq controller for qcom,gpio-parent
[ 0.000000] MPM 1 irq mapping errored -517
[ 0.000000] Architected mmio timer(s) running at 19.20MHz (virt).
[ 0.000011] sched_clock: 56 bits at 19MHz, resolution 52ns, wraps every 3579139424256ns
[ 0.007975] Switching to timer-based delay loop, resolution 52ns
[ 0.013969] Switched to clocksource arch_mem_counter
[ 0.019687] Console: colour dummy device 80x30
[ 0.023344] Calibrating delay loop (skipped), value calculated using timer frequency.. 38.40 BogoMIPS (lpj=192000)
[ 0.033666] pid_max: default: 32768 minimum: 301
[ 0.038411] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.044902] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.052445] CPU: Testing write buffer coherency: ok
[ 0.057057] Setting up static identity map for 0x8058aac8 - 0x8058ab20
[ 0.064242]
[ 0.064242] **********************************************************
[ 0.071251] ** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **
[ 0.077817] ** **
[ 0.084302] ** trace_printk() being used. Allocating extra memory. **
[ 0.090781] ** **
[ 0.097320] ** This means that this is a DEBUG kernel and it is **
[ 0.103802] ** unsafe for produciton use. **
[ 0.110339] ** **
[ 0.116850] ** If you see this message and you are not debugging **
[ 0.123333] ** the kernel, report this immediately to your vendor! **
[ 0.129870] ** **
[ 0.136380] ** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **
[ 0.142865] **********************************************************
[ 0.150225] MSM Memory Dump base table set up
[ 0.153739] MSM Memory Dump apps data table set up
[ 0.168125] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5
[ 0.176332] pinctrl core: initialized pinctrl subsystem
[ 0.180930] regulator-dummy: no parameters
[ 0.215338] NET: Registered protocol family 16
[ 0.220475] DMA: preallocated 256 KiB pool for atomic coherent allocations
[ 0.284034] cpuidle: using governor ladder
[ 0.314026] cpuidle: using governor menu
[ 0.344024] cpuidle: using governor qcom
[ 0.355452] msm_watchdog b017000.qcom,wdt: wdog absent resource not present
[ 0.361656] msm_watchdog b017000.qcom,wdt: MSM Watchdog Initialized
[ 0.371373] irq: no irq domain found for /soc/pinctrl@1000000 !
[ 0.381268] spmi_pmic_arb 200f000.qcom,spmi: PMIC Arb Version-2 0x20010000
[ 0.389733] platform 4080000.qcom,mss: assigned reserved memory node modem_adsp_region@0
[ 0.397409] mem_acc_corner: 0 <--> 0 mV
[ 0.401937] hw-breakpoint: found 5 (+1 reserved) breakpoint and 4 watchpoint registers.
[ 0.408966] hw-breakpoint: maximum watchpoint size is 8 bytes.
[ 0.416287] __of_mpm_init(): MPM driver mapping exists
[ 0.420940] msm_rpm_glink_dt_parse: qcom,rpm-glink compatible not matches
[ 0.427235] msm_rpm_dev_probe: APSS-RPM communication over SMD
[ 0.432977] smd_open() before smd_init()
[ 0.437544] msm_mpm_dev_probe(): Cannot get clk resource for XO: -517
[ 0.445730] smd_channel_probe_now: allocation table not initialized
[ 0.453100] mdm9607_s1: 1050 <--> 1350 mV at 1225 mV normal idle
[ 0.458566] spm_regulator_probe: name=mdm9607_s1, range=LV, voltage=1225000 uV, mode=AUTO, step rate=4800 uV/us
[ 0.468817] cpr_efuse_init: apc_corner: efuse_addr = 0x000a4000 (len=0x1000)
[ 0.475353] cpr_read_fuse_revision: apc_corner: fuse revision = 2
[ 0.481345] cpr_parse_speed_bin_fuse: apc_corner: [row: 37]: 0x79e8bd327e6ba58c, speed_bits = 4
[ 0.490124] cpr_pvs_init: apc_corner: pvs voltage: [1050000 1100000 1275000] uV
[ 0.497342] cpr_pvs_init: apc_corner: ceiling voltage: [1050000 1225000 1350000] uV
[ 0.504979] cpr_pvs_init: apc_corner: floor voltage: [1050000 1050000 1150000] uV
[ 0.513125] i2c-msm-v2 78b8000.i2c: probing driver i2c-msm-v2
[ 0.518335] i2c-msm-v2 78b8000.i2c: error on clk_get(core_clk):-517
[ 0.524478] i2c-msm-v2 78b8000.i2c: error probe() failed with err:-517
[ 0.531111] i2c-msm-v2 78b7000.i2c: probing driver i2c-msm-v2
[ 0.536788] i2c-msm-v2 78b7000.i2c: error on clk_get(core_clk):-517
[ 0.542886] i2c-msm-v2 78b7000.i2c: error probe() failed with err:-517
[ 0.549618] i2c-msm-v2 78b9000.i2c: probing driver i2c-msm-v2
[ 0.555202] i2c-msm-v2 78b9000.i2c: error on clk_get(core_clk):-517
[ 0.561374] i2c-msm-v2 78b9000.i2c: error probe() failed with err:-517
[ 0.570613] msm-thermal soc:qcom,msm-thermal: msm_thermal:Failed reading node=/soc/qcom,msm-thermal, key=qcom,core-limit-temp. err=-22. KTM continues
[ 0.583049] msm-thermal soc:qcom,msm-thermal: probe_therm_reset:Failed reading node=/soc/qcom,msm-thermal, key=qcom,therm-reset-temp err=-22. KTM continues
[ 0.596926] msm_thermal:msm_thermal_dev_probe Failed reading node=/soc/qcom,msm-thermal, key=qcom,online-hotplug-core. err:-517
[ 0.609370] sps:sps is ready.
[ 0.613137] msm_rpm_glink_dt_parse: qcom,rpm-glink compatible not matches
[ 0.619020] msm_rpm_dev_probe: APSS-RPM communication over SMD
[ 0.625773] mdm9607_s2: 750 <--> 1275 mV at 750 mV normal idle
[ 0.631584] mdm9607_s3_level: 0 <--> 0 mV at 0 mV normal idle
[ 0.637085] mdm9607_s3_level_ao: 0 <--> 0 mV at 0 mV normal idle
[ 0.643092] mdm9607_s3_floor_level: 0 <--> 0 mV at 0 mV normal idle
[ 0.649512] mdm9607_s3_level_so: 0 <--> 0 mV at 0 mV normal idle
[ 0.655750] mdm9607_s4: 1800 <--> 1950 mV at 1800 mV normal idle
[ 0.661791] mdm9607_l1: 1250 mV normal idle
[ 0.666090] mdm9607_l2: 1800 mV normal idle
[ 0.670276] mdm9607_l3: 1800 mV normal idle
[ 0.674541] mdm9607_l4: 3075 mV normal idle
[ 0.678743] mdm9607_l5: 1700 <--> 3050 mV at 1700 mV normal idle
[ 0.684904] mdm9607_l6: 1700 <--> 3050 mV at 1700 mV normal idle
[ 0.690892] mdm9607_l7: 1700 <--> 1900 mV at 1700 mV normal idle
[ 0.697036] mdm9607_l8: 1800 mV normal idle
[ 0.701238] mdm9607_l9: 1200 <--> 1250 mV at 1200 mV normal idle
[ 0.707367] mdm9607_l10: 1050 mV normal idle
[ 0.711662] mdm9607_l11: 1800 mV normal idle
[ 0.716089] mdm9607_l12_level: 0 <--> 0 mV at 0 mV normal idle
[ 0.721717] mdm9607_l12_level_ao: 0 <--> 0 mV at 0 mV normal idle
[ 0.727946] mdm9607_l12_level_so: 0 <--> 0 mV at 0 mV normal idle
[ 0.734099] mdm9607_l12_floor_lebel: 0 <--> 0 mV at 0 mV normal idle
[ 0.740706] mdm9607_l13: 1800 <--> 2850 mV at 2850 mV normal idle
[ 0.746883] mdm9607_l14: 2650 <--> 3000 mV at 2650 mV normal idle
[ 0.752515] msm_mpm_dev_probe(): Cannot get clk resource for XO: -517
[ 0.759036] cpr_efuse_init: apc_corner: efuse_addr = 0x000a4000 (len=0x1000)
[ 0.765807] cpr_read_fuse_revision: apc_corner: fuse revision = 2
[ 0.771809] cpr_parse_speed_bin_fuse: apc_corner: [row: 37]: 0x79e8bd327e6ba58c, speed_bits = 4
[ 0.780586] cpr_pvs_init: apc_corner: pvs voltage: [1050000 1100000 1275000] uV
[ 0.787808] cpr_pvs_init: apc_corner: ceiling voltage: [1050000 1225000 1350000] uV
[ 0.795443] cpr_pvs_init: apc_corner: floor voltage: [1050000 1050000 1150000] uV
[ 0.803094] cpr_init_cpr_parameters: apc_corner: up threshold = 2, down threshold = 3
[ 0.810752] cpr_init_cpr_parameters: apc_corner: CPR is enabled by default.
[ 0.817687] cpr_init_cpr_efuse: apc_corner: [row:65] = 0x15000277277383
[ 0.824272] cpr_init_cpr_efuse: apc_corner: CPR disable fuse = 0
[ 0.830225] cpr_init_cpr_efuse: apc_corner: Corner[1]: ro_sel = 0, target quot = 631
[ 0.837976] cpr_init_cpr_efuse: apc_corner: Corner[2]: ro_sel = 0, target quot = 631
[ 0.845703] cpr_init_cpr_efuse: apc_corner: Corner[3]: ro_sel = 0, target quot = 899
[ 0.853592] cpr_config: apc_corner: Timer count: 0x17700 (for 5000 us)
[ 0.860426] apc_corner: 0 <--> 0 mV
[ 0.864044] i2c-msm-v2 78b8000.i2c: probing driver i2c-msm-v2
[ 0.869261] i2c-msm-v2 78b8000.i2c: error on clk_get(core_clk):-517
[ 0.875492] i2c-msm-v2 78b8000.i2c: error probe() failed with err:-517
[ 0.882225] i2c-msm-v2 78b7000.i2c: probing driver i2c-msm-v2
[ 0.887775] i2c-msm-v2 78b7000.i2c: error on clk_get(core_clk):-517
[ 0.893941] i2c-msm-v2 78b7000.i2c: error probe() failed with err:-517
[ 0.900719] i2c-msm-v2 78b9000.i2c: probing driver i2c-msm-v2
[ 0.906256] i2c-msm-v2 78b9000.i2c: error on clk_get(core_clk):-517
[ 0.912430] i2c-msm-v2 78b9000.i2c: error probe() failed with err:-517
[ 0.919472] msm-thermal soc:qcom,msm-thermal: msm_thermal:Failed reading node=/soc/qcom,msm-thermal, key=qcom,core-limit-temp. err=-22. KTM continues
[ 0.932372] msm-thermal soc:qcom,msm-thermal: probe_therm_reset:Failed reading node=/soc/qcom,msm-thermal,
key=qcom,therm-reset-temp err=-22. KTM continues
[ 0.946361] msm_thermal:get_kernel_cluster_info CPU0 topology not initialized.
[ 0.953824] cpu cpu0: dev_pm_opp_get_opp_count: device OPP not found (-19)
[ 0.960300] msm_thermal:get_cpu_freq_plan_len Error reading CPU0 freq table len. error:-19
[ 0.968533] msm_thermal:vdd_restriction_reg_init Defer vdd rstr freq init.
[ 0.975846] cpu cpu0: dev_pm_opp_get_opp_count: device OPP not found (-19)
[ 0.982219] msm_thermal:get_cpu_freq_plan_len Error reading CPU0 freq table len. error:-19
[ 0.991378] cpu cpu0: dev_pm_opp_get_opp_count: device OPP not found (-19)
[ 0.997544] msm_thermal:get_cpu_freq_plan_len Error reading CPU0 freq table len. error:-19
[ 1.013642] qcom,gcc-mdm9607 1800000.qcom,gcc: Registered GCC clocks
[ 1.019451] clock-a7 b010008.qcom,clock-a7: Speed bin: 4 PVS Version: 0
[ 1.025693] a7ssmux: set OPP pair(400000000 Hz: 1 uV) on cpu0
[ 1.031314] a7ssmux: set OPP pair(1305600000 Hz: 7 uV) on cpu0
[ 1.038805] i2c-msm-v2 78b8000.i2c: probing driver i2c-msm-v2
[ 1.043587] AXI: msm_bus_scale_register_client(): msm_bus_scale_register_client: Bus driver not ready.
[ 1.052935] i2c-msm-v2 78b8000.i2c: msm_bus_scale_register_client(mstr-id:86):0 (not a problem)
[ 1.062006] irq: no irq domain found for /soc/wcd9xxx-irq !
[ 1.069884] i2c-msm-v2 78b7000.i2c: probing driver i2c-msm-v2
[ 1.074814] AXI: msm_bus_scale_register_client(): msm_bus_scale_register_client: Bus driver not ready.
[ 1.083716] i2c-msm-v2 78b7000.i2c: msm_bus_scale_register_client(mstr-id:86):0 (not a problem)
[ 1.093850] i2c-msm-v2 78b9000.i2c: probing driver i2c-msm-v2
[ 1.098889] AXI: msm_bus_scale_register_client(): msm_bus_scale_register_client: Bus driver not ready.
[ 1.107779] i2c-msm-v2 78b9000.i2c: msm_bus_scale_register_client(mstr-id:86):0 (not a problem)
[ 1.167871] KPI: Bootloader start count = 24097
[ 1.171364] KPI: Bootloader end count = 48481
[ 1.175855] KPI: Bootloader display count = 3884474147
[ 1.180825] KPI: Bootloader load kernel count = 16420
[ 1.185905] KPI: Kernel MPM timestamp = 105728
[ 1.190286] KPI: Kernel MPM Clock frequency = 32768
[ 1.195209] socinfo_print: v0.10, id=297, ver=1.0, raw_id=72, raw_ver=0, hw_plat=8, hw_plat_ver=65536
[ 1.195209] accessory_chip=0, hw_plat_subtype=0, pmic_model=65539, pmic_die_revision=131074 foundry_id=0 serial_number=2120983948
[ 1.216731] sdcard_ext_vreg: no parameters
[ 1.220555] rome_vreg: no parameters
[ 1.224133] emac_lan_vreg: no parameters
[ 1.228177] usbcore: registered new interface driver usbfs
[ 1.233156] usbcore: registered new interface driver hub
[ 1.238578] usbcore: registered new device driver usb
[ 1.244507] cpufreq: driver msm up and running
[ 1.248425] ION heap system created
[ 1.251895] msm_bus_fabric_init_driver
[ 1.262563] qcom,qpnp-power-on qpnp-power-on-c7303800: PMIC@SID0 Power-on reason: Triggered from PON1 (secondary PMIC) and 'cold' boot
[ 1.273747] qcom,qpnp-power-on qpnp-power-on-c7303800: PMIC@SID0: Power-off reason: Triggered from UVLO (Under Voltage Lock Out)
[ 1.285430] input: qpnp_pon as /devices/virtual/input/input0
[ 1.291246] PMIC@SID0: PM8019 v2.2 options: 3, 2, 2, 2
[ 1.296706] Advanced Linux Sound Architecture Driver Initialized.
[ 1.302493] Add group failed
[ 1.305291] cfg80211: Calling CRDA to update world regulatory domain
[ 1.311216] cfg80211: World regulatory domain updated:
[ 1.317109] Switched to clocksource arch_mem_counter
[ 1.334091] cfg80211: DFS Master region: unset
[ 1.337418] cfg80211: (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)
[ 1.354087] cfg80211: (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.361055] cfg80211: (2457000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.370545] NET: Registered protocol family 2
[ 1.374082] cfg80211: (2474000 KHz - 2494000 KHz @ 20000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.381851] cfg80211: (5170000 KHz - 5250000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.389876] cfg80211: (5250000 KHz - 5330000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.397857] cfg80211: (5490000 KHz - 5710000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.405841] cfg80211: (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.413795] cfg80211: (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm), (N/A)
[ 1.422355] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
[ 1.428921] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[ 1.435192] TCP: Hash tables configured (established 1024 bind 1024)
[ 1.441528] TCP: reno registered
[ 1.444738] UDP hash table entries: 256 (order: 0, 4096 bytes)
[ 1.450521] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[ 1.456950] NET: Registered protocol family 1
[ 1.462779] futex hash table entries: 256 (order: -1, 3072 bytes)
[ 1.474555] msgmni has been set to 115
[ 1.478551] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[ 1.485041] io scheduler noop registered
[ 1.488818] io scheduler deadline registered
[ 1.493200] io scheduler cfq registered (default)
[ 1.502142] msm_rpm_log_probe: OK
[ 1.506717] msm_serial_hs module loaded
[ 1.509803] msm_serial_hsl_probe: detected port #0 (ttyHSL0)
[ 1.515324] AXI: get_pdata(): Error: Client name not found
[ 1.520626] AXI: msm_bus_cl_get_pdata(): client has to provide missing entry for successful registration
[ 1.530171] msm_serial_hsl_probe: Bus scaling is disabled [ 1.074814] AXI: msm_bus_scale_register_client(): msm_bus_scale_register_client: Bus driver not ready.
[ 1.083716] i2c-msm-v2 78b7000.i2c: msm_bus_scale_register_client(mstr-id:86):0 (not a problem)
[ 1.093850] i2c-msm-v2 78b9000.i2c: probing driver i2c-msm-v2
[ 1.098889] AXI: msm_bus_scale_register_client(): msm_bus_scale_register_client: Bus driver not ready.
[ 1.107779] i2c-msm-v2 78b9000.i2c: msm_bus_scale_register_client(mstr-id:86):0 (not a problem)
[ 1.167871] KPI: Bootloader start count = 24097
[ 1.171364] KPI: Bootloader end count = 48481
[ 1.175855] KPI: Bootloader display count = 3884474147
[ 1.180825] KPI: Bootloader load kernel count = 16420
[ 1.185905] KPI: Kernel MPM timestamp = 105728
[ 1.190286] KPI: Kernel MPM Clock frequency = 32768
[ 1.195209] socinfo_print: v0.10, id=297, ver=1.0, raw_id=72, raw_ver=0, hw_plat=8, hw_plat_ver=65536
[ 1.195209] accessory_chip=0, hw_plat_subtype=0, pmic_model=65539, pmic_die_revision=131074 foundry_id=0 serial_number=2120983948
[ 1.216731] sdcard_ext_vreg: no parameters
[ 1.220555] rome_vreg: no parameters
[ 1.224133] emac_lan_vreg: no parameters
[ 1.228177] usbcore: registered new interface driver usbfs
[ 1.233156] usbcore: registered new interface driver hub
[ 1.238578] usbcore: registered new device driver usb
[ 1.244507] cpufreq: driver msm up and running
[ 1.248425] ION heap system created
[ 1.251895] msm_bus_fabric_init_driver
[ 1.262563] qcom,qpnp-power-on qpnp-power-on-c7303800: PMIC@SID0 Power-on reason: Triggered from PON1 (secondary PMIC) and 'cold' boot
[ 1.273747] qcom,qpnp-power-on qpnp-power-on-c7303800: PMIC@SID0: Power-off reason: Triggered from UVLO (Under Voltage Lock Out)
[ 1.285430] input: qpnp_pon as /devices/virtual/input/input0
[ 1.291246] PMIC@SID0: PM8019 v2.2 options: 3, 2, 2, 2
[ 1.296706] Advanced Linux Sound Architecture Driver Initialized.
[ 1.302493] Add group failed
[ 1.305291] cfg80211: Calling CRDA to update world regulatory domain
[ 1.311216] cfg80211: World regulatory domain updated:
[ 1.317109] Switched to clocksource arch_mem_counter
[ 1.334091] cfg80211: DFS Master region: unset
[ 1.337418] cfg80211: (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)
[ 1.354087] cfg80211: (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.361055] cfg80211: (2457000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.370545] NET: Registered protocol family 2
[ 1.374082] cfg80211: (2474000 KHz - 2494000 KHz @ 20000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.381851] cfg80211: (5170000 KHz - 5250000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.389876] cfg80211: (5250000 KHz - 5330000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.397857] cfg80211: (5490000 KHz - 5710000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.405841] cfg80211: (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
[ 1.413795] cfg80211: (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm), (N/A)
[ 1.422355] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
[ 1.428921] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[ 1.435192] TCP: Hash tables configured (established 1024 bind 1024)
[ 1.441528] TCP: reno registered
[ 1.444738] UDP hash table entries: 256 (order: 0, 4096 bytes)
[ 1.450521] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[ 1.456950] NET: Registered protocol family 1
[ 1.462779] futex hash table entries: 256 (order: -1, 3072 bytes)
[ 1.474555] msgmni has been set to 115
[ 1.478551] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[ 1.485041] io scheduler noop registered
[ 1.488818] io scheduler deadline registered
[ 1.493200] io scheduler cfq registered (default)
[ 1.502142] msm_rpm_log_probe: OK
[ 1.506717] msm_serial_hs module loaded
[ 1.509803] msm_serial_hsl_probe: detected port #0 (ttyHSL0)
[ 1.515324] AXI: get_pdata(): Error: Client name not found
[ 1.520626] AXI: msm_bus_cl_get_pdata(): client has to provide missing entry for successful registration
[ 1.530171] msm_serial_hsl_probe: Bus scaling is disabled
[ 1.535696] 78b3000.serial: ttyHSL0 at MMIO 0x78b3000 (irq = 153, base_baud = 460800 [ 1.544155] msm_hsl_console_setup: console setup on port #0
[ 1.548727] console [ttyHSL0] enabled
[ 1.548727] console [ttyHSL0] enabled
[ 1.556014] bootconsole [uart0] disabled
[ 1.556014] bootconsole [uart0] disabled
[ 1.564212] msm_serial_hsl_init: driver initialized
[ 1.578450] brd: module loaded
[ 1.582920] loop: module loaded
[ 1.589183] sps: BAM device 0x07984000 is not registered yet.
[ 1.594234] sps:BAM 0x07984000 is registered.
[ 1.598072] msm_nand_bam_init: msm_nand_bam_init: BAM device registered: bam_handle 0xc69f6400
[ 1.607103] sps:BAM 0x07984000 (va:0xc89a0000) enabled: ver:0x18, number of pipes:7
[ 1.616588] msm_nand_parse_smem_ptable: Parsing partition table info from SMEM
[ 1.622805] msm_nand_parse_smem_ptable: SMEM partition table found: ver: 4 len: 17
[ 1.630391] msm_nand_version_check: nand_major:1, nand_minor:5, qpic_major:1, qpic_minor:5
[ 1.638642] msm_nand_scan: NAND Id: 0x1590aa98 Buswidth: 8Bits Density: 256 MByte
[ 1.646069] msm_nand_scan: pagesize: 2048 Erasesize: 131072 oobsize: 128 (in Bytes)
[ 1.653676] msm_nand_scan: BCH ECC: 8 Bit
[ 1.657710] msm_nand_scan: CFG0: 0x290408c0, CFG1: 0x0804715c
[ 1.657710] RAWCFG0: 0x2b8400c0, RAWCFG1: 0x0005055d
[ 1.657710] ECCBUFCFG: 0x00000203, ECCBCHCFG: 0x42040d10
[ 1.657710] RAWECCCFG: 0x42000d11, BAD BLOCK BYTE: 0x000001c5
[ 1.684101] Creating 17 MTD partitions on "7980000.nand":
[ 1.689447] 0x000000000000-0x000000140000 : "sbl"
[ 1.694867] 0x000000140000-0x000000280000 : "mibib"
[ 1.699560] 0x000000280000-0x000000e80000 : "efs2"
[ 1.704408] 0x000000e80000-0x000000f40000 : "tz"
[ 1.708934] 0x000000f40000-0x000000fa0000 : "rpm"
[ 1.713625] 0x000000fa0000-0x000001000000 : "aboot"
[ 1.718582] 0x000001000000-0x0000017e0000 : "boot"
[ 1.723281] 0x0000017e0000-0x000002820000 : "scrub"
[ 1.728174] 0x000002820000-0x000005020000 : "modem"
[ 1.732968] 0x000005020000-0x000005420000 : "rfbackup"
[ 1.738156] 0x000005420000-0x000005820000 : "oem"
[ 1.742770] 0x000005820000-0x000005f00000 : "recovery"
[ 1.747972] 0x000005f00000-0x000009100000 : "cache"
[ 1.752787] 0x000009100000-0x000009a40000 : "recoveryfs"
[ 1.758389] 0x000009a40000-0x00000aa40000 : "cdrom"
[ 1.762967] 0x00000aa40000-0x00000ba40000 : "jrdresource"
[ 1.768407] 0x00000ba40000-0x000010000000 : "system"
[ 1.773239] msm_nand_probe: NANDc phys addr 0x7980000, BAM phys addr 0x7984000, BAM IRQ 164
[ 1.781074] msm_nand_probe: Allocated DMA buffer at virt_addr 0xc7840000, phys_addr 0x87840000
[ 1.791872] PPP generic driver version 2.4.2
[ 1.801126] cnss_sdio 87a00000.qcom,cnss-sdio: CNSS SDIO Driver registered
[ 1.807554] msm_otg 78d9000.usb: msm_otg probe
[ 1.813333] msm_otg 78d9000.usb: OTG regs = c88f8000
[ 1.820702] gbridge_init: gbridge_init successs.
[ 1.826344] msm_otg 78d9000.usb: phy_reset: success
[ 1.830294] qcom,qpnp-rtc qpnp-rtc-c7307000: rtc core: registered qpnp_rtc as rtc0
[ 1.838474] i2c /dev entries driver
[ 1.842459] unable to find DT imem DLOAD mode node
[ 1.846588] unable to find DT imem EDLOAD mode node
[ 1.851332] unable to find DT imem dload-type node
[ 1.856921] bq24295-charger 4-006b: bq24295 probe enter
[ 1.861161] qcom,iterm-ma = 128
[ 1.864476] bq24295_otg_vreg: no parameters
[ 1.868502] charger_core_register: Charger Core Version 5.0.0(Built at 20151202-21:36)!
[ 1.877007] i2c-msm-v2 78b8000.i2c: msm_bus_scale_register_client(mstr-id:86):0x3 (ok)
[ 1.885559] bq24295-charger 4-006b: bq24295_set_bhot_mode 3
[ 1.890150] bq24295-charger 4-006b: power_good is 1,vbus_stat is 2
[ 1.896588] bq24295-charger 4-006b: bq24295_set_thermal_threshold 100
[ 1.902952] bq24295-charger 4-006b: bq24295_set_sys_min 3700
[ 1.908639] bq24295-charger 4-006b: bq24295_set_max_target_voltage 4150
[ 1.915223] bq24295-charger 4-006b: bq24295_set_recharge_threshold 300
[ 1.922119] bq24295-charger 4-006b: bq24295_set_terminal_current_limit iterm_disabled=0, iterm_ma=128
[ 1.930917] bq24295-charger 4-006b: bq24295_set_precharge_current_limit bdi->prech_cur=128
[ 1.940038] bq24295-charger 4-006b: bq24295_set_safty_timer 0
[ 1.945088] bq24295-charger 4-006b: bq24295_set_input_voltage_limit 4520
[ 1.972949] sdhci: Secure Digital Host Controller Interface driver
[ 1.978151] sdhci: Copyright(c) Pierre Ossman
[ 1.982441] sdhci-pltfm: SDHCI platform and OF driver helper
[ 1.989092] sdhci_msm 7824900.sdhci: sdhci_msm_probe: ICE device is not enabled
[ 1.995473] sdhci_msm 7824900.sdhci: No vreg data found for vdd
[ 2.001530] sdhci_msm 7824900.sdhci: sdhci_msm_pm_qos_parse_irq: error -22 reading irq cpu
[ 2.009809] sdhci_msm 7824900.sdhci: sdhci_msm_pm_qos_parse: PM QoS voting for IRQ will be disabled
[ 2.018600] sdhci_msm 7824900.sdhci: sdhci_msm_pm_qos_parse: PM QoS voting for cpu group will be disabled
[ 2.030541] sdhci_msm 7824900.sdhci: sdhci_msm_probe: sdiowakeup_irq = 353
[ 2.036867] sdhci_msm 7824900.sdhci: No vmmc regulator found
[ 2.042027] sdhci_msm 7824900.sdhci: No vqmmc regulator found
[ 2.048266] mmc0: SDHCI controller on 7824900.sdhci [7824900.sdhci] using 32-bit ADMA in legacy mode
[ 2.080401] Welcome to pca955x_probe!!
[ 2.084362] leds-pca955x 3-0020: leds-pca955x: Using pca9555 16-bit LED driver at slave address 0x20
[ 2.095400] sdhci_msm 7824900.sdhci: card claims to support voltages below defined range
[ 2.103125] i2c-msm-v2 78b7000.i2c: msm_bus_scale_register_client(mstr-id:86):0x5 (ok)
[ 2.114183] msm_otg 78d9000.usb: Avail curr from USB = 1500
[ 2.120251] come to USB_SDP_CHARGER!
[ 2.123215] Welcome to sn3199_probe!
[ 2.126718] leds-sn3199 5-0064: leds-sn3199: Using sn3199 9-bit LED driver at slave address 0x64
[ 2.136511] sn3199->led_en_gpio=21
[ 2.139143] i2c-msm-v2 78b9000.i2c: msm_bus_scale_register_client(mstr-id:86):0x6 (ok)
[ 2.150207] usbcore: registered new interface driver usbhid
[ 2.154864] usbhid: USB HID core driver
[ 2.159825] sps:BAM 0x078c4000 is registered.
[ 2.163573] bimc-bwmon 408000.qcom,cpu-bwmon: BW HWmon governor registered.
[ 2.171080] devfreq soc:qcom,cpubw: Couldn't update frequency transition information.
[ 2.178513] coresight-fuse a601c.fuse: QPDI fuse not specified
[ 2.184242] coresight-fuse a601c.fuse: Fuse initialized
[ 2.192407] coresight-csr 6001000.csr: CSR initialized
[ 2.197263] coresight-tmc 6026000.tmc: Byte Counter feature enabled
[ 2.203204] sps:BAM 0x06084000 is registered.
[ 2.207301] coresight-tmc 6026000.tmc: TMC initialized
[ 2.212681] coresight-tmc 6025000.tmc: TMC initialized
[ 2.220071] nidnt boot config: 0
[ 2.224563] mmc0: new ultra high speed SDR50 SDIO card at address 0001
[ 2.231120] coresight-tpiu 6020000.tpiu: NIDnT on SDCARD only mode
[ 2.236440] coresight-tpiu 6020000.tpiu: TPIU initialized
[ 2.242808] coresight-replicator 6024000.replicator: REPLICATOR initialized
[ 2.249372] coresight-stm 6002000.stm: STM initialized
[ 2.255034] coresight-hwevent 606c000.hwevent: Hardware Event driver initialized
[ 2.262312] Netfilter messages via NETLINK v0.30.
[ 2.266306] nf_conntrack version 0.5.0 (920 buckets, 3680 max)
[ 2.272312] ctnetlink v0.93: registering with nfnetlink.
[ 2.277565] ip_set: protocol 6
[ 2.280568] ip_tables: (C) 2000-2006 Netfilter Core Team
[ 2.285723] arp_tables: (C) 2002 David S. Miller
[ 2.290146] TCP: cubic registered
[ 2.293915] NET: Registered protocol family 10
[ 2.298740] ip6_tables: (C) 2000-2006 Netfilter Core Team
[ 2.303407] sit: IPv6 over IPv4 tunneling driver
[ 2.308481] NET: Registered protocol family 17
[ 2.312340] bridge: automatic filtering via arp/ip/ip6tables has been deprecated. Update your scripts to load br_netfilter if you need this.
[ 2.325094] Bridge firewalling registered
[ 2.328930] Ebtables v2.0 registered
[ 2.333260] NET: Registered protocol family 27
[ 2.341362] battery_core_register: Battery Core Version 5.0.0(Built at 20151202-21:36)!
[ 2.348466] pmu_battery_probe: vbat_channel=21, tbat_channel=17
[ 2.420236] ubi0: attaching mtd16
[ 2.723941] ubi0: scanning is finished
[ 2.732997] ubi0: attached mtd16 (name "system", size 69 MiB)
[ 2.737783] ubi0: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
[ 2.744601] ubi0: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
[ 2.751333] ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
[ 2.758540] ubi0: good PEBs: 556, bad PEBs: 2, corrupted PEBs: 0
[ 2.764305] ubi0: user volume: 3, internal volumes: 1, max. volumes count: 128
[ 2.771476] ubi0: max/mean erase counter: 192/64, WL threshold: 4096, image sequence number: 35657280
[ 2.780708] ubi0: available PEBs: 0, total reserved PEBs: 556, PEBs reserved for bad PEB handling: 38
[ 2.789921] ubi0: background thread "ubi_bgt0d" started, PID 96
[ 2.796395] android_bind cdev: 0xC6583E80, name: ci13xxx_msm
[ 2.801508] file system registered
[ 2.804974] mbim_init: initialize 1 instances
[ 2.809228] mbim_init: Initialized 1 ports
[ 2.815074] rndis_qc_init: initialize rndis QC instance
[ 2.819713] jrd device_desc.bcdDevice: [0x0242]
[ 2.823779] android_bind scheduled usb start work: name: ci13xxx_msm
[ 2.830230] android_usb gadget: android_usb ready
[ 2.834845] msm_hsusb msm_hsusb: [ci13xxx_start] hw_ep_max = 32
[ 2.840741] msm_hsusb msm_hsusb: CI13XXX_CONTROLLER_RESET_EVENT received
[ 2.847433] msm_hsusb msm_hsusb: CI13XXX_CONTROLLER_UDC_STARTED_EVENT received
[ 2.855851] input: gpio-keys as /devices/soc:gpio_keys/input/input1
[ 2.861452] qcom,qpnp-rtc qpnp-rtc-c7307000: setting system clock to 1970-01-01 06:36:41 UTC (23801)
[ 2.870315] open file error /usb_conf/usb_config.ini
[ 2.876412] jrd_usb_start_work open file erro /usb_conf/usb_config.ini, retry_count:0
[ 2.884324] parse_legacy_cluster_params(): Ignoring cluster params
[ 2.889468] ------------[ cut here ]------------
[ 2.894186] WARNING: CPU: 0 PID: 1 at /home/linux3/jrd/yanping.an/ee40/0810/MDM9607.LE.1.0-00130/apps_proc/oe-core/build/tmp-glibc/work-shared/mdm9607/kernel-source/drivers/cpuidle/lpm-levels-of.c:739 parse_cluster+0xb50/0xcb4()
[ 2.914366] Modules linked in:
[ 2.917339] CPU: 0 PID: 1 Comm: swapper Not tainted 3.18.20 #1
[ 2.923171] [<c00132ac>] (unwind_backtrace) from [<c0011460>] (show_stack+0x10/0x14)
[ 2.931092] [<c0011460>] (show_stack) from [<c001c6ac>] (warn_slowpath_common+0x68/0x88)
[ 2.939175] [<c001c6ac>] (warn_slowpath_common) from [<c001c75c>] (warn_slowpath_null+0x18/0x20)
[ 2.947895] [<c001c75c>] (warn_slowpath_null) from [<c034e180>] (parse_cluster+0xb50/0xcb4)
[ 2.956189] [<c034e180>] (parse_cluster) from [<c034b6b4>] (lpm_probe+0xc/0x1d4)
[ 2.963527] [<c034b6b4>] (lpm_probe) from [<c024857c>] (platform_drv_probe+0x30/0x7c)
[ 2.971380] [<c024857c>] (platform_drv_probe) from [<c0246d54>] (driver_probe_device+0xb8/0x1e8)
[ 2.980118] [<c0246d54>] (driver_probe_device) from [<c0246f30>] (__driver_attach+0x68/0x8c)
[ 2.988467] [<c0246f30>] (__driver_attach) from [<c02455d0>] (bus_for_each_dev+0x6c/0x90)
[ 2.996626] [<c02455d0>] (bus_for_each_dev) from [<c02465a4>] (bus_add_driver+0xe0/0x1c8)
[ 3.004786] [<c02465a4>] (bus_add_driver) from [<c02477bc>] (driver_register+0x9c/0xe0)
[ 3.012739] [<c02477bc>] (driver_register) from [<c080c3d8>] (lpm_levels_module_init+0x14/0x38)
[ 3.021459] [<c080c3d8>] (lpm_levels_module_init) from [<c0008980>] (do_one_initcall+0xf8/0x1a0)
[ 3.030217] [<c0008980>] (do_one_initcall) from [<c07e7d4c>] (kernel_init_freeable+0xf0/0x1b0)
[ 3.038818] [<c07e7d4c>] (kernel_init_freeable) from [<c0582d48>] (kernel_init+0x8/0xe4)
[ 3.046888] [<c0582d48>] (kernel_init) from [<c000dda0>] (ret_from_fork+0x14/0x34)
[ 3.054432] ---[ end trace e9ec50b1ec4c8f73 ]---
[ 3.059012] ------------[ cut here ]------------
[ 3.063604] WARNING: CPU: 0 PID: 1 at /home/linux3/jrd/yanping.an/ee40/0810/MDM9607.LE.1.0-00130/apps_proc/oe-core/build/tmp-glibc/work-shared/mdm9607/kernel-source/drivers/cpuidle/lpm-levels-of.c:739 parse_cluster+0xb50/0xcb4()
[ 3.083858] Modules linked in:
[ 3.086870] CPU: 0 PID: 1 Comm: swapper Tainted: G W 3.18.20 #1
[ 3.093814] [<c00132ac>] (unwind_backtrace) from [<c0011460>] (show_stack+0x10/0x14)
[ 3.101575] [<c0011460>] (show_stack) from [<c001c6ac>] (warn_slowpath_common+0x68/0x88)
[ 3.109641] [<c001c6ac>] (warn_slowpath_common) from [<c001c75c>] (warn_slowpath_null+0x18/0x20)
[ 3.118412] [<c001c75c>] (warn_slowpath_null) from [<c034e180>] (parse_cluster+0xb50/0xcb4)
[ 3.126745] [<c034e180>] (parse_cluster) from [<c034b6b4>] (lpm_probe+0xc/0x1d4)
[ 3.134126] [<c034b6b4>] (lpm_probe) from [<c024857c>] (platform_drv_probe+0x30/0x7c)
[ 3.141906] [<c024857c>] (platform_drv_probe) from [<c0246d54>] (driver_probe_device+0xb8/0x1e8)
[ 3.150702] [<c0246d54>] (driver_probe_device) from [<c0246f30>] (__driver_attach+0x68/0x8c)
[ 3.159120] [<c0246f30>] (__driver_attach) from [<c02455d0>] (bus_for_each_dev+0x6c/0x90)
[ 3.167285] [<c02455d0>] (bus_for_each_dev) from [<c02465a4>] (bus_add_driver+0xe0/0x1c8)
[ 3.175444] [<c02465a4>] (bus_add_driver) from [<c02477bc>] (driver_register+0x9c/0xe0)
[ 3.183398] [<c02477bc>] (driver_register) from [<c080c3d8>] (lpm_levels_module_init+0x14/0x38)
[ 3.192107] [<c080c3d8>] (lpm_levels_module_init) from [<c0008980>] (do_one_initcall+0xf8/0x1a0)
[ 3.200877] [<c0008980>] (do_one_initcall) from [<c07e7d4c>] (kernel_init_freeable+0xf0/0x1b0)
[ 3.209475] [<c07e7d4c>] (kernel_init_freeable) from [<c0582d48>] (kernel_init+0x8/0xe4)
[ 3.217542] [<c0582d48>] (kernel_init) from [<c000dda0>] (ret_from_fork+0x14/0x34)
[ 3.225090] ---[ end trace e9ec50b1ec4c8f74 ]---
[ 3.229667] /soc/qcom,lpm-levels/qcom,pm-cluster@0: No CPU phandle, assuming single cluster
[ 3.239954] qcom,cc-debug-mdm9607 1800000.qcom,debug: Registered Debug Mux successfully
[ 3.247619] emac_lan_vreg: disabling
[ 3.250507] mem_acc_corner: disabling
[ 3.254196] clock_late_init: Removing enables held for handed-off clocks
[ 3.262690] ALSA device list:
[ 3.264732] No soundcard [ 3.274083] UBIFS (ubi0:0): background thread "ubifs_bgt0_0" started, PID 102
[ 3.305224] UBIFS (ubi0:0): recovery needed
[ 3.466156] UBIFS (ubi0:0): recovery completed
[ 3.469627] UBIFS (ubi0:0): UBIFS: mounted UBI device 0, volume 0, name "rootfs"
[ 3.476987] UBIFS (ubi0:0): LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes
[ 3.486876] UBIFS (ubi0:0): FS size: 45838336 bytes (43 MiB, 361 LEBs), journal size 9023488 bytes (8 MiB, 72 LEBs)
[ 3.497417] UBIFS (ubi0:0): reserved for root: 0 bytes (0 KiB)
[ 3.503078] UBIFS (ubi0:0): media format: w4/r0 (latest is w4/r0), UUID 4DBB2F12-34EB-43B6-839B-3BA930765BAE, small LPT model
[ 3.515582] VFS: Mounted root (ubifs filesystem) on device 0:12.
[ 3.520940] Freeing unused kernel memory: 276K (c07e7000 - c082c000)
INIT: version 2.88 booting
Farmer on-going protests
Before I start with the education system in India which I have talked about many times in the past, first let me share couple of pieces about the farmer movement which is still at Sanghu Delhi border.
The above picture became somewhat viral as it showed Manjeet Kaur, who drove down from Patiala, Punjab to Sanghu border along with her friends to take part in the on-going protests. The picture not only shares how the women are part and parcel of this protest but also they are independently taking part in the protest.
The other were two articles I read today, first was an article in tribune which questions that if the policy worked, why it didn t work in the state of Bihar. The other by a young law student who had to go from Chandigarh to Delhi with family for some work and her experience with the ongoing protest. In fact, an interesting observation was made by the CJI in the many suits against farmer protests in the SC. This makes for much more interesting read when you see an RTI query filed by Saket Gokhale to NHAI , a Central Govt. agency which is supposed to be independent and asks if they had filed an FIR and asked compensation from Haryana State and Haryana State Police which had dug up National Highway 44 and if any permission was asked for the same from NHAI. And NHAI unable to take any action for the same. If this isn t shameful, I dunno what is
Sadly, the way the response has been worded makes it impossible for NHAI to discharge its own responsibilities and this becomes a precedent for other states now that know that NHAI is vulnerable. A pretty sad turn on events.
Indian Education can t go online
There was a recent article on scroll which shared how Indian education can t go online as only a few have computers with decent netlink speeds as well as other factors which are needed for online education. But there are also many things that the article doesn t take into account which actually make the task more difficult and raise the boundary more.
Now in most schools and colleges, the number of students to teacher ratio could be anywhere between 70-150 or even more. In the last few years, a lot of schools have been closed down by various Governments, including and not limited to the ruling Govt. They have in fact intensified closures of public schools wherever their Govt. has been in power. Closing to 5000+ schools in one state in a year is a dramatic shift and such has been happening time and again. In fact, the rising costs of Indian education has made many to leave Indian shores and do studies abroad. And once they do their masters or whatever, the chances of them coming back to India become more and more remote. In India the costs have been becoming so bad that NBFC s have started products targeting the same. How NBFC and Banks have (both public and private) have fared with respect to Indian consumers needs its own blog post but one word to describe it is bad . But as shared above, needs its own blog post.
Coming to the Indian context though, what has not been captured in that article is that the responsibility of making new content also raises huge barriers for teachers. My own experience in teacher s trainings for ICT usage has shown that most teachers do not know and use internet effectively both to sustain their own curiosity as well as their students. Part of which is whether you are private employee or a public school teacher, the teacher is not paid enough. I have had multiple conversations with friends over the years who are teachers who shared that they get 50% salary in-hand while they sign for 100%. This is more in the case or private schools though. In Govt. schools, the teachers apart from their regular administrative duties apart from teaching duties are also unpaid labor for Govt. policy. Take the recent covid crisis, it was the teachers who for months together went from door-to-door asking if they had a covid patient. This was all over India. Even for voter registration, census, polio and various other immunization efforts, the teachers are roped in. So apart from that, they somehow have to figure out how to make ends meet and also boost student morale. Hence the attention is only limited to the first couple of benches rather than the whole as a 45-minute to an hr. session is just not enough to go through a class of 70-150 school students giving individual attention. And this is when for most teachers, teaching is a means to an end and not the end itself.
I am going to take one example of science and sort of break-it-down in multiple steps and how I would have approached that topic for say the 5th-6th standard students in say a public school in Pune and especially if Covid would not have been an issue so you have face-to-face meetup.
There was recent news about a mysterious radio signal which came from one of our closest galactic neighbors Proxima Centauri. Now let s say there was a class I was teaching/sharing which I had shared before and there already is trust formed.
So before coming to the news, I would tell the students about frequency and more generally the notation of why we like to measure things and how we measure things. There is so much beautiful history which could be acted and enacted which can show and remains in mind why measurement is needed. Once that is understood, discussed and an underpinning is established, we could move to human perception or the lack of it. We know that humans have lots of limits in almost everything, whether it is talking, touching, hearing, all of our five senses are pretty limited with what we know of spectrum available in the immediate family kingdom as well as in the Universe. I would start with how far can a person throw his voice and be heard without using any other means. There does come a point where they need to use anything from a megaphone to a loudspeaker and what it actually does.
The other thing I would then talk is about the radio and ask the students to find more about the internals of a radio. If possible to bring an old radio to school where it could be disassembled. After they are familiar with some names of the electronic components and what they do, take them to the electronics market where they try to source all the things needed to make a radio and whatever they encounter. This would allow the students to try and do bargain shopping as well as learn from where to source things. Some might even get a copy or two of electronic projects where the shop themselves sell blueprints to hobbyists so that they can tinker.
If there is a place in the school where soldering can be done, then all can try and sooner or later we come to know if something works or not. There is also possibility of talking about noise cancellation and then the topic of ITU can also be bought up and how they do frequency allocation. Last but not the least then the topic can be approached about an alien civilization and an unknown radio signal and what it means and what it can mean.
Now if just one topic can give such a wide range of things to do and develop an understanding about not the subject itself but surrounding subjects as well I see no reason why teachers can t do this except they are handcuffed to lot of policy as well as real-life constraints.
For e.g. I remember in my school days, we used to go out once or twice a year and that used to be either a school picnic or something similar. The only other I know is going to Mumbai for Nehru planetarium and Nehru science Centre. Unfortunately, I didn t go at that time because the school was taking students via air and the tickets were super costly at the time and that too for a 10 minute journey between the two cities. Those were different days, today you can t have a direct flight between the two cities as it doesn t make an economic sense. It makes more sense to go to Mumbai via train or bus as you will reach Mumbai in about couple of hrs. Of course, Pune does have its own planetarium at New English school and there are a few amateur astronomy clubs in Pune but nothing on the scale that what Mumbai has, but then this is getting off-topic.
Now, again in an online world could this be done? Not without both the teacher and the student both spending lot of resources online and even then will be a lower understanding as both the hands-on experience as well as interacting with other students and learning from other students (aping) would be hugely limited. Even the social skills that students develop in a school setting will be rusted. My own social skills probably have weakened and rusted as I have very limited interaction with people over the past few months due to Covid fears and would be at least for the next few years till a large enough population is not vaccinated.
Welcome to gambaru.de. Here is my monthly report (+ the first week in November) that covers what I have been doing for Debian. If you re interested in Java, Games and LTS topics, this might be interesting for you.
Debian Games
I released a new version of debian-games, a collection of metapackages for games. As expected the Python 2 removal takes its toll on games in Debian that depend on pygame or other Python 2 libraries. Currently we have lost more games in 2020 than could be newly introduced to the archive. All in all it could be better but also a lot worse.
New upstream releases were packaged for freeorion and xaos.
Most of the time was spent on upgrading the bullet physics library to version 3.06, testing all reverse-dependencies and requesting a transition for it. (#972395) Similar to bullet I also updated box2d, the 2D counterpart. The only reverse-dependency, caveexpress fails to build from source with box2d 2.4.1, so unless I can fix it, it doesn t make much sense to upload the package to unstable.
Some package polishing: I could fix two bugs in stormbaancoureur, patch by Helmut Grohne, and ardentryst that required a dependency on python3-future to start.
I sponsored mgba and pekka-kana-2 for Ryan Tandy and Carlos Donizete Froes
and started to work on porting childsplay to Python 3.
Finally I did a NMU for bygfoot to work around a GCC 10 FTBFS.
Debian Java
I uploaded pdfsam and its related sejda libraries to unstable and applied an upstream patch to fix an error with Debian s jackson-jr version. Everything should be usable and up-to-date now.
I updated mina2 and investigated a related build failure in apache-directory-server, packaged a new upstream release of commons-io and undertow and fixed a security vulnerability in junit4 by upgrading to version 4.13.1.
The upgrade of jflex to version 1.8.2 took a while. The package is available in experimental now but regression tests with ratt showed, that several reverse-dependencies FTBFS with 1.8.2. Since all of these projects work fine with 1.7.0, I intend to postpone the upload to unstable. No need to break something.
Misc
This month also saw new upstream versions of wabt and binaryen.
I intend to update ublock-origin in Buster but I haven t heard back from the release team yet. (#973695)
Debian LTS
This was my 56. month as a paid contributor and I have been paid to work 20,75 hours on Debian LTS, a project started by Rapha l Hertzog. In that time I did the following:
DLA-2440-1. Issued a security update for poppler fixing 9 CVE.
DLA-2445-1. Issued a security update for libmaxminddb fixing 1 CVE.
DLA-2447-1. Issued a security update for pacemaker fixing 1 CVE. The update had to be reverted because of an unexpected permission problem. I am in contact with one of the users who reported the regression and my intention is to update pacemaker to the latest supported release in the 1.x branch. If further tests show no regressions anymore, a new update will follow shortly.
Investigated CVE-2020-24614 in fossil and marked the issue as no-dsa because the impact for Debian users was low.
Investigated the open security vulnerabilities in ansible (11) and prepared some preliminary patches. The work is ongoing.
Fixed the remaining zsh vulnerabilities in Stretch in line with Debian 8 Jessie , so that all versions in Debian are equally protected.
ELTS
Extended Long Term Support (ELTS) is a project led by Freexian to further extend the lifetime of Debian releases. It is not an official Debian project but all Debian users benefit from it without cost. The current ELTS release is Debian 8 Jessie . This was my 29. month and I have been paid to work 15 hours on ELTS.
ELA-302-1. Issued a security update for poppler fixing 2 CVE. Investigated Debian bug #942391, identified the root cause and reverted the patch for CVE-2018-13988.
ELA-303-1. Issued a security update for junit4 fixing 1 CVE.
ELA-316-1. Issued a security update for zsh fixing 7 CVE.
A Quick Recap from last year:
Kotlin is being packaged under the Google Summer of Code within the Debian organization itself. The major reason behind bringing Kotlin in Debian is to update all the Android packages which are now heavily dependent upon the Kotlin libraries.
The major work to bring Kotlin into Debian is done for the version 1.3.30, by Saif Abdul Cassim (goes by m36 on IRC) as a part of his GSoC'2019.
All his contributions to the team can be found in his blog posts.
So, for now, we have a bootstrap package and a Kotlin package for the version with 1.3.30.
There were still changes needed as we lacked some of the dependencies for Kotlin, and the source package lacked copyright information and didn t comply with Debian standards.
What's the present year brought for Kotlin?
To be specific the following were mainly left dependencies for Kotlin:
JLine3
intellij-community-idea
kotlin-bootstrap
And, we lack documentation for the newbies in order to get them started :(
Most importantly the crucial part was and still is, to figure out how to upload the package?
For GSoC'20, three students are selected as a part of project Android SDK tools in Debian.
What's the work done/left?
Work Done
A couple of dependencies were completed and reside in NEW Queue, those include Jline3 (done by @samyak-jn, myself), and intellij-community-idea (finished by @The_LoudSpeaker, Raman Sarda).
The kotlin package residing in m36 s repository had a couple of issues that were needed to be fixed to meet Debian standards, but Kotlin was building fine locally with the mentioned dependencies. :D
I (Samyak Jain) took the work for converting all the commits to the patches as all the changes were made directly to the source, and henceforth fixed rules and control files to meet Debian Standards. Debian is very particular about its license policies. The copyright was a pending task that was completed for Good.
The newer package exists at Samyak's repo.
I set up an initial wiki page for Kotlin as well, so everyone can follow. Thanks, Hans (@_hc) for the help with that. The wiki page for Kotlin exists here.
What's Blocking?
The most uncertain thing is to decide, how Kotlin will be uploaded to the Debian Archive?
What is the problem being faced?
The Kotlin-Bootstrap package consists of JAR files for various dependencies of kotlin such as Gradle, kotlin compiler, and kotlinx. The package is added to the build-depends of the main package so that the JAR files can be provided. Since the kotlin-bootstrap consists of binaries (JAR files), it is not feasible to upload the package as free software.
The other workaround was the Gradle 6.4 version, which consists of Kotlin files and generates a suitable JAR. But since the package needed Kotlin language itself, it was never updated, as it created a cyclic dependency.
Final workaround came, which proposed Kotlin to build from itself, that was a pretty impressive suggestion. But, we still have to look if the solution is feasible? Because, as far as I last checked and conversed with ebourg on the mailing list here, Emmanuel Bbourg mentioned very clearly that the rebuilt package is our interest. So, this is under WIP.
But, I fail to acknowledge the fact if we can drop the kotlin-bootstrap package totally, Kotlin will not be able to be built because each and every JAR file present in the bootstrap is needed.
That pretty much is the ongoing work and the update on the kotlin package. We intend to bring Kotlin to the Debian Archive as soon as possible :)
Have any queries or suggestions for Kotlin?
Please feel to drop a message at #debian-mobile channel on OFTC.
Yes, that's quite a mouthful! That magic selector is long in that
way because it needs a special syntax (specifically the
.anarcat.user suffix) for Debian to be happy. The -debian
string is to tell me where the key is published. The marcos
prefix is to remind me where the private is used.
(nsp.dnsnode.net being one of the NS records of the
debian.org zone.)
If all goes well, the tests should pass when sending from your server
as anarcat@debian.org.
Testing
Test messages can be sent to dkimvalidator, mail-tester.com
or check-auth@verifier.port25.com. Those tools will run Spamassassin
on the received emails and report the results. What you are looking
for is:
-0.1 DKIM_VALID: Message has at least one valid DKIM or DK
signature
-0.1 DKIM_VALID_AU: Message has a valid DKIM or DK signature from
author's domain
-0.1 DKIM_VALID_EF: Message has a valid DKIM or DK signature from
envelope-from domain
If one of those is missing, then you are doing something wrong and
your "spamminess" score will be worse. The latter is especially tricky
as it validates the "Envelope From", which is the MAIL FROM: header
as sent by the originating MTA, which you see as from=<> in the
postfix lost.
The following will happen anyways, as soon as you have a signature,
that's normal:
0.1 DKIM_SIGNED: Message has a DKIM or DK signature, not necessarily valid
And this might happen if you have a ADSP record but do not correctly
sign the message with a domain field that matches the record:
1.1 DKIM_ADSP_ALL No valid author signature, domain signs all mail
That's bad and will affect your spam core badly. I fixed that issue by
using a wildcard key in the key table:
Some of you might have noticed that I m into keyboards since a few
years ago into mechanical keyboards to be precise.
Preface
It basically started with the Swiss Mechanical Keyboard Meetup (whose website I
started later on) was held in the hackerspace of the CCCZH.
I mostly used TKL keyboards (i.e. keyboards with just the for
me useless number block missing) and tried to get my hands on
more keyboards with Trackpoints (but failed so far).
At some point a year or two ago, I looking into smaller keyboards for
having a mechanical keyboard with me when travelling. I first bought a
Vortex Core at Candykeys. The size was nice and especially having all
layers labelled on the keys was helpful, but nevertheless I soon
noticed that the smaller the keyboards get, the more important is,
that they re properly programmable. The Vortex Core is programmable,
but not the keys in the bottom right corner which are exactly
the keys I wanted to change to get a cursor block down there. (Later I
found out that there are possibilities to get this done, either with
an alternative firmware and a hack of it or
desoldering all switches and mounting an alternative PCB
called Atom47.)
40% Keyboards
So at some point I ordered a MiniVan keyboard from The Van Keyboards (MiniVan keyboards will soon be available again at The Key
Dot Company), here shown with GMK
Paperwork (also bought from and designed by The Van Keyboards):
The MiniVan PCBs are fully programmable with the free and open source firmware QMK and
started to use that more and more instead of bigger keyboards.
Layers
With the MiniVan I learned the concepts of layers. Layers are similar
to what many laptop keyboards do with the Fn key and to some extent
also what the German standard layout does with the AltGr key: Layers
are basically alternative key maps you can switch with a special key
(often called Fn , Fn1 , Fn2 , etc., or especially if there
are two additional layers Raise and Lower ).
There are several concepts how these layers can be reached with these
keys:
By keeping the Fn key pressed, i.e. the alternative layer is
active as long as you hold the Fn key down.
One-shot layer switch: After having pressed and released the Fn
key, all keys are on the alternative layer for a single key press and
then you are back to the default layer.
Layer toggle: Pressing the Fn key once switches to the alternative
layer and pressing it a second time switches back to the default
layer.
There are also a lot of variants of the latter variant,
e.g. rotating between layers upon every key press of the Fn key. In
that case it seems common to have a second special key which always
switches back to the default layer, kinda Escape key for layer
switching.
My MiniVan Layout
For the MiniVan, two additional layers suffice easily, but since I
have a few characters on multiple layers and also have mouse control
and media keys crammed in there, I have three additional layers on my
MiniVan keyboards:
TRNS means transparent, i.e. use the settings from lower
layers.
I also use a feature that allows me to mind different actions to a key
depending if I just tap the key or if I hold it. Some also call this
tap dance . This is especially very popular on the usually rather
huge spacebar. There, the term SpaceFn has been coined, probably
after this discussion on Geekhack.
I use this for all my layer switching keys:
The left spacebar is space on tap and switches to layer 1 if
hold. The right spacebar is a real spacebar, i.e. already triggers a
space on key press, not only on key release.
Layer 1 has numbers on the top row and the special characters of
the number row in the second row. It also has Home/End and Page
Up/Down on the cursor keys.
The key between the Enter key and the cursor-right key (medium
grey with a light grey caret in the picture) is actually the Slash and
Question Mark key, but if hold, it switches me to layer 2.
Layer 2 has function keys on the top row and also the special
characters of the number row in the second row. On the cursor keys it
has volume up and down as well as the media keys previous and
next .
The green key in the picture is actually the Backslash and Pipe
key, but if hold, it switches me to layer 3.
On layer 3 I have mouse control.
With this layout I can type English texts as fast as I can type them
on a standard or TKL layout.
German umlauts are a bit more difficult because it requires 4 to 6 key
presses per umlaut as I use the Compose key functionality (mapped to
the Menu key between the spacebars and the cursor block. So to type an
on my MiniVan, I have to:
press and release Menu (i.e. Compose); then
press and hold either Shift-Spacebar (i.e. Shift-Fn1) or Slash
(i.e. Fn2), then
press N for a double quote (i.e. Shift-Fn1-N or Fn2-N) and then
release all keys, and finally
press and release the base character for the umlaut, in this case
Shift-A.
And now just use these concepts and reduce the amount of keys to 28:
30% and Sub-30% Keyboards
In late 2019 I stumbled upon a nice little keyboard kit shop on Etsy which I
(and probably most other people in the mechanical keyboard scene)
didn t take into account for looking for keyboards called WorldspawnsKeebs. They offer mostly kits for keyboards of 40%
size and below, most of them rather simple and not expensive.
For about 30 you get a complete sub-30% keyboard kit (without
switches and keycaps though, but that very common for keyboard kits as
it leaves the choice of switches and key caps to you) named Alpha28 consisting
of a minimal Acrylic case and a PCB and
electronics set.
This Alpha28 keyboard is btw. fully open source as the source code,
(i.e. design files) for the hardware are published under a free
license (MIT license) on GitHub.
And here s how my Alpha28 looks like with GMK Mitolet (part of
the GMK Pulse group-buy) key caps:
So we only have character keys, Enter (labelled Data as there was no
1u Enter key with that row profile in that key cap set; I ll also call
it Data for the rest of this posting) and a small spacebar, not even
modifier keys.
The Default Alpha28 Layout
The original key layout by the developer of the Alpha28
used the spacbar as Shift on hold and as space if just tapped, and the
Data key switches always to the next layer, i.e. it switches the layer
permanently on tap and not just on hold. This way that key rotates
through all layers. In all other layers, V switches back to the
default layer.
I assume that the modifiers on the second layer are also on tap and
apply to the next other normal key. This has the advantage that you
don t have to bend your fingers for some key combos, but you have to
remember on which layer you are at the moment. (IIRC QMK allows you to
show that via LEDs or similar.) Kinda just like vi.
My Alpha28 Layout
But maybe because I m more an Emacs person, I dislike remembering
states myself and don t bind bending my fingers. So I decided to
develop my own layout using tap-or-hold and only doing layer switches
by holding down keys:
A triangle means that the settings from lower layers are used,
N/A means the key does nothing.
It might not be very obvious, but on the default layer, all keys in
the bottom row and most keys on the row ends have tap-or-hold
configurations.
Basic ideas
Use all keys on tap as labelled by default. (Data = Enter as
mentioned above)
Use different meanings on hold for the whole bottom row and some
edge column keys.
Have all classic modifiers (Shift, Control, OS/Sys/Win, Alt/Meta)
on the first layer twice (always only on hold), so that any key, even
those with a modifier on hold, can be used with any
modifier. (Example: Shift is on A hold and L hold so that Shift-A is
holding L and then pressing A and Shift-L is holding A and then
pressing L.)
Bottom row if hold
Z = Control
X = OS/Sys/Win
C = Alt/Meta
V = Layer 3 (aka Fn3)
Space = Layer 1 (aka Fn1)
B = Alt/Meta
N = OS/Sys/Win
M = Ctrl
Other rows if hold
A = Shift
L = Shift
Data (Enter) = Layer 2 (aka Fn2)
P = Layer 4 (aka Fn4)
How the keys are divided into layers
Layer 0 (Default): alphabetic keys, Space, Enter, and (on hold)
standard modifiers
Layer 1: numbers, special characters (most need Shift, too), and
some more common other keys, e.g.
Space-Enter = Backspace
Space-S = Esc
Space-D = Tab
Space-F = Menu/Compose
Space-K = :
Space-L = '
Space-B = ,
Space-N = .
Space-M = /, etc.
Layer 2: F-keys and less common other keys, e.g.
Enter-K = -
Enter-L = =
Enter-B = [
Enter-N = ]
Enter-M = \, etc.)
Layer 3: Cursor movement, e.g.
scrolling
and mouse movement.
Cursor cross is on V-IJKL (with V-I for Up)
V-U and V-O are Home and End
V-P and V-Enter are Page Up/Down.
Mouse movement is on V-WASD
V-Q
V-E and V-X being mouse buttons
V-F and V-R is the scroll wheel up down
V-Z and V-C left and right.
Layer 4: Configuring the RGB bling-bling and the QMK reset key:
P-Q (the both top corner keys) are QMK reset to be able to reflash
the firmware.
The keys on the right half of the keyboard control the modes of
the RGB LED strip on the bottom side of the PCB, with the upper two
rows usually having keys with some Plus and Minus semantics, e.g. P-I
and P-K is brightness up and down.
The remaining left half is unused and has no function at all on
layer 4.
Using the Alpha28
This layout works surprisingly well for me.
Only for Minus, Equal, Single Quote and Semicolon I still often have
to think or try if they re on Layer 1 or 2 as on my 40%s (MiniVan,
Zlant, etc.) I have them all on layer 1 (and in general one layer less
over all). And for really seldom used keys like Insert, PrintScreen,
ScrollLock or Pause, I might have to consult my own
documentation. They re somewhere in the middle of the keyboard, either
on layer 1, 2, or 3. ;-)
And of course, typing umlauts takes even two keys more per umlaut as
on the MiniVan since on the one hand Menu is not on the default layer
and on the other hand, I don t have this nice shifted number row and
actually have to also press Shift to get a double quote. So to type
an on my Alpha, I have to:
press and release Space-F (i.e. Fn1-F) for Menu (i.e. Compose); then
press and hold A-Spacebar-L (i.e. Shift-Fn1-L) for getting a
double quote, then
press and release the base character for the umlaut, in this case
L-A for Shift-A (because we can t use A for Shift as I can t hold a
key and then press it again :-).
Conclusion
If the characters on upper layers are not labelled like on the Vortex
Core, i.e. especially on all self-made layouts, typing is a bit like
playing that old children s game Memory: as soon as you remember (or your muscle memory knows)
where some special characters are, typing gets faster. Otherwise, you
start with trial and error or look the documentation. Or give up. ;-)
Nevertheless, typing on a sub-30% keyboard like the Alpha28 is much
more difficult and slower than on a 40% keyboard like the MiniVan. So
the Alpha28 very likely won t become my daily driver while the MiniVan
defacto is my already my daily driver.
But I like these kind of challenges as others like the game
Memory . So I ordered three more 30% and sub-30% keyboard kits and
WorldspawnsKeebs for soldering on the upcoming weekend during the
COVID19 lockdown:
A Reviung39
to start a new try on ortholinear layouts.
A Jerkin (sold out, waitlist available) to try an Alice-style
keyboard layout.
A Pain27 (which btw. is also open source under the CC0 license) to try typing
with even one key less than the Alpha28 has. ;-)
My free software activities in february 2020
March is ending but I finally wrote my monthly report about activities in Debian
and Free Software in general for February.
As I already wrote here, I
attended to FOSDEM 2020 on February 1st and 2nd in Brussels. It was a amazing
experience.
After my return to Curitiba, I felt my energies renewed to start new challenges.
MiniDebConf Macei 2020
I continued helping to organize MiniDebConf and I got positive answers from
4Linux and Globo.com and they
are sponsorsing the event.
FLISOL 2020
I started to talk with Maristela from IEP - Instituto de Engenharia do
Paran and after some messages and I joined a meeting with
her and other members of C mara T cnica de Eletr nica, Computa o e Ci ncias de
Dados.
I explained about FLISOL in Curitiba to them and
they agreed to host the event at IEP. I asked to use three spaces: Auditorium
for FLISOL talks, Sal o Nobre for meetups from
WordPress and
PostgreSQL Communities, and
the hall for Install Fest.
Besides FLISOL, they would like to host other events and meetups from
Communities in Curitiba as Python, PHP, and so on. At least one per month.
I helped to schedule a PHP Paran Community
meetup on March.
New job
Since 17th I started to work at Rentcars as
Infrastructure Analyst. I m very happy to work there because we use a lot of
FLOSS and with nice people.
Ubuntu LTS is the approved OS for desktops but I could install Debian on my
laptop :-)
Misc
I signed pgp keys from friends I met in Brussels and I had my pgp key signed by
them.
Finally my MR to the DebConf20 website fixing
some texts was accepted.
I have watched v deos from FOSDEM
Until now, I saw these great talks:
Growing Sustainable Contributions Through Ambassador Networks
Building Ethical Software Under Capitalism
Cognitive biases, blindspots and inclusion
Building a thriving community in company-led open source projects
Building Community for your Company s OSS Projects
The Ethics of Open Source
Be The Leader You Need in Open Source
The next generation of contributors is not on IRC
Open Source Won, but Software Freedom Hasn t Yet
Open Source Under Attack
Lessons Learned from Cultivating Open Source Projects and Communities
Post-Solskogen, there hasn't been all that many commits in the main Nageru
repository, but that doesn't mean the project is standing still. In
particular, I've been working with NVIDIA to shake out a crash bug in their
drivers (which in itself uncovered some interesting debugging techniques,
although in the end, the bug turned out just to be uncovered by the boring
standard technique of analyzing crash dumps and writing a minimal program
to reproduce). But I've also been looking at intraframe codecs; my sort-of
plan was to go to VideoLAN Dev Days
to present my findings, but unfortunately, there seems to be a schedule
conflict, so instead, you can have some scattered random notes:
JPEG is really impressive technology. It's made in 1992, and it's still
frighteningly close to state of the art! Beating it without getting a lot
slower isn't trivial at all; witness that even with WebP etc., we still
don't have a JPEG-killer because it's just so incredibly good. (Granted,
in 1992, decompressing a JPEG would easily take half a minute or more.)
rANS is pretty
neat; it gives you almost all the advantages of arithmetic
coding, but does without divisions in the decoder (and if you have static
probabilities and fast high multiplies, also in the encoder). I still don't
feel like I understand it fully, though. And it has the odd property of
having to encode and decode in different directions, which may or may not
be a problem to you. But ryg's
interleaving tricks to get SIMD are pretty nice;
I won't claim to fully understand those either. Maybe I will need to
eventually.
GPU performance models continue to bend my head. GPUs may have managed to
make a parallel programming model that people actually manage to use,
but getting really high performance out of compute shaders is still hard
to get use to.
It really annoys me that Quick Sync doesn't support luma-only encoding
(ie. 4:0:0); the best you can do is seemingly 4:2:0 and then have empty
chroma planes, which wastes resources. It would have been a nice way to
hack around the limitation that you can't have 4:2:2 or alpha.
Time-frequency switching
is the solution to a problem that sounds trivial if you're a DSP beginner
and nearly impossible if you've actually done some DSP. I'm not intuitively
convinced it's worth it if you have fast float muladds, but it's pretty
neat. Allowing multiple block sizes to an intraframe codec has a cost in
that you'll need a size decision heuristic, though, which pretty much
instantly complicates the encoder.
Work in progress :-) Maybe something more coherent will come out eventually.
Edit: Forgot about TF switching!
I m currently doing some embedded work on ARM systems. Having a virtual ARM environment is of course helpful. For the i586 class embedded systems that I run it s very easy to setup a virtual environment, I just have a chroot run from systemd-nspawn with the --personality=x86 option. I run it on my laptop for my own development and on a server my client owns so that they can deal with the hit by a bus scenario. I also occasionally run KVM virtual machines to test the boot image of i586 embedded systems (they use GRUB etc and are just like any other 32bit Intel system).
ARM systems have a different boot setup, there is a uBoot loader that is fairly tightly coupled with the kernel. ARM systems also tend to have more unusual hardware choices. While the i586 embedded systems I support turned out to work well with standard Debian kernels (even though the reference OS for the hardware has a custom kernel) the ARM systems need a special kernel. I spent a reasonable amount of time playing with QEMU and was unable to make it boot from a uBoot ARM image. The Google searches I performed didn t turn up anything that helped me. If anyone has good references for getting QEMU to work for an ARM system image on an AMD64 platform then please let me know in the comments. While I am currently surviving without that facility it would be a handy thing to have if it was relatively easy to do (my client isn t going to pay me to spend a week working on this and I m not inclined to devote that much of my hobby time to it).
QEMU for Process Emulation
I ve given up on emulating an entire system and now I m using a chroot environment with systemd-nspawn.
The package qemu-user-static has staticly linked programs for emulating various CPUs on a per-process basis. You can run this as /usr/bin/qemu-arm-static ./staticly-linked-arm-program . The Debian package qemu-user-static uses the binfmt_misc support in the kernel to automatically run /usr/bin/qemu-arm-static when an ARM binary is executed. So if you have copied the image of an ARM system to /chroot/arm you can run the following commands like the following to enter the chroot:
cp /usr/bin/qemu-arm-static /chroot/arm/usr/bin/qemu-arm-static
chroot /chroot/arm bin/bash
Then you can create a full virtual environment with /usr/bin/systemd-nspawn -D /chroot/arm if you have systemd-container installed.
Selecting the CPU Type
There is a huge range of ARM CPUs with different capabilities. How this compares to the range of x86 and AMD64 CPUs depends on how you are counting (the i5 system I m using now has 76 CPU capability flags). The default CPU type for qemu-arm-static is armv7l and I need to emulate a system with a armv5tejl. Setting the environment variable QEMU_CPU=pxa250 gives me armv5tel emulation.
The ARM Architecture Wikipedia page [2] says that in armv5tejl the T stands for Thumb instructions (which I don t think Debian uses), the E stands for DSP enhancements (which probably isn t relevant for me as I m only doing integer maths), the J stands for supporting special Java instructions (which I definitely don t need) and I m still trying to work out what L means (comments appreciated).
So it seems clear that the armv5tel emulation provided by QEMU_CPU=pxa250 will do everything I need for building and testing ARM embedded software. The issue is how to enable it. For a user shell I can just put export QEMU_CPU=pxa250 in .login or something, but I want to emulate an entire system (cron jobs, ssh logins, etc).
I ve filed Debian bug #870329 requesting a configuration file for this [1]. If I put such a configuration file in the chroot everything would work as desired.
To get things working in the meantime I wrote the below wrapper for /usr/bin/qemu-arm-static that calls /usr/bin/qemu-arm-static.orig (the renamed version of the original program). It s ugly (I would use a config file if I needed to support more than one type of CPU) but it works.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv)
if(setenv("QEMU_CPU", "pxa250", 1))
printf("Can't set $QEMU_CPU\n");
return 1;
execv("/usr/bin/qemu-arm-static.orig", argv);
printf("Can't execute \"%s\" because of qemu failure\n", argv[0]);
return 1;