ZG2100 Network interface source
drv/zg2100/zg_defs.h
- Committer:
- donatien
- Date:
- 2010-07-09
- Revision:
- 0:b802fc31f1db
- Child:
- 1:3a7c15057192
File content as of revision 0:b802fc31f1db:
/* Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ //ZG2100 Low-level driver definitions //Donatien Garnier 2010 #ifndef ZG_DEFS_H #define ZG_DEFS_H #include "zg_err.h" //Error codes /* Parameters */ #define ZG_HEAD_BUF_SIZE 16 #define ZG_FIFO_BUF_SIZE 1024 #define ZG_SCAN_PROBE_DELAY 20 //In us #define ZG_SCAN_MIN_CHAN_TIME 400 //In (1024 us) #define ZG_SCAN_MAX_CHAN_TIME 800 //In (1024 us) #define ZG_REGION ZG_REGION_EUROPE /* Interface-specific constants */ #define ZG_SSID_LEN 32 //Max SSID length #define ZG_MAX_SUPPORTED_RATES 8 //Max number of supported rates #define ZG_SCAN_MAX_CHANNELS 14 #define ZG_MACADDR_LEN 6 #define ZG_SNAP_LEN 6 #define ZG_REGION_EUROPE 2 //Channels 1 - 13 #define ZG_REGION_MEA 2 //Channels 1 - 13 #define ZG_REGION_AMERICAS 0 //Channels 1 - 11 #define ZG_REGION_DEFAULT 1 //Channels 1 - 11 #define ZG_REGION_ASIAPAC 2 //Channels 1 - 13 #define ZG_REGION_JAPAN_A 5 //Channel 14 only #define ZG_WEP_KEYS_COUNT 4 #define ZG_WEP_KEY_LEN 13 #define ZG_WPA_PASS_LEN 64 #define ZG_PMK_LEN 32 /* Commands */ #define ZG_CMD_REG 0x00 #define ZG_CMD_REG_RD (ZG_CMD_REG | 0x40) #define ZG_CMD_REG_WR (ZG_CMD_REG | 0x00) #define ZG_CMD_FIFO 0x80 #define ZG_CMD_FIFO_RD_DATA (ZG_CMD_FIFO | 0x00) #define ZG_CMD_FIFO_RD_MGMT (ZG_CMD_FIFO | 0x00) #define ZG_CMD_FIFO_RD_DONE (ZG_CMD_FIFO | 0x50) #define ZG_CMD_FIFO_WR_DATA (ZG_CMD_FIFO | 0x20) #define ZG_CMD_FIFO_WR_MGMT (ZG_CMD_FIFO | 0x30) #define ZG_CMD_FIFO_WR_DONE (ZG_CMD_FIFO | 0x40) /* Registers */ #define ZG_REG_INTF 0x01 //8-bit register, interrupt raised flags #define ZG_REG_INTE 0x02 //8-bit register, interrupt enable flags #define ZG_REG_INTF2 0x2d //16-bit register, 2nd level interrupt raised flags #define ZG_REG_INTE2 0x2e //16-bit register, 2nd level interrupt enable flags #define ZG_REG_SYSINFO 0x21 //8-bit register, read sys info data window #define ZG_REG_SYSINFO_INDEX 0x2b //16-bit register, sys info data window offset #define ZG_REG_SYSINFO_STATUS 0x2c //16-bit register, sys info data window status #define ZG_REG_F0_CTRL0 0x25 //16-bit register, FIFO0 Ctrl reg #define ZG_REG_F0_CTRL1 0x26 //16-bit register, FIFO0 Ctrl reg #define ZG_REG_F0_INDEX 0x27 //16-bit register, FIFO0 Index reg #define ZG_REG_F0_STATUS 0x28 //16-bit register, FIFO0 Status reg #define ZG_REG_F1_CTRL0 0x29 //16-bit register, FIFO1 Ctrl reg #define ZG_REG_F1_CTRL1 0x2a //16-bit register, FIFO1 Ctrl reg #define ZG_REG_F1_INDEX 0x2b //16-bit register, FIFO1 Index reg #define ZG_REG_F1_STATUS 0x2c //16-bit register, FIFO1 Status reg #define ZG_REG_F0_ROOM 0x2f //16-bit register, room in FIFO0 for writing #define ZG_REG_F0_LEN 0x33 //16-bit register, bytes ready to read on FIFO0 #define ZG_REG_F1_LEN 0x35 //16-bit register, bytes ready to read on FIFO1 #define ZG_REG_LOWPWR 0x3d //16-bit register, low power mode cfg #define ZG_REG_IREG_ADDR 0x3e //16-bit register, set/read the ptr to indexed regs #define ZG_REG_IREG_DATA 0x3f //16-bit register, index regs data #define ZG_REG_LEN( reg ) ((reg)>=0x25?2:1) //Return bytes len of a register /* Indexed Registers */ #define ZG_IREG_HW_STATUS 0x2a //16-bit register, hardware status #define ZG_IREG_HW_RST 0x2b //16-bit register, reset reg #define ZG_HW_STATUS_RESET 0x1000 //ZG_IREG_HW_STATUS Mask to determine wether the chip is in reset #define ZG_IREG_PWR_STATUS 0x3e //16-bit register, power status (sleep state) #define ZG_IREG_LEN( reg ) 2 //Bytes len of an indexed register /* FIFOs */ /* When using FIFO requests, frame is formatted like this: [ZG_CMD_FIFO_WR_****][Type][Subtype] */ //Just here for zg_fifo_* cmds #define ZG_FIFO_DATA 0 #define ZG_FIFO_MGMT 1 #define ZG_FIFO_ANY 0 //A specific FIFO does not have to be specified for reads /* Types */ #define ZG_FIFO_WR_TXD_REQ 1 //Req to write TX Data #define ZG_FIFO_RD_TXD_ACK 1 //TX Data ack'ed #define ZG_FIFO_RD_RXD_AVL 3 //RX Data available #define ZG_FIFO_WR_MGMT_REQ 2 //Req to read/write mgmt Data #define ZG_FIFO_RD_MGMT_AVL 2 //Mgmt Data available/written ok #define ZG_FIFO_RD_MGMT_EVT 4 //Mgmt Data event /* Subtypes */ //TXD, RXD #define ZG_FIFO_TXD_STD 1 #define ZG_FIFO_RXD_STD 1 //Management //Events #define ZG_FIFO_MGMT_DISASSOC 1 //Disassociated #define ZG_FIFO_MGMT_DEAUTH 2 //Deauthenticated #define ZG_FIFO_MGMT_CONN 4 //Connection state //Commands #define ZG_FIFO_MGMT_SCAN 1 //Network scan #define ZG_FIFO_MGMT_PSK_CALC 12 //Compute Pre-Shared Key #define ZG_FIFO_MGMT_PMK_KEY 8 //Set Pairwise Master Key #define ZG_FIFO_MGMT_WEP_KEY 10 //Set WEP key #define ZG_FIFO_MGMT_PARM_SET 15 //Set param #define ZG_FIFO_MGMT_PARM_GET 16 //Get param #define ZG_FIFO_MGMT_ADHOC 18 //Start an adhoc connection #define ZG_FIFO_MGMT_CONNECT 19 #define ZG_FIFO_MGMT_DISC 5 #define ZG_FIFO_MGMT_CONN_MGMT 20 //Manage connection /* Params IDs for Get/Set Params */ #define ZG_FIFO_MGMT_PARM_MACAD 1 //MAC Addr (6 bytes long) #define ZG_FIFO_MGMT_PARM_REGION 2 //Region (1 byte long) #define ZG_FIFO_MGMT_PARM_SYSV 26 //System version (2 bytes long) /* Masks used by ZG_REG_INT* */ #define ZG_INT_MASK_F0 0x40 #define ZG_INT_MASK_F1 0x80 /* F0 / F1 helpers */ #define ZG_REG_F_CTRL0(n) ((n==0)?ZG_REG_F0_CTRL0:ZG_REG_F1_CTRL0) #define ZG_REG_F_CTRL1(n) ((n==0)?ZG_REG_F0_CTRL1:ZG_REG_F1_CTRL1) #define ZG_REG_F_INDEX(n) ((n==0)?ZG_REG_F0_INDEX:ZG_REG_F1_INDEX) #define ZG_REG_F_STATUS(n) ((n==0)?ZG_REG_F0_STATUS:ZG_REG_F1_STATUS) #define ZG_REG_F_LEN(n) ((n==0)?ZG_REG_F0_LEN:ZG_REG_F1_LEN) #define ZG_INT_MASK_F(n) ((n==0)?ZG_INT_MASK_F0:ZG_INT_MASK_F1) /* Macro helpers (LE Platform, SPI is BE) */ #define HTODS( x ) ( ((x<<8) | (x>>8)) & 0xFFFF ) //Host to device, short #define DTOHS( x ) ( HTODS(x) ) //Device to host, short #define HTODL( x ) ( ( (x & 0x000000FF) << 24 ) \ | ( (x & 0x0000FF00) << 8 ) \ | ( (x & 0x00FF0000) >> 8 ) \ | ( (x & 0xFF000000) >> 24 ) ) //Host to device, long #define DTOHL( x ) ( HTODL(x) ) /* Platform Specific defs */ #define ZG_MEM __attribute((section("AHBSRAM0"))) /* Typedefs */ typedef unsigned char byte; typedef unsigned short word; typedef unsigned int dword; typedef signed char int8_t; typedef unsigned char uint8_t; typedef signed short int16_t; typedef unsigned short uint16_t; typedef signed int int32_t; typedef unsigned int uint32_t; /* Data structures */ typedef __packed struct __ZG_SYSV { byte rom; byte revision; } ZG_SYSV; typedef enum __ZG_BSS_TYPE { ZG_BSS_INFRA = 1, ZG_BSS_ADHOC = 2, ZG_BSS_ANY = 3 } ZG_BSS_TYPE; typedef enum __ZG_PROBE_TYPE { ZG_PROBE_ACTIVE = 1, ZG_PROBE_PASSIVE = 2 } ZG_PROBE_TYPE; //Scan request typedef __packed struct __ZG_SCAN_REQ { word probe_delay; //In us word min_chan_time; //Min scan time on each channel in (1024 us) word max_chan_time; //Max scan time on each channel in (1024 us) byte bssid_mask[ZG_MACADDR_LEN]; ZG_BSS_TYPE bss_type; //Infra, adhoc or both ZG_PROBE_TYPE probe_req; //Send probe request frames byte ssid_len; byte channels_count; //Number char ssid[ZG_SSID_LEN]; //Scan for a specific network, 0 otherwise byte channels[ZG_SCAN_MAX_CHANNELS]; //Channels to scan } ZG_SCAN_REQ; //Scan results header typedef __packed struct __ZG_SCAN_RES { byte result; byte state; byte last_channel; //Last channel scanned byte results_count; //Number of ZG_SCAN_ITEM following this header } ZG_SCAN_RES; //Scan result //See: // - http://en.wikipedia.org/wiki/Beacon_frame // - IEEE 802.11-2007 7.2.3.1 Beacon frame format (p. 80 ~ 81) // - IEEE 802.11-2007 7.3 Management frame body components (p. 87 ~ 139) typedef __packed struct __ZG_SCAN_ITEM { byte bssid[ZG_MACADDR_LEN]; //This is actually a MAC address char ssid[ZG_SSID_LEN]; //SSID of the network word capability; word beacon_period; word atim_wdw; //http://en.wikipedia.org/wiki/Announcement_Traffic_Indication_Message byte supported_rates[ZG_MAX_SUPPORTED_RATES];//(0x80 | enc_rate) where enc_rate = (rate / 500Kbps) byte rssi; byte supported_rates_count; byte dtim_period; //http://en.wikipedia.org/wiki/Delivery_Traffic_Indication_Message ZG_BSS_TYPE bss_type; //Infra or adhoc byte channel; byte ssid_len; } ZG_SCAN_ITEM; //WEP Key setup typedef __packed struct __ZG_WEP_REQ { byte slot; byte key_size; byte default_key; byte ssid_len; char ssid[ZG_SSID_LEN]; //SSID of the network byte keys[ZG_WEP_KEYS_COUNT][ZG_WEP_KEY_LEN]; } ZG_WEP_REQ; //PSK Key computation typedef __packed struct __ZG_PSK_CALC_REQ { byte config; byte phrase_len; byte ssid_len; byte _pad; //Padding char ssid[ZG_SSID_LEN]; //SSID of the network char pass_phrase[ZG_WPA_PASS_LEN]; } ZG_PSK_CALC_REQ; typedef __packed struct __ZG_PSK_CALC_RES { byte result; byte state; byte key_returned; byte _pad; //Padding byte key[ZG_PMK_LEN]; //PSK key returned } ZG_PSK_CALC_RES; typedef __packed struct __ZG_PMK_REQ { byte slot; byte ssid_len; char ssid[ZG_SSID_LEN]; //SSID of the network byte key[ZG_PMK_LEN]; //PSK key returned } ZG_PMK_REQ; typedef enum __ZG_SECURITY { ZG_SECURITY_NONE = 0x00, ZG_SECURITY_WEP = 0x01, ZG_SECURITY_WPA = 0x02, ZG_SECURITY_WPA2 = 0x03, ZG_SECURITY_TRY = 0xFF } ZG_SECURITY; typedef __packed struct __ZG_CONNECT_REQ { ZG_SECURITY security; byte ssid_len; char ssid[ZG_SSID_LEN]; //SSID of the network word sleep_duration; //Power save sleep duration (/100 ms) ZG_BSS_TYPE bss_type; byte _pad; //Padding } ZG_CONNECT_REQ; typedef __packed struct __ZG_DISCONNECT_REQ { word reason_code; bool disconnect; bool deauth_frame; } ZG_DISCONNECT_REQ; //Ethernet / ZG Packet headers typedef __packed struct __ZG_ETH_HDR //Ethernet packet header { byte dest[ZG_MACADDR_LEN]; byte src[ZG_MACADDR_LEN]; word type; } ZG_ETH_HDR; typedef __packed struct __ZG_RX_HDR //ZG packet header on rx { word rssi; byte dest[ZG_MACADDR_LEN]; byte src[ZG_MACADDR_LEN]; dword arrival_time; word data_len; byte snap[ZG_SNAP_LEN]; //SNAP word, see zg_net word type; //Ethernet type } ZG_RX_HDR; typedef __packed struct __ZG_TX_HDR //ZG packet header on tx { word zero; //Must be set to zero byte dest[ZG_MACADDR_LEN]; byte snap[ZG_SNAP_LEN]; //SNAP word, see zg_net word type; //Ethernet type } ZG_TX_HDR; #endif