-
Notifications
You must be signed in to change notification settings - Fork 69
Create DevTerm R01 OS image from scratch
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
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
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:
otherwises, the boot will hang
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
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
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
https://wiki.ubuntu.com/RISC-V
https://cdimage.ubuntu.com/releases/21.04/release/
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
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
https://mega.nz/file/kNUBRBIB#NsPzKTDWbfBSTth7-eVz9gPjeaEdYnP7PfuYGz28cOk
extlinux.conf is the file actually do the boot configuration
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
https://github.com/cuu/toolchain-thead-glibc #It's official allwinner toolchain download toolchain
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/
https://github.com/riscv/riscv-gnu-toolchain
all the same as Official toolchain except need to disable Vector in kernel make menuconfig
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
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 .
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
useradd -m cpi
#add into groups
usermod -a -G adm,dialout,cdrom,floppy,sudo,audio,dip,video,plugdev,netdev,lxd,pulse,pulse-access cpi
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
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
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
All scripts in /etc/update-motd.d/ transferred to other place or just deleted them all
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
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
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
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
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