Newer
Older
# _____ _ _
# | __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
# | __| _| -_| -_| . | . | | . | . | | -_|
# |__| |_| |___|___|___|___|_|_|_|___|___|_|_|___|
#
# Hardware setup based on bin/freedombox-hardware-setup from freedom-maker
#
# License
# =======
#
# Copyright (C) 2014-2019 Bob Mottram <bob@freedombone.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
export TEXTDOMAIN=${PROJECT_NAME}-image-hardware-setup
convert_dts() {
dts="$1"
$INSTALL_PACKAGES device-tree-compiler
dtc -I dts -O dtb "${dts}.dts" > "${dts}.dtb"
}
# By default, spawn a console on the serial port
device="$1"
echo "T0:12345:respawn:/sbin/getty -L $device 115200 vt100" >> /etc/inittab
}
beaglebone_setup_boot() {
beaglebone_variant="$1"
# shellcheck disable=SC2012,SC2086
kernelVersion=$(ls /usr/lib/*/${beaglebone_variant}.dtb | head -1 | cut -d/ -f4)
version=$(echo "$kernelVersion" | sed 's/linux-image-\(.*\)/\1/')
initRd=initrd.img-$version
vmlinuz=vmlinuz-$version
bbb_loadaddr='0x82000000'
bbb_initrd_addr='0x88080000'
bbb_fdtaddr='0x88000000'
# uEnv.txt for Beaglebone
# based on https://github.com/beagleboard/image-builder/blob/master/target/boot/beagleboard.org.txt
cat >> /boot/uEnv.txt <<EOF
mmcroot=/dev/mmcblk0p2 ro
console=ttyO0,115200n8
kernel_file=$vmlinuz
initrd_file=$initRd
loadaddr=$bbb_loadaddr
initrd_addr=$bbb_initrd_addr
fdtaddr=$bbb_fdtaddr
initrd_high=0xffffffff
fdt_high=0xffffffff
loadkernel=load mmc \${mmcdev}:\${mmcpart} \${loadaddr} \${kernel_file}
loadinitrd=load mmc \${mmcdev}:\${mmcpart} \${initrd_addr} \${initrd_file}; setenv initrd_size \${filesize}
loadfdt=load mmc \${mmcdev}:\${mmcpart} \${fdtaddr} /dtbs/\${fdtfile}
loadfiles=run loadkernel; run loadinitrd; run loadfdt
mmcargs=setenv bootargs init=/lib/systemd/systemd console=tty0 console=\${console} root=\${mmcroot} rootfstype=\${mmcrootfstype} ifnames=0 slub_debug=FZP slab_nomerge page_poison=1
uenvcmd=run loadfiles; run mmcargs; bootz \${loadaddr} \${initrd_addr}:\${initrd_size} \${fdtaddr}
EOF
mkdir -p /boot/dtbs
cp /usr/lib/linux-image-*-armmp/* /boot/dtbs
}
beaglebone_flash() {
# allow flash-kernel to work without valid /proc contents
# ** this doesn't *really* work, since there are too many checks
# that fail in an emulated environment! We'll have to do it by
# hand below anyway...
if ! $INSTALL_PACKAGES flash-kernel; then
echo "Unable to flash kernel for $FK_MACHINE"
beaglebone_repack_kernel() {
beaglebone_variant="$1"
# process installed kernel to create uImage, uInitrd, dtb
# using flash-kernel would be a good approach, except it fails in the
# cross build environment due to too many environment checks...
#FK_MACHINE="TI AM335x BeagleBone" flash-kernel
# so, let's do it manually...
# flash-kernel's hook-functions provided to mkinitramfs have the
# unfortunate side-effect of creating /conf/param.conf in the initrd
# when run from our emulated chroot environment, which means our root=
# on the kernel command line is completely ignored! repack the initrd
# to remove this evil...
echo "info: repacking beaglebone kernel and initrd"
bbb_dtb="$beaglebone_variant"
kernelVersion=$(ls /usr/lib/*/${bbb_dtb}.dtb | head -1 | cut -d/ -f4)
initRd=initrd.img-$version
vmlinuz=vmlinuz-$version
# optionally use a separately compiled kernel
bbb_dtb_file=/usr/lib/$kernelVersion/${bbb_dtb}.dtb
#if [ -f /boot/bbb.tar.gz ]; then
# cd /boot
# tar -xzvf /boot/bbb.tar.gz
# if [ -f /boot/bbb/dtbs/${bbb_dtb}.dtb ]; then
# if [ -f /boot/bbb/zImage ]; then
# bbb_dtb_file=/boot/bbb/dtbs/${bbb_dtb}.dtb
# vmlinuz=/boot/bbb/zImage
# fi
# fi
#fi
(cd /tmp/initrd-repack || exit 24 ; \
rm -f conf/param.conf ; \
find . | cpio --quiet -o -H newc | \
mkimage -A arm -O linux -T kernel -n "Debian kernel ${version}" \
-C none -a 0x82000000 -e 0x82000000 -d temp-kernel uImage ; \
mkimage -A arm -O linux -T ramdisk -C gzip -a 0x88080000 -e 0x88080000 \
fi
# shellcheck disable=SC2012,SC2086
kernelVersion=$(ls /usr/lib/*/$dtb | head -1 | cut -d/ -f4)
version=$(echo "$kernelVersion" | sed 's/linux-image-\(.*\)/\1/')
initRd=initrd.img-$version
vmlinuz=vmlinuz-$version
# Create boot.cmd
cat >> /boot/boot.cmd <<EOF
setenv mmcdev 0
setenv mmcpart 1
setenv mmcroot /dev/${a20_root_device} ro
setenv mmcrootfstype ext4 rootwait fixrtc
setenv console ttyS0,115200n8
setenv kernel_file $vmlinuz
setenv initrd_file $initRd
setenv fdtfile $dtb
setenv loadaddr 0x46000000
setenv initrd_addr 0x48000000
setenv fdtaddr 0x47000000
setenv initrd_high 0xffffffff
setenv fdt_high 0xffffffff
setenv loadkernel load mmc \${mmcdev}:\${mmcpart} \${loadaddr} \${kernel_file}
setenv loadinitrd load mmc \${mmcdev}:\${mmcpart} \${initrd_addr} \${initrd_file}\\; setenv initrd_size \\\${filesize}
setenv loadfdt load mmc \${mmcdev}:\${mmcpart} \${fdtaddr} /dtbs/\${fdtfile}
setenv loadfiles run loadkernel\\; run loadinitrd\\; run loadfdt
setenv mmcargs setenv bootargs init=/lib/systemd/systemd console=\${console} root=\${mmcroot} rootfstype=\${mmcrootfstype} ifnames=0 slub_debug=FZP slab_nomerge page_poison=1
run loadfiles; run mmcargs; bootz \${loadaddr} \${initrd_addr}:\${initrd_size} \${fdtaddr}
# boot.scr for Allwinner A20 based device
mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
# Copy all DTBs
mkdir -p /boot/dtbs
# shellcheck disable=SC2086
cp /usr/lib/$kernelVersion/* /boot/dtbs
# extra boot modules
{ echo "rtc_sunxi";
echo "vfat"; } >> /etc/initramfs-tools/modules
}
setup_flash_kernel() {
if [ ! -d /etc/flash-kernel ] ; then
mkdir /etc/flash-kernel
fi
printf "%s" "$1" > /etc/flash-kernel/machine
command_line=""
if [ -n "$2" ] ; then
command_line="console=$2"
if [ -n "$command_line" ] ; then
echo "flash-kernel flash-kernel/linux_cmdline string \"$command_line\"" | debconf-set-selections
$INSTALL_PACKAGES flash-kernel
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
rockchip_setup_boot() {
dtb="$1"
rockchip_root_device='mmcblk0p2'
if [ "$2" ]; then
rockchip_root_device="$2"
fi
# shellcheck disable=SC2012,SC2086
kernelVersion=$(ls /usr/lib/*/$dtb | head -1 | cut -d/ -f4)
version=$(echo "$kernelVersion" | sed 's/linux-image-\(.*\)/\1/')
initRd=initrd.img-$version
vmlinuz=vmlinuz-$version
# Create boot.cmd
cat >> /boot/boot.cmd <<EOF
setenv mmcdev 0
setenv mmcpart 1
setenv mmcroot /dev/${rockchip_root_device} ro
setenv mmcrootfstype ext4 rootwait fixrtc
setenv console ttyS0,115200n8
setenv kernel_file $vmlinuz
setenv initrd_file $initRd
setenv fdtfile $dtb
setenv loadaddr 0x46000000
setenv initrd_addr 0x48000000
setenv fdtaddr 0x47000000
setenv initrd_high 0xffffffff
setenv fdt_high 0xffffffff
setenv loadkernel load mmc \${mmcdev}:\${mmcpart} \${loadaddr} \${kernel_file}
setenv loadinitrd load mmc \${mmcdev}:\${mmcpart} \${initrd_addr} \${initrd_file}\\; setenv initrd_size \\\${filesize}
setenv loadfdt load mmc \${mmcdev}:\${mmcpart} \${fdtaddr} /dtbs/\${fdtfile}
setenv loadfiles run loadkernel\\; run loadinitrd\\; run loadfdt
setenv mmcargs setenv bootargs init=/lib/systemd/systemd console=\${console} root=\${mmcroot} rootfstype=\${mmcrootfstype} ifnames=0 slub_debug=FZP slab_nomerge page_poison=1
run loadfiles; run mmcargs; bootz \${loadaddr} \${initrd_addr}:\${initrd_size} \${fdtaddr}
EOF
# boot.scr for Allwinner A20 based device
mkimage -C none -A arm64 -T script -d /boot/boot.cmd /boot/boot.scr
# Copy all DTBs
mkdir -p /boot/dtbs
# shellcheck disable=SC2086
cp /usr/lib/$kernelVersion/* /boot/dtbs
# extra boot modules
echo "vfat" >> /etc/initramfs-tools/modules
# convert the device tree to a blob
dts=$(echo "${dtb}" | sed 's|.dtb|.dts|g')
if [ -f "/root/${PROJECT_NAME}/image_build/dts/${dts}" ]; then
convert_dts "/root/${PROJECT_NAME}/image_build/dts/${dts}"
cp "/root/${PROJECT_NAME}/image_build/dts/${dtb}" /boot/dtbs
fi
}
beagleboneblack)
beaglebone_setup_boot am335x-boneblack
beaglebone_flash "TI AM335x BeagleBone Black"
beaglebone_repack_kernel am335x-boneblack
enable_serial_console ttyO0
beaglebone_setup_boot am335x-bonegreen
beaglebone_flash "TI AM335x BeagleBone Green"
beaglebone_repack_kernel am335x-bonegreen
enable_serial_console ttyO0
beaglebone_setup_boot am57xx-beagle-x15
beaglebone_flash "TI AM5728 BeagleBoard-X15"
beaglebone_repack_kernel am57xx-beagle-x15
enable_serial_console ttyO0
a20_setup_boot sun7i-a20-cubietruck.dtb "$EXTERNAL_DRIVE"
enable_serial_console ttyS0
a20_setup_boot sun7i-a20-olinuxino-lime.dtb "$EXTERNAL_DRIVE"
enable_serial_console ttyS0
a20_setup_boot sun7i-a20-olinuxino-lime2.dtb "$EXTERNAL_DRIVE"
enable_serial_console ttyS0
a20_setup_boot sun7i-a20-olinuxino-micro.dtb "$EXTERNAL_DRIVE"
enable_serial_console ttyS0
a20_setup_boot sun7i-a20-bananapro.dtb "$EXTERNAL_DRIVE"
enable_serial_console ttyS0
a20_setup_boot sun7i-a20-cubieboard2.dtb "$EXTERNAL_DRIVE"
enable_serial_console ttyS0
a20_setup_boot sun7i-a20-pcduino3.dtb "$EXTERNAL_DRIVE"
enable_serial_console ttyS0
rock64)
rockchip_setup_boot rk3328-rock64.dtb "$EXTERNAL_DRIVE"
enable_serial_console ttyS0
;;