?? wlan_phoenix.c
字號:
//************************************************************************************************
//* WLAN PHOENIX DRIVER
//* LAST UPDATED 08/09/2008
//* FIRMWARE BY FRED EADY FOR NUTS AND VOLTS MAGAZINE's DESIGN CYCLE
//* CHANGES/ADDITIONS
//* 01/10/05 in wr_cf_data changed wr_cf_io16s to wr_cf_io16
//* 04/01/05 added WAIT input at RG4..Grounded CSEL at CF connector
//* 04/15/05 fixed arp response bap_write changed +8 to +16 to pick up 12 bytes of source/dest mac addr length and 4 bytes of data length
//* 04/15/05 added code to buffer_alloc_event_handler to handle possible new reclaimed FID
//* 04/15/05 added WEP capability
//* 04/15/05 changed fidrid buffer size to 256
//* 08/06/08 changed flags to structure format
//* 08/09/08 reworked the application to send 8-byte udp packet
//************************************************************************************************
//* THIS VERSION --
//* * NO WEP
//* * PARSES FOR COR ADDR
//* * DOES NOT CREATE CIS DUMP FOR USE WITHIN MPLAB AS DESCRIBED IN THE BOOK
//* * IP ADDRESS = 192.168.1.150
//* * SSID = PHOENIX_NETWORK
//************************************************************************************************
#include <pic18.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <htc.h>
#include "wlan_phoenix.h"
// PIC18LF6722 FUSES
__CONFIG(1,FCMDIS & IESODIS & HS);
__CONFIG(2,BORDIS & PWRTDIS & WDTDIS);
__CONFIG(3,LPT1DIS & MCLREN);
__CONFIG(4,DEBUGEN & LVPDIS & STVREN & XINSTDIS);
__CONFIG(5,UNPROTECT);
__CONFIG(6,WRTEN);
__IDLOC(0824);
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);
#define esc 0x1B
#if (ad802_11Header)
#define TxControl 0x0C // Transmit frame structure TxControl field (use 802.11 Frame Structure header fields, generate a
// TxExc event if frame transmit problem, don't generate a TxExc event if the transmit is successful)
#define txdestaddr_offset 30 // Bytes from beginning of transmit frame structure to destination Ethernet MAC address
#define txbssid_offset 18 // Bytes from beginning of transmit frame structure to BSS ID
#define datalength_offset 44 // Bytes from beginning of transmit frame structure to to Length field
#define rxsourceaddr_offset 30 // For receive only
#define rxdestaddr_offset 18 // Bytes from beginning of receive frame structure to destination Ethernet MAC address
#define rxbssid_offset 24 // Bytes from beginning of receive frame structure to BSS ID
#else
#define TxControl 0x04 // Transmit frame structure TxControl field (use 802.3 Frame Structure header fields, generate a
// TxExc event if frame transmit problem, don't generate a TxExc event if the transmit is successful)
#define txbssid_offset 18 // Bytes from beginning of transmit frame structure to BSS ID
#define txdestaddr_offset 46
#define txsourceaddr_offset 52
#define rxdestaddr_offset 46
#define rxsourceaddr_offset 52
#define datalength_offset 58 // Bytes from beginning of transmit frame structure to 802.3 byte-swapped format length field
#endif
#define rxdatalength_offset 44 // use the length from the 802.11 part of the header, as it
#define rxdata_offset 60
#define txdata_offset 60
#define framestructure_size 46 // Number of bytes in Compact Flash data Frame Structure (including the unused 802.11 header bytes, but not the 802.3 header)
#define ethheader_size 14 // Number of bytes in the Compact Flash data Frame Structure 802.3 header
#define mac_length 6
#define snap_length 3
#define eth_mtu_buffer_size 1500
#define txframe_buffer_size eth_mtu_buffer_size+framestructure_size+ethheader_size
#define fidrid_buffer_size 256
unsigned int fidrid_buffer[fidrid_buffer_size];
#define rxframeheader_buffer_size framestructure_size+ethheader_size
char rxframeheader_buffer[rxframeheader_buffer_size];
char tple_data[1024];
char comframe_buffer[60];
unsigned int TxFID_buffers[3];
char free_TxFIDs;
unsigned int RxFID,i;
//char tempstring[];
char aux_data[2],macaddrc[6],bssidc[6],remotemacaddrc[6];
unsigned int macaddri[3],ipaddri[2],bssidi[3],remotemacaddri[3],remoteipaddri[2];
unsigned int *addr,cmd_data,cor_addr;
char byte_read,data_H,data_L,cntrc,byteout;
unsigned int txlen,rxlen,chksum16,hdrlen,tcplen,tcpdatalen_in,cntri;
unsigned int tcpdatalen_out,ISN,portaddr,ip_packet_len;
unsigned long hdr_chksum,my_seqnum,client_seqnum,incoming_ack,expected_ack;
char error;
const char ssid[] = "PHOENIX_NETWORK";
//const char wepkey[] = {0x46,0xFA,0xF1,0x7C,0x83,0x99,0xC7,0x6B,0x85,0x81,0xEE,0x48,0x8A,0x00};
const char wepkey[] = {0x80,0x1E,0x6F,0x12,0xBB,0x5C,0xCA,0x53,0x50,0xAC,0xA4,0x4B,0x0A,0x00};
//******************************************************************
//* IP ADDRESS DEFINITION
//* This is the Ethernet Module IP address.
//* You may change this to any valid address.
//******************************************************************
char ipaddrc[4]; // = {192,168,1,150};
char remoteipaddrc[4]; // = {192,168,1,100};
//******************************************************************
//* Function Declarations
//******************************************************************
void interrupt USART(void);
void config_ip(void);
void init_USART1(void);
unsigned char CharInQueue(void);
void putch(unsigned char c);
int recvchar(void);
int sendchar(int data);
char phoenix_cfg(unsigned int cmd);
void wr_cf_data(char bapnum,char* buffer,unsigned int count);
void rd_cis(void);
void init_nic(void);
void wr_cf_addr(unsigned int addr);
void wr_cf_reg(unsigned int data, unsigned int reg_addr);
char rd_cf_reg(unsigned int reg_addr);
void wr_cf_io16(unsigned int data16,unsigned int addr);
void wr_cf_io16s(unsigned int data16,unsigned int addr);
unsigned int rd_cf_io16(unsigned int addr);
unsigned int rd_cf_io16s(unsigned int addr);
char send_command(unsigned int cmd, unsigned int parm0);
char rid_write(unsigned int fidrid, unsigned int* buffer, unsigned int count);
char bap_write(unsigned int fidrid,unsigned int offset,char* buffer, unsigned int count);
void rid_string_write(unsigned int fidrid, unsigned int ridlen, unsigned int* buffer);
char fid_read(unsigned int fid);
char rid_read(unsigned int rid);
void create_comframestructure(unsigned int len);
char allocate_buffer(unsigned int bufferlen);
char allocate_xmit_buffers(void);
unsigned int get_free_TxFID(void);
unsigned int swapbytes(unsigned int val);
void do_event_housekeeping(void);
void setipaddrs(void);
void cksum(void);
char echo_packet(void);
//void Delay_ms(unsigned int mticks);
char arp(void);
char arp_request(void);
void icmp(void);
void udp(void);
void tcp(void);
void send_tcp_packet(void);
void init_udp(void);
char send_udp(void);
char send_udp_discard(void);
void application_code(void);
//void assemble_ack(void);
void delay_ms(char delay);
char phoenix_max_datalen(unsigned int max_len);
void get_octet(void);
void get_frame(void);
void cls(void);
void display_menu(void);
unsigned int msecs;
char hours, mins, secs;
char chr_count,bytein;
char eeaddr,send_secs;
// ip_address_3.ip_address_2.ip_address_1.ip_address_0
// 192 .168 .1 .150
char ee_parms[14];
#define eedata_saved 0x00
#define local_ipaddr 0x01
#define local_ipaddr3 0x01
#define local_ipaddr2 0x02
#define local_ipaddr1 0x03
#define local_ipaddr0 0x04
#define rmt_ipaddr 0x05
#define rmt_ipaddr3 0x05
#define rmt_ipaddr2 0x06
#define rmt_ipaddr1 0x07
#define rmt_ipaddr0 0x08
#define loopsecs 0x09
#define local_udpaddr_hi 0x0A
#define local_udpaddr_lo 0x0B
#define remote_udpaddr_hi 0x0C
#define remote_udpaddr_lo 0x0D
#define eeparm_end 0x0E
char ipentry[3];
#define chr_3 0x00
#define chr_2 0x01
#define chr_1 0x02
//******************************************************************
//* Flags
//******************************************************************
typedef struct
{
char synflag:1;
char finflag:1;
char entryflag:1;
char arpflag:1;
char cisflag:1;
char validchar:1;
char exitflag:1;
char eedataflag:1;
} SFLAGS;
SFLAGS flags;
//******************************************************************
//* Macros
//******************************************************************
#define bitset(var, bitno) ((var) |= 1 << (bitno))
#define bitclr(var, bitno) ((var) &= ~(1 << (bitno)))
#define make8(var,offset) ((unsigned int)var >> (offset * 8)) & 0x00FF
#define make16(varhigh,varlow) (((unsigned int)varhigh & 0xFF)* 0x100) + ((unsigned int)varlow & 0x00FF)
#define make32(var1,var2,var3,var4) \
((unsigned long)var1<<24)+((unsigned long)var2<<16)+ \
((unsigned long)var3<<8)+((unsigned long)var4)
#define make32i(var1,var2) ((unsigned long)var1<<16)+((unsigned long)var2)
//******************************************************************
//* CIS
//******************************************************************
#define io_en_mask 0x01
#define rd_code_tuple rd_cf_reg
#define rd_link_tuple rd_cf_reg
#define rd_tuple_data rd_cf_reg
#define rd_cor_data rd_cf_reg
#define wr_cor_data wr_cf_reg
//******************************************************************
//* PORT Definitions
//******************************************************************
#define AOUT LATA
#define BOPEN PORTB
#define COPEN PORTC
#define data_in PORTD
#define data_out LATD
#define PCTL LATF
#define addr_hi LATG
#define addr_lo LATE
//******************************************************************
//* CF I/O Definitions
//******************************************************************
#define OE 0x01
#define IORD 0x02
#define REG 0x04
#define NC8 0x08
#define RSET 0x10
#define WE 0x40
#define IOWR 0x80
#define set_OE PCTL |= OE
#define clr_OE PCTL &= ~OE
#define set_IORD PCTL |= IORD
#define clr_IORD PCTL &= ~IORD
#define set_IOWR PCTL |= IOWR
#define clr_IOWR PCTL &= ~IOWR
#define set_WE PCTL |= WE
#define clr_WE PCTL &= ~WE
#define set_RSET PCTL |= RSET
#define clr_RSET PCTL &= ~RSET
#define set_REG PCTL |= REG
#define clr_REG PCTL &= ~REG
#define IREQ RF5
//******************************************************************
//* PORT TRIS Definitions
//******************************************************************
#define TO_NIC TRISD = 0x00
#define FROM_NIC TRISD = 0xFF
#define SETUP_A TRISA = 0xFF;
#define SETUP_C TRISC = 0x80;
#define SETUP_E TRISE = 0x00; \
LATE = 0x00;
#define SETUP_F TRISF = 0x28; \
LATF = 0xFB;
#define SETUP_G TRISG = 0x00; \
LATG = 0xE0;
//CE1 = 0;
//CE2 = 1;
#define BSS 0x01 //infrastructure network
#define IBSS 0x02 //ad-hoc network
#define SSID 0x03 //SSID for desired connection
#define MAX_DATALEN 0x04 //Set maximum data length
#define NIC_RATE 0x05 //Set NIC speeds
#define WEP_KEYID 0x06 //use WEB Key 0-3
#define WEP_KEY_64 0x07
#define WEP_KEY_128 0x08 //WEP key value
#define WEP_ON 0x09
#define WEP_OFF 0x0A
#define WEP_AUTH_SK 0x0B
#define WEP_AUTH_OS 0x0C
#define WEP_AUTH_ALL 0x0D
#define TIMER3ON TMR3ON = 1
#define TIMER3OFF TMR3ON = 0
#define disable_TMR3int TMR3IE = 0
#define enable_TMR3int TMR3IE = 1
#define disable_RXint RCIE = 0
#define enable_RXint RCIE = 1
#define enable_GLOBALint IPEN = 0; \
GIE = 1; \
PEIE = 1;
#define disable_GLOBALint IPEN = 0; \
GIE = 0; \
PEIE = 0;
#define BAUD1 57600 //desired baud rate
#define FOSC 20000000 //oscillator frequency
#define DIVIDER1 ((unsigned int)(FOSC/(16 * BAUD1) -1))
//1,2,4,8,16,32,64,128 or 256 bytes
#define USART_RX_BUFFER_SIZE 16
#define USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE - 1 )
// 1,2,4,8,16,32,64,128 or 256 bytes
#define USART_TX_BUFFER_SIZE 16
#define USART_TX_BUFFER_MASK ( USART_TX_BUFFER_SIZE - 1 )
unsigned char USART_RxBuf[USART_RX_BUFFER_SIZE],USART_TxBuf[USART_TX_BUFFER_SIZE];
unsigned char USART_TxHead,USART_TxTail,USART_RxHead,USART_RxTail;
void delay_ms(char delay)
{
char a,b,c;
c = delay;
do{
a=0x06;
do
{
b=0x00;
while(--b);
}while(--a);
b=0x7B;
while(--b);
}while(--c);
}
unsigned int swapbytes(unsigned int val)
{
char temphi,templo;
temphi = make8(val,1);
templo = make8(val,0);
return(make16(templo,temphi));
}
void dump(unsigned int FID)
{
unsigned int temp,i;
temp = rd_cf_io16(Offset0_Register);
if(!(temp & BAP0Busy_Bit_Mask))
{
wr_cf_io16(FID,Select0_Register);
wr_cf_io16(0,Offset0_Register);
do{
temp = rd_cf_io16(Offset0_Register);
}while(temp & BAP0Busy_Bit_Mask);
for(i=0;i<120;++i)
fidrid_buffer[i] = rd_cf_io16(Data0_Register);
}
}
void putch(unsigned char c)
{
while(!TRMT) // TRMT1 is set when TSR is empty
continue;
TXREG1 = c; // load the register
}
//******************************************************************
//* Init USART Function
//******************************************************************
void init_USART1(void)
{
SPBRG1 = DIVIDER1; //load baud rate divisor
TRISC7 = 1; //receive pin
TRISC6 = 0; //transmit pin
TXSTA1 = 0x04; //high speed baud rate
RCSTA1 = 0x80; //enable serial port and serial port pins
USART_RxTail = 0x00; //flush receive buffer
USART_RxHead = 0x00;
USART_TxTail = 0x00; //flush transmit buffer
USART_TxHead = 0x00;
RC1IP = 1; //receive interrupt = high priority
TX1IP = 1; //transmit interrupt = high priority
RC1IE = 1; //enable receive interrupt
PEIE = 1; //enable all unmasked peripheral interrupts
GIE = 1; //enable all unmasked interrupts
CREN = 1; //enable USART1 receiver
TX1IE = 0; //disable USART1 transmit interrupt
TXEN = 1; //transmitter enabled
}
void interrupt USART(void)
{
unsigned char data,tmphead,tmptail;
if((TMR3IF && TMR3IE))
{
TMR3IF = 0;
TMR3H = 0xEC;
TMR3L = 0x77;
if(++msecs == 1000)
{
msecs = 0;
++secs;
++send_secs;
}
if(secs == 60)
{
secs = 0;
++mins;
}
if(mins == 60)
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -