adding blinker02 example, uses lower part of the freerunning system level timer

This commit is contained in:
David Welch
2012-05-26 02:12:00 -04:00
parent 0c59440d2d
commit d00dab24f8
5 changed files with 126 additions and 0 deletions

30
blinker02/Makefile Normal file
View File

@@ -0,0 +1,30 @@
ARMGNU ?= arm-none-eabi
COPS = -Wall -O2 -nostdlib -nostartfiles -ffreestanding
all : kernel.img
clean :
rm -f *.o
rm -f *.bin
rm -f *.elf
rm -f *.list
rm -f *.img
novectors.o : novectors.s
$(ARMGNU)-as novectors.s -o novectors.o
blinker02.o : blinker02.c
$(ARMGNU)-gcc $(COPS) -c blinker02.c -o blinker02.o
kernel.img : memmap novectors.o blinker02.o
$(ARMGNU)-ld novectors.o blinker02.o -T memmap -o blinker02.elf
$(ARMGNU)-objdump -D blinker02.elf > blinker02.list
$(ARMGNU)-objcopy blinker02.elf -O binary kernel.img

15
blinker02/README Normal file
View File

@@ -0,0 +1,15 @@
See the top level README for information on where to find the
schematic and programmers reference manual for the ARM processor
on the raspberry pi.
Based on some web searches the gpio is based at address 0x20200000 not
0x7E200000 as shown in the documentation. I have to go figure that out.
There is a free-running 64 bit timer, super easy to use, just read it.
Based on a couple of experiments, without messing with anything it
appears that the timer is runing at about a megahertz, 1 million ticks
per second. I am guessing it is divided down from the 700MHz somewhere,
will dig deeper.

46
blinker02/blinker02.c Normal file
View File

@@ -0,0 +1,46 @@
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
extern void PUT32 ( unsigned int, unsigned int );
extern unsigned int GET32 ( unsigned int );
extern void dummy ( unsigned int );
#define SYSTIMERCLO 0x20003004
#define GPFSEL1 0x20200004
#define GPSET0 0x2020001C
#define GPCLR0 0x20200028
//-------------------------------------------------------------------------
int notmain ( void )
{
unsigned int ra;
ra=GET32(GPFSEL1);
ra&=~(7<<18);
ra|=1<<18;
PUT32(GPFSEL1,ra);
while(1)
{
PUT32(GPSET0,1<<16);
while(1)
{
ra=GET32(SYSTIMERCLO);
//0x01000000 17 seconds
if((ra&=0x01000000)==0x01000000) break;
//0x00400000 4 seconds
if((ra&=0x00400000)==0x01000000) break;
}
PUT32(GPCLR0,1<<16);
while(1)
{
ra=GET32(SYSTIMERCLO);
//if((ra&=0x01000000)==0x00000000) break;
if((ra&=0x00400000)==0x00000000) break;
}
}
return(0);
}
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------

12
blinker02/memmap Normal file
View File

@@ -0,0 +1,12 @@
MEMORY
{
ram : ORIGIN = 0x00000000, LENGTH = 0x1000
}
SECTIONS
{
.text : { *(.text*) } > ram
.bss : { *(.bss*) } > ram
}

23
blinker02/novectors.s Normal file
View File

@@ -0,0 +1,23 @@
.globl _start
_start:
b reset
reset:
mov sp,#0x1000
bl notmain
hang: b hang
.globl PUT32
PUT32:
str r1,[r0]
bx lr
.globl GET32
GET32:
ldr r0,[r0]
bx lr
.globl dummy
dummy:
bx lr