I got a Pinebook Pro a couple of weeks ago. I wanted a cheap laptop that I can screw around with without having to feel weird about using my work laptop. I also missed being able to use Linux.
A couple of notes:
- btrfs didn’t immediately work at boot time, so I’m using ext4.
- 4GB of RAM is fine until you’re trying to compile something. No more reckless
make -j
for me. - The trackpad is not great.
- The keyboard is sturdy, but very clunky.
- Battery life is fantastic. I’m tooling around in my terminal, and have Firefox open with ~30 tabs, and I’ve got a little under 12 hours of battery life left.
- Curiously, the layout under
/sys/class/power_supply/
is different to what polybar is expecting, so I had to patch polybar to read some different paths. Patch is below. - The screen is definitely not 4K, but it’s still good.
- Playing videos in Firefox feels like a pipe dream right now. Admittedly I haven’t tried very hard to fix this up just yet, because it’s not that big of a priority. Laurie asks me “why did you want this again?” every time I try to load a youtube video.
- You can feel cool for using ARM, even if you’re not the kind of person who actually does anything new or different on your new CPU architecture.
Overall I think this is actually a great laptop for the price. If you’re able to set your expectations accordingly and want a cheap laptop, I can recommend getting this.
Also I’m obliged to mention that I put Arch Linux on it.
$ uname -a
Linux carrotcake 5.12.9-1-ARCH #1 SMP Fri Jun 4 07:24:43 UTC 2021 aarch64 GNU/Linux
😎
Polybar Patch
This is hacky and gross. I don’t care, it works.
diff --git a/src/modules/battery.cpp b/src/modules/battery.cpp
index 4c6dd7ff..2c42d4fc 100644
--- a/src/modules/battery.cpp
+++ b/src/modules/battery.cpp
@@ -45,16 +45,14 @@ namespace modules {
}
// Make capacity reader
- if ((m_fcapnow = file_util::pick({path_battery + "charge_now", path_battery + "energy_now"})).empty()) {
+ if ((m_fcapnow = file_util::pick({path_battery + "capacity", path_battery + "charge_now", path_battery + "energy_now"})).empty()) {
throw module_error("No suitable way to get current capacity value");
} else if ((m_fcapfull = file_util::pick({path_battery + "charge_full", path_battery + "energy_full"})).empty()) {
throw module_error("No suitable way to get max capacity value");
}
m_capacity_reader = make_unique<capacity_reader>([=] {
- auto cap_now = std::strtoul(file_util::contents(m_fcapnow).c_str(), nullptr, 10);
- auto cap_max = std::strtoul(file_util::contents(m_fcapfull).c_str(), nullptr, 10);
- return math_util::percentage(cap_now, 0UL, cap_max);
+ return std::strtoul(file_util::contents(m_fcapnow).c_str(), nullptr, 10);
});
// Make rate reader