LPC1768 Mini-DK EasyWeb application with SPI TFT output. Started from EasyWebCR and modified for DM9161 PHY support.

Dependencies:   Mini-DK mbed

This is a very basic EasyWeb application.

No error checking is performed during initialisation.

Information

If the webpage is not reachable or the 'Webserver running' message does not appear, press the reset button on the Mini-DK and wait until the message 'Webserver running' appears.
This happens sometimes when powering up the Mini-DK because the DM9161 reset pin is NOT controlled by the LPC1768, it is directly connected to the reset button.

IP adress/mask/gateway in tcpip.h : 192.168.0.200 / 255.255.255.0 / 192.168.0.1

MAC address in ethmac.h : 6-5-4-3-2-1

Committer:
frankvnk
Date:
Tue Jan 15 06:43:51 2013 +0000
Revision:
8:4c3db9231e3f
Parent:
3:342aa2cf54e8
DM9161_BMSR - bit 13 define modified

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:636056c0b5e1 1 /******************************************************************
frankvnk 0:636056c0b5e1 2 ***** *****
frankvnk 3:342aa2cf54e8 3 ***** Name: tcpip.h *****
frankvnk 0:636056c0b5e1 4 ***** Ver.: 1.0 *****
frankvnk 0:636056c0b5e1 5 ***** Date: 17/12/2012 *****
frankvnk 0:636056c0b5e1 6 ***** Func: header-file for tcpip.c *****
frankvnk 0:636056c0b5e1 7 ***** Rewrite from Andreas Dannenberg *****
frankvnk 0:636056c0b5e1 8 ***** HTWK Leipzig *****
frankvnk 0:636056c0b5e1 9 ***** university of applied sciences *****
frankvnk 0:636056c0b5e1 10 ***** Germany *****
frankvnk 0:636056c0b5e1 11 ***** adannenb@et.htwk-leipzig.de *****
frankvnk 0:636056c0b5e1 12 ***** *****
frankvnk 0:636056c0b5e1 13 ******************************************************************/
frankvnk 0:636056c0b5e1 14
frankvnk 0:636056c0b5e1 15 #ifndef __TCPIP_H
frankvnk 0:636056c0b5e1 16 #define __TCPIP_H
frankvnk 0:636056c0b5e1 17
frankvnk 0:636056c0b5e1 18 // easyWEB-stack definitions
frankvnk 0:636056c0b5e1 19 #define MYIP_1 192 // our internet protocol (IP) address
frankvnk 0:636056c0b5e1 20 #define MYIP_2 168
frankvnk 0:636056c0b5e1 21 #define MYIP_3 0
frankvnk 0:636056c0b5e1 22 #define MYIP_4 200
frankvnk 0:636056c0b5e1 23
frankvnk 0:636056c0b5e1 24 #define SUBMASK_1 255 // subnet mask
frankvnk 0:636056c0b5e1 25 #define SUBMASK_2 255
frankvnk 0:636056c0b5e1 26 #define SUBMASK_3 255
frankvnk 0:636056c0b5e1 27 #define SUBMASK_4 0
frankvnk 0:636056c0b5e1 28
frankvnk 0:636056c0b5e1 29 #define GWIP_1 192 // standard gateway (used if remote
frankvnk 0:636056c0b5e1 30 #define GWIP_2 168 // IP is no part of our subnet)
frankvnk 0:636056c0b5e1 31 #define GWIP_3 0
frankvnk 0:636056c0b5e1 32 #define GWIP_4 1
frankvnk 0:636056c0b5e1 33
frankvnk 0:636056c0b5e1 34 #define RETRY_TIMEOUT 8 // wait max. 8 x 262ms for an ACK (about 2 sec.)
frankvnk 0:636056c0b5e1 35 #define FIN_TIMEOUT 2 // max. time to wait for an ACK of a FIN
frankvnk 0:636056c0b5e1 36 // before closing TCP state-machine (about 0.5 s)
frankvnk 0:636056c0b5e1 37 #define MAX_RETRYS 4 // nr. of resendings before reset conn.
frankvnk 0:636056c0b5e1 38 // total nr. of transmissions = MAX_RETRYS + 1
frankvnk 0:636056c0b5e1 39
frankvnk 0:636056c0b5e1 40 #define MAX_TCP_TX_DATA_SIZE 512 // max. outgoing TCP data size (even!)
frankvnk 0:636056c0b5e1 41 #define MAX_TCP_RX_DATA_SIZE 256 // max. incoming TCP data size (even!)
frankvnk 0:636056c0b5e1 42 // (increasing the buffer-size dramatically
frankvnk 0:636056c0b5e1 43 // increases the transfer-speed!)
frankvnk 0:636056c0b5e1 44
frankvnk 0:636056c0b5e1 45 #define MAX_ETH_TX_DATA_SIZE 60 // 2nd buffer, used for ARP, ICMP, TCP (even!)
frankvnk 0:636056c0b5e1 46 // enough to echo 32 byte via ICMP
frankvnk 0:636056c0b5e1 47
frankvnk 0:636056c0b5e1 48 #define DEFAULT_TTL 64 // Time To Live sent with packets
frankvnk 0:636056c0b5e1 49
frankvnk 0:636056c0b5e1 50 // Ethernet network layer definitions
frankvnk 0:636056c0b5e1 51 #define ETH_DA_OFS 0 // Destination MAC address (48 Bit)
frankvnk 0:636056c0b5e1 52 #define ETH_SA_OFS 6 // Source MAC address (48 Bit)
frankvnk 0:636056c0b5e1 53 #define ETH_TYPE_OFS 12 // Type field (16 Bit)
frankvnk 0:636056c0b5e1 54 #define ETH_DATA_OFS 14 // Frame Data
frankvnk 0:636056c0b5e1 55 #define ETH_HEADER_SIZE 14
frankvnk 0:636056c0b5e1 56
frankvnk 0:636056c0b5e1 57 #define FRAME_ARP 0x0806 // frame types (stored in Type/Length field)
frankvnk 0:636056c0b5e1 58 #define FRAME_IP 0x0800
frankvnk 0:636056c0b5e1 59
frankvnk 0:636056c0b5e1 60 // IPv4 layer definitions
frankvnk 0:636056c0b5e1 61 #define IP_VER_IHL_TOS_OFS ETH_DATA_OFS + 0 // Version, Header Length, Type of Service
frankvnk 0:636056c0b5e1 62 #define IP_TOTAL_LENGTH_OFS ETH_DATA_OFS + 2 // IP Frame's Total Length
frankvnk 0:636056c0b5e1 63 #define IP_IDENT_OFS ETH_DATA_OFS + 4 // Identifying Value
frankvnk 0:636056c0b5e1 64 #define IP_FLAGS_FRAG_OFS ETH_DATA_OFS + 6 // Flags and Fragment Offset
frankvnk 0:636056c0b5e1 65 #define IP_TTL_PROT_OFS ETH_DATA_OFS + 8 // Frame's Time to Live, Protocol
frankvnk 0:636056c0b5e1 66 #define IP_HEAD_CHKSUM_OFS ETH_DATA_OFS + 10 // IP Frame's Header Checksum
frankvnk 0:636056c0b5e1 67 #define IP_SOURCE_OFS ETH_DATA_OFS + 12 // Source Address (32 Bit)
frankvnk 0:636056c0b5e1 68 #define IP_DESTINATION_OFS ETH_DATA_OFS + 16 // Destination Address (32 Bit)
frankvnk 0:636056c0b5e1 69 #define IP_DATA_OFS ETH_DATA_OFS + 20 // Frame Data (if no options)
frankvnk 0:636056c0b5e1 70 #define IP_HEADER_SIZE 20 // w/o options
frankvnk 0:636056c0b5e1 71
frankvnk 0:636056c0b5e1 72 #define IP_VER_IHL 0x4500 // IPv4, Header Length = 5x32 bit
frankvnk 0:636056c0b5e1 73 #define IP_TOS_D 0x0010 // TOS low delay
frankvnk 0:636056c0b5e1 74 #define IP_TOS_T 0x0008 // TOS high throughput
frankvnk 0:636056c0b5e1 75 #define IP_TOS_R 0x0004 // TOS high reliability
frankvnk 0:636056c0b5e1 76
frankvnk 0:636056c0b5e1 77 #define IP_FLAG_DONTFRAG 0x4000 // don't fragment IP frame
frankvnk 0:636056c0b5e1 78 #define IP_FLAG_MOREFRAG 0x2000 // more fragments available
frankvnk 0:636056c0b5e1 79 #define IP_FRAGOFS_MASK 0x1FFF // indicates where this fragment belongs
frankvnk 0:636056c0b5e1 80
frankvnk 0:636056c0b5e1 81 #define PROT_ICMP 1 // Internet Control Message Protocol
frankvnk 0:636056c0b5e1 82 #define PROT_TCP 6 // Transmission Control Protocol
frankvnk 0:636056c0b5e1 83 #define PROT_UDP 17 // User Datagram Protocol
frankvnk 0:636056c0b5e1 84
frankvnk 0:636056c0b5e1 85 // ARP definitions
frankvnk 0:636056c0b5e1 86 #define ARP_HARDW_OFS ETH_DATA_OFS + 0 // Hardware address type
frankvnk 0:636056c0b5e1 87 #define ARP_PROT_OFS ETH_DATA_OFS + 2 // Protocol
frankvnk 0:636056c0b5e1 88 #define ARP_HLEN_PLEN_OFS ETH_DATA_OFS + 4 // byte length of each hardw. / prot. address
frankvnk 0:636056c0b5e1 89 #define ARP_OPCODE_OFS ETH_DATA_OFS + 6 // Opcode
frankvnk 0:636056c0b5e1 90 #define ARP_SENDER_HA_OFS ETH_DATA_OFS + 8 // Hardw. address of sender of this packet
frankvnk 0:636056c0b5e1 91 #define ARP_SENDER_IP_OFS ETH_DATA_OFS + 14 // IP address of sender
frankvnk 0:636056c0b5e1 92 #define ARP_TARGET_HA_OFS ETH_DATA_OFS + 18 // Hardw. address of target of this packet
frankvnk 0:636056c0b5e1 93 #define ARP_TARGET_IP_OFS ETH_DATA_OFS + 24 // IP address of target
frankvnk 0:636056c0b5e1 94 #define ARP_FRAME_SIZE 28
frankvnk 0:636056c0b5e1 95
frankvnk 0:636056c0b5e1 96 #define HARDW_ETH10 1 // hardware-type 10Mbps Ethernet
frankvnk 0:636056c0b5e1 97 #define IP_HLEN_PLEN 0x0604 // MAC = 6 byte long, IP = 4 byte long
frankvnk 0:636056c0b5e1 98 #define OP_ARP_REQUEST 1 // operations for ARP-frames
frankvnk 0:636056c0b5e1 99 #define OP_ARP_ANSWER 2
frankvnk 0:636056c0b5e1 100
frankvnk 0:636056c0b5e1 101 // ICMP definitions
frankvnk 0:636056c0b5e1 102 #define ICMP_TYPE_CODE_OFS IP_DATA_OFS + 0 // type of message
frankvnk 0:636056c0b5e1 103 #define ICMP_CHKSUM_OFS IP_DATA_OFS + 2 // checksum of ICMP-message (16 bit)
frankvnk 0:636056c0b5e1 104 #define ICMP_DATA_OFS IP_DATA_OFS + 4
frankvnk 0:636056c0b5e1 105 #define ICMP_HEADER_SIZE 4
frankvnk 0:636056c0b5e1 106
frankvnk 0:636056c0b5e1 107 #define ICMP_ECHO 8 // message is an echo request
frankvnk 0:636056c0b5e1 108 #define ICMP_ECHO_REPLY 0 // message is an echo reply
frankvnk 0:636056c0b5e1 109
frankvnk 0:636056c0b5e1 110 // TCP layer definitions
frankvnk 0:636056c0b5e1 111 #define TCP_SRCPORT_OFS IP_DATA_OFS + 0 // Source Port (16 bit)
frankvnk 0:636056c0b5e1 112 #define TCP_DESTPORT_OFS IP_DATA_OFS + 2 // Destination Port (16 bit)
frankvnk 0:636056c0b5e1 113 #define TCP_SEQNR_OFS IP_DATA_OFS + 4 // Sequence Number (32 bit)
frankvnk 0:636056c0b5e1 114 #define TCP_ACKNR_OFS IP_DATA_OFS + 8 // Acknowledge Number (32 bit)
frankvnk 0:636056c0b5e1 115 #define TCP_DATA_CODE_OFS IP_DATA_OFS + 12 // Data Offset and Control Bits (16 bit)
frankvnk 0:636056c0b5e1 116 #define TCP_WINDOW_OFS IP_DATA_OFS + 14 // Window Size (16 bit)
frankvnk 0:636056c0b5e1 117 #define TCP_CHKSUM_OFS IP_DATA_OFS + 16 // Checksum Field (16 bit)
frankvnk 0:636056c0b5e1 118 #define TCP_URGENT_OFS IP_DATA_OFS + 18 // Urgent Pointer (16 bit)
frankvnk 0:636056c0b5e1 119 #define TCP_DATA_OFS IP_DATA_OFS + 20 // Frame Data (if no options)
frankvnk 0:636056c0b5e1 120 #define TCP_HEADER_SIZE 20 // size w/o options
frankvnk 0:636056c0b5e1 121
frankvnk 0:636056c0b5e1 122 #define DATA_OFS_MASK 0xF000 // number of 32 bit words in the TCP Header
frankvnk 0:636056c0b5e1 123
frankvnk 0:636056c0b5e1 124 #define TCP_CODE_FIN 0x0001
frankvnk 0:636056c0b5e1 125 #define TCP_CODE_SYN 0x0002
frankvnk 0:636056c0b5e1 126 #define TCP_CODE_RST 0x0004
frankvnk 0:636056c0b5e1 127 #define TCP_CODE_PSH 0x0008
frankvnk 0:636056c0b5e1 128 #define TCP_CODE_ACK 0x0010
frankvnk 0:636056c0b5e1 129 #define TCP_CODE_URG 0x0020
frankvnk 0:636056c0b5e1 130
frankvnk 0:636056c0b5e1 131 #define TCP_OPT_MSS 0x0204 // Type 2, Option Length 4 (Max. Segment Size)
frankvnk 0:636056c0b5e1 132 #define TCP_OPT_MSS_SIZE 4
frankvnk 0:636056c0b5e1 133
frankvnk 0:636056c0b5e1 134 // define some TCP standard-ports, useful for testing...
frankvnk 0:636056c0b5e1 135 #define TCP_PORT_ECHO 7 // echo
frankvnk 0:636056c0b5e1 136 #define TCP_PORT_DISCARD 9 // discard
frankvnk 0:636056c0b5e1 137 #define TCP_PORT_DAYTIME 13 // daytime
frankvnk 0:636056c0b5e1 138 #define TCP_PORT_QOTD 17 // quote of the day
frankvnk 0:636056c0b5e1 139 #define TCP_PORT_CHARGEN 19 // character generator
frankvnk 0:636056c0b5e1 140 #define TCP_PORT_HTTP 80 // word wide web HTTP
frankvnk 0:636056c0b5e1 141
frankvnk 0:636056c0b5e1 142 // macros
frankvnk 0:636056c0b5e1 143 #define SWAPB(Word) ((unsigned short)((Word) << 8) | ((Word) >> 8))
frankvnk 0:636056c0b5e1 144 // convert little <-> big endian
frankvnk 0:636056c0b5e1 145
frankvnk 0:636056c0b5e1 146 // typedefs
frankvnk 0:636056c0b5e1 147 typedef enum { // states of the TCP-state machine
frankvnk 0:636056c0b5e1 148 CLOSED, // according to RFC793
frankvnk 0:636056c0b5e1 149 LISTENING,
frankvnk 0:636056c0b5e1 150 SYN_SENT,
frankvnk 0:636056c0b5e1 151 SYN_RECD,
frankvnk 0:636056c0b5e1 152 ESTABLISHED,
frankvnk 0:636056c0b5e1 153 FIN_WAIT_1,
frankvnk 0:636056c0b5e1 154 FIN_WAIT_2,
frankvnk 0:636056c0b5e1 155 CLOSE_WAIT,
frankvnk 0:636056c0b5e1 156 CLOSING,
frankvnk 0:636056c0b5e1 157 LAST_ACK,
frankvnk 0:636056c0b5e1 158 TIME_WAIT
frankvnk 0:636056c0b5e1 159 } TTCPStateMachine;
frankvnk 0:636056c0b5e1 160
frankvnk 0:636056c0b5e1 161 typedef enum { // type of last frame sent. used
frankvnk 0:636056c0b5e1 162 ARP_REQUEST, // for retransmissions
frankvnk 0:636056c0b5e1 163 TCP_SYN_FRAME,
frankvnk 0:636056c0b5e1 164 TCP_SYN_ACK_FRAME,
frankvnk 0:636056c0b5e1 165 TCP_FIN_FRAME,
frankvnk 0:636056c0b5e1 166 TCP_DATA_FRAME
frankvnk 0:636056c0b5e1 167 } TLastFrameSent;
frankvnk 0:636056c0b5e1 168
frankvnk 0:636056c0b5e1 169 // constants
frankvnk 0:636056c0b5e1 170
frankvnk 0:636056c0b5e1 171 // the next 3 buffers must be word-aligned!
frankvnk 0:636056c0b5e1 172 // (here the 'RecdIPFrameLength' above does that)
frankvnk 0:636056c0b5e1 173
frankvnk 0:636056c0b5e1 174 extern unsigned short _TxFrame1[(ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE + MAX_TCP_TX_DATA_SIZE)/2];
frankvnk 0:636056c0b5e1 175 extern unsigned short _TxFrame2[(ETH_HEADER_SIZE + MAX_ETH_TX_DATA_SIZE)/2];
frankvnk 0:636056c0b5e1 176 extern unsigned short _RxTCPBuffer[MAX_TCP_RX_DATA_SIZE/2]; // space for incoming TCP-data
frankvnk 0:636056c0b5e1 177 #define TxFrame1 ((unsigned char *)_TxFrame1)
frankvnk 0:636056c0b5e1 178 #define TxFrame2 ((unsigned char *)_TxFrame2)
frankvnk 0:636056c0b5e1 179 #define RxTCPBuffer ((unsigned char *)_RxTCPBuffer)
frankvnk 0:636056c0b5e1 180
frankvnk 0:636056c0b5e1 181 //
frankvnk 0:636056c0b5e1 182 // prototypes
frankvnk 0:636056c0b5e1 183 void DoNetworkStuff(void);
frankvnk 0:636056c0b5e1 184
frankvnk 0:636056c0b5e1 185 // Handlers for incoming frames
frankvnk 0:636056c0b5e1 186 void ProcessEthBroadcastFrame(void);
frankvnk 0:636056c0b5e1 187 void ProcessEthIAFrame(void);
frankvnk 0:636056c0b5e1 188 void ProcessICMPFrame(void);
frankvnk 0:636056c0b5e1 189 void ProcessTCPFrame(void);
frankvnk 0:636056c0b5e1 190
frankvnk 0:636056c0b5e1 191 // fill TX-buffers
frankvnk 0:636056c0b5e1 192 void PrepareARP_REQUEST(void);
frankvnk 0:636056c0b5e1 193 void PrepareARP_ANSWER(void);
frankvnk 0:636056c0b5e1 194 void PrepareICMP_ECHO_REPLY(void);
frankvnk 0:636056c0b5e1 195 void PrepareTCP_FRAME(unsigned short TCPCode);
frankvnk 0:636056c0b5e1 196 void PrepareTCP_DATA_FRAME(void);
frankvnk 0:636056c0b5e1 197
frankvnk 0:636056c0b5e1 198 // general help functions
frankvnk 0:636056c0b5e1 199 void SendFrame1(void);
frankvnk 0:636056c0b5e1 200 void SendFrame2(void);
frankvnk 0:636056c0b5e1 201 void TCPStartRetryTimer(void);
frankvnk 0:636056c0b5e1 202 void TCPStartTimeWaitTimer(void);
frankvnk 0:636056c0b5e1 203 void TCPRestartTimer(void);
frankvnk 0:636056c0b5e1 204 void TCPStopTimer(void);
frankvnk 0:636056c0b5e1 205 void TCPHandleRetransmission(void);
frankvnk 0:636056c0b5e1 206 void TCPHandleTimeout(void);
frankvnk 0:636056c0b5e1 207 unsigned short CalcChecksum(void *Start, unsigned short Count, unsigned char IsTCP);
frankvnk 0:636056c0b5e1 208
frankvnk 0:636056c0b5e1 209 // functions to work with big-endian numbers
frankvnk 0:636056c0b5e1 210 unsigned short SwapBytes(unsigned short Data);
frankvnk 0:636056c0b5e1 211 void WriteWBE(unsigned char *Add, unsigned short Data);
frankvnk 0:636056c0b5e1 212 void WriteDWBE(unsigned char *Add, unsigned long Data);
frankvnk 0:636056c0b5e1 213
frankvnk 0:636056c0b5e1 214 // easyWEB-API functions
frankvnk 0:636056c0b5e1 215 void TCPLowLevelInit(void); // setup timer, LAN-controller, flags...
frankvnk 0:636056c0b5e1 216 void TCPPassiveOpen(void); // listen for a connection
frankvnk 0:636056c0b5e1 217 void TCPActiveOpen(void); // open connection
frankvnk 0:636056c0b5e1 218 void TCPClose(void); // close connection
frankvnk 0:636056c0b5e1 219 void TCPReleaseRxBuffer(void); // indicate to discard rec'd packet
frankvnk 0:636056c0b5e1 220 void TCPTransmitTxBuffer(void); // initiate transfer after TxBuffer is filled
frankvnk 0:636056c0b5e1 221 void TCPClockHandler(void);
frankvnk 0:636056c0b5e1 222
frankvnk 0:636056c0b5e1 223 // easyWEB-API global vars and flags
frankvnk 0:636056c0b5e1 224 extern unsigned short TCPRxDataCount; // nr. of bytes rec'd
frankvnk 0:636056c0b5e1 225 extern unsigned short TCPTxDataCount; // nr. of bytes to send
frankvnk 0:636056c0b5e1 226
frankvnk 0:636056c0b5e1 227 extern unsigned short TCPLocalPort; // TCP ports
frankvnk 0:636056c0b5e1 228 extern unsigned short TCPRemotePort;
frankvnk 0:636056c0b5e1 229
frankvnk 0:636056c0b5e1 230 extern unsigned short RemoteMAC[3]; // MAC and IP of current TCP-session
frankvnk 0:636056c0b5e1 231 extern unsigned short RemoteIP[2];
frankvnk 0:636056c0b5e1 232
frankvnk 0:636056c0b5e1 233 extern unsigned char SocketStatus;
frankvnk 0:636056c0b5e1 234 #define SOCK_ACTIVE 0x01 // state machine NOT closed
frankvnk 0:636056c0b5e1 235 #define SOCK_CONNECTED 0x02 // user may send & receive data
frankvnk 0:636056c0b5e1 236 #define SOCK_DATA_AVAILABLE 0x04 // new data available
frankvnk 0:636056c0b5e1 237 #define SOCK_TX_BUF_RELEASED 0x08 // user may fill buffer
frankvnk 0:636056c0b5e1 238
frankvnk 0:636056c0b5e1 239 #define SOCK_ERROR_MASK 0xF0 // bit-mask to check for errors
frankvnk 0:636056c0b5e1 240 #define SOCK_ERR_OK 0x00 // no error
frankvnk 0:636056c0b5e1 241 #define SOCK_ERR_ARP_TIMEOUT 0x10 // timeout waiting for an ARP-REPLY
frankvnk 0:636056c0b5e1 242 #define SOCK_ERR_TCP_TIMEOUT 0x20 // timeout waiting for an ACK
frankvnk 0:636056c0b5e1 243 #define SOCK_ERR_CONN_RESET 0x30 // connection was reset by the other TCP
frankvnk 0:636056c0b5e1 244 #define SOCK_ERR_REMOTE 0x40 // remote TCP caused fatal error
frankvnk 0:636056c0b5e1 245 #define SOCK_ERR_ETHERNET 0x50 // network interface error (timeout)
frankvnk 0:636056c0b5e1 246
frankvnk 0:636056c0b5e1 247 // easyWEB-API buffer-pointers
frankvnk 0:636056c0b5e1 248 #define TCP_TX_BUF ((unsigned char *)TxFrame1 + ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE)
frankvnk 0:636056c0b5e1 249 #define TCP_RX_BUF ((unsigned char *)RxTCPBuffer)
frankvnk 0:636056c0b5e1 250
frankvnk 0:636056c0b5e1 251 #endif
frankvnk 0:636056c0b5e1 252