cleaned up Makefiles and READMEs

This commit is contained in:
David Welch
2012-05-28 00:05:12 -04:00
parent b04a3344d6
commit caf3559ac9
13 changed files with 151 additions and 115 deletions

78
README
View File

@@ -22,6 +22,12 @@ And the schematic for the board
http://www.raspberrypi.org/wp-content/uploads/2012/04/Raspberry-Pi-Schematics-R1.0.pdf
(might be an old link, find the one on the wiki page)
The manual uses addresses like 0x7Exxxxxx, which is the real address for
something. But there is an address translation layer between the ARM
physical address and the real address. All of this code will use the
ARM physical address which is 0x20xxxxxx. The rest of the address is
the same so if the manual says 0x7E123456, then from the ARM use 0x20123456
I dont normally use .data nor gcc libraries nor C libraries so you can
build most if not all of my examples using a gcc cross compilerl. Basically
it doesnt matter if you use arm-none-linux-gnueabi or arm-none-eabi.
@@ -31,6 +37,74 @@ easy to use but you can use it. Building your own toolchain from gnu
sources (binutils and gcc) is fairly straight forward and at some point
will create a script to do that for you.
As far as we know so far the Raspberry Pi is not "brickable". Normally
what brickable means is the processor relies on a boot flash. For example
there may be a bootloader that allows you to re-program the flash. If you
make a mistake writing code at this low level and load the boot flash
with that bad code you may not be able to reload the flash again. There
are many ways to prevent this, but there are also still boards that
can be bricked or at least require more equipment or soldering, etc to
recover them. They way this board works is quite interesting. There
is a GPU on chip that boots from an on chip flash (in that respect it
may be brickable, but we dont have access to that GPU boot loader). The
GPU on chip bootloader looks for an sd card, the sd card contains more
GPU code. That code probably initializes sdram, and then copies the
contents of kernel.img on the sd card to sdram. Then releases reset
on the ARM. Each of these example programs produce a .bin file.
kernel.img is nothing more than a .bin file, an image of the flash.
The filename is special to the raspi bootloder, so you need to use
that file name. Backup your original kernel.img if you want to go back
to playing with linux then copy the .bin file in the example to
kernel.img on the sd card. For example
cp blinker01.bin /media/9876-5432/kernel.img
sync
umount /media/9876-5432
Insert the sd card into the raspi and power.
It wont take you very long to figure out this is going to get painful.
1) power off raspi
2) remove sd card
3) insert sd card in reader
4) plug reader into computer
5) mount/wait
6) copy binary file to kernel.img
7) sync/wait
8) unmount
9) insert sd card in raspi
10) power raspi
11) repeat
There are ways to avoid this, one is jtag, which is not as expensive
as it used to be. It used to be in the thousands of dollars, now it
is under $50 and the software tools are free. Now the raspi does have
jtag on the arm, getting the jtag connected to that is going to require
some soldering. I have not done it yet but will and will post info.
Unfortunately the connection to jtag is not there on power up you have
to run some code on the arm, so when that happens I will post that
program.
Another method is a bootloader, typically you connect a serial port.
The program that actually boots on the processor has some way for you
to get into a bootloader. Sometimes that is all that is there, sometimes
you have to hit a key within a few seconds after it starts to boot.
The bootloader will have some way for you to use either the serial
or ethernet to copy a file into memory or flash. In this case probably
memory. I have a bootloader that works. Am working on a second one
that will probably be easier/better to use. With the bootloader method
at least how I am implementing it for the raspi, you perform the sd
card dance above one time to copy the bootloader to the sd card. You
use some flavor of serial port as described below. When the board
boots you can load your programs over the serial connection, never
needing to do the sd card dance until you want to leave your application
on the raspi and not the bootloader. The bootloader step will be
something like:
1) power off raspi
2) power on raspi
3) type command to load and start new program
My first bootloader is working, this will greatly save on wear and tear
on the sd card socket. You will need some sort of serial adapter.
The uart signals on the raspi are not at RS232 levels, you CANNOT
@@ -58,5 +132,5 @@ going to work on a terminal based bootloder with xmodem, instead of the
proprietary solution in bootloader01.
I recommend you start with blinker01 and follow the discovery through
those to uart01, etc. Now that I have the bootloader working I have
to go back through these and generate a .hex file as well as a .img file.
those to uart01, etc. If you dont have a bootloader, do the sd card
dance with the .bin file. If you have a bootloader use the .hex file.

