Files
raspberrypi/pitopi/README
root 3db8815010 adding pitopi (pi to pi) a way to use two raspberry pi boards,
one as the Linux based development plaform and the other to run
the bare metal programs taking advantage of the uarts on the boards.
2012-09-26 01:45:51 -04:00

295 lines
11 KiB
Plaintext

What is a pit opi? It is actually pi to pi as in a Raspberry Pi running
Linux used as a host and a second Raspberry Pi used as a bare metal
platform. I will call one the Linux pi and the other the bare metal pi.
If you look at the top level README there is talk of buying a $15 or
so usb to serial (usb to uart) and some wires for connecting your host
pc to your bare metal pi for bare metal development, using the
bootloader, etc. Well that puts you into a problem of where do I get
the tools, I need a toolchain and I need a terminal program with xmodem
(to use one of my bootloaders) as well as the usb to uart thing. Well
for a little more you can get another Raspberry Pi if you dont already
have a second one. You can get Linux up and running on that Linux pi
and it has a working arm gnu toolchain compiler as part of the distro.
With a little more work (mostly just downloading a few things) and
three wires (still need the wires)(maybe two, depends on your comfort
level) you gain a development environment where the tools are trivial
to come by, and a dumb terminal program with xmodem.
I am doing this from memory, so hopefully I cover all the steps
I downloaded Raspian wheezy
http://www.raspberrypi.org/downloads
And put it on an sd card
http://elinux.org/RPi_Easy_SD_Card_Setup
Plugged in a monitor, keyboard, mouse, and network and the powered
that Linux pi from a computer. You want to power both Raspberry Pis
from the same power source for example a powered usb hub or the same
computer. In theory this way you dont put a large delta between
the ground planes on the two boards which could fry something. The
odds of this are quite low, but if you happened to get lucky and
cross phases, that is about like taking bare wires from wall power and
touching those wires on metal parts around the board, some smoke will
be released from something. So the Linux pi boots, I get this text
menu thing that asks things like do you want ssh enabled do you want
to push the filesystem to fill the sd card, stuff like that. After this
first bring up I actually dont use the keyboard, mouse, and monitor on
the Linux pi I used ssh and/or vnc, personal preference, not going to
explain the steps, I assume you are using the Linux pi as a computer
with keyboard, mouse and monitor.
The Linux pi reboots with these settings and I am in I have a Linux
based computer.
Next I made sure I had a few tools:
apt-get install build-essential
apt-get install minicom lrzsz
You have to be a programmer to be doing or learning bare metal
programming so I dont need to tell you about text editors you have
one or ones you like and know how to use it or them.
Now the uart on the Linux pi is by default enabled to be used as the
console, it spits out messages on boot, and provides a login prompt.
Well I want to use it as a generic uart/serial port and not have it
used for that purpose so looking at this page
http://elinux.org/RPi_Serial_Connection
I backed up inittab
cd /etc
sudo cp inittab inittab.orig
Now edit inittab (using sudo if you are not logged in as root)
comment out the T0:23... line they mention which has the ttyAMA0 thing
in it, and save
backup cmdline.txt
cd /boot
sudo cp cmdline.txt cmdline.orig
Now edit cmdline.orig I think there were two places where ttyAMA0 were
called out. DONT KILL THE WHOLE LINE, just remove the two chunks
of non-whitespace that include AMA0.
save.
Now reboot
sudo reboot
As mentioned
cat /proc/cmdline
and make sure there is no reference to AMA0
and then
ps aux | grep ttyAMA0
You should only see the ps command in the output and no other commands
Once you have reached this point. Glance at the top level README for
this repo. The corner of the board with two rows of pins, about 26 or
so pins total. The outer corner pin is pin 2 starting at that pin and
counting toward the rca and audio plugs it goes by 2s, 2,4,6,8,10.
pin 6 is ground
pin 8 is TX
pin 10 is RX
For now take one of your wires and connect pin 8 to pin 10 on the Linux
pi (we are doing a test, we will connect between the boards later this
is connecting two pins on the same board).
Open a command line/terminal on the Linux pi
We need to setup minicom one time before we use it (must use sudo or
run as root)
sudo minicom -s
Now the user interface to minicom is a bit dated and likely very strange
in this point and click or touch screen world.
Using the arrow keys down arrow to Serial port setup and hit enter.
Along the left side is A B C D E F G, press the A key (does not have
to be capital just press a one time) the cursor moves to the end
of the A line, the Serial Device. Edit that line using backspace or
delete and you want it to have
/dev/ttyAMA0
Then press enter one time
Now press F one time, Hardware Flow Control should change from Yes to NO
Now press enter one time, this takes you back to the top menu
Down arrow to Modem and Dialing and press enter one time
Press A one time
Press space and I think that will erase the line and put a space then
backspace to have nothing on that line (faster than a bunch of backspaces
or deletes to erase the line)
Press enter one time
Press K one time
same deal we want to delete that line, then press enter one time
Press enter one more time to go to the top level menu
(you can re-enter these submenus as needed to make these changes and can
make these changes in any order)
Down arrow twice to Save setup as dfl (default).
And then down arrow and select Exit from Minicom. For whatever reason
to disable hardware flow control you have to exit minicom then come
back for it to actually work. At least on x86 based pcs that is the case.
So minicom is now ready to use, if all of the above went well you wont
need to do that again. With a jumper wire connecting pin 8 to pin 10
run minicom (without any options)
sudo minicom
Whatever you type you should be able to see on the terminal. If this
doesnt work you cannot continue. What is going in is the character
is going out the uart (TX) and through the wire then that is looped
back into the input (RX) and we can see it. A return here is simply
a carriage return without a line feed so when you hit enter it only
goes to the beginning of the same line, it does not advance a line
like you are used to. Unplug one end of the wire and the echoing of
characters should no longer work. Replace the wire and it should work
again. I repeat if this doesnt work for you you cannot continue...
Now very carefully not to short other parts of the boards together, you
might want to power off the Linux pi safely and have both of them turned
off. Depends on your comfort level. Connect pin 6 on one board to
pin 6 on the other board. Connect pin 8 on one board to pin 10 on the
other and vice versa so both boards have their pin 8 connected to pin 10
on the other board.
Get my bootloader (bootloader05 for example) and follow the instructions
there or in the top level README for putting the files you need including
that kernel.img file on A SECOND SD CARD, NOT ON THE LINUX PI SD CARD,
THIS GOES ON THE BARE METAL PI SD CARD. You need two sd cards to go
with two Raspberry Pis.
Power on the Linux pi, let it come up completely, open a terminal
then run minicom. A trick to save yourself time is to run minicom
wherever you have the .bin files you want to load to the bare metal pi
this way you dont have to navigate through the directory structure using
a confusing and painful text based thing in minicom. The other
alternative is to run minicom in some simple place like your home
directory then when you build a .bin file to try, copy it to your home
directory (putting the .bin file in the same place as minicom was launched)
sudo minicom
Now power on the bare metal pi. Sometimes I have to try more than once
to get it to come up. DexOS has a config.txt solution for this I simply
just try again.
Once you see some characters then see it every so many seconds send
something that looks kind of like garbage, you are ready to download
a program.
Grab blinker01 or something simple like that. Edit the makefile
and replace $(ARMGNU)- with nothing
Such that lines like these:
blinker01.elf : memmap vectors.o blinker01.o
$(ARMGNU)-ld vectors.o blinker01.o -T memmap -o blinker01.elf
$(ARMGNU)-objdump -D blinker01.elf > blinker01.list
Change to this:
blinker01.elf : memmap vectors.o blinker01.o
ld vectors.o blinker01.o -T memmap -o blinker01.elf
objdump -D blinker01.elf > blinker01.list
Save the makefile and run make from a Linux pi command line.
If you are actually on an arm based Linux (which the linux pi is) it should
build just fine. If you try this on your x86 it should fail the asm code
in particular will fail to assemble, game over.
So now you have a .bin file to try, as mentioned above you want it
wherever you launched minicom to save yourself some trouble. I am
going to assume the filename in question is hello.bin
Back to the minicom window, it should be getting those weird characters
once every so many seconds.
Press Ctrl-A then press S
this should pop up one of those minicom menus with a few upload choices,
down arrow twice to xmodem and hit enter one time
Now you have the file selection window of pain. If you took my advice
the just hit enter one time It should pop up another thing that says
No file selected - enter filename:
Now type in
hello.bin
and press enter one time
it should then do the download to the bare metal pi, and the
program should load and run on the bare metal pi.
When you want to run another program, pull the usb cable for the
bare metal pi (LEAVE THE LINUX PI POWERED). and plug it back in, I find
the fat plug on the computer side is easier to pull and replug than
the micro-b connector on the rasberry pi itself, YMMV.
Note that once you have typed in the filename one time in minicom,
so long as you dont exit minicom it will be there the next time you
run, if you use the same filename for a while the download key sequence
becomes
ctrl-a
s
down arrow
down arrow
enter
enter
enter
Modify your program
compile
copy to whever
mouse over to minicom
power cycle the bare metal pi
do the key sequence
repeat
To exit minicom:
Ctrl-A then Q and press enter to select the default of exiting without
reset.
If your bare metal pi program spits out stuff (the uart## examples)
and the text goes off the right side of the minicom window then
use Ctrl-a then w to swich to wrap mode, and the text will wrap so you
can see all of it.
Minicom may be clunky but like vi it is available for so many Linux/unix
platforms that you can rely on it as a tool in your toolbox, you may
not like it but it is always there. Like hyperterm used to be for
Windows, but geez, they screwed that up didnt they? Like minicom
hyperterm was not the best tool, but for a good many years/versions it
was always there.