changes for w5500
This commit is contained in:
parent
dad1033a2b
commit
cd72ca317c
@ -1,5 +1,5 @@
|
|||||||
[PreviousLibFiles]
|
[PreviousLibFiles]
|
||||||
LibFiles=Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_exti.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_exti.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xe.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/tz_context.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_cm7.h;
|
LibFiles=Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_exti.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_exti.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xe.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/tz_context.h;Drivers/CMSIS/Include/core_sc300.h;
|
||||||
|
|
||||||
[PreviousUsedIarFiles]
|
[PreviousUsedIarFiles]
|
||||||
SourceFiles=../Core/Src/main.c;../Core/Src/gpio.c;../Core/Src/adc.c;../Core/Src/spi.c;../Core/Src/usart.c;../Core/Src/stm32f1xx_it.c;../Core/Src/stm32f1xx_hal_msp.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Core/Src/system_stm32f1xx.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Core/Src/system_stm32f1xx.c;../Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;;
|
SourceFiles=../Core/Src/main.c;../Core/Src/gpio.c;../Core/Src/adc.c;../Core/Src/spi.c;../Core/Src/usart.c;../Core/Src/stm32f1xx_it.c;../Core/Src/stm32f1xx_hal_msp.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Core/Src/system_stm32f1xx.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Core/Src/system_stm32f1xx.c;../Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;;
|
||||||
@ -14,25 +14,25 @@ CDefines=USE_HAL_DRIVER;STM32F103xE;USE_HAL_DRIVER;USE_HAL_DRIVER;
|
|||||||
[PreviousGenFiles]
|
[PreviousGenFiles]
|
||||||
AdvancedFolderStructure=true
|
AdvancedFolderStructure=true
|
||||||
HeaderFileListSize=7
|
HeaderFileListSize=7
|
||||||
HeaderFiles#0=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Inc/gpio.h
|
HeaderFiles#0=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Inc/gpio.h
|
||||||
HeaderFiles#1=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Inc/adc.h
|
HeaderFiles#1=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Inc/adc.h
|
||||||
HeaderFiles#2=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Inc/spi.h
|
HeaderFiles#2=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Inc/spi.h
|
||||||
HeaderFiles#3=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Inc/usart.h
|
HeaderFiles#3=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Inc/usart.h
|
||||||
HeaderFiles#4=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Inc/stm32f1xx_it.h
|
HeaderFiles#4=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Inc/stm32f1xx_it.h
|
||||||
HeaderFiles#5=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Inc/stm32f1xx_hal_conf.h
|
HeaderFiles#5=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Inc/stm32f1xx_hal_conf.h
|
||||||
HeaderFiles#6=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Inc/main.h
|
HeaderFiles#6=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Inc/main.h
|
||||||
HeaderFolderListSize=1
|
HeaderFolderListSize=1
|
||||||
HeaderPath#0=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Inc
|
HeaderPath#0=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Inc
|
||||||
HeaderFiles=;
|
HeaderFiles=;
|
||||||
SourceFileListSize=7
|
SourceFileListSize=7
|
||||||
SourceFiles#0=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Src/gpio.c
|
SourceFiles#0=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Src/gpio.c
|
||||||
SourceFiles#1=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Src/adc.c
|
SourceFiles#1=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Src/adc.c
|
||||||
SourceFiles#2=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Src/spi.c
|
SourceFiles#2=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Src/spi.c
|
||||||
SourceFiles#3=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Src/usart.c
|
SourceFiles#3=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Src/usart.c
|
||||||
SourceFiles#4=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Src/stm32f1xx_it.c
|
SourceFiles#4=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Src/stm32f1xx_it.c
|
||||||
SourceFiles#5=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Src/stm32f1xx_hal_msp.c
|
SourceFiles#5=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Src/stm32f1xx_hal_msp.c
|
||||||
SourceFiles#6=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Src/main.c
|
SourceFiles#6=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Src/main.c
|
||||||
SourceFolderListSize=1
|
SourceFolderListSize=1
|
||||||
SourcePath#0=/home/wn/Workspaces/mbusgateway3variant/cube/Core/Src
|
SourcePath#0=/home/wn/Workspaces/MBusGateway3Variant/cube/Core/Src
|
||||||
SourceFiles=;
|
SourceFiles=;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Processed by ../tools/insertMyCode.sh
|
# Processed by ../tools/insertMyCode.sh
|
||||||
##########################################################################################################################
|
##########################################################################################################################
|
||||||
# File automatically-generated by tool: [projectgenerator] version: [3.10.0-B14] date: [Sat Nov 07 18:11:45 CET 2020]
|
# File automatically-generated by tool: [projectgenerator] version: [3.10.0-B14] date: [Sat Nov 07 22:09:20 CET 2020]
|
||||||
##########################################################################################################################
|
##########################################################################################################################
|
||||||
|
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
@ -37,7 +37,7 @@ BUILD_DIR = build
|
|||||||
######################################
|
######################################
|
||||||
# C sources
|
# C sources
|
||||||
C_SOURCES = \
|
C_SOURCES = \
|
||||||
User/Src/eeprom.c User/Src/frontend.c User/Src/logger.c User/Src/loopCtrl.c User/Src/main2.c User/Src/mbusComm.c User/Src/ringbuffer.c User/Src/show.c hottislib/PontCoopScheduler.c \
|
User/Src/eeprom.c User/Src/frontend.c User/Src/logger.c User/Src/loopCtrl.c User/Src/main2.c User/Src/mbusComm.c User/Src/ringbuffer.c User/Src/show.c hottislib/PontCoopScheduler.c w5500/dhcp.c w5500/dns.c w5500/httpParser.c w5500/httpServer.c w5500/httpUtil.c w5500/MQTTClient.c w5500/mqtt_interface.c w5500/socket.c w5500/w5500.c w5500/wizchip_conf.c \
|
||||||
libmbus/mbus/mbus-protocol.c \
|
libmbus/mbus/mbus-protocol.c \
|
||||||
Core/Src/main.c \
|
Core/Src/main.c \
|
||||||
Core/Src/gpio.c \
|
Core/Src/gpio.c \
|
||||||
@ -121,6 +121,7 @@ AS_INCLUDES =
|
|||||||
# C includes
|
# C includes
|
||||||
C_INCLUDES = \
|
C_INCLUDES = \
|
||||||
-Ihottislib \
|
-Ihottislib \
|
||||||
|
-Iw5500 \
|
||||||
-Ilibmbus \
|
-Ilibmbus \
|
||||||
-IUser/Inc \
|
-IUser/Inc \
|
||||||
-ICore/Inc \
|
-ICore/Inc \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
##########################################################################################################################
|
##########################################################################################################################
|
||||||
# File automatically-generated by tool: [projectgenerator] version: [3.10.0-B14] date: [Sat Nov 07 18:11:45 CET 2020]
|
# File automatically-generated by tool: [projectgenerator] version: [3.10.0-B14] date: [Sat Nov 07 22:09:20 CET 2020]
|
||||||
##########################################################################################################################
|
##########################################################################################################################
|
||||||
|
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
|
582
cube/w5500/MQTTClient.c
Normal file
582
cube/w5500/MQTTClient.c
Normal file
@ -0,0 +1,582 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2014, 2015 IBM Corp.
|
||||||
|
*
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||||
|
*
|
||||||
|
* The Eclipse Public License is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
* and the Eclipse Distribution License is available at
|
||||||
|
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Allan Stockdill-Mander/Ian Craggs - initial API and implementation and/or initial documentation
|
||||||
|
*******************************************************************************/
|
||||||
|
#include "MQTTClient.h"
|
||||||
|
|
||||||
|
static void NewMessageData(MessageData* md, MQTTString* aTopicName, MQTTMessage* aMessage) {
|
||||||
|
md->topicName = aTopicName;
|
||||||
|
md->message = aMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int getNextPacketId(MQTTClient *c) {
|
||||||
|
return c->next_packetid = (c->next_packetid == MAX_PACKET_ID) ? 1 : c->next_packetid + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int sendPacket(MQTTClient* c, int length, Timer* timer)
|
||||||
|
{
|
||||||
|
int rc = FAILURE,
|
||||||
|
sent = 0;
|
||||||
|
|
||||||
|
while (sent < length && !TimerIsExpired(timer))
|
||||||
|
{
|
||||||
|
rc = c->ipstack->mqttwrite(c->ipstack, &c->buf[sent], length, TimerLeftMS(timer));
|
||||||
|
if (rc < 0) // there was an error writing the data
|
||||||
|
break;
|
||||||
|
sent += rc;
|
||||||
|
}
|
||||||
|
if (sent == length)
|
||||||
|
{
|
||||||
|
TimerCountdown(&c->ping_timer, c->keepAliveInterval); // record the fact that we have successfully sent the packet
|
||||||
|
rc = SUCCESSS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rc = FAILURE;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MQTTClientInit(MQTTClient* c, Network* network, unsigned int command_timeout_ms,
|
||||||
|
unsigned char* sendbuf, size_t sendbuf_size, unsigned char* readbuf, size_t readbuf_size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
c->ipstack = network;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
|
||||||
|
c->messageHandlers[i].topicFilter = 0;
|
||||||
|
c->command_timeout_ms = command_timeout_ms;
|
||||||
|
c->buf = sendbuf;
|
||||||
|
c->buf_size = sendbuf_size;
|
||||||
|
c->readbuf = readbuf;
|
||||||
|
c->readbuf_size = readbuf_size;
|
||||||
|
c->isconnected = 0;
|
||||||
|
c->ping_outstanding = 0;
|
||||||
|
c->defaultMessageHandler = NULL;
|
||||||
|
c->next_packetid = 1;
|
||||||
|
TimerInit(&c->ping_timer);
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexInit(&c->mutex);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int decodePacket(MQTTClient* c, int* value, int timeout)
|
||||||
|
{
|
||||||
|
unsigned char i;
|
||||||
|
int multiplier = 1;
|
||||||
|
int len = 0;
|
||||||
|
const int MAX_NO_OF_REMAINING_LENGTH_BYTES = 4;
|
||||||
|
|
||||||
|
*value = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
int rc = MQTTPACKET_READ_ERROR;
|
||||||
|
|
||||||
|
if (++len > MAX_NO_OF_REMAINING_LENGTH_BYTES)
|
||||||
|
{
|
||||||
|
rc = MQTTPACKET_READ_ERROR; /* bad data */
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
rc = c->ipstack->mqttread(c->ipstack, &i, 1, timeout);
|
||||||
|
if (rc != 1)
|
||||||
|
goto exit;
|
||||||
|
*value += (i & 127) * multiplier;
|
||||||
|
multiplier *= 128;
|
||||||
|
} while ((i & 128) != 0);
|
||||||
|
exit:
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int readPacket(MQTTClient* c, Timer* timer)
|
||||||
|
{
|
||||||
|
int rc = FAILURE;
|
||||||
|
MQTTHeader header = {0};
|
||||||
|
int len = 0;
|
||||||
|
int rem_len = 0;
|
||||||
|
|
||||||
|
/* 1. read the header byte. This has the packet type in it */
|
||||||
|
if (c->ipstack->mqttread(c->ipstack, c->readbuf, 1, TimerLeftMS(timer)) != 1)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
len = 1;
|
||||||
|
/* 2. read the remaining length. This is variable in itself */
|
||||||
|
decodePacket(c, &rem_len, TimerLeftMS(timer));
|
||||||
|
len += MQTTPacket_encode(c->readbuf + 1, rem_len); /* put the original remaining length back into the buffer */
|
||||||
|
|
||||||
|
/* 3. read the rest of the buffer using a callback to supply the rest of the data */
|
||||||
|
if (rem_len > 0 && (c->ipstack->mqttread(c->ipstack, c->readbuf + len, rem_len, TimerLeftMS(timer)) != rem_len))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
header.byte = c->readbuf[0];
|
||||||
|
rc = header.bits.type;
|
||||||
|
exit:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// assume topic filter and name is in correct format
|
||||||
|
// # can only be at end
|
||||||
|
// + and # can only be next to separator
|
||||||
|
static char isTopicMatched(char* topicFilter, MQTTString* topicName)
|
||||||
|
{
|
||||||
|
char* curf = topicFilter;
|
||||||
|
char* curn = topicName->lenstring.data;
|
||||||
|
char* curn_end = curn + topicName->lenstring.len;
|
||||||
|
|
||||||
|
while (*curf && curn < curn_end)
|
||||||
|
{
|
||||||
|
if (*curn == '/' && *curf != '/')
|
||||||
|
break;
|
||||||
|
if (*curf != '+' && *curf != '#' && *curf != *curn)
|
||||||
|
break;
|
||||||
|
if (*curf == '+')
|
||||||
|
{ // skip until we meet the next separator, or end of string
|
||||||
|
char* nextpos = curn + 1;
|
||||||
|
while (nextpos < curn_end && *nextpos != '/')
|
||||||
|
nextpos = ++curn + 1;
|
||||||
|
}
|
||||||
|
else if (*curf == '#')
|
||||||
|
curn = curn_end - 1; // skip until end of string
|
||||||
|
curf++;
|
||||||
|
curn++;
|
||||||
|
};
|
||||||
|
|
||||||
|
return (curn == curn_end) && (*curf == '\0');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int deliverMessage(MQTTClient* c, MQTTString* topicName, MQTTMessage* message)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int rc = FAILURE;
|
||||||
|
|
||||||
|
// we have to find the right message handler - indexed by topic
|
||||||
|
for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
|
||||||
|
{
|
||||||
|
if (c->messageHandlers[i].topicFilter != 0 && (MQTTPacket_equals(topicName, (char*)c->messageHandlers[i].topicFilter) ||
|
||||||
|
isTopicMatched((char*)c->messageHandlers[i].topicFilter, topicName)))
|
||||||
|
{
|
||||||
|
if (c->messageHandlers[i].fp != NULL)
|
||||||
|
{
|
||||||
|
MessageData md;
|
||||||
|
NewMessageData(&md, topicName, message);
|
||||||
|
c->messageHandlers[i].fp(&md);
|
||||||
|
rc = SUCCESSS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rc == FAILURE && c->defaultMessageHandler != NULL)
|
||||||
|
{
|
||||||
|
MessageData md;
|
||||||
|
NewMessageData(&md, topicName, message);
|
||||||
|
c->defaultMessageHandler(&md);
|
||||||
|
rc = SUCCESSS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int keepalive(MQTTClient* c)
|
||||||
|
{
|
||||||
|
int rc = FAILURE;
|
||||||
|
|
||||||
|
if (c->keepAliveInterval == 0)
|
||||||
|
{
|
||||||
|
rc = SUCCESSS;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TimerIsExpired(&c->ping_timer))
|
||||||
|
{
|
||||||
|
if (!c->ping_outstanding)
|
||||||
|
{
|
||||||
|
Timer timer;
|
||||||
|
TimerInit(&timer);
|
||||||
|
TimerCountdownMS(&timer, 1000);
|
||||||
|
int len = MQTTSerialize_pingreq(c->buf, c->buf_size);
|
||||||
|
if (len > 0 && (rc = sendPacket(c, len, &timer)) == SUCCESSS) // send the ping packet
|
||||||
|
c->ping_outstanding = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int cycle(MQTTClient* c, Timer* timer)
|
||||||
|
{
|
||||||
|
// read the socket, see what work is due
|
||||||
|
unsigned short packet_type = readPacket(c, timer);
|
||||||
|
|
||||||
|
int len = 0,
|
||||||
|
rc = SUCCESSS;
|
||||||
|
|
||||||
|
switch (packet_type)
|
||||||
|
{
|
||||||
|
case CONNACK:
|
||||||
|
case PUBACK:
|
||||||
|
case SUBACK:
|
||||||
|
break;
|
||||||
|
case PUBLISH:
|
||||||
|
{
|
||||||
|
MQTTString topicName;
|
||||||
|
MQTTMessage msg;
|
||||||
|
int intQoS;
|
||||||
|
if (MQTTDeserialize_publish(&msg.dup, &intQoS, &msg.retained, &msg.id, &topicName,
|
||||||
|
(unsigned char**)&msg.payload, (int*)&msg.payloadlen, c->readbuf, c->readbuf_size) != 1)
|
||||||
|
goto exit;
|
||||||
|
msg.qos = (enum QoS)intQoS;
|
||||||
|
deliverMessage(c, &topicName, &msg);
|
||||||
|
if (msg.qos != QOS0)
|
||||||
|
{
|
||||||
|
if (msg.qos == QOS1)
|
||||||
|
len = MQTTSerialize_ack(c->buf, c->buf_size, PUBACK, 0, msg.id);
|
||||||
|
else if (msg.qos == QOS2)
|
||||||
|
len = MQTTSerialize_ack(c->buf, c->buf_size, PUBREC, 0, msg.id);
|
||||||
|
if (len <= 0)
|
||||||
|
rc = FAILURE;
|
||||||
|
else
|
||||||
|
rc = sendPacket(c, len, timer);
|
||||||
|
if (rc == FAILURE)
|
||||||
|
goto exit; // there was a problem
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case PUBREC:
|
||||||
|
{
|
||||||
|
unsigned short mypacketid;
|
||||||
|
unsigned char dup, type;
|
||||||
|
if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)
|
||||||
|
rc = FAILURE;
|
||||||
|
else if ((len = MQTTSerialize_ack(c->buf, c->buf_size, PUBREL, 0, mypacketid)) <= 0)
|
||||||
|
rc = FAILURE;
|
||||||
|
else if ((rc = sendPacket(c, len, timer)) != SUCCESSS) // send the PUBREL packet
|
||||||
|
rc = FAILURE; // there was a problem
|
||||||
|
if (rc == FAILURE)
|
||||||
|
goto exit; // there was a problem
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case PUBCOMP:
|
||||||
|
break;
|
||||||
|
case PINGRESP:
|
||||||
|
c->ping_outstanding = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
keepalive(c);
|
||||||
|
exit:
|
||||||
|
if (rc == SUCCESSS)
|
||||||
|
rc = packet_type;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MQTTYield(MQTTClient* c, int timeout_ms)
|
||||||
|
{
|
||||||
|
int rc = SUCCESSS;
|
||||||
|
Timer timer;
|
||||||
|
|
||||||
|
TimerInit(&timer);
|
||||||
|
TimerCountdownMS(&timer, timeout_ms);
|
||||||
|
|
||||||
|
if (cycle(c, &timer) == FAILURE)
|
||||||
|
{
|
||||||
|
rc = FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MQTTRun(void* parm)
|
||||||
|
{
|
||||||
|
Timer timer;
|
||||||
|
MQTTClient* c = (MQTTClient*)parm;
|
||||||
|
|
||||||
|
TimerInit(&timer);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexLock(&c->mutex);
|
||||||
|
#endif
|
||||||
|
TimerCountdownMS(&timer, 500); /* Don't wait too long if no traffic is incoming */
|
||||||
|
cycle(c, &timer);
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexUnlock(&c->mutex);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
int MQTTStartTask(MQTTClient* client)
|
||||||
|
{
|
||||||
|
return ThreadStart(&client->thread, &MQTTRun, client);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
int waitfor(MQTTClient* c, int packet_type, Timer* timer)
|
||||||
|
{
|
||||||
|
int rc = FAILURE;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (TimerIsExpired(timer))
|
||||||
|
break; // we timed out
|
||||||
|
}
|
||||||
|
while ((rc = cycle(c, timer)) != packet_type);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MQTTConnect(MQTTClient* c, MQTTPacket_connectData* options)
|
||||||
|
{
|
||||||
|
Timer connect_timer;
|
||||||
|
int rc = FAILURE;
|
||||||
|
MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer;
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexLock(&c->mutex);
|
||||||
|
#endif
|
||||||
|
if (c->isconnected) /* don't send connect packet again if we are already connected */
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
TimerInit(&connect_timer);
|
||||||
|
TimerCountdownMS(&connect_timer, c->command_timeout_ms);
|
||||||
|
|
||||||
|
if (options == 0)
|
||||||
|
options = &default_options; /* set default options if none were supplied */
|
||||||
|
|
||||||
|
c->keepAliveInterval = options->keepAliveInterval;
|
||||||
|
TimerCountdown(&c->ping_timer, c->keepAliveInterval);
|
||||||
|
if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= 0)
|
||||||
|
goto exit;
|
||||||
|
if ((rc = sendPacket(c, len, &connect_timer)) != SUCCESSS) // send the connect packet
|
||||||
|
goto exit; // there was a problem
|
||||||
|
|
||||||
|
// this will be a blocking call, wait for the connack
|
||||||
|
if (waitfor(c, CONNACK, &connect_timer) == CONNACK)
|
||||||
|
{
|
||||||
|
unsigned char connack_rc = 255;
|
||||||
|
unsigned char sessionPresent = 0;
|
||||||
|
if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, c->readbuf, c->readbuf_size) == 1)
|
||||||
|
rc = connack_rc;
|
||||||
|
else
|
||||||
|
rc = FAILURE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rc = FAILURE;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
if (rc == SUCCESSS)
|
||||||
|
c->isconnected = 1;
|
||||||
|
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexUnlock(&c->mutex);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MQTTSubscribe(MQTTClient* c, const char* topicFilter, enum QoS qos, messageHandler messageHandler)
|
||||||
|
{
|
||||||
|
int rc = FAILURE;
|
||||||
|
Timer timer;
|
||||||
|
int len = 0;
|
||||||
|
MQTTString topic = MQTTString_initializer;
|
||||||
|
topic.cstring = (char *)topicFilter;
|
||||||
|
// This was added because enum QoS was previously typed to *int which resulted in HardFault and unaligned integer read.
|
||||||
|
// This coping below makes sure the parameter for MQTTSerialize_subscribe is always char no matter what compiler is using for enums
|
||||||
|
char charQos = (char)qos;
|
||||||
|
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexLock(&c->mutex);
|
||||||
|
#endif
|
||||||
|
if (!c->isconnected)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
TimerInit(&timer);
|
||||||
|
TimerCountdownMS(&timer, c->command_timeout_ms);
|
||||||
|
|
||||||
|
len = MQTTSerialize_subscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic, &charQos);
|
||||||
|
if (len <= 0)
|
||||||
|
goto exit;
|
||||||
|
if ((rc = sendPacket(c, len, &timer)) != SUCCESSS) // send the subscribe packet
|
||||||
|
goto exit; // there was a problem
|
||||||
|
|
||||||
|
if (waitfor(c, SUBACK, &timer) == SUBACK) // wait for suback
|
||||||
|
{
|
||||||
|
int count = 0, grantedQoS = -1;
|
||||||
|
unsigned short mypacketid;
|
||||||
|
if (MQTTDeserialize_suback(&mypacketid, 1, &count, &grantedQoS, c->readbuf, c->readbuf_size) == 1)
|
||||||
|
rc = grantedQoS; // 0, 1, 2 or 0x80
|
||||||
|
if (rc != 0x80)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
|
||||||
|
{
|
||||||
|
if (c->messageHandlers[i].topicFilter == 0)
|
||||||
|
{
|
||||||
|
c->messageHandlers[i].topicFilter = topicFilter;
|
||||||
|
c->messageHandlers[i].fp = messageHandler;
|
||||||
|
rc = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rc = FAILURE;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexUnlock(&c->mutex);
|
||||||
|
#endif
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MQTTUnsubscribe(MQTTClient* c, const char* topicFilter)
|
||||||
|
{
|
||||||
|
int rc = FAILURE;
|
||||||
|
Timer timer;
|
||||||
|
MQTTString topic = MQTTString_initializer;
|
||||||
|
topic.cstring = (char *)topicFilter;
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexLock(&c->mutex);
|
||||||
|
#endif
|
||||||
|
if (!c->isconnected)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
TimerInit(&timer);
|
||||||
|
TimerCountdownMS(&timer, c->command_timeout_ms);
|
||||||
|
|
||||||
|
if ((len = MQTTSerialize_unsubscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic)) <= 0)
|
||||||
|
goto exit;
|
||||||
|
if ((rc = sendPacket(c, len, &timer)) != SUCCESSS) // send the subscribe packet
|
||||||
|
goto exit; // there was a problem
|
||||||
|
|
||||||
|
if (waitfor(c, UNSUBACK, &timer) == UNSUBACK)
|
||||||
|
{
|
||||||
|
unsigned short mypacketid; // should be the same as the packetid above
|
||||||
|
if (MQTTDeserialize_unsuback(&mypacketid, c->readbuf, c->readbuf_size) == 1)
|
||||||
|
rc = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rc = FAILURE;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexUnlock(&c->mutex);
|
||||||
|
#endif
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MQTTPublish(MQTTClient* c, const char* topicName, MQTTMessage* message)
|
||||||
|
{
|
||||||
|
int rc = FAILURE;
|
||||||
|
Timer timer;
|
||||||
|
MQTTString topic = MQTTString_initializer;
|
||||||
|
topic.cstring = (char *)topicName;
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexLock(&c->mutex);
|
||||||
|
#endif
|
||||||
|
if (!c->isconnected)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
TimerInit(&timer);
|
||||||
|
TimerCountdownMS(&timer, c->command_timeout_ms);
|
||||||
|
|
||||||
|
if (message->qos == QOS1 || message->qos == QOS2)
|
||||||
|
message->id = getNextPacketId(c);
|
||||||
|
|
||||||
|
len = MQTTSerialize_publish(c->buf, c->buf_size, 0, message->qos, message->retained, message->id,
|
||||||
|
topic, (unsigned char*)message->payload, message->payloadlen);
|
||||||
|
if (len <= 0)
|
||||||
|
goto exit;
|
||||||
|
if ((rc = sendPacket(c, len, &timer)) != SUCCESSS) // send the subscribe packet
|
||||||
|
goto exit; // there was a problem
|
||||||
|
|
||||||
|
if (message->qos == QOS1)
|
||||||
|
{
|
||||||
|
if (waitfor(c, PUBACK, &timer) == PUBACK)
|
||||||
|
{
|
||||||
|
unsigned short mypacketid;
|
||||||
|
unsigned char dup, type;
|
||||||
|
if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)
|
||||||
|
rc = FAILURE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rc = FAILURE;
|
||||||
|
}
|
||||||
|
else if (message->qos == QOS2)
|
||||||
|
{
|
||||||
|
if (waitfor(c, PUBCOMP, &timer) == PUBCOMP)
|
||||||
|
{
|
||||||
|
unsigned short mypacketid;
|
||||||
|
unsigned char dup, type;
|
||||||
|
if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)
|
||||||
|
rc = FAILURE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rc = FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexUnlock(&c->mutex);
|
||||||
|
#endif
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int MQTTDisconnect(MQTTClient* c)
|
||||||
|
{
|
||||||
|
int rc = FAILURE;
|
||||||
|
Timer timer; // we might wait for incomplete incoming publishes to complete
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexLock(&c->mutex);
|
||||||
|
#endif
|
||||||
|
TimerInit(&timer);
|
||||||
|
TimerCountdownMS(&timer, c->command_timeout_ms);
|
||||||
|
|
||||||
|
len = MQTTSerialize_disconnect(c->buf, c->buf_size);
|
||||||
|
if (len > 0)
|
||||||
|
rc = sendPacket(c, len, &timer); // send the disconnect packet
|
||||||
|
|
||||||
|
c->isconnected = 0;
|
||||||
|
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
MutexUnlock(&c->mutex);
|
||||||
|
#endif
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
182
cube/w5500/MQTTClient.h
Normal file
182
cube/w5500/MQTTClient.h
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2014, 2015 IBM Corp.
|
||||||
|
*
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||||
|
*
|
||||||
|
* The Eclipse Public License is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
* and the Eclipse Distribution License is available at
|
||||||
|
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Allan Stockdill-Mander/Ian Craggs - initial API and implementation and/or initial documentation
|
||||||
|
* Ian Craggs - documentation and platform specific header
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#if !defined(__MQTT_CLIENT_C_)
|
||||||
|
#define __MQTT_CLIENT_C_
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WIN32_DLL) || defined(WIN64_DLL)
|
||||||
|
#define DLLImport __declspec(dllimport)
|
||||||
|
#define DLLExport __declspec(dllexport)
|
||||||
|
#elif defined(LINUX_SO)
|
||||||
|
#define DLLImport extern
|
||||||
|
#define DLLExport __attribute__ ((visibility ("default")))
|
||||||
|
#else
|
||||||
|
#define DLLImport
|
||||||
|
#define DLLExport
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "./MQTTPacket/src/MQTTPacket.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
#include "mqtt_interface.h"
|
||||||
|
|
||||||
|
#define MAX_PACKET_ID 65535 /* according to the MQTT specification - do not change! */
|
||||||
|
|
||||||
|
#if !defined(MAX_MESSAGE_HANDLERS)
|
||||||
|
#define MAX_MESSAGE_HANDLERS 5 /* redefinable - how many subscriptions do you want? */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum QoS { QOS0, QOS1, QOS2 };
|
||||||
|
|
||||||
|
/* all failure return codes must be negative */
|
||||||
|
enum returnCode { BUFFER_OVERFLOW = -2, FAILURE = -1, SUCCESSS = 0 };
|
||||||
|
|
||||||
|
/* The Platform specific header must define the Network and Timer structures and functions
|
||||||
|
* which operate on them.
|
||||||
|
*
|
||||||
|
typedef struct Network
|
||||||
|
{
|
||||||
|
int (*mqttread)(Network*, unsigned char* read_buffer, int, int);
|
||||||
|
int (*mqttwrite)(Network*, unsigned char* send_buffer, int, int);
|
||||||
|
} Network;*/
|
||||||
|
|
||||||
|
/* The Timer structure must be defined in the platform specific header,
|
||||||
|
* and have the following functions to operate on it. */
|
||||||
|
extern void TimerInit(Timer*);
|
||||||
|
extern char TimerIsExpired(Timer*);
|
||||||
|
extern void TimerCountdownMS(Timer*, unsigned int);
|
||||||
|
extern void TimerCountdown(Timer*, unsigned int);
|
||||||
|
extern int TimerLeftMS(Timer*);
|
||||||
|
|
||||||
|
typedef struct MQTTMessage
|
||||||
|
{
|
||||||
|
enum QoS qos;
|
||||||
|
unsigned char retained;
|
||||||
|
unsigned char dup;
|
||||||
|
unsigned short id;
|
||||||
|
void *payload;
|
||||||
|
size_t payloadlen;
|
||||||
|
} MQTTMessage;
|
||||||
|
|
||||||
|
typedef struct MessageData
|
||||||
|
{
|
||||||
|
MQTTMessage* message;
|
||||||
|
MQTTString* topicName;
|
||||||
|
} MessageData;
|
||||||
|
|
||||||
|
typedef void (*messageHandler)(MessageData*);
|
||||||
|
|
||||||
|
typedef struct MQTTClient
|
||||||
|
{
|
||||||
|
unsigned int next_packetid,
|
||||||
|
command_timeout_ms;
|
||||||
|
size_t buf_size,
|
||||||
|
readbuf_size;
|
||||||
|
unsigned char *buf,
|
||||||
|
*readbuf;
|
||||||
|
unsigned int keepAliveInterval;
|
||||||
|
char ping_outstanding;
|
||||||
|
int isconnected;
|
||||||
|
|
||||||
|
struct MessageHandlers
|
||||||
|
{
|
||||||
|
const char* topicFilter;
|
||||||
|
void (*fp) (MessageData*);
|
||||||
|
} messageHandlers[MAX_MESSAGE_HANDLERS]; /* Message handlers are indexed by subscription topic */
|
||||||
|
|
||||||
|
void (*defaultMessageHandler) (MessageData*);
|
||||||
|
|
||||||
|
Network* ipstack;
|
||||||
|
Timer ping_timer;
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
Mutex mutex;
|
||||||
|
Thread thread;
|
||||||
|
#endif
|
||||||
|
} MQTTClient;
|
||||||
|
|
||||||
|
#define DefaultClient {0, 0, 0, 0, NULL, NULL, 0, 0, 0}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an MQTT client object
|
||||||
|
* @param client
|
||||||
|
* @param network
|
||||||
|
* @param command_timeout_ms
|
||||||
|
* @param
|
||||||
|
*/
|
||||||
|
DLLExport void MQTTClientInit(MQTTClient* client, Network* network, unsigned int command_timeout_ms,
|
||||||
|
unsigned char* sendbuf, size_t sendbuf_size, unsigned char* readbuf, size_t readbuf_size);
|
||||||
|
|
||||||
|
/** MQTT Connect - send an MQTT connect packet down the network and wait for a Connack
|
||||||
|
* The nework object must be connected to the network endpoint before calling this
|
||||||
|
* @param options - connect options
|
||||||
|
* @return success code
|
||||||
|
*/
|
||||||
|
DLLExport int MQTTConnect(MQTTClient* client, MQTTPacket_connectData* options);
|
||||||
|
|
||||||
|
/** MQTT Publish - send an MQTT publish packet and wait for all acks to complete for all QoSs
|
||||||
|
* @param client - the client object to use
|
||||||
|
* @param topic - the topic to publish to
|
||||||
|
* @param message - the message to send
|
||||||
|
* @return success code
|
||||||
|
*/
|
||||||
|
DLLExport int MQTTPublish(MQTTClient* client, const char*, MQTTMessage*);
|
||||||
|
|
||||||
|
/** MQTT Subscribe - send an MQTT subscribe packet and wait for suback before returning.
|
||||||
|
* @param client - the client object to use
|
||||||
|
* @param topicFilter - the topic filter to subscribe to
|
||||||
|
* @param message - the message to send
|
||||||
|
* @return success code
|
||||||
|
*/
|
||||||
|
DLLExport int MQTTSubscribe(MQTTClient* client, const char* topicFilter, enum QoS, messageHandler);
|
||||||
|
|
||||||
|
/** MQTT Subscribe - send an MQTT unsubscribe packet and wait for unsuback before returning.
|
||||||
|
* @param client - the client object to use
|
||||||
|
* @param topicFilter - the topic filter to unsubscribe from
|
||||||
|
* @return success code
|
||||||
|
*/
|
||||||
|
DLLExport int MQTTUnsubscribe(MQTTClient* client, const char* topicFilter);
|
||||||
|
|
||||||
|
/** MQTT Disconnect - send an MQTT disconnect packet and close the connection
|
||||||
|
* @param client - the client object to use
|
||||||
|
* @return success code
|
||||||
|
*/
|
||||||
|
DLLExport int MQTTDisconnect(MQTTClient* client);
|
||||||
|
|
||||||
|
/** MQTT Yield - MQTT background
|
||||||
|
* @param client - the client object to use
|
||||||
|
* @param time - the time, in milliseconds, to yield for
|
||||||
|
* @return success code
|
||||||
|
*/
|
||||||
|
DLLExport int MQTTYield(MQTTClient* client, int time);
|
||||||
|
|
||||||
|
#if defined(MQTT_TASK)
|
||||||
|
/** MQTT start background thread for a client. After this, MQTTYield should not be called.
|
||||||
|
* @param client - the client object to use
|
||||||
|
* @return success code
|
||||||
|
*/
|
||||||
|
DLLExport int MQTTStartTask(MQTTClient* client);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
1025
cube/w5500/dhcp.c
Normal file
1025
cube/w5500/dhcp.c
Normal file
File diff suppressed because it is too large
Load Diff
161
cube/w5500/dhcp.h
Normal file
161
cube/w5500/dhcp.h
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
//*****************************************************************************
|
||||||
|
//
|
||||||
|
//! \file dhcp.h
|
||||||
|
//! \brief DHCP APIs Header file.
|
||||||
|
//! \details Processig DHCP protocol as DISCOVER, OFFER, REQUEST, ACK, NACK and DECLINE.
|
||||||
|
//! \version 1.1.1
|
||||||
|
//! \date 2019/10/08
|
||||||
|
//! \par Revision history
|
||||||
|
//! <2019/10/08> compare DHCP server ip address
|
||||||
|
//! <2013/11/18> 1st Release
|
||||||
|
//! <2012/12/20> V1.1.0
|
||||||
|
//! 1. Move unreferenced DEFINE to dhcp.c
|
||||||
|
//! <2012/12/26> V1.1.1
|
||||||
|
//! \author Eric Jung & 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.
|
||||||
|
//
|
||||||
|
//*****************************************************************************
|
||||||
|
#ifndef _DHCP_H_
|
||||||
|
#define _DHCP_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
* @details If you want to display debug & processing message, Define _DHCP_DEBUG_
|
||||||
|
* @note If defined, it depends on <stdio.h>
|
||||||
|
*/
|
||||||
|
//#define _DHCP_DEBUG_
|
||||||
|
|
||||||
|
|
||||||
|
/* Retry to processing DHCP */
|
||||||
|
#define MAX_DHCP_RETRY 2 ///< Maximum retry count
|
||||||
|
#define DHCP_WAIT_TIME 10 ///< Wait Time 10s
|
||||||
|
|
||||||
|
|
||||||
|
/* UDP port numbers for DHCP */
|
||||||
|
#define DHCP_SERVER_PORT 67 ///< DHCP server port number
|
||||||
|
#define DHCP_CLIENT_PORT 68 ///< DHCP client port number
|
||||||
|
|
||||||
|
|
||||||
|
#define MAGIC_COOKIE 0x63825363 ///< You should not modify it number.
|
||||||
|
|
||||||
|
#define DCHP_HOST_NAME "WIZnet\0"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief return value of @ref DHCP_run()
|
||||||
|
*/
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
DHCP_FAILED = 0, ///< Processing Fail
|
||||||
|
DHCP_RUNNING, ///< Processing DHCP protocol
|
||||||
|
DHCP_IP_ASSIGN, ///< First Occupy IP from DHPC server (if cbfunc == null, act as default default_ip_assign)
|
||||||
|
DHCP_IP_CHANGED, ///< Change IP address by new ip from DHCP (if cbfunc == null, act as default default_ip_update)
|
||||||
|
DHCP_IP_LEASED, ///< Stand by
|
||||||
|
DHCP_STOPPED ///< Stop processing DHCP protocol
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief DHCP client initialization (outside of the main loop)
|
||||||
|
* @param s - socket number
|
||||||
|
* @param buf - buffer for processing DHCP message
|
||||||
|
*/
|
||||||
|
void DHCP_init(uint8_t s, uint8_t * buf);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief DHCP 1s Tick Timer handler
|
||||||
|
* @note SHOULD BE register to your system 1s Tick timer handler
|
||||||
|
*/
|
||||||
|
void DHCP_time_handler(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Register call back function
|
||||||
|
* @param ip_assign - callback func when IP is assigned from DHCP server first
|
||||||
|
* @param ip_update - callback func when IP is changed
|
||||||
|
* @param ip_conflict - callback func when the assigned IP is conflict with others.
|
||||||
|
*/
|
||||||
|
void reg_dhcp_cbfunc(void(*ip_assign)(void), void(*ip_update)(void), void(*ip_conflict)(void));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief DHCP client in the main loop
|
||||||
|
* @return The value is as the follow \n
|
||||||
|
* @ref DHCP_FAILED \n
|
||||||
|
* @ref DHCP_RUNNING \n
|
||||||
|
* @ref DHCP_IP_ASSIGN \n
|
||||||
|
* @ref DHCP_IP_CHANGED \n
|
||||||
|
* @ref DHCP_IP_LEASED \n
|
||||||
|
* @ref DHCP_STOPPED \n
|
||||||
|
*
|
||||||
|
* @note This function is always called by you main task.
|
||||||
|
*/
|
||||||
|
uint8_t DHCP_run(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Stop DHCP processing
|
||||||
|
* @note If you want to restart. call DHCP_init() and DHCP_run()
|
||||||
|
*/
|
||||||
|
void DHCP_stop(void);
|
||||||
|
|
||||||
|
/* Get Network information assigned from DHCP server */
|
||||||
|
/*
|
||||||
|
* @brief Get IP address
|
||||||
|
* @param ip - IP address to be returned
|
||||||
|
*/
|
||||||
|
void getIPfromDHCP(uint8_t* ip);
|
||||||
|
/*
|
||||||
|
* @brief Get Gateway address
|
||||||
|
* @param ip - Gateway address to be returned
|
||||||
|
*/
|
||||||
|
void getGWfromDHCP(uint8_t* ip);
|
||||||
|
/*
|
||||||
|
* @brief Get Subnet mask value
|
||||||
|
* @param ip - Subnet mask to be returned
|
||||||
|
*/
|
||||||
|
void getSNfromDHCP(uint8_t* ip);
|
||||||
|
/*
|
||||||
|
* @brief Get DNS address
|
||||||
|
* @param ip - DNS address to be returned
|
||||||
|
*/
|
||||||
|
void getDNSfromDHCP(uint8_t* ip);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Get the leased time by DHCP sever
|
||||||
|
* @return unit 1s
|
||||||
|
*/
|
||||||
|
uint32_t getDHCPLeasetime(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _DHCP_H_ */
|
564
cube/w5500/dns.c
Normal file
564
cube/w5500/dns.c
Normal file
@ -0,0 +1,564 @@
|
|||||||
|
//*****************************************************************************
|
||||||
|
//
|
||||||
|
//! \file dns.c
|
||||||
|
//! \brief DNS APIs Implement file.
|
||||||
|
//! \details Send DNS query & Receive DNS reponse. \n
|
||||||
|
//! It depends on stdlib.h & string.h in ansi-c library
|
||||||
|
//! \version 1.1.0
|
||||||
|
//! \date 2013/11/18
|
||||||
|
//! \par Revision history
|
||||||
|
//! <2013/10/21> 1st Release
|
||||||
|
//! <2013/12/20> V1.1.0
|
||||||
|
//! 1. Remove secondary DNS server in DNS_run
|
||||||
|
//! If 1st DNS_run failed, call DNS_run with 2nd DNS again
|
||||||
|
//! 2. DNS_timerHandler -> DNS_time_handler
|
||||||
|
//! 3. Remove the unused define
|
||||||
|
//! 4. Integrated dns.h dns.c & dns_parse.h dns_parse.c into dns.h & dns.c
|
||||||
|
//! <2013/12/20> V1.1.0
|
||||||
|
//!
|
||||||
|
//! \author Eric Jung & 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 <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "socket.h"
|
||||||
|
#include "dns.h"
|
||||||
|
|
||||||
|
#ifdef _DNS_DEBUG_
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define INITRTT 2000L /* Initial smoothed response time */
|
||||||
|
#define MAXCNAME (MAX_DOMAIN_NAME + (MAX_DOMAIN_NAME>>1)) /* Maximum amount of cname recursion */
|
||||||
|
|
||||||
|
#define TYPE_A 1 /* Host address */
|
||||||
|
#define TYPE_NS 2 /* Name server */
|
||||||
|
#define TYPE_MD 3 /* Mail destination (obsolete) */
|
||||||
|
#define TYPE_MF 4 /* Mail forwarder (obsolete) */
|
||||||
|
#define TYPE_CNAME 5 /* Canonical name */
|
||||||
|
#define TYPE_SOA 6 /* Start of Authority */
|
||||||
|
#define TYPE_MB 7 /* Mailbox name (experimental) */
|
||||||
|
#define TYPE_MG 8 /* Mail group member (experimental) */
|
||||||
|
#define TYPE_MR 9 /* Mail rename name (experimental) */
|
||||||
|
#define TYPE_NULL 10 /* Null (experimental) */
|
||||||
|
#define TYPE_WKS 11 /* Well-known sockets */
|
||||||
|
#define TYPE_PTR 12 /* Pointer record */
|
||||||
|
#define TYPE_HINFO 13 /* Host information */
|
||||||
|
#define TYPE_MINFO 14 /* Mailbox information (experimental)*/
|
||||||
|
#define TYPE_MX 15 /* Mail exchanger */
|
||||||
|
#define TYPE_TXT 16 /* Text strings */
|
||||||
|
#define TYPE_ANY 255 /* Matches any type */
|
||||||
|
|
||||||
|
#define CLASS_IN 1 /* The ARPA Internet */
|
||||||
|
|
||||||
|
/* Round trip timing parameters */
|
||||||
|
#define AGAIN 8 /* Average RTT gain = 1/8 */
|
||||||
|
#define LAGAIN 3 /* Log2(AGAIN) */
|
||||||
|
#define DGAIN 4 /* Mean deviation gain = 1/4 */
|
||||||
|
#define LDGAIN 2 /* log2(DGAIN) */
|
||||||
|
|
||||||
|
/* Header for all domain messages */
|
||||||
|
struct dhdr
|
||||||
|
{
|
||||||
|
uint16_t id; /* Identification */
|
||||||
|
uint8_t qr; /* Query/Response */
|
||||||
|
#define QUERY 0
|
||||||
|
#define RESPONSE 1
|
||||||
|
uint8_t opcode;
|
||||||
|
#define IQUERY 1
|
||||||
|
uint8_t aa; /* Authoratative answer */
|
||||||
|
uint8_t tc; /* Truncation */
|
||||||
|
uint8_t rd; /* Recursion desired */
|
||||||
|
uint8_t ra; /* Recursion available */
|
||||||
|
uint8_t rcode; /* Response code */
|
||||||
|
#define NO_ERROR 0
|
||||||
|
#define FORMAT_ERROR 1
|
||||||
|
#define SERVER_FAIL 2
|
||||||
|
#define NAME_ERROR 3
|
||||||
|
#define NOT_IMPL 4
|
||||||
|
#define REFUSED 5
|
||||||
|
uint16_t qdcount; /* Question count */
|
||||||
|
uint16_t ancount; /* Answer count */
|
||||||
|
uint16_t nscount; /* Authority (name server) count */
|
||||||
|
uint16_t arcount; /* Additional record count */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t* pDNSMSG; // DNS message buffer
|
||||||
|
uint8_t DNS_SOCKET; // SOCKET number for DNS
|
||||||
|
uint16_t DNS_MSGID; // DNS message ID
|
||||||
|
|
||||||
|
uint32_t dns_1s_tick; // for timout of DNS processing
|
||||||
|
static uint8_t retry_count;
|
||||||
|
|
||||||
|
/* converts uint16_t from network buffer to a host byte order integer. */
|
||||||
|
uint16_t get16(uint8_t * s)
|
||||||
|
{
|
||||||
|
uint16_t i;
|
||||||
|
i = *s++ << 8;
|
||||||
|
i = i + *s;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* copies uint16_t to the network buffer with network byte order. */
|
||||||
|
uint8_t * put16(uint8_t * s, uint16_t i)
|
||||||
|
{
|
||||||
|
*s++ = i >> 8;
|
||||||
|
*s++ = i;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CONVERT A DOMAIN NAME TO THE HUMAN-READABLE FORM
|
||||||
|
*
|
||||||
|
* Description : This function converts a compressed domain name to the human-readable form
|
||||||
|
* Arguments : msg - is a pointer to the reply message
|
||||||
|
* compressed - is a pointer to the domain name in reply message.
|
||||||
|
* buf - is a pointer to the buffer for the human-readable form name.
|
||||||
|
* len - is the MAX. size of buffer.
|
||||||
|
* Returns : the length of compressed message
|
||||||
|
*/
|
||||||
|
int parse_name(uint8_t * msg, uint8_t * compressed, char * buf, int16_t len)
|
||||||
|
{
|
||||||
|
uint16_t slen; /* Length of current segment */
|
||||||
|
uint8_t * cp;
|
||||||
|
int clen = 0; /* Total length of compressed name */
|
||||||
|
int indirect = 0; /* Set if indirection encountered */
|
||||||
|
int nseg = 0; /* Total number of segments in name */
|
||||||
|
|
||||||
|
cp = compressed;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
slen = *cp++; /* Length of this segment */
|
||||||
|
|
||||||
|
if (!indirect) clen++;
|
||||||
|
|
||||||
|
if ((slen & 0xc0) == 0xc0)
|
||||||
|
{
|
||||||
|
if (!indirect)
|
||||||
|
clen++;
|
||||||
|
indirect = 1;
|
||||||
|
/* Follow indirection */
|
||||||
|
cp = &msg[((slen & 0x3f)<<8) + *cp];
|
||||||
|
slen = *cp++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (slen == 0) /* zero length == all done */
|
||||||
|
break;
|
||||||
|
|
||||||
|
len -= slen + 1;
|
||||||
|
|
||||||
|
if (len < 0) return -1;
|
||||||
|
|
||||||
|
if (!indirect) clen += slen;
|
||||||
|
|
||||||
|
while (slen-- != 0) *buf++ = (char)*cp++;
|
||||||
|
*buf++ = '.';
|
||||||
|
nseg++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nseg == 0)
|
||||||
|
{
|
||||||
|
/* Root name; represent as single dot */
|
||||||
|
*buf++ = '.';
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
*buf++ = '\0';
|
||||||
|
len--;
|
||||||
|
|
||||||
|
return clen; /* Length of compressed message */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PARSE QUESTION SECTION
|
||||||
|
*
|
||||||
|
* Description : This function parses the qeustion record of the reply message.
|
||||||
|
* Arguments : msg - is a pointer to the reply message
|
||||||
|
* cp - is a pointer to the qeustion record.
|
||||||
|
* Returns : a pointer the to next record.
|
||||||
|
*/
|
||||||
|
uint8_t * dns_question(uint8_t * msg, uint8_t * cp)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
char name[MAXCNAME];
|
||||||
|
|
||||||
|
len = parse_name(msg, cp, name, MAXCNAME);
|
||||||
|
|
||||||
|
|
||||||
|
if (len == -1) return 0;
|
||||||
|
|
||||||
|
cp += len;
|
||||||
|
cp += 2; /* type */
|
||||||
|
cp += 2; /* class */
|
||||||
|
|
||||||
|
return cp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PARSE ANSER SECTION
|
||||||
|
*
|
||||||
|
* Description : This function parses the answer record of the reply message.
|
||||||
|
* Arguments : msg - is a pointer to the reply message
|
||||||
|
* cp - is a pointer to the answer record.
|
||||||
|
* Returns : a pointer the to next record.
|
||||||
|
*/
|
||||||
|
uint8_t * dns_answer(uint8_t * msg, uint8_t * cp, uint8_t * ip_from_dns)
|
||||||
|
{
|
||||||
|
int len, type;
|
||||||
|
char name[MAXCNAME];
|
||||||
|
|
||||||
|
len = parse_name(msg, cp, name, MAXCNAME);
|
||||||
|
|
||||||
|
if (len == -1) return 0;
|
||||||
|
|
||||||
|
cp += len;
|
||||||
|
type = get16(cp);
|
||||||
|
cp += 2; /* type */
|
||||||
|
cp += 2; /* class */
|
||||||
|
cp += 4; /* ttl */
|
||||||
|
cp += 2; /* len */
|
||||||
|
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case TYPE_A:
|
||||||
|
/* Just read the address directly into the structure */
|
||||||
|
ip_from_dns[0] = *cp++;
|
||||||
|
ip_from_dns[1] = *cp++;
|
||||||
|
ip_from_dns[2] = *cp++;
|
||||||
|
ip_from_dns[3] = *cp++;
|
||||||
|
break;
|
||||||
|
case TYPE_CNAME:
|
||||||
|
case TYPE_MB:
|
||||||
|
case TYPE_MG:
|
||||||
|
case TYPE_MR:
|
||||||
|
case TYPE_NS:
|
||||||
|
case TYPE_PTR:
|
||||||
|
/* These types all consist of a single domain name */
|
||||||
|
/* convert it to ascii format */
|
||||||
|
len = parse_name(msg, cp, name, MAXCNAME);
|
||||||
|
if (len == -1) return 0;
|
||||||
|
|
||||||
|
cp += len;
|
||||||
|
break;
|
||||||
|
case TYPE_HINFO:
|
||||||
|
len = *cp++;
|
||||||
|
cp += len;
|
||||||
|
|
||||||
|
len = *cp++;
|
||||||
|
cp += len;
|
||||||
|
break;
|
||||||
|
case TYPE_MX:
|
||||||
|
cp += 2;
|
||||||
|
/* Get domain name of exchanger */
|
||||||
|
len = parse_name(msg, cp, name, MAXCNAME);
|
||||||
|
if (len == -1) return 0;
|
||||||
|
|
||||||
|
cp += len;
|
||||||
|
break;
|
||||||
|
case TYPE_SOA:
|
||||||
|
/* Get domain name of name server */
|
||||||
|
len = parse_name(msg, cp, name, MAXCNAME);
|
||||||
|
if (len == -1) return 0;
|
||||||
|
|
||||||
|
cp += len;
|
||||||
|
|
||||||
|
/* Get domain name of responsible person */
|
||||||
|
len = parse_name(msg, cp, name, MAXCNAME);
|
||||||
|
if (len == -1) return 0;
|
||||||
|
|
||||||
|
cp += len;
|
||||||
|
|
||||||
|
cp += 4;
|
||||||
|
cp += 4;
|
||||||
|
cp += 4;
|
||||||
|
cp += 4;
|
||||||
|
cp += 4;
|
||||||
|
break;
|
||||||
|
case TYPE_TXT:
|
||||||
|
/* Just stash */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Ignore */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PARSE THE DNS REPLY
|
||||||
|
*
|
||||||
|
* Description : This function parses the reply message from DNS server.
|
||||||
|
* Arguments : dhdr - is a pointer to the header for DNS message
|
||||||
|
* buf - is a pointer to the reply message.
|
||||||
|
* len - is the size of reply message.
|
||||||
|
* Returns : -1 - Domain name lenght is too big
|
||||||
|
* 0 - Fail (Timout or parse error)
|
||||||
|
* 1 - Success,
|
||||||
|
*/
|
||||||
|
int8_t parseDNSMSG(struct dhdr * pdhdr, uint8_t * pbuf, uint8_t * ip_from_dns)
|
||||||
|
{
|
||||||
|
uint16_t tmp;
|
||||||
|
uint16_t i;
|
||||||
|
uint8_t * msg;
|
||||||
|
uint8_t * cp;
|
||||||
|
|
||||||
|
msg = pbuf;
|
||||||
|
memset(pdhdr, 0, sizeof(*pdhdr));
|
||||||
|
|
||||||
|
pdhdr->id = get16(&msg[0]);
|
||||||
|
tmp = get16(&msg[2]);
|
||||||
|
if (tmp & 0x8000) pdhdr->qr = 1;
|
||||||
|
|
||||||
|
pdhdr->opcode = (tmp >> 11) & 0xf;
|
||||||
|
|
||||||
|
if (tmp & 0x0400) pdhdr->aa = 1;
|
||||||
|
if (tmp & 0x0200) pdhdr->tc = 1;
|
||||||
|
if (tmp & 0x0100) pdhdr->rd = 1;
|
||||||
|
if (tmp & 0x0080) pdhdr->ra = 1;
|
||||||
|
|
||||||
|
pdhdr->rcode = tmp & 0xf;
|
||||||
|
pdhdr->qdcount = get16(&msg[4]);
|
||||||
|
pdhdr->ancount = get16(&msg[6]);
|
||||||
|
pdhdr->nscount = get16(&msg[8]);
|
||||||
|
pdhdr->arcount = get16(&msg[10]);
|
||||||
|
|
||||||
|
|
||||||
|
/* Now parse the variable length sections */
|
||||||
|
cp = &msg[12];
|
||||||
|
|
||||||
|
/* Question section */
|
||||||
|
for (i = 0; i < pdhdr->qdcount; i++)
|
||||||
|
{
|
||||||
|
cp = dns_question(msg, cp);
|
||||||
|
#ifdef _DNS_DEUBG_
|
||||||
|
printf("MAX_DOMAIN_NAME is too small, it should be redfine in dns.h");
|
||||||
|
#endif
|
||||||
|
if(!cp) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Answer section */
|
||||||
|
for (i = 0; i < pdhdr->ancount; i++)
|
||||||
|
{
|
||||||
|
cp = dns_answer(msg, cp, ip_from_dns);
|
||||||
|
#ifdef _DNS_DEUBG_
|
||||||
|
printf("MAX_DOMAIN_NAME is too small, it should be redfine in dns.h");
|
||||||
|
#endif
|
||||||
|
if(!cp) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Name server (authority) section */
|
||||||
|
for (i = 0; i < pdhdr->nscount; i++)
|
||||||
|
{
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Additional section */
|
||||||
|
for (i = 0; i < pdhdr->arcount; i++)
|
||||||
|
{
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pdhdr->rcode == 0) return 1; // No error
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MAKE DNS QUERY MESSAGE
|
||||||
|
*
|
||||||
|
* Description : This function makes DNS query message.
|
||||||
|
* Arguments : op - Recursion desired
|
||||||
|
* name - is a pointer to the domain name.
|
||||||
|
* buf - is a pointer to the buffer for DNS message.
|
||||||
|
* len - is the MAX. size of buffer.
|
||||||
|
* Returns : the pointer to the DNS message.
|
||||||
|
*/
|
||||||
|
int16_t dns_makequery(uint16_t op, char * name, uint8_t * buf, uint16_t len)
|
||||||
|
{
|
||||||
|
uint8_t *cp;
|
||||||
|
char *cp1;
|
||||||
|
char sname[MAXCNAME];
|
||||||
|
char *dname;
|
||||||
|
uint16_t p;
|
||||||
|
uint16_t dlen;
|
||||||
|
|
||||||
|
cp = buf;
|
||||||
|
|
||||||
|
DNS_MSGID++;
|
||||||
|
cp = put16(cp, DNS_MSGID);
|
||||||
|
p = (op << 11) | 0x0100; /* Recursion desired */
|
||||||
|
cp = put16(cp, p);
|
||||||
|
cp = put16(cp, 1);
|
||||||
|
cp = put16(cp, 0);
|
||||||
|
cp = put16(cp, 0);
|
||||||
|
cp = put16(cp, 0);
|
||||||
|
|
||||||
|
strcpy(sname, name);
|
||||||
|
dname = sname;
|
||||||
|
dlen = strlen(dname);
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
/* Look for next dot */
|
||||||
|
cp1 = strchr(dname, '.');
|
||||||
|
|
||||||
|
if (cp1 != NULL) len = cp1 - dname; /* More to come */
|
||||||
|
else len = dlen; /* Last component */
|
||||||
|
|
||||||
|
*cp++ = len; /* Write length of component */
|
||||||
|
if (len == 0) break;
|
||||||
|
|
||||||
|
/* Copy component up to (but not including) dot */
|
||||||
|
strncpy((char *)cp, dname, len);
|
||||||
|
cp += len;
|
||||||
|
if (cp1 == NULL)
|
||||||
|
{
|
||||||
|
*cp++ = 0; /* Last one; write null and finish */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dname += len+1;
|
||||||
|
dlen -= len+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cp = put16(cp, 0x0001); /* type */
|
||||||
|
cp = put16(cp, 0x0001); /* class */
|
||||||
|
|
||||||
|
return ((int16_t)((uint32_t)(cp) - (uint32_t)(buf)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CHECK DNS TIMEOUT
|
||||||
|
*
|
||||||
|
* Description : This function check the DNS timeout
|
||||||
|
* Arguments : None.
|
||||||
|
* Returns : -1 - timeout occurred, 0 - timer over, but no timeout, 1 - no timer over, no timeout occur
|
||||||
|
* Note : timeout : retry count and timer both over.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int8_t check_DNS_timeout(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(dns_1s_tick >= DNS_WAIT_TIME)
|
||||||
|
{
|
||||||
|
dns_1s_tick = 0;
|
||||||
|
if(retry_count >= MAX_DNS_RETRY) {
|
||||||
|
retry_count = 0;
|
||||||
|
return -1; // timeout occurred
|
||||||
|
}
|
||||||
|
retry_count++;
|
||||||
|
return 0; // timer over, but no timeout
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1; // no timer over, no timeout occur
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* DNS CLIENT INIT */
|
||||||
|
void DNS_init(uint8_t s, uint8_t * buf)
|
||||||
|
{
|
||||||
|
DNS_SOCKET = s; // SOCK_DNS
|
||||||
|
pDNSMSG = buf; // User's shared buffer
|
||||||
|
DNS_MSGID = DNS_MSG_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* DNS CLIENT RUN */
|
||||||
|
int8_t DNS_run(uint8_t * dns_ip, uint8_t * name, uint8_t * ip_from_dns)
|
||||||
|
{
|
||||||
|
int8_t ret;
|
||||||
|
struct dhdr dhp;
|
||||||
|
uint8_t ip[4];
|
||||||
|
uint16_t len, port;
|
||||||
|
int8_t ret_check_timeout;
|
||||||
|
|
||||||
|
retry_count = 0;
|
||||||
|
dns_1s_tick = 0;
|
||||||
|
|
||||||
|
// Socket open
|
||||||
|
socket(DNS_SOCKET, Sn_MR_UDP, 0, 0);
|
||||||
|
|
||||||
|
#ifdef _DNS_DEBUG_
|
||||||
|
printf("> DNS Query to DNS Server : %d.%d.%d.%d\r\n", dns_ip[0], dns_ip[1], dns_ip[2], dns_ip[3]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
len = dns_makequery(0, (char *)name, pDNSMSG, MAX_DNS_BUF_SIZE);
|
||||||
|
sendto(DNS_SOCKET, pDNSMSG, len, dns_ip, IPPORT_DOMAIN);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if ((len = getSn_RX_RSR(DNS_SOCKET)) > 0)
|
||||||
|
{
|
||||||
|
if (len > MAX_DNS_BUF_SIZE) len = MAX_DNS_BUF_SIZE;
|
||||||
|
len = recvfrom(DNS_SOCKET, pDNSMSG, len, ip, &port);
|
||||||
|
#ifdef _DNS_DEBUG_
|
||||||
|
printf("> Receive DNS message from %d.%d.%d.%d(%d). len = %d\r\n", ip[0], ip[1], ip[2], ip[3],port,len);
|
||||||
|
#endif
|
||||||
|
ret = parseDNSMSG(&dhp, pDNSMSG, ip_from_dns);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Check Timeout
|
||||||
|
ret_check_timeout = check_DNS_timeout();
|
||||||
|
if (ret_check_timeout < 0) {
|
||||||
|
|
||||||
|
#ifdef _DNS_DEBUG_
|
||||||
|
printf("> DNS Server is not responding : %d.%d.%d.%d\r\n", dns_ip[0], dns_ip[1], dns_ip[2], dns_ip[3]);
|
||||||
|
#endif
|
||||||
|
close(DNS_SOCKET);
|
||||||
|
return 0; // timeout occurred
|
||||||
|
}
|
||||||
|
else if (ret_check_timeout == 0) {
|
||||||
|
|
||||||
|
#ifdef _DNS_DEBUG_
|
||||||
|
printf("> DNS Timeout\r\n");
|
||||||
|
#endif
|
||||||
|
sendto(DNS_SOCKET, pDNSMSG, len, dns_ip, IPPORT_DOMAIN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(DNS_SOCKET);
|
||||||
|
// Return value
|
||||||
|
// 0 > : failed / 1 - success
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* DNS TIMER HANDLER */
|
||||||
|
void DNS_time_handler(void)
|
||||||
|
{
|
||||||
|
dns_1s_tick++;
|
||||||
|
}
|
109
cube/w5500/dns.h
Normal file
109
cube/w5500/dns.h
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
//*****************************************************************************
|
||||||
|
//
|
||||||
|
//! \file dns.h
|
||||||
|
//! \brief DNS APIs Header file.
|
||||||
|
//! \details Send DNS query & Receive DNS reponse.
|
||||||
|
//! \version 1.1.0
|
||||||
|
//! \date 2013/11/18
|
||||||
|
//! \par Revision history
|
||||||
|
//! <2013/10/21> 1st Release
|
||||||
|
//! <2013/12/20> V1.1.0
|
||||||
|
//! 1. Remove secondary DNS server in DNS_run
|
||||||
|
//! If 1st DNS_run failed, call DNS_run with 2nd DNS again
|
||||||
|
//! 2. DNS_timerHandler -> DNS_time_handler
|
||||||
|
//! 3. Move the no reference define to dns.c
|
||||||
|
//! 4. Integrated dns.h dns.c & dns_parse.h dns_parse.c into dns.h & dns.c
|
||||||
|
//! <2013/12/20> V1.1.0
|
||||||
|
//!
|
||||||
|
//! \author Eric Jung & 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.
|
||||||
|
//
|
||||||
|
//*****************************************************************************
|
||||||
|
|
||||||
|
#ifndef _DNS_H_
|
||||||
|
#define _DNS_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
/*
|
||||||
|
* @brief Define it for Debug & Monitor DNS processing.
|
||||||
|
* @note If defined, it dependens on <stdio.h>
|
||||||
|
*/
|
||||||
|
//#define _DNS_DEBUG_
|
||||||
|
|
||||||
|
#define MAX_DNS_BUF_SIZE 256 ///< maximum size of DNS buffer. */
|
||||||
|
/*
|
||||||
|
* @brief Maxium length of your queried Domain name
|
||||||
|
* @todo SHOULD BE defined it equal as or greater than your Domain name lenght + null character(1)
|
||||||
|
* @note SHOULD BE careful to stack overflow because it is allocated 1.5 times as MAX_DOMAIN_NAME in stack.
|
||||||
|
*/
|
||||||
|
#define MAX_DOMAIN_NAME 16 // for example "www.google.com"
|
||||||
|
|
||||||
|
#define MAX_DNS_RETRY 2 ///< Requery Count
|
||||||
|
#define DNS_WAIT_TIME 3 ///< Wait response time. unit 1s.
|
||||||
|
|
||||||
|
#define IPPORT_DOMAIN 53 ///< DNS server port number
|
||||||
|
|
||||||
|
#define DNS_MSG_ID 0x1122 ///< ID for DNS message. You can be modifyed it any number
|
||||||
|
/*
|
||||||
|
* @brief DNS process initialize
|
||||||
|
* @param s : Socket number for DNS
|
||||||
|
* @param buf : Buffer for DNS message
|
||||||
|
*/
|
||||||
|
void DNS_init(uint8_t s, uint8_t * buf);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief DNS process
|
||||||
|
* @details Send DNS query and receive DNS response
|
||||||
|
* @param dns_ip : DNS server ip
|
||||||
|
* @param name : Domain name to be queryed
|
||||||
|
* @param ip_from_dns : IP address from DNS server
|
||||||
|
* @return -1 : failed. @ref MAX_DOMIN_NAME is too small \n
|
||||||
|
* 0 : failed (Timeout or Parse error)\n
|
||||||
|
* 1 : success
|
||||||
|
* @note This funtion blocks until success or fail. max time = @ref MAX_DNS_RETRY * @ref DNS_WAIT_TIME
|
||||||
|
*/
|
||||||
|
int8_t DNS_run(uint8_t * dns_ip, uint8_t * name, uint8_t * ip_from_dns);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief DNS 1s Tick Timer handler
|
||||||
|
* @note SHOULD BE register to your system 1s Tick timer handler
|
||||||
|
*/
|
||||||
|
void DNS_time_handler(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _DNS_H_ */
|
402
cube/w5500/httpParser.c
Normal file
402
cube/w5500/httpParser.c
Normal file
@ -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 */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
char * head;
|
||||||
|
char tmp[10];
|
||||||
|
|
||||||
|
/* file type*/
|
||||||
|
if (type == PTYPE_HTML) head = RES_HTMLHEAD_OK;
|
||||||
|
else if (type == PTYPE_GIF) head = RES_GIFHEAD_OK;
|
||||||
|
else if (type == PTYPE_TEXT) head = RES_TEXTHEAD_OK;
|
||||||
|
else if (type == PTYPE_JPEG) head = RES_JPEGHEAD_OK;
|
||||||
|
else if (type == PTYPE_FLASH) head = RES_FLASHHEAD_OK;
|
||||||
|
else if (type == PTYPE_XML) head = RES_XMLHEAD_OK;
|
||||||
|
else if (type == PTYPE_CSS) head = RES_CSSHEAD_OK;
|
||||||
|
else if (type == PTYPE_JSON) head = RES_JSONHEAD_OK;
|
||||||
|
else if (type == PTYPE_JS) head = RES_JSHEAD_OK;
|
||||||
|
else if (type == PTYPE_CGI) head = RES_CGIHEAD_OK;
|
||||||
|
else if (type == PTYPE_PNG) head = RES_PNGHEAD_OK;
|
||||||
|
else if (type == PTYPE_ICO) head = RES_ICOHEAD_OK;
|
||||||
|
else if (type == PTYPE_TTF) head = RES_TTFHEAD_OK;
|
||||||
|
else if (type == PTYPE_OTF) head = RES_OTFHEAD_OK;
|
||||||
|
else if (type == PTYPE_WOFF) head = RES_WOFFHEAD_OK;
|
||||||
|
else if (type == PTYPE_EOT) head = RES_EOTHEAD_OK;
|
||||||
|
else if (type == PTYPE_SVG) head = 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(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 (strstr(buf, ".htm") || strstr(buf, ".html")) *type = PTYPE_HTML;
|
||||||
|
else if (strstr(buf, ".gif")) *type = PTYPE_GIF;
|
||||||
|
else if (strstr(buf, ".text") || strstr(buf,".txt")) *type = PTYPE_TEXT;
|
||||||
|
else if (strstr(buf, ".jpeg") || strstr(buf,".jpg")) *type = PTYPE_JPEG;
|
||||||
|
else if (strstr(buf, ".swf")) *type = PTYPE_FLASH;
|
||||||
|
else if (strstr(buf, ".cgi") || strstr(buf,".CGI")) *type = PTYPE_CGI;
|
||||||
|
else if (strstr(buf, ".json") || strstr(buf,".JSON")) *type = PTYPE_JSON;
|
||||||
|
else if (strstr(buf, ".js") || strstr(buf,".JS")) *type = PTYPE_JS;
|
||||||
|
else if (strstr(buf, ".CGI") || strstr(buf,".cgi")) *type = PTYPE_CGI;
|
||||||
|
else if (strstr(buf, ".xml") || strstr(buf,".XML")) *type = PTYPE_XML;
|
||||||
|
else if (strstr(buf, ".css") || strstr(buf,".CSS")) *type = PTYPE_CSS;
|
||||||
|
else if (strstr(buf, ".png") || strstr(buf,".PNG")) *type = PTYPE_PNG;
|
||||||
|
else if (strstr(buf, ".ico") || strstr(buf,".ICO")) *type = PTYPE_ICO;
|
||||||
|
else if (strstr(buf, ".ttf") || strstr(buf,".TTF")) *type = PTYPE_TTF;
|
||||||
|
else if (strstr(buf, ".otf") || strstr(buf,".OTF")) *type = PTYPE_OTF;
|
||||||
|
else if (strstr(buf, ".woff") || strstr(buf,".WOFF")) *type = PTYPE_WOFF;
|
||||||
|
else if (strstr(buf, ".eot") || strstr(buf,".EOT")) *type = PTYPE_EOT;
|
||||||
|
else if (strstr(buf, ".svg") || strstr(buf,".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(nexttok, "GET") || !strcmp(nexttok,"get"))
|
||||||
|
{
|
||||||
|
request->METHOD = METHOD_GET;
|
||||||
|
nexttok = strtok(NULL," ");
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (!strcmp(nexttok, "HEAD") || !strcmp(nexttok,"head"))
|
||||||
|
{
|
||||||
|
request->METHOD = METHOD_HEAD;
|
||||||
|
nexttok = strtok(NULL," ");
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (!strcmp(nexttok, "POST") || !strcmp(nexttok,"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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
158
cube/w5500/httpParser.h
Normal file
158
cube/w5500/httpParser.h
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
/**
|
||||||
|
@file httpd.h
|
||||||
|
@brief Define Constants and fucntions associated with HTTP protocol.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.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 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 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__ */
|
749
cube/w5500/httpServer.c
Normal file
749
cube/w5500/httpServer.c
Normal file
@ -0,0 +1,749 @@
|
|||||||
|
#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"
|
||||||
|
|
||||||
|
#ifdef _USE_SDCARD_
|
||||||
|
#include "ff.h" // header file for FatFs library (FAT file system)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DATA_BUF_SIZE
|
||||||
|
#define DATA_BUF_SIZE 2048
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* 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_
|
||||||
|
FIL fs; // FatFs: File object
|
||||||
|
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(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(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(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 : %d\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(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_TxMAX(s)))
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
#endif
|
||||||
|
// Repeatedly send remaining data to client
|
||||||
|
send_http_response_body(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(&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(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(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(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] : 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] : 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(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
|
||||||
|
fr = f_read(&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_
|
||||||
|
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);
|
||||||
|
#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(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_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
|
||||||
|
{
|
||||||
|
// Find the User registered index for web content
|
||||||
|
if(find_userReg_webContent(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;
|
||||||
|
}
|
||||||
|
// 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);
|
||||||
|
#endif
|
||||||
|
if((fr = f_open(&fs, (const char *)uri_name, FA_READ)) == 0)
|
||||||
|
{
|
||||||
|
content_found = 1; // file open succeed
|
||||||
|
|
||||||
|
file_len = fs.fsize;
|
||||||
|
content_addr = fs.sclust;
|
||||||
|
HTTPSock_Status[get_seqnum].storage_type = SDCARD;
|
||||||
|
}
|
||||||
|
#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(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(uint8_t * content_name, 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((char *)content_name);
|
||||||
|
content_len = strlen((char *)content);
|
||||||
|
|
||||||
|
web_content[total_content_cnt].content_name = malloc(name_len+1);
|
||||||
|
strcpy((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(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, ", web_content[i].content_len);
|
||||||
|
|
||||||
|
if(web_content[i].content_len < 30) printf("[%s]\r\n", web_content[i].content);
|
||||||
|
else printf("[ ... ]\r\n");
|
||||||
|
}
|
||||||
|
printf("=========================================\r\n\r\n");
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t find_userReg_webContent(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((char *)content_name, (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(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((char *)buf, (char *)ptr, size);
|
||||||
|
*(buf+size) = 0; // Insert '/0' for indicates the 'End of String' (null terminated)
|
||||||
|
|
||||||
|
ret = strlen((void *)buf);
|
||||||
|
return ret;
|
||||||
|
}
|
111
cube/w5500/httpServer.h
Normal file
111
cube/w5500/httpServer.h
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
/**
|
||||||
|
@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 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
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
/*********************************************
|
||||||
|
* 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 ...
|
||||||
|
}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(uint8_t seqnum);
|
||||||
|
|
||||||
|
void reg_httpServer_webContent(uint8_t * content_name, uint8_t * content);
|
||||||
|
uint8_t find_userReg_webContent(uint8_t * content_name, uint16_t * content_num, uint32_t * file_len);
|
||||||
|
uint16_t read_userReg_webContent(uint16_t content_num, uint8_t * buf, uint32_t offset, uint16_t size);
|
||||||
|
uint8_t display_reg_webContent_list(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
|
65
cube/w5500/httpUtil.c
Normal file
65
cube/w5500/httpUtil.c
Normal file
@ -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;
|
||||||
|
}
|
32
cube/w5500/httpUtil.h
Normal file
32
cube/w5500/httpUtil.h
Normal file
@ -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
|
176
cube/w5500/mqtt_interface.c
Normal file
176
cube/w5500/mqtt_interface.c
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
//*****************************************************************************
|
||||||
|
//! \file mqtt_interface.c
|
||||||
|
//! \brief Paho MQTT to WIZnet Chip interface implement file.
|
||||||
|
//! \details The process of porting an interface to use paho MQTT.
|
||||||
|
//! \version 1.0.0
|
||||||
|
//! \date 2016/12/06
|
||||||
|
//! \par Revision history
|
||||||
|
//! <2016/12/06> 1st Release
|
||||||
|
//!
|
||||||
|
//! \author Peter Bang & Justin Kim
|
||||||
|
//! \copyright
|
||||||
|
//!
|
||||||
|
//! Copyright (c) 2016, 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 "mqtt_interface.h"
|
||||||
|
#include "wizchip_conf.h"
|
||||||
|
#include "socket.h"
|
||||||
|
|
||||||
|
unsigned long MilliTimer;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief MQTT MilliTimer handler
|
||||||
|
* @note MUST BE register to your system 1m Tick timer handler.
|
||||||
|
*/
|
||||||
|
void MilliTimer_Handler(void) {
|
||||||
|
MilliTimer++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Timer Initialize
|
||||||
|
* @param timer : pointer to a Timer structure
|
||||||
|
* that contains the configuration information for the Timer.
|
||||||
|
*/
|
||||||
|
void TimerInit(Timer* timer) {
|
||||||
|
timer->end_time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief expired Timer
|
||||||
|
* @param timer : pointer to a Timer structure
|
||||||
|
* that contains the configuration information for the Timer.
|
||||||
|
*/
|
||||||
|
char TimerIsExpired(Timer* timer) {
|
||||||
|
long left = timer->end_time - MilliTimer;
|
||||||
|
return (left < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Countdown millisecond Timer
|
||||||
|
* @param timer : pointer to a Timer structure
|
||||||
|
* that contains the configuration information for the Timer.
|
||||||
|
* timeout : setting timeout millisecond.
|
||||||
|
*/
|
||||||
|
void TimerCountdownMS(Timer* timer, unsigned int timeout) {
|
||||||
|
timer->end_time = MilliTimer + timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Countdown second Timer
|
||||||
|
* @param timer : pointer to a Timer structure
|
||||||
|
* that contains the configuration information for the Timer.
|
||||||
|
* timeout : setting timeout millisecond.
|
||||||
|
*/
|
||||||
|
void TimerCountdown(Timer* timer, unsigned int timeout) {
|
||||||
|
timer->end_time = MilliTimer + (timeout * 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief left millisecond Timer
|
||||||
|
* @param timer : pointer to a Timer structure
|
||||||
|
* that contains the configuration information for the Timer.
|
||||||
|
*/
|
||||||
|
int TimerLeftMS(Timer* timer) {
|
||||||
|
long left = timer->end_time - MilliTimer;
|
||||||
|
return (left < 0) ? 0 : left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief New network setting
|
||||||
|
* @param n : pointer to a Network structure
|
||||||
|
* that contains the configuration information for the Network.
|
||||||
|
* sn : socket number where x can be (0..7).
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void NewNetwork(Network* n, int sn) {
|
||||||
|
n->my_socket = sn;
|
||||||
|
n->mqttread = w5x00_read;
|
||||||
|
n->mqttwrite = w5x00_write;
|
||||||
|
n->disconnect = w5x00_disconnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief read function
|
||||||
|
* @param n : pointer to a Network structure
|
||||||
|
* that contains the configuration information for the Network.
|
||||||
|
* buffer : pointer to a read buffer.
|
||||||
|
* len : buffer length.
|
||||||
|
* @retval received data length or SOCKERR code
|
||||||
|
*/
|
||||||
|
int w5x00_read(Network* n, unsigned char* buffer, int len, long time)
|
||||||
|
{
|
||||||
|
|
||||||
|
if((getSn_SR(n->my_socket) == SOCK_ESTABLISHED) && (getSn_RX_RSR(n->my_socket)>0))
|
||||||
|
return recv(n->my_socket, buffer, len);
|
||||||
|
|
||||||
|
return SOCK_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief write function
|
||||||
|
* @param n : pointer to a Network structure
|
||||||
|
* that contains the configuration information for the Network.
|
||||||
|
* buffer : pointer to a read buffer.
|
||||||
|
* len : buffer length.
|
||||||
|
* @retval length of data sent or SOCKERR code
|
||||||
|
*/
|
||||||
|
int w5x00_write(Network* n, unsigned char* buffer, int len, long time)
|
||||||
|
{
|
||||||
|
if(getSn_SR(n->my_socket) == SOCK_ESTABLISHED)
|
||||||
|
return send(n->my_socket, buffer, len);
|
||||||
|
|
||||||
|
return SOCK_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief disconnect function
|
||||||
|
* @param n : pointer to a Network structure
|
||||||
|
* that contains the configuration information for the Network.
|
||||||
|
*/
|
||||||
|
void w5x00_disconnect(Network* n)
|
||||||
|
{
|
||||||
|
disconnect(n->my_socket);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief connect network function
|
||||||
|
* @param n : pointer to a Network structure
|
||||||
|
* that contains the configuration information for the Network.
|
||||||
|
* ip : server iP.
|
||||||
|
* port : server port.
|
||||||
|
*/
|
||||||
|
void ConnectNetwork(Network* n, uint8_t* ip, uint16_t port)
|
||||||
|
{
|
||||||
|
uint16_t myport = 12345;
|
||||||
|
|
||||||
|
socket(n->my_socket,Sn_MR_TCP,myport,0);
|
||||||
|
connect(n->my_socket,ip,port);
|
||||||
|
}
|
271
cube/w5500/mqtt_interface.h
Normal file
271
cube/w5500/mqtt_interface.h
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
//*****************************************************************************
|
||||||
|
//! \file mqtt_interface.h
|
||||||
|
//! \brief Paho MQTT to WIZnet Chip interface Header file.
|
||||||
|
//! \details The process of porting an interface to use paho MQTT.
|
||||||
|
//! \version 1.0.0
|
||||||
|
//! \date 2016/12/06
|
||||||
|
//! \par Revision history
|
||||||
|
//! <2016/12/06> 1st Release
|
||||||
|
//!
|
||||||
|
//! \author Peter Bang & Justin Kim
|
||||||
|
//! \copyright
|
||||||
|
//!
|
||||||
|
//! Copyright (c) 2016, 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.
|
||||||
|
//
|
||||||
|
//*****************************************************************************
|
||||||
|
|
||||||
|
/* MQTT subscribe Example.... W5500 + STM32F103(IoT board)
|
||||||
|
//Include: Board configuration
|
||||||
|
#include "IoTEVB.h"
|
||||||
|
|
||||||
|
//Include: MCU peripheral Library
|
||||||
|
#include "stm32f10x_rcc.h"
|
||||||
|
#include "stm32f10x.h"
|
||||||
|
|
||||||
|
//Include: W5500 iolibrary
|
||||||
|
#include "w5500.h"
|
||||||
|
#include "wizchip_conf.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
|
//Include: Internet iolibrary
|
||||||
|
#include "MQTTClient.h"
|
||||||
|
|
||||||
|
//Include: MCU Specific W5500 driver
|
||||||
|
#include "W5500HardwareDriver.h"
|
||||||
|
|
||||||
|
//Include: Standard IO Library
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
//Socket number defines
|
||||||
|
#define TCP_SOCKET 0
|
||||||
|
|
||||||
|
//Receive Buffer Size define
|
||||||
|
#define BUFFER_SIZE 2048
|
||||||
|
|
||||||
|
//Global variables
|
||||||
|
unsigned char targetIP[4] = {}; // mqtt server IP
|
||||||
|
unsigned int targetPort = 1883; // mqtt server port
|
||||||
|
uint8_t mac_address[6] = {};
|
||||||
|
wiz_NetInfo gWIZNETINFO = { .mac = {}, //user MAC
|
||||||
|
.ip = {}, //user IP
|
||||||
|
.sn = {},
|
||||||
|
.gw = {},
|
||||||
|
.dns = {},
|
||||||
|
.dhcp = NETINFO_STATIC};
|
||||||
|
|
||||||
|
unsigned char tempBuffer[BUFFER_SIZE] = {};
|
||||||
|
|
||||||
|
struct opts_struct
|
||||||
|
{
|
||||||
|
char* clientid;
|
||||||
|
int nodelimiter;
|
||||||
|
char* delimiter;
|
||||||
|
enum QoS qos;
|
||||||
|
char* username;
|
||||||
|
char* password;
|
||||||
|
char* host;
|
||||||
|
int port;
|
||||||
|
int showtopics;
|
||||||
|
} opts ={ (char*)"stdout-subscriber", 0, (char*)"\n", QOS0, NULL, NULL, targetIP, targetPort, 0 };
|
||||||
|
|
||||||
|
|
||||||
|
// @brief messageArrived callback function
|
||||||
|
void messageArrived(MessageData* md)
|
||||||
|
{
|
||||||
|
unsigned char testbuffer[100];
|
||||||
|
MQTTMessage* message = md->message;
|
||||||
|
|
||||||
|
if (opts.showtopics)
|
||||||
|
{
|
||||||
|
memcpy(testbuffer,(char*)message->payload,(int)message->payloadlen);
|
||||||
|
*(testbuffer + (int)message->payloadlen + 1) = "\n";
|
||||||
|
printf("%s\r\n",testbuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opts.nodelimiter)
|
||||||
|
printf("%.*s", (int)message->payloadlen, (char*)message->payload);
|
||||||
|
else
|
||||||
|
printf("%.*s%s", (int)message->payloadlen, (char*)message->payload, opts.delimiter);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// @brief 1 millisecond Tick Timer setting
|
||||||
|
void NVIC_configuration(void)
|
||||||
|
{
|
||||||
|
NVIC_InitTypeDef NVIC_InitStructure;
|
||||||
|
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
|
||||||
|
SysTick_Config(72000);
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // Highest priority
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||||
|
NVIC_Init(&NVIC_InitStructure);
|
||||||
|
}
|
||||||
|
|
||||||
|
// @brief 1 millisecond Tick Timer Handler setting
|
||||||
|
void SysTick_Handler(void)
|
||||||
|
{
|
||||||
|
MilliTimer_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
led_ctrl led1,led2;
|
||||||
|
int i;
|
||||||
|
int rc = 0;
|
||||||
|
unsigned char buf[100];
|
||||||
|
//Usart initialization for Debug.
|
||||||
|
USART1Initialze();
|
||||||
|
printf("USART initialized.\n\r");
|
||||||
|
|
||||||
|
I2C1Initialize();
|
||||||
|
printf("I2C initialized.\n\r");
|
||||||
|
|
||||||
|
MACEEP_Read(mac_address,0xfa,6);
|
||||||
|
|
||||||
|
printf("Mac address\n\r");
|
||||||
|
for(i = 0 ; i < 6 ; i++)
|
||||||
|
{
|
||||||
|
printf("%02x ",mac_address[i]);
|
||||||
|
}
|
||||||
|
printf("\n\r");
|
||||||
|
|
||||||
|
//LED initialization.
|
||||||
|
led_initialize();
|
||||||
|
led1 = led2 = ON;
|
||||||
|
|
||||||
|
led2Ctrl(led2);
|
||||||
|
led1Ctrl(led1);
|
||||||
|
|
||||||
|
//W5500 initialization.
|
||||||
|
W5500HardwareInitilize();
|
||||||
|
printf("W5500 hardware interface initialized.\n\r");
|
||||||
|
|
||||||
|
W5500Initialze();
|
||||||
|
printf("W5500 IC initialized.\n\r");
|
||||||
|
|
||||||
|
//Set network informations
|
||||||
|
wizchip_setnetinfo(&gWIZNETINFO);
|
||||||
|
|
||||||
|
setSHAR(mac_address);
|
||||||
|
|
||||||
|
print_network_information();
|
||||||
|
|
||||||
|
Network n;
|
||||||
|
MQTTClient c;
|
||||||
|
|
||||||
|
NewNetwork(&n, TCP_SOCKET);
|
||||||
|
ConnectNetwork(&n, targetIP, targetPort);
|
||||||
|
MQTTClientInit(&c,&n,1000,buf,100,tempBuffer,2048);
|
||||||
|
|
||||||
|
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
|
||||||
|
data.willFlag = 0;
|
||||||
|
data.MQTTVersion = 3;
|
||||||
|
data.clientID.cstring = opts.clientid;
|
||||||
|
data.username.cstring = opts.username;
|
||||||
|
data.password.cstring = opts.password;
|
||||||
|
|
||||||
|
data.keepAliveInterval = 60;
|
||||||
|
data.cleansession = 1;
|
||||||
|
|
||||||
|
rc = MQTTConnect(&c, &data);
|
||||||
|
printf("Connected %d\r\n", rc);
|
||||||
|
opts.showtopics = 1;
|
||||||
|
|
||||||
|
printf("Subscribing to %s\r\n", "hello/wiznet");
|
||||||
|
rc = MQTTSubscribe(&c, "hello/wiznet", opts.qos, messageArrived);
|
||||||
|
printf("Subscribed %d\r\n", rc);
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
MQTTYield(&c, data.keepAliveInterval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __MQTT_INTERFACE_H_
|
||||||
|
#define __MQTT_INTERFACE_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief MQTT MilliTimer handler
|
||||||
|
* @note MUST BE register to your system 1m Tick timer handler
|
||||||
|
*/
|
||||||
|
void MilliTimer_Handler(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Timer structure
|
||||||
|
*/
|
||||||
|
typedef struct Timer Timer;
|
||||||
|
struct Timer {
|
||||||
|
unsigned long systick_period;
|
||||||
|
unsigned long end_time;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Network structure
|
||||||
|
*/
|
||||||
|
typedef struct Network Network;
|
||||||
|
struct Network
|
||||||
|
{
|
||||||
|
int my_socket;
|
||||||
|
int (*mqttread) (Network*, unsigned char*, int, long);
|
||||||
|
int (*mqttwrite) (Network*, unsigned char*, int, long);
|
||||||
|
void (*disconnect) (Network*);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Timer function
|
||||||
|
*/
|
||||||
|
void TimerInit(Timer*);
|
||||||
|
char TimerIsExpired(Timer*);
|
||||||
|
void TimerCountdownMS(Timer*, unsigned int);
|
||||||
|
void TimerCountdown(Timer*, unsigned int);
|
||||||
|
int TimerLeftMS(Timer*);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Network interface porting
|
||||||
|
*/
|
||||||
|
int w5x00_read(Network*, unsigned char*, int, long);
|
||||||
|
int w5x00_write(Network*, unsigned char*, int, long);
|
||||||
|
void w5x00_disconnect(Network*);
|
||||||
|
void NewNetwork(Network* n, int sn);
|
||||||
|
void ConnectNetwork(Network* n, uint8_t* ip, uint16_t port);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif //__MQTT_INTERFACE_H_
|
931
cube/w5500/socket.c
Normal file
931
cube/w5500/socket.c
Normal file
@ -0,0 +1,931 @@
|
|||||||
|
//*****************************************************************************
|
||||||
|
//
|
||||||
|
//! \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;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
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_ == 5100) || (_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;
|
||||||
|
}
|
489
cube/w5500/socket.h
Normal file
489
cube/w5500/socket.h
Normal file
@ -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_ == 5100) || (_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_
|
267
cube/w5500/w5500.c
Normal file
267
cube/w5500/w5500.c
Normal file
@ -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
|
2163
cube/w5500/w5500.h
Normal file
2163
cube/w5500/w5500.h
Normal file
File diff suppressed because it is too large
Load Diff
908
cube/w5500/wizchip_conf.c
Normal file
908
cube/w5500/wizchip_conf.c
Normal file
@ -0,0 +1,908 @@
|
|||||||
|
//****************************************************************************/
|
||||||
|
//!
|
||||||
|
//! \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) {};
|
||||||
|
__attribute__((weak)) 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) {};
|
||||||
|
__attribute__((weak)) 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;};
|
||||||
|
__attribute__((weak)) 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) {};
|
||||||
|
__attribute__((weak)) 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) {};
|
||||||
|
__attribute__((weak)) 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) {};
|
||||||
|
__attribute__((weak)) 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);
|
||||||
|
//M20200227 : For clear
|
||||||
|
//setSIR(sir);
|
||||||
|
for(ir=0; ir<8; ir++){
|
||||||
|
if(sir & (0x01 <<ir) ) setSn_IR(ir, 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
#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();
|
||||||
|
}
|
664
cube/w5500/wizchip_conf.h
Normal file
664
cube/w5500/wizchip_conf.h
Normal file
@ -0,0 +1,664 @@
|
|||||||
|
//*****************************************************************************
|
||||||
|
//
|
||||||
|
//! \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
|
||||||
|
|
||||||
|
|
||||||
|
#define _WIZCHIP_ W5500
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _WIZCHIP_
|
||||||
|
#define _WIZCHIP_ W5100S // 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[7]; ///< @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_
|
@ -53,7 +53,7 @@ cat $IT_C_BAK | \
|
|||||||
mkdir w5500
|
mkdir w5500
|
||||||
pushd ioLibrary_Driver
|
pushd ioLibrary_Driver
|
||||||
for D in Ethernet Ethernet/W5500 Internet/DHCP Internet/DNS Internet/httpServer Internet/MQTT; do
|
for D in Ethernet Ethernet/W5500 Internet/DHCP Internet/DNS Internet/httpServer Internet/MQTT; do
|
||||||
cp $D/*.c $D/.h ../w5500
|
cp $D/*.c $D/*.h ../w5500
|
||||||
done
|
done
|
||||||
popd
|
popd
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user