View File

@@ -3,11 +3,12 @@ ARMGNU ?= arm-none-eabi
COPS = -Wall -O2 -nostdlib -nostartfiles -ffreestanding
all : kernel.img
all : blinker01.hex blinker01.bin
clean :
rm -f *.o
rm -f *.bin
rm -f *.hex
rm -f *.elf
rm -f *.list
rm -f *.img
@@ -18,10 +19,15 @@ novectors.o : novectors.s
blinker01.o : blinker01.c
$(ARMGNU)-gcc $(COPS) -c blinker01.c -o blinker01.o
kernel.img : memmap novectors.o blinker01.o
blinker01.elf : memmap novectors.o blinker01.o
$(ARMGNU)-ld novectors.o blinker01.o -T memmap -o blinker01.elf
$(ARMGNU)-objdump -D blinker01.elf > blinker01.list
$(ARMGNU)-objcopy blinker01.elf -O binary kernel.img
blinker01.bin : blinker01.elf
$(ARMGNU)-objcopy blinker01.elf -O binary blinker01.bin
blinker01.hex : blinker01.elf
$(ARMGNU)-objcopy blinker01.elf -O ihex blinker01.hex

View File

@@ -1,45 +1,18 @@
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.
Apparently what they have done is have the thing boot using the gpu
in the part, dont bother, leave it be, they are not going to let us
program it, not for a while at least. There is I assume a gpu bootloader
programmed in the chip, an OTP ROM based on something I read. This
searches for the sd card, and I assume loads another gpu bootloader
from that, at some point, the arm memory is loaded from kernel.img
on the sd card, then the ARM is released from reset.
This simple example, sets up a small stack, not much to this program, and
I have not read up on how much memory is actually in this space. It
then enables gpio16 as an output. Then goes into a loop that sets
the gpio, waits, resets it, waits, repeat. gpio16 is shown on the
schematic to connect to the OK led. One of the bank of leds on the
corner near the audio out and host usb ports. The blink rate
for me is a few blinks a second perhaps. Future examples will get
use a timer if there is one and narrow in on the clock setup, etc.
Copy the kernel.img file to the sd card, overwriting whatever you had
there. You may wish to backup the one you had there before you started
playing at this level.
The beauty of this boot design is that it is not (easily) brickable,
so far as we know. With ignorance being bliss I will say it is not
brickable. Second we have no flash on the card we always run out of
ram as far as we are concerned. Making the board cheaper among other
things. The negative side to this is the development process is very
painful. It goes back to the GBA or NDS days, actually it was more
painful then. Here you unplug the rpi, pull the sd card out, put
the sd card in an sd card reader, plug the sd card reader into the
computer, wait or mount, copy kernel.img to the sd card, wait or sync,
unmount the sd card, remove the sd card reader, remove the sd card
place in rpi, plug in rpi. And repeat with each new build. I hope
to get the uart figured out and a bootloader so that I/we only have
to do that once, and from there on power off, power on, load the
program over serial. Not to dissimilar to the arduino experience.
on the raspberry pi. Also find information on how to load and run
these programs.
This simple example sets up a small stack, not much to this program
so the stack doesnt need much room. It then enables gpio16 as
an output. Then goes into a loop that sets the gpio, waits, resets it,
waits, repeat. gpio16 is shown on the schematic to connect to the OK
led. One of the bank of leds on the corner near the audio out and host
usb ports. The blink rate for me is a few blinks a second perhaps.
Future examples will get use a timer if there is one and narrow in on
the clock setup, etc.
novectors.s is the entry point for this code. This just gets things
started then calls a C function (blinker01.c) where the bulk of the
program is found.

View File

@@ -3,11 +3,12 @@ ARMGNU ?= arm-none-eabi
COPS = -Wall -O2 -nostdlib -nostartfiles -ffreestanding
all : kernel.img
all : blinker02.hex blinker02.bin
clean :
rm -f *.o
rm -f *.bin
rm -f *.hex
rm -f *.elf
rm -f *.list
rm -f *.img
@@ -18,13 +19,13 @@ novectors.o : novectors.s
blinker02.o : blinker02.c
$(ARMGNU)-gcc $(COPS) -c blinker02.c -o blinker02.o
kernel.img : memmap novectors.o blinker02.o
blinker02.elf : 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
blinker02.bin : blinker02.elf
$(ARMGNU)-objcopy blinker02.elf -O binary blinker02.bin
blinker02.hex : blinker02.elf
$(ARMGNU)-objcopy blinker02.elf -O ihex blinker02.hex

