1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-01-18 12:52:44 +01:00

Merge branch 'boards' into origin_master

Conflicts:
	.gitignore
This commit is contained in:
Oleg Hahm 2013-11-06 10:19:47 -08:00
commit 26b36bf65b
179 changed files with 15644 additions and 0 deletions

454
boards/LICENSE Normal file
View File

@ -0,0 +1,454 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS

5
boards/Makefile Normal file
View File

@ -0,0 +1,5 @@
all:
"$(MAKE)" -C $(BOARD)
clean:
"$(MAKE)" -C $(BOARD) clean

30
boards/Makefile.base Normal file
View File

@ -0,0 +1,30 @@
ifeq ($(BOARD),msba2)
INCLUDES += -I$(RIOTBOARD)/msba2/include/
INCLUDES += -I$(RIOTBOARD)/msba2-common/include/
INCLUDES += -I$(RIOTBOARD)/msba2-common/drivers/include/
endif
ifeq ($(BOARD),msb-430)
INCLUDES += -I$(RIOTBOARD)/msb-430/include/
INCLUDES += -I$(RIOTBOARD)/msb-430-common/include/
INCLUDES += -I$(RIOTBOARD)/msb-430-common/drivers/include/
endif
ifeq ($(BOARD),msb-430h)
INCLUDES += -I$(RIOTBOARD)/msb-430h/include/
INCLUDES += -I$(RIOTBOARD)/msb-430-common/include/
INCLUDES += -I$(RIOTBOARD)/msb-430-common/drivers/include/
endif
ifeq ($(BOARD),wsn430-v1_3b)
INCLUDES += -I$(RIOTBOARD)/wsn430-v1_3b/include/
INCLUDES += -I$(RIOTBOARD)/wsn430-common/include/
endif
ifeq ($(BOARD),wsn430-v1_4)
INCLUDES += -I$(RIOTBOARD)/wsn430-v1_4/include/
INCLUDES += -I$(RIOTBOARD)/wsn430-common/include/
endif
ifeq ($(BOARD),chronos)
INCLUDES += -I$(RIOTBOARD)/chronos/include/
INCLUDES += -I$(RIOTBOARD)/chronos/drivers/include/
endif
ifeq ($(BOARD),native)
INCLUDES += -I$(RIOTBOARD)/native/include/
endif

6
boards/README.md Normal file
View File

@ -0,0 +1,6 @@
Platform configurations for RIOT-OS
====================================
This repository contains existing configuration and initialization files for platforms supported by RIOT-OS.
RIOT's kernel, system libraries, and drivers can be found here:
https://github.com/RIOT-OS/RIOT

38
boards/avsextrem/Makefile Normal file
View File

@ -0,0 +1,38 @@
SRC = $(wildcard *.c)
BINDIR = bin/
OBJ = $(SRC:%.c=$(BINDIR)%.o)## defines
export ARCH = avsextrem_base.a
DEP = $(SRC:%.c=$(BINDIR)%.d)
INCLUDES += -I$(RIOTBOARD)/msba2-common/include/
INCLUDES += -I$(RIOTBASE)/cpu/arm_common/include/
INCLUDES += -I$(RIOTBASE)/cpu/lpc2387/include/
INCLUDES += -I$(RIOTBASE)/drivers/cc110x
all: $(BINDIR)$(ARCH)
"$(MAKE)" -C ../msba2-common
"$(MAKE)" -C drivers
$(BINDIR)$(ARCH): $(OBJ)
$(AR) rcs $(BINDIR)$(ARCH) $(OBJ)
# pull in dependency info for *existing* .o files
-include $(OBJ:.o=.d)
# compile and generate dependency info
$(BINDIR)%.o: %.c
mkdir -p $(BINDIR)
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d
@printf "$(BINDIR)"|cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d
# remove compilation products
clean:
"$(MAKE)" -C ../msba2-common clean
"$(MAKE)" -C drivers clean
rm -f $(BINDIR)$(ARCH) $(OBJ) $(DEP)
@if [ -d $(BINDIR) ] ; \
then rmdir $(BINDIR) ; \
fi

View File

@ -0,0 +1,3 @@
export INCLUDES += -I$(RIOTBOARD)/msba2-common/include
include $(RIOTBOARD)/msba2-common/Makefile.include

View File

@ -0,0 +1,202 @@
/*
* board_init.c - initialization of the AVSEXTREM-BOARD.
* Copyright (C) 2013 Heiko Will <hwill@inf.fu-berlin.de>
*
* This source code is licensed under the LGPLv2 license,
* See the file LICENSE for more details.
*
*/
/**
* @file
* @brief avsextrem board initialization
*
* @author Freie Universität Berlin, Computer Systems & Telematics
* @author Heiko Will
* @author Kaspar Schleise
* @author Michael Baar
* @author Zakaria Kasmi
* @author Marco Ziegert
* @author Stefan Pfeiffer
*
* @note $Id: board_init.c 1071 2013-09-19 16:50:56 kasmi $
*/
#include "lpc23xx.h"
#include "VIC.h"
#include "cpu.h"
#include "gpioint.h"
#define PCRTC BIT9
#define CL_CPU_DIV 4
/*---------------------------------------------------------------------------*/
static inline void
pllfeed(void)
{
PLLFEED = 0xAA;
PLLFEED = 0x55;
}
/*---------------------------------------------------------------------------*/
void init_clks1(void)
{
// Disconnect PLL
PLLCON &= ~0x0002;
pllfeed();
while (PLLSTAT & BIT25); /* wait until PLL is disconnected before
* disabling - deadlock otherwise */
// Disable PLL
PLLCON &= ~0x0001;
pllfeed();
while (PLLSTAT & BIT24); // wait until PLL is disabled
SCS |= 0x10; // main OSC between 15MHz and 24MHz (more stable in tests)
SCS |= 0x20; // Enable main OSC
while (!(SCS & 0x40)); // Wait until main OSC is usable
/* select main OSC, 16MHz, as the PLL clock source */
CLKSRCSEL = 0x0001;
// Setting Multiplier and Divider values
PLLCFG = 0x0008; // M=9 N=1 Fcco = 288 MHz
pllfeed();
// Enabling the PLL */
PLLCON = 0x0001;
pllfeed();
/* Set clock divider to 4 (value+1) */
CCLKCFG = CL_CPU_DIV - 1; // Fcpu = 72 MHz
#if USE_USB
USBCLKCFG = USBCLKDivValue; /* usbclk = 288 MHz/6 = 48 MHz */
#endif
}
/*---------------------------------------------------------------------------*/
void bl_init_ports(void)
{
SCS |= BIT0; // Set IO Ports to fast switching mode
/* UART0 */
PINSEL0 |= BIT4 + BIT6; // RxD0 and TxD0
PINSEL0 &= ~(BIT5 + BIT7);
//PTTU:
/*Turn Board on*/
// PINMODE0 |= BIT1;
// FIO0DIR |= BIT27;
// FIO0CLR = BIT27;
// 0.27
/* 5V*/
// FIO1DIR |= BIT28; // Synch
// FIO1SET = BIT28; // No Powersave
// 1.28
// FIO1DIR |= BIT27; // 5V off
// FIO1CLR = BIT27;
// 1.27
/* Disable Resistors on Buttons */
// PINMODE4 |= BIT9 + BIT11;
//
/* Disable Resistors on LED - and Ports to output*/
PINMODE7 |= BIT19 + BIT21; //3.25 + 3.26
PINMODE2 |= BIT1; //1.0
FIO1DIR |= BIT0;
FIO3DIR |= BIT25 + BIT26;
FIO1SET = BIT0; //all off
FIO3SET = BIT25 + BIT26;
// Config and Disable PA
// FIO1DIR |= BIT25 + BIT26 + BIT22;
// FIO1SET = BIT26;
// FIO1CLR = BIT25;
// FIO1CLR = BIT22; // PA /Shutdown
// Important: First put this Port as DA 2.0V and then turn on PA!!
// FIO0DIR |= BIT26;
// FIO0SET = BIT26;
// 1.22 + 1.25 + 1.26
// Configure GPS
PINMODE3 |= BIT3 + BIT7; // No Pullup on 1.17 & 1.19
PINMODE9 |= BIT27 + BIT25; // No Pullup for Uart
FIO1DIR |= BIT17;
FIO1CLR = BIT17; // Turn off GPS
FIO1DIR |= BIT19;
FIO1CLR = BIT19; // Hold in Reset
PINSEL9 |= BIT24 + BIT25 + BIT26 + BIT27; //4.28 & 4.29 as Uart3
// Nanotron
FIO2DIR &= ~BIT8; // nanotron uC IRQ as input
FIO1DIR |= BIT15; // nanotron power on reset
FIO1DIR &= ~BIT14; // nanotron uC RESET as input
FIO1DIR &= ~BIT10; // nanotron uC Vcc as input
FIO1DIR |= BIT9; // nanotron ENABLE as output
FIO1DIR &= ~BIT4; // nanotron Rx/Tx as input
FIO1CLR = BIT15;
FIO1CLR = BIT9; // Enable power
PINMODE1 |= BIT1; // No Pullup for CS
FIO0DIR |= BIT16; // CS as output
FIO0SET = BIT16; // drive cs inactive
FIO0DIR |= BIT18 + BIT15; // SPi Output
// RFID
// FIO1DIR |= BIT1; // RFID Power
// FIO1CLR = BIT1;
//
// FIO0DIR |= BIT1; // RFID Reset
// FIO0SET = BIT1; // Hold in Reset
//
// FIO0DIR &= ~BIT10; // LED as INPUT
// FIO0DIR &= ~BIT11; // DATA as INPUT
// PINMODE0 |= BIT19 + BIT21; // No Pullups
// 1.1 + 0.1 + 0.10 + 0.11
// LTC4150 ARM
FIO0DIR |= BIT5;
FIO0CLR = BIT5;
// LTC4150 System
// FIO0DIR |= BIT24;
// FIO0CLR = BIT24;
// 0.23 + 0.24
// Battery Voltage (AD)
PINMODE1 |= BIT19; //0.25
PINSEL1 &= ~BIT19;
PINSEL1 |= BIT18;
//cc1100
FIO0DIR |= BIT6 + BIT7 + BIT9;
FIO0SET = BIT6;
FIO0SET = BIT7 + BIT9;
//SMB380
FIO1DIR |= BIT20 + BIT21 + BIT24; //SCK + CSB + SDI
FIO1SET = BIT21;
FIO1SET = BIT20 + 24;
//SHT11
FIO1DIR |= BIT25; //1.25
PINSEL3 &= ~(BIT12 | BIT13 | BIT18 | BIT19);
//SD
FIO0DIR &= ~(BIT19 | BIT20 | BIT21 | BIT22) ; //0.19 0.20 0.21 0.22 as input
PINMODE1 |= (BIT7) | (BIT9) | (BIT11) | (BIT13); // no resistors
FIO2DIR &= ~(BIT11 + BIT12 + BIT13); //2.11 2.12 2.13 as input
PINMODE4 |= (BIT23) | (BIT25) | (BIT27); // no resistors
}

View File

@ -0,0 +1,24 @@
SRC = $(wildcard *.c)
BINDIR = $(RIOTBOARD)/$(BOARD)/bin/
OBJ = $(SRC:%.c=$(BINDIR)%.o)
DEP = $(SRC:%.c=$(BINDIR)%.d)
INCLUDES += -I$(RIOTBASE)/sys/include/ -I$(RIOTBASE)/drivers/cc110x_ng/include/ -I$(RIOTBOARD)/$(BOARD)/include
$(BINDIR)avsextrem_base.a: $(OBJ)
$(AR) rcs $(BINDIR)${ARCH} $(OBJ)
# pull in dependency info for *existing* .o files
-include $(OBJ:.o=.d)
# compile and generate dependency info
$(BINDIR)%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d
@printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d
# remove compilation products
clean:
rm -f $(BINDIR)$(MODULE).a $(OBJ) $(DEP) $(ASMOBJ)

View File

