Skip to content

Create DevTerm R01 OS image from scratch

GNU edited this page Feb 19, 2023 · 23 revisions

Before start

Our system image is modified based on fedora wiki
Mainly replace the kernel and rootfs
Some linux experience is required to handle every possible situation
there are some discrepancies with the final system image
So this document is more suitable for the guidance of the R-01 system image

Prepare

a ubuntu linux system, like ubuntu 21.04

install riscv64 gcc

sudo apt install gcc-11-riscv64-linux-gnu binutils-riscv64-linux-gnu
sudo apt install git
sudo apt install make
sudo apt install build-essential
sudo apt install libfontconfig1
sudo apt install ncurses-devel
sudo apt install libncurses-dev
sudo apt install build-essential
sudo apt install flex bison
sudo apt install python3-distutils
sudo apt install swig
sudo apt install python3-dev
sudo apt install openssl
sudo apt install libssl-dev

install qemu static for chroot

sudo apt install qemu-user-static

manually fix default compiler link:

sudo ln -s /usr/bin/riscv64-linux-gnu-cpp-11 /usr/bin/riscv64-linux-gnu-cpp
sudo ln -s /usr/bin/riscv64-linux-gnu-gcc-nm-11 /usr/bin/riscv64-linux-gnu-gcc-nm
sudo ln -s /usr/bin/riscv64-linux-gnu-gcov-dump-11 /usr/bin/riscv64-linux-gnu-gcov-dump
sudo ln -s /usr/bin/riscv64-linux-gnu-gcc-11 /usr/bin/riscv64-linux-gnu-gcc
sudo ln -s /usr/bin/riscv64-linux-gnu-gcc-ranlib-11 /usr/bin/riscv64-linux-gnu-gcc-ranlib
sudo ln -s /usr/bin/riscv64-linux-gnu-gcov-tool-11 /usr/bin/riscv64-linux-gnu-gcov-tool
sudo ln -s /usr/bin/riscv64-linux-gnu-gcc-ar-11 /usr/bin/riscv64-linux-gnu-gcc-ar
sudo ln -s /usr/bin/riscv64-linux-gnu-gcov-11 /usr/bin/riscv64-linux-gnu-gcov
sudo ln -s /usr/bin/riscv64-linux-gnu-lto-dump-11 /usr/bin/riscv64-linux-gnu-lto-dump

Bootloader

reference doc:

https://fedoraproject.org/wiki/Architectures/RISC-V/Allwinner

git clone https://github.com/smaeul/sun20i_d1_spl
pushd sun20i_d1_spl
git checkout origin/mainline
make CROSS_COMPILE=riscv64-linux-gnu- p=sun20iw1p1 mmc
popd
pushd sun20i_d1_spl
sudo dd if=nboot/boot0_sdcard_sun20iw1p1.bin of=/dev/sdX bs=512 seek=16

git clone https://github.com/tekkamanninja/opensbi -b allwinner_d1
pushd opensbi
CROSS_COMPILE=riscv64-linux-gnu- PLATFORM=generic FW_PIC=y BUILD_INFO=y make
popd

git clone https://github.com/tekkamanninja/u-boot -b allwinner_d1  
pushd u-boot  
make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv nezha_defconfig  
make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv menuconfig  
make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv u-boot.bin u-boot.dtb  
popd  

in menuconfig, there is an import option must be selected:

menuconfig

otherwises, the boot will hang

u-boot.toc1

toc1.cfg

[opensbi]
file = fw_dynamic.bin
addr = 0x40000000
[dtb]
file = u-boot.dtb
addr = 0x44000000
[u-boot]
file = u-boot.bin
addr = 0x4a000000
pushd u-boot
cp ${PATH_TO_TOC1_CFG}/toc1.cfg ${PATH_TO_OPENSBI}/fw_dynamic.bin .
tools/mkimage -T sunxi_toc1 -d toc1.cfg  u-boot.toc1
popd

