-
Notifications
You must be signed in to change notification settings - Fork 4
/
build-kernel
executable file
·170 lines (144 loc) · 5.44 KB
/
build-kernel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0+
# How to build and boot a custom kernel
# -------------------------------------
#
# Install package dependencies
# - RedHat-based systems
# dnf install abootimg android-tools gcc-arm-linux-gnu
# - Debian-based systems
# apt-get install abootimg fastboot gcc-8-arm-linux-gnueabihf
#
# Clone Linus's linux and the nexus-5-upstream repositories:
#
# mkdir ~/src
# git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
# git clone https://github.com/masneyb/nexus-5-upstream.git
#
# # Optional: Clone downstream MSM 3.4 sources
# git clone https://github.com/AICP/kernel_lge_hammerhead.git linux-msm-3.4-hammerhead
# cd ~/src/linux-msm-3.4-hammerhead
# git am ~/src/nexus-5-upstream/out-of-tree-patches/downstream-patches/*.patch
#
# Install postmarketOS user space on the phone as described at
# https://wiki.postmarketos.org/wiki/Google_Nexus_5_(lg-hammerhead)
#
# Build and boot the upstream kernel (Use absolute paths!):
#
# ~/src/nexus-5-upstream/build-kernel ~/src/linux
# sudo fastboot boot ~/src/linux/arch/arm/boot/nexus5-boot.img
#
# Build and boot the downstream kernel https://github.com/AICP/kernel_lge_hammerhead. Note that
# I haven't been able to get the framebuffer to work on the downstream kernel, so you'll need
# to build a serial cable as described in UART_CABLE.md. You can clone the Raspberry Pi tools
# repo at https://github.com/raspberrypi/tools in order to get a suitable cross compiler.
#
# export CROSS_COMPILE=/path/to/rpi/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-
# ~/src/nexus-5-upstream/build-kernel ~/src/linux-msm-3.4-hammerhead "" hammerhead_defconfig \
# ~/src/linux-msm-3.4-hammerhead/arch/arm/boot/msm8974-hammerhead-rev-11.dtb ttyHSL0
# sudo fastboot boot ~/src/linux-msm-3.4-hammerhead/arch/arm/boot/nexus5-boot.img
#
# Note that the optional second argument to build-kernel is a separate directory outside this
# repository that contains an additional directory to add to the initrd. I use this to add my
# local WiFi password and bluetooth firmware. See the .gitignore for the exact paths.
set -e
build_kernel()
{
export ARCH=arm
export PATH="${PATH}":"${KERNEL_SRC}"/scripts/dtc
if [ "${CROSS_COMPILE}" = "" ] ; then
if [ -f /usr/bin/arm-linux-gnu-gcc ] ; then
export CROSS_COMPILE=/usr/bin/arm-linux-gnu-
elif [ -f /usr/bin/arm-linux-gnueabihf-gcc ] ; then
export CROSS_COMPILE=/usr/bin/arm-linux-gnueabihf-
else
echo "Can't setup CROSS_COMPILE environment variable"
exit 1
fi
fi
if [ "${NUM_CPUS}" = "" ] ; then
NUM_CPUS=$(grep -c ^processor /proc/cpuinfo)
fi
cd "${KERNEL_SRC}"
echo "Running 'make ${DEFCONFIG}'"
make "${DEFCONFIG}"
make kernelrelease
#HAS_DT_BINDING_CHECK=$(grep ^dt_binding_check: Makefile || true)
#if [ "${HAS_DT_BINDING_CHECK}" != "" ] ; then
# make dt_binding_check
#fi
nice -n 19 make -j "${NUM_CPUS}"
echo "Using DTB ${DTB}"
ZIMAGE_DTB=$(mktemp)
cat arch/arm/boot/zImage "${DTB}" > "${ZIMAGE_DTB}"
}
generate_boot_cfg()
{
cat > "${BOOT_CFG}" << __EOF__
pagesize = 0x800
kerneladdr = 0x8000
ramdiskaddr = 0x2900000
secondaddr = 0xf00000
tagsaddr = 0x2700000
name =
cmdline = console=tty0 console=${SERIAL_TTY},115200,n8 msm.allow_vram_carveout msm.vram=48m rootwait PMOS_NO_OUTPUT_REDIRECT
__EOF__
}
create_char_device()
{
if [ ! -c "${1}" ] ; then
echo "Creating ${1}"
sudo mknod --mode="${2}" "${1}" c "${3}" "${4}"
fi
}
generate_initrd()
{
BASE_DIR=$(dirname "$0")
INITRD_DIR="${BASE_DIR}/initrd"
mkdir -p "${INITRD_DIR}/boot" "${INITRD_DIR}/dev" "${INITRD_DIR}/proc" "${INITRD_DIR}/sys" \
"${INITRD_DIR}/sysroot" "${INITRD_DIR}/tmp" "${INITRD_DIR}/usr/bin"
sed "s/__SERIAL_TTY__/${SERIAL_TTY}/g" "${INITRD_DIR}/copy-to-root-fs/etc/inittab.template" > \
"${INITRD_DIR}"/copy-to-root-fs/etc/inittab
if [ ! -e "${INITRD_DIR}"/bin/sh ] ; then
pushd "${INITRD_DIR}"/bin/
ln -s busybox sh
popd
fi
create_char_device "${INITRD_DIR}"/dev/null 0666 1 3
create_char_device "${INITRD_DIR}"/dev/random 0644 1 8
create_char_device "${INITRD_DIR}"/dev/urandom 0644 1 9
if [ "${EXTRA_INITRD}" != "" ] ; then
cp -dpR "${EXTRA_INITRD}"/* "${INITRD_DIR}"
fi
rm -rf "${INITRD_DIR}/lib/modules"
make INSTALL_MOD_PATH="${INITRD_DIR}" modules_install || true
cd "${INITRD_DIR}"
find . | grep -v \.placeholder | cpio --create --format="newc" --quiet > "${INITRD}"
# To extract: cpio -idm --quiet < initrd.img
}
export KERNEL_SRC="$1"
export EXTRA_INITRD="$2"
export DEFCONFIG="${3:-qcom_defconfig}"
export DTB="${4:-arch/arm/boot/dts/qcom-msm8974-lge-nexus5-hammerhead.dtb}"
export SERIAL_TTY="${5:-ttyMSM0}" # downstream kernel uses ttyHSL0; upstream is ttyMSM0
if [ "${KERNEL_SRC}" = "" ] ; then
echo "$0 <kernel source tree> [ <defconfig> ] [ dtb ] [ serial tty ]"
exit 1
fi
build_kernel
BOOT_CFG=$(mktemp)
generate_boot_cfg
INITRD=$(mktemp)
generate_initrd
ABOOT_IMG="${KERNEL_SRC}"/arch/arm/boot/nexus5-boot.img
abootimg --create "${ABOOT_IMG}" -f "${BOOT_CFG}" -k "${ZIMAGE_DTB}" -r "${INITRD}"
rm -f "${BOOT_CFG}" "${INITRD}" "${ZIMAGE_DTB}"
ls -lh "${ABOOT_IMG}"
echo "Hint: If the image above is too big, then be sure that CONFIG_MEDIA_SUPPORT_FILTER"
echo "is enabled."
echo ""
echo "Run to boot the kernel without flashing the boot partition:"
echo " sudo fastboot boot ${ABOOT_IMG}"
echo ""
echo "Run to flash the kernel on the boot paritition:"
echo " sudo fastboot flash boot ${ABOOT_IMG}"