View File

@@ -1,17 +1,14 @@
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.
on the raspberry pi. Also find information on how to load and run
these programs.
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.
per second.
Hmm, there are comments in the manual about the system clock coming up
at 250MHz. I wonder if this system timer is 250MHz/256 = 0.976MHz.

View File

@@ -3,11 +3,12 @@ ARMGNU ?= arm-none-eabi
COPS = -Wall -O2 -nostdlib -nostartfiles -ffreestanding
all : kernel.img
all : blinker03.hex blinker03.bin
clean :
rm -f *.o
rm -f *.bin
rm -f *.hex
rm -f *.elf
rm -f *.list
rm -f *.img
@@ -18,13 +19,13 @@ novectors.o : novectors.s
blinker03.o : blinker03.c
$(ARMGNU)-gcc $(COPS) -c blinker03.c -o blinker03.o
kernel.img : memmap novectors.o blinker03.o
blinker03.elf : memmap novectors.o blinker03.o
$(ARMGNU)-ld novectors.o blinker03.o -T memmap -o blinker03.elf
$(ARMGNU)-objdump -D blinker03.elf > blinker03.list
$(ARMGNU)-objcopy blinker03.elf -O binary kernel.img
blinker03.bin : blinker03.elf
$(ARMGNU)-objcopy blinker03.elf -O binary blinker03.bin
blinker03.hex : blinker03.elf
$(ARMGNU)-objcopy blinker03.elf -O ihex blinker03.hex

View File

@@ -1,7 +1,8 @@
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.
on the raspberry pi. Also find information on how to load and run
these programs.
This example uses the free running ARM timer, not the 64 bit system
one as in blinker02 but the so called ARM timer.

View File

@@ -3,11 +3,12 @@ ARMGNU ?= arm-none-eabi
COPS = -Wall -O2 -nostdlib -nostartfiles -ffreestanding
all : kernel.img
all : uart01.hex uart01.bin
clean :
rm -f *.o
rm -f *.bin
rm -f *.hex
rm -f *.elf
rm -f *.list
rm -f *.img
@@ -18,12 +19,15 @@ novectors.o : novectors.s
uart01.o : uart01.c
$(ARMGNU)-gcc $(COPS) -c uart01.c -o uart01.o
kernel.img : memmap novectors.o uart01.o
uart01.elf : memmap novectors.o uart01.o
$(ARMGNU)-ld novectors.o uart01.o -T memmap -o uart01.elf
$(ARMGNU)-objdump -D uart01.elf > uart01.list
$(ARMGNU)-objcopy uart01.elf -O binary kernel.img
uart01.bin : uart01.elf
$(ARMGNU)-objcopy uart01.elf -O binary uart01.bin
uart01.hex : uart01.elf
$(ARMGNU)-objcopy uart01.elf -O ihex uart01.hex

View File

@@ -1,7 +1,8 @@
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.
on the raspberry pi. Also find information on how to load and run
these programs.
Okay this was incredibly painful. I might have saved a few hours if
was at the office with an oscilloscope, I eventually had to fashion
@@ -15,11 +16,8 @@ do not do anything, they might on real 16550's but not here. Well
that is wrong. If bits 1:0 are 00 you get 7 bits if bits 1:0 are 01
you get 7 bits. You need bit 1 set to get 8 bits.
This example uses the mini uart, uart1, to transmit characters on
GPIO14. You will need a level shifter or something that can receive
3.3v. One like this http://www.sparkfun.com/products/718 works perfectly.
Connect ground to pin 6 of P1 and rx on the FTDI board to tx on the
raspi which is pin 8 on the P1 connector.
See the top level README for information about connecting your host
computer to the uart on the raspi.
This example sets up the uart for 115200 baud, and blasts the characters
0123456701234567...forever as fast as it can.

View File