pushd u-boot
sudo dd if=u-boot.toc1 of=/dev/sdX bs=512 seek=32800 boot

Disk partition prepare

Original fedora image fdisk partition

Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xda568ce2

Device                                                                            Boot   Start      End  Sectors  Size Id Type
fedora-riscv64-d1-developer-xfce-rawhide-Rawhide-20211124-132603.n.0-sda.raw.img2        69632   319487   249856  122M  c W95 FAT32 (LBA)
fedora-riscv64-d1-developer-xfce-rawhide-Rawhide-20211124-132603.n.0-sda.raw.img3 *     319488  1320959  1001472  489M 83 Linux
fedora-riscv64-d1-developer-xfce-rawhide-Rawhide-20211124-132603.n.0-sda.raw.img4      1320960 25319423 23998464 11.5G 83 Linux

Create disk image file

create image file with dd

MEGA=16777216

dd if=/dev/zero bs=$MEGA count=1024 of=disk.img
echo -e "o\nn\np\n2\n69632\n319487\nn\np\n3\n319488\n1320959\nn\np\n4\n1320960\n\n\nt\n2\nc\na\n3\n\nw" | fdisk disk.img
fdisk -l disk.img
sudo losetup --show -f -P disk.img #/dev/loop1
sudo mkfs.vfat /dev/loop1p2
sudo mkfs.ext4 /dev/loop1p3
sudo mkfs.ext4 /dev/loop1p4

Download ubuntu riscv image for rootfs

https://wiki.ubuntu.com/RISC-V

https://cdimage.ubuntu.com/releases/21.04/release/

https://cdimage.ubuntu.com/releases/21.04/release/ubuntu-21.04-preinstalled-server-riscv64+unmatched.img.xz

Take rootfs of ubuntu out

sudo losetup --show -f -P ubuntu-21.04-preinstalled-server-riscv64+unmatched.img # eg: /dev/loop1,depends on your linux system

sudo mount /dev/loop1p1 /mnt/p1
sudo tar cpjfv ubuntu-21.04-preinstalled-server-riscv64+unmatched_rootfs.tar.bz2 -C /mnt/p1/ .
sudo umount /mnt/p1
sudo losetup -D /dev/loop1 #dettach,release /dev/loop1

download link: https://mega.nz/file/IQFlWZKL#_ERlz3GXoUgxsIoaLHK8oQ2A6SNFcHhZpS2tF3N6RaQ
https://mega.nz/file/IIlAHKST#PP8feOr6tHxdbD-Zoyj64G4TfG7HG_1s3VHasisP6h0

Prebuilt files

boot partition

ubuntu_2104_devterm_d1_boot.tar.bz2

https://mega.nz/file/NEsV1SRQ#FexV7wJhiUQKLcfBol4bB5m8UsX1O5qWet8geONclY4
https://mega.nz/file/YJUjiKKb#nrxH6BDvyGjpNSyZEzbRqbHk9ed9RE7jcuOPbTdximM

included files

├── board.dtb  
├── **boot**  
│ └── uEnv.txt  
├── config-5.4.61  
├── **efi**  
├── **extlinux**  
│ ├── extlinux.conf  
│ └── extlinux.conf.cpi.bak  
├── **grub2**  
│ └── **themes**  
│ └── **system**  
│ └── **background.png**  
├── grub.cfg  
├── System.map-5.4.61  
├── **uEnv.txt** -\> boot/uEnv.txt  
└── vmlinuz-5.4.61  

ubuntu_2104_devterm_d1_EFI.tar.bz2

https://mega.nz/file/kNUBRBIB#NsPzKTDWbfBSTth7-eVz9gPjeaEdYnP7PfuYGz28cOk

extlinux.conf is the file actually do the boot configuration

How to compile kernel

get kernel source

https://github.com/cuu/last_linux-5.4.git

it is a mirror kernel code from tina_d1_h of all winner with all patched for devterm R-01