@ -0,0 +1,257 @@
/*
* avsextrem-cc1100.c - CC100 Transceiver Driver for the AVSEXTREM-BOARD.
* Copyright (C) 2013 Heiko Will <hwill@inf.fu-berlin.de>
*
* This source code is licensed under the LGPLv2 license,
* See the file LICENSE for more details.
*
*/
/**
* @file
* @ingroup LPC2387
* @brief CC1100 LPC2387 dependend functions
*
* @author Freie Universität Berlin, Computer Systems & Telematics
* @author Heiko Will <hwill@inf.fu-berlin.de>
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
* @author Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
*
* @version $Revision: 1781 $
*
* @note $Id: avsextrem-cc1100.c 1781 2013-08-14 13:39:36Z kasmi $
*/
#include <stdio.h>
#include <stddef.h>
// cpu
#include "cpu.h"
// sys
#include "cc1100.h"
#include "arch_cc1100.h"
#include "cc1100_spi.h"
#include "gpioint.h"
#define CC1100_GDO0 (FIO2PIN & BIT6) // read serial I/O (GDO0)
#define CC1100_GDO1 (FIO0PIN & BIT8) // read serial I/O (GDO1)
#define CC1100_GDO2 (FIO0PIN & BIT28) // read serial I/O (GDO2)
#define SPI_TX_EMPTY (SSP1SR & SSPSR_TFE)
#define SPI_BUSY (SSP1SR & SSPSR_BSY)
#define SPI_RX_AVAIL (SSP1SR & SSPSR_RNE)
#define CC1100_GDO1_LOW_RETRY (100) // max. retries for GDO1 to go low
#define CC1100_GDO1_LOW_COUNT (2700) // loop count (timeout ~ 500 us) to wait
// for GDO1 to go low when CS low
//#define DEBUG
#ifdef DEBUG
#include "stdio.h"
static unsigned long time_value;
static void set_time(void)
{
time_value = 0;
}
static int test_time(int code)
{
time_value++;
if (time_value > 10000000) {
printf("CC1100 SPI alarm: %u!\n", code);
time_value = 0;
return 1;
}
return 0;
}
#endif
int cc1100_get_gdo0(void)
{
return CC1100_GDO0;
}
int cc1100_get_gdo1(void)
{
return CC1100_GDO1;
}
int cc1100_get_gdo2(void)
{
return CC1100_GDO2;
}
void cc1100_spi_init(void)
{
// configure chip-select
FIO0DIR |= BIT6;
FIO0SET = BIT6;
// Power
PCONP |= PCSSP1; // Enable power for SSP1 (default is on)
// PIN Setup
PINSEL0 |= BIT15; // Set CLK function to SSP1
PINSEL0 &= ~BIT14;
PINSEL0 |= BIT17 ; // Set MISO function to SSP1
PINSEL0 &= ~BIT16;
PINSEL0 |= BIT19; // Set MOSI function to SSP1
PINSEL0 &= ~BIT18;
// Interface Setup
SSP1CR0 = 7;
// Clock Setup
uint32_t pclksel;
uint32_t cpsr;
lpc2387_pclk_scale(F_CPU / 1000, 6000, &pclksel, &cpsr);
PCLKSEL0 &= ~(BIT21 | BIT20); // CCLK to PCLK divider
PCLKSEL0 |= pclksel << 20;
SSP1CPSR = cpsr;
// Enable
SSP1CR1 |= BIT1; // SSP-Enable
int dummy;
// Clear RxFIFO:
while (SPI_RX_AVAIL) { // while RNE (Receive FIFO Not Empty)...
dummy = SSP1DR; // read data
}
}
uint8_t
cc1100_txrx(uint8_t c)
{
uint8_t result;
SSP1DR = c;
#ifdef DEBUG
set_time();
#endif
while (!SPI_TX_EMPTY) {
#ifdef DEBUG
test_time(0);
#endif
}
#ifdef DEBUG
set_time();
#endif
while (SPI_BUSY) {
#ifdef DEBUG
test_time(1);
#endif
}
#ifdef DEBUG
set_time();
#endif
while (!SPI_RX_AVAIL) {
#ifdef DEBUG
test_time(2);
#endif
}
result = (uint8_t)SSP1DR;
return result;
}
void cc1100_spi_cs(void)
{
FIO0CLR = BIT6;
}
void
cc1100_spi_select(void)
{
volatile int retry_count = 0;
volatile int abort_count;
// Switch to GDO mode input
PINSEL0 &= ~(BIT17 + BIT16); // Set MISO function to GPIO
FIO0DIR &= ~BIT8;
cs_low:
// CS to low
abort_count = 0;
FIO0CLR = BIT6;
// Wait for SO to go low (voltage regulator
// has stabilized and the crystal is running)
loop:
asm volatile("nop");
if (CC1100_GDO1) {
abort_count++;
if (abort_count > CC1100_GDO1_LOW_COUNT) {
retry_count++;
if (retry_count > CC1100_GDO1_LOW_RETRY) {
puts("[CC1100 SPI] fatal error\n");
goto final;
}
FIO0SET = BIT6; // CS to high
goto cs_low; // try again
}
goto loop;
}
final:
// Switch to SPI mode
PINSEL0 |= BIT17; // Set MISO function to SSP1
PINSEL0 &= ~BIT16;
}
void
cc1100_spi_unselect(void)
{
FIO0SET = BIT6;
}
void cc1100_gdo2_disable(void)
{
gpioint_set(0, BIT28, GPIOINT_DISABLE, NULL);
}
void cc1100_gdo2_enable(void)
{
gpioint_set(0, BIT28, GPIOINT_FALLING_EDGE, &cc1100_gdo2_irq);
}
void cc1100_before_send(void)
{
// Disable GDO2 interrupt before sending packet
cc1100_gdo2_disable();
}
void cc1100_after_send(void)
{
// Enable GDO2 interrupt after sending packet
cc1100_gdo2_enable();
}
void cc1100_gdo0_enable(void)
{
gpioint_set(2, BIT6, GPIOINT_RISING_EDGE, &cc1100_gdo0_irq);
}
void cc1100_gdo0_disable(void)
{
gpioint_set(2, BIT6, GPIOINT_DISABLE, NULL);
}
void cc1100_init_interrupts(void)
{
// Enable external interrupt on low edge (for GDO2)
FIO0DIR &= ~BIT28;
cc1100_gdo2_enable();
// Enable external interrupt on low edge (for GDO0)
FIO2DIR &= ~BIT6;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,425 @@
/*
* avsextrem-ssp0.c - implementation of the SPI0 interface for the LPC2387,
* and the AVSESTREM board.
* Copyright (C) 2013 Freie Universität Berlin
*
* This source code is licensed under the LGPLv2 license,
* See the file LICENSE for more details.
*/
/**
* @file
* @internal
* @brief Implements the SPI0 interface for the LPC2387
*
* @author Freie Universität Berlin, Computer Systems & Telematics
* @author Marco Ziegert <ziegert@inf.fu-berlin.de>
* @author Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
* @version $Revision: 3854 $
*
* @note $Id: avsextrem-ssp0.c 3854 2013-08-14 15:27:01Z zkasmi $
*/
#include "lpc23xx.h" /* LPC23XX/24xx Peripheral Registers */
#include "cpu.h"
#include "VIC.h"
#include "ssp0-board.h"
#include "smb380-board.h"
//#include "mma7455l-board.h"
#include "gpioint.h"
#include "hwtimer.h"
#include <stdio.h>
#include "lpm.h"
//uint16_t sampleRateMMA7455L;
//uint16_t interruptTicksMMA7455L;
//
//static void MMA7455L_extIntHandler(void);
uint32_t SSP0Init(void)
{
/*
* enable clock to SSP0 for security reason.
* By default, it's enabled already
*/
PCONP |= PCSSP0;
//TODO: configure CLK, MISO, MOSI by default as GPIOs.
#if USE_CS
// P1.20 1.21 1.23 1.24
// PINSEL3 |= BIT8 | BIT9 | BIT10 | BIT11 | BIT14 | BIT15 | BIT16 | BIT17;
#else
// No SSEL0
// PINSEL3 |= BIT8 | BIT9 | BIT14 | BIT15 | BIT16 | BIT17; //1.20 1.23 1.24
#endif
#if SSP1_INTERRUPT_MODE
if (install_irq(SSP1_INT, (void *)SSP0Handler, HIGHEST_PRIORITY) == FALSE) {
return (FALSE);
}
/*
* Set SSPINMS registers to enable interrupts,
* enable all error related interrupts
*/
SSP1IMSC = SSPIMSC_RORIM | SSPIMSC_RTIM;
#endif
return (1);
}
/*
* datasize (wordsize) in decimal (4-16), cpol&cpha =(0/1) and frequency divided
* by 1000 (e.g. 8 MHz = 8000)
*/
uint8_t SSP0Prepare(uint8_t chip, uint8_t datasize, uint8_t cpol, uint8_t cpha,
uint16_t freq)
{
switch (chip) {
case BMA180_INTERN:
case SMB380_ACC: {
#if USE_CS
PINSEL3 |= BIT8 | BIT9 | BIT10 | BIT11 | BIT14 | BIT15 | BIT16 |
BIT17; //P1.20 1.21 1.23 1.24
#else
// 1.20 1.23 1.24 are not configured as SSEL0
PINSEL3 |= BIT8 | BIT9 | BIT14 | BIT15 | BIT16 | BIT17;
#endif
break;
}
case BMA180_EXTERN:
case L3G_EXTERN:
case NANOPAN:
case ACAMDMS: {
#if USE_CS
PINSEL0 |= BIT31;
PINSEL1 |= BIT1 | BIT3 | BIT5; // P0.15 0.16 0.17 0.18
#else
// Turn on NanoPAN
PINSEL0 |= BIT31;
// 0.15 0.17 0.18 are not configured as SSEL0
PINSEL1 |= BIT3 | BIT5;
#endif
break;
}
case NORDIC: {
PINSEL0 |= BIT31;
PINSEL1 |= BIT3 | BIT5; // 0.15 0.17 0.18 SSEL0 (No)
break;
}
default: {
printf("wrong CHIP selected\n");
return 0;
}
}
uint32_t SSP0CR0tmp = 0;
switch (datasize) {
case 4:
SSP0CR0tmp = BIT0 | BIT1;
break;
case 5:
SSP0CR0tmp = BIT2;
break;
case 6:
SSP0CR0tmp = BIT0 | BIT2;
break;
case 7:
SSP0CR0tmp = BIT1 | BIT2;
break;
case 8:
SSP0CR0tmp = BIT0 | BIT1 | BIT2;
break;
case 9:
SSP0CR0tmp = BIT3;
break;
case 10:
SSP0CR0tmp = BIT0 | BIT3;
break;
case 11:
SSP0CR0tmp = BIT1 | BIT3;
break;
case 12:
SSP0CR0tmp = BIT0 | BIT1 | BIT3;
break;
case 13:
SSP0CR0tmp = BIT2 | BIT3;
break;
case 14:
SSP0CR0tmp = BIT0 | BIT2 | BIT3;
break;
case 15:
SSP0CR0tmp = BIT1 | BIT2 | BIT3;
break;
case 16:
SSP0CR0tmp = BIT0 | BIT1 | BIT2 | BIT3;
break;
default:
return 0;
}
if (cpol) {
SSP0CR0tmp |= BIT6;
}
if (cpha) {
SSP0CR0tmp |= BIT7;
}
SSP0CR1 = 0x00; // SSP0 disabled
// Setting xx-Bit Datasize, CPOL and CPHA
SSP0CR0 = SSP0CR0tmp;
// Clock Setup
uint32_t pclksel;
uint32_t cpsr;
lpc2387_pclk_scale(F_CPU / 1000, freq, &pclksel, &cpsr);
PCLKSEL1 &= ~(BIT10 | BIT11); // CCLK to PCLK divider ???
PCLKSEL1 |= pclksel << 10;
SSP0CPSR = cpsr;
// Enable
SSP0CR1 |= BIT1; // SSP0 enabled
uint32_t Dummy;
for (uint32_t i = 0; i < FIFOSIZE; i++) {
Dummy = SSP0DR; // clear the RxFIFO
}
return 1;
}
uint8_t SSP0Unprepare(uint8_t chip)
{
switch (chip) {
case BMA180_INTERN:
case SMB380_ACC: {
// Turn off Acceleration Sensor
PINSEL3 &= ~(BIT8 | BIT9 | BIT10 | BIT11 | BIT14 | BIT15 | BIT16 |
BIT17);
FIO1DIR |= BIT20 | BIT21 | BIT24;
FIO1DIR &= ~BIT23; // MISO as Input
FIO1SET = BIT20 | BIT24; /*
* CLK + SSEL + MOSI GPIO as Output
* TODO: depends on CPOL+CPHA Settings
*/
FIO1CLR = BIT21;
break;
}
case BMA180_EXTERN:
case L3G_EXTERN:
case NORDIC:
case NANOPAN:
case ACAMDMS: {
// Turn off Nanopan (Pins to GPIO)
PINSEL0 &= ~(BIT30 | BIT31); //CLK to GPIO
PINSEL1 &= ~(BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5);
FIO0DIR |= BIT15 | BIT16 | BIT18; //CLK + SSEL + MOSI GPIO as Output
FIO0DIR &= ~BIT17; // MISO as Input
FIO0SET = BIT15 | BIT16; /*
* CLK + SSEL + MOSI GPIO as Output
* TODO: depends on CPOL+CPHA Settings
*/
FIO0CLR = BIT18;
break;
}
default: {
printf("wrong CHIP selected\n");
return 0;
}
}
return 1;
}
unsigned char SMB380_ssp_write(const unsigned char regAddr,
const unsigned char data, unsigned char flag)
{
uint16_t temp = 0;
if (flag) {
temp = (unsigned int)(((regAddr & 0xFF7F) << 8) | data);
}
else {
temp = (((unsigned int)(regAddr | 0x80) << 8) | 0xFF);
}
return SSP0_write(temp, SMB380_ACC);
}
unsigned char SSP0_write(const uint16_t data, uint8_t device)
{
unsigned char ret = 1;
while ((SSP0SR & (SSPSR_TNF | SSPSR_BSY)) != SSPSR_TNF)
;
if (!USE_CS) {
switch (device) {
case BMA180_INTERN:
case SMB380_ACC: {
FIO1CLR = SSP0_SEL;
break;
}
case BMA180_EXTERN:
case L3G_EXTERN:
case NANOPAN: {
printf("[%s] line: %d\n", __FUNCTION__, __LINE__);
FIO0CLR = SSP0_SELN;
break;
}
case ACAMDMS:
case NORDIC:
// Chip Select is done in Nordic driver
break;
default:
ret = 0;
goto ret;
}
}
SSP0DR = data;
if (!USE_CS) {
while (SSP0SR & SSPSR_BSY)
;
switch (device) {
case BMA180_INTERN:
case SMB380_ACC: {
FIO1SET = SSP0_SEL;
break;
}
case BMA180_EXTERN:
case L3G_EXTERN:
case NANOPAN: {
FIO0SET = SSP0_SELN;
break;
}
case ACAMDMS:
case NORDIC:
// Chip Select is done in Nordic driver
break;
default:
ret = 0;
goto ret;
}
}
ret:
return ret;
}
unsigned short SSP0_read(uint8_t device)
{
uint16_t data;
while (!(SSP0SR & SSPSR_RNE))
;
if (!USE_CS) {
switch (device) {
case BMA180_INTERN:
case SMB380_ACC: {
FIO1CLR = SSP0_SEL;
break;
}
case BMA180_EXTERN:
case L3G_EXTERN:
case NANOPAN: {
FIO0CLR = SSP0_SELN;
break;
}
case NORDIC:
case ACAMDMS:
// Chip Select is done in Nordic driver
break;
default:
data = 0xFFFF;
goto ret;
}
}
data = SSP0DR;
if (!USE_CS) {
switch (device) {
case BMA180_INTERN:
case SMB380_ACC: {
FIO1SET = SSP0_SEL;
break;
}
case BMA180_EXTERN:
case L3G_EXTERN:
case NANOPAN: {
FIO0SET = SSP0_SELN;
break;
}
case ACAMDMS:
case NORDIC:
// Chip Select is done in Nordic driver
break;
default:
data = 0xFFFF;
goto ret;
}
}
ret:
return data;
}
unsigned short SMB380_ssp_read(void)
{
return SSP0_read(SMB380_ACC);
}
unsigned short nrf24l01_ssp_read_write(const uint8_t data)
{
SSP0_write(data, NORDIC);
return SSP0_read(NORDIC);
}
unsigned short acam_trx(const uint8_t data)
{
SSP0_write(data, ACAMDMS);
return SSP0_read(ACAMDMS);
}

View File

@ -0,0 +1,66 @@
/*
* board.h - Definitions for the AVSEXTREM board configuration.
* Copyright (C) 2013 Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
*
* This source code is licensed under the LGPLv2 license,
* See the file LICENSE for more details.
*
*/
/**
* @file
* @brief avsextrem board configuration
*
* @author Freie Universität Berlin, Computer Systems & Telematics
* @author Heiko Will
* @author Zakaria Kasmi
* @version $Revision: 1127 $
*
* @note $Id: board-conf.h 1127 2013-06-13 08:48:29Z kasmi$
*/
#ifndef BOARDCONF_H_
#define BOARDCONF_H_
#include <bitarithm.h>
#include "msba2_common.h"
#define FEUERWARE_CONF_BOARD_NAME "FU Berlin AVSEXTREM BOARD"
#define LED_RED_PIN (BIT25)
#define LED_GREEN_PIN (BIT26)
#define LED_GREEN_OFF (FIO3SET = LED_GREEN_PIN)
#define LED_GREEN_ON (FIO3CLR = LED_GREEN_PIN)
#define LED_GREEN_TOGGLE (FIO3PIN ^= LED_GREEN_PIN)
#define LED_RED_OFF (FIO3SET = LED_RED_PIN)
#define LED_RED_ON (FIO3CLR = LED_RED_PIN)
#define LED_RED_TOGGLE (FIO3PIN ^= LED_RED_PIN)
#ifdef MODULE_CC110X
#define FEUERWARE_CONF_NUM_RADIOS 1
#else
#define FEUERWARE_CONF_NUM_RADIOS 0
#endif
// if FAT is enabled this board supports files
#define FEUERWARE_CONF_CORE_SUPPORTS_FILES defined(MODULE_FAT)
#ifdef MODULE_FAT
#define CFG_CONF_MEM_SIZE 0x7FFFFFFF
#define SYSLOG_CONF_NUM_INTERFACES 2
#else
#define SYSLOG_CONF_NUM_INTERFACES 1
#endif
void init_clks1(void);
typedef uint8_t radio_packet_length_t;
/** @} */
#endif /* BOARDCONF_H_ */

View File

@ -0,0 +1,77 @@
/*
* configure.h - Configuration file for the avsextrem board.
* Copyright (C) 2013 Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
*
* This source code is licensed under the LGPLv2 license,
* See the file LICENSE for more details.
*
*/
/**
* @file
* @brief definitions for the avsextrem board configuration
*
* @author Freie Universität Berlin, Computer Systems & Telematics
* @author baar
* @author Zakaria Kasmi
* @version $Revision: 1127 $
*
* @note $Id: board-conf.h 1127 2013-08-20 17:15:29 kasmi $
*/
#ifndef CONFIGURE_H_
#define CONFIGURE_H_
/**
*
* The offline configuration file "configure.h" is automatically
* included in every file by the build system and allows to configure
* all neccessary defines on cpu, board and project level.
*
* The configuration is built of
* \li a project specific file (project-conf.h)
* \li a board specific file (board-conf.h) and
* \li a cpu specific file (cpu-conf.h).
* All of which are chosen by the build system depending on your arguments.
*
* @{
*/
//#include "project-conf.h"
//#include "board-conf.h"
#include "cpu-conf.h"
#ifdef MODULE_SYSMON
#ifndef TRACELOG_CONF_NUM_ENTRIES
#define TRACELOG_CONF_NUM_ENTRIES 10
#endif
#else
#undef TRACELOG_CONF_NUM_ENTRIES
#endif
/* ------------------------------------------------------------------------- */
/*
* documentation of defines that do not belong to a specific module:
*/
/**
* @def FEUERWARE_CONF_BOARD_NAME
* @brief Defines the name of the board as a string
*/
/**
* @def FEUERWARE_CONF_CPU_NAME
* @brief Defines the name of the cpu as a string
*/
/**
* @def FEUERWARE_CONF_SUPPORTS_FILES
* @brief Defines if standard library file functions are available
*/
#ifndef FEUERWARE_CONF_SUPPORTS_FILES
#define FEUERWARE_CONF_SUPPORTS_FILES 0
#endif
/** @} */
#endif /* CONFIGURE_H_ */

View File

@ -0,0 +1,254 @@
/*
* msba2acc-smb380.h - Definitions of the Driver for the SMB380 acceleration
* sensor.
* Copyright (C) 2013 Freie Universität Berlin
*
* This source code is licensed under the LGPLv2 license,
* See the file LICENSE for more details.
**/
/**
* @file
* @internal
* @brief SMB380 acceleration sensor definitions for the LPC2387
*
* @author Freie Universität Berlin, Computer Systems & Telematics
* @author Marco Ziegert <ziegert@inf.fu-berlin.de>
* @author Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
* @version $Revision: 3854 $
*
* @note $Id: msba2acc-smb380.h 3854 2010-01-18 15:27:01 kasmi $
*
*/
#ifndef SMB380_H_
#define SMB380_H_
#include <stdint.h>
#include <bitarithm.h>
#define SMB380_DEBUG_MESSAGE "SMB380 Driver Error: "
#define MSG_TYPE_SMB380_WAKEUP 814
#define SMB380_X_AXIS 0 //X Axis-Name
#define SMB380_Y_AXIS 1 //Y Axis-Name
#define SMB380_Z_AXIS 2 //Z Axis-Name
#define LPM_PREVENT_SLEEP_ACCSENSOR BIT2
enum SMB380_MODE {
SMB380_POLL,
SMB380_POLL_AFTER_CONTINOUS,
SMB380_CONTINOUS,
SMB380_THRESHOLD,
SMB380_FALSEALERT
};
//volatile enum SMB380_MODE
volatile enum SMB380_MODE smb380_mode;// = SMB380_POLL;
/* Writeable values to EEPROM: from 0x0A (control1) to 0x1D (offset_T).
For writing enable ... flag and add eeprom_offset_address.
Generally it is a good idea to read out shared register addresses before writing,
registers 0x14 and 34h are especially critical.
*/
#define SMB380_EEPROM_OFFSET 0x20
//Chip-ID Bit0-2, default: 010b
#define SMB380_CHIP_ID 0x00
//Chip-ID mask
#define SMB380_CHIP_ID_MASK 0x07
//ml_version Bit0-3 ; al_version Bit4-7
#define SMB380_AL_ML_VERSION 0x01
#define SMB380_AL_MASK 0xF0
#define SMB380_ML_MASK 0x0F
//LSB_acc_x Bit6-7; new_data_x Bit0
#define SMB380_ACC_X_LSB_NEWDATA 0x02
//MSB_acc_x Bit0-7
#define SMB380_ACC_X_MSB 0x03
//LSB_acc_y Bit6-7; new_data_y Bit0
#define SMB380_ACC_Y_LSB_NEWDATA 0x04
//MSB_acc_y Bit0-7
#define SMB380_ACC_Y_MSB 0x05
//LSB_acc_z Bit6-7; new_data_z Bit0
#define SMB380_ACC_Z_LSB_NEWDATA 0x06
//MSB_acc_z Bit0-7
#define SMB380_ACC_Z_MSB 0x07
#define SMB380_ACC_LSB_MASK 0xC0
#define SMB380_ACC_MSB_MASK 0xFF
#define SMB380_ACC_NEWDATA_MASK 0x01
//Temperature Bit0-7
#define SMB380_TEMP 0x08
//Status register, contains six flags
#define SMB380_STATUS 0x09
#define SMB380_STATUS_ST_RESULT_MASK 0x80
#define SMB380_STATUS_ALERT_PHASE_MASK 0x10
#define SMB380_STATUS_LG_LATCHED_MASK 0x08
#define SMB380_STATUS_HG_LATCHED_MASK 0x04
#define SMB380_STATUS_STATUS_LG_MASK 0x02
#define SMB380_STATUS_STATUS_HG_MASK 0x01
//Control register - contains seven values, default: x000 0000b
#define SMB380_CONTROL1 0x0A
#define SMB380_CONTROL1_RESET_INT_MASK 0x40
#define SMB380_CONTROL1_UPDATE_MASK 0x20
#define SMB380_CONTROL1_EE_W_MASK 0x10
#define SMB380_CONTROL1_SELF_TEST_1_MASK 0x08
#define SMB380_CONTROL1_SELF_TEST_0_MASK 0x04
#define SMB380_CONTROL1_SOFT_RESET_MASK 0x02
#define SMB380_CONTROL1_SLEEP_MASK 0x01
//Control register - contains six values, default: x000 0011b
#define SMB380_CONTROL2 0x0B
#define SMB380_CONTROL2_ALERT_MASK 0x80
#define SMB380_CONTROL2_ANY_MOTION_MASK 0x40
#define SMB380_CONTROL2_COUNTER_HG_MASK 0x30
#define SMB380_CONTROL2_COUNTER_LG_MASK 0x0C
#define SMB380_CONTROL2_ENABLE_HG_MASK 0x02
#define SMB380_CONTROL2_ENABLE_LG_MASK 0x01
//default: 20
#define SMB380_LG_THRES 0x0C
//default: 150
#define SMB380_LG_DUR 0x0D
//default: 160
#define SMB380_HG_THRES 0x0E
//default: 150
#define SMB380_HG_DUR 0x0F
//default: 0
#define SMB380_ANY_MOTION_THRES 0x10
//default: 0000 0000b
#define SMB380_ANY_MOTION_DUR_HYST 0x1
#define SMB380_ANY_MOTION_DUR_MASK 0xC0
#define SMB380_ANY_MOTION_DUR_HG_HYST_MASK 0x38
#define SMB380_ANY_MOTION_DUR_LG_HYST_MASK 0x07
//default: 162
#define SMB380_CUST1 0x12
//default: 13
#define SMB380_CUST2 0x13
//default: xxx0 1110b
#define SMB380_CONTROL3 0x14
#define SMB380_CONTROL3_RANGE_MASK 0x18
#define SMB380_CONTROL3_BANDWITH_MASK 0x07
//default: 1000 0000b
#define SMB380_CONTROL4 0x15
#define SMB380_CONTROL4_SPI4_MASK 0x80
#define SMB380_CONTROL4_ENABLE_ADV_INT_MASK 0x40
#define SMB380_CONTROL4_NEW_DATA_INT_MASK 0x20
#define SMB380_CONTROL4_LATCH_INT_MASK 0x10
#define SMB380_CONTROL4_SHADOW_DIS_MASK 0x08
#define SMB380_CONTROL4_WAKEUP_PAUSE_MASK 0x06
#define SMB380_CONTROL4_WAKEUP_MASK 0x01
#define SMB380_OFFSET_LSB_GAIN_X 0x16
#define SMB380_OFFSET_LSB_GAIN_Y 0x17
#define SMB380_OFFSET_LSB_GAIN_Z 0x18
#define SMB380_OFFSET_LSB_GAIN_T 0x19
#define SMB380_OFFSET_LSB_MASK 0xC0
#define SMB380_OFFSET_GAIN_MASK 0x3F
#define SMB380_OFFSET_MSB_X 0x1A
#define SMB380_OFFSET_MSB_Y 0x1B
#define SMB380_OFFSET_MSB_Z 0x1C
#define SMB380_OFFSET_MSB_T 0x1D
#define SMB380_TEMP_OFFSET -30
#define SMB380_DEFAULT_MAXG 4.0f
#define SMB380_READ_REGISTER 0x00
#define SMB380_WRITE_REGISTER 0x01
#define SMB380_WAKE_UP_PAUSE_20MS 0x00
#define SMB380_WAKE_UP_PAUSE_80MS 0x01
#define SMB380_WAKE_UP_PAUSE_320MS 0x02
#define SMB380_WAKE_UP_PAUSE_2560MS 0x03
#define SMB380_RANGE_2G 0x00
#define SMB380_RANGE_4G 0x01
#define SMB380_RANGE_8G 0x02
#define SMB380_BAND_WIDTH_25HZ 0x00
#define SMB380_BAND_WIDTH_50HZ 0x01
#define SMB380_BAND_WIDTH_100HZ 0x02
#define SMB380_BAND_WIDTH_190HZ 0x03
#define SMB380_BAND_WIDTH_375HZ 0x04
#define SMB380_BAND_WIDTH_750HZ 0x05
#define SMB380_BAND_WIDTH_1500HZ 0x06
//SMB380_RING_BUFF_SIZE * int16_t (2Byte) * 4 (x,y,z,Temp) = 512 Byte (for 64)
#define SMB380_RING_BUFF_SIZE 256
//TODO chsnge size to 2048
#define SMB380_RING_BUFF_MAX_THREADS 10
#define SMB380_SAMPLE_RATE_MAX 3000
/*
* change from Header (public) to internal use (private)
* (use it after every write to EEPROM).
* set update_image Bit in control1 to
* copie content from EEPROM (0x2B to 0x3D) to Image (0x0B to 0x1D)
**/
void SMB380_update_image(void);
/*
* change from Header (public) to internal use (private)
* set ee_w Bit in control1 to
* enable read to 0x16 to 0x22 and
* enable write to 0x16 to 0x3D
**/
void SMB380_enable_eeprom_default(void);
//Example Hysterese function
uint8_t SMB380_HystereseFunctionSample(int16_t *value);
//Simple api for single-sample, single thread interrupt mode
uint8_t SMB380_init_simple(uint16_t samplerate, uint8_t bandwidth,
uint8_t range);
//Enables Interrupts (normally only once called)
uint8_t SMB380_init(uint8_t (*func)(int16_t *));
void SMB380_setSampleRate(uint16_t rate);
uint16_t SMB380_getSampleRate(void);
void freeRingReadPointer(void);
void actualizeRingReadPointer(void);
uint8_t readRingBuff(int16_t *value);
uint8_t writeRingBuff(int16_t *value);
void SMB380_activateDynRangeSet(uint8_t activate);
uint8_t checkRange(int16_t *value);
void SMB380_enableEEPROM(void);
void SMB380_disableEEPROM(void);
// getter
float SMB380_getSampleRatio(void);
void SMB380_getAcceleration(unsigned char axis, int16_t *pAbs, int16_t *pMg);
int16_t SMB380_getTemperature(void);
unsigned char SMB380_getChipID(void);
unsigned char SMB380_getWakeUpPause(void);
unsigned char SMB380_getBandWidth(void);
int16_t SMB380_getBandWidthAbs(void);
unsigned char SMB380_getRange(void);
unsigned char SMB380_getCustomerReg(void);
unsigned char SMB380_readOffset(uint16_t *offset);
unsigned char SMB380_readOffsetTemp(uint16_t *offset);
unsigned char SMB380_readGain(uint16_t *gain);
unsigned char SMB380_readGainTemp(uint16_t *gain);
// setter
void SMB380_setTempOffset(uint16_t offset, uint8_t EEPROM);
void SMB380_setWakeUpPause(unsigned char duration);
void SMB380_setBandWidth(unsigned char bandWidth);
void SMB380_setRange(unsigned char range);
void SMB380_softReset(void);
void SMB380_setCustomerReg(unsigned char data);
void SMB380_setUpperLimit(void);
void SMB380_enableUpperLimit(void);
void SMB380_disableUpperLimit(void);
void SMB380_enableLowerLimit(void);
void SMB380_disableLowerLimit(void);
uint8_t SMB380_setAnyMotionLimit(uint16_t mg, uint16_t gvalueint);
void SMB380_enableAnyMotionLimit(void);
void SMB380_disableAnyMotionLimit(void);
void SMB380_enableNewDataInt(void);
void SMB380_disableNewDataInt(void);
void SMB380_resetInterruptFlags(void);
void SMB380_writeOffset(uint16_t *offset, uint8_t EEPROM);
void SMB380_writeOffsetTemp(uint16_t *offset, uint8_t EEPROM);
// stats
void SMB380_ShowMemory(void);
void SMB380_Selftest_1(void);
#endif /* SMB380_H_ */

View File

@ -0,0 +1,118 @@
/*
* ssp0-borad.h - header file of the SPI interface for the LPC2387.
* Copyright (C) 2013 Freie Universität Berlin
*
* This source code is licensed under the LGPLv2 license,
* See the file LICENSE for more details.
*
*/
/**
* @file
* @internal
* @brief SPI interface definitions for the LPC2387
*
* @author Freie Universität Berlin, Computer Systems & Telematics
* @author Marco Ziegert <ziegert@inf.fu-berlin.de>
* @author Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
* @version $Revision: 3854 $
*
* @note $Id: avsextrem-ssp0.c 3854 2010-01-18 15:27:01Z zkasmi $
*/
#ifndef __SSP_H__
#define __SSP_H__
#include "stdint.h"
#define DMA_ENABLED 0
/*
* if USE_CS is zero, set SSEL as GPIO that you have total control of the
* sequence
**/
#define USE_CS 0
/*
* if 1, use driver for onboard BMA180, otherwise for external BMA180 utilizing
* Nanopan Connector
**/
#define BMA180_ONBOARD 1
#define SMB380_ACC 0
#define NANOPAN 1
#define NORDIC 2
#define BMA180_EXTERN 3
#define BMA180_INTERN 4
#define L3G_EXTERN 5
#define L3G_INTERN 6
#define ACAMDMS 7
/* SPI read and write buffer size */
#define BUFSIZE 256
#define FIFOSIZE 8
/* SSP select pin */
#define SSP0_SEL 1 << 21 //P1.21 SMB380
#define SSP0_SELN 1 << 16 //P0.16 Nanotron
/* SSP1 external interrupt Pin (SMB380 specific) */
#define SMB380_INT1 1 << 1 //P0.1
#define BMA180_INT1 1 << 8 //P2.8
/* SSP1 CR0 register */
#define SSPCR0_DSS 1 << 0
#define SSPCR0_FRF 1 << 4
#define SSPCR0_SPO 1 << 6
#define SSPCR0_SPH 1 << 7
#define SSPCR0_SCR 1 << 8
/* SSP1 CR1 register */
#define SSPCR1_LBM 1 << 0
#define SSPCR1_SSE 1 << 1
#define SSPCR1_MS 1 << 2
#define SSPCR1_SOD 1 << 3
/* SSP1 Interrupt Mask Set/Clear register */
#define SSPIMSC_RORIM 1 << 0
#define SSPIMSC_RTIM 1 << 1
#define SSPIMSC_RXIM 1 << 2
#define SSPIMSC_TXIM 1 << 3
/* SSP1 Interrupt Status register */
#define SSPRIS_RORRIS 1 << 0
#define SSPRIS_RTRIS 1 << 1
#define SSPRIS_RXRIS 1 << 2
#define SSPRIS_TXRIS 1 << 3
/* SSP1 Masked Interrupt register */
#define SSPMIS_RORMIS 1 << 0
#define SSPMIS_RTMIS 1 << 1
#define SSPMIS_RXMIS 1 << 2
#define SSPMIS_TXMIS 1 << 3
/* SSP1 Interrupt clear register */
#define SSPICR_RORIC 1 << 0
#define SSPICR_RTIC 1 << 1
#define SSP1_INTERRUPT_MODE 0
#define SMB380_EXTINT_MODE 1
#define BMA180_EXTINT_MODE 1
uint32_t SSP0Init(void);
uint8_t SSP0Prepare(uint8_t chip, uint8_t datasize, uint8_t cpol, uint8_t cpha,
uint16_t freq);
uint8_t SSP0Unprepare(uint8_t chip);
unsigned char SSP0_write(const uint16_t data, uint8_t device);
unsigned short SSP0_read(uint8_t device);
unsigned char SMB380_ssp_write(const unsigned char regAddr,
const unsigned char data, unsigned char flag);
unsigned short SMB380_ssp_read(void);
unsigned short nrf24l01_ssp_read_write(const uint8_t data);
unsigned short acam_trx(const uint8_t data);
void SSP0Handler(void);
#endif /* __SSP_H__ */

35
boards/chronos/Makefile Normal file
View File

@ -0,0 +1,35 @@
SRC = $(wildcard *.c)
BINDIR = bin/
OBJ = $(SRC:%.c=$(BINDIR)%.o)## defines
DEP = $(SRC:%.c=$(BINDIR)%.d)
INCLUDES += -Iinclude -I$(RIOTBASE)/sys/lib -I$(RIOTBASE)/sys/drivers/include
INCLUDES += -I$(RIOTBASE)/sys/drivers/cc110x_ng/include
INCLUDES += -I$(RIOTBASE)/core/include
INCLUDES += -I$(RIOTBASE)/cpu/msp430-common/include/
INCLUDES += -I$(RIOTBASE)/cpu/cc430/include/
#INCLUDES += -I/usr/msp430/include/
all: $(BINDIR)chronos_base.a
$(MAKE) -C drivers
$(BINDIR)chronos_base.a: $(OBJ)
$(AR) rcs $(BINDIR)chronos_base.a $(OBJ)
# pull in dependency info for *existing* .o files
-include $(OBJ:.o=.d)
# compile and generate dependency info
$(BINDIR)%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d
@printf "$(BINDIR)"|cat - $(BINDIR)$*.d > /tmp/fw_out && mv /tmp/fw_out $(BINDIR)$*.d
# remove compilation products
clean:
rm -f $(BINDIR)chronos_base.a $(OBJ) $(DEP)
$(MAKE) -C drivers clean

View File

@ -0,0 +1,22 @@
## the cpu to build for
export CPU = cc430
export MCU = cc430f6137
# toolchain config
export PREFIX = @msp430-
export CC = @$(PREFIX)gcc
export AR = @$(PREFIX)ar
export CFLAGS += -std=gnu99 -Wstrict-prototypes -gdwarf-2 -Os -Wall -mmcu=$(MCU) -D CC430
export ASFLAGS += -mmcu=$(MCU) --defsym $(MCU)=1 --gdwarf-2
export AS = $(PREFIX)as
export LINK = $(PREFIX)gcc
export SIZE = $(PREFIX)size
export OBJCOPY = $(PREFIX)objcopy
export LINKFLAGS = -mmcu=$(MCU) -lgcc $(RIOTBASE)/bin/startup.o
export FLASHER = mspdebug
ifeq ($(strip $(PORT)),)
export PORT = /dev/ttyUSB0
endif
export HEXFILE = bin/$(PROJECT).hex
export FFLAGS = -d $(PORT) -j uif "prog $(HEXFILE)"
export OFLAGS = -O ihex

View File

@ -0,0 +1,76 @@
#include <stdint.h>
#include <board.h>
#include <cpu.h>
#include <irq.h>
void cc430_cpu_init(void)
{
volatile uint16_t i;
volatile unsigned char *ptr;
/* disable watchdog */
WDTCTL = WDTPW + WDTHOLD;
// ---------------------------------------------------------------------
// Enable 32kHz ACLK
P5SEL |= 0x03; // Select XIN, XOUT on P5.0 and P5.1
UCSCTL6 &= ~XT1OFF; // XT1 On, Highest drive strength
UCSCTL6 |= XCAP_3; // Internal load cap
UCSCTL3 = SELA__XT1CLK; // Select XT1 as FLL reference
UCSCTL4 = SELA__XT1CLK | SELS__DCOCLKDIV | SELM__DCOCLKDIV;
// ---------------------------------------------------------------------
// Configure CPU clock for 12MHz
_BIS_SR(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_5; // Select suitable range
UCSCTL2 = FLLD_1 + 0x16E; // Set DCO Multiplier
_BIC_SR(SCG0); // Enable the FLL control loop
// Worst-case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
// UG for optimization.
// 32 x 32 x 8 MHz / 32,768 Hz = 250000 = MCLK cycles for DCO to settle
for (i = 0xFF; i > 0; i--); // Time for flag to set
// Loop until XT1 & DCO stabilizes, use do-while to insure that
// body is executed at least once
do {
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
SFRIFG1 &= ~OFIFG; // Clear fault flags
}
while ((SFRIFG1 & OFIFG));
// Disable all interrupts
__disable_interrupt();
// Get write-access to port mapping registers:
PMAPPWD = 0x02D52;
// Allow reconfiguration during runtime:
PMAPCTL = PMAPRECFG;
// P2.7 = TA0CCR1A or TA1CCR0A output (buzzer output)
ptr = &P2MAP0;
*(ptr + 7) = PM_TA1CCR0A;
P2OUT &= ~BIT7;
P2DIR |= BIT7;
// P1.5 = SPI MISO input
ptr = &P1MAP0;
*(ptr + 5) = PM_UCA0SOMI;
// P1.6 = SPI MOSI output
*(ptr + 6) = PM_UCA0SIMO;
// P1.7 = SPI CLK output
*(ptr + 7) = PM_UCA0CLK;
// Disable write-access to port mapping registers:
PMAPPWD = 0;
// Re-enable all interrupts
enableIRQ();
}
void board_init(void)
{
cc430_cpu_init();
}

View File

@ -0,0 +1,24 @@
SRC = $(wildcard *.c)
BINDIR = $(RIOTBOARD)/$(BOARD)/bin/
OBJ = $(SRC:%.c=$(BINDIR)%.o)
DEP = $(SRC:%.c=$(BINDIR)%.d)
INCLUDES += -I$(RIOTBASE)/sys/include/ -I$(RIOTBASE)/drivers/cc110x_ng/include/
$(BINDIR)chronos_drivers.a: $(OBJ)
$(AR) rcs $(BINDIR)chronos_base.a $(OBJ)
# pull in dependency info for *existing* .o files
-include $(OBJ:.o=.d)
# compile and generate dependency info
$(BINDIR)%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d
@printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d
# remove compilation products
clean:
rm -f $(OBJ) $(DEP)

View File

@ -0,0 +1,14 @@
#include <stdint.h>
#include <cc430f6137.h>
#include <cc430-adc.h>
uint32_t battery_get_voltage(void)
{
uint32_t voltage;
voltage = adc12_single_conversion(REFVSEL_1, ADC12SHT0_10, ADC12INCH_11);
/* Ideally we have A11=0->AVCC=0V ... A11=4095(2^12-1)->AVCC=4V
* --> (A11/4095)*4V=AVCC --> AVCC=(A11*4)/4095 */
voltage = (voltage * 2 * 2 * 1000) / 4095;
return voltage;
}

View File

@ -0,0 +1,29 @@
#include <stdint.h>
#include <buzzer.h>
#include <hwtimer.h>
#include <cc430f6137.h>
void buzzer_beep(uint8_t pitch, uint16_t duration)
{
// Reset TA1R, set up mode, TA1 runs from 32768Hz ACLK
TA1CTL = TACLR | MC_1 | TASSEL__ACLK;
// Set PWM frequency
TA1CCR0 = pitch;
// Enable IRQ, set output mode "toggle"
TA1CCTL0 = OUTMOD_4;
// Allow buzzer PWM output on P2.7
P2SEL |= BIT7;
hwtimer_wait(duration);
// Stop PWM timer
TA1CTL &= ~(BIT4 | BIT5);
// Reset and disable buzzer PWM output
P2OUT &= ~BIT7;
P2SEL &= ~BIT7;
TA1CCTL0 &= ~CCIE;
}

View File

@ -0,0 +1,94 @@
#include <stdint.h>
#include <cpu.h>
#include <irq.h>
#include <cc110x_ng.h>
#include <cc110x-arch.h>
//#include <cc430_.h>
#include <cc430f6137.h>
//#include <msp430/rf1a.h>
#define CC1100_GDO0 (RF1AIN & BIT0)
#define CC1100_GDO1 (RF1AIN & BIT1)
#define CC1100_GDO2 (RF1AIN & BIT2)
int cc110x_get_gdo0(void)
{
return CC1100_GDO0;
}
int cc110x_get_gdo1(void)
{
return CC1100_GDO1;
}
int cc110x_get_gdo2(void)
{
return CC1100_GDO2;
}
void cc110x_before_send(void)
{
// Disable GDO2 interrupt before sending packet
cc110x_gdo2_disable();
}
void cc110x_after_send(void)
{
// Enable GDO2 interrupt after sending packet
cc110x_gdo2_enable();
}
void cc110x_gdo0_enable(void)
{
RF1AIFG &= ~BIT0;
RF1AIE |= BIT0;
}
void cc110x_gdo0_disable(void)
{
RF1AIE &= ~BIT0;
RF1AIFG &= ~BIT0;
}
void cc110x_gdo2_disable(void)
{
RF1AIFG &= ~BIT2; // Clear a pending interrupt
RF1AIE &= ~BIT2; // Disable the interrupt
}
void cc110x_gdo2_enable(void)
{
RF1AIFG &= ~BIT2; // Clear a pending interrupt
RF1AIE |= BIT2; // Enable the interrupt
}
void cc110x_init_interrupts(void)
{
uint8_t state = disableIRQ(); /* Disable all interrupts */
cc110x_gdo2_enable();
cc110x_gdo0_disable();
restoreIRQ(state); /* Enable all interrupts */
}
interrupt(CC1101_VECTOR) __attribute__((naked)) cc110x_isr(void)
{
__enter_isr();
/* Check IFG */
if (RF1AIV == RF1AIV_RFIFG2) {
while (RF1AIN & BIT2);
/* discard all further interrupts */
RF1AIV = 0;
cc110x_gdo2_irq();
}
if (RF1AIV == RF1AIV_RFIFG0) {
cc110x_gdo0_irq();
RF1AIE &= ~BIT0;
}
__exit_isr();
}

View File

@ -0,0 +1,418 @@
/* *************************************************************************************************
*
* Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* *************************************************************************************************
* Basic display functions.
* ************************************************************************************************/
/* *************************************************************************************************
* Include section
*/
/* system */
#include <string.h>
/* driver */
#include <cc430f6137.h>
#include <display.h>
/**************************************************************************************************
* Prototypes section */
void write_lcd_mem(uint8_t *lcdmem, uint8_t bits, uint8_t bitmask, uint8_t state);
void clear_line(uint8_t line);
void display_symbol(uint8_t symbol, uint8_t mode);
/* *************************************************************************************************
* Global Variable section */
/* Display flags */
volatile s_display_flags_t display;
/* Global return string for itoa function */
char itoa_str[8];
void lcd_init(void)
{
/* Clear entire display memory */
LCDBMEMCTL |= LCDCLRBM + LCDCLRM;
/* LCD_FREQ = ACLK/16/8 = 256Hz */
/* Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on */
LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;
/* LCB_BLK_FREQ = ACLK/8/4096 = 1Hz */
LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;
/* I/O to COM outputs */
P5SEL |= (BIT5 | BIT6 | BIT7);
P5DIR |= (BIT5 | BIT6 | BIT7);
/* Activate LCD output */
LCDBPCTL0 = 0xFFFF; /* Select LCD segments S0-S15 */
LCDBPCTL1 = 0x00FF; /* Select LCD segments S16-S22 */
#ifdef USE_LCD_CHARGE_PUMP
/* Charge pump voltage generated internally, internal bias (V2-V4) generation */
LCDBVCTL = LCDCPEN | VLCD_2_72;
#endif
}
void clear_display_all(void)
{
// Clear generic content
clear_line(LINE1);
clear_line(LINE2);
}
void clear_display(void)
{
clear_line(LINE1);
clear_line(LINE2);
}
void clear_line(uint8_t line)
{
display_chars(switch_seg(line, LCD_SEG_L1_3_0, LCD_SEG_L2_5_0), NULL, SEG_OFF);
if (line == LINE1) {
display_symbol(LCD_SEG_L1_DP1, SEG_OFF);
display_symbol(LCD_SEG_L1_DP0, SEG_OFF);
display_symbol(LCD_SEG_L1_COL, SEG_OFF);
}
/* line == LINE2 */
else {
display_symbol(LCD_SEG_L2_DP, SEG_OFF);
display_symbol(LCD_SEG_L2_COL1, SEG_OFF);
display_symbol(LCD_SEG_L2_COL0, SEG_OFF);
}
}
void write_lcd_mem(uint8_t *lcdmem, uint8_t bits, uint8_t bitmask, uint8_t state)
{
if (state == SEG_ON) {
/* Clear segments before writing */
*lcdmem = (uint8_t)(*lcdmem & ~bitmask);
/* Set visible segments */
*lcdmem = (uint8_t)(*lcdmem | bits);
}
else if (state == SEG_OFF) {
/* Clear segments */
*lcdmem = (uint8_t)(*lcdmem & ~bitmask);
}
else if (state == SEG_ON_BLINK_ON) {
/* Clear visible / blink segments before writing */
*lcdmem = (uint8_t)(*lcdmem & ~bitmask);
*(lcdmem + 0x20) = (uint8_t)(*(lcdmem + 0x20) & ~bitmask);
/* Set visible / blink segments */
*lcdmem = (uint8_t)(*lcdmem | bits);
*(lcdmem + 0x20) = (uint8_t)(*(lcdmem + 0x20) | bits);
}
else if (state == SEG_ON_BLINK_OFF) {
/* Clear visible segments before writing */
*lcdmem = (uint8_t)(*lcdmem & ~bitmask);
/* Set visible segments */
*lcdmem = (uint8_t)(*lcdmem | bits);
/* Clear blink segments */
*(lcdmem + 0x20) = (uint8_t)(*(lcdmem + 0x20) & ~bitmask);
}
else if (state == SEG_OFF_BLINK_OFF) {
/* Clear segments */
*lcdmem = (uint8_t)(*lcdmem & ~bitmask);
/* Clear blink segments */
*(lcdmem + 0x20) = (uint8_t)(*(lcdmem + 0x20) & ~bitmask);
}
}
char *itoa(uint32_t n, uint8_t digits, uint8_t blanks)
{
uint8_t i;
uint8_t digits1 = digits;
/* Preset result string */
memcpy(itoa_str, "0000000", 7);
/* Return empty string if number of digits is invalid (valid range for digits: 1-7) */
if ((digits == 0) || (digits > 7)) {
return (itoa_str);
}
/* Numbers 0 .. 180 can be copied from itoa_conversion_table without conversion */
if (n <= 180) {
if (digits >= 3) {
memcpy(itoa_str + (digits - 3), itoa_conversion_table[n], 3);
}
/* digits == 1 || 2 */
else {
memcpy(itoa_str, itoa_conversion_table[n] + (3 - digits), digits);
}
}
/* For n > 180 need to calculate string content */
else {
/* Calculate digits from least to most significant number */
do {
itoa_str[digits - 1] = n % 10 + '0';
n /= 10;
}
while (--digits > 0);
}
/* Remove specified number of leading '0', always keep last one */
i = 0;
while ((itoa_str[i] == '0') && (i < digits1 - 1)) {
if (blanks > 0) {
/* Convert only specified number of leading '0' */
itoa_str[i] = ' ';
blanks--;
}
i++;
}
return (itoa_str);
}
void display_value1(uint8_t segments, uint32_t value, uint8_t digits, uint8_t blanks, uint8_t disp_mode)
{
char *str;
str = itoa(value, digits, blanks);
/* Display string in blink mode */
display_chars(segments, str, disp_mode);
}
void display_symbol(uint8_t symbol, uint8_t mode)
{
uint8_t *lcdmem;
uint8_t bits;
uint8_t bitmask;
if (symbol <= LCD_SEG_L2_DP) {
/* Get LCD memory address for symbol from table */
lcdmem = (uint8_t *)segments_lcdmem[symbol];
/* Get bits for symbol from table */
bits = segments_bitmask[symbol];
/* Bitmask for symbols equals bits */
bitmask = bits;
/* Write LCD memory */
write_lcd_mem(lcdmem, bits, bitmask, mode);
}
}
void display_char(uint8_t segment, char chr, uint8_t mode)
{
uint8_t *lcdmem; /* Pointer to LCD memory */
uint8_t bitmask; /* Bitmask for character */
uint8_t bits, bits1; /* Bits to write */
/* Write to single 7-segment character */
if ((segment >= LCD_SEG_L1_3) && (segment <= LCD_SEG_L2_DP)) {
/* Get LCD memory address for segment from table */
lcdmem = (uint8_t *)segments_lcdmem[segment];
/* Get bitmask for character from table */
bitmask = segments_bitmask[segment];
/* Get bits from font set */
if ((chr >= 0x30) && (chr <= 0x5A)) {
/* Use font set */
bits = lcd_font[chr - 0x30];
}
else if (chr == 0x2D) {
/* '-' not in font set */
bits = BIT1;
}
else {
/* Other characters map to ' ' (blank) */
bits = 0;
}
/* When addressing LINE2 7-segment characters need to swap high- and low-nibble, */
/* because LCD COM/SEG assignment is mirrored against LINE1 */
if (segment >= LCD_SEG_L2_5) {
bits1 = ((bits << 4) & 0xF0) | ((bits >> 4) & 0x0F);
bits = bits1;
/* When addressing LCD_SEG_L2_5, need to convert ASCII '1' and 'L' to 1 bit, */
/* because LCD COM/SEG assignment is special for this incomplete character */
if (segment == LCD_SEG_L2_5) {
if ((chr == '1') || (chr == 'L')) {
bits = BIT7;
}
}
}
/* Physically write to LCD memory */
write_lcd_mem(lcdmem, bits, bitmask, mode);
}
}
void display_chars(uint8_t segments, char *str, uint8_t mode)
{
uint8_t i;
uint8_t length = 0; /* Write length */
uint8_t char_start = 0; /* Starting point for consecutive write */
switch (segments) {
/* LINE1 */
case LCD_SEG_L1_3_0:
length = 4;
char_start = LCD_SEG_L1_3;
break;
case LCD_SEG_L1_2_0:
length = 3;
char_start = LCD_SEG_L1_2;
break;
case LCD_SEG_L1_1_0:
length = 2;
char_start = LCD_SEG_L1_1;
break;
case LCD_SEG_L1_3_1:
length = 3;
char_start = LCD_SEG_L1_3;
break;
case LCD_SEG_L1_3_2:
length = 2;
char_start = LCD_SEG_L1_3;
break;
/* LINE2 */
case LCD_SEG_L2_5_0:
length = 6;
char_start = LCD_SEG_L2_5;
break;
case LCD_SEG_L2_4_0:
length = 5;
char_start = LCD_SEG_L2_4;
break;
case LCD_SEG_L2_3_0:
length = 4;
char_start = LCD_SEG_L2_3;
break;
case LCD_SEG_L2_2_0:
length = 3;
char_start = LCD_SEG_L2_2;
break;
case LCD_SEG_L2_1_0:
length = 2;
char_start = LCD_SEG_L2_1;
break;
case LCD_SEG_L2_5_4:
length = 2;
char_start = LCD_SEG_L2_5;
break;
case LCD_SEG_L2_5_2:
length = 4;
char_start = LCD_SEG_L2_5;
break;
case LCD_SEG_L2_3_2:
length = 2;
char_start = LCD_SEG_L2_3;
break;
case LCD_SEG_L2_4_2:
length = 3;
char_start = LCD_SEG_L2_4;
break;
}
/* Write to consecutive digits */
for (i = 0; i < length; i++) {
/* Use single character routine to write display memory */
display_char(char_start + i, *(str + i), mode);
}
}
uint8_t switch_seg(uint8_t line, uint8_t index1, uint8_t index2)
{
if (line == LINE1) {
return index1;
}
/* line == LINE2 */
else {
return index2;
}
}
void start_blink(void)
{
LCDBBLKCTL |= LCDBLKMOD0;
}
void stop_blink(void)
{
LCDBBLKCTL &= ~LCDBLKMOD0;
}
void clear_blink_mem(void)
{
LCDBMEMCTL |= LCDCLRBM;
}
void set_blink_rate(uint8_t bits)
{
LCDBBLKCTL &= ~(BIT7 | BIT6 | BIT5);
LCDBBLKCTL |= bits;
}
void display_all_off(void)
{
uint8_t *lcdptr = (uint8_t *)0x0A20;
uint8_t i;
for (i = 1; i <= 12; i++) {
*lcdptr = 0x00;
lcdptr++;
}
}

View File

@ -0,0 +1,208 @@
/* *************************************************************************************************
*
* Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ************************************************************************************************/
/* Basic display functions. */
/* ************************************************************************************************* */
/* ************************************************************************************************* */
/* Include section */
#include <stdint.h>
#include <cc430f6137.h>
#include <display.h>
/* ************************************************************************************************* */
/* Global Variable section */
/* Table with memory bit assignment for digits "0" to "9" and characters "A" to "Z" */
/* A */
/* F B */
/* G */
/* E C */
/* D */
const uint8_t lcd_font[] = {
SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F, /* Displays "0" */
SEG_B + SEG_C, /* Displays "1" */
SEG_A + SEG_B + SEG_D + SEG_E + SEG_G, /* Displays "2" */
SEG_A + SEG_B + SEG_C + SEG_D + SEG_G, /* Displays "3" */
SEG_B + SEG_C + SEG_F + SEG_G, /* Displays "4" */
SEG_A + SEG_C + SEG_D + SEG_F + SEG_G, /* Displays "5" */
SEG_A + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G, /* Displays "6" */
SEG_A + SEG_B + SEG_C, /* Displays "7" */
SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G, /* Displays "8" */
SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G, /* Displays "9" */
0, /* Displays " " (:) */
0, /* Displays " " (;) */
SEG_A + SEG_F + SEG_G, /* Displays "<" as high c */
SEG_D + SEG_G, /* Displays "=" */
0, /* Displays " " (>) */
SEG_A + SEG_B + SEG_E + SEG_G, /* Displays "?" */
0, /* Displays " " (@) */
SEG_A + SEG_B + SEG_C + SEG_E + SEG_F + SEG_G, /* Displays "A" */
SEG_C + SEG_D + SEG_E + SEG_F + SEG_G, /* Displays "b" */
SEG_D + SEG_E + SEG_G, /* Displays "c" */
SEG_B + SEG_C + SEG_D + SEG_E + SEG_G, /* Displays "d" */
SEG_A + SEG_D + SEG_E + SEG_F + SEG_G, /* Displays "E" */
SEG_A + SEG_E + SEG_F + SEG_G, /* Displays "f" */
SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G, /* Displays "g" same as 9 */
SEG_C + SEG_E + SEG_F + SEG_G, /* Displays "h" */
SEG_E, /* Displays "i" */
SEG_A + SEG_B + SEG_C + SEG_D, /* Displays "J" */
SEG_D + SEG_F + SEG_G, /* Displays "k" */
SEG_D + SEG_E + SEG_F, /* Displays "L" */
SEG_A + SEG_B + SEG_C + SEG_E + SEG_F, /* Displays "M" */
SEG_C + SEG_E + SEG_G, /* Displays "n" */
SEG_C + SEG_D + SEG_E + SEG_G, /* Displays "o" */
SEG_A + SEG_B + SEG_E + SEG_F + SEG_G, /* Displays "P" */
SEG_A + SEG_B + SEG_C + SEG_F + SEG_G, /* Displays "q" */
SEG_E + SEG_G, /* Displays "r" */
SEG_A + SEG_C + SEG_D + SEG_F + SEG_G, /* Displays "S" same as 5 */
SEG_D + SEG_E + SEG_F + SEG_G, /* Displays "t" */
SEG_C + SEG_D + SEG_E, /* Displays "u" */
SEG_C + SEG_D + SEG_E, /* Displays "v" same as u */
SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G, /* Displays "W" */
SEG_B + SEG_C + SEG_E + SEG_F + SEG_G, /* Displays "X" as H */
SEG_B + SEG_C + SEG_D + SEG_F + SEG_G, /* Displays "Y" */
SEG_A + SEG_B + SEG_D + SEG_E + SEG_G, /* Displays "Z" same as 2 */
};
/* Table with memory address for each display element */
const uint8_t *segments_lcdmem[] = {
LCD_SYMB_AM_MEM,
LCD_SYMB_PM_MEM,
LCD_SYMB_ARROW_UP_MEM,
LCD_SYMB_ARROW_DOWN_MEM,
LCD_SYMB_PERCENT_MEM,
LCD_SYMB_TOTAL_MEM,
LCD_SYMB_AVERAGE_MEM,
LCD_SYMB_MAX_MEM,
LCD_SYMB_BATTERY_MEM,
LCD_UNIT_L1_FT_MEM,
LCD_UNIT_L1_K_MEM,
LCD_UNIT_L1_M_MEM,
LCD_UNIT_L1_I_MEM,
LCD_UNIT_L1_PER_S_MEM,
LCD_UNIT_L1_PER_H_MEM,
LCD_UNIT_L1_DEGREE_MEM,
LCD_UNIT_L2_KCAL_MEM,
LCD_UNIT_L2_KM_MEM,
LCD_UNIT_L2_MI_MEM,
LCD_ICON_HEART_MEM,
LCD_ICON_STOPWATCH_MEM,
LCD_ICON_RECORD_MEM,
LCD_ICON_ALARM_MEM,
LCD_ICON_BEEPER1_MEM,
LCD_ICON_BEEPER2_MEM,
LCD_ICON_BEEPER3_MEM,
LCD_SEG_L1_3_MEM,
LCD_SEG_L1_2_MEM,
LCD_SEG_L1_1_MEM,
LCD_SEG_L1_0_MEM,
LCD_SEG_L1_COL_MEM,
LCD_SEG_L1_DP1_MEM,
LCD_SEG_L1_DP0_MEM,
LCD_SEG_L2_5_MEM,
LCD_SEG_L2_4_MEM,
LCD_SEG_L2_3_MEM,
LCD_SEG_L2_2_MEM,
LCD_SEG_L2_1_MEM,
LCD_SEG_L2_0_MEM,
LCD_SEG_L2_COL1_MEM,
LCD_SEG_L2_COL0_MEM,
LCD_SEG_L2_DP_MEM,
};
/* Table with bit mask for each display element */
const uint8_t segments_bitmask[] = {
LCD_SYMB_AM_MASK,
LCD_SYMB_PM_MASK,
LCD_SYMB_ARROW_UP_MASK,
LCD_SYMB_ARROW_DOWN_MASK,
LCD_SYMB_PERCENT_MASK,
LCD_SYMB_TOTAL_MASK,
LCD_SYMB_AVERAGE_MASK,
LCD_SYMB_MAX_MASK,
LCD_SYMB_BATTERY_MASK,
LCD_UNIT_L1_FT_MASK,
LCD_UNIT_L1_K_MASK,
LCD_UNIT_L1_M_MASK,
LCD_UNIT_L1_I_MASK,
LCD_UNIT_L1_PER_S_MASK,
LCD_UNIT_L1_PER_H_MASK,
LCD_UNIT_L1_DEGREE_MASK,
LCD_UNIT_L2_KCAL_MASK,
LCD_UNIT_L2_KM_MASK,
LCD_UNIT_L2_MI_MASK,
LCD_ICON_HEART_MASK,
LCD_ICON_STOPWATCH_MASK,
LCD_ICON_RECORD_MASK,
LCD_ICON_ALARM_MASK,
LCD_ICON_BEEPER1_MASK,
LCD_ICON_BEEPER2_MASK,
LCD_ICON_BEEPER3_MASK,
LCD_SEG_L1_3_MASK,
LCD_SEG_L1_2_MASK,
LCD_SEG_L1_1_MASK,
LCD_SEG_L1_0_MASK,
LCD_SEG_L1_COL_MASK,
LCD_SEG_L1_DP1_MASK,
LCD_SEG_L1_DP0_MASK,
LCD_SEG_L2_5_MASK,
LCD_SEG_L2_4_MASK,
LCD_SEG_L2_3_MASK,
LCD_SEG_L2_2_MASK,
LCD_SEG_L2_1_MASK,
LCD_SEG_L2_0_MASK,
LCD_SEG_L2_COL1_MASK,
LCD_SEG_L2_COL0_MASK,
LCD_SEG_L2_DP_MASK,
};
/* Quick integer to array conversion table for most common integer values
* discarding this would save aprox. 600 bytes codespace but increase cpu time
* for displaying values */
const uint8_t itoa_conversion_table[][3] = {
"000", "001", "002", "003", "004", "005", "006", "007", "008", "009", "010", "011", "012", "013", "014", "015",
"016", "017", "018", "019", "020", "021", "022", "023", "024", "025", "026", "027", "028", "029", "030", "031",
"032", "033", "034", "035", "036", "037", "038", "039", "040", "041", "042", "043", "044", "045", "046", "047",
"048", "049", "050", "051", "052", "053", "054", "055", "056", "057", "058", "059", "060", "061", "062", "063",
"064", "065", "066", "067", "068", "069", "070", "071", "072", "073", "074", "075", "076", "077", "078", "079",
"080", "081", "082", "083", "084", "085", "086", "087", "088", "089", "090", "091", "092", "093", "094", "095",
"096", "097", "098", "099", "100", "101", "102", "103", "104", "105", "106", "107", "108", "109", "110", "111",
"112", "113", "114", "115", "116", "117", "118", "119", "120", "121", "122", "123", "124", "125", "126", "127",
"128", "129", "130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "140", "141", "142", "143",
"144", "145", "146", "147", "148", "149", "150", "151", "152", "153", "154", "155", "156", "157", "158", "159",
"160", "161", "162", "163", "164", "165", "166", "167", "168", "169", "170", "171", "172", "173", "174", "175",
"176", "177", "178", "179", "180",
};

View File

@ -0,0 +1,45 @@
#include <stdio.h>
#include <display.h>
#include <string.h>
extern int toupper(int c);
extern void (*_putchar)(int c);
static char display_buf[11];
void putchar_to_display(int c);
void init_display_putchar(void)
{
memset(display_buf, '\0', 11);
_putchar = putchar_to_display;
}
void putchar_to_display(int c)
{
if (c == '\n') {
display_buf[4] = 1;
return;
}
if (display_buf[4]) {
memset(display_buf, '\0', 11);
}
else {
display_buf[0] = display_buf[1];
display_buf[1] = display_buf[2];
display_buf[2] = display_buf[3];
display_buf[3] = display_buf[5];
display_buf[5] = display_buf[6];
display_buf[6] = display_buf[7];
display_buf[7] = display_buf[8];
display_buf[8] = display_buf[9];
}
display_buf[9] = toupper(c);
clear_display_all();
display_chars(LCD_SEG_L1_3_0, display_buf, SEG_ON);
display_chars(LCD_SEG_L2_5_0, display_buf + 4, SEG_ON);
}

View File

@ -0,0 +1,6 @@
#ifndef BATTERY_H
#define BATTERY_H
uint32_t battery_get_voltage(void);
#endif /* BATTERY_H */

View File

@ -0,0 +1,6 @@
#ifndef BUZZER_H
#define BUZZER_H
void buzzer_beep(uint8_t pitch, uint16_t duration);
#endif /* BUZZER_H */

View File

@ -0,0 +1,458 @@
/* *************************************************************************************************
*
* Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* *************************************************************************************************
* Basic display functions.
* ************************************************************************************************/
#ifndef __DISPLAY_H
#define __DISPLAY_H
#define CLOCK_24HR (0)
#define CLOCK_AM_PM (1)
#define CLOCK_DISPLAY_SELECT (2)
/* *************************************************************************************************
* Global Variable section */
/* Set of display flags */
typedef union {
struct {
/* Line1 + Line2 + Icons*/
uint16_t full_update : 1; /* 1 = Redraw all content */
uint16_t partial_update : 1; /* 1 = Update changes */
/* Line only */
uint16_t line1_full_update : 1; /* 1 = Redraw Line1 content */
uint16_t line2_full_update : 1; /* 1 = Redraw Line2 content */
/* Logic module data update flags */
uint16_t update_time : 1; /* 1 = Time was updated */
uint16_t update_stopwatch : 1; /* 1 = Stopwatch was updated */
uint16_t update_temperature : 1; /* 1 = Temperature was updated */
uint16_t update_battery_voltage : 1; /* 1 = Battery voltage was updated */
uint16_t update_date : 1; /* 1 = Date was updated */
uint16_t update_alarm : 1; /* 1 = Alarm time was updated */
uint16_t update_acceleration : 1; /* 1 = Acceleration data was updated */
} flag;
uint16_t all_flags; /* Shortcut to all display flags (for reset) */
} s_display_flags_t;
extern volatile s_display_flags_t display;
/* Constants defined in library */
extern const uint8_t lcd_font[];
extern const uint8_t *segments_lcdmem[];
extern const uint8_t segments_bitmask[];
extern const uint8_t itoa_conversion_table[][3];
/* ************************************************************************************************* */
/* Defines section */
/* Display function modes */
#define DISPLAY_LINE_UPDATE_FULL (BIT0)
#define DISPLAY_LINE_UPDATE_PARTIAL (BIT1)
#define DISPLAY_LINE_CLEAR (BIT2)
/* Definitions for line view style */
#define DISPLAY_DEFAULT_VIEW (0u)
#define DISPLAY_ALTERNATIVE_VIEW (1u)
#define DISPLAY_ALTERNATIVE2_VIEW (2u)
/* Definitions for line access */
#define LINE1 (1u)
#define LINE2 (2u)
/* LCD display modes */
#define SEG_OFF (0u)
#define SEG_ON (1u)
#define SEG_ON_BLINK_ON (2u)
#define SEG_ON_BLINK_OFF (3u)
#define SEG_OFF_BLINK_OFF (4u)
/* 7-segment character bit assignments */
#define SEG_A (BIT4)
#define SEG_B (BIT5)
#define SEG_C (BIT6)
#define SEG_D (BIT7)
#define SEG_E (BIT2)
#define SEG_F (BIT0)
#define SEG_G (BIT1)
/* ------------------------------------------
* LCD symbols for easier access
*
* xxx_SEG_xxx = Seven-segment character (sequence 5-4-3-2-1-0)
* xxx_SYMB_xxx = Display symbol, e.g. "AM" for ante meridiem
* xxx_UNIT_xxx = Display unit, e.g. "km/h" for kilometers per hour
* xxx_ICON_xxx = Display icon, e.g. heart to indicate reception of heart rate data
* xxx_L1_xxx = Item is part of Line1 information
* xxx_L2_xxx = Item is part of Line2 information
*/
//* Symbols for Line1 */
#define LCD_SYMB_AM 0
#define LCD_SYMB_PM 1
#define LCD_SYMB_ARROW_UP 2
#define LCD_SYMB_ARROW_DOWN 3
#define LCD_SYMB_PERCENT 4
/* Symbols for Line2 */
#define LCD_SYMB_TOTAL 5
#define LCD_SYMB_AVERAGE 6
#define LCD_SYMB_MAX 7
#define LCD_SYMB_BATTERY 8
/* Units for Line1 */
#define LCD_UNIT_L1_FT 9
#define LCD_UNIT_L1_K 10
#define LCD_UNIT_L1_M 11
#define LCD_UNIT_L1_I 12
#define LCD_UNIT_L1_PER_S 13
#define LCD_UNIT_L1_PER_H 14
#define LCD_UNIT_L1_DEGREE 15
/* Units for Line2 */
#define LCD_UNIT_L2_KCAL 16
#define LCD_UNIT_L2_KM 17
#define LCD_UNIT_L2_MI 18
/* Icons */
#define LCD_ICON_HEART 19
#define LCD_ICON_STOPWATCH 20
#define LCD_ICON_RECORD 21
#define LCD_ICON_ALARM 22
#define LCD_ICON_BEEPER1 23
#define LCD_ICON_BEEPER2 24
#define LCD_ICON_BEEPER3 25
/* Line1 7-segments */
#define LCD_SEG_L1_3 26
#define LCD_SEG_L1_2 27
#define LCD_SEG_L1_1 28
#define LCD_SEG_L1_0 29
#define LCD_SEG_L1_COL 30
#define LCD_SEG_L1_DP1 31
#define LCD_SEG_L1_DP0 32
/* Line2 7-segments */
#define LCD_SEG_L2_5 33
#define LCD_SEG_L2_4 34
#define LCD_SEG_L2_3 35
#define LCD_SEG_L2_2 36
#define LCD_SEG_L2_1 37
#define LCD_SEG_L2_0 38
#define LCD_SEG_L2_COL1 39
#define LCD_SEG_L2_COL0 40
#define LCD_SEG_L2_DP 41
/* Line1 7-segment arrays */
#define LCD_SEG_L1_3_0 70
#define LCD_SEG_L1_2_0 71
#define LCD_SEG_L1_1_0 72
#define LCD_SEG_L1_3_1 73
#define LCD_SEG_L1_3_2 74
/* Line2 7-segment arrays */
#define LCD_SEG_L2_5_0 90
#define LCD_SEG_L2_4_0 91
#define LCD_SEG_L2_3_0 92
#define LCD_SEG_L2_2_0 93
#define LCD_SEG_L2_1_0 94
#define LCD_SEG_L2_5_2 95
#define LCD_SEG_L2_3_2 96
#define LCD_SEG_L2_5_4 97
#define LCD_SEG_L2_4_2 98
/* LCD controller memory map */
#define LCD_MEM_1 ((uint8_t*)0x0A20)
#define LCD_MEM_2 ((uint8_t*)0x0A21)
#define LCD_MEM_3 ((uint8_t*)0x0A22)
#define LCD_MEM_4 ((uint8_t*)0x0A23)
#define LCD_MEM_5 ((uint8_t*)0x0A24)
#define LCD_MEM_6 ((uint8_t*)0x0A25)
#define LCD_MEM_7 ((uint8_t*)0x0A26)
#define LCD_MEM_8 ((uint8_t*)0x0A27)
#define LCD_MEM_9 ((uint8_t*)0x0A28)
#define LCD_MEM_10 ((uint8_t*)0x0A29)
#define LCD_MEM_11 ((uint8_t*)0x0A2A)
#define LCD_MEM_12 ((uint8_t*)0x0A2B)
/* Memory assignment */
#define LCD_SEG_L1_0_MEM (LCD_MEM_6)
#define LCD_SEG_L1_1_MEM (LCD_MEM_4)
#define LCD_SEG_L1_2_MEM (LCD_MEM_3)
#define LCD_SEG_L1_3_MEM (LCD_MEM_2)
#define LCD_SEG_L1_COL_MEM (LCD_MEM_1)
#define LCD_SEG_L1_DP1_MEM (LCD_MEM_1)
#define LCD_SEG_L1_DP0_MEM (LCD_MEM_5)
#define LCD_SEG_L2_0_MEM (LCD_MEM_8)
#define LCD_SEG_L2_1_MEM (LCD_MEM_9)
#define LCD_SEG_L2_2_MEM (LCD_MEM_10)
#define LCD_SEG_L2_3_MEM (LCD_MEM_11)
#define LCD_SEG_L2_4_MEM (LCD_MEM_12)
#define LCD_SEG_L2_5_MEM (LCD_MEM_12)
#define LCD_SEG_L2_COL1_MEM (LCD_MEM_1)
#define LCD_SEG_L2_COL0_MEM (LCD_MEM_5)
#define LCD_SEG_L2_DP_MEM (LCD_MEM_9)
#define LCD_SYMB_AM_MEM (LCD_MEM_1)
#define LCD_SYMB_PM_MEM (LCD_MEM_1)
#define LCD_SYMB_ARROW_UP_MEM (LCD_MEM_1)
#define LCD_SYMB_ARROW_DOWN_MEM (LCD_MEM_1)
#define LCD_SYMB_PERCENT_MEM (LCD_MEM_5)
#define LCD_SYMB_TOTAL_MEM (LCD_MEM_11)
#define LCD_SYMB_AVERAGE_MEM (LCD_MEM_10)
#define LCD_SYMB_MAX_MEM (LCD_MEM_8)
#define LCD_SYMB_BATTERY_MEM (LCD_MEM_7)
#define LCD_UNIT_L1_FT_MEM (LCD_MEM_5)
#define LCD_UNIT_L1_K_MEM (LCD_MEM_5)
#define LCD_UNIT_L1_M_MEM (LCD_MEM_7)
#define LCD_UNIT_L1_I_MEM (LCD_MEM_7)
#define LCD_UNIT_L1_PER_S_MEM (LCD_MEM_5)
#define LCD_UNIT_L1_PER_H_MEM (LCD_MEM_7)
#define LCD_UNIT_L1_DEGREE_MEM (LCD_MEM_5)
#define LCD_UNIT_L2_KCAL_MEM (LCD_MEM_7)
#define LCD_UNIT_L2_KM_MEM (LCD_MEM_7)
#define LCD_UNIT_L2_MI_MEM (LCD_MEM_7)
#define LCD_ICON_HEART_MEM (LCD_MEM_2)
#define LCD_ICON_STOPWATCH_MEM (LCD_MEM_3)
#define LCD_ICON_RECORD_MEM (LCD_MEM_1)
#define LCD_ICON_ALARM_MEM (LCD_MEM_4)
#define LCD_ICON_BEEPER1_MEM (LCD_MEM_5)
#define LCD_ICON_BEEPER2_MEM (LCD_MEM_6)
#define LCD_ICON_BEEPER3_MEM (LCD_MEM_7)
/* Bit masks for write access */
#define LCD_SEG_L1_0_MASK (BIT2+BIT1+BIT0+BIT7+BIT6+BIT5+BIT4)
#define LCD_SEG_L1_1_MASK (BIT2+BIT1+BIT0+BIT7+BIT6+BIT5+BIT4)
#define LCD_SEG_L1_2_MASK (BIT2+BIT1+BIT0+BIT7+BIT6+BIT5+BIT4)
#define LCD_SEG_L1_3_MASK (BIT2+BIT1+BIT0+BIT7+BIT6+BIT5+BIT4)
#define LCD_SEG_L1_COL_MASK (BIT5)
#define LCD_SEG_L1_DP1_MASK (BIT6)
#define LCD_SEG_L1_DP0_MASK (BIT2)
#define LCD_SEG_L2_0_MASK (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
#define LCD_SEG_L2_1_MASK (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
#define LCD_SEG_L2_2_MASK (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
#define LCD_SEG_L2_3_MASK (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
#define LCD_SEG_L2_4_MASK (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
#define LCD_SEG_L2_5_MASK (BIT7)
#define LCD_SEG_L2_COL1_MASK (BIT4)
#define LCD_SEG_L2_COL0_MASK (BIT0)
#define LCD_SEG_L2_DP_MASK (BIT7)
#define LCD_SYMB_AM_MASK (BIT1+BIT0)
#define LCD_SYMB_PM_MASK (BIT0)
#define LCD_SYMB_ARROW_UP_MASK (BIT2)
#define LCD_SYMB_ARROW_DOWN_MASK (BIT3)
#define LCD_SYMB_PERCENT_MASK (BIT4)
#define LCD_SYMB_TOTAL_MASK (BIT7)
#define LCD_SYMB_AVERAGE_MASK (BIT7)
#define LCD_SYMB_MAX_MASK (BIT7)
#define LCD_SYMB_BATTERY_MASK (BIT7)
#define LCD_UNIT_L1_FT_MASK (BIT5)
#define LCD_UNIT_L1_K_MASK (BIT6)
#define LCD_UNIT_L1_M_MASK (BIT1)
#define LCD_UNIT_L1_I_MASK (BIT0)
#define LCD_UNIT_L1_PER_S_MASK (BIT7)
#define LCD_UNIT_L1_PER_H_MASK (BIT2)
#define LCD_UNIT_L1_DEGREE_MASK (BIT1)
#define LCD_UNIT_L2_KCAL_MASK (BIT4)
#define LCD_UNIT_L2_KM_MASK (BIT5)
#define LCD_UNIT_L2_MI_MASK (BIT6)
#define LCD_ICON_HEART_MASK (BIT3)
#define LCD_ICON_STOPWATCH_MASK (BIT3)
#define LCD_ICON_RECORD_MASK (BIT7)
#define LCD_ICON_ALARM_MASK (BIT3)
#define LCD_ICON_BEEPER1_MASK (BIT3)
#define LCD_ICON_BEEPER2_MASK (BIT3)
#define LCD_ICON_BEEPER3_MASK (BIT3)
/* *************************************************************************************************
* API section
*/
/* Physical LCD memory write */
/* *************************************************************************************************
* @fn write_segment
* @brief Write to one or multiple LCD segments
* @param lcdmem Pointer to LCD byte memory
* bits Segments to address
* bitmask Bitmask for particular display item
* mode On, off or blink segments
* @return
* ************************************************************************************************/
void write_lcd_mem(uint8_t *lcdmem, uint8_t bits, uint8_t bitmask, uint8_t state);
/* Display init / clear */
/* *************************************************************************************************
* @fn lcd_init
* @brief Erase LCD memory. Init LCD peripheral.
* @param none
* @return none
* ************************************************************************************************/
void lcd_init(void);
/* *************************************************************************************************
* @fn clear_display
* @brief Erase LINE1 and LINE2 segments. Keep icons.
* @param none
* @return none
* ************************************************************************************************/
void clear_display(void);
/* *************************************************************************************************
* @fn clear_display_all
* @brief Erase LINE1 and LINE2 segments. Clear also function-specific content.
* @param none
* @return none
* ************************************************************************************************/
void clear_display_all(void);
/* *************************************************************************************************
* @fn clear_line
* @brief Erase segments of a given line.
* @param uint8_t line LINE1, LINE2
* @return none
* ************************************************************************************************/
void clear_line(uint8_t line);
/* Blinking function */
/* *************************************************************************************************
* @fn start_blink
* @brief Start blinking.
* @param none
* @return none
* ************************************************************************************************/
void start_blink(void);
/* *************************************************************************************************
* @fn stop_blink
* @brief Stop blinking.
* @param none
* @return none
* ************************************************************************************************/
void stop_blink(void);
/* *************************************************************************************************
* @fn stop_blink
* @brief Clear blinking memory.
* @param none
* @return none
* ************************************************************************************************/
void clear_blink_mem(void);
/* *************************************************************************************************
* @fn set_blink_rate
* @brief Set blink rate register bits.
* @param none
* @return none
* ************************************************************************************************/
void set_blink_rate(uint8_t bits);
/* Character / symbol draw functions */
/* *************************************************************************************************
* @fn display_char
* @brief Write to 7-segment characters.
* @param uint8_t segment A valid LCD segment
* uint8_t chr Character to display
* uint8_t mode SEG_ON, SEG_OFF, SEG_BLINK
* @return none
* ************************************************************************************************/
void display_char(uint8_t segment, char chr, uint8_t mode);
/* *************************************************************************************************
* @FN display_chars
* @brief Write to consecutive 7-segment characters.
* @param uint8_t segments LCD segment array
* uint8_t * str Pointer to a string
* uint8_t mode SEG_ON, SEG_OFF, SEG_BLINK
* @return none
* ************************************************************************************************/
void display_chars(uint8_t segments, char *str, uint8_t mode);
/* *************************************************************************************************
* @fn display_symbol
* @brief Switch symbol on or off on LCD.
* @param uint8_t symbol A valid LCD symbol (index 0..42)
* uint8_t state SEG_ON, SEG_OFF, SEG_BLINK
* @return none
* ************************************************************************************************/
void display_symbol(uint8_t symbol, uint8_t mode);
/* Set_value display functions */
/* *************************************************************************************************
* @fn display_value1
* @brief Generic decimal display routine. Used exclusively by set_value function.
* @param uint8_t segments LCD segments where value is displayed
* uint32_t value Integer value to be displayed
* uint8_t digits Number of digits to convert
* uint8_t blanks Number of leadings blanks in itoa result string
* @return none
* ************************************************************************************************/
void display_value1(uint8_t segments, uint32_t value, uint8_t digits, uint8_t blanks, uint8_t disp_mode);
/* Integer to string conversion */
/* *************************************************************************************************
* @fn itoa
* @brief Generic integer to array routine. Converts integer n to string.
* Default conversion result has leading zeros, e.g. "00123"
* Option to convert leading '0' into whitespace (blanks)
* @param uint32_t n integer to convert
* uint8_t digits number of digits
* uint8_t blanks fill up result string with number of whitespaces instead of leading zeros
* @return uint8_t string
* ************************************************************************************************/
char *itoa(uint32_t n, uint8_t digits, uint8_t blanks);
/* Segment index helper function */
/* *************************************************************************************************
* @fn switch_seg
* @brief Returns index of 7-segment character. Required for display routines that can draw
* information on both lines.
* @param uint8_t line LINE1, LINE2
* uint8_t index1 Index of LINE1
* uint8_t index2 Index of LINE2
* @return uint8
* ************************************************************************************************/
uint8_t switch_seg(uint8_t line, uint8_t index1, uint8_t index2);
/* *************************************************************************************************
* @fn display_all_off
* @brief Sets everything of on the display
* @param none
* @return none
* ************************************************************************************************/
void display_all_off(void);
#endif /* __DISPLAY_ */

View File

@ -0,0 +1,6 @@
#ifndef __DISPLAY_PUTCHAR_H
#define __DISPLAY_PUTCHAR_H
void init_display_putchar(void);
#endif /* __DISPLAY_PUTCHAR_H */

View File

@ -0,0 +1,13 @@
#ifndef _MSB_BOARD_H
#define _MSB_BOARD_H
#include <stdint.h>
#include <cc430f6137.h>
#define MSP430_INITIAL_CPU_SPEED 7372800uL
#define MSP430_HAS_DCOR 1
#define MSP430_HAS_EXTERNAL_CRYSTAL 1
typedef uint8_t radio_packet_length_t;
#endif // _MSB_BOARD_H

View File

@ -0,0 +1,11 @@
#ifndef BUTTONS_H
#define BUTTONS_H
// Button ports
#define BUTTON_STAR_PIN (BIT2)
#define BUTTON_NUM_PIN (BIT1)
#define BUTTON_UP_PIN (BIT4)
#define BUTTON_DOWN_PIN (BIT0)
#define BUTTON_BACKLIGHT_PIN (BIT3)
#endif

12
boards/chronos/putchar.c Normal file
View File

@ -0,0 +1,12 @@
static void _dummy(int c)
{
}
void (*_putchar)(int c) = _dummy;
int putchar(int c)
{
_putchar(c);
return c;
}

View File

@ -0,0 +1,33 @@
SRC = $(wildcard *.c)
BINDIR = $(RIOTBOARD)/$(BOARD)/bin/
OBJ = $(SRC:%.c=$(BINDIR)%.o)## defines
DEP = $(SRC:%.c=$(BINDIR)%.d)
INCLUDES += -I$(RIOTBOARD)/msb-430-common/include/ -I${RIOTBOARD}/${BOARD}/include/
INCLUDES += -I$(RIOTBASE)/cpu/msp430-common/include/
INCLUDES += -I$(RIOTBASE)/cpu/mspx16x/include/
INCLUDES += -I$(RIOTBASE)/drivers/include/
.PHONY: $(BINDIR)$(ARCH)
all: $(BINDIR)$(ARCH)
$(MAKE) -C drivers
$(BINDIR)$(ARCH): $(OBJ)
echo $(AR) rcs $(BINDIR)$(ARCH) $(OBJ)
$(AR) rcs $(BINDIR)$(ARCH) $(OBJ)
# pull in dependency info for *existing* .o files
-include $(OBJ:.o=.d)
# compile and generate dependency info
$(BINDIR)%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d
@printf "$(BINDIR)"|cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d
# remove compilation products
clean:
$(MAKE) -C drivers clean
rm -f $(OBJ) $(DEP)
rm -f $(BINDIR)$(ARCH)

View File

@ -0,0 +1,27 @@
## the cpu to build for
export CPU = msp430x16x
export MCU = msp430f1612
# toolchain config
export PREFIX = @msp430-
export CC = @$(PREFIX)gcc
export AR = @$(PREFIX)ar
export CFLAGS += -std=gnu99 -Wstrict-prototypes -gdwarf-2 -Os -Wall -mmcu=$(MCU)
export ASFLAGS += -mmcu=$(MCU) --defsym $(MCU)=1 --gdwarf-2
export AS = $(PREFIX)as
export LINK = $(PREFIX)gcc
export SIZE = $(PREFIX)size
export OBJCOPY = $(PREFIX)objcopy
export LINKFLAGS = -mmcu=$(MCU) -lgcc $(RIOTBASE)/bin/startup.o
TERMPROG = $(RIOTBASE)/dist/tools/pyterm/pyterm.py
export FLASHER = mspdebug
ifeq ($(strip $(PORT)),)
export PORT = /dev/ttyUSB0
endif
export HEXFILE = bin/$(PROJECT).hex
#export FFLAGS = -d $(PORT) -j uif "prog $(HEXFILE)"
export FFLAGS = -j olimex "prog $(HEXFILE)"
export USEMODULE += msp430_common
export INCLUDES += -I $(RIOTCPU)/msp430-common/include/
export OFLAGS = -O ihex

View File

@ -0,0 +1,21 @@
#include <stdint.h>
#include <string.h>
#include <board-conf.h>
#include <config.h>
#include <flashrom.h>
void config_load(void)
{
if (*((uint16_t *) INFOMEM) == CONFIG_KEY) {
memcpy(&sysconfig, (char *)(INFOMEM + sizeof(CONFIG_KEY)), sizeof(sysconfig));
}
else {
config_save();
}
}
uint8_t config_save(void)
{
configmem_t mem = { CONFIG_KEY, sysconfig };
return (flashrom_erase((uint8_t *) INFOMEM) && flashrom_write((uint8_t *) INFOMEM, (char *) &mem, sizeof(mem)));
}

View File

@ -0,0 +1,228 @@
#include "cpu.h"
#include "board.h"
#include "kernel_internal.h"
#include "msp430.h"
#include "debug.h"
static volatile uint32_t __msp430_cpu_speed = MSP430_INITIAL_CPU_SPEED;
void msp430_init_dco(void);
/*---------------------------------------------------------------------------*/
static uint8_t calc_umctl(uint16_t br)
{
/* from TI slaa049 */
register uint8_t CMOD = 256 * br - 256 * (br + 1) / 2;
register uint8_t c = 0;
register int i = 0;
register uint8_t a = CMOD;
a <<= 1;
do {
if (a & 0x80) { /* Overflow to integer? */
a = a - 128 + CMOD; /* Yes, subtract 1.000000 */
c |= 0x80;
}
else {
a += CMOD; /* No, add fraction */
}
if (i == 7) {
return c;
}
i++;
c >>= 1;
}
while (1);
}
static void msb_ports_init(void)
{
/* Port 1: Free port, for energy saving all outputs are set to zero. */
P1SEL = 0x00; /* Port1 I/O Function */
P1OUT = 0x00; /* Port1 Ausgangsregister: 00000000 = 0x00 */
P1DIR = 0xFF; /* Port1 Direction: 11111111 = 0xFF */
P2SEL = 0x20; /* Port2 I/O Function */
P2OUT = 0x00; /* Port2 Output register: 00000000 = 0x00 */
P2DIR = 0x1C; /* Port2 Direction: 00011010 = 0x1C */
/* 0 - P2.0 [IN ] - */
/* 0 - P2.1 [OUT] - */
/* 1 - P2.2 [IN ] - */
/* 1 - P2.3 [OUT] - */
/* 1 - P2.4 [OUT] - */
/* 0 - P2.5 [IN ] - */
/* 0 - P2.6 [IN ] - SDC Protect */
/* 0 - P2.7 [IN ] - SDC Detect */
P3SEL = 0xC0; /* Port3 Pins 6 & 7 for USART */
P3OUT = 0x49; /* Port3 Output register: 01001001: 0x49 */
P3DIR = 0xAB; /* Port3 Direction: 10101011: 0xAB */
/* 1 - P3.0 */
/* 1 - P3.1 */
/* 0 - P3.2 */
/* 1 - P3.3 */
/* 0 - P3.4 [IN ] - SHT 11 DATA (OUT/IN) */
/* 1 - P3.5 [OUT] - SHT 11 CLK */
/* 0 - P3.6 [2-Funktion] - RS232_RxD */
/* 1 - P3.7 [2-Funktion] - RS232_TxD */
/* Port 4: Free port, for energy saving all outputs are set to zero. */
P4SEL = 0x00; /* Port4 I/O Function */
P4OUT = 0x00; /* Port4 Output register: 00000000 = 0x00 */
P4DIR = 0xFF; /* Port4 Direction: 11111111 = 0xFF */
/* 1 - P4.0 [OUT] - unused */
/* 1 - P4.1 [OUT] - unused */
/* 1 - P4.2 [OUT] - unused */
/* 1 - P4.3 [OUT] - unused */
/* 1 - P4.4 [OUT] - unused */
/* 1 - P4.5 [OUT] - unused */
/* 1 - P4.6 [OUT] - unused */
/* 1 - P4.7 [OUT] - unused */
P5SEL = 0x00; /* Port5 I/O Function: 00000000 = 0x00 */
P5OUT = 0x80; /* Port5 Output register: 00001001 = 0x09 */
P5DIR = 0xFF; /* Port5 Direction: 11111011 = 0xFB */
/* 1 - P5.0 [OUT] - SDC /CS */
/* 1 - P5.1 [OUT] - SDC DI */
/* 0 - P5.2 [IN ] - SDC DO */
/* 1 - P5.3 [OUT] - SDC DCLK */
/* 1 - P5.4 [OUT] - MMA GS1 */
/* 1 - P5.5 [OUT] - MMA GS2 */
/* 1 - P5.6 [OUT] - MMA /SLEEP */
/* 1 - P5.7 [OUT] - LED_RED 0-on, 1-off */
P6SEL = 0x00; /* Port6 I/O Function = 0x07 */
P6OUT = 0x00; /* Port6 Output register: 00000000 = 0x00 */
P6DIR = 0xFF; /* Port6 Direction: 11111000 = 0xF8 */
/* 0 - P6.0 [AD-IN] - MMA X-Axis */
/* 0 - P6.1 [AD-IN] - MMA Y-Axis */
/* 0 - P6.2 [AD-IN] - MMA Z-Axis */
/* 1 - P6.3 [OUT] - unused */
/* 1 - P6.4 [OUT] - unused */
/* 1 - P6.5 [OUT] - unused */
/* 1 - P6.6 [OUT] - unused */
/* 1 - P6.7 [OUT] - unused */
}
void msp430_set_cpu_speed(uint32_t speed)
{
dint();
__msp430_cpu_speed = speed;
msp430_init_dco();
uint16_t br;
UCTL1 = SWRST | CHAR; /* 8-bit character */
UTCTL1 |= SSEL1 | URXSE; /* UCLK = MCLK */
/* activate */
U1ME |= UTXE1 | URXE1; /* Enable USART1 TXD/RXD */
br = (uint16_t)(__msp430_cpu_speed / 115200uL);
UBR01 = br; /* set baudrate */
UBR11 = br >> 8;
UMCTL1 = calc_umctl(br); /* set modulation */
ME2 |= (UTXE1 | URXE1);
UCTL1 &= ~SWRST;
IE2 |= URXIE1;
//clock_init();
eint();
}
/*---------------------------------------------------------------------------*/
void msp430_init_dco(void)
{
#if MSP430_HAS_EXTERNAL_CRYSTAL
/*------------------ use external oszillator -----------------------*/
uint16_t i;
/* Stop watchdog */
WDTCTL = WDTPW + WDTHOLD;
//Init crystal for mclk
//XT2 = HF XTAL
BCSCTL1 = RSEL2;
/* Wait for xtal to stabilize */
do {
IFG1 &= ~OFIFG; /* Clear oscillator fault flag */
for (i = 0xFF; i > 0; i--); /* Time for flag to set */
}
while ((IFG1 & OFIFG) != 0); /* Oscillator fault flag still set? */
BCSCTL2 = SELM_2 + SELS; /* MCLK und SMCLK = XT2 (safe) */
#else
/* Thdeltais code taken from the FU Berlin sources and reformatted. */
int delta = __msp430_cpu_speed >> 12;
//#define DELTA 600
unsigned int compare, oldcapture = 0;
unsigned int i;
BCSCTL1 = 0xa4; /* ACLK is devided by 4. RSEL=6 no division for MCLK
and SSMCLK. XT2 is off. */
/* Init FLL to desired frequency using the 32762Hz crystal */
#if MSP430_HAS_DCOR
BCSCTL2 = 0x01;
#else
BCSCTL2 = 0x00;
#endif
WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */
BCSCTL1 |= DIVA1 + DIVA0; /* ACLK = LFXT1CLK/8 */
for (i = 0xffff; i > 0; i--); /* Delay for XTAL to settle */
CCTL2 = CCIS0 + CM0 + CAP; /* Define CCR2, CAP, ACLK */
TACTL = TASSEL1 + TACLR + MC1; /* SMCLK, continous mode */
while (1) {
while ((CCTL2 & CCIFG) != CCIFG); /* Wait until capture occured! */
CCTL2 &= ~CCIFG; /* Capture occured, clear flag */
compare = CCR2; /* Get current captured SMCLK */
compare = compare - oldcapture; /* SMCLK difference */
oldcapture = CCR2; /* Save current captured SMCLK */
if (delta == compare) {
break; /* if equal, leave "while(1)" */
}
else if (delta < compare) { /* DCO is too fast, slow it down */
DCOCTL--;
if (DCOCTL == 0xFF) { /* Did DCO role under? */
BCSCTL1--;
}
}
else { /* -> Select next lower RSEL */
DCOCTL++;
if (DCOCTL == 0x00) { /* Did DCO role over? */
BCSCTL1++;
}
/* -> Select next higher RSEL */
}
}
CCTL2 = 0; /* Stop CCR2 function */
TACTL = 0; /* Stop Timer_A */
BCSCTL1 &= ~(DIVA1 + DIVA0); /* remove /8 divisor from ACLK again */
#endif
}
void board_init()
{
msp430_cpu_init();
msb_ports_init();
LED_RED_ON;
msp430_set_cpu_speed(7372800uL);
}

View File

@ -0,0 +1,24 @@
SRC = $(wildcard *.c)
BINDIR = $(RIOTBOARD)/$(BOARD)/bin/
OBJ = $(SRC:%.c=$(BINDIR)%.o)
DEP = $(SRC:%.c=$(BINDIR)%.d)
INCLUDES += -I$(RIOTBASE)/sys/include/ -I$(RIOTBASE)/drivers/cc110x_ng/include/
$(BINDIR)msb-430_common_drivers.a: $(OBJ)
$(AR) rcs $(BINDIR)$(ARCH) $(OBJ)
# pull in dependency info for *existing* .o files
-include $(OBJ:.o=.d)
# compile and generate dependency info
$(BINDIR)%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d
@printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d
# remove compilation products
clean:
rm -f $(OBJ) $(DEP)

View File

@ -0,0 +1,59 @@
/******************************************************************************
Copyright 2013, Freie Universitaet Berlin (FUB). All rights reserved.
These sources were developed at the Freie Universitaet Berlin, Computer Systems
and Telematics group (http://cst.mi.fu-berlin.de).
-------------------------------------------------------------------------------
This file is part of FeuerWare.
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
FeuerWare is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see http://www.gnu.org/licenses/ .
--------------------------------------------------------------------------------
For further information and questions please use the web site
http://scatterweb.mi.fu-berlin.de
and the mailinglist (subscription via web site)
scatterweb@lists.spline.inf.fu-berlin.de
*******************************************************************************/
#ifndef SHT11BOARD_H_
#define SHT11BOARD_H_
/**
* @ingroup msb_430h
* @{
*/
/**
* @file
* @brief SHT11 Device Driver Configuration For MSB-430 Platform
*
* @author Freie Universität Berlin, Computer Systems & Telematics, RIOT
*
*/
#include <msp430x16x.h>
#include <bitarithm.h>
/* SCK = P3B5
* DATA = P3B4
*/
#define SHT11_SCK_LOW P3OUT &= ~(BIT5); /**< serial clock line low */
#define SHT11_SCK_HIGH P3OUT |= BIT5; /**< serial clock line high */
#define SHT11_DATA (P3IN & BIT5) /**< read serial I/O */
#define SHT11_DATA_LOW P3OUT &= ~(BIT5); /**< serial I/O line low */
#define SHT11_DATA_HIGH P3OUT |= BIT5; /**< serial I/O line high */
#define SHT11_DATA_IN P3DIR &= ~(BIT5); /**< serial I/O as input */
#define SHT11_DATA_OUT P3DIR |= BIT5; /**< serial I/O as output */
#define SHT11_INIT P3DIR |= BIT5; /* FIO1DIR |= BIT25; PINSEL3 &= ~(BIT14|BIT15 | BIT16|BIT17); */
/** @} */
#endif /* SHT11BOARD_H_ */

View File

@ -0,0 +1,8 @@
#ifndef BOARD_CONF_H
#define BOARD_CONF_H
#include <stdint.h>
#define INFOMEM (0x1000)
#endif /* BOARD-CONF_H */

View File

@ -0,0 +1,57 @@
#include "board.h"
#define UART1_TX TXBUF1
#define UART1_WAIT_TXDONE() while( (UTCTL1 & TXEPT) == 0 ) { _NOP(); }
#include <stdio.h>
#include <kernel.h>
#include <board_uart0.h>
int putchar(int c)
{
UART1_TX = c;
UART1_WAIT_TXDONE();
if (c == 10) {
UART1_WAIT_TXDONE();
}
return c;
}
void usart0irq(void);
/**
* \brief the interrupt function
*/
interrupt(USART1RX_VECTOR) usart0irq(void)
{
U1TCTL &= ~URXSE; /* Clear the URXS signal */
U1TCTL |= URXSE; /* Re-enable URXS - needed here?*/
int c = 0;
/* Check status register for receive errors. */
if(U1RCTL & RXERR) {
if (U1RCTL & FE) {
puts("rx framing error");
}
if (U1RCTL & OE) {
puts("rx overrun error");
}
if (U1RCTL & PE) {
puts("rx parity error");
}
if (U1RCTL & BRK) {
puts("rx break error");
}
/* Clear error flags by forcing a dummy read. */
c = U1RXBUF;
}
#ifdef MODULE_UART0
else if (uart0_handler_pid) {
c = U1RXBUF;
uart0_handle_incoming(c);
uart0_notify_thread();
}
#endif
}

37
boards/msb-430/Makefile Normal file
View File

@ -0,0 +1,37 @@
SRC = $(wildcard *.c)
BINDIR = bin/
OBJ = $(SRC:%.c=$(BINDIR)%.o)## defines
export ARCH = msb-430_base.a
DEP = $(SRC:%.c=$(BINDIR)%.d)
INCLUDES += -I$(RIOTBOARD)/msb-430-common/include/
INCLUDES += -I$(RIOTBASE)/cpu/msp430-common/include/
INCLUDES += -I$(RIOTBASE)/cpu/msp430x16x/include/
all: $(BINDIR)$(ARCH)
$(MAKE) -C ../msb-430-common
$(BINDIR)$(ARCH): $(OBJ)
mkdir -p $(BINDIR)
$(AR) rcs $(BINDIR)$(ARCH) $(OBJ)
# pull in dependency info for *existing* .o files
-include $(OBJ:.o=.d)
# compile and generate dependency info
$(BINDIR)%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d
@printf "$(BINDIR)"|cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d
# remove compilation products
clean:
$(MAKE) -C ../msb-430-common clean
rm -f $(BINDIR)$(ARCH) $(OBJ) $(DEP)
@if [ -d $(BINDIR) ] ; \
then rmdir $(BINDIR) ; \
fi

View File

@ -0,0 +1,2 @@
export INCLUDES += -I$(RIOTBOARD)/msb-430h/include -I$(RIOTBOARD)/msb-430-common/include
include $(RIOTBOARD)/msb-430-common/Makefile.include

View File

@ -0,0 +1,74 @@
/******************************************************************************
Copyright 2009, Freie Universitaet Berlin (FUB). All rights reserved.
These sources were developed at the Freie Universitaet Berlin, Computer Systems
and Telematics group (http://cst.mi.fu-berlin.de).
-------------------------------------------------------------------------------
This file is part of FeuerWare.
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
FeuerWare is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see http://www.gnu.org/licenses/ .
--------------------------------------------------------------------------------
For further information and questions please use the web site
http://scatterweb.mi.fu-berlin.de
and the mailinglist (subscription via web site)
scatterweb@lists.spline.inf.fu-berlin.de
*******************************************************************************/
#ifndef _MSB_BOARD_H
#define _MSB_BOARD_H
/**
* @defgroup msb_430h ScatterWeb MSB-430H
* @ingroup msp430
*
<h2>Compontents</h2>
\li MSP430
\li CC1100
* @{
*/
/**
* @file
* @brief MSB-430H Board
*
* @author Freie Universität Berlin, Computer Systems & Telematics, FeuerWhere project
* @version $Revision$
*
* @note $Id$
*/
#include "board-conf.h"
//MSB430 core
#define MSP430_INITIAL_CPU_SPEED 2457600uL
#define MSP430_HAS_DCOR 1
#define MSP430_HAS_EXTERNAL_CRYSTAL 0
/* LEDs ports MSB430 */
#define LEDS_PxDIR P5DIR
#define LEDS_PxOUT P5OUT
#define LEDS_CONF_RED 0x80
#define LEDS_CONF_GREEN 0x00
#define LEDS_CONF_YELLOW 0x00
#define LED_RED_ON LEDS_PxOUT &=~LEDS_CONF_RED
#define LED_RED_OFF LEDS_PxOUT |= LEDS_CONF_RED
#define LED_RED_TOGGLE LEDS_PxOUT ^= LEDS_CONF_RED
#include <msp430x16x.h>
typedef uint8_t radio_packet_length_t;
/** @} */
#endif // _MSB_BOARD_H

37
boards/msb-430h/Makefile Normal file
View File

@ -0,0 +1,37 @@
SRC = $(wildcard *.c)
BINDIR = bin/
OBJ = $(SRC:%.c=$(BINDIR)%.o)## defines
export ARCH = msb-430h_base.a
DEP = $(SRC:%.c=$(BINDIR)%.d)
INCLUDES += -I${RIOTBASE}/core/include/
INCLUDES += -Iinclude/ -I$(RIOTBOARD)/msb-430-common/include/
INCLUDES += -I$(RIOTBASE)/cpu/msp430-common/include/ -I$(RIOTBASE)/cpu/msp430x16x/include/
INCLUDES += -I$(RIOTBASE)/drivers/cc110x_ng/include/ -I$(RIOTBASE)/sys/include
all: $(BINDIR)$(ARCH)
$(MAKE) -C ../msb-430-common
$(BINDIR)$(ARCH): $(OBJ)
$(AR) rcs $(BINDIR)$(ARCH) $(OBJ)
# pull in dependency info for *existing* .o files
-include $(OBJ:.o=.d)
# compile and generate dependency info
$(BINDIR)%.o: %.c
mkdir -p $(BINDIR)
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d
@printf "$(BINDIR)"|cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d
# remove compilation products
clean:
$(MAKE) -C ../msb-430-common clean
rm -f $(BINDIR)$(ARCH) $(OBJ) $(DEP)
@if [ -d $(BINDIR) ] ; \
then rmdir $(BINDIR) ; \
fi

View File

@ -0,0 +1,6 @@
ifneq (,$(findstring cc110x_ng,$(USEMODULE)))
ifeq (,$(findstring cc110x_spi,$(USEMODULE)))
USEMODULE += cc110x_spi
endif
endif

View File

@ -0,0 +1,4 @@
export INCLUDES += -I$(RIOTBOARD)/msb-430h/include -I$(RIOTBOARD)/msb-430-common/include
include $(RIOTBOARD)/$(BOARD)/Makefile.dep
include $(RIOTBOARD)/msb-430-common/Makefile.include

View File

@ -0,0 +1,359 @@
/* Copyright (C) 2005, 2006, 2007, 2008 by Thomas Hillebrandt and Heiko Will
This file is part of the Micro-mesh SensorWeb Firmware.
Micro-Mesh is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
Micro-Mesh is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Micro-Mesh; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <stdio.h>
#include <board.h>
#include <cpu.h>
#include <irq.h>
#include <cc110x_ng.h>
#include <cc110x-arch.h>
#define CC1100_GDO0 (P2IN & 0x02) // read serial I/O (GDO0)
#define CC1100_GDO1 (P3IN & 0x04) // read serial I/O (GDO1)
#define CC1100_GDO2 (P2IN & 0x01) // read serial I/O (GDO2)
#define CC1100_CS_LOW (P3OUT &= ~0x01)
#define CC1100_CS_HIGH (P3OUT |= 0x01)
#define CC1100_GDO1_LOW_COUNT (2700) // loop count (timeout ~ 500 us) to wait
#define CC1100_GDO1_LOW_RETRY (100) // max. retries for GDO1 to go low
volatile int abort_count;
volatile int retry_count = 0;
void cc110x_gdo0_enable(void)
{
P2IFG &= ~0x02; /* Clear IFG for GDO0 */
P2IE |= 0x02; /* Enable interrupt for GDO0 */
}
void cc110x_gdo0_disable(void)
{
P2IE &= ~0x02; /* Disable interrupt for GDO0 */
P2IFG &= ~0x02; /* Clear IFG for GDO0 */
}
void cc110x_gdo2_enable(void)
{
P2IFG &= ~0x01; /* Clear IFG for GDO2 */
P2IE |= 0x01; /* Enable interrupt for GDO2 */
}
void cc110x_gdo2_disable(void)
{
P2IE &= ~0x01; /* Disable interrupt for GDO2 */
P2IFG &= ~0x01; /* Clear IFG for GDO2 */
}
void cc110x_before_send(void)
{
// Disable GDO2 interrupt before sending packet
cc110x_gdo2_disable();
}
void cc110x_after_send(void)
{
// Enable GDO2 interrupt after sending packet
cc110x_gdo2_enable();
}
int cc110x_get_gdo0(void)
{
return CC1100_GDO0;
}
int cc110x_get_gdo1(void)
{
return CC1100_GDO1;
}
int cc110x_get_gdo2(void)
{
return CC1100_GDO2;
}
void cc110x_spi_cs(void)
{
CC1100_CS_LOW;
}
uint8_t cc110x_txrx(uint8_t data)
{
/* Ensure TX Buf is empty */
long c = 0;
IFG1 &= ~UTXIFG0;
IFG1 &= ~URXIFG0;
TXBUF0 = data;
while (!(IFG1 & UTXIFG0)) {
if (c++ == 1000000) {
puts("cc110x_txrx alarm()");
}
}
/* Wait for Byte received */
c = 0;
while (!(IFG1 & URXIFG0)) {
if (c++ == 1000000) {
puts("cc110x_txrx alarm()");
}
}
return RXBUF0;
}
void cc110x_spi_select(void)
{
// Switch to GDO mode
P3SEL &= ~0x04;
P3DIR &= ~0x04;
cs_low:
// CS to low
abort_count = 0;
CC1100_CS_LOW;
// Wait for SO to go low (voltage regulator
// has stabilized and the crystal is running)
loop:
// asm volatile ("nop");
if (CC1100_GDO1) {
abort_count++;
if (abort_count > CC1100_GDO1_LOW_COUNT) {
retry_count++;
if (retry_count > CC1100_GDO1_LOW_RETRY) {
puts("[CC1100 SPI] fatal error\n");
goto final;
}
CC1100_CS_HIGH;
goto cs_low; // try again
}
goto loop;
}
final:
/* Switch to SPI mode */
P3SEL |= 0x04;
}
void cc110x_spi_unselect(void)
{
CC1100_CS_HIGH;
}
void cc110x_init_interrupts(void)
{
unsigned int state = disableIRQ(); /* Disable all interrupts */
P2SEL = 0x00; /* must be <> 1 to use interrupts */
P2IES |= 0x01; /* Enables external interrupt on low edge (for GDO2) */
P2IE |= 0x01; /* Enable interrupt */
P2IFG &= ~0x01; /* Clears the interrupt flag */
P2IE &= ~0x02; /* Disable interrupt for GDO0 */
P2IFG &= ~0x02; /* Clear IFG for GDO0 */
restoreIRQ(state); /* Enable all interrupts */
}
void cc110x_spi_init(uint8_t clockrate)
{
// Switch off async UART
while (!(UTCTL0 & TXEPT)); // Wait for empty UxTXBUF register
IE1 &= ~(URXIE0 + UTXIE0); // Disable USART0 receive&transmit interrupt
ME1 &= ~(UTXE0 + URXE0);
P3SEL |= 0x0E; // Set pin as SPI
// Keep peripheral in reset state
UCTL0 = SWRST;
// 8-bit SPI Master 3-pin mode, with SMCLK as clock source
// CKPL works also, but not CKPH+CKPL or none of them!!
UCTL0 |= CHAR + SYNC + MM;
UTCTL0 = CKPH + SSEL1 + SSEL0 + STC;
// Ignore clockrate argument for now, just use clock source/2
// SMCLK = 7,3728 MHz
UBR00 = 0x02; // Ensure baud rate >= 2
UBR10 = 0x00;
UMCTL0 = 0x00; // No modulation
URCTL0 = 0x00; // Reset Receive Control Register
// Enable SPI mode
ME1 |= USPIE0;
// Release for operation
UCTL0 &= ~SWRST;
}
// #include <msp430x16x.h>
// #include <signal.h>
// #include "type.h"
// #include "cc110x_defines.h"
// #include "driver_cc110x.h"
// #include "driver_system.h"
// #include "spi0.h"
//
// static callback_t _paket_cb;
// static callback_t _cs_cb;
//
// //-------------------------------------------------------------------------------------------------------
// // Public CC1100 communication functions (SPI)
// //-------------------------------------------------------------------------------------------------------
//
// //-------------------------------------------------------------------------------------------------------
// // void spiInitTrx(void)
// //
// // DESCRIPTION:
// // This function puts the cc110x into spi mode. You have to call this bevore every spi transaction.
// //
// //-------------------------------------------------------------------------------------------------------
//
//
// void drivercc110x_spiwriteburstreg(uint8_t addr, unsigned char *buffer, uint8_t count)
// {
// uint8_t i;
// long c;
// drivercc110x_spiinittrx();
// drivercc110x_trxspi(addr | CC1100_WRITE_BURST);
// for (i = 0; i < count; i++)
// {
// c = 0;
// IFG1 &= ~UTXIFG0;
// IFG1 &= ~URXIFG0;
// TXBUF0 = buffer[i];
// /* Wait for TX to finish */
// while(!(IFG1 & UTXIFG0))
// {
// if (c++ == 1000000)
// alarm();
// }
// }
// /* Wait for Byte received */
// c = 0;
// while(!(IFG1 & URXIFG0))
// {
// if (c++ == 1000000)
// alarm();
// }
// CC1100_CS_HIGH;
// }
//
// void drivercc110x_spireadburstreg(uint8_t addr, char *buffer, uint8_t count)
// {
// uint8_t i;
// drivercc110x_spiinittrx();
// drivercc110x_trxspi(addr | CC1100_READ_BURST);
// for (i = 0; i < count; i++)
// {
// long c = 0;
// IFG1 &= ~UTXIFG0;
// IFG1 &= ~URXIFG0;
// TXBUF0 = NOBYTE;
// while(!(IFG1 & UTXIFG0))
// {
// if (c++ == 1000000)
// alarm();
// }
// /* Wait for Byte received */
// c = 0;
// while(!(IFG1 & URXIFG0))
// {
// if (c++ == 1000000)
// alarm();
// }
// buffer[i] = RXBUF0;
// }
// CC1100_CS_HIGH;
// }
//
// void drivercc110x_load(callback_t cs_cb,callback_t paket_cb)
// {
// _paket_cb = paket_cb;
// _cs_cb = cs_cb;
// spi0_init(0);
// }
//
// void drivercc110x_aftersend(void)
// {
// CLEAR(P2IFG, 0x01);
// SET(P2IE, 0x01); /* Enable interrupts on port 2 pin 0 */
// CLEAR(P4OUT, 0x08); /* Turn off Sending Led*/
// }
//
// void drivercc110x_initinterrupts(void)
// {
// _DINT(); /* Disable all interrupts */
// P2SEL = 0x00; /* must be <> 1 to use interrupts */
// SET(P2IES, 0x01); /* Enables external interrupt on low edge (for GDO2) */
// SET(P2IE, 0x01); /* Enable interrupt */
// CLEAR(P2IFG, 0x01); /* Clears the interrupt flag */
// CLEAR(P2IE, 0x02); /* Disable interrupt for GDO0 */
// CLEAR(P2IFG, 0x02); /* Clear IFG for GDO0 */
// _EINT(); /* Enable all interrupts */
// }
//
// void drivercc110x_beforesend(void)
// {
// /* Turn on Led while sending paket for debug reasons */
// SET(P4OUT, 0x08);
// /* Disable interrupts on port 2 pin 0 */
// CLEAR(P2IE, 0x01);
// }
//
//
// /*
// * Private functions
// */
//
//
/*
* CC1100 receive interrupt
*/
interrupt(PORT2_VECTOR) __attribute__((naked)) cc110x_isr(void)
{
__enter_isr();
// if (system_state.POWERDOWN) SPI_INIT; /* Initialize SPI after wakeup */
/* Check IFG */
if ((P2IFG & 0x01) != 0) {
P2IFG &= ~0x01;
cc110x_gdo2_irq();
}
else if ((P2IFG & 0x02) != 0) {
cc110x_gdo0_irq();
P2IE &= ~0x02; // Disable interrupt for GDO0
P2IFG &= ~0x02; // Clear IFG for GDO0
}
else {
puts("cc110x_isr(): unexpected IFG!");
/* Should not occur - only Port 2 Pin 0 interrupts are enabled */
// CLEAR(P2IFG, 0xFF); /* Clear all flags */
}
// if (system_state.POWERDOWN != 0) END_LPM3;
__exit_isr();
}

View File

@ -0,0 +1,73 @@
/******************************************************************************
Copyright 2009, Freie Universitaet Berlin (FUB). All rights reserved.
These sources were developed at the Freie Universitaet Berlin, Computer Systems
and Telematics group (http://cst.mi.fu-berlin.de).
-------------------------------------------------------------------------------
This file is part of FeuerWare.
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
FeuerWare is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see http://www.gnu.org/licenses/ .
--------------------------------------------------------------------------------
For further information and questions please use the web site
http://scatterweb.mi.fu-berlin.de
and the mailinglist (subscription via web site)
scatterweb@lists.spline.inf.fu-berlin.de
*******************************************************************************/
#ifndef _MSB_BOARD_H
#define _MSB_BOARD_H
/**
* @defgroup msb_430h ScatterWeb MSB-430H
* @ingroup msp430
*
<h2>Compontents</h2>
\li MSP430
\li CC1100
* @{
*/
/**
* @file
* @brief MSB-430H Board
*
* @author Freie Universität Berlin, Computer Systems & Telematics, FeuerWhere project
* @version $Revision$
*
* @note $Id$
*/
//MSB430 core
#define MSP430_INITIAL_CPU_SPEED 7372800uL
#define MSP430_HAS_DCOR 1
#define MSP430_HAS_EXTERNAL_CRYSTAL 1
/* LEDs ports MSB430 */
#define LEDS_PxDIR P5DIR
#define LEDS_PxOUT P5OUT
#define LEDS_CONF_RED 0x80
#define LEDS_CONF_GREEN 0x00
#define LEDS_CONF_YELLOW 0x00
#define LED_RED_ON LEDS_PxOUT &=~LEDS_CONF_RED
#define LED_RED_OFF LEDS_PxOUT |= LEDS_CONF_RED
#define LED_RED_TOGGLE LEDS_PxOUT ^= LEDS_CONF_RED
#include <msp430x16x.h>
#include "board-conf.h"
typedef uint8_t radio_packet_length_t;
/** @} */
#endif // _MSB_BOARD_H

View File

@ -0,0 +1,33 @@
SRC = $(wildcard *.c)
BINDIR = $(RIOTBOARD)/$(BOARD)/bin/
OBJ = $(SRC:%.c=$(BINDIR)%.o)## defines
DEP = $(SRC:%.c=$(BINDIR)%.d)
INCLUDES += -I$(RIOTBOARD)/msba2-common/include/
INCLUDES += -I$(RIOTBASE)/cpu/arm_common/include/
INCLUDES += -I$(RIOTBASE)/cpu/lpc2387/include/
INCLUDES += -I$(RIOTBASE)/drivers/include/
INCLUDES += -I$(RIOTBOARD)/$(BOARD)/include
.PHONY: $(BINDIR)msba2_common_base.a
all: $(BINDIR)msba2_common_base.a
"$(MAKE)" -C drivers
$(BINDIR)msba2_common_base.a: $(OBJ)
$(AR) rcs $(BINDIR)$(ARCH) $(OBJ)
# pull in dependency info for *existing* .o files
-include $(OBJ:.o=.d)
# compile and generate dependency info
$(BINDIR)%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d
@printf "$(BINDIR)"|cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d
# remove compilation products
clean:
"$(MAKE)" -C drivers clean
rm -f $(OBJ) $(DEP)

View File

@ -0,0 +1,14 @@
ifneq (,$(findstring cc110x,$(USEMODULE)))
ifeq (,$(findstring gpioint,$(USEMODULE)))
USEMODULE += gpioint
endif
endif
ifneq (,$(findstring cc110x_ng,$(USEMODULE)))
ifeq (,$(findstring cc110x_spi,$(USEMODULE)))
USEMODULE += cc110x_spi
endif
ifeq (,$(findstring gpioint,$(USEMODULE)))
USEMODULE += gpioint
endif
endif

View File

@ -0,0 +1,27 @@
## the cpu to build for
export CPU = lpc2387
# toolchain config
export PREFIX = @arm-none-eabi-
#export PREFIX = @arm-elf-
export CC = @$(PREFIX)gcc
export AR = @$(PREFIX)ar
export CFLAGS += -std=gnu99 -O2 -Wall -Wstrict-prototypes -mcpu=arm7tdmi-s -gdwarf-2
export ASFLAGS = -gdwarf-2 -mcpu=arm7tdmi-s
export AS = $(PREFIX)as
export LINK = $(PREFIX)gcc
export SIZE = $(PREFIX)size
export OBJCOPY = $(PREFIX)objcopy
FLASHER = lpc2k_pgm
TERMPROG = $(RIOTBASE)/dist/tools/pyterm/pyterm.py
LINKFLAGS = -gdwarf-2 -mcpu=arm7tdmi-s -static -lgcc -nostartfiles -T$(RIOTBASE)/cpu/$(CPU)/linkerscript.x
ifeq ($(strip $(PORT)),)
export PORT = /dev/ttyUSB0
endif
export HEXFILE = bin/$(PROJECT).hex
export FFLAGS = $(PORT) $(PROJBINDIR)/$(PROJECT).hex
include $(RIOTBOARD)/msba2-common/Makefile.dep
export INCLUDES += -I$(RIOTCPU)/lpc2387/include
export OFLAGS = -O ihex

View File

@ -0,0 +1,96 @@
/******************************************************************************
Copyright 2008-2009, Freie Universitaet Berlin (FUB). All rights reserved.
These sources were developed at the Freie Universitaet Berlin, Computer Systems
and Telematics group (http://cst.mi.fu-berlin.de).
-------------------------------------------------------------------------------
This file is part of FeuerWare.
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
FeuerWare is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see http://www.gnu.org/licenses/ .
--------------------------------------------------------------------------------
For further information and questions please use the web site
http://scatterweb.mi.fu-berlin.de
and the mailinglist (subscription via web site)
scatterweb@lists.spline.inf.fu-berlin.de
*******************************************************************************/
/**
* @ingroup msba2
* @{
*/
/**
* @file
* @brief MSB-A2 board initialization
*
* @author Freie Universität Berlin, Computer Systems & Telematics, FeuerWhere project
* @author Heiko Will
* @author Kaspar Schleiser
* @author Michael Baar <baar@inf.fu-berlin.de>
* @author Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
* @note $Id$
*/
#include <board.h>
#include <lpc23xx.h>
#include <VIC.h>
#include <cpu.h>
#include <config.h>
#include <string.h>
#include <flashrom.h>
#define PCRTC BIT9
#define CL_CPU_DIV 4
/*---------------------------------------------------------------------------*/
/**
* @brief Enabling MAM and setting number of clocks used for Flash memory fetch
* @internal
*/
static void
init_mam(void)
{
MAMCR = 0x0000;
MAMTIM = 0x0003;
MAMCR = 0x0002;
}
/*---------------------------------------------------------------------------*/
static inline void
pllfeed(void)
{
PLLFEED = 0xAA;
PLLFEED = 0x55;
}
void init_clks2(void)
{
// Wait for the PLL to lock to set frequency
while (!(PLLSTAT & BIT26));
// Connect the PLL as the clock source
PLLCON = 0x0003;
pllfeed();
/* Check connect bit status */
while (!(PLLSTAT & BIT25));
}
void bl_init_clks(void)
{
PCONP = PCRTC; // switch off everything except RTC
init_clks1();
init_clks2();
init_mam();
}
/*---------------------------------------------------------------------------*/

View File

@ -0,0 +1,21 @@
#include <stdint.h>
#include <string.h>
#include <config.h>
#include <flashrom.h>
void config_load(void) {
extern char configmem[];
/* cast it here for strict-aliasing */
uint16_t* tmp = (uint16_t*) configmem;
if (*tmp == CONFIG_KEY) {
memcpy(&sysconfig, (configmem + sizeof(CONFIG_KEY)), sizeof(sysconfig));
}
else {
config_save();
}
}
uint8_t config_save(void) {
configmem_t mem = { CONFIG_KEY, sysconfig };
return (flashrom_erase((uint8_t*) &configmem) && flashrom_write((uint8_t*) &configmem, (char*) &mem, sizeof(mem)));
}

View File

@ -0,0 +1,24 @@
SRC = $(wildcard *.c)
BINDIR = $(RIOTBOARD)/$(BOARD)/bin/
OBJ = $(SRC:%.c=$(BINDIR)%.o)
DEP = $(SRC:%.c=$(BINDIR)%.d)
INCLUDES += -I$(RIOTBASE)/sys/include/ -I$(RIOTBASE)/drivers/cc110x_ng/include/
$(BINDIR)msba2_common_drivers.a: $(OBJ)
$(AR) rcs $(BINDIR)${ARCH} $(OBJ)
# pull in dependency info for *existing* .o files
-include $(OBJ:.o=.d)
# compile and generate dependency info
$(BINDIR)%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d
@printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d
# remove compilation products
clean:
rm -f $(OBJ) $(DEP)

View File

@ -0,0 +1,58 @@
/******************************************************************************
Copyright 2009, Freie Universitaet Berlin (FUB). All rights reserved.
These sources were developed at the Freie Universitaet Berlin, Computer Systems
and Telematics group (http://cst.mi.fu-berlin.de).
-------------------------------------------------------------------------------
This file is part of FeuerWare.
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
FeuerWare is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see http://www.gnu.org/licenses/ .
--------------------------------------------------------------------------------
For further information and questions please use the web site
http://scatterweb.mi.fu-berlin.de
and the mailinglist (subscription via web site)
scatterweb@lists.spline.inf.fu-berlin.de
*******************************************************************************/
#ifndef SHT11BOARD_H_
#define SHT11BOARD_H_
/**
* @ingroup lpc2387
* @{
*/
/**
* @file
* @brief LPC2387 SHT11 Device Driver
*
* @author Freie Universität Berlin, Computer Systems & Telematics, FeuerWhere project
* @version $Revision$
*
* @note $Id$
*/
#include <lpc23xx.h>
#include <board.h>
#define SHT11_SCK_LOW FIO1CLR = BIT25; // serial clock line low
#define SHT11_SCK_HIGH FIO1SET = BIT25; // serial clock line high
#define SHT11_DATA ((FIO1PIN & BIT26) != 0) // read serial I/O
#define SHT11_DATA_LOW (FIO1CLR = BIT26); // serial I/O line low
#define SHT11_DATA_HIGH (FIO1SET = BIT26); // serial I/O line high
#define SHT11_DATA_IN (FIO1DIR &= ~BIT26) // serial I/O as input
#define SHT11_DATA_OUT (FIO1DIR |= BIT26) // serial I/O as output
#define SHT11_INIT FIO1DIR |= BIT25; PINSEL3 &= ~(BIT14|BIT15 | BIT16|BIT17);
/** @} */
#endif /* SHT11BOARD_H_ */

View File

@ -0,0 +1,8 @@
#ifndef __UART0_H
#define __UART0_H
#define UART0_BUFSIZE 32
extern int uart0_handler_pid;
#endif /* __UART0_H */

View File

@ -0,0 +1,270 @@
/******************************************************************************
Copyright 2008, Freie Universitaet Berlin (FUB). All rights reserved.
These sources were developed at the Freie Universitaet Berlin, Computer Systems
and Telematics group (http://cst.mi.fu-berlin.de).
-------------------------------------------------------------------------------
This file is part of FeuerWare.
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
FeuerWare is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see http://www.gnu.org/licenses/ .
--------------------------------------------------------------------------------
For further information and questions please use the web site
http://scatterweb.mi.fu-berlin.de
and the mailinglist (subscription via web site)
scatterweb@lists.spline.inf.fu-berlin.de
*******************************************************************************/
/**
* @file
* @ingroup LPC2387
* @brief CC1100 LPC2387 dependend functions
*
* @author Freie Universität Berlin, Computer Systems & Telematics, FeuerWhere project
* @author Heiko Will <hwill@inf.fu-berlin.de>
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
* @version $Revision: 1781 $
*
* @note $Id: msba2-cc110x.c 1781 2010-01-26 13:39:36Z hillebra $
*/
#include <stdio.h>
#include <stddef.h>
// core
#include <cpu.h>
#include <irq.h>
// sys
#include <cc110x_ng.h>
#include <cc110x-arch.h>
#include <cc110x_spi.h>
#include <gpioint.h>
#define CC1100_GDO0 (FIO0PIN & BIT27) // read serial I/O (GDO0)
#define CC1100_GDO1 (FIO1PIN & BIT23) // read serial I/O (GDO1)
#define CC1100_GDO2 (FIO0PIN & BIT28) // read serial I/O (GDO2)
#define SPI_TX_EMPTY (SSP0SR & SSPSR_TFE)
#define SPI_BUSY (SSP0SR & SSPSR_BSY)
#define SPI_RX_AVAIL (SSP0SR & SSPSR_RNE)
#define CC1100_GDO1_LOW_RETRY (100) // max. retries for GDO1 to go low
#define CC1100_GDO1_LOW_COUNT (2700) // loop count (timeout ~ 500 us) to wait
// for GDO1 to go low when CS low
//#define DEBUG
#ifdef DEBUG
#include "stdio.h"
static unsigned long time_value;
static void set_time(void)
{
time_value = 0;
}
static int test_time(int code)
{
time_value++;
if (time_value > 10000000) {
printf("CC1100 SPI alarm: %u!\n", code);
time_value = 0;
return 1;
}
return 0;
}
#endif
int cc110x_get_gdo0(void)
{
return CC1100_GDO0;
}
int cc110x_get_gdo1(void)
{
return CC1100_GDO1;
}
int cc110x_get_gdo2(void)
{
return CC1100_GDO2;
}
void cc110x_spi_init(void)
{
// configure chip-select
FIO1DIR |= BIT21;
FIO1SET = BIT21;
// Power
PCONP |= PCSSP0; // Enable power for SSP0 (default is on)
// PIN Setup
PINSEL3 |= BIT8 + BIT9; // Set CLK function to SPI
PINSEL3 |= BIT14 + BIT15; // Set MISO function to SPI
PINSEL3 |= BIT16 + BIT17; // Set MOSI function to SPI
// Interface Setup
SSP0CR0 = 7;
// Clock Setup
uint32_t pclksel;
uint32_t cpsr;
lpc2387_pclk_scale(F_CPU / 1000, 6000, &pclksel, &cpsr);
PCLKSEL1 &= ~(BIT10 | BIT11); // CCLK to PCLK divider
PCLKSEL1 |= pclksel << 10;
SSP0CPSR = cpsr;
// Enable
SSP0CR1 |= BIT1; // SSP-Enable
int dummy;
// Clear RxFIFO:
while (SPI_RX_AVAIL) { // while RNE (Receive FIFO Not Empty)...
dummy = SSP0DR; // read data
}
/* to suppress unused-but-set-variable */
(void) dummy;
}
uint8_t cc110x_txrx(uint8_t c)
{
uint8_t result;
SSP0DR = c;
#ifdef DEBUG
set_time();
#endif
while (!SPI_TX_EMPTY) {
#ifdef DEBUG
test_time(0);
#endif
}
#ifdef DEBUG
set_time();
#endif
while (SPI_BUSY) {
#ifdef DEBUG
test_time(1);
#endif
}
#ifdef DEBUG
set_time();
#endif
while (!SPI_RX_AVAIL) {
#ifdef DEBUG
test_time(2);
#endif
}
result = (uint8_t)SSP0DR;
return result;
}
void cc110x_spi_cs(void)
{
FIO1CLR = BIT21;
}
void
cc110x_spi_select(void)
{
volatile int retry_count = 0;
volatile int abort_count;
// Switch to GDO mode input
PINSEL3 &= ~(BIT14 + BIT15);// Set MISO function to GPIO
FIO1DIR &= ~BIT23;
cs_low:
// CS to low
abort_count = 0;
FIO1CLR = BIT21;
// Wait for SO to go low (voltage regulator
// has stabilized and the crystal is running)
loop:
asm volatile("nop");
if (CC1100_GDO1) {
abort_count++;
if (abort_count > CC1100_GDO1_LOW_COUNT) {
retry_count++;
if (retry_count > CC1100_GDO1_LOW_RETRY) {
puts("[CC1100 SPI] fatal error\n");
goto final;
}
FIO1SET = BIT21; // CS to high
goto cs_low; // try again
}
goto loop;
}
final:
// Switch to SPI mode
PINSEL3 |= (BIT14 + BIT15); // Set MISO function to SPI
}
void
cc110x_spi_unselect(void)
{
FIO1SET = BIT21;
}
void cc110x_before_send(void)
{
// Disable GDO2 interrupt before sending packet
cc110x_gdo2_disable();
}
void cc110x_after_send(void)
{
// Enable GDO2 interrupt after sending packet
cc110x_gdo2_enable();
}
void cc110x_gdo0_enable(void)
{
gpioint_set(0, BIT27, GPIOINT_RISING_EDGE, &cc110x_gdo0_irq);
}
void cc110x_gdo0_disable(void)
{
gpioint_set(0, BIT27, GPIOINT_DISABLE, NULL);
}
void cc110x_gdo2_disable(void)
{
gpioint_set(0, BIT28, GPIOINT_DISABLE, NULL);
}
void cc110x_gdo2_enable(void)
{
gpioint_set(0, BIT28, GPIOINT_FALLING_EDGE, &cc110x_gdo2_irq);
}
void cc110x_init_interrupts(void)
{
// Enable external interrupt on low edge (for GDO2)
FIO0DIR &= ~BIT28;
cc110x_gdo2_enable();
// Enable external interrupt on low edge (for GDO0)
FIO0DIR &= ~BIT27;
}

View File

@ -0,0 +1,69 @@
/******************************************************************************
Copyright 2008-2009, Freie Universitaet Berlin (FUB). All rights reserved.
These sources were developed at the Freie Universitaet Berlin, Computer Systems
and Telematics group (http://cst.mi.fu-berlin.de).
-------------------------------------------------------------------------------
This file is part of FeuerWare.
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
FeuerWare is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see http://www.gnu.org/licenses/ .
--------------------------------------------------------------------------------
For further information and questions please use the web site
http://scatterweb.mi.fu-berlin.de
and the mailinglist (subscription via web site)
scatterweb@lists.spline.inf.fu-berlin.de
*******************************************************************************/
/**
* @ingroup msba2
* @ingroup ltc4150
* @{
*/
/**
* @file
* @brief LTC4150 MSB-A2 specific implemetation
*
* @author Freie Universität Berlin, Computer Systems & Telematics, FeuerWhere project
* @author Heiko Will
* @author Michael Baar
* @author Kaspar Schleiser <kaspar.schleiser@fu-berlin.de>
*/
#include <stdio.h>
#include "lpc2387.h"
#include "ltc4150_arch.h"
#include "gpioint.h"
void __attribute__((__no_instrument_function__)) ltc4150_disable_int(void)
{
gpioint_set(0, BIT4, GPIOINT_DISABLE, NULL);
}
void __attribute__((__no_instrument_function__)) ltc4150_enable_int(void)
{
gpioint_set(0, BIT4, GPIOINT_FALLING_EDGE, &ltc4150_interrupt);
}
void __attribute__((__no_instrument_function__)) ltc4150_sync_blocking(void)
{
while (!(FIO0PIN & BIT4)) {};
}
void __attribute__((__no_instrument_function__)) ltc4150_arch_init()
{
FIO0DIR |= BIT5;
FIO0SET = BIT5;
}
/** @} */

View File

@ -0,0 +1,230 @@
/******************************************************************************
Copyright 2008-2009, Freie Universitaet Berlin (FUB). All rights reserved.
These sources were developed at the Freie Universitaet Berlin, Computer Systems
and Telematics group (http://cst.mi.fu-berlin.de).
-------------------------------------------------------------------------------
This file is part of FeuerWare.
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
FeuerWare is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see http://www.gnu.org/licenses/ .
--------------------------------------------------------------------------------
For further information and questions please use the web site
http://scatterweb.mi.fu-berlin.de
and the mailinglist (subscription via web site)
scatterweb@lists.spline.inf.fu-berlin.de
*******************************************************************************/
/*
* debug_uart.c: provides initial serial debug output
*
* Copyright (C) 2008, 2009 Kaspar Schleiser <kaspar@schleiser.de>
* Heiko Will <hwill@inf.fu-berlin.de>
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "lpc23xx.h"
#include "VIC.h"
#include <kernel.h>
#include <board_uart0.h>
/**
* @file
* @ingroup lpc2387
*
* @author Freie Universität Berlin, Computer Systems & Telematics, FeuerWhere project
* @version $Revision$
*
* @note $Id$
*/
typedef struct toprint_t {
unsigned int len;
char content[];
} toprint_t;
#define QUEUESIZE 255
static volatile toprint_t *queue[QUEUESIZE];
static volatile unsigned char queue_head = 0;
static volatile unsigned char queue_tail = 0;
static volatile unsigned char queue_items = 0;
static volatile unsigned int actual_pos = 0;
static volatile unsigned int running = 0;
static volatile unsigned int fifo = 0;
static volatile toprint_t *actual = NULL;
static inline void enqueue(void)
{
queue_items++;
queue_tail++;
}
static inline void dequeue(void)
{
actual = (queue[queue_head]);
queue_items--;
queue_head++;
}
static void push_queue(void)
{
running = 1;
lpm_prevent_sleep |= LPM_PREVENT_SLEEP_UART;
start:
if (!actual) {
if (queue_items) {
dequeue();
}
else {
running = 0;
lpm_prevent_sleep &= ~LPM_PREVENT_SLEEP_UART;
if (!fifo)
while (!(U0LSR & BIT6)) {};
return;
}
}
while ((actual_pos < actual->len) && (fifo++ < 16)) {
U0THR = actual->content[actual_pos++];
}
if (actual_pos == actual->len) {
free((void *)actual);
actual = NULL;
actual_pos = 0;
goto start;
}
}
int uart_active(void)
{
return (running || fifo);
}
void stdio_flush(void)
{
U0IER &= ~BIT1; // disable THRE interrupt
while (running) {
while (!(U0LSR & (BIT5 | BIT6))) {}; // transmit fifo
fifo = 0;
push_queue(); // dequeue to fifo
}
U0IER |= BIT1; // enable THRE interrupt
}
void UART0_IRQHandler(void) __attribute__((interrupt("IRQ")));
void UART0_IRQHandler(void)
{
int iir;
iir = U0IIR;
switch (iir & UIIR_ID_MASK) {
case UIIR_THRE_INT: // Transmit Holding Register Empty
fifo = 0;
push_queue();
break;
case UIIR_CTI_INT: // Character Timeout Indicator
case UIIR_RDA_INT: // Receive Data Available
#ifdef MODULE_UART0
if (uart0_handler_pid) {
do {
int c = U0RBR;
uart0_handle_incoming(c);
}
while (U0LSR & ULSR_RDR);
uart0_notify_thread();
}
#endif
break;
default:
U0LSR;
U0RBR;
break;
} // switch
VICVectAddr = 0; // Acknowledge Interrupt
}
static inline int uart0_puts(char *astring, int length)
{
/* while (queue_items == (QUEUESIZE-1)) {} ;
U0IER = 0;
queue[queue_tail] = malloc(length+sizeof(unsigned int));
queue[queue_tail]->len = length;
memcpy(&queue[queue_tail]->content,astring,length);
enqueue();
if (!running)
push_queue();
U0IER |= BIT0 | BIT1; // enable RX irq
*/
/* alternative without queue:*/
int i;
for (i = 0; i < length; i++) {
while (!(U0LSR & BIT5));
U0THR = astring[i];
}
/* */
return length;
}
int fw_puts(char *astring, int length)
{
return uart0_puts(astring, length);
}
int
bl_uart_init(void)
{
PCONP |= PCUART0; // power on
// UART0 clock divider is CCLK/8
PCLKSEL0 |= BIT6 + BIT7;
U0LCR = 0x83; // 8 bits, no Parity, 1 Stop bit
// TODO: UART Baudrate calculation using uart->config->speed
/*
* Baudrate calculation
* BR = PCLK (9 MHz) / (16 x 256 x DLM + DLL) x (1/(DIVADDVAL/MULVAL))
*/
U0FDR = 0x92; // DIVADDVAL = 0010 = 2, MULVAL = 1001 = 9
U0DLM = 0x00;
U0DLL = 0x04;
U0LCR = 0x03; // DLAB = 0
U0FCR = 0x07; // Enable and reset TX and RX FIFO
/* irq */
install_irq(UART0_INT, UART0_IRQHandler, 6);
U0IER |= BIT0; // enable only RX irq
return 1;
}

View File

@ -0,0 +1,52 @@
/******************************************************************************
Copyright 2008, Freie Universitaet Berlin (FUB). All rights reserved.
These sources were developed at the Freie Universitaet Berlin, Computer Systems
and Telematics group (http://cst.mi.fu-berlin.de).
-------------------------------------------------------------------------------
This file is part of FeuerWare.
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
FeuerWare is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see http://www.gnu.org/licenses/ .
--------------------------------------------------------------------------------
For further information and questions please use the web site
http://scatterweb.mi.fu-berlin.de
and the mailinglist (subscription via web site)
scatterweb@lists.spline.inf.fu-berlin.de
*******************************************************************************/
#ifndef __MSBA2_COMMON_H
#define __MSBA2_COMMON_H
/**
* @ingroup msb_a2
* @{
*/
/**
* @file
* @brief MSB-A2 Common Board Definitions
*
* @author Freie Universität Berlin, Computer Systems & Telematics, FeuerWhere project
* @author Kaspar Schleiser <kaspar@schleiser.de>
* @version $Revision$
*
* @note $Id$
*/
#include <stdint.h>
#include "lpc2387.h"
#define VICIntEnClear VICIntEnClr
/** @} */
#endif // __MSBA2_COMMON_H

View File

@ -0,0 +1,36 @@
/*
* lpc2387_timer0.c
*
* Created on: 13.01.2009
* Author: heiko
*/
#include <stdint.h>
#include <stdio.h>
#include "lpc2387.h"
void benchmark_init(void)
{
PCLKSEL1 = (PCLKSEL1 & ~(BIT14|BIT15)) | (1 << 14); // CCLK to PCLK divider
PCONP |= PCTIM3;
T3TCR = 0; // disable timer
T3MCR = 0; // disable interrupt
T3CCR = 0; // capture is disabled.
T3EMR = 0; // no external match output.
T3PR = 0; // set prescaler
T3TC = 0; // reset counter
}
void benchmark_reset_start(void)
{
T3TCR = 0; // disable timer
T3TC = 0; // reset counter
T3TCR = BIT0;
}
unsigned int benchmark_read_stop(void)
{
T3TCR = 0; // disable timer
return T3TC;
}

View File

@ -0,0 +1,23 @@
(heavily hacked by Heiko Will & Kaspar Schleiser since then)
1.05 (9-Apr-2007)
-----------------
Added boot jump code specific to 2378 (and similar chips) to
disable the PLL before jumping to the user's code.
1.04 (19-Dec-2006)
------------------
Added 2364, 2366, 2368, 2378 & 2468 to list. Untested.
1.03 (2-Jun-2006)
-----------------
Added 2103 chip to chip list. ID numbers for 2101 and 2102 unknown
1.02 (31-Jul-2005)
------------------
Added support for other chips
Added soft boot code
Added user configurable crystal value (for baud sync protocol)

View File

@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View File

@ -0,0 +1,51 @@
CFLAGS = -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)"
CC = gcc
prefix=/usr/local
all: lpc2k_pgm pseudoterm
SRC = lpc2k_pgm.c download.c uuencode.c ihex.c serial.c chipinfo.c boot_2xxx.c boot_23xx.c control_2xxx.c
OBJS = ${addprefix obj/,${patsubst %.c,%.o,$(SRC)}}
PSEUDOTERM_SRC = pseudoterm.c serial.c control_2xxx.c
PSEUDOTERM_OBJS = ${addprefix obj/,${patsubst %.c,%.o,$(PSEUDOTERM_SRC)}}
TARGETDIR = bin
lpc2k_pgm: $(OBJS)
mkdir -p $(TARGETDIR)
$(CC) -o $(TARGETDIR)/lpc2k_pgm $(OBJS)
pseudoterm: $(PSEUDOTERM_OBJS)
mkdir -p $(TARGETDIR)
$(CC) -o $(TARGETDIR)/pseudoterm $(PSEUDOTERM_OBJS) -lpthread
chipinfo.o: boot_2xxx.h boot_23xx.h
static: $(OBJS) mkstaticlist
$(CC) -o $(TARGETDIR)/lpc2k_pgm $(OBJS) `./mkstaticlist`
obj/%.o : src/%.c
$(CC) $(CFLAGS) -c $< -o $@
cksum_test: cksum_test.c uuencode.o cksum_test.o
$(CC) $(CFLAGS) -o $(TARGETDIR)/cksum_test obj/cksum_test.o obj/uuencode.o
boot_2xxx.c boot_2xxx.h: boot_2xxx.armasm mkbootc
arm-none-eabi-as -o boot_2xxx.armobj boot_2xxx.armasm
arm-none-eabi-objdump -d boot_2xxx.armobj | ./mkbootc boot_2xxx
boot_23xx.c boot_23xx.h: src/boot_23xx.armasm mkbootc
arm-none-eabi-as -o obj/boot_23xx.armobj src/boot_23xx.armasm
arm-none-eabi-objdump -d obj/boot_23xx.armobj | ./mkbootc boot_23xx
clean:
rm -f bin/lpc2k_pgm cksum_test obj/*.o core core.* obj/*.armobj bin/pseudoterm
install:
install -m 0755 bin/lpc2k_pgm $(prefix)/bin
.PHONY: install
obj/gui.o: src/gui.c
$(CC) $(CFLAGS) `gtk-config --cflags` -c src/gui.c -o obj/gui.o

View File

@ -0,0 +1,144 @@
This utility downloads code to Philip LPC 2000 series chips, using the
bootloader communication protocol documented in the LPC2106/2105/2104
User Manual, Sept 2003 revision, pages 177 to 192. This code has also
been tested with LPC2131 and LPC2138 chips (thanks to New Micros for
providing eval boards). It may work with other Philips ARM LPC parts.
Usage:
-----
When you start the program, it's small control window appears, and a
xterm terminal window is launched. The Xterm window allows you to
simply leave lpc2k_pgm running and interface with the LPC uart using
that window. Most people configure "printf" on in their code to print
to UART0, which will appear in this window.
This program has 4 settings:
Firmware: The intel-hex file with your LPC firmware to program.
Port: Which serial device to use.
Baud: The baud rate to communicate.
Crystal: The speed of the crystal on your LPC board.
Once you have set up these values, simply press the "Program Now"
button to write your firmware to the LPC flash memory, and automatically
run it. If your firmware communicates on UART0, its messages will appear
in the xterm window, and anything you type in that window will be
transmitted to your board.
The "Reboot" button may be used to reboot your code (assuming you have
connected DTR appropriately). The "Bootloader" button may be used to
stop your code by rebooting into the bootloader, rather than your program.
Hardware Requirements:
---------------------
You must have a compatible Philips LPC chip with its UART0 interfaced
to a serial port on your PC.
You must be able to reset the chip and cause it to enter bootloader mode.
Normally, this is done by connecting the (TTL level translated) DTR signal
to the LPC reset, so that when DTR is high (the TTL version is low), the
Philips chip is in reset mode. Alternately, a pushbutton may be used,
but you will need to manually press the button every time you want to get
back into bootloader mode (while this program attempts to sync baud rates),
rather than letting DTR do it automatically. A few minutes spent wiring
up your circuit so DTR can reset the board will save you much trouble as
you develop code.
P0.14 must be connected low shortly after reset. Normally, this pin
is just shorted to ground using a jumper. Starting with version 1.02,
you can simply leave this shorted to ground. If your design needs to
use this pin, you may also build a simple circuit that forces this pin
to ground when RTS is high.
Software Requirements:
---------------------
You must have a Linux-based system running X Windows. This code has
been tested with Linux kernel 2.4.20 and 2.6.8, and should work with
almost any linux system.
You must have the "xterm" program installed. Nearly all linux
distrubtions provide this, and it is often installed by default. If
you do not have it, simply install from your linux distribution.
Your serial port device file (usually /dev/ttyS0 or /dev/ttyS1) must
allow permission for you to use the serial port.
GTK 1.2 is used for the GUI. Many newer systems only have GTK version
2 (or higher). If you have one of these systems, perhaps you can
install GTK 1.2 (including the development libraries) to allow you to
compile this code. Alternately, you may be able to use the semi-static
build, which includes a copy of this code built into the program.
Building and Installation:
-------------------------
This software is only provided semi-static binary and source code form.
To use the semi-static binary, simply copy it to a location where you
can run it, and change the permissions if necessary:
cp lpc2k_pgm /usr/local/bin
chmod 755 /usr/local/bin/lpc2k_pgm
The semi-static binary has all of the GTK and X11 libraries statically
linked into it, for maximum compatibility with all linux distributions.
The only disadvantage is, of course, that this uses an extra 1.4 megs
of RAM, with (might) otherwise be shared with other programs. If you
simply want to run this program with minimal work, using the semi-static
binary may be the easiest way.
If you compile from the source code, the result should be a small
binary that is optimal for your system.
To build from source, you must have GTK+ 1.2 development libraries
and GCC properly installed. Nearly all linux distributions provide
these as packages, but you may need to install them before you can
compile the code.
TODO: specific instructions for Debian stable
TODO: specific instructions for Debian testing/unstable
TODO: specific instructions for Fedora
TODO: specific instructions for Suse
Simply type "make" to build the code. The resulting "lpc2k_pgm"
program can be run from any location. Simply copy to /usr/local/bin,
or where ever you like.
Contact Info:
------------
Paul Stoffregen
paul@pjrc.com
http://www.pjrc.com/arm/lpc2k_pgm
If you discover a bug, you want to request a new feature, or you have
a new Philips LPC chip which is not recognized, please attempt to
provide COMPLETE information in your message.
If you have problems building from source, please contact me with ALL
of the following:
1: Complete copy of all messages during the build.
2: Output of "gtk-config --version"
3: Output of "gtk-config --libs"
4: Output of "gtk-config --cflags"
5: Output of "uname -a"
6: Other info... which linux distribution, version, other software
If you get "Command not found" when trying to run "gtk-config", this
is a sure sign that you do not have GTK+ 1.2 installed.

View File

@ -0,0 +1,15 @@
This directory contains flash & terminal-utilities for use with
the msb_av2 platform used by the FeuerWhere-Project.
Usage:
Running "./pseudoterm /dev/ttyUSB1" will start the terminal-emulator,
open the specified port and reset the connected msb_av2-board.
If it receives a SIGUSR2, the terminal closes the port an waits.
On reception of a SIGUSR1, it reopens the port and resets the ARM.
"./lpc2k_pgm /dev/ttyUSB1 /path/to/firmware.ihex" will do what you
expect, but it will additionally run "killall -SIGUSR2 pseudoterm" before
anѕ "killall -SIGUSR1 pseudoterm" after flashing.
Together, the tools enable you to have a terminal connected to the board
at all times, but let you flash whenever you feel like.

View File

@ -0,0 +1,2 @@
fm.exe "COM(%1, 230400) DEVICE(LPC2387, 16.000000) HARDWARE(BOOTEXEC, 50, 100) HIGHSPEED(0, 230400) ERASEUSED(%2, PROTECTISP) HEXFILE(%2, NOCHECKSUMS, NOFILL, PROTECTISP) RESET"
sleep 2

View File

@ -0,0 +1,113 @@
#/bin/bash
linux_checkid() {
udevinfo -a -n ${1} | grep -q "ATTRS{product}==\"${2}\""
}
windows_flash_fm() {
echo "Checking FTDI device on COM${1}"
PORTINFO=`${BASEDIR}/../../../tools/windows/ftdiinfo/bin/Debug/ftdiinfo.exe /l COM${1}`
PORTCHECK=`echo ${PORTINFO} | awk '{ print $1 }'`
BOARDCHECK=`echo ${PORTINFO} | awk '{ print $3 }'`
SERIAL=`echo ${PORTINFO} | awk '{ print $2 }'`
if [ "${PORTCHECK}" != "COM${1}" ]; then
echo " port mismatch / ftdiinfo failed"
exit 1
fi
if [ "${BOARDCHECK}" != "\"${FTDI_ID}\"" ]; then
echo " target mismatch: target board is \"${FTDI_ID}\", connected is ${BOARDCHECK}"
exit 1
fi
echo "Flashing ${HEXFILE} to COM${1} (${BOARDCHECK} serial ${SERIAL})"
# Using FlashMagic on Windows (in separate window)
cmd /C start "FlashMagic ${HEXFILE} to ${BOARDCHECK} on COM${1}" fm.exe "COM(${1}, 230400) DEVICE(LPC2387, 16.000000) HARDWARE(BOOTEXEC, 50, 100) HIGHSPEED(0, 230400) ERASEUSED(${HEXFILE}, PROTECTISP) HEXFILE(${HEXFILE}, NOCHECKSUMS, NOFILL, PROTECTISP) RESET"
}
windows_flash_openocd() {
echo "Flashing ${HEXFILE} through JTAG"
# Using OpenOcd on Windows
#cmd /C start "OpenOCD ${HEXFILE} to ${BOARDCHECK}"
bash -x ${OPENOCD} ${OPENOCD_IF} "mt_flash ${HEXFILE}; reset run; shutdown"
}
TEMP=`getopt -a -o b:i:p:f:: --long basedir:,id:,ports:,file:,openocd:,openocd-if:,xxx:: \
-n 'flashutil.sh' -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"
while true ; do
echo $1: $2
case "$1" in
-b|--basedir) BASEDIR=$2 ; shift 2 ;;
-i|--id) FTDI_ID=$2; shift 2 ;;
-p|--ports) PORTS=`echo $2 | sed -e 's:,: :g'`; shift 2 ;;
--openocd) OPENOCD=$2; shift 2 ;;
--openocd-if) OPENOCD_IF=$2; shift 2 ;;
--) HEXFILE=$2 ; shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
if [ "${OS}" = "Windows_NT" ]; then
WINDOWS=1
fi
FLASHUTIL_SHELL=${FLASHUTIL_SHELL:-"xterm -e"}
if [ "x${WINDOWS}x" = "xx" ]; then
echo Pausing terminal
${BASEDIR}/termctrl.sh pause
else
HEXFILE=`echo ${HEXFILE} | sed -e 's:/:\\\\:g'`
BASEDIRWIN=`echo ${BASEDIR} | sed -e 's:/:\\\\:g'`
fi
pids=""
#
# for OpenOCD let the user verify, that the correct board is connected
#
if [ ${PORTS} = "openocd" ]; then
[ "$OPENOCD" != "" ] || exit 1
[ "$OPENOCD_IF" != "" ] || exit 1
# echo -n "Is the board connected to the JTAG a '${FTDI_ID}' (y/n)? "
# read REPLY
# [ "$REPLY" = "y" ] || exit 1
fi
#
# start a flasher for each port
#
for PORT in $PORTS; do
if [ "x${WINDOWS}x" != "xx" ]; then
if [ "${PORT}" = "openocd" ]; then
windows_flash_openocd
else
windows_flash_fm ${PORT}
fi
else
if [ "${PORT}" = "openocd" ]; then
${OPENOCD} ${OPENOCD_IF} "mt_flash ${HEXFILE}; reset run; shutdown"
else
echo Flashing ${HEXFILE} to ${PORT}
# using homemade lpc2k_pgm else
${FLASHUTIL_SHELL} "${BASEDIR}/bin/lpc2k_pgm ${PORT} ${HEXFILE}; sleep 2" &
pids="${pids} $!"
fi
fi
done
### wait for all flasher processes to finish
echo Waiting until all devices have been programmed...
for pid in "${pids}"; do
wait ${pid}
done
if [ "x${WINDOWS}x" = "xx" ]; then
echo Resuming terminal
${BASEDIR}/termctrl.sh continue
fi

View File

@ -0,0 +1,28 @@
#! /usr/bin/perl
$h = '[0-9A-Fa-f]';
$n = 1;
while (<stdin>) {
next unless /^\s*$h+:\s+($h{8})/;
$data[$n++] = "0x$1";
}
$data[0] = $n;
#$size = $ARGV[0];
#$size =~ tr/a-z/A-Z/;
#$size .= '_SIZE';
open H, ">$ARGV[0].h" or die "unable to write boot.h\n";
print H "/* automatically generated from $ARGV[0].armasm */\n";
#print H "#define $size $n\n";
print H "extern const unsigned int ${ARGV[0]}[];\n";
close H;
open C, ">$ARGV[0].c" or die "unable to write boot.c\n";
print C "/* automatically generated from $ARGV[0].armasm */\n";
print C "#include \"$ARGV[0].h\"\n";
print C "const unsigned int ${ARGV[0]}[] = {\n";
print C "\t", join(', ', @data), "\n";
print C "};\n";
close C;