@@ -3,11 +3,12 @@ ARMGNU ?= arm-none-eabi
COPS = -Wall -O2 -nostdlib -nostartfiles -ffreestanding
all : kernel.img
all : uart02.hex uart02.bin
clean :
rm -f *.o
rm -f *.bin
rm -f *.hex
rm -f *.elf
rm -f *.list
rm -f *.img
@@ -18,13 +19,13 @@ novectors.o : novectors.s
uart02.o : uart02.c
$(ARMGNU)-gcc $(COPS) -c uart02.c -o uart02.o
kernel.img : memmap novectors.o uart02.o
uart02.elf : memmap novectors.o uart02.o
$(ARMGNU)-ld novectors.o uart02.o -T memmap -o uart02.elf
$(ARMGNU)-objdump -D uart02.elf > uart02.list
$(ARMGNU)-objcopy uart02.elf -O binary kernel.img
uart02.bin : uart02.elf
$(ARMGNU)-objcopy uart02.elf -O binary uart02.bin
uart02.hex : uart02.elf
$(ARMGNU)-objcopy uart02.elf -O ihex uart02.hex

View File

@@ -1,20 +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.
on the raspberry pi. Also find information on how to load and run
these programs.
Based on uart01, this one enables the uart rxd1 receiver (gpio15).
It starts by printing 12345678 then whatever you type on the terminal
is echoed back.
You will need something like this
http://www.sparkfun.com/products/718
to connect to the uart pins on the raspi. Do not connect the raspberry
pi pins directly to a com port on a computer you will fry the board.
The above board happens to have pins in the same order as the raspberry
pi. On connector P1 on the raspberry pi connect pin 6 to ground on the
usb to serial board. Pin 8 on P1 to RX on the usb to serial board, and
pin 10 on P1 to TX on the usb to serial board.
See the top level README file for information on how to connect the
raspi uart to your host computer.
Using a dumb terminal (minicom) 115200 board No parity 8 bits 1 stop
bit, no flow control (might have to exit minicom and start again for

View File

@@ -3,7 +3,7 @@ ARMGNU ?= arm-none-eabi
COPS = -mthumb -Wall -O2 -nostdlib -nostartfiles -ffreestanding
all : uart03.hex
all : uart03.hex uart03.bin
clean :
rm -f *.o
@@ -19,14 +19,14 @@ novectors.o : novectors.s
uart03.o : uart03.c
$(ARMGNU)-gcc $(COPS) -c uart03.c -o uart03.o
uart03.hex : memmap novectors.o uart03.o
uart03.elf : memmap novectors.o uart03.o
$(ARMGNU)-ld novectors.o uart03.o -T memmap -o uart03.elf
$(ARMGNU)-objdump -D uart03.elf > uart03.list
uart03.bin : uart03.elf
$(ARMGNU)-objcopy uart03.elf -O binary uart03.bin
uart03.hex : uart03.elf
$(ARMGNU)-objcopy uart03.elf -O ihex uart03.hex

View File

@@ -1,7 +1,8 @@
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.
on the raspberry pi. Also find information on how to load and run
these programs.
Based on uart02, the difference is that this is primarily thumb code
instead of ARM. ARM in this case meaning the traditional 32 bit
@@ -10,21 +11,5 @@ subset. Thumb2 has confused/blurred those definitions though.
(thumb2 is a mostly 32 bit extension to the thumb instruction set using
formerly undefined instructions to create variable word length instructions).
You have two choices you can use my bootloader with the uart03.hex file
or copy the uart02.bin file to (overwrite the) kernel.img on your raspi
sd card. (might want to back up that file if you want to go back to
running linux with it later, or download a replacement from the net).
You will need something like this
http://www.sparkfun.com/products/718
to connect to the uart pins on the raspi. Do not connect the raspberry
pi pins directly to a com port on a computer you will fry the board.
The above board happens to have pins in the same order as the raspberry
pi. On connector P1 on the raspberry pi connect pin 6 to ground on the
usb to serial board. Pin 8 on P1 to RX on the usb to serial board, and
pin 10 on P1 to TX on the usb to serial board.
Using a dumb terminal (minicom) 115200 board No parity 8 bits 1 stop
bit, no flow control (might have to exit minicom and start again for
the flow control setting to take). What you type on the dumb terminal
echos back.
See the top level README for information on how to connect the raspi
uart to your host computer.