Official toolchain

https://github.com/cuu/toolchain-thead-glibc #It's official allwinner toolchain download toolchain

Steps for compiling kernel

extract and put toolchain in any folder you like

then edit m.sh in last_linux-5.4

set correct path of toolchain for PATH

export PATH=/data/tina_d1_h/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/:$PATH

to be

export PATH=/wherever_you_put_toolchain/riscv64-glibc-gcc-thead_20200702/bin/:$PATH

then simply run ./m.sh to compile kernel

we just simple use the prebuit toolchain from all-winner to compile the patched kernel code based on all-winner tina for devterm_r01

and we have to ,because allwinner prebuilt toolchain has the neccessary custom opcode for the kernel of R-01

kernel patch url: https://github.com/clockworkpi/DevTerm/tree/main/Code/patch/d1

to get original tina code from allwinner ,visit https://open.allwinnertech.com/

Mainline toolchain

https://github.com/riscv/riscv-gnu-toolchain
all the same as Official toolchain except need to disable Vector in kernel make menuconfig

d1_disable_vector_kernel

Make alpha os image

required file list:

  • ubuntu_2104_devterm_d1_EFI.tar.bz2
  • ubuntu_2104_devterm_d1_boot.tar.bz2
  • ubuntu-21.04-preinstalled-server-riscv64+unmatched_rootfs.tar.bz2
  • boot0_sdcard_sun20iw1p1.bin
  • u-boot.toc1
  • disk.img with all partitions formatted
sudo losetup --show -f -P disk.img  ## assume we will have /dev/loop1
sudo dd if=boot0_sdcard_sun20iw1p1.bin of=/dev/loop1 bs=512 seek=16
sudo dd if=u-boot.toc1 of=/dev/loop1 bs=512 seek=32800

sudo mount /dev/loop1p2 /mnt/p2
sudo mount /dev/loop1p3 /mnt/p3
sudo mount /dev/loop1p4 /mnt/p4
sudo tar xpjfv  ubuntu_2104_devterm_d1_EFI.tar.bz2 -C /mnt/p2
sudo tar xpjfv  ubuntu_2104_devterm_d1_boot.tar.bz2  -C /mnt/p3
sudo tar xpjfv ubuntu-21.04-preinstalled-server-riscv64+unmatched_rootfs.tar.bz2  -C /mnt/p4

Chroot part

sudo mount /dev/loop1p3 /mnt/p4/boot
cd /mnt/p4

sudo mount --bind /dev dev/
sudo mount --bind /sys sys/
sudo mount --bind /proc proc/
sudo mount --bind /dev/pts dev/pts
sudo chroot .

upgrade to devel

now we are in chroot

touch /etc/cloud/cloud-init.disabled
apt remove update-notifier-common  
apt-get update && apt-get purge needrestart

then edit /etc/apt/source.list, replace all hirsute to devel then

apt update
apt-get dist-upgrade

wait a long time until upgrade done(or retry if failed,it is neccessary for having a newer xorg/mesa in riscv to display)

after upgrade

apt update 
apt install  mesa-utils libgl1-mesa-glx libglx-mesa0 libgles2-mesa libegl-mesa0 
apt install -y  xterm cmus alsamixergui qutebrowser elinks vim emacs tilde bc gnuplot dosbox chocolate-doom gimp xfig xpdf xaos x11-apps gkrellm  imagemagick inkscape
apt remove multipath-tools

add cpi user

useradd -m  cpi

#add into groups
usermod -a -G adm,dialout,cdrom,floppy,sudo,audio,dip,video,plugdev,netdev,lxd,pulse,pulse-access cpi

Deploy the TWM window manager env.

The R-01 uses twm as default window manager for low resource usage

wget https://github.com/clockworkpi/DevTerm/blob/main/Code/R01/d1_twm.tar.bz2?raw=true

tar xpjfv d1_twm.tar.bz2 -C /home/cpi

