rpi

directions derived from
https://www.raspberrypi.org/documentation/linux/kernel/building.md
http://elinux.org/RPi_Upstream_Kernel_Compilation
http://elinux.org/RPi_U-Boot
good resources
https://www.raspberrypi.org/documentation/configuration/config-txt.md
http://cellux.github.io/articles/diy-linux-with-buildroot-part-1/
http://blog.flexvdi.com/2015/02/25/enabling-hyp-mode-on-the-raspberry-pi-2/
http://blog.flexvdi.com/2015/03/17/enabling-kvm-virtualization-on-the-raspberry-pi-2/
http://kariddi.blogspot.com/2012/08/raspberry-pi-bare-metal-part-1-boot.html
Eric Anholt's open GPU driver work
http://www.serverphorums.com/read.php?12,1257154
http://anholt.livejournal.com/
https://dri.freedesktop.org/wiki/VC4/
http://www.broadcom.com/docs/support/videocore/VideoCoreIV-AG100-R.pdf
sudo screen /dev/ttyUSB0 115200
C-a \       (quit)        Kill all windows and terminate screen.




--- rpi kernel source ---

git clone --branch rpi-4.1.y --depth 1 https://github.com/raspberrypi/linux.git




--- mainline kernel source ---

git clone --depth 1 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git clone --depth 1 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
git clone --depth 1 --branch linux-4.5.y git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

cp linux-rpi/arch/arm/configs/bcm2709_defconfig linux/arch/arm/configs/bcm2709_defconfig
from the rpi-4.5.y branch




--- kernel compilation ---
export KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mrproper
rpi: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
mainline: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2835_defconfig
enable loadable module support {module unloading, module versioning support, source checksum for all modules}
enable kernel features -> SMP
floating point emulation -> advanced SIMD (NEON) extension support
floating point emulation -> Support for NEON in kernel mode
enable kernel features -> high memory support
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j 8 > buildoutput.log 2> buildoutput2.log


later - play with more kernel configs
kernel message: consider using a HIGHMEM enabled kernel
autofs4
kdbus
systemctl status kmod-static-nodes.service
select General Setup -> uselib syscall
Broadcom SoC Support -> Broadcom BCM2835 family
Kernel features -> Xen guest support on ARM
Device drivers -> Virtualization drivers
Device drivers -> Xen driver support -> all enabled
Virtualization

Device Drivers ---> USB support ---> DesignWare USB2 DRD Core Support and check both Host only mode and DWC2 Platform
Networking support -> Networking Options -> TCP/IP networking -> IP: kernel level autoconfiguration
Networking support -> Networking Options -> TCP/IP networking -> IP: DHCP support
File Systems -> Network File Systems -> Root file system on NFS






--- create minimal image & mount it ---

sudo mkdir /mnt/ramdisk
sudo mount -t tmpfs -o size=6g tmpfs /mnt/ramdisk

dd if=/dev/zero of=/mnt/ramdisk/minimal.img bs=512M count=1
sudo losetup /dev/loop0 /mnt/ramdisk/minimal.img
sudo losetup -d /dev/loop0
sudo gparted /dev/loop0
create partitions & click to mount

sudo kpartx -av /mnt/ramdisk/minimal.img

export BOOT=/media/stew/boot
export ROOTFS=/media/stew/ext4





