nuttx-apps/examples/cc3000/board.h
2013-09-04 09:45:59 -06:00

218 lines
5.3 KiB
C

/**************************************************************************
*
* This file is part of the ArduinoCC3000 library.
* Version 1.0.1b
*
* Copyright (C) 2013 Chris Magagna - cmagagna@yahoo.com
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Don't sue me if my code blows up your board and burns down your house
*
*
* This file is the main module for the Arduino CC3000 library.
* Your program must call CC3000_Init() before any other API calls.
*
****************************************************************************/
/*
Some things are different for the Teensy 3.0, so set a flag if we're using
that hardware.
*/
#include <stdint.h>
#if defined(__arm__) && defined(CORE_TEENSY) && defined(__MK20DX128__)
#define TEENSY3 1
#endif
/* I used the Teensy 3.0 to get the Arduino CC3000 library working but the
Teensy's hardware SPI and the CC3000's SPI didn't like each other so I had
to send the bits manually. For the Uno, Nano, etc. you can probably leave
this unchanged. If your Arduino can't talk to the CC3000 and you're sure
your wiring is OK then try changing this. */
#ifdef TEENSY3
#define USE_HARDWARE_SPI false
#else
#define USE_HARDWARE_SPI true
#endif
// These are the Arduino pins that connect to the CC3000
// (in addition to standard SPI pins MOSI, MISO, and SCK)
//
// The WLAN_IRQ pin must be supported by attachInterrupt
// on your platform
#ifndef TEENSY3
#define WLAN_CS 10 // Arduino pin connected to CC3000 WLAN_SPI_CS
#define WLAN_EN 9 // Arduino pin connected to CC3000 VBAT_SW_EN
#define WLAN_IRQ 3 // Arduino pin connected to CC3000 WLAN_SPI_IRQ
#define WLAN_IRQ_INTNUM 1 // The attachInterrupt() number that corresponds
// to WLAN_IRQ
#define WLAN_MOSI MOSI
#define WLAN_MISO MISO
#define WLAN_SCK SCK
#else
#define WLAN_CS 25
#define WLAN_MISO 26
#define WLAN_IRQ 27
#define WLAN_IRQ_INTNUM 27 // On the Teensy 3.0 the interrupt # is the same as the pin #
#define WLAN_MOSI 28
#define WLAN_SCK 29
#define WLAN_EN 30
#endif
/*
The timing between setting the CS pin and reading the IRQ pin is very
tight on the CC3000, and sometimes the default Arduino digitalRead()
and digitalWrite() functions are just too slow.
For many of the CC3000 library functions this isn't a big deal because the
IRQ pin is tied to an interrupt routine but some of them of them disable
the interrupt routine and read the pins directly. Because digitalRead()
/ Write() are so slow once in a while the Arduino will be in the middle of
its pin code and the CC3000 will flip another pin's state and it will be
missed, and everything locks up.
The upshot of all of this is we need to read & write the pin states
directly, which is very fast compared to the built in Arduino functions.
The Teensy 3.0's library has built in macros called digitalReadFast()
& digitalWriteFast() that compile down to direct port manipulations but
are still readable, so use those if possible.
There's a digitalReadFast() / digitalWriteFast() library for Arduino but
it looks like it hasn't been updated since 2010 so I think it's best to
just use the direct port manipulations.
*/
#ifdef TEENSY3
#define Read_CC3000_IRQ_Pin() digitalReadFast(WLAN_IRQ)
#define Set_CC3000_CS_NotActive() digitalWriteFast(WLAN_CS, HIGH)
#define Set_CC3000_CS_Active() digitalWriteFast(WLAN_CS, LOW)
#else
// This is hardcoded for an ATMega328 and pin 3. You will need to change this
// for other MCUs or pins
#define Read_CC3000_IRQ_Pin() ((PIND & B00001000) ? 1 : 0)
// This is hardcoded for an ATMega328 and pin 10. You will need to change this
// for other MCUs or pins
#define Set_CC3000_CS_NotActive() PORTB |= B00000100
#define Set_CC3000_CS_Active() PORTB &= B11111011
#endif
#define MAC_ADDR_LEN 6
#define DISABLE (0)
#define ENABLE (1)
//AES key "smartconfigAES16"
//const uint8_t smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36};
/* If you uncomment the line below the library will leave out a lot of the
higher level functions but use a lot less memory. From:
http://processors.wiki.ti.com/index.php/Tiny_Driver_Support
CC3000's new driver has flexible memory compile options.
This feature comes in handy when we want to use a limited RAM size MCU.
Using The Tiny Driver Compilation option will create a tiny version of our
host driver with lower data, stack and code consumption.
By enabling this feature, host driver's RAM consumption can be reduced to
minimum of 251 bytes.
The Tiny host driver version will limit the host driver API to the most
essential ones.
Code size depends on actual APIs used.
RAM size depends on the largest packet sent and received.
CC3000 can now be used with ultra low cost MCUs, consuming 251 byte of RAM
and 2K to 6K byte of code size, depending on the API usage. */
//#define CC3000_TINY_DRIVER 1
extern uint8_t asyncNotificationWaiting;
extern long lastAsyncEvent;
extern uint8_t dhcpIPAddress[];
extern void CC3000_Init(void);
extern volatile unsigned long ulSmartConfigFinished,
ulCC3000Connected,
ulCC3000DHCP,
OkToDoShutDown,
ulCC3000DHCP_configured;
extern volatile uint8_t ucStopSmartConfig;