chown -R cpi:cpi /home/cpi

xorg fbdev config

rotate Xorg

ubuntu@ubuntu:~$ cat /etc/X11/xorg.conf.d/10-d1.conf  
Section "Device" 
        Identifier "FBDEV" 
        Driver "fbdev" 
        Option "fbdev" "/dev/fb0" 
        Option "Rotate" "cw" 
        Option          "SwapbuffersWait" "true" 
EndSection 
 
Section "Screen" 
        Identifier "Screen0" 
        Device "FBDEV" 
        DefaultDepth 24 
 
        Subsection "Display" 
                Depth 24 
                Modes "1280x480" "480x1280" 
        EndSubsection 
 
EndSection

Optmise time of boot

sudo systemctl mask apt-daily.service apt-daily-upgrade.service
sudo systemctl disable apt-daily.service apt-daily-upgrade.service
sudo systemctl disable apt-daily.timer apt-daily-upgrade.timer

sudo systemctl disable NetworkManager-wait-online.service 
sudo systemctl disable systemd-random-seed.service

sudo systemctl disable  e2scrub_reap.service
sudo systemctl disable systemd-networkd-wait-online.service

sudo systemctl disable lvm2-monitor.service

sudo systemctl disable snapd.seeded.service 
sudo systemctl disable pppd-dns.service

sudo systemctl disable avahi-daemon.service
sudo systemctl disable ModemManager.service

sudo systemctl disable apport.service
sudo systemctl mask apport.service
sudo systemctl disable accounts-daemon.service
sudo systemctl mask accounts-daemon.service
sudo systemctl disable udisks2.service   

faster login

All scripts in /etc/update-motd.d/ transferred to other place or just deleted them all

Install devterm related package

curl https://raw.githubusercontent.com/clockworkpi/apt/main/debian/KEY.gpg | sudo tee /etc/apt/trusted.gpg.d/clockworkpi.asc
echo "deb https://raw.githubusercontent.com/clockworkpi/apt/main/debian/ stable main" | sudo tee  /etc/apt/sources.list.d/clockworkpi.list  

apt update

apt install devterm-audio-patch devterm-backlight-cpi devterm-keyboard-firmware devterm-thermal-printer devterm-thermal-printer-cups devterm-wiringpi-cpi

Get out chroot

exit
cd 

sudo umount /mnt/p4/dev/pts
sudo umount /mnt/p4/dev/
sudo umount /mnt/p4/proc
sudo umount /mnt/p4/sys
sudo umount /mnt/p4/boot

sudo umount /mnt/p3
sudo umount /mnt/p2
sudo umount /mnt/p4

sudo losetup -D /dev/loop1

Final part

now we have a chroot edited os image file disk.img in 16GB with ubuntu devel branch root fs

you can still use

sudo losetup --show -f -P disk.img  
sudo gparted /dev/loop1

to shrink the disk size to be like 8G or less to fit your sd card

then dd it into sd card

Compiling other stuff

WiringPI

git clone https://github.com/clockworkpi/DevTerm.git
wget https://github.com/WiringPi/WiringPi/archive/refs/tags/final_official_2.50.tar.gz
tar zxvf final_official_2.50.tar.gz 
cd WiringPi-final_official_2.50/
cp ../DevTerm/Code/patch/d1/wiringCP0329.patch .
git apply wiringCP0329.patch
sudo ./build
#Choice: 2

For apt upgrade

apt upgrade on R01 os will mess up the content of extlinux.conf
lead the boot failed

so mount the sd card(with R01 os) on a PC (like Linux )

then go into the boot partition of the sd card

you will see

extlinux.conf  
extlinux.conf.cpi.bak  

replace extlinux.conf with extlinux.conf.cpi.bak

the extlinux.conf.cpi.bak is for this kind of situation

Hints

https://forum.clockworkpi.com/t/r01-os-early-hints/8636

Clone this wiki locally