[RaspPi] Build Raspberry Pi Kernel 3.10 / NEXT for Debian Wheezy / Raspbian with eGalax Touchscreen Support on Ubuntu 12.04

This is about building the latest Kernel / 3.10 for RPi. Bleeding Edge.
# Preperations
sudo apt-get install git libncurses5 libncurses5-dev qt4-dev-tools qt4-qmake pkg-config build-essential gcc-arm-linux-gnueabi bc
# NEEDS BC!!!!

# Clone Stuff
mkdir rpi_kernel_10
cd rpi_kernel_10
git clone https://github.com/raspberrypi/tools.git
git clone https://github.com/raspberrypi/linux.git
cd ~/rpi_kernel_10/linux/.git
git branch -a
cd ~/rpi_kernel_10/linux
git checkout -t -b rpi-3.10.y remotes/origin/rpi-3.10.y
git pull
cd ~/rpi_kernel_10
git clone https://github.com/raspberrypi/firmware.git
cd ~/rpi_kernel_10/firmware/.git
git branch -a
cd ~/rpi_kernel_10/firmware
git checkout -t -b next remotes/origin/next
git pull
cd ~/rpi_kernel_10

# Make Kernel
cd linux
make mrproper
mkdir ../kernel
# Kernel Types
# find . -name *bcmrpi*config -print
# ./arch/arm/configs/bcmrpi_emergency_defconfig
# ./arch/arm/configs/bcmrpi_defconfig
# ./arch/arm/configs/bcmrpi_cutdown_defconfig
make O=../kernel/ ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- bcmrpi_defconfig
make O=../kernel/ ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- menuconfig #xconfig
#Device Drivers->Input Device Support->TouchScreens->USB Touchscreen Driver (Build it into or as module, check if eGalax here!)
make O=../kernel/ ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k -j3
cd ../
cd tools/mkimage
./imagetool-uncompressed.py ../../kernel/arch/arm/boot/Image
cd ../../

# Make Modules
cd kernel
mkdir ../modules/
make modules_install ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- INSTALL_MOD_PATH=../modules/
# Install Kernel on existing RPi SD Card / Raspbian
# mount sdcard in your Ubuntu (I made an folder sdb1 for boot partiton and sdb2 for the root partition)
cd ~
mkdir sdb1 sdb2
mount /dev/sdb1 sdb1
mount /dev/sdb2 sdb2

# boot partition
#replace /sdb1/boot/bootcode.bin with rpi_kernel_10/firmware/boot/bootcode.bin
sudo rm ~/sdb1/bootcode.bin
cp ~/rpi_kernel_10/firmware/boot/bootcode.bin ~/sdb1/
#replace /sdb1/boot/kernel.img with the previously created kernel image
sudo rm ~/sdb1/kernel.img
cp ~/rpi_kernel_10/tools/mkimage/kernel.img ~/sdb1/
#replace /sdb1/boot/start.elf with rpi_kernel_10/firmware/boot/start.elf
sudo rm ~/sdb1/start.elf
cp ~/rpi_kernel_10/firmware/boot/start.elf ~/sdb1/

# root partition
#replace /sdb2/lib/firmware with <modules_builded_above_folder>/lib/firmware
sudo rm -rf ~/sdb2/lib/firmware/
sudo cp -a ~/rpi_kernel_10/modules/lib/firmware/ ~/sdb2/lib/
#replace /sdb2/lib/modules with <modules_builded_above_folder>/lib/modules
sudo rm -rf ~/sdb2/lib/modules/
sudo cp -a ~/rpi_kernel_10/modules/lib/modules/ ~/sdb2/lib/
#replace /sdb2/opt/vc with firmware-next/hardfp/opt/vc/
sudo rm -rf ~/sdb2/opt/vc
sudo cp -a ~/rpi_kernel_10/firmware/hardfp/opt/vc/ ~/sdb2/opt/

# sync usb mount
sync

# Unmount sdcard
cd ~
umount sdb1
umount sdb2
# Boot Pi and calibrate Touchscreen
# This stuff happens on the Pi!
# Preperations
sudo apt-get install libx11-dev libxext-dev libxi-dev x11proto-input-dev

# Install Tool / xinput_calibrator
cd ~
wget http://github.com/downloads/tias/xinput_calibrator/xinput_calibrator-0.7.5.tar.gz
tar -xvzf xinput_calibrator-0.7.5.tar.gz
cd xinput_calibrator-0.7.5
./configure
make
sudo make install

# Calibrate (in Xserver, so open Terminal while beeing in Graphical User Mode)
xinput_calibrator

