Contiki port for the Atmel AVR Raven board
This commit is contained in:
parent
3f394fe927
commit
0a961b2ada
39
platform/avr-raven/Makefile.avr-raven
Normal file
39
platform/avr-raven/Makefile.avr-raven
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
CONTIKI_TARGET_DIRS = . rf230 apps net loader
|
||||||
|
CONTIKI_CORE=contiki-raven-main
|
||||||
|
CONTIKI_TARGET_MAIN = ${CONTIKI_CORE}.o
|
||||||
|
|
||||||
|
CONTIKI_TARGET_SOURCEFILES += rs232.c slip.c cfs-eeprom.c eeprom.c random.c \
|
||||||
|
mmem.c contiki-raven-main.c contiki-raven-default-init-net.c
|
||||||
|
|
||||||
|
CONTIKIAVR=$(CONTIKI)/cpu/avr
|
||||||
|
CONTIKIBOARD=.
|
||||||
|
|
||||||
|
CONTIKI_PLAT_DEFS = -DF_CPU=8000000UL -DAUTO_CRC_PADDING=2
|
||||||
|
|
||||||
|
MCU=atmega1284p
|
||||||
|
AVRDUDE_PROGRAMMER=jtag2
|
||||||
|
|
||||||
|
# For usb devices, you may either use PORT=usb, or (e.g. if you have more than one
|
||||||
|
# programmer connected) you can use the following trick to find out the serial number:
|
||||||
|
#
|
||||||
|
# The example is for an JTAGICE mkII used to program an ATmega128:
|
||||||
|
# avrdude -v -P usb:xxxx -c jtag2 -p atmega128
|
||||||
|
AVRDUDE_PORT=usb:00B000000D79
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Additional avrdude options
|
||||||
|
# Verify off
|
||||||
|
AVRDUDE_OPTIONS=-V
|
||||||
|
|
||||||
|
|
||||||
|
include $(CONTIKIAVR)/Makefile.avr
|
||||||
|
|
||||||
|
# Source for AT86RF230
|
||||||
|
include $(CONTIKI)/cpu/avr/radio/rf230/Makefile.rf230
|
||||||
|
|
||||||
|
# Source for Atmel/Cisco 802.15.4'ish MAC
|
||||||
|
include $(CONTIKI)/cpu/avr/radio/mac/Makefile.mac
|
||||||
|
|
||||||
|
# Source for IEEE 802.15.4 manager interface
|
||||||
|
include $(CONTIKI)/cpu/avr/radio/ieee-manager/Makefile.ieee-manager
|
65
platform/avr-raven/avr-raven-eeprom.hex
Executable file
65
platform/avr-raven/avr-raven-eeprom.hex
Executable file
|
@ -0,0 +1,65 @@
|
||||||
|
:100000000011223344556677FFFFFFFFFFFFFFFF1C
|
||||||
|
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
|
||||||
|
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
|
||||||
|
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
|
||||||
|
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
|
||||||
|
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
|
||||||
|
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
|
||||||
|
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
|
||||||
|
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
|
||||||
|
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
|
||||||
|
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
|
||||||
|
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
|
||||||
|
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
|
||||||
|
:1000D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
|
||||||
|
:1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
|
||||||
|
:1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
|
||||||
|
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
|
||||||
|
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
|
||||||
|
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
|
||||||
|
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
|
||||||
|
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
|
||||||
|
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
|
||||||
|
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
|
||||||
|
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
|
||||||
|
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
|
||||||
|
:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
|
||||||
|
:1001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
|
||||||
|
:1001B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
|
||||||
|
:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
|
||||||
|
:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
|
||||||
|
:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
|
||||||
|
:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
|
||||||
|
:10020000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
|
||||||
|
:10021000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE
|
||||||
|
:10022000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE
|
||||||
|
:10023000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE
|
||||||
|
:10024000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE
|
||||||
|
:10025000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE
|
||||||
|
:10026000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E
|
||||||
|
:10027000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E
|
||||||
|
:10028000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E
|
||||||
|
:10029000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
|
||||||
|
:1002A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E
|
||||||
|
:1002B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E
|
||||||
|
:1002C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E
|
||||||
|
:1002D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
|
||||||
|
:1002E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E
|
||||||
|
:1002F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E
|
||||||
|
:10030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD
|
||||||
|
:10031000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED
|
||||||
|
:10032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD
|
||||||
|
:10033000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
|
||||||
|
:10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
|
||||||
|
:10035000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD
|
||||||
|
:10036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D
|
||||||
|
:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D
|
||||||
|
:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D
|
||||||
|
:10039000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D
|
||||||
|
:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
|
||||||
|
:1003B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
|
||||||
|
:1003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D
|
||||||
|
:1003D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D
|
||||||
|
:1003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D
|
||||||
|
:1003F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D
|
||||||
|
:00000001FF
|
124
platform/avr-raven/contiki-conf.h
Normal file
124
platform/avr-raven/contiki-conf.h
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006, Technical University of Munich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* @(#)$$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Configuration for sample STK 501 Contiki kernel
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Simon Barner <barner@in.tum.de
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CONTIKI_CONF_H__
|
||||||
|
#define __CONTIKI_CONF_H__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef int32_t s32_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MCU and clock rate
|
||||||
|
*/
|
||||||
|
#define MCU_MHZ 8
|
||||||
|
#define PLATFORM PLATFORM_AVR
|
||||||
|
|
||||||
|
/* Clock ticks per second */
|
||||||
|
#define CLOCK_CONF_SECOND 125
|
||||||
|
|
||||||
|
/* COM port to be used for SLIP connection */
|
||||||
|
#define SLIP_PORT RS232_PORT_0
|
||||||
|
|
||||||
|
/* Pre-allocated memory for loadable modules heap space (in bytes)*/
|
||||||
|
#define MMEM_CONF_SIZE 256
|
||||||
|
|
||||||
|
/* Use the following address for code received via the codeprop
|
||||||
|
* facility
|
||||||
|
*/
|
||||||
|
#define EEPROMFS_ADDR_CODEPROP 0x8000
|
||||||
|
|
||||||
|
#define CCIF
|
||||||
|
#define CLIF
|
||||||
|
|
||||||
|
#define RIMEADDR_CONF_SIZE 8
|
||||||
|
#define RIMEBUF_CONF_HDR_SIZE 0
|
||||||
|
|
||||||
|
/* 0 for IPv6, or 1 for HC1, 2 for HC01 */
|
||||||
|
#define SICSLOWPAN_CONF_COMPRESSION_IPV6 0
|
||||||
|
#define SICSLOWPAN_CONF_COMPRESSION_HC1 1
|
||||||
|
#define SICSLOWPAN_CONF_COMPRESSION_HC01 2
|
||||||
|
|
||||||
|
#define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_CONF_COMPRESSION_HC01
|
||||||
|
#define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 2
|
||||||
|
#define SICSLOWPAN_CONF_FRAG 1
|
||||||
|
|
||||||
|
#define SICSLOWPAN_CONF_MAXAGE 5
|
||||||
|
|
||||||
|
#define UIP_CONF_LL_802154 1
|
||||||
|
#define UIP_CONF_LLH_LEN 0
|
||||||
|
|
||||||
|
#define UIP_CONF_MAX_CONNECTIONS 2
|
||||||
|
#define UIP_CONF_MAX_LISTENPORTS 2
|
||||||
|
#define UIP_CONF_UDP_CONNS 2
|
||||||
|
|
||||||
|
#define UIP_CONF_IP_FORWARD 0
|
||||||
|
#define UIP_CONF_FWCACHE_SIZE 0
|
||||||
|
|
||||||
|
#define UIP_CONF_IPV6 1
|
||||||
|
#define UIP_CONF_IPV6_CHECKS 1
|
||||||
|
#define UIP_CONF_IPV6_QUEUE_PKT 1
|
||||||
|
#define UIP_CONF_IPV6_REASSEMBLY 0
|
||||||
|
#define UIP_CONF_NETIF_MAX_ADDRESSES 3
|
||||||
|
#define UIP_CONF_ND6_MAX_PREFIXES 3
|
||||||
|
#define UIP_CONF_ND6_MAX_NEIGHBORS 4
|
||||||
|
#define UIP_CONF_ND6_MAX_DEFROUTERS 2
|
||||||
|
|
||||||
|
#define UIP_CONF_UDP 1
|
||||||
|
#define UIP_CONF_UDP_CHECKSUMS 1
|
||||||
|
|
||||||
|
#define UIP_CONF_TCP 1
|
||||||
|
#define UIP_CONF_TCP_SPLIT 1
|
||||||
|
|
||||||
|
|
||||||
|
typedef unsigned short clock_time_t;
|
||||||
|
typedef unsigned char u8_t;
|
||||||
|
typedef unsigned short u16_t;
|
||||||
|
typedef unsigned long u32_t;
|
||||||
|
typedef unsigned short uip_stats_t;
|
||||||
|
typedef unsigned long off_t;
|
||||||
|
|
||||||
|
void clock_delay(unsigned int us2);
|
||||||
|
void clock_wait(int ms10);
|
||||||
|
void clock_set_seconds(unsigned long s);
|
||||||
|
unsigned long clock_seconds(void);
|
||||||
|
|
||||||
|
#endif /* __CONTIKI_CONF_H__ */
|
48
platform/avr-raven/contiki-raven-default-init-lowlevel.c
Normal file
48
platform/avr-raven/contiki-raven-default-init-lowlevel.c
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006, Technical University of Munich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* Author: Simon Barner <barner@in.tum.de>
|
||||||
|
*
|
||||||
|
* @(#)$$
|
||||||
|
*/
|
||||||
|
#include "contiki-raven.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
init_lowlevel(void)
|
||||||
|
{
|
||||||
|
/* Configure default slip port with 19200 baud */
|
||||||
|
//rs232_init(RS232_PORT_0, USART_BAUD_19200, USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8);
|
||||||
|
|
||||||
|
/* Second rs232 port for debugging */
|
||||||
|
rs232_init(RS232_PORT_1, USART_BAUD_57600, USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8);
|
||||||
|
|
||||||
|
/* Redirect stdout to second port */
|
||||||
|
rs232_redirect_stdout (RS232_PORT_1);
|
||||||
|
}
|
51
platform/avr-raven/contiki-raven-default-init-net.c
Normal file
51
platform/avr-raven/contiki-raven-default-init-net.c
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006, Technical University of Munich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* Author: Simon Barner <barner@in.tum.de>
|
||||||
|
*
|
||||||
|
* @(#)$$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "contiki-raven.h"
|
||||||
|
#include "contiki-net.h"
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
init_net(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
uip_ipaddr_t ipprefix;
|
||||||
|
|
||||||
|
uip_ip6addr(&ipprefix, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
uip_netif_addr_add(&ipprefix, UIP_DEFAULT_PREFIX_LEN, 0, AUTOCONF);
|
||||||
|
uip_nd6_prefix_add(&ipprefix, UIP_DEFAULT_PREFIX_LEN, 0);
|
||||||
|
|
||||||
|
}
|
123
platform/avr-raven/contiki-raven-main.c
Normal file
123
platform/avr-raven/contiki-raven-main.c
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006, Technical University of Munich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* @(#)$$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Sample Contiki kernel for STK 501 development board
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Simon Barner <barner@in.tum.de
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "lib/mmem.h"
|
||||||
|
#include "loader/symbols-def.h"
|
||||||
|
#include "loader/symtab.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "mac.h"
|
||||||
|
#include "sicslowmac.h"
|
||||||
|
#include "sicslowpan.h"
|
||||||
|
#include "ieee-15-4-manager.h"
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "contiki-net.h"
|
||||||
|
#include "contiki-lib.h"
|
||||||
|
|
||||||
|
#include "dev/rs232.h"
|
||||||
|
#include "dev/serial.h"
|
||||||
|
#include "dev/slip.h"
|
||||||
|
|
||||||
|
#include "raven-lcd.h"
|
||||||
|
|
||||||
|
#include "sicslowmac.h"
|
||||||
|
|
||||||
|
|
||||||
|
PROCINIT(&etimer_process, &mac_process, &tcpip_process, &raven_lcd_process);
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
init_lowlevel(void)
|
||||||
|
{
|
||||||
|
/* First rs232 port for Raven 3290 port */
|
||||||
|
rs232_init(RS232_PORT_0, USART_BAUD_38400,
|
||||||
|
USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8);
|
||||||
|
|
||||||
|
/* Set input handler for 3290 port */
|
||||||
|
rs232_set_input(0,raven_lcd_serial_input);
|
||||||
|
|
||||||
|
/* Second rs232 port for debugging */
|
||||||
|
rs232_init(RS232_PORT_1, USART_BAUD_57600,
|
||||||
|
USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8);
|
||||||
|
|
||||||
|
/* Redirect stdout to second port */
|
||||||
|
rs232_redirect_stdout(RS232_PORT_1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
//calibrate_rc_osc_32k(); //CO: Had to comment this out
|
||||||
|
|
||||||
|
/* Initialize hardware */
|
||||||
|
init_lowlevel();
|
||||||
|
|
||||||
|
/* Clock */
|
||||||
|
clock_init();
|
||||||
|
|
||||||
|
|
||||||
|
/* Process subsystem */
|
||||||
|
process_init();
|
||||||
|
|
||||||
|
/* Register initial processes */
|
||||||
|
procinit_init();
|
||||||
|
|
||||||
|
/* Autostart processes */
|
||||||
|
autostart_start(autostart_processes);
|
||||||
|
|
||||||
|
//Give ourselves a prefix
|
||||||
|
init_net();
|
||||||
|
|
||||||
|
printf_P(PSTR("\n********BOOTING CONTIKI*********\n"));
|
||||||
|
|
||||||
|
printf_P(PSTR("System online.\n"));
|
||||||
|
|
||||||
|
/* Main scheduler loop */
|
||||||
|
while(1) {
|
||||||
|
process_run();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
58
platform/avr-raven/contiki-raven.h
Normal file
58
platform/avr-raven/contiki-raven.h
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006, Technical University of Munich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* @(#)$$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Sample Contiki kernel for STK 501 development board
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Simon Barner <barner@in.tum.de
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CONTIKI_RAVEN_H__
|
||||||
|
#define __CONTIKI_RAVEN_H__
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "contiki-net.h"
|
||||||
|
#include "contiki-lib.h"
|
||||||
|
|
||||||
|
#include "dev/rs232.h"
|
||||||
|
|
||||||
|
#include "dev/serial.h"
|
||||||
|
#include "dev/slip.h"
|
||||||
|
|
||||||
|
void init_lowlevel(void);
|
||||||
|
void init_net(void);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* #ifndef __CONTIKI_RAVEN_H__ */
|
68
platform/avr-raven/loadable_prg.c
Normal file
68
platform/avr-raven/loadable_prg.c
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006, Technical University of Munich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* @(#)$$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Sample loadable module
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Simon Barner <barner@in.tum.de>
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "dev/rs232.h"
|
||||||
|
#include "contiki.h"
|
||||||
|
|
||||||
|
PROCESS(test_process1, "Test process");
|
||||||
|
PROCESS_THREAD(test_process1, ev, data)
|
||||||
|
{
|
||||||
|
static struct etimer etimer;
|
||||||
|
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
|
rs232_print (RS232_PORT_1, "test_process 1 starting\n");
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
etimer_set(&etimer, CLOCK_SECOND);
|
||||||
|
PROCESS_WAIT_UNTIL(etimer_expired(&etimer));
|
||||||
|
rs232_print (RS232_PORT_1, "Tick\n");
|
||||||
|
etimer_set(&etimer, CLOCK_SECOND);
|
||||||
|
PROCESS_WAIT_UNTIL(etimer_expired(&etimer));
|
||||||
|
rs232_print (RS232_PORT_1, "Tack\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CLIF struct process * const autostart_processes[] = {&test_process1};
|
79
platform/avr-ravenlcd/Makefile
Normal file
79
platform/avr-ravenlcd/Makefile
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
|
###############################################################################
|
||||||
|
# Makefile for the RES-Raven-Mega3290 project
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
## General Flags
|
||||||
|
PROJECT = ravenlcd_3290
|
||||||
|
MCU = atmega3290
|
||||||
|
TARGET = $(PROJECT).elf
|
||||||
|
CC = avr-gcc
|
||||||
|
|
||||||
|
## Options common to compile, link and assembly rules
|
||||||
|
COMMON = -mmcu=$(MCU)
|
||||||
|
COMMON += -DF_CPU=8000000UL
|
||||||
|
|
||||||
|
## Compile options common for all C compilation units.
|
||||||
|
CFLAGS = $(COMMON) $(CEXTRA)
|
||||||
|
CFLAGS += -D AVRGCC -Wall -gstabs -Os -fsigned-char
|
||||||
|
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d
|
||||||
|
CFLAGS += -fshort-enums
|
||||||
|
|
||||||
|
## Assembly specific flags
|
||||||
|
ASMFLAGS = $(COMMON)
|
||||||
|
ASMFLAGS += -x assembler-with-cpp -Wa,-gstabs
|
||||||
|
|
||||||
|
## Linker flags
|
||||||
|
LDFLAGS = $(COMMON)
|
||||||
|
LDFLAGS += -Wl,-Map=$(PROJECT).map,--cref
|
||||||
|
|
||||||
|
## Intel Hex file production flags
|
||||||
|
HEX_FLASH_FLAGS = -R .eeprom
|
||||||
|
|
||||||
|
HEX_EEPROM_FLAGS = -j .eeprom
|
||||||
|
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
|
||||||
|
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0
|
||||||
|
|
||||||
|
## Include Directories
|
||||||
|
INCLUDES =
|
||||||
|
|
||||||
|
## Objects that must be built in order to link
|
||||||
|
SRC = adc.c key.c lcd.c raven3290.c uart.c menu.c sleep.c beep.c temp.c timer.c
|
||||||
|
|
||||||
|
OBJECTS = $(SRC:.c=.o)
|
||||||
|
|
||||||
|
## Objects explicitly added by the user
|
||||||
|
LINKONLYOBJECTS =
|
||||||
|
|
||||||
|
## Build
|
||||||
|
all: $(TARGET) $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss size
|
||||||
|
|
||||||
|
## Compile: create object files from C source files.
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(INCLUDES) $(CFLAGS) -c $<
|
||||||
|
|
||||||
|
##Link
|
||||||
|
$(TARGET): $(OBJECTS)
|
||||||
|
$(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)
|
||||||
|
|
||||||
|
%.hex: $(TARGET)
|
||||||
|
avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@
|
||||||
|
|
||||||
|
%.eep: $(TARGET)
|
||||||
|
avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0
|
||||||
|
|
||||||
|
%.lss: $(TARGET)
|
||||||
|
avr-objdump -h -S $< > $@
|
||||||
|
|
||||||
|
size: ${TARGET}
|
||||||
|
@echo
|
||||||
|
@avr-size -C --mcu=${MCU} ${TARGET}
|
||||||
|
|
||||||
|
## Clean target
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
-rm -rf $(OBJECTS) $(PROJECT).elf dep/* $(PROJECT).hex $(PROJECT).eep $(PROJECT).map $(PROJECT).lss
|
||||||
|
|
||||||
|
## Other dependencies
|
||||||
|
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
|
||||||
|
|
139
platform/avr-ravenlcd/adc.c
Normal file
139
platform/avr-ravenlcd/adc.c
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* Functions to control the ADC of the MCU. This is used to read the
|
||||||
|
* joystick.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "adc.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup lcd
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
static bool adc_initialized;
|
||||||
|
static bool adc_conversion_started;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This function will init the ADC with the following parameters.
|
||||||
|
*
|
||||||
|
* \param chan Determines the ADC channel to open.
|
||||||
|
* \param trig Sets what type of trigger is needed.
|
||||||
|
* \param ref Sets the proper reference voltage.
|
||||||
|
* \param prescale Sets the prescale to be used against the XTAL choice.
|
||||||
|
*
|
||||||
|
* \return 0
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
adc_init(adc_chan_t chan, adc_trig_t trig, adc_ref_t ref, adc_ps_t prescale)
|
||||||
|
{
|
||||||
|
/* Enable ADC module */
|
||||||
|
PRR &= ~(1 << PRADC);
|
||||||
|
|
||||||
|
/* Configure */
|
||||||
|
ADCSRA = (1<<ADEN)|prescale;
|
||||||
|
ADMUX = (uint8_t)ref|(uint8_t)chan;
|
||||||
|
ADCSRB = trig;
|
||||||
|
|
||||||
|
adc_initialized = true;
|
||||||
|
adc_conversion_started = false;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will disable the adc.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
adc_deinit(void)
|
||||||
|
{
|
||||||
|
/* Disable ADC */
|
||||||
|
ADCSRA &= ~(1<<ADEN);
|
||||||
|
PRR |= (1 << PRADC);
|
||||||
|
|
||||||
|
adc_initialized = false;
|
||||||
|
adc_conversion_started = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will start an ADC conversion
|
||||||
|
*
|
||||||
|
* \return 0
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
adc_conversion_start(void)
|
||||||
|
{
|
||||||
|
if (adc_initialized == false){
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
adc_conversion_started = true;
|
||||||
|
ADCSRA |= (1<<ADSC);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will read the ADC result during the ADC conversion and return
|
||||||
|
* the raw ADC conversion result.
|
||||||
|
*
|
||||||
|
* \param adjust This will Left or Right Adjust the ADC conversion result.
|
||||||
|
*
|
||||||
|
* \return ADC raw 16-byte ADC conversion result.
|
||||||
|
*/
|
||||||
|
int16_t
|
||||||
|
adc_result_get(adc_adj_t adjust)
|
||||||
|
{
|
||||||
|
if (adc_conversion_started == false){
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
if (ADCSRA & (1<<ADSC)){
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
adc_conversion_started = false;
|
||||||
|
ADMUX |= (adjust<<ADLAR);
|
||||||
|
return (int16_t)ADC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \} */
|
110
platform/avr-ravenlcd/adc.h
Normal file
110
platform/avr-ravenlcd/adc.h
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* Functions to control the ADC of the MCU. This is used to read the
|
||||||
|
* joystick.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ADC_H__
|
||||||
|
#define __ADC_H__
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define adc_conversion_ongoing (ADCSRA |= (1<<ADSC))
|
||||||
|
#define adc_conversion_done (!(ADCSRA |= (1<<ADSC)))
|
||||||
|
|
||||||
|
/** \brief Lists the different ways in which the ADC can be triggered. */
|
||||||
|
typedef enum {
|
||||||
|
ADC_TRIG_FREE_RUN = ((0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0)),
|
||||||
|
ADC_TRIG_ANACOMP = ((0<<ADTS2)|(0<<ADTS1)|(1<<ADTS0)),
|
||||||
|
ADC_TRIG_EXTINT0 = ((0<<ADTS2)|(1<<ADTS1)|(0<<ADTS0)),
|
||||||
|
ADC_TRIG_TIM0_COMPA = ((0<<ADTS2)|(1<<ADTS1)|(1<<ADTS0)),
|
||||||
|
ADC_TRIG_TIM0_OVF = ((1<<ADTS2)|(0<<ADTS1)|(0<<ADTS0)),
|
||||||
|
ADC_TRIG_TIM1_COMPB = ((1<<ADTS2)|(0<<ADTS1)|(1<<ADTS0)),
|
||||||
|
ADC_TRIG_TIM1_OVF = ((1<<ADTS2)|(1<<ADTS1)|(0<<ADTS0)),
|
||||||
|
ADC_TRIG_TIM1_CAPT = ((1<<ADTS2)|(1<<ADTS1)|(1<<ADTS0))
|
||||||
|
} adc_trig_t;
|
||||||
|
|
||||||
|
/** \brief Lists a variety of prescalers used with the ADC. */
|
||||||
|
typedef enum {
|
||||||
|
ADC_PS_2 = ((0<<ADPS2)|(0<<ADPS1)|(1<<ADPS0)),
|
||||||
|
ADC_PS_4 = ((0<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)),
|
||||||
|
ADC_PS_8 = ((0<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)),
|
||||||
|
ADC_PS_16 = ((1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0)),
|
||||||
|
ADC_PS_32 = ((1<<ADPS2)|(0<<ADPS1)|(1<<ADPS0)),
|
||||||
|
ADC_PS_64 = ((1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)),
|
||||||
|
ADC_PS_128 = ((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0))
|
||||||
|
} adc_ps_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Lists the ways in which the voltage reference can be configured
|
||||||
|
* for use with the ADC.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
ADC_REF_AREF = ((0<<REFS1)|(0<<REFS0)),
|
||||||
|
ADC_REF_AVCC = ((0<<REFS1)|(1<<REFS0)),
|
||||||
|
ADC_REF_INT = ((1<<REFS1)|(1<<REFS0))
|
||||||
|
} adc_ref_t;
|
||||||
|
|
||||||
|
/** \brief Lists each channel's mask value for the ADC MUX. */
|
||||||
|
typedef enum {
|
||||||
|
ADC_CHAN_ADC0 = ((0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0)),
|
||||||
|
ADC_CHAN_ADC1 = ((0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0)),
|
||||||
|
ADC_CHAN_ADC2 = ((0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(0<<MUX0)),
|
||||||
|
ADC_CHAN_ADC3 = ((0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(1<<MUX0)),
|
||||||
|
ADC_CHAN_ADC4 = ((0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(0<<MUX0)),
|
||||||
|
ADC_CHAN_ADC5 = ((0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(1<<MUX0)),
|
||||||
|
ADC_CHAN_ADC6 = ((0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0)),
|
||||||
|
ADC_CHAN_ADC7 = ((0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0))
|
||||||
|
} adc_chan_t;
|
||||||
|
|
||||||
|
/** \brief Lists the two ADC adjustment values. */
|
||||||
|
typedef enum {
|
||||||
|
ADC_ADJ_RIGHT = 0,
|
||||||
|
ADC_ADJ_LEFT = 1
|
||||||
|
} adc_adj_t;
|
||||||
|
|
||||||
|
int adc_init(adc_chan_t chan, adc_trig_t trig, adc_ref_t ref, adc_ps_t prescale);
|
||||||
|
void adc_deinit(void);
|
||||||
|
int adc_conversion_start(void);
|
||||||
|
int16_t adc_result_get(adc_adj_t adjust);
|
||||||
|
|
||||||
|
#endif /* __ADC_H__ */
|
||||||
|
|
93
platform/avr-ravenlcd/beep.c
Normal file
93
platform/avr-ravenlcd/beep.c
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file implements a beep function to emit a beep sound from Raven's
|
||||||
|
* speaker.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "beep.h"
|
||||||
|
#include "key.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup lcd
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Emits a beep from the Raven's buzzer. This routine simply toggles a port pin
|
||||||
|
* at an audio frequency, which causes a tone to be emitted from the Raven's speaker.
|
||||||
|
* The beep consists of two tones at two different frequencies. At the end, the beeper
|
||||||
|
* port pin is kept low, which causes the speaker amplifier to shut down.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
beep(void)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
volatile uint8_t j;
|
||||||
|
|
||||||
|
/* Turn on the power to the speaker. */
|
||||||
|
ENTER_DDR |= (1 << PE7);
|
||||||
|
ENTER_PUR |= (1 << PE7);
|
||||||
|
|
||||||
|
/* Setup port pin */
|
||||||
|
BEEP_DDR |= (1 << BEEP_BIT);
|
||||||
|
|
||||||
|
for (i=0;i<100;i++){
|
||||||
|
/* Toggle port pin */
|
||||||
|
BEEP_PIN |= (1 << BEEP_BIT);
|
||||||
|
/* Delay loop */
|
||||||
|
for (j=0;j<0xff;j++)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0;i<100;i++){
|
||||||
|
/* Toggle port pin */
|
||||||
|
BEEP_PIN |= (1 << BEEP_BIT);
|
||||||
|
/* Delay loop */
|
||||||
|
for (j=0;j<0xa0;j++)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Turn off speaker */
|
||||||
|
BEEP_PORT &= ~(1 << BEEP_BIT);
|
||||||
|
ENTER_PUR &= ~(1 << PE7);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \} */
|
57
platform/avr-ravenlcd/beep.h
Normal file
57
platform/avr-ravenlcd/beep.h
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file implements a beep function to emit a beep sound from Raven's
|
||||||
|
* speaker.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BEEP_H
|
||||||
|
#define BEEP_H
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
/** \name Definition of Port Pin for beeper. */
|
||||||
|
/** \{ */
|
||||||
|
#define BEEP_PORT PORTB
|
||||||
|
#define BEEP_DDR DDRB
|
||||||
|
#define BEEP_PIN PINB
|
||||||
|
#define BEEP_BIT 5
|
||||||
|
/** \} */
|
||||||
|
|
||||||
|
void beep(void);
|
||||||
|
|
||||||
|
#endif /* BEEP_H */
|
240
platform/avr-ravenlcd/doc/Doxyfile
Normal file
240
platform/avr-ravenlcd/doc/Doxyfile
Normal file
|
@ -0,0 +1,240 @@
|
||||||
|
# Doxyfile 1.4.1
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Project related configuration options
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
PROJECT_NAME = "Contiki 6LoWPAN Menu"
|
||||||
|
PROJECT_NUMBER =
|
||||||
|
OUTPUT_DIRECTORY = .
|
||||||
|
CREATE_SUBDIRS = NO
|
||||||
|
OUTPUT_LANGUAGE = English
|
||||||
|
USE_WINDOWS_ENCODING = NO
|
||||||
|
BRIEF_MEMBER_DESC = YES
|
||||||
|
REPEAT_BRIEF = YES
|
||||||
|
ABBREVIATE_BRIEF =
|
||||||
|
ALWAYS_DETAILED_SEC = NO
|
||||||
|
INLINE_INHERITED_MEMB = NO
|
||||||
|
FULL_PATH_NAMES = YES
|
||||||
|
STRIP_FROM_PATH = ../
|
||||||
|
STRIP_FROM_INC_PATH =
|
||||||
|
SHORT_NAMES = YES
|
||||||
|
JAVADOC_AUTOBRIEF = YES
|
||||||
|
MULTILINE_CPP_IS_BRIEF = NO
|
||||||
|
DETAILS_AT_TOP = YES
|
||||||
|
INHERIT_DOCS = YES
|
||||||
|
DISTRIBUTE_GROUP_DOC = NO
|
||||||
|
TAB_SIZE = 8
|
||||||
|
ALIASES =
|
||||||
|
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||||
|
OPTIMIZE_OUTPUT_JAVA = NO
|
||||||
|
SUBGROUPING = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Build related configuration options
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
EXTRACT_ALL = NO
|
||||||
|
EXTRACT_PRIVATE = NO
|
||||||
|
EXTRACT_STATIC = YES
|
||||||
|
EXTRACT_LOCAL_CLASSES = NO
|
||||||
|
EXTRACT_LOCAL_METHODS = NO
|
||||||
|
HIDE_UNDOC_MEMBERS = YES
|
||||||
|
HIDE_UNDOC_CLASSES = YES
|
||||||
|
HIDE_FRIEND_COMPOUNDS = NO
|
||||||
|
HIDE_IN_BODY_DOCS = NO
|
||||||
|
INTERNAL_DOCS = NO
|
||||||
|
CASE_SENSE_NAMES = YES
|
||||||
|
HIDE_SCOPE_NAMES = NO
|
||||||
|
SHOW_INCLUDE_FILES = YES
|
||||||
|
INLINE_INFO = YES
|
||||||
|
SORT_MEMBER_DOCS = YES
|
||||||
|
SORT_BRIEF_DOCS = NO
|
||||||
|
SORT_BY_SCOPE_NAME = NO
|
||||||
|
GENERATE_TODOLIST = YES
|
||||||
|
GENERATE_TESTLIST = YES
|
||||||
|
GENERATE_BUGLIST = NO
|
||||||
|
GENERATE_DEPRECATEDLIST= NO
|
||||||
|
ENABLED_SECTIONS =
|
||||||
|
MAX_INITIALIZER_LINES = 30
|
||||||
|
SHOW_USED_FILES = NO
|
||||||
|
SHOW_DIRECTORIES = YES
|
||||||
|
FILE_VERSION_FILTER =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to warning and progress messages
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
QUIET = NO
|
||||||
|
WARNINGS = YES
|
||||||
|
WARN_IF_UNDOCUMENTED = NO
|
||||||
|
WARN_IF_DOC_ERROR = YES
|
||||||
|
WARN_NO_PARAMDOC = NO
|
||||||
|
WARN_FORMAT = "$file:$line: $text"
|
||||||
|
WARN_LOGFILE =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the input files
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
INPUT = ../adc.c \
|
||||||
|
../beep.c \
|
||||||
|
../key.c \
|
||||||
|
../lcd.c \
|
||||||
|
../menu.c \
|
||||||
|
../raven3290.c \
|
||||||
|
../sleep.c \
|
||||||
|
../temp.c \
|
||||||
|
../timer.c \
|
||||||
|
../uart.c \
|
||||||
|
../adc.h \
|
||||||
|
../beep.h \
|
||||||
|
../key.h \
|
||||||
|
../lcd.h \
|
||||||
|
../menu.h \
|
||||||
|
../main.h \
|
||||||
|
../sleep.h \
|
||||||
|
../temp.h \
|
||||||
|
../timer.h \
|
||||||
|
../uart.h
|
||||||
|
|
||||||
|
FILE_PATTERNS =
|
||||||
|
RECURSIVE = NO
|
||||||
|
EXCLUDE =
|
||||||
|
EXCLUDE_SYMLINKS = NO
|
||||||
|
EXCLUDE_PATTERNS =
|
||||||
|
EXAMPLE_PATH =
|
||||||
|
EXAMPLE_PATTERNS =
|
||||||
|
EXAMPLE_RECURSIVE = NO
|
||||||
|
IMAGE_PATH = ./pics
|
||||||
|
INPUT_FILTER =
|
||||||
|
FILTER_PATTERNS =
|
||||||
|
FILTER_SOURCE_FILES = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to source browsing
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
SOURCE_BROWSER = YES
|
||||||
|
INLINE_SOURCES = NO
|
||||||
|
STRIP_CODE_COMMENTS = NO
|
||||||
|
REFERENCED_BY_RELATION = YES
|
||||||
|
REFERENCES_RELATION = YES
|
||||||
|
VERBATIM_HEADERS = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the alphabetical class index
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
ALPHABETICAL_INDEX = YES
|
||||||
|
COLS_IN_ALPHA_INDEX = 5
|
||||||
|
IGNORE_PREFIX =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the HTML output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_HTML = YES
|
||||||
|
HTML_OUTPUT = html
|
||||||
|
HTML_FILE_EXTENSION = .html
|
||||||
|
HTML_HEADER =
|
||||||
|
HTML_FOOTER =
|
||||||
|
HTML_STYLESHEET =
|
||||||
|
HTML_ALIGN_MEMBERS = YES
|
||||||
|
GENERATE_HTMLHELP = YES
|
||||||
|
CHM_FILE =
|
||||||
|
HHC_LOCATION =
|
||||||
|
GENERATE_CHI = YES
|
||||||
|
BINARY_TOC = YES
|
||||||
|
TOC_EXPAND = YES
|
||||||
|
DISABLE_INDEX = NO
|
||||||
|
ENUM_VALUES_PER_LINE = 4
|
||||||
|
GENERATE_TREEVIEW = YES
|
||||||
|
TREEVIEW_WIDTH = 250
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the LaTeX output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_LATEX = YES
|
||||||
|
LATEX_OUTPUT = latex
|
||||||
|
LATEX_CMD_NAME = latex
|
||||||
|
MAKEINDEX_CMD_NAME = makeindex
|
||||||
|
COMPACT_LATEX = YES
|
||||||
|
PAPER_TYPE = a4wide
|
||||||
|
EXTRA_PACKAGES =
|
||||||
|
LATEX_HEADER =
|
||||||
|
PDF_HYPERLINKS = YES
|
||||||
|
USE_PDFLATEX = YES
|
||||||
|
LATEX_BATCHMODE = NO
|
||||||
|
LATEX_HIDE_INDICES = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the RTF output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_RTF = NO
|
||||||
|
RTF_OUTPUT = rtf
|
||||||
|
COMPACT_RTF = NO
|
||||||
|
RTF_HYPERLINKS = NO
|
||||||
|
RTF_STYLESHEET_FILE =
|
||||||
|
RTF_EXTENSIONS_FILE =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the man page output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_MAN = NO
|
||||||
|
MAN_OUTPUT = man
|
||||||
|
MAN_EXTENSION = .3
|
||||||
|
MAN_LINKS = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the XML output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_XML = NO
|
||||||
|
XML_OUTPUT = xml
|
||||||
|
XML_SCHEMA =
|
||||||
|
XML_DTD =
|
||||||
|
XML_PROGRAMLISTING = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options for the AutoGen Definitions output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_AUTOGEN_DEF = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the Perl module output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_PERLMOD = NO
|
||||||
|
PERLMOD_LATEX = NO
|
||||||
|
PERLMOD_PRETTY = YES
|
||||||
|
PERLMOD_MAKEVAR_PREFIX =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the preprocessor
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
ENABLE_PREPROCESSING = YES
|
||||||
|
MACRO_EXPANSION = NO
|
||||||
|
EXPAND_ONLY_PREDEF = NO
|
||||||
|
SEARCH_INCLUDES = YES
|
||||||
|
INCLUDE_PATH =
|
||||||
|
INCLUDE_FILE_PATTERNS =
|
||||||
|
PREDEFINED = DOXYGEN
|
||||||
|
EXPAND_AS_DEFINED =
|
||||||
|
SKIP_FUNCTION_MACROS = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration::additions related to external references
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
TAGFILES =
|
||||||
|
GENERATE_TAGFILE =
|
||||||
|
ALLEXTERNALS = NO
|
||||||
|
EXTERNAL_GROUPS = YES
|
||||||
|
PERL_PATH = /usr/bin/perl
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the dot tool
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
CLASS_DIAGRAMS = NO
|
||||||
|
HIDE_UNDOC_RELATIONS = YES
|
||||||
|
HAVE_DOT = YES
|
||||||
|
CLASS_GRAPH = NO
|
||||||
|
COLLABORATION_GRAPH = NO
|
||||||
|
GROUP_GRAPHS = NO
|
||||||
|
UML_LOOK = NO
|
||||||
|
TEMPLATE_RELATIONS = NO
|
||||||
|
INCLUDE_GRAPH = NO
|
||||||
|
INCLUDED_BY_GRAPH = NO
|
||||||
|
CALL_GRAPH = NO
|
||||||
|
GRAPHICAL_HIERARCHY = NO
|
||||||
|
DIRECTORY_GRAPH = NO
|
||||||
|
DOT_IMAGE_FORMAT = png
|
||||||
|
DOT_PATH =
|
||||||
|
DOTFILE_DIRS =
|
||||||
|
MAX_DOT_GRAPH_WIDTH = 1024
|
||||||
|
MAX_DOT_GRAPH_HEIGHT = 1024
|
||||||
|
MAX_DOT_GRAPH_DEPTH = 0
|
||||||
|
DOT_TRANSPARENT = NO
|
||||||
|
DOT_MULTI_TARGETS = NO
|
||||||
|
GENERATE_LEGEND = YES
|
||||||
|
DOT_CLEANUP = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration::additions related to the search engine
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
SEARCHENGINE = NO
|
12
platform/avr-ravenlcd/doc/Makefile
Normal file
12
platform/avr-ravenlcd/doc/Makefile
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# This target requires and graphviz and doxygen
|
||||||
|
dox:
|
||||||
|
doxygen Doxyfile
|
||||||
|
|
||||||
|
|
||||||
|
pdf:
|
||||||
|
$(MAKE) -C latex refman.pdf
|
||||||
|
|
||||||
|
upload: dox #pdf
|
||||||
|
# scp -C latex/refman.pdf adamdunkels@shell.sourceforge.net:/home/groups/c/co/contiki/htdocs/
|
||||||
|
# tar czfv - html | ssh adamdunkels@shell.sourceforge.net "cd /home/groups/c/co/contiki/htdocs/; tar xfz -"
|
||||||
|
(cd html; rsync -rv . kloster.sics.se:/home/adam/public_html/contiki/docs)
|
BIN
platform/avr-ravenlcd/doc/pics/caution.gif
Normal file
BIN
platform/avr-ravenlcd/doc/pics/caution.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 982 B |
BIN
platform/avr-ravenlcd/doc/pics/contiki_menu_3290.jpg
Normal file
BIN
platform/avr-ravenlcd/doc/pics/contiki_menu_3290.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
204
platform/avr-ravenlcd/key.c
Normal file
204
platform/avr-ravenlcd/key.c
Normal file
|
@ -0,0 +1,204 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file provides joystick operations. Combined with ADC functions.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "key.h"
|
||||||
|
#include "uart.h"
|
||||||
|
#include "main.h"
|
||||||
|
#include "adc.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup lcd
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will intialize the joystick and the ADC for button readings.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
key_init(void)
|
||||||
|
{
|
||||||
|
/* Disable digital input buffer for joystick signal */
|
||||||
|
DIDR0 |= (1 << ADC1D);
|
||||||
|
|
||||||
|
/* Enter is input w/pullup */
|
||||||
|
ENTER_DDR &= ~(1<<ENTER_PIN);
|
||||||
|
ENTER_PUR |= (1<<ENTER_PIN);
|
||||||
|
|
||||||
|
/* Joystick is input wo/pullup (all though normal port function is overridden by ADC module when reading) */
|
||||||
|
KEY_DDR &= ~(1<<KEY_PIN);
|
||||||
|
KEY_PUR &= ~(1<<KEY_PIN);
|
||||||
|
|
||||||
|
/* Get the ADC ready to use */
|
||||||
|
adc_init(ADC_CHAN_ADC1, ADC_TRIG_FREE_RUN, ADC_REF_AVCC, ADC_PS_128);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will disable the ADC used for button readings.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
key_deinit(void)
|
||||||
|
{
|
||||||
|
/* Turn off the ADC */
|
||||||
|
adc_deinit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will poll run key_task() to determine if a button has been pressed.
|
||||||
|
*
|
||||||
|
* \retval True if button is pressed
|
||||||
|
* \retval False if button is not pressed
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
is_button(void)
|
||||||
|
{
|
||||||
|
/* Return true if button has been pressed. */
|
||||||
|
if (key_task() == KEY_NO_KEY){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This function will wait for a user to press a button.
|
||||||
|
*
|
||||||
|
* \return retval Returns the global button state.
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
get_button(void)
|
||||||
|
{
|
||||||
|
uint8_t retval;
|
||||||
|
while (!is_button())
|
||||||
|
;
|
||||||
|
|
||||||
|
retval = button;
|
||||||
|
button = KEY_STATE_DONE;
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will check the joystick state to return the current button status.
|
||||||
|
*
|
||||||
|
* \return button Current button state.
|
||||||
|
*/
|
||||||
|
key_state_t
|
||||||
|
key_task(void)
|
||||||
|
{
|
||||||
|
key_state_t key_state;
|
||||||
|
|
||||||
|
/* Check joystick state. Post event if any change since last */
|
||||||
|
key_state = key_state_get();
|
||||||
|
if (key_state == KEY_STATE_NO_KEY){
|
||||||
|
if (button == KEY_STATE_DONE){
|
||||||
|
button = KEY_STATE_NO_KEY;
|
||||||
|
}
|
||||||
|
return KEY_NO_KEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Key_state is button press code */
|
||||||
|
if (button == KEY_STATE_DONE){
|
||||||
|
/*
|
||||||
|
* Button has already been used, don't return any more presses
|
||||||
|
* until the button is released/re-pressed
|
||||||
|
*/
|
||||||
|
return KEY_NO_KEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Button has been pressed for the first time */
|
||||||
|
button = key_state;
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This function will start the ADC conversion and read the current
|
||||||
|
* converstion value to determine the button position.
|
||||||
|
*
|
||||||
|
* \retval KEY_ENTER Enter button has been pressed.
|
||||||
|
* \retval KEY_UP Up Button has been pressed.
|
||||||
|
* \retval KEY_RIGHT Right Button has been pressed.
|
||||||
|
* \retval KEY_LEFT Left Button has been pressed.
|
||||||
|
* \retval KEY_DOWN Down Button has been pressed.
|
||||||
|
* \retval KEY_NO_KEY No Button has been pressed.
|
||||||
|
*/
|
||||||
|
key_state_t
|
||||||
|
key_state_get(void)
|
||||||
|
{
|
||||||
|
int16_t reading;
|
||||||
|
|
||||||
|
/* Start the A/D conversion */
|
||||||
|
adc_conversion_start();
|
||||||
|
|
||||||
|
/* Wait for conversion to finish */
|
||||||
|
while ((reading = adc_result_get(ADC_ADJ_RIGHT)) == EOF )
|
||||||
|
;
|
||||||
|
|
||||||
|
/* Determine which button (if any) is being pressed */
|
||||||
|
if (!(ENTER_PORT & (1<<ENTER_PIN))){
|
||||||
|
return KEY_ENTER;
|
||||||
|
}
|
||||||
|
if (reading < 0x00A0){
|
||||||
|
return KEY_UP;
|
||||||
|
}
|
||||||
|
if (reading < 0x0180){
|
||||||
|
return KEY_RIGHT;
|
||||||
|
}
|
||||||
|
if (reading < 0x0280){
|
||||||
|
return KEY_LEFT;
|
||||||
|
}
|
||||||
|
if (reading < 0x0380){
|
||||||
|
return KEY_DOWN;
|
||||||
|
}
|
||||||
|
return KEY_NO_KEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \} */
|
96
platform/avr-ravenlcd/key.h
Normal file
96
platform/avr-ravenlcd/key.h
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file provides joystick operations. Combined with ADC functions.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __KEY_H__
|
||||||
|
#define __KEY_H__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** \name Port definition for reading the joystick input. */
|
||||||
|
/** \{ */
|
||||||
|
#define KEY_PORT PINF
|
||||||
|
#define KEY_PUR PORTF
|
||||||
|
#define KEY_DDR DDRF
|
||||||
|
#define KEY_PIN PINF1
|
||||||
|
/** \} */
|
||||||
|
|
||||||
|
/** \name Port defininition for the joystick Enter button. */
|
||||||
|
/** \{ */
|
||||||
|
#define ENTER_PORT PINE
|
||||||
|
#define ENTER_PUR PORTE
|
||||||
|
#define ENTER_DDR DDRE
|
||||||
|
#define ENTER_PIN PINE2
|
||||||
|
/** \} */
|
||||||
|
|
||||||
|
/** \name Valid Key States. */
|
||||||
|
/** \{ */
|
||||||
|
#define KEY_STATE_UP 0x01
|
||||||
|
#define KEY_STATE_DOWN 0x02
|
||||||
|
#define KEY_STATE_LEFT 0x04
|
||||||
|
#define KEY_STATE_RIGHT 0x08
|
||||||
|
#define KEY_STATE_ENTER 0x10
|
||||||
|
#define KEY_STATE_NO_KEY 0x00
|
||||||
|
#define KEY_STATE_DONE 0x20
|
||||||
|
/** \} */
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
KEY_UP = 0x01,
|
||||||
|
KEY_DOWN = 0x02,
|
||||||
|
KEY_LEFT = 0x04,
|
||||||
|
KEY_RIGHT = 0x08,
|
||||||
|
KEY_ENTER = 0x10,
|
||||||
|
KEY_NO_KEY = 0x00
|
||||||
|
}key_state_t;
|
||||||
|
|
||||||
|
extern key_state_t button;
|
||||||
|
|
||||||
|
/* Initialize the joystick */
|
||||||
|
void key_init(void);
|
||||||
|
void key_deinit(void);
|
||||||
|
key_state_t key_task(void);
|
||||||
|
key_state_t key_state_get(void);
|
||||||
|
uint8_t is_button(void);
|
||||||
|
uint8_t get_button(void);
|
||||||
|
|
||||||
|
#endif /* __KEY_H__ */
|
895
platform/avr-ravenlcd/lcd.c
Normal file
895
platform/avr-ravenlcd/lcd.c
Normal file
|
@ -0,0 +1,895 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file provides Raven LCD support.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lcd.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup lcd
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LCD_DUTY_STATIC = 0,
|
||||||
|
LCD_DUTY_HALF = 1,
|
||||||
|
LCD_DUTY_THIRD = 2,
|
||||||
|
LCD_DUTY_QUART = 3
|
||||||
|
} lcd_duty_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LCD_PM_0_12 = 0x0,
|
||||||
|
LCD_PM_0_14 = 0x1,
|
||||||
|
LCD_PM_0_16 = 0x2,
|
||||||
|
LCD_PM_0_18 = 0x3,
|
||||||
|
LCD_PM_0_20 = 0x4,
|
||||||
|
LCD_PM_0_22 = 0x5,
|
||||||
|
LCD_PM_0_23 = 0x6,
|
||||||
|
LCD_PM_0_24 = 0x7,
|
||||||
|
LCD_PM_0_26 = 0x8,
|
||||||
|
LCD_PM_0_28 = 0x9,
|
||||||
|
LCD_PM_0_30 = 0xA,
|
||||||
|
LCD_PM_0_32 = 0xB,
|
||||||
|
LCD_PM_0_34 = 0xC,
|
||||||
|
LCD_PM_0_36 = 0xD,
|
||||||
|
LCD_PM_0_38 = 0xE,
|
||||||
|
LCD_PM_0_39 = 0xF
|
||||||
|
} lcd_pm_t;
|
||||||
|
|
||||||
|
#if defined( DOXYGEN )
|
||||||
|
static const seg_map[];
|
||||||
|
static const LCD_character_table[];
|
||||||
|
static const seg_inf[];
|
||||||
|
static const lcd_symbol_chart[LCD_SYMBOL_COUNT];
|
||||||
|
#else /* !DOXYGEN */
|
||||||
|
/** \name Mapping of segments for different characters */
|
||||||
|
/** \{ */
|
||||||
|
static const unsigned char seg_map[] PROGMEM = {
|
||||||
|
NUM_LCD_SYMBOL_A|NUM_LCD_SYMBOL_B|NUM_LCD_SYMBOL_C|NUM_LCD_SYMBOL_D|NUM_LCD_SYMBOL_E|NUM_LCD_SYMBOL_F , /* 0 */
|
||||||
|
NUM_LCD_SYMBOL_B|NUM_LCD_SYMBOL_C , /* 1 */
|
||||||
|
NUM_LCD_SYMBOL_A|NUM_LCD_SYMBOL_B| NUM_LCD_SYMBOL_D|NUM_LCD_SYMBOL_E| NUM_LCD_SYMBOL_G, /* 2 */
|
||||||
|
NUM_LCD_SYMBOL_A|NUM_LCD_SYMBOL_B|NUM_LCD_SYMBOL_C|NUM_LCD_SYMBOL_D| NUM_LCD_SYMBOL_G, /* 3 */
|
||||||
|
NUM_LCD_SYMBOL_B|NUM_LCD_SYMBOL_C| NUM_LCD_SYMBOL_F|NUM_LCD_SYMBOL_G, /* 4 */
|
||||||
|
NUM_LCD_SYMBOL_A| NUM_LCD_SYMBOL_C|NUM_LCD_SYMBOL_D| NUM_LCD_SYMBOL_F|NUM_LCD_SYMBOL_G, /* 5 */
|
||||||
|
NUM_LCD_SYMBOL_A| NUM_LCD_SYMBOL_C|NUM_LCD_SYMBOL_D|NUM_LCD_SYMBOL_E|NUM_LCD_SYMBOL_F|NUM_LCD_SYMBOL_G, /* 6 */
|
||||||
|
NUM_LCD_SYMBOL_A|NUM_LCD_SYMBOL_B|NUM_LCD_SYMBOL_C , /* 7 */
|
||||||
|
NUM_LCD_SYMBOL_A|NUM_LCD_SYMBOL_B|NUM_LCD_SYMBOL_C|NUM_LCD_SYMBOL_D|NUM_LCD_SYMBOL_E|NUM_LCD_SYMBOL_F|NUM_LCD_SYMBOL_G, /* 8 */
|
||||||
|
NUM_LCD_SYMBOL_A|NUM_LCD_SYMBOL_B|NUM_LCD_SYMBOL_C|NUM_LCD_SYMBOL_D| NUM_LCD_SYMBOL_F|NUM_LCD_SYMBOL_G, /* 9 */
|
||||||
|
NUM_LCD_SYMBOL_A|NUM_LCD_SYMBOL_B|NUM_LCD_SYMBOL_C| NUM_LCD_SYMBOL_E|NUM_LCD_SYMBOL_F|NUM_LCD_SYMBOL_G, /* A */
|
||||||
|
NUM_LCD_SYMBOL_C|NUM_LCD_SYMBOL_D|NUM_LCD_SYMBOL_E|NUM_LCD_SYMBOL_F|NUM_LCD_SYMBOL_G, /* B */
|
||||||
|
NUM_LCD_SYMBOL_A| NUM_LCD_SYMBOL_D|NUM_LCD_SYMBOL_E|NUM_LCD_SYMBOL_F , /* C */
|
||||||
|
NUM_LCD_SYMBOL_B|NUM_LCD_SYMBOL_C|NUM_LCD_SYMBOL_D|NUM_LCD_SYMBOL_E| NUM_LCD_SYMBOL_G, /* D */
|
||||||
|
NUM_LCD_SYMBOL_A| NUM_LCD_SYMBOL_D|NUM_LCD_SYMBOL_E|NUM_LCD_SYMBOL_F|NUM_LCD_SYMBOL_G, /* E */
|
||||||
|
NUM_LCD_SYMBOL_A| NUM_LCD_SYMBOL_E|NUM_LCD_SYMBOL_F|NUM_LCD_SYMBOL_G, /* F */
|
||||||
|
0, /* ' ' (space) */
|
||||||
|
NUM_LCD_SYMBOL_G /* - (minus) */
|
||||||
|
};
|
||||||
|
/** \} */
|
||||||
|
|
||||||
|
/* Look-up tables for 14-segment characters */
|
||||||
|
static const unsigned int LCD_character_table[] PROGMEM = /* Character definitions table. */
|
||||||
|
{
|
||||||
|
0x0000, /* '*' (?) */
|
||||||
|
0x2830, /* '+' */
|
||||||
|
0x0000, /* ',' (Not defined) */
|
||||||
|
0x0810, /* '-' */
|
||||||
|
0x0200, /* '.' */
|
||||||
|
0x0240, /* '/' */
|
||||||
|
0x93C5, /* '0' */
|
||||||
|
0x80C0, /* '1' */
|
||||||
|
0x1994, /* '2' */
|
||||||
|
0x9894, /* '3' */
|
||||||
|
0x8891, /* '4' */
|
||||||
|
0x9815, /* '5' */
|
||||||
|
0x9915, /* '6' */
|
||||||
|
0x8084, /* '7' */
|
||||||
|
0x9995, /* '8' */
|
||||||
|
0x9895, /* '9' */
|
||||||
|
0x0000, /* ':' (Not defined) */
|
||||||
|
0x0000, /* ';' (Not defined) */
|
||||||
|
0x0000, /* '<' (Not defined) */
|
||||||
|
0x0000, /* '=' (Not defined) */
|
||||||
|
0x0202, /* '>' */
|
||||||
|
0x0000, /* '?' (Not defined) */
|
||||||
|
0x8E53, /* '@' (redefined as '%') */
|
||||||
|
0x8995, /* 'A' (+ 'a') */
|
||||||
|
0xB8A4, /* 'B' (+ 'b') */
|
||||||
|
0x1105, /* 'C' (+ 'c') */
|
||||||
|
0xB0A4, /* 'D' (+ 'd') */
|
||||||
|
0x1915, /* 'E' (+ 'e') */
|
||||||
|
0x0915, /* 'F' (+ 'f') */
|
||||||
|
0x9905, /* 'G' (+ 'g') */
|
||||||
|
0x8991, /* 'H' (+ 'h') */
|
||||||
|
0x2020, /* 'I' (+ 'i') */
|
||||||
|
0x9180, /* 'J' (+ 'j') */
|
||||||
|
0x0551, /* 'K' (+ 'k') */
|
||||||
|
0x1101, /* 'L' (+ 'l') */
|
||||||
|
0x81C3, /* 'M' (+ 'm') */
|
||||||
|
0x8583, /* 'N' (+ 'n') */
|
||||||
|
0x9185, /* 'O' (+ 'o') */
|
||||||
|
0x0995, /* 'P' (+ 'p') */
|
||||||
|
0x9585, /* 'Q' (+ 'q') */
|
||||||
|
0x0D95, /* 'R' (+ 'r') */
|
||||||
|
0x1406, /* 'S' (+ 's') */
|
||||||
|
0x2024, /* 'T' (+ 't') */
|
||||||
|
0x9181, /* 'U' (+ 'u') */
|
||||||
|
0x0341, /* 'V' (+ 'v') */
|
||||||
|
0x8781, /* 'W' (+ 'w') */
|
||||||
|
0x0642, /* 'X' (+ 'x') */
|
||||||
|
0x2042, /* 'Y' (+ 'y') */
|
||||||
|
0x1244, /* 'Z' (+ 'z') */
|
||||||
|
0x0000, /* '[' (Not defined) */
|
||||||
|
0x0000, /* '\' (Not defined) */
|
||||||
|
0x0000, /* ']' (Not defined) */
|
||||||
|
0x0000, /* '^' (Not defined) */
|
||||||
|
0x0000, /* '_' (Not defined) */
|
||||||
|
0x0004, /* A */
|
||||||
|
0x0080, /* B */
|
||||||
|
0x8000, /* C */
|
||||||
|
0x1000, /* D */
|
||||||
|
0x0100, /* E */
|
||||||
|
0x0001, /* F */
|
||||||
|
0x0002, /* G */
|
||||||
|
0x0020, /* H */
|
||||||
|
0x0040, /* J */
|
||||||
|
0x0800, /* K */
|
||||||
|
0x0400, /* L */
|
||||||
|
0x2000, /* M */
|
||||||
|
0x0200, /* N */
|
||||||
|
0x0010, /* O */
|
||||||
|
0x0000,
|
||||||
|
0x0000,
|
||||||
|
0x0000
|
||||||
|
};
|
||||||
|
|
||||||
|
/** \brief Seven segment reference guide in flash. */
|
||||||
|
static const unsigned char seg_inf[] PROGMEM = {
|
||||||
|
2<<5|19, /* A */
|
||||||
|
1<<5|19, /* B */
|
||||||
|
1<<5|9, /* C */
|
||||||
|
2<<5|4, /* D */
|
||||||
|
2<<5|9, /* E */
|
||||||
|
2<<5|14, /* F */
|
||||||
|
1<<5|14 /* G */
|
||||||
|
};
|
||||||
|
|
||||||
|
/** \brief LCD symbol chart located in flash. */
|
||||||
|
static const lcd_symbol_t lcd_symbol_chart[LCD_SYMBOL_COUNT] PROGMEM= {
|
||||||
|
/* Raven */
|
||||||
|
LCD_SYMBOL_RAVEN ,
|
||||||
|
|
||||||
|
/* Audio */
|
||||||
|
LCD_SYMBOL_BELL ,
|
||||||
|
LCD_SYMBOL_TONE ,
|
||||||
|
LCD_SYMBOL_MIC ,
|
||||||
|
LCD_SYMBOL_SPEAKER ,
|
||||||
|
|
||||||
|
/* Status */
|
||||||
|
LCD_SYMBOL_KEY ,
|
||||||
|
LCD_SYMBOL_ATT ,
|
||||||
|
|
||||||
|
/* Time */
|
||||||
|
LCD_SYMBOL_SUN ,
|
||||||
|
LCD_SYMBOL_MOON ,
|
||||||
|
LCD_SYMBOL_AM ,
|
||||||
|
LCD_SYMBOL_PM ,
|
||||||
|
|
||||||
|
/* Radio comus */
|
||||||
|
LCD_SYMBOL_RX ,
|
||||||
|
LCD_SYMBOL_TX ,
|
||||||
|
LCD_SYMBOL_IP ,
|
||||||
|
LCD_SYMBOL_PAN ,
|
||||||
|
LCD_SYMBOL_ZLINK ,
|
||||||
|
LCD_SYMBOL_ZIGBEE ,
|
||||||
|
|
||||||
|
/* Antenna status */
|
||||||
|
LCD_SYMBOL_ANT_FOOT,
|
||||||
|
LCD_SYMBOL_ANT_SIG1,
|
||||||
|
LCD_SYMBOL_ANT_SIG2,
|
||||||
|
LCD_SYMBOL_ANT_SIG3,
|
||||||
|
LCD_SYMBOL_ANT_DIS ,
|
||||||
|
|
||||||
|
/* Battery status */
|
||||||
|
LCD_SYMBOL_BAT_CONT,
|
||||||
|
LCD_SYMBOL_BAT_CAP1,
|
||||||
|
LCD_SYMBOL_BAT_CAP2,
|
||||||
|
LCD_SYMBOL_BAT_CAP3,
|
||||||
|
|
||||||
|
/* Envelope status */
|
||||||
|
LCD_SYMBOL_ENV_OP ,
|
||||||
|
LCD_SYMBOL_ENV_CL ,
|
||||||
|
LCD_SYMBOL_ENV_MAIN,
|
||||||
|
|
||||||
|
/* Temperature */
|
||||||
|
LCD_SYMBOL_C ,
|
||||||
|
LCD_SYMBOL_F ,
|
||||||
|
|
||||||
|
/* Numeric */
|
||||||
|
LCD_SYMBOL_MINUS ,
|
||||||
|
LCD_SYMBOL_DOT ,
|
||||||
|
LCD_SYMBOL_COL
|
||||||
|
};
|
||||||
|
#endif /* !DOXYGEN */
|
||||||
|
|
||||||
|
/** LCD text buffer */
|
||||||
|
static unsigned char lcd_text[20];
|
||||||
|
|
||||||
|
/** Textd buffer read pointer for text field in LCD display. When ptr>0 characters in front will be cleared (space) */
|
||||||
|
static int lcd_text_rd_ptr = 0;
|
||||||
|
|
||||||
|
/** Text pointer for writing new chars to text buffer */
|
||||||
|
static int lcd_text_wr_ptr = 0;
|
||||||
|
|
||||||
|
static bool lcd_scroll_enable;
|
||||||
|
static int lcd_scroll_prescale;
|
||||||
|
static int lcd_scroll_prescale_value;
|
||||||
|
static int lcd_num_print(uint16_t numb, bool negative, lcd_padding_t padding);
|
||||||
|
static void lcd_nmb_print_dig(uint8_t val, int dig);
|
||||||
|
static int lcd_text_sl(void);
|
||||||
|
static int lcd_text_put(const char* s, int pos);
|
||||||
|
static int lcd_char_put(unsigned char c, int pos);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This function will initialize the proper settings for the LCD driver.
|
||||||
|
*
|
||||||
|
* This ATmega3290p can directly support an LCD through register mapping.
|
||||||
|
*
|
||||||
|
* \return 0
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
lcd_init(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Configuring LCD with Extern clock (TOSC, 32.768kHz)
|
||||||
|
* 32786 Hz 32786 Hz
|
||||||
|
* frame_rate = ------------------ = ------------- = 32 Hz
|
||||||
|
* 8 * .prescl * .div 8 * 16 * 8
|
||||||
|
*/
|
||||||
|
|
||||||
|
lcd_config_t lcd_config ;
|
||||||
|
lcd_config.blanking = LCD_BLANKING_OFF;
|
||||||
|
lcd_config.buffer = LCD_BUFFER_ON;
|
||||||
|
lcd_config.wave = LCD_WAVE_LOW_POWER;
|
||||||
|
lcd_config.clock = LCD_CLOCK_EXTERN;
|
||||||
|
lcd_config.bias = LCD_BIAS_HALF;
|
||||||
|
lcd_config.prescl = LCD_PRESCL_16;
|
||||||
|
lcd_config.div = LCD_DIV_8;
|
||||||
|
lcd_config.drive = LCD_DRIVE_450;
|
||||||
|
lcd_config.contrast = LCD_CONTRAST_3_30;
|
||||||
|
|
||||||
|
/* Enable module */
|
||||||
|
PRR &= ~(1 << PRLCD);
|
||||||
|
|
||||||
|
/* Configure and enable LCD controller */
|
||||||
|
LCDCRB = lcd_config.lcdcrb|(LCD_PM_0_39<<LCDPM0)|(LCD_DUTY_QUART<<LCDMUX0); /* Add port mask/mux */
|
||||||
|
LCDFRR = lcd_config.lcdfrr;
|
||||||
|
LCDCCR = lcd_config.lcdccr;
|
||||||
|
LCDCRA = lcd_config.lcdcra|(1<<LCDEN)|(1<<LCDIE); /* Add interrupt- and LCD- enable */
|
||||||
|
|
||||||
|
/* clear screen */
|
||||||
|
lcd_symbol_clr_all();
|
||||||
|
|
||||||
|
/* Calculate scrolling value */
|
||||||
|
lcd_scroll_prescale_value = LCD_CLCK_FRQ/128;
|
||||||
|
lcd_scroll_prescale_value >>= (lcd_config.prescl == 0) ? 4 : (5+lcd_config.prescl);
|
||||||
|
lcd_scroll_prescale_value /= (lcd_config.div+1);
|
||||||
|
lcd_scroll_prescale_value = (lcd_scroll_prescale_value==0) ? 1 : lcd_scroll_prescale_value;
|
||||||
|
lcd_scroll_prescale = lcd_scroll_prescale_value;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will disable the LCD operation.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
lcd_deinit(void)
|
||||||
|
{
|
||||||
|
while (!(LCDCRA & (1<<LCDIF)))
|
||||||
|
;
|
||||||
|
/*
|
||||||
|
* Set LCD Blanking and clear interrupt flag
|
||||||
|
* by writing a logical one to the flag.
|
||||||
|
*/
|
||||||
|
|
||||||
|
LCDCRA = (1<<LCDEN)|(1<<LCDIF)|(1<<LCDBL);
|
||||||
|
/* Wait until LCD Blanking is effective. */
|
||||||
|
while ( !(LCDCRA & (1<<LCDIF)) )
|
||||||
|
;
|
||||||
|
|
||||||
|
/* Disable LCD */
|
||||||
|
LCDCRA = (0<<LCDEN) | (0<<LCDIE);
|
||||||
|
|
||||||
|
/* power LCD down */
|
||||||
|
PRR |= (1 << PRLCD);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will convert the incoming decimal number to BCD.
|
||||||
|
*
|
||||||
|
* \param inNumber Decimal number to convert
|
||||||
|
*
|
||||||
|
* \return newByte The converted deicmal number as byte.
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
itobcd(uint8_t inNumber)
|
||||||
|
{
|
||||||
|
int newByte;
|
||||||
|
|
||||||
|
newByte = 0;
|
||||||
|
|
||||||
|
while (inNumber >= 10){
|
||||||
|
inNumber -= 10;
|
||||||
|
newByte++;
|
||||||
|
}
|
||||||
|
|
||||||
|
newByte = newByte << 4;
|
||||||
|
newByte = (newByte | inNumber);
|
||||||
|
|
||||||
|
return newByte;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will put a HEX value on the LCD that represents the input
|
||||||
|
* parameter.
|
||||||
|
*
|
||||||
|
* \param numb Number to display as HEX.
|
||||||
|
* \param padding This pads the location to place the value on the LCD.
|
||||||
|
*
|
||||||
|
* \return lcd_num_print()
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
lcd_num_puthex(uint16_t numb, lcd_padding_t padding)
|
||||||
|
{
|
||||||
|
return lcd_num_print(numb, false, padding);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will put a DEC value on the LCD that represents the input
|
||||||
|
* parameter.
|
||||||
|
*
|
||||||
|
* \param numb Number to display as DEC.
|
||||||
|
* \param padding This pads the location to place the value on the LCD.
|
||||||
|
*
|
||||||
|
* \return lcd_num_print()
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
lcd_num_putdec(int numb, lcd_padding_t padding)
|
||||||
|
{
|
||||||
|
uint16_t bcd;
|
||||||
|
|
||||||
|
/* Check for overflow */
|
||||||
|
if (numb > 9999) {
|
||||||
|
numb = 9999;
|
||||||
|
} else if (numb < -9999) {
|
||||||
|
numb = -9999;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert to BCD */
|
||||||
|
bcd = itobcd(abs(numb));
|
||||||
|
|
||||||
|
/* Print */
|
||||||
|
return lcd_num_print(bcd, (bool)(numb<0), padding);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will clear numbers displayed on the LCD.
|
||||||
|
*
|
||||||
|
* \return 0
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
lcd_num_clr(void)
|
||||||
|
{
|
||||||
|
volatile unsigned char* lcd_data = (volatile unsigned char*)0xEC;
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
for (i=0;i<4;++i){
|
||||||
|
for (j=0;j<7;++j){
|
||||||
|
lcd_data[pgm_read_byte(&seg_inf[j])&0x1F] &= ~((pgm_read_byte(&seg_inf[j])>>5)<<(i*2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will put a string of characters out to the LCD.
|
||||||
|
*
|
||||||
|
* \param s First character pointer of string.
|
||||||
|
*
|
||||||
|
* \return 0
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
lcd_puts(const char* s)
|
||||||
|
{
|
||||||
|
strcpy((char*)lcd_text, s);
|
||||||
|
lcd_text_wr_ptr = strlen(s);
|
||||||
|
lcd_text_rd_ptr = 0;
|
||||||
|
|
||||||
|
lcd_text_put((char*)&lcd_text[lcd_text_rd_ptr], 1);
|
||||||
|
|
||||||
|
lcd_scroll_enable = (lcd_text_wr_ptr > 7) ? true : false;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will put a string of characters of a certain length out to the LCD.
|
||||||
|
*
|
||||||
|
* \param length Length of string to print.
|
||||||
|
* \param s First character pointer of string.
|
||||||
|
*
|
||||||
|
* \return 0
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
lcd_puta(size_t length, const uint8_t *s)
|
||||||
|
{
|
||||||
|
memcpy((void*)lcd_text, (void const*)s, length);
|
||||||
|
lcd_text_wr_ptr = length;
|
||||||
|
lcd_text_rd_ptr = 0;
|
||||||
|
|
||||||
|
lcd_text_put((char*)&lcd_text[lcd_text_rd_ptr], 1);
|
||||||
|
|
||||||
|
lcd_scroll_enable = (lcd_text_wr_ptr > 7) ? true : false;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will put a string out to the LCD from Flash.
|
||||||
|
*
|
||||||
|
* \param s First character pointer of the string located in Flash
|
||||||
|
*
|
||||||
|
* \return 0
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
lcd_puts_P(const char *s)
|
||||||
|
{
|
||||||
|
strcpy_P((char*)lcd_text, s);
|
||||||
|
lcd_text_wr_ptr = strlen_P(s);
|
||||||
|
lcd_text_rd_ptr = 0;
|
||||||
|
|
||||||
|
lcd_text_put((char*)&lcd_text[lcd_text_rd_ptr], 1);
|
||||||
|
|
||||||
|
lcd_scroll_enable = (lcd_text_wr_ptr > 7) ? true : false;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will put a single character out to the LCD.
|
||||||
|
*
|
||||||
|
* \param c Character to display on LCD.
|
||||||
|
*
|
||||||
|
* \return 0
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
lcd_putchar(unsigned char c)
|
||||||
|
{
|
||||||
|
lcd_text[lcd_text_wr_ptr++] = c;
|
||||||
|
lcd_text[lcd_text_wr_ptr] = 0;
|
||||||
|
|
||||||
|
lcd_text_put((char*)&lcd_text[lcd_text_rd_ptr], 1);
|
||||||
|
|
||||||
|
lcd_scroll_enable = (lcd_text_wr_ptr > 7) ? true : false;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will enable any of the symbols on the Raven LCD.
|
||||||
|
*
|
||||||
|
* \param symbol Specific symbol to enable on the LCD.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
lcd_symbol_set(lcd_symbol_t symbol)
|
||||||
|
{
|
||||||
|
unsigned char mem_offset;
|
||||||
|
unsigned char bit_offset;
|
||||||
|
volatile unsigned char* lcd_data = (volatile unsigned char*)0xEC;
|
||||||
|
|
||||||
|
/* Symbol format = bbbnnnnn where b is bit and n is offset */
|
||||||
|
bit_offset = (symbol >> 5);
|
||||||
|
mem_offset = (symbol & 0x1F);
|
||||||
|
if ( mem_offset >= 20 ){
|
||||||
|
return; /* Data out of range of the LCD registers */
|
||||||
|
}
|
||||||
|
lcd_data = lcd_data + mem_offset; /* Point to the relevant LCDDR */
|
||||||
|
|
||||||
|
*lcd_data = *lcd_data | ( 1 << bit_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will clear any symbol on the Raven LCD.
|
||||||
|
*
|
||||||
|
* \param symbol Specific symbol to clear from the LCD.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
lcd_symbol_clr(lcd_symbol_t symbol)
|
||||||
|
{
|
||||||
|
unsigned char offset;
|
||||||
|
unsigned char setbit;
|
||||||
|
volatile unsigned char* lcd_data = (volatile unsigned char*)0xEC;
|
||||||
|
|
||||||
|
/* symbol format = bbbnnnnn where b is bit and n is offset */
|
||||||
|
setbit = (symbol >> 5);
|
||||||
|
offset = (symbol & 0x1F);
|
||||||
|
if ( offset >= 20 ){
|
||||||
|
return; /* data out of range of the LCD registers */
|
||||||
|
}
|
||||||
|
|
||||||
|
lcd_data = lcd_data + offset; /* Point to the relevant LCDDR */
|
||||||
|
|
||||||
|
*lcd_data = *lcd_data & ~( 1 << setbit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will enable a group of symbols from the lcd_symbol_chart.
|
||||||
|
*
|
||||||
|
* \param start Position of table to start from.
|
||||||
|
* \param count Number of symbols to enable from start position.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
lcd_symbol_set_group(int start, int count)
|
||||||
|
{
|
||||||
|
count = (start + count)>LCD_SYMBOL_COUNT ?
|
||||||
|
LCD_SYMBOL_COUNT - start :
|
||||||
|
count;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=start; i<start+count; ++i){
|
||||||
|
lcd_symbol_set(pgm_read_byte(&lcd_symbol_chart[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will disable a group of symbols from the lcd_symbol_chart.
|
||||||
|
*
|
||||||
|
* \param start Position of table to start from.
|
||||||
|
* \param count Number of symbols to disable from start position.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
lcd_symbol_clr_group(int start, int count)
|
||||||
|
{
|
||||||
|
count = (start + count)>LCD_SYMBOL_COUNT ?
|
||||||
|
LCD_SYMBOL_COUNT - start :
|
||||||
|
count;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=start; i<count; ++i){
|
||||||
|
lcd_symbol_clr(pgm_read_byte(&lcd_symbol_chart[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will print a number to the LCD with the following parameters.
|
||||||
|
*
|
||||||
|
* \param numb Number to display on LCD.
|
||||||
|
* \param negative Display negative sign in the next digit field.
|
||||||
|
* \param padding This pads the location to place the value on the LCD.
|
||||||
|
*
|
||||||
|
* \return 0
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
lcd_num_print(uint16_t numb, bool negative, lcd_padding_t padding)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i=0;i<4;/**/) {
|
||||||
|
/* Get segments for this digit and print it */
|
||||||
|
lcd_nmb_print_dig(pgm_read_byte(&seg_map[(numb&(0xF<<4*i))>>4*i]), i);
|
||||||
|
|
||||||
|
/* If rest of number is zero */
|
||||||
|
if (++i<4) {
|
||||||
|
if (numb >> 4*i == 0) {
|
||||||
|
if (negative == true) { /* print a 'minus' in the next digit field */
|
||||||
|
lcd_nmb_print_dig(pgm_read_byte(&seg_map[(padding == LCD_NUM_PADDING_ZERO) ? LCD_SEV_SEG_INDEX_0 : LCD_SEV_SEG_INDEX_MINUS]), i++);
|
||||||
|
if (padding == LCD_NUM_PADDING_ZERO) {
|
||||||
|
lcd_symbol_set(LCD_SYMBOL_MINUS);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lcd_symbol_clr(LCD_SYMBOL_MINUS);
|
||||||
|
}
|
||||||
|
while (i<4){
|
||||||
|
lcd_nmb_print_dig(pgm_read_byte(&seg_map[(padding == LCD_NUM_PADDING_ZERO) ? LCD_SEV_SEG_INDEX_0 : LCD_SEV_SEG_INDEX_SPACE]), i++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (negative == true) {
|
||||||
|
lcd_symbol_set(LCD_SYMBOL_MINUS);
|
||||||
|
} else {
|
||||||
|
lcd_symbol_clr(LCD_SYMBOL_MINUS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will print a number according to the segment map of the LCD.
|
||||||
|
*
|
||||||
|
* \param val Number that is to be matched to appropriate segments.
|
||||||
|
* \param dig Segment to enable
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
lcd_nmb_print_dig(uint8_t val, int dig)
|
||||||
|
{
|
||||||
|
volatile unsigned char* lcd_data = (volatile unsigned char*)0xEC;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for (j=0;j<7;++j){
|
||||||
|
if (val & (1<<j)) {
|
||||||
|
lcd_data[pgm_read_byte(&seg_inf[j])&0x1F] |= (pgm_read_byte(&seg_inf[j])>>5)<<(dig*2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lcd_data[pgm_read_byte(&seg_inf[j])&0x1F] &= ~((pgm_read_byte(&seg_inf[j])>>5)<<(dig*2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will scroll the test on the LCD.
|
||||||
|
*
|
||||||
|
* \return 0
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
lcd_text_sl(void)
|
||||||
|
{
|
||||||
|
static int pos = 1;
|
||||||
|
if (lcd_text[lcd_text_rd_ptr] == 0) {
|
||||||
|
lcd_text_rd_ptr = 0;
|
||||||
|
pos = 7;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (pos){
|
||||||
|
pos--;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lcd_text_rd_ptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lcd_text_put((char*)&lcd_text[lcd_text_rd_ptr], pos);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will put test out to the LCD at a certain location padded with
|
||||||
|
* spaces.
|
||||||
|
*
|
||||||
|
* \param s First character pointer to the string of test to print.
|
||||||
|
* \param pos Count of spaces entered before printing the text.
|
||||||
|
*
|
||||||
|
* \return 0
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
lcd_text_put(const char* s, int pos)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Pad with spaces in front if offset > 0 */
|
||||||
|
for (i=1; i<pos; i++) {
|
||||||
|
lcd_char_put(' ', i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print characters, overwrite with spaces at end if necessary */
|
||||||
|
for ( i=pos; i<=7; ++i) {
|
||||||
|
if (*s == 0) {
|
||||||
|
lcd_char_put(' ', i);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lcd_char_put( (unsigned char)*s++, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will put a single char out to the LCD by looking up the
|
||||||
|
* proper segments.
|
||||||
|
*
|
||||||
|
* \param c Character to display on the LCD.
|
||||||
|
* \param pos This will add spaces for positioning the text on the LCD.
|
||||||
|
*
|
||||||
|
* \return 0
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
lcd_char_put(unsigned char c, int pos)
|
||||||
|
{
|
||||||
|
unsigned int seg, segMask;
|
||||||
|
unsigned char i;
|
||||||
|
unsigned char mask, nibble, nibbleMask;
|
||||||
|
|
||||||
|
volatile unsigned char* lcd_data = (volatile unsigned char*)0xEC;
|
||||||
|
unsigned char lcd_reg;
|
||||||
|
|
||||||
|
if (pos > 7){
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Lookup character table for segmet data */
|
||||||
|
if (((c >= '*') && (c <= 'z')) || (c == ' ')){
|
||||||
|
if (c >= 'a' ){
|
||||||
|
c &= ~0x20; /* c is in character_table. Convert to upper if necessarry. */
|
||||||
|
}
|
||||||
|
if (c == ' ') {
|
||||||
|
c = 0x00;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
c -= '*';
|
||||||
|
}
|
||||||
|
if ( c > 0x35 ){
|
||||||
|
return EOF; /* c points outside array */
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
seg = pgm_read_dword(&LCD_character_table[c]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return EOF; /* ASCII code out of range */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Adjust mask according to digit */
|
||||||
|
segMask = 0x4008; /* masking out two bits */
|
||||||
|
|
||||||
|
i = pos-1; /*i used as pointer offset */
|
||||||
|
i >>= 1;
|
||||||
|
lcd_data += i; /* Point to the first relevant LCDDR; i = {0,0,1,1,2,2} */
|
||||||
|
|
||||||
|
i = 4; /*i used as loop counter */
|
||||||
|
do{
|
||||||
|
nibble = seg & 0x000F;
|
||||||
|
nibbleMask = segMask & 0x000F;
|
||||||
|
|
||||||
|
seg >>= 4;
|
||||||
|
segMask >>= 4;
|
||||||
|
|
||||||
|
if (pos & 0x01) {
|
||||||
|
mask = 0xF0 | nibbleMask;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nibble <<= 4;
|
||||||
|
mask = 0x0F | ( nibbleMask <<4 );
|
||||||
|
}
|
||||||
|
lcd_reg = *lcd_data;
|
||||||
|
*lcd_data |= (lcd_reg & mask) | nibble; /* Write new bit values */
|
||||||
|
|
||||||
|
lcd_reg = *lcd_data;
|
||||||
|
*lcd_data &= (lcd_reg & mask) | nibble;
|
||||||
|
|
||||||
|
lcd_data += 5;
|
||||||
|
} while ( --i );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This is the LCD Start of Frame Interrupt Subroutine.
|
||||||
|
*
|
||||||
|
* This interrupt fires at the beginning of a new frame.
|
||||||
|
*/
|
||||||
|
ISR
|
||||||
|
(LCD_vect)
|
||||||
|
{
|
||||||
|
if (lcd_scroll_enable) {
|
||||||
|
if (--lcd_scroll_prescale == 0) {
|
||||||
|
lcd_text_sl();
|
||||||
|
lcd_scroll_prescale = lcd_scroll_prescale_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Turns the Raven nose LED on.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
led_on(void)
|
||||||
|
{
|
||||||
|
DDRB |= 0x80;
|
||||||
|
PORTB &= ~0x80;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Turns the Raven nose LED off.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
led_off(void)
|
||||||
|
{
|
||||||
|
DDRB &= ~0x80;
|
||||||
|
PORTB |= 0x80;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will add the passed in number to any of the four locations of
|
||||||
|
* the four digit segment display on the LCD.
|
||||||
|
*
|
||||||
|
* \param numb Number to display.
|
||||||
|
* \param pos Position to display number.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
lcd_single_print_dig(uint8_t numb, uint8_t pos)
|
||||||
|
{
|
||||||
|
lcd_nmb_print_dig(pgm_read_byte(&seg_map[numb]), pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \} */
|
351
platform/avr-ravenlcd/lcd.h
Normal file
351
platform/avr-ravenlcd/lcd.h
Normal file
|
@ -0,0 +1,351 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file provides Raven LCD support.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LCD_H__
|
||||||
|
#define __LCD_H__
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define LCD_SYMBOL_FISRT 0
|
||||||
|
#define LCD_SYMBOL_COUNT 34
|
||||||
|
|
||||||
|
/* Duplicate usage of segments */
|
||||||
|
#define LCD_SYMBOL_ARR_UP LCD_SYMBOL_ENV_OP
|
||||||
|
#define LCD_SYMBOL_ARR_DN LCD_SYMBOL_ENV_CL
|
||||||
|
|
||||||
|
#define LCD_CLCK_FRQ 32768
|
||||||
|
|
||||||
|
/** @name Constant defines for making seg_map[] table */
|
||||||
|
/** @{ */
|
||||||
|
/*
|
||||||
|
- a -
|
||||||
|
f b
|
||||||
|
|-g-|
|
||||||
|
e c
|
||||||
|
- d -
|
||||||
|
*/
|
||||||
|
#define NUM_LCD_SYMBOL_A 0x01
|
||||||
|
#define NUM_LCD_SYMBOL_B 0x02
|
||||||
|
#define NUM_LCD_SYMBOL_C 0x04
|
||||||
|
#define NUM_LCD_SYMBOL_D 0x08
|
||||||
|
#define NUM_LCD_SYMBOL_E 0x10
|
||||||
|
#define NUM_LCD_SYMBOL_F 0x20
|
||||||
|
#define NUM_LCD_SYMBOL_G 0x40
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
/** @name Constant defines for indexing seg_map[] table */
|
||||||
|
/** @{ */
|
||||||
|
#define LCD_SEV_SEG_INDEX_0 (0)
|
||||||
|
#define LCD_SEV_SEG_INDEX_1 (1)
|
||||||
|
#define LCD_SEV_SEG_INDEX_2 (2)
|
||||||
|
#define LCD_SEV_SEG_INDEX_3 (3)
|
||||||
|
#define LCD_SEV_SEG_INDEX_4 (4)
|
||||||
|
#define LCD_SEV_SEG_INDEX_5 (5)
|
||||||
|
#define LCD_SEV_SEG_INDEX_6 (6)
|
||||||
|
#define LCD_SEV_SEG_INDEX_7 (7)
|
||||||
|
#define LCD_SEV_SEG_INDEX_8 (8)
|
||||||
|
#define LCD_SEV_SEG_INDEX_9 (9)
|
||||||
|
#define LCD_SEV_SEG_INDEX_A (10)
|
||||||
|
#define LCD_SEV_SEG_INDEX_B (11)
|
||||||
|
#define LCD_SEV_SEG_INDEX_C (12)
|
||||||
|
#define LCD_SEV_SEG_INDEX_D (13)
|
||||||
|
#define LCD_SEV_SEG_INDEX_E (14)
|
||||||
|
#define LCD_SEV_SEG_INDEX_F (15)
|
||||||
|
#define LCD_SEV_SEG_INDEX_SPACE (16)
|
||||||
|
#define LCD_SEV_SEG_INDEX_MINUS (17)
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#define lcd_symbol_set_all() lcd_symbol_set_group(0, sizeof(lcd_symbol_chart))
|
||||||
|
#define lcd_symbol_clr_all() lcd_symbol_clr_group(0, sizeof(lcd_symbol_chart))
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LCD_NUM_PADDING_ZERO,
|
||||||
|
LCD_NUM_PADDING_SPACE
|
||||||
|
} lcd_padding_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
/* name = (bit_number << bit_number_offset) | mem_offset*/
|
||||||
|
/* Raven */
|
||||||
|
LCD_SYMBOL_RAVEN = (7<<5) | 3,
|
||||||
|
|
||||||
|
/* Audio */
|
||||||
|
LCD_SYMBOL_BELL = (2<<5) | 17,
|
||||||
|
LCD_SYMBOL_TONE = (6<<5) | 17,
|
||||||
|
LCD_SYMBOL_MIC = (3<<5) | 3,
|
||||||
|
LCD_SYMBOL_SPEAKER = (2<<5) | 18,
|
||||||
|
|
||||||
|
/* Status */
|
||||||
|
LCD_SYMBOL_KEY = (3<<5) | 2,
|
||||||
|
LCD_SYMBOL_ATT = (7<<5) | 2,
|
||||||
|
|
||||||
|
/* Time */
|
||||||
|
LCD_SYMBOL_SUN = (6<<5) | 13,
|
||||||
|
LCD_SYMBOL_MOON = (6<<5) | 3,
|
||||||
|
LCD_SYMBOL_AM = (2<<5) | 15,
|
||||||
|
LCD_SYMBOL_PM = (6<<5) | 15,
|
||||||
|
|
||||||
|
/* Radio commuication status */
|
||||||
|
LCD_SYMBOL_RX = (6<<5) | 18,
|
||||||
|
LCD_SYMBOL_TX = (5<<5) | 13,
|
||||||
|
LCD_SYMBOL_IP = (7<<5) | 13,
|
||||||
|
LCD_SYMBOL_PAN = (7<<5) | 18,
|
||||||
|
LCD_SYMBOL_ZLINK = (5<<5) | 8,
|
||||||
|
LCD_SYMBOL_ZIGBEE = (5<<5) | 3,
|
||||||
|
|
||||||
|
/* Antenna status */
|
||||||
|
LCD_SYMBOL_ANT_FOOT= (5<<5) | 18,
|
||||||
|
LCD_SYMBOL_ANT_SIG1= (3<<5) | 0,
|
||||||
|
LCD_SYMBOL_ANT_SIG2= (7<<5) | 0,
|
||||||
|
LCD_SYMBOL_ANT_SIG3= (3<<5) | 1,
|
||||||
|
LCD_SYMBOL_ANT_DIS = (7<<5) | 1,
|
||||||
|
|
||||||
|
/* Battery status */
|
||||||
|
LCD_SYMBOL_BAT_CONT= (4<<5) | 18,
|
||||||
|
LCD_SYMBOL_BAT_CAP1= (4<<5) | 3,
|
||||||
|
LCD_SYMBOL_BAT_CAP2= (4<<5) | 8,
|
||||||
|
LCD_SYMBOL_BAT_CAP3= (4<<5) | 13,
|
||||||
|
|
||||||
|
/* Envelope status */
|
||||||
|
LCD_SYMBOL_ENV_OP = (6<<5) | 8,
|
||||||
|
LCD_SYMBOL_ENV_CL = (0<<5) | 4,
|
||||||
|
LCD_SYMBOL_ENV_MAIN= (2<<5) | 4,
|
||||||
|
|
||||||
|
/* Temperature */
|
||||||
|
LCD_SYMBOL_C = (6<<5) | 16,
|
||||||
|
LCD_SYMBOL_F = (2<<5) | 16,
|
||||||
|
|
||||||
|
/* Numeric */
|
||||||
|
LCD_SYMBOL_MINUS = (7<<5) | 8,
|
||||||
|
LCD_SYMBOL_DOT = (4<<5) | 4,
|
||||||
|
LCD_SYMBOL_COL = (6<<5) | 4,
|
||||||
|
} lcd_symbol_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LCD_WAVE_DEFAULT = 0,
|
||||||
|
LCD_WAVE_LOW_POWER = 1
|
||||||
|
} lcd_wave_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LCD_BUFFER_ON = 0,
|
||||||
|
LCD_BUFFER_OFF = 1
|
||||||
|
} lcd_buffer_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LCD_BLANKING_OFF = 0,
|
||||||
|
LCD_BLANKING_ON = 1
|
||||||
|
} lcd_blanking_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LCD_CLOCK_SYSTEM = 0,
|
||||||
|
LCD_CLOCK_EXTERN = 1
|
||||||
|
} lcd_clock_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LCD_BIAS_THIRD = 0,
|
||||||
|
LCD_BIAS_HALF = 1
|
||||||
|
} lcd_bias_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LCD_PRESCL_16 = 0x0,
|
||||||
|
LCD_PRESCL_64 = 0x1,
|
||||||
|
LCD_PRESCL_128 = 0x2,
|
||||||
|
LCD_PRESCL_256 = 0x3,
|
||||||
|
LCD_PRESCL_512 = 0x4,
|
||||||
|
LCD_PRESCL_1024 = 0x5,
|
||||||
|
LCD_PRESCL_2048 = 0x6,
|
||||||
|
LCD_PRESCL_4096 = 0x7,
|
||||||
|
} lcd_prescl_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LCD_DIV_1 = 0,
|
||||||
|
LCD_DIV_2 = 1,
|
||||||
|
LCD_DIV_3 = 2,
|
||||||
|
LCD_DIV_4 = 3,
|
||||||
|
LCD_DIV_5 = 4,
|
||||||
|
LCD_DIV_6 = 5,
|
||||||
|
LCD_DIV_7 = 6,
|
||||||
|
LCD_DIV_8 = 7
|
||||||
|
} lcd_div_t;
|
||||||
|
|
||||||
|
/** Bit LCDDC2:0 and LCMDT */
|
||||||
|
typedef enum {
|
||||||
|
LCD_DRIVE_300 = 0x0,
|
||||||
|
LCD_DRIVE_70 = 0x2,
|
||||||
|
LCD_DRIVE_150 = 0x4,
|
||||||
|
LCD_DRIVE_450 = 0x6,
|
||||||
|
LCD_DRIVE_575 = 0x8,
|
||||||
|
LCD_DRIVE_850 = 0xA,
|
||||||
|
LCD_DRIVE_1150 = 0xC,
|
||||||
|
LCD_DRIVE_HALF = 0xE,
|
||||||
|
LCD_DRIVE_FULL = 0xF
|
||||||
|
} lcd_drive_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LCD_CONTRAST_2_60 = 0x0,
|
||||||
|
LCD_CONTRAST_2_65 = 0x1,
|
||||||
|
LCD_CONTRAST_2_70 = 0x2,
|
||||||
|
LCD_CONTRAST_2_75 = 0x3,
|
||||||
|
LCD_CONTRAST_2_80 = 0x4,
|
||||||
|
LCD_CONTRAST_2_85 = 0x5,
|
||||||
|
LCD_CONTRAST_2_90 = 0x6,
|
||||||
|
LCD_CONTRAST_2_95 = 0x7,
|
||||||
|
LCD_CONTRAST_3_00 = 0x8,
|
||||||
|
LCD_CONTRAST_3_05 = 0x9,
|
||||||
|
LCD_CONTRAST_3_10 = 0xA,
|
||||||
|
LCD_CONTRAST_3_15 = 0xB,
|
||||||
|
LCD_CONTRAST_3_20 = 0xC,
|
||||||
|
LCD_CONTRAST_3_25 = 0xD,
|
||||||
|
LCD_CONTRAST_3_30 = 0xE,
|
||||||
|
LCD_CONTRAST_3_35 = 0xF
|
||||||
|
} lcd_contrast_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
unsigned int blanking: 1;
|
||||||
|
unsigned int : 1;
|
||||||
|
unsigned int buffer : 1;
|
||||||
|
unsigned int : 3;
|
||||||
|
unsigned int wave : 1;
|
||||||
|
unsigned int : 1;
|
||||||
|
};
|
||||||
|
uint8_t lcdcra;
|
||||||
|
};
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
unsigned int : 6;
|
||||||
|
unsigned int bias : 1;
|
||||||
|
unsigned int clock : 1;
|
||||||
|
};
|
||||||
|
uint8_t lcdcrb;
|
||||||
|
};
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
unsigned int div : 3;
|
||||||
|
unsigned int : 1;
|
||||||
|
unsigned int prescl : 3;
|
||||||
|
unsigned int : 1;
|
||||||
|
};
|
||||||
|
uint8_t lcdfrr;
|
||||||
|
};
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
unsigned int contrast: 4;
|
||||||
|
unsigned int drive : 4;
|
||||||
|
};
|
||||||
|
uint8_t lcdccr;
|
||||||
|
};
|
||||||
|
} lcd_config_t;
|
||||||
|
|
||||||
|
/*========================= PUBLIC VARIABLES =========================*/
|
||||||
|
|
||||||
|
|
||||||
|
/*========================= PUBLIC FUNCTIONS =========================*/
|
||||||
|
|
||||||
|
/** Initialization and configuration of the LCD controller
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* \code
|
||||||
|
*
|
||||||
|
* Configuring LCD with Extern clock (TOSC, 32.768kHz)
|
||||||
|
* 32786 Hz 32786 Hz
|
||||||
|
* frame_rate = ------------------ = ------------- = 32 Hz
|
||||||
|
* 8 * .prescl * .div 8 * 16 * 8
|
||||||
|
*
|
||||||
|
* lcd_config_t lcd_config = {
|
||||||
|
* .wave = LCD_WAVE_LOW_POWER,
|
||||||
|
* .buffer = LCD_BUFFER_ON,
|
||||||
|
* .blanking = LCD_BLANKING_OFF,
|
||||||
|
* .clock = LCD_CLOCK_EXTERN,
|
||||||
|
* .bias = LCD_BIAS_HALF,
|
||||||
|
* .prescl = LCD_PRESCL_16,
|
||||||
|
* .div = LCD_DIV_8,
|
||||||
|
* .drive = LCD_DRIVE_450,
|
||||||
|
* .contrast = LCD_CONTRAST_3_30
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* lcd_init(lcd_config);
|
||||||
|
* \endcode
|
||||||
|
*/
|
||||||
|
int lcd_init(void);
|
||||||
|
void lcd_deinit(void);
|
||||||
|
uint8_t itobcd(uint8_t inNumber);
|
||||||
|
|
||||||
|
/** @name Numeric functions */
|
||||||
|
/** @{ */
|
||||||
|
int lcd_num_puthex(uint16_t numb, lcd_padding_t padding);
|
||||||
|
int lcd_num_putdec(int numb, lcd_padding_t padding);
|
||||||
|
int lcd_num_clr(void);
|
||||||
|
void lcd_single_print_dig(uint8_t numb, uint8_t pos);
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
/** @name Text functions */
|
||||||
|
/** @{ */
|
||||||
|
int lcd_puts(const char* s);
|
||||||
|
int lcd_puts_P(const char *s);
|
||||||
|
int lcd_puta(size_t length, const uint8_t *s);
|
||||||
|
int lcd_putchar(unsigned char c);
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
/** @name Symbol functions */
|
||||||
|
/** @{ */
|
||||||
|
void lcd_symbol_set(lcd_symbol_t symbol);
|
||||||
|
void lcd_symbol_set_group(int start, int count);
|
||||||
|
void lcd_symbol_clr(lcd_symbol_t symbol);
|
||||||
|
void lcd_symbol_clr_group(int start, int count);
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
/** @name LED Functions */
|
||||||
|
/** @{ */
|
||||||
|
void led_on(void);
|
||||||
|
void led_off(void);
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* __LCD_H__ */
|
||||||
|
|
69
platform/avr-ravenlcd/main.h
Normal file
69
platform/avr-ravenlcd/main.h
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This is the main file for the Raven LCD application. Contains binary
|
||||||
|
* command definitions.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __MAIN_H__
|
||||||
|
#define __MAIN_H__
|
||||||
|
|
||||||
|
/** \name Logical defines */
|
||||||
|
/** \{ */
|
||||||
|
#define BOOL char
|
||||||
|
#define FALSE 0
|
||||||
|
#define TRUE (!false)
|
||||||
|
|
||||||
|
#define PING_ATTEMPTS (4)
|
||||||
|
/** \} */
|
||||||
|
|
||||||
|
/** \name These are GUI to Radio Binary commands. */
|
||||||
|
/** \{ */
|
||||||
|
#define NULL_CMD (0)
|
||||||
|
#define SEND_TEMP (0x80)
|
||||||
|
#define SEND_PING (0x81)
|
||||||
|
/** \} */
|
||||||
|
|
||||||
|
/** \name These are the Radio to GUI binary commands. */
|
||||||
|
/** \{ */
|
||||||
|
#define REPORT_PING (0xC0)
|
||||||
|
#define REPORT_PING_BEEP (0xC1)
|
||||||
|
#define REPORT_TEXT_MSG (0xC2)
|
||||||
|
/** \} */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __MAIN_H__ */
|
399
platform/avr-ravenlcd/menu.c
Normal file
399
platform/avr-ravenlcd/menu.c
Normal file
|
@ -0,0 +1,399 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file operates the menu flow chart described in the readme
|
||||||
|
* notes. This will create the proper commands needed to control the 1284p.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "menu.h"
|
||||||
|
#include "main.h"
|
||||||
|
#include "lcd.h"
|
||||||
|
#include "key.h"
|
||||||
|
#include "uart.h"
|
||||||
|
#include "sleep.h"
|
||||||
|
#include "temp.h"
|
||||||
|
|
||||||
|
uint8_t ping_count;
|
||||||
|
uint8_t ping_response;
|
||||||
|
bool ping_mode;
|
||||||
|
bool timeout_flag;
|
||||||
|
bool temp_flag;
|
||||||
|
bool temp_mode;
|
||||||
|
bool auto_temp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup lcd
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This function will convert decimal to ascii.
|
||||||
|
*
|
||||||
|
* \param val Decimal value to convert.
|
||||||
|
* \param str Address location to store converted value.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
dectoascii(uint8_t val, char *str)
|
||||||
|
{
|
||||||
|
*(str+1) = (val % 10) + '0';
|
||||||
|
*str = (val / 10) + '0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will convert a signed decimal number to ASCII.
|
||||||
|
*
|
||||||
|
* \param n Signed number
|
||||||
|
* \param str Pointer to store converted value.
|
||||||
|
*
|
||||||
|
* \return *p Address of stored conversion.
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
*signed_dectoascii(int16_t n, uint8_t *str)
|
||||||
|
{
|
||||||
|
uint8_t * p = str;
|
||||||
|
uint8_t neg = 0;
|
||||||
|
|
||||||
|
if(n < 0){
|
||||||
|
neg = 1;
|
||||||
|
n = -n;
|
||||||
|
}
|
||||||
|
|
||||||
|
*p-- = 0x00;
|
||||||
|
|
||||||
|
/* Determine the unit of conversion. */
|
||||||
|
if(temp_mode == TEMP_UNIT_CELCIUS){
|
||||||
|
/* Add ASCII C to string. */
|
||||||
|
*p-- = 'C';
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
/* Add ASCII F to string. */
|
||||||
|
*p-- = 'F';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add a space before unit symbol. */
|
||||||
|
*p-- = ' ';
|
||||||
|
|
||||||
|
/* For zero, just print zero. */
|
||||||
|
if (!n){
|
||||||
|
*p = '0';
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (n){
|
||||||
|
*p-- = (n%10) + '0';
|
||||||
|
n/= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (neg){
|
||||||
|
*p-- = '-';
|
||||||
|
}
|
||||||
|
|
||||||
|
return ++p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will start a sleep operation.
|
||||||
|
*
|
||||||
|
* \param val Used for rembering the new menu to display after a wakeup.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
menu_run_sleep(uint8_t *val)
|
||||||
|
{
|
||||||
|
/* Turn off LED */
|
||||||
|
led_off();
|
||||||
|
|
||||||
|
/* Turn off Timer 1, SPI, uart */
|
||||||
|
PRR |= (1 << PRTIM1) | (1 << PRSPI);
|
||||||
|
|
||||||
|
/* Turn off the LCD display for sleeping */
|
||||||
|
lcd_deinit();
|
||||||
|
|
||||||
|
/* Turn off A/D converter */
|
||||||
|
key_deinit();
|
||||||
|
|
||||||
|
/* Go to sleep now */
|
||||||
|
sleep_now();
|
||||||
|
|
||||||
|
/* Wake up LCD Display */
|
||||||
|
lcd_init();
|
||||||
|
|
||||||
|
/* Tell user we're waking up */
|
||||||
|
lcd_puts_P(PSTR("WAKE---"));
|
||||||
|
|
||||||
|
/* Turn on Raven logo */
|
||||||
|
lcd_symbol_set(LCD_SYMBOL_RAVEN);
|
||||||
|
|
||||||
|
/* Wake up ADC */
|
||||||
|
key_init();
|
||||||
|
|
||||||
|
/* Wake up radio */
|
||||||
|
sleep_wakeup();
|
||||||
|
|
||||||
|
/* Wait for buttons up */
|
||||||
|
while (key_state_get() != KEY_NO_KEY)
|
||||||
|
;
|
||||||
|
if (is_button()){
|
||||||
|
get_button();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print last menu tex */
|
||||||
|
lcd_puts_P((char *)&val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will setup a ping request command to the 1284p and reset the ping counter.
|
||||||
|
*
|
||||||
|
* \param val place holder
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
menu_ping_request(uint8_t * val)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
ping_mode = true;
|
||||||
|
ping_count = 0;
|
||||||
|
ping_response = 0;
|
||||||
|
|
||||||
|
/* Initialize the numerical display with dashes */
|
||||||
|
for(i=0; i<4; i++){
|
||||||
|
lcd_single_print_dig(LCD_SEV_SEG_INDEX_MINUS, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
menu_send_ping();
|
||||||
|
|
||||||
|
/* Reset the timer for 1 sec resolution between pings. */
|
||||||
|
TCNT1 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will send the ping request to the 1284p via the serial port.
|
||||||
|
*
|
||||||
|
* \return ping_count The number of ping attempts.
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
menu_send_ping(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Check for previous ping timeout. If menu_send_ping() was called before receiving
|
||||||
|
* a response, update the LCD.
|
||||||
|
*/
|
||||||
|
timeout_flag = true;
|
||||||
|
ping_count++;
|
||||||
|
/* Send the ping command with one byte payload of the current sequence number. */
|
||||||
|
uart_serial_send_frame(SEND_PING, 1, (uint8_t *)&ping_count);
|
||||||
|
return ping_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will stop the ping request.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
menu_stop_ping(void)
|
||||||
|
{
|
||||||
|
ping_mode = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will enable or disable the JTAG debug interface to allow for
|
||||||
|
* proper temperature sensor readings.
|
||||||
|
*
|
||||||
|
* \param val Flag to trigger the proper debug mode.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
menu_debug_mode(uint8_t *val)
|
||||||
|
{
|
||||||
|
uint8_t sreg = SREG;
|
||||||
|
cli();
|
||||||
|
if(*val){
|
||||||
|
/* Could use inline ASM to meet timing requirements. */
|
||||||
|
MCUCR |= (1 << JTD);
|
||||||
|
MCUCR |= (1 << JTD);
|
||||||
|
/* Needed for timing critical JTD disable. */
|
||||||
|
temp_init();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
/* Could use inline ASM to meet timing requirements. */
|
||||||
|
MCUCR &= ~(1 << JTD);
|
||||||
|
MCUCR &= ~(1 << JTD);
|
||||||
|
}
|
||||||
|
SREG = sreg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will display the temperature in degrees F or C.
|
||||||
|
*
|
||||||
|
* \param val Flag to trigger F or C temperature conversion.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
menu_read_temp(uint8_t *val)
|
||||||
|
{
|
||||||
|
if(*val){
|
||||||
|
temp_mode = TEMP_UNIT_CELCIUS;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
temp_mode = TEMP_UNIT_FAHRENHEIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp_flag = true;
|
||||||
|
|
||||||
|
menu_display_temp();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will display the temperature in degrees F or C.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
menu_display_temp(void)
|
||||||
|
{
|
||||||
|
int16_t result = temp_get(temp_mode);
|
||||||
|
|
||||||
|
/* Display the temp result on the lower 4 digit display with the proper symbol. */
|
||||||
|
if(temp_mode == TEMP_UNIT_CELCIUS){
|
||||||
|
lcd_symbol_clr(LCD_SYMBOL_F);
|
||||||
|
lcd_symbol_set(LCD_SYMBOL_C);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
lcd_symbol_clr(LCD_SYMBOL_C);
|
||||||
|
lcd_symbol_set(LCD_SYMBOL_F);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for the DEBUG JTAG enable bit and display a CAUTION symbol to the user. */
|
||||||
|
/* CAUTION represents false value. */
|
||||||
|
if(MCUCR & 0x80){
|
||||||
|
lcd_symbol_clr(LCD_SYMBOL_ATT);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
lcd_symbol_set(LCD_SYMBOL_ATT);
|
||||||
|
}
|
||||||
|
|
||||||
|
lcd_num_putdec(result, LCD_NUM_PADDING_SPACE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will clear the temperature displayed in the 4 digit LCD segments.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
menu_clear_temp(void)
|
||||||
|
{
|
||||||
|
temp_flag = false;
|
||||||
|
lcd_symbol_clr(LCD_SYMBOL_F);
|
||||||
|
lcd_symbol_clr(LCD_SYMBOL_C);
|
||||||
|
lcd_symbol_clr(LCD_SYMBOL_ATT);
|
||||||
|
lcd_num_clr();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will setup the current temperature for transfer to the ATmega1284p via a binary
|
||||||
|
* command transfer.
|
||||||
|
*
|
||||||
|
* \param val This is used to determine sending once or auto based on the timer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
menu_prepare_temp(uint8_t *val)
|
||||||
|
{
|
||||||
|
if(*val){
|
||||||
|
/* Only send the temp value once. */
|
||||||
|
auto_temp = false;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
/* Auto send the temp value based on TIMER1 interval. */
|
||||||
|
auto_temp = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
menu_send_temp();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will stop the auto sending of temperature data.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
menu_stop_temp(void)
|
||||||
|
{
|
||||||
|
auto_temp = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will send the data via the serial port.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
menu_send_temp(void)
|
||||||
|
{
|
||||||
|
int16_t result;
|
||||||
|
uint8_t str[10];
|
||||||
|
uint8_t * p = 0;
|
||||||
|
|
||||||
|
/* Turn on nose LED for activity indicator */
|
||||||
|
led_on();
|
||||||
|
|
||||||
|
/* Get the latest temp value. */
|
||||||
|
result = temp_get(temp_mode);
|
||||||
|
|
||||||
|
/* Convert signed decimal number to ASCII. */
|
||||||
|
p = signed_dectoascii(result, (str + 10));
|
||||||
|
|
||||||
|
/* Send frame via serial port. */
|
||||||
|
uart_serial_send_frame(SEND_TEMP, strlen((char *)p), p);
|
||||||
|
|
||||||
|
led_off();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \} */
|
83
platform/avr-ravenlcd/menu.h
Normal file
83
platform/avr-ravenlcd/menu.h
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file operates the menu flow chart described in the readme
|
||||||
|
* notes. This will create the proper commands needed to control the 1284p.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MENU_H
|
||||||
|
#define MENU_H
|
||||||
|
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
/** \brief Pointer to function, used to dispatch a menu-driven function. See tmenu_item */
|
||||||
|
typedef void (*tmenufunc)(uint8_t *);
|
||||||
|
|
||||||
|
/** \brief This structure defines the joystick operation within the menu_items[]. */
|
||||||
|
typedef struct {
|
||||||
|
const char * PROGMEM text; /**< Menu text to display. */
|
||||||
|
uint8_t left; /**< Contains next menu position for left. */
|
||||||
|
uint8_t right; /**< Contains next menu position for right. */
|
||||||
|
uint8_t up; /**< Contains next menu position for up. */
|
||||||
|
uint8_t down; /**< Contains next menu position for down. */
|
||||||
|
uint8_t *state; /**< State variable used as argument for menu enter function. */
|
||||||
|
tmenufunc enter_func; /**< Pointer to function to call when enter button is pressed. */
|
||||||
|
} tmenu_item;
|
||||||
|
|
||||||
|
extern uint8_t ping_response;
|
||||||
|
extern bool ping_mode;
|
||||||
|
extern bool timeout_flag;
|
||||||
|
extern bool temp_flag;
|
||||||
|
extern bool auto_temp;
|
||||||
|
extern const PROGMEM tmenu_item menu_items[];
|
||||||
|
|
||||||
|
void menu_run_sleep(uint8_t *val);
|
||||||
|
void dectoascii(uint8_t val, char *str);
|
||||||
|
uint8_t *signed_dectoascii(int16_t n, uint8_t *str);
|
||||||
|
void menu_ping_request(uint8_t * val);
|
||||||
|
uint8_t menu_send_ping(void);
|
||||||
|
void menu_stop_ping(void);
|
||||||
|
void menu_debug_mode(uint8_t *val);
|
||||||
|
void menu_read_temp(uint8_t *val);
|
||||||
|
void menu_display_temp(void);
|
||||||
|
void menu_clear_temp(void);
|
||||||
|
void menu_prepare_temp(uint8_t *val);
|
||||||
|
void menu_stop_temp(void);
|
||||||
|
void menu_send_temp(void);
|
||||||
|
|
||||||
|
#endif /* MENU_H */
|
389
platform/avr-ravenlcd/raven3290.c
Normal file
389
platform/avr-ravenlcd/raven3290.c
Normal file
|
@ -0,0 +1,389 @@
|
||||||
|
/**
|
||||||
|
* \mainpage ATmega3290p LCD Driver Software for Raven
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* \section intro_lcd LCD Introduction
|
||||||
|
*
|
||||||
|
* This Raven LCD Driver application software was designed for a user interface
|
||||||
|
* to the Contiki 6LoWPAN collaboration on board the ATmega3290p. The
|
||||||
|
* LCD functionality uses the binary command set described in the release notes.
|
||||||
|
* These binary commands can also be found in a list of main.h.
|
||||||
|
*
|
||||||
|
* \section compile_lcd Compiling Raven LCD Driver
|
||||||
|
*
|
||||||
|
* Raven LCD Driver can be compiled on the following platforms:
|
||||||
|
*
|
||||||
|
* -# <b>WinAvr + AVR Studio (AVR-GCC).</b> The @b ravenlcd_3290.aps file is used by AVR
|
||||||
|
* Studio. If you have WinAVR and AVR Studio installed, ravenlcd can be
|
||||||
|
* compiled and developed using free tools. The Makefile.avr-ravenlcd is not
|
||||||
|
* used with AVR Studio.
|
||||||
|
* -# <b>AVR-GCC on Linux.</b> The <b>Makefile.avr-ravenlcd</b> file is to be used for Linux.
|
||||||
|
* Be sure you have a recent toolchain installed, including patches
|
||||||
|
* required for GCC/avr-libc to recognize new devices. The avr-libc
|
||||||
|
* webpage includes a concise guide on how to patch and build the AVR
|
||||||
|
* toolchain.
|
||||||
|
* -# <b>IAR EWB-AVR.</b> is currently not supported.
|
||||||
|
*
|
||||||
|
* \section fuses Board fuse settings
|
||||||
|
*
|
||||||
|
* The Raven LCD (3290p device) requires the proper fuse settings to function
|
||||||
|
* properly. These settings have been summarized below:
|
||||||
|
* -# Raven LCD (3290p device)
|
||||||
|
* -# Extended: <b>0xFF</b> (No Brown Out)
|
||||||
|
* -# High: <b>0x99</b> (JTAG and ISP enabled, No OCDEN or EEPROM saving required)
|
||||||
|
* -# Low: <b>0xE2</b> (Use Int RC OSC - Start-up Time:6CK + 65ms)
|
||||||
|
*
|
||||||
|
* \section notes Operation Release Notes
|
||||||
|
*
|
||||||
|
* After programming the Raven LCD 3290p with the proper image, you will be introduced to
|
||||||
|
* the menu in the picture below:
|
||||||
|
*
|
||||||
|
* \image html contiki_menu_3290.jpg
|
||||||
|
*
|
||||||
|
* Operating the menu requires that the matching command set has been programmed into
|
||||||
|
* the ATmega1284 application. This will allow the menu to communicate properly and control the
|
||||||
|
* Contiki 6LoWPAN applcation.
|
||||||
|
*
|
||||||
|
* During normal operation, you will need to make note of these <b>IMPORTANT</b> operating instructions:
|
||||||
|
* -# <b>Temp Sensor</b> - The temperature sensor shares the same GPIO as the JTAG interface for the 3290p.
|
||||||
|
* This requires the JTAG feature to be <b>disabled</b> in order to have proper temperature readings.
|
||||||
|
* -# <b>Debug Menu</b> - The DEBUG menu setting is used to configure this JTAG feature.
|
||||||
|
* -# If the JTAG feature is enabled during a temperature reading attempt,
|
||||||
|
* the menu will signal a <b>caution</b> symbol to the user letting them know the JTAG
|
||||||
|
* feature needs to be disabled.
|
||||||
|
* \image html caution.gif
|
||||||
|
* -# <b>Temp Data</b> - Once the temperature reading is proper, the user can send this reading
|
||||||
|
* to the webserver for Sensor Reading Data (<b>Once</b> or <b>Auto</b>). The webserver will
|
||||||
|
* only update the html data when <b>refreshed</b>.
|
||||||
|
*
|
||||||
|
* \section binary Binary Command Description
|
||||||
|
*
|
||||||
|
* Using the binary commmand list described in main.h, the 3290p will contruct a binary
|
||||||
|
* command serial frame to control the 1284p. An example command frame is contructed below:
|
||||||
|
* -# <b>0x01,0x01,0x81,0x01,0x04</b> - Send Ping Request number 1 to 1284p
|
||||||
|
* -# <b>0x01</b> - Start of binary command frame
|
||||||
|
* -# <b>0x01</b> - Length of binary command payload
|
||||||
|
* -# <b>0x81</b> - Binary command SEND_PING
|
||||||
|
* -# <b>0x01</b> - Payload value (eg. ping Request number 1)
|
||||||
|
* -# <b>0x04</b> - End of binary command frame
|
||||||
|
*
|
||||||
|
* The following commands are used to control the 1284p.
|
||||||
|
* -# <b>SEND_TEMP - (0x80)</b>
|
||||||
|
* -# <b>SEND_PING - (0x81)</b>
|
||||||
|
*
|
||||||
|
* The following commands are used to update the 3290p.
|
||||||
|
* -# <b>REPORT_PING - (0xC0)</b>
|
||||||
|
* -# <b>REPORT_PING_BEEP - (0xC1)</b>
|
||||||
|
* -# <b>REPORT_TEXT_MSG - (0xC2)</b>
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This is the main file for the Raven LCD application.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lcd.h"
|
||||||
|
#include "key.h"
|
||||||
|
#include "main.h"
|
||||||
|
#include "uart.h"
|
||||||
|
#include "timer.h"
|
||||||
|
#include "menu.h"
|
||||||
|
#include "temp.h"
|
||||||
|
|
||||||
|
/** \defgroup lcd LCD Functions and data
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined( DOXYGEN )
|
||||||
|
const char menu_text0[];
|
||||||
|
const char menu_text1[];
|
||||||
|
const char menu_text2[];
|
||||||
|
const char menu_text3[];
|
||||||
|
const char menu_text4[];
|
||||||
|
const char menu_text5[];
|
||||||
|
const char menu_text6[];
|
||||||
|
const char menu_text7[];
|
||||||
|
const char menu_text8[];
|
||||||
|
const char menu_text9[];
|
||||||
|
const char menu_text10[];
|
||||||
|
const char menu_text11[];
|
||||||
|
const char menu_text12[];
|
||||||
|
const char menu_text13[];
|
||||||
|
const char menu_text14[];
|
||||||
|
const char menu_text15[];
|
||||||
|
const tmenu_item menu_items[16];
|
||||||
|
#else /* !DOXYGEN */
|
||||||
|
/** \brief This is the menu text in Flash. See menu_items[] for menu operation. */
|
||||||
|
const char menu_text0[] PROGMEM = "CONTIKI";
|
||||||
|
const char menu_text1[] PROGMEM = "6LOWPAN";
|
||||||
|
const char menu_text2[] PROGMEM = "PING";
|
||||||
|
const char menu_text3[] PROGMEM = "PINGING";
|
||||||
|
const char menu_text4[] PROGMEM = "TEMP";
|
||||||
|
const char menu_text5[] PROGMEM = "MODE ";
|
||||||
|
const char menu_text6[] PROGMEM = "DEG F";
|
||||||
|
const char menu_text7[] PROGMEM = "DEG C";
|
||||||
|
const char menu_text8[] PROGMEM = "SEND";
|
||||||
|
const char menu_text9[] PROGMEM = "ONCE";
|
||||||
|
const char menu_text10[] PROGMEM = "AUTO";
|
||||||
|
const char menu_text11[] PROGMEM = "DEBUG";
|
||||||
|
const char menu_text12[] PROGMEM = "DBG ON";
|
||||||
|
const char menu_text13[] PROGMEM = "DBG OFF";
|
||||||
|
const char menu_text14[] PROGMEM = "SENT";
|
||||||
|
const char menu_text15[] PROGMEM = "SENDING";
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Menus for user interface
|
||||||
|
*
|
||||||
|
* This constructs the Raven 3290p menu for the Contiki and 6lowpan collaboration. This
|
||||||
|
* follows the struct description of tmenu_item.
|
||||||
|
*
|
||||||
|
* { text, left, right, up, down, *state, tmenufunc enter_func}
|
||||||
|
*/
|
||||||
|
const PROGMEM tmenu_item menu_items[16] = {
|
||||||
|
{menu_text0, 0, 2, 0, 0, 0, 0 },
|
||||||
|
{menu_text1, 0, 2, 0, 0, 0, 0 },
|
||||||
|
{menu_text2, 0, 3, 11, 4, 0, menu_ping_request },
|
||||||
|
{menu_text3, 2, 2, 2, 2, 0, 0 },
|
||||||
|
{menu_text4, 0, 5, 2, 11, 0, 0 },
|
||||||
|
{menu_text5, 4, 6, 8, 8, 0, 0 },
|
||||||
|
{menu_text6, 5, 5, 7, 7, (uint8_t*)1, menu_read_temp },
|
||||||
|
{menu_text7, 5, 5, 6, 6, (uint8_t*)0, menu_read_temp },
|
||||||
|
{menu_text8, 4, 9, 5, 5, 0, 0 },
|
||||||
|
{menu_text9, 8, 14, 10, 10, (uint8_t*)0, menu_prepare_temp },
|
||||||
|
{menu_text10, 8, 15, 9, 9, (uint8_t*)1, menu_prepare_temp },
|
||||||
|
{menu_text11, 0, 12, 4, 2, 0, 0 },
|
||||||
|
{menu_text12, 11, 11, 13, 13, (uint8_t*)1, menu_debug_mode },
|
||||||
|
{menu_text13, 11, 11, 12, 12, (uint8_t*)0, menu_debug_mode },
|
||||||
|
{menu_text14, 9, 14, 14, 14, 0, 0 },
|
||||||
|
{menu_text15, 10, 15, 15, 15, 0, 0 },
|
||||||
|
};
|
||||||
|
#endif /* !DOXYGEN */
|
||||||
|
|
||||||
|
key_state_t button=KEY_STATE_NO_KEY;
|
||||||
|
tmenu_item menu;
|
||||||
|
uint8_t count;
|
||||||
|
uint8_t timeout_count;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will read the menu_items[] from the index requested.
|
||||||
|
*
|
||||||
|
* \param ndx Position index of menu_items[] lookup.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
read_menu(uint8_t ndx)
|
||||||
|
{
|
||||||
|
/* Reads menu structure from Flash area */
|
||||||
|
uint8_t i;
|
||||||
|
uint8_t *src = (uint8_t*)&menu_items[ndx];
|
||||||
|
uint8_t *dest = (uint8_t*)&menu;
|
||||||
|
|
||||||
|
for (i=0;i<sizeof(tmenu_item);i++){
|
||||||
|
*dest++ = pgm_read_byte(src+i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will toggle the CONTIKI and 6LOWPAN LCD menus only in the main
|
||||||
|
* menu position.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
check_main_menu(void)
|
||||||
|
{
|
||||||
|
if(menu.text == menu_text0){
|
||||||
|
read_menu(1);
|
||||||
|
lcd_puts_P(menu.text);
|
||||||
|
}
|
||||||
|
else if(menu.text == menu_text1){
|
||||||
|
read_menu(0);
|
||||||
|
lcd_puts_P(menu.text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will check for the temp menu screen to determine if we need to
|
||||||
|
* clear the 4 digit LCD segments or stop an auto temp send. Also check for
|
||||||
|
* stopping a ping request.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
check_menu(void)
|
||||||
|
{
|
||||||
|
if(menu.text == menu_text4){
|
||||||
|
menu_clear_temp();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(menu.text == menu_text10){
|
||||||
|
menu_stop_temp();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(menu.text == menu_text2){
|
||||||
|
menu_stop_ping();
|
||||||
|
lcd_num_clr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This is main...
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
lcd_init();
|
||||||
|
|
||||||
|
key_init();
|
||||||
|
|
||||||
|
uart_init();
|
||||||
|
|
||||||
|
temp_init();
|
||||||
|
|
||||||
|
timer_init();
|
||||||
|
|
||||||
|
sei();
|
||||||
|
|
||||||
|
lcd_symbol_set(LCD_SYMBOL_RAVEN);
|
||||||
|
lcd_symbol_set(LCD_SYMBOL_IP);
|
||||||
|
|
||||||
|
/* Start with main menu */
|
||||||
|
read_menu(0);
|
||||||
|
/* and draw it */
|
||||||
|
lcd_puts_P(menu.text);
|
||||||
|
|
||||||
|
timer_start();
|
||||||
|
|
||||||
|
for (;;){
|
||||||
|
/* Make sure interrupts are always on */
|
||||||
|
sei();
|
||||||
|
|
||||||
|
/* The one second timer has fired. */
|
||||||
|
if(timer_flag){
|
||||||
|
timer_flag = false;
|
||||||
|
/* Check if main menu needs toggled. */
|
||||||
|
check_main_menu();
|
||||||
|
/* Update LCD with temp data. */
|
||||||
|
if(temp_flag){
|
||||||
|
menu_display_temp();
|
||||||
|
}
|
||||||
|
/* Auto send temp data to 1284p. */
|
||||||
|
if(auto_temp){
|
||||||
|
menu_send_temp();
|
||||||
|
}
|
||||||
|
/* If ping mode, send 4 ping requests and then stop. */
|
||||||
|
if(ping_mode){
|
||||||
|
if((PING_ATTEMPTS == count) && !timeout_flag){
|
||||||
|
count = 0;
|
||||||
|
timeout_count = 0;
|
||||||
|
menu_stop_ping();
|
||||||
|
}
|
||||||
|
else if(timeout_flag){
|
||||||
|
timeout_flag = false;
|
||||||
|
timeout_count++;
|
||||||
|
/* Display timeout message if all PING_ATTEMPTS were not successful. */
|
||||||
|
if(PING_ATTEMPTS == timeout_count){
|
||||||
|
lcd_puts_P(PSTR("PINGS FAILED"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
count = menu_send_ping();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for button press and deal with it */
|
||||||
|
if (is_button()){
|
||||||
|
/* Dispatch the button pressed */
|
||||||
|
switch (get_button()){
|
||||||
|
case KEY_UP:
|
||||||
|
read_menu(menu.up);
|
||||||
|
lcd_puts_P(menu.text);
|
||||||
|
break;
|
||||||
|
case KEY_DOWN:
|
||||||
|
read_menu(menu.down);
|
||||||
|
lcd_puts_P(menu.text);
|
||||||
|
break;
|
||||||
|
case KEY_LEFT:
|
||||||
|
read_menu(menu.left);
|
||||||
|
lcd_puts_P(menu.text);
|
||||||
|
break;
|
||||||
|
case KEY_RIGHT:
|
||||||
|
/*
|
||||||
|
* Check to see if we should show another menu or
|
||||||
|
* run a function
|
||||||
|
*/
|
||||||
|
if (!menu.enter_func){
|
||||||
|
/* Just another menu to display */
|
||||||
|
read_menu(menu.right);
|
||||||
|
lcd_puts_P(menu.text);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Drop through here */
|
||||||
|
case KEY_ENTER:
|
||||||
|
/* Call the menu function on right or enter buttons */
|
||||||
|
if (menu.enter_func){
|
||||||
|
menu.enter_func(menu.state);
|
||||||
|
if (menu.state){
|
||||||
|
/*
|
||||||
|
* We just called a selection menu (not a test),
|
||||||
|
* so re-display the text for this menu level
|
||||||
|
*/
|
||||||
|
lcd_puts_P(menu.text);
|
||||||
|
}
|
||||||
|
/* After enter key, check the right button menu and display. */
|
||||||
|
read_menu(menu.right);
|
||||||
|
lcd_puts_P(menu.text);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* After button press, check for menus... */
|
||||||
|
check_menu();
|
||||||
|
}
|
||||||
|
/* Process any progress frames */
|
||||||
|
uart_serial_rcv_frame(false);
|
||||||
|
} /* end for(). */
|
||||||
|
} /* end main(). */
|
||||||
|
|
||||||
|
/** \} */
|
1
platform/avr-ravenlcd/ravenlcd_3290.aps
Normal file
1
platform/avr-ravenlcd/ravenlcd_3290.aps
Normal file
File diff suppressed because one or more lines are too long
120
platform/avr-ravenlcd/sleep.c
Normal file
120
platform/avr-ravenlcd/sleep.c
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This controls the sleep operation for the LCD.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/sleep.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "sleep.h"
|
||||||
|
#include "uart.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup lcd
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Prepares for and executes sleep. This function sets up the
|
||||||
|
* processor to enter sleep mode, and to wake up when the joystick
|
||||||
|
* button (PE2/PCINT2) is pressed.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
sleep_now(void)
|
||||||
|
{
|
||||||
|
/* Disable watchdog */
|
||||||
|
wdt_disable();
|
||||||
|
|
||||||
|
/* Setup sleep mode */
|
||||||
|
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
||||||
|
|
||||||
|
/* Enable wakeup interrupt */
|
||||||
|
EIMSK |= (1 << PCIE0);
|
||||||
|
/* Enable PCINT2 as interrupt */
|
||||||
|
PCMSK0 |= (1 << PCINT2);
|
||||||
|
|
||||||
|
/* Go to sleep now */
|
||||||
|
sleep_mode();
|
||||||
|
|
||||||
|
/* Disable the interrupt for the enter button */
|
||||||
|
EIMSK &= ~(1 << PCIE0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will send a single character forever to the ATmega1284p to cause a wakeup.
|
||||||
|
*
|
||||||
|
* The 1284p polls the USART for new data during each sleep cycle. Upon receiving a
|
||||||
|
* character from the user LCD, it will wake up and send an acknowledgement frame.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
sleep_wakeup(void)
|
||||||
|
{
|
||||||
|
/* First, clear the input buffer and get any chars waiting */
|
||||||
|
while(rx_char_ready()){
|
||||||
|
uart_get_char_rx();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Flood 1284p with serial chars until it responds. */
|
||||||
|
for(;;){
|
||||||
|
uart_send_byte('x');
|
||||||
|
if (rx_char_ready())
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Get a frame back */
|
||||||
|
uart_serial_rcv_frame(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This is the wake up button interrupt. When this interrupt fires,
|
||||||
|
* nothing is done. The program will simply continue from the end of the sleep
|
||||||
|
* command.
|
||||||
|
*/
|
||||||
|
ISR
|
||||||
|
(PCINT0_vect)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \} */
|
48
platform/avr-ravenlcd/sleep.h
Normal file
48
platform/avr-ravenlcd/sleep.h
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This controls the sleep operation for the LCD.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SLEEP_H__
|
||||||
|
#define __SLEEP_H__
|
||||||
|
|
||||||
|
/* Prototypes */
|
||||||
|
void sleep_now(void);
|
||||||
|
void sleep_wakeup(void);
|
||||||
|
|
||||||
|
#endif /* __SLEEP_H__ */
|
222
platform/avr-ravenlcd/temp.c
Normal file
222
platform/avr-ravenlcd/temp.c
Normal file
|
@ -0,0 +1,222 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* Driver for the on board temperature sensor.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "key.h"
|
||||||
|
#include "temp.h"
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup lcd
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Type used together with find_temp() to find temperature */
|
||||||
|
typedef enum {
|
||||||
|
TEMP_ZERO_OFFSET_CELCIUS = -15,
|
||||||
|
TEMP_ZERO_OFFSET_FAHRENHEIT = 0
|
||||||
|
} temp_zero_offset_t;
|
||||||
|
|
||||||
|
#if defined( DOXYGEN )
|
||||||
|
static uint16_t temp_table_celcius[];
|
||||||
|
static uint16_t temp_table_fahrenheit[];
|
||||||
|
#else /* !DOXYGEN */
|
||||||
|
/** Celcius temperatures (ADC-value) from -15 to 60 degrees */
|
||||||
|
static uint16_t temp_table_celcius[] PROGMEM = {
|
||||||
|
923,917,911,904,898,891,883,876,868,860,851,843,834,825,815,
|
||||||
|
806,796,786,775,765,754,743,732,720,709,697,685,673,661,649,
|
||||||
|
636,624,611,599,586,574,562,549,537,524,512,500,488,476,464,
|
||||||
|
452,440,429,418,406,396,385,374,364,354,344,334,324,315,306,
|
||||||
|
297,288,279,271,263,255,247,240,233,225,219,212,205,199,193,
|
||||||
|
187,
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Fahrenheit temperatures (ADC-value) from 0 to 140 degrees */
|
||||||
|
static uint16_t temp_table_fahrenheit[] PROGMEM = {
|
||||||
|
938, 935, 932, 929, 926, 923, 920, 916, 913, 909, 906, 902, 898,
|
||||||
|
894, 891, 887, 882, 878, 874, 870, 865, 861, 856, 851, 847, 842,
|
||||||
|
837, 832, 827, 822, 816, 811, 806, 800, 795, 789, 783, 778, 772,
|
||||||
|
766, 760, 754, 748, 742, 735, 729, 723, 716, 710, 703, 697, 690,
|
||||||
|
684, 677, 670, 663, 657, 650, 643, 636, 629, 622, 616, 609, 602,
|
||||||
|
595, 588, 581, 574, 567, 560, 553, 546, 539, 533, 526, 519, 512,
|
||||||
|
505, 498, 492, 485, 478, 472, 465, 459, 452, 446, 439, 433, 426,
|
||||||
|
420, 414, 408, 402, 396, 390, 384, 378, 372, 366, 360, 355, 349,
|
||||||
|
344, 338, 333, 327, 322, 317, 312, 307, 302, 297, 292, 287, 282,
|
||||||
|
277, 273, 268, 264, 259, 255, 251, 246, 242, 238, 234, 230, 226,
|
||||||
|
222, 219, 215, 211, 207, 204, 200, 197, 194, 190, 187,
|
||||||
|
};
|
||||||
|
#endif /* !DOXYGEN */
|
||||||
|
|
||||||
|
/** Flag indicating initialized or not */
|
||||||
|
bool temp_initialized = false;
|
||||||
|
|
||||||
|
/** \brief Find array index corresponding to input ADC value
|
||||||
|
*
|
||||||
|
* Returned array index is actual temperature + zero offset. To
|
||||||
|
* get actual temperature, the zero offset (\ref temp_zero_offset_t)
|
||||||
|
* has to be subtracted.
|
||||||
|
*
|
||||||
|
* \param[in] value Value to seracah for in table
|
||||||
|
* \param[in] array Pointer to array in which to look for ADC value
|
||||||
|
* \param[in] count Size of array
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* \return EOF on error
|
||||||
|
*/
|
||||||
|
static int find_temp(int16_t value, uint16_t* array, int count);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will initialize the digital IO and adc channel for temperture readings.
|
||||||
|
*
|
||||||
|
* \retval 0 Place holder for returning status.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
temp_init(void)
|
||||||
|
{
|
||||||
|
/* Disable the Digital IO for the analog readings. */
|
||||||
|
DIDR0 |= (1 << ADC4D);
|
||||||
|
|
||||||
|
/* Temp sens power pin as output */
|
||||||
|
TEMP_DDR |= (1 << TEMP_BIT_PWR);
|
||||||
|
|
||||||
|
/* Power off temp sensor */
|
||||||
|
TEMP_PORT &= ~(1 << TEMP_BIT_PWR);
|
||||||
|
|
||||||
|
/* Temp sens input, no pullup */
|
||||||
|
TEMP_DDR &= ~(1 << TEMP_BIT_IN);
|
||||||
|
TEMP_PORT &= ~(1 << TEMP_BIT_IN);
|
||||||
|
|
||||||
|
temp_initialized = true;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will disable temperature readings by reseting the initialed flag.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
temp_deinit(void)
|
||||||
|
{
|
||||||
|
temp_initialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will turn on the adc channel for reading the temp sensor.
|
||||||
|
*
|
||||||
|
* After the raw adc value is stored, it will be used to lookup a degree conversion
|
||||||
|
* based on the tables for F or C.
|
||||||
|
*
|
||||||
|
* \param unit Used to determine what unit needs to be appended with the value.
|
||||||
|
*
|
||||||
|
* \return EOF This is an uninitialized adc error.
|
||||||
|
* \retval temp The newly converted value in degrees F or C.
|
||||||
|
*/
|
||||||
|
int16_t
|
||||||
|
temp_get(temp_unit_t unit)
|
||||||
|
{
|
||||||
|
int16_t res;
|
||||||
|
int16_t temp;
|
||||||
|
|
||||||
|
/* Return if temp sensor driver not initialized */
|
||||||
|
if (temp_initialized == false) {
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Power up sensor */
|
||||||
|
TEMP_PORT |= (1 << TEMP_BIT_PWR);
|
||||||
|
|
||||||
|
/* Init ADC and measure */
|
||||||
|
adc_init(ADC_CHAN_ADC4, ADC_TRIG_FREE_RUN, ADC_REF_AVCC, ADC_PS_128);
|
||||||
|
adc_conversion_start();
|
||||||
|
while ((res = adc_result_get(ADC_ADJ_RIGHT)) == EOF ){
|
||||||
|
;
|
||||||
|
}
|
||||||
|
adc_deinit();
|
||||||
|
/* Re-init the adc for buttons. */
|
||||||
|
key_init();
|
||||||
|
|
||||||
|
/* Power down sensor */
|
||||||
|
TEMP_PORT &= ~(1 << TEMP_BIT_PWR);
|
||||||
|
|
||||||
|
/* Get corresponding temperature from table */
|
||||||
|
if (unit == TEMP_UNIT_CELCIUS) {
|
||||||
|
temp = find_temp(res, temp_table_celcius, sizeof(temp_table_celcius)/sizeof(int)) + TEMP_ZERO_OFFSET_CELCIUS;
|
||||||
|
} else /*unit == TEMP_UNIT_FAHRENHEIT*/{
|
||||||
|
temp = find_temp(res, temp_table_fahrenheit, sizeof(temp_table_fahrenheit)/sizeof(int)) + TEMP_ZERO_OFFSET_FAHRENHEIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Find array index corresponding to input ADC value
|
||||||
|
*
|
||||||
|
* Returned array index is actual temperature + zero offset. To
|
||||||
|
* get actual temperature, the zero offset (\ref temp_zero_offset_t)
|
||||||
|
* has to be subtracted.
|
||||||
|
*
|
||||||
|
* \param[in] value Value to search for in table
|
||||||
|
* \param[in] array Pointer to array in which to look for ADC value
|
||||||
|
* \param[in] count Size of array
|
||||||
|
*
|
||||||
|
* \return EOF on error
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
find_temp(int16_t value, uint16_t* array, int count)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
int table_val = 0;
|
||||||
|
do{
|
||||||
|
table_val = pgm_read_word(&array[i]);
|
||||||
|
if (table_val < value) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
} while(++i<count);
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \} */
|
90
platform/avr-ravenlcd/temp.h
Normal file
90
platform/avr-ravenlcd/temp.h
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* Interface for the onboard temperature sensor.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TEMP_H__
|
||||||
|
#define __TEMP_H__
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "adc.h"
|
||||||
|
|
||||||
|
#define PROGMEM_DECLARE(x) x __attribute__((__progmem__))
|
||||||
|
|
||||||
|
/** \addtogroup grNTC */
|
||||||
|
/** \{ */
|
||||||
|
/** Type used with \ref temp_get() to select temperature unit */
|
||||||
|
typedef enum {
|
||||||
|
TEMP_UNIT_CELCIUS,
|
||||||
|
TEMP_UNIT_FAHRENHEIT
|
||||||
|
} temp_unit_t;
|
||||||
|
|
||||||
|
/** \name Definition of Port Pin for temp sensor. */
|
||||||
|
/** \{ */
|
||||||
|
#define TEMP_PORT PORTF
|
||||||
|
#define TEMP_DDR DDRF
|
||||||
|
#define TEMP_PIN PINF
|
||||||
|
#define TEMP_BIT_IN 4
|
||||||
|
#define TEMP_BIT_PWR 6
|
||||||
|
/** \} */
|
||||||
|
|
||||||
|
/** \brief Initialize the temperature sensor
|
||||||
|
*
|
||||||
|
* \return EOF on error
|
||||||
|
*/
|
||||||
|
int temp_init(void);
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief De-initialize the temperature sensor
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void temp_deinit(void);
|
||||||
|
|
||||||
|
/** \brief Read current temperature
|
||||||
|
*
|
||||||
|
* \param[in] unit Selected temperature unit (\ref temp_unit_t)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* \return EOF on error
|
||||||
|
*/
|
||||||
|
int16_t temp_get(temp_unit_t unit);
|
||||||
|
/** \} */
|
||||||
|
#endif /* __TEMP_H__ */
|
113
platform/avr-ravenlcd/timer.c
Normal file
113
platform/avr-ravenlcd/timer.c
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file will configure the timer during LCD operation.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lcd.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup lcd
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool timer_flag;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief TIMER1 init for timer used by LCD.
|
||||||
|
*
|
||||||
|
* The FPU of 8MHz with a prescaler of 1024 equals 7812.5 timer ticks creating a
|
||||||
|
* resolution of 128us per tick.
|
||||||
|
*
|
||||||
|
* NOTE: The TIMER1 interrupt is not enabled in this routine
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
timer_init(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Set TIMER1 output compare mode to clear on compare match for OC1A. Also
|
||||||
|
* set the pre-scaler to 1024.
|
||||||
|
*/
|
||||||
|
TCCR1B = (1 << WGM12)|(1 << CS12)|(1 << CS10);
|
||||||
|
|
||||||
|
/* Set TIMER1 output compare register approx. 1 sec resolution. */
|
||||||
|
OCR1A = _1_SEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Start the timer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
timer_start(void)
|
||||||
|
{
|
||||||
|
/* Clear TIMER1 timer counter value. */
|
||||||
|
TCNT1 = 0;
|
||||||
|
|
||||||
|
/* Enable TIMER1 output compare interrupt. */
|
||||||
|
TIMSK1 = (1 << OCIE1A);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Stop the timer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
timer_stop(void)
|
||||||
|
{
|
||||||
|
/* Disable TIMER1 output compare interrupt. */
|
||||||
|
TIMSK1 &= ~(1 << OCIE1A);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This is the interrupt subroutine for the TIMER1 output match comparison.
|
||||||
|
*/
|
||||||
|
ISR
|
||||||
|
(TIMER1_COMPA_vect)
|
||||||
|
{
|
||||||
|
/* Set the irq flag. */
|
||||||
|
timer_flag = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \} */
|
52
platform/avr-ravenlcd/timer.h
Normal file
52
platform/avr-ravenlcd/timer.h
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file supports the timer functionality for the LCD.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TIMER_H
|
||||||
|
#define TIMER_H
|
||||||
|
|
||||||
|
extern bool timer_flag;
|
||||||
|
|
||||||
|
#define _1_SEC (0x1E84);
|
||||||
|
|
||||||
|
void timer_init(void);
|
||||||
|
void timer_start(void);
|
||||||
|
void timer_stop(void);
|
||||||
|
|
||||||
|
#endif /* TIMER_H */
|
450
platform/avr-ravenlcd/uart.c
Normal file
450
platform/avr-ravenlcd/uart.c
Normal file
|
@ -0,0 +1,450 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* Handles the control of the USART for communication with the ATmega1284p
|
||||||
|
* for sending commands.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "uart.h"
|
||||||
|
#include "lcd.h"
|
||||||
|
#include "main.h"
|
||||||
|
#include "menu.h"
|
||||||
|
#include "beep.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup lcd
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define TIMEOUT (0xff)
|
||||||
|
|
||||||
|
/** \brief The RX circular buffer, for storing characters from serial port. */
|
||||||
|
tcirc_buf rxbuf;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will intialize the circular buffer head and tail of tcirc_buf struct.
|
||||||
|
*
|
||||||
|
* \param cbuf Pointer to buffer to initialize.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uart_init_circ_buf(tcirc_buf *cbuf)
|
||||||
|
{
|
||||||
|
cbuf->head = cbuf->tail = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will add a new character to the circular buffer.
|
||||||
|
*
|
||||||
|
* \param cbuf Pointer to buffer where character will be stored.
|
||||||
|
* \param ch Character to store into buffer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uart_add_to_circ_buf(tcirc_buf *cbuf, uint8_t ch)
|
||||||
|
{
|
||||||
|
/* Add char to buffer */
|
||||||
|
uint8_t newhead = cbuf->head;
|
||||||
|
newhead++;
|
||||||
|
if (newhead >= BUFSIZE){
|
||||||
|
newhead = 0;
|
||||||
|
}
|
||||||
|
if (newhead == cbuf->tail){
|
||||||
|
/* Buffer full, quit it */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cbuf->buf[cbuf->head] = ch;
|
||||||
|
cbuf->head = newhead;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will get a character from the buffer requested.
|
||||||
|
*
|
||||||
|
* \param cbuf Pointer to buffer to get character from.
|
||||||
|
*
|
||||||
|
* \return retval Return character from buffer.
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
uart_get_from_circ_buf(tcirc_buf *cbuf)
|
||||||
|
{
|
||||||
|
/* Get char from buffer. */
|
||||||
|
/* Be sure to check first that there is a char in buffer. */
|
||||||
|
uint8_t newtail = cbuf->tail;
|
||||||
|
uint8_t retval = cbuf->buf[newtail];
|
||||||
|
|
||||||
|
newtail++;
|
||||||
|
if (newtail >= BUFSIZE){
|
||||||
|
/* Rollover */
|
||||||
|
newtail = 0;
|
||||||
|
}
|
||||||
|
cbuf->tail = newtail;
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will clear the RX buffer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uart_clear_rx_buf(void)
|
||||||
|
{
|
||||||
|
rxbuf.tail = rxbuf.head = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will check for a character in the requested buffer.
|
||||||
|
*
|
||||||
|
* \param cbuf Pointer to buffer to check for any characters.
|
||||||
|
*
|
||||||
|
* \return True if buffer empty.
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
uart_circ_buf_has_char(tcirc_buf *cbuf)
|
||||||
|
{
|
||||||
|
/* Return true if buffer empty */
|
||||||
|
return (cbuf->head != cbuf->tail);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will convert a nibble to a hex value.
|
||||||
|
*
|
||||||
|
* \param val Value to convert to hex.
|
||||||
|
*
|
||||||
|
* \return val Converted hex value
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
ntohex(uint8_t val)
|
||||||
|
{
|
||||||
|
/* Convert nibble to hex */
|
||||||
|
if (val > 9){
|
||||||
|
return val + 'A' - 10;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
return val + '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Convert integer to hex value.
|
||||||
|
*
|
||||||
|
* \param val Value to convert to hex.
|
||||||
|
* \param str Location to store converted value.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
itohex(uint8_t val,char *str)
|
||||||
|
{
|
||||||
|
*str++ = ntohex(val >> 8);
|
||||||
|
*str = ntohex(val & 0x0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will wait for a new character from the ATmega1284p and timeout
|
||||||
|
* if no new character is received.
|
||||||
|
*
|
||||||
|
* \retval TIMEOUT Returns if timeout has occured.
|
||||||
|
* \return retval Character returned upon seeing rx_char_ready()
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
uart_get_char_rx(void)
|
||||||
|
{
|
||||||
|
/* Gets a serial char, and waits for timeout */
|
||||||
|
uint32_t timex = 5000000;
|
||||||
|
uint8_t retval;
|
||||||
|
|
||||||
|
while (!rx_char_ready()){
|
||||||
|
if (!timex--){
|
||||||
|
/* Timeout, return timeout */
|
||||||
|
return TIMEOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = uart_get_from_circ_buf(&rxbuf);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize UART to 38400 Baud Rate and only
|
||||||
|
* enable UART for transmission.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uart_init(void)
|
||||||
|
{
|
||||||
|
/* For Mega3290P, enable the uart peripheral */
|
||||||
|
PRR &= ~(1 << PRUSART0);
|
||||||
|
|
||||||
|
uart_clear_rx_buf();
|
||||||
|
/* 38400 baud @ 8 MHz internal RC oscillator (error = 0.2%) */
|
||||||
|
UBRR0 = BAUD_RATE_38400;
|
||||||
|
|
||||||
|
/* 8 bit character size, 1 stop bit and no parity mode */
|
||||||
|
UCSR0C = ( 3 << UCSZ00);
|
||||||
|
|
||||||
|
/* Enable RX,TX and RX interrupt on USART */
|
||||||
|
UCSR0B = (1 << RXEN0)|(1 << TXEN0)|(1 << RXCIE0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Turn off UART for sleep mode.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uart_deinit(void)
|
||||||
|
{
|
||||||
|
/* Disable RX,TX and RX interrupt on USART */
|
||||||
|
UCSR0B = 0;
|
||||||
|
|
||||||
|
/* for Mega3290P, disable the uart peripheral */
|
||||||
|
PRR |= (1 << PRUSART0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Send one byte over the uart. This is called to send binary commands.
|
||||||
|
*
|
||||||
|
* \param byte The byte of data to send out the uart.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uart_send_byte(uint8_t byte)
|
||||||
|
{
|
||||||
|
/* Wait for last char to be gone... */
|
||||||
|
while(!(UCSR0A & (1 << UDRE0)))
|
||||||
|
;
|
||||||
|
UDR0 = byte;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This is the USART RX complete interrupt.
|
||||||
|
*/
|
||||||
|
ISR
|
||||||
|
(USART_RX_vect)
|
||||||
|
{
|
||||||
|
/* Get byte from serial port, put in Rx Buffer. */
|
||||||
|
uint8_t retval;
|
||||||
|
|
||||||
|
retval = UDR0;
|
||||||
|
uart_add_to_circ_buf(&rxbuf, retval);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This function builds and sends a binary command frame to the
|
||||||
|
* ATmega1284p.
|
||||||
|
*
|
||||||
|
* \param cmd Command to send.
|
||||||
|
* \param payload_length Length of data to be sent with command.
|
||||||
|
* \param payload Pointer to data to send.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uart_serial_send_frame(uint8_t cmd, uint8_t payload_length, uint8_t *payload)
|
||||||
|
{
|
||||||
|
/* Send a frame to 1284p */
|
||||||
|
int8_t i;
|
||||||
|
|
||||||
|
uart_send_byte(SOF_CHAR);
|
||||||
|
uart_send_byte(payload_length);
|
||||||
|
uart_send_byte(cmd);
|
||||||
|
for (i=0;i<=payload_length-1;i++){
|
||||||
|
uart_send_byte(payload[i]);
|
||||||
|
}
|
||||||
|
uart_send_byte(EOF_CHAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This displays a time out message to the user based on the parameter
|
||||||
|
* reason x.
|
||||||
|
*
|
||||||
|
* \param x Reason for USART time out.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uart_timeout_msg(uint8_t x)
|
||||||
|
{
|
||||||
|
char str[20] = "TO ";
|
||||||
|
|
||||||
|
dectoascii(x, str+3);
|
||||||
|
lcd_puts(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will receive a frame from the ATmega1284p and parse the incoming
|
||||||
|
* data.
|
||||||
|
*
|
||||||
|
* If the incoming data is a binary command acknowledgement, then this will not
|
||||||
|
* parse any data. If the incoming data is test reports, the menu will store the
|
||||||
|
* data for end of test metrics.
|
||||||
|
*
|
||||||
|
* \param wait_for_ack Flag used to wait for acknowledgement when receving a serial
|
||||||
|
* frame.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uart_serial_rcv_frame(uint8_t wait_for_ack)
|
||||||
|
{
|
||||||
|
/* Gets a serial frame, if any, and displays data appropriately */
|
||||||
|
/* If wait_for_ack is true, this funtion will wait for serial chars. */
|
||||||
|
volatile uint8_t ch;
|
||||||
|
volatile uint8_t length;
|
||||||
|
volatile uint8_t cmd;
|
||||||
|
volatile uint8_t payload[10];
|
||||||
|
uint16_t i;
|
||||||
|
|
||||||
|
if (!wait_for_ack && !rx_char_ready()){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for SOF */
|
||||||
|
ch = uart_get_char_rx();
|
||||||
|
if (ch != SOF_CHAR){
|
||||||
|
return uart_timeout_msg(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Turn on nose LED for activity indicator */
|
||||||
|
led_on();
|
||||||
|
|
||||||
|
/* Get length byte */
|
||||||
|
ch = uart_get_char_rx();
|
||||||
|
if (ch == TIMEOUT){
|
||||||
|
return uart_timeout_msg(2);
|
||||||
|
}
|
||||||
|
/* Check for ACK Frame */
|
||||||
|
if (ch >= 0x80){
|
||||||
|
/* This is an ack frame, just get it and go away. */
|
||||||
|
ch = uart_get_char_rx();
|
||||||
|
if (ch != EOF_CHAR){
|
||||||
|
uart_timeout_msg(3);
|
||||||
|
}
|
||||||
|
led_off();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
length = ch;
|
||||||
|
if (length > 10){
|
||||||
|
/* invalid length */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get cmd byte */
|
||||||
|
ch = uart_get_char_rx();
|
||||||
|
if (ch == TIMEOUT){
|
||||||
|
return uart_timeout_msg(5);
|
||||||
|
}
|
||||||
|
cmd = ch;
|
||||||
|
|
||||||
|
/* Get payload */
|
||||||
|
for (i=0;i<length;i++){
|
||||||
|
ch = uart_get_char_rx();
|
||||||
|
if (ch == TIMEOUT){
|
||||||
|
return uart_timeout_msg(i);
|
||||||
|
}
|
||||||
|
/* Save payload */
|
||||||
|
payload[i] = ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get EOF */
|
||||||
|
ch = uart_get_char_rx();
|
||||||
|
if (ch != EOF_CHAR){
|
||||||
|
return uart_timeout_msg(7);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now print something based on rx'd frame */
|
||||||
|
switch (cmd){
|
||||||
|
case REPORT_PING:
|
||||||
|
/*
|
||||||
|
* This will update the lcd with the current ping status.
|
||||||
|
* Store the sequence number away.
|
||||||
|
*/
|
||||||
|
ping_response = payload[0];
|
||||||
|
|
||||||
|
if(ping_response == 1){
|
||||||
|
lcd_single_print_dig(ping_response, 3);
|
||||||
|
}
|
||||||
|
else if(ping_response == 2){
|
||||||
|
lcd_single_print_dig(ping_response, 2);
|
||||||
|
}
|
||||||
|
else if(ping_response == 3){
|
||||||
|
lcd_single_print_dig(ping_response, 1);
|
||||||
|
}
|
||||||
|
else if(ping_response == 4){
|
||||||
|
lcd_single_print_dig(ping_response, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
timeout_flag = false;
|
||||||
|
|
||||||
|
/* Beep on successful ping response. */
|
||||||
|
lcd_symbol_set(LCD_SYMBOL_BELL);
|
||||||
|
beep();
|
||||||
|
lcd_symbol_clr(LCD_SYMBOL_BELL);
|
||||||
|
break;
|
||||||
|
case REPORT_PING_BEEP:
|
||||||
|
lcd_symbol_set(LCD_SYMBOL_BELL);
|
||||||
|
beep();
|
||||||
|
lcd_symbol_clr(LCD_SYMBOL_BELL);
|
||||||
|
break;
|
||||||
|
case REPORT_TEXT_MSG:
|
||||||
|
/* Get text message, print to lcd. */
|
||||||
|
lcd_puts((char *)payload);
|
||||||
|
beep();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
led_off();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \} */
|
95
platform/avr-ravenlcd/uart.h
Normal file
95
platform/avr-ravenlcd/uart.h
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 the copyright holders nor the names of
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* Handles the control of the USART for communication with the ATmega1284p
|
||||||
|
* for sending commands.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Mike Vidales mavida404@gmail.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __UART_H__
|
||||||
|
#define __UART_H__ 1
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
/** \name ASCII characters defined */
|
||||||
|
/** \{ */
|
||||||
|
#define SOF_CHAR (0x01) /**< Start-of-frame character. */
|
||||||
|
#define EOF_CHAR (0x04) /**< End-of-frame character. */
|
||||||
|
#define TERM_CHAR (0x14) /**< Control-T ASCII value for entering terminal mode. */
|
||||||
|
/** \} */
|
||||||
|
|
||||||
|
|
||||||
|
/** \name Define Lengths. */
|
||||||
|
/** \{ */
|
||||||
|
#define MAX_CMD_LENGTH (0x0A)
|
||||||
|
#define ACK_LENGTH (0x02)
|
||||||
|
/** \} */
|
||||||
|
|
||||||
|
/** \name Define IO result values. */
|
||||||
|
/** \{ */
|
||||||
|
#define IO_SUCCESS (0)
|
||||||
|
#define IO_FAIL (1)
|
||||||
|
/** \} */
|
||||||
|
|
||||||
|
#define LEN_BYTE (0)
|
||||||
|
#define CMD_BYTE (1)
|
||||||
|
#define BAUD_RATE_38400 (12)
|
||||||
|
|
||||||
|
/* Macros & Defines */
|
||||||
|
|
||||||
|
#define BUFSIZE 80
|
||||||
|
|
||||||
|
/** \brief Circular buffer structure */
|
||||||
|
typedef struct {
|
||||||
|
volatile uint8_t head; /**< Index to last available character in buffer. */
|
||||||
|
volatile uint8_t tail; /**< Index to first available character in buffer. */
|
||||||
|
uint8_t buf[BUFSIZE]; /**< The actual buffer used for storing characters. */
|
||||||
|
} tcirc_buf;
|
||||||
|
|
||||||
|
extern tcirc_buf rxbuf;
|
||||||
|
#define rx_char_ready() (rxbuf.head != rxbuf.tail)
|
||||||
|
|
||||||
|
/* Serial port functions */
|
||||||
|
void uart_init(void);
|
||||||
|
void uart_deinit(void);
|
||||||
|
uint8_t uart_circ_buf_has_char(tcirc_buf *cbuf);
|
||||||
|
void uart_clear_rx_buf(void);
|
||||||
|
uint8_t uart_get_char_rx(void);
|
||||||
|
void uart_send_byte(uint8_t byte);
|
||||||
|
void uart_serial_send_frame(uint8_t cmd, uint8_t payload_length, uint8_t *payload);
|
||||||
|
void uart_serial_rcv_frame(uint8_t wait_for_it);
|
||||||
|
|
||||||
|
#endif /* __UART_H__ */
|
61
platform/avr-ravenusb/Makefile.avr-ravenusb
Normal file
61
platform/avr-ravenusb/Makefile.avr-ravenusb
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
CONTIKI_TARGET_DIRS = . rf230 apps net loader
|
||||||
|
CONTIKI_CORE=contiki-raven-main
|
||||||
|
CONTIKI_TARGET_MAIN = ${CONTIKI_CORE}.o
|
||||||
|
|
||||||
|
#USB Ethernet Interface + USB Serial Port TX Only
|
||||||
|
USB = uart_usb_lib.c \
|
||||||
|
cdc_task.c \
|
||||||
|
rndis_task.c \
|
||||||
|
rndis.c \
|
||||||
|
usb_descriptors.c \
|
||||||
|
usb_drv.c \
|
||||||
|
usb_specific_request.c \
|
||||||
|
usb_standard_request.c \
|
||||||
|
usb_task.c \
|
||||||
|
scsi_decoder.c \
|
||||||
|
ctrl_access.c \
|
||||||
|
storage_task.c \
|
||||||
|
avr_flash.c
|
||||||
|
|
||||||
|
CONTIKI_TARGET_SOURCEFILES += slip.c cfs-eeprom.c eeprom.c random.c \
|
||||||
|
mmem.c contiki-raven-default-init-lowlevel.c \
|
||||||
|
contiki-raven-default-init-net.c contiki-raven-main.c \
|
||||||
|
sicslow_ethernet.c \
|
||||||
|
$(USB)
|
||||||
|
|
||||||
|
USB_INCLUDES = -I$(CONTIKI_CPU)/dev/usb
|
||||||
|
|
||||||
|
CONTIKIAVR=$(CONTIKI)/cpu/avr
|
||||||
|
CONTIKIBOARD=.
|
||||||
|
|
||||||
|
CONTIKI_PLAT_DEFS = -DF_CPU=8000000UL -DAVRGCC -DAUTO_CRC_PADDING=2
|
||||||
|
|
||||||
|
|
||||||
|
MCU=at90usb1287
|
||||||
|
AVRDUDE_PROGRAMMER=jtag2
|
||||||
|
|
||||||
|
# For usb devices, you may either use PORT=usb, or (e.g. if you have more than one
|
||||||
|
# programmer connected) you can use the following trick to find out the serial number:
|
||||||
|
#
|
||||||
|
# The example is for an JTAGICE mkII used to program an ATmega128:
|
||||||
|
# avrdude -v -P usb:xxxx -c jtag2 -p atmega128
|
||||||
|
AVRDUDE_PORT=usb:00B000000D79
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Additional avrdude options
|
||||||
|
# Verify off
|
||||||
|
AVRDUDE_OPTIONS=-V
|
||||||
|
|
||||||
|
|
||||||
|
include $(CONTIKIAVR)/Makefile.avr
|
||||||
|
|
||||||
|
# Source for AT86RF230
|
||||||
|
include $(CONTIKI)/cpu/avr/radio/rf230/Makefile.rf230
|
||||||
|
|
||||||
|
# Source for Atmel/Cisco 802.15.4'ish MAC
|
||||||
|
include $(CONTIKI)/cpu/avr/radio/mac/Makefile.mac
|
||||||
|
|
||||||
|
# Source for IEEE 802.15.4 manager interface
|
||||||
|
include $(CONTIKI)/cpu/avr/radio/ieee-manager/Makefile.ieee-manager
|
||||||
|
|
65
platform/avr-ravenusb/avr-ravenusb-eeprom.hex
Executable file
65
platform/avr-ravenusb/avr-ravenusb-eeprom.hex
Executable file
|
@ -0,0 +1,65 @@
|
||||||
|
:10000000000002AABBCCDDEEFFFFFFFFFFFFFFFFFA
|
||||||
|
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
|
||||||
|
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
|
||||||
|
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
|
||||||
|
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
|
||||||
|
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
|
||||||
|
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
|
||||||
|
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
|
||||||
|
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
|
||||||
|
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
|
||||||
|
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
|
||||||
|
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
|
||||||
|
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
|
||||||
|
:1000D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
|
||||||
|
:1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
|
||||||
|
:1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
|
||||||
|
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
|
||||||
|
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
|
||||||
|
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
|
||||||
|
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
|
||||||
|
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
|
||||||
|
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
|
||||||
|
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
|
||||||
|
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
|
||||||
|
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
|
||||||
|
:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
|
||||||
|
:1001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
|
||||||
|
:1001B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
|
||||||
|
:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
|
||||||
|
:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
|
||||||
|
:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
|
||||||
|
:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
|
||||||
|
:10020000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
|
||||||
|
:10021000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE
|
||||||
|
:10022000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE
|
||||||
|
:10023000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE
|
||||||
|
:10024000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE
|
||||||
|
:10025000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE
|
||||||
|
:10026000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E
|
||||||
|
:10027000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E
|
||||||
|
:10028000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E
|
||||||
|
:10029000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
|
||||||
|
:1002A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E
|
||||||
|
:1002B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E
|
||||||
|
:1002C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E
|
||||||
|
:1002D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
|
||||||
|
:1002E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E
|
||||||
|
:1002F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E
|
||||||
|
:10030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD
|
||||||
|
:10031000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED
|
||||||
|
:10032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD
|
||||||
|
:10033000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
|
||||||
|
:10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
|
||||||
|
:10035000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD
|
||||||
|
:10036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D
|
||||||
|
:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D
|
||||||
|
:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D
|
||||||
|
:10039000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D
|
||||||
|
:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
|
||||||
|
:1003B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
|
||||||
|
:1003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D
|
||||||
|
:1003D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D
|
||||||
|
:1003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D
|
||||||
|
:1003F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D
|
||||||
|
:00000001FF
|
127
platform/avr-ravenusb/contiki-conf.h
Normal file
127
platform/avr-ravenusb/contiki-conf.h
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006, Technical University of Munich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* @(#)$$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Configuration for sample STK 501 Contiki kernel
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Simon Barner <barner@in.tum.de
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CONTIKI_CONF_H__
|
||||||
|
#define __CONTIKI_CONF_H__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef int32_t s32_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MCU and clock rate
|
||||||
|
*/
|
||||||
|
#define MCU_MHZ 8
|
||||||
|
#define PLATFORM PLATFORM_AVR
|
||||||
|
#define RAVEN_REVISION RAVENUSB_C
|
||||||
|
|
||||||
|
/* Cock ticks per second */
|
||||||
|
#define CLOCK_CONF_SECOND 125
|
||||||
|
|
||||||
|
/* Maximum time interval (used for timers) */
|
||||||
|
#define INFINITE_TIME 0xffff
|
||||||
|
|
||||||
|
/* COM port to be used for SLIP connection */
|
||||||
|
#define SLIP_PORT RS232_PORT_0
|
||||||
|
|
||||||
|
/* Pre-allocated memory for loadable modules heap space (in bytes)*/
|
||||||
|
#define MMEM_CONF_SIZE 256
|
||||||
|
|
||||||
|
/* Use the following address for code received via the codeprop
|
||||||
|
* facility
|
||||||
|
*/
|
||||||
|
#define EEPROMFS_ADDR_CODEPROP 0x8000
|
||||||
|
|
||||||
|
#define CCIF
|
||||||
|
#define CLIF
|
||||||
|
|
||||||
|
#define RIMEADDR_CONF_SIZE 8
|
||||||
|
|
||||||
|
/* 0 for IPv6, or 1 for HC1, 2 for HC01 */
|
||||||
|
#define SICSLOWPAN_CONF_COMPRESSION_IPV6 0
|
||||||
|
#define SICSLOWPAN_CONF_COMPRESSION_HC1 1
|
||||||
|
#define SICSLOWPAN_CONF_COMPRESSION_HC01 2
|
||||||
|
|
||||||
|
#define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_CONF_COMPRESSION_HC01
|
||||||
|
#define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 2
|
||||||
|
#define SICSLOWPAN_CONF_FRAG 1
|
||||||
|
|
||||||
|
#define SICSLOWPAN_CONF_MAXAGE 5
|
||||||
|
|
||||||
|
#define UIP_CONF_LL_802154 1
|
||||||
|
#define UIP_CONF_LLH_LEN 14
|
||||||
|
|
||||||
|
#define UIP_CONF_MAX_CONNECTIONS 4
|
||||||
|
#define UIP_CONF_MAX_LISTENPORTS 4
|
||||||
|
|
||||||
|
#define UIP_CONF_IP_FORWARD 0
|
||||||
|
#define UIP_CONF_FWCACHE_SIZE 0
|
||||||
|
|
||||||
|
#define UIP_CONF_IPV6 1
|
||||||
|
#define UIP_CONF_IPV6_CHECKS 1
|
||||||
|
#define UIP_CONF_IPV6_QUEUE_PKT 0
|
||||||
|
#define UIP_CONF_IPV6_REASSEMBLY 0
|
||||||
|
#define UIP_CONF_NETIF_MAX_ADDRESSES 3
|
||||||
|
#define UIP_CONF_ND6_MAX_PREFIXES 3
|
||||||
|
#define UIP_CONF_ND6_MAX_NEIGHBORS 4
|
||||||
|
#define UIP_CONF_ND6_MAX_DEFROUTERS 2
|
||||||
|
|
||||||
|
#define UIP_CONF_UDP 1
|
||||||
|
#define UIP_CONF_UDP_CHECKSUMS 1
|
||||||
|
|
||||||
|
#define UIP_CONF_TCP 1
|
||||||
|
#define UIP_CONF_TCP_SPLIT 1
|
||||||
|
|
||||||
|
#define UIP_CONF_STATISTICS 1
|
||||||
|
|
||||||
|
typedef unsigned short clock_time_t;
|
||||||
|
typedef unsigned char u8_t;
|
||||||
|
typedef unsigned short u16_t;
|
||||||
|
typedef unsigned long u32_t;
|
||||||
|
typedef unsigned short uip_stats_t;
|
||||||
|
typedef unsigned long off_t;
|
||||||
|
|
||||||
|
void clock_delay(unsigned int us2);
|
||||||
|
void clock_wait(int ms10);
|
||||||
|
void clock_set_seconds(unsigned long s);
|
||||||
|
unsigned long clock_seconds(void);
|
||||||
|
|
||||||
|
#endif /* __CONTIKI_CONF_H__ */
|
105
platform/avr-ravenusb/contiki-raven-default-init-lowlevel.c
Normal file
105
platform/avr-ravenusb/contiki-raven-default-init-lowlevel.c
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006, Technical University of Munich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* Author: Simon Barner <barner@in.tum.de>
|
||||||
|
*
|
||||||
|
* @(#)$$
|
||||||
|
*/
|
||||||
|
#include "contiki-raven.h"
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "usb_drv.h"
|
||||||
|
#include "usb_descriptors.h"
|
||||||
|
#include "usb_specific_request.h"
|
||||||
|
#include <util/delay.h>
|
||||||
|
|
||||||
|
uint8_t checkForFinger(void);
|
||||||
|
|
||||||
|
void
|
||||||
|
init_lowlevel(void)
|
||||||
|
{
|
||||||
|
Leds_init();
|
||||||
|
Leds_off();
|
||||||
|
|
||||||
|
if (checkForFinger()) {
|
||||||
|
usb_mode = mass_storage;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t checkForFinger(void)
|
||||||
|
{
|
||||||
|
uint8_t tests;
|
||||||
|
uint8_t matches;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Three pads on RZUSBSTICK go: GND PD3 PD2
|
||||||
|
|
||||||
|
We pulse PD3, and check for that pattern on PD2.
|
||||||
|
|
||||||
|
A (moist) finger across those three pads should be enough
|
||||||
|
to bridge these
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Output
|
||||||
|
DDRD |= 1<<PD3;
|
||||||
|
|
||||||
|
//Input
|
||||||
|
DDRD &= ~(1<<PD2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
tests = 100;
|
||||||
|
matches = 0;
|
||||||
|
while(tests) {
|
||||||
|
|
||||||
|
//Set bit PD3 to value of LSB of 'tests'
|
||||||
|
PORTD = (PORTD & ~(1<<PD3)) | ( (tests & 0x01) << PD3);
|
||||||
|
|
||||||
|
//Allow changes to propogate
|
||||||
|
_delay_us(1);
|
||||||
|
|
||||||
|
//Check if PD2 matches what we set PD3 to
|
||||||
|
if ((PIND & (1<<PD2)) == ((tests & 0x01) << PD2)) {
|
||||||
|
matches++;
|
||||||
|
}
|
||||||
|
|
||||||
|
tests--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matches > 70) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
54
platform/avr-ravenusb/contiki-raven-default-init-net.c
Normal file
54
platform/avr-ravenusb/contiki-raven-default-init-net.c
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006, Technical University of Munich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* Author: Simon Barner <barner@in.tum.de>
|
||||||
|
*
|
||||||
|
* @(#)$$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "contiki-raven.h"
|
||||||
|
|
||||||
|
#include "mac.h"
|
||||||
|
#include "sicslowpan.h"
|
||||||
|
extern uint64_t rndis_ethernet_addr;
|
||||||
|
|
||||||
|
void
|
||||||
|
init_net(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Set the Ethernet address to the 15.4 MAC address low 5 bytes...*/
|
||||||
|
rndis_ethernet_addr = macLongAddr & 0x0000ffffffffffffUL;
|
||||||
|
/* Set as locally administed address */
|
||||||
|
rndis_ethernet_addr |= 0x020000000000UL;
|
||||||
|
|
||||||
|
ieee15_4ManagerAddress.set_long_addr(rndis_ethernet_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
112
platform/avr-ravenusb/contiki-raven-main.c
Normal file
112
platform/avr-ravenusb/contiki-raven-main.c
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006, Technical University of Munich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* @(#)$$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Sample Contiki kernel for STK 501 development board
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Simon Barner <barner@in.tum.de
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "lib/mmem.h"
|
||||||
|
#include "loader/symbols-def.h"
|
||||||
|
#include "loader/symtab.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "mac.h"
|
||||||
|
#include "sicslowmac.h"
|
||||||
|
#include "sicslowpan.h"
|
||||||
|
#include "ieee-15-4-manager.h"
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "contiki-net.h"
|
||||||
|
#include "contiki-lib.h"
|
||||||
|
#include "contiki-raven.h"
|
||||||
|
|
||||||
|
#include "usb_task.h"
|
||||||
|
#include "serial/cdc_task.h"
|
||||||
|
#include "rndis/rndis_task.h"
|
||||||
|
#include "storage/storage_task.h"
|
||||||
|
|
||||||
|
PROCINIT(&etimer_process, &mac_process);
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* GCC depends on register r1 set to 0.
|
||||||
|
*/
|
||||||
|
asm volatile ("clr r1");
|
||||||
|
|
||||||
|
/* Initialize hardware */
|
||||||
|
init_lowlevel();
|
||||||
|
|
||||||
|
/* Clock */
|
||||||
|
clock_init();
|
||||||
|
|
||||||
|
printf_P(PSTR("\n\n\n********BOOTING CONTIKI*********\n"));
|
||||||
|
|
||||||
|
/* Process subsystem */
|
||||||
|
process_init();
|
||||||
|
|
||||||
|
/* Register initial processes */
|
||||||
|
procinit_init();
|
||||||
|
|
||||||
|
/* Setup USB */
|
||||||
|
process_start(&usb_process, NULL);
|
||||||
|
process_start(&cdc_process, NULL);
|
||||||
|
process_start(&rndis_process, NULL);
|
||||||
|
process_start(&storage_process, NULL);
|
||||||
|
|
||||||
|
printf_P(PSTR("System online.\n"));
|
||||||
|
|
||||||
|
//Fix MAC address
|
||||||
|
init_net();
|
||||||
|
|
||||||
|
/* Main scheduler loop */
|
||||||
|
while(1) {
|
||||||
|
process_run();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
71
platform/avr-ravenusb/contiki-raven.h
Normal file
71
platform/avr-ravenusb/contiki-raven.h
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006, Technical University of Munich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* @(#)$$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Sample Contiki kernel for STK 501 development board
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Simon Barner <barner@in.tum.de
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CONTIKI_RAVEN_H__
|
||||||
|
#define __CONTIKI_RAVEN_H__
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "contiki-net.h"
|
||||||
|
#include "contiki-lib.h"
|
||||||
|
|
||||||
|
// LED's for Raven USB
|
||||||
|
#define Leds_init() (DDRD |= 0xA0, DDRE |= 0xC0)
|
||||||
|
#define Leds_on() (PORTD |= 0x80, PORTD &= ~0x40, PORTE &= ~0xC0)
|
||||||
|
#define Leds_off() (PORTD &= ~0x80, PORTD |= 0x20, PORTE |= 0xC0)
|
||||||
|
#define Led0_on() (PORTD |= 0x80)
|
||||||
|
#define Led1_on() (PORTD &= ~0x20)
|
||||||
|
#define Led2_on() (PORTE &= ~0x80)
|
||||||
|
#define Led3_on() (PORTE &= ~0x40)
|
||||||
|
#define Led0_off() (PORTD &= ~0x80)
|
||||||
|
#define Led1_off() (PORTD |= 0x20)
|
||||||
|
#define Led2_off() (PORTE |= 0x80)
|
||||||
|
#define Led3_off() (PORTE |= 0x40)
|
||||||
|
#define Led0_toggle() (PIND |= 0x80)
|
||||||
|
#define Led1_toggle() (PIND |= 0x20)
|
||||||
|
#define Led2_toggle() (PINE |= 0x80)
|
||||||
|
#define Led3_toggle() (PINE |= 0x40)
|
||||||
|
|
||||||
|
|
||||||
|
void init_lowlevel(void);
|
||||||
|
void init_net(void);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* #ifndef __CONTIKI_RAVEN_H__ */
|
68
platform/avr-ravenusb/loadable_prg.c
Normal file
68
platform/avr-ravenusb/loadable_prg.c
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006, Technical University of Munich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* @(#)$$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Sample loadable module
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Simon Barner <barner@in.tum.de>
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "dev/rs232.h"
|
||||||
|
#include "contiki.h"
|
||||||
|
|
||||||
|
PROCESS(test_process1, "Test process");
|
||||||
|
PROCESS_THREAD(test_process1, ev, data)
|
||||||
|
{
|
||||||
|
static struct etimer etimer;
|
||||||
|
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
|
rs232_print (RS232_PORT_1, "test_process 1 starting\n");
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
etimer_set(&etimer, CLOCK_SECOND);
|
||||||
|
PROCESS_WAIT_UNTIL(etimer_expired(&etimer));
|
||||||
|
rs232_print (RS232_PORT_1, "Tick\n");
|
||||||
|
etimer_set(&etimer, CLOCK_SECOND);
|
||||||
|
PROCESS_WAIT_UNTIL(etimer_expired(&etimer));
|
||||||
|
rs232_print (RS232_PORT_1, "Tack\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CLIF struct process * const autostart_processes[] = {&test_process1};
|
Loading…
Reference in a new issue