Hello world on qemu Raspberry Pi

##1.Install Raspberry Pi qemu

git clone -b rpi https://github.com/Torlus/qemu/ qemu_rpi
cd qemu_rpi
./configure --prefix=/usr/local/qemu_rpi --target-list=arm-softmmu,arm-linux-user,armeb-linux-user --enable-sdl
make & sudo make install

2.Sample Helloworld

boot.asm

#
#
#   reference:
#   david leels <davidontech@gmail.com>
#   http://stackoverflow.com/questions/6870712/beagleboard-bare-metal-programming
#

#UART3 THR_REG register address
.equ UART3_THR_REG, 0x20201000

.arm

_start:
    ldr r0,=UART3_THR_REG
    adr	r1,.L0
	bl helloworld
.L1:
	b	.L1

.align 2
.L0:
	.ascii	"helloworld\n\0"

helloworld.c -r0, r0 for argv0 , r1 for argv1

/*
helloworld.c:
Copyright (C) 2009  david leels <davidontech@gmail.com>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see http://www.gnu.org/licenses/.
*/


// this will call by bl helloworld, *addr is r0 , *p is r1
int helloworld(unsigned int *addr,const char *p){
	while(*p){
		*addr=*p++;
	};
	return 0;
}

linker.ld linkscript, linker text section to 0x80000000.

/*
* reference:
* http://stackoverflow.com/questions/6870712/beagleboard-bare-metal-programming
*/

/* rammap */
MEMORY
{
    ram : ORIGIN = 0x80000000, LENGTH = 0x10000
}

SECTIONS
{
    .text : { *(.text*) } > ram
}

Makefile

ARMGNU = arm-none-eabi

AOPS = --warn --fatal-warnings
COPS = -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding

boot.bin: boot.asm
	$(ARMGNU)-gcc -O2 -c helloworld.c
	$(ARMGNU)-as boot.asm -o boot.o
	$(ARMGNU)-ld -T linker.ld boot.o helloworld.o -o boot.elf
	$(ARMGNU)-objcopy boot.elf -O binary boot.bin

clean:
	rm *.elf *.o *.bin -f

run on Qemu

/usr/local/qemu_rpi/bin/qemu-system-arm -kernel boot.bin -cpu arm1176 -m 256 -M raspi -serial stdio

run on Raspberry Pi B+ board

1.download offical boot firmware,https://github.com/raspberrypi/firmware/tree/master/boot

copy start.elf, bootcode.bin to SD card。

2.copy boot.bin to SD card replace kernel.img,using UART port check result,console shows Helloworld.

appendix

##Refence

http://wiki.osdev.org/Raspberry_Pi_Bare_Bones https://lbd.hackpad.com/ep/pad/static/dUGFyJw9Hva


书籍推荐