It will give output like this:
Calibrating EVDEV driver for "eGalax Inc. USB TouchController" id=8
current calibration values (from XInput): min_x=1938, max_x=114 and min_y=1745, max_y=341

Doing dynamic recalibration:
Setting new calibration data: 121, 1917, 317, 1741
--> Making the calibration permanent <--
copy the snippet below into '/etc/X11/xorg.conf.d/99-calibration.conf'
Section "InputClass"
Identifier "calibration"
MatchProduct "eGalax Inc. USB TouchController"
Option "Calibration" "121 1917 317 1741"
Option "SwapAxes" "1"
EndSection

Use the Output after "--> Making the calibration permanent <--
copy the snippet below into '/etc/X11/xorg.conf.d/99-calibration.conf'"
And copy the part after that into following file:

sudo mkdir /etc/X11/xorg.conf.d
sudo vi /etc/X11/xorg.conf.d/01-input.conf

After that, save, exit and reboot.
That should conclude your newly "Custom baked Kernel" and your EGalax Touchscreen Support.

Thanks a lot to http://engineering-diy.blogspot.de/2013/01/adding-7inch-display-with-touchscreen.html

Raspberry Pi Kernel Compile


and http://karuppuswamy.com/wordpress/2013/01/17/how-to-get-evtouch-touch-screen-kit-working-in-linux/
from which I learnt and borrowed most of the stuff and tips and rewrote this How To with minor changes
Upgrade
cd linux
make mrproper
git pull
cd ../tools
git pull
cd ../firmware
git pull

[RaspPi] How To Compile OpenWRT Trunk with latest Raspberry Pi Kernel 3.6 for the RPi on Ubuntu 12.04

What are we doing here?

As far as I understand the problem, there are two worlds:
Raspberry Pi Foundation on the one hand, the OpenWRT Team on the other one.
OpenWRT does try to patch "Default Kernels" until they work out with the intended Plattform, which does work in most cases very well.
The problem is, RPi is an new target for the latest OpenWRT Release - and does work - but it does not get much love of the devs:
No trunk compiles or nightlys of the Image or the packages - i.e.
And - the "so patched Kernel" does not represent the state of the art of the RPi Kernel Development at all:
I got many errors of the "first days of Pi", like the loved "SDcard error" which corrupted the whole filesystem and such.

