README
=========================
2003-12-28 Josef Wolf (jw@raven.inka.de)
2008-06-27 Matthew Riek (matthew.riek@ibiscomputer.com.au)
Flashlib is invoked using bdmctrl. See the *.test script files in
bdm/m68k/utils as examples on how to bootstrap a board and invoke flashlib
for flashing. See also bdm/m68k/utils/README.bdmctrl
Overview
=========================
Following is a rough overview of the flashlib architecture:
filter:
The filter is the main interface to the application. The application
don't really need to know about the flash driver details. Filter's
write_memory() function is the flashing aequivalent of the memcpy()
function. write_memory can write to flash or ram, depending on
the memory region of the write.
driver:
A driver is the implementation of a specific flashing algorithm.
examples are flash29, flashcfm and flashintelc3. If the algorithm
or chip definition for your flash is not supported, you will need
to either add a chip to the chip tables (flash29 and flashintelc3)
or you will have to write a new driver.
chip description:
The chip description describes details of a flash chip. What
information needs to be stored in the description is up to
the driver. Most drivers will probably want to store at least
chip-type and bus-interface. Some flash drivers (such as flashcfm)
don't need a chip description table. Instead, you can configure
the required bits such as flash register offsets using flash_set_var.
flash region:
A flash region describes specific flash chips (depending on the
bus interface). The most important information herein is the
base-address, the length, the driver and the chip description.
plugin:
A driver that can be downloaded and executed on the target.
Note that you don't _need_ plugins. You can use host only mode,
which is very slow, plugins just make flashing much much faster.
A plugin is simply compiling just the driver '.c' file for your
target. For example, If you have a 29 series flash chip on your
board, you would compile flash29.c using your cross compiler
toolchain. Only a few header files are needed (the associated
header file flash29.h, flash_filter.h and stdint.h. note that
when you compile the drivers as a plugin, you must define
HOST_FLASHING as 0. (-DHOST_FLASHING=0 for gcc). You need to
compile with -mpcrel such that the code is relocatable. I have
compiled all current drivers successfully using a m68k-elf gnu
toolchain (version 4.3.0), and with the m68k-rtems4.9 toolchain.
m68k-elf-gcc -DHOST_FLASHING=0 -O2 -Wall -fomit-frame-pointer \
-mpcrel -m<CPU> -Wcast-align -Wstrict-prototypes \
-Wmissing-prototypes -c -o <driver>.plugin <driver>.c
where <driver> is one of flashcfm, flash29 or flashintelc3.
and <CPU> is your 68k arch, such as 5200, 5307, 528x etc.
There is a script provided which compiles the plugins which
takes 2 args, your compiler and your target. eg:
>./compile_plugins m68k-elf-gcc 5200
or
>./compile_plugins m68k-rtems4.9-gcc 5200
you will need to copy the plugins to the working folder you
invoke the bdmctrl scripts from.
host-only mode:
All operations are piped through the BDM interface. This is
extremely slow but very useful for bootstrapping/debugging.
Spend the time to compile plugins for your target
host-assisted mode:
Host downloads plugin. The actual flashing operation is executed
by the plugin. This is the preferred operation mode for flashing
under host-control.
target-only mode:
This mode is for operation without a host. compile filter and
drivers for the target with HOST_FLASHING = 0. This could be used
for boot loaders etc. This option has not been completed, there
are a few FIXME's noted in the flash_filter.c where bit's for
target-only mode remain unimplemented. uses of malloc, free,
strdup may need to be provided with hooks in this mode.
How to write a new driver
=========================
Best is to start with a copy of flash29.[ch]. You should rename the
init_flash29() function and add the new function to the algorithm[] array
in flash_filter.c. Next is to give a new value to the driver_magic string.
This name should be unique because it is used to identify the driver
that belongs to a loaded plugin. Change the download_struct() function to
download the chip description structure of the new driver properly to the
target. Make sure byte orderings and alignment is not messed up while
downloading.