Difference between revisions of "ODROID U2"

From Funtoo Linux
Jump to: navigation, search
(Kernel and modules)
 
(12 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
The [http://www.hardkernel.com/renewal_2011/products/prdt_info.php| ODROID U2 ] is an ARM development board, featuring a 1.7 GHz quad-core CPU (ARMv7a). This document contains notes about installing Funtoo Linux on this device.
 
The [http://www.hardkernel.com/renewal_2011/products/prdt_info.php| ODROID U2 ] is an ARM development board, featuring a 1.7 GHz quad-core CPU (ARMv7a). This document contains notes about installing Funtoo Linux on this device.
  
== Preliminary discussion ==
 
  
The ODROID-U2 needs u-boot as a bootloader, and at the time of writing this document, the required sources are not available. Some forum posts seem to indicate that they were once available, but other posts say that it never worked.
+
== Cross-compiler installation ==
  
Some distributions (Ubuntu for example) already have SD-card images for the U2. This means that somebody has (or had) found the necessary information. To keep tracks, the last section will show how a working Ubuntu SD-card image has been used to bootstrap this Funtoo installation. The other sections will be edited after a better solution is found.
+
To compile a suitable Linux kernel and bootloader for the ODROID U2, you need to install an ARMv7a hardfloat toolchain on your system.
  
{{fancywarning|The following sections contain a quite unusual way of getting Funtoo installed, but will be updated when missing software is available.}}
+
<console>
 +
# ##i##emerge crossdev
 +
# ##i##crossdev -v -t armv7a-hardfloat-linux-gnueabi
 +
</console>
  
== Micro-SD Card Preparation ==
 
As there is missing software from upstream, we need to start with a SD-card image containing the bootloader (u-boot), and a boot partition containing the files that are required at boot-time. To do this, we started with an Ubuntu SD-card for the ODROID-U2 (see the last section for details).
 
  
First, download the [http://ftp.osuosl.org/pub/funtoo/distfiles/odroid_u2_uboot_and_boot_partition-2013-01-17.img.gz u-boot and boot partition image].
+
{{fancywarning|In the following sections, replace /dev/sdX with the actual device node of your SD card.}}
  
Then, extract it and copy it over your SD-card (we will use '''/dev/sdb''' for the rest of this document, '''adjust as needed''').
+
 
 +
== U-boot bootloader ==
 +
 
 +
The ODROID-U2 needs U-boot as a bootloader. The ODROID U2 vendor provides a git repository with all what is needed to build and install U-boot on the SD-card that will be used to boot the device.
  
 
<console>
 
<console>
# ##i##gunzip odroid_u2_uboot_and_boot_partition-2013-01-17.img.gz
+
# ##i##mkdir ~/odroid_u2
# ##i##dd if=odroid_u2_uboot_and_boot_partition-2013-01-17.img of=/dev/sdb
+
# ##i##cd ~/odroid_u2
 +
# ##i##git clone https://github.com/hardkernel/u-boot.git
 +
# ##i##cd u-boot
 +
# ##i##make smdk4412_config
 +
# ##i##make ARCH=arm CROSS_COMPILE=armv7a-hardfloat-linux-gnueabi-
 
</console>
 
</console>
  
You should now have the following partition schema:
+
 
 +
If U-boot does not build with your ARM toolchain, see the troubleshooting section. It may happen that U-boot does not build with a recent toolchain.
 +
 
 +
 
 +
Now, the following will install U-boot on the beginning sectors of your SD card.
  
 
<console>
 
<console>
# ##i## cfdisk -P s /dev/sdb
+
# ##i##cd sd_fuse
 +
# ##i##./sd_fusing.sh /dev/sdX
 
</console>
 
</console>
 
<pre>
 
Partition Table for /dev/sdb
 
              First      Last
 
# Type      Sector      Sector  Offset    Length  Filesystem Type (ID) Flag
 
-- ------- ----------- ----------- ------ ----------- -------------------- ----
 
  Pri/Log          0        3071*    0#      3072*Free Space          None
 
1 Primary        3072*      68607*    0      65536*Linux (83)          None
 
2 Primary      68608*  11472895*    0    11404288*Linux (83)          None
 
  Pri/Log    11472896*  15661055*    0    4188160*Free Space          None
 
------------------------------------------------------------
 
</pre>
 
  
{{fancywarning|The bootloader requires some of the space that is available at the beginning of the device. Don't override this free space, as it is not really "free".}}
 
  
The boot partition /dev/sdb1 is formatted as FAT32 and contains some files. The other partition appears as the partition table has been copied, but it is not formatted.
 
  
Remove this partition (/dev/sdb2) and add other partitions to fit your needs. In the following example, there is a 1GB swap partition and the remaining space is used as an ext4 root partition.
+
 
 +
== Partitionning ==
 +
 
 +
{{fancywarning|The bootloader takes a bit more space than usual. You must keep about 5 MB (10240 sectors for example) of free space before the first partition.}}
 +
 
 +
 
 +
You may now partition your SD card to fit your needs. However, U-boot expects to find a FAT32 boot partition (first or second). Also, U-boot needs free space before the first partition.
 +
 
  
 
<pre>
 
<pre>
Partition Table for /dev/sdb
+
Partition Table for /dev/sdX
 +
 
 
               First      Last
 
               First      Last
 
  # Type      Sector      Sector  Offset    Length  Filesystem Type (ID) Flag
 
  # Type      Sector      Sector  Offset    Length  Filesystem Type (ID) Flag
 
-- ------- ----------- ----------- ------ ----------- -------------------- ----
 
-- ------- ----------- ----------- ------ ----------- -------------------- ----
   Pri/Log          0       3071*    0#       3072*Free Space          None
+
   Pri/Log          0       10239*    0#     10240*Free Space          None
  1 Primary       3072*     68607*    0       65536*Linux (83)           None
+
  1 Primary       10240*     215039*    0     204800*W95 FAT32 (0B)       None
  2 Primary       68608*    2074741*    0    2006134 Linux swap / So (82) None
+
  2 Primary     215040*    2214599*    0    1999560*Linux swap / So (82) None
  3 Primary    207474215661055*    0    13586314*Linux (83)          None
+
  3 Primary    221460015269887*    0    13055288*Linux (83)          None
------------------------------------------------------------
+
 
</pre>
 
</pre>
 +
 +
 +
Now, format your partitions, e.g.
  
 
<console>
 
<console>
# ##i##mkswap /dev/sdb2
+
# ##i##mkfs.vfat /dev/sdX1
# ##i##mkfs.ext4 /dev/sdb3
+
# ##i##mkswap /dev/sdX2
 +
# ##i##mkfs.ext4 /dev/sdX3
 
</console>
 
</console>
  
Line 65: Line 74:
  
 
== Funtoo Linux Installation ==
 
== Funtoo Linux Installation ==
Follow the guide from [[Funtoo_Linux_Installation_on_ARM]] to begin the installation of Funtoo on the root filesystem. Note that once you are finished, you will not be able to boot the ODROID U2 until you complete the next sections.
+
Follow the guide from [[Funtoo Linux Installation on ARM]] to begin the installation of Funtoo on the root filesystem. Note that once you are finished, you will not be able to boot the ODROID U2 until you complete the next sections.
  
  
== Boot partition setup ==
 
Mount the boot partition (/dev/sdb1) in /mnt/SD_root/boot (created in the last section). It should contain the following files:
 
  
<pre>
+
=== Kernel and modules ===
.
+
├── board.dtb
+
├── boot
+
├── boot-hdmi1080.scr
+
├── boot-hdmi1080.txt
+
├── boot-hdmi720.scr
+
├── boot-hdmi720.txt
+
├── boot.ini
+
├── boot.scr
+
├── boot.txt
+
├── uInitrd
+
└── zImage
+
</pre>
+
  
To change the video mode that will be used by default, simply copy boot-hdmi[your_resolution].scr and .txt over boot.scr and boot.txt. You can backup the original files before.
+
The ODROID U2 vendor provides kernel sources and default .config files for the ODROID U2. In this example, we clone the git repository, use the default branch, and build the default ubuntu kernel config. Note that other branches exist, some of them provide default configurations for the U2, others not.
 +
 
 +
{{fancywarning|As in [[Funtoo Linux Installation on ARM]], we consider that the root partition is mounted in /mnt/SD_root. Also, we consider that the boot partition is /dev/sdX1.}}
  
 
<console>
 
<console>
# ##i## mv boot.txt boot-orig.txt
+
# ##i##cd ~/odroid_u2
# ##i## mv boot.scr boot-orig.scr
+
# ##i##git clone https://github.com/hardkernel/linux.git
# ##i## cp boot-hdmi1080.scr boot.scr
+
# ##i##cd linux
# ##i## cp boot-hdmi1080.txt boot.txt
+
# ##i##ARCH=arm make odroidu2_ubuntu_defconfig
 +
# ##i##ARCH=arm CROSS_COMPILE=/usr/bin/armv7a-hardfloat-linux-gnueabi- make -j8 (adapt depending on the number of cores available on the build machine)
 +
# ##i##mount /dev/sdX1 /mnt/SD_root/boot
 +
# ##i##ARCH=arm CROSS_COMPILE=/usr/bin/armv7a-hardfloat-linux-gnueabi- make modules_install INSTALL_MOD_PATH=/mnt/SD_root
 +
# ##i##cp arch/arm/boot/zImage /mnt/SD_root/boot
 
</console>
 
</console>
  
Those boot files define some of the kernel arguments that will be passed. One of them is the root filesystem's UUID. To avoid modifying those, the root filesystem's UUID can be changed to have the value defined in boot.* :
+
== Boot partition setup ==
 +
You now have a kernel in /mnt/SD_root/boot. The only missing part is a file named ''boot.scr'', which will be read by U-boot.
 +
 
 +
First, create a ''boot.txt'' file on the boot partition.
  
 
<console>
 
<console>
# ##i## tune2fs -U e139ce78-9841-40fe-8823-96a304a09859 /dev/sdb3
+
# ##i##cd /mnt/SD_root/boot
 +
# ##i##touch boot.txt
 
</console>
 
</console>
  
 +
Modify this file to contain the following :
  
== Personalized Kernel Compilation ==
+
<pre>
 +
setenv initrd_high "0xffffffff"
 +
setenv fdt_high "0xffffffff"
 +
setenv fb_x_res "1920"
 +
setenv fb_y_res "1080"
 +
setenv hdmi_phy_res "1080"
 +
setenv bootcmd "fatload mmc 0:1 0x40008000 zImage; bootm 0x40008000"
 +
setenv bootargs "console=tty1 console=ttySAC1,115200n8 fb_x_res=${fb_x_res} fb_y_res=${fb_y_res} hdmi_phy_res=${hdmi_phy_res} root=/dev/mmcblk0p3 rootwait ro mem=2047M"
 +
boot
 +
</pre>
  
=== Cross-compiler installation ===
+
{{fancywarning|Modify the screen resolution to fit your needs. Also, modify ''/dev/mmcblk0p3'' for the correct device of your root partition. ''/dev/mmcblk0p3'' is the third partition of the SD-card. Modify the last digit to fit your partitioning scheme.}}
In order to compile the Linux kernel for the ODROID U2, an ARMv7a hardfloat toolchain is needed. Install it using crossdev:
+
  
<console>
 
# ##i## emerge crossdev
 
# ##i## crossdev -v -t armv7a-hardfloat-linux-gnueabi (also add -S if you want a stable toolchain)
 
</console>
 
  
 +
Now, install u-boot-tools that provides ''mkimage'' and create ''boot.scr''.
  
=== Kernel Compilation an Installation ===
 
The kernel for the ODROID U2 can be directly compiled from the sources, given by hardkernel. Note that there are several branches (odroid-3.0.y, odroidx-3.6.y and odroid-next when this page was written), but we will stick with the default branch as it provides a defconfig for a simple start.
 
  
 
<console>
 
<console>
# ##i## cd ../odroid_u2
+
# ##i##emerge u-boot-tools
# ##i## git clone https://github.com/hardkernel/linux.git
+
# ##i##mkimage -A arm -T script -C none -n "Boot.scr for odroid-u2" -d boot.txt boot.scr
# ##i## cd linux
+
# ##i## ARCH=arm make odroidu2_ubuntu_defconfig
+
# ##i## ARCH=arm CROSS_COMPILE=/usr/bin/armv7a-hardfloat-linux-gnueabi- make -j8 (adapt depending on the number of cores available on the build machine)
+
# ##i## ARCH=arm CROSS_COMPILE=/usr/bin/armv7a-hardfloat-linux-gnueabi- make modules_install INSTALL_MOD_PATH=/mnt/SD_root
+
# ##i## cp arch/arm/boot/zImage /mnt/SD_root/boot
+
 
</console>
 
</console>
  
  
== Miscellaneous ==
 
  
=== Bootstrapping a Funtoo installation using an Ubuntu SD-card Image ===
+
== Further configuration ==
[http://odroid.foros-phpbb.com/t2005-linaro-ubuntu-1211-for-odroid-u2|Linaro Ubuntu for ODROID-U2] is a port of Ubuntu working on the ODROID-U2. They provide a working SD-card image that already contains the necessary first bits of information (u-boot image) on the beginning of the SD-card, a fat32 boot partition with boot files, and an ext4 partition for Ubuntu root filesystem.
+
  
The following steps are inspired by [http://odroid.foros-phpbb.com/t2242-gentoo-hardfp-image-for-the-u2|the work of kripton that provides a Gentoo SD-card image].
+
=== fstab ===
 +
<pre>
 +
/dev/mmcblk0p1 /boot vfat noauto,noatime 1 2
 +
/dev/mmcblk0p2 none swap sw 0 0
 +
/dev/mmcblk0p3 / ext4 noatime 0 0
 +
</pre>
  
We will use it to bootstrap a Funtoo installation, and try to find a better solution in the future.
 
  
1. Download a SD-card image from [[http://odroid.foros-phpbb.com/t2005-linaro-ubuntu-1211-for-odroid-u2]].
+
Note: We disable fsck checking of some devices as it may fail because of the missing hardware clock on the device.
2. Extract it if it's compressed.
+
 
3. Run dd if=name_of_image of=/dev/your_sd_card_device
+
=== inittab ===
 +
 
 +
If you have USB/UART debugging hardware, you may want to change /etc/inittab the following way :
  
After a while, this should give you the following partition table:
 
 
<pre>
 
<pre>
Partition Table for /dev/sdc
+
# SERIAL CONSOLESs0:12345:respawn:/sbin/agetty 115200 ttySAC1 vt100
              First      Last
+
# Type      Sector      Sector  Offset    Length  Filesystem Type (ID) Flag
+
-- ------- ----------- ----------- ------ ----------- -------------------- ----
+
  Pri/Log          0        3071*    0#      3072*Free Space          None
+
1 Primary        3072*      68607*    0      65536*Linux (83)          None
+
2 Primary      68608*  11472895*    0    11404288*Linux (83)          None
+
  Pri/Log    11472896*  15661055*    0    4188160*Free Space          None
+
------------------------------------------------------------
+
 
</pre>
 
</pre>
  
To provide a starting point for a Funtoo installation, we will reuse the first 68607 sectors if this installation to extract the boot loader and the boot partition.
 
  
<console>
 
# ##i##dd if=/dev/sdc of=uboot_and_boot_partition.img bs=512 count=68607
 
</console>
 
  
This is it! This file will be used to install Funtoo and have already u-boot and boot partition available.
+
== Troubleshooting ==
 +
 
 +
=== Error: selected processor does not support ARM mode `smc 0' ===
 +
<pre>--- board/samsung/smdk4212/smc.c.orig 2013-04-30 17:34:16.556093458 -0400
 +
+++ board/samsung/smdk4212/smc.c 2013-04-30 17:34:50.422095103 -0400
 +
@@ -90,6 +90,7 @@
 +
register u32 reg3 __asm__("r3") = arg3;
 +
 
 +
  __asm__ volatile (
 +
+ ".arch_extension sec\n"
 +
"smc 0\n"
 +
: "+r"(reg0), "+r"(reg1), "+r"(reg2), "+r"(reg3)
 +
 
 +
@@ -104,6 +105,7 @@
 +
register u32 reg1 __asm__("r1") = 0;
 +
  __asm__ volatile (
 +
+ ".arch_extension sec\n" "smc 0\n"
 +
: "+r"(reg0), "+r"(reg1)
 +
</pre>
 +
 
 +
Source :http://forum.insignal.co.kr/viewtopic.php?f=10&t=118
 +
 
 +
=== armv7a-hardfloat-linux-gnueabi-ld: error: /usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.7.2/libgcc.a(bpabi.o) uses VFP register arguments, u-boot does not ===
 +
 
 +
<pre>
 +
--- arch/arm/cpu/armv7/config.mk.orig 2013-04-30 17:40:20.842111160 -0400
 +
+++ arch/arm/cpu/armv7/config.mk 2013-04-30 17:40:52.368112692 -0400
 +
@@ -20,7 +20,7 @@
 +
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 +
# MA 02111-1307 USA
 +
#
 +
-PLATFORM_RELFLAGS += -fno-common -ffixed-r8 -msoft-float
 +
+PLATFORM_RELFLAGS += -fno-common -ffixed-r8 -mfloat-abi=hard -mfpu=vfpv3 
 +
 
 +
# Make ARMv5 to allow more compilers to work, even though its v7a.
 +
PLATFORM_CPPFLAGS += -march=armv7-a
 +
</pre>
 +
 
 +
Source :
 +
https://code.google.com/p/chromium/issues/detail?id=213120

Latest revision as of 17:18, 3 May 2013

The ODROID U2 is an ARM development board, featuring a 1.7 GHz quad-core CPU (ARMv7a). This document contains notes about installing Funtoo Linux on this device.


Contents

[edit] Cross-compiler installation

To compile a suitable Linux kernel and bootloader for the ODROID U2, you need to install an ARMv7a hardfloat toolchain on your system.

# emerge crossdev
# crossdev -v -t armv7a-hardfloat-linux-gnueabi


In the following sections, replace /dev/sdX with the actual device node of your SD card.



[edit] U-boot bootloader

The ODROID-U2 needs U-boot as a bootloader. The ODROID U2 vendor provides a git repository with all what is needed to build and install U-boot on the SD-card that will be used to boot the device.

# mkdir ~/odroid_u2
# cd ~/odroid_u2
# git clone https://github.com/hardkernel/u-boot.git
# cd u-boot
# make smdk4412_config
# make ARCH=arm CROSS_COMPILE=armv7a-hardfloat-linux-gnueabi-


If U-boot does not build with your ARM toolchain, see the troubleshooting section. It may happen that U-boot does not build with a recent toolchain.


Now, the following will install U-boot on the beginning sectors of your SD card.

# cd sd_fuse
# ./sd_fusing.sh /dev/sdX



[edit] Partitionning

The bootloader takes a bit more space than usual. You must keep about 5 MB (10240 sectors for example) of free space before the first partition.



You may now partition your SD card to fit your needs. However, U-boot expects to find a FAT32 boot partition (first or second). Also, U-boot needs free space before the first partition.


Partition Table for /dev/sdX

               First       Last
 # Type       Sector      Sector   Offset    Length   Filesystem Type (ID) Flag
-- ------- ----------- ----------- ------ ----------- -------------------- ----
   Pri/Log           0       10239*     0#      10240*Free Space           None
 1 Primary       10240*     215039*     0      204800*W95 FAT32 (0B)       None
 2 Primary      215040*    2214599*     0     1999560*Linux swap / So (82) None
 3 Primary     2214600*   15269887*     0    13055288*Linux (83)           None


Now, format your partitions, e.g.

# mkfs.vfat /dev/sdX1
# mkswap /dev/sdX2
# mkfs.ext4 /dev/sdX3


[edit] Funtoo Linux Installation

Follow the guide from Funtoo Linux Installation on ARM to begin the installation of Funtoo on the root filesystem. Note that once you are finished, you will not be able to boot the ODROID U2 until you complete the next sections.


[edit] Kernel and modules

The ODROID U2 vendor provides kernel sources and default .config files for the ODROID U2. In this example, we clone the git repository, use the default branch, and build the default ubuntu kernel config. Note that other branches exist, some of them provide default configurations for the U2, others not.

As in Funtoo Linux Installation on ARM, we consider that the root partition is mounted in /mnt/SD_root. Also, we consider that the boot partition is /dev/sdX1.


# cd ~/odroid_u2
# git clone https://github.com/hardkernel/linux.git
# cd linux
# ARCH=arm make odroidu2_ubuntu_defconfig
# ARCH=arm CROSS_COMPILE=/usr/bin/armv7a-hardfloat-linux-gnueabi- make -j8 (adapt depending on the number of cores available on the build machine)
# mount /dev/sdX1 /mnt/SD_root/boot
# ARCH=arm CROSS_COMPILE=/usr/bin/armv7a-hardfloat-linux-gnueabi- make modules_install INSTALL_MOD_PATH=/mnt/SD_root
# cp arch/arm/boot/zImage /mnt/SD_root/boot

[edit] Boot partition setup

You now have a kernel in /mnt/SD_root/boot. The only missing part is a file named boot.scr, which will be read by U-boot.

First, create a boot.txt file on the boot partition.

# cd /mnt/SD_root/boot
# touch boot.txt

Modify this file to contain the following :

setenv initrd_high "0xffffffff"
setenv fdt_high "0xffffffff"
setenv fb_x_res "1920"
setenv fb_y_res "1080"
setenv hdmi_phy_res "1080"
setenv bootcmd "fatload mmc 0:1 0x40008000 zImage; bootm 0x40008000"
setenv bootargs "console=tty1 console=ttySAC1,115200n8 fb_x_res=${fb_x_res} fb_y_res=${fb_y_res} hdmi_phy_res=${hdmi_phy_res} root=/dev/mmcblk0p3 rootwait ro mem=2047M"
boot

Modify the screen resolution to fit your needs. Also, modify /dev/mmcblk0p3 for the correct device of your root partition. /dev/mmcblk0p3 is the third partition of the SD-card. Modify the last digit to fit your partitioning scheme.



Now, install u-boot-tools that provides mkimage and create boot.scr.


# emerge u-boot-tools
# mkimage -A arm -T script -C none -n "Boot.scr for odroid-u2" -d boot.txt boot.scr


[edit] Further configuration

[edit] fstab

/dev/mmcblk0p1		/boot		vfat		noauto,noatime	1 2
/dev/mmcblk0p2		none		swap		sw		0 0
/dev/mmcblk0p3		/		ext4		noatime		0 0


Note: We disable fsck checking of some devices as it may fail because of the missing hardware clock on the device.

[edit] inittab

If you have USB/UART debugging hardware, you may want to change /etc/inittab the following way :

# SERIAL CONSOLESs0:12345:respawn:/sbin/agetty 115200 ttySAC1 vt100


[edit] Troubleshooting

[edit] Error: selected processor does not support ARM mode `smc 0'

--- board/samsung/smdk4212/smc.c.orig	2013-04-30 17:34:16.556093458 -0400
+++ board/samsung/smdk4212/smc.c	2013-04-30 17:34:50.422095103 -0400
@@ -90,6 +90,7 @@
 	register u32 reg3 __asm__("r3") = arg3;

  	__asm__ volatile (
+		".arch_extension sec\n"
 		"smc	0\n"
 		: "+r"(reg0), "+r"(reg1), "+r"(reg2), "+r"(reg3) 

@@ -104,6 +105,7 @@
 	register u32 reg1 __asm__("r1") = 0;
  	__asm__ volatile (
+		".arch_extension sec\n" 		"smc	0\n"
 		: "+r"(reg0), "+r"(reg1)

Source :http://forum.insignal.co.kr/viewtopic.php?f=10&t=118

[edit] armv7a-hardfloat-linux-gnueabi-ld: error: /usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.7.2/libgcc.a(bpabi.o) uses VFP register arguments, u-boot does not

--- arch/arm/cpu/armv7/config.mk.orig	2013-04-30 17:40:20.842111160 -0400
+++ arch/arm/cpu/armv7/config.mk	2013-04-30 17:40:52.368112692 -0400
@@ -20,7 +20,7 @@ 
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 # MA 02111-1307 USA
 #
-PLATFORM_RELFLAGS += -fno-common -ffixed-r8 -msoft-float
+PLATFORM_RELFLAGS += -fno-common -ffixed-r8 -mfloat-abi=hard -mfpu=vfpv3  

 # Make ARMv5 to allow more compilers to work, even though its v7a.
 PLATFORM_CPPFLAGS += -march=armv7-a

Source : https://code.google.com/p/chromium/issues/detail?id=213120

Personal tools
Namespaces

Variants
Actions
Categories
Toolbox
Stuff