Wednesday, March 01, 2023

Pine64 Ox64 RISC-V SBC

 After a bit of fiddling with serial connection and flashing all the stuff. It boots.

It does feel a bit strange that you can now have a 64-bit, 64MB computer that fits on a breadboard. That runs full Linux.

My first 64-bit system was a Aspen Alpine Alpha board, AT format. 275Mhz Alpha CPU and also 64MB of memory. That ran full Linux (a probably still do. It should still work)

Anyway, boot log from serial console for the Ox64 below:

[I][]   ____                   ____               __  __      _       
[I][]  / __ \                 |  _ \             / _|/ _|    | |      
[I][] | |  | |_ __   ___ _ __ | |_) | ___  _   _| |_| |_ __ _| | ___  
[I][] | |  | | '_ \ / _ \ '_ \|  _ < / _ \| | | |  _|  _/ _` | |/ _ \ 
[I][] | |__| | |_) |  __/ | | | |_) | (_) | |_| | | | || (_| | | (_) |
[I][]  \____/| .__/ \___|_| |_|____/ \___/ \__,_|_| |_| \__,_|_|\___/ 
[I][]        | |                                                      
[I][]        |_|                                                      
[I][] Powered by BouffaloLab
[I][] Build:09:51:53,Feb 19 2023
[I][] Copyright (c) 2023 OpenBouffalo team
[I][] Copyright (c) 2022 Bouffalolab team
[I][] dynamic memory init success,heap s[I][LowLoad] D0 start...
[I][LowLoad] low_load start... 
[I][LowLoad] Section dtb(1) - Start 0x58080100, Size 3335
[I][LowLoad] Copying DTB to 0x51ff8000...0x51ff8d07
[I][LowLoad] Done!
[I][LowLoad] Section OpenSBI(2) - Start 0x58090100, Size 109864
[I][LowLoad] Copying OpenSBI to 0x3ef80000...0x3ef9ad28
[I][LowLoad] Done!
[I][LowLoad] Section Kernel(3) - Start 0x580b0100, Size 3933429
[I][LowLoad] Uncompressing Kernel to 0x50000000...
[I][LowLoad] Done!
[I][LowLoad] CRC: 00000000
[I][LowLoad] load time: 449038 us 
[I][LowLoad] Setting PMP
[I][LowLoad] Booting OpenSBI at 0x000000003ef80000 with DTB at 0x51ff8000

OpenSBI v1.2
   ____                    _____ ____ _____
  / __ \                  / ____|  _ \_   _|
 | |  | |_ __   ___ _ __ | (___ | |_) || |
 | |  | | '_ \ / _ \ '_ \ \___ \|  _ < | |
 | |__| | |_) |  __/ | | |____) | |_) || |_
  \____/| .__/ \___|_| |_|_____/|____/_____|
        | |

Platform Name             : Pine64 Ox64
Platform Features         : medeleg
Platform HART Count       : 1
Platform IPI Device       : aclint-mswi
Platform Timer Device     : aclint-mtimer @ 1000000Hz
Platform Console Device   : bflb_uart
Platform HSM Device       : ---
Platform PMU Device       : ---
Platform Reboot Device    : ---
Platform Shutdown Device  : ---
Firmware Base             : 0x3ef80000
Firmware Size             : 200 KB
Runtime SBI Version       : 1.0

Domain0 Name              : root
Domain0 Boot HART         : 0
Domain0 HARTs             : 0*
Domain0 Region00          : 0x00000000e4008000-0x00000000e400bfff (I)
Domain0 Region01          : 0x00000000e4000000-0x00000000e4007fff (I)
Domain0 Region02          : 0x000000003ef80000-0x000000003efbffff ()
Domain0 Region03          : 0x0000000000000000-0xffffffffffffffff (R,W,X)
Domain0 Next Address      : 0x0000000050000000
Domain0 Next Arg1         : 0x0000000051ff8000
Domain0 Next Mode         : S-mode
Domain0 SysReset          : yes

Boot HART ID              : 0
Boot HART Domain          : root
Boot HART Priv Version    : v1.11
Boot HART Base ISA        : rv64imafdcvx
Boot HART ISA Extensions  : time
Boot HART PMP Count       : 8
Boot HART PMP Granularity : 4096
Boot HART PMP Address Bits: 38
Boot HART MHPM Count      : 8
Boot HART MIDELEG         : 0x0000000000000222
Boot HART MEDELEG         : 0x000000000000b109
[    0.000000] Linux version 6.2.0-rc8 (runner@fv-az461-503) (riscv64-unknown-linux-gnu-gcc (Xuantie-900 linux-5.10.4 glibc gcc Toolchain V2.6.1 B-20220906) 10.2.0, GNU ld (GNU Binutils) 2.35) #1 Sun Feb 19 09:21:12 UTC 2023
[    0.000000] Machine model: Pine64 Ox64
[    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
[    0.000000] printk: bootconsole [sbi0] enabled
[    0.000000] efi: UEFI not found.
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000050000000-0x0000000053ffffff]
[    0.000000]   Normal   empty
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000050000000-0x0000000053ffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000050000000-0x0000000053ffffff]
[    0.000000] SBI specification v1.0 detected
[    0.000000] SBI implementation ID=0x1 Version=0x10002
[    0.000000] SBI TIME extension detected
[    0.000000] SBI IPI extension detected
[    0.000000] SBI RFENCE extension detected
[    0.000000] riscv: base ISA extensions acdfim
[    0.000000] riscv: ELF capabilities acdfim
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0 
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 16160
[    0.000000] Kernel command line: console=ttyS0,2000000 loglevel=8 earlycon=sbi root=PARTLABEL=rootfs rootwait rootfstype=ext4
[    0.000000] Dentry cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.000000] Inode-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Memory: 50136K/65536K available (3941K kernel code, 4584K rwdata, 2048K rodata, 2118K init, 301K bss, 15400K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] riscv-intc: 64 local interrupts mapped
[    0.000000] plic: interrupt-controller@e0000000: mapped 64 interrupts with 1 handlers for 2 contexts.
[    0.000000] riscv-timer: riscv_timer_init_dt: Registering clocksource cpuid [0] hartid [0]
[    0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns
[    0.000002] sched_clock: 64 bits at 1000kHz, resolution 1000ns, wraps every 2199023255500ns
[    0.000917] Console: colour dummy device 80x25
[    0.001161] Calibrating delay loop (skipped), value calculated using timer frequency.. 2.00 BogoMIPS (lpj=4000)
[    0.001683] pid_max: default: 32768 minimum: 301
[    0.002394] Mount-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
[    0.002736] Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
[    0.007687] cblist_init_generic: Setting adjustable number of callback queues.
[    0.008005] cblist_init_generic: Setting shift to 0 and lim to 1.
[    0.008909] ASID allocator using 16 bits (65536 entries)
[    0.010126] EFI services will not be available.
[    0.011150] devtmpfs: initialized
[    0.014636] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.015133] futex hash table entries: 256 (order: 0, 6144 bytes, linear)
[    0.015752] pinctrl core: initialized pinctrl subsystem
[    0.018300] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.019159] DMA: preallocated 128 KiB GFP_KERNEL pool for atomic allocations
[    0.019546] DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[    0.025099] bflb-ipc 30005000.mailbox: Bouffalo Lab IPC mailbox interrupt controller
[    0.030226] SCSI subsystem initialized
[    0.032783] clocksource: Switched to clocksource riscv_clocksource
[    0.061401] NET: Registered PF_INET protocol family
[    0.062066] IP idents hash table entries: 2048 (order: 2, 16384 bytes, linear)
[    0.064181] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 4096 bytes, linear)
[    0.064619] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.065130] TCP established hash table entries: 512 (order: 0, 4096 bytes, linear)
[    0.065541] TCP bind hash table entries: 512 (order: 1, 8192 bytes, linear)
[    0.065976] TCP: Hash tables configured (established 512 bind 512)
[    0.066659] UDP hash table entries: 256 (order: 1, 8192 bytes, linear)
[    0.066994] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)
[    0.067759] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    0.070262] workingset: timestamp_bits=62 max_order=14 bucket_order=0
[    0.072557] NET: Registered PF_ALG protocol family
[    0.072993] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252)
[    0.073339] io scheduler mq-deadline registered
[    0.073594] io scheduler kyber registered
[    0.073934] io scheduler bfq registered
[    0.075116] bflb-gpio-pinctrl 200008c4.pinctrl: No cache defaults, reading back from HW
[    0.077467] bflb-gpio-pinctrl 200008c4.pinctrl: Bouffalo Lab pinctrl+GPIO(+interrupt) controller - Registered 32 function(s) for 46 pin(s)
[    0.083320] 30002000.serial: ttyS0 at MMIO 0x30002000 (irq = 2, base_baud = 2500000) is a BFLB UART
[    0.083799] printk: console [ttyS0] enabled
[    0.083799] printk: console [ttyS0] enabled
[    0.084250] printk: bootconsole [sbi0] disabled
[    0.084250] printk: bootconsole [sbi0] disabled
[    0.085883] 2000aa00.serial: ttyS1 at MMIO 0x2000aa00 (irq = 3, base_baud = 2500000) is a BFLB UART
[    0.114568] brd: module loaded
[    0.131263] loop: module loaded
[    0.132547] physmap-flash 58500000.xip_flash: physmap platform flash device: [mem 0x58500000-0x588fffff]
[    0.138427] wireguard: WireGuard 1.0.0 loaded. See for information.
[    0.138922] wireguard: Copyright (C) 2015-2019 Jason A. Donenfeld . All Rights Reserved.
[    0.139555] PPP generic driver version 2.4.2
[    0.140253] PPP BSD Compression module registered
[    0.140565] PPP Deflate Compression module registered
[    0.141679] sdhci: Secure Digital Host Controller Interface driver
[    0.142071] sdhci: Copyright(c) Pierre Ossman
[    0.142341] sdhci-pltfm: SDHCI platform and OF driver helper
[    0.143649] mmc0 bounce up to 128 segments into one, max segment size 65536 bytes
[    0.144836] ledtrig-cpu: registered to indicate activity on CPUs
[    0.145624] bflb-seceng 20004000.seceng: No cache defaults, reading back from HW
[    0.149132] random: crng init done
[    0.149379] bflb-seceng 20004000.seceng: Bouffalo Lab Secure Engine
[    0.150314] riscv-pmu-sbi: SBI PMU extension is available
[    0.150721] riscv-pmu-sbi: 16 firmware and 10 hardware counters
[    0.152676] NET: Registered PF_INET6 protocol family
[    0.155491] Segment Routing with IPv6
[    0.155860] In-situ OAM (IOAM) with IPv6
[    0.156294] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[    0.158192] NET: Registered PF_PACKET protocol family
[    0.158580] Key type dns_resolver registered
[    0.182669] debug_vm_pgtable: [debug_vm_pgtable         ]: Validating architecture page table helpers
[    0.196778] mmc0: SDHCI controller on 20060000.sdhci [20060000.sdhci] using DMA
[    0.197576] Waiting for root device PARTLABEL=rootfs...

Monday, December 19, 2022

I asked ChatGPT to write a childrens story about coding in C, C++ and Ada

Quite cute, I would say :D

Chapter 1: C

Once upon a time, there was a nerdy girl named Sophie who loved to play with computers. She was always curious about how they worked, and she loved to tinker with the different software programs on her computer.

One day, Sophie's mom told her about a new programming language called C. It was a powerful language that was used to create all sorts of computer programs, from video games to scientific simulations. Sophie was very excited to learn more about C, and she asked her mom to help her get started.

Her mom suggested that they start by installing a C compiler on their computer. This would allow Sophie to write and run C programs from the comfort of her own home. Sophie was thrilled at the prospect of creating her own programs, and she eagerly set to work installing the compiler.

Once the compiler was installed, Sophie's mom showed her how to write a simple "Hello, World!" program in C. Sophie typed out the code and ran the program, and to her delight, the computer printed out "Hello, World!" on the screen.

Sophie was hooked on programming in C, and she spent every free moment tinkering with her computer and learning more about the language. She was determined to become a master programmer, and she knew that with practice and hard work, she could accomplish anything.

And so, Sophie's journey as a programmer began. She was excited to see where her new skills would take her, and she knew that with a little bit of nerdy determination, she could accomplish anything she set her mind to.

Chapter 2: Variables, booleans and pointers

As Sophie continued to learn more about programming in C, she learned about something called "variables." These were like little containers that could hold different pieces of information, like numbers or words. Sophie could use variables to store data and use it in her programs.

One day, Sophie's mom asked her to write a program that would calculate the average of a list of numbers. Sophie was excited to try, and she set to work writing her code. She used variables to store each number in the list, and then she added them all up and divided the sum by the number of numbers in the list. When she ran the program, it worked perfectly! Sophie was thrilled with her success.

Next, Sophie learned about something called "booleans." These were special variables that could only hold two values: "true" or "false." Sophie learned that she could use booleans to make decisions in her programs. For example, she could use a boolean to check if a number was even or odd. If the number was even, the boolean would be "true," and if the number was odd, the boolean would be "false." Sophie had a lot of fun playing around with booleans and using them to make her programs smarter.

Finally, Sophie learned about something called "pointers." These were special variables that could "point" to other variables in a program. Sophie learned that she could use pointers to access and modify variables from different parts of her code. It was a bit tricky to understand at first, but once Sophie got the hang of it, she found that pointers were a really powerful tool for programming in C.

Sophie was having a great time learning about programming in C, and she was excited to see where her new skills would take her. She knew that with a little bit of practice and a lot of nerdy determination, she could accomplish anything she set her mind to.

Chapter 3: C++ and princesses

As Sophie continued to learn more about programming in C, she discovered something called C++. It was a more advanced programming language that added even more powerful features to the C language. Sophie was excited to learn more about C++, and she spent every free moment tinkering with her computer and learning as much as she could.

One of the most interesting things about C++ was something called "object-oriented programming." This was a way of writing programs that used "objects" to represent real-world things. Each object could have different "features" or "attributes," like a person's name or a car's color. Sophie thought this was really cool, and she decided to use Disney princesses as her first objects.

Sophie created a "Princess" object, and she gave it features like a name, a age, and a favorite color. She then created objects for each of her favorite princesses, like Ariel, Belle, and Cinderella. Each princess object had its own set of features, like Ariel's love of the ocean or Cinderella's glass slippers. Sophie had a lot of fun playing around with her princess objects and seeing how they interacted with each other.

As Sophie continued to learn more about C++ and object-oriented programming, she found that she was able to create more and more complex programs. She was thrilled with her progress, and she knew that with a little bit of practice and a lot of nerdy determination, she could accomplish anything she set her mind to.

Chapter 4: Discovering Ada

As Sophie's love for programming grew, she started to explore more and more languages. One day, she discovered a language called Ada. Ada was a powerful, high-level language that was used to create all sorts of programs, from video games to scientific simulations. Sophie was immediately intrigued by Ada, and she set to work learning as much as she could.

One of the things that Sophie loved most about Ada was its emphasis on safety and reliability. Ada was designed to be very strict and precise, which made it great for creating programs that needed to be absolutely rock-solid. Sophie was impressed by the level of care and attention that went into the design of Ada, and she knew that it was a language that she could really sink her teeth into.

As Sophie continued to learn more about Ada, she found that she really enjoyed working with it. The syntax was clear and concise, and she found that she could write programs much more quickly and easily in Ada than she could in some of the other languages she had tried.

Sophie still loved C and C++, but she found that Ada offered a fresh new perspective on programming. She was excited to see where her new skills would take her, and she knew that with a little bit of nerdy determination, she could accomplish anything she set her mind to.

Wednesday, April 10, 2019

Well, that was that RIP BlackBerry 10

In a way this is a sad day, I would very much like to continue to use my BlackBerry 10 Z10, it JustWorks(tm) for all the important bits, e-mail, calendar, phone, IM with BBM. QNX, Qt, C++ and Cascades was a joy to code with.

But, unfortunately the support has gone, no updates, BBM on BB10 is on life support (Channels I managed I can't manage anymore), browser hasn't seen an upgrade in ages and services that I could use trough the browser instead of native apps have started to require features that just isn't there.

So what are the choices then ?
  • iPhone ? Never in a million years.
  • SailfishOS ? Well, maybe, see next.
  • Android ? For now. I prepared by getting a Sony XA2 to be able to perhaps move to SailfishOS when it is mature enough, but lets see if/when that happens.
I've been slowly getting used to Android, it has the apps, sure, but the polish and integration is just not there. E-mail app sucks, calendar is a mess (no native CalDAV support, like what the fuck??) and most of all I'm going to the miss the Hub. The concept of the Hub is so simple, but extremely powerful.

After almost 6 years (from summer 2013)! as my primary phone, I'm now saying goodbye to BlackBerry 10.

Thanks for making an awesome platform BlackBerry, but fuck you for abandoning it and your users.

Thursday, November 01, 2018

Getting into Android coding, the annoying things

I finally gave in and started to work on my first ever Android app. I've done some small JavaME things in the past so it was not so bad after all. Not that there aren't plenty things that seems so backwards, silly, idiotic and overly complicated after working on apps for Maemo, Meego, Sailfish OS and BlackBerry 10. Qt, QtQuick and C++ is elegant. This mess with XML files and Java.. not so much.

But most of all, the Activity states. Like what the fuck where they thinking ?

Whoever is the idiot that came up with the idiotic Activity state things, do yourself a favor and hit yourself with stick and jump before a train or something.

Ever heard of multitasking ? Blody Windows 95 on a 486 can multitask better that this crap. Phones have gigabytes of memory, more cores than my home server and it seems impossible to do at simple task like this:
  1. Browse Facebook
  2. Open a post
  3. Open a link in the browser
  4. Go back to FACEBOOK AT THE EXACT PLACE WHERE I LEFT IT and the left browser load the page in the background (you now, multitask!)
  5. Nope, Facebook restarts and reloads a random post list, whatever I was reading is nowhere to be seen. And the browser does not load the page in the background as it was paused.
  6. Fuck I hate Android.

Wednesday, August 01, 2018

A quick and bad Raspberry Pi 3 32-bit & 64-bit OpenSSL speed test

I wanted to make a quick test if there is difference or not as the Pi people keeps telling us that there isn't or not large enough to support a native 64-bit userland.

And there seems to be, but, this test is very bad in multiple ways. Different versions of just about everything was used (glibc for 32-bit, musl for 64-bit, different gcc versions for building, etc) and also because raspbian is built for armv6 it will loose from the start.

These are just preliminary finds so take them with a grain of salt. Still, interesting...


OpenSSL hmac(md5) speed test comparing 32-bit and 64-bit build

OpenSSL sha512 speed test comparing 32-bit and 64-bit builds

UnixBench test: 

32-bit: MWIPS 1038.823
64-bit: MWIPS 1379.241

Tuesday, July 31, 2018

Text mode tools for Turku region public transport

Quite often when there is some nice API for something, the obvious application type seem to be a mobile application or somekind of web site/app. That is all quite nice and all but sometimes you just need a simple tool. Probably most Linux (or unix) user spend most of their time in a terminal so why not make some tiny command line utilities instead ? My latest little project is all about the command line.

Tools to query Turku Region public transport data from the command line, fast and much more efficient than opening a browser, finding the site and all that. For now there are two tools:
  • tkuftop: for the bike rental system showing real-time statistics about bike availability at the stations.
    It can also dump rack location the information as CSV and PostGIS SQL statements for easy import into any system. There is also support for relaying the information to an MQTT broker.
  • tkufstop: and one for real-time bus stop departure information.
These tools are simple and compact, written in C with a little help from curl and json-c.

tkufstop showing departues from stop T9

tkuftop showing bike rack availability information

 And of course everything is open source and available on github.

Wednesday, June 06, 2018

Grab H.264 video on Raspberry Pi with gstreamer

(More like a note to self this.)

Load Video4Linux driver:

sudo modprobe bcm2835-v4l2

Grab some video into Matroska container:

gst-launch-1.0 v4l2src ! video/x-h264,framerate=30/1 ! h264parse ! matroskamux ! filesink location=test.mkv

In Full HD:

gst-launch-1.0 v4l2src ! video/x-h264,width=1920,height=1080,framerate=30/1 ! h264parse ! matroskamux ! filesink location=test.mkv