Donatien Garnier / ZG2100NetIfSource
Committer:
donatien
Date:
Fri Jul 09 15:37:23 2010 +0000
Revision:
0:b802fc31f1db
Child:
1:3a7c15057192

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:b802fc31f1db 1
donatien 0:b802fc31f1db 2 /*
donatien 0:b802fc31f1db 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
donatien 0:b802fc31f1db 4
donatien 0:b802fc31f1db 5 Permission is hereby granted, free of charge, to any person obtaining a copy
donatien 0:b802fc31f1db 6 of this software and associated documentation files (the "Software"), to deal
donatien 0:b802fc31f1db 7 in the Software without restriction, including without limitation the rights
donatien 0:b802fc31f1db 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
donatien 0:b802fc31f1db 9 copies of the Software, and to permit persons to whom the Software is
donatien 0:b802fc31f1db 10 furnished to do so, subject to the following conditions:
donatien 0:b802fc31f1db 11
donatien 0:b802fc31f1db 12 The above copyright notice and this permission notice shall be included in
donatien 0:b802fc31f1db 13 all copies or substantial portions of the Software.
donatien 0:b802fc31f1db 14
donatien 0:b802fc31f1db 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
donatien 0:b802fc31f1db 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
donatien 0:b802fc31f1db 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
donatien 0:b802fc31f1db 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
donatien 0:b802fc31f1db 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:b802fc31f1db 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
donatien 0:b802fc31f1db 21 THE SOFTWARE.
donatien 0:b802fc31f1db 22 */
donatien 0:b802fc31f1db 23
donatien 0:b802fc31f1db 24 #include "netCfg.h"
donatien 0:b802fc31f1db 25 #if NET_ZG2100
donatien 0:b802fc31f1db 26
donatien 0:b802fc31f1db 27 #include "zg_defs.h"
donatien 0:b802fc31f1db 28 #include "zg_drv.h"
donatien 0:b802fc31f1db 29 #include "zg_com.h"
donatien 0:b802fc31f1db 30
donatien 0:b802fc31f1db 31 //#define __DEBUG
donatien 0:b802fc31f1db 32 #include "dbg/dbg.h"
donatien 0:b802fc31f1db 33
donatien 0:b802fc31f1db 34 #include "mbed.h"
donatien 0:b802fc31f1db 35 byte head_buf[ZG_HEAD_BUF_SIZE] ZG_MEM;
donatien 0:b802fc31f1db 36 byte fifo_buf[ZG_FIFO_BUF_SIZE] ZG_MEM; //Big buffer used for fifo transfers
donatien 0:b802fc31f1db 37 bool int_raised;
donatien 0:b802fc31f1db 38 bool mgmt_busy; //Processing a req
donatien 0:b802fc31f1db 39 bool tx_pending; //Packet sent but not acked yet
donatien 0:b802fc31f1db 40 bool connected; //Connected to a wifi network
donatien 0:b802fc31f1db 41 ZG_DATA zg_data; //Container for all data received from the chip
donatien 0:b802fc31f1db 42 ZG_DATA_MASK zg_data_mask; //Flags valid data
donatien 0:b802fc31f1db 43 uint32_t current_mgmt_param;
donatien 0:b802fc31f1db 44
donatien 0:b802fc31f1db 45 //Spi intf, Chip Select pin, Interrupt pin
donatien 0:b802fc31f1db 46 zg_err zg_drv_init()
donatien 0:b802fc31f1db 47 {
donatien 0:b802fc31f1db 48 word sys_version;
donatien 0:b802fc31f1db 49 int_raised = false;
donatien 0:b802fc31f1db 50 memset((void*)&zg_data, 0, sizeof(ZG_DATA));
donatien 0:b802fc31f1db 51 memset((void*)&zg_data_mask, 0, sizeof(ZG_DATA_MASK));
donatien 0:b802fc31f1db 52 current_mgmt_param = 0;
donatien 0:b802fc31f1db 53 mgmt_busy = false;
donatien 0:b802fc31f1db 54 tx_pending = false;
donatien 0:b802fc31f1db 55 connected = false;
donatien 0:b802fc31f1db 56
donatien 0:b802fc31f1db 57 //Reset
donatien 0:b802fc31f1db 58 zg_indexed_register_write(ZG_IREG_HW_RST, 0x80FF);
donatien 0:b802fc31f1db 59 zg_indexed_register_write(ZG_IREG_HW_RST, 0x0FFF);
donatien 0:b802fc31f1db 60
donatien 0:b802fc31f1db 61 DBG("\r\nStarted reset\r\n");
donatien 0:b802fc31f1db 62
donatien 0:b802fc31f1db 63 while( !(zg_indexed_register_read(ZG_IREG_HW_STATUS) & ZG_HW_STATUS_RESET) )
donatien 0:b802fc31f1db 64 {
donatien 0:b802fc31f1db 65 ;
donatien 0:b802fc31f1db 66 }
donatien 0:b802fc31f1db 67
donatien 0:b802fc31f1db 68 DBG("\r\nStopped\r\n");
donatien 0:b802fc31f1db 69
donatien 0:b802fc31f1db 70 while( zg_register_read(ZG_REG_F0_ROOM) == 0 )
donatien 0:b802fc31f1db 71 {
donatien 0:b802fc31f1db 72 ;
donatien 0:b802fc31f1db 73 }
donatien 0:b802fc31f1db 74
donatien 0:b802fc31f1db 75 DBG("\r\nStarted!\r\n");
donatien 0:b802fc31f1db 76
donatien 0:b802fc31f1db 77 //Reset OK
donatien 0:b802fc31f1db 78
donatien 0:b802fc31f1db 79 //Setup interrupts
donatien 0:b802fc31f1db 80 zg_register_write(ZG_REG_INTF, 0);
donatien 0:b802fc31f1db 81 zg_register_write(ZG_REG_INTE, ZG_INT_MASK_F0 | ZG_INT_MASK_F1);
donatien 0:b802fc31f1db 82
donatien 0:b802fc31f1db 83 zg_register_write(ZG_REG_INTF2, 0xff);
donatien 0:b802fc31f1db 84 zg_register_write(ZG_REG_INTE2, 0);
donatien 0:b802fc31f1db 85
donatien 0:b802fc31f1db 86 //Read firmware version : FIXME
donatien 0:b802fc31f1db 87
donatien 0:b802fc31f1db 88 zg_register_write(ZG_REG_SYSINFO_INDEX, 0);
donatien 0:b802fc31f1db 89
donatien 0:b802fc31f1db 90 sys_version = zg_register_read(ZG_REG_SYSINFO) << 8;
donatien 0:b802fc31f1db 91 sys_version |= zg_register_read(ZG_REG_SYSINFO) & 0xFF;
donatien 0:b802fc31f1db 92
donatien 0:b802fc31f1db 93 DBG("\r\nSystem Version : %04x\r\n", sys_version);
donatien 0:b802fc31f1db 94
donatien 0:b802fc31f1db 95 DBG("\r\nSetup region\r\n");
donatien 0:b802fc31f1db 96 //Setup region
donatien 0:b802fc31f1db 97 fifo_buf[0] = ZG_REGION;
donatien 0:b802fc31f1db 98 zg_mgmt_set_param(ZG_FIFO_MGMT_PARM_REGION, fifo_buf, 1);
donatien 0:b802fc31f1db 99
donatien 0:b802fc31f1db 100 while( zg_mgmt_is_busy() )
donatien 0:b802fc31f1db 101 {
donatien 0:b802fc31f1db 102 zg_process();
donatien 0:b802fc31f1db 103 }
donatien 0:b802fc31f1db 104
donatien 0:b802fc31f1db 105 return ZG_OK;
donatien 0:b802fc31f1db 106 }
donatien 0:b802fc31f1db 107
donatien 0:b802fc31f1db 108 void zg_on_data_attach( void (*on_data)() )
donatien 0:b802fc31f1db 109 {
donatien 0:b802fc31f1db 110
donatien 0:b802fc31f1db 111 }
donatien 0:b802fc31f1db 112
donatien 0:b802fc31f1db 113 void zg_process() //Must be called regularly by user
donatien 0:b802fc31f1db 114 {
donatien 0:b802fc31f1db 115 if( int_raised )
donatien 0:b802fc31f1db 116 {
donatien 0:b802fc31f1db 117 //DBG("\r\nProcessing int\r\n");
donatien 0:b802fc31f1db 118 zg_int_process();
donatien 0:b802fc31f1db 119 int_raised = false;
donatien 0:b802fc31f1db 120 }
donatien 0:b802fc31f1db 121
donatien 0:b802fc31f1db 122 }
donatien 0:b802fc31f1db 123
donatien 0:b802fc31f1db 124 void zg_int_process()
donatien 0:b802fc31f1db 125 {
donatien 0:b802fc31f1db 126 uint32_t int_reg;
donatien 0:b802fc31f1db 127 int fifo;
donatien 0:b802fc31f1db 128 int len;
donatien 0:b802fc31f1db 129
donatien 0:b802fc31f1db 130 byte type;
donatien 0:b802fc31f1db 131 byte subtype;
donatien 0:b802fc31f1db 132
donatien 0:b802fc31f1db 133 int_reg = zg_register_read(ZG_REG_INTF) & zg_register_read(ZG_REG_INTE); //Read Masked Interrupt reg
donatien 0:b802fc31f1db 134 if( int_reg & ZG_INT_MASK_F0 )
donatien 0:b802fc31f1db 135 {
donatien 0:b802fc31f1db 136 fifo = 0;
donatien 0:b802fc31f1db 137 }
donatien 0:b802fc31f1db 138 else if( int_reg & ZG_INT_MASK_F1 )
donatien 0:b802fc31f1db 139 {
donatien 0:b802fc31f1db 140 fifo = 1;
donatien 0:b802fc31f1db 141 }
donatien 0:b802fc31f1db 142 else
donatien 0:b802fc31f1db 143 {
donatien 0:b802fc31f1db 144 return;
donatien 0:b802fc31f1db 145 }
donatien 0:b802fc31f1db 146
donatien 0:b802fc31f1db 147 zg_register_write(ZG_REG_INTF, ZG_INT_MASK_F(fifo)); //Select that FIFO ?
donatien 0:b802fc31f1db 148
donatien 0:b802fc31f1db 149 len = zg_register_read(ZG_REG_F_LEN(fifo)) & 0xFFF; //Only 3 lower level bytes represent length
donatien 0:b802fc31f1db 150
donatien 0:b802fc31f1db 151 zg_fifo_read(ZG_FIFO_ANY, &type, &subtype, fifo_buf, len);
donatien 0:b802fc31f1db 152
donatien 0:b802fc31f1db 153 //Dispatch this packet
donatien 0:b802fc31f1db 154
donatien 0:b802fc31f1db 155 switch( type )
donatien 0:b802fc31f1db 156 {
donatien 0:b802fc31f1db 157 case ZG_FIFO_RD_TXD_ACK:
donatien 0:b802fc31f1db 158 //DBG("\r\nTX ACK\r\n");
donatien 0:b802fc31f1db 159 //Packet has been transmitted, we can send another one
donatien 0:b802fc31f1db 160 tx_pending = false;
donatien 0:b802fc31f1db 161 break;
donatien 0:b802fc31f1db 162 case ZG_FIFO_RD_RXD_AVL:
donatien 0:b802fc31f1db 163 //DBG("\r\nRX AVL\r\n");
donatien 0:b802fc31f1db 164 //Received a packet, process it
donatien 0:b802fc31f1db 165 zg_on_input(fifo_buf, len); //On reception of a ZG frame : convert into Eth frame & call zg_input
donatien 0:b802fc31f1db 166 break;
donatien 0:b802fc31f1db 167 case ZG_FIFO_RD_MGMT_AVL:
donatien 0:b802fc31f1db 168 zg_on_mgmt_avl(subtype, fifo_buf, len);
donatien 0:b802fc31f1db 169 mgmt_busy = false; //We can now do another mgmt req
donatien 0:b802fc31f1db 170 break;
donatien 0:b802fc31f1db 171 case ZG_FIFO_RD_MGMT_EVT:
donatien 0:b802fc31f1db 172 zg_on_mgmt_evt(subtype, fifo_buf, len);
donatien 0:b802fc31f1db 173 break;
donatien 0:b802fc31f1db 174 default:
donatien 0:b802fc31f1db 175 DBG("\r\nInt processed with type %d\r\n", type);
donatien 0:b802fc31f1db 176 //Unknown type
donatien 0:b802fc31f1db 177 return;
donatien 0:b802fc31f1db 178 }
donatien 0:b802fc31f1db 179
donatien 0:b802fc31f1db 180 }
donatien 0:b802fc31f1db 181
donatien 0:b802fc31f1db 182 bool zg_mgmt_is_busy()
donatien 0:b802fc31f1db 183 {
donatien 0:b802fc31f1db 184 return mgmt_busy;
donatien 0:b802fc31f1db 185 }
donatien 0:b802fc31f1db 186
donatien 0:b802fc31f1db 187 void zg_mgmt_req(byte subtype, byte* buf, int len, bool close /*= true*/)
donatien 0:b802fc31f1db 188 {
donatien 0:b802fc31f1db 189 zg_fifo_write( ZG_FIFO_MGMT, ZG_FIFO_WR_MGMT_REQ, subtype, buf, len, true, close);
donatien 0:b802fc31f1db 190 mgmt_busy = true;
donatien 0:b802fc31f1db 191 }
donatien 0:b802fc31f1db 192
donatien 0:b802fc31f1db 193 void zg_mgmt_data(byte* buf, int len, bool close /*= true*/)
donatien 0:b802fc31f1db 194 {
donatien 0:b802fc31f1db 195 zg_fifo_write( ZG_FIFO_MGMT, ZG_FIFO_WR_MGMT_REQ, 0/*subtype: do not care*/, buf, len, false, close);
donatien 0:b802fc31f1db 196 }
donatien 0:b802fc31f1db 197
donatien 0:b802fc31f1db 198 void zg_mgmt_get_param(byte param)
donatien 0:b802fc31f1db 199 {
donatien 0:b802fc31f1db 200 head_buf[0] = 0;
donatien 0:b802fc31f1db 201 head_buf[1] = param;
donatien 0:b802fc31f1db 202 zg_mgmt_req( ZG_FIFO_MGMT_PARM_GET, head_buf, 2 );
donatien 0:b802fc31f1db 203 current_mgmt_param = param;
donatien 0:b802fc31f1db 204 }
donatien 0:b802fc31f1db 205
donatien 0:b802fc31f1db 206 void zg_mgmt_set_param(byte param, byte* buf, int len)
donatien 0:b802fc31f1db 207 {
donatien 0:b802fc31f1db 208 head_buf[0] = 0;
donatien 0:b802fc31f1db 209 head_buf[1] = param;
donatien 0:b802fc31f1db 210 zg_mgmt_req( ZG_FIFO_MGMT_PARM_SET, head_buf, 2, false );
donatien 0:b802fc31f1db 211 zg_mgmt_data( buf, len );
donatien 0:b802fc31f1db 212 current_mgmt_param = param;
donatien 0:b802fc31f1db 213 }
donatien 0:b802fc31f1db 214
donatien 0:b802fc31f1db 215 void zg_on_mgmt_avl(byte subtype, byte* buf, int len) //Data is available
donatien 0:b802fc31f1db 216 {
donatien 0:b802fc31f1db 217 DBG("\r\nManagement result, subtype %d\r\n", subtype);
donatien 0:b802fc31f1db 218 switch(subtype)
donatien 0:b802fc31f1db 219 {
donatien 0:b802fc31f1db 220 case ZG_FIFO_MGMT_SCAN: //Scan results
donatien 0:b802fc31f1db 221 zg_on_scan_results(buf, len);
donatien 0:b802fc31f1db 222 break;
donatien 0:b802fc31f1db 223
donatien 0:b802fc31f1db 224 case ZG_FIFO_MGMT_PSK_CALC: //Compute PSK Key
donatien 0:b802fc31f1db 225 zg_on_psk_key(buf, len);
donatien 0:b802fc31f1db 226 break;
donatien 0:b802fc31f1db 227 case ZG_FIFO_MGMT_PMK_KEY:
donatien 0:b802fc31f1db 228 break;
donatien 0:b802fc31f1db 229 case ZG_FIFO_MGMT_WEP_KEY:
donatien 0:b802fc31f1db 230 break;
donatien 0:b802fc31f1db 231
donatien 0:b802fc31f1db 232 case ZG_FIFO_MGMT_PARM_SET:
donatien 0:b802fc31f1db 233 DBG("\r\nParam set\r\n");
donatien 0:b802fc31f1db 234 break;
donatien 0:b802fc31f1db 235 case ZG_FIFO_MGMT_PARM_GET:
donatien 0:b802fc31f1db 236 zg_on_mgmt_get_param(buf,len);
donatien 0:b802fc31f1db 237 break;
donatien 0:b802fc31f1db 238 case ZG_FIFO_MGMT_ADHOC:
donatien 0:b802fc31f1db 239 break;
donatien 0:b802fc31f1db 240 case ZG_FIFO_MGMT_CONNECT:
donatien 0:b802fc31f1db 241 DBG("\r\nConnect result %d, MAC status is %d\r\n", buf[0], buf[1]);
donatien 0:b802fc31f1db 242 zg_on_connect((zg_err)buf[0]);
donatien 0:b802fc31f1db 243 connected = true;
donatien 0:b802fc31f1db 244 break;
donatien 0:b802fc31f1db 245 case ZG_FIFO_MGMT_CONN_MGMT:
donatien 0:b802fc31f1db 246 break;
donatien 0:b802fc31f1db 247 default:
donatien 0:b802fc31f1db 248 break;
donatien 0:b802fc31f1db 249 }
donatien 0:b802fc31f1db 250 }
donatien 0:b802fc31f1db 251
donatien 0:b802fc31f1db 252 void zg_on_mgmt_evt(byte subtype, byte* buf, int len) //Management event
donatien 0:b802fc31f1db 253 {
donatien 0:b802fc31f1db 254 DBG("\r\nManagement event, subtype %d\r\n", subtype);
donatien 0:b802fc31f1db 255 switch(subtype)
donatien 0:b802fc31f1db 256 {
donatien 0:b802fc31f1db 257 case ZG_FIFO_MGMT_DISASSOC:
donatien 0:b802fc31f1db 258 case ZG_FIFO_MGMT_DEAUTH:
donatien 0:b802fc31f1db 259 DBG("\r\nDisconnected\r\n");
donatien 0:b802fc31f1db 260 connected = false;
donatien 0:b802fc31f1db 261 break;
donatien 0:b802fc31f1db 262 case ZG_FIFO_MGMT_CONN:
donatien 0:b802fc31f1db 263 DBG("\r\nConnection status %d\r\n", DTOHS( *((word*)&buf[0]) ) );
donatien 0:b802fc31f1db 264 break;
donatien 0:b802fc31f1db 265
donatien 0:b802fc31f1db 266 default:
donatien 0:b802fc31f1db 267 break;
donatien 0:b802fc31f1db 268 }
donatien 0:b802fc31f1db 269 }
donatien 0:b802fc31f1db 270
donatien 0:b802fc31f1db 271 void zg_on_mgmt_get_param(byte* buf, int len)
donatien 0:b802fc31f1db 272 {
donatien 0:b802fc31f1db 273 if(buf[0] != 1 /*Success*/)
donatien 0:b802fc31f1db 274 {
donatien 0:b802fc31f1db 275 return;
donatien 0:b802fc31f1db 276 }
donatien 0:b802fc31f1db 277 buf+=4; //4-byte header
donatien 0:b802fc31f1db 278 len-=4;
donatien 0:b802fc31f1db 279 switch(current_mgmt_param)
donatien 0:b802fc31f1db 280 {
donatien 0:b802fc31f1db 281 case ZG_FIFO_MGMT_PARM_MACAD: //6 bytes len
donatien 0:b802fc31f1db 282 memcpy((void*)&zg_data.mac_addr, (void*)buf, ZG_MACADDR_LEN);
donatien 0:b802fc31f1db 283 zg_data_mask.mac_addr = true;
donatien 0:b802fc31f1db 284 DBG("\r\nHW Addr is : %02x:%02x:%02x:%02x:%02x:%02x.\r\n",
donatien 0:b802fc31f1db 285 zg_data.mac_addr[0], zg_data.mac_addr[1], zg_data.mac_addr[2],
donatien 0:b802fc31f1db 286 zg_data.mac_addr[3], zg_data.mac_addr[4], zg_data.mac_addr[5]);
donatien 0:b802fc31f1db 287 break;
donatien 0:b802fc31f1db 288 case ZG_FIFO_MGMT_PARM_SYSV: //2 bytes len
donatien 0:b802fc31f1db 289 memcpy((void*)&zg_data.sys_version, (void*)buf, 2);
donatien 0:b802fc31f1db 290 DBG("\r\nSys version: ROM: %02x; Patch: %02x\r\n",
donatien 0:b802fc31f1db 291 zg_data.sys_version.rom, zg_data.sys_version.revision);
donatien 0:b802fc31f1db 292 zg_data_mask.sys_version = true;
donatien 0:b802fc31f1db 293 break;
donatien 0:b802fc31f1db 294 case ZG_FIFO_MGMT_PARM_REGION:
donatien 0:b802fc31f1db 295 DBG("\r\nRegion %d\r\n", buf[0]);
donatien 0:b802fc31f1db 296 break;
donatien 0:b802fc31f1db 297 default:
donatien 0:b802fc31f1db 298 break;
donatien 0:b802fc31f1db 299 }
donatien 0:b802fc31f1db 300 current_mgmt_param = 0;
donatien 0:b802fc31f1db 301 }
donatien 0:b802fc31f1db 302
donatien 0:b802fc31f1db 303 //uint32_t zg_fifo_room();
donatien 0:b802fc31f1db 304
donatien 0:b802fc31f1db 305 void zg_on_int() //On data available interrupt
donatien 0:b802fc31f1db 306 {
donatien 0:b802fc31f1db 307 int_raised = true;
donatien 0:b802fc31f1db 308 }
donatien 0:b802fc31f1db 309
donatien 0:b802fc31f1db 310 //Useful to be split in several function because Lwip stores buffers in chunks
donatien 0:b802fc31f1db 311 void zg_send_start()
donatien 0:b802fc31f1db 312 {
donatien 0:b802fc31f1db 313 tx_pending = true;
donatien 0:b802fc31f1db 314 zg_fifo_write( ZG_FIFO_DATA, ZG_FIFO_WR_TXD_REQ, ZG_FIFO_TXD_STD, NULL, 0, true, false ); //Open fifo but does not close it
donatien 0:b802fc31f1db 315 }
donatien 0:b802fc31f1db 316
donatien 0:b802fc31f1db 317 void zg_send(byte* buf, int len)
donatien 0:b802fc31f1db 318 {
donatien 0:b802fc31f1db 319 zg_fifo_write( ZG_FIFO_DATA, ZG_FIFO_WR_TXD_REQ, ZG_FIFO_TXD_STD, buf, len, false, false );
donatien 0:b802fc31f1db 320 }
donatien 0:b802fc31f1db 321
donatien 0:b802fc31f1db 322 void zg_send_end()
donatien 0:b802fc31f1db 323 {
donatien 0:b802fc31f1db 324 zg_fifo_write( ZG_FIFO_DATA, ZG_FIFO_WR_TXD_REQ, ZG_FIFO_TXD_STD, NULL, 0, false, true ); //Close fifo
donatien 0:b802fc31f1db 325 }
donatien 0:b802fc31f1db 326
donatien 0:b802fc31f1db 327 bool zg_send_is_busy()
donatien 0:b802fc31f1db 328 {
donatien 0:b802fc31f1db 329 return tx_pending;
donatien 0:b802fc31f1db 330 }
donatien 0:b802fc31f1db 331
donatien 0:b802fc31f1db 332 #endif