--- rpi kernel & modules install ---
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=$ROOTFS modules_install
sudo scripts/mkknlimg arch/arm/boot/zImage $BOOT/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb $BOOT
mkdir $BOOT/overlays/
sudo cp arch/arm/boot/dts/overlays/*.dtb* $BOOT/overlays/
sudo cp arch/arm/boot/dts/overlays/README $BOOT/overlays/




--- mainline kernel & modules install ---
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=$ROOTFS modules_install
cp arch/arm/boot/zImage $BOOT/$KERNEL.img
cp arch/arm/boot/dts/bcm2836-rpi-2-b.dtb $BOOT




--- ubuntu bootstrap ---
directions derived in part from https://wiki.ubuntu.com/ARM/RootfsFromScratch/QemuDebootstrap
and in part from http://wiki.xen.org/wiki/Xen_ARM_with_Virtualization_Extensions/RootFilesystem

sudo mount -o remount,dev $ROOTFS

sudo debootstrap --foreign --arch=armhf --include=ca-certificates --variant=minbase wily $ROOTFS http://us.ports.ubuntu.com/

todo: leaving off --variant=minbase produces errors, so exclude python3 and resolvconf
unused options:
--verbose
--components=main,restricted,universe,multiverse
fakeroot
http://archive.raspbian.com/raspbian
http://ports.ubuntu.com/ubuntu-ports/
--no-check-gpg
try to see if this gets rid of the "Keyring file not available at /usr/share/keyrings/ubuntu-archive-keyring.gpg; switching to https mirror https://mirrors.kernel.org/debian" warning?
--keyring=/usr/share/keyrings/ubuntu-archive-keyring.gpg
... nope it didn't.

sudo cp `which qemu-arm-static` $ROOTFS/usr/bin/
sudo chroot $ROOTFS
/debootstrap/debootstrap --second-stage


unused commands:
sudo mount -t proc proc $ROOTFS/proc
sudo cp /etc/resolv.conf $ROOTFS/etc/resolv.conf

exit
sudo chroot $ROOTFS
passwd
adduser stew
echo "stew-pi" > /etc/hostname
not needed: echo "127.0.0.1 localhost qemu" > /etc/hosts

todo: sources.list

sudo rm $ROOTFS/usr/bin/qemu-arm-static






--- u-boot ---
git clone --depth 1 git://git.denx.de/u-boot.git

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mrproper
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- rpi_2_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j 8
cp ./u-boot.bin $BOOT
./tools/mkimage -A arm -O linux -T script -C none -n boot.scr -d ../stewconfig/boot-mainline.scr $BOOT/boot.scr.uimg
./tools/mkimage -A arm -O linux -T script -C none -n boot.scr -d ../stewconfig/boot-xen.scr $BOOT/boot.scr.uimg

unused mkimage options:
-a 0x00000000
-e 0x00000000
-n "RPi2 Boot Script"


boot-rpi.scr:
mmc dev 0
setenv fdtfile bcm2709-rpi-2-b.dtb
setenv bootargs "dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait"
fatload mmc 0:1 ${kernel_addr_r} kernel7.img
fatload mmc 0:1 ${fdt_addr_r} ${fdtfile}
bootz ${kernel_addr_r} - ${fdt_addr_r}

boot-mainline.scr:
mmc dev 0
setenv fdtfile bcm2836-rpi-2-b.dtb
setenv bootargs "earlyprintk console=tty1 console=ttyAMA0 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait"
fatload mmc 0:1 ${kernel_addr_r} kernel7.img
fatload mmc 0:1 ${fdt_addr_r} ${fdtfile}
bootz ${kernel_addr_r} - ${fdt_addr_r}

boot-xen.scr (broken):
mmc dev 0
setenv fdtfile bcm2836-rpi-2-b.dtb
setenv xen_addr_r 0x01C00000
setenv bootargs "earlyprintk console=tty1 console=ttyAMA0 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait"
fatload mmc 0:1 ${kernel_addr_r} kernel7.img
fatload mmc 0:1 ${fdt_addr_r} ${fdtfile}
fatload mmc 0:1 ${xen_addr_r} xen-uImage
fdt addr ${fdt_addr_r}
fdt resize
fdt set /chosen \#address-cells <1>
fdt set /chosen \#size-cells <1>
fdt mknod /chosen module@0
fdt set /chosen/module@0 compatible "xen,linux-zimage" "xen,multiboot-module"
fdt set /chosen/module@0 reg <${kernel_addr_r} 0x00c00000>
bootm ${xen_addr_r} - ${fdt_addr_r}






--- rpi firmware & config ---
cd ..
git clone --depth 1 git://github.com/raspberrypi/firmware.git
cp firmware/boot/bootcode.bin $BOOT
cp firmware/boot/start.elf $BOOT
cp firmware/boot/fixup.dat $BOOT
cp stewconfig/cmdline.txt $BOOT
rpi loader: cp stewconfig/config.txt $BOOT
u-boot: cp stewconfig/config_u-boot.txt $BOOT/config.txt
sudo cp stewconfig/fstab $ROOTFS/etc/fstab

cmdline.txt:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

config_u-boot.txt:
kernel=u-boot.bin

fstab:
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1





--- unmount stuff ---
sudo umount $BOOT
sudo umount $ROOTFS
sudo kpartx -d /mnt/ramdisk/minimal.img
sudo losetup -d /dev/loop0
shasum /mnt/ramdisk/minimal.img
mv /mnt/ramdisk/minimal.img .
sudo umount /mnt/ramdisk







--- xen (broken) ---

required libs
sudo apt-get install zlib1g-dev python-dev libncurses5-dev libssl-dev libx11-dev uuid-dev libyajl-dev libaio-dev libglib2.0-dev libpixman-1-dev pkg-config bridge-utils iproute bison flex gettext iasl libc6-dev libc6-dev-i386

optional libs
sudo apt-get install ocaml-nox ocaml-findlib cmake markdown figlet libsystemd-daemon-dev libnl-3-200 libnl-3-dev

links
http://wiki.xen.org/wiki/Category:XenARM
http://wiki.xen.org/wiki/Xen_ARM_with_Virtualization_Extensions
http://wiki.xen.org/wiki/Dom0_Kernels_for_Xen
http://wiki.xen.org/wiki/XenParavirtOps
http://wiki.xen.org/wiki/Mainline_Linux_Kernel_Configs

git clone --depth 1 git://xenbits.xen.org/xen.git
docs/misc/arm/early-printk.txt: rpi: printk with pl011 for Raspberry Pi 2
xen/arch/arm/Rules.mk: EARLY_PRINTK_rpi            := pl011,0x7e201000,115200



make XEN_TARGET_ARCH=arm32 CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_EARLY_PRINTK=rpi clean
make XEN_TARGET_ARCH=arm32 CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_EARLY_PRINTK=rpi mrproper
make -C xen XEN_TARGET_ARCH=arm32 CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_EARLY_PRINTK=rpi menuconfig
make XEN_TARGET_ARCH=arm32 CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_EARLY_PRINTK=rpi dist-xen


../u-boot/tools/mkimage -A arm -C none -T kernel -n "XEN" -d xen/xen xen-uImage
../u-boot/tools/mkimage -A arm -C none -T kernel -a 0x01C00000 -e 0x01C00000 -n "XEN" -d xen/xen xen-uImage
cp xen-uImage $BOOT




notes below

debug=y
DESTDIR=/some/path

* To build xen and tools using a cross compiler:
./configure --build=x86_64-unknown-linux-gnu --host=aarch64-linux-gnu
make
make install


add some stuff to boot.scr:
mmc dev 0
setenv fdtfile bcm2836-rpi-2-b.dtb
 setenv bootargs "earlyprintk console=tty1 console=ttyAMA0 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait"
setenv xen_addr_r 0x01C00000
 setenv kernel_addr_r 0x01000000
 setenv fdt_addr_r 0x00000100
 setenv xen_bootargs 'sync_console console=dtuart dtuart=/serial@7e201000 dom0_mem=512M'
 setenv dom0_bootargs 'console=hvc0 ignore_loglevel psci=enable clk_ignore_unused root=/dev/mmcblk1p3'
 saveenv
fatload mmc 0:1 ${kernel_addr_r} kernel7.img
fatload mmc 0:1 ${fdt_addr_r} ${fdtfile}
fatload mmc 0:1 $xen_addr_r xen-uImage
 fdt addr $fdt_addr_r
 fdt resize
 fdt set /chosen xen,xen-bootargs \"$xen_bootargs\"
 fdt set /chosen xen,dom0-bootargs \"$dom0_bootargs\"
 fdt mknode /chosen modules
 fdt set /chosen/modules '#address-cells' <1>
 fdt set /chosen/modules '#size-cells' <1>   
 fdt mknode /chosen/modules module@0
 fdt set /chosen/modules/module@0 compatible xen,linux-zimage xen,multiboot-module
 fdt set /chosen/modules/module@0 reg <$kernel_addr_r 0x00c00000>
bootm ${xen_addr_r} - ${fdt_addr_r}
 bootz ${xen_addr_r} - ${fdt_addr_r}

   fdt addr ${fdt_addr_r}
   fdt resize
   
   fdt set /chosen \#address-cells <1>
   fdt set /chosen \#size-cells <1>
   
   fdt mknod /chosen module@0
   fdt set /chosen/module@0 compatible "xen,linux-zimage" "xen,multiboot-module"
   fdt set /chosen/module@0 reg <${kernel_addr_r} 0x00c00000>
   fdt set /chosen/module@0 bootargs "<DOMAIN 0 COMMAND LINE>"







--- reference - interrupt controller info ---
http://lists.infradead.org/pipermail/linux-rpi-kernel/2015-July/thread.html
http://lists.infradead.org/pipermail/linux-rpi-kernel/2015-August/thread.html
linux/Documentation/devicetree/bindings/interrupt-controller/brcm,bcm2836-l1-intc.txt
linux/Documentation/devicetree/bindings/interrupt-controller/brcm,bcm2835-armctrl-ic.txt
linux/Documentation/devicetree/bindings/interrupt-controller/arm,gic.txt
linux/arch/arm/boot/dts/bcm283x.dtsi
linux/arch/arm/boot/dts/bcm2836.dtsi





--- reference - install rpi kernel on raspbian image ---

stew@Stew-SS:~/Desktop/raspi$ sudo losetup /dev/loop0 2016-03-18-raspbian-jessie-lite.img 
stew@Stew-SS:~/Desktop/raspi$ sudo fdisk -l /dev/loop0

Disk /dev/loop0: 1361 MB, 1361051648 bytes
255 heads, 63 sectors/track, 165 cylinders, total 2658304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6f92008e

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      131071       61440    c  W95 FAT32 (LBA)
60.00 MiB gparted reports fat16, lba flag
/dev/loop0p2          131072     2658303     1263616   83  Linux
1.21 GiB ext4

sudo losetup -o 4194304 /dev/loop0 2016-03-18-raspbian-jessie-lite.img
sudo losetup -o 67108864 /dev/loop1 2016-03-18-raspbian-jessie-lite.img

click on the icon to mount
/media/stew/boot
/media/stew/eda95d8a-9cdd-4224-96d0-890b4791600c

sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/stew/eda95d8a-9cdd-4224-96d0-890b4791600c modules_install

sudo cp /media/stew/boot/$KERNEL.img /media/stew/boot/$KERNEL-backup.img
sudo scripts/mkknlimg arch/arm/boot/zImage /media/stew/boot/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb /media/stew/boot
sudo cp arch/arm/boot/dts/overlays/*.dtb* /media/stew/boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /media/stew/boot/overlays/







--- obsolete Busybox (missing init stuff) ---

cd busybox
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mrproper
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j 8
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_PREFIX=$ROOTFS install




sudo mkdir -p $ROOTFS/{etc,boot,proc,sys,mnt,dev}
sudo cp stewconfig/fstab $ROOTFS/etc/fstab
mknod -m 644 myinitfs/dev/console c 5 1
mknod -m 644 myinitfs/dev/loop0 b 7 0

Comments