Permalink
Switch branches/tags
Nothing to show
Find file
Fetching contributors…
Cannot retrieve contributors at this time
executable file 395 lines (331 sloc) 15.1 KB
/*****************************************************************************
Filename: g2100.h
Description: Driver for the ZeroG Wireless G2100 series devices
*****************************************************************************
Driver for the WiShield 1.0 wireless devices
Copyright(c) 2009 Async Labs Inc. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59
Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Contact Information:
<asynclabs@asynclabs.com>
Author Date Comment
----------------------------------------------------------------------------
AsyncLabs 02/25/2009 Initial port
AsyncLabs 05/29/2009 Adding support for new library
*****************************************************************************/
#ifndef G2100_H_
#define G2100_H_
#define DRV_STATE_INIT 0
#define DRV_STATE_GET_MAC 2
#define DRV_STATE_START_CONN 3
#define DRV_STATE_PROCESS_RX 4
#define DRV_STATE_IDLE 5
#define DRV_STATE_SETUP_SECURITY 6
#define DRV_STATE_INSTALL_PSK 7
#define DRV_STATE_ENABLE_CONN_MANAGE 8
//Host to Zero G long
#define HTOZGL(a) ( ((a & 0x000000ff)<<24) \
|((a & 0x0000ff00)<<8) \
|((a & 0x00ff0000)>>8) \
|((a & 0xff000000)>>24) )
#define ZGTOHL(a) HTOZGL(a)
// Host to Zero G short
#define HSTOZGS(a) (u16)(((a)<<8) | ((a)>>8))
#define ZGSTOHS(a) HSTOZGS(a)
//#define HTONS(a) HSTOZGS(a)
#define ZG_INTERRUPT_PIN 0 // Pin on Arduino
// Command values which appear in ZG_PREAMBLE_CMD_IDX for each SPI message
#define ZG_CMD_FIFO_ACCESS (0x80)
#define ZG_CMD_WT_FIFO_DATA (ZG_CMD_FIFO_ACCESS | 0x20)
#define ZG_CMD_WT_FIFO_MGMT (ZG_CMD_FIFO_ACCESS | 0x30)
#define ZG_CMD_RD_FIFO (ZG_CMD_FIFO_ACCESS | 0x00)
#define ZG_CMD_WT_FIFO_DONE (ZG_CMD_FIFO_ACCESS | 0x40)
#define ZG_CMD_RD_FIFO_DONE (ZG_CMD_FIFO_ACCESS | 0x50)
#define ZG_CMD_WT_REG (0x00)
#define ZG_CMD_RD_REG (0x40)
// Type values which appear in ZG_PREAMBLE_TYPE_IDX for each SPI message
#define ZG_MAC_TYPE_TXDATA_REQ ((u8)1)
#define ZG_MAC_TYPE_MGMT_REQ ((u8)2)
#define ZG_MAC_TYPE_TXDATA_CONFIRM ((u8)1)
#define ZG_MAC_TYPE_MGMT_CONFIRM ((u8)2)
#define ZG_MAC_TYPE_RXDATA_INDICATE ((u8)3)
#define ZG_MAC_TYPE_MGMT_INDICATE ((u8)4)
// Subtype values which appear in ZG_PREAMBLE_SUBTYPE_IDX for each SPI message
// Subtype for ZG_MAC_TYPE_TXDATA_REQ and ZG_MAC_TYPE_TXDATA_CONFIRM
#define ZG_MAC_SUBTYPE_TXDATA_REQ_STD ((u8)1)
// Subtype for ZG_MAC_TYPE_MGMT_REQ and ZG_MAC_TYPE_MGMT_CONFIRM
#define ZG_MAC_SUBTYPE_MGMT_SCAN ((u8)1)
#define ZG_MAC_SUBTYPE_MGMT_REQ_PMK_KEY ((u8)8)
#define ZG_MAC_SUBTYPE_MGMT_REQ_WEP_KEY ((u8)10)
#define ZG_MAC_SUBTYPE_MGMT_REQ_CALC_PSK ((u8)12)
#define ZG_MAC_SUBTYPE_MGMT_REQ_SET_PARAM ((u8)15)
#define ZG_MAC_SUBTYPE_MGMT_REQ_GET_PARAM ((u8)16)
#define ZG_MAC_SUBTYPE_MGMT_REQ_ADHOC_START ((u8)18)
#define ZG_MAC_SUBTYPE_MGMT_REQ_CONNECT ((u8)19)
#define ZG_MAC_SUBTYPE_MGMT_REQ_CONNECT_MANAGE ((u8)20)
// Subtype for ZG_MAC_TYPE_RXDATA_INDICATE
#define ZG_MAC_SUBTYPE_RXDATA_IND_STD ((u8)1)
// Subtype for ZG_MAC_TYPE_MGMT_INDICATE
#define ZG_MAC_SUBTYPE_MGMT_IND_DISASSOC ((u8)1)
#define ZG_MAC_SUBTYPE_MGMT_IND_DEAUTH ((u8)2)
#define ZG_MAC_SUBTYPE_MGMT_IND_CONN_STATUS ((u8)4)
// Parameter IDs for ZG_MAC_SUBTYPE_MGMT_REQ_SET_PARAM
#define ZG_PARAM_MAC_ADDRESS (1)
// MAC result code
enum {
ZG_RESULT_SUCCESS = 1,
ZG_RESULT_INVALID_SUBTYPE,
ZG_RESULT_CANCELLED,
ZG_RESULT_FRAME_EOL,
ZG_RESULT_FRAME_RETRY_LIMIT,
ZG_RESULT_FRAME_NO_BSS,
ZG_RESULT_FRAME_TOO_BIG,
ZG_RESULT_FRAME_ENCRYPT_FAILURE,
ZG_RESULT_INVALID_PARAMS,
ZG_RESULT_ALREADY_AUTH,
ZG_RESULT_ALREADY_ASSOC,
ZG_RESULT_INSUFFICIENT_RSRCS,
ZG_RESULT_TIMEOUT,
ZG_RESULT_BAD_EXCHANGE, // frame exchange problem with peer (AP or STA)
ZG_RESULT_AUTH_REFUSED, // authenticating node refused our request
ZG_RESULT_ASSOC_REFUSED, // associating node refused our request
ZG_RESULT_REQ_IN_PROGRESS, // only one mlme request at a time allowed
ZG_RESULT_NOT_JOINED, // operation requires that device be joined
// with target
ZG_RESULT_NOT_ASSOC, // operation requires that device be
// associated with target
ZG_RESULT_NOT_AUTH, // operation requires that device be
// authenticated with target
ZG_RESULT_SUPPLICANT_FAILED,
ZG_RESULT_UNSUPPORTED_FEATURE,
ZG_RESULT_REQUEST_OUT_OF_SYNC // Returned when a request is recognized
// but invalid given the current state
// of the MAC
};
/*
* G2100 command registers
*/
#define ZG_INTR_REG (0x01) // 8-bit register containing interrupt bits
#define ZG_INTR_MASK_REG (0x02) // 8-bit register containing interrupt mask
#define ZG_SYS_INFO_DATA_REG (0x21) // 8-bit register to read system info data window
#define ZG_SYS_INFO_IDX_REG (0x2b)
#define ZG_INTR2_REG (0x2d) // 16-bit register containing interrupt bits
#define ZG_INTR2_MASK_REG (0x2e) // 16-bit register containing interrupt mask
#define ZG_BYTE_COUNT_REG (0x2f) // 16-bit register containing available write size for fifo0
#define ZG_BYTE_COUNT_FIFO0_REG (0x33) // 16-bit register containing bytes ready to read on fifo0
#define ZG_BYTE_COUNT_FIFO1_REG (0x35) // 16-bit register containing bytes ready to read on fifo1
#define ZG_PWR_CTRL_REG (0x3d) // 16-bit register used to control low power mode
#define ZG_INDEX_ADDR_REG (0x3e) // 16-bit register to move the data window
#define ZG_INDEX_DATA_REG (0x3f) // 16-bit register to read the address in the ZG_INDEX_ADDR_REG
#define ZG_INTR_REG_LEN (1)
#define ZG_INTR_MASK_REG_LEN (1)
#define ZG_SYS_INFO_DATA_REG_LEN (1)
#define ZG_SYS_INFO_IDX_REG_LEN (2)
#define ZG_INTR2_REG_LEN (2)
#define ZG_INTR2_MASK_REG_LEN (2)
#define ZG_BYTE_COUNT_REG_LEN (2)
#define ZG_BYTE_COUNT_FIFO0_REG_LEN (2)
#define ZG_BYTE_COUNT_FIFO1_REG_LEN (2)
#define ZG_PWR_CTRL_REG_LEN (2)
#define ZG_INDEX_ADDR_REG_LEN (2)
#define ZG_INDEX_DATA_REG_LEN (2)
// Registers accessed through ZG_INDEX_ADDR_REG
#define ZG_RESET_STATUS_REG (0x2a) // 16-bit read only register providing HW status bits
#define ZG_RESET_REG (0x2e) // 16-bit register used to initiate hard reset
#define ZG_PWR_STATUS_REG (0x3e) // 16-bit register read to determine when device
// out of sleep state
#define ZG_RESET_MASK (0x10) // the first byte of the ZG_RESET_STATUS_REG
// used to determine when the G2100 is in reset
#define ZG_ENABLE_LOW_PWR_MASK (0x01) // used by the Host to enable/disable sleep state
// indicates to G2100 that the Host has completed
// transactions and the device can go into sleep
// state if possible
// states for interrupt state machine
#define ZG_INTR_ST_RD_INTR_REG (1)
#define ZG_INTR_ST_WT_INTR_REG (2)
#define ZG_INTR_ST_RD_CTRL_REG (3)
// interrupt state
#define ZG_INTR_DISABLE ((u8)0)
#define ZG_INTR_ENABLE ((u8)1)
// mask values for ZG_INTR_REG and ZG_INTR2_REG
#define ZG_INTR_MASK_FIFO1 (0x80)
#define ZG_INTR_MASK_FIFO0 (0x40)
#define ZG_INTR_MASK_ALL (0xff)
#define ZG_INTR2_MASK_ALL (0xffff)
// Buffer size
#ifdef UIP_SCAN
#define ZG_BUFFER_SIZE 800
#else
#define ZG_BUFFER_SIZE 450
#endif // UIP_SCAN
// Types of networks
#define ZG_BSS_INFRA (1) // infrastructure only
#define ZG_BSS_ADHOC (2) // Ad-hoc only (ibss)
// Max characters in network SSID
#define ZG_MAX_SSID_LENGTH 32
// Security keys
#define ZG_MAX_ENCRYPTION_KEYS 4
#define ZG_MAX_ENCRYPTION_KEY_SIZE 13
#define ZG_MAX_WPA_PASSPHRASE_LEN 64
#define ZG_MAX_PMK_LEN 32
#define ZG_SECURITY_TYPE_NONE 0
#define ZG_SECURITY_TYPE_WEP 1
#define ZG_SECURITY_TYPE_WPA 2
#define ZG_SECURITY_TYPE_WPA2 3
#define ZG_SECURITY_TYPE_WPA_PRECALC 4
#define ZG_SECURITY_TYPE_WPA2_PRECALC 5
typedef struct
{
u8 slot; /* slot index */
u8 keyLen;
u8 defID; /* the default wep key id */
u8 ssidLen; /* num valid bytes in ssid */
u8 ssid[ZG_MAX_SSID_LENGTH]; /* ssid of network */
u8 key[ZG_MAX_ENCRYPTION_KEYS][ZG_MAX_ENCRYPTION_KEY_SIZE]; /* wep key data for 4 default keys */
} zg_wep_key_req_t;
#define ZG_WEP_KEY_REQ_SIZE (4 + ZG_MAX_SSID_LENGTH + ZG_MAX_ENCRYPTION_KEYS*ZG_MAX_ENCRYPTION_KEY_SIZE)
typedef struct
{
u8 configBits;
u8 phraseLen; /* number of valid bytes in passphrase */
u8 ssidLen; /* number of valid bytes in ssid */
u8 reserved; /* alignment byte */
u8 ssid[ZG_MAX_SSID_LENGTH]; /* the string of characters representing the ssid */
u8 passPhrase[ZG_MAX_WPA_PASSPHRASE_LEN]; /* the string of characters representing the passphrase */
} zg_psk_calc_req_t;
#define ZG_PSK_CALC_REQ_SIZE (4 + ZG_MAX_SSID_LENGTH + ZG_MAX_WPA_PASSPHRASE_LEN) /* 100 bytes */
typedef struct
{
u8 result; /* indicating success or other */
u8 macState; /* current State of the on-chip MAC */
u8 keyReturned; /* 1 if psk contains key data, 0 otherwise */
u8 reserved; /* pad byte */
u8 psk[ZG_MAX_PMK_LEN]; /* the psk bytes */
} zg_psk_calc_cnf_t;
typedef struct
{
u8 slot;
u8 ssidLen;
u8 ssid[ZG_MAX_SSID_LENGTH];
u8 keyData[ZG_MAX_PMK_LEN];
} zg_pmk_key_req_t;
#define ZG_PMK_KEY_REQ_SIZE (2 + ZG_MAX_SSID_LENGTH + ZG_MAX_PMK_LEN)
typedef struct
{
u16 rssi; /* the value of the G1000 RSSI when the data frame was received */
u8 dstAddr[6]; /* MAC Address to which the data frame was directed. */
u8 srcAddr[6]; /* MAC Address of the Station that sent the Data frame. */
u16 arrivalTime_th; /* the value of the 32-bit G1000 system clock when the frame arrived */
u16 arrivalTime_bh;
u16 dataLen; /* the length in bytes of the payload which immediately follows this data structure */
} zg_rx_data_ind_t;
typedef struct
{
u8 secType; /* security type : 0 - none; 1 - wep; 2 - wpa; 3 - wpa2; 0xff - best available */
u8 ssidLen; /* num valid bytes in ssid */
u8 ssid[ZG_MAX_SSID_LENGTH]; /* the ssid of the target */
u16 sleepDuration; /* power save sleep duration in units of 100 milliseconds */
u8 modeBss; /* 1 - infra; 2 - adhoc */
u8 reserved;
} zg_connect_req_t;
#define ZG_CONNECT_REQ_SIZE (38)
// =================================================================================================
#ifdef UIP_SCAN
/* completely describes the details of a BSS (access point) */
/* This structure is used as a single entry in a Scan result */
typedef struct
{
u8 bssid[6]; /* network BSSID value */
u8 ssid[32]; /* network SSID value */
u8 capInfo[2]; /* capability info bits */
u16 beaconPeriod; /* network Beacon interval */
u16 atimWindow; /* only valid if .bssType == Ibss */
u8 basicRateSet[8]; /* list of network basic rates */
u8 rssi; /* signal strength of rx'd
* frame beacon, probe resp */
u8 numRates; /* num entries in basicRateSet */
u8 DtimPeriod; /* (part of TIM element) */
u8 bssType; /* ad-hoc or infrastructure. */
u8 channel; /* phy param set */
u8 ssidLen; /* number of bytes in ssid */
} tZGBssDesc; /* 58 bytes */
typedef tZGBssDesc *tZGBssDescPtr;
/* use #define size to represent the number of bytes in the structure
* because not all compilers have an appropriate calculation when using sizeof() */
#define kZGBssDescSZ (58)
/* Represents the input parameters required to
* conduct a Scan operation */
typedef struct
{
u16 probeDelay; /* the number of usec to delay before transmitting a probe
* request following the channel change event */
u16 minChannelTime; /* the minimum time to spend on each channel in units
* of TU (1024 usec) */
u16 maxChannelTime; /* the maximum time to spend on each channel in units
* of TU (1024 usec) */
u8 bssid[6]; /* limits the scan to a specific Bss or Broadcast
* (FF:FF:FF:FF:FF:FF) */
u8 bss; /* limits the type of networks to include in scan results.
* Can be one of; kBssInfra kBssAdHoc kBssAny*/
u8 snType; /* one of kZGMACSnTypeActive or kZGMACSnTypePassive where
* active indicates the use of Probe Request frames */
u8 ssidLen; /* num chars in ssid */
u8 chnlLen; /* num channels to scan */
u8 ssid[32]; /* limits the scan to a specific Service Set (SSID) or
// * broadcast ("\0") */
u8 channelList[14]; /* zero terminated list of channels
* to scan */
} tZGScanReq; /* 62 bytes */
typedef tZGScanReq *tZGScanReqPtr;
/* use #define size to represent the number of bytes in the structure
* because not all compilers have an appropriate calculation when using sizeof() */
#define kZGScanReqSZ (62)
/* The structure used to return the scan results back to the host system */
typedef struct
{
u8 result; /* the result of the scan */
u8 macState; /* current state of the on-chip MAC */
u8 lastChnl; /* the last channel scanned */
u8 numBssDesc; /* The number of tZGMACBssDesc objects that
* immediately follows this structure in memory */
} tZGScanResult; /* 4 bytes */
typedef tZGScanResult *tZGScanResultPtr;
#define kZGScanResultSZ (4)
#endif // UIP_SCAN
// =================================================================================================
void zg_init();
void zg_reset();
void spi_transfer(volatile U8* buf, U16 len, U8 toggle_cs);
void zg_chip_reset();
void zg_interrupt2_reg();
void zg_interrupt_reg(U8 mask, U8 state);
void zg_isr();
void zg_process_isr();
void zg_send(U8* buf, U16 len);
void zg_recv(U8* buf, U16* len);
U16 zg_get_rx_status();
void zg_clear_rx_status();
void zg_set_tx_status(U8 status);
U8 zg_get_conn_state();
void zg_set_buf(U8* buf, U16 buf_len);
U8* zg_get_mac();
void zg_set_ssid(U8* ssid, U8 ssid_len);
void zg_set_sec(U8 sec_type, U8* sec_key, U8 sec_key_len);
void zg_drv_process();
// User Contributed ================================================================================
U16 zg_get_rssi();
#ifdef UIP_SCAN
void zg_scan_start();
tZGScanResult* zg_scan_results();
tZGBssDesc* zg_scan_desc(U8 item);
U16 get_scan_cnt();
#endif // UIP_SCAN
#endif /* G2100_H_ */