Add [12_m1284p_WIZNET_HTTPServer_SDCARD_pages] prj
							parent
							
								
									4c8449a175
								
							
						
					
					
						commit
						aa2ce7afd2
					
				| @ -0,0 +1,80 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.core.settings"> | ||||
| 		<cconfiguration id="de.innot.avreclipse.configuration.app.release.1296246863"> | ||||
| 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="de.innot.avreclipse.configuration.app.release.1296246863" moduleId="org.eclipse.cdt.core.settings" name="Release"> | ||||
| 				<externalSettings/> | ||||
| 				<extensions> | ||||
| 					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 				</extensions> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||
| 				<configuration artifactName="${ProjName}" buildArtefactType="de.innot.avreclipse.buildArtefactType.app" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=de.innot.avreclipse.buildArtefactType.app,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" description="" id="de.innot.avreclipse.configuration.app.release.1296246863" name="Release" parent="de.innot.avreclipse.configuration.app.release"> | ||||
| 					<folderInfo id="de.innot.avreclipse.configuration.app.release.1296246863." name="/" resourcePath=""> | ||||
| 						<toolChain id="de.innot.avreclipse.toolchain.winavr.app.release.1035343131" name="AVR-GCC Toolchain" superClass="de.innot.avreclipse.toolchain.winavr.app.release"> | ||||
| 							<option id="de.innot.avreclipse.toolchain.options.toolchain.objcopy.flash.app.release.1677804441" name="Generate HEX file for Flash memory" superClass="de.innot.avreclipse.toolchain.options.toolchain.objcopy.flash.app.release"/> | ||||
| 							<option id="de.innot.avreclipse.toolchain.options.toolchain.objcopy.eeprom.app.release.1592051743" name="Generate HEX file for EEPROM" superClass="de.innot.avreclipse.toolchain.options.toolchain.objcopy.eeprom.app.release"/> | ||||
| 							<option id="de.innot.avreclipse.toolchain.options.toolchain.objdump.app.release.1122611394" name="Generate Extended Listing (Source + generated Assembler)" superClass="de.innot.avreclipse.toolchain.options.toolchain.objdump.app.release"/> | ||||
| 							<option id="de.innot.avreclipse.toolchain.options.toolchain.size.app.release.1318978007" name="Print Size" superClass="de.innot.avreclipse.toolchain.options.toolchain.size.app.release"/> | ||||
| 							<option id="de.innot.avreclipse.toolchain.options.toolchain.avrdude.app.release.330957466" name="AVRDude" superClass="de.innot.avreclipse.toolchain.options.toolchain.avrdude.app.release"/> | ||||
| 							<targetPlatform id="de.innot.avreclipse.targetplatform.winavr.app.release.1911832209" name="AVR Cross-Target" superClass="de.innot.avreclipse.targetplatform.winavr.app.release"/> | ||||
| 							<builder buildPath="${workspace_loc:/m1284p_blink}/Release" id="de.innot.avreclipse.target.builder.winavr.app.release.197425084" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="AVR GNU Make Builder" superClass="de.innot.avreclipse.target.builder.winavr.app.release"/> | ||||
| 							<tool id="de.innot.avreclipse.tool.assembler.winavr.app.release.1044776614" name="AVR Assembler" superClass="de.innot.avreclipse.tool.assembler.winavr.app.release"> | ||||
| 								<option id="de.innot.avreclipse.assembler.option.debug.level.1934306003" name="Generate Debugging Info" superClass="de.innot.avreclipse.assembler.option.debug.level" value="de.innot.avreclipse.assembler.option.debug.level.none" valueType="enumerated"/> | ||||
| 								<inputType id="de.innot.avreclipse.tool.assembler.input.1445613337" superClass="de.innot.avreclipse.tool.assembler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="de.innot.avreclipse.tool.compiler.winavr.app.release.322918746" name="AVR Compiler" superClass="de.innot.avreclipse.tool.compiler.winavr.app.release"> | ||||
| 								<option id="de.innot.avreclipse.compiler.option.debug.level.1395543931" name="Generate Debugging Info" superClass="de.innot.avreclipse.compiler.option.debug.level" value="de.innot.avreclipse.compiler.option.debug.level.none" valueType="enumerated"/> | ||||
| 								<option id="de.innot.avreclipse.compiler.option.optimize.553992918" name="Optimization Level" superClass="de.innot.avreclipse.compiler.option.optimize" value="de.innot.avreclipse.compiler.optimize.size" valueType="enumerated"/> | ||||
| 								<option id="de.innot.avreclipse.compiler.option.incpath.478254702" name="Include Paths (-I)" superClass="de.innot.avreclipse.compiler.option.incpath" valueType="includePath"> | ||||
| 									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Internet/httpServer_avr}""/> | ||||
| 									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Ethernet}""/> | ||||
| 									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Ethernet/W5500}""/> | ||||
| 									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/ff}""/> | ||||
| 								</option> | ||||
| 								<inputType id="de.innot.avreclipse.compiler.winavr.input.167604838" name="C Source Files" superClass="de.innot.avreclipse.compiler.winavr.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="de.innot.avreclipse.tool.cppcompiler.app.release.1282845851" name="AVR C++ Compiler" superClass="de.innot.avreclipse.tool.cppcompiler.app.release"> | ||||
| 								<option id="de.innot.avreclipse.cppcompiler.option.debug.level.590178482" name="Generate Debugging Info" superClass="de.innot.avreclipse.cppcompiler.option.debug.level" value="de.innot.avreclipse.cppcompiler.option.debug.level.none" valueType="enumerated"/> | ||||
| 								<option id="de.innot.avreclipse.cppcompiler.option.optimize.1730181360" name="Optimization Level" superClass="de.innot.avreclipse.cppcompiler.option.optimize" value="de.innot.avreclipse.cppcompiler.optimize.size" valueType="enumerated"/> | ||||
| 								<inputType id="de.innot.avreclipse.cppcompiler.input.1110129299" superClass="de.innot.avreclipse.cppcompiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="de.innot.avreclipse.tool.linker.winavr.app.release.910552277" name="AVR C Linker" superClass="de.innot.avreclipse.tool.linker.winavr.app.release"/> | ||||
| 							<tool id="de.innot.avreclipse.tool.cpplinker.app.release.704198725" name="AVR C++ Linker" superClass="de.innot.avreclipse.tool.cpplinker.app.release"> | ||||
| 								<inputType id="de.innot.avreclipse.tool.cpplinker.input.1469628063" name="OBJ Files" superClass="de.innot.avreclipse.tool.cpplinker.input"> | ||||
| 									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> | ||||
| 									<additionalInput kind="additionalinput" paths="$(LIBS)"/> | ||||
| 								</inputType> | ||||
| 							</tool> | ||||
| 							<tool id="de.innot.avreclipse.tool.archiver.winavr.base.249251196" name="AVR Archiver" superClass="de.innot.avreclipse.tool.archiver.winavr.base"/> | ||||
| 							<tool id="de.innot.avreclipse.tool.objdump.winavr.app.release.701513686" name="AVR Create Extended Listing" superClass="de.innot.avreclipse.tool.objdump.winavr.app.release"/> | ||||
| 							<tool id="de.innot.avreclipse.tool.objcopy.flash.winavr.app.release.1874041246" name="AVR Create Flash image" superClass="de.innot.avreclipse.tool.objcopy.flash.winavr.app.release"/> | ||||
| 							<tool id="de.innot.avreclipse.tool.objcopy.eeprom.winavr.app.release.1162490773" name="AVR Create EEPROM image" superClass="de.innot.avreclipse.tool.objcopy.eeprom.winavr.app.release"/> | ||||
| 							<tool id="de.innot.avreclipse.tool.size.winavr.app.release.1789876684" name="Print Size" superClass="de.innot.avreclipse.tool.size.winavr.app.release"/> | ||||
| 							<tool id="de.innot.avreclipse.tool.avrdude.app.release.602378631" name="AVRDude" superClass="de.innot.avreclipse.tool.avrdude.app.release"/> | ||||
| 						</toolChain> | ||||
| 					</folderInfo> | ||||
| 				</configuration> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | ||||
| 		</cconfiguration> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||
| 		<project id="m1284p_blink.de.innot.avreclipse.project.winavr.elf_2.1.0.95248786" name="AVR Cross Target Application" projectType="de.innot.avreclipse.project.winavr.elf_2.1.0"/> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="scannerConfiguration"> | ||||
| 		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> | ||||
| 		<scannerConfigBuildInfo instanceId="de.innot.avreclipse.configuration.app.release.1296246863;de.innot.avreclipse.configuration.app.release.1296246863.;de.innot.avreclipse.tool.cppcompiler.app.release.1282845851;de.innot.avreclipse.cppcompiler.input.1110129299"> | ||||
| 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="de.innot.avreclipse.core.AVRGCCManagedMakePerProjectProfileCPP"/> | ||||
| 		</scannerConfigBuildInfo> | ||||
| 		<scannerConfigBuildInfo instanceId="de.innot.avreclipse.configuration.app.release.1296246863;de.innot.avreclipse.configuration.app.release.1296246863.;de.innot.avreclipse.tool.compiler.winavr.app.release.322918746;de.innot.avreclipse.compiler.winavr.input.167604838"> | ||||
| 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="de.innot.avreclipse.core.AVRGCCManagedMakePerProjectProfileC"/> | ||||
| 		</scannerConfigBuildInfo> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> | ||||
| 	<storageModule moduleId="refreshScope"/> | ||||
| </cproject> | ||||
| @ -0,0 +1,28 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>12_m1284p_WIZNET_HTTPServer_SDCARD_pages</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> | ||||
| 			<triggers>clean,full,incremental,</triggers> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> | ||||
| 			<triggers>full,incremental,</triggers> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.cdt.core.cnature</nature> | ||||
| 		<nature>org.eclipse.cdt.core.ccnature</nature> | ||||
| 		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> | ||||
| 		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> | ||||
| 		<nature>de.innot.avreclipse.core.avrnature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
| @ -0,0 +1,225 @@ | ||||
| #include <stdio.h> | ||||
| #include "loopback.h" | ||||
| #include "socket.h" | ||||
| #include "wizchip_conf.h" | ||||
| 
 | ||||
| #if LOOPBACK_MODE == LOOPBACK_MAIN_NOBLCOK | ||||
| 
 | ||||
| int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port) | ||||
| { | ||||
|    int32_t ret; | ||||
|    uint16_t size = 0, sentsize=0; | ||||
| 
 | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|    uint8_t destip[4]; | ||||
|    uint16_t destport; | ||||
| #endif | ||||
| 
 | ||||
|    switch(getSn_SR(sn)) | ||||
|    { | ||||
|       case SOCK_ESTABLISHED : | ||||
|          if(getSn_IR(sn) & Sn_IR_CON) | ||||
|          { | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
| 			getSn_DIPR(sn, destip); | ||||
| 			destport = getSn_DPORT(sn); | ||||
| 
 | ||||
| 			printf("%d:Connected - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport); | ||||
| #endif | ||||
| 			setSn_IR(sn,Sn_IR_CON); | ||||
|          } | ||||
| 		 if((size = getSn_RX_RSR(sn)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't not occur.
 | ||||
|          { | ||||
| 			if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; | ||||
| 			ret = recv(sn, buf, size); | ||||
| 
 | ||||
| 			if(ret <= 0) return ret;      // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.
 | ||||
| 			size = (uint16_t) ret; | ||||
| 			sentsize = 0; | ||||
| 
 | ||||
| 			while(size != sentsize) | ||||
| 			{ | ||||
| 				ret = send(sn, buf+sentsize, size-sentsize); | ||||
| 				if(ret < 0) | ||||
| 				{ | ||||
| 					close(sn); | ||||
| 					return ret; | ||||
| 				} | ||||
| 				sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
 | ||||
| 			} | ||||
|          } | ||||
|          break; | ||||
|       case SOCK_CLOSE_WAIT : | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|          //printf("%d:CloseWait\r\n",sn);
 | ||||
| #endif | ||||
|          if((ret = disconnect(sn)) != SOCK_OK) return ret; | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|          printf("%d:Socket Closed\r\n", sn); | ||||
| #endif | ||||
|          break; | ||||
|       case SOCK_INIT : | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|     	 printf("%d:Listen, TCP server loopback, port [%d]\r\n", sn, port); | ||||
| #endif | ||||
|          if( (ret = listen(sn)) != SOCK_OK) return ret; | ||||
|          break; | ||||
|       case SOCK_CLOSED: | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|          //printf("%d:TCP server loopback start\r\n",sn);
 | ||||
| #endif | ||||
|          if((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret; | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|          //printf("%d:Socket opened\r\n",sn);
 | ||||
| #endif | ||||
|          break; | ||||
|       default: | ||||
|          break; | ||||
|    } | ||||
|    return 1; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int32_t loopback_tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport) | ||||
| { | ||||
|    int32_t ret; // return value for SOCK_ERRORs
 | ||||
|    uint16_t size = 0, sentsize=0; | ||||
| 
 | ||||
|    // Destination (TCP Server) IP info (will be connected)
 | ||||
|    // >> loopback_tcpc() function parameter
 | ||||
|    // >> Ex)
 | ||||
|    //	uint8_t destip[4] = 	{192, 168, 0, 214};
 | ||||
|    //	uint16_t destport = 	5000;
 | ||||
| 
 | ||||
|    // Port number for TCP client (will be increased)
 | ||||
|    static uint16_t any_port = 	50000; | ||||
| 
 | ||||
|    // Socket Status Transitions
 | ||||
|    // Check the W5500 Socket n status register (Sn_SR, The 'Sn_SR' controlled by Sn_CR command or Packet send/recv status)
 | ||||
|    switch(getSn_SR(sn)) | ||||
|    { | ||||
|       case SOCK_ESTABLISHED : | ||||
|          if(getSn_IR(sn) & Sn_IR_CON)	// Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful
 | ||||
|          { | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
| 			printf("%d:Connected to - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport); | ||||
| #endif | ||||
| 			setSn_IR(sn, Sn_IR_CON);  // this interrupt should be write the bit cleared to '1'
 | ||||
|          } | ||||
| 
 | ||||
|          //////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|          // Data Transaction Parts; Handle the [data receive and send] process
 | ||||
|          //////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| 		 if((size = getSn_RX_RSR(sn)) > 0) // Sn_RX_RSR: Socket n Received Size Register, Receiving data length
 | ||||
|          { | ||||
| 			if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array)
 | ||||
| 			ret = recv(sn, buf, size); // Data Receive process (H/W Rx socket buffer -> User's buffer)
 | ||||
| 
 | ||||
| 			if(ret <= 0) return ret; // If the received data length <= 0, receive failed and process end
 | ||||
| 			size = (uint16_t) ret; | ||||
| 			sentsize = 0; | ||||
| 
 | ||||
| 			// Data sentsize control
 | ||||
| 			while(size != sentsize) | ||||
| 			{ | ||||
| 				ret = send(sn, buf+sentsize, size-sentsize); // Data send process (User's buffer -> Destination through H/W Tx socket buffer)
 | ||||
| 				if(ret < 0) // Send Error occurred (sent data length < 0)
 | ||||
| 				{ | ||||
| 					close(sn); // socket close
 | ||||
| 					return ret; | ||||
| 				} | ||||
| 				sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
 | ||||
| 			} | ||||
|          } | ||||
| 		 //////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|          break; | ||||
| 
 | ||||
|       case SOCK_CLOSE_WAIT : | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|          //printf("%d:CloseWait\r\n",sn);
 | ||||
| #endif | ||||
|          if((ret=disconnect(sn)) != SOCK_OK) return ret; | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|          printf("%d:Socket Closed\r\n", sn); | ||||
| #endif | ||||
|          break; | ||||
| 
 | ||||
|       case SOCK_INIT : | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|     	 printf("%d:Try to connect to the %d.%d.%d.%d : %d\r\n", sn, destip[0], destip[1], destip[2], destip[3], destport); | ||||
| #endif | ||||
|     	 if( (ret = connect(sn, destip, destport)) != SOCK_OK) return ret;	//	Try to TCP connect to the TCP server (destination)
 | ||||
|          break; | ||||
| 
 | ||||
|       case SOCK_CLOSED: | ||||
|     	  close(sn); | ||||
|     	  if((ret=socket(sn, Sn_MR_TCP, any_port++, 0x00)) != sn){ | ||||
|          if(any_port == 0xffff) any_port = 50000; | ||||
|          return ret; // TCP socket open with 'any_port' port number
 | ||||
|         }  | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|     	 //printf("%d:TCP client loopback start\r\n",sn);
 | ||||
|          //printf("%d:Socket opened\r\n",sn);
 | ||||
| #endif | ||||
|          break; | ||||
|       default: | ||||
|          break; | ||||
|    } | ||||
|    return 1; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port) | ||||
| { | ||||
|    int32_t  ret; | ||||
|    uint16_t size, sentsize; | ||||
|    uint8_t  destip[4]; | ||||
|    uint16_t destport; | ||||
| 
 | ||||
|    switch(getSn_SR(sn)) | ||||
|    { | ||||
|       case SOCK_UDP : | ||||
|          if((size = getSn_RX_RSR(sn)) > 0) | ||||
|          { | ||||
|             if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; | ||||
|             ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport); | ||||
|             if(ret <= 0) | ||||
|             { | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|                printf("%d: recvfrom error. %ld\r\n",sn,ret); | ||||
| #endif | ||||
|                return ret; | ||||
|             } | ||||
|             size = (uint16_t) ret; | ||||
|             sentsize = 0; | ||||
|             while(sentsize != size) | ||||
|             { | ||||
|                ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport); | ||||
|                if(ret < 0) | ||||
|                { | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|                   printf("%d: sendto error. %ld\r\n",sn,ret); | ||||
| #endif | ||||
|                   return ret; | ||||
|                } | ||||
|                sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
 | ||||
|             } | ||||
|          } | ||||
|          break; | ||||
|       case SOCK_CLOSED: | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|          //printf("%d:UDP loopback start\r\n",sn);
 | ||||
| #endif | ||||
|          if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn) | ||||
|             return ret; | ||||
| #ifdef _LOOPBACK_DEBUG_ | ||||
|          printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port); | ||||
| #endif | ||||
|          break; | ||||
|       default : | ||||
|          break; | ||||
|    } | ||||
|    return 1; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| @ -0,0 +1,38 @@ | ||||
| #ifndef _LOOPBACK_H_ | ||||
| #define _LOOPBACK_H_ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| /* Loopback test debug message printout enable */ | ||||
| #define	_LOOPBACK_DEBUG_ | ||||
| 
 | ||||
| /* DATA_BUF_SIZE define for Loopback example */ | ||||
| #ifndef DATA_BUF_SIZE | ||||
| 	#define DATA_BUF_SIZE			2048 | ||||
| #endif | ||||
| 
 | ||||
| /************************/ | ||||
| /* Select LOOPBACK_MODE */ | ||||
| /************************/ | ||||
| #define LOOPBACK_MAIN_NOBLOCK    0 | ||||
| #define LOOPBACK_MODE   LOOPBACK_MAIN_NOBLOCK | ||||
| 
 | ||||
| 
 | ||||
| /* TCP server Loopback test example */ | ||||
| int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port); | ||||
| 
 | ||||
| /* TCP client Loopback test example */ | ||||
| int32_t loopback_tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport); | ||||
| 
 | ||||
| /* UDP Loopback test example */ | ||||
| int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
| @ -0,0 +1,267 @@ | ||||
| //*****************************************************************************
 | ||||
| //
 | ||||
| //! \file w5500.c
 | ||||
| //! \brief W5500 HAL Interface.
 | ||||
| //! \version 1.0.2
 | ||||
| //! \date 2013/10/21
 | ||||
| //! \par  Revision history
 | ||||
| //!       <2015/02/05> Notice
 | ||||
| //!        The version history is not updated after this point.
 | ||||
| //!        Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary.
 | ||||
| //!        >> https://github.com/Wiznet/ioLibrary_Driver
 | ||||
| //!       <2014/05/01> V1.0.2
 | ||||
| //!         1. Implicit type casting -> Explicit type casting. Refer to M20140501
 | ||||
| //!            Fixed the problem on porting into under 32bit MCU
 | ||||
| //!            Issued by Mathias ClauBen, wizwiki forum ID Think01 and bobh
 | ||||
| //!            Thank for your interesting and serious advices.
 | ||||
| //!       <2013/12/20> V1.0.1
 | ||||
| //!         1. Remove warning
 | ||||
| //!         2. WIZCHIP_READ_BUF WIZCHIP_WRITE_BUF in case _WIZCHIP_IO_MODE_SPI_FDM_
 | ||||
| //!            for loop optimized(removed). refer to M20131220
 | ||||
| //!       <2013/10/21> 1st Release
 | ||||
| //! \author MidnightCow
 | ||||
| //! \copyright
 | ||||
| //!
 | ||||
| //! Copyright (c)  2013, WIZnet Co., LTD.
 | ||||
| //! All rights reserved.
 | ||||
| //! 
 | ||||
| //! Redistribution and use in source and binary forms, with or without 
 | ||||
| //! modification, are permitted provided that the following conditions 
 | ||||
| //! are met: 
 | ||||
| //! 
 | ||||
| //!     * Redistributions of source code must retain the above copyright 
 | ||||
| //! notice, this list of conditions and the following disclaimer. 
 | ||||
| //!     * Redistributions in binary form must reproduce the above copyright
 | ||||
| //! notice, this list of conditions and the following disclaimer in the
 | ||||
| //! documentation and/or other materials provided with the distribution. 
 | ||||
| //!     * Neither the name of the <ORGANIZATION> nor the names of its 
 | ||||
| //! contributors may be used to endorse or promote products derived 
 | ||||
| //! from this software without specific prior written permission. 
 | ||||
| //! 
 | ||||
| //! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | ||||
| //! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 | ||||
| //! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | ||||
| //! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 | ||||
| //! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 | ||||
| //! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 | ||||
| //! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | ||||
| //! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 | ||||
| //! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 | ||||
| //! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 | ||||
| //! THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| //*****************************************************************************
 | ||||
| //#include <stdio.h>
 | ||||
| #include "w5500.h" | ||||
| 
 | ||||
| #define _W5500_SPI_VDM_OP_          0x00 | ||||
| #define _W5500_SPI_FDM_OP_LEN1_     0x01 | ||||
| #define _W5500_SPI_FDM_OP_LEN2_     0x02 | ||||
| #define _W5500_SPI_FDM_OP_LEN4_     0x03 | ||||
| 
 | ||||
| #if   (_WIZCHIP_ == 5500) | ||||
| ////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| uint8_t  WIZCHIP_READ(uint32_t AddrSel) | ||||
| { | ||||
|    uint8_t ret; | ||||
|    uint8_t spi_data[3]; | ||||
| 
 | ||||
|    WIZCHIP_CRITICAL_ENTER(); | ||||
|    WIZCHIP.CS._select(); | ||||
| 
 | ||||
|    AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_); | ||||
| 
 | ||||
|    if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) 	// byte operation
 | ||||
|    { | ||||
| 	   WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16); | ||||
| 		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8); | ||||
| 		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0); | ||||
|    } | ||||
|    else																// burst operation
 | ||||
|    { | ||||
| 		spi_data[0] = (AddrSel & 0x00FF0000) >> 16; | ||||
| 		spi_data[1] = (AddrSel & 0x0000FF00) >> 8; | ||||
| 		spi_data[2] = (AddrSel & 0x000000FF) >> 0; | ||||
| 		WIZCHIP.IF.SPI._write_burst(spi_data, 3); | ||||
|    } | ||||
|    ret = WIZCHIP.IF.SPI._read_byte(); | ||||
| 
 | ||||
|    WIZCHIP.CS._deselect(); | ||||
|    WIZCHIP_CRITICAL_EXIT(); | ||||
|    return ret; | ||||
| } | ||||
| 
 | ||||
| void     WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb ) | ||||
| { | ||||
|    uint8_t spi_data[4]; | ||||
| 
 | ||||
|    WIZCHIP_CRITICAL_ENTER(); | ||||
|    WIZCHIP.CS._select(); | ||||
| 
 | ||||
|    AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_); | ||||
| 
 | ||||
|    //if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) 	// byte operation
 | ||||
|    if(!WIZCHIP.IF.SPI._write_burst) 	// byte operation
 | ||||
|    { | ||||
| 		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16); | ||||
| 		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8); | ||||
| 		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0); | ||||
| 		WIZCHIP.IF.SPI._write_byte(wb); | ||||
|    } | ||||
|    else									// burst operation
 | ||||
|    { | ||||
| 		spi_data[0] = (AddrSel & 0x00FF0000) >> 16; | ||||
| 		spi_data[1] = (AddrSel & 0x0000FF00) >> 8; | ||||
| 		spi_data[2] = (AddrSel & 0x000000FF) >> 0; | ||||
| 		spi_data[3] = wb; | ||||
| 		WIZCHIP.IF.SPI._write_burst(spi_data, 4); | ||||
|    } | ||||
| 
 | ||||
|    WIZCHIP.CS._deselect(); | ||||
|    WIZCHIP_CRITICAL_EXIT(); | ||||
| } | ||||
|           | ||||
| void     WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len) | ||||
| { | ||||
|    uint8_t spi_data[3]; | ||||
|    uint16_t i; | ||||
| 
 | ||||
|    WIZCHIP_CRITICAL_ENTER(); | ||||
|    WIZCHIP.CS._select(); | ||||
| 
 | ||||
|    AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_); | ||||
| 
 | ||||
|    if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) 	// byte operation
 | ||||
|    { | ||||
| 		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16); | ||||
| 		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8); | ||||
| 		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0); | ||||
| 		for(i = 0; i < len; i++) | ||||
| 		   pBuf[i] = WIZCHIP.IF.SPI._read_byte(); | ||||
|    } | ||||
|    else																// burst operation
 | ||||
|    { | ||||
| 		spi_data[0] = (AddrSel & 0x00FF0000) >> 16; | ||||
| 		spi_data[1] = (AddrSel & 0x0000FF00) >> 8; | ||||
| 		spi_data[2] = (AddrSel & 0x000000FF) >> 0; | ||||
| 		WIZCHIP.IF.SPI._write_burst(spi_data, 3); | ||||
| 		WIZCHIP.IF.SPI._read_burst(pBuf, len); | ||||
|    } | ||||
| 
 | ||||
|    WIZCHIP.CS._deselect(); | ||||
|    WIZCHIP_CRITICAL_EXIT(); | ||||
| } | ||||
| 
 | ||||
| void     WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len) | ||||
| { | ||||
|    uint8_t spi_data[3]; | ||||
|    uint16_t i; | ||||
| 
 | ||||
|    WIZCHIP_CRITICAL_ENTER(); | ||||
|    WIZCHIP.CS._select(); | ||||
| 
 | ||||
|    AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_); | ||||
| 
 | ||||
|    if(!WIZCHIP.IF.SPI._write_burst) 	// byte operation
 | ||||
|    { | ||||
| 		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16); | ||||
| 		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8); | ||||
| 		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0); | ||||
| 		for(i = 0; i < len; i++) | ||||
| 			WIZCHIP.IF.SPI._write_byte(pBuf[i]); | ||||
|    } | ||||
|    else									// burst operation
 | ||||
|    { | ||||
| 		spi_data[0] = (AddrSel & 0x00FF0000) >> 16; | ||||
| 		spi_data[1] = (AddrSel & 0x0000FF00) >> 8; | ||||
| 		spi_data[2] = (AddrSel & 0x000000FF) >> 0; | ||||
| 		WIZCHIP.IF.SPI._write_burst(spi_data, 3); | ||||
| 		WIZCHIP.IF.SPI._write_burst(pBuf, len); | ||||
|    } | ||||
| 
 | ||||
|    WIZCHIP.CS._deselect(); | ||||
|    WIZCHIP_CRITICAL_EXIT(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| uint16_t getSn_TX_FSR(uint8_t sn) | ||||
| { | ||||
|    uint16_t val=0,val1=0; | ||||
| 
 | ||||
|    do | ||||
|    { | ||||
|       val1 = WIZCHIP_READ(Sn_TX_FSR(sn)); | ||||
|       val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1)); | ||||
|       if (val1 != 0) | ||||
|       { | ||||
|         val = WIZCHIP_READ(Sn_TX_FSR(sn)); | ||||
|         val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1)); | ||||
|       } | ||||
|    }while (val != val1); | ||||
|    return val; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| uint16_t getSn_RX_RSR(uint8_t sn) | ||||
| { | ||||
|    uint16_t val=0,val1=0; | ||||
| 
 | ||||
|    do | ||||
|    { | ||||
|       val1 = WIZCHIP_READ(Sn_RX_RSR(sn)); | ||||
|       val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1)); | ||||
|       if (val1 != 0) | ||||
|       { | ||||
|         val = WIZCHIP_READ(Sn_RX_RSR(sn)); | ||||
|         val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1)); | ||||
|       } | ||||
|    }while (val != val1); | ||||
|    return val; | ||||
| } | ||||
| 
 | ||||
| void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len) | ||||
| { | ||||
|    uint16_t ptr = 0; | ||||
|    uint32_t addrsel = 0; | ||||
| 
 | ||||
|    if(len == 0)  return; | ||||
|    ptr = getSn_TX_WR(sn); | ||||
|    //M20140501 : implict type casting -> explict type casting
 | ||||
|    //addrsel = (ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
 | ||||
|    addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3); | ||||
|    //
 | ||||
|    WIZCHIP_WRITE_BUF(addrsel,wizdata, len); | ||||
|     | ||||
|    ptr += len; | ||||
|    setSn_TX_WR(sn,ptr); | ||||
| } | ||||
| 
 | ||||
| void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len) | ||||
| { | ||||
|    uint16_t ptr = 0; | ||||
|    uint32_t addrsel = 0; | ||||
|     | ||||
|    if(len == 0) return; | ||||
|    ptr = getSn_RX_RD(sn); | ||||
|    //M20140501 : implict type casting -> explict type casting
 | ||||
|    //addrsel = ((ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
 | ||||
|    addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3); | ||||
|    //
 | ||||
|    WIZCHIP_READ_BUF(addrsel, wizdata, len); | ||||
|    ptr += len; | ||||
|     | ||||
|    setSn_RX_RD(sn,ptr); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void wiz_recv_ignore(uint8_t sn, uint16_t len) | ||||
| { | ||||
|    uint16_t ptr = 0; | ||||
| 
 | ||||
|    ptr = getSn_RX_RD(sn); | ||||
|    ptr += len; | ||||
|    setSn_RX_RD(sn,ptr); | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
											
												
													File diff suppressed because it is too large
													Load Diff
												
											
										
									
								| @ -0,0 +1,930 @@ | ||||
| //*****************************************************************************
 | ||||
| //
 | ||||
| //! \file socket.c
 | ||||
| //! \brief SOCKET APIs Implements file.
 | ||||
| //! \details SOCKET APIs like as Berkeley Socket APIs. 
 | ||||
| //! \version 1.0.3
 | ||||
| //! \date 2013/10/21
 | ||||
| //! \par  Revision history
 | ||||
| //!       <2015/02/05> Notice
 | ||||
| //!        The version history is not updated after this point.
 | ||||
| //!        Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary.
 | ||||
| //!        >> https://github.com/Wiznet/ioLibrary_Driver
 | ||||
| //!       <2014/05/01> V1.0.3. Refer to M20140501
 | ||||
| //!         1. Implicit type casting -> Explicit type casting.
 | ||||
| //!         2. replace 0x01 with PACK_REMAINED in recvfrom()
 | ||||
| //!         3. Validation a destination ip in connect() & sendto(): 
 | ||||
| //!            It occurs a fatal error on converting unint32 address if uint8* addr parameter is not aligned by 4byte address.
 | ||||
| //!            Copy 4 byte addr value into temporary uint32 variable and then compares it.
 | ||||
| //!       <2013/12/20> V1.0.2 Refer to M20131220
 | ||||
| //!                    Remove Warning.
 | ||||
| //!       <2013/11/04> V1.0.1 2nd Release. Refer to "20131104".
 | ||||
| //!                    In sendto(), Add to clear timeout interrupt status (Sn_IR_TIMEOUT)
 | ||||
| //!       <2013/10/21> 1st Release
 | ||||
| //! \author MidnightCow
 | ||||
| //! \copyright
 | ||||
| //!
 | ||||
| //! Copyright (c)  2013, WIZnet Co., LTD.
 | ||||
| //! All rights reserved.
 | ||||
| //! 
 | ||||
| //! Redistribution and use in source and binary forms, with or without 
 | ||||
| //! modification, are permitted provided that the following conditions 
 | ||||
| //! are met: 
 | ||||
| //! 
 | ||||
| //!     * Redistributions of source code must retain the above copyright 
 | ||||
| //! notice, this list of conditions and the following disclaimer. 
 | ||||
| //!     * Redistributions in binary form must reproduce the above copyright
 | ||||
| //! notice, this list of conditions and the following disclaimer in the
 | ||||
| //! documentation and/or other materials provided with the distribution. 
 | ||||
| //!     * Neither the name of the <ORGANIZATION> nor the names of its 
 | ||||
| //! contributors may be used to endorse or promote products derived 
 | ||||
| //! from this software without specific prior written permission. 
 | ||||
| //! 
 | ||||
| //! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | ||||
| //! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 | ||||
| //! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | ||||
| //! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 | ||||
| //! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 | ||||
| //! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 | ||||
| //! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | ||||
| //! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 | ||||
| //! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 | ||||
| //! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 | ||||
| //! THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| //*****************************************************************************
 | ||||
| #include "socket.h" | ||||
| 
 | ||||
| //M20150401 : Typing Error
 | ||||
| //#define SOCK_ANY_PORT_NUM  0xC000;
 | ||||
| #define SOCK_ANY_PORT_NUM  0xC000 | ||||
| 
 | ||||
| static uint16_t sock_any_port = SOCK_ANY_PORT_NUM; | ||||
| static uint16_t sock_io_mode = 0; | ||||
| static uint16_t sock_is_sending = 0; | ||||
| 
 | ||||
| static uint16_t sock_remained_size[_WIZCHIP_SOCK_NUM_] = {0,0,}; | ||||
| 
 | ||||
| //M20150601 : For extern decleation
 | ||||
| //static uint8_t  sock_pack_info[_WIZCHIP_SOCK_NUM_] = {0,};
 | ||||
| uint8_t  sock_pack_info[_WIZCHIP_SOCK_NUM_] = {0,}; | ||||
| //
 | ||||
| 
 | ||||
| #if _WIZCHIP_ == 5200 | ||||
|    static uint16_t sock_next_rd[_WIZCHIP_SOCK_NUM_] ={0,}; | ||||
| #endif | ||||
| 
 | ||||
| //A20150601 : For integrating with W5300
 | ||||
| #if _WIZCHIP_ == 5300 | ||||
|    uint8_t sock_remained_byte[_WIZCHIP_SOCK_NUM_] = {0,}; // set by wiz_recv_data()
 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| #define CHECK_SOCKNUM()   \ | ||||
|    do{                    \ | ||||
|       if(sn > _WIZCHIP_SOCK_NUM_) return SOCKERR_SOCKNUM;   \ | ||||
|    }while(0);             \ | ||||
| 
 | ||||
| #define CHECK_SOCKMODE(mode)  \ | ||||
|    do{                     \ | ||||
|       if((getSn_MR(sn) & 0x0F) != mode) return SOCKERR_SOCKMODE;  \ | ||||
|    }while(0);              \ | ||||
| 
 | ||||
| #define CHECK_SOCKINIT()   \ | ||||
|    do{                     \ | ||||
|       if((getSn_SR(sn) != SOCK_INIT)) return SOCKERR_SOCKINIT; \ | ||||
|    }while(0);              \ | ||||
| 
 | ||||
| #define CHECK_SOCKDATA()   \ | ||||
|    do{                     \ | ||||
|       if(len == 0) return SOCKERR_DATALEN;   \ | ||||
|    }while(0);              \ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag) | ||||
| { | ||||
| 	CHECK_SOCKNUM(); | ||||
| 	switch(protocol) | ||||
| 	{ | ||||
|       case Sn_MR_TCP : | ||||
|          { | ||||
|             //M20150601 : Fixed the warning - taddr will never be NULL
 | ||||
| 		    /*
 | ||||
|             uint8_t taddr[4]; | ||||
|             getSIPR(taddr); | ||||
|             */ | ||||
|             uint32_t taddr; | ||||
|             getSIPR((uint8_t*)&taddr); | ||||
|             if(taddr == 0) return SOCKERR_SOCKINIT; | ||||
|          } | ||||
|       case Sn_MR_UDP : | ||||
|       case Sn_MR_MACRAW : | ||||
| 	  case Sn_MR_IPRAW : | ||||
|          break; | ||||
|    #if ( _WIZCHIP_ < 5200 ) | ||||
|       case Sn_MR_PPPoE : | ||||
|          break; | ||||
|    #endif | ||||
|       default : | ||||
|          return SOCKERR_SOCKMODE; | ||||
| 	} | ||||
| 	//M20150601 : For SF_TCP_ALIGN & W5300
 | ||||
| 	//if((flag & 0x06) != 0) return SOCKERR_SOCKFLAG;
 | ||||
| 	if((flag & 0x04) != 0) return SOCKERR_SOCKFLAG; | ||||
| #if _WIZCHIP_ == 5200 | ||||
|    if(flag & 0x10) return SOCKERR_SOCKFLAG; | ||||
| #endif | ||||
| 	    | ||||
| 	if(flag != 0) | ||||
| 	{ | ||||
|    	switch(protocol) | ||||
|    	{ | ||||
|    	   case Sn_MR_TCP: | ||||
|    		  //M20150601 :  For SF_TCP_ALIGN & W5300
 | ||||
|           #if _WIZCHIP_ == 5300 | ||||
|    		     if((flag & (SF_TCP_NODELAY|SF_IO_NONBLOCK|SF_TCP_ALIGN))==0) return SOCKERR_SOCKFLAG; | ||||
|           #else | ||||
|    		     if((flag & (SF_TCP_NODELAY|SF_IO_NONBLOCK))==0) return SOCKERR_SOCKFLAG; | ||||
|           #endif | ||||
| 
 | ||||
|    	      break; | ||||
|    	   case Sn_MR_UDP: | ||||
|    	      if(flag & SF_IGMP_VER2) | ||||
|    	      { | ||||
|    	         if((flag & SF_MULTI_ENABLE)==0) return SOCKERR_SOCKFLAG; | ||||
|    	      } | ||||
|    	      #if _WIZCHIP_ == 5500 | ||||
|       	      if(flag & SF_UNI_BLOCK) | ||||
|       	      { | ||||
|       	         if((flag & SF_MULTI_ENABLE) == 0) return SOCKERR_SOCKFLAG; | ||||
|       	      } | ||||
|    	      #endif | ||||
|    	      break; | ||||
|    	   default: | ||||
|    	      break; | ||||
|    	} | ||||
|    } | ||||
| 	close(sn); | ||||
| 	//M20150601
 | ||||
| 	#if _WIZCHIP_ == 5300 | ||||
| 	   setSn_MR(sn, ((uint16_t)(protocol | (flag & 0xF0))) | (((uint16_t)(flag & 0x02)) << 7) ); | ||||
|     #else | ||||
| 	   setSn_MR(sn, (protocol | (flag & 0xF0))); | ||||
|     #endif | ||||
| 	if(!port) | ||||
| 	{ | ||||
| 	   port = sock_any_port++; | ||||
| 	   if(sock_any_port == 0xFFF0) sock_any_port = SOCK_ANY_PORT_NUM; | ||||
| 	} | ||||
|    setSn_PORT(sn,port);	 | ||||
|    setSn_CR(sn,Sn_CR_OPEN); | ||||
|    while(getSn_CR(sn)); | ||||
|    //A20150401 : For release the previous sock_io_mode
 | ||||
|    sock_io_mode &= ~(1 <<sn); | ||||
|    //
 | ||||
| 	sock_io_mode |= ((flag & SF_IO_NONBLOCK) << sn);    | ||||
|    sock_is_sending &= ~(1<<sn); | ||||
|    sock_remained_size[sn] = 0; | ||||
|    //M20150601 : repalce 0 with PACK_COMPLETED
 | ||||
|    //sock_pack_info[sn] = 0;
 | ||||
|    sock_pack_info[sn] = PACK_COMPLETED; | ||||
|    //
 | ||||
|    while(getSn_SR(sn) == SOCK_CLOSED); | ||||
|    return (int8_t)sn; | ||||
| }	    | ||||
| 
 | ||||
| int8_t close(uint8_t sn) | ||||
| { | ||||
| 	CHECK_SOCKNUM(); | ||||
| //A20160426 : Applied the erratum 1 of W5300
 | ||||
| #if   (_WIZCHIP_ == 5300)  | ||||
|    //M20160503 : Wrong socket parameter. s -> sn 
 | ||||
|    //if( ((getSn_MR(s)& 0x0F) == Sn_MR_TCP) && (getSn_TX_FSR(s) != getSn_TxMAX(s)) ) 
 | ||||
|    if( ((getSn_MR(sn)& 0x0F) == Sn_MR_TCP) && (getSn_TX_FSR(sn) != getSn_TxMAX(sn)) )  | ||||
|    {  | ||||
|       uint8_t destip[4] = {0, 0, 0, 1}; | ||||
|       // TODO
 | ||||
|       // You can wait for completing to sending data;
 | ||||
|       // wait about 1 second;
 | ||||
|       // if you have completed to send data, skip the code of erratum 1
 | ||||
|       // ex> wait_1s();
 | ||||
|       //     if (getSn_TX_FSR(s) == getSn_TxMAX(s)) continue;
 | ||||
|       // 
 | ||||
|       //M20160503 : The socket() of close() calls close() itself again. It occures a infinite loop - close()->socket()->close()->socket()-> ~
 | ||||
|       //socket(s,Sn_MR_UDP,0x3000,0);
 | ||||
|       //sendto(s,destip,1,destip,0x3000); // send the dummy data to an unknown destination(0.0.0.1).
 | ||||
|       setSn_MR(sn,Sn_MR_UDP); | ||||
|       setSn_PORTR(sn, 0x3000); | ||||
|       setSn_CR(sn,Sn_CR_OPEN); | ||||
|       while(getSn_CR(sn) != 0); | ||||
|       while(getSn_SR(sn) != SOCK_UDP); | ||||
|       sendto(sn,destip,1,destip,0x3000); // send the dummy data to an unknown destination(0.0.0.1).
 | ||||
|    };    | ||||
| #endif  | ||||
| 	setSn_CR(sn,Sn_CR_CLOSE); | ||||
|    /* wait to process the command... */ | ||||
| 	while( getSn_CR(sn) ); | ||||
| 	/* clear all interrupt of the socket. */ | ||||
| 	setSn_IR(sn, 0xFF); | ||||
| 	//A20150401 : Release the sock_io_mode of socket n.
 | ||||
| 	sock_io_mode &= ~(1<<sn); | ||||
| 	//
 | ||||
| 	sock_is_sending &= ~(1<<sn); | ||||
| 	sock_remained_size[sn] = 0; | ||||
| 	sock_pack_info[sn] = 0; | ||||
| 	while(getSn_SR(sn) != SOCK_CLOSED); | ||||
| 	return SOCK_OK; | ||||
| } | ||||
| 
 | ||||
| int8_t listen(uint8_t sn) | ||||
| { | ||||
| 	CHECK_SOCKNUM(); | ||||
|    CHECK_SOCKMODE(Sn_MR_TCP); | ||||
| 	CHECK_SOCKINIT(); | ||||
| 	setSn_CR(sn,Sn_CR_LISTEN); | ||||
| 	while(getSn_CR(sn)); | ||||
|    while(getSn_SR(sn) != SOCK_LISTEN) | ||||
|    { | ||||
|          close(sn); | ||||
|          return SOCKERR_SOCKCLOSED; | ||||
|    } | ||||
|    return SOCK_OK; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int8_t connect(uint8_t sn, uint8_t * addr, uint16_t port) | ||||
| { | ||||
|    CHECK_SOCKNUM(); | ||||
|    CHECK_SOCKMODE(Sn_MR_TCP); | ||||
|    CHECK_SOCKINIT(); | ||||
|    //M20140501 : For avoiding fatal error on memory align mismatched
 | ||||
|    //if( *((uint32_t*)addr) == 0xFFFFFFFF || *((uint32_t*)addr) == 0) return SOCKERR_IPINVALID;
 | ||||
|    { | ||||
|       uint32_t taddr; | ||||
|       taddr = ((uint32_t)addr[0] & 0x000000FF); | ||||
|       taddr = (taddr << 8) + ((uint32_t)addr[1] & 0x000000FF); | ||||
|       taddr = (taddr << 8) + ((uint32_t)addr[2] & 0x000000FF); | ||||
|       taddr = (taddr << 8) + ((uint32_t)addr[3] & 0x000000FF); | ||||
|       if( taddr == 0xFFFFFFFF || taddr == 0) return SOCKERR_IPINVALID; | ||||
|    } | ||||
|    //
 | ||||
| 	 | ||||
| 	if(port == 0) return SOCKERR_PORTZERO; | ||||
| 	setSn_DIPR(sn,addr); | ||||
| 	setSn_DPORT(sn,port); | ||||
| 	setSn_CR(sn,Sn_CR_CONNECT); | ||||
|    while(getSn_CR(sn)); | ||||
|    if(sock_io_mode & (1<<sn)) return SOCK_BUSY; | ||||
|    while(getSn_SR(sn) != SOCK_ESTABLISHED) | ||||
|    { | ||||
| 		if (getSn_IR(sn) & Sn_IR_TIMEOUT) | ||||
| 		{ | ||||
| 			setSn_IR(sn, Sn_IR_TIMEOUT); | ||||
|             return SOCKERR_TIMEOUT; | ||||
| 		} | ||||
| 
 | ||||
| 		if (getSn_SR(sn) == SOCK_CLOSED) | ||||
| 		{ | ||||
| 			return SOCKERR_SOCKCLOSED; | ||||
| 		} | ||||
| 	} | ||||
|     | ||||
|    return SOCK_OK; | ||||
| } | ||||
| 
 | ||||
| int8_t disconnect(uint8_t sn) | ||||
| { | ||||
|    CHECK_SOCKNUM(); | ||||
|    CHECK_SOCKMODE(Sn_MR_TCP); | ||||
| 	setSn_CR(sn,Sn_CR_DISCON); | ||||
| 	/* wait to process the command... */ | ||||
| 	while(getSn_CR(sn)); | ||||
| 	sock_is_sending &= ~(1<<sn); | ||||
|    if(sock_io_mode & (1<<sn)) return SOCK_BUSY; | ||||
| 	while(getSn_SR(sn) != SOCK_CLOSED) | ||||
| 	{ | ||||
| 	   if(getSn_IR(sn) & Sn_IR_TIMEOUT) | ||||
| 	   { | ||||
| 	      close(sn); | ||||
| 	      return SOCKERR_TIMEOUT; | ||||
| 	   } | ||||
| 	} | ||||
| 	return SOCK_OK; | ||||
| } | ||||
| 
 | ||||
| int32_t send(uint8_t sn, uint8_t * buf, uint16_t len) | ||||
| { | ||||
|    uint8_t tmp=0; | ||||
|    uint16_t freesize=0; | ||||
|     | ||||
|    CHECK_SOCKNUM(); | ||||
|    CHECK_SOCKMODE(Sn_MR_TCP); | ||||
|    CHECK_SOCKDATA(); | ||||
|    tmp = getSn_SR(sn); | ||||
|    if(tmp != SOCK_ESTABLISHED && tmp != SOCK_CLOSE_WAIT) return SOCKERR_SOCKSTATUS; | ||||
|    if( sock_is_sending & (1<<sn) ) | ||||
|    { | ||||
|       tmp = getSn_IR(sn); | ||||
|       if(tmp & Sn_IR_SENDOK) | ||||
|       { | ||||
|          setSn_IR(sn, Sn_IR_SENDOK); | ||||
|          //M20150401 : Typing Error
 | ||||
|          //#if _WZICHIP_ == 5200
 | ||||
|          #if _WIZCHIP_ == 5200 | ||||
|             if(getSn_TX_RD(sn) != sock_next_rd[sn]) | ||||
|             { | ||||
|                setSn_CR(sn,Sn_CR_SEND); | ||||
|                while(getSn_CR(sn)); | ||||
|                return SOCK_BUSY; | ||||
|             } | ||||
|          #endif | ||||
|          sock_is_sending &= ~(1<<sn);          | ||||
|       } | ||||
|       else if(tmp & Sn_IR_TIMEOUT) | ||||
|       { | ||||
|          close(sn); | ||||
|          return SOCKERR_TIMEOUT; | ||||
|       } | ||||
|       else return SOCK_BUSY; | ||||
|    } | ||||
|    freesize = getSn_TxMAX(sn); | ||||
|    if (len > freesize) len = freesize; // check size not to exceed MAX size.
 | ||||
|    while(1) | ||||
|    { | ||||
|       freesize = getSn_TX_FSR(sn); | ||||
|       tmp = getSn_SR(sn); | ||||
|       if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT)) | ||||
|       { | ||||
|          close(sn); | ||||
|          return SOCKERR_SOCKSTATUS; | ||||
|       } | ||||
|       if( (sock_io_mode & (1<<sn)) && (len > freesize) ) return SOCK_BUSY; | ||||
|       if(len <= freesize) break; | ||||
|    } | ||||
|    wiz_send_data(sn, buf, len); | ||||
|    #if _WIZCHIP_ == 5200 | ||||
|       sock_next_rd[sn] = getSn_TX_RD(sn) + len; | ||||
|    #endif | ||||
| 
 | ||||
|    #if _WIZCHIP_ == 5300 | ||||
|       setSn_TX_WRSR(sn,len); | ||||
|    #endif | ||||
|     | ||||
|    setSn_CR(sn,Sn_CR_SEND); | ||||
|    /* wait to process the command... */ | ||||
|    while(getSn_CR(sn)); | ||||
|    sock_is_sending |= (1 << sn); | ||||
|    //M20150409 : Explicit Type Casting
 | ||||
|    //return len;
 | ||||
|    return (int32_t)len; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len) | ||||
| { | ||||
|    uint8_t  tmp = 0; | ||||
|    uint16_t recvsize = 0; | ||||
| //A20150601 : For integarating with W5300
 | ||||
| #if   _WIZCHIP_ == 5300 | ||||
|    uint8_t head[2]; | ||||
|    uint16_t mr; | ||||
| #endif | ||||
| //
 | ||||
|    CHECK_SOCKNUM(); | ||||
|    CHECK_SOCKMODE(Sn_MR_TCP); | ||||
|    CHECK_SOCKDATA(); | ||||
|     | ||||
|    recvsize = getSn_RxMAX(sn); | ||||
|    if(recvsize < len) len = recvsize; | ||||
|        | ||||
| //A20150601 : For Integrating with W5300
 | ||||
| #if _WIZCHIP_ == 5300 | ||||
|    //sock_pack_info[sn] = PACK_COMPLETED;    // for clear      
 | ||||
|    if(sock_remained_size[sn] == 0) | ||||
|    { | ||||
| #endif | ||||
| //
 | ||||
|       while(1) | ||||
|       { | ||||
|          recvsize = getSn_RX_RSR(sn); | ||||
|          tmp = getSn_SR(sn); | ||||
|          if (tmp != SOCK_ESTABLISHED) | ||||
|          { | ||||
|             if(tmp == SOCK_CLOSE_WAIT) | ||||
|             { | ||||
|                if(recvsize != 0) break; | ||||
|                else if(getSn_TX_FSR(sn) == getSn_TxMAX(sn)) | ||||
|                { | ||||
|                   close(sn); | ||||
|                   return SOCKERR_SOCKSTATUS; | ||||
|                } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                close(sn); | ||||
|                return SOCKERR_SOCKSTATUS; | ||||
|             } | ||||
|          } | ||||
|          if((sock_io_mode & (1<<sn)) && (recvsize == 0)) return SOCK_BUSY; | ||||
|          if(recvsize != 0) break; | ||||
|       }; | ||||
| #if _WIZCHIP_ == 5300 | ||||
|    } | ||||
| #endif | ||||
| 
 | ||||
| //A20150601 : For integrating with W5300
 | ||||
| #if _WIZCHIP_ == 5300 | ||||
|    if((sock_remained_size[sn] == 0) || (getSn_MR(sn) & Sn_MR_ALIGN)) | ||||
|    { | ||||
|       mr = getMR(); | ||||
|       if((getSn_MR(sn) & Sn_MR_ALIGN)==0) | ||||
|       { | ||||
|          wiz_recv_data(sn,head,2); | ||||
|          if(mr & MR_FS) | ||||
|             recvsize = (((uint16_t)head[1]) << 8) | ((uint16_t)head[0]); | ||||
|          else | ||||
|             recvsize = (((uint16_t)head[0]) << 8) | ((uint16_t)head[1]); | ||||
|          sock_pack_info[sn] = PACK_FIRST; | ||||
|       } | ||||
|       sock_remained_size[sn] = recvsize; | ||||
|    } | ||||
|    if(len > sock_remained_size[sn]) len = sock_remained_size[sn]; | ||||
|    recvsize = len;    | ||||
|    if(sock_pack_info[sn] & PACK_FIFOBYTE) | ||||
|    { | ||||
|       *buf = sock_remained_byte[sn]; | ||||
|       buf++; | ||||
|       sock_pack_info[sn] &= ~(PACK_FIFOBYTE); | ||||
|       recvsize -= 1; | ||||
|       sock_remained_size[sn] -= 1; | ||||
|    } | ||||
|    if(recvsize != 0) | ||||
|    { | ||||
|       wiz_recv_data(sn, buf, recvsize); | ||||
|       setSn_CR(sn,Sn_CR_RECV); | ||||
|       while(getSn_CR(sn)); | ||||
|    } | ||||
|    sock_remained_size[sn] -= recvsize; | ||||
|    if(sock_remained_size[sn] != 0) | ||||
|    { | ||||
|       sock_pack_info[sn] |= PACK_REMAINED; | ||||
|       if(recvsize & 0x1) sock_pack_info[sn] |= PACK_FIFOBYTE; | ||||
|    } | ||||
|    else sock_pack_info[sn] = PACK_COMPLETED; | ||||
|    if(getSn_MR(sn) & Sn_MR_ALIGN) sock_remained_size[sn] = 0; | ||||
|    //len = recvsize;
 | ||||
| #else    | ||||
|    if(recvsize < len) len = recvsize;    | ||||
|    wiz_recv_data(sn, buf, len); | ||||
|    setSn_CR(sn,Sn_CR_RECV); | ||||
|    while(getSn_CR(sn)); | ||||
| #endif | ||||
|       | ||||
|    //M20150409 : Explicit Type Casting
 | ||||
|    //return len;
 | ||||
|    return (int32_t)len; | ||||
| } | ||||
| 
 | ||||
| int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port) | ||||
| { | ||||
|    uint8_t tmp = 0; | ||||
|    uint16_t freesize = 0; | ||||
|    uint32_t taddr; | ||||
| 
 | ||||
|    CHECK_SOCKNUM(); | ||||
|    switch(getSn_MR(sn) & 0x0F) | ||||
|    { | ||||
|       case Sn_MR_UDP: | ||||
|       case Sn_MR_MACRAW: | ||||
| //         break;
 | ||||
| //   #if ( _WIZCHIP_ < 5200 )
 | ||||
|       case Sn_MR_IPRAW: | ||||
|          break; | ||||
| //   #endif
 | ||||
|       default: | ||||
|          return SOCKERR_SOCKMODE; | ||||
|    } | ||||
|    CHECK_SOCKDATA(); | ||||
|    //M20140501 : For avoiding fatal error on memory align mismatched
 | ||||
|    //if(*((uint32_t*)addr) == 0) return SOCKERR_IPINVALID;
 | ||||
|    //{
 | ||||
|       //uint32_t taddr;
 | ||||
|       taddr = ((uint32_t)addr[0]) & 0x000000FF; | ||||
|       taddr = (taddr << 8) + ((uint32_t)addr[1] & 0x000000FF); | ||||
|       taddr = (taddr << 8) + ((uint32_t)addr[2] & 0x000000FF); | ||||
|       taddr = (taddr << 8) + ((uint32_t)addr[3] & 0x000000FF); | ||||
|    //}
 | ||||
|    //
 | ||||
|    //if(*((uint32_t*)addr) == 0) return SOCKERR_IPINVALID;
 | ||||
|    if((taddr == 0) && ((getSn_MR(sn)&Sn_MR_MACRAW) != Sn_MR_MACRAW)) return SOCKERR_IPINVALID; | ||||
|    if((port  == 0) && ((getSn_MR(sn)&Sn_MR_MACRAW) != Sn_MR_MACRAW)) return SOCKERR_PORTZERO; | ||||
|    tmp = getSn_SR(sn); | ||||
| //#if ( _WIZCHIP_ < 5200 )
 | ||||
|    if((tmp != SOCK_MACRAW) && (tmp != SOCK_UDP) && (tmp != SOCK_IPRAW)) return SOCKERR_SOCKSTATUS; | ||||
| //#else
 | ||||
| //   if(tmp != SOCK_MACRAW && tmp != SOCK_UDP) return SOCKERR_SOCKSTATUS;
 | ||||
| //#endif
 | ||||
|        | ||||
|    setSn_DIPR(sn,addr); | ||||
|    setSn_DPORT(sn,port);       | ||||
|    freesize = getSn_TxMAX(sn); | ||||
|    if (len > freesize) len = freesize; // check size not to exceed MAX size.
 | ||||
|    while(1) | ||||
|    { | ||||
|       freesize = getSn_TX_FSR(sn); | ||||
|       if(getSn_SR(sn) == SOCK_CLOSED) return SOCKERR_SOCKCLOSED; | ||||
|       if( (sock_io_mode & (1<<sn)) && (len > freesize) ) return SOCK_BUSY; | ||||
|       if(len <= freesize) break; | ||||
|    }; | ||||
| 	wiz_send_data(sn, buf, len); | ||||
| 
 | ||||
|    #if _WIZCHIP_ < 5500   //M20150401 : for WIZCHIP Errata #4, #5 (ARP errata)
 | ||||
|       getSIPR((uint8_t*)&taddr); | ||||
|       if(taddr == 0) | ||||
|       { | ||||
|          getSUBR((uint8_t*)&taddr); | ||||
|          setSUBR((uint8_t*)"\x00\x00\x00\x00"); | ||||
|       } | ||||
|       else taddr = 0; | ||||
|    #endif | ||||
| 
 | ||||
| //A20150601 : For W5300
 | ||||
| #if _WIZCHIP_ == 5300 | ||||
|    setSn_TX_WRSR(sn, len); | ||||
| #endif | ||||
| //   
 | ||||
| 	setSn_CR(sn,Sn_CR_SEND); | ||||
| 	/* wait to process the command... */ | ||||
| 	while(getSn_CR(sn)); | ||||
|    while(1) | ||||
|    { | ||||
|       tmp = getSn_IR(sn); | ||||
|       if(tmp & Sn_IR_SENDOK) | ||||
|       { | ||||
|          setSn_IR(sn, Sn_IR_SENDOK); | ||||
|          break; | ||||
|       } | ||||
|       //M:20131104
 | ||||
|       //else if(tmp & Sn_IR_TIMEOUT) return SOCKERR_TIMEOUT;
 | ||||
|       else if(tmp & Sn_IR_TIMEOUT) | ||||
|       { | ||||
|          setSn_IR(sn, Sn_IR_TIMEOUT); | ||||
|          //M20150409 : Fixed the lost of sign bits by type casting.
 | ||||
|          //len = (uint16_t)SOCKERR_TIMEOUT;
 | ||||
|          //break;
 | ||||
|          #if _WIZCHIP_ < 5500   //M20150401 : for WIZCHIP Errata #4, #5 (ARP errata)
 | ||||
|             if(taddr) setSUBR((uint8_t*)&taddr); | ||||
|          #endif | ||||
|          return SOCKERR_TIMEOUT; | ||||
|       } | ||||
|       ////////////
 | ||||
|    } | ||||
|    #if _WIZCHIP_ < 5500   //M20150401 : for WIZCHIP Errata #4, #5 (ARP errata)
 | ||||
|       if(taddr) setSUBR((uint8_t*)&taddr); | ||||
|    #endif | ||||
|    //M20150409 : Explicit Type Casting
 | ||||
|    //return len;
 | ||||
|    return (int32_t)len; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port) | ||||
| { | ||||
| //M20150601 : For W5300   
 | ||||
| #if _WIZCHIP_ == 5300 | ||||
|    uint16_t mr; | ||||
|    uint16_t mr1; | ||||
| #else    | ||||
|    uint8_t  mr; | ||||
| #endif | ||||
| //   
 | ||||
|    uint8_t  head[8]; | ||||
| 	uint16_t pack_len=0; | ||||
| 
 | ||||
|    CHECK_SOCKNUM(); | ||||
|    //CHECK_SOCKMODE(Sn_MR_UDP);
 | ||||
| //A20150601
 | ||||
| #if _WIZCHIP_ == 5300 | ||||
|    mr1 = getMR(); | ||||
| #endif    | ||||
| 
 | ||||
|    switch((mr=getSn_MR(sn)) & 0x0F) | ||||
|    { | ||||
|       case Sn_MR_UDP: | ||||
| 	  case Sn_MR_IPRAW: | ||||
|       case Sn_MR_MACRAW: | ||||
|          break; | ||||
|    #if ( _WIZCHIP_ < 5200 )          | ||||
|       case Sn_MR_PPPoE: | ||||
|          break; | ||||
|    #endif | ||||
|       default: | ||||
|          return SOCKERR_SOCKMODE; | ||||
|    } | ||||
|    CHECK_SOCKDATA(); | ||||
|    if(sock_remained_size[sn] == 0) | ||||
|    { | ||||
|       while(1) | ||||
|       { | ||||
|          pack_len = getSn_RX_RSR(sn); | ||||
|          if(getSn_SR(sn) == SOCK_CLOSED) return SOCKERR_SOCKCLOSED; | ||||
|          if( (sock_io_mode & (1<<sn)) && (pack_len == 0) ) return SOCK_BUSY; | ||||
|          if(pack_len != 0) break; | ||||
|       }; | ||||
|    } | ||||
| //D20150601 : Move it to bottom
 | ||||
| // sock_pack_info[sn] = PACK_COMPLETED;
 | ||||
| 	switch (mr & 0x07) | ||||
| 	{ | ||||
| 	   case Sn_MR_UDP : | ||||
| 	      if(sock_remained_size[sn] == 0) | ||||
| 	      { | ||||
|    			wiz_recv_data(sn, head, 8); | ||||
|    			setSn_CR(sn,Sn_CR_RECV); | ||||
|    			while(getSn_CR(sn)); | ||||
|    			// read peer's IP address, port number & packet length
 | ||||
|    	   //A20150601 : For W5300
 | ||||
|    		#if _WIZCHIP_ == 5300 | ||||
|    		   if(mr1 & MR_FS) | ||||
|    		   { | ||||
|    		      addr[0] = head[1]; | ||||
|    		      addr[1] = head[0]; | ||||
|    		      addr[2] = head[3]; | ||||
|    		      addr[3] = head[2]; | ||||
|    		      *port = head[5]; | ||||
|    		      *port = (*port << 8) + head[4]; | ||||
|       			sock_remained_size[sn] = head[7]; | ||||
|       			sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[6]; | ||||
|    		   } | ||||
|             else | ||||
|             { | ||||
|          #endif | ||||
|                addr[0] = head[0]; | ||||
|       			addr[1] = head[1]; | ||||
|       			addr[2] = head[2]; | ||||
|       			addr[3] = head[3]; | ||||
|       			*port = head[4]; | ||||
|       			*port = (*port << 8) + head[5]; | ||||
|       			sock_remained_size[sn] = head[6]; | ||||
|       			sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[7]; | ||||
|          #if _WIZCHIP_ == 5300 | ||||
|             } | ||||
|          #endif | ||||
|    			sock_pack_info[sn] = PACK_FIRST; | ||||
|    	   } | ||||
| 			if(len < sock_remained_size[sn]) pack_len = len; | ||||
| 			else pack_len = sock_remained_size[sn]; | ||||
| 			//A20150601 : For W5300
 | ||||
| 			len = pack_len; | ||||
| 			#if _WIZCHIP_ == 5300 | ||||
| 			   if(sock_pack_info[sn] & PACK_FIFOBYTE) | ||||
| 			   { | ||||
| 			      *buf++ = sock_remained_byte[sn]; | ||||
| 			      pack_len -= 1; | ||||
| 			      sock_remained_size[sn] -= 1; | ||||
| 			      sock_pack_info[sn] &= ~PACK_FIFOBYTE; | ||||
| 			   } | ||||
| 			#endif | ||||
| 			//
 | ||||
| 			// Need to packet length check (default 1472)
 | ||||
| 			//
 | ||||
|    		wiz_recv_data(sn, buf, pack_len); // data copy.
 | ||||
| 			break; | ||||
| 	   case Sn_MR_MACRAW : | ||||
| 	      if(sock_remained_size[sn] == 0) | ||||
| 	      { | ||||
|    			wiz_recv_data(sn, head, 2); | ||||
|    			setSn_CR(sn,Sn_CR_RECV); | ||||
|    			while(getSn_CR(sn)); | ||||
|    			// read peer's IP address, port number & packet length
 | ||||
|     			sock_remained_size[sn] = head[0]; | ||||
|    			sock_remained_size[sn] = (sock_remained_size[sn] <<8) + head[1] -2; | ||||
|    			#if _WIZCHIP_ == W5300 | ||||
|    			if(sock_remained_size[sn] & 0x01) | ||||
|    				sock_remained_size[sn] = sock_remained_size[sn] + 1 - 4; | ||||
|    			else | ||||
|    				sock_remained_size[sn] -= 4; | ||||
| 			#endif | ||||
|    			if(sock_remained_size[sn] > 1514)  | ||||
|    			{ | ||||
|    			   close(sn); | ||||
|    			   return SOCKFATAL_PACKLEN; | ||||
|    			} | ||||
|    			sock_pack_info[sn] = PACK_FIRST; | ||||
|    	   } | ||||
| 			if(len < sock_remained_size[sn]) pack_len = len; | ||||
| 			else pack_len = sock_remained_size[sn]; | ||||
| 			wiz_recv_data(sn,buf,pack_len); | ||||
| 		   break; | ||||
|    //#if ( _WIZCHIP_ < 5200 )
 | ||||
| 		case Sn_MR_IPRAW: | ||||
| 		   if(sock_remained_size[sn] == 0) | ||||
| 		   { | ||||
|    			wiz_recv_data(sn, head, 6); | ||||
|    			setSn_CR(sn,Sn_CR_RECV); | ||||
|    			while(getSn_CR(sn)); | ||||
|    			addr[0] = head[0]; | ||||
|    			addr[1] = head[1]; | ||||
|    			addr[2] = head[2]; | ||||
|    			addr[3] = head[3]; | ||||
|    			sock_remained_size[sn] = head[4]; | ||||
|    			//M20150401 : For Typing Error
 | ||||
|    			//sock_remaiend_size[sn] = (sock_remained_size[sn] << 8) + head[5];
 | ||||
|    			sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[5]; | ||||
|    			sock_pack_info[sn] = PACK_FIRST; | ||||
|          } | ||||
| 			//
 | ||||
| 			// Need to packet length check
 | ||||
| 			//
 | ||||
| 			if(len < sock_remained_size[sn]) pack_len = len; | ||||
| 			else pack_len = sock_remained_size[sn]; | ||||
|    		wiz_recv_data(sn, buf, pack_len); // data copy.
 | ||||
| 			break; | ||||
|    //#endif
 | ||||
|       default: | ||||
|          wiz_recv_ignore(sn, pack_len); // data copy.
 | ||||
|          sock_remained_size[sn] = pack_len; | ||||
|          break; | ||||
|    } | ||||
| 	setSn_CR(sn,Sn_CR_RECV); | ||||
| 	/* wait to process the command... */ | ||||
| 	while(getSn_CR(sn)) ; | ||||
| 	sock_remained_size[sn] -= pack_len; | ||||
| 	//M20150601 : 
 | ||||
| 	//if(sock_remained_size[sn] != 0) sock_pack_info[sn] |= 0x01;
 | ||||
| 	if(sock_remained_size[sn] != 0) | ||||
| 	{ | ||||
| 	   sock_pack_info[sn] |= PACK_REMAINED; | ||||
|    #if _WIZCHIP_ == 5300	    | ||||
| 	   if(pack_len & 0x01) sock_pack_info[sn] |= PACK_FIFOBYTE; | ||||
|    #endif	       | ||||
| 	} | ||||
| 	else sock_pack_info[sn] = PACK_COMPLETED; | ||||
| #if _WIZCHIP_ == 5300	    | ||||
|    pack_len = len; | ||||
| #endif | ||||
|    //
 | ||||
|    //M20150409 : Explicit Type Casting
 | ||||
|    //return pack_len;
 | ||||
|    return (int32_t)pack_len; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int8_t  ctlsocket(uint8_t sn, ctlsock_type cstype, void* arg) | ||||
| { | ||||
|    uint8_t tmp = 0; | ||||
|    CHECK_SOCKNUM(); | ||||
|    switch(cstype) | ||||
|    { | ||||
|       case CS_SET_IOMODE: | ||||
|          tmp = *((uint8_t*)arg); | ||||
|          if(tmp == SOCK_IO_NONBLOCK)  sock_io_mode |= (1<<sn); | ||||
|          else if(tmp == SOCK_IO_BLOCK) sock_io_mode &= ~(1<<sn); | ||||
|          else return SOCKERR_ARG; | ||||
|          break; | ||||
|       case CS_GET_IOMODE:    | ||||
|          //M20140501 : implict type casting -> explict type casting
 | ||||
|          //*((uint8_t*)arg) = (sock_io_mode >> sn) & 0x0001;
 | ||||
|          *((uint8_t*)arg) = (uint8_t)((sock_io_mode >> sn) & 0x0001); | ||||
|          //
 | ||||
|          break; | ||||
|       case CS_GET_MAXTXBUF: | ||||
|          *((uint16_t*)arg) = getSn_TxMAX(sn); | ||||
|          break; | ||||
|       case CS_GET_MAXRXBUF:     | ||||
|          *((uint16_t*)arg) = getSn_RxMAX(sn); | ||||
|          break; | ||||
|       case CS_CLR_INTERRUPT: | ||||
|          if( (*(uint8_t*)arg) > SIK_ALL) return SOCKERR_ARG; | ||||
|          setSn_IR(sn,*(uint8_t*)arg); | ||||
|          break; | ||||
|       case CS_GET_INTERRUPT: | ||||
|          *((uint8_t*)arg) = getSn_IR(sn); | ||||
|          break; | ||||
|    #if _WIZCHIP_ != 5100 | ||||
|       case CS_SET_INTMASK:   | ||||
|          if( (*(uint8_t*)arg) > SIK_ALL) return SOCKERR_ARG; | ||||
|          setSn_IMR(sn,*(uint8_t*)arg); | ||||
|          break; | ||||
|       case CS_GET_INTMASK:    | ||||
|          *((uint8_t*)arg) = getSn_IMR(sn); | ||||
|          break; | ||||
|    #endif | ||||
|       default: | ||||
|          return SOCKERR_ARG; | ||||
|    } | ||||
|    return SOCK_OK; | ||||
| } | ||||
| 
 | ||||
| int8_t  setsockopt(uint8_t sn, sockopt_type sotype, void* arg) | ||||
| { | ||||
|  // M20131220 : Remove warning
 | ||||
|  //uint8_t tmp;
 | ||||
|    CHECK_SOCKNUM(); | ||||
|    switch(sotype) | ||||
|    { | ||||
|       case SO_TTL: | ||||
|          setSn_TTL(sn,*(uint8_t*)arg); | ||||
|          break; | ||||
|       case SO_TOS: | ||||
|          setSn_TOS(sn,*(uint8_t*)arg); | ||||
|          break; | ||||
|       case SO_MSS: | ||||
|          setSn_MSSR(sn,*(uint16_t*)arg); | ||||
|          break; | ||||
|       case SO_DESTIP: | ||||
|          setSn_DIPR(sn, (uint8_t*)arg); | ||||
|          break; | ||||
|       case SO_DESTPORT: | ||||
|          setSn_DPORT(sn, *(uint16_t*)arg); | ||||
|          break; | ||||
| #if _WIZCHIP_ != 5100 | ||||
|       case SO_KEEPALIVESEND: | ||||
|          CHECK_SOCKMODE(Sn_MR_TCP); | ||||
|          #if _WIZCHIP_ > 5200 | ||||
|             if(getSn_KPALVTR(sn) != 0) return SOCKERR_SOCKOPT; | ||||
|          #endif | ||||
|             setSn_CR(sn,Sn_CR_SEND_KEEP); | ||||
|             while(getSn_CR(sn) != 0) | ||||
|             { | ||||
|                // M20131220
 | ||||
|          		//if ((tmp = getSn_IR(sn)) & Sn_IR_TIMEOUT)
 | ||||
|                if (getSn_IR(sn) & Sn_IR_TIMEOUT) | ||||
|          		{ | ||||
|          			setSn_IR(sn, Sn_IR_TIMEOUT); | ||||
|                   return SOCKERR_TIMEOUT; | ||||
|          		} | ||||
|             } | ||||
|          break; | ||||
|    #if _WIZCHIP_ > 5200 | ||||
|       case SO_KEEPALIVEAUTO: | ||||
|          CHECK_SOCKMODE(Sn_MR_TCP); | ||||
|          setSn_KPALVTR(sn,*(uint8_t*)arg); | ||||
|          break; | ||||
|    #endif       | ||||
| #endif    | ||||
|       default: | ||||
|          return SOCKERR_ARG; | ||||
|    }    | ||||
|    return SOCK_OK; | ||||
| } | ||||
| 
 | ||||
| int8_t  getsockopt(uint8_t sn, sockopt_type sotype, void* arg) | ||||
| { | ||||
|    CHECK_SOCKNUM(); | ||||
|    switch(sotype) | ||||
|    { | ||||
|       case SO_FLAG: | ||||
|          *(uint8_t*)arg = getSn_MR(sn) & 0xF0; | ||||
|          break; | ||||
|       case SO_TTL: | ||||
|          *(uint8_t*) arg = getSn_TTL(sn); | ||||
|          break; | ||||
|       case SO_TOS: | ||||
|          *(uint8_t*) arg = getSn_TOS(sn); | ||||
|          break; | ||||
|       case SO_MSS:    | ||||
|          *(uint16_t*) arg = getSn_MSSR(sn); | ||||
|          break; | ||||
|       case SO_DESTIP: | ||||
|          getSn_DIPR(sn, (uint8_t*)arg); | ||||
|          break; | ||||
|       case SO_DESTPORT:   | ||||
|          *(uint16_t*) arg = getSn_DPORT(sn); | ||||
|          break; | ||||
|    #if _WIZCHIP_ > 5200    | ||||
|       case SO_KEEPALIVEAUTO: | ||||
|          CHECK_SOCKMODE(Sn_MR_TCP); | ||||
|          *(uint16_t*) arg = getSn_KPALVTR(sn); | ||||
|          break; | ||||
|    #endif       | ||||
|       case SO_SENDBUF: | ||||
|          *(uint16_t*) arg = getSn_TX_FSR(sn); | ||||
|          break; | ||||
|       case SO_RECVBUF: | ||||
|          *(uint16_t*) arg = getSn_RX_RSR(sn); | ||||
|          break; | ||||
|       case SO_STATUS: | ||||
|          *(uint8_t*) arg = getSn_SR(sn); | ||||
|          break; | ||||
|       case SO_REMAINSIZE: | ||||
|          if(getSn_MR(sn) & Sn_MR_TCP) | ||||
|             *(uint16_t*)arg = getSn_RX_RSR(sn); | ||||
|          else | ||||
|             *(uint16_t*)arg = sock_remained_size[sn]; | ||||
|          break; | ||||
|       case SO_PACKINFO: | ||||
|          //CHECK_SOCKMODE(Sn_MR_TCP);
 | ||||
| #if _WIZCHIP_ != 5300 | ||||
|          if((getSn_MR(sn) == Sn_MR_TCP)) | ||||
|              return SOCKERR_SOCKMODE; | ||||
| #endif | ||||
|          *(uint8_t*)arg = sock_pack_info[sn]; | ||||
|          break; | ||||
|       default: | ||||
|          return SOCKERR_SOCKOPT; | ||||
|    } | ||||
|    return SOCK_OK; | ||||
| } | ||||
| @ -0,0 +1,489 @@ | ||||
| //*****************************************************************************
 | ||||
| //
 | ||||
| //! \file socket.h
 | ||||
| //! \brief SOCKET APIs Header file.
 | ||||
| //! \details SOCKET APIs like as berkeley socket api. 
 | ||||
| //! \version 1.0.2
 | ||||
| //! \date 2013/10/21
 | ||||
| //! \par  Revision history
 | ||||
| //!       <2015/02/05> Notice
 | ||||
| //!        The version history is not updated after this point.
 | ||||
| //!        Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary.
 | ||||
| //!        >> https://github.com/Wiznet/ioLibrary_Driver
 | ||||
| //!       <2014/05/01> V1.0.2. Refer to M20140501
 | ||||
| //!         1. Modify the comment : SO_REMAINED -> PACK_REMAINED
 | ||||
| //!         2. Add the comment as zero byte udp data reception in getsockopt(). 
 | ||||
| //!       <2013/10/21> 1st Release
 | ||||
| //! \author MidnightCow
 | ||||
| //! \copyright
 | ||||
| //!
 | ||||
| //! Copyright (c)  2013, WIZnet Co., LTD.
 | ||||
| //! All rights reserved.
 | ||||
| //! 
 | ||||
| //! Redistribution and use in source and binary forms, with or without 
 | ||||
| //! modification, are permitted provided that the following conditions 
 | ||||
| //! are met: 
 | ||||
| //! 
 | ||||
| //!     * Redistributions of source code must retain the above copyright 
 | ||||
| //! notice, this list of conditions and the following disclaimer. 
 | ||||
| //!     * Redistributions in binary form must reproduce the above copyright
 | ||||
| //! notice, this list of conditions and the following disclaimer in the
 | ||||
| //! documentation and/or other materials provided with the distribution. 
 | ||||
| //!     * Neither the name of the <ORGANIZATION> nor the names of its 
 | ||||
| //! contributors may be used to endorse or promote products derived 
 | ||||
| //! from this software without specific prior written permission. 
 | ||||
| //! 
 | ||||
| //! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | ||||
| //! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 | ||||
| //! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | ||||
| //! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 | ||||
| //! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 | ||||
| //! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 | ||||
| //! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | ||||
| //! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 | ||||
| //! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 | ||||
| //! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 | ||||
| //! THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| //*****************************************************************************
 | ||||
| /**
 | ||||
|  * @defgroup WIZnet_socket_APIs 1. WIZnet socket APIs | ||||
|  * @brief WIZnet socket APIs are based on Berkeley socket APIs,  thus it has much similar name and interface. | ||||
|  *        But there is a little bit of difference. | ||||
|  * @details | ||||
|  * <b> Comparison between WIZnet and Berkeley SOCKET APIs </b> | ||||
|  * <table> | ||||
|  *    <tr>   <td><b>API</b></td> <td><b>WIZnet</b></td> <td><b>Berkeley</b></td>   </tr> | ||||
|  *    <tr>   <td>socket()</td> <td>O</td> <td>O</td>   </tr> | ||||
|  *    <tr>   <td><b>bind()</b></td> <td>X</td> <td>O</td>   </tr> | ||||
|  *    <tr>   <td><b>listen()</b></td> <td>O</td> <td>O</td>   </tr> | ||||
|  *    <tr>   <td><b>connect()</b></td> <td>O</td> <td>O</td>   </tr> | ||||
|  *    <tr>   <td><b>accept()</b></td> <td>X</td> <td>O</td>   </tr> | ||||
|  *    <tr>   <td><b>recv()</b></td> <td>O</td> <td>O</td>    </tr> | ||||
|  *    <tr>   <td><b>send()</b></td> <td>O</td> <td>O</td>   </tr> | ||||
|  *    <tr>   <td><b>recvfrom()</b></td> <td>O</td> <td>O</td>   </tr> | ||||
|  *    <tr>   <td><b>sendto()</b></td> <td>O</td> <td>O</td>    </tr> | ||||
|  *    <tr>   <td><b>closesocket()</b></td> <td>O<br>close() & disconnect()</td> <td>O</td>   </tr> | ||||
|  * </table> | ||||
|  * There are @b bind() and @b accept() functions in @b Berkeley SOCKET API but, | ||||
|  * not in @b WIZnet SOCKET API. Because socket() of WIZnet is not only creating a SOCKET but also binding a local port number, | ||||
|  * and listen() of WIZnet is not only listening to connection request from client but also accepting the connection request. \n | ||||
|  * When you program "TCP SERVER" with Berkeley SOCKET API, you can use only one listen port. | ||||
|  * When the listen SOCKET accepts a connection request from a client, it keeps listening. | ||||
|  * After accepting the connection request, a new SOCKET is created and the new SOCKET is used in communication with the client. \n | ||||
|  * Following figure shows network flow diagram by Berkeley SOCKET API. | ||||
|  * @image html Berkeley_SOCKET.jpg "<Berkeley SOCKET API>" | ||||
|  * But, When you program "TCP SERVER" with WIZnet SOCKET API, you can use as many as 8 listen SOCKET with same port number. \n | ||||
|  * Because there's no accept() in WIZnet SOCKET APIs, when the listen SOCKET accepts a connection request from a client, | ||||
|  * it is changed in order to communicate with the client. | ||||
|  * And the changed SOCKET is not listening any more and is dedicated for communicating with the client. \n | ||||
|  * If there're many listen SOCKET with same listen port number and a client requests a connection, | ||||
|  * the SOCKET which has the smallest SOCKET number accepts the request and is changed as communication SOCKET. \n | ||||
|  * Following figure shows network flow diagram by WIZnet SOCKET API. | ||||
|  * @image html WIZnet_SOCKET.jpg "<WIZnet SOCKET API>" | ||||
|  */ | ||||
| #ifndef _SOCKET_H_ | ||||
| #define _SOCKET_H_ | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include "wizchip_conf.h" | ||||
| 
 | ||||
| #define SOCKET                uint8_t  ///< SOCKET type define for legacy driver
 | ||||
| 
 | ||||
| #define SOCK_OK               1        ///< Result is OK about socket process.
 | ||||
| #define SOCK_BUSY             0        ///< Socket is busy on processing the operation. Valid only Non-block IO Mode.
 | ||||
| #define SOCK_FATAL            -1000    ///< Result is fatal error about socket process.
 | ||||
| 
 | ||||
| #define SOCK_ERROR            0         | ||||
| #define SOCKERR_SOCKNUM       (SOCK_ERROR - 1)     ///< Invalid socket number
 | ||||
| #define SOCKERR_SOCKOPT       (SOCK_ERROR - 2)     ///< Invalid socket option
 | ||||
| #define SOCKERR_SOCKINIT      (SOCK_ERROR - 3)     ///< Socket is not initialized or SIPR is Zero IP address when Sn_MR_TCP
 | ||||
| #define SOCKERR_SOCKCLOSED    (SOCK_ERROR - 4)     ///< Socket unexpectedly closed.
 | ||||
| #define SOCKERR_SOCKMODE      (SOCK_ERROR - 5)     ///< Invalid socket mode for socket operation.
 | ||||
| #define SOCKERR_SOCKFLAG      (SOCK_ERROR - 6)     ///< Invalid socket flag
 | ||||
| #define SOCKERR_SOCKSTATUS    (SOCK_ERROR - 7)     ///< Invalid socket status for socket operation.
 | ||||
| #define SOCKERR_ARG           (SOCK_ERROR - 10)    ///< Invalid argument.
 | ||||
| #define SOCKERR_PORTZERO      (SOCK_ERROR - 11)    ///< Port number is zero
 | ||||
| #define SOCKERR_IPINVALID     (SOCK_ERROR - 12)    ///< Invalid IP address
 | ||||
| #define SOCKERR_TIMEOUT       (SOCK_ERROR - 13)    ///< Timeout occurred
 | ||||
| #define SOCKERR_DATALEN       (SOCK_ERROR - 14)    ///< Data length is zero or greater than buffer max size.
 | ||||
| #define SOCKERR_BUFFER        (SOCK_ERROR - 15)    ///< Socket buffer is not enough for data communication.
 | ||||
| 
 | ||||
| #define SOCKFATAL_PACKLEN     (SOCK_FATAL - 1)     ///< Invalid packet length. Fatal Error.
 | ||||
| 
 | ||||
| /*
 | ||||
|  * SOCKET FLAG | ||||
|  */ | ||||
| #define SF_ETHER_OWN           (Sn_MR_MFEN)        ///< In @ref Sn_MR_MACRAW, Receive only the packet as broadcast, multicast and own packet
 | ||||
| #define SF_IGMP_VER2           (Sn_MR_MC)          ///< In @ref Sn_MR_UDP with \ref SF_MULTI_ENABLE, Select IGMP version 2.   
 | ||||
| #define SF_TCP_NODELAY         (Sn_MR_ND)          ///< In @ref Sn_MR_TCP, Use to nodelayed ack.
 | ||||
| #define SF_MULTI_ENABLE        (Sn_MR_MULTI)       ///< In @ref Sn_MR_UDP, Enable multicast mode.
 | ||||
| 
 | ||||
| #if _WIZCHIP_ == 5500 | ||||
|    #define SF_BROAD_BLOCK         (Sn_MR_BCASTB)   ///< In @ref Sn_MR_UDP or @ref Sn_MR_MACRAW, Block broadcast packet. Valid only in W5500
 | ||||
|    #define SF_MULTI_BLOCK         (Sn_MR_MMB)      ///< In @ref Sn_MR_MACRAW, Block multicast packet. Valid only in W5500
 | ||||
|    #define SF_IPv6_BLOCK          (Sn_MR_MIP6B)    ///< In @ref Sn_MR_MACRAW, Block IPv6 packet. Valid only in W5500
 | ||||
|    #define SF_UNI_BLOCK           (Sn_MR_UCASTB)   ///< In @ref Sn_MR_UDP with \ref SF_MULTI_ENABLE. Valid only in W5500
 | ||||
| #endif | ||||
| 
 | ||||
| //A201505 : For W5300
 | ||||
| #if _WIZCHIP_ == 5300 | ||||
|    #define SF_TCP_ALIGN		     0x02			   ///< Valid only \ref Sn_MR_TCP and W5300, refer to \ref Sn_MR_ALIGN
 | ||||
| #endif | ||||
| 
 | ||||
| #define SF_IO_NONBLOCK           0x01              ///< Socket nonblock io mode. It used parameter in \ref socket().
 | ||||
| 
 | ||||
| /*
 | ||||
|  * UDP & MACRAW Packet Infomation | ||||
|  */ | ||||
| #define PACK_FIRST               0x80              ///< In Non-TCP packet, It indicates to start receiving a packet. (When W5300, This flag can be applied)
 | ||||
| #define PACK_REMAINED            0x01              ///< In Non-TCP packet, It indicates to remain a packet to be received. (When W5300, This flag can be applied)
 | ||||
| #define PACK_COMPLETED           0x00              ///< In Non-TCP packet, It indicates to complete to receive a packet. (When W5300, This flag can be applied)
 | ||||
| //A20150601 : For Integrating with W5300
 | ||||
| #define PACK_FIFOBYTE            0x02              ///< Valid only W5300, It indicate to have read already the Sn_RX_FIFOR.
 | ||||
| //
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup WIZnet_socket_APIs | ||||
|  * @brief Open a socket. | ||||
|  * @details Initializes the socket with 'sn' passed as parameter and open. | ||||
|  * | ||||
|  * @param sn Socket number. It should be <b>0 ~ @ref \_WIZCHIP_SOCK_NUM_</b>. | ||||
|  * @param protocol Protocol type to operate such as TCP, UDP and MACRAW. | ||||
|  * @param port Port number to be bined. | ||||
|  * @param flag Socket flags as \ref SF_ETHER_OWN, \ref SF_IGMP_VER2, \ref SF_TCP_NODELAY, \ref SF_MULTI_ENABLE, \ref SF_IO_NONBLOCK and so on.\n | ||||
|  *             Valid flags only in W5500 : @ref SF_BROAD_BLOCK, @ref SF_MULTI_BLOCK, @ref SF_IPv6_BLOCK, and @ref SF_UNI_BLOCK. | ||||
|  * @sa Sn_MR | ||||
|  * | ||||
|  * @return @b Success : The socket number @b 'sn' passed as parameter\n | ||||
|  *         @b Fail    :\n @ref SOCKERR_SOCKNUM     - Invalid socket number\n | ||||
|  *                        @ref SOCKERR_SOCKMODE    - Not support socket mode as TCP, UDP, and so on. \n | ||||
|  *                        @ref SOCKERR_SOCKFLAG    - Invaild socket flag. | ||||
|  */ | ||||
| int8_t  socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup WIZnet_socket_APIs | ||||
|  * @brief Close a socket. | ||||
|  * @details It closes the socket  with @b'sn' passed as parameter. | ||||
|  * | ||||
|  * @param sn Socket number. It should be <b>0 ~ @ref \_WIZCHIP_SOCK_NUM_</b>. | ||||
|  * | ||||
|  * @return @b Success : @ref SOCK_OK \n | ||||
|  *         @b Fail    : @ref SOCKERR_SOCKNUM - Invalid socket number | ||||
|  */ | ||||
| int8_t  close(uint8_t sn); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup WIZnet_socket_APIs | ||||
|  * @brief Listen to a connection request from a client. | ||||
|  * @details It is listening to a connection request from a client. | ||||
|  * If connection request is accepted successfully, the connection is established. Socket sn is used in passive(server) mode. | ||||
|  * | ||||
|  * @param sn Socket number. It should be <b>0 ~ @ref \_WIZCHIP_SOCK_NUM_</b>. | ||||
|  * @return @b Success : @ref SOCK_OK \n | ||||
|  *         @b Fail    :\n @ref SOCKERR_SOCKINIT   - Socket is not initialized \n | ||||
|  *                        @ref SOCKERR_SOCKCLOSED - Socket closed unexpectedly. | ||||
|  */ | ||||
| int8_t  listen(uint8_t sn); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup WIZnet_socket_APIs | ||||
|  * @brief Try to connect a server. | ||||
|  * @details It requests connection to the server with destination IP address and port number passed as parameter.\n | ||||
|  * @note It is valid only in TCP client mode.  | ||||
|  *       In block io mode, it does not return until connection is completed. | ||||
|  *       In Non-block io mode, it return @ref SOCK_BUSY immediately. | ||||
|  * | ||||
|  * @param sn Socket number. It should be <b>0 ~ @ref \_WIZCHIP_SOCK_NUM_</b>. | ||||
|  * @param addr Pointer variable of destination IP address. It should be allocated 4 bytes. | ||||
|  * @param port Destination port number. | ||||
|  * | ||||
|  * @return @b Success : @ref SOCK_OK \n | ||||
|  * @b Fail    :\n @ref SOCKERR_SOCKNUM   - Invalid socket number\n | ||||
|  *                @ref SOCKERR_SOCKMODE  - Invalid socket mode\n | ||||
|  *                @ref SOCKERR_SOCKINIT  - Socket is not initialized\n | ||||
|  *                @ref SOCKERR_IPINVALID - Wrong server IP address\n | ||||
|  *                @ref SOCKERR_PORTZERO  - Server port zero\n | ||||
|  *                @ref SOCKERR_TIMEOUT   - Timeout occurred during request connection\n | ||||
|  *                @ref SOCK_BUSY         - In non-block io mode, it returned immediately\n | ||||
|  */ | ||||
| int8_t  connect(uint8_t sn, uint8_t * addr, uint16_t port); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup WIZnet_socket_APIs | ||||
|  * @brief Try to disconnect a connection socket. | ||||
|  * @details It sends request message to disconnect the TCP socket 'sn' passed as parameter to the server or client. | ||||
|  * @note It is valid only in TCP server or client mode. \n | ||||
|  *       In block io mode, it does not return until disconnection is completed. \n | ||||
|  *       In Non-block io mode, it return @ref SOCK_BUSY immediately. \n | ||||
| 
 | ||||
|  * @param sn Socket number. It should be <b>0 ~ @ref \_WIZCHIP_SOCK_NUM_</b>. | ||||
|  * @return @b Success :   @ref SOCK_OK \n | ||||
|  *         @b Fail    :\n @ref SOCKERR_SOCKNUM  - Invalid socket number \n | ||||
|  *                        @ref SOCKERR_SOCKMODE - Invalid operation in the socket \n | ||||
|  *                        @ref SOCKERR_TIMEOUT  - Timeout occurred \n | ||||
|  *                        @ref SOCK_BUSY        - Socket is busy. | ||||
|  */ | ||||
| int8_t  disconnect(uint8_t sn); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup WIZnet_socket_APIs | ||||
|  * @brief	Send data to the connected peer in TCP socket. | ||||
|  * @details It is used to send outgoing data to the connected socket. | ||||
|  * @note    It is valid only in TCP server or client mode. It can't send data greater than socket buffer size. \n | ||||
|  *          In block io mode, It doesn't return until data send is completed - socket buffer size is greater than data. \n | ||||
|  *          In non-block io mode, It return @ref SOCK_BUSY immediately when socket buffer is not enough. \n | ||||
|  * @param sn Socket number. It should be <b>0 ~ @ref \_WIZCHIP_SOCK_NUM_</b>. | ||||
|  * @param buf Pointer buffer containing data to be sent. | ||||
|  * @param len The byte length of data in buf. | ||||
|  * @return	@b Success : The sent data size \n | ||||
|  *          @b Fail    : \n @ref SOCKERR_SOCKSTATUS - Invalid socket status for socket operation \n | ||||
|  *                          @ref SOCKERR_TIMEOUT    - Timeout occurred \n | ||||
|  *                          @ref SOCKERR_SOCKMODE 	- Invalid operation in the socket \n | ||||
|  *                          @ref SOCKERR_SOCKNUM    - Invalid socket number \n | ||||
|  *                          @ref SOCKERR_DATALEN    - zero data length \n | ||||
|  *                          @ref SOCK_BUSY          - Socket is busy. | ||||
|  */ | ||||
| int32_t send(uint8_t sn, uint8_t * buf, uint16_t len); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup WIZnet_socket_APIs | ||||
|  * @brief	Receive data from the connected peer. | ||||
|  * @details It is used to read incoming data from the connected socket.\n | ||||
|  *          It waits for data as much as the application wants to receive. | ||||
|  * @note    It is valid only in TCP server or client mode. It can't receive data greater than socket buffer size. \n | ||||
|  *          In block io mode, it doesn't return until data reception is completed - data is filled as <I>len</I> in socket buffer. \n | ||||
|  *          In non-block io mode, it return @ref SOCK_BUSY immediately when <I>len</I> is greater than data size in socket buffer. \n | ||||
|  * | ||||
|  * @param sn  Socket number. It should be <b>0 ~ @ref \_WIZCHIP_SOCK_NUM_</b>. | ||||
|  * @param buf Pointer buffer to read incoming data. | ||||
|  * @param len The max data length of data in buf. | ||||
|  * @return	@b Success : The real received data size \n | ||||
|  *          @b Fail    :\n | ||||
|  *                     @ref SOCKERR_SOCKSTATUS - Invalid socket status for socket operation \n | ||||
|  *                     @ref SOCKERR_SOCKMODE   - Invalid operation in the socket \n | ||||
|  *                     @ref SOCKERR_SOCKNUM    - Invalid socket number \n | ||||
|  *                     @ref SOCKERR_DATALEN    - zero data length \n | ||||
|  *                     @ref SOCK_BUSY          - Socket is busy. | ||||
|  */ | ||||
| int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup WIZnet_socket_APIs | ||||
|  * @brief	Sends datagram to the peer with destination IP address and port number passed as parameter. | ||||
|  * @details It sends datagram of UDP or MACRAW to the peer with destination IP address and port number passed as parameter.\n | ||||
|  *          Even if the connectionless socket has been previously connected to a specific address, | ||||
|  *          the address and port number parameters override the destination address for that particular datagram only. | ||||
|  * @note    In block io mode, It doesn't return until data send is completed - socket buffer size is greater than <I>len</I>. | ||||
|  *          In non-block io mode, It return @ref SOCK_BUSY immediately when socket buffer is not enough. | ||||
|  * | ||||
|  * @param sn    Socket number. It should be <b>0 ~ @ref \_WIZCHIP_SOCK_NUM_</b>. | ||||
|  * @param buf   Pointer buffer to send outgoing data. | ||||
|  * @param len   The byte length of data in buf. | ||||
|  * @param addr  Pointer variable of destination IP address. It should be allocated 4 bytes. | ||||
|  * @param port  Destination port number. | ||||
|  * | ||||
|  * @return @b Success : The sent data size \n | ||||
|  *         @b Fail    :\n @ref SOCKERR_SOCKNUM     - Invalid socket number \n | ||||
|  *                        @ref SOCKERR_SOCKMODE    - Invalid operation in the socket \n | ||||
|  *                        @ref SOCKERR_SOCKSTATUS  - Invalid socket status for socket operation \n | ||||
|  *                        @ref SOCKERR_DATALEN     - zero data length \n | ||||
|  *                        @ref SOCKERR_IPINVALID   - Wrong server IP address\n | ||||
|  *                        @ref SOCKERR_PORTZERO    - Server port zero\n | ||||
|  *                        @ref SOCKERR_SOCKCLOSED  - Socket unexpectedly closed \n | ||||
|  *                        @ref SOCKERR_TIMEOUT     - Timeout occurred \n | ||||
|  *                        @ref SOCK_BUSY           - Socket is busy.  | ||||
|  */ | ||||
| int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup WIZnet_socket_APIs | ||||
|  * @brief Receive datagram of UDP or MACRAW | ||||
|  * @details This function is an application I/F function which is used to receive the data in other then TCP mode. \n | ||||
|  *          This function is used to receive UDP and MAC_RAW mode, and handle the header as well.  | ||||
|  *          This function can divide to received the packet data. | ||||
|  *          On the MACRAW SOCKET, the addr and port parameters are ignored. | ||||
|  * @note    In block io mode, it doesn't return until data reception is completed - data is filled as <I>len</I> in socket buffer | ||||
|  *          In non-block io mode, it return @ref SOCK_BUSY immediately when <I>len</I> is greater than data size in socket buffer. | ||||
|  * | ||||
|  * @param sn   Socket number. It should be <b>0 ~ @ref \_WIZCHIP_SOCK_NUM_</b>. | ||||
|  * @param buf  Pointer buffer to read incoming data. | ||||
|  * @param len  The max data length of data in buf.  | ||||
|  *             When the received packet size <= len, receives data as packet sized. | ||||
|  *             When others, receives data as len. | ||||
|  * @param addr Pointer variable of destination IP address. It should be allocated 4 bytes. | ||||
|  *             It is valid only when the first call recvfrom for receiving the packet. | ||||
|  *             When it is valid, @ref  packinfo[7] should be set as '1' after call @ref getsockopt(sn, SO_PACKINFO, &packinfo). | ||||
|  * @param port Pointer variable of destination port number. | ||||
|  *             It is valid only when the first call recvform for receiving the packet. | ||||
| *             When it is valid, @ref  packinfo[7] should be set as '1' after call @ref getsockopt(sn, SO_PACKINFO, &packinfo). | ||||
|  * | ||||
|  * @return	@b Success : This function return real received data size for success.\n | ||||
|  *          @b Fail    : @ref SOCKERR_DATALEN    - zero data length \n | ||||
|  *                       @ref SOCKERR_SOCKMODE   - Invalid operation in the socket \n | ||||
|  *                       @ref SOCKERR_SOCKNUM    - Invalid socket number \n | ||||
|  *                       @ref SOCKBUSY           - Socket is busy. | ||||
|  */ | ||||
| int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port); | ||||
| 
 | ||||
| 
 | ||||
| /////////////////////////////
 | ||||
| // SOCKET CONTROL & OPTION //
 | ||||
| /////////////////////////////
 | ||||
| #define SOCK_IO_BLOCK         0  ///< Socket Block IO Mode in @ref setsockopt().
 | ||||
| #define SOCK_IO_NONBLOCK      1  ///< Socket Non-block IO Mode in @ref setsockopt().
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup DATA_TYPE DATA TYPE | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup DATA_TYPE | ||||
|  * @brief The kind of Socket Interrupt. | ||||
|  * @sa Sn_IR, Sn_IMR, setSn_IR(), getSn_IR(), setSn_IMR(), getSn_IMR() | ||||
|  */ | ||||
| typedef enum | ||||
| { | ||||
|    SIK_CONNECTED     = (1 << 0),    ///< connected
 | ||||
|    SIK_DISCONNECTED  = (1 << 1),    ///< disconnected
 | ||||
|    SIK_RECEIVED      = (1 << 2),    ///< data received
 | ||||
|    SIK_TIMEOUT       = (1 << 3),    ///< timeout occurred
 | ||||
|    SIK_SENT          = (1 << 4),    ///< send ok
 | ||||
|    //M20150410 : Remove the comma of last member
 | ||||
|    //SIK_ALL           = 0x1F,        ///< all interrupt
 | ||||
|    SIK_ALL           = 0x1F         ///< all interrupt
 | ||||
| }sockint_kind; | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup DATA_TYPE | ||||
|  * @brief The type of @ref ctlsocket(). | ||||
|  */ | ||||
| typedef enum | ||||
| { | ||||
|    CS_SET_IOMODE,          ///< set socket IO mode with @ref SOCK_IO_BLOCK or @ref SOCK_IO_NONBLOCK
 | ||||
|    CS_GET_IOMODE,          ///< get socket IO mode
 | ||||
|    CS_GET_MAXTXBUF,        ///< get the size of socket buffer allocated in TX memory
 | ||||
|    CS_GET_MAXRXBUF,        ///< get the size of socket buffer allocated in RX memory
 | ||||
|    CS_CLR_INTERRUPT,       ///< clear the interrupt of socket with @ref sockint_kind
 | ||||
|    CS_GET_INTERRUPT,       ///< get the socket interrupt. refer to @ref sockint_kind
 | ||||
| #if _WIZCHIP_ > 5100 | ||||
|    CS_SET_INTMASK,         ///< set the interrupt mask of socket with @ref sockint_kind, Not supported in W5100
 | ||||
|    CS_GET_INTMASK          ///< get the masked interrupt of socket. refer to @ref sockint_kind, Not supported in W5100
 | ||||
| #endif | ||||
| }ctlsock_type; | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup DATA_TYPE | ||||
|  * @brief The type of socket option in @ref setsockopt() or @ref getsockopt() | ||||
|  */  | ||||
| typedef enum | ||||
| { | ||||
|    SO_FLAG,           ///< Valid only in getsockopt(), For set flag of socket refer to <I>flag</I> in @ref socket().
 | ||||
|    SO_TTL,              ///< Set TTL. @ref Sn_TTL  ( @ref setSn_TTL(), @ref getSn_TTL() )
 | ||||
|    SO_TOS,              ///< Set TOS. @ref Sn_TOS  ( @ref setSn_TOS(), @ref getSn_TOS() )
 | ||||
|    SO_MSS,              ///< Set MSS. @ref Sn_MSSR ( @ref setSn_MSSR(), @ref getSn_MSSR() )
 | ||||
|    SO_DESTIP,           ///< Set the destination IP address. @ref Sn_DIPR ( @ref setSn_DIPR(), @ref getSn_DIPR() )
 | ||||
|    SO_DESTPORT,         ///< Set the destination Port number. @ref Sn_DPORT ( @ref setSn_DPORT(), @ref getSn_DPORT() )
 | ||||
| #if _WIZCHIP_ != 5100    | ||||
|    SO_KEEPALIVESEND,    ///< Valid only in setsockopt. Manually send keep-alive packet in TCP mode, Not supported in W5100
 | ||||
|    #if _WIZCHIP_ > 5200    | ||||
|       SO_KEEPALIVEAUTO, ///< Set/Get keep-alive auto transmission timer in TCP mode, Not supported in W5100, W5200
 | ||||
|    #endif       | ||||
| #endif | ||||
|    SO_SENDBUF,          ///< Valid only in getsockopt. Get the free data size of Socekt TX buffer. @ref Sn_TX_FSR, @ref getSn_TX_FSR()
 | ||||
|    SO_RECVBUF,          ///< Valid only in getsockopt. Get the received data size in socket RX buffer. @ref Sn_RX_RSR, @ref getSn_RX_RSR()
 | ||||
|    SO_STATUS,           ///< Valid only in getsockopt. Get the socket status. @ref Sn_SR, @ref getSn_SR()
 | ||||
|    SO_REMAINSIZE,       ///< Valid only in getsockopt. Get the remained packet size in other then TCP mode.
 | ||||
|    SO_PACKINFO          ///< Valid only in getsockopt. Get the packet information as @ref PACK_FIRST, @ref PACK_REMAINED, and @ref PACK_COMPLETED in other then TCP mode.
 | ||||
| }sockopt_type; | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup WIZnet_socket_APIs | ||||
|  *  @brief Control socket. | ||||
|  *  @details Control IO mode, Interrupt & Mask of socket and get the socket buffer information. | ||||
|  *           Refer to @ref ctlsock_type. | ||||
|  *  @param sn socket number | ||||
|  *  @param cstype type of control socket. refer to @ref ctlsock_type. | ||||
|  *  @param arg Data type and value is determined according to @ref ctlsock_type. \n | ||||
|  *             <table> | ||||
|  *                  <tr> <td> @b cstype </td> <td> @b data type</td><td>@b value</td></tr> | ||||
|  *                  <tr> <td> @ref CS_SET_IOMODE \n @ref CS_GET_IOMODE </td> <td> uint8_t </td><td>@ref SOCK_IO_BLOCK @ref SOCK_IO_NONBLOCK</td></tr> | ||||
|  *                  <tr> <td> @ref CS_GET_MAXTXBUF \n @ref CS_GET_MAXRXBUF </td> <td> uint16_t </td><td> 0 ~ 16K </td></tr> | ||||
|  *                  <tr> <td> @ref CS_CLR_INTERRUPT \n @ref CS_GET_INTERRUPT \n @ref CS_SET_INTMASK \n @ref CS_GET_INTMASK </td> <td> @ref sockint_kind </td><td> @ref SIK_CONNECTED, etc.  </td></tr>  | ||||
|  *             </table> | ||||
|  *  @return @b Success @ref SOCK_OK \n | ||||
|  *          @b fail    @ref SOCKERR_ARG         - Invalid argument\n | ||||
|  */ | ||||
| int8_t  ctlsocket(uint8_t sn, ctlsock_type cstype, void* arg); | ||||
| 
 | ||||
| /** 
 | ||||
|  * @ingroup WIZnet_socket_APIs | ||||
|  *  @brief set socket options | ||||
|  *  @details Set socket option like as TTL, MSS, TOS, and so on. Refer to @ref sockopt_type. | ||||
|  *                | ||||
|  *  @param sn socket number | ||||
|  *  @param sotype socket option type. refer to @ref sockopt_type | ||||
|  *  @param arg Data type and value is determined according to <I>sotype</I>. \n | ||||
|  *             <table> | ||||
|  *                  <tr> <td> @b sotype </td> <td> @b data type</td><td>@b value</td></tr>  | ||||
|  *                  <tr> <td> @ref SO_TTL </td> <td> uint8_t </td><td> 0 ~ 255 </td> </tr> | ||||
|  *                  <tr> <td> @ref SO_TOS </td> <td> uint8_t </td><td> 0 ~ 255 </td> </tr> | ||||
|  *                  <tr> <td> @ref SO_MSS </td> <td> uint16_t </td><td> 0 ~ 65535 </td> </tr> | ||||
|  *                  <tr> <td> @ref SO_DESTIP </td> <td> uint8_t[4] </td><td>  </td></tr>  | ||||
|  *                  <tr> <td> @ref SO_DESTPORT </td> <td> uint16_t </td><td> 0 ~ 65535 </td></tr>  | ||||
|  *                  <tr> <td> @ref SO_KEEPALIVESEND </td> <td> null </td><td> null </td></tr>  | ||||
|  *                  <tr> <td> @ref SO_KEEPALIVEAUTO </td> <td> uint8_t </td><td> 0 ~ 255 </td></tr>  | ||||
|  *             </table> | ||||
|  * @return  | ||||
|  * - @b Success : @ref SOCK_OK \n | ||||
|  * - @b Fail  | ||||
|  *  - @ref SOCKERR_SOCKNUM     - Invalid Socket number \n | ||||
|  *  - @ref SOCKERR_SOCKMODE    - Invalid socket mode \n | ||||
|  *  - @ref SOCKERR_SOCKOPT     - Invalid socket option or its value \n | ||||
|  *  - @ref SOCKERR_TIMEOUT     - Timeout occurred when sending keep-alive packet \n | ||||
|  */ | ||||
| int8_t  setsockopt(uint8_t sn, sockopt_type sotype, void* arg); | ||||
| 
 | ||||
| /** 
 | ||||
|  * @ingroup WIZnet_socket_APIs | ||||
|  *  @brief get socket options | ||||
|  *  @details Get socket option like as FLAG, TTL, MSS, and so on. Refer to @ref sockopt_type | ||||
|  *  @param sn socket number | ||||
|  *  @param sotype socket option type. refer to @ref sockopt_type | ||||
|  *  @param arg Data type and value is determined according to <I>sotype</I>. \n | ||||
|  *             <table> | ||||
|  *                  <tr> <td> @b sotype </td> <td>@b data type</td><td>@b value</td></tr> | ||||
|  *                  <tr> <td> @ref SO_FLAG </td> <td> uint8_t </td><td> @ref SF_ETHER_OWN, etc... </td> </tr> | ||||
|  *                  <tr> <td> @ref SO_TOS </td> <td> uint8_t </td><td> 0 ~ 255 </td> </tr> | ||||
|  *                  <tr> <td> @ref SO_MSS </td> <td> uint16_t </td><td> 0 ~ 65535 </td> </tr> | ||||
|  *                  <tr> <td> @ref SO_DESTIP </td> <td> uint8_t[4] </td><td>  </td></tr>  | ||||
|  *                  <tr> <td> @ref SO_DESTPORT </td> <td> uint16_t </td><td>  </td></tr>  | ||||
|  *                  <tr> <td> @ref SO_KEEPALIVEAUTO </td> <td> uint8_t </td><td> 0 ~ 255 </td></tr>  | ||||
|  *                  <tr> <td> @ref SO_SENDBUF </td> <td> uint16_t </td><td> 0 ~ 65535 </td></tr>   | ||||
|  *                  <tr> <td> @ref SO_RECVBUF </td> <td> uint16_t </td><td> 0 ~ 65535 </td></tr>   | ||||
|  *                  <tr> <td> @ref SO_STATUS </td> <td> uint8_t </td><td> @ref SOCK_ESTABLISHED, etc.. </td></tr>   | ||||
|  *                  <tr> <td> @ref SO_REMAINSIZE </td> <td> uint16_t </td><td> 0~ 65535 </td></tr> | ||||
|  *                  <tr> <td> @ref SO_PACKINFO </td> <td> uint8_t </td><td> @ref PACK_FIRST, etc... </td></tr> | ||||
|  *             </table> | ||||
|  * @return  | ||||
|  * - @b Success : @ref SOCK_OK \n | ||||
|  * - @b Fail  | ||||
|  *  - @ref SOCKERR_SOCKNUM     - Invalid Socket number \n | ||||
|  *  - @ref SOCKERR_SOCKOPT     - Invalid socket option or its value \n | ||||
|  *  - @ref SOCKERR_SOCKMODE    - Invalid socket mode \n | ||||
|  * @note | ||||
|  *   The option as PACK_REMAINED and SO_PACKINFO is valid only in NON-TCP mode and after call @ref recvfrom(). \n | ||||
|  *   When SO_PACKINFO value is PACK_FIRST and the return value of recvfrom() is zero,  | ||||
|  *   This means the zero byte UDP data(UDP Header only) received. | ||||
|   */ | ||||
| int8_t  getsockopt(uint8_t sn, sockopt_type sotype, void* arg); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
|  } | ||||
| #endif | ||||
| 
 | ||||
| #endif   // _SOCKET_H_
 | ||||
| @ -0,0 +1,903 @@ | ||||
| //****************************************************************************/ 
 | ||||
| //!
 | ||||
| //! \file wizchip_conf.c
 | ||||
| //! \brief WIZCHIP Config Header File.
 | ||||
| //! \version 1.0.1
 | ||||
| //! \date 2013/10/21
 | ||||
| //! \par  Revision history
 | ||||
| //!       <2015/02/05> Notice
 | ||||
| //!        The version history is not updated after this point.
 | ||||
| //!        Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary.
 | ||||
| //!        >> https://github.com/Wiznet/ioLibrary_Driver
 | ||||
| //!       <2014/05/01> V1.0.1  Refer to M20140501
 | ||||
| //!        1. Explicit type casting in wizchip_bus_readdata() & wizchip_bus_writedata()
 | ||||
| //            Issued by Mathias ClauBen.
 | ||||
| //!           uint32_t type converts into ptrdiff_t first. And then recoverting it into uint8_t*
 | ||||
| //!           For remove the warning when pointer type size is not 32bit.
 | ||||
| //!           If ptrdiff_t doesn't support in your complier, You should must replace ptrdiff_t into your suitable pointer type.
 | ||||
| //!       <2013/10/21> 1st Release
 | ||||
| //! \author MidnightCow
 | ||||
| //! \copyright
 | ||||
| //!
 | ||||
| //! Copyright (c)  2013, WIZnet Co., LTD.
 | ||||
| //! All rights reserved.
 | ||||
| //! 
 | ||||
| //! Redistribution and use in source and binary forms, with or without 
 | ||||
| //! modification, are permitted provided that the following conditions 
 | ||||
| //! are met: 
 | ||||
| //! 
 | ||||
| //!     * Redistributions of source code must retain the above copyright 
 | ||||
| //! notice, this list of conditions and the following disclaimer. 
 | ||||
| //!     * Redistributions in binary form must reproduce the above copyright
 | ||||
| //! notice, this list of conditions and the following disclaimer in the
 | ||||
| //! documentation and/or other materials provided with the distribution. 
 | ||||
| //!     * Neither the name of the <ORGANIZATION> nor the names of its 
 | ||||
| //! contributors may be used to endorse or promote products derived 
 | ||||
| //! from this software without specific prior written permission. 
 | ||||
| //! 
 | ||||
| //! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | ||||
| //! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 | ||||
| //! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | ||||
| //! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 | ||||
| //! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 | ||||
| //! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 | ||||
| //! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | ||||
| //! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 | ||||
| //! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 | ||||
| //! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 | ||||
| //! THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| //*****************************************************************************/
 | ||||
| //A20140501 : for use the type - ptrdiff_t
 | ||||
| #include <stddef.h> | ||||
| //
 | ||||
| 
 | ||||
| #include "wizchip_conf.h" | ||||
| 
 | ||||
| /////////////
 | ||||
| //M20150401 : Remove ; in the default callback function such as wizchip_cris_enter(), wizchip_cs_select() and etc.
 | ||||
| /////////////
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Default function to enable interrupt. | ||||
|  * @note This function help not to access wrong address. If you do not describe this function or register any functions, | ||||
|  * null function is called. | ||||
|  */ | ||||
| //void 	  wizchip_cris_enter(void)           {};
 | ||||
| void 	  wizchip_cris_enter(void)           {} | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Default function to disable interrupt. | ||||
|  * @note This function help not to access wrong address. If you do not describe this function or register any functions, | ||||
|  * null function is called. | ||||
|  */ | ||||
| //void 	  wizchip_cris_exit(void)          {};
 | ||||
| void 	  wizchip_cris_exit(void)          {} | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Default function to select chip. | ||||
|  * @note This function help not to access wrong address. If you do not describe this function or register any functions, | ||||
|  * null function is called. | ||||
|  */ | ||||
| //void 	wizchip_cs_select(void)            {};
 | ||||
| void 	wizchip_cs_select(void)            {} | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Default function to deselect chip. | ||||
|  * @note This function help not to access wrong address. If you do not describe this function or register any functions, | ||||
|  * null function is called. | ||||
|  */ | ||||
| //void 	wizchip_cs_deselect(void)          {};
 | ||||
| void 	wizchip_cs_deselect(void)          {} | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Default function to read in direct or indirect interface. | ||||
|  * @note This function help not to access wrong address. If you do not describe this function or register any functions, | ||||
|  * null function is called. | ||||
|  */ | ||||
|  //M20150601 : Rename the function for integrating with W5300
 | ||||
| //uint8_t wizchip_bus_readbyte(uint32_t AddrSel) { return * ((volatile uint8_t *)((ptrdiff_t) AddrSel)); }
 | ||||
| iodata_t wizchip_bus_readdata(uint32_t AddrSel) { return * ((volatile iodata_t *)((ptrdiff_t) AddrSel)); } | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Default function to write in direct or indirect interface. | ||||
|  * @note This function help not to access wrong address. If you do not describe this function or register any functions, | ||||
|  * null function is called. | ||||
|  */ | ||||
| //M20150601 : Rename the function for integrating with W5300
 | ||||
| //void 	wizchip_bus_writebyte(uint32_t AddrSel, uint8_t wb)  { *((volatile uint8_t*)((ptrdiff_t)AddrSel)) = wb; }
 | ||||
| void 	wizchip_bus_writedata(uint32_t AddrSel, iodata_t wb)  { *((volatile iodata_t*)((ptrdiff_t)AddrSel)) = wb; } | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Default function to read in SPI interface. | ||||
|  * @note This function help not to access wrong address. If you do not describe this function or register any functions, | ||||
|  * null function is called. | ||||
|  */ | ||||
| //uint8_t wizchip_spi_readbyte(void)        {return 0;};
 | ||||
| uint8_t wizchip_spi_readbyte(void)        {return 0;} | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Default function to write in SPI interface. | ||||
|  * @note This function help not to access wrong address. If you do not describe this function or register any functions, | ||||
|  * null function is called. | ||||
|  */ | ||||
| //void 	wizchip_spi_writebyte(uint8_t wb) {};
 | ||||
| void 	wizchip_spi_writebyte(uint8_t wb) {} | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Default function to burst read in SPI interface. | ||||
|  * @note This function help not to access wrong address. If you do not describe this function or register any functions, | ||||
|  * null function is called. | ||||
|  */ | ||||
| //void 	wizchip_spi_readburst(uint8_t* pBuf, uint16_t len) 	{}; 
 | ||||
| void 	wizchip_spi_readburst(uint8_t* pBuf, uint16_t len) 	{} | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Default function to burst write in SPI interface. | ||||
|  * @note This function help not to access wrong address. If you do not describe this function or register any functions, | ||||
|  * null function is called. | ||||
|  */ | ||||
| //void 	wizchip_spi_writeburst(uint8_t* pBuf, uint16_t len) {};
 | ||||
| void 	wizchip_spi_writeburst(uint8_t* pBuf, uint16_t len) {} | ||||
| 
 | ||||
| /**
 | ||||
|  * @\ref _WIZCHIP instance | ||||
|  */ | ||||
| //
 | ||||
| //M20150401 : For a compiler didnot support a member of structure
 | ||||
| //            Replace the assignment of struct members with the assingment of array
 | ||||
| //
 | ||||
| /*
 | ||||
| _WIZCHIP  WIZCHIP = | ||||
|       { | ||||
|       .id                  = _WIZCHIP_ID_, | ||||
|       .if_mode             = _WIZCHIP_IO_MODE_, | ||||
|       .CRIS._enter         = wizchip_cris_enter, | ||||
|       .CRIS._exit          = wizchip_cris_exit, | ||||
|       .CS._select          = wizchip_cs_select, | ||||
|       .CS._deselect        = wizchip_cs_deselect, | ||||
|       .IF.BUS._read_byte   = wizchip_bus_readbyte, | ||||
|       .IF.BUS._write_byte  = wizchip_bus_writebyte | ||||
| //    .IF.SPI._read_byte   = wizchip_spi_readbyte,
 | ||||
| //    .IF.SPI._write_byte  = wizchip_spi_writebyte
 | ||||
|       }; | ||||
| */       | ||||
| _WIZCHIP  WIZCHIP = | ||||
| { | ||||
|     _WIZCHIP_IO_MODE_, | ||||
|     _WIZCHIP_ID_ , | ||||
|     { | ||||
|         wizchip_cris_enter, | ||||
|         wizchip_cris_exit | ||||
|     }, | ||||
|     { | ||||
|         wizchip_cs_select, | ||||
|         wizchip_cs_deselect | ||||
|     }, | ||||
|     { | ||||
|         { | ||||
|             //M20150601 : Rename the function 
 | ||||
|             //wizchip_bus_readbyte,
 | ||||
|             //wizchip_bus_writebyte
 | ||||
|             wizchip_bus_readdata, | ||||
|             wizchip_bus_writedata | ||||
|         }, | ||||
| 
 | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| static uint8_t    _DNS_[4];      // DNS server ip address
 | ||||
| static dhcp_mode  _DHCP_;        // DHCP mode
 | ||||
| 
 | ||||
| void reg_wizchip_cris_cbfunc(void(*cris_en)(void), void(*cris_ex)(void)) | ||||
| { | ||||
|    if(!cris_en || !cris_ex) | ||||
|    { | ||||
|       WIZCHIP.CRIS._enter = wizchip_cris_enter; | ||||
|       WIZCHIP.CRIS._exit  = wizchip_cris_exit; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       WIZCHIP.CRIS._enter = cris_en; | ||||
|       WIZCHIP.CRIS._exit  = cris_ex; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void reg_wizchip_cs_cbfunc(void(*cs_sel)(void), void(*cs_desel)(void)) | ||||
| { | ||||
|    if(!cs_sel || !cs_desel) | ||||
|    { | ||||
|       WIZCHIP.CS._select   = wizchip_cs_select; | ||||
|       WIZCHIP.CS._deselect = wizchip_cs_deselect; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       WIZCHIP.CS._select   = cs_sel; | ||||
|       WIZCHIP.CS._deselect = cs_desel; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| //M20150515 : For integrating with W5300
 | ||||
| //void reg_wizchip_bus_cbfunc(uint8_t(*bus_rb)(uint32_t addr), void (*bus_wb)(uint32_t addr, uint8_t wb))
 | ||||
| void reg_wizchip_bus_cbfunc(iodata_t(*bus_rb)(uint32_t addr), void (*bus_wb)(uint32_t addr, iodata_t wb)) | ||||
| { | ||||
|    while(!(WIZCHIP.if_mode & _WIZCHIP_IO_MODE_BUS_)); | ||||
|    //M20150601 : Rename call back function for integrating with W5300
 | ||||
|    /*
 | ||||
|    if(!bus_rb || !bus_wb) | ||||
|    { | ||||
|       WIZCHIP.IF.BUS._read_byte   = wizchip_bus_readbyte; | ||||
|       WIZCHIP.IF.BUS._write_byte  = wizchip_bus_writebyte; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       WIZCHIP.IF.BUS._read_byte   = bus_rb; | ||||
|       WIZCHIP.IF.BUS._write_byte  = bus_wb; | ||||
|    } | ||||
|    */ | ||||
|    if(!bus_rb || !bus_wb) | ||||
|    { | ||||
|       WIZCHIP.IF.BUS._read_data   = wizchip_bus_readdata; | ||||
|       WIZCHIP.IF.BUS._write_data  = wizchip_bus_writedata; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       WIZCHIP.IF.BUS._read_data   = bus_rb; | ||||
|       WIZCHIP.IF.BUS._write_data  = bus_wb; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void reg_wizchip_spi_cbfunc(uint8_t (*spi_rb)(void), void (*spi_wb)(uint8_t wb)) | ||||
| { | ||||
|    while(!(WIZCHIP.if_mode & _WIZCHIP_IO_MODE_SPI_)); | ||||
|     | ||||
|    if(!spi_rb || !spi_wb) | ||||
|    { | ||||
|       WIZCHIP.IF.SPI._read_byte   = wizchip_spi_readbyte; | ||||
|       WIZCHIP.IF.SPI._write_byte  = wizchip_spi_writebyte; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       WIZCHIP.IF.SPI._read_byte   = spi_rb; | ||||
|       WIZCHIP.IF.SPI._write_byte  = spi_wb; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| // 20140626 Eric Added for SPI burst operations
 | ||||
| void reg_wizchip_spiburst_cbfunc(void (*spi_rb)(uint8_t* pBuf, uint16_t len), void (*spi_wb)(uint8_t* pBuf, uint16_t len)) | ||||
| { | ||||
|    while(!(WIZCHIP.if_mode & _WIZCHIP_IO_MODE_SPI_)); | ||||
| 
 | ||||
|    if(!spi_rb || !spi_wb) | ||||
|    { | ||||
|       WIZCHIP.IF.SPI._read_burst   = wizchip_spi_readburst; | ||||
|       WIZCHIP.IF.SPI._write_burst  = wizchip_spi_writeburst; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       WIZCHIP.IF.SPI._read_burst   = spi_rb; | ||||
|       WIZCHIP.IF.SPI._write_burst  = spi_wb; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| int8_t ctlwizchip(ctlwizchip_type cwtype, void* arg) | ||||
| { | ||||
| #if	_WIZCHIP_ == W5100S || _WIZCHIP_ == W5200 || _WIZCHIP_ == W5500 | ||||
|    uint8_t tmp = 0; | ||||
| #endif | ||||
|    uint8_t* ptmp[2] = {0,0}; | ||||
|    switch(cwtype) | ||||
|    { | ||||
|       case CW_RESET_WIZCHIP: | ||||
|          wizchip_sw_reset(); | ||||
|          break; | ||||
|       case CW_INIT_WIZCHIP: | ||||
|          if(arg != 0)  | ||||
|          { | ||||
|             ptmp[0] = (uint8_t*)arg; | ||||
|             ptmp[1] = ptmp[0] + _WIZCHIP_SOCK_NUM_; | ||||
|          } | ||||
|          return wizchip_init(ptmp[0], ptmp[1]); | ||||
|       case CW_CLR_INTERRUPT: | ||||
|          wizchip_clrinterrupt(*((intr_kind*)arg)); | ||||
|          break; | ||||
|       case CW_GET_INTERRUPT: | ||||
|         *((intr_kind*)arg) = wizchip_getinterrupt(); | ||||
|          break; | ||||
|       case CW_SET_INTRMASK: | ||||
|          wizchip_setinterruptmask(*((intr_kind*)arg)); | ||||
|          break;          | ||||
|       case CW_GET_INTRMASK: | ||||
|          *((intr_kind*)arg) = wizchip_getinterruptmask(); | ||||
|          break; | ||||
|    //M20150601 : This can be supported by W5200, W5500
 | ||||
|    //#if _WIZCHIP_ > W5100
 | ||||
|    #if (_WIZCHIP_ == W5200 || _WIZCHIP_ == W5500) | ||||
|       case CW_SET_INTRTIME: | ||||
|          setINTLEVEL(*(uint16_t*)arg); | ||||
|          break; | ||||
|       case CW_GET_INTRTIME: | ||||
|          *(uint16_t*)arg = getINTLEVEL(); | ||||
|          break; | ||||
|    #endif | ||||
|       case CW_GET_ID: | ||||
|          ((uint8_t*)arg)[0] = WIZCHIP.id[0]; | ||||
|          ((uint8_t*)arg)[1] = WIZCHIP.id[1]; | ||||
|          ((uint8_t*)arg)[2] = WIZCHIP.id[2]; | ||||
|          ((uint8_t*)arg)[3] = WIZCHIP.id[3]; | ||||
|          ((uint8_t*)arg)[4] = WIZCHIP.id[4]; | ||||
|          ((uint8_t*)arg)[5] = 0; | ||||
|          break; | ||||
|    #if _WIZCHIP_ == W5100S || _WIZCHIP_ == W5500 | ||||
|       case CW_RESET_PHY: | ||||
|          wizphy_reset(); | ||||
|          break; | ||||
|       case CW_SET_PHYCONF: | ||||
|          wizphy_setphyconf((wiz_PhyConf*)arg); | ||||
|          break; | ||||
|       case CW_GET_PHYCONF: | ||||
|          wizphy_getphyconf((wiz_PhyConf*)arg); | ||||
|          break; | ||||
|       case CW_GET_PHYSTATUS: | ||||
|          break; | ||||
|       case CW_SET_PHYPOWMODE: | ||||
|          return wizphy_setphypmode(*(uint8_t*)arg); | ||||
|    #endif | ||||
|    #if _WIZCHIP_ == W5100S || _WIZCHIP_ == W5200 || _WIZCHIP_ == W5500 | ||||
|       case CW_GET_PHYPOWMODE: | ||||
|          tmp = wizphy_getphypmode(); | ||||
|          if((int8_t)tmp == -1) return -1; | ||||
|          *(uint8_t*)arg = tmp; | ||||
|          break; | ||||
|       case CW_GET_PHYLINK: | ||||
|          tmp = wizphy_getphylink(); | ||||
|          if((int8_t)tmp == -1) return -1; | ||||
|          *(uint8_t*)arg = tmp; | ||||
|          break; | ||||
|    #endif       | ||||
|       default: | ||||
|          return -1; | ||||
|    } | ||||
|    return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int8_t ctlnetwork(ctlnetwork_type cntype, void* arg) | ||||
| { | ||||
|     | ||||
|    switch(cntype) | ||||
|    { | ||||
|       case CN_SET_NETINFO: | ||||
|          wizchip_setnetinfo((wiz_NetInfo*)arg); | ||||
|          break; | ||||
|       case CN_GET_NETINFO: | ||||
|          wizchip_getnetinfo((wiz_NetInfo*)arg); | ||||
|          break; | ||||
|       case CN_SET_NETMODE: | ||||
|          return wizchip_setnetmode(*(netmode_type*)arg); | ||||
|       case CN_GET_NETMODE: | ||||
|          *(netmode_type*)arg = wizchip_getnetmode(); | ||||
|          break; | ||||
|       case CN_SET_TIMEOUT: | ||||
|          wizchip_settimeout((wiz_NetTimeout*)arg); | ||||
|          break; | ||||
|       case CN_GET_TIMEOUT: | ||||
|          wizchip_gettimeout((wiz_NetTimeout*)arg); | ||||
|          break; | ||||
|       default: | ||||
|          return -1; | ||||
|    } | ||||
|    return 0; | ||||
| } | ||||
| 
 | ||||
| void wizchip_sw_reset(void) | ||||
| { | ||||
|    uint8_t gw[4], sn[4], sip[4]; | ||||
|    uint8_t mac[6]; | ||||
| //A20150601
 | ||||
| #if _WIZCHIP_IO_MODE_  == _WIZCHIP_IO_MODE_BUS_INDIR_ | ||||
|    uint16_t mr = (uint16_t)getMR(); | ||||
|    setMR(mr | MR_IND); | ||||
| #endif | ||||
| //
 | ||||
|    getSHAR(mac); | ||||
|    getGAR(gw);  getSUBR(sn);  getSIPR(sip); | ||||
|    setMR(MR_RST); | ||||
|    getMR(); // for delay
 | ||||
| //A2015051 : For indirect bus mode 
 | ||||
| #if _WIZCHIP_IO_MODE_  == _WIZCHIP_IO_MODE_BUS_INDIR_ | ||||
|    setMR(mr | MR_IND); | ||||
| #endif | ||||
| //
 | ||||
|    setSHAR(mac); | ||||
|    setGAR(gw); | ||||
|    setSUBR(sn); | ||||
|    setSIPR(sip); | ||||
| } | ||||
| 
 | ||||
| int8_t wizchip_init(uint8_t* txsize, uint8_t* rxsize) | ||||
| { | ||||
|    int8_t i; | ||||
| #if _WIZCHIP_ < W5200 | ||||
|    int8_t j; | ||||
| #endif | ||||
|    int8_t tmp = 0; | ||||
|    wizchip_sw_reset(); | ||||
|    if(txsize) | ||||
|    { | ||||
|       tmp = 0; | ||||
|    //M20150601 : For integrating with W5300
 | ||||
|    #if _WIZCHIP_ == W5300 | ||||
| 		for(i = 0 ; i < _WIZCHIP_SOCK_NUM_; i++) | ||||
| 		{ | ||||
| 			if(txsize[i] >= 64) return -1;   //No use 64KB even if W5300 support max 64KB memory allocation
 | ||||
| 			tmp += txsize[i]; | ||||
| 			if(tmp > 128) return -1; | ||||
| 		} | ||||
| 		if(tmp % 8) return -1; | ||||
|    #else | ||||
| 		for(i = 0 ; i < _WIZCHIP_SOCK_NUM_; i++) | ||||
| 		{ | ||||
| 			tmp += txsize[i]; | ||||
| 
 | ||||
| 		#if _WIZCHIP_ < W5200	//2016.10.28 peter add condition for w5100 and w5100s
 | ||||
| 			if(tmp > 8) return -1; | ||||
| 		#else | ||||
| 			if(tmp > 16) return -1; | ||||
| 		#endif | ||||
| 		} | ||||
| 		for(i = 0 ; i < _WIZCHIP_SOCK_NUM_; i++) | ||||
| 		{ | ||||
| 		#if _WIZCHIP_ < W5200	//2016.10.28 peter add condition for w5100
 | ||||
| 			j = 0; | ||||
| 			while((txsize[i] >> j != 1)&&(txsize[i] !=0)){j++;} | ||||
| 			setSn_TXBUF_SIZE(i, j); | ||||
| 		#else | ||||
| 			setSn_TXBUF_SIZE(i, txsize[i]); | ||||
| 		#endif | ||||
| 		} | ||||
| 
 | ||||
| 	#endif | ||||
|    } | ||||
| 
 | ||||
|    if(rxsize) | ||||
|    { | ||||
|       tmp = 0; | ||||
|    #if _WIZCHIP_ == W5300 | ||||
|       for(i = 0 ; i < _WIZCHIP_SOCK_NUM_; i++) | ||||
| 		{ | ||||
| 			if(rxsize[i] >= 64) return -1;   //No use 64KB even if W5300 support max 64KB memory allocation
 | ||||
| 			tmp += rxsize[i]; | ||||
| 			if(tmp > 128) return -1; | ||||
| 		} | ||||
| 		if(tmp % 8) return -1; | ||||
|    #else | ||||
| 		for(i = 0 ; i < _WIZCHIP_SOCK_NUM_; i++) | ||||
| 		{ | ||||
| 			tmp += rxsize[i]; | ||||
| 		#if _WIZCHIP_ < W5200	//2016.10.28 peter add condition for w5100 and w5100s
 | ||||
| 			if(tmp > 8) return -1; | ||||
| 		#else | ||||
| 			if(tmp > 16) return -1; | ||||
| 		#endif | ||||
| 		} | ||||
| 
 | ||||
| 		for(i = 0 ; i < _WIZCHIP_SOCK_NUM_; i++) | ||||
| 		{ | ||||
| 		#if _WIZCHIP_ < W5200	// add condition for w5100
 | ||||
| 			j = 0; | ||||
| 			while((rxsize[i] >> j != 1)&&(txsize[i] !=0)){j++;} | ||||
| 			setSn_RXBUF_SIZE(i, j); | ||||
| 		#else | ||||
| 			setSn_RXBUF_SIZE(i, rxsize[i]); | ||||
| 		#endif | ||||
| 		} | ||||
| 	#endif | ||||
|    } | ||||
|    return 0; | ||||
| } | ||||
| 
 | ||||
| void wizchip_clrinterrupt(intr_kind intr) | ||||
| { | ||||
|    uint8_t ir  = (uint8_t)intr; | ||||
|    uint8_t sir = (uint8_t)((uint16_t)intr >> 8); | ||||
| #if _WIZCHIP_ < W5500 | ||||
|    ir |= (1<<4); // IK_WOL
 | ||||
| #endif | ||||
| #if _WIZCHIP_ == W5200 | ||||
|    ir |= (1 << 6); | ||||
| #endif | ||||
|     | ||||
| #if _WIZCHIP_ < W5200 | ||||
|    sir &= 0x0F; | ||||
| #endif | ||||
| 
 | ||||
| #if _WIZCHIP_ <= W5100S | ||||
|    ir |= sir; | ||||
|    setIR(ir); | ||||
| //A20150601 : For integrating with W5300
 | ||||
| #elif _WIZCHIP_ == W5300 | ||||
|    setIR( ((((uint16_t)ir) << 8) | (((uint16_t)sir) & 0x00FF)) ); | ||||
| #else | ||||
|    setIR(ir); | ||||
|    setSIR(sir); | ||||
| #endif    | ||||
| } | ||||
| 
 | ||||
| intr_kind wizchip_getinterrupt(void) | ||||
| { | ||||
|    uint8_t ir  = 0; | ||||
|    uint8_t sir = 0; | ||||
|    uint16_t ret = 0; | ||||
| #if _WIZCHIP_ <= W5100S | ||||
|    ir = getIR(); | ||||
|    sir = ir & 0x0F; | ||||
| //A20150601 : For integrating with W5300
 | ||||
| #elif _WIZCHIP_  == W5300 | ||||
|    ret = getIR(); | ||||
|    ir = (uint8_t)(ret >> 8); | ||||
|    sir = (uint8_t)ret; | ||||
| #else | ||||
|    ir  = getIR(); | ||||
|    sir = getSIR(); | ||||
| #endif          | ||||
| 
 | ||||
| //M20150601 : For Integrating with W5300
 | ||||
| //#if _WIZCHIP_ < W5500
 | ||||
| #if _WIZCHIP_ < W5200 | ||||
|    ir &= ~(1<<4); // IK_WOL
 | ||||
| #endif | ||||
| #if _WIZCHIP_ == W5200 | ||||
|    ir &= ~(1 << 6); | ||||
| #endif | ||||
|   ret = sir; | ||||
|   ret = (ret << 8) + ir; | ||||
|   return (intr_kind)ret; | ||||
| } | ||||
| 
 | ||||
| void wizchip_setinterruptmask(intr_kind intr) | ||||
| { | ||||
|    uint8_t imr  = (uint8_t)intr; | ||||
|    uint8_t simr = (uint8_t)((uint16_t)intr >> 8); | ||||
| #if _WIZCHIP_ < W5500 | ||||
|    imr &= ~(1<<4); // IK_WOL
 | ||||
| #endif | ||||
| #if _WIZCHIP_ == W5200 | ||||
|    imr &= ~(1 << 6); | ||||
| #endif | ||||
|     | ||||
| #if _WIZCHIP_ < W5200 | ||||
|    simr &= 0x0F; | ||||
|    imr |= simr; | ||||
|    setIMR(imr); | ||||
| //A20150601 : For integrating with W5300
 | ||||
| #elif _WIZCHIP_ == W5300 | ||||
|    setIMR( ((((uint16_t)imr) << 8) | (((uint16_t)simr) & 0x00FF)) ); | ||||
| #else | ||||
|    setIMR(imr); | ||||
|    setSIMR(simr); | ||||
| #endif    | ||||
| } | ||||
| 
 | ||||
| intr_kind wizchip_getinterruptmask(void) | ||||
| { | ||||
|    uint8_t imr  = 0; | ||||
|    uint8_t simr = 0; | ||||
|    uint16_t ret = 0; | ||||
| #if _WIZCHIP_ < W5200 | ||||
|    imr  = getIMR(); | ||||
|    simr = imr & 0x0F; | ||||
| //A20150601 : For integrating with W5300
 | ||||
| #elif _WIZCHIP_ == W5300 | ||||
|    ret = getIMR(); | ||||
|    imr = (uint8_t)(ret >> 8); | ||||
|    simr = (uint8_t)ret; | ||||
| #else | ||||
|    imr  = getIMR(); | ||||
|    simr = getSIMR(); | ||||
| #endif          | ||||
| 
 | ||||
| #if _WIZCHIP_ < W5500 | ||||
|    imr &= ~(1<<4); // IK_WOL
 | ||||
| #endif | ||||
| #if _WIZCHIP_ == W5200 | ||||
|    imr &= ~(1 << 6);  // IK_DEST_UNREACH
 | ||||
| #endif | ||||
|   ret = simr; | ||||
|   ret = (ret << 8) + imr; | ||||
|   return (intr_kind)ret; | ||||
| } | ||||
| 
 | ||||
| int8_t wizphy_getphylink(void) | ||||
| { | ||||
|    int8_t tmp = PHY_LINK_OFF; | ||||
| #if _WIZCHIP_ == W5100S | ||||
|    if(getPHYSR() & PHYSR_LNK) | ||||
| 	   tmp = PHY_LINK_ON; | ||||
| #elif   _WIZCHIP_ == W5200 | ||||
|    if(getPHYSTATUS() & PHYSTATUS_LINK) | ||||
|       tmp = PHY_LINK_ON; | ||||
| #elif _WIZCHIP_ == W5500 | ||||
|    if(getPHYCFGR() & PHYCFGR_LNK_ON) | ||||
|       tmp = PHY_LINK_ON; | ||||
| 
 | ||||
| #else | ||||
|    tmp = -1; | ||||
| #endif | ||||
|    return tmp; | ||||
| } | ||||
| 
 | ||||
| #if _WIZCHIP_ > W5100 | ||||
| 
 | ||||
| int8_t wizphy_getphypmode(void) | ||||
| { | ||||
|    int8_t tmp = 0; | ||||
|    #if   _WIZCHIP_ == W5200 | ||||
|       if(getPHYSTATUS() & PHYSTATUS_POWERDOWN) | ||||
|          tmp = PHY_POWER_DOWN; | ||||
|       else           | ||||
|          tmp = PHY_POWER_NORM; | ||||
|    #elif _WIZCHIP_ == 5500 | ||||
|       if((getPHYCFGR() & PHYCFGR_OPMDC_ALLA) == PHYCFGR_OPMDC_PDOWN) | ||||
|          tmp = PHY_POWER_DOWN; | ||||
|       else  | ||||
|          tmp = PHY_POWER_NORM; | ||||
|    #else | ||||
|       tmp = -1; | ||||
|    #endif | ||||
|    return tmp; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #if _WIZCHIP_ == W5100S | ||||
| void wizphy_reset(void) | ||||
| { | ||||
| 	uint16_t tmp = wiz_mdio_read(PHYMDIO_BMCR); | ||||
| 	tmp |= BMCR_RESET; | ||||
| 	wiz_mdio_write(PHYMDIO_BMCR, tmp); | ||||
| 	while(wiz_mdio_read(PHYMDIO_BMCR)&BMCR_RESET){} | ||||
| } | ||||
| 
 | ||||
| void wizphy_setphyconf(wiz_PhyConf* phyconf) | ||||
| { | ||||
|    uint16_t tmp = wiz_mdio_read(PHYMDIO_BMCR); | ||||
|    if(phyconf->mode == PHY_MODE_AUTONEGO) | ||||
|       tmp |= BMCR_AUTONEGO; | ||||
|    else | ||||
|    { | ||||
| 	  tmp &= ~BMCR_AUTONEGO; | ||||
|       if(phyconf->duplex == PHY_DUPLEX_FULL) | ||||
|       { | ||||
|     	  tmp |= BMCR_DUP; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|     	  tmp &= ~BMCR_DUP; | ||||
|       } | ||||
|       if(phyconf->speed == PHY_SPEED_100) | ||||
|       { | ||||
|     	  tmp |= BMCR_SPEED; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|     	  tmp &= ~BMCR_SPEED; | ||||
|       } | ||||
|    } | ||||
|    wiz_mdio_write(PHYMDIO_BMCR, tmp); | ||||
| } | ||||
| 
 | ||||
| void wizphy_getphyconf(wiz_PhyConf* phyconf) | ||||
| { | ||||
|    uint16_t tmp = 0; | ||||
|    tmp = wiz_mdio_read(PHYMDIO_BMCR); | ||||
|    phyconf->by   = PHY_CONFBY_SW; | ||||
|    if(tmp & BMCR_AUTONEGO) | ||||
|    { | ||||
| 	   phyconf->mode = PHY_MODE_AUTONEGO; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
| 	   phyconf->mode = PHY_MODE_MANUAL; | ||||
| 	   if(tmp&BMCR_DUP) phyconf->duplex = PHY_DUPLEX_FULL; | ||||
| 	   else phyconf->duplex = PHY_DUPLEX_HALF; | ||||
| 	   if(tmp&BMCR_SPEED) phyconf->speed = PHY_SPEED_100; | ||||
| 	   else phyconf->speed = PHY_SPEED_10; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| int8_t wizphy_setphypmode(uint8_t pmode) | ||||
| { | ||||
|    uint16_t tmp = 0; | ||||
|    tmp = wiz_mdio_read(PHYMDIO_BMCR); | ||||
|    if( pmode == PHY_POWER_DOWN) | ||||
|    { | ||||
|       tmp |= BMCR_PWDN; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
| 	   tmp &= ~BMCR_PWDN; | ||||
|    } | ||||
|    wiz_mdio_write(PHYMDIO_BMCR, tmp); | ||||
|    tmp = wiz_mdio_read(PHYMDIO_BMCR); | ||||
|    if( pmode == PHY_POWER_DOWN) | ||||
|    { | ||||
|       if(tmp & BMCR_PWDN) return 0; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       if((tmp & BMCR_PWDN) != BMCR_PWDN) return 0; | ||||
|    } | ||||
|    return -1; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| #if _WIZCHIP_ == W5500 | ||||
| void wizphy_reset(void) | ||||
| { | ||||
|    uint8_t tmp = getPHYCFGR(); | ||||
|    tmp &= PHYCFGR_RST; | ||||
|    setPHYCFGR(tmp); | ||||
|    tmp = getPHYCFGR(); | ||||
|    tmp |= ~PHYCFGR_RST; | ||||
|    setPHYCFGR(tmp); | ||||
| } | ||||
| 
 | ||||
| void wizphy_setphyconf(wiz_PhyConf* phyconf) | ||||
| { | ||||
|    uint8_t tmp = 0; | ||||
|    if(phyconf->by == PHY_CONFBY_SW) | ||||
|       tmp |= PHYCFGR_OPMD; | ||||
|    else | ||||
|       tmp &= ~PHYCFGR_OPMD; | ||||
|    if(phyconf->mode == PHY_MODE_AUTONEGO) | ||||
|       tmp |= PHYCFGR_OPMDC_ALLA; | ||||
|    else | ||||
|    { | ||||
|       if(phyconf->duplex == PHY_DUPLEX_FULL) | ||||
|       { | ||||
|          if(phyconf->speed == PHY_SPEED_100) | ||||
|             tmp |= PHYCFGR_OPMDC_100F; | ||||
|          else | ||||
|             tmp |= PHYCFGR_OPMDC_10F; | ||||
|       }    | ||||
|       else | ||||
|       { | ||||
|          if(phyconf->speed == PHY_SPEED_100) | ||||
|             tmp |= PHYCFGR_OPMDC_100H; | ||||
|          else | ||||
|             tmp |= PHYCFGR_OPMDC_10H; | ||||
|       } | ||||
|    } | ||||
|    setPHYCFGR(tmp); | ||||
|    wizphy_reset(); | ||||
| } | ||||
| 
 | ||||
| void wizphy_getphyconf(wiz_PhyConf* phyconf) | ||||
| { | ||||
|    uint8_t tmp = 0; | ||||
|    tmp = getPHYCFGR(); | ||||
|    phyconf->by   = (tmp & PHYCFGR_OPMD) ? PHY_CONFBY_SW : PHY_CONFBY_HW; | ||||
|    switch(tmp & PHYCFGR_OPMDC_ALLA) | ||||
|    { | ||||
|       case PHYCFGR_OPMDC_ALLA: | ||||
|       case PHYCFGR_OPMDC_100FA:  | ||||
|          phyconf->mode = PHY_MODE_AUTONEGO; | ||||
|          break; | ||||
|       default: | ||||
|          phyconf->mode = PHY_MODE_MANUAL; | ||||
|          break; | ||||
|    } | ||||
|    switch(tmp & PHYCFGR_OPMDC_ALLA) | ||||
|    { | ||||
|       case PHYCFGR_OPMDC_100FA: | ||||
|       case PHYCFGR_OPMDC_100F: | ||||
|       case PHYCFGR_OPMDC_100H: | ||||
|          phyconf->speed = PHY_SPEED_100; | ||||
|          break; | ||||
|       default: | ||||
|          phyconf->speed = PHY_SPEED_10; | ||||
|          break; | ||||
|    } | ||||
|    switch(tmp & PHYCFGR_OPMDC_ALLA) | ||||
|    { | ||||
|       case PHYCFGR_OPMDC_100FA: | ||||
|       case PHYCFGR_OPMDC_100F: | ||||
|       case PHYCFGR_OPMDC_10F: | ||||
|          phyconf->duplex = PHY_DUPLEX_FULL; | ||||
|          break; | ||||
|       default: | ||||
|          phyconf->duplex = PHY_DUPLEX_HALF; | ||||
|          break; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void wizphy_getphystat(wiz_PhyConf* phyconf) | ||||
| { | ||||
|    uint8_t tmp = getPHYCFGR(); | ||||
|    phyconf->duplex = (tmp & PHYCFGR_DPX_FULL) ? PHY_DUPLEX_FULL : PHY_DUPLEX_HALF; | ||||
|    phyconf->speed  = (tmp & PHYCFGR_SPD_100) ? PHY_SPEED_100 : PHY_SPEED_10; | ||||
| } | ||||
| 
 | ||||
| int8_t wizphy_setphypmode(uint8_t pmode) | ||||
| { | ||||
|    uint8_t tmp = 0; | ||||
|    tmp = getPHYCFGR(); | ||||
|    if((tmp & PHYCFGR_OPMD)== 0) return -1; | ||||
|    tmp &= ~PHYCFGR_OPMDC_ALLA;          | ||||
|    if( pmode == PHY_POWER_DOWN) | ||||
|       tmp |= PHYCFGR_OPMDC_PDOWN; | ||||
|    else | ||||
|       tmp |= PHYCFGR_OPMDC_ALLA; | ||||
|    setPHYCFGR(tmp); | ||||
|    wizphy_reset(); | ||||
|    tmp = getPHYCFGR(); | ||||
|    if( pmode == PHY_POWER_DOWN) | ||||
|    { | ||||
|       if(tmp & PHYCFGR_OPMDC_PDOWN) return 0; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       if(tmp & PHYCFGR_OPMDC_ALLA) return 0; | ||||
|    } | ||||
|    return -1; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| void wizchip_setnetinfo(wiz_NetInfo* pnetinfo) | ||||
| { | ||||
|    setSHAR(pnetinfo->mac); | ||||
|    setGAR(pnetinfo->gw); | ||||
|    setSUBR(pnetinfo->sn); | ||||
|    setSIPR(pnetinfo->ip); | ||||
|    _DNS_[0] = pnetinfo->dns[0]; | ||||
|    _DNS_[1] = pnetinfo->dns[1]; | ||||
|    _DNS_[2] = pnetinfo->dns[2]; | ||||
|    _DNS_[3] = pnetinfo->dns[3]; | ||||
|    _DHCP_   = pnetinfo->dhcp; | ||||
| } | ||||
| 
 | ||||
| void wizchip_getnetinfo(wiz_NetInfo* pnetinfo) | ||||
| { | ||||
|    getSHAR(pnetinfo->mac); | ||||
|    getGAR(pnetinfo->gw); | ||||
|    getSUBR(pnetinfo->sn); | ||||
|    getSIPR(pnetinfo->ip); | ||||
|    pnetinfo->dns[0]= _DNS_[0]; | ||||
|    pnetinfo->dns[1]= _DNS_[1]; | ||||
|    pnetinfo->dns[2]= _DNS_[2]; | ||||
|    pnetinfo->dns[3]= _DNS_[3]; | ||||
|    pnetinfo->dhcp  = _DHCP_; | ||||
| } | ||||
| 
 | ||||
| int8_t wizchip_setnetmode(netmode_type netmode) | ||||
| { | ||||
|    uint8_t tmp = 0; | ||||
| #if _WIZCHIP_ != W5500 | ||||
|    if(netmode & ~(NM_WAKEONLAN | NM_PPPOE | NM_PINGBLOCK)) return -1; | ||||
| #else | ||||
|    if(netmode & ~(NM_WAKEONLAN | NM_PPPOE | NM_PINGBLOCK | NM_FORCEARP)) return -1; | ||||
| #endif       | ||||
|    tmp = getMR(); | ||||
|    tmp |= (uint8_t)netmode; | ||||
|    setMR(tmp); | ||||
|    return 0; | ||||
| } | ||||
| 
 | ||||
| netmode_type wizchip_getnetmode(void) | ||||
| { | ||||
|    return (netmode_type) getMR(); | ||||
| } | ||||
| 
 | ||||
| void wizchip_settimeout(wiz_NetTimeout* nettime) | ||||
| { | ||||
|    setRCR(nettime->retry_cnt); | ||||
|    setRTR(nettime->time_100us); | ||||
| } | ||||
| 
 | ||||
| void wizchip_gettimeout(wiz_NetTimeout* nettime) | ||||
| { | ||||
|    nettime->retry_cnt = getRCR(); | ||||
|    nettime->time_100us = getRTR(); | ||||
| } | ||||
| @ -0,0 +1,660 @@ | ||||
| //*****************************************************************************
 | ||||
| //
 | ||||
| //! \file wizchip_conf.h
 | ||||
| //! \brief WIZCHIP Config Header File.
 | ||||
| //! \version 1.0.0
 | ||||
| //! \date 2013/10/21
 | ||||
| //! \par  Revision history
 | ||||
| //!       <2015/02/05> Notice
 | ||||
| //!        The version history is not updated after this point.
 | ||||
| //!        Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary.
 | ||||
| //!        >> https://github.com/Wiznet/ioLibrary_Driver
 | ||||
| //!       <2013/10/21> 1st Release
 | ||||
| //! \author MidnightCow
 | ||||
| //! \copyright
 | ||||
| //!
 | ||||
| //! Copyright (c)  2013, WIZnet Co., LTD.
 | ||||
| //! All rights reserved.
 | ||||
| //! 
 | ||||
| //! Redistribution and use in source and binary forms, with or without 
 | ||||
| //! modification, are permitted provided that the following conditions 
 | ||||
| //! are met: 
 | ||||
| //! 
 | ||||
| //!     * Redistributions of source code must retain the above copyright 
 | ||||
| //! notice, this list of conditions and the following disclaimer. 
 | ||||
| //!     * Redistributions in binary form must reproduce the above copyright
 | ||||
| //! notice, this list of conditions and the following disclaimer in the
 | ||||
| //! documentation and/or other materials provided with the distribution. 
 | ||||
| //!     * Neither the name of the <ORGANIZATION> nor the names of its 
 | ||||
| //! contributors may be used to endorse or promote products derived 
 | ||||
| //! from this software without specific prior written permission. 
 | ||||
| //! 
 | ||||
| //! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | ||||
| //! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 | ||||
| //! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | ||||
| //! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 | ||||
| //! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 | ||||
| //! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 | ||||
| //! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | ||||
| //! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | ||||
| //! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 | ||||
| //! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 | ||||
| //! THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| //*****************************************************************************
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup extra_functions 2. WIZnet Extra Functions | ||||
|  * | ||||
|  * @brief These functions is optional function. It could be replaced at WIZCHIP I/O function because they were made by WIZCHIP I/O functions.   | ||||
|  * @details There are functions of configuring WIZCHIP, network, interrupt, phy, network information and timer. \n | ||||
|  *  | ||||
|  */ | ||||
| 
 | ||||
| #ifndef  _WIZCHIP_CONF_H_ | ||||
| #define  _WIZCHIP_CONF_H_ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| /**
 | ||||
|  * @brief Select WIZCHIP. | ||||
|  * @todo You should select one, \b W5100, \b W5100S, \b W5200, \b W5300, \b W5500 or etc. \n\n | ||||
|  *       ex> <code> #define \_WIZCHIP_      W5500 </code> | ||||
|  */ | ||||
| 
 | ||||
| #define W5100						5100 | ||||
| #define W5100S						5100+5 | ||||
| #define W5200						5200 | ||||
| #define W5300						5300 | ||||
| #define W5500						5500 | ||||
| 
 | ||||
| #ifndef _WIZCHIP_ | ||||
| #define _WIZCHIP_                      W5500   // W5100, W5100S, W5200, W5300, W5500
 | ||||
| #endif | ||||
| 
 | ||||
| #define _WIZCHIP_IO_MODE_NONE_         0x0000 | ||||
| #define _WIZCHIP_IO_MODE_BUS_          0x0100 /**< Bus interface mode */ | ||||
| #define _WIZCHIP_IO_MODE_SPI_          0x0200 /**< SPI interface mode */ | ||||
| //#define _WIZCHIP_IO_MODE_IIC_          0x0400
 | ||||
| //#define _WIZCHIP_IO_MODE_SDIO_         0x0800
 | ||||
| // Add to
 | ||||
| //
 | ||||
| 
 | ||||
| #define _WIZCHIP_IO_MODE_BUS_DIR_      (_WIZCHIP_IO_MODE_BUS_ + 1) /**< BUS interface mode for direct  */ | ||||
| #define _WIZCHIP_IO_MODE_BUS_INDIR_    (_WIZCHIP_IO_MODE_BUS_ + 2) /**< BUS interface mode for indirect */ | ||||
| 
 | ||||
| #define _WIZCHIP_IO_MODE_SPI_VDM_      (_WIZCHIP_IO_MODE_SPI_ + 1) /**< SPI interface mode for variable length data*/ | ||||
| #define _WIZCHIP_IO_MODE_SPI_FDM_      (_WIZCHIP_IO_MODE_SPI_ + 2) /**< SPI interface mode for fixed length data mode*/ | ||||
| #define _WIZCHIP_IO_MODE_SPI_5500_     (_WIZCHIP_IO_MODE_SPI_ + 3) /**< SPI interface mode for fixed length data mode*/ | ||||
| 
 | ||||
| #if   (_WIZCHIP_ == W5100) | ||||
|    #define _WIZCHIP_ID_                "W5100\0" | ||||
| /**
 | ||||
|  * @brief Define interface mode. | ||||
|  * @todo you should select interface mode as chip. Select one of @ref \_WIZCHIP_IO_MODE_SPI_ , @ref \_WIZCHIP_IO_MODE_BUS_DIR_ or @ref \_WIZCHIP_IO_MODE_BUS_INDIR_ | ||||
|  */ | ||||
| // 	#define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_BUS_DIR_
 | ||||
| //	#define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_BUS_INDIR_
 | ||||
|    	   #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_ | ||||
| 
 | ||||
| //A20150601 : Define the unit of IO DATA.   
 | ||||
|    typedef   uint8_t   iodata_t; | ||||
| //A20150401 : Indclude W5100.h file
 | ||||
|    #include "W5100/w5100.h" | ||||
| 
 | ||||
| #elif (_WIZCHIP_ == W5100S) | ||||
| #define _WIZCHIP_ID_                "W5100S\0" | ||||
| /**
 | ||||
| * @brief Define interface mode. | ||||
| * @todo you should select interface mode as chip. Select one of @ref \_WIZCHIP_IO_MODE_SPI_ , @ref \_WIZCHIP_IO_MODE_BUS_DIR_ or @ref \_WIZCHIP_IO_MODE_BUS_INDIR_ | ||||
| */ | ||||
| //	#define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_BUS_INDIR_
 | ||||
| 	//#define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_5500_
 | ||||
| 	#define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_ | ||||
| 
 | ||||
| //A20150601 : Define the unit of IO DATA.
 | ||||
|    typedef   uint8_t   iodata_t; | ||||
| //A20150401 : Indclude W5100.h file
 | ||||
| 	#include "W5100S/w5100s.h" | ||||
| #elif (_WIZCHIP_ == W5200) | ||||
|    #define _WIZCHIP_ID_                "W5200\0" | ||||
| /**
 | ||||
|  * @brief Define interface mode. | ||||
|  * @todo you should select interface mode as chip. Select one of @ref \_WIZCHIP_IO_MODE_SPI_ or @ref \	_WIZCHIP_IO_MODE_BUS_INDIR_ | ||||
|  */ | ||||
| #ifndef _WIZCHIP_IO_MODE_ | ||||
| // #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_BUS_INDIR_
 | ||||
|    #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_ | ||||
| #endif | ||||
| //A20150601 : Define the unit of IO DATA.   
 | ||||
|    typedef   uint8_t   iodata_t; | ||||
|    #include "W5200/w5200.h" | ||||
| #elif (_WIZCHIP_ == W5500) | ||||
|   #define _WIZCHIP_ID_                 "W5500\0" | ||||
|    | ||||
| /**
 | ||||
|  * @brief Define interface mode. \n | ||||
|  * @todo Should select interface mode as chip.  | ||||
|  *        - @ref \_WIZCHIP_IO_MODE_SPI_ \n | ||||
|  *          -@ref \_WIZCHIP_IO_MODE_SPI_VDM_ : Valid only in @ref \_WIZCHIP_ == W5500 \n | ||||
|  *          -@ref \_WIZCHIP_IO_MODE_SPI_FDM_ : Valid only in @ref \_WIZCHIP_ == W5500 \n | ||||
|  *        - @ref \_WIZCHIP_IO_MODE_BUS_ \n | ||||
|  *          - @ref \_WIZCHIP_IO_MODE_BUS_DIR_ \n | ||||
|  *          - @ref \_WIZCHIP_IO_MODE_BUS_INDIR_ \n | ||||
|  *        - Others will be defined in future. \n\n | ||||
|  *        ex> <code> #define \_WIZCHIP_IO_MODE_ \_WIZCHIP_IO_MODE_SPI_VDM_ </code> | ||||
|  *        | ||||
|  */ | ||||
| #ifndef _WIZCHIP_IO_MODE_ | ||||
|    //#define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_FDM_
 | ||||
|    #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_VDM_ | ||||
| #endif | ||||
| //A20150601 : Define the unit of IO DATA.   
 | ||||
|    typedef   uint8_t   iodata_t; | ||||
|    #include "W5500/w5500.h" | ||||
| #elif ( _WIZCHIP_ == W5300) | ||||
|    #define _WIZCHIP_ID_                 "W5300\0" | ||||
| /**
 | ||||
|  * @brief Define interface mode. | ||||
|  * @todo you should select interface mode as chip. Select one of @ref \_WIZCHIP_IO_MODE_SPI_ , @ref \_WIZCHIP_IO_MODE_BUS_DIR_ or @ref \_WIZCHIP_IO_MODE_BUS_INDIR_ | ||||
|  */ | ||||
| #ifndef _WIZCHIP_IO_MODE_ | ||||
| //   #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_BUS_DIR_
 | ||||
|  #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_BUS_INDIR_ | ||||
| #endif | ||||
| 
 | ||||
| //A20150601 : Define the unit and bus width of IO DATA. 
 | ||||
|    /**
 | ||||
|     * @brief Select the data width 8 or 16 bits. | ||||
|     * @todo you should select the bus width. Select one of 8 or 16. | ||||
|     */ | ||||
|    #ifndef _WIZCHIP_IO_BUS_WIDTH_ | ||||
|    #define _WIZCHIP_IO_BUS_WIDTH_       8  // 16
 | ||||
|    #endif | ||||
|    #if _WIZCHIP_IO_BUS_WIDTH_ == 8 | ||||
|       typedef   uint8_t   iodata_t; | ||||
|    #elif _WIZCHIP_IO_BUS_WIDTH_ == 16 | ||||
|       typedef   uint16_t   iodata_t; | ||||
|    #else | ||||
|       #error "Unknown _WIZCHIP_IO_BUS_WIDTH_. It should be 8 or 16."	 | ||||
|    #endif | ||||
| //
 | ||||
|    #include "W5300/w5300.h" | ||||
| #else | ||||
|    #error "Unknown defined _WIZCHIP_. You should define one of 5100, 5200, and 5500 !!!" | ||||
| #endif | ||||
| 
 | ||||
| #ifndef _WIZCHIP_IO_MODE_ | ||||
|    #error "Undefined _WIZCHIP_IO_MODE_. You should define it !!!" | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Define I/O base address when BUS IF mode. | ||||
|  * @todo Should re-define it to fit your system when BUS IF Mode (@ref \_WIZCHIP_IO_MODE_BUS_, | ||||
|  *       @ref \_WIZCHIP_IO_MODE_BUS_DIR_, @ref \_WIZCHIP_IO_MODE_BUS_INDIR_). \n\n | ||||
|  *       ex> <code> #define \_WIZCHIP_IO_BASE_      0x00008000 </code> | ||||
|  */ | ||||
| #if _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_ | ||||
| 	#define _WIZCHIP_IO_BASE_				0x60000000	// for 5100S IND
 | ||||
| #elif _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_ | ||||
| 	#define _WIZCHIP_IO_BASE_				0x00000000	// for 5100S SPI
 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef _WIZCHIP_IO_BASE_ | ||||
| #define _WIZCHIP_IO_BASE_              0x00000000  // 0x8000
 | ||||
| #endif | ||||
| 
 | ||||
| //M20150401 : Typing Error
 | ||||
| //#if _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS
 | ||||
| #if _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_ | ||||
|    #ifndef _WIZCHIP_IO_BASE_ | ||||
|       #error "You should be define _WIZCHIP_IO_BASE to fit your system memory map." | ||||
|    #endif | ||||
| #endif    | ||||
| 
 | ||||
| #if _WIZCHIP_ >= W5200 | ||||
|    #define _WIZCHIP_SOCK_NUM_   8   ///< The count of independant socket of @b WIZCHIP
 | ||||
| #else | ||||
|    #define _WIZCHIP_SOCK_NUM_   4   ///< The count of independant socket of @b WIZCHIP
 | ||||
| #endif       | ||||
| 
 | ||||
| 
 | ||||
| /********************************************************
 | ||||
| * WIZCHIP BASIC IF functions for SPI, SDIO, I2C , ETC. | ||||
| *********************************************************/ | ||||
| /**
 | ||||
|  * @ingroup DATA_TYPE | ||||
|  * @brief The set of callback functions for W5500:@ref WIZCHIP_IO_Functions W5200:@ref WIZCHIP_IO_Functions_W5200 | ||||
|  */ | ||||
| typedef struct __WIZCHIP | ||||
| { | ||||
|    uint16_t  if_mode;               ///< host interface mode
 | ||||
|    uint8_t   id[6];                 ///< @b WIZCHIP ID such as @b 5100, @b 5200, @b 5500, and so on.
 | ||||
|    /**
 | ||||
|     * The set of critical section callback func. | ||||
|     */ | ||||
|    struct _CRIS | ||||
|    { | ||||
|       void (*_enter)  (void);       ///< crtical section enter 
 | ||||
|       void (*_exit) (void);         ///< critial section exit  
 | ||||
|    }CRIS;   | ||||
|    /**
 | ||||
|     *  The set of @ref \_WIZCHIP_ select control callback func. | ||||
|     */ | ||||
|    struct _CS | ||||
|    { | ||||
|       void (*_select)  (void);      ///< @ref \_WIZCHIP_ selected
 | ||||
|       void (*_deselect)(void);      ///< @ref \_WIZCHIP_ deselected
 | ||||
|    }CS;   | ||||
|    /**
 | ||||
|     * The set of interface IO callback func. | ||||
|     */ | ||||
|    union _IF | ||||
|    {	  | ||||
|       /**
 | ||||
|        * For BUS interface IO | ||||
|        */ | ||||
|       //M20156501 : Modify the function name for integrating with W5300
 | ||||
|       //struct
 | ||||
|       //{
 | ||||
|       //   uint8_t  (*_read_byte)  (uint32_t AddrSel);
 | ||||
|       //   void     (*_write_byte) (uint32_t AddrSel, uint8_t wb);
 | ||||
|       //}BUS;      
 | ||||
|       struct | ||||
|       { | ||||
|          iodata_t  (*_read_data)   (uint32_t AddrSel); | ||||
|          void      (*_write_data)  (uint32_t AddrSel, iodata_t wb); | ||||
|       }BUS;       | ||||
| 
 | ||||
|       /**
 | ||||
|        * For SPI interface IO | ||||
|        */ | ||||
|       struct | ||||
|       { | ||||
|          uint8_t (*_read_byte)   (void); | ||||
|          void    (*_write_byte)  (uint8_t wb); | ||||
|          void    (*_read_burst)  (uint8_t* pBuf, uint16_t len); | ||||
|          void    (*_write_burst) (uint8_t* pBuf, uint16_t len); | ||||
|       }SPI; | ||||
|       // To be added
 | ||||
|       //
 | ||||
|    }IF; | ||||
| }_WIZCHIP; | ||||
| 
 | ||||
| extern _WIZCHIP  WIZCHIP; | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup DATA_TYPE | ||||
|  *  WIZCHIP control type enumration used in @ref ctlwizchip(). | ||||
|  */ | ||||
| typedef enum | ||||
| { | ||||
|    CW_RESET_WIZCHIP,   ///< Resets WIZCHIP by softly
 | ||||
|    CW_INIT_WIZCHIP,    ///< Initializes to WIZCHIP with SOCKET buffer size 2 or 1 dimension array typed uint8_t.
 | ||||
|    CW_GET_INTERRUPT,   ///< Get Interrupt status of WIZCHIP
 | ||||
|    CW_CLR_INTERRUPT,   ///< Clears interrupt
 | ||||
|    CW_SET_INTRMASK,    ///< Masks interrupt
 | ||||
|    CW_GET_INTRMASK,    ///< Get interrupt mask
 | ||||
|    CW_SET_INTRTIME,    ///< Set interval time between the current and next interrupt. 
 | ||||
|    CW_GET_INTRTIME,    ///< Set interval time between the current and next interrupt. 
 | ||||
|    CW_GET_ID,          ///< Gets WIZCHIP name.
 | ||||
| 
 | ||||
| //D20150601 : For no modification your application code
 | ||||
| //#if _WIZCHIP_ ==  W5500
 | ||||
|    CW_RESET_PHY,       ///< Resets internal PHY. Valid Only W5500
 | ||||
|    CW_SET_PHYCONF,     ///< When PHY configured by internal register, PHY operation mode (Manual/Auto, 10/100, Half/Full). Valid Only W5000
 | ||||
|    CW_GET_PHYCONF,     ///< Get PHY operation mode in internal register. Valid Only W5500
 | ||||
|    CW_GET_PHYSTATUS,   ///< Get real PHY status on operating. Valid Only W5500
 | ||||
|    CW_SET_PHYPOWMODE,  ///< Set PHY power mode as normal and down when PHYSTATUS.OPMD == 1. Valid Only W5500
 | ||||
| //#endif
 | ||||
| //D20150601 : For no modification your application code
 | ||||
| //#if _WIZCHIP_ == W5200 || _WIZCHIP_ == W5500
 | ||||
|    CW_GET_PHYPOWMODE,  ///< Get PHY Power mode as down or normal, Valid Only W5100, W5200
 | ||||
|    CW_GET_PHYLINK      ///< Get PHY Link status, Valid Only W5100, W5200
 | ||||
| //#endif
 | ||||
| }ctlwizchip_type; | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup DATA_TYPE | ||||
|  *  Network control type enumration used in @ref ctlnetwork(). | ||||
|  */ | ||||
| typedef enum | ||||
| { | ||||
|    CN_SET_NETINFO,  ///< Set Network with @ref wiz_NetInfo
 | ||||
|    CN_GET_NETINFO,  ///< Get Network with @ref wiz_NetInfo
 | ||||
|    CN_SET_NETMODE,  ///< Set network mode as WOL, PPPoE, Ping Block, and Force ARP mode
 | ||||
|    CN_GET_NETMODE,  ///< Get network mode as WOL, PPPoE, Ping Block, and Force ARP mode
 | ||||
|    CN_SET_TIMEOUT,  ///< Set network timeout as retry count and time.
 | ||||
|    CN_GET_TIMEOUT,  ///< Get network timeout as retry count and time.
 | ||||
| }ctlnetwork_type; | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup DATA_TYPE | ||||
|  *  Interrupt kind when CW_SET_INTRRUPT, CW_GET_INTERRUPT, CW_SET_INTRMASK | ||||
|  *  and CW_GET_INTRMASK is used in @ref ctlnetwork(). | ||||
|  *  It can be used with OR operation. | ||||
|  */ | ||||
| typedef enum | ||||
| { | ||||
| #if   _WIZCHIP_ == W5500 | ||||
|    IK_WOL               = (1 << 4),   ///< Wake On Lan by receiving the magic packet. Valid in W500.
 | ||||
| #elif _WIZCHIP_ == W5300 | ||||
|    IK_FMTU              = (1 << 4),   ///< Received a ICMP message (Fragment MTU)   
 | ||||
| #endif    | ||||
| 
 | ||||
|    IK_PPPOE_TERMINATED  = (1 << 5),   ///< PPPoE Disconnected
 | ||||
| 
 | ||||
| #if _WIZCHIP_ != W5200 | ||||
|    IK_DEST_UNREACH      = (1 << 6),   ///< Destination IP & Port Unreachable, No use in W5200
 | ||||
| #endif    | ||||
| 
 | ||||
|    IK_IP_CONFLICT       = (1 << 7),   ///< IP conflict occurred
 | ||||
| 
 | ||||
|    IK_SOCK_0            = (1 << 8),   ///< Socket 0 interrupt
 | ||||
|    IK_SOCK_1            = (1 << 9),   ///< Socket 1 interrupt
 | ||||
|    IK_SOCK_2            = (1 << 10),  ///< Socket 2 interrupt
 | ||||
|    IK_SOCK_3            = (1 << 11),  ///< Socket 3 interrupt
 | ||||
| #if _WIZCHIP_ > W5100S | ||||
|    IK_SOCK_4            = (1 << 12),  ///< Socket 4 interrupt, No use in 5100
 | ||||
|    IK_SOCK_5            = (1 << 13),  ///< Socket 5 interrupt, No use in 5100
 | ||||
|    IK_SOCK_6            = (1 << 14),  ///< Socket 6 interrupt, No use in 5100
 | ||||
|    IK_SOCK_7            = (1 << 15),  ///< Socket 7 interrupt, No use in 5100
 | ||||
| #endif    | ||||
| 
 | ||||
| #if _WIZCHIP_ > W5100S | ||||
|    IK_SOCK_ALL          = (0xFF << 8) ///< All Socket interrupt
 | ||||
| #else | ||||
|    IK_SOCK_ALL          = (0x0F << 8) ///< All Socket interrupt
 | ||||
| #endif       | ||||
| }intr_kind; | ||||
| 
 | ||||
| #define PHY_CONFBY_HW            0     ///< Configured PHY operation mode by HW pin
 | ||||
| #define PHY_CONFBY_SW            1     ///< Configured PHY operation mode by SW register   
 | ||||
| #define PHY_MODE_MANUAL          0     ///< Configured PHY operation mode with user setting.
 | ||||
| #define PHY_MODE_AUTONEGO        1     ///< Configured PHY operation mode with auto-negotiation
 | ||||
| #define PHY_SPEED_10             0     ///< Link Speed 10
 | ||||
| #define PHY_SPEED_100            1     ///< Link Speed 100
 | ||||
| #define PHY_DUPLEX_HALF          0     ///< Link Half-Duplex
 | ||||
| #define PHY_DUPLEX_FULL          1     ///< Link Full-Duplex
 | ||||
| #define PHY_LINK_OFF             0     ///< Link Off
 | ||||
| #define PHY_LINK_ON              1     ///< Link On
 | ||||
| #define PHY_POWER_NORM           0     ///< PHY power normal mode
 | ||||
| #define PHY_POWER_DOWN           1     ///< PHY power down mode 
 | ||||
| 
 | ||||
| 
 | ||||
| #if _WIZCHIP_ == W5100S || _WIZCHIP_ == W5500 | ||||
| /**
 | ||||
|  * @ingroup DATA_TYPE | ||||
|  *  It configures PHY configuration when CW_SET PHYCONF or CW_GET_PHYCONF in W5500,   | ||||
|  *  and it indicates the real PHY status configured by HW or SW in all WIZCHIP. \n | ||||
|  *  Valid only in W5500. | ||||
|  */ | ||||
| typedef struct wiz_PhyConf_t | ||||
| { | ||||
|       uint8_t by;       ///< set by @ref PHY_CONFBY_HW or @ref PHY_CONFBY_SW
 | ||||
|       uint8_t mode;     ///< set by @ref PHY_MODE_MANUAL or @ref PHY_MODE_AUTONEGO
 | ||||
|       uint8_t speed;    ///< set by @ref PHY_SPEED_10 or @ref PHY_SPEED_100
 | ||||
|       uint8_t duplex;   ///< set by @ref PHY_DUPLEX_HALF @ref PHY_DUPLEX_FULL 
 | ||||
|       //uint8_t power;  ///< set by @ref PHY_POWER_NORM or @ref PHY_POWER_DOWN
 | ||||
|       //uint8_t link;   ///< Valid only in CW_GET_PHYSTATUS. set by @ref PHY_LINK_ON or PHY_DUPLEX_OFF 
 | ||||
|    }wiz_PhyConf; | ||||
| #endif    | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup DATA_TYPE | ||||
|  *  It used in setting dhcp_mode of @ref wiz_NetInfo. | ||||
|  */ | ||||
| typedef enum | ||||
| { | ||||
|    NETINFO_STATIC = 1,    ///< Static IP configuration by manually.
 | ||||
|    NETINFO_DHCP           ///< Dynamic IP configruation from a DHCP sever
 | ||||
| }dhcp_mode; | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup DATA_TYPE | ||||
|  *  Network Information for WIZCHIP | ||||
|  */ | ||||
| typedef struct wiz_NetInfo_t | ||||
| { | ||||
|    uint8_t mac[6];  ///< Source Mac Address
 | ||||
|    uint8_t ip[4];   ///< Source IP Address
 | ||||
|    uint8_t sn[4];   ///< Subnet Mask 
 | ||||
|    uint8_t gw[4];   ///< Gateway IP Address
 | ||||
|    uint8_t dns[4];  ///< DNS server IP Address
 | ||||
|    dhcp_mode dhcp;  ///< 1 - Static, 2 - DHCP
 | ||||
| }wiz_NetInfo; | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup DATA_TYPE | ||||
|  *  Network mode | ||||
|  */ | ||||
| typedef enum | ||||
| { | ||||
| #if _WIZCHIP_ == W5500 | ||||
|    NM_FORCEARP    = (1<<1),  ///< Force to APP send whenever udp data is sent. Valid only in W5500
 | ||||
| #endif    | ||||
|    NM_WAKEONLAN   = (1<<5),  ///< Wake On Lan 
 | ||||
|    NM_PINGBLOCK   = (1<<4),  ///< Block ping-request
 | ||||
|    NM_PPPOE       = (1<<3),  ///< PPPoE mode
 | ||||
| }netmode_type; | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup DATA_TYPE | ||||
|  *  Used in CN_SET_TIMEOUT or CN_GET_TIMEOUT of @ref ctlwizchip() for timeout configruation. | ||||
|  */ | ||||
| typedef struct wiz_NetTimeout_t | ||||
| { | ||||
|    uint8_t  retry_cnt;     ///< retry count 
 | ||||
|    uint16_t time_100us;    ///< time unit 100us
 | ||||
| }wiz_NetTimeout; | ||||
| 
 | ||||
| /**
 | ||||
|  *@brief Registers call back function for critical section of I/O functions such as | ||||
|  *\ref WIZCHIP_READ, @ref WIZCHIP_WRITE, @ref WIZCHIP_READ_BUF and @ref WIZCHIP_WRITE_BUF. | ||||
|  *@param cris_en : callback function for critical section enter. | ||||
|  *@param cris_ex : callback function for critical section exit. | ||||
|  *@todo Describe @ref WIZCHIP_CRITICAL_ENTER and @ref WIZCHIP_CRITICAL_EXIT marco or register your functions. | ||||
|  *@note If you do not describe or register, default functions(@ref wizchip_cris_enter & @ref wizchip_cris_exit) is called. | ||||
|  */ | ||||
| void reg_wizchip_cris_cbfunc(void(*cris_en)(void), void(*cris_ex)(void)); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  *@brief Registers call back function for WIZCHIP select & deselect. | ||||
|  *@param cs_sel : callback function for WIZCHIP select | ||||
|  *@param cs_desel : callback fucntion for WIZCHIP deselect | ||||
|  *@todo Describe @ref wizchip_cs_select and @ref wizchip_cs_deselect function or register your functions. | ||||
|  *@note If you do not describe or register, null function is called. | ||||
|  */ | ||||
| void reg_wizchip_cs_cbfunc(void(*cs_sel)(void), void(*cs_desel)(void)); | ||||
| 
 | ||||
| /**
 | ||||
|  *@brief Registers call back function for bus interface. | ||||
|  *@param bus_rb   : callback function to read byte data using system bus | ||||
|  *@param bus_wb   : callback function to write byte data using system bus | ||||
|  *@todo Describe @ref wizchip_bus_readbyte and @ref wizchip_bus_writebyte function | ||||
|  *or register your functions. | ||||
|  *@note If you do not describe or register, null function is called. | ||||
|  */ | ||||
| //M20150601 : For integrating with W5300
 | ||||
| //void reg_wizchip_bus_cbfunc(uint8_t (*bus_rb)(uint32_t addr), void (*bus_wb)(uint32_t addr, uint8_t wb));
 | ||||
| void reg_wizchip_bus_cbfunc(iodata_t (*bus_rb)(uint32_t addr), void (*bus_wb)(uint32_t addr, iodata_t wb)); | ||||
| 
 | ||||
| /**
 | ||||
|  *@brief Registers call back function for SPI interface. | ||||
|  *@param spi_rb : callback function to read byte using SPI | ||||
|  *@param spi_wb : callback function to write byte using SPI | ||||
|  *@todo Describe \ref wizchip_spi_readbyte and \ref wizchip_spi_writebyte function | ||||
|  *or register your functions. | ||||
|  *@note If you do not describe or register, null function is called. | ||||
|  */ | ||||
| void reg_wizchip_spi_cbfunc(uint8_t (*spi_rb)(void), void (*spi_wb)(uint8_t wb)); | ||||
| 
 | ||||
| /**
 | ||||
|  *@brief Registers call back function for SPI interface. | ||||
|  *@param spi_rb : callback function to burst read using SPI | ||||
|  *@param spi_wb : callback function to burst write using SPI | ||||
|  *@todo Describe \ref wizchip_spi_readbyte and \ref wizchip_spi_writebyte function | ||||
|  *or register your functions. | ||||
|  *@note If you do not describe or register, null function is called. | ||||
|  */ | ||||
| void reg_wizchip_spiburst_cbfunc(void (*spi_rb)(uint8_t* pBuf, uint16_t len), void (*spi_wb)(uint8_t* pBuf, uint16_t len)); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Controls to the WIZCHIP. | ||||
|  * @details Resets WIZCHIP & internal PHY, Configures PHY mode, Monitor PHY(Link,Speed,Half/Full/Auto), | ||||
|  * controls interrupt & mask and so on. | ||||
|  * @param cwtype : Decides to the control type | ||||
|  * @param arg : arg type is dependent on cwtype. | ||||
|  * @return  0 : Success \n | ||||
|  *         -1 : Fail because of invalid \ref ctlwizchip_type or unsupported \ref ctlwizchip_type in WIZCHIP  | ||||
|  */           | ||||
| int8_t ctlwizchip(ctlwizchip_type cwtype, void* arg); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Controls to network. | ||||
|  * @details Controls to network environment, mode, timeout and so on. | ||||
|  * @param cntype : Input. Decides to the control type | ||||
|  * @param arg : Inout. arg type is dependent on cntype. | ||||
|  * @return -1 : Fail because of invalid \ref ctlnetwork_type or unsupported \ref ctlnetwork_type in WIZCHIP \n | ||||
|  *          0 : Success       | ||||
|  */           | ||||
| int8_t ctlnetwork(ctlnetwork_type cntype, void* arg); | ||||
| 
 | ||||
| 
 | ||||
| /* 
 | ||||
|  * The following functions are implemented for internal use.  | ||||
|  * but You can call these functions for code size reduction instead of ctlwizchip() and ctlnetwork(). | ||||
|  */ | ||||
|   | ||||
| /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Reset WIZCHIP by softly. | ||||
|  */  | ||||
| void   wizchip_sw_reset(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Initializes WIZCHIP with socket buffer size | ||||
|  * @param txsize Socket tx buffer sizes. If null, initialized the default size 2KB. | ||||
|  * @param rxsize Socket rx buffer sizes. If null, initialized the default size 2KB. | ||||
|  * @return 0 : succcess \n | ||||
|  *        -1 : fail. Invalid buffer size | ||||
|  */ | ||||
| int8_t wizchip_init(uint8_t* txsize, uint8_t* rxsize); | ||||
| 
 | ||||
| /** 
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Clear Interrupt of WIZCHIP. | ||||
|  * @param intr : @ref intr_kind value operated OR. It can type-cast to uint16_t. | ||||
|  */ | ||||
| void wizchip_clrinterrupt(intr_kind intr); | ||||
| 
 | ||||
| /** 
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Get Interrupt of WIZCHIP. | ||||
|  * @return @ref intr_kind value operated OR. It can type-cast to uint16_t. | ||||
|  */ | ||||
| intr_kind wizchip_getinterrupt(void); | ||||
| 
 | ||||
| /** 
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Mask or Unmask Interrupt of WIZCHIP. | ||||
|  * @param intr : @ref intr_kind value operated OR. It can type-cast to uint16_t. | ||||
|  */ | ||||
| void wizchip_setinterruptmask(intr_kind intr); | ||||
| 
 | ||||
| /** 
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Get Interrupt mask of WIZCHIP. | ||||
|  * @return : The operated OR vaule of @ref intr_kind. It can type-cast to uint16_t. | ||||
|  */ | ||||
| intr_kind wizchip_getinterruptmask(void); | ||||
| 
 | ||||
| //todo
 | ||||
| #if _WIZCHIP_ > W5100 | ||||
|    int8_t wizphy_getphylink(void);              ///< get the link status of phy in WIZCHIP. No use in W5100
 | ||||
|    int8_t wizphy_getphypmode(void);             ///< get the power mode of PHY in WIZCHIP. No use in W5100
 | ||||
| #endif | ||||
| 
 | ||||
| #if _WIZCHIP_ == W5100S || _WIZCHIP_ == W5500 | ||||
|    void   wizphy_reset(void);                   ///< Reset phy. Vailid only in W5500
 | ||||
| /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Set the phy information for WIZCHIP without power mode | ||||
|  * @param phyconf : @ref wiz_PhyConf | ||||
|  */ | ||||
|    void   wizphy_setphyconf(wiz_PhyConf* phyconf);   | ||||
|  /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Get phy configuration information. | ||||
|  * @param phyconf : @ref wiz_PhyConf | ||||
|  */ | ||||
|    void   wizphy_getphyconf(wiz_PhyConf* phyconf);  | ||||
|  /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Get phy status. | ||||
|  * @param phyconf : @ref wiz_PhyConf | ||||
|  */  | ||||
|    void   wizphy_getphystat(wiz_PhyConf* phyconf); | ||||
|  /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief set the power mode of phy inside WIZCHIP. Refer to @ref PHYCFGR in W5500, @ref PHYSTATUS in W5200 | ||||
|  * @param pmode Settig value of power down mode. | ||||
|  */    | ||||
|    int8_t wizphy_setphypmode(uint8_t pmode);     | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
| * @ingroup extra_functions | ||||
|  * @brief Set the network information for WIZCHIP | ||||
|  * @param pnetinfo : @ref wizNetInfo | ||||
|  */ | ||||
| void wizchip_setnetinfo(wiz_NetInfo* pnetinfo); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Get the network information for WIZCHIP | ||||
|  * @param pnetinfo : @ref wizNetInfo | ||||
|  */ | ||||
| void wizchip_getnetinfo(wiz_NetInfo* pnetinfo); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Set the network mode such WOL, PPPoE, Ping Block, and etc.  | ||||
|  * @param pnetinfo Value of network mode. Refer to @ref netmode_type. | ||||
|  */ | ||||
| int8_t wizchip_setnetmode(netmode_type netmode); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Get the network mode such WOL, PPPoE, Ping Block, and etc.  | ||||
|  * @return Value of network mode. Refer to @ref netmode_type. | ||||
|  */ | ||||
| netmode_type wizchip_getnetmode(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Set retry time value(@ref _RTR_) and retry count(@ref _RCR_). | ||||
|  * @details @ref _RTR_ configures the retransmission timeout period and @ref _RCR_ configures the number of time of retransmission.   | ||||
|  * @param nettime @ref _RTR_ value and @ref _RCR_ value. Refer to @ref wiz_NetTimeout.  | ||||
|  */ | ||||
| void wizchip_settimeout(wiz_NetTimeout* nettime); | ||||
| 
 | ||||
| /**
 | ||||
|  * @ingroup extra_functions | ||||
|  * @brief Get retry time value(@ref _RTR_) and retry count(@ref _RCR_). | ||||
|  * @details @ref _RTR_ configures the retransmission timeout period and @ref _RCR_ configures the number of time of retransmission.   | ||||
|  * @param nettime @ref _RTR_ value and @ref _RCR_ value. Refer to @ref wiz_NetTimeout.  | ||||
|  */ | ||||
| void wizchip_gettimeout(wiz_NetTimeout* nettime); | ||||
| #ifdef __cplusplus | ||||
|  } | ||||
| #endif | ||||
| 
 | ||||
| #endif   // _WIZCHIP_CONF_H_
 | ||||
| @ -0,0 +1,402 @@ | ||||
| /**
 | ||||
|  @file		httpd.c | ||||
|  @brief 		functions associated http processing | ||||
|  */ | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include "socket.h" | ||||
| #include "httpParser.h" | ||||
| 
 | ||||
| /*****************************************************************************
 | ||||
|  * Public types/enumerations/variables | ||||
|  ****************************************************************************/ | ||||
| //uint8_t BUFPUB[2048];
 | ||||
| uint8_t BUFPUB[256]; | ||||
| 
 | ||||
| /*****************************************************************************
 | ||||
|  * Private functions | ||||
|  ****************************************************************************/ | ||||
| static void replacetochar(uint8_t * str, uint8_t oldchar, uint8_t newchar); 	/* Replace old character with new character in the string */ | ||||
| static uint8_t C2D(uint8_t c); 												/* Convert a character to HEX */ | ||||
| 
 | ||||
| /**
 | ||||
|  @brief	convert escape characters(%XX) to ASCII character | ||||
|  */  | ||||
| void unescape_http_url( | ||||
| 	char * url	/**< pointer to be converted ( escape characters )*/ | ||||
| 	) | ||||
| { | ||||
| 	int x, y; | ||||
| 
 | ||||
| 	for (x = 0, y = 0; url[y]; ++x, ++y) { | ||||
| 		if ((url[x] = url[y]) == '%') { | ||||
| 			url[x] = C2D(url[y+1])*0x10+C2D(url[y+2]); | ||||
| 			y+=2; | ||||
| 		} | ||||
| 	} | ||||
| 	url[x] = '\0'; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  @brief	make response header such as html, gif, jpeg,etc. | ||||
|  */  | ||||
| void make_http_response_head( | ||||
| 	char * buf, 	/**< pointer to response header to be made */ | ||||
| 	char type, 	/**< response type */ | ||||
| 	uint32_t len	/**< size of response header */ | ||||
| 	) | ||||
| { | ||||
| 	const char * head; | ||||
| 	char tmp[10]; | ||||
| 			 | ||||
| 	/*  file type*/ | ||||
| 	if 	(type == PTYPE_HTML) 		head = PSTR(RES_HTMLHEAD_OK); | ||||
| 	else if (type == PTYPE_GIF)		head = PSTR(RES_GIFHEAD_OK); | ||||
| 	else if (type == PTYPE_TEXT)	head = PSTR(RES_TEXTHEAD_OK); | ||||
| 	else if (type == PTYPE_JPEG)	head = PSTR(RES_JPEGHEAD_OK); | ||||
| 	else if (type == PTYPE_FLASH)	head = PSTR(RES_FLASHHEAD_OK); | ||||
| 	else if (type == PTYPE_XML) 	head = PSTR(RES_XMLHEAD_OK); | ||||
| 	else if (type == PTYPE_CSS) 	head = PSTR(RES_CSSHEAD_OK); | ||||
| 	else if (type == PTYPE_JSON)	head = PSTR(RES_JSONHEAD_OK); | ||||
| 	else if (type == PTYPE_JS)		head = PSTR(RES_JSHEAD_OK); | ||||
| 	else if (type == PTYPE_CGI)		head = PSTR(RES_CGIHEAD_OK); | ||||
| 	else if (type == PTYPE_PNG)		head = PSTR(RES_PNGHEAD_OK); | ||||
| 	else if (type == PTYPE_ICO)		head = PSTR(RES_ICOHEAD_OK); | ||||
| 	else if (type == PTYPE_TTF)		head = PSTR(RES_TTFHEAD_OK); | ||||
| 	else if (type == PTYPE_OTF)		head = PSTR(RES_OTFHEAD_OK); | ||||
| 	else if (type == PTYPE_WOFF)	head = PSTR(RES_WOFFHEAD_OK); | ||||
| 	else if (type == PTYPE_EOT)		head = PSTR(RES_EOTHEAD_OK); | ||||
| 	else if (type == PTYPE_SVG)		head = PSTR(RES_SVGHEAD_OK); | ||||
| #ifdef _HTTPPARSER_DEBUG_ | ||||
| 	else | ||||
| 	{ | ||||
| 		head = NULL; | ||||
| 		PRINTF("\r\n\r\n-MAKE HEAD UNKNOWN-\r\n"); | ||||
| 	} | ||||
| #else | ||||
| 	else head = NULL; | ||||
| #endif	 | ||||
| 
 | ||||
| 	sprintf(tmp, "%ld", len); | ||||
| 	strcpy_P(buf, head); | ||||
| 	strcat(buf, tmp); | ||||
| 	strcat(buf, "\r\n\r\n"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  @brief	find MIME type of a file | ||||
|  */  | ||||
| void find_http_uri_type( | ||||
| 	uint8_t * type, 	/**< type to be returned */ | ||||
| 	uint8_t * buff		/**< file name */ | ||||
| 	)  | ||||
| { | ||||
| 	/* Decide type according to extension*/ | ||||
| 
 | ||||
| 	char * buf; | ||||
| 	buf = (char *)buff; | ||||
| 
 | ||||
| 	if 	(strcasestr_P(buf, PSTR(".htm"))	|| strcasestr_P(buf, PSTR(".html")))	*type = PTYPE_HTML; | ||||
| 	else if (strcasestr_P(buf, PSTR(".gif")))							*type = PTYPE_GIF; | ||||
| 	else if (strcasestr_P(buf, PSTR(".text")) 	|| strstr_P(buf,PSTR(".txt")))	*type = PTYPE_TEXT; | ||||
| 	else if (strcasestr_P(buf, PSTR(".jpeg")) 	|| strstr_P(buf,PSTR(".jpg")))	*type = PTYPE_JPEG; | ||||
| 	else if (strcasestr_P(buf, PSTR(".swf"))) 							*type = PTYPE_FLASH; | ||||
| 	else if (strstr_P(buf, PSTR(".cgi")) 	|| strstr_P(buf,PSTR(".CGI")))	*type = PTYPE_CGI; | ||||
| 	else if (strstr_P(buf, PSTR(".json")) 	|| strstr_P(buf,PSTR(".JSON")))	*type = PTYPE_JSON; | ||||
| 	else if (strstr_P(buf, PSTR(".js")) 	|| strstr_P(buf,PSTR(".JS")))	*type = PTYPE_JS; | ||||
| 	else if (strstr_P(buf, PSTR(".CGI")) 	|| strstr_P(buf,PSTR(".cgi")))	*type = PTYPE_CGI; | ||||
| 	else if (strstr_P(buf, PSTR(".xml")) 	|| strstr_P(buf,PSTR(".XML")))	*type = PTYPE_XML; | ||||
| 	else if (strstr_P(buf, PSTR(".css")) 	|| strstr_P(buf,PSTR(".CSS")))	*type = PTYPE_CSS; | ||||
| 	else if (strstr_P(buf, PSTR(".png")) 	|| strstr_P(buf,PSTR(".PNG")))	*type = PTYPE_PNG; | ||||
| 	else if (strstr_P(buf, PSTR(".ico")) 	|| strstr_P(buf,PSTR(".ICO")))	*type = PTYPE_ICO; | ||||
| 	else if (strstr_P(buf, PSTR(".ttf")) 	|| strstr_P(buf,PSTR(".TTF")))	*type = PTYPE_TTF; | ||||
| 	else if (strstr_P(buf, PSTR(".otf")) 	|| strstr_P(buf,PSTR(".OTF")))	*type = PTYPE_OTF; | ||||
| 	else if (strstr_P(buf, PSTR(".woff")) 	|| strstr_P(buf,PSTR(".WOFF")))	*type = PTYPE_WOFF; | ||||
| 	else if (strstr_P(buf, PSTR(".eot")) 	|| strstr_P(buf,PSTR(".EOT")))	*type = PTYPE_EOT; | ||||
| 	else if (strstr_P(buf, PSTR(".svg")) 	|| strstr_P(buf,PSTR(".SVG")))	*type = PTYPE_SVG; | ||||
| 	else 													*type = PTYPE_ERR; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  @brief	parse http request from a peer | ||||
|  */  | ||||
| void parse_http_request( | ||||
| 	st_http_request * request, 	/**< request to be returned */ | ||||
| 	uint8_t * buf				/**< pointer to be parsed */ | ||||
| 	) | ||||
| { | ||||
|   char * nexttok; | ||||
|   nexttok = strtok((char*)buf," "); | ||||
|   if(!nexttok) | ||||
|   { | ||||
|     request->METHOD = METHOD_ERR; | ||||
|     return; | ||||
|   } | ||||
|   if(!strcmp_P(nexttok, PSTR("GET")) || !strcmp_P(nexttok,PSTR("get"))) | ||||
|   { | ||||
|     request->METHOD = METHOD_GET; | ||||
|     nexttok = strtok(NULL," "); | ||||
| 
 | ||||
|   } | ||||
|   else if (!strcmp_P(nexttok, PSTR("HEAD")) || !strcmp_P(nexttok,PSTR("head"))) | ||||
|   { | ||||
|     request->METHOD = METHOD_HEAD; | ||||
|     nexttok = strtok(NULL," "); | ||||
| 
 | ||||
|   } | ||||
|   else if (!strcmp_P(nexttok, PSTR("POST")) || !strcmp_P(nexttok,PSTR("post"))) | ||||
|   { | ||||
|     nexttok = strtok(NULL,"\0"); | ||||
|     request->METHOD = METHOD_POST; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     request->METHOD = METHOD_ERR; | ||||
|   } | ||||
| 
 | ||||
|   if(!nexttok) | ||||
|   { | ||||
|     request->METHOD = METHOD_ERR; | ||||
|     return; | ||||
|   } | ||||
|   strcpy((char *)request->URI, nexttok); | ||||
| } | ||||
| 
 | ||||
| #ifdef _OLD_ | ||||
| /**
 | ||||
|  @brief	get next parameter value in the request | ||||
|  */ | ||||
| uint8_t * get_http_param_value( | ||||
| 	char* uri,  | ||||
| 	char* param_name | ||||
| 	) | ||||
| { | ||||
| 	char tempURI[MAX_URI_SIZE]; | ||||
| 	uint8_t * name = 0; | ||||
| 	 | ||||
| 
 | ||||
| 	if(!uri || !param_name) return 0; | ||||
| 	 | ||||
| 	strcpy((char*)tempURI,uri); | ||||
| 	if((name = (uint8_t*)strstr(tempURI, param_name))) | ||||
| 	{ | ||||
| 		name += strlen(param_name) + 1; // strlen(para_name) + strlen("=")
 | ||||
| 		if((name = (uint8_t*)strtok((char *)name,"& \r\n\t\0"))) | ||||
| 		{ | ||||
| 			unescape_http_url((char *)name); | ||||
| 			replacetochar(name, '+', ' '); | ||||
| 		} | ||||
| 	} | ||||
| #ifdef _HTTPPARSER_DEBUG_ | ||||
| 	printf("  %s=%s",param_name,name); | ||||
| #endif	 | ||||
| 
 | ||||
| 	return name; | ||||
| } | ||||
| #else | ||||
| /**
 | ||||
|  @brief	get next parameter value in the request | ||||
|  */ | ||||
| uint8_t * get_http_param_value(char* uri, char* param_name) | ||||
| { | ||||
| 
 | ||||
| 	uint8_t * name = 0; | ||||
| 	uint8_t * ret = BUFPUB; | ||||
| 	uint8_t * pos2; | ||||
| 	uint16_t len = 0, content_len = 0; | ||||
| 	uint8_t tmp_buf[10]={0x00, }; | ||||
| 
 | ||||
| 	if(!uri || !param_name) return 0; | ||||
| 
 | ||||
| 	/***************/ | ||||
| 	mid(uri, "Content-Length: ", "\r\n", (char *)tmp_buf); | ||||
| 	content_len = ATOI(tmp_buf, 10); | ||||
| 	uri = strstr(uri, "\r\n\r\n"); | ||||
| 	uri += 4; | ||||
| 	uri[content_len] = 0; | ||||
| 	/***************/ | ||||
| 
 | ||||
| 	if((name = (uint8_t *)strstr(uri, param_name))) | ||||
| 	{ | ||||
| 		name += strlen(param_name) + 1; | ||||
| 		pos2 = (uint8_t*)strstr((char*)name, "&"); | ||||
| 		if(!pos2) | ||||
| 		{ | ||||
| 			pos2 = name + strlen((char*)name); | ||||
| 		} | ||||
| 		len = pos2 - name; | ||||
| 
 | ||||
| 		if(len) | ||||
| 		{ | ||||
| 			ret[len] = 0; | ||||
| 			strncpy((char*)ret,(char*)name, len); | ||||
| 			unescape_http_url((char *)ret); | ||||
| 			replacetochar(ret, '+' ,' '); | ||||
| 			//ret[len] = 0;
 | ||||
| 			//ret[strlen((int8*)ret)] = 0;
 | ||||
| 			//printf("len=%d\r\n",len);
 | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			ret[0] = 0; | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		return 0; | ||||
| 	} | ||||
| #ifdef _HTTPPARSER_DEBUG_ | ||||
| 	printf("  %s=%s\r\n", param_name, ret); | ||||
| #endif | ||||
| 	return ret; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef _OLD_ | ||||
| uint8_t * get_http_uri_name(uint8_t * uri) | ||||
| { | ||||
| 	char tempURI[MAX_URI_SIZE]; | ||||
| 	uint8_t * uri_name; | ||||
| 
 | ||||
| 	if(!uri) return 0; | ||||
| 
 | ||||
| 	strcpy(tempURI, (char *)uri); | ||||
| 
 | ||||
| 	uri_name = (uint8_t *)strtok(tempURI, " ?"); | ||||
| 
 | ||||
| 	if(strcmp((char *)uri_name,"/")) uri_name++; | ||||
| 
 | ||||
| #ifdef _HTTPPARSER_DEBUG_ | ||||
| 	printf("  uri_name = %s\r\n", uri_name); | ||||
| #endif	 | ||||
| 
 | ||||
| 	return uri_name; | ||||
| } | ||||
| #else | ||||
| 
 | ||||
| uint8_t get_http_uri_name(uint8_t * uri, uint8_t * uri_buf) | ||||
| { | ||||
| 	uint8_t * uri_ptr; | ||||
| 	if(!uri) return 0; | ||||
| 
 | ||||
| 	strcpy((char *)uri_buf, (char *)uri); | ||||
| 
 | ||||
| 	uri_ptr = (uint8_t *)strtok((char *)uri_buf, " ?"); | ||||
| 
 | ||||
| 	if(strcmp((char *)uri_ptr,"/")) uri_ptr++; | ||||
| 	strcpy((char *)uri_buf, (char *)uri_ptr); | ||||
| 
 | ||||
| #ifdef _HTTPPARSER_DEBUG_ | ||||
| 	PRINTF("  uri_name = %s\r\n", uri_buf); | ||||
| #endif | ||||
| 
 | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| void inet_addr_(uint8_t * addr, uint8_t *ip) | ||||
| { | ||||
| 	uint8_t i; | ||||
| 	uint8_t taddr[30]; | ||||
| 	uint8_t * nexttok; | ||||
| 	uint8_t num; | ||||
| 
 | ||||
| 	strcpy((char *)taddr, (char *)addr); | ||||
| 
 | ||||
| 	nexttok = taddr; | ||||
| 	for(i = 0; i < 4 ; i++) | ||||
| 	{ | ||||
| 		nexttok = (uint8_t *)strtok((char *)nexttok, "."); | ||||
| 		if(nexttok[0] == '0' && nexttok[1] == 'x') num = ATOI(nexttok+2,0x10); | ||||
| 		else num = ATOI(nexttok,10); | ||||
| 		ip[i] = num; | ||||
| 		nexttok = NULL; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
| @brief	CONVERT STRING INTO INTEGER | ||||
| @return	a integer number | ||||
| */ | ||||
| uint16_t ATOI( | ||||
| 	uint8_t * str,	/**< is a pointer to convert */ | ||||
| 	uint8_t base	/**< is a base value (must be in the range 2 - 16) */ | ||||
| 	) | ||||
| { | ||||
|         unsigned int num = 0; | ||||
| // debug_2013_11_25
 | ||||
| //        while (*str !=0)
 | ||||
|         while ((*str !=0) && (*str != 0x20)) // not include the space(0x020)
 | ||||
|                 num = num * base + C2D(*str++); | ||||
| 	return num; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Check strings and then execute callback function by each string. | ||||
|  * @param src The information of URI | ||||
|  * @param s1 The start string to be researched | ||||
|  * @param s2 The end string to be researched | ||||
|  * @param sub The string between s1 and s2 | ||||
|  * @return The length value atfer working | ||||
|  */ | ||||
| void mid(char* src, char* s1, char* s2, char* sub) | ||||
| { | ||||
| 	char* sub1; | ||||
| 	char* sub2; | ||||
| 	uint16_t n; | ||||
| 
 | ||||
| 	sub1=strstr((char*)src,(char*)s1); | ||||
| 	sub1+=strlen((char*)s1); | ||||
| 	sub2=strstr((char*)sub1,(char*)s2); | ||||
| 
 | ||||
| 	n=sub2-sub1; | ||||
| 	strncpy((char*)sub,(char*)sub1,n); | ||||
| 	sub[n]='\0'; | ||||
| } | ||||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////
 | ||||
| // Static functions
 | ||||
| ////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| /**
 | ||||
| @brief	replace the specified character in a string with new character | ||||
| */ | ||||
| static void replacetochar( | ||||
| 		uint8_t * str, 		/**< pointer to be replaced */ | ||||
| 		uint8_t oldchar, 	/**< old character */ | ||||
| 		uint8_t newchar	/**< new character */ | ||||
| 	) | ||||
| { | ||||
| 	int x; | ||||
| 	for (x = 0; str[x]; x++) | ||||
| 		if (str[x] == oldchar) str[x] = newchar; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
| @brief	CONVERT CHAR INTO HEX | ||||
| @return	HEX | ||||
| 
 | ||||
| This function converts HEX(0-F) to a character | ||||
| */ | ||||
| static uint8_t C2D( | ||||
| 		uint8_t c	/**< is a character('0'-'F') to convert to HEX */ | ||||
| 	) | ||||
| { | ||||
| 	if (c >= '0' && c <= '9') | ||||
| 		return c - '0'; | ||||
| 	if (c >= 'a' && c <= 'f') | ||||
| 		return 10 + c -'a'; | ||||
| 	if (c >= 'A' && c <= 'F') | ||||
| 		return 10 + c -'A'; | ||||
| 
 | ||||
| 	return (char)c; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| @ -0,0 +1,159 @@ | ||||
| /**
 | ||||
|  @file		httpd.h | ||||
|  @brief 		Define Constants and fucntions associated with HTTP protocol. | ||||
|  */ | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include "../../globals.h" | ||||
| 
 | ||||
| #ifndef	__HTTPPARSER_H__ | ||||
| #define	__HTTPPARSER_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| //#define _HTTPPARSER_DEBUG_
 | ||||
| 
 | ||||
| #define HTTP_SERVER_PORT		80		/**< HTTP server well-known port number */ | ||||
| 
 | ||||
| /* HTTP Method */ | ||||
| #define		METHOD_ERR		0		/**< Error Method. */ | ||||
| #define		METHOD_GET		1		/**< GET Method.   */ | ||||
| #define		METHOD_HEAD		2		/**< HEAD Method.  */ | ||||
| #define		METHOD_POST		3		/**< POST Method.  */ | ||||
| 
 | ||||
| /* HTTP GET Method */ | ||||
| #define		PTYPE_ERR		0		/**< Error file. */ | ||||
| #define		PTYPE_HTML		1		/**< HTML file.  */ | ||||
| #define		PTYPE_GIF		2		/**< GIF file.   */ | ||||
| #define		PTYPE_TEXT		3		/**< TEXT file.  */ | ||||
| #define		PTYPE_JPEG		4		/**< JPEG file.  */ | ||||
| #define		PTYPE_FLASH		5		/**< FLASH file. */ | ||||
| #define		PTYPE_MPEG		6		/**< MPEG file.  */ | ||||
| #define		PTYPE_PDF		7		/**< PDF file.   */ | ||||
| #define 	PTYPE_CGI		8		/**< CGI file.   */ | ||||
| #define     PTYPE_XML       9       /**< XML file.   */  | ||||
| #define     PTYPE_CSS       10      /**< CSS file.   */ | ||||
| #define		PTYPE_JS		11		/**< JavaScript file.	*/ | ||||
| #define		PTYPE_JSON		12		/**< JSON (JavaScript Standard Object Notation) file.	*/ | ||||
| #define		PTYPE_PNG		13		/**< PNG file. 	*/ | ||||
| #define		PTYPE_ICO		14		/**< ICON file. */ | ||||
| 
 | ||||
| #define		PTYPE_TTF		20		/**< Font type: TTF file. */ | ||||
| #define		PTYPE_OTF		21		/**< Font type: OTF file. */ | ||||
| #define		PTYPE_WOFF		22		/**< Font type: WOFF file. */ | ||||
| #define		PTYPE_EOT		23		/**< Font type: EOT file. */ | ||||
| #define		PTYPE_SVG		24		/**< Font type: SVG file. */ | ||||
| 
 | ||||
| 
 | ||||
| /* HTTP response */ | ||||
| #define		STATUS_OK			200 | ||||
| #define		STATUS_CREATED		201 | ||||
| #define		STATUS_ACCEPTED		202 | ||||
| #define		STATUS_NO_CONTENT	204 | ||||
| #define		STATUS_MV_PERM		301 | ||||
| #define		STATUS_MV_TEMP		302 | ||||
| #define		STATUS_NOT_MODIF	304 | ||||
| #define		STATUS_BAD_REQ		400 | ||||
| #define		STATUS_UNAUTH		401 | ||||
| #define		STATUS_FORBIDDEN	403 | ||||
| #define		STATUS_NOT_FOUND	404 | ||||
| #define		STATUS_INT_SERR		500 | ||||
| #define		STATUS_NOT_IMPL		501 | ||||
| #define		STATUS_BAD_GATEWAY	502 | ||||
| #define		STATUS_SERV_UNAVAIL	503 | ||||
| 
 | ||||
| /* HTML Doc. for ERROR */ | ||||
| static const char PROGMEM 	ERROR_HTML_PAGE[] = "HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\nContent-Length: 78\r\n\r\n<HTML>\r\n<BODY>\r\nSorry, the page you requested was not found.\r\n</BODY>\r\n</HTML>\r\n\0"; | ||||
| static const char PROGMEM	ERROR_REQUEST_PAGE[] = "HTTP/1.1 400 OK\r\nContent-Type: text/html\r\nContent-Length: 50\r\n\r\n<HTML>\r\n<BODY>\r\nInvalid request.\r\n</BODY>\r\n</HTML>\r\n\0"; | ||||
| 
 | ||||
| /* HTML Doc. for CGI result  */ | ||||
| #define HTML_HEADER "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response header for HTML*/ | ||||
| #define RES_HTMLHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: keep-alive\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for TEXT */ | ||||
| #define RES_TEXTHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for GIF */ | ||||
| #define RES_GIFHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: image/gif\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for JPEG */ | ||||
| #define RES_JPEGHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: image/jpeg\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for PNG */ | ||||
| #define RES_PNGHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: image/png\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for FLASH */ | ||||
| #define RES_FLASHHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: application/x-shockwave-flash\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for XML */ | ||||
| #define RES_XMLHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\nConnection: keep-alive\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for CSS */ | ||||
| #define RES_CSSHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: text/css\r\nContent-Length: "		 | ||||
| 
 | ||||
| /* Response head for JavaScript */ | ||||
| #define RES_JSHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: application/javascript\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for JSON */ | ||||
| #define RES_JSONHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for ICO */ | ||||
| #define RES_ICOHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: image/x-icon\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for CGI */ | ||||
| #define RES_CGIHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for TTF, Font */ | ||||
| #define RES_TTFHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: application/x-font-truetype\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for OTF, Font */ | ||||
| #define RES_OTFHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: application/x-font-opentype\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for WOFF, Font */ | ||||
| #define RES_WOFFHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: application/font-woff\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for EOT, Font */ | ||||
| #define RES_EOTHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: application/vnd.ms-fontobject\r\nContent-Length: " | ||||
| 
 | ||||
| /* Response head for SVG, Font */ | ||||
| #define RES_SVGHEAD_OK	"HTTP/1.1 200 OK\r\nContent-Type: image/svg+xml\r\nContent-Length: " | ||||
| 
 | ||||
| /**
 | ||||
|  @brief 	Structure of HTTP REQUEST  | ||||
|  */ | ||||
| 
 | ||||
| //#define MAX_URI_SIZE	1461
 | ||||
| #define MAX_URI_SIZE	512 | ||||
| 
 | ||||
| typedef struct _st_http_request | ||||
| { | ||||
| 	uint8_t	METHOD;						/**< request method(METHOD_GET...). */ | ||||
| 	uint8_t	TYPE;						/**< request type(PTYPE_HTML...).   */ | ||||
| 	uint8_t	URI[MAX_URI_SIZE];			/**< request file name.             */ | ||||
| }st_http_request; | ||||
| 
 | ||||
| // HTTP Parsing functions
 | ||||
| void unescape_http_url(char * url);								/* convert escape character to ascii */ | ||||
| void parse_http_request(st_http_request *, uint8_t *);			/* parse request from peer */ | ||||
| void find_http_uri_type(uint8_t *, uint8_t *);					/* find MIME type of a file */ | ||||
| void make_http_response_head(char *, char, uint32_t);			/* make response header */ | ||||
| uint8_t * get_http_param_value(char* uri, char* param_name);	/* get the user-specific parameter value */ | ||||
| uint8_t get_http_uri_name(uint8_t * uri, uint8_t * uri_buf);	/* get the requested URI name */ | ||||
| #ifdef _OLD_ | ||||
| uint8_t * get_http_uri_name(uint8_t * uri); | ||||
| #endif | ||||
| 
 | ||||
| // Utility functions
 | ||||
| uint16_t ATOI(uint8_t * str, uint8_t base); | ||||
| void mid(char* src, char* s1, char* s2, char* sub); | ||||
| void inet_addr_(uint8_t * addr, uint8_t * ip); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif	/* end of __HTTPPARSER_H__ */ | ||||
| @ -0,0 +1,878 @@ | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| 
 | ||||
| #include "socket.h" | ||||
| #include "wizchip_conf.h" | ||||
| 
 | ||||
| #include "httpServer.h" | ||||
| #include "httpParser.h" | ||||
| #include "httpUtil.h" | ||||
| 
 | ||||
| #include "../../globals.h" //add AVR specific useful headers | ||||
| 
 | ||||
| 
 | ||||
| #define DATA_BUF_SIZE	HTTPD_MAX_BUF_SIZE | ||||
| /*****************************************************************************
 | ||||
|  * Private types/enumerations/variables | ||||
|  ****************************************************************************/ | ||||
| static uint8_t HTTPSock_Num[_WIZCHIP_SOCK_NUM_] = {0, }; | ||||
| static st_http_request * http_request;				/**< Pointer to received HTTP request */ | ||||
| static st_http_request * parsed_http_request;		/**< Pointer to parsed HTTP request */ | ||||
| static uint8_t * http_response;						/**< Pointer to HTTP response */ | ||||
| 
 | ||||
| // ## For Debugging
 | ||||
| //static uint8_t uri_buf[128];
 | ||||
| // Number of registered web content in code flash memory
 | ||||
| static uint16_t total_content_cnt = 0; | ||||
| /*****************************************************************************
 | ||||
|  * Public types/enumerations/variables | ||||
|  ****************************************************************************/ | ||||
| uint8_t * pHTTP_TX; | ||||
| uint8_t * pHTTP_RX; | ||||
| 
 | ||||
| volatile uint32_t httpServer_tick_1s = 0; | ||||
| st_http_socket HTTPSock_Status[_WIZCHIP_SOCK_NUM_] = { {STATE_HTTP_IDLE, }, }; | ||||
| httpServer_webContent web_content[MAX_CONTENT_CALLBACK]; | ||||
| 
 | ||||
| #ifdef	_USE_SDCARD_ | ||||
| //static FIL fs;		// FatFs: File object
 | ||||
| static FRESULT fr;	// FatFs: File function return code
 | ||||
| #endif | ||||
| /*****************************************************************************
 | ||||
|  * Private functions | ||||
|  ****************************************************************************/ | ||||
| void httpServer_Sockinit(uint8_t cnt, uint8_t * socklist); | ||||
| static uint8_t getHTTPSocketNum(uint8_t seqnum); | ||||
| static int8_t getHTTPSequenceNum(uint8_t socket); | ||||
| static int8_t http_disconnect(uint8_t sn); | ||||
| 
 | ||||
| static void http_process_handler_avr(uint8_t s, st_http_request * p_http_request); | ||||
| 
 | ||||
| static void send_http_response_header(uint8_t s, uint8_t content_type, uint32_t body_len, uint16_t http_status); | ||||
| 
 | ||||
| static void send_http_response_body_avr(uint8_t s, uint8_t * uri_name, uint8_t * buf, uint32_t start_addr, uint32_t file_len); | ||||
| 
 | ||||
| static void send_http_response_cgi(uint8_t s, uint8_t * buf, uint8_t * http_body, uint16_t file_len); | ||||
| 
 | ||||
| /*****************************************************************************
 | ||||
|  * Public functions | ||||
|  ****************************************************************************/ | ||||
| // Callback functions definition: MCU Reset / WDT Reset
 | ||||
| void default_mcu_reset(void) {;} | ||||
| void default_wdt_reset(void) {;} | ||||
| void (*HTTPServer_ReStart)(void) = default_mcu_reset; | ||||
| void (*HTTPServer_WDT_Reset)(void) = default_wdt_reset; | ||||
| 
 | ||||
| void httpServer_Sockinit(uint8_t cnt, uint8_t * socklist) | ||||
| { | ||||
| 	uint8_t i; | ||||
| 
 | ||||
| 	for(i = 0; i < cnt; i++) | ||||
| 	{ | ||||
| 		// Mapping the H/W socket numbers to the sequential index numbers
 | ||||
| 		HTTPSock_Num[i] = socklist[i]; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static uint8_t getHTTPSocketNum(uint8_t seqnum) | ||||
| { | ||||
| 	// Return the 'H/W socket number' corresponding to the index number
 | ||||
| 	return HTTPSock_Num[seqnum]; | ||||
| } | ||||
| 
 | ||||
| static int8_t getHTTPSequenceNum(uint8_t socket) | ||||
| { | ||||
| 	uint8_t i; | ||||
| 
 | ||||
| 	for(i = 0; i < _WIZCHIP_SOCK_NUM_; i++) | ||||
| 		if(HTTPSock_Num[i] == socket) return i; | ||||
| 
 | ||||
| 	return -1; | ||||
| } | ||||
| 
 | ||||
| void httpServer_init(uint8_t * tx_buf, uint8_t * rx_buf, uint8_t cnt, uint8_t * socklist) | ||||
| { | ||||
| 	// User's shared buffer
 | ||||
| 	pHTTP_TX = tx_buf; | ||||
| 	pHTTP_RX = rx_buf; | ||||
| 
 | ||||
| 	// H/W Socket number mapping
 | ||||
| 	httpServer_Sockinit(cnt, socklist); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* Register the call back functions for HTTP Server */ | ||||
| void reg_httpServer_cbfunc(void(*mcu_reset)(void), void(*wdt_reset)(void)) | ||||
| { | ||||
| 	// Callback: HW Reset and WDT reset function for each MCU platforms
 | ||||
| 	if(mcu_reset) HTTPServer_ReStart = mcu_reset; | ||||
| 	if(wdt_reset) HTTPServer_WDT_Reset = wdt_reset; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| void httpServer_run_avr(uint8_t seqnum) | ||||
| { | ||||
| 	uint8_t s;	// socket number
 | ||||
| 	uint16_t len; | ||||
| 	uint32_t gettime = 0; | ||||
| 
 | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 	uint8_t destip[4] = {0, }; | ||||
| 	uint16_t destport = 0; | ||||
| #endif | ||||
| 
 | ||||
| 	http_request = (st_http_request *)pHTTP_RX;		// Structure of HTTP Request
 | ||||
| 	parsed_http_request = (st_http_request *)pHTTP_TX; | ||||
| 
 | ||||
| 	// Get the H/W socket number
 | ||||
| 	s = getHTTPSocketNum(seqnum); | ||||
| 
 | ||||
| 	/* HTTP Service Start */ | ||||
| 	switch(getSn_SR(s)) | ||||
| 	{ | ||||
| 		case SOCK_ESTABLISHED: | ||||
| 			// Interrupt clear
 | ||||
| 			if(getSn_IR(s) & Sn_IR_CON) | ||||
| 			{ | ||||
| 				setSn_IR(s, Sn_IR_CON); | ||||
| 			} | ||||
| 
 | ||||
| 			// HTTP Process states
 | ||||
| 			switch(HTTPSock_Status[seqnum].sock_status) | ||||
| 			{ | ||||
| 
 | ||||
| 				case STATE_HTTP_IDLE : | ||||
| 					if ((len = getSn_RX_RSR(s)) > 0) | ||||
| 					{ | ||||
| 						if (len > DATA_BUF_SIZE) len = DATA_BUF_SIZE; | ||||
| 						len = recv(s, (uint8_t *)http_request, len); | ||||
| 
 | ||||
| 						*(((uint8_t *)http_request) + len) = '\0'; | ||||
| 
 | ||||
| 						parse_http_request(parsed_http_request, (uint8_t *)http_request); | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 						getSn_DIPR(s, destip); | ||||
| 						destport = getSn_DPORT(s); | ||||
| 						PRINTF("\r\n"); | ||||
| 						PRINTF("> HTTPSocket[%d] : HTTP Request received ", s); | ||||
| 						PRINTF("from %d.%d.%d.%d : %u\r\n", destip[0], destip[1], destip[2], destip[3], destport); | ||||
| #endif | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 						PRINTF("> HTTPSocket[%d] : [State] STATE_HTTP_REQ_DONE\r\n", s); | ||||
| #endif | ||||
| 						// HTTP 'response' handler; includes send_http_response_header / body function
 | ||||
| 						http_process_handler_avr(s, parsed_http_request); | ||||
| 
 | ||||
| 						gettime = get_httpServer_timecount(); | ||||
| 						// Check the TX socket buffer for End of HTTP response sends
 | ||||
| 						while(getSn_TX_FSR(s) != (getSn_TXBUF_SIZE(s)*1024)) | ||||
| 						{ | ||||
| 							if((get_httpServer_timecount() - gettime) > 3) | ||||
| 							{ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 								PRINTF("> HTTPSocket[%d] : [State] STATE_HTTP_REQ_DONE: TX Buffer clear timeout\r\n", s); | ||||
| #endif | ||||
| 								break; | ||||
| 							} | ||||
| 						} | ||||
| 
 | ||||
| 						if(HTTPSock_Status[seqnum].file_len > 0) HTTPSock_Status[seqnum].sock_status = STATE_HTTP_RES_INPROC; | ||||
| 						else HTTPSock_Status[seqnum].sock_status = STATE_HTTP_RES_DONE; // Send the 'HTTP response' end
 | ||||
| 					} | ||||
| 					break; | ||||
| 
 | ||||
| 				case STATE_HTTP_RES_INPROC : | ||||
| 					/* Repeat: Send the remain parts of HTTP responses */ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 					PRINTF("> HTTPSocket[%d] : [State] STATE_HTTP_RES_INPROC\r\n", s); | ||||
| 					PRINTF("\r\n> HTTPSocket[%d] : Re-Open the requested content\r\n", s); //_delay_ms(200);
 | ||||
| #endif | ||||
| /*
 | ||||
| #ifdef _USE_SDCARD_ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 				//PRINTF("++SDFLASH FIND..\r\n"); //_delay_ms(200);
 | ||||
| #endif | ||||
| 
 | ||||
| 				if((fr = f_open(&fs, (const char *)HTTPSock_Status[seqnum].file_name, FA_READ)) == 0) | ||||
| 				{ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 					//PRINTF("++Content found on SDCARD\r\n");
 | ||||
| 					if((fr = f_lseek(&fs, HTTPSock_Status[seqnum].file_offset)) != 0) | ||||
| 					{ | ||||
| 						HTTPSock_Status[seqnum].sock_status = STATE_HTTP_RES_DONE; | ||||
| 						break; | ||||
| 					} | ||||
| #endif | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					HTTPSock_Status[seqnum].sock_status = STATE_HTTP_RES_DONE; | ||||
| 					break; | ||||
| 				} | ||||
| #endif | ||||
| */ | ||||
| 					// Repeatedly send remaining data to client
 | ||||
| 					send_http_response_body_avr(s, 0, http_response, 0, 0); | ||||
| 
 | ||||
| 					if(HTTPSock_Status[seqnum].file_len == 0) HTTPSock_Status[seqnum].sock_status = STATE_HTTP_RES_DONE; | ||||
| 					break; | ||||
| 
 | ||||
| 				case STATE_HTTP_RES_DONE : | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 					PRINTF("> HTTPSocket[%d] : [State] STATE_HTTP_RES_DONE\r\n", s); | ||||
| #endif | ||||
| 					// Socket file info structure re-initialize
 | ||||
| 					HTTPSock_Status[seqnum].file_len = 0; | ||||
| 					HTTPSock_Status[seqnum].file_offset = 0; | ||||
| 					HTTPSock_Status[seqnum].file_start = 0; | ||||
| 					HTTPSock_Status[seqnum].sock_status = STATE_HTTP_IDLE; | ||||
| 
 | ||||
| #ifdef _USE_SDCARD_ | ||||
| 					f_close(&HTTPSock_Status[seqnum].fs); | ||||
| #endif | ||||
| #ifdef _USE_WATCHDOG_ | ||||
| 					HTTPServer_WDT_Reset(); | ||||
| #endif | ||||
| 					http_disconnect(s); | ||||
| 					break; | ||||
| 
 | ||||
| 				default : | ||||
| 					break; | ||||
| 			} | ||||
| 			break; | ||||
| 
 | ||||
| 		case SOCK_CLOSE_WAIT: | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 			PRINTF("> HTTPSocket[%d] : ClOSE_WAIT\r\n", s);	// if a peer requests to close the current connection
 | ||||
| #endif | ||||
| 			disconnect(s); | ||||
| 			break; | ||||
| 
 | ||||
| 		case SOCK_CLOSED: | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 			PRINTF("> HTTPSocket[%d] : CLOSED\r\n", s); | ||||
| #endif | ||||
| 			if(socket(s, Sn_MR_TCP, HTTP_SERVER_PORT, 0x00) == s)    /* Reinitialize the socket */ | ||||
| 			{ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 				PRINTF("> HTTPSocket[%d] : OPEN\r\n", s); | ||||
| #endif | ||||
| 			} | ||||
| 			break; | ||||
| 
 | ||||
| 		case SOCK_INIT: | ||||
| 			listen(s); | ||||
| 			break; | ||||
| 
 | ||||
| 		case SOCK_LISTEN: | ||||
| 			break; | ||||
| 
 | ||||
| 		default : | ||||
| 			break; | ||||
| 
 | ||||
| 	} // end of switch
 | ||||
| 
 | ||||
| #ifdef _USE_WATCHDOG_ | ||||
| 	HTTPServer_WDT_Reset(); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| ////////////////////////////////////////////
 | ||||
| // Private Functions
 | ||||
| ////////////////////////////////////////////
 | ||||
| static void send_http_response_header(uint8_t s, uint8_t content_type, uint32_t body_len, uint16_t http_status) | ||||
| { | ||||
| 	switch(http_status) | ||||
| 	{ | ||||
| 		case STATUS_OK: 		// HTTP/1.1 200 OK
 | ||||
| 			if((content_type != PTYPE_CGI) && (content_type != PTYPE_XML)) // CGI/XML type request does not respond HTTP header
 | ||||
| 			{ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 			PRINTF("> HTTPSocket[%d] : HTTP Response Header - STATUS_OK\r\n", s); | ||||
| #endif | ||||
| 				make_http_response_head((char*)http_response, content_type, body_len); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 				PRINTF("> HTTPSocket[%d] : HTTP Response Header - NONE / CGI or XML\r\n", s); | ||||
| #endif | ||||
| 				// CGI/XML type request does not respond HTTP header to client
 | ||||
| 				http_status = 0; | ||||
| 			} | ||||
| 			break; | ||||
| 		case STATUS_BAD_REQ: 	// HTTP/1.1 400 OK
 | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 			PRINTF("> HTTPSocket[%d] : HTTP Response Header - STATUS_BAD_REQ\r\n", s); | ||||
| #endif | ||||
| 			memcpy_P(http_response, ERROR_REQUEST_PAGE, sizeof(ERROR_REQUEST_PAGE)); | ||||
| 			break; | ||||
| 		case STATUS_NOT_FOUND:	// HTTP/1.1 404 Not Found
 | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 			PRINTF("> HTTPSocket[%d] : HTTP Response Header - STATUS_NOT_FOUND\r\n", s); | ||||
| #endif | ||||
| 			memcpy_P(http_response, ERROR_HTML_PAGE, sizeof(ERROR_HTML_PAGE)); | ||||
| 			break; | ||||
| 		default: | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	// Send the HTTP Response 'header'
 | ||||
| 	if(http_status) | ||||
| 	{ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 		PRINTF("> HTTPSocket[%d] : [Send] HTTP Response Header [ %d ]byte\r\n", s, (uint16_t)strlen((char *)http_response)); | ||||
| #endif | ||||
| 		send(s, http_response, strlen((char *)http_response)); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static void send_http_response_body_avr(uint8_t s, uint8_t * uri_name, uint8_t * buf, uint32_t start_addr, uint32_t file_len) | ||||
| { | ||||
| 	int8_t get_seqnum; | ||||
| 	uint32_t send_len; | ||||
| 
 | ||||
| 	uint8_t flag_datasend_end = 0; | ||||
| 
 | ||||
| #ifdef _USE_SDCARD_ | ||||
| 	uint16_t blocklen; | ||||
| #endif | ||||
| #ifdef _USE_FLASH_ | ||||
| 	uint32_t addr = 0; | ||||
| #endif | ||||
| 
 | ||||
| 	if((get_seqnum = getHTTPSequenceNum(s)) == -1) return; // exception handling; invalid number
 | ||||
| 
 | ||||
| 	// Send the HTTP Response 'body'; requested file
 | ||||
| 	if(!HTTPSock_Status[get_seqnum].file_len) // ### Send HTTP response body: First part ###
 | ||||
| 	{ | ||||
| 		if (file_len > DATA_BUF_SIZE - 1) | ||||
| 		{ | ||||
| 			HTTPSock_Status[get_seqnum].file_start = start_addr; | ||||
| 			HTTPSock_Status[get_seqnum].file_len = file_len; | ||||
| 			send_len = DATA_BUF_SIZE - 1; | ||||
| 
 | ||||
| /////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // ## 20141219 Eric added, for 'File object structure' (fs) allocation reduced (8 -> 1)
 | ||||
| 			memset(HTTPSock_Status[get_seqnum].file_name, 0x00, MAX_CONTENT_NAME_LEN); | ||||
| 			strcpy((char *)HTTPSock_Status[get_seqnum].file_name, (char *)uri_name); | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 			PRINTF("> HTTPSocket[%d] : HTTP Response body - file name [ %s ]\r\n", s, HTTPSock_Status[get_seqnum].file_name); | ||||
| #endif | ||||
| /////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 			PRINTF("> HTTPSocket[%d] : HTTP Response body - file len [ %ld ]byte\r\n", s, file_len); | ||||
| #endif | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			// Send process end
 | ||||
| 			send_len = file_len; | ||||
| 
 | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 			PRINTF("> HTTPSocket[%d] : (1)HTTP Response end - file len [ %ld ]byte\r\n", s, send_len); | ||||
| #endif | ||||
| 		} | ||||
| #ifdef _USE_FLASH_ | ||||
| 		if(HTTPSock_Status[get_seqnum]->storage_type == DATAFLASH) addr = start_addr; | ||||
| #endif | ||||
| 	} | ||||
| 	else // remained parts
 | ||||
| 	{ | ||||
| #ifdef _USE_FLASH_ | ||||
| 		if(HTTPSock_Status[get_seqnum]->storage_type == DATAFLASH) | ||||
| 		{ | ||||
| 			addr = HTTPSock_Status[get_seqnum].file_start + HTTPSock_Status[get_seqnum].file_offset; | ||||
| 		} | ||||
| #endif | ||||
| 		send_len = HTTPSock_Status[get_seqnum].file_len - HTTPSock_Status[get_seqnum].file_offset; | ||||
| 
 | ||||
| 		if(send_len > DATA_BUF_SIZE - 1) | ||||
| 		{ | ||||
| 			send_len = DATA_BUF_SIZE - 1; | ||||
| 			//HTTPSock_Status[get_seqnum]->file_offset += send_len;
 | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 			PRINTF("> HTTPSocket[%d] : (2)HTTP Response end - file len [ %ld ]byte\r\n", s, HTTPSock_Status[get_seqnum].file_len); | ||||
| #endif | ||||
| 			// Send process end
 | ||||
| 			flag_datasend_end = 1; | ||||
| 		} | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 			PRINTF("> HTTPSocket[%d] : HTTP Response body - send len [ %ld ]byte\r\n", s, send_len); | ||||
| #endif | ||||
| 	} | ||||
| 
 | ||||
| /*****************************************************/ | ||||
| 	//HTTPSock_Status[get_seqnum]->storage_type == NONE
 | ||||
| 	//HTTPSock_Status[get_seqnum]->storage_type == CODEFLASH
 | ||||
| 	//HTTPSock_Status[get_seqnum]->storage_type == SDCARD
 | ||||
| 	//HTTPSock_Status[get_seqnum]->storage_type == DATAFLASH
 | ||||
| /*****************************************************/ | ||||
| 
 | ||||
| 	if(HTTPSock_Status[get_seqnum].storage_type == CODEFLASH) | ||||
| 	{ | ||||
| 		if(HTTPSock_Status[get_seqnum].file_len) start_addr = HTTPSock_Status[get_seqnum].file_start; | ||||
| 		read_userReg_webContent_avr(start_addr, &buf[0], HTTPSock_Status[get_seqnum].file_offset, send_len); | ||||
| 	} | ||||
| #ifdef _USE_SDCARD_ | ||||
| 	else if(HTTPSock_Status[get_seqnum].storage_type == SDCARD) | ||||
| 	{ | ||||
| 		// Data read from SD Card
 | ||||
| 		//PRINTF("++SDCARD f_read(..)\r\n");
 | ||||
| 		fr = f_read(&HTTPSock_Status[get_seqnum].fs, &buf[0], send_len, (void *)&blocklen); | ||||
| 		if(fr != FR_OK) | ||||
| 		{ | ||||
| 			send_len = 0; | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 		printf("> HTTPSocket[%d] : [FatFs] Error code return: %d (File Read) / HTTP Send Failed - %s\r\n", s, fr, HTTPSock_Status[get_seqnum].file_name); | ||||
| #endif | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			*(buf+send_len+1) = 0; // Insert '/0' for indicates the 'End of String' (null terminated)
 | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| #ifdef _USE_FLASH_ | ||||
| 	else if(HTTPSock_Status[get_seqnum]->storage_type == DATAFLASH) | ||||
| 	{ | ||||
| 		// Data read from external data flash memory
 | ||||
| 		read_from_flashbuf(addr, &buf[0], send_len); | ||||
| 		*(buf+send_len+1) = 0; // Insert '/0' for indicates the 'End of String' (null terminated)
 | ||||
| 	} | ||||
| #endif | ||||
| 	else | ||||
| 	{ | ||||
| 		send_len = 0; | ||||
| 	} | ||||
| 	// Requested content send to HTTP client
 | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 	PRINTF("> HTTPSocket[%d] : [Send] HTTP Response body [ %ld ]byte\r\n", s, send_len); | ||||
| #endif | ||||
| 
 | ||||
| 	if(send_len) send(s, buf, send_len); | ||||
| 	else flag_datasend_end = 1; | ||||
| 
 | ||||
| 	if(flag_datasend_end) | ||||
| 	{ | ||||
| 		HTTPSock_Status[get_seqnum].file_start = 0; | ||||
| 		HTTPSock_Status[get_seqnum].file_len = 0; | ||||
| 		HTTPSock_Status[get_seqnum].file_offset = 0; | ||||
| 		flag_datasend_end = 0; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		HTTPSock_Status[get_seqnum].file_offset += send_len; | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 		PRINTF("> HTTPSocket[%d] : HTTP Response body - offset [ %ld ]\r\n", s, HTTPSock_Status[get_seqnum].file_offset); | ||||
| #endif | ||||
| 	} | ||||
| 
 | ||||
| // ## 20141219 Eric added, for 'File object structure' (fs) allocation reduced (8 -> 1)
 | ||||
| #ifdef _USE_SDCARD_ | ||||
| 	//Should not close here
 | ||||
| 	//f_close(&fs);
 | ||||
| #endif | ||||
| // ## 20141219 added end
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static void send_http_response_cgi(uint8_t s, uint8_t * buf, uint8_t * http_body, uint16_t file_len) | ||||
| { | ||||
| 	uint16_t send_len = 0; | ||||
| 
 | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 	PRINTF("> HTTPSocket[%d] : HTTP Response Header + Body - CGI\r\n", s); | ||||
| #endif | ||||
| 	//send_len = sprintf((char *)buf, "%s%d\r\n\r\n%s", RES_CGIHEAD_OK, file_len, http_body);
 | ||||
| 	send_len = sprintf_P((char *)buf, PSTR("%S%d\r\n\r\n%s"), PSTR(RES_CGIHEAD_OK), file_len, http_body); | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 	PRINTF("> HTTPSocket[%d] : HTTP Response Header + Body - send len [ %d ]byte\r\n", s, send_len); | ||||
| #endif | ||||
| 
 | ||||
| 	send(s, buf, send_len); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static int8_t http_disconnect(uint8_t sn) | ||||
| { | ||||
| 	setSn_CR(sn,Sn_CR_DISCON); | ||||
| 	/* wait to process the command... */ | ||||
| 	while(getSn_CR(sn)); | ||||
| 
 | ||||
| 	return SOCK_OK; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static void http_process_handler_avr(uint8_t s, st_http_request * p_http_request) | ||||
| { | ||||
| 	uint8_t * uri_name; | ||||
| 	uint32_t content_addr = 0; | ||||
| 	uint16_t content_num = 0; | ||||
| 	uint32_t file_len = 0; | ||||
| 
 | ||||
| 	uint8_t uri_buf[MAX_URI_SIZE]={0x00, }; | ||||
| 
 | ||||
| 	uint16_t http_status; | ||||
| 	int8_t get_seqnum; | ||||
| 	uint8_t content_found; | ||||
| 
 | ||||
| 	if((get_seqnum = getHTTPSequenceNum(s)) == -1) return; // exception handling; invalid number
 | ||||
| 
 | ||||
| 	http_status = 0; | ||||
| 	http_response = pHTTP_RX; | ||||
| 	file_len = 0; | ||||
| 
 | ||||
| 	//method Analyze
 | ||||
| 	switch (p_http_request->METHOD) | ||||
| 	{ | ||||
| 		case METHOD_ERR : | ||||
| 			http_status = STATUS_BAD_REQ; | ||||
| 			send_http_response_header(s, 0, 0, http_status); | ||||
| 			break; | ||||
| 
 | ||||
| 		case METHOD_HEAD : | ||||
| 		case METHOD_GET : | ||||
| 			get_http_uri_name(p_http_request->URI, uri_buf); | ||||
| 			uri_name = uri_buf; | ||||
| 
 | ||||
| 			if (!strcmp((char *)uri_name, "/")) strcpy((char *)uri_name, INITIAL_WEBPAGE);	// If URI is "/", respond by index.html
 | ||||
| 			if (!strcmp((char *)uri_name, "m")) strcpy((char *)uri_name, M_INITIAL_WEBPAGE); | ||||
| 			if (!strcmp((char *)uri_name, "mobile")) strcpy((char *)uri_name, MOBILE_INITIAL_WEBPAGE); | ||||
| 			find_http_uri_type(&p_http_request->TYPE, uri_name);	// Checking requested file types (HTML, TEXT, GIF, JPEG and Etc. are included)
 | ||||
| 
 | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 			PRINTF("\r\n> HTTPSocket[%d] : HTTP Method GET\r\n", s); | ||||
| 			PRINTF("> HTTPSocket[%d] : Request Type = %d\r\n", s, p_http_request->TYPE); | ||||
| 			PRINTF("> HTTPSocket[%d] : Request URI = %s\r\n", s, uri_name); | ||||
| #endif | ||||
| 
 | ||||
| 			if (p_http_request->TYPE == PTYPE_ERR) | ||||
| 			{ | ||||
| 				http_status = STATUS_BAD_REQ; | ||||
| 				send_http_response_header(s, 0, 0, http_status); | ||||
| 				return; | ||||
| 			} | ||||
| 			else if(p_http_request->TYPE == PTYPE_CGI) | ||||
| 			{ | ||||
| 				content_found = http_get_cgi_handler(uri_name, pHTTP_TX, &file_len); | ||||
| 				if(content_found && (file_len <= (DATA_BUF_SIZE-(strlen(RES_CGIHEAD_OK)+8)))) | ||||
| 				{ | ||||
| 					send_http_response_cgi(s, http_response, pHTTP_TX, (uint16_t)file_len); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					send_http_response_header(s, PTYPE_CGI, 0, STATUS_NOT_FOUND); | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 				PRINTF("\r\n> HTTPSocket[%d] : Searching the requested content\r\n", s); //_delay_ms(200);
 | ||||
| 				//PRINTF("++CODEFLASH FIND..\r\n"); //_delay_ms(200);
 | ||||
| #endif | ||||
| 				// Find the User registered index for web content
 | ||||
| 				if(find_userReg_webContent_avr(uri_buf, &content_num, &file_len)) | ||||
| 				{ | ||||
| 					content_found = 1; // Web content found in code flash memory
 | ||||
| 					content_addr = (uint32_t)content_num; | ||||
| 					HTTPSock_Status[get_seqnum].storage_type = CODEFLASH; | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 					//PRINTF("++Content found on CODEFLASH\r\n");
 | ||||
| #endif | ||||
| 				} | ||||
| 				// Not CGI request, Web content in 'SD card' or 'Data flash' requested
 | ||||
| #ifdef _USE_SDCARD_ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 				PRINTF("\r\n> HTTPSocket[%d] : Searching the requested content\r\n", s); //_delay_ms(200);
 | ||||
| 				//PRINTF("++SDFLASH FIND..\r\n"); //_delay_ms(200);
 | ||||
| #endif | ||||
| 				if((fr = f_open(&HTTPSock_Status[get_seqnum].fs, (const char *)uri_name, FA_READ)) == 0) | ||||
| 				{ | ||||
| 					content_found = 1; // file open succeed
 | ||||
| 
 | ||||
| 					file_len = HTTPSock_Status[get_seqnum].fs.fsize; | ||||
| 					//content_addr = fs.sclust; //?
 | ||||
| 					content_addr = HTTPSock_Status[get_seqnum].fs.fptr; //much better
 | ||||
| 					HTTPSock_Status[get_seqnum].storage_type = SDCARD; | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 					//PRINTF("++Content found on SDCARD\r\n");
 | ||||
| #endif | ||||
| 				} | ||||
| #elif _USE_FLASH_ | ||||
| 				else if(/* Read content from Dataflash */) | ||||
| 				{ | ||||
| 					content_found = 1; | ||||
| 					HTTPSock_Status[get_seqnum]->storage_type = DATAFLASH; | ||||
| 					; // To do
 | ||||
| 				} | ||||
| #endif | ||||
| 				else | ||||
| 				{ | ||||
| 					content_found = 0; // fail to find content
 | ||||
| 				} | ||||
| 
 | ||||
| 				if(!content_found) | ||||
| 				{ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 					PRINTF("> HTTPSocket[%d] : Unknown Page Request\r\n", s); | ||||
| #endif | ||||
| 					http_status = STATUS_NOT_FOUND; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 					PRINTF("> HTTPSocket[%d] : Find Content [%s] ok - Start [%ld] len [ %ld ]byte\r\n", s, uri_name, content_addr, file_len); | ||||
| #endif | ||||
| 					http_status = STATUS_OK; | ||||
| 				} | ||||
| 
 | ||||
| 				// Send HTTP header
 | ||||
| 				if(http_status) | ||||
| 				{ | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 					PRINTF("> HTTPSocket[%d] : Requested content len = [ %ld ]byte\r\n", s, file_len); | ||||
| #endif | ||||
| 					send_http_response_header(s, p_http_request->TYPE, file_len, http_status); | ||||
| 				} | ||||
| 
 | ||||
| 				// Send HTTP body (content)
 | ||||
| 				if(http_status == STATUS_OK) | ||||
| 				{ | ||||
| 					send_http_response_body_avr(s, uri_name, http_response, content_addr, file_len); | ||||
| 				} | ||||
| 			} | ||||
| 			break; | ||||
| 
 | ||||
| 		case METHOD_POST : | ||||
| 			mid((char *)p_http_request->URI, "/", " HTTP", (char *)uri_buf); | ||||
| 			uri_name = uri_buf; | ||||
| 			find_http_uri_type(&p_http_request->TYPE, uri_name);	// Check file type (HTML, TEXT, GIF, JPEG are included)
 | ||||
| 
 | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 			PRINTF("\r\n> HTTPSocket[%d] : HTTP Method POST\r\n", s); | ||||
| 			PRINTF("> HTTPSocket[%d] : Request URI = %s ", s, uri_name); | ||||
| 			PRINTF("Type = %d\r\n", p_http_request->TYPE); | ||||
| #endif | ||||
| 
 | ||||
| 			if(p_http_request->TYPE == PTYPE_CGI)	// HTTP POST Method; CGI Process
 | ||||
| 			{ | ||||
| 				content_found = http_post_cgi_handler(uri_name, p_http_request, http_response, &file_len); | ||||
| #ifdef _HTTPSERVER_DEBUG_ | ||||
| 				PRINTF("> HTTPSocket[%d] : [CGI: %s] / Response len [ %ld ]byte\r\n", s, content_found?"Content found":"Content not found", file_len); | ||||
| #endif | ||||
| 				if(content_found && (file_len <= (DATA_BUF_SIZE-(strlen(RES_CGIHEAD_OK)+8)))) | ||||
| 				{ | ||||
| 					send_http_response_cgi(s, pHTTP_TX, http_response, (uint16_t)file_len); | ||||
| 
 | ||||
| 					// Reset the H/W for apply to the change configuration information
 | ||||
| 					if(content_found == HTTP_RESET) HTTPServer_ReStart(); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					send_http_response_header(s, PTYPE_CGI, 0, STATUS_NOT_FOUND); | ||||
| 				} | ||||
| 			} | ||||
| 			else	// HTTP POST Method; Content not found
 | ||||
| 			{ | ||||
| 				send_http_response_header(s, 0, 0, STATUS_NOT_FOUND); | ||||
| 			} | ||||
| 			break; | ||||
| 
 | ||||
| 		default : | ||||
| 			http_status = STATUS_BAD_REQ; | ||||
| 			send_http_response_header(s, 0, 0, http_status); | ||||
| 			break; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void httpServer_time_handler(void) | ||||
| { | ||||
| 	httpServer_tick_1s++; | ||||
| } | ||||
| 
 | ||||
| uint32_t get_httpServer_timecount(void) | ||||
| { | ||||
| 	return httpServer_tick_1s; | ||||
| } | ||||
| void reg_httpServer_webContent_avr(const uint8_t * content_name,const uint8_t * content) | ||||
| { | ||||
| 	uint16_t name_len; | ||||
| 	uint32_t content_len; | ||||
| 
 | ||||
| 	if(content_name == NULL || content == NULL) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 	else if(total_content_cnt >= MAX_CONTENT_CALLBACK) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	name_len = strlen_P((const char *)content_name); | ||||
| 	content_len = strlen_P((const char *)content); | ||||
| 
 | ||||
| 	web_content[total_content_cnt].content_name = malloc(name_len+1); | ||||
| 	strcpy_P((char *)web_content[total_content_cnt].content_name, (const char *)content_name); | ||||
| 	web_content[total_content_cnt].content_len = content_len; | ||||
| 	web_content[total_content_cnt].content = content; | ||||
| 
 | ||||
| 	total_content_cnt++; | ||||
| } | ||||
| 
 | ||||
| void reg_httpServer_binContent_avr(const uint8_t * content_name,const uint8_t * content, const uint32_t content_len) | ||||
| { | ||||
| 	uint16_t name_len; | ||||
| 	//uint32_t content_len;
 | ||||
| 
 | ||||
| 	if(content_name == NULL || content == NULL) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 	else if(total_content_cnt >= MAX_CONTENT_CALLBACK) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	name_len = strlen_P((const char *)content_name); | ||||
| 	//content_len = (uint32_t) sizeof(content);
 | ||||
| 
 | ||||
| 	web_content[total_content_cnt].content_name = malloc(name_len+1); | ||||
| 	strcpy_P((char *)web_content[total_content_cnt].content_name, (const char *)content_name); | ||||
| 	web_content[total_content_cnt].content_len = content_len; | ||||
| 	web_content[total_content_cnt].content = content; | ||||
| 
 | ||||
| 	total_content_cnt++; | ||||
| } | ||||
| 
 | ||||
| uint8_t display_reg_webContent_list_avr(void) | ||||
| { | ||||
| 	uint16_t i; | ||||
| 	uint8_t ret; | ||||
| 
 | ||||
| 	if(total_content_cnt == 0) | ||||
| 	{ | ||||
| 		PRINTF(">> Web content file not found\r\n"); | ||||
| 		ret = 0; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		PRINTF("\r\n=== List of Web content in code flash ===\r\n"); | ||||
| 		for(i = 0; i < total_content_cnt; i++) | ||||
| 		{ | ||||
| 			PRINTF(" [%d] ", i+1); | ||||
| 			PRINTF("%s, ", web_content[i].content_name); | ||||
| 			PRINTF("%ld byte\r\n", web_content[i].content_len); | ||||
| 
 | ||||
| 
 | ||||
| 			if(web_content[i].content_len < 30) | ||||
| 			{ | ||||
| 				PRINTF("[%s]\r\n", web_content[i].content); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				PRINTF("[ ... ]\r\n"); | ||||
| 			} | ||||
| 			//Dump head 16 bytes every file..
 | ||||
| 			/*
 | ||||
| 			else | ||||
| 			{ | ||||
| 				const char PROGMEM * tst_char = web_content[i].content; | ||||
| 				if(strstr_P(web_content[i].content_name,PSTR("favicon.ico"))==NULL) | ||||
| 				{ | ||||
| 					//ASCII Dump first 0x10 symbols, for all files without <favicon.ico>
 | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					//HEX dump first 0x10 symbols, for <favicon.ico>
 | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 					PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); | ||||
| 				} | ||||
| 			} | ||||
| 			*/ | ||||
| 			wdt_reset(); // WDT reset at least every sec
 | ||||
| 
 | ||||
| 		} | ||||
| 		PRINTF("=========================================\r\n\r\n"); | ||||
| 		ret = 1; | ||||
| 	} | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| uint8_t find_userReg_webContent_avr(uint8_t * content_name, uint16_t * content_num, uint32_t * file_len) | ||||
| { | ||||
| 	uint16_t i; | ||||
| 	uint8_t ret = 0; // '0' means 'File Not Found'
 | ||||
| 
 | ||||
| 	for(i = 0; i < total_content_cnt; i++) | ||||
| 	{ | ||||
| 		if(!strcmp((const char *)content_name, (const char *)web_content[i].content_name)) | ||||
| 		{ | ||||
| 			*file_len = web_content[i].content_len; | ||||
| 			*content_num = i; | ||||
| 			ret = 1; // If the requested content found, ret set to '1' (Found)
 | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| uint16_t read_userReg_webContent_avr(uint16_t content_num, uint8_t * buf, uint32_t offset, uint16_t size) | ||||
| { | ||||
| 	uint16_t ret = 0; | ||||
| 	uint8_t * ptr; | ||||
| 
 | ||||
| 	if(content_num > total_content_cnt) return 0; | ||||
| 
 | ||||
| 	ptr = web_content[content_num].content; | ||||
| 	if(offset) ptr += offset; | ||||
| 
 | ||||
| 	//strncpy_P((char *)buf, (const char *)ptr, size); //not suit for case binary data
 | ||||
| 	memcpy_P((char *)buf, (const char *)ptr, size); | ||||
| 	*(buf+size) = 0; // Insert '/0' for indicates the 'End of String' (null terminated)
 | ||||
| 
 | ||||
| 	//ret = strlen((void *)buf); //Useless for memcpy_P
 | ||||
| 	ret = 0; //All ok
 | ||||
| 	return ret; | ||||
| } | ||||
| @ -0,0 +1,125 @@ | ||||
| /**
 | ||||
|  @file		httpServer.h | ||||
|  @brief 	Define constants and functions related HTTP Web server. | ||||
|  */ | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #ifndef	__HTTPSERVER_H__ | ||||
| #define	__HTTPSERVER_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| // HTTP Server debug message enable
 | ||||
| #define _HTTPSERVER_DEBUG_ | ||||
| 
 | ||||
| //#define INITIAL_WEBPAGE				"index.html"
 | ||||
| #define INITIAL_WEBPAGE				"index.htm" | ||||
| #define M_INITIAL_WEBPAGE			"m/index.html" | ||||
| #define MOBILE_INITIAL_WEBPAGE		"mobile/index.html" | ||||
| 
 | ||||
| /* Web Server Content Storage Select */ | ||||
| #define _USE_SDCARD_ | ||||
| #ifndef _USE_SDCARD_ | ||||
| //#define _USE_FLASH_
 | ||||
| #endif | ||||
| 
 | ||||
| #ifdef	_USE_SDCARD_ | ||||
| #include "ff.h" 	// header file for FatFs library (FAT file system) | ||||
| #endif | ||||
| 
 | ||||
| #if !defined(_USE_SDCARD_) && !defined(_USE_FLASH_) | ||||
| #define _NOTUSED_STORAGE_ | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /* Watchdog timer */ | ||||
| //#define _USE_WATCHDOG_
 | ||||
| 
 | ||||
| /*********************************************
 | ||||
| * HTTP Process states list | ||||
| *********************************************/ | ||||
| #define STATE_HTTP_IDLE             0           /* IDLE, Waiting for data received (TCP established) */ | ||||
| #define STATE_HTTP_REQ_INPROC  		1           /* Received HTTP request from HTTP client */ | ||||
| #define STATE_HTTP_REQ_DONE    		2           /* The end of HTTP request parse */ | ||||
| #define STATE_HTTP_RES_INPROC  		3           /* Sending the HTTP response to HTTP client (in progress) */ | ||||
| #define STATE_HTTP_RES_DONE    		4           /* The end of HTTP response send (HTTP transaction ended) */ | ||||
| 
 | ||||
| /*********************************************
 | ||||
| * HTTP Simple Return Value | ||||
| *********************************************/ | ||||
| #define HTTP_FAILED					0 | ||||
| #define HTTP_OK						1 | ||||
| #define HTTP_RESET					2 | ||||
| 
 | ||||
| /*********************************************
 | ||||
| * HTTP Content NAME length | ||||
| *********************************************/ | ||||
| //#define MAX_CONTENT_NAME_LEN		128 ? Wastefull
 | ||||
| #define MAX_CONTENT_NAME_LEN		16 | ||||
| 
 | ||||
| /*********************************************
 | ||||
| * HTTP Timeout | ||||
| *********************************************/ | ||||
| #define HTTP_MAX_TIMEOUT_SEC		3			// Sec.
 | ||||
| 
 | ||||
| typedef enum | ||||
| { | ||||
|    NONE,		///< Web storage none
 | ||||
|    CODEFLASH,	///< Code flash memory
 | ||||
|    SDCARD,    	///< SD card
 | ||||
|    DATAFLASH	///< External data flash memory
 | ||||
| }StorageType; | ||||
| 
 | ||||
| typedef struct _st_http_socket | ||||
| { | ||||
| 	uint8_t			sock_status; | ||||
| 	uint8_t			file_name[MAX_CONTENT_NAME_LEN]; | ||||
| 	uint32_t 		file_start; | ||||
| 	uint32_t 		file_len; | ||||
| 	uint32_t 		file_offset; // (start addr + sent size...)
 | ||||
| 	uint8_t			storage_type; // Storage type; Code flash, SDcard, Data flash ...
 | ||||
| 	FIL fs;		// FatFs: File object
 | ||||
| }st_http_socket; | ||||
| 
 | ||||
| // Web content structure for file in code flash memory
 | ||||
| #define MAX_CONTENT_CALLBACK		20 | ||||
| 
 | ||||
| typedef struct _httpServer_webContent | ||||
| { | ||||
| 	uint8_t	*	content_name; | ||||
| 	uint32_t	content_len; | ||||
| 	uint8_t * 	content; | ||||
| }httpServer_webContent; | ||||
| 
 | ||||
| 
 | ||||
| void httpServer_init(uint8_t * tx_buf, uint8_t * rx_buf, uint8_t cnt, uint8_t * socklist); | ||||
| void reg_httpServer_cbfunc(void(*mcu_reset)(void), void(*wdt_reset)(void)); | ||||
| 
 | ||||
| void httpServer_run_avr(uint8_t seqnum); | ||||
| 
 | ||||
| void reg_httpServer_webContent_avr(const uint8_t * content_name,const uint8_t * content); | ||||
| 
 | ||||
| void reg_httpServer_binContent_avr(const uint8_t * content_name,const uint8_t * content, const uint32_t content_len); | ||||
| 
 | ||||
| uint8_t find_userReg_webContent_avr(uint8_t * content_name, uint16_t * content_num, uint32_t * file_len); | ||||
| 
 | ||||
| uint16_t read_userReg_webContent_avr(uint16_t content_num, uint8_t * buf, uint32_t offset, uint16_t size); | ||||
| 
 | ||||
| uint8_t display_reg_webContent_list_avr(void); | ||||
| 
 | ||||
| /*
 | ||||
|  * @brief HTTP Server 1sec Tick Timer handler | ||||
|  * @note SHOULD BE register to your system 1s Tick timer handler | ||||
|  */ | ||||
| void httpServer_time_handler(void); | ||||
| uint32_t get_httpServer_timecount(void); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
| @ -0,0 +1,65 @@ | ||||
| /**
 | ||||
|  * @file	httpUtil.c | ||||
|  * @brief	HTTP Server Utilities	 | ||||
|  * @version 1.0 | ||||
|  * @date	2014/07/15 | ||||
|  * @par Revision | ||||
|  *			2014/07/15 - 1.0 Release | ||||
|  * @author	 | ||||
|  * \n\n @par Copyright (C) 1998 - 2014 WIZnet. All rights reserved. | ||||
|  */ | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include "httpUtil.h" | ||||
| 
 | ||||
| uint8_t http_get_cgi_handler(uint8_t * uri_name, uint8_t * buf, uint32_t * file_len) | ||||
| { | ||||
| 	uint8_t ret = HTTP_OK; | ||||
| 	uint16_t len = 0; | ||||
| 
 | ||||
| 	if(predefined_get_cgi_processor(uri_name, buf, &len)) | ||||
| 	{ | ||||
| 		; | ||||
| 	} | ||||
| 	else if(strcmp((const char *)uri_name, "example.cgi") == 0) | ||||
| 	{ | ||||
| 		// To do
 | ||||
| 		; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		// CGI file not found
 | ||||
| 		ret = HTTP_FAILED; | ||||
| 	} | ||||
| 
 | ||||
| 	if(ret)	*file_len = len; | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| uint8_t http_post_cgi_handler(uint8_t * uri_name, st_http_request * p_http_request, uint8_t * buf, uint32_t * file_len) | ||||
| { | ||||
| 	uint8_t ret = HTTP_OK; | ||||
| 	uint16_t len = 0; | ||||
| 	uint8_t val = 0; | ||||
| 
 | ||||
| 	if(predefined_set_cgi_processor(uri_name, p_http_request->URI, buf, &len)) | ||||
| 	{ | ||||
| 		; | ||||
| 	} | ||||
| 	else if(strcmp((const char *)uri_name, "example.cgi") == 0) | ||||
| 	{ | ||||
| 		// To do
 | ||||
| 		val = 1; | ||||
| 		len = sprintf((char *)buf, "%d", val); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		// CGI file not found
 | ||||
| 		ret = HTTP_FAILED; | ||||
| 	} | ||||
| 
 | ||||
| 	if(ret)	*file_len = len; | ||||
| 	return ret; | ||||
| } | ||||
| @ -0,0 +1,32 @@ | ||||
| /**
 | ||||
|  * @file	httpUtil.h | ||||
|  * @brief	Header File for HTTP Server Utilities | ||||
|  * @version 1.0 | ||||
|  * @date	2014/07/15 | ||||
|  * @par Revision | ||||
|  *			2014/07/15 - 1.0 Release | ||||
|  * @author	 | ||||
|  * \n\n @par Copyright (C) 1998 - 2014 WIZnet. All rights reserved. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef	__HTTPUTIL_H__ | ||||
| #define	__HTTPUTIL_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include "httpServer.h" | ||||
| #include "httpParser.h" | ||||
| 
 | ||||
| uint8_t http_get_cgi_handler(uint8_t * uri_name, uint8_t * buf, uint32_t * file_len); | ||||
| uint8_t http_post_cgi_handler(uint8_t * uri_name, st_http_request * p_http_request, uint8_t * buf, uint32_t * file_len); | ||||
| 
 | ||||
| uint8_t predefined_get_cgi_processor(uint8_t * uri_name, uint8_t * buf, uint16_t * len); | ||||
| uint8_t predefined_set_cgi_processor(uint8_t * uri_name, uint8_t * uri, uint8_t * buf, uint16_t * len); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
| @ -0,0 +1,43 @@ | ||||
| <!DOCTYPE html> | ||||
| 
 | ||||
| <html> | ||||
| <head> | ||||
|   <title>W5500-AtMEGA1284p Web Server Analog Input</title> | ||||
|   <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> | ||||
|   <meta http-equiv='pragma' content='no-cache'> | ||||
|   <meta http-equiv='content-type' content='no-cache, no-store, must-revalidate'> | ||||
|   <script type='text/javascript' src='ajax.js'> | ||||
| </script> | ||||
|   <script type='text/javascript' src='ain.js'> | ||||
| </script> | ||||
|   <style>.analog { | ||||
|     margin-top: 2px; | ||||
|     margin-right: 10px; | ||||
|     border: 1px solid #ccc; | ||||
|     height: 20px; | ||||
|     width: 500px; | ||||
|     display: block; | ||||
|   } | ||||
|   .ain{ | ||||
|     width: 0%; | ||||
|     height: 100%; | ||||
|     text-align: center; | ||||
|     background: red; | ||||
|     float: left; | ||||
|     display: block; | ||||
|   } | ||||
|   </style> | ||||
| </head> | ||||
| 
 | ||||
| <body> | ||||
|   <div> | ||||
|     <input type='text' id='txtain_v6' size='5' disabled='disabled' value=''> | ||||
|     <input type='button' value='Get AIN6' pin='6' onclick='getAin(this);'> | ||||
|     <input type='button' value='Get AIN6 Auto' onclick='getAin6_update();'><br> | ||||
| 
 | ||||
|     <div class='analog' style='padding:0px;'> | ||||
|       <strong id='ain_v6' name='ain' class='ain' style='width:0%;'></strong> | ||||
|     </div> | ||||
|   </div> | ||||
| </body> | ||||
| </html> | ||||
| @ -0,0 +1,57 @@ | ||||
| function AinCallback(o) | ||||
| { | ||||
|   var pin = o.ain_p; | ||||
|   $('txtain_v'+pin).value = o.ain_v; | ||||
|   AinDrawgraph(o); | ||||
| } | ||||
| function getAin(o) | ||||
| { | ||||
|   var p = o.attributes['pin'].value; | ||||
|   var oUpdate; | ||||
|   setTimeout(function() | ||||
|     { | ||||
|       oUpdate = new AJAX('get_ain'+p+'.cgi', | ||||
|       function(t) | ||||
|         { | ||||
|           try | ||||
|           { | ||||
|             eval(t); | ||||
|           } | ||||
|           catch(e) | ||||
|           { | ||||
|             alert(e); | ||||
|           } | ||||
|         } | ||||
|       ); | ||||
|       oUpdate.doGet(); | ||||
|     } | ||||
|     , 300); | ||||
| } | ||||
| function AinDrawgraph(o) | ||||
| { | ||||
|   var pin = o.ain_p; | ||||
|   var val = o.ain_v; | ||||
|   $('ain_v'+pin).style.width = val*500/1023+'px'; | ||||
| } | ||||
| function getAin6_update() | ||||
| { | ||||
|   var oUpdate; | ||||
|   setTimeout(function() | ||||
|     { | ||||
|       oUpdate = new AJAX('get_ain6.cgi', | ||||
|       function(t) | ||||
|         { | ||||
|           try | ||||
|           { | ||||
|             eval(t); | ||||
|           } | ||||
|           catch(e) | ||||
|           { | ||||
|             alert(e); | ||||
|           } | ||||
|         } | ||||
|       ); | ||||
|       oUpdate.doGet(); | ||||
|     } | ||||
|     , 300); setTimeout('getAin6_update()', 500); | ||||
| } | ||||
| @ -0,0 +1,27 @@ | ||||
| <!DOCTYPE html> | ||||
| 
 | ||||
| <html> | ||||
| <head> | ||||
|   <title>W5500-AtMEGA1284p Web Server Analog Input Gauge</title> | ||||
|   <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> | ||||
|   <meta http-equiv='pragma' content='no-cache'> | ||||
|   <meta http-equiv='content-type' content='no-cache, no-store, must-revalidate'> | ||||
|   <script type='text/javascript' src='ajax.js'> | ||||
| </script> | ||||
|   <script type='text/javascript' src='https://www.google.com/jsapi'> | ||||
| </script> | ||||
|   <script type='text/javascript' src='ain_gaug.js'> | ||||
| </script> | ||||
| </head> | ||||
| 
 | ||||
| <body> | ||||
|   <div> | ||||
|     <input type='text' id='txtain_v6' size='5' disabled='disabled' value=''> | ||||
|     <input type='button' value='Get AIN' pin='6' onclick='getAin(this);'> | ||||
|     <input type='button' value='Get AIN Auto' onclick='getAin6_update();'><br> | ||||
|     <!--Draw the Google Gauge Chart--> | ||||
| 
 | ||||
|     <div id='chart_div' style='width: 400px; height: 120px;'></div> | ||||
|   </div> | ||||
| </body> | ||||
| </html> | ||||
| @ -0,0 +1,87 @@ | ||||
| google.load('visualization', '1', | ||||
|   { | ||||
|   packages:['gauge'] | ||||
|   } | ||||
| ); google.setOnLoadCallback(AinDrawGoogleGauge); | ||||
| 
 | ||||
| function AinCallback(o) | ||||
| { | ||||
|   var pin = o.ain_p; | ||||
|   $('txtain_v'+pin).value = o.ain_v; | ||||
|   AinDrawGoogleGauge(o); | ||||
| } | ||||
| 
 | ||||
| function getAin(o) | ||||
| { | ||||
|   var p = o.attributes['pin'].value; | ||||
|   var oUpdate; | ||||
|   setTimeout(function() | ||||
|     { | ||||
|       oUpdate = new AJAX('get_ain'+p+'.cgi', | ||||
|       function(t) | ||||
|         { | ||||
|           try | ||||
|           { | ||||
|             eval(t); | ||||
|           } | ||||
|           catch(e) | ||||
|           { | ||||
|             alert(e); | ||||
|           } | ||||
|         } | ||||
|       ); | ||||
|       oUpdate.doGet(); | ||||
|     } | ||||
|     , 300); | ||||
| } | ||||
| 
 | ||||
| function AinDrawGoogleGauge(o) | ||||
| { | ||||
|   var val = o.ain_v; | ||||
|   //var temp_val = Number(((((val*3300)/1023)-500)/10).toFixed(2));
 | ||||
|   var temp_val = Number(val); //here in range 0..1023
 | ||||
|   if(isNaN(temp_val)) temp_val = 0; | ||||
|   var data = google.visualization.arrayToDataTable([['Label', 'Value'],['ADC6', 80]]); | ||||
|   var options = | ||||
|   { | ||||
|     width: 400, | ||||
|     height: 120, | ||||
|     max: 1023, | ||||
|     min: 0, | ||||
|     greenFrom: 0, | ||||
|     greenTo: 512, | ||||
|     redFrom: 918, | ||||
|     redTo: 1023, | ||||
|     yellowFrom: 714, | ||||
|     yellowTo: 918, | ||||
|     majorTicks: ['0', '512', '1023'], | ||||
|     minorTicks: 5 | ||||
|   }; | ||||
|   var chart = new google.visualization.Gauge(document.getElementById('chart_div')); | ||||
|   data.setValue(0, 1, temp_val); | ||||
|   chart.draw(data, options); | ||||
| } | ||||
| 
 | ||||
| function getAin6_update() | ||||
| { | ||||
|   var oUpdate; | ||||
|   setTimeout(function() | ||||
|     { | ||||
|       oUpdate = new AJAX('get_ain6.cgi', | ||||
|       function(t) | ||||
|         { | ||||
|           try | ||||
|           { | ||||
|             eval(t); | ||||
|           } | ||||
|           catch(e) | ||||
|           { | ||||
|             alert(e); | ||||
|           } | ||||
|         } | ||||
|       ); | ||||
|       oUpdate.doGet(); | ||||
|     } | ||||
|     , 300); | ||||
|     setTimeout('getAin6_update()', 500); | ||||
| } | ||||
| @ -0,0 +1,68 @@ | ||||
| function AJAX(a, e) | ||||
| { | ||||
|   var c = d(); | ||||
|   c.onreadystatechange = b; | ||||
|   function d() | ||||
|   { | ||||
|     if(window.XMLHttpRequest) | ||||
|     { | ||||
|       return new XMLHttpRequest() | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       if(window.ActiveXObject) | ||||
|       { | ||||
|         return new ActiveXObject("Microsoft.XMLHTTP") | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   function b() | ||||
|   { | ||||
|     if(c.readyState==4) | ||||
|     { | ||||
|       if(c.status==200) | ||||
|       { | ||||
|         if(e) | ||||
|         { | ||||
|           e(c.responseText) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   this.doGet = function() | ||||
|   { | ||||
|     c.open("GET", a, true); c.send(null) | ||||
|   }; | ||||
|   this.doPost = function(f) | ||||
|   { | ||||
|     c.open("POST", a, true); | ||||
|     c.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); | ||||
|     c.setRequestHeader("ISAJAX", "yes"); | ||||
|     c.send(f) | ||||
|   } | ||||
| } | ||||
| function $(a) | ||||
| { | ||||
|   return document.getElementById(a) | ||||
| } | ||||
| function $$(a) | ||||
| { | ||||
|   return document.getElementsByName(a) | ||||
| } | ||||
| function $$_ie(a, c) | ||||
| { | ||||
|   if(!a) | ||||
|   { | ||||
|     a = "*" | ||||
|   } | ||||
|   var b = document.getElementsByTagName(a); | ||||
|   var e = []; for(var d = 0; d<b.length; d++) | ||||
|   { | ||||
|     att = b[d].getAttribute("name"); | ||||
|     if(att==c) | ||||
|     { | ||||
|       e.push(b[d]) | ||||
|     } | ||||
|   }return e | ||||
| } | ||||
| 
 | ||||
| @ -0,0 +1,52 @@ | ||||
| # -- coding: utf-8 -- | ||||
| #Reading file in binary & print in HEX AVR PROGCHAR ARRAY every symbol & to ***.h | ||||
| #Ethercard helper utilites for something like: <bfill.emit_raw_p(index_htm, sizeof(index_htm));> | ||||
| #(c) Ibragimov M. Russia Togliatty 19/08/2014 | ||||
| # .PS used for build <***.h> from images(*.gif, *.jpg), *.css, static htm(l) pages, javascript etc.. | ||||
| import sys, os | ||||
| if len(sys.argv) < 2: | ||||
|     sys.exit('Usage: %s file-name' % sys.argv[0]) | ||||
| 
 | ||||
| file_name = sys.argv[1] | ||||
| if not os.path.exists(sys.argv[1]): | ||||
|     sys.exit('ERROR: Filename %s was not found!' % file_name) | ||||
| else: | ||||
| 	print('File %s is OK!' % file_name) | ||||
| file_out = file_name.replace(".", "_") + ".h" | ||||
| print('File_to_write is: %s' % file_out) | ||||
| fhex = open(file_out, "w") | ||||
| fhex_str = 'const char %s[] PROGMEM = {' % file_name.replace(".", "_")  | ||||
| print(fhex_str) | ||||
| fhex.write(fhex_str + '\n') | ||||
| with open(file_name, "rb") as f: | ||||
|     byte = f.read(1) | ||||
|     i = 0 | ||||
|     fhex_size = 0 | ||||
|     _str = "" | ||||
|     while byte != "": | ||||
| 		# Do stuff with byte. | ||||
| 		_byte = f.read(1) | ||||
| 		fhex_size = fhex_size + 1 | ||||
| 		if _byte != "": | ||||
| 			#print ('%s, ' % hex(ord(byte))) | ||||
| 			_str = _str + "%s," % hex(ord(byte)) | ||||
| 		else: | ||||
| 			#Last byte wo <,> | ||||
| 			#print hex(ord(byte)) | ||||
| 			_str = _str + "%s" % hex(ord(byte)) | ||||
| 			if i < 15: | ||||
| 				print _str | ||||
| 				fhex.write(_str + '\n') | ||||
| 		byte = _byte; | ||||
| 		i = i + 1; | ||||
| 		if i > 15: | ||||
| 			i = 0; | ||||
| 			print _str | ||||
| 			fhex.write(_str + '\n') | ||||
| 			_str = "" | ||||
| print'};' | ||||
| fhex.write('};\n') | ||||
| _str = '%s: %d bytes' % (file_name, fhex_size) | ||||
| print(_str); | ||||
| fhex.write('//' + _str + '\n'); | ||||
| fhex.close() | ||||
											
												Binary file not shown.
											
										
									
								| After Width: | Height: | Size: 13 KiB | 
| @ -0,0 +1,24 @@ | ||||
| <!DOCTYPE html> | ||||
| 
 | ||||
| <html> | ||||
| <head> | ||||
|   <title>W5500-AtMEGA1284p Web Server Digital I/O v1.1</title> | ||||
|   <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> | ||||
|   <script type='text/javascript' src='ajax.js'> | ||||
| </script> | ||||
|   <script type='text/javascript' src='dio.js'> | ||||
| </script> | ||||
| </head> | ||||
| 
 | ||||
| <body onload='getled1();'> | ||||
|   <!-- to do --> | ||||
| 
 | ||||
|   <p id="led1_txt">LED1: unknown..</p> | ||||
| 
 | ||||
|   <div> | ||||
|     <input type='button' value='LED 1 Off' pin='LED1' s='0' onclick='setDiostate(this);'> | ||||
|     <input type='button' value='LED 1 On' pin='LED1' s='1' onclick='setDiostate(this);'><br> | ||||
|   </div><!-- to do --> | ||||
| </body> | ||||
| </html> | ||||
| 
 | ||||
| @ -0,0 +1,93 @@ | ||||
| function DioCallback(o) | ||||
| { | ||||
|   var pin = o.dio_p; | ||||
|   $('txtdio_s'+pin).value = o.dio_s; | ||||
|   $('txtdio_d'+pin).value = o.dio_d; | ||||
| } | ||||
| function led1Callback(o) | ||||
| { | ||||
|   $('led1_txt').innerHTML = o.led1_txt; | ||||
| } | ||||
| function getDio(o) | ||||
| { | ||||
|   var p = o.attributes['pin'].value; | ||||
|   var oUpdate; | ||||
|   oUpdate = new AJAX('get_dio'+p+'.cgi', | ||||
|   function(t) | ||||
|     { | ||||
|       try | ||||
|       { | ||||
|         eval(t); | ||||
|       } | ||||
|       catch(e) | ||||
|       { | ||||
|         alert(e); | ||||
|       } | ||||
|     } | ||||
|   ); | ||||
|   oUpdate.doGet(); | ||||
| } | ||||
| function setDiostate(o) | ||||
| { | ||||
|   var p = o.attributes['pin'].value; | ||||
|   /*var v=$('txtdio_s'+p).value;*/ | ||||
|   var v = o.attributes['s'].value; | ||||
|   dout = new AJAX('set_diostate.cgi', | ||||
|   function(t) | ||||
|     { | ||||
|       try | ||||
|       { | ||||
|         /*eval(t);*/ | ||||
|         document.getElementById('led1_txt').innerHTML = t; | ||||
|       } | ||||
|       catch(e) | ||||
|       { | ||||
|         alert(e); | ||||
|       } | ||||
|     } | ||||
|   ); | ||||
|   dout.doPost('pin='+p+'&val='+v); | ||||
| } | ||||
| function setDiodir(o) | ||||
| { | ||||
|   var p = o.attributes['pin'].value; | ||||
|   /*var v=$('txtdio_d'+p).value;*/ | ||||
|   var v = o.attributes['d'].value; | ||||
|   dout = new AJAX('set_diodir.cgi', | ||||
|   function(t) | ||||
|     { | ||||
|       try | ||||
|       { | ||||
|         eval(t); | ||||
|       } | ||||
|       catch(e) | ||||
|       { | ||||
|         alert(e); | ||||
|       } | ||||
|     } | ||||
|   ); | ||||
|   dout.doPost('pin='+p+'&val='+v); | ||||
| } | ||||
| function getled1() | ||||
| { | ||||
|   var oUpdate; | ||||
|   setTimeout(function() | ||||
|     { | ||||
|       oUpdate = new AJAX('get_led1.cgi', | ||||
|       function(t) | ||||
|         { | ||||
|           try | ||||
|           { | ||||
|             eval(t); | ||||
|           } | ||||
|           catch(e) | ||||
|           { | ||||
|             alert(e); | ||||
|           } | ||||
|         } | ||||
|       ); | ||||
|       oUpdate.doGet(); | ||||
|     } | ||||
|     , 300); | ||||
|     setTimeout('getled1()', 3000); | ||||
| } | ||||
											
												Binary file not shown.
											
										
									
								| After Width: | Height: | Size: 1.6 KiB | 
											
												
													File diff suppressed because one or more lines are too long
												
											
										
									
								| @ -0,0 +1,25 @@ | ||||
| <!DOCTYPE html> | ||||
| 
 | ||||
| <html> | ||||
| <head> | ||||
|   <title>W5500-AtMEGA1284p Web Server</title> | ||||
|   <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> | ||||
| </head> | ||||
| 
 | ||||
| <body> | ||||
|   <div> | ||||
|     W5500-AtMEGA1284p Web Server Demopage | ||||
|   </div><br> | ||||
|   <a href='netinfo.htm'>Network Information</a><br> | ||||
|   <a href='img.htm'>Base64 Image Data</a><br> | ||||
|   <br> | ||||
|   <a href='m1284p.png'>Board Schematic</a><br> | ||||
|   <a href='brd_wiz.png'>Mounting Scheme</a><br> | ||||
|   <br> | ||||
|   <a href='dio.htm'>Ex1> Digital I/O</a><br> | ||||
|   <a href='ain.htm'>Ex2> Analog Input</a><br> | ||||
|   <a href='ain_gaug.htm'>Ex3> Analog Input: Google Gauge Chart</a><br> | ||||
|   <br> | ||||
|   <a href='info.htm'>Device Information</a><br> | ||||
| </body> | ||||
| </html> | ||||
| @ -0,0 +1,18 @@ | ||||
| <!DOCTYPE html> | ||||
| 
 | ||||
| <html> | ||||
| <head> | ||||
|   <title>W5500-AtMEGA1284p Device Info</title> | ||||
|  <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> | ||||
|   <script type='text/javascript' src='ajax.js'> | ||||
| </script> | ||||
|   <script type='text/javascript' src='info.js'> | ||||
| </script> | ||||
| </head> | ||||
| 
 | ||||
| <body  onload='getInfo();'> | ||||
|   <div> | ||||
|     W5500-AtMEGA1284p Device Information | ||||
|   </div><br> | ||||
| <p id="info_txt">..</p></body> | ||||
| </html> | ||||
| @ -0,0 +1,21 @@ | ||||
| function getInfo() | ||||
| { | ||||
|  var oUpdate; | ||||
|  setTimeout(function() | ||||
|   { | ||||
|    oUpdate = new AJAX('get_info.cgi', function(t) | ||||
|     { | ||||
|      try | ||||
|      { | ||||
|       //*eval(t);
 | ||||
|       document.getElementById('info_txt').innerHTML = t; | ||||
|      } | ||||
|      catch(e) | ||||
|      { | ||||
|       alert(e); | ||||
|      } | ||||
|     } | ||||
|    ); oUpdate.doGet(); | ||||
|   } | ||||
|   , 300); setTimeout('getInfo()', 3000); | ||||
| } | ||||
											
												Binary file not shown.
											
										
									
								| After Width: | Height: | Size: 13 KiB | 
| @ -0,0 +1,33 @@ | ||||
| <!DOCTYPE html> | ||||
| 
 | ||||
| <html> | ||||
| <head> | ||||
|   <title>W5500-AtMEGA1284p Web Server Network Info</title> | ||||
|   <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> | ||||
|   <style> | ||||
| label{float:left;text-align:left;width:50px;}li {list-style:none;} | ||||
|   </style> | ||||
|   <script type='text/javascript' src='ajax.js'> | ||||
| </script> | ||||
|   <script type='text/javascript' src='netinfo.js'> | ||||
| </script> | ||||
| </head> | ||||
| 
 | ||||
| <body onLoad='getNetinfo()'> | ||||
|   <div> | ||||
|     W5500-AtMEGA1284p Web Server Network Information | ||||
|   </div><br> | ||||
| 
 | ||||
|   <ul> | ||||
|     <li><label for='txtmac'>MAC:</label><input id='txtmac' name='mac' type='text' size='20' disabled='disabled'></li> | ||||
| 
 | ||||
|     <li><label for='txtip'>IP:</label><input id='txtip' name='ip' type='text' size='20' disabled='disabled'></li> | ||||
| 
 | ||||
|     <li><label for='txtgw'>GW:</label><input id='txtgw' name='gw' type='text' size='20' disabled='disabled'></li> | ||||
| 
 | ||||
|     <li><label for='txtsn'>SN:</label><input id='txtsn' name='sn' type='text' size='20' disabled='disabled'></li> | ||||
| 
 | ||||
|     <li><label for='txtdns'>DNS:</label><input id='txtdns' name='dns' type='text' size='20' disabled='disabled'></li> | ||||
|   </ul> | ||||
| </body> | ||||
| </html> | ||||
| @ -0,0 +1,37 @@ | ||||
| function NetinfoCallback(o) | ||||
| { | ||||
|   $('txtmac').value = o.mac; | ||||
|   $('txtip').value = o.ip; | ||||
|   $('txtgw').value = o.gw; | ||||
|   $('txtsn').value = o.sn; | ||||
|   $('txtdns').value = o.dns; | ||||
|   if(typeof(window.external)!='undefined') | ||||
|   { | ||||
|     obj = $$_ie('input', 'dhcp'); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     obj = $$('dhcp'); | ||||
|   } | ||||
| } | ||||
| function getNetinfo() | ||||
| { | ||||
|   var oUpdate; | ||||
|   setTimeout(function() | ||||
|     { | ||||
|       oUpdate = new AJAX('get_netinfo.cgi', function(t) | ||||
|         { | ||||
|           try | ||||
|           { | ||||
|             eval(t); | ||||
|           } | ||||
|           catch(e) | ||||
|           { | ||||
|             alert(e); | ||||
|           } | ||||
|         } | ||||
|       ); | ||||
|       oUpdate.doGet(); | ||||
|     } | ||||
|     , 1500); | ||||
| } | ||||
| @ -0,0 +1,3 @@ | ||||
| del *.b#* | ||||
| del *.s#* | ||||
| pause | ||||
| @ -0,0 +1,348 @@ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Unicode - Local code bidirectional converter  (C)ChaN, 2015            */ | ||||
| /* (SBCS code pages)                                                      */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /*  437   U.S. | ||||
| /   720   Arabic | ||||
| /   737   Greek | ||||
| /   771   KBL | ||||
| /   775   Baltic | ||||
| /   850   Latin 1 | ||||
| /   852   Latin 2 | ||||
| /   855   Cyrillic | ||||
| /   857   Turkish | ||||
| /   860   Portuguese | ||||
| /   861   Icelandic | ||||
| /   862   Hebrew | ||||
| /   863   Canadian French | ||||
| /   864   Arabic | ||||
| /   865   Nordic | ||||
| /   866   Russian | ||||
| /   869   Greek 2 | ||||
| */ | ||||
| 
 | ||||
| #include "ff.h" | ||||
| 
 | ||||
| 
 | ||||
| #if _CODE_PAGE == 437 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP437(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, | ||||
| 	0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, | ||||
| 	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 720 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP720(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, | ||||
| 	0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, | ||||
| 	0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, | ||||
| 	0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 737 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP737(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, | ||||
| 	0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, | ||||
| 	0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, | ||||
| 	0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 771 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP771(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, | ||||
| 	0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, | ||||
| 	0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x0104, 0x0105, 0x010C, 0x010D, | ||||
| 	0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, | ||||
| 	0x0118, 0x0119, 0x0116, 0x0117, 0x012E, 0x012F, 0x0160, 0x0161, 0x0172, 0x0173, 0x016A, 0x016B, 0x017D, 0x017E, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 775 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP775(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, | ||||
| 	0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, | ||||
| 	0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, | ||||
| 	0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, | ||||
| 	0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 850 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP850(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, | ||||
| 	0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, | ||||
| 	0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, | ||||
| 	0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, | ||||
| 	0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 852 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP852(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, | ||||
| 	0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, | ||||
| 	0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, | ||||
| 	0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, | ||||
| 	0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 855 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP855(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, | ||||
| 	0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, | ||||
| 	0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, | ||||
| 	0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, | ||||
| 	0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, | ||||
| 	0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 857 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP857(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, | ||||
| 	0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, | ||||
| 	0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, | ||||
| 	0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, | ||||
| 	0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 860 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP860(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, 0x00EA, 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2, | ||||
| 	0x00C9, 0x00C0, 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, 0x00CC, 0x00D5, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, | ||||
| 	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 861 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP861(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5, | ||||
| 	0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, 0x00FD, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00C1, 0x00CD, 0x00D3, 0x00DA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, | ||||
| 	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 862 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP862(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, | ||||
| 	0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, | ||||
| 	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 863 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP863(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x2017, 0x00C0, | ||||
| 	0x00C9, 0x00C8, 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, 0x00A4, 0x00D4, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192, | ||||
| 	0x00A6, 0x00B4, 0x00F3, 0x00FA, 0x00A8, 0x00BB, 0x00B3, 0x00AF, 0x00CE, 0x3210, 0x00AC, 0x00BD, 0x00BC, 0x00BE, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2219, | ||||
| 	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 864 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP864(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, 0x2524, 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518, | ||||
| 	0x03B2, 0x221E, 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, 0x00BB, 0xFEF7, 0xFEF8, 0x0000, 0x0000, 0xFEFB, 0xFEFC, 0x0000, | ||||
| 	0x00A0, 0x00AD, 0xFE82, 0x00A3, 0x00A4, 0xFE84, 0x0000, 0x20AC, 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, 0xFE9D, 0xFEA1, 0xFEA5, | ||||
| 	0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, 0x061F, | ||||
| 	0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9, | ||||
| 	0xFEAB, 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, 0xFEC5, 0xFECB, 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9, | ||||
| 	0x0640, 0xFED3, 0xFED7, 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, 0xFECC, 0xFECE, 0xFECD, 0xFEE1, | ||||
| 	0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, 0xFEF0, 0xFEF2, 0xFED0, 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, 0x25A0, 0x0000 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 865 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP865(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, | ||||
| 	0x00C5, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00A4, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, | ||||
| 	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 866 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP866(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, | ||||
| 	0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, | ||||
| 	0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, | ||||
| 	0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 869 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP869(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x0386, 0x00B7, 0x00B7, 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, | ||||
| 	0x038A, 0x03AA, 0x038C, 0x00B7, 0x00B7, 0x038E, 0x03AB, 0x00A9, 0x038F, 0x00B2, 0x00B3, 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF, | ||||
| 	0x03CA, 0x0390, 0x03CC, 0x03CD, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, 0x0399, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, 0x039B, 0x039C, 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0A30, 0x03A1, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3, | ||||
| 	0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x2518, 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580, | ||||
| 	0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x0384, | ||||
| 	0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, 0x00A7, 0x03C8, 0x0385, 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| #if !_TBLDEF || !_USE_LFN | ||||
| #error This file is not needed at current configuration. Remove from the project. | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| WCHAR ff_convert (	/* Converted character, Returns zero on error */ | ||||
| 	WCHAR	chr,	/* Character code to be converted */ | ||||
| 	UINT	dir		/* 0: Unicode to OEM code, 1: OEM code to Unicode */ | ||||
| ) | ||||
| { | ||||
| 	WCHAR c; | ||||
| 
 | ||||
| 
 | ||||
| 	if (chr < 0x80) {	/* ASCII */ | ||||
| 		c = chr; | ||||
| 
 | ||||
| 	} else { | ||||
| 		if (dir) {		/* OEM code to Unicode */ | ||||
| 			c = (chr >= 0x100) ? 0 : Tbl[chr - 0x80]; | ||||
| 
 | ||||
| 		} else {		/* Unicode to OEM code */ | ||||
| 			for (c = 0; c < 0x80; c++) { | ||||
| 				if (chr == Tbl[c]) break; | ||||
| 			} | ||||
| 			c = (c + 0x80) & 0xFF; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return c; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| WCHAR ff_wtoupper (	/* Returns upper converted character */ | ||||
| 	WCHAR chr		/* Unicode character to be upper converted */ | ||||
| ) | ||||
| { | ||||
| 	static const WCHAR lower[] = {	/* Lower case characters to be converted */ | ||||
| 	/* Latin Supplement */			0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, | ||||
| 	/* Latin Extended-A */			0x101,0x103,0x105,0x107,0x109,0x10B,0x10D,0x10F,0x111,0x113,0x115,0x117,0x119,0x11B,0x11D,0x11F,0x121,0x123,0x125,0x127,0x129,0x12B,0x12D,0x12F,0x131,0x133,0x135,0x137,0x13A,0x13C,0x13E,0x140,0x142,0x144,0x146,0x148,0x14B,0x14D,0x14F,0x151,0x153,0x155,0x157,0x159,0x15B,0x15D,0x15F,0x161,0x163,0x165,0x167,0x169,0x16B,0x16D,0x16F,0x171,0x173,0x175,0x177,0x17A,0x17C,0x17E, | ||||
| 	/* Latin Extended-B */			0x183,0x185,0x188,0x18C,0x192,0x199,0x1A1,0x1A3,0x1A8,0x1AD,0x1B0,0x1B4,0x1B6,0x1B9,0x1BD,0x1C6,0x1C9,0x1CC,0x1CE,0x1D0,0x1D2,0x1D4,0x1D6,0x1D8,0x1DA,0x1DC,0x1DD,0x1DF,0x1E1,0x1E3,0x1E5,0x1E7,0x1E9,0x1EB,0x1ED,0x1EF,0x1F3,0x1F5,0x1FB,0x1FD,0x1FF,0x201,0x203,0x205,0x207,0x209,0x20B,0x20D,0x20F,0x211,0x213,0x215,0x217, | ||||
| 	/* Greek, Coptic */				0x3B1,0x3B2,0x3B3,0x3B4,0x3B5,0x3B6,0x3B7,0x3B8,0x3B9,0x3BA,0x3BB,0x3BC,0x3BD,0x3BE,0x3BF,0x3C0,0x3C1,0x3C3,0x3C4,0x3C5,0x3C6,0x3C7,0x3C8,0x3C9,0x3CA,0x3CB,0x3CC,0x3CD,0x3CE,0x3E3,0x3E5,0x3E7,0x3E9,0x3EB, | ||||
| 	/* Cyrillic */					0x430,0x431,0x432,0x433,0x434,0x435,0x436,0x437,0x438,0x439,0x43A,0x43B,0x43C,0x43D,0x43E,0x43F,0x440,0x441,0x442,0x443,0x444,0x445,0x446,0x447,0x448,0x449,0x44A,0x44B,0x44C,0x44D,0x44E,0x44F,0x452,0x453,0x454,0x455,0x456,0x457,0x458,0x459,0x45A,0x45B,0x45C,0x45E,0x45F,0x461,0x463,0x465,0x467,0x469,0x46B,0x46D,0x46F,0x471,0x473,0x475,0x477,0x479,0x47B,0x47D,0x47F,0x481,0x491,0x493,0x495,0x497,0x499,0x49B,0x49D,0x49F,0x4A1,0x4A3,0x4A5,0x4A7,0x4A9,0x4AB,0x4AD,0x4AF,0x4B1,0x4B3,0x4B5,0x4B7,0x4B9,0x4BB,0x4BD,0x4BF,0x4C2,0x4C4,0x4C8,0x4D1,0x4D3,0x4D5,0x4D7,0x4D9,0x4DB,0x4DD,0x4DF,0x4E1,0x4E3,0x4E5,0x4E7,0x4E9,0x4EB,0x4ED,0x4EF,0x4F1,0x4F3,0x4F5,0x4F9, | ||||
| 	/* Armenian */					0x561,0x562,0x563,0x564,0x565,0x566,0x567,0x568,0x569,0x56A,0x56B,0x56C,0x56D,0x56E,0x56F,0x570,0x571,0x572,0x573,0x574,0x575,0x576,0x577,0x578,0x579,0x57A,0x57B,0x57C,0x57D,0x57E,0x57F,0x580,0x581,0x582,0x583,0x584,0x585,0x586, | ||||
| 	/* Latin Extended Additional */	0x1E01,0x1E03,0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13,0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25,0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35,0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47,0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57,0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69,0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79,0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B,0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E97,0x1E99,0x1E9B,0x1E9D,0x1E9F,0x1EA1,0x1EA3,0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5,0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5,0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7,0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7,0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9, | ||||
| 	/* Number forms */				0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F, | ||||
| 	/* Full-width */				0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A | ||||
| 	}; | ||||
| 	static const WCHAR upper[] = {	/* Upper case characters correspond to lower[] */ | ||||
| 									0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x178, | ||||
| 									0x100,0x102,0x104,0x106,0x108,0x10A,0x10C,0x10E,0x110,0x112,0x114,0x116,0x118,0x11A,0x11C,0x11E,0x120,0x122,0x124,0x126,0x128,0x12A,0x12C,0x12E,0x130,0x132,0x134,0x136,0x139,0x13B,0x13D,0x13F,0x141,0x143,0x145,0x147,0x14A,0x14C,0x14E,0x150,0x152,0x154,0x156,0x158,0x15A,0x15C,0x15E,0x160,0x162,0x164,0x166,0x168,0x16A,0x16C,0x16E,0x170,0x172,0x174,0x176,0x179,0x17B,0x17D, | ||||
| 									0x182,0x184,0x187,0x18B,0x191,0x198,0x1A0,0x1A2,0x1A7,0x1AC,0x1AF,0x1B3,0x1B5,0x1B8,0x1BC,0x1C4,0x1C7,0x1CA,0x1CD,0x1CF,0x1D1,0x1D3,0x1D5,0x1D7,0x1D9,0x1DB,0x18E,0x1DE,0x1E0,0x1E2,0x1E4,0x1E6,0x1E8,0x1EA,0x1EC,0x1EE,0x1F1,0x1F4,0x1FA,0x1FC,0x1FE,0x200,0x202,0x204,0x206,0x208,0x20A,0x20C,0x20E,0x210,0x212,0x214,0x216, | ||||
| 									0x391,0x392,0x393,0x394,0x395,0x396,0x397,0x398,0x399,0x39A,0x39B,0x39C,0x39D,0x39E,0x39F,0x3A0,0x3A1,0x3A3,0x3A4,0x3A5,0x3A6,0x3A7,0x3A8,0x3A9,0x3AA,0x3AB,0x38C,0x38E,0x38F,0x3E2,0x3E4,0x3E6,0x3E8,0x3EA, | ||||
| 									0x410,0x411,0x412,0x413,0x414,0x415,0x416,0x417,0x418,0x419,0x41A,0x41B,0x41C,0x41D,0x41E,0x41F,0x420,0x421,0x422,0x423,0x424,0x425,0x426,0x427,0x428,0x429,0x42A,0x42B,0x42C,0x42D,0x42E,0x42F,0x402,0x403,0x404,0x405,0x406,0x407,0x408,0x409,0x40A,0x40B,0x40C,0x40E,0x40F,0x460,0x462,0x464,0x466,0x468,0x46A,0x46C,0x46E,0x470,0x472,0x474,0x476,0x478,0x47A,0x47C,0x47E,0x480,0x490,0x492,0x494,0x496,0x498,0x49A,0x49C,0x49E,0x4A0,0x4A2,0x4A4,0x4A6,0x4A8,0x4AA,0x4AC,0x4AE,0x4B0,0x4B2,0x4B4,0x4B6,0x4B8,0x4BA,0x4BC,0x4BE,0x4C1,0x4C3,0x5C7,0x4D0,0x4D2,0x4D4,0x4D6,0x4D8,0x4DA,0x4DC,0x4DE,0x4E0,0x4E2,0x4E4,0x4E6,0x4E8,0x4EA,0x4EC,0x4EE,0x4F0,0x4F2,0x4F4,0x4F8, | ||||
| 									0x531,0x532,0x533,0x534,0x535,0x536,0x537,0x538,0x539,0x53A,0x53B,0x53C,0x53D,0x53E,0x53F,0x540,0x541,0x542,0x543,0x544,0x545,0x546,0x547,0x548,0x549,0x54A,0x54B,0x54C,0x54D,0x54E,0x54F,0x550,0x551,0x552,0x553,0x554,0x555,0x556, | ||||
| 									0x1E00,0x1E02,0x1E04,0x1E06,0x1E08,0x1E0A,0x1E0C,0x1E0E,0x1E10,0x1E12,0x1E14,0x1E16,0x1E18,0x1E1A,0x1E1C,0x1E1E,0x1E20,0x1E22,0x1E24,0x1E26,0x1E28,0x1E2A,0x1E2C,0x1E2E,0x1E30,0x1E32,0x1E34,0x1E36,0x1E38,0x1E3A,0x1E3C,0x1E3E,0x1E40,0x1E42,0x1E44,0x1E46,0x1E48,0x1E4A,0x1E4C,0x1E4E,0x1E50,0x1E52,0x1E54,0x1E56,0x1E58,0x1E5A,0x1E5C,0x1E5E,0x1E60,0x1E62,0x1E64,0x1E66,0x1E68,0x1E6A,0x1E6C,0x1E6E,0x1E70,0x1E72,0x1E74,0x1E76,0x1E78,0x1E7A,0x1E7C,0x1E7E,0x1E80,0x1E82,0x1E84,0x1E86,0x1E88,0x1E8A,0x1E8C,0x1E8E,0x1E90,0x1E92,0x1E94,0x1E96,0x1E98,0x1E9A,0x1E9C,0x1E9E,0x1EA0,0x1EA2,0x1EA4,0x1EA6,0x1EA8,0x1EAA,0x1EAC,0x1EAE,0x1EB0,0x1EB2,0x1EB4,0x1EB6,0x1EB8,0x1EBA,0x1EBC,0x1EBE,0x1EC0,0x1EC2,0x1EC4,0x1EC6,0x1EC8,0x1ECA,0x1ECC,0x1ECE,0x1ED0,0x1ED2,0x1ED4,0x1ED6,0x1ED8,0x1EDA,0x1EDC,0x1EDE,0x1EE0,0x1EE2,0x1EE4,0x1EE6,0x1EE8,0x1EEA,0x1EEC,0x1EEE,0x1EF0,0x1EF2,0x1EF4,0x1EF6,0x1EF8, | ||||
| 									0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, | ||||
| 									0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A | ||||
| 	}; | ||||
| 	UINT i, n, hi, li; | ||||
| 
 | ||||
| 
 | ||||
| 	if (chr < 0x80) {	/* ASCII characters (acceleration) */ | ||||
| 		if (chr >= 0x61 && chr <= 0x7A) chr -= 0x20; | ||||
| 
 | ||||
| 	} else {			/* Non ASCII characters (table search) */ | ||||
| 		n = 12; li = 0; hi = sizeof lower / sizeof lower[0]; | ||||
| 		do { | ||||
| 			i = li + (hi - li) / 2; | ||||
| 			if (chr == lower[i]) break; | ||||
| 			if (chr > lower[i]) li = i; else hi = i; | ||||
| 		} while (--n); | ||||
| 		if (n) chr = upper[i]; | ||||
| 	} | ||||
| 
 | ||||
| 	return chr; | ||||
| } | ||||
| 
 | ||||
| @ -0,0 +1,95 @@ | ||||
| /*-----------------------------------------------------------------------
 | ||||
| /  Low level disk interface modlue include file   (C)ChaN, 2014 | ||||
| /-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #ifndef _DISKIO_DEFINED | ||||
| #define _DISKIO_DEFINED | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #define _USE_WRITE	1	/* 1: Enable disk_write function */ | ||||
| #define _USE_IOCTL	1	/* 1: Enable disk_ioctl fucntion */ | ||||
| 
 | ||||
| #include "integer.h" | ||||
| 
 | ||||
| 
 | ||||
| /* Status of Disk Functions */ | ||||
| typedef BYTE	DSTATUS; | ||||
| 
 | ||||
| /* Results of Disk Functions */ | ||||
| typedef enum { | ||||
| 	RES_OK = 0,		/* 0: Successful */ | ||||
| 	RES_ERROR,		/* 1: R/W Error */ | ||||
| 	RES_WRPRT,		/* 2: Write Protected */ | ||||
| 	RES_NOTRDY,		/* 3: Not Ready */ | ||||
| 	RES_PARERR		/* 4: Invalid Parameter */ | ||||
| } DRESULT; | ||||
| 
 | ||||
| 
 | ||||
| /*---------------------------------------*/ | ||||
| /* Prototypes for disk control functions */ | ||||
| 
 | ||||
| 
 | ||||
| DSTATUS disk_initialize (BYTE pdrv); | ||||
| DSTATUS disk_status (BYTE pdrv); | ||||
| DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); | ||||
| #if	_USE_WRITE | ||||
| DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); | ||||
| #endif | ||||
| #if	_USE_IOCTL | ||||
| DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); | ||||
| #endif | ||||
| void disk_timerproc (void); | ||||
| 
 | ||||
| 
 | ||||
| /* Disk Status Bits (DSTATUS) */ | ||||
| #define STA_NOINIT		0x01	/* Drive not initialized */ | ||||
| #define STA_NODISK		0x02	/* No medium in the drive */ | ||||
| #define STA_PROTECT		0x04	/* Write protected */ | ||||
| 
 | ||||
| 
 | ||||
| /* Command code for disk_ioctrl fucntion */ | ||||
| 
 | ||||
| /* Generic command (Used by FatFs) */ | ||||
| #define CTRL_SYNC			0	/* Complete pending write process (needed at _FS_READONLY == 0) */ | ||||
| #define GET_SECTOR_COUNT	1	/* Get media size (needed at _USE_MKFS == 1) */ | ||||
| #define GET_SECTOR_SIZE		2	/* Get sector size (needed at _MAX_SS != _MIN_SS) */ | ||||
| #define GET_BLOCK_SIZE		3	/* Get erase block size (needed at _USE_MKFS == 1) */ | ||||
| #define CTRL_TRIM			4	/* Inform device that the data on the block of sectors is no longer used (needed at _USE_TRIM == 1) */ | ||||
| 
 | ||||
| /* Generic command (Not used by FatFs) */ | ||||
| #define CTRL_FORMAT			5	/* Create physical format on the media */ | ||||
| #define CTRL_POWER_IDLE		6	/* Put the device idle state */ | ||||
| #define CTRL_POWER_OFF		7	/* Put the device off state */ | ||||
| #define CTRL_LOCK			8	/* Lock media removal */ | ||||
| #define CTRL_UNLOCK			9	/* Unlock media removal */ | ||||
| #define CTRL_EJECT			10	/* Eject media */ | ||||
| 
 | ||||
| /* MMC/SDC specific command (Not used by FatFs) */ | ||||
| #define MMC_GET_TYPE		50	/* Get card type */ | ||||
| #define MMC_GET_CSD			51	/* Get CSD */ | ||||
| #define MMC_GET_CID			52	/* Get CID */ | ||||
| #define MMC_GET_OCR			53	/* Get OCR */ | ||||
| #define MMC_GET_SDSTAT		54	/* Get SD status */ | ||||
| 
 | ||||
| /* ATA/CF specific command (Not used by FatFs) */ | ||||
| #define ATA_GET_REV			60	/* Get F/W revision */ | ||||
| #define ATA_GET_MODEL		61	/* Get model name */ | ||||
| #define ATA_GET_SN			62	/* Get serial number */ | ||||
| 
 | ||||
| 
 | ||||
| /* MMC card type flags (MMC_GET_TYPE) */ | ||||
| #define CT_MMC		0x01		/* MMC ver 3 */ | ||||
| #define CT_SD1		0x02		/* SD ver 1 */ | ||||
| #define CT_SD2		0x04		/* SD ver 2 */ | ||||
| #define CT_SDC		(CT_SD1|CT_SD2)	/* SD */ | ||||
| #define CT_BLOCK	0x08		/* Block addressing */ | ||||
| 
 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
											
												
													File diff suppressed because it is too large
													Load Diff
												
											
										
									
								| @ -0,0 +1,350 @@ | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| /  FatFs - FAT file system module include R0.11     (C)ChaN, 2015 | ||||
| /----------------------------------------------------------------------------/ | ||||
| / FatFs module is a free software that opened under license policy of | ||||
| / following conditions. | ||||
| / | ||||
| / Copyright (C) 2015, ChaN, all right reserved. | ||||
| / | ||||
| / 1. Redistributions of source code must retain the above copyright notice, | ||||
| /    this condition and the following disclaimer. | ||||
| / | ||||
| / This software is provided by the copyright holder and contributors "AS IS" | ||||
| / and any warranties related to this software are DISCLAIMED. | ||||
| / The copyright owner or contributors be NOT LIABLE for any damages caused | ||||
| / by use of this software. | ||||
| /---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| #ifndef _FATFS | ||||
| #define _FATFS	32020	/* Revision ID */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include "integer.h"	/* Basic integer types */ | ||||
| #include "ffconf.h"		/* FatFs configuration options */ | ||||
| #if _FATFS != _FFCONF | ||||
| #error Wrong configuration file (ffconf.h). | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* Definitions of volume management */ | ||||
| 
 | ||||
| #if _MULTI_PARTITION		/* Multiple partition configuration */ | ||||
| typedef struct { | ||||
| 	BYTE pd;	/* Physical drive number */ | ||||
| 	BYTE pt;	/* Partition: 0:Auto detect, 1-4:Forced partition) */ | ||||
| } PARTITION; | ||||
| extern PARTITION VolToPart[];	/* Volume - Partition resolution table */ | ||||
| #define LD2PD(vol) (VolToPart[vol].pd)	/* Get physical drive number */ | ||||
| #define LD2PT(vol) (VolToPart[vol].pt)	/* Get partition index */ | ||||
| 
 | ||||
| #else							/* Single partition configuration */ | ||||
| #define LD2PD(vol) (BYTE)(vol)	/* Each logical drive is bound to the same physical drive number */ | ||||
| #define LD2PT(vol) 0			/* Find first valid partition or in SFD */ | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* Type of path name strings on FatFs API */ | ||||
| 
 | ||||
| #if _LFN_UNICODE			/* Unicode string */ | ||||
| #if !_USE_LFN | ||||
| #error _LFN_UNICODE must be 0 at non-LFN cfg. | ||||
| #endif | ||||
| #ifndef _INC_TCHAR | ||||
| typedef WCHAR TCHAR; | ||||
| #define _T(x) L ## x | ||||
| #define _TEXT(x) L ## x | ||||
| #endif | ||||
| 
 | ||||
| #else						/* ANSI/OEM string */ | ||||
| #ifndef _INC_TCHAR | ||||
| typedef char TCHAR; | ||||
| #define _T(x) x | ||||
| #define _TEXT(x) x | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* File system object structure (FATFS) */ | ||||
| 
 | ||||
| typedef struct { | ||||
| 	BYTE	fs_type;		/* FAT sub-type (0:Not mounted) */ | ||||
| 	BYTE	drv;			/* Physical drive number */ | ||||
| 	BYTE	csize;			/* Sectors per cluster (1,2,4...128) */ | ||||
| 	BYTE	n_fats;			/* Number of FAT copies (1 or 2) */ | ||||
| 	BYTE	wflag;			/* win[] flag (b0:dirty) */ | ||||
| 	BYTE	fsi_flag;		/* FSINFO flags (b7:disabled, b0:dirty) */ | ||||
| 	WORD	id;				/* File system mount ID */ | ||||
| 	WORD	n_rootdir;		/* Number of root directory entries (FAT12/16) */ | ||||
| #if _MAX_SS != _MIN_SS | ||||
| 	WORD	ssize;			/* Bytes per sector (512, 1024, 2048 or 4096) */ | ||||
| #endif | ||||
| #if _FS_REENTRANT | ||||
| 	_SYNC_t	sobj;			/* Identifier of sync object */ | ||||
| #endif | ||||
| #if !_FS_READONLY | ||||
| 	DWORD	last_clust;		/* Last allocated cluster */ | ||||
| 	DWORD	free_clust;		/* Number of free clusters */ | ||||
| #endif | ||||
| #if _FS_RPATH | ||||
| 	DWORD	cdir;			/* Current directory start cluster (0:root) */ | ||||
| #endif | ||||
| 	DWORD	n_fatent;		/* Number of FAT entries, = number of clusters + 2 */ | ||||
| 	DWORD	fsize;			/* Sectors per FAT */ | ||||
| 	DWORD	volbase;		/* Volume start sector */ | ||||
| 	DWORD	fatbase;		/* FAT start sector */ | ||||
| 	DWORD	dirbase;		/* Root directory start sector (FAT32:Cluster#) */ | ||||
| 	DWORD	database;		/* Data start sector */ | ||||
| 	DWORD	winsect;		/* Current sector appearing in the win[] */ | ||||
| 	BYTE	win[_MAX_SS];	/* Disk access window for Directory, FAT (and file data at tiny cfg) */ | ||||
| } FATFS; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* File object structure (FIL) */ | ||||
| 
 | ||||
| typedef struct { | ||||
| 	FATFS*	fs;				/* Pointer to the related file system object (**do not change order**) */ | ||||
| 	WORD	id;				/* Owner file system mount ID (**do not change order**) */ | ||||
| 	BYTE	flag;			/* Status flags */ | ||||
| 	BYTE	err;			/* Abort flag (error code) */ | ||||
| 	DWORD	fptr;			/* File read/write pointer (Zeroed on file open) */ | ||||
| 	DWORD	fsize;			/* File size */ | ||||
| 	DWORD	sclust;			/* File start cluster (0:no cluster chain, always 0 when fsize is 0) */ | ||||
| 	DWORD	clust;			/* Current cluster of fpter (not valid when fprt is 0) */ | ||||
| 	DWORD	dsect;			/* Sector number appearing in buf[] (0:invalid) */ | ||||
| #if !_FS_READONLY | ||||
| 	DWORD	dir_sect;		/* Sector number containing the directory entry */ | ||||
| 	BYTE*	dir_ptr;		/* Pointer to the directory entry in the win[] */ | ||||
| #endif | ||||
| #if _USE_FASTSEEK | ||||
| 	DWORD*	cltbl;			/* Pointer to the cluster link map table (Nulled on file open) */ | ||||
| #endif | ||||
| #if _FS_LOCK | ||||
| 	UINT	lockid;			/* File lock ID origin from 1 (index of file semaphore table Files[]) */ | ||||
| #endif | ||||
| #if !_FS_TINY | ||||
| 	BYTE	buf[_MAX_SS];	/* File private data read/write window */ | ||||
| #endif | ||||
| } FIL; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* Directory object structure (DIR) */ | ||||
| 
 | ||||
| typedef struct { | ||||
| 	FATFS*	fs;				/* Pointer to the owner file system object (**do not change order**) */ | ||||
| 	WORD	id;				/* Owner file system mount ID (**do not change order**) */ | ||||
| 	WORD	index;			/* Current read/write index number */ | ||||
| 	DWORD	sclust;			/* Table start cluster (0:Root dir) */ | ||||
| 	DWORD	clust;			/* Current cluster */ | ||||
| 	DWORD	sect;			/* Current sector */ | ||||
| 	BYTE*	dir;			/* Pointer to the current SFN entry in the win[] */ | ||||
| 	BYTE*	fn;				/* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */ | ||||
| #if _FS_LOCK | ||||
| 	UINT	lockid;			/* File lock ID (index of file semaphore table Files[]) */ | ||||
| #endif | ||||
| #if _USE_LFN | ||||
| 	WCHAR*	lfn;			/* Pointer to the LFN working buffer */ | ||||
| 	WORD	lfn_idx;		/* Last matched LFN index number (0xFFFF:No LFN) */ | ||||
| #endif | ||||
| #if _USE_FIND | ||||
| 	const TCHAR*	pat;	/* Pointer to the name matching pattern */ | ||||
| #endif | ||||
| } DIR; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* File information structure (FILINFO) */ | ||||
| 
 | ||||
| typedef struct { | ||||
| 	DWORD	fsize;			/* File size */ | ||||
| 	WORD	fdate;			/* Last modified date */ | ||||
| 	WORD	ftime;			/* Last modified time */ | ||||
| 	BYTE	fattrib;		/* Attribute */ | ||||
| 	TCHAR	fname[13];		/* Short file name (8.3 format) */ | ||||
| #if _USE_LFN | ||||
| 	TCHAR*	lfname;			/* Pointer to the LFN buffer */ | ||||
| 	UINT 	lfsize;			/* Size of LFN buffer in TCHAR */ | ||||
| #endif | ||||
| } FILINFO; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* File function return code (FRESULT) */ | ||||
| 
 | ||||
| typedef enum { | ||||
| 	FR_OK = 0,				/* (0) Succeeded */ | ||||
| 	FR_DISK_ERR,			/* (1) A hard error occurred in the low level disk I/O layer */ | ||||
| 	FR_INT_ERR,				/* (2) Assertion failed */ | ||||
| 	FR_NOT_READY,			/* (3) The physical drive cannot work */ | ||||
| 	FR_NO_FILE,				/* (4) Could not find the file */ | ||||
| 	FR_NO_PATH,				/* (5) Could not find the path */ | ||||
| 	FR_INVALID_NAME,		/* (6) The path name format is invalid */ | ||||
| 	FR_DENIED,				/* (7) Access denied due to prohibited access or directory full */ | ||||
| 	FR_EXIST,				/* (8) Access denied due to prohibited access */ | ||||
| 	FR_INVALID_OBJECT,		/* (9) The file/directory object is invalid */ | ||||
| 	FR_WRITE_PROTECTED,		/* (10) The physical drive is write protected */ | ||||
| 	FR_INVALID_DRIVE,		/* (11) The logical drive number is invalid */ | ||||
| 	FR_NOT_ENABLED,			/* (12) The volume has no work area */ | ||||
| 	FR_NO_FILESYSTEM,		/* (13) There is no valid FAT volume */ | ||||
| 	FR_MKFS_ABORTED,		/* (14) The f_mkfs() aborted due to any parameter error */ | ||||
| 	FR_TIMEOUT,				/* (15) Could not get a grant to access the volume within defined period */ | ||||
| 	FR_LOCKED,				/* (16) The operation is rejected according to the file sharing policy */ | ||||
| 	FR_NOT_ENOUGH_CORE,		/* (17) LFN working buffer could not be allocated */ | ||||
| 	FR_TOO_MANY_OPEN_FILES,	/* (18) Number of open files > _FS_SHARE */ | ||||
| 	FR_INVALID_PARAMETER	/* (19) Given parameter is invalid */ | ||||
| } FRESULT; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*--------------------------------------------------------------*/ | ||||
| /* FatFs module application interface                           */ | ||||
| 
 | ||||
| FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode);				/* Open or create a file */ | ||||
| FRESULT f_close (FIL* fp);											/* Close an open file object */ | ||||
| FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br);			/* Read data from a file */ | ||||
| FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw);	/* Write data to a file */ | ||||
| FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf);	/* Forward data to the stream */ | ||||
| FRESULT f_lseek (FIL* fp, DWORD ofs);								/* Move file pointer of a file object */ | ||||
| FRESULT f_truncate (FIL* fp);										/* Truncate file */ | ||||
| FRESULT f_sync (FIL* fp);											/* Flush cached data of a writing file */ | ||||
| FRESULT f_opendir (DIR* dp, const TCHAR* path);						/* Open a directory */ | ||||
| FRESULT f_closedir (DIR* dp);										/* Close an open directory */ | ||||
| FRESULT f_readdir (DIR* dp, FILINFO* fno);							/* Read a directory item */ | ||||
| FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern);	/* Find first file */ | ||||
| FRESULT f_findnext (DIR* dp, FILINFO* fno);							/* Find next file */ | ||||
| FRESULT f_mkdir (const TCHAR* path);								/* Create a sub directory */ | ||||
| FRESULT f_unlink (const TCHAR* path);								/* Delete an existing file or directory */ | ||||
| FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new);	/* Rename/Move a file or directory */ | ||||
| FRESULT f_stat (const TCHAR* path, FILINFO* fno);					/* Get file status */ | ||||
| FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask);			/* Change attribute of the file/dir */ | ||||
| FRESULT f_utime (const TCHAR* path, const FILINFO* fno);			/* Change times-tamp of the file/dir */ | ||||
| FRESULT f_chdir (const TCHAR* path);								/* Change current directory */ | ||||
| FRESULT f_chdrive (const TCHAR* path);								/* Change current drive */ | ||||
| FRESULT f_getcwd (TCHAR* buff, UINT len);							/* Get current directory */ | ||||
| FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs);	/* Get number of free clusters on the drive */ | ||||
| FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn);	/* Get volume label */ | ||||
| FRESULT f_setlabel (const TCHAR* label);							/* Set volume label */ | ||||
| FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt);			/* Mount/Unmount a logical drive */ | ||||
| FRESULT f_mkfs (const TCHAR* path, BYTE sfd, UINT au);				/* Create a file system on the volume */ | ||||
| FRESULT f_fdisk (BYTE pdrv, const DWORD szt[], void* work);			/* Divide a physical drive into some partitions */ | ||||
| int f_putc (TCHAR c, FIL* fp);										/* Put a character to the file */ | ||||
| int f_puts (const TCHAR* str, FIL* cp);								/* Put a string to the file */ | ||||
| int f_printf (FIL* fp, const TCHAR* str, ...);						/* Put a formatted string to the file */ | ||||
| TCHAR* f_gets (TCHAR* buff, int len, FIL* fp);						/* Get a string from the file */ | ||||
| 
 | ||||
| #define f_eof(fp) ((int)((fp)->fptr == (fp)->fsize)) | ||||
| #define f_error(fp) ((fp)->err) | ||||
| #define f_tell(fp) ((fp)->fptr) | ||||
| #define f_size(fp) ((fp)->fsize) | ||||
| #define f_rewind(fp) f_lseek((fp), 0) | ||||
| #define f_rewinddir(dp) f_readdir((dp), 0) | ||||
| 
 | ||||
| #ifndef EOF | ||||
| #define EOF (-1) | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*--------------------------------------------------------------*/ | ||||
| /* Additional user defined functions                            */ | ||||
| 
 | ||||
| /* RTC function */ | ||||
| #if !_FS_READONLY && !_FS_NORTC | ||||
| DWORD get_fattime (void); | ||||
| #endif | ||||
| 
 | ||||
| /* Unicode support functions */ | ||||
| #if _USE_LFN							/* Unicode - OEM code conversion */ | ||||
| WCHAR ff_convert (WCHAR chr, UINT dir);	/* OEM-Unicode bidirectional conversion */ | ||||
| WCHAR ff_wtoupper (WCHAR chr);			/* Unicode upper-case conversion */ | ||||
| #if _USE_LFN == 3						/* Memory functions */ | ||||
| void* ff_memalloc (UINT msize);			/* Allocate memory block */ | ||||
| void ff_memfree (void* mblock);			/* Free memory block */ | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| /* Sync functions */ | ||||
| #if _FS_REENTRANT | ||||
| int ff_cre_syncobj (BYTE vol, _SYNC_t* sobj);	/* Create a sync object */ | ||||
| int ff_req_grant (_SYNC_t sobj);				/* Lock sync object */ | ||||
| void ff_rel_grant (_SYNC_t sobj);				/* Unlock sync object */ | ||||
| int ff_del_syncobj (_SYNC_t sobj);				/* Delete a sync object */ | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*--------------------------------------------------------------*/ | ||||
| /* Flags and offset address                                     */ | ||||
| 
 | ||||
| 
 | ||||
| /* File access control and file status flags (FIL.flag) */ | ||||
| 
 | ||||
| #define	FA_READ				0x01 | ||||
| #define	FA_OPEN_EXISTING	0x00 | ||||
| 
 | ||||
| #if !_FS_READONLY | ||||
| #define	FA_WRITE			0x02 | ||||
| #define	FA_CREATE_NEW		0x04 | ||||
| #define	FA_CREATE_ALWAYS	0x08 | ||||
| #define	FA_OPEN_ALWAYS		0x10 | ||||
| #define FA__WRITTEN			0x20 | ||||
| #define FA__DIRTY			0x40 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /* FAT sub type (FATFS.fs_type) */ | ||||
| 
 | ||||
| #define FS_FAT12	1 | ||||
| #define FS_FAT16	2 | ||||
| #define FS_FAT32	3 | ||||
| 
 | ||||
| 
 | ||||
| /* File attribute bits for directory entry */ | ||||
| 
 | ||||
| #define	AM_RDO	0x01	/* Read only */ | ||||
| #define	AM_HID	0x02	/* Hidden */ | ||||
| #define	AM_SYS	0x04	/* System */ | ||||
| #define	AM_VOL	0x08	/* Volume label */ | ||||
| #define AM_LFN	0x0F	/* LFN entry */ | ||||
| #define AM_DIR	0x10	/* Directory */ | ||||
| #define AM_ARC	0x20	/* Archive */ | ||||
| #define AM_MASK	0x3F	/* Mask of defined bits */ | ||||
| 
 | ||||
| 
 | ||||
| /* Fast seek feature */ | ||||
| #define CREATE_LINKMAP	0xFFFFFFFF | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*--------------------------------*/ | ||||
| /* Multi-byte word access macros  */ | ||||
| 
 | ||||
| #if _WORD_ACCESS == 1	/* Enable word access to the FAT structure */ | ||||
| #define	LD_WORD(ptr)		(WORD)(*(WORD*)(BYTE*)(ptr)) | ||||
| #define	LD_DWORD(ptr)		(DWORD)(*(DWORD*)(BYTE*)(ptr)) | ||||
| #define	ST_WORD(ptr,val)	*(WORD*)(BYTE*)(ptr)=(WORD)(val) | ||||
| #define	ST_DWORD(ptr,val)	*(DWORD*)(BYTE*)(ptr)=(DWORD)(val) | ||||
| #else					/* Use byte-by-byte access to the FAT structure */ | ||||
| #define	LD_WORD(ptr)		(WORD)(((WORD)*((BYTE*)(ptr)+1)<<8)|(WORD)*(BYTE*)(ptr)) | ||||
| #define	LD_DWORD(ptr)		(DWORD)(((DWORD)*((BYTE*)(ptr)+3)<<24)|((DWORD)*((BYTE*)(ptr)+2)<<16)|((WORD)*((BYTE*)(ptr)+1)<<8)|*(BYTE*)(ptr)) | ||||
| #define	ST_WORD(ptr,val)	*(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8) | ||||
| #define	ST_DWORD(ptr,val)	*(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8); *((BYTE*)(ptr)+2)=(BYTE)((DWORD)(val)>>16); *((BYTE*)(ptr)+3)=(BYTE)((DWORD)(val)>>24) | ||||
| #endif | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* _FATFS */ | ||||
| @ -0,0 +1,266 @@ | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| /  FatFs - FAT file system module configuration file  R0.11 (C)ChaN, 2015 | ||||
| /---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _FFCONF 32020	/* Revision ID */ | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| / Functions and Buffer Configurations | ||||
| /---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define	_FS_TINY		1 | ||||
| /* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
 | ||||
| /  At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS | ||||
| /  bytes. Instead of private sector buffer eliminated from the file object, | ||||
| /  common sector buffer in the file system object (FATFS) is used for the file | ||||
| /  data transfer. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _FS_READONLY	1 | ||||
| /* This option switches read-only configuration. (0:Read/Write or 1:Read-only)
 | ||||
| /  Read-only configuration removes writing API functions, f_write(), f_sync(), | ||||
| /  f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() | ||||
| /  and optional writing functions as well. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _FS_MINIMIZE	0 | ||||
| /* This option defines minimization level to remove some basic API functions.
 | ||||
| / | ||||
| /   0: All basic functions are enabled. | ||||
| /   1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_chmod(), f_utime(), | ||||
| /      f_truncate() and f_rename() function are removed. | ||||
| /   2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. | ||||
| /   3: f_lseek() function is removed in addition to 2. */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_STRFUNC	0 | ||||
| /* This option switches string functions, f_gets(), f_putc(), f_puts() and
 | ||||
| /  f_printf(). | ||||
| / | ||||
| /  0: Disable string functions. | ||||
| /  1: Enable without LF-CRLF conversion. | ||||
| /  2: Enable with LF-CRLF conversion. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _USE_FIND		0 | ||||
| /* This option switches filtered directory read feature and related functions,
 | ||||
| /  f_findfirst() and f_findnext(). (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_MKFS		0 | ||||
| /* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_FASTSEEK	0 | ||||
| /* This option switches fast seek feature. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| 
 | ||||
| #define _USE_LABEL		1 | ||||
| /* This option switches volume label functions, f_getlabel() and f_setlabel().
 | ||||
| /  (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_FORWARD	0 | ||||
| /* This option switches f_forward() function. (0:Disable or 1:Enable)
 | ||||
| /  To enable it, also _FS_TINY need to be set to 1. */ | ||||
| 
 | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| / Locale and Namespace Configurations | ||||
| /---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _CODE_PAGE	437 | ||||
| /* This option specifies the OEM code page to be used on the target system.
 | ||||
| /  Incorrect setting of the code page can cause a file open failure. | ||||
| / | ||||
| /   1    - ASCII (No extended character. Non-LFN cfg. only) | ||||
| /   437  - U.S. | ||||
| /   720  - Arabic | ||||
| /   737  - Greek | ||||
| /   775  - Baltic | ||||
| /   850  - Multilingual Latin 1 | ||||
| /   852  - Latin 2 | ||||
| /   855  - Cyrillic | ||||
| /   857  - Turkish | ||||
| /   858  - Multilingual Latin 1 + Euro | ||||
| /   862  - Hebrew | ||||
| /   866  - Russian | ||||
| /   874  - Thai | ||||
| /   932  - Japanese Shift_JIS (DBCS) | ||||
| /   936  - Simplified Chinese GBK (DBCS) | ||||
| /   949  - Korean (DBCS) | ||||
| /   950  - Traditional Chinese Big5 (DBCS) | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_LFN	0 | ||||
| #define	_MAX_LFN	128 | ||||
| /* The _USE_LFN option switches the LFN feature.
 | ||||
| / | ||||
| /   0: Disable LFN feature. _MAX_LFN has no effect. | ||||
| /   1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. | ||||
| /   2: Enable LFN with dynamic working buffer on the STACK. | ||||
| /   3: Enable LFN with dynamic working buffer on the HEAP. | ||||
| / | ||||
| /  When enable the LFN feature, Unicode handling functions (option/unicode.c) must | ||||
| /  be added to the project. The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. | ||||
| /  When use stack for the working buffer, take care on stack overflow. When use heap | ||||
| /  memory for the working buffer, memory management functions, ff_memalloc() and | ||||
| /  ff_memfree(), must be added to the project. */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_LFN_UNICODE	0 | ||||
| /* This option switches character encoding on the API. (0:ANSI/OEM or 1:Unicode)
 | ||||
| /  To use Unicode string for the path name, enable LFN feature and set _LFN_UNICODE | ||||
| /  to 1. This option also affects behavior of string I/O functions. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _STRF_ENCODE	3 | ||||
| /* When _LFN_UNICODE is 1, this option selects the character encoding on the file to
 | ||||
| /  be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). | ||||
| / | ||||
| /  0: ANSI/OEM | ||||
| /  1: UTF-16LE | ||||
| /  2: UTF-16BE | ||||
| /  3: UTF-8 | ||||
| / | ||||
| /  When _LFN_UNICODE is 0, this option has no effect. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _FS_RPATH	2 | ||||
| /* This option configures relative path feature.
 | ||||
| / | ||||
| /   0: Disable relative path feature and remove related functions. | ||||
| /   1: Enable relative path feature. f_chdir() and f_chdrive() are available. | ||||
| /   2: f_getcwd() function is available in addition to 1. | ||||
| / | ||||
| /  Note that directory items read via f_readdir() are affected by this option. */ | ||||
| 
 | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| / Drive/Volume Configurations | ||||
| /---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _VOLUMES	1 | ||||
| /* Number of volumes (logical drives) to be used. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _STR_VOLUME_ID	0 | ||||
| #define _VOLUME_STRS	"CF","SD" | ||||
| /* _STR_VOLUME_ID option switches string volume ID feature.
 | ||||
| /  When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive | ||||
| /  number in the path name. _VOLUME_STRS defines the drive ID strings for each | ||||
| /  logical drives. Number of items must be equal to _VOLUMES. Valid characters for | ||||
| /  the drive ID strings are: A-Z and 0-9. */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_MULTI_PARTITION	0 | ||||
| /* This option switches multi-partition feature. By default (0), each logical drive
 | ||||
| /  number is bound to the same physical drive number and only an FAT volume found on | ||||
| /  the physical drive will be mounted. When multi-partition feature is enabled (1), | ||||
| /  each logical drive number is bound to arbitrary physical drive and partition | ||||
| /  listed in the VolToPart[]. Also f_fdisk() funciton will be available. */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_MIN_SS		512 | ||||
| #define	_MAX_SS		512 | ||||
| /* These options configure the range of sector size to be supported. (512, 1024,
 | ||||
| /  2048 or 4096) Always set both 512 for most systems, all type of memory cards and | ||||
| /  harddisk. But a larger value may be required for on-board flash memory and some | ||||
| /  type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured | ||||
| /  to variable sector size and GET_SECTOR_SIZE command must be implemented to the | ||||
| /  disk_ioctl() function. */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_TRIM	0 | ||||
| /* This option switches ATA-TRIM feature. (0:Disable or 1:Enable)
 | ||||
| /  To enable Trim feature, also CTRL_TRIM command should be implemented to the | ||||
| /  disk_ioctl() function. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _FS_NOFSINFO	0 | ||||
| /* If you need to know correct free space on the FAT32 volume, set bit 0 of this
 | ||||
| /  option, and f_getfree() function at first time after volume mount will force | ||||
| /  a full FAT scan. Bit 1 controls the use of last allocated cluster number. | ||||
| / | ||||
| /  bit0=0: Use free cluster count in the FSINFO if available. | ||||
| /  bit0=1: Do not trust free cluster count in the FSINFO. | ||||
| /  bit1=0: Use last allocated cluster number in the FSINFO if available. | ||||
| /  bit1=1: Do not trust last allocated cluster number in the FSINFO. | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| / System Configurations | ||||
| /---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _FS_NORTC	1 | ||||
| #define _NORTC_MON	2 | ||||
| #define _NORTC_MDAY	1 | ||||
| #define _NORTC_YEAR	2015 | ||||
| /* The _FS_NORTC option switches timestamp feature. If the system does not have
 | ||||
| /  an RTC function or valid timestamp is not needed, set _FS_NORTC to 1 to disable | ||||
| /  the timestamp feature. All objects modified by FatFs will have a fixed timestamp | ||||
| /  defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR. | ||||
| /  When timestamp feature is enabled (_FS_NORTC	== 0), get_fattime() function need | ||||
| /  to be added to the project to read current time form RTC. _NORTC_MON, | ||||
| /  _NORTC_MDAY and _NORTC_YEAR have no effect.  | ||||
| /  These options have no effect at read-only configuration (_FS_READONLY == 1). */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_FS_LOCK	0 | ||||
| /* The _FS_LOCK option switches file lock feature to control duplicated file open
 | ||||
| /  and illegal operation to open objects. This option must be 0 when _FS_READONLY | ||||
| /  is 1. | ||||
| / | ||||
| /  0:  Disable file lock feature. To avoid volume corruption, application program | ||||
| /      should avoid illegal open, remove and rename to the open objects. | ||||
| /  >0: Enable file lock feature. The value defines how many files/sub-directories | ||||
| /      can be opened simultaneously under file lock control. Note that the file | ||||
| /      lock feature is independent of re-entrancy. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _FS_REENTRANT	0 | ||||
| #define _FS_TIMEOUT		1000 | ||||
| #define	_SYNC_t			HANDLE | ||||
| /* The _FS_REENTRANT option switches the re-entrancy (thread safe) of the FatFs
 | ||||
| /  module itself. Note that regardless of this option, file access to different | ||||
| /  volume is always re-entrant and volume control functions, f_mount(), f_mkfs() | ||||
| /  and f_fdisk() function, are always not re-entrant. Only file/directory access | ||||
| /  to the same volume is under control of this feature. | ||||
| / | ||||
| /   0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. | ||||
| /   1: Enable re-entrancy. Also user provided synchronization handlers, | ||||
| /      ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() | ||||
| /      function, must be added to the project. Samples are available in | ||||
| /      option/syscall.c. | ||||
| / | ||||
| /  The _FS_TIMEOUT defines timeout period in unit of time tick. | ||||
| /  The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, | ||||
| /  SemaphoreHandle_t and etc.. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _WORD_ACCESS	1 | ||||
| /* The _WORD_ACCESS option is an only platform dependent option. It defines
 | ||||
| /  which access method is used to the word data on the FAT volume. | ||||
| / | ||||
| /   0: Byte-by-byte access. Always compatible with all platforms. | ||||
| /   1: Word access. Do not choose this unless under both the following conditions. | ||||
| / | ||||
| /  * Address misaligned memory access is always allowed to ALL instructions. | ||||
| /  * Byte order on the memory is little-endian. | ||||
| / | ||||
| /  If it is the case, _WORD_ACCESS can also be set to 1 to reduce code size. | ||||
| /  Following table shows allowable settings of some processor types. | ||||
| / | ||||
| /   ARM7TDMI    0           ColdFire    0           V850E       0 | ||||
| /   Cortex-M3   0           Z80         0/1         V850ES      0/1 | ||||
| /   Cortex-M0   0           x86         0/1         TLCS-870    0/1 | ||||
| /   AVR         0/1         RX600(LE)   0/1         TLCS-900    0/1 | ||||
| /   AVR32       0           RL78        0           R32C        0 | ||||
| /   PIC18       0/1         SH-2        0           M16C        0/1 | ||||
| /   PIC24       0           H8S         0           MSP430      0 | ||||
| /   PIC32       0           H8/300H     0           8051        0/1 | ||||
| */ | ||||
| 
 | ||||
| @ -0,0 +1,33 @@ | ||||
| /*-------------------------------------------*/ | ||||
| /* Integer type definitions for FatFs module */ | ||||
| /*-------------------------------------------*/ | ||||
| 
 | ||||
| #ifndef _FF_INTEGER | ||||
| #define _FF_INTEGER | ||||
| 
 | ||||
| #ifdef _WIN32	/* FatFs development platform */ | ||||
| 
 | ||||
| #include <windows.h> | ||||
| #include <tchar.h> | ||||
| 
 | ||||
| #else			/* Embedded platform */ | ||||
| 
 | ||||
| /* This type MUST be 8 bit */ | ||||
| typedef unsigned char	BYTE; | ||||
| 
 | ||||
| /* These types MUST be 16 bit */ | ||||
| typedef short			SHORT; | ||||
| typedef unsigned short	WORD; | ||||
| typedef unsigned short	WCHAR; | ||||
| 
 | ||||
| /* These types MUST be 16 bit or 32 bit */ | ||||
| typedef int				INT; | ||||
| typedef unsigned int	UINT; | ||||
| 
 | ||||
| /* These types MUST be 32 bit */ | ||||
| typedef long			LONG; | ||||
| typedef unsigned long	DWORD; | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
| @ -0,0 +1,57 @@ | ||||
| /*
 | ||||
|  * globals.h | ||||
|  * | ||||
|  *  Created on: 29 íîÿá. 2018 ã. | ||||
|  *      Author: maxx | ||||
|  */ | ||||
| 
 | ||||
| #ifndef GLOBALS_H_ | ||||
| #define GLOBALS_H_ | ||||
| 
 | ||||
| #include <avr/io.h> | ||||
| #include <util/delay.h> | ||||
| #include <avr/pgmspace.h> | ||||
| #include "avr/wdt.h" // WatchDog | ||||
| 
 | ||||
| //******************************* Fat FS declare related: BEGIN
 | ||||
| #include "string.h" | ||||
| #include "ff.h" | ||||
| #include "diskio.h" | ||||
| #include "integer.h" | ||||
| #include "Internet/httpServer_avr/httpParser.h" | ||||
| //******************************* Fat FS declare related: END
 | ||||
| 
 | ||||
| 
 | ||||
| #define HTTPD_MAX_BUF_SIZE	2048 //For Mega1284p(16kb RAM)/Mega2560(8kb RAM)
 | ||||
| //#define HTTPD_MAX_BUF_SIZE	MAX_URI_SIZE+10 //For Mega644p(4kb RAM)/Mega128(4kb RAM) (ie. 512+10=522 bytes look at httpParser.h <_st_http_request> definition)
 | ||||
| 
 | ||||
| #define PRINTF_EN 1 | ||||
| #if PRINTF_EN | ||||
| #define PRINTF(FORMAT,args...) printf_P(PSTR(FORMAT),##args) | ||||
| #else | ||||
| #define PRINTF(...) | ||||
| #endif | ||||
| 
 | ||||
| extern unsigned long millis(void); | ||||
| extern int freeRam (void); | ||||
| 
 | ||||
| //M644P/M1284p Users LEDS:
 | ||||
| //LED1/PORTC.4- m644p/m1284p maxxir
 | ||||
| #define led1_conf()      DDRC |= (1<<DDC4) | ||||
| #define led1_high()      PORTC |= (1<<PORTC4) | ||||
| #define led1_low()       PORTC &= ~(1<<PORTC4) | ||||
| #define led1_tgl()     PORTC ^= (1<<PORTC4) | ||||
| #define led1_read()     (PORTC & (1<<PORTC4)) | ||||
| 
 | ||||
| #define sw1_conf()      {DDRC &= ~(1<<DDC5); PORTC |= (1<<PORTC5);} | ||||
| #define sw1_read()     (PINC & (1<<PINC5)) | ||||
| 
 | ||||
| extern const char PROGMEM str_mcu[]; | ||||
| extern const char compile_date[] PROGMEM; | ||||
| extern const char compile_time[] PROGMEM; | ||||
| extern const char str_prog_name[] PROGMEM; | ||||
| 
 | ||||
| static FATFS Fatfs;		/* File system object for each logical drive. >= 2 */ | ||||
| //static FIL File;			/* File object. there are _FS_LOCK file objects available, >= 2. */
 | ||||
| 
 | ||||
| #endif /* GLOBALS_H_ */ | ||||
| @ -0,0 +1,815 @@ | ||||
| const char m1284p_png[] PROGMEM = { | ||||
| 0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52, | ||||
| 0x0,0x0,0x4,0xf8,0x0,0x0,0x3,0x3b,0x1,0x3,0x0,0x0,0x0,0xed,0x52,0xbc, | ||||
| 0x4d,0x0,0x0,0x0,0x6,0x50,0x4c,0x54,0x45,0x0,0x0,0x0,0xff,0xff,0xff,0xa5, | ||||
| 0xd9,0x9f,0xdd,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0x12,0x74,0x0, | ||||
| 0x0,0x12,0x74,0x1,0xde,0x66,0x1f,0x78,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54, | ||||
| 0x78,0xda,0xed,0xdd,0x5f,0x8c,0x23,0xc7,0x9d,0x1f,0xf0,0x59,0x4f,0x20,0x26,0xb0, | ||||
| 0xb5,0xf4,0x21,0x2f,0x6,0xbc,0xbb,0xf4,0xc5,0x4f,0x79,0x73,0x5e,0x6e,0x25,0x68, | ||||
| 0xb5,0xb4,0x90,0x7,0x3f,0xfa,0xf1,0x2,0x8,0xd2,0x2a,0x2f,0xf9,0x3,0x45,0x4b, | ||||
| 0x19,0x86,0x96,0xbb,0xe2,0x72,0x7a,0xd6,0x3,0x64,0x1e,0x12,0xdc,0xdc,0x21,0x2f, | ||||
| 0x39,0x48,0xde,0x31,0x70,0x7,0xf8,0xe1,0x60,0xad,0x2,0x45,0xa2,0x6c,0x2e,0xa7, | ||||
| 0x39,0x98,0xb3,0x6,0xc1,0x59,0xe2,0x19,0x4e,0x30,0xb6,0x29,0xb2,0x38,0x37,0x97, | ||||
| 0xa3,0x90,0x11,0xbb,0x38,0x1e,0x2f,0xab,0x67,0x8a,0x5d,0x95,0xfe,0x57,0xfd,0xb7, | ||||
| 0xba,0xd9,0xff,0x48,0xb6,0x70,0x43,0xdc,0x59,0xda,0x9d,0xdd,0x99,0x8f,0xaa,0xbb, | ||||
| 0xab,0xbe,0xfd,0xab,0xea,0xea,0x15,0x9a,0xef,0xcf,0xca,0x85,0xef,0xc2,0xe7,0xfe, | ||||
| 0xf4,0x4b,0xc5,0x5c,0xfb,0x7a,0x12,0xca,0xb5,0xaf,0x3b,0xc9,0xb9,0x8f,0x5e,0xf8, | ||||
| 0xd2,0xf9,0x60,0xce,0x7d,0x60,0x91,0xbe,0xc1,0x5a,0x71,0x73,0x73,0x73,0x5a,0xda, | ||||
| 0x23,0xd7,0xae,0x14,0x89,0x2c,0xcc,0xf6,0x21,0x71,0x91,0x3e,0xd8,0x42,0xb5,0x5a, | ||||
| 0x4d,0xa1,0x2d,0x65,0x34,0x42,0xd3,0x8,0x3f,0xbb,0x7,0x85,0x85,0xfa,0xba,0x58, | ||||
| 0xf5,0x61,0xc3,0x77,0x1e,0xc1,0xd7,0xbf,0x56,0x58,0xac,0x8f,0xaa,0x40,0xb9,0xdc, | ||||
| 0x52,0xe0,0x8,0x11,0xba,0xc0,0x63,0x17,0xd9,0xb7,0xaf,0xb6,0x1f,0xc8,0xaf,0x6f, | ||||
| 0x4f,0x6d,0x3f,0xaa,0xf9,0x3e,0x2d,0x12,0x2a,0xe4,0xcf,0x87,0x71,0xed,0xcd,0x12, | ||||
| 0x68,0x3d,0xd,0x5b,0xd3,0x9b,0x84,0xe6,0xd0,0x57,0x33,0x8f,0x6f,0x9d,0x12,0x25, | ||||
| 0x7f,0x3e,0xbd,0x7f,0xc1,0x62,0x4b,0x91,0x14,0x4a,0xf0,0xec,0xbf,0xd2,0x3e,0x3c, | ||||
| 0x1c,0xb4,0x6f,0x81,0x45,0xf9,0xcc,0xfe,0xf9,0xf9,0x3d,0x72,0xe5,0x69,0x4a,0xc6, | ||||
| 0xe5,0x99,0x7f,0x85,0xf4,0xfb,0x10,0x83,0x85,0xf9,0x62,0x7f,0x94,0x7e,0x1f,0x60, | ||||
| 0x28,0xe6,0xd9,0xb7,0x9b,0x67,0x1f,0x3e,0xec,0xf7,0x31,0xa,0xe8,0x87,0xc6,0xfe, | ||||
| 0x13,0x93,0x90,0xc3,0x8,0xa3,0x7a,0x86,0xbe,0x7e,0x9f,0x4,0xfa,0x10,0xe0,0xf8, | ||||
| 0xfa,0xc9,0x13,0x45,0x52,0xdf,0x79,0xc0,0xb1,0x87,0x9c,0x3,0x5f,0x17,0x2b,0x60, | ||||
| 0x81,0x3e,0xd4,0x57,0x8f,0x6f,0x90,0x6f,0xc0,0xf5,0x41,0xba,0x58,0x5f,0xf,0x2b, | ||||
| 0x41,0xed,0x57,0xf5,0x1f,0xf8,0xe6,0x7c,0x7c,0x2d,0x24,0x15,0x8a,0x9c,0x5b,0x5d, | ||||
| 0x74,0x78,0x78,0x18,0xe4,0x1b,0x94,0x17,0xe7,0xbb,0x81,0x3a,0x93,0xb8,0xb7,0x92, | ||||
| 0xa,0x7d,0xd3,0xff,0x9b,0x7,0x73,0xf1,0x91,0x56,0xf5,0x91,0x14,0xdb,0x7,0xb9, | ||||
| 0xbe,0xb9,0x5c,0x1f,0xad,0x6a,0x5,0xc6,0xf6,0x49,0x9c,0x3,0xf,0xe7,0xd3,0xbf, | ||||
| 0xb4,0x1a,0x15,0x80,0x38,0xe7,0xdf,0x8a,0xfd,0xf1,0x7,0xfd,0x31,0xcf,0x37,0x9f, | ||||
| 0xfe,0xb9,0xf5,0x1,0x4,0xbc,0x52,0x4b,0xa8,0x6f,0x81,0xe3,0x5b,0xeb,0xff,0x40, | ||||
| 0xd0,0x9f,0xa3,0x4f,0xbe,0x1e,0xe1,0xb0,0x7,0xf9,0x56,0xd5,0x1b,0xba,0xff,0x5d, | ||||
| 0x10,0x77,0x38,0xbe,0x92,0xfd,0xaf,0xfb,0x69,0x7c,0xe8,0x0,0x95,0x13,0xfb,0xea, | ||||
| 0xa7,0xb4,0x35,0x84,0xe2,0xda,0x3c,0x7d,0x5d,0x29,0x79,0xfb,0xad,0x1d,0xab,0xfd, | ||||
| 0x33,0xdc,0x29,0xf8,0xaf,0xf,0xe8,0xf0,0x7d,0x54,0x4e,0xe3,0x8b,0x12,0xd2,0x2, | ||||
| 0x7d,0x81,0x41,0xbf,0xe3,0xf0,0xfd,0x3c,0x4d,0x8a,0x96,0x15,0x30,0xf,0xdf,0x23, | ||||
| 0xe7,0xf1,0x4d,0x95,0xf2,0xaf,0xc6,0xf6,0xb5,0x3d,0xbe,0x31,0xe7,0x6f,0xc0,0xcc, | ||||
| 0x7c,0x7d,0x31,0xae,0x6f,0xdd,0x38,0x9f,0x8a,0x44,0x30,0x7c,0x3,0x61,0x2b,0xdc, | ||||
| 0x17,0xe9,0xfc,0x1b,0x6,0xe5,0xa0,0xb8,0x3e,0xb2,0x62,0xfc,0xec,0x55,0xe6,0x1b, | ||||
| 0x92,0x62,0x6,0xed,0x77,0x18,0x14,0xb5,0x85,0x38,0xbe,0x35,0xf5,0x6,0xb3,0x6c, | ||||
| 0x70,0xbe,0x41,0x84,0xba,0xe1,0x93,0xb3,0xf0,0xc9,0x1,0xbf,0x5d,0x8e,0xe5,0x6b, | ||||
| 0xb5,0x94,0xcf,0x69,0xc7,0x48,0x56,0x37,0x85,0x55,0xc3,0x77,0xd8,0xe1,0xf8,0x88, | ||||
| 0x1e,0x9e,0xb1,0x54,0x8e,0x78,0xfd,0x4e,0x53,0xf4,0x42,0x2e,0xdf,0x67,0x6a,0x87, | ||||
| 0xab,0x75,0xb9,0xe5,0xcb,0xe6,0x78,0x3e,0xdc,0x34,0x7d,0x53,0xc1,0xea,0x90,0x2d, | ||||
| 0xdf,0x8,0x58,0xfd,0xdf,0x54,0xf0,0xf7,0xde,0x47,0xf6,0xf,0x29,0x66,0xe1,0xeb, | ||||
| 0x2a,0x54,0xf3,0x6d,0x68,0xbe,0xb6,0xf9,0xf3,0xfe,0xbe,0xd4,0x61,0xc7,0xc2,0xf8, | ||||
| 0xe7,0x86,0x2e,0xb8,0xa3,0x47,0xa9,0x2e,0xb4,0xc6,0xf,0xd9,0x6a,0x21,0xfb,0x84, | ||||
| 0xdd,0xcd,0x64,0x98,0xb1,0x7d,0x43,0x45,0x3d,0x91,0x8f,0xe8,0x25,0xcd,0x37,0x36, | ||||
| 0x7d,0x3,0xc1,0xf4,0x8d,0xcd,0x66,0xb9,0xc4,0xf7,0x8d,0xad,0x56,0x9b,0x5a,0x91, | ||||
| 0x61,0x7d,0xd6,0x5,0xd2,0xd6,0x23,0x46,0x39,0xb2,0xf,0xd3,0x5f,0xd2,0xc1,0xca, | ||||
| 0xec,0x8f,0xc3,0xd7,0x5e,0x89,0xf4,0xb9,0x94,0x85,0xaf,0x8b,0x8a,0xff,0x23,0x62, | ||||
| 0xfb,0xbd,0xa3,0x1f,0xc9,0x66,0x82,0xf6,0x1b,0x8,0x89,0x7d,0x2d,0x48,0xef,0xa9, | ||||
| 0x5d,0xa9,0x7e,0xfe,0xb1,0x6f,0xf3,0xf7,0x65,0xee,0xf9,0xe7,0xf3,0x45,0x3e,0xff, | ||||
| 0x9c,0x23,0x9a,0xfe,0xbb,0x24,0xba,0xf,0x10,0x99,0x5d,0xbf,0xff,0x99,0x5d,0xbf, | ||||
| 0x45,0xff,0xf5,0xab,0xfa,0xfa,0x46,0x4,0x3,0xd6,0xf,0x9e,0x71,0xfd,0xda,0x83, | ||||
| 0x90,0x8,0x12,0xfb,0xd6,0x1e,0x4c,0xbf,0xa2,0xf6,0x7f,0xda,0xad,0xe0,0xcd,0x6b, | ||||
| 0x2,0xac,0xe3,0xbd,0x3d,0x3c,0xdc,0x33,0x7d,0xac,0xec,0xb,0x1d,0xbe,0xb5,0xb2, | ||||
| 0xe5,0x73,0x54,0x85,0xad,0x6,0xb2,0x93,0x23,0xb1,0x7b,0x74,0xb1,0x6f,0xfd,0x97, | ||||
| 0x94,0x4c,0x5f,0x31,0xfa,0xf8,0x36,0x55,0x87,0x5b,0x4d,0xf0,0xcc,0x9a,0xd0,0x79, | ||||
| 0xfe,0xb4,0xd5,0x3a,0x1d,0x8e,0xb9,0x3e,0xdf,0x81,0xb,0xf7,0x39,0x5a,0xd7,0xf6, | ||||
| 0x11,0x68,0xfa,0x4,0xed,0xa4,0xbd,0xb4,0xdb,0x7e,0xa5,0x3c,0x7b,0xfc,0xbd,0x59, | ||||
| 0xd2,0x5,0x7f,0x48,0x84,0x47,0x2f,0x1d,0xb7,0x5a,0xc7,0xc3,0x69,0x31,0x3,0x9f, | ||||
| 0x63,0x7c,0x73,0xf8,0xcc,0xe3,0x7b,0x53,0xeb,0xa,0xb0,0xb0,0x3,0x94,0x68,0xf9, | ||||
| 0x45,0x13,0x14,0x88,0x0,0x5f,0xea,0xb6,0x5a,0x5d,0x2b,0x1f,0xa4,0xf2,0x1d,0x72, | ||||
| 0x7d,0xdb,0xfb,0xac,0x49,0xa2,0xfb,0xda,0x86,0x40,0xcd,0x57,0xf0,0x35,0xdd,0xc7, | ||||
| 0x4e,0xed,0x54,0x3e,0x47,0xbe,0x5a,0xbf,0x66,0xf9,0x2a,0xa6,0xf,0xea,0x3e,0x31, | ||||
| 0x92,0xcf,0x14,0xa8,0x3f,0x3,0xbe,0xd6,0x6c,0xb5,0x9a,0x94,0x4d,0xf5,0xa6,0xf2, | ||||
| 0xb9,0x4e,0x21,0xdf,0xf9,0xa7,0xfb,0x2e,0xed,0xb7,0xeb,0xd1,0x7d,0xda,0x3f,0xde, | ||||
| 0xa8,0xb5,0x5a,0x35,0xfb,0xdb,0xce,0xd5,0x37,0x2d,0x8,0x72,0x9c,0xf6,0xd3,0x7d, | ||||
| 0x97,0x5a,0xad,0x4b,0x72,0x29,0xe3,0xf6,0x73,0x1c,0x5f,0xe8,0x38,0xbe,0x40,0x20, | ||||
| 0x71,0x7d,0xf7,0x70,0xab,0x85,0x31,0xec,0x64,0xdc,0x7e,0x3b,0xbe,0xfe,0x4f,0xbb, | ||||
| 0x3e,0x60,0xc4,0xeb,0xc3,0xe1,0xd3,0xfb,0x67,0x8c,0x1e,0x65,0xeb,0x23,0x6b,0x76, | ||||
| 0x5f,0xb8,0xdf,0x2e,0xd3,0x75,0x7d,0xfc,0x50,0x50,0x6c,0x9f,0xf1,0xc1,0xa8,0x92, | ||||
| 0xad,0xef,0x8c,0x38,0x7c,0xeb,0x45,0xba,0x72,0x53,0xf7,0x61,0xb5,0x7f,0xae,0xe7, | ||||
| 0xc1,0x37,0x24,0xce,0xdc,0x55,0x24,0xee,0xdc,0x16,0xdf,0x37,0xc9,0xf8,0xfa,0x0, | ||||
| 0xdc,0xf6,0x8b,0x53,0x3f,0x70,0xfb,0x9e,0x4,0xf8,0x64,0xf4,0xeb,0x72,0xba,0xeb, | ||||
| 0x37,0x76,0x7e,0xe1,0xfa,0x7e,0x5f,0xe0,0xfb,0xd0,0xf7,0xbb,0x20,0x5d,0xff,0x97, | ||||
| 0x8d,0xf,0x6,0xb4,0x1f,0x7c,0xbf,0xb,0x53,0xfa,0x80,0xdd,0xbf,0x24,0xf6,0x5, | ||||
| 0xf6,0xcf,0xf0,0x49,0x32,0xdf,0xe7,0x6a,0xff,0x22,0xdc,0xbd,0x79,0x59,0xfd,0xd7, | ||||
| 0x6d,0xbb,0x7f,0x26,0xc5,0x4d,0x51,0x48,0xe2,0xb,0x1c,0xdf,0xa4,0x3f,0x4a,0xe6, | ||||
| 0xeb,0xa9,0xfd,0xf3,0xcd,0x6a,0x6f,0x62,0xfb,0xf4,0xf1,0x17,0xd5,0x76,0x68,0xa6, | ||||
| 0x3e,0xd8,0x78,0x31,0x91,0xaf,0xa5,0xe6,0xab,0x9b,0x95,0x91,0xe6,0xbb,0xe5,0xf0, | ||||
| 0x4d,0x94,0x56,0x7e,0x7c,0x2f,0x55,0x46,0xc4,0xe1,0xdb,0x56,0x7d,0x84,0x36,0xb3, | ||||
| 0xf5,0xa1,0xea,0x5b,0x89,0xae,0x5f,0x51,0xf7,0x49,0x6a,0x68,0x26,0xc0,0x6e,0x3f, | ||||
| 0x35,0x44,0x37,0xb2,0xf5,0x25,0xed,0xff,0x34,0xdf,0xab,0x15,0xf8,0x91,0x76,0x4d, | ||||
| 0xd8,0x3e,0xfa,0x11,0xfd,0xab,0x6c,0x7d,0x49,0xc7,0xf,0xd3,0x37,0xb1,0xfb,0x17, | ||||
| 0xed,0xfa,0xa5,0x13,0xfa,0xc3,0x7c,0xf8,0xb4,0xfb,0xf3,0x57,0x8d,0xeb,0xc3,0xd1, | ||||
| 0xff,0x65,0x7f,0x7d,0x24,0xf5,0x69,0x85,0x89,0xaa,0xd1,0xbf,0xb8,0xf2,0x55,0x84, | ||||
| 0xfe,0x45,0xae,0x45,0xf4,0x71,0xe6,0xb7,0xa2,0x8f,0x1f,0xea,0xa7,0x6a,0xf4,0xcf, | ||||
| 0x8e,0x7c,0x10,0xa9,0x7f,0x46,0x8d,0x85,0xf8,0x12,0xe7,0x2b,0x33,0x2a,0x43,0x3a, | ||||
| 0xbe,0x59,0x9a,0x6b,0xfb,0x25,0xcc,0x57,0x68,0xdb,0x14,0xa0,0x1e,0xc,0xf5,0xe9, | ||||
| 0x1f,0x85,0xfb,0x65,0xb7,0xef,0x50,0x19,0x87,0xfa,0xe2,0xe5,0x17,0x73,0xb2,0x53, | ||||
| 0xf5,0x8d,0x78,0xbe,0x43,0xdd,0x0,0x49,0x49,0x6f,0xb3,0x93,0x91,0xf7,0xcb,0xac, | ||||
| 0x88,0x21,0xca,0x77,0x4b,0xa6,0xaf,0x7f,0x16,0xba,0x92,0x36,0xb1,0xf,0xf2,0x7c, | ||||
| 0xfd,0xa9,0xfe,0x55,0xc5,0xf8,0x91,0xd2,0x6b,0xde,0x2f,0xb3,0x5,0x45,0x22,0x32, | ||||
| 0x6b,0x68,0x88,0x8a,0x6f,0x84,0xf9,0xd8,0xfd,0x9b,0x18,0xdf,0xc7,0x3b,0xff,0x44, | ||||
| 0x7d,0xe1,0x3,0xc4,0x13,0xe3,0x4f,0xfd,0xc4,0xfb,0xe5,0xa,0x6b,0x3f,0x68,0xd6, | ||||
| 0x20,0x55,0x9f,0x12,0xb2,0x5a,0xd4,0xba,0x3f,0x57,0x1b,0x50,0x51,0x3e,0xbc,0x59, | ||||
| 0x9c,0xe5,0x1b,0xaf,0x86,0xb6,0x9f,0x38,0x31,0x7c,0x46,0xc5,0x8,0x7e,0xec,0xfd, | ||||
| 0x32,0xb4,0x7c,0x34,0x92,0x8f,0xb2,0xfb,0x73,0xf5,0x4f,0x4f,0xcf,0x1a,0x3d,0x14, | ||||
| 0xb9,0x7f,0x9e,0xe1,0xd3,0xbf,0x11,0xf2,0x9e,0x7f,0xe2,0x67,0xb6,0x4f,0xb0,0x7c, | ||||
| 0xbc,0xd5,0xac,0xc8,0xed,0x2b,0x1b,0xbe,0x2e,0x9e,0xe5,0x3b,0xa5,0xa1,0xd7,0x87, | ||||
| 0x28,0x19,0x3e,0xf3,0xfb,0x7b,0xaf,0x5f,0x71,0x28,0x78,0x7d,0x50,0x54,0x94,0xa0, | ||||
| 0xcb,0xc2,0x31,0xbe,0xa9,0x3e,0xe5,0x8d,0x6,0x9e,0xe9,0x33,0xab,0x9c,0x41,0xfd, | ||||
| 0x8b,0xd8,0xf,0xf7,0x41,0x8e,0xaf,0xce,0xfb,0xa1,0x9b,0x3c,0xdf,0x87,0xb3,0x7d, | ||||
| 0x66,0xa9,0x2f,0xa8,0x7f,0x16,0xbf,0x2d,0x18,0xd7,0x47,0x80,0xaf,0x62,0xf9,0xfa, | ||||
| 0xe6,0x71,0xdc,0xe8,0x2b,0x9c,0x93,0xca,0x2a,0x46,0x8b,0xe,0xdf,0x4f,0xc4,0xaf, | ||||
| 0xcf,0xf6,0x19,0x7,0x18,0x6e,0xf3,0xc7,0xb7,0xbe,0xd1,0xff,0x29,0x12,0xe4,0xfa, | ||||
| 0xfa,0x56,0xfb,0x21,0x73,0xa8,0x47,0xf0,0x50,0x19,0xf8,0xaf,0xf,0x6b,0xa9,0x8e, | ||||
| 0xe0,0xf2,0x75,0x23,0xb7,0x5f,0x80,0xcf,0xea,0x9f,0x8b,0x5c,0xdf,0xe1,0xd8,0xea, | ||||
| 0x9f,0xd7,0x98,0x8f,0xfb,0x3,0xd9,0x9f,0xb3,0xf2,0xa9,0xee,0x8b,0x70,0x7d,0x98, | ||||
| 0xff,0x61,0x41,0xbe,0x4,0xe3,0x1b,0xf7,0xb3,0xc7,0xab,0x5f,0xf5,0x22,0xf4,0x2f, | ||||
| 0xc6,0x1f,0x18,0xf0,0x63,0x44,0x7c,0xdf,0x20,0x60,0x71,0x51,0x91,0x57,0xbf,0xea, | ||||
| 0x45,0xe8,0x9f,0x8d,0xf6,0x6b,0x67,0xe5,0x6b,0xaf,0xac,0x66,0x9b,0xaf,0x8c,0xf3, | ||||
| 0xaf,0xb3,0x4f,0xb3,0xf1,0x75,0x58,0x87,0x1a,0xa1,0xfd,0xa2,0xd5,0x37,0xf4,0xef, | ||||
| 0xd7,0xd9,0x98,0xb3,0x6f,0x3f,0x71,0x7d,0x68,0xcb,0xf4,0xc9,0xcf,0xe1,0xfd,0x4b, | ||||
| 0x68,0xf7,0x50,0x99,0x8b,0xef,0x30,0xa9,0xcf,0x18,0x3f,0x3a,0xdf,0xa4,0xe8,0x37, | ||||
| 0xa7,0x4d,0x38,0x4,0x7d,0xc7,0x12,0xe2,0x81,0x7a,0xae,0x68,0xdf,0x4c,0x3d,0x4b, | ||||
| 0x78,0x3e,0xf3,0xcb,0xda,0x49,0xbc,0xc2,0x4e,0xbb,0xa0,0xf3,0x4f,0x4e,0xea,0x33, | ||||
| 0xff,0x73,0xff,0xa5,0xe6,0x13,0xe0,0x81,0x28,0xbe,0x39,0x17,0x9f,0xbd,0x98,0x23, | ||||
| 0x51,0xfd,0x8f,0xfc,0x47,0x8a,0xce,0x8f,0x5,0x88,0x36,0xc4,0x74,0xed,0x17,0x9c, | ||||
| 0x4b,0x13,0xfa,0x8c,0xfe,0x85,0xfc,0x27,0x2a,0x9f,0x1f,0x7f,0x7,0xa2,0x96,0x88, | ||||
| 0xc2,0xc2,0x79,0xf2,0xe7,0x6c,0x36,0x53,0xe5,0xfb,0xe9,0xe7,0x94,0x7e,0xfd,0xc5, | ||||
| 0xe7,0x20,0x52,0xe6,0xe5,0x1b,0xa6,0xf3,0x49,0x2,0xed,0xbe,0x58,0xd3,0x7c,0x83, | ||||
| 0xf2,0x5c,0x7c,0xe9,0xee,0x8f,0xce,0x24,0x1,0xe9,0xbe,0x96,0x58,0x11,0xd3,0x5d, | ||||
| 0x1f,0x97,0xe6,0xe1,0x3b,0x81,0x65,0xd4,0x6d,0xaa,0xbe,0x66,0xdf,0xf1,0x24,0x47, | ||||
| 0x7e,0x7c,0xa7,0xb0,0x2c,0x3f,0xd7,0xdc,0x84,0x68,0xef,0x30,0x67,0x3e,0xe3,0xfe, | ||||
| 0xed,0x8,0x66,0x96,0xf,0x32,0xf6,0xd1,0x6c,0xf3,0xd5,0x6c,0x5f,0xcc,0xf5,0x43, | ||||
| 0xec,0x2f,0xcd,0xd5,0x7,0x3e,0xb5,0xd7,0xbb,0x24,0xf2,0xc1,0xd9,0xf5,0xb5,0x54, | ||||
| 0xbe,0xae,0xbd,0x62,0x3e,0x91,0x8f,0x66,0xe5,0xa3,0xa7,0x87,0x87,0xb4,0xed,0xed, | ||||
| 0xe2,0x61,0x63,0x84,0x63,0x75,0x92,0x91,0x7d,0x68,0x4f,0x5b,0x91,0x6,0xa7,0x65, | ||||
| 0xa4,0xaf,0x56,0xf3,0xfa,0xf6,0xf6,0xcc,0x5,0x6b,0xe2,0x98,0x2,0xdd,0x75,0xda, | ||||
| 0xef,0xfb,0x1f,0xa4,0x87,0x8d,0x98,0x1d,0x7b,0x64,0xdf,0xb0,0xa5,0x2f,0x3b,0xc1, | ||||
| 0x60,0xa8,0xdf,0xa9,0x78,0x7d,0xad,0x96,0xd9,0x72,0xea,0x8d,0xfa,0xb6,0xee,0x3a, | ||||
| 0xea,0xf7,0xfb,0x3e,0x1f,0xaa,0xce,0xcb,0x77,0xd0,0x6a,0x19,0xbe,0x83,0xbf,0xac, | ||||
| 0x72,0x7d,0x2d,0xcb,0xf7,0xf2,0x9f,0x69,0xae,0xd3,0x59,0x3e,0x54,0x58,0xa5,0x47, | ||||
| 0xf,0xba,0x30,0xa3,0xe3,0xcb,0x7c,0xe8,0xcf,0x1b,0x1c,0x9f,0xa2,0xd8,0xbe,0xfe, | ||||
| 0xbf,0x63,0xbe,0xb6,0xf7,0xfb,0x9c,0x23,0xfb,0x2f,0x4e,0x70,0x9d,0xf6,0x76,0x7e, | ||||
| 0x93,0x9d,0xef,0x81,0xe1,0x6b,0xbe,0x5b,0xe6,0xfa,0x1e,0x58,0x3e,0xa9,0x1d,0xd4, | ||||
| 0x7e,0xe7,0xc8,0xbe,0x3e,0x34,0x9f,0xb8,0xf3,0xdb,0xcc,0xdb,0xaf,0xc9,0x6b,0x3f, | ||||
| 0x8c,0x1d,0xed,0x27,0x5,0x1e,0x5f,0x5,0xdb,0xfd,0xcb,0x84,0x2e,0xd0,0x87,0x50, | ||||
| 0x34,0xdf,0xd4,0xee,0x9f,0x51,0xa9,0x4e,0xff,0x62,0xa7,0x5b,0x59,0x88,0xf,0x42, | ||||
| 0x8e,0xef,0x53,0x10,0xf6,0xa3,0xd1,0xd1,0x2a,0xfd,0xe1,0x83,0xec,0x7c,0x3f,0xd, | ||||
| 0xf3,0x1,0xf0,0x53,0xaf,0xef,0xf0,0xf0,0xef,0xc2,0x7d,0x58,0xa0,0x2d,0xb1,0xfb, | ||||
| 0x28,0xab,0xfe,0xf9,0xe7,0x9a,0x6f,0xfa,0x3c,0xdf,0xf7,0xe0,0xc1,0xcf,0x4d,0xdf, | ||||
| 0x18,0x19,0xbe,0x99,0xf3,0x33,0x93,0x4c,0x7d,0x59,0xd5,0xaf,0x7c,0xbe,0x4e,0x5e, | ||||
| 0x7d,0xa8,0x20,0xd0,0x3d,0x31,0xab,0xfe,0x39,0x7b,0x5f,0xb6,0xe3,0xdb,0x3f,0x4a, | ||||
| 0xdf,0xca,0x45,0xfb,0x5d,0xf8,0xbe,0x38,0xbe,0x76,0xce,0x7d,0xda,0xe3,0x83,0x39, | ||||
| 0xf6,0x11,0xad,0x4a,0x91,0x57,0xdf,0xda,0x1e,0x7d,0xac,0xad,0x2d,0xc8,0xab,0x4f, | ||||
| 0xbd,0x1,0xbb,0xa1,0x4d,0xd9,0xe5,0xd7,0x47,0x1e,0x6b,0x25,0x1b,0xfe,0xfc,0x8c, | ||||
| 0xf3,0xf9,0x23,0xa3,0x50,0xc5,0xfd,0x32,0x75,0x94,0x97,0x33,0xf6,0x75,0x15,0xfa, | ||||
| 0xa1,0xf6,0x4c,0x13,0x7f,0x7e,0xc6,0xf9,0xfc,0x96,0x51,0xed,0x12,0x78,0x5f,0x76, | ||||
| 0x3e,0xbf,0x95,0xb1,0x6f,0xa8,0xd0,0x9f,0x6a,0x3e,0x7e,0xd5,0xc9,0xf9,0xfc,0x9b, | ||||
| 0x51,0xe7,0x2a,0xf3,0xbe,0xec,0x7c,0xfe,0x2d,0x6b,0x1f,0x56,0x7d,0xe3,0x95,0xec, | ||||
| 0x3e,0x85,0x8c,0x8f,0x2f,0x2a,0xfe,0x54,0x9b,0xa3,0xc9,0xac,0xfd,0x68,0xc6,0xd7, | ||||
| 0x7,0x34,0x8e,0x6f,0x66,0xe7,0x5f,0xd6,0x3e,0x40,0x1f,0x6b,0x73,0x13,0x99,0x5d, | ||||
| 0xbf,0x19,0xfb,0xd6,0x1e,0xd0,0xc7,0x31,0x1e,0xd4,0x5d,0xd4,0x3e,0x6d,0xce,0xf1, | ||||
| 0x6d,0x5a,0xde,0xcc,0xb5,0x8f,0xc4,0xd8,0x58,0x77,0x19,0x3e,0xb6,0xfd,0x41,0x6e, | ||||
| 0x7d,0x6d,0x9a,0x6f,0x1f,0xbd,0xf0,0x5d,0xf8,0x2e,0x7c,0x17,0xbe,0xb,0xdf,0x85, | ||||
| 0xef,0xc2,0x77,0xe1,0xcb,0x81,0x6f,0xaa,0xdf,0xec,0xad,0xe6,0xdd,0x27,0x5f,0xdd, | ||||
| 0xc1,0x74,0x33,0xbf,0x3e,0x3c,0x7a,0x78,0x4a,0x6b,0x79,0xf4,0xe9,0xb7,0x7e,0x47, | ||||
| 0x78,0xf4,0xce,0x71,0x2b,0xdf,0x3e,0xdc,0xcd,0xa9,0x6f,0x5f,0xf7,0x7d,0x80,0xbb, | ||||
| 0xdf,0xcf,0x91,0x4f,0x2e,0x15,0x91,0xe9,0x6b,0xaa,0x3e,0xf9,0xea,0x7,0x78,0xf8, | ||||
| 0x5f,0x32,0xf3,0xd,0x56,0x56,0x84,0x74,0x3e,0x2c,0xa1,0xa1,0xc3,0x87,0x95,0x9f, | ||||
| 0xe1,0x21,0xce,0xcc,0xd7,0x9e,0xb9,0x30,0x69,0xa6,0x6f,0x84,0xf,0x3c,0xbe,0x6e, | ||||
| 0x76,0xbe,0xf4,0x1f,0x3c,0x32,0x9e,0x49,0x56,0x7d,0xef,0xe9,0xbe,0xc7,0xb8,0x5b, | ||||
| 0xcd,0xa7,0xef,0x6f,0xe4,0xb2,0xea,0xdb,0xc1,0xad,0xad,0x1c,0xf9,0xe4,0xab,0xb4, | ||||
| 0x6a,0xfa,0x30,0x2,0x47,0x59,0x8f,0x6f,0xe9,0xdb,0x4f,0x21,0xd6,0xf5,0xb,0x61, | ||||
| 0xd6,0xbe,0x5d,0xf8,0x6e,0xda,0xeb,0x43,0x39,0x5f,0x65,0xfd,0x1f,0x40,0x59,0xfb, | ||||
| 0x76,0x86,0xd,0x90,0x2,0x77,0xa2,0xfa,0x8,0x62,0xed,0x47,0x45,0x9c,0xb5,0x4f, | ||||
| 0x78,0xb5,0x91,0xe6,0x25,0x3e,0x3,0xd5,0x47,0x8b,0xf3,0xf4,0x1d,0xa7,0xf3,0xb9, | ||||
| 0x4b,0xfd,0xe5,0xec,0x7d,0xa3,0xb4,0xed,0xe7,0xcc,0x7,0xd9,0xb7,0xdf,0xdd,0xd7, | ||||
| 0xf2,0xed,0x13,0x6e,0xdb,0x3e,0x61,0x75,0x6d,0x90,0xce,0x97,0xfd,0xf5,0xeb,0xf0, | ||||
| 0x11,0x1,0xd7,0x81,0x90,0xc6,0xb7,0x9f,0x7d,0xff,0xb7,0x3,0xaf,0xb3,0xfe,0x45, | ||||
| 0x11,0x50,0x4d,0xfc,0x9f,0x5b,0x71,0x7d,0x6a,0xbe,0xda,0x60,0xfd,0x73,0xf6,0xe3, | ||||
| 0x87,0xa3,0x7f,0xc6,0x2,0xaa,0x8a,0xef,0x5d,0x8f,0xdd,0xbf,0x48,0xe6,0x3,0x27, | ||||
| 0xaa,0x4f,0x1d,0x7f,0xe7,0x37,0xbe,0x61,0x1,0x56,0xc4,0x46,0x35,0xb6,0x6f,0x84, | ||||
| 0x5,0x47,0xbe,0x9a,0x9f,0xf,0x9,0xf0,0x8f,0x13,0xf9,0x68,0xc1,0x91,0xef,0xe7, | ||||
| 0xe7,0x83,0x2,0x7c,0x2e,0x99,0xaf,0xb6,0x90,0xe3,0x3b,0x28,0x83,0x5a,0x2,0x9f, | ||||
| 0x9a,0xaf,0xf0,0xfc,0xae,0xf,0x57,0x5f,0x3,0xea,0xa0,0x1a,0xbf,0xfd,0x14,0xdb, | ||||
| 0x97,0x7d,0xff,0xe2,0xfc,0xd4,0xc0,0xda,0x0,0x25,0xf0,0xe1,0xda,0xfc,0xf2,0x55, | ||||
| 0xda,0x73,0x42,0xcf,0x57,0xd5,0xf9,0x8d,0x6f,0x19,0xf8,0x68,0x71,0x73,0xde,0xbe, | ||||
| 0x69,0x6e,0xf3,0x95,0xf1,0x31,0x9f,0xc5,0x5f,0x99,0xfd,0x50,0xa8,0xbf,0xfd,0xd8, | ||||
| 0xce,0xb4,0xf3,0x6c,0x3f,0xe3,0x59,0x7c,0x12,0xb8,0x3,0x75,0xe8,0xf1,0x45,0xf3, | ||||
| 0xf7,0x6d,0x9a,0x1,0x86,0xd2,0xb3,0xd8,0x3e,0x84,0x3b,0x73,0xcc,0x57,0x6,0xac, | ||||
| 0x94,0x8d,0x6f,0x63,0x4e,0xfd,0x9f,0xb9,0xaa,0x24,0xb5,0xf,0xcd,0x69,0xfc,0x18, | ||||
| 0xd3,0x8c,0x7c,0x73,0x1a,0x7f,0xd9,0x6a,0x2d,0x41,0x7f,0x2e,0x74,0xc5,0x7a,0x48, | ||||
| 0x34,0xae,0xf,0xce,0x29,0xbf,0xf8,0xda,0xcf,0x88,0xfc,0x8f,0x67,0x6c,0x79,0x64, | ||||
| 0xf8,0xc6,0xab,0x73,0xf7,0xf9,0xce,0x3f,0xc3,0xd7,0x4,0xe5,0x8,0x3e,0x4a,0x6d, | ||||
| 0xdf,0x9c,0x8e,0xaf,0xf9,0x6c,0xac,0xd7,0xd7,0x90,0xc4,0x78,0x3e,0x30,0xaf,0x7c, | ||||
| 0x55,0xf4,0xf4,0xcf,0xa6,0x8f,0xc6,0x3c,0xbe,0x60,0x5e,0xf9,0x6a,0x3f,0x85,0x8f, | ||||
| 0xa2,0x8e,0x7e,0x8,0x34,0xdf,0xbc,0xf2,0x95,0xf7,0xbb,0xc6,0xf2,0x75,0x34,0xdf, | ||||
| 0xb4,0x34,0xcf,0xf1,0x6d,0x9c,0xc6,0xa7,0xbf,0x3a,0x41,0x2e,0x2e,0x32,0x5f,0x99, | ||||
| 0x3e,0x18,0xc5,0x37,0x75,0xbc,0xfc,0xa2,0x3c,0xef,0x7c,0x2a,0x1b,0xef,0x1,0x64, | ||||
| 0xfd,0x4b,0x14,0x1f,0xa6,0xf3,0x6f,0x3f,0xfb,0x1e,0xdd,0xd8,0x15,0x2b,0x7e,0xff, | ||||
| 0x3c,0xdf,0xf3,0x8f,0xef,0x8b,0x5a,0x1f,0xb2,0xae,0x5f,0x3a,0xf7,0xfb,0x23,0x8c, | ||||
| 0x12,0xfa,0xa8,0x30,0x9f,0xfa,0x55,0x7a,0x9f,0xb2,0x65,0xf9,0x9a,0x73,0x9f,0xff, | ||||
| 0x90,0x8b,0xd0,0xf6,0xf1,0x97,0x93,0x17,0xbd,0xd7,0x47,0xc3,0xf2,0x89,0x73,0x19, | ||||
| 0x7f,0x15,0x65,0xcf,0xea,0xff,0xb0,0xb1,0xa7,0x23,0x64,0xc3,0xc9,0xac,0xe5,0xee, | ||||
| 0x5a,0xbe,0x6a,0x5a,0xbe,0x1f,0xcf,0x25,0xbf,0x28,0x4a,0xcb,0xda,0x5e,0x12,0x1b, | ||||
| 0x5d,0xa,0x64,0x71,0x81,0xf3,0x19,0x6,0xfb,0xde,0xe2,0xf9,0x48,0x9b,0xa4,0xf3, | ||||
| 0x11,0xbc,0x66,0x75,0x74,0xd8,0x90,0xc6,0xf2,0x61,0xfb,0xfc,0xe3,0x1d,0x5f,0x2, | ||||
| 0xee,0x27,0xf0,0x4d,0xbf,0x2a,0xd8,0x3e,0x1,0xd8,0xfd,0x4b,0x21,0x8d,0x8f,0x77, | ||||
| 0x7d,0x10,0xf0,0x66,0x3a,0x1f,0xad,0xda,0x3e,0x7b,0x7c,0x23,0xc1,0xbe,0x93,0xa3, | ||||
| 0x20,0x1f,0xaf,0x7f,0x21,0xe0,0x4e,0x86,0x3e,0xb2,0xba,0x3e,0x18,0x7c,0xab,0xa8, | ||||
| 0xd,0xab,0x81,0x3e,0xa9,0xc7,0xb9,0x3f,0x17,0x82,0xea,0x57,0xe9,0x7d,0x8f,0x9c, | ||||
| 0x3e,0x45,0x4,0x15,0x2,0x43,0x7d,0xa4,0xc7,0xa9,0x6f,0x8,0x41,0xe3,0x1b,0x69, | ||||
| 0x4b,0x69,0x7d,0xf6,0xf5,0x61,0xfb,0xce,0xa3,0xfa,0xcc,0x4f,0xb0,0xf,0xf4,0x53, | ||||
| 0xfa,0x80,0xdd,0xbf,0xe8,0x3e,0x38,0xc3,0x77,0xc6,0xf3,0x5,0xe6,0x2b,0x9,0xe8, | ||||
| 0x9b,0xb3,0xa4,0xf1,0xd9,0xfd,0xb3,0xea,0x5b,0x3f,0x1a,0x68,0x5b,0x89,0x4f,0xe8, | ||||
| 0x53,0xb1,0xda,0x2f,0xb0,0x3e,0x24,0x1,0x92,0xb2,0xfd,0x5c,0x47,0x63,0x55,0x9c, | ||||
| 0xea,0xc7,0x77,0xbc,0x76,0x9e,0x8d,0xef,0x24,0x5b,0x9f,0x9a,0x99,0x75,0x1f,0x51, | ||||
| 0xa6,0x2,0x29,0xac,0x6e,0x7e,0xc9,0xac,0x8,0xa2,0xbb,0xe5,0x6b,0x5f,0xde,0x85, | ||||
| 0x5,0xdf,0xf5,0xeb,0xf4,0x65,0x97,0xaf,0x2,0x7d,0x48,0xbb,0x3e,0xf6,0xb5,0x5e, | ||||
| 0x9b,0x8,0x6a,0xcf,0x5d,0x63,0xd7,0xb6,0xd4,0xec,0xc3,0x5e,0xff,0x0,0xfa,0xfa, | ||||
| 0x3f,0x87,0x6f,0x2f,0xbb,0x7c,0x15,0xe8,0xc3,0x9a,0x4f,0x9b,0xf0,0x43,0x5e,0xdf, | ||||
| 0x8,0x99,0x3e,0x6f,0xfe,0xa3,0x73,0xb8,0x3f,0xf,0xf4,0x29,0x6a,0xff,0x7c,0xf3, | ||||
| 0x92,0xe5,0x13,0x98,0xaf,0xdf,0x1c,0xd1,0x9d,0xfe,0x1,0xf0,0xfb,0x88,0xe5,0xe3, | ||||
| 0xe6,0x2b,0x73,0x77,0xa7,0x88,0x3e,0x2b,0x34,0x7d,0x95,0x13,0x9d,0x4,0xb6,0xa, | ||||
| 0x52,0xcf,0x51,0x44,0x3f,0xff,0x56,0x4d,0x5f,0xaf,0xab,0xfa,0x76,0x9b,0x40,0x2f, | ||||
| 0x89,0x97,0x9c,0xbe,0xa9,0xe5,0xdb,0xe4,0xe5,0x97,0x98,0xbe,0xb0,0xf6,0xb3,0x7e, | ||||
| 0x8b,0xb5,0x1f,0x14,0xac,0xec,0xf0,0xe9,0xd7,0x55,0x1f,0xd8,0xe0,0xb4,0xdf,0xd8, | ||||
| 0xf2,0x35,0x17,0xe5,0x63,0xe7,0x1f,0xb2,0xcf,0x3f,0xb5,0xfd,0xd0,0x1a,0x68,0x8a, | ||||
| 0x7e,0xdf,0x91,0xe5,0xc3,0xbc,0xe3,0x6b,0xee,0xce,0x96,0xa9,0x4f,0xfb,0x9e,0xd8, | ||||
| 0xed,0xeb,0x1e,0xf7,0xe1,0x1a,0xa8,0x73,0x7c,0xfb,0xb6,0x8f,0x77,0x7d,0xcc,0xc3, | ||||
| 0xa7,0xc7,0x6a,0xb5,0xff,0xc3,0xf6,0xf9,0x77,0xfc,0x59,0xb9,0x54,0x37,0x7c,0x27, | ||||
| 0xc8,0xe5,0xb3,0xe7,0x3f,0xb8,0xf9,0x6a,0x5f,0xfb,0x99,0x73,0xf0,0x11,0xf7,0xf8, | ||||
| 0xa1,0x45,0x56,0xc5,0xcc,0x57,0x5a,0x13,0xb6,0xb1,0x6c,0xf8,0x8c,0xe2,0xa1,0x7e, | ||||
| 0xff,0xeb,0xca,0x57,0x1b,0x87,0x10,0x18,0xbe,0xe9,0x5c,0x7c,0x9e,0xf1,0x57,0x6b, | ||||
| 0x33,0x6c,0x8e,0x6f,0xda,0x7a,0x49,0xf0,0x86,0xb6,0xed,0xe6,0x80,0x15,0x5f,0xfd, | ||||
| 0xf5,0x83,0x7a,0xdf,0x28,0xdf,0xec,0xab,0x51,0x63,0x2e,0xbe,0xe0,0x7c,0x85,0x74, | ||||
| 0x1f,0x34,0xeb,0x1b,0xe6,0x8d,0xa9,0xcf,0x67,0xee,0x14,0x3e,0xaf,0xe3,0x1b,0x92, | ||||
| 0xaf,0xdc,0xbe,0x80,0xf9,0x41,0xc1,0xd8,0x28,0x3e,0x91,0x4f,0x11,0xd2,0xb7,0xdf, | ||||
| 0xed,0xcf,0xc2,0xdb,0x6f,0x4b,0x1c,0x59,0xbe,0x8d,0xc5,0xfb,0xda,0xd2,0x30,0xfc, | ||||
| 0xfc,0x3b,0x11,0xff,0x9f,0xe5,0xab,0xc7,0xf4,0x91,0x95,0xd8,0x3e,0x35,0x5f,0x95, | ||||
| 0xbe,0xbe,0xb,0xb7,0xb4,0xeb,0x57,0x6f,0xbf,0x76,0xc5,0xf0,0x19,0x93,0x77,0xfe, | ||||
| 0xfa,0x95,0x62,0xee,0xf4,0xaf,0xfa,0xd4,0x4f,0xcc,0xf3,0x4f,0x6d,0xbf,0xd7,0x57, | ||||
| 0x63,0xf9,0xd4,0x7c,0x25,0x8d,0xfa,0x7,0x55,0xd6,0xff,0x1,0x60,0xfa,0xcc,0xc9, | ||||
| 0x4f,0xed,0xfe,0x3,0x39,0xfb,0x3f,0xfd,0xfa,0x38,0xd2,0x7d,0xa,0x5d,0x8b,0x7b, | ||||
| 0x7d,0x98,0x9d,0x85,0xfe,0x29,0xa0,0x48,0xbe,0xd1,0x44,0xe9,0x1f,0x8,0x6c,0xfc, | ||||
| 0x0,0xe2,0x23,0xc1,0x39,0xbe,0x69,0xbe,0xa1,0x73,0xfc,0xd0,0xfb,0x97,0x5d,0x7d, | ||||
| 0xfc,0xc0,0x74,0x27,0xa6,0xef,0x81,0x63,0xe1,0x3d,0xc1,0xc3,0x8,0x3e,0x35,0x5f, | ||||
| 0x91,0x87,0xfd,0x83,0xef,0xda,0xbe,0x77,0x5d,0xf9,0x40,0xf7,0x39,0xc7,0x5f,0xbd, | ||||
| 0x7f,0x5e,0x4f,0xe8,0x5b,0x73,0xd5,0x87,0xe,0x22,0xf8,0xd4,0x7c,0x40,0x6e,0xef, | ||||
| 0x36,0xaf,0x7b,0x96,0x1c,0x68,0x97,0x6,0x42,0xc5,0x3d,0xdd,0x77,0xe0,0xc8,0x2f, | ||||
| 0xce,0xea,0xd7,0x6a,0x4a,0x5f,0x94,0xe3,0xab,0xe6,0x2b,0x22,0x81,0x8d,0x2a,0x27, | ||||
| 0x3f,0xa3,0x9,0x6a,0xf9,0x7c,0xc6,0x27,0x9b,0xf6,0x43,0xd1,0xda,0x6f,0x22,0x81, | ||||
| 0x26,0xcf,0x87,0x47,0x78,0x4d,0xf7,0x35,0x7c,0xf9,0x2a,0xe9,0xf9,0xd7,0xd2,0xde, | ||||
| 0xf5,0x19,0xcb,0xa7,0xe6,0x2b,0x49,0x2,0x75,0xbe,0x4f,0xfd,0x9b,0x9a,0x6f,0xc3, | ||||
| 0x97,0xaf,0xf4,0xeb,0x97,0xc6,0xbf,0x7e,0xd5,0x84,0xce,0xd6,0x5d,0x44,0xf4,0x69, | ||||
| 0xf9,0xea,0x2a,0xa8,0x6f,0x71,0xee,0xdf,0x94,0x9e,0xe9,0x43,0xbe,0x7c,0x85,0x74, | ||||
| 0x5f,0xfc,0xfe,0x4f,0xfb,0xab,0xac,0x83,0x51,0x8e,0xa3,0xf8,0x9c,0xf9,0xaa,0xa7, | ||||
| 0xe7,0xab,0xb1,0xe0,0xf3,0xf9,0xee,0x7f,0xd,0x5f,0xec,0xf1,0xc3,0xe5,0x23,0xa7, | ||||
| 0x51,0x7c,0xce,0x7c,0xa5,0x18,0xf9,0x8a,0xb5,0x1f,0x69,0x99,0x3e,0x7f,0xfd,0xc0, | ||||
| 0xf4,0xc5,0x1d,0x7f,0xc9,0x1f,0x3a,0x7c,0xf4,0x9f,0x45,0xf1,0x39,0xc7,0x5f,0xc5, | ||||
| 0x99,0x5f,0x34,0x9f,0x79,0x7d,0x4,0xfa,0x62,0xe7,0x97,0xbe,0xd3,0x17,0x3b,0x5f, | ||||
| 0x61,0xdd,0x37,0xb0,0xee,0xcf,0xd7,0xd4,0xfe,0x85,0x5f,0xbf,0x4a,0xe1,0xc3,0x28, | ||||
| 0x71,0x7e,0xd1,0x7d,0xb7,0x21,0x3b,0xff,0xa8,0xa0,0xf6,0xcf,0x34,0xeb,0xf6,0x9b, | ||||
| 0x16,0x53,0xe6,0x2b,0x2a,0xcc,0xae,0x5f,0xa5,0xf0,0xd1,0xf8,0xf9,0xea,0xcb,0xbb, | ||||
| 0x70,0x53,0xbb,0x7e,0xa1,0x9e,0xaf,0x4,0x61,0x76,0xfd,0x2a,0xa1,0x4f,0xbb,0x3e, | ||||
| 0x62,0xfa,0xb4,0xfa,0x55,0xbd,0x7f,0xa0,0xdf,0x5f,0xee,0xba,0xf2,0x95,0xed,0xdb, | ||||
| 0xf,0xe8,0xff,0x12,0xdc,0x7f,0x24,0xf0,0x79,0xf3,0xd5,0x3b,0xd4,0x5c,0xdf,0xbe, | ||||
| 0x56,0x64,0xf7,0xbf,0xbe,0xf1,0x23,0x1b,0x9f,0x3c,0x58,0x29,0x94,0x22,0xe4,0xab, | ||||
| 0x6b,0xfd,0x83,0xa2,0x2f,0x5f,0x61,0x69,0x27,0xb8,0xbe,0x81,0x92,0xd6,0x5f,0x62, | ||||
| 0xfb,0xb4,0x7c,0x25,0xed,0xaa,0xf9,0xc0,0x9b,0xaf,0xb0,0xd4,0xb2,0x7c,0xbe,0xfc, | ||||
| 0x12,0xc7,0x37,0x2e,0xa7,0xf1,0x69,0xf5,0x2b,0x35,0x5f,0x21,0x5f,0x3e,0xc0,0xd2, | ||||
| 0xe3,0x92,0xe9,0x1b,0xa6,0xf2,0xe9,0xe5,0x6,0xc3,0x37,0x75,0xff,0x69,0xf9,0x88, | ||||
| 0xee,0x47,0x68,0x3f,0xa4,0xe6,0x2b,0x8e,0x6f,0x64,0xbc,0x86,0x2c,0xe8,0xf8,0x46, | ||||
| 0xae,0x9f,0x2,0x68,0x5f,0xbf,0x34,0xb6,0x2f,0x30,0x5f,0xc9,0x57,0x1,0xc,0xac, | ||||
| 0x5f,0xc5,0xf3,0x95,0xed,0xfb,0x37,0x57,0xa5,0x4a,0xf3,0x5d,0x11,0xdc,0xbf,0x3b, | ||||
| 0x16,0x22,0xe6,0x2b,0x6c,0xce,0xb9,0x73,0xeb,0x57,0x49,0x7d,0xae,0xcf,0x99,0xe6, | ||||
| 0xfb,0xba,0xe8,0xf6,0x91,0x99,0xf9,0x8a,0x98,0x3e,0x3c,0x62,0xbe,0x7d,0x5e,0xff, | ||||
| 0x3c,0x7e,0xae,0xae,0x6d,0x53,0x9f,0xc2,0xf7,0x44,0x3f,0xbe,0x33,0x7c,0xfe,0x7c, | ||||
| 0x35,0x35,0x7d,0xe8,0x9,0x8,0x1b,0xdf,0x50,0xf7,0x79,0xba,0x9d,0xca,0xa7,0xf0, | ||||
| 0x7c,0xca,0xcc,0x7c,0x75,0xce,0x7c,0x93,0x52,0xb8,0xef,0xa5,0xda,0xad,0x28,0xbe, | ||||
| 0x76,0x31,0xd4,0x27,0x44,0xf6,0x9d,0x9d,0xea,0x3e,0xed,0x3d,0x8b,0xb3,0xd6,0xb7, | ||||
| 0x1b,0xbe,0x6,0x88,0x36,0xff,0xe1,0xf0,0x9d,0xa7,0xf0,0x19,0xed,0x77,0x7b,0x42, | ||||
| 0x23,0xe5,0x17,0xd4,0x7d,0x2d,0xa1,0x6f,0x8c,0x1c,0xbe,0x6b,0x9e,0xab,0x1a,0xcf, | ||||
| 0xf0,0xb5,0x25,0x29,0x9a,0x6f,0xfc,0xdc,0x6b,0x1d,0x10,0xfb,0xf8,0x4e,0x2f,0xa9, | ||||
| 0x97,0x64,0xd5,0xe1,0xbb,0xca,0xf1,0x29,0xe3,0xa7,0xad,0xe,0x43,0xcb,0x57,0xdd, | ||||
| 0x5d,0x8,0xd9,0xf5,0xb,0xda,0x2f,0xd3,0x48,0xf9,0xa,0xe1,0x37,0xa2,0xf9,0xa8, | ||||
| 0xb6,0x1c,0x97,0x6d,0x40,0xa8,0x39,0x61,0xc3,0xe1,0xfb,0x5a,0xd9,0xfd,0xa,0x19, | ||||
| 0xcd,0x47,0xe0,0x9b,0xb0,0xe7,0xc8,0x57,0x3f,0xec,0x1f,0x74,0x58,0xff,0x7,0xc0, | ||||
| 0xb7,0xa3,0xe5,0x2b,0xd5,0x17,0xf1,0xf8,0x6a,0x6f,0x48,0x95,0x1d,0x6,0x78,0xe0, | ||||
| 0x1e,0x3f,0xa6,0x25,0xcf,0xf8,0xa1,0xf9,0x14,0x3b,0x5f,0x21,0xd3,0x67,0xe6,0x97, | ||||
| 0x1d,0x96,0xaf,0x4,0x10,0x96,0xaf,0x10,0xbe,0x17,0xcd,0x37,0xd5,0xce,0x3f,0x6b, | ||||
| 0x3,0xcc,0x55,0xd5,0x37,0x74,0xfb,0xe4,0xa2,0x77,0x7c,0xbb,0x65,0xfb,0xb4,0xf9, | ||||
| 0xc1,0x97,0xfb,0x7,0x8f,0x7c,0x3e,0x2c,0x89,0xdb,0x61,0xe3,0x2f,0xc2,0xf5,0x5a, | ||||
| 0x24,0xdf,0x29,0x75,0xbc,0x1c,0x50,0x3b,0xc7,0xd5,0xfb,0x5e,0xb3,0xca,0xa4,0xfa, | ||||
| 0xb8,0xd3,0x85,0x62,0xb5,0x82,0xed,0x7c,0x40,0x5f,0xde,0x6d,0x3e,0xe2,0xe4,0x2b, | ||||
| 0xf1,0x56,0x58,0xbe,0x8a,0x3c,0xbe,0x41,0x67,0xfb,0x11,0xc5,0x11,0x14,0x82,0xdb, | ||||
| 0xef,0x75,0xcb,0xa7,0xd5,0xaf,0xfa,0x60,0xa3,0xc2,0xc9,0x57,0x3b,0xec,0xf8,0x22, | ||||
| 0x9e,0x8f,0xb4,0xf5,0x2d,0x42,0x23,0x5e,0xbf,0xec,0xfc,0xe3,0xf9,0x38,0xe7,0x5f, | ||||
| 0xb5,0x82,0x1c,0xf5,0xab,0xcb,0xa0,0x59,0xe0,0xe4,0xab,0xbe,0xe5,0xe3,0x1d,0x5f, | ||||
| 0x2,0xaa,0xd1,0xda,0x4f,0xef,0xff,0xac,0xd,0x44,0x6b,0xda,0x62,0x35,0xb7,0xcf, | ||||
| 0xf3,0xa,0x28,0xcd,0x57,0x79,0x4,0xed,0x7c,0x5,0xfb,0xa0,0xe,0x39,0xf9,0xaa, | ||||
| 0xc7,0x7c,0x90,0x77,0x7d,0x10,0x50,0x89,0xe1,0x23,0x56,0x79,0xb3,0xac,0xbd,0xb8, | ||||
| 0xd4,0xe5,0xf3,0xde,0xa,0x8,0xa,0xaa,0xfc,0xe8,0x5,0x47,0xbe,0xea,0x19,0xbe, | ||||
| 0x13,0xec,0xce,0x57,0x5f,0x66,0x3e,0xc0,0xeb,0x5f,0x8,0x78,0x25,0x9a,0x6f,0x52, | ||||
| 0xf6,0x8c,0xbf,0x10,0xcd,0xf0,0x5,0xe5,0xab,0x53,0xa3,0x7e,0xc5,0xf2,0xd5,0x67, | ||||
| 0xec,0xfe,0x6d,0x83,0xd7,0x3f,0x13,0xfd,0x46,0x34,0x82,0x4f,0x2,0x69,0x7c,0xce, | ||||
| 0x7c,0x65,0xe4,0x3,0xb3,0xbe,0x81,0x11,0xa,0xcd,0x57,0xa4,0x4d,0xa3,0xf9,0xfa, | ||||
| 0xce,0x7c,0x35,0xfd,0xd7,0x31,0x7d,0xce,0xf1,0xf7,0x38,0x96,0xf,0x24,0xf1,0xe1, | ||||
| 0x56,0x72,0xdf,0x99,0xe1,0xd3,0xeb,0x2f,0xb3,0xf3,0x95,0x4,0x60,0x34,0x1f,0xf0, | ||||
| 0xfa,0x66,0x5e,0x1f,0x41,0xed,0xd7,0xd5,0xf3,0x95,0x1c,0x2d,0xbf,0x48,0x20,0xe2, | ||||
| 0xfa,0x3a,0x9f,0x4f,0x2e,0x25,0xf4,0xed,0xc6,0xa9,0x5f,0x9d,0x80,0x71,0x42,0x9f, | ||||
| 0xb7,0x7f,0xe,0xbf,0x3e,0x1c,0xf3,0x83,0x38,0x4e,0xfd,0x2a,0xfa,0xf8,0x6,0xa8, | ||||
| 0xfb,0xfa,0xe0,0xfb,0x84,0xc0,0xfa,0x95,0x35,0x3f,0x88,0x3,0xea,0x57,0x30,0xd5, | ||||
| 0xfd,0x25,0xaf,0xbe,0xc1,0xf1,0x55,0x3,0xeb,0x57,0x48,0xf5,0x21,0xdf,0xfc,0xa0, | ||||
| 0x9a,0xaf,0xd8,0xfd,0x51,0x27,0xd5,0xfd,0x39,0xaf,0x72,0x40,0x5c,0xf5,0x97,0x30, | ||||
| 0x9f,0x96,0xaf,0x24,0x97,0xcf,0xae,0x5f,0xb1,0xfb,0xdf,0x47,0x99,0xd7,0xaf,0xa2, | ||||
| 0xfb,0xb4,0x7c,0xf5,0x70,0xb7,0xd9,0x9,0xab,0x5f,0xc1,0x54,0xf5,0xa1,0x74,0xbe, | ||||
| 0x90,0xfa,0xd5,0x3c,0x7c,0xf2,0xa5,0xa0,0x72,0x60,0x35,0x7e,0xfd,0x8a,0x9d,0x7f, | ||||
| 0x90,0x77,0x7c,0x93,0xd5,0x4f,0x15,0x2a,0x7f,0x83,0xef,0xb3,0xf6,0x3b,0x8b,0x5c, | ||||
| 0xbf,0xfa,0x14,0x86,0xe5,0xab,0x64,0x3e,0x12,0xe8,0x63,0xd,0x1c,0x32,0x3f,0x78, | ||||
| 0xe8,0xce,0x57,0x4f,0xc3,0xb0,0xfe,0x25,0xd9,0xfa,0x1c,0xea,0xf0,0x89,0x57,0x15, | ||||
| 0xd1,0xf7,0x7,0x91,0x10,0x9c,0xaf,0xa0,0x3b,0x5f,0x59,0xf5,0x2b,0xc8,0x9f,0x5f, | ||||
| 0x98,0xa6,0xf4,0xdd,0xfc,0xfc,0xcc,0xe1,0x33,0x5f,0x78,0xe0,0xf5,0x39,0xf3,0x15, | ||||
| 0x70,0xe7,0x97,0x27,0x30,0x7c,0x7e,0xe6,0x3c,0x9d,0x8f,0xb4,0xa6,0x67,0x7f,0x61, | ||||
| 0x2f,0x36,0x1,0xfc,0xf6,0x73,0x8e,0xbf,0x7b,0x6e,0x5f,0x78,0xfd,0x2a,0xfd,0xf1, | ||||
| 0x6d,0x29,0x6f,0xfc,0x10,0x79,0x7d,0xf2,0x8c,0xf5,0xed,0x91,0xf3,0x55,0x6,0xbe, | ||||
| 0xab,0x6f,0xb4,0xec,0x27,0xb6,0x3a,0xb3,0xdb,0xcf,0xa8,0x5f,0x45,0x9e,0x7f,0x8b, | ||||
| 0xbf,0xfe,0xca,0xed,0x7b,0x3c,0xfa,0x89,0xc3,0x17,0x70,0xfe,0xf9,0xeb,0x57,0x84, | ||||
| 0x46,0xf6,0xd5,0xd3,0xb5,0x9f,0xea,0x3,0xbc,0xf3,0x4f,0xab,0x5f,0x21,0x4e,0xbe, | ||||
| 0x32,0xea,0x57,0x75,0x1a,0x71,0x7e,0x90,0x24,0x5a,0x7f,0xa0,0xfb,0xf4,0xdb,0x61, | ||||
| 0xae,0x4f,0x36,0xeb,0x43,0x43,0x4e,0xbe,0x32,0xea,0x57,0x35,0xbf,0x2f,0xa0,0xff, | ||||
| 0x4b,0xb4,0xfe,0x4a,0xf7,0xe9,0xe5,0x84,0xd6,0xa8,0xd7,0x12,0x5d,0x1d,0x9d,0xa3, | ||||
| 0x7e,0x75,0x10,0x98,0xaf,0x1a,0x7e,0x5f,0xc0,0xf8,0x11,0x7f,0xfd,0xb,0xf3,0xe9, | ||||
| 0xe5,0x98,0x9d,0xab,0xbd,0x96,0xdd,0xbf,0xb4,0xcb,0xae,0xfa,0x15,0xa,0xcc,0x57, | ||||
| 0x3f,0xf2,0x5f,0x1f,0x1,0xe3,0x6f,0x1c,0x9f,0xdd,0x19,0x7c,0x63,0xd6,0x8b,0x71, | ||||
| 0xf4,0xfa,0x95,0xa3,0xfe,0x42,0xfb,0xbb,0x4d,0xe8,0x5f,0x7f,0xe5,0xf0,0xf9,0xf2, | ||||
| 0xcb,0x38,0xee,0xfa,0x2b,0xca,0x69,0xbf,0xa0,0xff,0x14,0xbd,0x7e,0x85,0x1c,0xf9, | ||||
| 0xaa,0xf,0x36,0x42,0x9f,0x5f,0xa0,0xbc,0xf5,0xed,0xf1,0xda,0x8f,0x72,0xce,0xbf, | ||||
| 0x40,0x9f,0xa7,0x7e,0x85,0x76,0x40,0x13,0x2c,0xd6,0x37,0x15,0xc2,0x7d,0x95,0x47, | ||||
| 0xc8,0x51,0xbf,0xe2,0xaf,0x6f,0x9f,0xed,0x8b,0x71,0xfd,0x7a,0x7c,0x9e,0xcf,0xdf, | ||||
| 0x95,0x5c,0xf9,0x4f,0xab,0x5f,0x55,0xed,0x7c,0x75,0xed,0x69,0x50,0x2f,0x84,0x3d, | ||||
| 0x3f,0x13,0xe4,0x8b,0xd1,0xff,0x85,0xfb,0xb4,0x99,0x5c,0x71,0x76,0xfd,0xca,0x98, | ||||
| 0x1f,0x54,0x22,0xfb,0x62,0x8c,0x1f,0xb3,0x7d,0x60,0x76,0xfd,0xca,0xc8,0x57,0x67, | ||||
| 0xd1,0x7d,0x1b,0x19,0xfa,0x22,0xd4,0x37,0x7e,0xa5,0xfb,0x9e,0x78,0x7c,0x1,0xfb, | ||||
| 0xb7,0xc7,0xcb,0xf7,0xe1,0x3e,0x10,0xc9,0x77,0xf6,0xb1,0xee,0x53,0x16,0xef,0x1b, | ||||
| 0x6e,0x47,0x6a,0x3f,0x3d,0x1f,0xdc,0x9e,0xbf,0xcf,0x78,0x43,0xfc,0x9e,0x67,0xa5, | ||||
| 0x98,0x18,0xc9,0xd7,0x96,0x3c,0xbe,0xa0,0x4f,0xa,0x9f,0xf1,0x86,0xf8,0xd6,0xe9, | ||||
| 0x30,0x68,0xfc,0xf0,0xd4,0xaf,0x9a,0xbb,0x10,0x4,0xe6,0x2b,0xfa,0x79,0xb1,0x98, | ||||
| 0xb9,0x4f,0x7b,0x43,0xfc,0xda,0xf1,0x81,0x85,0x10,0x3,0x7d,0xda,0xfc,0xe0,0xf3, | ||||
| 0xfd,0x83,0x6d,0x3b,0x5f,0x79,0x7d,0xa3,0x9,0xca,0xd2,0xa7,0xf5,0x69,0xfa,0x1b, | ||||
| 0xe2,0x5,0xfb,0xf8,0x42,0x10,0xe2,0x1b,0x4d,0x5a,0xfd,0x83,0x5b,0x76,0x7e,0x69, | ||||
| 0x2d,0xc2,0x27,0xb5,0x9d,0x3e,0xed,0xfa,0x5d,0x17,0x2,0xeb,0x57,0xce,0xe7,0x7, | ||||
| 0x39,0x3e,0xc4,0xf5,0xc5,0xab,0xbf,0xf8,0x7c,0xc0,0xeb,0x13,0xc4,0xc0,0xfa,0x95, | ||||
| 0xf5,0xfc,0x20,0x2f,0x5f,0x65,0xec,0x93,0x4b,0x2e,0x9f,0x5c,0x9a,0xe1,0xb,0x7e, | ||||
| 0x7e,0xd0,0xbe,0x3e,0x60,0x86,0x3e,0x4,0x99,0x6f,0x4d,0xf3,0x21,0x38,0xbb,0xfd, | ||||
| 0xc2,0xf3,0x15,0x1d,0x51,0x10,0xf2,0xf3,0xe2,0xfa,0xb4,0xe0,0xae,0xf9,0x7e,0x50, | ||||
| 0x6c,0x69,0x3e,0x23,0xc7,0x43,0xf0,0x83,0x62,0x80,0x4f,0xcb,0x57,0x3b,0xa0,0x1e, | ||||
| 0xec,0x23,0xa3,0xd0,0xed,0x8a,0xe2,0xfb,0xb6,0xa9,0xf6,0x86,0xf8,0x1f,0x14,0xf7, | ||||
| 0xc,0xdf,0xb6,0x5e,0xa2,0xfe,0x41,0xd1,0xb8,0x3e,0xa6,0x77,0x39,0xf5,0xab,0x96, | ||||
| 0xe1,0xd3,0xd7,0x77,0xf2,0x7c,0x42,0xc6,0x3e,0xed,0xf3,0x83,0x22,0xef,0x97,0x14, | ||||
| 0x37,0x42,0xea,0x57,0xd8,0x59,0xbf,0xb2,0x3e,0x57,0x9,0xf7,0x95,0x99,0x91,0xd7, | ||||
| 0x5f,0xc5,0xf2,0xd1,0x46,0x48,0xfd,0xa,0x3b,0xeb,0x43,0x33,0x4f,0xf4,0xa8,0xeb, | ||||
| 0xaf,0xd2,0xf9,0x9c,0xe3,0x2f,0x8a,0xe7,0x8b,0xb8,0xfe,0xca,0xfd,0x19,0x14,0x5c, | ||||
| 0x20,0xcf,0x2f,0x29,0xbd,0x23,0xcc,0x7c,0x7e,0x30,0xb2,0xaf,0x1,0x92,0xec,0xff, | ||||
| 0xe2,0x1,0x79,0x7e,0x79,0x6f,0x56,0xfb,0xdd,0x8e,0xec,0x7b,0x6d,0xe,0x3e,0x42, | ||||
| 0x43,0x7c,0x7a,0x7d,0x57,0x8a,0xe8,0x8b,0xbc,0xfe,0x2a,0xd6,0xf1,0x55,0xf4,0xfa, | ||||
| 0xda,0xe3,0xcb,0x4f,0x15,0x39,0xf5,0x2b,0x63,0x7d,0x7b,0x25,0x62,0xfb,0x45,0x5e, | ||||
| 0x7f,0xe5,0xb9,0x40,0xdc,0x20,0xcf,0x2f,0xe5,0x67,0xb4,0xfe,0xef,0xa5,0x9,0xa1, | ||||
| 0x9c,0xfa,0x95,0xee,0x3,0xd1,0x7d,0x89,0x8e,0xef,0xb6,0x1b,0xe4,0xf9,0xa5,0x31, | ||||
| 0x7e,0xb8,0x7c,0xa3,0x89,0xe9,0x33,0xf3,0xcb,0xa3,0xa8,0xbe,0x7b,0x49,0x7c,0x44, | ||||
| 0x70,0x81,0x3c,0xbf,0xf4,0xfb,0xb4,0xf5,0xed,0x92,0xcb,0xf7,0x6e,0xb4,0xfb,0x8f, | ||||
| 0xc8,0xeb,0xaf,0xdc,0x9f,0x33,0xba,0xae,0x7f,0xc3,0x2f,0x19,0x9b,0x6e,0xb9,0x7f, | ||||
| 0x69,0xd6,0xaf,0xc8,0xe7,0x97,0x9f,0x2a,0xd9,0xf9,0x80,0xbf,0xbe,0xdd,0xe3,0xcb, | ||||
| 0xea,0xfd,0x5b,0xc8,0x75,0xc1,0x42,0x44,0x39,0xed,0x47,0x9e,0xee,0x13,0x47,0xbe, | ||||
| 0xa,0x7a,0x7e,0xd0,0xe5,0xf3,0xbd,0x7f,0x8b,0xb4,0xe5,0x24,0x3e,0xf7,0x5,0xb, | ||||
| 0x7d,0xfd,0xb3,0xee,0x1b,0x49,0xc4,0x91,0xaf,0x82,0x9e,0x1f,0x74,0xd5,0xf,0x7c, | ||||
| 0xef,0xdf,0x22,0xa0,0x2a,0xd0,0xb4,0xfd,0x1f,0xa4,0xbc,0xf6,0x53,0x9e,0xd8,0xbe, | ||||
| 0x90,0xe7,0x7,0xbd,0x3e,0xf7,0xfb,0xb7,0x62,0xac,0xbf,0x8a,0xe1,0x9b,0xbe,0xae, | ||||
| 0xd5,0xef,0x9f,0x4c,0x9e,0x72,0xe6,0x2b,0x73,0x7e,0x30,0xd0,0xc7,0x7d,0xff,0x56, | ||||
| 0x42,0x1f,0x2e,0xb9,0x7c,0xee,0x5f,0xaa,0x5f,0xde,0x9,0xae,0x5f,0xb9,0x7d,0x72, | ||||
| 0x69,0xad,0x64,0xfa,0xb8,0xef,0xdf,0x22,0xe0,0x3f,0x24,0xba,0x3e,0x2a,0xee,0xeb, | ||||
| 0xa3,0xe2,0x39,0xbe,0x3b,0xc1,0xf5,0x2b,0xb7,0xf,0x4b,0x2d,0xe8,0xf0,0xf9,0xde, | ||||
| 0xbf,0x45,0xda,0xc3,0x24,0xe7,0x1f,0xac,0xba,0x7c,0xee,0x5f,0x52,0xed,0x9,0xd7, | ||||
| 0x88,0xfb,0xaf,0x71,0x7c,0xae,0xf7,0x6f,0x91,0xa8,0xeb,0x9b,0xe2,0xf9,0xea,0xd1, | ||||
| 0x7d,0x22,0xf3,0x71,0xdf,0xbf,0x25,0x25,0xf4,0x21,0xb7,0xf,0x25,0xf6,0x8d,0x0, | ||||
| 0x3b,0xff,0xb8,0xef,0xdf,0x9a,0x8f,0x8f,0xe0,0xa8,0xbe,0xd0,0xe7,0x67,0x68,0x8c, | ||||
| 0xf5,0x57,0x7c,0xdf,0x4a,0x11,0x43,0x8e,0x4f,0xd1,0x7d,0x8d,0x4f,0xd7,0xca,0x33, | ||||
| 0xdb,0x2f,0xec,0xf9,0x99,0x14,0xe3,0x9b,0x71,0xb3,0x4f,0xbe,0x64,0xf8,0xcc,0x5f, | ||||
| 0xda,0xf9,0xea,0x39,0xcd,0xf7,0xc7,0xdd,0x16,0x98,0xe9,0xb,0x7b,0x7e,0x26,0xb9, | ||||
| 0xcf,0x28,0x68,0x50,0xa5,0xd6,0xed,0x6a,0x3e,0xb9,0xc4,0xab,0xff,0xbd,0xd8,0xe8, | ||||
| 0xc2,0x99,0xbe,0xb0,0xf5,0x7,0xc9,0x7d,0xec,0x63,0xfa,0xf8,0xf5,0xc9,0x17,0x1b, | ||||
| 0x78,0xf6,0xf5,0x11,0xb6,0xfe,0x20,0x5d,0xfd,0xca,0xf0,0xfd,0xba,0x68,0xf9,0xdc, | ||||
| 0x5b,0x8a,0xa,0xe4,0x78,0xa6,0x6f,0xf6,0xfb,0x21,0x52,0xfb,0x1c,0xed,0x47,0xdc, | ||||
| 0xed,0x47,0x9e,0xae,0xce,0x6e,0x3f,0x67,0x3e,0x10,0x17,0xec,0x1b,0x55,0x67,0x9f, | ||||
| 0x7f,0xb3,0x7c,0x29,0xea,0xa7,0xb3,0x7c,0xca,0x4,0xcf,0xbe,0x7e,0x9d,0x3e,0xde, | ||||
| 0xf5,0x9b,0xda,0xf7,0x16,0xcf,0xa7,0xd7,0xaf,0x94,0xc9,0x94,0xd7,0xff,0x9d,0x4, | ||||
| 0xe6,0xab,0xf4,0xfb,0x5f,0xf9,0x3e,0xf7,0x6f,0xbc,0xc8,0xf3,0xe1,0x90,0xfa,0x8b, | ||||
| 0x44,0xc7,0xf7,0x9f,0xc7,0xbc,0x7c,0xe5,0x1c,0x3f,0x84,0xdb,0xc6,0x7b,0xb9,0xe2, | ||||
| 0xad,0xbf,0xa,0x1a,0x4d,0x7c,0xc7,0x37,0xac,0x3e,0x44,0x61,0xb3,0x87,0x78,0xf9, | ||||
| 0xc5,0xb9,0xfe,0xe0,0xe6,0x6b,0xa8,0x6e,0xf8,0xce,0x17,0xef,0x6b,0x18,0x63,0x6, | ||||
| 0x27,0x5f,0x39,0x7c,0xc6,0xcd,0x69,0xca,0xe3,0x1b,0xe4,0xbb,0x1b,0x32,0x3f,0xa8, | ||||
| 0xe,0x87,0xa,0xe0,0xe4,0x2b,0xd7,0xfb,0xb7,0x5e,0x7a,0x8d,0xa4,0xf7,0xad,0x9b, | ||||
| 0x3b,0x4e,0xfb,0x7d,0xd5,0xb0,0xf6,0x3b,0x41,0x8a,0xe8,0xc8,0x57,0xdc,0xe3,0xfb, | ||||
| 0xd2,0xed,0x9b,0x96,0x6f,0x23,0x73,0x1f,0x9,0x5b,0x7f,0x45,0xc9,0x75,0xe5,0x96, | ||||
| 0x23,0x5f,0x1,0xde,0xf5,0xf1,0x6a,0xe5,0x23,0xcb,0x57,0xcf,0xdc,0x67,0xd4,0xaf, | ||||
| 0xc4,0x6b,0xd8,0xaa,0x29,0xbf,0x2b,0xa3,0x4e,0xa1,0xa0,0xef,0x2f,0xaa,0x9e,0x9d, | ||||
| 0x53,0xe8,0xc8,0x57,0x22,0x2f,0x5f,0xbd,0x5a,0xb1,0xce,0xbf,0x44,0xeb,0xf,0x5c, | ||||
| 0xbe,0x7d,0xaf,0xcf,0xa8,0x5f,0xbd,0x2c,0xd5,0xac,0x5b,0xd9,0x4a,0xb5,0xda,0xa8, | ||||
| 0xd5,0xf4,0xe7,0x7b,0xdc,0xd7,0x87,0xb9,0xa7,0xb5,0x37,0x5f,0xbd,0xaa,0x5d,0x1f, | ||||
| 0xb1,0xf7,0xbf,0xa,0xf0,0x6d,0x70,0xc7,0xf,0xfa,0xd2,0xa4,0x59,0xb7,0x7c,0x95, | ||||
| 0x46,0xd5,0xf0,0x51,0x77,0xff,0x82,0x26,0xdc,0xf1,0xad,0xaa,0xf5,0x2f,0xbb,0xc9, | ||||
| 0xd7,0xbf,0xb8,0x7c,0x97,0x2,0x7c,0xc4,0xf2,0x11,0x8,0x27,0xb8,0x56,0x33,0xe6, | ||||
| 0x67,0x9c,0xfd,0x33,0x46,0xbf,0x2f,0x72,0x7d,0x5a,0xff,0xbc,0x9e,0xdc,0xd7,0xe6, | ||||
| 0x2d,0xb9,0x32,0x2a,0xb2,0x56,0xbe,0x1a,0x7d,0xd4,0xb5,0x7c,0x63,0xf8,0x4,0x17, | ||||
| 0x56,0x9d,0xf3,0x83,0xa1,0xf9,0x2a,0xe1,0xfe,0x57,0xf6,0x7,0x70,0xda,0xcf,0xbe, | ||||
| 0x15,0x37,0xf3,0xd5,0xe4,0xd8,0xf2,0xd1,0xca,0xef,0xb0,0x50,0x3,0xf1,0xf2,0x4b, | ||||
| 0x8a,0xf6,0x3,0x9c,0xf3,0xcf,0xeb,0x1b,0x39,0x7c,0xb0,0xd2,0xa8,0x9,0x35,0x31, | ||||
| 0x9e,0x6f,0x37,0x23,0xdf,0x3e,0xd7,0xa7,0x4c,0xa4,0xd3,0x9a,0xe5,0xab,0x56,0x9b, | ||||
| 0xb3,0x7c,0xbe,0x7c,0x75,0x94,0x7c,0xfd,0x95,0xcb,0x47,0xf9,0x3e,0xe4,0xe8,0xff, | ||||
| 0x5e,0x97,0xd1,0x81,0x50,0x10,0xc3,0xf2,0xd5,0x46,0xfa,0xfd,0xaf,0x62,0xf9,0x5c, | ||||
| 0xbf,0x2b,0x98,0x5f,0xd0,0xfa,0x67,0x38,0xda,0xd5,0x1f,0x4a,0x35,0x9f,0x9f,0x61, | ||||
| 0xfd,0x33,0xa,0x7a,0x3e,0xa0,0xbe,0x0,0x9f,0x68,0x8e,0x32,0xda,0xf8,0x36,0xfc, | ||||
| 0x78,0xc7,0xd8,0x3c,0xd4,0xc8,0x7,0x65,0xe6,0xb,0x7a,0xbe,0x62,0x23,0xa9,0x2f, | ||||
| 0xa0,0x34,0xcd,0xf3,0x39,0xc7,0x5f,0xd5,0x67,0xc,0xba,0xc6,0xf3,0x3d,0xac,0xfd, | ||||
| 0xb8,0xcf,0xa7,0x24,0xcd,0xf7,0xc9,0x7d,0xa,0x3d,0xfe,0x89,0xe8,0xf0,0x89,0x73, | ||||
| 0xf5,0x29,0xa4,0x94,0xc0,0xb7,0x6f,0xfb,0x46,0xc0,0xf2,0xa5,0x7f,0x7e,0x86,0xe3, | ||||
| 0x53,0x60,0x4c,0x1f,0xa6,0xa3,0xd7,0x64,0xcb,0xa7,0xe6,0x2b,0xe6,0x3,0xe9,0x9f, | ||||
| 0x9f,0x49,0xec,0x3b,0xc7,0xaf,0xcb,0xb0,0x50,0xd0,0xea,0xe3,0x48,0xf5,0x11,0xbb, | ||||
| 0xfd,0xec,0x7c,0x5,0xd2,0xef,0x2f,0xc5,0xf1,0xd1,0x48,0xbe,0xc9,0xf7,0xd5,0x80, | ||||
| 0x55,0xab,0x69,0xf3,0xb,0x3,0xd5,0xe7,0xb8,0x3e,0x30,0xb4,0x7c,0xe9,0xf7,0xe7, | ||||
| 0x4a,0xe3,0x53,0x7,0xb8,0x9a,0xb1,0xff,0x95,0x34,0x72,0xf4,0x2f,0xc8,0x7a,0x7f, | ||||
| 0x72,0x6,0xfb,0x9b,0xf1,0x7c,0x20,0x8a,0x4f,0xfa,0xab,0xa,0x6c,0xd6,0x6a,0xdf, | ||||
| 0x35,0x7d,0x76,0xff,0x3c,0xcb,0x97,0xb4,0xfe,0x62,0xfb,0xc4,0x68,0xbe,0xd7,0x61, | ||||
| 0xb3,0xb0,0x7a,0x3d,0x6a,0xbe,0xca,0xd0,0x27,0x44,0xf3,0x9,0x15,0x35,0x1f,0x54, | ||||
| 0xe3,0xe5,0x97,0x2c,0x7c,0x84,0x46,0x3c,0xbe,0xc9,0x7c,0x49,0xeb,0xa7,0xcc,0x37, | ||||
| 0xfd,0x27,0x91,0xc6,0x5f,0xa9,0x5b,0xa9,0xd6,0x66,0xf9,0x52,0x3d,0x9f,0x1c,0x6b, | ||||
| 0x7c,0x23,0xde,0xfd,0xaf,0x26,0x5d,0x35,0x60,0x9,0x7a,0xff,0x87,0xa3,0xd7,0xaf, | ||||
| 0xe6,0xe6,0x9b,0xf2,0xf6,0x97,0x32,0xf3,0xd5,0x29,0x85,0xb0,0xb0,0xb,0x66,0xd4, | ||||
| 0xaf,0xd8,0xdf,0x4a,0xb8,0xfe,0x6a,0x86,0xef,0xdc,0xeb,0xc3,0xd4,0xca,0x57,0xc7, | ||||
| 0x74,0xf8,0x9,0xde,0x1,0xfe,0xfa,0x90,0xc8,0xdd,0xff,0x25,0xd9,0xfa,0xab,0x59, | ||||
| 0xc7,0x57,0x9,0x1b,0x7f,0x87,0x1f,0x2b,0x3c,0xdf,0x8f,0x79,0xf9,0x25,0xee,0xfa, | ||||
| 0xab,0xed,0xc,0x7c,0xc7,0x3f,0x51,0x44,0x8e,0xef,0xad,0x0,0x5f,0x9c,0xf5,0x25, | ||||
| 0x56,0x9a,0x4a,0xe9,0xdb,0xb7,0xf3,0x55,0x8f,0x5b,0xbf,0xb2,0x7d,0xb1,0xd6,0x5f, | ||||
| 0xc9,0x42,0x34,0x1f,0xe,0xcf,0x57,0x8a,0x6c,0xe7,0x2b,0xdb,0xc7,0xbf,0x3e,0x62, | ||||
| 0xad,0xbf,0x1a,0xd3,0x64,0xbe,0x73,0xbc,0xbf,0xf7,0xa8,0x50,0xd8,0x64,0x3e,0x62, | ||||
| 0xe7,0xab,0xa7,0x43,0xf7,0xd7,0x8b,0xb9,0xfe,0x6a,0x8f,0xfd,0x8b,0x35,0x47,0x6b, | ||||
| 0xdd,0x2e,0x6a,0xfb,0xe7,0xc8,0x41,0xbe,0xc9,0xf7,0x9b,0x2d,0x35,0xbf,0x88,0xcc, | ||||
| 0x67,0x5f,0x1f,0x33,0xf6,0xd7,0x8b,0xb9,0xfe,0xca,0x62,0x15,0x7c,0x7d,0xac,0xb6, | ||||
| 0xff,0xd0,0x58,0x8,0xcc,0x57,0xf5,0x96,0x9d,0xaf,0x24,0x47,0xff,0x32,0xe3,0xf9, | ||||
| 0xe4,0x78,0xeb,0xaf,0xac,0xcb,0x83,0x58,0x2b,0xa5,0xda,0xcc,0xa1,0xed,0xdf,0xa4, | ||||
| 0x3d,0xbd,0x1a,0x30,0xfe,0xd6,0x45,0x35,0x5f,0x19,0xfb,0x8b,0x4a,0x8e,0xfe,0x79, | ||||
| 0xe6,0xfe,0x7a,0xb1,0xd6,0x5f,0x91,0x95,0xe8,0x1f,0xaf,0x6f,0x4f,0xcd,0x57,0xae, | ||||
| 0xf5,0x57,0x91,0xf2,0x55,0xbc,0xf1,0x2d,0x4d,0xfb,0x29,0x6a,0x7e,0x41,0xb1,0xf3, | ||||
| 0xb,0x69,0xf,0x4,0x3a,0xff,0xf3,0x4f,0xf5,0xb5,0x92,0xf9,0x80,0x10,0xc7,0xb7, | ||||
| 0x1f,0xed,0xfa,0xe5,0xe4,0xab,0x66,0xab,0x99,0x24,0x5f,0x11,0xb0,0x16,0x27,0xbf, | ||||
| 0x1c,0xfa,0xfa,0x3f,0xec,0x2c,0x1,0x29,0xcc,0x27,0xfb,0xf2,0xd5,0xfe,0x5e,0xc3, | ||||
| 0xc8,0x57,0xa,0xe,0xf0,0xed,0xf1,0xf7,0xbf,0x8a,0xe5,0x93,0x23,0xfa,0x70,0x70, | ||||
| 0xbe,0xd2,0xf7,0x9f,0x54,0xcf,0x2a,0xc1,0x18,0x3f,0xae,0x14,0x8b,0x61,0xf7,0xe7, | ||||
| 0x44,0x7f,0x10,0x28,0xb2,0x6f,0x2a,0x44,0xf3,0xa1,0xe0,0x7c,0x65,0xec,0x8f,0x59, | ||||
| 0xd9,0x11,0xcc,0xf1,0xd7,0x78,0xae,0x27,0x28,0x5f,0x91,0xb6,0x12,0xc7,0xe7,0xcf, | ||||
| 0x7,0x7c,0xdf,0x38,0x78,0xfc,0x7d,0xa2,0xef,0x2f,0x55,0x69,0xf9,0x7c,0x9b,0xdc, | ||||
| 0xfd,0xeb,0x40,0x2c,0x9f,0x3f,0x5f,0x5,0xb4,0x9f,0x30,0xcb,0xd7,0xf4,0xf9,0x9a, | ||||
| 0x3c,0x9f,0x4,0x70,0xba,0x7c,0xcf,0xf7,0x85,0xac,0x1f,0x1f,0xe9,0xfb,0x5f,0xbd, | ||||
| 0x52,0x33,0x7d,0x9f,0x5f,0x66,0x3e,0xee,0xfe,0x89,0x8b,0xf7,0xd,0xf4,0xfd,0xaf, | ||||
| 0x60,0xc3,0xbc,0x3e,0xae,0x5a,0xed,0xc7,0xdd,0xbf,0xf8,0x64,0x3e,0x3e,0x7d,0x7f, | ||||
| 0x6,0x54,0x72,0xac,0x44,0xfb,0xf5,0xdd,0x4a,0xa1,0x0,0x59,0xff,0x2,0xa0,0xb9, | ||||
| 0x3e,0x1b,0x2b,0xf6,0xf1,0x9d,0xcb,0xfd,0x9b,0xcb,0x67,0xf5,0xcf,0xb2,0x3e,0xbf, | ||||
| 0x0,0x1d,0x2b,0xf9,0x1a,0xd,0x35,0xbf,0x74,0x6c,0xdf,0x8f,0xca,0x5e,0xdf,0xfe, | ||||
| 0x5c,0xee,0x7f,0x5d,0x3e,0xd7,0xf8,0x46,0x46,0x13,0xcc,0xf1,0x19,0x7f,0x1d,0x8a, | ||||
| 0xbe,0xf6,0x9b,0x4b,0xfd,0xc0,0xed,0x73,0xe5,0x3,0x32,0x72,0xd6,0x3e,0xaa,0x8, | ||||
| 0xd7,0x6a,0xf6,0xfe,0xa2,0xac,0x7f,0xc6,0xd3,0x62,0x31,0xb3,0xfa,0x8b,0xf8,0xe1, | ||||
| 0x5a,0x78,0xff,0x37,0x70,0xad,0xbf,0x72,0xf9,0xee,0xde,0xad,0x15,0x56,0xbd,0xfb, | ||||
| 0x8b,0x66,0x5c,0xbf,0x12,0x1b,0xd6,0x4e,0x2a,0x11,0xda,0x8f,0xbe,0xe4,0xf4,0x9, | ||||
| 0xa2,0x9a,0xf,0x2a,0xf3,0xad,0x5f,0x81,0x4a,0x17,0x45,0x3f,0xff,0xe8,0x4b,0xce, | ||||
| 0xf3,0xaf,0xda,0x50,0x7d,0x85,0xd8,0xbe,0x58,0xf5,0x53,0x60,0xed,0xb7,0x3a,0xeb, | ||||
| 0xfa,0xd5,0x7d,0x3b,0xce,0xeb,0x57,0xf7,0xc1,0xd8,0xf9,0x2a,0x96,0x4f,0x82,0x38, | ||||
| 0x5a,0xff,0x67,0x3c,0x3f,0x28,0x3a,0xfb,0xbf,0xf,0xef,0x56,0x5,0xa3,0xff,0xb, | ||||
| 0xda,0x9f,0x1,0xa5,0xde,0xff,0x2a,0xb2,0x8f,0xb3,0xfe,0x4a,0xb4,0xf2,0x95,0xfe, | ||||
| 0xfc,0xf9,0xe0,0xae,0x95,0xaf,0x80,0xe9,0x1b,0xf2,0xe7,0x3f,0x62,0xac,0xbf,0x7a, | ||||
| 0x12,0xd5,0xc7,0x59,0xdf,0x4,0xac,0x7c,0xa5,0xef,0x8f,0x54,0x69,0x88,0x66,0x3e, | ||||
| 0x30,0x96,0xfe,0x7a,0xdf,0xbf,0x65,0xfb,0xce,0xe3,0xf8,0x66,0x5c,0x1f,0x21,0x3e, | ||||
| 0x3b,0xbf,0x78,0x7d,0xb7,0x4c,0xdf,0x1,0x7f,0xfe,0x2d,0xc6,0xf1,0xc5,0x68,0x46, | ||||
| 0xff,0xc2,0x7c,0x24,0x64,0xfd,0xd5,0x13,0x23,0x9f,0x8a,0x96,0xf,0x64,0xe7,0x93, | ||||
| 0xd7,0x4a,0xa9,0xdb,0x6f,0xa4,0xb7,0xdf,0x2b,0xf7,0x59,0xbe,0xb2,0xce,0xbf,0x6, | ||||
| 0xff,0xf8,0xc6,0x5d,0x7f,0x75,0xa8,0x9e,0xea,0xeb,0x9a,0x6f,0x5a,0x46,0x74,0x5c, | ||||
| 0xd2,0x7c,0x9b,0x44,0xbb,0x21,0x8e,0xe8,0x1b,0xe8,0xfb,0x5f,0x41,0xb3,0xfd,0xe4, | ||||
| 0xab,0x56,0xfb,0x6d,0xf0,0xaf,0x8f,0xb8,0xeb,0xaf,0xfa,0xb4,0xac,0xa,0x81,0xb6, | ||||
| 0xc1,0xb2,0x36,0xd9,0xa7,0xf9,0x6a,0x53,0xed,0x28,0x84,0x5e,0xbf,0xd5,0x46,0xdf, | ||||
| 0x9c,0x1f,0x54,0x7a,0x46,0x3e,0x30,0x8f,0xaf,0x62,0xf9,0x82,0xfa,0x97,0x98,0xeb, | ||||
| 0xf,0xfa,0xa4,0xf5,0x4d,0xd3,0x77,0xf0,0x97,0x55,0xc3,0x77,0xfe,0xfb,0x3f,0xe1, | ||||
| 0xf4,0x7f,0xce,0xfb,0x96,0xe3,0xf7,0x3e,0x45,0xc6,0xfc,0xa0,0xde,0xff,0x1,0xd8, | ||||
| 0xf0,0xfb,0x2,0xf6,0xe7,0x8a,0xb9,0x7e,0xa3,0x4f,0x1f,0x7f,0x6c,0xfa,0xd0,0x9f, | ||||
| 0x37,0xc,0x1f,0x39,0xfd,0x23,0x4f,0x7e,0xf6,0xf9,0xde,0xff,0xad,0xea,0xb3,0xf7, | ||||
| 0x97,0xe2,0xf8,0x82,0xc6,0xb7,0x98,0xeb,0x5f,0xfa,0xb4,0xd5,0x7b,0x60,0xfa,0x9a, | ||||
| 0xef,0x96,0xd,0x1f,0xba,0x53,0x8,0xf5,0x29,0xc7,0xef,0xf7,0xb1,0xd3,0xc7,0xfa, | ||||
| 0x67,0x35,0x5f,0xcd,0xc1,0xc7,0xda,0xaf,0xc9,0xda,0xf,0xdd,0xd1,0xdb,0x6f,0x1a, | ||||
| 0x54,0xbf,0x52,0x7a,0x1f,0xf4,0x71,0x61,0xb5,0x13,0x2f,0x5f,0x25,0xda,0xff,0x2a, | ||||
| 0xcc,0x17,0x38,0xbf,0xa5,0xec,0x36,0x5e,0xc6,0xb1,0xeb,0x43,0x34,0xeb,0xf6,0xb, | ||||
| 0xf6,0xf5,0x72,0xee,0xdb,0x69,0x3c,0xc4,0xb1,0xeb,0x57,0x34,0xc9,0xfa,0xab,0x43, | ||||
| 0x68,0xfa,0xa6,0xcf,0x33,0xdf,0xe6,0xce,0x2c,0x1f,0xd9,0x69,0xf4,0xcd,0xf9,0xc1, | ||||
| 0xc0,0x7c,0x15,0xb0,0xbe,0x3d,0xc5,0xfa,0x2b,0xdf,0xf8,0x16,0xec,0x73,0xd4,0xaf, | ||||
| 0xbc,0xf9,0x2a,0xf8,0xfd,0x5b,0x34,0xe5,0xfa,0xab,0xe8,0x3e,0xed,0x8b,0x1,0xf9, | ||||
| 0x6a,0x12,0x5c,0xdf,0xa0,0x19,0xac,0xbf,0x8a,0xe8,0xb,0xce,0x57,0xb6,0x2f,0x68, | ||||
| 0x7f,0x2e,0xba,0x58,0x1f,0xf6,0xe4,0x2b,0xe6,0x1b,0xe6,0xc3,0x37,0xd2,0x7d,0xaf, | ||||
| 0x8,0x22,0xcb,0x57,0x33,0x8f,0xef,0x62,0x7d,0x3,0x64,0xe4,0x2b,0x56,0xbf,0x42, | ||||
| 0xa1,0xcf,0xf,0x26,0xf3,0xa9,0xe3,0x98,0xb9,0x66,0x77,0x7d,0xc5,0xdc,0x51,0x4f, | ||||
| 0x1d,0x8b,0xa,0x21,0xbe,0x6a,0xe3,0xd3,0x8a,0x99,0xaf,0xf4,0xfd,0xf,0x20,0x7b, | ||||
| 0x7f,0x8a,0x9d,0xf,0x2,0xde,0x1f,0xbf,0x10,0x9f,0x9a,0xaf,0xba,0xd,0x33,0x5f, | ||||
| 0xe9,0xef,0x1f,0x84,0x2d,0xcb,0x27,0x6,0xd6,0xaf,0x16,0xe9,0x7b,0x5f,0xf3,0x39, | ||||
| 0xf2,0x55,0xd3,0xf2,0x9,0x33,0xc6,0xb7,0xf4,0xcf,0xa7,0xf0,0x8a,0x62,0xbe,0x7c, | ||||
| 0xd5,0x6d,0xba,0xf2,0xd5,0xeb,0x66,0xfd,0x6f,0x7a,0xb9,0x10,0xe6,0x4b,0xf9,0xfc, | ||||
| 0x5b,0x64,0x5f,0xef,0x83,0x6e,0xb3,0xb0,0xa,0xe3,0xe5,0xab,0x5,0xfa,0x76,0x1b, | ||||
| 0x2f,0xce,0xac,0xbf,0x64,0xd7,0x7e,0xb1,0xcf,0x3f,0x35,0x5f,0x69,0x3e,0x10,0xdb, | ||||
| 0x97,0xac,0x7e,0x1a,0xdf,0xb7,0xd3,0x78,0x2b,0xfe,0xfa,0xf6,0xb9,0xf9,0x88,0xec, | ||||
| 0xcf,0x57,0x9f,0x56,0x5,0xfd,0xf9,0x1e,0x5,0xc5,0xc9,0x57,0xd9,0xd6,0x9f,0x99, | ||||
| 0x6f,0xea,0x9d,0x3f,0x72,0xe6,0xab,0xa1,0x9e,0xaf,0xd6,0x68,0xa4,0x7c,0x95,0x7a, | ||||
| 0xfd,0x15,0xd7,0x77,0xee,0x9b,0xdf,0x72,0xe4,0xab,0x3,0x3d,0x1f,0x3c,0xa6,0x91, | ||||
| 0xf2,0x55,0xea,0xf5,0x57,0x5c,0x5f,0xd8,0xf3,0x65,0x4f,0xf4,0xfd,0x9b,0x2a,0x3f, | ||||
| 0xda,0x2e,0x9e,0xf,0x0,0x0,0x12,0x4f,0x49,0x44,0x41,0x54,0xa3,0x91,0xf2,0x55, | ||||
| 0xc2,0xfd,0xaf,0x66,0xf9,0x42,0xf6,0x6f,0x37,0x7d,0x6c,0xfc,0xb5,0xf3,0x15,0xa, | ||||
| 0xf0,0x35,0xc0,0x42,0xdb,0x6f,0xa4,0xfb,0x5e,0x31,0xcf,0x3f,0x35,0x5f,0x6d,0x31, | ||||
| 0x1f,0xff,0xf8,0xc6,0xdf,0xff,0x6a,0xf,0x1f,0x9a,0x3e,0xf9,0x7e,0xd9,0xf4,0x15, | ||||
| 0x37,0xa3,0xfa,0xcc,0x7c,0xc5,0xde,0x4f,0x77,0xd5,0x6a,0x3f,0xc8,0xbf,0x3e,0xe2, | ||||
| 0xef,0x7f,0xd5,0x3a,0xed,0x9b,0x3e,0xd4,0x34,0xa6,0x17,0x55,0x50,0x6d,0x86,0x6f, | ||||
| 0x7c,0x19,0x16,0xa,0x80,0xf5,0x2f,0xce,0x7c,0xc5,0x7c,0x80,0xd7,0xbf,0x24,0xd9, | ||||
| 0xff,0x6a,0xed,0x98,0xf9,0x60,0xd7,0xf4,0x29,0xd8,0xf2,0x1d,0xf1,0xcf,0x3f,0x78, | ||||
| 0x1f,0xd5,0x6a,0xdb,0x1c,0x9f,0x75,0x7d,0x6c,0xf0,0xfa,0xe7,0x24,0xfb,0x5f,0x9, | ||||
| 0xd8,0xf2,0x61,0xe6,0xa3,0x96,0x6f,0x97,0x9f,0x9f,0xe1,0x9b,0xaa,0xcf,0xde,0x5f, | ||||
| 0x94,0xe3,0xe3,0x8e,0x6f,0x49,0xf6,0xbf,0x72,0xfa,0xb6,0x99,0xcf,0x3a,0xff,0xd6, | ||||
| 0xf9,0x3e,0xb0,0x66,0x3d,0x3f,0xa8,0xe7,0x2b,0x76,0x7d,0x84,0xcd,0xf,0xd2,0x64, | ||||
| 0xfb,0x5f,0x39,0x7c,0xd3,0x5b,0xbe,0xf6,0x5b,0xe7,0xd5,0xaf,0x74,0x9f,0xfb,0xf9, | ||||
| 0xc1,0x68,0xf9,0x2a,0xc9,0xf8,0xe6,0xf0,0x51,0xff,0xf1,0xd,0x6e,0xbf,0x24,0xf9, | ||||
| 0x85,0xb4,0xe3,0xef,0xaf,0xb2,0x66,0xfb,0x80,0xff,0xfa,0xd8,0xcd,0xd6,0x17,0xf5, | ||||
| 0xfd,0x74,0xce,0xfe,0x5,0xdb,0xfd,0x8b,0xe8,0xeb,0x5f,0x8e,0x12,0xfb,0x78,0xd7, | ||||
| 0x6f,0x12,0x9f,0xb3,0x7f,0x16,0xb8,0xfd,0x33,0xe7,0xfd,0x24,0x70,0xd,0x9,0x46, | ||||
| 0xff,0x17,0x54,0xbf,0x82,0xbc,0xfe,0x2f,0x89,0x2f,0xc2,0xfd,0xb9,0xbf,0x7f,0x86, | ||||
| 0x81,0xf5,0x2b,0x76,0x7f,0xde,0xe1,0x8d,0x1f,0x4,0xbc,0x4e,0xe7,0xe1,0xf3,0xb5, | ||||
| 0x1f,0xb2,0xf2,0x55,0xcf,0x5d,0x1f,0x42,0x1d,0xd3,0xf7,0x88,0x37,0xfe,0x92,0x36, | ||||
| 0x9c,0x47,0xfb,0xfd,0x3e,0x24,0xbf,0x78,0x7d,0x8f,0xd8,0xf1,0xe5,0xe5,0x97,0x84, | ||||
| 0xfb,0x5f,0xcd,0xf2,0x9d,0xa,0xd1,0x7d,0x95,0x30,0x9f,0x34,0x1f,0x5f,0x58,0xbe, | ||||
| 0xd2,0x7d,0xaf,0x54,0xad,0xfa,0x95,0xe5,0xe3,0x1d,0xdf,0xc5,0xfb,0x6,0xfa,0xf5, | ||||
| 0xc1,0xe6,0x8f,0xe4,0xab,0x13,0x18,0x96,0xaf,0x12,0xee,0x7f,0x15,0xc9,0xb7,0x55, | ||||
| 0x77,0x3c,0xf8,0x3d,0xfe,0x4a,0xc5,0x35,0x3f,0x68,0xcd,0x6f,0x3d,0x81,0x61,0xfd, | ||||
| 0x4b,0xf6,0xf7,0x6f,0x47,0x56,0xff,0x57,0x7d,0xbe,0xe5,0xe8,0x5f,0x6a,0xd,0xfe, | ||||
| 0xfc,0xe0,0xef,0x59,0xfd,0x5,0x66,0xb8,0xff,0x55,0x88,0xcf,0x1a,0xdf,0x8,0x7e, | ||||
| 0x69,0x87,0xe3,0x33,0xf3,0x95,0x3d,0x3f,0x38,0x97,0xfd,0xaf,0x82,0x7d,0x56,0x3e, | ||||
| 0x20,0xd4,0xe9,0x3,0xb5,0xa6,0xd3,0xe7,0x98,0x1f,0x84,0xf3,0xa8,0x5f,0x85,0xf8, | ||||
| 0xac,0xf5,0x57,0x47,0xaf,0xb9,0x7d,0x9e,0xf5,0xed,0x73,0xad,0x5f,0x45,0x69,0x3f, | ||||
| 0xfc,0x86,0xdb,0x17,0xfb,0xf9,0xbc,0xb9,0xf8,0x76,0x33,0xf5,0x65,0x5f,0xbf,0xb7, | ||||
| 0xf3,0x55,0xf5,0x5e,0x2b,0x96,0x2f,0xcb,0xfd,0xaf,0x66,0xd4,0x87,0xf4,0xf5,0x7, | ||||
| 0xae,0xfe,0xf,0xde,0xaf,0x1a,0xf3,0x83,0xc1,0xbe,0x2c,0xf7,0xbf,0xa,0xf7,0x71, | ||||
| 0xd6,0x5f,0x59,0xf9,0x2a,0xd8,0xe7,0xda,0xff,0xea,0xee,0xcd,0xcb,0x86,0x6f,0x3a, | ||||
| 0x8f,0xf9,0x19,0xbf,0xcf,0xca,0x57,0xc1,0x3e,0xd7,0xfe,0x57,0xd5,0xde,0xc4,0xf0, | ||||
| 0x9d,0x2f,0xc6,0x67,0x8d,0xbf,0xc1,0x3e,0xd7,0xfe,0x57,0x95,0xd1,0x64,0x7e,0xc7, | ||||
| 0x97,0xdc,0x49,0xeb,0x7b,0xa9,0x32,0x22,0xf3,0xf3,0xd1,0x9f,0xa6,0xf7,0x49,0x37, | ||||
| 0x99,0x6f,0xe,0xf3,0xbf,0x62,0x5a,0xdf,0xab,0x15,0xf8,0x11,0xf3,0xd5,0x17,0x71, | ||||
| 0xfd,0xc6,0xf7,0xb1,0xf3,0x2f,0xdd,0xfa,0x3,0xd7,0xf3,0x47,0xec,0x67,0x4c,0xef, | ||||
| 0xd2,0xd4,0x3e,0xf5,0xfa,0x48,0xb1,0xff,0x15,0xf0,0xfd,0xc,0xed,0xf9,0xad,0x90, | ||||
| 0xfa,0x41,0x4c,0x5f,0x55,0xeb,0x5f,0xd2,0xee,0x3f,0xa4,0xf,0xe0,0xcc,0x21,0x17, | ||||
| 0x43,0xeb,0x2f,0xb3,0x7c,0x9e,0xfd,0xdb,0xab,0x5a,0xff,0x9c,0xf5,0xfe,0x57,0xc1, | ||||
| 0xcf,0xf,0xc6,0xf5,0xa5,0xde,0xff,0x8a,0xce,0xb9,0xfd,0xd8,0xb7,0x4a,0xb5,0xbf, | ||||
| 0x59,0x86,0xe7,0x1f,0xf7,0xb3,0x9b,0x81,0x8f,0x7b,0xfd,0x66,0xe4,0x4b,0xb1,0xff, | ||||
| 0x55,0xf0,0x67,0xd6,0xfa,0xd,0xfe,0xfb,0x7,0xa9,0xb9,0x8e,0xd7,0xfb,0xad,0x92, | ||||
| 0xae,0xbf,0x4a,0xee,0xd3,0xdf,0x5f,0xe6,0xf7,0x99,0xeb,0xc8,0x39,0xbe,0xe4,0xfb, | ||||
| 0x27,0x26,0xf2,0x11,0x10,0xe0,0xbb,0x15,0xe4,0xdb,0x58,0xac,0xef,0x57,0x1,0xbe, | ||||
| 0xa0,0xe3,0xbb,0x88,0xf5,0x1b,0xe,0x9f,0xf2,0x71,0xce,0x7d,0xbd,0x98,0xd7,0xc7, | ||||
| 0x82,0x7d,0x38,0xe0,0xfa,0xa0,0x4b,0xf4,0xad,0x7f,0x6f,0x2c,0xcb,0xfd,0xe2,0x96, | ||||
| 0xb6,0xfe,0x0,0x71,0x7d,0x64,0xa9,0xbe,0x9a,0x4,0xab,0xd5,0xdb,0xa8,0xaa,0xad, | ||||
| 0x7f,0x19,0x1c,0xe5,0xd0,0x7,0x2a,0x15,0xf1,0xf6,0x4,0x7,0xaf,0xcf,0xa1,0x57, | ||||
| 0x97,0xe8,0x23,0x18,0x54,0x20,0xbd,0x33,0xa1,0x20,0xde,0xf8,0x86,0x16,0xb4,0xbe, | ||||
| 0x49,0xf5,0xbd,0xe,0xc9,0xe4,0x32,0x35,0xe6,0x7,0x4b,0x39,0xf4,0x9,0x15,0x32, | ||||
| 0x21,0x39,0x6e,0xbf,0x4a,0xa5,0x35,0x21,0x58,0xc,0xf5,0x61,0xf9,0x2b,0x45,0x7a, | ||||
| 0xa9,0xfd,0xca,0xda,0x83,0x31,0xad,0x6f,0x6e,0xa6,0x7a,0x7e,0x35,0xa6,0x4f,0xbd, | ||||
| 0x7e,0x6b,0x13,0x5a,0x9d,0xe1,0xc3,0xa,0xa2,0x6b,0x0,0xee,0xec,0xc0,0xb5,0xba, | ||||
| 0xb6,0xb5,0xf0,0xa2,0x7c,0xb4,0x76,0x32,0x96,0xc7,0xb7,0xe9,0x96,0xbe,0xbf,0xe8, | ||||
| 0x61,0x88,0xf,0x6b,0xbe,0xde,0xe,0x68,0xd5,0x16,0xea,0x13,0x8c,0xa,0x96,0x91, | ||||
| 0xaf,0x60,0x4,0x1f,0xae,0xe1,0x5a,0xaa,0xfd,0xaf,0xe2,0xf9,0x44,0xeb,0x96,0x2f, | ||||
| 0x30,0x5f,0xe9,0xe7,0xdf,0xd3,0xaa,0xaf,0x5d,0x71,0xfa,0x92,0xae,0xbf,0x4a,0x91, | ||||
| 0xaf,0xf6,0x42,0xdb,0xef,0x12,0x80,0xdd,0x7,0x0,0x55,0x51,0x2d,0xd1,0xfe,0x57, | ||||
| 0x73,0xcb,0x2f,0xcc,0x57,0x55,0x7d,0x22,0x80,0x55,0x58,0x4b,0xb2,0xff,0x55,0x16, | ||||
| 0x3e,0x25,0xd4,0x57,0xd3,0x7d,0x3f,0xba,0xe,0x6a,0x49,0xf6,0xbf,0xca,0x22,0x5f, | ||||
| 0xf1,0x7c,0x97,0x54,0x18,0xd2,0xfb,0x97,0xba,0x36,0xb5,0x4,0x85,0x8a,0x58,0x4b, | ||||
| 0xb2,0xff,0x55,0x8a,0x7c,0xa5,0xa8,0xf9,0x6a,0x2b,0x28,0x5f,0xad,0x9d,0x92,0x1a, | ||||
| 0x94,0xff,0xa9,0xda,0x3f,0xaf,0xb5,0x5f,0xa9,0x8a,0x63,0x5a,0x59,0xdd,0x4c,0xb2, | ||||
| 0xff,0x55,0x8a,0x7c,0x75,0x4f,0x42,0xd5,0x6a,0x50,0xbe,0x5a,0x3b,0x56,0x6a,0xfd, | ||||
| 0xab,0xdf,0xf4,0x7f,0xab,0xa4,0xef,0x1f,0x8c,0x9f,0xaf,0xde,0x97,0x26,0x58,0x8, | ||||
| 0x1a,0x3f,0xd6,0xd4,0xe3,0xdb,0xfa,0xfc,0x63,0x9e,0xef,0x5e,0xb6,0xbe,0x75,0x73, | ||||
| 0x65,0xaf,0x2f,0x5f,0x29,0x93,0x9,0xfd,0x6e,0x98,0xaf,0x3e,0xea,0x51,0x72,0xc9, | ||||
| 0xe7,0x4b,0xf4,0xfe,0xc1,0xe0,0xf,0xdb,0xc6,0xdd,0x97,0xaf,0x14,0x35,0x5f,0x5d, | ||||
| 0xf,0xca,0x57,0xea,0xf5,0xf1,0x66,0x6b,0xd4,0xe3,0x1f,0x8a,0x6c,0xc7,0x37,0x1a, | ||||
| 0x90,0xaf,0x14,0x35,0x5f,0x5,0xce,0x6f,0x55,0x31,0xbd,0xd7,0xf3,0xfa,0xc6,0xd7, | ||||
| 0x93,0xad,0xbf,0x4a,0xe2,0x33,0xf2,0x55,0xa0,0xaf,0xa6,0x1e,0x5f,0xd5,0xa7,0x25, | ||||
| 0x2c,0x7b,0x78,0x86,0x7,0xc9,0xd7,0xf,0xc5,0xf4,0xa9,0xd7,0x6f,0x5d,0xcd,0x57, | ||||
| 0x81,0xbe,0xba,0xea,0x1b,0xa9,0x3e,0xb5,0x7,0xec,0x58,0xbf,0x9,0x86,0xb,0xf2, | ||||
| 0xe9,0xf9,0x4a,0x91,0xa8,0xde,0xff,0x9d,0xe0,0x80,0xeb,0x63,0x72,0x55,0xf3,0xe1, | ||||
| 0x47,0xec,0xf7,0x4e,0xe7,0xe2,0x2b,0xec,0xb4,0x67,0xe4,0x2b,0x7d,0xff,0x2b,0xf9, | ||||
| 0x7e,0xc9,0xdc,0x5f,0xb4,0x88,0xdc,0x23,0x1c,0xf4,0xf8,0x6e,0x67,0xea,0x23,0xf8, | ||||
| 0x21,0x10,0xc2,0xf3,0x95,0xbe,0xbf,0x40,0x95,0x3d,0x7f,0x24,0xa1,0xa1,0x3b,0x61, | ||||
| 0x79,0x7c,0xed,0x93,0x4c,0x7d,0x8a,0xf2,0x8e,0xb1,0x61,0x77,0x70,0xbe,0x32,0xf6, | ||||
| 0x97,0xea,0x9a,0xbe,0x11,0x3e,0x8,0x6f,0x3f,0x9a,0xad,0x8f,0xce,0xf2,0x29,0x86, | ||||
| 0x4f,0x2e,0x9b,0x3e,0xda,0xf0,0xf8,0x36,0x69,0xd9,0xf0,0xb5,0xb,0xda,0xfa,0xa6, | ||||
| 0xac,0x7d,0x1f,0xcc,0xf2,0xe9,0xfb,0x5f,0x55,0x30,0x70,0xfb,0xb4,0x19,0x85,0x82, | ||||
| 0xee,0x7b,0xc0,0x7c,0xc6,0xfe,0x57,0x52,0xa6,0xfd,0x9f,0x72,0x38,0xcb,0x87,0x8d, | ||||
| 0xfd,0xaf,0x28,0x30,0xd7,0x5f,0x51,0x63,0x93,0x98,0xa9,0xfe,0x7a,0x58,0x6d,0xb9, | ||||
| 0xce,0x9f,0xa,0xe,0xdf,0x9,0x38,0xc9,0xd6,0xa7,0xfc,0x2c,0xc8,0x47,0x8a,0x5b, | ||||
| 0xda,0xfe,0xa2,0xc8,0xd8,0x5f,0xca,0xf4,0x61,0x85,0x18,0xd7,0xef,0x54,0x13,0x69, | ||||
| 0x9,0xb,0x3e,0x2c,0x39,0x8e,0x6f,0xd6,0xe3,0x5b,0x98,0xf,0xe9,0xf7,0xbf,0x3, | ||||
| 0xc3,0xd7,0x65,0xbe,0xf3,0x55,0xdb,0xa7,0xff,0xdb,0xf6,0x26,0x6b,0xbf,0x83,0xec, | ||||
| 0x7d,0x4,0x3f,0xe6,0xf4,0x2f,0xc6,0x97,0x1c,0xf9,0xa,0xa0,0xa6,0x68,0xf8,0x8, | ||||
| 0x42,0x5e,0xdf,0x80,0xf9,0xae,0xcf,0x21,0x1f,0x70,0xfb,0x67,0xd3,0x47,0x8b,0x96, | ||||
| 0x4f,0xbe,0x6f,0x5e,0xbf,0xb4,0xe8,0xf3,0xc9,0xa6,0x6f,0x3a,0x97,0xfa,0xb,0xd, | ||||
| 0xba,0xff,0x20,0x97,0x69,0xd8,0xfa,0x2b,0x6a,0xbf,0x5a,0xc7,0x9c,0x17,0x3c,0x5d, | ||||
| 0xb0,0x8f,0xd0,0xe0,0xfd,0xf,0x78,0xed,0x7,0x17,0xed,0xc3,0xd1,0x7c,0x63,0xc7, | ||||
| 0xf5,0x9b,0x7d,0xfd,0x34,0xd8,0x17,0x92,0xaf,0x5c,0xbe,0x3d,0x47,0xff,0xb7,0x50, | ||||
| 0x9f,0x91,0xaf,0xf8,0xf3,0x83,0x53,0x6b,0xfa,0x77,0xbb,0xe8,0xf2,0x91,0x45,0xf9, | ||||
| 0xcc,0xf1,0x43,0x9f,0x1f,0x6c,0xcb,0xe6,0xf3,0xf1,0x1c,0xdf,0xdb,0x65,0xd3,0x37, | ||||
| 0xb9,0x9e,0xd1,0xfb,0x7,0x63,0xf9,0x88,0xbe,0xff,0x41,0x55,0x2c,0x7,0xd5,0x77, | ||||
| 0xff,0x94,0x8d,0xbf,0xd2,0x41,0x46,0xef,0x1f,0x4c,0xe0,0xab,0xf4,0xc5,0x20,0xdf, | ||||
| 0x6,0xf3,0xf5,0x87,0xcb,0x38,0xbe,0x8a,0xb1,0xff,0x95,0x12,0xe8,0xdb,0x5c,0xb2, | ||||
| 0x4f,0x99,0xe1,0x3,0xce,0x7c,0x9a,0xea,0xfd,0x83,0x89,0x7c,0xd8,0xd8,0xff,0xa, | ||||
| 0x8b,0xb3,0xe6,0x17,0x2c,0x5f,0x7d,0x41,0xfd,0x4b,0x71,0xb,0xb2,0xfa,0x15,0x80, | ||||
| 0x28,0xd8,0x87,0xdd,0xbe,0x8c,0xd7,0x1f,0x4,0xfb,0x50,0xb5,0xc3,0xea,0x57,0x0, | ||||
| 0xfe,0x6d,0x29,0xc8,0x67,0x15,0x30,0xe1,0x41,0xca,0xf7,0xf,0xc6,0xf4,0x4d,0xb0, | ||||
| 0xbd,0xbf,0x28,0x12,0x3,0xdb,0x8f,0x10,0x47,0x7d,0x23,0xf5,0xfa,0x97,0x38,0x3e, | ||||
| 0x6a,0xef,0x2f,0xea,0xed,0x9f,0x9d,0xeb,0x87,0x84,0x7f,0x6f,0xd7,0x87,0x16,0xe9, | ||||
| 0xbb,0x4c,0xbd,0xfb,0x8b,0xf2,0x7d,0xef,0x6d,0xb2,0x6,0xcc,0x60,0xfd,0x55,0xac, | ||||
| 0x7c,0x55,0x89,0xb4,0xfe,0x6a,0x6f,0xd3,0xfe,0xfd,0x45,0xb6,0x1f,0xc1,0x85,0x48, | ||||
| 0xeb,0xff,0xf6,0xa,0xcb,0xf1,0xd1,0x2a,0x8c,0xe4,0x7b,0xb0,0xe1,0xf2,0x2d,0xec, | ||||
| 0xfa,0xa5,0x7a,0xff,0x77,0x12,0xf0,0xfc,0x20,0xb2,0xde,0xaf,0xbb,0x7b,0xe8,0xf2, | ||||
| 0x2d,0xaa,0xff,0x73,0xe7,0x2b,0xf3,0xfe,0x48,0x2e,0x15,0x37,0xd,0xdf,0xd0,0xda, | ||||
| 0xdf,0x7b,0x8a,0x5d,0xbe,0x45,0x8d,0x1f,0xee,0x7c,0xd5,0x4,0xac,0x7e,0x55,0x33, | ||||
| 0x7c,0x7,0x81,0xfb,0x4b,0x6d,0x2c,0x23,0x5f,0xb1,0xfb,0xf3,0x11,0x36,0x7d,0x28, | ||||
| 0xd3,0xfd,0xaf,0x52,0xe4,0x17,0x63,0xff,0x2b,0x6a,0xd5,0x87,0xb0,0xe9,0xd3,0xf6, | ||||
| 0x67,0x90,0xaf,0xee,0x60,0xa,0x37,0x73,0xe0,0x23,0x56,0x7d,0x6d,0x9f,0xf9,0xe4, | ||||
| 0xf2,0x11,0x1e,0x3d,0x3c,0xa5,0x9d,0xda,0x32,0x7d,0x18,0x79,0xea,0x57,0xac,0xfd, | ||||
| 0xb4,0xe7,0x7,0xf1,0xe8,0x9d,0xe3,0xd6,0xa3,0xe5,0xf8,0x88,0x39,0x3f,0x8,0xdd, | ||||
| 0xf5,0x2b,0xcb,0xa7,0xed,0xcf,0xa0,0xfa,0x70,0x17,0xe2,0xe5,0xf8,0xcc,0xf9,0xc1, | ||||
| 0x5d,0x77,0xfd,0xca,0xba,0x3e,0xb4,0xfd,0x19,0xf0,0xe8,0x83,0xe5,0xf9,0x26,0x76, | ||||
| 0xfd,0x0,0x20,0xd6,0xbf,0x10,0xd6,0xbf,0xe8,0xcf,0x6f,0xc9,0x57,0x3f,0xc0,0x43, | ||||
| 0x88,0x96,0xe4,0xb3,0xeb,0x2f,0xce,0xfa,0xd5,0xa6,0xc3,0x87,0x95,0x9f,0xa9,0x3e, | ||||
| 0xc7,0x2b,0x17,0x17,0x5b,0xbf,0x9a,0xb9,0xbf,0xa8,0xe6,0xeb,0x42,0xb0,0x1c,0x5f, | ||||
| 0x58,0xfd,0xca,0x6a,0xbf,0xc7,0xaa,0x4f,0x5c,0x92,0xf,0x47,0xf0,0xed,0xe0,0x16, | ||||
| 0x5c,0xf5,0x7d,0xb7,0xa5,0xd7,0xaf,0xb2,0xdd,0xff,0x2a,0x55,0xfd,0x2a,0x60,0xff, | ||||
| 0x2b,0x9c,0xe9,0xf3,0xd3,0x29,0xf2,0xd5,0x90,0x9f,0xaf,0x4e,0x3b,0x59,0xee,0x7f, | ||||
| 0x95,0x22,0xbf,0x1c,0xf0,0xf3,0xd5,0xf1,0xa3,0x2c,0xf7,0xbf,0x4a,0xe1,0x43,0xfc, | ||||
| 0x7c,0x85,0x61,0x96,0xfb,0x5f,0xa5,0xc8,0x2f,0x88,0x9f,0xaf,0x2,0x7d,0xd,0x90, | ||||
| 0x13,0x5f,0x56,0xfb,0x5f,0x65,0x93,0xaf,0x44,0x96,0xaf,0x10,0xf3,0x65,0xb5,0xff, | ||||
| 0x55,0xca,0x7c,0x65,0xec,0x2f,0xa5,0xbf,0x2e,0x44,0xcf,0x57,0x30,0xac,0x7f,0xc9, | ||||
| 0x7e,0xfd,0xd5,0xcc,0x7c,0x65,0xf8,0xfa,0x94,0xe5,0x2b,0xc0,0x7c,0x59,0xed,0x7f, | ||||
| 0x95,0x49,0xbe,0x62,0xeb,0xf,0x48,0xc8,0xfb,0x93,0xe9,0x1c,0xd6,0x5f,0x45,0xcd, | ||||
| 0x57,0x77,0x4b,0x2c,0x5f,0xad,0x86,0xfb,0x32,0x5e,0x7f,0x15,0x9a,0xaf,0xe0,0x42, | ||||
| 0xf6,0xbf,0x4a,0x9e,0xaf,0xe0,0x82,0xf6,0xef,0x4c,0x9a,0xaf,0x40,0xae,0x7d,0x61, | ||||
| 0xeb,0xdb,0xf3,0x91,0xaf,0xa,0xa1,0xf5,0xab,0x9c,0xe4,0x2b,0x73,0x7e,0x50,0x60, | ||||
| 0xf9,0xa,0xb2,0xfa,0x15,0x6f,0xfc,0x58,0xbc,0x8f,0xe8,0xf3,0x1f,0x55,0xf6,0xfe, | ||||
| 0x41,0x89,0xed,0x7f,0x75,0xd0,0xe4,0x8d,0xbf,0xcb,0xf2,0x55,0x7a,0x2,0xcb,0x57, | ||||
| 0xe6,0xfe,0x57,0xa8,0xc9,0xcb,0x2f,0x8b,0xf7,0x19,0xfb,0x23,0x55,0xd8,0xf8,0x3b, | ||||
| 0x62,0xe3,0x6f,0xfe,0x7d,0xf9,0x38,0xbe,0xd8,0xd8,0xff,0xca,0xf4,0xa9,0xf9,0xca, | ||||
| 0xf2,0x2d,0xf9,0xfa,0x50,0xf3,0x15,0xb0,0xe7,0x7,0x7d,0xf9,0xa,0x35,0x97,0xdc, | ||||
| 0xbf,0xa8,0xf9,0x6a,0xdb,0x9e,0x1f,0x4,0xcc,0x87,0x99,0x6f,0x7f,0xd9,0xfd,0xf3, | ||||
| 0x4,0xdf,0x72,0xcc,0xf,0xa,0x2c,0x5f,0xcd,0x65,0xff,0xab,0x64,0xf9,0xa,0x38, | ||||
| 0xe6,0x7,0x5,0x96,0xaf,0x72,0xe3,0x63,0xcf,0xf,0xe6,0x37,0x5f,0x81,0x8b,0x7c, | ||||
| 0x95,0x2a,0x5f,0x81,0x9c,0xe7,0x2b,0xcd,0x87,0x63,0xbd,0x1f,0x67,0xf1,0xe3,0xc7, | ||||
| 0x69,0xc0,0xfc,0x20,0xcd,0x49,0xbe,0x3a,0xee,0xf1,0xeb,0x57,0x34,0x4f,0xe3,0x2f, | ||||
| 0xa7,0x7e,0x45,0x73,0x92,0x5f,0xf0,0x6f,0xa8,0x7b,0xfd,0x38,0xf3,0xbd,0x97,0x13, | ||||
| 0xdf,0xff,0xd,0xf0,0xfd,0x4d,0x4e,0x8e,0xaf,0xb9,0xfe,0xa,0xb0,0x7c,0xc5,0x7c, | ||||
| 0x78,0xf9,0xf9,0x6a,0xcb,0x3a,0xff,0x98,0xf,0x2b,0x96,0x2f,0x7,0xf9,0xaa,0xca, | ||||
| 0xfa,0x3f,0xce,0xfc,0x20,0xcd,0x41,0xbe,0xaa,0xce,0x9a,0x1f,0x5c,0x72,0xbe,0xaa, | ||||
| 0xce,0x9a,0x1f,0x5c,0x72,0xbe,0xaa,0xe6,0x3c,0x5f,0x55,0x73,0x9e,0xaf,0xaa,0x39, | ||||
| 0xcf,0x57,0x5f,0x84,0xf9,0xc1,0x40,0x5f,0x4e,0xf2,0x95,0xdb,0x27,0x5f,0xb1,0xea, | ||||
| 0xcf,0x39,0xc9,0x57,0x6e,0x1f,0x1e,0x21,0x9c,0xaf,0x7c,0xe5,0xf5,0x61,0x94,0xaf, | ||||
| 0x7c,0x15,0xe8,0xdb,0xcf,0xa9,0xf,0xe6,0xf9,0xf8,0xca,0x57,0x6d,0x5f,0x2e,0xaf, | ||||
| 0xf,0xc5,0xf6,0xe5,0xb1,0x7f,0xb1,0xe7,0x7,0x97,0x9e,0xaf,0x2,0x7c,0x21,0xef, | ||||
| 0x77,0xce,0x83,0x2f,0xec,0xfd,0xce,0x4b,0xf7,0xe5,0x2a,0x5f,0x71,0xdb,0x2f,0x47, | ||||
| 0xf9,0xe5,0xb,0xef,0xcb,0xc7,0xf5,0x1b,0x58,0xbf,0xda,0xc8,0x53,0xfd,0x6a,0x70, | ||||
| 0xb7,0xc4,0xf2,0x95,0xb9,0xbe,0x98,0xa2,0x9c,0xd4,0xaf,0x80,0x5e,0xdf,0x10,0x59, | ||||
| 0x7d,0x43,0x9b,0xd7,0xa,0x7e,0x3f,0xdd,0x12,0x8e,0xef,0xaf,0x74,0x9f,0xf6,0x94, | ||||
| 0xba,0x91,0xf,0x4,0xd3,0x7,0x73,0x52,0x1f,0xfa,0x38,0xe7,0x3e,0xa3,0xfe,0xc7, | ||||
| 0xe6,0x8f,0x46,0xf8,0x3b,0xcc,0x97,0xab,0xf9,0x41,0xd3,0xa7,0xe6,0xab,0xe7,0x4c, | ||||
| 0x1f,0x58,0xe6,0xf5,0xf1,0x3d,0x59,0xee,0x5f,0x2e,0x16,0xec,0xfa,0x95,0x3d,0xff, | ||||
| 0xc6,0xea,0x2f,0x60,0x89,0xfd,0xb,0x91,0x50,0xf5,0xf6,0x4,0x41,0xbb,0x7e,0x65, | ||||
| 0xaf,0xbf,0xb2,0x7c,0x4b,0xec,0x9f,0x9,0x70,0xef,0x2f,0xea,0x7c,0x7f,0x63,0x1e, | ||||
| 0xea,0x57,0xa,0xa8,0xd0,0x3b,0x13,0xcc,0x7d,0xff,0xe0,0x66,0x3e,0x7c,0x64,0x72, | ||||
| 0x19,0xe7,0x76,0x7e,0x50,0xf7,0xe5,0x78,0xfe,0x4d,0xf5,0x85,0xef,0x2f,0xba,0x6c, | ||||
| 0x9f,0x84,0x6a,0x13,0x6d,0x29,0x62,0x4e,0xf3,0x15,0x39,0x91,0xc7,0xb7,0x49,0x51, | ||||
| 0xf3,0xe1,0xc3,0x1c,0xd6,0xaf,0xb4,0x47,0x8e,0xcd,0xfd,0xaf,0x4e,0xa1,0x9e,0xaf, | ||||
| 0xd6,0xca,0x2c,0x5f,0x6d,0xe4,0xe1,0xfe,0x5c,0xb0,0xf6,0xbf,0x32,0xf3,0x55,0xcb, | ||||
| 0xca,0x57,0xa2,0xe9,0x13,0x73,0x32,0xfe,0xee,0x51,0xf7,0xfe,0x57,0x2c,0xbf,0xfc, | ||||
| 0x38,0x57,0xf9,0xc5,0xf6,0xb1,0xf7,0xbf,0xbd,0x95,0x13,0x9f,0xf1,0xfc,0xe5,0x6f, | ||||
| 0xcb,0xbe,0xf9,0xd5,0x5c,0xcd,0xf,0xfe,0x6,0xb0,0x7c,0x85,0xf3,0x70,0x7d,0x9c, | ||||
| 0x9f,0xc,0xd4,0x7c,0xe5,0x98,0x1f,0xb4,0xe7,0xdf,0x70,0x1e,0xea,0x57,0x13,0x9, | ||||
| 0xaa,0xf9,0x2a,0xbf,0xf3,0x83,0x13,0x50,0xb9,0xed,0xdc,0xff,0xa,0xb2,0xf9,0x41, | ||||
| 0x5,0x55,0xf3,0x50,0x3f,0x90,0x0,0x54,0xf3,0xd5,0x77,0xed,0x7c,0xc5,0xe6,0x7, | ||||
| 0xf3,0x91,0xaf,0x54,0xdf,0x40,0xcd,0x57,0xd7,0x73,0x3b,0x3f,0xa8,0xb6,0xdf,0x24, | ||||
| 0xcf,0xf3,0x6f,0x12,0xa8,0xe4,0xdb,0x27,0xa9,0xed,0x87,0xf2,0x3b,0x3f,0x38,0x39, | ||||
| 0x81,0x12,0x31,0xfa,0x3f,0x1c,0xe0,0xdb,0x5b,0x66,0xff,0x87,0xec,0x7c,0xa5,0xef, | ||||
| 0x2f,0x3a,0xb8,0x6f,0xd5,0xaf,0x50,0x1e,0xee,0xcf,0xb1,0x9d,0xaf,0x8c,0xfd,0x9b, | ||||
| 0xd8,0xf3,0x3d,0x23,0x63,0x7f,0xd1,0x1c,0xe5,0x2b,0xee,0xfe,0xa2,0xaa,0x6f,0x33, | ||||
| 0x27,0xf9,0xc5,0xf0,0xfd,0xda,0xca,0x2f,0xd,0x36,0xfe,0xe6,0xc4,0x67,0xec,0x2f, | ||||
| 0x6a,0xaf,0x5f,0x63,0x3e,0x9c,0x93,0xe3,0x6b,0xec,0x2f,0xa,0xac,0x7c,0xc5,0xc6, | ||||
| 0xdf,0x65,0xae,0xbf,0xfa,0x70,0xba,0xa6,0xa8,0xf9,0x6a,0x93,0xf5,0x2f,0x80,0xf9, | ||||
| 0xb0,0x72,0x8e,0x72,0x90,0xaf,0xaa,0xb5,0xc7,0xe7,0xd2,0x44,0xbf,0xff,0xc5,0xdc, | ||||
| 0xfd,0x45,0x97,0x9c,0xaf,0x2a,0x8d,0xdf,0x9e,0x4b,0xee,0x7c,0x25,0xb2,0x7c,0x85, | ||||
| 0x96,0x3f,0xbe,0x11,0xd8,0x20,0xe7,0x93,0x9,0x2e,0xf2,0xf2,0x55,0x4e,0x7c,0xe8, | ||||
| 0xce,0x65,0x9c,0xd7,0xf5,0x57,0x9a,0x6f,0x7c,0x27,0xc2,0xfe,0x7,0xcb,0xf3,0xf5, | ||||
| 0x51,0x9e,0x7d,0xa8,0xb6,0x3,0x3f,0xc8,0x71,0xbe,0xba,0x3b,0x5d,0x83,0xef,0x98, | ||||
| 0xf9,0x2a,0x68,0x7e,0x10,0x2d,0xb1,0xff,0x13,0x1c,0xf5,0x2b,0x63,0x7e,0xd0,0xdc, | ||||
| 0xbf,0x4e,0xcd,0x57,0xec,0xfe,0x68,0xb8,0xc4,0xf1,0x43,0xab,0x51,0xb1,0x7c,0x65, | ||||
| 0xd4,0x37,0x44,0x96,0xf,0xac,0xfa,0xfd,0x30,0x47,0xf5,0xd,0x6b,0x7f,0x51,0x47, | ||||
| 0xfd,0xe5,0x20,0x27,0xf9,0xc5,0xc8,0xa7,0x3d,0xcb,0x87,0x73,0xe6,0x53,0x3c,0x3e, | ||||
| 0x36,0x3f,0xdd,0xc8,0x55,0xfd,0xaa,0x2b,0x7a,0xeb,0x57,0x1b,0x4b,0xbc,0x3e,0xbe, | ||||
| 0x27,0x2b,0x5a,0xfd,0xa,0xda,0xf5,0xab,0x3,0xd1,0x5b,0xbf,0x5a,0x62,0xff,0x42, | ||||
| 0x24,0x74,0x4f,0xab,0x5f,0x75,0xec,0xfa,0x95,0xb9,0xbf,0xa8,0xa3,0x7e,0x85,0x96, | ||||
| 0xd7,0x3f,0x13,0x50,0x79,0x5f,0xf5,0x39,0xf6,0x17,0x85,0xa2,0x98,0xa3,0xf9,0x41, | ||||
| 0x5,0x54,0x14,0xad,0x7e,0x65,0xef,0x2f,0xca,0xfa,0xe7,0x7c,0xd4,0xaf,0x34,0xdf, | ||||
| 0x40,0xcd,0x57,0x8f,0x72,0x9a,0xaf,0x8c,0xf6,0x23,0xb8,0x92,0xd3,0xfc,0xa2,0x4d, | ||||
| 0xf,0x6a,0xbe,0x42,0x5e,0x7d,0x12,0xaa,0xab,0x3e,0x4,0x73,0x9a,0xaf,0xc8,0x89, | ||||
| 0xda,0xff,0x49,0xa4,0x8,0x73,0xfa,0xfc,0xa0,0xbe,0x23,0xb1,0x3b,0x5f,0xb1,0xe7, | ||||
| 0x7,0xaf,0xe4,0xe2,0xf9,0x41,0xc1,0x97,0xaf,0x58,0xfd,0xde,0xce,0x57,0x38,0x57, | ||||
| 0xf9,0xca,0xff,0xfc,0x20,0xce,0x49,0x7e,0x31,0xf6,0xef,0x4,0xc0,0x9b,0xaf,0x86, | ||||
| 0xb9,0xf2,0xf5,0xcb,0x5e,0x5f,0x5e,0x8e,0x2f,0xf2,0xd4,0xaf,0x50,0xe,0xea,0x57, | ||||
| 0xa4,0xf1,0xb7,0x57,0xd9,0xfc,0x20,0x74,0xd7,0xaf,0x72,0xb1,0xbe,0x5d,0x79,0xaf, | ||||
| 0x7f,0x26,0x99,0xf3,0x83,0xde,0xfd,0x45,0x41,0xe,0xea,0x57,0xca,0xfb,0xfd,0x27, | ||||
| 0x92,0x73,0xff,0x2b,0xc7,0xfc,0xa0,0xb8,0xfc,0xf1,0x8d,0xe2,0xf7,0xfb,0xca,0xc4, | ||||
| 0xe9,0x73,0xd4,0xaf,0x56,0xf3,0xe0,0xfb,0x40,0xf5,0x5d,0xc6,0x9d,0xbc,0xce,0xf, | ||||
| 0xe2,0xc6,0xcb,0xca,0x24,0xbf,0xf5,0xa1,0x2f,0x80,0xef,0xa1,0x92,0xe7,0xf9,0x41, | ||||
| 0xa5,0xd1,0x57,0xd8,0xfc,0x20,0xcc,0x5f,0xbe,0xa2,0x8a,0x23,0x5f,0x75,0x3c,0xf9, | ||||
| 0x2a,0xf,0xcf,0x47,0x11,0x47,0xbe,0x7a,0xe4,0xc9,0x57,0x9d,0x9c,0x8d,0xbf,0xd0, | ||||
| 0x93,0xaf,0x1e,0xe5,0x2c,0x5f,0x41,0x4f,0xbe,0x62,0xc7,0x17,0xe5,0xdd,0x97,0xa3, | ||||
| 0xe3,0xab,0xe6,0x2b,0xd1,0xfb,0xfc,0x20,0x5c,0x6e,0xbe,0xfa,0x9a,0x27,0x5f,0x9, | ||||
| 0xde,0x7c,0x5,0x96,0x9b,0xaf,0x10,0x5b,0x7f,0x65,0xf8,0xec,0xf5,0xed,0xcc,0xb7, | ||||
| 0xb1,0xdc,0x7c,0xa5,0xfa,0x9c,0xf9,0x8a,0xad,0x3f,0x50,0x72,0xb1,0xff,0x95,0x9a, | ||||
| 0xaf,0xd0,0x1d,0x57,0xbe,0xba,0x5b,0x62,0xf9,0x2a,0x17,0xbe,0xf,0xfa,0xda,0xfc, | ||||
| 0x20,0xcc,0x71,0xbe,0xd2,0xe6,0xdf,0x60,0x8e,0xf3,0x95,0xe6,0x3,0x39,0xce,0x57, | ||||
| 0xaa,0x2f,0xbf,0xeb,0xdb,0xd5,0x7c,0x25,0xab,0xf9,0xaa,0x10,0x56,0xbf,0x82,0x39, | ||||
| 0xc9,0x57,0xe6,0xfc,0xa0,0xe0,0xad,0x5f,0x75,0x72,0x92,0xaf,0x8c,0xf5,0xd9,0x6c, | ||||
| 0x7f,0x51,0xbb,0x7e,0xf5,0x28,0x57,0xfb,0x5f,0xd9,0xfb,0x8b,0x32,0x5f,0x5e,0x9f, | ||||
| 0xcf,0xfb,0xc2,0xf8,0x96,0x79,0x7c,0xdb,0xa5,0x17,0xd4,0xfc,0x2,0x78,0xcf,0xf, | ||||
| 0xd6,0x72,0x90,0xaf,0x68,0x4b,0xea,0x4b,0x13,0xb4,0x1d,0xf6,0xfc,0xe0,0x52,0xdf, | ||||
| 0xf,0xd1,0x92,0xc0,0x6d,0x63,0xff,0x4e,0x7c,0x14,0xe4,0x5b,0xe6,0xfa,0xd8,0xfa, | ||||
| 0x13,0xe0,0x7a,0x3e,0xf,0xb2,0xfd,0x45,0xf3,0xf1,0xfc,0x20,0xad,0x63,0x70,0xe7, | ||||
| 0xb2,0xf3,0xf9,0x41,0xb6,0xbf,0x68,0x4e,0xd6,0xb7,0x6b,0xed,0x47,0xf2,0xfb,0xfc, | ||||
| 0x20,0xad,0x4b,0x20,0xcf,0xf9,0x45,0xf5,0xf5,0x27,0x4,0xe5,0xd7,0xd7,0x2,0x2f, | ||||
| 0xa8,0xf9,0x25,0xbf,0xfb,0x8b,0x8a,0x56,0x7e,0x39,0x9,0xf4,0x2d,0xb3,0xff,0x3, | ||||
| 0x56,0x7e,0x91,0xa8,0xb3,0x7e,0xe5,0xf4,0xe5,0x63,0x7f,0x6,0xdd,0x67,0xd5,0xaf, | ||||
| 0x9c,0xbe,0x7c,0xe4,0x2b,0xd3,0xd7,0x5,0x81,0xef,0xbf,0x5c,0xae,0xef,0xf3,0x9c, | ||||
| 0xfb,0x7e,0x97,0x4b,0xdf,0xb7,0xc1,0xb,0x66,0x7d,0x48,0x9f,0x4b,0x6f,0xc3,0x7c, | ||||
| 0xf9,0x8,0xb8,0xdd,0x37,0xe7,0xdf,0x8c,0xf3,0x2f,0x7f,0x3e,0x2d,0x5f,0x55,0x59, | ||||
| 0xff,0x97,0x37,0x9f,0x2,0xde,0xd0,0xf2,0x55,0xd5,0x37,0x3f,0x98,0x17,0x5f,0x5b, | ||||
| 0xcf,0x57,0x55,0xdf,0xfc,0xa0,0xe5,0x73,0xbc,0x9f,0x78,0x19,0xbe,0x9e,0x9e,0xaf, | ||||
| 0xaa,0x91,0xde,0xef,0xbc,0xc,0x5f,0x5f,0x32,0x7c,0x51,0xde,0xef,0xbc,0x1c,0x5f, | ||||
| 0xdf,0x3f,0xff,0x76,0x12,0xf9,0xbb,0xcd,0xff,0xfa,0xbd,0xf5,0x82,0x39,0xff,0x96, | ||||
| 0xe8,0xb3,0xc0,0xfd,0xf,0x2,0x3e,0x9f,0x17,0x8b,0x4b,0xf4,0x39,0xf6,0x3f,0x8, | ||||
| 0xf8,0x8c,0x26,0x68,0x99,0x3e,0x7b,0xfc,0xfd,0xa2,0xfa,0x50,0xde,0x7d,0x5b,0xb9, | ||||
| 0xf6,0x7d,0x5e,0xcc,0x79,0xfb,0xd1,0x5c,0xfb,0xc8,0x88,0x5c,0xf8,0xd2,0x1c,0xdf, | ||||
| 0xab,0x74,0xc1,0xfd,0x33,0xbf,0x6,0x54,0xc8,0xcd,0xf8,0x96,0x73,0x5f,0xb6,0x9f, | ||||
| 0xb,0xdf,0x85,0x2f,0xe6,0x7,0xad,0x83,0x5f,0x17,0xb,0x8,0x9f,0x4c,0xae,0x95, | ||||
| 0xbe,0xa7,0x28,0x68,0xe7,0x5a,0x9,0xe4,0xc9,0x77,0x8c,0x3a,0x6f,0x11,0x7c,0x7c, | ||||
| 0x2a,0x3d,0x19,0xc1,0xdb,0x67,0x67,0xe8,0xf9,0x11,0xdc,0xce,0x9b,0x4f,0x51,0x8e, | ||||
| 0x8f,0xc1,0x68,0x24,0x81,0x27,0x4f,0xa4,0xd6,0x8,0xde,0xca,0x97,0xef,0xe0,0x45, | ||||
| 0x85,0x1e,0x63,0x0,0xa1,0xa4,0x1a,0xa1,0xa8,0x32,0xf3,0xe4,0xeb,0xa1,0x83,0x7f, | ||||
| 0xf3,0x34,0xed,0xe1,0x5f,0xc2,0x92,0xf4,0x4b,0xcd,0x27,0x5d,0xcb,0x99,0xef,0xb7, | ||||
| 0x5d,0xe5,0xb0,0x87,0x3f,0x1,0xb0,0xf7,0x49,0xaf,0x7,0xc4,0xde,0x28,0x57,0xbe, | ||||
| 0x75,0xcd,0xa7,0xac,0xe3,0x3e,0x80,0xad,0x7e,0xab,0x5,0xc4,0xd6,0x71,0xae,0x7c, | ||||
| 0x3b,0xba,0x6f,0x7,0xf7,0x7b,0xb0,0xde,0x5f,0x5f,0x7,0x62,0xfd,0xb3,0x62,0x9e, | ||||
| 0x7c,0x42,0xb5,0xd7,0x25,0x58,0xa8,0xf5,0x5b,0x12,0xee,0x2b,0x8a,0xb8,0xa3,0x40, | ||||
| 0x90,0x33,0x9f,0xda,0x3f,0xb,0xb5,0xc3,0x9d,0x2b,0x5f,0x3e,0x54,0x7d,0x8f,0x2f, | ||||
| 0xe7,0xab,0x7f,0xbe,0x18,0x7f,0x2f,0x7c,0x17,0xbe,0xb,0xdf,0x85,0xef,0xc2,0x77, | ||||
| 0xe1,0xbb,0xf0,0x5d,0xf8,0x2e,0x7c,0x5f,0x28,0x1f,0x21,0x14,0x62,0xfd,0xc9,0x79, | ||||
| 0xee,0x7,0xd2,0xc3,0xe5,0xfa,0xa6,0xf7,0xe9,0xd6,0x29,0x11,0xa8,0xfe,0x7c,0x99, | ||||
| 0x59,0xe,0x3e,0x33,0xbe,0xd4,0xd1,0xff,0xbf,0xbd,0x64,0xdf,0x33,0xa4,0x78,0x34, | ||||
| 0xd,0xf4,0x6d,0xd1,0xff,0x2a,0x2c,0xd7,0xf7,0xd5,0x69,0x79,0xcf,0xe5,0x1b,0x3a, | ||||
| 0x7d,0x45,0x7a,0x6d,0xc9,0xbe,0x75,0x99,0x6e,0xc8,0x2,0x6d,0xb,0x9d,0xdd,0xe9, | ||||
| 0xb5,0xfa,0x58,0xa0,0x7b,0x54,0x2e,0xe,0x48,0xf1,0x4c,0x2e,0x52,0x48,0x8a,0xf4, | ||||
| 0xc6,0x92,0x7d,0x7f,0x7d,0x42,0xff,0xf9,0xef,0x54,0xdf,0x8d,0xcd,0x75,0xf9,0xf2, | ||||
| 0xf7,0x6,0xcf,0x9e,0x3e,0xa0,0x72,0xa1,0x7d,0xbf,0xf0,0xad,0x71,0x91,0xe,0xdf, | ||||
| 0xfe,0x2e,0x7d,0x66,0xc9,0xbe,0xe9,0xe0,0xe6,0xea,0xa0,0x4c,0x3b,0x57,0x4a,0x6f, | ||||
| 0xb,0x1f,0xbd,0xb0,0xff,0xec,0xa9,0x7a,0x7c,0x8f,0x3e,0x29,0x1f,0xad,0x1e,0x75, | ||||
| 0xe8,0x70,0xbb,0x43,0xbf,0xb5,0x6c,0x5f,0xfb,0x2b,0x97,0xda,0x25,0xda,0x79,0xbb, | ||||
| 0xbc,0x72,0xff,0xa9,0xc2,0x96,0xee,0x3b,0xdd,0xba,0xb9,0x5a,0xdc,0xef,0xd0,0x23, | ||||
| 0xd5,0xf7,0x2f,0x96,0xed,0xeb,0x18,0xfd,0xcb,0xdb,0xc2,0xca,0xdd,0xa7,0x4a,0xdb, | ||||
| 0x86,0x6f,0xfb,0xc6,0x6a,0xa9,0xd3,0xa1,0xa7,0xe5,0xe,0x7d,0x6a,0xe9,0xbe,0x8e, | ||||
| 0xe1,0xa3,0xe5,0x93,0x7f,0x28,0x5a,0x3e,0x95,0xd6,0xa1,0x67,0xe5,0xce,0xf0,0xf2, | ||||
| 0xb2,0x7d,0xfb,0xcc,0x57,0x3a,0xfa,0x87,0xef,0x6c,0x3d,0x73,0x7a,0xa4,0x1d,0xdf, | ||||
| 0x67,0x4e,0xcb,0xea,0xf1,0x95,0x85,0xce,0xde,0xb5,0xa5,0x5f,0x1f,0x45,0xcd,0xd7, | ||||
| 0xbe,0x42,0x37,0xc6,0x4f,0xfd,0xdb,0xf6,0x8d,0xd5,0x13,0x2a,0xaf,0xaa,0xff,0x28, | ||||
| 0xf,0x8a,0x74,0xba,0xb6,0xba,0xb7,0xbe,0x6c,0xdf,0xb8,0xa4,0xfb,0x6e,0xd0,0x7, | ||||
| 0xf2,0x53,0xf7,0xd4,0x8b,0xf9,0x4c,0xef,0x5f,0x56,0xcb,0x6a,0xff,0x32,0xbd,0x7f, | ||||
| 0x69,0x6f,0xc9,0xe3,0x9b,0xe3,0x3,0xb4,0xff,0x31,0x5a,0xb,0x12,0x23,0x3c,0x5c, | ||||
| 0xe4,0xab,0xb,0xdf,0x85,0xef,0xc2,0x77,0xe1,0xcb,0x9b,0xaf,0x9c,0x17,0xdf,0x86, | ||||
| 0x5c,0x56,0x73,0xc0,0x26,0xa5,0x85,0xb1,0x0,0xd4,0x31,0x64,0xcf,0xe9,0x23,0xca, | ||||
| 0xd2,0xef,0x7f,0x57,0x6,0xc5,0xb3,0xc1,0xb5,0x4b,0xf4,0xa1,0x9a,0x52,0xb7,0xa7, | ||||
| 0x25,0xfa,0x60,0xdb,0xe1,0x9b,0xde,0x5b,0xb6,0x6f,0xfa,0xcc,0xde,0xd6,0xd9,0xde, | ||||
| 0x95,0x7f,0x45,0xdf,0xfe,0xde,0xe6,0xb5,0x92,0x5c,0x52,0x33,0xbd,0xf3,0xab,0x7f, | ||||
| 0xb0,0xf4,0xf6,0x9b,0xc2,0xce,0x69,0xe7,0xda,0x19,0x2d,0x9f,0x6d,0x5f,0x29,0x9d, | ||||
| 0xa8,0xb7,0x97,0xeb,0x74,0x7b,0x4f,0x2e,0xad,0x3d,0x27,0xdf,0x24,0x74,0x7a,0x69, | ||||
| 0xe9,0xe7,0xdf,0x94,0x76,0x8e,0x3e,0x29,0x9d,0x91,0xf2,0xd9,0xc3,0x2b,0xdb,0x47, | ||||
| 0x9a,0xef,0x5e,0xf1,0xc1,0xf8,0xf2,0x8d,0x3f,0x18,0x5f,0xbb,0x4f,0xa7,0xbb,0x4b, | ||||
| 0xf7,0xc9,0xa4,0xb8,0xff,0x49,0x69,0x77,0x2a,0x9c,0xbc,0x5d,0xda,0x6e,0xb,0x74, | ||||
| 0xf8,0xf0,0x99,0xb2,0x7c,0xda,0xb9,0xb1,0x7e,0xf4,0x27,0xaa,0xef,0x6c,0xe9,0xbe, | ||||
| 0x93,0x69,0xa9,0xf3,0x8b,0xed,0x8d,0x29,0x3d,0xfa,0xef,0xdb,0xdb,0xeb,0x65,0xf5, | ||||
| 0xfc,0x7b,0x46,0x98,0x1e,0x75,0x6e,0xfc,0xf5,0xfe,0x27,0xcf,0xe6,0xc1,0x77,0x44, | ||||
| 0xb7,0xb6,0xfe,0xd7,0xf6,0x89,0x4c,0xf7,0xff,0x6c,0x7b,0x7b,0x5b,0xbb,0x3e,0x9e, | ||||
| 0xa1,0xed,0x61,0xe7,0xc6,0x2f,0x3a,0x9d,0x5c,0xf8,0xb6,0x68,0xa7,0xb4,0xbb,0x7d, | ||||
| 0x76,0x42,0xb7,0x36,0x54,0xdf,0xb6,0xee,0x5b,0x37,0x7c,0xff,0x2d,0xf,0xbe,0x12, | ||||
| 0xec,0x94,0xf7,0x1e,0x9e,0x9d,0xd2,0xd2,0xa6,0xe9,0x7b,0x96,0x5e,0x31,0x7c,0x1b, | ||||
| 0xaa,0x6f,0xb8,0xec,0xfe,0xe5,0xd2,0xe0,0xb2,0xd0,0xbe,0x76,0x69,0x48,0x56,0xd7, | ||||
| 0xaf,0xac,0xae,0x97,0xe8,0xde,0xfa,0xb3,0x5a,0x9f,0x7d,0xe5,0x17,0xed,0xe2,0xbe, | ||||
| 0xea,0xdb,0x5b,0x76,0xff,0xbc,0xa2,0xfa,0xd4,0xf1,0x63,0x38,0xbd,0xd4,0xfe,0x9a, | ||||
| 0x56,0xe8,0x78,0xb0,0xfe,0x2c,0x5d,0x19,0x5f,0xfe,0xca,0x2f,0x6,0xb9,0xf0,0x51, | ||||
| 0x8a,0x45,0x8a,0x5,0xed,0xf5,0x2e,0x48,0xd0,0xfe,0x4f,0xbb,0x69,0x3,0x5a,0xed, | ||||
| 0xf,0x8b,0x30,0xbf,0xf9,0xa5,0x93,0xef,0x7c,0x45,0x8a,0xf9,0xf6,0xa9,0x39,0xe6, | ||||
| 0x22,0x3f,0xff,0xa3,0xf3,0xfd,0x7f,0x6e,0x69,0x1,0x55,0x8,0x9e,0xa1,0x2b,0x0, | ||||
| 0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82 | ||||
| }; | ||||
| //m1284p.png: 12987 bytes
 | ||||
| @ -0,0 +1,777 @@ | ||||
| /*
 | ||||
|  * main.c | ||||
|  * | ||||
|  *  Created on: 22 íîÿá. 2018 ã. | ||||
|  *      Author: maxx | ||||
|  */ | ||||
| #include <avr/io.h> | ||||
| #include <util/delay.h> | ||||
| #include <avr/interrupt.h> | ||||
| #include <avr/pgmspace.h> | ||||
| #include <compat/deprecated.h>  //sbi, cbi etc.. | ||||
| #include "avr/wdt.h" // WatchDog | ||||
| #include <stdio.h>  // printf etc.. | ||||
| #include "uart_extd.h" | ||||
| #include "spi.h" | ||||
| 
 | ||||
| #include "globals.h" //Global definitions for project | ||||
| 
 | ||||
| #include "stdbool.h" | ||||
| #include "Ethernet/socket.h" | ||||
| #include "Ethernet/wizchip_conf.h" | ||||
| #include "Internet/httpServer_avr/httpServer.h" | ||||
| //#include "webpage.h"
 | ||||
| 
 | ||||
| #define _MAIN_DEBUG_ | ||||
| 
 | ||||
| //NIC metrics
 | ||||
| wiz_NetInfo netInfo = { .mac  = {0x00, 0x08, 0xdc, 0xab, 0xcd, 0xef}, // Mac address
 | ||||
| 		.ip   = {192, 168, 0, 199},         // IP address
 | ||||
| 		.sn   = {255, 255, 255, 0},         // Subnet mask
 | ||||
| 		.dns =  {8,8,8,8},			  // DNS address (google dns)
 | ||||
| 		.gw   = {192, 168, 0, 1}, // Gateway address
 | ||||
| 		.dhcp = NETINFO_STATIC};    //Dynamic IP configuration from a DHCP sever
 | ||||
| 
 | ||||
| 
 | ||||
| //#include "Application/loopback/loopback.h"
 | ||||
| //#include "Application/webserver_simple/webserver_simple.h"
 | ||||
| 
 | ||||
| /*
 | ||||
|  * (12) Try move pages to SD-CARD reader FatFS | ||||
|  * TODO | ||||
|  * 	OK 1) Try create minimal <index.html> to SD-READER, include FatFS from  <02_m1284p_FATFS_Chang_tst> and test working | ||||
|  * 	OK 2) Read all pages from (11) to folder <WWW> this project, then move it in root folder SD-Reader and test working | ||||
|  * 	OK 3) Clean code (done on v2.4b) | ||||
|  * 	OK 4) Remove unused files from project (done on v2.4b) | ||||
|  * 	OK 5) Need to handle <FIL fs> for every opened socket!! Because without this server is freeze, while download several large files | ||||
|  * 	 at once from SD-CARD. (done on v2.4c) | ||||
|  * 	 				Add and debug f_open(&fs, ..)/??f_close(&fs, ..) to: | ||||
|  * 	 				http_process_handler_avr (here actually already implemented..) | ||||
|  * 	 				OK + add f_open(&fs, ..) in <httpServer_run_avr(..)>  STATE_HTTP_RES_INPROC before <send_http_response_body_avr(..)> | ||||
|  * 	 				f_close(&fs) add to <send_http_response_body_avr(..)> and comment out in  <httpServer_run_avr(..)> | ||||
|  * 	 Works stable but download speed slow (~40-50kb/sec ~80kb/sec with SPI 4MHZ && _HTTPSERVER_DEBUG_ = ON), because on every download file for every transfer TCP-IP packet proceed sequence: f_open(&fs, ..)/f_lseek(&fs, /f_close(&fs, ..) | ||||
|  *	OK 6) Optimize (5) - Add to <_st_http_socket> structure <FIL fs> to avoid multiple re-open downloaded file | ||||
|  *	Works faster: ~80kb/sec with SPI 4MHZ && _HTTPSERVER_DEBUG_ = ON, ~110kb/sec SPI 4MHZ && _HTTPSERVER_DEBUG_ = OFF, ~150kb/sec ~80kb/sec with SPI 8MHZ && _HTTPSERVER_DEBUG_ = OFF | ||||
|  *	(done on v2.4d) | ||||
|  * | ||||
|  * (11) Try move all pages saved at <webpage.h> from RAM to FLASH address space | ||||
|  * Example of flash data access look at: | ||||
|  * <01_m1284p_bb00_minimum_PSTR_webpage_test> | ||||
|  * <09_m1284p_WIZNET_simple_webserver> | ||||
|  * | ||||
|  * Success initial porting on 10/12/2018 - FREE RAM on webserver: 7936 bytes (From total 16kbytes)! | ||||
|  * NEED further optimization to AVR_RAM->AVR_FLASH point (damn Harvard architecture :( )! | ||||
|  * | ||||
|  * It works on AtMega1284p(16kbytes RAM), but need TODO finish (DONE on v2.3b 12/12/2018)!! | ||||
|  * | ||||
|  * TODO DONE: | ||||
|  * After v2.3 optimization: | ||||
|  * 	(+4kb HTTP Buffers READ-WRITE(with HTTPD_MAX_BUF_SIZE	2048 see <globals.h>)) : FREE RAM on webserver: 10372 bytes - much better! (RAM enough for AtMega1284/AtMega2560 ie. AVR with 8-16Kb RAM) | ||||
|  * 	(+1kb HTTP Buffers READ-WRITE(with HTTPD_MAX_BUF_SIZE	 512 see <globals.h>)) : FREE RAM on webserver: 13444 bytes - awesome! 	   (RAM enough for AtMega644/AtMega128   ie. AVR with 4Kb RAM) | ||||
|  * | ||||
|  * OK 1) Father optimization <httpParser.c> / <httpParser.h> (v2.3 12/12/2018) | ||||
|  * OK 2) Father optimization <httpUtil.c> / <httpUtil.h> (v2.3 12/12/2018) | ||||
|  * OK 3) Rename httpServer.*->httpServer_avr.*, httpParser.*->httpParser_avr.*, httpUtil.*->httpUtil_avr.* (v2.3b 12/12/2018) | ||||
|  * 		 Actually made another way: rename parent folder <http> to <http_avr> | ||||
|  * OK 4) Fix not correct showed value on <ain_gauge.html> (v2.2 12/12/2018) | ||||
|  * OK 5) Correct indentation in all <*.html> and <*.js> sources and repack it again in <webpage.h>. (v2.2 12/12/2018) | ||||
|  * OK 6) Add <favicon.ico> to webserver (v2.1 12/12/2018) + also added binary files support in webserver via: <reg_httpServer_binContent_avr()..>, bin2hex_v2.py | ||||
|  * 7) Publish sources in my github, wiznetmuseim, avrfreaks etc.. (optional) | ||||
|  * | ||||
|  * (10) Try repeat example HTTPServer_LPC11E36_LPCXpresso on AVR Mega1284p (All pages still in RAM) | ||||
|  * Here used to WEB-server handle cgi-like requests, with AJAX + JSON | ||||
|  * Description here: | ||||
|  * http://wiznetmuseum.com/portfolio-items/w5500-evb-web-server/
 | ||||
|  * | ||||
|  * To better undestand AJAX look here (actually here used AJAX + XHTML): | ||||
|  * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/web-server-read-switch-using-AJAX/
 | ||||
|  * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/web-server-read-switch-automatically-using-AJAX/
 | ||||
|  * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/AJAX-read-switches-analog/
 | ||||
|  * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-AJAX-web-server/
 | ||||
|  * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-AJAX-XML-web-server/
 | ||||
|  * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-gauge/
 | ||||
|  * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-IO/
 | ||||
|  * | ||||
|  * To online encode text file to C source use online utility (Text->Cpp): | ||||
|  * https://tomeko.net/online_tools/cpp_text_escape.php?lang=en
 | ||||
|  * add option <split output into multiple lines> (this is for good reading into browser, as source code) | ||||
|  * after that insert in any text editor and replace <\n"> sequence to <\n"\> (this is for recognize multiple string into C-source headers) | ||||
|  * | ||||
|  * For prepare binary data (some image data, like favicon.ico) use <bin2hex_v2.py> script. | ||||
|  * Example usage: | ||||
|  * >bin2hex_v2.py favicon.ico | ||||
|  * >out favicon_ico.h | ||||
|  * After that insert into end <webpage.h> content from favicon.ico; | ||||
|  * Then use this resource in www server like (look in <main.c>): | ||||
|  * reg_httpServer_binContent_avr(PSTR("favicon.ico"),favicon_ico, (uint32_t)sizeof(favicon_ico));				// favicon.ico 		: webserver icon
 | ||||
|  * | ||||
|  * | ||||
|  * | ||||
|  * Also can use File->HEX (BIN2HEX) - for prepare images for example (bin2hex_v2.py BETTER SUIT for AVR!!): | ||||
|  * https://tomeko.net/online_tools/file_to_hex.php?lang=en
 | ||||
|  * | ||||
|  * (9) Simple webserver, based on <wiznetweb.c> code from: | ||||
|  * http://www.ermicro.com/blog/?p=1773
 | ||||
|  * Article: Integrating Wiznet W5100, WIZ811MJ network module with Atmel AVR Microcontroller | ||||
|  * | ||||
|  * (3) Trying WIZNET5500 init with using official Wiznet ioLibrary_Driver | ||||
|  * working ping on static IP | ||||
|  * LED1 = ON when phy_link detected | ||||
|  * and loopback test on TCP-IP:5000 and UDP:3000 ports. | ||||
|  * use Hercules terminal utility to check network connection see: | ||||
|  * | ||||
|  * https://wizwiki.net/wiki/doku.php?id=osh:cookie:loopback_test
 | ||||
|  * https://www.hw-group.com/software/hercules-setup-utility
 | ||||
|  * | ||||
|  * | ||||
|  * Author of porting to AVR Mega: | ||||
|  * Ibragimov Maxim, Russia Togliatty ~10..12.2018 | ||||
|  */ | ||||
| 
 | ||||
| //***********Prologue for fast WDT disable & and save reason of reset/power-up: END
 | ||||
| uint8_t mcucsr_mirror __attribute__ ((section (".noinit"))); | ||||
| 
 | ||||
| // This is for fast WDT disable & and save reason of reset/power-up
 | ||||
| void get_mcusr(void) \ | ||||
|   __attribute__((naked)) \ | ||||
|   __attribute__((section(".init3"))); | ||||
| void get_mcusr(void) | ||||
| { | ||||
|   mcucsr_mirror = MCUSR; | ||||
|   MCUSR = 0; | ||||
|   wdt_disable(); | ||||
| } | ||||
| //***********Prologue for fast WDT disable & and save reason of reset/power-up: END
 | ||||
| 
 | ||||
| 
 | ||||
| //*********Program metrics
 | ||||
| const char compile_date[] PROGMEM    = __DATE__;     // Mmm dd yyyy - Äàòà êîìïèëÿöèè
 | ||||
| const char compile_time[] PROGMEM    = __TIME__;     // hh:mm:ss - Âðåìÿ êîìïèëÿöèè
 | ||||
| const char str_prog_name[] PROGMEM   = "\r\nAtMega1284p v2.4d Static IP HTTP_server SDCARD Pages WIZNET_5500 ETHERNET 19/12/2018\r\n"; // Program name
 | ||||
| 
 | ||||
| /*
 | ||||
|  * m1284p minimum template, with one button & one led | ||||
|  */ | ||||
| 
 | ||||
| //M644P/M1284p Users LEDS:
 | ||||
| //LED1/PORTC.4- m644p/m1284p maxxir
 | ||||
| #define led1_conf()      DDRC |= (1<<DDC4) | ||||
| #define led1_high()      PORTC |= (1<<PORTC4) | ||||
| #define led1_low()       PORTC &= ~(1<<PORTC4) | ||||
| #define led1_tgl()     PORTC ^= (1<<PORTC4) | ||||
| #define led1_read()     (PORTC & (1<<PORTC4)) | ||||
| 
 | ||||
| #define sw1_conf()      {DDRC &= ~(1<<DDC5); PORTC |= (1<<PORTC5);} | ||||
| #define sw1_read()     (PINC & (1<<PINC5)) | ||||
| 
 | ||||
| //*********Global vars
 | ||||
| #define TICK_PER_SEC 1000UL | ||||
| volatile unsigned long _millis; // for millis tick !! Overflow every ~49.7 days
 | ||||
| 
 | ||||
| 
 | ||||
| #if defined(__AVR_ATmega128__) | ||||
| const char PROGMEM str_mcu[] = "ATmega128"; //CPU is m128
 | ||||
| #elif defined (__AVR_ATmega2560__) | ||||
| const char PROGMEM str_mcu[] = "ATmega2560"; //CPU is m2560
 | ||||
| #elif defined (__AVR_ATmega2561__) | ||||
| const char PROGMEM str_mcu[] = "ATmega2561"; //CPU is m2561
 | ||||
| #elif defined (__AVR_ATmega328P__) | ||||
| const char PROGMEM str_mcu[] = "ATmega328P"; //CPU is m328p
 | ||||
| #elif defined (__AVR_ATmega32U4__) | ||||
| const char PROGMEM str_mcu[] = "ATmega32u4"; //CPU is m32u4
 | ||||
| #elif defined (__AVR_ATmega644P__) | ||||
| const char PROGMEM str_mcu[] = "ATmega644p"; //CPU is m644p
 | ||||
| #elif defined (__AVR_ATmega1284P__) | ||||
| const char PROGMEM str_mcu[] = "ATmega1284p"; //CPU is m1284p
 | ||||
| #else | ||||
| const char PROGMEM str_mcu[] = "Unknown CPU"; //CPU is unknown
 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| //FUNC headers
 | ||||
| static void avr_init(void); | ||||
| void timer0_init(void); | ||||
| 
 | ||||
| //Wiznet FUNC headers
 | ||||
| void print_network_information(void); | ||||
| 
 | ||||
| // RAM Memory usage test
 | ||||
| int freeRam (void) | ||||
| { | ||||
| 	extern int __heap_start, *__brkval; | ||||
| 	int v; | ||||
| 	int _res = (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); | ||||
| 	return _res; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| //******************* MILLIS ENGINE: BEGIN
 | ||||
| //ISR (TIMER0_COMP_vect )
 | ||||
| ISR (TIMER0_COMPA_vect) | ||||
| { | ||||
| 	static uint8_t fatfs_10ms; | ||||
| 	// Compare match Timer0
 | ||||
| 	// Here every 1ms
 | ||||
| 	_millis++; // INC millis tick
 | ||||
| 	// Òåñò ìèãàåì ïðè â õîäå â ïðåðûâàíèå
 | ||||
| 	// 500Hz FREQ OUT
 | ||||
| 	// LED_TGL;
 | ||||
| 	if(++fatfs_10ms > 9 ) | ||||
| 	{ | ||||
| 		//Here every 10ms
 | ||||
| 		fatfs_10ms = 0; | ||||
| 		//Timer++;			/* Performance counter for this module (for FatFS test) */
 | ||||
| 		disk_timerproc(); // FAT FS timing func
 | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| inline unsigned long millis(void) | ||||
| { | ||||
| 	unsigned long i; | ||||
| 	cli(); | ||||
| 	// Atomic tick reading
 | ||||
| 	i = _millis; | ||||
| 	sei(); | ||||
| 	return i; | ||||
| } | ||||
| //******************* MILLIS ENGINE: END
 | ||||
| 
 | ||||
| //***************** UART0: BEGIN
 | ||||
| // Assign I/O stream to UART
 | ||||
| /* define CPU frequency in Mhz here if not defined in Makefile */ | ||||
| //#ifndef F_CPU
 | ||||
| //#define F_CPU 16000000UL
 | ||||
| //#endif
 | ||||
| 
 | ||||
| /* 19200 baud */ | ||||
| //#define UART_BAUD_RATE      19200
 | ||||
| //#define UART_BAUD_RATE      38400
 | ||||
| #define UART_BAUD_RATE      115200 | ||||
| 
 | ||||
| static int uart0_putchar(char ch,FILE *stream); | ||||
| static void uart0_rx_flash(void); | ||||
| 
 | ||||
| static FILE uart0_stdout = FDEV_SETUP_STREAM(uart0_putchar, NULL, _FDEV_SETUP_WRITE); | ||||
| //PS. stdin íå ïåðåíàçíà÷àþ, ò.ê. óäîáíåå ñ íèì ðàáîòàòü ÷åðåç uart.h - api:
 | ||||
| 
 | ||||
| /*
 | ||||
|  * Ò.å. íàïðèìåð òàê | ||||
|         c = uart1_getc(); | ||||
|         if (( c & UART_NO_DATA ) == 0) | ||||
|         { | ||||
|            uart1_putc( (unsigned char)c ); | ||||
|         } | ||||
|  Ïðè ýòîì ÷åêàåì ÷òî áóôåð ïðèåìà íå ïóñò è îïðîñ èäåò íåáëîêèðóþùèé (+ ðàáîòàåì ÷åðåç UART RX RINGBUFFER), | ||||
|  à åñëè ðàáîòàåì â ñòèëå stdin->getchar() òàì îïðîñ áëîêèðóåòñÿ ïîêà ñèìâîë íå áóäåò ïðèíÿò (ïîëëèíã) | ||||
|  ÷åðåç UART1_RX, ò.å. íåóäîáíî. | ||||
|  */ | ||||
| 
 | ||||
| // STDOUT UART0 TX handler
 | ||||
| static int uart0_putchar(char ch,FILE *stream) | ||||
| { | ||||
| 	uart_putc(ch); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| // Î÷èùàåì áóôåð ïðèåìà UART1 RX (èíîãäà íóæíî)
 | ||||
| static void uart0_rx_flash(void) | ||||
| { | ||||
| 	// Ñ÷èòûâàåì âñå èç ring-buffer UART1 RX
 | ||||
| 	unsigned int c; | ||||
| 	do | ||||
| 	{ | ||||
| 		c = uart_getc(); | ||||
| 	} while (( c & UART_NO_DATA ) == 0); // Check RX1 none-empty
 | ||||
| 
 | ||||
| } | ||||
| //***************** UART0: END
 | ||||
| 
 | ||||
| //***************** ADC: BEGIN
 | ||||
| 
 | ||||
| #ifndef ADC_DIV | ||||
| //12.5MHz or over use this ADC reference clock
 | ||||
| #define ADC_DIV (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) //:128 ADC Prescaler
 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef ADC_REF | ||||
| // vcc voltage ref default
 | ||||
| #define ADC_REF (1<<REFS0) | ||||
| #endif | ||||
| 
 | ||||
| void adc_init(void) | ||||
| { | ||||
| 	ADCSRA = 0; | ||||
| 	ADCSRA |= (ADC_DIV);    // ADC reference clock
 | ||||
| 	ADMUX |= (ADC_REF);     // Voltage reference
 | ||||
| 	ADCSRA |= (1<<ADEN);    // Turn on ADC
 | ||||
| 	ADCSRA |= (1<<ADSC);    // Do an initial conversion because this one is the
 | ||||
| 	// slowest and to ensure that everything is up
 | ||||
| 	// and running
 | ||||
| } | ||||
| 
 | ||||
| uint16_t adc_read(uint8_t channel) | ||||
| { | ||||
| 	ADMUX &= 0b11100000;                    //Clear the older channel that was read
 | ||||
| 	ADMUX |= channel;                //Defines the new ADC channel to be read
 | ||||
| 	ADCSRA |= (1<<ADSC);                //Starts a new conversion
 | ||||
| 	while(ADCSRA & (1<<ADSC));            //Wait until the conversion is done
 | ||||
| 
 | ||||
| 	return ADCW;                    //Returns the ADC value of the chosen channel
 | ||||
| } | ||||
| //***************** ADC: END
 | ||||
| 
 | ||||
| 
 | ||||
| //***************** WIZCHIP INIT: BEGIN
 | ||||
| #define ETH_MAX_BUF_SIZE	2048 | ||||
| 
 | ||||
| /*
 | ||||
| unsigned char ethBuf0[ETH_MAX_BUF_SIZE]; | ||||
| unsigned char ethBuf1[ETH_MAX_BUF_SIZE]; | ||||
| unsigned char ethBuf2_WEBSRV[WEBSRV_DATA_BUF_SIZE]; | ||||
| */ | ||||
| 
 | ||||
| void cs_sel() { | ||||
| 	SPI_WIZNET_ENABLE(); | ||||
| } | ||||
| 
 | ||||
| void cs_desel() { | ||||
| 	SPI_WIZNET_DISABLE(); | ||||
| } | ||||
| 
 | ||||
| uint8_t spi_rb(void) { | ||||
| 	uint8_t rbuf; | ||||
| 	//HAL_SPI_Receive(&hspi1, &rbuf, 1, HAL_MAX_DELAY);
 | ||||
| 	SPI_READ(rbuf); | ||||
| 	return rbuf; | ||||
| } | ||||
| 
 | ||||
| void spi_wb(uint8_t b) { | ||||
| 	//HAL_SPI_Transmit(&hspi1, &b, 1, HAL_MAX_DELAY);
 | ||||
| 	SPI_WRITE(b); | ||||
| } | ||||
| 
 | ||||
| void spi_rb_burst(uint8_t *buf, uint16_t len) { | ||||
| 	//HAL_SPI_Receive_DMA(&hspi1, buf, len);
 | ||||
| 	//while(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_BUSY_RX);
 | ||||
| 	for (uint16_t var = 0; var < len; var++) { | ||||
| 		SPI_READ(*buf++); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void spi_wb_burst(uint8_t *buf, uint16_t len) { | ||||
| 	//HAL_SPI_Transmit_DMA(&hspi1, buf, len);
 | ||||
| 	//while(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_BUSY_TX);
 | ||||
| 	for (uint16_t var = 0; var < len; var++) { | ||||
| 		SPI_WRITE(*buf++); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void IO_LIBRARY_Init(void) { | ||||
| 	uint8_t bufSize[] = {2, 2, 2, 2, 2, 2, 2, 2}; | ||||
| 
 | ||||
| 	reg_wizchip_cs_cbfunc(cs_sel, cs_desel); | ||||
| 	reg_wizchip_spi_cbfunc(spi_rb, spi_wb); | ||||
| 	reg_wizchip_spiburst_cbfunc(spi_rb_burst, spi_wb_burst); | ||||
| 
 | ||||
| 	wizchip_init(bufSize, bufSize); | ||||
| 	wizchip_setnetinfo(&netInfo); | ||||
| 	//wizchip_setinterruptmask(IK_SOCK_0);
 | ||||
| } | ||||
| //***************** WIZCHIP INIT: END
 | ||||
| //////////////////////////////////////////////////
 | ||||
| // Socket & Port number definition for Examples //
 | ||||
| //////////////////////////////////////////////////
 | ||||
| //#define SOCK_TCPS       0
 | ||||
| //#define SOCK_UDPS       1
 | ||||
| //#define PORT_TCPS		5000
 | ||||
| //#define PORT_UDPS       3000
 | ||||
| 
 | ||||
| ////////////////////////////////////////////////
 | ||||
| //HTTPD  Sockets Definition  				  //
 | ||||
| ////////////////////////////////////////////////
 | ||||
| #define MAX_HTTPSOCK	6 | ||||
| uint8_t socknumlist[] = {2, 3, 4, 5, 6, 7}; | ||||
| //#define MAX_HTTPSOCK	2
 | ||||
| //uint8_t socknumlist[] = {0, 1};
 | ||||
| //#define MAX_HTTPSOCK	1
 | ||||
| //uint8_t socknumlist[] = {0};
 | ||||
| 
 | ||||
| ////////////////////////////////////////////////
 | ||||
| //HTTPD  Shared Buffer Definition  				  //
 | ||||
| ////////////////////////////////////////////////
 | ||||
| uint8_t RX_BUF[HTTPD_MAX_BUF_SIZE]; | ||||
| uint8_t TX_BUF[HTTPD_MAX_BUF_SIZE]; | ||||
| 
 | ||||
| //****************************FAT FS initialize: BEGIN
 | ||||
| static void put_rc (FRESULT rc) | ||||
| { | ||||
| 	const char PROGMEM *p; | ||||
| 	static const char PROGMEM str[] = | ||||
| 		"OK\0" "DISK_ERR\0" "INT_ERR\0" "NOT_READY\0" "NO_FILE\0" "NO_PATH\0" | ||||
| 		"INVALID_NAME\0" "DENIED\0" "EXIST\0" "INVALID_OBJECT\0" "WRITE_PROTECTED\0" | ||||
| 		"INVALID_DRIVE\0" "NOT_ENABLED\0" "NO_FILE_SYSTEM\0" "MKFS_ABORTED\0" "TIMEOUT\0" | ||||
| 		"LOCKED\0" "NOT_ENOUGH_CORE\0" "TOO_MANY_OPEN_FILES\0"; | ||||
| 	FRESULT i; | ||||
| 
 | ||||
| 	for (p = str, i = 0; i != rc && pgm_read_byte_near(p); i++) { | ||||
| 		while(pgm_read_byte_near(p++)); | ||||
| 	} | ||||
| 	PRINTF("rc=%u FR_%S\r\n", rc, p); | ||||
| } | ||||
| 
 | ||||
| static void ls_dir(char* path) | ||||
| { | ||||
| 	DIR Dir; | ||||
| 	FILINFO _Finfo; | ||||
| 	BYTE res; | ||||
| 	long p1, p2; | ||||
| 	UINT s1, s2; | ||||
| 	//while (*ptr == ' ') ptr++;
 | ||||
| 	res = f_opendir(&Dir, path); | ||||
| 	if (res) { put_rc(res); return; } | ||||
| 	p1 = s1 = s2 = 0; | ||||
| #if _USE_LFN | ||||
| 	//Init buffer for LFN NAME (Without this LFN NAME not visible!!)
 | ||||
| 	//Also look here:
 | ||||
| 	/*
 | ||||
| 	 * http://microsin.net/programming/file-systems/fatfs-read-dir.html
 | ||||
| 	 * https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=122267
 | ||||
| 	 */ | ||||
|     _Finfo.lfname = Lfname; | ||||
|     _Finfo.lfsize = sizeof(Lfname); | ||||
| #endif | ||||
| 
 | ||||
| 	for(;;) { | ||||
| 		res = f_readdir(&Dir, &_Finfo); | ||||
| 		if ((res != FR_OK) || !_Finfo.fname[0]) break; | ||||
| 		if (_Finfo.fattrib & AM_DIR) { | ||||
| 			s2++; | ||||
| 		} else { | ||||
| 			s1++; p1 += _Finfo.fsize; | ||||
| 		} | ||||
| 		PRINTF("%c%c%c%c%c %u/%02u/%02u %02u:%02u %9lu  %s", | ||||
| 					(_Finfo.fattrib & AM_DIR) ? 'D' : '-', | ||||
| 					(_Finfo.fattrib & AM_RDO) ? 'R' : '-', | ||||
| 					(_Finfo.fattrib & AM_HID) ? 'H' : '-', | ||||
| 					(_Finfo.fattrib & AM_SYS) ? 'S' : '-', | ||||
| 					(_Finfo.fattrib & AM_ARC) ? 'A' : '-', | ||||
| 					(_Finfo.fdate >> 9) + 1980, (_Finfo.fdate >> 5) & 15, _Finfo.fdate & 31, | ||||
| 					(_Finfo.ftime >> 11), (_Finfo.ftime >> 5) & 63, | ||||
| 					_Finfo.fsize, &(_Finfo.fname[0])); | ||||
| #if _USE_LFN | ||||
| 		for (p2 = strlen(_Finfo.fname); p2 < 14; p2++) | ||||
| 			xputc(' '); | ||||
| 		xprintf(PSTR("%s\r\n"), Lfname); | ||||
| #else | ||||
| 		PRINTF("\r\n"); | ||||
| #endif | ||||
| 	} | ||||
| 	f_closedir(&Dir); | ||||
| } | ||||
| 
 | ||||
| void fatfs_head_file(const char * fn) | ||||
| { | ||||
| 	FRESULT f_err_code; | ||||
| 	FIL fil_obj; | ||||
| 	//trying to open and read file..
 | ||||
| 	f_chdir("/"); | ||||
| 	f_err_code=f_open(&fil_obj, fn,FA_READ);	//Open *fn - <index.htm> for reading
 | ||||
| 	if(f_err_code==0) | ||||
| 	{ | ||||
| 		DWORD file_len = fil_obj.fsize; | ||||
| 		UINT br; | ||||
| 		uint8_t _buf[128] = {0, }; | ||||
| 		PRINTF("++Content <%s> = %lu bytes found on SDCARD\r\n", fn, file_len); | ||||
| 		PRINTF("++Trying to read head file..\r\n"); | ||||
| 		f_err_code = f_read(&fil_obj,&_buf[0], 128, &br); | ||||
| 		if(f_err_code == 0) | ||||
| 		{ | ||||
| 			if(br < 128) | ||||
| 				_buf[br] = 0x0; | ||||
| 			else | ||||
| 				_buf[127] = 0x0; | ||||
| 			PRINTF ("OK\r\n"); | ||||
| 			PRINTF("text contents reading %u bytes:\r\n", br); | ||||
| 			PRINTF("%s", _buf); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			PRINTF ("ERROR "); | ||||
| 			put_rc(f_err_code); | ||||
| 			PRINTF("But anyway text contents:\r\n"); | ||||
| 			PRINTF("%s", _buf); | ||||
| 		} | ||||
| 		f_close(&fil_obj); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		PRINTF ("ERROR opening file <%s> ", fn); | ||||
| 		put_rc(f_err_code); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void fatfs_init(void) | ||||
| { | ||||
| 	if( disk_status (0) == STA_NOINIT )	// Initialise the SD Card here, before we do anything else.
 | ||||
| 	{ | ||||
| 		if( disk_initialize (0) )		// If it didn't initialise, or the card is write protected, try again.
 | ||||
| 		{ | ||||
| 			if( disk_initialize (0) )		// If it didn't initialise, or the card is write protected, then call it out.
 | ||||
| 			{ | ||||
| 				PRINTF("\r\nSDCard initialization failed..!\r\nPlease power cycle the SDCard.\r\nCheck write protect.\r\n"); | ||||
| 				PRINTF("\r\nReboot the Board"); | ||||
| 				while(1) | ||||
| 				{ | ||||
| 					_delay_ms(1000); | ||||
| 					PRINTF("."); | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				PRINTF("\r\nSDCard initialization OK\r\n"); | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			PRINTF("\r\nSDCard initialization OK\r\n"); | ||||
| 		} | ||||
| 		PRINTF(">>FS MOUNT "); | ||||
| 		put_rc(f_mount(&Fatfs, (const TCHAR *)"", 1)); | ||||
| 		PRINTF(">>GO ROOT DIRECTORY "); | ||||
| 		put_rc(f_chdir((const TCHAR *)"/") ); | ||||
| 
 | ||||
| 		PRINTF ("\r\n\r\nSD-Card root file list:\r\n"); | ||||
| 		PRINTF ("===============================================\r\n"); | ||||
| 		ls_dir("/"); | ||||
| 		PRINTF ("===============================================\r\n\r\n"); | ||||
| 
 | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Blocking (~3.5sec) receive one symbol from uart
 | ||||
| /*
 | ||||
| char uart0_receive(void) | ||||
| { | ||||
| 	unsigned int c; | ||||
| 	uint32_t wait_start = millis(); | ||||
| 	do | ||||
| 	{ | ||||
| 		wdt_reset(); | ||||
| 		c = uart_getc(); | ||||
| 		if (( c & UART_NO_DATA ) == 0) | ||||
| 		{ | ||||
| 		   uart_putc( (unsigned char)c ); | ||||
| 		   return (char)c ; | ||||
| 		} | ||||
| 		//After 3.5  sec waiting return with no symbol
 | ||||
| 		if((millis()-wait_start) > 3500) | ||||
| 		{ | ||||
| 			return 0; | ||||
| 		} | ||||
| 	} | ||||
| 	while(( c & UART_NO_DATA )); | ||||
| 	return 0; | ||||
| } | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| //****************************FAT FS initialize: END
 | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
| 	uint8_t prev_sw1 = 1; // VAR for sw1 pressing detect
 | ||||
| 
 | ||||
| 	// INIT MCU
 | ||||
| 	avr_init(); | ||||
| 	spi_init(); //SPI Master, MODE0, 4Mhz(DIV4), CS_PB.3=HIGH - suitable for WIZNET 5x00(1/2/5)
 | ||||
| 
 | ||||
| 
 | ||||
| 	// Print program metrics
 | ||||
| 	PRINTF("%S", str_prog_name);// Íàçâàíèå ïðîãðàììû
 | ||||
| 	PRINTF("Compiled at: %S %S\r\n", compile_time, compile_date);// Âðåìÿ Äàòà êîìïèëÿöèè
 | ||||
| 	PRINTF(">> MCU is: %S; CLK is: %luHz\r\n", str_mcu, F_CPU);// MCU Name && FREQ
 | ||||
| 	PRINTF(">> Free RAM is: %d bytes\r\n", freeRam()); | ||||
| 
 | ||||
| 	//Short Blink LED 3 times on startup
 | ||||
| 	unsigned char i = 3; | ||||
| 	while(i--) | ||||
| 	{ | ||||
| 		led1_high(); | ||||
| 		_delay_ms(100); | ||||
| 		led1_low(); | ||||
| 		_delay_ms(400); | ||||
| 		wdt_reset(); | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| 	//FAT_FS init and quick test(root directory list && print out head index.htm)
 | ||||
| 	fatfs_init(); | ||||
| 	fatfs_head_file("index.htm"); | ||||
| 
 | ||||
| 	//Wizchip WIZ5500 Ethernet initialize
 | ||||
| 	IO_LIBRARY_Init(); //After that ping must working
 | ||||
| 	print_network_information(); | ||||
| 
 | ||||
| //**************************************HTTPD init: BEGIN
 | ||||
| 	/* HTTP Server Initialization  */ | ||||
| 	httpServer_init(TX_BUF, RX_BUF, MAX_HTTPSOCK, socknumlist);		// Tx/Rx buffers (1kB) / The number of W5500 chip H/W sockets in use
 | ||||
| 	//reg_httpServer_cbfunc(NVIC_SystemReset, NULL); 					// Callback: NXP MCU Reset
 | ||||
| 	reg_httpServer_cbfunc(NULL, NULL); 					// Callback: Still not used here ARV System reset, AVR WDT reset
 | ||||
| 	//In this demo all www content saved onto SD-Card (you must copy all from <WWW> folder to ROOT SD-Card)
 | ||||
| //**************************************HTTPD init: END
 | ||||
| 
 | ||||
| 	/* Loopback Test: TCP Server and UDP */ | ||||
| 	// Test for Ethernet data transfer validation
 | ||||
| 	//uint32_t timer_link_1sec = millis();
 | ||||
| 	uint32_t timer_httpd_1sec = millis(); | ||||
| 	bool run_user_applications = true; | ||||
| 	while(1) | ||||
| 	{ | ||||
| 		//Here at least every 1sec
 | ||||
| 		wdt_reset(); // WDT reset at least every sec
 | ||||
| 
 | ||||
|     	/* HTTPD */ | ||||
| 		/*HTTPD timer 1 sec interval tick*/ | ||||
|     	if((millis()-timer_httpd_1sec)> 1000) | ||||
| 		{ | ||||
|     		//here every 1 sec
 | ||||
|     		timer_httpd_1sec = millis(); | ||||
|     		////////////////////////////////////////////////////////
 | ||||
|     		// SHOULD BE Added HTTP Server Time Handler to your 1s tick timer
 | ||||
|     		httpServer_time_handler(); 	// for HTTP server time counter
 | ||||
|     		////////////////////////////////////////////////////////
 | ||||
|     		//Printout RAM usage every 1 minute
 | ||||
|     		static uint16_t j_ram = 0; | ||||
|     		if(j_ram++%60 == 0) | ||||
|     		{ | ||||
|     			PRINTF(">> Free RAM is: %d bytes\r\n", freeRam()); | ||||
|     		} | ||||
| 		} | ||||
| 
 | ||||
|     	// TODO: insert user's code here
 | ||||
|     	if(run_user_applications) | ||||
|     	{ | ||||
|     		//for(i = 0; i < MAX_HTTPSOCK; i++)	httpServer_run(i); 	// HTTP Server handler
 | ||||
|     		for(i = 0; i < MAX_HTTPSOCK; i++)	httpServer_run_avr(i); 	// HTTP Server handler avr optimized
 | ||||
| 
 | ||||
|     		//loopback_tcps(SOCK_TCPS, RX_BUF, 5000); //not used here
 | ||||
| 
 | ||||
|     	} // End of user's code
 | ||||
| 
 | ||||
| 		//Use Hercules Terminal to check loopback tcp:5000 and udp:3000
 | ||||
| 		/*
 | ||||
| 		 * https://www.hw-group.com/software/hercules-setup-utility
 | ||||
| 		 * */ | ||||
| 		//loopback_tcps(0,ethBuf0,5000);
 | ||||
| 		//loopback_udps(1, ethBuf1, 3000);
 | ||||
| 
 | ||||
| 		//Use WEBbrowser to connect to webserver: http://192.168.0.199/index.html
 | ||||
| 		//websrv_simple(2, ethBuf2_WEBSRV, 80);
 | ||||
| 
 | ||||
| 
 | ||||
| 		//loopback_ret = loopback_tcpc(SOCK_TCPS, gDATABUF, destip, destport);
 | ||||
| 		//if(loopback_ret < 0) printf("loopback ret: %ld\r\n", loopback_ret); // TCP Socket Error code
 | ||||
| 
 | ||||
| 		//Not used here, because led1 handle via websrv
 | ||||
| 		/*
 | ||||
| 		if((millis()-timer_link_1sec)> 1000) | ||||
| 		{ | ||||
| 			//here every 1 sec
 | ||||
| 			timer_link_1sec = millis(); | ||||
| 			if(wizphy_getphylink() == PHY_LINK_ON) | ||||
| 			{ | ||||
| 				led1_high(); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				led1_low(); | ||||
| 			} | ||||
| 		} | ||||
| 		*/ | ||||
| 
 | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| // Timer0
 | ||||
| // 1ms IRQ
 | ||||
| // Used for millis() timing
 | ||||
| void timer0_init(void) | ||||
| { | ||||
| 	/*
 | ||||
| 	 * | ||||
| 	 * For M128 | ||||
| 	TCCR0 = (1<<CS02)|(1<<WGM01); //TIMER0 SET-UP: CTC MODE & PS 1:64
 | ||||
| 	OCR0 = 249; // 1ms reach for clear (16mz:64=>250kHz:250-=>1kHz)
 | ||||
| 	TIMSK |= 1<<OCIE0;	 //IRQ on TIMER0 output compare
 | ||||
| 	 */ | ||||
| 	//For M664p
 | ||||
| 	TCCR0A = (1<<WGM01); //TIMER0 SET-UP: CTC MODE
 | ||||
| 	TCCR0B = (1<<CS01)|(1<<CS00); // PS 1:64
 | ||||
| 	OCR0A = 249; // 1ms reach for clear (16mz:64=>250kHz:250-=>1kHz)
 | ||||
| 	TIMSK0 |= 1<<OCIE0A;	 //IRQ on TIMER0 output compareA
 | ||||
| } | ||||
| 
 | ||||
| static void avr_init(void) | ||||
| { | ||||
| 	// Initialize device here.
 | ||||
| 	// WatchDog INIT
 | ||||
| 	wdt_enable(WDTO_8S);  // set up wdt reset interval 2 second
 | ||||
| 	wdt_reset(); // wdt reset ~ every <2000ms
 | ||||
| 
 | ||||
| 	timer0_init();// Timer0 millis engine init
 | ||||
| 
 | ||||
| 	// Initial UART Peripheral
 | ||||
| 	/*
 | ||||
| 	 *  Initialize uart11 library, pass baudrate and AVR cpu clock | ||||
| 	 *  with the macro | ||||
| 	 *  uart1_BAUD_SELECT() (normal speed mode ) | ||||
| 	 *  or | ||||
| 	 *  uart1_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode) | ||||
| 	 */ | ||||
| #if	(UART_BAUD_RATE == 115200) | ||||
| 	uart_init( UART_BAUD_SELECT_DOUBLE_SPEED(UART_BAUD_RATE,F_CPU) ); // To works without error on 115200 bps/F_CPU=16Mhz
 | ||||
| #else | ||||
| 	uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); | ||||
| #endif | ||||
| 	// Define Output/Input Stream
 | ||||
| 	stdout = &uart0_stdout; | ||||
| 
 | ||||
| 	//ADC init
 | ||||
| 	adc_init(); | ||||
| 	adc_read(6); //Dummy read
 | ||||
| 
 | ||||
| 
 | ||||
| 	led1_conf(); | ||||
| 	led1_low();// LED1 is OFF
 | ||||
| 
 | ||||
| 
 | ||||
| 	sw1_conf();//SW1 internal pull-up
 | ||||
| 
 | ||||
| 	sei(); //re-enable global interrupts
 | ||||
| 
 | ||||
| 	return; | ||||
| } | ||||
| 
 | ||||
| void print_network_information(void) | ||||
| { | ||||
| 
 | ||||
| 	uint8_t tmpstr[6] = {0,}; | ||||
| 	ctlwizchip(CW_GET_ID,(void*)tmpstr); // Get WIZCHIP name
 | ||||
|     PRINTF("\r\n=======================================\r\n"); | ||||
|     PRINTF(" WIZnet chip:  %s \r\n", tmpstr); | ||||
|     PRINTF("=======================================\r\n"); | ||||
| 
 | ||||
| 	wiz_NetInfo gWIZNETINFO; | ||||
| 	wizchip_getnetinfo(&gWIZNETINFO); | ||||
| 	if (gWIZNETINFO.dhcp == NETINFO_STATIC) | ||||
| 		PRINTF("STATIC IP\r\n"); | ||||
| 	else | ||||
| 		PRINTF("DHCP IP\r\n"); | ||||
| 	PRINTF("Mac address: %02x:%02x:%02x:%02x:%02x:%02x\n\r",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]); | ||||
| 	PRINTF("IP address : %d.%d.%d.%d\n\r",gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]); | ||||
| 	PRINTF("SM Mask	   : %d.%d.%d.%d\n\r",gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]); | ||||
| 	PRINTF("Gate way   : %d.%d.%d.%d\n\r",gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]); | ||||
| 	PRINTF("DNS Server : %d.%d.%d.%d\n\r",gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]); | ||||
| } | ||||
| 
 | ||||
| @ -0,0 +1,642 @@ | ||||
| /*
 | ||||
|  * Slightly modified for M128 using | ||||
|  * maxx_ir 28.05.2015 | ||||
|  *  | ||||
|  * PS. SPI Speed (4/8Mhz on F_CPU=16Mhz) set-up at: <power_on()> | ||||
|  */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* MMCv3/SDv1/SDv2 (in SPI mode) control module                          */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /*
 | ||||
| /  Copyright (C) 2014, ChaN, all right reserved. | ||||
| / | ||||
| / * This software is a free software and there is NO WARRANTY. | ||||
| / * No restriction on use. You can use, modify and redistribute it for | ||||
| /   personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. | ||||
| / * Redistributions of source code must retain the above copyright notice. | ||||
| / | ||||
| /-------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #include <avr/io.h> | ||||
| #include "diskio.h" | ||||
| 
 | ||||
| 
 | ||||
| /* Port controls  (Platform dependent) */ | ||||
| 
 | ||||
| //!! M128
 | ||||
| //#define SCK            1  /* - Output: SPI Serial Clock (SCLK) - ATMEGA128 PORTB, PIN1 */
 | ||||
| //#define MOSI           2  /* - Output: SPI Master out - slave in (MOSI) - ATMEGA128 PORTB, PIN2 */
 | ||||
| //#define MISO           3  /* - Input:  SPI Master in - slave out (MISO) - ATMEGA128 PORTB, PIN3 */
 | ||||
| //#define CSN            0  /*SPI - SS*/
 | ||||
| //#define SD_CS          6       /* PB.6 Output as CS*/
 | ||||
| 
 | ||||
| //!! ATMEGA644/1284
 | ||||
| #define SCK            7  /* - Output: SPI Serial Clock (SCLK) - ATMEGA644/1284 PORTB, PIN7 */ | ||||
| #define MOSI           5  /* - Output: SPI Master out - slave in (MOSI) -  ATMEGA644/1284 PORTB, PIN5 */ | ||||
| #define MISO           6  /* - Input:  SPI Master in - slave out (MISO) -  ATMEGA644/1284 PORTB, PIN6 */ | ||||
| #define CSN            4  /*SPI - SS*/ | ||||
| //#define SD_CS       2       /* PB.2 Output as CS*/
 | ||||
| #define SD_CS       0       /* PB.0 Output as CS*/ | ||||
| 
 | ||||
| 
 | ||||
| #define CS_LOW()	PORTB &= ~(1<<SD_CS)			/* CS=low */ | ||||
| #define	CS_HIGH()	PORTB |= (1<<SD_CS)			/* CS=high */ | ||||
| #define MMC_CD		(1)	/* Card detected.   yes:true, no:false, default:true */ | ||||
| #define MMC_WP		(0)		/* Write protected. yes:true, no:false, default:false */ | ||||
| #define	FCLK_SLOW()	SPCR = ((1<<SPE) | (1<<MSTR) | (1<<SPR1)) /*SPCR = 0x52*/		/* Set slow clock (F_CPU / 64) */ | ||||
| #define	FCLK_FAST()	SPCR = ((1<<SPE) | (1<<MSTR)) /*SPCR = 0x50*/		/* Set fast clock (F_CPU / 4) */ | ||||
| 
 | ||||
| 
 | ||||
| /*--------------------------------------------------------------------------
 | ||||
| 
 | ||||
|    Module Private Functions | ||||
| 
 | ||||
| ---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| /* Definitions for MMC/SDC command */ | ||||
| #define CMD0	(0)			/* GO_IDLE_STATE */ | ||||
| #define CMD1	(1)			/* SEND_OP_COND (MMC) */ | ||||
| #define	ACMD41	(0x80+41)	/* SEND_OP_COND (SDC) */ | ||||
| #define CMD8	(8)			/* SEND_IF_COND */ | ||||
| #define CMD9	(9)			/* SEND_CSD */ | ||||
| #define CMD10	(10)		/* SEND_CID */ | ||||
| #define CMD12	(12)		/* STOP_TRANSMISSION */ | ||||
| #define ACMD13	(0x80+13)	/* SD_STATUS (SDC) */ | ||||
| #define CMD16	(16)		/* SET_BLOCKLEN */ | ||||
| #define CMD17	(17)		/* READ_SINGLE_BLOCK */ | ||||
| #define CMD18	(18)		/* READ_MULTIPLE_BLOCK */ | ||||
| #define CMD23	(23)		/* SET_BLOCK_COUNT (MMC) */ | ||||
| #define	ACMD23	(0x80+23)	/* SET_WR_BLK_ERASE_COUNT (SDC) */ | ||||
| #define CMD24	(24)		/* WRITE_BLOCK */ | ||||
| #define CMD25	(25)		/* WRITE_MULTIPLE_BLOCK */ | ||||
| #define CMD32	(32)		/* ERASE_ER_BLK_START */ | ||||
| #define CMD33	(33)		/* ERASE_ER_BLK_END */ | ||||
| #define CMD38	(38)		/* ERASE */ | ||||
| #define CMD55	(55)		/* APP_CMD */ | ||||
| #define CMD58	(58)		/* READ_OCR */ | ||||
| 
 | ||||
| 
 | ||||
| static volatile | ||||
| DSTATUS Stat = STA_NOINIT;	/* Disk status */ | ||||
| 
 | ||||
| static volatile | ||||
| BYTE Timer1, Timer2;	/* 100Hz decrement timer */ | ||||
| 
 | ||||
| static | ||||
| BYTE CardType;			/* Card type flags */ | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Power Control  (Platform dependent)                                   */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* When the target system does not support socket power control, there   */ | ||||
| /* is nothing to do in these functions and chk_power always returns 1.   */ | ||||
| 
 | ||||
| static | ||||
| void power_on (void) | ||||
| { | ||||
| 	 | ||||
| 	// Chang init
 | ||||
| 	//~ PORTB |= 0b01000101;	/* Configure SCK/MOSI/CS/SS as output */
 | ||||
| 	//~ DDRB  |= 0b01000111;
 | ||||
| 	//~ 
 | ||||
| 	//~ SPCR = 0x52;			/* Enable SPI function in mode 0 */
 | ||||
| 	//~ //SPSR = 0x01;			/* SPI 2x mode 8MHZ */
 | ||||
| 	//~ SPSR = 0x00;			/* SPI 2x mode off 4MHZ */
 | ||||
| 	 | ||||
| 	// My init (Contiki-style)
 | ||||
| 	DDRB	|= _BV(SD_CS); // CS to OUT && Disable
 | ||||
| 	CS_HIGH(); | ||||
| 
 | ||||
| 	/* Initalize ports for communication with SPI units. */ | ||||
| 	/* CSN=SS and must be output when master! */ | ||||
| 	DDRB  |= _BV(MOSI) | _BV(SCK) | _BV(CSN); | ||||
| 	PORTB |= _BV(MOSI) | _BV(SCK); | ||||
| 
 | ||||
| 	/* Enables SPI, selects "master", clock rate FCK / 2, and SPI mode 0 */ | ||||
| 	// SPI 8Mhz
 | ||||
| 	/*
 | ||||
| 	SPCR = _BV(SPE) | _BV(MSTR); | ||||
| 	SPSR = _BV(SPI2X); | ||||
| 	*/ | ||||
| 
 | ||||
| 	/* Enables SPI, selects "master", clock rate FCK / 4, and SPI mode 0 */ | ||||
| 	// SPI 4Mhz
 | ||||
| 	SPCR = _BV(SPE) | _BV(MSTR); | ||||
| 	SPSR = 0x0; | ||||
| } | ||||
| 
 | ||||
| static | ||||
| void power_off (void) | ||||
| { | ||||
| 	 | ||||
| 	//SPCR = 0;
 | ||||
| 					/* Disable SPI function */ | ||||
| 
 | ||||
| 	//DDRB  &= ~0b00110111;	
 | ||||
| 	/* Set SCK/MOSI/CS as hi-z, INS#/WP as pull-up */ | ||||
| 	//PORTB &= ~0b00000111;
 | ||||
| 	//PORTB |=  0b00110000;
 | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Transmit/Receive data from/to MMC via SPI  (Platform dependent)       */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| /* Exchange a byte */ | ||||
| static | ||||
| BYTE xchg_spi (		/* Returns received data */ | ||||
| 	BYTE dat		/* Data to be sent */ | ||||
| ) | ||||
| { | ||||
| 	SPDR = dat; | ||||
| 	loop_until_bit_is_set(SPSR, SPIF); | ||||
| 	return SPDR; | ||||
| } | ||||
| 
 | ||||
| /* Send a data block fast */ | ||||
| static | ||||
| void xmit_spi_multi ( | ||||
| 	const BYTE *p,	/* Data block to be sent */ | ||||
| 	UINT cnt		/* Size of data block (must be multiple of 2) */ | ||||
| ) | ||||
| { | ||||
| 	do { | ||||
| 		SPDR = *p++; loop_until_bit_is_set(SPSR,SPIF); | ||||
| 		SPDR = *p++; loop_until_bit_is_set(SPSR,SPIF); | ||||
| 	} while (cnt -= 2); | ||||
| } | ||||
| 
 | ||||
| /* Receive a data block fast */ | ||||
| static | ||||
| void rcvr_spi_multi ( | ||||
| 	BYTE *p,	/* Data buffer */ | ||||
| 	UINT cnt	/* Size of data block (must be multiple of 2) */ | ||||
| ) | ||||
| { | ||||
| 	do { | ||||
| 		SPDR = 0xFF; loop_until_bit_is_set(SPSR,SPIF); *p++ = SPDR; | ||||
| 		SPDR = 0xFF; loop_until_bit_is_set(SPSR,SPIF); *p++ = SPDR; | ||||
| 	} while (cnt -= 2); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Wait for card ready                                                   */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| static | ||||
| int wait_ready (	/* 1:Ready, 0:Timeout */ | ||||
| 	UINT wt			/* Timeout [ms] */ | ||||
| ) | ||||
| { | ||||
| 	BYTE d; | ||||
| 
 | ||||
| 
 | ||||
| 	Timer2 = wt / 10; | ||||
| 	do | ||||
| 		d = xchg_spi(0xFF); | ||||
| 	while (d != 0xFF && Timer2); | ||||
| 
 | ||||
| 	return (d == 0xFF) ? 1 : 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Deselect the card and release SPI bus                                 */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| static | ||||
| void deselect (void) | ||||
| { | ||||
| 	CS_HIGH();		/* Set CS# high */ | ||||
| 	xchg_spi(0xFF);	/* Dummy clock (force DO hi-z for multiple slave SPI) */ | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Select the card and wait for ready                                    */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| static | ||||
| int select (void)	/* 1:Successful, 0:Timeout */ | ||||
| { | ||||
| 	CS_LOW();		/* Set CS# low */ | ||||
| 	xchg_spi(0xFF);	/* Dummy clock (force DO enabled) */ | ||||
| 	if (wait_ready(500)) return 1;	/* Wait for card ready */ | ||||
| 
 | ||||
| 	deselect(); | ||||
| 	return 0;	/* Timeout */ | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Receive a data packet from MMC                                        */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| static | ||||
| int rcvr_datablock ( | ||||
| 	BYTE *buff,			/* Data buffer to store received data */ | ||||
| 	UINT btr			/* Byte count (must be multiple of 4) */ | ||||
| ) | ||||
| { | ||||
| 	BYTE token; | ||||
| 
 | ||||
| 
 | ||||
| 	Timer1 = 20; | ||||
| 	do {							/* Wait for data packet in timeout of 200ms */ | ||||
| 		token = xchg_spi(0xFF); | ||||
| 	} while ((token == 0xFF) && Timer1); | ||||
| 	if (token != 0xFE) return 0;	/* If not valid data token, retutn with error */ | ||||
| 
 | ||||
| 	rcvr_spi_multi(buff, btr);		/* Receive the data block into buffer */ | ||||
| 	xchg_spi(0xFF);					/* Discard CRC */ | ||||
| 	xchg_spi(0xFF); | ||||
| 
 | ||||
| 	return 1;						/* Return with success */ | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Send a data packet to MMC                                             */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #if	_USE_WRITE | ||||
| static | ||||
| int xmit_datablock ( | ||||
| 	const BYTE *buff,	/* 512 byte data block to be transmitted */ | ||||
| 	BYTE token			/* Data/Stop token */ | ||||
| ) | ||||
| { | ||||
| 	BYTE resp; | ||||
| 
 | ||||
| 
 | ||||
| 	if (!wait_ready(500)) return 0; | ||||
| 
 | ||||
| 	xchg_spi(token);					/* Xmit data token */ | ||||
| 	if (token != 0xFD) {	/* Is data token */ | ||||
| 		xmit_spi_multi(buff, 512);		/* Xmit the data block to the MMC */ | ||||
| 		xchg_spi(0xFF);					/* CRC (Dummy) */ | ||||
| 		xchg_spi(0xFF); | ||||
| 		resp = xchg_spi(0xFF);			/* Reveive data response */ | ||||
| 		if ((resp & 0x1F) != 0x05)		/* If not accepted, return with error */ | ||||
| 			return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	return 1; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Send a command packet to MMC                                          */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| static | ||||
| BYTE send_cmd (		/* Returns R1 resp (bit7==1:Send failed) */ | ||||
| 	BYTE cmd,		/* Command index */ | ||||
| 	DWORD arg		/* Argument */ | ||||
| ) | ||||
| { | ||||
| 	BYTE n, res; | ||||
| 
 | ||||
| 
 | ||||
| 	if (cmd & 0x80) {	/* ACMD<n> is the command sequense of CMD55-CMD<n> */ | ||||
| 		cmd &= 0x7F; | ||||
| 		res = send_cmd(CMD55, 0); | ||||
| 		if (res > 1) return res; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Select the card and wait for ready except to stop multiple block read */ | ||||
| 	if (cmd != CMD12) { | ||||
| 		deselect(); | ||||
| 		if (!select()) return 0xFF; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Send command packet */ | ||||
| 	xchg_spi(0x40 | cmd);				/* Start + Command index */ | ||||
| 	xchg_spi((BYTE)(arg >> 24));		/* Argument[31..24] */ | ||||
| 	xchg_spi((BYTE)(arg >> 16));		/* Argument[23..16] */ | ||||
| 	xchg_spi((BYTE)(arg >> 8));			/* Argument[15..8] */ | ||||
| 	xchg_spi((BYTE)arg);				/* Argument[7..0] */ | ||||
| 	n = 0x01;							/* Dummy CRC + Stop */ | ||||
| 	if (cmd == CMD0) n = 0x95;			/* Valid CRC for CMD0(0) + Stop */ | ||||
| 	if (cmd == CMD8) n = 0x87;			/* Valid CRC for CMD8(0x1AA) Stop */ | ||||
| 	xchg_spi(n); | ||||
| 
 | ||||
| 	/* Receive command response */ | ||||
| 	if (cmd == CMD12) xchg_spi(0xFF);		/* Skip a stuff byte when stop reading */ | ||||
| 	n = 10;								/* Wait for a valid response in timeout of 10 attempts */ | ||||
| 	do | ||||
| 		res = xchg_spi(0xFF); | ||||
| 	while ((res & 0x80) && --n); | ||||
| 
 | ||||
| 	return res;			/* Return with the response value */ | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*--------------------------------------------------------------------------
 | ||||
| 
 | ||||
|    Public Functions | ||||
| 
 | ||||
| ---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Initialize Disk Drive                                                 */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| DSTATUS disk_initialize ( | ||||
| 	BYTE pdrv		/* Physical drive nmuber (0) */ | ||||
| ) | ||||
| { | ||||
| 	BYTE n, cmd, ty, ocr[4]; | ||||
| 
 | ||||
| 
 | ||||
| 	if (pdrv) return STA_NOINIT;		/* Supports only single drive */ | ||||
| 	power_off();						/* Turn off the socket power to reset the card */ | ||||
| 	if (Stat & STA_NODISK) return Stat;	/* No card in the socket */ | ||||
| 	power_on();							/* Turn on the socket power */ | ||||
| 	FCLK_SLOW(); | ||||
| 	for (n = 10; n; n--) xchg_spi(0xFF);	/* 80 dummy clocks */ | ||||
| 
 | ||||
| 	ty = 0; | ||||
| 	if (send_cmd(CMD0, 0) == 1) {			/* Enter Idle state */ | ||||
| 		Timer1 = 100;						/* Initialization timeout of 1000 msec */ | ||||
| 		if (send_cmd(CMD8, 0x1AA) == 1) {	/* SDv2? */ | ||||
| 			for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF);		/* Get trailing return value of R7 resp */ | ||||
| 			if (ocr[2] == 0x01 && ocr[3] == 0xAA) {				/* The card can work at vdd range of 2.7-3.6V */ | ||||
| 				while (Timer1 && send_cmd(ACMD41, 1UL << 30));	/* Wait for leaving idle state (ACMD41 with HCS bit) */ | ||||
| 				if (Timer1 && send_cmd(CMD58, 0) == 0) {		/* Check CCS bit in the OCR */ | ||||
| 					for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); | ||||
| 					ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2;	/* SDv2 */ | ||||
| 				} | ||||
| 			} | ||||
| 		} else {							/* SDv1 or MMCv3 */ | ||||
| 			if (send_cmd(ACMD41, 0) <= 1) 	{ | ||||
| 				ty = CT_SD1; cmd = ACMD41;	/* SDv1 */ | ||||
| 			} else { | ||||
| 				ty = CT_MMC; cmd = CMD1;	/* MMCv3 */ | ||||
| 			} | ||||
| 			while (Timer1 && send_cmd(cmd, 0));			/* Wait for leaving idle state */ | ||||
| 			if (!Timer1 || send_cmd(CMD16, 512) != 0)	/* Set R/W block length to 512 */ | ||||
| 				ty = 0; | ||||
| 		} | ||||
| 	} | ||||
| 	CardType = ty; | ||||
| 	deselect(); | ||||
| 
 | ||||
| 	if (ty) {			/* Initialization succeded */ | ||||
| 		Stat &= ~STA_NOINIT;		/* Clear STA_NOINIT */ | ||||
| 		FCLK_FAST(); | ||||
| 	} else {			/* Initialization failed */ | ||||
| 		power_off(); | ||||
| 	} | ||||
| 
 | ||||
| 	return Stat; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Get Disk Status                                                       */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| DSTATUS disk_status ( | ||||
| 	BYTE pdrv		/* Physical drive nmuber (0) */ | ||||
| ) | ||||
| { | ||||
| 	if (pdrv) return STA_NOINIT;	/* Supports only single drive */ | ||||
| 	return Stat; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Read Sector(s)                                                        */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| DRESULT disk_read ( | ||||
| 	BYTE pdrv,			/* Physical drive nmuber (0) */ | ||||
| 	BYTE *buff,			/* Pointer to the data buffer to store read data */ | ||||
| 	DWORD sector,		/* Start sector number (LBA) */ | ||||
| 	UINT count			/* Sector count (1..128) */ | ||||
| ) | ||||
| { | ||||
| 	BYTE cmd; | ||||
| 
 | ||||
| 
 | ||||
| 	if (pdrv || !count) return RES_PARERR; | ||||
| 	if (Stat & STA_NOINIT) return RES_NOTRDY; | ||||
| 
 | ||||
| 	if (!(CardType & CT_BLOCK)) sector *= 512;	/* Convert to byte address if needed */ | ||||
| 
 | ||||
| 	cmd = count > 1 ? CMD18 : CMD17;			/*  READ_MULTIPLE_BLOCK : READ_SINGLE_BLOCK */ | ||||
| 	if (send_cmd(cmd, sector) == 0) { | ||||
| 		do { | ||||
| 			if (!rcvr_datablock(buff, 512)) break; | ||||
| 			buff += 512; | ||||
| 		} while (--count); | ||||
| 		if (cmd == CMD18) send_cmd(CMD12, 0);	/* STOP_TRANSMISSION */ | ||||
| 	} | ||||
| 	deselect(); | ||||
| 
 | ||||
| 	return count ? RES_ERROR : RES_OK; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Write Sector(s)                                                       */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #if _USE_WRITE | ||||
| DRESULT disk_write ( | ||||
| 	BYTE pdrv,			/* Physical drive nmuber (0) */ | ||||
| 	const BYTE *buff,	/* Pointer to the data to be written */ | ||||
| 	DWORD sector,		/* Start sector number (LBA) */ | ||||
| 	UINT count			/* Sector count (1..128) */ | ||||
| ) | ||||
| { | ||||
| 	if (pdrv || !count) return RES_PARERR; | ||||
| 	if (Stat & STA_NOINIT) return RES_NOTRDY; | ||||
| 	if (Stat & STA_PROTECT) return RES_WRPRT; | ||||
| 
 | ||||
| 	if (!(CardType & CT_BLOCK)) sector *= 512;	/* Convert to byte address if needed */ | ||||
| 
 | ||||
| 	if (count == 1) {	/* Single block write */ | ||||
| 		if ((send_cmd(CMD24, sector) == 0)	/* WRITE_BLOCK */ | ||||
| 			&& xmit_datablock(buff, 0xFE)) | ||||
| 			count = 0; | ||||
| 	} | ||||
| 	else {				/* Multiple block write */ | ||||
| 		if (CardType & CT_SDC) send_cmd(ACMD23, count); | ||||
| 		if (send_cmd(CMD25, sector) == 0) {	/* WRITE_MULTIPLE_BLOCK */ | ||||
| 			do { | ||||
| 				if (!xmit_datablock(buff, 0xFC)) break; | ||||
| 				buff += 512; | ||||
| 			} while (--count); | ||||
| 			if (!xmit_datablock(0, 0xFD))	/* STOP_TRAN token */ | ||||
| 				count = 1; | ||||
| 		} | ||||
| 	} | ||||
| 	deselect(); | ||||
| 
 | ||||
| 	return count ? RES_ERROR : RES_OK; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Miscellaneous Functions                                               */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #if _USE_IOCTL | ||||
| DRESULT disk_ioctl ( | ||||
| 	BYTE pdrv,		/* Physical drive nmuber (0) */ | ||||
| 	BYTE cmd,		/* Control code */ | ||||
| 	void *buff		/* Buffer to send/receive control data */ | ||||
| ) | ||||
| { | ||||
| 	DRESULT res; | ||||
| 	BYTE n, csd[16], *ptr = buff; | ||||
| 	DWORD csize; | ||||
| 
 | ||||
| 
 | ||||
| 	if (pdrv) return RES_PARERR; | ||||
| 
 | ||||
| 	res = RES_ERROR; | ||||
| 
 | ||||
| 	if (Stat & STA_NOINIT) return RES_NOTRDY; | ||||
| 
 | ||||
| 	switch (cmd) { | ||||
| 	case CTRL_SYNC :		/* Make sure that no pending write process. Do not remove this or written sector might not left updated. */ | ||||
| 		if (select()) res = RES_OK; | ||||
| 		break; | ||||
| 
 | ||||
| 	case GET_SECTOR_COUNT :	/* Get number of sectors on the disk (DWORD) */ | ||||
| 		if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { | ||||
| 			if ((csd[0] >> 6) == 1) {	/* SDC ver 2.00 */ | ||||
| 				csize = csd[9] + ((WORD)csd[8] << 8) + ((DWORD)(csd[7] & 63) << 16) + 1; | ||||
| 				*(DWORD*)buff = csize << 10; | ||||
| 			} else {					/* SDC ver 1.XX or MMC*/ | ||||
| 				n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2; | ||||
| 				csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1; | ||||
| 				*(DWORD*)buff = csize << (n - 9); | ||||
| 			} | ||||
| 			res = RES_OK; | ||||
| 		} | ||||
| 		break; | ||||
| 
 | ||||
| 	case GET_BLOCK_SIZE :	/* Get erase block size in unit of sector (DWORD) */ | ||||
| 		if (CardType & CT_SD2) {	/* SDv2? */ | ||||
| 			if (send_cmd(ACMD13, 0) == 0) {	/* Read SD status */ | ||||
| 				xchg_spi(0xFF); | ||||
| 				if (rcvr_datablock(csd, 16)) {				/* Read partial block */ | ||||
| 					for (n = 64 - 16; n; n--) xchg_spi(0xFF);	/* Purge trailing data */ | ||||
| 					*(DWORD*)buff = 16UL << (csd[10] >> 4); | ||||
| 					res = RES_OK; | ||||
| 				} | ||||
| 			} | ||||
| 		} else {					/* SDv1 or MMCv3 */ | ||||
| 			if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) {	/* Read CSD */ | ||||
| 				if (CardType & CT_SD1) {	/* SDv1 */ | ||||
| 					*(DWORD*)buff = (((csd[10] & 63) << 1) + ((WORD)(csd[11] & 128) >> 7) + 1) << ((csd[13] >> 6) - 1); | ||||
| 				} else {					/* MMCv3 */ | ||||
| 					*(DWORD*)buff = ((WORD)((csd[10] & 124) >> 2) + 1) * (((csd[11] & 3) << 3) + ((csd[11] & 224) >> 5) + 1); | ||||
| 				} | ||||
| 				res = RES_OK; | ||||
| 			} | ||||
| 		} | ||||
| 		break; | ||||
| 
 | ||||
| 	/* Following commands are never used by FatFs module */ | ||||
| 
 | ||||
| 	case MMC_GET_TYPE :		/* Get card type flags (1 byte) */ | ||||
| 		*ptr = CardType; | ||||
| 		res = RES_OK; | ||||
| 		break; | ||||
| 
 | ||||
| 	case MMC_GET_CSD :		/* Receive CSD as a data block (16 bytes) */ | ||||
| 		if (send_cmd(CMD9, 0) == 0		/* READ_CSD */ | ||||
| 			&& rcvr_datablock(ptr, 16)) | ||||
| 			res = RES_OK; | ||||
| 		break; | ||||
| 
 | ||||
| 	case MMC_GET_CID :		/* Receive CID as a data block (16 bytes) */ | ||||
| 		if (send_cmd(CMD10, 0) == 0		/* READ_CID */ | ||||
| 			&& rcvr_datablock(ptr, 16)) | ||||
| 			res = RES_OK; | ||||
| 		break; | ||||
| 
 | ||||
| 	case MMC_GET_OCR :		/* Receive OCR as an R3 resp (4 bytes) */ | ||||
| 		if (send_cmd(CMD58, 0) == 0) {	/* READ_OCR */ | ||||
| 			for (n = 4; n; n--) *ptr++ = xchg_spi(0xFF); | ||||
| 			res = RES_OK; | ||||
| 		} | ||||
| 		break; | ||||
| 
 | ||||
| 	case MMC_GET_SDSTAT :	/* Receive SD statsu as a data block (64 bytes) */ | ||||
| 		if (send_cmd(ACMD13, 0) == 0) {	/* SD_STATUS */ | ||||
| 			xchg_spi(0xFF); | ||||
| 			if (rcvr_datablock(ptr, 64)) | ||||
| 				res = RES_OK; | ||||
| 		} | ||||
| 		break; | ||||
| 
 | ||||
| 	case CTRL_POWER_OFF :	/* Power off */ | ||||
| 		power_off(); | ||||
| 		Stat |= STA_NOINIT; | ||||
| 		res = RES_OK; | ||||
| 		break; | ||||
| 
 | ||||
| 	default: | ||||
| 		res = RES_PARERR; | ||||
| 	} | ||||
| 
 | ||||
| 	deselect(); | ||||
| 
 | ||||
| 	return res; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Device Timer Interrupt Procedure                                      */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* This function must be called in period of 10ms                        */ | ||||
| 
 | ||||
| void disk_timerproc (void) | ||||
| { | ||||
| 	BYTE n, s; | ||||
| 
 | ||||
| 
 | ||||
| 	n = Timer1;				/* 100Hz decrement timer */ | ||||
| 	if (n) Timer1 = --n; | ||||
| 	n = Timer2; | ||||
| 	if (n) Timer2 = --n; | ||||
| 
 | ||||
| 	s = Stat; | ||||
| 
 | ||||
| 	if (MMC_WP)				/* Write protected */ | ||||
| 		s |= STA_PROTECT; | ||||
| 	else					/* Write enabled */ | ||||
| 		s &= ~STA_PROTECT; | ||||
| 
 | ||||
| 	if (MMC_CD)				/* Card inserted */ | ||||
| 		s &= ~STA_NODISK; | ||||
| 	else					/* Socket empty */ | ||||
| 		s |= (STA_NODISK | STA_NOINIT); | ||||
| 
 | ||||
| 	Stat = s;				/* Update MMC status */ | ||||
| } | ||||
| @ -0,0 +1,31 @@ | ||||
| #include <avr/io.h> | ||||
| #include "spi.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * Initialize SPI bus. | ||||
|  */ | ||||
| 
 | ||||
| void | ||||
| spi_init(void) | ||||
| { | ||||
|   // CS PIN for WIZNET ETHERNET
 | ||||
|   DDRB	|= _BV(WIZNET_CS); // CS to OUT && Disable
 | ||||
|   SPI_WIZNET_DISABLE(); | ||||
| 
 | ||||
|   // CS PIN for SDCARD
 | ||||
|   DDRB	|= _BV(SD_CS); // CS to OUT && Disable
 | ||||
|   SPI_SD_DISABLE(); | ||||
|    | ||||
| 
 | ||||
|   /* Initalize ports for communication with SPI units. */ | ||||
|   /* CSN=SS and must be output when master! */ | ||||
|   DDRB  |= _BV(MOSI) | _BV(SCK) | _BV(CSN); | ||||
|   PORTB |= _BV(MOSI) | _BV(SCK); | ||||
|   | ||||
|   /* Enables SPI, selects "master", clock rate FCK / 4 - 4Mhz, and SPI mode 0 */ | ||||
|   SPCR = _BV(SPE) | _BV(MSTR); | ||||
|   SPSR = 0x0; | ||||
|   //SPSR = _BV(SPI2X); //FCK / 2 - 8Mhz
 | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,92 @@ | ||||
| #ifndef SPI_H_ | ||||
| #define SPI_H_ | ||||
| 
 | ||||
| /* SPI input/output registers. */ | ||||
| #define SPI_TXBUF SPDR | ||||
| #define SPI_RXBUF SPDR | ||||
| 
 | ||||
| #define BV(bitno) _BV(bitno) | ||||
| 
 | ||||
| #define SPI_WAITFOREOTx() do { while (!(SPSR & BV(SPIF))); } while (0) | ||||
| #define SPI_WAITFOREORx() do { while (!(SPSR & BV(SPIF))); } while (0) | ||||
| 
 | ||||
| //M128
 | ||||
| //#define SCK            1  /* - Output: SPI Serial Clock (SCLK) - ATMEGA128 PORTB, PIN1 */
 | ||||
| //#define MOSI           2  /* - Output: SPI Master out - slave in (MOSI) - ATMEGA128 PORTB, PIN2 */
 | ||||
| //#define MISO           3  /* - Input:  SPI Master in - slave out (MISO) - ATMEGA128 PORTB, PIN3 */
 | ||||
| //#define CSN            0  /*SPI - SS*/
 | ||||
| //#define FLASH_CS       6       /* PB.6 Output as CS*/
 | ||||
| 
 | ||||
| //M644p/M1284p
 | ||||
| #define SCK            7  /* - Output: SPI Serial Clock (SCLK) - ATMEGA644/1284 PORTB, PIN7 */ | ||||
| #define MOSI           5  /* - Output: SPI Master out - slave in (MOSI) -  ATMEGA644/1284 PORTB, PIN5 */ | ||||
| #define MISO           6  /* - Input:  SPI Master in - slave out (MISO) -  ATMEGA644/1284 PORTB, PIN6 */ | ||||
| #define CSN            4  /*SPI - SS*/ | ||||
| 
 | ||||
| //#define FLASH_CS       3       /* PB.2 Output as CS*/
 | ||||
| //#define FLASH_CS       2       /* PB.2 Output as CS*/
 | ||||
| //#define CAN_CS         1       /* PB.1 Output as CS for CAN MCP2515*/
 | ||||
| 
 | ||||
| //#define SPI_FLASH_ENABLE()  ( PORTB &= ~BV(FLASH_CS) )
 | ||||
| //#define SPI_FLASH_DISABLE() ( PORTB |=  BV(FLASH_CS) )
 | ||||
| 
 | ||||
| #define WIZNET_CS       3       /* PB.3 Output as CS for Wiznet ETHERNET*/ | ||||
| #define SPI_WIZNET_ENABLE()  ( PORTB &= ~BV(WIZNET_CS) ) | ||||
| #define SPI_WIZNET_DISABLE() ( PORTB |=  BV(WIZNET_CS) ) | ||||
| 
 | ||||
| #define SD_CS       0       /* PB.0 Output as CS for SD-reader*/ | ||||
| #define SPI_SD_ENABLE()  ( PORTB &= ~BV(SD_CS) ) | ||||
| #define SPI_SD_DISABLE() ( PORTB |=  BV(SD_CS) ) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* Define macros to use for checking SPI transmission status depending
 | ||||
|    on if it is possible to wait for TX buffer ready. This is possible | ||||
|    on for example MSP430 but not on AVR. */ | ||||
| #ifdef SPI_WAITFORTxREADY | ||||
| #define SPI_WAITFORTx_BEFORE() SPI_WAITFORTxREADY() | ||||
| #define SPI_WAITFORTx_AFTER() | ||||
| #define SPI_WAITFORTx_ENDED() SPI_WAITFOREOTx() | ||||
| #else /* SPI_WAITFORTxREADY */ | ||||
| #define SPI_WAITFORTx_BEFORE() | ||||
| #define SPI_WAITFORTx_AFTER() SPI_WAITFOREOTx() | ||||
| #define SPI_WAITFORTx_ENDED() | ||||
| #endif /* SPI_WAITFORTxREADY */ | ||||
| 
 | ||||
| void spi_init(void); | ||||
| 
 | ||||
| /* Write one character to SPI */ | ||||
| #define SPI_WRITE(data)                         \ | ||||
|   do {                                          \ | ||||
|     SPI_WAITFORTx_BEFORE();                     \ | ||||
|     SPI_TXBUF = data;                           \ | ||||
|     SPI_WAITFOREOTx();                          \ | ||||
|   } while(0) | ||||
| 
 | ||||
| /* Write one character to SPI - will not wait for end
 | ||||
|    useful for multiple writes with wait after final */ | ||||
| #define SPI_WRITE_FAST(data)                    \ | ||||
|   do {                                          \ | ||||
|     SPI_WAITFORTx_BEFORE();                     \ | ||||
|     SPI_TXBUF = data;                           \ | ||||
|     SPI_WAITFORTx_AFTER();                      \ | ||||
|   } while(0) | ||||
| 
 | ||||
| /* Read one character from SPI */ | ||||
| #define SPI_READ(data)   \ | ||||
|   do {                   \ | ||||
|     SPI_TXBUF = 0;       \ | ||||
|     SPI_WAITFOREORx();   \ | ||||
|     data = SPI_RXBUF;    \ | ||||
|   } while(0) | ||||
| 
 | ||||
| /* Flush the SPI read register */ | ||||
| #ifndef SPI_FLUSH | ||||
| #define SPI_FLUSH() \ | ||||
|   do {              \ | ||||
|     SPI_RXBUF;      \ | ||||
|   } while(0); | ||||
| #endif | ||||
| 
 | ||||
| #endif /* SPI_H_ */ | ||||
| @ -0,0 +1,706 @@ | ||||
| /*
 | ||||
|  * Modified  for different BUFFER_SIZE for UART0 && UART1 | ||||
|  * see below: UART0_RX_BUFFER_SIZE/UART1_RX_BUFFER_SIZE && UART0_TX_BUFFER_SIZE/UART1_TX_BUFFER_SIZE | ||||
|  * Ibragimov M. 7/03/2015 | ||||
| */ | ||||
| /*************************************************************************
 | ||||
| Title:    Interrupt UART library with receive/transmit circular buffers | ||||
| Author:   Peter Fleury <pfleury@gmx.ch>   http://jump.to/fleury
 | ||||
| File:     $Id: uart.c,v 1.12 2014/01/08 21:58:12 peter Exp $ | ||||
| Software: AVR-GCC 4.1, AVR Libc 1.4.6 or higher | ||||
| Hardware: any AVR with built-in UART,  | ||||
| License:  GNU General Public License  | ||||
|            | ||||
| DESCRIPTION: | ||||
|     An interrupt is generated when the UART has finished transmitting or | ||||
|     receiving a byte. The interrupt handling routines use circular buffers | ||||
|     for buffering received and transmitted data. | ||||
|      | ||||
|     The UART0[1]_RX_BUFFER_SIZE and UART0[1]_TX_BUFFER_SIZE variables define | ||||
|     the buffer size in bytes. Note that these variables must be a  | ||||
|     power of 2. | ||||
|      | ||||
| USAGE: | ||||
|     Refere to the header file uart.h for a description of the routines.  | ||||
|     See also example test_uart.c. | ||||
| 
 | ||||
| NOTES: | ||||
|     Based on Atmel Application Note AVR306 | ||||
|                      | ||||
| LICENSE: | ||||
|     Copyright (C) 2006 Peter Fleury | ||||
| 
 | ||||
|     This program is free software; you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation; either version 2 of the License, or | ||||
|     any later version. | ||||
| 
 | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
|                          | ||||
| *************************************************************************/ | ||||
| #include <avr/io.h> | ||||
| #include <avr/interrupt.h> | ||||
| #include <avr/pgmspace.h> | ||||
| #include "uart_extd.h" | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  *  constants and macros | ||||
|  */ | ||||
| 
 | ||||
| /* size of RX0/TX0 buffers */ | ||||
| #define UART0_RX_BUFFER_MASK ( UART0_RX_BUFFER_SIZE - 1) | ||||
| #define UART0_TX_BUFFER_MASK ( UART0_TX_BUFFER_SIZE - 1) | ||||
| 
 | ||||
| #if ( UART0_RX_BUFFER_SIZE & UART0_RX_BUFFER_MASK ) | ||||
| #error RX0 buffer size is not a power of 2 | ||||
| #endif | ||||
| #if ( UART0_TX_BUFFER_SIZE & UART0_TX_BUFFER_MASK ) | ||||
| #error TX0 buffer size is not a power of 2 | ||||
| #endif | ||||
| 
 | ||||
| /* size of RX1/TX1 buffers */ | ||||
| #define UART1_RX_BUFFER_MASK ( UART1_RX_BUFFER_SIZE - 1) | ||||
| #define UART1_TX_BUFFER_MASK ( UART1_TX_BUFFER_SIZE - 1) | ||||
| 
 | ||||
| #if ( UART1_RX_BUFFER_SIZE & UART1_RX_BUFFER_MASK ) | ||||
| #error RX1 buffer size is not a power of 2 | ||||
| #endif | ||||
| #if ( UART1_TX_BUFFER_SIZE & UART1_TX_BUFFER_MASK ) | ||||
| #error TX1 buffer size is not a power of 2 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| #if defined(__AVR_AT90S2313__) \ | ||||
|  || defined(__AVR_AT90S4414__) || defined(__AVR_AT90S4434__) \ | ||||
|  || defined(__AVR_AT90S8515__) || defined(__AVR_AT90S8535__) \ | ||||
|  || defined(__AVR_ATmega103__) | ||||
|  /* old AVR classic or ATmega103 with one UART */ | ||||
|  #define AT90_UART | ||||
|  #define UART0_RECEIVE_INTERRUPT   UART_RX_vect  | ||||
|  #define UART0_TRANSMIT_INTERRUPT  UART_UDRE_vect | ||||
|  #define UART0_STATUS   USR | ||||
|  #define UART0_CONTROL  UCR | ||||
|  #define UART0_DATA     UDR   | ||||
|  #define UART0_UDRIE    UDRIE | ||||
| #elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__) | ||||
|  /* old AVR classic with one UART */ | ||||
|  #define AT90_UART | ||||
|  #define UART0_RECEIVE_INTERRUPT   UART_RX_vect  | ||||
|  #define UART0_TRANSMIT_INTERRUPT  UART_UDRE_vect | ||||
|  #define UART0_STATUS   UCSRA | ||||
|  #define UART0_CONTROL  UCSRB | ||||
|  #define UART0_DATA     UDR  | ||||
|  #define UART0_UDRIE    UDRIE | ||||
| #elif  defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \ | ||||
|   || defined(__AVR_ATmega323__) | ||||
|   /* ATmega with one USART */ | ||||
|  #define ATMEGA_USART | ||||
|  #define UART0_RECEIVE_INTERRUPT   USART_RXC_vect | ||||
|  #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect | ||||
|  #define UART0_STATUS   UCSRA | ||||
|  #define UART0_CONTROL  UCSRB | ||||
|  #define UART0_DATA     UDR | ||||
|  #define UART0_UDRIE    UDRIE | ||||
| #elif defined (__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) | ||||
|  #define ATMEGA_USART | ||||
|  #define UART0_RECEIVE_INTERRUPT   USART_RX_vect | ||||
|  #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect | ||||
|  #define UART0_STATUS   UCSRA | ||||
|  #define UART0_CONTROL  UCSRB | ||||
|  #define UART0_DATA     UDR | ||||
|  #define UART0_UDRIE    UDRIE | ||||
| #elif defined(__AVR_ATmega163__) | ||||
|   /* ATmega163 with one UART */ | ||||
|  #define ATMEGA_UART | ||||
|  #define UART0_RECEIVE_INTERRUPT   UART_RX_vect | ||||
|  #define UART0_TRANSMIT_INTERRUPT  UART_UDRE_vect | ||||
|  #define UART0_STATUS   UCSRA | ||||
|  #define UART0_CONTROL  UCSRB | ||||
|  #define UART0_DATA     UDR | ||||
|  #define UART0_UDRIE    UDRIE | ||||
| #elif defined(__AVR_ATmega162__)  | ||||
|  /* ATmega with two USART */ | ||||
|  #define ATMEGA_USART0 | ||||
|  #define ATMEGA_USART1 | ||||
|  #define UART0_RECEIVE_INTERRUPT   USART0_RXC_vect | ||||
|  #define UART1_RECEIVE_INTERRUPT   USART1_RXC_vect | ||||
|  #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect | ||||
|  #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect | ||||
|  #define UART0_STATUS   UCSR0A | ||||
|  #define UART0_CONTROL  UCSR0B | ||||
|  #define UART0_DATA     UDR0 | ||||
|  #define UART0_UDRIE    UDRIE0 | ||||
|  #define UART1_STATUS   UCSR1A | ||||
|  #define UART1_CONTROL  UCSR1B | ||||
|  #define UART1_DATA     UDR1 | ||||
|  #define UART1_UDRIE    UDRIE1 | ||||
| #elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)  | ||||
|  /* ATmega with two USART */ | ||||
|  #define ATMEGA_USART0 | ||||
|  #define ATMEGA_USART1 | ||||
|  #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect | ||||
|  #define UART1_RECEIVE_INTERRUPT   USART1_RX_vect | ||||
|  #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect | ||||
|  #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect | ||||
|  #define UART0_STATUS   UCSR0A | ||||
|  #define UART0_CONTROL  UCSR0B | ||||
|  #define UART0_DATA     UDR0 | ||||
|  #define UART0_UDRIE    UDRIE0 | ||||
|  #define UART1_STATUS   UCSR1A | ||||
|  #define UART1_CONTROL  UCSR1B | ||||
|  #define UART1_DATA     UDR1 | ||||
|  #define UART1_UDRIE    UDRIE1 | ||||
| #elif defined(__AVR_ATmega161__) | ||||
|  /* ATmega with UART */ | ||||
|  #error "AVR ATmega161 currently not supported by this libaray !" | ||||
| #elif defined(__AVR_ATmega169__)  | ||||
|  /* ATmega with one USART */ | ||||
|  #define ATMEGA_USART | ||||
|  #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect | ||||
|  #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect | ||||
|  #define UART0_STATUS   UCSRA | ||||
|  #define UART0_CONTROL  UCSRB | ||||
|  #define UART0_DATA     UDR | ||||
|  #define UART0_UDRIE    UDRIE | ||||
| #elif defined(__AVR_ATmega48__) || defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega48P__) || defined(__AVR_ATmega88P__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__) \ | ||||
|  || defined(__AVR_ATmega3250__) || defined(__AVR_ATmega3290__) ||defined(__AVR_ATmega6450__) || defined(__AVR_ATmega6490__) | ||||
|  /* ATmega with one USART */ | ||||
|  #define ATMEGA_USART0 | ||||
|  #define UART0_RECEIVE_INTERRUPT   USART_RX_vect | ||||
|  #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect | ||||
|  #define UART0_STATUS   UCSR0A | ||||
|  #define UART0_CONTROL  UCSR0B | ||||
|  #define UART0_DATA     UDR0 | ||||
|  #define UART0_UDRIE    UDRIE0 | ||||
| #elif defined(__AVR_ATtiny2313__)  | ||||
|  #define ATMEGA_USART | ||||
|  #define UART0_RECEIVE_INTERRUPT   USART_RX_vect | ||||
|  #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect | ||||
|  #define UART0_STATUS   UCSRA | ||||
|  #define UART0_CONTROL  UCSRB | ||||
|  #define UART0_DATA     UDR | ||||
|  #define UART0_UDRIE    UDRIE | ||||
| #elif defined(__AVR_ATmega329__) || \ | ||||
|       defined(__AVR_ATmega649__) || \ | ||||
|       defined(__AVR_ATmega325__) || \ | ||||
|       defined(__AVR_ATmega645__)  | ||||
|   /* ATmega with one USART */ | ||||
|   #define ATMEGA_USART0 | ||||
|   #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect | ||||
|   #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect | ||||
|   #define UART0_STATUS   UCSR0A | ||||
|   #define UART0_CONTROL  UCSR0B | ||||
|   #define UART0_DATA     UDR0 | ||||
|   #define UART0_UDRIE    UDRIE0 | ||||
| #elif defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega1280__)  || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega640__) | ||||
| /* ATmega with two USART */ | ||||
|   #define ATMEGA_USART0 | ||||
|   #define ATMEGA_USART1 | ||||
|   #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect | ||||
|   #define UART1_RECEIVE_INTERRUPT   USART1_RX_vect | ||||
|   #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect | ||||
|   #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect | ||||
|   #define UART0_STATUS   UCSR0A | ||||
|   #define UART0_CONTROL  UCSR0B | ||||
|   #define UART0_DATA     UDR0 | ||||
|   #define UART0_UDRIE    UDRIE0 | ||||
|   #define UART1_STATUS   UCSR1A | ||||
|   #define UART1_CONTROL  UCSR1B | ||||
|   #define UART1_DATA     UDR1 | ||||
|   #define UART1_UDRIE    UDRIE1   | ||||
| #elif defined(__AVR_ATmega644__) | ||||
|  /* ATmega with one USART */ | ||||
|  #define ATMEGA_USART0 | ||||
|  #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect | ||||
|  #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect | ||||
|  #define UART0_STATUS   UCSR0A | ||||
|  #define UART0_CONTROL  UCSR0B | ||||
|  #define UART0_DATA     UDR0 | ||||
|  #define UART0_UDRIE    UDRIE0 | ||||
| #elif defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) | ||||
|  /* ATmega with two USART */ | ||||
|  #define ATMEGA_USART0 | ||||
|  #define ATMEGA_USART1 | ||||
|  #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect | ||||
|  #define UART1_RECEIVE_INTERRUPT   USART1_RX_vect | ||||
|  #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect | ||||
|  #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect | ||||
|  #define UART0_STATUS   UCSR0A | ||||
|  #define UART0_CONTROL  UCSR0B | ||||
|  #define UART0_DATA     UDR0 | ||||
|  #define UART0_UDRIE    UDRIE0 | ||||
|  #define UART1_STATUS   UCSR1A | ||||
|  #define UART1_CONTROL  UCSR1B | ||||
|  #define UART1_DATA     UDR1 | ||||
|  #define UART1_UDRIE    UDRIE1 | ||||
| #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__) | ||||
|  /* AT90USBxx with one USART */ | ||||
|  #define AT90USB_USART | ||||
|  #define UART0_RECEIVE_INTERRUPT   USART1_RX_vect | ||||
|  #define UART0_TRANSMIT_INTERRUPT  USART1_UDRE_vect | ||||
|  #define UART0_STATUS   UCSR1A | ||||
|  #define UART0_CONTROL  UCSR1B | ||||
|  #define UART0_DATA     UDR1 | ||||
|  #define UART0_UDRIE    UDRIE1 | ||||
| #else | ||||
|  #error "no UART definition for MCU available" | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  *  module global variables | ||||
|  */ | ||||
| static volatile unsigned char UART_TxBuf[UART0_TX_BUFFER_SIZE]; | ||||
| static volatile unsigned char UART_RxBuf[UART0_RX_BUFFER_SIZE]; | ||||
| static volatile unsigned char UART_TxHead; | ||||
| static volatile unsigned char UART_TxTail; | ||||
| static volatile unsigned char UART_RxHead; | ||||
| static volatile unsigned char UART_RxTail; | ||||
| static volatile unsigned char UART_LastRxError; | ||||
| 
 | ||||
| #if defined( ATMEGA_USART1 ) | ||||
| static volatile unsigned char UART1_TxBuf[UART1_TX_BUFFER_SIZE]; | ||||
| static volatile unsigned char UART1_RxBuf[UART1_RX_BUFFER_SIZE]; | ||||
| static volatile unsigned char UART1_TxHead; | ||||
| static volatile unsigned char UART1_TxTail; | ||||
| static volatile unsigned char UART1_RxHead; | ||||
| static volatile unsigned char UART1_RxTail; | ||||
| static volatile unsigned char UART1_LastRxError; | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ISR (UART0_RECEIVE_INTERRUPT)	 | ||||
| /*************************************************************************
 | ||||
| Function: UART Receive Complete interrupt | ||||
| Purpose:  called when the UART has received a character | ||||
| **************************************************************************/ | ||||
| { | ||||
|     unsigned char tmphead; | ||||
|     unsigned char data; | ||||
|     unsigned char usr; | ||||
|     unsigned char lastRxError; | ||||
|   | ||||
|   | ||||
|     /* read UART status register and UART data register */  | ||||
|     usr  = UART0_STATUS; | ||||
|     data = UART0_DATA; | ||||
|      | ||||
|     /* */ | ||||
| #if defined( AT90_UART ) | ||||
|     lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); | ||||
| #elif defined( ATMEGA_USART ) | ||||
|     lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); | ||||
| #elif defined( ATMEGA_USART0 ) | ||||
|     lastRxError = (usr & (_BV(FE0)|_BV(DOR0)) ); | ||||
| #elif defined ( ATMEGA_UART ) | ||||
|     lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); | ||||
| #elif defined( AT90USB_USART ) | ||||
|     lastRxError = (usr & (_BV(FE1)|_BV(DOR1)) ); | ||||
| #endif | ||||
|          | ||||
|     /* calculate buffer index */  | ||||
|     tmphead = ( UART_RxHead + 1) & UART0_RX_BUFFER_MASK; | ||||
|      | ||||
|     if ( tmphead == UART_RxTail ) { | ||||
|         /* error: receive buffer overflow */ | ||||
|         lastRxError = UART_BUFFER_OVERFLOW >> 8; | ||||
|     }else{ | ||||
|         /* store new index */ | ||||
|         UART_RxHead = tmphead; | ||||
|         /* store received data in buffer */ | ||||
|         UART_RxBuf[tmphead] = data; | ||||
|     } | ||||
|     UART_LastRxError |= lastRxError;    | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| ISR (UART0_TRANSMIT_INTERRUPT) | ||||
| /*************************************************************************
 | ||||
| Function: UART Data Register Empty interrupt | ||||
| Purpose:  called when the UART is ready to transmit the next byte | ||||
| **************************************************************************/ | ||||
| { | ||||
|     unsigned char tmptail; | ||||
| 
 | ||||
|      | ||||
|     if ( UART_TxHead != UART_TxTail) { | ||||
|         /* calculate and store new buffer index */ | ||||
|         tmptail = (UART_TxTail + 1) & UART0_TX_BUFFER_MASK; | ||||
|         UART_TxTail = tmptail; | ||||
|         /* get one byte from buffer and write it to UART */ | ||||
|         UART0_DATA = UART_TxBuf[tmptail];  /* start transmission */ | ||||
|     }else{ | ||||
|         /* tx buffer empty, disable UDRE interrupt */ | ||||
|         UART0_CONTROL &= ~_BV(UART0_UDRIE); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
| Function: uart_init() | ||||
| Purpose:  initialize UART and set baudrate | ||||
| Input:    baudrate using macro UART_BAUD_SELECT() | ||||
| Returns:  none | ||||
| **************************************************************************/ | ||||
| void uart_init(unsigned int baudrate) | ||||
| { | ||||
|     UART_TxHead = 0; | ||||
|     UART_TxTail = 0; | ||||
|     UART_RxHead = 0; | ||||
|     UART_RxTail = 0; | ||||
|      | ||||
| #if defined( AT90_UART ) | ||||
|     /* set baud rate */ | ||||
|     UBRR = (unsigned char)baudrate;  | ||||
| 
 | ||||
|     /* enable UART receiver and transmmitter and receive complete interrupt */ | ||||
|     UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN); | ||||
| 
 | ||||
| #elif defined (ATMEGA_USART) | ||||
|     /* Set baud rate */ | ||||
|     if ( baudrate & 0x8000 ) | ||||
|     { | ||||
|     	 UART0_STATUS = (1<<U2X);  //Enable 2x speed 
 | ||||
|     	 baudrate &= ~0x8000; | ||||
|     } | ||||
|     UBRRH = (unsigned char)(baudrate>>8); | ||||
|     UBRRL = (unsigned char) baudrate; | ||||
|     | ||||
|     /* Enable USART receiver and transmitter and receive complete interrupt */ | ||||
|     UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN); | ||||
|      | ||||
|     /* Set frame format: asynchronous, 8data, no parity, 1stop bit */ | ||||
|     #ifdef URSEL | ||||
|     UCSRC = (1<<URSEL)|(3<<UCSZ0); | ||||
|     #else | ||||
|     UCSRC = (3<<UCSZ0); | ||||
|     #endif  | ||||
|      | ||||
| #elif defined (ATMEGA_USART0 ) | ||||
|     /* Set baud rate */ | ||||
|     if ( baudrate & 0x8000 )  | ||||
|     { | ||||
|    		UART0_STATUS = (1<<U2X0);  //Enable 2x speed 
 | ||||
|    		baudrate &= ~0x8000; | ||||
|    	} | ||||
|     UBRR0H = (unsigned char)(baudrate>>8); | ||||
|     UBRR0L = (unsigned char) baudrate; | ||||
| 
 | ||||
|     /* Enable USART receiver and transmitter and receive complete interrupt */ | ||||
|     UART0_CONTROL = _BV(RXCIE0)|(1<<RXEN0)|(1<<TXEN0); | ||||
|      | ||||
|     /* Set frame format: asynchronous, 8data, no parity, 1stop bit */ | ||||
|     #ifdef URSEL0 | ||||
|     UCSR0C = (1<<URSEL0)|(3<<UCSZ00); | ||||
|     #else | ||||
|     UCSR0C = (3<<UCSZ00); | ||||
|     #endif  | ||||
| 
 | ||||
| #elif defined ( ATMEGA_UART ) | ||||
|     /* set baud rate */ | ||||
|     if ( baudrate & 0x8000 )  | ||||
|     { | ||||
|     	UART0_STATUS = (1<<U2X);  //Enable 2x speed 
 | ||||
|     	baudrate &= ~0x8000; | ||||
|     } | ||||
|     UBRRHI = (unsigned char)(baudrate>>8); | ||||
|     UBRR   = (unsigned char) baudrate; | ||||
| 
 | ||||
|     /* Enable UART receiver and transmitter and receive complete interrupt */ | ||||
|     UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN); | ||||
| 
 | ||||
| #elif defined ( AT90USB_USART ) | ||||
|    /* set baud rate */ | ||||
|     if ( baudrate & 0x8000 )  | ||||
|     { | ||||
|     	UART0_STATUS = (1<<U2X1 );  //Enable 2x speed 
 | ||||
|     	baudrate &= ~0x8000; | ||||
|     } | ||||
|     UBRR1H = (unsigned char)(baudrate>>8); | ||||
|     UBRR1L = (unsigned char) baudrate; | ||||
| 
 | ||||
|     /* Enable UART receiver and transmitter and receive complete interrupt */ | ||||
|     UART0_CONTROL = _BV(RXCIE1)|(1<<RXEN1)|(1<<TXEN1); | ||||
|      | ||||
|     /* Set frame format: asynchronous, 8data, no parity, 1stop bit */ | ||||
|     UCSR1C = (1<<UCSZ11)|(1<<UCSZ10); | ||||
| #endif | ||||
| 
 | ||||
| }/* uart_init */ | ||||
| 
 | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
| Function: uart_getc() | ||||
| Purpose:  return byte from ringbuffer   | ||||
| Returns:  lower byte:  received byte from ringbuffer | ||||
|           higher byte: last receive error | ||||
| **************************************************************************/ | ||||
| unsigned int uart_getc(void) | ||||
| {     | ||||
|     unsigned char tmptail; | ||||
|     unsigned char data; | ||||
| 
 | ||||
| 
 | ||||
|     if ( UART_RxHead == UART_RxTail ) { | ||||
|         return UART_NO_DATA;   /* no data available */ | ||||
|     } | ||||
|      | ||||
|     /* calculate /store buffer index */ | ||||
|     tmptail = (UART_RxTail + 1) & UART0_RX_BUFFER_MASK; | ||||
|     UART_RxTail = tmptail;  | ||||
|      | ||||
|     /* get data from receive buffer */ | ||||
|     data = UART_RxBuf[tmptail]; | ||||
|      | ||||
|     data = (UART_LastRxError << 8) + data; | ||||
|     UART_LastRxError = 0; | ||||
|     return data; | ||||
| 
 | ||||
| }/* uart_getc */ | ||||
| 
 | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
| Function: uart_putc() | ||||
| Purpose:  write byte to ringbuffer for transmitting via UART | ||||
| Input:    byte to be transmitted | ||||
| Returns:  none           | ||||
| **************************************************************************/ | ||||
| void uart_putc(unsigned char data) | ||||
| { | ||||
|     unsigned char tmphead; | ||||
| 
 | ||||
|      | ||||
|     tmphead  = (UART_TxHead + 1) & UART0_TX_BUFFER_MASK; | ||||
|      | ||||
|     while ( tmphead == UART_TxTail ){ | ||||
|         ;/* wait for free space in buffer */ | ||||
|     } | ||||
|      | ||||
|     UART_TxBuf[tmphead] = data; | ||||
|     UART_TxHead = tmphead; | ||||
| 
 | ||||
|     /* enable UDRE interrupt */ | ||||
|     UART0_CONTROL    |= _BV(UART0_UDRIE); | ||||
| 
 | ||||
| }/* uart_putc */ | ||||
| 
 | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
| Function: uart_puts() | ||||
| Purpose:  transmit string to UART | ||||
| Input:    string to be transmitted | ||||
| Returns:  none           | ||||
| **************************************************************************/ | ||||
| void uart_puts(const char *s ) | ||||
| { | ||||
|     while (*s)  | ||||
|       uart_putc(*s++); | ||||
| 
 | ||||
| }/* uart_puts */ | ||||
| 
 | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
| Function: uart_puts_p() | ||||
| Purpose:  transmit string from program memory to UART | ||||
| Input:    program memory string to be transmitted | ||||
| Returns:  none | ||||
| **************************************************************************/ | ||||
| void uart_puts_p(const char *progmem_s ) | ||||
| { | ||||
|     register char c; | ||||
|      | ||||
|     while ( (c = pgm_read_byte(progmem_s++)) )  | ||||
|       uart_putc(c); | ||||
| 
 | ||||
| }/* uart_puts_p */ | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * these functions are only for ATmegas with two USART | ||||
|  */ | ||||
| #if defined( ATMEGA_USART1 ) | ||||
| 
 | ||||
| ISR(UART1_RECEIVE_INTERRUPT) | ||||
| /*************************************************************************
 | ||||
| Function: UART1 Receive Complete interrupt | ||||
| Purpose:  called when the UART1 has received a character | ||||
| **************************************************************************/ | ||||
| { | ||||
|     unsigned char tmphead; | ||||
|     unsigned char data; | ||||
|     unsigned char usr; | ||||
|     unsigned char lastRxError; | ||||
|   | ||||
|   | ||||
|     /* read UART status register and UART data register */  | ||||
|     usr  = UART1_STATUS; | ||||
|     data = UART1_DATA; | ||||
|      | ||||
|     /* */ | ||||
|     lastRxError = (usr & (_BV(FE1)|_BV(DOR1)) ); | ||||
|          | ||||
|     /* calculate buffer index */  | ||||
|     tmphead = ( UART1_RxHead + 1) & UART1_RX_BUFFER_MASK; | ||||
|      | ||||
|     if ( tmphead == UART1_RxTail ) { | ||||
|         /* error: receive buffer overflow */ | ||||
|         lastRxError = UART_BUFFER_OVERFLOW >> 8; | ||||
|     }else{ | ||||
|         /* store new index */ | ||||
|         UART1_RxHead = tmphead; | ||||
|         /* store received data in buffer */ | ||||
|         UART1_RxBuf[tmphead] = data; | ||||
|     } | ||||
|     UART1_LastRxError |= lastRxError;    | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| ISR(UART1_TRANSMIT_INTERRUPT) | ||||
| /*************************************************************************
 | ||||
| Function: UART1 Data Register Empty interrupt | ||||
| Purpose:  called when the UART1 is ready to transmit the next byte | ||||
| **************************************************************************/ | ||||
| { | ||||
|     unsigned char tmptail; | ||||
| 
 | ||||
|      | ||||
|     if ( UART1_TxHead != UART1_TxTail) { | ||||
|         /* calculate and store new buffer index */ | ||||
|         tmptail = (UART1_TxTail + 1) & UART1_TX_BUFFER_MASK; | ||||
|         UART1_TxTail = tmptail; | ||||
|         /* get one byte from buffer and write it to UART */ | ||||
|         UART1_DATA = UART1_TxBuf[tmptail];  /* start transmission */ | ||||
|     }else{ | ||||
|         /* tx buffer empty, disable UDRE interrupt */ | ||||
|         UART1_CONTROL &= ~_BV(UART1_UDRIE); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
| Function: uart1_init() | ||||
| Purpose:  initialize UART1 and set baudrate | ||||
| Input:    baudrate using macro UART_BAUD_SELECT() | ||||
| Returns:  none | ||||
| **************************************************************************/ | ||||
| void uart1_init(unsigned int baudrate) | ||||
| { | ||||
|     UART1_TxHead = 0; | ||||
|     UART1_TxTail = 0; | ||||
|     UART1_RxHead = 0; | ||||
|     UART1_RxTail = 0; | ||||
|      | ||||
| 
 | ||||
|     /* Set baud rate */ | ||||
|     if ( baudrate & 0x8000 )  | ||||
|     { | ||||
|     	UART1_STATUS = (1<<U2X1);  //Enable 2x speed 
 | ||||
|       baudrate &= ~0x8000; | ||||
|     } | ||||
|     UBRR1H = (unsigned char)(baudrate>>8); | ||||
|     UBRR1L = (unsigned char) baudrate; | ||||
| 
 | ||||
|     /* Enable USART receiver and transmitter and receive complete interrupt */ | ||||
|     UART1_CONTROL = _BV(RXCIE1)|(1<<RXEN1)|(1<<TXEN1); | ||||
|      | ||||
|     /* Set frame format: asynchronous, 8data, no parity, 1stop bit */    | ||||
|     #ifdef URSEL1 | ||||
|     UCSR1C = (1<<URSEL1)|(3<<UCSZ10); | ||||
|     #else | ||||
|     UCSR1C = (3<<UCSZ10); | ||||
|     #endif  | ||||
| }/* uart_init */ | ||||
| 
 | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
| Function: uart1_getc() | ||||
| Purpose:  return byte from ringbuffer   | ||||
| Returns:  lower byte:  received byte from ringbuffer | ||||
|           higher byte: last receive error | ||||
| **************************************************************************/ | ||||
| unsigned int uart1_getc(void) | ||||
| {     | ||||
|     unsigned char tmptail; | ||||
|     unsigned char data; | ||||
| 
 | ||||
| 
 | ||||
|     if ( UART1_RxHead == UART1_RxTail ) { | ||||
|         return UART_NO_DATA;   /* no data available */ | ||||
|     } | ||||
|      | ||||
|     /* calculate /store buffer index */ | ||||
|     tmptail = (UART1_RxTail + 1) & UART1_RX_BUFFER_MASK; | ||||
|     UART1_RxTail = tmptail;  | ||||
|      | ||||
|     /* get data from receive buffer */ | ||||
|     data = UART1_RxBuf[tmptail]; | ||||
|      | ||||
|     data = (UART1_LastRxError << 8) + data; | ||||
|     UART1_LastRxError = 0; | ||||
|     return data; | ||||
| 
 | ||||
| }/* uart1_getc */ | ||||
| 
 | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
| Function: uart1_putc() | ||||
| Purpose:  write byte to ringbuffer for transmitting via UART | ||||
| Input:    byte to be transmitted | ||||
| Returns:  none           | ||||
| **************************************************************************/ | ||||
| void uart1_putc(unsigned char data) | ||||
| { | ||||
|     unsigned char tmphead; | ||||
| 
 | ||||
|      | ||||
|     tmphead  = (UART1_TxHead + 1) & UART1_TX_BUFFER_MASK; | ||||
|      | ||||
|     while ( tmphead == UART1_TxTail ){ | ||||
|         ;/* wait for free space in buffer */ | ||||
|     } | ||||
|      | ||||
|     UART1_TxBuf[tmphead] = data; | ||||
|     UART1_TxHead = tmphead; | ||||
| 
 | ||||
|     /* enable UDRE interrupt */ | ||||
|     UART1_CONTROL    |= _BV(UART1_UDRIE); | ||||
| 
 | ||||
| }/* uart1_putc */ | ||||
| 
 | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
| Function: uart1_puts() | ||||
| Purpose:  transmit string to UART1 | ||||
| Input:    string to be transmitted | ||||
| Returns:  none           | ||||
| **************************************************************************/ | ||||
| void uart1_puts(const char *s ) | ||||
| { | ||||
|     while (*s)  | ||||
|       uart1_putc(*s++); | ||||
| 
 | ||||
| }/* uart1_puts */ | ||||
| 
 | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
| Function: uart1_puts_p() | ||||
| Purpose:  transmit string from program memory to UART1 | ||||
| Input:    program memory string to be transmitted | ||||
| Returns:  none | ||||
| **************************************************************************/ | ||||
| void uart1_puts_p(const char *progmem_s ) | ||||
| { | ||||
|     register char c; | ||||
|      | ||||
|     while ( (c = pgm_read_byte(progmem_s++)) )  | ||||
|       uart1_putc(c); | ||||
| 
 | ||||
| }/* uart1_puts_p */ | ||||
| 
 | ||||
| 
 | ||||
| #endif | ||||
| @ -0,0 +1,209 @@ | ||||
| #ifndef UART_H | ||||
| #define UART_H | ||||
| /*
 | ||||
|  * Modified  for different BUFFER_SIZE for UART0 && UART1 | ||||
|  * see below: UART0_RX_BUFFER_SIZE/UART1_RX_BUFFER_SIZE && UART0_TX_BUFFER_SIZE/UART1_TX_BUFFER_SIZE | ||||
|  * Ibragimov M. 7/03/2015 | ||||
| */ | ||||
| /************************************************************************
 | ||||
| Title:    Interrupt UART library with receive/transmit circular buffers | ||||
| Author:   Peter Fleury <pfleury@gmx.ch>   http://jump.to/fleury
 | ||||
| File:     $Id: uart.h,v 1.12 2012/11/19 19:52:27 peter Exp $ | ||||
| Software: AVR-GCC 4.1, AVR Libc 1.4 | ||||
| Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz | ||||
| License:  GNU General Public License  | ||||
| Usage:    see Doxygen manual | ||||
| 
 | ||||
| LICENSE: | ||||
|     Copyright (C) 2006 Peter Fleury | ||||
| 
 | ||||
|     This program is free software; you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation; either version 2 of the License, or | ||||
|     any later version. | ||||
| 
 | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
|      | ||||
| ************************************************************************/ | ||||
| 
 | ||||
| /** 
 | ||||
|  *  @defgroup pfleury_uart UART Library | ||||
|  *  @code #include <uart.h> @endcode | ||||
|  *  | ||||
|  *  @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers.  | ||||
|  * | ||||
|  *  This library can be used to transmit and receive data through the built in UART.  | ||||
|  * | ||||
|  *  An interrupt is generated when the UART has finished transmitting or | ||||
|  *  receiving a byte. The interrupt handling routines use circular buffers | ||||
|  *  for buffering received and transmitted data. | ||||
|  * | ||||
|  *  The UART0[1]_RX_BUFFER_SIZE and UART0[1]_TX_BUFFER_SIZE constants define | ||||
|  *  the size of the circular buffers in bytes. Note that these constants must be a power of 2. | ||||
|  *  You may need to adapt this constants to your target and your application by adding  | ||||
|  *  CDEFS += -DUART0[1]_RX_BUFFER_SIZE=nn -DUART0[1]_RX_BUFFER_SIZE=nn to your Makefile. | ||||
|  * | ||||
|  *  @note Based on Atmel Application Note AVR306 | ||||
|  *  @author Peter Fleury pfleury@gmx.ch  http://jump.to/fleury
 | ||||
|  */ | ||||
|   | ||||
| /**@{*/ | ||||
| 
 | ||||
| 
 | ||||
| #if (__GNUC__ * 100 + __GNUC_MINOR__) < 304 | ||||
| #error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !" | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
| ** constants and macros | ||||
| */ | ||||
| 
 | ||||
| /** @brief  UART Baudrate Expression
 | ||||
|  *  @param  xtalcpu  system clock in Mhz, e.g. 4000000UL for 4Mhz           | ||||
|  *  @param  baudrate baudrate in bps, e.g. 1200, 2400, 9600      | ||||
|  */ | ||||
| #define UART_BAUD_SELECT(baudRate,xtalCpu)  (((xtalCpu) + 8UL * (baudRate)) / (16UL * (baudRate)) -1UL) | ||||
| 
 | ||||
| /** @brief  UART Baudrate Expression for ATmega double speed mode
 | ||||
|  *  @param  xtalcpu  system clock in Mhz, e.g. 4000000UL for 4Mhz            | ||||
|  *  @param  baudrate baudrate in bps, e.g. 1200, 2400, 9600      | ||||
|  */ | ||||
| #define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) ( ((((xtalCpu) + 4UL * (baudRate)) / (8UL * (baudRate)) -1UL)) | 0x8000) | ||||
| 
 | ||||
| 
 | ||||
| /** Size of the circular receive buffer UART0, must be power of 2 */ | ||||
| #ifndef UART0_RX_BUFFER_SIZE | ||||
| #define UART0_RX_BUFFER_SIZE 128 | ||||
| #endif | ||||
| /** Size of the circular transmit buffer UART0, must be power of 2 */ | ||||
| #ifndef UART0_TX_BUFFER_SIZE | ||||
| #define UART0_TX_BUFFER_SIZE 128 | ||||
| #endif | ||||
| 
 | ||||
| /** Size of the circular receive buffer UART1, must be power of 2 */ | ||||
| #ifndef UART1_RX_BUFFER_SIZE | ||||
| #define UART1_RX_BUFFER_SIZE 128 | ||||
| #endif | ||||
| /** Size of the circular transmit buffer UART1, must be power of 2 */ | ||||
| #ifndef UART1_TX_BUFFER_SIZE | ||||
| #define UART1_TX_BUFFER_SIZE 128 | ||||
| #endif | ||||
| 
 | ||||
| /* test if the size of the circular buffers fits into SRAM */ | ||||
| #if ( (UART0_RX_BUFFER_SIZE+UART0_TX_BUFFER_SIZE+UART1_RX_BUFFER_SIZE+UART1_TX_BUFFER_SIZE) >= (RAMEND-0x60 ) ) | ||||
| #error "size of UART0[1]_RX_BUFFER_SIZE + UART0[1]_TX_BUFFER_SIZE larger than size of SRAM" | ||||
| #endif | ||||
| 
 | ||||
| /* 
 | ||||
| ** high byte error return code of uart_getc() | ||||
| */ | ||||
| #define UART_FRAME_ERROR      0x1000              /* Framing Error by UART       */ | ||||
| #define UART_OVERRUN_ERROR    0x0800              /* Overrun condition by UART   */ | ||||
| #define UART_PARITY_ERROR     0x0400              /* Parity Error by UART        */  | ||||
| #define UART_BUFFER_OVERFLOW  0x0200              /* receive ringbuffer overflow */ | ||||
| #define UART_NO_DATA          0x0100              /* no receive data available   */ | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
| ** function prototypes | ||||
| */ | ||||
| 
 | ||||
| /**
 | ||||
|    @brief   Initialize UART and set baudrate  | ||||
|    @param   baudrate Specify baudrate using macro UART_BAUD_SELECT() | ||||
|    @return  none | ||||
| */ | ||||
| extern void uart_init(unsigned int baudrate); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  *  @brief   Get received byte from ringbuffer | ||||
|  * | ||||
|  * Returns in the lower byte the received character and in the  | ||||
|  * higher byte the last receive error. | ||||
|  * UART_NO_DATA is returned when no data is available. | ||||
|  * | ||||
|  *  @param   void | ||||
|  *  @return  lower byte:  received byte from ringbuffer | ||||
|  *  @return  higher byte: last receive status | ||||
|  *           - \b 0 successfully received data from UART | ||||
|  *           - \b UART_NO_DATA            | ||||
|  *             <br>no receive data available | ||||
|  *           - \b UART_BUFFER_OVERFLOW    | ||||
|  *             <br>Receive ringbuffer overflow. | ||||
|  *             We are not reading the receive buffer fast enough,  | ||||
|  *             one or more received character have been dropped  | ||||
|  *           - \b UART_OVERRUN_ERROR      | ||||
|  *             <br>Overrun condition by UART. | ||||
|  *             A character already present in the UART UDR register was  | ||||
|  *             not read by the interrupt handler before the next character arrived, | ||||
|  *             one or more received characters have been dropped. | ||||
|  *           - \b UART_FRAME_ERROR        | ||||
|  *             <br>Framing Error by UART | ||||
|  */ | ||||
| extern unsigned int uart_getc(void); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  *  @brief   Put byte to ringbuffer for transmitting via UART | ||||
|  *  @param   data byte to be transmitted | ||||
|  *  @return  none | ||||
|  */ | ||||
| extern void uart_putc(unsigned char data); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  *  @brief   Put string to ringbuffer for transmitting via UART | ||||
|  * | ||||
|  *  The string is buffered by the uart library in a circular buffer | ||||
|  *  and one character at a time is transmitted to the UART using interrupts. | ||||
|  *  Blocks if it can not write the whole string into the circular buffer. | ||||
|  *  | ||||
|  *  @param   s string to be transmitted | ||||
|  *  @return  none | ||||
|  */ | ||||
| extern void uart_puts(const char *s ); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief    Put string from program memory to ringbuffer for transmitting via UART. | ||||
|  * | ||||
|  * The string is buffered by the uart library in a circular buffer | ||||
|  * and one character at a time is transmitted to the UART using interrupts. | ||||
|  * Blocks if it can not write the whole string into the circular buffer. | ||||
|  * | ||||
|  * @param    s program memory string to be transmitted | ||||
|  * @return   none | ||||
|  * @see      uart_puts_P | ||||
|  */ | ||||
| extern void uart_puts_p(const char *s ); | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief    Macro to automatically put a string constant into program memory | ||||
|  */ | ||||
| #define uart_puts_P(__s)       uart_puts_p(PSTR(__s)) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /** @brief  Initialize USART1 (only available on selected ATmegas) @see uart_init */ | ||||
| extern void uart1_init(unsigned int baudrate); | ||||
| /** @brief  Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */ | ||||
| extern unsigned int uart1_getc(void); | ||||
| /** @brief  Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */ | ||||
| extern void uart1_putc(unsigned char data); | ||||
| /** @brief  Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */ | ||||
| extern void uart1_puts(const char *s ); | ||||
| /** @brief  Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */ | ||||
| extern void uart1_puts_p(const char *s ); | ||||
| /** @brief  Macro to automatically put a string constant into program memory */ | ||||
| #define uart1_puts_P(__s)       uart1_puts_p(PSTR(__s)) | ||||
| 
 | ||||
| /**@}*/ | ||||
| 
 | ||||
| 
 | ||||
| #endif // UART_H 
 | ||||
| 
 | ||||
| @ -0,0 +1,327 @@ | ||||
| /**
 | ||||
|  * @file	userHandler.c | ||||
|  * @brief	User Control Example | ||||
|  * @version 1.0 | ||||
|  * @date	2014/07/15 | ||||
|  * @par Revision | ||||
|  *			2014/07/15 - 1.0 Release | ||||
|  * @author	 | ||||
|  * \n\n @par Copyright (C) 1998 - 2014 WIZnet. All rights reserved. | ||||
|  */ | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| //#include "board.h"
 | ||||
| #include "httpUtil.h" | ||||
| #include "userHandler.h" | ||||
| //#include "adcHandler.h"
 | ||||
| #include "wizchip_conf.h" | ||||
| #include "globals.h" | ||||
| 
 | ||||
| /* Unavailable Pins  (W5500-EVB component preempted) */ | ||||
| // >> UART Rx/Tx 		: D0 (Rx), D1 (Tx)
 | ||||
| // >> W5500 SPI(SPI0)	: D11 (MOSI), D12 (MISO), D13 (SCK)
 | ||||
| 
 | ||||
| /* On-board Devices */ | ||||
| // >> Input		: D14 (SW1) / D15 (SW2)
 | ||||
| // >> Input		: AIN (Potentiometer / TEMP.Sensor)
 | ||||
| // >> Output	: D8 (LED R) / D9 (LED G) / D10 (LED B)
 | ||||
| 
 | ||||
| /* NXP LPC11Exx GPIO functions */ | ||||
| // GPIO: Pin state
 | ||||
| //Chip_GPIO_GetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin]);
 | ||||
| //Chip_GPIO_SetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin], true);
 | ||||
| //Chip_GPIO_SetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin], false);
 | ||||
| 
 | ||||
| // GPIO: Pin direction
 | ||||
| //Chip_GPIO_GetPinDIR((LPC_GPIO, dio_ports[pin], dio_pins[pin]);
 | ||||
| //Chip_GPIO_SetPinDIROutput(LPC_GPIO, dio_ports[pin], dio_pins[pin]);
 | ||||
| //Chip_GPIO_SetPinDIRInput(LPC_GPIO, dio_ports[pin], dio_pins[pin]);
 | ||||
| 
 | ||||
| // Pre-defined Get CGI functions
 | ||||
| //void make_json_dio(uint8_t * buf, uint16_t * len, uint8_t pin);
 | ||||
| void make_json_ain(uint8_t * buf, uint16_t * len, uint8_t pin); | ||||
| void make_json_netinfo(uint8_t * buf, uint16_t * len); | ||||
| void make_json_led1(uint8_t * buf, uint16_t * len); | ||||
| void make_info(uint8_t * buf, uint16_t * len); | ||||
| 
 | ||||
| // Pre-defined Set CGI functions
 | ||||
| int8_t set_diodir(uint8_t * uri); | ||||
| int8_t set_diostate(uint8_t * uri); | ||||
| 
 | ||||
| uint8_t predefined_get_cgi_processor(uint8_t * uri_name, uint8_t * buf, uint16_t * len) | ||||
| { | ||||
| 	//return 0; //Just a stub, not used yet..
 | ||||
| 	//uint8_t ret = 1;	// ret = 1 means 'uri_name' matched
 | ||||
| 	uint8_t ret = 0;	// ret = 0 means 'uri_name' not matched
 | ||||
| 	uint8_t cgibuf[14] = {0, }; | ||||
| 	int8_t cgi_dio = -1; | ||||
| 	int8_t cgi_ain = -1; | ||||
| 
 | ||||
| 	uint8_t i; | ||||
| 
 | ||||
| 	if(strcmp_P((const char *)uri_name,PSTR("todo.cgi")) == 0) | ||||
| 	{ | ||||
| //		// to do
 | ||||
| //		;//make_json_todo(buf, len);
 | ||||
| 	} | ||||
| 	else if(strcmp_P((const char *)uri_name,PSTR("get_netinfo.cgi")) == 0) | ||||
| 	{ | ||||
| 		make_json_netinfo(buf, len); | ||||
| 		ret = 1; // ret = 1 means 'uri_name' matched
 | ||||
| 	} | ||||
| 	else if(strcmp_P((const char *)uri_name,PSTR("get_led1.cgi")) == 0) | ||||
| 	{ | ||||
| 		make_json_led1(buf, len); | ||||
| 		ret = 1; // ret = 1 means 'uri_name' matched
 | ||||
| 	} | ||||
| 	else if(strcmp_P((const char *)uri_name,PSTR("get_info.cgi")) == 0) | ||||
| 	{ | ||||
| 		make_info(buf, len); | ||||
| 		ret = 1; // ret = 1 means 'uri_name' matched
 | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| //		// get_dio0.cgi ~ get_dio15.cgi
 | ||||
| //		for(i = 0; i < DIOn; i++)
 | ||||
| //		{
 | ||||
| //			memset(cgibuf, 0x00, 14);
 | ||||
| //			sprintf((char *)cgibuf, "get_dio%d.cgi", i);
 | ||||
| //			if(strcmp((const char *)uri_name, (const char *)cgibuf) == 0)
 | ||||
| //			{
 | ||||
| //				make_json_dio(buf, len, i);
 | ||||
| //				cgi_dio = i;
 | ||||
| //				break;
 | ||||
| //			}
 | ||||
| //		}
 | ||||
| //
 | ||||
| //		if(cgi_dio < 0)
 | ||||
| 		//Analog Ins reading  get_ain0.cgi ~ get_ain7.cgi
 | ||||
| 		if(1) | ||||
| 		{ | ||||
| 			// get_ain0.cgi ~ get_ain5.cgi (A0 - A5), get_ain6.cgi for on-board potentiometer / Temp.Sensor - LPC11Exx
 | ||||
| 			//for(i = 0; i < AINn; i++) //for LPC11xx
 | ||||
| 			for(i = 0; i < 8; i++) //for AVR Mega1284p, available AIN0..AIN7
 | ||||
| 			{ | ||||
| 				memset(cgibuf, 0x00, 14); | ||||
| 				sprintf((char *)cgibuf, "get_ain%d.cgi", i); | ||||
| 				if(strcmp((const char *)uri_name, (const char *)cgibuf) == 0) | ||||
| 				{ | ||||
| 					make_json_ain(buf, len, i); | ||||
| 					cgi_ain = i; | ||||
| 					ret = 1; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| //		if((cgi_dio < 0) && (cgi_ain < 0)) ret = 0;
 | ||||
| 	} | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| uint8_t predefined_set_cgi_processor(uint8_t * uri_name, uint8_t * uri, uint8_t * buf, uint16_t * len) | ||||
| { | ||||
| //	return 0; //Just a stub, not used yet..
 | ||||
| 	uint8_t ret = 0; // ret = 0 means 'uri_name' not matched
 | ||||
| //	uint8_t ret = 1;	// ret = '1' means 'uri_name' matched
 | ||||
| 	uint8_t val = 0; | ||||
| 
 | ||||
| 	if(strcmp_P((const char *)uri_name,PSTR("todo.cgi")) == 0) | ||||
| 	{ | ||||
| 		// to do
 | ||||
| 		;//val = todo(uri);
 | ||||
| 		//*len = sprintf((char *)buf, "%d", val);
 | ||||
| 	} | ||||
| //	// Digital I/O; dio_s, dio_d
 | ||||
| //	else if(strcmp_P((const char *)uri_name,PSTR("set_diodir.cgi")) == 0)
 | ||||
| //	{
 | ||||
| //		//val = set_diodir(uri);
 | ||||
| //		//printf_P(PSTR("+++set_diodir.cgi uri_name: %s; uri: %s;\r\n"));
 | ||||
| //		*len = sprintf_P((char *)buf, PSTR("%d"), val);
 | ||||
| //		ret = 1;
 | ||||
| //	}
 | ||||
| 	else if(strcmp((const char *)uri_name, "set_diostate.cgi") == 0) | ||||
| 	{ | ||||
| 		//When uri_name=set_diostate.cgi, and uri HTTP POST request which contains something like:
 | ||||
| 		//pin=8&val=1; or pin=8&val=1; (look <dio.html> && <dio.js>)
 | ||||
| 
 | ||||
| 		/*
 | ||||
| 		This is LPC11xx handler | ||||
| 		val = set_diostate(uri); | ||||
| 		len = sprintf((char *)buf, "%d", val); | ||||
| 		len ret = 1; | ||||
| 		*/ | ||||
| 
 | ||||
| 
 | ||||
| 		//!!Just for debug
 | ||||
| 		PRINTF("\r\n+++set_diostate.cgi uri_name: %s\r\nuri: %s\r\n", uri_name, uri); | ||||
| 
 | ||||
| 		//Parse URI (Very dirty!!)
 | ||||
| 		if(strstr_P(uri,PSTR("pin=LED1&val=0"))) | ||||
| 		{ | ||||
| 			led1_low(); | ||||
| 			*len = sprintf_P((char *)buf, PSTR("LED1: OFF")); | ||||
| 			ret = 1; | ||||
| 		} | ||||
| 		else if(strstr_P(uri,PSTR("pin=LED1&val=1"))) | ||||
| 		{ | ||||
| 			led1_high(); | ||||
| 			*len = sprintf_P((char *)buf, PSTR("LED1: ON")); | ||||
| 			ret = 1; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			//*len = sprintf_P((char *)buf, PSTR("%d"), -1);
 | ||||
| 			*len = sprintf_P((char *)buf, PSTR("???")); | ||||
| 			ret = 1; | ||||
| 		} | ||||
| 	} | ||||
| //	else
 | ||||
| //	{
 | ||||
| //		ret = 0;
 | ||||
| //	}
 | ||||
| //
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Pre-defined Get CGI functions
 | ||||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| //void make_json_dio(uint8_t * buf, uint16_t * len, uint8_t pin)
 | ||||
| //{
 | ||||
| //	uint8_t pin_state 	= Chip_GPIO_GetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin]);
 | ||||
| //	uint8_t pin_dir 	= Chip_GPIO_GetPinDIR(LPC_GPIO, dio_ports[pin], dio_pins[pin]);
 | ||||
| //
 | ||||
| //	*len = sprintf((char *)buf, "DioCallback({\"dio_p\":\"%d\",\
 | ||||
| //											\"dio_s\":\"%d\",\
 | ||||
| //											\"dio_d\":\"%d\"\
 | ||||
| //											});",
 | ||||
| //											pin,					// Digital io pin number
 | ||||
| //											pin_state,				// Digital io status
 | ||||
| //											pin_dir					// Digital io directions
 | ||||
| //											);
 | ||||
| //}
 | ||||
| //
 | ||||
| void make_json_led1(uint8_t * buf, uint16_t * len) | ||||
| { | ||||
| 	if(led1_read()) | ||||
| 	{ | ||||
| 		*len = sprintf_P((char *)buf,PSTR( "led1Callback({\"led1_txt\":\"LED1: ON\"});")); //Send back LED1 state via call-back function
 | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		*len = sprintf_P((char *)buf,PSTR( "led1Callback({\"led1_txt\":\"LED1: OFF\"});")); //Send back LED1 state via call-back function
 | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| void make_info(uint8_t * buf, uint16_t * len) | ||||
| { | ||||
| 	/*
 | ||||
| 	 * Send program metrics: | ||||
| 	 * Program name | ||||
| 	 * time-date compile | ||||
| 	 * MCU info | ||||
| 	 * free ram info | ||||
| 	 * uptime device | ||||
| 	 */ | ||||
| 	*len = sprintf_P((char *)buf,PSTR(\ | ||||
| 			"<pre>%S"\ | ||||
| 			"Compiled at: %S %S\r\n"\ | ||||
| 			"MCU is: %S; CLK is: %luHz\r\n"\ | ||||
| 			"Free RAM: %dbytes\r\n"\ | ||||
| 			"Uptime: %lusec\r\n</pre>"),\ | ||||
| 			str_prog_name,\ | ||||
| 			compile_time, compile_date,\ | ||||
| 			str_mcu, F_CPU,\ | ||||
| 			freeRam(),\ | ||||
| 			millis()/1000); | ||||
| } | ||||
| 
 | ||||
| void make_json_ain(uint8_t * buf, uint16_t * len, uint8_t pin) | ||||
| { | ||||
| 	*len = sprintf_P((char *)buf,PSTR( "AinCallback({\"ain_p\":\"%d\",\
 | ||||
| 											\"ain_v\":\"%d\"\
 | ||||
| 											});"), | ||||
| 											pin,					// ADC input pin number
 | ||||
| 											//get_ADC_val(pin)		// ADC input value for LPC11xx
 | ||||
| 											adc_read(pin) // ADC input value for AVR
 | ||||
| 											); | ||||
| } | ||||
| 
 | ||||
| void make_json_netinfo(uint8_t * buf, uint16_t * len) | ||||
| { | ||||
| 	wiz_NetInfo netinfo; | ||||
| 	ctlnetwork(CN_GET_NETINFO, (void*) &netinfo); | ||||
| 
 | ||||
| 	// DHCP: 1 - Static, 2 - DHCP
 | ||||
| 	*len = sprintf_P((char *)buf,PSTR( "NetinfoCallback({\"mac\":\"%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\",\
 | ||||
| 											\"ip\":\"%d.%d.%d.%d\",\
 | ||||
| 											\"gw\":\"%d.%d.%d.%d\",\
 | ||||
| 											\"sn\":\"%d.%d.%d.%d\",\
 | ||||
| 											\"dns\":\"%d.%d.%d.%d\",\
 | ||||
| 											\"dhcp\":\"%d\"\
 | ||||
| 											});"), | ||||
| 											netinfo.mac[0], netinfo.mac[1], netinfo.mac[2], netinfo.mac[3], netinfo.mac[4], netinfo.mac[5], | ||||
| 											netinfo.ip[0], netinfo.ip[1], netinfo.ip[2], netinfo.ip[3], | ||||
| 											netinfo.gw[0], netinfo.gw[1], netinfo.gw[2], netinfo.gw[3], | ||||
| 											netinfo.sn[0], netinfo.sn[1], netinfo.sn[2], netinfo.sn[3], | ||||
| 											netinfo.dns[0], netinfo.dns[1], netinfo.dns[2], netinfo.dns[3], | ||||
| 											netinfo.dhcp | ||||
| 											); | ||||
| } | ||||
| 
 | ||||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Pre-defined Set CGI functions
 | ||||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| //int8_t set_diodir(uint8_t * uri)
 | ||||
| //{
 | ||||
| //	uint8_t * param;
 | ||||
| //	uint8_t pin = 0, val = 0;
 | ||||
| //
 | ||||
| //	if((param = get_http_param_value((char *)uri, "pin"))) // GPIO; D0 ~ D15
 | ||||
| //	{
 | ||||
| //		pin = (uint8_t)ATOI(param, 10);
 | ||||
| //		if(pin > 15) return -1;
 | ||||
| //
 | ||||
| //		if((param = get_http_param_value((char *)uri, "val")))  // Direction; NotUsed/Input/Output
 | ||||
| //		{
 | ||||
| //			val = (uint8_t)ATOI(param, 10);
 | ||||
| //			if(val > Output) val = Output;
 | ||||
| //		}
 | ||||
| //	}
 | ||||
| //
 | ||||
| //	if(val == Input) 		Chip_GPIO_SetPinDIRInput(LPC_GPIO, dio_ports[pin], dio_pins[pin]);	// Input
 | ||||
| //	else 					Chip_GPIO_SetPinDIROutput(LPC_GPIO, dio_ports[pin], dio_pins[pin]); // Output
 | ||||
| //
 | ||||
| //	return pin;
 | ||||
| //}
 | ||||
| //
 | ||||
| //int8_t set_diostate(uint8_t * uri)
 | ||||
| //{
 | ||||
| //	uint8_t * param;
 | ||||
| //	uint8_t pin = 0, val = 0;
 | ||||
| //
 | ||||
| //	if((param = get_http_param_value((char *)uri, "pin"))) // GPIO; D0 ~ D15
 | ||||
| //	{
 | ||||
| //		pin = (uint8_t)ATOI(param, 10);
 | ||||
| //		if(pin > 15) return -1;
 | ||||
| //
 | ||||
| //		if((param = get_http_param_value((char *)uri, "val")))  // State; high(on)/low(off)
 | ||||
| //		{
 | ||||
| //			val = (uint8_t)ATOI(param, 10);
 | ||||
| //			if(val > On) val = On;
 | ||||
| //		}
 | ||||
| //
 | ||||
| //		if(val == On) 		Chip_GPIO_SetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin], true); 	// High
 | ||||
| //		else				Chip_GPIO_SetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin], false);	// Low
 | ||||
| //	}
 | ||||
| //
 | ||||
| //	return pin;
 | ||||
| //}
 | ||||
| @ -0,0 +1,42 @@ | ||||
| /**
 | ||||
|  * @file	userHandler.h | ||||
|  * @brief	Header File for User Control Example | ||||
|  * @version 1.0 | ||||
|  * @date	2014/07/15 | ||||
|  * @par Revision | ||||
|  *			2014/07/15 - 1.0 Release | ||||
|  * @author	 | ||||
|  * \n\n @par Copyright (C) 1998 - 2014 WIZnet. All rights reserved. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef __USERHANDLER_H | ||||
| #define __USERHANDLER_H | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| //#define _WEB_DEBUG_
 | ||||
| 
 | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Public Functions
 | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // to do
 | ||||
| 
 | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Pre-defined CGI Interface Functions Handler
 | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| uint8_t predefined_get_cgi_processor(uint8_t * uri_name, uint8_t * buf, uint16_t * len); | ||||
| uint8_t predefined_set_cgi_processor(uint8_t * uri_name, uint8_t * uri, uint8_t * buf, uint16_t * len); | ||||
| 
 | ||||
| 
 | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // HTTP GET Method CGI Functions
 | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // to do
 | ||||
| 
 | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // HTTP POST Method CGI Functions
 | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // to do
 | ||||
| 
 | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
		Reference in New Issue