View File

@ -0,0 +1,47 @@
#! /usr/bin/perl
@arg = split(/\s+/, `gtk-config --libs`);
%liblist = (
'libgtk.a', '/usr/lib/libgtk.a',
'libgdk.a', '/usr/lib/libgdk.a',
'libgmodule.a', '/usr/lib/libgmodule.a',
'libglib.a', '/usr/lib/libglib.a',
'libXi.a', '/usr/X11R6/lib/libXi.a',
'libXext.a', '/usr/X11R6/lib/libXext.a',
'libX11.a', '/usr/X11R6/lib/libX11.a'
);
for ($i=0; $i<@arg; $i++) {
$a = $arg[$i];
next if $a eq '-rdynamic'; # always delete -rdynamic
if (($a eq '-lm') || ($a eq '-ldl') || ($a =~ /^-L/)) {
# a few things we never change
print "$a ";
next;
}
if ($a =~ /^-l/) {
$lib = $';
$lib = 'lib' . $lib . '.a';
# first check if it's in the known location
if (-f $liblist{$lib}) {
print $liblist{$lib}, " ";
next;
}
# resort to trying whereis to find it
@source = split(/\s+/, `whereis $lib`);
undef($static);
for ($j=0; $j<@source; $j++) {
$static = $source[$j] if $source[$j] =~ /$lib$/;
}
# if we found a static lib, use it.
if ($static) {
print $static, " ";
} else {
print $a, " ";
}
}
}
print "\n";

