linux porting
DESCRIPTION
linux porting to a new arm-based platformTRANSCRIPT
Linux Portingfor new ARM platform
Champ Yenhttp://[email protected]
OutLine
GNU Toolchain
Linux Kernel Prerequisites and Assumptions
Images
Boot Sequence
Kernel Configuration & Compilation
Kernel Porting
Device Drivers
Boot Options
initramfs vs initrd
References
GNU Toolchains
CodeSourcery gnu toolchainhttp://www.codesourcery.com/sgpp/lite/arm/download.html
Buildroothttp://buildroot.uclibc.org/
Scratchboxhttp://www.scratchbox.org/
OpenEmbeddedhttp://wiki.openembedded.net/index.php/Main_Page
Ptxdisthttp://www.pengutronix.de/software/ptxdist/index_en.html
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
Linux Kernel Prerequisites and 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)
Images and intermediate files
vmlinuz(ELF object)
kernel proper
objcopyimage(binary object)
stripped image binary kernel
gzip piggy.gz
compressedbinary kernel
asm
piggy.o
misc.o
head.o
bootablekernel image
(zImage)
Boot Sequence
arch/arm/boot/compressed/
head.S
bootstrap loader(uncompress)
start
arch/arm/kernel/head.S
start
ARM-specifickernel code
init/main.c
start_kernel
kernel code
detail boot sequence is listed in [9]
Kernel Porting – Kernel Memory Map
CPU vector page/copy_user_page(),clear_user_page()
DMA memory mapping
free for platform use
vmalloc()/ioremap() space
kernel direct-mapped RAM region
kernel module space
user space mapping
CPU vector page/null pointer trap0x0000_0000
0xFF00_0000
TASK_SIZE
PAGE_OFFSET
VMALLOC_START
VMALLOC_END
0x0000_1000
0xFFFF_0000
0xFFFF_FFFF
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
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 folderarch/arm/mach-fxx
arch/arm/mach-fxx/include/mach
Modify or Create Kconfig & Makefilearch/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)
Kernel Porting – new machine itemsregister 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 itemscreate machine folders
arm/arch/mach-fxx
for machine dependent source code arm/arm/mach-fxx/include/mach
for machine dependent headers/assembly
debug-macro.S: adduart, senduart, busyuart, waituartdma.hentry-macro.S: macro get_irqnr_and_basehardware.hio.hirqs.h: NR_IRQSmemory.h: PHYS_OFFSET
system.h: arch_idle(), arch_reset()timex.h: CLOCK_TICK_RATEuncompress.h: putc()vmalloc.h: VMALLOC_END
Kernel Porting – new machine itemsmodify or create Kconfig & Makefile
arch/arm/Kconfigconfig 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
Kernel Porting – new machine itemsmodify or create Kconfig & Makefile
arch/arm/mach-fxx/Kconfigmenu "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 :=
# Specific board support
obj-$(CONFIG_MACH_FOO) += core.o
arch/arm/mach-fxx/Makefile.bootzreladdr-y := 0x01008000
architecture depend code
machine depend code
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
Kernel Porting – Initialization code
I/O Memory Mapping Table IRQ Timer
struct sys_timer
Initial order: .map_io .initrq .timer .init_machine
Kernel Porting – I/O Memory Map
static struct map_desc foo_io_desc[] __initdata =
{
{
/* address after mapping */
.virtual = IO_ADDRESS(CPU_DEV_PHY_BASE),
/* page index of physical address */
.pfn = __phys_to_pfn(CPU_DEV_PHY_BASE),
.length = CPU_DEV_IO_LEN, /* address mapping range */
.type = MT_DEVICE /* I/O type */
},
……
};
….
static void __init foo_map_io(void)
{
iotable_init(foo_io_desc, ARRAY_SIZE(foo_io_desc));
}
Kernel Porting – IRQ
arch/arm/mach-fxx/include/mach/entry-macro.Sget_irqnr_and_base: after calling irqnr: irq number, not equal condition should be set.
arch/arm/mach-fxx/include/mach/irqs.hNR_IRQS (number of irq types) should be defined
struct irq_chip, irqactionset_irq_chip(), set_irq_flags(), set_irq_handler(), setup_irq()
static struct irq_chip foo_irq_chip = { .ack = foo_int_ack, .mask = foo_int_mask, .unmask = foo_int_unmask,};
………for(i = o; i < NR_IRQS; i++){
set_irq_handler(i, handle_level_irq);set_irq_chip(i, &foo_irq_chip);set_irq_flags(i, IRQF_VALID);
}………
Kernel Porting - Timer
struct sys_timer foo_timer = {
.init = foo_timer_init,
.offset = foo_gettimeoffset,
};
Kernel Porting – DMA memory (optional)
Influence to dma_alloc_coherent() usage In arch/arm/mach-fxx/include/mach/dma.h
MAX_DMA_ADDRESS In arch/arm/mach-fxx/include/mach/memory.h
CONSISTENT_DMA_SIZE ISA_DMA_THRESHOLD
Boot Options – static string
Boot options -> Default kernel command stringex: mem=8M@0x01000000 initrd=0x01180000,145762
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
……
ATAG_CORE
ATAG_NONE
struct tag_header { __u32 size; __u32 tag;};
struct tag { struct tag_header hdr; union { struct tag_core core; struct tag_mem32 mem;
… } u;};
Device Drivers
platform_device_register(), platform_driver_register()for some on-chip devices(ex: clock/power control)
UART subsystem in driver/serialfor startup message, console ,and shell
Framebuffer subsystem in driver/video
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.
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
initramfs
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
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
Q & A