User arsiskk of the raspberrypi-openwrt project had the same problem.
The rpi-openwrt project tried to deliever the first OpenWRT Experience to the RPi Users - competing with OpenWRT - and succeeded.
But the problem somehow remained: The old kernel was lingering there and the Team seemed to have given up the project after RPi
became an official target (https://code.google.com/p/raspberrypi-openwrt/).
So arsiskk developed a procedure to compile the raspberrypi-openwrt Code with the latest RPi Kernel - which worked awesome.
But as the project seems to be quite dead now - I tried to convert his idea and use it on the offical OpenWRT Trunk Sourcetree.
And that worked.

So long story short, what are we doing here?
We grab the trunk OpenWRT official source code, load the offical RPi Kernel into it, delete a bunch of files
which would only be needed to supply an standard kernel with a bit of RPi support and compile it.
In the end we will have the latest OpenWRT trunk with the latest RPi Kernel.
The only problem: You would sometimes need to rebuild packages which do not work with the official, but old (3.6.11, compared to OpenWRTs 3.10.4) Kernel.
And - you can't update the OpenWRT trunk that easily.
It is basically an "build and throw away" system.
But it works!
# Dependencies needed
sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip

# Prepare Enviroment (Trunk)
cd ~
mkdir rpi_openwrt
cd rpi_openwrt
git clone git://git.openwrt.org/openwrt.git
cd openwrt
mkdir dl
# Install Packages
./scripts/feeds update -a
./scripts/feeds install -a

# Check Enviroment
make defconfig
make prereq

# Download Kernel and Prepare:
cd /tmp
wget https://github.com/raspberrypi/linux/archive/rpi-3.6.y.tar.gz
tar xfvz rpi-3.6.y.tar.gz
mv linux-rpi-3.6.y linux-3.6.11
tar cvf - linux-3.6.11/ | lzma > linux-3.6.11.tar.xz
mv linux-3.6.11.tar.xz ~/rpi_openwrt/openwrt/dl/

# Prepare Target
cd ~/rpi_openwrt/openwrt/target/linux/brcm2708/
vi Makefile
change LINUX_VERSION to LINUX_VERSION:=3.6.11
mkdir patches-3.6
cp config-3.10 config-3.6
cd ../generic/
cd patches-3.6
#if not exists, dl latest official openwrt, copy files from openwrt/target/linux/generic/patches-3.6 to here
# Normally it should be ok to just remove some of the patches like this:
rm *-mips*
rm *-phy*
rm a*
rm 880-gateworks_system_controller.patch
#But in case there are still errors on the make target/linux/{clean,prepare} V=99 Stage,
#remove all files except these, keep these files: (openwrt specific patches)
200-fix_localversion.patch 621-sched_act_connmark.patch
201-extra_optimization.patch 630-packet_socket_type.patch
202-reduce_module_size.patch 640-bridge_no_eap_forward.patch
210-darwin_scripts_include.patch 641-bridge_always_accept_eap.patch
211-stddef_include.patch 642-bridge_port_isolate.patch
212-byteshift_portability.patch 643-bridge_remove_ipv6_dependency.patch
220-module_exports.patch 644-bridge_optimize_netfilter_hooks.patch
230-openwrt_lzma_options.patch 650-pppoe_header_pad.patch
250-netfilter_depends.patch 651-wireless_mesh_header.patch
251-sound_kconfig.patch 652-atm_header_changes.patch
252-mv_cesa_depends.patch 653-disable_netlink_trim.patch
253-ssb_b43_default_on.patch 655-increase_skb_pad.patch
254-textsearch_kconfig_hacks.patch 900-slab_maxsize.patch
255-lib80211_kconfig_hacks.patch 910-kobject_uevent.patch
256-crypto_add_kconfig_prompts.patch 911-kobject_add_broadcast_uevent.patch
257-wireless_ext_kconfig_hack.patch 920-unable_to_open_console.patch
258-netfilter_netlink_kconfig_hack.patch 921-use_preinit_as_init.patch
260-move_bcm963xx_tag.patch 930-crashlog.patch
600-netfilter_layer7_2.22.patch 940-ocf_kbuild_integration.patch
601-netfilter_layer7_pktmatch.patch 941-ocf_20120127.patch
602-netfilter_layer7_match.patch 950-vm_exports.patch
603-netfilter_layer7_2.6.36_fix.patch 960-decompress_unlzo_fix.patch
604-netfilter_cisco_794x_iphone.patch 970-remove-unsane-filenames-from-deps_initramfs-list.patch
610-netfilter_match_bypass_default_checks.patch 980-arm_openwrt_machtypes.patch
611-netfilter_match_bypass_default_table.patch 992-mpcore_wdt_fix_watchdog_counter_loading.patch
612-netfilter_match_reduce_memory_access.patch 993-mpcore_wdt_fix_wdioc_setoptions_handling.patch
613-netfilter_optional_tcp_window_check.patch 994-mpcore_wdt_fix_timer_mode_setup.patch
620-sched_esfq.patch

#Make
cd ~/rpi_openwrt/openwrt/
make menuconfig # Choose BCM2708 Chipset, Raspberry Pi Board, Exit and Save
make target/linux/{clean,prepare} V=99 # does extract kernel and patch it
make kernel_oldconfig # builds some tools
make kernel_menuconfig # configures kernel
make menuconfig # to change RPi Patterns, i.e.:
# Packages rep:
# Image configuration -> Version configuration options -> Release Repo to:
# http://downloads.openwrt.org/attitude_adjustment/12.09/%T/generic/packages
# Main Partition Size from 48 to 64:
# Target Options -> Root File System Size, change from 48 to 64 MB or more
# Exit and Save
make V=99 -j 3

Files are in ~/rpi_openwrt/openwrt/bin/brcm2708
( i.e. openwrt-brcm2708-sdcard-vfat-ext4.img )
New build:
make kernel_menuconfig
make menuconfig
make V=99 -j 3

Inspiration and Help:
http://wiki.openwrt.org/doc/howto/build
https://code.google.com/p/raspberrypi-openwrt/issues/detail?id=11

[RaspPi] Build Raspberry Pi Kernel for Debian Wheezy / Raspbian with eGalax Touchscreen Support on Ubuntu 12.04

# Preperations
sudo apt-get install git libncurses5 libncurses5-dev qt4-dev-tools qt4-qmake pkg-config build-essential gcc-arm-linux-gnueabi bc

# Clone Stuff
mkdir rpi_kernel
cd rpi_kernel
git clone https://github.com/raspberrypi/tools.git
git clone https://github.com/raspberrypi/linux.git
git clone https://github.com/raspberrypi/firmware.git
cd ~/rpi_kernel/firmware/.git
git branch -a
cd ~/rpi_kernel/firmware
git checkout -t -b next remotes/origin/next
git pull
cd ~/rpi_kernel

# Make Kernel
cd linux
make mrproper
mkdir ../kernel
# Kernel Types
# find . -name *bcmrpi*config -print
# ./arch/arm/configs/bcmrpi_emergency_defconfig
# ./arch/arm/configs/bcmrpi_defconfig
# ./arch/arm/configs/bcmrpi_cutdown_defconfig
make O=../kernel/ ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- bcmrpi_defconfig
make O=../kernel/ ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- menuconfig #xconfig
#Device Drivers->Input Device Support->TouchScreens->USB Touchscreen Driver (Build it into or as module, check if eGalax here!)
make O=../kernel/ ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k -j3
cd ../
cd tools/mkimage
./imagetool-uncompressed.py ../../kernel/arch/arm/boot/Image
cd ../../

# Make Modules
cd kernel
mkdir ../modules/
make modules_install ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- INSTALL_MOD_PATH=../modules/
# Install Kernel on existing RPi SD Card / Raspbian
# mount sdcard in your Ubuntu (I made an folder sdb1 for boot partiton and sdb2 for the root partition)
cd ~
mkdir sdb1 sdb2
mount /dev/sdb1 sdb1
mount /dev/sdb2 sdb2

# backup config
cp ~/sdb1/config.txt ~/rpi_kernel/
# boot partition
sudo rm -rf ~/sdb1/*
# Copy all Files from boot
cp -R ~/rpi_kernel/firmware/boot/* ~/sdb1/
#replace /sdb1/boot/kernel.img with the previously created kernel image
sudo rm ~/sdb1/kernel.img
cp ~/rpi_kernel/tools/mkimage/kernel.img ~/sdb1/
# restore config
cp ~/rpi_kernel/config.txt ~/sdb1/

# root partition
#replace /sdb2/lib/firmware with <modules_builded_above_folder>/lib/firmware
sudo rm -rf ~/sdb2/lib/firmware/
sudo cp -R ~/rpi_kernel/modules/lib/firmware/ ~/sdb2/lib/
#replace /sdb2/lib/modules with <modules_builded_above_folder>/lib/modules
sudo rm -rf ~/sdb2/lib/modules/
sudo cp -R ~/rpi_kernel/modules/lib/modules/ ~/sdb2/lib/
#replace /sdb2/opt/vc with firmware-next/hardfp/opt/vc/
sudo rm -rf ~/sdb2/opt/vc
sudo cp -R ~/rpi_kernel/firmware/hardfp/opt/vc/ ~/sdb2/opt/

# sync usb mount
sync

# Unmount sdcard
cd ~
umount sdb1
umount sdb2
# Boot Pi and calibrate Touchscreen
# This stuff happens on the Pi!
# Preperations
sudo apt-get install libx11-dev libxext-dev libxi-dev x11proto-input-dev

# Install Tool / xinput_calibrator
cd ~
wget http://github.com/downloads/tias/xinput_calibrator/xinput_calibrator-0.7.5.tar.gz
tar -xvzf xinput_calibrator-0.7.5.tar.gz
cd xinput_calibrator-0.7.5
./configure
make
sudo make install

# Calibrate (in Xserver, so open Terminal while beeing in Graphical User Mode)
xinput_calibrator

It will give output like this:
Calibrating EVDEV driver for "eGalax Inc. USB TouchController" id=8
current calibration values (from XInput): min_x=1938, max_x=114 and min_y=1745, max_y=341

Doing dynamic recalibration:
Setting new calibration data: 121, 1917, 317, 1741
--> Making the calibration permanent <--
copy the snippet below into '/etc/X11/xorg.conf.d/99-calibration.conf'
Section "InputClass"
Identifier "calibration"
MatchProduct "eGalax Inc. USB TouchController"
Option "Calibration" "121 1917 317 1741"
Option "SwapAxes" "1"
EndSection

Use the Output after "--> Making the calibration permanent <--
copy the snippet below into '/etc/X11/xorg.conf.d/99-calibration.conf'"
And copy the part after that into following file:

sudo mkdir /etc/X11/xorg.conf.d
sudo vi /etc/X11/xorg.conf.d/01-input.conf

After that, save, exit and reboot.
That should conclude your newly "Custom baked Kernel" and your EGalax Touchscreen Support.

Thanks a lot to http://engineering-diy.blogspot.de/2013/01/adding-7inch-display-with-touchscreen.html

Raspberry Pi Kernel Compile


and http://karuppuswamy.com/wordpress/2013/01/17/how-to-get-evtouch-touch-screen-kit-working-in-linux/
from which I learnt and borrowed most of the stuff and tips and rewrote this How To with minor changes
Upgrade
cd linux
make mrproper
git pull
cd ../tools
git pull
cd ../firmware
git pull
# then make and build like shown above

Check hard/softfp version of OS
${CCPREFIX}gcc -v 2>&1 | grep hard

[RaspPi] Supercomputing with RaspPi / MPI

Prof. Simon Cox has written an awesome tutorial about turning multiple RaspPis into an "Supercomputer Cluster". He himself build an cluster of 64 RaspPis at the University of Southampton. I could not resist but rebuild his project - with the 3 "old" (256MB) Pis I got. It turned out to be an quite awesome and interessting experience, introducing myself to MPI (Message Passing Interface)  for the first time. You should definitly take a look yourself.

http://www.southampton.ac.uk/~sjc/raspberrypi/

MPI Cluster

OpenWRT

OpenWRT is one of my most "beloved" operating systems ever. I am using it since 2006, already. It is very small (>= 4 MB), light weight and therefore an excellent choice for embedded computing or very small appliances. I have used it on several occasions ("prototype") in my blog, but never actually gave a heads up in terms of "What is it?" - So, let’s get rid of that:

OpenWRT is a debian linux derivate especially made for routers. OpenWRT does derive from the famous Linksys WRT series, which were based on Linux. One of the founders found out about that and got Linksys (by pointing out about the caveats of the used Linux GPL License) to the point of releasing the source code (except the wifi drivers). From the point on, OpenWRT was founded and the project began to write an own "router linux". On the course of that adventure, several forks of OpenWRT were founded (i.e. FreeWRT) - but in the end, OpenWRT remained "THE" third hand firmware for your router. Nowadays OpenWRT does support a load of routers out of the box, with famous titles like the Linksys WRT Series or even hardware like the Seagate Dockstar (which was an sort of NAS Appliance for Seagate Hard drives).

But the project did not stop on providing an firmware: With ipkg and later opkg, they also did offer packages to configure your own router experience. By using an simple build system, nearly everyone is able to configure his personal firmware and setup the things he likes. While in the beginning, only router related stuff (like wifi tools or pppoe dialers and such) was available, also big programs like recent mysql, web or file servers are found in the packet manager.

Using this little, flexible OS in cooperation with the GPIO ports of an router, software defined Inputs and Outputs, you can use your router to switch on lights, close your garage door or sound an alarm as soon as some sensors tell your router to do so. Especially with the appearance of the Raspberry Pi and its GPIOs, fast CPU, big RAM and storage, this could be the OS of your choice.

So the next time you think about throwing away your old router, check www.openwrt.org and see whether you can make it do some cool stuff.

You will be surprised.

Raspberry Pi Con "Pi and More"

At the 23. of August 2012, the University of Trier held the first Raspberry Pi Convention in Germany. It was a little, but awesome gig with about 30 IT Students and other interested people.

The main idea was to rise the awareness for the new microcomputer, called "Raspberry Pi" which combines an 700 MHz ARM Processor, 512 MB of RAM, Full HDMI Output, Audio, Ethernet and USB into an very small and affordable package (about 35 US Dollar). With this microcomputer, and its General Purpose Input and Outputs (GPIO), pupils can actually have a "hands-on" (in) physical computing. That means: Connecting software (i.e. Python, Perl, C programs) with the real world. For example: Controlling LEDs, driving motors or even react on buttons, attached to the GPIO port. Combining these possibilities into a small and affordable package started a big hype about this little computer, long before it was even available to the public.

But now, about half a year after the release, multiple versions and even more Operating Systems started to appear. Even a special modified Debian version, called Raspbian is ready to download. There are special versions of Arch Linux, Fedora, XBMC (a Multimedia Entertainment Center) and even a special version of OpenWRT is under development. During this meeting, the participants had the opportunity to listen to speaks (an Intro to the RaspPi, a Speech about Cross compiling and the I2C Bus System) and workshops (driving an LED, building the so called "Ladder Game", getting a Nokia 3310 LCD Display to work as Output). The overall response was great as well as the conference itself and I would wish to have additional meetings in the future.

On this occasion I also want to thank the organization of the PiAndMore, especially the Fachschaft of the University of Trier and Daniel Fett. You made an awesome job. Please keep it up.

Additional pictures and infos can be found on my JCTixx Project Twitter Account @JCTixx

Official Stuff: Facebook Event (https://www.facebook.com/events/330497597037314/), Twitter Account (@PiAndMore), Google Site (https://sites.google.com/site/piandmore/)