Whenever people use a non-x86 system, sooner or later someone asks: “But can it run [name of x86-64 only binary]?”. So, let’s check how to make it possible.
When you look for ‘how to run x86-64 apps on Fedora/Arm’, you usually end up with Asahi’s documentation about it.
It is a good thing to read to understand the stack. But if your Arm system runs
a 4K page size kernel, then most of that documentation can be skipped. You would
not need muvm
nor binfmt-dispatcher
packages.
What you need is FEX-emu, and nothing else, as it recommends all required components.
To make it easier, I recommend removing some of QEMU packages:
dnf remove qemu-static-*
so only FEX-emu will be used for running foreign
architecture binaries.
Installing FEX-emu should also install the Fedora/x86-64 rootfs. So, let check if emulation is working:
$ uname -m
aarch64
$ FEXBash "uname -m"
erofsfuse 1.8.9
<W> erofs: /usr/share/fex-emu/RootFS/default.erofs mounted on /run/user/1000/.FEXMount2262322-Fjd32T with offset 0
x86_64
If you have errors at this stage, then check what you have in the /usr/lib/binfmt.d/ directory. There should be only two files:
$ ls /usr/lib/binfmt.d/ -l
-rw-r--r--. 1 root root 198 07-13 02:00 FEX-x86_64.conf
-rw-r--r--. 1 root root 195 07-13 02:00 FEX-x86.conf
So, let me check speed of the emulated CPU. I ran Geekbench 6 on it:
CPU Information
Name Neoverse N1
Topology 1 Processor, 80 Cores
Identifier GenuineIntel Family 6 Model 166 Stepping 1
Base Frequency 3.00 GHz
L1 Instruction Cache 32.0 KB x 80
L1 Data Cache 32.0 KB x 80
L2 Cache 512 KB x 80
L3 Cache 8.00 MB
Instruction Sets sse2 sse3 pclmul fma3 sse41 aesni avx avx2 shani vaes
Test results were awful:
That’s the level of an Intel Atom CPU from 2021. My AMD Ryzen 5 3600 has much better results.
I asked FEX-Emu developers a few days ago with this kind of question. There are several Arm CPU features that can be used to make emulation faster:
Section | Features |
---|---|
Crypto | AES, CRC, SHA, PMULL |
TSO emulation | Apple Silicon TSO bit, LRCPC, LRCPC2, LSE2 |
Flags stuff | AFP, FlagM, FlagM2 |
Atomic operations | LSE |
Misc | FCMA, FRINTTS, RPRES, SVE, SVE_bitperm |
Future | RCPC3, CSSC, RAND |
The Ampere Altra is an old, Arm v8.2 CPU. Its Neoverse-N1 cores are from 2019 and can support only a small subset of entries from the table above: all crypto ones + LSE and LRCPC.
After publishing post I got some additional hints from FEX-emu folks to make emulation a bit faster.
One is reducing precision of x86 FPU, second is disabling TSO. So my configuration file (“~/.fex-emu/Config.json”) looks like this now:
{
"Config": {
"RootFS": "/usr/share/fex-emu/RootFS/default.erofs",
"X87ReducedPrecision": "1",
"TSOEnabled": "0"
},
"ThunksDB": {
"GL": 1,
"Vulkan": 1
}
}
This gave Factorio a visible speed-up. Cannot compare Geekbench results cause it crashes randomly after configuration changes.
Now that we have sorted out software, let’s start with games (because what else would you do with x86(-64) emulation?). Which usually means Steam.
First of all, we need Steam package. I took it from the RPM Fusion non-free page. The next step is installation. This is done without dependencies (those will be provided by the FEX-emu rootfs), and we need to tell RPM that the architecture of the package is not that important:
$ sudo rpm -i steam-1.0.0.82-3.fc42.i686.rpm --nodeps --ignorearch
The next step is the Steam installation, where we run it under emulation:
FEXBash steam
It can take some time, but at the end you should get the Steam window:
So now we are ready to play some games, right?
As you may know from one of my previous posts, I am addicted to the the Factorio game. So how it goes on an Ampere Altra-based system?
Let me be honest: without tweaking FEX-Emu config it was unplayable. At least not with my saved games, in 3440x1440 resolution. What was 60/60 on a Ryzen 5 3600 went to 8-11/59.5 ;(
After tweaking FEX-Emu configuration Factorio started to be more playable. In areas with many robots it was running at 16-25 FPS and there were moments with close to 60/60 but it had to be close zoom to deserted area. I may consider attempt to finish game during 100 hours.
A few days ago, @chenlin3 added Ninja build solution for EDK2 build system. I took a look at that change.
At first, I built the ALTRA8UD-1L2T firmware without using Ninja. It took 30 seconds (11 minutes of total CPU time). Then I did a run with Ninja. It took 2 minutes (72 minutes of total CPU time).
Hmm… It should be much faster. I retried and looked at the htop window. And I saw a lot of “FEXInterpreter” lines… So it was running in emulation.
I then replaced the x86-64 binary of Ninja with a symlink to the aarch64 one, and then it was a visible improvement.
I commented on the pull request with a NAK.
So, the final question is: “Is it worth using x86(-64) emulation at all?”…
I do not plan to use it much. I may try to play some older games like Torchlight II, which I managed to run once and then it stopped working.
Almost ten years ago, I tried to use an Applied Micro Mustang as a desktop. And it was painful.
Now, with my Altra-based system, I decided to try it again.
Compared to the Pinkiepie (the Mustang), Wooster (the current system) looks beefy:
component | Pinkiepie | Wooster |
---|---|---|
cpu model | X-Gene 1 | Altra Q80-30 |
core model | X-Gene 1 | Neoverse-N1 |
core arch | v8.0 | v8.2 |
core count | 8 | 80 |
memory speed | 1866 MHz | 3200 MHz |
memory amount | 16 GB | 128 GB |
storage | SATA SSD (500 MB/s) | PCIe 4.0 NVME (6200 MB/s) |
graphics card | Radeon HD5450 | Radeon RX6700XT |
resolution | 1920x1080 | 3440x1440 |
Both systems ran the latest, stable release of Fedora with the KDE desktop.
I started by rsyncing my home directory from Puchatek (my x86-64 desktop) to Wooster (the AArch64 system). To have the same environment in both places. Of course, I had to replace a few binaries in the ~/.local/bin directory with their AArch64 equivalents. And I regenerated some Python virtual environments.
The desktop worked as before, Thunderbird fetched mail and sent it, files could be edited in Neovim-qt as before etc.
Films from the local NAS share worked just fine using the same “mpv” as on Puchatek.
But then you realise that it would be nice to listen to some music. For several reasons, I am using Spotify for this. And their app is x86-64 only…
Firefox refused to play anything. So did Chromium. I Installed the “widevine-installer” package, ran one command and, thanks to binaries from ChromeOS, both web browsers started playing. But Firefox was stopping after each song, so I had to revert to Chromium for it. Widgets on the KDE Plasma desktop recognised it, and I had information and playback controls embedded in the top panel.
But what about films on streaming services? Well, let me create a table, as I was surprised by the results:
Streaming service | Firefox | Chromium |
---|---|---|
Amazon Prime Video | Works | Works |
Disney Plus | Works | Works |
Max | Works | Works |
Netflix | Fails (E100) | Fails (E100) |
YouTube | Works, up to 4320p | Works, up to 1440p* |
For Chromium it depends which build of it you are using. I used Fedora package and then was pointed to Flathub build of Chromium as better one.
Flathub’s Chromium plays 2160p videos on YouTube and does not have an option to choose higher resolutions so I could not test 4320p ones.
Again, let make a table of “Graphics Feature Status” information:
Entry | Fedora build | Flathub build |
---|---|---|
Canvas | Software only | Hardware accelerated |
Direct Rendering Display Compositor | Disabled | Disabled |
Compositing | Software only | Hardware accelerated |
Multiple Raster Threads | Enabled | Enabled |
OpenGL | Disabled | Enabled |
Rasterization | Software only | Hardware accelerated |
Raw Draw | Disabled | Disabled |
Skia Graphite | Disabled | Disabled |
TreesInViz | Disabled | Disabled |
Video Decode | Software only | Hardware accelerated |
Video Encode | Software only | Software only |
Vulkan | Disabled | Disabled |
WebGL | Software only | Hardware accelerated |
WebGL2 | Software only | Hardware accelerated |
WebGPU | Disabled | Disabled |
WebNN | Software only | Disabled |
How does the 3D hardware acceleration situation look? I tested it with the WebGL Aquarium.
Amount of fish | Firefox | Chromium/Fedora | Chromium/Flathub |
---|---|---|---|
1 | 75 | 18 | 75 |
1000 | 75 | 9 | 75 |
5000 | 42-71 | 4 | 29-37 |
10000 | 33-39 | 1 | 15-17 |
I do not remember numbers I got with the same graphics card in my x86-64 system.
I am planning to write a few more posts about using my Ampere Altra-based system as a desktop. So stay tuned.
In the hunt for a development machine, I got to the next phase. I did some shopping, and there it is: my own Ampere Altra-based system.
As you may have read in my previous post, I used several AArch64 systems for local development. And the latest one, an Apple MacBook Pro, is nice and fast but has some limits — does not support 64k page size. Which I need for my work.
So I have decided to buy myself an Ampere Altra system. As cheap as possible.
The only part I needed to buy brand new was a motherboard. And the only “affordable” one was AsrockRack ALTRA8BUD-1L2T, which was a product for data centres (so I was told).
Next, a used processor. At first, the idea was to buy a Q64-22 (64 cores, 2.2 GHz clock), but when the seller on eBay was not responding, one of my friends decided to upgrade his Altra systems and offered me a Q80-30 (80 cores, 3.0 GHz clock).
The CPU requires cooling. There are not many options for the LGA 4926 socket. I found an Arctic Freezer 4U-M in one of the online stores here in Poland and bought the only one they had.
Each computer needs memory, right? So I went with used ones again, as there is a huge market for used server parts. I bought eight sticks of 16GB each; the model is SK-Hynix HMA82GR7CJR8N-XN. It is not present on the official Ampere Altra memory Approved Vendor List.
Working fine (after re-seating three sticks):
DRAM populated DIMMs:
SK0 MC0 S0: RDIMM[ad:80] 16GB 3200 ECC 2R x8 RCD[32:86] HMA82GR7CJR8N-XN
SK0 MC1 S0: RDIMM[ad:80] 16GB 3200 ECC 2R x8 RCD[32:86] HMA82GR7CJR8N-XN
SK0 MC2 S0: RDIMM[ad:80] 16GB 3200 ECC 2R x8 RCD[32:86] HMA82GR7CJR8N-XN
SK0 MC3 S0: RDIMM[ad:80] 16GB 3200 ECC 2R x8 RCD[32:86] HMA82GR7CJR8N-XN
SK0 MC4 S0: RDIMM[ad:80] 16GB 3200 ECC 2R x8 RCD[32:86] HMA82GR7CJR8N-XN
SK0 MC5 S0: RDIMM[ad:80] 16GB 3200 ECC 2R x8 RCD[32:86] HMA82GR7CJR8N-XN
SK0 MC6 S0: RDIMM[ad:80] 16GB 3200 ECC 2R x8 RCD[32:86] HMA82GR7CJR8N-XN
SK0 MC7 S0: RDIMM[ad:80] 16GB 3200 ECC 2R x8 RCD[32:86] HMA82GR7CJR8N-XN
The rest of the parts are ordinary ones available in any random store.
The case was a challenge. The ALTRAD8UD-1L2T is a “deep MicroATX” case which means I needed a case that can take an EATX motherboard (they are a bit deeper than ATX).
I looked through pictures in online stores and selected about 10 candidates. Then I started watching reviews and crossed several of them out. Usually because the holes for handling cables were too close to the edge of a board.
Finally, bought an Endorfy 700 Air case. It came with five 120mm fans (3 at the front, one at the rear, and one on the top). There was a lot of space behind the motherboard’s plate for cabling, and a fan splitter so I could connect all five case fans as one to the motherboard.
And the PSU compartment has an extra hole for PCIe power cables!
The ALTRAD8UD-1L2T motherboard is expected to be powered by a 12V PSU only. There is no connection port for the ATX 24-pin plug. Instead, there is an adapter that takes only power-on and power-good signals from it and connects to the small 4-pin port on the motherboard.
There are three EPS12V connectors available. I used two of them. The MSI MPG A850G power supply I bought comes with two such cables and has an option for connecting the third one.
What else is needed? Some NVME for storage (Lexar LM790 2TB) and a random graphics card (Radeon Pro WX2100, remembering the old times).
And I was ready to build the system.
The motherboard feels small once the CPU cooler is mounted. And a low-profile graphics card is almost invisible:
The back side of the case shows where I hid the ATX 24-pin adapter and most of the cables.
Of course, if I went cheap, then how cheap did it end up being?
Component | Price in PLN |
---|---|
motherboard | 4 068 |
CPU | 1 341 |
CPU cooler | 191 |
memory | 696 |
case | 395 |
power supply | 529 |
NVME | 522 |
In total: 7 732 PLN (around 1 800 EUR). About 500 EUR more than I anticipated at first.
The CPU upgrade to 80 cores was extra 100 EUR. Memory came from another seller, as the first one ended their sale before I was ready to buy, resulting in an extra 40 EUR to the cost.
At first, I wanted to have 2GB per core, but with the CPU upgrade, I would have needed to go to 256 GB, and that would have been another 250-300 EUR extra.
The case had a 30% discount due to a promotion, and the NVME came with 7% cashback.
My current plans for this system are:
All Linux systems will have both 4k and 64k page size kernels.
Since I started working on AArch64 in 2012, I had been searching for a hardware system capable of meeting my development needs at home.
In 2014, I got Applied Micro Mustang for home use. I named it “pinkiepie” because I use cartoon-character names for all systems I manage. As both mustangs and ponies are types of horse, I decided that Pinkie Pie from My Little Pony was a good name.
This system served me for several years. With 8 cores, 32 GB RAM, and a SATA SSD for storage, it was enough to build RHEL, Fedora, Debian packages — both for AArch64 and 32-bit armhf.
It failed in 2020, was briefly operational again, but has remained non-operational since then.
In 2021, I acquired Solidrun HoneyComb. With sixteen Cortex-A72 cores, 32 GB RAM, and SATA SSD from Pinkiepie, it served as my development machine.
Jagular’s name came from Winnie the Pooh, as this system was my own (unlike Mustang, which was Red Hat property).
In 2023, I took a chance and replaced my work laptop with an Apple MacBook Pro. This gave me more modern Arm system with 10 fast CPU cores.
The system’s name came from My Little Pony again.
After the installation of Fedora Asahi Remix on the MacBook, I moved Jagular to storage. And sold it in 2025.
At the end of 2024, Radxa announced “World’s First Open Source Arm V9 Motherboard”. Several people sent me a link to it. I checked the details and decided to wait for any delivery of source code for this platform.
It took them months to release anything. An old (6.1.44) version of the Linux kernel, a copy of EDK2 sources with 23 megabytes of binary blobs.
The good part was that this SBC was capable of running mainline Linux in ACPI mode. Still, the situation regarding it was far from what their slogan promised…
There were “Arm V9” systems before it, so it was not “World’s First”. There were several blobs needed to run it, so it was not “Open Source”.
I was following discussions on their forum and had a feeling that the more I read, the more I postpone my order.
After leaving Linaro, I started working on Red Hat Enterprise Linux (RHEL) again. And while most things can be tested in virtual machines on Applejack, some tasks require booting 64k page size kernels — which the Apple M1 Pro is not capable of doing.
As a temporary solution, I used remote boxes from the Red Hat lab, but it was not a good solution in the long term.
So I started searching again.
In May 2024, I was one step from spending 3000 EUR on Ampere Altra-based workstation — the typical 64-core system with 128 GB of RAM.
I did not buy it because at that time I was looking at it as an Arm desktop. Which, at that time, it was far from — issues with AMD cards under Linux required patching the kernel with out-of-tree patches.
Time passed, and I looked at it from different perspective — as “a tool”.
You see — I split computer systems into two categories: tools and toys.
Computer systems that have to do their job are tools. My x86-64 desktop is a tool. The same with my x86-64 NAS, or my work laptop.
Those systems have their purposes and have to work. No tricks with firmware or operating systems, no self-built kernels.
Some of my computer systems are toys — I do not expect them to be stable, I do not keep any important data on them. This is where most of my Arm SBCs (Seriously Bad Computers) are.
FriendlyElec NanoPC-T6 LTS on my desk is a perfect example. At this moment, it is offline and waits for firmware reflashing because I flashed the wrong file two weeks ago. And many times I have run my own kernels on it to check some out-of-tree patches adding support for hardware features.
In March, I decided to go and buy an Ampere Altra system. But this time, on a budget: a brand new motherboard, a used CPU, used RAM.
I got a few people interested, tried to find a way for some kind of discount and started ordering parts. During the next few weeks I will build myself yet another development machine. For my own use, at home.
But this will be another blog post.
A few days ago, I was asked “Do you use AI?”. I also noticed some recent blog posts and emails about it.
So let me explain how I use AI on this blog.
If you look through this blog’s archives you may see how terrible my English grammar used to be (not that it is particularly good nowadays). Back in 2010 I started attending English lessons to improve both my grammar and vocabulary. And it paid off.
Still, my writing style can be described as ‘Hrw English’. I try to keep it British English rather than American (I learnt the British version throughout my formal education). My vocabulary includes words from American, Australian and other variants.
My previous post about my arm problem went through ChatGPT:
Take text below, fix grammar to British English and show changes side-by-side
So let take some examples from the result:
Original | ChatGPT |
---|---|
Some time ago my right arm started to hurt. In the beginning it was a bit annoying but then got serious. So I went to orthopaedist. | Some time ago, my right arm started to hurt. At first, it was a bit annoying, but then it became serious. So, I went to an orthopaedist. |
MRI was the other thing. My daughter told me already that I need to be prepared for loud annoying noise. What I was not prepared was some shitty pop played over some shitty headphones. zOMG… | The MRI was a different matter. My daughter had already told me to expect loud, annoying noise. What I wasn’t prepared for was some dreadful pop music played over equally dreadful headphones. zOMG… |
I know that those headphones have to be as plastic as possible to survive inside of MRI machine but next time I will ask for not playing anything. | I know the headphones have to be made entirely of plastic to survive inside the MRI machine, but next time I’ll ask them not to play anything. |
BTW: Can anyone recommend some good Linux application for watching DICOM images (other than AlizaMS)? | By the way, can anyone recommend a good Linux application for viewing DICOM images (other than AlizaMS)? |
Most of cases are related to professional sport people. A group where I do not belong. | Most cases are related to professional athletes—a group to which I definitely do not belong. |
I promised my daughter some trips during summer vacations. One set of attractions will slip for 3rd time. | I promised my daughter some trips during the summer holidays. One set of attractions will be postponed for the third time. |
So what do we have here? Some vocabulary changes like “professional sport people” -> “professional athletes”, the usual missing “a/an/the”, more commas, work order changes etc.
I review the suggestions and choose some of them: vocabulary tweaks, missing articles and some word order changes. Most of the time I ignore punctuation related ones as I always had problems with commas — never mind which language I was writing in.
I am leaving several errors as they were — I wrote that text so let it show my mistakes instead of hiding them. And I prefer to use ‘some’ rather than ‘few/a few’ as I always forget when to use which ;D
After some updates I got question:
Let me know if you’d like it shortened, rephrased in a more humorous or technical tone, or formatted for a specific blog engine like Hugo, Ghost, or WordPress.
Fun starts with mixing all of them:
updated text below. give me British English version, differences side-by-side and then more technical tone version and more causal one plus more humorous one. render markdown
Look how one sentence can change:
Those are original, technical, causal, humorous versions.
I have to admit that the ‘more technical tone’ version was a bit too much for me. It looked completely different from my writing style. Anyway I read it twice and took some wording from it. The ‘more causal’ version looks what I could write but still not quite my style. And the humorous version is pure fun to read but nothing to copy from it.
Will I continue to use of AI on this blog? Probably yes. It gives me good suggestions and fixes some of my language/grammar mistakes. And I do not have to apply all the changes so text keeps my style.
Is it a way for other people? No idea but I recommend giving it a try and seeing it for yourself. The results can be interesting.
Some of my readers may say that I’ve always had a problem with Arm. The company, the architecture, the ecosystem etc.
But today I have some other problem. With arm.
Some time ago my right arm started to hurt. At first, it was a bit annoying but then got serious. So I went to an orthopaedist.
“Please stand up, please stand up” and then started moving my arms in various ways. We wrestled a bit, I did that “fasten your bra” move and the diagnosis was clear: I had a problem with my arm.
I received some sick leave and a list of imaging tests to do.
I went through the standard imaging flow:
I visited a few places and received some optical media with images (and some in physical form).
The RTG and USG were simple. I have done them many times before.
The MRI was another matter. My daughter had already told me to be prepared for loud, annoying noise. What I was not prepared for was some awful pop music played through dreadful headphones. zOMG… I know that those headphones have to be as plastic as possible to survive inside the MRI machine but next time I will ask them to not play anything.
BTW: Can anyone recommend a good Linux application for watching DICOM images (other than AlizaMS)?
“Looks like you have SLAP (Superior Labrum Anterior Posterior).” Yay…
Most cases are related to professional athletes — a group to which I definitely do not belong.
I think I need to rethink my life desk setup.
But first have to sort out stuff and how my summer time will look like. Rehabilitation, exercises, handling things with only one arm (not my dominant one).
So if you would like me to do something for you before September then consider postponing as I may not be ready for it.
I promised my daughter some trips during summer break. One set of attractions will be postponed for 3rd time. We have some conventions to attend and they should be safe.
The trip to visit my mother will be more difficult. No way to drive a car means that I will have to rely on public transport. In area where it sucks. Should be fun (for some sick definition of “fun”).
I regularly visit Seoul, and for the last couple of years I've been doing segments from the Seoul Trail, a series of walks that add up to a 150km circuit around the outskirts of Seoul. If you like hiking I recommend it, it's mostly through the hills and wooded areas surrounding the city or parks within the city and the bits I've done thus far have mostly been very enjoyable. Everything is generally well signposted and easy to follow, with varying degrees of difficulty from completely flat paved roads to very hilly trails.
The trail had been divided into eight segments but just after I last visited the trail was reorganised into 21 smaller ones. This was very sensible, the original segments mostly being about 10-20km and taking 3-6 hours (with the notable exception of section 8, which was 36km) which can be a bit much (especially that section 8, or section 1 which had about 1km of ascent in it overall). It does complicate matters if you're trying to keep track of what you've done already though so I've put together a quick table:
Original | Revised |
---|---|
1 | 1-3 |
2 | 4-5 |
3 | 6-8 |
4 | 9-10 |
5 | 11-12 |
6 | 13-14 |
7 | 15-16 |
8 | 17-21 |
This is all straightforward, the original segments had all been arranged to start and stop at metro stations (which I think explains the length of 8, the metro network is thin around Bukhansan what with it being an actual mountain) and the new segments are all straight subdivisions, but it's handy to have it written down and I figured other people might find it useful.
About a year ago I wrote a post about a need for a good keyboard. And that I am thinking of making mechanical one.
During last week I built one.
Twenty years ago I had a problem with repetitive strain injury (RSI in short). Typing on normal PC keyboard was quite impossible for me. Someone recommended buying one of those “fancy” ergonomic ones. And that’s how I ended with Microsoft Natural Keyboard Elite.
It was a great help. Got used to layout and my RSI problems were going away. Then bought second one to have one at home and one at work.
Time passed, keycaps were worn up so I got another keyboard — you can read the story in last year post about keyboards.
During last year I looked at several keyboards. Checked KMK, QMK, ZMK and other solutions of keyboard firmware. Watched countless videos on how to make keyboard and read many articles about it.
One layout caught my eye: TGR Alice as it was quite simple ergonomic one. Then found Arisu which added cursor keys and did some other changes. And finally Adelheid which added function keys.
As those layouts are available on MIT license I took Adelheid and altered its layout a bit:
I had some parts already (ordered then to my MS4KMech project which I abandoned in meantime) and decided that my first keyboard will be as cheap as possible:
So cost of parts was about 20 EUR.
As a way to keep costs down I printed plate in two pieces (Ender 3 table size was a limit) and used some screws and plates to keep them together.
Mounted switches and started soldering. Simple diode to diode to create rows. And it is visible that I watched some video after first 3 rows of one half ;D
Instead of forming diodes I soldered them and then use small pliers to form rows. Later started cutting legs before soldering.
Columns were easier. Spool of kynar and stripping isolation using nails did the job.
Added a bunch of colour wires to be able to test did my soldering resulted in something working. Grabbed Raspberry Pico from a drawer, flashed it with QMK firmware and testing bench was ready:
And it almost worked! One key was not working. Turned out that diode was soldered in wrong direction. Happens.
For second half I took a bit different strategy. Decided to solder columns first as they took me more time than rows. Whole half went much faster then first.
Then all that left was finding a way to connect both halves (I did not wanted to make a split keyboard) and connect rows. I used pieces of old universal PCB and screws:
I bought Ultimate Pico RP2040 especially for keyboard project months ago. Compared to Raspberry Pico this board had USB-C port and one line more (GP29). Also less GND pins so 17 GPIO lines are on one side. My keyboard has 16 columns so this allowed me to have all columns connected on one side of board and use second side connections for rows:
I may do not look nice but it works :D
I flashed QMK and started testing. Turned out that one column is not working. Soldered wire and it was fine.
3 other keys were not working. One needed soldering but other ones looked fine.
QMK has a solution for it: “Console debugging”. I added a bit of code to
keymap.c
file:
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// If console is enabled, it will print the matrix position and status
// of each key pressed
#ifdef CONSOLE_ENABLE
uprintf("KL: kc: 0x%04X, row: %2u, col: %2u, pressed: %u, "
"time: %5u, int: %u, count: %u\n",
keycode, record->event.key.col, record->event.key.row,
record->event.pressed, record->event.time, record->tap.interrupted,
record->tap.count);
#endif
return true;
}
This allowed me to notice that both Enter and End keys are seen. Turned out that I wrote wrong row/column values for both of them.
I made some mistakes with this keyboard. They were expected as usual with first attempts.
First mistake: 2mm plate. Should had do 1.5mm to make switches keep better. Total thickness can be even 3-5 mm but with holes done in a way that switches hold properly. Also it may make keyboard less bendy.
Second ones - holes for stabilisers. I have a few 2u - 2.75u keys and they should get stabilisers. But I did holes in wrong way so the ones I have do not fit. Will see how it affects keyboard use.
Third one: soldering. I do not remember when last time I soldered so many points. So some of other are shitty. Just had to fix one more…
Community behind mechanical keyboards created many tools. Let me try to list ones I used.
First comes QMK firmware which allows to forget about programming microcontrollers as keyboard is done as simple JSON file and one C file with keymap definition.
Then Keyboard Layout Editor which allows to define layout of keys in any crazy way you want. Raw data from it is a base for several other tools.
Keyboard Firmware Builder is a simplest way to manage wiring of keyboard. You paste raw data from previous tool and start simplifying wiring. It can also generate ready to use QMK firmware images for several popular micro controllers (but no RP2040 I used).
Plate & Case Builder also takes layout data. And allows to choose switch/stabilizer types plus a bunch of other options. Then generates plate for your layout with option to download it in SVG, DXF, EPS file formats. I took SVG, extruded to 2mm and had a base plate for 3d printing.
The question for the end: was it worth the time? I think that it was. Learnt new things, got something working. Something I did on my own. Sure, it is far from being perfect but gives me area for improvements.
I have two space keys and already see that for most of time I use right one. There are no layers defined yet and I have a key for it. Some keycaps may get replaced with other ones (like Calculator one next to left Space begs for lower one).
I have links to many interesting layouts so who knows, maybe I will make a new keyboard soon. Split, orthogonal one. With volume knob. Will see.
About seven years ago I visited friends. They were playing some game and told me that I may like it. I asked some questions, looked at their play etc.
Few days later I spent 70 PLN and bought Factorio.
The idea of Factorio is simple: you crash land on some planet and do everything needed to send rocket to the space. Mine resources, turn ore into plates into electronic components into assembly machines. And use those machines to build more of everything.
And walk around to look for more resources.
And fight local fauna as they do not like you or your effect on their planet. Pollution made by your factory speeds up their evolution so you need to develop stronger weapons etc.
It is easy to get addicted to the game. You start game ‘for an hour’ in the afternoon and ‘one hour later’ you see sunrise through the window. And your legs remind you that you were sitting in front of computer for 12+ hours straight.
Been there, done that. Then learnt how to make pauses and how to put some limits.
Like many games today Factorio has set of achievements. Most of them you get during normal play. Some require special preparations.
I remember doing “Getting on track like a pro” one. It requires building a locomotive within the first 90 minutes of the game. Done on second attempt cause I did not noticed that locomotive needs to be put on the rail and I went out of time on first attempt.
The one I liked the most was “Lazy bastard” where you can manually craft no more than 111 items. This requires counting each move at the beginning of the game as there are only 10 items reserve. Great way to learn how to make factory produce things.
Took me over six years to get all achievements.
To win the game you need to send rocket to space. And there are three achievements for it:
And there is funny one — you can send yourself into space and game handles it properly. The way is to put vehicle (car, tank, locomotive) into a rocket and then ‘take a seat’ in vehicle. You get the usual animation of starting rocket but from different perspective ;D
In October 2024 Factorio team released 2.0 version of the game. And “Space Age” DLC.
I decided to play 2.0 first to see what changed first. And there were many changes! And new achievements :D
Took me some time but once I finished I bought “Space Age” DLC and started playing again. Without rush or pressure to get complex factory.
After 260 hours I finished but did not had a feeling that I won anything. In normal game you build a factory to send satellite to the space. In DLC you have to make a useless ship and send it “where no man has been before”.
But that does not give anything. Going to the “shattered planet” gives 12th science pack but it is needed only to speed up research.
But basic game is just a piece of game. The most important piece of course but there are so many mods for Factorio…
Some are simple ‘quality of life’ ones, some are ‘why this is not in game’ (like Rate Calculator).
And there are complex ones like ‘Krastorio 2’, ‘Space Exploration’ or ‘Warptorio’ which change game, add lot of buildings, technologies, change winning requirements etc.
You can enable countless mods to make your game completely different. Easier, harder, more complex etc.
One of things I like is multiplayer. I had own server where I played countless hours with friends. We did ‘Krastorio 2’, we did huge megabase.
We rebuilt half of megabase after visit of biters — it was ‘rebuild or start from scratch’ moment and we decided that starting from scratch is boring. Turned out that rebuild took only few hours once we got all reactors running so electricity was not a problem.
One of great things around Factorio is community. Modders, youtubers, speedrunners (I learnt many tricks watching speedruns), people on forums etc.
I remember how one day Factorio was misbehaving on my system. Everything else was working fine, problem was only visible when I played the game. Reported a bug, got contacted by someone from development team and we joined multiplayer game. Some minutes later I got “Please check stability of your system. Run memtest or something”. And few hours later memtest86 shown some issue with memory config.
Money spent on Factorio was the best spend cash when it comes to my game related expenses.
And there are still four achievements to get :P
Again this year, Arm offered to host us for a mini-debconf in Cambridge. Roughly 60 people turned up on 10-13 October to the Arm campus, where they made us really welcome. They even had some Debian-themed treats made to spoil us!
For the first two days, we had a "mini-debcamp" with disparate group of people working on all sorts of things: Arm support, live images, browser stuff, package uploads, etc. And (as is traditional) lots of people doing last-minute work to prepare slides for their talks.
Saturday and Sunday were two days devoted to more traditional conference sessions. Our talks covered a typical range of Debian subjects: a DPL "Bits" talk, an update from the Release Team, live images. We also had some wider topics: handling your own data, what to look for in the upcoming Post-Quantum Crypto world, and even me talking about the ups and downs of Secure Boot. Plus a random set of lightning talks too! :-)
Lots of volunteers from the DebConf video team were on hand too (both on-site and remotely!), so our talks were both streamed live and recorded for posterity - see the links from the individual talk pages in the wiki, or http://meetings-archive.debian.net/pub/debian-meetings/2024/MiniDebConf-Cambridge/ for the full set if you'd like to see more.
Again, the mini-conf went well and feedback from attendees was very positive. Thanks to all our helpers, and of course to our sponsor: Arm for providing the venue and infrastructure for the event, and all the food and drink too!
Photo credits: Andy Simpkins, Mark Brown, Jonathan Wiltshire. Thanks!
It's been a while since I've posted about arm64 hardware. The last machine I spent my own money on was a SolidRun Macchiatobin, about 7 years ago. It's a small (mini-ITX) board with a 4-core arm64 SoC (4 * Cortex-A72) on it, along with things like a DIMM socket for memory, lots of networking, 3 SATA disk interfaces.
The Macchiatobin was a nice machine compared to many earlier systems, but it took quite a bit of effort to get it working to my liking. I replaced the on-board U-Boot firmware binary with an EDK2 build, and that helped. After a few iterations we got a new build including graphical output on a PCIe graphics card. Now it worked much more like a "normal" x86 computer.
I still have that machine running at home, and it's been a reasonably reliable little build machine for arm development and testing. It's starting to show its age, though - the onboard USB ports no longer work, and so it's no longer useful for doing things like installation testing. :-/
So...
I was involved in a conversation in the #debian-arm IRC channel a few weeks ago, and diederik suggested the Radxa Rock 5 ITX. It's another mini-ITX board, this time using a Rockchip RK3588 CPU. Things have moved on - the CPU is now an 8-core big.LITTLE config: 4*Cortex A76 and 4*Cortex A55. The board has NVMe on-board, 4*SATA, built-in Mali graphics from the CPU, soldered-on memory. Just about everything you need on an SBC for a small low-power desktop, a NAS or whatever. And for about half the price I paid for the Macchiatobin. I hit "buy" on one of the listed websites. :-)
A few days ago, the new board landed. I picked the version with 24GB of RAM and bought the matching heatsink and fan. I set it up in an existing case borrowed from another old machine and tried the Radxa "Debian" build. All looked OK, but I clearly wasn't going to stay with that. Onwards to running a native Debian setup!
I installed an EDK2 build from https://github.com/edk2-porting/edk2-rk3588 onto the onboard SPI flash, then rebooted with a Debian 12.7 (Bookworm) arm64 installer image on a USB stick. How much trouble could this be?
I was shocked! It Just Worked (TM)
I'm running a standard Debian arm64 system. The graphical installer ran just fine. I installed onto the NVMe, adding an Xfce desktop for some simple tests. Everything Just Worked. After many years of fighting with a range of different arm machines (from simple SBCs to desktops and servers), this was without doubt the most straightforward setup I've ever done. Wow!
It's possible to go and spend a lot of money on an Ampere machine, and I've seen them work well too. But for a hobbyist user (or even a smaller business), the Rock 5 ITX is a lovely option. Total cost to me for the board with shipping fees, import duty, etc. was just over £240. That's great value, and I can wholeheartedly recommend this board!
The two things that are missing compared to the Macchiatobin? This is soldered-on memory (but hey, 24G is plenty for me!) It also doesn't have a PCIe slot, but it has sufficient onboard network, video and storage interfaces that I think it will cover most people's needs.
Where's the catch? It seems these are very popular right now, so it can be difficult to find these machines in stock online.
FTAOD, I should also point out: I bought this machine entirely with my own money, for my own use for development and testing. I've had no contact with the Radxa or Rockchip folks at all here, I'm just so happy with this machine that I've felt the need to shout about it! :-)
Here's some pictures...
It (was) that time of year again - last weekend we hosted a bunch of nice people at our place in Cambridge for the annual Debian UK OMGWTFBBQ!
Lots of friends, lots of good food and drink. Of course lots of geeky discussions about Debian, networking, random computer languages and... screws? And of course some card games to keep us laughing into each night!
Many thanks to a number of awesome friendly people for again sponsoring the important refreshments for the weekend. It's hungry/thirsty work celebrating like this!