View File

@ -0,0 +1,3 @@
obj/boot_23xx.d: src/boot_23xx.c src/boot_23xx.h
src/boot_23xx.h:

View File

@ -0,0 +1,3 @@
obj/boot_2xxx.d: src/boot_2xxx.c src/boot_2xxx.h
src/boot_2xxx.h:

View File

@ -0,0 +1,8 @@
obj/chipinfo.d: src/chipinfo.c src/chipinfo.h src/boot_2xxx.h \
src/boot_23xx.h
src/chipinfo.h:
src/boot_2xxx.h:
src/boot_23xx.h:

View File

@ -0,0 +1,5 @@
obj/control_2xxx.d: src/control_2xxx.c src/control_2xxx.h src/serial.h
src/control_2xxx.h:
src/serial.h:

View File

@ -0,0 +1,19 @@
obj/download.d: src/download.c src/lpc2k_pgm.h src/download.h \
src/serial.h src/ihex.h src/uuencode.h src/chipinfo.h src/boot.h \
src/control_2xxx.h
src/lpc2k_pgm.h:
src/download.h:
src/serial.h:
src/ihex.h:
src/uuencode.h:
src/chipinfo.h:
src/boot.h:
src/control_2xxx.h:

View File

@ -0,0 +1,3 @@
obj/ihex.d: src/ihex.c src/ihex.h
src/ihex.h:

