#!/bin/bash

partition (){
if [[ "$OFFSET" == "8192" ]]; then IMG_OFFSET="4MiB"; fi
truncate -s ${IMGSIZE} "${IMAGE_FOLDER}${IMAGE_FILE_NAME}"
parted --script "${IMAGE_FOLDER}${IMAGE_FILE_NAME}" \
mklabel msdos \
mkpart primary fat32 ${IMG_OFFSET} 512MiB \
mkpart primary ext2 512MiB 100%
#parted --script "${IMAGE_FOLDER}${IMAGE_FILE_NAME}" set 1 lba off
parted --script "${IMAGE_FOLDER}${IMAGE_FILE_NAME}" set 1 boot on
IMAGE_LOOP_DEV="$(losetup --show -P -f ${IMAGE_FOLDER}${IMAGE_FILE_NAME})"
IMAGE_LOOP_DEV_BOOT="${IMAGE_LOOP_DEV}p1"
IMAGE_LOOP_DEV_ROOTFS="${IMAGE_LOOP_DEV}p2"
partprobe "${IMAGE_LOOP_DEV}"
filesystem
$MAKE_BOOTFS
$MAKE_ROOTFS
mkdir -p p1 p2
mount "${IMAGE_LOOP_DEV_BOOT}" p1
mount "${IMAGE_LOOP_DEV_ROOTFS}" p2
if [[ "$FSTYPE" == "btrfs" ]]; then
	btrfs subvolume create p2/@
fi
sync
umount p2
$MOUNT_ROOTFS
}

filesystem (){
MAKE_BOOTFS="mkfs -t vfat -n BOOT ${IMAGE_LOOP_DEV_BOOT}"
BOOT_PATH="/boot/broadcom"
if [[ "$FSTYPE" == "ext4" ]]; then
	MAKE_ROOTFS="mkfs.ext4 -L ROOTFS ${IMAGE_LOOP_DEV_ROOTFS}"
	MOUNT_ROOTFS="mount -o defaults,noatime ${IMAGE_LOOP_DEV_ROOTFS} p2"
	ROOTFS_TABLE="ext4	defaults,noatime,commit=600,errors=remount-ro 0 1"
	ROOTFSTYPE="rootfstype=ext4"
fi
if [[ "$FSTYPE" == "btrfs" ]]; then
	MAKE_ROOTFS="mkfs.btrfs -f -L ROOTFS ${IMAGE_LOOP_DEV_ROOTFS}"
	MOUNT_ROOTFS="mount -o compress=lzo,noatime,subvol=@ ${IMAGE_LOOP_DEV_ROOTFS} p2"
	ROOTFS_TABLE="btrfs	defaults,compress=lzo,noatime,subvol=@ 0 1"
	ROOTFSTYPE="rootfstype=btrfs rootflags=subvol=@"
fi
if [[ "$FSTYPE" == "xfs" ]]; then
	MAKE_ROOTFS="mkfs.xfs -f -L ROOTFS ${IMAGE_LOOP_DEV_ROOTFS}"
	MOUNT_ROOTFS="mount -o defaults,noatime ${IMAGE_LOOP_DEV_ROOTFS} p2"
	ROOTFS_TABLE="xfs	defaults,noatime 0 1"
	ROOTFSTYPE="rootfstype=xfs"
fi
}

fstab (){
rm -f p2/etc/fstab
tee p2/etc/fstab <<EOF
UUID=${BOOT_UUID}	${BOOT_PATH}	vfat	defaults,flush 0 2
UUID=${ROOT_UUID}	/	${ROOTFS_TABLE}
tmpfs	/tmp		tmpfs	defaults,nosuid 0 0
EOF
}

uuid (){
BOOT_UUID=$(blkid -o export -- "${IMAGE_LOOP_DEV_BOOT}" | sed -ne 's/^UUID=//p')
ROOT_UUID=$(blkid -o export -- "${IMAGE_LOOP_DEV_ROOTFS}" | sed -ne 's/^UUID=//p')
ROOT_PARTUUID=$(blkid -o export -- "${IMAGE_LOOP_DEV_ROOTFS}" | sed -ne 's/^PARTUUID=//p')
}

cmdline (){
rm -f p1/cmdline.txt
tee p1/cmdline.txt <<EOF
${CONSOLE} root=PARTUUID=${ROOT_PARTUUID} ${ROOTFSTYPE} fsck.repair=yes ${EXTRA} rootwait
EOF
}

config_dot_txt (){
tee p1/config.txt <<EOF
arm_64bit=1
initramfs initrd.gz followkernel

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
#hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

# camera
#start_x=1
#gpu_mem=128

# automatically load overlays for detected cameras
#camera_auto_detect=1

# automatically load overlays for detected DSI displays
#display_auto_detect=1

# uncomment to overclock: https://www.tomshardware.com/how-to/overclock-any-raspberry-pi
#arm_freq=
#gpu_freq=
#core_freq=
#over_voltage=
#force_turbo=1

# uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on

# uncomment this to enable infrared communication.
#dtoverlay=gpio-ir,gpio_pin=17
#dtoverlay=gpio-ir-tx,gpio_pin=18

# additional overlays and parameters are documented /boot/overlays/README

# enable audio (loads snd_bcm2835)
dtparam=audio=on

# enable uart
enable_uart=0

# disable wifi and bluetooth
#dtoverlay=disable-wifi
#dtoverlay=disable-bt
#dtoverlay=pi3-disable-wifi
#dtoverlay=pi3-disable-bt
#dtoverlay=disable-wifi-pi5
#dtoverlay=disable-bt-pi5

# remove test rainbow
disable_splash=1

# disables the warning overlays
avoid_warnings=1

# gpio fan (headers)
#dtoverlay=gpio-fan,gpiopin=12,temp=55000,hyst=2000

[cm4]
otg_mode=1

[pi4]
dtoverlay=vc4-kms-v3d,cma-512
#dtoverlay=vc4-kms-v3d-pi4
#dtoverlay=vc4-fkms-v3d
max_framebuffers=2
arm_boost=1
#disable_fw_kms_setup=1

[pi5]
dtoverlay=vc4-kms-v3d,cma-512
#dtoverlay=vc4-kms-v3d-pi5
#dtoverlay=vc4-fkms-v3d
max_framebuffers=0
arm_boost=1
usb_max_current_enable=1
disable_fw_kms_setup=1

# pwm fan
#dtparam=fan_temp0=50000
#dtparam=fan_temp0_hyst=2000
#dtparam=fan_temp0_speed=75
#dtparam=fan_temp1=55000
#dtparam=fan_temp1_hyst=2000
#dtparam=fan_temp1_speed=125
#dtparam=fan_temp2=60000
#dtparam=fan_temp2_hyst=3000
#dtparam=fan_temp2_speed=175
#dtparam=fan_temp3=65000
#dtparam=fan_temp3_hyst=3000
#dtparam=fan_temp3_speed=250
EOF
}
