This document provides an overview of porting Linux to a new ARM platform. It discusses setting up the GNU toolchain, kernel prerequisites and configuration, creating machine-specific files and code, initializing drivers and boot options. Key steps include registering the new machine, adding architecture-specific code and configuration files, initializing I/O mapping and IRQs, and creating an initramfs image to test bootability. References for further information on ARM Linux boot sequences and porting are also provided.
Linux Porting
for newARM platform
Champ Yen
http://champyen.blogspot.com
champ.yen@gmail.com
2.
OutLine
GNU Toolchain
Linux KernelPrerequisites and Assumptions
Images
Boot Sequence
Kernel Configuration & Compilation
Kernel Porting
Device Drivers
Boot Options
initramfs vs initrd
References
3.
GNU Toolchains
CodeSourcery gnu toolchain
http://www.codesourcery.com/sgpp/lite/arm/download.html
Buildroot
http://buildroot.uclibc.org/
Scratchbox
http://www.scratchbox.org/
OpenEmbedded
http://wiki.openembedded.net/index.php/Main_Page
Ptxdist
http://www.pengutronix.de/software/ptxdist/index_en.html
4.
GNU Toolchains -buildroot
linux kernel like configuration interface
ncurse UI, .config file
uClibc generate linux 2.6 compatible small footprint
applications
for most platform remember to enable software float
output: toolchain/uClibc/busybox/rootfs
5.
Linux Kernel Prerequisitesand Assumptions
DRAM is initialized
Hardware-related initialization tasks are done
MMU/Cache is disabled
specific values should be saved in registers
r1: Machine ID, r2: pointer of ATAG list (optional)
Kernel Porting –Kernel Memory Map
0xFFFF_FFFF
CPU vector page/copy_user_page(),clear_user_page()
0xFFFF_0000
DMA memory mapping
0xFF00_0000
free for platform use
VMALLOC_END
vmalloc()/ioremap() space
VMALLOC_START
kernel direct-mapped RAM region
PAGE_OFFSET
kernel module space
TASK_SIZE
user space mapping
0x0000_1000
CPU vector page/null pointer trap
0x0000_0000
9.
Kernel Porting –Directories
mm/
memory-handling related code
boot/
bootstrap loader code
kernel/
ARM architecture dependent code
mach-XXXXXX/
specific machine dependent code
configs/
each machine’s default kernel configurations
10.
Kernel Porting –new machine items
refer to other machine to create or modify items(ex: foo, fxx)
register the new machine
arch/arm/tools/mach-types
Create machine folder
arch/arm/mach-fxx
arch/arm/mach-fxx/include/mach
Modify or Create Kconfig & Makefile
arch/arm/Kconfig (usually add config ARCH_FXX for architecture)
arch/arm/Makefile
arch/arm/mm/Kconfig
arch/arm/mach-fxx/Kconfig (config MACH_FOO for machine)
arch/arm/mach-fxx/Makefile
arch/arm/mach-fxx/Makefile.boot (set zreladdr-y for image location)
11.
Kernel Porting –new machine items
register the new machine
Add an entry in arch/arm/tools/mach-types
ex: foo MACH_FOO FOO 65535
For official registration, should register here, also.
http://www.arm.linux.org.uk/developer/machines/
Kernel Porting –new machine items
modify or create Kconfig & Makefile
arch/arm/Kconfig
config ARCH_FXX
bool “FXX family processors“
help
This enables support for systems based on the fxx processors.
………
source "arch/arm/mach-fxx/Kconfig"
arch/arm/Makefile
machine-$(CONFIG_ARCH_FXX) := fxx
arch/arm/mm/Kconfig (ex: ARM926-based)
config CPU_ARM926T
bool "Support ARM926T processor"
depends on ARCH_INTEGRATOR || ARCH_VERSATILE_PB ||
… || ARCH_FXX
default y if ARCH_VERSATILE_PB || ARCH_VERSATILE_AB ||
… || ARCH_FXX
14.
Kernel Porting –new machine items
modify or create Kconfig & Makefile
arch/arm/mach-fxx/Kconfig
menu "FXX platform type“
depends on ARCH_FXX
config MACH_FOO
bool "Support FOO platform"
default y
help
Include support for the FOO platform.
endmenu
arch/arm/mach-fxx/Makefile
# Common support (must be linked before board specific support)
obj-y := architecture depend code
# Specific board support
obj-$(CONFIG_MACH_FOO) += core.o machine depend code
arch/arm/mach-fxx/Makefile.boot
zreladdr-y := 0x01008000
15.
Kernel Porting –description structure
MACHINE_START(FOO, "FOO processor")
/* Maintainer: Champ Yen */
.map_io = foo_map_io,
.init_irq = foo_init_irq,
.init_machine = foo_init,
.timer = &foo_timer,
/* for ATAG list is optional */
.boot_params = 0x01000100,
MACHINE_END
Boot Options –ATAG lists
ATAG provides dynamic boot option passing
There are two way to pass pointer of ATAG lists
r2 value passed by bootloader, .boot_params in machine descriptor
refer to arch/arm/include/asm/setup.h
struct tag_header {
__u32 size; ATAG_CORE
__u32 tag;
};
……
struct tag {
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
…
} u; ATAG_NONE
};
23.
Device Drivers
platform_device_register(), platform_driver_register()
for some on-chip devices(ex: clock/power control)
UART subsystem in driver/serial
for startup message, console ,and shell
Framebuffer subsystem in driver/video
24.
initramfs vs initrd
initrd initramfs
image ext2 image + gzip cpio + gzip
implementation block device tmpfs
first execution /linuxrc /init
mount rootfs pivot_root switch_root
initrd requires ext2 and block devices support. It adds 150KB+
to kernel size.
25.
initramfs
create an initramfs image by command:
find . | cpio -o -H newc | gzip > ../initramfs.cpio.gz
take care of the distance between image and kernel,
otherwise image will be overwritten by kernel.
/init
ex:
#!/bin/busybox sh
#/bin/busybox --install
mount -t proc proc /proc
exec /bin/busybox sh
26.
Debug
decompression: putc() definiition in include/mach/uncompress.h
kernel debugging features in kernel hacking of kernel options (and
CONFIG_DEBUG_LL option for low level debugging)
early debug: printascii/printhex(2,4,8) make use of uart macros in
include/mach/debug-macro.S
printk()
CONNFIG_KGDB
27.
References
Embedded Linux Primer, Christopher Hallinan, Prentice Hall
Building Embedded Linux Systems 2/e, Karim Yaghmour, Oreilly
linux-2.6.2x-xx/Documentation/arm
http://heaven.branda.to/~thinker/GinGin_CGI.py/get_afile/166/porting_to_arm.pdf
http://www.glomationinc.com/PortingLinuxKernel.pdf
http://www.ens-lyon.fr/LIP/Pub/Rapports/RR/RR2006/RR2006-08.pdf
http://glt08.linuxtage.at/slides/glt08-kvas_linuxonarm.pdf
http://www.linux-arm.org/LinuxKernel/LinuxNewPlatformPort
http://gicl.cs.drexel.edu/people/sevy/linux/ARM_Linux_boot_sequence.html
http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html
http://www.ibm.com/developerworks/linux/library/l-initrd.html
http://blog.linux.org.tw/~jserv/archives/001954.html