View File

@ -0,0 +1,8 @@
obj/lpc2k_pgm.d: src/lpc2k_pgm.c src/lpc2k_pgm.h src/serial.h \
src/download.h
src/lpc2k_pgm.h:
src/serial.h:
src/download.h:

View File

@ -0,0 +1,5 @@
obj/pseudoterm.d: src/pseudoterm.c src/serial.h src/download.h
src/serial.h:
src/download.h:

View File

@ -0,0 +1,3 @@
obj/serial.d: src/serial.c src/serial.h
src/serial.h:

View File

@ -0,0 +1,3 @@
obj/uuencode.d: src/uuencode.c src/uuencode.h
src/uuencode.h:

View File

@ -0,0 +1,9 @@
typedef struct {
int size;
const int *prog;
} boot_t;

View File

@ -0,0 +1,32 @@
/* ARM code to run user code */
/* on the LPC23xx chips, the bootloader defaults to using the RC */
/* osciallator and it activates the PLL to create 14.78 MHz, even */
/* if there is no crystal. However, when we use try to jump to */
/* the user's code, their startup routine may (incorrectly) assume */
/* the PLL is not enabled and crash if it is. So in addition to */
/* remapping the reset vector to flash, we have to shut off the */
/* PLL so the user's startup code sees the same conditions as it */
/* would following a hard reset */
begin:
adr r0, const
ldr r1, [r0] /* r1 points to MEMMAP register */
ldr r2, [r0,#4] /* r2 points to PLLCON */
ldr r3, [r0,#8] /* r3 points to PLLFEED */
mov r0, #1
str r0, [r1] /* remap interrupt vectors to flash */
mov r4, #0xAA
mov r5, #0x55
str r0, [r2] /* disconnect the PLL, PLLCON = 1 */
str r4, [r3]
str r5, [r3]
mov r0, #0
str r0, [r2] /* disable the PLL, PLLCON = 0 */
str r4, [r3]
str r5, [r3]
mov pc, #0 /* and then jump to the user's code */
const:
.int 0xE01FC040 /* MEMMAP register */
.int 0xE01FC080 /* PLLCON */
.int 0xE01FC08C /* PLLFEED */

View File

@ -0,0 +1,5 @@
/* automatically generated from boot_23xx.armasm */
#include "boot_23xx.h"
const unsigned int boot_23xx[] = {
20, 0xe28f0038, 0xe5901000, 0xe5902004, 0xe5903008, 0xe3a00001, 0xe5810000, 0xe3a040aa, 0xe3a05055, 0xe5820000, 0xe5834000, 0xe5835000, 0xe3a00000, 0xe5820000, 0xe5834000, 0xe5835000, 0xe3a0f000, 0xe01fc040, 0xe01fc080, 0xe01fc08c
};

View File

@ -0,0 +1,2 @@
/* automatically generated from boot_23xx.armasm */
extern const unsigned int boot_23xx[];

View File

@ -0,0 +1,15 @@
/* ARM code to run user code */
/* This allows us to jump to the user's code in flash. We have */
/* to remap the flash before jumping. */
begin:
adr r0, const
ldr r1, [r0] /* r1 points to MEMMAP register */
mov r0, #1
str r0, [r1] /* remap interrupt vectors to flash */
mov pc, #0 /* and then jump to the user's code */
const:
.int 0xE01FC040 /* MEMMAP register */

View File

@ -0,0 +1,5 @@
/* automatically generated from boot_2xxx.armasm */
#include "boot_2xxx.h"
const unsigned int boot_2xxx[] = {
7, 0xe28f000c, 0xe5901000, 0xe3a00001, 0xe5810000, 0xe3a0f000, 0xe01fc040
};

View File

@ -0,0 +1,2 @@
/* automatically generated from boot_2xxx.armasm */
extern const unsigned int boot_2xxx[];

View File

@ -0,0 +1,156 @@
/*
* LPC 2000 Loader, http://www.pjrc.com/arm/lpc2k_pgm
* Copyright (c) 2004, PJRC.COM, LLC, <paul@pjrc.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
#include <stdio.h>
#include "chipinfo.h"
#include "boot_2xxx.h"
#include "boot_23xx.h"
struct sector_info_struct lpc2106_layout[] = {
{0x00000000, 0x2000},
{0x00002000, 0x2000},
{0x00004000, 0x2000},
{0x00006000, 0x2000},
{0x00008000, 0x2000},
{0x0000A000, 0x2000},
{0x0000C000, 0x2000},
{0x0000E000, 0x2000},
{0x00010000, 0x2000},
{0x00012000, 0x2000},
{0x00014000, 0x2000},
{0x00016000, 0x2000},
{0x00018000, 0x2000},
{0x0001A000, 0x2000},
{0x0001C000, 0x2000}
};
struct sector_info_struct lpc2214_layout[] = {
{0x00000000, 0x2000},
{0x00002000, 0x2000},
{0x00004000, 0x2000},
{0x00006000, 0x2000},
{0x00008000, 0x2000},
{0x0000A000, 0x2000},
{0x0000C000, 0x2000},
{0x0000E000, 0x2000},
{0x00010000, 0x10000},
{0x00020000, 0x10000},
{0x00030000, 0x2000},
{0x00032000, 0x2000},
{0x00034000, 0x2000},
{0x00036000, 0x2000},
{0x00038000, 0x2000},
{0x0003A000, 0x2000},
{0x0003C000, 0x2000}
};
struct sector_info_struct lpc2138_layout[] = {
{0x00000000, 0x1000},
{0x00001000, 0x1000},
{0x00002000, 0x1000},
{0x00003000, 0x1000},
{0x00004000, 0x1000},
{0x00005000, 0x1000},
{0x00006000, 0x1000},
{0x00007000, 0x1000},
{0x00008000, 0x8000},
{0x00010000, 0x8000},
{0x00018000, 0x8000},
{0x00020000, 0x8000},
{0x00028000, 0x8000},
{0x00030000, 0x8000},
{0x00038000, 0x8000},
{0x00040000, 0x8000},
{0x00048000, 0x8000},
{0x00050000, 0x8000},
{0x00058000, 0x8000},
{0x00060000, 0x8000},
{0x00068000, 0x8000},
{0x00070000, 0x8000},
{0x00078000, 0x1000},
{0x00079000, 0x1000},
{0x0007A000, 0x1000},
{0x0007B000, 0x1000},
{0x0007C000, 0x1000}
};
/* chunk_size is the number of bytes that will be sent with each */
/* "C" (Copy RAM to Flash) command. This must be one of the sizes */
/* supported by that command. Beware that different chips support */
/* different sets of sizes, so check the user manual specific to */
/* the chip. You must choose a chunk_size which is an an integer */
/* multiple of all the sector sizes, and it must be able to fit */
/* entirely within the RAM (allowing for the bootloader memory and */
/* stack usage). Currently, all available chunk sizes meet these */
/* requirements, but who knows what Philips will do in the future? */
//
/* ram_addr is the location in RAM where the chunks are sent by the */
/* "W" (Write to RAM) command. */
struct chip_info_struct chip_info[] = {
/* part_number id_string ram_addr _size sec sector layout boot code */
{"LPC2104 (120k)", "4293984018", 0x40000200, 0x2000, 15, lpc2106_layout, boot_2xxx},
{"LPC2105 (120k)", "4293984034", 0x40000200, 0x2000, 15, lpc2106_layout, boot_2xxx},
{"LPC2106 (120k)", "4293984050", 0x40000200, 0x2000, 15, lpc2106_layout, boot_2xxx},
{"LPC2114 (120k)", "16908050", 0x40000200, 0x2000, 15, lpc2106_layout, boot_2xxx},
{"LPC2119 (120k)", "33685266", 0x40000200, 0x2000, 15, lpc2106_layout, boot_2xxx},
{"LPC2124 (120k)", "16908051", 0x40000200, 0x2000, 15, lpc2106_layout, boot_2xxx},
{"LPC2129 (248k)", "33685267", 0x40000200, 0x2000, 17, lpc2214_layout, boot_2xxx},
{"LPC2131 (32k)", "196353", 0x40000200, 0x1000, 8, lpc2138_layout, boot_2xxx},
{"LPC2132 (64k)", "196369", 0x40000200, 0x1000, 9, lpc2138_layout, boot_2xxx},
{"LPC2134 (128k)", "196370", 0x40000200, 0x1000, 11, lpc2138_layout, boot_2xxx},
{"LPC2136 (256k)", "196387", 0x40000200, 0x1000, 15, lpc2138_layout, boot_2xxx},
{"LPC2138 (500k)", "196389", 0x40000200, 0x1000, 27, lpc2138_layout, boot_2xxx},
{"LPC2141 (32k)", "67305217", 0x40000200, 0x1000, 8, lpc2138_layout, boot_2xxx},
{"LPC2142 (64k)", "67305233", 0x40000200, 0x1000, 9, lpc2138_layout, boot_2xxx},
{"LPC2144 (128k)", "67305234", 0x40000200, 0x1000, 11, lpc2138_layout, boot_2xxx},
{"LPC2146 (256k)", "67305251", 0x40000200, 0x1000, 15, lpc2138_layout, boot_2xxx},
{"LPC2148 (500k)", "67305253", 0x40000200, 0x1000, 27, lpc2138_layout, boot_2xxx},
{"LPC2194 (248k)", "50462483", 0x40000200, 0x2000, 17, lpc2214_layout, boot_2xxx},
{"LPC2212 (248k)", "67239698", 0x40000200, 0x2000, 17, lpc2214_layout, boot_2xxx},
{"LPC2214 (248k)", "100794131", 0x40000200, 0x2000, 17, lpc2214_layout, boot_2xxx},
{"LPC2292 (248k)", "67239699", 0x40000200, 0x2000, 17, lpc2214_layout, boot_2xxx},
{"LPC2294 (248k)", "84016915", 0x40000200, 0x2000, 17, lpc2214_layout, boot_2xxx},
{"LPC2103 (32k)", "327441", 0x40000200, 0x1000, 8, lpc2138_layout, boot_2xxx},
{"LPC2364 (128k)", "100924162", 0x40000200, 0x1000, 11, lpc2138_layout, boot_23xx},
{"LPC2366 (256k)", "100924195", 0x40000200, 0x1000, 15, lpc2138_layout, boot_23xx},
{"LPC2368 (500k)", "100924197", 0x40000200, 0x1000, 27, lpc2138_layout, boot_23xx},
{"LPC2378 (500k)", "117702437", 0x40000200, 0x1000, 27, lpc2138_layout, boot_23xx},
{"LPC2387 (500k)", "402716981", 0x40000200, 0x1000, 27, lpc2138_layout, boot_23xx},
{"LPC2387 (500k)", "385941301", 0x40000200, 0x1000, 27, lpc2138_layout, boot_23xx},
{"LPC2468 (500k)", "100925237", 0x40000200, 0x1000, 27, lpc2138_layout, boot_23xx},
{NULL, NULL, 0, 0, 0, NULL}
};
char *lpc_return_strings[] = {
"CMD_SUCCESS", "INVALID_COMMAND", "SRC_ADDR_ERROR", "DST_ADDR_ERROR",
"SRC_ADDR_NOT_MAPPED", "DST_ADDR_NOT_MAPPED", "COUNT_ERROR", "INVALID_SECTOR",
"SECTOR_NOT_BLANK", "SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION", "COMPARE_ERROR",
"BUSY", "PARAM_ERROR", "ADDR_ERROR", "ADDR_NOT_MAPPED", "CMD_LOCKED",
"INVALID_CODE", "INVALID_BAUD_RATE", "INVALID_STOP_BIT",
"CODE_READ_PROTECTION_ENABLED"
};

View File

@ -0,0 +1,20 @@
extern char *lpc_return_strings[];
struct sector_info_struct { // an array of
int address; // where each sector is located
int size; // and how big it is
};
struct chip_info_struct {
char *part_number; // human readable part number
char *id_string; // id string sent by "J" command
unsigned int ram_addr; // where to download into RAM
int chunk_size; // download to ram chunk size
int num_sector; // number of flash sectors
struct sector_info_struct *layout; // layout of sectors
const unsigned int *bootprog; // code that boots into user program (NULL = DTR/RTS only)
};
extern struct chip_info_struct chip_info[];

View File

@ -0,0 +1,85 @@
/*
* LPC 2000 Loader, http://www.pjrc.com/arm/lpc2k_pgm
* Copyright (c) 2004, PJRC.COM, LLC, <paul@pjrc.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
/* If this code fails to build, please provide at least the following
* information when requesting (free) technical support.
*
* 1: Complete copy of all messages during the build.
* 2: Output of "gtk-config --version"
* 3: Output of "gtk-config --libs"
* 4: Output of "gtk-config --cflags"
* 5: Output of "uname -a"
* 6: Version of GTK installed... eg, type: ls -l /lib/libgtk*
* 7: Other info... which linux distribution, version, other software
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "uuencode.h"
unsigned int sum = 0;
void cksum(const char *str)
{
int num, i;
unsigned char data[256];
if (str == NULL) {
return;
}
num = uudecode(str, data, sizeof(data));
for (i = 0; i < num; i++) {
sum += data[i];
}
}
int main()
{
char buf[4096];
while (!feof(stdin)) {
fgets(buf, sizeof(buf), stdin);
if (strcmp(buf, "\n") == 0) {
break;
}
cksum(buf);
}
printf("sum = %u\n", sum);
return 0;
}

View File

@ -0,0 +1,40 @@
#include "control_2xxx.h"
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include "serial.h"
void hard_reset_to_bootloader(void)
{
/* Use this lines for flashing a node with interrupted DTR line */
/* printf("Press Reset - confirm with anykey\n");
getchar();
*/
printf("Reset CPU (into bootloader)\r\n");
set_rts(1); // RTS (ttl level) connects to P0.14
/* the next two lines should be commented for the prepared node */
set_dtr(1); // DTR (ttl level) connects to RST
send_break_signal(); // or break detect circuit to RST
usleep(75000);
/* Use this lines for flashing a node with interrupted DTR line */
/* printf("Release Reset - confirm with anykey\n");
getchar();
*/
set_dtr(0); // allow the CPU to run:
set_baud(baud_rate);
set_rts(1); // set RTS again (as it has been reset by set_baudrate)
usleep(40000);
}
void hard_reset_to_user_code(void)
{
printf("Reset CPU (into user code)\r\n");
set_rts(0); // RTS (ttl level) connects to P0.14
set_dtr(1); // DTR (ttl level) connects to RST
send_break_signal(); // or break detect circuit to RST
usleep(75000);
set_dtr(0); // allow the CPU to run
usleep(40000);
}

View File

@ -0,0 +1,8 @@
#ifndef CONTROL_2XXXX_H
#define CONTROL_2XXXX_H
void hard_reset_to_bootloader(void);
void hard_reset_to_user_code(void);
#endif // ..._H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
extern int download_begin(char *file);
extern void soft_reboot_begin(void);
extern void hard_reset_to_bootloader(void);
extern void hard_reset_to_user_code(void);
extern void download_cancel(const char *mesg);
extern void download_rx_term(const unsigned char *buf, int num);
extern void download_rx_port(const unsigned char *buf, int num);
extern void download_timer(void);

View File

@ -0,0 +1,422 @@
/*
* LPC 2000 Loader, http://www.pjrc.com/arm/lpc2k_pgm
* Copyright (c) 2004, PJRC.COM, LLC, <paul@pjrc.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
/* If this code fails to build, please provide at least the following
* information when requesting (free) technical support.
*
* 1: Complete copy of all messages during the build.
* 2: Output of "gtk-config --version"
* 3: Output of "gtk-config --libs"
* 4: Output of "gtk-config --cflags"
* 5: Output of "uname -a"
* 6: Version of GTK installed... eg, type: ls -l /lib/libgtk*
* 7: Other info... which linux distribution, version, other software
*/
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <gtk/gtk.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "gui.h"
#include "settings.h"
#include "serial.h"
#include "lpc2k_pgm.h"
#include "download.h"
static GtkWidget *firmware_label, *firmware_entry, *program_button;
static GtkWidget *port_label, *port_entry, *baud_label, *baud_combo;
static GtkWidget *crystal_label, *crystal_entry, *mhz_label;
static GtkWidget *reboot_button, *bootloader_button, *quit_button;
static GtkWidget *line1_hbox, *line2_hbox, *line3_hbox, *line4_hbox;
static GtkWidget *main_vbox, *main_window;
static int port_timeout = 0;
static int baud_timeout = 0;
static int download_in_progress = 0;
gint do_quit(GtkWidget *widget, gpointer *data)
{
gtk_main_quit();
return FALSE;
}
gint do_program(GtkWidget *widget, gpointer *data)
{
if (download_in_progress) {
// error... not supposed to get here
gtk_widget_set_sensitive(program_button, FALSE);
return FALSE;
}
download_in_progress = 1;
gtk_widget_set_sensitive(program_button, FALSE);
gtk_widget_set_sensitive(reboot_button, FALSE);
gtk_widget_set_sensitive(bootloader_button, TRUE);
download_begin();
return FALSE;
}
int file_exists(const char *filename)
{
struct stat file_stats;
int r;
r = stat(filename, &file_stats);
if (r != 0) {
return 0;
}
if (!S_ISREG(file_stats.st_mode)) {
return 0;
}
return 1;
}
void done_program(int still_in_bootloader)
{
download_in_progress = 0;
if (file_exists(gtk_entry_get_text(GTK_ENTRY(firmware_entry)))) {
gtk_widget_set_sensitive(program_button, TRUE);
}
else {
gtk_widget_set_sensitive(program_button, FALSE);
}
gtk_widget_set_sensitive(bootloader_button, TRUE);
gtk_widget_set_sensitive(reboot_button, TRUE);
}
gint do_reboot(GtkWidget *widget, gpointer *data)
{
if (download_in_progress) {
download_cancel(NULL);
gtk_widget_set_sensitive(program_button, FALSE);
gtk_widget_set_sensitive(reboot_button, FALSE);
gtk_widget_set_sensitive(bootloader_button, FALSE);
}
gtk_widget_set_sensitive(program_button, FALSE);
gtk_widget_set_sensitive(reboot_button, FALSE);
gtk_widget_set_sensitive(bootloader_button, FALSE);
hard_reset_to_user_code();
#if 0
download_in_progress = 1;
soft_reboot_begin();
#endif
if (file_exists(gtk_entry_get_text(GTK_ENTRY(firmware_entry)))) {
gtk_widget_set_sensitive(program_button, TRUE);
}
else {
gtk_widget_set_sensitive(program_button, FALSE);
}
gtk_widget_set_sensitive(bootloader_button, TRUE);
return FALSE;
}
gint do_bootloader(GtkWidget *widget, gpointer *data)
{
if (download_in_progress) {
download_cancel(NULL);
gtk_widget_set_sensitive(program_button, FALSE);
gtk_widget_set_sensitive(reboot_button, FALSE);
gtk_widget_set_sensitive(bootloader_button, FALSE);
}
hard_reset_to_bootloader();
if (file_exists(gtk_entry_get_text(GTK_ENTRY(firmware_entry)))) {
gtk_widget_set_sensitive(program_button, TRUE);
}
else {
gtk_widget_set_sensitive(program_button, FALSE);
}
gtk_widget_set_sensitive(reboot_button, TRUE);
gtk_widget_set_sensitive(bootloader_button, TRUE);
return FALSE;
}
gint do_new_port(GtkWidget *widget, gpointer *data)
{
port_timeout = 12;
return FALSE;
}
gint do_new_baud(GtkWidget *widget, gpointer *data)
{
baud_timeout = 7;
return FALSE;
}
gint do_new_file(GtkWidget *widget, gpointer *data)
{
const char *filename;
filename = gtk_entry_get_text(GTK_ENTRY(firmware_entry));
if (file_exists(filename)) {
new_file_setting(filename);
if (download_in_progress) {
gtk_widget_set_sensitive(program_button, FALSE);
}
else {
gtk_widget_set_sensitive(program_button, TRUE);
}
}
else {
gtk_widget_set_sensitive(program_button, FALSE);
}
return FALSE;
}
gint do_new_crystal(GtkWidget *widget, gpointer *data)
{
const char *xtal;
xtal = gtk_entry_get_text(GTK_ENTRY(crystal_entry));
new_crystal_setting(xtal);
return FALSE;
}
gint do_timer(gpointer data)
{
if (port_timeout && --port_timeout == 0) {
open_serial_port(gtk_entry_get_text(GTK_ENTRY(port_entry)));
}
if (baud_timeout && --baud_timeout == 0) {
change_baud(gtk_entry_get_text(GTK_ENTRY(
GTK_COMBO(baud_combo)->entry)));
}
if (download_in_progress) {
download_timer();
}
return TRUE;
}
void do_term_input(gpointer data, int fd, GdkInputCondition cond)
{
char buf[256];
int num, flags;
flags = fcntl(term_fd, F_GETFL);
fcntl(term_fd, F_SETFL, flags | O_NONBLOCK);
num = read(term_fd, buf, sizeof(buf));
fcntl(term_fd, F_SETFL, flags);
if (num > 0) {
if (download_in_progress) {
download_rx_term(buf, num);
}
else {
write_serial_port(buf, num);
}
}
}
void do_port_input(gpointer data, int fd, GdkInputCondition cond)
{
char buf[256];
int num;
num = read_serial_port_nb((unsigned char *)buf, sizeof(buf));
if (num > 0) {
if (download_in_progress) {
download_rx_port(buf, num);
}
else {
write(term_fd, buf, num);
}
}
}
void run_gui(void)
{
gtk_signal_connect(GTK_OBJECT(main_window), "delete_event",
GTK_SIGNAL_FUNC(do_quit), NULL);
gtk_signal_connect(GTK_OBJECT(quit_button), "pressed",
GTK_SIGNAL_FUNC(do_quit), NULL);
gtk_signal_connect(GTK_OBJECT(port_entry), "changed",
GTK_SIGNAL_FUNC(do_new_port), NULL);
gtk_signal_connect(GTK_OBJECT(GTK_COMBO(baud_combo)->entry), "changed",
GTK_SIGNAL_FUNC(do_new_baud), NULL);
gtk_signal_connect(GTK_OBJECT(firmware_entry), "changed",
GTK_SIGNAL_FUNC(do_new_file), NULL);
gtk_signal_connect(GTK_OBJECT(crystal_entry), "changed",
GTK_SIGNAL_FUNC(do_new_crystal), NULL);
gtk_signal_connect(GTK_OBJECT(program_button), "pressed",
GTK_SIGNAL_FUNC(do_program), NULL);
gtk_signal_connect(GTK_OBJECT(reboot_button), "pressed",
GTK_SIGNAL_FUNC(do_reboot), NULL);
gtk_signal_connect(GTK_OBJECT(bootloader_button), "pressed",
GTK_SIGNAL_FUNC(do_bootloader), NULL);
gtk_timeout_add(100, do_timer, NULL);
gdk_input_add(term_fd, GDK_INPUT_READ, do_term_input, NULL);
gdk_input_add(serial_port_fd(), GDK_INPUT_READ, do_port_input, NULL);
gtk_main();
}
void create_window(int *argc, char ***argv)
{
GList *gtk_baud_list = NULL;
int i;
gtk_init(argc, argv);
firmware_label = gtk_label_new("Firmware:");
gtk_label_set_justify(GTK_LABEL(firmware_label), GTK_JUSTIFY_RIGHT);
gtk_widget_show(firmware_label);
firmware_entry = gtk_entry_new();
gtk_widget_set_usize(firmware_entry, 110, 0);
gtk_entry_set_text(GTK_ENTRY(firmware_entry), file_setting());
gtk_widget_show(firmware_entry);
program_button = gtk_button_new_with_label("Program Now");
if (file_exists(file_setting())) {
gtk_widget_set_sensitive(program_button, TRUE);
}
else {
gtk_widget_set_sensitive(program_button, FALSE);
}
gtk_widget_show(program_button);
line1_hbox = gtk_hbox_new(FALSE, 2);
gtk_box_pack_start(GTK_BOX(line1_hbox), firmware_label, FALSE, FALSE, 2);
gtk_box_pack_start(GTK_BOX(line1_hbox), firmware_entry, TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(line1_hbox), program_button, FALSE, FALSE, 2);
gtk_widget_show(line1_hbox);
port_label = gtk_label_new("Port:");
gtk_label_set_justify(GTK_LABEL(port_label), GTK_JUSTIFY_RIGHT);
gtk_widget_show(port_label);
port_entry = gtk_entry_new();
gtk_widget_set_usize(port_entry, 80, 0);
gtk_entry_set_text(GTK_ENTRY(port_entry), port_setting());
open_serial_port(port_setting());
gtk_widget_show(port_entry);
baud_label = gtk_label_new("Baud:");
gtk_label_set_justify(GTK_LABEL(baud_label), GTK_JUSTIFY_RIGHT);
gtk_widget_show(baud_label);
baud_combo = gtk_combo_new();
for (i = 0; baud_list[i] != NULL; i++) {
gtk_baud_list = g_list_append(gtk_baud_list, baud_list[i]);
}
gtk_combo_set_popdown_strings(GTK_COMBO(baud_combo), gtk_baud_list);
gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(baud_combo)->entry), FALSE);
gtk_widget_set_usize(baud_combo, 75, 0);
for (i = 0; baud_list[i] != NULL; i++) {
if (strcmp(baud_list[i], baud_setting()) == 0) {
gtk_list_select_item(GTK_LIST(GTK_COMBO(baud_combo)->list), i);
break;
}
}
gtk_widget_show(baud_combo);
line2_hbox = gtk_hbox_new(FALSE, 2);
gtk_box_pack_start(GTK_BOX(line2_hbox), port_label, FALSE, FALSE, 2);
gtk_box_pack_start(GTK_BOX(line2_hbox), port_entry, TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(line2_hbox), baud_label, FALSE, FALSE, 2);
gtk_box_pack_start(GTK_BOX(line2_hbox), baud_combo, FALSE, FALSE, 2);
gtk_widget_show(line2_hbox);
crystal_label = gtk_label_new("Crystal:");
gtk_label_set_justify(GTK_LABEL(crystal_label), GTK_JUSTIFY_RIGHT);
gtk_widget_show(crystal_label);
crystal_entry = gtk_entry_new();
gtk_widget_set_usize(crystal_entry, 80, 0);
gtk_entry_set_text(GTK_ENTRY(crystal_entry), crystal_setting());
gtk_widget_show(crystal_entry);
mhz_label = gtk_label_new("(MHz)");
gtk_label_set_justify(GTK_LABEL(mhz_label), GTK_JUSTIFY_LEFT);
gtk_widget_show(mhz_label);
line3_hbox = gtk_hbox_new(FALSE, 2);
gtk_box_pack_start(GTK_BOX(line3_hbox), crystal_label, FALSE, FALSE, 2);
gtk_box_pack_start(GTK_BOX(line3_hbox), crystal_entry, TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(line3_hbox), mhz_label, FALSE, FALSE, 2);
gtk_widget_show(line3_hbox);
reboot_button = gtk_button_new_with_label("Reboot");
gtk_widget_set_sensitive(reboot_button, TRUE);
gtk_widget_show(reboot_button);
bootloader_button = gtk_button_new_with_label("Booloader");
gtk_widget_show(bootloader_button);
quit_button = gtk_button_new_with_label("Quit");
gtk_widget_show(quit_button);
line4_hbox = gtk_hbox_new(TRUE, 2);
gtk_box_pack_start(GTK_BOX(line4_hbox), reboot_button, TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(line4_hbox), bootloader_button, TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(line4_hbox), quit_button, TRUE, TRUE, 2);
gtk_widget_show(line4_hbox);
main_vbox = gtk_vbox_new(FALSE, 2);
gtk_box_pack_start(GTK_BOX(main_vbox), line1_hbox, TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(main_vbox), line2_hbox, TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(main_vbox), line3_hbox, TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(main_vbox), line4_hbox, TRUE, TRUE, 2);
gtk_widget_show(main_vbox);
main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_add(GTK_CONTAINER(main_window), main_vbox);
gtk_widget_show(main_window);
}

