diff --git a/blinker02/Makefile b/blinker02/Makefile new file mode 100644 index 0000000..756ef73 --- /dev/null +++ b/blinker02/Makefile @@ -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 + + + + + + diff --git a/blinker02/README b/blinker02/README new file mode 100644 index 0000000..fa81e17 --- /dev/null +++ b/blinker02/README @@ -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. + diff --git a/blinker02/blinker02.c b/blinker02/blinker02.c new file mode 100644 index 0000000..dd10896 --- /dev/null +++ b/blinker02/blinker02.c @@ -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); +} +//------------------------------------------------------------------------- +//------------------------------------------------------------------------- diff --git a/blinker02/memmap b/blinker02/memmap new file mode 100644 index 0000000..8d9566d --- /dev/null +++ b/blinker02/memmap @@ -0,0 +1,12 @@ + +MEMORY +{ + ram : ORIGIN = 0x00000000, LENGTH = 0x1000 +} + +SECTIONS +{ + .text : { *(.text*) } > ram + .bss : { *(.bss*) } > ram +} + diff --git a/blinker02/novectors.s b/blinker02/novectors.s new file mode 100644 index 0000000..ac90378 --- /dev/null +++ b/blinker02/novectors.s @@ -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