Skip to content

Commit b1a209f

Browse files
committed
Support NOOBS on the Raspberry Pi 2
* Automatically build linux kernels for both ARMv6 (recovery.img) and ARMv7 (recovery7.img) * Add script to run linux-menuconfig (or user-provided make target) for each arch * Enhanced supported-revision checking code * Enhanced reboot code
1 parent fc5cf67 commit b1a209f

8 files changed

+301
-10
lines changed

BUILDME.sh

+22
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,15 @@ function update_github_kernel_version {
8787
}
8888

8989

90+
function select_kernelconfig {
91+
ARCH=$1
92+
CONFIG_FILE=.config
93+
CONFIG_VAR=BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE
94+
VAR_PREFIX=kernelconfig-recovery
95+
sed -ri "s/(^$CONFIG_VAR=\"$VAR_PREFIX\.).+(\")$/\1$ARCH\2/" "$CONFIG_FILE"
96+
}
97+
98+
9099
cd buildroot
91100

92101
# WARNING: don't try changing these - you'll break buildroot
@@ -128,7 +137,20 @@ FINAL_OUTPUT_DIR="../$NOOBS_OUTPUT_DIR"
128137
mkdir -p "$FINAL_OUTPUT_DIR"
129138
mkdir -p "$FINAL_OUTPUT_DIR/os"
130139
cp -r ../sdcontent/* "$FINAL_OUTPUT_DIR"
140+
141+
# Rebuild kernel for ARMv7
142+
select_kernelconfig armv7
143+
make linux-reconfigure
144+
# copy ARMv7 kernel
145+
cp "$IMAGES_DIR/zImage" "$FINAL_OUTPUT_DIR/recovery7.img"
146+
147+
# Rebuild kernel for ARMv6
148+
select_kernelconfig armv6
149+
make linux-reconfigure
150+
# copy ARMv6 kernel
131151
cp "$IMAGES_DIR/zImage" "$FINAL_OUTPUT_DIR/recovery.img"
152+
153+
# copy rootfs
132154
cp "$IMAGES_DIR/rootfs.cpio.lzo" "$FINAL_OUTPUT_DIR/recovery.rfs"
133155

134156
# Ensure that final output dir contains files necessary to boot

buildroot/.config

+2-2
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ BR2_LINUX_KERNEL_VERSION="c157458351071104eaa8afa7313f2f26afb499da"
312312
BR2_LINUX_KERNEL_PATCH=""
313313
# BR2_LINUX_KERNEL_USE_DEFCONFIG is not set
314314
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
315-
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="kernelconfig-recovery"
315+
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="kernelconfig-recovery.armv6"
316316
# BR2_LINUX_KERNEL_UIMAGE is not set
317317
# BR2_LINUX_KERNEL_APPENDED_UIMAGE is not set
318318
BR2_LINUX_KERNEL_ZIMAGE=y
@@ -628,7 +628,7 @@ BR2_PACKAGE_QT_GUI_MODULE=y
628628
#
629629
# BR2_PACKAGE_QT_PIXEL_DEPTH_1 is not set
630630
# BR2_PACKAGE_QT_PIXEL_DEPTH_4 is not set
631-
# BR2_PACKAGE_QT_PIXEL_DEPTH_8 is not set
631+
BR2_PACKAGE_QT_PIXEL_DEPTH_8=y
632632
# BR2_PACKAGE_QT_PIXEL_DEPTH_12 is not set
633633
# BR2_PACKAGE_QT_PIXEL_DEPTH_15 is not set
634634
BR2_PACKAGE_QT_PIXEL_DEPTH_16=y
File renamed without changes.

buildroot/kernelconfig-recovery.armv7

+153
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
CONFIG_LOCALVERSION="-rescue-v7"
2+
# CONFIG_LOCALVERSION_AUTO is not set
3+
# CONFIG_SWAP is not set
4+
CONFIG_SYSVIPC=y
5+
CONFIG_POSIX_MQUEUE=y
6+
CONFIG_NO_HZ=y
7+
CONFIG_HIGH_RES_TIMERS=y
8+
CONFIG_IKCONFIG=y
9+
CONFIG_IKCONFIG_PROC=y
10+
CONFIG_BLK_DEV_INITRD=y
11+
# CONFIG_RD_GZIP is not set
12+
CONFIG_RD_LZO=y
13+
CONFIG_EMBEDDED=y
14+
# CONFIG_SLUB_DEBUG is not set
15+
# CONFIG_COMPAT_BRK is not set
16+
# CONFIG_BLK_DEV_BSG is not set
17+
CONFIG_ARCH_BCM2709=y
18+
# CONFIG_ARM_THUMB is not set
19+
# CONFIG_CACHE_L2X0 is not set
20+
CONFIG_SMP=y
21+
CONFIG_HAVE_ARM_ARCH_TIMER=y
22+
CONFIG_VMSPLIT_2G=y
23+
CONFIG_HOTPLUG_CPU=y
24+
CONFIG_PREEMPT=y
25+
CONFIG_AEABI=y
26+
CONFIG_CMA=y
27+
CONFIG_UACCESS_WITH_MEMCPY=y
28+
CONFIG_ZBOOT_ROM_TEXT=0x0
29+
CONFIG_ZBOOT_ROM_BSS=0x0
30+
CONFIG_CPU_FREQ=y
31+
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
32+
CONFIG_CPU_FREQ_GOV_USERSPACE=y
33+
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
34+
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
35+
CONFIG_CPU_IDLE=y
36+
CONFIG_VFP=y
37+
# CONFIG_COREDUMP is not set
38+
# CONFIG_SUSPEND is not set
39+
CONFIG_NET=y
40+
CONFIG_PACKET=y
41+
CONFIG_UNIX=y
42+
CONFIG_INET=y
43+
CONFIG_IP_MULTICAST=y
44+
CONFIG_SYN_COOKIES=y
45+
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
46+
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
47+
# CONFIG_INET_XFRM_MODE_BEET is not set
48+
# CONFIG_INET_DIAG is not set
49+
# CONFIG_IPV6 is not set
50+
# CONFIG_WIRELESS is not set
51+
CONFIG_UEVENT_HELPER_PATH="/sbin/mdev"
52+
CONFIG_DEVTMPFS=y
53+
CONFIG_DEVTMPFS_MOUNT=y
54+
CONFIG_DMA_CMA=y
55+
CONFIG_CMA_SIZE_MBYTES=5
56+
CONFIG_BLK_DEV_LOOP=y
57+
CONFIG_BLK_DEV_RAM=y
58+
CONFIG_NETDEVICES=y
59+
# CONFIG_ETHERNET is not set
60+
CONFIG_USB_USBNET=y
61+
# CONFIG_USB_NET_AX8817X is not set
62+
# CONFIG_USB_NET_AX88179_178A is not set
63+
# CONFIG_USB_NET_CDCETHER is not set
64+
# CONFIG_USB_NET_CDC_NCM is not set
65+
CONFIG_USB_NET_SMSC95XX=y
66+
# CONFIG_USB_NET_NET1080 is not set
67+
# CONFIG_USB_NET_CDC_SUBSET is not set
68+
# CONFIG_USB_NET_ZAURUS is not set
69+
# CONFIG_WLAN is not set
70+
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
71+
CONFIG_INPUT_EVDEV=y
72+
# CONFIG_INPUT_KEYBOARD is not set
73+
# CONFIG_INPUT_MOUSE is not set
74+
# CONFIG_SERIO is not set
75+
# CONFIG_LEGACY_PTYS is not set
76+
# CONFIG_DEVKMEM is not set
77+
CONFIG_SERIAL_AMBA_PL011=y
78+
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
79+
# CONFIG_HW_RANDOM is not set
80+
CONFIG_RAW_DRIVER=y
81+
CONFIG_BRCM_CHAR_DRIVERS=y
82+
CONFIG_BCM_VC_CMA=y
83+
CONFIG_GPIO_SYSFS=y
84+
# CONFIG_HWMON is not set
85+
CONFIG_THERMAL=y
86+
CONFIG_THERMAL_BCM2835=y
87+
CONFIG_FB=y
88+
CONFIG_FB_BCM2708=y
89+
CONFIG_FRAMEBUFFER_CONSOLE=y
90+
CONFIG_HIDRAW=y
91+
CONFIG_HID_A4TECH=y
92+
CONFIG_HID_APPLE=y
93+
CONFIG_HID_BELKIN=y
94+
CONFIG_HID_CHERRY=y
95+
CONFIG_HID_CHICONY=y
96+
CONFIG_HID_CYPRESS=y
97+
CONFIG_HID_EZKEY=y
98+
CONFIG_HID_LOGITECH=y
99+
CONFIG_HID_MICROSOFT=y
100+
CONFIG_HID_MONTEREY=y
101+
CONFIG_USB=y
102+
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
103+
CONFIG_USB_DWCOTG=y
104+
CONFIG_MMC=y
105+
CONFIG_MMC_BLOCK_MINORS=32
106+
CONFIG_MMC_SDHCI=y
107+
CONFIG_MMC_SDHCI_PLTFM=y
108+
CONFIG_MMC_BCM2835=y
109+
CONFIG_MMC_BCM2835_DMA=y
110+
CONFIG_NEW_LEDS=y
111+
CONFIG_LEDS_CLASS=y
112+
CONFIG_LEDS_GPIO=y
113+
CONFIG_LEDS_TRIGGERS=y
114+
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
115+
CONFIG_DMADEVICES=y
116+
CONFIG_DMA_BCM2708=y
117+
# CONFIG_IOMMU_SUPPORT is not set
118+
CONFIG_EXT4_FS=y
119+
CONFIG_FANOTIFY=y
120+
CONFIG_FSCACHE=y
121+
CONFIG_CACHEFILES=y
122+
CONFIG_MSDOS_FS=y
123+
CONFIG_VFAT_FS=y
124+
CONFIG_TMPFS=y
125+
CONFIG_TMPFS_POSIX_ACL=y
126+
CONFIG_CONFIGFS_FS=y
127+
# CONFIG_MISC_FILESYSTEMS is not set
128+
# CONFIG_NETWORK_FILESYSTEMS is not set
129+
CONFIG_NLS_DEFAULT="utf8"
130+
CONFIG_NLS_CODEPAGE_437=y
131+
CONFIG_NLS_CODEPAGE_850=y
132+
CONFIG_NLS_CODEPAGE_852=y
133+
CONFIG_NLS_ASCII=y
134+
CONFIG_NLS_ISO8859_1=y
135+
CONFIG_NLS_ISO8859_2=y
136+
CONFIG_NLS_ISO8859_3=y
137+
CONFIG_NLS_ISO8859_4=y
138+
CONFIG_NLS_ISO8859_5=y
139+
CONFIG_NLS_ISO8859_6=y
140+
CONFIG_NLS_ISO8859_7=y
141+
CONFIG_NLS_ISO8859_9=y
142+
CONFIG_NLS_ISO8859_13=y
143+
CONFIG_NLS_ISO8859_14=y
144+
CONFIG_NLS_ISO8859_15=y
145+
CONFIG_NLS_UTF8=y
146+
CONFIG_PRINTK_TIME=y
147+
CONFIG_MAGIC_SYSRQ=y
148+
# CONFIG_DEBUG_PREEMPT is not set
149+
# CONFIG_DEBUG_BUGVERBOSE is not set
150+
# CONFIG_FTRACE is not set
151+
# CONFIG_ARM_UNWIND is not set
152+
# CONFIG_CRYPTO_ANSI_CPRNG is not set
153+
# CONFIG_CRYPTO_HW is not set

make_arch_linux-menuconfig.sh

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#!/bin/bash
2+
3+
# Bash script to run linux-menuconfig for a specific arch
4+
5+
set -e
6+
7+
ARCH=$1
8+
MAKECMD=${2:-"linux-menuconfig"}
9+
if [ -n "$ARCH" ]; then
10+
if [ "$ARCH" != "armv6" ] && [ "$ARCH" != "armv7" ]; then
11+
echo "ARCH must be armv6 or armv7">&2
12+
exit 1
13+
fi
14+
else
15+
echo "Missing ARCH parameter">&2
16+
exit 1
17+
fi
18+
19+
20+
function get_kernel_version {
21+
CONFIG_FILE=.config
22+
CONFIG_VAR=BR2_LINUX_KERNEL_VERSION
23+
grep -E "^$CONFIG_VAR=\".+\"$" "$CONFIG_FILE" | tr -d '"' | cut -d= -f2
24+
}
25+
26+
27+
function select_kernelconfig {
28+
ARCH=$1
29+
CONFIG_FILE=.config
30+
CONFIG_VAR=BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE
31+
VAR_PREFIX=kernelconfig-recovery
32+
sed -ri "s/(^$CONFIG_VAR=\"$VAR_PREFIX\.).+(\")$/\1$ARCH\2/" "$CONFIG_FILE"
33+
}
34+
35+
36+
function get_kernelconfig {
37+
CONFIG_FILE=.config
38+
CONFIG_VAR=BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE
39+
VAR_PREFIX=kernelconfig-recovery
40+
grep -E "^$CONFIG_VAR=\".+\"$" "$CONFIG_FILE" | tr -d '"' | cut -d= -f2 | sed "s/^$VAR_PREFIX\.//"
41+
}
42+
43+
44+
cd buildroot
45+
46+
# Setup kernel for specific arch
47+
if [ "$(get_kernelconfig)" != "$ARCH" ]; then
48+
select_kernelconfig $ARCH
49+
KERNEL_BUILD_DIR=output/build/linux-$(get_kernel_version)
50+
rm "$KERNEL_BUILD_DIR/.stamp_patched"
51+
rm "$KERNEL_BUILD_DIR/.stamp_configured"
52+
fi
53+
54+
# Run specific command
55+
make "$MAKECMD"
56+

recovery/mainwindow.cpp

+54-5
Original file line numberDiff line numberDiff line change
@@ -363,12 +363,60 @@ bool isSupportedOs(const QString& name, const QVariantMap& values)
363363
return true;
364364
}
365365

366-
/* Check the feature_level flag */
367-
quint64 featurelevel = values.value("feature_level", 58364).toULongLong();
368-
quint64 mask = (quint64)1 << readBoardRevision();
369-
if ((featurelevel & mask) != mask) {
366+
uint board_revision = readBoardRevision();
367+
if (values.find("supported_revisions") != values.end())
368+
{
369+
/* Check the supported revisions list */
370+
QStringList revisions = values.value("supported_revisions").toString().remove(" ").split(",");
371+
for (int i=0; i < revisions.size(); i++)
372+
{
373+
bool ok;
374+
uint rev = revisions.at(i).toUInt(&ok, 10);
375+
if (ok)
376+
{
377+
if ((rev & 0xffff) == (board_revision & 0xffff))
378+
{
379+
return true;
380+
}
381+
}
382+
}
383+
return false;
384+
}
385+
else if (values.find("supported_hex_revisions") != values.end())
386+
{
387+
/* Check the supported revisions list */
388+
QStringList revisions = values.value("supported_hex_revisions").toString().remove(" ").split(",");
389+
for (int i=0; i < revisions.size(); i++)
390+
{
391+
bool ok;
392+
uint rev = revisions.at(i).toUInt(&ok, 16);
393+
if (ok)
394+
{
395+
if ((rev & 0xffff) == (board_revision & 0xffff))
396+
{
397+
return true;
398+
}
399+
}
400+
}
370401
return false;
371402
}
403+
else
404+
{
405+
/* Check the feature_level flag */
406+
if (board_revision < 64) /* overflow otherwise */
407+
{
408+
quint64 featurelevel = values.value("feature_level", 58364).toULongLong();
409+
quint64 mask = (quint64)1 << board_revision;
410+
if ((featurelevel & mask) != mask)
411+
{
412+
return false;
413+
}
414+
}
415+
else
416+
{
417+
return false;
418+
}
419+
}
372420

373421
return true;
374422
}
@@ -486,7 +534,8 @@ void MainWindow::on_actionWrite_image_to_disk_triggered()
486534
{
487535
QVariantMap entry = item->data(Qt::UserRole).toMap();
488536
QString name = entry.value("name").toString();
489-
if (!isSupportedOs(name, entry)) {
537+
if (!isSupportedOs(name, entry))
538+
{
490539
allSupported = false;
491540
unsupportedOses += "\n" + name;
492541
}

recovery/util.cpp

+13-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <sys/stat.h>
77
#include <fcntl.h>
88
#include <QFile>
9+
#include <QFileInfo>
910
#include <QProcess>
1011
#include <QDebug>
1112
#include <QList>
@@ -139,7 +140,17 @@ bool canBootOs(const QString& name, const QVariantMap& values)
139140
return true;
140141
}
141142

142-
void setRebootPartition(QByteArray partition)
143+
bool setRebootPartition(QByteArray partition)
143144
{
144-
putFileContents("/sys/module/bcm2708/parameters/reboot_part", partition+"\n");
145+
if (QFileInfo("/sys/module/bcm2708/parameters/reboot_part").exists())
146+
{
147+
putFileContents("/sys/module/bcm2708/parameters/reboot_part", partition+"\n");
148+
return true;
149+
}
150+
else if (QFileInfo("/sys/module/bcm2709/parameters/reboot_part").exists())
151+
{
152+
putFileContents("/sys/module/bcm2709/parameters/reboot_part", partition+"\n");
153+
return true;
154+
}
155+
return false;
145156
}

recovery/util.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ void getOverscan(int &top, int &bottom, int &left, int &right);
2020
bool nameMatchesRiscOS(const QString &name);
2121
uint readBoardRevision();
2222
bool canBootOs(const QString& name, const QVariantMap& values);
23-
void setRebootPartition(QByteArray partition);
23+
bool setRebootPartition(QByteArray partition);
2424
#endif // UTIL_H

0 commit comments

Comments
 (0)