View File

@ -0,0 +1,3 @@
extern void create_window(int *argc, char ***argv);
extern void run_gui(void);
extern void done_program(int still_in_bootloader);

View File

@ -0,0 +1,314 @@
/*
* LPC 2000 Loader, http://www.pjrc.com/arm/lpc2k_pgm
* Copyright (c) 2004, PJRC.COM, LLC, <paul@pjrc.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
/* If this code fails to build, please provide at least the following
* information when requesting (free) technical support.
*
* 1: Complete copy of all messages during the build.
* 2: Output of "gtk-config --version"
* 3: Output of "gtk-config --libs"
* 4: Output of "gtk-config --cflags"
* 5: Output of "uname -a"
* 6: Version of GTK installed... eg, type: ls -l /lib/libgtk*
* 7: Other info... which linux distribution, version, other software
*/
#include <stdio.h>
#include <string.h>
// the maximum flash image size we can support
// chips with larger memory may be used, but only this
// much intel-hex data can be loaded into memory!
#define MAX_MEMORY_SIZE 0x80000
#include "ihex.h"
static unsigned char firmware_image[MAX_MEMORY_SIZE];
static unsigned char firmware_mask[MAX_MEMORY_SIZE];
static int end_record_seen = 0;
static int byte_count;
static unsigned int extended_addr = 0;
static int parse_hex_line(char *line);
/****************************************************************/
/* */
/* Read Intel Hex File */
/* */
/****************************************************************/
int read_intel_hex(const char *filename)
{
FILE *fp;
int i, lineno = 0;
char buf[1024];
byte_count = 0;
end_record_seen = 0;
for (i = 0; i < MAX_MEMORY_SIZE; i++) {
firmware_image[i] = 0xFF;
firmware_mask[i] = 0;
}
extended_addr = 0;
fp = fopen(filename, "r");
if (fp == NULL) {
printf("Unable to read file %s\n", filename);
return -1;
}
while (!feof(fp)) {
*buf = '\0';
fgets(buf, sizeof(buf), fp);
lineno++;
if (*buf) {
if (parse_hex_line(buf) == 0) {
printf("Warning, parse error line %d\n", lineno);
return -2;
}
}
if (end_record_seen) {
break;
}
if (feof(stdin)) {
break;
}
}
fclose(fp);
return byte_count;
}
/* from ihex.c, at http://www.pjrc.com/tech/8051/pm2_docs/intel-hex.html */
/* parses a line of intel hex code, stores the data in bytes[] */
/* and the beginning address in addr, and returns a 1 if the */
/* line was valid, or a 0 if an error occured. The variable */
/* num gets the number of bytes that were stored into bytes[] */
int
parse_hex_line(char *line)
{
int addr, code, num;
int sum, len, cksum, i;
char *ptr;
num = 0;
if (line[0] != ':') {
return 0;
}
if (strlen(line) < 11) {
return 0;
}
ptr = line + 1;
if (!sscanf(ptr, "%02x", &len)) {
return 0;
}
ptr += 2;
if (strlen(line) < (11 + (len * 2))) {
return 0;
}
if (!sscanf(ptr, "%04x", &addr)) {
return 0;
}
ptr += 4;
/* printf("Line: length=%d Addr=%d\n", len, addr); */
if (!sscanf(ptr, "%02x", &code)) {
return 0;
}
if (addr + extended_addr + len >= MAX_MEMORY_SIZE) {
return 0;
}
ptr += 2;
sum = (len & 255) + ((addr >> 8) & 255) + (addr & 255) + (code & 255);
if (code != 0) {
if (code == 1) {
end_record_seen = 1;
return 1;
}
if (code == 2 && len == 2) {
if (!sscanf(ptr, "%04x", &i)) {
return 1;
}
ptr += 4;
sum += ((i >> 8) & 255) + (i & 255);
if (!sscanf(ptr, "%02x", &cksum)) {
return 1;
}
if (((sum & 255) + (cksum & 255)) & 255) {
return 1;
}
extended_addr = i << 4;
//printf("ext addr = %05X\n", extended_addr);
}
if (code == 4 && len == 2) {
if (!sscanf(ptr, "%04x", &i)) {
return 1;
}
ptr += 4;
sum += ((i >> 8) & 255) + (i & 255);
if (!sscanf(ptr, "%02x", &cksum)) {
return 1;
}
if (((sum & 255) + (cksum & 255)) & 255) {
return 1;
}
extended_addr = i << 16;
//printf("ext addr = %08X\n", extended_addr);
}
return 1; // non-data line
}
byte_count += len;
while (num != len) {
if (sscanf(ptr, "%02x", &i) != 1) {
return 0;
}
i &= 255;
firmware_image[addr + extended_addr + num] = i;
firmware_mask[addr + extended_addr + num] = 1;
ptr += 2;
sum += i;
(num)++;
if (num >= 256) {
return 0;
}
}
if (!sscanf(ptr, "%02x", &cksum)) {
return 0;
}
if (((sum & 255) + (cksum & 255)) & 255) {
return 0; /* checksum error */
}
return 1;
}
int bytes_within_range(int begin, int end)
{
int i;
if (begin < 0 || begin >= MAX_MEMORY_SIZE ||
end < 0 || end >= MAX_MEMORY_SIZE) {
return 0;
}
for (i = begin; i <= end; i++) {
if (firmware_mask[i]) {
return 1;
}
}
return 0;
}
void get_ihex_data(int addr, int len, unsigned char *bytes)
{
int i;
if (addr < 0 || len < 0 || addr + len >= MAX_MEMORY_SIZE) {
for (i = 0; i < len; i++) {
bytes[i] = 255;
}
return;
}
for (i = 0; i < len; i++) {
if (firmware_mask[addr]) {
bytes[i] = firmware_image[addr];
}
else {
bytes[i] = 255;
}
addr++;
}
}
void put_ihex_data(int addr, int len, const unsigned char *bytes)
{
int i;
if (addr < 0 || len < 0 || addr + len >= MAX_MEMORY_SIZE) {
return;
}
for (i = 0; i < len; i++) {
firmware_image[addr] = bytes[i];
firmware_mask[addr] = 1;
addr++;
}
}

View File

@ -0,0 +1,7 @@
extern int read_intel_hex(const char *filename);
extern int bytes_within_range(int begin, int end);
extern void get_ihex_data(int addr, int len, unsigned char *bytes);
extern void put_ihex_data(int addr, int len, const unsigned char *bytes);

View File

@ -0,0 +1,101 @@
/*
* LPC 2000 Loader, http://www.pjrc.com/arm/lpc2k_pgm
* Copyright (c) 2004, PJRC.COM, LLC, <paul@pjrc.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
/* If this code fails to build, please provide at least the following
* information when requesting (free) technical support.
*
* 1: Complete copy of all messages during the build.
* 2: Output of "gtk-config --version"
* 3: Output of "gtk-config --libs"
* 4: Output of "gtk-config --cflags"
* 5: Output of "uname -a"
* 6: Version of GTK installed... eg, type: ls -l /lib/libgtk*
* 7: Other info... which linux distribution, version, other software
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>
#include "lpc2k_pgm.h"
#include "serial.h"
#include "download.h"
int programming_done = 0;
int done_program(int i)
{
printf("Programming done.\n");
programming_done = 1;
return 0;
}
void handle_port_input()
{
unsigned char buf[256];
int num;
num = read_serial_port(buf, sizeof(buf));
if (num > 0) {
download_rx_port(buf, num);
}
}
void usage()
{
printf("usage: lpc2k_pgm <port> <ihex-file>\n");
}
int main(int argc, char **argv)
{
if (argc < 3) {
usage();
exit(1);
}
char *port_name = argv[1];
char *file_name = argv[2];
if (open_serial_port(port_name) < 0) {
return (1);
}
if (!download_begin(file_name)) {
return 1;
}
while (!programming_done) {
handle_port_input();
}
close_serial_port();
return 0;
}

View File

@ -0,0 +1,12 @@
#ifndef LPC2K_PGM
#define LPC2K_PGM
/* gets a name like "115200", sets baudrate accordingly. */
void change_baud(const char *baud_name);
/* called before/after using serial device, used to have terminal
* close the device.
*/
void signal_terminal();
#endif // LPC2K_PGM

Some files were not shown because too many files have changed in this diff Show More