Subversion Repositories HomeAutomation

Rev

Rev 363 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. /*********************************************************************
  2.  *
  3.  *                  Microchip TCP/IP Stack Definitions
  4.  *
  5.  *********************************************************************
  6.  * FileName:        StackTsk.h
  7.  * Dependencies:    Compiler.h
  8.  * Processor:       PIC18, PIC24F, PIC24H, dsPIC30F, dsPIC33F
  9.  * Complier:        Microchip C18 v3.02 or higher
  10.  *                  Microchip C30 v2.01 or higher
  11.  * Company:         Microchip Technology, Inc.
  12.  *
  13.  * Software License Agreement
  14.  *
  15.  * This software is owned by Microchip Technology Inc. ("Microchip")
  16.  * and is supplied to you for use exclusively as described in the
  17.  * associated software agreement.  This software is protected by
  18.  * software and other intellectual property laws.  Any use in
  19.  * violation of the software license may subject the user to criminal
  20.  * sanctions as well as civil liability.  Copyright 2006 Microchip
  21.  * Technology Inc.  All rights reserved.
  22.  *
  23.  * This software is provided "AS IS."  MICROCHIP DISCLAIMS ALL
  24.  * WARRANTIES, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, NOT LIMITED
  25.  * TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
  26.  * INFRINGEMENT.  Microchip shall in no event be liable for special,
  27.  * incidental, or consequential damages.
  28.  *
  29.  *
  30.  * Author               Date    Comment
  31.  *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  32.  * Nilesh Rajbharti     8/10/01 Original        (Rev 1.0)
  33.  * Nilesh Rajbharti     2/9/02  Cleanup
  34.  * Nilesh Rajbharti     5/22/02 Rev 2.0 (See version.log for detail)
  35.  * Nilesh Rajbharti     8/7/03  Rev 2.21 - TFTP Client addition
  36.  * Howard Schlunder     9/30/04 Added MCHP_MAC, MAC_POWER_ON_TEST,
  37.                                 EEPROM_BUFFER_SIZE, USE_LCD
  38.  * Howard Schlunder     8/09/06 Removed MCHP_MAC, added STACK_USE_NBNS,
  39.  *                              STACK_USE_DNS, and STACK_USE_GENERIC_TCP_EXAMPLE
  40.  ********************************************************************/
  41. #ifndef STACK_TSK_H
  42. #define STACK_TSK_H
  43.  
  44. #include "..\Include\GenericTypeDefs.h"
  45. #include "..\Include\Compiler.h"
  46.  
  47. /*
  48.  * This value is used by TCP to implement timeout actions.
  49.  * If SNMP module is in use, this value should be 100 as required
  50.  * by SNMP protocol unless main application is providing separate
  51.  * tick which 10mS.
  52.  */
  53. #define TICKS_PER_SECOND               (100)        // 10ms
  54.  
  55. #if (TICKS_PER_SECOND < 10 || TICKS_PER_SECOND > 255)
  56. #error Invalid TICKS_PER_SECONDS specified.
  57. #endif
  58.  
  59. /*
  60.  * Manually select prescale value to achieve necessary tick period
  61.  * for a given clock frequency.
  62.  */
  63. #define TICK_PRESCALE_VALUE             (256)
  64.  
  65. #if (TICK_PRESCALE_VALUE != 2 && \
  66.      TICK_PRESCALE_VALUE != 4 && \
  67.      TICK_PRESCALE_VALUE != 8 && \
  68.      TICK_PRESCALE_VALUE != 16 && \
  69.      TICK_PRESCALE_VALUE != 32 && \
  70.      TICK_PRESCALE_VALUE != 64 && \
  71.      TICK_PRESCALE_VALUE != 128 && \
  72.      TICK_PRESCALE_VALUE != 256 )
  73. #error Invalid TICK_PRESCALE_VALUE specified.
  74. #endif
  75.  
  76. #if defined(WIN32)
  77.     #undef TICKS_PER_SECOND
  78.     #define TICKS_PER_SECOND        (1)
  79. #endif
  80.  
  81.  
  82. /*
  83.  * This value is specific to the Microchip Ethernet controllers.  
  84.  * If a different Ethernet controller is used, this define is not
  85.  * used.  If a Microchip controller is used and a self memory test
  86.  * should be done when the MACInit() function is called,
  87.  * uncomment this define.  The test requires ~512 bytes of
  88.  * program memory.
  89.  */
  90. //#define MAC_POWER_ON_TEST
  91.  
  92.  
  93. /*
  94.  * This value is specific to the Microchip Ethernet controllers.  
  95.  * If a different Ethernet controller is used, this define is not
  96.  * used.  Ideally, when MAC_FILTER_BROADCASTS is defined, all
  97.  * broadcast packets that are received would be discarded by the
  98.  * hardware, except for ARP requests for our IP address.  This could
  99.  * be accomplished by filtering all broadcasts, but allowing the ARPs
  100.  * using the patter match filter.  The code for this feature has been
  101.  * partially implemented, but it is not complete nor tested, so this
  102.  * option should remain unused in this stack version.
  103.  */
  104. //#define MAC_FILTER_BROADCASTS
  105.  
  106.  
  107. /*
  108.  * SPI Serial EEPROM buffer size.  To enhance performance while
  109.  * cooperatively sharing the SPI bus with other peripherals, bytes
  110.  * read and written to the memory are locally buffered.  This
  111.  * parameter has no effect if spieeprom.c is not included in the
  112.  * project.  Legal sizes are 1 to the EEPROM page size.
  113.  */
  114. #define EEPROM_BUFFER_SIZE              (12)
  115.  
  116.  
  117. /*
  118.  * This value is for Microchip 24LC256 - 256kb serial EEPROM
  119.  */
  120. #define EEPROM_CONTROL                  (0xa0)
  121.  
  122.  
  123. /*
  124.  * Number of bytes to be reserved before MPFS storage is to start.
  125.  *
  126.  * These bytes host application configurations such as IP Address,
  127.  * MAC Address, and any other required variables.
  128.  *
  129.  * After making any change to this variable, MPFS.exe must be
  130.  * executed with correct block size.
  131.  * See MPFS.exe help message by executing MPFS /?
  132.  */
  133. #define MPFS_RESERVE_BLOCK              (64)
  134.  
  135.  
  136.  
  137. /*
  138.  * Modules to include in this project
  139.  * For demo purpose only, each sample project defines one or more
  140.  * of following defines in compiler command-line options. (See
  141.  * each MPLAB Project Node Properties under "Project->Edit Project" menu.
  142.  * In real applcation, user may want to define them here.
  143.  */
  144. #define STACK_USE_ICMP
  145. #define STACK_USE_HTTP_SERVER
  146. #define STACK_USE_SGP_SERVER
  147. #define STACK_USE_TIMESYNC
  148. //#define STACK_USE_SLIP        // Not currently supported
  149. //#define STACK_USE_IP_GLEANING
  150. //#define STACK_USE_DHCP
  151. //#define STACK_USE_SNMP_SERVER
  152. //#define STACK_USE_TFTP_CLIENT
  153. #define STACK_USE_DNS                   // Domain Name Service Client
  154. //#define STACK_USE_NBNS                    // NetBIOS Name Service Server
  155.  
  156. /*
  157.  * Following low level modules are automatically enabled/disabled based on high-level
  158.  * module selections.
  159.  * If you need them with your custom application, enable it here.
  160.  */
  161. //#define STACK_USE_TCP
  162. //#define STACK_USE_UDP
  163.  
  164. // Uncomment following line if SNMP TRAP support is required
  165. //#define SNMP_TRAP_DISABED
  166.  
  167. /*
  168.  * When SLIP is used, DHCP is not supported.
  169.  */
  170. #if defined(STACK_USE_SLIP)
  171. #undef STACK_USE_DHCP
  172. #endif
  173.  
  174.  
  175.  
  176. /*
  177.  * Comment following line if StackTsk should wait for acknowledgement
  178.  * from remote host before transmitting another packet.
  179.  * Commenting following line may reduce throughput.
  180.  */
  181. //#define TCP_NO_WAIT_FOR_ACK
  182.  
  183.  
  184. /*
  185.  * Uncomment following line if this stack will be used in CLIENT
  186.  * mode.  In CLIENT mode, some functions specific to client operation
  187.  * are enabled.
  188.  */
  189. //#define STACK_CLIENT_MODE
  190.  
  191.  
  192. /*
  193.  * If html pages are stored in internal program memory,
  194.  * uncomment MPFS_USE_PRGM and comment MPFS_USE_EEPROM
  195.  * If html pages are stored in external eeprom memory,
  196.  * comment MPFS_USE_PRGM and uncomment MPFS_USE_EEPROM
  197.  */
  198. //#define MPFS_USE_PGRM
  199. //#define MPFS_USE_EEPROM
  200.  
  201. #if defined(MPFS_USE_PGRM) && defined(MPFS_USE_EEPROM)
  202. #error Invalid MPFS Storage option specified.
  203. #endif
  204.  
  205. #if !defined(MPFS_USE_PGRM) && !defined(MPFS_USE_EEPROM)
  206. #error You have not specified MPFS storage option.
  207. #endif
  208.  
  209.  
  210. /*
  211.  * When HTTP is enabled, TCP must be enabled.
  212.  */
  213. #if defined(STACK_USE_HTTP_SERVER)
  214.     #if !defined(STACK_USE_TCP)
  215.         #define STACK_USE_TCP
  216.     #endif
  217. #endif
  218.  
  219. /*
  220.  * When FTP is enabled, TCP must be enabled.
  221.  */
  222. #if defined(STACK_USE_FTP_SERVER)
  223.     #if !defined(STACK_USE_TCP)
  224.         #define STACK_USE_TCP
  225.     #endif
  226. #endif
  227.  
  228.  
  229. #if (defined(STACK_USE_FTP_SERVER) || \
  230.      defined(STACK_USE_SNMP_SERVER) || \
  231.      defined(STACK_USE_DNS) || \
  232.      defined(STACK_USE_GENERIC_TCP_EXAMPLE) || \
  233.      defined(STACK_USE_TFTP_CLIENT) )
  234.     #if !defined(STACK_CLIENT_MODE)
  235.         #define STACK_CLIENT_MODE
  236.     #endif
  237. #endif
  238.  
  239. /*
  240.  * When DHCP is enabled, UDP must also be enabled.
  241.  */
  242. #if defined(STACK_USE_DHCP) || \
  243.     defined(STACK_USE_DNS) || \
  244.     defined(STACK_USE_NBNS) || \
  245.     defined(STACK_USE_SNMP_SERVER) || \
  246.     defined(STACK_USE_TFTP_CLIENT) || \
  247.     defined(STACK_USE_ANNOUNCE)
  248.     #if !defined(STACK_USE_UDP)
  249.         #define STACK_USE_UDP
  250.     #endif
  251. #endif
  252.  
  253. /*
  254.  * When IP Gleaning is enabled, ICMP must also be enabled.
  255.  */
  256. #if defined(STACK_USE_IP_GLEANING)
  257.     #if !defined(STACK_USE_ICMP)
  258.         #define STACK_USE_ICMP
  259.     #endif
  260. #endif
  261.  
  262.  
  263. /*
  264.  * DHCP requires unfragmented packet size of at least 328 bytes,
  265.  * and while in SLIP mode, our maximum packet size is less than
  266.  * 255.  Hence disallow DHCP module while SLIP is in use.
  267.  * If required, one can use DHCP while SLIP is in use by modifying
  268.  * C18 linker scipt file such that C18 compiler can allocate
  269.  * a static array larger than 255 bytes.
  270.  * Due to very specific application that would require this,
  271.  * sample stack does not provide such facility.  Interested users
  272.  * must do this on their own.
  273.  */
  274. #if defined(STACK_USE_SLIP)
  275.     #if defined(STACK_USE_DHCP)
  276.         #error DHCP cannot be used when SLIP is enabled.
  277.     #endif
  278. #endif
  279.  
  280.  
  281. //
  282. // Default Address information - If not found in data EEPROM.
  283. //
  284. #define MY_DEFAULT_HOST_NAME            "ETEMP"
  285.  
  286. #define MY_DEFAULT_MAC_BYTE1            (0x00)
  287. #define MY_DEFAULT_MAC_BYTE2            (0x10)
  288. #define MY_DEFAULT_MAC_BYTE3            (0xA7)
  289. #define MY_DEFAULT_MAC_BYTE4            (0x02)
  290. #define MY_DEFAULT_MAC_BYTE5            (0xF2)
  291. #define MY_DEFAULT_MAC_BYTE6            (0xBF)
  292.  
  293. #define MY_DEFAULT_IP_ADDR_BYTE1        (193)
  294. #define MY_DEFAULT_IP_ADDR_BYTE2        (11)
  295. #define MY_DEFAULT_IP_ADDR_BYTE3        (249)
  296. #define MY_DEFAULT_IP_ADDR_BYTE4        (228)
  297.  
  298. #define MY_DEFAULT_MASK_BYTE1           (255)
  299. #define MY_DEFAULT_MASK_BYTE2           (255)
  300. #define MY_DEFAULT_MASK_BYTE3           (255)
  301. #define MY_DEFAULT_MASK_BYTE4           (0)
  302.  
  303. #define MY_DEFAULT_GATE_BYTE1           MY_DEFAULT_IP_ADDR_BYTE1
  304. #define MY_DEFAULT_GATE_BYTE2           MY_DEFAULT_IP_ADDR_BYTE2
  305. #define MY_DEFAULT_GATE_BYTE3           MY_DEFAULT_IP_ADDR_BYTE3
  306. #define MY_DEFAULT_GATE_BYTE4           (1)
  307.  
  308. #define MY_DEFAULT_DNS_BYTE1            MY_DEFAULT_GATE_BYTE1
  309. #define MY_DEFAULT_DNS_BYTE2            MY_DEFAULT_GATE_BYTE2
  310. #define MY_DEFAULT_DNS_BYTE3            MY_DEFAULT_GATE_BYTE3
  311. #define MY_DEFAULT_DNS_BYTE4            MY_DEFAULT_GATE_BYTE4
  312.  
  313. /*
  314.  * TCP configurations
  315.  * To minmize page update, match number of sockets and
  316.  * HTTP connections with different page sources in a
  317.  * page.
  318.  * For example, if page contains reference to 3 more pages,
  319.  * browser may try to open 4 simultaneous HTTP connections,
  320.  * and to minimize browser delay, set HTTP connections to
  321.  * 4, MAX_SOCKETS to 4.
  322.  * If you are using other applications, you should
  323.  * keep at least one socket available for them.
  324.  */
  325.  
  326. // Maximum TCP sockets to be defined.
  327. // Note that each TCP socket consumes 38 bytes of RAM.
  328. #define MAX_SOCKETS         (6u)
  329.  
  330. // Maximum avaialble UDP Sockets
  331. #define MAX_UDP_SOCKETS     (4u)
  332.  
  333.  
  334. #if (MAX_SOCKETS <= 0 || MAX_SOCKETS > 255)
  335. #error Invalid MAX_SOCKETS value specified.
  336. #endif
  337.  
  338. #if (MAX_UDP_SOCKETS <= 0 || MAX_UDP_SOCKETS > 255 )
  339. #error Invlaid MAX_UDP_SOCKETS value specified
  340. #endif
  341.  
  342.  
  343. #if !defined(STACK_USE_SLIP)
  344.     // The MAC_TX_BUFFER_COUNT must be equal to MAX_SOCKETS + 1
  345.     // (for high priority messages), or else calls to TCPPut may
  346.     // fail when multiple TCP sockets have data pending in the
  347.     // output buffer that hasn't been acked.  Changing this value
  348.     // is recommended only if the rammifications of doing so are
  349.     // properly understood.  
  350.     #if defined(NON_MCHP_MAC)
  351.         #define MAC_TX_BUFFER_SIZE          (1024)
  352.         #define MAC_TX_BUFFER_COUNT         (1)
  353.     #else
  354.         #define MAC_TX_BUFFER_SIZE          (576)
  355.         #define MAC_TX_BUFFER_COUNT         (MAX_SOCKETS+1)
  356.     #endif
  357. #else
  358. /*
  359.  * For SLIP, there can only be one transmit and one receive buffer.
  360.  * Both buffer must fit in one bank.  If bigger buffer is required,
  361.  * you must manually locate tx and rx buffer in different bank
  362.  * or modify your linker script file to support arrays bigger than
  363.  * 256 bytes.
  364.  */
  365.     #define MAC_TX_BUFFER_SIZE          (250)
  366.     #define MAC_TX_BUFFER_COUNT         (1)
  367. #endif
  368. // Rests are Receive Buffers
  369.  
  370. #define MAC_RX_BUFFER_SIZE              (MAC_TX_BUFFER_SIZE)
  371.  
  372. #if (MAC_TX_BUFFER_SIZE <= 0 || MAC_TX_BUFFER_SIZE > 1500 )
  373. #error Invalid MAC_TX_BUFFER_SIZE value specified.
  374. #endif
  375.  
  376. #if ( (MAC_TX_BUFFER_SIZE * MAC_TX_BUFFER_COUNT) > (5* 1024) )
  377. #error Warning, receive buffer is small.  Excessive packet loss may occur.
  378. #endif
  379.  
  380. /*
  381.  * Maximum numbers of simultaneous HTTP connections allowed.
  382.  * Each connection consumes 10 bytes.
  383.  */
  384. #define MAX_HTTP_CONNECTIONS            (3u)
  385.  
  386. #if (MAX_HTTP_CONNECTIONS <= 0 || MAX_HTTP_CONNECTIONS > 255 )
  387. #error Invalid MAX_HTTP_CONNECTIONS value specified.
  388. #endif
  389.  
  390. #define AVAILABLE_SOCKETS (MAX_SOCKETS)
  391. #if defined(STACK_USE_HTTP_SERVER)
  392.     #define AVAILABLE_SOCKETS2 (AVAILABLE_SOCKETS - MAX_HTTP_CONNECTIONS)
  393. #else
  394.     #define AVAILABLE_SOCKETS2  (MAX_SOCKETS)
  395. #endif
  396.  
  397. /*
  398.  * When using FTP, you must have at least two sockets free
  399.  */
  400. #if defined(STACK_USE_FTP_SERVER)
  401.     #define AVAILABLE_SOCKETS3 (AVAILABLE_SOCKETS2 - 2)
  402. #else
  403.     #define AVAILABLE_SOCKETS3  (AVAILABLE_SOCKETS2)
  404. #endif
  405.  
  406. #if AVAILABLE_SOCKETS3 < 0 || AVAILABLE_SOCKETS3 > MAX_SOCKETS
  407.     #error MAX_SOCKETS is too low to accommodate MAX_HTTP_CONNECTIONS and/or STACK_USE_FTP_SERVER
  408.     #error Either increase MAX_SOCKETS in StackTsk.h or decrease module socket usage.
  409. #endif
  410.  
  411.  
  412. #define AVAILABLE_UDP_SOCKETS       (MAX_UDP_SOCKETS)
  413. #if defined(STACK_USE_DHCP)
  414.     #define AVAILABLE_UDP_SOCKETS2       (AVAILABLE_UDP_SOCKETS - 1)
  415. #else
  416.     #define AVAILABLE_UDP_SOCKETS2      AVAILABLE_UDP_SOCKETS
  417. #endif
  418.  
  419. #if defined(STACK_USE_SNMP_SERVER)
  420.     #define AVAILABLE_UDP_SOCKETS3      (AVAILABLE_UDP_SOCKETS2 - 1)
  421. #else
  422.     #define AVAILABLE_UDP_SOCKETS3      AVAILABLE_UDP_SOCKETS2
  423. #endif
  424.  
  425. #if defined(STACK_USE_TFTP_CLIENT)
  426.     #define AVAILABLE_UDP_SOCKETS4      (AVAILABLE_UDP_SOCKETS2)
  427. #else
  428.     #define AVAILABLE_UDP_SOCKETS4      AVAILABLE_UDP_SOCKETS3
  429. #endif
  430.  
  431.  
  432. #if AVAILABLE_UDP_SOCKETS4 < 0 || AVAILABLE_UDP_SOCKETS4 > MAX_UDP_SOCKETS
  433.     #error MAX_UDP_SOCKETS is too low to accommodate DHCP, SNMP, and/or TFTP client
  434.     #error Either increase MAX_UDP_SOCKETS in StackTsk.h or decrease module UDP socket usage.
  435. #endif
  436.  
  437.  
  438. typedef BYTE BUFFER;
  439.  
  440. typedef struct _MAC_ADDR
  441. {
  442.     BYTE v[6];
  443. } MAC_ADDR;
  444.  
  445. typedef union _IP_ADDR
  446. {
  447.     BYTE        v[4];
  448.     DWORD       Val;
  449. } IP_ADDR;
  450.  
  451.  
  452. typedef struct _NODE_INFO
  453. {
  454.     MAC_ADDR    MACAddr;
  455.     IP_ADDR     IPAddr;
  456. } NODE_INFO;
  457.  
  458. typedef struct _APP_CONFIG
  459. {
  460.     IP_ADDR     MyIPAddr;
  461.     MAC_ADDR    MyMACAddr;
  462.     IP_ADDR     MyMask;
  463.     IP_ADDR     MyGateway;
  464.     IP_ADDR     PrimaryDNSServer;
  465.     struct
  466.     {
  467.         unsigned char bIsDHCPEnabled : 1;
  468.         unsigned char bInConfigMode : 1;
  469.     } Flags;
  470.     WORD_VAL    SerialNumber;
  471.     IP_ADDR     SMTPServerAddr;     // Not used.
  472.     IP_ADDR     TFTPServerAddr;     // Not used.
  473.     BYTE        NetBIOSName[16];
  474. } APP_CONFIG;
  475.  
  476.  
  477. #ifndef THIS_IS_STACK_APPLICATION
  478.     extern APP_CONFIG AppConfig;
  479. #endif
  480.  
  481. #if defined(STACK_USE_IP_GLEANING) || defined(STACK_USE_DHCP)
  482.     #define StackIsInConfigMode()   (AppConfig.Flags.bInConfigMode)
  483. #else
  484.     #define StackIsInConfigMode()   (FALSE)
  485. #endif
  486.  
  487.  
  488. /*********************************************************************
  489.  * Function:        void StackInit(void)
  490.  *
  491.  * PreCondition:    None
  492.  *
  493.  * Input:           None
  494.  *
  495.  * Output:          Stack and its componentns are initialized
  496.  *
  497.  * Side Effects:    None
  498.  *
  499.  * Note:            This function must be called before any of the
  500.  *                  stack or its component routines be used.
  501.  *
  502.  ********************************************************************/
  503. void StackInit(void);
  504.  
  505.  
  506. /*********************************************************************
  507.  * Function:        void StackTask(void)
  508.  *
  509.  * PreCondition:    StackInit() is already called.
  510.  *
  511.  * Input:           None
  512.  *
  513.  * Output:          Stack FSM is executed.
  514.  *
  515.  * Side Effects:    None
  516.  *
  517.  * Note:            This FSM checks for new incoming packets,
  518.  *                  and routes it to appropriate stack components.
  519.  *                  It also performs timed operations.
  520.  *
  521.  *                  This function must be called periodically called
  522.  *                  to make sure that timely response.
  523.  *
  524.  ********************************************************************/
  525. void StackTask(void);
  526.  
  527.  
  528. #endif
  529.