summaryrefslogtreecommitdiff
path: root/apps/examples/cc3000/board.h
blob: 75caab0034a36c582029ea529e459ab4a7dbf0b0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/**************************************************************************
*
*  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 volatile unsigned long ulSmartConfigFinished;
extern volatile unsigned long ulCC3000Connected;
extern volatile unsigned long ulCC3000DHCP;
extern volatile unsigned long OkToDoShutDown;
extern volatile unsigned long ulCC3000DHCP_configured;
extern volatile uint8_t ucStopSmartConfig;

void CC3000_Init(void);