From 38232b92715489c35b3de31b32c149f015da07b6 Mon Sep 17 00:00:00 2001 From: Microchip Technology Date: Fri, 11 Aug 2023 20:45:43 +0000 Subject: [PATCH] Deploy 1.0.0 to pic-avr-solutions github --- .main-meta/main.json | 67 + LICENSE.TXT | 14 + Microchip TCPIP Demo GUI.jar | Bin 0 -> 128460 bytes README.md | 178 ++ .../ENC28J60-avr-tcpclient.mc3 | 385 ++++ enc28j60-avr-tcpclient.X/Makefile | 113 ++ .../app_files/src/tcp_client_demo.c | 151 ++ .../app_files/tcp_client_demo.h | 49 + enc28j60-avr-tcpclient.X/main.c | 62 + .../mcc_generated_files/docs/delay.dox | 16 + .../mcc_generated_files/ethernet/enc28j60.h | 324 ++++ .../ethernet/physical_layer_interface.h | 504 ++++++ .../ethernet/src/enc28j60.c | 1336 ++++++++++++++ .../mcc_generated_files/nvm/nvm.h | 206 +++ .../mcc_generated_files/nvm/src/nvm.c | 157 ++ .../mcc_generated_files/spi/spi0.h | 223 +++ .../mcc_generated_files/spi/spi_interface.h | 86 + .../mcc_generated_files/spi/src/spi0.c | 208 +++ .../mcc_generated_files/system/ccp.h | 72 + .../mcc_generated_files/system/clock.h | 69 + .../mcc_generated_files/system/config_bits.h | 42 + .../mcc_generated_files/system/interrupt.h | 57 + .../mcc_generated_files/system/pins.h | 288 +++ .../mcc_generated_files/system/port.h | 902 ++++++++++ .../mcc_generated_files/system/protected_io.h | 80 + .../mcc_generated_files/system/src/clock.c | 99 ++ .../system/src/config_bits.c | 47 + .../system/src/interrupt.c | 53 + .../mcc_generated_files/system/src/pins.c | 243 +++ .../system/src/protected_io.S | 90 + .../mcc_generated_files/system/src/system.c | 44 + .../mcc_generated_files/system/system.h | 62 + .../system/utils/assembler.h | 49 + .../system/utils/assembler/gas.h | 120 ++ .../system/utils/assembler/iar.h | 104 ++ .../mcc_generated_files/system/utils/atomic.h | 87 + .../system/utils/compiler.h | 72 + .../system/utils/interrupt_avr8.h | 88 + .../mcc_generated_files/system/utils/utils.h | 52 + .../system/utils/utils_assert.h | 60 + .../mcc_generated_files/tcpiplite/arpv4.h | 82 + .../tcpiplite/dhcp_client.h | 69 + .../tcpiplite/ip_database.h | 109 ++ .../mcc_generated_files/tcpiplite/ipv4.h | 90 + .../mcc_generated_files/tcpiplite/lfsr.h | 86 + .../mcc_generated_files/tcpiplite/log.h | 142 ++ .../tcpiplite/log_console.h | 42 + .../tcpiplite/log_syslog.h | 50 + .../mcc_generated_files/tcpiplite/network.h | 110 ++ .../mcc_generated_files/tcpiplite/rtcc.h | 87 + .../mcc_generated_files/tcpiplite/src/arpv4.c | 233 +++ .../tcpiplite/src/dhcp_client.c | 579 ++++++ .../tcpiplite/src/ip_database.c | 74 + .../mcc_generated_files/tcpiplite/src/ipv4.c | 287 +++ .../mcc_generated_files/tcpiplite/src/lfsr.c | 81 + .../mcc_generated_files/tcpiplite/src/log.c | 151 ++ .../tcpiplite/src/log_console.c | 50 + .../tcpiplite/src/log_syslog.c | 79 + .../tcpiplite/src/network.c | 167 ++ .../mcc_generated_files/tcpiplite/src/rtcc.c | 81 + .../mcc_generated_files/tcpiplite/src/tcpv4.c | 1564 +++++++++++++++++ .../mcc_generated_files/tcpiplite/src/udpv4.c | 138 ++ .../tcpiplite/src/udpv4_port_handler_table.c | 57 + .../tcpiplite/tcpip_config.h | 104 ++ .../tcpiplite/tcpip_types.h | 527 ++++++ .../mcc_generated_files/tcpiplite/tcpv4.h | 372 ++++ .../mcc_generated_files/tcpiplite/udpv4.h | 89 + .../tcpiplite/udpv4_port_handler_table.h | 65 + .../mcc_generated_files/timer/delay.h | 54 + .../mcc_generated_files/timer/src/delay.c | 54 + .../mcc_generated_files/timer/src/tca0.c | 259 +++ .../mcc_generated_files/timer/tca0.h | 199 +++ .../timer/timer_interface.h | 69 + .../nbproject/Makefile-default.mk | 432 +++++ .../nbproject/Makefile-genesis.properties | 13 + .../nbproject/Makefile-impl.mk | 69 + .../nbproject/Makefile-local-default.mk | 36 + .../nbproject/Makefile-variables.mk | 10 + .../nbproject/configurations.xml | 376 ++++ .../nbproject/private/configurations.xml | 25 + .../nbproject/project.xml | 26 + enc28j60-avr-tcpserver.X/Makefile | 113 ++ .../app_files/src/tcp_server_demo.c | 106 ++ .../app_files/tcp_server_demo.h | 45 + .../enc28j60-avr-tcpserver.mc3 | 385 ++++ enc28j60-avr-tcpserver.X/main.c | 64 + .../mcc_generated_files/docs/delay.dox | 16 + .../mcc_generated_files/ethernet/enc28j60.h | 324 ++++ .../ethernet/physical_layer_interface.h | 504 ++++++ .../ethernet/src/enc28j60.c | 1336 ++++++++++++++ .../mcc_generated_files/spi/spi0.h | 223 +++ .../mcc_generated_files/spi/spi_interface.h | 86 + .../mcc_generated_files/spi/src/spi0.c | 208 +++ .../mcc_generated_files/system/ccp.h | 72 + .../mcc_generated_files/system/clock.h | 69 + .../mcc_generated_files/system/config_bits.h | 42 + .../mcc_generated_files/system/interrupt.h | 57 + .../mcc_generated_files/system/pins.h | 288 +++ .../mcc_generated_files/system/port.h | 902 ++++++++++ .../mcc_generated_files/system/protected_io.h | 80 + .../mcc_generated_files/system/src/clock.c | 99 ++ .../system/src/config_bits.c | 47 + .../system/src/interrupt.c | 53 + .../mcc_generated_files/system/src/pins.c | 243 +++ .../system/src/protected_io.S | 90 + .../mcc_generated_files/system/src/system.c | 44 + .../mcc_generated_files/system/system.h | 62 + .../system/utils/assembler.h | 49 + .../system/utils/assembler/gas.h | 120 ++ .../system/utils/assembler/iar.h | 104 ++ .../mcc_generated_files/system/utils/atomic.h | 87 + .../system/utils/compiler.h | 72 + .../system/utils/interrupt_avr8.h | 88 + .../mcc_generated_files/system/utils/utils.h | 52 + .../system/utils/utils_assert.h | 60 + .../mcc_generated_files/tcpiplite/arpv4.h | 82 + .../tcpiplite/dhcp_client.h | 69 + .../tcpiplite/ip_database.h | 109 ++ .../mcc_generated_files/tcpiplite/ipv4.h | 90 + .../mcc_generated_files/tcpiplite/lfsr.h | 86 + .../mcc_generated_files/tcpiplite/log.h | 142 ++ .../tcpiplite/log_console.h | 42 + .../tcpiplite/log_syslog.h | 50 + .../mcc_generated_files/tcpiplite/network.h | 110 ++ .../mcc_generated_files/tcpiplite/rtcc.h | 87 + .../mcc_generated_files/tcpiplite/src/arpv4.c | 233 +++ .../tcpiplite/src/dhcp_client.c | 579 ++++++ .../tcpiplite/src/ip_database.c | 74 + .../mcc_generated_files/tcpiplite/src/ipv4.c | 287 +++ .../mcc_generated_files/tcpiplite/src/lfsr.c | 81 + .../mcc_generated_files/tcpiplite/src/log.c | 151 ++ .../tcpiplite/src/log_console.c | 50 + .../tcpiplite/src/log_syslog.c | 79 + .../tcpiplite/src/network.c | 167 ++ .../mcc_generated_files/tcpiplite/src/rtcc.c | 81 + .../mcc_generated_files/tcpiplite/src/tcpv4.c | 1564 +++++++++++++++++ .../mcc_generated_files/tcpiplite/src/udpv4.c | 138 ++ .../tcpiplite/src/udpv4_port_handler_table.c | 57 + .../tcpiplite/tcpip_config.h | 104 ++ .../tcpiplite/tcpip_types.h | 527 ++++++ .../mcc_generated_files/tcpiplite/tcpv4.h | 372 ++++ .../mcc_generated_files/tcpiplite/udpv4.h | 89 + .../tcpiplite/udpv4_port_handler_table.h | 65 + .../mcc_generated_files/timer/delay.h | 54 + .../mcc_generated_files/timer/src/delay.c | 54 + .../mcc_generated_files/timer/src/tca0.c | 259 +++ .../mcc_generated_files/timer/tca0.h | 199 +++ .../timer/timer_interface.h | 69 + .../nbproject/Makefile-default.mk | 432 +++++ .../nbproject/Makefile-genesis.properties | 13 + .../nbproject/Makefile-impl.mk | 69 + .../nbproject/Makefile-local-default.mk | 36 + .../nbproject/Makefile-variables.mk | 10 + .../nbproject/configurations.xml | 285 +++ .../nbproject/private/configurations.xml | 25 + .../nbproject/project.xml | 25 + enc28j60-avr-udp.X/ENC28J60-avr-udp.mc3 | 377 ++++ enc28j60-avr-udp.X/Makefile | 113 ++ enc28j60-avr-udp.X/app_files/src/udp_demo.c | 139 ++ enc28j60-avr-udp.X/app_files/udp_demo.h | 101 ++ .../nbproject/configurations.xml | 359 ++++ .../enc28j60-avr-udp.X/nbproject/project.xml | 25 + enc28j60-avr-udp.X/main.c | 61 + .../mcc_generated_files/docs/delay.dox | 16 + .../mcc_generated_files/ethernet/enc28j60.h | 324 ++++ .../ethernet/physical_layer_interface.h | 504 ++++++ .../ethernet/src/enc28j60.c | 1336 ++++++++++++++ .../mcc_generated_files/nvm/nvm.h | 206 +++ .../mcc_generated_files/nvm/src/nvm.c | 157 ++ .../mcc_generated_files/spi/spi0.h | 223 +++ .../mcc_generated_files/spi/spi_interface.h | 86 + .../mcc_generated_files/spi/src/spi0.c | 208 +++ .../mcc_generated_files/system/ccp.h | 72 + .../mcc_generated_files/system/clock.h | 69 + .../mcc_generated_files/system/config_bits.h | 42 + .../mcc_generated_files/system/interrupt.h | 57 + .../mcc_generated_files/system/pins.h | 288 +++ .../mcc_generated_files/system/port.h | 902 ++++++++++ .../mcc_generated_files/system/protected_io.h | 80 + .../mcc_generated_files/system/src/clock.c | 99 ++ .../system/src/config_bits.c | 47 + .../system/src/interrupt.c | 53 + .../mcc_generated_files/system/src/pins.c | 243 +++ .../system/src/protected_io.S | 90 + .../mcc_generated_files/system/src/system.c | 44 + .../mcc_generated_files/system/system.h | 62 + .../system/utils/assembler.h | 49 + .../system/utils/assembler/gas.h | 120 ++ .../system/utils/assembler/iar.h | 104 ++ .../mcc_generated_files/system/utils/atomic.h | 87 + .../system/utils/compiler.h | 72 + .../system/utils/interrupt_avr8.h | 88 + .../mcc_generated_files/system/utils/utils.h | 52 + .../system/utils/utils_assert.h | 60 + .../mcc_generated_files/tcpiplite/arpv4.h | 82 + .../tcpiplite/dhcp_client.h | 69 + .../tcpiplite/ip_database.h | 109 ++ .../mcc_generated_files/tcpiplite/ipv4.h | 90 + .../mcc_generated_files/tcpiplite/lfsr.h | 86 + .../mcc_generated_files/tcpiplite/log.h | 142 ++ .../tcpiplite/log_console.h | 42 + .../tcpiplite/log_syslog.h | 50 + .../mcc_generated_files/tcpiplite/network.h | 110 ++ .../mcc_generated_files/tcpiplite/rtcc.h | 87 + .../mcc_generated_files/tcpiplite/src/arpv4.c | 233 +++ .../tcpiplite/src/dhcp_client.c | 579 ++++++ .../tcpiplite/src/ip_database.c | 74 + .../mcc_generated_files/tcpiplite/src/ipv4.c | 256 +++ .../mcc_generated_files/tcpiplite/src/lfsr.c | 81 + .../mcc_generated_files/tcpiplite/src/log.c | 151 ++ .../tcpiplite/src/log_console.c | 50 + .../tcpiplite/src/log_syslog.c | 79 + .../tcpiplite/src/network.c | 164 ++ .../mcc_generated_files/tcpiplite/src/rtcc.c | 81 + .../mcc_generated_files/tcpiplite/src/udpv4.c | 138 ++ .../tcpiplite/src/udpv4_port_handler_table.c | 59 + .../tcpiplite/tcpip_config.h | 104 ++ .../tcpiplite/tcpip_types.h | 527 ++++++ .../mcc_generated_files/tcpiplite/udpv4.h | 89 + .../tcpiplite/udpv4_port_handler_table.h | 65 + .../mcc_generated_files/timer/delay.h | 54 + .../mcc_generated_files/timer/src/delay.c | 54 + .../mcc_generated_files/timer/src/tca0.c | 259 +++ .../mcc_generated_files/timer/tca0.h | 199 +++ .../timer/timer_interface.h | 69 + .../nbproject/Makefile-default.mk | 420 +++++ .../nbproject/Makefile-genesis.properties | 13 + enc28j60-avr-udp.X/nbproject/Makefile-impl.mk | 69 + .../nbproject/Makefile-local-default.mk | 36 + .../nbproject/Makefile-variables.mk | 10 + .../nbproject/configurations.xml | 375 ++++ .../nbproject/private/configurations.xml | 25 + enc28j60-avr-udp.X/nbproject/project.xml | 25 + images/AVR_setup.png | Bin 0 -> 138040 bytes images/Wireshark_homepage.png | Bin 0 -> 32274 bytes images/avr_udp_setup.png | Bin 0 -> 225039 bytes images/ledon_wireshark.png | Bin 0 -> 37194 bytes images/mchp_logo_dark.png | Bin 0 -> 25536 bytes images/mchp_logo_light.png | Bin 0 -> 21099 bytes images/pcipaddress.png | Bin 0 -> 32660 bytes images/send_wireshark.png | Bin 0 -> 37249 bytes images/tclient_connected.png | Bin 0 -> 32083 bytes images/tclient_listen.png | Bin 0 -> 25972 bytes images/tcpclient_disconnect.png | Bin 0 -> 33353 bytes images/tcpclient_filter.png | Bin 0 -> 16036 bytes images/tcpclient_led0.png | Bin 0 -> 33856 bytes images/tcpclient_prosetup.png | Bin 0 -> 215460 bytes images/tcpclient_send1.png | Bin 0 -> 32681 bytes images/tcpclient_send2.png | Bin 0 -> 32160 bytes images/tcpserver_con_closed.png | Bin 0 -> 27494 bytes images/tcpserver_connect.png | Bin 0 -> 24858 bytes images/tcpserver_connect2.png | Bin 0 -> 25478 bytes images/tcpserver_ipaddress.png | Bin 0 -> 92940 bytes images/tcpserver_prosetup.png | Bin 0 -> 232923 bytes images/tcpserver_send1.png | Bin 0 -> 26719 bytes images/tcpserver_send2.png | Bin 0 -> 27311 bytes images/tcpserver_send_wiresrk.png | Bin 0 -> 64375 bytes images/tcpserver_wfilter.png | Bin 0 -> 14288 bytes images/udp_claim.png | Bin 0 -> 24610 bytes images/udp_filter.png | Bin 0 -> 13878 bytes images/udp_handshake.png | Bin 0 -> 95190 bytes images/udp_helloworld.png | Bin 0 -> 52771 bytes images/udp_led2.png | Bin 0 -> 26248 bytes images/udp_led_wireshark.png | Bin 0 -> 43712 bytes images/udp_listen.png | Bin 0 -> 24670 bytes images/udp_send1.png | Bin 0 -> 25138 bytes images/udp_send_wireshark.png | Bin 0 -> 44677 bytes 267 files changed, 39551 insertions(+) create mode 100644 .main-meta/main.json create mode 100644 LICENSE.TXT create mode 100644 Microchip TCPIP Demo GUI.jar create mode 100644 README.md create mode 100644 enc28j60-avr-tcpclient.X/ENC28J60-avr-tcpclient.mc3 create mode 100644 enc28j60-avr-tcpclient.X/Makefile create mode 100644 enc28j60-avr-tcpclient.X/app_files/src/tcp_client_demo.c create mode 100644 enc28j60-avr-tcpclient.X/app_files/tcp_client_demo.h create mode 100644 enc28j60-avr-tcpclient.X/main.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/docs/delay.dox create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/ethernet/enc28j60.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/ethernet/physical_layer_interface.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/ethernet/src/enc28j60.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/nvm/nvm.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/nvm/src/nvm.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/spi/spi0.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/spi/spi_interface.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/spi/src/spi0.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/ccp.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/clock.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/config_bits.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/interrupt.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/pins.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/port.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/protected_io.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/clock.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/config_bits.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/interrupt.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/pins.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/protected_io.S create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/system.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/system.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/assembler.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/assembler/gas.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/assembler/iar.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/atomic.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/compiler.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/interrupt_avr8.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/utils.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/utils_assert.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/arpv4.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/dhcp_client.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/ip_database.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/ipv4.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/lfsr.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/log.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/log_console.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/log_syslog.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/network.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/rtcc.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/arpv4.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/dhcp_client.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/ip_database.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/ipv4.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/lfsr.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/log.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/log_console.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/log_syslog.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/network.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/rtcc.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/tcpv4.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/udpv4.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/tcpip_config.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/tcpip_types.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/tcpv4.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/udpv4.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/udpv4_port_handler_table.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/timer/delay.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/timer/src/delay.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/timer/src/tca0.c create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/timer/tca0.h create mode 100644 enc28j60-avr-tcpclient.X/mcc_generated_files/timer/timer_interface.h create mode 100644 enc28j60-avr-tcpclient.X/nbproject/Makefile-default.mk create mode 100644 enc28j60-avr-tcpclient.X/nbproject/Makefile-genesis.properties create mode 100644 enc28j60-avr-tcpclient.X/nbproject/Makefile-impl.mk create mode 100644 enc28j60-avr-tcpclient.X/nbproject/Makefile-local-default.mk create mode 100644 enc28j60-avr-tcpclient.X/nbproject/Makefile-variables.mk create mode 100644 enc28j60-avr-tcpclient.X/nbproject/configurations.xml create mode 100644 enc28j60-avr-tcpclient.X/nbproject/private/configurations.xml create mode 100644 enc28j60-avr-tcpclient.X/nbproject/project.xml create mode 100644 enc28j60-avr-tcpserver.X/Makefile create mode 100644 enc28j60-avr-tcpserver.X/app_files/src/tcp_server_demo.c create mode 100644 enc28j60-avr-tcpserver.X/app_files/tcp_server_demo.h create mode 100644 enc28j60-avr-tcpserver.X/enc28j60-avr-tcpserver.mc3 create mode 100644 enc28j60-avr-tcpserver.X/main.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/docs/delay.dox create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/ethernet/enc28j60.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/ethernet/physical_layer_interface.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/ethernet/src/enc28j60.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/spi/spi0.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/spi/spi_interface.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/spi/src/spi0.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/ccp.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/clock.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/config_bits.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/interrupt.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/pins.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/port.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/protected_io.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/clock.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/config_bits.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/interrupt.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/pins.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/protected_io.S create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/system.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/system.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/assembler.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/assembler/gas.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/assembler/iar.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/atomic.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/compiler.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/interrupt_avr8.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/utils.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/utils_assert.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/arpv4.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/dhcp_client.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/ip_database.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/ipv4.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/lfsr.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/log.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/log_console.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/log_syslog.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/network.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/rtcc.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/arpv4.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/dhcp_client.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/ip_database.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/ipv4.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/lfsr.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/log.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/log_console.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/log_syslog.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/network.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/rtcc.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/tcpv4.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/udpv4.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/tcpip_config.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/tcpip_types.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/tcpv4.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/udpv4.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/udpv4_port_handler_table.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/timer/delay.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/timer/src/delay.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/timer/src/tca0.c create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/timer/tca0.h create mode 100644 enc28j60-avr-tcpserver.X/mcc_generated_files/timer/timer_interface.h create mode 100644 enc28j60-avr-tcpserver.X/nbproject/Makefile-default.mk create mode 100644 enc28j60-avr-tcpserver.X/nbproject/Makefile-genesis.properties create mode 100644 enc28j60-avr-tcpserver.X/nbproject/Makefile-impl.mk create mode 100644 enc28j60-avr-tcpserver.X/nbproject/Makefile-local-default.mk create mode 100644 enc28j60-avr-tcpserver.X/nbproject/Makefile-variables.mk create mode 100644 enc28j60-avr-tcpserver.X/nbproject/configurations.xml create mode 100644 enc28j60-avr-tcpserver.X/nbproject/private/configurations.xml create mode 100644 enc28j60-avr-tcpserver.X/nbproject/project.xml create mode 100644 enc28j60-avr-udp.X/ENC28J60-avr-udp.mc3 create mode 100644 enc28j60-avr-udp.X/Makefile create mode 100644 enc28j60-avr-udp.X/app_files/src/udp_demo.c create mode 100644 enc28j60-avr-udp.X/app_files/udp_demo.h create mode 100644 enc28j60-avr-udp.X/enc28j60-avr-udp/enc28j60-avr-udp.X/nbproject/configurations.xml create mode 100644 enc28j60-avr-udp.X/enc28j60-avr-udp/enc28j60-avr-udp.X/nbproject/project.xml create mode 100644 enc28j60-avr-udp.X/main.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/docs/delay.dox create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/ethernet/enc28j60.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/ethernet/physical_layer_interface.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/ethernet/src/enc28j60.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/nvm/nvm.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/nvm/src/nvm.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/spi/spi0.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/spi/spi_interface.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/spi/src/spi0.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/ccp.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/clock.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/config_bits.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/interrupt.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/pins.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/port.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/protected_io.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/src/clock.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/src/config_bits.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/src/interrupt.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/src/pins.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/src/protected_io.S create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/src/system.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/system.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/utils/assembler.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/utils/assembler/gas.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/utils/assembler/iar.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/utils/atomic.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/utils/compiler.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/utils/interrupt_avr8.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/utils/utils.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/system/utils/utils_assert.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/arpv4.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/dhcp_client.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/ip_database.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/ipv4.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/lfsr.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/log.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/log_console.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/log_syslog.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/network.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/rtcc.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/arpv4.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/dhcp_client.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/ip_database.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/ipv4.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/lfsr.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/log.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/log_console.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/log_syslog.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/network.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/rtcc.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/udpv4.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/tcpip_config.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/tcpip_types.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/udpv4.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/udpv4_port_handler_table.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/timer/delay.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/timer/src/delay.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/timer/src/tca0.c create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/timer/tca0.h create mode 100644 enc28j60-avr-udp.X/mcc_generated_files/timer/timer_interface.h create mode 100644 enc28j60-avr-udp.X/nbproject/Makefile-default.mk create mode 100644 enc28j60-avr-udp.X/nbproject/Makefile-genesis.properties create mode 100644 enc28j60-avr-udp.X/nbproject/Makefile-impl.mk create mode 100644 enc28j60-avr-udp.X/nbproject/Makefile-local-default.mk create mode 100644 enc28j60-avr-udp.X/nbproject/Makefile-variables.mk create mode 100644 enc28j60-avr-udp.X/nbproject/configurations.xml create mode 100644 enc28j60-avr-udp.X/nbproject/private/configurations.xml create mode 100644 enc28j60-avr-udp.X/nbproject/project.xml create mode 100644 images/AVR_setup.png create mode 100644 images/Wireshark_homepage.png create mode 100644 images/avr_udp_setup.png create mode 100644 images/ledon_wireshark.png create mode 100644 images/mchp_logo_dark.png create mode 100644 images/mchp_logo_light.png create mode 100644 images/pcipaddress.png create mode 100644 images/send_wireshark.png create mode 100644 images/tclient_connected.png create mode 100644 images/tclient_listen.png create mode 100644 images/tcpclient_disconnect.png create mode 100644 images/tcpclient_filter.png create mode 100644 images/tcpclient_led0.png create mode 100644 images/tcpclient_prosetup.png create mode 100644 images/tcpclient_send1.png create mode 100644 images/tcpclient_send2.png create mode 100644 images/tcpserver_con_closed.png create mode 100644 images/tcpserver_connect.png create mode 100644 images/tcpserver_connect2.png create mode 100644 images/tcpserver_ipaddress.png create mode 100644 images/tcpserver_prosetup.png create mode 100644 images/tcpserver_send1.png create mode 100644 images/tcpserver_send2.png create mode 100644 images/tcpserver_send_wiresrk.png create mode 100644 images/tcpserver_wfilter.png create mode 100644 images/udp_claim.png create mode 100644 images/udp_filter.png create mode 100644 images/udp_handshake.png create mode 100644 images/udp_helloworld.png create mode 100644 images/udp_led2.png create mode 100644 images/udp_led_wireshark.png create mode 100644 images/udp_listen.png create mode 100644 images/udp_send1.png create mode 100644 images/udp_send_wireshark.png diff --git a/.main-meta/main.json b/.main-meta/main.json new file mode 100644 index 0000000..060a0bf --- /dev/null +++ b/.main-meta/main.json @@ -0,0 +1,67 @@ +{ + "metaDataVersion": "1.0.0", + "category": "com.microchip.ide.project", + "content": { + "metaDataVersion": "1.3.0", + "name": "com.microchip.mcu8.mplabx.project.avr-tcpip-lite-enc28j60-solution", + "version": "1.0.0", + "displayName": "ENC28J60 TCPIP Solutions with AVR", + "projectName": "avr-tcpip-lite-enc28j60-solution", + "shortDescription": "This MPLAB® X MCC example shows implementation of TCP/IP Lite Applications using Microchip ENC28J60 Ethernet Driver on an AVR Device", + "ide": { + "name": "MPLAB X", + "semverRange": "^6.10.0" + }, + "compiler": [ + { + "name": "XC8", + "semverRange": "^2.41.0" + } + ], + "dfp": { + "name": "AVR-Dx_DFP", + "semverRange": "^2.3.272" + }, + "configurator": { + "name": "MCC", + "semverRange": "^5.3.7" + }, + "device": { + "metaDataVersion": "1.0.0", + "category": "com.microchip.portal.contentRef", + "content": { + "metaDataVersion": "1.0.0", + "category": "com.microchip.device", + "name": "AVR64DD32", + "versionRange": "*" + } + }, + "author": "Microchip", + "peripherals": [ + "Interrupt", + "SPI", + "TCA" + ], + "keywords": [ + "MCC", + "MCC Melody", + "TCP/IP", + "Ethernet", + "Curiosity", + "Curiosity Nano", + "UDP", + "TCP" + ], + "additionalData": { + "longDescription": { + "metaDataVersion": "1.0.0", + "category": "com.microchip.portal.fileRef", + "content": { + "metaDataVersion": "1.0.0", + "fileName": "./README.md", + "mimeType": "text/markdown" + } + } + } + } +} \ No newline at end of file diff --git a/LICENSE.TXT b/LICENSE.TXT new file mode 100644 index 0000000..c8a4f5c --- /dev/null +++ b/LICENSE.TXT @@ -0,0 +1,14 @@ +© [2023] Microchip Technology Inc. and its subsidiaries + +Subject to your compliance with these terms, you may use Microchip software and any derivatives +exclusively with Microchip products. You are responsible for complying with 3rd party license terms +applicable to your use of 3rd party software (including open source software) that may accompany +Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR +STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- +INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT +WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR +CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED +TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE +POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY +LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT +EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. \ No newline at end of file diff --git a/Microchip TCPIP Demo GUI.jar b/Microchip TCPIP Demo GUI.jar new file mode 100644 index 0000000000000000000000000000000000000000..91507a233ae91a635010005b6ad678f48f7e1ae0 GIT binary patch literal 128460 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 --> + + + + + + Microchip Technologies Inc. + + + +# TCP/IP Lite Solutions for AVR® Using ENC28J60 + +## Introduction + +This repository provides MPLAB® X IDE projects that are suitable for the AVR Dx product family and contain solutions for User Datagram Protocol (UDP), as well as Transmission Control Protocol/Internet Protocol (TCP/IP) Client and Server demo applications. + +## Hardware Requirements + +1. [AVR64DD32 Curiosity Nano](https://www.microchip.com/en-us/development-tool/EV72Y42A) +2. [ETH Click](https://www.mikroe.com/eth-click) +3. [Curiosity Nano Base for Click Boards™](https://www.microchip.com/en-us/development-tool/AC164162) +4. RJ45 Network Connector Cable +5. USB 2.0 to Micro B Cable + +## Software Requirements + +1. [MPLAB X IDE v6.10 or later](https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide#tabs) +2. [MPLAB XC8 Compiler v2.41 or later](https://www.microchip.com/en-us/tools-resources/develop/mplab-xc-compilers/downloads-documentation#XC8) +3. [MPLAB Code Configurator (MCC) v5.3.7 or later](https://www.microchip.com/en-us/tools-resources/configure/mplab-code-configurator) +4. MCC Melody Core v5.5.7 or later +5. Ethernet Drivers Library v6.0.0 +6. TCP/IP Lite Library v5.0.0 +7. Microchip TCP/IP Demo GUI +8. [Wireshark Network Analyzer Tool](https://www.wireshark.org/) + +## Related Documentation + +1. [AVR64DD32 Data Sheet](https://www.microchip.com/en-us/product/AVR64DD32) +2. [ENC28J60](https://www.microchip.com/en-us/product/ENC28J60) +3. [Ethernet Drivers Library Release Notes](https://onlinedocs.microchip.com/oxy/GUID-F319A0CC-8179-4113-B2F3-AA69D1B2C216-en-US-4/GUID-8B345417-6295-49E6-ABEB-D2FA8A5D5561.html) +4. [TCP/IP Lite Library Release Notes](https://onlinedocs.microchip.com/oxy/GUID-AD30B8D1-D966-45C9-950F-6B266508AA41-en-US-4/index.html) + +## Hardware Setup + +1. Mount the AVR64DD32 Curiosity Nano board on the Curiosity Nano Base for Click boards and power it on using a USB 2.0 to Micro B Cable. +2. Mount the ETH Click board on the mikroBUS™ socket 1 of Curiosity Nano Base and connect to a network switch using a RJ45 network connector cable. +
AVR_setup + +## TCP/IP Client Solution + +1. Open MPLAB X IDE. +2. Select *File>Open Project>enc28j60-avr-tcpclient.X*. +3. Right click ```enc28j60-avr-tcpclient.X``` and select Set as Main Project. +
tcpclient_prosetup + +4. Open the Command Prompt/Terminal window, type ```ipconfig``` and press 'Enter' to get the system IP address. +
pcipaddress + +5. Modify the server IP address with your system IP address in the ```tcp_client_demo.c``` file under the ```TCP_Client_Initialize()``` function. Make a note of the ```remoteSocket.port``` set in the code. +``` +void TCP_Client_Initialize(){ + + // Initialize the server IP address with your system IP address + remoteSocket.addr.s_addr = MAKE_IPV4_ADDRESS(10, 14, 5, 127); + remoteSocket.port = 65534; +} +``` +6. Click **Clean and Build Main Project** and make sure the project builds successfully. +7. Click **Make and Program Device Main Project** and check that the programming is complete. +8. Open Wireshark Network Analyser Tool with Administrator Privileges. From the Capture menu, select an interface to which the board and PC are connected. Click **Start capturing packets**. +
Wireshark_homepage + +9. Add the following filters: ```dhcp||icmp||tcp.port==65534```. +
tcpclient_filter + +10. Open Microchip TCP/IP Demo GUI. Go to the **TCP Server Demo** tab and assign the port number as **65534** (noted in Step 5), then click the **Listen** button. The status of the TCP connection is printed in the STATUS text box. +
tclient_listen tclient_connected + +11. After the connection is established: +* Type your text in the Send text box (e.g., 'Hello CNano') and click the **Send** button. The text sent is displayed in the Sent/Received Data box. +
tcpclient_send1 tcpclient_send2 + +* Switch back to Wireshark and observe the packets with your system IP address as the source +
send_wireshark + +* Click the **Led 0** button in the **TCP Server Demo** tab to toggle the LED0 on the Curiosity Nano board +
tcpclient_led0 + +* Switch back to Wireshark and observe the packets with your system IP address as the source +
ledon_wireshark + +12. Click the **Disconnect** button to close the TCP connection. A "Client disconnected" message will appear in the STATUS text box. +
tcpclient_disconnect + +## TCP/IP Server Solution +1. Open MPLAB X IDE. +2. Select *File>Open Project>enc28j60-avr-tcpserver.X*. +3. Right click ```enc28j60-avr-tcpserver.X``` and select Set as Main Project. +
tcpserver_prosetup + +4. Open Wireshark Network Analyser Tool with Administrator Privileges. From the Capture menu, select an interface to which the board and PC are connected. Click **Start capturing packets**. +
Wireshark_homepage + +5. Add the following filters: ```dhcp||icmp||tcp.port==7```. +
tcpserver_wfilter + + +6. Click **Clean and Build Main Project** and make sure the project builds successfully. +7. Click **Make and Program Device Main Project** and check that the programming is complete. +8. Switch to Wireshark Network Analyser Tool and wait to receive the Dynamic Host Configuration Protocol (DHCP) handshake packets. Click DHCP ACK and expand the 'Dynamic Host Configuration Protocol' field to reveal the details. Make a note of the IP address in 'Your (client) IP address'. +
tcpserver_ipaddress + +9. Open Microchip TCP/IP Demo GUI. Go to the **TCP Client Demo** tab and assign the port number as **7** and server IP address as **10.14.5.95** (noted in Step 8). Click the **Connect** button. The status of the TCP connection is printed in the STATUS text box. +
tcpserver_connect tcpserver_connect + +10. After the connection is established: +* Type your text in the Send text box (e.g., 'Hello CNano') and click the **Send** button. The text sent is displayed in the Sent/Received Data box. +
tcpserver_send1 tcpserver_send2 + +* Switch back to Wireshark and observe the packets with your server IP address as the source to check the response +
tcpserver_send_wiresrk + +11. Click the **Disconnect** button to close the TCP connection. A "Connection Closed" message will appear in the STATUS text box. +
tcpserver_con_closed + + +## TCP/IP UDP Solution +1. Open MPLAB X IDE. +2. Select *File>Open Project>enc28j60-avr-udp.X*. +3. Right click ```enc28j60-avr-udp.X``` and select Set as Main Project. +
avr_udp_setup + +4. Open the Command Prompt/Terminal window, type ```ipconfig``` and press 'Enter' to get the system IP address. +
pcipaddress + +5. Modify the server IP address with your system IP address in the ```udp_demo.c``` file under the ```UDP_Demo_Initialize()``` function. +``` +void UDP_Demo_Initialize(void) +{ + //Initialize the Destination IP address with your PC's IP address and Destination Port + + /* UDP Packet Initializations*/ + udpPacket.destinationAddress = MAKE_IPV4_ADDRESS(10,14,5,127); + udpPacket.destinationPortNumber = 65531; + + udpPacket.sourcePortNumber = 65533; +} +``` +6. Make a note of the ```udpPacket.destinationPortNumber``` you set in the code (anything in the range of dynamic ports). +7. Open Wireshark Network Analyser Tool with Administrator Privileges. From the Capture menu, select an interface to which the board and PC are connected. Click **Start capturing packets**. +
Wireshark_homepage + +8. Add the following filters: ```dhcp||icmp||udp.port==65531```. +
udp_filter + +9. Click **Clean and Build Main Project** and make sure the project builds successfully. +10. Click **Make and Program Device Main Project** and check that the programming is complete. +11. Switch to Wireshark Network Analyser Tool and wait to receive the Dynamic Host Configuration Protocol (DHCP) handshake packets. Click DHCP ACK and expand 'Dynamic Host Configuration Protocol' field to reveal the details. Make a note of the IP address in 'Your (client) IP address'. +
udp_handshake + +12. Open Microchip TCP/IP Demo GUI: +* Go to the **UDP** tab and assign the port number as **65531** (noted in Step 5). Click the **Listen** button (Click 'Allow Access' if a warning occurs). +
udp_listen + +* Assign server IP address as **10.14.5.128** (noted in Step 11). Click the **Claim** button. +
udp_claim + +* Click **1** under the LED section to toggle LED0 on the Curiosity Nano board and observe the Wireshark capture +
udp_led2 +
udp_led_wireshark + + +* Type your text in the Send Data box (e.g., 'Hello CNano') and click the **Send** button. Observe the packet in the Wireshark capture. +
udp_send1 +
udp_send_wireshark + +13. Press the SW0 switch on the Curiosity Nano board. Observe the packet which says 'Hello World' in the Wireshark capture. +
udp_helloworld \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/ENC28J60-avr-tcpclient.mc3 b/enc28j60-avr-tcpclient.X/ENC28J60-avr-tcpclient.mc3 new file mode 100644 index 0000000..6122e22 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/ENC28J60-avr-tcpclient.mc3 @@ -0,0 +1,385 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Application Builder + class com.microchip.mcc.melody.module.FrameworkModule + + + CLKCTRL + class com.microchip.mcc.melody.hw.module.HardwareModule + + + CPUINT + class com.microchip.mcc.melody.hw.module.HardwareModule + + + Configuration Bits + class com.microchip.mcc.melody.hw.module.HardwareModule + + + MAIN MANAGER + class com.microchip.mcc.melody.hw.module.HardwareModule + + + Pin Manager + class com.microchip.mcc.melody.hw.module.HardwareModule + + + SPI0 + class com.microchip.mcc.melody.hw.module.HardwareModule + + + TCA0 + class com.microchip.mcc.melody.hw.module.HardwareModule + + + meta + class com.microchip.mcc.melody.hw.module.HardwareModule + + + module0 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module1 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module10 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module12 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module2 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module3 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module4 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module46 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module5 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module6 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module7 + class com.microchip.mcc.melody.script.module.ScriptModule + + + + + + + + + {"mccDevice":{"loc":"642.5 396","pos":"642.5 396"},"systemGroup":{"loc":"0 0","pos":"0 0"},"module7":{"loc":"642 264","pos":"642 264"},"module6":{"loc":"430 264","pos":"430 264"},"module18":{"loc":"79 302","pos":"79 302"},"module10":{"loc":"324 132","pos":"324 132"},"module46":{"loc":"430 0","pos":"430 0"},"module12":{"loc":"536 132","pos":"536 132"}} + + + + {"userAddedModules":["module5","module4","module7","module6","module1","module0","module3","module2","module10","module46","module12"],"version":"CURRENT","modules":{"module5":{"scriptId":"@mchp-mcc/scf-avr8-clkctrl-v3","imports":{"pin_standard":{"interfaceId":{"name":"pin-standard","version":"^0"},"handle":{"providerId":"module3","exportId":"pin-standard"}},"scf_avr8_clkctrl_v3":{"interfaceId":{"name":"scf-avr8-clkctrl-v3","version":"^1.0.0"},"handle":{"providerId":"mccDevice","exportId":"CLKCTRL"}},"interrupt_standard":{"interfaceId":{"name":"interrupt-standard","version":"^1"},"handle":{"providerId":"module4","exportId":"interrupt"}},"device_meta":{"interfaceId":{"name":"device-meta","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"config_device":{"interfaceId":{"name":"config-device","version":"^1"},"handle":{"providerId":"module1","exportId":"config_device"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0"},"handle":{"providerId":"module1","exportId":"initializer_system"}},"config_request":{"interfaceId":{"name":"config-request","version":"^2"},"handle":{"providerId":"module1","exportId":"config_request"}}},"framewSpecificState":{"userEditedImports":[]}},"module10":{"scriptId":"@mchp-mcc/scf-avr8-tca-v1","imports":{"osc_clock":{"interfaceId":{"name":"osc-clocks","version":"^0"},"handle":{"providerId":"module5","exportId":"osc_clocks"}},"pin_standard":{"interfaceId":{"name":"pin-standard","version":"^0"},"handle":{"providerId":"module3","exportId":"pin-standard"}},"scf_avr8_tca_v1":{"interfaceId":{"name":"scf-avr8-tca-v1","version":"^1"},"handle":{"providerId":"mccDevice","exportId":"TCA0"}},"interrupt_standard":{"interfaceId":{"name":"interrupt-standard","version":"^1"},"handle":{"providerId":"module4","exportId":"interrupt"}},"device_meta":{"interfaceId":{"name":"device-meta","version":"^1"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0"},"handle":{"providerId":"module1","exportId":"initializer_system"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"main":{"interrupt":{"ovfi":true},"hardware":{"clkselTcaSingleCtrla":"System Clock / 64","requestedTimeNorm":1.0}}}},"module4":{"scriptId":"@mchp-mcc/scf-avr8-interrupt-v1","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"scf_avr8_interrupt_v1":{"interfaceId":{"name":"scf-avr8-interrupt-v1","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"CPUINT"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0"},"handle":{"providerId":"module1","exportId":"initializer_system"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"main":{"interrupt":{"iSreg":true}}}},"module7":{"scriptId":"@mchp-mcc/scf-avr8-spi-v1","imports":{"pin_standard":{"interfaceId":{"name":"pin-standard","version":"^0"},"handle":{"providerId":"module3","exportId":"pin-standard"}},"scf_avr8_spi_v1":{"interfaceId":{"name":"scf-avr8-spi-v1","version":"^1"},"handle":{"providerId":"mccDevice","exportId":"SPI0"}},"interrupt_standard":{"interfaceId":{"name":"interrupt-standard","version":"^1"},"handle":{"providerId":"module4","exportId":"interrupt"}},"device_meta":{"interfaceId":{"name":"device-meta","version":"^1"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"osc_clocks":{"interfaceId":{"name":"osc-clocks","version":"^0"},"handle":{"providerId":"module5","exportId":"osc_clocks"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0"},"handle":{"providerId":"module1","exportId":"initializer_system"}}},"framewSpecificState":{"userEditedImports":[]}},"module6":{"scriptId":"@mchp-mcc/delay-blocking-driver","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"^1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"osc_clocks":{"interfaceId":{"name":"osc-clocks","version":"^0"},"handle":{"providerId":"module5","exportId":"osc_clocks"}},"config_info":{"interfaceId":{"name":"config-info","version":"^0"},"handle":{"providerId":"module1","exportId":"config_info"}}},"framewSpecificState":{"userEditedImports":[]}},"module46":{"scriptId":"@mchp-mcc/tcpip-lite","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"^1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"interrupt_standard":{"interfaceId":{"name":"interrupt-standard","version":"^1.0.0"},"handle":{"providerId":"module4","exportId":"interrupt"}},"initializer_main":{"interfaceId":{"name":"initializer-main","version":"^0|1"},"handle":{"providerId":"module0","exportId":"initializer_main"}},"timer_timeout":{"interfaceId":{"name":"timer-timeout","version":"^0.1.2"},"handle":{"providerId":"module10","exportId":"timer_timeout","label":"TCA0"}},"ethernet_driver":{"interfaceId":{"name":"ethernet-drivers-8bit-interface","version":"^1.0.0"},"handle":{"providerId":"module12","exportId":"ethernet_driver"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"main":{"Protocol":{"TCP":true}}}},"module12":{"scriptId":"@mchp-mcc/ethernet-drivers-8bit","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"^1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"pin_standard":{"interfaceId":{"name":"pin-standard","version":"^0.1.0"},"handle":{"providerId":"module3","exportId":"pin-standard"}},"delay_blocking":{"interfaceId":{"name":"delay-blocking","version":"^0|1"},"handle":{"providerId":"module6","exportId":"delay_blocking"}},"spi_master_basic":{"interfaceId":{"name":"spi-master-basic","version":"^0.5.0"},"handle":{"providerId":"module7","exportId":"spi_master_basic"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"main":{"software":{"ethChipSelectPin":{"PA7":{"cname":"ETH_CS","ioc":"INTDIS_BUFFEN"}}}}}},"module1":{"scriptId":"@mchp-mcc/avr8-configuration-bits-v1","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"initializer_main":{"interfaceId":{"name":"initializer-main","version":"^0.3.0"},"handle":{"providerId":"module0","exportId":"initializer_main"}},"avr8_configuration_bits_v1":{"interfaceId":{"name":"avr8-configuration-bits-v1","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"Configuration Bits"}}},"framewSpecificState":{"userEditedImports":[]}},"module0":{"scriptId":"@mchp-mcc/main-manager","imports":{"main":{"interfaceId":{"name":"main-manager","version":"^1.*"},"handle":{"providerId":"mccDevice","exportId":"MAIN MANAGER"}}},"framewSpecificState":{"userEditedImports":[]}},"module3":{"scriptId":"@mchp-mcc/pin-content-processor","imports":{"device-meta":{"interfaceId":{"name":"device-meta","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"pin-architecture":{"interfaceId":{"name":"pin-architecture","version":"1.0.0"},"handle":{"providerId":"module2","exportId":"pin-architecture"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"saved":{"rows":{"module12":{"GPIO$ETH_CS$output":{"pins":{"PA0":{"state":"MUL"},"PA1":{"state":"MUL"},"PA2":{"state":"MUL"},"PA3":{"state":"MUL"},"PA4":{"state":"MUL"},"PA5":{"state":"MUL"},"PA6":{"state":"MUL"},"PA7":{"state":"L"},"PC0":{"state":"MUL"},"PC1":{"state":"MUL"},"PC2":{"state":"MUL"},"PC3":{"state":"MUL"},"PD1":{"state":"MUL"},"PD2":{"state":"MUL"},"PD3":{"state":"MUL"},"PD4":{"state":"MUL"},"PD5":{"state":"MUL"},"PD6":{"state":"MUL"},"PD7":{"state":"MUL"},"PF0":{"state":"MUL"},"PF1":{"state":"MUL"},"PF2":{"state":"MUL"},"PF3":{"state":"MUL"},"PF4":{"state":"MUL"},"PF5":{"state":"MUL"},"PF6":{"state":"MUL"},"PF7":{"state":"MUL"}}}},"pcp":{"GPIO$GPIO$input":{"pins":{"PF5":{"state":"MUL"},"PF6":{"state":"L"}}},"GPIO$GPIO$output":{"pins":{"PF5":{"state":"L"},"PF6":{"state":"MUL"}}}}},"userEditedData":{"cname":{"eview":{"PF6":"SW0","PF5":"LED0"}},"inv":{"eview":{"PF5":true}},"high":{"eview":{"PF5":false}},"wpu":{"eview":{"PF6":true}}}}}},"module2":{"scriptId":"@mchp-mcc/avr8-pin-manager","imports":{"avr8-pin-manager":{"interfaceId":{"name":"avr8-pin-manager","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"Pin Manager"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0.*"},"handle":{"providerId":"module1","exportId":"initializer_system"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"adapterdata":{"cname":{"eview":{"dataMap":{"PF6":{"value":"SW0"},"PF5":{"value":"LED0"}}}},"inv":{"eview":{"dataMap":{"PF5":{"value":true}}}},"high":{"eview":{"dataMap":{"PF5":{"value":false}}}},"wpu":{"eview":{"dataMap":{"PF6":{"value":true}}}}}}}},"content":{"@mchp-mcc/avr-8bit":"4.7.0","@mchp-mcc/ethernet-drivers-8bit":"6.0.0","@mchp-mcc/tcpip-lite":"5.0.0","@mchp-mcc/pin-content-processor":"3.6.0","@mchp-mcc/delay-blocking-driver":"3.1.0","@mchp-mcc/scf-avr8-tca-v1":"6.0.9","@mchp-mcc/avr8-pin-manager":"4.5.1","@mchp-mcc/scf-avr8-spi-v1":"4.1.12","@mchp-mcc/scf-avr8-interrupt-v1":"5.0.12","@mchp-mcc/scf-avr8-clkctrl-v3":"2.0.8","@mchp-mcc/main-manager":"3.1.1","@mchp-mcc/avr8-configuration-bits-v1":"4.2.12"}} + + + + + mcc_generated_files\tcpiplite\src\log.c + 96afab78b0d74a8b87853f7b77d9cd2cef84c7a5019bee734f5aae12772bd6f0 + + + mcc_generated_files\tcpiplite\ipv4.h + b188c4e5a6df0b88cd186cfca1cc9a218ec4570b5529fa1408c98d8536c44582 + + + mcc_generated_files\tcpiplite\arpv4.h + fa77137ca7ed34e390e5a6cefc4826b943590f9ab8959db034dab68c9e3488f6 + + + mcc_generated_files\system\interrupt.h + 75695d9cc1e45b240332ce98cce195022df36e1a15d4891d26cff6e390f2b765 + + + mcc_generated_files\system\port.h + 263a68fee4685f2eca9986a962d5dd14141bebcd043238117c0ca24e2a54a95f + + + mcc_generated_files\tcpiplite\src\log_console.c + 393e0f69dcd52d8036878f16daadc1227c552d11f513c4af0c3ce054ff14ff30 + + + mcc_generated_files\system\utils\interrupt_avr8.h + bf66a9d1b57d17151c1aa3b9e207a694bbf854df962b69135c6d922d026ce7cf + + + mcc_generated_files\tcpiplite\tcpv4.h + 6e926c76e2393edebc8f032a751a5beae33d9d3ac6848c72c99ff3bfb6d86709 + + + mcc_generated_files\system\pins.h + 3025369cb8d94a5f203b0434dc8af07c553ebec6c4f499742e47a01390f03ea2 + + + mcc_generated_files\tcpiplite\rtcc.h + 96d00ec507619feb1532a7ae5996a8b276fb2548bb303a128c4bba69584bb7c7 + + + mcc_generated_files\timer\delay.h + 303ca2f795e184d0ffd854bb6cf49b573a35abc6f3b9aa7aa6f0853030cd870f + + + mcc_generated_files\system\src\clock.c + f712f03827d2efc2db11606d25e481a193f4f16f46605dffc0ef6eea255ffe31 + + + mcc_generated_files\tcpiplite\src\rtcc.c + 1560fee9d73302780e3bc2036463c66bd99e63d2d858f27387aa87600a9b9b31 + + + mcc_generated_files\system\clock.h + b25dc6cca3f5aac576eb1aea49186ae14ec9ffcaf93743d3c419cb54468d7e29 + + + mcc_generated_files\tcpiplite\src\lfsr.c + 02cb5b4e1a1d25983a158043ee959b56d3eff7d019c630441552ec0580c419e9 + + + mcc_generated_files\tcpiplite\src\dhcp_client.c + 13b73f4241221ce7dfa7da94efdaddd9a6610810f8f2b42d9f247ed58889766a + + + mcc_generated_files\spi\src\spi0.c + e59786c52053f3c99c09b42f4268500f88f591539fc53f5d424769f2eda9d9cb + + + mcc_generated_files\tcpiplite\lfsr.h + c88f319589ea6436628484deaf783d8545163d8722978f4a69ee2ed736c133d0 + + + mcc_generated_files\tcpiplite\src\log_syslog.c + dcc430d972935543dfe2db5f164ae35385f424d7fac1617983d42cc137c86d31 + + + mcc_generated_files\system\system.h + d1ddba55a9d5c82c00699fd9d53c3c804b9dd7fa10e298d3a7b755909cdc7baa + + + mcc_generated_files\ethernet\physical_layer_interface.h + 820d28b247eca06e574bdee8161c9f99b6106f08bea7b04688f28a66a741eadc + + + mcc_generated_files\system\utils\assembler\gas.h + 05129f00ef45a989573a0427f37de7661fa3005f22778ad24c0dca228468a018 + + + mcc_generated_files\tcpiplite\network.h + 2fd62276a42b90881ca66280994cbb49bba44ede6814fc021e876462461176e4 + + + mcc_generated_files\tcpiplite\dhcp_client.h + 973946873aca05dfe028b5be0d0241f53467aa599c1d6519ccbfdcc0a947e4fc + + + mcc_generated_files\timer\src\tca0.c + 3f0dbb8101d11a7241b490b12fcdb1ffacb286f22267ef8e05d27e0c7e36fd2b + + + mcc_generated_files\tcpiplite\tcpip_types.h + 0864c0fa1d85547d7a7283078c4825294076ae23cb08686c3cbd9255b96146ae + + + mcc_generated_files\system\src\protected_io.S + 3bb77a623e934d19f38ed22bfd302ac90e929cb841406c027d11193bd5358b36 + + + mcc_generated_files\system\src\config_bits.c + 73ad17f1190da35640dea29ef78dd1ea7e4fed708c2a39eba32cc9024dec889e + + + mcc_generated_files\ethernet\enc28j60.h + 5329ea5e6fef75c9015adb5cc1a6b27fba7a00f5cfa860197c4d38e760484e8e + + + mcc_generated_files\tcpiplite\log_syslog.h + ce12b5f087cdc601844c08419f74ae5e0ebf37498abe9faf77483941f4ef2749 + + + mcc_generated_files\tcpiplite\src\udpv4_port_handler_table.c + df59969d33e31ac5cd1b1476c69015c97cf12d6102f64f4973efde4c302ddcd3 + + + mcc_generated_files\system\src\system.c + aceff89e6f354a1a6ad81a72cd709255cf7d726acb2cd003ee4c48670e63d7a0 + + + mcc_generated_files\system\utils\compiler.h + 78fc7aaa9215a68e38da793ec09d384598330944557b49c79aef4af747e76e08 + + + mcc_generated_files\timer\timer_interface.h + c663a68f1004f660bf34cd96cf61a9012847f97b9cff5098686010e234deb62a + + + mcc_generated_files\system\utils\utils_assert.h + e6a57e1164f862da6a703fa67c200945b7a21fb6ab9e9b57ff14507467e04cc6 + + + mcc_generated_files\system\utils\assembler\iar.h + baafb63c988a088a34457e1d6433e87a0b658d1486fce12eec427b9457991549 + + + mcc_generated_files\tcpiplite\udpv4.h + bda9bc53ffa8e3747d8438ce9b7365aba133e26a6750e6de7cddbda49b6daa42 + + + mcc_generated_files\system\src\pins.c + 12d11e12da468cba76db0c27afc1b0d39c9d0a8429da0e9bdb3f9f3d20aa3162 + + + mcc_generated_files\timer\tca0.h + 5aac000bbb51c8915bdd2fefdd2604375562c69acef5023955296a387357647e + + + mcc_generated_files\spi\spi_interface.h + cd755e06457e2bb365bd4f949fdf7e49f12f9a89a3316457f3ff05083b538ffe + + + mcc_generated_files\system\utils\atomic.h + 2a0975cf197fcfdec0a503a3e3b899336a83d123a3066d0e8c2b3fc5dbc3d6ac + + + mcc_generated_files\tcpiplite\src\ip_database.c + 6ad2b505dd44e030363ee7ee3464546fa29c3401366367f5e4d08232a23c4987 + + + mcc_generated_files\tcpiplite\log_console.h + 8ce7fa1f69dc36a6169cdac93cf109796e88198b8174a8bf5b380a32f6a25424 + + + mcc_generated_files\system\ccp.h + 771ef1ef56b145740365ded07000a4e9820fc4e2c7025b40ab80bf13288ee5e3 + + + mcc_generated_files\tcpiplite\src\tcpv4.c + 9b42a281d748202be8d4556a4df80e2d0922f784e0c7c837db4c32031b5c9320 + + + mcc_generated_files\ethernet\src\enc28j60.c + 68a1043acf0ba5fded10401fd33a0d5708d1847b7423093533e417ff53d1c6c1 + + + main.c + 266575cfbd620190ac1e41d48753323c806eb90f55a657805edc677165d4af22 + + + mcc_generated_files\tcpiplite\src\udpv4.c + 9b5d18f9cbf2b37620a1681a647c0f8c70834c2065a000aa2a91f835f702f421 + + + mcc_generated_files\tcpiplite\src\ipv4.c + 2c3fd96f86690cb7769cb6d759c0efdccc8c4dcb2898e1ea5f48115080358274 + + + mcc_generated_files\tcpiplite\src\network.c + 869ee3d7ca7460ff14af576833422dab1c313f8aeac3dcdfbd3a913fc447416e + + + mcc_generated_files\timer\src\delay.c + 982e6c0e726105e62588380d30d9e99cafcf2dd975eb0765561b68c4e6762a47 + + + mcc_generated_files\system\src\interrupt.c + 50dedff282518aad79d64bef461deb27ced81abc4b4033fd891ff29cc9bb5d54 + + + mcc_generated_files\tcpiplite\ip_database.h + 34e10322035cefd6b86319f28ecd6ad66e6709bf62dd8b12815e25e70b51ed7c + + + mcc_generated_files\tcpiplite\tcpip_config.h + 63612e28526229feaede1bd718e95d72f31aea8c59af98f5897d2618be4694f6 + + + mcc_generated_files\tcpiplite\udpv4_port_handler_table.h + 75bc247341d5c91f6312d03bad0ccd56ba138fa5968b85bdeac5bdcb3edc7000 + + + mcc_generated_files\system\utils\utils.h + d02918b46fc138c440e381cb9a557c9f69c1cc3eb141f007b0a3738f02f4d543 + + + mcc_generated_files\system\config_bits.h + fa24220622dc1f4ebda67e226cb7480d29e7dcb70ba069c8a618c7d1cc67a0ef + + + mcc_generated_files\system\utils\assembler.h + a51d2178d0c940ae2d1b51eff122d0d63e53efe29edb2fb8c7fbd78b1c2fcabe + + + mcc_generated_files\spi\spi0.h + 300c4b7c8fef8f7550445173c30260c521c8c1a6245bc5bf3cd4fbfcc7f3d702 + + + mcc_generated_files\tcpiplite\log.h + 7243fada51a57f83f9f850fb0b4ac06ffa77e3728f93f2ebfa1fc20f00d0fa13 + + + mcc_generated_files\system\protected_io.h + 2197a3749e9525a893011ccc9095321665641b68aeda5ebbea9d2711ab3f9aa7 + + + mcc_generated_files\tcpiplite\src\arpv4.c + 5ec5b193796645fb43fd3a681cb1238c43ca4d9863ff1054b488c45848384bbe + + + \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/Makefile b/enc28j60-avr-tcpclient.X/Makefile new file mode 100644 index 0000000..fca8e2c --- /dev/null +++ b/enc28j60-avr-tcpclient.X/Makefile @@ -0,0 +1,113 @@ +# +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: +# +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target +# +# Targets beginning with '.' are not intended to be called on their own. +# +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. +# +# Available make variables: +# +# CND_BASEDIR base directory for relative paths +# CND_DISTDIR default top distribution directory (build artifacts) +# CND_BUILDDIR default top build directory (object files, ...) +# CONF name of current configuration +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) +# CND_PACKAGE_NAME_${CONF} name of package (current configuration) +# CND_PACKAGE_PATH_${CONF} path to package (current configuration) +# +# NOCDDL + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib + + +# build +build: .build-post + +.build-pre: +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... + + +# clean +clean: .clean-post + +.clean-pre: +# Add your pre 'clean' code here... +# WARNING: the IDE does not call this target since it takes a long time to +# simply run make. Instead, the IDE removes the configuration directories +# under build and dist directly without calling make. +# This target is left here so people can do a clean when running a clean +# outside the IDE. + +.clean-post: .clean-impl +# Add your post 'clean' code here... + + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk + +# include project make variables +include nbproject/Makefile-variables.mk diff --git a/enc28j60-avr-tcpclient.X/app_files/src/tcp_client_demo.c b/enc28j60-avr-tcpclient.X/app_files/src/tcp_client_demo.c new file mode 100644 index 0000000..8ca18e9 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/app_files/src/tcp_client_demo.c @@ -0,0 +1,151 @@ +/** + * TCP Client Demo Application Source File + * + * @file tcp_client_demo.c + * + * @ingroup tcpclientdemo + * + * @brief TCP client demonstration implementation. + * + * @version TCP Client Demo Application Version 5.0.0 + */ + +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included files +#include +#include +#include +#include "../../mcc_generated_files/system/system.h" +#include "../../mcc_generated_files/tcpiplite/tcpv4.h" +#include "../../mcc_generated_files/tcpiplite/ipv4.h" +#include "../../mcc_generated_files/tcpiplite/tcpip_config.h" +#include "../../mcc_generated_files/tcpiplite/tcpip_types.h" +#include "../tcp_client_demo.h" + +sockaddr_in4_t remoteSocket; + +// Functions +void TCP_Client_Initialize() +{ + // Initialize the server IP address with your PC's IP address + remoteSocket.addr.s_addr = MAKE_IPV4_ADDRESS(10,14,5,127); + remoteSocket.port = 65534; +} + +void TCP_Demo_Client(void) +{ + // Socket for the TCP Client + static tcpTCB_t portXyzTCB; + + // Create the TX and RX Client's buffers + static uint8_t rxdataPort65534[50]; + static uint8_t txdataPort65534[80]; + static time_t t_client; + static time_t socketTimeout; + uint16_t rx_len; + socketState_t socketState; + rx_len = 0; + + socketState = TCP_SocketPoll(&portXyzTCB); + + time(&t_client); + + switch (socketState) + { + case NOT_A_SOCKET: + // Inserting and Initializing the socket + TCP_SocketInit(&portXyzTCB); + + break; + case SOCKET_CLOSED: + // Trying to connect again if the socket is closed + socketTimeout = t_client + 2; // Trying to connect once at 2 seconds + TCP_InsertRxBuffer(&portXyzTCB, rxdataPort65534, sizeof(rxdataPort65534)); + + // Connect to the Server + TCP_Connect(&portXyzTCB, &remoteSocket); + + break; + case SOCKET_IN_PROGRESS: + // Trying to connect again if the socket is closed + if (t_client >= socketTimeout) + { + TCP_Close(&portXyzTCB); + } + break; + case SOCKET_CONNECTED: + // Implement an echo client over TCP + // Check if the previous buffer was sent + if (TCP_SendDone(&portXyzTCB)) + { + rx_len = (uint16_t)TCP_GetReceivedData(&portXyzTCB); + // Handle the incoming data + if (rx_len > 0) + { + // Check for "led x on/off" command + if (rx_len > 16) + { + rxdataPort65534[16] = 0; + } + else + { + rxdataPort65534[rx_len] = 0; + } + + if (rxdataPort65534[0] == 'l' && rxdataPort65534[1] == 'e' && rxdataPort65534[2] == 'd') + { + if (rxdataPort65534[6] == 'o' && rxdataPort65534[7] == 'n') + { + if (rxdataPort65534[4] == '0') + { + LED0_SetHigh(); + } + } + else + { + if (rxdataPort65534[6] == 'o' && rxdataPort65534[7] == 'f' && rxdataPort65534[8] == 'f') + { + if (rxdataPort65534[4] == '0') + { + LED0_SetLow(); + } + } + } + } + // Reuse the RX buffer + TCP_InsertRxBuffer(&portXyzTCB, rxdataPort65534, sizeof(rxdataPort65534)); + } + + if (t_client >= socketTimeout) + { + // Send board status message only once at 2 seconds + socketTimeout = t_client + 2; + sprintf(txdataPort65534, "LED0 state: %d\n", LED0_GetValue()); + // Send data back to the source + TCP_Send(&portXyzTCB, txdataPort65534, strlen(txdataPort65534)); + } + } + break; + case SOCKET_CLOSING: + TCP_SocketRemove(&portXyzTCB); + break; + default: + break; + } +} \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/app_files/tcp_client_demo.h b/enc28j60-avr-tcpclient.X/app_files/tcp_client_demo.h new file mode 100644 index 0000000..0cbed16 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/app_files/tcp_client_demo.h @@ -0,0 +1,49 @@ +/** + * TCP Client Demo Application Header File + * + * @file tcp_client_demo.h + * + * @ingroup tcpclientdemo TCPCLIENTDEMO + * + * @brief Transmission Control Protocol (TCP) Client demonstration implementation. + * + * @version TCP Client Demo Application Version 5.0.0 + */ + +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef TCP_CLIENT_DEMO_H +#define TCP_CLIENT_DEMO_H + +/** + * @ingroup tcpclientdemo + * @brief Implements the TCP Client Demo procedures. + * @param None. + * @return None. + */ +void TCP_Demo_Client(void); + +/** + * @ingroup tcpclientdemo + * @brief Initilaizes the port and addresses for the TCP Client. + * @param None. + * @return None. + */ +void TCP_Client_Initialize(void); + +#endif \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/main.c b/enc28j60-avr-tcpclient.X/main.c new file mode 100644 index 0000000..e60bb05 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/main.c @@ -0,0 +1,62 @@ + /* + * MAIN Generated Driver File + * + * @file main.c + * + * @defgroup main MAIN + * + * @brief This is the generated driver implementation file for the MAIN driver. + * + * @version MAIN Driver Version 1.0.0 +*/ + +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#include "mcc_generated_files/system/system.h" +#include "mcc_generated_files/tcpiplite/network.h" +#include "mcc_generated_files/tcpiplite/ip_database.h" +#include "app_files/tcp_client_demo.h" + +/* + Main application +*/ + +int main(void) +{ + SYSTEM_Initialize(); + // Add this to while(1): Network_Manage(); + + unsigned long ip; + + Network_Init(); + + TCP_Client_Initialize(); + + TCA0_Start(); + + while(1) + { + Network_Manage(); + ip = ipdb_getAddress(); + + if(ip) + { + TCP_Demo_Client(); + } + } +} \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/docs/delay.dox b/enc28j60-avr-tcpclient.X/mcc_generated_files/docs/delay.dox new file mode 100644 index 0000000..3ee8dc0 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/docs/delay.dox @@ -0,0 +1,16 @@ +/** +@addtogroup delay + +@section delay_basics Delay drivers for PIC and AVR + +The MPLAB XC8 and XC16 compilers have built-in delay functions or macros for when users need to tell the MCU to wait for a certain amount of time. +For these delay functions, time is measured in microseconds or milliseconds, and for PIC32 devices, in timer ticks as well. Format for invoking the macros +will vary from device to device but this delay driver can help abstract these format differences. + +@section delay_uses How to use the delay drivers + +To use the delay drivers, just include the delay.h file wherever you intend to use the delay function and call the DELAY_milliseconds(time) or DELAY_microseconds(time) function where +time is the number of milliseconds or microseconds to delay. + +*/ + diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/ethernet/enc28j60.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/ethernet/enc28j60.h new file mode 100644 index 0000000..cd809ff --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/ethernet/enc28j60.h @@ -0,0 +1,324 @@ +/** + * ENC28J60 Ethernet Driver Header File + * + * @file enc28j60.h + * + * @defgroup enc28j60 ENC28J60 + * + * @brief This header file provides the API for the ENC28J60 Ethernet Driver. + * + * @version ENC28J60 Ethernet Driver Version 6.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef ENC28J60_H +#define ENC28J60_H + +// Macros + +#define SFR_BANK0 0x00 +#define SFR_BANK1 0x40 +#define SFR_BANK2 0x80 +#define SFR_BANK3 0xC0 +#define SFR_COMMON 0xE0 +#define BANK_MASK 0xE0 +#define SFR_MASK 0x1F + +#define byteSwap16(a) ((((uint16_t)a & (uint16_t)0xFF00) >> 8) | (((uint16_t)a & (uint16_t)0x00FF) << 8)) +#define byteReverse32(a) ((((uint32_t)a & (uint32_t)0xff000000) >> 24) | \ + (((uint32_t)a & (uint32_t)0x00ff0000) >> 8) | \ + (((uint32_t)a & (uint32_t)0x0000ff00) << 8) | \ + (((uint32_t)a & (uint32_t)0x000000ff) << 24)) + +#define byteReverse24(a) (((((uint32_t)a & (uint32_t)0x00FF00) >> 8) | (((uint32_t)a & (uint32_t)0x0000FF) << 8)) << 8 | (uint32_t)a >> 0x10) + +// Host to Network & Network to Host Macros +#ifndef htons +#define htons(a) byteSwap16(a) +#endif +#ifndef ntohs +#define ntohs(a) byteSwap16(a) +#endif +#ifndef htonl +#define htonl(a) byteReverse32(a) +#endif +#ifndef ntohl +#define ntohl(a) byteReverse32(a) +#endif + +#define convert_hton24(a) byteReverse24(a) + +// Enums + +/** + * @ingroup enc28j60 + * @enum spi_inst_t + * @brief SPI instructions. + */ +typedef enum +{ + rcr_inst = 0x00, /** +#include + +// Macros +#ifndef __XC8 +#define NOP() __asm__ __volatile__("nop") +#endif +#define ETH_packetReady() ethData.pktReady +#define ETH_linkCheck() ethData.up +#define ETH_linkChanged() ethData.linkChange + +// Structs/Enums/Unions + +/** + * @ingroup ethdriver8bit + * @enum ethernetDriver_t + * @brief Ethernet Driver status. + */ +typedef struct +{ + unsigned error : 1; + unsigned pktReady : 1; + unsigned up : 1; + unsigned idle : 1; + unsigned linkChange : 1; + unsigned bufferBusy : 1; + unsigned : 3; + uint16_t saveRDPT; + uint16_t saveWRPT; +} ethernetDriver_t; + +extern volatile ethernetDriver_t ethData; + +/** + * @ingroup ethdriver8bit + * @enum txPacket_t + * @brief Transmission packet. + */ +typedef struct +{ + uint16_t flags; + uint16_t packetStart; + uint16_t packetEnd; + void *prevPacket; + void *nextPacket; +} txPacket_t; + +/** + * @ingroup ethdriver8bit + * @enum phy_error_msg + * @brief PHY status/errors. + */ +typedef enum +{ + PHY_ERROR = 0, + PHY_SUCCESS, + PHY_LINK_NOT_FOUND, + PHY_BUFFER_BUSY, + PHY_TX_LOGIC_NOT_IDLE, + PHY_TX_QUEUED, + PHY_DMA_TIMEOUT, +} phy_error_msg; + +/** + * @ingroup ethdriver8bit + * @union mac48Address_t + * @brief MAC Address (48-bits). + */ +typedef union +{ + uint8_t mac_array[6]; + struct + { + uint8_t byte1, byte2, byte3, byte4, byte5, byte6; + } s; +} mac48Address_t; + +/** + * @ingroup ethdriver8bit + * @union mac64Address_t + * @brief MAC Address (64-bits). + */ +typedef union +{ + uint8_t mac_array[8]; + struct + { + uint8_t byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8; + } s; +} mac64Address_t; + +extern mac48Address_t hostMacAddress; +extern const mac48Address_t broadcastMAC; + +// Ethernet Driver APIs + +/** + * @ingroup ethdriver8bit + * @brief Sets up the Ethernet and starts the execution. Initializes the TX/RX buffer, the MAC and the PHY. + * @param None. + * @return None. + */ +void ETH_Init(void); + +/** + * @ingroup ethdriver8bit + * @brief Manages the MAC events. Can be used for polling or for new events in Interrupt Service Routine (ISR). + * @param None. + * @return None. + */ +void ETH_EventHandler(void); + +/** + * @ingroup ethdriver8bit + * @brief Updates the pointers for the next available RX packets. + * Retrieves information about the last received packet and the address of the next ones. + * @param None. + * @return None. + */ +void ETH_NextPacketUpdate(void); + +/** + * @ingroup ethdriver8bit + * @brief Resets the receiver buffer. + * @param None. + * @return None. + */ +void ETH_ResetReceiver(void); + +/** + * @ingroup ethdriver8bit + * @brief Resets the system software. + * @param None. + * @return None. + */ +void ETH_SendSystemReset(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the MAC address of type mac48Address_t. + * @param None. + * @return MAC address. + */ +const mac48Address_t *MAC_getAddress(void); + +// Read functions for data + +/** + * @ingroup ethdriver8bit + * @brief Reads a block of data from the RX buffer MAC. + * @param *buffer + * @param length + * @return Read count. + */ +uint16_t ETH_ReadBlock(void *buffer, uint16_t length); + +/** + * @ingroup ethdriver8bit + * @brief Reads one byte of data from the RX buffer MAC. + * @param None. + * @return One byte of data. + */ +uint8_t ETH_Read8(void); + +/** + * @ingroup ethdriver8bit + * @brief Reads two bytes of data from the RX buffer and returns them in host order. + * @param None. + * @return Two bytes of data. + */ +uint16_t ETH_Read16(void); + +/** + * @ingroup ethdriver8bit + * @brief Reads three bytes of data from the RX buffer and returns them in host order. + * @param None. + * @return Three bytes of data. + */ +uint32_t ETH_Read24(void); + +/** + * @ingroup ethdriver8bit + * @brief Reads four bytes of data from the RX buffer and returns them in host order. + * @param None. + * @return Four bytes of data. + */ +uint32_t ETH_Read32(void); + +/** + * @ingroup ethdriver8bit + * @brief Drops the N bytes from a packet list when the data is lost. Clears a number of bytes (length) from the RX buffer. + * @param length + * @return None. + */ +void ETH_Dump(uint16_t length); + +/** + * @ingroup ethdriver8bit + * @brief Drops the rest of this packet and release the buffer. + * Clears all bytes from the RX buffer. + * @param None. + * @return None. + */ +void ETH_Flush(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the available space size in the Ethernet TX buffer. + * @param None. + * @return Available space left in the TX buffer. + */ +uint16_t ETH_GetFreeTxBufferSize(void); + +/** + * @ingroup ethdriver8bit + * @brief Starts a packet if the Ethernet transmitter is idle. + * @param *dest_mac + * @param type + * @retval PHY_SUCCESS Packet started + * @retval PHY_BUFFER_BUSY Buffer is busy + * @retval PHY_TX_LOGIC_NOT_IDLE Transmitter is busy + */ +phy_error_msg ETH_WriteStart(const mac48Address_t *dest_mac, uint16_t type); + +/** + * @ingroup ethdriver8bit + * @brief Writes a string of data into the MAC. + * @param *string + * @return None. + */ +uint16_t ETH_WriteString(const char *string); + +/** + * @ingroup ethdriver8bit + * @brief Writes a block of data into the TX buffer MAC. + * @param *data + * @param length + * @return Length. + */ +uint16_t ETH_WriteBlock(const char *data, uint16_t length); + +/** + * @ingroup ethdriver8bit + * @brief Writes one byte of data into the TX buffer MAC. + * @param data + * @return None. + */ +void ETH_Write8(uint8_t data); + +/** + * @ingroup ethdriver8bit + * @brief Writes two bytes into the TX buffer MAC in Network order. + * @param data + * @return None. + */ +void ETH_Write16(uint16_t data); + +/** + * @ingroup ethdriver8bit + * @brief Writes three bytes into the TX buffer MAC in Network order. + * @param data + * @return None. + */ +void ETH_Write24(uint32_t data); + +/** + * @ingroup ethdriver8bit + * @brief Writes four bytes into the TX buffer MAC in Network order. + * @param data + * @return None. + */ +void ETH_Write32(uint32_t data); + +/** + * @ingroup ethdriver8bit + * @brief Inserts N data bytes into a specific offset in the TX buffer/packet. + * @param *data + * @param len length + * @param offset + * @return None. + */ +void ETH_Insert(char *data, uint16_t len, uint16_t offset); + +/** + * @ingroup ethdriver8bit + * @brief Copies N bytes from the saved read location (RX buffer) into the current TX location (TX buffer) using the DMA set up. + * This is used for ICMP ECHO to eliminate the need to extract the arbitrary payload. + * @param len length + * @retval PHY_SUCCESS + * @retval PHY_DMA_TIMEOUT + */ +phy_error_msg ETH_Copy(uint16_t len); + +/** + * @ingroup ethdriver8bit + * @brief Sends the TX packet. + * Starts the transmission of packet or queues the packet that has been created. + * @param None. + * @retval PHY_SUCCESS + * @retval PHY_BUFFER_BUSY + * @retval PHY_LINK_NOT_FOUND + * @retval PHY_TX_QUEUED + * @retval PHY_TX_LOGIC_NOT_IDLE + */ +phy_error_msg ETH_Send(void); + +/** + * @ingroup ethdriver8bit + * @brief Calculates the hardware checksum of length bytes starting with the position. + * @param position + * @param length + * @param seed + * @return Checksum. + */ +uint16_t ETH_TxComputeChecksum(uint16_t position, uint16_t length, uint16_t seed); + +/** + * @ingroup ethdriver8bit + * @brief Calculates the RX software checksum. + * @param len length + * @param seed + * @return Checksum. + */ +uint16_t ETH_RxComputeChecksum(uint16_t len, uint16_t seed); + +/** + * @ingroup ethdriver8bit + * @brief Reads the MAC address. + * @param *macAddr + * @return None. + */ +void ETH_GetMAC(uint8_t *macAddr); + +/** + * @ingroup ethdriver8bit + * @brief Sets the MAC address. + * @param *macAddr + * @return None. + */ +void ETH_SetMAC(uint8_t *macAddr); + +/** + * @ingroup ethdriver8bit + * @brief Returns the value of the write pointer. + * @param None. + * @return Pointer value. + */ +uint16_t ETH_GetWritePtr(void); + +/** + * @ingroup ethdriver8bit + * @brief Saves the receive pointer for copy. + * @param None. + * @return None. + */ +void ETH_SaveRDPT(void); + +/** + * @ingroup ethdriver8bit + * @brief Resets the receive pointer to the Init. + * @param None. + * @return None. + */ +void ETH_ResetReadPtr(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the value of the read pointer. + * @param None. + * @return Pointer value. + */ +uint16_t ETH_GetReadPtr(void); + +/** + * @ingroup ethdriver8bit + * @brief Sets the read pointer to a specific address. + * @param rdptr Read pointer + * @return None. + */ +void ETH_SetReadPtr(uint16_t rdptr); + +/** + * @ingroup ethdriver8bit + * @brief Returns the Status Vector's byte count. + * @param None. + * @return Byte count. + */ +uint16_t ETH_GetStatusVectorByteCount(void); + +/** + * @ingroup ethdriver8bit + * @brief Sets the Status Vector's byte count. + * @param bc Byte count + * @return None. + */ +void ETH_SetStatusVectorByteCount(uint16_t bc); + +/** + * @ingroup ethdriver8bit + * @brief Resets the driver's byte count. + * @param None. + * @return None. + */ +void ETH_ResetByteCount(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the the driver's byte count. + * @param None. + * @return Byte count. + */ +uint16_t ETH_GetByteCount(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the saved write pointer. + * @param None. + * @return Pointer value. + */ +uint16_t ETH_ReadSavedWRPT(void); + +/** + * @ingroup ethdriver8bit + * @brief Saves the write pointer for copy. + * @param None. + * @return None. + */ +void ETH_SaveWRPT(void); + +/** + * @ingroup ethdriver8bit + * @brief Sets the receiver's byte count. + * @param count byte count + * @return None. + */ +void ETH_SetRxByteCount(uint16_t count); + +/** + * @ingroup ethdriver8bit + * @brief Returns the receiver's byte count. + * @param None. + * @return Byte count. + */ +uint16_t ETH_GetRxByteCount(void); + +/** + * @ingroup ethdriver8bit + * @brief Checks for the link. + * @param None. + * @retval True if the link is present. + * @retval False if the link is not present. + */ +bool ETH_CheckLinkUp(void); + +/** + * @ingroup ethdriver8bit + * @brief Resets the transmitter. + * @param None. + * @return None. + */ +void ETH_TxReset(void); + +/** + * @ingroup ethdriver8bit + * @brief Moves back the read pointer. + * @param offset + * @return None. + */ +void ETH_MoveBackReadPtr(uint16_t offset); + +#endif /* PHYSICAL_LAYER_INTERFACE_H */ \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/ethernet/src/enc28j60.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/ethernet/src/enc28j60.c new file mode 100644 index 0000000..53db145 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/ethernet/src/enc28j60.c @@ -0,0 +1,1336 @@ +/** + * ENC28J60 Ethernet Driver Source File + * + * @file enc28j60.c + * + * @ingroup enc28j60 + * + * @brief This file provides the Ethernet driver API implementation for the ENC28J60 device. + * + * @version ENC28J60 Ethernet Driver Version 6.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Include Headers + +#include +#include +#include "../enc28j60.h" +#include "../../system/system.h" +#include "../physical_layer_interface.h" +#include "../../spi/spi_interface.h" +#include "../../timer/delay.h" + +// Macros + +#define RESET() ccp_write_io((void *)&RSTCTRL.SWRR, 0x1) + +// MAC Address + +#define MAC_ADDRESS {0x02, 0x00, 0x00, 0x00, 0x00, 0x01} +#define BROADCAST_MAC {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} + +/** + * @ingroup enc28j60 + * @def ETH_NCS_HIGH() + * @brief Sets Ethernet Chip Select to high. + */ +#define ETH_NCS_HIGH() do{ETH_CS_SetHigh();} while(0) + +/** + * @ingroup enc28j60 + * @def ETH_NCS_LOW() + * @brief Sets Ethernet Chip Select to low. + */ +#define ETH_NCS_LOW() do{ETH_CS_SetLow();} while(0) + +/** + * @ingroup enc28j60 + * @def ETH_SPI_READ8() + * @brief Reads the SPI byte. + */ +#define ETH_SPI_READ8() SPI0_ByteExchange(0) + +/** + * @ingroup enc28j60 + * @def ETH_SPI_WRITE8(a) + * @brief Writes the SPI byte. + */ +#define ETH_SPI_WRITE8(a) SPI0_ByteExchange(a) + +/** + * @ingroup enc28j60 + * @def ETH_WRITE_IN_PROGRESS + * @brief Packet write in progress, not ready for transmit. + */ +#define ETH_WRITE_IN_PROGRESS (0x0001 << 0) + +/** + * @ingroup enc28j60 + * @def ETH_TX_QUEUED + * @brief Packet complete, in queue for transmit. + */ +#define ETH_TX_QUEUED (0x0001 << 1) + +/** + * @ingroup enc28j60 + * @def ETH_ALLOCATED + * @brief Flag for pool management. Set to either free or allocated. + */ +#define ETH_ALLOCATED (0x0001 << 2) + +// Adjust these parameters for the MAC. +#define RAMSIZE_ETH (0x1FFF) // 8191 +#define MAX_TX_PACKET_SIZE (1518) +#define MIN_TX_PACKET_SIZE (64) +#define MAX_TX_PACKETS (20) + +#define TX_STATUS_VECTOR_SIZE (7) + +#define MIN_TX_PACKET (MIN_TX_PACKET_SIZE + TX_STATUS_VECTOR_SIZE) +#define TX_BUFFER_SIZE ((MAX_TX_PACKET_SIZE + TX_STATUS_VECTOR_SIZE) << 1) + +// Typical memory map for the MAC buffers +#define TXSTART (RAMSIZE_ETH - TX_BUFFER_SIZE) // 5141 +#define TXEND (RAMSIZE_ETH) // 8191 +#define RXSTART (0) +#define RXEND (TXSTART - 2) // 5139 + +#define TX_BUFFER_MID ((TXSTART) + ((TX_BUFFER_SIZE) >> 1)) + +#define SetBit(bitField, bitMask) do{ bitField = bitField | bitMask; } while(0) +#define ClearBit(bitField, bitMask) do{ bitField = bitField & (~bitMask); } while(0) +#define CheckBit(bitField, bitMask) (bool)(bitField & bitMask) + +// Variables + +volatile ethernetDriver_t ethData; +mac48Address_t macAddress = {MAC_ADDRESS}; +const mac48Address_t broadcastMAC = {BROADCAST_MAC}; +const mac48Address_t *eth_MAC; +static uint16_t nextPacketPointer; +static receiveStatusVector_t rxPacketStatusVector; +sfr_bank_t lastBank; + +// Define a temporary register for passing data to inline assembly +// This is to work around the 110110 LSB errata and to control RDPTR WRPTR update counts + +uint8_t ethListSize; + +static txPacket_t txData[MAX_TX_PACKETS]; + +static txPacket_t *pHead; +static txPacket_t *pTail; + +uint16_t TXPacketSize; + +// Function Prototypes + +const mac48Address_t *MAC_getAddress(void); + +/** + * @ingroup enc28j60 + * @brief Enqueues the latest written packet and starts the transmission of a queued packet. + * @param None. + * @retval PHY_SUCCESS + * @retval PHY_BUFFER_BUSY + */ +phy_error_msg ETH_SendQueued(void); + +/** + * @ingroup enc28j60 + * @brief Copies the queued packets to the TX Buffer start address using the DMA setup. + * @param None. + * @retval PHY_SUCCESS + * @retval PHY_DMA_TIMEOUT + */ +phy_error_msg ETH_Shift_Tx_Packets(void); + +/** + * @ingroup enc28j60 + * @brief Resets the Ethernet packet list. + * @param None. + * @return None. + */ +void ETH_PacketListReset(void); + +/** + * @ingroup enc28j60 + * @brief Allocates a new packet element and links it to the chained list. + * @param None. + * @return Packet address. + */ +txPacket_t *ETH_NewPacket(void); + +/** + * @ingroup enc28j60 + * @brief Deallocates a packet element and unlinks it from the chained list. + * @param pPacket packetHandle + * @return None. + */ +void ETH_RemovePacket(txPacket_t *pPacket); + +/** + * @ingroup enc28j60 + * @brief Calculates the checksum. + * @param len length + * @param seed + * @return Checksum. + */ +static uint16_t ETH_ComputeChecksum(uint16_t len, uint16_t seed); + +/** + * @ingroup enc28j60 + * @brief Reads one byte from Special Function Register (SFR). + * @param a register + * @return One byte of SFR value. + */ +static uint8_t ENC28_Rcr8(enc28j60_registers_t a); + +/** + * @ingroup enc28j60 + * @brief Reads two bytes from SFRs. + * @param a register + * @return Two bytes of SFR value. + */ +static uint16_t ENC28_Rcr16(enc28j60_registers_t a); + +/** + * @ingroup enc28j60 + * @brief Writes one byte to SFRs. + * @param a register + * @param v 8-bit value + * @return None. + */ +static void ENC28_Wcr8(enc28j60_registers_t a, uint8_t v); + +/** + * @ingroup enc28j60 + * @brief Writes two bytes to SFRs. + * @param a register + * @param v 16-bit value + * @return None. + */ +static void ENC28_Wcr16(enc28j60_registers_t a, uint16_t v); + +/** + * @ingroup enc28j60 + * @brief Sets the SFR bit field. + * @param a register + * @param bits + * @return None. + */ +static void ENC28_Bfs(enc28j60_registers_t a, char bits); + +/** + * @ingroup enc28j60 + * @brief Clears the SFR bit field. + * @param a register + * @param bits + * @return None. + */ +static void ENC28_Bfc(enc28j60_registers_t a, char bits); + +/** + * @ingroup enc28j60 + * @brief Reads the Physical Layer (PHY) register. + * @param a register + * @return Register data. + */ +static uint16_t ENC28_PhyRead(enc28j60_phy_registers_t a); + +/** + * @ingroup enc28j60 + * @brief Writes the PHY register. + * @param a register + * @param d data + * @return None. + */ +static void ENC28_PhyWrite(enc28j60_phy_registers_t a, uint16_t d); + +/** + * @ingroup enc28j60 + * @brief Selects the bank. + * @param r register + * @return None. + */ +static void ENC28_BankSel(enc28j60_registers_t r); + +/** + * @ingroup enc28j60 + * @brief Releases the Serial Peripheral Interface (SPI) bus. + * @param None. + * @return None. + */ +static void ETH_CloseSPI(void); + +/** + * @ingroup enc28j60 + * @brief Connects the SPI bus. + * @param None. + * @return None. + */ +static void ETH_OpenSPI(void); + +// Functions + +const mac48Address_t *MAC_getAddress(void) +{ + return &macAddress; +} + +static void ENC28_BankSel(enc28j60_registers_t r) +{ + uint8_t a = r & BANK_MASK; + + if (a != sfr_common && a != lastBank) + { + lastBank = a; + // Clear the bank bits + ETH_NCS_LOW(); + ETH_SPI_WRITE8(bfc_inst | 0x1F); + ETH_SPI_WRITE8(0x03); + ETH_NCS_HIGH(); + NOP(); + NOP(); + // Set the required bits + ETH_NCS_LOW(); + ETH_SPI_WRITE8(bfs_inst | 0x1F); + ETH_SPI_WRITE8(a >> 6); + ETH_NCS_HIGH(); + } +} + +bool ETH_CheckLinkUp(void) +{ + uint16_t phstat2; + phstat2 = ENC28_PhyRead(J60_PHSTAT2); + if (phstat2 & 0x0400) + { + ethData.up = true; + return true; + } + else + return false; +} + +txPacket_t *ETH_NewPacket(void) +{ + uint8_t index = 0; + + if (ethListSize == MAX_TX_PACKETS) + { + return NULL; + } + + while (index < MAX_TX_PACKETS) + { + if (CheckBit(txData[index].flags, ETH_ALLOCATED) == false) + { + txData[index].flags = 0; // Reset all flags + SetBit(txData[index].flags, ETH_ALLOCATED); // Mark the handle as allocated(Allocated = true) + + txData[index].packetEnd = TXEND; + + txData[index].prevPacket = NULL; + txData[index].nextPacket = pHead; + + if (pHead != NULL) + { + pHead->prevPacket = &txData[index]; + txData[index].packetStart = pHead->packetEnd + TX_STATUS_VECTOR_SIZE; + + // Try to keep a 2 byte alignment + if (txData[index].packetStart & 0x0001) + { + // Make sure the end of the packet is odd, so the beginning of the next one is even. + ++txData[index].packetStart; + } + } + else + { + txData[index].packetStart = TXSTART; + pTail = (txPacket_t *)&txData[index]; + } + + pHead = (txPacket_t *)&txData[index]; + + ethListSize++; + return (&txData[index]); + } + index++; + } + return NULL; +} + +void ETH_PacketListReset(void) +{ + uint16_t index = 0; + uint8_t *ptr = (uint8_t *)&txData; + ethListSize = 0; + + pHead = NULL; + pTail = NULL; + + while (index < (MAX_TX_PACKETS * sizeof(txPacket_t))) + { + ptr[index] = 0; + index++; + } +} + +void ETH_RemovePacket(txPacket_t *pPacket) +{ +#ifdef VALIDATE_ALLOCATED_PTR + uint8_t index = 0; +#endif // VALIDATE_ALLOCATED_PTR + + if ((pPacket == NULL) || (ethListSize == 0)) + { + return; + } + +#ifdef VALIDATE_ALLOCATED_PTR + while (index < MAX_TX_PACKETS) + { + if ((pPacket == &txData[index]) && (txData[index].allocated == true)) + { + break; + } + index++; + } + if (index == MAX_TX_PACKETS) + { + return; + } +#endif // VALIDATE_ALLOCATED_PTR + + // Unlink from the chained list + if (pPacket->nextPacket == NULL) + { + pTail = pPacket->prevPacket; + if (pTail != NULL) + { + pTail->nextPacket = NULL; + } + } + + if (pPacket->prevPacket == NULL) + { + pHead = pPacket->nextPacket; + if (pHead != NULL) + { + pHead->prevPacket = NULL; + } + } + + // Deallocate + pPacket->flags = 0; + pPacket->prevPacket = NULL; + pPacket->nextPacket = NULL; + + ethListSize--; + + return; +} + +static void ETH_CloseSPI(void) +{ + SPI0_Close(); +} + +static void ETH_OpenSPI(void) +{ + while (!SPI0_Open(MAC)); +} + +void ETH_Init(void) +{ + ETH_OpenSPI(); + + Control_Byte = 0x00; + // Initialize the driver variables + ethData.error = false; // No error + ethData.up = false; // No link + ethData.linkChange = false; + + ETH_PacketListReset(); + + ethData.saveRDPT = 0; + + lastBank = sfr_bank0; + + DELAY_microseconds(100); + + ETH_SendSystemReset(); // Software reset + DELAY_milliseconds(10); + + // Wait for the OST + while (!(ENC28_Rcr8(J60_ESTAT) & 0x01)); // Wait for CLKRDY to go high + + // Initialize RX tracking variables and other control state flags + nextPacketPointer = RXSTART; + + ENC28_Bfs(J60_ECON2, 0x80); // Enable AUTOINC + + // Set up TX/RX buffer addresses + ENC28_Wcr16(J60_ETXSTL, TXSTART); + ENC28_Wcr16(J60_ETXNDL, TXEND); + ENC28_Wcr16(J60_ERXSTL, RXSTART); + ENC28_Wcr16(J60_ERXNDL, RXEND); + ENC28_Wcr16(J60_ERDPTL, nextPacketPointer); + + ENC28_Wcr16(J60_ERDPTL, RXSTART); + ENC28_Wcr16(J60_EWRPTL, TXSTART); + + // Configure the receive filter + ENC28_Wcr8(J60_ERXFCON, 0b10101001); // UCEN,OR,CRCEN,MPEN,BCEN (unicast,crc,magic packet,broadcast) + + // Get MAC address + eth_MAC = MAC_getAddress(); + + // Initialize the MAC + ENC28_Wcr8(J60_MACON1, 0x0D); // TXPAUS, RXPAUS, MARXEN + ENC28_Wcr8(J60_MACON3, 0x23); // Pad < 60 bytes, Enable CRC, Frame Check, Full Duplex + ENC28_Wcr8(J60_MACON4, 0x40); // DEFER set + ENC28_Wcr16(J60_MAIPGL, 0x0c12); + ENC28_Wcr8(J60_MABBIPG, 0x12); + ENC28_Wcr16(J60_MAMXFLL, MAX_TX_PACKET_SIZE); + ENC28_Wcr8(J60_MAADR1, eth_MAC->mac_array[0]); + NOP(); + ENC28_Wcr8(J60_MAADR2, eth_MAC->mac_array[1]); + NOP(); + ENC28_Wcr8(J60_MAADR3, eth_MAC->mac_array[2]); + NOP(); + ENC28_Wcr8(J60_MAADR4, eth_MAC->mac_array[3]); + NOP(); + ENC28_Wcr8(J60_MAADR5, eth_MAC->mac_array[4]); + NOP(); + ENC28_Wcr8(J60_MAADR6, eth_MAC->mac_array[5]); + NOP(); + + ENC28_Wcr8(J60_ECON1, 0x04); // RXEN enabled + + // Initialize the PHY + ENC28_PhyWrite(J60_PHCON1, 0x0100); // Ful-Duplex mode enabled (PDPXMD - PHY) + ENC28_PhyWrite(J60_PHCON2, 0x0100); // Do not transmit loopback + ENC28_PhyWrite(J60_PHLCON, 0x0472); // LED control - LEDA = Link, LEDB = TX/RX, Stretched LED + // LEDB is grounded so default is Half Duplex + + // Configure the IRQ's + ENC28_Wcr8(J60_EIE, 0xDB); // Enable PKTIE,INTIE,LINKIE,TXIE,TXERIE,RXERIE + ENC28_Wcr16(((enc28j60_registers_t)J60_PHIE), 0x12); // Enable PLNKIE and PGEIE + + // Check for a preexisting link + ETH_CheckLinkUp(); +} + +void ETH_EventHandler(void) +{ + eir_t eir_val; + phstat2_t phstat2_val; + + // MAC is sending an interrupt + eir_val.val = ENC28_Rcr8(J60_EIR); + phstat2_val.val = ENC28_Rcr16((enc28j60_registers_t)J60_PHSTAT2); + + if (eir_val.LINKIF) // Something about the link changed. Update the link parameters. + { + ENC28_Bfc(J60_EIR, 0x01); // CLEAR LINKIF + ethData.linkChange = true; + ethData.up = false; + if (ETH_CheckLinkUp()) + { + } + if (phstat2_val.DPXSTAT) // Update MAC duplex settings to match PHY duplex setting + { + ENC28_Wcr16(J60_MABBIPG, 0x15); // Switching to full duplex + ENC28_Bfs(((enc28j60_registers_t)J60_PHSTAT2), 0x01); + } + else + { + ENC28_Wcr16(J60_MABBIPG, 0x12); // Switching to half duplex + ENC28_Bfc(((enc28j60_registers_t)J60_PHSTAT2), 0x01); + } + } + if (eir_val.TXIF) // Packet sent + { + ENC28_Bfc(J60_EIR, 0x08); // Clear TXIF + ETH_RemovePacket(pTail); + if (ethListSize > 0) + { + if (ENC28_Rcr16(J60_EWRPTL) > TX_BUFFER_MID) + { + // Shift all the queued packets to the start of the TX Buffer + ETH_Shift_Tx_Packets(); + } + + // Send the next queued packet + ETH_SendQueued(); + } + } + if (eir_val.PKTIF || ENC28_Rcr8(J60_EPKTCNT)) // Packet receive buffer has at least 1 unprocessed packet + { + ethData.pktReady = true; + ENC28_Bfc(J60_EIR, 0x04); // Clear PKTIF + } +} + +void ETH_NextPacketUpdate(void) +{ + // Set the RX Read Pointer to the beginning of the next unprocessed packet + // Errata 14 inclusion + if (nextPacketPointer == RXSTART) + ENC28_Wcr16(J60_ERXRDPTL, RXEND); + else + ENC28_Wcr16(J60_ERXRDPTL, nextPacketPointer - 1); + + ENC28_Wcr16(J60_ERDPTL, nextPacketPointer); + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + ((char *)&nextPacketPointer)[0] = ETH_SPI_READ8(); + ((char *)&nextPacketPointer)[1] = ETH_SPI_READ8(); + ((char *)&rxPacketStatusVector)[0] = ETH_SPI_READ8(); + ((char *)&rxPacketStatusVector)[1] = ETH_SPI_READ8(); + ((char *)&rxPacketStatusVector)[2] = ETH_SPI_READ8(); + ((char *)&rxPacketStatusVector)[3] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + rxPacketStatusVector.byteCount -= 4; // Frame checksum can be ignored at the end. + // The checksum is 4 bytes. Payload is byte count less 4. +} + +void ETH_ResetReceiver(void) +{ + uint8_t econ1; + econ1 = ENC28_Rcr8(J60_ECON1); + ENC28_Wcr8(J60_ECON1, (econ1 | 0x40)); +} + +static uint8_t ENC28_Rcr8(enc28j60_registers_t a) +{ + uint8_t v; + + ENC28_BankSel(a); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rcr_inst | (a & SFR_MASK)); + v = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return v; +} + +static uint16_t ENC28_Rcr16(enc28j60_registers_t a) +{ + uint16_t v; + + ENC28_BankSel(a); + a &= SFR_MASK; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rcr_inst | (a)); + ((char *)&v)[0] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + NOP(); + NOP(); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rcr_inst | (a + 1)); + ((char *)&v)[1] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return v; +} + +static void ENC28_Wcr8(enc28j60_registers_t a, uint8_t v) +{ + ENC28_BankSel(a); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wcr_inst | (a & SFR_MASK)); + ETH_SPI_WRITE8(v); + ETH_NCS_HIGH(); +} + +static void ENC28_Wcr16(enc28j60_registers_t a, uint16_t v) +{ + ENC28_BankSel(a); + a &= SFR_MASK; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wcr_inst | (a)); + ETH_SPI_WRITE8(((char *)&v)[0]); + ETH_NCS_HIGH(); + NOP(); + NOP(); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wcr_inst | (a + 1)); + ETH_SPI_WRITE8(((char *)&v)[1]); + ETH_NCS_HIGH(); +} + +static void ENC28_Bfs(enc28j60_registers_t a, char bits) // can only be used for ETH Control Registers +{ + ENC28_BankSel(a); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(bfs_inst | (a & SFR_MASK)); + ETH_SPI_WRITE8(bits); + ETH_NCS_HIGH(); +} + +static void ENC28_Bfc(enc28j60_registers_t a, char bits) +{ + ENC28_BankSel(a); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(bfc_inst | (a & SFR_MASK)); + ETH_SPI_WRITE8(bits); + ETH_NCS_HIGH(); +} + +static void ENC28_PhyWrite(enc28j60_phy_registers_t a, uint16_t d) +{ + uint8_t v = 1; + + ENC28_Wcr8(J60_MIREGADR, a); + ENC28_Wcr16(J60_MIWRL, d); + while (v & 0x01) + { + v = ENC28_Rcr8(J60_MISTAT); + } +} + +static uint16_t ENC28_PhyRead(enc28j60_phy_registers_t a) +{ + ENC28_Wcr8(J60_MIREGADR, a); + ENC28_Bfs(J60_MICMD, 0x01); // Set the read flag + while (ENC28_Rcr8(J60_MISTAT) & 0x01); // Wait for the busy flag to clear + ENC28_Bfc(J60_MICMD, 0x01); // Clear the read flag + + return ENC28_Rcr16(J60_MIRDL); +} + +void ETH_SendSystemReset(void) +{ + ETH_NCS_LOW(); + ETH_SPI_WRITE8(src_inst); + ETH_NCS_HIGH(); +} + +uint8_t ETH_Read8(void) +{ + uint8_t b; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + b = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return b; +} + +uint16_t ETH_Read16(void) +{ + uint16_t b; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + b = (uint16_t)(ETH_SPI_READ8() << 8); + b |= ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return b; +} + +uint32_t ETH_Read24(void) +{ + uint32_t b; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + ((char *)&b)[2] = ETH_SPI_READ8(); + ((char *)&b)[1] = ETH_SPI_READ8(); + ((char *)&b)[0] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return b; +} + +uint32_t ETH_Read32(void) +{ + uint32_t b; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + ((char *)&b)[3] = ETH_SPI_READ8(); + ((char *)&b)[2] = ETH_SPI_READ8(); + ((char *)&b)[1] = ETH_SPI_READ8(); + ((char *)&b)[0] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return b; +} + +uint16_t ETH_ReadBlock(void *buffer, uint16_t length) +{ + uint16_t readCount = length; + char *p = buffer; + + if (rxPacketStatusVector.byteCount < length) + readCount = rxPacketStatusVector.byteCount; + length = readCount; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + while (length--) *p++ = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return readCount; +} + +void ETH_Write8(uint8_t data) +{ + TXPacketSize += 1; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8(data); + ETH_NCS_HIGH(); +} + +void ETH_Write16(uint16_t data) +{ + TXPacketSize += 2; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8((uint8_t)(data >> 8)); + ETH_SPI_WRITE8((uint8_t)(data)); + ETH_NCS_HIGH(); +} + +void ETH_Write24(uint32_t data) +{ + TXPacketSize += 3; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8((uint8_t)(data >> 16)); + ETH_SPI_WRITE8((uint8_t)(data >> 8)); + ETH_SPI_WRITE8((uint8_t)(data)); + ETH_NCS_HIGH(); +} + +void ETH_Write32(uint32_t data) +{ + TXPacketSize += 4; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8((uint8_t)(data >> 24)); + ETH_SPI_WRITE8((uint8_t)(data >> 16)); + ETH_SPI_WRITE8((uint8_t)(data >> 8)); + ETH_SPI_WRITE8((uint8_t)(data)); + ETH_NCS_HIGH(); +} + +uint16_t ETH_WriteString(const char *string) +{ + uint16_t length = 0; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + while (*string) + { + ETH_SPI_WRITE8(*string++); + length++; + } + ETH_NCS_HIGH(); + TXPacketSize += length; + + return length; +} + +uint16_t ETH_WriteBlock(const char *data, uint16_t length) +{ + const char *p = data; + TXPacketSize += length; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + while (length--) + { + ETH_SPI_WRITE8(*p++); + } + ETH_NCS_HIGH(); + + return length; +} + +uint16_t ETH_GetFreeTxBufferSize(void) +{ + return (uint16_t)(TXEND - (ENC28_Rcr16(J60_EWRPTL))); +} + +phy_error_msg ETH_WriteStart(const mac48Address_t *dest_mac, uint16_t type) +{ + txPacket_t *ethPacket = NULL; + + if (ENC28_Rcr16(J60_EWRPTL) > TX_BUFFER_MID) + { + // Shift all the queued packets to the start of the TX Buffer + // Check if TX in progress + if ((ENC28_Rcr8(J60_ECON1) & 0x08)) + { + return PHY_TX_LOGIC_NOT_IDLE; + } + + // Try to move the queued packets + ETH_Shift_Tx_Packets(); + + // Verify if shifted + if (ENC28_Rcr16(J60_EWRPTL) > TX_BUFFER_MID) + { + return PHY_BUFFER_BUSY; + } + } + + // Create new packet and queue it in the TX Buffer + + // Initialize a new packet handler to automatically place in the queue + ethPacket = ETH_NewPacket(); + + if (ethPacket == NULL) + { + // Packets not availabe + return PHY_BUFFER_BUSY; + } + + SetBit(ethPacket->flags, ETH_WRITE_IN_PROGRESS); // writeInProgress = true; + + ENC28_Wcr16(J60_EWRPTL, ethPacket->packetStart); + + ETH_ResetByteCount(); + + TXPacketSize = 0; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8(Control_Byte); + ETH_SPI_WRITE8(dest_mac->mac_array[0]); + ETH_SPI_WRITE8(dest_mac->mac_array[1]); + ETH_SPI_WRITE8(dest_mac->mac_array[2]); + ETH_SPI_WRITE8(dest_mac->mac_array[3]); + ETH_SPI_WRITE8(dest_mac->mac_array[4]); + ETH_SPI_WRITE8(dest_mac->mac_array[5]); + ETH_SPI_WRITE8(eth_MAC->mac_array[0]); + ETH_SPI_WRITE8(eth_MAC->mac_array[1]); + ETH_SPI_WRITE8(eth_MAC->mac_array[2]); + ETH_SPI_WRITE8(eth_MAC->mac_array[3]); + ETH_SPI_WRITE8(eth_MAC->mac_array[4]); + ETH_SPI_WRITE8(eth_MAC->mac_array[5]); + ETH_SPI_WRITE8(type >> 8); + ETH_SPI_WRITE8(type & 0x0FF); + ETH_NCS_HIGH(); + TXPacketSize += 15; + + return PHY_SUCCESS; +} + +phy_error_msg ETH_SendQueued(void) +{ + uint8_t econ1; + + if (pHead->flags & ETH_TX_QUEUED) + { + // Close the latest written packet and enqueue it + ClearBit(pHead->flags, (uint16_t)ETH_TX_QUEUED); // txQueued = false + + // Start transmitting from the tails. The packet first written + ENC28_Wcr16(J60_ETXSTL, pTail->packetStart); + ENC28_Wcr16(J60_ETXNDL, pTail->packetEnd); + + NOP(); + NOP(); + econ1 = ENC28_Rcr8(J60_ECON1); + ENC28_Wcr8(J60_ECON1, (econ1 | 0x08)); // Start sending + + return PHY_SUCCESS; + } + else + { + return PHY_BUFFER_BUSY; + } +} + +phy_error_msg ETH_Send(void) +{ + uint16_t packetEnd = (ENC28_Rcr16(J60_EWRPTL)) - 1; + + ENC28_Wcr16(J60_ETXNDL, TXSTART + TXPacketSize); + if (!ethData.up) + { + return PHY_LINK_NOT_FOUND; + } + + if (ethListSize == 0) + { + return PHY_BUFFER_BUSY; + } + + ClearBit(pHead->flags, (uint16_t)ETH_WRITE_IN_PROGRESS); // writeInProgress = false + pHead->packetEnd = packetEnd; + SetBit(pHead->flags, ETH_TX_QUEUED); // txQueued = true + // The packet is prepared to be sent/queued at this time + + if ((ENC28_Rcr16(J60_ECON1) & 0x08) || (ethListSize > 1)) + { + return PHY_TX_QUEUED; + } + return ETH_SendQueued(); +} + +void ETH_Dump(uint16_t length) +{ + uint16_t newRXTail; + + length = (rxPacketStatusVector.byteCount <= length) ? rxPacketStatusVector.byteCount : length; + if (length) + { + newRXTail = ENC28_Rcr16(J60_ERDPTL); + newRXTail += length; + // Write new RX tail + ENC28_Wcr16(J60_ERDPTL, newRXTail); + rxPacketStatusVector.byteCount -= length; + } +} + +void ETH_Flush(void) +{ + ethData.pktReady = false; + if (nextPacketPointer == RXSTART) + ENC28_Wcr16(J60_ERXRDPTL, RXEND); + else + ENC28_Wcr16(J60_ERXRDPTL, nextPacketPointer - 1); + ENC28_Wcr16(J60_ERDPTL, nextPacketPointer); + // Packet decrement + ENC28_Bfs(J60_ECON2, 0x40); +} + +void ETH_Insert(char *data, uint16_t len, uint16_t offset) +{ + uint16_t current_tx_pointer = 0; + offset += sizeof(Control_Byte); + + current_tx_pointer = ENC28_Rcr16(J60_EWRPTL); + ENC28_Wcr16(J60_EWRPTL, pHead->packetStart + offset); + while (len--) + { + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); // WBM command + ETH_SPI_WRITE8(*data++); + ETH_NCS_HIGH(); + } + ENC28_Wcr16(J60_EWRPTL, current_tx_pointer); +} + +phy_error_msg ETH_Copy(uint16_t len) +{ + uint16_t tx_buffer_address; + uint16_t timer; + uint16_t temp_len; + + timer = 2 * len; + // Waits until module is idle + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0 && --timer) + NOP(); // Waits here until the DMAST bit is clear + + if ((ENC28_Rcr8(J60_ECON1) & 0x20) == 0) + { + tx_buffer_address = ENC28_Rcr16(J60_EWRPTL); // Current TX Write Pointer + + ENC28_Wcr16(J60_EDMADSTL, tx_buffer_address); + ENC28_Wcr16(J60_EDMASTL, ethData.saveRDPT); + + tx_buffer_address += len; + temp_len = ethData.saveRDPT + len; + + if (temp_len > RXEND) + { + temp_len = temp_len - (RXEND) + RXSTART; + ENC28_Wcr16(J60_EDMANDL, temp_len); + } + else + { + ENC28_Wcr16(J60_EDMANDL, temp_len); + } + + // Clear CSUMEN to select a copy operation + ENC28_Bfc(J60_ECON1, 0x10); + // Starts the DMA + ENC28_Bfs(J60_ECON1, 0x20); + timer = 40 * len; + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0 && --timer) + NOP(); // Waits here until the DMAST bit is clear + if ((ENC28_Rcr8(J60_ECON1) & 0x20) == 0) + { + // Clears the source and destination window pointers + ENC28_Wcr16(J60_EWRPTL, tx_buffer_address); + + TXPacketSize += len; // Fixes the packet length + return PHY_SUCCESS; + } + } + RESET(); // Reboots device + return PHY_DMA_TIMEOUT; +} + +phy_error_msg ETH_Shift_Tx_Packets(void) +{ + uint8_t econ1; + uint16_t timer; + uint16_t len = pHead->packetEnd - pTail->packetStart; + + timer = 2 * len; + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0 && --timer) + NOP(); // Waits here until DMA is free + if ((ENC28_Rcr8(J60_ECON1) & 0x20) == 0) // ECON1bits.DMAST==0 + { + ENC28_Wcr16(J60_EDMADSTL, TXSTART); // Setup the destination start pointer + + ENC28_Wcr16(J60_EDMASTL, pTail->packetStart); // Setup the source pointer from the current read pointer + ENC28_Wcr16(J60_EDMANDL, pTail->packetStart); + + econ1 = ENC28_Rcr8(J60_ECON1); + ENC28_Wcr8(J60_ECON1, (econ1 | 0x10)); // Copy mode ECON1bits.CSUMEN = 0 + econ1 = ENC28_Rcr8(J60_ECON1); + ENC28_Wcr8(J60_ECON1, (econ1 | 0x20)); // Starts DMA ECON1bits.DMAST = 1 + + // It might take longer to complete if there is heavy network traffic + timer = 40 * len; + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0 && --timer) + NOP(); // Waits here until DMA is free + if ((ENC28_Rcr8(J60_ECON1) & 0x20) == 0) + { + // Updates the start and end addresses of each packet + txPacket_t *pElem = pHead; + uint16_t shiftOffset = pTail->packetStart; + + while (pElem != NULL) + { + pElem->packetStart = pElem->packetStart - shiftOffset; + pElem->packetEnd = pElem->packetEnd - shiftOffset; + pElem = pElem->nextPacket; + } + + // Updates the EWRPT + ENC28_Wcr16(J60_EWRPTL, TXSTART + len); + return PHY_SUCCESS; + } + } + // DMA is timed out + RESET(); // Reboots device + return PHY_DMA_TIMEOUT; +} + +static uint16_t ETH_ComputeChecksum(uint16_t len, uint16_t seed) +{ + uint32_t cksm; + uint16_t v; + + cksm = seed; + + while (len > 1) + { + v = 0; + ((char *)&v)[1] = ETH_Read8(); + ((char *)&v)[0] = ETH_Read8(); + cksm += v; + len -= 2; + } + + if (len) + { + v = 0; + ((char *)&v)[1] = ETH_Read8(); + ((char *)&v)[0] = 0; + cksm += v; + } + + // Wraps the checksum + while (cksm >> 16) + { + cksm = (cksm & 0x0FFFF) + (cksm >> 16); + } + + // Inverts the number. + cksm = ~cksm; + + // Returns the resulting checksum + return (uint16_t)cksm; +} + +uint16_t ETH_TxComputeChecksum(uint16_t position, uint16_t length, uint16_t seed) +{ + uint32_t cksm; + + // cksm = seed; + position += sizeof(Control_Byte); + + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0); // Waits until the DMAST bit is clear + + ENC28_Wcr16(J60_EDMASTL, (pHead->packetStart + position)); + ENC28_Wcr16(J60_EDMANDL, pHead->packetStart + position + (length - 1)); + + if (!(ENC28_Rcr8(J60_ECON1) & 0x10)) // Verify CSUMEN is not set already + { + // Sets CSUMEN and DMAST to select and start a checksum operation + ENC28_Bfs(J60_ECON1, 0x30); + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0); // Waits until the DMAST bit is clear + ENC28_Bfc(J60_ECON1,0x10); + + cksm = ENC28_Rcr16(J60_EDMACSL); + if (seed) + { + seed = ~(seed); + cksm += seed; + while (cksm >> 16) + { + cksm = (cksm & 0x0FFFF) + (cksm >> 16); + } + } + cksm = htons(cksm); + } + return (uint16_t)cksm; +} + +uint16_t ETH_RxComputeChecksum(uint16_t len, uint16_t seed) +{ + uint16_t rxptr; + uint32_t cksm; + + // Saves the read pointer starting address + rxptr = ENC28_Rcr16(J60_ERDPTL); + + cksm = ETH_ComputeChecksum(len, seed); + + // Restores old read pointer location + ENC28_Wcr16(J60_ERDPTL, rxptr); + + // Returns the resulting checksum + return (uint16_t)(((cksm & 0xFF00) >> 8) | ((cksm & 0x00FF) << 8)); +} + +void ETH_GetMAC(uint8_t *macAddr) +{ + *macAddr++ = ENC28_Rcr8(J60_MAADR1); + *macAddr++ = ENC28_Rcr8(J60_MAADR2); + *macAddr++ = ENC28_Rcr8(J60_MAADR3); + *macAddr++ = ENC28_Rcr8(J60_MAADR4); + *macAddr++ = ENC28_Rcr8(J60_MAADR5); + *macAddr++ = ENC28_Rcr8(J60_MAADR6); +} + +void ETH_SetMAC(uint8_t *macAddr) +{ + ENC28_Wcr8(J60_MAADR1, *macAddr++); + ENC28_Wcr8(J60_MAADR2, *macAddr++); + ENC28_Wcr8(J60_MAADR3, *macAddr++); + ENC28_Wcr8(J60_MAADR4, *macAddr++); + ENC28_Wcr8(J60_MAADR5, *macAddr++); + ENC28_Wcr8(J60_MAADR6, *macAddr++); +} + +void ETH_SaveRDPT(void) +{ + ethData.saveRDPT = ENC28_Rcr16(J60_ERDPTL); +} + +uint16_t ETH_GetReadPtr(void) +{ + return ENC28_Rcr16(J60_ERDPTL); +} + +void ETH_SetReadPtr(uint16_t rdptr) +{ + ENC28_Wcr16(J60_ERDPTL, rdptr); +} + +void ETH_MoveBackReadPtr(uint16_t offset) +{ + uint16_t rdptr; + + rdptr = ENC28_Rcr16(J60_ERDPTL); + ENC28_Wcr16(J60_ERDPTL, rdptr - offset); + ETH_SetRxByteCount(offset); +} + +void ETH_ResetReadPtr(void) +{ + ENC28_Wcr16(J60_ERDPTL, RXSTART); +} + +uint16_t ETH_GetWritePtr(void) +{ + return ENC28_Rcr16(J60_EWRPTL); +} + +uint16_t ETH_GetRxByteCount(void) +{ + return (rxPacketStatusVector.byteCount); +} + +void ETH_SetRxByteCount(uint16_t count) +{ + rxPacketStatusVector.byteCount += count; +} + +void ETH_ResetByteCount(void) +{ + ethData.saveWRPT = ENC28_Rcr16(J60_EWRPTL); +} + +uint16_t ETH_GetByteCount(void) +{ + uint16_t wptr; + wptr = ENC28_Rcr16(J60_EWRPTL); + return (wptr - ethData.saveWRPT); +} + +void ETH_SaveWRPT(void) +{ + ethData.saveWRPT = ENC28_Rcr16(J60_EWRPTL); +} + +uint16_t ETH_ReadSavedWRPT(void) +{ + return ethData.saveWRPT; +} + +uint16_t ETH_GetStatusVectorByteCount(void) +{ + return (rxPacketStatusVector.byteCount); +} + +void ETH_SetStatusVectorByteCount(uint16_t bc) +{ + rxPacketStatusVector.byteCount = bc; +} + +void ETH_TxReset(void) +{ + uint8_t econ1; + econ1 = ENC28_Rcr8(J60_ECON1); + + ENC28_Wcr8(J60_ECON1, (econ1 | 0x80)); + + ETH_ResetByteCount(); + + ENC28_Wcr16(J60_ETXSTL, TXSTART); + ENC28_Wcr16(J60_EWRPTL, TXSTART); + + ETH_PacketListReset(); +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/nvm/nvm.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/nvm/nvm.h new file mode 100644 index 0000000..277242e --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/nvm/nvm.h @@ -0,0 +1,206 @@ +/** + * + * @file nvm.h + * + * @defgroup nvm_driver Non-Volatile Memory + * + * @brief This file contains API prototypes and other data types for the Non-Volatile Memory (NVM) driver. + * + * @version NVM Driver Version 3.0.0 + */ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef NVM_H +#define NVM_H + +#include "../system/utils/compiler.h" + +/** + * @ingroup nvm_driver + * @def PROGMEM_BLOCK_SIZE + * Contains the program memory block size in bytes. + * The BOOTSIZE and CODESIZE fuses select the Flash section sizes in blocks of PROGMEM_BLOCK_SIZE bytes. + */ +#define PROGMEM_BLOCK_SIZE (512U) + + +/** + * @ingroup nvm_driver + * @brief Data type for the Flash data. + */ +typedef uint8_t flash_data_t; +/** + * @ingroup nvm_driver + * @brief Data type for the Flash address. + */ +typedef uint32_t flash_address_t; + +/** + * @ingroup nvm_driver + * @brief Data type for the EEPROM data. + */ +typedef uint8_t eeprom_data_t; +/** + * @ingroup nvm_driver + * @brief Data type for the EEPROM address. + */ +typedef uint16_t eeprom_address_t; + +/** + * @ingroup nvm_driver + * @enum nvm_status_t + * @brief Contains the return codes for the NVM driver APIs. + */ +typedef enum +{ + NVM_OK, /**<0 - The NVM operation succeeded.*/ + NVM_ERROR /**<1 - The NVM operation failed.*/ +} nvm_status_t; + +/** + * @ingroup nvm_driver + * @brief Initializes the NVM driver. + * @param None. + * @return None. + */ +void NVM_Initialize(void); + +/** + * @ingroup nvm_driver + * @brief Returns the status of the last NVM operation. + * @param None. + * @retval NVM_OK - The NVM operation succeeded. + * @retval NVM_ERROR - The NVM operation failed. + */ +nvm_status_t NVM_StatusGet(void); + +/** + * @ingroup nvm_driver + * @brief Clears the NVM error status. + * @param None. + * @return None. + */ +void NVM_StatusClear(void); + +/** + * @ingroup nvm_driver + * @brief Reads a byte from the given Flash address. + * @pre NVM must be initialized with @ref NVM_Initialize() before calling this API. + * @param [in] address - Address of the Flash location from which data is to be read. + * @return Byte read from the given Flash address. + */ +flash_data_t FLASH_Read(flash_address_t address); + +/** + * @ingroup nvm_driver + * @brief Writes a word at the given Flash address. + * As this is a non-portable API, it may not be supported by all 8-bit PIC® and AVR® devices. + * @pre NVM must be initialized with @ref NVM_Initialize() before calling this API. + * Erase the Flash location before writing. + * @param [in] address - Address of the Flash location at which data is to be written. + * @param [in] data - Word to be written. + * @return Status of the Flash write operation as described in @ref nvm_status_t. + */ +nvm_status_t FLASH_Write(flash_address_t address, uint16_t data); + +/** + * @ingroup nvm_driver + * @brief Writes one entire Flash row/page from the given starting address of the row (the first byte location). + * The size of the input buffer must be one Flash row and the address must be aligned with the row boundary. + * Use @ref FLASH_PageAddressGet() to obtain the starting address of the row. + * @pre Erase Flash row before calling this function. + * @param [in] address - Starting address of the Flash row to be written. + * @param [in] *dataBuffer - Pointer to a buffer which holds the data to be written. + * @return Status of the Flash row write operation as described in @ref nvm_status_t. + */ +nvm_status_t FLASH_RowWrite(flash_address_t address, flash_data_t *dataBuffer); + +/** + * @ingroup nvm_driver + * @brief Erases one Flash page containing the given address. + * @pre NVM must be initialized with @ref NVM_Initialize() before calling this API. + * @param [in] address - Starting address of the Flash page to be erased. + * @return Status of the Flash page erase operation as described in @ref nvm_status_t. + */ +nvm_status_t FLASH_PageErase(flash_address_t address); + +/** + * @ingroup nvm_driver + * @brief Checks if the Flash is busy. + * @pre NVM must be initialized with @ref NVM_Initialize() before calling this API. + * @param None. + * @retval True - The Flash operation is being performed. + * @retval False - The Flash operation is not being performed. + */ +bool FLASH_IsBusy(void); + +/** + * @ingroup nvm_driver + * @brief Returns the starting address of the page (the first byte location) containing the given Flash address. + * @param [in] address - Flash address for which the page starting address will be obtained. + * @return Starting address of the page containing the given Flash address. + */ +flash_address_t FLASH_PageAddressGet(flash_address_t address); + +/** + * @ingroup nvm_driver + * @brief Returns the offset from the starting address of the page (the first byte location). + * @param [in] address - Flash address for which the offset from the starting address of the page will be obtained. + * @return Offset of the given address from the starting address of the page. + */ +uint16_t FLASH_PageOffsetGet(flash_address_t address); + +//Below macros are added to provide backward compatibility. These will be deprecated in the future versions. +#define FLASH_ErasePageAddressGet FLASH_PageAddressGet +#define FLASH_ErasePageOffsetGet FLASH_PageOffsetGet + +/** + * @ingroup nvm_driver + * @brief Reads one byte from the given EEPROM address. + * @pre NVM must be initialized with @ref NVM_Initialize() before calling this API. + * @param [in] address - Address of the EEPROM location to be read. + * @return Byte read from the given EEPROM address. + */ +eeprom_data_t EEPROM_Read(eeprom_address_t address); + +/** + * @ingroup nvm_driver + * @brief Writes one byte to the given EEPROM address. + * The EEPROM Busy status must be checked using the @ref EEPROM_IsBusy() API to know if the write operation is completed. + * Use the @ref NVM_StatusGet() API to see the result of the write operation. + * @param [in] address - Address of the EEPROM location to be written. + * @param [in] data - Byte to be written to the given EEPROM location. + * @return None. + */ +void EEPROM_Write(eeprom_address_t address, eeprom_data_t data); + +/** + * @ingroup nvm_driver + * @brief Checks if the EEPROM is busy. + * @pre NVM must be initialized with @ref NVM_Initialize() before calling this API. + * @param None. + * @retval True - The EEPROM operation is being performed. + * @retval False - The EEPROM operation is not being performed. + */ +bool EEPROM_IsBusy(void); + +#endif //NVM_H diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/nvm/src/nvm.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/nvm/src/nvm.c new file mode 100644 index 0000000..18b6907 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/nvm/src/nvm.c @@ -0,0 +1,157 @@ +/** + * + * @file nvm.c + * + * @ingroup nvm_driver + * + * @brief Contains the implementation file for the NVM driver. + * + * @version NVM Driver Version 3.0.0 + */ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include +#include "../../system/ccp.h" +#include "../nvm.h" + +void NVM_Initialize(void) +{ + NVM_StatusClear(); + //APPCODEWP disabled; APPDATAWP disabled; BOOTRP disabled; FLMAP SECTION0; FLMAPLOCK disabled; + NVMCTRL.CTRLB = 0x0; +} + +nvm_status_t NVM_StatusGet(void) +{ + return (((NVMCTRL.STATUS & NVMCTRL_ERROR_gm) != 0) ? NVM_ERROR : NVM_OK); +} + +void NVM_StatusClear(void) +{ + NVMCTRL.STATUS &= ~NVMCTRL_ERROR_gm; +} + +static void FLASH_SpmWriteWord(flash_address_t address, uint16_t data) +{ + __asm__ __volatile__( + "push r0\n\t" /* back up R0*/\ + "movw r0, %A1\n\t" /* update R0,R1 pair with word*/\ + "movw r30, %A0\n\t" /* update R30,R31 pair with address[Byte1,Byte0]*/\ + "spm \n\t" /* spm */\ + "clr r1\n\t" /* R1 is always assumed to be zero by the compiler. Resetting R1 to zero*/\ + "pop r0 \n\t" /* restore R0*/\ + : \ + : "r" ((uint32_t) (address)), "r" ((uint16_t) (data)) \ + : "r30", "r31" /* Clobber R30, R31 to indicate they are used here*/ + ); +} + +flash_data_t FLASH_Read(flash_address_t address) +{ + return pgm_read_byte_near(address); +} + +nvm_status_t FLASH_Write(flash_address_t address, uint16_t data) +{ + //Write the flash page + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_FLWR_gc); + + //Write data to the page buffer + FLASH_SpmWriteWord(address, data); + + //Clear the current command + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_NONE_gc); + + return (((NVMCTRL.STATUS & NVMCTRL_ERROR_gm) != 0) ? NVM_ERROR : NVM_OK); +} + +nvm_status_t FLASH_RowWrite(flash_address_t address, flash_data_t *dataBuffer) +{ + uint16_t dataWord; + + //Write the flash page + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_FLWR_gc); + + //Write data to the page buffer, one word at a time + for (uint16_t i = 0; i < PROGMEM_PAGE_SIZE; i = i + 2U) + { + //Access wordwise data from buffer + dataWord = (uint16_t) (dataBuffer[i] | (dataBuffer[i+1U] << 8U)); + FLASH_SpmWriteWord(address + (uint32_t) i, dataWord); + } + + //Clear the current command + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_NONE_gc); + + return (((NVMCTRL.STATUS & NVMCTRL_ERROR_gm) != 0) ? NVM_ERROR : NVM_OK); +} + +nvm_status_t FLASH_PageErase(flash_address_t address) +{ + //Erase the flash page + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_FLPER_gc); + + //Dummy write to start erase operation + FLASH_SpmWriteWord(address, 0); + + //Clear the current command + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_NONE_gc); + + return (((NVMCTRL.STATUS & NVMCTRL_ERROR_gm) != 0) ? NVM_ERROR : NVM_OK); +} + +bool FLASH_IsBusy(void) +{ + return (NVMCTRL.STATUS & NVMCTRL_FBUSY_bm); +} + +flash_address_t FLASH_PageAddressGet(flash_address_t address) +{ + return (flash_address_t) (address & ((PROGMEM_SIZE - 1) ^ (PROGMEM_PAGE_SIZE - 1))); +} + +uint16_t FLASH_PageOffsetGet(flash_address_t address) +{ + return (uint16_t) (address & (PROGMEM_PAGE_SIZE - 1)); +} + +eeprom_data_t EEPROM_Read(eeprom_address_t address) +{ + return *(eeprom_data_t *) address; +} + +void EEPROM_Write(eeprom_address_t address, eeprom_data_t data) +{ + //Program the EEPROM with desired value(s) + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_EEERWR_gc); + + //Write byte to EEPROM + *(uint8_t *) address = data; + + //Clear the current command + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_NONE_gc); +} + +bool EEPROM_IsBusy(void) +{ + return (NVMCTRL.STATUS & NVMCTRL_EEBUSY_bm); +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/spi/spi0.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/spi/spi0.h new file mode 100644 index 0000000..af1d102 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/spi/spi0.h @@ -0,0 +1,223 @@ +/** + * SPI0 Generated Driver API Header File + * + * @file spi0.h + * + * @defgroup spi0 SPI0 + * + * @brief Contains the API prototypes for the SPI0 driver. + * + * @version SPI0 Driver Version 2.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef SPI0_BASIC_H_INCLUDED +#define SPI0_BASIC_H_INCLUDED + +#include "../system/utils/compiler.h" +#include +#include "spi_interface.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern const struct SPI_INTERFACE SPI0_s; + +/** + * @ingroup spi0 + * @typedef void *spi0_TRANSFER_DONE_CB + * @brief Function pointer to the callback function called when there is an SPI interrupt. The default value is set to NULL which means that no callback function will be used. + */ +typedef void (*spi0_TRANSFER_DONE_CB)(void); + +/** + * @ingroup spi0 + * @typedef struct SPI0_configuration_t + * @brief Hardware configuration that controls SPI mode and baud rate + */ +typedef struct +{ + uint8_t CTRLAvalue; + uint8_t CTRLBvalue; +} SPI0_configuration_t; + +/** + * @ingroup spi0 + * @typedef enum spi0_transfer_type_t + * @brief Specifies whether the SPI transfer is to be uni- or bidirectional. A bidirectional transfer (=SPI_EXCHANGE) causes the received data to overwrite the buffer with the data to transmit. + */ +typedef enum spi0_transfer_type +{ + SPI0_EXCHANGE, ///< SPI transfer is bidirectional + SPI0_READ, ///< SPI transfer reads, writes only 0s + SPI0_WRITE ///< SPI transfer writes, discards read data +} spi0_transfer_type_t; + +/** + * @ingroup spi0 + * @typedef enum spi0_transfer_status_t + * @brief Status of the SPI hardware and SPI bus. + */ +typedef enum spi0_transfer_status +{ + SPI0_FREE, ///< SPI hardware is not open, bus is free. + SPI0_IDLE, ///< SPI hardware has been opened, no transfer ongoing. + SPI0_BUSY, ///< SPI hardware has been opened, transfer ongoing. + SPI0_DONE ///< SPI hardware has been opened, transfer complete. +} spi0_transfer_status_t; + +/** + * @ingroup spi0 + * @typedef enum SPI0_configuration_name_t + * @brief Enumeration of the different configurations supported by the driver for SPI interface. + * + * NOTE: A user may specify a configuration, e.g. CLIENT_A, used when communication over SPI with CLIENT_A, and another configuration, CLIENT_B, + * used when communication with CLIENT_B. The configurations may use different SPI configuration such as polarity or SCK frequency. + */ +typedef enum +{ + MAC, + SPI0_DEFAULT +} SPI0_configuration_name_t; + + /** + * @ingroup spi0 + * @brief Initializes the SPI module. + * @param None. + * @return None. + */ +void SPI0_Initialize(void); + +/** + * @ingroup spi0 + * @brief Enables the SPI module. + * @param None. + * @return None. + */ +void SPI0_Enable(void); + +/** + * @ingroup spi0 + * @brief Disables the SPI module. + * @param None. + * @return None. + */ +void SPI0_Disable(void); + +/** + * @ingroup spi0 + * @brief Sets the index of Configuration to use in the transfer. + * @param uint8_t spiConfigIndex - Configuration index. See SPI0_configuration_name_t for configuration list. + * @retval True - SPI open was successful. + * @retval False - SPI open was not successful. + */ +bool SPI0_Open(uint8_t spiConfigIndex); + +/** + * @ingroup spi0 + * @brief Closes the SPI for communication. + * @param None. + * @return None. + */ +void SPI0_Close(void); + +/** + * @ingroup spi0 + * @brief Exchanges one byte over SPI. Blocks until done. + * @param uint8_t byteData - The byte to transfer. + * @return uint8_t - Received data byte. + */ +uint8_t SPI0_ByteExchange(uint8_t byteData); + +/** + * @ingroup spi0 + * @brief Exchanges a buffer over SPI. Blocks if using polled driver. + * @param[inout] void * bufferData The buffer to transfer. Received data is returned here. + * @param[in] size_t bufferSize The size of buffer to transfer. + * @return None. + */ +void SPI0_BufferExchange(void * bufferData, size_t bufferSize); + +/** + * @ingroup spi0 + * @brief Writes a buffer over SPI. Blocks if using polled driver. + * @param[in] void * bufferData The buffer to transfer. + * @param[in] size_t bufferSize The size of buffer to transfer. + * @return None. + */ +void SPI0_BufferWrite(void * bufferData, size_t bufferSize); + +/** + * @ingroup spi0 + * @brief Reads a buffer over SPI. Blocks if using polled driver. + * @param[out] void * bufferData Received data is written here. + * @param[in] size_t bufferSize The size of buffer to transfer. + * @return None. + */ +void SPI0_BufferRead(void * bufferData, size_t bufferSize); + +/** + * @ingroup spi0 + * @brief Writes a data byte to SPI. + * @param uint8_t byteData The byte to transfer. + * @return None. + */ +void SPI0_ByteWrite(uint8_t byteData); + +/** + * @ingroup spi0 + * @brief Gets the received data byte from SPI. + * @param None. + * @return uint8_t - The received data byte. + */ +uint8_t SPI0_ByteRead(void); + +/** + * @ingroup spi0 + * @brief Checks if SPI CLIENT is selected, i.e. its SS pin has been asserted. + * @param None. + * @retval True - SPI is selected. + * @retval False - SPI is not selected. + */ +bool SPI0_Selected(void); + +/** + * @ingroup spi0 + * @brief Waits until SPI has received a data byte. + * @param None. + * @return None. + */ +void SPI0_WaitDataready(void); + +uint8_t __attribute__((deprecated)) SPI0_ExchangeByte(uint8_t data); +void __attribute__((deprecated)) SPI0_ExchangeBlock(void *block, size_t blockSize); +void __attribute__((deprecated)) SPI0_WriteBlock(void *block, size_t blockSize); +void __attribute__((deprecated)) SPI0_ReadBlock(void *block, size_t blockSize); +void __attribute__((deprecated)) SPI0_WriteByte(uint8_t byte); +uint8_t __attribute__((deprecated)) SPI0_ReadByte(void); + +#ifdef __cplusplus +} +#endif + +#endif /* SPI0_BASIC_H_INCLUDED */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/spi/spi_interface.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/spi/spi_interface.h new file mode 100644 index 0000000..ff64abe --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/spi/spi_interface.h @@ -0,0 +1,86 @@ +/** + SPI Generated Driver API interface File + + @Company + Microchip Technology Inc. + + @File Name + spi_interface.h + + @Summary + This is the generated driver interface file for the SPI driver. + + @Description + This interface file provides APIs for driver for SPI. + The generated drivers are tested against the following: + Compiler : XC8 v2.20 + MPLAB : MPLABX v5.40 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef SPI_INTERFACE_H +#define SPI_INTERFACE_H + +/** + Section: Included Files +*/ +#include +#include +#include + +#ifdef __cplusplus + + extern "C" { + +#endif + +/** + Section: Data Type Definitions +*/ + +/** + SPI Driver function structure. + + @Summary + Structure containing the function pointers of SPI driver. + */ +struct SPI_INTERFACE +{ + void (*Initialize)(void); + void (*Close)(void); + bool (*Open)(uint8_t spiConfigIndex); + void (*BufferExchange)(void *bufferData, size_t bufferSize); + void (*BufferRead)(void *bufferData, size_t bufferSize); + void (*BufferWrite)(void *bufferData, size_t bufferSize); + uint8_t (*ByteExchange)(uint8_t byteData); + uint8_t (*ByteRead)(void); + void (*ByteWrite)(uint8_t byteData); +}; + +#ifdef __cplusplus + + } + +#endif + +#endif //SPI_INTERFACE_H diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/spi/src/spi0.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/spi/src/spi0.c new file mode 100644 index 0000000..e495c3c --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/spi/src/spi0.c @@ -0,0 +1,208 @@ +/** + * SPI0 Generated Driver File + * + * @file spi0.c + * + * @ingroup spi0 + * + * @brief Contains the API Implementations for SPI0 module. + * + * @version SPI0 Driver Version 2.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "../spi0.h" + +typedef struct spi0_descriptor_s +{ + spi0_transfer_status_t status; +} spi0_descriptor_t; + +/** + SPI0_DRIVER_FUNCTION object + + @brief Defines an object for SPI_DRIVER_FUNCTIONS. + */ +const struct SPI_INTERFACE SPI0_s = +{ + .Initialize = SPI0_Initialize, + .Close = SPI0_Close, + .Open = SPI0_Open, + .BufferExchange = SPI0_BufferExchange, + .BufferRead = SPI0_BufferRead, + .BufferWrite = SPI0_BufferWrite, + .ByteExchange = SPI0_ByteExchange, + .ByteRead = SPI0_ByteRead, + .ByteWrite = SPI0_ByteWrite, +}; + +SPI0_configuration_t spi0_configurations[] = +{ + { 0x21, 0x0 }, + { 0x20, 0x0 } +}; + +static spi0_descriptor_t spi0_desc; + +void SPI0_Initialize(void) +{ + //BUFEN disabled; BUFWR disabled; MODE 0; SSD disabled; + SPI0.CTRLB = 0x0; + + //CLK2X disabled; DORD disabled; ENABLE disabled; MASTER enabled; PRESC DIV4; + SPI0.CTRLA = 0x20; + + //DREIE disabled; IE disabled; RXCIE disabled; SSIE disabled; TXCIE disabled; + SPI0.INTCTRL = 0x0; + + spi0_desc.status = SPI0_FREE; + + //BUFOVF disabled; DREIF disabled; RXCIF disabled; SSIF disabled; TXCIF disabled; IF disabled; WRCOL disabled; + SPI0.INTFLAGS = 0x0; +} + +void SPI0_Enable(void) +{ + SPI0.CTRLA |= SPI_ENABLE_bm; +} + +void SPI0_Disable(void) +{ + SPI0.CTRLA &= ~SPI_ENABLE_bm; +} + +bool SPI0_Open(uint8_t spiConfigIndex) +{ + if (spi0_desc.status == SPI0_FREE) { + spi0_desc.status = SPI0_IDLE; + SPI0.CTRLB = spi0_configurations[spiConfigIndex].CTRLBvalue; + SPI0.CTRLA = spi0_configurations[spiConfigIndex].CTRLAvalue; + return true; + } else { + return false; + } +} + +void SPI0_Close(void) +{ + spi0_desc.status = SPI0_FREE; +} + +uint8_t SPI0_ByteExchange(uint8_t data) +{ + SPI0.DATA = data; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)); + return SPI0.DATA; +} + +bool SPI0_Selected(void) +{ +/** + * @brief Returns true if SS pin is selected. + * TODO: Place your code here + */ +return true; +} + +void SPI0_WaitDataready(void) +{ + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) + ; +} + +void SPI0_BufferExchange(void *block, size_t size) +{ + uint8_t *b = (uint8_t *)block; + while (size--) { + SPI0.DATA = *b; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) + ; + *b = SPI0.DATA; + b++; + } +} + +void SPI0_BufferWrite(void *block, size_t size) +{ + uint8_t *b = (uint8_t *)block; + uint8_t rdata; + while (size--) { + SPI0.DATA = *b; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) + ; + rdata = SPI0.DATA; + (void)(rdata); // Silence compiler warning + b++; + } +} + +void SPI0_BufferRead(void *block, size_t size) +{ + uint8_t *b = (uint8_t *)block; + while (size--) { + SPI0.DATA = 0; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) + ; + *b = SPI0.DATA; + b++; + } +} + +void SPI0_ByteWrite(uint8_t data) +{ + SPI0.DATA = data; +} + +uint8_t SPI0_ByteRead(void) +{ + return SPI0.DATA; +} + +uint8_t SPI0_ExchangeByte(uint8_t data) +{ + return SPI0_ByteExchange(data); +} + +void SPI0_ExchangeBlock(void *block, size_t blockSize) +{ + SPI0_BufferExchange(block, blockSize); +} + +void SPI0_WriteBlock(void *block, size_t blockSize) +{ + SPI0_BufferWrite(block, blockSize); +} + +void SPI0_ReadBlock(void *block, size_t blockSize) +{ + SPI0_BufferRead(block, blockSize); +} + +void SPI0_WriteByte(uint8_t byte) +{ + SPI0_ByteWrite(byte); +} + +uint8_t SPI0_ReadByte(void) +{ + return SPI0_ByteRead(); +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/ccp.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/ccp.h new file mode 100644 index 0000000..9045036 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/ccp.h @@ -0,0 +1,72 @@ +/** + * CCP Header File + * + * @file ccp.h + * + * @ingroup config_bitsdriver + * + * @brief This file contains the Configuration Change Protection (CCP) header file for the Configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef CPU_CCP_H +#define CPU_CCP_H + +#include "../system/utils/compiler.h" +#include "../system/protected_io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Writes to a CCP-protected 8-bit I/O register. + * @param addr Address of the I/O register. + * @param value Value to be written. + * NOTE: Using IAR Embedded workbench, the choice of memory model has an impact on calling convention. + * Memory model must be defined in the Assembler preprocessor directives to be visible to the preprocessor. + */ +static inline void ccp_write_io(void *addr, uint8_t value) +{ + protected_write_io(addr, CCP_IOREG_gc, value); +} + +/** + * @brief Writes to a CCP-protected 8-bit SPM register. + * @param addr Address of the SPM register. + * @param value Value to be written. + * NOTE: Using IAR Embedded workbench, the choice of memory model has an impacton calling convention. + * Memory model must be defined in the Assembler preprocessor directives to be visible to the preprocessor. + */ +static inline void ccp_write_spm(void *addr, uint8_t value) +{ + protected_write_io(addr, CCP_SPM_gc, value); +} + +#ifdef __cplusplus +} +#endif + +#endif /* CPU_CCP_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/clock.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/clock.h new file mode 100644 index 0000000..a970d5b --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/clock.h @@ -0,0 +1,69 @@ +/** + * CLKCTRL Generated Driver API Header File + * + * @file clkctrl.h + * + * @defgroup clkctrl CLKCTRL + * + * @brief This header file provides APIs for the CLKCTRL driver. + * + * @version CLKCTRL Driver Version 1.0.2 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef CLOCK_H +#define CLOCK_H + +#ifndef F_CPU +#define F_CPU 4000000UL +#endif + +#include "ccp.h" + +#define CLKCTRL_TIMEBASE_VALUE ((uint8_t)ceil(F_CPU * 0.000001)) + +/** + * @ingroup clkctrl + * @brief Initialize CLKCTRL module + * @param none + * @return none + */ +void CLOCK_Initialize(void); + +/** + * @ingroup clkctrl + * @brief Enable Clock Failure Detection on main clock + * @param CLKCTRL_CFDSRC_t cfd_source - main clock source for CFD + * @return none + */ +void CFD_Enable(CLKCTRL_CFDSRC_t cfd_source); + +/** + * @ingroup clkctrl + * @brief Disable Clock Failure Detection on main clock + * @param none + * @return none + */ +void CFD_Disable(); + +#endif // CLOCK_H \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/config_bits.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/config_bits.h new file mode 100644 index 0000000..cd14867 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/config_bits.h @@ -0,0 +1,42 @@ +/** + * CONFIGURATION BITS Generated Driver Header File + * + * @file config_bits.h + * + * @defgroup config_bitsdriver Configuration Bits Driver + * + * @brief This file contains the generated header file for the Configuration bits driver. + * + * @version Driver Version 1.0.4 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef CONFIG_BITS_H +#define CONFIG_BITS_H + +#include "../system/clock.h" + +#endif //CONFIG_BITS_H +/** + End of File +*/ \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/interrupt.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/interrupt.h new file mode 100644 index 0000000..2dc2f85 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/interrupt.h @@ -0,0 +1,57 @@ +/** + * Interrupt Manager Generated Driver API Header File. + * + * @file interrupt.h + * + * @defgroup interrupt INTERRUPT + * + * @brief This file contains the API prototype for the Interrupt Manager. + * + * @version Interrupt Manager Driver Version 1.0.0 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef INTERRUPT_H +#define INTERRUPT_H + +#include "../system/utils/compiler.h" +#include "ccp.h" +#include "../system/utils/atomic.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup interrupt + * @brief Initializes the Interrupt module. + * @retval 0 - Initialization is successful. + */ +int8_t CPUINT_Initialize(); + +#ifdef __cplusplus +} +#endif + +#endif /* INTERRUPT_H */ \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/pins.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/pins.h new file mode 100644 index 0000000..e919da2 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/pins.h @@ -0,0 +1,288 @@ +/** + * Generated Pins header File + * + * @file pins.h + * + * @defgroup pinsdriver Pins Driver + * + * @brief This is generated driver header for pins. + * This header file provides APIs for all pins selected in the GUI. + * + * @version Driver Version 1.1.0 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef PINS_H_INCLUDED +#define PINS_H_INCLUDED + +#include +#include "./port.h" + +//get/set ETH_CS aliases +#define ETH_CS_SetHigh() do { PORTA_OUTSET = 0x80; } while(0) +#define ETH_CS_SetLow() do { PORTA_OUTCLR = 0x80; } while(0) +#define ETH_CS_Toggle() do { PORTA_OUTTGL = 0x80; } while(0) +#define ETH_CS_GetValue() (VPORTA.IN & (0x1 << 7)) +#define ETH_CS_SetDigitalInput() do { PORTA_DIRCLR = 0x80; } while(0) +#define ETH_CS_SetDigitalOutput() do { PORTA_DIRSET = 0x80; } while(0) +#define ETH_CS_SetPullUp() do { PORTA_PIN7CTRL |= PORT_PULLUPEN_bm; } while(0) +#define ETH_CS_ResetPullUp() do { PORTA_PIN7CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define ETH_CS_SetInverted() do { PORTA_PIN7CTRL |= PORT_INVEN_bm; } while(0) +#define ETH_CS_ResetInverted() do { PORTA_PIN7CTRL &= ~PORT_INVEN_bm; } while(0) +#define ETH_CS_DisableInterruptOnChange() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define ETH_CS_EnableInterruptForBothEdges() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define ETH_CS_EnableInterruptForRisingEdge() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define ETH_CS_EnableInterruptForFallingEdge() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define ETH_CS_DisableDigitalInputBuffer() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define ETH_CS_EnableInterruptForLowLevelSensing() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PA7_SetInterruptHandler ETH_CS_SetInterruptHandler + +//get/set IO_PA5 aliases +#define IO_PA5_SetHigh() do { PORTA_OUTSET = 0x20; } while(0) +#define IO_PA5_SetLow() do { PORTA_OUTCLR = 0x20; } while(0) +#define IO_PA5_Toggle() do { PORTA_OUTTGL = 0x20; } while(0) +#define IO_PA5_GetValue() (VPORTA.IN & (0x1 << 5)) +#define IO_PA5_SetDigitalInput() do { PORTA_DIRCLR = 0x20; } while(0) +#define IO_PA5_SetDigitalOutput() do { PORTA_DIRSET = 0x20; } while(0) +#define IO_PA5_SetPullUp() do { PORTA_PIN5CTRL |= PORT_PULLUPEN_bm; } while(0) +#define IO_PA5_ResetPullUp() do { PORTA_PIN5CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define IO_PA5_SetInverted() do { PORTA_PIN5CTRL |= PORT_INVEN_bm; } while(0) +#define IO_PA5_ResetInverted() do { PORTA_PIN5CTRL &= ~PORT_INVEN_bm; } while(0) +#define IO_PA5_DisableInterruptOnChange() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define IO_PA5_EnableInterruptForBothEdges() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define IO_PA5_EnableInterruptForRisingEdge() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define IO_PA5_EnableInterruptForFallingEdge() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define IO_PA5_DisableDigitalInputBuffer() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define IO_PA5_EnableInterruptForLowLevelSensing() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PA5_SetInterruptHandler IO_PA5_SetInterruptHandler + +//get/set IO_PA4 aliases +#define IO_PA4_SetHigh() do { PORTA_OUTSET = 0x10; } while(0) +#define IO_PA4_SetLow() do { PORTA_OUTCLR = 0x10; } while(0) +#define IO_PA4_Toggle() do { PORTA_OUTTGL = 0x10; } while(0) +#define IO_PA4_GetValue() (VPORTA.IN & (0x1 << 4)) +#define IO_PA4_SetDigitalInput() do { PORTA_DIRCLR = 0x10; } while(0) +#define IO_PA4_SetDigitalOutput() do { PORTA_DIRSET = 0x10; } while(0) +#define IO_PA4_SetPullUp() do { PORTA_PIN4CTRL |= PORT_PULLUPEN_bm; } while(0) +#define IO_PA4_ResetPullUp() do { PORTA_PIN4CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define IO_PA4_SetInverted() do { PORTA_PIN4CTRL |= PORT_INVEN_bm; } while(0) +#define IO_PA4_ResetInverted() do { PORTA_PIN4CTRL &= ~PORT_INVEN_bm; } while(0) +#define IO_PA4_DisableInterruptOnChange() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define IO_PA4_EnableInterruptForBothEdges() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define IO_PA4_EnableInterruptForRisingEdge() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define IO_PA4_EnableInterruptForFallingEdge() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define IO_PA4_DisableDigitalInputBuffer() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define IO_PA4_EnableInterruptForLowLevelSensing() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PA4_SetInterruptHandler IO_PA4_SetInterruptHandler + +//get/set IO_PA6 aliases +#define IO_PA6_SetHigh() do { PORTA_OUTSET = 0x40; } while(0) +#define IO_PA6_SetLow() do { PORTA_OUTCLR = 0x40; } while(0) +#define IO_PA6_Toggle() do { PORTA_OUTTGL = 0x40; } while(0) +#define IO_PA6_GetValue() (VPORTA.IN & (0x1 << 6)) +#define IO_PA6_SetDigitalInput() do { PORTA_DIRCLR = 0x40; } while(0) +#define IO_PA6_SetDigitalOutput() do { PORTA_DIRSET = 0x40; } while(0) +#define IO_PA6_SetPullUp() do { PORTA_PIN6CTRL |= PORT_PULLUPEN_bm; } while(0) +#define IO_PA6_ResetPullUp() do { PORTA_PIN6CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define IO_PA6_SetInverted() do { PORTA_PIN6CTRL |= PORT_INVEN_bm; } while(0) +#define IO_PA6_ResetInverted() do { PORTA_PIN6CTRL &= ~PORT_INVEN_bm; } while(0) +#define IO_PA6_DisableInterruptOnChange() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define IO_PA6_EnableInterruptForBothEdges() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define IO_PA6_EnableInterruptForRisingEdge() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define IO_PA6_EnableInterruptForFallingEdge() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define IO_PA6_DisableDigitalInputBuffer() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define IO_PA6_EnableInterruptForLowLevelSensing() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PA6_SetInterruptHandler IO_PA6_SetInterruptHandler + +//get/set SW0 aliases +#define SW0_SetHigh() do { PORTF_OUTSET = 0x40; } while(0) +#define SW0_SetLow() do { PORTF_OUTCLR = 0x40; } while(0) +#define SW0_Toggle() do { PORTF_OUTTGL = 0x40; } while(0) +#define SW0_GetValue() (VPORTF.IN & (0x1 << 6)) +#define SW0_SetDigitalInput() do { PORTF_DIRCLR = 0x40; } while(0) +#define SW0_SetDigitalOutput() do { PORTF_DIRSET = 0x40; } while(0) +#define SW0_SetPullUp() do { PORTF_PIN6CTRL |= PORT_PULLUPEN_bm; } while(0) +#define SW0_ResetPullUp() do { PORTF_PIN6CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define SW0_SetInverted() do { PORTF_PIN6CTRL |= PORT_INVEN_bm; } while(0) +#define SW0_ResetInverted() do { PORTF_PIN6CTRL &= ~PORT_INVEN_bm; } while(0) +#define SW0_DisableInterruptOnChange() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define SW0_EnableInterruptForBothEdges() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define SW0_EnableInterruptForRisingEdge() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define SW0_EnableInterruptForFallingEdge() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define SW0_DisableDigitalInputBuffer() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define SW0_EnableInterruptForLowLevelSensing() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PF6_SetInterruptHandler SW0_SetInterruptHandler + +//get/set LED0 aliases +#define LED0_SetHigh() do { PORTF_OUTSET = 0x20; } while(0) +#define LED0_SetLow() do { PORTF_OUTCLR = 0x20; } while(0) +#define LED0_Toggle() do { PORTF_OUTTGL = 0x20; } while(0) +#define LED0_GetValue() (VPORTF.IN & (0x1 << 5)) +#define LED0_SetDigitalInput() do { PORTF_DIRCLR = 0x20; } while(0) +#define LED0_SetDigitalOutput() do { PORTF_DIRSET = 0x20; } while(0) +#define LED0_SetPullUp() do { PORTF_PIN5CTRL |= PORT_PULLUPEN_bm; } while(0) +#define LED0_ResetPullUp() do { PORTF_PIN5CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define LED0_SetInverted() do { PORTF_PIN5CTRL |= PORT_INVEN_bm; } while(0) +#define LED0_ResetInverted() do { PORTF_PIN5CTRL &= ~PORT_INVEN_bm; } while(0) +#define LED0_DisableInterruptOnChange() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define LED0_EnableInterruptForBothEdges() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define LED0_EnableInterruptForRisingEdge() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define LED0_EnableInterruptForFallingEdge() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define LED0_DisableDigitalInputBuffer() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define LED0_EnableInterruptForLowLevelSensing() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PF5_SetInterruptHandler LED0_SetInterruptHandler + +/** + * @ingroup pinsdriver + * @brief GPIO and peripheral I/O initialization + * @param none + * @return none + */ +void PIN_MANAGER_Initialize(); + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for ETH_CS pin. + * This is a predefined interrupt handler to be used together with the ETH_CS_SetInterruptHandler() method. + * This handler is called every time the ETH_CS ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void ETH_CS_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for ETH_CS pin input-sense-config functionality. + * Allows selecting an interrupt handler for ETH_CS at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void ETH_CS_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for IO_PA5 pin. + * This is a predefined interrupt handler to be used together with the IO_PA5_SetInterruptHandler() method. + * This handler is called every time the IO_PA5 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void IO_PA5_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for IO_PA5 pin input-sense-config functionality. + * Allows selecting an interrupt handler for IO_PA5 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void IO_PA5_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for IO_PA4 pin. + * This is a predefined interrupt handler to be used together with the IO_PA4_SetInterruptHandler() method. + * This handler is called every time the IO_PA4 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void IO_PA4_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for IO_PA4 pin input-sense-config functionality. + * Allows selecting an interrupt handler for IO_PA4 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void IO_PA4_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for IO_PA6 pin. + * This is a predefined interrupt handler to be used together with the IO_PA6_SetInterruptHandler() method. + * This handler is called every time the IO_PA6 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void IO_PA6_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for IO_PA6 pin input-sense-config functionality. + * Allows selecting an interrupt handler for IO_PA6 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void IO_PA6_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for SW0 pin. + * This is a predefined interrupt handler to be used together with the SW0_SetInterruptHandler() method. + * This handler is called every time the SW0 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void SW0_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for SW0 pin input-sense-config functionality. + * Allows selecting an interrupt handler for SW0 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void SW0_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for LED0 pin. + * This is a predefined interrupt handler to be used together with the LED0_SetInterruptHandler() method. + * This handler is called every time the LED0 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void LED0_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for LED0 pin input-sense-config functionality. + * Allows selecting an interrupt handler for LED0 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void LED0_SetInterruptHandler(void (* interruptHandler)(void)) ; +#endif /* PINS_H_INCLUDED */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/port.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/port.h new file mode 100644 index 0000000..7525afb --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/port.h @@ -0,0 +1,902 @@ +/** + * Generated Ports header File + * + * @file port.h + * + * @ingroup pinsdriver + * + * @brief This Source file provides APIs. + * + * @version Driver Version 1.0.1 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef PORT_INCLUDED +#define PORT_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +#include "utils/compiler.h" + +/* @ingroup pinsdriver + * @enum port_pull_mode + * Defines the pullup modes. + */ +enum port_pull_mode { + PORT_PULL_OFF, + PORT_PULL_UP, +}; + +/* @ingroup pinsdriver + * @enum port_dir + * Defines the port directions. + */ +enum port_dir { + PORT_DIR_IN, + PORT_DIR_OUT, + PORT_DIR_OFF, +}; + +/** + * @ingroup pinsdriver + * @brief Set port pin pull mode, Configure pin to pull up, down or disable pull mode, supported pull modes are defined by device used. + * @param pin The pin number within port + * @param pull_mode Pin pull mode + * @return none + */ +static inline void PORTA_set_pin_pull_mode(const uint8_t pin, const enum port_pull_mode pull_mode) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTA + 0x10 + pin); + + if (pull_mode == PORT_PULL_UP) { + *port_pin_ctrl |= PORT_PULLUPEN_bm; + } else if (pull_mode == PORT_PULL_OFF) { + *port_pin_ctrl &= ~PORT_PULLUPEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin inverted mode, Configure pin invert I/O or not. + * @param pin The pin number within port + * @param inverted Pin inverted mode + * @return none + */ +static inline void PORTA_pin_set_inverted(const uint8_t pin, const bool inverted) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTA + 0x10 + pin); + + if (inverted) { + *port_pin_ctrl |= PORT_INVEN_bm; + } else { + *port_pin_ctrl &= ~PORT_INVEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin input/sense configuration, Enable/disable digital input buffer and pin change interrupt, + * select pin interrupt edge/level sensing mode + * @param The pin number within port + * @param isc PORT_ISC_t + * @return none + */ +static inline void PORTA_pin_set_isc(const uint8_t pin, const PORT_ISC_t isc) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTA + 0x10 + pin); + + *port_pin_ctrl = (*port_pin_ctrl & ~PORT_ISC_gm) | isc; +} + +/** + * @ingroup pinsdriver + * @brief Set port data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param mask Bit mask where 1 means apply direction setting to the + * corresponding pin + * @param dir port_dir + * @return none + */ +static inline void PORTA_set_port_dir(const uint8_t mask, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTA.DIR &= ~mask; + break; + case PORT_DIR_OUT: + VPORTA.DIR |= mask; + break; + case PORT_DIR_OFF: + /*/ should activate the pullup for power saving + but a bit costly to do it here */ + { + for (uint8_t i = 0; i < 8; i++) { + if (mask & 1 << i) { + *((uint8_t *)&PORTA + 0x10 + i) |= 1 << PORT_PULLUPEN_bp; + } + } + } + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param pin The pin number within port + * @param dir port_dir + * @return none + */ +static inline void PORTA_set_pin_dir(const uint8_t pin, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTA.DIR &= ~(1 << pin); + break; + case PORT_DIR_OUT: + VPORTA.DIR |= (1 << pin); + break; + case PORT_DIR_OFF: + *((uint8_t *)&PORTA + 0x10 + pin) |= 1 << PORT_PULLUPEN_bp; + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on the pins defined by the bit mask. + * + * @param mask Bit mask where 1 means apply port level to the corresponding + * pin + * @param level -boolean value that defines the logic state of the pin level + * false = Pin levels set to "low" state + * @return none + */ +static inline void PORTA_set_port_level(const uint8_t mask, const bool level) +{ + if (level == true) { + VPORTA.OUT |= mask; + } else { + VPORTA.OUT &= ~mask; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on a pin. + * + * @param pin The pin number within port + * @param level -boolean value that defines the logic state of the pin level + * @return none + */ +static inline void PORTA_set_pin_level(const uint8_t pin, const bool level) +{ + if (level == true) { + VPORTA.OUT |= (1 << pin); + } else { + VPORTA.OUT &= ~(1 << pin); + } +} + +/** + * @ingroup pinsdriver + * @brief Toggle out level on pins, Toggle the pin levels on pins defined by bit mask. + * + * @param mask Bit mask where 1 means toggle pin level to the corresponding + * pin + * @return none + */ +static inline void PORTA_toggle_port_level(const uint8_t mask) +{ + PORTA.OUTTGL = mask; +} + +/** + * @ingroup pinsdriver + * @brief Toggle output level on pin, Toggle the pin levels on pins defined by bit mask. + * + * @param pin The pin number within port + * @return none + */ +static inline void PORTA_toggle_pin_level(const uint8_t pin) +{ + PORTA.OUTTGL = 1 << pin; +} + +/** + * @ingroup pinsdriver + * @brief Get input level on pins, Read the input level on pins connected to a port. + * + * @param none + * @return none + */ +static inline uint8_t PORTA_get_port_level() +{ + return VPORTA.IN; +} + +/** + * @ingroup pinsdriver + * @brief Get level on pin, Reads the level on pins connected to a port. + * + * @param pin The pin number within port + * @return none + */ +static inline bool PORTA_get_pin_level(const uint8_t pin) +{ + return VPORTA.IN & (1 << pin); +} + +/** + * @ingroup pinsdriver + * @brief Write value to Port, Write directly to the port OUT register. + * + * @param value Value to write to the port register + * @return none + */ +static inline void PORTA_write_port(const uint8_t value) +{ + VPORTA.OUT = value; +} + +/** + * @ingroup pinsdriver + * @brief Set port pin pull mode, Configure pin to pull up, down or disable pull mode, supported pull modes are defined by device used. + * @param pin The pin number within port + * @param pull_mode Pin pull mode + * @return none + */ +static inline void PORTC_set_pin_pull_mode(const uint8_t pin, const enum port_pull_mode pull_mode) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTC + 0x10 + pin); + + if (pull_mode == PORT_PULL_UP) { + *port_pin_ctrl |= PORT_PULLUPEN_bm; + } else if (pull_mode == PORT_PULL_OFF) { + *port_pin_ctrl &= ~PORT_PULLUPEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin inverted mode, Configure pin invert I/O or not. + * @param pin The pin number within port + * @param inverted Pin inverted mode + * @return none + */ +static inline void PORTC_pin_set_inverted(const uint8_t pin, const bool inverted) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTC + 0x10 + pin); + + if (inverted) { + *port_pin_ctrl |= PORT_INVEN_bm; + } else { + *port_pin_ctrl &= ~PORT_INVEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin input/sense configuration, Enable/disable digital input buffer and pin change interrupt, + * select pin interrupt edge/level sensing mode + * @param The pin number within port + * @param isc PORT_ISC_t + * @return none + */ +static inline void PORTC_pin_set_isc(const uint8_t pin, const PORT_ISC_t isc) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTC + 0x10 + pin); + + *port_pin_ctrl = (*port_pin_ctrl & ~PORT_ISC_gm) | isc; +} + +/** + * @ingroup pinsdriver + * @brief Set port data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param mask Bit mask where 1 means apply direction setting to the + * corresponding pin + * @param dir port_dir + * @return none + */ +static inline void PORTC_set_port_dir(const uint8_t mask, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTC.DIR &= ~mask; + break; + case PORT_DIR_OUT: + VPORTC.DIR |= mask; + break; + case PORT_DIR_OFF: + /*/ should activate the pullup for power saving + but a bit costly to do it here */ + { + for (uint8_t i = 0; i < 8; i++) { + if (mask & 1 << i) { + *((uint8_t *)&PORTC + 0x10 + i) |= 1 << PORT_PULLUPEN_bp; + } + } + } + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param pin The pin number within port + * @param dir port_dir + * @return none + */ +static inline void PORTC_set_pin_dir(const uint8_t pin, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTC.DIR &= ~(1 << pin); + break; + case PORT_DIR_OUT: + VPORTC.DIR |= (1 << pin); + break; + case PORT_DIR_OFF: + *((uint8_t *)&PORTC + 0x10 + pin) |= 1 << PORT_PULLUPEN_bp; + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on the pins defined by the bit mask. + * + * @param mask Bit mask where 1 means apply port level to the corresponding + * pin + * @param level -boolean value that defines the logic state of the pin level + * false = Pin levels set to "low" state + * @return none + */ +static inline void PORTC_set_port_level(const uint8_t mask, const bool level) +{ + if (level == true) { + VPORTC.OUT |= mask; + } else { + VPORTC.OUT &= ~mask; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on a pin. + * + * @param pin The pin number within port + * @param level -boolean value that defines the logic state of the pin level + * @return none + */ +static inline void PORTC_set_pin_level(const uint8_t pin, const bool level) +{ + if (level == true) { + VPORTC.OUT |= (1 << pin); + } else { + VPORTC.OUT &= ~(1 << pin); + } +} + +/** + * @ingroup pinsdriver + * @brief Toggle out level on pins, Toggle the pin levels on pins defined by bit mask. + * + * @param mask Bit mask where 1 means toggle pin level to the corresponding + * pin + * @return none + */ +static inline void PORTC_toggle_port_level(const uint8_t mask) +{ + PORTC.OUTTGL = mask; +} + +/** + * @ingroup pinsdriver + * @brief Toggle output level on pin, Toggle the pin levels on pins defined by bit mask. + * + * @param pin The pin number within port + * @return none + */ +static inline void PORTC_toggle_pin_level(const uint8_t pin) +{ + PORTC.OUTTGL = 1 << pin; +} + +/** + * @ingroup pinsdriver + * @brief Get input level on pins, Read the input level on pins connected to a port. + * + * @param none + * @return none + */ +static inline uint8_t PORTC_get_port_level() +{ + return VPORTC.IN; +} + +/** + * @ingroup pinsdriver + * @brief Get level on pin, Reads the level on pins connected to a port. + * + * @param pin The pin number within port + * @return none + */ +static inline bool PORTC_get_pin_level(const uint8_t pin) +{ + return VPORTC.IN & (1 << pin); +} + +/** + * @ingroup pinsdriver + * @brief Write value to Port, Write directly to the port OUT register. + * + * @param value Value to write to the port register + * @return none + */ +static inline void PORTC_write_port(const uint8_t value) +{ + VPORTC.OUT = value; +} + +/** + * @ingroup pinsdriver + * @brief Set port pin pull mode, Configure pin to pull up, down or disable pull mode, supported pull modes are defined by device used. + * @param pin The pin number within port + * @param pull_mode Pin pull mode + * @return none + */ +static inline void PORTD_set_pin_pull_mode(const uint8_t pin, const enum port_pull_mode pull_mode) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTD + 0x10 + pin); + + if (pull_mode == PORT_PULL_UP) { + *port_pin_ctrl |= PORT_PULLUPEN_bm; + } else if (pull_mode == PORT_PULL_OFF) { + *port_pin_ctrl &= ~PORT_PULLUPEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin inverted mode, Configure pin invert I/O or not. + * @param pin The pin number within port + * @param inverted Pin inverted mode + * @return none + */ +static inline void PORTD_pin_set_inverted(const uint8_t pin, const bool inverted) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTD + 0x10 + pin); + + if (inverted) { + *port_pin_ctrl |= PORT_INVEN_bm; + } else { + *port_pin_ctrl &= ~PORT_INVEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin input/sense configuration, Enable/disable digital input buffer and pin change interrupt, + * select pin interrupt edge/level sensing mode + * @param The pin number within port + * @param isc PORT_ISC_t + * @return none + */ +static inline void PORTD_pin_set_isc(const uint8_t pin, const PORT_ISC_t isc) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTD + 0x10 + pin); + + *port_pin_ctrl = (*port_pin_ctrl & ~PORT_ISC_gm) | isc; +} + +/** + * @ingroup pinsdriver + * @brief Set port data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param mask Bit mask where 1 means apply direction setting to the + * corresponding pin + * @param dir port_dir + * @return none + */ +static inline void PORTD_set_port_dir(const uint8_t mask, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTD.DIR &= ~mask; + break; + case PORT_DIR_OUT: + VPORTD.DIR |= mask; + break; + case PORT_DIR_OFF: + /*/ should activate the pullup for power saving + but a bit costly to do it here */ + { + for (uint8_t i = 0; i < 8; i++) { + if (mask & 1 << i) { + *((uint8_t *)&PORTD + 0x10 + i) |= 1 << PORT_PULLUPEN_bp; + } + } + } + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param pin The pin number within port + * @param dir port_dir + * @return none + */ +static inline void PORTD_set_pin_dir(const uint8_t pin, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTD.DIR &= ~(1 << pin); + break; + case PORT_DIR_OUT: + VPORTD.DIR |= (1 << pin); + break; + case PORT_DIR_OFF: + *((uint8_t *)&PORTD + 0x10 + pin) |= 1 << PORT_PULLUPEN_bp; + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on the pins defined by the bit mask. + * + * @param mask Bit mask where 1 means apply port level to the corresponding + * pin + * @param level -boolean value that defines the logic state of the pin level + * false = Pin levels set to "low" state + * @return none + */ +static inline void PORTD_set_port_level(const uint8_t mask, const bool level) +{ + if (level == true) { + VPORTD.OUT |= mask; + } else { + VPORTD.OUT &= ~mask; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on a pin. + * + * @param pin The pin number within port + * @param level -boolean value that defines the logic state of the pin level + * @return none + */ +static inline void PORTD_set_pin_level(const uint8_t pin, const bool level) +{ + if (level == true) { + VPORTD.OUT |= (1 << pin); + } else { + VPORTD.OUT &= ~(1 << pin); + } +} + +/** + * @ingroup pinsdriver + * @brief Toggle out level on pins, Toggle the pin levels on pins defined by bit mask. + * + * @param mask Bit mask where 1 means toggle pin level to the corresponding + * pin + * @return none + */ +static inline void PORTD_toggle_port_level(const uint8_t mask) +{ + PORTD.OUTTGL = mask; +} + +/** + * @ingroup pinsdriver + * @brief Toggle output level on pin, Toggle the pin levels on pins defined by bit mask. + * + * @param pin The pin number within port + * @return none + */ +static inline void PORTD_toggle_pin_level(const uint8_t pin) +{ + PORTD.OUTTGL = 1 << pin; +} + +/** + * @ingroup pinsdriver + * @brief Get input level on pins, Read the input level on pins connected to a port. + * + * @param none + * @return none + */ +static inline uint8_t PORTD_get_port_level() +{ + return VPORTD.IN; +} + +/** + * @ingroup pinsdriver + * @brief Get level on pin, Reads the level on pins connected to a port. + * + * @param pin The pin number within port + * @return none + */ +static inline bool PORTD_get_pin_level(const uint8_t pin) +{ + return VPORTD.IN & (1 << pin); +} + +/** + * @ingroup pinsdriver + * @brief Write value to Port, Write directly to the port OUT register. + * + * @param value Value to write to the port register + * @return none + */ +static inline void PORTD_write_port(const uint8_t value) +{ + VPORTD.OUT = value; +} + +/** + * @ingroup pinsdriver + * @brief Set port pin pull mode, Configure pin to pull up, down or disable pull mode, supported pull modes are defined by device used. + * @param pin The pin number within port + * @param pull_mode Pin pull mode + * @return none + */ +static inline void PORTF_set_pin_pull_mode(const uint8_t pin, const enum port_pull_mode pull_mode) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTF + 0x10 + pin); + + if (pull_mode == PORT_PULL_UP) { + *port_pin_ctrl |= PORT_PULLUPEN_bm; + } else if (pull_mode == PORT_PULL_OFF) { + *port_pin_ctrl &= ~PORT_PULLUPEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin inverted mode, Configure pin invert I/O or not. + * @param pin The pin number within port + * @param inverted Pin inverted mode + * @return none + */ +static inline void PORTF_pin_set_inverted(const uint8_t pin, const bool inverted) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTF + 0x10 + pin); + + if (inverted) { + *port_pin_ctrl |= PORT_INVEN_bm; + } else { + *port_pin_ctrl &= ~PORT_INVEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin input/sense configuration, Enable/disable digital input buffer and pin change interrupt, + * select pin interrupt edge/level sensing mode + * @param The pin number within port + * @param isc PORT_ISC_t + * @return none + */ +static inline void PORTF_pin_set_isc(const uint8_t pin, const PORT_ISC_t isc) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTF + 0x10 + pin); + + *port_pin_ctrl = (*port_pin_ctrl & ~PORT_ISC_gm) | isc; +} + +/** + * @ingroup pinsdriver + * @brief Set port data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param mask Bit mask where 1 means apply direction setting to the + * corresponding pin + * @param dir port_dir + * @return none + */ +static inline void PORTF_set_port_dir(const uint8_t mask, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTF.DIR &= ~mask; + break; + case PORT_DIR_OUT: + VPORTF.DIR |= mask; + break; + case PORT_DIR_OFF: + /*/ should activate the pullup for power saving + but a bit costly to do it here */ + { + for (uint8_t i = 0; i < 8; i++) { + if (mask & 1 << i) { + *((uint8_t *)&PORTF + 0x10 + i) |= 1 << PORT_PULLUPEN_bp; + } + } + } + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param pin The pin number within port + * @param dir port_dir + * @return none + */ +static inline void PORTF_set_pin_dir(const uint8_t pin, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTF.DIR &= ~(1 << pin); + break; + case PORT_DIR_OUT: + VPORTF.DIR |= (1 << pin); + break; + case PORT_DIR_OFF: + *((uint8_t *)&PORTF + 0x10 + pin) |= 1 << PORT_PULLUPEN_bp; + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on the pins defined by the bit mask. + * + * @param mask Bit mask where 1 means apply port level to the corresponding + * pin + * @param level -boolean value that defines the logic state of the pin level + * false = Pin levels set to "low" state + * @return none + */ +static inline void PORTF_set_port_level(const uint8_t mask, const bool level) +{ + if (level == true) { + VPORTF.OUT |= mask; + } else { + VPORTF.OUT &= ~mask; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on a pin. + * + * @param pin The pin number within port + * @param level -boolean value that defines the logic state of the pin level + * @return none + */ +static inline void PORTF_set_pin_level(const uint8_t pin, const bool level) +{ + if (level == true) { + VPORTF.OUT |= (1 << pin); + } else { + VPORTF.OUT &= ~(1 << pin); + } +} + +/** + * @ingroup pinsdriver + * @brief Toggle out level on pins, Toggle the pin levels on pins defined by bit mask. + * + * @param mask Bit mask where 1 means toggle pin level to the corresponding + * pin + * @return none + */ +static inline void PORTF_toggle_port_level(const uint8_t mask) +{ + PORTF.OUTTGL = mask; +} + +/** + * @ingroup pinsdriver + * @brief Toggle output level on pin, Toggle the pin levels on pins defined by bit mask. + * + * @param pin The pin number within port + * @return none + */ +static inline void PORTF_toggle_pin_level(const uint8_t pin) +{ + PORTF.OUTTGL = 1 << pin; +} + +/** + * @ingroup pinsdriver + * @brief Get input level on pins, Read the input level on pins connected to a port. + * + * @param none + * @return none + */ +static inline uint8_t PORTF_get_port_level() +{ + return VPORTF.IN; +} + +/** + * @ingroup pinsdriver + * @brief Get level on pin, Reads the level on pins connected to a port. + * + * @param pin The pin number within port + * @return none + */ +static inline bool PORTF_get_pin_level(const uint8_t pin) +{ + return VPORTF.IN & (1 << pin); +} + +/** + * @ingroup pinsdriver + * @brief Write value to Port, Write directly to the port OUT register. + * + * @param value Value to write to the port register + * @return none + */ +static inline void PORTF_write_port(const uint8_t value) +{ + VPORTF.OUT = value; +} +#ifdef __cplusplus +} +#endif + +#endif /* PORT_INCLUDED */ \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/protected_io.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/protected_io.h new file mode 100644 index 0000000..586576b --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/protected_io.h @@ -0,0 +1,80 @@ +/** + * protected_io Header File + * + * @file protected_io.h + * + * @defgroup doc_driver_system_protected_io Protected IO + * + * @brief This file contains the generated prtected_io header file for the CONFIGURATION BITS. + * + * @version Driver Version 1.0.0 + * + *@{ +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef PROTECTED_IO_H +#define PROTECTED_IO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__DOXYGEN__) +//! \name IAR Memory Model defines. +//@{ + +/** + * @def CONFIG_MEMORY_MODEL_TINY + * @brief Configuration symbol to enable 8 bit pointers. + */ +#define CONFIG_MEMORY_MODEL_TINY + +/** + * @def CONFIG_MEMORY_MODEL_SMALL + * @brief Configuration symbol to enable 16 bit pointers. + * NOTE: If no memory model is defined, SMALL is default. + */ +#define CONFIG_MEMORY_MODEL_SMALL + +/** + * @def CONFIG_MEMORY_MODEL_LARGE + * @brief Configuration symbol to enable 24 bit pointers. + */ +#define CONFIG_MEMORY_MODEL_LARGE + +//@} +#endif + +/** + * @brief Writes to an 8-bit I/O register protected by CCP or a protection bit. + * @param addr Address of the I/O register. + * @param magic CCP magic value or Mask for protection bit. + * @param value Value to be written. + * NOTE: Using IAR Embedded workbench, the choice of memory model has an impact on calling convention. + * Memory model must be defined in the Assembler preprocessor directives to be visible to the preprocessor. + */ +extern void protected_write_io(void *addr, uint8_t magic, uint8_t value); + +/** @} */ + +#endif /* PROTECTED_IO_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/clock.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/clock.c new file mode 100644 index 0000000..63ef8c4 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/clock.c @@ -0,0 +1,99 @@ +/** + * CLKCTRL Generated Driver File + * + * @file clkctrl.c + * + * @ingroup clkctrl + * + * @brief This file contains the driver code for CLKCTRL module. + * + * version CLKCTRL Driver Version 1.1.3 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#include "../clock.h" + +void CLOCK_Initialize(void) +{ + // Set the CLKCTRL module to the options selected in the user interface. + + //CLKOUT disabled; CLKSEL Internal high-frequency oscillator; + ccp_write_io((void*)&(CLKCTRL.MCLKCTRLA),0x0); + + //PDIV 2X; PEN disabled; + ccp_write_io((void*)&(CLKCTRL.MCLKCTRLB),0x0); + + //EXTS disabled; OSC32KS disabled; OSCHFS disabled; PLLS disabled; SOSC disabled; XOSC32KS disabled; + ccp_write_io((void*)&(CLKCTRL.MCLKSTATUS),0x0); + + //RUNSTDBY disabled; + ccp_write_io((void*)&(CLKCTRL.OSC32KCTRLA),0x0); + + //AUTOTUNE disabled; FRQSEL 4 MHz system clock (default); RUNSTDBY disabled; + ccp_write_io((void*)&(CLKCTRL.OSCHFCTRLA),0xC); + + //TUNE 0x0; + ccp_write_io((void*)&(CLKCTRL.OSCHFTUNE),0x0); + + //MULFAC PLL is disabled; RUNSTDBY disabled; SOURCE OSCHF; + ccp_write_io((void*)&(CLKCTRL.PLLCTRLA),0x0); + + //CSUT 1k cycles; ENABLE disabled; LPMODE disabled; RUNSTDBY disabled; SEL disabled; + ccp_write_io((void*)&(CLKCTRL.XOSC32KCTRLA),0x0); + + //CFDEN disabled; CFDSRC CLKMAIN; CFDTST disabled; + ccp_write_io((void*)&(CLKCTRL.MCLKCTRLC),0x0); + + //CFD disabled; INTTYPE INT; + ccp_write_io((void*)&(CLKCTRL.MCLKINTCTRL),0x0); + + //CFD disabled; + ccp_write_io((void*)&(CLKCTRL.MCLKINTFLAGS),0x0); + + //CSUTHF 256; ENABLE disabled; FRQRANGE 8M; RUNSTBY disabled; SELHF XTAL; + ccp_write_io((void*)&(CLKCTRL.XOSCHFCTRLA),0x0); + + + // System clock stability check by polling the status register. + while(!(CLKCTRL.MCLKSTATUS & CLKCTRL_OSCHFS_bm)); + + + // System clock stability check by polling the PLL status. +} + +void CFD_Enable(CLKCTRL_CFDSRC_t cfd_source) +{ + /* Enable Clock Failure Detection on main clock */ + ccp_write_io((uint8_t *) & CLKCTRL.MCLKCTRLC, cfd_source | CLKCTRL_CFDEN_bm); +} + +void CFD_Disable() +{ + /* Disable Clock Failure Detection on main clock */ + ccp_write_io((uint8_t *) & CLKCTRL.MCLKCTRLC, CLKCTRL.MCLKCTRLC & ~CLKCTRL_CFDEN_bm); +} + + +/** + End of File +*/ \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/config_bits.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/config_bits.c new file mode 100644 index 0000000..1b621ca --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/config_bits.c @@ -0,0 +1,47 @@ +/** + * CONFIGURATION BITS Generated Driver Source File + * + * @file config_bits.c + * + * @ingroup config_bitsdriver + * + * @brief This file contains the generated Device Configuration Bits file. + * + * @version Driver Version 1.0.4 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include + +/** + * Configures the Fuse bits. + */ +FUSES = +{ + .BODCFG = ACTIVE_DISABLE_gc | LVL_BODLEVEL0_gc | SAMPFREQ_128Hz_gc | SLEEP_DISABLE_gc, + .BOOTSIZE = 0x0, + .CODESIZE = 0x0, + .OSCCFG = CLKSEL_OSCHF_gc, + .SYSCFG0 = CRCSEL_CRC16_gc | CRCSRC_NOCRC_gc | RSTPINCFG_GPIO_gc | UPDIPINCFG_UPDI_gc, + .SYSCFG1 = MVSYSCFG_DUAL_gc | SUT_0MS_gc, + .WDTCFG = PERIOD_OFF_gc | WINDOW_OFF_gc, +}; diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/interrupt.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/interrupt.c new file mode 100644 index 0000000..6d9cbc3 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/interrupt.c @@ -0,0 +1,53 @@ +/** + * Interrupt Manager Generated Driver File. + * + * @file interrupt.c + * + * @ingroup interrupt + * + * @brief This file contains the API implementation for the Interrupt Manager. + * + * @version Interrupt Manager Driver Version 1.0.0 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#include "../interrupt.h" + +int8_t CPUINT_Initialize() +{ + /* IVSEL and CVT are Configuration Change Protected */ + + //CVT disabled; IVSEL disabled; LVL0RR disabled; + ccp_write_io((void*)&(CPUINT.CTRLA),0x0); + + //LVL0PRI 0; + CPUINT.LVL0PRI = 0x0; + + //LVL1VEC 0; + CPUINT.LVL1VEC = 0x0; + + ENABLE_INTERRUPTS(); + + return 0; +} \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/pins.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/pins.c new file mode 100644 index 0000000..3b4bd95 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/pins.c @@ -0,0 +1,243 @@ +/** + * Generated Driver File + * + * @file pins.c + * + * @ingroup pinsdriver + * + * @brief This is generated driver implementation for pins. + * This file provides implementations for pin APIs for all pins selected in the GUI. + * + * @version Driver Version 1.1.0 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "../pins.h" + +static void (*ETH_CS_InterruptHandler)(void); +static void (*IO_PA5_InterruptHandler)(void); +static void (*IO_PA4_InterruptHandler)(void); +static void (*IO_PA6_InterruptHandler)(void); +static void (*SW0_InterruptHandler)(void); +static void (*LED0_InterruptHandler)(void); + +void PIN_MANAGER_Initialize() +{ + /* DIR Registers Initialization */ + PORTA.DIR = 0xD0; + PORTC.DIR = 0x0; + PORTD.DIR = 0x0; + PORTF.DIR = 0x20; + + /* OUT Registers Initialization */ + PORTA.OUT = 0x0; + PORTC.OUT = 0x0; + PORTD.OUT = 0x0; + PORTF.OUT = 0x0; + + /* PINxCTRL registers Initialization */ + PORTA.PIN0CTRL = 0x0; + PORTA.PIN1CTRL = 0x0; + PORTA.PIN2CTRL = 0x0; + PORTA.PIN3CTRL = 0x0; + PORTA.PIN4CTRL = 0x0; + PORTA.PIN5CTRL = 0x0; + PORTA.PIN6CTRL = 0x0; + PORTA.PIN7CTRL = 0x8; + PORTC.PIN0CTRL = 0x0; + PORTC.PIN1CTRL = 0x0; + PORTC.PIN2CTRL = 0x0; + PORTC.PIN3CTRL = 0x0; + PORTC.PIN4CTRL = 0x0; + PORTC.PIN5CTRL = 0x0; + PORTC.PIN6CTRL = 0x0; + PORTC.PIN7CTRL = 0x0; + PORTD.PIN0CTRL = 0x0; + PORTD.PIN1CTRL = 0x0; + PORTD.PIN2CTRL = 0x0; + PORTD.PIN3CTRL = 0x0; + PORTD.PIN4CTRL = 0x0; + PORTD.PIN5CTRL = 0x0; + PORTD.PIN6CTRL = 0x0; + PORTD.PIN7CTRL = 0x0; + PORTF.PIN0CTRL = 0x0; + PORTF.PIN1CTRL = 0x0; + PORTF.PIN2CTRL = 0x0; + PORTF.PIN3CTRL = 0x0; + PORTF.PIN4CTRL = 0x0; + PORTF.PIN5CTRL = 0x80; + PORTF.PIN6CTRL = 0x8; + PORTF.PIN7CTRL = 0x0; + + /* EVGENCTRL registers Initialization */ + + /* PORTMUX Initialization */ + PORTMUX.CCLROUTEA = 0x0; + PORTMUX.EVSYSROUTEA = 0x0; + PORTMUX.SPIROUTEA = 0x0; + PORTMUX.TCAROUTEA = 0x0; + PORTMUX.TCBROUTEA = 0x0; + PORTMUX.TCDROUTEA = 0x0; + PORTMUX.TWIROUTEA = 0x0; + PORTMUX.USARTROUTEA = 0x0; + + // register default ISC callback functions at runtime; use these methods to register a custom function + ETH_CS_SetInterruptHandler(ETH_CS_DefaultInterruptHandler); + IO_PA5_SetInterruptHandler(IO_PA5_DefaultInterruptHandler); + IO_PA4_SetInterruptHandler(IO_PA4_DefaultInterruptHandler); + IO_PA6_SetInterruptHandler(IO_PA6_DefaultInterruptHandler); + SW0_SetInterruptHandler(SW0_DefaultInterruptHandler); + LED0_SetInterruptHandler(LED0_DefaultInterruptHandler); +} + +/** + Allows selecting an interrupt handler for ETH_CS at application runtime +*/ +void ETH_CS_SetInterruptHandler(void (* interruptHandler)(void)) +{ + ETH_CS_InterruptHandler = interruptHandler; +} + +void ETH_CS_DefaultInterruptHandler(void) +{ + // add your ETH_CS interrupt custom code + // or set custom function using ETH_CS_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for IO_PA5 at application runtime +*/ +void IO_PA5_SetInterruptHandler(void (* interruptHandler)(void)) +{ + IO_PA5_InterruptHandler = interruptHandler; +} + +void IO_PA5_DefaultInterruptHandler(void) +{ + // add your IO_PA5 interrupt custom code + // or set custom function using IO_PA5_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for IO_PA4 at application runtime +*/ +void IO_PA4_SetInterruptHandler(void (* interruptHandler)(void)) +{ + IO_PA4_InterruptHandler = interruptHandler; +} + +void IO_PA4_DefaultInterruptHandler(void) +{ + // add your IO_PA4 interrupt custom code + // or set custom function using IO_PA4_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for IO_PA6 at application runtime +*/ +void IO_PA6_SetInterruptHandler(void (* interruptHandler)(void)) +{ + IO_PA6_InterruptHandler = interruptHandler; +} + +void IO_PA6_DefaultInterruptHandler(void) +{ + // add your IO_PA6 interrupt custom code + // or set custom function using IO_PA6_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for SW0 at application runtime +*/ +void SW0_SetInterruptHandler(void (* interruptHandler)(void)) +{ + SW0_InterruptHandler = interruptHandler; +} + +void SW0_DefaultInterruptHandler(void) +{ + // add your SW0 interrupt custom code + // or set custom function using SW0_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for LED0 at application runtime +*/ +void LED0_SetInterruptHandler(void (* interruptHandler)(void)) +{ + LED0_InterruptHandler = interruptHandler; +} + +void LED0_DefaultInterruptHandler(void) +{ + // add your LED0 interrupt custom code + // or set custom function using LED0_SetInterruptHandler() +} +ISR(PORTA_PORT_vect) +{ + // Call the interrupt handler for the callback registered at runtime + if(VPORTA.INTFLAGS & PORT_INT7_bm) + { + ETH_CS_InterruptHandler(); + } + if(VPORTA.INTFLAGS & PORT_INT5_bm) + { + IO_PA5_InterruptHandler(); + } + if(VPORTA.INTFLAGS & PORT_INT4_bm) + { + IO_PA4_InterruptHandler(); + } + if(VPORTA.INTFLAGS & PORT_INT6_bm) + { + IO_PA6_InterruptHandler(); + } + /* Clear interrupt flags */ + VPORTA.INTFLAGS = 0xff; +} + +ISR(PORTC_PORT_vect) +{ + /* Clear interrupt flags */ + VPORTC.INTFLAGS = 0xff; +} + +ISR(PORTD_PORT_vect) +{ + /* Clear interrupt flags */ + VPORTD.INTFLAGS = 0xff; +} + +ISR(PORTF_PORT_vect) +{ + // Call the interrupt handler for the callback registered at runtime + if(VPORTF.INTFLAGS & PORT_INT6_bm) + { + SW0_InterruptHandler(); + } + if(VPORTF.INTFLAGS & PORT_INT5_bm) + { + LED0_InterruptHandler(); + } + /* Clear interrupt flags */ + VPORTF.INTFLAGS = 0xff; +} + +/** + End of File +*/ \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/protected_io.S b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/protected_io.S new file mode 100644 index 0000000..fa51ec8 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/protected_io.S @@ -0,0 +1,90 @@ +/** + * protected_io Source Code File + * + * @file protected_io.S + * + * @ingroup config_bitsdriver + * + * @brief This file contains the generated protected_io source code file for the CONFIGURATION BITS. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#include "../utils/assembler.h" + +/* + * GNU and IAR use different calling conventions. Since this is + * a very small and simple function to begin with, it's easier + * to implement it twice than to deal with the differences + * within a single implementation. + */ + + PUBLIC_FUNCTION(protected_write_io) + +#if defined(__GNUC__) + +#ifdef RAMPZ + out _SFR_IO_ADDR(RAMPZ), r1 // Clear bits 23:16 of Z +#endif + movw r30, r24 // Load addr into Z + out CCP, r22 // Start CCP handshake + st Z, r20 // Write value to I/O register + ret // Return to caller + +#elif defined(__IAR_SYSTEMS_ASM__) + +# if !defined(CONFIG_MEMORY_MODEL_TINY) && !defined(CONFIG_MEMORY_MODEL_SMALL) \ + && !defined(CONFIG_MEMORY_MODEL_LARGE) +# define CONFIG_MEMORY_MODEL_SMALL +# endif +# if defined(CONFIG_MEMORY_MODEL_LARGE) + ldi r20, 0 + out RAMPZ, r20 // Reset bits 23:16 of Z + movw r30, r16 // Load addr into Z +# elif defined(CONFIG_MEMORY_MODEL_TINY) + ldi r31, 0 // Reset bits 8:15 of Z + mov r30, r16 // Load addr into Z +# else + movw r30, r16 // Load addr into Z +# endif +# if defined(CONFIG_MEMORY_MODEL_TINY) + out CCP, r17 // Start CCP handshake + st Z, r18 // Write value to I/O register +# elif defined(CONFIG_MEMORY_MODEL_SMALL) + out CCP, r18 // Start CCP handshake + st Z, r19 // Write value to I/O register +# elif defined(CONFIG_MEMORY_MODEL_LARGE) + out CCP, r19 // Start CCP handshake + st Z, r20 // Write value to I/O register +# else +# error Unknown memory model in use, no idea how registers should be accessed +# endif + ret +#else +# error Unknown assembler +#endif + + END_FUNC(protected_write_io) + END_FILE() + diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/system.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/system.c new file mode 100644 index 0000000..add9819 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/src/system.c @@ -0,0 +1,44 @@ +/** + * System Driver Source File + * + * @file system.c + * + * @ingroup systemdriver + * + * @brief This file contains the API implementation for the System driver. + * + * @version Driver Version 1.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "../system.h" + + +void SYSTEM_Initialize(void) +{ + CLOCK_Initialize(); + PIN_MANAGER_Initialize(); + SPI0_Initialize(); + TCA0_Initialize(); + CPUINT_Initialize(); +} + diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/system.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/system.h new file mode 100644 index 0000000..5cdf606 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/system.h @@ -0,0 +1,62 @@ +/** + * System Driver Header File + * + * @file system.h + * + * @defgroup systemdriver System Driver + * + * @brief This file contains the API prototypes for the System driver. + * + * @version Driver Version 1.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef MCC_H +#define MCC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../system/utils/compiler.h" +#include "config_bits.h" +#include "../system/clock.h" +#include "../system/pins.h" +#include "../spi/spi0.h" +#include "../timer/tca0.h" +#include "../system/interrupt.h" +/** + * @ingroup systemdriver + * @brief Initializes the system module. This routine must be called only once during the system initialization and before any other routine is called. + * @param None. + * @return None. +*/ +void SYSTEM_Initialize(void); + +#ifdef __cplusplus +} +#endif +#endif /* MCC_H */ +/** + End of File +*/ \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/assembler.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/assembler.h new file mode 100644 index 0000000..2ce5066 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/assembler.h @@ -0,0 +1,49 @@ +/** + * Assembler Header File + * + * @file assembler.h + * + * @ingroup config_bitsdriver + * + * @brief This file contains the assembler header file for the configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef ASSEMBLER_H_INCLUDED +#define ASSEMBLER_H_INCLUDED + +#if !defined(__ASSEMBLER__) && !defined(__IAR_SYSTEMS_ASM__) && !defined(__DOXYGEN__) +#error This file may only be included from assembly files +#endif + +#if defined(__ASSEMBLER__) +#include "assembler/gas.h" +#include +#elif defined(__IAR_SYSTEMS_ASM__) +#include "assembler/iar.h" +#include +#endif + +#endif /* ASSEMBLER_H_INCLUDED */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/assembler/gas.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/assembler/gas.h new file mode 100644 index 0000000..fc78ad7 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/assembler/gas.h @@ -0,0 +1,120 @@ +/** + * GAS Header File + * + * @file gas.h + * + * @ingroup config_bitsdriver + * + * @brief This file contains the generated GAS header file for the Configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef ASSEMBLER_GAS_H_INCLUDED +#define ASSEMBLER_GAS_H_INCLUDED + +#ifndef __DOXYGEN__ + +/* clang-format off */ + + /* IAR doesn't accept dots in macro names */ + .macro ld_addr, reg, sym + lda.w \reg, \sym + .endm + + /* Define a function \a name that is either globally visible or only + * file-local. + */ + .macro gas_begin_func name, is_public + .if \is_public + .global \name + .endif + #ifdef __XC8 + .section .text.\name, code + #else + .section .text.\name, "ax", @progbits + #endif + .type \name, @function + \name : + .endm + + /* Define a function \a name that is either globally visible or only + * file-local in a given segment. + */ + .macro gas_begin_func_segm name, is_public, segment + .if \is_public + .global \name + .endif + .section .\segment, "ax", @progbits + .type \name, @function + \name : + .endm + + /* Define \a name as a weak alias for the function \a strong_name */ + .macro gas_weak_function_alias name, strong_name + .global \name + .weak \name + .type \name, @function + .set \name, \strong_name + .endm + + /* Define a weak function called \a name */ + .macro gas_weak_function name + .weak \name + gas_begin_func \name 1 + .endm + +#define REPEAT(count) .rept count +#define END_REPEAT() .endr +#define FILL_BYTES(count) .fill count +#define SET_LOC(offset) .org offset +#define L(name) .L##name +#define EXTERN_SYMBOL(name) + +#define TEXT_SECTION(name) \ + .section name, "ax", @progbits +#define RODATA_SECTION(name) \ + .section name, "a", @progbits +#define DATA_SECTION(name) \ + .section name, "aw", @progbits +#define BSS_SECTION(name) \ + .section name, "aw", @nobits + +#define FUNCTION(name) gas_begin_func name 0 +#define PUBLIC_FUNCTION(name) gas_begin_func name 1 +#define PUBLIC_FUNCTION_SEGMENT(name, segment) \ + gas_begin_func_segm name 1 segment +#define WEAK_FUNCTION(name) gas_weak_function name +#define WEAK_FUNCTION_ALIAS(name, strong_name) \ + gas_weak_function_alias name strong_name +#define END_FUNC(name) \ + .size name, . - name + +#define END_FILE() + +/* clang-format on */ + +#endif /* __DOXYGEN__ */ + +#endif /* ASSEMBLER_GAS_H_INCLUDED */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/assembler/iar.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/assembler/iar.h new file mode 100644 index 0000000..d4ba634 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/assembler/iar.h @@ -0,0 +1,104 @@ +/** + * IAR Header File + * + * @file iar.h + * + * @ingroup config_bitsdriver + * + * @brief This file contains the generated IAR header file for the Configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef ASSEMBLER_IAR_H_INCLUDED +#define ASSEMBLER_IAR_H_INCLUDED + +/* clang-format off */ + +ld_addr MACRO reg, sym + mov reg, LWRD sym + orh reg, HWRD sym + ENDM + +call MACRO sym + rcall sym + ENDM + +iar_begin_func MACRO name, sect, is_public, is_weak + MODULE name + RSEG CODE:CODE:NOROOT(1) + IF is_weak == 1 + PUBWEAK name + ELSEIF is_public + PUBLIC name + ENDIF +name: + ENDM + +iar_begin_func_segm MACRO name, sect, is_public, is_weak, segment + MODULE name + RSEG segment:CODE:NOROOT(1) + IF is_weak == 1 + PUBWEAK name + ELSEIF is_public + PUBLIC name + ENDIF +name: + ENDM + +iar_weak_alias MACRO name, strong_name + PUBWEAK name +name: + rjmp strong_name + ENDM + +#define lo(x) LWRD x +#define hi(x) HWRD x + +#define REPEAT(count) REPT count +#define END_REPEAT() ENDR +#define SET_LOC(offset) ORG offset +#define END_FILE() END + +#define FILL_BYTES(count) DS8 count + +#define L(name) name +#define EXTERN_SYMBOL(name) EXTERN name +#define FUNCTION(name) iar_begin_func name, text_##name, 0, 0 +#define PUBLIC_FUNCTION(name) iar_begin_func name, text_##name, 1, 0 +#define PUBLIC_FUNCTION_SEGMENT(name, segment) \ + iar_begin_func_segm name, text_##name, 1, 0, segment +#define WEAK_FUNCTION(name) iar_begin_func name, text_##name, 1, 1 +#define WEAK_FUNCTION_ALIAS(name, strong_name) \ + iar_weak_alias name, strong_name +#define END_FUNC(name) ENDMOD + +#define TEXT_SECTION(name) RSEG name:CODE:NOROOT +#define RODATA_SECTION(name) RSEG name:CONST:NOROOT +#define DATA_SECTION(name) RSEG name:DATA:NOROOT +#define BSS_SECTION(name) RSEG name:DATA:NOROOT + +/* clang-format on */ + +#endif /* ASSEMBLER_IAR_H_INCLUDED */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/atomic.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/atomic.h new file mode 100644 index 0000000..c298b95 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/atomic.h @@ -0,0 +1,87 @@ +/** + * CONFIGURATION BITS Generated Atomic Header File + * + * @file atomic.h + * + * @defgroup doc_driver_utils_atomic Atomic memory access and critical sections + * + * @brief This file contains the atomic memory access and critical sections header file for the configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef ATOMIC_H +#define ATOMIC_H + +/* clang-format off */ + +#if defined(__GNUC__) || defined (__DOXYGEN__) + +/** + * @brief Enters critical region. Saves the contents of the status register, including the Global Interrupt Enable bit, so that it can be restored upon leaving the critical region. + * Thereafter, clears the Global Interrupt Enable Bit.This macro takes a parameter P that is unused for the GCC compiler,but necessary for code compatibility with the IAR compiler. + * The IAR compiler declares a variable with the name of the parameter forholding the SREG value. + * Compilation will fail when the variable declared in the macro is not unique within the scope that the critical region is declared within. + * @param[in] UNUSED(GCC)/P(IAR) Name of variable storing SREG. + */ + +#define ENTER_CRITICAL(UNUSED) __asm__ __volatile__ ( \ + "in __tmp_reg__, __SREG__" "\n\t" \ + "cli" "\n\t" \ + "push __tmp_reg__" "\n\t" \ + ::: "memory" \ + ) + +/** + * @brief Exits a critical region. Restores the contents of the status register, including the Global Interrupt Enable bit, as it was when entering the critical region. + * This macro takes a parameter P that is unused for the GCC compiler, but necessary for code compatibility with the IAR compiler. + * The IAR compiler uses this parameter as the name of a variable that holds the SREG value. + * The parameter must be identical to the parameter used in the corresponding ENTER_CRITICAL(). + * @param[in] UNUSED(GCC)/P(IAR) Name of variable storing SREG + */ + +#define EXIT_CRITICAL(UNUSED) __asm__ __volatile__ ( \ + "pop __tmp_reg__" "\n\t" \ + "out __SREG__, __tmp_reg__" "\n\t" \ + ::: "memory" \ + ) + +#define DISABLE_INTERRUPTS() __asm__ __volatile__ ( "cli" ::: "memory") +#define ENABLE_INTERRUPTS() __asm__ __volatile__ ( "sei" ::: "memory") + +#elif defined(__ICCAVR__) + +#define ENTER_CRITICAL(P) unsigned char P = __save_interrupt();__disable_interrupt(); +#define EXIT_CRITICAL(P) __restore_interrupt(P); + +#define DISABLE_INTERRUPTS() __disable_interrupt(); +#define ENABLE_INTERRUPTS() __enable_interrupt(); + +#else +# error Unsupported compiler. +#endif + +/* clang-format on */ + +#endif /* ATOMIC_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/compiler.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/compiler.h new file mode 100644 index 0000000..fba02a0 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/compiler.h @@ -0,0 +1,72 @@ +/** + * Compiler Header File + * + * @file compiler.h + * + * @defgroup doc_driver_utils_compiler Compiler abstraction + * + * @brief This file contains the compiler abstraction layer and code utilities for 8-bit AVR. This module provides various abstraction layers and utilities to make code compatible between different compilers. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef UTILS_COMPILER_H +#define UTILS_COMPILER_H + +#if defined(__GNUC__) +#include +#include +#if defined(__XC8__) +#include +#endif +#elif defined(__ICCAVR__) +#define ENABLE_BIT_DEFINITIONS 1 +#include +#include + +#ifndef CCP_IOREG_gc +#define CCP_IOREG_gc 0xD8 /* CPU_CCP_IOREG_gc */ +#endif +#ifndef CCP_SPM_gc +#define CCP_SPM_gc 0x9D /* CPU_CCP_SPM_gc */ +#endif + +#else +#error Unsupported compiler. +#endif + +#include +#include +#include +#include + +#include "interrupt_avr8.h" + +/** + * @def UNUSED + * @brief Marking \a v as a unused parameter or value. + */ +#define UNUSED(v) (void)(v) + +#endif /* UTILS_COMPILER_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/interrupt_avr8.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/interrupt_avr8.h new file mode 100644 index 0000000..83b3c62 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/interrupt_avr8.h @@ -0,0 +1,88 @@ +/** + * interrupt_avr8 Header File + * + * @file interrupt_avr8.h + * + * @defgroup doc_driver_utils_interrupts ISR abstraction + * + * @brief Interrupt-related functionality. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef UTILS_INTERRUPT_AVR8_H +#define UTILS_INTERRUPT_AVR8_H + +/** + * \weakgroup interrupt_group + * + * @{ + */ + +#ifdef ISR_CUSTOM_H +#include ISR_CUSTOM_H +#else + +/** + * @def ISR + * @brief Define service routine for specified interrupt vector. + * @code + ISR(FOO_vect) + { + ... + } + * @endcode + * + * @param vect Interrupt vector name as found in the device header files. + */ +#if defined(__DOXYGEN__) +#define ISR(vect) +#elif defined(__GNUC__) +#include +#elif defined(__ICCAVR__) +#define __ISR(x) _Pragma(#x) +#define ISR(vect) __ISR(vector = vect) __interrupt void handler_##vect(void) +#endif +#endif // ISR_CUSTOM_H + +#ifdef __GNUC__ +#define cpu_irq_enable() sei() +#define cpu_irq_disable() cli() +#else +#define cpu_irq_enable() __enable_interrupt() +#define cpu_irq_disable() __disable_interrupt() +#endif + +//! @} + +/** + * \weakgroup interrupt_deprecated_group + * @{ + */ +// Deprecated definitions. +#define Enable_global_interrupt() cpu_irq_enable() +#define Disable_global_interrupt() cpu_irq_disable() +#define Is_global_interrupt_enabled() cpu_irq_is_enabled() +//! @} + +#endif /* UTILS_INTERRUPT_AVR8_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/utils.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/utils.h new file mode 100644 index 0000000..eaf3b81 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/utils.h @@ -0,0 +1,52 @@ +/** + * utils Header File + * + * @file system.h + * + * @defgroup doc_driver_utils AVR Code utility functions + * + * @brief This file contains the compiler abstraction layer and code utilities for AVR.This module provides various abstraction layers and utilities to make code compatible between different compilers. + * + * @version Driver Version 1.0.1 + * \{ + * +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef UTILS_H_INCLUDED +#define UTILS_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Retrieve array size + */ +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif /* UTILS_H_INCLUDED */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/utils_assert.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/utils_assert.h new file mode 100644 index 0000000..a278db5 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/system/utils/utils_assert.h @@ -0,0 +1,60 @@ +/** + * utils_assert Header File + * + * @file utils_assert.h + * + * @defgroup doc_driver_utils_assert Functionality for assert + * + * @brief This file contains the generated utils_assert header file for the configuration bits driver. + * + * @version Driver Version 1.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef _ASSERT_H_INCLUDED +#define _ASSERT_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * @brief Assert macro + * Macro used to throw asserts. It can be mapped to different function based on debug level. + * @param[in] condition A condition to be checked; assert is thrown if the given condition is false. + */ + +#ifdef DEBUG +#define ASSERT(condition) \ + if (!(condition)) \ + while (true) \ + ; +#else +#define ASSERT(condition) ((void)0) +#endif + +#ifdef __cplusplus +} +#endif +#endif /* _ASSERT_H_INCLUDED */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/arpv4.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/arpv4.h new file mode 100644 index 0000000..86a3874 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/arpv4.h @@ -0,0 +1,82 @@ +/** + * ARPv4 Protocol Header file + * + * @file arpv4.h + * + * @defgroup arp ARP + * + * @brief This header file provides the API for the ARPv4 protocol. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef ARPV4_H +#define ARPV4_H + +// Included Files +#include "../ethernet/physical_layer_interface.h" +#include "tcpip_types.h" +#include "tcpip_config.h" + +// ARP Functions +/** + * @ingroup arp + * @brief Initializes the ARP table. + * @param None. + * @return None. + */ +void ARPV4_Init(void); + +/** + * @ingroup arp + * @brief Receives all ARP packets on the network and searches the ARP table for an existing ARP entry. + * If present, it updates the table. If the ARP packet is for the device and its operation is REQUEST, + * the function replies with the device MAC address. + * @param None. + * @retval 1 ARP reply sent successfully + * @retval !1 ARP reply is not sent or the ARP packet is not destined for the device + */ +error_msg ARPV4_Packet(void); + +/** + * @ingroup arp + * @brief Updates the ARP table at least every 10s to avoid aging. + * @param None. + * @return None. + */ +void ARPV4_Update(void); + +/** + * @ingroup arp + * @brief Maintains an ARP table which maps hardware address to internet address. + * @param ipAddress 32-bit destination IPv4 address in host order + * @return Pointer to the destination MAC address. + */ +mac48Address_t *ARPV4_Lookup(uint32_t ipAddress); + +/** + * @ingroup arp + * @brief Sends the ARP Request. + * @param destAddress 32-bit destination IPv4 address + * @retval 1 ARP request sent successfully + * @retval !1 ARP request failed to send + */ +error_msg ARPV4_Request(uint32_t destAddress); + +#endif /* ARPV4_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/dhcp_client.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/dhcp_client.h new file mode 100644 index 0000000..151f399 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/dhcp_client.h @@ -0,0 +1,69 @@ +/** + * DHCPv4 Client Protocol Header File + * + * @file dhcp_client.h + * + * @defgroup dhcp DHCP + * + * @brief This file provides the API implementation for the Dynamic Host Configuration Protocol (DHCP) client. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef DHCP_CLIENT_H +#define DHCP_CLIENT_H + +// Included Files +#include "tcpip_types.h" +#include "tcpip_config.h" + +// DHCP Client Functions +/** + @ingroup dhcp + @brief Initializes the DHCP. + @param None. + @return None. + */ +void DHCP_init(void); + +/** + @ingroup dhcp + @brief Receives and processes the DHCP packet. + @param length Length of the received DHCP packet + @return None. + */ +void DHCP_Handler(int16_t length); + +/** + @ingroup dhcp + @brief Updates the DHCP status at least every one second. + @param None. + @return None. + */ +void DHCP_Manage(void); + +/** + @ingroup dhcp + @brief Writes zeroes for the number of bytes passed. + @param length Number of bytes + @return None. + */ +void DHCP_WriteZeros(uint16_t length); + +#endif /* DHCP_CLIENT_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/ip_database.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/ip_database.h new file mode 100644 index 0000000..1420874 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/ip_database.h @@ -0,0 +1,109 @@ +/** + * IP Database Header File + * + * @file ip_database.h + * + * @ingroup ipv4 + * + * @brief This file contains IP addresses for different operations. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef IP_DATABASE_H +#define IP_DATABASE_H + +// Macros +#define MAX_DNS 2 +#define MAX_NTP 2 + +#define IPV4_ZERO_ADDRESS 0 +#define SPECIAL_IPV4_BROADCAST_ADDRESS 0xFFFFFFFF +#define CLASS_A_IPV4_BROADCAST_MASK 0XFF000000 +#define CLASS_B_IPV4_BROADCAST_MASK 0xFFFF0000 +#define CLASS_C_IPV4_BROADCAST_MASK 0xFFFFFF00 +#define ALL_HOST_MULTICAST_ADDRESS 0xE0000001 +#define LOCAL_HOST_ADDRESS 0x7F000001 + +#define CLASS_A_IPV4_REVERSE_BROADCAST_MASK 0x00FFFFFF +#define CLASS_B_IPV4_REVERSE_BROADCAST_MASK 0x0000FFFF +#define CLASS_C_IPV4_REVERSE_BROADCAST_MASK 0X000000FF + +/** + @ingroup ipv4 + @struct ip_db_info_t + @brief Contains IP information. + */ +typedef struct { + uint32_t ipv4_myAddress; /**< IP address*/ + uint32_t ipv4_dns[MAX_DNS]; /**< Primary & secondary DNS addresses*/ + uint32_t ipv4_subnetMask; /**< Subnet mask*/ + uint32_t ipv4_router; /**< Router address*/ + uint32_t ipv4_gateway; /**< Gateway address*/ + uint32_t ipv4_ntpAddress[MAX_NTP]; /**< NTP addresses*/ + uint32_t ipv4_tftpAddress; /**< TFTP address*/ +} ip_db_info_t; + +extern ip_db_info_t ip_database_info; + +#define ipdb_getAddress() (ip_database_info.ipv4_myAddress) +#define ipdb_getDNS(x) (x < MAX_DNS ? ip_database_info.ipv4_dns[x] : ip_database_info.ipv4_dns[0]) +#define ipdb_getSubNetMASK() (ip_database_info.ipv4_subnetMask) +#define ipdb_getRouter() (ip_database_info.ipv4_router) +#define ipdb_getNTP(x) (x < MAX_NTP ? ip_database_info.ipv4_ntpAddress[x] : ip_database_info.ipv4_ntpAddress[0]) +#define ipdb_getTFTP() (ip_database_info.ipv4_tftpAddress) +#define ipdb_classAbroadcastAddress() (ip_database_info.ipv4_myAddress|CLASS_A_IPV4_REVERSE_BROADCAST_MASK) +#define ipdb_classBbroadcastAddress() (ip_database_info.ipv4_myAddress|CLASS_B_IPV4_REVERSE_BROADCAST_MASK) +#define ipdb_classCbroadcastAddress() (ip_database_info.ipv4_myAddress|CLASS_C_IPV4_REVERSE_BROADCAST_MASK) +#define ipdb_specialbroadcastAddress() SPECIAL_IPV4_BROADCAST_ADDRESS + +#define ipdb_setAddress(a) do{ ip_database_info.ipv4_myAddress = a; } while(0) +#define ipdb_setDNS(x,v) do{ if(x < MAX_DNS) ip_database_info.ipv4_dns[x] = v; } while(0) +#define ipdb_setSubNetMASK(m) do{ ip_database_info.ipv4_subnetMask = m; } while(0) +#define ipdb_setRouter(r) do{ ip_database_info.ipv4_router = r; } while(0) +#define ipdb_setGateway(g) do{ ip_database_info.ipv4_gateway = g; } while(0) +#define ipdb_setNTP(x,n) do{ if(x < MAX_NTP) ip_database_info.ipv4_ntpAddress[x] = n; } while(0) +#define ipdb_setTFTP(a) do{ ip_database_info.ipv4_tftpAddress = a; } while(0) + +// IPDB Functions +/** + @ingroup ipv4 + @brief Initializes the IP database. + @param None. + @return None. + */ +void ipdb_init(void); + +/** + @ingroup ipv4 + @brief Converts a string into a 32-bit IPv4 address. + @param *str IPv4 address in a string format + @return IPv4 address. + */ +uint32_t makeStrToIpv4Address(char *str); + +/** + @ingroup ipv4 + @brief Converts an IPv4 address into a string. + @param addr 32-bit IPV4 address + @return IPV4 address in a string format. + */ +char *makeIpv4AddresstoStr(uint32_t addr); + +#endif /* IP_DATABASE_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/ipv4.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/ipv4.h new file mode 100644 index 0000000..a707c91 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/ipv4.h @@ -0,0 +1,90 @@ +/** + * IPv4 Protocol Header File + * + * @file ipv4.h + * + * @defgroup ipv4 IPV4 + * + * @brief This file provides the API implementation for the Internet Protocol v4 (IPv4). + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef IPV4_H +#define IPV4_H + +// Included Files +#include +#include "tcpip_types.h" +#include "../ethernet/physical_layer_interface.h" + +// IPV4 Functions +/** + @ingroup IPv4 + @brief Initializes IPv4. + @param None. + @return None. + */ +void IPV4_Init(void); + +/** + @ingroup ipv4 + @brief Receives the IPv4 packet. This function reads the IPv4 header and filters the upper layer protocols. + @param None. + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg IPV4_Packet(void); + +/** + @ingroup ipv4 + @brief Starts the IPv4 packet. This routine starts the Ethernet packet and writes the IPv4 header. + Initially Checksum and Payload length are set to '0'. An error code is returned if there has been + an error in accepting, or if something goes wrong. + @param dstAddress 32-bit destination Ipv4 address + @param protocol Protocol number + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg IPv4_Start(uint32_t dstAddress, ipProtocolNumbers protocol); + +/** + @ingroup ipv4 + @brief Computes the pseudo-header checksum for transport layer protocols. + @param payloadLen Length of the transport layer packet + @return Checksum. + */ +uint16_t IPV4_PseudoHeaderChecksum(uint16_t payloadLen); + +/** + @ingroup ipv4 + @brief Sends the IPv4 packet. This function inserts the total length of IPv4 packet, computes and adds the Ipv4 header checksum. + @param payloadLength Data length of the transport packet + @retval 1 IP packet was sent successfully + @retval !1 IP packet was not sent + */ +error_msg IPV4_Send(uint16_t payloadLength); + +/** + @ingroup ipv4 + @brief Returns the length of the IPv4 datagram. + @param None. + @return Length of IPV4 datagram. + */ +uint16_t IPV4_GetDatagramLength(void); + +#endif /* IPV4_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/lfsr.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/lfsr.h new file mode 100644 index 0000000..2339f97 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/lfsr.h @@ -0,0 +1,86 @@ +/** + * lfsr API Header File + * + * @file lfsr.h + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for the Linear Feedback Shift Register (LFSR). + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef LFSR_H +#define LFSR_H + +// Included files +#include + +typedef uint8_t lfsr_t; + +// LFSR functions +/** + @ingroup tcpiplite + @brief Returns the LFSR sequence count. + @param None. + @return Sequence count. + */ +int lfsr_getSequenceCount(void); + +/** + @ingroup tcpiplite + @brief Returns the LFSR sequence. + @param None. + @return Sequence. + */ +lfsr_t lfsr_getSequence(void); + +/** + @ingroup tcpiplite + @brief Resets the LFSR. + @param None. + @return None. + */ +void lfsr_reset(void); + +/** + @ingroup tcpiplite + @brief Sets the LFSR sequence. + @param s Sequence + @return None. + */ +void lfsr_setSequence(uint16_t s); + +/** + @ingroup tcpiplite + @brief Returns the LFSR value. + @param None. + @return Value of LFSR. + */ +lfsr_t lfsr(void); + +/** + @ingroup tcpiplite + @brief Returns the LFSR value with seed. + @param lfsrSeed LFSR with seed + @return Value of LFSR with seed. + */ +lfsr_t lfsrWithSeed(uint8_t lfsrSeed); + +#endif /* LFSR_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/log.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/log.h new file mode 100644 index 0000000..051df02 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/log.h @@ -0,0 +1,142 @@ +/** + * Log API Header File + * + * @file log.h + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for sending log messages. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef LOG_H +#define LOG_H + +// Included Files +#include +#include + +// Macros +#define LOG_DEST_ETHERNET 0b00000001 +#define LOG_DEST_CONSOLE 0b00000010 +#define LOG_DEST_EEPROM 0b00000100 + +#define LOG_ETHERNET_MASK(m) (m & LOG_DEST_ETHERNET) +#define LOG_CONSOLE_MASK(m) (m & LOG_DEST_CONSOLE) +#define LOG_EEPROM_MASK(m) (m & LOG_DEST_EEPROM) + +#define SYSLOG_VERSION 1 +#define LOG_NILVALUE "-" + +/** + * @ingroup tcpiplite + * @enum LOG_SEVERITY + * @brief PRI Priorities severity + */ +typedef enum +{ + LOG_EMERGENCY = 0, /** +#include "tcpip_types.h" + +// Macros +#define SOURCEPORT_SYSLOG 514 +#define DESTPORT_SYSLOG 514 + +// Syslog Functions +/** + @ingroup tcpiplite + @brief Sends a syslog message. + @param *message + @param priorityVal Message priority + @return Status of sending the message. Refer to the error description in tcpip_types.h. + */ +error_msg logSyslog(const char *message, uint8_t priorityVal); + +#endif /* LOG_SYSLOG_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/network.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/network.h new file mode 100644 index 0000000..a69f3b2 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/network.h @@ -0,0 +1,110 @@ +/** + * Network Header File + * + * @file network.h + * + * @ingroup tcpiplite + * + * @brief This file provides the network layer implementation for the Transmission Control Protocol/Internet Protocol (TCP/IP) stack. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef NETWORK_H +#define NETWORK_H + +// Included Files +#include +#include "tcpip_types.h" + +// Macros +#define byteSwap16(a) ((((uint16_t)a & (uint16_t)0xFF00) >> 8) | (((uint16_t)a & (uint16_t)0x00FF) << 8)) +#define byteReverse32(a) ((((uint32_t)a & (uint32_t)0xff000000) >> 24) | \ + (((uint32_t)a & (uint32_t)0x00ff0000) >> 8) | \ + (((uint32_t)a & (uint32_t)0x0000ff00) << 8) | \ + (((uint32_t)a & (uint32_t)0x000000ff) << 24)) + +#define byteReverse24(a) (((((uint32_t)a & (uint32_t)0x00FF00) >> 8) | (((uint32_t)a & (uint32_t)0x0000FF) << 8)) << 8 | (uint32_t)a >> 0x10) + +// Host-to-network and network-to-host macros +#ifndef htons +#define htons(a) byteSwap16(a) +#endif +#ifndef ntohs +#define ntohs(a) byteSwap16(a) +#endif +#ifndef htonl +#define htonl(a) byteReverse32(a) +#endif +#ifndef ntohl +#define ntohl(a) byteReverse32(a) +#endif + +#define convert_hton24(a) byteReverse24(a) + +// Network Functions +/** + * @ingroup tcpiplite + * @brief Initializes the network protocols. + * @param None. + * @return None. + */ +void Network_Init(void); + +/** + * @ingroup tcpiplite + * @brief Reads the packets in the network. + * @param None. + * @return None. + */ +void Network_Read(void); + +/** + * @ingroup tcpiplite + * @brief Handles the packets in the network. + * @param None. + * @return None. + */ +void Network_Manage(void); + +/** + * @ingroup tcpiplite + * @brief Waits for the link by reading the PHY registers. + * @param None. + * @return None. + */ +void Network_WaitForLink(void); + +/** + * @ingroup tcpiplite + * @brief Returns the network start position. + * @param None. + * @return Start position. + */ +uint16_t Network_GetStartPosition(void); + +/** + * @ingroup tcpiplite + * @brief Initializes the timers. + * @param None. + * @return None. + */ +void timersInit(void); + +#endif /* NETWORK_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/rtcc.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/rtcc.h new file mode 100644 index 0000000..7368887 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/rtcc.h @@ -0,0 +1,87 @@ +/** + * RTCC Header File + * + * @file rtcc.h + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for the Real-Time Clock/Calendar (RTCC). + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef RTCC_H +#define RTCC_H + +// Included Files +#include +#include + + +// Variables +extern volatile bool dirtyTime; + +// RTCC Functions +/** + * @ingroup tcpiplite + * @brief Initializes the clock calendar driver. + * This routine configures the basics of a software-driven RTCC peripheral. + * It relies upon a periodic timer event to provide time keeping. + * The appropriate timer needs to be selected in the TCP/IP Lite Dependency. + * Configure the selected timer to produce a time-out of 1s. Set the callback rate as 1, + * if required depending on the device. + * @param None. + * @return None. + */ +void rtcc_init(void); + +/** + * @ingroup tcpiplite + * @brief Maintains the deviceTime (seconds) using the LCDIF flag/interrupt. + * This routine decrements seconds_counter until 0 and then increments deviceTime. + * seconds_counter reloads with CLOCK_PER_SEC. It uses the timer selected as the Dependency by the user. + * @param None. + * @return None. + */ +void rtcc_handler(void); + +/** + * @ingroup tcpiplite + * @brief Sets the device time to the passed unix time value and + * updates the device time with the passed unix time. + * Interrupts are disabled during the copy and restored to the original on exit. + * @param *t A pointer of type time_t for the current time + * @return None. + */ +void rtcc_set(time_t *t); + +/** + * @ingroup tcpiplite + * @brief Returns the current device time. + * This routine retrieves the device time as either a return value or + * filling in a variable passed by reference. + * Interrupts are disabled during the copy and restored to the original on exit. + * time.h is a prerequisite for supporting the standard C time libraries + * and does not implement time, as it is application dependent. + * @param *t A pointer of type time_t for the current time + * @return Value of the current time. + */ +time_t time(time_t *t); + +#endif /* RTCC_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/arpv4.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/arpv4.c new file mode 100644 index 0000000..7c86124 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/arpv4.c @@ -0,0 +1,233 @@ +/** + * ARP v4 Implementation Source File + * + * @file arpv4.c + * + * @ingroup arp + * + * @brief This file provides the API implementation for the Address Resolution Protocol (ARP) v4. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include +#include "../tcpip_types.h" +#include "../network.h" +#include "../arpv4.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../ipv4.h"// needed to know my IP address +#include "../tcpip_config.h" +#include "../ip_database.h" + +// Macros +#define ARP_REQUEST 1 +#define ARP_REPLY 2 +#define ARP_NAK 10 + +// Structs +/** + * @ingroup arp + * @struct arpHeader_t + * @brief Contains the ARP information. + */ +typedef struct +{ + uint16_t htype; /** 0; x--) + { + if( (ntohl(header.spa) == entryPointer->ipAddress) && (header.ptype == entryPointer->protocolType)) + { + entryPointer->age = 0; // Reset the age + entryPointer->macAddress.s = header.sha.s; + mergeFlag = true; + break; + } + entryPointer++; + } + + if(ipdb_getAddress() && (ipdb_getAddress() == ntohl(header.tpa))) + { + if(!mergeFlag) + { + // Find the oldest entry in the table + entryPointer = arpMap; + arpMap_t *arpPtr = arpMap; + for(uint8_t x=ARP_MAP_SIZE; x !=0; x--) + { + if(entryPointer->age < arpPtr->age) + { + entryPointer = arpPtr; + } + /* Increment the pointer to get the next element from the array. */ + arpPtr++; + } + // The entry_pointer is now pointing to the oldest entry + // Replace the entry with the received data + entryPointer->age = 0; + entryPointer->macAddress.s = header.sha.s; + entryPointer->ipAddress = ntohl(header.spa); + entryPointer->protocolType = header.ptype; + } + if(header.oper == ntohs(ARP_REQUEST)) + { + ret = (error_msg)ETH_WriteStart(&header.sha ,ETHERTYPE_ARP); + if(ret == SUCCESS) + { + + header.tha.s = header.sha.s; + memcpy((void*)&header.sha.s, (void*)&hostMacAddress.s, sizeof(mac48Address_t)); + header.tpa = header.spa; + header.spa = htonl(ipdb_getAddress()); + header.oper = htons(ARP_REPLY); + ETH_WriteBlock((char*)&header,sizeof(header)); + + + ret = (error_msg)ETH_Send(); + } + } + } + else + { + ret = ARP_IP_NOT_MATCHED; + } + } + return ret; +} + +void ARPV4_Update(void) +{ + arpMap_t *entryPointer = arpMap; + for(uint8_t x=0; x < ARP_MAP_SIZE; x++) + { + entryPointer->age ++; + entryPointer ++; + } +} + +error_msg ARPV4_Request(uint32_t destAddress) +{ + error_msg ret; + + ret = ERROR; + + arpHeader_t header; + header.htype = htons(1); + header.ptype = htons(0x0800); + header.hlen = 6; + header.plen = 4; + header.oper = htons(ARP_REQUEST); + memcpy((void*)&header.sha, (void*)&hostMacAddress, sizeof(mac48Address_t)); + header.spa = htonl(ipdb_getAddress()); + header.tpa= htonl(destAddress); + header.tha.s.byte1 = 0; + header.tha.s.byte2 = 0; + header.tha.s.byte3 = 0; + header.tha.s.byte4 = 0; + header.tha.s.byte5 = 0; + header.tha.s.byte6 = 0; + + ret = (error_msg)ETH_WriteStart(&broadcastMAC,ETHERTYPE_ARP); + if(ret == SUCCESS) + { + ETH_WriteBlock((char*)&header,sizeof(arpHeader_t)); + ret = (error_msg)ETH_Send(); + if(ret == SUCCESS) + { + return MAC_NOT_FOUND; + } + } + return ret; +} + +mac48Address_t* ARPV4_Lookup(uint32_t ip_address) +{ + arpMap_t *entry_pointer = arpMap; + uint8_t x; + + for(x = 0; x < ARP_MAP_SIZE; x++) + { + if(entry_pointer->ipAddress == ip_address) + return &entry_pointer->macAddress; + entry_pointer ++; + } + return 0; +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/dhcp_client.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/dhcp_client.c new file mode 100644 index 0000000..a0f025e --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/dhcp_client.c @@ -0,0 +1,579 @@ +/** + * DHCP v4 client Implementation Source File + * + * @file dhcp_client.c + * + * @ingroup dhcp + * + * @brief This file provides the API implementation for the DHCP client. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +//Included Files +#include +#include +#include +#include +#include +#include "../log.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../network.h" +#include "../udpv4.h" +#include "../udpv4_port_handler_table.h" +#include "../ipv4.h" +#include "../arpv4.h" +#include "../dhcp_client.h" +#include "../ip_database.h" +#include "../lfsr.h" + +// Macros +#ifdef ENABLE_NETWORK_DEBUG +#define logMsg(msg, msgSeverity, msgLogDest) logMessage(msg, LOG_DHCP, msgSeverity, msgLogDest) +#else +#define logMsg(msg, msgSeverity, msgLogDest) +#endif +#define DHCP_HEADER_SIZE 240 + +#if ( DHCP_PACKET_SIZE & 1) +#define ZERO_PAD_DHCP +#define DHCP_REQUEST_LENGTH (DHCP_PACKET_SIZE + 1) +#else +#undef ZERO_PAD_DHCP +#define DHCP_REQUEST_LENGTH DHCP_PACKET_SIZE +#endif + +static mac48Address_t ethMAC; + +// Enumerations +/** + * @ingroup dhcp + * @enum dhcp_type + * @brief Contains DCHP request types. + */ +typedef enum +{ + DHCP_DISCOVER = 1, + DHCP_OFFER, DHCP_REQUEST, DHCP_DECLINE, DHCP_ACK, DHCP_NACK, DHCP_RELEASE, + DHCP_INFORM, DHCP_FORCERENEW, DHCP_LEASEQUERY, DHCP_LEASEUNASSIGNED, DHCP_LEASEUNKNOWN, + DHCP_LEASEACTIVE, DHCP_BULKLEASEQUERY, DHCP_LEASEQUERYDONE +}dhcp_type; + +/** + * @ingroup dhcp + * @enum dhcp_rx_client_state + * @brief Contains the DCHP RX Client state. + */ +typedef enum +{ + SELECTING, REQUESTING, RENEWLEASE, BOUND +}dhcp_rx_client_state; + +/** + * @ingroup dhcp + * @enum dhcp_timer_client_state + * @brief Contains the DCHP Timer Client state. + */ +typedef enum +{ + INIT_TIMER, WAITFORTIMER, STARTDISCOVER, STARTREQUEST +}dhcp_timer_client_state; + +// Structs +/** + * @ingroup dhcp + * @struct dhcp_data_t + * @brief Contains option data + */ +typedef struct +{ + uint32_t dhcpIPAddress; /** DHCP_HEADER_SIZE) + { + logMsg("DHCP PROCESSING", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + if (0x0201 == UDP_Read16()) + { + if (0x06 == UDP_Read8()) // HLEN - is set to 6 because an Ethernet address is 6 Octets long + { + UDP_Read8(); // HOPS + if (dhcpData.xidValue == UDP_Read32()) // xid check + { + UDP_Read16(); // SECS + UDP_Read16(); // FLAGS + UDP_Read32(); // CIADDR + localData.dhcpIPAddress = UDP_Read32(); // YIADDR + if ((localData.dhcpIPAddress != SPECIAL_IPV4_BROADCAST_ADDRESS) && (localData.dhcpIPAddress != LOCAL_HOST_ADDRESS)) + { + siaddr = UDP_Read32(); // SIADDR + if ((siaddr != SPECIAL_IPV4_BROADCAST_ADDRESS) && (siaddr != LOCAL_HOST_ADDRESS)) + { + UDP_Read32(); // GIADDR + UDP_ReadBlock(chaddr, sizeof(chaddr)); // Read chaddr + if (memcmp(chaddr, &hostMacAddress.s, 6) == 0 + || memcmp(chaddr, &broadcastMAC.s, 6) == 0 + || (strlen((char *)chaddr) == 0)) // only compare 6 bytes of MAC address. + { + ETH_Dump(64); // drop SNAME + ETH_Dump(128); // drop the filename + if (UDP_Read32() == 0x63825363) + { + length -= DHCP_HEADER_SIZE; + while (length > 0) + { + // options are here!!! + uint8_t option, optionLength; + option = UDP_Read8(); + optionLength = UDP_Read8(); + length -= 2 + optionLength; + switch (option) + { + case 1: // subnet mask + logMsg("DHCP option 1", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + localData.subnetMask = UDP_Read32(); + break; + case 3: // router + logMsg("DHCP option 3", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + localData.routerAddress = UDP_Read32(); + break; + case 6: // DNS List + { + uint8_t count = 0; + logMsg("DHCP option 6", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + while (optionLength >= 4) + { + uint32_t a = UDP_Read32(); + if (count < 2) + localData.dnsAddress[count++] = a; + + optionLength -= 4; + } + } + break; + case 42: // NTP server + { + uint8_t count = 0; + logMsg("DHCP option 42", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + while (optionLength >= 4) + { + uint32_t a = UDP_Read32(); + if (count < 2) + localData.ntpAddress[count++] = a; + + optionLength -= 4; + } + } + break; + case 51: // lease time + logMsg("DHCP option 51", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + if (optionLength >= 4) + { + uint32_t origLeaseTime; + + origLeaseTime = UDP_Read32(); + // localData.t2 = localData.t1 - 100; // 100 seconds faster for requests + localData.t1 = origLeaseTime >> 1; // be default set to 1/2 the lease length + localData.t2 = localData.t1; // be default set to 1/2 the lease length + origLeaseTime = localData.t1 >> 1; + localData.t2 += origLeaseTime; + localData.t2 += origLeaseTime >> 1; + + optionLength -= 4; + } + break; + case 54: // DHCP server + logMsg("DHCP option 54", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + localData.dhcpServerIdentifier = UDP_Read32(); + // printf("case54:%u\r\n",localData.dhcpServerIdentifier); + optionLength -= 4; + break; + case 53: + logMsg("DHCP option 53", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + messageType = UDP_Read8(); + optionLength -= 1; + break; + default: + ETH_Dump(optionLength); // dump any unused bytes + break; + } // option switch + } // length loop + } // Testing Vendor Information "Magic Cookie" (RFC1497) + else + { + logMsg("DHCP failed Magic Cookie check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } + } // MAC address test + else + { + logMsg("DHCP fail MAC address check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + return; + } + } // SIADDR test + else + { + logMsg("DHCP fail SIADDR check", LOG_WARNING, (LOG_DEST_CONSOLE)); + } + } // YIADDR test + else + { + logMsg("DHCP fail YIADDR check", LOG_WARNING, (LOG_DEST_CONSOLE)); + } + } // xid test + else + { + logMsg("DHCP fail XID check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } + } // HLEN test + else + { + logMsg("DHCP fail Hardware Length", LOG_WARNING, (LOG_DEST_CONSOLE)); + } + } // 201 test + else + { + logMsg("DHCP fail 201 check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } + } // Short packet test + else + { + logMsg("DHCP fail short packet check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } + switch (messageType) + { + case DHCP_OFFER: + if (acceptOffers) + { + dhcpData = localData; // capture the data in the offer + sendDHCPREQUEST(); + dhcpState.rxClientState = REQUESTING; + } + if (declineOffers) + { + sendDHCPDECLINE(); + } + break; + case DHCP_ACK: + if (acceptACK) + { + dhcpData.t1 = localData.t1; + dhcpData.t2 = localData.t2; + ipdb_setAddress(dhcpData.dhcpIPAddress); + ipdb_setDNS(0, dhcpData.dnsAddress[0]); + ipdb_setDNS(1, dhcpData.dnsAddress[1]); + ipdb_setRouter(dhcpData.routerAddress); + ipdb_setGateway(dhcpData.gatewayAddress); + ipdb_setSubNetMASK(dhcpData.subnetMask); + if (dhcpData.ntpAddress[0]) + { + ipdb_setNTP(0, dhcpData.ntpAddress[0]); + if (dhcpData.ntpAddress[1]) + ipdb_setNTP(1, dhcpData.ntpAddress[1]); + } + dhcpState.rxClientState = BOUND; + } + break; + case DHCP_NACK: + if (acceptNACK) + { + dhcpData.t1 = 4; + dhcpData.t2 = 2; + dhcpState.rxClientState = SELECTING; + } + break; + default: + break; + } + } // accept types test + else + { + logMsg("DHCP fail accept types check", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } +} + +void DHCP_WriteZeros(uint16_t length) +{ + while(length--) + { + UDP_Write8(0); + } +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/ip_database.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/ip_database.c new file mode 100644 index 0000000..32ddba5 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/ip_database.c @@ -0,0 +1,74 @@ +/** + * IP Database Implementation Source File + * + * @file ip_database.c + * + * @ingroup ipv4 + * + * @brief This file provides the API implementation for the IP database. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include +#include "../ip_database.h" + +// Variables +ip_db_info_t ip_database_info; + +// IPDB Functions +void ipdb_init(void) +{ + ip_database_info.ipv4_myAddress = 0; + ip_database_info.ipv4_subnetMask = 0; + ip_database_info.ipv4_router = 0; + for(uint8_t x=0; x < MAX_DNS; x ++) + ip_database_info.ipv4_dns[x] = 0; + for(uint8_t x=0; x < MAX_NTP; x++) + ip_database_info.ipv4_ntpAddress[x] = 0; + ip_database_info.ipv4_tftpAddress = 0; +} + +uint32_t makeStrToIpv4Address(char *str) +{ + uint32_t ip_addr; + char *pch; + uint8_t field = 3; + pch = strtok(str,"."); + while(pch != NULL) + { + ((uint8_t *)&ip_addr)[field]= (uint8_t)atoi((const char*)pch); + field--; + pch = strtok (NULL,"."); + } + return ip_addr; +} + +char *makeIpv4AddresstoStr(uint32_t addr) +{ + static char ip_str[15]; + + sprintf(ip_str,"%d.%d.%d.%d",((char*)&addr)[3],((char*)&addr)[2],((char*)&addr)[1],((char*)&addr)[0]); + + return ip_str; +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/ipv4.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/ipv4.c new file mode 100644 index 0000000..8db575e --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/ipv4.c @@ -0,0 +1,287 @@ +/** + * IPv4 Implementation Source File + * + * @file ipv4.c + * + * @ingroup ipv4 + * + * @brief This file provides the API implementation for IPv4. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../network.h" +#include "../ipv4.h" +#include "../arpv4.h" +#include "../udpv4.h" +#include "../udpv4_port_handler_table.h" +#include "../tcpv4.h" +#include "../tcpip_types.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../log.h" +#include "../ip_database.h" + + +// Macros +#ifdef ENABLE_NETWORK_DEBUG +#define logMsg(msg, msgSeverity, msgLogDest) logMessage(msg, LOG_KERN, msgSeverity, msgLogDest) +#else +#define logMsg(msg, msgSeverity, msgLogDest) +#endif + + +// Variables +ipv4Header_t ipv4Header; + +uint32_t remoteIpv4Address; +// External IPV4 Function Prototypes +/** + * @ingroup ipv4 + * @brief Receives TCP packets + * @param remoteAddress Address of the remote device + * @param length Packet length + * @return None. + */ +extern void TCP_Recv(uint32_t remoteAddress, uint16_t length); + +/** + @ingroup ipv4 + @brief Returns the header length + @param None. + @return Length of the header. + */ +static uint8_t getHeaderLen(void); + +// Loacl IPV4 functions +void IPV4_Init(void) +{ + ipdb_init(); +} + +uint16_t IPV4_PseudoHeaderChecksum(uint16_t payloadLen) +{ + ipv4_pseudo_header_t tmp; + uint8_t *ptrPseudoHeader; + uint8_t lenPseudoHeader; + uint32_t cksm = 0; + + tmp.srcIpAddress = ipv4Header.srcIpAddress; + tmp.dstIpAddress = ipv4Header.dstIpAddress; + tmp.protocol = ipv4Header.protocol; + tmp.z = 0; + tmp.length = payloadLen; + + lenPseudoHeader = sizeof(tmp); + ptrPseudoHeader = (uint8_t *) &tmp; + + while(lenPseudoHeader) + { + cksm += (lenPseudoHeader & 1) ? (uint32_t)(*ptrPseudoHeader)<<8 : (uint32_t)(*ptrPseudoHeader); + ptrPseudoHeader++; + lenPseudoHeader--; + } + + // Adding back carry from top 16 bits to low 16 bits + cksm = (cksm & 0x0FFFF) + (cksm>>16); + + return (uint16_t)cksm; +} + +static uint8_t getHeaderLen(void) +{ + uint16_t rxptr; + uint8_t header_len = 0; + rxptr = ETH_GetReadPtr(); + header_len = ETH_Read8() & 0x0fu; + ETH_SetRxByteCount(ETH_GetRxByteCount()+1); + ETH_SetReadPtr(rxptr); + return (uint8_t)(header_len<<2) ; +} + +error_msg IPV4_Packet(void) +{ + uint16_t cksm = 0; + uint16_t length = 0; + uint8_t hdrLen; + // Calculate the IPv4 checksum + hdrLen = getHeaderLen(); + cksm = ETH_RxComputeChecksum(hdrLen, 0); + if (cksm != 0) + { + return IPV4_CHECKSUM_FAILS; + } + + ETH_ReadBlock((char *)&ipv4Header, sizeof(ipv4Header_t)); + if(ipv4Header.version != 4) + { + return IP_WRONG_VERSION; // Incorrect version number + } + + ipv4Header.dstIpAddress = ntohl(ipv4Header.dstIpAddress); + ipv4Header.srcIpAddress = ntohl(ipv4Header.srcIpAddress); + + if(ipv4Header.srcIpAddress == SPECIAL_IPV4_BROADCAST_ADDRESS) + return DEST_IP_NOT_MATCHED; + + if(ipv4Header.dstIpAddress == ipdb_getAddress() + || (ipv4Header.dstIpAddress == IPV4_ZERO_ADDRESS) + || (ipv4Header.dstIpAddress == SPECIAL_IPV4_BROADCAST_ADDRESS) + || ((ipdb_getAddress()|CLASS_A_IPV4_REVERSE_BROADCAST_MASK)== ipv4Header.dstIpAddress) + || ((ipdb_getAddress()|CLASS_B_IPV4_REVERSE_BROADCAST_MASK)== ipv4Header.dstIpAddress) + || ((ipdb_getAddress()|CLASS_C_IPV4_REVERSE_BROADCAST_MASK)== ipv4Header.dstIpAddress) + || (ipv4Header.dstIpAddress == ALL_HOST_MULTICAST_ADDRESS)) + { + ipv4Header.length = ntohs(ipv4Header.length); + + hdrLen = (uint8_t)(ipv4Header.ihl << 2); + + if(ipv4Header.ihl < 5) + return INCORRECT_IPV4_HLEN; + + if (ipv4Header.ihl > 5) + { + // Do not process the IPv4 Options field + ETH_Dump((uint16_t)(hdrLen - sizeof(ipv4Header_t))); + } + + switch((ipProtocolNumbers)ipv4Header.protocol) + { + case UDP_TCPIP: + // Check the UDP header checksum + logMsg("IPv4 RX UDP", LOG_INFO, LOG_DEST_CONSOLE); + length = ipv4Header.length - hdrLen; + cksm = IPV4_PseudoHeaderChecksum(length); // Calculate pseudo header checksum + cksm = ETH_RxComputeChecksum(length, cksm); // 1's complement of pseudo header checksum + 1's complement of UDP header, data + UDP_Receive(cksm); + break; + case TCP_TCPIP: + // Accept only uni cast TCP packets + // Check the TCP header checksum + logMsg("IPv4 RX TCP", LOG_INFO, LOG_DEST_CONSOLE); + length = ipv4Header.length - hdrLen; + cksm = IPV4_PseudoHeaderChecksum(length); + cksm = ETH_RxComputeChecksum(length, cksm); + + // Accept only packets with valid CRC Header + if (cksm == 0 && (ipv4Header.dstIpAddress != SPECIAL_IPV4_BROADCAST_ADDRESS) && (ipv4Header.dstIpAddress != IPV4_ZERO_ADDRESS)) + { + remoteIpv4Address = ipv4Header.srcIpAddress; + TCP_Recv(remoteIpv4Address, length); + } + else + { + logMsg("IPv4 RX bad TCP chksm", LOG_DEBUG, LOG_DEST_CONSOLE); + } + break; + default: + ETH_Dump(ipv4Header.length); + break; + } + return SUCCESS; + } + else + { + return DEST_IP_NOT_MATCHED; + } +} + +error_msg IPv4_Start(uint32_t dstAddress, ipProtocolNumbers protocol) +{ + error_msg ret = ERROR; + // Get the destination MAC address + const mac48Address_t *destMacAddress; + uint32_t targetAddress; + + // Check if there is a valid IP address and if it is different from 127.0.0.1 + if(((ipdb_getAddress() != 0) || (protocol == UDP_TCPIP)) + && (ipdb_getAddress() != 0x7F000001)) + { + if(((dstAddress == SPECIAL_IPV4_BROADCAST_ADDRESS) + |((dstAddress | CLASS_A_IPV4_BROADCAST_MASK) == SPECIAL_IPV4_BROADCAST_ADDRESS) + |((dstAddress | CLASS_B_IPV4_BROADCAST_MASK) == SPECIAL_IPV4_BROADCAST_ADDRESS) + |((dstAddress | CLASS_C_IPV4_BROADCAST_MASK) == SPECIAL_IPV4_BROADCAST_ADDRESS))==0) // This is NOT a broadcast message + { + if( ((dstAddress ^ ipdb_getAddress()) & ipdb_getSubNetMASK()) == 0) + { + targetAddress = dstAddress; + } + else + { + targetAddress = ipdb_getRouter(); + } + destMacAddress= ARPV4_Lookup(targetAddress); + if(destMacAddress == 0) + { + ret = ARPV4_Request(targetAddress); // Schedule an arp request + return ret; + } + } + else + { + destMacAddress = &broadcastMAC; + } + ret = (error_msg)ETH_WriteStart(destMacAddress, ETHERTYPE_IPV4); + if(ret == SUCCESS) + { + ETH_Write16(0x4500); // VERSION, IHL, DSCP, ECN + ETH_Write16(0); // Total packet length + ETH_Write32(0xAA554000); // My IPv4 Magic Number..., FLAGS, Fragment Offset + ETH_Write8(IPv4_TTL); // TTL + ETH_Write8(protocol); // protocol + ETH_Write16(0); // Checksum will be set to zero and overwritten with correct value + ETH_Write32(ipdb_getAddress()); + ETH_Write32(dstAddress); + + // Fill the pseudo header for checksum calculation + ipv4Header.srcIpAddress = ipdb_getAddress(); + ipv4Header.dstIpAddress = dstAddress; + ipv4Header.protocol = protocol; + } + } + return ret; +} + +error_msg IPV4_Send(uint16_t payloadLength) +{ + uint16_t totalLength; + uint16_t cksm; + error_msg ret; + + totalLength = 20 + payloadLength; + totalLength = ntohs(totalLength); + + // Insert IPv4 Total Length + ETH_Insert((char *)&totalLength, 2, sizeof(ethernetFrame_t) + offsetof(ipv4Header_t, length)); + + cksm = ETH_TxComputeChecksum(sizeof(ethernetFrame_t), sizeof(ipv4Header_t), 0); + // Insert Ipv4 Header Checksum + ETH_Insert((char *)&cksm, 2, sizeof(ethernetFrame_t) + offsetof(ipv4Header_t, headerCksm)); + ret = (error_msg)ETH_Send(); + + return ret; +} + +uint16_t IPV4_GetDatagramLength(void) +{ + return ((ipv4Header.length) - sizeof(ipv4Header_t)); +} \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/lfsr.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/lfsr.c new file mode 100644 index 0000000..79b8936 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/lfsr.c @@ -0,0 +1,81 @@ +/** + * LFSR Implementation Source File + * + * @file lfsr.c + * + * @ingroup tcpiplite + * + * @brief This file provides the API prototypes for the Linear Feedback Shift Register (LFSR) module. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include "../lfsr.h" + +// Macros +#define lfsr_seed 0x40 +#define lfsrOutputMask 0x7fu + +// Variables +static uint8_t sequenceIndex = 0; +const lfsr_t xorSequences[] = {0x41,0x44,0x47,0x48,0x4E,0x53,0x55,0x5C,0x5F,0x60,0x65,0x69,0x6A,0x72,0x77,0x78,0x7B,0x7E}; +lfsr_t xor_mask = 0x41; // note this comes from the first entry in the sequence list +lfsr_t lfsr_value = lfsr_seed; + +// LFSR functions +lfsr_t lfsr_getSequence(void) +{ + return xorSequences[sequenceIndex]; +} + +int lfsr_getSequenceCount(void) +{ + return sizeof(xorSequences)/sizeof(*xorSequences); +} + +void lfsr_reset(void) +{ + lfsr_value = lfsr_seed; +} + +void lfsr_setSequence(uint16_t s) +{ + s %= sizeof(xorSequences)/sizeof(*xorSequences); + xor_mask = xorSequences[s]; +} + +lfsr_t lfsr(void) +{ + unsigned char lsb = lfsr_value & 1u; + lfsr_value >>= 1u; + if (lsb) + lfsr_value ^= xor_mask; + return lfsr_value & lfsrOutputMask; +} + +lfsr_t lfsrWithSeed(uint8_t lfsrSeed) +{ + lfsr_value = lfsrSeed; + unsigned char lsb = lfsr_value & 1u; + lfsr_value >>= 1; + if (lsb) + lfsr_value ^= xor_mask; + return lfsr_value & lfsrOutputMask; +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/log.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/log.c new file mode 100644 index 0000000..9f28be3 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/log.c @@ -0,0 +1,151 @@ +/** + * Message Logging Implementation Source File + * + * @file log.c + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for message logging. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include +#include "../rtcc.h" +#include "../log.h" +#include "../log_console.h" +#include "../log_syslog.h" + +// Macros +/** + * @ingroup tcpiplite + * @def LOG_PRIMASK + * @brief Mask to extract priority part (internal) + */ +#define LOG_PRIMASK 0x07 + +/** + * @ingroup tcpiplite + * @def LOG_PRI(p) + * @brief Extract priority + */ +#define LOG_PRI(p) ((p) & LOG_PRIMASK) + +/** + * @ingroup tcpiplite + * @def LOG_NFACILITIES + * @brief Current number of facilities + */ +#define LOG_NFACILITIES 24 + +/** + * @ingroup tcpiplite + * @def LOG_FACMASK + * @brief Mask to extract facility part + */ +#define LOG_FACMASK 0x03f8 + +/** + * @ingroup tcpiplite + * @def LOG_FAC(p) + * @brief Facility of priority + */ +#define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3) +#define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri)) + +// Arguments to setlogmask +/** + * @ingroup tcpiplite + * @def LOG_MASK(pri) + * @brief Mask for one priority + */ +#define LOG_MASK(pri) (1 << (pri)) + +/** + * @ingroup tcpiplite + * @def LOG_UPTO(pri) + * @brief All priorities through PRI + */ +#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1) +#define LOG_NILVALUE "-" + +LOG_SEVERITY limit[LOG_LAST]; // one limit per facility + +const logFields_t severityThresholdTable[] = { + { LOG_KERN, LOG_INFO }, + { LOG_DTLS, LOG_NOTICE }, + { LOG_ECC, LOG_NOTICE }, + { LOG_DAEMON, LOG_INFO }, + { LOG_AUTH, LOG_NOTICE }, + { LOG_SYSLOG, LOG_NOTICE }, + { LOG_LPR, LOG_INFO }, + { LOG_NEWS, LOG_NOTICE }, + { LOG_TFTP, LOG_INFO }, + { LOG_UUID, LOG_NOTICE }, + { LOG_COAP, LOG_NOTICE }, + { LOG_FTP, LOG_NOTICE }, + { LOG_NTP, LOG_INFO }, + { LOG_HTTP, LOG_NOTICE }, + { LOG_SNMP, LOG_NOTICE }, + { LOG_RTCC, LOG_NOTICE }, + { LOG_CBOR, LOG_INFO }, + { LOG_UDP, LOG_NOTICE }, + { LOG_TCP, LOG_NOTICE }, + { LOG_DHCP, LOG_INFO }, + { LOG_DNS, LOG_NOTICE }, + { LOG_LLDP, LOG_INFO }, + { LOG_LINK, LOG_NOTICE }, + + { LOG_LAST, LOG_NOTICE } +}; + +// Logging function definitions +void LOG_Init(void) +{ + unsigned long t = (unsigned long)time(0); + printf("\n\nStarting Syslog at %lu\n",t); + for(uint8_t x=0;x +#include +#include +#include "../../system/system.h" +#include "../log.h" +#include "../ip_database.h" + +// Log Console Functions +uint8_t logConsole(const char *message, uint8_t priorityVal) +{ + struct tm * SYSLOG_time1; + time_t time1; + unsigned long ip; + + ip = ipdb_getAddress(); + time1 = time(NULL); + SYSLOG_time1 = gmtime(&time1); + + printf("<%d>%d %d-%.2d-%.2dT%.2d:%.2d:%.2dZ %d.%d.%d.%d %s %s %s %s[%s]\r\n", priorityVal, SYSLOG_VERSION, SYSLOG_time1->tm_year, SYSLOG_time1->tm_mon, SYSLOG_time1->tm_mday, SYSLOG_time1->tm_hour, SYSLOG_time1->tm_min, SYSLOG_time1->tm_sec, ((char*)&ip)[3],((char*)&ip)[2],((char*)&ip)[1],((char*)&ip)[0], LOG_NILVALUE, LOG_NILVALUE, LOG_NILVALUE, LOG_NILVALUE, message); + return 1; +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/log_syslog.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/log_syslog.c new file mode 100644 index 0000000..0963cdd --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/log_syslog.c @@ -0,0 +1,79 @@ +/** + * Sending Syslog Source File + * + * @file log_syslog.c + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for sending syslog messages. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../../system/system.h" +#include "../log.h" +#include "../tcpip_types.h" +#include "../udpv4.h" +#include "../udpv4_port_handler_table.h" +#include "../ip_database.h" +#include "../log_syslog.h" + +// Syslog Functions +error_msg logSyslog(const char *message, uint8_t priorityVal) +{ + char storage[12]; + struct tm * SYSLOG_time1; + time_t time1; + error_msg error; + unsigned long ip; + + ip = ipdb_getAddress(); + time1 = time(NULL); + error = UDP_Start(0xFFFFFFFF,SOURCEPORT_SYSLOG,DESTPORT_SYSLOG); + + if( SUCCESS == error) + { + SYSLOG_time1 = gmtime(&time1); + sprintf(storage,"<%d>%d ",priorityVal, SYSLOG_VERSION); + UDP_WriteString(storage); + sprintf(storage,"%d-%.2d-%.2d",SYSLOG_time1->tm_year, SYSLOG_time1->tm_mon, SYSLOG_time1->tm_mday); + UDP_WriteString(storage); + sprintf(storage,"T%.2d:%.2d:%.2dZ",SYSLOG_time1->tm_hour, SYSLOG_time1->tm_min, SYSLOG_time1->tm_sec); + UDP_WriteString(storage); + sprintf(storage," %d.%d.%d.%d",((char*)&ip)[3],((char*)&ip)[2],((char*)&ip)[1],((char*)&ip)[0]); //Hostnmame + UDP_WriteString(storage); + sprintf(storage," %s", LOG_NILVALUE); // App-name + UDP_WriteString(storage); + sprintf(storage," %s", LOG_NILVALUE); // Procid + UDP_WriteString(storage); + sprintf(storage," %s", LOG_NILVALUE); // Msgid + UDP_WriteString(storage); + sprintf(storage," %s[", LOG_NILVALUE); // Structured data + UDP_WriteString(storage); + UDP_WriteString(message); + sprintf(storage,"]"); // Structured data + UDP_WriteString(storage); + UDP_Send(); + } + return error; +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/network.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/network.c new file mode 100644 index 0000000..6fca345 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/network.c @@ -0,0 +1,167 @@ +/** + * Network Source File + * + * @file network.c + * + * @ingroup tcpiplite + * + * @brief This file provides the network layer implementation for the TCP/IP stack. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include +#include "../../system/system.h" +#include "../network.h" +#include "../tcpip_types.h" +#include "../dhcp_client.h" +#include "../arpv4.h" +#include "../ipv4.h" +#include "../tcpv4.h" +#include "../rtcc.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../log.h" +#include "../ip_database.h" + +// Macros +#ifdef ENABLE_NETWORK_DEBUG +#define logMsg(msg, msgSeverity, msgLogDest) logMessage(msg, LOG_KERN, msgSeverity, msgLogDest) +#else +#define logMsg(msg, msgSeverity, msgLogDest) +#endif + +time_t arpTimer; +static void Network_SaveStartPosition(void); +uint16_t networkStartPosition; + +const char *network_errors[] = { + "ERROR", "SUCCESS", "LINK_NOT_FOUND", "BUFFER_BUSY", + "TX_LOGIC_NOT_IDLE", "MAC_NOT_FOUND", + "IP_WRONG_VERSION", "IPV4_CHECKSUM_FAILS", + "DEST_IP_NOT_MATCHED", "ICMP_CHECKSUM_FAILS", + "UDP_CHECKSUM_FAILS", "TCP_CHECKSUM_FAILS", + "DMA_TIMEOUT", "PORT_NOT_AVAILABLE", + "ARP_IP_NOT_MATCHED", "EAPol_PACKET_FAILURE"}; + +// Network Functions +void Network_Init(void) +{ + ETH_Init(); + ARPV4_Init(); + IPV4_Init(); + DHCP_init(); + TCP_Init(); + rtcc_init(); + Network_WaitForLink(); + timersInit(); + #ifdef ENABLE_NETWORK_DEBUG + LOG_Init(); + #endif +} + +void timersInit(void) +{ + time(&arpTimer); + arpTimer += 10; +} + +void Network_WaitForLink(void) +{ + while(!ETH_CheckLinkUp()) NOP(); +} + +void Network_Manage(void) +{ + time_t now; + static time_t nowPv = 0; + + ETH_EventHandler(); + Network_Read(); // handle any packets that have arrived... + DHCP_Manage(); // update the DHCP status every second + + // manage any outstanding timeouts + time(&now); + if(now >= arpTimer) + { + ARPV4_Update(); + arpTimer = now + 10; + } + if(now > nowPv) // at least 1 second has elapsed + { + // is defined as a minimum of 1 seconds in RFC973 + TCP_Update(); // handle timeouts + } + nowPv = now; +} + +void Network_Read(void) +{ + ethernetFrame_t header; + char debug_str[80]; + + if(ETH_packetReady()) + { + ETH_NextPacketUpdate(); + ETH_ReadBlock((char *)&header, sizeof(header)); + header.id.type = ntohs(header.id.type); // reverse the type field + Network_SaveStartPosition(); + switch (header.id.type) + { + case ETHERTYPE_VLAN: + logMsg("VLAN Packet Dropped", LOG_INFO, (LOG_DEST_CONSOLE|LOG_DEST_ETHERNET)); + break; + case ETHERTYPE_ARP: + logMsg("RX ARPV4 Packet", LOG_INFO, (LOG_DEST_CONSOLE|LOG_DEST_ETHERNET)); + ARPV4_Packet(); + break; + case ETHERTYPE_IPV4: + logMsg("RX IPV4 Packet", LOG_INFO, (LOG_DEST_CONSOLE|LOG_DEST_ETHERNET)); + IPV4_Packet(); + break; + default: + { + long t = header.id.type; + if(t < 0x05dc) // this is a length field + { + sprintf(debug_str,"802.3 length 0x%04lX",t); + } + else + sprintf(debug_str,"802.3 type 0x%04lX",t); + + logMsg(debug_str, LOG_INFO, (LOG_DEST_CONSOLE|LOG_DEST_ETHERNET)); + } + break; + } + ETH_Flush(); + } +} + +static void Network_SaveStartPosition(void) +{ + networkStartPosition = ETH_GetReadPtr(); +} + +uint16_t Network_GetStartPosition(void) +{ + return networkStartPosition; +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/rtcc.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/rtcc.c new file mode 100644 index 0000000..9c05b69 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/rtcc.c @@ -0,0 +1,81 @@ +/** + * RTCC Implementation Source File + * + * @file rtcc.c + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for the RTCC. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../rtcc.h" +#include "../../system/system.h" + +// Variables +volatile time_t deviceTime; +volatile bool dirtyTime; + +volatile uint16_t seconds_counter; + +// Local RTCC Function Prototypes + +void rtcc_init(void) +{ + deviceTime = 1293861600; + TCA0_OverflowCallbackRegister(rtcc_handler); +} + +void rtcc_handler(void) +{ + deviceTime++; +} + +void rtcc_set(time_t *t) +{ + volatile uint8_t sreg_val; + sreg_val = SREG; + DISABLE_INTERRUPTS(); + deviceTime = *t; + SREG = sreg_val; +} + +time_t time(time_t *t) +{ + time_t the_time; + + volatile uint8_t sreg_val; + + sreg_val = SREG; + DISABLE_INTERRUPTS(); + the_time = deviceTime; + SREG = sreg_val; + if(t) + { + *t = the_time; + } + + return (the_time); +} + diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/tcpv4.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/tcpv4.c new file mode 100644 index 0000000..99ddbe6 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/tcpv4.c @@ -0,0 +1,1564 @@ +/** + * Transmission Control Protocol version4 (TCPv4) Implementation Source File + * + * @file tcpv4.c + * + * @ingroup tcp + * + * @brief This file provides the API implementation for the TCPv4 stack. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../ipv4.h" +#include "../tcpv4.h" +#include "../network.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../tcpip_types.h" +#include "../log.h" +#include "../tcpip_config.h" + +// Variables +tcpTCB_t *tcbList; +socklistsize_t tcbListSize; +tcpTCB_t *currentTCB; + +static tcpHeader_t tcpHeader; +static uint16_t nextAvailablePort; +static uint32_t nextSequenceNumber; + +static uint32_t receivedRemoteAddress; +static uint16_t rcvPayloadLen; +static uint16_t tcpMss = 536; + +static uint16_t tcpDataLength; +static uint16_t bytesToSendForRetransmit = 0; +static uint8_t *txBufferPtrForRetransmit; +static uint32_t localSeqnoForRetransmit; +static uint32_t lastAckNumber; + +#ifdef ENABLE_NETWORK_DEBUG +#define logMsg(msg, msgSeverity, msgLogDest) logMessage(msg, LOG_KERN, msgSeverity, msgLogDest) +#else +#define logMsg(msg, msgSeverity, msgLogDest) +#endif + +// Local TCP Public Interface Function Prototypes +/** + * @ingroup tcp + * @brief TCP stack state machine called upon the occurrence of each event + * (e.g., opening/closing a connection, receiving a TCP packet). + * @param None. + * @return Error status. Refer to the error description in tcpip_types.h. + */ +static error_msg TCP_FiniteStateMachine(void); + +/** + * @ingroup tcp + * @brief Retransmits TCP packets after timeout + * @param None. + * @return Error status. Refer to the error description in tcpip_types.h. + */ +static error_msg TCP_TimoutRetransmit(void); + +/** + * @ingroup tcp + * @brief Inserts a pointer to the new TCB into the TCB pointer list. + * @param *ptr Pointer to the user-allocated memory for the TCB structure + * @return None. + */ +static void TCB_Insert(tcpTCB_t *ptr); + +/** + * @ingroup tcp + * @brief Removes a pointer to a TCB from the TCB pointer list and connects its adjacent items together. + * @param *ptr Pointer to the user-allocated memory for the TCB structure + * @return None. + */ +static void TCB_Remove(tcpTCB_t *ptr); + +/** + * @ingroup tcp + * @brief Resets the socket to a known state. + * @param *tcbPtr Pointer to the socket/TCB structure + * @return None. + */ +static void TCB_Reset(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Check if there is a pointer to a socket/TCB. If the pointer is in the TCB list, then it is a valid socket. + * @param *ptr Pointer to the socket/TCB structure + * @return Error status. Refer to the error description in tcpip_types.h. + */ +static error_msg TCB_Check(tcpTCB_t *ptr); + +/** + * @ingroup tcp + * @brief Internal function of the TCP stack to send a TCP packet. + * @param *tcbPtr Pointer to the socket/TCB structure + * @retval True Sending the buffer succeeded + * @retval False Sending the buffer failed + */ +static error_msg TCP_Snd(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Copies the TCP packet payload to the socket RX buffer. + * This routine also sends the ACK for the received packet and any data ready to be sent. + * @param len Length of the payload received + * @retval True Copying the payload to the RX buffer succeeded + * @retval False Copying the payload to the RX buffer failed + */ +error_msg TCP_PayloadSave(uint16_t len); + +/** + * @ingroup tcp + * @brief Reads and parses the Options field in the TCP header. + * This routine reads only the ones that have SYN or SYN + ACK. + * For the other TCP headers the field will be skipped. + * @param None. + * @retval True Parsing the Options field succeeded + * @retval False Parsing the Options field failed + */ +static error_msg TCP_ParseTCPOptions(void); + +/** + * @ingroup tcp + * @brief Identifies the destination socket and parses the TCP header. + * This routine is called by the IP layer for each received TCP packet. + * @param remoteAddress Source IP address for the received TCP packet + * @param length Length of the TCP payload + * @return None. + */ +void TCP_Recv(uint32_t remoteAddress, uint16_t length); + +// TCP Public Interface Function Definitions +static void TCB_Insert(tcpTCB_t *ptr) +{ + // Insert the new TCB at the head of the list. + // This prevents a list traversal and saves time. + if (tcbList != NULL) + { + // Link this TCB as the previous one for the top of the list + tcbList->prevTCB = ptr; + } + ptr->nextTCB = tcbList; // Put the existing list at the end of this tcb. + tcbList = ptr; // Put this tcb at the head of the list. + ptr->prevTCB = NULL; // Make sure that the upstream pointer is empty. + tcbListSize++; +} + +static void TCB_Remove(tcpTCB_t *ptr) +{ + if (tcbListSize > 1) + { + // check if this is the first in list + if (ptr->prevTCB == NULL) + { + tcbList = ptr->nextTCB; + ((tcpTCB_t *)(ptr->nextTCB))->prevTCB = NULL; + } + else + { + ((tcpTCB_t *)(ptr->prevTCB))->nextTCB = ptr->nextTCB; + ((tcpTCB_t *)(ptr->nextTCB))->prevTCB = ptr->prevTCB; + } + tcbListSize--; + } + else if (tcbListSize == 1) + { + tcbList = NULL; + } +} + +static void TCB_Reset(tcpTCB_t *tcbPtr) +{ + tcbPtr->destIP = 0; + tcbPtr->destPort = 0; + tcbPtr->localSeqno = 0; + tcbPtr->localLastAck = 0; + tcbPtr->remoteSeqno = 0; + tcbPtr->remoteAck = 0; + tcbPtr->remoteWnd = 0; + + tcbPtr->timeout = 0; + tcbPtr->timeoutReloadValue = 0; + tcbPtr->timeoutsCount = 0; + tcbPtr->flags = 0; + + tcbPtr->localPort = 0; + tcbPtr->bytesSent = 0; + tcbPtr->payloadSave = false; + tcbPtr->socketState = SOCKET_CLOSING; +} + +static error_msg TCB_Check(tcpTCB_t *ptr) +{ + tcpTCB_t *tcbPtr; + error_msg ret = ERROR; + socklistsize_t count = 0; + + if ((tcbList != NULL) && (ptr != NULL)) + { + // Search for ptr into the active TCB/sockets list + tcbPtr = tcbList; + while ((tcbPtr != NULL) && (count < tcbListSize)) + { + if (tcbPtr == ptr) + { + ret = SUCCESS; + break; + } + else + { + tcbPtr = tcbPtr->nextTCB; + count++; + } + } + } + return ret; +} + +static error_msg TCP_Snd(tcpTCB_t *tcbPtr) +{ + error_msg ret = ERROR; + tcpHeader_t txHeader; + uint16_t payloadLength; + uint16_t cksm; + uint8_t *data; + + txHeader.sourcePort = htons(tcbPtr->localPort); + txHeader.destPort = htons(tcbPtr->destPort); + + txHeader.sequenceNumber = htonl(tcbPtr->localSeqno); + + txHeader.ackNumber = htonl(tcbPtr->remoteAck); // Ask for next packet + + txHeader.ns = 0; // Make sure to clean unused fields + txHeader.reserved = 0; // Make sure to clean unused fields + txHeader.dataOffset = 5; // Support for options is not avaialble for now + txHeader.windowSize = htons(tcbPtr->localWnd); + txHeader.checksum = 0; + txHeader.urgentPtr = 0; + + if ((tcbPtr->flags) & (TCP_SYN_FLAG | TCP_RST_FLAG)) + { + tcpDataLength = 0; // SYN and RST packets doesn't have any payload + } + else if (tcbPtr->payloadSave == true) + { + tcpDataLength = 0; + } + else + { + tcpDataLength = tcbPtr->bytesSent; + + if (tcpDataLength != 0) + { + if (tcbPtr->remoteWnd == 0) + { + tcbPtr->remoteWnd = 1; + } + if (tcpDataLength > tcbPtr->remoteWnd) + { + tcpDataLength = tcbPtr->remoteWnd; + } + + if (tcpDataLength > tcbPtr->mss) + { + tcpDataLength = tcbPtr->mss; + } + data = tcbPtr->txBufferPtr; + + // Update the pointer to the next byte that needs to be sent + tcbPtr->txBufferPtr = tcbPtr->txBufferPtr + tcpDataLength; + tcbPtr->bytesToSend = tcbPtr->bytesSent - tcpDataLength; + + if (tcbPtr->bytesToSend == 0) + { + tcbPtr->flags = tcbPtr->flags | TCP_PSH_FLAG; + } + } + } + // Update the TCP Flags + txHeader.flags = tcbPtr->flags; + payloadLength = sizeof(tcpHeader_t) + tcpDataLength; + + ret = IPv4_Start(tcbPtr->destIP, TCP_TCPIP); + if (ret == SUCCESS) + { + ETH_WriteBlock((char *)&txHeader, sizeof(tcpHeader_t)); + + if (tcpDataLength > 0) + { + ETH_WriteBlock((char *)data, tcpDataLength); + } + + cksm = payloadLength + TCP_TCPIP; + // Calculate the TCP checksum + cksm = ETH_TxComputeChecksum(sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) - 8, payloadLength + 8, cksm); + ETH_Insert((char *)&cksm, 2, sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) + offsetof(tcpHeader_t, checksum)); + + ret = IPV4_Send(payloadLength); + // tcbPtr->txBufferPtr = tcbPtr->txBufferPtr - tcpDataLength; + } + + // The packet wasn't transmitted + // Use the timeout to retry again later + if (ret != SUCCESS && ret != TX_QUEUED) + { + // Making sure to keep the remaining timeouts and skip this send that failed + // Trying at least once + tcbPtr->timeoutsCount = tcbPtr->timeoutsCount - 1u; + + if (tcbPtr->timeout == 0) + { + tcbPtr->timeout = TCP_START_TIMEOUT_VAL; + } + } + else + { + // Incrementing the sequence number if the packet is sent + tcbPtr->localSeqno = tcbPtr->localSeqno + tcpDataLength; + logMsg("tcp_packet sent", LOG_INFO, LOG_DEST_CONSOLE); + } + + return ret; +} + +error_msg TCP_PayloadSave(uint16_t len) +{ + error_msg ret = ERROR; + uint16_t buffer_size; + + // Check if there is a valid buffer + if (currentTCB->rxBufState == RX_BUFF_IN_USE) + { + // Make sure there is enough space + if (currentTCB->localWnd >= len) + { + buffer_size = len; + } + else + { + buffer_size = currentTCB->localWnd; + } + + ETH_ReadBlock(currentTCB->rxBufferPtr, buffer_size); + currentTCB->rxBufferPtr = currentTCB->rxBufferPtr + buffer_size; + + // Updating the local window to inform the remote of the available space + currentTCB->localWnd = currentTCB->localWnd - buffer_size; + currentTCB->remoteAck = currentTCB->remoteSeqno + buffer_size; + + // Prepareing to send the ACK and maybe some data if there are any + currentTCB->flags = TCP_ACK_FLAG; + currentTCB->payloadSave = true; + + TCP_Snd(currentTCB); + currentTCB->payloadSave = false; + ret = SUCCESS; + } + return ret; +} + +static error_msg TCP_ParseTCPOptions(void) +{ + uint8_t opt; + uint16_t tcpOptionsSize; + error_msg ret; + + ret = ERROR; + // Check for the option fields in TCP header + tcpOptionsSize = (uint16_t)(tcpHeader.dataOffset << 2u) - (uint16_t)sizeof(tcpHeader_t); + + if (tcpOptionsSize > 0) + { + // RFC 1122, page 85, Section 4.2.2.6 Maximum Segment Size Option: RFC-793 Section 3.1 + // More explanations can be found in RFC-6691 + tcpMss = 536; + // Parse the option only for SYN segments + if (tcpHeader.syn) + { + // Parse for the TCP MSS option, if present. + while (tcpOptionsSize--) + { + opt = ETH_Read8(); + switch (opt) + { + case TCP_EOP: + // End of options + if (tcpOptionsSize) + { + // Dumping remaining unused bytes + ETH_Dump(tcpOptionsSize); + tcpOptionsSize = 0; + } + ret = SUCCESS; + break; + case TCP_NOP: + // NOP option. + break; + case TCP_MSS: + if (tcpOptionsSize >= 3) // at least 3 more bytes + { + opt = ETH_Read8(); + if (opt == 0x04) + { + // An MSS option with the right option length. + tcpMss = ETH_Read16(); // value returned in host endianess + // Advance to the next option + tcpOptionsSize = tcpOptionsSize - 3; + + // Limit the mss to the configured TCP_MAX_SEG_SIZE + if (tcpMss > TCP_MAX_SEG_SIZE) + { + tcpMss = TCP_MAX_SEG_SIZE; + } + ret = SUCCESS; + } + else + { + // Bad option size length + logMsg("tcp_parseopt: bad option size length", LOG_INFO, LOG_DEST_CONSOLE); + // Unexpected error + tcpOptionsSize = 0; + ret = ERROR; + } + } + else + { + // Unexpected error + tcpOptionsSize = 0; + ret = ERROR; + } + break; + default: + logMsg("tcp_parseopt: other", LOG_INFO, LOG_DEST_CONSOLE); + opt = ETH_Read8(); + tcpOptionsSize--; + + if (opt > 1) // This should be at least 2 to be valid + { + // Adjust for the remaining bytes for the current option + opt = opt - 2u; + if (opt <= tcpOptionsSize) + { + // All other options have a length field, so that it can easily be skiped + ETH_Dump(opt); + tcpOptionsSize = tcpOptionsSize - opt; + ret = SUCCESS; + } + else + { + logMsg("tcp_parseopt: bad option length", LOG_INFO, LOG_DEST_CONSOLE); + // The options are malformed and will not be processed further + tcpOptionsSize = 0; + ret = ERROR; + } + } + else + { + logMsg("tcp_parseopt: bad length", LOG_INFO, LOG_DEST_CONSOLE); + // If the length field is zero, the options are malformed + // and will not be processed further + tcpOptionsSize = 0; + ret = ERROR; + } + break; + } + } + } + else // jump over the Options from TCP header + { + ETH_Dump(tcpOptionsSize); + ret = SUCCESS; + } + } + else + { + ret = SUCCESS; + } + + return ret; +} + +void TCP_Recv(uint32_t remoteAddress, uint16_t length) +{ + tcpTCB_t *tcbPtr; + socklistsize_t count = 0; + + tcbPtr = NULL; + // Make sure to not reuse old values + receivedRemoteAddress = 0; + rcvPayloadLen = 0; + + ETH_ReadBlock((char *)&tcpHeader, sizeof(tcpHeader_t)); + + currentTCB = NULL; + + // Quick check on destination port + if ((tcpHeader.destPort != 0) && (tcpHeader.sourcePort != 0)) + { + tcpHeader.sourcePort = ntohs(tcpHeader.sourcePort); + tcpHeader.destPort = ntohs(tcpHeader.destPort); + + // Search for active TCB + tcbPtr = tcbList; + while ((tcbPtr != NULL) && (count < tcbListSize)) + { + if (tcpHeader.destPort == tcbPtr->localPort) + { + currentTCB = tcbPtr; + break; + } + else + { + tcbPtr = tcbPtr->nextTCB; + count++; + } + } + + if (currentTCB != NULL) + { + if ((tcpHeader.sourcePort == currentTCB->destPort) || + (currentTCB->destIP == 0)) + { + // Need this if the port is in listen mode + // or to check for the correct TCB + receivedRemoteAddress = remoteAddress; + rcvPayloadLen = length - (uint16_t)(tcpHeader.dataOffset << 2); + + // check/skip the TCP header options + if (TCP_ParseTCPOptions() == SUCCESS) + { + // A packet was received + // sort out the events + if (tcpHeader.syn) + { + if (tcpHeader.ack) + { + logMsg("found syn&ack", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_SYNACK; + } + else + { + logMsg("found syn", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_SYN; + } + } + else if (tcpHeader.fin) + { + if (tcpHeader.ack) + { + logMsg("found fin&ack", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_FINACK; + } + else + { + logMsg("found fin", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_FIN; + } + } + else if (tcpHeader.rst) + { + if (tcpHeader.ack) + { + logMsg("found rst&ack", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_RSTACK; + } + else + { + logMsg("found rst", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_RST; + } + } + else if (tcpHeader.ack) + { + logMsg("found ack", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_ACK; + } + else + { + logMsg("confused", LOG_INFO, LOG_DEST_CONSOLE); + } + // Conversion done herer save some cycles later + tcpHeader.ackNumber = ntohl(tcpHeader.ackNumber); + tcpHeader.sequenceNumber = ntohl(tcpHeader.sequenceNumber); + + TCP_FiniteStateMachine(); + } + else + { + logMsg("pkt dropped: bad options", LOG_INFO, LOG_DEST_CONSOLE); + } + } // No reset message sent for PORT not open + } + } +} + +static error_msg TCP_FiniteStateMachine(void) +{ + uint16_t notAckBytes; + error_msg ret = ERROR; + + tcp_fsm_states_t nextState = currentTCB->fsmState; // Default don't change states + tcpEvent_t event = currentTCB->connectionEvent; + switch (currentTCB->fsmState) + { + case LISTEN: + switch (event) + { + case RCV_SYN: + logMsg("LISTEN: rx_syn", LOG_INFO, LOG_DEST_CONSOLE); + // Start the connection on the TCB + + currentTCB->destIP = receivedRemoteAddress; + currentTCB->destPort = tcpHeader.sourcePort; + + currentTCB->localLastAck = 0; + + currentTCB->remoteSeqno = tcpHeader.sequenceNumber; + currentTCB->remoteAck = currentTCB->remoteSeqno + 1; // Ask for next packet + + // Save data from TCP header + currentTCB->remoteWnd = ntohs(tcpHeader.windowSize); + currentTCB->mss = tcpMss; + + // Create and send a SYN+ACK packet + currentTCB->flags = TCP_SYN_FLAG | TCP_ACK_FLAG; + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_SYN_RETRIES; + + TCP_Snd(currentTCB); + nextState = SYN_RECEIVED; + break; + case CLOSE: + logMsg("LISTEN: close", LOG_INFO, LOG_DEST_CONSOLE); + nextState = CLOSED; + TCB_Reset(currentTCB); + break; + default: + // For all other cases the packet is invalid and will be discarded + break; + } + break; + case SYN_SENT: + switch (event) + { + case RCV_SYN: + logMsg("SYN_SENT: rx_syn", LOG_INFO, LOG_DEST_CONSOLE); + // Simultaneous open + currentTCB->remoteSeqno = tcpHeader.sequenceNumber; + currentTCB->remoteAck = tcpHeader.sequenceNumber + 1; // Ask for next packet + + // Save data from TCP header + currentTCB->remoteWnd = ntohs(tcpHeader.windowSize); + currentTCB->mss = tcpMss; + + // Create and send a ACK packet + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_SYN_RETRIES; + currentTCB->flags = TCP_SYN_FLAG | TCP_ACK_FLAG; + + TCP_Snd(currentTCB); + + // Go to SYN_RECEIVED and waiting for the ack + nextState = SYN_RECEIVED; + break; + case RCV_SYNACK: + logMsg("SYN_SENT: rx_synack", LOG_INFO, LOG_DEST_CONSOLE); + + currentTCB->timeout = 0; + + if ((currentTCB->localSeqno + 1) == tcpHeader.ackNumber) + { + // Create and send a ACK packet + currentTCB->localSeqno = currentTCB->localSeqno + 1; + currentTCB->flags = TCP_ACK_FLAG; + + // Save data from TCP header + currentTCB->remoteSeqno = tcpHeader.sequenceNumber; + // Ask for next packet + currentTCB->remoteAck = tcpHeader.sequenceNumber + 1; + + currentTCB->remoteWnd = ntohs(tcpHeader.windowSize); + currentTCB->mss = tcpMss; + + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = ESTABLISHED; + currentTCB->socketState = SOCKET_CONNECTED; + } + } + else + { + // Send reset + currentTCB->localSeqno = tcpHeader.ackNumber; + currentTCB->flags = TCP_RST_FLAG | TCP_ACK_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + break; + case RCV_ACK: + logMsg("SYN_SENT: rx_ack", LOG_INFO, LOG_DEST_CONSOLE); + + currentTCB->timeout = 0; + + if ((currentTCB->localSeqno + 1) == tcpHeader.ackNumber) + { + // Create and send a ACK packet + currentTCB->localSeqno = currentTCB->localSeqno + 1; + currentTCB->flags = TCP_ACK_FLAG; + + // Save data from TCP header + currentTCB->remoteSeqno = tcpHeader.sequenceNumber; + currentTCB->remoteAck = tcpHeader.sequenceNumber + 1; // ask for next packet + + currentTCB->remoteWnd = ntohs(tcpHeader.windowSize); + currentTCB->mss = tcpMss; + + nextState = ESTABLISHED; + currentTCB->socketState = SOCKET_CONNECTED; + } + else + { + // Send reset + currentTCB->localSeqno = tcpHeader.ackNumber; + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + break; + case CLOSE: + logMsg("SYN_SENT: close", LOG_INFO, LOG_DEST_CONSOLE); + // Go to CLOSED state + nextState = CLOSED; + TCB_Reset(currentTCB); + break; + case TIMEOUT: + logMsg("SYN_SENT: timeout", LOG_INFO, LOG_DEST_CONSOLE); + // Looks like the the packet was lost + // Check inside the packet to see where to jump next + if (currentTCB->timeoutsCount) + { + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + if (currentTCB->flags & TCP_RST_FLAG) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + else if (currentTCB->flags & TCP_ACK_FLAG) + { + nextState = ESTABLISHED; + currentTCB->socketState = SOCKET_CONNECTED; + } + } + } + else + { + // Just reset the connection if there is no reply + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + break; + case RCV_RST: + case RCV_RSTACK: + // Port seems not to be opened + nextState = CLOSED; + TCB_Reset(currentTCB); + break; + default: + // For all other cases the packet is invalid and will be discarded + break; + } + break; + case SYN_RECEIVED: + switch (event) + { + case RCV_SYNACK: + logMsg("SYN_RECEIVED: rx_synack", LOG_INFO, LOG_DEST_CONSOLE); + if (currentTCB->localPort == tcpHeader.destPort) + { + // stop the current timeout + currentTCB->timeout = 0; + + // This is part of simultaneous open + if ((currentTCB->destIP == receivedRemoteAddress) && (currentTCB->destPort == tcpHeader.sourcePort)) + if ((currentTCB->localSeqno + 1) == tcpHeader.ackNumber) + nextState = ESTABLISHED; + + currentTCB->socketState = SOCKET_CONNECTED; + } + break; + case RCV_ACK: + logMsg("SYN_RECEIVED: rx_ack", LOG_INFO, LOG_DEST_CONSOLE); + + // Checking if the packet is for the curent TCB + // Checking the remote IP address and remote port + if ((currentTCB->destIP == receivedRemoteAddress) && (currentTCB->destPort == tcpHeader.sourcePort)) + { + // Checking the sequence numbers to verify if it was the packet that was asked for + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + // Is ACK OK? + if ((currentTCB->localSeqno + 1) == tcpHeader.ackNumber) + { + currentTCB->localSeqno = currentTCB->localSeqno + 1; + // Stop the current timeout + currentTCB->timeout = 0; + + nextState = ESTABLISHED; + currentTCB->socketState = SOCKET_CONNECTED; + } + } + } + break; + case CLOSE: + logMsg("SYN_RECEIVED: close", LOG_INFO, LOG_DEST_CONSOLE); + // Stop the current timeout + currentTCB->timeout = 0; + // Need to send FIN and go to the FIN_WAIT_1 + currentTCB->flags = TCP_FIN_FLAG; + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_RETRIES; + + nextState = FIN_WAIT_1; + TCP_Snd(currentTCB); + break; + case RCV_RSTACK: + case RCV_RST: + // Reset the connection + logMsg("SYN_RECEIVED: rx_rst", LOG_INFO, LOG_DEST_CONSOLE); + // Check if the local port matches or else drop the packet + if (currentTCB->localPort == tcpHeader.destPort) + { + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + logMsg("rst seq OK", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->destIP = 0; + currentTCB->destPort = 0; + currentTCB->localSeqno = 0; + currentTCB->localLastAck = 0; + currentTCB->remoteSeqno = 0; + currentTCB->remoteAck = 0; + currentTCB->remoteWnd = 0; + // TCP_MAX_SEG_SIZE instead of 0 + currentTCB->mss = TCP_MAX_SEG_SIZE; + + nextState = LISTEN; + } + } + break; + case TIMEOUT: + logMsg("SYN_RECEIVED: timeout", LOG_INFO, LOG_DEST_CONSOLE); + if (currentTCB->timeoutsCount) + { + TCP_Snd(currentTCB); + } + else + { + // Reseting the connection if there is no reply + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + currentTCB->destIP = 0; + currentTCB->destPort = 0; + currentTCB->localSeqno = 0; + currentTCB->localLastAck = 0; + currentTCB->remoteSeqno = 0; + currentTCB->remoteAck = 0; + currentTCB->remoteWnd = 0; + // TCP_MAX_SEG_SIZE instead of 0 + currentTCB->mss = TCP_MAX_SEG_SIZE; + nextState = LISTEN; + } + } + break; + default: + // Invalid packet so drop it + break; + } + break; + case ESTABLISHED: + switch (event) + { + case RCV_ACK: + logMsg("ESTABLISHED: rx_ack", LOG_INFO, LOG_DEST_CONSOLE); + if (currentTCB->destIP == receivedRemoteAddress) + { + // Is sequence number OK? + // Remote ACK should be equal to header sequence number + // Not accepting out of order packet (not enough memory) + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + // This is a ACK packet only + // Checking the ACK sequence + // Checking if this is already present in the received ACK + if (currentTCB->localLastAck < tcpHeader.ackNumber) + { + // Check how many bytes sent was acknowledged + if ((currentTCB->localSeqno + 1) >= tcpHeader.ackNumber) + { + notAckBytes = (uint16_t)(currentTCB->localSeqno - tcpHeader.ackNumber); + + // Updating the pointer for next TX + currentTCB->txBufferPtr = currentTCB->txBufferPtr - notAckBytes; + currentTCB->bytesToSend = currentTCB->bytesToSend + notAckBytes; + + currentTCB->localLastAck = tcpHeader.ackNumber - 1; + currentTCB->localSeqno = tcpHeader.ackNumber; + if (bytesToSendForRetransmit == 0) + { + localSeqnoForRetransmit = currentTCB->localSeqno; + } + // Checking if all TX buffer/data was acknowledged + if (currentTCB->bytesToSend == 0) + { + if (currentTCB->txBufState == TX_BUFF_IN_USE) + { + currentTCB->txBufState = NO_BUFF; + // Stopping timeout + currentTCB->timeout = 0; + } + } + else + { + if (bytesToSendForRetransmit) + { + currentTCB->txBufferPtr = txBufferPtrForRetransmit; + currentTCB->bytesSent = bytesToSendForRetransmit; + currentTCB->localSeqno = localSeqnoForRetransmit; + } + else + { + currentTCB->bytesSent = currentTCB->bytesToSend; + } + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_RETRIES; + TCP_Snd(currentTCB); + if ((bytesToSendForRetransmit > 0) && (lastAckNumber != tcpHeader.ackNumber)) + { + bytesToSendForRetransmit = 0; + } + } + + // Checking if the packet has payload + if (rcvPayloadLen > 0) + { + currentTCB->remoteSeqno = tcpHeader.sequenceNumber; + + // Copying the payload to the local buffer + TCP_PayloadSave(rcvPayloadLen); + } + } + else + { + // This is a wrong ACK + // ACK a packet that wasn't transmitted + } + } + } + } + break; + case CLOSE: + logMsg("ESTABLISHED: close", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->flags = TCP_FIN_FLAG | TCP_ACK_FLAG; + nextState = FIN_WAIT_1; + currentTCB->timeout = 0; + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_RETRIES; + TCP_Snd(currentTCB); + break; + case RCV_FIN: + logMsg("ESTABLISHED: rx_fin", LOG_INFO, LOG_DEST_CONSOLE); + break; + case RCV_FINACK: + if (currentTCB->destIP == receivedRemoteAddress) + { + // Is sequence number OK? + // Remote ACK should be equal to header sequence number + // Not accepting out of order packet (not enough memory) + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + currentTCB->bytesSent = 0; + // ACK the current packet + currentTCB->localSeqno = tcpHeader.ackNumber; + currentTCB->remoteAck = currentTCB->remoteAck + 1; + + // Check if the packet has payload added + if (rcvPayloadLen > 0) + { + currentTCB->remoteSeqno = tcpHeader.sequenceNumber; + + // Copy the payload to the local buffer + TCP_PayloadSave(rcvPayloadLen); + } + + currentTCB->socketState = SOCKET_CLOSING; + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_RETRIES; + // Jump over CLOSE_WAIT state and send one packet with FIN + ACK + currentTCB->flags = TCP_FIN_FLAG | TCP_ACK_FLAG; + + nextState = LAST_ACK; + TCP_Snd(currentTCB); + } + } + break; + case RCV_RST: + case RCV_RSTACK: + currentTCB->flags = TCP_RST_FLAG; + TCP_Snd(currentTCB); + nextState = CLOSED; + TCB_Reset(currentTCB); + break; + case TIMEOUT: + logMsg("ESTABLISHED: timeout", LOG_INFO, LOG_DEST_CONSOLE); + if (currentTCB->timeoutsCount) + { + TCP_TimoutRetransmit(); + } + else + { + // Reset the connection if there is no reply + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + break; + default: + break; + } + break; + case FIN_WAIT_1: + switch (event) + { + case RCV_FIN: + currentTCB->flags = TCP_ACK_FLAG; + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + currentTCB->bytesSent = 0; + currentTCB->localSeqno = currentTCB->localSeqno + 1; + currentTCB->remoteAck = currentTCB->remoteAck + 1; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSING; + } + } + break; + case RCV_ACK: + logMsg("FIN_WAIT_1: rx_ack", LOG_INFO, LOG_DEST_CONSOLE); + // Stop the current timeout + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = 1; + nextState = FIN_WAIT_2; + break; + case RCV_FINACK: + logMsg("FIN_WAIT_1: rx_finack", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->flags = TCP_ACK_FLAG; + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + currentTCB->bytesSent = 0; + currentTCB->localSeqno = currentTCB->localSeqno + 1; + currentTCB->remoteAck = currentTCB->remoteAck + 1; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = TIME_WAIT; + } + } + break; + case TIMEOUT: + logMsg("FIN_WAIT_1: timeout", LOG_INFO, LOG_DEST_CONSOLE); + if (currentTCB->timeoutsCount) + { + TCP_Snd(currentTCB); + } + else + { + // Just reset the connection if there is no reply + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + break; + default: + break; + } + break; + case FIN_WAIT_2: + switch (event) + { + case RCV_FINACK: + case RCV_FIN: + logMsg("FIN_WAIT_2: rx_fin/rx_finack", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->flags = TCP_ACK_FLAG; + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + currentTCB->bytesSent = 0; + currentTCB->localSeqno = currentTCB->localSeqno + 1; + currentTCB->remoteAck = currentTCB->remoteAck + 1; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = TIME_WAIT; + } + } + + break; + case TIMEOUT: + logMsg("FIN_WAIT_2: timeout", LOG_INFO, LOG_DEST_CONSOLE); + if (currentTCB->timeoutsCount) + { + TCP_Snd(currentTCB); + } + else + { + // Just reset the connection if there is no reply + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + break; + default: + break; + } + break; + case CLOSE_WAIT: + // This state is defined in RFC, but is not used in the application + break; + case CLOSING: + switch (event) + { + case RCV_ACK: + logMsg("CLOSING: rx_ack", LOG_INFO, LOG_DEST_CONSOLE); + nextState = TIME_WAIT; + break; + default: + break; + } + break; + case LAST_ACK: + // Check if the packet belongs to the curent TCB + switch (event) + { + case RCV_FINACK: + case RCV_ACK: + if ((currentTCB->destIP == receivedRemoteAddress) && + (currentTCB->destPort == tcpHeader.sourcePort)) + { + logMsg("LAST_ACK: rx_ack", LOG_INFO, LOG_DEST_CONSOLE); + nextState = CLOSED; + TCB_Reset(currentTCB); + } + break; + case TIMEOUT: + if (currentTCB->timeoutsCount) + { + TCP_Snd(currentTCB); + } + else + { + // Just reset the connection if there is no reply + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + default: + break; + } + break; + case TIME_WAIT: + logMsg("Time Wait", LOG_INFO, LOG_DEST_CONSOLE); + nextState = CLOSED; + TCB_Reset(currentTCB); + break; + case CLOSED: + switch (event) + { + case ACTIVE_OPEN: + logMsg("CLOSED: active_open", LOG_INFO, LOG_DEST_CONSOLE); + // Create and send a SYN packet + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_SYN_RETRIES; + currentTCB->flags = TCP_SYN_FLAG; + TCP_Snd(currentTCB); + nextState = SYN_SENT; + ret = SUCCESS; + break; + case PASIVE_OPEN: + logMsg("CLOSED: passive_open", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->destIP = 0; + currentTCB->destPort = 0; + nextState = LISTEN; + ret = SUCCESS; + break; + default: + break; + } + break; + default: + break; + } + currentTCB->connectionEvent = NOP; // Handling the event... + currentTCB->fsmState = nextState; + return ret; +} + +void TCP_Init(void) +{ + tcbList = NULL; + tcbListSize = 0; + nextAvailablePort = LOCAL_TCP_PORT_START_NUMBER; + nextSequenceNumber = 0; +} + +error_msg TCP_SocketInit(tcpTCB_t *tcbPtr) +{ + error_msg ret = ERROR; + + // Verify that this socket is not in the list + if (TCB_Check(tcbPtr) == ERROR) + { + TCB_Reset(tcbPtr); + + tcbPtr->localWnd = 0; // Input the RX buffer size + tcbPtr->mss = TCP_MAX_SEG_SIZE; + tcbPtr->fsmState = CLOSED; + tcbPtr->connectionEvent = NOP; + tcbPtr->rxBufferStart = NULL; + tcbPtr->rxBufState = NO_BUFF; + tcbPtr->txBufferStart = NULL; + tcbPtr->txBufferPtr = NULL; + tcbPtr->bytesToSend = 0; + tcbPtr->bytesSent = 0; + tcbPtr->payloadSave = false; + tcbPtr->txBufState = NO_BUFF; + tcbPtr->socketState = SOCKET_CLOSED; + + TCB_Insert(tcbPtr); + ret = SUCCESS; + } + return ret; +} + +error_msg TCP_SocketRemove(tcpTCB_t *tcbPtr) +{ + error_msg ret = ERROR; + + // Verify that this socket is in the Closed State + if (TCP_SocketPoll(tcbPtr) == SOCKET_CLOSING) + { + TCB_Remove(tcbPtr); + ret = SUCCESS; + } + return ret; +} + +socketState_t TCP_SocketPoll(tcpTCB_t *socket_ptr) +{ + socketState_t tmpSocketState; + + tmpSocketState = NOT_A_SOCKET; + + if (TCB_Check(socket_ptr) == SUCCESS) + { + tmpSocketState = socket_ptr->socketState; + } + + return tmpSocketState; +} + +error_msg TCP_Bind(tcpTCB_t *tcbPtr, uint16_t port) +{ + error_msg ret = ERROR; + + logMsg("tcp_bind", LOG_INFO, LOG_DEST_CONSOLE); + + if (TCB_Check(tcbPtr) == SUCCESS) + { + tcbPtr->localPort = port; + ret = SUCCESS; + } + return ret; +} + +error_msg TCP_Listen(tcpTCB_t *tcbPtr) +{ + error_msg ret = ERROR; + + logMsg("tcp_listen", LOG_INFO, LOG_DEST_CONSOLE); + + if (TCB_Check(tcbPtr) == SUCCESS) + { + tcbPtr->connectionEvent = PASIVE_OPEN; + tcbPtr->socketState = SOCKET_IN_PROGRESS; + tcbPtr->localSeqno = nextSequenceNumber; + currentTCB = tcbPtr; + if (tcbPtr->localPort == 0) + { + tcbPtr->localPort = nextAvailablePort++; + } + ret = TCP_FiniteStateMachine(); + } + return ret; +} + +error_msg TCP_Connect(tcpTCB_t *tcbPtr, sockaddr_in4_t *srvaddr) +{ + error_msg ret = ERROR; + + if (TCP_SocketPoll(tcbPtr) == SOCKET_CLOSED) + { + tcbPtr->destIP = srvaddr->addr.s_addr; + tcbPtr->destPort = srvaddr->port; + if (tcbPtr->localPort == 0) + { + // Using a random port for the local one + tcbPtr->localPort = nextAvailablePort++; + } + + tcbPtr->fsmState = CLOSED; + tcbPtr->socketState = SOCKET_IN_PROGRESS; + tcbPtr->localSeqno = nextSequenceNumber; + tcbPtr->connectionEvent = ACTIVE_OPEN; + + currentTCB = tcbPtr; + ret = TCP_FiniteStateMachine(); + } + + return ret; +} + +error_msg TCP_Close(tcpTCB_t *tcbPtr) +{ + error_msg ret = ERROR; + + logMsg("tcp_close", LOG_INFO, LOG_DEST_CONSOLE); + + if (TCB_Check(tcbPtr) == SUCCESS) + { + tcbPtr->connectionEvent = CLOSE; + + tcbPtr->txBufState = NO_BUFF; + tcbPtr->rxBufState = NO_BUFF; + tcbPtr->txBufferPtr = NULL; + tcbPtr->txBufferStart = NULL; + tcbPtr->rxBufferPtr = NULL; + tcbPtr->rxBufferStart = NULL; + tcbPtr->bytesToSend = 0; + tcbPtr->bytesSent = 0; + tcbPtr->payloadSave = false; + + currentTCB = tcbPtr; + ret = TCP_FiniteStateMachine(); + } + return ret; +} + +error_msg TCP_Send(tcpTCB_t *tcbPtr, uint8_t *data, uint16_t dataLen) +{ + error_msg ret = ERROR; + + if (TCP_SocketPoll(tcbPtr) == SOCKET_CONNECTED) + { + if (tcbPtr->txBufState == NO_BUFF) + { + if (data != NULL) + { + tcbPtr->txBufferStart = data; + tcbPtr->txBufferPtr = tcbPtr->txBufferStart; + tcbPtr->bytesToSend = dataLen; + tcbPtr->txBufState = TX_BUFF_IN_USE; + tcbPtr->bytesSent = dataLen; + + tcbPtr->timeout = TCP_START_TIMEOUT_VAL; + tcbPtr->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + tcbPtr->timeoutsCount = TCP_MAX_RETRIES; + + tcbPtr->flags = TCP_ACK_FLAG; + + TCP_Snd(tcbPtr); + ret = SUCCESS; + } + } + } + return ret; +} + +error_msg TCP_SendDone(tcpTCB_t *tcbPtr) +{ + error_msg ret = ERROR; + + if (TCB_Check(tcbPtr) == SUCCESS) + { + if (tcbPtr->txBufState == NO_BUFF) + { + ret = SUCCESS; + } + } + return ret; +} + +error_msg TCP_InsertRxBuffer(tcpTCB_t *tcbPtr, uint8_t *data, uint16_t data_len) +{ + error_msg ret = ERROR; + + if (TCB_Check(tcbPtr) == SUCCESS) + { + if (tcbPtr->rxBufState == NO_BUFF) + { + if (data != NULL) + { + tcbPtr->rxBufferStart = data; + tcbPtr->rxBufferPtr = tcbPtr->rxBufferStart; + tcbPtr->localWnd = data_len; // Update the available receive windows + tcbPtr->rxBufState = RX_BUFF_IN_USE; + ret = SUCCESS; + } + } + } + return ret; +} + +int16_t TCP_GetReceivedData(tcpTCB_t *tcbPtr) +{ + int16_t ret = 0; + + if (TCB_Check(tcbPtr) == SUCCESS) + { + if (tcbPtr->rxBufState == RX_BUFF_IN_USE) + { + ret = tcbPtr->rxBufferPtr - tcbPtr->rxBufferStart; + + if (ret != 0) + { + tcbPtr->localWnd = 0; + tcbPtr->rxBufState = NO_BUFF; + } + } + } + return ret; +} + +int16_t TCP_GetRxLength(tcpTCB_t *tcbPtr) +{ + int16_t ret = 0; + + if (TCB_Check(tcbPtr) == SUCCESS) + { + if (tcbPtr->rxBufState == RX_BUFF_IN_USE) + { + ret = tcbPtr->rxBufferPtr - tcbPtr->rxBufferStart; + } + } + return ret; +} + +void TCP_Update(void) +{ + tcpTCB_t *tcbPtr; + tcbPtr = NULL; + int count = 0; + + // Update sequence number and local port number in order to be different for each new connection + nextSequenceNumber++; + + // Keep local port number in the general port range + nextAvailablePort = nextAvailablePort + 1; + if (nextAvailablePort < LOCAL_TCP_PORT_START_NUMBER) + { + nextAvailablePort = LOCAL_TCP_PORT_START_NUMBER; + } + + tcbPtr = tcbList; + while ((tcbPtr != NULL) && (count < tcbListSize)) + { + if (tcbPtr->timeout > 0) + { + logMsg("tcp timeout", LOG_INFO, LOG_DEST_CONSOLE); + tcbPtr->timeout = tcbPtr->timeout - 1; + + if (tcbPtr->timeout == 0) + { + // Making sure not to overwrite anything else + if (tcbPtr->connectionEvent == NOP) + { + int retries = TCP_MAX_RETRIES - tcbPtr->timeoutsCount; + if (retries < 0) + { + retries = 0; + } + tcbPtr->timeout = tcbPtr->timeoutReloadValue << retries; + // If not zero + if (tcbPtr->timeoutsCount != 0) + tcbPtr->timeoutsCount = tcbPtr->timeoutsCount - 1u; + tcbPtr->connectionEvent = TIMEOUT; + currentTCB = tcbPtr; + TCP_FiniteStateMachine(); + } + } + } + tcbPtr = tcbPtr->nextTCB; + count++; + } +} + +static error_msg TCP_TimoutRetransmit(void) +{ + currentTCB->txBufferPtr -= tcpDataLength; + txBufferPtrForRetransmit = currentTCB->txBufferPtr; + bytesToSendForRetransmit = tcpDataLength; + currentTCB->localSeqno = localSeqnoForRetransmit; + lastAckNumber = tcpHeader.ackNumber; + return TCP_Snd(currentTCB); +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/udpv4.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/udpv4.c new file mode 100644 index 0000000..04a5df1 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/udpv4.c @@ -0,0 +1,138 @@ +/** + * UDP Protocol v4 Source File + * + * @file udpv4.c + * + * @ingroup udp + * + * @brief This file provides the API implementation for the User Datagram Protocol version 4 (UDP v4). + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../ipv4.h" +#include "../udpv4.h" +#include "../udpv4_port_handler_table.h" +#include "../network.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../tcpip_types.h" + +// Variables +uint16_t destPort; +udpHeader_t udpHeader; + +// UDP Library Functions +error_msg UDP_Start(uint32_t destIP, uint16_t srcPort, uint16_t dstPort) +{ + // Start a UDP Packet to Write UDP Header + error_msg ret = ERROR; + + // Start IPv4 Packet to Write IPv4 Header + ret = IPv4_Start(destIP,UDP_TCPIP); + if(ret == SUCCESS) + { + //Start to Count the UDP payload length Bytes + ETH_ResetByteCount(); + + // Write UDP Source Port + ETH_Write16(srcPort); + + //Write UDP Destination Port + ETH_Write16(dstPort); + + //Write DataLength; Initially set to '0' + ETH_Write16(0); + + //Write UDP Checksum; Initially set to '0' + ETH_Write16(0); + + } + return ret; +} + +error_msg UDP_Send(void) +{ + uint16_t udpLength; + uint16_t cksm; + error_msg ret = ERROR; + + udpLength = ETH_GetByteCount(); + udpLength = ntohs(udpLength); + ETH_Insert((char *)&udpLength, 2, sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) + offsetof(udpHeader_t,length)); + udpLength = htons(udpLength); + + // add the UDP header checksum + cksm = udpLength + UDP_TCPIP; + cksm = ETH_TxComputeChecksum(sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) - 8, udpLength + 8, cksm); + + // if the computed checksum is "0" set it to 0xFFFF + if (cksm == 0){ + cksm = 0xffff; + } + ETH_Insert((char *)&cksm, 2, sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) + offsetof(udpHeader_t,checksum)); + + ret = IPV4_Send(udpLength); + + return ret; +} + +error_msg UDP_Receive(uint16_t udpcksm) +{ + error_msg ret = ERROR; + udp_table_iterator_t hptr; + + ETH_ReadBlock((char *)&udpHeader,sizeof(udpHeader)); + + if((udpHeader.checksum == 0) || (udpcksm == 0)) + { + udpHeader.dstPort = ntohs(udpHeader.dstPort); // reverse the port number + destPort = ntohs(udpHeader.srcPort); + udpHeader.length = ntohs(udpHeader.length); + ret = PORT_NOT_AVAILABLE; + // scan the udp port handlers and find a match. + // call the port handler callback on a match + hptr = udp_table_getIterator(); + + while(hptr != NULL) + { + if(hptr->portNumber == udpHeader.dstPort) + { + if(udpHeader.length == IPV4_GetDatagramLength()) + { + hptr->callBack((int16_t)(udpHeader.length - sizeof(udpHeader))); + } + ret = SUCCESS; + break; + } + hptr = udp_table_nextEntry(hptr); + } + if(ret== PORT_NOT_AVAILABLE) + { + } + } + else + { + ret = UDP_CHECKSUM_FAILS; + } + return ret; +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c new file mode 100644 index 0000000..6b53105 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c @@ -0,0 +1,57 @@ +/** + * UDP Port Handler Source File + * + * @file udpv4_port_handler_table.c + * + * @ingroup udp + * + * @brief This file provides the API implementation for the UDP v4 protocol. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include "../tcpip_config.h" +#include "../dhcp_client.h" +#include "../udpv4_port_handler_table.h" + +const udp_handler_t UDP_CallBackTable[] = \ +{ + {68, DHCP_Handler}, + +}; + +// UDPV4 Port Handler Functions +udp_table_iterator_t udp_table_getIterator(void) +{ + if (sizeof(UDP_CallBackTable) == 0) + return (udp_table_iterator_t) NULL; + else + return (udp_table_iterator_t) UDP_CallBackTable; +} + +udp_table_iterator_t udp_table_nextEntry(udp_table_iterator_t i) +{ + i++; + if(i < UDP_CallBackTable + sizeof(UDP_CallBackTable)) + return (udp_table_iterator_t) i; + else + return (udp_table_iterator_t) NULL; +} diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/tcpip_config.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/tcpip_config.h new file mode 100644 index 0000000..6967078 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/tcpip_config.h @@ -0,0 +1,104 @@ +/** + * TCP/IP Stack User Configuration Options Header File + * + * @file tcpip_config.h + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for the TCP/IP Stack user configuration options. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef TCPIP_CONFIG_H +#define TCPIP_CONFIG_H + +// Macros +/** + * @ingroup tcpiplite + * @def MAKE_IPV4_ADDRESS(a,b,c,d) + * @brief Build the IPv4 Address +*/ +#define MAKE_IPV4_ADDRESS(a,b,c,d) ((uint32_t)(((uint32_t)a << 24) | ((uint32_t)b<<16) | ((uint32_t)c << 8) | (uint32_t)d)) + +// ARP Protocol Defines +#define ARP_MAP_SIZE 8 + +// DHCP Protocol Defines +extern const char dhcpName[]; + +/** + * @ingroup tcpiplite + * @def DHCP_NAME_SIZE + * @brief Required since sizeof is not handled during the preprocessor stage + */ +#define DHCP_NAME_SIZE 18 + + +// IP Protocol Defines +#define IPv4_TTL 64u + +// TCP Protocol Defines +/** + * @ingroup tcpiplite + * @def TCP_MAX_SEG_SIZE + * @brief TCP maximum segment size + */ +#define TCP_MAX_SEG_SIZE 1460u +#define TICK_SECOND 1 + +/** + * @ingroup tcpiplite + * @def TCP_START_TIMEOUT_VAL + * @brief Time-out to retransmit unacked data + * + */ +#define TCP_START_TIMEOUT_VAL ((unsigned long)TICK_SECOND*2) + +/** + * @ingroup tcpiplite + * @def TCP_MAX_RETRIES + * @brief Number of retransmission attempts + */ +#define TCP_MAX_RETRIES (5u) + +/** + * @ingroup tcpiplite + * @def TCP_MAX_SYN_RETRIES + * @brief than all other retries to reduce SYN flood DoS duration + */ +#define TCP_MAX_SYN_RETRIES (3u) + +/** + * @ingroup tcpiplite + * @def LOCAL_TCP_PORT_START_NUMBER + * @brief The lower port number to be used as a local port + */ +#define LOCAL_TCP_PORT_START_NUMBER (1024u) + +/** + * @ingroup tcpiplite + * @def LOCAL_TCP_PORT_END_NUMBER + * @brief The highest port number to be used as a local port + */ +#define LOCAL_TCP_PORT_END_NUMBER (65535u) + +// Neighbor Discovery Protocol Defines + +#endif /* TCPIP_CONFIG_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/tcpip_types.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/tcpip_types.h new file mode 100644 index 0000000..1c816ca --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/tcpip_types.h @@ -0,0 +1,527 @@ +/** + * TCP/IP Stack User Types Header File + * + * @file tcpip_types.h + * + * @ingroup tcpiplite + * + * @brief This file provides the TCP/IP Stack type definitions. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef TCPIP_TYPES_H +#define TCPIP_TYPES_H + +// Included Files +#include + +typedef enum +{ + TCB_ERROR = -1, + TCB_NO_ERROR = 0 +} tcbError_t; + +/** + * @ingroup tcpiplite + * @struct ethernetFrame_t + * @brief Ethernet frame information. + */ +typedef struct +{ + uint8_t destinationMAC[6]; + uint8_t sourceMAC[6]; + union + { + uint16_t type; /**< Ethernet 2 frame type, 802.3 length, 802.1Q TPID */ + uint16_t length; + uint16_t tpid; + } id; + // if tpid == 0x8100 then TCI structure goes here + // if tpid != 0x8100, then ethertype/length goes here + // UP to 1500 Bytes of payload goes here + // 32 bit checksum goes here +} ethernetFrame_t; + +#define ETHERTYPE_IPV4 0x0800 +#define ETHERTYPE_ARP 0x0806 +#define ETHERTYPE_IPV6 0x86DD +#define ETHERTYPE_VLAN 0x8100 +#define ETHERTYPE_LLDP 0x88CC +#define ETHERTYPE_EAPoL 0x888E + +// From RFC 2851 +#define INETADDRESSTYPE_IPV4 1 +#define INETADDRESSTYPE_IPV6 2 +#define INETADDRESSTYPE_DNS 16 + +#define ETHERNET_ADDR_LEN 6 +#define IP_ADDR_LEN 4 + +// From RFC 3493 +// Supported address families +#ifndef AF_INET6 +/** + * @ingroup tcpiplite + * @def AF_INET + * @brief Internet IP Protocol + */ +#define AF_INET 2 +#endif + +#ifndef AF_INET6 +/** + * @ingroup tcpiplite + * @def AF_INET6 + * @brief IP version 6 + */ +#define AF_INET6 10 +#endif + +#ifndef PF_INET +/** + * @ingroup tcpiplite + * @def PF_INET + * @brief Protocol families, same as address families + */ +#define PF_INET AF_INET +#endif + +#ifndef PF_INET6 +#define PF_INET6 AF_INET6 +#endif + +#ifndef IN6ADDR_ANY_INIT +#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } } +#endif + +#ifndef IN6ADDR_LOOPBACK_INIT +#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } } +#endif + +#ifndef INET_ADDRSTRLEN +/** + * @ingroup tcpiplite + * @def INET_ADDRSTRLEN + * @brief Length of the string form for IP + */ +#define INET_ADDRSTRLEN 16 +#endif + +#ifndef INET6_ADDRSTRLEN +/** + * @ingroup tcpiplite + * @def INET6_ADDRSTRLEN + * @brief Length of the string form for IPv6 + */ +#define INET6_ADDRSTRLEN 46 +#endif + +/** + * @ingroup tcpiplite + * @struct ipv4Header_t + * @brief IPv4 header information + */ +typedef struct +{ + unsigned ihl : 4; /**< Internet header length in 32-bit words */ + unsigned version : 4; /**< 4 for IPV4 */ + unsigned ecn : 2; /**< Explicit Congestion Notification RFC3168 */ + unsigned dscp : 6; /**< Differentiated Service Code Point RFC3260 */ + uint16_t length; /**< Total length including header and data (no more than 576 octets) */ + uint16_t identifcation; /**< ID for packet fragments */ + unsigned fragmentOffsetHigh : 5; /**< Offset for a fragment, needed for reassembly */ + unsigned : 1; /**< Leave this bit as zero */ + unsigned dontFragment : 1; /**< Drop if fragmentation is required to route */ + unsigned moreFragments : 1; /**< Fragments have this bit set (except for the final packet) */ + uint8_t fragmentOffsetLow; /**< Low byte for the fragment offset */ + uint8_t timeToLive; /**< Decrement at each hop and discard when zero */ + uint8_t protocol; /**< IP Protocol (from RFC790) */ + uint16_t headerCksm; /**< RFC1071 defines this calculation */ + uint32_t srcIpAddress; /**< Source IP Address */ + uint32_t dstIpAddress; /**< Destination IP Address */ + /* options could go here if IHL > 5 */ + /* payload goes here */ +} ipv4Header_t; + +/** + * @ingroup tcpiplite + * @struct ipv4_pseudo_header_t + * @brief Pseudo header used for checksum calculation on UDP and TCP + */ +typedef struct +{ + uint32_t srcIpAddress; /**< Source IP Address */ + uint32_t dstIpAddress; /**< Destination IP Address */ + uint8_t protocol; /**< Protocol */ + uint8_t z; /**< Used for memory cleaning */ + uint16_t length; /**< Length */ +} ipv4_pseudo_header_t; + +/** + * @ingroup tcpiplite + * @struct icmpHeader_t + * @brief ICMP header information + */ +typedef struct +{ + union + { + uint16_t typeCode; + struct + { + uint8_t code; + uint8_t type; + }; + }; + uint16_t checksum; +} icmpHeader_t; + + +/** + * @ingroup tcpiplite + * @enum icmpTypeCodes_t + * @brief ICMP Types and Codes + */ +typedef enum +{ + ECHO_REPLY = 0x0000, /**< Echo reply */ + DEST_NETWORK_UNREACHABLE = 0x0300, /**< Destination network unreachable */ + DEST_HOST_UNREACHABLE = 0x0301, /**< Destination host unreachable */ + DEST_PROTOCOL_UNREACHABLE = 0x0302, /**< Destination protocol unreachable */ + DEST_PORT_UNREACHABLE = 0x0303, /**< Destination port unreachable */ + FRAGMENTATION_REQUIRED = 0x0304, /**< Fragmentation required */ + SOURCE_ROUTE_FAILED = 0x0305, /**< Fragmentation failed */ + DESTINATION_NETWORK_UNKNOWN = 0x0306, /**< Unknown destination network */ + SOURCE_HOST_ISOLATED = 0x0307, /**< Source host isolated */ + NETWORK_ADMINISTRATIVELY_PROHIBITED = 0x0308, /**< Network administratively prohibited */ + HOST_ADMINISTRATIVELY_PROHIBITED = 0x0309, /**< Host administratively prohibited */ + NETWORK_UNREACHABLE_FOR_TOS = 0x030A, /**< Network unreachable for TOS */ + HOST_UNREACHABLE_FOR_TOS = 0x030B, /**< Host unreachable for TOS */ + COMMUNICATION_ADMINISTRATIVELY_PROHIBITED = 0x030C, /**< Communication administratively prohibited */ + HOST_PRECEDENCE_VIOLATION = 0x030D, /**< Host precedence violation */ + PRECEDENCE_CUTOFF_IN_EFFECT = 0x030E, /**< Precedence cutoff in effect */ + SOURCE_QUENCH = 0x0400, /**< Source quench */ + REDIRECT_DATAGRAM_FOR_THE_NETWORK = 0x0500, /**< Redirect message for the network*/ + REDIRECT_DATAGRAM_FOR_THE_HOST = 0x0501, /**< Redirect message for the host*/ + REDIRECT_DATAGRAM_FOR_THE_TOS_AND_NETWORK = 0x0502, /**< Redirect message for the TOS and network*/ + REDIRECT_DATAGRAM_FOR_THE_TOS_AND_HOST = 0x0503, /**< Redirect message for the TOS and host*/ + ALTERNATE_HOST_ADDRESS = 0x0600, /**< Alternate host address */ + ECHO_REQUEST = 0x0800, /**< Echo Request: Ask for a ping! */ + UNASSIGNED_ECHO_TYPE_CODE_REQUEST_1 = 0x082A, /**< Unassigned codes */ + UNASSIGNED_ECHO_TYPE_CODE_REQUEST_2 = 0x08FC, /**< Unassigned codes */ + ROUTER_ADVERTISEMENT = 0x0900, /**< Router advertisement */ + ROUTER_SOLICITATION = 0x0A00, /**< Router solicitaion */ + TRACEROUTE = 0x3000 /**< Trace route */ +} icmpTypeCodes_t; + +/** + * @ingroup tcpiplite + * @struct udpHeader_t + * @brief UDP header information + */ +typedef struct +{ + uint16_t srcPort; /**< Source Port */ + uint16_t dstPort; /**< Destination Port */ + uint16_t length; /**< Length */ + uint16_t checksum; /**< Checksum */ +} udpHeader_t; + +/** + * @ingroup tcpiplite + * @struct tcpHeader_t + * @brief TCP header information + */ +typedef struct +{ + uint16_t sourcePort; /**< Source port */ + uint16_t destPort; /**< Destination port */ + uint32_t sequenceNumber; /**< Sequence number */ + uint32_t ackNumber; /**< ACK Number */ + union + { + uint8_t byte13; + struct + { + uint8_t ns : 1; /**< ECN-nonce concealment protection (added to header by RFC 3540). */ + uint8_t reserved : 3; /**< For future use and needs to be set to zero. */ + uint8_t dataOffset : 4; /**< Specifies the size of the TCP header in 32-bit words. */ + }; + }; + + union + { + uint8_t flags; /**< Flags */ + struct + { + uint8_t fin : 1; /**< No more data from sender. */ + uint8_t syn : 1; /**< Synchronizes sequence numbers. Only the first packet sent from each end must have this flag set. */ + uint8_t rst : 1; /**< Resets the connection. */ + uint8_t psh : 1; /**< Asks to push the buffered data to the receiving application. */ + uint8_t ack : 1; /**< Indicates that the ACKfield is significant. */ + uint8_t urg : 1; /**< Indicates that the Urgent pointer field is significant. */ + uint8_t ece : 1; /**< ECN-Echo. Depends on SYN flag set or clear. */ + uint8_t cwr : 1; /**< Congestion Window Reduced (CWR) (added to header by RFC 3168). */ + }; + }; + + uint16_t windowSize; /**< Window size. */ + uint16_t checksum; /**< TCP Header Checksum. */ + uint16_t urgentPtr; /**< Urgent pointer. */ + // Options follow here + // Pad the header so the total header is a multiple of 4 bytes + // Data follows +} tcpHeader_t; + + +/** + * @ingroup tcpiplite + * @enum ipProtocolNumbers + * @brief IP Protocol Numbers. + * List from RFC5237 http://www.iana.org/assignments/protocol-numbers/protocol-numbers.txt + */ +typedef enum { +// Keyword Decimal Protocol Reference + HOPOPT_TCPIP = 0, /**< IPv6 Hop-by-Hop Option [RFC2460] */ + ICMP_TCPIP = 1, /**< Internet Control Message [RFC792] */ + IGMP_TCPIP = 2, /**< Internet Group Management [RFC1112] */ + GGP_TCPIP = 3, /**< Gateway-to-Gateway [RFC823] */ + IPV4_TCPIP = 4, /**< IPv4 encapsulation [RFC2003] */ + ST_TCPIP = 5, /**< Stream [RFC1190][RFC1819] */ + TCP_TCPIP = 6, /**< Transmission Control [RFC793] */ + CBT_TCPIP = 7, /**< CBT [Tony_Ballardie] */ + EGP_TCPIP = 8, /**< Exterior Gateway Protocol [RFC888][David_Mills] */ + IGP_TCPIP = 9, /**< Any private interior gateway (used by Cisco for their IGRP) [Internet_Assigned_Numbers_Authority] */ + BBN_RCC_MON_TCPIP = 10, /**< BBN RCC Monitoring [Steve_Chipman] */ + NVP_II_TCPIP = 11, /**< Network Voice Protocol [RFC741][Steve_Casner] */ + PUP_TCPIP = 12, /**< PUP [Boggs, D., J. Shoch, E. Taft, and R. Metcalfe, "PUP: An Internetwork Architecture", XEROX Palo Alto Research Center, CSL-79-10, July 1979; also in IEEE Transactions on Communication, Volume COM-28, Number 4, April 1980.][[XEROX]] */ + ARGUS_TCPIP = 13, /**< ARGUS [Robert_W_Scheifler] */ + EMCON_TCPIP = 14, /**< EMCON [] */ + XNET_TCPIP = 15, /**< Cross Net Debugger [Haverty, J., "XNET Formats for Internet Protocol Version 4", IEN 158, October 1980.][Jack_Haverty] */ + CHAOS_TCPIP = 16, /**< Chaos [J_Noel_Chiappa] */ + UDP_TCPIP = 17, /**< User Datagram [RFC768][Jon_Postel] */ + MUX_TCPIP = 18, /**< Multiplexing [Cohen, D. and J. Postel, "Multiplexing Protocol", IEN 90, USC/Information Sciences Institute, May 1979.][Jon_Postel] */ + DCN_MEAS_TCPIP = 19, /**< DCN Measurement Subsystems [David_Mills] */ + HMP_TCPIP = 20, /**< Host Monitoring [RFC869][Robert_Hinden] */ + PRM_TCPIP = 21, /**< Packet Radio Measurement [Zaw_Sing_Su] */ + XNS_IDP_TCPIP = 22, /**< XEROX NS IDP ["The Ethernet, A Local Area Network: Data Link Layer and Physical Layer Specification", AA-K759B-TK, Digital Equipment Corporation, Maynard, MA. Also as: "The Ethernet - A Local Area Network", Version 1.0, Digital Equipment Corporation, Intel Corporation, Xerox Corporation, September 1980. And: "The Ethernet, A Local Area Network: Data Link Layer and Physical Layer Specifications", Digital, Intel and Xerox, November 1982. And: XEROX, "The Ethernet, A Local Area Network: Data Link Layer and Physical Layer Specification", X3T51/80-50, Xerox Corporation, Stamford, CT., October 1980.][[XEROX]] */ + TRUNK_1_TCPIP = 23, /**< Trunk-1 [Barry_Boehm] */ + TRUNK_2_TCPIP = 24, /**< Trunk-2 [Barry_Boehm] */ + LEAF_1_TCPIP = 25, /**< Leaf-1 [Barry_Boehm] */ + LEAF_2_TCPIP = 26, /**< Leaf-2 [Barry_Boehm] */ + RDP_TCPIP = 27, /**< Reliable Data Protocol [RFC908][Robert_Hinden] */ + IRTP_TCPIP = 28, /**< Internet Reliable Transaction [RFC938][Trudy_Miller] */ + ISO_TP4_TCPIP = 29, /**< ISO Transport Protocol Class 4 [RFC905][] */ + NETBLT_TCPIP = 30, /**< Bulk Data Transfer Protocol [RFC969][David_Clark] */ + MFE_NSP_TCPIP = 31, /**< MFE Network Services Protocol [Shuttleworth, B., "A Documentary of MFENet, a National Computer Network", UCRL-52317, Lawrence Livermore Labs, Livermore, California, June 1977.][Barry_Howard] */ + MERIT_INP_TCPIP = 32, /**< MERIT Internodal Protocol [Hans_Werner_Braun] */ + DCCP_TCPIP = 33, /**< Datagram Congestion Control Protocol [RFC4340] */ + THREEPC_TCPIP = 34, /**< Third Party Connect Protocol [Stuart_A_Friedberg] */ + IDPR_TCPIP = 35, /**< Inter-Domain Policy Routing Protocol [Martha_Steenstrup] */ + XTP_TCPIP = 36, /**< XTP [Greg_Chesson] */ + DDP_TCPIP = 37, /**< Datagram Delivery Protocol [Wesley_Craig] */ + IDPR_CMTP_TCPIP = 38, /**< IDPR Control Message Transport Proto [Martha_Steenstrup] */ + TPpp_TCPIP = 39, /**< TP++ Transport Protocol [Dirk_Fromhein] */ + IL_TCPIP = 40, /**< IL Transport Protocol [Dave_Presotto] */ + IPV6_TUNNEL_TCPIP = 41, /**< IPv6 encapsulation [RFC2473] */ + SDRP_TCPIP = 42, /**< Source Demand Routing Protocol [Deborah_Estrin] */ + IPV6_Route_TCPIP = 43, /**< Routing Header for IPv6 [Steve_Deering] */ + IPV6_Frag_TCPIP = 44, /**< Fragment Header for IPv6 [Steve_Deering] */ + IDRP_TCPIP = 45, /**< Inter-Domain Routing Protocol [Sue_Hares] */ + RSVP_TCPIP = 46, /**< Reservation Protocol [RFC2205][RFC3209][Bob_Braden] */ + GRE_TCPIP = 47, /**< Generic Routing Encapsulation [RFC1701][Tony_Li] */ + DSR_TCPIP = 48, /**< Dynamic Source Routing Protocol [RFC4728] */ + BNA_TCPIP = 49, /**< BNA [Gary Salamon] */ + ESP_TCPIP = 50, /**< Encap Security Payload RFC4303] */ + AH_TCPIP = 51, /**< Authentication Header [RFC4302] */ + I_NLSP_TCPIP = 52, /**< Integrated Net Layer Security TUBA [K_Robert_Glenn] */ + SWIPE_TCPIP = 53, /**< IP with Encryption [John_Ioannidis] */ + NARP_TCPIP = 54, /**< NBMA Address Resolution Protocol [RFC1735] */ + MOBILE_TCPIP = 55, /**< IP Mobility [Charlie_Perkins] */ + TLSP_TCPIP = 56, /**< Transport Layer Security Protocol using Kryptonet key management [Christer_Oberg] */ + SKIP_TCPIP = 57, /**< SKIP [Tom_Markson] */ + IPV6_ICMP_TCPIP = 58, /**< ICMP for IPv6 [RFC2460] */ + IPV6_NoNxt_TCPIP = 59, /**< No Next Header for IPv6 [RFC2460] */ + IPV6_Opts_TCPIP = 60, /**< Destination Options for IPv6 [RFC2460] */ + CFTP_TCPIP = 62, /**< CFTP [Forsdick, H., "CFTP", Network Message, Bolt Beranek and Newman, January 1982.][Harry_Forsdick] */ + SAT_EXPAK_TCPIP = 64, /**< SATNET and Backroom EXPAK [Steven_Blumenthal] */ + KRYPTOLAN_TCPIP = 65, /**< Kryptolan [Paul Liu] */ + RVD_TCPIP = 66, /**< MIT Remote Virtual Disk Protocol [Michael_Greenwald] */ + IPPC_TCPIP = 67, /**< Internet Pluribus Packet Core [Steven_Blumenthal] */ + SAT_MON_TCPIP = 69, /**< SATNET Monitoring [Steven_Blumenthal] */ + VISA_TCPIP = 70, /**< VISA Protocol [Gene_Tsudik] */ + IPCV_TCPIP = 71, /**< Internet Packet Core Utility [Steven_Blumenthal] */ + CPNX_TCPIP = 72, /**< Computer Protocol Network Executive [David Mittnacht] */ + CPHB_TCPIP = 73, /**< Computer Protocol Heart Beat [David Mittnacht] */ + WSN_TCPIP = 74, /**< Wang Span Network [Victor Dafoulas] */ + PVP_TCPIP = 75, /**< Packet Video Protocol [Steve_Casner] */ + BR_SAT_MON_TCPIP = 76, /**< Backroom SATNET Monitoring [Steven_Blumenthal] */ + SUN_ND_TCPIP = 77, /**< SUN ND PROTOCOL-Temporary [William_Melohn] */ + WB_MON_TCPIP = 78, /**< WIDEBAND Monitoring [Steven_Blumenthal] */ + WB_EXPAK_TCPIP = 79, /**< WIDEBAND EXPAK [Steven_Blumenthal] */ + ISO_IP_TCPIP = 80, /**< ISO Internet Protocol [Marshall_T_Rose] */ + VMTP_TCPIP = 81, /**< VMTP [Dave_Cheriton] */ + SECURE_VMTP_TCPIP = 82, /**< SECURE-VMTP [Dave_Cheriton] */ + VINES_TCPIP = 83, /**< VINES [Brian Horn] */ + TTP_TCPIP = 84, /**< TTP [Jim_Stevens] */ + IPTM_TCPIP = 84, /**< Protocol Internet Protocol Traffic Manager [Jim_Stevens] */ + NSFNET_IGP_TCPIP = 85, /**< NSFNET-IGP [Hans_Werner_Braun] */ + DGP_TCPIP = 86, /**< Dissimilar Gateway Protocol [M/A-COM Government Systems, "Dissimilar Gateway Protocol Specification, Draft Version", Contract no. CS901145, November 16, 1987.][Mike_Little] */ + TCF_TCPIP = 87, /**< TCF [Guillermo_A_Loyola] */ + EIGRP_TCPIP = 88, /**< EIGRP [Cisco Systems, "Gateway Server Reference Manual", Manual Revision B, January 10, 1988.][Guenther_Schreiner] */ + OSPFIGP_TCPIP = 89, /**< OSPFIGP [RFC1583][RFC2328][RFC5340][John_Moy] */ + Sprite_RPC_TCPIP = 90, /**< Sprite RPC Protocol [Welch, B., "The Sprite Remote Procedure Call System", Technical Report, UCB/Computer Science Dept., 86/302, University of California at Berkeley, June 1986.][Bruce Willins] */ + LARP_TCPIP = 91, /**< Locus Address Resolution Protocol [Brian Horn] */ + MTP_TCPIP = 92, /**< Multicast Transport Protocol [Susie_Armstrong] */ + AX25_TCPIP = 93, /**< AX.25 Frames [Brian_Kantor] */ + IPIP_TCPIP = 94, /**< IP-within-IP Encapsulation Protocol [John_Ioannidis] */ + MICP_TCPIP = 95, /**< Mobile Internetworking Control Pro. [John_Ioannidis] */ + SCC_SP_TCPIP = 96, /**< Semaphore Communications Sec. Pro. [Howard_Hart] */ + ETHERIP_TCPIP = 97, /**< Ethernet-within-IP Encapsulation [RFC3378] */ + ENCAP_TCPIP = 98, /**< Encapsulation Header [RFC1241][Robert_Woodburn] */ + GMTP_TCPIP = 100, /**< GMTP [[RXB5]] */ + IFMP_TCPIP = 101, /**< Ipsilon Flow Management Protocol [Bob_Hinden][November 1995, 1997.] */ + PNNI_TCPIP = 102, /**< PNNI over IP [Ross_Callon] */ + PIM_TCPIP = 103, /**< Protocol Independent Multicast [RFC4601][Dino_Farinacci] */ + ARIS_TCPIP = 104, /**< ARIS [Nancy_Feldman] */ + SCPS_TCPIP = 105, /**< SCPS [Robert_Durst] */ + QNX_TCPIP = 106, /**< QNX [Michael_Hunter] */ + A_N_TCPIP = 107, /**< Active Networks [Bob_Braden] */ + IPComp_TCPIP = 108, /**< IP Payload Compression Protocol [RFC2393] */ + SNP_TCPIP = 109, /**< Sitara Networks Protocol [Manickam_R_Sridhar] */ + Compaq_Peer_TCPIP = 110, /**< Compaq Peer Protocol [Victor_Volpe] */ + IPX_in_IP_TCPIP = 111, /**< IPX in IP [CJ_Lee] */ + VRRP_TCPIP = 112, /**< Virtual Router Redundancy Protocol [RFC5798] */ + PGM_TCPIP = 113, /**< PGM Reliable Transport Protocol [Tony_Speakman] */ + L2TP_TCPIP = 115, /**< Layer Two Tunneling Protocol [RFC3931][Bernard_Aboba] */ + DDX_TCPIP = 116, /**< D-II Data Exchange (DDX) [John_Worley] */ + IATP_TCPIP = 117, /**< Interactive Agent Transfer Protocol [John_Murphy] */ + STP_TCPIP = 118, /**< Schedule Transfer Protocol [Jean_Michel_Pittet] */ + SRP_TCPIP = 119, /**< SpectraLink Radio Protocol [Mark_Hamilton] */ + UTI_TCPIP = 120, /**< UTI [Peter_Lothberg] */ + SMP_TCPIP = 121, /**< Simple Message Protocol [Leif_Ekblad] */ + SM_TCPIP = 122, /**< SM [Jon_Crowcroft] */ + PTP_TCPIP = 123, /**< Performance Transparency Protocol [Michael_Welzl] */ + ISIS_TCPIP = 124, /**< Over IPv4 [Tony_Przygienda] */ + FIRE_TCPIP = 125, /**< [Criag_Partridge] */ + CRTP_TCPIP = 126, /**< Combat Radio Transport Protocol [Robert_Sautter] */ + CRUDP_TCPIP = 127, /**< Combat Radio User Datagram [Robert_Sautter] */ + SSCOPMCE_TCPIP = 128, /**< [Kurt_Waber] */ + IPLT_TCPIP = 129, /**< [[Hollbach]] */ + SPS_TCPIP = 130, /**< Secure Packet Shield [Bill_McIntosh] */ + PIPE_TCPIP = 131, /**< Private IP Encapsulation within IP [Bernhard_Petri] */ + SCTP_TCPIP = 132, /**< Stream Control Transmission Protocol [Randall_R_Stewart] */ + FC_TCPIP = 133 /**< Fibre Channel [Murali_Rajagopal][RFC6172] */ +} ipProtocolNumbers; + +/** + * @ingroup tcpiplite + * @struct inAddr_t + * @brief INET address + */ +typedef struct +{ + union + { + uint32_t s_addr; + uint8_t s_addr_byte[4]; + }; +} inAddr_t; + + +/** + * @ingroup tcpiplite + * @struct sockaddr_in4_t + * @brief INET4 socket address + */ +typedef struct +{ + uint16_t port; + inAddr_t addr; +} sockaddr_in4_t; + + +extern const char *network_errors[]; + +/** + * @ingroup tcpiplite + * @enum error_msg + * @brief Error message + */ +typedef enum +{ + ERROR = 0, + SUCCESS, + LINK_NOT_FOUND, + BUFFER_BUSY, + TX_LOGIC_NOT_IDLE, + TX_QUEUED, + DMA_TIMEOUT, + MAC_NOT_FOUND, + IP_WRONG_VERSION, + IPV4_CHECKSUM_FAILS, + DEST_IP_NOT_MATCHED, + ICMP_CHECKSUM_FAILS, + UDP_CHECKSUM_FAILS, + TCP_CHECKSUM_FAILS, + PORT_NOT_AVAILABLE, + ARP_IP_NOT_MATCHED, + EAPoL_PACKET_FAILURE, + INCORRECT_IPV4_HLEN, + IPV4_NO_OPTIONS, + IPV6_CHECKSUM_FAILS, + IPV6_LOCAL_ADDR_RESOLVE, + IPV6_LOCAL_ADDR_INVALID, + NO_GATEWAY, + ADDRESS_RESOLUTION, + GLOBAL_DESTINATION, + ARP_WRONG_HARDWARE_ADDR_TYPE, + ARP_WRONG_PROTOCOL_TYPE, + ARP_WRONG_HARDWARE_ADDR_LEN, + ARP_WRONG_PROTOCOL_LEN +} error_msg; + +/** + * @ingroup tcpiplite + * @enum destIP_t + * @brief Destination IP Address + */ +typedef struct +{ + inAddr_t dest_addr; +} destIP_t; + +/** + * @ingroup tcpiplite + * @typedef int8_t + * @brief Counts up to 256 sockets numbers. + */ +typedef int8_t socklistsize_t; + +/** + * @ingroup tcpiplite + * @typedef ip_receive_function_ptr + * @brief Function pointer to the function that receives the payload + * @param int16_t Available bytes for the payload + * @return None. + */ +typedef void (*ip_receive_function_ptr)(int16_t); + +#endif /* TCPIP_TYPES_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/tcpv4.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/tcpv4.h new file mode 100644 index 0000000..8802bed --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/tcpv4.h @@ -0,0 +1,372 @@ +/** + * Transmission Control Protocol (TCP) v4 Header File + * + * @file tcpv4.h + * + * @defgroup tcp TCP + * + * @brief This file provides the API implementation for the Transmission Control Protocol v4 (TCPv4). + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef TCPV4_H +#define TCPV4_H + +// Included Files +#include +#include "tcpip_types.h" + +// Macros +#define TCP_FIN_FLAG 0x01U +#define TCP_SYN_FLAG 0x02U +#define TCP_RST_FLAG 0x04U +#define TCP_PSH_FLAG 0x08U +#define TCP_ACK_FLAG 0x10U +#define TCP_URG_FLAG 0x20U +#define TCP_ECE_FLAG 0x40U +#define TCP_CWR_FLAG 0x80U + +// Enumeration Definition +/** + * @ingroup tcp + * @enum tcp_fsm_states_t + * @brief TCP Finite State Machine (FSM) states. + */ +typedef enum +{ + CLOSED = 0, /**< Facilitates initialization */ + LISTEN, + SYN_SENT, + SYN_RECEIVED, + ESTABLISHED, + FIN_WAIT_1, + FIN_WAIT_2, + CLOSE_WAIT, + CLOSING, + LAST_ACK, + TIME_WAIT, +} tcp_fsm_states_t; + +/** + * @ingroup tcp + * @enum tcpEvent_t + * @brief TCP events. + */ +typedef enum +{ + CLOSE = 0, /**< Facilitates initialization */ + ACTIVE_OPEN, + PASIVE_OPEN, + RCV_SYN, + RCV_ACK, + RCV_SYNACK, + RCV_FIN, + RCV_FINACK, + RX_PACKET, + RCV_RST, + RCV_RSTACK, + RCV_PSHACK, + TIMEOUT, + NOP +} tcpEvent_t; + +/** + * @ingroup tcp + * @enum socketState_t + * @brief Socket states to be used in the application. + */ +typedef enum +{ + NOT_A_SOCKET = 0, /**< This is not a socket */ + SOCKET_CLOSED, /**< Socket closed */ + SOCKET_IN_PROGRESS, /**< The TCP listens or initiates a connection */ + SOCKET_CONNECTED, /**< The TCP is in the established state and the user can send/receive data */ + SOCKET_CLOSING /**< The user initiates the closing procedure for this socket */ +} socketState_t; + +/** + * @ingroup tcp + * @enum tcpSocket_t + * @brief TCP Socket + */ +typedef struct +{ + uint32_t localIP; + uint16_t localPort; + uint32_t remoteIP; + uint16_t remotePort; +} tcpSocket_t; + +/** + * @ingroup tcp + * @enum tcpBufferState_t + * @brief TCP Buffer state. + */ +typedef enum +{ + NO_BUFF = 0, + RX_BUFF_IN_USE, + TX_BUFF_IN_USE +} tcpBufferState_t; + +/** + * @ingroup tcp + * @struct tcpTCB_t + * @brief Defines TCP Transmission Control Block + */ +typedef struct +{ + uint16_t localPort; /**< Local Port */ + + uint32_t destIP; + uint16_t destPort; + + uint32_t remoteSeqno; + uint32_t remoteAck; /**< Last ACK packet sent to remote */ + + uint32_t localSeqno; + uint32_t localLastAck; /**< Last ACK number received */ + + uint16_t remoteWnd; /**< Sender window */ + uint16_t localWnd; /**< Receiver window */ + + uint16_t mss; + + uint8_t *rxBufferStart; + uint8_t *rxBufferPtr; /**< Pointer to write inside the RX buffer */ + tcpBufferState_t rxBufState; + + uint8_t *txBufferStart; + uint8_t *txBufferPtr; + uint16_t bytesToSend; + tcpBufferState_t txBufState; + uint16_t bytesSent; + bool payloadSave; + + tcp_fsm_states_t fsmState; /**< Connection state */ + tcpEvent_t connectionEvent; + + void *nextTCB; /**< Downstream list pointer */ + void *prevTCB; /**< Upstream list pointer */ + + uint16_t timeout; /**< Retransmission time-out in seconds */ + uint16_t timeoutReloadValue; + uint8_t timeoutsCount; /**< Number of retransmissions */ + uint8_t flags; /**< Save the flags to be used for time-outs */ + + socketState_t socketState; /**< Socket states used in application */ +} tcpTCB_t; + +/** + * @ingroup tcp + * @enum tcp_options_t + * @brief TCP options. + */ +typedef enum +{ + TCP_EOP = 0u, /**< length = 0 End of Option List, [RFC793] */ + TCP_NOP = 1u, /**< length = 0 No-Operation, [RFC793] */ + TCP_MSS = 2u, /**< length = 4 Maximum Segment Size, [RFC793] */ + +#ifdef ALL_TCP_HEADER_OPTIONS // These options are not implemented + TCP_WIN_SCALE = 3, /**< length = 3 Window Scale, [RFC7323] */ + TCP_SACK = 4, /**< length = 2 SACK Permitted, [RFC2018] */ + + 5 /**< length = N SACK, [RFC2018] */ + 6 /**< length = 6 Echo (obsoleted by option 8), [RFC1072][RFC6247] */ + 7 /**< length = 6 Echo Reply (obsoleted by option 8), [RFC1072][RFC6247] */ + 8 /**< length = 10 Timestamps, [RFC7323] */ + 9 /**< length = 2 Partial Order Connection Permitted (obsolete), [RFC1693][RFC6247] */ + 10 /**< length = 3 Partial Order Service Profile (obsolete), [RFC1693][RFC6247] */ + 11 /**< length = 0 CC (obsolete), [RFC1644][RFC6247] */ + 12 /**< length = 0 CC.NEW (obsolete), [RFC1644][RFC6247] */ + 13 /**< length = 0 CC.ECHO (obsolete), [RFC1644][RFC6247] */ + 14 /**< length = 3 TCP Alternate Checksum Request (obsolete), [RFC1146][RFC6247] */ + 15 /**< length = N TCP Alternate Checksum Data (obsolete), [RFC1146][RFC6247] */ + 16 /**< length = 0 Skeeter, [Stev_Knowles] */ + 17 /**< length = 0 Bubba, [Stev_Knowles] */ + 18 /**< length = 3 Trailer Checksum Option, [Subbu_Subramaniam][Monroe_Bridges] */ + 19 /**< length = 18 MD5 Signature Option (obsoleted by option 29), [RFC2385] */ + 20 /**< length = 0 SCPS Capabilities, [Keith_Scott] */ + 21 /**< length = 0 Selective Negative Acknowledgements, [Keith_Scott] */ + 22 /**< length = 0 Record Boundaries, [Keith_Scott] */ + 23 /**< length = 0 Corruption experienced, [Keith_Scott] */ + 24 /**< length = 0 SNAP, [Vladimir_Sukonnik] */ + 25 /**< length = 0 Unassigned (released 2000-12-18), */ + 26 /**< length = 0 TCP Compression Filter, [Steve_Bellovin] */ + 27 /**< length = 8 Quick-Start Response, [RFC4782] */ + 28 /**< length = 4 "User Timeout Option (also, other known unauthorized use) [***][1]", [RFC5482] */ + 29 /**< length = 0 TCP Authentication Option (TCP-AO), [RFC5925] */ + 30 /**< length = N Multipath TCP (MPTCP), [RFC6824] */ + 31 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 32 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 33 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 34-75 /**< length = 0 Reserved, */ + 69 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 70 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 71-75 /**< length = 0 Reserved, */ + 76 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 77 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 78 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 79-252 /**< length = 0 Reserved, */ + 253 /**< length = N "RFC3692-style Experiment 1 (also improperly used for shipping products) [*]", [RFC4727] */ + 254 /**< length = N "RFC3692-style Experiment 2 (also improperly used for shipping products) [*]", [RFC4727]" */ +#endif +} tcp_options_t; + +// TCP Public Interface Functions +/** + * @ingroup tcp + * @brief Initializes TCP structures, meaning certain internal TCP stack variables. + * @param None. + * @return None. + */ +void TCP_Init(void); + +/** + * @ingroup tcp + * @brief Initializes the TCB and adds it to the list of TCB pointers. + * The socket needs to be put in the Closed state. + * The user is responsible to manage memory allocation and release. + * @param *tcbPtr Pointer to the socket/TCB structure + * @retval -1 The insertion failed + * @retval 0 The insertion succeeded + */ +error_msg TCP_SocketInit(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Removes the socket pointer from the TCP stack, and the list of TCB pointers, respectively. + * After calling this routine the memory is ready to be used again. + * @param *tcbPtr Pointer to the socket/TCB structure + * @retval -1 Removing the socket failed + * @retval 0 Removing the socket succeeded + */ +error_msg TCP_SocketRemove(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Provides an interface to read the status of the socket. + * This routine also checks if the pointer is already in the TCB list. + * This means that the socket is "in use". If the socket is in the TCB list, the socket status will be returned. + * @param *socket_ptr Pointer to the socket/TCB structure + * @return Socket status. + */ +socketState_t TCP_SocketPoll(tcpTCB_t *socket_ptr); + +/** + * @ingroup tcp + * @brief Assigns a port number to the specified socket. + * This is used for configuring the local port of a socket. + * @param *tcbPtr Pointer to the socket/TCB structure + * @param port Port number to be used as a local port + * @retval True The port initialization succeeded + * @retval False The port initialization failed + */ +error_msg TCP_Bind(tcpTCB_t *tcbPtr, uint16_t port); + +/** + * @ingroup tcp + * @brief Listens for connections on a socket. This routine marks the socket as passive, + * meaning that it will be used to accept incoming connection requests. + * @param *tcbPtr Pointer to the socket/TCB structure + * @retval True Starting the server succeeded + * @retval False Starting the server failed + */ +error_msg TCP_Listen(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Starts the client for a particular socket. + * @param *tcbPtr Pointer to the socket/TCB structure + * @param *srvaddr Pointer to the server address + * @retval True Starting the server succeeded + * @retval False Starting the server failed + */ +error_msg TCP_Connect(tcpTCB_t *tcbPtr, sockaddr_in4_t *srvaddr); + +/** + * @ingroup tcp + * @brief Closes the TCP connection. + * This initiates the closing sequence for the TCP connection. + * @param *tcbPtr Pointer to the socket/TCB structure + * @retval True The closing sequence was initialized + * @retval False The closing sequence was not initialized + */ +error_msg TCP_Close(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Sends a buffer to a remote machine using a TCP connection. + * This routine adds the buffer to the socket and the payload is sent as soon as possible. + * @param *tcbPtr Pointer to the socket/TCB structure + * @param *data Pointer to the data buffer + * @param dataLen Size of the buffer + * @retval True Adding the buffer to the socket/TCB succeeded + * @retval False Adding the buffer to the socket/TCB failed + */ +error_msg TCP_Send(tcpTCB_t *tcbPtr, uint8_t *data, uint16_t dataLen); + +/** + * @ingroup tcp + * @brief Checks if the TX buffer was sent. + * This means that the data was received correctly by the remote machine and the TX buffer memory can be reused by the application. + * @param *tcbPtr Pointer to the socket/TCB structure + * @retval True Buffer transmission succeeded + * @retval False Buffer transmission failed or was not yet started + */ +error_msg TCP_SendDone(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Adds the RX buffer to the socket. + * @param *tcbPtr Pointer to the socket/TCB structure + * @param *data Pointer to the data buffer + * @param data_len Size of the buffer + * @retval True Passing the buffer to the socket succeeded + * @retval False Passing the buffer to the socket failed + */ +error_msg TCP_InsertRxBuffer(tcpTCB_t *tcbPtr, uint8_t *data, uint16_t data_len); + +/** + * @ingroup tcp + * @brief Reads the available data from the socket. This routine provides the start address of the received buffer to the user. + * @param *tcbPtr Pointer to the socket/TCB structure + * @return Number of received bytes in the buffer. + */ +int16_t TCP_GetReceivedData(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Checks and returns the number of available bytes received on a socket. + * @param *tcbPtr Pointer to the socket/TCB structure + * @return Number of received bytes in the buffer. + */ +int16_t TCP_GetRxLength(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Handles the TCP stack time-outs for each available socket. This routine needs to be called periodically. + * @param None. + * @return None. + */ +void TCP_Update(void); + +#endif /* TCPV4_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/udpv4.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/udpv4.h new file mode 100644 index 0000000..7ebf937 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/udpv4.h @@ -0,0 +1,89 @@ +/** + * UDP v4 Protocol Header File + * + * @file udpv4.h + * + * @defgroup udp UDP + * + * @brief This file provides the API implementation for UDP v4. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef UDPV4_H +#define UDPV4_H + +// Included Files +#include +#include "tcpip_types.h" +#include "../ethernet/physical_layer_interface.h" + +// Variables +extern uint16_t destPort; +extern udpHeader_t udpHeader; +extern ipv4Header_t ipv4Header; + +// Macros +#define UDP_ReadBlock(data,length) ETH_ReadBlock(data,length) +#define UDP_Read8() ETH_Read8() +#define UDP_Read16() ETH_Read16() +#define UDP_Read24() ETH_Read24() +#define UDP_Read32() ETH_Read32() +#define UDP_Write8(data) ETH_Write8(data) +#define UDP_Write16(data) ETH_Write16(data) +#define UDP_Write24(data) ETH_Write24(data) +#define UDP_Write32(data) ETH_Write32(data) +#define UDP_WriteBlock(data,length) ETH_WriteBlock(data,length) +#define UDP_WriteString(data) ETH_WriteString(data) +#define UDP_GetDestPort() (destPort) +#define UDP_GetSrcPort() (udpHeader.dstPort) +#define UDP_GetDestIP() (ipv4Header.srcIpAddress) +#define UDP_GetSrcIP() (ipv4Header.dstIpAddress) +#define UDP_DataLength() ((udpHeader.length) - 8) +#define UDP_FlushTXPackets() ETH_TxReset() +#define UDP_FlushRxdPacket() ETH_Flush() + +// UDP Library Functions +/** + @ingroup udp + @brief Starts a UDP packet. + @param destIP Destination IP address + @param srcPort Source port + @param dstPort Destination port + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg UDP_Start(uint32_t destIP, uint16_t srcPort, uint16_t dstPort); + +/** + @ingroup udp + @brief Sends a UDP packet. + @param None. + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg UDP_Send(void); + +/** + @ingroup udp + @brief Catches all UDP packets and dispatches them to the appropriate callback. + @param udpcksm UDP Checksum + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg UDP_Receive(uint16_t udpcksm); + +#endif /* UDPV4_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/udpv4_port_handler_table.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/udpv4_port_handler_table.h new file mode 100644 index 0000000..f5f25cf --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/tcpiplite/udpv4_port_handler_table.h @@ -0,0 +1,65 @@ +/** + * UDP Port Handler Header File + * + * @file udpv4_port_handler_table.h + * + * @ingroup udp + * + * @brief This file contains the UDP callback table. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef UDPV4_PORT_HANDLER_TABLE_H +#define UDPV4_PORT_HANDLER_TABLE_H + +// Included Files +#include "tcpip_types.h" + +/** + @ingroup udp + @struct udp_handler_t + @brief UDP handler types. + */ +typedef struct +{ + uint16_t portNumber; + ip_receive_function_ptr callBack; +} udp_handler_t; + +typedef const udp_handler_t * udp_table_iterator_t; + +// UDPV4 Port Handler Functions +/** + @ingroup udp + @brief Returns the UDP table iterator. + @param None. + @return Pointer to UDP_CallBackTable. + */ +udp_table_iterator_t udp_table_getIterator(void); + +/** + @ingroup udp + @brief Returns the UDP table next entry. + @param i UDP table iteration + @return Pointer to UDP_CallBackTable. + */ +udp_table_iterator_t udp_table_nextEntry(udp_table_iterator_t i); + +#endif /* UDPV4_PORT_HANDLER_TABLE_H */ diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/delay.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/delay.h new file mode 100644 index 0000000..d5320af --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/delay.h @@ -0,0 +1,54 @@ +/** + * DELAY Generated Driver API Header File + * + * @file delay.h + * + * @defgroup delay DELAY BLOCKING DRIVER + * + * @brief This file contains the API to generate delays in the range of milliseconds and microseconds. + * + * @version DELAY Driver Version 1.1.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef _DELAY_H +#define _DELAY_H + +#include + +/** +* @ingroup delay +* @brief Delays the execution of the program for a certain number of milliseconds +* @param[in] milliseconds - Number of milliseconds to delay +* @return None. +*/ +void DELAY_milliseconds(uint16_t milliseconds); + +/** +* @ingroup delay +* @brief Delays the execution of the program for a certain number of microseconds +* @param[in] microseconds - Number of microseconds to delay +* @return None. +*/ +void DELAY_microseconds(uint16_t microseconds); + +#endif // _DELAY_H \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/src/delay.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/src/delay.c new file mode 100644 index 0000000..4da05bc --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/src/delay.c @@ -0,0 +1,54 @@ +/** + * DELAY Generated Driver File + * + * @file delay.c + * + * @ingroup delay + * + * @brief This file contains functions to generate delays in the range of milliseconds and microseconds, using timer ticks to indicate delay length. + * + * @version DELAY Driver Version 1.1.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "../../system/clock.h" +#include +#include + +void DELAY_milliseconds(uint16_t milliseconds) { + while(milliseconds--){ + _delay_ms(1); + } +} + +void DELAY_microseconds(uint16_t microseconds) { + while( microseconds >= 32) + { + _delay_us(32); + microseconds -= 32; + } + + while(microseconds--) + { + _delay_us(1); + } +} \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/src/tca0.c b/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/src/tca0.c new file mode 100644 index 0000000..2a7a04d --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/src/tca0.c @@ -0,0 +1,259 @@ +/** + * TCA0 Generated Driver File + * + * @file tca0.c + * + * @ingroup tca0_normal + * + * @brief This file contains the API implementations for TCA0 module driver in Normal (16-bit) mode. + * + * @version TCA0 Driver Version 2.1.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#include "../tca0.h" + +const struct TMR_INTERFACE TCA0_Interface = { + .Initialize = TCA0_Initialize, + .Start = TCA0_Start, + .Stop = TCA0_Stop, + .PeriodCountSet = TCA0_Write, + .TimeoutCallbackRegister = TCA0_OverflowCallbackRegister, + .Tasks = NULL +}; + +void TCA0_DefaultCompare0CallbackRegister(void); +void (*TCA0_CMP0_isr_cb)(void) = &TCA0_DefaultCompare0CallbackRegister; +void TCA0_DefaultCompare1CallbackRegister(void); +void (*TCA0_CMP1_isr_cb)(void) = &TCA0_DefaultCompare1CallbackRegister; +void TCA0_DefaultCompare2CallbackRegister(void); +void (*TCA0_CMP2_isr_cb)(void) = &TCA0_DefaultCompare2CallbackRegister; +void TCA0_DefaultOverflowCallbackRegister(void); +void (*TCA0_OVF_isr_cb)(void) = &TCA0_DefaultOverflowCallbackRegister; + +void TCA0_DefaultCompare0CallbackRegister(void) +{ + //Add your ISR code here +} + +void TCA0_DefaultCompare1CallbackRegister(void) +{ + //Add your ISR code here +} + +void TCA0_DefaultCompare2CallbackRegister(void) +{ + //Add your ISR code here +} + +void TCA0_DefaultOverflowCallbackRegister(void) +{ + //Add your ISR code here +} + +void TCA0_OverflowCallbackRegister(TCA0_cb_t cb) +{ + TCA0_OVF_isr_cb = cb; +} + +void TCA0_Compare0CallbackRegister(TCA0_cb_t cb) +{ + TCA0_CMP0_isr_cb = cb; +} + +void TCA0_Compare1CallbackRegister(TCA0_cb_t cb) +{ + TCA0_CMP1_isr_cb = cb; +} + +void TCA0_Compare2CallbackRegister(TCA0_cb_t cb) +{ + TCA0_CMP2_isr_cb = cb; +} + +ISR(TCA0_CMP0_vect) +{ + if (TCA0_CMP0_isr_cb != NULL) + (*TCA0_CMP0_isr_cb)(); + + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP0_bm; +} + +ISR(TCA0_CMP1_vect) +{ + if (TCA0_CMP1_isr_cb != NULL) + (*TCA0_CMP1_isr_cb)(); + + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP1_bm; +} + +ISR(TCA0_CMP2_vect) +{ + if (TCA0_CMP2_isr_cb != NULL) + (*TCA0_CMP2_isr_cb)(); + + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP2_bm; +} + +ISR(TCA0_OVF_vect) +{ + if (TCA0_OVF_isr_cb != NULL) + (*TCA0_OVF_isr_cb)(); + + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm; +} + + +void TCA0_Initialize(void) { + // Compare 0 + TCA0.SINGLE.CMP0 = 0x0; + + // Compare 1 + TCA0.SINGLE.CMP1 = 0x0; + + // Compare 2 + TCA0.SINGLE.CMP2 = 0x0; + + // Count + TCA0.SINGLE.CNT = 0x0; + + // ALUPD disabled; CMP0EN disabled; CMP1EN disabled; CMP2EN disabled; WGMODE NORMAL; + TCA0.SINGLE.CTRLB = 0x0; + + // CMP0OV disabled; CMP1OV disabled; CMP2OV disabled; + TCA0.SINGLE.CTRLC = 0x0; + + // SPLITM disabled; + TCA0.SINGLE.CTRLD = 0x0; + + // CMD NONE; DIR disabled; LUPD disabled; + TCA0.SINGLE.CTRLECLR = 0x0; + + // CMD NONE; DIR UP; LUPD disabled; + TCA0.SINGLE.CTRLESET = 0x0; + + // CMP0BV disabled; CMP1BV disabled; CMP2BV disabled; PERBV disabled; + TCA0.SINGLE.CTRLFCLR = 0x0; + + // CMP0BV disabled; CMP1BV disabled; CMP2BV disabled; PERBV disabled; + TCA0.SINGLE.CTRLFSET = 0x0; + + // DBGRUN disabled; + TCA0.SINGLE.DBGCTRL = 0x0; + + // CNTAEI disabled; CNTBEI disabled; EVACTA CNT_POSEDGE; EVACTB NONE; + TCA0.SINGLE.EVCTRL = 0x0; + + // CMP0 disabled; CMP1 disabled; CMP2 disabled; OVF enabled; + TCA0.SINGLE.INTCTRL = 0x1; + + // CMP0 disabled; CMP1 disabled; CMP2 disabled; OVF disabled; + TCA0.SINGLE.INTFLAGS = 0x0; + + // Period + TCA0.SINGLE.PER = 0xF423; + + // Temporary data for 16-bit Access + TCA0.SINGLE.TEMP = 0x0; + + // CLKSEL DIV64; ENABLE enabled; RUNSTDBY disabled; + TCA0.SINGLE.CTRLA = 0xB; + +} + +void TCA0_Start(void) +{ + TCA0.SINGLE.CTRLA|= TCA_SINGLE_ENABLE_bm; +} + +void TCA0_Stop(void) +{ + TCA0.SINGLE.CTRLA&= ~TCA_SINGLE_ENABLE_bm; +} + +void TCA0_Write(uint16_t timerVal) +{ + TCA0.SINGLE.PER=timerVal; +} + +uint16_t TCA0_Read(void) +{ + uint16_t readVal; + + readVal = TCA0.SINGLE.CNT; + + return readVal; +} + +void TCA0_EnableInterrupt(void) +{ + TCA0.SINGLE.INTCTRL = 1 << TCA_SINGLE_CMP0_bp /* Compare 0 Interrupt: enabled */ + | 1 << TCA_SINGLE_CMP1_bp /* Compare 1 Interrupt: enabled */ + | 1 << TCA_SINGLE_CMP2_bp /* Compare 2 Interrupt: enabled */ + | 1 << TCA_SINGLE_OVF_bp; /* Overflow Interrupt: enabled */ +} +void TCA0_DisableInterrupt(void) +{ + TCA0.SINGLE.INTCTRL = 0 << TCA_SINGLE_CMP0_bp /* Compare 0 Interrupt: disabled */ + | 0 << TCA_SINGLE_CMP1_bp /* Compare 1 Interrupt: disabled */ + | 0 << TCA_SINGLE_CMP2_bp /* Compare 2 Interrupt: disabled */ + | 0 << TCA_SINGLE_OVF_bp; /* Overflow Interrupt: disabled */ +} +void TCA0_ClearOverflowInterruptFlag(void) +{ + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm; /* Clear Overflow Interrupt Flag */ +} +bool TCA0_IsOverflowInterruptFlagSet(void) +{ + return ((TCA0.SINGLE.INTFLAGS & TCA_SINGLE_OVF_bm) > 0); +} + +void TCA0_ClearCMP0InterruptFlag(void) +{ + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP0_bm; /* Clear Compare Channel-0 Interrupt Flag */ +} + +bool TCA0_IsCMP0InterruptFlagSet(void) +{ + return ((TCA0.SINGLE.INTFLAGS & TCA_SINGLE_CMP0_bm) > 0); +} + +void TCA0_ClearCMP1InterruptFlag(void) +{ + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP1_bm; /* Clear Compare Channel-1 Interrupt Flag */ +} + +bool TCA0_IsCMP1InterruptFlagSet(void) +{ + return ((TCA0.SINGLE.INTFLAGS & TCA_SINGLE_CMP1_bm) > 0); +} + +void TCA0_ClearCMP2InterruptFlag(void) +{ + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP2_bm; /* Clear Compare Channel-2 Interrupt Flag */ +} + +bool TCA0_IsCMP2InterruptFlagSet(void) +{ + return ((TCA0.SINGLE.INTFLAGS & TCA_SINGLE_CMP2_bm) > 0); +} \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/tca0.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/tca0.h new file mode 100644 index 0000000..44c4c0e --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/tca0.h @@ -0,0 +1,199 @@ +/** + * TCA0 Generated Driver API Header File + * + * @file tca0.h + * + * @defgroup tca0_normal TCA0 in Normal Mode + * + * @brief This file contains the API prototypes for the TCA0 driver in Normal (16-bit) mode. + * + * @version TCA0 Driver Version 2.1.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef TCA0_H_INCLUDED +#define TCA0_H_INCLUDED + +#include +#include +#include "../system/system.h" +#include "timer_interface.h" +#include "../system/utils/compiler.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup tca0_normal + * @typedef void TCA0_cb_t + * @brief Function pointer to the callback function called by TCA when operating in Normal mode. The default value is set to NULL which means that no callback function will be used. + */ +typedef void (*TCA0_cb_t)(void); + +extern const struct TMR_INTERFACE TCA0_Interface; + +/** + * @ingroup tca0_normal + * @brief Initializes the TCA. + * @param None. + * @return None. + */ +void TCA0_Initialize(void); +/** + * @ingroup tca0_normal + * @brief Starts the 16-bit timer/counter for the TCA. + * @param None. + * @return None. + */ +void TCA0_Start(void); +/** + * @ingroup tca0_normal + * @brief Stops the 16-bit timer/counter for the TCA. + * @param None. + * @return None. + */ +void TCA0_Stop(void); +/** + * @ingroup tca0_normal + * @brief Interrupt Service Routine (ISR) callback function register to be called if the Overflow Interrupt flag is set. + * @param TCA0_cb_t cb - Callback function for Overflow event. + * @return None. + */ +void TCA0_OverflowCallbackRegister(TCA0_cb_t cb); +/** + * @ingroup tca0_normal + * @brief ISR callback function to be called if the Compare 0 Match Interrupt flag is set. + * @param TCA0_cb_t cb - Callback function for Compare 0 match event. + * @return None. + */ +void TCA0_Compare0CallbackRegister(TCA0_cb_t cb); +/** + * @ingroup tca0_normal + * @brief ISR callback function to be called if the Compare 1 Match Interrupt flag is set. + * @param TCA0_cb_t cb - Callback function for Compare 1 match event. + * @return None. + */ +void TCA0_Compare1CallbackRegister(TCA0_cb_t cb); +/** + * @ingroup tca0_normal + * @brief ISR callback function to be called if the Compare 2 Match Interrupt flag is set. + * @param TCA0_cb_t cb - Callback function for Compare 2 match event. + * @return None. + */ +void TCA0_Compare2CallbackRegister(TCA0_cb_t cb); +/** + * @ingroup tca0_normal + * @brief Enables the 16-bit timer/counter interrupt for the TCA. + * @param None. + * @return None. + */ +void TCA0_EnableInterrupt(void); +/** + * @ingroup tca0_normal + * @brief Disables the 16-bit timer/counter interrupt for the TCA. + * @param None. + * @return None. + */ +void TCA0_DisableInterrupt(void); +/** + * @ingroup tca0_normal + * @brief Reads the 16-bit timer/counter value for the TCA. + * @param None. + * @return uint16_t - timer/counter value returns from the TCA0. + */ +uint16_t TCA0_Read(void); +/** + * @ingroup tca0_normal + * @brief Writes the timer value to load to the TCA. + * @param uint16_t timerVal - Loading the timer value for the TCA. + * @return None. + */ +void TCA0_Write(uint16_t timerVal); +/** + * @ingroup tca0_normal + * @brief Clears the Overflow Interrupt flag after the Overflow flag set. + * @param None. + * @return None. + */ +void TCA0_ClearOverflowInterruptFlag(void); +/** + * @ingroup tca0_normal + * @brief Checks the Overflow Interrupt flag status for the TCA. + * @param None. + * @retval True - Overflow Interrupt flag is set. + * @retval False - Overflow Interrupt flag is not set. + */ +bool TCA0_IsOverflowInterruptFlagSet(void); +/** + * @ingroup tca0_normal + * @brief Clears the Compare 0 Interrupt flag after the Compare 0 flag is set. + * @param None. + * @return None. + */ +void TCA0_ClearCMP0InterruptFlag(void); +/** + * @ingroup tca0_normal + * @brief Checks the Compare 0 Interrupt flag status for the TCA. + * @param None. + * @retval True - Compare 0 Interrupt flag is set. + * @retval False - Compare 0 Interrupt flag is not set. + */ +bool TCA0_IsCMP0InterruptFlagSet(void); +/** + * @ingroup tca0_normal + * @brief Clears the Compare 1 Interrupt flag after the Compare 1 flag is set. + * @param None. + * @return None. + */ +void TCA0_ClearCMP1InterruptFlag(void); +/** + * @ingroup tca0_normal + * @brief Checks the Compare 1 Interrupt flag status for the TCA. + * @param None. + * @retval True - Compare 1 Interrupt flag is set. + * @retval False - Compare 1 Interrupt flag is not set. + */ +bool TCA0_IsCMP1InterruptFlagSet(void); +/** + * @ingroup tca0_normal + * @brief Clears the Compare 2 Interrupt flag after the Compare 2 flag is set. + * @param None. + * @return None. + */ +void TCA0_ClearCMP2InterruptFlag(void); + +/** + * @ingroup tca0_normal + * @brief Checks the Compare 2 Interrupt flag status for the TCA. + * @param None. + * @retval True - Compare 2 Interrupt flag is set. + * @retval False - Compare 2 Interrupt flag is not set. + */ +bool TCA0_IsCMP2InterruptFlagSet(void); + +#ifdef __cplusplus +} +#endif + +#endif /* TCA0_H_INCLUDED */ \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/timer_interface.h b/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/timer_interface.h new file mode 100644 index 0000000..a5fb6d3 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/mcc_generated_files/timer/timer_interface.h @@ -0,0 +1,69 @@ +/** + @Company + Microchip Technology Inc. + + @File Name + TMR_interface.h + + @Summary + This is the generated header file for Timer module interfaces. + + @Description + This header file provides interfaces to Timer driver APIs. + Generation Information : + Driver Version : 1.00 + The generated drivers are tested against the following: + MPLAB : MPLAB X v5.40 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef TMR_INTERFACE_H +#define TMR_INTERFACE_H + +/** + * @brief This file contains API prototypes and other datatypes for Timer-0 module. + * @defgroup timer_interface Timer Interface + * @{ + */ + +#include + +/** + @ingroup timer_interface + @typedef struct TMR_INTERFACE + @brief This structure contains the interfaces to Timer module + */ + +struct TMR_INTERFACE +{ + void (*Initialize)(void); + void (*Start)(void); + void (*Stop)(void); + void (*PeriodCountSet)(size_t count); + void (*TimeoutCallbackRegister)(void (* CallbackHandler)(void)); + void (*Tasks)(void); +}; +/** + * @} + */ +#endif //TMR_INTERFACE_H \ No newline at end of file diff --git a/enc28j60-avr-tcpclient.X/nbproject/Makefile-default.mk b/enc28j60-avr-tcpclient.X/nbproject/Makefile-default.mk new file mode 100644 index 0000000..b6145d3 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/nbproject/Makefile-default.mk @@ -0,0 +1,432 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Include project Makefile +ifeq "${IGNORE_LOCAL}" "TRUE" +# do not include local makefile. User is passing all local related variables already +else +include Makefile +# Include makefile containing local settings +ifeq "$(wildcard nbproject/Makefile-local-default.mk)" "nbproject/Makefile-local-default.mk" +include nbproject/Makefile-local-default.mk +endif +endif + +# Environment +MKDIR=mkdir -p +RM=rm -f +MV=mv +CP=cp + +# Macros +CND_CONF=default +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +IMAGE_TYPE=debug +OUTPUT_SUFFIX=elf +DEBUGGABLE_SUFFIX=elf +FINAL_IMAGE=${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +else +IMAGE_TYPE=production +OUTPUT_SUFFIX=hex +DEBUGGABLE_SUFFIX=elf +FINAL_IMAGE=${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +endif + +ifeq ($(COMPARE_BUILD), true) +COMPARISON_BUILD=-mafrlcsj +else +COMPARISON_BUILD= +endif + +# Object Directory +OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} + +# Distribution Directory +DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} + +# Source Files Quoted if spaced +SOURCEFILES_QUOTED_IF_SPACED=app_files/src/tcp_client_demo.c mcc_generated_files/ethernet/src/enc28j60.c mcc_generated_files/spi/src/spi0.c mcc_generated_files/system/src/clock.c mcc_generated_files/system/src/config_bits.c mcc_generated_files/system/src/protected_io.S mcc_generated_files/system/src/interrupt.c mcc_generated_files/system/src/system.c mcc_generated_files/system/src/pins.c mcc_generated_files/tcpiplite/src/udpv4.c mcc_generated_files/tcpiplite/src/log_console.c mcc_generated_files/tcpiplite/src/dhcp_client.c mcc_generated_files/tcpiplite/src/network.c mcc_generated_files/tcpiplite/src/log_syslog.c mcc_generated_files/tcpiplite/src/lfsr.c mcc_generated_files/tcpiplite/src/tcpv4.c mcc_generated_files/tcpiplite/src/arpv4.c mcc_generated_files/tcpiplite/src/log.c mcc_generated_files/tcpiplite/src/rtcc.c mcc_generated_files/tcpiplite/src/ipv4.c mcc_generated_files/tcpiplite/src/ip_database.c mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c mcc_generated_files/timer/src/delay.c mcc_generated_files/timer/src/tca0.c main.c + +# Object Files Quoted if spaced +OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/app_files/src/tcp_client_demo.o ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o ${OBJECTDIR}/mcc_generated_files/system/src/clock.o ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o ${OBJECTDIR}/mcc_generated_files/system/src/system.o ${OBJECTDIR}/mcc_generated_files/system/src/pins.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o ${OBJECTDIR}/main.o +POSSIBLE_DEPFILES=${OBJECTDIR}/app_files/src/tcp_client_demo.o.d ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d ${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d ${OBJECTDIR}/mcc_generated_files/system/src/system.o.d ${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d ${OBJECTDIR}/main.o.d + +# Object Files +OBJECTFILES=${OBJECTDIR}/app_files/src/tcp_client_demo.o ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o ${OBJECTDIR}/mcc_generated_files/system/src/clock.o ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o ${OBJECTDIR}/mcc_generated_files/system/src/system.o ${OBJECTDIR}/mcc_generated_files/system/src/pins.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o ${OBJECTDIR}/main.o + +# Source Files +SOURCEFILES=app_files/src/tcp_client_demo.c mcc_generated_files/ethernet/src/enc28j60.c mcc_generated_files/spi/src/spi0.c mcc_generated_files/system/src/clock.c mcc_generated_files/system/src/config_bits.c mcc_generated_files/system/src/protected_io.S mcc_generated_files/system/src/interrupt.c mcc_generated_files/system/src/system.c mcc_generated_files/system/src/pins.c mcc_generated_files/tcpiplite/src/udpv4.c mcc_generated_files/tcpiplite/src/log_console.c mcc_generated_files/tcpiplite/src/dhcp_client.c mcc_generated_files/tcpiplite/src/network.c mcc_generated_files/tcpiplite/src/log_syslog.c mcc_generated_files/tcpiplite/src/lfsr.c mcc_generated_files/tcpiplite/src/tcpv4.c mcc_generated_files/tcpiplite/src/arpv4.c mcc_generated_files/tcpiplite/src/log.c mcc_generated_files/tcpiplite/src/rtcc.c mcc_generated_files/tcpiplite/src/ipv4.c mcc_generated_files/tcpiplite/src/ip_database.c mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c mcc_generated_files/timer/src/delay.c mcc_generated_files/timer/src/tca0.c main.c + + + +CFLAGS= +ASFLAGS= +LDLIBSOPTIONS= + +############# Tool locations ########################################## +# If you copy a project from one host to another, the path where the # +# compiler is installed may be different. # +# If you open this project with MPLAB X in the new host, this # +# makefile will be regenerated and the paths will be corrected. # +####################################################################### +# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build +FIXDEPS=fixDeps + +.build-conf: ${BUILD_SUBPROJECTS} +ifneq ($(INFORMATION_MESSAGE), ) + @echo $(INFORMATION_MESSAGE) +endif + ${MAKE} -f nbproject/Makefile-default.mk ${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} + +MP_PROCESSOR_OPTION=AVR64DD32 +# ------------------------------------------------------------------------------------ +# Rules for buildStep: compile +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${OBJECTDIR}/app_files/src/tcp_client_demo.o: app_files/src/tcp_client_demo.c .generated_files/flags/default/4ea8ecb9b623634c91bccc3127c1d60b6f11ea6f .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/app_files/src" + @${RM} ${OBJECTDIR}/app_files/src/tcp_client_demo.o.d + @${RM} ${OBJECTDIR}/app_files/src/tcp_client_demo.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/app_files/src/tcp_client_demo.o.d" -MT "${OBJECTDIR}/app_files/src/tcp_client_demo.o.d" -MT ${OBJECTDIR}/app_files/src/tcp_client_demo.o -o ${OBJECTDIR}/app_files/src/tcp_client_demo.o app_files/src/tcp_client_demo.c + +${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o: mcc_generated_files/ethernet/src/enc28j60.c .generated_files/flags/default/5ac06a9713ca9e48dad07e1bc772ac1730af4d31 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/ethernet/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d" -MT "${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d" -MT ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o -o ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o mcc_generated_files/ethernet/src/enc28j60.c + +${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o: mcc_generated_files/spi/src/spi0.c .generated_files/flags/default/f02aa974f6d508bebfb6c73c537f1d6809084f8f .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/spi/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d" -MT "${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d" -MT ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o -o ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o mcc_generated_files/spi/src/spi0.c + +${OBJECTDIR}/mcc_generated_files/system/src/clock.o: mcc_generated_files/system/src/clock.c .generated_files/flags/default/ca55d650dfbdfced31b19310a8c37bd4d80a20d3 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/clock.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/clock.o -o ${OBJECTDIR}/mcc_generated_files/system/src/clock.o mcc_generated_files/system/src/clock.c + +${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o: mcc_generated_files/system/src/config_bits.c .generated_files/flags/default/8251e5a9f553bce1c7e1138aca598721706e5632 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o -o ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o mcc_generated_files/system/src/config_bits.c + +${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o: mcc_generated_files/system/src/interrupt.c .generated_files/flags/default/474e82805b3bb3e72c45367cfb6c23b1422ba3af .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o -o ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o mcc_generated_files/system/src/interrupt.c + +${OBJECTDIR}/mcc_generated_files/system/src/system.o: mcc_generated_files/system/src/system.c .generated_files/flags/default/651e1364f86cfbfc9c1503315a5afecc064c149b .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/system.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/system.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/system.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/system.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/system.o -o ${OBJECTDIR}/mcc_generated_files/system/src/system.o mcc_generated_files/system/src/system.c + +${OBJECTDIR}/mcc_generated_files/system/src/pins.o: mcc_generated_files/system/src/pins.c .generated_files/flags/default/4dc029588ceb2509354ad64c371349fef0dfeab9 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/pins.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/pins.o -o ${OBJECTDIR}/mcc_generated_files/system/src/pins.o mcc_generated_files/system/src/pins.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o: mcc_generated_files/tcpiplite/src/udpv4.c .generated_files/flags/default/d2ab25bac56dbedb577afc48bcfdc226587bec1 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o mcc_generated_files/tcpiplite/src/udpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o: mcc_generated_files/tcpiplite/src/log_console.c .generated_files/flags/default/2997d3562bc391d3534cec9d3703c4f25c81fa6e .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o mcc_generated_files/tcpiplite/src/log_console.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o: mcc_generated_files/tcpiplite/src/dhcp_client.c .generated_files/flags/default/badaf077ff33f008180885d27745980674d6ef0 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o mcc_generated_files/tcpiplite/src/dhcp_client.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o: mcc_generated_files/tcpiplite/src/network.c .generated_files/flags/default/c4977f467524c9d7e0610a4b35ad0921bd9a9f84 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o mcc_generated_files/tcpiplite/src/network.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o: mcc_generated_files/tcpiplite/src/log_syslog.c .generated_files/flags/default/4fa9adba288d9f829721499fe363e10e154a5a64 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o mcc_generated_files/tcpiplite/src/log_syslog.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o: mcc_generated_files/tcpiplite/src/lfsr.c .generated_files/flags/default/d5580e048c8dd38cef3e2533b0e3b6c36451dc7f .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o mcc_generated_files/tcpiplite/src/lfsr.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o: mcc_generated_files/tcpiplite/src/tcpv4.c .generated_files/flags/default/b4775d22d45151f916f213470bb7d55469aceefd .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o mcc_generated_files/tcpiplite/src/tcpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o: mcc_generated_files/tcpiplite/src/arpv4.c .generated_files/flags/default/53c225bf4850c34b2fe0593d315e08cf66382152 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o mcc_generated_files/tcpiplite/src/arpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o: mcc_generated_files/tcpiplite/src/log.c .generated_files/flags/default/d9fee441b1df992eccf7be9428c0a8aca657edf0 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o mcc_generated_files/tcpiplite/src/log.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o: mcc_generated_files/tcpiplite/src/rtcc.c .generated_files/flags/default/3fdfd81cbf6fdbbac60b0d5e42438fd9ca1932b .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o mcc_generated_files/tcpiplite/src/rtcc.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o: mcc_generated_files/tcpiplite/src/ipv4.c .generated_files/flags/default/da898558fc4bf16ed9d77c30d140a0eaf2a3bc88 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o mcc_generated_files/tcpiplite/src/ipv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o: mcc_generated_files/tcpiplite/src/ip_database.c .generated_files/flags/default/3169701b8a8da9c52afc720596b8273104bf5c1b .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o mcc_generated_files/tcpiplite/src/ip_database.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o: mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c .generated_files/flags/default/9dbbd40cd935544247d7b50aeb33e854fd057df2 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c + +${OBJECTDIR}/mcc_generated_files/timer/src/delay.o: mcc_generated_files/timer/src/delay.c .generated_files/flags/default/8fe95486ccf296c809a41d106eeb40f868c7b60a .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/timer/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d" -MT "${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d" -MT ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o -o ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o mcc_generated_files/timer/src/delay.c + +${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o: mcc_generated_files/timer/src/tca0.c .generated_files/flags/default/10a6de84840ca23434c19724c30cd85e0137af8d .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/timer/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d" -MT "${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d" -MT ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o -o ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o mcc_generated_files/timer/src/tca0.c + +${OBJECTDIR}/main.o: main.c .generated_files/flags/default/2599eb87b7726ca215a55ee925acb8ab7d467204 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}" + @${RM} ${OBJECTDIR}/main.o.d + @${RM} ${OBJECTDIR}/main.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/main.o.d" -MT "${OBJECTDIR}/main.o.d" -MT ${OBJECTDIR}/main.o -o ${OBJECTDIR}/main.o main.c + +else +${OBJECTDIR}/app_files/src/tcp_client_demo.o: app_files/src/tcp_client_demo.c .generated_files/flags/default/53e9bcdf3d8115b9baf138622095403a4a791557 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/app_files/src" + @${RM} ${OBJECTDIR}/app_files/src/tcp_client_demo.o.d + @${RM} ${OBJECTDIR}/app_files/src/tcp_client_demo.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/app_files/src/tcp_client_demo.o.d" -MT "${OBJECTDIR}/app_files/src/tcp_client_demo.o.d" -MT ${OBJECTDIR}/app_files/src/tcp_client_demo.o -o ${OBJECTDIR}/app_files/src/tcp_client_demo.o app_files/src/tcp_client_demo.c + +${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o: mcc_generated_files/ethernet/src/enc28j60.c .generated_files/flags/default/132a66c978db26de6d6d9591599c3765052351f .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/ethernet/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d" -MT "${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d" -MT ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o -o ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o mcc_generated_files/ethernet/src/enc28j60.c + +${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o: mcc_generated_files/spi/src/spi0.c .generated_files/flags/default/b6339fac15308e6e5ceee6177503771a66b002fa .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/spi/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d" -MT "${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d" -MT ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o -o ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o mcc_generated_files/spi/src/spi0.c + +${OBJECTDIR}/mcc_generated_files/system/src/clock.o: mcc_generated_files/system/src/clock.c .generated_files/flags/default/10f93821466d4b93e70ec28df74cdd6029f9acad .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/clock.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/clock.o -o ${OBJECTDIR}/mcc_generated_files/system/src/clock.o mcc_generated_files/system/src/clock.c + +${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o: mcc_generated_files/system/src/config_bits.c .generated_files/flags/default/a65d725f4c9b35d0b70688371865ad7cd1181b2f .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o -o ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o mcc_generated_files/system/src/config_bits.c + +${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o: mcc_generated_files/system/src/interrupt.c .generated_files/flags/default/8781bd0c8f0d3b9f9dbbd81f75851bdb69703fc6 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o -o ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o mcc_generated_files/system/src/interrupt.c + +${OBJECTDIR}/mcc_generated_files/system/src/system.o: mcc_generated_files/system/src/system.c .generated_files/flags/default/25c57f9c58b4af2d58210b1800c657c40a31ee1 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/system.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/system.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/system.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/system.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/system.o -o ${OBJECTDIR}/mcc_generated_files/system/src/system.o mcc_generated_files/system/src/system.c + +${OBJECTDIR}/mcc_generated_files/system/src/pins.o: mcc_generated_files/system/src/pins.c .generated_files/flags/default/143c1eea8c87b8fa5fa94956fbe68e5e459833df .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/pins.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/pins.o -o ${OBJECTDIR}/mcc_generated_files/system/src/pins.o mcc_generated_files/system/src/pins.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o: mcc_generated_files/tcpiplite/src/udpv4.c .generated_files/flags/default/816dd03b0d28b6c2cdf9dc4c817562cc6ea84ab7 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o mcc_generated_files/tcpiplite/src/udpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o: mcc_generated_files/tcpiplite/src/log_console.c .generated_files/flags/default/a0b90b265356334ca05ee23ca21e755242b86a5d .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o mcc_generated_files/tcpiplite/src/log_console.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o: mcc_generated_files/tcpiplite/src/dhcp_client.c .generated_files/flags/default/9892f6fd62199735d2860093fdfe4232dd9d5f29 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o mcc_generated_files/tcpiplite/src/dhcp_client.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o: mcc_generated_files/tcpiplite/src/network.c .generated_files/flags/default/c1395c8a53495a13777568731d3d7872a2e9c296 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o mcc_generated_files/tcpiplite/src/network.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o: mcc_generated_files/tcpiplite/src/log_syslog.c .generated_files/flags/default/3e2ecc4822e310dbceca3b7017bdd9eb45111c6a .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o mcc_generated_files/tcpiplite/src/log_syslog.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o: mcc_generated_files/tcpiplite/src/lfsr.c .generated_files/flags/default/4eda9fc2d61e887afd15f857eaad2bbbd82a3613 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o mcc_generated_files/tcpiplite/src/lfsr.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o: mcc_generated_files/tcpiplite/src/tcpv4.c .generated_files/flags/default/6948e6e95a3cc342f0e8876814ea52313ea9cd14 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o mcc_generated_files/tcpiplite/src/tcpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o: mcc_generated_files/tcpiplite/src/arpv4.c .generated_files/flags/default/c942bb4afbbf6fd7a14775e95278e6f178bf4e1 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o mcc_generated_files/tcpiplite/src/arpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o: mcc_generated_files/tcpiplite/src/log.c .generated_files/flags/default/ed20108ff9c9f90f488674159667f15eadbf54cd .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o mcc_generated_files/tcpiplite/src/log.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o: mcc_generated_files/tcpiplite/src/rtcc.c .generated_files/flags/default/f4ffcd0098d58f7d6ddbbb76281229fa8a6fcf8c .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o mcc_generated_files/tcpiplite/src/rtcc.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o: mcc_generated_files/tcpiplite/src/ipv4.c .generated_files/flags/default/3a43851de1d748a7b4949280332e48e93b4c1017 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o mcc_generated_files/tcpiplite/src/ipv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o: mcc_generated_files/tcpiplite/src/ip_database.c .generated_files/flags/default/28bcbae7e1bc7ac7a49435b758c13cea097a27c3 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o mcc_generated_files/tcpiplite/src/ip_database.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o: mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c .generated_files/flags/default/9c05ad6b6861cbde89f284c59858d1f58520324c .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c + +${OBJECTDIR}/mcc_generated_files/timer/src/delay.o: mcc_generated_files/timer/src/delay.c .generated_files/flags/default/4ec0d2e706e414c917e4b1473f0c9c1e802ef25f .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/timer/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d" -MT "${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d" -MT ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o -o ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o mcc_generated_files/timer/src/delay.c + +${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o: mcc_generated_files/timer/src/tca0.c .generated_files/flags/default/30c7e1f42737f2e48405d3c276c2eccfc6342850 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/timer/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d" -MT "${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d" -MT ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o -o ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o mcc_generated_files/timer/src/tca0.c + +${OBJECTDIR}/main.o: main.c .generated_files/flags/default/2bc61f4aa3f6468532d3eaba389f1c380bc2e0b .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}" + @${RM} ${OBJECTDIR}/main.o.d + @${RM} ${OBJECTDIR}/main.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/main.o.d" -MT "${OBJECTDIR}/main.o.d" -MT ${OBJECTDIR}/main.o -o ${OBJECTDIR}/main.o main.c + +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: assemble +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +else +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: assembleWithPreprocess +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o: mcc_generated_files/system/src/protected_io.S .generated_files/flags/default/d832a835bdbd0a8dd939a81f9552d8d50d941e85 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o + ${MP_CC} -c $(MP_EXTRA_AS_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x assembler-with-cpp -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -Wa,--defsym=__MPLAB_BUILD=1,--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1 -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o -o ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o mcc_generated_files/system/src/protected_io.S + +else +${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o: mcc_generated_files/system/src/protected_io.S .generated_files/flags/default/c9c531da369448b25da4e8a92b1409b20642d8fe .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o + ${MP_CC} -c $(MP_EXTRA_AS_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -x assembler-with-cpp -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -Wa,--defsym=__MPLAB_BUILD=1 -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o -o ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o mcc_generated_files/system/src/protected_io.S + +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: link +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} ${DISTDIR} + ${MP_CC} $(MP_EXTRA_LD_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -Wl,-Map=${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.map -D__DEBUG=1 -DXPRJ_default=$(CND_CONF) -Wl,--defsym=__MPLAB_BUILD=1 -mdfp="${DFP_DIR}/xc8" -gdwarf-2 -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem $(COMPARISON_BUILD) -Wl,--memorysummary,${DISTDIR}/memoryfile.xml -o ${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} -o ${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1 + @${RM} ${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.hex + +else +${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} ${DISTDIR} + ${MP_CC} $(MP_EXTRA_LD_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -Wl,-Map=${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.map -DXPRJ_default=$(CND_CONF) -Wl,--defsym=__MPLAB_BUILD=1 -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem $(COMPARISON_BUILD) -Wl,--memorysummary,${DISTDIR}/memoryfile.xml -o ${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} -o ${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--start-group -Wl,-lm -Wl,--end-group + ${MP_CC_DIR}/avr-objcopy -O ihex "${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX}" "${DISTDIR}/enc28j60-avr-tcpclient.X.${IMAGE_TYPE}.hex" +endif + + +# Subprojects +.build-subprojects: + + +# Subprojects +.clean-subprojects: + +# Clean Targets +.clean-conf: ${CLEAN_SUBPROJECTS} + ${RM} -r ${OBJECTDIR} + ${RM} -r ${DISTDIR} diff --git a/enc28j60-avr-tcpclient.X/nbproject/Makefile-genesis.properties b/enc28j60-avr-tcpclient.X/nbproject/Makefile-genesis.properties new file mode 100644 index 0000000..0b231d9 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/nbproject/Makefile-genesis.properties @@ -0,0 +1,13 @@ +# +#Fri Aug 11 20:44:01 UTC 2023 +default.languagetoolchain.version=2.41 +default.Pack.dfplocation=/opt/microchip/mplabx/v6.10/packs/Microchip/AVR-Dx_DFP/2.3.272 +default.com-microchip-mplab-mdbcore-AtmelIceScripting-AtmelIceScriptingBase.md5=acafdfc19fbc230fa3bd22a525cc735a +conf.ids=default +default.languagetoolchain.dir=/opt/microchip/xc8/v2.41/bin +host.id=909n-6uww-y +configurations-xml=c98e0c9faabd95639329e786c1ba1d5a +com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=ff725c3d3fe40010a04a4bae132aaf51 +default.com-microchip-mplab-nbide-toolchain-xc8-XC8LanguageToolchain.md5=9fced058cfa47be6abe62f69e8f0cfe0 +proj.dir=/home/jenkins/agent/workspace/pip-lite-enc28j60-solution_1.0.0/enc28j60-avr-tcpclient.X +host.platform=linux diff --git a/enc28j60-avr-tcpclient.X/nbproject/Makefile-impl.mk b/enc28j60-avr-tcpclient.X/nbproject/Makefile-impl.mk new file mode 100644 index 0000000..9e63a1e --- /dev/null +++ b/enc28j60-avr-tcpclient.X/nbproject/Makefile-impl.mk @@ -0,0 +1,69 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a pre- and a post- target defined where you can add customization code. +# +# This makefile implements macros and targets common to all configurations. +# +# NOCDDL + + +# Building and Cleaning subprojects are done by default, but can be controlled with the SUB +# macro. If SUB=no, subprojects will not be built or cleaned. The following macro +# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf +# and .clean-reqprojects-conf unless SUB has the value 'no' +SUB_no=NO +SUBPROJECTS=${SUB_${SUB}} +BUILD_SUBPROJECTS_=.build-subprojects +BUILD_SUBPROJECTS_NO= +BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} +CLEAN_SUBPROJECTS_=.clean-subprojects +CLEAN_SUBPROJECTS_NO= +CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} + + +# Project Name +PROJECTNAME=enc28j60-avr-tcpclient.X + +# Active Configuration +DEFAULTCONF=default +CONF=${DEFAULTCONF} + +# All Configurations +ALLCONFS=default + + +# build +.build-impl: .build-pre + ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf + + +# clean +.clean-impl: .clean-pre + ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf + +# clobber +.clobber-impl: .clobber-pre .depcheck-impl + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default clean + + + +# all +.all-impl: .all-pre .depcheck-impl + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default build + + + +# dependency checking support +.depcheck-impl: +# @echo "# This code depends on make tool being used" >.dep.inc +# @if [ -n "${MAKE_VERSION}" ]; then \ +# echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ +# echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ +# echo "include \$${DEPFILES}" >>.dep.inc; \ +# echo "endif" >>.dep.inc; \ +# else \ +# echo ".KEEP_STATE:" >>.dep.inc; \ +# echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ +# fi diff --git a/enc28j60-avr-tcpclient.X/nbproject/Makefile-local-default.mk b/enc28j60-avr-tcpclient.X/nbproject/Makefile-local-default.mk new file mode 100644 index 0000000..ac91a41 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/nbproject/Makefile-local-default.mk @@ -0,0 +1,36 @@ +# +# Generated Makefile - do not edit! +# +# +# This file contains information about the location of compilers and other tools. +# If you commmit this file into your revision control server, you will be able to +# to checkout the project and build it from the command line with make. However, +# if more than one person works on the same project, then this file might show +# conflicts since different users are bound to have compilers in different places. +# In that case you might choose to not commit this file and let MPLAB X recreate this file +# for each user. The disadvantage of not commiting this file is that you must run MPLAB X at +# least once so the file gets created and the project can be built. Finally, you can also +# avoid using this file at all if you are only building from the command line with make. +# You can invoke make with the values of the macros: +# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... +# +PATH_TO_IDE_BIN=/opt/microchip/mplabx/v6.10/mplab_platform/platform/../mplab_ide/modules/../../bin/ +# Adding MPLAB X bin directory to path. +PATH:=/opt/microchip/mplabx/v6.10/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) +# Path to java used to run MPLAB X when this makefile was created +MP_JAVA_PATH="/opt/microchip/mplabx/v6.10/sys/java/zulu8.64.0.19-ca-fx-jre8.0.345-linux_x64/bin/" +OS_CURRENT="$(shell uname -s)" +MP_CC="/opt/microchip/xc8/v2.41/bin/xc8-cc" +# MP_CPPC is not defined +# MP_BC is not defined +MP_AS="/opt/microchip/xc8/v2.41/bin/xc8-cc" +MP_LD="/opt/microchip/xc8/v2.41/bin/xc8-cc" +MP_AR="/opt/microchip/xc8/v2.41/bin/xc8-ar" +DEP_GEN=${MP_JAVA_PATH}java -jar "/opt/microchip/mplabx/v6.10/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" +MP_CC_DIR="/opt/microchip/xc8/v2.41/bin" +# MP_CPPC_DIR is not defined +# MP_BC_DIR is not defined +MP_AS_DIR="/opt/microchip/xc8/v2.41/bin" +MP_LD_DIR="/opt/microchip/xc8/v2.41/bin" +MP_AR_DIR="/opt/microchip/xc8/v2.41/bin" +DFP_DIR=/opt/microchip/mplabx/v6.10/packs/Microchip/AVR-Dx_DFP/2.3.272 diff --git a/enc28j60-avr-tcpclient.X/nbproject/Makefile-variables.mk b/enc28j60-avr-tcpclient.X/nbproject/Makefile-variables.mk new file mode 100644 index 0000000..b1eee9b --- /dev/null +++ b/enc28j60-avr-tcpclient.X/nbproject/Makefile-variables.mk @@ -0,0 +1,10 @@ +# +# Generated - do not edit! +# +# NOCDDL +# +CND_BASEDIR=`pwd` +# default configuration +CND_ARTIFACT_DIR_default=dist/default/production +CND_ARTIFACT_NAME_default=enc28j60-avr-tcpclient.X.production.hex +CND_ARTIFACT_PATH_default=dist/default/production/enc28j60-avr-tcpclient.X.production.hex diff --git a/enc28j60-avr-tcpclient.X/nbproject/configurations.xml b/enc28j60-avr-tcpclient.X/nbproject/configurations.xml new file mode 100644 index 0000000..6052c69 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/nbproject/configurations.xml @@ -0,0 +1,376 @@ + + + + + + app_files/tcp_client_demo.h + + + + mcc_generated_files/ethernet/enc28j60.h + mcc_generated_files/ethernet/physical_layer_interface.h + + + mcc_generated_files/spi/spi_interface.h + mcc_generated_files/spi/spi0.h + + + + + mcc_generated_files/system/utils/assembler/gas.h + mcc_generated_files/system/utils/assembler/iar.h + + mcc_generated_files/system/utils/interrupt_avr8.h + mcc_generated_files/system/utils/utils_assert.h + mcc_generated_files/system/utils/atomic.h + mcc_generated_files/system/utils/utils.h + mcc_generated_files/system/utils/compiler.h + mcc_generated_files/system/utils/assembler.h + + mcc_generated_files/system/clock.h + mcc_generated_files/system/interrupt.h + mcc_generated_files/system/protected_io.h + mcc_generated_files/system/pins.h + mcc_generated_files/system/config_bits.h + mcc_generated_files/system/port.h + mcc_generated_files/system/ccp.h + mcc_generated_files/system/system.h + + + mcc_generated_files/tcpiplite/network.h + mcc_generated_files/tcpiplite/tcpip_types.h + mcc_generated_files/tcpiplite/ipv4.h + mcc_generated_files/tcpiplite/udpv4_port_handler_table.h + mcc_generated_files/tcpiplite/log.h + mcc_generated_files/tcpiplite/dhcp_client.h + mcc_generated_files/tcpiplite/log_console.h + mcc_generated_files/tcpiplite/lfsr.h + mcc_generated_files/tcpiplite/log_syslog.h + mcc_generated_files/tcpiplite/rtcc.h + mcc_generated_files/tcpiplite/ip_database.h + mcc_generated_files/tcpiplite/tcpip_config.h + mcc_generated_files/tcpiplite/arpv4.h + mcc_generated_files/tcpiplite/tcpv4.h + mcc_generated_files/tcpiplite/udpv4.h + + + mcc_generated_files/timer/timer_interface.h + mcc_generated_files/timer/delay.h + mcc_generated_files/timer/tca0.h + + + + + + + + + app_files/src/tcp_client_demo.c + + + + + + mcc_generated_files/ethernet/src/enc28j60.c + + + + + mcc_generated_files/spi/src/spi0.c + + + + + mcc_generated_files/system/src/clock.c + mcc_generated_files/system/src/config_bits.c + mcc_generated_files/system/src/protected_io.S + mcc_generated_files/system/src/interrupt.c + mcc_generated_files/system/src/system.c + mcc_generated_files/system/src/pins.c + + + + + mcc_generated_files/tcpiplite/src/udpv4.c + mcc_generated_files/tcpiplite/src/log_console.c + mcc_generated_files/tcpiplite/src/dhcp_client.c + mcc_generated_files/tcpiplite/src/network.c + mcc_generated_files/tcpiplite/src/log_syslog.c + mcc_generated_files/tcpiplite/src/lfsr.c + mcc_generated_files/tcpiplite/src/tcpv4.c + mcc_generated_files/tcpiplite/src/arpv4.c + mcc_generated_files/tcpiplite/src/log.c + mcc_generated_files/tcpiplite/src/rtcc.c + mcc_generated_files/tcpiplite/src/ipv4.c + mcc_generated_files/tcpiplite/src/ip_database.c + mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c + + + + + mcc_generated_files/timer/src/delay.c + mcc_generated_files/timer/src/tca0.c + + + + main.c + + + Makefile + ENC28J60-avr-tcpclient.mc3 + + + + ../../DMP_SPACE/Downloads/enc28j60-tcp-client-solution/enc28j60-tcp-client-solution.X/app_files + app_files + + Makefile + + + + localhost + AVR64DD32 + + + nEdbgTool + XC8 + 2.41 + 3 + + + + + + + + + + + + + + + false + false + + + + + + + false + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enc28j60-avr-tcpclient.X/nbproject/private/configurations.xml b/enc28j60-avr-tcpclient.X/nbproject/private/configurations.xml new file mode 100644 index 0000000..ef4ea37 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/nbproject/private/configurations.xml @@ -0,0 +1,25 @@ + + + Makefile + 0 + + + + + + place holder 1 + place holder 2 + + + + + true + 0 + 0 + 0 + + + + + + diff --git a/enc28j60-avr-tcpclient.X/nbproject/project.xml b/enc28j60-avr-tcpclient.X/nbproject/project.xml new file mode 100644 index 0000000..69084a3 --- /dev/null +++ b/enc28j60-avr-tcpclient.X/nbproject/project.xml @@ -0,0 +1,26 @@ + + + com.microchip.mplab.nbide.embedded.makeproject + + + enc28j60-avr-tcpclient + 77d47dde-41a1-4aee-a384-122c0fdf7521 + 0 + ISO-8859-1 + + + ../../DMP_SPACE/Downloads/enc28j60-tcp-client-solution/enc28j60-tcp-client-solution.X/app_files + app_files + + + + default + 2 + + + + false + + + + diff --git a/enc28j60-avr-tcpserver.X/Makefile b/enc28j60-avr-tcpserver.X/Makefile new file mode 100644 index 0000000..fca8e2c --- /dev/null +++ b/enc28j60-avr-tcpserver.X/Makefile @@ -0,0 +1,113 @@ +# +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: +# +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target +# +# Targets beginning with '.' are not intended to be called on their own. +# +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. +# +# Available make variables: +# +# CND_BASEDIR base directory for relative paths +# CND_DISTDIR default top distribution directory (build artifacts) +# CND_BUILDDIR default top build directory (object files, ...) +# CONF name of current configuration +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) +# CND_PACKAGE_NAME_${CONF} name of package (current configuration) +# CND_PACKAGE_PATH_${CONF} path to package (current configuration) +# +# NOCDDL + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib + + +# build +build: .build-post + +.build-pre: +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... + + +# clean +clean: .clean-post + +.clean-pre: +# Add your pre 'clean' code here... +# WARNING: the IDE does not call this target since it takes a long time to +# simply run make. Instead, the IDE removes the configuration directories +# under build and dist directly without calling make. +# This target is left here so people can do a clean when running a clean +# outside the IDE. + +.clean-post: .clean-impl +# Add your post 'clean' code here... + + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk + +# include project make variables +include nbproject/Makefile-variables.mk diff --git a/enc28j60-avr-tcpserver.X/app_files/src/tcp_server_demo.c b/enc28j60-avr-tcpserver.X/app_files/src/tcp_server_demo.c new file mode 100644 index 0000000..70eb24e --- /dev/null +++ b/enc28j60-avr-tcpserver.X/app_files/src/tcp_server_demo.c @@ -0,0 +1,106 @@ +/** + * TCP Server Demo Application Source File + * + * @file tcp_server_demo.c + * + * @ingroup tcpserverdemo + * + * @brief TCP server demonstration implementation. + * + * @version TCP Server Demo Application Version 5.0.0 + */ + +/* +© [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS "AS IS". + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +// Included files +#include +#include +#include "../../mcc_generated_files/system/system.h" +#include "../../mcc_generated_files/tcpiplite/tcpv4.h" +#include "../../mcc_generated_files/tcpiplite/ipv4.h" +#include "../../mcc_generated_files/tcpiplite/tcpip_config.h" +#include "../tcp_server_demo.h" + +// Functions +void TCP_Demo_Echo_Server(void) +{ + // Socket for the TCP Server + static tcpTCB_t portXTCB; + + // TX and RX Server's buffers + static uint8_t rxdataPortX[20]; + static uint8_t txdataPortX[20]; + + uint16_t rxLen, txLen, i; + socketState_t socket_state; + + socket_state = TCP_SocketPoll(&portXTCB); + + switch (socket_state) + { + case NOT_A_SOCKET: + + // Inserting and Initializing the socket + TCP_SocketInit(&portXTCB); + break; + + case SOCKET_CLOSED: + + // Configuring the local port + TCP_Bind(&portXTCB, 7); + // Adding receive buffer + TCP_InsertRxBuffer(&portXTCB, rxdataPortX, sizeof(rxdataPortX)); + // Starting the TCP server: Listen on port + TCP_Listen(&portXTCB); + break; + + case SOCKET_CONNECTED: + // Checking if the buffer was sent, if yes we can send another buffer + if (TCP_SendDone(&portXTCB)) + { + // Checking to see if there are any received data + rxLen = (uint16_t)TCP_GetRxLength(&portXTCB); + if (rxLen > 0) + { + rxLen = (uint16_t)TCP_GetReceivedData(&portXTCB); + // Simulating buffer processing + for (i = 0; i < rxLen; i++) + { + txdataPortX[i] = rxdataPortX[i]; + } + // Reusing the RX buffer + TCP_InsertRxBuffer(&portXTCB, rxdataPortX, sizeof(rxdataPortX)); + txLen = rxLen; + // Sending data back to the source + TCP_Send(&portXTCB, txdataPortX, txLen); + } + } + break; + + case SOCKET_CLOSING: + TCP_SocketRemove(&portXTCB); + break; + + default: + break; + } +} \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/app_files/tcp_server_demo.h b/enc28j60-avr-tcpserver.X/app_files/tcp_server_demo.h new file mode 100644 index 0000000..24f48cb --- /dev/null +++ b/enc28j60-avr-tcpserver.X/app_files/tcp_server_demo.h @@ -0,0 +1,45 @@ +/** + * TCP Server Demo Application Header File + * + * @file tcp_server_demo.h + * + * @ingroup tcpserverdemo TCPSERVERDEMO + * + * @brief Transmission Control Protocol (TCP) server demonstration implementation. + * + * @version TCP Server Demo Application Version 5.0.0 + */ + +/* +© [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS "AS IS". + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef TCP_SERVER_DEMO_H +#define TCP_SERVER_DEMO_H + +/** + * @ingroup tcpserverdemo + * @brief Implements an echo server over TCP. + * @param None. + * @return None. + */ +void TCP_Demo_Echo_Server(void); + +#endif \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/enc28j60-avr-tcpserver.mc3 b/enc28j60-avr-tcpserver.X/enc28j60-avr-tcpserver.mc3 new file mode 100644 index 0000000..0bf61bc --- /dev/null +++ b/enc28j60-avr-tcpserver.X/enc28j60-avr-tcpserver.mc3 @@ -0,0 +1,385 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Application Builder + class com.microchip.mcc.melody.module.FrameworkModule + + + CLKCTRL + class com.microchip.mcc.melody.hw.module.HardwareModule + + + CPUINT + class com.microchip.mcc.melody.hw.module.HardwareModule + + + Configuration Bits + class com.microchip.mcc.melody.hw.module.HardwareModule + + + MAIN MANAGER + class com.microchip.mcc.melody.hw.module.HardwareModule + + + Pin Manager + class com.microchip.mcc.melody.hw.module.HardwareModule + + + SPI0 + class com.microchip.mcc.melody.hw.module.HardwareModule + + + TCA0 + class com.microchip.mcc.melody.hw.module.HardwareModule + + + meta + class com.microchip.mcc.melody.hw.module.HardwareModule + + + module0 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module1 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module10 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module12 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module2 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module3 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module4 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module44 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module5 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module6 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module7 + class com.microchip.mcc.melody.script.module.ScriptModule + + + + + + + + + {} + + + + {"userAddedModules":["module44"],"version":"INITIAL","modules":{"module5":{"scriptId":"@mchp-mcc/scf-avr8-clkctrl-v3","imports":{"pin_standard":{"interfaceId":{"name":"pin-standard","version":"^0"},"handle":{"providerId":"module3","exportId":"pin-standard"}},"scf_avr8_clkctrl_v3":{"interfaceId":{"name":"scf-avr8-clkctrl-v3","version":"^1.0.0"},"handle":{"providerId":"mccDevice","exportId":"CLKCTRL"}},"interrupt_standard":{"interfaceId":{"name":"interrupt-standard","version":"^1"},"handle":{"providerId":"module4","exportId":"interrupt"}},"device_meta":{"interfaceId":{"name":"device-meta","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"config_device":{"interfaceId":{"name":"config-device","version":"^1"},"handle":{"providerId":"module1","exportId":"config_device"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0"},"handle":{"providerId":"module1","exportId":"initializer_system"}},"config_request":{"interfaceId":{"name":"config-request","version":"^2"},"handle":{"providerId":"module1","exportId":"config_request"}}},"framewSpecificState":{"userEditedImports":[]}},"module10":{"scriptId":"@mchp-mcc/scf-avr8-tca-v1","imports":{"osc_clock":{"interfaceId":{"name":"osc-clocks","version":"^0"},"handle":{"providerId":"module5","exportId":"osc_clocks"}},"pin_standard":{"interfaceId":{"name":"pin-standard","version":"^0"},"handle":{"providerId":"module3","exportId":"pin-standard"}},"scf_avr8_tca_v1":{"interfaceId":{"name":"scf-avr8-tca-v1","version":"^1"},"handle":{"providerId":"mccDevice","exportId":"TCA0"}},"interrupt_standard":{"interfaceId":{"name":"interrupt-standard","version":"^1"},"handle":{"providerId":"module4","exportId":"interrupt"}},"device_meta":{"interfaceId":{"name":"device-meta","version":"^1"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0"},"handle":{"providerId":"module1","exportId":"initializer_system"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"main":{"hardware":{"clkselTcaSingleCtrla":"System Clock / 256","requestedTimeNorm":1.0},"interrupt":{"ovfi":true}}}},"module4":{"scriptId":"@mchp-mcc/scf-avr8-interrupt-v1","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"scf_avr8_interrupt_v1":{"interfaceId":{"name":"scf-avr8-interrupt-v1","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"CPUINT"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0"},"handle":{"providerId":"module1","exportId":"initializer_system"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"main":{"interrupt":{"iSreg":true}}}},"module7":{"scriptId":"@mchp-mcc/scf-avr8-spi-v1","imports":{"pin_standard":{"interfaceId":{"name":"pin-standard","version":"^0"},"handle":{"providerId":"module3","exportId":"pin-standard"}},"scf_avr8_spi_v1":{"interfaceId":{"name":"scf-avr8-spi-v1","version":"^1"},"handle":{"providerId":"mccDevice","exportId":"SPI0"}},"interrupt_standard":{"interfaceId":{"name":"interrupt-standard","version":"^1"},"handle":{"providerId":"module4","exportId":"interrupt"}},"device_meta":{"interfaceId":{"name":"device-meta","version":"^1"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"osc_clocks":{"interfaceId":{"name":"osc-clocks","version":"^0"},"handle":{"providerId":"module5","exportId":"osc_clocks"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0"},"handle":{"providerId":"module1","exportId":"initializer_system"}}},"framewSpecificState":{"userEditedImports":[]}},"module6":{"scriptId":"@mchp-mcc/delay-blocking-driver","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"^1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"osc_clocks":{"interfaceId":{"name":"osc-clocks","version":"^0"},"handle":{"providerId":"module5","exportId":"osc_clocks"}},"config_info":{"interfaceId":{"name":"config-info","version":"^0"},"handle":{"providerId":"module1","exportId":"config_info"}}},"framewSpecificState":{"userEditedImports":[]}},"module12":{"scriptId":"@mchp-mcc/ethernet-drivers-8bit","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"^1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"pin_standard":{"interfaceId":{"name":"pin-standard","version":"^0.1.0"},"handle":{"providerId":"module3","exportId":"pin-standard"}},"delay_blocking":{"interfaceId":{"name":"delay-blocking","version":"^0|1"},"handle":{"providerId":"module6","exportId":"delay_blocking"}},"spi_master_basic":{"interfaceId":{"name":"spi-master-basic","version":"^0.5.0"},"handle":{"providerId":"module7","exportId":"spi_master_basic"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"main":{"software":{"ethChipSelectPin":{"PA7":{"cname":"ETH_CS","ioc":"INTDIS_BUFFEN"}}}}}},"module44":{"scriptId":"@mchp-mcc/tcpip-lite","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"^1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"interrupt_standard":{"interfaceId":{"name":"interrupt-standard","version":"^1.0.0"},"handle":{"providerId":"module4","exportId":"interrupt"}},"initializer_main":{"interfaceId":{"name":"initializer-main","version":"^0|1"},"handle":{"providerId":"module0","exportId":"initializer_main"}},"timer_timeout":{"interfaceId":{"name":"timer-timeout","version":"^0.1.2"},"handle":{"providerId":"module10","exportId":"timer_timeout","label":"TCA0"}},"ethernet_driver":{"interfaceId":{"name":"ethernet-drivers-8bit-interface","version":"^1.0.0"},"handle":{"providerId":"module12","exportId":"ethernet_driver"}}},"framewSpecificState":{"userEditedImports":["timer_timeout"]},"payload":{"main":{"Protocol":{"TCP":true}}}},"module1":{"scriptId":"@mchp-mcc/avr8-configuration-bits-v1","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"initializer_main":{"interfaceId":{"name":"initializer-main","version":"^0.3.0"},"handle":{"providerId":"module0","exportId":"initializer_main"}},"avr8_configuration_bits_v1":{"interfaceId":{"name":"avr8-configuration-bits-v1","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"Configuration Bits"}}},"framewSpecificState":{"userEditedImports":[]}},"module0":{"scriptId":"@mchp-mcc/main-manager","imports":{"main":{"interfaceId":{"name":"main-manager","version":"^1.*"},"handle":{"providerId":"mccDevice","exportId":"MAIN MANAGER"}}},"framewSpecificState":{"userEditedImports":[]}},"module3":{"scriptId":"@mchp-mcc/pin-content-processor","imports":{"device-meta":{"interfaceId":{"name":"device-meta","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"pin-architecture":{"interfaceId":{"name":"pin-architecture","version":"1.0.0"},"handle":{"providerId":"module2","exportId":"pin-architecture"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"saved":{"rows":{"module12":{"GPIO$ETH_CS$output":{"pins":{"PA0":{"state":"MUL"},"PA1":{"state":"MUL"},"PA2":{"state":"MUL"},"PA3":{"state":"MUL"},"PA4":{"state":"MUL"},"PA5":{"state":"MUL"},"PA6":{"state":"MUL"},"PA7":{"state":"L"},"PC0":{"state":"MUL"},"PC1":{"state":"MUL"},"PC2":{"state":"MUL"},"PC3":{"state":"MUL"},"PD1":{"state":"MUL"},"PD2":{"state":"MUL"},"PD3":{"state":"MUL"},"PD4":{"state":"MUL"},"PD5":{"state":"MUL"},"PD6":{"state":"MUL"},"PD7":{"state":"MUL"},"PF0":{"state":"MUL"},"PF1":{"state":"MUL"},"PF2":{"state":"MUL"},"PF3":{"state":"MUL"},"PF4":{"state":"MUL"},"PF5":{"state":"MUL"},"PF6":{"state":"MUL"},"PF7":{"state":"MUL"}}}},"pcp":{"GPIO$GPIO$input":{"pins":{"PF5":{"state":"MUL"},"PF6":{"state":"L"}}},"GPIO$GPIO$output":{"pins":{"PF5":{"state":"L"},"PF6":{"state":"MUL"}}}}},"userEditedData":{"cname":{"eview":{"PF6":"SW0","PF5":"LED0"}},"high":{"eview":{"PF5":true}},"inv":{"eview":{"PF5":true}}}}}},"module2":{"scriptId":"@mchp-mcc/avr8-pin-manager","imports":{"avr8-pin-manager":{"interfaceId":{"name":"avr8-pin-manager","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"Pin Manager"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0.*"},"handle":{"providerId":"module1","exportId":"initializer_system"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"adapterdata":{"cname":{"eview":{"dataMap":{"PF6":{"value":"SW0"},"PF5":{"value":"LED0"}}}},"high":{"eview":{"dataMap":{"PF5":{"value":true}}}},"inv":{"eview":{"dataMap":{"PF5":{"value":true}}}}}}}},"content":{"@mchp-mcc/avr-8bit":"4.7.0","@mchp-mcc/ethernet-drivers-8bit":"6.0.0","@mchp-mcc/tcpip-lite":"5.0.0","@mchp-mcc/pin-content-processor":"3.6.0","@mchp-mcc/delay-blocking-driver":"3.1.0","@mchp-mcc/scf-avr8-tca-v1":"6.0.9","@mchp-mcc/avr8-pin-manager":"4.5.1","@mchp-mcc/scf-avr8-spi-v1":"4.1.12","@mchp-mcc/scf-avr8-interrupt-v1":"5.0.12","@mchp-mcc/scf-avr8-clkctrl-v3":"2.0.8","@mchp-mcc/main-manager":"3.1.1","@mchp-mcc/avr8-configuration-bits-v1":"4.2.12"}} + + + + + mcc_generated_files\tcpiplite\src\log.c + 96afab78b0d74a8b87853f7b77d9cd2cef84c7a5019bee734f5aae12772bd6f0 + + + mcc_generated_files\tcpiplite\ipv4.h + b188c4e5a6df0b88cd186cfca1cc9a218ec4570b5529fa1408c98d8536c44582 + + + mcc_generated_files\tcpiplite\arpv4.h + fa77137ca7ed34e390e5a6cefc4826b943590f9ab8959db034dab68c9e3488f6 + + + mcc_generated_files\system\interrupt.h + 75695d9cc1e45b240332ce98cce195022df36e1a15d4891d26cff6e390f2b765 + + + mcc_generated_files\system\port.h + 263a68fee4685f2eca9986a962d5dd14141bebcd043238117c0ca24e2a54a95f + + + mcc_generated_files\tcpiplite\src\log_console.c + 393e0f69dcd52d8036878f16daadc1227c552d11f513c4af0c3ce054ff14ff30 + + + mcc_generated_files\system\utils\interrupt_avr8.h + bf66a9d1b57d17151c1aa3b9e207a694bbf854df962b69135c6d922d026ce7cf + + + mcc_generated_files\tcpiplite\tcpv4.h + 6e926c76e2393edebc8f032a751a5beae33d9d3ac6848c72c99ff3bfb6d86709 + + + mcc_generated_files\system\pins.h + 3025369cb8d94a5f203b0434dc8af07c553ebec6c4f499742e47a01390f03ea2 + + + mcc_generated_files\tcpiplite\rtcc.h + 96d00ec507619feb1532a7ae5996a8b276fb2548bb303a128c4bba69584bb7c7 + + + mcc_generated_files\timer\delay.h + 303ca2f795e184d0ffd854bb6cf49b573a35abc6f3b9aa7aa6f0853030cd870f + + + mcc_generated_files\system\src\clock.c + f712f03827d2efc2db11606d25e481a193f4f16f46605dffc0ef6eea255ffe31 + + + mcc_generated_files\tcpiplite\src\rtcc.c + 1560fee9d73302780e3bc2036463c66bd99e63d2d858f27387aa87600a9b9b31 + + + mcc_generated_files\system\clock.h + b25dc6cca3f5aac576eb1aea49186ae14ec9ffcaf93743d3c419cb54468d7e29 + + + mcc_generated_files\tcpiplite\src\lfsr.c + 02cb5b4e1a1d25983a158043ee959b56d3eff7d019c630441552ec0580c419e9 + + + mcc_generated_files\tcpiplite\src\dhcp_client.c + 13b73f4241221ce7dfa7da94efdaddd9a6610810f8f2b42d9f247ed58889766a + + + mcc_generated_files\spi\src\spi0.c + e59786c52053f3c99c09b42f4268500f88f591539fc53f5d424769f2eda9d9cb + + + mcc_generated_files\tcpiplite\lfsr.h + c88f319589ea6436628484deaf783d8545163d8722978f4a69ee2ed736c133d0 + + + mcc_generated_files\tcpiplite\src\log_syslog.c + dcc430d972935543dfe2db5f164ae35385f424d7fac1617983d42cc137c86d31 + + + mcc_generated_files\system\system.h + d1ddba55a9d5c82c00699fd9d53c3c804b9dd7fa10e298d3a7b755909cdc7baa + + + mcc_generated_files\ethernet\physical_layer_interface.h + 820d28b247eca06e574bdee8161c9f99b6106f08bea7b04688f28a66a741eadc + + + mcc_generated_files\system\utils\assembler\gas.h + 05129f00ef45a989573a0427f37de7661fa3005f22778ad24c0dca228468a018 + + + mcc_generated_files\tcpiplite\network.h + 2fd62276a42b90881ca66280994cbb49bba44ede6814fc021e876462461176e4 + + + mcc_generated_files\tcpiplite\dhcp_client.h + 973946873aca05dfe028b5be0d0241f53467aa599c1d6519ccbfdcc0a947e4fc + + + mcc_generated_files\timer\src\tca0.c + d8eade8f58064d3ada10ce6efc82278dd8ee160b6d2a40599cf34103146463c3 + + + mcc_generated_files\tcpiplite\tcpip_types.h + 0864c0fa1d85547d7a7283078c4825294076ae23cb08686c3cbd9255b96146ae + + + mcc_generated_files\system\src\protected_io.S + 3bb77a623e934d19f38ed22bfd302ac90e929cb841406c027d11193bd5358b36 + + + mcc_generated_files\system\src\config_bits.c + 73ad17f1190da35640dea29ef78dd1ea7e4fed708c2a39eba32cc9024dec889e + + + mcc_generated_files\ethernet\enc28j60.h + 5329ea5e6fef75c9015adb5cc1a6b27fba7a00f5cfa860197c4d38e760484e8e + + + mcc_generated_files\tcpiplite\log_syslog.h + ce12b5f087cdc601844c08419f74ae5e0ebf37498abe9faf77483941f4ef2749 + + + mcc_generated_files\tcpiplite\src\udpv4_port_handler_table.c + df59969d33e31ac5cd1b1476c69015c97cf12d6102f64f4973efde4c302ddcd3 + + + mcc_generated_files\system\src\system.c + aceff89e6f354a1a6ad81a72cd709255cf7d726acb2cd003ee4c48670e63d7a0 + + + mcc_generated_files\system\utils\compiler.h + 78fc7aaa9215a68e38da793ec09d384598330944557b49c79aef4af747e76e08 + + + mcc_generated_files\timer\timer_interface.h + c663a68f1004f660bf34cd96cf61a9012847f97b9cff5098686010e234deb62a + + + mcc_generated_files\system\utils\utils_assert.h + e6a57e1164f862da6a703fa67c200945b7a21fb6ab9e9b57ff14507467e04cc6 + + + mcc_generated_files\system\utils\assembler\iar.h + baafb63c988a088a34457e1d6433e87a0b658d1486fce12eec427b9457991549 + + + mcc_generated_files\tcpiplite\udpv4.h + bda9bc53ffa8e3747d8438ce9b7365aba133e26a6750e6de7cddbda49b6daa42 + + + mcc_generated_files\system\src\pins.c + 9d9594dcc31366281aca74d0485f5b27e042dfd5985fbb4e216a7b349cf0d5fa + + + mcc_generated_files\timer\tca0.h + 5aac000bbb51c8915bdd2fefdd2604375562c69acef5023955296a387357647e + + + mcc_generated_files\spi\spi_interface.h + cd755e06457e2bb365bd4f949fdf7e49f12f9a89a3316457f3ff05083b538ffe + + + mcc_generated_files\system\utils\atomic.h + 2a0975cf197fcfdec0a503a3e3b899336a83d123a3066d0e8c2b3fc5dbc3d6ac + + + mcc_generated_files\tcpiplite\src\ip_database.c + 6ad2b505dd44e030363ee7ee3464546fa29c3401366367f5e4d08232a23c4987 + + + mcc_generated_files\tcpiplite\log_console.h + 8ce7fa1f69dc36a6169cdac93cf109796e88198b8174a8bf5b380a32f6a25424 + + + mcc_generated_files\system\ccp.h + 771ef1ef56b145740365ded07000a4e9820fc4e2c7025b40ab80bf13288ee5e3 + + + mcc_generated_files\tcpiplite\src\tcpv4.c + 9b42a281d748202be8d4556a4df80e2d0922f784e0c7c837db4c32031b5c9320 + + + mcc_generated_files\ethernet\src\enc28j60.c + 68a1043acf0ba5fded10401fd33a0d5708d1847b7423093533e417ff53d1c6c1 + + + main.c + 266575cfbd620190ac1e41d48753323c806eb90f55a657805edc677165d4af22 + + + mcc_generated_files\tcpiplite\src\udpv4.c + 9b5d18f9cbf2b37620a1681a647c0f8c70834c2065a000aa2a91f835f702f421 + + + mcc_generated_files\tcpiplite\src\ipv4.c + 2c3fd96f86690cb7769cb6d759c0efdccc8c4dcb2898e1ea5f48115080358274 + + + mcc_generated_files\tcpiplite\src\network.c + 869ee3d7ca7460ff14af576833422dab1c313f8aeac3dcdfbd3a913fc447416e + + + mcc_generated_files\timer\src\delay.c + 982e6c0e726105e62588380d30d9e99cafcf2dd975eb0765561b68c4e6762a47 + + + mcc_generated_files\system\src\interrupt.c + 50dedff282518aad79d64bef461deb27ced81abc4b4033fd891ff29cc9bb5d54 + + + mcc_generated_files\tcpiplite\ip_database.h + 34e10322035cefd6b86319f28ecd6ad66e6709bf62dd8b12815e25e70b51ed7c + + + mcc_generated_files\tcpiplite\tcpip_config.h + 63612e28526229feaede1bd718e95d72f31aea8c59af98f5897d2618be4694f6 + + + mcc_generated_files\tcpiplite\udpv4_port_handler_table.h + 75bc247341d5c91f6312d03bad0ccd56ba138fa5968b85bdeac5bdcb3edc7000 + + + mcc_generated_files\system\utils\utils.h + d02918b46fc138c440e381cb9a557c9f69c1cc3eb141f007b0a3738f02f4d543 + + + mcc_generated_files\system\config_bits.h + fa24220622dc1f4ebda67e226cb7480d29e7dcb70ba069c8a618c7d1cc67a0ef + + + mcc_generated_files\system\utils\assembler.h + a51d2178d0c940ae2d1b51eff122d0d63e53efe29edb2fb8c7fbd78b1c2fcabe + + + mcc_generated_files\spi\spi0.h + 300c4b7c8fef8f7550445173c30260c521c8c1a6245bc5bf3cd4fbfcc7f3d702 + + + mcc_generated_files\tcpiplite\log.h + 7243fada51a57f83f9f850fb0b4ac06ffa77e3728f93f2ebfa1fc20f00d0fa13 + + + mcc_generated_files\system\protected_io.h + 2197a3749e9525a893011ccc9095321665641b68aeda5ebbea9d2711ab3f9aa7 + + + mcc_generated_files\tcpiplite\src\arpv4.c + 5ec5b193796645fb43fd3a681cb1238c43ca4d9863ff1054b488c45848384bbe + + + \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/main.c b/enc28j60-avr-tcpserver.X/main.c new file mode 100644 index 0000000..9c7a4b5 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/main.c @@ -0,0 +1,64 @@ + /* + * MAIN Generated Driver File + * + * @file main.c + * + * @defgroup main MAIN + * + * @brief This is the generated driver implementation file for the MAIN driver. + * + * @version MAIN Driver Version 1.0.0 +*/ + +/* +© [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS "AS IS". + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "mcc_generated_files/system/system.h" +#include "mcc_generated_files/tcpiplite/network.h" +#include "mcc_generated_files/tcpiplite/ip_database.h" +#include "app_files/tcp_server_demo.h" + +/* + Main application +*/ + +int main(void) +{ + SYSTEM_Initialize(); + // Add this to while(1): Network_Manage(); + + unsigned long ip; + + Network_Init(); + + TCA0_Start(); + + while(1) + { + Network_Manage(); + ip = ipdb_getAddress(); + + if(ip) + { + TCP_Demo_Echo_Server(); + } + } +} \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/docs/delay.dox b/enc28j60-avr-tcpserver.X/mcc_generated_files/docs/delay.dox new file mode 100644 index 0000000..3ee8dc0 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/docs/delay.dox @@ -0,0 +1,16 @@ +/** +@addtogroup delay + +@section delay_basics Delay drivers for PIC and AVR + +The MPLAB XC8 and XC16 compilers have built-in delay functions or macros for when users need to tell the MCU to wait for a certain amount of time. +For these delay functions, time is measured in microseconds or milliseconds, and for PIC32 devices, in timer ticks as well. Format for invoking the macros +will vary from device to device but this delay driver can help abstract these format differences. + +@section delay_uses How to use the delay drivers + +To use the delay drivers, just include the delay.h file wherever you intend to use the delay function and call the DELAY_milliseconds(time) or DELAY_microseconds(time) function where +time is the number of milliseconds or microseconds to delay. + +*/ + diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/ethernet/enc28j60.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/ethernet/enc28j60.h new file mode 100644 index 0000000..cd809ff --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/ethernet/enc28j60.h @@ -0,0 +1,324 @@ +/** + * ENC28J60 Ethernet Driver Header File + * + * @file enc28j60.h + * + * @defgroup enc28j60 ENC28J60 + * + * @brief This header file provides the API for the ENC28J60 Ethernet Driver. + * + * @version ENC28J60 Ethernet Driver Version 6.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef ENC28J60_H +#define ENC28J60_H + +// Macros + +#define SFR_BANK0 0x00 +#define SFR_BANK1 0x40 +#define SFR_BANK2 0x80 +#define SFR_BANK3 0xC0 +#define SFR_COMMON 0xE0 +#define BANK_MASK 0xE0 +#define SFR_MASK 0x1F + +#define byteSwap16(a) ((((uint16_t)a & (uint16_t)0xFF00) >> 8) | (((uint16_t)a & (uint16_t)0x00FF) << 8)) +#define byteReverse32(a) ((((uint32_t)a & (uint32_t)0xff000000) >> 24) | \ + (((uint32_t)a & (uint32_t)0x00ff0000) >> 8) | \ + (((uint32_t)a & (uint32_t)0x0000ff00) << 8) | \ + (((uint32_t)a & (uint32_t)0x000000ff) << 24)) + +#define byteReverse24(a) (((((uint32_t)a & (uint32_t)0x00FF00) >> 8) | (((uint32_t)a & (uint32_t)0x0000FF) << 8)) << 8 | (uint32_t)a >> 0x10) + +// Host to Network & Network to Host Macros +#ifndef htons +#define htons(a) byteSwap16(a) +#endif +#ifndef ntohs +#define ntohs(a) byteSwap16(a) +#endif +#ifndef htonl +#define htonl(a) byteReverse32(a) +#endif +#ifndef ntohl +#define ntohl(a) byteReverse32(a) +#endif + +#define convert_hton24(a) byteReverse24(a) + +// Enums + +/** + * @ingroup enc28j60 + * @enum spi_inst_t + * @brief SPI instructions. + */ +typedef enum +{ + rcr_inst = 0x00, /** +#include + +// Macros +#ifndef __XC8 +#define NOP() __asm__ __volatile__("nop") +#endif +#define ETH_packetReady() ethData.pktReady +#define ETH_linkCheck() ethData.up +#define ETH_linkChanged() ethData.linkChange + +// Structs/Enums/Unions + +/** + * @ingroup ethdriver8bit + * @enum ethernetDriver_t + * @brief Ethernet Driver status. + */ +typedef struct +{ + unsigned error : 1; + unsigned pktReady : 1; + unsigned up : 1; + unsigned idle : 1; + unsigned linkChange : 1; + unsigned bufferBusy : 1; + unsigned : 3; + uint16_t saveRDPT; + uint16_t saveWRPT; +} ethernetDriver_t; + +extern volatile ethernetDriver_t ethData; + +/** + * @ingroup ethdriver8bit + * @enum txPacket_t + * @brief Transmission packet. + */ +typedef struct +{ + uint16_t flags; + uint16_t packetStart; + uint16_t packetEnd; + void *prevPacket; + void *nextPacket; +} txPacket_t; + +/** + * @ingroup ethdriver8bit + * @enum phy_error_msg + * @brief PHY status/errors. + */ +typedef enum +{ + PHY_ERROR = 0, + PHY_SUCCESS, + PHY_LINK_NOT_FOUND, + PHY_BUFFER_BUSY, + PHY_TX_LOGIC_NOT_IDLE, + PHY_TX_QUEUED, + PHY_DMA_TIMEOUT, +} phy_error_msg; + +/** + * @ingroup ethdriver8bit + * @union mac48Address_t + * @brief MAC Address (48-bits). + */ +typedef union +{ + uint8_t mac_array[6]; + struct + { + uint8_t byte1, byte2, byte3, byte4, byte5, byte6; + } s; +} mac48Address_t; + +/** + * @ingroup ethdriver8bit + * @union mac64Address_t + * @brief MAC Address (64-bits). + */ +typedef union +{ + uint8_t mac_array[8]; + struct + { + uint8_t byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8; + } s; +} mac64Address_t; + +extern mac48Address_t hostMacAddress; +extern const mac48Address_t broadcastMAC; + +// Ethernet Driver APIs + +/** + * @ingroup ethdriver8bit + * @brief Sets up the Ethernet and starts the execution. Initializes the TX/RX buffer, the MAC and the PHY. + * @param None. + * @return None. + */ +void ETH_Init(void); + +/** + * @ingroup ethdriver8bit + * @brief Manages the MAC events. Can be used for polling or for new events in Interrupt Service Routine (ISR). + * @param None. + * @return None. + */ +void ETH_EventHandler(void); + +/** + * @ingroup ethdriver8bit + * @brief Updates the pointers for the next available RX packets. + * Retrieves information about the last received packet and the address of the next ones. + * @param None. + * @return None. + */ +void ETH_NextPacketUpdate(void); + +/** + * @ingroup ethdriver8bit + * @brief Resets the receiver buffer. + * @param None. + * @return None. + */ +void ETH_ResetReceiver(void); + +/** + * @ingroup ethdriver8bit + * @brief Resets the system software. + * @param None. + * @return None. + */ +void ETH_SendSystemReset(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the MAC address of type mac48Address_t. + * @param None. + * @return MAC address. + */ +const mac48Address_t *MAC_getAddress(void); + +// Read functions for data + +/** + * @ingroup ethdriver8bit + * @brief Reads a block of data from the RX buffer MAC. + * @param *buffer + * @param length + * @return Read count. + */ +uint16_t ETH_ReadBlock(void *buffer, uint16_t length); + +/** + * @ingroup ethdriver8bit + * @brief Reads one byte of data from the RX buffer MAC. + * @param None. + * @return One byte of data. + */ +uint8_t ETH_Read8(void); + +/** + * @ingroup ethdriver8bit + * @brief Reads two bytes of data from the RX buffer and returns them in host order. + * @param None. + * @return Two bytes of data. + */ +uint16_t ETH_Read16(void); + +/** + * @ingroup ethdriver8bit + * @brief Reads three bytes of data from the RX buffer and returns them in host order. + * @param None. + * @return Three bytes of data. + */ +uint32_t ETH_Read24(void); + +/** + * @ingroup ethdriver8bit + * @brief Reads four bytes of data from the RX buffer and returns them in host order. + * @param None. + * @return Four bytes of data. + */ +uint32_t ETH_Read32(void); + +/** + * @ingroup ethdriver8bit + * @brief Drops the N bytes from a packet list when the data is lost. Clears a number of bytes (length) from the RX buffer. + * @param length + * @return None. + */ +void ETH_Dump(uint16_t length); + +/** + * @ingroup ethdriver8bit + * @brief Drops the rest of this packet and release the buffer. + * Clears all bytes from the RX buffer. + * @param None. + * @return None. + */ +void ETH_Flush(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the available space size in the Ethernet TX buffer. + * @param None. + * @return Available space left in the TX buffer. + */ +uint16_t ETH_GetFreeTxBufferSize(void); + +/** + * @ingroup ethdriver8bit + * @brief Starts a packet if the Ethernet transmitter is idle. + * @param *dest_mac + * @param type + * @retval PHY_SUCCESS Packet started + * @retval PHY_BUFFER_BUSY Buffer is busy + * @retval PHY_TX_LOGIC_NOT_IDLE Transmitter is busy + */ +phy_error_msg ETH_WriteStart(const mac48Address_t *dest_mac, uint16_t type); + +/** + * @ingroup ethdriver8bit + * @brief Writes a string of data into the MAC. + * @param *string + * @return None. + */ +uint16_t ETH_WriteString(const char *string); + +/** + * @ingroup ethdriver8bit + * @brief Writes a block of data into the TX buffer MAC. + * @param *data + * @param length + * @return Length. + */ +uint16_t ETH_WriteBlock(const char *data, uint16_t length); + +/** + * @ingroup ethdriver8bit + * @brief Writes one byte of data into the TX buffer MAC. + * @param data + * @return None. + */ +void ETH_Write8(uint8_t data); + +/** + * @ingroup ethdriver8bit + * @brief Writes two bytes into the TX buffer MAC in Network order. + * @param data + * @return None. + */ +void ETH_Write16(uint16_t data); + +/** + * @ingroup ethdriver8bit + * @brief Writes three bytes into the TX buffer MAC in Network order. + * @param data + * @return None. + */ +void ETH_Write24(uint32_t data); + +/** + * @ingroup ethdriver8bit + * @brief Writes four bytes into the TX buffer MAC in Network order. + * @param data + * @return None. + */ +void ETH_Write32(uint32_t data); + +/** + * @ingroup ethdriver8bit + * @brief Inserts N data bytes into a specific offset in the TX buffer/packet. + * @param *data + * @param len length + * @param offset + * @return None. + */ +void ETH_Insert(char *data, uint16_t len, uint16_t offset); + +/** + * @ingroup ethdriver8bit + * @brief Copies N bytes from the saved read location (RX buffer) into the current TX location (TX buffer) using the DMA set up. + * This is used for ICMP ECHO to eliminate the need to extract the arbitrary payload. + * @param len length + * @retval PHY_SUCCESS + * @retval PHY_DMA_TIMEOUT + */ +phy_error_msg ETH_Copy(uint16_t len); + +/** + * @ingroup ethdriver8bit + * @brief Sends the TX packet. + * Starts the transmission of packet or queues the packet that has been created. + * @param None. + * @retval PHY_SUCCESS + * @retval PHY_BUFFER_BUSY + * @retval PHY_LINK_NOT_FOUND + * @retval PHY_TX_QUEUED + * @retval PHY_TX_LOGIC_NOT_IDLE + */ +phy_error_msg ETH_Send(void); + +/** + * @ingroup ethdriver8bit + * @brief Calculates the hardware checksum of length bytes starting with the position. + * @param position + * @param length + * @param seed + * @return Checksum. + */ +uint16_t ETH_TxComputeChecksum(uint16_t position, uint16_t length, uint16_t seed); + +/** + * @ingroup ethdriver8bit + * @brief Calculates the RX software checksum. + * @param len length + * @param seed + * @return Checksum. + */ +uint16_t ETH_RxComputeChecksum(uint16_t len, uint16_t seed); + +/** + * @ingroup ethdriver8bit + * @brief Reads the MAC address. + * @param *macAddr + * @return None. + */ +void ETH_GetMAC(uint8_t *macAddr); + +/** + * @ingroup ethdriver8bit + * @brief Sets the MAC address. + * @param *macAddr + * @return None. + */ +void ETH_SetMAC(uint8_t *macAddr); + +/** + * @ingroup ethdriver8bit + * @brief Returns the value of the write pointer. + * @param None. + * @return Pointer value. + */ +uint16_t ETH_GetWritePtr(void); + +/** + * @ingroup ethdriver8bit + * @brief Saves the receive pointer for copy. + * @param None. + * @return None. + */ +void ETH_SaveRDPT(void); + +/** + * @ingroup ethdriver8bit + * @brief Resets the receive pointer to the Init. + * @param None. + * @return None. + */ +void ETH_ResetReadPtr(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the value of the read pointer. + * @param None. + * @return Pointer value. + */ +uint16_t ETH_GetReadPtr(void); + +/** + * @ingroup ethdriver8bit + * @brief Sets the read pointer to a specific address. + * @param rdptr Read pointer + * @return None. + */ +void ETH_SetReadPtr(uint16_t rdptr); + +/** + * @ingroup ethdriver8bit + * @brief Returns the Status Vector's byte count. + * @param None. + * @return Byte count. + */ +uint16_t ETH_GetStatusVectorByteCount(void); + +/** + * @ingroup ethdriver8bit + * @brief Sets the Status Vector's byte count. + * @param bc Byte count + * @return None. + */ +void ETH_SetStatusVectorByteCount(uint16_t bc); + +/** + * @ingroup ethdriver8bit + * @brief Resets the driver's byte count. + * @param None. + * @return None. + */ +void ETH_ResetByteCount(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the the driver's byte count. + * @param None. + * @return Byte count. + */ +uint16_t ETH_GetByteCount(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the saved write pointer. + * @param None. + * @return Pointer value. + */ +uint16_t ETH_ReadSavedWRPT(void); + +/** + * @ingroup ethdriver8bit + * @brief Saves the write pointer for copy. + * @param None. + * @return None. + */ +void ETH_SaveWRPT(void); + +/** + * @ingroup ethdriver8bit + * @brief Sets the receiver's byte count. + * @param count byte count + * @return None. + */ +void ETH_SetRxByteCount(uint16_t count); + +/** + * @ingroup ethdriver8bit + * @brief Returns the receiver's byte count. + * @param None. + * @return Byte count. + */ +uint16_t ETH_GetRxByteCount(void); + +/** + * @ingroup ethdriver8bit + * @brief Checks for the link. + * @param None. + * @retval True if the link is present. + * @retval False if the link is not present. + */ +bool ETH_CheckLinkUp(void); + +/** + * @ingroup ethdriver8bit + * @brief Resets the transmitter. + * @param None. + * @return None. + */ +void ETH_TxReset(void); + +/** + * @ingroup ethdriver8bit + * @brief Moves back the read pointer. + * @param offset + * @return None. + */ +void ETH_MoveBackReadPtr(uint16_t offset); + +#endif /* PHYSICAL_LAYER_INTERFACE_H */ \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/ethernet/src/enc28j60.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/ethernet/src/enc28j60.c new file mode 100644 index 0000000..53db145 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/ethernet/src/enc28j60.c @@ -0,0 +1,1336 @@ +/** + * ENC28J60 Ethernet Driver Source File + * + * @file enc28j60.c + * + * @ingroup enc28j60 + * + * @brief This file provides the Ethernet driver API implementation for the ENC28J60 device. + * + * @version ENC28J60 Ethernet Driver Version 6.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Include Headers + +#include +#include +#include "../enc28j60.h" +#include "../../system/system.h" +#include "../physical_layer_interface.h" +#include "../../spi/spi_interface.h" +#include "../../timer/delay.h" + +// Macros + +#define RESET() ccp_write_io((void *)&RSTCTRL.SWRR, 0x1) + +// MAC Address + +#define MAC_ADDRESS {0x02, 0x00, 0x00, 0x00, 0x00, 0x01} +#define BROADCAST_MAC {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} + +/** + * @ingroup enc28j60 + * @def ETH_NCS_HIGH() + * @brief Sets Ethernet Chip Select to high. + */ +#define ETH_NCS_HIGH() do{ETH_CS_SetHigh();} while(0) + +/** + * @ingroup enc28j60 + * @def ETH_NCS_LOW() + * @brief Sets Ethernet Chip Select to low. + */ +#define ETH_NCS_LOW() do{ETH_CS_SetLow();} while(0) + +/** + * @ingroup enc28j60 + * @def ETH_SPI_READ8() + * @brief Reads the SPI byte. + */ +#define ETH_SPI_READ8() SPI0_ByteExchange(0) + +/** + * @ingroup enc28j60 + * @def ETH_SPI_WRITE8(a) + * @brief Writes the SPI byte. + */ +#define ETH_SPI_WRITE8(a) SPI0_ByteExchange(a) + +/** + * @ingroup enc28j60 + * @def ETH_WRITE_IN_PROGRESS + * @brief Packet write in progress, not ready for transmit. + */ +#define ETH_WRITE_IN_PROGRESS (0x0001 << 0) + +/** + * @ingroup enc28j60 + * @def ETH_TX_QUEUED + * @brief Packet complete, in queue for transmit. + */ +#define ETH_TX_QUEUED (0x0001 << 1) + +/** + * @ingroup enc28j60 + * @def ETH_ALLOCATED + * @brief Flag for pool management. Set to either free or allocated. + */ +#define ETH_ALLOCATED (0x0001 << 2) + +// Adjust these parameters for the MAC. +#define RAMSIZE_ETH (0x1FFF) // 8191 +#define MAX_TX_PACKET_SIZE (1518) +#define MIN_TX_PACKET_SIZE (64) +#define MAX_TX_PACKETS (20) + +#define TX_STATUS_VECTOR_SIZE (7) + +#define MIN_TX_PACKET (MIN_TX_PACKET_SIZE + TX_STATUS_VECTOR_SIZE) +#define TX_BUFFER_SIZE ((MAX_TX_PACKET_SIZE + TX_STATUS_VECTOR_SIZE) << 1) + +// Typical memory map for the MAC buffers +#define TXSTART (RAMSIZE_ETH - TX_BUFFER_SIZE) // 5141 +#define TXEND (RAMSIZE_ETH) // 8191 +#define RXSTART (0) +#define RXEND (TXSTART - 2) // 5139 + +#define TX_BUFFER_MID ((TXSTART) + ((TX_BUFFER_SIZE) >> 1)) + +#define SetBit(bitField, bitMask) do{ bitField = bitField | bitMask; } while(0) +#define ClearBit(bitField, bitMask) do{ bitField = bitField & (~bitMask); } while(0) +#define CheckBit(bitField, bitMask) (bool)(bitField & bitMask) + +// Variables + +volatile ethernetDriver_t ethData; +mac48Address_t macAddress = {MAC_ADDRESS}; +const mac48Address_t broadcastMAC = {BROADCAST_MAC}; +const mac48Address_t *eth_MAC; +static uint16_t nextPacketPointer; +static receiveStatusVector_t rxPacketStatusVector; +sfr_bank_t lastBank; + +// Define a temporary register for passing data to inline assembly +// This is to work around the 110110 LSB errata and to control RDPTR WRPTR update counts + +uint8_t ethListSize; + +static txPacket_t txData[MAX_TX_PACKETS]; + +static txPacket_t *pHead; +static txPacket_t *pTail; + +uint16_t TXPacketSize; + +// Function Prototypes + +const mac48Address_t *MAC_getAddress(void); + +/** + * @ingroup enc28j60 + * @brief Enqueues the latest written packet and starts the transmission of a queued packet. + * @param None. + * @retval PHY_SUCCESS + * @retval PHY_BUFFER_BUSY + */ +phy_error_msg ETH_SendQueued(void); + +/** + * @ingroup enc28j60 + * @brief Copies the queued packets to the TX Buffer start address using the DMA setup. + * @param None. + * @retval PHY_SUCCESS + * @retval PHY_DMA_TIMEOUT + */ +phy_error_msg ETH_Shift_Tx_Packets(void); + +/** + * @ingroup enc28j60 + * @brief Resets the Ethernet packet list. + * @param None. + * @return None. + */ +void ETH_PacketListReset(void); + +/** + * @ingroup enc28j60 + * @brief Allocates a new packet element and links it to the chained list. + * @param None. + * @return Packet address. + */ +txPacket_t *ETH_NewPacket(void); + +/** + * @ingroup enc28j60 + * @brief Deallocates a packet element and unlinks it from the chained list. + * @param pPacket packetHandle + * @return None. + */ +void ETH_RemovePacket(txPacket_t *pPacket); + +/** + * @ingroup enc28j60 + * @brief Calculates the checksum. + * @param len length + * @param seed + * @return Checksum. + */ +static uint16_t ETH_ComputeChecksum(uint16_t len, uint16_t seed); + +/** + * @ingroup enc28j60 + * @brief Reads one byte from Special Function Register (SFR). + * @param a register + * @return One byte of SFR value. + */ +static uint8_t ENC28_Rcr8(enc28j60_registers_t a); + +/** + * @ingroup enc28j60 + * @brief Reads two bytes from SFRs. + * @param a register + * @return Two bytes of SFR value. + */ +static uint16_t ENC28_Rcr16(enc28j60_registers_t a); + +/** + * @ingroup enc28j60 + * @brief Writes one byte to SFRs. + * @param a register + * @param v 8-bit value + * @return None. + */ +static void ENC28_Wcr8(enc28j60_registers_t a, uint8_t v); + +/** + * @ingroup enc28j60 + * @brief Writes two bytes to SFRs. + * @param a register + * @param v 16-bit value + * @return None. + */ +static void ENC28_Wcr16(enc28j60_registers_t a, uint16_t v); + +/** + * @ingroup enc28j60 + * @brief Sets the SFR bit field. + * @param a register + * @param bits + * @return None. + */ +static void ENC28_Bfs(enc28j60_registers_t a, char bits); + +/** + * @ingroup enc28j60 + * @brief Clears the SFR bit field. + * @param a register + * @param bits + * @return None. + */ +static void ENC28_Bfc(enc28j60_registers_t a, char bits); + +/** + * @ingroup enc28j60 + * @brief Reads the Physical Layer (PHY) register. + * @param a register + * @return Register data. + */ +static uint16_t ENC28_PhyRead(enc28j60_phy_registers_t a); + +/** + * @ingroup enc28j60 + * @brief Writes the PHY register. + * @param a register + * @param d data + * @return None. + */ +static void ENC28_PhyWrite(enc28j60_phy_registers_t a, uint16_t d); + +/** + * @ingroup enc28j60 + * @brief Selects the bank. + * @param r register + * @return None. + */ +static void ENC28_BankSel(enc28j60_registers_t r); + +/** + * @ingroup enc28j60 + * @brief Releases the Serial Peripheral Interface (SPI) bus. + * @param None. + * @return None. + */ +static void ETH_CloseSPI(void); + +/** + * @ingroup enc28j60 + * @brief Connects the SPI bus. + * @param None. + * @return None. + */ +static void ETH_OpenSPI(void); + +// Functions + +const mac48Address_t *MAC_getAddress(void) +{ + return &macAddress; +} + +static void ENC28_BankSel(enc28j60_registers_t r) +{ + uint8_t a = r & BANK_MASK; + + if (a != sfr_common && a != lastBank) + { + lastBank = a; + // Clear the bank bits + ETH_NCS_LOW(); + ETH_SPI_WRITE8(bfc_inst | 0x1F); + ETH_SPI_WRITE8(0x03); + ETH_NCS_HIGH(); + NOP(); + NOP(); + // Set the required bits + ETH_NCS_LOW(); + ETH_SPI_WRITE8(bfs_inst | 0x1F); + ETH_SPI_WRITE8(a >> 6); + ETH_NCS_HIGH(); + } +} + +bool ETH_CheckLinkUp(void) +{ + uint16_t phstat2; + phstat2 = ENC28_PhyRead(J60_PHSTAT2); + if (phstat2 & 0x0400) + { + ethData.up = true; + return true; + } + else + return false; +} + +txPacket_t *ETH_NewPacket(void) +{ + uint8_t index = 0; + + if (ethListSize == MAX_TX_PACKETS) + { + return NULL; + } + + while (index < MAX_TX_PACKETS) + { + if (CheckBit(txData[index].flags, ETH_ALLOCATED) == false) + { + txData[index].flags = 0; // Reset all flags + SetBit(txData[index].flags, ETH_ALLOCATED); // Mark the handle as allocated(Allocated = true) + + txData[index].packetEnd = TXEND; + + txData[index].prevPacket = NULL; + txData[index].nextPacket = pHead; + + if (pHead != NULL) + { + pHead->prevPacket = &txData[index]; + txData[index].packetStart = pHead->packetEnd + TX_STATUS_VECTOR_SIZE; + + // Try to keep a 2 byte alignment + if (txData[index].packetStart & 0x0001) + { + // Make sure the end of the packet is odd, so the beginning of the next one is even. + ++txData[index].packetStart; + } + } + else + { + txData[index].packetStart = TXSTART; + pTail = (txPacket_t *)&txData[index]; + } + + pHead = (txPacket_t *)&txData[index]; + + ethListSize++; + return (&txData[index]); + } + index++; + } + return NULL; +} + +void ETH_PacketListReset(void) +{ + uint16_t index = 0; + uint8_t *ptr = (uint8_t *)&txData; + ethListSize = 0; + + pHead = NULL; + pTail = NULL; + + while (index < (MAX_TX_PACKETS * sizeof(txPacket_t))) + { + ptr[index] = 0; + index++; + } +} + +void ETH_RemovePacket(txPacket_t *pPacket) +{ +#ifdef VALIDATE_ALLOCATED_PTR + uint8_t index = 0; +#endif // VALIDATE_ALLOCATED_PTR + + if ((pPacket == NULL) || (ethListSize == 0)) + { + return; + } + +#ifdef VALIDATE_ALLOCATED_PTR + while (index < MAX_TX_PACKETS) + { + if ((pPacket == &txData[index]) && (txData[index].allocated == true)) + { + break; + } + index++; + } + if (index == MAX_TX_PACKETS) + { + return; + } +#endif // VALIDATE_ALLOCATED_PTR + + // Unlink from the chained list + if (pPacket->nextPacket == NULL) + { + pTail = pPacket->prevPacket; + if (pTail != NULL) + { + pTail->nextPacket = NULL; + } + } + + if (pPacket->prevPacket == NULL) + { + pHead = pPacket->nextPacket; + if (pHead != NULL) + { + pHead->prevPacket = NULL; + } + } + + // Deallocate + pPacket->flags = 0; + pPacket->prevPacket = NULL; + pPacket->nextPacket = NULL; + + ethListSize--; + + return; +} + +static void ETH_CloseSPI(void) +{ + SPI0_Close(); +} + +static void ETH_OpenSPI(void) +{ + while (!SPI0_Open(MAC)); +} + +void ETH_Init(void) +{ + ETH_OpenSPI(); + + Control_Byte = 0x00; + // Initialize the driver variables + ethData.error = false; // No error + ethData.up = false; // No link + ethData.linkChange = false; + + ETH_PacketListReset(); + + ethData.saveRDPT = 0; + + lastBank = sfr_bank0; + + DELAY_microseconds(100); + + ETH_SendSystemReset(); // Software reset + DELAY_milliseconds(10); + + // Wait for the OST + while (!(ENC28_Rcr8(J60_ESTAT) & 0x01)); // Wait for CLKRDY to go high + + // Initialize RX tracking variables and other control state flags + nextPacketPointer = RXSTART; + + ENC28_Bfs(J60_ECON2, 0x80); // Enable AUTOINC + + // Set up TX/RX buffer addresses + ENC28_Wcr16(J60_ETXSTL, TXSTART); + ENC28_Wcr16(J60_ETXNDL, TXEND); + ENC28_Wcr16(J60_ERXSTL, RXSTART); + ENC28_Wcr16(J60_ERXNDL, RXEND); + ENC28_Wcr16(J60_ERDPTL, nextPacketPointer); + + ENC28_Wcr16(J60_ERDPTL, RXSTART); + ENC28_Wcr16(J60_EWRPTL, TXSTART); + + // Configure the receive filter + ENC28_Wcr8(J60_ERXFCON, 0b10101001); // UCEN,OR,CRCEN,MPEN,BCEN (unicast,crc,magic packet,broadcast) + + // Get MAC address + eth_MAC = MAC_getAddress(); + + // Initialize the MAC + ENC28_Wcr8(J60_MACON1, 0x0D); // TXPAUS, RXPAUS, MARXEN + ENC28_Wcr8(J60_MACON3, 0x23); // Pad < 60 bytes, Enable CRC, Frame Check, Full Duplex + ENC28_Wcr8(J60_MACON4, 0x40); // DEFER set + ENC28_Wcr16(J60_MAIPGL, 0x0c12); + ENC28_Wcr8(J60_MABBIPG, 0x12); + ENC28_Wcr16(J60_MAMXFLL, MAX_TX_PACKET_SIZE); + ENC28_Wcr8(J60_MAADR1, eth_MAC->mac_array[0]); + NOP(); + ENC28_Wcr8(J60_MAADR2, eth_MAC->mac_array[1]); + NOP(); + ENC28_Wcr8(J60_MAADR3, eth_MAC->mac_array[2]); + NOP(); + ENC28_Wcr8(J60_MAADR4, eth_MAC->mac_array[3]); + NOP(); + ENC28_Wcr8(J60_MAADR5, eth_MAC->mac_array[4]); + NOP(); + ENC28_Wcr8(J60_MAADR6, eth_MAC->mac_array[5]); + NOP(); + + ENC28_Wcr8(J60_ECON1, 0x04); // RXEN enabled + + // Initialize the PHY + ENC28_PhyWrite(J60_PHCON1, 0x0100); // Ful-Duplex mode enabled (PDPXMD - PHY) + ENC28_PhyWrite(J60_PHCON2, 0x0100); // Do not transmit loopback + ENC28_PhyWrite(J60_PHLCON, 0x0472); // LED control - LEDA = Link, LEDB = TX/RX, Stretched LED + // LEDB is grounded so default is Half Duplex + + // Configure the IRQ's + ENC28_Wcr8(J60_EIE, 0xDB); // Enable PKTIE,INTIE,LINKIE,TXIE,TXERIE,RXERIE + ENC28_Wcr16(((enc28j60_registers_t)J60_PHIE), 0x12); // Enable PLNKIE and PGEIE + + // Check for a preexisting link + ETH_CheckLinkUp(); +} + +void ETH_EventHandler(void) +{ + eir_t eir_val; + phstat2_t phstat2_val; + + // MAC is sending an interrupt + eir_val.val = ENC28_Rcr8(J60_EIR); + phstat2_val.val = ENC28_Rcr16((enc28j60_registers_t)J60_PHSTAT2); + + if (eir_val.LINKIF) // Something about the link changed. Update the link parameters. + { + ENC28_Bfc(J60_EIR, 0x01); // CLEAR LINKIF + ethData.linkChange = true; + ethData.up = false; + if (ETH_CheckLinkUp()) + { + } + if (phstat2_val.DPXSTAT) // Update MAC duplex settings to match PHY duplex setting + { + ENC28_Wcr16(J60_MABBIPG, 0x15); // Switching to full duplex + ENC28_Bfs(((enc28j60_registers_t)J60_PHSTAT2), 0x01); + } + else + { + ENC28_Wcr16(J60_MABBIPG, 0x12); // Switching to half duplex + ENC28_Bfc(((enc28j60_registers_t)J60_PHSTAT2), 0x01); + } + } + if (eir_val.TXIF) // Packet sent + { + ENC28_Bfc(J60_EIR, 0x08); // Clear TXIF + ETH_RemovePacket(pTail); + if (ethListSize > 0) + { + if (ENC28_Rcr16(J60_EWRPTL) > TX_BUFFER_MID) + { + // Shift all the queued packets to the start of the TX Buffer + ETH_Shift_Tx_Packets(); + } + + // Send the next queued packet + ETH_SendQueued(); + } + } + if (eir_val.PKTIF || ENC28_Rcr8(J60_EPKTCNT)) // Packet receive buffer has at least 1 unprocessed packet + { + ethData.pktReady = true; + ENC28_Bfc(J60_EIR, 0x04); // Clear PKTIF + } +} + +void ETH_NextPacketUpdate(void) +{ + // Set the RX Read Pointer to the beginning of the next unprocessed packet + // Errata 14 inclusion + if (nextPacketPointer == RXSTART) + ENC28_Wcr16(J60_ERXRDPTL, RXEND); + else + ENC28_Wcr16(J60_ERXRDPTL, nextPacketPointer - 1); + + ENC28_Wcr16(J60_ERDPTL, nextPacketPointer); + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + ((char *)&nextPacketPointer)[0] = ETH_SPI_READ8(); + ((char *)&nextPacketPointer)[1] = ETH_SPI_READ8(); + ((char *)&rxPacketStatusVector)[0] = ETH_SPI_READ8(); + ((char *)&rxPacketStatusVector)[1] = ETH_SPI_READ8(); + ((char *)&rxPacketStatusVector)[2] = ETH_SPI_READ8(); + ((char *)&rxPacketStatusVector)[3] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + rxPacketStatusVector.byteCount -= 4; // Frame checksum can be ignored at the end. + // The checksum is 4 bytes. Payload is byte count less 4. +} + +void ETH_ResetReceiver(void) +{ + uint8_t econ1; + econ1 = ENC28_Rcr8(J60_ECON1); + ENC28_Wcr8(J60_ECON1, (econ1 | 0x40)); +} + +static uint8_t ENC28_Rcr8(enc28j60_registers_t a) +{ + uint8_t v; + + ENC28_BankSel(a); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rcr_inst | (a & SFR_MASK)); + v = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return v; +} + +static uint16_t ENC28_Rcr16(enc28j60_registers_t a) +{ + uint16_t v; + + ENC28_BankSel(a); + a &= SFR_MASK; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rcr_inst | (a)); + ((char *)&v)[0] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + NOP(); + NOP(); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rcr_inst | (a + 1)); + ((char *)&v)[1] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return v; +} + +static void ENC28_Wcr8(enc28j60_registers_t a, uint8_t v) +{ + ENC28_BankSel(a); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wcr_inst | (a & SFR_MASK)); + ETH_SPI_WRITE8(v); + ETH_NCS_HIGH(); +} + +static void ENC28_Wcr16(enc28j60_registers_t a, uint16_t v) +{ + ENC28_BankSel(a); + a &= SFR_MASK; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wcr_inst | (a)); + ETH_SPI_WRITE8(((char *)&v)[0]); + ETH_NCS_HIGH(); + NOP(); + NOP(); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wcr_inst | (a + 1)); + ETH_SPI_WRITE8(((char *)&v)[1]); + ETH_NCS_HIGH(); +} + +static void ENC28_Bfs(enc28j60_registers_t a, char bits) // can only be used for ETH Control Registers +{ + ENC28_BankSel(a); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(bfs_inst | (a & SFR_MASK)); + ETH_SPI_WRITE8(bits); + ETH_NCS_HIGH(); +} + +static void ENC28_Bfc(enc28j60_registers_t a, char bits) +{ + ENC28_BankSel(a); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(bfc_inst | (a & SFR_MASK)); + ETH_SPI_WRITE8(bits); + ETH_NCS_HIGH(); +} + +static void ENC28_PhyWrite(enc28j60_phy_registers_t a, uint16_t d) +{ + uint8_t v = 1; + + ENC28_Wcr8(J60_MIREGADR, a); + ENC28_Wcr16(J60_MIWRL, d); + while (v & 0x01) + { + v = ENC28_Rcr8(J60_MISTAT); + } +} + +static uint16_t ENC28_PhyRead(enc28j60_phy_registers_t a) +{ + ENC28_Wcr8(J60_MIREGADR, a); + ENC28_Bfs(J60_MICMD, 0x01); // Set the read flag + while (ENC28_Rcr8(J60_MISTAT) & 0x01); // Wait for the busy flag to clear + ENC28_Bfc(J60_MICMD, 0x01); // Clear the read flag + + return ENC28_Rcr16(J60_MIRDL); +} + +void ETH_SendSystemReset(void) +{ + ETH_NCS_LOW(); + ETH_SPI_WRITE8(src_inst); + ETH_NCS_HIGH(); +} + +uint8_t ETH_Read8(void) +{ + uint8_t b; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + b = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return b; +} + +uint16_t ETH_Read16(void) +{ + uint16_t b; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + b = (uint16_t)(ETH_SPI_READ8() << 8); + b |= ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return b; +} + +uint32_t ETH_Read24(void) +{ + uint32_t b; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + ((char *)&b)[2] = ETH_SPI_READ8(); + ((char *)&b)[1] = ETH_SPI_READ8(); + ((char *)&b)[0] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return b; +} + +uint32_t ETH_Read32(void) +{ + uint32_t b; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + ((char *)&b)[3] = ETH_SPI_READ8(); + ((char *)&b)[2] = ETH_SPI_READ8(); + ((char *)&b)[1] = ETH_SPI_READ8(); + ((char *)&b)[0] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return b; +} + +uint16_t ETH_ReadBlock(void *buffer, uint16_t length) +{ + uint16_t readCount = length; + char *p = buffer; + + if (rxPacketStatusVector.byteCount < length) + readCount = rxPacketStatusVector.byteCount; + length = readCount; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + while (length--) *p++ = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return readCount; +} + +void ETH_Write8(uint8_t data) +{ + TXPacketSize += 1; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8(data); + ETH_NCS_HIGH(); +} + +void ETH_Write16(uint16_t data) +{ + TXPacketSize += 2; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8((uint8_t)(data >> 8)); + ETH_SPI_WRITE8((uint8_t)(data)); + ETH_NCS_HIGH(); +} + +void ETH_Write24(uint32_t data) +{ + TXPacketSize += 3; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8((uint8_t)(data >> 16)); + ETH_SPI_WRITE8((uint8_t)(data >> 8)); + ETH_SPI_WRITE8((uint8_t)(data)); + ETH_NCS_HIGH(); +} + +void ETH_Write32(uint32_t data) +{ + TXPacketSize += 4; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8((uint8_t)(data >> 24)); + ETH_SPI_WRITE8((uint8_t)(data >> 16)); + ETH_SPI_WRITE8((uint8_t)(data >> 8)); + ETH_SPI_WRITE8((uint8_t)(data)); + ETH_NCS_HIGH(); +} + +uint16_t ETH_WriteString(const char *string) +{ + uint16_t length = 0; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + while (*string) + { + ETH_SPI_WRITE8(*string++); + length++; + } + ETH_NCS_HIGH(); + TXPacketSize += length; + + return length; +} + +uint16_t ETH_WriteBlock(const char *data, uint16_t length) +{ + const char *p = data; + TXPacketSize += length; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + while (length--) + { + ETH_SPI_WRITE8(*p++); + } + ETH_NCS_HIGH(); + + return length; +} + +uint16_t ETH_GetFreeTxBufferSize(void) +{ + return (uint16_t)(TXEND - (ENC28_Rcr16(J60_EWRPTL))); +} + +phy_error_msg ETH_WriteStart(const mac48Address_t *dest_mac, uint16_t type) +{ + txPacket_t *ethPacket = NULL; + + if (ENC28_Rcr16(J60_EWRPTL) > TX_BUFFER_MID) + { + // Shift all the queued packets to the start of the TX Buffer + // Check if TX in progress + if ((ENC28_Rcr8(J60_ECON1) & 0x08)) + { + return PHY_TX_LOGIC_NOT_IDLE; + } + + // Try to move the queued packets + ETH_Shift_Tx_Packets(); + + // Verify if shifted + if (ENC28_Rcr16(J60_EWRPTL) > TX_BUFFER_MID) + { + return PHY_BUFFER_BUSY; + } + } + + // Create new packet and queue it in the TX Buffer + + // Initialize a new packet handler to automatically place in the queue + ethPacket = ETH_NewPacket(); + + if (ethPacket == NULL) + { + // Packets not availabe + return PHY_BUFFER_BUSY; + } + + SetBit(ethPacket->flags, ETH_WRITE_IN_PROGRESS); // writeInProgress = true; + + ENC28_Wcr16(J60_EWRPTL, ethPacket->packetStart); + + ETH_ResetByteCount(); + + TXPacketSize = 0; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8(Control_Byte); + ETH_SPI_WRITE8(dest_mac->mac_array[0]); + ETH_SPI_WRITE8(dest_mac->mac_array[1]); + ETH_SPI_WRITE8(dest_mac->mac_array[2]); + ETH_SPI_WRITE8(dest_mac->mac_array[3]); + ETH_SPI_WRITE8(dest_mac->mac_array[4]); + ETH_SPI_WRITE8(dest_mac->mac_array[5]); + ETH_SPI_WRITE8(eth_MAC->mac_array[0]); + ETH_SPI_WRITE8(eth_MAC->mac_array[1]); + ETH_SPI_WRITE8(eth_MAC->mac_array[2]); + ETH_SPI_WRITE8(eth_MAC->mac_array[3]); + ETH_SPI_WRITE8(eth_MAC->mac_array[4]); + ETH_SPI_WRITE8(eth_MAC->mac_array[5]); + ETH_SPI_WRITE8(type >> 8); + ETH_SPI_WRITE8(type & 0x0FF); + ETH_NCS_HIGH(); + TXPacketSize += 15; + + return PHY_SUCCESS; +} + +phy_error_msg ETH_SendQueued(void) +{ + uint8_t econ1; + + if (pHead->flags & ETH_TX_QUEUED) + { + // Close the latest written packet and enqueue it + ClearBit(pHead->flags, (uint16_t)ETH_TX_QUEUED); // txQueued = false + + // Start transmitting from the tails. The packet first written + ENC28_Wcr16(J60_ETXSTL, pTail->packetStart); + ENC28_Wcr16(J60_ETXNDL, pTail->packetEnd); + + NOP(); + NOP(); + econ1 = ENC28_Rcr8(J60_ECON1); + ENC28_Wcr8(J60_ECON1, (econ1 | 0x08)); // Start sending + + return PHY_SUCCESS; + } + else + { + return PHY_BUFFER_BUSY; + } +} + +phy_error_msg ETH_Send(void) +{ + uint16_t packetEnd = (ENC28_Rcr16(J60_EWRPTL)) - 1; + + ENC28_Wcr16(J60_ETXNDL, TXSTART + TXPacketSize); + if (!ethData.up) + { + return PHY_LINK_NOT_FOUND; + } + + if (ethListSize == 0) + { + return PHY_BUFFER_BUSY; + } + + ClearBit(pHead->flags, (uint16_t)ETH_WRITE_IN_PROGRESS); // writeInProgress = false + pHead->packetEnd = packetEnd; + SetBit(pHead->flags, ETH_TX_QUEUED); // txQueued = true + // The packet is prepared to be sent/queued at this time + + if ((ENC28_Rcr16(J60_ECON1) & 0x08) || (ethListSize > 1)) + { + return PHY_TX_QUEUED; + } + return ETH_SendQueued(); +} + +void ETH_Dump(uint16_t length) +{ + uint16_t newRXTail; + + length = (rxPacketStatusVector.byteCount <= length) ? rxPacketStatusVector.byteCount : length; + if (length) + { + newRXTail = ENC28_Rcr16(J60_ERDPTL); + newRXTail += length; + // Write new RX tail + ENC28_Wcr16(J60_ERDPTL, newRXTail); + rxPacketStatusVector.byteCount -= length; + } +} + +void ETH_Flush(void) +{ + ethData.pktReady = false; + if (nextPacketPointer == RXSTART) + ENC28_Wcr16(J60_ERXRDPTL, RXEND); + else + ENC28_Wcr16(J60_ERXRDPTL, nextPacketPointer - 1); + ENC28_Wcr16(J60_ERDPTL, nextPacketPointer); + // Packet decrement + ENC28_Bfs(J60_ECON2, 0x40); +} + +void ETH_Insert(char *data, uint16_t len, uint16_t offset) +{ + uint16_t current_tx_pointer = 0; + offset += sizeof(Control_Byte); + + current_tx_pointer = ENC28_Rcr16(J60_EWRPTL); + ENC28_Wcr16(J60_EWRPTL, pHead->packetStart + offset); + while (len--) + { + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); // WBM command + ETH_SPI_WRITE8(*data++); + ETH_NCS_HIGH(); + } + ENC28_Wcr16(J60_EWRPTL, current_tx_pointer); +} + +phy_error_msg ETH_Copy(uint16_t len) +{ + uint16_t tx_buffer_address; + uint16_t timer; + uint16_t temp_len; + + timer = 2 * len; + // Waits until module is idle + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0 && --timer) + NOP(); // Waits here until the DMAST bit is clear + + if ((ENC28_Rcr8(J60_ECON1) & 0x20) == 0) + { + tx_buffer_address = ENC28_Rcr16(J60_EWRPTL); // Current TX Write Pointer + + ENC28_Wcr16(J60_EDMADSTL, tx_buffer_address); + ENC28_Wcr16(J60_EDMASTL, ethData.saveRDPT); + + tx_buffer_address += len; + temp_len = ethData.saveRDPT + len; + + if (temp_len > RXEND) + { + temp_len = temp_len - (RXEND) + RXSTART; + ENC28_Wcr16(J60_EDMANDL, temp_len); + } + else + { + ENC28_Wcr16(J60_EDMANDL, temp_len); + } + + // Clear CSUMEN to select a copy operation + ENC28_Bfc(J60_ECON1, 0x10); + // Starts the DMA + ENC28_Bfs(J60_ECON1, 0x20); + timer = 40 * len; + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0 && --timer) + NOP(); // Waits here until the DMAST bit is clear + if ((ENC28_Rcr8(J60_ECON1) & 0x20) == 0) + { + // Clears the source and destination window pointers + ENC28_Wcr16(J60_EWRPTL, tx_buffer_address); + + TXPacketSize += len; // Fixes the packet length + return PHY_SUCCESS; + } + } + RESET(); // Reboots device + return PHY_DMA_TIMEOUT; +} + +phy_error_msg ETH_Shift_Tx_Packets(void) +{ + uint8_t econ1; + uint16_t timer; + uint16_t len = pHead->packetEnd - pTail->packetStart; + + timer = 2 * len; + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0 && --timer) + NOP(); // Waits here until DMA is free + if ((ENC28_Rcr8(J60_ECON1) & 0x20) == 0) // ECON1bits.DMAST==0 + { + ENC28_Wcr16(J60_EDMADSTL, TXSTART); // Setup the destination start pointer + + ENC28_Wcr16(J60_EDMASTL, pTail->packetStart); // Setup the source pointer from the current read pointer + ENC28_Wcr16(J60_EDMANDL, pTail->packetStart); + + econ1 = ENC28_Rcr8(J60_ECON1); + ENC28_Wcr8(J60_ECON1, (econ1 | 0x10)); // Copy mode ECON1bits.CSUMEN = 0 + econ1 = ENC28_Rcr8(J60_ECON1); + ENC28_Wcr8(J60_ECON1, (econ1 | 0x20)); // Starts DMA ECON1bits.DMAST = 1 + + // It might take longer to complete if there is heavy network traffic + timer = 40 * len; + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0 && --timer) + NOP(); // Waits here until DMA is free + if ((ENC28_Rcr8(J60_ECON1) & 0x20) == 0) + { + // Updates the start and end addresses of each packet + txPacket_t *pElem = pHead; + uint16_t shiftOffset = pTail->packetStart; + + while (pElem != NULL) + { + pElem->packetStart = pElem->packetStart - shiftOffset; + pElem->packetEnd = pElem->packetEnd - shiftOffset; + pElem = pElem->nextPacket; + } + + // Updates the EWRPT + ENC28_Wcr16(J60_EWRPTL, TXSTART + len); + return PHY_SUCCESS; + } + } + // DMA is timed out + RESET(); // Reboots device + return PHY_DMA_TIMEOUT; +} + +static uint16_t ETH_ComputeChecksum(uint16_t len, uint16_t seed) +{ + uint32_t cksm; + uint16_t v; + + cksm = seed; + + while (len > 1) + { + v = 0; + ((char *)&v)[1] = ETH_Read8(); + ((char *)&v)[0] = ETH_Read8(); + cksm += v; + len -= 2; + } + + if (len) + { + v = 0; + ((char *)&v)[1] = ETH_Read8(); + ((char *)&v)[0] = 0; + cksm += v; + } + + // Wraps the checksum + while (cksm >> 16) + { + cksm = (cksm & 0x0FFFF) + (cksm >> 16); + } + + // Inverts the number. + cksm = ~cksm; + + // Returns the resulting checksum + return (uint16_t)cksm; +} + +uint16_t ETH_TxComputeChecksum(uint16_t position, uint16_t length, uint16_t seed) +{ + uint32_t cksm; + + // cksm = seed; + position += sizeof(Control_Byte); + + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0); // Waits until the DMAST bit is clear + + ENC28_Wcr16(J60_EDMASTL, (pHead->packetStart + position)); + ENC28_Wcr16(J60_EDMANDL, pHead->packetStart + position + (length - 1)); + + if (!(ENC28_Rcr8(J60_ECON1) & 0x10)) // Verify CSUMEN is not set already + { + // Sets CSUMEN and DMAST to select and start a checksum operation + ENC28_Bfs(J60_ECON1, 0x30); + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0); // Waits until the DMAST bit is clear + ENC28_Bfc(J60_ECON1,0x10); + + cksm = ENC28_Rcr16(J60_EDMACSL); + if (seed) + { + seed = ~(seed); + cksm += seed; + while (cksm >> 16) + { + cksm = (cksm & 0x0FFFF) + (cksm >> 16); + } + } + cksm = htons(cksm); + } + return (uint16_t)cksm; +} + +uint16_t ETH_RxComputeChecksum(uint16_t len, uint16_t seed) +{ + uint16_t rxptr; + uint32_t cksm; + + // Saves the read pointer starting address + rxptr = ENC28_Rcr16(J60_ERDPTL); + + cksm = ETH_ComputeChecksum(len, seed); + + // Restores old read pointer location + ENC28_Wcr16(J60_ERDPTL, rxptr); + + // Returns the resulting checksum + return (uint16_t)(((cksm & 0xFF00) >> 8) | ((cksm & 0x00FF) << 8)); +} + +void ETH_GetMAC(uint8_t *macAddr) +{ + *macAddr++ = ENC28_Rcr8(J60_MAADR1); + *macAddr++ = ENC28_Rcr8(J60_MAADR2); + *macAddr++ = ENC28_Rcr8(J60_MAADR3); + *macAddr++ = ENC28_Rcr8(J60_MAADR4); + *macAddr++ = ENC28_Rcr8(J60_MAADR5); + *macAddr++ = ENC28_Rcr8(J60_MAADR6); +} + +void ETH_SetMAC(uint8_t *macAddr) +{ + ENC28_Wcr8(J60_MAADR1, *macAddr++); + ENC28_Wcr8(J60_MAADR2, *macAddr++); + ENC28_Wcr8(J60_MAADR3, *macAddr++); + ENC28_Wcr8(J60_MAADR4, *macAddr++); + ENC28_Wcr8(J60_MAADR5, *macAddr++); + ENC28_Wcr8(J60_MAADR6, *macAddr++); +} + +void ETH_SaveRDPT(void) +{ + ethData.saveRDPT = ENC28_Rcr16(J60_ERDPTL); +} + +uint16_t ETH_GetReadPtr(void) +{ + return ENC28_Rcr16(J60_ERDPTL); +} + +void ETH_SetReadPtr(uint16_t rdptr) +{ + ENC28_Wcr16(J60_ERDPTL, rdptr); +} + +void ETH_MoveBackReadPtr(uint16_t offset) +{ + uint16_t rdptr; + + rdptr = ENC28_Rcr16(J60_ERDPTL); + ENC28_Wcr16(J60_ERDPTL, rdptr - offset); + ETH_SetRxByteCount(offset); +} + +void ETH_ResetReadPtr(void) +{ + ENC28_Wcr16(J60_ERDPTL, RXSTART); +} + +uint16_t ETH_GetWritePtr(void) +{ + return ENC28_Rcr16(J60_EWRPTL); +} + +uint16_t ETH_GetRxByteCount(void) +{ + return (rxPacketStatusVector.byteCount); +} + +void ETH_SetRxByteCount(uint16_t count) +{ + rxPacketStatusVector.byteCount += count; +} + +void ETH_ResetByteCount(void) +{ + ethData.saveWRPT = ENC28_Rcr16(J60_EWRPTL); +} + +uint16_t ETH_GetByteCount(void) +{ + uint16_t wptr; + wptr = ENC28_Rcr16(J60_EWRPTL); + return (wptr - ethData.saveWRPT); +} + +void ETH_SaveWRPT(void) +{ + ethData.saveWRPT = ENC28_Rcr16(J60_EWRPTL); +} + +uint16_t ETH_ReadSavedWRPT(void) +{ + return ethData.saveWRPT; +} + +uint16_t ETH_GetStatusVectorByteCount(void) +{ + return (rxPacketStatusVector.byteCount); +} + +void ETH_SetStatusVectorByteCount(uint16_t bc) +{ + rxPacketStatusVector.byteCount = bc; +} + +void ETH_TxReset(void) +{ + uint8_t econ1; + econ1 = ENC28_Rcr8(J60_ECON1); + + ENC28_Wcr8(J60_ECON1, (econ1 | 0x80)); + + ETH_ResetByteCount(); + + ENC28_Wcr16(J60_ETXSTL, TXSTART); + ENC28_Wcr16(J60_EWRPTL, TXSTART); + + ETH_PacketListReset(); +} diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/spi/spi0.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/spi/spi0.h new file mode 100644 index 0000000..af1d102 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/spi/spi0.h @@ -0,0 +1,223 @@ +/** + * SPI0 Generated Driver API Header File + * + * @file spi0.h + * + * @defgroup spi0 SPI0 + * + * @brief Contains the API prototypes for the SPI0 driver. + * + * @version SPI0 Driver Version 2.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef SPI0_BASIC_H_INCLUDED +#define SPI0_BASIC_H_INCLUDED + +#include "../system/utils/compiler.h" +#include +#include "spi_interface.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern const struct SPI_INTERFACE SPI0_s; + +/** + * @ingroup spi0 + * @typedef void *spi0_TRANSFER_DONE_CB + * @brief Function pointer to the callback function called when there is an SPI interrupt. The default value is set to NULL which means that no callback function will be used. + */ +typedef void (*spi0_TRANSFER_DONE_CB)(void); + +/** + * @ingroup spi0 + * @typedef struct SPI0_configuration_t + * @brief Hardware configuration that controls SPI mode and baud rate + */ +typedef struct +{ + uint8_t CTRLAvalue; + uint8_t CTRLBvalue; +} SPI0_configuration_t; + +/** + * @ingroup spi0 + * @typedef enum spi0_transfer_type_t + * @brief Specifies whether the SPI transfer is to be uni- or bidirectional. A bidirectional transfer (=SPI_EXCHANGE) causes the received data to overwrite the buffer with the data to transmit. + */ +typedef enum spi0_transfer_type +{ + SPI0_EXCHANGE, ///< SPI transfer is bidirectional + SPI0_READ, ///< SPI transfer reads, writes only 0s + SPI0_WRITE ///< SPI transfer writes, discards read data +} spi0_transfer_type_t; + +/** + * @ingroup spi0 + * @typedef enum spi0_transfer_status_t + * @brief Status of the SPI hardware and SPI bus. + */ +typedef enum spi0_transfer_status +{ + SPI0_FREE, ///< SPI hardware is not open, bus is free. + SPI0_IDLE, ///< SPI hardware has been opened, no transfer ongoing. + SPI0_BUSY, ///< SPI hardware has been opened, transfer ongoing. + SPI0_DONE ///< SPI hardware has been opened, transfer complete. +} spi0_transfer_status_t; + +/** + * @ingroup spi0 + * @typedef enum SPI0_configuration_name_t + * @brief Enumeration of the different configurations supported by the driver for SPI interface. + * + * NOTE: A user may specify a configuration, e.g. CLIENT_A, used when communication over SPI with CLIENT_A, and another configuration, CLIENT_B, + * used when communication with CLIENT_B. The configurations may use different SPI configuration such as polarity or SCK frequency. + */ +typedef enum +{ + MAC, + SPI0_DEFAULT +} SPI0_configuration_name_t; + + /** + * @ingroup spi0 + * @brief Initializes the SPI module. + * @param None. + * @return None. + */ +void SPI0_Initialize(void); + +/** + * @ingroup spi0 + * @brief Enables the SPI module. + * @param None. + * @return None. + */ +void SPI0_Enable(void); + +/** + * @ingroup spi0 + * @brief Disables the SPI module. + * @param None. + * @return None. + */ +void SPI0_Disable(void); + +/** + * @ingroup spi0 + * @brief Sets the index of Configuration to use in the transfer. + * @param uint8_t spiConfigIndex - Configuration index. See SPI0_configuration_name_t for configuration list. + * @retval True - SPI open was successful. + * @retval False - SPI open was not successful. + */ +bool SPI0_Open(uint8_t spiConfigIndex); + +/** + * @ingroup spi0 + * @brief Closes the SPI for communication. + * @param None. + * @return None. + */ +void SPI0_Close(void); + +/** + * @ingroup spi0 + * @brief Exchanges one byte over SPI. Blocks until done. + * @param uint8_t byteData - The byte to transfer. + * @return uint8_t - Received data byte. + */ +uint8_t SPI0_ByteExchange(uint8_t byteData); + +/** + * @ingroup spi0 + * @brief Exchanges a buffer over SPI. Blocks if using polled driver. + * @param[inout] void * bufferData The buffer to transfer. Received data is returned here. + * @param[in] size_t bufferSize The size of buffer to transfer. + * @return None. + */ +void SPI0_BufferExchange(void * bufferData, size_t bufferSize); + +/** + * @ingroup spi0 + * @brief Writes a buffer over SPI. Blocks if using polled driver. + * @param[in] void * bufferData The buffer to transfer. + * @param[in] size_t bufferSize The size of buffer to transfer. + * @return None. + */ +void SPI0_BufferWrite(void * bufferData, size_t bufferSize); + +/** + * @ingroup spi0 + * @brief Reads a buffer over SPI. Blocks if using polled driver. + * @param[out] void * bufferData Received data is written here. + * @param[in] size_t bufferSize The size of buffer to transfer. + * @return None. + */ +void SPI0_BufferRead(void * bufferData, size_t bufferSize); + +/** + * @ingroup spi0 + * @brief Writes a data byte to SPI. + * @param uint8_t byteData The byte to transfer. + * @return None. + */ +void SPI0_ByteWrite(uint8_t byteData); + +/** + * @ingroup spi0 + * @brief Gets the received data byte from SPI. + * @param None. + * @return uint8_t - The received data byte. + */ +uint8_t SPI0_ByteRead(void); + +/** + * @ingroup spi0 + * @brief Checks if SPI CLIENT is selected, i.e. its SS pin has been asserted. + * @param None. + * @retval True - SPI is selected. + * @retval False - SPI is not selected. + */ +bool SPI0_Selected(void); + +/** + * @ingroup spi0 + * @brief Waits until SPI has received a data byte. + * @param None. + * @return None. + */ +void SPI0_WaitDataready(void); + +uint8_t __attribute__((deprecated)) SPI0_ExchangeByte(uint8_t data); +void __attribute__((deprecated)) SPI0_ExchangeBlock(void *block, size_t blockSize); +void __attribute__((deprecated)) SPI0_WriteBlock(void *block, size_t blockSize); +void __attribute__((deprecated)) SPI0_ReadBlock(void *block, size_t blockSize); +void __attribute__((deprecated)) SPI0_WriteByte(uint8_t byte); +uint8_t __attribute__((deprecated)) SPI0_ReadByte(void); + +#ifdef __cplusplus +} +#endif + +#endif /* SPI0_BASIC_H_INCLUDED */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/spi/spi_interface.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/spi/spi_interface.h new file mode 100644 index 0000000..ff64abe --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/spi/spi_interface.h @@ -0,0 +1,86 @@ +/** + SPI Generated Driver API interface File + + @Company + Microchip Technology Inc. + + @File Name + spi_interface.h + + @Summary + This is the generated driver interface file for the SPI driver. + + @Description + This interface file provides APIs for driver for SPI. + The generated drivers are tested against the following: + Compiler : XC8 v2.20 + MPLAB : MPLABX v5.40 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef SPI_INTERFACE_H +#define SPI_INTERFACE_H + +/** + Section: Included Files +*/ +#include +#include +#include + +#ifdef __cplusplus + + extern "C" { + +#endif + +/** + Section: Data Type Definitions +*/ + +/** + SPI Driver function structure. + + @Summary + Structure containing the function pointers of SPI driver. + */ +struct SPI_INTERFACE +{ + void (*Initialize)(void); + void (*Close)(void); + bool (*Open)(uint8_t spiConfigIndex); + void (*BufferExchange)(void *bufferData, size_t bufferSize); + void (*BufferRead)(void *bufferData, size_t bufferSize); + void (*BufferWrite)(void *bufferData, size_t bufferSize); + uint8_t (*ByteExchange)(uint8_t byteData); + uint8_t (*ByteRead)(void); + void (*ByteWrite)(uint8_t byteData); +}; + +#ifdef __cplusplus + + } + +#endif + +#endif //SPI_INTERFACE_H diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/spi/src/spi0.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/spi/src/spi0.c new file mode 100644 index 0000000..e495c3c --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/spi/src/spi0.c @@ -0,0 +1,208 @@ +/** + * SPI0 Generated Driver File + * + * @file spi0.c + * + * @ingroup spi0 + * + * @brief Contains the API Implementations for SPI0 module. + * + * @version SPI0 Driver Version 2.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "../spi0.h" + +typedef struct spi0_descriptor_s +{ + spi0_transfer_status_t status; +} spi0_descriptor_t; + +/** + SPI0_DRIVER_FUNCTION object + + @brief Defines an object for SPI_DRIVER_FUNCTIONS. + */ +const struct SPI_INTERFACE SPI0_s = +{ + .Initialize = SPI0_Initialize, + .Close = SPI0_Close, + .Open = SPI0_Open, + .BufferExchange = SPI0_BufferExchange, + .BufferRead = SPI0_BufferRead, + .BufferWrite = SPI0_BufferWrite, + .ByteExchange = SPI0_ByteExchange, + .ByteRead = SPI0_ByteRead, + .ByteWrite = SPI0_ByteWrite, +}; + +SPI0_configuration_t spi0_configurations[] = +{ + { 0x21, 0x0 }, + { 0x20, 0x0 } +}; + +static spi0_descriptor_t spi0_desc; + +void SPI0_Initialize(void) +{ + //BUFEN disabled; BUFWR disabled; MODE 0; SSD disabled; + SPI0.CTRLB = 0x0; + + //CLK2X disabled; DORD disabled; ENABLE disabled; MASTER enabled; PRESC DIV4; + SPI0.CTRLA = 0x20; + + //DREIE disabled; IE disabled; RXCIE disabled; SSIE disabled; TXCIE disabled; + SPI0.INTCTRL = 0x0; + + spi0_desc.status = SPI0_FREE; + + //BUFOVF disabled; DREIF disabled; RXCIF disabled; SSIF disabled; TXCIF disabled; IF disabled; WRCOL disabled; + SPI0.INTFLAGS = 0x0; +} + +void SPI0_Enable(void) +{ + SPI0.CTRLA |= SPI_ENABLE_bm; +} + +void SPI0_Disable(void) +{ + SPI0.CTRLA &= ~SPI_ENABLE_bm; +} + +bool SPI0_Open(uint8_t spiConfigIndex) +{ + if (spi0_desc.status == SPI0_FREE) { + spi0_desc.status = SPI0_IDLE; + SPI0.CTRLB = spi0_configurations[spiConfigIndex].CTRLBvalue; + SPI0.CTRLA = spi0_configurations[spiConfigIndex].CTRLAvalue; + return true; + } else { + return false; + } +} + +void SPI0_Close(void) +{ + spi0_desc.status = SPI0_FREE; +} + +uint8_t SPI0_ByteExchange(uint8_t data) +{ + SPI0.DATA = data; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)); + return SPI0.DATA; +} + +bool SPI0_Selected(void) +{ +/** + * @brief Returns true if SS pin is selected. + * TODO: Place your code here + */ +return true; +} + +void SPI0_WaitDataready(void) +{ + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) + ; +} + +void SPI0_BufferExchange(void *block, size_t size) +{ + uint8_t *b = (uint8_t *)block; + while (size--) { + SPI0.DATA = *b; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) + ; + *b = SPI0.DATA; + b++; + } +} + +void SPI0_BufferWrite(void *block, size_t size) +{ + uint8_t *b = (uint8_t *)block; + uint8_t rdata; + while (size--) { + SPI0.DATA = *b; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) + ; + rdata = SPI0.DATA; + (void)(rdata); // Silence compiler warning + b++; + } +} + +void SPI0_BufferRead(void *block, size_t size) +{ + uint8_t *b = (uint8_t *)block; + while (size--) { + SPI0.DATA = 0; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) + ; + *b = SPI0.DATA; + b++; + } +} + +void SPI0_ByteWrite(uint8_t data) +{ + SPI0.DATA = data; +} + +uint8_t SPI0_ByteRead(void) +{ + return SPI0.DATA; +} + +uint8_t SPI0_ExchangeByte(uint8_t data) +{ + return SPI0_ByteExchange(data); +} + +void SPI0_ExchangeBlock(void *block, size_t blockSize) +{ + SPI0_BufferExchange(block, blockSize); +} + +void SPI0_WriteBlock(void *block, size_t blockSize) +{ + SPI0_BufferWrite(block, blockSize); +} + +void SPI0_ReadBlock(void *block, size_t blockSize) +{ + SPI0_BufferRead(block, blockSize); +} + +void SPI0_WriteByte(uint8_t byte) +{ + SPI0_ByteWrite(byte); +} + +uint8_t SPI0_ReadByte(void) +{ + return SPI0_ByteRead(); +} diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/ccp.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/ccp.h new file mode 100644 index 0000000..9045036 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/ccp.h @@ -0,0 +1,72 @@ +/** + * CCP Header File + * + * @file ccp.h + * + * @ingroup config_bitsdriver + * + * @brief This file contains the Configuration Change Protection (CCP) header file for the Configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef CPU_CCP_H +#define CPU_CCP_H + +#include "../system/utils/compiler.h" +#include "../system/protected_io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Writes to a CCP-protected 8-bit I/O register. + * @param addr Address of the I/O register. + * @param value Value to be written. + * NOTE: Using IAR Embedded workbench, the choice of memory model has an impact on calling convention. + * Memory model must be defined in the Assembler preprocessor directives to be visible to the preprocessor. + */ +static inline void ccp_write_io(void *addr, uint8_t value) +{ + protected_write_io(addr, CCP_IOREG_gc, value); +} + +/** + * @brief Writes to a CCP-protected 8-bit SPM register. + * @param addr Address of the SPM register. + * @param value Value to be written. + * NOTE: Using IAR Embedded workbench, the choice of memory model has an impacton calling convention. + * Memory model must be defined in the Assembler preprocessor directives to be visible to the preprocessor. + */ +static inline void ccp_write_spm(void *addr, uint8_t value) +{ + protected_write_io(addr, CCP_SPM_gc, value); +} + +#ifdef __cplusplus +} +#endif + +#endif /* CPU_CCP_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/clock.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/clock.h new file mode 100644 index 0000000..a970d5b --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/clock.h @@ -0,0 +1,69 @@ +/** + * CLKCTRL Generated Driver API Header File + * + * @file clkctrl.h + * + * @defgroup clkctrl CLKCTRL + * + * @brief This header file provides APIs for the CLKCTRL driver. + * + * @version CLKCTRL Driver Version 1.0.2 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef CLOCK_H +#define CLOCK_H + +#ifndef F_CPU +#define F_CPU 4000000UL +#endif + +#include "ccp.h" + +#define CLKCTRL_TIMEBASE_VALUE ((uint8_t)ceil(F_CPU * 0.000001)) + +/** + * @ingroup clkctrl + * @brief Initialize CLKCTRL module + * @param none + * @return none + */ +void CLOCK_Initialize(void); + +/** + * @ingroup clkctrl + * @brief Enable Clock Failure Detection on main clock + * @param CLKCTRL_CFDSRC_t cfd_source - main clock source for CFD + * @return none + */ +void CFD_Enable(CLKCTRL_CFDSRC_t cfd_source); + +/** + * @ingroup clkctrl + * @brief Disable Clock Failure Detection on main clock + * @param none + * @return none + */ +void CFD_Disable(); + +#endif // CLOCK_H \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/config_bits.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/config_bits.h new file mode 100644 index 0000000..cd14867 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/config_bits.h @@ -0,0 +1,42 @@ +/** + * CONFIGURATION BITS Generated Driver Header File + * + * @file config_bits.h + * + * @defgroup config_bitsdriver Configuration Bits Driver + * + * @brief This file contains the generated header file for the Configuration bits driver. + * + * @version Driver Version 1.0.4 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef CONFIG_BITS_H +#define CONFIG_BITS_H + +#include "../system/clock.h" + +#endif //CONFIG_BITS_H +/** + End of File +*/ \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/interrupt.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/interrupt.h new file mode 100644 index 0000000..2dc2f85 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/interrupt.h @@ -0,0 +1,57 @@ +/** + * Interrupt Manager Generated Driver API Header File. + * + * @file interrupt.h + * + * @defgroup interrupt INTERRUPT + * + * @brief This file contains the API prototype for the Interrupt Manager. + * + * @version Interrupt Manager Driver Version 1.0.0 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef INTERRUPT_H +#define INTERRUPT_H + +#include "../system/utils/compiler.h" +#include "ccp.h" +#include "../system/utils/atomic.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup interrupt + * @brief Initializes the Interrupt module. + * @retval 0 - Initialization is successful. + */ +int8_t CPUINT_Initialize(); + +#ifdef __cplusplus +} +#endif + +#endif /* INTERRUPT_H */ \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/pins.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/pins.h new file mode 100644 index 0000000..e919da2 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/pins.h @@ -0,0 +1,288 @@ +/** + * Generated Pins header File + * + * @file pins.h + * + * @defgroup pinsdriver Pins Driver + * + * @brief This is generated driver header for pins. + * This header file provides APIs for all pins selected in the GUI. + * + * @version Driver Version 1.1.0 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef PINS_H_INCLUDED +#define PINS_H_INCLUDED + +#include +#include "./port.h" + +//get/set ETH_CS aliases +#define ETH_CS_SetHigh() do { PORTA_OUTSET = 0x80; } while(0) +#define ETH_CS_SetLow() do { PORTA_OUTCLR = 0x80; } while(0) +#define ETH_CS_Toggle() do { PORTA_OUTTGL = 0x80; } while(0) +#define ETH_CS_GetValue() (VPORTA.IN & (0x1 << 7)) +#define ETH_CS_SetDigitalInput() do { PORTA_DIRCLR = 0x80; } while(0) +#define ETH_CS_SetDigitalOutput() do { PORTA_DIRSET = 0x80; } while(0) +#define ETH_CS_SetPullUp() do { PORTA_PIN7CTRL |= PORT_PULLUPEN_bm; } while(0) +#define ETH_CS_ResetPullUp() do { PORTA_PIN7CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define ETH_CS_SetInverted() do { PORTA_PIN7CTRL |= PORT_INVEN_bm; } while(0) +#define ETH_CS_ResetInverted() do { PORTA_PIN7CTRL &= ~PORT_INVEN_bm; } while(0) +#define ETH_CS_DisableInterruptOnChange() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define ETH_CS_EnableInterruptForBothEdges() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define ETH_CS_EnableInterruptForRisingEdge() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define ETH_CS_EnableInterruptForFallingEdge() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define ETH_CS_DisableDigitalInputBuffer() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define ETH_CS_EnableInterruptForLowLevelSensing() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PA7_SetInterruptHandler ETH_CS_SetInterruptHandler + +//get/set IO_PA5 aliases +#define IO_PA5_SetHigh() do { PORTA_OUTSET = 0x20; } while(0) +#define IO_PA5_SetLow() do { PORTA_OUTCLR = 0x20; } while(0) +#define IO_PA5_Toggle() do { PORTA_OUTTGL = 0x20; } while(0) +#define IO_PA5_GetValue() (VPORTA.IN & (0x1 << 5)) +#define IO_PA5_SetDigitalInput() do { PORTA_DIRCLR = 0x20; } while(0) +#define IO_PA5_SetDigitalOutput() do { PORTA_DIRSET = 0x20; } while(0) +#define IO_PA5_SetPullUp() do { PORTA_PIN5CTRL |= PORT_PULLUPEN_bm; } while(0) +#define IO_PA5_ResetPullUp() do { PORTA_PIN5CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define IO_PA5_SetInverted() do { PORTA_PIN5CTRL |= PORT_INVEN_bm; } while(0) +#define IO_PA5_ResetInverted() do { PORTA_PIN5CTRL &= ~PORT_INVEN_bm; } while(0) +#define IO_PA5_DisableInterruptOnChange() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define IO_PA5_EnableInterruptForBothEdges() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define IO_PA5_EnableInterruptForRisingEdge() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define IO_PA5_EnableInterruptForFallingEdge() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define IO_PA5_DisableDigitalInputBuffer() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define IO_PA5_EnableInterruptForLowLevelSensing() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PA5_SetInterruptHandler IO_PA5_SetInterruptHandler + +//get/set IO_PA4 aliases +#define IO_PA4_SetHigh() do { PORTA_OUTSET = 0x10; } while(0) +#define IO_PA4_SetLow() do { PORTA_OUTCLR = 0x10; } while(0) +#define IO_PA4_Toggle() do { PORTA_OUTTGL = 0x10; } while(0) +#define IO_PA4_GetValue() (VPORTA.IN & (0x1 << 4)) +#define IO_PA4_SetDigitalInput() do { PORTA_DIRCLR = 0x10; } while(0) +#define IO_PA4_SetDigitalOutput() do { PORTA_DIRSET = 0x10; } while(0) +#define IO_PA4_SetPullUp() do { PORTA_PIN4CTRL |= PORT_PULLUPEN_bm; } while(0) +#define IO_PA4_ResetPullUp() do { PORTA_PIN4CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define IO_PA4_SetInverted() do { PORTA_PIN4CTRL |= PORT_INVEN_bm; } while(0) +#define IO_PA4_ResetInverted() do { PORTA_PIN4CTRL &= ~PORT_INVEN_bm; } while(0) +#define IO_PA4_DisableInterruptOnChange() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define IO_PA4_EnableInterruptForBothEdges() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define IO_PA4_EnableInterruptForRisingEdge() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define IO_PA4_EnableInterruptForFallingEdge() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define IO_PA4_DisableDigitalInputBuffer() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define IO_PA4_EnableInterruptForLowLevelSensing() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PA4_SetInterruptHandler IO_PA4_SetInterruptHandler + +//get/set IO_PA6 aliases +#define IO_PA6_SetHigh() do { PORTA_OUTSET = 0x40; } while(0) +#define IO_PA6_SetLow() do { PORTA_OUTCLR = 0x40; } while(0) +#define IO_PA6_Toggle() do { PORTA_OUTTGL = 0x40; } while(0) +#define IO_PA6_GetValue() (VPORTA.IN & (0x1 << 6)) +#define IO_PA6_SetDigitalInput() do { PORTA_DIRCLR = 0x40; } while(0) +#define IO_PA6_SetDigitalOutput() do { PORTA_DIRSET = 0x40; } while(0) +#define IO_PA6_SetPullUp() do { PORTA_PIN6CTRL |= PORT_PULLUPEN_bm; } while(0) +#define IO_PA6_ResetPullUp() do { PORTA_PIN6CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define IO_PA6_SetInverted() do { PORTA_PIN6CTRL |= PORT_INVEN_bm; } while(0) +#define IO_PA6_ResetInverted() do { PORTA_PIN6CTRL &= ~PORT_INVEN_bm; } while(0) +#define IO_PA6_DisableInterruptOnChange() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define IO_PA6_EnableInterruptForBothEdges() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define IO_PA6_EnableInterruptForRisingEdge() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define IO_PA6_EnableInterruptForFallingEdge() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define IO_PA6_DisableDigitalInputBuffer() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define IO_PA6_EnableInterruptForLowLevelSensing() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PA6_SetInterruptHandler IO_PA6_SetInterruptHandler + +//get/set SW0 aliases +#define SW0_SetHigh() do { PORTF_OUTSET = 0x40; } while(0) +#define SW0_SetLow() do { PORTF_OUTCLR = 0x40; } while(0) +#define SW0_Toggle() do { PORTF_OUTTGL = 0x40; } while(0) +#define SW0_GetValue() (VPORTF.IN & (0x1 << 6)) +#define SW0_SetDigitalInput() do { PORTF_DIRCLR = 0x40; } while(0) +#define SW0_SetDigitalOutput() do { PORTF_DIRSET = 0x40; } while(0) +#define SW0_SetPullUp() do { PORTF_PIN6CTRL |= PORT_PULLUPEN_bm; } while(0) +#define SW0_ResetPullUp() do { PORTF_PIN6CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define SW0_SetInverted() do { PORTF_PIN6CTRL |= PORT_INVEN_bm; } while(0) +#define SW0_ResetInverted() do { PORTF_PIN6CTRL &= ~PORT_INVEN_bm; } while(0) +#define SW0_DisableInterruptOnChange() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define SW0_EnableInterruptForBothEdges() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define SW0_EnableInterruptForRisingEdge() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define SW0_EnableInterruptForFallingEdge() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define SW0_DisableDigitalInputBuffer() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define SW0_EnableInterruptForLowLevelSensing() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PF6_SetInterruptHandler SW0_SetInterruptHandler + +//get/set LED0 aliases +#define LED0_SetHigh() do { PORTF_OUTSET = 0x20; } while(0) +#define LED0_SetLow() do { PORTF_OUTCLR = 0x20; } while(0) +#define LED0_Toggle() do { PORTF_OUTTGL = 0x20; } while(0) +#define LED0_GetValue() (VPORTF.IN & (0x1 << 5)) +#define LED0_SetDigitalInput() do { PORTF_DIRCLR = 0x20; } while(0) +#define LED0_SetDigitalOutput() do { PORTF_DIRSET = 0x20; } while(0) +#define LED0_SetPullUp() do { PORTF_PIN5CTRL |= PORT_PULLUPEN_bm; } while(0) +#define LED0_ResetPullUp() do { PORTF_PIN5CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define LED0_SetInverted() do { PORTF_PIN5CTRL |= PORT_INVEN_bm; } while(0) +#define LED0_ResetInverted() do { PORTF_PIN5CTRL &= ~PORT_INVEN_bm; } while(0) +#define LED0_DisableInterruptOnChange() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define LED0_EnableInterruptForBothEdges() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define LED0_EnableInterruptForRisingEdge() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define LED0_EnableInterruptForFallingEdge() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define LED0_DisableDigitalInputBuffer() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define LED0_EnableInterruptForLowLevelSensing() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PF5_SetInterruptHandler LED0_SetInterruptHandler + +/** + * @ingroup pinsdriver + * @brief GPIO and peripheral I/O initialization + * @param none + * @return none + */ +void PIN_MANAGER_Initialize(); + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for ETH_CS pin. + * This is a predefined interrupt handler to be used together with the ETH_CS_SetInterruptHandler() method. + * This handler is called every time the ETH_CS ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void ETH_CS_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for ETH_CS pin input-sense-config functionality. + * Allows selecting an interrupt handler for ETH_CS at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void ETH_CS_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for IO_PA5 pin. + * This is a predefined interrupt handler to be used together with the IO_PA5_SetInterruptHandler() method. + * This handler is called every time the IO_PA5 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void IO_PA5_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for IO_PA5 pin input-sense-config functionality. + * Allows selecting an interrupt handler for IO_PA5 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void IO_PA5_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for IO_PA4 pin. + * This is a predefined interrupt handler to be used together with the IO_PA4_SetInterruptHandler() method. + * This handler is called every time the IO_PA4 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void IO_PA4_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for IO_PA4 pin input-sense-config functionality. + * Allows selecting an interrupt handler for IO_PA4 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void IO_PA4_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for IO_PA6 pin. + * This is a predefined interrupt handler to be used together with the IO_PA6_SetInterruptHandler() method. + * This handler is called every time the IO_PA6 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void IO_PA6_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for IO_PA6 pin input-sense-config functionality. + * Allows selecting an interrupt handler for IO_PA6 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void IO_PA6_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for SW0 pin. + * This is a predefined interrupt handler to be used together with the SW0_SetInterruptHandler() method. + * This handler is called every time the SW0 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void SW0_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for SW0 pin input-sense-config functionality. + * Allows selecting an interrupt handler for SW0 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void SW0_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for LED0 pin. + * This is a predefined interrupt handler to be used together with the LED0_SetInterruptHandler() method. + * This handler is called every time the LED0 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void LED0_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for LED0 pin input-sense-config functionality. + * Allows selecting an interrupt handler for LED0 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void LED0_SetInterruptHandler(void (* interruptHandler)(void)) ; +#endif /* PINS_H_INCLUDED */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/port.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/port.h new file mode 100644 index 0000000..7525afb --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/port.h @@ -0,0 +1,902 @@ +/** + * Generated Ports header File + * + * @file port.h + * + * @ingroup pinsdriver + * + * @brief This Source file provides APIs. + * + * @version Driver Version 1.0.1 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef PORT_INCLUDED +#define PORT_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +#include "utils/compiler.h" + +/* @ingroup pinsdriver + * @enum port_pull_mode + * Defines the pullup modes. + */ +enum port_pull_mode { + PORT_PULL_OFF, + PORT_PULL_UP, +}; + +/* @ingroup pinsdriver + * @enum port_dir + * Defines the port directions. + */ +enum port_dir { + PORT_DIR_IN, + PORT_DIR_OUT, + PORT_DIR_OFF, +}; + +/** + * @ingroup pinsdriver + * @brief Set port pin pull mode, Configure pin to pull up, down or disable pull mode, supported pull modes are defined by device used. + * @param pin The pin number within port + * @param pull_mode Pin pull mode + * @return none + */ +static inline void PORTA_set_pin_pull_mode(const uint8_t pin, const enum port_pull_mode pull_mode) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTA + 0x10 + pin); + + if (pull_mode == PORT_PULL_UP) { + *port_pin_ctrl |= PORT_PULLUPEN_bm; + } else if (pull_mode == PORT_PULL_OFF) { + *port_pin_ctrl &= ~PORT_PULLUPEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin inverted mode, Configure pin invert I/O or not. + * @param pin The pin number within port + * @param inverted Pin inverted mode + * @return none + */ +static inline void PORTA_pin_set_inverted(const uint8_t pin, const bool inverted) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTA + 0x10 + pin); + + if (inverted) { + *port_pin_ctrl |= PORT_INVEN_bm; + } else { + *port_pin_ctrl &= ~PORT_INVEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin input/sense configuration, Enable/disable digital input buffer and pin change interrupt, + * select pin interrupt edge/level sensing mode + * @param The pin number within port + * @param isc PORT_ISC_t + * @return none + */ +static inline void PORTA_pin_set_isc(const uint8_t pin, const PORT_ISC_t isc) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTA + 0x10 + pin); + + *port_pin_ctrl = (*port_pin_ctrl & ~PORT_ISC_gm) | isc; +} + +/** + * @ingroup pinsdriver + * @brief Set port data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param mask Bit mask where 1 means apply direction setting to the + * corresponding pin + * @param dir port_dir + * @return none + */ +static inline void PORTA_set_port_dir(const uint8_t mask, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTA.DIR &= ~mask; + break; + case PORT_DIR_OUT: + VPORTA.DIR |= mask; + break; + case PORT_DIR_OFF: + /*/ should activate the pullup for power saving + but a bit costly to do it here */ + { + for (uint8_t i = 0; i < 8; i++) { + if (mask & 1 << i) { + *((uint8_t *)&PORTA + 0x10 + i) |= 1 << PORT_PULLUPEN_bp; + } + } + } + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param pin The pin number within port + * @param dir port_dir + * @return none + */ +static inline void PORTA_set_pin_dir(const uint8_t pin, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTA.DIR &= ~(1 << pin); + break; + case PORT_DIR_OUT: + VPORTA.DIR |= (1 << pin); + break; + case PORT_DIR_OFF: + *((uint8_t *)&PORTA + 0x10 + pin) |= 1 << PORT_PULLUPEN_bp; + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on the pins defined by the bit mask. + * + * @param mask Bit mask where 1 means apply port level to the corresponding + * pin + * @param level -boolean value that defines the logic state of the pin level + * false = Pin levels set to "low" state + * @return none + */ +static inline void PORTA_set_port_level(const uint8_t mask, const bool level) +{ + if (level == true) { + VPORTA.OUT |= mask; + } else { + VPORTA.OUT &= ~mask; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on a pin. + * + * @param pin The pin number within port + * @param level -boolean value that defines the logic state of the pin level + * @return none + */ +static inline void PORTA_set_pin_level(const uint8_t pin, const bool level) +{ + if (level == true) { + VPORTA.OUT |= (1 << pin); + } else { + VPORTA.OUT &= ~(1 << pin); + } +} + +/** + * @ingroup pinsdriver + * @brief Toggle out level on pins, Toggle the pin levels on pins defined by bit mask. + * + * @param mask Bit mask where 1 means toggle pin level to the corresponding + * pin + * @return none + */ +static inline void PORTA_toggle_port_level(const uint8_t mask) +{ + PORTA.OUTTGL = mask; +} + +/** + * @ingroup pinsdriver + * @brief Toggle output level on pin, Toggle the pin levels on pins defined by bit mask. + * + * @param pin The pin number within port + * @return none + */ +static inline void PORTA_toggle_pin_level(const uint8_t pin) +{ + PORTA.OUTTGL = 1 << pin; +} + +/** + * @ingroup pinsdriver + * @brief Get input level on pins, Read the input level on pins connected to a port. + * + * @param none + * @return none + */ +static inline uint8_t PORTA_get_port_level() +{ + return VPORTA.IN; +} + +/** + * @ingroup pinsdriver + * @brief Get level on pin, Reads the level on pins connected to a port. + * + * @param pin The pin number within port + * @return none + */ +static inline bool PORTA_get_pin_level(const uint8_t pin) +{ + return VPORTA.IN & (1 << pin); +} + +/** + * @ingroup pinsdriver + * @brief Write value to Port, Write directly to the port OUT register. + * + * @param value Value to write to the port register + * @return none + */ +static inline void PORTA_write_port(const uint8_t value) +{ + VPORTA.OUT = value; +} + +/** + * @ingroup pinsdriver + * @brief Set port pin pull mode, Configure pin to pull up, down or disable pull mode, supported pull modes are defined by device used. + * @param pin The pin number within port + * @param pull_mode Pin pull mode + * @return none + */ +static inline void PORTC_set_pin_pull_mode(const uint8_t pin, const enum port_pull_mode pull_mode) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTC + 0x10 + pin); + + if (pull_mode == PORT_PULL_UP) { + *port_pin_ctrl |= PORT_PULLUPEN_bm; + } else if (pull_mode == PORT_PULL_OFF) { + *port_pin_ctrl &= ~PORT_PULLUPEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin inverted mode, Configure pin invert I/O or not. + * @param pin The pin number within port + * @param inverted Pin inverted mode + * @return none + */ +static inline void PORTC_pin_set_inverted(const uint8_t pin, const bool inverted) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTC + 0x10 + pin); + + if (inverted) { + *port_pin_ctrl |= PORT_INVEN_bm; + } else { + *port_pin_ctrl &= ~PORT_INVEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin input/sense configuration, Enable/disable digital input buffer and pin change interrupt, + * select pin interrupt edge/level sensing mode + * @param The pin number within port + * @param isc PORT_ISC_t + * @return none + */ +static inline void PORTC_pin_set_isc(const uint8_t pin, const PORT_ISC_t isc) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTC + 0x10 + pin); + + *port_pin_ctrl = (*port_pin_ctrl & ~PORT_ISC_gm) | isc; +} + +/** + * @ingroup pinsdriver + * @brief Set port data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param mask Bit mask where 1 means apply direction setting to the + * corresponding pin + * @param dir port_dir + * @return none + */ +static inline void PORTC_set_port_dir(const uint8_t mask, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTC.DIR &= ~mask; + break; + case PORT_DIR_OUT: + VPORTC.DIR |= mask; + break; + case PORT_DIR_OFF: + /*/ should activate the pullup for power saving + but a bit costly to do it here */ + { + for (uint8_t i = 0; i < 8; i++) { + if (mask & 1 << i) { + *((uint8_t *)&PORTC + 0x10 + i) |= 1 << PORT_PULLUPEN_bp; + } + } + } + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param pin The pin number within port + * @param dir port_dir + * @return none + */ +static inline void PORTC_set_pin_dir(const uint8_t pin, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTC.DIR &= ~(1 << pin); + break; + case PORT_DIR_OUT: + VPORTC.DIR |= (1 << pin); + break; + case PORT_DIR_OFF: + *((uint8_t *)&PORTC + 0x10 + pin) |= 1 << PORT_PULLUPEN_bp; + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on the pins defined by the bit mask. + * + * @param mask Bit mask where 1 means apply port level to the corresponding + * pin + * @param level -boolean value that defines the logic state of the pin level + * false = Pin levels set to "low" state + * @return none + */ +static inline void PORTC_set_port_level(const uint8_t mask, const bool level) +{ + if (level == true) { + VPORTC.OUT |= mask; + } else { + VPORTC.OUT &= ~mask; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on a pin. + * + * @param pin The pin number within port + * @param level -boolean value that defines the logic state of the pin level + * @return none + */ +static inline void PORTC_set_pin_level(const uint8_t pin, const bool level) +{ + if (level == true) { + VPORTC.OUT |= (1 << pin); + } else { + VPORTC.OUT &= ~(1 << pin); + } +} + +/** + * @ingroup pinsdriver + * @brief Toggle out level on pins, Toggle the pin levels on pins defined by bit mask. + * + * @param mask Bit mask where 1 means toggle pin level to the corresponding + * pin + * @return none + */ +static inline void PORTC_toggle_port_level(const uint8_t mask) +{ + PORTC.OUTTGL = mask; +} + +/** + * @ingroup pinsdriver + * @brief Toggle output level on pin, Toggle the pin levels on pins defined by bit mask. + * + * @param pin The pin number within port + * @return none + */ +static inline void PORTC_toggle_pin_level(const uint8_t pin) +{ + PORTC.OUTTGL = 1 << pin; +} + +/** + * @ingroup pinsdriver + * @brief Get input level on pins, Read the input level on pins connected to a port. + * + * @param none + * @return none + */ +static inline uint8_t PORTC_get_port_level() +{ + return VPORTC.IN; +} + +/** + * @ingroup pinsdriver + * @brief Get level on pin, Reads the level on pins connected to a port. + * + * @param pin The pin number within port + * @return none + */ +static inline bool PORTC_get_pin_level(const uint8_t pin) +{ + return VPORTC.IN & (1 << pin); +} + +/** + * @ingroup pinsdriver + * @brief Write value to Port, Write directly to the port OUT register. + * + * @param value Value to write to the port register + * @return none + */ +static inline void PORTC_write_port(const uint8_t value) +{ + VPORTC.OUT = value; +} + +/** + * @ingroup pinsdriver + * @brief Set port pin pull mode, Configure pin to pull up, down or disable pull mode, supported pull modes are defined by device used. + * @param pin The pin number within port + * @param pull_mode Pin pull mode + * @return none + */ +static inline void PORTD_set_pin_pull_mode(const uint8_t pin, const enum port_pull_mode pull_mode) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTD + 0x10 + pin); + + if (pull_mode == PORT_PULL_UP) { + *port_pin_ctrl |= PORT_PULLUPEN_bm; + } else if (pull_mode == PORT_PULL_OFF) { + *port_pin_ctrl &= ~PORT_PULLUPEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin inverted mode, Configure pin invert I/O or not. + * @param pin The pin number within port + * @param inverted Pin inverted mode + * @return none + */ +static inline void PORTD_pin_set_inverted(const uint8_t pin, const bool inverted) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTD + 0x10 + pin); + + if (inverted) { + *port_pin_ctrl |= PORT_INVEN_bm; + } else { + *port_pin_ctrl &= ~PORT_INVEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin input/sense configuration, Enable/disable digital input buffer and pin change interrupt, + * select pin interrupt edge/level sensing mode + * @param The pin number within port + * @param isc PORT_ISC_t + * @return none + */ +static inline void PORTD_pin_set_isc(const uint8_t pin, const PORT_ISC_t isc) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTD + 0x10 + pin); + + *port_pin_ctrl = (*port_pin_ctrl & ~PORT_ISC_gm) | isc; +} + +/** + * @ingroup pinsdriver + * @brief Set port data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param mask Bit mask where 1 means apply direction setting to the + * corresponding pin + * @param dir port_dir + * @return none + */ +static inline void PORTD_set_port_dir(const uint8_t mask, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTD.DIR &= ~mask; + break; + case PORT_DIR_OUT: + VPORTD.DIR |= mask; + break; + case PORT_DIR_OFF: + /*/ should activate the pullup for power saving + but a bit costly to do it here */ + { + for (uint8_t i = 0; i < 8; i++) { + if (mask & 1 << i) { + *((uint8_t *)&PORTD + 0x10 + i) |= 1 << PORT_PULLUPEN_bp; + } + } + } + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param pin The pin number within port + * @param dir port_dir + * @return none + */ +static inline void PORTD_set_pin_dir(const uint8_t pin, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTD.DIR &= ~(1 << pin); + break; + case PORT_DIR_OUT: + VPORTD.DIR |= (1 << pin); + break; + case PORT_DIR_OFF: + *((uint8_t *)&PORTD + 0x10 + pin) |= 1 << PORT_PULLUPEN_bp; + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on the pins defined by the bit mask. + * + * @param mask Bit mask where 1 means apply port level to the corresponding + * pin + * @param level -boolean value that defines the logic state of the pin level + * false = Pin levels set to "low" state + * @return none + */ +static inline void PORTD_set_port_level(const uint8_t mask, const bool level) +{ + if (level == true) { + VPORTD.OUT |= mask; + } else { + VPORTD.OUT &= ~mask; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on a pin. + * + * @param pin The pin number within port + * @param level -boolean value that defines the logic state of the pin level + * @return none + */ +static inline void PORTD_set_pin_level(const uint8_t pin, const bool level) +{ + if (level == true) { + VPORTD.OUT |= (1 << pin); + } else { + VPORTD.OUT &= ~(1 << pin); + } +} + +/** + * @ingroup pinsdriver + * @brief Toggle out level on pins, Toggle the pin levels on pins defined by bit mask. + * + * @param mask Bit mask where 1 means toggle pin level to the corresponding + * pin + * @return none + */ +static inline void PORTD_toggle_port_level(const uint8_t mask) +{ + PORTD.OUTTGL = mask; +} + +/** + * @ingroup pinsdriver + * @brief Toggle output level on pin, Toggle the pin levels on pins defined by bit mask. + * + * @param pin The pin number within port + * @return none + */ +static inline void PORTD_toggle_pin_level(const uint8_t pin) +{ + PORTD.OUTTGL = 1 << pin; +} + +/** + * @ingroup pinsdriver + * @brief Get input level on pins, Read the input level on pins connected to a port. + * + * @param none + * @return none + */ +static inline uint8_t PORTD_get_port_level() +{ + return VPORTD.IN; +} + +/** + * @ingroup pinsdriver + * @brief Get level on pin, Reads the level on pins connected to a port. + * + * @param pin The pin number within port + * @return none + */ +static inline bool PORTD_get_pin_level(const uint8_t pin) +{ + return VPORTD.IN & (1 << pin); +} + +/** + * @ingroup pinsdriver + * @brief Write value to Port, Write directly to the port OUT register. + * + * @param value Value to write to the port register + * @return none + */ +static inline void PORTD_write_port(const uint8_t value) +{ + VPORTD.OUT = value; +} + +/** + * @ingroup pinsdriver + * @brief Set port pin pull mode, Configure pin to pull up, down or disable pull mode, supported pull modes are defined by device used. + * @param pin The pin number within port + * @param pull_mode Pin pull mode + * @return none + */ +static inline void PORTF_set_pin_pull_mode(const uint8_t pin, const enum port_pull_mode pull_mode) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTF + 0x10 + pin); + + if (pull_mode == PORT_PULL_UP) { + *port_pin_ctrl |= PORT_PULLUPEN_bm; + } else if (pull_mode == PORT_PULL_OFF) { + *port_pin_ctrl &= ~PORT_PULLUPEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin inverted mode, Configure pin invert I/O or not. + * @param pin The pin number within port + * @param inverted Pin inverted mode + * @return none + */ +static inline void PORTF_pin_set_inverted(const uint8_t pin, const bool inverted) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTF + 0x10 + pin); + + if (inverted) { + *port_pin_ctrl |= PORT_INVEN_bm; + } else { + *port_pin_ctrl &= ~PORT_INVEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin input/sense configuration, Enable/disable digital input buffer and pin change interrupt, + * select pin interrupt edge/level sensing mode + * @param The pin number within port + * @param isc PORT_ISC_t + * @return none + */ +static inline void PORTF_pin_set_isc(const uint8_t pin, const PORT_ISC_t isc) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTF + 0x10 + pin); + + *port_pin_ctrl = (*port_pin_ctrl & ~PORT_ISC_gm) | isc; +} + +/** + * @ingroup pinsdriver + * @brief Set port data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param mask Bit mask where 1 means apply direction setting to the + * corresponding pin + * @param dir port_dir + * @return none + */ +static inline void PORTF_set_port_dir(const uint8_t mask, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTF.DIR &= ~mask; + break; + case PORT_DIR_OUT: + VPORTF.DIR |= mask; + break; + case PORT_DIR_OFF: + /*/ should activate the pullup for power saving + but a bit costly to do it here */ + { + for (uint8_t i = 0; i < 8; i++) { + if (mask & 1 << i) { + *((uint8_t *)&PORTF + 0x10 + i) |= 1 << PORT_PULLUPEN_bp; + } + } + } + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param pin The pin number within port + * @param dir port_dir + * @return none + */ +static inline void PORTF_set_pin_dir(const uint8_t pin, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTF.DIR &= ~(1 << pin); + break; + case PORT_DIR_OUT: + VPORTF.DIR |= (1 << pin); + break; + case PORT_DIR_OFF: + *((uint8_t *)&PORTF + 0x10 + pin) |= 1 << PORT_PULLUPEN_bp; + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on the pins defined by the bit mask. + * + * @param mask Bit mask where 1 means apply port level to the corresponding + * pin + * @param level -boolean value that defines the logic state of the pin level + * false = Pin levels set to "low" state + * @return none + */ +static inline void PORTF_set_port_level(const uint8_t mask, const bool level) +{ + if (level == true) { + VPORTF.OUT |= mask; + } else { + VPORTF.OUT &= ~mask; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on a pin. + * + * @param pin The pin number within port + * @param level -boolean value that defines the logic state of the pin level + * @return none + */ +static inline void PORTF_set_pin_level(const uint8_t pin, const bool level) +{ + if (level == true) { + VPORTF.OUT |= (1 << pin); + } else { + VPORTF.OUT &= ~(1 << pin); + } +} + +/** + * @ingroup pinsdriver + * @brief Toggle out level on pins, Toggle the pin levels on pins defined by bit mask. + * + * @param mask Bit mask where 1 means toggle pin level to the corresponding + * pin + * @return none + */ +static inline void PORTF_toggle_port_level(const uint8_t mask) +{ + PORTF.OUTTGL = mask; +} + +/** + * @ingroup pinsdriver + * @brief Toggle output level on pin, Toggle the pin levels on pins defined by bit mask. + * + * @param pin The pin number within port + * @return none + */ +static inline void PORTF_toggle_pin_level(const uint8_t pin) +{ + PORTF.OUTTGL = 1 << pin; +} + +/** + * @ingroup pinsdriver + * @brief Get input level on pins, Read the input level on pins connected to a port. + * + * @param none + * @return none + */ +static inline uint8_t PORTF_get_port_level() +{ + return VPORTF.IN; +} + +/** + * @ingroup pinsdriver + * @brief Get level on pin, Reads the level on pins connected to a port. + * + * @param pin The pin number within port + * @return none + */ +static inline bool PORTF_get_pin_level(const uint8_t pin) +{ + return VPORTF.IN & (1 << pin); +} + +/** + * @ingroup pinsdriver + * @brief Write value to Port, Write directly to the port OUT register. + * + * @param value Value to write to the port register + * @return none + */ +static inline void PORTF_write_port(const uint8_t value) +{ + VPORTF.OUT = value; +} +#ifdef __cplusplus +} +#endif + +#endif /* PORT_INCLUDED */ \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/protected_io.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/protected_io.h new file mode 100644 index 0000000..586576b --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/protected_io.h @@ -0,0 +1,80 @@ +/** + * protected_io Header File + * + * @file protected_io.h + * + * @defgroup doc_driver_system_protected_io Protected IO + * + * @brief This file contains the generated prtected_io header file for the CONFIGURATION BITS. + * + * @version Driver Version 1.0.0 + * + *@{ +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef PROTECTED_IO_H +#define PROTECTED_IO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__DOXYGEN__) +//! \name IAR Memory Model defines. +//@{ + +/** + * @def CONFIG_MEMORY_MODEL_TINY + * @brief Configuration symbol to enable 8 bit pointers. + */ +#define CONFIG_MEMORY_MODEL_TINY + +/** + * @def CONFIG_MEMORY_MODEL_SMALL + * @brief Configuration symbol to enable 16 bit pointers. + * NOTE: If no memory model is defined, SMALL is default. + */ +#define CONFIG_MEMORY_MODEL_SMALL + +/** + * @def CONFIG_MEMORY_MODEL_LARGE + * @brief Configuration symbol to enable 24 bit pointers. + */ +#define CONFIG_MEMORY_MODEL_LARGE + +//@} +#endif + +/** + * @brief Writes to an 8-bit I/O register protected by CCP or a protection bit. + * @param addr Address of the I/O register. + * @param magic CCP magic value or Mask for protection bit. + * @param value Value to be written. + * NOTE: Using IAR Embedded workbench, the choice of memory model has an impact on calling convention. + * Memory model must be defined in the Assembler preprocessor directives to be visible to the preprocessor. + */ +extern void protected_write_io(void *addr, uint8_t magic, uint8_t value); + +/** @} */ + +#endif /* PROTECTED_IO_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/clock.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/clock.c new file mode 100644 index 0000000..63ef8c4 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/clock.c @@ -0,0 +1,99 @@ +/** + * CLKCTRL Generated Driver File + * + * @file clkctrl.c + * + * @ingroup clkctrl + * + * @brief This file contains the driver code for CLKCTRL module. + * + * version CLKCTRL Driver Version 1.1.3 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#include "../clock.h" + +void CLOCK_Initialize(void) +{ + // Set the CLKCTRL module to the options selected in the user interface. + + //CLKOUT disabled; CLKSEL Internal high-frequency oscillator; + ccp_write_io((void*)&(CLKCTRL.MCLKCTRLA),0x0); + + //PDIV 2X; PEN disabled; + ccp_write_io((void*)&(CLKCTRL.MCLKCTRLB),0x0); + + //EXTS disabled; OSC32KS disabled; OSCHFS disabled; PLLS disabled; SOSC disabled; XOSC32KS disabled; + ccp_write_io((void*)&(CLKCTRL.MCLKSTATUS),0x0); + + //RUNSTDBY disabled; + ccp_write_io((void*)&(CLKCTRL.OSC32KCTRLA),0x0); + + //AUTOTUNE disabled; FRQSEL 4 MHz system clock (default); RUNSTDBY disabled; + ccp_write_io((void*)&(CLKCTRL.OSCHFCTRLA),0xC); + + //TUNE 0x0; + ccp_write_io((void*)&(CLKCTRL.OSCHFTUNE),0x0); + + //MULFAC PLL is disabled; RUNSTDBY disabled; SOURCE OSCHF; + ccp_write_io((void*)&(CLKCTRL.PLLCTRLA),0x0); + + //CSUT 1k cycles; ENABLE disabled; LPMODE disabled; RUNSTDBY disabled; SEL disabled; + ccp_write_io((void*)&(CLKCTRL.XOSC32KCTRLA),0x0); + + //CFDEN disabled; CFDSRC CLKMAIN; CFDTST disabled; + ccp_write_io((void*)&(CLKCTRL.MCLKCTRLC),0x0); + + //CFD disabled; INTTYPE INT; + ccp_write_io((void*)&(CLKCTRL.MCLKINTCTRL),0x0); + + //CFD disabled; + ccp_write_io((void*)&(CLKCTRL.MCLKINTFLAGS),0x0); + + //CSUTHF 256; ENABLE disabled; FRQRANGE 8M; RUNSTBY disabled; SELHF XTAL; + ccp_write_io((void*)&(CLKCTRL.XOSCHFCTRLA),0x0); + + + // System clock stability check by polling the status register. + while(!(CLKCTRL.MCLKSTATUS & CLKCTRL_OSCHFS_bm)); + + + // System clock stability check by polling the PLL status. +} + +void CFD_Enable(CLKCTRL_CFDSRC_t cfd_source) +{ + /* Enable Clock Failure Detection on main clock */ + ccp_write_io((uint8_t *) & CLKCTRL.MCLKCTRLC, cfd_source | CLKCTRL_CFDEN_bm); +} + +void CFD_Disable() +{ + /* Disable Clock Failure Detection on main clock */ + ccp_write_io((uint8_t *) & CLKCTRL.MCLKCTRLC, CLKCTRL.MCLKCTRLC & ~CLKCTRL_CFDEN_bm); +} + + +/** + End of File +*/ \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/config_bits.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/config_bits.c new file mode 100644 index 0000000..1b621ca --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/config_bits.c @@ -0,0 +1,47 @@ +/** + * CONFIGURATION BITS Generated Driver Source File + * + * @file config_bits.c + * + * @ingroup config_bitsdriver + * + * @brief This file contains the generated Device Configuration Bits file. + * + * @version Driver Version 1.0.4 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include + +/** + * Configures the Fuse bits. + */ +FUSES = +{ + .BODCFG = ACTIVE_DISABLE_gc | LVL_BODLEVEL0_gc | SAMPFREQ_128Hz_gc | SLEEP_DISABLE_gc, + .BOOTSIZE = 0x0, + .CODESIZE = 0x0, + .OSCCFG = CLKSEL_OSCHF_gc, + .SYSCFG0 = CRCSEL_CRC16_gc | CRCSRC_NOCRC_gc | RSTPINCFG_GPIO_gc | UPDIPINCFG_UPDI_gc, + .SYSCFG1 = MVSYSCFG_DUAL_gc | SUT_0MS_gc, + .WDTCFG = PERIOD_OFF_gc | WINDOW_OFF_gc, +}; diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/interrupt.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/interrupt.c new file mode 100644 index 0000000..6d9cbc3 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/interrupt.c @@ -0,0 +1,53 @@ +/** + * Interrupt Manager Generated Driver File. + * + * @file interrupt.c + * + * @ingroup interrupt + * + * @brief This file contains the API implementation for the Interrupt Manager. + * + * @version Interrupt Manager Driver Version 1.0.0 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#include "../interrupt.h" + +int8_t CPUINT_Initialize() +{ + /* IVSEL and CVT are Configuration Change Protected */ + + //CVT disabled; IVSEL disabled; LVL0RR disabled; + ccp_write_io((void*)&(CPUINT.CTRLA),0x0); + + //LVL0PRI 0; + CPUINT.LVL0PRI = 0x0; + + //LVL1VEC 0; + CPUINT.LVL1VEC = 0x0; + + ENABLE_INTERRUPTS(); + + return 0; +} \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/pins.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/pins.c new file mode 100644 index 0000000..b9bb6b1 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/pins.c @@ -0,0 +1,243 @@ +/** + * Generated Driver File + * + * @file pins.c + * + * @ingroup pinsdriver + * + * @brief This is generated driver implementation for pins. + * This file provides implementations for pin APIs for all pins selected in the GUI. + * + * @version Driver Version 1.1.0 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "../pins.h" + +static void (*ETH_CS_InterruptHandler)(void); +static void (*IO_PA5_InterruptHandler)(void); +static void (*IO_PA4_InterruptHandler)(void); +static void (*IO_PA6_InterruptHandler)(void); +static void (*SW0_InterruptHandler)(void); +static void (*LED0_InterruptHandler)(void); + +void PIN_MANAGER_Initialize() +{ + /* DIR Registers Initialization */ + PORTA.DIR = 0xD0; + PORTC.DIR = 0x0; + PORTD.DIR = 0x0; + PORTF.DIR = 0x20; + + /* OUT Registers Initialization */ + PORTA.OUT = 0x0; + PORTC.OUT = 0x0; + PORTD.OUT = 0x0; + PORTF.OUT = 0x20; + + /* PINxCTRL registers Initialization */ + PORTA.PIN0CTRL = 0x0; + PORTA.PIN1CTRL = 0x0; + PORTA.PIN2CTRL = 0x0; + PORTA.PIN3CTRL = 0x0; + PORTA.PIN4CTRL = 0x0; + PORTA.PIN5CTRL = 0x0; + PORTA.PIN6CTRL = 0x0; + PORTA.PIN7CTRL = 0x8; + PORTC.PIN0CTRL = 0x0; + PORTC.PIN1CTRL = 0x0; + PORTC.PIN2CTRL = 0x0; + PORTC.PIN3CTRL = 0x0; + PORTC.PIN4CTRL = 0x0; + PORTC.PIN5CTRL = 0x0; + PORTC.PIN6CTRL = 0x0; + PORTC.PIN7CTRL = 0x0; + PORTD.PIN0CTRL = 0x0; + PORTD.PIN1CTRL = 0x0; + PORTD.PIN2CTRL = 0x0; + PORTD.PIN3CTRL = 0x0; + PORTD.PIN4CTRL = 0x0; + PORTD.PIN5CTRL = 0x0; + PORTD.PIN6CTRL = 0x0; + PORTD.PIN7CTRL = 0x0; + PORTF.PIN0CTRL = 0x0; + PORTF.PIN1CTRL = 0x0; + PORTF.PIN2CTRL = 0x0; + PORTF.PIN3CTRL = 0x0; + PORTF.PIN4CTRL = 0x0; + PORTF.PIN5CTRL = 0x80; + PORTF.PIN6CTRL = 0x0; + PORTF.PIN7CTRL = 0x0; + + /* EVGENCTRL registers Initialization */ + + /* PORTMUX Initialization */ + PORTMUX.CCLROUTEA = 0x0; + PORTMUX.EVSYSROUTEA = 0x0; + PORTMUX.SPIROUTEA = 0x0; + PORTMUX.TCAROUTEA = 0x0; + PORTMUX.TCBROUTEA = 0x0; + PORTMUX.TCDROUTEA = 0x0; + PORTMUX.TWIROUTEA = 0x0; + PORTMUX.USARTROUTEA = 0x0; + + // register default ISC callback functions at runtime; use these methods to register a custom function + ETH_CS_SetInterruptHandler(ETH_CS_DefaultInterruptHandler); + IO_PA5_SetInterruptHandler(IO_PA5_DefaultInterruptHandler); + IO_PA4_SetInterruptHandler(IO_PA4_DefaultInterruptHandler); + IO_PA6_SetInterruptHandler(IO_PA6_DefaultInterruptHandler); + SW0_SetInterruptHandler(SW0_DefaultInterruptHandler); + LED0_SetInterruptHandler(LED0_DefaultInterruptHandler); +} + +/** + Allows selecting an interrupt handler for ETH_CS at application runtime +*/ +void ETH_CS_SetInterruptHandler(void (* interruptHandler)(void)) +{ + ETH_CS_InterruptHandler = interruptHandler; +} + +void ETH_CS_DefaultInterruptHandler(void) +{ + // add your ETH_CS interrupt custom code + // or set custom function using ETH_CS_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for IO_PA5 at application runtime +*/ +void IO_PA5_SetInterruptHandler(void (* interruptHandler)(void)) +{ + IO_PA5_InterruptHandler = interruptHandler; +} + +void IO_PA5_DefaultInterruptHandler(void) +{ + // add your IO_PA5 interrupt custom code + // or set custom function using IO_PA5_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for IO_PA4 at application runtime +*/ +void IO_PA4_SetInterruptHandler(void (* interruptHandler)(void)) +{ + IO_PA4_InterruptHandler = interruptHandler; +} + +void IO_PA4_DefaultInterruptHandler(void) +{ + // add your IO_PA4 interrupt custom code + // or set custom function using IO_PA4_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for IO_PA6 at application runtime +*/ +void IO_PA6_SetInterruptHandler(void (* interruptHandler)(void)) +{ + IO_PA6_InterruptHandler = interruptHandler; +} + +void IO_PA6_DefaultInterruptHandler(void) +{ + // add your IO_PA6 interrupt custom code + // or set custom function using IO_PA6_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for SW0 at application runtime +*/ +void SW0_SetInterruptHandler(void (* interruptHandler)(void)) +{ + SW0_InterruptHandler = interruptHandler; +} + +void SW0_DefaultInterruptHandler(void) +{ + // add your SW0 interrupt custom code + // or set custom function using SW0_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for LED0 at application runtime +*/ +void LED0_SetInterruptHandler(void (* interruptHandler)(void)) +{ + LED0_InterruptHandler = interruptHandler; +} + +void LED0_DefaultInterruptHandler(void) +{ + // add your LED0 interrupt custom code + // or set custom function using LED0_SetInterruptHandler() +} +ISR(PORTA_PORT_vect) +{ + // Call the interrupt handler for the callback registered at runtime + if(VPORTA.INTFLAGS & PORT_INT7_bm) + { + ETH_CS_InterruptHandler(); + } + if(VPORTA.INTFLAGS & PORT_INT5_bm) + { + IO_PA5_InterruptHandler(); + } + if(VPORTA.INTFLAGS & PORT_INT4_bm) + { + IO_PA4_InterruptHandler(); + } + if(VPORTA.INTFLAGS & PORT_INT6_bm) + { + IO_PA6_InterruptHandler(); + } + /* Clear interrupt flags */ + VPORTA.INTFLAGS = 0xff; +} + +ISR(PORTC_PORT_vect) +{ + /* Clear interrupt flags */ + VPORTC.INTFLAGS = 0xff; +} + +ISR(PORTD_PORT_vect) +{ + /* Clear interrupt flags */ + VPORTD.INTFLAGS = 0xff; +} + +ISR(PORTF_PORT_vect) +{ + // Call the interrupt handler for the callback registered at runtime + if(VPORTF.INTFLAGS & PORT_INT6_bm) + { + SW0_InterruptHandler(); + } + if(VPORTF.INTFLAGS & PORT_INT5_bm) + { + LED0_InterruptHandler(); + } + /* Clear interrupt flags */ + VPORTF.INTFLAGS = 0xff; +} + +/** + End of File +*/ \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/protected_io.S b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/protected_io.S new file mode 100644 index 0000000..fa51ec8 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/protected_io.S @@ -0,0 +1,90 @@ +/** + * protected_io Source Code File + * + * @file protected_io.S + * + * @ingroup config_bitsdriver + * + * @brief This file contains the generated protected_io source code file for the CONFIGURATION BITS. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#include "../utils/assembler.h" + +/* + * GNU and IAR use different calling conventions. Since this is + * a very small and simple function to begin with, it's easier + * to implement it twice than to deal with the differences + * within a single implementation. + */ + + PUBLIC_FUNCTION(protected_write_io) + +#if defined(__GNUC__) + +#ifdef RAMPZ + out _SFR_IO_ADDR(RAMPZ), r1 // Clear bits 23:16 of Z +#endif + movw r30, r24 // Load addr into Z + out CCP, r22 // Start CCP handshake + st Z, r20 // Write value to I/O register + ret // Return to caller + +#elif defined(__IAR_SYSTEMS_ASM__) + +# if !defined(CONFIG_MEMORY_MODEL_TINY) && !defined(CONFIG_MEMORY_MODEL_SMALL) \ + && !defined(CONFIG_MEMORY_MODEL_LARGE) +# define CONFIG_MEMORY_MODEL_SMALL +# endif +# if defined(CONFIG_MEMORY_MODEL_LARGE) + ldi r20, 0 + out RAMPZ, r20 // Reset bits 23:16 of Z + movw r30, r16 // Load addr into Z +# elif defined(CONFIG_MEMORY_MODEL_TINY) + ldi r31, 0 // Reset bits 8:15 of Z + mov r30, r16 // Load addr into Z +# else + movw r30, r16 // Load addr into Z +# endif +# if defined(CONFIG_MEMORY_MODEL_TINY) + out CCP, r17 // Start CCP handshake + st Z, r18 // Write value to I/O register +# elif defined(CONFIG_MEMORY_MODEL_SMALL) + out CCP, r18 // Start CCP handshake + st Z, r19 // Write value to I/O register +# elif defined(CONFIG_MEMORY_MODEL_LARGE) + out CCP, r19 // Start CCP handshake + st Z, r20 // Write value to I/O register +# else +# error Unknown memory model in use, no idea how registers should be accessed +# endif + ret +#else +# error Unknown assembler +#endif + + END_FUNC(protected_write_io) + END_FILE() + diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/system.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/system.c new file mode 100644 index 0000000..add9819 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/src/system.c @@ -0,0 +1,44 @@ +/** + * System Driver Source File + * + * @file system.c + * + * @ingroup systemdriver + * + * @brief This file contains the API implementation for the System driver. + * + * @version Driver Version 1.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "../system.h" + + +void SYSTEM_Initialize(void) +{ + CLOCK_Initialize(); + PIN_MANAGER_Initialize(); + SPI0_Initialize(); + TCA0_Initialize(); + CPUINT_Initialize(); +} + diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/system.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/system.h new file mode 100644 index 0000000..5cdf606 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/system.h @@ -0,0 +1,62 @@ +/** + * System Driver Header File + * + * @file system.h + * + * @defgroup systemdriver System Driver + * + * @brief This file contains the API prototypes for the System driver. + * + * @version Driver Version 1.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef MCC_H +#define MCC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../system/utils/compiler.h" +#include "config_bits.h" +#include "../system/clock.h" +#include "../system/pins.h" +#include "../spi/spi0.h" +#include "../timer/tca0.h" +#include "../system/interrupt.h" +/** + * @ingroup systemdriver + * @brief Initializes the system module. This routine must be called only once during the system initialization and before any other routine is called. + * @param None. + * @return None. +*/ +void SYSTEM_Initialize(void); + +#ifdef __cplusplus +} +#endif +#endif /* MCC_H */ +/** + End of File +*/ \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/assembler.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/assembler.h new file mode 100644 index 0000000..2ce5066 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/assembler.h @@ -0,0 +1,49 @@ +/** + * Assembler Header File + * + * @file assembler.h + * + * @ingroup config_bitsdriver + * + * @brief This file contains the assembler header file for the configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef ASSEMBLER_H_INCLUDED +#define ASSEMBLER_H_INCLUDED + +#if !defined(__ASSEMBLER__) && !defined(__IAR_SYSTEMS_ASM__) && !defined(__DOXYGEN__) +#error This file may only be included from assembly files +#endif + +#if defined(__ASSEMBLER__) +#include "assembler/gas.h" +#include +#elif defined(__IAR_SYSTEMS_ASM__) +#include "assembler/iar.h" +#include +#endif + +#endif /* ASSEMBLER_H_INCLUDED */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/assembler/gas.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/assembler/gas.h new file mode 100644 index 0000000..fc78ad7 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/assembler/gas.h @@ -0,0 +1,120 @@ +/** + * GAS Header File + * + * @file gas.h + * + * @ingroup config_bitsdriver + * + * @brief This file contains the generated GAS header file for the Configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef ASSEMBLER_GAS_H_INCLUDED +#define ASSEMBLER_GAS_H_INCLUDED + +#ifndef __DOXYGEN__ + +/* clang-format off */ + + /* IAR doesn't accept dots in macro names */ + .macro ld_addr, reg, sym + lda.w \reg, \sym + .endm + + /* Define a function \a name that is either globally visible or only + * file-local. + */ + .macro gas_begin_func name, is_public + .if \is_public + .global \name + .endif + #ifdef __XC8 + .section .text.\name, code + #else + .section .text.\name, "ax", @progbits + #endif + .type \name, @function + \name : + .endm + + /* Define a function \a name that is either globally visible or only + * file-local in a given segment. + */ + .macro gas_begin_func_segm name, is_public, segment + .if \is_public + .global \name + .endif + .section .\segment, "ax", @progbits + .type \name, @function + \name : + .endm + + /* Define \a name as a weak alias for the function \a strong_name */ + .macro gas_weak_function_alias name, strong_name + .global \name + .weak \name + .type \name, @function + .set \name, \strong_name + .endm + + /* Define a weak function called \a name */ + .macro gas_weak_function name + .weak \name + gas_begin_func \name 1 + .endm + +#define REPEAT(count) .rept count +#define END_REPEAT() .endr +#define FILL_BYTES(count) .fill count +#define SET_LOC(offset) .org offset +#define L(name) .L##name +#define EXTERN_SYMBOL(name) + +#define TEXT_SECTION(name) \ + .section name, "ax", @progbits +#define RODATA_SECTION(name) \ + .section name, "a", @progbits +#define DATA_SECTION(name) \ + .section name, "aw", @progbits +#define BSS_SECTION(name) \ + .section name, "aw", @nobits + +#define FUNCTION(name) gas_begin_func name 0 +#define PUBLIC_FUNCTION(name) gas_begin_func name 1 +#define PUBLIC_FUNCTION_SEGMENT(name, segment) \ + gas_begin_func_segm name 1 segment +#define WEAK_FUNCTION(name) gas_weak_function name +#define WEAK_FUNCTION_ALIAS(name, strong_name) \ + gas_weak_function_alias name strong_name +#define END_FUNC(name) \ + .size name, . - name + +#define END_FILE() + +/* clang-format on */ + +#endif /* __DOXYGEN__ */ + +#endif /* ASSEMBLER_GAS_H_INCLUDED */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/assembler/iar.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/assembler/iar.h new file mode 100644 index 0000000..d4ba634 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/assembler/iar.h @@ -0,0 +1,104 @@ +/** + * IAR Header File + * + * @file iar.h + * + * @ingroup config_bitsdriver + * + * @brief This file contains the generated IAR header file for the Configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef ASSEMBLER_IAR_H_INCLUDED +#define ASSEMBLER_IAR_H_INCLUDED + +/* clang-format off */ + +ld_addr MACRO reg, sym + mov reg, LWRD sym + orh reg, HWRD sym + ENDM + +call MACRO sym + rcall sym + ENDM + +iar_begin_func MACRO name, sect, is_public, is_weak + MODULE name + RSEG CODE:CODE:NOROOT(1) + IF is_weak == 1 + PUBWEAK name + ELSEIF is_public + PUBLIC name + ENDIF +name: + ENDM + +iar_begin_func_segm MACRO name, sect, is_public, is_weak, segment + MODULE name + RSEG segment:CODE:NOROOT(1) + IF is_weak == 1 + PUBWEAK name + ELSEIF is_public + PUBLIC name + ENDIF +name: + ENDM + +iar_weak_alias MACRO name, strong_name + PUBWEAK name +name: + rjmp strong_name + ENDM + +#define lo(x) LWRD x +#define hi(x) HWRD x + +#define REPEAT(count) REPT count +#define END_REPEAT() ENDR +#define SET_LOC(offset) ORG offset +#define END_FILE() END + +#define FILL_BYTES(count) DS8 count + +#define L(name) name +#define EXTERN_SYMBOL(name) EXTERN name +#define FUNCTION(name) iar_begin_func name, text_##name, 0, 0 +#define PUBLIC_FUNCTION(name) iar_begin_func name, text_##name, 1, 0 +#define PUBLIC_FUNCTION_SEGMENT(name, segment) \ + iar_begin_func_segm name, text_##name, 1, 0, segment +#define WEAK_FUNCTION(name) iar_begin_func name, text_##name, 1, 1 +#define WEAK_FUNCTION_ALIAS(name, strong_name) \ + iar_weak_alias name, strong_name +#define END_FUNC(name) ENDMOD + +#define TEXT_SECTION(name) RSEG name:CODE:NOROOT +#define RODATA_SECTION(name) RSEG name:CONST:NOROOT +#define DATA_SECTION(name) RSEG name:DATA:NOROOT +#define BSS_SECTION(name) RSEG name:DATA:NOROOT + +/* clang-format on */ + +#endif /* ASSEMBLER_IAR_H_INCLUDED */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/atomic.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/atomic.h new file mode 100644 index 0000000..c298b95 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/atomic.h @@ -0,0 +1,87 @@ +/** + * CONFIGURATION BITS Generated Atomic Header File + * + * @file atomic.h + * + * @defgroup doc_driver_utils_atomic Atomic memory access and critical sections + * + * @brief This file contains the atomic memory access and critical sections header file for the configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef ATOMIC_H +#define ATOMIC_H + +/* clang-format off */ + +#if defined(__GNUC__) || defined (__DOXYGEN__) + +/** + * @brief Enters critical region. Saves the contents of the status register, including the Global Interrupt Enable bit, so that it can be restored upon leaving the critical region. + * Thereafter, clears the Global Interrupt Enable Bit.This macro takes a parameter P that is unused for the GCC compiler,but necessary for code compatibility with the IAR compiler. + * The IAR compiler declares a variable with the name of the parameter forholding the SREG value. + * Compilation will fail when the variable declared in the macro is not unique within the scope that the critical region is declared within. + * @param[in] UNUSED(GCC)/P(IAR) Name of variable storing SREG. + */ + +#define ENTER_CRITICAL(UNUSED) __asm__ __volatile__ ( \ + "in __tmp_reg__, __SREG__" "\n\t" \ + "cli" "\n\t" \ + "push __tmp_reg__" "\n\t" \ + ::: "memory" \ + ) + +/** + * @brief Exits a critical region. Restores the contents of the status register, including the Global Interrupt Enable bit, as it was when entering the critical region. + * This macro takes a parameter P that is unused for the GCC compiler, but necessary for code compatibility with the IAR compiler. + * The IAR compiler uses this parameter as the name of a variable that holds the SREG value. + * The parameter must be identical to the parameter used in the corresponding ENTER_CRITICAL(). + * @param[in] UNUSED(GCC)/P(IAR) Name of variable storing SREG + */ + +#define EXIT_CRITICAL(UNUSED) __asm__ __volatile__ ( \ + "pop __tmp_reg__" "\n\t" \ + "out __SREG__, __tmp_reg__" "\n\t" \ + ::: "memory" \ + ) + +#define DISABLE_INTERRUPTS() __asm__ __volatile__ ( "cli" ::: "memory") +#define ENABLE_INTERRUPTS() __asm__ __volatile__ ( "sei" ::: "memory") + +#elif defined(__ICCAVR__) + +#define ENTER_CRITICAL(P) unsigned char P = __save_interrupt();__disable_interrupt(); +#define EXIT_CRITICAL(P) __restore_interrupt(P); + +#define DISABLE_INTERRUPTS() __disable_interrupt(); +#define ENABLE_INTERRUPTS() __enable_interrupt(); + +#else +# error Unsupported compiler. +#endif + +/* clang-format on */ + +#endif /* ATOMIC_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/compiler.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/compiler.h new file mode 100644 index 0000000..fba02a0 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/compiler.h @@ -0,0 +1,72 @@ +/** + * Compiler Header File + * + * @file compiler.h + * + * @defgroup doc_driver_utils_compiler Compiler abstraction + * + * @brief This file contains the compiler abstraction layer and code utilities for 8-bit AVR. This module provides various abstraction layers and utilities to make code compatible between different compilers. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef UTILS_COMPILER_H +#define UTILS_COMPILER_H + +#if defined(__GNUC__) +#include +#include +#if defined(__XC8__) +#include +#endif +#elif defined(__ICCAVR__) +#define ENABLE_BIT_DEFINITIONS 1 +#include +#include + +#ifndef CCP_IOREG_gc +#define CCP_IOREG_gc 0xD8 /* CPU_CCP_IOREG_gc */ +#endif +#ifndef CCP_SPM_gc +#define CCP_SPM_gc 0x9D /* CPU_CCP_SPM_gc */ +#endif + +#else +#error Unsupported compiler. +#endif + +#include +#include +#include +#include + +#include "interrupt_avr8.h" + +/** + * @def UNUSED + * @brief Marking \a v as a unused parameter or value. + */ +#define UNUSED(v) (void)(v) + +#endif /* UTILS_COMPILER_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/interrupt_avr8.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/interrupt_avr8.h new file mode 100644 index 0000000..83b3c62 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/interrupt_avr8.h @@ -0,0 +1,88 @@ +/** + * interrupt_avr8 Header File + * + * @file interrupt_avr8.h + * + * @defgroup doc_driver_utils_interrupts ISR abstraction + * + * @brief Interrupt-related functionality. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef UTILS_INTERRUPT_AVR8_H +#define UTILS_INTERRUPT_AVR8_H + +/** + * \weakgroup interrupt_group + * + * @{ + */ + +#ifdef ISR_CUSTOM_H +#include ISR_CUSTOM_H +#else + +/** + * @def ISR + * @brief Define service routine for specified interrupt vector. + * @code + ISR(FOO_vect) + { + ... + } + * @endcode + * + * @param vect Interrupt vector name as found in the device header files. + */ +#if defined(__DOXYGEN__) +#define ISR(vect) +#elif defined(__GNUC__) +#include +#elif defined(__ICCAVR__) +#define __ISR(x) _Pragma(#x) +#define ISR(vect) __ISR(vector = vect) __interrupt void handler_##vect(void) +#endif +#endif // ISR_CUSTOM_H + +#ifdef __GNUC__ +#define cpu_irq_enable() sei() +#define cpu_irq_disable() cli() +#else +#define cpu_irq_enable() __enable_interrupt() +#define cpu_irq_disable() __disable_interrupt() +#endif + +//! @} + +/** + * \weakgroup interrupt_deprecated_group + * @{ + */ +// Deprecated definitions. +#define Enable_global_interrupt() cpu_irq_enable() +#define Disable_global_interrupt() cpu_irq_disable() +#define Is_global_interrupt_enabled() cpu_irq_is_enabled() +//! @} + +#endif /* UTILS_INTERRUPT_AVR8_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/utils.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/utils.h new file mode 100644 index 0000000..eaf3b81 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/utils.h @@ -0,0 +1,52 @@ +/** + * utils Header File + * + * @file system.h + * + * @defgroup doc_driver_utils AVR Code utility functions + * + * @brief This file contains the compiler abstraction layer and code utilities for AVR.This module provides various abstraction layers and utilities to make code compatible between different compilers. + * + * @version Driver Version 1.0.1 + * \{ + * +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef UTILS_H_INCLUDED +#define UTILS_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Retrieve array size + */ +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif /* UTILS_H_INCLUDED */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/utils_assert.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/utils_assert.h new file mode 100644 index 0000000..a278db5 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/system/utils/utils_assert.h @@ -0,0 +1,60 @@ +/** + * utils_assert Header File + * + * @file utils_assert.h + * + * @defgroup doc_driver_utils_assert Functionality for assert + * + * @brief This file contains the generated utils_assert header file for the configuration bits driver. + * + * @version Driver Version 1.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef _ASSERT_H_INCLUDED +#define _ASSERT_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * @brief Assert macro + * Macro used to throw asserts. It can be mapped to different function based on debug level. + * @param[in] condition A condition to be checked; assert is thrown if the given condition is false. + */ + +#ifdef DEBUG +#define ASSERT(condition) \ + if (!(condition)) \ + while (true) \ + ; +#else +#define ASSERT(condition) ((void)0) +#endif + +#ifdef __cplusplus +} +#endif +#endif /* _ASSERT_H_INCLUDED */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/arpv4.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/arpv4.h new file mode 100644 index 0000000..1a647cb --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/arpv4.h @@ -0,0 +1,82 @@ +/** + * ARPv4 Protocol Header file + * + * @file arpv4.h + * + * @defgroup arp ARP + * + * @brief This header file provides the API for the ARPv4 protocol. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef ARPV4_H +#define ARPV4_H + +// Included Files +#include "../ethernet/physical_layer_interface.h" +#include "tcpip_types.h" +#include "tcpip_config.h" + +// ARP Functions +/** + * @ingroup arp + * @brief Initializes the ARP table. + * @param None. + * @return None. + */ +void ARPV4_Init(void); + +/** + * @ingroup arp + * @brief Receives all ARP packets on the network and searches the ARP table for an existing ARP entry. + * If present, it updates the table. If the ARP packet is for the device and its operation is REQUEST, + * the function replies with the device MAC address. + * @param None. + * @retval 1 ARP reply sent successfully + * @retval !1 ARP reply is not sent or the ARP packet is not destined for the device + */ +error_msg ARPV4_Packet(void); + +/** + * @ingroup arp + * @brief Updates the ARP table at least every 10s to avoid aging. + * @param None. + * @return None. + */ +void ARPV4_Update(void); + +/** + * @ingroup arp + * @brief Maintains an ARP table which maps hardware address to internet address. + * @param ipAddress 32-bit destination IPv4 address in host order + * @return Pointer to the destination MAC address. + */ +mac48Address_t *ARPV4_Lookup(uint32_t ipAddress); + +/** + * @ingroup arp + * @brief Sends the ARP Request. + * @param destAddress 32-bit destination IPv4 address + * @retval 1 ARP request sent successfully + * @retval !1 ARP request failed to send + */ +error_msg ARPV4_Request(uint32_t destAddress); + +#endif /* ARPV4_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/dhcp_client.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/dhcp_client.h new file mode 100644 index 0000000..10a757d --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/dhcp_client.h @@ -0,0 +1,69 @@ +/** + * DHCPv4 Client Protocol Header File + * + * @file dhcp_client.h + * + * @defgroup dhcp DHCP + * + * @brief This file provides the API implementation for the Dynamic Host Configuration Protocol (DHCP) client. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef DHCP_CLIENT_H +#define DHCP_CLIENT_H + +// Included Files +#include "tcpip_types.h" +#include "tcpip_config.h" + +// DHCP Client Functions +/** + @ingroup dhcp + @brief Initializes the DHCP. + @param None. + @return None. + */ +void DHCP_init(void); + +/** + @ingroup dhcp + @brief Receives and processes the DHCP packet. + @param length Length of the received DHCP packet + @return None. + */ +void DHCP_Handler(int16_t length); + +/** + @ingroup dhcp + @brief Updates the DHCP status at least every one second. + @param None. + @return None. + */ +void DHCP_Manage(void); + +/** + @ingroup dhcp + @brief Writes zeroes for the number of bytes passed. + @param length Number of bytes + @return None. + */ +void DHCP_WriteZeros(uint16_t length); + +#endif /* DHCP_CLIENT_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/ip_database.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/ip_database.h new file mode 100644 index 0000000..68d424c --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/ip_database.h @@ -0,0 +1,109 @@ +/** + * IP Database Header File + * + * @file ip_database.h + * + * @ingroup ipv4 + * + * @brief This file contains IP addresses for different operations. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef IP_DATABASE_H +#define IP_DATABASE_H + +// Macros +#define MAX_DNS 2 +#define MAX_NTP 2 + +#define IPV4_ZERO_ADDRESS 0 +#define SPECIAL_IPV4_BROADCAST_ADDRESS 0xFFFFFFFF +#define CLASS_A_IPV4_BROADCAST_MASK 0XFF000000 +#define CLASS_B_IPV4_BROADCAST_MASK 0xFFFF0000 +#define CLASS_C_IPV4_BROADCAST_MASK 0xFFFFFF00 +#define ALL_HOST_MULTICAST_ADDRESS 0xE0000001 +#define LOCAL_HOST_ADDRESS 0x7F000001 + +#define CLASS_A_IPV4_REVERSE_BROADCAST_MASK 0x00FFFFFF +#define CLASS_B_IPV4_REVERSE_BROADCAST_MASK 0x0000FFFF +#define CLASS_C_IPV4_REVERSE_BROADCAST_MASK 0X000000FF + +/** + @ingroup ipv4 + @struct ip_db_info_t + @brief Contains IP information. + */ +typedef struct { + uint32_t ipv4_myAddress; /**< IP address*/ + uint32_t ipv4_dns[MAX_DNS]; /**< Primary & secondary DNS addresses*/ + uint32_t ipv4_subnetMask; /**< Subnet mask*/ + uint32_t ipv4_router; /**< Router address*/ + uint32_t ipv4_gateway; /**< Gateway address*/ + uint32_t ipv4_ntpAddress[MAX_NTP]; /**< NTP addresses*/ + uint32_t ipv4_tftpAddress; /**< TFTP address*/ +} ip_db_info_t; + +extern ip_db_info_t ip_database_info; + +#define ipdb_getAddress() (ip_database_info.ipv4_myAddress) +#define ipdb_getDNS(x) (x < MAX_DNS ? ip_database_info.ipv4_dns[x] : ip_database_info.ipv4_dns[0]) +#define ipdb_getSubNetMASK() (ip_database_info.ipv4_subnetMask) +#define ipdb_getRouter() (ip_database_info.ipv4_router) +#define ipdb_getNTP(x) (x < MAX_NTP ? ip_database_info.ipv4_ntpAddress[x] : ip_database_info.ipv4_ntpAddress[0]) +#define ipdb_getTFTP() (ip_database_info.ipv4_tftpAddress) +#define ipdb_classAbroadcastAddress() (ip_database_info.ipv4_myAddress|CLASS_A_IPV4_REVERSE_BROADCAST_MASK) +#define ipdb_classBbroadcastAddress() (ip_database_info.ipv4_myAddress|CLASS_B_IPV4_REVERSE_BROADCAST_MASK) +#define ipdb_classCbroadcastAddress() (ip_database_info.ipv4_myAddress|CLASS_C_IPV4_REVERSE_BROADCAST_MASK) +#define ipdb_specialbroadcastAddress() SPECIAL_IPV4_BROADCAST_ADDRESS + +#define ipdb_setAddress(a) do{ ip_database_info.ipv4_myAddress = a; } while(0) +#define ipdb_setDNS(x,v) do{ if(x < MAX_DNS) ip_database_info.ipv4_dns[x] = v; } while(0) +#define ipdb_setSubNetMASK(m) do{ ip_database_info.ipv4_subnetMask = m; } while(0) +#define ipdb_setRouter(r) do{ ip_database_info.ipv4_router = r; } while(0) +#define ipdb_setGateway(g) do{ ip_database_info.ipv4_gateway = g; } while(0) +#define ipdb_setNTP(x,n) do{ if(x < MAX_NTP) ip_database_info.ipv4_ntpAddress[x] = n; } while(0) +#define ipdb_setTFTP(a) do{ ip_database_info.ipv4_tftpAddress = a; } while(0) + +// IPDB Functions +/** + @ingroup ipv4 + @brief Initializes the IP database. + @param None. + @return None. + */ +void ipdb_init(void); + +/** + @ingroup ipv4 + @brief Converts a string into a 32-bit IPv4 address. + @param *str IPv4 address in a string format + @return IPv4 address. + */ +uint32_t makeStrToIpv4Address(char *str); + +/** + @ingroup ipv4 + @brief Converts an IPv4 address into a string. + @param addr 32-bit IPV4 address + @return IPV4 address in a string format. + */ +char *makeIpv4AddresstoStr(uint32_t addr); + +#endif /* IP_DATABASE_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/ipv4.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/ipv4.h new file mode 100644 index 0000000..60bb088 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/ipv4.h @@ -0,0 +1,90 @@ +/** + * IPv4 Protocol Header File + * + * @file ipv4.h + * + * @defgroup ipv4 IPV4 + * + * @brief This file provides the API implementation for the Internet Protocol v4 (IPv4). + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef IPV4_H +#define IPV4_H + +// Included Files +#include +#include "tcpip_types.h" +#include "../ethernet/physical_layer_interface.h" + +// IPV4 Functions +/** + @ingroup IPv4 + @brief Initializes IPv4. + @param None. + @return None. + */ +void IPV4_Init(void); + +/** + @ingroup ipv4 + @brief Receives the IPv4 packet. This function reads the IPv4 header and filters the upper layer protocols. + @param None. + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg IPV4_Packet(void); + +/** + @ingroup ipv4 + @brief Starts the IPv4 packet. This routine starts the Ethernet packet and writes the IPv4 header. + Initially Checksum and Payload length are set to '0'. An error code is returned if there has been + an error in accepting, or if something goes wrong. + @param dstAddress 32-bit destination Ipv4 address + @param protocol Protocol number + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg IPv4_Start(uint32_t dstAddress, ipProtocolNumbers protocol); + +/** + @ingroup ipv4 + @brief Computes the pseudo-header checksum for transport layer protocols. + @param payloadLen Length of the transport layer packet + @return Checksum. + */ +uint16_t IPV4_PseudoHeaderChecksum(uint16_t payloadLen); + +/** + @ingroup ipv4 + @brief Sends the IPv4 packet. This function inserts the total length of IPv4 packet, computes and adds the Ipv4 header checksum. + @param payloadLength Data length of the transport packet + @retval 1 IP packet was sent successfully + @retval !1 IP packet was not sent + */ +error_msg IPV4_Send(uint16_t payloadLength); + +/** + @ingroup ipv4 + @brief Returns the length of the IPv4 datagram. + @param None. + @return Length of IPV4 datagram. + */ +uint16_t IPV4_GetDatagramLength(void); + +#endif /* IPV4_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/lfsr.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/lfsr.h new file mode 100644 index 0000000..0ad9291 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/lfsr.h @@ -0,0 +1,86 @@ +/** + * lfsr API Header File + * + * @file lfsr.h + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for the Linear Feedback Shift Register (LFSR). + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef LFSR_H +#define LFSR_H + +// Included files +#include + +typedef uint8_t lfsr_t; + +// LFSR functions +/** + @ingroup tcpiplite + @brief Returns the LFSR sequence count. + @param None. + @return Sequence count. + */ +int lfsr_getSequenceCount(void); + +/** + @ingroup tcpiplite + @brief Returns the LFSR sequence. + @param None. + @return Sequence. + */ +lfsr_t lfsr_getSequence(void); + +/** + @ingroup tcpiplite + @brief Resets the LFSR. + @param None. + @return None. + */ +void lfsr_reset(void); + +/** + @ingroup tcpiplite + @brief Sets the LFSR sequence. + @param s Sequence + @return None. + */ +void lfsr_setSequence(uint16_t s); + +/** + @ingroup tcpiplite + @brief Returns the LFSR value. + @param None. + @return Value of LFSR. + */ +lfsr_t lfsr(void); + +/** + @ingroup tcpiplite + @brief Returns the LFSR value with seed. + @param lfsrSeed LFSR with seed + @return Value of LFSR with seed. + */ +lfsr_t lfsrWithSeed(uint8_t lfsrSeed); + +#endif /* LFSR_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/log.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/log.h new file mode 100644 index 0000000..34175e5 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/log.h @@ -0,0 +1,142 @@ +/** + * Log API Header File + * + * @file log.h + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for sending log messages. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef LOG_H +#define LOG_H + +// Included Files +#include +#include + +// Macros +#define LOG_DEST_ETHERNET 0b00000001 +#define LOG_DEST_CONSOLE 0b00000010 +#define LOG_DEST_EEPROM 0b00000100 + +#define LOG_ETHERNET_MASK(m) (m & LOG_DEST_ETHERNET) +#define LOG_CONSOLE_MASK(m) (m & LOG_DEST_CONSOLE) +#define LOG_EEPROM_MASK(m) (m & LOG_DEST_EEPROM) + +#define SYSLOG_VERSION 1 +#define LOG_NILVALUE "-" + +/** + * @ingroup tcpiplite + * @enum LOG_SEVERITY + * @brief PRI Priorities severity + */ +typedef enum +{ + LOG_EMERGENCY = 0, /** +#include "tcpip_types.h" + +// Macros +#define SOURCEPORT_SYSLOG 514 +#define DESTPORT_SYSLOG 514 + +// Syslog Functions +/** + @ingroup tcpiplite + @brief Sends a syslog message. + @param *message + @param priorityVal Message priority + @return Status of sending the message. Refer to the error description in tcpip_types.h. + */ +error_msg logSyslog(const char *message, uint8_t priorityVal); + +#endif /* LOG_SYSLOG_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/network.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/network.h new file mode 100644 index 0000000..106df64 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/network.h @@ -0,0 +1,110 @@ +/** + * Network Header File + * + * @file network.h + * + * @ingroup tcpiplite + * + * @brief This file provides the network layer implementation for the Transmission Control Protocol/Internet Protocol (TCP/IP) stack. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef NETWORK_H +#define NETWORK_H + +// Included Files +#include +#include "tcpip_types.h" + +// Macros +#define byteSwap16(a) ((((uint16_t)a & (uint16_t)0xFF00) >> 8) | (((uint16_t)a & (uint16_t)0x00FF) << 8)) +#define byteReverse32(a) ((((uint32_t)a & (uint32_t)0xff000000) >> 24) | \ + (((uint32_t)a & (uint32_t)0x00ff0000) >> 8) | \ + (((uint32_t)a & (uint32_t)0x0000ff00) << 8) | \ + (((uint32_t)a & (uint32_t)0x000000ff) << 24)) + +#define byteReverse24(a) (((((uint32_t)a & (uint32_t)0x00FF00) >> 8) | (((uint32_t)a & (uint32_t)0x0000FF) << 8)) << 8 | (uint32_t)a >> 0x10) + +// Host-to-network and network-to-host macros +#ifndef htons +#define htons(a) byteSwap16(a) +#endif +#ifndef ntohs +#define ntohs(a) byteSwap16(a) +#endif +#ifndef htonl +#define htonl(a) byteReverse32(a) +#endif +#ifndef ntohl +#define ntohl(a) byteReverse32(a) +#endif + +#define convert_hton24(a) byteReverse24(a) + +// Network Functions +/** + * @ingroup tcpiplite + * @brief Initializes the network protocols. + * @param None. + * @return None. + */ +void Network_Init(void); + +/** + * @ingroup tcpiplite + * @brief Reads the packets in the network. + * @param None. + * @return None. + */ +void Network_Read(void); + +/** + * @ingroup tcpiplite + * @brief Handles the packets in the network. + * @param None. + * @return None. + */ +void Network_Manage(void); + +/** + * @ingroup tcpiplite + * @brief Waits for the link by reading the PHY registers. + * @param None. + * @return None. + */ +void Network_WaitForLink(void); + +/** + * @ingroup tcpiplite + * @brief Returns the network start position. + * @param None. + * @return Start position. + */ +uint16_t Network_GetStartPosition(void); + +/** + * @ingroup tcpiplite + * @brief Initializes the timers. + * @param None. + * @return None. + */ +void timersInit(void); + +#endif /* NETWORK_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/rtcc.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/rtcc.h new file mode 100644 index 0000000..8697fd3 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/rtcc.h @@ -0,0 +1,87 @@ +/** + * RTCC Header File + * + * @file rtcc.h + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for the Real-Time Clock/Calendar (RTCC). + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef RTCC_H +#define RTCC_H + +// Included Files +#include +#include + + +// Variables +extern volatile bool dirtyTime; + +// RTCC Functions +/** + * @ingroup tcpiplite + * @brief Initializes the clock calendar driver. + * This routine configures the basics of a software-driven RTCC peripheral. + * It relies upon a periodic timer event to provide time keeping. + * The appropriate timer needs to be selected in the TCP/IP Lite Dependency. + * Configure the selected timer to produce a time-out of 1s. Set the callback rate as 1, + * if required depending on the device. + * @param None. + * @return None. + */ +void rtcc_init(void); + +/** + * @ingroup tcpiplite + * @brief Maintains the deviceTime (seconds) using the LCDIF flag/interrupt. + * This routine decrements seconds_counter until 0 and then increments deviceTime. + * seconds_counter reloads with CLOCK_PER_SEC. It uses the timer selected as the Dependency by the user. + * @param None. + * @return None. + */ +void rtcc_handler(void); + +/** + * @ingroup tcpiplite + * @brief Sets the device time to the passed unix time value and + * updates the device time with the passed unix time. + * Interrupts are disabled during the copy and restored to the original on exit. + * @param *t A pointer of type time_t for the current time + * @return None. + */ +void rtcc_set(time_t *t); + +/** + * @ingroup tcpiplite + * @brief Returns the current device time. + * This routine retrieves the device time as either a return value or + * filling in a variable passed by reference. + * Interrupts are disabled during the copy and restored to the original on exit. + * time.h is a prerequisite for supporting the standard C time libraries + * and does not implement time, as it is application dependent. + * @param *t A pointer of type time_t for the current time + * @return Value of the current time. + */ +time_t time(time_t *t); + +#endif /* RTCC_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/arpv4.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/arpv4.c new file mode 100644 index 0000000..701639f --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/arpv4.c @@ -0,0 +1,233 @@ +/** + * ARP v4 Implementation Source File + * + * @file arpv4.c + * + * @ingroup arp + * + * @brief This file provides the API implementation for the Address Resolution Protocol (ARP) v4. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include +#include "../tcpip_types.h" +#include "../network.h" +#include "../arpv4.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../ipv4.h"// needed to know my IP address +#include "../tcpip_config.h" +#include "../ip_database.h" + +// Macros +#define ARP_REQUEST 1 +#define ARP_REPLY 2 +#define ARP_NAK 10 + +// Structs +/** + * @ingroup arp + * @struct arpHeader_t + * @brief Contains the ARP information. + */ +typedef struct +{ + uint16_t htype; /** 0; x--) + { + if( (ntohl(header.spa) == entryPointer->ipAddress) && (header.ptype == entryPointer->protocolType)) + { + entryPointer->age = 0; // Reset the age + entryPointer->macAddress.s = header.sha.s; + mergeFlag = true; + break; + } + entryPointer++; + } + + if(ipdb_getAddress() && (ipdb_getAddress() == ntohl(header.tpa))) + { + if(!mergeFlag) + { + // Find the oldest entry in the table + entryPointer = arpMap; + arpMap_t *arpPtr = arpMap; + for(uint8_t x=ARP_MAP_SIZE; x !=0; x--) + { + if(entryPointer->age < arpPtr->age) + { + entryPointer = arpPtr; + } + /* Increment the pointer to get the next element from the array. */ + arpPtr++; + } + // The entry_pointer is now pointing to the oldest entry + // Replace the entry with the received data + entryPointer->age = 0; + entryPointer->macAddress.s = header.sha.s; + entryPointer->ipAddress = ntohl(header.spa); + entryPointer->protocolType = header.ptype; + } + if(header.oper == ntohs(ARP_REQUEST)) + { + ret = (error_msg)ETH_WriteStart(&header.sha ,ETHERTYPE_ARP); + if(ret == SUCCESS) + { + + header.tha.s = header.sha.s; + memcpy((void*)&header.sha.s, (void*)&hostMacAddress.s, sizeof(mac48Address_t)); + header.tpa = header.spa; + header.spa = htonl(ipdb_getAddress()); + header.oper = htons(ARP_REPLY); + ETH_WriteBlock((char*)&header,sizeof(header)); + + + ret = (error_msg)ETH_Send(); + } + } + } + else + { + ret = ARP_IP_NOT_MATCHED; + } + } + return ret; +} + +void ARPV4_Update(void) +{ + arpMap_t *entryPointer = arpMap; + for(uint8_t x=0; x < ARP_MAP_SIZE; x++) + { + entryPointer->age ++; + entryPointer ++; + } +} + +error_msg ARPV4_Request(uint32_t destAddress) +{ + error_msg ret; + + ret = ERROR; + + arpHeader_t header; + header.htype = htons(1); + header.ptype = htons(0x0800); + header.hlen = 6; + header.plen = 4; + header.oper = htons(ARP_REQUEST); + memcpy((void*)&header.sha, (void*)&hostMacAddress, sizeof(mac48Address_t)); + header.spa = htonl(ipdb_getAddress()); + header.tpa= htonl(destAddress); + header.tha.s.byte1 = 0; + header.tha.s.byte2 = 0; + header.tha.s.byte3 = 0; + header.tha.s.byte4 = 0; + header.tha.s.byte5 = 0; + header.tha.s.byte6 = 0; + + ret = (error_msg)ETH_WriteStart(&broadcastMAC,ETHERTYPE_ARP); + if(ret == SUCCESS) + { + ETH_WriteBlock((char*)&header,sizeof(arpHeader_t)); + ret = (error_msg)ETH_Send(); + if(ret == SUCCESS) + { + return MAC_NOT_FOUND; + } + } + return ret; +} + +mac48Address_t* ARPV4_Lookup(uint32_t ip_address) +{ + arpMap_t *entry_pointer = arpMap; + uint8_t x; + + for(x = 0; x < ARP_MAP_SIZE; x++) + { + if(entry_pointer->ipAddress == ip_address) + return &entry_pointer->macAddress; + entry_pointer ++; + } + return 0; +} diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/dhcp_client.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/dhcp_client.c new file mode 100644 index 0000000..5eaef99 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/dhcp_client.c @@ -0,0 +1,579 @@ +/** + * DHCP v4 client Implementation Source File + * + * @file dhcp_client.c + * + * @ingroup dhcp + * + * @brief This file provides the API implementation for the DHCP client. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +//Included Files +#include +#include +#include +#include +#include +#include "../log.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../network.h" +#include "../udpv4.h" +#include "../udpv4_port_handler_table.h" +#include "../ipv4.h" +#include "../arpv4.h" +#include "../dhcp_client.h" +#include "../ip_database.h" +#include "../lfsr.h" + +// Macros +#ifdef ENABLE_NETWORK_DEBUG +#define logMsg(msg, msgSeverity, msgLogDest) logMessage(msg, LOG_DHCP, msgSeverity, msgLogDest) +#else +#define logMsg(msg, msgSeverity, msgLogDest) +#endif +#define DHCP_HEADER_SIZE 240 + +#if ( DHCP_PACKET_SIZE & 1) +#define ZERO_PAD_DHCP +#define DHCP_REQUEST_LENGTH (DHCP_PACKET_SIZE + 1) +#else +#undef ZERO_PAD_DHCP +#define DHCP_REQUEST_LENGTH DHCP_PACKET_SIZE +#endif + +static mac48Address_t ethMAC; + +// Enumerations +/** + * @ingroup dhcp + * @enum dhcp_type + * @brief Contains DCHP request types. + */ +typedef enum +{ + DHCP_DISCOVER = 1, + DHCP_OFFER, DHCP_REQUEST, DHCP_DECLINE, DHCP_ACK, DHCP_NACK, DHCP_RELEASE, + DHCP_INFORM, DHCP_FORCERENEW, DHCP_LEASEQUERY, DHCP_LEASEUNASSIGNED, DHCP_LEASEUNKNOWN, + DHCP_LEASEACTIVE, DHCP_BULKLEASEQUERY, DHCP_LEASEQUERYDONE +}dhcp_type; + +/** + * @ingroup dhcp + * @enum dhcp_rx_client_state + * @brief Contains the DCHP RX Client state. + */ +typedef enum +{ + SELECTING, REQUESTING, RENEWLEASE, BOUND +}dhcp_rx_client_state; + +/** + * @ingroup dhcp + * @enum dhcp_timer_client_state + * @brief Contains the DCHP Timer Client state. + */ +typedef enum +{ + INIT_TIMER, WAITFORTIMER, STARTDISCOVER, STARTREQUEST +}dhcp_timer_client_state; + +// Structs +/** + * @ingroup dhcp + * @struct dhcp_data_t + * @brief Contains option data + */ +typedef struct +{ + uint32_t dhcpIPAddress; /** DHCP_HEADER_SIZE) + { + logMsg("DHCP PROCESSING", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + if (0x0201 == UDP_Read16()) + { + if (0x06 == UDP_Read8()) // HLEN - is set to 6 because an Ethernet address is 6 Octets long + { + UDP_Read8(); // HOPS + if (dhcpData.xidValue == UDP_Read32()) // xid check + { + UDP_Read16(); // SECS + UDP_Read16(); // FLAGS + UDP_Read32(); // CIADDR + localData.dhcpIPAddress = UDP_Read32(); // YIADDR + if ((localData.dhcpIPAddress != SPECIAL_IPV4_BROADCAST_ADDRESS) && (localData.dhcpIPAddress != LOCAL_HOST_ADDRESS)) + { + siaddr = UDP_Read32(); // SIADDR + if ((siaddr != SPECIAL_IPV4_BROADCAST_ADDRESS) && (siaddr != LOCAL_HOST_ADDRESS)) + { + UDP_Read32(); // GIADDR + UDP_ReadBlock(chaddr, sizeof(chaddr)); // Read chaddr + if (memcmp(chaddr, &hostMacAddress.s, 6) == 0 + || memcmp(chaddr, &broadcastMAC.s, 6) == 0 + || (strlen((char *)chaddr) == 0)) // only compare 6 bytes of MAC address. + { + ETH_Dump(64); // drop SNAME + ETH_Dump(128); // drop the filename + if (UDP_Read32() == 0x63825363) + { + length -= DHCP_HEADER_SIZE; + while (length > 0) + { + // options are here!!! + uint8_t option, optionLength; + option = UDP_Read8(); + optionLength = UDP_Read8(); + length -= 2 + optionLength; + switch (option) + { + case 1: // subnet mask + logMsg("DHCP option 1", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + localData.subnetMask = UDP_Read32(); + break; + case 3: // router + logMsg("DHCP option 3", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + localData.routerAddress = UDP_Read32(); + break; + case 6: // DNS List + { + uint8_t count = 0; + logMsg("DHCP option 6", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + while (optionLength >= 4) + { + uint32_t a = UDP_Read32(); + if (count < 2) + localData.dnsAddress[count++] = a; + + optionLength -= 4; + } + } + break; + case 42: // NTP server + { + uint8_t count = 0; + logMsg("DHCP option 42", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + while (optionLength >= 4) + { + uint32_t a = UDP_Read32(); + if (count < 2) + localData.ntpAddress[count++] = a; + + optionLength -= 4; + } + } + break; + case 51: // lease time + logMsg("DHCP option 51", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + if (optionLength >= 4) + { + uint32_t origLeaseTime; + + origLeaseTime = UDP_Read32(); + // localData.t2 = localData.t1 - 100; // 100 seconds faster for requests + localData.t1 = origLeaseTime >> 1; // be default set to 1/2 the lease length + localData.t2 = localData.t1; // be default set to 1/2 the lease length + origLeaseTime = localData.t1 >> 1; + localData.t2 += origLeaseTime; + localData.t2 += origLeaseTime >> 1; + + optionLength -= 4; + } + break; + case 54: // DHCP server + logMsg("DHCP option 54", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + localData.dhcpServerIdentifier = UDP_Read32(); + // printf("case54:%u\r\n",localData.dhcpServerIdentifier); + optionLength -= 4; + break; + case 53: + logMsg("DHCP option 53", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + messageType = UDP_Read8(); + optionLength -= 1; + break; + default: + ETH_Dump(optionLength); // dump any unused bytes + break; + } // option switch + } // length loop + } // Testing Vendor Information "Magic Cookie" (RFC1497) + else + { + logMsg("DHCP failed Magic Cookie check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } + } // MAC address test + else + { + logMsg("DHCP fail MAC address check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + return; + } + } // SIADDR test + else + { + logMsg("DHCP fail SIADDR check", LOG_WARNING, (LOG_DEST_CONSOLE)); + } + } // YIADDR test + else + { + logMsg("DHCP fail YIADDR check", LOG_WARNING, (LOG_DEST_CONSOLE)); + } + } // xid test + else + { + logMsg("DHCP fail XID check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } + } // HLEN test + else + { + logMsg("DHCP fail Hardware Length", LOG_WARNING, (LOG_DEST_CONSOLE)); + } + } // 201 test + else + { + logMsg("DHCP fail 201 check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } + } // Short packet test + else + { + logMsg("DHCP fail short packet check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } + switch (messageType) + { + case DHCP_OFFER: + if (acceptOffers) + { + dhcpData = localData; // capture the data in the offer + sendDHCPREQUEST(); + dhcpState.rxClientState = REQUESTING; + } + if (declineOffers) + { + sendDHCPDECLINE(); + } + break; + case DHCP_ACK: + if (acceptACK) + { + dhcpData.t1 = localData.t1; + dhcpData.t2 = localData.t2; + ipdb_setAddress(dhcpData.dhcpIPAddress); + ipdb_setDNS(0, dhcpData.dnsAddress[0]); + ipdb_setDNS(1, dhcpData.dnsAddress[1]); + ipdb_setRouter(dhcpData.routerAddress); + ipdb_setGateway(dhcpData.gatewayAddress); + ipdb_setSubNetMASK(dhcpData.subnetMask); + if (dhcpData.ntpAddress[0]) + { + ipdb_setNTP(0, dhcpData.ntpAddress[0]); + if (dhcpData.ntpAddress[1]) + ipdb_setNTP(1, dhcpData.ntpAddress[1]); + } + dhcpState.rxClientState = BOUND; + } + break; + case DHCP_NACK: + if (acceptNACK) + { + dhcpData.t1 = 4; + dhcpData.t2 = 2; + dhcpState.rxClientState = SELECTING; + } + break; + default: + break; + } + } // accept types test + else + { + logMsg("DHCP fail accept types check", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } +} + +void DHCP_WriteZeros(uint16_t length) +{ + while(length--) + { + UDP_Write8(0); + } +} diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/ip_database.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/ip_database.c new file mode 100644 index 0000000..82ca038 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/ip_database.c @@ -0,0 +1,74 @@ +/** + * IP Database Implementation Source File + * + * @file ip_database.c + * + * @ingroup ipv4 + * + * @brief This file provides the API implementation for the IP database. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include +#include "../ip_database.h" + +// Variables +ip_db_info_t ip_database_info; + +// IPDB Functions +void ipdb_init(void) +{ + ip_database_info.ipv4_myAddress = 0; + ip_database_info.ipv4_subnetMask = 0; + ip_database_info.ipv4_router = 0; + for(uint8_t x=0; x < MAX_DNS; x ++) + ip_database_info.ipv4_dns[x] = 0; + for(uint8_t x=0; x < MAX_NTP; x++) + ip_database_info.ipv4_ntpAddress[x] = 0; + ip_database_info.ipv4_tftpAddress = 0; +} + +uint32_t makeStrToIpv4Address(char *str) +{ + uint32_t ip_addr; + char *pch; + uint8_t field = 3; + pch = strtok(str,"."); + while(pch != NULL) + { + ((uint8_t *)&ip_addr)[field]= (uint8_t)atoi((const char*)pch); + field--; + pch = strtok (NULL,"."); + } + return ip_addr; +} + +char *makeIpv4AddresstoStr(uint32_t addr) +{ + static char ip_str[15]; + + sprintf(ip_str,"%d.%d.%d.%d",((char*)&addr)[3],((char*)&addr)[2],((char*)&addr)[1],((char*)&addr)[0]); + + return ip_str; +} diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/ipv4.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/ipv4.c new file mode 100644 index 0000000..58d6c3c --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/ipv4.c @@ -0,0 +1,287 @@ +/** + * IPv4 Implementation Source File + * + * @file ipv4.c + * + * @ingroup ipv4 + * + * @brief This file provides the API implementation for IPv4. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../network.h" +#include "../ipv4.h" +#include "../arpv4.h" +#include "../udpv4.h" +#include "../udpv4_port_handler_table.h" +#include "../tcpv4.h" +#include "../tcpip_types.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../log.h" +#include "../ip_database.h" + + +// Macros +#ifdef ENABLE_NETWORK_DEBUG +#define logMsg(msg, msgSeverity, msgLogDest) logMessage(msg, LOG_KERN, msgSeverity, msgLogDest) +#else +#define logMsg(msg, msgSeverity, msgLogDest) +#endif + + +// Variables +ipv4Header_t ipv4Header; + +uint32_t remoteIpv4Address; +// External IPV4 Function Prototypes +/** + * @ingroup ipv4 + * @brief Receives TCP packets + * @param remoteAddress Address of the remote device + * @param length Packet length + * @return None. + */ +extern void TCP_Recv(uint32_t remoteAddress, uint16_t length); + +/** + @ingroup ipv4 + @brief Returns the header length + @param None. + @return Length of the header. + */ +static uint8_t getHeaderLen(void); + +// Loacl IPV4 functions +void IPV4_Init(void) +{ + ipdb_init(); +} + +uint16_t IPV4_PseudoHeaderChecksum(uint16_t payloadLen) +{ + ipv4_pseudo_header_t tmp; + uint8_t *ptrPseudoHeader; + uint8_t lenPseudoHeader; + uint32_t cksm = 0; + + tmp.srcIpAddress = ipv4Header.srcIpAddress; + tmp.dstIpAddress = ipv4Header.dstIpAddress; + tmp.protocol = ipv4Header.protocol; + tmp.z = 0; + tmp.length = payloadLen; + + lenPseudoHeader = sizeof(tmp); + ptrPseudoHeader = (uint8_t *) &tmp; + + while(lenPseudoHeader) + { + cksm += (lenPseudoHeader & 1) ? (uint32_t)(*ptrPseudoHeader)<<8 : (uint32_t)(*ptrPseudoHeader); + ptrPseudoHeader++; + lenPseudoHeader--; + } + + // Adding back carry from top 16 bits to low 16 bits + cksm = (cksm & 0x0FFFF) + (cksm>>16); + + return (uint16_t)cksm; +} + +static uint8_t getHeaderLen(void) +{ + uint16_t rxptr; + uint8_t header_len = 0; + rxptr = ETH_GetReadPtr(); + header_len = ETH_Read8() & 0x0fu; + ETH_SetRxByteCount(ETH_GetRxByteCount()+1); + ETH_SetReadPtr(rxptr); + return (uint8_t)(header_len<<2) ; +} + +error_msg IPV4_Packet(void) +{ + uint16_t cksm = 0; + uint16_t length = 0; + uint8_t hdrLen; + // Calculate the IPv4 checksum + hdrLen = getHeaderLen(); + cksm = ETH_RxComputeChecksum(hdrLen, 0); + if (cksm != 0) + { + return IPV4_CHECKSUM_FAILS; + } + + ETH_ReadBlock((char *)&ipv4Header, sizeof(ipv4Header_t)); + if(ipv4Header.version != 4) + { + return IP_WRONG_VERSION; // Incorrect version number + } + + ipv4Header.dstIpAddress = ntohl(ipv4Header.dstIpAddress); + ipv4Header.srcIpAddress = ntohl(ipv4Header.srcIpAddress); + + if(ipv4Header.srcIpAddress == SPECIAL_IPV4_BROADCAST_ADDRESS) + return DEST_IP_NOT_MATCHED; + + if(ipv4Header.dstIpAddress == ipdb_getAddress() + || (ipv4Header.dstIpAddress == IPV4_ZERO_ADDRESS) + || (ipv4Header.dstIpAddress == SPECIAL_IPV4_BROADCAST_ADDRESS) + || ((ipdb_getAddress()|CLASS_A_IPV4_REVERSE_BROADCAST_MASK)== ipv4Header.dstIpAddress) + || ((ipdb_getAddress()|CLASS_B_IPV4_REVERSE_BROADCAST_MASK)== ipv4Header.dstIpAddress) + || ((ipdb_getAddress()|CLASS_C_IPV4_REVERSE_BROADCAST_MASK)== ipv4Header.dstIpAddress) + || (ipv4Header.dstIpAddress == ALL_HOST_MULTICAST_ADDRESS)) + { + ipv4Header.length = ntohs(ipv4Header.length); + + hdrLen = (uint8_t)(ipv4Header.ihl << 2); + + if(ipv4Header.ihl < 5) + return INCORRECT_IPV4_HLEN; + + if (ipv4Header.ihl > 5) + { + // Do not process the IPv4 Options field + ETH_Dump((uint16_t)(hdrLen - sizeof(ipv4Header_t))); + } + + switch((ipProtocolNumbers)ipv4Header.protocol) + { + case UDP_TCPIP: + // Check the UDP header checksum + logMsg("IPv4 RX UDP", LOG_INFO, LOG_DEST_CONSOLE); + length = ipv4Header.length - hdrLen; + cksm = IPV4_PseudoHeaderChecksum(length); // Calculate pseudo header checksum + cksm = ETH_RxComputeChecksum(length, cksm); // 1's complement of pseudo header checksum + 1's complement of UDP header, data + UDP_Receive(cksm); + break; + case TCP_TCPIP: + // Accept only uni cast TCP packets + // Check the TCP header checksum + logMsg("IPv4 RX TCP", LOG_INFO, LOG_DEST_CONSOLE); + length = ipv4Header.length - hdrLen; + cksm = IPV4_PseudoHeaderChecksum(length); + cksm = ETH_RxComputeChecksum(length, cksm); + + // Accept only packets with valid CRC Header + if (cksm == 0 && (ipv4Header.dstIpAddress != SPECIAL_IPV4_BROADCAST_ADDRESS) && (ipv4Header.dstIpAddress != IPV4_ZERO_ADDRESS)) + { + remoteIpv4Address = ipv4Header.srcIpAddress; + TCP_Recv(remoteIpv4Address, length); + } + else + { + logMsg("IPv4 RX bad TCP chksm", LOG_DEBUG, LOG_DEST_CONSOLE); + } + break; + default: + ETH_Dump(ipv4Header.length); + break; + } + return SUCCESS; + } + else + { + return DEST_IP_NOT_MATCHED; + } +} + +error_msg IPv4_Start(uint32_t dstAddress, ipProtocolNumbers protocol) +{ + error_msg ret = ERROR; + // Get the destination MAC address + const mac48Address_t *destMacAddress; + uint32_t targetAddress; + + // Check if there is a valid IP address and if it is different from 127.0.0.1 + if(((ipdb_getAddress() != 0) || (protocol == UDP_TCPIP)) + && (ipdb_getAddress() != 0x7F000001)) + { + if(((dstAddress == SPECIAL_IPV4_BROADCAST_ADDRESS) + |((dstAddress | CLASS_A_IPV4_BROADCAST_MASK) == SPECIAL_IPV4_BROADCAST_ADDRESS) + |((dstAddress | CLASS_B_IPV4_BROADCAST_MASK) == SPECIAL_IPV4_BROADCAST_ADDRESS) + |((dstAddress | CLASS_C_IPV4_BROADCAST_MASK) == SPECIAL_IPV4_BROADCAST_ADDRESS))==0) // This is NOT a broadcast message + { + if( ((dstAddress ^ ipdb_getAddress()) & ipdb_getSubNetMASK()) == 0) + { + targetAddress = dstAddress; + } + else + { + targetAddress = ipdb_getRouter(); + } + destMacAddress= ARPV4_Lookup(targetAddress); + if(destMacAddress == 0) + { + ret = ARPV4_Request(targetAddress); // Schedule an arp request + return ret; + } + } + else + { + destMacAddress = &broadcastMAC; + } + ret = (error_msg)ETH_WriteStart(destMacAddress, ETHERTYPE_IPV4); + if(ret == SUCCESS) + { + ETH_Write16(0x4500); // VERSION, IHL, DSCP, ECN + ETH_Write16(0); // Total packet length + ETH_Write32(0xAA554000); // My IPv4 Magic Number..., FLAGS, Fragment Offset + ETH_Write8(IPv4_TTL); // TTL + ETH_Write8(protocol); // protocol + ETH_Write16(0); // Checksum will be set to zero and overwritten with correct value + ETH_Write32(ipdb_getAddress()); + ETH_Write32(dstAddress); + + // Fill the pseudo header for checksum calculation + ipv4Header.srcIpAddress = ipdb_getAddress(); + ipv4Header.dstIpAddress = dstAddress; + ipv4Header.protocol = protocol; + } + } + return ret; +} + +error_msg IPV4_Send(uint16_t payloadLength) +{ + uint16_t totalLength; + uint16_t cksm; + error_msg ret; + + totalLength = 20 + payloadLength; + totalLength = ntohs(totalLength); + + // Insert IPv4 Total Length + ETH_Insert((char *)&totalLength, 2, sizeof(ethernetFrame_t) + offsetof(ipv4Header_t, length)); + + cksm = ETH_TxComputeChecksum(sizeof(ethernetFrame_t), sizeof(ipv4Header_t), 0); + // Insert Ipv4 Header Checksum + ETH_Insert((char *)&cksm, 2, sizeof(ethernetFrame_t) + offsetof(ipv4Header_t, headerCksm)); + ret = (error_msg)ETH_Send(); + + return ret; +} + +uint16_t IPV4_GetDatagramLength(void) +{ + return ((ipv4Header.length) - sizeof(ipv4Header_t)); +} \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/lfsr.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/lfsr.c new file mode 100644 index 0000000..2d55602 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/lfsr.c @@ -0,0 +1,81 @@ +/** + * LFSR Implementation Source File + * + * @file lfsr.c + * + * @ingroup tcpiplite + * + * @brief This file provides the API prototypes for the Linear Feedback Shift Register (LFSR) module. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include "../lfsr.h" + +// Macros +#define lfsr_seed 0x40 +#define lfsrOutputMask 0x7fu + +// Variables +static uint8_t sequenceIndex = 0; +const lfsr_t xorSequences[] = {0x41,0x44,0x47,0x48,0x4E,0x53,0x55,0x5C,0x5F,0x60,0x65,0x69,0x6A,0x72,0x77,0x78,0x7B,0x7E}; +lfsr_t xor_mask = 0x41; // note this comes from the first entry in the sequence list +lfsr_t lfsr_value = lfsr_seed; + +// LFSR functions +lfsr_t lfsr_getSequence(void) +{ + return xorSequences[sequenceIndex]; +} + +int lfsr_getSequenceCount(void) +{ + return sizeof(xorSequences)/sizeof(*xorSequences); +} + +void lfsr_reset(void) +{ + lfsr_value = lfsr_seed; +} + +void lfsr_setSequence(uint16_t s) +{ + s %= sizeof(xorSequences)/sizeof(*xorSequences); + xor_mask = xorSequences[s]; +} + +lfsr_t lfsr(void) +{ + unsigned char lsb = lfsr_value & 1u; + lfsr_value >>= 1u; + if (lsb) + lfsr_value ^= xor_mask; + return lfsr_value & lfsrOutputMask; +} + +lfsr_t lfsrWithSeed(uint8_t lfsrSeed) +{ + lfsr_value = lfsrSeed; + unsigned char lsb = lfsr_value & 1u; + lfsr_value >>= 1; + if (lsb) + lfsr_value ^= xor_mask; + return lfsr_value & lfsrOutputMask; +} diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/log.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/log.c new file mode 100644 index 0000000..1697329 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/log.c @@ -0,0 +1,151 @@ +/** + * Message Logging Implementation Source File + * + * @file log.c + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for message logging. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include +#include "../rtcc.h" +#include "../log.h" +#include "../log_console.h" +#include "../log_syslog.h" + +// Macros +/** + * @ingroup tcpiplite + * @def LOG_PRIMASK + * @brief Mask to extract priority part (internal) + */ +#define LOG_PRIMASK 0x07 + +/** + * @ingroup tcpiplite + * @def LOG_PRI(p) + * @brief Extract priority + */ +#define LOG_PRI(p) ((p) & LOG_PRIMASK) + +/** + * @ingroup tcpiplite + * @def LOG_NFACILITIES + * @brief Current number of facilities + */ +#define LOG_NFACILITIES 24 + +/** + * @ingroup tcpiplite + * @def LOG_FACMASK + * @brief Mask to extract facility part + */ +#define LOG_FACMASK 0x03f8 + +/** + * @ingroup tcpiplite + * @def LOG_FAC(p) + * @brief Facility of priority + */ +#define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3) +#define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri)) + +// Arguments to setlogmask +/** + * @ingroup tcpiplite + * @def LOG_MASK(pri) + * @brief Mask for one priority + */ +#define LOG_MASK(pri) (1 << (pri)) + +/** + * @ingroup tcpiplite + * @def LOG_UPTO(pri) + * @brief All priorities through PRI + */ +#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1) +#define LOG_NILVALUE "-" + +LOG_SEVERITY limit[LOG_LAST]; // one limit per facility + +const logFields_t severityThresholdTable[] = { + { LOG_KERN, LOG_INFO }, + { LOG_DTLS, LOG_NOTICE }, + { LOG_ECC, LOG_NOTICE }, + { LOG_DAEMON, LOG_INFO }, + { LOG_AUTH, LOG_NOTICE }, + { LOG_SYSLOG, LOG_NOTICE }, + { LOG_LPR, LOG_INFO }, + { LOG_NEWS, LOG_NOTICE }, + { LOG_TFTP, LOG_INFO }, + { LOG_UUID, LOG_NOTICE }, + { LOG_COAP, LOG_NOTICE }, + { LOG_FTP, LOG_NOTICE }, + { LOG_NTP, LOG_INFO }, + { LOG_HTTP, LOG_NOTICE }, + { LOG_SNMP, LOG_NOTICE }, + { LOG_RTCC, LOG_NOTICE }, + { LOG_CBOR, LOG_INFO }, + { LOG_UDP, LOG_NOTICE }, + { LOG_TCP, LOG_NOTICE }, + { LOG_DHCP, LOG_INFO }, + { LOG_DNS, LOG_NOTICE }, + { LOG_LLDP, LOG_INFO }, + { LOG_LINK, LOG_NOTICE }, + + { LOG_LAST, LOG_NOTICE } +}; + +// Logging function definitions +void LOG_Init(void) +{ + unsigned long t = (unsigned long)time(0); + printf("\n\nStarting Syslog at %lu\n",t); + for(uint8_t x=0;x +#include +#include +#include "../../system/system.h" +#include "../log.h" +#include "../ip_database.h" + +// Log Console Functions +uint8_t logConsole(const char *message, uint8_t priorityVal) +{ + struct tm * SYSLOG_time1; + time_t time1; + unsigned long ip; + + ip = ipdb_getAddress(); + time1 = time(NULL); + SYSLOG_time1 = gmtime(&time1); + + printf("<%d>%d %d-%.2d-%.2dT%.2d:%.2d:%.2dZ %d.%d.%d.%d %s %s %s %s[%s]\r\n", priorityVal, SYSLOG_VERSION, SYSLOG_time1->tm_year, SYSLOG_time1->tm_mon, SYSLOG_time1->tm_mday, SYSLOG_time1->tm_hour, SYSLOG_time1->tm_min, SYSLOG_time1->tm_sec, ((char*)&ip)[3],((char*)&ip)[2],((char*)&ip)[1],((char*)&ip)[0], LOG_NILVALUE, LOG_NILVALUE, LOG_NILVALUE, LOG_NILVALUE, message); + return 1; +} diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/log_syslog.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/log_syslog.c new file mode 100644 index 0000000..9e9b2ad --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/log_syslog.c @@ -0,0 +1,79 @@ +/** + * Sending Syslog Source File + * + * @file log_syslog.c + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for sending syslog messages. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../../system/system.h" +#include "../log.h" +#include "../tcpip_types.h" +#include "../udpv4.h" +#include "../udpv4_port_handler_table.h" +#include "../ip_database.h" +#include "../log_syslog.h" + +// Syslog Functions +error_msg logSyslog(const char *message, uint8_t priorityVal) +{ + char storage[12]; + struct tm * SYSLOG_time1; + time_t time1; + error_msg error; + unsigned long ip; + + ip = ipdb_getAddress(); + time1 = time(NULL); + error = UDP_Start(0xFFFFFFFF,SOURCEPORT_SYSLOG,DESTPORT_SYSLOG); + + if( SUCCESS == error) + { + SYSLOG_time1 = gmtime(&time1); + sprintf(storage,"<%d>%d ",priorityVal, SYSLOG_VERSION); + UDP_WriteString(storage); + sprintf(storage,"%d-%.2d-%.2d",SYSLOG_time1->tm_year, SYSLOG_time1->tm_mon, SYSLOG_time1->tm_mday); + UDP_WriteString(storage); + sprintf(storage,"T%.2d:%.2d:%.2dZ",SYSLOG_time1->tm_hour, SYSLOG_time1->tm_min, SYSLOG_time1->tm_sec); + UDP_WriteString(storage); + sprintf(storage," %d.%d.%d.%d",((char*)&ip)[3],((char*)&ip)[2],((char*)&ip)[1],((char*)&ip)[0]); //Hostnmame + UDP_WriteString(storage); + sprintf(storage," %s", LOG_NILVALUE); // App-name + UDP_WriteString(storage); + sprintf(storage," %s", LOG_NILVALUE); // Procid + UDP_WriteString(storage); + sprintf(storage," %s", LOG_NILVALUE); // Msgid + UDP_WriteString(storage); + sprintf(storage," %s[", LOG_NILVALUE); // Structured data + UDP_WriteString(storage); + UDP_WriteString(message); + sprintf(storage,"]"); // Structured data + UDP_WriteString(storage); + UDP_Send(); + } + return error; +} diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/network.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/network.c new file mode 100644 index 0000000..59bd027 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/network.c @@ -0,0 +1,167 @@ +/** + * Network Source File + * + * @file network.c + * + * @ingroup tcpiplite + * + * @brief This file provides the network layer implementation for the TCP/IP stack. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include +#include "../../system/system.h" +#include "../network.h" +#include "../tcpip_types.h" +#include "../dhcp_client.h" +#include "../arpv4.h" +#include "../ipv4.h" +#include "../tcpv4.h" +#include "../rtcc.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../log.h" +#include "../ip_database.h" + +// Macros +#ifdef ENABLE_NETWORK_DEBUG +#define logMsg(msg, msgSeverity, msgLogDest) logMessage(msg, LOG_KERN, msgSeverity, msgLogDest) +#else +#define logMsg(msg, msgSeverity, msgLogDest) +#endif + +time_t arpTimer; +static void Network_SaveStartPosition(void); +uint16_t networkStartPosition; + +const char *network_errors[] = { + "ERROR", "SUCCESS", "LINK_NOT_FOUND", "BUFFER_BUSY", + "TX_LOGIC_NOT_IDLE", "MAC_NOT_FOUND", + "IP_WRONG_VERSION", "IPV4_CHECKSUM_FAILS", + "DEST_IP_NOT_MATCHED", "ICMP_CHECKSUM_FAILS", + "UDP_CHECKSUM_FAILS", "TCP_CHECKSUM_FAILS", + "DMA_TIMEOUT", "PORT_NOT_AVAILABLE", + "ARP_IP_NOT_MATCHED", "EAPol_PACKET_FAILURE"}; + +// Network Functions +void Network_Init(void) +{ + ETH_Init(); + ARPV4_Init(); + IPV4_Init(); + DHCP_init(); + TCP_Init(); + rtcc_init(); + Network_WaitForLink(); + timersInit(); + #ifdef ENABLE_NETWORK_DEBUG + LOG_Init(); + #endif +} + +void timersInit(void) +{ + time(&arpTimer); + arpTimer += 10; +} + +void Network_WaitForLink(void) +{ + while(!ETH_CheckLinkUp()) NOP(); +} + +void Network_Manage(void) +{ + time_t now; + static time_t nowPv = 0; + + ETH_EventHandler(); + Network_Read(); // handle any packets that have arrived... + DHCP_Manage(); // update the DHCP status every second + + // manage any outstanding timeouts + time(&now); + if(now >= arpTimer) + { + ARPV4_Update(); + arpTimer = now + 10; + } + if(now > nowPv) // at least 1 second has elapsed + { + // is defined as a minimum of 1 seconds in RFC973 + TCP_Update(); // handle timeouts + } + nowPv = now; +} + +void Network_Read(void) +{ + ethernetFrame_t header; + char debug_str[80]; + + if(ETH_packetReady()) + { + ETH_NextPacketUpdate(); + ETH_ReadBlock((char *)&header, sizeof(header)); + header.id.type = ntohs(header.id.type); // reverse the type field + Network_SaveStartPosition(); + switch (header.id.type) + { + case ETHERTYPE_VLAN: + logMsg("VLAN Packet Dropped", LOG_INFO, (LOG_DEST_CONSOLE|LOG_DEST_ETHERNET)); + break; + case ETHERTYPE_ARP: + logMsg("RX ARPV4 Packet", LOG_INFO, (LOG_DEST_CONSOLE|LOG_DEST_ETHERNET)); + ARPV4_Packet(); + break; + case ETHERTYPE_IPV4: + logMsg("RX IPV4 Packet", LOG_INFO, (LOG_DEST_CONSOLE|LOG_DEST_ETHERNET)); + IPV4_Packet(); + break; + default: + { + long t = header.id.type; + if(t < 0x05dc) // this is a length field + { + sprintf(debug_str,"802.3 length 0x%04lX",t); + } + else + sprintf(debug_str,"802.3 type 0x%04lX",t); + + logMsg(debug_str, LOG_INFO, (LOG_DEST_CONSOLE|LOG_DEST_ETHERNET)); + } + break; + } + ETH_Flush(); + } +} + +static void Network_SaveStartPosition(void) +{ + networkStartPosition = ETH_GetReadPtr(); +} + +uint16_t Network_GetStartPosition(void) +{ + return networkStartPosition; +} diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/rtcc.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/rtcc.c new file mode 100644 index 0000000..470d392 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/rtcc.c @@ -0,0 +1,81 @@ +/** + * RTCC Implementation Source File + * + * @file rtcc.c + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for the RTCC. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../rtcc.h" +#include "../../system/system.h" + +// Variables +volatile time_t deviceTime; +volatile bool dirtyTime; + +volatile uint16_t seconds_counter; + +// Local RTCC Function Prototypes + +void rtcc_init(void) +{ + deviceTime = 1293861600; + TCA0_OverflowCallbackRegister(rtcc_handler); +} + +void rtcc_handler(void) +{ + deviceTime++; +} + +void rtcc_set(time_t *t) +{ + volatile uint8_t sreg_val; + sreg_val = SREG; + DISABLE_INTERRUPTS(); + deviceTime = *t; + SREG = sreg_val; +} + +time_t time(time_t *t) +{ + time_t the_time; + + volatile uint8_t sreg_val; + + sreg_val = SREG; + DISABLE_INTERRUPTS(); + the_time = deviceTime; + SREG = sreg_val; + if(t) + { + *t = the_time; + } + + return (the_time); +} + diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/tcpv4.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/tcpv4.c new file mode 100644 index 0000000..3dcc977 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/tcpv4.c @@ -0,0 +1,1564 @@ +/** + * Transmission Control Protocol version4 (TCPv4) Implementation Source File + * + * @file tcpv4.c + * + * @ingroup tcp + * + * @brief This file provides the API implementation for the TCPv4 stack. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../ipv4.h" +#include "../tcpv4.h" +#include "../network.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../tcpip_types.h" +#include "../log.h" +#include "../tcpip_config.h" + +// Variables +tcpTCB_t *tcbList; +socklistsize_t tcbListSize; +tcpTCB_t *currentTCB; + +static tcpHeader_t tcpHeader; +static uint16_t nextAvailablePort; +static uint32_t nextSequenceNumber; + +static uint32_t receivedRemoteAddress; +static uint16_t rcvPayloadLen; +static uint16_t tcpMss = 536; + +static uint16_t tcpDataLength; +static uint16_t bytesToSendForRetransmit = 0; +static uint8_t *txBufferPtrForRetransmit; +static uint32_t localSeqnoForRetransmit; +static uint32_t lastAckNumber; + +#ifdef ENABLE_NETWORK_DEBUG +#define logMsg(msg, msgSeverity, msgLogDest) logMessage(msg, LOG_KERN, msgSeverity, msgLogDest) +#else +#define logMsg(msg, msgSeverity, msgLogDest) +#endif + +// Local TCP Public Interface Function Prototypes +/** + * @ingroup tcp + * @brief TCP stack state machine called upon the occurrence of each event + * (e.g., opening/closing a connection, receiving a TCP packet). + * @param None. + * @return Error status. Refer to the error description in tcpip_types.h. + */ +static error_msg TCP_FiniteStateMachine(void); + +/** + * @ingroup tcp + * @brief Retransmits TCP packets after timeout + * @param None. + * @return Error status. Refer to the error description in tcpip_types.h. + */ +static error_msg TCP_TimoutRetransmit(void); + +/** + * @ingroup tcp + * @brief Inserts a pointer to the new TCB into the TCB pointer list. + * @param *ptr Pointer to the user-allocated memory for the TCB structure + * @return None. + */ +static void TCB_Insert(tcpTCB_t *ptr); + +/** + * @ingroup tcp + * @brief Removes a pointer to a TCB from the TCB pointer list and connects its adjacent items together. + * @param *ptr Pointer to the user-allocated memory for the TCB structure + * @return None. + */ +static void TCB_Remove(tcpTCB_t *ptr); + +/** + * @ingroup tcp + * @brief Resets the socket to a known state. + * @param *tcbPtr Pointer to the socket/TCB structure + * @return None. + */ +static void TCB_Reset(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Check if there is a pointer to a socket/TCB. If the pointer is in the TCB list, then it is a valid socket. + * @param *ptr Pointer to the socket/TCB structure + * @return Error status. Refer to the error description in tcpip_types.h. + */ +static error_msg TCB_Check(tcpTCB_t *ptr); + +/** + * @ingroup tcp + * @brief Internal function of the TCP stack to send a TCP packet. + * @param *tcbPtr Pointer to the socket/TCB structure + * @retval True Sending the buffer succeeded + * @retval False Sending the buffer failed + */ +static error_msg TCP_Snd(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Copies the TCP packet payload to the socket RX buffer. + * This routine also sends the ACK for the received packet and any data ready to be sent. + * @param len Length of the payload received + * @retval True Copying the payload to the RX buffer succeeded + * @retval False Copying the payload to the RX buffer failed + */ +error_msg TCP_PayloadSave(uint16_t len); + +/** + * @ingroup tcp + * @brief Reads and parses the Options field in the TCP header. + * This routine reads only the ones that have SYN or SYN + ACK. + * For the other TCP headers the field will be skipped. + * @param None. + * @retval True Parsing the Options field succeeded + * @retval False Parsing the Options field failed + */ +static error_msg TCP_ParseTCPOptions(void); + +/** + * @ingroup tcp + * @brief Identifies the destination socket and parses the TCP header. + * This routine is called by the IP layer for each received TCP packet. + * @param remoteAddress Source IP address for the received TCP packet + * @param length Length of the TCP payload + * @return None. + */ +void TCP_Recv(uint32_t remoteAddress, uint16_t length); + +// TCP Public Interface Function Definitions +static void TCB_Insert(tcpTCB_t *ptr) +{ + // Insert the new TCB at the head of the list. + // This prevents a list traversal and saves time. + if (tcbList != NULL) + { + // Link this TCB as the previous one for the top of the list + tcbList->prevTCB = ptr; + } + ptr->nextTCB = tcbList; // Put the existing list at the end of this tcb. + tcbList = ptr; // Put this tcb at the head of the list. + ptr->prevTCB = NULL; // Make sure that the upstream pointer is empty. + tcbListSize++; +} + +static void TCB_Remove(tcpTCB_t *ptr) +{ + if (tcbListSize > 1) + { + // check if this is the first in list + if (ptr->prevTCB == NULL) + { + tcbList = ptr->nextTCB; + ((tcpTCB_t *)(ptr->nextTCB))->prevTCB = NULL; + } + else + { + ((tcpTCB_t *)(ptr->prevTCB))->nextTCB = ptr->nextTCB; + ((tcpTCB_t *)(ptr->nextTCB))->prevTCB = ptr->prevTCB; + } + tcbListSize--; + } + else if (tcbListSize == 1) + { + tcbList = NULL; + } +} + +static void TCB_Reset(tcpTCB_t *tcbPtr) +{ + tcbPtr->destIP = 0; + tcbPtr->destPort = 0; + tcbPtr->localSeqno = 0; + tcbPtr->localLastAck = 0; + tcbPtr->remoteSeqno = 0; + tcbPtr->remoteAck = 0; + tcbPtr->remoteWnd = 0; + + tcbPtr->timeout = 0; + tcbPtr->timeoutReloadValue = 0; + tcbPtr->timeoutsCount = 0; + tcbPtr->flags = 0; + + tcbPtr->localPort = 0; + tcbPtr->bytesSent = 0; + tcbPtr->payloadSave = false; + tcbPtr->socketState = SOCKET_CLOSING; +} + +static error_msg TCB_Check(tcpTCB_t *ptr) +{ + tcpTCB_t *tcbPtr; + error_msg ret = ERROR; + socklistsize_t count = 0; + + if ((tcbList != NULL) && (ptr != NULL)) + { + // Search for ptr into the active TCB/sockets list + tcbPtr = tcbList; + while ((tcbPtr != NULL) && (count < tcbListSize)) + { + if (tcbPtr == ptr) + { + ret = SUCCESS; + break; + } + else + { + tcbPtr = tcbPtr->nextTCB; + count++; + } + } + } + return ret; +} + +static error_msg TCP_Snd(tcpTCB_t *tcbPtr) +{ + error_msg ret = ERROR; + tcpHeader_t txHeader; + uint16_t payloadLength; + uint16_t cksm; + uint8_t *data; + + txHeader.sourcePort = htons(tcbPtr->localPort); + txHeader.destPort = htons(tcbPtr->destPort); + + txHeader.sequenceNumber = htonl(tcbPtr->localSeqno); + + txHeader.ackNumber = htonl(tcbPtr->remoteAck); // Ask for next packet + + txHeader.ns = 0; // Make sure to clean unused fields + txHeader.reserved = 0; // Make sure to clean unused fields + txHeader.dataOffset = 5; // Support for options is not avaialble for now + txHeader.windowSize = htons(tcbPtr->localWnd); + txHeader.checksum = 0; + txHeader.urgentPtr = 0; + + if ((tcbPtr->flags) & (TCP_SYN_FLAG | TCP_RST_FLAG)) + { + tcpDataLength = 0; // SYN and RST packets doesn't have any payload + } + else if (tcbPtr->payloadSave == true) + { + tcpDataLength = 0; + } + else + { + tcpDataLength = tcbPtr->bytesSent; + + if (tcpDataLength != 0) + { + if (tcbPtr->remoteWnd == 0) + { + tcbPtr->remoteWnd = 1; + } + if (tcpDataLength > tcbPtr->remoteWnd) + { + tcpDataLength = tcbPtr->remoteWnd; + } + + if (tcpDataLength > tcbPtr->mss) + { + tcpDataLength = tcbPtr->mss; + } + data = tcbPtr->txBufferPtr; + + // Update the pointer to the next byte that needs to be sent + tcbPtr->txBufferPtr = tcbPtr->txBufferPtr + tcpDataLength; + tcbPtr->bytesToSend = tcbPtr->bytesSent - tcpDataLength; + + if (tcbPtr->bytesToSend == 0) + { + tcbPtr->flags = tcbPtr->flags | TCP_PSH_FLAG; + } + } + } + // Update the TCP Flags + txHeader.flags = tcbPtr->flags; + payloadLength = sizeof(tcpHeader_t) + tcpDataLength; + + ret = IPv4_Start(tcbPtr->destIP, TCP_TCPIP); + if (ret == SUCCESS) + { + ETH_WriteBlock((char *)&txHeader, sizeof(tcpHeader_t)); + + if (tcpDataLength > 0) + { + ETH_WriteBlock((char *)data, tcpDataLength); + } + + cksm = payloadLength + TCP_TCPIP; + // Calculate the TCP checksum + cksm = ETH_TxComputeChecksum(sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) - 8, payloadLength + 8, cksm); + ETH_Insert((char *)&cksm, 2, sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) + offsetof(tcpHeader_t, checksum)); + + ret = IPV4_Send(payloadLength); + // tcbPtr->txBufferPtr = tcbPtr->txBufferPtr - tcpDataLength; + } + + // The packet wasn't transmitted + // Use the timeout to retry again later + if (ret != SUCCESS && ret != TX_QUEUED) + { + // Making sure to keep the remaining timeouts and skip this send that failed + // Trying at least once + tcbPtr->timeoutsCount = tcbPtr->timeoutsCount - 1u; + + if (tcbPtr->timeout == 0) + { + tcbPtr->timeout = TCP_START_TIMEOUT_VAL; + } + } + else + { + // Incrementing the sequence number if the packet is sent + tcbPtr->localSeqno = tcbPtr->localSeqno + tcpDataLength; + logMsg("tcp_packet sent", LOG_INFO, LOG_DEST_CONSOLE); + } + + return ret; +} + +error_msg TCP_PayloadSave(uint16_t len) +{ + error_msg ret = ERROR; + uint16_t buffer_size; + + // Check if there is a valid buffer + if (currentTCB->rxBufState == RX_BUFF_IN_USE) + { + // Make sure there is enough space + if (currentTCB->localWnd >= len) + { + buffer_size = len; + } + else + { + buffer_size = currentTCB->localWnd; + } + + ETH_ReadBlock(currentTCB->rxBufferPtr, buffer_size); + currentTCB->rxBufferPtr = currentTCB->rxBufferPtr + buffer_size; + + // Updating the local window to inform the remote of the available space + currentTCB->localWnd = currentTCB->localWnd - buffer_size; + currentTCB->remoteAck = currentTCB->remoteSeqno + buffer_size; + + // Prepareing to send the ACK and maybe some data if there are any + currentTCB->flags = TCP_ACK_FLAG; + currentTCB->payloadSave = true; + + TCP_Snd(currentTCB); + currentTCB->payloadSave = false; + ret = SUCCESS; + } + return ret; +} + +static error_msg TCP_ParseTCPOptions(void) +{ + uint8_t opt; + uint16_t tcpOptionsSize; + error_msg ret; + + ret = ERROR; + // Check for the option fields in TCP header + tcpOptionsSize = (uint16_t)(tcpHeader.dataOffset << 2u) - (uint16_t)sizeof(tcpHeader_t); + + if (tcpOptionsSize > 0) + { + // RFC 1122, page 85, Section 4.2.2.6 Maximum Segment Size Option: RFC-793 Section 3.1 + // More explanations can be found in RFC-6691 + tcpMss = 536; + // Parse the option only for SYN segments + if (tcpHeader.syn) + { + // Parse for the TCP MSS option, if present. + while (tcpOptionsSize--) + { + opt = ETH_Read8(); + switch (opt) + { + case TCP_EOP: + // End of options + if (tcpOptionsSize) + { + // Dumping remaining unused bytes + ETH_Dump(tcpOptionsSize); + tcpOptionsSize = 0; + } + ret = SUCCESS; + break; + case TCP_NOP: + // NOP option. + break; + case TCP_MSS: + if (tcpOptionsSize >= 3) // at least 3 more bytes + { + opt = ETH_Read8(); + if (opt == 0x04) + { + // An MSS option with the right option length. + tcpMss = ETH_Read16(); // value returned in host endianess + // Advance to the next option + tcpOptionsSize = tcpOptionsSize - 3; + + // Limit the mss to the configured TCP_MAX_SEG_SIZE + if (tcpMss > TCP_MAX_SEG_SIZE) + { + tcpMss = TCP_MAX_SEG_SIZE; + } + ret = SUCCESS; + } + else + { + // Bad option size length + logMsg("tcp_parseopt: bad option size length", LOG_INFO, LOG_DEST_CONSOLE); + // Unexpected error + tcpOptionsSize = 0; + ret = ERROR; + } + } + else + { + // Unexpected error + tcpOptionsSize = 0; + ret = ERROR; + } + break; + default: + logMsg("tcp_parseopt: other", LOG_INFO, LOG_DEST_CONSOLE); + opt = ETH_Read8(); + tcpOptionsSize--; + + if (opt > 1) // This should be at least 2 to be valid + { + // Adjust for the remaining bytes for the current option + opt = opt - 2u; + if (opt <= tcpOptionsSize) + { + // All other options have a length field, so that it can easily be skiped + ETH_Dump(opt); + tcpOptionsSize = tcpOptionsSize - opt; + ret = SUCCESS; + } + else + { + logMsg("tcp_parseopt: bad option length", LOG_INFO, LOG_DEST_CONSOLE); + // The options are malformed and will not be processed further + tcpOptionsSize = 0; + ret = ERROR; + } + } + else + { + logMsg("tcp_parseopt: bad length", LOG_INFO, LOG_DEST_CONSOLE); + // If the length field is zero, the options are malformed + // and will not be processed further + tcpOptionsSize = 0; + ret = ERROR; + } + break; + } + } + } + else // jump over the Options from TCP header + { + ETH_Dump(tcpOptionsSize); + ret = SUCCESS; + } + } + else + { + ret = SUCCESS; + } + + return ret; +} + +void TCP_Recv(uint32_t remoteAddress, uint16_t length) +{ + tcpTCB_t *tcbPtr; + socklistsize_t count = 0; + + tcbPtr = NULL; + // Make sure to not reuse old values + receivedRemoteAddress = 0; + rcvPayloadLen = 0; + + ETH_ReadBlock((char *)&tcpHeader, sizeof(tcpHeader_t)); + + currentTCB = NULL; + + // Quick check on destination port + if ((tcpHeader.destPort != 0) && (tcpHeader.sourcePort != 0)) + { + tcpHeader.sourcePort = ntohs(tcpHeader.sourcePort); + tcpHeader.destPort = ntohs(tcpHeader.destPort); + + // Search for active TCB + tcbPtr = tcbList; + while ((tcbPtr != NULL) && (count < tcbListSize)) + { + if (tcpHeader.destPort == tcbPtr->localPort) + { + currentTCB = tcbPtr; + break; + } + else + { + tcbPtr = tcbPtr->nextTCB; + count++; + } + } + + if (currentTCB != NULL) + { + if ((tcpHeader.sourcePort == currentTCB->destPort) || + (currentTCB->destIP == 0)) + { + // Need this if the port is in listen mode + // or to check for the correct TCB + receivedRemoteAddress = remoteAddress; + rcvPayloadLen = length - (uint16_t)(tcpHeader.dataOffset << 2); + + // check/skip the TCP header options + if (TCP_ParseTCPOptions() == SUCCESS) + { + // A packet was received + // sort out the events + if (tcpHeader.syn) + { + if (tcpHeader.ack) + { + logMsg("found syn&ack", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_SYNACK; + } + else + { + logMsg("found syn", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_SYN; + } + } + else if (tcpHeader.fin) + { + if (tcpHeader.ack) + { + logMsg("found fin&ack", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_FINACK; + } + else + { + logMsg("found fin", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_FIN; + } + } + else if (tcpHeader.rst) + { + if (tcpHeader.ack) + { + logMsg("found rst&ack", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_RSTACK; + } + else + { + logMsg("found rst", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_RST; + } + } + else if (tcpHeader.ack) + { + logMsg("found ack", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->connectionEvent = RCV_ACK; + } + else + { + logMsg("confused", LOG_INFO, LOG_DEST_CONSOLE); + } + // Conversion done herer save some cycles later + tcpHeader.ackNumber = ntohl(tcpHeader.ackNumber); + tcpHeader.sequenceNumber = ntohl(tcpHeader.sequenceNumber); + + TCP_FiniteStateMachine(); + } + else + { + logMsg("pkt dropped: bad options", LOG_INFO, LOG_DEST_CONSOLE); + } + } // No reset message sent for PORT not open + } + } +} + +static error_msg TCP_FiniteStateMachine(void) +{ + uint16_t notAckBytes; + error_msg ret = ERROR; + + tcp_fsm_states_t nextState = currentTCB->fsmState; // Default don't change states + tcpEvent_t event = currentTCB->connectionEvent; + switch (currentTCB->fsmState) + { + case LISTEN: + switch (event) + { + case RCV_SYN: + logMsg("LISTEN: rx_syn", LOG_INFO, LOG_DEST_CONSOLE); + // Start the connection on the TCB + + currentTCB->destIP = receivedRemoteAddress; + currentTCB->destPort = tcpHeader.sourcePort; + + currentTCB->localLastAck = 0; + + currentTCB->remoteSeqno = tcpHeader.sequenceNumber; + currentTCB->remoteAck = currentTCB->remoteSeqno + 1; // Ask for next packet + + // Save data from TCP header + currentTCB->remoteWnd = ntohs(tcpHeader.windowSize); + currentTCB->mss = tcpMss; + + // Create and send a SYN+ACK packet + currentTCB->flags = TCP_SYN_FLAG | TCP_ACK_FLAG; + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_SYN_RETRIES; + + TCP_Snd(currentTCB); + nextState = SYN_RECEIVED; + break; + case CLOSE: + logMsg("LISTEN: close", LOG_INFO, LOG_DEST_CONSOLE); + nextState = CLOSED; + TCB_Reset(currentTCB); + break; + default: + // For all other cases the packet is invalid and will be discarded + break; + } + break; + case SYN_SENT: + switch (event) + { + case RCV_SYN: + logMsg("SYN_SENT: rx_syn", LOG_INFO, LOG_DEST_CONSOLE); + // Simultaneous open + currentTCB->remoteSeqno = tcpHeader.sequenceNumber; + currentTCB->remoteAck = tcpHeader.sequenceNumber + 1; // Ask for next packet + + // Save data from TCP header + currentTCB->remoteWnd = ntohs(tcpHeader.windowSize); + currentTCB->mss = tcpMss; + + // Create and send a ACK packet + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_SYN_RETRIES; + currentTCB->flags = TCP_SYN_FLAG | TCP_ACK_FLAG; + + TCP_Snd(currentTCB); + + // Go to SYN_RECEIVED and waiting for the ack + nextState = SYN_RECEIVED; + break; + case RCV_SYNACK: + logMsg("SYN_SENT: rx_synack", LOG_INFO, LOG_DEST_CONSOLE); + + currentTCB->timeout = 0; + + if ((currentTCB->localSeqno + 1) == tcpHeader.ackNumber) + { + // Create and send a ACK packet + currentTCB->localSeqno = currentTCB->localSeqno + 1; + currentTCB->flags = TCP_ACK_FLAG; + + // Save data from TCP header + currentTCB->remoteSeqno = tcpHeader.sequenceNumber; + // Ask for next packet + currentTCB->remoteAck = tcpHeader.sequenceNumber + 1; + + currentTCB->remoteWnd = ntohs(tcpHeader.windowSize); + currentTCB->mss = tcpMss; + + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = ESTABLISHED; + currentTCB->socketState = SOCKET_CONNECTED; + } + } + else + { + // Send reset + currentTCB->localSeqno = tcpHeader.ackNumber; + currentTCB->flags = TCP_RST_FLAG | TCP_ACK_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + break; + case RCV_ACK: + logMsg("SYN_SENT: rx_ack", LOG_INFO, LOG_DEST_CONSOLE); + + currentTCB->timeout = 0; + + if ((currentTCB->localSeqno + 1) == tcpHeader.ackNumber) + { + // Create and send a ACK packet + currentTCB->localSeqno = currentTCB->localSeqno + 1; + currentTCB->flags = TCP_ACK_FLAG; + + // Save data from TCP header + currentTCB->remoteSeqno = tcpHeader.sequenceNumber; + currentTCB->remoteAck = tcpHeader.sequenceNumber + 1; // ask for next packet + + currentTCB->remoteWnd = ntohs(tcpHeader.windowSize); + currentTCB->mss = tcpMss; + + nextState = ESTABLISHED; + currentTCB->socketState = SOCKET_CONNECTED; + } + else + { + // Send reset + currentTCB->localSeqno = tcpHeader.ackNumber; + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + break; + case CLOSE: + logMsg("SYN_SENT: close", LOG_INFO, LOG_DEST_CONSOLE); + // Go to CLOSED state + nextState = CLOSED; + TCB_Reset(currentTCB); + break; + case TIMEOUT: + logMsg("SYN_SENT: timeout", LOG_INFO, LOG_DEST_CONSOLE); + // Looks like the the packet was lost + // Check inside the packet to see where to jump next + if (currentTCB->timeoutsCount) + { + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + if (currentTCB->flags & TCP_RST_FLAG) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + else if (currentTCB->flags & TCP_ACK_FLAG) + { + nextState = ESTABLISHED; + currentTCB->socketState = SOCKET_CONNECTED; + } + } + } + else + { + // Just reset the connection if there is no reply + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + break; + case RCV_RST: + case RCV_RSTACK: + // Port seems not to be opened + nextState = CLOSED; + TCB_Reset(currentTCB); + break; + default: + // For all other cases the packet is invalid and will be discarded + break; + } + break; + case SYN_RECEIVED: + switch (event) + { + case RCV_SYNACK: + logMsg("SYN_RECEIVED: rx_synack", LOG_INFO, LOG_DEST_CONSOLE); + if (currentTCB->localPort == tcpHeader.destPort) + { + // stop the current timeout + currentTCB->timeout = 0; + + // This is part of simultaneous open + if ((currentTCB->destIP == receivedRemoteAddress) && (currentTCB->destPort == tcpHeader.sourcePort)) + if ((currentTCB->localSeqno + 1) == tcpHeader.ackNumber) + nextState = ESTABLISHED; + + currentTCB->socketState = SOCKET_CONNECTED; + } + break; + case RCV_ACK: + logMsg("SYN_RECEIVED: rx_ack", LOG_INFO, LOG_DEST_CONSOLE); + + // Checking if the packet is for the curent TCB + // Checking the remote IP address and remote port + if ((currentTCB->destIP == receivedRemoteAddress) && (currentTCB->destPort == tcpHeader.sourcePort)) + { + // Checking the sequence numbers to verify if it was the packet that was asked for + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + // Is ACK OK? + if ((currentTCB->localSeqno + 1) == tcpHeader.ackNumber) + { + currentTCB->localSeqno = currentTCB->localSeqno + 1; + // Stop the current timeout + currentTCB->timeout = 0; + + nextState = ESTABLISHED; + currentTCB->socketState = SOCKET_CONNECTED; + } + } + } + break; + case CLOSE: + logMsg("SYN_RECEIVED: close", LOG_INFO, LOG_DEST_CONSOLE); + // Stop the current timeout + currentTCB->timeout = 0; + // Need to send FIN and go to the FIN_WAIT_1 + currentTCB->flags = TCP_FIN_FLAG; + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_RETRIES; + + nextState = FIN_WAIT_1; + TCP_Snd(currentTCB); + break; + case RCV_RSTACK: + case RCV_RST: + // Reset the connection + logMsg("SYN_RECEIVED: rx_rst", LOG_INFO, LOG_DEST_CONSOLE); + // Check if the local port matches or else drop the packet + if (currentTCB->localPort == tcpHeader.destPort) + { + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + logMsg("rst seq OK", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->destIP = 0; + currentTCB->destPort = 0; + currentTCB->localSeqno = 0; + currentTCB->localLastAck = 0; + currentTCB->remoteSeqno = 0; + currentTCB->remoteAck = 0; + currentTCB->remoteWnd = 0; + // TCP_MAX_SEG_SIZE instead of 0 + currentTCB->mss = TCP_MAX_SEG_SIZE; + + nextState = LISTEN; + } + } + break; + case TIMEOUT: + logMsg("SYN_RECEIVED: timeout", LOG_INFO, LOG_DEST_CONSOLE); + if (currentTCB->timeoutsCount) + { + TCP_Snd(currentTCB); + } + else + { + // Reseting the connection if there is no reply + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + currentTCB->destIP = 0; + currentTCB->destPort = 0; + currentTCB->localSeqno = 0; + currentTCB->localLastAck = 0; + currentTCB->remoteSeqno = 0; + currentTCB->remoteAck = 0; + currentTCB->remoteWnd = 0; + // TCP_MAX_SEG_SIZE instead of 0 + currentTCB->mss = TCP_MAX_SEG_SIZE; + nextState = LISTEN; + } + } + break; + default: + // Invalid packet so drop it + break; + } + break; + case ESTABLISHED: + switch (event) + { + case RCV_ACK: + logMsg("ESTABLISHED: rx_ack", LOG_INFO, LOG_DEST_CONSOLE); + if (currentTCB->destIP == receivedRemoteAddress) + { + // Is sequence number OK? + // Remote ACK should be equal to header sequence number + // Not accepting out of order packet (not enough memory) + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + // This is a ACK packet only + // Checking the ACK sequence + // Checking if this is already present in the received ACK + if (currentTCB->localLastAck < tcpHeader.ackNumber) + { + // Check how many bytes sent was acknowledged + if ((currentTCB->localSeqno + 1) >= tcpHeader.ackNumber) + { + notAckBytes = (uint16_t)(currentTCB->localSeqno - tcpHeader.ackNumber); + + // Updating the pointer for next TX + currentTCB->txBufferPtr = currentTCB->txBufferPtr - notAckBytes; + currentTCB->bytesToSend = currentTCB->bytesToSend + notAckBytes; + + currentTCB->localLastAck = tcpHeader.ackNumber - 1; + currentTCB->localSeqno = tcpHeader.ackNumber; + if (bytesToSendForRetransmit == 0) + { + localSeqnoForRetransmit = currentTCB->localSeqno; + } + // Checking if all TX buffer/data was acknowledged + if (currentTCB->bytesToSend == 0) + { + if (currentTCB->txBufState == TX_BUFF_IN_USE) + { + currentTCB->txBufState = NO_BUFF; + // Stopping timeout + currentTCB->timeout = 0; + } + } + else + { + if (bytesToSendForRetransmit) + { + currentTCB->txBufferPtr = txBufferPtrForRetransmit; + currentTCB->bytesSent = bytesToSendForRetransmit; + currentTCB->localSeqno = localSeqnoForRetransmit; + } + else + { + currentTCB->bytesSent = currentTCB->bytesToSend; + } + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_RETRIES; + TCP_Snd(currentTCB); + if ((bytesToSendForRetransmit > 0) && (lastAckNumber != tcpHeader.ackNumber)) + { + bytesToSendForRetransmit = 0; + } + } + + // Checking if the packet has payload + if (rcvPayloadLen > 0) + { + currentTCB->remoteSeqno = tcpHeader.sequenceNumber; + + // Copying the payload to the local buffer + TCP_PayloadSave(rcvPayloadLen); + } + } + else + { + // This is a wrong ACK + // ACK a packet that wasn't transmitted + } + } + } + } + break; + case CLOSE: + logMsg("ESTABLISHED: close", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->flags = TCP_FIN_FLAG | TCP_ACK_FLAG; + nextState = FIN_WAIT_1; + currentTCB->timeout = 0; + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_RETRIES; + TCP_Snd(currentTCB); + break; + case RCV_FIN: + logMsg("ESTABLISHED: rx_fin", LOG_INFO, LOG_DEST_CONSOLE); + break; + case RCV_FINACK: + if (currentTCB->destIP == receivedRemoteAddress) + { + // Is sequence number OK? + // Remote ACK should be equal to header sequence number + // Not accepting out of order packet (not enough memory) + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + currentTCB->bytesSent = 0; + // ACK the current packet + currentTCB->localSeqno = tcpHeader.ackNumber; + currentTCB->remoteAck = currentTCB->remoteAck + 1; + + // Check if the packet has payload added + if (rcvPayloadLen > 0) + { + currentTCB->remoteSeqno = tcpHeader.sequenceNumber; + + // Copy the payload to the local buffer + TCP_PayloadSave(rcvPayloadLen); + } + + currentTCB->socketState = SOCKET_CLOSING; + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_RETRIES; + // Jump over CLOSE_WAIT state and send one packet with FIN + ACK + currentTCB->flags = TCP_FIN_FLAG | TCP_ACK_FLAG; + + nextState = LAST_ACK; + TCP_Snd(currentTCB); + } + } + break; + case RCV_RST: + case RCV_RSTACK: + currentTCB->flags = TCP_RST_FLAG; + TCP_Snd(currentTCB); + nextState = CLOSED; + TCB_Reset(currentTCB); + break; + case TIMEOUT: + logMsg("ESTABLISHED: timeout", LOG_INFO, LOG_DEST_CONSOLE); + if (currentTCB->timeoutsCount) + { + TCP_TimoutRetransmit(); + } + else + { + // Reset the connection if there is no reply + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + break; + default: + break; + } + break; + case FIN_WAIT_1: + switch (event) + { + case RCV_FIN: + currentTCB->flags = TCP_ACK_FLAG; + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + currentTCB->bytesSent = 0; + currentTCB->localSeqno = currentTCB->localSeqno + 1; + currentTCB->remoteAck = currentTCB->remoteAck + 1; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSING; + } + } + break; + case RCV_ACK: + logMsg("FIN_WAIT_1: rx_ack", LOG_INFO, LOG_DEST_CONSOLE); + // Stop the current timeout + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = 1; + nextState = FIN_WAIT_2; + break; + case RCV_FINACK: + logMsg("FIN_WAIT_1: rx_finack", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->flags = TCP_ACK_FLAG; + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + currentTCB->bytesSent = 0; + currentTCB->localSeqno = currentTCB->localSeqno + 1; + currentTCB->remoteAck = currentTCB->remoteAck + 1; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = TIME_WAIT; + } + } + break; + case TIMEOUT: + logMsg("FIN_WAIT_1: timeout", LOG_INFO, LOG_DEST_CONSOLE); + if (currentTCB->timeoutsCount) + { + TCP_Snd(currentTCB); + } + else + { + // Just reset the connection if there is no reply + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + break; + default: + break; + } + break; + case FIN_WAIT_2: + switch (event) + { + case RCV_FINACK: + case RCV_FIN: + logMsg("FIN_WAIT_2: rx_fin/rx_finack", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->flags = TCP_ACK_FLAG; + if (currentTCB->remoteAck == tcpHeader.sequenceNumber) + { + currentTCB->bytesSent = 0; + currentTCB->localSeqno = currentTCB->localSeqno + 1; + currentTCB->remoteAck = currentTCB->remoteAck + 1; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = TIME_WAIT; + } + } + + break; + case TIMEOUT: + logMsg("FIN_WAIT_2: timeout", LOG_INFO, LOG_DEST_CONSOLE); + if (currentTCB->timeoutsCount) + { + TCP_Snd(currentTCB); + } + else + { + // Just reset the connection if there is no reply + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + break; + default: + break; + } + break; + case CLOSE_WAIT: + // This state is defined in RFC, but is not used in the application + break; + case CLOSING: + switch (event) + { + case RCV_ACK: + logMsg("CLOSING: rx_ack", LOG_INFO, LOG_DEST_CONSOLE); + nextState = TIME_WAIT; + break; + default: + break; + } + break; + case LAST_ACK: + // Check if the packet belongs to the curent TCB + switch (event) + { + case RCV_FINACK: + case RCV_ACK: + if ((currentTCB->destIP == receivedRemoteAddress) && + (currentTCB->destPort == tcpHeader.sourcePort)) + { + logMsg("LAST_ACK: rx_ack", LOG_INFO, LOG_DEST_CONSOLE); + nextState = CLOSED; + TCB_Reset(currentTCB); + } + break; + case TIMEOUT: + if (currentTCB->timeoutsCount) + { + TCP_Snd(currentTCB); + } + else + { + // Just reset the connection if there is no reply + currentTCB->flags = TCP_RST_FLAG; + if (TCP_Snd(currentTCB) == (TX_QUEUED || SUCCESS)) + { + nextState = CLOSED; + TCB_Reset(currentTCB); + } + } + default: + break; + } + break; + case TIME_WAIT: + logMsg("Time Wait", LOG_INFO, LOG_DEST_CONSOLE); + nextState = CLOSED; + TCB_Reset(currentTCB); + break; + case CLOSED: + switch (event) + { + case ACTIVE_OPEN: + logMsg("CLOSED: active_open", LOG_INFO, LOG_DEST_CONSOLE); + // Create and send a SYN packet + currentTCB->timeout = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + currentTCB->timeoutsCount = TCP_MAX_SYN_RETRIES; + currentTCB->flags = TCP_SYN_FLAG; + TCP_Snd(currentTCB); + nextState = SYN_SENT; + ret = SUCCESS; + break; + case PASIVE_OPEN: + logMsg("CLOSED: passive_open", LOG_INFO, LOG_DEST_CONSOLE); + currentTCB->destIP = 0; + currentTCB->destPort = 0; + nextState = LISTEN; + ret = SUCCESS; + break; + default: + break; + } + break; + default: + break; + } + currentTCB->connectionEvent = NOP; // Handling the event... + currentTCB->fsmState = nextState; + return ret; +} + +void TCP_Init(void) +{ + tcbList = NULL; + tcbListSize = 0; + nextAvailablePort = LOCAL_TCP_PORT_START_NUMBER; + nextSequenceNumber = 0; +} + +error_msg TCP_SocketInit(tcpTCB_t *tcbPtr) +{ + error_msg ret = ERROR; + + // Verify that this socket is not in the list + if (TCB_Check(tcbPtr) == ERROR) + { + TCB_Reset(tcbPtr); + + tcbPtr->localWnd = 0; // Input the RX buffer size + tcbPtr->mss = TCP_MAX_SEG_SIZE; + tcbPtr->fsmState = CLOSED; + tcbPtr->connectionEvent = NOP; + tcbPtr->rxBufferStart = NULL; + tcbPtr->rxBufState = NO_BUFF; + tcbPtr->txBufferStart = NULL; + tcbPtr->txBufferPtr = NULL; + tcbPtr->bytesToSend = 0; + tcbPtr->bytesSent = 0; + tcbPtr->payloadSave = false; + tcbPtr->txBufState = NO_BUFF; + tcbPtr->socketState = SOCKET_CLOSED; + + TCB_Insert(tcbPtr); + ret = SUCCESS; + } + return ret; +} + +error_msg TCP_SocketRemove(tcpTCB_t *tcbPtr) +{ + error_msg ret = ERROR; + + // Verify that this socket is in the Closed State + if (TCP_SocketPoll(tcbPtr) == SOCKET_CLOSING) + { + TCB_Remove(tcbPtr); + ret = SUCCESS; + } + return ret; +} + +socketState_t TCP_SocketPoll(tcpTCB_t *socket_ptr) +{ + socketState_t tmpSocketState; + + tmpSocketState = NOT_A_SOCKET; + + if (TCB_Check(socket_ptr) == SUCCESS) + { + tmpSocketState = socket_ptr->socketState; + } + + return tmpSocketState; +} + +error_msg TCP_Bind(tcpTCB_t *tcbPtr, uint16_t port) +{ + error_msg ret = ERROR; + + logMsg("tcp_bind", LOG_INFO, LOG_DEST_CONSOLE); + + if (TCB_Check(tcbPtr) == SUCCESS) + { + tcbPtr->localPort = port; + ret = SUCCESS; + } + return ret; +} + +error_msg TCP_Listen(tcpTCB_t *tcbPtr) +{ + error_msg ret = ERROR; + + logMsg("tcp_listen", LOG_INFO, LOG_DEST_CONSOLE); + + if (TCB_Check(tcbPtr) == SUCCESS) + { + tcbPtr->connectionEvent = PASIVE_OPEN; + tcbPtr->socketState = SOCKET_IN_PROGRESS; + tcbPtr->localSeqno = nextSequenceNumber; + currentTCB = tcbPtr; + if (tcbPtr->localPort == 0) + { + tcbPtr->localPort = nextAvailablePort++; + } + ret = TCP_FiniteStateMachine(); + } + return ret; +} + +error_msg TCP_Connect(tcpTCB_t *tcbPtr, sockaddr_in4_t *srvaddr) +{ + error_msg ret = ERROR; + + if (TCP_SocketPoll(tcbPtr) == SOCKET_CLOSED) + { + tcbPtr->destIP = srvaddr->addr.s_addr; + tcbPtr->destPort = srvaddr->port; + if (tcbPtr->localPort == 0) + { + // Using a random port for the local one + tcbPtr->localPort = nextAvailablePort++; + } + + tcbPtr->fsmState = CLOSED; + tcbPtr->socketState = SOCKET_IN_PROGRESS; + tcbPtr->localSeqno = nextSequenceNumber; + tcbPtr->connectionEvent = ACTIVE_OPEN; + + currentTCB = tcbPtr; + ret = TCP_FiniteStateMachine(); + } + + return ret; +} + +error_msg TCP_Close(tcpTCB_t *tcbPtr) +{ + error_msg ret = ERROR; + + logMsg("tcp_close", LOG_INFO, LOG_DEST_CONSOLE); + + if (TCB_Check(tcbPtr) == SUCCESS) + { + tcbPtr->connectionEvent = CLOSE; + + tcbPtr->txBufState = NO_BUFF; + tcbPtr->rxBufState = NO_BUFF; + tcbPtr->txBufferPtr = NULL; + tcbPtr->txBufferStart = NULL; + tcbPtr->rxBufferPtr = NULL; + tcbPtr->rxBufferStart = NULL; + tcbPtr->bytesToSend = 0; + tcbPtr->bytesSent = 0; + tcbPtr->payloadSave = false; + + currentTCB = tcbPtr; + ret = TCP_FiniteStateMachine(); + } + return ret; +} + +error_msg TCP_Send(tcpTCB_t *tcbPtr, uint8_t *data, uint16_t dataLen) +{ + error_msg ret = ERROR; + + if (TCP_SocketPoll(tcbPtr) == SOCKET_CONNECTED) + { + if (tcbPtr->txBufState == NO_BUFF) + { + if (data != NULL) + { + tcbPtr->txBufferStart = data; + tcbPtr->txBufferPtr = tcbPtr->txBufferStart; + tcbPtr->bytesToSend = dataLen; + tcbPtr->txBufState = TX_BUFF_IN_USE; + tcbPtr->bytesSent = dataLen; + + tcbPtr->timeout = TCP_START_TIMEOUT_VAL; + tcbPtr->timeoutReloadValue = TCP_START_TIMEOUT_VAL; + tcbPtr->timeoutsCount = TCP_MAX_RETRIES; + + tcbPtr->flags = TCP_ACK_FLAG; + + TCP_Snd(tcbPtr); + ret = SUCCESS; + } + } + } + return ret; +} + +error_msg TCP_SendDone(tcpTCB_t *tcbPtr) +{ + error_msg ret = ERROR; + + if (TCB_Check(tcbPtr) == SUCCESS) + { + if (tcbPtr->txBufState == NO_BUFF) + { + ret = SUCCESS; + } + } + return ret; +} + +error_msg TCP_InsertRxBuffer(tcpTCB_t *tcbPtr, uint8_t *data, uint16_t data_len) +{ + error_msg ret = ERROR; + + if (TCB_Check(tcbPtr) == SUCCESS) + { + if (tcbPtr->rxBufState == NO_BUFF) + { + if (data != NULL) + { + tcbPtr->rxBufferStart = data; + tcbPtr->rxBufferPtr = tcbPtr->rxBufferStart; + tcbPtr->localWnd = data_len; // Update the available receive windows + tcbPtr->rxBufState = RX_BUFF_IN_USE; + ret = SUCCESS; + } + } + } + return ret; +} + +int16_t TCP_GetReceivedData(tcpTCB_t *tcbPtr) +{ + int16_t ret = 0; + + if (TCB_Check(tcbPtr) == SUCCESS) + { + if (tcbPtr->rxBufState == RX_BUFF_IN_USE) + { + ret = tcbPtr->rxBufferPtr - tcbPtr->rxBufferStart; + + if (ret != 0) + { + tcbPtr->localWnd = 0; + tcbPtr->rxBufState = NO_BUFF; + } + } + } + return ret; +} + +int16_t TCP_GetRxLength(tcpTCB_t *tcbPtr) +{ + int16_t ret = 0; + + if (TCB_Check(tcbPtr) == SUCCESS) + { + if (tcbPtr->rxBufState == RX_BUFF_IN_USE) + { + ret = tcbPtr->rxBufferPtr - tcbPtr->rxBufferStart; + } + } + return ret; +} + +void TCP_Update(void) +{ + tcpTCB_t *tcbPtr; + tcbPtr = NULL; + int count = 0; + + // Update sequence number and local port number in order to be different for each new connection + nextSequenceNumber++; + + // Keep local port number in the general port range + nextAvailablePort = nextAvailablePort + 1; + if (nextAvailablePort < LOCAL_TCP_PORT_START_NUMBER) + { + nextAvailablePort = LOCAL_TCP_PORT_START_NUMBER; + } + + tcbPtr = tcbList; + while ((tcbPtr != NULL) && (count < tcbListSize)) + { + if (tcbPtr->timeout > 0) + { + logMsg("tcp timeout", LOG_INFO, LOG_DEST_CONSOLE); + tcbPtr->timeout = tcbPtr->timeout - 1; + + if (tcbPtr->timeout == 0) + { + // Making sure not to overwrite anything else + if (tcbPtr->connectionEvent == NOP) + { + int retries = TCP_MAX_RETRIES - tcbPtr->timeoutsCount; + if (retries < 0) + { + retries = 0; + } + tcbPtr->timeout = tcbPtr->timeoutReloadValue << retries; + // If not zero + if (tcbPtr->timeoutsCount != 0) + tcbPtr->timeoutsCount = tcbPtr->timeoutsCount - 1u; + tcbPtr->connectionEvent = TIMEOUT; + currentTCB = tcbPtr; + TCP_FiniteStateMachine(); + } + } + } + tcbPtr = tcbPtr->nextTCB; + count++; + } +} + +static error_msg TCP_TimoutRetransmit(void) +{ + currentTCB->txBufferPtr -= tcpDataLength; + txBufferPtrForRetransmit = currentTCB->txBufferPtr; + bytesToSendForRetransmit = tcpDataLength; + currentTCB->localSeqno = localSeqnoForRetransmit; + lastAckNumber = tcpHeader.ackNumber; + return TCP_Snd(currentTCB); +} diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/udpv4.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/udpv4.c new file mode 100644 index 0000000..e4c7fda --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/udpv4.c @@ -0,0 +1,138 @@ +/** + * UDP Protocol v4 Source File + * + * @file udpv4.c + * + * @ingroup udp + * + * @brief This file provides the API implementation for the User Datagram Protocol version 4 (UDP v4). + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../ipv4.h" +#include "../udpv4.h" +#include "../udpv4_port_handler_table.h" +#include "../network.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../tcpip_types.h" + +// Variables +uint16_t destPort; +udpHeader_t udpHeader; + +// UDP Library Functions +error_msg UDP_Start(uint32_t destIP, uint16_t srcPort, uint16_t dstPort) +{ + // Start a UDP Packet to Write UDP Header + error_msg ret = ERROR; + + // Start IPv4 Packet to Write IPv4 Header + ret = IPv4_Start(destIP,UDP_TCPIP); + if(ret == SUCCESS) + { + //Start to Count the UDP payload length Bytes + ETH_ResetByteCount(); + + // Write UDP Source Port + ETH_Write16(srcPort); + + //Write UDP Destination Port + ETH_Write16(dstPort); + + //Write DataLength; Initially set to '0' + ETH_Write16(0); + + //Write UDP Checksum; Initially set to '0' + ETH_Write16(0); + + } + return ret; +} + +error_msg UDP_Send(void) +{ + uint16_t udpLength; + uint16_t cksm; + error_msg ret = ERROR; + + udpLength = ETH_GetByteCount(); + udpLength = ntohs(udpLength); + ETH_Insert((char *)&udpLength, 2, sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) + offsetof(udpHeader_t,length)); + udpLength = htons(udpLength); + + // add the UDP header checksum + cksm = udpLength + UDP_TCPIP; + cksm = ETH_TxComputeChecksum(sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) - 8, udpLength + 8, cksm); + + // if the computed checksum is "0" set it to 0xFFFF + if (cksm == 0){ + cksm = 0xffff; + } + ETH_Insert((char *)&cksm, 2, sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) + offsetof(udpHeader_t,checksum)); + + ret = IPV4_Send(udpLength); + + return ret; +} + +error_msg UDP_Receive(uint16_t udpcksm) +{ + error_msg ret = ERROR; + udp_table_iterator_t hptr; + + ETH_ReadBlock((char *)&udpHeader,sizeof(udpHeader)); + + if((udpHeader.checksum == 0) || (udpcksm == 0)) + { + udpHeader.dstPort = ntohs(udpHeader.dstPort); // reverse the port number + destPort = ntohs(udpHeader.srcPort); + udpHeader.length = ntohs(udpHeader.length); + ret = PORT_NOT_AVAILABLE; + // scan the udp port handlers and find a match. + // call the port handler callback on a match + hptr = udp_table_getIterator(); + + while(hptr != NULL) + { + if(hptr->portNumber == udpHeader.dstPort) + { + if(udpHeader.length == IPV4_GetDatagramLength()) + { + hptr->callBack((int16_t)(udpHeader.length - sizeof(udpHeader))); + } + ret = SUCCESS; + break; + } + hptr = udp_table_nextEntry(hptr); + } + if(ret== PORT_NOT_AVAILABLE) + { + } + } + else + { + ret = UDP_CHECKSUM_FAILS; + } + return ret; +} diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c new file mode 100644 index 0000000..ddbc76d --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c @@ -0,0 +1,57 @@ +/** + * UDP Port Handler Source File + * + * @file udpv4_port_handler_table.c + * + * @ingroup udp + * + * @brief This file provides the API implementation for the UDP v4 protocol. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include "../tcpip_config.h" +#include "../dhcp_client.h" +#include "../udpv4_port_handler_table.h" + +const udp_handler_t UDP_CallBackTable[] = \ +{ + {68, DHCP_Handler}, + +}; + +// UDPV4 Port Handler Functions +udp_table_iterator_t udp_table_getIterator(void) +{ + if (sizeof(UDP_CallBackTable) == 0) + return (udp_table_iterator_t) NULL; + else + return (udp_table_iterator_t) UDP_CallBackTable; +} + +udp_table_iterator_t udp_table_nextEntry(udp_table_iterator_t i) +{ + i++; + if(i < UDP_CallBackTable + sizeof(UDP_CallBackTable)) + return (udp_table_iterator_t) i; + else + return (udp_table_iterator_t) NULL; +} diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/tcpip_config.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/tcpip_config.h new file mode 100644 index 0000000..d2e67e2 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/tcpip_config.h @@ -0,0 +1,104 @@ +/** + * TCP/IP Stack User Configuration Options Header File + * + * @file tcpip_config.h + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for the TCP/IP Stack user configuration options. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef TCPIP_CONFIG_H +#define TCPIP_CONFIG_H + +// Macros +/** + * @ingroup tcpiplite + * @def MAKE_IPV4_ADDRESS(a,b,c,d) + * @brief Build the IPv4 Address +*/ +#define MAKE_IPV4_ADDRESS(a,b,c,d) ((uint32_t)(((uint32_t)a << 24) | ((uint32_t)b<<16) | ((uint32_t)c << 8) | (uint32_t)d)) + +// ARP Protocol Defines +#define ARP_MAP_SIZE 8 + +// DHCP Protocol Defines +extern const char dhcpName[]; + +/** + * @ingroup tcpiplite + * @def DHCP_NAME_SIZE + * @brief Required since sizeof is not handled during the preprocessor stage + */ +#define DHCP_NAME_SIZE 18 + + +// IP Protocol Defines +#define IPv4_TTL 64u + +// TCP Protocol Defines +/** + * @ingroup tcpiplite + * @def TCP_MAX_SEG_SIZE + * @brief TCP maximum segment size + */ +#define TCP_MAX_SEG_SIZE 1460u +#define TICK_SECOND 1 + +/** + * @ingroup tcpiplite + * @def TCP_START_TIMEOUT_VAL + * @brief Time-out to retransmit unacked data + * + */ +#define TCP_START_TIMEOUT_VAL ((unsigned long)TICK_SECOND*2) + +/** + * @ingroup tcpiplite + * @def TCP_MAX_RETRIES + * @brief Number of retransmission attempts + */ +#define TCP_MAX_RETRIES (5u) + +/** + * @ingroup tcpiplite + * @def TCP_MAX_SYN_RETRIES + * @brief than all other retries to reduce SYN flood DoS duration + */ +#define TCP_MAX_SYN_RETRIES (3u) + +/** + * @ingroup tcpiplite + * @def LOCAL_TCP_PORT_START_NUMBER + * @brief The lower port number to be used as a local port + */ +#define LOCAL_TCP_PORT_START_NUMBER (1024u) + +/** + * @ingroup tcpiplite + * @def LOCAL_TCP_PORT_END_NUMBER + * @brief The highest port number to be used as a local port + */ +#define LOCAL_TCP_PORT_END_NUMBER (65535u) + +// Neighbor Discovery Protocol Defines + +#endif /* TCPIP_CONFIG_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/tcpip_types.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/tcpip_types.h new file mode 100644 index 0000000..2395713 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/tcpip_types.h @@ -0,0 +1,527 @@ +/** + * TCP/IP Stack User Types Header File + * + * @file tcpip_types.h + * + * @ingroup tcpiplite + * + * @brief This file provides the TCP/IP Stack type definitions. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef TCPIP_TYPES_H +#define TCPIP_TYPES_H + +// Included Files +#include + +typedef enum +{ + TCB_ERROR = -1, + TCB_NO_ERROR = 0 +} tcbError_t; + +/** + * @ingroup tcpiplite + * @struct ethernetFrame_t + * @brief Ethernet frame information. + */ +typedef struct +{ + uint8_t destinationMAC[6]; + uint8_t sourceMAC[6]; + union + { + uint16_t type; /**< Ethernet 2 frame type, 802.3 length, 802.1Q TPID */ + uint16_t length; + uint16_t tpid; + } id; + // if tpid == 0x8100 then TCI structure goes here + // if tpid != 0x8100, then ethertype/length goes here + // UP to 1500 Bytes of payload goes here + // 32 bit checksum goes here +} ethernetFrame_t; + +#define ETHERTYPE_IPV4 0x0800 +#define ETHERTYPE_ARP 0x0806 +#define ETHERTYPE_IPV6 0x86DD +#define ETHERTYPE_VLAN 0x8100 +#define ETHERTYPE_LLDP 0x88CC +#define ETHERTYPE_EAPoL 0x888E + +// From RFC 2851 +#define INETADDRESSTYPE_IPV4 1 +#define INETADDRESSTYPE_IPV6 2 +#define INETADDRESSTYPE_DNS 16 + +#define ETHERNET_ADDR_LEN 6 +#define IP_ADDR_LEN 4 + +// From RFC 3493 +// Supported address families +#ifndef AF_INET6 +/** + * @ingroup tcpiplite + * @def AF_INET + * @brief Internet IP Protocol + */ +#define AF_INET 2 +#endif + +#ifndef AF_INET6 +/** + * @ingroup tcpiplite + * @def AF_INET6 + * @brief IP version 6 + */ +#define AF_INET6 10 +#endif + +#ifndef PF_INET +/** + * @ingroup tcpiplite + * @def PF_INET + * @brief Protocol families, same as address families + */ +#define PF_INET AF_INET +#endif + +#ifndef PF_INET6 +#define PF_INET6 AF_INET6 +#endif + +#ifndef IN6ADDR_ANY_INIT +#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } } +#endif + +#ifndef IN6ADDR_LOOPBACK_INIT +#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } } +#endif + +#ifndef INET_ADDRSTRLEN +/** + * @ingroup tcpiplite + * @def INET_ADDRSTRLEN + * @brief Length of the string form for IP + */ +#define INET_ADDRSTRLEN 16 +#endif + +#ifndef INET6_ADDRSTRLEN +/** + * @ingroup tcpiplite + * @def INET6_ADDRSTRLEN + * @brief Length of the string form for IPv6 + */ +#define INET6_ADDRSTRLEN 46 +#endif + +/** + * @ingroup tcpiplite + * @struct ipv4Header_t + * @brief IPv4 header information + */ +typedef struct +{ + unsigned ihl : 4; /**< Internet header length in 32-bit words */ + unsigned version : 4; /**< 4 for IPV4 */ + unsigned ecn : 2; /**< Explicit Congestion Notification RFC3168 */ + unsigned dscp : 6; /**< Differentiated Service Code Point RFC3260 */ + uint16_t length; /**< Total length including header and data (no more than 576 octets) */ + uint16_t identifcation; /**< ID for packet fragments */ + unsigned fragmentOffsetHigh : 5; /**< Offset for a fragment, needed for reassembly */ + unsigned : 1; /**< Leave this bit as zero */ + unsigned dontFragment : 1; /**< Drop if fragmentation is required to route */ + unsigned moreFragments : 1; /**< Fragments have this bit set (except for the final packet) */ + uint8_t fragmentOffsetLow; /**< Low byte for the fragment offset */ + uint8_t timeToLive; /**< Decrement at each hop and discard when zero */ + uint8_t protocol; /**< IP Protocol (from RFC790) */ + uint16_t headerCksm; /**< RFC1071 defines this calculation */ + uint32_t srcIpAddress; /**< Source IP Address */ + uint32_t dstIpAddress; /**< Destination IP Address */ + /* options could go here if IHL > 5 */ + /* payload goes here */ +} ipv4Header_t; + +/** + * @ingroup tcpiplite + * @struct ipv4_pseudo_header_t + * @brief Pseudo header used for checksum calculation on UDP and TCP + */ +typedef struct +{ + uint32_t srcIpAddress; /**< Source IP Address */ + uint32_t dstIpAddress; /**< Destination IP Address */ + uint8_t protocol; /**< Protocol */ + uint8_t z; /**< Used for memory cleaning */ + uint16_t length; /**< Length */ +} ipv4_pseudo_header_t; + +/** + * @ingroup tcpiplite + * @struct icmpHeader_t + * @brief ICMP header information + */ +typedef struct +{ + union + { + uint16_t typeCode; + struct + { + uint8_t code; + uint8_t type; + }; + }; + uint16_t checksum; +} icmpHeader_t; + + +/** + * @ingroup tcpiplite + * @enum icmpTypeCodes_t + * @brief ICMP Types and Codes + */ +typedef enum +{ + ECHO_REPLY = 0x0000, /**< Echo reply */ + DEST_NETWORK_UNREACHABLE = 0x0300, /**< Destination network unreachable */ + DEST_HOST_UNREACHABLE = 0x0301, /**< Destination host unreachable */ + DEST_PROTOCOL_UNREACHABLE = 0x0302, /**< Destination protocol unreachable */ + DEST_PORT_UNREACHABLE = 0x0303, /**< Destination port unreachable */ + FRAGMENTATION_REQUIRED = 0x0304, /**< Fragmentation required */ + SOURCE_ROUTE_FAILED = 0x0305, /**< Fragmentation failed */ + DESTINATION_NETWORK_UNKNOWN = 0x0306, /**< Unknown destination network */ + SOURCE_HOST_ISOLATED = 0x0307, /**< Source host isolated */ + NETWORK_ADMINISTRATIVELY_PROHIBITED = 0x0308, /**< Network administratively prohibited */ + HOST_ADMINISTRATIVELY_PROHIBITED = 0x0309, /**< Host administratively prohibited */ + NETWORK_UNREACHABLE_FOR_TOS = 0x030A, /**< Network unreachable for TOS */ + HOST_UNREACHABLE_FOR_TOS = 0x030B, /**< Host unreachable for TOS */ + COMMUNICATION_ADMINISTRATIVELY_PROHIBITED = 0x030C, /**< Communication administratively prohibited */ + HOST_PRECEDENCE_VIOLATION = 0x030D, /**< Host precedence violation */ + PRECEDENCE_CUTOFF_IN_EFFECT = 0x030E, /**< Precedence cutoff in effect */ + SOURCE_QUENCH = 0x0400, /**< Source quench */ + REDIRECT_DATAGRAM_FOR_THE_NETWORK = 0x0500, /**< Redirect message for the network*/ + REDIRECT_DATAGRAM_FOR_THE_HOST = 0x0501, /**< Redirect message for the host*/ + REDIRECT_DATAGRAM_FOR_THE_TOS_AND_NETWORK = 0x0502, /**< Redirect message for the TOS and network*/ + REDIRECT_DATAGRAM_FOR_THE_TOS_AND_HOST = 0x0503, /**< Redirect message for the TOS and host*/ + ALTERNATE_HOST_ADDRESS = 0x0600, /**< Alternate host address */ + ECHO_REQUEST = 0x0800, /**< Echo Request: Ask for a ping! */ + UNASSIGNED_ECHO_TYPE_CODE_REQUEST_1 = 0x082A, /**< Unassigned codes */ + UNASSIGNED_ECHO_TYPE_CODE_REQUEST_2 = 0x08FC, /**< Unassigned codes */ + ROUTER_ADVERTISEMENT = 0x0900, /**< Router advertisement */ + ROUTER_SOLICITATION = 0x0A00, /**< Router solicitaion */ + TRACEROUTE = 0x3000 /**< Trace route */ +} icmpTypeCodes_t; + +/** + * @ingroup tcpiplite + * @struct udpHeader_t + * @brief UDP header information + */ +typedef struct +{ + uint16_t srcPort; /**< Source Port */ + uint16_t dstPort; /**< Destination Port */ + uint16_t length; /**< Length */ + uint16_t checksum; /**< Checksum */ +} udpHeader_t; + +/** + * @ingroup tcpiplite + * @struct tcpHeader_t + * @brief TCP header information + */ +typedef struct +{ + uint16_t sourcePort; /**< Source port */ + uint16_t destPort; /**< Destination port */ + uint32_t sequenceNumber; /**< Sequence number */ + uint32_t ackNumber; /**< ACK Number */ + union + { + uint8_t byte13; + struct + { + uint8_t ns : 1; /**< ECN-nonce concealment protection (added to header by RFC 3540). */ + uint8_t reserved : 3; /**< For future use and needs to be set to zero. */ + uint8_t dataOffset : 4; /**< Specifies the size of the TCP header in 32-bit words. */ + }; + }; + + union + { + uint8_t flags; /**< Flags */ + struct + { + uint8_t fin : 1; /**< No more data from sender. */ + uint8_t syn : 1; /**< Synchronizes sequence numbers. Only the first packet sent from each end must have this flag set. */ + uint8_t rst : 1; /**< Resets the connection. */ + uint8_t psh : 1; /**< Asks to push the buffered data to the receiving application. */ + uint8_t ack : 1; /**< Indicates that the ACKfield is significant. */ + uint8_t urg : 1; /**< Indicates that the Urgent pointer field is significant. */ + uint8_t ece : 1; /**< ECN-Echo. Depends on SYN flag set or clear. */ + uint8_t cwr : 1; /**< Congestion Window Reduced (CWR) (added to header by RFC 3168). */ + }; + }; + + uint16_t windowSize; /**< Window size. */ + uint16_t checksum; /**< TCP Header Checksum. */ + uint16_t urgentPtr; /**< Urgent pointer. */ + // Options follow here + // Pad the header so the total header is a multiple of 4 bytes + // Data follows +} tcpHeader_t; + + +/** + * @ingroup tcpiplite + * @enum ipProtocolNumbers + * @brief IP Protocol Numbers. + * List from RFC5237 http://www.iana.org/assignments/protocol-numbers/protocol-numbers.txt + */ +typedef enum { +// Keyword Decimal Protocol Reference + HOPOPT_TCPIP = 0, /**< IPv6 Hop-by-Hop Option [RFC2460] */ + ICMP_TCPIP = 1, /**< Internet Control Message [RFC792] */ + IGMP_TCPIP = 2, /**< Internet Group Management [RFC1112] */ + GGP_TCPIP = 3, /**< Gateway-to-Gateway [RFC823] */ + IPV4_TCPIP = 4, /**< IPv4 encapsulation [RFC2003] */ + ST_TCPIP = 5, /**< Stream [RFC1190][RFC1819] */ + TCP_TCPIP = 6, /**< Transmission Control [RFC793] */ + CBT_TCPIP = 7, /**< CBT [Tony_Ballardie] */ + EGP_TCPIP = 8, /**< Exterior Gateway Protocol [RFC888][David_Mills] */ + IGP_TCPIP = 9, /**< Any private interior gateway (used by Cisco for their IGRP) [Internet_Assigned_Numbers_Authority] */ + BBN_RCC_MON_TCPIP = 10, /**< BBN RCC Monitoring [Steve_Chipman] */ + NVP_II_TCPIP = 11, /**< Network Voice Protocol [RFC741][Steve_Casner] */ + PUP_TCPIP = 12, /**< PUP [Boggs, D., J. Shoch, E. Taft, and R. Metcalfe, "PUP: An Internetwork Architecture", XEROX Palo Alto Research Center, CSL-79-10, July 1979; also in IEEE Transactions on Communication, Volume COM-28, Number 4, April 1980.][[XEROX]] */ + ARGUS_TCPIP = 13, /**< ARGUS [Robert_W_Scheifler] */ + EMCON_TCPIP = 14, /**< EMCON [] */ + XNET_TCPIP = 15, /**< Cross Net Debugger [Haverty, J., "XNET Formats for Internet Protocol Version 4", IEN 158, October 1980.][Jack_Haverty] */ + CHAOS_TCPIP = 16, /**< Chaos [J_Noel_Chiappa] */ + UDP_TCPIP = 17, /**< User Datagram [RFC768][Jon_Postel] */ + MUX_TCPIP = 18, /**< Multiplexing [Cohen, D. and J. Postel, "Multiplexing Protocol", IEN 90, USC/Information Sciences Institute, May 1979.][Jon_Postel] */ + DCN_MEAS_TCPIP = 19, /**< DCN Measurement Subsystems [David_Mills] */ + HMP_TCPIP = 20, /**< Host Monitoring [RFC869][Robert_Hinden] */ + PRM_TCPIP = 21, /**< Packet Radio Measurement [Zaw_Sing_Su] */ + XNS_IDP_TCPIP = 22, /**< XEROX NS IDP ["The Ethernet, A Local Area Network: Data Link Layer and Physical Layer Specification", AA-K759B-TK, Digital Equipment Corporation, Maynard, MA. Also as: "The Ethernet - A Local Area Network", Version 1.0, Digital Equipment Corporation, Intel Corporation, Xerox Corporation, September 1980. And: "The Ethernet, A Local Area Network: Data Link Layer and Physical Layer Specifications", Digital, Intel and Xerox, November 1982. And: XEROX, "The Ethernet, A Local Area Network: Data Link Layer and Physical Layer Specification", X3T51/80-50, Xerox Corporation, Stamford, CT., October 1980.][[XEROX]] */ + TRUNK_1_TCPIP = 23, /**< Trunk-1 [Barry_Boehm] */ + TRUNK_2_TCPIP = 24, /**< Trunk-2 [Barry_Boehm] */ + LEAF_1_TCPIP = 25, /**< Leaf-1 [Barry_Boehm] */ + LEAF_2_TCPIP = 26, /**< Leaf-2 [Barry_Boehm] */ + RDP_TCPIP = 27, /**< Reliable Data Protocol [RFC908][Robert_Hinden] */ + IRTP_TCPIP = 28, /**< Internet Reliable Transaction [RFC938][Trudy_Miller] */ + ISO_TP4_TCPIP = 29, /**< ISO Transport Protocol Class 4 [RFC905][] */ + NETBLT_TCPIP = 30, /**< Bulk Data Transfer Protocol [RFC969][David_Clark] */ + MFE_NSP_TCPIP = 31, /**< MFE Network Services Protocol [Shuttleworth, B., "A Documentary of MFENet, a National Computer Network", UCRL-52317, Lawrence Livermore Labs, Livermore, California, June 1977.][Barry_Howard] */ + MERIT_INP_TCPIP = 32, /**< MERIT Internodal Protocol [Hans_Werner_Braun] */ + DCCP_TCPIP = 33, /**< Datagram Congestion Control Protocol [RFC4340] */ + THREEPC_TCPIP = 34, /**< Third Party Connect Protocol [Stuart_A_Friedberg] */ + IDPR_TCPIP = 35, /**< Inter-Domain Policy Routing Protocol [Martha_Steenstrup] */ + XTP_TCPIP = 36, /**< XTP [Greg_Chesson] */ + DDP_TCPIP = 37, /**< Datagram Delivery Protocol [Wesley_Craig] */ + IDPR_CMTP_TCPIP = 38, /**< IDPR Control Message Transport Proto [Martha_Steenstrup] */ + TPpp_TCPIP = 39, /**< TP++ Transport Protocol [Dirk_Fromhein] */ + IL_TCPIP = 40, /**< IL Transport Protocol [Dave_Presotto] */ + IPV6_TUNNEL_TCPIP = 41, /**< IPv6 encapsulation [RFC2473] */ + SDRP_TCPIP = 42, /**< Source Demand Routing Protocol [Deborah_Estrin] */ + IPV6_Route_TCPIP = 43, /**< Routing Header for IPv6 [Steve_Deering] */ + IPV6_Frag_TCPIP = 44, /**< Fragment Header for IPv6 [Steve_Deering] */ + IDRP_TCPIP = 45, /**< Inter-Domain Routing Protocol [Sue_Hares] */ + RSVP_TCPIP = 46, /**< Reservation Protocol [RFC2205][RFC3209][Bob_Braden] */ + GRE_TCPIP = 47, /**< Generic Routing Encapsulation [RFC1701][Tony_Li] */ + DSR_TCPIP = 48, /**< Dynamic Source Routing Protocol [RFC4728] */ + BNA_TCPIP = 49, /**< BNA [Gary Salamon] */ + ESP_TCPIP = 50, /**< Encap Security Payload RFC4303] */ + AH_TCPIP = 51, /**< Authentication Header [RFC4302] */ + I_NLSP_TCPIP = 52, /**< Integrated Net Layer Security TUBA [K_Robert_Glenn] */ + SWIPE_TCPIP = 53, /**< IP with Encryption [John_Ioannidis] */ + NARP_TCPIP = 54, /**< NBMA Address Resolution Protocol [RFC1735] */ + MOBILE_TCPIP = 55, /**< IP Mobility [Charlie_Perkins] */ + TLSP_TCPIP = 56, /**< Transport Layer Security Protocol using Kryptonet key management [Christer_Oberg] */ + SKIP_TCPIP = 57, /**< SKIP [Tom_Markson] */ + IPV6_ICMP_TCPIP = 58, /**< ICMP for IPv6 [RFC2460] */ + IPV6_NoNxt_TCPIP = 59, /**< No Next Header for IPv6 [RFC2460] */ + IPV6_Opts_TCPIP = 60, /**< Destination Options for IPv6 [RFC2460] */ + CFTP_TCPIP = 62, /**< CFTP [Forsdick, H., "CFTP", Network Message, Bolt Beranek and Newman, January 1982.][Harry_Forsdick] */ + SAT_EXPAK_TCPIP = 64, /**< SATNET and Backroom EXPAK [Steven_Blumenthal] */ + KRYPTOLAN_TCPIP = 65, /**< Kryptolan [Paul Liu] */ + RVD_TCPIP = 66, /**< MIT Remote Virtual Disk Protocol [Michael_Greenwald] */ + IPPC_TCPIP = 67, /**< Internet Pluribus Packet Core [Steven_Blumenthal] */ + SAT_MON_TCPIP = 69, /**< SATNET Monitoring [Steven_Blumenthal] */ + VISA_TCPIP = 70, /**< VISA Protocol [Gene_Tsudik] */ + IPCV_TCPIP = 71, /**< Internet Packet Core Utility [Steven_Blumenthal] */ + CPNX_TCPIP = 72, /**< Computer Protocol Network Executive [David Mittnacht] */ + CPHB_TCPIP = 73, /**< Computer Protocol Heart Beat [David Mittnacht] */ + WSN_TCPIP = 74, /**< Wang Span Network [Victor Dafoulas] */ + PVP_TCPIP = 75, /**< Packet Video Protocol [Steve_Casner] */ + BR_SAT_MON_TCPIP = 76, /**< Backroom SATNET Monitoring [Steven_Blumenthal] */ + SUN_ND_TCPIP = 77, /**< SUN ND PROTOCOL-Temporary [William_Melohn] */ + WB_MON_TCPIP = 78, /**< WIDEBAND Monitoring [Steven_Blumenthal] */ + WB_EXPAK_TCPIP = 79, /**< WIDEBAND EXPAK [Steven_Blumenthal] */ + ISO_IP_TCPIP = 80, /**< ISO Internet Protocol [Marshall_T_Rose] */ + VMTP_TCPIP = 81, /**< VMTP [Dave_Cheriton] */ + SECURE_VMTP_TCPIP = 82, /**< SECURE-VMTP [Dave_Cheriton] */ + VINES_TCPIP = 83, /**< VINES [Brian Horn] */ + TTP_TCPIP = 84, /**< TTP [Jim_Stevens] */ + IPTM_TCPIP = 84, /**< Protocol Internet Protocol Traffic Manager [Jim_Stevens] */ + NSFNET_IGP_TCPIP = 85, /**< NSFNET-IGP [Hans_Werner_Braun] */ + DGP_TCPIP = 86, /**< Dissimilar Gateway Protocol [M/A-COM Government Systems, "Dissimilar Gateway Protocol Specification, Draft Version", Contract no. CS901145, November 16, 1987.][Mike_Little] */ + TCF_TCPIP = 87, /**< TCF [Guillermo_A_Loyola] */ + EIGRP_TCPIP = 88, /**< EIGRP [Cisco Systems, "Gateway Server Reference Manual", Manual Revision B, January 10, 1988.][Guenther_Schreiner] */ + OSPFIGP_TCPIP = 89, /**< OSPFIGP [RFC1583][RFC2328][RFC5340][John_Moy] */ + Sprite_RPC_TCPIP = 90, /**< Sprite RPC Protocol [Welch, B., "The Sprite Remote Procedure Call System", Technical Report, UCB/Computer Science Dept., 86/302, University of California at Berkeley, June 1986.][Bruce Willins] */ + LARP_TCPIP = 91, /**< Locus Address Resolution Protocol [Brian Horn] */ + MTP_TCPIP = 92, /**< Multicast Transport Protocol [Susie_Armstrong] */ + AX25_TCPIP = 93, /**< AX.25 Frames [Brian_Kantor] */ + IPIP_TCPIP = 94, /**< IP-within-IP Encapsulation Protocol [John_Ioannidis] */ + MICP_TCPIP = 95, /**< Mobile Internetworking Control Pro. [John_Ioannidis] */ + SCC_SP_TCPIP = 96, /**< Semaphore Communications Sec. Pro. [Howard_Hart] */ + ETHERIP_TCPIP = 97, /**< Ethernet-within-IP Encapsulation [RFC3378] */ + ENCAP_TCPIP = 98, /**< Encapsulation Header [RFC1241][Robert_Woodburn] */ + GMTP_TCPIP = 100, /**< GMTP [[RXB5]] */ + IFMP_TCPIP = 101, /**< Ipsilon Flow Management Protocol [Bob_Hinden][November 1995, 1997.] */ + PNNI_TCPIP = 102, /**< PNNI over IP [Ross_Callon] */ + PIM_TCPIP = 103, /**< Protocol Independent Multicast [RFC4601][Dino_Farinacci] */ + ARIS_TCPIP = 104, /**< ARIS [Nancy_Feldman] */ + SCPS_TCPIP = 105, /**< SCPS [Robert_Durst] */ + QNX_TCPIP = 106, /**< QNX [Michael_Hunter] */ + A_N_TCPIP = 107, /**< Active Networks [Bob_Braden] */ + IPComp_TCPIP = 108, /**< IP Payload Compression Protocol [RFC2393] */ + SNP_TCPIP = 109, /**< Sitara Networks Protocol [Manickam_R_Sridhar] */ + Compaq_Peer_TCPIP = 110, /**< Compaq Peer Protocol [Victor_Volpe] */ + IPX_in_IP_TCPIP = 111, /**< IPX in IP [CJ_Lee] */ + VRRP_TCPIP = 112, /**< Virtual Router Redundancy Protocol [RFC5798] */ + PGM_TCPIP = 113, /**< PGM Reliable Transport Protocol [Tony_Speakman] */ + L2TP_TCPIP = 115, /**< Layer Two Tunneling Protocol [RFC3931][Bernard_Aboba] */ + DDX_TCPIP = 116, /**< D-II Data Exchange (DDX) [John_Worley] */ + IATP_TCPIP = 117, /**< Interactive Agent Transfer Protocol [John_Murphy] */ + STP_TCPIP = 118, /**< Schedule Transfer Protocol [Jean_Michel_Pittet] */ + SRP_TCPIP = 119, /**< SpectraLink Radio Protocol [Mark_Hamilton] */ + UTI_TCPIP = 120, /**< UTI [Peter_Lothberg] */ + SMP_TCPIP = 121, /**< Simple Message Protocol [Leif_Ekblad] */ + SM_TCPIP = 122, /**< SM [Jon_Crowcroft] */ + PTP_TCPIP = 123, /**< Performance Transparency Protocol [Michael_Welzl] */ + ISIS_TCPIP = 124, /**< Over IPv4 [Tony_Przygienda] */ + FIRE_TCPIP = 125, /**< [Criag_Partridge] */ + CRTP_TCPIP = 126, /**< Combat Radio Transport Protocol [Robert_Sautter] */ + CRUDP_TCPIP = 127, /**< Combat Radio User Datagram [Robert_Sautter] */ + SSCOPMCE_TCPIP = 128, /**< [Kurt_Waber] */ + IPLT_TCPIP = 129, /**< [[Hollbach]] */ + SPS_TCPIP = 130, /**< Secure Packet Shield [Bill_McIntosh] */ + PIPE_TCPIP = 131, /**< Private IP Encapsulation within IP [Bernhard_Petri] */ + SCTP_TCPIP = 132, /**< Stream Control Transmission Protocol [Randall_R_Stewart] */ + FC_TCPIP = 133 /**< Fibre Channel [Murali_Rajagopal][RFC6172] */ +} ipProtocolNumbers; + +/** + * @ingroup tcpiplite + * @struct inAddr_t + * @brief INET address + */ +typedef struct +{ + union + { + uint32_t s_addr; + uint8_t s_addr_byte[4]; + }; +} inAddr_t; + + +/** + * @ingroup tcpiplite + * @struct sockaddr_in4_t + * @brief INET4 socket address + */ +typedef struct +{ + uint16_t port; + inAddr_t addr; +} sockaddr_in4_t; + + +extern const char *network_errors[]; + +/** + * @ingroup tcpiplite + * @enum error_msg + * @brief Error message + */ +typedef enum +{ + ERROR = 0, + SUCCESS, + LINK_NOT_FOUND, + BUFFER_BUSY, + TX_LOGIC_NOT_IDLE, + TX_QUEUED, + DMA_TIMEOUT, + MAC_NOT_FOUND, + IP_WRONG_VERSION, + IPV4_CHECKSUM_FAILS, + DEST_IP_NOT_MATCHED, + ICMP_CHECKSUM_FAILS, + UDP_CHECKSUM_FAILS, + TCP_CHECKSUM_FAILS, + PORT_NOT_AVAILABLE, + ARP_IP_NOT_MATCHED, + EAPoL_PACKET_FAILURE, + INCORRECT_IPV4_HLEN, + IPV4_NO_OPTIONS, + IPV6_CHECKSUM_FAILS, + IPV6_LOCAL_ADDR_RESOLVE, + IPV6_LOCAL_ADDR_INVALID, + NO_GATEWAY, + ADDRESS_RESOLUTION, + GLOBAL_DESTINATION, + ARP_WRONG_HARDWARE_ADDR_TYPE, + ARP_WRONG_PROTOCOL_TYPE, + ARP_WRONG_HARDWARE_ADDR_LEN, + ARP_WRONG_PROTOCOL_LEN +} error_msg; + +/** + * @ingroup tcpiplite + * @enum destIP_t + * @brief Destination IP Address + */ +typedef struct +{ + inAddr_t dest_addr; +} destIP_t; + +/** + * @ingroup tcpiplite + * @typedef int8_t + * @brief Counts up to 256 sockets numbers. + */ +typedef int8_t socklistsize_t; + +/** + * @ingroup tcpiplite + * @typedef ip_receive_function_ptr + * @brief Function pointer to the function that receives the payload + * @param int16_t Available bytes for the payload + * @return None. + */ +typedef void (*ip_receive_function_ptr)(int16_t); + +#endif /* TCPIP_TYPES_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/tcpv4.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/tcpv4.h new file mode 100644 index 0000000..d4e841c --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/tcpv4.h @@ -0,0 +1,372 @@ +/** + * Transmission Control Protocol (TCP) v4 Header File + * + * @file tcpv4.h + * + * @defgroup tcp TCP + * + * @brief This file provides the API implementation for the Transmission Control Protocol v4 (TCPv4). + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef TCPV4_H +#define TCPV4_H + +// Included Files +#include +#include "tcpip_types.h" + +// Macros +#define TCP_FIN_FLAG 0x01U +#define TCP_SYN_FLAG 0x02U +#define TCP_RST_FLAG 0x04U +#define TCP_PSH_FLAG 0x08U +#define TCP_ACK_FLAG 0x10U +#define TCP_URG_FLAG 0x20U +#define TCP_ECE_FLAG 0x40U +#define TCP_CWR_FLAG 0x80U + +// Enumeration Definition +/** + * @ingroup tcp + * @enum tcp_fsm_states_t + * @brief TCP Finite State Machine (FSM) states. + */ +typedef enum +{ + CLOSED = 0, /**< Facilitates initialization */ + LISTEN, + SYN_SENT, + SYN_RECEIVED, + ESTABLISHED, + FIN_WAIT_1, + FIN_WAIT_2, + CLOSE_WAIT, + CLOSING, + LAST_ACK, + TIME_WAIT, +} tcp_fsm_states_t; + +/** + * @ingroup tcp + * @enum tcpEvent_t + * @brief TCP events. + */ +typedef enum +{ + CLOSE = 0, /**< Facilitates initialization */ + ACTIVE_OPEN, + PASIVE_OPEN, + RCV_SYN, + RCV_ACK, + RCV_SYNACK, + RCV_FIN, + RCV_FINACK, + RX_PACKET, + RCV_RST, + RCV_RSTACK, + RCV_PSHACK, + TIMEOUT, + NOP +} tcpEvent_t; + +/** + * @ingroup tcp + * @enum socketState_t + * @brief Socket states to be used in the application. + */ +typedef enum +{ + NOT_A_SOCKET = 0, /**< This is not a socket */ + SOCKET_CLOSED, /**< Socket closed */ + SOCKET_IN_PROGRESS, /**< The TCP listens or initiates a connection */ + SOCKET_CONNECTED, /**< The TCP is in the established state and the user can send/receive data */ + SOCKET_CLOSING /**< The user initiates the closing procedure for this socket */ +} socketState_t; + +/** + * @ingroup tcp + * @enum tcpSocket_t + * @brief TCP Socket + */ +typedef struct +{ + uint32_t localIP; + uint16_t localPort; + uint32_t remoteIP; + uint16_t remotePort; +} tcpSocket_t; + +/** + * @ingroup tcp + * @enum tcpBufferState_t + * @brief TCP Buffer state. + */ +typedef enum +{ + NO_BUFF = 0, + RX_BUFF_IN_USE, + TX_BUFF_IN_USE +} tcpBufferState_t; + +/** + * @ingroup tcp + * @struct tcpTCB_t + * @brief Defines TCP Transmission Control Block + */ +typedef struct +{ + uint16_t localPort; /**< Local Port */ + + uint32_t destIP; + uint16_t destPort; + + uint32_t remoteSeqno; + uint32_t remoteAck; /**< Last ACK packet sent to remote */ + + uint32_t localSeqno; + uint32_t localLastAck; /**< Last ACK number received */ + + uint16_t remoteWnd; /**< Sender window */ + uint16_t localWnd; /**< Receiver window */ + + uint16_t mss; + + uint8_t *rxBufferStart; + uint8_t *rxBufferPtr; /**< Pointer to write inside the RX buffer */ + tcpBufferState_t rxBufState; + + uint8_t *txBufferStart; + uint8_t *txBufferPtr; + uint16_t bytesToSend; + tcpBufferState_t txBufState; + uint16_t bytesSent; + bool payloadSave; + + tcp_fsm_states_t fsmState; /**< Connection state */ + tcpEvent_t connectionEvent; + + void *nextTCB; /**< Downstream list pointer */ + void *prevTCB; /**< Upstream list pointer */ + + uint16_t timeout; /**< Retransmission time-out in seconds */ + uint16_t timeoutReloadValue; + uint8_t timeoutsCount; /**< Number of retransmissions */ + uint8_t flags; /**< Save the flags to be used for time-outs */ + + socketState_t socketState; /**< Socket states used in application */ +} tcpTCB_t; + +/** + * @ingroup tcp + * @enum tcp_options_t + * @brief TCP options. + */ +typedef enum +{ + TCP_EOP = 0u, /**< length = 0 End of Option List, [RFC793] */ + TCP_NOP = 1u, /**< length = 0 No-Operation, [RFC793] */ + TCP_MSS = 2u, /**< length = 4 Maximum Segment Size, [RFC793] */ + +#ifdef ALL_TCP_HEADER_OPTIONS // These options are not implemented + TCP_WIN_SCALE = 3, /**< length = 3 Window Scale, [RFC7323] */ + TCP_SACK = 4, /**< length = 2 SACK Permitted, [RFC2018] */ + + 5 /**< length = N SACK, [RFC2018] */ + 6 /**< length = 6 Echo (obsoleted by option 8), [RFC1072][RFC6247] */ + 7 /**< length = 6 Echo Reply (obsoleted by option 8), [RFC1072][RFC6247] */ + 8 /**< length = 10 Timestamps, [RFC7323] */ + 9 /**< length = 2 Partial Order Connection Permitted (obsolete), [RFC1693][RFC6247] */ + 10 /**< length = 3 Partial Order Service Profile (obsolete), [RFC1693][RFC6247] */ + 11 /**< length = 0 CC (obsolete), [RFC1644][RFC6247] */ + 12 /**< length = 0 CC.NEW (obsolete), [RFC1644][RFC6247] */ + 13 /**< length = 0 CC.ECHO (obsolete), [RFC1644][RFC6247] */ + 14 /**< length = 3 TCP Alternate Checksum Request (obsolete), [RFC1146][RFC6247] */ + 15 /**< length = N TCP Alternate Checksum Data (obsolete), [RFC1146][RFC6247] */ + 16 /**< length = 0 Skeeter, [Stev_Knowles] */ + 17 /**< length = 0 Bubba, [Stev_Knowles] */ + 18 /**< length = 3 Trailer Checksum Option, [Subbu_Subramaniam][Monroe_Bridges] */ + 19 /**< length = 18 MD5 Signature Option (obsoleted by option 29), [RFC2385] */ + 20 /**< length = 0 SCPS Capabilities, [Keith_Scott] */ + 21 /**< length = 0 Selective Negative Acknowledgements, [Keith_Scott] */ + 22 /**< length = 0 Record Boundaries, [Keith_Scott] */ + 23 /**< length = 0 Corruption experienced, [Keith_Scott] */ + 24 /**< length = 0 SNAP, [Vladimir_Sukonnik] */ + 25 /**< length = 0 Unassigned (released 2000-12-18), */ + 26 /**< length = 0 TCP Compression Filter, [Steve_Bellovin] */ + 27 /**< length = 8 Quick-Start Response, [RFC4782] */ + 28 /**< length = 4 "User Timeout Option (also, other known unauthorized use) [***][1]", [RFC5482] */ + 29 /**< length = 0 TCP Authentication Option (TCP-AO), [RFC5925] */ + 30 /**< length = N Multipath TCP (MPTCP), [RFC6824] */ + 31 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 32 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 33 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 34-75 /**< length = 0 Reserved, */ + 69 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 70 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 71-75 /**< length = 0 Reserved, */ + 76 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 77 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 78 /**< length = 0 Reserved (known unauthorized use without proper IANA assignment) [**], */ + 79-252 /**< length = 0 Reserved, */ + 253 /**< length = N "RFC3692-style Experiment 1 (also improperly used for shipping products) [*]", [RFC4727] */ + 254 /**< length = N "RFC3692-style Experiment 2 (also improperly used for shipping products) [*]", [RFC4727]" */ +#endif +} tcp_options_t; + +// TCP Public Interface Functions +/** + * @ingroup tcp + * @brief Initializes TCP structures, meaning certain internal TCP stack variables. + * @param None. + * @return None. + */ +void TCP_Init(void); + +/** + * @ingroup tcp + * @brief Initializes the TCB and adds it to the list of TCB pointers. + * The socket needs to be put in the Closed state. + * The user is responsible to manage memory allocation and release. + * @param *tcbPtr Pointer to the socket/TCB structure + * @retval -1 The insertion failed + * @retval 0 The insertion succeeded + */ +error_msg TCP_SocketInit(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Removes the socket pointer from the TCP stack, and the list of TCB pointers, respectively. + * After calling this routine the memory is ready to be used again. + * @param *tcbPtr Pointer to the socket/TCB structure + * @retval -1 Removing the socket failed + * @retval 0 Removing the socket succeeded + */ +error_msg TCP_SocketRemove(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Provides an interface to read the status of the socket. + * This routine also checks if the pointer is already in the TCB list. + * This means that the socket is "in use". If the socket is in the TCB list, the socket status will be returned. + * @param *socket_ptr Pointer to the socket/TCB structure + * @return Socket status. + */ +socketState_t TCP_SocketPoll(tcpTCB_t *socket_ptr); + +/** + * @ingroup tcp + * @brief Assigns a port number to the specified socket. + * This is used for configuring the local port of a socket. + * @param *tcbPtr Pointer to the socket/TCB structure + * @param port Port number to be used as a local port + * @retval True The port initialization succeeded + * @retval False The port initialization failed + */ +error_msg TCP_Bind(tcpTCB_t *tcbPtr, uint16_t port); + +/** + * @ingroup tcp + * @brief Listens for connections on a socket. This routine marks the socket as passive, + * meaning that it will be used to accept incoming connection requests. + * @param *tcbPtr Pointer to the socket/TCB structure + * @retval True Starting the server succeeded + * @retval False Starting the server failed + */ +error_msg TCP_Listen(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Starts the client for a particular socket. + * @param *tcbPtr Pointer to the socket/TCB structure + * @param *srvaddr Pointer to the server address + * @retval True Starting the server succeeded + * @retval False Starting the server failed + */ +error_msg TCP_Connect(tcpTCB_t *tcbPtr, sockaddr_in4_t *srvaddr); + +/** + * @ingroup tcp + * @brief Closes the TCP connection. + * This initiates the closing sequence for the TCP connection. + * @param *tcbPtr Pointer to the socket/TCB structure + * @retval True The closing sequence was initialized + * @retval False The closing sequence was not initialized + */ +error_msg TCP_Close(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Sends a buffer to a remote machine using a TCP connection. + * This routine adds the buffer to the socket and the payload is sent as soon as possible. + * @param *tcbPtr Pointer to the socket/TCB structure + * @param *data Pointer to the data buffer + * @param dataLen Size of the buffer + * @retval True Adding the buffer to the socket/TCB succeeded + * @retval False Adding the buffer to the socket/TCB failed + */ +error_msg TCP_Send(tcpTCB_t *tcbPtr, uint8_t *data, uint16_t dataLen); + +/** + * @ingroup tcp + * @brief Checks if the TX buffer was sent. + * This means that the data was received correctly by the remote machine and the TX buffer memory can be reused by the application. + * @param *tcbPtr Pointer to the socket/TCB structure + * @retval True Buffer transmission succeeded + * @retval False Buffer transmission failed or was not yet started + */ +error_msg TCP_SendDone(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Adds the RX buffer to the socket. + * @param *tcbPtr Pointer to the socket/TCB structure + * @param *data Pointer to the data buffer + * @param data_len Size of the buffer + * @retval True Passing the buffer to the socket succeeded + * @retval False Passing the buffer to the socket failed + */ +error_msg TCP_InsertRxBuffer(tcpTCB_t *tcbPtr, uint8_t *data, uint16_t data_len); + +/** + * @ingroup tcp + * @brief Reads the available data from the socket. This routine provides the start address of the received buffer to the user. + * @param *tcbPtr Pointer to the socket/TCB structure + * @return Number of received bytes in the buffer. + */ +int16_t TCP_GetReceivedData(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Checks and returns the number of available bytes received on a socket. + * @param *tcbPtr Pointer to the socket/TCB structure + * @return Number of received bytes in the buffer. + */ +int16_t TCP_GetRxLength(tcpTCB_t *tcbPtr); + +/** + * @ingroup tcp + * @brief Handles the TCP stack time-outs for each available socket. This routine needs to be called periodically. + * @param None. + * @return None. + */ +void TCP_Update(void); + +#endif /* TCPV4_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/udpv4.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/udpv4.h new file mode 100644 index 0000000..0393534 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/udpv4.h @@ -0,0 +1,89 @@ +/** + * UDP v4 Protocol Header File + * + * @file udpv4.h + * + * @defgroup udp UDP + * + * @brief This file provides the API implementation for UDP v4. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef UDPV4_H +#define UDPV4_H + +// Included Files +#include +#include "tcpip_types.h" +#include "../ethernet/physical_layer_interface.h" + +// Variables +extern uint16_t destPort; +extern udpHeader_t udpHeader; +extern ipv4Header_t ipv4Header; + +// Macros +#define UDP_ReadBlock(data,length) ETH_ReadBlock(data,length) +#define UDP_Read8() ETH_Read8() +#define UDP_Read16() ETH_Read16() +#define UDP_Read24() ETH_Read24() +#define UDP_Read32() ETH_Read32() +#define UDP_Write8(data) ETH_Write8(data) +#define UDP_Write16(data) ETH_Write16(data) +#define UDP_Write24(data) ETH_Write24(data) +#define UDP_Write32(data) ETH_Write32(data) +#define UDP_WriteBlock(data,length) ETH_WriteBlock(data,length) +#define UDP_WriteString(data) ETH_WriteString(data) +#define UDP_GetDestPort() (destPort) +#define UDP_GetSrcPort() (udpHeader.dstPort) +#define UDP_GetDestIP() (ipv4Header.srcIpAddress) +#define UDP_GetSrcIP() (ipv4Header.dstIpAddress) +#define UDP_DataLength() ((udpHeader.length) - 8) +#define UDP_FlushTXPackets() ETH_TxReset() +#define UDP_FlushRxdPacket() ETH_Flush() + +// UDP Library Functions +/** + @ingroup udp + @brief Starts a UDP packet. + @param destIP Destination IP address + @param srcPort Source port + @param dstPort Destination port + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg UDP_Start(uint32_t destIP, uint16_t srcPort, uint16_t dstPort); + +/** + @ingroup udp + @brief Sends a UDP packet. + @param None. + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg UDP_Send(void); + +/** + @ingroup udp + @brief Catches all UDP packets and dispatches them to the appropriate callback. + @param udpcksm UDP Checksum + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg UDP_Receive(uint16_t udpcksm); + +#endif /* UDPV4_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/udpv4_port_handler_table.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/udpv4_port_handler_table.h new file mode 100644 index 0000000..5df4070 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/tcpiplite/udpv4_port_handler_table.h @@ -0,0 +1,65 @@ +/** + * UDP Port Handler Header File + * + * @file udpv4_port_handler_table.h + * + * @ingroup udp + * + * @brief This file contains the UDP callback table. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef UDPV4_PORT_HANDLER_TABLE_H +#define UDPV4_PORT_HANDLER_TABLE_H + +// Included Files +#include "tcpip_types.h" + +/** + @ingroup udp + @struct udp_handler_t + @brief UDP handler types. + */ +typedef struct +{ + uint16_t portNumber; + ip_receive_function_ptr callBack; +} udp_handler_t; + +typedef const udp_handler_t * udp_table_iterator_t; + +// UDPV4 Port Handler Functions +/** + @ingroup udp + @brief Returns the UDP table iterator. + @param None. + @return Pointer to UDP_CallBackTable. + */ +udp_table_iterator_t udp_table_getIterator(void); + +/** + @ingroup udp + @brief Returns the UDP table next entry. + @param i UDP table iteration + @return Pointer to UDP_CallBackTable. + */ +udp_table_iterator_t udp_table_nextEntry(udp_table_iterator_t i); + +#endif /* UDPV4_PORT_HANDLER_TABLE_H */ diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/delay.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/delay.h new file mode 100644 index 0000000..d5320af --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/delay.h @@ -0,0 +1,54 @@ +/** + * DELAY Generated Driver API Header File + * + * @file delay.h + * + * @defgroup delay DELAY BLOCKING DRIVER + * + * @brief This file contains the API to generate delays in the range of milliseconds and microseconds. + * + * @version DELAY Driver Version 1.1.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef _DELAY_H +#define _DELAY_H + +#include + +/** +* @ingroup delay +* @brief Delays the execution of the program for a certain number of milliseconds +* @param[in] milliseconds - Number of milliseconds to delay +* @return None. +*/ +void DELAY_milliseconds(uint16_t milliseconds); + +/** +* @ingroup delay +* @brief Delays the execution of the program for a certain number of microseconds +* @param[in] microseconds - Number of microseconds to delay +* @return None. +*/ +void DELAY_microseconds(uint16_t microseconds); + +#endif // _DELAY_H \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/src/delay.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/src/delay.c new file mode 100644 index 0000000..4da05bc --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/src/delay.c @@ -0,0 +1,54 @@ +/** + * DELAY Generated Driver File + * + * @file delay.c + * + * @ingroup delay + * + * @brief This file contains functions to generate delays in the range of milliseconds and microseconds, using timer ticks to indicate delay length. + * + * @version DELAY Driver Version 1.1.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "../../system/clock.h" +#include +#include + +void DELAY_milliseconds(uint16_t milliseconds) { + while(milliseconds--){ + _delay_ms(1); + } +} + +void DELAY_microseconds(uint16_t microseconds) { + while( microseconds >= 32) + { + _delay_us(32); + microseconds -= 32; + } + + while(microseconds--) + { + _delay_us(1); + } +} \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/src/tca0.c b/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/src/tca0.c new file mode 100644 index 0000000..d845377 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/src/tca0.c @@ -0,0 +1,259 @@ +/** + * TCA0 Generated Driver File + * + * @file tca0.c + * + * @ingroup tca0_normal + * + * @brief This file contains the API implementations for TCA0 module driver in Normal (16-bit) mode. + * + * @version TCA0 Driver Version 2.1.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#include "../tca0.h" + +const struct TMR_INTERFACE TCA0_Interface = { + .Initialize = TCA0_Initialize, + .Start = TCA0_Start, + .Stop = TCA0_Stop, + .PeriodCountSet = TCA0_Write, + .TimeoutCallbackRegister = TCA0_OverflowCallbackRegister, + .Tasks = NULL +}; + +void TCA0_DefaultCompare0CallbackRegister(void); +void (*TCA0_CMP0_isr_cb)(void) = &TCA0_DefaultCompare0CallbackRegister; +void TCA0_DefaultCompare1CallbackRegister(void); +void (*TCA0_CMP1_isr_cb)(void) = &TCA0_DefaultCompare1CallbackRegister; +void TCA0_DefaultCompare2CallbackRegister(void); +void (*TCA0_CMP2_isr_cb)(void) = &TCA0_DefaultCompare2CallbackRegister; +void TCA0_DefaultOverflowCallbackRegister(void); +void (*TCA0_OVF_isr_cb)(void) = &TCA0_DefaultOverflowCallbackRegister; + +void TCA0_DefaultCompare0CallbackRegister(void) +{ + //Add your ISR code here +} + +void TCA0_DefaultCompare1CallbackRegister(void) +{ + //Add your ISR code here +} + +void TCA0_DefaultCompare2CallbackRegister(void) +{ + //Add your ISR code here +} + +void TCA0_DefaultOverflowCallbackRegister(void) +{ + //Add your ISR code here +} + +void TCA0_OverflowCallbackRegister(TCA0_cb_t cb) +{ + TCA0_OVF_isr_cb = cb; +} + +void TCA0_Compare0CallbackRegister(TCA0_cb_t cb) +{ + TCA0_CMP0_isr_cb = cb; +} + +void TCA0_Compare1CallbackRegister(TCA0_cb_t cb) +{ + TCA0_CMP1_isr_cb = cb; +} + +void TCA0_Compare2CallbackRegister(TCA0_cb_t cb) +{ + TCA0_CMP2_isr_cb = cb; +} + +ISR(TCA0_CMP0_vect) +{ + if (TCA0_CMP0_isr_cb != NULL) + (*TCA0_CMP0_isr_cb)(); + + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP0_bm; +} + +ISR(TCA0_CMP1_vect) +{ + if (TCA0_CMP1_isr_cb != NULL) + (*TCA0_CMP1_isr_cb)(); + + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP1_bm; +} + +ISR(TCA0_CMP2_vect) +{ + if (TCA0_CMP2_isr_cb != NULL) + (*TCA0_CMP2_isr_cb)(); + + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP2_bm; +} + +ISR(TCA0_OVF_vect) +{ + if (TCA0_OVF_isr_cb != NULL) + (*TCA0_OVF_isr_cb)(); + + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm; +} + + +void TCA0_Initialize(void) { + // Compare 0 + TCA0.SINGLE.CMP0 = 0x0; + + // Compare 1 + TCA0.SINGLE.CMP1 = 0x0; + + // Compare 2 + TCA0.SINGLE.CMP2 = 0x0; + + // Count + TCA0.SINGLE.CNT = 0x0; + + // ALUPD disabled; CMP0EN disabled; CMP1EN disabled; CMP2EN disabled; WGMODE NORMAL; + TCA0.SINGLE.CTRLB = 0x0; + + // CMP0OV disabled; CMP1OV disabled; CMP2OV disabled; + TCA0.SINGLE.CTRLC = 0x0; + + // SPLITM disabled; + TCA0.SINGLE.CTRLD = 0x0; + + // CMD NONE; DIR disabled; LUPD disabled; + TCA0.SINGLE.CTRLECLR = 0x0; + + // CMD NONE; DIR UP; LUPD disabled; + TCA0.SINGLE.CTRLESET = 0x0; + + // CMP0BV disabled; CMP1BV disabled; CMP2BV disabled; PERBV disabled; + TCA0.SINGLE.CTRLFCLR = 0x0; + + // CMP0BV disabled; CMP1BV disabled; CMP2BV disabled; PERBV disabled; + TCA0.SINGLE.CTRLFSET = 0x0; + + // DBGRUN disabled; + TCA0.SINGLE.DBGCTRL = 0x0; + + // CNTAEI disabled; CNTBEI disabled; EVACTA CNT_POSEDGE; EVACTB NONE; + TCA0.SINGLE.EVCTRL = 0x0; + + // CMP0 disabled; CMP1 disabled; CMP2 disabled; OVF enabled; + TCA0.SINGLE.INTCTRL = 0x1; + + // CMP0 disabled; CMP1 disabled; CMP2 disabled; OVF disabled; + TCA0.SINGLE.INTFLAGS = 0x0; + + // Period + TCA0.SINGLE.PER = 0x3D08; + + // Temporary data for 16-bit Access + TCA0.SINGLE.TEMP = 0x0; + + // CLKSEL DIV256; ENABLE enabled; RUNSTDBY disabled; + TCA0.SINGLE.CTRLA = 0xD; + +} + +void TCA0_Start(void) +{ + TCA0.SINGLE.CTRLA|= TCA_SINGLE_ENABLE_bm; +} + +void TCA0_Stop(void) +{ + TCA0.SINGLE.CTRLA&= ~TCA_SINGLE_ENABLE_bm; +} + +void TCA0_Write(uint16_t timerVal) +{ + TCA0.SINGLE.PER=timerVal; +} + +uint16_t TCA0_Read(void) +{ + uint16_t readVal; + + readVal = TCA0.SINGLE.CNT; + + return readVal; +} + +void TCA0_EnableInterrupt(void) +{ + TCA0.SINGLE.INTCTRL = 1 << TCA_SINGLE_CMP0_bp /* Compare 0 Interrupt: enabled */ + | 1 << TCA_SINGLE_CMP1_bp /* Compare 1 Interrupt: enabled */ + | 1 << TCA_SINGLE_CMP2_bp /* Compare 2 Interrupt: enabled */ + | 1 << TCA_SINGLE_OVF_bp; /* Overflow Interrupt: enabled */ +} +void TCA0_DisableInterrupt(void) +{ + TCA0.SINGLE.INTCTRL = 0 << TCA_SINGLE_CMP0_bp /* Compare 0 Interrupt: disabled */ + | 0 << TCA_SINGLE_CMP1_bp /* Compare 1 Interrupt: disabled */ + | 0 << TCA_SINGLE_CMP2_bp /* Compare 2 Interrupt: disabled */ + | 0 << TCA_SINGLE_OVF_bp; /* Overflow Interrupt: disabled */ +} +void TCA0_ClearOverflowInterruptFlag(void) +{ + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm; /* Clear Overflow Interrupt Flag */ +} +bool TCA0_IsOverflowInterruptFlagSet(void) +{ + return ((TCA0.SINGLE.INTFLAGS & TCA_SINGLE_OVF_bm) > 0); +} + +void TCA0_ClearCMP0InterruptFlag(void) +{ + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP0_bm; /* Clear Compare Channel-0 Interrupt Flag */ +} + +bool TCA0_IsCMP0InterruptFlagSet(void) +{ + return ((TCA0.SINGLE.INTFLAGS & TCA_SINGLE_CMP0_bm) > 0); +} + +void TCA0_ClearCMP1InterruptFlag(void) +{ + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP1_bm; /* Clear Compare Channel-1 Interrupt Flag */ +} + +bool TCA0_IsCMP1InterruptFlagSet(void) +{ + return ((TCA0.SINGLE.INTFLAGS & TCA_SINGLE_CMP1_bm) > 0); +} + +void TCA0_ClearCMP2InterruptFlag(void) +{ + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP2_bm; /* Clear Compare Channel-2 Interrupt Flag */ +} + +bool TCA0_IsCMP2InterruptFlagSet(void) +{ + return ((TCA0.SINGLE.INTFLAGS & TCA_SINGLE_CMP2_bm) > 0); +} \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/tca0.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/tca0.h new file mode 100644 index 0000000..44c4c0e --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/tca0.h @@ -0,0 +1,199 @@ +/** + * TCA0 Generated Driver API Header File + * + * @file tca0.h + * + * @defgroup tca0_normal TCA0 in Normal Mode + * + * @brief This file contains the API prototypes for the TCA0 driver in Normal (16-bit) mode. + * + * @version TCA0 Driver Version 2.1.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef TCA0_H_INCLUDED +#define TCA0_H_INCLUDED + +#include +#include +#include "../system/system.h" +#include "timer_interface.h" +#include "../system/utils/compiler.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup tca0_normal + * @typedef void TCA0_cb_t + * @brief Function pointer to the callback function called by TCA when operating in Normal mode. The default value is set to NULL which means that no callback function will be used. + */ +typedef void (*TCA0_cb_t)(void); + +extern const struct TMR_INTERFACE TCA0_Interface; + +/** + * @ingroup tca0_normal + * @brief Initializes the TCA. + * @param None. + * @return None. + */ +void TCA0_Initialize(void); +/** + * @ingroup tca0_normal + * @brief Starts the 16-bit timer/counter for the TCA. + * @param None. + * @return None. + */ +void TCA0_Start(void); +/** + * @ingroup tca0_normal + * @brief Stops the 16-bit timer/counter for the TCA. + * @param None. + * @return None. + */ +void TCA0_Stop(void); +/** + * @ingroup tca0_normal + * @brief Interrupt Service Routine (ISR) callback function register to be called if the Overflow Interrupt flag is set. + * @param TCA0_cb_t cb - Callback function for Overflow event. + * @return None. + */ +void TCA0_OverflowCallbackRegister(TCA0_cb_t cb); +/** + * @ingroup tca0_normal + * @brief ISR callback function to be called if the Compare 0 Match Interrupt flag is set. + * @param TCA0_cb_t cb - Callback function for Compare 0 match event. + * @return None. + */ +void TCA0_Compare0CallbackRegister(TCA0_cb_t cb); +/** + * @ingroup tca0_normal + * @brief ISR callback function to be called if the Compare 1 Match Interrupt flag is set. + * @param TCA0_cb_t cb - Callback function for Compare 1 match event. + * @return None. + */ +void TCA0_Compare1CallbackRegister(TCA0_cb_t cb); +/** + * @ingroup tca0_normal + * @brief ISR callback function to be called if the Compare 2 Match Interrupt flag is set. + * @param TCA0_cb_t cb - Callback function for Compare 2 match event. + * @return None. + */ +void TCA0_Compare2CallbackRegister(TCA0_cb_t cb); +/** + * @ingroup tca0_normal + * @brief Enables the 16-bit timer/counter interrupt for the TCA. + * @param None. + * @return None. + */ +void TCA0_EnableInterrupt(void); +/** + * @ingroup tca0_normal + * @brief Disables the 16-bit timer/counter interrupt for the TCA. + * @param None. + * @return None. + */ +void TCA0_DisableInterrupt(void); +/** + * @ingroup tca0_normal + * @brief Reads the 16-bit timer/counter value for the TCA. + * @param None. + * @return uint16_t - timer/counter value returns from the TCA0. + */ +uint16_t TCA0_Read(void); +/** + * @ingroup tca0_normal + * @brief Writes the timer value to load to the TCA. + * @param uint16_t timerVal - Loading the timer value for the TCA. + * @return None. + */ +void TCA0_Write(uint16_t timerVal); +/** + * @ingroup tca0_normal + * @brief Clears the Overflow Interrupt flag after the Overflow flag set. + * @param None. + * @return None. + */ +void TCA0_ClearOverflowInterruptFlag(void); +/** + * @ingroup tca0_normal + * @brief Checks the Overflow Interrupt flag status for the TCA. + * @param None. + * @retval True - Overflow Interrupt flag is set. + * @retval False - Overflow Interrupt flag is not set. + */ +bool TCA0_IsOverflowInterruptFlagSet(void); +/** + * @ingroup tca0_normal + * @brief Clears the Compare 0 Interrupt flag after the Compare 0 flag is set. + * @param None. + * @return None. + */ +void TCA0_ClearCMP0InterruptFlag(void); +/** + * @ingroup tca0_normal + * @brief Checks the Compare 0 Interrupt flag status for the TCA. + * @param None. + * @retval True - Compare 0 Interrupt flag is set. + * @retval False - Compare 0 Interrupt flag is not set. + */ +bool TCA0_IsCMP0InterruptFlagSet(void); +/** + * @ingroup tca0_normal + * @brief Clears the Compare 1 Interrupt flag after the Compare 1 flag is set. + * @param None. + * @return None. + */ +void TCA0_ClearCMP1InterruptFlag(void); +/** + * @ingroup tca0_normal + * @brief Checks the Compare 1 Interrupt flag status for the TCA. + * @param None. + * @retval True - Compare 1 Interrupt flag is set. + * @retval False - Compare 1 Interrupt flag is not set. + */ +bool TCA0_IsCMP1InterruptFlagSet(void); +/** + * @ingroup tca0_normal + * @brief Clears the Compare 2 Interrupt flag after the Compare 2 flag is set. + * @param None. + * @return None. + */ +void TCA0_ClearCMP2InterruptFlag(void); + +/** + * @ingroup tca0_normal + * @brief Checks the Compare 2 Interrupt flag status for the TCA. + * @param None. + * @retval True - Compare 2 Interrupt flag is set. + * @retval False - Compare 2 Interrupt flag is not set. + */ +bool TCA0_IsCMP2InterruptFlagSet(void); + +#ifdef __cplusplus +} +#endif + +#endif /* TCA0_H_INCLUDED */ \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/timer_interface.h b/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/timer_interface.h new file mode 100644 index 0000000..a5fb6d3 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/mcc_generated_files/timer/timer_interface.h @@ -0,0 +1,69 @@ +/** + @Company + Microchip Technology Inc. + + @File Name + TMR_interface.h + + @Summary + This is the generated header file for Timer module interfaces. + + @Description + This header file provides interfaces to Timer driver APIs. + Generation Information : + Driver Version : 1.00 + The generated drivers are tested against the following: + MPLAB : MPLAB X v5.40 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef TMR_INTERFACE_H +#define TMR_INTERFACE_H + +/** + * @brief This file contains API prototypes and other datatypes for Timer-0 module. + * @defgroup timer_interface Timer Interface + * @{ + */ + +#include + +/** + @ingroup timer_interface + @typedef struct TMR_INTERFACE + @brief This structure contains the interfaces to Timer module + */ + +struct TMR_INTERFACE +{ + void (*Initialize)(void); + void (*Start)(void); + void (*Stop)(void); + void (*PeriodCountSet)(size_t count); + void (*TimeoutCallbackRegister)(void (* CallbackHandler)(void)); + void (*Tasks)(void); +}; +/** + * @} + */ +#endif //TMR_INTERFACE_H \ No newline at end of file diff --git a/enc28j60-avr-tcpserver.X/nbproject/Makefile-default.mk b/enc28j60-avr-tcpserver.X/nbproject/Makefile-default.mk new file mode 100644 index 0000000..0bb8868 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/nbproject/Makefile-default.mk @@ -0,0 +1,432 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Include project Makefile +ifeq "${IGNORE_LOCAL}" "TRUE" +# do not include local makefile. User is passing all local related variables already +else +include Makefile +# Include makefile containing local settings +ifeq "$(wildcard nbproject/Makefile-local-default.mk)" "nbproject/Makefile-local-default.mk" +include nbproject/Makefile-local-default.mk +endif +endif + +# Environment +MKDIR=mkdir -p +RM=rm -f +MV=mv +CP=cp + +# Macros +CND_CONF=default +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +IMAGE_TYPE=debug +OUTPUT_SUFFIX=elf +DEBUGGABLE_SUFFIX=elf +FINAL_IMAGE=${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +else +IMAGE_TYPE=production +OUTPUT_SUFFIX=hex +DEBUGGABLE_SUFFIX=elf +FINAL_IMAGE=${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +endif + +ifeq ($(COMPARE_BUILD), true) +COMPARISON_BUILD=-mafrlcsj +else +COMPARISON_BUILD= +endif + +# Object Directory +OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} + +# Distribution Directory +DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} + +# Source Files Quoted if spaced +SOURCEFILES_QUOTED_IF_SPACED=app_files/src/tcp_server_demo.c mcc_generated_files/ethernet/src/enc28j60.c mcc_generated_files/spi/src/spi0.c mcc_generated_files/system/src/clock.c mcc_generated_files/system/src/pins.c mcc_generated_files/system/src/protected_io.S mcc_generated_files/system/src/interrupt.c mcc_generated_files/system/src/system.c mcc_generated_files/system/src/config_bits.c mcc_generated_files/tcpiplite/src/lfsr.c mcc_generated_files/tcpiplite/src/dhcp_client.c mcc_generated_files/tcpiplite/src/tcpv4.c mcc_generated_files/tcpiplite/src/arpv4.c mcc_generated_files/tcpiplite/src/ipv4.c mcc_generated_files/tcpiplite/src/rtcc.c mcc_generated_files/tcpiplite/src/ip_database.c mcc_generated_files/tcpiplite/src/log_syslog.c mcc_generated_files/tcpiplite/src/network.c mcc_generated_files/tcpiplite/src/udpv4.c mcc_generated_files/tcpiplite/src/log.c mcc_generated_files/tcpiplite/src/log_console.c mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c mcc_generated_files/timer/src/tca0.c mcc_generated_files/timer/src/delay.c main.c + +# Object Files Quoted if spaced +OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/app_files/src/tcp_server_demo.o ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o ${OBJECTDIR}/mcc_generated_files/system/src/clock.o ${OBJECTDIR}/mcc_generated_files/system/src/pins.o ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o ${OBJECTDIR}/mcc_generated_files/system/src/system.o ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o ${OBJECTDIR}/main.o +POSSIBLE_DEPFILES=${OBJECTDIR}/app_files/src/tcp_server_demo.o.d ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d ${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d ${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d ${OBJECTDIR}/mcc_generated_files/system/src/system.o.d ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d ${OBJECTDIR}/main.o.d + +# Object Files +OBJECTFILES=${OBJECTDIR}/app_files/src/tcp_server_demo.o ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o ${OBJECTDIR}/mcc_generated_files/system/src/clock.o ${OBJECTDIR}/mcc_generated_files/system/src/pins.o ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o ${OBJECTDIR}/mcc_generated_files/system/src/system.o ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o ${OBJECTDIR}/main.o + +# Source Files +SOURCEFILES=app_files/src/tcp_server_demo.c mcc_generated_files/ethernet/src/enc28j60.c mcc_generated_files/spi/src/spi0.c mcc_generated_files/system/src/clock.c mcc_generated_files/system/src/pins.c mcc_generated_files/system/src/protected_io.S mcc_generated_files/system/src/interrupt.c mcc_generated_files/system/src/system.c mcc_generated_files/system/src/config_bits.c mcc_generated_files/tcpiplite/src/lfsr.c mcc_generated_files/tcpiplite/src/dhcp_client.c mcc_generated_files/tcpiplite/src/tcpv4.c mcc_generated_files/tcpiplite/src/arpv4.c mcc_generated_files/tcpiplite/src/ipv4.c mcc_generated_files/tcpiplite/src/rtcc.c mcc_generated_files/tcpiplite/src/ip_database.c mcc_generated_files/tcpiplite/src/log_syslog.c mcc_generated_files/tcpiplite/src/network.c mcc_generated_files/tcpiplite/src/udpv4.c mcc_generated_files/tcpiplite/src/log.c mcc_generated_files/tcpiplite/src/log_console.c mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c mcc_generated_files/timer/src/tca0.c mcc_generated_files/timer/src/delay.c main.c + + + +CFLAGS= +ASFLAGS= +LDLIBSOPTIONS= + +############# Tool locations ########################################## +# If you copy a project from one host to another, the path where the # +# compiler is installed may be different. # +# If you open this project with MPLAB X in the new host, this # +# makefile will be regenerated and the paths will be corrected. # +####################################################################### +# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build +FIXDEPS=fixDeps + +.build-conf: ${BUILD_SUBPROJECTS} +ifneq ($(INFORMATION_MESSAGE), ) + @echo $(INFORMATION_MESSAGE) +endif + ${MAKE} -f nbproject/Makefile-default.mk ${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} + +MP_PROCESSOR_OPTION=AVR64DD32 +# ------------------------------------------------------------------------------------ +# Rules for buildStep: compile +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${OBJECTDIR}/app_files/src/tcp_server_demo.o: app_files/src/tcp_server_demo.c .generated_files/flags/default/2ba7e6768b1a6f0a6a10dae24594953a3f85acdc .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/app_files/src" + @${RM} ${OBJECTDIR}/app_files/src/tcp_server_demo.o.d + @${RM} ${OBJECTDIR}/app_files/src/tcp_server_demo.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/app_files/src/tcp_server_demo.o.d" -MT "${OBJECTDIR}/app_files/src/tcp_server_demo.o.d" -MT ${OBJECTDIR}/app_files/src/tcp_server_demo.o -o ${OBJECTDIR}/app_files/src/tcp_server_demo.o app_files/src/tcp_server_demo.c + +${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o: mcc_generated_files/ethernet/src/enc28j60.c .generated_files/flags/default/891b17e7bd6ed4d99fe803cf92315bcef6f48299 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/ethernet/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d" -MT "${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d" -MT ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o -o ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o mcc_generated_files/ethernet/src/enc28j60.c + +${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o: mcc_generated_files/spi/src/spi0.c .generated_files/flags/default/fb87b3e84a77df49b358a135aa7ea548b66aae35 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/spi/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d" -MT "${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d" -MT ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o -o ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o mcc_generated_files/spi/src/spi0.c + +${OBJECTDIR}/mcc_generated_files/system/src/clock.o: mcc_generated_files/system/src/clock.c .generated_files/flags/default/13c87669f45cf8284dc339902c41d607412bd697 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/clock.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/clock.o -o ${OBJECTDIR}/mcc_generated_files/system/src/clock.o mcc_generated_files/system/src/clock.c + +${OBJECTDIR}/mcc_generated_files/system/src/pins.o: mcc_generated_files/system/src/pins.c .generated_files/flags/default/16ec3c03a96f80235277e6c4270709bc7e70f390 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/pins.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/pins.o -o ${OBJECTDIR}/mcc_generated_files/system/src/pins.o mcc_generated_files/system/src/pins.c + +${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o: mcc_generated_files/system/src/interrupt.c .generated_files/flags/default/6ab6cb81fef63f13ad74a5cecdf0df01aa92cfa2 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o -o ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o mcc_generated_files/system/src/interrupt.c + +${OBJECTDIR}/mcc_generated_files/system/src/system.o: mcc_generated_files/system/src/system.c .generated_files/flags/default/8a3126d2a62e94dd7d047f6412f20fcddc6e9e02 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/system.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/system.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/system.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/system.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/system.o -o ${OBJECTDIR}/mcc_generated_files/system/src/system.o mcc_generated_files/system/src/system.c + +${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o: mcc_generated_files/system/src/config_bits.c .generated_files/flags/default/e9e9351a86bf97197894ebf77f16b53c55f3a8d1 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o -o ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o mcc_generated_files/system/src/config_bits.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o: mcc_generated_files/tcpiplite/src/lfsr.c .generated_files/flags/default/90be9939525ecc86d495c3cb124dd9c1786dbed2 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o mcc_generated_files/tcpiplite/src/lfsr.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o: mcc_generated_files/tcpiplite/src/dhcp_client.c .generated_files/flags/default/904216437ef5ddcecd8b16b10b2c152d2598baf8 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o mcc_generated_files/tcpiplite/src/dhcp_client.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o: mcc_generated_files/tcpiplite/src/tcpv4.c .generated_files/flags/default/f125975e61a9f19c8cdc3d6dbb0c7426f2435e3 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o mcc_generated_files/tcpiplite/src/tcpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o: mcc_generated_files/tcpiplite/src/arpv4.c .generated_files/flags/default/efdbf6d9d129f55cc7a9a60e2c167fba0becd917 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o mcc_generated_files/tcpiplite/src/arpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o: mcc_generated_files/tcpiplite/src/ipv4.c .generated_files/flags/default/33a0008251900b3c0af4060601e1d9379b643b33 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o mcc_generated_files/tcpiplite/src/ipv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o: mcc_generated_files/tcpiplite/src/rtcc.c .generated_files/flags/default/6509471fbaafcf36324b325dde9fa1311dddf882 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o mcc_generated_files/tcpiplite/src/rtcc.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o: mcc_generated_files/tcpiplite/src/ip_database.c .generated_files/flags/default/68ce0a2da6b41ced018895a4f9944a733e000370 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o mcc_generated_files/tcpiplite/src/ip_database.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o: mcc_generated_files/tcpiplite/src/log_syslog.c .generated_files/flags/default/eb898ed353f6e7329cd63c93c765f39dfc95c17b .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o mcc_generated_files/tcpiplite/src/log_syslog.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o: mcc_generated_files/tcpiplite/src/network.c .generated_files/flags/default/4fd26b19197a1510d3a0b07258b5f13452603820 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o mcc_generated_files/tcpiplite/src/network.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o: mcc_generated_files/tcpiplite/src/udpv4.c .generated_files/flags/default/303a6696d8fd52c3a8b65ea81c0bd2ffb649581e .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o mcc_generated_files/tcpiplite/src/udpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o: mcc_generated_files/tcpiplite/src/log.c .generated_files/flags/default/4efced210f07fb0c4c596a820f6aa4ecbce7cd52 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o mcc_generated_files/tcpiplite/src/log.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o: mcc_generated_files/tcpiplite/src/log_console.c .generated_files/flags/default/2a803f6c59b2da086919285b4887c377632ec6c9 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o mcc_generated_files/tcpiplite/src/log_console.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o: mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c .generated_files/flags/default/aed21bd10aee82d0278e79b12c1d74eb19c0759e .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c + +${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o: mcc_generated_files/timer/src/tca0.c .generated_files/flags/default/33a0bd0cd7502de6a3b6558149c1b3896b432823 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/timer/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d" -MT "${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d" -MT ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o -o ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o mcc_generated_files/timer/src/tca0.c + +${OBJECTDIR}/mcc_generated_files/timer/src/delay.o: mcc_generated_files/timer/src/delay.c .generated_files/flags/default/672906a875c1a888a9de664218fd3e669da3ccc7 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/timer/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d" -MT "${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d" -MT ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o -o ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o mcc_generated_files/timer/src/delay.c + +${OBJECTDIR}/main.o: main.c .generated_files/flags/default/1b92ab598df0f2484dd57c999c39dbe18248e131 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}" + @${RM} ${OBJECTDIR}/main.o.d + @${RM} ${OBJECTDIR}/main.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/main.o.d" -MT "${OBJECTDIR}/main.o.d" -MT ${OBJECTDIR}/main.o -o ${OBJECTDIR}/main.o main.c + +else +${OBJECTDIR}/app_files/src/tcp_server_demo.o: app_files/src/tcp_server_demo.c .generated_files/flags/default/abaed1c47d50a6efc4b8895a0056e64a019a8e56 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/app_files/src" + @${RM} ${OBJECTDIR}/app_files/src/tcp_server_demo.o.d + @${RM} ${OBJECTDIR}/app_files/src/tcp_server_demo.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/app_files/src/tcp_server_demo.o.d" -MT "${OBJECTDIR}/app_files/src/tcp_server_demo.o.d" -MT ${OBJECTDIR}/app_files/src/tcp_server_demo.o -o ${OBJECTDIR}/app_files/src/tcp_server_demo.o app_files/src/tcp_server_demo.c + +${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o: mcc_generated_files/ethernet/src/enc28j60.c .generated_files/flags/default/aeab0bfcef3cc1ee792781fd319f890f6f5e89d9 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/ethernet/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d" -MT "${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d" -MT ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o -o ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o mcc_generated_files/ethernet/src/enc28j60.c + +${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o: mcc_generated_files/spi/src/spi0.c .generated_files/flags/default/530805ae64f9a5494ca9aae5af3bf7565ec5054f .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/spi/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d" -MT "${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d" -MT ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o -o ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o mcc_generated_files/spi/src/spi0.c + +${OBJECTDIR}/mcc_generated_files/system/src/clock.o: mcc_generated_files/system/src/clock.c .generated_files/flags/default/63e6cc5d411fb3dae41fdaece70698bc4ca2c7a3 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/clock.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/clock.o -o ${OBJECTDIR}/mcc_generated_files/system/src/clock.o mcc_generated_files/system/src/clock.c + +${OBJECTDIR}/mcc_generated_files/system/src/pins.o: mcc_generated_files/system/src/pins.c .generated_files/flags/default/29c522c3d4948296b3bb6ee11d65083347785dc0 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/pins.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/pins.o -o ${OBJECTDIR}/mcc_generated_files/system/src/pins.o mcc_generated_files/system/src/pins.c + +${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o: mcc_generated_files/system/src/interrupt.c .generated_files/flags/default/60ac4b0d7087db2c9289b3000f1b788f78cc475b .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o -o ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o mcc_generated_files/system/src/interrupt.c + +${OBJECTDIR}/mcc_generated_files/system/src/system.o: mcc_generated_files/system/src/system.c .generated_files/flags/default/e220daa174a831b6551b4650b1a90d3cf799b307 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/system.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/system.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/system.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/system.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/system.o -o ${OBJECTDIR}/mcc_generated_files/system/src/system.o mcc_generated_files/system/src/system.c + +${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o: mcc_generated_files/system/src/config_bits.c .generated_files/flags/default/9b9dddf9c8abf82112a05059ceac3beff1f3d9d6 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o -o ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o mcc_generated_files/system/src/config_bits.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o: mcc_generated_files/tcpiplite/src/lfsr.c .generated_files/flags/default/98574479ab93bb2b6a44bd48053583ae5c252e13 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o mcc_generated_files/tcpiplite/src/lfsr.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o: mcc_generated_files/tcpiplite/src/dhcp_client.c .generated_files/flags/default/f749e122000ec1ddca411dc6205c3993b8d2aa56 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o mcc_generated_files/tcpiplite/src/dhcp_client.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o: mcc_generated_files/tcpiplite/src/tcpv4.c .generated_files/flags/default/26fdda3cf48ad924a9960cba0de4ef9f242ff230 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/tcpv4.o mcc_generated_files/tcpiplite/src/tcpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o: mcc_generated_files/tcpiplite/src/arpv4.c .generated_files/flags/default/b54904f5d2f2a7fe115b99b6e1f8ecbc43b0b623 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o mcc_generated_files/tcpiplite/src/arpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o: mcc_generated_files/tcpiplite/src/ipv4.c .generated_files/flags/default/f62e9c84fb7a830e84c6fb88eda097c912aabe00 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o mcc_generated_files/tcpiplite/src/ipv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o: mcc_generated_files/tcpiplite/src/rtcc.c .generated_files/flags/default/258f417340548926bb914b41435c5d1611e13baa .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o mcc_generated_files/tcpiplite/src/rtcc.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o: mcc_generated_files/tcpiplite/src/ip_database.c .generated_files/flags/default/e7ecfbed4677674ca41ec81e4686076d11e5b423 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o mcc_generated_files/tcpiplite/src/ip_database.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o: mcc_generated_files/tcpiplite/src/log_syslog.c .generated_files/flags/default/5e672a4f23cb2af940493e8e2132fcea3ea2f496 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o mcc_generated_files/tcpiplite/src/log_syslog.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o: mcc_generated_files/tcpiplite/src/network.c .generated_files/flags/default/f6a3addc5e08809f5551efe5e3612d3374f041e .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o mcc_generated_files/tcpiplite/src/network.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o: mcc_generated_files/tcpiplite/src/udpv4.c .generated_files/flags/default/4cbadf562a295e4d690a71a229b904b04f8867c6 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o mcc_generated_files/tcpiplite/src/udpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o: mcc_generated_files/tcpiplite/src/log.c .generated_files/flags/default/5d0b76882c460009be4725690bb4d445c3e27136 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o mcc_generated_files/tcpiplite/src/log.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o: mcc_generated_files/tcpiplite/src/log_console.c .generated_files/flags/default/f3fa263dcc7f44ac8b4ddd4079096c9d4c995de8 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o mcc_generated_files/tcpiplite/src/log_console.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o: mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c .generated_files/flags/default/591829bb685540d070e14904d77884b344fcf0ab .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c + +${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o: mcc_generated_files/timer/src/tca0.c .generated_files/flags/default/d122a4f83f0b2ab91ce46448a2f63a41beb7a154 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/timer/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d" -MT "${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d" -MT ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o -o ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o mcc_generated_files/timer/src/tca0.c + +${OBJECTDIR}/mcc_generated_files/timer/src/delay.o: mcc_generated_files/timer/src/delay.c .generated_files/flags/default/7449c1626d192c626a46dce8dde1b302fd1c46df .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/timer/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d" -MT "${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d" -MT ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o -o ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o mcc_generated_files/timer/src/delay.c + +${OBJECTDIR}/main.o: main.c .generated_files/flags/default/2475c429b5fcd74f98f950a31c3f4c3c6164d43b .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}" + @${RM} ${OBJECTDIR}/main.o.d + @${RM} ${OBJECTDIR}/main.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -MD -MP -MF "${OBJECTDIR}/main.o.d" -MT "${OBJECTDIR}/main.o.d" -MT ${OBJECTDIR}/main.o -o ${OBJECTDIR}/main.o main.c + +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: assemble +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +else +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: assembleWithPreprocess +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o: mcc_generated_files/system/src/protected_io.S .generated_files/flags/default/33fbccfd11dc4ce528133d835f1054004e201fdb .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o + ${MP_CC} -c $(MP_EXTRA_AS_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x assembler-with-cpp -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -Wa,--defsym=__MPLAB_BUILD=1,--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1 -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o -o ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o mcc_generated_files/system/src/protected_io.S + +else +${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o: mcc_generated_files/system/src/protected_io.S .generated_files/flags/default/6ebd36629e2b289647de3a90c9a2e70181ba4592 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o + ${MP_CC} -c $(MP_EXTRA_AS_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -x assembler-with-cpp -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem -Wa,--defsym=__MPLAB_BUILD=1 -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o -o ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o mcc_generated_files/system/src/protected_io.S + +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: link +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} ${DISTDIR} + ${MP_CC} $(MP_EXTRA_LD_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -Wl,-Map=${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.map -D__DEBUG=1 -DXPRJ_default=$(CND_CONF) -Wl,--defsym=__MPLAB_BUILD=1 -mdfp="${DFP_DIR}/xc8" -gdwarf-2 -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem $(COMPARISON_BUILD) -Wl,--memorysummary,${DISTDIR}/memoryfile.xml -o ${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} -o ${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1 + @${RM} ${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.hex + +else +${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} ${DISTDIR} + ${MP_CC} $(MP_EXTRA_LD_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -Wl,-Map=${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.map -DXPRJ_default=$(CND_CONF) -Wl,--defsym=__MPLAB_BUILD=1 -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -gdwarf-3 -mconst-data-in-progmem -mno-const-data-in-config-mapped-progmem $(COMPARISON_BUILD) -Wl,--memorysummary,${DISTDIR}/memoryfile.xml -o ${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} -o ${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--start-group -Wl,-lm -Wl,--end-group + ${MP_CC_DIR}/avr-objcopy -O ihex "${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX}" "${DISTDIR}/enc28j60-avr-tcpserver.X.${IMAGE_TYPE}.hex" +endif + + +# Subprojects +.build-subprojects: + + +# Subprojects +.clean-subprojects: + +# Clean Targets +.clean-conf: ${CLEAN_SUBPROJECTS} + ${RM} -r ${OBJECTDIR} + ${RM} -r ${DISTDIR} diff --git a/enc28j60-avr-tcpserver.X/nbproject/Makefile-genesis.properties b/enc28j60-avr-tcpserver.X/nbproject/Makefile-genesis.properties new file mode 100644 index 0000000..2756681 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/nbproject/Makefile-genesis.properties @@ -0,0 +1,13 @@ +# +#Fri Aug 11 20:44:36 UTC 2023 +default.languagetoolchain.version=2.41 +default.Pack.dfplocation=/opt/microchip/mplabx/v6.10/packs/Microchip/AVR-Dx_DFP/2.3.272 +default.com-microchip-mplab-mdbcore-AtmelIceScripting-AtmelIceScriptingBase.md5=acafdfc19fbc230fa3bd22a525cc735a +conf.ids=default +default.languagetoolchain.dir=/opt/microchip/xc8/v2.41/bin +host.id=909n-6uww-y +configurations-xml=f03d3957f031bf68552529b647262f8c +com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=ff725c3d3fe40010a04a4bae132aaf51 +default.com-microchip-mplab-nbide-toolchain-xc8-XC8LanguageToolchain.md5=9fced058cfa47be6abe62f69e8f0cfe0 +proj.dir=/home/jenkins/agent/workspace/pip-lite-enc28j60-solution_1.0.0/enc28j60-avr-tcpserver.X +host.platform=linux diff --git a/enc28j60-avr-tcpserver.X/nbproject/Makefile-impl.mk b/enc28j60-avr-tcpserver.X/nbproject/Makefile-impl.mk new file mode 100644 index 0000000..d9a1b47 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/nbproject/Makefile-impl.mk @@ -0,0 +1,69 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a pre- and a post- target defined where you can add customization code. +# +# This makefile implements macros and targets common to all configurations. +# +# NOCDDL + + +# Building and Cleaning subprojects are done by default, but can be controlled with the SUB +# macro. If SUB=no, subprojects will not be built or cleaned. The following macro +# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf +# and .clean-reqprojects-conf unless SUB has the value 'no' +SUB_no=NO +SUBPROJECTS=${SUB_${SUB}} +BUILD_SUBPROJECTS_=.build-subprojects +BUILD_SUBPROJECTS_NO= +BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} +CLEAN_SUBPROJECTS_=.clean-subprojects +CLEAN_SUBPROJECTS_NO= +CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} + + +# Project Name +PROJECTNAME=enc28j60-avr-tcpserver.X + +# Active Configuration +DEFAULTCONF=default +CONF=${DEFAULTCONF} + +# All Configurations +ALLCONFS=default + + +# build +.build-impl: .build-pre + ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf + + +# clean +.clean-impl: .clean-pre + ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf + +# clobber +.clobber-impl: .clobber-pre .depcheck-impl + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default clean + + + +# all +.all-impl: .all-pre .depcheck-impl + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default build + + + +# dependency checking support +.depcheck-impl: +# @echo "# This code depends on make tool being used" >.dep.inc +# @if [ -n "${MAKE_VERSION}" ]; then \ +# echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ +# echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ +# echo "include \$${DEPFILES}" >>.dep.inc; \ +# echo "endif" >>.dep.inc; \ +# else \ +# echo ".KEEP_STATE:" >>.dep.inc; \ +# echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ +# fi diff --git a/enc28j60-avr-tcpserver.X/nbproject/Makefile-local-default.mk b/enc28j60-avr-tcpserver.X/nbproject/Makefile-local-default.mk new file mode 100644 index 0000000..ac91a41 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/nbproject/Makefile-local-default.mk @@ -0,0 +1,36 @@ +# +# Generated Makefile - do not edit! +# +# +# This file contains information about the location of compilers and other tools. +# If you commmit this file into your revision control server, you will be able to +# to checkout the project and build it from the command line with make. However, +# if more than one person works on the same project, then this file might show +# conflicts since different users are bound to have compilers in different places. +# In that case you might choose to not commit this file and let MPLAB X recreate this file +# for each user. The disadvantage of not commiting this file is that you must run MPLAB X at +# least once so the file gets created and the project can be built. Finally, you can also +# avoid using this file at all if you are only building from the command line with make. +# You can invoke make with the values of the macros: +# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... +# +PATH_TO_IDE_BIN=/opt/microchip/mplabx/v6.10/mplab_platform/platform/../mplab_ide/modules/../../bin/ +# Adding MPLAB X bin directory to path. +PATH:=/opt/microchip/mplabx/v6.10/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) +# Path to java used to run MPLAB X when this makefile was created +MP_JAVA_PATH="/opt/microchip/mplabx/v6.10/sys/java/zulu8.64.0.19-ca-fx-jre8.0.345-linux_x64/bin/" +OS_CURRENT="$(shell uname -s)" +MP_CC="/opt/microchip/xc8/v2.41/bin/xc8-cc" +# MP_CPPC is not defined +# MP_BC is not defined +MP_AS="/opt/microchip/xc8/v2.41/bin/xc8-cc" +MP_LD="/opt/microchip/xc8/v2.41/bin/xc8-cc" +MP_AR="/opt/microchip/xc8/v2.41/bin/xc8-ar" +DEP_GEN=${MP_JAVA_PATH}java -jar "/opt/microchip/mplabx/v6.10/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" +MP_CC_DIR="/opt/microchip/xc8/v2.41/bin" +# MP_CPPC_DIR is not defined +# MP_BC_DIR is not defined +MP_AS_DIR="/opt/microchip/xc8/v2.41/bin" +MP_LD_DIR="/opt/microchip/xc8/v2.41/bin" +MP_AR_DIR="/opt/microchip/xc8/v2.41/bin" +DFP_DIR=/opt/microchip/mplabx/v6.10/packs/Microchip/AVR-Dx_DFP/2.3.272 diff --git a/enc28j60-avr-tcpserver.X/nbproject/Makefile-variables.mk b/enc28j60-avr-tcpserver.X/nbproject/Makefile-variables.mk new file mode 100644 index 0000000..e20ff43 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/nbproject/Makefile-variables.mk @@ -0,0 +1,10 @@ +# +# Generated - do not edit! +# +# NOCDDL +# +CND_BASEDIR=`pwd` +# default configuration +CND_ARTIFACT_DIR_default=dist/default/production +CND_ARTIFACT_NAME_default=enc28j60-avr-tcpserver.X.production.hex +CND_ARTIFACT_PATH_default=dist/default/production/enc28j60-avr-tcpserver.X.production.hex diff --git a/enc28j60-avr-tcpserver.X/nbproject/configurations.xml b/enc28j60-avr-tcpserver.X/nbproject/configurations.xml new file mode 100644 index 0000000..0117f15 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/nbproject/configurations.xml @@ -0,0 +1,285 @@ + + + + + + app_files/tcp_server_demo.h + + + + mcc_generated_files/ethernet/enc28j60.h + mcc_generated_files/ethernet/physical_layer_interface.h + + + mcc_generated_files/spi/spi0.h + mcc_generated_files/spi/spi_interface.h + + + + + mcc_generated_files/system/utils/assembler/gas.h + mcc_generated_files/system/utils/assembler/iar.h + + mcc_generated_files/system/utils/utils.h + mcc_generated_files/system/utils/assembler.h + mcc_generated_files/system/utils/atomic.h + mcc_generated_files/system/utils/interrupt_avr8.h + mcc_generated_files/system/utils/compiler.h + mcc_generated_files/system/utils/utils_assert.h + + mcc_generated_files/system/port.h + mcc_generated_files/system/system.h + mcc_generated_files/system/protected_io.h + mcc_generated_files/system/ccp.h + mcc_generated_files/system/config_bits.h + mcc_generated_files/system/clock.h + mcc_generated_files/system/interrupt.h + mcc_generated_files/system/pins.h + + + mcc_generated_files/tcpiplite/tcpv4.h + mcc_generated_files/tcpiplite/network.h + mcc_generated_files/tcpiplite/arpv4.h + mcc_generated_files/tcpiplite/ipv4.h + mcc_generated_files/tcpiplite/dhcp_client.h + mcc_generated_files/tcpiplite/log.h + mcc_generated_files/tcpiplite/rtcc.h + mcc_generated_files/tcpiplite/lfsr.h + mcc_generated_files/tcpiplite/tcpip_config.h + mcc_generated_files/tcpiplite/log_console.h + mcc_generated_files/tcpiplite/udpv4_port_handler_table.h + mcc_generated_files/tcpiplite/ip_database.h + mcc_generated_files/tcpiplite/log_syslog.h + mcc_generated_files/tcpiplite/tcpip_types.h + mcc_generated_files/tcpiplite/udpv4.h + + + mcc_generated_files/timer/tca0.h + mcc_generated_files/timer/delay.h + mcc_generated_files/timer/timer_interface.h + + + + + + + + + app_files/src/tcp_server_demo.c + + + + + + mcc_generated_files/ethernet/src/enc28j60.c + + + + + mcc_generated_files/spi/src/spi0.c + + + + + mcc_generated_files/system/src/clock.c + mcc_generated_files/system/src/pins.c + mcc_generated_files/system/src/protected_io.S + mcc_generated_files/system/src/interrupt.c + mcc_generated_files/system/src/system.c + mcc_generated_files/system/src/config_bits.c + + + + + mcc_generated_files/tcpiplite/src/lfsr.c + mcc_generated_files/tcpiplite/src/dhcp_client.c + mcc_generated_files/tcpiplite/src/tcpv4.c + mcc_generated_files/tcpiplite/src/arpv4.c + mcc_generated_files/tcpiplite/src/ipv4.c + mcc_generated_files/tcpiplite/src/rtcc.c + mcc_generated_files/tcpiplite/src/ip_database.c + mcc_generated_files/tcpiplite/src/log_syslog.c + mcc_generated_files/tcpiplite/src/network.c + mcc_generated_files/tcpiplite/src/udpv4.c + mcc_generated_files/tcpiplite/src/log.c + mcc_generated_files/tcpiplite/src/log_console.c + mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c + + + + + mcc_generated_files/timer/src/tca0.c + mcc_generated_files/timer/src/delay.c + + + + main.c + + + Makefile + enc28j60-avr-tcpserver.mc3 + + + + app_files + + Makefile + + + + localhost + AVR64DD32 + + + nEdbgTool + XC8 + 2.41 + 3 + + + + + + + + + + + + + + + false + false + + + + + + + false + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enc28j60-avr-tcpserver.X/nbproject/private/configurations.xml b/enc28j60-avr-tcpserver.X/nbproject/private/configurations.xml new file mode 100644 index 0000000..ef4ea37 --- /dev/null +++ b/enc28j60-avr-tcpserver.X/nbproject/private/configurations.xml @@ -0,0 +1,25 @@ + + + Makefile + 0 + + + + + + place holder 1 + place holder 2 + + + + + true + 0 + 0 + 0 + + + + + + diff --git a/enc28j60-avr-tcpserver.X/nbproject/project.xml b/enc28j60-avr-tcpserver.X/nbproject/project.xml new file mode 100644 index 0000000..2204b0e --- /dev/null +++ b/enc28j60-avr-tcpserver.X/nbproject/project.xml @@ -0,0 +1,25 @@ + + + com.microchip.mplab.nbide.embedded.makeproject + + + enc28j60-avr-tcpserver + e22dae0b-4691-49a2-8e12-41154576d691 + 0 + ISO-8859-1 + + + app_files + + + + default + 2 + + + + false + + + + diff --git a/enc28j60-avr-udp.X/ENC28J60-avr-udp.mc3 b/enc28j60-avr-udp.X/ENC28J60-avr-udp.mc3 new file mode 100644 index 0000000..c2dc4bd --- /dev/null +++ b/enc28j60-avr-udp.X/ENC28J60-avr-udp.mc3 @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Application Builder + class com.microchip.mcc.melody.module.FrameworkModule + + + CLKCTRL + class com.microchip.mcc.melody.hw.module.HardwareModule + + + CPUINT + class com.microchip.mcc.melody.hw.module.HardwareModule + + + Configuration Bits + class com.microchip.mcc.melody.hw.module.HardwareModule + + + MAIN MANAGER + class com.microchip.mcc.melody.hw.module.HardwareModule + + + Pin Manager + class com.microchip.mcc.melody.hw.module.HardwareModule + + + SPI0 + class com.microchip.mcc.melody.hw.module.HardwareModule + + + TCA0 + class com.microchip.mcc.melody.hw.module.HardwareModule + + + meta + class com.microchip.mcc.melody.hw.module.HardwareModule + + + module0 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module1 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module10 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module12 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module2 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module3 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module4 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module46 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module5 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module6 + class com.microchip.mcc.melody.script.module.ScriptModule + + + module7 + class com.microchip.mcc.melody.script.module.ScriptModule + + + + + + + + + {} + + + + {"userAddedModules":["module5","module4","module7","module6","module18","module1","module0","module3","module2","module10","module46","module12"],"version":"CURRENT","modules":{"module5":{"scriptId":"@mchp-mcc/scf-avr8-clkctrl-v3","imports":{"pin_standard":{"interfaceId":{"name":"pin-standard","version":"^0"},"handle":{"providerId":"module3","exportId":"pin-standard"}},"scf_avr8_clkctrl_v3":{"interfaceId":{"name":"scf-avr8-clkctrl-v3","version":"^1.0.0"},"handle":{"providerId":"mccDevice","exportId":"CLKCTRL"}},"interrupt_standard":{"interfaceId":{"name":"interrupt-standard","version":"^1"},"handle":{"providerId":"module4","exportId":"interrupt"}},"device_meta":{"interfaceId":{"name":"device-meta","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"config_device":{"interfaceId":{"name":"config-device","version":"^1"},"handle":{"providerId":"module1","exportId":"config_device"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0"},"handle":{"providerId":"module1","exportId":"initializer_system"}},"config_request":{"interfaceId":{"name":"config-request","version":"^2"},"handle":{"providerId":"module1","exportId":"config_request"}}},"framewSpecificState":{"userEditedImports":[]}},"module10":{"scriptId":"@mchp-mcc/scf-avr8-tca-v1","imports":{"osc_clock":{"interfaceId":{"name":"osc-clocks","version":"^0"},"handle":{"providerId":"module5","exportId":"osc_clocks"}},"pin_standard":{"interfaceId":{"name":"pin-standard","version":"^0"},"handle":{"providerId":"module3","exportId":"pin-standard"}},"scf_avr8_tca_v1":{"interfaceId":{"name":"scf-avr8-tca-v1","version":"^1"},"handle":{"providerId":"mccDevice","exportId":"TCA0"}},"interrupt_standard":{"interfaceId":{"name":"interrupt-standard","version":"^1"},"handle":{"providerId":"module4","exportId":"interrupt"}},"device_meta":{"interfaceId":{"name":"device-meta","version":"^1"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0"},"handle":{"providerId":"module1","exportId":"initializer_system"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"main":{"interrupt":{"ovfi":true},"hardware":{"clkselTcaSingleCtrla":"System Clock / 64","requestedTimeNorm":1.0}}}},"module4":{"scriptId":"@mchp-mcc/scf-avr8-interrupt-v1","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"scf_avr8_interrupt_v1":{"interfaceId":{"name":"scf-avr8-interrupt-v1","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"CPUINT"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0"},"handle":{"providerId":"module1","exportId":"initializer_system"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"main":{"interrupt":{"iSreg":true}}}},"module7":{"scriptId":"@mchp-mcc/scf-avr8-spi-v1","imports":{"pin_standard":{"interfaceId":{"name":"pin-standard","version":"^0"},"handle":{"providerId":"module3","exportId":"pin-standard"}},"scf_avr8_spi_v1":{"interfaceId":{"name":"scf-avr8-spi-v1","version":"^1"},"handle":{"providerId":"mccDevice","exportId":"SPI0"}},"interrupt_standard":{"interfaceId":{"name":"interrupt-standard","version":"^1"},"handle":{"providerId":"module4","exportId":"interrupt"}},"device_meta":{"interfaceId":{"name":"device-meta","version":"^1"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"osc_clocks":{"interfaceId":{"name":"osc-clocks","version":"^0"},"handle":{"providerId":"module5","exportId":"osc_clocks"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0"},"handle":{"providerId":"module1","exportId":"initializer_system"}}},"framewSpecificState":{"userEditedImports":[]}},"module6":{"scriptId":"@mchp-mcc/delay-blocking-driver","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"^1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"osc_clocks":{"interfaceId":{"name":"osc-clocks","version":"^0"},"handle":{"providerId":"module5","exportId":"osc_clocks"}},"config_info":{"interfaceId":{"name":"config-info","version":"^0"},"handle":{"providerId":"module1","exportId":"config_info"}}},"framewSpecificState":{"userEditedImports":[]}},"module46":{"scriptId":"@mchp-mcc/tcpip-lite","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"^1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"interrupt_standard":{"interfaceId":{"name":"interrupt-standard","version":"^1.0.0"},"handle":{"providerId":"module4","exportId":"interrupt"}},"initializer_main":{"interfaceId":{"name":"initializer-main","version":"^0|1"},"handle":{"providerId":"module0","exportId":"initializer_main"}},"timer_timeout":{"interfaceId":{"name":"timer-timeout","version":"^0.1.2"},"handle":{"providerId":"module10","exportId":"timer_timeout","label":"TCA0"}},"ethernet_driver":{"interfaceId":{"name":"ethernet-drivers-8bit-interface","version":"^1.0.0"},"handle":{"providerId":"module12","exportId":"ethernet_driver"}}},"framewSpecificState":{"userEditedImports":[]}},"module12":{"scriptId":"@mchp-mcc/ethernet-drivers-8bit","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"^1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"pin_standard":{"interfaceId":{"name":"pin-standard","version":"^0.1.0"},"handle":{"providerId":"module3","exportId":"pin-standard"}},"delay_blocking":{"interfaceId":{"name":"delay-blocking","version":"^0|1"},"handle":{"providerId":"module6","exportId":"delay_blocking"}},"spi_master_basic":{"interfaceId":{"name":"spi-master-basic","version":"^0.5.0"},"handle":{"providerId":"module7","exportId":"spi_master_basic"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"main":{"software":{"ethChipSelectPin":{"PA7":{"cname":"ETH_CS","ioc":"INTDIS_BUFFEN"}}}}}},"module1":{"scriptId":"@mchp-mcc/avr8-configuration-bits-v1","imports":{"device_meta":{"interfaceId":{"name":"device-meta","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"initializer_main":{"interfaceId":{"name":"initializer-main","version":"^0.3.0"},"handle":{"providerId":"module0","exportId":"initializer_main"}},"avr8_configuration_bits_v1":{"interfaceId":{"name":"avr8-configuration-bits-v1","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"Configuration Bits"}}},"framewSpecificState":{"userEditedImports":[]}},"module0":{"scriptId":"@mchp-mcc/main-manager","imports":{"main":{"interfaceId":{"name":"main-manager","version":"^1.*"},"handle":{"providerId":"mccDevice","exportId":"MAIN MANAGER"}}},"framewSpecificState":{"userEditedImports":[]}},"module3":{"scriptId":"@mchp-mcc/pin-content-processor","imports":{"device-meta":{"interfaceId":{"name":"device-meta","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"meta"}},"pin-architecture":{"interfaceId":{"name":"pin-architecture","version":"1.0.0"},"handle":{"providerId":"module2","exportId":"pin-architecture"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"saved":{"rows":{"module12":{"GPIO$ETH_CS$output":{"pins":{"PA0":{"state":"MUL"},"PA1":{"state":"MUL"},"PA2":{"state":"MUL"},"PA3":{"state":"MUL"},"PA4":{"state":"MUL"},"PA5":{"state":"MUL"},"PA6":{"state":"MUL"},"PA7":{"state":"L"},"PC0":{"state":"MUL"},"PC1":{"state":"MUL"},"PC2":{"state":"MUL"},"PC3":{"state":"MUL"},"PD1":{"state":"MUL"},"PD2":{"state":"MUL"},"PD3":{"state":"MUL"},"PD4":{"state":"MUL"},"PD5":{"state":"MUL"},"PD6":{"state":"MUL"},"PD7":{"state":"MUL"},"PF0":{"state":"MUL"},"PF1":{"state":"MUL"},"PF2":{"state":"MUL"},"PF3":{"state":"MUL"},"PF4":{"state":"MUL"},"PF5":{"state":"MUL"},"PF6":{"state":"MUL"},"PF7":{"state":"MUL"}}}},"pcp":{"GPIO$GPIO$input":{"pins":{"PF5":{"state":"MUL"},"PF6":{"state":"L"}}},"GPIO$GPIO$output":{"pins":{"PF5":{"state":"L"},"PF6":{"state":"MUL"}}}}},"userEditedData":{"cname":{"eview":{"PF6":"SW0","PF5":"LED0"}},"inv":{"eview":{"PF5":true}},"high":{"eview":{"PF5":true}}}}}},"module2":{"scriptId":"@mchp-mcc/avr8-pin-manager","imports":{"avr8-pin-manager":{"interfaceId":{"name":"avr8-pin-manager","version":"1.0.0"},"handle":{"providerId":"mccDevice","exportId":"Pin Manager"}},"initializer_system":{"interfaceId":{"name":"initializer-system","version":"^0.*"},"handle":{"providerId":"module1","exportId":"initializer_system"}}},"framewSpecificState":{"userEditedImports":[]},"payload":{"adapterdata":{"cname":{"eview":{"dataMap":{"PF6":{"value":"SW0"},"PF5":{"value":"LED0"}}}},"inv":{"eview":{"dataMap":{"PF5":{"value":true}}}},"high":{"eview":{"dataMap":{"PF5":{"value":true}}}}}}}},"content":{"@mchp-mcc/avr-8bit":"4.7.0","@mchp-mcc/ethernet-drivers-8bit":"6.0.0","@mchp-mcc/tcpip-lite":"5.0.0","@mchp-mcc/pin-content-processor":"3.6.0","@mchp-mcc/delay-blocking-driver":"3.1.0","@mchp-mcc/scf-avr8-tca-v1":"6.0.9","@mchp-mcc/avr8-pin-manager":"4.5.1","@mchp-mcc/scf-avr8-spi-v1":"4.1.12","@mchp-mcc/scf-avr8-interrupt-v1":"5.0.12","@mchp-mcc/scf-avr8-clkctrl-v3":"2.0.8","@mchp-mcc/main-manager":"3.1.1","@mchp-mcc/avr8-configuration-bits-v1":"4.2.12"}} + + + + + mcc_generated_files\tcpiplite\ipv4.h + b188c4e5a6df0b88cd186cfca1cc9a218ec4570b5529fa1408c98d8536c44582 + + + mcc_generated_files\tcpiplite\src\log.c + 96afab78b0d74a8b87853f7b77d9cd2cef84c7a5019bee734f5aae12772bd6f0 + + + mcc_generated_files\tcpiplite\arpv4.h + fa77137ca7ed34e390e5a6cefc4826b943590f9ab8959db034dab68c9e3488f6 + + + mcc_generated_files\system\interrupt.h + 75695d9cc1e45b240332ce98cce195022df36e1a15d4891d26cff6e390f2b765 + + + mcc_generated_files\system\port.h + 263a68fee4685f2eca9986a962d5dd14141bebcd043238117c0ca24e2a54a95f + + + mcc_generated_files\tcpiplite\src\log_console.c + 393e0f69dcd52d8036878f16daadc1227c552d11f513c4af0c3ce054ff14ff30 + + + mcc_generated_files\system\utils\interrupt_avr8.h + bf66a9d1b57d17151c1aa3b9e207a694bbf854df962b69135c6d922d026ce7cf + + + mcc_generated_files\system\pins.h + 3025369cb8d94a5f203b0434dc8af07c553ebec6c4f499742e47a01390f03ea2 + + + mcc_generated_files\tcpiplite\rtcc.h + 96d00ec507619feb1532a7ae5996a8b276fb2548bb303a128c4bba69584bb7c7 + + + mcc_generated_files\timer\delay.h + 303ca2f795e184d0ffd854bb6cf49b573a35abc6f3b9aa7aa6f0853030cd870f + + + mcc_generated_files\system\src\clock.c + f712f03827d2efc2db11606d25e481a193f4f16f46605dffc0ef6eea255ffe31 + + + mcc_generated_files\tcpiplite\src\rtcc.c + 1560fee9d73302780e3bc2036463c66bd99e63d2d858f27387aa87600a9b9b31 + + + mcc_generated_files\system\clock.h + b25dc6cca3f5aac576eb1aea49186ae14ec9ffcaf93743d3c419cb54468d7e29 + + + mcc_generated_files\tcpiplite\src\lfsr.c + 02cb5b4e1a1d25983a158043ee959b56d3eff7d019c630441552ec0580c419e9 + + + mcc_generated_files\tcpiplite\src\dhcp_client.c + 13b73f4241221ce7dfa7da94efdaddd9a6610810f8f2b42d9f247ed58889766a + + + mcc_generated_files\spi\src\spi0.c + e59786c52053f3c99c09b42f4268500f88f591539fc53f5d424769f2eda9d9cb + + + mcc_generated_files\tcpiplite\lfsr.h + c88f319589ea6436628484deaf783d8545163d8722978f4a69ee2ed736c133d0 + + + mcc_generated_files\tcpiplite\src\log_syslog.c + dcc430d972935543dfe2db5f164ae35385f424d7fac1617983d42cc137c86d31 + + + mcc_generated_files\system\system.h + d1ddba55a9d5c82c00699fd9d53c3c804b9dd7fa10e298d3a7b755909cdc7baa + + + mcc_generated_files\ethernet\physical_layer_interface.h + 820d28b247eca06e574bdee8161c9f99b6106f08bea7b04688f28a66a741eadc + + + mcc_generated_files\system\utils\assembler\gas.h + 05129f00ef45a989573a0427f37de7661fa3005f22778ad24c0dca228468a018 + + + mcc_generated_files\tcpiplite\network.h + 2fd62276a42b90881ca66280994cbb49bba44ede6814fc021e876462461176e4 + + + mcc_generated_files\tcpiplite\dhcp_client.h + 973946873aca05dfe028b5be0d0241f53467aa599c1d6519ccbfdcc0a947e4fc + + + mcc_generated_files\timer\src\tca0.c + 3f0dbb8101d11a7241b490b12fcdb1ffacb286f22267ef8e05d27e0c7e36fd2b + + + mcc_generated_files\tcpiplite\tcpip_types.h + 0864c0fa1d85547d7a7283078c4825294076ae23cb08686c3cbd9255b96146ae + + + mcc_generated_files\system\src\config_bits.c + 73ad17f1190da35640dea29ef78dd1ea7e4fed708c2a39eba32cc9024dec889e + + + mcc_generated_files\system\src\protected_io.S + 3bb77a623e934d19f38ed22bfd302ac90e929cb841406c027d11193bd5358b36 + + + mcc_generated_files\ethernet\enc28j60.h + 5329ea5e6fef75c9015adb5cc1a6b27fba7a00f5cfa860197c4d38e760484e8e + + + mcc_generated_files\tcpiplite\log_syslog.h + ce12b5f087cdc601844c08419f74ae5e0ebf37498abe9faf77483941f4ef2749 + + + mcc_generated_files\tcpiplite\src\udpv4_port_handler_table.c + df59969d33e31ac5cd1b1476c69015c97cf12d6102f64f4973efde4c302ddcd3 + + + mcc_generated_files\system\src\system.c + aceff89e6f354a1a6ad81a72cd709255cf7d726acb2cd003ee4c48670e63d7a0 + + + mcc_generated_files\system\utils\compiler.h + 78fc7aaa9215a68e38da793ec09d384598330944557b49c79aef4af747e76e08 + + + mcc_generated_files\timer\timer_interface.h + c663a68f1004f660bf34cd96cf61a9012847f97b9cff5098686010e234deb62a + + + mcc_generated_files\system\utils\utils_assert.h + e6a57e1164f862da6a703fa67c200945b7a21fb6ab9e9b57ff14507467e04cc6 + + + mcc_generated_files\system\utils\assembler\iar.h + baafb63c988a088a34457e1d6433e87a0b658d1486fce12eec427b9457991549 + + + mcc_generated_files\tcpiplite\udpv4.h + bda9bc53ffa8e3747d8438ce9b7365aba133e26a6750e6de7cddbda49b6daa42 + + + mcc_generated_files\system\src\pins.c + 9d9594dcc31366281aca74d0485f5b27e042dfd5985fbb4e216a7b349cf0d5fa + + + mcc_generated_files\timer\tca0.h + 5aac000bbb51c8915bdd2fefdd2604375562c69acef5023955296a387357647e + + + mcc_generated_files\spi\spi_interface.h + cd755e06457e2bb365bd4f949fdf7e49f12f9a89a3316457f3ff05083b538ffe + + + mcc_generated_files\system\utils\atomic.h + 2a0975cf197fcfdec0a503a3e3b899336a83d123a3066d0e8c2b3fc5dbc3d6ac + + + mcc_generated_files\tcpiplite\src\ip_database.c + 6ad2b505dd44e030363ee7ee3464546fa29c3401366367f5e4d08232a23c4987 + + + mcc_generated_files\tcpiplite\log_console.h + 8ce7fa1f69dc36a6169cdac93cf109796e88198b8174a8bf5b380a32f6a25424 + + + mcc_generated_files\system\ccp.h + 771ef1ef56b145740365ded07000a4e9820fc4e2c7025b40ab80bf13288ee5e3 + + + mcc_generated_files\ethernet\src\enc28j60.c + 68a1043acf0ba5fded10401fd33a0d5708d1847b7423093533e417ff53d1c6c1 + + + main.c + 266575cfbd620190ac1e41d48753323c806eb90f55a657805edc677165d4af22 + + + mcc_generated_files\tcpiplite\src\udpv4.c + 9b5d18f9cbf2b37620a1681a647c0f8c70834c2065a000aa2a91f835f702f421 + + + mcc_generated_files\tcpiplite\src\ipv4.c + 1d6d00a9c2294f0dba83bae729be8dd7a8cd451915f09c18efe0248b3a46b6c0 + + + mcc_generated_files\tcpiplite\src\network.c + b8ae4f606171b189ca38c9013a021527f5f8d0c76cc5e2a19d51eb4a7c786863 + + + mcc_generated_files\timer\src\delay.c + 982e6c0e726105e62588380d30d9e99cafcf2dd975eb0765561b68c4e6762a47 + + + mcc_generated_files\system\src\interrupt.c + 50dedff282518aad79d64bef461deb27ced81abc4b4033fd891ff29cc9bb5d54 + + + mcc_generated_files\tcpiplite\ip_database.h + 34e10322035cefd6b86319f28ecd6ad66e6709bf62dd8b12815e25e70b51ed7c + + + mcc_generated_files\tcpiplite\tcpip_config.h + 63612e28526229feaede1bd718e95d72f31aea8c59af98f5897d2618be4694f6 + + + mcc_generated_files\tcpiplite\udpv4_port_handler_table.h + 75bc247341d5c91f6312d03bad0ccd56ba138fa5968b85bdeac5bdcb3edc7000 + + + mcc_generated_files\system\utils\utils.h + d02918b46fc138c440e381cb9a557c9f69c1cc3eb141f007b0a3738f02f4d543 + + + mcc_generated_files\system\config_bits.h + fa24220622dc1f4ebda67e226cb7480d29e7dcb70ba069c8a618c7d1cc67a0ef + + + mcc_generated_files\system\utils\assembler.h + a51d2178d0c940ae2d1b51eff122d0d63e53efe29edb2fb8c7fbd78b1c2fcabe + + + mcc_generated_files\spi\spi0.h + 300c4b7c8fef8f7550445173c30260c521c8c1a6245bc5bf3cd4fbfcc7f3d702 + + + mcc_generated_files\tcpiplite\log.h + 7243fada51a57f83f9f850fb0b4ac06ffa77e3728f93f2ebfa1fc20f00d0fa13 + + + mcc_generated_files\system\protected_io.h + 2197a3749e9525a893011ccc9095321665641b68aeda5ebbea9d2711ab3f9aa7 + + + mcc_generated_files\tcpiplite\src\arpv4.c + 5ec5b193796645fb43fd3a681cb1238c43ca4d9863ff1054b488c45848384bbe + + + \ No newline at end of file diff --git a/enc28j60-avr-udp.X/Makefile b/enc28j60-avr-udp.X/Makefile new file mode 100644 index 0000000..fca8e2c --- /dev/null +++ b/enc28j60-avr-udp.X/Makefile @@ -0,0 +1,113 @@ +# +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: +# +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target +# +# Targets beginning with '.' are not intended to be called on their own. +# +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. +# +# Available make variables: +# +# CND_BASEDIR base directory for relative paths +# CND_DISTDIR default top distribution directory (build artifacts) +# CND_BUILDDIR default top build directory (object files, ...) +# CONF name of current configuration +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) +# CND_PACKAGE_NAME_${CONF} name of package (current configuration) +# CND_PACKAGE_PATH_${CONF} path to package (current configuration) +# +# NOCDDL + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib + + +# build +build: .build-post + +.build-pre: +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... + + +# clean +clean: .clean-post + +.clean-pre: +# Add your pre 'clean' code here... +# WARNING: the IDE does not call this target since it takes a long time to +# simply run make. Instead, the IDE removes the configuration directories +# under build and dist directly without calling make. +# This target is left here so people can do a clean when running a clean +# outside the IDE. + +.clean-post: .clean-impl +# Add your post 'clean' code here... + + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk + +# include project make variables +include nbproject/Makefile-variables.mk diff --git a/enc28j60-avr-udp.X/app_files/src/udp_demo.c b/enc28j60-avr-udp.X/app_files/src/udp_demo.c new file mode 100644 index 0000000..66e274d --- /dev/null +++ b/enc28j60-avr-udp.X/app_files/src/udp_demo.c @@ -0,0 +1,139 @@ +/** + * UDP Demo Application Source File + * + * @file udp_demo.c + * + * @ingroup udpdemo + * + * @brief UDP demonstartion implementation. + * + * @version UDP Demo Application Version 5.0.0 + * + */ + +/* +© [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS "AS IS". + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +// Included files +#include +#include "../../mcc_generated_files/tcpiplite/udpv4.h" +#include "../../mcc_generated_files/tcpiplite/tcpip_config.h" +#include "../../mcc_generated_files/system/pins.h" +#include "../udp_demo.h" + +// Variables +/** + * @ingroup udpdemo + * @brief UDP packet details defined by struct udpStart_t + */ +static udpStart_t udpPacket; + +/** + * @ingroup udpdemo + * @brief Character array containing the text that will get sent as a UDP packet when the button is pressed. + * Add your own text if needed. + * Keep in mind your device limitations when adding long strings. + */ +char text[] = "Hello World"; + +// Functions +void UDP_Demo_Initialize(void) +{ + // TODO: Initialize the Destination IP address with your PC's IP address and Destination Port + udpPacket.destinationAddress = MAKE_IPV4_ADDRESS(10,14,5,127); + udpPacket.destinationPortNumber = 65531; + + // Port number of the device where this program will run + udpPacket.sourcePortNumber = 65533; +} + +void UDP_Demo_Recv(void) +{ + udpDemoRecv_t udpRecv; + + // Reads the UDP data + UDP_ReadBlock(&udpRecv, sizeof(udpDemoRecv_t)); + + /** + * Logic to toggle LEDs based on commands sent from the Demo GUI. + * If you want to use more LEDs, name them LED1, LED2 and so on. + * Then uncomment the lines inside the respective switch cases + */ + if(udpRecv.command == 'C') + { + switch(udpRecv.action) + { + case '1': + LED0_Toggle(); + break; + default: + break; + } + } +} + +void UDP_Demo_Send (void) +{ + error_msg ret = ERROR; + + // Starts the UDP Packet. Check udpv4.c for implementation. + ret = UDP_Start(udpPacket.destinationAddress, udpPacket.sourcePortNumber, udpPacket.destinationPortNumber); + + if(ret == SUCCESS) + { + // Write the character array defined above to the packet that will be sent on UDP + UDP_WriteString(text); + // Send UDP Packet + UDP_Send(); + } + +} + +bool Button_Press(void) +{ + static int8_t debounce = 10; + static unsigned int buttonState = 0; + static char buttonPressEnabled = 1; + + if(SW0_GetValue() == 0) + { + if(buttonState < debounce) + { + buttonState++; + } + else if(buttonPressEnabled) + { + buttonPressEnabled = 0; + return true; + } + } + else if(buttonState > 0 ) + { + buttonState--; + } + else + { + buttonPressEnabled = 1; + } + return false; +} + + diff --git a/enc28j60-avr-udp.X/app_files/udp_demo.h b/enc28j60-avr-udp.X/app_files/udp_demo.h new file mode 100644 index 0000000..6a74bbb --- /dev/null +++ b/enc28j60-avr-udp.X/app_files/udp_demo.h @@ -0,0 +1,101 @@ +/** + * UDP Demo Application Header File + * + * @file udp_demo.h + * + * @ingroup udpdemo UDPDEMO + * + * @brief User Datagram Protocol(UDP) demonstration implementation. + * + * @version UDP Demo Application Version 5.0.0 + * + */ + +/* +© [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS "AS IS". + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef _UDP_DEMO_H +#define _UDP_DEMO_H + +// Included files +#include "../mcc_generated_files/system/system.h" + +// Structures +/** + * @ingroup udpdemo + * @struct udpDemoRecv_t + * @brief Defines how the received packet will be interpreted + */ +typedef struct +{ + char command; /** + + + + app_files/udp_demo.h + + + + mcc_generated_files/ethernet/enc28j60.h + mcc_generated_files/ethernet/physical_layer_interface.h + + + mcc_generated_files/nvm/nvm.h + + + mcc_generated_files/spi/spi0.h + mcc_generated_files/spi/spi_interface.h + + + + + mcc_generated_files/system/utils/assembler/gas.h + mcc_generated_files/system/utils/assembler/iar.h + + mcc_generated_files/system/utils/interrupt_avr8.h + mcc_generated_files/system/utils/utils_assert.h + mcc_generated_files/system/utils/assembler.h + mcc_generated_files/system/utils/atomic.h + mcc_generated_files/system/utils/compiler.h + mcc_generated_files/system/utils/utils.h + + mcc_generated_files/system/clock.h + mcc_generated_files/system/interrupt.h + mcc_generated_files/system/protected_io.h + mcc_generated_files/system/port.h + mcc_generated_files/system/system.h + mcc_generated_files/system/config_bits.h + mcc_generated_files/system/ccp.h + mcc_generated_files/system/pins.h + + + mcc_generated_files/tcpiplite/tcpip_config.h + mcc_generated_files/tcpiplite/log_syslog.h + mcc_generated_files/tcpiplite/udpv4_port_handler_table.h + mcc_generated_files/tcpiplite/ip_database.h + mcc_generated_files/tcpiplite/network.h + mcc_generated_files/tcpiplite/udpv4.h + mcc_generated_files/tcpiplite/log_console.h + mcc_generated_files/tcpiplite/arpv4.h + mcc_generated_files/tcpiplite/rtcc.h + mcc_generated_files/tcpiplite/log.h + mcc_generated_files/tcpiplite/dhcp_client.h + mcc_generated_files/tcpiplite/lfsr.h + mcc_generated_files/tcpiplite/tcpip_types.h + mcc_generated_files/tcpiplite/ipv4.h + + + mcc_generated_files/timer/timer_interface.h + mcc_generated_files/timer/delay.h + mcc_generated_files/timer/tca0.h + + + + + + + + + app_files/src/udp_demo.c + + + + + mcc_generated_files/docs/delay.dox + + + + mcc_generated_files/ethernet/src/enc28j60.c + + + + + mcc_generated_files/nvm/src/nvm.c + + + + + mcc_generated_files/spi/src/spi0.c + + + + + mcc_generated_files/system/src/pins.c + mcc_generated_files/system/src/protected_io.S + mcc_generated_files/system/src/clock.c + mcc_generated_files/system/src/system.c + mcc_generated_files/system/src/config_bits.c + mcc_generated_files/system/src/interrupt.c + + + + + mcc_generated_files/tcpiplite/src/log_syslog.c + mcc_generated_files/tcpiplite/src/udpv4.c + mcc_generated_files/tcpiplite/src/network.c + mcc_generated_files/tcpiplite/src/ipv4.c + mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c + mcc_generated_files/tcpiplite/src/ip_database.c + mcc_generated_files/tcpiplite/src/log.c + mcc_generated_files/tcpiplite/src/lfsr.c + mcc_generated_files/tcpiplite/src/dhcp_client.c + mcc_generated_files/tcpiplite/src/rtcc.c + mcc_generated_files/tcpiplite/src/arpv4.c + mcc_generated_files/tcpiplite/src/log_console.c + + + + + mcc_generated_files/timer/src/tca0.c + mcc_generated_files/timer/src/delay.c + + + + main.c + + + Makefile + ENC28J60-avr-udp.mc3 + + + + app_files + + Makefile + + + + localhost + AVR64DD32 + + + nEdbgTool + XC8 + 2.41 + 3 + + + + + + + + + + + + + + + false + false + + + + + + + false + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/enc28j60-avr-udp.X/enc28j60-avr-udp/enc28j60-avr-udp.X/nbproject/project.xml b/enc28j60-avr-udp.X/enc28j60-avr-udp/enc28j60-avr-udp.X/nbproject/project.xml new file mode 100644 index 0000000..aefae22 --- /dev/null +++ b/enc28j60-avr-udp.X/enc28j60-avr-udp/enc28j60-avr-udp.X/nbproject/project.xml @@ -0,0 +1,25 @@ + + + com.microchip.mplab.nbide.embedded.makeproject + + + enc28j60-avr-udp + 082b3c69-7e4d-452b-a420-372670d66c2a + 0 + ISO-8859-1 + + + app_files + + + + default + 2 + + + + false + + + + diff --git a/enc28j60-avr-udp.X/main.c b/enc28j60-avr-udp.X/main.c new file mode 100644 index 0000000..f59888c --- /dev/null +++ b/enc28j60-avr-udp.X/main.c @@ -0,0 +1,61 @@ + /* + * MAIN Generated Driver File + * + * @file main.c + * + * @defgroup main MAIN + * + * @brief This is the generated driver implementation file for the MAIN driver. + * + * @version MAIN Driver Version 1.0.0 +*/ + +/* +© [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS "AS IS". + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "mcc_generated_files/system/system.h" +#include "mcc_generated_files/tcpiplite/network.h" +#include "app_files/udp_demo.h" + +/* + Main application +*/ + +int main(void) +{ + SYSTEM_Initialize(); + // Add this to while(1): Network_Manage(); + + UDP_Demo_Initialize(); + + Network_Init(); + + TCA0_Start(); + + while(1) + { + Network_Manage(); + if(Button_Press()) + { + UDP_Demo_Send(); + } + } +} \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/docs/delay.dox b/enc28j60-avr-udp.X/mcc_generated_files/docs/delay.dox new file mode 100644 index 0000000..3ee8dc0 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/docs/delay.dox @@ -0,0 +1,16 @@ +/** +@addtogroup delay + +@section delay_basics Delay drivers for PIC and AVR + +The MPLAB XC8 and XC16 compilers have built-in delay functions or macros for when users need to tell the MCU to wait for a certain amount of time. +For these delay functions, time is measured in microseconds or milliseconds, and for PIC32 devices, in timer ticks as well. Format for invoking the macros +will vary from device to device but this delay driver can help abstract these format differences. + +@section delay_uses How to use the delay drivers + +To use the delay drivers, just include the delay.h file wherever you intend to use the delay function and call the DELAY_milliseconds(time) or DELAY_microseconds(time) function where +time is the number of milliseconds or microseconds to delay. + +*/ + diff --git a/enc28j60-avr-udp.X/mcc_generated_files/ethernet/enc28j60.h b/enc28j60-avr-udp.X/mcc_generated_files/ethernet/enc28j60.h new file mode 100644 index 0000000..cd809ff --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/ethernet/enc28j60.h @@ -0,0 +1,324 @@ +/** + * ENC28J60 Ethernet Driver Header File + * + * @file enc28j60.h + * + * @defgroup enc28j60 ENC28J60 + * + * @brief This header file provides the API for the ENC28J60 Ethernet Driver. + * + * @version ENC28J60 Ethernet Driver Version 6.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef ENC28J60_H +#define ENC28J60_H + +// Macros + +#define SFR_BANK0 0x00 +#define SFR_BANK1 0x40 +#define SFR_BANK2 0x80 +#define SFR_BANK3 0xC0 +#define SFR_COMMON 0xE0 +#define BANK_MASK 0xE0 +#define SFR_MASK 0x1F + +#define byteSwap16(a) ((((uint16_t)a & (uint16_t)0xFF00) >> 8) | (((uint16_t)a & (uint16_t)0x00FF) << 8)) +#define byteReverse32(a) ((((uint32_t)a & (uint32_t)0xff000000) >> 24) | \ + (((uint32_t)a & (uint32_t)0x00ff0000) >> 8) | \ + (((uint32_t)a & (uint32_t)0x0000ff00) << 8) | \ + (((uint32_t)a & (uint32_t)0x000000ff) << 24)) + +#define byteReverse24(a) (((((uint32_t)a & (uint32_t)0x00FF00) >> 8) | (((uint32_t)a & (uint32_t)0x0000FF) << 8)) << 8 | (uint32_t)a >> 0x10) + +// Host to Network & Network to Host Macros +#ifndef htons +#define htons(a) byteSwap16(a) +#endif +#ifndef ntohs +#define ntohs(a) byteSwap16(a) +#endif +#ifndef htonl +#define htonl(a) byteReverse32(a) +#endif +#ifndef ntohl +#define ntohl(a) byteReverse32(a) +#endif + +#define convert_hton24(a) byteReverse24(a) + +// Enums + +/** + * @ingroup enc28j60 + * @enum spi_inst_t + * @brief SPI instructions. + */ +typedef enum +{ + rcr_inst = 0x00, /** +#include + +// Macros +#ifndef __XC8 +#define NOP() __asm__ __volatile__("nop") +#endif +#define ETH_packetReady() ethData.pktReady +#define ETH_linkCheck() ethData.up +#define ETH_linkChanged() ethData.linkChange + +// Structs/Enums/Unions + +/** + * @ingroup ethdriver8bit + * @enum ethernetDriver_t + * @brief Ethernet Driver status. + */ +typedef struct +{ + unsigned error : 1; + unsigned pktReady : 1; + unsigned up : 1; + unsigned idle : 1; + unsigned linkChange : 1; + unsigned bufferBusy : 1; + unsigned : 3; + uint16_t saveRDPT; + uint16_t saveWRPT; +} ethernetDriver_t; + +extern volatile ethernetDriver_t ethData; + +/** + * @ingroup ethdriver8bit + * @enum txPacket_t + * @brief Transmission packet. + */ +typedef struct +{ + uint16_t flags; + uint16_t packetStart; + uint16_t packetEnd; + void *prevPacket; + void *nextPacket; +} txPacket_t; + +/** + * @ingroup ethdriver8bit + * @enum phy_error_msg + * @brief PHY status/errors. + */ +typedef enum +{ + PHY_ERROR = 0, + PHY_SUCCESS, + PHY_LINK_NOT_FOUND, + PHY_BUFFER_BUSY, + PHY_TX_LOGIC_NOT_IDLE, + PHY_TX_QUEUED, + PHY_DMA_TIMEOUT, +} phy_error_msg; + +/** + * @ingroup ethdriver8bit + * @union mac48Address_t + * @brief MAC Address (48-bits). + */ +typedef union +{ + uint8_t mac_array[6]; + struct + { + uint8_t byte1, byte2, byte3, byte4, byte5, byte6; + } s; +} mac48Address_t; + +/** + * @ingroup ethdriver8bit + * @union mac64Address_t + * @brief MAC Address (64-bits). + */ +typedef union +{ + uint8_t mac_array[8]; + struct + { + uint8_t byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8; + } s; +} mac64Address_t; + +extern mac48Address_t hostMacAddress; +extern const mac48Address_t broadcastMAC; + +// Ethernet Driver APIs + +/** + * @ingroup ethdriver8bit + * @brief Sets up the Ethernet and starts the execution. Initializes the TX/RX buffer, the MAC and the PHY. + * @param None. + * @return None. + */ +void ETH_Init(void); + +/** + * @ingroup ethdriver8bit + * @brief Manages the MAC events. Can be used for polling or for new events in Interrupt Service Routine (ISR). + * @param None. + * @return None. + */ +void ETH_EventHandler(void); + +/** + * @ingroup ethdriver8bit + * @brief Updates the pointers for the next available RX packets. + * Retrieves information about the last received packet and the address of the next ones. + * @param None. + * @return None. + */ +void ETH_NextPacketUpdate(void); + +/** + * @ingroup ethdriver8bit + * @brief Resets the receiver buffer. + * @param None. + * @return None. + */ +void ETH_ResetReceiver(void); + +/** + * @ingroup ethdriver8bit + * @brief Resets the system software. + * @param None. + * @return None. + */ +void ETH_SendSystemReset(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the MAC address of type mac48Address_t. + * @param None. + * @return MAC address. + */ +const mac48Address_t *MAC_getAddress(void); + +// Read functions for data + +/** + * @ingroup ethdriver8bit + * @brief Reads a block of data from the RX buffer MAC. + * @param *buffer + * @param length + * @return Read count. + */ +uint16_t ETH_ReadBlock(void *buffer, uint16_t length); + +/** + * @ingroup ethdriver8bit + * @brief Reads one byte of data from the RX buffer MAC. + * @param None. + * @return One byte of data. + */ +uint8_t ETH_Read8(void); + +/** + * @ingroup ethdriver8bit + * @brief Reads two bytes of data from the RX buffer and returns them in host order. + * @param None. + * @return Two bytes of data. + */ +uint16_t ETH_Read16(void); + +/** + * @ingroup ethdriver8bit + * @brief Reads three bytes of data from the RX buffer and returns them in host order. + * @param None. + * @return Three bytes of data. + */ +uint32_t ETH_Read24(void); + +/** + * @ingroup ethdriver8bit + * @brief Reads four bytes of data from the RX buffer and returns them in host order. + * @param None. + * @return Four bytes of data. + */ +uint32_t ETH_Read32(void); + +/** + * @ingroup ethdriver8bit + * @brief Drops the N bytes from a packet list when the data is lost. Clears a number of bytes (length) from the RX buffer. + * @param length + * @return None. + */ +void ETH_Dump(uint16_t length); + +/** + * @ingroup ethdriver8bit + * @brief Drops the rest of this packet and release the buffer. + * Clears all bytes from the RX buffer. + * @param None. + * @return None. + */ +void ETH_Flush(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the available space size in the Ethernet TX buffer. + * @param None. + * @return Available space left in the TX buffer. + */ +uint16_t ETH_GetFreeTxBufferSize(void); + +/** + * @ingroup ethdriver8bit + * @brief Starts a packet if the Ethernet transmitter is idle. + * @param *dest_mac + * @param type + * @retval PHY_SUCCESS Packet started + * @retval PHY_BUFFER_BUSY Buffer is busy + * @retval PHY_TX_LOGIC_NOT_IDLE Transmitter is busy + */ +phy_error_msg ETH_WriteStart(const mac48Address_t *dest_mac, uint16_t type); + +/** + * @ingroup ethdriver8bit + * @brief Writes a string of data into the MAC. + * @param *string + * @return None. + */ +uint16_t ETH_WriteString(const char *string); + +/** + * @ingroup ethdriver8bit + * @brief Writes a block of data into the TX buffer MAC. + * @param *data + * @param length + * @return Length. + */ +uint16_t ETH_WriteBlock(const char *data, uint16_t length); + +/** + * @ingroup ethdriver8bit + * @brief Writes one byte of data into the TX buffer MAC. + * @param data + * @return None. + */ +void ETH_Write8(uint8_t data); + +/** + * @ingroup ethdriver8bit + * @brief Writes two bytes into the TX buffer MAC in Network order. + * @param data + * @return None. + */ +void ETH_Write16(uint16_t data); + +/** + * @ingroup ethdriver8bit + * @brief Writes three bytes into the TX buffer MAC in Network order. + * @param data + * @return None. + */ +void ETH_Write24(uint32_t data); + +/** + * @ingroup ethdriver8bit + * @brief Writes four bytes into the TX buffer MAC in Network order. + * @param data + * @return None. + */ +void ETH_Write32(uint32_t data); + +/** + * @ingroup ethdriver8bit + * @brief Inserts N data bytes into a specific offset in the TX buffer/packet. + * @param *data + * @param len length + * @param offset + * @return None. + */ +void ETH_Insert(char *data, uint16_t len, uint16_t offset); + +/** + * @ingroup ethdriver8bit + * @brief Copies N bytes from the saved read location (RX buffer) into the current TX location (TX buffer) using the DMA set up. + * This is used for ICMP ECHO to eliminate the need to extract the arbitrary payload. + * @param len length + * @retval PHY_SUCCESS + * @retval PHY_DMA_TIMEOUT + */ +phy_error_msg ETH_Copy(uint16_t len); + +/** + * @ingroup ethdriver8bit + * @brief Sends the TX packet. + * Starts the transmission of packet or queues the packet that has been created. + * @param None. + * @retval PHY_SUCCESS + * @retval PHY_BUFFER_BUSY + * @retval PHY_LINK_NOT_FOUND + * @retval PHY_TX_QUEUED + * @retval PHY_TX_LOGIC_NOT_IDLE + */ +phy_error_msg ETH_Send(void); + +/** + * @ingroup ethdriver8bit + * @brief Calculates the hardware checksum of length bytes starting with the position. + * @param position + * @param length + * @param seed + * @return Checksum. + */ +uint16_t ETH_TxComputeChecksum(uint16_t position, uint16_t length, uint16_t seed); + +/** + * @ingroup ethdriver8bit + * @brief Calculates the RX software checksum. + * @param len length + * @param seed + * @return Checksum. + */ +uint16_t ETH_RxComputeChecksum(uint16_t len, uint16_t seed); + +/** + * @ingroup ethdriver8bit + * @brief Reads the MAC address. + * @param *macAddr + * @return None. + */ +void ETH_GetMAC(uint8_t *macAddr); + +/** + * @ingroup ethdriver8bit + * @brief Sets the MAC address. + * @param *macAddr + * @return None. + */ +void ETH_SetMAC(uint8_t *macAddr); + +/** + * @ingroup ethdriver8bit + * @brief Returns the value of the write pointer. + * @param None. + * @return Pointer value. + */ +uint16_t ETH_GetWritePtr(void); + +/** + * @ingroup ethdriver8bit + * @brief Saves the receive pointer for copy. + * @param None. + * @return None. + */ +void ETH_SaveRDPT(void); + +/** + * @ingroup ethdriver8bit + * @brief Resets the receive pointer to the Init. + * @param None. + * @return None. + */ +void ETH_ResetReadPtr(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the value of the read pointer. + * @param None. + * @return Pointer value. + */ +uint16_t ETH_GetReadPtr(void); + +/** + * @ingroup ethdriver8bit + * @brief Sets the read pointer to a specific address. + * @param rdptr Read pointer + * @return None. + */ +void ETH_SetReadPtr(uint16_t rdptr); + +/** + * @ingroup ethdriver8bit + * @brief Returns the Status Vector's byte count. + * @param None. + * @return Byte count. + */ +uint16_t ETH_GetStatusVectorByteCount(void); + +/** + * @ingroup ethdriver8bit + * @brief Sets the Status Vector's byte count. + * @param bc Byte count + * @return None. + */ +void ETH_SetStatusVectorByteCount(uint16_t bc); + +/** + * @ingroup ethdriver8bit + * @brief Resets the driver's byte count. + * @param None. + * @return None. + */ +void ETH_ResetByteCount(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the the driver's byte count. + * @param None. + * @return Byte count. + */ +uint16_t ETH_GetByteCount(void); + +/** + * @ingroup ethdriver8bit + * @brief Returns the saved write pointer. + * @param None. + * @return Pointer value. + */ +uint16_t ETH_ReadSavedWRPT(void); + +/** + * @ingroup ethdriver8bit + * @brief Saves the write pointer for copy. + * @param None. + * @return None. + */ +void ETH_SaveWRPT(void); + +/** + * @ingroup ethdriver8bit + * @brief Sets the receiver's byte count. + * @param count byte count + * @return None. + */ +void ETH_SetRxByteCount(uint16_t count); + +/** + * @ingroup ethdriver8bit + * @brief Returns the receiver's byte count. + * @param None. + * @return Byte count. + */ +uint16_t ETH_GetRxByteCount(void); + +/** + * @ingroup ethdriver8bit + * @brief Checks for the link. + * @param None. + * @retval True if the link is present. + * @retval False if the link is not present. + */ +bool ETH_CheckLinkUp(void); + +/** + * @ingroup ethdriver8bit + * @brief Resets the transmitter. + * @param None. + * @return None. + */ +void ETH_TxReset(void); + +/** + * @ingroup ethdriver8bit + * @brief Moves back the read pointer. + * @param offset + * @return None. + */ +void ETH_MoveBackReadPtr(uint16_t offset); + +#endif /* PHYSICAL_LAYER_INTERFACE_H */ \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/ethernet/src/enc28j60.c b/enc28j60-avr-udp.X/mcc_generated_files/ethernet/src/enc28j60.c new file mode 100644 index 0000000..53db145 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/ethernet/src/enc28j60.c @@ -0,0 +1,1336 @@ +/** + * ENC28J60 Ethernet Driver Source File + * + * @file enc28j60.c + * + * @ingroup enc28j60 + * + * @brief This file provides the Ethernet driver API implementation for the ENC28J60 device. + * + * @version ENC28J60 Ethernet Driver Version 6.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Include Headers + +#include +#include +#include "../enc28j60.h" +#include "../../system/system.h" +#include "../physical_layer_interface.h" +#include "../../spi/spi_interface.h" +#include "../../timer/delay.h" + +// Macros + +#define RESET() ccp_write_io((void *)&RSTCTRL.SWRR, 0x1) + +// MAC Address + +#define MAC_ADDRESS {0x02, 0x00, 0x00, 0x00, 0x00, 0x01} +#define BROADCAST_MAC {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} + +/** + * @ingroup enc28j60 + * @def ETH_NCS_HIGH() + * @brief Sets Ethernet Chip Select to high. + */ +#define ETH_NCS_HIGH() do{ETH_CS_SetHigh();} while(0) + +/** + * @ingroup enc28j60 + * @def ETH_NCS_LOW() + * @brief Sets Ethernet Chip Select to low. + */ +#define ETH_NCS_LOW() do{ETH_CS_SetLow();} while(0) + +/** + * @ingroup enc28j60 + * @def ETH_SPI_READ8() + * @brief Reads the SPI byte. + */ +#define ETH_SPI_READ8() SPI0_ByteExchange(0) + +/** + * @ingroup enc28j60 + * @def ETH_SPI_WRITE8(a) + * @brief Writes the SPI byte. + */ +#define ETH_SPI_WRITE8(a) SPI0_ByteExchange(a) + +/** + * @ingroup enc28j60 + * @def ETH_WRITE_IN_PROGRESS + * @brief Packet write in progress, not ready for transmit. + */ +#define ETH_WRITE_IN_PROGRESS (0x0001 << 0) + +/** + * @ingroup enc28j60 + * @def ETH_TX_QUEUED + * @brief Packet complete, in queue for transmit. + */ +#define ETH_TX_QUEUED (0x0001 << 1) + +/** + * @ingroup enc28j60 + * @def ETH_ALLOCATED + * @brief Flag for pool management. Set to either free or allocated. + */ +#define ETH_ALLOCATED (0x0001 << 2) + +// Adjust these parameters for the MAC. +#define RAMSIZE_ETH (0x1FFF) // 8191 +#define MAX_TX_PACKET_SIZE (1518) +#define MIN_TX_PACKET_SIZE (64) +#define MAX_TX_PACKETS (20) + +#define TX_STATUS_VECTOR_SIZE (7) + +#define MIN_TX_PACKET (MIN_TX_PACKET_SIZE + TX_STATUS_VECTOR_SIZE) +#define TX_BUFFER_SIZE ((MAX_TX_PACKET_SIZE + TX_STATUS_VECTOR_SIZE) << 1) + +// Typical memory map for the MAC buffers +#define TXSTART (RAMSIZE_ETH - TX_BUFFER_SIZE) // 5141 +#define TXEND (RAMSIZE_ETH) // 8191 +#define RXSTART (0) +#define RXEND (TXSTART - 2) // 5139 + +#define TX_BUFFER_MID ((TXSTART) + ((TX_BUFFER_SIZE) >> 1)) + +#define SetBit(bitField, bitMask) do{ bitField = bitField | bitMask; } while(0) +#define ClearBit(bitField, bitMask) do{ bitField = bitField & (~bitMask); } while(0) +#define CheckBit(bitField, bitMask) (bool)(bitField & bitMask) + +// Variables + +volatile ethernetDriver_t ethData; +mac48Address_t macAddress = {MAC_ADDRESS}; +const mac48Address_t broadcastMAC = {BROADCAST_MAC}; +const mac48Address_t *eth_MAC; +static uint16_t nextPacketPointer; +static receiveStatusVector_t rxPacketStatusVector; +sfr_bank_t lastBank; + +// Define a temporary register for passing data to inline assembly +// This is to work around the 110110 LSB errata and to control RDPTR WRPTR update counts + +uint8_t ethListSize; + +static txPacket_t txData[MAX_TX_PACKETS]; + +static txPacket_t *pHead; +static txPacket_t *pTail; + +uint16_t TXPacketSize; + +// Function Prototypes + +const mac48Address_t *MAC_getAddress(void); + +/** + * @ingroup enc28j60 + * @brief Enqueues the latest written packet and starts the transmission of a queued packet. + * @param None. + * @retval PHY_SUCCESS + * @retval PHY_BUFFER_BUSY + */ +phy_error_msg ETH_SendQueued(void); + +/** + * @ingroup enc28j60 + * @brief Copies the queued packets to the TX Buffer start address using the DMA setup. + * @param None. + * @retval PHY_SUCCESS + * @retval PHY_DMA_TIMEOUT + */ +phy_error_msg ETH_Shift_Tx_Packets(void); + +/** + * @ingroup enc28j60 + * @brief Resets the Ethernet packet list. + * @param None. + * @return None. + */ +void ETH_PacketListReset(void); + +/** + * @ingroup enc28j60 + * @brief Allocates a new packet element and links it to the chained list. + * @param None. + * @return Packet address. + */ +txPacket_t *ETH_NewPacket(void); + +/** + * @ingroup enc28j60 + * @brief Deallocates a packet element and unlinks it from the chained list. + * @param pPacket packetHandle + * @return None. + */ +void ETH_RemovePacket(txPacket_t *pPacket); + +/** + * @ingroup enc28j60 + * @brief Calculates the checksum. + * @param len length + * @param seed + * @return Checksum. + */ +static uint16_t ETH_ComputeChecksum(uint16_t len, uint16_t seed); + +/** + * @ingroup enc28j60 + * @brief Reads one byte from Special Function Register (SFR). + * @param a register + * @return One byte of SFR value. + */ +static uint8_t ENC28_Rcr8(enc28j60_registers_t a); + +/** + * @ingroup enc28j60 + * @brief Reads two bytes from SFRs. + * @param a register + * @return Two bytes of SFR value. + */ +static uint16_t ENC28_Rcr16(enc28j60_registers_t a); + +/** + * @ingroup enc28j60 + * @brief Writes one byte to SFRs. + * @param a register + * @param v 8-bit value + * @return None. + */ +static void ENC28_Wcr8(enc28j60_registers_t a, uint8_t v); + +/** + * @ingroup enc28j60 + * @brief Writes two bytes to SFRs. + * @param a register + * @param v 16-bit value + * @return None. + */ +static void ENC28_Wcr16(enc28j60_registers_t a, uint16_t v); + +/** + * @ingroup enc28j60 + * @brief Sets the SFR bit field. + * @param a register + * @param bits + * @return None. + */ +static void ENC28_Bfs(enc28j60_registers_t a, char bits); + +/** + * @ingroup enc28j60 + * @brief Clears the SFR bit field. + * @param a register + * @param bits + * @return None. + */ +static void ENC28_Bfc(enc28j60_registers_t a, char bits); + +/** + * @ingroup enc28j60 + * @brief Reads the Physical Layer (PHY) register. + * @param a register + * @return Register data. + */ +static uint16_t ENC28_PhyRead(enc28j60_phy_registers_t a); + +/** + * @ingroup enc28j60 + * @brief Writes the PHY register. + * @param a register + * @param d data + * @return None. + */ +static void ENC28_PhyWrite(enc28j60_phy_registers_t a, uint16_t d); + +/** + * @ingroup enc28j60 + * @brief Selects the bank. + * @param r register + * @return None. + */ +static void ENC28_BankSel(enc28j60_registers_t r); + +/** + * @ingroup enc28j60 + * @brief Releases the Serial Peripheral Interface (SPI) bus. + * @param None. + * @return None. + */ +static void ETH_CloseSPI(void); + +/** + * @ingroup enc28j60 + * @brief Connects the SPI bus. + * @param None. + * @return None. + */ +static void ETH_OpenSPI(void); + +// Functions + +const mac48Address_t *MAC_getAddress(void) +{ + return &macAddress; +} + +static void ENC28_BankSel(enc28j60_registers_t r) +{ + uint8_t a = r & BANK_MASK; + + if (a != sfr_common && a != lastBank) + { + lastBank = a; + // Clear the bank bits + ETH_NCS_LOW(); + ETH_SPI_WRITE8(bfc_inst | 0x1F); + ETH_SPI_WRITE8(0x03); + ETH_NCS_HIGH(); + NOP(); + NOP(); + // Set the required bits + ETH_NCS_LOW(); + ETH_SPI_WRITE8(bfs_inst | 0x1F); + ETH_SPI_WRITE8(a >> 6); + ETH_NCS_HIGH(); + } +} + +bool ETH_CheckLinkUp(void) +{ + uint16_t phstat2; + phstat2 = ENC28_PhyRead(J60_PHSTAT2); + if (phstat2 & 0x0400) + { + ethData.up = true; + return true; + } + else + return false; +} + +txPacket_t *ETH_NewPacket(void) +{ + uint8_t index = 0; + + if (ethListSize == MAX_TX_PACKETS) + { + return NULL; + } + + while (index < MAX_TX_PACKETS) + { + if (CheckBit(txData[index].flags, ETH_ALLOCATED) == false) + { + txData[index].flags = 0; // Reset all flags + SetBit(txData[index].flags, ETH_ALLOCATED); // Mark the handle as allocated(Allocated = true) + + txData[index].packetEnd = TXEND; + + txData[index].prevPacket = NULL; + txData[index].nextPacket = pHead; + + if (pHead != NULL) + { + pHead->prevPacket = &txData[index]; + txData[index].packetStart = pHead->packetEnd + TX_STATUS_VECTOR_SIZE; + + // Try to keep a 2 byte alignment + if (txData[index].packetStart & 0x0001) + { + // Make sure the end of the packet is odd, so the beginning of the next one is even. + ++txData[index].packetStart; + } + } + else + { + txData[index].packetStart = TXSTART; + pTail = (txPacket_t *)&txData[index]; + } + + pHead = (txPacket_t *)&txData[index]; + + ethListSize++; + return (&txData[index]); + } + index++; + } + return NULL; +} + +void ETH_PacketListReset(void) +{ + uint16_t index = 0; + uint8_t *ptr = (uint8_t *)&txData; + ethListSize = 0; + + pHead = NULL; + pTail = NULL; + + while (index < (MAX_TX_PACKETS * sizeof(txPacket_t))) + { + ptr[index] = 0; + index++; + } +} + +void ETH_RemovePacket(txPacket_t *pPacket) +{ +#ifdef VALIDATE_ALLOCATED_PTR + uint8_t index = 0; +#endif // VALIDATE_ALLOCATED_PTR + + if ((pPacket == NULL) || (ethListSize == 0)) + { + return; + } + +#ifdef VALIDATE_ALLOCATED_PTR + while (index < MAX_TX_PACKETS) + { + if ((pPacket == &txData[index]) && (txData[index].allocated == true)) + { + break; + } + index++; + } + if (index == MAX_TX_PACKETS) + { + return; + } +#endif // VALIDATE_ALLOCATED_PTR + + // Unlink from the chained list + if (pPacket->nextPacket == NULL) + { + pTail = pPacket->prevPacket; + if (pTail != NULL) + { + pTail->nextPacket = NULL; + } + } + + if (pPacket->prevPacket == NULL) + { + pHead = pPacket->nextPacket; + if (pHead != NULL) + { + pHead->prevPacket = NULL; + } + } + + // Deallocate + pPacket->flags = 0; + pPacket->prevPacket = NULL; + pPacket->nextPacket = NULL; + + ethListSize--; + + return; +} + +static void ETH_CloseSPI(void) +{ + SPI0_Close(); +} + +static void ETH_OpenSPI(void) +{ + while (!SPI0_Open(MAC)); +} + +void ETH_Init(void) +{ + ETH_OpenSPI(); + + Control_Byte = 0x00; + // Initialize the driver variables + ethData.error = false; // No error + ethData.up = false; // No link + ethData.linkChange = false; + + ETH_PacketListReset(); + + ethData.saveRDPT = 0; + + lastBank = sfr_bank0; + + DELAY_microseconds(100); + + ETH_SendSystemReset(); // Software reset + DELAY_milliseconds(10); + + // Wait for the OST + while (!(ENC28_Rcr8(J60_ESTAT) & 0x01)); // Wait for CLKRDY to go high + + // Initialize RX tracking variables and other control state flags + nextPacketPointer = RXSTART; + + ENC28_Bfs(J60_ECON2, 0x80); // Enable AUTOINC + + // Set up TX/RX buffer addresses + ENC28_Wcr16(J60_ETXSTL, TXSTART); + ENC28_Wcr16(J60_ETXNDL, TXEND); + ENC28_Wcr16(J60_ERXSTL, RXSTART); + ENC28_Wcr16(J60_ERXNDL, RXEND); + ENC28_Wcr16(J60_ERDPTL, nextPacketPointer); + + ENC28_Wcr16(J60_ERDPTL, RXSTART); + ENC28_Wcr16(J60_EWRPTL, TXSTART); + + // Configure the receive filter + ENC28_Wcr8(J60_ERXFCON, 0b10101001); // UCEN,OR,CRCEN,MPEN,BCEN (unicast,crc,magic packet,broadcast) + + // Get MAC address + eth_MAC = MAC_getAddress(); + + // Initialize the MAC + ENC28_Wcr8(J60_MACON1, 0x0D); // TXPAUS, RXPAUS, MARXEN + ENC28_Wcr8(J60_MACON3, 0x23); // Pad < 60 bytes, Enable CRC, Frame Check, Full Duplex + ENC28_Wcr8(J60_MACON4, 0x40); // DEFER set + ENC28_Wcr16(J60_MAIPGL, 0x0c12); + ENC28_Wcr8(J60_MABBIPG, 0x12); + ENC28_Wcr16(J60_MAMXFLL, MAX_TX_PACKET_SIZE); + ENC28_Wcr8(J60_MAADR1, eth_MAC->mac_array[0]); + NOP(); + ENC28_Wcr8(J60_MAADR2, eth_MAC->mac_array[1]); + NOP(); + ENC28_Wcr8(J60_MAADR3, eth_MAC->mac_array[2]); + NOP(); + ENC28_Wcr8(J60_MAADR4, eth_MAC->mac_array[3]); + NOP(); + ENC28_Wcr8(J60_MAADR5, eth_MAC->mac_array[4]); + NOP(); + ENC28_Wcr8(J60_MAADR6, eth_MAC->mac_array[5]); + NOP(); + + ENC28_Wcr8(J60_ECON1, 0x04); // RXEN enabled + + // Initialize the PHY + ENC28_PhyWrite(J60_PHCON1, 0x0100); // Ful-Duplex mode enabled (PDPXMD - PHY) + ENC28_PhyWrite(J60_PHCON2, 0x0100); // Do not transmit loopback + ENC28_PhyWrite(J60_PHLCON, 0x0472); // LED control - LEDA = Link, LEDB = TX/RX, Stretched LED + // LEDB is grounded so default is Half Duplex + + // Configure the IRQ's + ENC28_Wcr8(J60_EIE, 0xDB); // Enable PKTIE,INTIE,LINKIE,TXIE,TXERIE,RXERIE + ENC28_Wcr16(((enc28j60_registers_t)J60_PHIE), 0x12); // Enable PLNKIE and PGEIE + + // Check for a preexisting link + ETH_CheckLinkUp(); +} + +void ETH_EventHandler(void) +{ + eir_t eir_val; + phstat2_t phstat2_val; + + // MAC is sending an interrupt + eir_val.val = ENC28_Rcr8(J60_EIR); + phstat2_val.val = ENC28_Rcr16((enc28j60_registers_t)J60_PHSTAT2); + + if (eir_val.LINKIF) // Something about the link changed. Update the link parameters. + { + ENC28_Bfc(J60_EIR, 0x01); // CLEAR LINKIF + ethData.linkChange = true; + ethData.up = false; + if (ETH_CheckLinkUp()) + { + } + if (phstat2_val.DPXSTAT) // Update MAC duplex settings to match PHY duplex setting + { + ENC28_Wcr16(J60_MABBIPG, 0x15); // Switching to full duplex + ENC28_Bfs(((enc28j60_registers_t)J60_PHSTAT2), 0x01); + } + else + { + ENC28_Wcr16(J60_MABBIPG, 0x12); // Switching to half duplex + ENC28_Bfc(((enc28j60_registers_t)J60_PHSTAT2), 0x01); + } + } + if (eir_val.TXIF) // Packet sent + { + ENC28_Bfc(J60_EIR, 0x08); // Clear TXIF + ETH_RemovePacket(pTail); + if (ethListSize > 0) + { + if (ENC28_Rcr16(J60_EWRPTL) > TX_BUFFER_MID) + { + // Shift all the queued packets to the start of the TX Buffer + ETH_Shift_Tx_Packets(); + } + + // Send the next queued packet + ETH_SendQueued(); + } + } + if (eir_val.PKTIF || ENC28_Rcr8(J60_EPKTCNT)) // Packet receive buffer has at least 1 unprocessed packet + { + ethData.pktReady = true; + ENC28_Bfc(J60_EIR, 0x04); // Clear PKTIF + } +} + +void ETH_NextPacketUpdate(void) +{ + // Set the RX Read Pointer to the beginning of the next unprocessed packet + // Errata 14 inclusion + if (nextPacketPointer == RXSTART) + ENC28_Wcr16(J60_ERXRDPTL, RXEND); + else + ENC28_Wcr16(J60_ERXRDPTL, nextPacketPointer - 1); + + ENC28_Wcr16(J60_ERDPTL, nextPacketPointer); + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + ((char *)&nextPacketPointer)[0] = ETH_SPI_READ8(); + ((char *)&nextPacketPointer)[1] = ETH_SPI_READ8(); + ((char *)&rxPacketStatusVector)[0] = ETH_SPI_READ8(); + ((char *)&rxPacketStatusVector)[1] = ETH_SPI_READ8(); + ((char *)&rxPacketStatusVector)[2] = ETH_SPI_READ8(); + ((char *)&rxPacketStatusVector)[3] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + rxPacketStatusVector.byteCount -= 4; // Frame checksum can be ignored at the end. + // The checksum is 4 bytes. Payload is byte count less 4. +} + +void ETH_ResetReceiver(void) +{ + uint8_t econ1; + econ1 = ENC28_Rcr8(J60_ECON1); + ENC28_Wcr8(J60_ECON1, (econ1 | 0x40)); +} + +static uint8_t ENC28_Rcr8(enc28j60_registers_t a) +{ + uint8_t v; + + ENC28_BankSel(a); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rcr_inst | (a & SFR_MASK)); + v = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return v; +} + +static uint16_t ENC28_Rcr16(enc28j60_registers_t a) +{ + uint16_t v; + + ENC28_BankSel(a); + a &= SFR_MASK; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rcr_inst | (a)); + ((char *)&v)[0] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + NOP(); + NOP(); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rcr_inst | (a + 1)); + ((char *)&v)[1] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return v; +} + +static void ENC28_Wcr8(enc28j60_registers_t a, uint8_t v) +{ + ENC28_BankSel(a); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wcr_inst | (a & SFR_MASK)); + ETH_SPI_WRITE8(v); + ETH_NCS_HIGH(); +} + +static void ENC28_Wcr16(enc28j60_registers_t a, uint16_t v) +{ + ENC28_BankSel(a); + a &= SFR_MASK; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wcr_inst | (a)); + ETH_SPI_WRITE8(((char *)&v)[0]); + ETH_NCS_HIGH(); + NOP(); + NOP(); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wcr_inst | (a + 1)); + ETH_SPI_WRITE8(((char *)&v)[1]); + ETH_NCS_HIGH(); +} + +static void ENC28_Bfs(enc28j60_registers_t a, char bits) // can only be used for ETH Control Registers +{ + ENC28_BankSel(a); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(bfs_inst | (a & SFR_MASK)); + ETH_SPI_WRITE8(bits); + ETH_NCS_HIGH(); +} + +static void ENC28_Bfc(enc28j60_registers_t a, char bits) +{ + ENC28_BankSel(a); + ETH_NCS_LOW(); + ETH_SPI_WRITE8(bfc_inst | (a & SFR_MASK)); + ETH_SPI_WRITE8(bits); + ETH_NCS_HIGH(); +} + +static void ENC28_PhyWrite(enc28j60_phy_registers_t a, uint16_t d) +{ + uint8_t v = 1; + + ENC28_Wcr8(J60_MIREGADR, a); + ENC28_Wcr16(J60_MIWRL, d); + while (v & 0x01) + { + v = ENC28_Rcr8(J60_MISTAT); + } +} + +static uint16_t ENC28_PhyRead(enc28j60_phy_registers_t a) +{ + ENC28_Wcr8(J60_MIREGADR, a); + ENC28_Bfs(J60_MICMD, 0x01); // Set the read flag + while (ENC28_Rcr8(J60_MISTAT) & 0x01); // Wait for the busy flag to clear + ENC28_Bfc(J60_MICMD, 0x01); // Clear the read flag + + return ENC28_Rcr16(J60_MIRDL); +} + +void ETH_SendSystemReset(void) +{ + ETH_NCS_LOW(); + ETH_SPI_WRITE8(src_inst); + ETH_NCS_HIGH(); +} + +uint8_t ETH_Read8(void) +{ + uint8_t b; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + b = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return b; +} + +uint16_t ETH_Read16(void) +{ + uint16_t b; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + b = (uint16_t)(ETH_SPI_READ8() << 8); + b |= ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return b; +} + +uint32_t ETH_Read24(void) +{ + uint32_t b; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + ((char *)&b)[2] = ETH_SPI_READ8(); + ((char *)&b)[1] = ETH_SPI_READ8(); + ((char *)&b)[0] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return b; +} + +uint32_t ETH_Read32(void) +{ + uint32_t b; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + ((char *)&b)[3] = ETH_SPI_READ8(); + ((char *)&b)[2] = ETH_SPI_READ8(); + ((char *)&b)[1] = ETH_SPI_READ8(); + ((char *)&b)[0] = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return b; +} + +uint16_t ETH_ReadBlock(void *buffer, uint16_t length) +{ + uint16_t readCount = length; + char *p = buffer; + + if (rxPacketStatusVector.byteCount < length) + readCount = rxPacketStatusVector.byteCount; + length = readCount; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(rbm_inst); + while (length--) *p++ = ETH_SPI_READ8(); + ETH_NCS_HIGH(); + + return readCount; +} + +void ETH_Write8(uint8_t data) +{ + TXPacketSize += 1; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8(data); + ETH_NCS_HIGH(); +} + +void ETH_Write16(uint16_t data) +{ + TXPacketSize += 2; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8((uint8_t)(data >> 8)); + ETH_SPI_WRITE8((uint8_t)(data)); + ETH_NCS_HIGH(); +} + +void ETH_Write24(uint32_t data) +{ + TXPacketSize += 3; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8((uint8_t)(data >> 16)); + ETH_SPI_WRITE8((uint8_t)(data >> 8)); + ETH_SPI_WRITE8((uint8_t)(data)); + ETH_NCS_HIGH(); +} + +void ETH_Write32(uint32_t data) +{ + TXPacketSize += 4; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8((uint8_t)(data >> 24)); + ETH_SPI_WRITE8((uint8_t)(data >> 16)); + ETH_SPI_WRITE8((uint8_t)(data >> 8)); + ETH_SPI_WRITE8((uint8_t)(data)); + ETH_NCS_HIGH(); +} + +uint16_t ETH_WriteString(const char *string) +{ + uint16_t length = 0; + + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + while (*string) + { + ETH_SPI_WRITE8(*string++); + length++; + } + ETH_NCS_HIGH(); + TXPacketSize += length; + + return length; +} + +uint16_t ETH_WriteBlock(const char *data, uint16_t length) +{ + const char *p = data; + TXPacketSize += length; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + while (length--) + { + ETH_SPI_WRITE8(*p++); + } + ETH_NCS_HIGH(); + + return length; +} + +uint16_t ETH_GetFreeTxBufferSize(void) +{ + return (uint16_t)(TXEND - (ENC28_Rcr16(J60_EWRPTL))); +} + +phy_error_msg ETH_WriteStart(const mac48Address_t *dest_mac, uint16_t type) +{ + txPacket_t *ethPacket = NULL; + + if (ENC28_Rcr16(J60_EWRPTL) > TX_BUFFER_MID) + { + // Shift all the queued packets to the start of the TX Buffer + // Check if TX in progress + if ((ENC28_Rcr8(J60_ECON1) & 0x08)) + { + return PHY_TX_LOGIC_NOT_IDLE; + } + + // Try to move the queued packets + ETH_Shift_Tx_Packets(); + + // Verify if shifted + if (ENC28_Rcr16(J60_EWRPTL) > TX_BUFFER_MID) + { + return PHY_BUFFER_BUSY; + } + } + + // Create new packet and queue it in the TX Buffer + + // Initialize a new packet handler to automatically place in the queue + ethPacket = ETH_NewPacket(); + + if (ethPacket == NULL) + { + // Packets not availabe + return PHY_BUFFER_BUSY; + } + + SetBit(ethPacket->flags, ETH_WRITE_IN_PROGRESS); // writeInProgress = true; + + ENC28_Wcr16(J60_EWRPTL, ethPacket->packetStart); + + ETH_ResetByteCount(); + + TXPacketSize = 0; + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); + ETH_SPI_WRITE8(Control_Byte); + ETH_SPI_WRITE8(dest_mac->mac_array[0]); + ETH_SPI_WRITE8(dest_mac->mac_array[1]); + ETH_SPI_WRITE8(dest_mac->mac_array[2]); + ETH_SPI_WRITE8(dest_mac->mac_array[3]); + ETH_SPI_WRITE8(dest_mac->mac_array[4]); + ETH_SPI_WRITE8(dest_mac->mac_array[5]); + ETH_SPI_WRITE8(eth_MAC->mac_array[0]); + ETH_SPI_WRITE8(eth_MAC->mac_array[1]); + ETH_SPI_WRITE8(eth_MAC->mac_array[2]); + ETH_SPI_WRITE8(eth_MAC->mac_array[3]); + ETH_SPI_WRITE8(eth_MAC->mac_array[4]); + ETH_SPI_WRITE8(eth_MAC->mac_array[5]); + ETH_SPI_WRITE8(type >> 8); + ETH_SPI_WRITE8(type & 0x0FF); + ETH_NCS_HIGH(); + TXPacketSize += 15; + + return PHY_SUCCESS; +} + +phy_error_msg ETH_SendQueued(void) +{ + uint8_t econ1; + + if (pHead->flags & ETH_TX_QUEUED) + { + // Close the latest written packet and enqueue it + ClearBit(pHead->flags, (uint16_t)ETH_TX_QUEUED); // txQueued = false + + // Start transmitting from the tails. The packet first written + ENC28_Wcr16(J60_ETXSTL, pTail->packetStart); + ENC28_Wcr16(J60_ETXNDL, pTail->packetEnd); + + NOP(); + NOP(); + econ1 = ENC28_Rcr8(J60_ECON1); + ENC28_Wcr8(J60_ECON1, (econ1 | 0x08)); // Start sending + + return PHY_SUCCESS; + } + else + { + return PHY_BUFFER_BUSY; + } +} + +phy_error_msg ETH_Send(void) +{ + uint16_t packetEnd = (ENC28_Rcr16(J60_EWRPTL)) - 1; + + ENC28_Wcr16(J60_ETXNDL, TXSTART + TXPacketSize); + if (!ethData.up) + { + return PHY_LINK_NOT_FOUND; + } + + if (ethListSize == 0) + { + return PHY_BUFFER_BUSY; + } + + ClearBit(pHead->flags, (uint16_t)ETH_WRITE_IN_PROGRESS); // writeInProgress = false + pHead->packetEnd = packetEnd; + SetBit(pHead->flags, ETH_TX_QUEUED); // txQueued = true + // The packet is prepared to be sent/queued at this time + + if ((ENC28_Rcr16(J60_ECON1) & 0x08) || (ethListSize > 1)) + { + return PHY_TX_QUEUED; + } + return ETH_SendQueued(); +} + +void ETH_Dump(uint16_t length) +{ + uint16_t newRXTail; + + length = (rxPacketStatusVector.byteCount <= length) ? rxPacketStatusVector.byteCount : length; + if (length) + { + newRXTail = ENC28_Rcr16(J60_ERDPTL); + newRXTail += length; + // Write new RX tail + ENC28_Wcr16(J60_ERDPTL, newRXTail); + rxPacketStatusVector.byteCount -= length; + } +} + +void ETH_Flush(void) +{ + ethData.pktReady = false; + if (nextPacketPointer == RXSTART) + ENC28_Wcr16(J60_ERXRDPTL, RXEND); + else + ENC28_Wcr16(J60_ERXRDPTL, nextPacketPointer - 1); + ENC28_Wcr16(J60_ERDPTL, nextPacketPointer); + // Packet decrement + ENC28_Bfs(J60_ECON2, 0x40); +} + +void ETH_Insert(char *data, uint16_t len, uint16_t offset) +{ + uint16_t current_tx_pointer = 0; + offset += sizeof(Control_Byte); + + current_tx_pointer = ENC28_Rcr16(J60_EWRPTL); + ENC28_Wcr16(J60_EWRPTL, pHead->packetStart + offset); + while (len--) + { + ETH_NCS_LOW(); + ETH_SPI_WRITE8(wbm_inst); // WBM command + ETH_SPI_WRITE8(*data++); + ETH_NCS_HIGH(); + } + ENC28_Wcr16(J60_EWRPTL, current_tx_pointer); +} + +phy_error_msg ETH_Copy(uint16_t len) +{ + uint16_t tx_buffer_address; + uint16_t timer; + uint16_t temp_len; + + timer = 2 * len; + // Waits until module is idle + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0 && --timer) + NOP(); // Waits here until the DMAST bit is clear + + if ((ENC28_Rcr8(J60_ECON1) & 0x20) == 0) + { + tx_buffer_address = ENC28_Rcr16(J60_EWRPTL); // Current TX Write Pointer + + ENC28_Wcr16(J60_EDMADSTL, tx_buffer_address); + ENC28_Wcr16(J60_EDMASTL, ethData.saveRDPT); + + tx_buffer_address += len; + temp_len = ethData.saveRDPT + len; + + if (temp_len > RXEND) + { + temp_len = temp_len - (RXEND) + RXSTART; + ENC28_Wcr16(J60_EDMANDL, temp_len); + } + else + { + ENC28_Wcr16(J60_EDMANDL, temp_len); + } + + // Clear CSUMEN to select a copy operation + ENC28_Bfc(J60_ECON1, 0x10); + // Starts the DMA + ENC28_Bfs(J60_ECON1, 0x20); + timer = 40 * len; + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0 && --timer) + NOP(); // Waits here until the DMAST bit is clear + if ((ENC28_Rcr8(J60_ECON1) & 0x20) == 0) + { + // Clears the source and destination window pointers + ENC28_Wcr16(J60_EWRPTL, tx_buffer_address); + + TXPacketSize += len; // Fixes the packet length + return PHY_SUCCESS; + } + } + RESET(); // Reboots device + return PHY_DMA_TIMEOUT; +} + +phy_error_msg ETH_Shift_Tx_Packets(void) +{ + uint8_t econ1; + uint16_t timer; + uint16_t len = pHead->packetEnd - pTail->packetStart; + + timer = 2 * len; + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0 && --timer) + NOP(); // Waits here until DMA is free + if ((ENC28_Rcr8(J60_ECON1) & 0x20) == 0) // ECON1bits.DMAST==0 + { + ENC28_Wcr16(J60_EDMADSTL, TXSTART); // Setup the destination start pointer + + ENC28_Wcr16(J60_EDMASTL, pTail->packetStart); // Setup the source pointer from the current read pointer + ENC28_Wcr16(J60_EDMANDL, pTail->packetStart); + + econ1 = ENC28_Rcr8(J60_ECON1); + ENC28_Wcr8(J60_ECON1, (econ1 | 0x10)); // Copy mode ECON1bits.CSUMEN = 0 + econ1 = ENC28_Rcr8(J60_ECON1); + ENC28_Wcr8(J60_ECON1, (econ1 | 0x20)); // Starts DMA ECON1bits.DMAST = 1 + + // It might take longer to complete if there is heavy network traffic + timer = 40 * len; + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0 && --timer) + NOP(); // Waits here until DMA is free + if ((ENC28_Rcr8(J60_ECON1) & 0x20) == 0) + { + // Updates the start and end addresses of each packet + txPacket_t *pElem = pHead; + uint16_t shiftOffset = pTail->packetStart; + + while (pElem != NULL) + { + pElem->packetStart = pElem->packetStart - shiftOffset; + pElem->packetEnd = pElem->packetEnd - shiftOffset; + pElem = pElem->nextPacket; + } + + // Updates the EWRPT + ENC28_Wcr16(J60_EWRPTL, TXSTART + len); + return PHY_SUCCESS; + } + } + // DMA is timed out + RESET(); // Reboots device + return PHY_DMA_TIMEOUT; +} + +static uint16_t ETH_ComputeChecksum(uint16_t len, uint16_t seed) +{ + uint32_t cksm; + uint16_t v; + + cksm = seed; + + while (len > 1) + { + v = 0; + ((char *)&v)[1] = ETH_Read8(); + ((char *)&v)[0] = ETH_Read8(); + cksm += v; + len -= 2; + } + + if (len) + { + v = 0; + ((char *)&v)[1] = ETH_Read8(); + ((char *)&v)[0] = 0; + cksm += v; + } + + // Wraps the checksum + while (cksm >> 16) + { + cksm = (cksm & 0x0FFFF) + (cksm >> 16); + } + + // Inverts the number. + cksm = ~cksm; + + // Returns the resulting checksum + return (uint16_t)cksm; +} + +uint16_t ETH_TxComputeChecksum(uint16_t position, uint16_t length, uint16_t seed) +{ + uint32_t cksm; + + // cksm = seed; + position += sizeof(Control_Byte); + + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0); // Waits until the DMAST bit is clear + + ENC28_Wcr16(J60_EDMASTL, (pHead->packetStart + position)); + ENC28_Wcr16(J60_EDMANDL, pHead->packetStart + position + (length - 1)); + + if (!(ENC28_Rcr8(J60_ECON1) & 0x10)) // Verify CSUMEN is not set already + { + // Sets CSUMEN and DMAST to select and start a checksum operation + ENC28_Bfs(J60_ECON1, 0x30); + while ((ENC28_Rcr8(J60_ECON1) & 0x20) != 0); // Waits until the DMAST bit is clear + ENC28_Bfc(J60_ECON1,0x10); + + cksm = ENC28_Rcr16(J60_EDMACSL); + if (seed) + { + seed = ~(seed); + cksm += seed; + while (cksm >> 16) + { + cksm = (cksm & 0x0FFFF) + (cksm >> 16); + } + } + cksm = htons(cksm); + } + return (uint16_t)cksm; +} + +uint16_t ETH_RxComputeChecksum(uint16_t len, uint16_t seed) +{ + uint16_t rxptr; + uint32_t cksm; + + // Saves the read pointer starting address + rxptr = ENC28_Rcr16(J60_ERDPTL); + + cksm = ETH_ComputeChecksum(len, seed); + + // Restores old read pointer location + ENC28_Wcr16(J60_ERDPTL, rxptr); + + // Returns the resulting checksum + return (uint16_t)(((cksm & 0xFF00) >> 8) | ((cksm & 0x00FF) << 8)); +} + +void ETH_GetMAC(uint8_t *macAddr) +{ + *macAddr++ = ENC28_Rcr8(J60_MAADR1); + *macAddr++ = ENC28_Rcr8(J60_MAADR2); + *macAddr++ = ENC28_Rcr8(J60_MAADR3); + *macAddr++ = ENC28_Rcr8(J60_MAADR4); + *macAddr++ = ENC28_Rcr8(J60_MAADR5); + *macAddr++ = ENC28_Rcr8(J60_MAADR6); +} + +void ETH_SetMAC(uint8_t *macAddr) +{ + ENC28_Wcr8(J60_MAADR1, *macAddr++); + ENC28_Wcr8(J60_MAADR2, *macAddr++); + ENC28_Wcr8(J60_MAADR3, *macAddr++); + ENC28_Wcr8(J60_MAADR4, *macAddr++); + ENC28_Wcr8(J60_MAADR5, *macAddr++); + ENC28_Wcr8(J60_MAADR6, *macAddr++); +} + +void ETH_SaveRDPT(void) +{ + ethData.saveRDPT = ENC28_Rcr16(J60_ERDPTL); +} + +uint16_t ETH_GetReadPtr(void) +{ + return ENC28_Rcr16(J60_ERDPTL); +} + +void ETH_SetReadPtr(uint16_t rdptr) +{ + ENC28_Wcr16(J60_ERDPTL, rdptr); +} + +void ETH_MoveBackReadPtr(uint16_t offset) +{ + uint16_t rdptr; + + rdptr = ENC28_Rcr16(J60_ERDPTL); + ENC28_Wcr16(J60_ERDPTL, rdptr - offset); + ETH_SetRxByteCount(offset); +} + +void ETH_ResetReadPtr(void) +{ + ENC28_Wcr16(J60_ERDPTL, RXSTART); +} + +uint16_t ETH_GetWritePtr(void) +{ + return ENC28_Rcr16(J60_EWRPTL); +} + +uint16_t ETH_GetRxByteCount(void) +{ + return (rxPacketStatusVector.byteCount); +} + +void ETH_SetRxByteCount(uint16_t count) +{ + rxPacketStatusVector.byteCount += count; +} + +void ETH_ResetByteCount(void) +{ + ethData.saveWRPT = ENC28_Rcr16(J60_EWRPTL); +} + +uint16_t ETH_GetByteCount(void) +{ + uint16_t wptr; + wptr = ENC28_Rcr16(J60_EWRPTL); + return (wptr - ethData.saveWRPT); +} + +void ETH_SaveWRPT(void) +{ + ethData.saveWRPT = ENC28_Rcr16(J60_EWRPTL); +} + +uint16_t ETH_ReadSavedWRPT(void) +{ + return ethData.saveWRPT; +} + +uint16_t ETH_GetStatusVectorByteCount(void) +{ + return (rxPacketStatusVector.byteCount); +} + +void ETH_SetStatusVectorByteCount(uint16_t bc) +{ + rxPacketStatusVector.byteCount = bc; +} + +void ETH_TxReset(void) +{ + uint8_t econ1; + econ1 = ENC28_Rcr8(J60_ECON1); + + ENC28_Wcr8(J60_ECON1, (econ1 | 0x80)); + + ETH_ResetByteCount(); + + ENC28_Wcr16(J60_ETXSTL, TXSTART); + ENC28_Wcr16(J60_EWRPTL, TXSTART); + + ETH_PacketListReset(); +} diff --git a/enc28j60-avr-udp.X/mcc_generated_files/nvm/nvm.h b/enc28j60-avr-udp.X/mcc_generated_files/nvm/nvm.h new file mode 100644 index 0000000..277242e --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/nvm/nvm.h @@ -0,0 +1,206 @@ +/** + * + * @file nvm.h + * + * @defgroup nvm_driver Non-Volatile Memory + * + * @brief This file contains API prototypes and other data types for the Non-Volatile Memory (NVM) driver. + * + * @version NVM Driver Version 3.0.0 + */ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef NVM_H +#define NVM_H + +#include "../system/utils/compiler.h" + +/** + * @ingroup nvm_driver + * @def PROGMEM_BLOCK_SIZE + * Contains the program memory block size in bytes. + * The BOOTSIZE and CODESIZE fuses select the Flash section sizes in blocks of PROGMEM_BLOCK_SIZE bytes. + */ +#define PROGMEM_BLOCK_SIZE (512U) + + +/** + * @ingroup nvm_driver + * @brief Data type for the Flash data. + */ +typedef uint8_t flash_data_t; +/** + * @ingroup nvm_driver + * @brief Data type for the Flash address. + */ +typedef uint32_t flash_address_t; + +/** + * @ingroup nvm_driver + * @brief Data type for the EEPROM data. + */ +typedef uint8_t eeprom_data_t; +/** + * @ingroup nvm_driver + * @brief Data type for the EEPROM address. + */ +typedef uint16_t eeprom_address_t; + +/** + * @ingroup nvm_driver + * @enum nvm_status_t + * @brief Contains the return codes for the NVM driver APIs. + */ +typedef enum +{ + NVM_OK, /**<0 - The NVM operation succeeded.*/ + NVM_ERROR /**<1 - The NVM operation failed.*/ +} nvm_status_t; + +/** + * @ingroup nvm_driver + * @brief Initializes the NVM driver. + * @param None. + * @return None. + */ +void NVM_Initialize(void); + +/** + * @ingroup nvm_driver + * @brief Returns the status of the last NVM operation. + * @param None. + * @retval NVM_OK - The NVM operation succeeded. + * @retval NVM_ERROR - The NVM operation failed. + */ +nvm_status_t NVM_StatusGet(void); + +/** + * @ingroup nvm_driver + * @brief Clears the NVM error status. + * @param None. + * @return None. + */ +void NVM_StatusClear(void); + +/** + * @ingroup nvm_driver + * @brief Reads a byte from the given Flash address. + * @pre NVM must be initialized with @ref NVM_Initialize() before calling this API. + * @param [in] address - Address of the Flash location from which data is to be read. + * @return Byte read from the given Flash address. + */ +flash_data_t FLASH_Read(flash_address_t address); + +/** + * @ingroup nvm_driver + * @brief Writes a word at the given Flash address. + * As this is a non-portable API, it may not be supported by all 8-bit PIC® and AVR® devices. + * @pre NVM must be initialized with @ref NVM_Initialize() before calling this API. + * Erase the Flash location before writing. + * @param [in] address - Address of the Flash location at which data is to be written. + * @param [in] data - Word to be written. + * @return Status of the Flash write operation as described in @ref nvm_status_t. + */ +nvm_status_t FLASH_Write(flash_address_t address, uint16_t data); + +/** + * @ingroup nvm_driver + * @brief Writes one entire Flash row/page from the given starting address of the row (the first byte location). + * The size of the input buffer must be one Flash row and the address must be aligned with the row boundary. + * Use @ref FLASH_PageAddressGet() to obtain the starting address of the row. + * @pre Erase Flash row before calling this function. + * @param [in] address - Starting address of the Flash row to be written. + * @param [in] *dataBuffer - Pointer to a buffer which holds the data to be written. + * @return Status of the Flash row write operation as described in @ref nvm_status_t. + */ +nvm_status_t FLASH_RowWrite(flash_address_t address, flash_data_t *dataBuffer); + +/** + * @ingroup nvm_driver + * @brief Erases one Flash page containing the given address. + * @pre NVM must be initialized with @ref NVM_Initialize() before calling this API. + * @param [in] address - Starting address of the Flash page to be erased. + * @return Status of the Flash page erase operation as described in @ref nvm_status_t. + */ +nvm_status_t FLASH_PageErase(flash_address_t address); + +/** + * @ingroup nvm_driver + * @brief Checks if the Flash is busy. + * @pre NVM must be initialized with @ref NVM_Initialize() before calling this API. + * @param None. + * @retval True - The Flash operation is being performed. + * @retval False - The Flash operation is not being performed. + */ +bool FLASH_IsBusy(void); + +/** + * @ingroup nvm_driver + * @brief Returns the starting address of the page (the first byte location) containing the given Flash address. + * @param [in] address - Flash address for which the page starting address will be obtained. + * @return Starting address of the page containing the given Flash address. + */ +flash_address_t FLASH_PageAddressGet(flash_address_t address); + +/** + * @ingroup nvm_driver + * @brief Returns the offset from the starting address of the page (the first byte location). + * @param [in] address - Flash address for which the offset from the starting address of the page will be obtained. + * @return Offset of the given address from the starting address of the page. + */ +uint16_t FLASH_PageOffsetGet(flash_address_t address); + +//Below macros are added to provide backward compatibility. These will be deprecated in the future versions. +#define FLASH_ErasePageAddressGet FLASH_PageAddressGet +#define FLASH_ErasePageOffsetGet FLASH_PageOffsetGet + +/** + * @ingroup nvm_driver + * @brief Reads one byte from the given EEPROM address. + * @pre NVM must be initialized with @ref NVM_Initialize() before calling this API. + * @param [in] address - Address of the EEPROM location to be read. + * @return Byte read from the given EEPROM address. + */ +eeprom_data_t EEPROM_Read(eeprom_address_t address); + +/** + * @ingroup nvm_driver + * @brief Writes one byte to the given EEPROM address. + * The EEPROM Busy status must be checked using the @ref EEPROM_IsBusy() API to know if the write operation is completed. + * Use the @ref NVM_StatusGet() API to see the result of the write operation. + * @param [in] address - Address of the EEPROM location to be written. + * @param [in] data - Byte to be written to the given EEPROM location. + * @return None. + */ +void EEPROM_Write(eeprom_address_t address, eeprom_data_t data); + +/** + * @ingroup nvm_driver + * @brief Checks if the EEPROM is busy. + * @pre NVM must be initialized with @ref NVM_Initialize() before calling this API. + * @param None. + * @retval True - The EEPROM operation is being performed. + * @retval False - The EEPROM operation is not being performed. + */ +bool EEPROM_IsBusy(void); + +#endif //NVM_H diff --git a/enc28j60-avr-udp.X/mcc_generated_files/nvm/src/nvm.c b/enc28j60-avr-udp.X/mcc_generated_files/nvm/src/nvm.c new file mode 100644 index 0000000..18b6907 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/nvm/src/nvm.c @@ -0,0 +1,157 @@ +/** + * + * @file nvm.c + * + * @ingroup nvm_driver + * + * @brief Contains the implementation file for the NVM driver. + * + * @version NVM Driver Version 3.0.0 + */ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include +#include "../../system/ccp.h" +#include "../nvm.h" + +void NVM_Initialize(void) +{ + NVM_StatusClear(); + //APPCODEWP disabled; APPDATAWP disabled; BOOTRP disabled; FLMAP SECTION0; FLMAPLOCK disabled; + NVMCTRL.CTRLB = 0x0; +} + +nvm_status_t NVM_StatusGet(void) +{ + return (((NVMCTRL.STATUS & NVMCTRL_ERROR_gm) != 0) ? NVM_ERROR : NVM_OK); +} + +void NVM_StatusClear(void) +{ + NVMCTRL.STATUS &= ~NVMCTRL_ERROR_gm; +} + +static void FLASH_SpmWriteWord(flash_address_t address, uint16_t data) +{ + __asm__ __volatile__( + "push r0\n\t" /* back up R0*/\ + "movw r0, %A1\n\t" /* update R0,R1 pair with word*/\ + "movw r30, %A0\n\t" /* update R30,R31 pair with address[Byte1,Byte0]*/\ + "spm \n\t" /* spm */\ + "clr r1\n\t" /* R1 is always assumed to be zero by the compiler. Resetting R1 to zero*/\ + "pop r0 \n\t" /* restore R0*/\ + : \ + : "r" ((uint32_t) (address)), "r" ((uint16_t) (data)) \ + : "r30", "r31" /* Clobber R30, R31 to indicate they are used here*/ + ); +} + +flash_data_t FLASH_Read(flash_address_t address) +{ + return pgm_read_byte_near(address); +} + +nvm_status_t FLASH_Write(flash_address_t address, uint16_t data) +{ + //Write the flash page + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_FLWR_gc); + + //Write data to the page buffer + FLASH_SpmWriteWord(address, data); + + //Clear the current command + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_NONE_gc); + + return (((NVMCTRL.STATUS & NVMCTRL_ERROR_gm) != 0) ? NVM_ERROR : NVM_OK); +} + +nvm_status_t FLASH_RowWrite(flash_address_t address, flash_data_t *dataBuffer) +{ + uint16_t dataWord; + + //Write the flash page + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_FLWR_gc); + + //Write data to the page buffer, one word at a time + for (uint16_t i = 0; i < PROGMEM_PAGE_SIZE; i = i + 2U) + { + //Access wordwise data from buffer + dataWord = (uint16_t) (dataBuffer[i] | (dataBuffer[i+1U] << 8U)); + FLASH_SpmWriteWord(address + (uint32_t) i, dataWord); + } + + //Clear the current command + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_NONE_gc); + + return (((NVMCTRL.STATUS & NVMCTRL_ERROR_gm) != 0) ? NVM_ERROR : NVM_OK); +} + +nvm_status_t FLASH_PageErase(flash_address_t address) +{ + //Erase the flash page + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_FLPER_gc); + + //Dummy write to start erase operation + FLASH_SpmWriteWord(address, 0); + + //Clear the current command + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_NONE_gc); + + return (((NVMCTRL.STATUS & NVMCTRL_ERROR_gm) != 0) ? NVM_ERROR : NVM_OK); +} + +bool FLASH_IsBusy(void) +{ + return (NVMCTRL.STATUS & NVMCTRL_FBUSY_bm); +} + +flash_address_t FLASH_PageAddressGet(flash_address_t address) +{ + return (flash_address_t) (address & ((PROGMEM_SIZE - 1) ^ (PROGMEM_PAGE_SIZE - 1))); +} + +uint16_t FLASH_PageOffsetGet(flash_address_t address) +{ + return (uint16_t) (address & (PROGMEM_PAGE_SIZE - 1)); +} + +eeprom_data_t EEPROM_Read(eeprom_address_t address) +{ + return *(eeprom_data_t *) address; +} + +void EEPROM_Write(eeprom_address_t address, eeprom_data_t data) +{ + //Program the EEPROM with desired value(s) + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_EEERWR_gc); + + //Write byte to EEPROM + *(uint8_t *) address = data; + + //Clear the current command + ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_NONE_gc); +} + +bool EEPROM_IsBusy(void) +{ + return (NVMCTRL.STATUS & NVMCTRL_EEBUSY_bm); +} diff --git a/enc28j60-avr-udp.X/mcc_generated_files/spi/spi0.h b/enc28j60-avr-udp.X/mcc_generated_files/spi/spi0.h new file mode 100644 index 0000000..af1d102 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/spi/spi0.h @@ -0,0 +1,223 @@ +/** + * SPI0 Generated Driver API Header File + * + * @file spi0.h + * + * @defgroup spi0 SPI0 + * + * @brief Contains the API prototypes for the SPI0 driver. + * + * @version SPI0 Driver Version 2.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef SPI0_BASIC_H_INCLUDED +#define SPI0_BASIC_H_INCLUDED + +#include "../system/utils/compiler.h" +#include +#include "spi_interface.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern const struct SPI_INTERFACE SPI0_s; + +/** + * @ingroup spi0 + * @typedef void *spi0_TRANSFER_DONE_CB + * @brief Function pointer to the callback function called when there is an SPI interrupt. The default value is set to NULL which means that no callback function will be used. + */ +typedef void (*spi0_TRANSFER_DONE_CB)(void); + +/** + * @ingroup spi0 + * @typedef struct SPI0_configuration_t + * @brief Hardware configuration that controls SPI mode and baud rate + */ +typedef struct +{ + uint8_t CTRLAvalue; + uint8_t CTRLBvalue; +} SPI0_configuration_t; + +/** + * @ingroup spi0 + * @typedef enum spi0_transfer_type_t + * @brief Specifies whether the SPI transfer is to be uni- or bidirectional. A bidirectional transfer (=SPI_EXCHANGE) causes the received data to overwrite the buffer with the data to transmit. + */ +typedef enum spi0_transfer_type +{ + SPI0_EXCHANGE, ///< SPI transfer is bidirectional + SPI0_READ, ///< SPI transfer reads, writes only 0s + SPI0_WRITE ///< SPI transfer writes, discards read data +} spi0_transfer_type_t; + +/** + * @ingroup spi0 + * @typedef enum spi0_transfer_status_t + * @brief Status of the SPI hardware and SPI bus. + */ +typedef enum spi0_transfer_status +{ + SPI0_FREE, ///< SPI hardware is not open, bus is free. + SPI0_IDLE, ///< SPI hardware has been opened, no transfer ongoing. + SPI0_BUSY, ///< SPI hardware has been opened, transfer ongoing. + SPI0_DONE ///< SPI hardware has been opened, transfer complete. +} spi0_transfer_status_t; + +/** + * @ingroup spi0 + * @typedef enum SPI0_configuration_name_t + * @brief Enumeration of the different configurations supported by the driver for SPI interface. + * + * NOTE: A user may specify a configuration, e.g. CLIENT_A, used when communication over SPI with CLIENT_A, and another configuration, CLIENT_B, + * used when communication with CLIENT_B. The configurations may use different SPI configuration such as polarity or SCK frequency. + */ +typedef enum +{ + MAC, + SPI0_DEFAULT +} SPI0_configuration_name_t; + + /** + * @ingroup spi0 + * @brief Initializes the SPI module. + * @param None. + * @return None. + */ +void SPI0_Initialize(void); + +/** + * @ingroup spi0 + * @brief Enables the SPI module. + * @param None. + * @return None. + */ +void SPI0_Enable(void); + +/** + * @ingroup spi0 + * @brief Disables the SPI module. + * @param None. + * @return None. + */ +void SPI0_Disable(void); + +/** + * @ingroup spi0 + * @brief Sets the index of Configuration to use in the transfer. + * @param uint8_t spiConfigIndex - Configuration index. See SPI0_configuration_name_t for configuration list. + * @retval True - SPI open was successful. + * @retval False - SPI open was not successful. + */ +bool SPI0_Open(uint8_t spiConfigIndex); + +/** + * @ingroup spi0 + * @brief Closes the SPI for communication. + * @param None. + * @return None. + */ +void SPI0_Close(void); + +/** + * @ingroup spi0 + * @brief Exchanges one byte over SPI. Blocks until done. + * @param uint8_t byteData - The byte to transfer. + * @return uint8_t - Received data byte. + */ +uint8_t SPI0_ByteExchange(uint8_t byteData); + +/** + * @ingroup spi0 + * @brief Exchanges a buffer over SPI. Blocks if using polled driver. + * @param[inout] void * bufferData The buffer to transfer. Received data is returned here. + * @param[in] size_t bufferSize The size of buffer to transfer. + * @return None. + */ +void SPI0_BufferExchange(void * bufferData, size_t bufferSize); + +/** + * @ingroup spi0 + * @brief Writes a buffer over SPI. Blocks if using polled driver. + * @param[in] void * bufferData The buffer to transfer. + * @param[in] size_t bufferSize The size of buffer to transfer. + * @return None. + */ +void SPI0_BufferWrite(void * bufferData, size_t bufferSize); + +/** + * @ingroup spi0 + * @brief Reads a buffer over SPI. Blocks if using polled driver. + * @param[out] void * bufferData Received data is written here. + * @param[in] size_t bufferSize The size of buffer to transfer. + * @return None. + */ +void SPI0_BufferRead(void * bufferData, size_t bufferSize); + +/** + * @ingroup spi0 + * @brief Writes a data byte to SPI. + * @param uint8_t byteData The byte to transfer. + * @return None. + */ +void SPI0_ByteWrite(uint8_t byteData); + +/** + * @ingroup spi0 + * @brief Gets the received data byte from SPI. + * @param None. + * @return uint8_t - The received data byte. + */ +uint8_t SPI0_ByteRead(void); + +/** + * @ingroup spi0 + * @brief Checks if SPI CLIENT is selected, i.e. its SS pin has been asserted. + * @param None. + * @retval True - SPI is selected. + * @retval False - SPI is not selected. + */ +bool SPI0_Selected(void); + +/** + * @ingroup spi0 + * @brief Waits until SPI has received a data byte. + * @param None. + * @return None. + */ +void SPI0_WaitDataready(void); + +uint8_t __attribute__((deprecated)) SPI0_ExchangeByte(uint8_t data); +void __attribute__((deprecated)) SPI0_ExchangeBlock(void *block, size_t blockSize); +void __attribute__((deprecated)) SPI0_WriteBlock(void *block, size_t blockSize); +void __attribute__((deprecated)) SPI0_ReadBlock(void *block, size_t blockSize); +void __attribute__((deprecated)) SPI0_WriteByte(uint8_t byte); +uint8_t __attribute__((deprecated)) SPI0_ReadByte(void); + +#ifdef __cplusplus +} +#endif + +#endif /* SPI0_BASIC_H_INCLUDED */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/spi/spi_interface.h b/enc28j60-avr-udp.X/mcc_generated_files/spi/spi_interface.h new file mode 100644 index 0000000..ff64abe --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/spi/spi_interface.h @@ -0,0 +1,86 @@ +/** + SPI Generated Driver API interface File + + @Company + Microchip Technology Inc. + + @File Name + spi_interface.h + + @Summary + This is the generated driver interface file for the SPI driver. + + @Description + This interface file provides APIs for driver for SPI. + The generated drivers are tested against the following: + Compiler : XC8 v2.20 + MPLAB : MPLABX v5.40 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef SPI_INTERFACE_H +#define SPI_INTERFACE_H + +/** + Section: Included Files +*/ +#include +#include +#include + +#ifdef __cplusplus + + extern "C" { + +#endif + +/** + Section: Data Type Definitions +*/ + +/** + SPI Driver function structure. + + @Summary + Structure containing the function pointers of SPI driver. + */ +struct SPI_INTERFACE +{ + void (*Initialize)(void); + void (*Close)(void); + bool (*Open)(uint8_t spiConfigIndex); + void (*BufferExchange)(void *bufferData, size_t bufferSize); + void (*BufferRead)(void *bufferData, size_t bufferSize); + void (*BufferWrite)(void *bufferData, size_t bufferSize); + uint8_t (*ByteExchange)(uint8_t byteData); + uint8_t (*ByteRead)(void); + void (*ByteWrite)(uint8_t byteData); +}; + +#ifdef __cplusplus + + } + +#endif + +#endif //SPI_INTERFACE_H diff --git a/enc28j60-avr-udp.X/mcc_generated_files/spi/src/spi0.c b/enc28j60-avr-udp.X/mcc_generated_files/spi/src/spi0.c new file mode 100644 index 0000000..e495c3c --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/spi/src/spi0.c @@ -0,0 +1,208 @@ +/** + * SPI0 Generated Driver File + * + * @file spi0.c + * + * @ingroup spi0 + * + * @brief Contains the API Implementations for SPI0 module. + * + * @version SPI0 Driver Version 2.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "../spi0.h" + +typedef struct spi0_descriptor_s +{ + spi0_transfer_status_t status; +} spi0_descriptor_t; + +/** + SPI0_DRIVER_FUNCTION object + + @brief Defines an object for SPI_DRIVER_FUNCTIONS. + */ +const struct SPI_INTERFACE SPI0_s = +{ + .Initialize = SPI0_Initialize, + .Close = SPI0_Close, + .Open = SPI0_Open, + .BufferExchange = SPI0_BufferExchange, + .BufferRead = SPI0_BufferRead, + .BufferWrite = SPI0_BufferWrite, + .ByteExchange = SPI0_ByteExchange, + .ByteRead = SPI0_ByteRead, + .ByteWrite = SPI0_ByteWrite, +}; + +SPI0_configuration_t spi0_configurations[] = +{ + { 0x21, 0x0 }, + { 0x20, 0x0 } +}; + +static spi0_descriptor_t spi0_desc; + +void SPI0_Initialize(void) +{ + //BUFEN disabled; BUFWR disabled; MODE 0; SSD disabled; + SPI0.CTRLB = 0x0; + + //CLK2X disabled; DORD disabled; ENABLE disabled; MASTER enabled; PRESC DIV4; + SPI0.CTRLA = 0x20; + + //DREIE disabled; IE disabled; RXCIE disabled; SSIE disabled; TXCIE disabled; + SPI0.INTCTRL = 0x0; + + spi0_desc.status = SPI0_FREE; + + //BUFOVF disabled; DREIF disabled; RXCIF disabled; SSIF disabled; TXCIF disabled; IF disabled; WRCOL disabled; + SPI0.INTFLAGS = 0x0; +} + +void SPI0_Enable(void) +{ + SPI0.CTRLA |= SPI_ENABLE_bm; +} + +void SPI0_Disable(void) +{ + SPI0.CTRLA &= ~SPI_ENABLE_bm; +} + +bool SPI0_Open(uint8_t spiConfigIndex) +{ + if (spi0_desc.status == SPI0_FREE) { + spi0_desc.status = SPI0_IDLE; + SPI0.CTRLB = spi0_configurations[spiConfigIndex].CTRLBvalue; + SPI0.CTRLA = spi0_configurations[spiConfigIndex].CTRLAvalue; + return true; + } else { + return false; + } +} + +void SPI0_Close(void) +{ + spi0_desc.status = SPI0_FREE; +} + +uint8_t SPI0_ByteExchange(uint8_t data) +{ + SPI0.DATA = data; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)); + return SPI0.DATA; +} + +bool SPI0_Selected(void) +{ +/** + * @brief Returns true if SS pin is selected. + * TODO: Place your code here + */ +return true; +} + +void SPI0_WaitDataready(void) +{ + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) + ; +} + +void SPI0_BufferExchange(void *block, size_t size) +{ + uint8_t *b = (uint8_t *)block; + while (size--) { + SPI0.DATA = *b; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) + ; + *b = SPI0.DATA; + b++; + } +} + +void SPI0_BufferWrite(void *block, size_t size) +{ + uint8_t *b = (uint8_t *)block; + uint8_t rdata; + while (size--) { + SPI0.DATA = *b; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) + ; + rdata = SPI0.DATA; + (void)(rdata); // Silence compiler warning + b++; + } +} + +void SPI0_BufferRead(void *block, size_t size) +{ + uint8_t *b = (uint8_t *)block; + while (size--) { + SPI0.DATA = 0; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) + ; + *b = SPI0.DATA; + b++; + } +} + +void SPI0_ByteWrite(uint8_t data) +{ + SPI0.DATA = data; +} + +uint8_t SPI0_ByteRead(void) +{ + return SPI0.DATA; +} + +uint8_t SPI0_ExchangeByte(uint8_t data) +{ + return SPI0_ByteExchange(data); +} + +void SPI0_ExchangeBlock(void *block, size_t blockSize) +{ + SPI0_BufferExchange(block, blockSize); +} + +void SPI0_WriteBlock(void *block, size_t blockSize) +{ + SPI0_BufferWrite(block, blockSize); +} + +void SPI0_ReadBlock(void *block, size_t blockSize) +{ + SPI0_BufferRead(block, blockSize); +} + +void SPI0_WriteByte(uint8_t byte) +{ + SPI0_ByteWrite(byte); +} + +uint8_t SPI0_ReadByte(void) +{ + return SPI0_ByteRead(); +} diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/ccp.h b/enc28j60-avr-udp.X/mcc_generated_files/system/ccp.h new file mode 100644 index 0000000..9045036 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/ccp.h @@ -0,0 +1,72 @@ +/** + * CCP Header File + * + * @file ccp.h + * + * @ingroup config_bitsdriver + * + * @brief This file contains the Configuration Change Protection (CCP) header file for the Configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef CPU_CCP_H +#define CPU_CCP_H + +#include "../system/utils/compiler.h" +#include "../system/protected_io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Writes to a CCP-protected 8-bit I/O register. + * @param addr Address of the I/O register. + * @param value Value to be written. + * NOTE: Using IAR Embedded workbench, the choice of memory model has an impact on calling convention. + * Memory model must be defined in the Assembler preprocessor directives to be visible to the preprocessor. + */ +static inline void ccp_write_io(void *addr, uint8_t value) +{ + protected_write_io(addr, CCP_IOREG_gc, value); +} + +/** + * @brief Writes to a CCP-protected 8-bit SPM register. + * @param addr Address of the SPM register. + * @param value Value to be written. + * NOTE: Using IAR Embedded workbench, the choice of memory model has an impacton calling convention. + * Memory model must be defined in the Assembler preprocessor directives to be visible to the preprocessor. + */ +static inline void ccp_write_spm(void *addr, uint8_t value) +{ + protected_write_io(addr, CCP_SPM_gc, value); +} + +#ifdef __cplusplus +} +#endif + +#endif /* CPU_CCP_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/clock.h b/enc28j60-avr-udp.X/mcc_generated_files/system/clock.h new file mode 100644 index 0000000..a970d5b --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/clock.h @@ -0,0 +1,69 @@ +/** + * CLKCTRL Generated Driver API Header File + * + * @file clkctrl.h + * + * @defgroup clkctrl CLKCTRL + * + * @brief This header file provides APIs for the CLKCTRL driver. + * + * @version CLKCTRL Driver Version 1.0.2 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef CLOCK_H +#define CLOCK_H + +#ifndef F_CPU +#define F_CPU 4000000UL +#endif + +#include "ccp.h" + +#define CLKCTRL_TIMEBASE_VALUE ((uint8_t)ceil(F_CPU * 0.000001)) + +/** + * @ingroup clkctrl + * @brief Initialize CLKCTRL module + * @param none + * @return none + */ +void CLOCK_Initialize(void); + +/** + * @ingroup clkctrl + * @brief Enable Clock Failure Detection on main clock + * @param CLKCTRL_CFDSRC_t cfd_source - main clock source for CFD + * @return none + */ +void CFD_Enable(CLKCTRL_CFDSRC_t cfd_source); + +/** + * @ingroup clkctrl + * @brief Disable Clock Failure Detection on main clock + * @param none + * @return none + */ +void CFD_Disable(); + +#endif // CLOCK_H \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/config_bits.h b/enc28j60-avr-udp.X/mcc_generated_files/system/config_bits.h new file mode 100644 index 0000000..cd14867 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/config_bits.h @@ -0,0 +1,42 @@ +/** + * CONFIGURATION BITS Generated Driver Header File + * + * @file config_bits.h + * + * @defgroup config_bitsdriver Configuration Bits Driver + * + * @brief This file contains the generated header file for the Configuration bits driver. + * + * @version Driver Version 1.0.4 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef CONFIG_BITS_H +#define CONFIG_BITS_H + +#include "../system/clock.h" + +#endif //CONFIG_BITS_H +/** + End of File +*/ \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/interrupt.h b/enc28j60-avr-udp.X/mcc_generated_files/system/interrupt.h new file mode 100644 index 0000000..2dc2f85 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/interrupt.h @@ -0,0 +1,57 @@ +/** + * Interrupt Manager Generated Driver API Header File. + * + * @file interrupt.h + * + * @defgroup interrupt INTERRUPT + * + * @brief This file contains the API prototype for the Interrupt Manager. + * + * @version Interrupt Manager Driver Version 1.0.0 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef INTERRUPT_H +#define INTERRUPT_H + +#include "../system/utils/compiler.h" +#include "ccp.h" +#include "../system/utils/atomic.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup interrupt + * @brief Initializes the Interrupt module. + * @retval 0 - Initialization is successful. + */ +int8_t CPUINT_Initialize(); + +#ifdef __cplusplus +} +#endif + +#endif /* INTERRUPT_H */ \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/pins.h b/enc28j60-avr-udp.X/mcc_generated_files/system/pins.h new file mode 100644 index 0000000..e919da2 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/pins.h @@ -0,0 +1,288 @@ +/** + * Generated Pins header File + * + * @file pins.h + * + * @defgroup pinsdriver Pins Driver + * + * @brief This is generated driver header for pins. + * This header file provides APIs for all pins selected in the GUI. + * + * @version Driver Version 1.1.0 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef PINS_H_INCLUDED +#define PINS_H_INCLUDED + +#include +#include "./port.h" + +//get/set ETH_CS aliases +#define ETH_CS_SetHigh() do { PORTA_OUTSET = 0x80; } while(0) +#define ETH_CS_SetLow() do { PORTA_OUTCLR = 0x80; } while(0) +#define ETH_CS_Toggle() do { PORTA_OUTTGL = 0x80; } while(0) +#define ETH_CS_GetValue() (VPORTA.IN & (0x1 << 7)) +#define ETH_CS_SetDigitalInput() do { PORTA_DIRCLR = 0x80; } while(0) +#define ETH_CS_SetDigitalOutput() do { PORTA_DIRSET = 0x80; } while(0) +#define ETH_CS_SetPullUp() do { PORTA_PIN7CTRL |= PORT_PULLUPEN_bm; } while(0) +#define ETH_CS_ResetPullUp() do { PORTA_PIN7CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define ETH_CS_SetInverted() do { PORTA_PIN7CTRL |= PORT_INVEN_bm; } while(0) +#define ETH_CS_ResetInverted() do { PORTA_PIN7CTRL &= ~PORT_INVEN_bm; } while(0) +#define ETH_CS_DisableInterruptOnChange() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define ETH_CS_EnableInterruptForBothEdges() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define ETH_CS_EnableInterruptForRisingEdge() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define ETH_CS_EnableInterruptForFallingEdge() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define ETH_CS_DisableDigitalInputBuffer() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define ETH_CS_EnableInterruptForLowLevelSensing() do { PORTA.PIN7CTRL = (PORTA.PIN7CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PA7_SetInterruptHandler ETH_CS_SetInterruptHandler + +//get/set IO_PA5 aliases +#define IO_PA5_SetHigh() do { PORTA_OUTSET = 0x20; } while(0) +#define IO_PA5_SetLow() do { PORTA_OUTCLR = 0x20; } while(0) +#define IO_PA5_Toggle() do { PORTA_OUTTGL = 0x20; } while(0) +#define IO_PA5_GetValue() (VPORTA.IN & (0x1 << 5)) +#define IO_PA5_SetDigitalInput() do { PORTA_DIRCLR = 0x20; } while(0) +#define IO_PA5_SetDigitalOutput() do { PORTA_DIRSET = 0x20; } while(0) +#define IO_PA5_SetPullUp() do { PORTA_PIN5CTRL |= PORT_PULLUPEN_bm; } while(0) +#define IO_PA5_ResetPullUp() do { PORTA_PIN5CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define IO_PA5_SetInverted() do { PORTA_PIN5CTRL |= PORT_INVEN_bm; } while(0) +#define IO_PA5_ResetInverted() do { PORTA_PIN5CTRL &= ~PORT_INVEN_bm; } while(0) +#define IO_PA5_DisableInterruptOnChange() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define IO_PA5_EnableInterruptForBothEdges() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define IO_PA5_EnableInterruptForRisingEdge() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define IO_PA5_EnableInterruptForFallingEdge() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define IO_PA5_DisableDigitalInputBuffer() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define IO_PA5_EnableInterruptForLowLevelSensing() do { PORTA.PIN5CTRL = (PORTA.PIN5CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PA5_SetInterruptHandler IO_PA5_SetInterruptHandler + +//get/set IO_PA4 aliases +#define IO_PA4_SetHigh() do { PORTA_OUTSET = 0x10; } while(0) +#define IO_PA4_SetLow() do { PORTA_OUTCLR = 0x10; } while(0) +#define IO_PA4_Toggle() do { PORTA_OUTTGL = 0x10; } while(0) +#define IO_PA4_GetValue() (VPORTA.IN & (0x1 << 4)) +#define IO_PA4_SetDigitalInput() do { PORTA_DIRCLR = 0x10; } while(0) +#define IO_PA4_SetDigitalOutput() do { PORTA_DIRSET = 0x10; } while(0) +#define IO_PA4_SetPullUp() do { PORTA_PIN4CTRL |= PORT_PULLUPEN_bm; } while(0) +#define IO_PA4_ResetPullUp() do { PORTA_PIN4CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define IO_PA4_SetInverted() do { PORTA_PIN4CTRL |= PORT_INVEN_bm; } while(0) +#define IO_PA4_ResetInverted() do { PORTA_PIN4CTRL &= ~PORT_INVEN_bm; } while(0) +#define IO_PA4_DisableInterruptOnChange() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define IO_PA4_EnableInterruptForBothEdges() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define IO_PA4_EnableInterruptForRisingEdge() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define IO_PA4_EnableInterruptForFallingEdge() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define IO_PA4_DisableDigitalInputBuffer() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define IO_PA4_EnableInterruptForLowLevelSensing() do { PORTA.PIN4CTRL = (PORTA.PIN4CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PA4_SetInterruptHandler IO_PA4_SetInterruptHandler + +//get/set IO_PA6 aliases +#define IO_PA6_SetHigh() do { PORTA_OUTSET = 0x40; } while(0) +#define IO_PA6_SetLow() do { PORTA_OUTCLR = 0x40; } while(0) +#define IO_PA6_Toggle() do { PORTA_OUTTGL = 0x40; } while(0) +#define IO_PA6_GetValue() (VPORTA.IN & (0x1 << 6)) +#define IO_PA6_SetDigitalInput() do { PORTA_DIRCLR = 0x40; } while(0) +#define IO_PA6_SetDigitalOutput() do { PORTA_DIRSET = 0x40; } while(0) +#define IO_PA6_SetPullUp() do { PORTA_PIN6CTRL |= PORT_PULLUPEN_bm; } while(0) +#define IO_PA6_ResetPullUp() do { PORTA_PIN6CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define IO_PA6_SetInverted() do { PORTA_PIN6CTRL |= PORT_INVEN_bm; } while(0) +#define IO_PA6_ResetInverted() do { PORTA_PIN6CTRL &= ~PORT_INVEN_bm; } while(0) +#define IO_PA6_DisableInterruptOnChange() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define IO_PA6_EnableInterruptForBothEdges() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define IO_PA6_EnableInterruptForRisingEdge() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define IO_PA6_EnableInterruptForFallingEdge() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define IO_PA6_DisableDigitalInputBuffer() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define IO_PA6_EnableInterruptForLowLevelSensing() do { PORTA.PIN6CTRL = (PORTA.PIN6CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PA6_SetInterruptHandler IO_PA6_SetInterruptHandler + +//get/set SW0 aliases +#define SW0_SetHigh() do { PORTF_OUTSET = 0x40; } while(0) +#define SW0_SetLow() do { PORTF_OUTCLR = 0x40; } while(0) +#define SW0_Toggle() do { PORTF_OUTTGL = 0x40; } while(0) +#define SW0_GetValue() (VPORTF.IN & (0x1 << 6)) +#define SW0_SetDigitalInput() do { PORTF_DIRCLR = 0x40; } while(0) +#define SW0_SetDigitalOutput() do { PORTF_DIRSET = 0x40; } while(0) +#define SW0_SetPullUp() do { PORTF_PIN6CTRL |= PORT_PULLUPEN_bm; } while(0) +#define SW0_ResetPullUp() do { PORTF_PIN6CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define SW0_SetInverted() do { PORTF_PIN6CTRL |= PORT_INVEN_bm; } while(0) +#define SW0_ResetInverted() do { PORTF_PIN6CTRL &= ~PORT_INVEN_bm; } while(0) +#define SW0_DisableInterruptOnChange() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define SW0_EnableInterruptForBothEdges() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define SW0_EnableInterruptForRisingEdge() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define SW0_EnableInterruptForFallingEdge() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define SW0_DisableDigitalInputBuffer() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define SW0_EnableInterruptForLowLevelSensing() do { PORTF.PIN6CTRL = (PORTF.PIN6CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PF6_SetInterruptHandler SW0_SetInterruptHandler + +//get/set LED0 aliases +#define LED0_SetHigh() do { PORTF_OUTSET = 0x20; } while(0) +#define LED0_SetLow() do { PORTF_OUTCLR = 0x20; } while(0) +#define LED0_Toggle() do { PORTF_OUTTGL = 0x20; } while(0) +#define LED0_GetValue() (VPORTF.IN & (0x1 << 5)) +#define LED0_SetDigitalInput() do { PORTF_DIRCLR = 0x20; } while(0) +#define LED0_SetDigitalOutput() do { PORTF_DIRSET = 0x20; } while(0) +#define LED0_SetPullUp() do { PORTF_PIN5CTRL |= PORT_PULLUPEN_bm; } while(0) +#define LED0_ResetPullUp() do { PORTF_PIN5CTRL &= ~PORT_PULLUPEN_bm; } while(0) +#define LED0_SetInverted() do { PORTF_PIN5CTRL |= PORT_INVEN_bm; } while(0) +#define LED0_ResetInverted() do { PORTF_PIN5CTRL &= ~PORT_INVEN_bm; } while(0) +#define LED0_DisableInterruptOnChange() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x0 ; } while(0) +#define LED0_EnableInterruptForBothEdges() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x1 ; } while(0) +#define LED0_EnableInterruptForRisingEdge() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x2 ; } while(0) +#define LED0_EnableInterruptForFallingEdge() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x3 ; } while(0) +#define LED0_DisableDigitalInputBuffer() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x4 ; } while(0) +#define LED0_EnableInterruptForLowLevelSensing() do { PORTF.PIN5CTRL = (PORTF.PIN5CTRL & ~PORT_ISC_gm) | 0x5 ; } while(0) +#define PF5_SetInterruptHandler LED0_SetInterruptHandler + +/** + * @ingroup pinsdriver + * @brief GPIO and peripheral I/O initialization + * @param none + * @return none + */ +void PIN_MANAGER_Initialize(); + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for ETH_CS pin. + * This is a predefined interrupt handler to be used together with the ETH_CS_SetInterruptHandler() method. + * This handler is called every time the ETH_CS ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void ETH_CS_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for ETH_CS pin input-sense-config functionality. + * Allows selecting an interrupt handler for ETH_CS at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void ETH_CS_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for IO_PA5 pin. + * This is a predefined interrupt handler to be used together with the IO_PA5_SetInterruptHandler() method. + * This handler is called every time the IO_PA5 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void IO_PA5_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for IO_PA5 pin input-sense-config functionality. + * Allows selecting an interrupt handler for IO_PA5 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void IO_PA5_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for IO_PA4 pin. + * This is a predefined interrupt handler to be used together with the IO_PA4_SetInterruptHandler() method. + * This handler is called every time the IO_PA4 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void IO_PA4_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for IO_PA4 pin input-sense-config functionality. + * Allows selecting an interrupt handler for IO_PA4 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void IO_PA4_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for IO_PA6 pin. + * This is a predefined interrupt handler to be used together with the IO_PA6_SetInterruptHandler() method. + * This handler is called every time the IO_PA6 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void IO_PA6_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for IO_PA6 pin input-sense-config functionality. + * Allows selecting an interrupt handler for IO_PA6 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void IO_PA6_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for SW0 pin. + * This is a predefined interrupt handler to be used together with the SW0_SetInterruptHandler() method. + * This handler is called every time the SW0 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void SW0_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for SW0 pin input-sense-config functionality. + * Allows selecting an interrupt handler for SW0 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void SW0_SetInterruptHandler(void (* interruptHandler)(void)) ; + +/** + * @ingroup pinsdriver + * @brief Default Interrupt Handler for LED0 pin. + * This is a predefined interrupt handler to be used together with the LED0_SetInterruptHandler() method. + * This handler is called every time the LED0 ISR is executed. + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param none + * @return none + */ +void LED0_DefaultInterruptHandler(void); + +/** + * @ingroup pinsdriver + * @brief Interrupt Handler Setter for LED0 pin input-sense-config functionality. + * Allows selecting an interrupt handler for LED0 at application runtime + * @pre PIN_MANAGER_Initialize() has been called at least once + * @param InterruptHandler function pointer. + * @return none + */ +void LED0_SetInterruptHandler(void (* interruptHandler)(void)) ; +#endif /* PINS_H_INCLUDED */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/port.h b/enc28j60-avr-udp.X/mcc_generated_files/system/port.h new file mode 100644 index 0000000..7525afb --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/port.h @@ -0,0 +1,902 @@ +/** + * Generated Ports header File + * + * @file port.h + * + * @ingroup pinsdriver + * + * @brief This Source file provides APIs. + * + * @version Driver Version 1.0.1 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef PORT_INCLUDED +#define PORT_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +#include "utils/compiler.h" + +/* @ingroup pinsdriver + * @enum port_pull_mode + * Defines the pullup modes. + */ +enum port_pull_mode { + PORT_PULL_OFF, + PORT_PULL_UP, +}; + +/* @ingroup pinsdriver + * @enum port_dir + * Defines the port directions. + */ +enum port_dir { + PORT_DIR_IN, + PORT_DIR_OUT, + PORT_DIR_OFF, +}; + +/** + * @ingroup pinsdriver + * @brief Set port pin pull mode, Configure pin to pull up, down or disable pull mode, supported pull modes are defined by device used. + * @param pin The pin number within port + * @param pull_mode Pin pull mode + * @return none + */ +static inline void PORTA_set_pin_pull_mode(const uint8_t pin, const enum port_pull_mode pull_mode) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTA + 0x10 + pin); + + if (pull_mode == PORT_PULL_UP) { + *port_pin_ctrl |= PORT_PULLUPEN_bm; + } else if (pull_mode == PORT_PULL_OFF) { + *port_pin_ctrl &= ~PORT_PULLUPEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin inverted mode, Configure pin invert I/O or not. + * @param pin The pin number within port + * @param inverted Pin inverted mode + * @return none + */ +static inline void PORTA_pin_set_inverted(const uint8_t pin, const bool inverted) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTA + 0x10 + pin); + + if (inverted) { + *port_pin_ctrl |= PORT_INVEN_bm; + } else { + *port_pin_ctrl &= ~PORT_INVEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin input/sense configuration, Enable/disable digital input buffer and pin change interrupt, + * select pin interrupt edge/level sensing mode + * @param The pin number within port + * @param isc PORT_ISC_t + * @return none + */ +static inline void PORTA_pin_set_isc(const uint8_t pin, const PORT_ISC_t isc) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTA + 0x10 + pin); + + *port_pin_ctrl = (*port_pin_ctrl & ~PORT_ISC_gm) | isc; +} + +/** + * @ingroup pinsdriver + * @brief Set port data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param mask Bit mask where 1 means apply direction setting to the + * corresponding pin + * @param dir port_dir + * @return none + */ +static inline void PORTA_set_port_dir(const uint8_t mask, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTA.DIR &= ~mask; + break; + case PORT_DIR_OUT: + VPORTA.DIR |= mask; + break; + case PORT_DIR_OFF: + /*/ should activate the pullup for power saving + but a bit costly to do it here */ + { + for (uint8_t i = 0; i < 8; i++) { + if (mask & 1 << i) { + *((uint8_t *)&PORTA + 0x10 + i) |= 1 << PORT_PULLUPEN_bp; + } + } + } + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param pin The pin number within port + * @param dir port_dir + * @return none + */ +static inline void PORTA_set_pin_dir(const uint8_t pin, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTA.DIR &= ~(1 << pin); + break; + case PORT_DIR_OUT: + VPORTA.DIR |= (1 << pin); + break; + case PORT_DIR_OFF: + *((uint8_t *)&PORTA + 0x10 + pin) |= 1 << PORT_PULLUPEN_bp; + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on the pins defined by the bit mask. + * + * @param mask Bit mask where 1 means apply port level to the corresponding + * pin + * @param level -boolean value that defines the logic state of the pin level + * false = Pin levels set to "low" state + * @return none + */ +static inline void PORTA_set_port_level(const uint8_t mask, const bool level) +{ + if (level == true) { + VPORTA.OUT |= mask; + } else { + VPORTA.OUT &= ~mask; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on a pin. + * + * @param pin The pin number within port + * @param level -boolean value that defines the logic state of the pin level + * @return none + */ +static inline void PORTA_set_pin_level(const uint8_t pin, const bool level) +{ + if (level == true) { + VPORTA.OUT |= (1 << pin); + } else { + VPORTA.OUT &= ~(1 << pin); + } +} + +/** + * @ingroup pinsdriver + * @brief Toggle out level on pins, Toggle the pin levels on pins defined by bit mask. + * + * @param mask Bit mask where 1 means toggle pin level to the corresponding + * pin + * @return none + */ +static inline void PORTA_toggle_port_level(const uint8_t mask) +{ + PORTA.OUTTGL = mask; +} + +/** + * @ingroup pinsdriver + * @brief Toggle output level on pin, Toggle the pin levels on pins defined by bit mask. + * + * @param pin The pin number within port + * @return none + */ +static inline void PORTA_toggle_pin_level(const uint8_t pin) +{ + PORTA.OUTTGL = 1 << pin; +} + +/** + * @ingroup pinsdriver + * @brief Get input level on pins, Read the input level on pins connected to a port. + * + * @param none + * @return none + */ +static inline uint8_t PORTA_get_port_level() +{ + return VPORTA.IN; +} + +/** + * @ingroup pinsdriver + * @brief Get level on pin, Reads the level on pins connected to a port. + * + * @param pin The pin number within port + * @return none + */ +static inline bool PORTA_get_pin_level(const uint8_t pin) +{ + return VPORTA.IN & (1 << pin); +} + +/** + * @ingroup pinsdriver + * @brief Write value to Port, Write directly to the port OUT register. + * + * @param value Value to write to the port register + * @return none + */ +static inline void PORTA_write_port(const uint8_t value) +{ + VPORTA.OUT = value; +} + +/** + * @ingroup pinsdriver + * @brief Set port pin pull mode, Configure pin to pull up, down or disable pull mode, supported pull modes are defined by device used. + * @param pin The pin number within port + * @param pull_mode Pin pull mode + * @return none + */ +static inline void PORTC_set_pin_pull_mode(const uint8_t pin, const enum port_pull_mode pull_mode) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTC + 0x10 + pin); + + if (pull_mode == PORT_PULL_UP) { + *port_pin_ctrl |= PORT_PULLUPEN_bm; + } else if (pull_mode == PORT_PULL_OFF) { + *port_pin_ctrl &= ~PORT_PULLUPEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin inverted mode, Configure pin invert I/O or not. + * @param pin The pin number within port + * @param inverted Pin inverted mode + * @return none + */ +static inline void PORTC_pin_set_inverted(const uint8_t pin, const bool inverted) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTC + 0x10 + pin); + + if (inverted) { + *port_pin_ctrl |= PORT_INVEN_bm; + } else { + *port_pin_ctrl &= ~PORT_INVEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin input/sense configuration, Enable/disable digital input buffer and pin change interrupt, + * select pin interrupt edge/level sensing mode + * @param The pin number within port + * @param isc PORT_ISC_t + * @return none + */ +static inline void PORTC_pin_set_isc(const uint8_t pin, const PORT_ISC_t isc) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTC + 0x10 + pin); + + *port_pin_ctrl = (*port_pin_ctrl & ~PORT_ISC_gm) | isc; +} + +/** + * @ingroup pinsdriver + * @brief Set port data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param mask Bit mask where 1 means apply direction setting to the + * corresponding pin + * @param dir port_dir + * @return none + */ +static inline void PORTC_set_port_dir(const uint8_t mask, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTC.DIR &= ~mask; + break; + case PORT_DIR_OUT: + VPORTC.DIR |= mask; + break; + case PORT_DIR_OFF: + /*/ should activate the pullup for power saving + but a bit costly to do it here */ + { + for (uint8_t i = 0; i < 8; i++) { + if (mask & 1 << i) { + *((uint8_t *)&PORTC + 0x10 + i) |= 1 << PORT_PULLUPEN_bp; + } + } + } + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param pin The pin number within port + * @param dir port_dir + * @return none + */ +static inline void PORTC_set_pin_dir(const uint8_t pin, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTC.DIR &= ~(1 << pin); + break; + case PORT_DIR_OUT: + VPORTC.DIR |= (1 << pin); + break; + case PORT_DIR_OFF: + *((uint8_t *)&PORTC + 0x10 + pin) |= 1 << PORT_PULLUPEN_bp; + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on the pins defined by the bit mask. + * + * @param mask Bit mask where 1 means apply port level to the corresponding + * pin + * @param level -boolean value that defines the logic state of the pin level + * false = Pin levels set to "low" state + * @return none + */ +static inline void PORTC_set_port_level(const uint8_t mask, const bool level) +{ + if (level == true) { + VPORTC.OUT |= mask; + } else { + VPORTC.OUT &= ~mask; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on a pin. + * + * @param pin The pin number within port + * @param level -boolean value that defines the logic state of the pin level + * @return none + */ +static inline void PORTC_set_pin_level(const uint8_t pin, const bool level) +{ + if (level == true) { + VPORTC.OUT |= (1 << pin); + } else { + VPORTC.OUT &= ~(1 << pin); + } +} + +/** + * @ingroup pinsdriver + * @brief Toggle out level on pins, Toggle the pin levels on pins defined by bit mask. + * + * @param mask Bit mask where 1 means toggle pin level to the corresponding + * pin + * @return none + */ +static inline void PORTC_toggle_port_level(const uint8_t mask) +{ + PORTC.OUTTGL = mask; +} + +/** + * @ingroup pinsdriver + * @brief Toggle output level on pin, Toggle the pin levels on pins defined by bit mask. + * + * @param pin The pin number within port + * @return none + */ +static inline void PORTC_toggle_pin_level(const uint8_t pin) +{ + PORTC.OUTTGL = 1 << pin; +} + +/** + * @ingroup pinsdriver + * @brief Get input level on pins, Read the input level on pins connected to a port. + * + * @param none + * @return none + */ +static inline uint8_t PORTC_get_port_level() +{ + return VPORTC.IN; +} + +/** + * @ingroup pinsdriver + * @brief Get level on pin, Reads the level on pins connected to a port. + * + * @param pin The pin number within port + * @return none + */ +static inline bool PORTC_get_pin_level(const uint8_t pin) +{ + return VPORTC.IN & (1 << pin); +} + +/** + * @ingroup pinsdriver + * @brief Write value to Port, Write directly to the port OUT register. + * + * @param value Value to write to the port register + * @return none + */ +static inline void PORTC_write_port(const uint8_t value) +{ + VPORTC.OUT = value; +} + +/** + * @ingroup pinsdriver + * @brief Set port pin pull mode, Configure pin to pull up, down or disable pull mode, supported pull modes are defined by device used. + * @param pin The pin number within port + * @param pull_mode Pin pull mode + * @return none + */ +static inline void PORTD_set_pin_pull_mode(const uint8_t pin, const enum port_pull_mode pull_mode) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTD + 0x10 + pin); + + if (pull_mode == PORT_PULL_UP) { + *port_pin_ctrl |= PORT_PULLUPEN_bm; + } else if (pull_mode == PORT_PULL_OFF) { + *port_pin_ctrl &= ~PORT_PULLUPEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin inverted mode, Configure pin invert I/O or not. + * @param pin The pin number within port + * @param inverted Pin inverted mode + * @return none + */ +static inline void PORTD_pin_set_inverted(const uint8_t pin, const bool inverted) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTD + 0x10 + pin); + + if (inverted) { + *port_pin_ctrl |= PORT_INVEN_bm; + } else { + *port_pin_ctrl &= ~PORT_INVEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin input/sense configuration, Enable/disable digital input buffer and pin change interrupt, + * select pin interrupt edge/level sensing mode + * @param The pin number within port + * @param isc PORT_ISC_t + * @return none + */ +static inline void PORTD_pin_set_isc(const uint8_t pin, const PORT_ISC_t isc) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTD + 0x10 + pin); + + *port_pin_ctrl = (*port_pin_ctrl & ~PORT_ISC_gm) | isc; +} + +/** + * @ingroup pinsdriver + * @brief Set port data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param mask Bit mask where 1 means apply direction setting to the + * corresponding pin + * @param dir port_dir + * @return none + */ +static inline void PORTD_set_port_dir(const uint8_t mask, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTD.DIR &= ~mask; + break; + case PORT_DIR_OUT: + VPORTD.DIR |= mask; + break; + case PORT_DIR_OFF: + /*/ should activate the pullup for power saving + but a bit costly to do it here */ + { + for (uint8_t i = 0; i < 8; i++) { + if (mask & 1 << i) { + *((uint8_t *)&PORTD + 0x10 + i) |= 1 << PORT_PULLUPEN_bp; + } + } + } + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param pin The pin number within port + * @param dir port_dir + * @return none + */ +static inline void PORTD_set_pin_dir(const uint8_t pin, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTD.DIR &= ~(1 << pin); + break; + case PORT_DIR_OUT: + VPORTD.DIR |= (1 << pin); + break; + case PORT_DIR_OFF: + *((uint8_t *)&PORTD + 0x10 + pin) |= 1 << PORT_PULLUPEN_bp; + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on the pins defined by the bit mask. + * + * @param mask Bit mask where 1 means apply port level to the corresponding + * pin + * @param level -boolean value that defines the logic state of the pin level + * false = Pin levels set to "low" state + * @return none + */ +static inline void PORTD_set_port_level(const uint8_t mask, const bool level) +{ + if (level == true) { + VPORTD.OUT |= mask; + } else { + VPORTD.OUT &= ~mask; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on a pin. + * + * @param pin The pin number within port + * @param level -boolean value that defines the logic state of the pin level + * @return none + */ +static inline void PORTD_set_pin_level(const uint8_t pin, const bool level) +{ + if (level == true) { + VPORTD.OUT |= (1 << pin); + } else { + VPORTD.OUT &= ~(1 << pin); + } +} + +/** + * @ingroup pinsdriver + * @brief Toggle out level on pins, Toggle the pin levels on pins defined by bit mask. + * + * @param mask Bit mask where 1 means toggle pin level to the corresponding + * pin + * @return none + */ +static inline void PORTD_toggle_port_level(const uint8_t mask) +{ + PORTD.OUTTGL = mask; +} + +/** + * @ingroup pinsdriver + * @brief Toggle output level on pin, Toggle the pin levels on pins defined by bit mask. + * + * @param pin The pin number within port + * @return none + */ +static inline void PORTD_toggle_pin_level(const uint8_t pin) +{ + PORTD.OUTTGL = 1 << pin; +} + +/** + * @ingroup pinsdriver + * @brief Get input level on pins, Read the input level on pins connected to a port. + * + * @param none + * @return none + */ +static inline uint8_t PORTD_get_port_level() +{ + return VPORTD.IN; +} + +/** + * @ingroup pinsdriver + * @brief Get level on pin, Reads the level on pins connected to a port. + * + * @param pin The pin number within port + * @return none + */ +static inline bool PORTD_get_pin_level(const uint8_t pin) +{ + return VPORTD.IN & (1 << pin); +} + +/** + * @ingroup pinsdriver + * @brief Write value to Port, Write directly to the port OUT register. + * + * @param value Value to write to the port register + * @return none + */ +static inline void PORTD_write_port(const uint8_t value) +{ + VPORTD.OUT = value; +} + +/** + * @ingroup pinsdriver + * @brief Set port pin pull mode, Configure pin to pull up, down or disable pull mode, supported pull modes are defined by device used. + * @param pin The pin number within port + * @param pull_mode Pin pull mode + * @return none + */ +static inline void PORTF_set_pin_pull_mode(const uint8_t pin, const enum port_pull_mode pull_mode) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTF + 0x10 + pin); + + if (pull_mode == PORT_PULL_UP) { + *port_pin_ctrl |= PORT_PULLUPEN_bm; + } else if (pull_mode == PORT_PULL_OFF) { + *port_pin_ctrl &= ~PORT_PULLUPEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin inverted mode, Configure pin invert I/O or not. + * @param pin The pin number within port + * @param inverted Pin inverted mode + * @return none + */ +static inline void PORTF_pin_set_inverted(const uint8_t pin, const bool inverted) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTF + 0x10 + pin); + + if (inverted) { + *port_pin_ctrl |= PORT_INVEN_bm; + } else { + *port_pin_ctrl &= ~PORT_INVEN_bm; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin input/sense configuration, Enable/disable digital input buffer and pin change interrupt, + * select pin interrupt edge/level sensing mode + * @param The pin number within port + * @param isc PORT_ISC_t + * @return none + */ +static inline void PORTF_pin_set_isc(const uint8_t pin, const PORT_ISC_t isc) +{ + volatile uint8_t *port_pin_ctrl = ((uint8_t *)&PORTF + 0x10 + pin); + + *port_pin_ctrl = (*port_pin_ctrl & ~PORT_ISC_gm) | isc; +} + +/** + * @ingroup pinsdriver + * @brief Set port data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param mask Bit mask where 1 means apply direction setting to the + * corresponding pin + * @param dir port_dir + * @return none + */ +static inline void PORTF_set_port_dir(const uint8_t mask, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTF.DIR &= ~mask; + break; + case PORT_DIR_OUT: + VPORTF.DIR |= mask; + break; + case PORT_DIR_OFF: + /*/ should activate the pullup for power saving + but a bit costly to do it here */ + { + for (uint8_t i = 0; i < 8; i++) { + if (mask & 1 << i) { + *((uint8_t *)&PORTF + 0x10 + i) |= 1 << PORT_PULLUPEN_bp; + } + } + } + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port pin data direction, Select if the pin data direction is input, output or disabled. + * If disabled state is not possible, this function throws an assert. + * + * @param pin The pin number within port + * @param dir port_dir + * @return none + */ +static inline void PORTF_set_pin_dir(const uint8_t pin, const enum port_dir dir) +{ + switch (dir) { + case PORT_DIR_IN: + VPORTF.DIR &= ~(1 << pin); + break; + case PORT_DIR_OUT: + VPORTF.DIR |= (1 << pin); + break; + case PORT_DIR_OFF: + *((uint8_t *)&PORTF + 0x10 + pin) |= 1 << PORT_PULLUPEN_bp; + break; + default: + break; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on the pins defined by the bit mask. + * + * @param mask Bit mask where 1 means apply port level to the corresponding + * pin + * @param level -boolean value that defines the logic state of the pin level + * false = Pin levels set to "low" state + * @return none + */ +static inline void PORTF_set_port_level(const uint8_t mask, const bool level) +{ + if (level == true) { + VPORTF.OUT |= mask; + } else { + VPORTF.OUT &= ~mask; + } +} + +/** + * @ingroup pinsdriver + * @brief Set port level, Sets output level on a pin. + * + * @param pin The pin number within port + * @param level -boolean value that defines the logic state of the pin level + * @return none + */ +static inline void PORTF_set_pin_level(const uint8_t pin, const bool level) +{ + if (level == true) { + VPORTF.OUT |= (1 << pin); + } else { + VPORTF.OUT &= ~(1 << pin); + } +} + +/** + * @ingroup pinsdriver + * @brief Toggle out level on pins, Toggle the pin levels on pins defined by bit mask. + * + * @param mask Bit mask where 1 means toggle pin level to the corresponding + * pin + * @return none + */ +static inline void PORTF_toggle_port_level(const uint8_t mask) +{ + PORTF.OUTTGL = mask; +} + +/** + * @ingroup pinsdriver + * @brief Toggle output level on pin, Toggle the pin levels on pins defined by bit mask. + * + * @param pin The pin number within port + * @return none + */ +static inline void PORTF_toggle_pin_level(const uint8_t pin) +{ + PORTF.OUTTGL = 1 << pin; +} + +/** + * @ingroup pinsdriver + * @brief Get input level on pins, Read the input level on pins connected to a port. + * + * @param none + * @return none + */ +static inline uint8_t PORTF_get_port_level() +{ + return VPORTF.IN; +} + +/** + * @ingroup pinsdriver + * @brief Get level on pin, Reads the level on pins connected to a port. + * + * @param pin The pin number within port + * @return none + */ +static inline bool PORTF_get_pin_level(const uint8_t pin) +{ + return VPORTF.IN & (1 << pin); +} + +/** + * @ingroup pinsdriver + * @brief Write value to Port, Write directly to the port OUT register. + * + * @param value Value to write to the port register + * @return none + */ +static inline void PORTF_write_port(const uint8_t value) +{ + VPORTF.OUT = value; +} +#ifdef __cplusplus +} +#endif + +#endif /* PORT_INCLUDED */ \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/protected_io.h b/enc28j60-avr-udp.X/mcc_generated_files/system/protected_io.h new file mode 100644 index 0000000..586576b --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/protected_io.h @@ -0,0 +1,80 @@ +/** + * protected_io Header File + * + * @file protected_io.h + * + * @defgroup doc_driver_system_protected_io Protected IO + * + * @brief This file contains the generated prtected_io header file for the CONFIGURATION BITS. + * + * @version Driver Version 1.0.0 + * + *@{ +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef PROTECTED_IO_H +#define PROTECTED_IO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__DOXYGEN__) +//! \name IAR Memory Model defines. +//@{ + +/** + * @def CONFIG_MEMORY_MODEL_TINY + * @brief Configuration symbol to enable 8 bit pointers. + */ +#define CONFIG_MEMORY_MODEL_TINY + +/** + * @def CONFIG_MEMORY_MODEL_SMALL + * @brief Configuration symbol to enable 16 bit pointers. + * NOTE: If no memory model is defined, SMALL is default. + */ +#define CONFIG_MEMORY_MODEL_SMALL + +/** + * @def CONFIG_MEMORY_MODEL_LARGE + * @brief Configuration symbol to enable 24 bit pointers. + */ +#define CONFIG_MEMORY_MODEL_LARGE + +//@} +#endif + +/** + * @brief Writes to an 8-bit I/O register protected by CCP or a protection bit. + * @param addr Address of the I/O register. + * @param magic CCP magic value or Mask for protection bit. + * @param value Value to be written. + * NOTE: Using IAR Embedded workbench, the choice of memory model has an impact on calling convention. + * Memory model must be defined in the Assembler preprocessor directives to be visible to the preprocessor. + */ +extern void protected_write_io(void *addr, uint8_t magic, uint8_t value); + +/** @} */ + +#endif /* PROTECTED_IO_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/src/clock.c b/enc28j60-avr-udp.X/mcc_generated_files/system/src/clock.c new file mode 100644 index 0000000..63ef8c4 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/src/clock.c @@ -0,0 +1,99 @@ +/** + * CLKCTRL Generated Driver File + * + * @file clkctrl.c + * + * @ingroup clkctrl + * + * @brief This file contains the driver code for CLKCTRL module. + * + * version CLKCTRL Driver Version 1.1.3 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#include "../clock.h" + +void CLOCK_Initialize(void) +{ + // Set the CLKCTRL module to the options selected in the user interface. + + //CLKOUT disabled; CLKSEL Internal high-frequency oscillator; + ccp_write_io((void*)&(CLKCTRL.MCLKCTRLA),0x0); + + //PDIV 2X; PEN disabled; + ccp_write_io((void*)&(CLKCTRL.MCLKCTRLB),0x0); + + //EXTS disabled; OSC32KS disabled; OSCHFS disabled; PLLS disabled; SOSC disabled; XOSC32KS disabled; + ccp_write_io((void*)&(CLKCTRL.MCLKSTATUS),0x0); + + //RUNSTDBY disabled; + ccp_write_io((void*)&(CLKCTRL.OSC32KCTRLA),0x0); + + //AUTOTUNE disabled; FRQSEL 4 MHz system clock (default); RUNSTDBY disabled; + ccp_write_io((void*)&(CLKCTRL.OSCHFCTRLA),0xC); + + //TUNE 0x0; + ccp_write_io((void*)&(CLKCTRL.OSCHFTUNE),0x0); + + //MULFAC PLL is disabled; RUNSTDBY disabled; SOURCE OSCHF; + ccp_write_io((void*)&(CLKCTRL.PLLCTRLA),0x0); + + //CSUT 1k cycles; ENABLE disabled; LPMODE disabled; RUNSTDBY disabled; SEL disabled; + ccp_write_io((void*)&(CLKCTRL.XOSC32KCTRLA),0x0); + + //CFDEN disabled; CFDSRC CLKMAIN; CFDTST disabled; + ccp_write_io((void*)&(CLKCTRL.MCLKCTRLC),0x0); + + //CFD disabled; INTTYPE INT; + ccp_write_io((void*)&(CLKCTRL.MCLKINTCTRL),0x0); + + //CFD disabled; + ccp_write_io((void*)&(CLKCTRL.MCLKINTFLAGS),0x0); + + //CSUTHF 256; ENABLE disabled; FRQRANGE 8M; RUNSTBY disabled; SELHF XTAL; + ccp_write_io((void*)&(CLKCTRL.XOSCHFCTRLA),0x0); + + + // System clock stability check by polling the status register. + while(!(CLKCTRL.MCLKSTATUS & CLKCTRL_OSCHFS_bm)); + + + // System clock stability check by polling the PLL status. +} + +void CFD_Enable(CLKCTRL_CFDSRC_t cfd_source) +{ + /* Enable Clock Failure Detection on main clock */ + ccp_write_io((uint8_t *) & CLKCTRL.MCLKCTRLC, cfd_source | CLKCTRL_CFDEN_bm); +} + +void CFD_Disable() +{ + /* Disable Clock Failure Detection on main clock */ + ccp_write_io((uint8_t *) & CLKCTRL.MCLKCTRLC, CLKCTRL.MCLKCTRLC & ~CLKCTRL_CFDEN_bm); +} + + +/** + End of File +*/ \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/src/config_bits.c b/enc28j60-avr-udp.X/mcc_generated_files/system/src/config_bits.c new file mode 100644 index 0000000..1b621ca --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/src/config_bits.c @@ -0,0 +1,47 @@ +/** + * CONFIGURATION BITS Generated Driver Source File + * + * @file config_bits.c + * + * @ingroup config_bitsdriver + * + * @brief This file contains the generated Device Configuration Bits file. + * + * @version Driver Version 1.0.4 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include + +/** + * Configures the Fuse bits. + */ +FUSES = +{ + .BODCFG = ACTIVE_DISABLE_gc | LVL_BODLEVEL0_gc | SAMPFREQ_128Hz_gc | SLEEP_DISABLE_gc, + .BOOTSIZE = 0x0, + .CODESIZE = 0x0, + .OSCCFG = CLKSEL_OSCHF_gc, + .SYSCFG0 = CRCSEL_CRC16_gc | CRCSRC_NOCRC_gc | RSTPINCFG_GPIO_gc | UPDIPINCFG_UPDI_gc, + .SYSCFG1 = MVSYSCFG_DUAL_gc | SUT_0MS_gc, + .WDTCFG = PERIOD_OFF_gc | WINDOW_OFF_gc, +}; diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/src/interrupt.c b/enc28j60-avr-udp.X/mcc_generated_files/system/src/interrupt.c new file mode 100644 index 0000000..6d9cbc3 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/src/interrupt.c @@ -0,0 +1,53 @@ +/** + * Interrupt Manager Generated Driver File. + * + * @file interrupt.c + * + * @ingroup interrupt + * + * @brief This file contains the API implementation for the Interrupt Manager. + * + * @version Interrupt Manager Driver Version 1.0.0 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#include "../interrupt.h" + +int8_t CPUINT_Initialize() +{ + /* IVSEL and CVT are Configuration Change Protected */ + + //CVT disabled; IVSEL disabled; LVL0RR disabled; + ccp_write_io((void*)&(CPUINT.CTRLA),0x0); + + //LVL0PRI 0; + CPUINT.LVL0PRI = 0x0; + + //LVL1VEC 0; + CPUINT.LVL1VEC = 0x0; + + ENABLE_INTERRUPTS(); + + return 0; +} \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/src/pins.c b/enc28j60-avr-udp.X/mcc_generated_files/system/src/pins.c new file mode 100644 index 0000000..b9bb6b1 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/src/pins.c @@ -0,0 +1,243 @@ +/** + * Generated Driver File + * + * @file pins.c + * + * @ingroup pinsdriver + * + * @brief This is generated driver implementation for pins. + * This file provides implementations for pin APIs for all pins selected in the GUI. + * + * @version Driver Version 1.1.0 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "../pins.h" + +static void (*ETH_CS_InterruptHandler)(void); +static void (*IO_PA5_InterruptHandler)(void); +static void (*IO_PA4_InterruptHandler)(void); +static void (*IO_PA6_InterruptHandler)(void); +static void (*SW0_InterruptHandler)(void); +static void (*LED0_InterruptHandler)(void); + +void PIN_MANAGER_Initialize() +{ + /* DIR Registers Initialization */ + PORTA.DIR = 0xD0; + PORTC.DIR = 0x0; + PORTD.DIR = 0x0; + PORTF.DIR = 0x20; + + /* OUT Registers Initialization */ + PORTA.OUT = 0x0; + PORTC.OUT = 0x0; + PORTD.OUT = 0x0; + PORTF.OUT = 0x20; + + /* PINxCTRL registers Initialization */ + PORTA.PIN0CTRL = 0x0; + PORTA.PIN1CTRL = 0x0; + PORTA.PIN2CTRL = 0x0; + PORTA.PIN3CTRL = 0x0; + PORTA.PIN4CTRL = 0x0; + PORTA.PIN5CTRL = 0x0; + PORTA.PIN6CTRL = 0x0; + PORTA.PIN7CTRL = 0x8; + PORTC.PIN0CTRL = 0x0; + PORTC.PIN1CTRL = 0x0; + PORTC.PIN2CTRL = 0x0; + PORTC.PIN3CTRL = 0x0; + PORTC.PIN4CTRL = 0x0; + PORTC.PIN5CTRL = 0x0; + PORTC.PIN6CTRL = 0x0; + PORTC.PIN7CTRL = 0x0; + PORTD.PIN0CTRL = 0x0; + PORTD.PIN1CTRL = 0x0; + PORTD.PIN2CTRL = 0x0; + PORTD.PIN3CTRL = 0x0; + PORTD.PIN4CTRL = 0x0; + PORTD.PIN5CTRL = 0x0; + PORTD.PIN6CTRL = 0x0; + PORTD.PIN7CTRL = 0x0; + PORTF.PIN0CTRL = 0x0; + PORTF.PIN1CTRL = 0x0; + PORTF.PIN2CTRL = 0x0; + PORTF.PIN3CTRL = 0x0; + PORTF.PIN4CTRL = 0x0; + PORTF.PIN5CTRL = 0x80; + PORTF.PIN6CTRL = 0x0; + PORTF.PIN7CTRL = 0x0; + + /* EVGENCTRL registers Initialization */ + + /* PORTMUX Initialization */ + PORTMUX.CCLROUTEA = 0x0; + PORTMUX.EVSYSROUTEA = 0x0; + PORTMUX.SPIROUTEA = 0x0; + PORTMUX.TCAROUTEA = 0x0; + PORTMUX.TCBROUTEA = 0x0; + PORTMUX.TCDROUTEA = 0x0; + PORTMUX.TWIROUTEA = 0x0; + PORTMUX.USARTROUTEA = 0x0; + + // register default ISC callback functions at runtime; use these methods to register a custom function + ETH_CS_SetInterruptHandler(ETH_CS_DefaultInterruptHandler); + IO_PA5_SetInterruptHandler(IO_PA5_DefaultInterruptHandler); + IO_PA4_SetInterruptHandler(IO_PA4_DefaultInterruptHandler); + IO_PA6_SetInterruptHandler(IO_PA6_DefaultInterruptHandler); + SW0_SetInterruptHandler(SW0_DefaultInterruptHandler); + LED0_SetInterruptHandler(LED0_DefaultInterruptHandler); +} + +/** + Allows selecting an interrupt handler for ETH_CS at application runtime +*/ +void ETH_CS_SetInterruptHandler(void (* interruptHandler)(void)) +{ + ETH_CS_InterruptHandler = interruptHandler; +} + +void ETH_CS_DefaultInterruptHandler(void) +{ + // add your ETH_CS interrupt custom code + // or set custom function using ETH_CS_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for IO_PA5 at application runtime +*/ +void IO_PA5_SetInterruptHandler(void (* interruptHandler)(void)) +{ + IO_PA5_InterruptHandler = interruptHandler; +} + +void IO_PA5_DefaultInterruptHandler(void) +{ + // add your IO_PA5 interrupt custom code + // or set custom function using IO_PA5_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for IO_PA4 at application runtime +*/ +void IO_PA4_SetInterruptHandler(void (* interruptHandler)(void)) +{ + IO_PA4_InterruptHandler = interruptHandler; +} + +void IO_PA4_DefaultInterruptHandler(void) +{ + // add your IO_PA4 interrupt custom code + // or set custom function using IO_PA4_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for IO_PA6 at application runtime +*/ +void IO_PA6_SetInterruptHandler(void (* interruptHandler)(void)) +{ + IO_PA6_InterruptHandler = interruptHandler; +} + +void IO_PA6_DefaultInterruptHandler(void) +{ + // add your IO_PA6 interrupt custom code + // or set custom function using IO_PA6_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for SW0 at application runtime +*/ +void SW0_SetInterruptHandler(void (* interruptHandler)(void)) +{ + SW0_InterruptHandler = interruptHandler; +} + +void SW0_DefaultInterruptHandler(void) +{ + // add your SW0 interrupt custom code + // or set custom function using SW0_SetInterruptHandler() +} +/** + Allows selecting an interrupt handler for LED0 at application runtime +*/ +void LED0_SetInterruptHandler(void (* interruptHandler)(void)) +{ + LED0_InterruptHandler = interruptHandler; +} + +void LED0_DefaultInterruptHandler(void) +{ + // add your LED0 interrupt custom code + // or set custom function using LED0_SetInterruptHandler() +} +ISR(PORTA_PORT_vect) +{ + // Call the interrupt handler for the callback registered at runtime + if(VPORTA.INTFLAGS & PORT_INT7_bm) + { + ETH_CS_InterruptHandler(); + } + if(VPORTA.INTFLAGS & PORT_INT5_bm) + { + IO_PA5_InterruptHandler(); + } + if(VPORTA.INTFLAGS & PORT_INT4_bm) + { + IO_PA4_InterruptHandler(); + } + if(VPORTA.INTFLAGS & PORT_INT6_bm) + { + IO_PA6_InterruptHandler(); + } + /* Clear interrupt flags */ + VPORTA.INTFLAGS = 0xff; +} + +ISR(PORTC_PORT_vect) +{ + /* Clear interrupt flags */ + VPORTC.INTFLAGS = 0xff; +} + +ISR(PORTD_PORT_vect) +{ + /* Clear interrupt flags */ + VPORTD.INTFLAGS = 0xff; +} + +ISR(PORTF_PORT_vect) +{ + // Call the interrupt handler for the callback registered at runtime + if(VPORTF.INTFLAGS & PORT_INT6_bm) + { + SW0_InterruptHandler(); + } + if(VPORTF.INTFLAGS & PORT_INT5_bm) + { + LED0_InterruptHandler(); + } + /* Clear interrupt flags */ + VPORTF.INTFLAGS = 0xff; +} + +/** + End of File +*/ \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/src/protected_io.S b/enc28j60-avr-udp.X/mcc_generated_files/system/src/protected_io.S new file mode 100644 index 0000000..fa51ec8 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/src/protected_io.S @@ -0,0 +1,90 @@ +/** + * protected_io Source Code File + * + * @file protected_io.S + * + * @ingroup config_bitsdriver + * + * @brief This file contains the generated protected_io source code file for the CONFIGURATION BITS. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#include "../utils/assembler.h" + +/* + * GNU and IAR use different calling conventions. Since this is + * a very small and simple function to begin with, it's easier + * to implement it twice than to deal with the differences + * within a single implementation. + */ + + PUBLIC_FUNCTION(protected_write_io) + +#if defined(__GNUC__) + +#ifdef RAMPZ + out _SFR_IO_ADDR(RAMPZ), r1 // Clear bits 23:16 of Z +#endif + movw r30, r24 // Load addr into Z + out CCP, r22 // Start CCP handshake + st Z, r20 // Write value to I/O register + ret // Return to caller + +#elif defined(__IAR_SYSTEMS_ASM__) + +# if !defined(CONFIG_MEMORY_MODEL_TINY) && !defined(CONFIG_MEMORY_MODEL_SMALL) \ + && !defined(CONFIG_MEMORY_MODEL_LARGE) +# define CONFIG_MEMORY_MODEL_SMALL +# endif +# if defined(CONFIG_MEMORY_MODEL_LARGE) + ldi r20, 0 + out RAMPZ, r20 // Reset bits 23:16 of Z + movw r30, r16 // Load addr into Z +# elif defined(CONFIG_MEMORY_MODEL_TINY) + ldi r31, 0 // Reset bits 8:15 of Z + mov r30, r16 // Load addr into Z +# else + movw r30, r16 // Load addr into Z +# endif +# if defined(CONFIG_MEMORY_MODEL_TINY) + out CCP, r17 // Start CCP handshake + st Z, r18 // Write value to I/O register +# elif defined(CONFIG_MEMORY_MODEL_SMALL) + out CCP, r18 // Start CCP handshake + st Z, r19 // Write value to I/O register +# elif defined(CONFIG_MEMORY_MODEL_LARGE) + out CCP, r19 // Start CCP handshake + st Z, r20 // Write value to I/O register +# else +# error Unknown memory model in use, no idea how registers should be accessed +# endif + ret +#else +# error Unknown assembler +#endif + + END_FUNC(protected_write_io) + END_FILE() + diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/src/system.c b/enc28j60-avr-udp.X/mcc_generated_files/system/src/system.c new file mode 100644 index 0000000..add9819 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/src/system.c @@ -0,0 +1,44 @@ +/** + * System Driver Source File + * + * @file system.c + * + * @ingroup systemdriver + * + * @brief This file contains the API implementation for the System driver. + * + * @version Driver Version 1.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "../system.h" + + +void SYSTEM_Initialize(void) +{ + CLOCK_Initialize(); + PIN_MANAGER_Initialize(); + SPI0_Initialize(); + TCA0_Initialize(); + CPUINT_Initialize(); +} + diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/system.h b/enc28j60-avr-udp.X/mcc_generated_files/system/system.h new file mode 100644 index 0000000..5cdf606 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/system.h @@ -0,0 +1,62 @@ +/** + * System Driver Header File + * + * @file system.h + * + * @defgroup systemdriver System Driver + * + * @brief This file contains the API prototypes for the System driver. + * + * @version Driver Version 1.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef MCC_H +#define MCC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../system/utils/compiler.h" +#include "config_bits.h" +#include "../system/clock.h" +#include "../system/pins.h" +#include "../spi/spi0.h" +#include "../timer/tca0.h" +#include "../system/interrupt.h" +/** + * @ingroup systemdriver + * @brief Initializes the system module. This routine must be called only once during the system initialization and before any other routine is called. + * @param None. + * @return None. +*/ +void SYSTEM_Initialize(void); + +#ifdef __cplusplus +} +#endif +#endif /* MCC_H */ +/** + End of File +*/ \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/utils/assembler.h b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/assembler.h new file mode 100644 index 0000000..2ce5066 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/assembler.h @@ -0,0 +1,49 @@ +/** + * Assembler Header File + * + * @file assembler.h + * + * @ingroup config_bitsdriver + * + * @brief This file contains the assembler header file for the configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef ASSEMBLER_H_INCLUDED +#define ASSEMBLER_H_INCLUDED + +#if !defined(__ASSEMBLER__) && !defined(__IAR_SYSTEMS_ASM__) && !defined(__DOXYGEN__) +#error This file may only be included from assembly files +#endif + +#if defined(__ASSEMBLER__) +#include "assembler/gas.h" +#include +#elif defined(__IAR_SYSTEMS_ASM__) +#include "assembler/iar.h" +#include +#endif + +#endif /* ASSEMBLER_H_INCLUDED */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/utils/assembler/gas.h b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/assembler/gas.h new file mode 100644 index 0000000..fc78ad7 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/assembler/gas.h @@ -0,0 +1,120 @@ +/** + * GAS Header File + * + * @file gas.h + * + * @ingroup config_bitsdriver + * + * @brief This file contains the generated GAS header file for the Configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef ASSEMBLER_GAS_H_INCLUDED +#define ASSEMBLER_GAS_H_INCLUDED + +#ifndef __DOXYGEN__ + +/* clang-format off */ + + /* IAR doesn't accept dots in macro names */ + .macro ld_addr, reg, sym + lda.w \reg, \sym + .endm + + /* Define a function \a name that is either globally visible or only + * file-local. + */ + .macro gas_begin_func name, is_public + .if \is_public + .global \name + .endif + #ifdef __XC8 + .section .text.\name, code + #else + .section .text.\name, "ax", @progbits + #endif + .type \name, @function + \name : + .endm + + /* Define a function \a name that is either globally visible or only + * file-local in a given segment. + */ + .macro gas_begin_func_segm name, is_public, segment + .if \is_public + .global \name + .endif + .section .\segment, "ax", @progbits + .type \name, @function + \name : + .endm + + /* Define \a name as a weak alias for the function \a strong_name */ + .macro gas_weak_function_alias name, strong_name + .global \name + .weak \name + .type \name, @function + .set \name, \strong_name + .endm + + /* Define a weak function called \a name */ + .macro gas_weak_function name + .weak \name + gas_begin_func \name 1 + .endm + +#define REPEAT(count) .rept count +#define END_REPEAT() .endr +#define FILL_BYTES(count) .fill count +#define SET_LOC(offset) .org offset +#define L(name) .L##name +#define EXTERN_SYMBOL(name) + +#define TEXT_SECTION(name) \ + .section name, "ax", @progbits +#define RODATA_SECTION(name) \ + .section name, "a", @progbits +#define DATA_SECTION(name) \ + .section name, "aw", @progbits +#define BSS_SECTION(name) \ + .section name, "aw", @nobits + +#define FUNCTION(name) gas_begin_func name 0 +#define PUBLIC_FUNCTION(name) gas_begin_func name 1 +#define PUBLIC_FUNCTION_SEGMENT(name, segment) \ + gas_begin_func_segm name 1 segment +#define WEAK_FUNCTION(name) gas_weak_function name +#define WEAK_FUNCTION_ALIAS(name, strong_name) \ + gas_weak_function_alias name strong_name +#define END_FUNC(name) \ + .size name, . - name + +#define END_FILE() + +/* clang-format on */ + +#endif /* __DOXYGEN__ */ + +#endif /* ASSEMBLER_GAS_H_INCLUDED */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/utils/assembler/iar.h b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/assembler/iar.h new file mode 100644 index 0000000..d4ba634 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/assembler/iar.h @@ -0,0 +1,104 @@ +/** + * IAR Header File + * + * @file iar.h + * + * @ingroup config_bitsdriver + * + * @brief This file contains the generated IAR header file for the Configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef ASSEMBLER_IAR_H_INCLUDED +#define ASSEMBLER_IAR_H_INCLUDED + +/* clang-format off */ + +ld_addr MACRO reg, sym + mov reg, LWRD sym + orh reg, HWRD sym + ENDM + +call MACRO sym + rcall sym + ENDM + +iar_begin_func MACRO name, sect, is_public, is_weak + MODULE name + RSEG CODE:CODE:NOROOT(1) + IF is_weak == 1 + PUBWEAK name + ELSEIF is_public + PUBLIC name + ENDIF +name: + ENDM + +iar_begin_func_segm MACRO name, sect, is_public, is_weak, segment + MODULE name + RSEG segment:CODE:NOROOT(1) + IF is_weak == 1 + PUBWEAK name + ELSEIF is_public + PUBLIC name + ENDIF +name: + ENDM + +iar_weak_alias MACRO name, strong_name + PUBWEAK name +name: + rjmp strong_name + ENDM + +#define lo(x) LWRD x +#define hi(x) HWRD x + +#define REPEAT(count) REPT count +#define END_REPEAT() ENDR +#define SET_LOC(offset) ORG offset +#define END_FILE() END + +#define FILL_BYTES(count) DS8 count + +#define L(name) name +#define EXTERN_SYMBOL(name) EXTERN name +#define FUNCTION(name) iar_begin_func name, text_##name, 0, 0 +#define PUBLIC_FUNCTION(name) iar_begin_func name, text_##name, 1, 0 +#define PUBLIC_FUNCTION_SEGMENT(name, segment) \ + iar_begin_func_segm name, text_##name, 1, 0, segment +#define WEAK_FUNCTION(name) iar_begin_func name, text_##name, 1, 1 +#define WEAK_FUNCTION_ALIAS(name, strong_name) \ + iar_weak_alias name, strong_name +#define END_FUNC(name) ENDMOD + +#define TEXT_SECTION(name) RSEG name:CODE:NOROOT +#define RODATA_SECTION(name) RSEG name:CONST:NOROOT +#define DATA_SECTION(name) RSEG name:DATA:NOROOT +#define BSS_SECTION(name) RSEG name:DATA:NOROOT + +/* clang-format on */ + +#endif /* ASSEMBLER_IAR_H_INCLUDED */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/utils/atomic.h b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/atomic.h new file mode 100644 index 0000000..c298b95 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/atomic.h @@ -0,0 +1,87 @@ +/** + * CONFIGURATION BITS Generated Atomic Header File + * + * @file atomic.h + * + * @defgroup doc_driver_utils_atomic Atomic memory access and critical sections + * + * @brief This file contains the atomic memory access and critical sections header file for the configuration bits driver. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef ATOMIC_H +#define ATOMIC_H + +/* clang-format off */ + +#if defined(__GNUC__) || defined (__DOXYGEN__) + +/** + * @brief Enters critical region. Saves the contents of the status register, including the Global Interrupt Enable bit, so that it can be restored upon leaving the critical region. + * Thereafter, clears the Global Interrupt Enable Bit.This macro takes a parameter P that is unused for the GCC compiler,but necessary for code compatibility with the IAR compiler. + * The IAR compiler declares a variable with the name of the parameter forholding the SREG value. + * Compilation will fail when the variable declared in the macro is not unique within the scope that the critical region is declared within. + * @param[in] UNUSED(GCC)/P(IAR) Name of variable storing SREG. + */ + +#define ENTER_CRITICAL(UNUSED) __asm__ __volatile__ ( \ + "in __tmp_reg__, __SREG__" "\n\t" \ + "cli" "\n\t" \ + "push __tmp_reg__" "\n\t" \ + ::: "memory" \ + ) + +/** + * @brief Exits a critical region. Restores the contents of the status register, including the Global Interrupt Enable bit, as it was when entering the critical region. + * This macro takes a parameter P that is unused for the GCC compiler, but necessary for code compatibility with the IAR compiler. + * The IAR compiler uses this parameter as the name of a variable that holds the SREG value. + * The parameter must be identical to the parameter used in the corresponding ENTER_CRITICAL(). + * @param[in] UNUSED(GCC)/P(IAR) Name of variable storing SREG + */ + +#define EXIT_CRITICAL(UNUSED) __asm__ __volatile__ ( \ + "pop __tmp_reg__" "\n\t" \ + "out __SREG__, __tmp_reg__" "\n\t" \ + ::: "memory" \ + ) + +#define DISABLE_INTERRUPTS() __asm__ __volatile__ ( "cli" ::: "memory") +#define ENABLE_INTERRUPTS() __asm__ __volatile__ ( "sei" ::: "memory") + +#elif defined(__ICCAVR__) + +#define ENTER_CRITICAL(P) unsigned char P = __save_interrupt();__disable_interrupt(); +#define EXIT_CRITICAL(P) __restore_interrupt(P); + +#define DISABLE_INTERRUPTS() __disable_interrupt(); +#define ENABLE_INTERRUPTS() __enable_interrupt(); + +#else +# error Unsupported compiler. +#endif + +/* clang-format on */ + +#endif /* ATOMIC_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/utils/compiler.h b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/compiler.h new file mode 100644 index 0000000..fba02a0 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/compiler.h @@ -0,0 +1,72 @@ +/** + * Compiler Header File + * + * @file compiler.h + * + * @defgroup doc_driver_utils_compiler Compiler abstraction + * + * @brief This file contains the compiler abstraction layer and code utilities for 8-bit AVR. This module provides various abstraction layers and utilities to make code compatible between different compilers. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef UTILS_COMPILER_H +#define UTILS_COMPILER_H + +#if defined(__GNUC__) +#include +#include +#if defined(__XC8__) +#include +#endif +#elif defined(__ICCAVR__) +#define ENABLE_BIT_DEFINITIONS 1 +#include +#include + +#ifndef CCP_IOREG_gc +#define CCP_IOREG_gc 0xD8 /* CPU_CCP_IOREG_gc */ +#endif +#ifndef CCP_SPM_gc +#define CCP_SPM_gc 0x9D /* CPU_CCP_SPM_gc */ +#endif + +#else +#error Unsupported compiler. +#endif + +#include +#include +#include +#include + +#include "interrupt_avr8.h" + +/** + * @def UNUSED + * @brief Marking \a v as a unused parameter or value. + */ +#define UNUSED(v) (void)(v) + +#endif /* UTILS_COMPILER_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/utils/interrupt_avr8.h b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/interrupt_avr8.h new file mode 100644 index 0000000..83b3c62 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/interrupt_avr8.h @@ -0,0 +1,88 @@ +/** + * interrupt_avr8 Header File + * + * @file interrupt_avr8.h + * + * @defgroup doc_driver_utils_interrupts ISR abstraction + * + * @brief Interrupt-related functionality. + * + * @version Driver Version 1.0.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef UTILS_INTERRUPT_AVR8_H +#define UTILS_INTERRUPT_AVR8_H + +/** + * \weakgroup interrupt_group + * + * @{ + */ + +#ifdef ISR_CUSTOM_H +#include ISR_CUSTOM_H +#else + +/** + * @def ISR + * @brief Define service routine for specified interrupt vector. + * @code + ISR(FOO_vect) + { + ... + } + * @endcode + * + * @param vect Interrupt vector name as found in the device header files. + */ +#if defined(__DOXYGEN__) +#define ISR(vect) +#elif defined(__GNUC__) +#include +#elif defined(__ICCAVR__) +#define __ISR(x) _Pragma(#x) +#define ISR(vect) __ISR(vector = vect) __interrupt void handler_##vect(void) +#endif +#endif // ISR_CUSTOM_H + +#ifdef __GNUC__ +#define cpu_irq_enable() sei() +#define cpu_irq_disable() cli() +#else +#define cpu_irq_enable() __enable_interrupt() +#define cpu_irq_disable() __disable_interrupt() +#endif + +//! @} + +/** + * \weakgroup interrupt_deprecated_group + * @{ + */ +// Deprecated definitions. +#define Enable_global_interrupt() cpu_irq_enable() +#define Disable_global_interrupt() cpu_irq_disable() +#define Is_global_interrupt_enabled() cpu_irq_is_enabled() +//! @} + +#endif /* UTILS_INTERRUPT_AVR8_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/utils/utils.h b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/utils.h new file mode 100644 index 0000000..eaf3b81 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/utils.h @@ -0,0 +1,52 @@ +/** + * utils Header File + * + * @file system.h + * + * @defgroup doc_driver_utils AVR Code utility functions + * + * @brief This file contains the compiler abstraction layer and code utilities for AVR.This module provides various abstraction layers and utilities to make code compatible between different compilers. + * + * @version Driver Version 1.0.1 + * \{ + * +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef UTILS_H_INCLUDED +#define UTILS_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Retrieve array size + */ +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif /* UTILS_H_INCLUDED */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/system/utils/utils_assert.h b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/utils_assert.h new file mode 100644 index 0000000..a278db5 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/system/utils/utils_assert.h @@ -0,0 +1,60 @@ +/** + * utils_assert Header File + * + * @file utils_assert.h + * + * @defgroup doc_driver_utils_assert Functionality for assert + * + * @brief This file contains the generated utils_assert header file for the configuration bits driver. + * + * @version Driver Version 1.0.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef _ASSERT_H_INCLUDED +#define _ASSERT_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * @brief Assert macro + * Macro used to throw asserts. It can be mapped to different function based on debug level. + * @param[in] condition A condition to be checked; assert is thrown if the given condition is false. + */ + +#ifdef DEBUG +#define ASSERT(condition) \ + if (!(condition)) \ + while (true) \ + ; +#else +#define ASSERT(condition) ((void)0) +#endif + +#ifdef __cplusplus +} +#endif +#endif /* _ASSERT_H_INCLUDED */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/arpv4.h b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/arpv4.h new file mode 100644 index 0000000..1a647cb --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/arpv4.h @@ -0,0 +1,82 @@ +/** + * ARPv4 Protocol Header file + * + * @file arpv4.h + * + * @defgroup arp ARP + * + * @brief This header file provides the API for the ARPv4 protocol. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef ARPV4_H +#define ARPV4_H + +// Included Files +#include "../ethernet/physical_layer_interface.h" +#include "tcpip_types.h" +#include "tcpip_config.h" + +// ARP Functions +/** + * @ingroup arp + * @brief Initializes the ARP table. + * @param None. + * @return None. + */ +void ARPV4_Init(void); + +/** + * @ingroup arp + * @brief Receives all ARP packets on the network and searches the ARP table for an existing ARP entry. + * If present, it updates the table. If the ARP packet is for the device and its operation is REQUEST, + * the function replies with the device MAC address. + * @param None. + * @retval 1 ARP reply sent successfully + * @retval !1 ARP reply is not sent or the ARP packet is not destined for the device + */ +error_msg ARPV4_Packet(void); + +/** + * @ingroup arp + * @brief Updates the ARP table at least every 10s to avoid aging. + * @param None. + * @return None. + */ +void ARPV4_Update(void); + +/** + * @ingroup arp + * @brief Maintains an ARP table which maps hardware address to internet address. + * @param ipAddress 32-bit destination IPv4 address in host order + * @return Pointer to the destination MAC address. + */ +mac48Address_t *ARPV4_Lookup(uint32_t ipAddress); + +/** + * @ingroup arp + * @brief Sends the ARP Request. + * @param destAddress 32-bit destination IPv4 address + * @retval 1 ARP request sent successfully + * @retval !1 ARP request failed to send + */ +error_msg ARPV4_Request(uint32_t destAddress); + +#endif /* ARPV4_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/dhcp_client.h b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/dhcp_client.h new file mode 100644 index 0000000..10a757d --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/dhcp_client.h @@ -0,0 +1,69 @@ +/** + * DHCPv4 Client Protocol Header File + * + * @file dhcp_client.h + * + * @defgroup dhcp DHCP + * + * @brief This file provides the API implementation for the Dynamic Host Configuration Protocol (DHCP) client. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef DHCP_CLIENT_H +#define DHCP_CLIENT_H + +// Included Files +#include "tcpip_types.h" +#include "tcpip_config.h" + +// DHCP Client Functions +/** + @ingroup dhcp + @brief Initializes the DHCP. + @param None. + @return None. + */ +void DHCP_init(void); + +/** + @ingroup dhcp + @brief Receives and processes the DHCP packet. + @param length Length of the received DHCP packet + @return None. + */ +void DHCP_Handler(int16_t length); + +/** + @ingroup dhcp + @brief Updates the DHCP status at least every one second. + @param None. + @return None. + */ +void DHCP_Manage(void); + +/** + @ingroup dhcp + @brief Writes zeroes for the number of bytes passed. + @param length Number of bytes + @return None. + */ +void DHCP_WriteZeros(uint16_t length); + +#endif /* DHCP_CLIENT_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/ip_database.h b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/ip_database.h new file mode 100644 index 0000000..68d424c --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/ip_database.h @@ -0,0 +1,109 @@ +/** + * IP Database Header File + * + * @file ip_database.h + * + * @ingroup ipv4 + * + * @brief This file contains IP addresses for different operations. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef IP_DATABASE_H +#define IP_DATABASE_H + +// Macros +#define MAX_DNS 2 +#define MAX_NTP 2 + +#define IPV4_ZERO_ADDRESS 0 +#define SPECIAL_IPV4_BROADCAST_ADDRESS 0xFFFFFFFF +#define CLASS_A_IPV4_BROADCAST_MASK 0XFF000000 +#define CLASS_B_IPV4_BROADCAST_MASK 0xFFFF0000 +#define CLASS_C_IPV4_BROADCAST_MASK 0xFFFFFF00 +#define ALL_HOST_MULTICAST_ADDRESS 0xE0000001 +#define LOCAL_HOST_ADDRESS 0x7F000001 + +#define CLASS_A_IPV4_REVERSE_BROADCAST_MASK 0x00FFFFFF +#define CLASS_B_IPV4_REVERSE_BROADCAST_MASK 0x0000FFFF +#define CLASS_C_IPV4_REVERSE_BROADCAST_MASK 0X000000FF + +/** + @ingroup ipv4 + @struct ip_db_info_t + @brief Contains IP information. + */ +typedef struct { + uint32_t ipv4_myAddress; /**< IP address*/ + uint32_t ipv4_dns[MAX_DNS]; /**< Primary & secondary DNS addresses*/ + uint32_t ipv4_subnetMask; /**< Subnet mask*/ + uint32_t ipv4_router; /**< Router address*/ + uint32_t ipv4_gateway; /**< Gateway address*/ + uint32_t ipv4_ntpAddress[MAX_NTP]; /**< NTP addresses*/ + uint32_t ipv4_tftpAddress; /**< TFTP address*/ +} ip_db_info_t; + +extern ip_db_info_t ip_database_info; + +#define ipdb_getAddress() (ip_database_info.ipv4_myAddress) +#define ipdb_getDNS(x) (x < MAX_DNS ? ip_database_info.ipv4_dns[x] : ip_database_info.ipv4_dns[0]) +#define ipdb_getSubNetMASK() (ip_database_info.ipv4_subnetMask) +#define ipdb_getRouter() (ip_database_info.ipv4_router) +#define ipdb_getNTP(x) (x < MAX_NTP ? ip_database_info.ipv4_ntpAddress[x] : ip_database_info.ipv4_ntpAddress[0]) +#define ipdb_getTFTP() (ip_database_info.ipv4_tftpAddress) +#define ipdb_classAbroadcastAddress() (ip_database_info.ipv4_myAddress|CLASS_A_IPV4_REVERSE_BROADCAST_MASK) +#define ipdb_classBbroadcastAddress() (ip_database_info.ipv4_myAddress|CLASS_B_IPV4_REVERSE_BROADCAST_MASK) +#define ipdb_classCbroadcastAddress() (ip_database_info.ipv4_myAddress|CLASS_C_IPV4_REVERSE_BROADCAST_MASK) +#define ipdb_specialbroadcastAddress() SPECIAL_IPV4_BROADCAST_ADDRESS + +#define ipdb_setAddress(a) do{ ip_database_info.ipv4_myAddress = a; } while(0) +#define ipdb_setDNS(x,v) do{ if(x < MAX_DNS) ip_database_info.ipv4_dns[x] = v; } while(0) +#define ipdb_setSubNetMASK(m) do{ ip_database_info.ipv4_subnetMask = m; } while(0) +#define ipdb_setRouter(r) do{ ip_database_info.ipv4_router = r; } while(0) +#define ipdb_setGateway(g) do{ ip_database_info.ipv4_gateway = g; } while(0) +#define ipdb_setNTP(x,n) do{ if(x < MAX_NTP) ip_database_info.ipv4_ntpAddress[x] = n; } while(0) +#define ipdb_setTFTP(a) do{ ip_database_info.ipv4_tftpAddress = a; } while(0) + +// IPDB Functions +/** + @ingroup ipv4 + @brief Initializes the IP database. + @param None. + @return None. + */ +void ipdb_init(void); + +/** + @ingroup ipv4 + @brief Converts a string into a 32-bit IPv4 address. + @param *str IPv4 address in a string format + @return IPv4 address. + */ +uint32_t makeStrToIpv4Address(char *str); + +/** + @ingroup ipv4 + @brief Converts an IPv4 address into a string. + @param addr 32-bit IPV4 address + @return IPV4 address in a string format. + */ +char *makeIpv4AddresstoStr(uint32_t addr); + +#endif /* IP_DATABASE_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/ipv4.h b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/ipv4.h new file mode 100644 index 0000000..60bb088 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/ipv4.h @@ -0,0 +1,90 @@ +/** + * IPv4 Protocol Header File + * + * @file ipv4.h + * + * @defgroup ipv4 IPV4 + * + * @brief This file provides the API implementation for the Internet Protocol v4 (IPv4). + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef IPV4_H +#define IPV4_H + +// Included Files +#include +#include "tcpip_types.h" +#include "../ethernet/physical_layer_interface.h" + +// IPV4 Functions +/** + @ingroup IPv4 + @brief Initializes IPv4. + @param None. + @return None. + */ +void IPV4_Init(void); + +/** + @ingroup ipv4 + @brief Receives the IPv4 packet. This function reads the IPv4 header and filters the upper layer protocols. + @param None. + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg IPV4_Packet(void); + +/** + @ingroup ipv4 + @brief Starts the IPv4 packet. This routine starts the Ethernet packet and writes the IPv4 header. + Initially Checksum and Payload length are set to '0'. An error code is returned if there has been + an error in accepting, or if something goes wrong. + @param dstAddress 32-bit destination Ipv4 address + @param protocol Protocol number + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg IPv4_Start(uint32_t dstAddress, ipProtocolNumbers protocol); + +/** + @ingroup ipv4 + @brief Computes the pseudo-header checksum for transport layer protocols. + @param payloadLen Length of the transport layer packet + @return Checksum. + */ +uint16_t IPV4_PseudoHeaderChecksum(uint16_t payloadLen); + +/** + @ingroup ipv4 + @brief Sends the IPv4 packet. This function inserts the total length of IPv4 packet, computes and adds the Ipv4 header checksum. + @param payloadLength Data length of the transport packet + @retval 1 IP packet was sent successfully + @retval !1 IP packet was not sent + */ +error_msg IPV4_Send(uint16_t payloadLength); + +/** + @ingroup ipv4 + @brief Returns the length of the IPv4 datagram. + @param None. + @return Length of IPV4 datagram. + */ +uint16_t IPV4_GetDatagramLength(void); + +#endif /* IPV4_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/lfsr.h b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/lfsr.h new file mode 100644 index 0000000..0ad9291 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/lfsr.h @@ -0,0 +1,86 @@ +/** + * lfsr API Header File + * + * @file lfsr.h + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for the Linear Feedback Shift Register (LFSR). + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef LFSR_H +#define LFSR_H + +// Included files +#include + +typedef uint8_t lfsr_t; + +// LFSR functions +/** + @ingroup tcpiplite + @brief Returns the LFSR sequence count. + @param None. + @return Sequence count. + */ +int lfsr_getSequenceCount(void); + +/** + @ingroup tcpiplite + @brief Returns the LFSR sequence. + @param None. + @return Sequence. + */ +lfsr_t lfsr_getSequence(void); + +/** + @ingroup tcpiplite + @brief Resets the LFSR. + @param None. + @return None. + */ +void lfsr_reset(void); + +/** + @ingroup tcpiplite + @brief Sets the LFSR sequence. + @param s Sequence + @return None. + */ +void lfsr_setSequence(uint16_t s); + +/** + @ingroup tcpiplite + @brief Returns the LFSR value. + @param None. + @return Value of LFSR. + */ +lfsr_t lfsr(void); + +/** + @ingroup tcpiplite + @brief Returns the LFSR value with seed. + @param lfsrSeed LFSR with seed + @return Value of LFSR with seed. + */ +lfsr_t lfsrWithSeed(uint8_t lfsrSeed); + +#endif /* LFSR_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/log.h b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/log.h new file mode 100644 index 0000000..34175e5 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/log.h @@ -0,0 +1,142 @@ +/** + * Log API Header File + * + * @file log.h + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for sending log messages. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef LOG_H +#define LOG_H + +// Included Files +#include +#include + +// Macros +#define LOG_DEST_ETHERNET 0b00000001 +#define LOG_DEST_CONSOLE 0b00000010 +#define LOG_DEST_EEPROM 0b00000100 + +#define LOG_ETHERNET_MASK(m) (m & LOG_DEST_ETHERNET) +#define LOG_CONSOLE_MASK(m) (m & LOG_DEST_CONSOLE) +#define LOG_EEPROM_MASK(m) (m & LOG_DEST_EEPROM) + +#define SYSLOG_VERSION 1 +#define LOG_NILVALUE "-" + +/** + * @ingroup tcpiplite + * @enum LOG_SEVERITY + * @brief PRI Priorities severity + */ +typedef enum +{ + LOG_EMERGENCY = 0, /** +#include "tcpip_types.h" + +// Macros +#define SOURCEPORT_SYSLOG 514 +#define DESTPORT_SYSLOG 514 + +// Syslog Functions +/** + @ingroup tcpiplite + @brief Sends a syslog message. + @param *message + @param priorityVal Message priority + @return Status of sending the message. Refer to the error description in tcpip_types.h. + */ +error_msg logSyslog(const char *message, uint8_t priorityVal); + +#endif /* LOG_SYSLOG_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/network.h b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/network.h new file mode 100644 index 0000000..106df64 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/network.h @@ -0,0 +1,110 @@ +/** + * Network Header File + * + * @file network.h + * + * @ingroup tcpiplite + * + * @brief This file provides the network layer implementation for the Transmission Control Protocol/Internet Protocol (TCP/IP) stack. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef NETWORK_H +#define NETWORK_H + +// Included Files +#include +#include "tcpip_types.h" + +// Macros +#define byteSwap16(a) ((((uint16_t)a & (uint16_t)0xFF00) >> 8) | (((uint16_t)a & (uint16_t)0x00FF) << 8)) +#define byteReverse32(a) ((((uint32_t)a & (uint32_t)0xff000000) >> 24) | \ + (((uint32_t)a & (uint32_t)0x00ff0000) >> 8) | \ + (((uint32_t)a & (uint32_t)0x0000ff00) << 8) | \ + (((uint32_t)a & (uint32_t)0x000000ff) << 24)) + +#define byteReverse24(a) (((((uint32_t)a & (uint32_t)0x00FF00) >> 8) | (((uint32_t)a & (uint32_t)0x0000FF) << 8)) << 8 | (uint32_t)a >> 0x10) + +// Host-to-network and network-to-host macros +#ifndef htons +#define htons(a) byteSwap16(a) +#endif +#ifndef ntohs +#define ntohs(a) byteSwap16(a) +#endif +#ifndef htonl +#define htonl(a) byteReverse32(a) +#endif +#ifndef ntohl +#define ntohl(a) byteReverse32(a) +#endif + +#define convert_hton24(a) byteReverse24(a) + +// Network Functions +/** + * @ingroup tcpiplite + * @brief Initializes the network protocols. + * @param None. + * @return None. + */ +void Network_Init(void); + +/** + * @ingroup tcpiplite + * @brief Reads the packets in the network. + * @param None. + * @return None. + */ +void Network_Read(void); + +/** + * @ingroup tcpiplite + * @brief Handles the packets in the network. + * @param None. + * @return None. + */ +void Network_Manage(void); + +/** + * @ingroup tcpiplite + * @brief Waits for the link by reading the PHY registers. + * @param None. + * @return None. + */ +void Network_WaitForLink(void); + +/** + * @ingroup tcpiplite + * @brief Returns the network start position. + * @param None. + * @return Start position. + */ +uint16_t Network_GetStartPosition(void); + +/** + * @ingroup tcpiplite + * @brief Initializes the timers. + * @param None. + * @return None. + */ +void timersInit(void); + +#endif /* NETWORK_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/rtcc.h b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/rtcc.h new file mode 100644 index 0000000..8697fd3 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/rtcc.h @@ -0,0 +1,87 @@ +/** + * RTCC Header File + * + * @file rtcc.h + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for the Real-Time Clock/Calendar (RTCC). + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef RTCC_H +#define RTCC_H + +// Included Files +#include +#include + + +// Variables +extern volatile bool dirtyTime; + +// RTCC Functions +/** + * @ingroup tcpiplite + * @brief Initializes the clock calendar driver. + * This routine configures the basics of a software-driven RTCC peripheral. + * It relies upon a periodic timer event to provide time keeping. + * The appropriate timer needs to be selected in the TCP/IP Lite Dependency. + * Configure the selected timer to produce a time-out of 1s. Set the callback rate as 1, + * if required depending on the device. + * @param None. + * @return None. + */ +void rtcc_init(void); + +/** + * @ingroup tcpiplite + * @brief Maintains the deviceTime (seconds) using the LCDIF flag/interrupt. + * This routine decrements seconds_counter until 0 and then increments deviceTime. + * seconds_counter reloads with CLOCK_PER_SEC. It uses the timer selected as the Dependency by the user. + * @param None. + * @return None. + */ +void rtcc_handler(void); + +/** + * @ingroup tcpiplite + * @brief Sets the device time to the passed unix time value and + * updates the device time with the passed unix time. + * Interrupts are disabled during the copy and restored to the original on exit. + * @param *t A pointer of type time_t for the current time + * @return None. + */ +void rtcc_set(time_t *t); + +/** + * @ingroup tcpiplite + * @brief Returns the current device time. + * This routine retrieves the device time as either a return value or + * filling in a variable passed by reference. + * Interrupts are disabled during the copy and restored to the original on exit. + * time.h is a prerequisite for supporting the standard C time libraries + * and does not implement time, as it is application dependent. + * @param *t A pointer of type time_t for the current time + * @return Value of the current time. + */ +time_t time(time_t *t); + +#endif /* RTCC_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/arpv4.c b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/arpv4.c new file mode 100644 index 0000000..701639f --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/arpv4.c @@ -0,0 +1,233 @@ +/** + * ARP v4 Implementation Source File + * + * @file arpv4.c + * + * @ingroup arp + * + * @brief This file provides the API implementation for the Address Resolution Protocol (ARP) v4. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include +#include "../tcpip_types.h" +#include "../network.h" +#include "../arpv4.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../ipv4.h"// needed to know my IP address +#include "../tcpip_config.h" +#include "../ip_database.h" + +// Macros +#define ARP_REQUEST 1 +#define ARP_REPLY 2 +#define ARP_NAK 10 + +// Structs +/** + * @ingroup arp + * @struct arpHeader_t + * @brief Contains the ARP information. + */ +typedef struct +{ + uint16_t htype; /** 0; x--) + { + if( (ntohl(header.spa) == entryPointer->ipAddress) && (header.ptype == entryPointer->protocolType)) + { + entryPointer->age = 0; // Reset the age + entryPointer->macAddress.s = header.sha.s; + mergeFlag = true; + break; + } + entryPointer++; + } + + if(ipdb_getAddress() && (ipdb_getAddress() == ntohl(header.tpa))) + { + if(!mergeFlag) + { + // Find the oldest entry in the table + entryPointer = arpMap; + arpMap_t *arpPtr = arpMap; + for(uint8_t x=ARP_MAP_SIZE; x !=0; x--) + { + if(entryPointer->age < arpPtr->age) + { + entryPointer = arpPtr; + } + /* Increment the pointer to get the next element from the array. */ + arpPtr++; + } + // The entry_pointer is now pointing to the oldest entry + // Replace the entry with the received data + entryPointer->age = 0; + entryPointer->macAddress.s = header.sha.s; + entryPointer->ipAddress = ntohl(header.spa); + entryPointer->protocolType = header.ptype; + } + if(header.oper == ntohs(ARP_REQUEST)) + { + ret = (error_msg)ETH_WriteStart(&header.sha ,ETHERTYPE_ARP); + if(ret == SUCCESS) + { + + header.tha.s = header.sha.s; + memcpy((void*)&header.sha.s, (void*)&hostMacAddress.s, sizeof(mac48Address_t)); + header.tpa = header.spa; + header.spa = htonl(ipdb_getAddress()); + header.oper = htons(ARP_REPLY); + ETH_WriteBlock((char*)&header,sizeof(header)); + + + ret = (error_msg)ETH_Send(); + } + } + } + else + { + ret = ARP_IP_NOT_MATCHED; + } + } + return ret; +} + +void ARPV4_Update(void) +{ + arpMap_t *entryPointer = arpMap; + for(uint8_t x=0; x < ARP_MAP_SIZE; x++) + { + entryPointer->age ++; + entryPointer ++; + } +} + +error_msg ARPV4_Request(uint32_t destAddress) +{ + error_msg ret; + + ret = ERROR; + + arpHeader_t header; + header.htype = htons(1); + header.ptype = htons(0x0800); + header.hlen = 6; + header.plen = 4; + header.oper = htons(ARP_REQUEST); + memcpy((void*)&header.sha, (void*)&hostMacAddress, sizeof(mac48Address_t)); + header.spa = htonl(ipdb_getAddress()); + header.tpa= htonl(destAddress); + header.tha.s.byte1 = 0; + header.tha.s.byte2 = 0; + header.tha.s.byte3 = 0; + header.tha.s.byte4 = 0; + header.tha.s.byte5 = 0; + header.tha.s.byte6 = 0; + + ret = (error_msg)ETH_WriteStart(&broadcastMAC,ETHERTYPE_ARP); + if(ret == SUCCESS) + { + ETH_WriteBlock((char*)&header,sizeof(arpHeader_t)); + ret = (error_msg)ETH_Send(); + if(ret == SUCCESS) + { + return MAC_NOT_FOUND; + } + } + return ret; +} + +mac48Address_t* ARPV4_Lookup(uint32_t ip_address) +{ + arpMap_t *entry_pointer = arpMap; + uint8_t x; + + for(x = 0; x < ARP_MAP_SIZE; x++) + { + if(entry_pointer->ipAddress == ip_address) + return &entry_pointer->macAddress; + entry_pointer ++; + } + return 0; +} diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/dhcp_client.c b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/dhcp_client.c new file mode 100644 index 0000000..5eaef99 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/dhcp_client.c @@ -0,0 +1,579 @@ +/** + * DHCP v4 client Implementation Source File + * + * @file dhcp_client.c + * + * @ingroup dhcp + * + * @brief This file provides the API implementation for the DHCP client. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +//Included Files +#include +#include +#include +#include +#include +#include "../log.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../network.h" +#include "../udpv4.h" +#include "../udpv4_port_handler_table.h" +#include "../ipv4.h" +#include "../arpv4.h" +#include "../dhcp_client.h" +#include "../ip_database.h" +#include "../lfsr.h" + +// Macros +#ifdef ENABLE_NETWORK_DEBUG +#define logMsg(msg, msgSeverity, msgLogDest) logMessage(msg, LOG_DHCP, msgSeverity, msgLogDest) +#else +#define logMsg(msg, msgSeverity, msgLogDest) +#endif +#define DHCP_HEADER_SIZE 240 + +#if ( DHCP_PACKET_SIZE & 1) +#define ZERO_PAD_DHCP +#define DHCP_REQUEST_LENGTH (DHCP_PACKET_SIZE + 1) +#else +#undef ZERO_PAD_DHCP +#define DHCP_REQUEST_LENGTH DHCP_PACKET_SIZE +#endif + +static mac48Address_t ethMAC; + +// Enumerations +/** + * @ingroup dhcp + * @enum dhcp_type + * @brief Contains DCHP request types. + */ +typedef enum +{ + DHCP_DISCOVER = 1, + DHCP_OFFER, DHCP_REQUEST, DHCP_DECLINE, DHCP_ACK, DHCP_NACK, DHCP_RELEASE, + DHCP_INFORM, DHCP_FORCERENEW, DHCP_LEASEQUERY, DHCP_LEASEUNASSIGNED, DHCP_LEASEUNKNOWN, + DHCP_LEASEACTIVE, DHCP_BULKLEASEQUERY, DHCP_LEASEQUERYDONE +}dhcp_type; + +/** + * @ingroup dhcp + * @enum dhcp_rx_client_state + * @brief Contains the DCHP RX Client state. + */ +typedef enum +{ + SELECTING, REQUESTING, RENEWLEASE, BOUND +}dhcp_rx_client_state; + +/** + * @ingroup dhcp + * @enum dhcp_timer_client_state + * @brief Contains the DCHP Timer Client state. + */ +typedef enum +{ + INIT_TIMER, WAITFORTIMER, STARTDISCOVER, STARTREQUEST +}dhcp_timer_client_state; + +// Structs +/** + * @ingroup dhcp + * @struct dhcp_data_t + * @brief Contains option data + */ +typedef struct +{ + uint32_t dhcpIPAddress; /** DHCP_HEADER_SIZE) + { + logMsg("DHCP PROCESSING", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + if (0x0201 == UDP_Read16()) + { + if (0x06 == UDP_Read8()) // HLEN - is set to 6 because an Ethernet address is 6 Octets long + { + UDP_Read8(); // HOPS + if (dhcpData.xidValue == UDP_Read32()) // xid check + { + UDP_Read16(); // SECS + UDP_Read16(); // FLAGS + UDP_Read32(); // CIADDR + localData.dhcpIPAddress = UDP_Read32(); // YIADDR + if ((localData.dhcpIPAddress != SPECIAL_IPV4_BROADCAST_ADDRESS) && (localData.dhcpIPAddress != LOCAL_HOST_ADDRESS)) + { + siaddr = UDP_Read32(); // SIADDR + if ((siaddr != SPECIAL_IPV4_BROADCAST_ADDRESS) && (siaddr != LOCAL_HOST_ADDRESS)) + { + UDP_Read32(); // GIADDR + UDP_ReadBlock(chaddr, sizeof(chaddr)); // Read chaddr + if (memcmp(chaddr, &hostMacAddress.s, 6) == 0 + || memcmp(chaddr, &broadcastMAC.s, 6) == 0 + || (strlen((char *)chaddr) == 0)) // only compare 6 bytes of MAC address. + { + ETH_Dump(64); // drop SNAME + ETH_Dump(128); // drop the filename + if (UDP_Read32() == 0x63825363) + { + length -= DHCP_HEADER_SIZE; + while (length > 0) + { + // options are here!!! + uint8_t option, optionLength; + option = UDP_Read8(); + optionLength = UDP_Read8(); + length -= 2 + optionLength; + switch (option) + { + case 1: // subnet mask + logMsg("DHCP option 1", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + localData.subnetMask = UDP_Read32(); + break; + case 3: // router + logMsg("DHCP option 3", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + localData.routerAddress = UDP_Read32(); + break; + case 6: // DNS List + { + uint8_t count = 0; + logMsg("DHCP option 6", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + while (optionLength >= 4) + { + uint32_t a = UDP_Read32(); + if (count < 2) + localData.dnsAddress[count++] = a; + + optionLength -= 4; + } + } + break; + case 42: // NTP server + { + uint8_t count = 0; + logMsg("DHCP option 42", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + while (optionLength >= 4) + { + uint32_t a = UDP_Read32(); + if (count < 2) + localData.ntpAddress[count++] = a; + + optionLength -= 4; + } + } + break; + case 51: // lease time + logMsg("DHCP option 51", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + if (optionLength >= 4) + { + uint32_t origLeaseTime; + + origLeaseTime = UDP_Read32(); + // localData.t2 = localData.t1 - 100; // 100 seconds faster for requests + localData.t1 = origLeaseTime >> 1; // be default set to 1/2 the lease length + localData.t2 = localData.t1; // be default set to 1/2 the lease length + origLeaseTime = localData.t1 >> 1; + localData.t2 += origLeaseTime; + localData.t2 += origLeaseTime >> 1; + + optionLength -= 4; + } + break; + case 54: // DHCP server + logMsg("DHCP option 54", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + localData.dhcpServerIdentifier = UDP_Read32(); + // printf("case54:%u\r\n",localData.dhcpServerIdentifier); + optionLength -= 4; + break; + case 53: + logMsg("DHCP option 53", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + messageType = UDP_Read8(); + optionLength -= 1; + break; + default: + ETH_Dump(optionLength); // dump any unused bytes + break; + } // option switch + } // length loop + } // Testing Vendor Information "Magic Cookie" (RFC1497) + else + { + logMsg("DHCP failed Magic Cookie check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } + } // MAC address test + else + { + logMsg("DHCP fail MAC address check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + return; + } + } // SIADDR test + else + { + logMsg("DHCP fail SIADDR check", LOG_WARNING, (LOG_DEST_CONSOLE)); + } + } // YIADDR test + else + { + logMsg("DHCP fail YIADDR check", LOG_WARNING, (LOG_DEST_CONSOLE)); + } + } // xid test + else + { + logMsg("DHCP fail XID check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } + } // HLEN test + else + { + logMsg("DHCP fail Hardware Length", LOG_WARNING, (LOG_DEST_CONSOLE)); + } + } // 201 test + else + { + logMsg("DHCP fail 201 check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } + } // Short packet test + else + { + logMsg("DHCP fail short packet check", LOG_WARNING, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } + switch (messageType) + { + case DHCP_OFFER: + if (acceptOffers) + { + dhcpData = localData; // capture the data in the offer + sendDHCPREQUEST(); + dhcpState.rxClientState = REQUESTING; + } + if (declineOffers) + { + sendDHCPDECLINE(); + } + break; + case DHCP_ACK: + if (acceptACK) + { + dhcpData.t1 = localData.t1; + dhcpData.t2 = localData.t2; + ipdb_setAddress(dhcpData.dhcpIPAddress); + ipdb_setDNS(0, dhcpData.dnsAddress[0]); + ipdb_setDNS(1, dhcpData.dnsAddress[1]); + ipdb_setRouter(dhcpData.routerAddress); + ipdb_setGateway(dhcpData.gatewayAddress); + ipdb_setSubNetMASK(dhcpData.subnetMask); + if (dhcpData.ntpAddress[0]) + { + ipdb_setNTP(0, dhcpData.ntpAddress[0]); + if (dhcpData.ntpAddress[1]) + ipdb_setNTP(1, dhcpData.ntpAddress[1]); + } + dhcpState.rxClientState = BOUND; + } + break; + case DHCP_NACK: + if (acceptNACK) + { + dhcpData.t1 = 4; + dhcpData.t2 = 2; + dhcpState.rxClientState = SELECTING; + } + break; + default: + break; + } + } // accept types test + else + { + logMsg("DHCP fail accept types check", LOG_INFO, (LOG_DEST_CONSOLE | LOG_DEST_ETHERNET)); + } +} + +void DHCP_WriteZeros(uint16_t length) +{ + while(length--) + { + UDP_Write8(0); + } +} diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/ip_database.c b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/ip_database.c new file mode 100644 index 0000000..82ca038 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/ip_database.c @@ -0,0 +1,74 @@ +/** + * IP Database Implementation Source File + * + * @file ip_database.c + * + * @ingroup ipv4 + * + * @brief This file provides the API implementation for the IP database. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include +#include "../ip_database.h" + +// Variables +ip_db_info_t ip_database_info; + +// IPDB Functions +void ipdb_init(void) +{ + ip_database_info.ipv4_myAddress = 0; + ip_database_info.ipv4_subnetMask = 0; + ip_database_info.ipv4_router = 0; + for(uint8_t x=0; x < MAX_DNS; x ++) + ip_database_info.ipv4_dns[x] = 0; + for(uint8_t x=0; x < MAX_NTP; x++) + ip_database_info.ipv4_ntpAddress[x] = 0; + ip_database_info.ipv4_tftpAddress = 0; +} + +uint32_t makeStrToIpv4Address(char *str) +{ + uint32_t ip_addr; + char *pch; + uint8_t field = 3; + pch = strtok(str,"."); + while(pch != NULL) + { + ((uint8_t *)&ip_addr)[field]= (uint8_t)atoi((const char*)pch); + field--; + pch = strtok (NULL,"."); + } + return ip_addr; +} + +char *makeIpv4AddresstoStr(uint32_t addr) +{ + static char ip_str[15]; + + sprintf(ip_str,"%d.%d.%d.%d",((char*)&addr)[3],((char*)&addr)[2],((char*)&addr)[1],((char*)&addr)[0]); + + return ip_str; +} diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/ipv4.c b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/ipv4.c new file mode 100644 index 0000000..7038866 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/ipv4.c @@ -0,0 +1,256 @@ +/** + * IPv4 Implementation Source File + * + * @file ipv4.c + * + * @ingroup ipv4 + * + * @brief This file provides the API implementation for IPv4. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../network.h" +#include "../ipv4.h" +#include "../arpv4.h" +#include "../udpv4.h" +#include "../udpv4_port_handler_table.h" +#include "../tcpip_types.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../log.h" +#include "../ip_database.h" + + +// Macros +#ifdef ENABLE_NETWORK_DEBUG +#define logMsg(msg, msgSeverity, msgLogDest) logMessage(msg, LOG_KERN, msgSeverity, msgLogDest) +#else +#define logMsg(msg, msgSeverity, msgLogDest) +#endif + + +// Variables +ipv4Header_t ipv4Header; + +/** + @ingroup ipv4 + @brief Returns the header length + @param None. + @return Length of the header. + */ +static uint8_t getHeaderLen(void); + +// Loacl IPV4 functions +void IPV4_Init(void) +{ + ipdb_init(); +} + +uint16_t IPV4_PseudoHeaderChecksum(uint16_t payloadLen) +{ + ipv4_pseudo_header_t tmp; + uint8_t *ptrPseudoHeader; + uint8_t lenPseudoHeader; + uint32_t cksm = 0; + + tmp.srcIpAddress = ipv4Header.srcIpAddress; + tmp.dstIpAddress = ipv4Header.dstIpAddress; + tmp.protocol = ipv4Header.protocol; + tmp.z = 0; + tmp.length = payloadLen; + + lenPseudoHeader = sizeof(tmp); + ptrPseudoHeader = (uint8_t *) &tmp; + + while(lenPseudoHeader) + { + cksm += (lenPseudoHeader & 1) ? (uint32_t)(*ptrPseudoHeader)<<8 : (uint32_t)(*ptrPseudoHeader); + ptrPseudoHeader++; + lenPseudoHeader--; + } + + // Adding back carry from top 16 bits to low 16 bits + cksm = (cksm & 0x0FFFF) + (cksm>>16); + + return (uint16_t)cksm; +} + +static uint8_t getHeaderLen(void) +{ + uint16_t rxptr; + uint8_t header_len = 0; + rxptr = ETH_GetReadPtr(); + header_len = ETH_Read8() & 0x0fu; + ETH_SetRxByteCount(ETH_GetRxByteCount()+1); + ETH_SetReadPtr(rxptr); + return (uint8_t)(header_len<<2) ; +} + +error_msg IPV4_Packet(void) +{ + uint16_t cksm = 0; + uint16_t length = 0; + uint8_t hdrLen; + // Calculate the IPv4 checksum + hdrLen = getHeaderLen(); + cksm = ETH_RxComputeChecksum(hdrLen, 0); + if (cksm != 0) + { + return IPV4_CHECKSUM_FAILS; + } + + ETH_ReadBlock((char *)&ipv4Header, sizeof(ipv4Header_t)); + if(ipv4Header.version != 4) + { + return IP_WRONG_VERSION; // Incorrect version number + } + + ipv4Header.dstIpAddress = ntohl(ipv4Header.dstIpAddress); + ipv4Header.srcIpAddress = ntohl(ipv4Header.srcIpAddress); + + if(ipv4Header.srcIpAddress == SPECIAL_IPV4_BROADCAST_ADDRESS) + return DEST_IP_NOT_MATCHED; + + if(ipv4Header.dstIpAddress == ipdb_getAddress() + || (ipv4Header.dstIpAddress == IPV4_ZERO_ADDRESS) + || (ipv4Header.dstIpAddress == SPECIAL_IPV4_BROADCAST_ADDRESS) + || ((ipdb_getAddress()|CLASS_A_IPV4_REVERSE_BROADCAST_MASK)== ipv4Header.dstIpAddress) + || ((ipdb_getAddress()|CLASS_B_IPV4_REVERSE_BROADCAST_MASK)== ipv4Header.dstIpAddress) + || ((ipdb_getAddress()|CLASS_C_IPV4_REVERSE_BROADCAST_MASK)== ipv4Header.dstIpAddress) + || (ipv4Header.dstIpAddress == ALL_HOST_MULTICAST_ADDRESS)) + { + ipv4Header.length = ntohs(ipv4Header.length); + + hdrLen = (uint8_t)(ipv4Header.ihl << 2); + + if(ipv4Header.ihl < 5) + return INCORRECT_IPV4_HLEN; + + if (ipv4Header.ihl > 5) + { + // Do not process the IPv4 Options field + ETH_Dump((uint16_t)(hdrLen - sizeof(ipv4Header_t))); + } + + switch((ipProtocolNumbers)ipv4Header.protocol) + { + case UDP_TCPIP: + // Check the UDP header checksum + logMsg("IPv4 RX UDP", LOG_INFO, LOG_DEST_CONSOLE); + length = ipv4Header.length - hdrLen; + cksm = IPV4_PseudoHeaderChecksum(length); // Calculate pseudo header checksum + cksm = ETH_RxComputeChecksum(length, cksm); // 1's complement of pseudo header checksum + 1's complement of UDP header, data + UDP_Receive(cksm); + break; + default: + ETH_Dump(ipv4Header.length); + break; + } + return SUCCESS; + } + else + { + return DEST_IP_NOT_MATCHED; + } +} + +error_msg IPv4_Start(uint32_t dstAddress, ipProtocolNumbers protocol) +{ + error_msg ret = ERROR; + // Get the destination MAC address + const mac48Address_t *destMacAddress; + uint32_t targetAddress; + + // Check if there is a valid IP address and if it is different from 127.0.0.1 + if(((ipdb_getAddress() != 0) || (protocol == UDP_TCPIP)) + && (ipdb_getAddress() != 0x7F000001)) + { + if(((dstAddress == SPECIAL_IPV4_BROADCAST_ADDRESS) + |((dstAddress | CLASS_A_IPV4_BROADCAST_MASK) == SPECIAL_IPV4_BROADCAST_ADDRESS) + |((dstAddress | CLASS_B_IPV4_BROADCAST_MASK) == SPECIAL_IPV4_BROADCAST_ADDRESS) + |((dstAddress | CLASS_C_IPV4_BROADCAST_MASK) == SPECIAL_IPV4_BROADCAST_ADDRESS))==0) // This is NOT a broadcast message + { + if( ((dstAddress ^ ipdb_getAddress()) & ipdb_getSubNetMASK()) == 0) + { + targetAddress = dstAddress; + } + else + { + targetAddress = ipdb_getRouter(); + } + destMacAddress= ARPV4_Lookup(targetAddress); + if(destMacAddress == 0) + { + ret = ARPV4_Request(targetAddress); // Schedule an arp request + return ret; + } + } + else + { + destMacAddress = &broadcastMAC; + } + ret = (error_msg)ETH_WriteStart(destMacAddress, ETHERTYPE_IPV4); + if(ret == SUCCESS) + { + ETH_Write16(0x4500); // VERSION, IHL, DSCP, ECN + ETH_Write16(0); // Total packet length + ETH_Write32(0xAA554000); // My IPv4 Magic Number..., FLAGS, Fragment Offset + ETH_Write8(IPv4_TTL); // TTL + ETH_Write8(protocol); // protocol + ETH_Write16(0); // Checksum will be set to zero and overwritten with correct value + ETH_Write32(ipdb_getAddress()); + ETH_Write32(dstAddress); + + // Fill the pseudo header for checksum calculation + ipv4Header.srcIpAddress = ipdb_getAddress(); + ipv4Header.dstIpAddress = dstAddress; + ipv4Header.protocol = protocol; + } + } + return ret; +} + +error_msg IPV4_Send(uint16_t payloadLength) +{ + uint16_t totalLength; + uint16_t cksm; + error_msg ret; + + totalLength = 20 + payloadLength; + totalLength = ntohs(totalLength); + + // Insert IPv4 Total Length + ETH_Insert((char *)&totalLength, 2, sizeof(ethernetFrame_t) + offsetof(ipv4Header_t, length)); + + cksm = ETH_TxComputeChecksum(sizeof(ethernetFrame_t), sizeof(ipv4Header_t), 0); + // Insert Ipv4 Header Checksum + ETH_Insert((char *)&cksm, 2, sizeof(ethernetFrame_t) + offsetof(ipv4Header_t, headerCksm)); + ret = (error_msg)ETH_Send(); + + return ret; +} + +uint16_t IPV4_GetDatagramLength(void) +{ + return ((ipv4Header.length) - sizeof(ipv4Header_t)); +} \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/lfsr.c b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/lfsr.c new file mode 100644 index 0000000..2d55602 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/lfsr.c @@ -0,0 +1,81 @@ +/** + * LFSR Implementation Source File + * + * @file lfsr.c + * + * @ingroup tcpiplite + * + * @brief This file provides the API prototypes for the Linear Feedback Shift Register (LFSR) module. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include "../lfsr.h" + +// Macros +#define lfsr_seed 0x40 +#define lfsrOutputMask 0x7fu + +// Variables +static uint8_t sequenceIndex = 0; +const lfsr_t xorSequences[] = {0x41,0x44,0x47,0x48,0x4E,0x53,0x55,0x5C,0x5F,0x60,0x65,0x69,0x6A,0x72,0x77,0x78,0x7B,0x7E}; +lfsr_t xor_mask = 0x41; // note this comes from the first entry in the sequence list +lfsr_t lfsr_value = lfsr_seed; + +// LFSR functions +lfsr_t lfsr_getSequence(void) +{ + return xorSequences[sequenceIndex]; +} + +int lfsr_getSequenceCount(void) +{ + return sizeof(xorSequences)/sizeof(*xorSequences); +} + +void lfsr_reset(void) +{ + lfsr_value = lfsr_seed; +} + +void lfsr_setSequence(uint16_t s) +{ + s %= sizeof(xorSequences)/sizeof(*xorSequences); + xor_mask = xorSequences[s]; +} + +lfsr_t lfsr(void) +{ + unsigned char lsb = lfsr_value & 1u; + lfsr_value >>= 1u; + if (lsb) + lfsr_value ^= xor_mask; + return lfsr_value & lfsrOutputMask; +} + +lfsr_t lfsrWithSeed(uint8_t lfsrSeed) +{ + lfsr_value = lfsrSeed; + unsigned char lsb = lfsr_value & 1u; + lfsr_value >>= 1; + if (lsb) + lfsr_value ^= xor_mask; + return lfsr_value & lfsrOutputMask; +} diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/log.c b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/log.c new file mode 100644 index 0000000..1697329 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/log.c @@ -0,0 +1,151 @@ +/** + * Message Logging Implementation Source File + * + * @file log.c + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for message logging. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include +#include "../rtcc.h" +#include "../log.h" +#include "../log_console.h" +#include "../log_syslog.h" + +// Macros +/** + * @ingroup tcpiplite + * @def LOG_PRIMASK + * @brief Mask to extract priority part (internal) + */ +#define LOG_PRIMASK 0x07 + +/** + * @ingroup tcpiplite + * @def LOG_PRI(p) + * @brief Extract priority + */ +#define LOG_PRI(p) ((p) & LOG_PRIMASK) + +/** + * @ingroup tcpiplite + * @def LOG_NFACILITIES + * @brief Current number of facilities + */ +#define LOG_NFACILITIES 24 + +/** + * @ingroup tcpiplite + * @def LOG_FACMASK + * @brief Mask to extract facility part + */ +#define LOG_FACMASK 0x03f8 + +/** + * @ingroup tcpiplite + * @def LOG_FAC(p) + * @brief Facility of priority + */ +#define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3) +#define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri)) + +// Arguments to setlogmask +/** + * @ingroup tcpiplite + * @def LOG_MASK(pri) + * @brief Mask for one priority + */ +#define LOG_MASK(pri) (1 << (pri)) + +/** + * @ingroup tcpiplite + * @def LOG_UPTO(pri) + * @brief All priorities through PRI + */ +#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1) +#define LOG_NILVALUE "-" + +LOG_SEVERITY limit[LOG_LAST]; // one limit per facility + +const logFields_t severityThresholdTable[] = { + { LOG_KERN, LOG_INFO }, + { LOG_DTLS, LOG_NOTICE }, + { LOG_ECC, LOG_NOTICE }, + { LOG_DAEMON, LOG_INFO }, + { LOG_AUTH, LOG_NOTICE }, + { LOG_SYSLOG, LOG_NOTICE }, + { LOG_LPR, LOG_INFO }, + { LOG_NEWS, LOG_NOTICE }, + { LOG_TFTP, LOG_INFO }, + { LOG_UUID, LOG_NOTICE }, + { LOG_COAP, LOG_NOTICE }, + { LOG_FTP, LOG_NOTICE }, + { LOG_NTP, LOG_INFO }, + { LOG_HTTP, LOG_NOTICE }, + { LOG_SNMP, LOG_NOTICE }, + { LOG_RTCC, LOG_NOTICE }, + { LOG_CBOR, LOG_INFO }, + { LOG_UDP, LOG_NOTICE }, + { LOG_TCP, LOG_NOTICE }, + { LOG_DHCP, LOG_INFO }, + { LOG_DNS, LOG_NOTICE }, + { LOG_LLDP, LOG_INFO }, + { LOG_LINK, LOG_NOTICE }, + + { LOG_LAST, LOG_NOTICE } +}; + +// Logging function definitions +void LOG_Init(void) +{ + unsigned long t = (unsigned long)time(0); + printf("\n\nStarting Syslog at %lu\n",t); + for(uint8_t x=0;x +#include +#include +#include "../../system/system.h" +#include "../log.h" +#include "../ip_database.h" + +// Log Console Functions +uint8_t logConsole(const char *message, uint8_t priorityVal) +{ + struct tm * SYSLOG_time1; + time_t time1; + unsigned long ip; + + ip = ipdb_getAddress(); + time1 = time(NULL); + SYSLOG_time1 = gmtime(&time1); + + printf("<%d>%d %d-%.2d-%.2dT%.2d:%.2d:%.2dZ %d.%d.%d.%d %s %s %s %s[%s]\r\n", priorityVal, SYSLOG_VERSION, SYSLOG_time1->tm_year, SYSLOG_time1->tm_mon, SYSLOG_time1->tm_mday, SYSLOG_time1->tm_hour, SYSLOG_time1->tm_min, SYSLOG_time1->tm_sec, ((char*)&ip)[3],((char*)&ip)[2],((char*)&ip)[1],((char*)&ip)[0], LOG_NILVALUE, LOG_NILVALUE, LOG_NILVALUE, LOG_NILVALUE, message); + return 1; +} diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/log_syslog.c b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/log_syslog.c new file mode 100644 index 0000000..9e9b2ad --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/log_syslog.c @@ -0,0 +1,79 @@ +/** + * Sending Syslog Source File + * + * @file log_syslog.c + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for sending syslog messages. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../../system/system.h" +#include "../log.h" +#include "../tcpip_types.h" +#include "../udpv4.h" +#include "../udpv4_port_handler_table.h" +#include "../ip_database.h" +#include "../log_syslog.h" + +// Syslog Functions +error_msg logSyslog(const char *message, uint8_t priorityVal) +{ + char storage[12]; + struct tm * SYSLOG_time1; + time_t time1; + error_msg error; + unsigned long ip; + + ip = ipdb_getAddress(); + time1 = time(NULL); + error = UDP_Start(0xFFFFFFFF,SOURCEPORT_SYSLOG,DESTPORT_SYSLOG); + + if( SUCCESS == error) + { + SYSLOG_time1 = gmtime(&time1); + sprintf(storage,"<%d>%d ",priorityVal, SYSLOG_VERSION); + UDP_WriteString(storage); + sprintf(storage,"%d-%.2d-%.2d",SYSLOG_time1->tm_year, SYSLOG_time1->tm_mon, SYSLOG_time1->tm_mday); + UDP_WriteString(storage); + sprintf(storage,"T%.2d:%.2d:%.2dZ",SYSLOG_time1->tm_hour, SYSLOG_time1->tm_min, SYSLOG_time1->tm_sec); + UDP_WriteString(storage); + sprintf(storage," %d.%d.%d.%d",((char*)&ip)[3],((char*)&ip)[2],((char*)&ip)[1],((char*)&ip)[0]); //Hostnmame + UDP_WriteString(storage); + sprintf(storage," %s", LOG_NILVALUE); // App-name + UDP_WriteString(storage); + sprintf(storage," %s", LOG_NILVALUE); // Procid + UDP_WriteString(storage); + sprintf(storage," %s", LOG_NILVALUE); // Msgid + UDP_WriteString(storage); + sprintf(storage," %s[", LOG_NILVALUE); // Structured data + UDP_WriteString(storage); + UDP_WriteString(message); + sprintf(storage,"]"); // Structured data + UDP_WriteString(storage); + UDP_Send(); + } + return error; +} diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/network.c b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/network.c new file mode 100644 index 0000000..360ff8f --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/network.c @@ -0,0 +1,164 @@ +/** + * Network Source File + * + * @file network.c + * + * @ingroup tcpiplite + * + * @brief This file provides the network layer implementation for the TCP/IP stack. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include +#include "../../system/system.h" +#include "../network.h" +#include "../tcpip_types.h" +#include "../dhcp_client.h" +#include "../arpv4.h" +#include "../ipv4.h" +#include "../rtcc.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../log.h" +#include "../ip_database.h" + +// Macros +#ifdef ENABLE_NETWORK_DEBUG +#define logMsg(msg, msgSeverity, msgLogDest) logMessage(msg, LOG_KERN, msgSeverity, msgLogDest) +#else +#define logMsg(msg, msgSeverity, msgLogDest) +#endif + +time_t arpTimer; +static void Network_SaveStartPosition(void); +uint16_t networkStartPosition; + +const char *network_errors[] = { + "ERROR", "SUCCESS", "LINK_NOT_FOUND", "BUFFER_BUSY", + "TX_LOGIC_NOT_IDLE", "MAC_NOT_FOUND", + "IP_WRONG_VERSION", "IPV4_CHECKSUM_FAILS", + "DEST_IP_NOT_MATCHED", "ICMP_CHECKSUM_FAILS", + "UDP_CHECKSUM_FAILS", "TCP_CHECKSUM_FAILS", + "DMA_TIMEOUT", "PORT_NOT_AVAILABLE", + "ARP_IP_NOT_MATCHED", "EAPol_PACKET_FAILURE"}; + +// Network Functions +void Network_Init(void) +{ + ETH_Init(); + ARPV4_Init(); + IPV4_Init(); + DHCP_init(); + rtcc_init(); + Network_WaitForLink(); + timersInit(); + #ifdef ENABLE_NETWORK_DEBUG + LOG_Init(); + #endif +} + +void timersInit(void) +{ + time(&arpTimer); + arpTimer += 10; +} + +void Network_WaitForLink(void) +{ + while(!ETH_CheckLinkUp()) NOP(); +} + +void Network_Manage(void) +{ + time_t now; + static time_t nowPv = 0; + + ETH_EventHandler(); + Network_Read(); // handle any packets that have arrived... + DHCP_Manage(); // update the DHCP status every second + + // manage any outstanding timeouts + time(&now); + if(now >= arpTimer) + { + ARPV4_Update(); + arpTimer = now + 10; + } + if(now > nowPv) // at least 1 second has elapsed + { + // is defined as a minimum of 1 seconds in RFC973 + } + nowPv = now; +} + +void Network_Read(void) +{ + ethernetFrame_t header; + char debug_str[80]; + + if(ETH_packetReady()) + { + ETH_NextPacketUpdate(); + ETH_ReadBlock((char *)&header, sizeof(header)); + header.id.type = ntohs(header.id.type); // reverse the type field + Network_SaveStartPosition(); + switch (header.id.type) + { + case ETHERTYPE_VLAN: + logMsg("VLAN Packet Dropped", LOG_INFO, (LOG_DEST_CONSOLE|LOG_DEST_ETHERNET)); + break; + case ETHERTYPE_ARP: + logMsg("RX ARPV4 Packet", LOG_INFO, (LOG_DEST_CONSOLE|LOG_DEST_ETHERNET)); + ARPV4_Packet(); + break; + case ETHERTYPE_IPV4: + logMsg("RX IPV4 Packet", LOG_INFO, (LOG_DEST_CONSOLE|LOG_DEST_ETHERNET)); + IPV4_Packet(); + break; + default: + { + long t = header.id.type; + if(t < 0x05dc) // this is a length field + { + sprintf(debug_str,"802.3 length 0x%04lX",t); + } + else + sprintf(debug_str,"802.3 type 0x%04lX",t); + + logMsg(debug_str, LOG_INFO, (LOG_DEST_CONSOLE|LOG_DEST_ETHERNET)); + } + break; + } + ETH_Flush(); + } +} + +static void Network_SaveStartPosition(void) +{ + networkStartPosition = ETH_GetReadPtr(); +} + +uint16_t Network_GetStartPosition(void) +{ + return networkStartPosition; +} diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/rtcc.c b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/rtcc.c new file mode 100644 index 0000000..470d392 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/rtcc.c @@ -0,0 +1,81 @@ +/** + * RTCC Implementation Source File + * + * @file rtcc.c + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for the RTCC. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../rtcc.h" +#include "../../system/system.h" + +// Variables +volatile time_t deviceTime; +volatile bool dirtyTime; + +volatile uint16_t seconds_counter; + +// Local RTCC Function Prototypes + +void rtcc_init(void) +{ + deviceTime = 1293861600; + TCA0_OverflowCallbackRegister(rtcc_handler); +} + +void rtcc_handler(void) +{ + deviceTime++; +} + +void rtcc_set(time_t *t) +{ + volatile uint8_t sreg_val; + sreg_val = SREG; + DISABLE_INTERRUPTS(); + deviceTime = *t; + SREG = sreg_val; +} + +time_t time(time_t *t) +{ + time_t the_time; + + volatile uint8_t sreg_val; + + sreg_val = SREG; + DISABLE_INTERRUPTS(); + the_time = deviceTime; + SREG = sreg_val; + if(t) + { + *t = the_time; + } + + return (the_time); +} + diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/udpv4.c b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/udpv4.c new file mode 100644 index 0000000..e4c7fda --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/udpv4.c @@ -0,0 +1,138 @@ +/** + * UDP Protocol v4 Source File + * + * @file udpv4.c + * + * @ingroup udp + * + * @brief This file provides the API implementation for the User Datagram Protocol version 4 (UDP v4). + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include +#include +#include "../ipv4.h" +#include "../udpv4.h" +#include "../udpv4_port_handler_table.h" +#include "../network.h" +#include "../../ethernet/physical_layer_interface.h" +#include "../tcpip_types.h" + +// Variables +uint16_t destPort; +udpHeader_t udpHeader; + +// UDP Library Functions +error_msg UDP_Start(uint32_t destIP, uint16_t srcPort, uint16_t dstPort) +{ + // Start a UDP Packet to Write UDP Header + error_msg ret = ERROR; + + // Start IPv4 Packet to Write IPv4 Header + ret = IPv4_Start(destIP,UDP_TCPIP); + if(ret == SUCCESS) + { + //Start to Count the UDP payload length Bytes + ETH_ResetByteCount(); + + // Write UDP Source Port + ETH_Write16(srcPort); + + //Write UDP Destination Port + ETH_Write16(dstPort); + + //Write DataLength; Initially set to '0' + ETH_Write16(0); + + //Write UDP Checksum; Initially set to '0' + ETH_Write16(0); + + } + return ret; +} + +error_msg UDP_Send(void) +{ + uint16_t udpLength; + uint16_t cksm; + error_msg ret = ERROR; + + udpLength = ETH_GetByteCount(); + udpLength = ntohs(udpLength); + ETH_Insert((char *)&udpLength, 2, sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) + offsetof(udpHeader_t,length)); + udpLength = htons(udpLength); + + // add the UDP header checksum + cksm = udpLength + UDP_TCPIP; + cksm = ETH_TxComputeChecksum(sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) - 8, udpLength + 8, cksm); + + // if the computed checksum is "0" set it to 0xFFFF + if (cksm == 0){ + cksm = 0xffff; + } + ETH_Insert((char *)&cksm, 2, sizeof(ethernetFrame_t) + sizeof(ipv4Header_t) + offsetof(udpHeader_t,checksum)); + + ret = IPV4_Send(udpLength); + + return ret; +} + +error_msg UDP_Receive(uint16_t udpcksm) +{ + error_msg ret = ERROR; + udp_table_iterator_t hptr; + + ETH_ReadBlock((char *)&udpHeader,sizeof(udpHeader)); + + if((udpHeader.checksum == 0) || (udpcksm == 0)) + { + udpHeader.dstPort = ntohs(udpHeader.dstPort); // reverse the port number + destPort = ntohs(udpHeader.srcPort); + udpHeader.length = ntohs(udpHeader.length); + ret = PORT_NOT_AVAILABLE; + // scan the udp port handlers and find a match. + // call the port handler callback on a match + hptr = udp_table_getIterator(); + + while(hptr != NULL) + { + if(hptr->portNumber == udpHeader.dstPort) + { + if(udpHeader.length == IPV4_GetDatagramLength()) + { + hptr->callBack((int16_t)(udpHeader.length - sizeof(udpHeader))); + } + ret = SUCCESS; + break; + } + hptr = udp_table_nextEntry(hptr); + } + if(ret== PORT_NOT_AVAILABLE) + { + } + } + else + { + ret = UDP_CHECKSUM_FAILS; + } + return ret; +} diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c new file mode 100644 index 0000000..d727d5d --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c @@ -0,0 +1,59 @@ +/** + * UDP Port Handler Source File + * + * @file udpv4_port_handler_table.c + * + * @ingroup udp + * + * @brief This file provides the API implementation for the UDP v4 protocol. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +// Included Files +#include +#include "../tcpip_config.h" +#include "../dhcp_client.h" +#include "../udpv4_port_handler_table.h" +#include "../../../app_files/udp_demo.h" + +const udp_handler_t UDP_CallBackTable[] = \ +{ + {65531, UDP_Demo_Recv}, + {68, DHCP_Handler}, + +}; + +// UDPV4 Port Handler Functions +udp_table_iterator_t udp_table_getIterator(void) +{ + if (sizeof(UDP_CallBackTable) == 0) + return (udp_table_iterator_t) NULL; + else + return (udp_table_iterator_t) UDP_CallBackTable; +} + +udp_table_iterator_t udp_table_nextEntry(udp_table_iterator_t i) +{ + i++; + if(i < UDP_CallBackTable + sizeof(UDP_CallBackTable)) + return (udp_table_iterator_t) i; + else + return (udp_table_iterator_t) NULL; +} diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/tcpip_config.h b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/tcpip_config.h new file mode 100644 index 0000000..d2e67e2 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/tcpip_config.h @@ -0,0 +1,104 @@ +/** + * TCP/IP Stack User Configuration Options Header File + * + * @file tcpip_config.h + * + * @ingroup tcpiplite + * + * @brief This file provides the API implementation for the TCP/IP Stack user configuration options. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef TCPIP_CONFIG_H +#define TCPIP_CONFIG_H + +// Macros +/** + * @ingroup tcpiplite + * @def MAKE_IPV4_ADDRESS(a,b,c,d) + * @brief Build the IPv4 Address +*/ +#define MAKE_IPV4_ADDRESS(a,b,c,d) ((uint32_t)(((uint32_t)a << 24) | ((uint32_t)b<<16) | ((uint32_t)c << 8) | (uint32_t)d)) + +// ARP Protocol Defines +#define ARP_MAP_SIZE 8 + +// DHCP Protocol Defines +extern const char dhcpName[]; + +/** + * @ingroup tcpiplite + * @def DHCP_NAME_SIZE + * @brief Required since sizeof is not handled during the preprocessor stage + */ +#define DHCP_NAME_SIZE 18 + + +// IP Protocol Defines +#define IPv4_TTL 64u + +// TCP Protocol Defines +/** + * @ingroup tcpiplite + * @def TCP_MAX_SEG_SIZE + * @brief TCP maximum segment size + */ +#define TCP_MAX_SEG_SIZE 1460u +#define TICK_SECOND 1 + +/** + * @ingroup tcpiplite + * @def TCP_START_TIMEOUT_VAL + * @brief Time-out to retransmit unacked data + * + */ +#define TCP_START_TIMEOUT_VAL ((unsigned long)TICK_SECOND*2) + +/** + * @ingroup tcpiplite + * @def TCP_MAX_RETRIES + * @brief Number of retransmission attempts + */ +#define TCP_MAX_RETRIES (5u) + +/** + * @ingroup tcpiplite + * @def TCP_MAX_SYN_RETRIES + * @brief than all other retries to reduce SYN flood DoS duration + */ +#define TCP_MAX_SYN_RETRIES (3u) + +/** + * @ingroup tcpiplite + * @def LOCAL_TCP_PORT_START_NUMBER + * @brief The lower port number to be used as a local port + */ +#define LOCAL_TCP_PORT_START_NUMBER (1024u) + +/** + * @ingroup tcpiplite + * @def LOCAL_TCP_PORT_END_NUMBER + * @brief The highest port number to be used as a local port + */ +#define LOCAL_TCP_PORT_END_NUMBER (65535u) + +// Neighbor Discovery Protocol Defines + +#endif /* TCPIP_CONFIG_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/tcpip_types.h b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/tcpip_types.h new file mode 100644 index 0000000..2395713 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/tcpip_types.h @@ -0,0 +1,527 @@ +/** + * TCP/IP Stack User Types Header File + * + * @file tcpip_types.h + * + * @ingroup tcpiplite + * + * @brief This file provides the TCP/IP Stack type definitions. + * + * @version TCP/IP Lite Driver Version 5.0.0 + */ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef TCPIP_TYPES_H +#define TCPIP_TYPES_H + +// Included Files +#include + +typedef enum +{ + TCB_ERROR = -1, + TCB_NO_ERROR = 0 +} tcbError_t; + +/** + * @ingroup tcpiplite + * @struct ethernetFrame_t + * @brief Ethernet frame information. + */ +typedef struct +{ + uint8_t destinationMAC[6]; + uint8_t sourceMAC[6]; + union + { + uint16_t type; /**< Ethernet 2 frame type, 802.3 length, 802.1Q TPID */ + uint16_t length; + uint16_t tpid; + } id; + // if tpid == 0x8100 then TCI structure goes here + // if tpid != 0x8100, then ethertype/length goes here + // UP to 1500 Bytes of payload goes here + // 32 bit checksum goes here +} ethernetFrame_t; + +#define ETHERTYPE_IPV4 0x0800 +#define ETHERTYPE_ARP 0x0806 +#define ETHERTYPE_IPV6 0x86DD +#define ETHERTYPE_VLAN 0x8100 +#define ETHERTYPE_LLDP 0x88CC +#define ETHERTYPE_EAPoL 0x888E + +// From RFC 2851 +#define INETADDRESSTYPE_IPV4 1 +#define INETADDRESSTYPE_IPV6 2 +#define INETADDRESSTYPE_DNS 16 + +#define ETHERNET_ADDR_LEN 6 +#define IP_ADDR_LEN 4 + +// From RFC 3493 +// Supported address families +#ifndef AF_INET6 +/** + * @ingroup tcpiplite + * @def AF_INET + * @brief Internet IP Protocol + */ +#define AF_INET 2 +#endif + +#ifndef AF_INET6 +/** + * @ingroup tcpiplite + * @def AF_INET6 + * @brief IP version 6 + */ +#define AF_INET6 10 +#endif + +#ifndef PF_INET +/** + * @ingroup tcpiplite + * @def PF_INET + * @brief Protocol families, same as address families + */ +#define PF_INET AF_INET +#endif + +#ifndef PF_INET6 +#define PF_INET6 AF_INET6 +#endif + +#ifndef IN6ADDR_ANY_INIT +#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } } +#endif + +#ifndef IN6ADDR_LOOPBACK_INIT +#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } } +#endif + +#ifndef INET_ADDRSTRLEN +/** + * @ingroup tcpiplite + * @def INET_ADDRSTRLEN + * @brief Length of the string form for IP + */ +#define INET_ADDRSTRLEN 16 +#endif + +#ifndef INET6_ADDRSTRLEN +/** + * @ingroup tcpiplite + * @def INET6_ADDRSTRLEN + * @brief Length of the string form for IPv6 + */ +#define INET6_ADDRSTRLEN 46 +#endif + +/** + * @ingroup tcpiplite + * @struct ipv4Header_t + * @brief IPv4 header information + */ +typedef struct +{ + unsigned ihl : 4; /**< Internet header length in 32-bit words */ + unsigned version : 4; /**< 4 for IPV4 */ + unsigned ecn : 2; /**< Explicit Congestion Notification RFC3168 */ + unsigned dscp : 6; /**< Differentiated Service Code Point RFC3260 */ + uint16_t length; /**< Total length including header and data (no more than 576 octets) */ + uint16_t identifcation; /**< ID for packet fragments */ + unsigned fragmentOffsetHigh : 5; /**< Offset for a fragment, needed for reassembly */ + unsigned : 1; /**< Leave this bit as zero */ + unsigned dontFragment : 1; /**< Drop if fragmentation is required to route */ + unsigned moreFragments : 1; /**< Fragments have this bit set (except for the final packet) */ + uint8_t fragmentOffsetLow; /**< Low byte for the fragment offset */ + uint8_t timeToLive; /**< Decrement at each hop and discard when zero */ + uint8_t protocol; /**< IP Protocol (from RFC790) */ + uint16_t headerCksm; /**< RFC1071 defines this calculation */ + uint32_t srcIpAddress; /**< Source IP Address */ + uint32_t dstIpAddress; /**< Destination IP Address */ + /* options could go here if IHL > 5 */ + /* payload goes here */ +} ipv4Header_t; + +/** + * @ingroup tcpiplite + * @struct ipv4_pseudo_header_t + * @brief Pseudo header used for checksum calculation on UDP and TCP + */ +typedef struct +{ + uint32_t srcIpAddress; /**< Source IP Address */ + uint32_t dstIpAddress; /**< Destination IP Address */ + uint8_t protocol; /**< Protocol */ + uint8_t z; /**< Used for memory cleaning */ + uint16_t length; /**< Length */ +} ipv4_pseudo_header_t; + +/** + * @ingroup tcpiplite + * @struct icmpHeader_t + * @brief ICMP header information + */ +typedef struct +{ + union + { + uint16_t typeCode; + struct + { + uint8_t code; + uint8_t type; + }; + }; + uint16_t checksum; +} icmpHeader_t; + + +/** + * @ingroup tcpiplite + * @enum icmpTypeCodes_t + * @brief ICMP Types and Codes + */ +typedef enum +{ + ECHO_REPLY = 0x0000, /**< Echo reply */ + DEST_NETWORK_UNREACHABLE = 0x0300, /**< Destination network unreachable */ + DEST_HOST_UNREACHABLE = 0x0301, /**< Destination host unreachable */ + DEST_PROTOCOL_UNREACHABLE = 0x0302, /**< Destination protocol unreachable */ + DEST_PORT_UNREACHABLE = 0x0303, /**< Destination port unreachable */ + FRAGMENTATION_REQUIRED = 0x0304, /**< Fragmentation required */ + SOURCE_ROUTE_FAILED = 0x0305, /**< Fragmentation failed */ + DESTINATION_NETWORK_UNKNOWN = 0x0306, /**< Unknown destination network */ + SOURCE_HOST_ISOLATED = 0x0307, /**< Source host isolated */ + NETWORK_ADMINISTRATIVELY_PROHIBITED = 0x0308, /**< Network administratively prohibited */ + HOST_ADMINISTRATIVELY_PROHIBITED = 0x0309, /**< Host administratively prohibited */ + NETWORK_UNREACHABLE_FOR_TOS = 0x030A, /**< Network unreachable for TOS */ + HOST_UNREACHABLE_FOR_TOS = 0x030B, /**< Host unreachable for TOS */ + COMMUNICATION_ADMINISTRATIVELY_PROHIBITED = 0x030C, /**< Communication administratively prohibited */ + HOST_PRECEDENCE_VIOLATION = 0x030D, /**< Host precedence violation */ + PRECEDENCE_CUTOFF_IN_EFFECT = 0x030E, /**< Precedence cutoff in effect */ + SOURCE_QUENCH = 0x0400, /**< Source quench */ + REDIRECT_DATAGRAM_FOR_THE_NETWORK = 0x0500, /**< Redirect message for the network*/ + REDIRECT_DATAGRAM_FOR_THE_HOST = 0x0501, /**< Redirect message for the host*/ + REDIRECT_DATAGRAM_FOR_THE_TOS_AND_NETWORK = 0x0502, /**< Redirect message for the TOS and network*/ + REDIRECT_DATAGRAM_FOR_THE_TOS_AND_HOST = 0x0503, /**< Redirect message for the TOS and host*/ + ALTERNATE_HOST_ADDRESS = 0x0600, /**< Alternate host address */ + ECHO_REQUEST = 0x0800, /**< Echo Request: Ask for a ping! */ + UNASSIGNED_ECHO_TYPE_CODE_REQUEST_1 = 0x082A, /**< Unassigned codes */ + UNASSIGNED_ECHO_TYPE_CODE_REQUEST_2 = 0x08FC, /**< Unassigned codes */ + ROUTER_ADVERTISEMENT = 0x0900, /**< Router advertisement */ + ROUTER_SOLICITATION = 0x0A00, /**< Router solicitaion */ + TRACEROUTE = 0x3000 /**< Trace route */ +} icmpTypeCodes_t; + +/** + * @ingroup tcpiplite + * @struct udpHeader_t + * @brief UDP header information + */ +typedef struct +{ + uint16_t srcPort; /**< Source Port */ + uint16_t dstPort; /**< Destination Port */ + uint16_t length; /**< Length */ + uint16_t checksum; /**< Checksum */ +} udpHeader_t; + +/** + * @ingroup tcpiplite + * @struct tcpHeader_t + * @brief TCP header information + */ +typedef struct +{ + uint16_t sourcePort; /**< Source port */ + uint16_t destPort; /**< Destination port */ + uint32_t sequenceNumber; /**< Sequence number */ + uint32_t ackNumber; /**< ACK Number */ + union + { + uint8_t byte13; + struct + { + uint8_t ns : 1; /**< ECN-nonce concealment protection (added to header by RFC 3540). */ + uint8_t reserved : 3; /**< For future use and needs to be set to zero. */ + uint8_t dataOffset : 4; /**< Specifies the size of the TCP header in 32-bit words. */ + }; + }; + + union + { + uint8_t flags; /**< Flags */ + struct + { + uint8_t fin : 1; /**< No more data from sender. */ + uint8_t syn : 1; /**< Synchronizes sequence numbers. Only the first packet sent from each end must have this flag set. */ + uint8_t rst : 1; /**< Resets the connection. */ + uint8_t psh : 1; /**< Asks to push the buffered data to the receiving application. */ + uint8_t ack : 1; /**< Indicates that the ACKfield is significant. */ + uint8_t urg : 1; /**< Indicates that the Urgent pointer field is significant. */ + uint8_t ece : 1; /**< ECN-Echo. Depends on SYN flag set or clear. */ + uint8_t cwr : 1; /**< Congestion Window Reduced (CWR) (added to header by RFC 3168). */ + }; + }; + + uint16_t windowSize; /**< Window size. */ + uint16_t checksum; /**< TCP Header Checksum. */ + uint16_t urgentPtr; /**< Urgent pointer. */ + // Options follow here + // Pad the header so the total header is a multiple of 4 bytes + // Data follows +} tcpHeader_t; + + +/** + * @ingroup tcpiplite + * @enum ipProtocolNumbers + * @brief IP Protocol Numbers. + * List from RFC5237 http://www.iana.org/assignments/protocol-numbers/protocol-numbers.txt + */ +typedef enum { +// Keyword Decimal Protocol Reference + HOPOPT_TCPIP = 0, /**< IPv6 Hop-by-Hop Option [RFC2460] */ + ICMP_TCPIP = 1, /**< Internet Control Message [RFC792] */ + IGMP_TCPIP = 2, /**< Internet Group Management [RFC1112] */ + GGP_TCPIP = 3, /**< Gateway-to-Gateway [RFC823] */ + IPV4_TCPIP = 4, /**< IPv4 encapsulation [RFC2003] */ + ST_TCPIP = 5, /**< Stream [RFC1190][RFC1819] */ + TCP_TCPIP = 6, /**< Transmission Control [RFC793] */ + CBT_TCPIP = 7, /**< CBT [Tony_Ballardie] */ + EGP_TCPIP = 8, /**< Exterior Gateway Protocol [RFC888][David_Mills] */ + IGP_TCPIP = 9, /**< Any private interior gateway (used by Cisco for their IGRP) [Internet_Assigned_Numbers_Authority] */ + BBN_RCC_MON_TCPIP = 10, /**< BBN RCC Monitoring [Steve_Chipman] */ + NVP_II_TCPIP = 11, /**< Network Voice Protocol [RFC741][Steve_Casner] */ + PUP_TCPIP = 12, /**< PUP [Boggs, D., J. Shoch, E. Taft, and R. Metcalfe, "PUP: An Internetwork Architecture", XEROX Palo Alto Research Center, CSL-79-10, July 1979; also in IEEE Transactions on Communication, Volume COM-28, Number 4, April 1980.][[XEROX]] */ + ARGUS_TCPIP = 13, /**< ARGUS [Robert_W_Scheifler] */ + EMCON_TCPIP = 14, /**< EMCON [] */ + XNET_TCPIP = 15, /**< Cross Net Debugger [Haverty, J., "XNET Formats for Internet Protocol Version 4", IEN 158, October 1980.][Jack_Haverty] */ + CHAOS_TCPIP = 16, /**< Chaos [J_Noel_Chiappa] */ + UDP_TCPIP = 17, /**< User Datagram [RFC768][Jon_Postel] */ + MUX_TCPIP = 18, /**< Multiplexing [Cohen, D. and J. Postel, "Multiplexing Protocol", IEN 90, USC/Information Sciences Institute, May 1979.][Jon_Postel] */ + DCN_MEAS_TCPIP = 19, /**< DCN Measurement Subsystems [David_Mills] */ + HMP_TCPIP = 20, /**< Host Monitoring [RFC869][Robert_Hinden] */ + PRM_TCPIP = 21, /**< Packet Radio Measurement [Zaw_Sing_Su] */ + XNS_IDP_TCPIP = 22, /**< XEROX NS IDP ["The Ethernet, A Local Area Network: Data Link Layer and Physical Layer Specification", AA-K759B-TK, Digital Equipment Corporation, Maynard, MA. Also as: "The Ethernet - A Local Area Network", Version 1.0, Digital Equipment Corporation, Intel Corporation, Xerox Corporation, September 1980. And: "The Ethernet, A Local Area Network: Data Link Layer and Physical Layer Specifications", Digital, Intel and Xerox, November 1982. And: XEROX, "The Ethernet, A Local Area Network: Data Link Layer and Physical Layer Specification", X3T51/80-50, Xerox Corporation, Stamford, CT., October 1980.][[XEROX]] */ + TRUNK_1_TCPIP = 23, /**< Trunk-1 [Barry_Boehm] */ + TRUNK_2_TCPIP = 24, /**< Trunk-2 [Barry_Boehm] */ + LEAF_1_TCPIP = 25, /**< Leaf-1 [Barry_Boehm] */ + LEAF_2_TCPIP = 26, /**< Leaf-2 [Barry_Boehm] */ + RDP_TCPIP = 27, /**< Reliable Data Protocol [RFC908][Robert_Hinden] */ + IRTP_TCPIP = 28, /**< Internet Reliable Transaction [RFC938][Trudy_Miller] */ + ISO_TP4_TCPIP = 29, /**< ISO Transport Protocol Class 4 [RFC905][] */ + NETBLT_TCPIP = 30, /**< Bulk Data Transfer Protocol [RFC969][David_Clark] */ + MFE_NSP_TCPIP = 31, /**< MFE Network Services Protocol [Shuttleworth, B., "A Documentary of MFENet, a National Computer Network", UCRL-52317, Lawrence Livermore Labs, Livermore, California, June 1977.][Barry_Howard] */ + MERIT_INP_TCPIP = 32, /**< MERIT Internodal Protocol [Hans_Werner_Braun] */ + DCCP_TCPIP = 33, /**< Datagram Congestion Control Protocol [RFC4340] */ + THREEPC_TCPIP = 34, /**< Third Party Connect Protocol [Stuart_A_Friedberg] */ + IDPR_TCPIP = 35, /**< Inter-Domain Policy Routing Protocol [Martha_Steenstrup] */ + XTP_TCPIP = 36, /**< XTP [Greg_Chesson] */ + DDP_TCPIP = 37, /**< Datagram Delivery Protocol [Wesley_Craig] */ + IDPR_CMTP_TCPIP = 38, /**< IDPR Control Message Transport Proto [Martha_Steenstrup] */ + TPpp_TCPIP = 39, /**< TP++ Transport Protocol [Dirk_Fromhein] */ + IL_TCPIP = 40, /**< IL Transport Protocol [Dave_Presotto] */ + IPV6_TUNNEL_TCPIP = 41, /**< IPv6 encapsulation [RFC2473] */ + SDRP_TCPIP = 42, /**< Source Demand Routing Protocol [Deborah_Estrin] */ + IPV6_Route_TCPIP = 43, /**< Routing Header for IPv6 [Steve_Deering] */ + IPV6_Frag_TCPIP = 44, /**< Fragment Header for IPv6 [Steve_Deering] */ + IDRP_TCPIP = 45, /**< Inter-Domain Routing Protocol [Sue_Hares] */ + RSVP_TCPIP = 46, /**< Reservation Protocol [RFC2205][RFC3209][Bob_Braden] */ + GRE_TCPIP = 47, /**< Generic Routing Encapsulation [RFC1701][Tony_Li] */ + DSR_TCPIP = 48, /**< Dynamic Source Routing Protocol [RFC4728] */ + BNA_TCPIP = 49, /**< BNA [Gary Salamon] */ + ESP_TCPIP = 50, /**< Encap Security Payload RFC4303] */ + AH_TCPIP = 51, /**< Authentication Header [RFC4302] */ + I_NLSP_TCPIP = 52, /**< Integrated Net Layer Security TUBA [K_Robert_Glenn] */ + SWIPE_TCPIP = 53, /**< IP with Encryption [John_Ioannidis] */ + NARP_TCPIP = 54, /**< NBMA Address Resolution Protocol [RFC1735] */ + MOBILE_TCPIP = 55, /**< IP Mobility [Charlie_Perkins] */ + TLSP_TCPIP = 56, /**< Transport Layer Security Protocol using Kryptonet key management [Christer_Oberg] */ + SKIP_TCPIP = 57, /**< SKIP [Tom_Markson] */ + IPV6_ICMP_TCPIP = 58, /**< ICMP for IPv6 [RFC2460] */ + IPV6_NoNxt_TCPIP = 59, /**< No Next Header for IPv6 [RFC2460] */ + IPV6_Opts_TCPIP = 60, /**< Destination Options for IPv6 [RFC2460] */ + CFTP_TCPIP = 62, /**< CFTP [Forsdick, H., "CFTP", Network Message, Bolt Beranek and Newman, January 1982.][Harry_Forsdick] */ + SAT_EXPAK_TCPIP = 64, /**< SATNET and Backroom EXPAK [Steven_Blumenthal] */ + KRYPTOLAN_TCPIP = 65, /**< Kryptolan [Paul Liu] */ + RVD_TCPIP = 66, /**< MIT Remote Virtual Disk Protocol [Michael_Greenwald] */ + IPPC_TCPIP = 67, /**< Internet Pluribus Packet Core [Steven_Blumenthal] */ + SAT_MON_TCPIP = 69, /**< SATNET Monitoring [Steven_Blumenthal] */ + VISA_TCPIP = 70, /**< VISA Protocol [Gene_Tsudik] */ + IPCV_TCPIP = 71, /**< Internet Packet Core Utility [Steven_Blumenthal] */ + CPNX_TCPIP = 72, /**< Computer Protocol Network Executive [David Mittnacht] */ + CPHB_TCPIP = 73, /**< Computer Protocol Heart Beat [David Mittnacht] */ + WSN_TCPIP = 74, /**< Wang Span Network [Victor Dafoulas] */ + PVP_TCPIP = 75, /**< Packet Video Protocol [Steve_Casner] */ + BR_SAT_MON_TCPIP = 76, /**< Backroom SATNET Monitoring [Steven_Blumenthal] */ + SUN_ND_TCPIP = 77, /**< SUN ND PROTOCOL-Temporary [William_Melohn] */ + WB_MON_TCPIP = 78, /**< WIDEBAND Monitoring [Steven_Blumenthal] */ + WB_EXPAK_TCPIP = 79, /**< WIDEBAND EXPAK [Steven_Blumenthal] */ + ISO_IP_TCPIP = 80, /**< ISO Internet Protocol [Marshall_T_Rose] */ + VMTP_TCPIP = 81, /**< VMTP [Dave_Cheriton] */ + SECURE_VMTP_TCPIP = 82, /**< SECURE-VMTP [Dave_Cheriton] */ + VINES_TCPIP = 83, /**< VINES [Brian Horn] */ + TTP_TCPIP = 84, /**< TTP [Jim_Stevens] */ + IPTM_TCPIP = 84, /**< Protocol Internet Protocol Traffic Manager [Jim_Stevens] */ + NSFNET_IGP_TCPIP = 85, /**< NSFNET-IGP [Hans_Werner_Braun] */ + DGP_TCPIP = 86, /**< Dissimilar Gateway Protocol [M/A-COM Government Systems, "Dissimilar Gateway Protocol Specification, Draft Version", Contract no. CS901145, November 16, 1987.][Mike_Little] */ + TCF_TCPIP = 87, /**< TCF [Guillermo_A_Loyola] */ + EIGRP_TCPIP = 88, /**< EIGRP [Cisco Systems, "Gateway Server Reference Manual", Manual Revision B, January 10, 1988.][Guenther_Schreiner] */ + OSPFIGP_TCPIP = 89, /**< OSPFIGP [RFC1583][RFC2328][RFC5340][John_Moy] */ + Sprite_RPC_TCPIP = 90, /**< Sprite RPC Protocol [Welch, B., "The Sprite Remote Procedure Call System", Technical Report, UCB/Computer Science Dept., 86/302, University of California at Berkeley, June 1986.][Bruce Willins] */ + LARP_TCPIP = 91, /**< Locus Address Resolution Protocol [Brian Horn] */ + MTP_TCPIP = 92, /**< Multicast Transport Protocol [Susie_Armstrong] */ + AX25_TCPIP = 93, /**< AX.25 Frames [Brian_Kantor] */ + IPIP_TCPIP = 94, /**< IP-within-IP Encapsulation Protocol [John_Ioannidis] */ + MICP_TCPIP = 95, /**< Mobile Internetworking Control Pro. [John_Ioannidis] */ + SCC_SP_TCPIP = 96, /**< Semaphore Communications Sec. Pro. [Howard_Hart] */ + ETHERIP_TCPIP = 97, /**< Ethernet-within-IP Encapsulation [RFC3378] */ + ENCAP_TCPIP = 98, /**< Encapsulation Header [RFC1241][Robert_Woodburn] */ + GMTP_TCPIP = 100, /**< GMTP [[RXB5]] */ + IFMP_TCPIP = 101, /**< Ipsilon Flow Management Protocol [Bob_Hinden][November 1995, 1997.] */ + PNNI_TCPIP = 102, /**< PNNI over IP [Ross_Callon] */ + PIM_TCPIP = 103, /**< Protocol Independent Multicast [RFC4601][Dino_Farinacci] */ + ARIS_TCPIP = 104, /**< ARIS [Nancy_Feldman] */ + SCPS_TCPIP = 105, /**< SCPS [Robert_Durst] */ + QNX_TCPIP = 106, /**< QNX [Michael_Hunter] */ + A_N_TCPIP = 107, /**< Active Networks [Bob_Braden] */ + IPComp_TCPIP = 108, /**< IP Payload Compression Protocol [RFC2393] */ + SNP_TCPIP = 109, /**< Sitara Networks Protocol [Manickam_R_Sridhar] */ + Compaq_Peer_TCPIP = 110, /**< Compaq Peer Protocol [Victor_Volpe] */ + IPX_in_IP_TCPIP = 111, /**< IPX in IP [CJ_Lee] */ + VRRP_TCPIP = 112, /**< Virtual Router Redundancy Protocol [RFC5798] */ + PGM_TCPIP = 113, /**< PGM Reliable Transport Protocol [Tony_Speakman] */ + L2TP_TCPIP = 115, /**< Layer Two Tunneling Protocol [RFC3931][Bernard_Aboba] */ + DDX_TCPIP = 116, /**< D-II Data Exchange (DDX) [John_Worley] */ + IATP_TCPIP = 117, /**< Interactive Agent Transfer Protocol [John_Murphy] */ + STP_TCPIP = 118, /**< Schedule Transfer Protocol [Jean_Michel_Pittet] */ + SRP_TCPIP = 119, /**< SpectraLink Radio Protocol [Mark_Hamilton] */ + UTI_TCPIP = 120, /**< UTI [Peter_Lothberg] */ + SMP_TCPIP = 121, /**< Simple Message Protocol [Leif_Ekblad] */ + SM_TCPIP = 122, /**< SM [Jon_Crowcroft] */ + PTP_TCPIP = 123, /**< Performance Transparency Protocol [Michael_Welzl] */ + ISIS_TCPIP = 124, /**< Over IPv4 [Tony_Przygienda] */ + FIRE_TCPIP = 125, /**< [Criag_Partridge] */ + CRTP_TCPIP = 126, /**< Combat Radio Transport Protocol [Robert_Sautter] */ + CRUDP_TCPIP = 127, /**< Combat Radio User Datagram [Robert_Sautter] */ + SSCOPMCE_TCPIP = 128, /**< [Kurt_Waber] */ + IPLT_TCPIP = 129, /**< [[Hollbach]] */ + SPS_TCPIP = 130, /**< Secure Packet Shield [Bill_McIntosh] */ + PIPE_TCPIP = 131, /**< Private IP Encapsulation within IP [Bernhard_Petri] */ + SCTP_TCPIP = 132, /**< Stream Control Transmission Protocol [Randall_R_Stewart] */ + FC_TCPIP = 133 /**< Fibre Channel [Murali_Rajagopal][RFC6172] */ +} ipProtocolNumbers; + +/** + * @ingroup tcpiplite + * @struct inAddr_t + * @brief INET address + */ +typedef struct +{ + union + { + uint32_t s_addr; + uint8_t s_addr_byte[4]; + }; +} inAddr_t; + + +/** + * @ingroup tcpiplite + * @struct sockaddr_in4_t + * @brief INET4 socket address + */ +typedef struct +{ + uint16_t port; + inAddr_t addr; +} sockaddr_in4_t; + + +extern const char *network_errors[]; + +/** + * @ingroup tcpiplite + * @enum error_msg + * @brief Error message + */ +typedef enum +{ + ERROR = 0, + SUCCESS, + LINK_NOT_FOUND, + BUFFER_BUSY, + TX_LOGIC_NOT_IDLE, + TX_QUEUED, + DMA_TIMEOUT, + MAC_NOT_FOUND, + IP_WRONG_VERSION, + IPV4_CHECKSUM_FAILS, + DEST_IP_NOT_MATCHED, + ICMP_CHECKSUM_FAILS, + UDP_CHECKSUM_FAILS, + TCP_CHECKSUM_FAILS, + PORT_NOT_AVAILABLE, + ARP_IP_NOT_MATCHED, + EAPoL_PACKET_FAILURE, + INCORRECT_IPV4_HLEN, + IPV4_NO_OPTIONS, + IPV6_CHECKSUM_FAILS, + IPV6_LOCAL_ADDR_RESOLVE, + IPV6_LOCAL_ADDR_INVALID, + NO_GATEWAY, + ADDRESS_RESOLUTION, + GLOBAL_DESTINATION, + ARP_WRONG_HARDWARE_ADDR_TYPE, + ARP_WRONG_PROTOCOL_TYPE, + ARP_WRONG_HARDWARE_ADDR_LEN, + ARP_WRONG_PROTOCOL_LEN +} error_msg; + +/** + * @ingroup tcpiplite + * @enum destIP_t + * @brief Destination IP Address + */ +typedef struct +{ + inAddr_t dest_addr; +} destIP_t; + +/** + * @ingroup tcpiplite + * @typedef int8_t + * @brief Counts up to 256 sockets numbers. + */ +typedef int8_t socklistsize_t; + +/** + * @ingroup tcpiplite + * @typedef ip_receive_function_ptr + * @brief Function pointer to the function that receives the payload + * @param int16_t Available bytes for the payload + * @return None. + */ +typedef void (*ip_receive_function_ptr)(int16_t); + +#endif /* TCPIP_TYPES_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/udpv4.h b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/udpv4.h new file mode 100644 index 0000000..0393534 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/udpv4.h @@ -0,0 +1,89 @@ +/** + * UDP v4 Protocol Header File + * + * @file udpv4.h + * + * @defgroup udp UDP + * + * @brief This file provides the API implementation for UDP v4. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef UDPV4_H +#define UDPV4_H + +// Included Files +#include +#include "tcpip_types.h" +#include "../ethernet/physical_layer_interface.h" + +// Variables +extern uint16_t destPort; +extern udpHeader_t udpHeader; +extern ipv4Header_t ipv4Header; + +// Macros +#define UDP_ReadBlock(data,length) ETH_ReadBlock(data,length) +#define UDP_Read8() ETH_Read8() +#define UDP_Read16() ETH_Read16() +#define UDP_Read24() ETH_Read24() +#define UDP_Read32() ETH_Read32() +#define UDP_Write8(data) ETH_Write8(data) +#define UDP_Write16(data) ETH_Write16(data) +#define UDP_Write24(data) ETH_Write24(data) +#define UDP_Write32(data) ETH_Write32(data) +#define UDP_WriteBlock(data,length) ETH_WriteBlock(data,length) +#define UDP_WriteString(data) ETH_WriteString(data) +#define UDP_GetDestPort() (destPort) +#define UDP_GetSrcPort() (udpHeader.dstPort) +#define UDP_GetDestIP() (ipv4Header.srcIpAddress) +#define UDP_GetSrcIP() (ipv4Header.dstIpAddress) +#define UDP_DataLength() ((udpHeader.length) - 8) +#define UDP_FlushTXPackets() ETH_TxReset() +#define UDP_FlushRxdPacket() ETH_Flush() + +// UDP Library Functions +/** + @ingroup udp + @brief Starts a UDP packet. + @param destIP Destination IP address + @param srcPort Source port + @param dstPort Destination port + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg UDP_Start(uint32_t destIP, uint16_t srcPort, uint16_t dstPort); + +/** + @ingroup udp + @brief Sends a UDP packet. + @param None. + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg UDP_Send(void); + +/** + @ingroup udp + @brief Catches all UDP packets and dispatches them to the appropriate callback. + @param udpcksm UDP Checksum + @return Error status. Refer to the error description in tcpip_types.h. + */ +error_msg UDP_Receive(uint16_t udpcksm); + +#endif /* UDPV4_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/udpv4_port_handler_table.h b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/udpv4_port_handler_table.h new file mode 100644 index 0000000..5df4070 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/tcpiplite/udpv4_port_handler_table.h @@ -0,0 +1,65 @@ +/** + * UDP Port Handler Header File + * + * @file udpv4_port_handler_table.h + * + * @ingroup udp + * + * @brief This file contains the UDP callback table. + * + * @version TCP/IP Lite Driver Version 5.0.0 +*/ +/* + © [2023] Microchip Technology Inc. and its subsidiaries + + Subject to your compliance with these terms, you may use Microchip software and any derivatives + exclusively with Microchip products. You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source software) that may accompany + Microchip software. SOFTWARE IS “AS IS.” NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR + STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON- + INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR + CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED + TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY + LAW, MICROCHIP’S TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + */ + +#ifndef UDPV4_PORT_HANDLER_TABLE_H +#define UDPV4_PORT_HANDLER_TABLE_H + +// Included Files +#include "tcpip_types.h" + +/** + @ingroup udp + @struct udp_handler_t + @brief UDP handler types. + */ +typedef struct +{ + uint16_t portNumber; + ip_receive_function_ptr callBack; +} udp_handler_t; + +typedef const udp_handler_t * udp_table_iterator_t; + +// UDPV4 Port Handler Functions +/** + @ingroup udp + @brief Returns the UDP table iterator. + @param None. + @return Pointer to UDP_CallBackTable. + */ +udp_table_iterator_t udp_table_getIterator(void); + +/** + @ingroup udp + @brief Returns the UDP table next entry. + @param i UDP table iteration + @return Pointer to UDP_CallBackTable. + */ +udp_table_iterator_t udp_table_nextEntry(udp_table_iterator_t i); + +#endif /* UDPV4_PORT_HANDLER_TABLE_H */ diff --git a/enc28j60-avr-udp.X/mcc_generated_files/timer/delay.h b/enc28j60-avr-udp.X/mcc_generated_files/timer/delay.h new file mode 100644 index 0000000..d5320af --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/timer/delay.h @@ -0,0 +1,54 @@ +/** + * DELAY Generated Driver API Header File + * + * @file delay.h + * + * @defgroup delay DELAY BLOCKING DRIVER + * + * @brief This file contains the API to generate delays in the range of milliseconds and microseconds. + * + * @version DELAY Driver Version 1.1.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef _DELAY_H +#define _DELAY_H + +#include + +/** +* @ingroup delay +* @brief Delays the execution of the program for a certain number of milliseconds +* @param[in] milliseconds - Number of milliseconds to delay +* @return None. +*/ +void DELAY_milliseconds(uint16_t milliseconds); + +/** +* @ingroup delay +* @brief Delays the execution of the program for a certain number of microseconds +* @param[in] microseconds - Number of microseconds to delay +* @return None. +*/ +void DELAY_microseconds(uint16_t microseconds); + +#endif // _DELAY_H \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/timer/src/delay.c b/enc28j60-avr-udp.X/mcc_generated_files/timer/src/delay.c new file mode 100644 index 0000000..4da05bc --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/timer/src/delay.c @@ -0,0 +1,54 @@ +/** + * DELAY Generated Driver File + * + * @file delay.c + * + * @ingroup delay + * + * @brief This file contains functions to generate delays in the range of milliseconds and microseconds, using timer ticks to indicate delay length. + * + * @version DELAY Driver Version 1.1.0 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#include "../../system/clock.h" +#include +#include + +void DELAY_milliseconds(uint16_t milliseconds) { + while(milliseconds--){ + _delay_ms(1); + } +} + +void DELAY_microseconds(uint16_t microseconds) { + while( microseconds >= 32) + { + _delay_us(32); + microseconds -= 32; + } + + while(microseconds--) + { + _delay_us(1); + } +} \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/timer/src/tca0.c b/enc28j60-avr-udp.X/mcc_generated_files/timer/src/tca0.c new file mode 100644 index 0000000..2a7a04d --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/timer/src/tca0.c @@ -0,0 +1,259 @@ +/** + * TCA0 Generated Driver File + * + * @file tca0.c + * + * @ingroup tca0_normal + * + * @brief This file contains the API implementations for TCA0 module driver in Normal (16-bit) mode. + * + * @version TCA0 Driver Version 2.1.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#include "../tca0.h" + +const struct TMR_INTERFACE TCA0_Interface = { + .Initialize = TCA0_Initialize, + .Start = TCA0_Start, + .Stop = TCA0_Stop, + .PeriodCountSet = TCA0_Write, + .TimeoutCallbackRegister = TCA0_OverflowCallbackRegister, + .Tasks = NULL +}; + +void TCA0_DefaultCompare0CallbackRegister(void); +void (*TCA0_CMP0_isr_cb)(void) = &TCA0_DefaultCompare0CallbackRegister; +void TCA0_DefaultCompare1CallbackRegister(void); +void (*TCA0_CMP1_isr_cb)(void) = &TCA0_DefaultCompare1CallbackRegister; +void TCA0_DefaultCompare2CallbackRegister(void); +void (*TCA0_CMP2_isr_cb)(void) = &TCA0_DefaultCompare2CallbackRegister; +void TCA0_DefaultOverflowCallbackRegister(void); +void (*TCA0_OVF_isr_cb)(void) = &TCA0_DefaultOverflowCallbackRegister; + +void TCA0_DefaultCompare0CallbackRegister(void) +{ + //Add your ISR code here +} + +void TCA0_DefaultCompare1CallbackRegister(void) +{ + //Add your ISR code here +} + +void TCA0_DefaultCompare2CallbackRegister(void) +{ + //Add your ISR code here +} + +void TCA0_DefaultOverflowCallbackRegister(void) +{ + //Add your ISR code here +} + +void TCA0_OverflowCallbackRegister(TCA0_cb_t cb) +{ + TCA0_OVF_isr_cb = cb; +} + +void TCA0_Compare0CallbackRegister(TCA0_cb_t cb) +{ + TCA0_CMP0_isr_cb = cb; +} + +void TCA0_Compare1CallbackRegister(TCA0_cb_t cb) +{ + TCA0_CMP1_isr_cb = cb; +} + +void TCA0_Compare2CallbackRegister(TCA0_cb_t cb) +{ + TCA0_CMP2_isr_cb = cb; +} + +ISR(TCA0_CMP0_vect) +{ + if (TCA0_CMP0_isr_cb != NULL) + (*TCA0_CMP0_isr_cb)(); + + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP0_bm; +} + +ISR(TCA0_CMP1_vect) +{ + if (TCA0_CMP1_isr_cb != NULL) + (*TCA0_CMP1_isr_cb)(); + + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP1_bm; +} + +ISR(TCA0_CMP2_vect) +{ + if (TCA0_CMP2_isr_cb != NULL) + (*TCA0_CMP2_isr_cb)(); + + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP2_bm; +} + +ISR(TCA0_OVF_vect) +{ + if (TCA0_OVF_isr_cb != NULL) + (*TCA0_OVF_isr_cb)(); + + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm; +} + + +void TCA0_Initialize(void) { + // Compare 0 + TCA0.SINGLE.CMP0 = 0x0; + + // Compare 1 + TCA0.SINGLE.CMP1 = 0x0; + + // Compare 2 + TCA0.SINGLE.CMP2 = 0x0; + + // Count + TCA0.SINGLE.CNT = 0x0; + + // ALUPD disabled; CMP0EN disabled; CMP1EN disabled; CMP2EN disabled; WGMODE NORMAL; + TCA0.SINGLE.CTRLB = 0x0; + + // CMP0OV disabled; CMP1OV disabled; CMP2OV disabled; + TCA0.SINGLE.CTRLC = 0x0; + + // SPLITM disabled; + TCA0.SINGLE.CTRLD = 0x0; + + // CMD NONE; DIR disabled; LUPD disabled; + TCA0.SINGLE.CTRLECLR = 0x0; + + // CMD NONE; DIR UP; LUPD disabled; + TCA0.SINGLE.CTRLESET = 0x0; + + // CMP0BV disabled; CMP1BV disabled; CMP2BV disabled; PERBV disabled; + TCA0.SINGLE.CTRLFCLR = 0x0; + + // CMP0BV disabled; CMP1BV disabled; CMP2BV disabled; PERBV disabled; + TCA0.SINGLE.CTRLFSET = 0x0; + + // DBGRUN disabled; + TCA0.SINGLE.DBGCTRL = 0x0; + + // CNTAEI disabled; CNTBEI disabled; EVACTA CNT_POSEDGE; EVACTB NONE; + TCA0.SINGLE.EVCTRL = 0x0; + + // CMP0 disabled; CMP1 disabled; CMP2 disabled; OVF enabled; + TCA0.SINGLE.INTCTRL = 0x1; + + // CMP0 disabled; CMP1 disabled; CMP2 disabled; OVF disabled; + TCA0.SINGLE.INTFLAGS = 0x0; + + // Period + TCA0.SINGLE.PER = 0xF423; + + // Temporary data for 16-bit Access + TCA0.SINGLE.TEMP = 0x0; + + // CLKSEL DIV64; ENABLE enabled; RUNSTDBY disabled; + TCA0.SINGLE.CTRLA = 0xB; + +} + +void TCA0_Start(void) +{ + TCA0.SINGLE.CTRLA|= TCA_SINGLE_ENABLE_bm; +} + +void TCA0_Stop(void) +{ + TCA0.SINGLE.CTRLA&= ~TCA_SINGLE_ENABLE_bm; +} + +void TCA0_Write(uint16_t timerVal) +{ + TCA0.SINGLE.PER=timerVal; +} + +uint16_t TCA0_Read(void) +{ + uint16_t readVal; + + readVal = TCA0.SINGLE.CNT; + + return readVal; +} + +void TCA0_EnableInterrupt(void) +{ + TCA0.SINGLE.INTCTRL = 1 << TCA_SINGLE_CMP0_bp /* Compare 0 Interrupt: enabled */ + | 1 << TCA_SINGLE_CMP1_bp /* Compare 1 Interrupt: enabled */ + | 1 << TCA_SINGLE_CMP2_bp /* Compare 2 Interrupt: enabled */ + | 1 << TCA_SINGLE_OVF_bp; /* Overflow Interrupt: enabled */ +} +void TCA0_DisableInterrupt(void) +{ + TCA0.SINGLE.INTCTRL = 0 << TCA_SINGLE_CMP0_bp /* Compare 0 Interrupt: disabled */ + | 0 << TCA_SINGLE_CMP1_bp /* Compare 1 Interrupt: disabled */ + | 0 << TCA_SINGLE_CMP2_bp /* Compare 2 Interrupt: disabled */ + | 0 << TCA_SINGLE_OVF_bp; /* Overflow Interrupt: disabled */ +} +void TCA0_ClearOverflowInterruptFlag(void) +{ + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm; /* Clear Overflow Interrupt Flag */ +} +bool TCA0_IsOverflowInterruptFlagSet(void) +{ + return ((TCA0.SINGLE.INTFLAGS & TCA_SINGLE_OVF_bm) > 0); +} + +void TCA0_ClearCMP0InterruptFlag(void) +{ + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP0_bm; /* Clear Compare Channel-0 Interrupt Flag */ +} + +bool TCA0_IsCMP0InterruptFlagSet(void) +{ + return ((TCA0.SINGLE.INTFLAGS & TCA_SINGLE_CMP0_bm) > 0); +} + +void TCA0_ClearCMP1InterruptFlag(void) +{ + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP1_bm; /* Clear Compare Channel-1 Interrupt Flag */ +} + +bool TCA0_IsCMP1InterruptFlagSet(void) +{ + return ((TCA0.SINGLE.INTFLAGS & TCA_SINGLE_CMP1_bm) > 0); +} + +void TCA0_ClearCMP2InterruptFlag(void) +{ + TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP2_bm; /* Clear Compare Channel-2 Interrupt Flag */ +} + +bool TCA0_IsCMP2InterruptFlagSet(void) +{ + return ((TCA0.SINGLE.INTFLAGS & TCA_SINGLE_CMP2_bm) > 0); +} \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/timer/tca0.h b/enc28j60-avr-udp.X/mcc_generated_files/timer/tca0.h new file mode 100644 index 0000000..44c4c0e --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/timer/tca0.h @@ -0,0 +1,199 @@ +/** + * TCA0 Generated Driver API Header File + * + * @file tca0.h + * + * @defgroup tca0_normal TCA0 in Normal Mode + * + * @brief This file contains the API prototypes for the TCA0 driver in Normal (16-bit) mode. + * + * @version TCA0 Driver Version 2.1.1 +*/ +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + + +#ifndef TCA0_H_INCLUDED +#define TCA0_H_INCLUDED + +#include +#include +#include "../system/system.h" +#include "timer_interface.h" +#include "../system/utils/compiler.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup tca0_normal + * @typedef void TCA0_cb_t + * @brief Function pointer to the callback function called by TCA when operating in Normal mode. The default value is set to NULL which means that no callback function will be used. + */ +typedef void (*TCA0_cb_t)(void); + +extern const struct TMR_INTERFACE TCA0_Interface; + +/** + * @ingroup tca0_normal + * @brief Initializes the TCA. + * @param None. + * @return None. + */ +void TCA0_Initialize(void); +/** + * @ingroup tca0_normal + * @brief Starts the 16-bit timer/counter for the TCA. + * @param None. + * @return None. + */ +void TCA0_Start(void); +/** + * @ingroup tca0_normal + * @brief Stops the 16-bit timer/counter for the TCA. + * @param None. + * @return None. + */ +void TCA0_Stop(void); +/** + * @ingroup tca0_normal + * @brief Interrupt Service Routine (ISR) callback function register to be called if the Overflow Interrupt flag is set. + * @param TCA0_cb_t cb - Callback function for Overflow event. + * @return None. + */ +void TCA0_OverflowCallbackRegister(TCA0_cb_t cb); +/** + * @ingroup tca0_normal + * @brief ISR callback function to be called if the Compare 0 Match Interrupt flag is set. + * @param TCA0_cb_t cb - Callback function for Compare 0 match event. + * @return None. + */ +void TCA0_Compare0CallbackRegister(TCA0_cb_t cb); +/** + * @ingroup tca0_normal + * @brief ISR callback function to be called if the Compare 1 Match Interrupt flag is set. + * @param TCA0_cb_t cb - Callback function for Compare 1 match event. + * @return None. + */ +void TCA0_Compare1CallbackRegister(TCA0_cb_t cb); +/** + * @ingroup tca0_normal + * @brief ISR callback function to be called if the Compare 2 Match Interrupt flag is set. + * @param TCA0_cb_t cb - Callback function for Compare 2 match event. + * @return None. + */ +void TCA0_Compare2CallbackRegister(TCA0_cb_t cb); +/** + * @ingroup tca0_normal + * @brief Enables the 16-bit timer/counter interrupt for the TCA. + * @param None. + * @return None. + */ +void TCA0_EnableInterrupt(void); +/** + * @ingroup tca0_normal + * @brief Disables the 16-bit timer/counter interrupt for the TCA. + * @param None. + * @return None. + */ +void TCA0_DisableInterrupt(void); +/** + * @ingroup tca0_normal + * @brief Reads the 16-bit timer/counter value for the TCA. + * @param None. + * @return uint16_t - timer/counter value returns from the TCA0. + */ +uint16_t TCA0_Read(void); +/** + * @ingroup tca0_normal + * @brief Writes the timer value to load to the TCA. + * @param uint16_t timerVal - Loading the timer value for the TCA. + * @return None. + */ +void TCA0_Write(uint16_t timerVal); +/** + * @ingroup tca0_normal + * @brief Clears the Overflow Interrupt flag after the Overflow flag set. + * @param None. + * @return None. + */ +void TCA0_ClearOverflowInterruptFlag(void); +/** + * @ingroup tca0_normal + * @brief Checks the Overflow Interrupt flag status for the TCA. + * @param None. + * @retval True - Overflow Interrupt flag is set. + * @retval False - Overflow Interrupt flag is not set. + */ +bool TCA0_IsOverflowInterruptFlagSet(void); +/** + * @ingroup tca0_normal + * @brief Clears the Compare 0 Interrupt flag after the Compare 0 flag is set. + * @param None. + * @return None. + */ +void TCA0_ClearCMP0InterruptFlag(void); +/** + * @ingroup tca0_normal + * @brief Checks the Compare 0 Interrupt flag status for the TCA. + * @param None. + * @retval True - Compare 0 Interrupt flag is set. + * @retval False - Compare 0 Interrupt flag is not set. + */ +bool TCA0_IsCMP0InterruptFlagSet(void); +/** + * @ingroup tca0_normal + * @brief Clears the Compare 1 Interrupt flag after the Compare 1 flag is set. + * @param None. + * @return None. + */ +void TCA0_ClearCMP1InterruptFlag(void); +/** + * @ingroup tca0_normal + * @brief Checks the Compare 1 Interrupt flag status for the TCA. + * @param None. + * @retval True - Compare 1 Interrupt flag is set. + * @retval False - Compare 1 Interrupt flag is not set. + */ +bool TCA0_IsCMP1InterruptFlagSet(void); +/** + * @ingroup tca0_normal + * @brief Clears the Compare 2 Interrupt flag after the Compare 2 flag is set. + * @param None. + * @return None. + */ +void TCA0_ClearCMP2InterruptFlag(void); + +/** + * @ingroup tca0_normal + * @brief Checks the Compare 2 Interrupt flag status for the TCA. + * @param None. + * @retval True - Compare 2 Interrupt flag is set. + * @retval False - Compare 2 Interrupt flag is not set. + */ +bool TCA0_IsCMP2InterruptFlagSet(void); + +#ifdef __cplusplus +} +#endif + +#endif /* TCA0_H_INCLUDED */ \ No newline at end of file diff --git a/enc28j60-avr-udp.X/mcc_generated_files/timer/timer_interface.h b/enc28j60-avr-udp.X/mcc_generated_files/timer/timer_interface.h new file mode 100644 index 0000000..a5fb6d3 --- /dev/null +++ b/enc28j60-avr-udp.X/mcc_generated_files/timer/timer_interface.h @@ -0,0 +1,69 @@ +/** + @Company + Microchip Technology Inc. + + @File Name + TMR_interface.h + + @Summary + This is the generated header file for Timer module interfaces. + + @Description + This header file provides interfaces to Timer driver APIs. + Generation Information : + Driver Version : 1.00 + The generated drivers are tested against the following: + MPLAB : MPLAB X v5.40 +*/ + +/* + [2023] Microchip Technology Inc. and its subsidiaries. + + Subject to your compliance with these terms, you may use Microchip + software and any derivatives exclusively with Microchip products. + You are responsible for complying with 3rd party license terms + applicable to your use of 3rd party software (including open source + software) that may accompany Microchip software. SOFTWARE IS ?AS IS.? + NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS + SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY + KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF + MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE + FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S + TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT + EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR + THIS SOFTWARE. +*/ + +#ifndef TMR_INTERFACE_H +#define TMR_INTERFACE_H + +/** + * @brief This file contains API prototypes and other datatypes for Timer-0 module. + * @defgroup timer_interface Timer Interface + * @{ + */ + +#include + +/** + @ingroup timer_interface + @typedef struct TMR_INTERFACE + @brief This structure contains the interfaces to Timer module + */ + +struct TMR_INTERFACE +{ + void (*Initialize)(void); + void (*Start)(void); + void (*Stop)(void); + void (*PeriodCountSet)(size_t count); + void (*TimeoutCallbackRegister)(void (* CallbackHandler)(void)); + void (*Tasks)(void); +}; +/** + * @} + */ +#endif //TMR_INTERFACE_H \ No newline at end of file diff --git a/enc28j60-avr-udp.X/nbproject/Makefile-default.mk b/enc28j60-avr-udp.X/nbproject/Makefile-default.mk new file mode 100644 index 0000000..10334ef --- /dev/null +++ b/enc28j60-avr-udp.X/nbproject/Makefile-default.mk @@ -0,0 +1,420 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Include project Makefile +ifeq "${IGNORE_LOCAL}" "TRUE" +# do not include local makefile. User is passing all local related variables already +else +include Makefile +# Include makefile containing local settings +ifeq "$(wildcard nbproject/Makefile-local-default.mk)" "nbproject/Makefile-local-default.mk" +include nbproject/Makefile-local-default.mk +endif +endif + +# Environment +MKDIR=mkdir -p +RM=rm -f +MV=mv +CP=cp + +# Macros +CND_CONF=default +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +IMAGE_TYPE=debug +OUTPUT_SUFFIX=elf +DEBUGGABLE_SUFFIX=elf +FINAL_IMAGE=${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +else +IMAGE_TYPE=production +OUTPUT_SUFFIX=hex +DEBUGGABLE_SUFFIX=elf +FINAL_IMAGE=${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +endif + +ifeq ($(COMPARE_BUILD), true) +COMPARISON_BUILD=-mafrlcsj +else +COMPARISON_BUILD= +endif + +# Object Directory +OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} + +# Distribution Directory +DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} + +# Source Files Quoted if spaced +SOURCEFILES_QUOTED_IF_SPACED=app_files/src/udp_demo.c mcc_generated_files/ethernet/src/enc28j60.c mcc_generated_files/spi/src/spi0.c mcc_generated_files/system/src/pins.c mcc_generated_files/system/src/protected_io.S mcc_generated_files/system/src/clock.c mcc_generated_files/system/src/system.c mcc_generated_files/system/src/config_bits.c mcc_generated_files/system/src/interrupt.c mcc_generated_files/tcpiplite/src/log_syslog.c mcc_generated_files/tcpiplite/src/udpv4.c mcc_generated_files/tcpiplite/src/network.c mcc_generated_files/tcpiplite/src/ipv4.c mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c mcc_generated_files/tcpiplite/src/ip_database.c mcc_generated_files/tcpiplite/src/log.c mcc_generated_files/tcpiplite/src/lfsr.c mcc_generated_files/tcpiplite/src/dhcp_client.c mcc_generated_files/tcpiplite/src/rtcc.c mcc_generated_files/tcpiplite/src/arpv4.c mcc_generated_files/tcpiplite/src/log_console.c mcc_generated_files/timer/src/tca0.c mcc_generated_files/timer/src/delay.c main.c + +# Object Files Quoted if spaced +OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/app_files/src/udp_demo.o ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o ${OBJECTDIR}/mcc_generated_files/system/src/pins.o ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o ${OBJECTDIR}/mcc_generated_files/system/src/clock.o ${OBJECTDIR}/mcc_generated_files/system/src/system.o ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o ${OBJECTDIR}/main.o +POSSIBLE_DEPFILES=${OBJECTDIR}/app_files/src/udp_demo.o.d ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d ${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d ${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d ${OBJECTDIR}/mcc_generated_files/system/src/system.o.d ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d ${OBJECTDIR}/main.o.d + +# Object Files +OBJECTFILES=${OBJECTDIR}/app_files/src/udp_demo.o ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o ${OBJECTDIR}/mcc_generated_files/system/src/pins.o ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o ${OBJECTDIR}/mcc_generated_files/system/src/clock.o ${OBJECTDIR}/mcc_generated_files/system/src/system.o ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o ${OBJECTDIR}/main.o + +# Source Files +SOURCEFILES=app_files/src/udp_demo.c mcc_generated_files/ethernet/src/enc28j60.c mcc_generated_files/spi/src/spi0.c mcc_generated_files/system/src/pins.c mcc_generated_files/system/src/protected_io.S mcc_generated_files/system/src/clock.c mcc_generated_files/system/src/system.c mcc_generated_files/system/src/config_bits.c mcc_generated_files/system/src/interrupt.c mcc_generated_files/tcpiplite/src/log_syslog.c mcc_generated_files/tcpiplite/src/udpv4.c mcc_generated_files/tcpiplite/src/network.c mcc_generated_files/tcpiplite/src/ipv4.c mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c mcc_generated_files/tcpiplite/src/ip_database.c mcc_generated_files/tcpiplite/src/log.c mcc_generated_files/tcpiplite/src/lfsr.c mcc_generated_files/tcpiplite/src/dhcp_client.c mcc_generated_files/tcpiplite/src/rtcc.c mcc_generated_files/tcpiplite/src/arpv4.c mcc_generated_files/tcpiplite/src/log_console.c mcc_generated_files/timer/src/tca0.c mcc_generated_files/timer/src/delay.c main.c + + + +CFLAGS= +ASFLAGS= +LDLIBSOPTIONS= + +############# Tool locations ########################################## +# If you copy a project from one host to another, the path where the # +# compiler is installed may be different. # +# If you open this project with MPLAB X in the new host, this # +# makefile will be regenerated and the paths will be corrected. # +####################################################################### +# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build +FIXDEPS=fixDeps + +.build-conf: ${BUILD_SUBPROJECTS} +ifneq ($(INFORMATION_MESSAGE), ) + @echo $(INFORMATION_MESSAGE) +endif + ${MAKE} -f nbproject/Makefile-default.mk ${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} + +MP_PROCESSOR_OPTION=AVR64DD32 +# ------------------------------------------------------------------------------------ +# Rules for buildStep: compile +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${OBJECTDIR}/app_files/src/udp_demo.o: app_files/src/udp_demo.c .generated_files/flags/default/7156e38b1fadd052c04872921b39fe80c132030d .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/app_files/src" + @${RM} ${OBJECTDIR}/app_files/src/udp_demo.o.d + @${RM} ${OBJECTDIR}/app_files/src/udp_demo.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/app_files/src/udp_demo.o.d" -MT "${OBJECTDIR}/app_files/src/udp_demo.o.d" -MT ${OBJECTDIR}/app_files/src/udp_demo.o -o ${OBJECTDIR}/app_files/src/udp_demo.o app_files/src/udp_demo.c + +${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o: mcc_generated_files/ethernet/src/enc28j60.c .generated_files/flags/default/8b11d880349c9843755eff14e94acbeb5f5cb244 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/ethernet/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d" -MT "${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d" -MT ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o -o ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o mcc_generated_files/ethernet/src/enc28j60.c + +${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o: mcc_generated_files/spi/src/spi0.c .generated_files/flags/default/680b8646d328d9ba85122c4104ef4e47f2fa1616 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/spi/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d" -MT "${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d" -MT ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o -o ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o mcc_generated_files/spi/src/spi0.c + +${OBJECTDIR}/mcc_generated_files/system/src/pins.o: mcc_generated_files/system/src/pins.c .generated_files/flags/default/3bde281ccfd5b48638cb30b78844767c0a8a3b2 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/pins.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/pins.o -o ${OBJECTDIR}/mcc_generated_files/system/src/pins.o mcc_generated_files/system/src/pins.c + +${OBJECTDIR}/mcc_generated_files/system/src/clock.o: mcc_generated_files/system/src/clock.c .generated_files/flags/default/1d4a02b02bc27a541e4c020683a970f0371b38f3 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/clock.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/clock.o -o ${OBJECTDIR}/mcc_generated_files/system/src/clock.o mcc_generated_files/system/src/clock.c + +${OBJECTDIR}/mcc_generated_files/system/src/system.o: mcc_generated_files/system/src/system.c .generated_files/flags/default/23748f40953312128610fc059838452fb4c72c7e .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/system.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/system.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/system.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/system.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/system.o -o ${OBJECTDIR}/mcc_generated_files/system/src/system.o mcc_generated_files/system/src/system.c + +${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o: mcc_generated_files/system/src/config_bits.c .generated_files/flags/default/6617222d8dd2e498e348c62aa274ee629218bd16 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o -o ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o mcc_generated_files/system/src/config_bits.c + +${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o: mcc_generated_files/system/src/interrupt.c .generated_files/flags/default/5a334116363f0d5a8aecd9ac212b0b1213ce4104 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o -o ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o mcc_generated_files/system/src/interrupt.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o: mcc_generated_files/tcpiplite/src/log_syslog.c .generated_files/flags/default/b73dd969d14ceefe89f747024f3b7345b78faaa4 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o mcc_generated_files/tcpiplite/src/log_syslog.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o: mcc_generated_files/tcpiplite/src/udpv4.c .generated_files/flags/default/9f7a7536d9ffc6b6d6a91f1e910bc96ec51a4445 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o mcc_generated_files/tcpiplite/src/udpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o: mcc_generated_files/tcpiplite/src/network.c .generated_files/flags/default/2b577aea485b9bb61ba0f55b9b9caaf4fb20f8ce .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o mcc_generated_files/tcpiplite/src/network.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o: mcc_generated_files/tcpiplite/src/ipv4.c .generated_files/flags/default/b4def7b1fd9464a2d31cd47dcd3d9fdc4bea1365 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o mcc_generated_files/tcpiplite/src/ipv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o: mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c .generated_files/flags/default/415bede99fe1d5d424c366c62a2823717276eb67 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o: mcc_generated_files/tcpiplite/src/ip_database.c .generated_files/flags/default/c1ad1c3d33a3f3c702e4135abc01a0882e828a7f .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o mcc_generated_files/tcpiplite/src/ip_database.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o: mcc_generated_files/tcpiplite/src/log.c .generated_files/flags/default/e52435f36628350b92570d92af43d05136b954b8 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o mcc_generated_files/tcpiplite/src/log.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o: mcc_generated_files/tcpiplite/src/lfsr.c .generated_files/flags/default/28ffb093e1fd1ae5fffff24f4bb6ae025314a518 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o mcc_generated_files/tcpiplite/src/lfsr.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o: mcc_generated_files/tcpiplite/src/dhcp_client.c .generated_files/flags/default/93fe39c6530ba10a3ab05290413093a25e0e5ce6 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o mcc_generated_files/tcpiplite/src/dhcp_client.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o: mcc_generated_files/tcpiplite/src/rtcc.c .generated_files/flags/default/92402ae9b13a624fe6f427d641ed70b5ebc6f80b .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o mcc_generated_files/tcpiplite/src/rtcc.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o: mcc_generated_files/tcpiplite/src/arpv4.c .generated_files/flags/default/9c811d7935c5b04a3d9652fc13e9ce82c0b510b7 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o mcc_generated_files/tcpiplite/src/arpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o: mcc_generated_files/tcpiplite/src/log_console.c .generated_files/flags/default/1020a2b3d07d660adaad9d903fd15769d893125 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o mcc_generated_files/tcpiplite/src/log_console.c + +${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o: mcc_generated_files/timer/src/tca0.c .generated_files/flags/default/588329282f7e447a7fa4e7f3cd1bf2505924720a .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/timer/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d" -MT "${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d" -MT ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o -o ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o mcc_generated_files/timer/src/tca0.c + +${OBJECTDIR}/mcc_generated_files/timer/src/delay.o: mcc_generated_files/timer/src/delay.c .generated_files/flags/default/396fe33c95767edf988d20997065b81fdbd78f10 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/timer/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d" -MT "${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d" -MT ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o -o ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o mcc_generated_files/timer/src/delay.c + +${OBJECTDIR}/main.o: main.c .generated_files/flags/default/64b847a3e16139fad9d828828cbe76f669ee23e8 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}" + @${RM} ${OBJECTDIR}/main.o.d + @${RM} ${OBJECTDIR}/main.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/main.o.d" -MT "${OBJECTDIR}/main.o.d" -MT ${OBJECTDIR}/main.o -o ${OBJECTDIR}/main.o main.c + +else +${OBJECTDIR}/app_files/src/udp_demo.o: app_files/src/udp_demo.c .generated_files/flags/default/337f0007cad2e0e2cb5622d5ab8968ffea847f64 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/app_files/src" + @${RM} ${OBJECTDIR}/app_files/src/udp_demo.o.d + @${RM} ${OBJECTDIR}/app_files/src/udp_demo.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/app_files/src/udp_demo.o.d" -MT "${OBJECTDIR}/app_files/src/udp_demo.o.d" -MT ${OBJECTDIR}/app_files/src/udp_demo.o -o ${OBJECTDIR}/app_files/src/udp_demo.o app_files/src/udp_demo.c + +${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o: mcc_generated_files/ethernet/src/enc28j60.c .generated_files/flags/default/69e4252da341db89f2fec41eae398a319c8d4ec1 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/ethernet/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d" -MT "${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o.d" -MT ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o -o ${OBJECTDIR}/mcc_generated_files/ethernet/src/enc28j60.o mcc_generated_files/ethernet/src/enc28j60.c + +${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o: mcc_generated_files/spi/src/spi0.c .generated_files/flags/default/d01b3f1e6e2c52455ed264a2fe8182cdf856af63 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/spi/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d" -MT "${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o.d" -MT ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o -o ${OBJECTDIR}/mcc_generated_files/spi/src/spi0.o mcc_generated_files/spi/src/spi0.c + +${OBJECTDIR}/mcc_generated_files/system/src/pins.o: mcc_generated_files/system/src/pins.c .generated_files/flags/default/49e85febdc47695a5e2936997224ade52bbe4b83 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/pins.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/pins.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/pins.o -o ${OBJECTDIR}/mcc_generated_files/system/src/pins.o mcc_generated_files/system/src/pins.c + +${OBJECTDIR}/mcc_generated_files/system/src/clock.o: mcc_generated_files/system/src/clock.c .generated_files/flags/default/e130222144927d5460255fb90f7b66c83e1f2683 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/clock.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/clock.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/clock.o -o ${OBJECTDIR}/mcc_generated_files/system/src/clock.o mcc_generated_files/system/src/clock.c + +${OBJECTDIR}/mcc_generated_files/system/src/system.o: mcc_generated_files/system/src/system.c .generated_files/flags/default/9e6630c9546cfa899c05dac106aea8806a1f8ab5 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/system.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/system.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/system.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/system.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/system.o -o ${OBJECTDIR}/mcc_generated_files/system/src/system.o mcc_generated_files/system/src/system.c + +${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o: mcc_generated_files/system/src/config_bits.c .generated_files/flags/default/f092b2449d4a0307226dc0e60ca02748541b66b .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o -o ${OBJECTDIR}/mcc_generated_files/system/src/config_bits.o mcc_generated_files/system/src/config_bits.c + +${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o: mcc_generated_files/system/src/interrupt.c .generated_files/flags/default/6c7354990399342c4bf0086aceee27bda5d422d1 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o -o ${OBJECTDIR}/mcc_generated_files/system/src/interrupt.o mcc_generated_files/system/src/interrupt.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o: mcc_generated_files/tcpiplite/src/log_syslog.c .generated_files/flags/default/a7e0887c7d63e352c6f5fd071bde5502efab1de .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_syslog.o mcc_generated_files/tcpiplite/src/log_syslog.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o: mcc_generated_files/tcpiplite/src/udpv4.c .generated_files/flags/default/1d35b4106b59623bc900c0b9f09ddd044cc32599 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4.o mcc_generated_files/tcpiplite/src/udpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o: mcc_generated_files/tcpiplite/src/network.c .generated_files/flags/default/6192c5e0737354c4dda76d55b1ac4e95361bcdd3 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/network.o mcc_generated_files/tcpiplite/src/network.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o: mcc_generated_files/tcpiplite/src/ipv4.c .generated_files/flags/default/ac848be2f09eba53f37eb2a07360963b8e4e7000 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ipv4.o mcc_generated_files/tcpiplite/src/ipv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o: mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c .generated_files/flags/default/c6b1b3dfd473aeb4302c90b0cbba51436c41ac18 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.o mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o: mcc_generated_files/tcpiplite/src/ip_database.c .generated_files/flags/default/d25f008fac91671b5348716720c9e65c82348e3f .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/ip_database.o mcc_generated_files/tcpiplite/src/ip_database.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o: mcc_generated_files/tcpiplite/src/log.c .generated_files/flags/default/64c45f354346ce0e138f0597ad3500231070fc57 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log.o mcc_generated_files/tcpiplite/src/log.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o: mcc_generated_files/tcpiplite/src/lfsr.c .generated_files/flags/default/70719dcb4cc2d87f104d48f3bb3b3256762dcff .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/lfsr.o mcc_generated_files/tcpiplite/src/lfsr.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o: mcc_generated_files/tcpiplite/src/dhcp_client.c .generated_files/flags/default/b39ac3175242a76e0802a46f5fb0563e3b690979 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/dhcp_client.o mcc_generated_files/tcpiplite/src/dhcp_client.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o: mcc_generated_files/tcpiplite/src/rtcc.c .generated_files/flags/default/e5fe842d2ad348991420a892d7cbcbba8c692ecf .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/rtcc.o mcc_generated_files/tcpiplite/src/rtcc.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o: mcc_generated_files/tcpiplite/src/arpv4.c .generated_files/flags/default/ed3242ce46dc2502f45699f92baa0d476604f52e .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/arpv4.o mcc_generated_files/tcpiplite/src/arpv4.c + +${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o: mcc_generated_files/tcpiplite/src/log_console.c .generated_files/flags/default/6e069cf6a8eea864c614554db037052307fda169 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/tcpiplite/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d" -MT "${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o.d" -MT ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o -o ${OBJECTDIR}/mcc_generated_files/tcpiplite/src/log_console.o mcc_generated_files/tcpiplite/src/log_console.c + +${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o: mcc_generated_files/timer/src/tca0.c .generated_files/flags/default/b683ff61d96072153ace91f09b254be6cb186768 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/timer/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d" -MT "${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o.d" -MT ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o -o ${OBJECTDIR}/mcc_generated_files/timer/src/tca0.o mcc_generated_files/timer/src/tca0.c + +${OBJECTDIR}/mcc_generated_files/timer/src/delay.o: mcc_generated_files/timer/src/delay.c .generated_files/flags/default/14f4b0e49b4ca7c46782f644728639947d8a1f10 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/timer/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d" -MT "${OBJECTDIR}/mcc_generated_files/timer/src/delay.o.d" -MT ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o -o ${OBJECTDIR}/mcc_generated_files/timer/src/delay.o mcc_generated_files/timer/src/delay.c + +${OBJECTDIR}/main.o: main.c .generated_files/flags/default/e6a55c782222aa68b87344e903874557ecb2a6f1 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}" + @${RM} ${OBJECTDIR}/main.o.d + @${RM} ${OBJECTDIR}/main.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 -mno-const-data-in-progmem -MD -MP -MF "${OBJECTDIR}/main.o.d" -MT "${OBJECTDIR}/main.o.d" -MT ${OBJECTDIR}/main.o -o ${OBJECTDIR}/main.o main.c + +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: assemble +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +else +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: assembleWithPreprocess +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o: mcc_generated_files/system/src/protected_io.S .generated_files/flags/default/29f848c287b8fc44b11510b7c34334263cdc9890 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o + ${MP_CC} -c $(MP_EXTRA_AS_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x assembler-with-cpp -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) -gdwarf-3 -mno-const-data-in-progmem -Wa,--defsym=__MPLAB_BUILD=1,--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1 -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o -o ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o mcc_generated_files/system/src/protected_io.S + +else +${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o: mcc_generated_files/system/src/protected_io.S .generated_files/flags/default/b23d56cd172986cbfcc97638ec3d2a886a6af367 .generated_files/flags/default/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/mcc_generated_files/system/src" + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d + @${RM} ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o + ${MP_CC} -c $(MP_EXTRA_AS_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -x assembler-with-cpp -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) -gdwarf-3 -mno-const-data-in-progmem -Wa,--defsym=__MPLAB_BUILD=1 -MD -MP -MF "${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d" -MT "${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o.d" -MT ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o -o ${OBJECTDIR}/mcc_generated_files/system/src/protected_io.o mcc_generated_files/system/src/protected_io.S + +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: link +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} ${DISTDIR} + ${MP_CC} $(MP_EXTRA_LD_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -Wl,-Map=${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.map -D__DEBUG=1 -DXPRJ_default=$(CND_CONF) -Wl,--defsym=__MPLAB_BUILD=1 -mdfp="${DFP_DIR}/xc8" -gdwarf-2 -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -gdwarf-3 -mno-const-data-in-progmem $(COMPARISON_BUILD) -Wl,--memorysummary,${DISTDIR}/memoryfile.xml -o ${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} -o ${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1 + @${RM} ${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.hex + +else +${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} ${DISTDIR} + ${MP_CC} $(MP_EXTRA_LD_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -Wl,-Map=${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.map -DXPRJ_default=$(CND_CONF) -Wl,--defsym=__MPLAB_BUILD=1 -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -fno-common -funsigned-char -funsigned-bitfields -Wall -gdwarf-3 -mno-const-data-in-progmem $(COMPARISON_BUILD) -Wl,--memorysummary,${DISTDIR}/memoryfile.xml -o ${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} -o ${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--start-group -Wl,-lm -Wl,--end-group + ${MP_CC_DIR}/avr-objcopy -O ihex "${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX}" "${DISTDIR}/enc28j60-avr-udp.X.${IMAGE_TYPE}.hex" +endif + + +# Subprojects +.build-subprojects: + + +# Subprojects +.clean-subprojects: + +# Clean Targets +.clean-conf: ${CLEAN_SUBPROJECTS} + ${RM} -r ${OBJECTDIR} + ${RM} -r ${DISTDIR} diff --git a/enc28j60-avr-udp.X/nbproject/Makefile-genesis.properties b/enc28j60-avr-udp.X/nbproject/Makefile-genesis.properties new file mode 100644 index 0000000..9f057b0 --- /dev/null +++ b/enc28j60-avr-udp.X/nbproject/Makefile-genesis.properties @@ -0,0 +1,13 @@ +# +#Fri Aug 11 20:45:13 UTC 2023 +default.languagetoolchain.version=2.41 +default.Pack.dfplocation=/opt/microchip/mplabx/v6.10/packs/Microchip/AVR-Dx_DFP/2.3.272 +default.com-microchip-mplab-mdbcore-AtmelIceScripting-AtmelIceScriptingBase.md5=acafdfc19fbc230fa3bd22a525cc735a +conf.ids=default +default.languagetoolchain.dir=/opt/microchip/xc8/v2.41/bin +host.id=909n-6uww-y +configurations-xml=00f26743d9b717d77a3b1b5612e08810 +com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=ff725c3d3fe40010a04a4bae132aaf51 +default.com-microchip-mplab-nbide-toolchain-xc8-XC8LanguageToolchain.md5=9fced058cfa47be6abe62f69e8f0cfe0 +proj.dir=/home/jenkins/agent/workspace/pip-lite-enc28j60-solution_1.0.0/enc28j60-avr-udp.X +host.platform=linux diff --git a/enc28j60-avr-udp.X/nbproject/Makefile-impl.mk b/enc28j60-avr-udp.X/nbproject/Makefile-impl.mk new file mode 100644 index 0000000..aba591a --- /dev/null +++ b/enc28j60-avr-udp.X/nbproject/Makefile-impl.mk @@ -0,0 +1,69 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a pre- and a post- target defined where you can add customization code. +# +# This makefile implements macros and targets common to all configurations. +# +# NOCDDL + + +# Building and Cleaning subprojects are done by default, but can be controlled with the SUB +# macro. If SUB=no, subprojects will not be built or cleaned. The following macro +# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf +# and .clean-reqprojects-conf unless SUB has the value 'no' +SUB_no=NO +SUBPROJECTS=${SUB_${SUB}} +BUILD_SUBPROJECTS_=.build-subprojects +BUILD_SUBPROJECTS_NO= +BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} +CLEAN_SUBPROJECTS_=.clean-subprojects +CLEAN_SUBPROJECTS_NO= +CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} + + +# Project Name +PROJECTNAME=enc28j60-avr-udp.X + +# Active Configuration +DEFAULTCONF=default +CONF=${DEFAULTCONF} + +# All Configurations +ALLCONFS=default + + +# build +.build-impl: .build-pre + ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf + + +# clean +.clean-impl: .clean-pre + ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf + +# clobber +.clobber-impl: .clobber-pre .depcheck-impl + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default clean + + + +# all +.all-impl: .all-pre .depcheck-impl + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default build + + + +# dependency checking support +.depcheck-impl: +# @echo "# This code depends on make tool being used" >.dep.inc +# @if [ -n "${MAKE_VERSION}" ]; then \ +# echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ +# echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ +# echo "include \$${DEPFILES}" >>.dep.inc; \ +# echo "endif" >>.dep.inc; \ +# else \ +# echo ".KEEP_STATE:" >>.dep.inc; \ +# echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ +# fi diff --git a/enc28j60-avr-udp.X/nbproject/Makefile-local-default.mk b/enc28j60-avr-udp.X/nbproject/Makefile-local-default.mk new file mode 100644 index 0000000..ac91a41 --- /dev/null +++ b/enc28j60-avr-udp.X/nbproject/Makefile-local-default.mk @@ -0,0 +1,36 @@ +# +# Generated Makefile - do not edit! +# +# +# This file contains information about the location of compilers and other tools. +# If you commmit this file into your revision control server, you will be able to +# to checkout the project and build it from the command line with make. However, +# if more than one person works on the same project, then this file might show +# conflicts since different users are bound to have compilers in different places. +# In that case you might choose to not commit this file and let MPLAB X recreate this file +# for each user. The disadvantage of not commiting this file is that you must run MPLAB X at +# least once so the file gets created and the project can be built. Finally, you can also +# avoid using this file at all if you are only building from the command line with make. +# You can invoke make with the values of the macros: +# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... +# +PATH_TO_IDE_BIN=/opt/microchip/mplabx/v6.10/mplab_platform/platform/../mplab_ide/modules/../../bin/ +# Adding MPLAB X bin directory to path. +PATH:=/opt/microchip/mplabx/v6.10/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) +# Path to java used to run MPLAB X when this makefile was created +MP_JAVA_PATH="/opt/microchip/mplabx/v6.10/sys/java/zulu8.64.0.19-ca-fx-jre8.0.345-linux_x64/bin/" +OS_CURRENT="$(shell uname -s)" +MP_CC="/opt/microchip/xc8/v2.41/bin/xc8-cc" +# MP_CPPC is not defined +# MP_BC is not defined +MP_AS="/opt/microchip/xc8/v2.41/bin/xc8-cc" +MP_LD="/opt/microchip/xc8/v2.41/bin/xc8-cc" +MP_AR="/opt/microchip/xc8/v2.41/bin/xc8-ar" +DEP_GEN=${MP_JAVA_PATH}java -jar "/opt/microchip/mplabx/v6.10/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" +MP_CC_DIR="/opt/microchip/xc8/v2.41/bin" +# MP_CPPC_DIR is not defined +# MP_BC_DIR is not defined +MP_AS_DIR="/opt/microchip/xc8/v2.41/bin" +MP_LD_DIR="/opt/microchip/xc8/v2.41/bin" +MP_AR_DIR="/opt/microchip/xc8/v2.41/bin" +DFP_DIR=/opt/microchip/mplabx/v6.10/packs/Microchip/AVR-Dx_DFP/2.3.272 diff --git a/enc28j60-avr-udp.X/nbproject/Makefile-variables.mk b/enc28j60-avr-udp.X/nbproject/Makefile-variables.mk new file mode 100644 index 0000000..3e03ed5 --- /dev/null +++ b/enc28j60-avr-udp.X/nbproject/Makefile-variables.mk @@ -0,0 +1,10 @@ +# +# Generated - do not edit! +# +# NOCDDL +# +CND_BASEDIR=`pwd` +# default configuration +CND_ARTIFACT_DIR_default=dist/default/production +CND_ARTIFACT_NAME_default=enc28j60-avr-udp.X.production.hex +CND_ARTIFACT_PATH_default=dist/default/production/enc28j60-avr-udp.X.production.hex diff --git a/enc28j60-avr-udp.X/nbproject/configurations.xml b/enc28j60-avr-udp.X/nbproject/configurations.xml new file mode 100644 index 0000000..f78fbb9 --- /dev/null +++ b/enc28j60-avr-udp.X/nbproject/configurations.xml @@ -0,0 +1,375 @@ + + + + + + app_files/udp_demo.h + + + + mcc_generated_files/ethernet/enc28j60.h + mcc_generated_files/ethernet/physical_layer_interface.h + + + mcc_generated_files/spi/spi0.h + mcc_generated_files/spi/spi_interface.h + + + + + mcc_generated_files/system/utils/assembler/gas.h + mcc_generated_files/system/utils/assembler/iar.h + + mcc_generated_files/system/utils/interrupt_avr8.h + mcc_generated_files/system/utils/utils_assert.h + mcc_generated_files/system/utils/assembler.h + mcc_generated_files/system/utils/atomic.h + mcc_generated_files/system/utils/compiler.h + mcc_generated_files/system/utils/utils.h + + mcc_generated_files/system/clock.h + mcc_generated_files/system/interrupt.h + mcc_generated_files/system/protected_io.h + mcc_generated_files/system/port.h + mcc_generated_files/system/system.h + mcc_generated_files/system/config_bits.h + mcc_generated_files/system/ccp.h + mcc_generated_files/system/pins.h + + + mcc_generated_files/tcpiplite/tcpip_config.h + mcc_generated_files/tcpiplite/log_syslog.h + mcc_generated_files/tcpiplite/udpv4_port_handler_table.h + mcc_generated_files/tcpiplite/ip_database.h + mcc_generated_files/tcpiplite/network.h + mcc_generated_files/tcpiplite/udpv4.h + mcc_generated_files/tcpiplite/log_console.h + mcc_generated_files/tcpiplite/arpv4.h + mcc_generated_files/tcpiplite/rtcc.h + mcc_generated_files/tcpiplite/log.h + mcc_generated_files/tcpiplite/dhcp_client.h + mcc_generated_files/tcpiplite/lfsr.h + mcc_generated_files/tcpiplite/tcpip_types.h + mcc_generated_files/tcpiplite/ipv4.h + + + mcc_generated_files/timer/timer_interface.h + mcc_generated_files/timer/delay.h + mcc_generated_files/timer/tca0.h + + + + + + + + + app_files/src/udp_demo.c + + + + + + mcc_generated_files/ethernet/src/enc28j60.c + + + + + mcc_generated_files/spi/src/spi0.c + + + + + mcc_generated_files/system/src/pins.c + mcc_generated_files/system/src/protected_io.S + mcc_generated_files/system/src/clock.c + mcc_generated_files/system/src/system.c + mcc_generated_files/system/src/config_bits.c + mcc_generated_files/system/src/interrupt.c + + + + + mcc_generated_files/tcpiplite/src/log_syslog.c + mcc_generated_files/tcpiplite/src/udpv4.c + mcc_generated_files/tcpiplite/src/network.c + mcc_generated_files/tcpiplite/src/ipv4.c + mcc_generated_files/tcpiplite/src/udpv4_port_handler_table.c + mcc_generated_files/tcpiplite/src/ip_database.c + mcc_generated_files/tcpiplite/src/log.c + mcc_generated_files/tcpiplite/src/lfsr.c + mcc_generated_files/tcpiplite/src/dhcp_client.c + mcc_generated_files/tcpiplite/src/rtcc.c + mcc_generated_files/tcpiplite/src/arpv4.c + mcc_generated_files/tcpiplite/src/log_console.c + + + + + mcc_generated_files/timer/src/tca0.c + mcc_generated_files/timer/src/delay.c + + + + main.c + + + Makefile + ENC28J60-avr-udp.mc3 + + + + app_files + + Makefile + + + + localhost + AVR64DD32 + + + nEdbgTool + XC8 + 2.41 + 3 + + + + + + + + + + + + + + + false + false + + + + + + + false + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enc28j60-avr-udp.X/nbproject/private/configurations.xml b/enc28j60-avr-udp.X/nbproject/private/configurations.xml new file mode 100644 index 0000000..ef4ea37 --- /dev/null +++ b/enc28j60-avr-udp.X/nbproject/private/configurations.xml @@ -0,0 +1,25 @@ + + + Makefile + 0 + + + + + + place holder 1 + place holder 2 + + + + + true + 0 + 0 + 0 + + + + + + diff --git a/enc28j60-avr-udp.X/nbproject/project.xml b/enc28j60-avr-udp.X/nbproject/project.xml new file mode 100644 index 0000000..aefae22 --- /dev/null +++ b/enc28j60-avr-udp.X/nbproject/project.xml @@ -0,0 +1,25 @@ + + + com.microchip.mplab.nbide.embedded.makeproject + + + enc28j60-avr-udp + 082b3c69-7e4d-452b-a420-372670d66c2a + 0 + ISO-8859-1 + + + app_files + + + + default + 2 + + + + false + + + + diff --git a/images/AVR_setup.png b/images/AVR_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..da38d88d058bb405d77d7dd28057d51ce2d6ecee GIT binary patch literal 138040 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≤H!6 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

I^gU~2xBwd|6`&DGy4IK! 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 literal 0 HcmV?d00001 diff --git a/images/Wireshark_homepage.png b/images/Wireshark_homepage.png new file mode 100644 index 0000000000000000000000000000000000000000..20a7f17d9c2611cf999040f8bf2f636ecf066b33 GIT binary patch literal 32274 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­HzrGcn{V+|BC_tB?*-NeK|2w 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

|JMMpZap+HYyLwUGRj5EA}Rux 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ⅇ{^QoA7=|`~ zWV|>7ZPus;e%z;i*@c%mV4Wp=#vOSJQ8+314(CjhSrE>xjU zIx~nT*=~uq-lfNbMCcpSV}(!N#aq| zp8$zC010X-2-Xu;R~%4$P_+j$ueXv{Fb-jsP*`fTv6_|aa;1grGl64rK7tk1Hj8Hc zcd#@t!mUq^m?@M(;vVn0QV0J(;GpM%|2rJCJ1C4q#p*zdpGKn+nquUC7PGG=rf;++ zC}g2jq7L7_)PHe{%{(hZyN$6SP#nhXk2J7TTAp};=o_&f?s-pWm9@fL(4+Xee!Yr^ z^6LyKO=q_r>K7e!!CX|Ddm-!k^~X`&$xk~F%kx94&0o!JZLywIp%n-O8hL#|rlmdG zf~vYU3=$4AU*zX7g9DclKU$(sIye4_S|ZRatI;l_b?_i&<-+;2*UF|zSzDS_N)oCd zXrvqCHHY41OKPy?J@RfBOFfg1$r_$xToHWcv$nlQ2vHrldZ_k;xQhBF6$5 zra_|z?K|T(3yKKJy$bj1=pf!0vqY>!`bS-M~91 zW}4()KlHux7w}c(8m%>fzV4b-My1p`PbO~V)TfAHk;dH2`k*Wd{1((c^vv8<7>kn~ zuAay6dXX}k-x3rYHOX_CGi(a!ns>7+WVD-=fK1t?Za@oy4MD#y9k!}k!SC}f=rj<= zE0TPdcX7>U7+Z+52~rgq<|@0R~be!NM;NQD&!sD{~Yk&J}~m}R5{ zK@WR)&h}RR?5##giX*?nU3J7|0u1aA^tWH9om;@ULy?TR`CMxGa%im;ba_tRrmP6= zc%xohtt~9jLn_Q!LEGcokim*S6_8ol{d9-(YzgMoy|eB5Ngr%u5kUq z-≪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 literal 0 HcmV?d00001 diff --git a/images/ledon_wireshark.png b/images/ledon_wireshark.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbb1c8b59f5f7e145cb5eb722effc22edacd64b GIT binary patch literal 37194 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 n1LAMB-heZT|0cVI$nWe=0X1-Exck- literal 0 HcmV?d00001 diff --git a/images/mchp_logo_dark.png b/images/mchp_logo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..25ba9460a9122645ad7ac47e6a34cf01953cc2af GIT binary patch literal 25536 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⋘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


jM)p#E?&Nx@2guROsbi(4bx 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 literal 0 HcmV?d00001 diff --git a/images/pcipaddress.png b/images/pcipaddress.png new file mode 100644 index 0000000000000000000000000000000000000000..76b1298341dabf18b046f8877564de2210685b27 GIT binary patch literal 32660 zcmdqJcT`jB*De~^Rz$D>DlMYh0)n6jsFYY?D+(K=R}}%Np?4D8Zi)p^5$Oa)=@6-* zCMXC>F$h9{009vqgd{*nLK2d77odCp#yMx)@0>I4AK$ncgF#qX33I(`zOy{fGxOk2 zBZKWC(jpKDWc!srE}23go1-8Qp@}VeIOSC z#*1F`qz2T#vlRLL*1gNtSAN^3_IA|iX1T4(Hr*QFSFgB>KC1pZpmSqvUy= zC_y7lefQ3k_^qII;3Mh?O`L;Ue-6>{6~4LtG)hqcvU-i+BXt+m6#`@+*@yW4t^gIu z&_k|X8Te4MPD!yY3C&GQlZe!l2NHo9{6zoNExmpWkq{eQv;5aIIrG?Z+3c{gG zfq9JW0#tBYqoXKFXzdclF<L)HQ>eIsdz!1E_TsNkGQ;a-rqs9S}PSjX}pdphYzGtLb=w!ZX~0+JRA4Oa%TA(bdq%Z)HM6~&DEUeaq5D)hlIV^S!zA%LIHs|Dt40*=~uCO_u15}e(3@G4Lm0s~O zD?=5%u&4VWv5jjin8q)l1t&@Q*9dx`p^nz#Yc@fyq01jy)2)M-Gh!lX@?u=HZ4xpF)12(qCbCPk=i(TWs{5`<$f>#>Kfvm^hJZU%GVBr1vhU;Xj%M90X7HNmW z=8!v!ry6BLo|BKSFK_ei-j2h({Pwxk9nHPEOzai8*XMeeIxI4NUNJQIXhffD*ve?} z3a7^Y$fU<5jcrGP;|_tCtdcgtdtJ+J!6*_6XbKJ+Rq&UOERdfnMal5eV6j?MGGP#^ zwqdE@aOfPc7b!U6$Y8!Ei(m#A!3%6a0s5@|$i2;LYZ;aQGTCtKl&%FZ1p~;07@SI> zN~BA#Y2uwP%Q#N3<2M{1K9-+?(fnNTm;!oc#V){YLUj_ZEiUsjnjtRg3eBJ1(2RQs z*}Hyw?z(So)-nGT_;Rj5MAwh29TGeNwyi&J-hJfXaQN%gD8& z;Oey{o7dk3xpCp&58Lp+d2oKi$|K~0>Y}CAZpiwoLv;K~=Yy@bDF6CLA+6ktr1J`I ze_g@&(^;`_KtKodkb(aHaoTsA2{`B*azbi9uj1eUlq)83&ovu{M5N(;GNb`p-L_@A!W|_#lmpM>$TT*S!+5d>LE%Qd!xuA4RQQvnGOTP=k6_VucrnqT3Sky-=f@Yt2>k}s&vych!`;vbSpqsh-pMLIt3cwbyTWFwHGKqG<86l>s% zO9^W`ePk4osyRT;n~Ieq74VP*fgIrnUwf3$u2#yQgK4fCl=}Lm(EJc9qvVw@r3&5Q z>jVQX-6*WsT^ZhKO|;Q?wL&u=>lGy_eJR{OT9oWW_RrV7GC}MgdhdKR$3@O@wKY*@2q+1iDjYcutIJ*a#jFWG>`C>Z z&5p$;swymtF9XHpES6!Wz2<DvQ)U8V_6T8_ar0-8d0 zC6(}v94Zh<|CRzJM6%(JD3ki7O5X;ao9|_thx`md7x$jsuryfV-W_Jfm+qUvuhv@*dT2ECi2hztSXu zCTVqEakbEL${(@H@%p$(2w|4VM)yq)(xsJ_^Y}QrK(3!29=X&Z3=rZO#9%@13h4SC zv9asBE$T|$!oKDP3M2GlA1B4wB;IdMcKYIsciFT`i(G`&Blq%PKE@i6YBB(tU@Y`4 zwzN;5eJVv;CqizIZGQoVi2v4^?|w-jI@m(kQ$Aomq3y|eVG*9LR4!>K!wWU+%ULy{ zyH>BPUo42hl$WQqzW+3w%vcYf5b;~n90u9=X6E=zviV~K@xf5j)F)lbpCwp`-~Y6G zq2v3S*H;Uov*q8Yptj-E`qActH@DpVdBX6&A@2Q-o}UL3&q)i1*(v=jXCQfh{|Z_+ zuWtEob1>wBi_5fAB>QMW5WxxIau~(q?VVb71znR}u#grpY>&d*E|HFIVmiJ;(rM)^ zV-K9BD^2)ZMf3IJJGNh*4CDLhr9>hozI&6g)lCh@NheDHggM}c zvmxN;#{4|zw9#vJs8QDwTSGV+VsvY`!B4>mb9MsmSJU(bfvmpZr*6Txbq(xfiVKx0 z`w`V=8F{Q165}-lWVc$Omif{A`Lj*v=LbZlvOc@kE9u*!W>BP)pBLi4&2qIbwv7b? zzqceHQ%zo=%rZLh%d4uO+$K$o_KDz zZ?I6&pCag$tNrF8z}oxCx3{K`-LVnr zHvQ?YM0k2lT56CUWYXkohacM`#1nEY5W$C18yZIv zC)?^&&Bekm44cF^th^P-V34Z#nn^FlUmu0*B(~s=_sc};UQTX(<7aU`1KZL~AF?r% zAtPDNm7%)`j$Gf5zw%KqGGU$%b>_dhS}9Un7eVLW8WbG4j|EyphjCA7@QeR0k$9Bj zXMF`^XlY%t)zQqhu@s}|@0^sT)6~MA$Jrv^7^v#FZ;!GelX)z&dyT2WrRb~;+;I<$ z**718&avFfC784M*&DSozIIcT=*`2#)WZX>!ZtO^pMw_s!73) zB!{ArF+|_#GA*KS5bf$DZbfQU|BR3;&{C_RUm4#HKbcRL9JCQIWuo3dIdwMKqg!6lUvDWFR2A@Pugm z&fM$Pp|VGBjUD!axKcbVRPE%(Lc^aOEbq zO?elw0FKMk=<4A&(0N*Gmic(Fp%AESyW8{I3wb-^k#?7w)MT2h&xd)t>mCog5#8{q zXrcE>P1b~A#tr$N@3c~BFX8qSrBkG(IbQ$l=b%GB7H!NPCBIYfk>U;<=nOyv0*~*$ zBI1jrD87qLT3Y57wK58-2+qp@7%>YZ8vY6&!l=_ zUrz>BF(PPQEK4F>BACqQLypuE3d<8TtUxeJ( z1kC)@fi z)+Kt;KHE~~k6CuNM-jmwS;>SDEYk_|nOYhoke<-N4ha#61Z=&}!Y;Du_vrBTOYspu zxgj8I)2vNc+g*ZM3v|*$s`*XSL?^MdAUSy0EBQ8oaq7tU_(ccF3^XjGUg-{6^yNru z5P{4X$eZ3#H#ImT<5DMgO=Ft+e4FA7%?(GNq>LdvhOJLOs20z1GN=AER zt-4J35F_Gq8~L5{T14%y1;d z=jOK6^i|cR<0DVw!gz_@U9;28l$%!CcCIc6-5^_1W!tIGx|8L1N42ypBljQ-bO`|h zK#Z_q?SF~yg1}hKG*8}jWfheVHr3hqP^(FA*v4@xgcGBdgNanPfQKIE68wqtC30q4 zyg3_PTr4ITMrYh@JBNZ*uET5aiv#a^D>A5bqx2xBNGw~L#t|E9(HP?hMgf>N?u+1=P_zPXy zXKE$}OO*Zn&CTz`38OCBsGg2T8tB~x-j_9`ZaW`GZ54O^CqEs$`fi8^Pd-|MwTyQw zl{OJ9W96Q`nJ+OdX&YYjQ&vT5lr4Z+36WfV{Q_60dt#zJE~#zL%AOEr-L9u3*o%zK zBr&xNe&z0MN4f={5^z>CTW`gV!rG`fU$*KeJ$AWlb>An}!hJ`WDyhAFbrS^~U%ExW zM>^uxR$r&lU?)UeTKEiKNZ0(hS6PsyiG68~yIUlp$JM*I^7BAI^+Tm%KW~h9p$~7P zdBms~)*@H_L&yojAiZR^6oclHtBbnok9Bw-WRf~AD7eGKzwxfLzSr356AZ{&T;+@; zoTtukukc4B<+jfOSP@Jy856wx^%ivm$2wD+KiistPE0vr8`oAHo{dX94YzA$zW2;M zL?x^@Jxhmp6IZzkohiogbW4Z$p_85f+})T#!WnUO{D2)iPGUifJuKIIt-grLpEB9doGW_IuBb8L zQMF65rNwzB%{|(b)lP$J56!0-8p3b$=DhDYV+PLJO5W+F?#W#&z40#D+{*l+NjF>d z`lzJ0Vyc}Et;$)l*1i)k<=?wgE=FPrS4DJi^#YF|esbF4Gr23PO(%h$Qw>U|YWHl8KbQl$~9#X;RQ z=5a&M=i?PO`Vrxp!}rFnUrjcOrY>5jbZBRZ0JjJLb!lU|s;i8_FuDChaulPD*WSvb z2k}x~dm*mnFZHE-OsP*k&jzm8!R`wH-_RO4_#y|6JnpcM8~TIkk0+?Ec^s}Scb{-r zYF{aadQK}k&LrZ?o*eAl-?+#YXyP06U&?2Iiaq(!pZ{z_OBtG=5%nj0jD&*O&?)f* zWcQzCDuoBolJj{{6FEj0nrcob$Y#L(+MlLEZov!WN7<@n-Du;(_^mqMBNeVxTNapAAm~dTRx7m zQ2knAjL1%1lJhWMP7L8E*7Hw|_!TbLd!UaKEfl2~I%jzAy4of72g&#Wspo*|5oaJ> zvO|l6OFB=4P6=S2nd%(?tT$AUdErMHL#JZrdbtLA+@}rAEfO8cNB5M8i`+23!JQ1s z7p6*GRLd8sSlYa};?XCceM%7E zD(RgCHnD~l{i8)Nd6I3y-9Nh_jMZp}v zjcsYyDl&UubLEzwo}JG#tOs>zzKMa4;xZ?H3ao zFzEoxT>%bmBz>68UtV1F=lLHLzX7D89oL+OcE??KJSJ})%srZB%C2Ogm}>UNqI(qGmP*b1F@^UxK4wg-s-iDfTh(c9kpKF5x5jtw z9}`51gi@IXs(4sLf{6d)Iy<(_z24yHT?a-JJJ!*qm4Zx_D5KrMl$T9*F~=N9ttmfn zv7)ueYXtzU9$6Tswe1`O8hmHMT_DiJbFd2n*!0@XKC8g$bdmI#w9CgocSxL1z1NQ5 z3$I?V&ygFuAxBbpGTr3g9Cr(otXYpoOdAm-&TmNn)Gt_t=bd!#0wr4HVQ2q>&#`ET z{Ne4#Y-}PV(Nf{DJH29BzU)5S)r1_?6TGYtnRRD*js-g%dj{qrc z8IHY6Lrx64>O1BK>cLNz@DI;4!d--xRf_NpRtUWTu&kn&iHlcz-}=FPy0M@M|Iu5| zvc@_&`~8O|EZsn}l{@2LyyJ`~a3nNhh_6Tz6cB(Msus?l5L?Xeb**$Kh>uDFS|r%v zFUZL`l0g61UYdv{gJ;fu+o|P+{J}@gQC#N%SUO#XJ*TaQ3;8No!#Kv>LTe$l#T`l+ zi?G)i;O$sy%EoZ8rQs(?zUZC^yRk*bW+UM(H6J#Q3~i9CUNrJYI9=_xppv^a?e-n0 zJwYwQyLu@?I8Tbohc7-w~=Ab}+ktZfE&WsX!EGX}KRB4YSJuEvtT zh)16*ZW^F>);txD)}7<-%Lmrr+K@~a5D3<*!~OjeO!PT|&(`g9938b1n#TikFubEs zbGO5aD&Q|zWk4a2+E2d=j~9k*`h_Rcul-vH9@gAYHK8l?V;b1GcCL?hOw><=Ip;bg zVzYX2hHq7aJVRZblj+bh{1Y&ywcOv(T%2Lx8}L=jtIWkqU7b;mC6ciFii5WpuL3Yy zD#+ORz)a_R?WO*xI>A`4e`0+n-{~VasbS1%nh>nbdttl^r%~>1qLM(!#dGW}jitvn zrX{UeF@IP04@e`fT*A=Musl%O1YPEgPSIq6g*k|nPOr@QzbTMKV9mE=3Ma6kohI5| zp5Mi$Eu;<<*_y;hTcvfn3L85VeT3<(?Dh5IHz`Epl5cAayhw2h4K4K*KidA8Y#B=N zX&FF04oA9^v>0nB&&iRu{P4933z@Qt6C{@Fks8?!*$I6T3eCv7c*{KZpWG6nt zCB=+iZ&hT#>`PJZX>8Paq>7Seqk1XXyw2+}r8wtIUf*f`A>7h$S@C?GF5T5q=zTT2 z`Sqxyqxj;PHDjBd7|ST3i0k{G76oo&CM_ezB2dB;iBlghWJU~7yGmOxOn}IVbOz7* z(fjvTjXyp&-_mB$AnbkS*geYLfozEm?ea>W-jb7Z#T67sMDc*_z0_!fYNPP<;d|Fx z-Ucn(zd0Ao>(-wmnU!+gPh2&5gtBKpgM&cGDM3c$P^Q+$9;VjgNThVjQ67Qf+$Cjt zkIoD~%N7JaH)7xBb@A7kY58Jxc;exkBfJ~W5a)W!=5g(0dfr5iVSIRhAf_?^-63|Fxn98N zxF;Tl95)vu3K>{zCrU15B8MLJz4yGcG1R`l{z@3uISfJ0R}C&M^;pfas;cbC<*MRu zAz;bhptJ$KcVMiS+0|7QAOA+H``l4m><$oATY$Pq#&s*aO{%17m9GL-YCzYtd!>R_ ziQL|tKNGT)m#^dBMeYu6Ot$k_wGc}h?dK0|5h9Hl>ufN(_|>vLriGSb4g|$FuH9pZ zjuB|1-ssf{LwOJcB>QKizw}g;>MQuD>Z;veza1>Cx*x=BX1 zoD0qfH|cV;hg*dwmPpsi_bW%t{;i`JH(R#XGx}U-r-zA(McMXyo2!2#EcYTMqBbM`o}~GFnKlt@+{no^|lM zd2(^T(EO~6$l=9~;ekqJxb4fZd5vPvQi&tl8{CR|ict~tQuodaqtj|VihuGK3#FgZ z*%OpUR)z{j-d4P$VtU`r8?2*}j6;E{`{=Totmq^wUeC4LG1V>fvOwTd5j^*~c=FiR ztCe)efTDm(g&#b9g}rwMx$R#7zMjs=gXpB{2UJIq1ehx$JoY7h3`pZJmkYS-Xn*$O zRcx8WQRTvbN$E zT5ZdNwLDa`8!)mmJT|6S@lIsqiDA9Kj5On=552vn;q}); z<_o%;;%+y|m%rTwW~rftGUZFJt((#8S^q<~Jfa!r1Gd|kwK5En#DZKrhkHD9;Sv?3wXlT1i#qrc?=}zzktzu4 zaz<&Nz1ruk-TXrtC!Jw!3lBFGQAqcSFZ38KtXJta>~{lMOtN}Lu{H0m(YMz%JC6Cs zr}!T`5ne$^?JIWW8Dx|X2YQw|{iq`8d=Dg7S|;wyGw0Rg{2cdsBb^G>!&`He6fPdM7Hm$vGCLznIfH$3)qn2~v&fo8 z^GA!H$=N%q%|hk&cyzN$K2q)T-zyiNdsG_49JVOEaWANbpLYgbo~Uc?EyJ_s6=0!+ zia(vboi&eRfxBIbt#h3&wjybJ5;J%MBNpq-X30ACJ?EHSCPO{s*Q(f^d>(ROcH!Hv(OAsi;q3Q6l3m8;2JM+@yqECCe~HWnO1T zXTvtlzw^!12Z=_>@+|MbY)rVIQpzOasraW%%bZBvkHgRIqYH(-%8#7GR;E-w)s?F( zH?EEjUhrlez_Oi>Dc+%p1&Es-7=!;1G=d!^Ml^q-&@ef7o#A9z;S;X6D5T8x|EQO{ z6IKME3s1@q=oOLtc+5x3C)j#HGM(}?<h30q?s_@_uIVc~ItqI^AT?!Cn)>ib zlIP%b;?&)_bK%57>3YXwcdQ*8Kt|H<&<3NH8(Ohg!Sqm?kD=nq$R}(})>C2cXXZaZ zJ~eOW!`Ny^GGNJle{j}pXl~UFfn;`-Dqnhuc(y%xM8weW zQMc=&3qEeH_z5*-yHi-bmT43*Vw3Mna#}Ni<7<-m{(VPj@$9sN1jEu&vU1ntn5%c5 zLLp52H1;c$WLyS?YM7h2;DjohWIJEnqM=BBYvE4 zW!;Y_#M8+$zH^T1Uze^^?tk8 zCefCNJ=P!m35-N>kYf8_L0&e^dA8Bkp7(-@kEO(h8705(-m$EvX$jx+_dELGjY-{5 zyCt#TNFqu+95OamyWFQ@0E-j#fKG#f<=H5*fmVuXLax{681+@TiL=$3p%4geu+kO3 zXc^2l{HM^qx%e*y`(H^4dYCk%7T%2cgUh#L?W`)3e!{mW+Wf-CZSZ!4;dT|_5iw(KE%NIhREft?yjzOt~ZzF)i&F8O%HQ05;si3k1|tn z)9Uv{ZIQj$J!5|SnaxV0?1WRJEC;m?!FopNo46Mfr3WG`EIatYcA$4-ceghG_6H1mdaZy@$Im3cCtWR<_J|KR3qn3zkJVyY zp8P8!H&@jI)TL>>=reuoyQA8@0U1!-;|k>3VmB{^%)3Gy9kM^9821rp)eB-+iRbhp9|&RYg`fE6hE5SSG}{kLhB#_FX+tBf zONKnMZYGMHOCd-z>SLZc*v$SdJ);i7>QP{A=qnbOo)B1R?@TPrk#hxNnT{*9cb9B$ zh=kqfhZl)Nm~^>niVhMtGpdoM-4(u+$%g0$j_Mb%|^54jFA0c=Y;K$RT z&fj5W1(r@;p>?ic9t-B|n?uDAK^VzS^=*IQ;{E>G}v z1+gaY$sK~Ng{kp{v{1oH-KoTv6&)>b?Gp_I+qy05+2UH;&t&0|E!35y{u5fbA$el` z<@uw95SJVdb9B0A&{x{F6DkV)Eb!TPc1bo1-&{W}%Aon562EHee;fJEPx0A*sVHg% z^L{6+Hp1qvJNnICg10{@OJaiZ^T-@E z)_)R?cKTb*)}X45gOMl?Jbkt^Evh8$>06^SU}bYCbm{D91-=z828QU=SSKh zmsjhYxy}`8_i!g@;#rOedC+mlHLes?k6_QT*7O2=Dgmofxi*zlQlC z%&>O);u0^3mKUhiBvw5p@;RPwlsx^G zRo?v*NjhMPl#;S2i;3FYZgLFQuxljYKvv3!$te~Vp7r9@A~iBxhR?5T3{3Ba|I$gO zqujEwF5#4seDi@~4{G2lt8SPOgxG8ky?a^+Jvx|!@16to$v;*4# zyVJS}{D8U5?Y=g(-g|%CU$#+cqp&e(VI!eC!8ap)Mz)5aDX3K~<(W|%Z{+k!=h*gk zpZT+>J;}kXyNr?(F0b zT7~T z>$=O1-&;{YtjSAMLHQ4LdB0dfU!}X_hex+{7Y#}hjuf*>3<68lH~9KXpMc2vat73z z{sZwLS!=HNEA6Ll$Qfezq4#Y%yDipZDnyI>gJ9jfB5*n*E!U&R5-4Qzx|@zpqiHoO zM_>98YstZ>TkTL_wphq>C26Mj53l=~n)9N_`0Yl7+>p9w-;TEGMT*s3&BvwYJ8iMo zXNRV0I`dzK;7}tgB?GrWgxpV4#4TiU$_SF4?Q4s>wPos*j-RjZ38dD;l&A8+L}}XT z?R6`44S%s$!ZW`bQeVDVmv@Hh(R!xP3$ylh>aPQ7?U(t}e}+G1Xs7cU^o|_bNToCw zfOt0IP2##q<1bfUTEDZtyAr&!`>zftnCBYt>a9U<0|UN_O4;JCHeKFGeHYs}tBHO> zbwE64Ce}y%6o7Oqq{UVzmViLrz>Z$Gj{8{4M{f#1Xeg5AAqDDJL<0sals^>QSIduL zwhXv6ykDN5547_%&y~EDe~z~*1`W+05^xU;)GI~As*rkbypshb(&Z@3sVpQ%qW{P2 z{hfIHp!_&j_B)oa-k3s?POWwlP7{JQ(`Jr<2+9mp!f7h&7qW6;9rm%;`=#-O7-#(} z+Wbf4F~0L35h%p#p9JxrV?+O~4=()v+jv@k_vvB#L{3^-gpt$Onn=YyO-1sBRhllSVYiO&&dnVJrJ&?XU1)mSmoMHWcvw8_Ev6;8&9^F#HhIND3;nqv z-Zy1)S$YglyrmAg1_PaI=UYPXKar(p=4Nly0-Y5Obf>@mPf5t)Nt8CW3P;CLLA|bx zvWmt4%6Jt7GlnD%?8X6)XD#8-wfhsIBY$_xkEGLuDy@eYlX5;An!$HGuE`;V+#$)-l zZoFWdvH904E^RX3mK90J^tK^E;K99~Wh`%)46C-dsUe*;yO_m?S9_Id9xKhDX3fst zqN=oTfjoZ3SHAzBz}jUt-(cLtLj(xBN72c3skUkHkLWOIe~}ZsilG;RWrx-NgKAMK ztBrEhkdfgMQ!qx17kMCJJ+x9i%XE%Z{M|~&fmQ-kNhHJR1|rXngUEMnd7bIh{MEb9 zs%o-=3LU6LyT%6buoEG?TxD1ZGU{FSEdR*9VBVVUX24qSI@ls8O-Pi!{# z%pV`?c4%dn-5y?g{P}~aZqX_Q5}$}zO#rFpY4!w!t>W)L#B{_=UxjZ2nbtq|M>iA9 zQ?{#rX2mkaSHx&Ktqb6dyLOwGCd7WUx}_~)A6P>g{IkE5B{NlwRb~ChV@3Y?ws2zS zx@3Q8L#tMGq90PG7I{&pm9xfYM72-fQi}3`O)8uB4qP>9T$b0pubA%|ps&!O9a@_n zGd`lIH7zlDS@VvEJNm=+gKCL)*5Z30DKHM-$&Ysl99&l!Ns=NbV$gpTW(xfpoj;DMM?RcpujkdgV57THP(<){O=;6yu3w>5y^FAF-am@_@ z&y?Kyda?@BRVD8^e@5!7%<8s;YvyZdSwwWdxpec=(2hK4=a<2A;iHqH3u!Tb3*K79 zhdFK>x!yJ=kmGKyb(f~WK6%xUdZm>@Lqow5yCc~|^r03%{X3{hcF+RVi}0}HVXNxJ ziH3dU0DJ^@i^f@5cQU5{y3l+MEH586tA#4JtzGQ;Si_+EnyRiM{E+>+;(qy=+h@13P5k!QqMzV1Y(gVOn zwrVh$NB;X~BO!l(b14M-35@hgD%;`~714hh3N?eELENH|CNR&uToP#BQ+@xXzAY=3 zcS^?}zsOs7N#Qib#-b;07fWYtx${;qVOvREEtrU^y7&XSz@lQ2NkSI(mW9En;Ckng z``pcY@lIIaaRZ;m8hAd6(+kKB4R?-rPt&n@^hV01I${~&gcZ%tdD@A(x=X>_OOlc+Su#L?U~ z*F`rF`hkBz=I;H9d?09QXdi}^@`vr@8jXLtRL|l~uqvN*(N3*D-WWD#p@kaLgB?~^ zFJ1`Em#r?Hva+%1$kQUahEn)5;+HGk{59ZIcX~EqkkFkwYK4Mta-;f`ddOkwq}uHD z_6;C$MacDfCB*J0#D&#jP#Vf_Bovf2#ZxP%r>6;8PE)*C7O(yI#%8qYz~An{&;J^L zYgd+IRuovOP+BG%t`%Jl#^Ot7iq-~Y@J;Y4)k|Lw8tG}E@yge9!C{Pe3bT`A$KpgM zHDvJyShV_x&bI=dIlq(dZVv+ofXd71jq5I36}~=RMQaj19qmT%h(0|!`#0{>5KEuO z?-%*hZPgun!V8S8c|~0opd_~|W7rl%LmdE(me*ruFEig$mawJ|k3J7Ri<&9g>lK-Y zM0B2R*Lqk?p^NSdC-IX+wFS5Itr4b@-&0at7p87#%to&<*ZL|fP;A|k_GJp>Nu^QC zVBp7>m-T1XQL>vAG~|{ab$d)6_np@J zNMc`^IA46BLL-2>T9d-*;eTbD9x}h98H=$m)_+cF>ab1URGojWc$Y1e3GeSHXVmp& zUwGJZ^+XY8(aqi5Bijq-cHAGN?1NaoZcZ={V;hup@c`qDT+&(W`ROs_W4}`W2)9|Z zl(Mo@bhzVL$!BCo*0-ws3+iD?ad_mwfrqML!jChCZ){w= zEmDOI+V$f;y1yVriYPQx{K52VF)B>y`4N{3?OJAp1v_#;vHIVhY!X`h;`yYr-4{lb?V6mE8K*nNDYz?3aFKg3=a=K; z<&_ih{RmQIWO$)pIPdyo?U-l#kk|d0Fpb_R{^YB%z)D{bi1=iEDbZRI_L+ zi+grpP%J)KVXk8R_&MygNX?!PzA?*kw}smY(s`I_fPe90-VU|mdJl8t*x{U&e!hC^ zMNrvmSsk5Rd;CTH2&kVe?X>l^DH;ho`pq{52PZq~UDmi74-_pF9_!+b#z*k`!M16} zjM-Gal(#Qcj3WSM=>#=U+5I0PbtELhM>gN&;fDT; zHYM$!*kgYllPRmSNI0Jh&&Nmn(O-ip$eGimEwbNeJPrZoNvB3RT$u$PkV8V#=s=wJ z2#$yS1@#Bfg?z~S3P=^Mw`;o4a7~gc-bsZi+QeH;Jc5 zX>VuOMY4ylrbnkt9Bry^;myuSLyqe2rqyiBRmE`rpS|i1!5!6uT%R4Ap`hL{IMiWb ze<4W=UFZNcFS=w8rb?hWxzEWFxjLHgjn~iT!|P^NL`QL(vAFdx+_K8<&g?7jnAw+W z-y({9jJAfP2*;?xF|RDf+%V=3?eTq?QTN3|%{{RK&)K3UO(*~Mb6Oj@%1FQX{e@FL zJasBatv?my?q9!d$me4d(c!#OH`j^Z2f*AnlTn3&Wz;~|d!EMx*!nCHbZSM^!d*2y z#OlGI4eg9TUa?0h@8y$>GBI2hn;u7oKcC9L+j+~gC%~C0XFMb8@hwo>Mglc8Mi{*+ zC@ilLS^b)F z$G<;VY|Z}V>i@*omcnx0QvTQY+TZ^(z9uyqkfrmtqugENZ`{TiZisS)o_F*}{ETH5 zrGcAFa2*a3L4Yx}f;}@9ni1(1+gB=JA6yShH%0%CF*wyEjb-j~wdu{!Rf@^$%(nWz zCB?Dp{md{F8_kb@bJ{`2bLp1i)#R4t!5>X)Rm)Aql~rYfl+i#1!f}mHUHmTmQ~9;9 z_w*=;DWzot5%Xl>f65RN>JXieBUt9$`Y?wjQv>D zC1txS%kJeE%LW(0kFW&buDS(}i*C@}Xu|il!S-vd&f(Sdj};nuXZ2NefO>B@{8}X8 zT@FLNgLxvMn9OzuM2mgo25?|?7n1sm?U9)a3d4}im5q|<=4G2)z zE2@pn_)I!Va1F*e1Ow9KWt(1cH`*QVLsBC7!uV?P)m96JdUqee6Q0GZ>Ikd0ev=CJhMZ@)S)}uX_S2?n1NP_B@~Yj- zL3TD|&~ake{^gmgz+>mXDNdPmycG||KJf6%2!`^w7k6cKK6_En9R%3ZInb|qbIY5u za3*E=^KA4LS;t|(jG2KA&X1?}N2uHlT-->IZ0?c>P!e=-3`l~)1;sxmG%L$)tkbfodC^S2BV=uJR^78|Q z<+VT`WfB+@Wpw_JxepFrRpa!B!}uUI-_Sa!j3GSz-W7{mR&k4;Z-vM8w`589NKAe> zO5AsgBT;+DJUo`;%8dz?8_-LT7<@euY0TKw5ir-DAMFtvZuHI+9F_AXHmNfx~W^U%SBR#L!W;byLhQ@DLyY19UU&0f_ zVo!s8y;cVC`VAJ}UXb%snO9r6s?0N#MmQ<%4+m3+3;P9}zXE>u)av8r>Wn`4B_jpS*j0v^}ZB+aW7hX7aeWoyK-HG{zrT8zGEJ;DO&z z629|8nC|Uchl&fX-kR;Wa4B8m3fN7T^IcZ;zU@O(&U(QSZlJc1xGJi&vT-kgp;o0b zD2RON5d^TWA3dhGZcKL@~U&et+LScBR>rOhL`6Yab#Y_y2l{rxS&wlPfLI!~*RN6rzf zV~F|F@3Mtf__b2oj`^R!oRrx^LY|tIxDC#MtMC_^z$SclxYXuM(Erojna4xDzkgq< zQz_|m=p}qfY0(&v(1;`}er-$K9XRqdsQ2-tX&my-MJ%>|8rj4qYLM9#- zqI0Tg@yv;5L3pw~&mA)GC5Z2Ia;7!-UhvCm987B6>F%XRJyX+Ty$fHAMxFn{IBp+d z#}m3?(8)I6Ph*VnTlJE#N7@WM>sN}728H68RbAZ;U2E4UzM#sja4B-YKj&pNPF1{3 zfkVo`d_Ve!GO;Nh5EpK-$DVzAe(uVFloE>*JXz`EUV~2f)S8%Sr#Gb&l4*CcLaYd~ zpZvDTaU9}8+|>*AS7SKkXHK-r1W7+V%G|=xd6aQT87QTB0v2Exnr+>+g8J?dov8BV~L} z_FeN*$mh|i+Nn)wD5W#`Y^3ObinX_vIMuFKt_$|!oH>iDagCZIq+8HqfL~mhY&FP! z5=7s`w2yQq#8_$c&Ft7WnIykUZu!PaSB`54as^aXj!dafPcY5gHPL(ftRt|Z*_ z7`RY6LT@rX&5+)O3y)6SdJ*$n{xmE(v-ldLszGu{W7!#4D^igfTf@tr3T+vHzJR&~1 z$H3?vw<7nri_6HP{DHP|RQs$E+wG`(b*lYp@@U%4_;UORiYjn>aJM8e-z9>vNDaqX zafuu8A=t)eDm-I}wn+bggVS1=#C6PN{rU$nhZSLoP`Bx@Wz&eI zb4Idoq$(POG}1h|ko9^h{}03(qqy?VVodj-(ex4Kun~zKD)91Y>Hhfk9H$QF+6x7@ zaqy7zVJ?I4vJ_h z=Ur9yU@_XQ6m76%UcLHfuJ&b~11*Fn-L+iJ#NUISGHgHU%`&oOpk=w>AGi2sx?cEC zI=7$pYiIydBs8t$r*FuV289Ng20^y^cpULlJ8dzn{|V1nJ(stcBfy!wxUm|lz0`A) zRbM8H&-R6du$LY*|JC9L6~7{84ov)g_WMqJSwT&x^98t00+gVZykB0|jtL--I&2MO zU9{tI@&(^up#k6EyL`~oM&&oTn1EM#<}(pE5&B{W z&V|QHKT(p_3;0I5FWbKpUF#}sdPhC-8$HY5MJ@QenqAgk_{5Tme@-lEUzE*8{qE8L zYgTA7&%ds}Is8gUF$Y> z>gS@)O0@QIy760dN#hqBlV`hUk7N%+PZ3EtYh zZtI%A6--;{|5Pw#TO1Pk4W2R?SIgbRR*Dj+Kk1Lz|0XSD{@gxrVBloC; zCPZAoRna&2(o*#+FM_aRIn?FGs8eZx6Iahgrn$;{Z^86GZw!7s5ZsTgYbt0nd5(vDu1>Y(v?%a4MtmfuUExm zwN4`uJa+V$sr)$`YjQppZ+eJTz;=s?CP#?WBi1YXY6-_zeA6l?Q8&N%4DUlx_&3V? z+j!Q)mZSs;e(@Fxa-hM43=hP&E4&#p-LZ|wZz4lVTIa|eP_@kt^aIZAdpAp|8|283 z`{%3{{S>9F&+|qniFW;pr1MjCho!?V+bB>*g5TVD8bQHlhlE?@Z4L{^6)){5cr0+t zfTQo?+VQy!9c6Q|Z5WrEuzJ$o$Wtpmrr^$6C{LI6D!qX?Nc)T3!XexCdHTGYrES#b zB>DSN{0i99A^i&us^fccH}dN7X;!`0V|G=)TdMh5*fIt08z}JfI-^5^e?~}O_?s&n#4o=g4gZsaL-0TT-_aJ0H%7Ys70IP1 z38r`;CTbV>2zbsb$(_L8U-LMJk~Br1s3x*)PgR*|+lG(vA372~B?dyJP&YuJzCD6n zBU0T`PI(P-K827Yz2VaRLjll)-15*zW+h_@Q~Q|j?tnT5U6(df(mSJt&TEXF7-A|W zq2ZUQVVk#o42Y1!s8 z-uW03kV~n^y>DiQTr$N@S>#LCHyBUXbQ?CEjXpKV<}*Fo!_2VaT$|gSc4wXAM@Gu( zwXEXPh}c;h!K>lCGCC3iUwX@x(O%_UFjU0$%`;JlT1x}c!>Z`>Kz+fKa=(k1 zDzAe><3m!joD*>dZn^7YU;6dj2ptv5Wa|4)t0c0=wACJ5i@U?6416L^C%bm)Tq{d* zWN~XlCq1+bbT4d5ggLpbHP^@NBqx=-#U|6VI}O^*9e)!8xh_S!eX( z-~4^UHg&5#1J3aR`R13t9gWj8@x9sf=RxGW7P79&F#rK$XfLwef(vlJ`+S@|nRn)- zqE%PFe)xMvSEYGDp)ILr3epTxq^V0As|@S!t-cJPI)hJ3kciIn#F9>1K8Z(} zb3{Ai3d4F9H@1uix%u9QSGOo|QtvBahku!-crq#T>Ab_#x_D$OOKN0M+MoC6^-LDW z+?p^E8rZY2G28<`CH4jRq40En3@0`JceskNqQ?v!&(ap%#q|RCj(XIN4P?PLcHGLs}%WiaVimnUyT=SZ3(Qy)=FE zLWRdCx?kPAdbz%1ANxb44V%g9JfBz0GB*G}yzvCuH`YHqc7`K~-~lJ$SdJ`dYX&Nj zCNlK-_^xh)EI%&PVlCWEBNU$=Soi?4fp^nEth7Ie?wczAM|3`zB33fHHJ*wEZW+4h zrLtJ!X*4IOdMau1e^_qX99nEErLs`{gi#`+?+6;z`VXnD=YF@|3Jm;yA7#(as}-D6 zuD@eZuJLMC(dS)0VTkPA-U4jr9i63~0W*%D6b{fMwVt9H`gvCOq_gbs6OW{eQPZBUr^d4BI^}G`THh=VVyT@T zJNo%i$WFGPPtn&6UhSjqOo$)#J5=JqB0Ba_6VhK;vPpn{Z$W!aywu`M0 zjIub4aKTsT^xvqFcK=$9G}MeHgVOq3a{~ggc0zOH@F_;vhs5a`Vqf!-tf}a0Ej_oh zwrV{&wW1qvKCiBx7#y6c_?Yi%eeFG?WC7%XE&AQd3AHh07?D<&CfuA=ZoPmJX38IR zS1q1xcR2+_AvBa~pcg zK5w3!BQ`8NS{<7SX|hhR8!hlAQ_|QoI&)Kl4zS|*Rlm=uKE?9&E?+rah^mUGR!s|r zI)|E?>0?B>-6I1QCMy7W3PcQWVKAbqAayTfyo?GP`F0EW((zqN;9DeEcEz{9(7OAp z=jg#^;d6o)`!DSI{|A55e7{h-eP3)Q$f}_qz8ljVeGh_cw6-LcP~u#{G>nE~PE~ys ztv&%ggr5e`y$#65VP>yEYFS!_TEDo|zOXV>&(U4_IAYQ;{bB%p65qQuFnA!}y@IFq zm@Rm{{mH1+UqH02YwE}K%J#>sMJ#Q%{PLmjWEEgHP<2if&$;Tg>{F#z4xeJPfsJ=B zlx041fy0900lZa!eKEr(=0?mj_`O(U!!Q(_yOr1jVg*{xEk&L&8-kXqGj>;Jk zHE%?^;^pJfvz#3F$ABGl{pF~~G^4~N0WeMr+_C#8-8`t%F8NT^-Jge%?dk`VQDhI{ zWFKtJS0;j%7-Pf0bVHe)-NQSTN!=9-+)VWxC^P0YkuaU~(ZiPH4H<-3)+NOmgz(@g zO{BYSZ$#pIc!4v#E9J;_5C~{lG(Tm*VnjUMKEdx&QW+O~4q5TY93M+OdAh#lIeit5Hoe)8k{V@K1CDtLDpVmRLlGqcg|M z4~1E>6_~hdY@OFee=366!WB@!c$b$TV65@rN{F$W_!E3$bb&%aKqX4q; zq+bK?<`?33;SI^rWR>xKQJ2MH={V6+l0nNRwEKy1F>pdKtzYzA{7j`}pdt&h2f2x4 zSGGz~#_uU9q$duAj*@Tw2x`ZkjBwPX1(dX<&S#H3Aq_v#k*H1mk9#bdQhv#K&mw8 zPCq=4R6x&)l!*&LEL?@@i*x}*Xtk5xR*%w4s0#Bs4dz~goLp5pB{XP3cVBsa+pR-C zOv%-1@#*331LU$2zya)>5va@j))2RD3k>2-}T@2%1|sI=2sVQpN=Ww~*{! zsP=lUu_Q&=CiG2?w)c)TTy%BSGMv7jSzaa$C_ml&Y*Y=5lW|$w3o}~eMD3$*V^;;2 zf_UxwKT2iNuNDn!lU`K-pzh+d?eaHRD4_{(h@b{j5FIuPza2=8^xEbKBEO8(`r_qe z7I3zX&p=lG$MrLZxwS+NgW~R~qJymgJy-4)&e^0FIm9-jrZJkEScpGcu}4UFiG<+M|}i_Ls;M-Ov)^CM|A;%HfG zrLo)%hL-nQ1ph#eyhbAk2c5WdUgYYc@=gdy5Ee@LX^!8jV7EK}Lo=r^jw>=^6EzA5 z`J?**=+eVhVyr%*E4|dP#HMJ>Pj`1f*p22I-qsO^v4szy0-qhR2b}xa!D}V+sL!6L z$J~=Y$e@(N^vR0HNnTDHG6U3GV9_;29gS8b=KEho96dunBUR?qR^LofSJ|k zVtzs|-#10B3pLD`204Gcm-D9X1mUk{&ghS}iUKv{%O}9}T>{}CRue)HH)GWLEA1o_ zKEH7{k8+)}+Vs_tpQ}@rBl78u_~mfw&Q^gr17Ph1p8k0&1@q?L;*q(S;mVeYt}A-t zw0>?l(_A^s(HT)#f>0RE%8I+UvOd%R=Cx*~%psNp-sBb2NKFQ6N^`w$iO+npb;~fw zGw^n|5foQ(?_YX>9;P>3d0oStr%JvObOz@%#b!4QTsw2fkq{#XF6^MhssgUY67|4y zkxyXC1%3AwwA8 zW9(MF*`M$AAJ}wYeK_LYrF=pa%2>0F>So$MaKRIzDPEJ4K=@Nq!wsTvlbT1;@$27bgRVygO($oPRq_?~>4#QS^!avO4LULF}D7cUaX^?*X#HC6-RA3Dd3B912wAMIFs&aBUPXVdYFh z>SxU=x15#RI5c2Xa)h;ys4Tm4o;|A7IhARWGypLu?_TGthhA}?z3eYYKgbNXx)Z7xu$DYp!!=mY=l4B^jr{uda+f`Dx#TL;9(=YFGEg$bMq7cNlpmRB1zOm>&Ju?ng~?|wTCXz2g{l4I&uf!lyTQ7f+0O(eRw259it z28=St6G4LdfUd5GS!w}`JTb5sZ`Y>}-TRkhNbXL12<_ko0{sel{9LGF&x@uU?u)U! z=tB&ich5^3=6u`FSJJ!)x3aRb>>!_eVj!gf1)t&vDLUMoUM@g%J6Wi87(YB{Nr)(s zJLd0XWKOk94_WqE6B5i;f0?k^GE~M7Osss`bm3t2zGQGw0`~yck`mITBBbLE7Adh{ zmN>UEk*_npM<|%0hx)AM8vqo@li)7hn@T-Ujc*spi7!*Z(J1kzJrDZ)>&>0ZcE z3b>iu^qNubY7j^vGR)qD4Lczcv?W2W^Um3vEa-ULczzK_c&y!ZiLVjfdRyR`8cp$(yTsemM#wZd+yN5U zW(gosHY_!^l*I|=8$@-zfJRu2iY^0IR@ry_gDvDb2^{V`AU8i*crxbTk;l=O3t3VD zKT=UZ62cu$nOjw*^9Yz%4#cJIOR-=gTbZ!RDUSTfK_n{b3S!l77MO%CH;j~U_?ZTQ zPNSC3Ul?PZn{~Ui;M#}n?lA*#9M|m~GA3CfFZek(y>+cG`MpYwi(Sn&1d^Z`ZEnDm zjMJJM$85*9FE-p2PVXw-wWcA5RUrPwu`hyf7-$o76tDn5W$)|A>uu#H=cm=cL44Io zT2_1I3)-+`!^bh?H@_&ljfAS}ISyQ4235;p=^7~+_5wiHD_=bg(>#$>py&^AJmN!^ zi~!y_?F&v-T5f#AQ+yT>L40}Mi(Fi+9||-^9@5;LHeqV-qt+S8^MaFdYiAr$DBbD> zsZeMy2*yfoca)&7g!RX@hyqCd^Kqo&V>h1Mk%bXd$B#}nMyYUF;kK_ z?WhiPy}m%+r~^@`MM+%M+1y*9$Cn5f+4>Fr4~+%8gANvQR%8ue%b#sFh}NRb4bx{y5Y(^`7hjnuHa1$22P6oA& z8x&lyWh4!WlhR!pIAE43en%(nau{XI?KM}$Y?AZ~N49NV@KITk1yh*i#N1Rqaqpb2 z3b|K9<+u~iiAj*`0wQSp-RIvn<8;XO=opy$=a3D?sdxFgX=wOYOwsC?GG(K{Bd38$ zA0mGnHsvP9bVpC}>?$>DBh-{Gx0ncr^S-Hgc}>w}W3-5Hve~wX3P=@9eLbI=fAUW8 zg17vcp->+XFAcn7;hBd1F##pcN8Gme|FX(k7QXEWJ`i*cU|PA3MhUn%4}@6)T62+c zb4&wAW-UHwoyn5>9bo89F|&dy{J=rSaODAmQ>B8f3;abqdH-k;&j%pTVcZ5F9;`=c zdi5jWr>f}ZR)yaOuRY8ycVP_O0$RD0K;G^?HV%L;Bb+_;9+=QAzw}kbS20yXM?L(w zP~xCyUY2)YOm&I}wOnkNY0~+z;BqhwsjsX>?pl5Q%^82*s&nLFp1tzXJgYmyn!0pQ z4otEXJ{jpIge+y65KFvozKGrd+Y<&zZ#Ab8a)$M!LgBy+)35}nQ#tBLery5Lyyn4EcsS3OR}Ck9RdsfOJ|lMJYRql1WEK|#WYvVoqXH@*i(S%@4d^_oUzR>BufNyHHxZLhrEiDgK+uTuE*g0 zwP2S5wX=kq`QA<@IEV=G@pCz#-(z|}KD`Wld$%zqf?UecQ$YruiO?7p^E+LEAPIhZYSbclJA(h6b=&xH!;?rY3d0XP5=dKVu}ja8T`B(@E~Z+-2D!FZh|8 z5DJEYPV45P=K42GxwwN+h4egy3d6p(sjj+OU;|AfAH|7ss7+^cfQtomgq~c7`Nik8 z;+yx%ss?tU9Bwz_m^)Sj((yZqANKJ>b_H9opHY1O{s@HO4Xk12fQi~7s+DUx z#64K}_4zA#LJQz<`9J`Ok+VTRPrIrPh1#lng&2>W&y(%Mu3Y^#X^$!dkWM+T(-KZ-~@ zdn@Xd`{(cp{~l;nj>;#A&Ps@4Kk_y3Hq>MzgO$xr zC7l&Lrq>0f($zi!|LEy+Y{kfy{HtPEZsacOg<6Gv{nz1J{vfIT(s?>?DdtW{&h?PJ zMvJI%t|(n-On`@!OV3-X7yCi(ZwolD3{u-urIc$&&-|kH#B*&s zfCqa1Q9}bUzSBlWP<92zHCSQV?h8oXM$Ssebc_C^-HUV=O~MPfZH)>)yh)8PogIGS zi%pH|FVr#kxkmQqn!GQ4u^)LlG>RHCEQ0@C8c?rd3I(;wwYSU7rxHJ^I0n03?B%=E zhvwO?LU+^GR9d$D5FleAqO2=%(fuuv7?>+W)5bmD6t#Gg`0I1nzDX#alC2a}3Y4&= zR<5K)56#tP1ui%zBU1&*f>$qr4JF#igkvM&v!AA67mx&75ds12pDsZTfh!QIx%fFR zSTJBZXVtPPPNGx5b(vC4=lH!^w#+5GykR3m`2^axq~z5{S@&&ovxEltY>qvts0BWp zW4!0(ubC?By6|o3m2ND~LhJlee_b8Px7a$)Y}I}{-j||oFs?oi8o_k8d+89mL!rTp zqE?XU&C4E1Jj_`cJEjf->3tD_p@>ErTuzsWui1apUtm0cP9=a|vX%oJ>7B|<0+_rL zM0*Iy)%|~J)W@JjFX(3YjNtk!Q~{D{=_6Pg&EnhMM>WGgjpYBbpnv(T83OpxEWXxK zCR4p}hS-d4pjixSu%I+LZk%ATVUlq4t0C`yGw7W~{Zjh(L2uceLg~Qs&2MPZd?qdN zh&7(=1GBSx%PE@i)c05UwhNS;Q3C4Q>XdLAj%RiOQ5j5C;q&?@3Vtg(UbC>+Go>Dd zTgGs(draGN2PZ3TF^<+A7XB|b-68$fvap-Wg59lyT7*FRPmU$SU+tu@ir7qGq4GJXPh7?eN`;~}ivNqon6MJ05yWqwi zo-^M+zHoMMc+l*ih{f&3K^Ix$tHSkvzr}10|4+A=MTp-O9wcRjWMW~jYfW7EcbUjN zV*)q$Tevggt7F?zKA3w+)htv=Gc)JZ(B0;Fk zV&2&t`%$Da$t7SZzh;n2Q^KK zgW6;2Vf&sqKZxt!t7)K9236aMKFB2gRNhOkZjDZkj)8UjoBLP$qe1ZN9|oN*IbVa$ zjTk8C{D;P0gU;a+`;&3SNiwWPn!HBOc-;8(b*86cJv+G7ObP-TvKB^XP%U4>c41hfs6!KMpmo zfsW?sSytbL6B$tz!@RN2-T*eQIA><(L|Ai)1U3pP#)=H z7^l0#T0ZpB+7UjF1E;MO{Z<94<4x3a`Rd3V#}g+5&Dr5{a3ZS}&4IpkBS(1ev&Wtb5HW!zX{gw>QoP(b>lGkyPiO`#-{79rIH0hu# z$@;XqwC;~h>0^45b->(8h)z25*gO0(Z~K4|7e90|`i0=tCljDhk@@aRBVcqtAQ;^P zw6>X+;E(lfmLVWFzMTd>yg$u?-|h2^{5HnF{GIRcKR7tPE|2(EtA(Rtc(5~)4JwD) RWcW?W$zx_mF-Oi_|1TC|A<6&% literal 0 HcmV?d00001 diff --git a/images/send_wireshark.png b/images/send_wireshark.png new file mode 100644 index 0000000000000000000000000000000000000000..c15ab862ccf0f49b9a96728fedd29c30f914fc6f GIT binary patch literal 37249 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%0DfY28cCPj1XMdC~YRMyw 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 literal 0 HcmV?d00001 diff --git a/images/tclient_connected.png b/images/tclient_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..9cb3f7d581946657dd1fe4b3a7b865365c4eae03 GIT binary patch literal 32083 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 literal 0 HcmV?d00001 diff --git a/images/tclient_listen.png b/images/tclient_listen.png new file mode 100644 index 0000000000000000000000000000000000000000..b9eedce19a2d596dba552f3cc0cd7ee41fa6058f GIT binary patch literal 25972 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 literal 0 HcmV?d00001 diff --git a/images/tcpclient_disconnect.png b/images/tcpclient_disconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..9f0d58c8b65d83feedd85897e4f93e2128471ed1 GIT binary patch literal 33353 zcmb@tcTiN#*Dh)xNCrs~1OW*uFd&kXl942!WEdsqD47A3oJ2%20s@kAjx)fJL69st zXJHu9Fp)dF@Atb^=iaaCe0A#lK@GiY@7}AsSFiP~r=K1DN?VnJl$rF#jT;o|YD#)H zZrsG)xN+2-1&8$TJ=tP@sE%`+ZC+}>0_zMLVe&$Il*`QrJDu-9}6U&6v3q%y=jTpT>Y z<=Abf|N3it@ltHibsIg-F5NF;=d&X|CQ>K;xxHOxY{3me!O6+#xRkY@92FI1B3WdG z4VYF}Qc|j5azf#M#MYXn1b&^4nYXef&ztZk%6eK#SwDVjC^-1GZJA;mQ zXlQ79zXqs>4DJIGlV@l;wD*XLCR;f=w>&vGI9{CJbZuf;@WFlfy7Xp%CHOP*OMKTg z1r`P?SQvJ9d5fT+px}X|M#g=XaEO^bbMP9lhuY;a2;#@p`IM}%7{oiQLv!VL8=Bc@ zA!+s9u-k_g5$`?lkU!Sd%7IX0kC+46B`l5fSEC51lNamkK8Mo{s* zDU7IGaa0D|)4ws;Z(UQNle&-1vA}`V+|w^FURbq9g?FNtN8T7Vo;j>ms;k_37DXE| z2i({T^m+|3E_R^s-r7Wc_cpZcq^;)Rr48QZ)I6?CAV%7OV)aBbqKbuyD46Mt7lIQ%} zQ7JN`GceHPvC$`F5^t>19CLJ-?4Dp&GOSC+Ym|YP9#S{3#smqZPMQ_`G$!~skUe%Z zKxmUBYO6lQQ%EO^gZw+BfY5QI4|gp4V<=r*r<|T9QFbsX(K{zt4*+K&0e+61A<@7V zg#1m@=@##eh)qm8e{Mz~HX{!7q}Jf{)yspzGN+3RH$8?WLW3=ZFC>A7)|;Z7`Nm*7W?Ll0%OMAv=BBwt^=Cy+(f{bJ4))ZrlS-$9N2Fi2lQ%LC!t)s?-rD zC#R3v9qy~0H~kzxbG$<_xEOhRH!z%_z}aV^vu8E}B5t*kb5RdJkTlD@6)@mA(B#i} zweLb&SteZ7J8Q>J2elT^eORp7p;D1dD>_%@6<=^ah|TvG5yQ|LGO1=}C#+}WwYHmT zQ?n*b=WmfOB~pry(8JCn?2gOqClmd~@3;q1lMxz6()wP3azYDj9$>UxaOLf!2Z)v{ z9BJbfHtj-niA3o`Eq=FJYGbq#kADWJU+uzMGr;97u!SZajf==inNYn2K%cE+k9rTUMa5LRtkdP|#2BVGMCdWTzysib>9Xu2GhbHjdoT z;8WGR(igTEN-AxOShub4b?Q^UfFCBo+SzH)S-u)gxkArv|41vB;)7|<8r%Jb4b8;W zQ+d(DgiqX;sJ+0@XCUHqv4S5Ginc(PmFZvoiPFIG+L}Hby1#zx7y8K`9Kvp%oe6?| zo%L`a@Ie&c%r5WdkI;3zX8`VYAWg8L0J_ygLiTl?s;VArf8o2n9rK1Gn*#{coL0qB ze@?I+rJHDQnmQTrFf&CNi^G0`yuFy!fu7*%(+ncMR=u&~!~NP#84;gLuW~s^m1|d@ z(aUvE{H+}}s*vJ4layHXOEG+m;*RdO#PGUX*+%N=5?00g&+K{Ww!OLYwpV4@!tTVd zc_o2cO5`&X#9&u@hK6gc!lCY4%64n0nw@v++&k;FU3PE(NP-%eLp&{SZMJ0dv$XmH zhdNe$W3$HTs~%~cD3?}sA4XOEtK@t!fsapM@6$!$nF z?Uw(+!5O27n?1%>!BsVWvmmV}I?Iv$w1p5n>^>y6-w&i_G$uz%KP~2 zsDb5ft+;WpWMz#tp=vOd{O^FlLn&DMX`ZL#Pm77M^ry6Aqs{a#3yr-Qzv%fETBzC( zZ%S&;WiNsG4Fv$$`qgw6<0~Pz6nyvfN)x=CoH1bhR!T+SXyhTg&g55fxz%HjH(|#i z?LN10$U#HD!@-rZ9~Fd2ax^pzl>f=76#*Z8NoOth`VVS;T1GP8%?|F+>1~cB-YC_@ zH34a9Xmt6DQ_rHKqKdsseG&LaX&SUO|4Fu81v*Mf*0ldNek=`$+y0f9zRrLZ$>Mt} z!siB}_#_==l4+M6*d@LfVpyvckI&wDGuAe1q!yESduz#fK=><}_ODNIjG5r)#tuw4 zEG#6yuuz4qV0+%xr}e_44`*HO7HDQT(E{5Ur$j^$j6hR`x4AY`I#lk zgT(GO=j#38J5)-`Hu?3z(K)>{Pk!&DTE;prySYz{jfDV%{1EFC<6IsAJ`7Uc`(XtI z4@DdOTb5k^UOC9)&Z_`5f1&jF)g!KKUMHoa+w33t_gx{u7u?QEjrYZ`PIfNm{BQrp zZVIZYYa8h6@|SwI977Y($6Z4@$B2;ja1r!*FDxWbTF%IzbIkGy{qE^-4|^bU)|t5T zpAS`F%v}ijuxkA0aI~Yn^X0oSsbZKyeSH0}bl@u4KmlwNY z!Vzy-4V_M-%S!YC&r1B-PEP2QHI;m<*xR7sNXicC&=8-G%r9&5y40_JrZTLqzhhkQ zj*TehsQFoaY{l=t1JY!@I!!ZICDp`X*#h@rX`TlZ&5sd!qTklXo!mMi!>jnavsSJm za+EW_=#b#Zs-N zLuBK_!U#kkHa43HF2WDmECcR85<()RL(TxlT@$m3tD7r;?3P8rxcj~WVnJsN_~E`| z4Y|7P*>JqmOPYT6{qy<38@J2P>{TD3dtnP3(Su(O7!D2w?y%0UXt7E-I?74}w5QPY zb6iE7xDAfwfx0Dddd`l&5ocSoE;8#0EPRWmInZPWU#swi`|i!lpu5`e*g(T6E!yId z88>WLof@8slwpGFTPPsYSd? z&M?$a&UNuCueO;TW<7CpK#DisX+m=?W~RgSa*qO&M)3)JLE5p#QU}ta*N-}aEofT)va?_`eGIRUEaP1)L&-#N_^3- z-T(HtJ;Z>U5JcvZMdpvxtqzX`X~*CknTQwLHtixz9ZJzB$QFr1qNcH0;E^~jv@)Y8 zq?606>3F*c#&VV&$1R=HqbA%FBKI!RA^1Ep@(-+r+A?RV^;YEY_s?)Z>PAx4P>t;# zyE{W=ZxYaT8YS8-U@OQvyqeeIeynWDFxLw5{2;FqNgW&r&G$j_~nKaWXQ zh$~@{KiQMfe+EQ{)OC?83`Cy%KIvflln=o`Gi1)_G^v zIN&Q@Po_Tvl+OxGApIY2bHKi})#x4Gmc(L<-a{Qs(jtaE*WaFEKz+@w&5&2Yy9TQW zM%ge<%x&@PfP|)?2L@=_)u*ysez?+MIOfzhFf|>~F7ccZb-{A$7cU)h30P*5?;SOt zAVJ-#1^qlrx1P-V5eV=n--+(AB49*vZQL>POKZ$yMr?{;RS3C}PXa=gXJscMH-{<~r+`qU0m+ejO6p1qzW$b5 z3?vGO#IObW^-DdPk%MX_a}~pxQ_gyc=l1`OvSv_2e=RMm!D7qfVe9!ZH*9*0PtYu5 ziYkCfq1Zci_v4G3;<|&{rPQ*bi!vjke>>jNxL8fdBdtWBwHWP}n1$rM5d8@ANCB!U zdb`uW>isp#MZXnNmu3Uk4MjhBMRr5v35DPJp8vX{{9UgZnbO(U;E=nFPIXTKO|Hw! z#|y9*se5x#{VzSwY+|-n6FGK`-yU7D7?jR`_m@is+!kjR;X=wmXFqO-)I@ZHk@^8Vwxl}@ZUB+8|s zVO}T|&53b^I&miMo*IcCh<#gWARiW|+xXemxQa7=a_+F@2@be@WD15x=3LRV@O2iM zXneZUBC~tIGUJ?gO`dD|=Zo8K4jp$aD$K6Ab4{rc^3yFBJ zCh*AVWv`oxq@s(9=8WrqeO{T%Z_ZshIPCg6`U*@$%Epzau0Sg~SPLEYRV5DW!!|`U zDXHz&J9^f-?3#gL9j@=js)CyqI&KkGWk)V*1UO;$nzW$+pa3>iNy^3gZYg5(O%+a!n~ z`~fvc89NZGoB;Q>kTQXx?sonlvXc{MP<}THjl~d9Ca~4Ch z=LPIaF1pkP(>=?q?Q!|umPAhVypMo3v;@1g@}Q?RI=IR1 z1`p6TQSQ4$OG`1N1;RL?8#Cn67u2^gPl5_^6l^At1PVZY-aetJj0+^6(>Prl|`H}QMP zGQ2+OZai%35LV5~n9Ug#SE$OTVK_(>{JN7;OKn$2Q*Qd_lx(VlrY@q016zNzJAE3^ z&Lj85h90+tL1X*FnU5eVw*~ZBN`{Qj4?0Xjl$l-zrA%u`^EqrNg!v$X|8QKCUFys{ z?to4Na0DJ0ypBP9bTjrE*sJVPbOLuv=Qv;Vy-qh17>><2Af)mi7Vvi=H_&OObaP1> z{_^W@rcg+C`oMipB0+YkH&Z(ruZ$lRoti_Eg2jlk>7VqrCU4Zyvyo%xN@%oTEFb&c zPsP>PaX%Qcs~xvvJrH;k597a;$o5QEiS!i7TvQyuduSd z8}driax10_XMRd~XC?2P+-j*|!f*PdM;Br8qw@THsvFI(YFLrYxAN;ICj+#y&t=X6g>xk;k^*=6Ewn>V?yS-%Ah5s`YlP1c%S3+Dsik{Zlm)khuf`?Kup zUbV=cPddEjydlt>sgLtJ%D+hZTtOzXJJ;cK>mSvtR_9li+4{5uyF|A$zM5SPihP`7T#0R>{Kj*tdNhvOJbE7-?A_|iO>DN_tAdZTw)#)c zRCd{EjP*ToK%I<2FarD*W+e%x2)`+pnKXr!#y;( zGr4!d+Lg0)2uQd_B}DM7-A2nI1%7XG7B;&LKw)<_P|k#MQdZB1q7G+=O(OC6x7MXs z&l&|fiUj(|S^y1v$>Bb3=sSeUvl~z0EhH$mgXABEa#L=f2W9SIr~}(0=smfoWPU+)aL8NjCAb{!SjzIsgp)fm428-Id8yCESyn$drPo&Lo zZm#H|Gl}k`wy{1rL9gj~aBhmYUfQHx&QD$jwxn6`TXB+}A;x<(Jm!XYg*3^Nwr+Lw z%iN1zsDD@inT7R92vdPFI&-MFlqB=ZA2EBGeOWLz@nl0?Jc~#lCd#f19;mIsGNtqb zW3)b(O-{(_D~UVKuAOe+<$An#QG{J4OB9WO;e@W}YBs7P;X0usigU?&n} zQ$2=7#Kfh#ki9MFXxUeywYaN`o142tFt2d!ZUa;~{ASKu1rO`);zTv-!JNP03A6FC zA%Pb$C3m5>x_ zA~0*pRluX&Tb24yHjBfqM#9;sqm@;Te9Xuj6G?S;-iQ)|uz?-v+hud8=XjcxuGa~r z?6(eP1ZAAstcSdBR(!bq#_wU^Hwj5`;#1^}?a_nv3=>(o2jtBm=A{Wm0?^=}%uq~2f9tu&$U`}}u$ z6-ntUG4&k3cxe0g6RFV`iR%iBRW^3OST|U{XoK5IspFqm*OP2&d&CX3S_W8US+d>5 z-p|&s?0g}EOgEaLC%wZNHUVGRzl74r_C9*9xN~ixqOJqp3j?esSWpx}%bAzov`iZw zw~oHg&kx>8Y)y7Y~ExStmP$NDaKtq$br1YZ@7{e<#oeA&2 z9PR4lyf11!x{}H^ZPq&YDpO{6xtQ)YXurO4CdDx9Us?z%(LLqHQ(#O*cE@k0=Y;l> zvZox+Pd@u^w4&0RAc9{{Lk9pBe>=KHn~#81W_PxEf(IAtSJM75FP;kk7!$$MZHsu8 zEyz&M(3IzzShKQOi`iWqP`y5cO8D13nU~rj9kq8e#ppSNg-J-Fqur&lqIOom9> zQBqJ)Fyqz66L)ztyx=4-v1^kiN>n1??A~WK$xkMR6oTN(yASajU+;(L7v|jOy})>LhuEuy3Luo>7LbC2b{ZfzKgB${MKJLZE)^Mt{QE?=?jUBM`Of zXSTjH;neG1@K*3(U6Sc{7fVE>eEvp>xh!x$}a{g(pQt z@kv>8g)jHOCMpluWqBOY)6;(dUvbNzK;eM1p8;Lecn(h<`<|lp{a(!IcO50PPpt!R z>V(#M!ng0-n-)LuMh~A%owS07xgF7^(N{%S`FF78j^^X;*w-bi))Q{86x*GLbP{Ke zlalJ0!N_gdio&tCLifmtxE$YY8m7B#X`K$LKT;d_^r#gRG^2QlQYYb@iw);-YzUk# z`1j6yb;ZWw;r1u69~x?RTO>GiZMKh}@$E^|W~ot=c}uOM5B%|q4p*{JnEeX51axue z+~CyMplBPj;0Z`SxNo_JqP~u!L?+AhNW(E`qRko+H>e{0g7@;hat4vte0{(%R|6hDhlKX)|8iT*XXlvzaQ88Fw%b zD2A-eAUNujh(ZrEMa>c$BV@VxvvkbjB$mo*>|?&#B2rRYzJW}|B8a2)d(hpxw6t$X z@_sM6isL$b*$sj*kHCT};Te+=xo8rXFPTf)$x)zdi^S+b5j0#X#d3~OZ^{hbb>`-j z$f3W?9y5acsY%c;-TR_lF`nyV)A#ZsOflPSe=t@8j%~J9-IDj$x0&UWACMo z&tx}D*&|m&smAMkQ}*i;POhfjZq0D1l^TT)&hBtj;91&;;$UZqr0=FJ>=yn zuveTcNyPU4h=!%^t;bzgpPfUeE;v<$EzjFQEclj3QH( z7`l5JCx${lE3g*E#JIT zl0)Ui=q=ZT5{O_Q21Y6qxF>lD-9gF7<#>E%E-Lg$T}u}RPnw~`J4By1K3n`5v2@;a z)%&yXsjomPNi9yQA>s?{k+kK6+XJq29rM?Q3!^#0cZ}XArA#$N`zAX_ggi9W$z5jl zhu?DZ?E65R2sE=0uQ1RLdGL7l7-}qEHvx%PJ<8%7Pma;BF#U)o-i5|HK$f1WvQtz1 z)TlAC4SKh9#;>0g_+k4D*;4rQX2#a-l))~UoS9HPeo+QF|H8d6s02-V9Oi3_kTw~g znEmWoZ(w6X1Y*)&SUZBbgc~C`+s@bO*2i*H(zlEyhQoTrp&zr;+MQ`_fw`$NR}gWB zjfPe|#+D~0+9Y2__aAWcw`FwS2AH9_He4S3kQ>xvgi9={lu^7mCl_#KG zCHvW~jfrWse-3AzEx42d7+aDQ;1D{&yHvt^rd0=@V9xbi1J)R^=o|K}-TSDzf`=a8 zxf*6IIMvnhFd}znPVcqztQ52J^Ofv(6*&o6yd8s}W|JZweS`Aplb?gg0DaRzGudCG zW1^M4c9!!dpe#1--?3?#ThK>Ve4TWMVGqb^8$t#a@8-;hbkTt>H!=R}&pukl`+Q&s z*)U+SVA$xniqL{V3VgFxs5++o`nj*D2qF7rsUpdug;jnR34X>GI;~Xt%EH8bt0(Fv zB<<~IiXB;=8?wIksnh{>**~Z{#rc*>$BG*8=Z4A!wPp=uR0GsIe_|+_YEBeE<0O8aLzJOV8XoxVbhA%yR^ClPy^LUZ^ zc{jlFajQ1^cWwDN&?0Xh!-!J=04&!PK-6G?UW0T3ty{nFR#xrlPYwpzsgH^VO5E^fr<|_V+@)u822=Nqp$2KD*8p&U91!s zp%>~C`olH2a(71nBcScHJX@*NH1TTTkyGw@-yr$V_nEb<2XSISp=#T_OXnXAX80cK zxE^SQY-C=(b4zxkTl{EY*Z*hAUHdILbD`f;#D zruJ0AhzHV&?P2;VQ|pRbf3y6zH3&F0XU`gjsmgIp5^c-xZGMhTCA6!f-}rl2pepIM zg8T0&!uY+v9-p9%XmaE3!&T&BMydz*ZJTD{iwYejiwiw+t1lL1Mi9)X+of?A_tDXS zRn?6;yDaM0DWawRkZhqD0Ci-3lf}88=Tk@=+=?N4|W-u z>n3Y~j%t zMqYxJIgtDI%1f51cJ?UE#UC?(w08+5ZcKhnvKhcR+GMPQ(|IOhMoTrtD3u?3B=xQQ zJCT5)-DjwuOTC9Lq?f{P?b~3BYFmqrQ{n88#2IXDxC+iRoR`L11z`?>%-mbP4IiG( zHJ$zJop?$u5-*A=Y_erc0t$rK+n`jj?m-*$YjNC;obp)i*CIWGlgFs*Q|GdoU z$P_vV@_2f@`W)8YrW2&j#ut)Ez-Gpj4=nGb9^wBX`<10n^^R!25-7R_h-eTw5n;Nd)iwf%TqBjr~; zxk>^4+zSwe_!fMB(Jx`{T5-@@K4r~2p+}n-d}NO)^CLdW2xf0|p1VaXlS1r8#Pw+urxZcWS@bYP$FIx0;gHwRb)xTU=9V~0@`V&D7Gmn4db4QPlj3j-h@Vy#ql z-*Dq=f({AvU$58Et9S~4uktm!@5TzTdGR^UNLKf9Q!DU2$6>euUQp+w&0L^TT%PYm!K;SIg+9e)J8a2PRs_-SEd-5i7O^_S9ea}mf8 zh}k)b3Q?B(tkk_%Qj&1SBuu)K<12^b_C}TT$`dE|;=md!q^8=^@~4sff)2>xVoKWAIop*!zQM z2;QpQrzd5@TMAlQ@dI6|?z_J^-tT_Fmq^lOdR>DBuz}&>(>Nw+!MvQcWbkF)o$u1# zDv__TMSiqNXUvck%p0cbl7!Vbc_!m*NpNar#xeOw5np>jLgb0aWefpyM2AfXmW;D4 z(x49HlY+v+JeRf$wU^p=8-f!r?~|;5d-&N2yYXm1uFX!d_K!nV zUvYm8_PN+od-+l?T*2w}gt&86c~4@#>X)xsaRfET1d+>Ac=3u-{0@UR$RC<*I(@Q$ z7j8fALTjd*q4IA zAYkfu=K=VazG1{Q1J$cEA$}J=rJQHieJiN#r$Ve-HiY5NGZr$ry?AxE;&;8_%^@G; zzPJ2ss#7Wc=owsAtuQ)VZO>#-wt3*LBv$oGp#rVpbmoblBmn_2$N!F~8dIw2?IgOAij4?r^&x!BNBEq!@!?ircLC`GA?+{BGxD; zpUJAeD=+m|o#m z;ZH1gROGHVr^)}h=hNU>?cmqVCf?V4EkBd&9;${tk%?*(~{;M=qwUcY^4>&kz)YYTcMQ=t&NB=RYc~V|5wvCsJ z<=sn6PLC!7u*UpQ1kiC<*fcd=DUc^Zm3D1555i5tVz0?BJ{7#m=y3Yb=SN{75k6f& z@iJ_W%K;izsi1q2l+hAF1gZ)5XH9NdvwYB>x`6int7iNE?oP`^Gz?PI${hJmml21H zHMccZ{E1hBPve;<-2a&$;lCTn;qGlqemjRvQ(q#i{*mJ8w)q}1h+?W5j!r5}JC-Qu zI|_g(x(KPl+~?;3gKLU83MKpJZ(@ofD0}s1xUR#1%SObxiNMP7cAofaL+CS*mb@49 zOy&0o&3`m?KMt3g7)_NAmz_r%c32dUA ztebLoi~ZnyQ)no|*9j z_q-eNj@74p#=;7Lu0;+-p(Z74VYMR-U)tC3-VKejcSx)-=_I{2={N`|0Bwy{`cnX3tf_REtee(x_fN|iQEc2&Tvnwbp6U630Z+d6%kRzccq zJXNM~KUHkmpE4pgi;v=*$#uV9$6K>gZfsVd5aVRx&kRJ-RNIEmBY{5K5!K4aJMNn? z|M+9Mtp0VAru&2-MCJYYD3f{g~!*G*@=sHjG|4KP)k`?U@ zoHV!f3CRr+tL=$??sMhMCpZ~-;Q2+|U(PoD==YN}OZc1TWb^T#3af}C_VEEK2Cuhl z2!$r*%F61<@yc^cG7S!@oA}l%N$zE4ZrNzQ05d0L$G5hfd40tAqr#C{f!mf|mCTiQ zJxAN`#sRaozUv5{^psq4k_X;9P@Ofq4IEh!)vvA=M&L&ec?esbEmjACy z$X)7w>3gU|rMAXtT(CXEQCh$g@RPYhB2#p+yXevXyHQ%4E<^_Yf=K6MnM0<#6!{*N z_1Lk9b%P3+4L`Tsv9q;V&H8wIP18Mww1yUsk6yfdSsO*iZ*(c8lE7TKZS8{Rg;QDs z@p~d_WD@`bK>`7&GZ}hDa^|RE!8SU?QXt@j$0EVkkbdnPqY%`1B*I!M$LEM0bSxeC z2XFM=Fm}p08GfQP0sC0cqx4YXyL-$%_fb4Yz>fQH@x66pZZ_2t$_QM~Rl}%9Cjt+A z1Bj>$u2*$RuNGaf@y*rzbxsxKeLas;0dcEMZmZ+EwL*%b3tJ+}<=y%5>ce@_T1<)on@b>(<=jC=nHc=T?T`d$!|ExS%%#i0U zax3VZED-tJwR2^SLX2H`hQ|wv_E;Y5d-|q0hxj;A(xpO&NoUZE{6&cMFz_b70MT}7 zfbUXyEHxm~f#pet{UGyn4QgpQq8*ZQvrKf-Y&dWIS z+TK%luHCQFk68CkO0)}pHHzWB=``|jhbub6cg8XfK=KR>C&kH_KSTwdu@eksMfex4 z+!$pQXH%S^j}@q8z!+YU=KgB6&fe>fz<<>sYyL_)9o~2&45_yEC4q(VIL$I1=rr(! z`1pB2f^^Er!FSR72UBnH(Oyb?S?H!yEVvt&Q#$qKcg9Wz_=5Voy^slc_muz+*;j>) zzBAGMO7&s2@pcgg`N+KW-a&*lm*Tmq(gIZ};SaVNm!!gcNR#NpPpYKEOpJepdp#G= za7dH{(*axm295mDAGeMMgS+@wIr8Q#(x<0))WFMN*RSH;Lr=1m)-m-im(#Ox!Hq=6 zXAKb_*kyIK7SgJ&+TN` z33t+jQ{?rG52}YzUqzxXNlb=Q#m}}ZPZ!;Fq;B1L@9;dEx>(zss8+GUjjxMMpH=-p zqZ&ydoydVt=gEoVEDOGW4M0CcbtYyVFXFchy=E(s!>Y#-3sV5tlULtw5>##-kN}sX zn#J0~jgv$-p9`?oMjUx5Jec*pQ_GU1m4BXw*Al|rydQAp*(NPj0erB{hUeiknxY_M zr|${eeWKpR(phGR&31d)lNmd?lP93U*vp?fzq*6;Mf^H!h|0HSxiRjJmt9TV#E6k( z9hPSyhdLv`Z-7D8NccABb+uAC%rDNVM>4|9qO+f_Y-{?8K{*V+^1K9v!_@P#Q~|tr zoK=H|?Q6R=8>N8yVjhsdnu8W3K;L}{F=iuR9;~DDnekmfePwdzY4nE+ijQW~tcSlL zJdC?0ZEE8uw$Fx5z?$Io-XO)?xN29@`UeoUV$k83G@wSrR$DP;QI$+9fobN*kUR+X zy!n=Vp%G5&rI4@JlH616ubhF49+caIEa<5vTv80WZd*r*E}zxk-#=T}svkbydW|vd z=Q23sn4jK|Ka!7PR~ndARCW52RW2`Q2p+PZGthJx@`gu{7uQb z(<70yMHbD`$of~PZhB%?U%*I_~b>S>%2VHC6l0`t9{0TW;?YW5IE^QPn zV)+E0r~0ibln|gGqarqC<*VP{^erU?`oqmT!v>W0cC`dztAuK=w5*3$GLW$>_xT zuQVBb+4npq3DFIA&uSXI6V3$Er3p^$26@-vx^?(aACi}PMpk$!N1@}iEq2%Li)x+8 zc*dpOyNPvNq3y|?op%h!!nH5I^v|cr;d6MB#ee1SPZebU7%TiZKppsSA6IyQ{9N99 z52$BIONFsFc=EKQ655Ib+i+$^8n5;byrh(r>$GxFrbNhz8L(6yk*)q?@bZ81twB%1 z40g<6+}^M##b+JiT|tjeSf0!$_U49%!izx%=4pO&y?DX}?@&$#?LWzReGl_c3jg9e z{jIHJ34ufFX-1RR8HhP0R^Vk57iWwtg~M{lYS)~^)kv^fMCLCv-hnIL7#mAAIzNKm zNIZj1%cujfV!^Rfk4!!1YQoSTql(`cpBz2S^1Wc%9Y1_1`mny37dufD5di7qfnt_G zI{CB-K?CtCP!~>`+32do1$@a;(bwpbY}9t-WfrV{%mWJ19$W1yt%F;4k7X>coN0I? zcOiZy2nQcZq)5j;8YYnUGZmj;r_@A6`{8H6?5^rl;ymEWd(meyy5)O}t7DTNTe!E2 z7PsDJBOQF?L=SHy6uz-J>)*`iA3QNm1G}0pC2SFtHVpe0rx4|+E@Y&zqdZzT&m%rT{6`66 zZ@SXIH4}(&E$%-eGM)Xf@yR75s{aOhl`A+p$|UxeX=7<6>NA^cj9m_h0qF9$JAX1H zyz;yBkJ3_7bM1ZdL^PCPi3J&y{hCq9iYDq>> zV(!xPCZ8O(9naKGmsX8#|H_0PL#guh7YJnFk!|jJsiT);xT{?Ag+|W#u0we7*B{D& zy7P3c$F2=|2)Pt5!WF3LvkZ zZak%d;N7ejvvc)1k`2vul!gnGLI0I;UO5p}q1cZkv5Nd*)%Ni3Tph8rk8^(ru8s0b zmR0q_Gd6aY+QjD@T|zVF2ON=K|D%V%U4Y|{-Bgw60tMUcCGg+pe)&2<^vGq??QfIv zf|!fDLJ|H*62QXiElaXP&iWy&hd?*oD+Zot7K3ZUkTHNqSC+4f07m==!2JpAs@~r8 z7l%ucITtWhH07c2`g*MJ#l*M-?9=J0XPZ(wv#9dsKirIEr%O`NDsm^MUm6DHUB8c6 zk;i>p8S}fbLw@gr2~~Y2V)1C8at-}&=(wp$$sWD|6k1B zYuC;E%ie3Y&k}kiCql)T(0r#T%QM3#6(_7aJnM*ZZMvA2@&5%BgGqnaKHQdF{zvd} zQ}~(~?9HWT7wFf&I(=xn=u1_&=tJfT@xSZZ0uPYEtlq{KWXy~0*Sy#G#!5TH3*p*+ ziCL*}n$`Zh&_vZBDq2hc6Vw^~C)8 zdE6VrD+LM%iR+x4ch6_2q{wpdjbXG2F5OWL`tKN;hXD`;Z&AwY@6-~t{+$+r>xOQe znwr{gi|?ZZc!9|etxURlmj$B3`9@{5&*5)yN0g7tI1jgRAajo5H*eKrI&j#ezCQb& zh$Y>qJk0Fx5+aG&xuQMqZs?e_>iIP-Q6B{Uai^g{^iPcyW20M@($>Y{AB#tpXv8HB zefSv6xZxZ1rv$5)^LM$$i}&K{b-Y~1FvqA9BSKNy)CKSc3n|P@?5vPz{#;`T7&BZ!Ng%SkT7Z_U_{Gw_v+(%I zD^t@@U9N~Sj!oExj@(Td?X$flRf-=*50m7o@Z%TBe^f#eRv^s3opAlbl-gd^Nu3EcBdCpt&VH(-PsGKnKc?|wIkjb zyqW@k*LrAY%jua z+H{XsaYOk0fHvwyA$+zYPe7+nx`_%Z;0E~wjOkKNzyL^v>b#Fh#IS@zV0fdX zvpd=nv?-+(baSDdIB6H|>IGpkS|T{*jq#PRuejR)p!lar6MC{;;1Z7f5V zk}Py>;;fysFFa**ak3We2JabUKl!t_d5niZ;-cr9503NhH8rf0kSCp<0*{=;bA1D- z1Y9S^?$#FoLooE0XoFNSm$A%{vR~+P%`f^0P{p~~ol|aT>ypoW2;%<8N zjTP6D-|Lw>y?clM%04S42R0iODv7T->iQRQL?e7tvxiV(;pdb_@AZ>-gCq0Bc{+Z; zlH9H(1gw;zg*KN*p|irGZFrr^q3mnwhLs8r z%8||z+?EY(yG~Q_i?W2&b{+saUMI8M_+TjEw3hL=iqMU!EUK(t~&&1^}?6?G9 zQLsH7O4Al=6lhjqXXtBxc$I-pZ#t-8Npvq*iRrhqH+)occ|lx{wO`_N#~)}AU9pt^ zKfS$mT$EkgE-a!V(jg$-sDKDcm%va;h?H~-&d`l8fJk?DNOua-pfnCh&d}X4bmzVX z@B4Z0=Y8M(+rMvrdvE?5Cf2&vwboh3aUPd#DK;OK5?lC4!P0SmD=q`KpWtsY<`a9! z0(M2w`fwe4iwCg#>3%p9Y*~182J=hKk2?1mQHe<(K>>5xol2GxJXHFg^|WF%tVJHzLHwHHNN#=z>=~! zoM5+ei*#N3b-OFs_$5-Bepmnz!V8a8eH6B`@VuJihD^Jy!a~87Q1Ucf9jo2VPKu7I zP@>3Bu8G&6oXx7pZ*B1@A&Oc`f~U0LVVVBvLn~0&=QwIkF1_N#_ZWF2af#EW_56o@ zL#L;qSkbUPRVYD?#<|;Su{ll?p7i&31w@;AO_ldJW_YzI&kq9Q%ylRuhRXVAA*lNo zbyWtd%*q;jNl`maq2cj@9J3T4rc^O9^@+1&3s&-8F%eZNy>D=BlkECfSz4{|dWPJVIJuI?1hnC?m8h^ zUgy@>AIo>d^UQ)fhhV9O=riu2@skZG(=7IxMT+ddb5V0+Pi56DVp4lDEMUo|yntc+ z!{dmqy05`yts~oqK3Y96jvIEsSc(uFZa`R0WjJXSNxyV{y78=Z_56ttPD*GVf0uD= zax&$91pK)2s{yzC%P)Y(sC3?M>gxr&_x4uYTQjK}=%diYDc?=fe~E-K@4e!Mbu)k5 zmUpXgLDJ1=)-eANNHy=_Vr7`UK(|c$xWAq_t%4<9>qshod5HVGR5_!pv?17))*B7# z3O*)T#njT#+}SFe{cAOQ=tT5nGY}N8a=ShcFJJh}fd{7Ix1-#Xt#9hGy;c)mj}EOy z$$7?dmuJ3}rY@G5X+&u+aPy+3qTjx1GoH^Z)t?%vs)svqGR<2>NAp1n0*ZB=?i)?PtUvKBWV z@aFJ?8%ML?*$_aDDmhQGBqOSvm(;r|>uX6}t)yO*oR6@Qel`eObE+88*;aFEDqtik`Zy!UTuPy*zCXBSO%)bb zjfYnksy1Q$;k!F&W2=n~Xu{NTKCWkj3as~WL3O{j!Bjld_3JB&ha}r|uG^5uBTWW$ zIIePfB{mYv2_CG)BXU-UygNd5^o#Z&_Kzn!1fx|DmQ?7`qs{SJB1|B{4FZ`Sho8@h zx*pGO_lbrL4!#SfZip{muL5Yk%a#>B$(!QWF~saCP;;gK}bj#5gq+l zmnb|w-oN-^eaq`J^P8lNKqDamAYG@E2^@$M%&R)Oo^!O}^UHbbN;T=`N!BEzv;%Hp zZpJuRc4HktIT#)W6g!OgY!@Hn((rpp_~9+|(-HWE%>s2$%{QLr=+=Sb?ltdklqxX) zQBVxD*>1j0T?bSC$zi_Rb>gx?SE$_1dwKtr!<2=ole8cm7gDNc-bs*${=p-W(^Xo- zJI#nXSheM$BQNovoMybnpivFR+fciT1BXBVlPj5RH#Lqv1s{Kyc=~G>9+#w|_gA9X zAE)Pr7M5EQYvl~trH4P{|1$^s?p4ls$K%HM{ajI_=^4GYeGc}vAdY4)X;aaX*Pxs6 z|GUN&!&eiI$XRPfGsV8BzHUWX1u0wGNCXx8pIOXq@2|{#pRjC=Q4elaRoC^QxZaTJ zIot$OEm8dexN7PP z{Sgc&ZkH>3D$uvXXHjsKh=7em_a=;;c%xKuI_J)qTS<290Y8+%-n2xVdvNF7L{>$T zc~Jf+ZYSH zW-S^=Td^u=Ho#5o8=ei6@F+Cw z1ezMPqT;jyRlJ14wC8f9LyCRxS|zV-6Z};lJ?g*&2v|mfOMpOFEfekV)ycQfP`7K4 z6_+F%q=9cBq38^llE^CeC2mH}4A91)G$fi&Q5P`oUcEInpaZJj`lwlHHA1b$`gGQ| zRuY#$mhrYc04RZa1+4;7N5z@0nVAS1Gi(kOw5)5!mMN#4d*9*%5sEFP2jLDD-U(k&{p@4$Fb zx`y$_xk6S{P~tE?;9&&!wRs^M>oTu;gRzgzJA-NWu`HT!&D2wG$z*hI#pJi~ybM-c zJ8&n%^ESC9ChUEoC9Vv2B02z32_RM)vYPmw;)vmqx4jJ8-l+z9Xk0xm@IYr+TEmg< zIkf>38988W3cW~E;U?Mc4>r3QOpXKVS&b|cw!d*dFw z4r&+e5CWaH=Oi|HXviXdnn&4XT1aOm!@thHWtgSH#@ zr&XS0?4m`lK#T-%lz)Sc{^u|LfJ(qhv&r5)0BI>0>Y+8yLYXV9H{I2A+i8x~%B_SVjWW}k42hX;_If*YKBV_2|kGE~g{ zj7Z)Zn$Kv`Du)bpMNyYG0vB^`em{@uMmP1v}^z2&)%oT%^{9MVge3B8($F&PV)nn?&UdLejkIo9*-`9hze z;NB%sV>fYm(e6CRv;sx4;ClISu#bRyyMgJGAy&*qQnbtt7bXcz?y2E7p6A$xDRzei#6$yz3tD|vFN(L2GW#R!|{f*UcD zOzJh5vD~4PBkC4rrgi;*{4`G?)ex>3b-k=*5<~8K(Ct<4jVBhbz!XFGJjeA8Wp27l8dmnOW z7$mF2SN}P~rXmIeE4Su|0KK-}t|V-?!<11GPGuL&Rw2dO;Jg`-3QWrH@rCWjJOFE`ig5e7xWbJEr}k{H@Xn@367)#^mnjh zQ3K3+S>5EfC%o^wF2O~)1beo=+V_$G@6px2=(K&#=o;aD0a-}5)P}s|G;-lRUvw*; zFNu)9d=so$-}Q9^Jhf?_ zilxHdgY&b?X@wfL4gJ>;($drYgSji?jN@q+tEX{xVOQL*ENW!>Q$Nx_3R)~YR3wDG zfFE4Kei=XGa0u2b@(sYxWLFd@>LEIRr`tJ_qdL(sE<`}!(;5*MxAN$PBjx{$L~{zK zYL?s%SxWzguXbbUXoj5CjxF`H~g*B#Zl=08}yw#I3vkKPC)xrkXD*1YfJ5-He_%;FF1R}NVp z!bLmzS8zM(N?-3BRXpUgKPgLm%2l3n@aA*+d`~Vwb<3aIE9zp&c^{Va&g!0F{Ktm& z)vu}KPsQ0-C?leAlHMC^9|fF_BsG%LtT_U97Y0swa2F zL(Il7-NmW4rzkVdeb46U|jZCZrthB8s(mwOx_UDqCl~R~lvFI5>Jy%$K(# zU zhDWVjTR|}P!kyNFqVg2mWTojzLVU2tg@(CwlSc+`0(~sEZt|*}8gL$l>yrD|?o57~ zU~B+%X&=utDdXTM0wYr@?f=%wVEO*GyID5i4o8%Jc~2HS4+OoH7QwGh%maoKwK>WW zVLEN$6VR8Fb0ay2RI0H#Dd{<3AWKy>W=O&)X_$Iz8)o-`tU>C5|6u~hGVhxdwyrYp z&v=s6U{4@q_7Q=)GVmV1YhVYTTUN_38-Vwgp$R7@wph^@Rl8!~lAnu-k!kRT-U`VI zwr9$K?fQAy9^@#F-|{kIQi5=wf+O}}Pvq$jIV0UYZ)2)56?W0ZD|{2vUr~1-UbbWU zPFgO23{wZZ0DgP%c-yXedQAgijG$8?UAiRu8e}9f4ld}Z+GTPw8$WdLf4| z#dUv&!}OI!0UjT>wZ2ER)lB-CI0RU=G-Hm)a1RTi;Sfj&^9Q!=4{6Dzs*~Im`5pmE z5Yk8XDP7@eA$KZ{EQh0Cd}|k_*D?)=Gv5U_sl3%>yW(7?`^CY7GH0(V97SOE?7Ca% zMh;$Ec;&YedK!lU#lN+U^_}!p&(eFk8ZK-$dku@u%g6F{w8He)H`ke^u26aQ)Gjz>VxAWsv-Fye8dO85H8@2pFJkhT%)6!Jbp;c8?qm>_trkxiY zD#dWNt`Bx=*v8@sm{te0**;6}{u0kq&We0Cyb|H1Hr=Eo1aJ|8SxrFv23NOxmEu=OU+ zB}NaW6u}Pb^Z_tH?PsK+RH7yD{{XT7f-~D32RZKg;=*-XM#4Xmn+2jl>m9B(_pUURuDTeH-$ zu?tiZ@(3fo=?r>+^G;awm`ryQCw^$U?0(R{;Da-q9HTl0I{48s0)KtHe0dqPOQfQ{ z2!yn-@$G1Q)sGq-1Rv}gW9D5&PC9uXab@qC+R(ojX zh@hH%jFO$M^!ZX8^3M{1;=BH3ul0ypUwqhTMxYPy+alQ$fa!jD4Tn-WEuuTJ`ApAcCKj z!XQ2^UzdqU`1K+Vd--*z@xrIRe!~K`nJ@p+urlXXK_Q6!8UPsP5*u7*SOCt5a33Jx zoJ?`rwg^PTJ)d50$1U2A$J|cnlJDKhe)DCfiv_arCio3@1rNtE#Kq)Qk5fZ!k#h>i zS!Xv9APS%H!TxkfJ+GwW<6ssCk=<8gnkOzU`WJ?mcf_SiD09MEgj}Lh>g?R#+3X}< zS60o_aF+AX>?U$7Q*>4O{P@YGinw2V;-Ui4g{W@>J_`sYM8v@Hrs`6Pd@GBb^*jP`Plcd>Da^oEgI;hd zY&jBkXxnm*fB%^2s|lD-J~fXDl7}%9oO|;TU^7_Y@nP<2xa^Et?|CZxg|$@kH2nwt zs?JPbLV~+at2+k4l$>&fXd}ajdpM?EL=t|)|N`*`NwQ04lao{dOg*#=Z&a*f(Q3uvAN#$Z0-vG>jykZ-lhYEg=S#vP`mdf8+ zyqUFlI9Gk`6>xNRUKH2<2?S|;a+WCkzY_Y zzhGURX7idQ@;ACz)ddeRLhwiWgku1ZHR29?n2)U%wPtb5ixbPjvele2A~WS8kDB1a zqmCj1Fm{#qa_L%WLKq8Acc@s+_4m1P+HOv_&`;ksf}_y)AI&>pJsqy8`_|=0x=KTt z8GMSq?eX1Z8ChD$2^!u+u(cYV3h0NYR)P$*2<91QBHUT2(>P@|bluL;(G&@9$Lu3A zC^YJ$tELkZyXc+eYi|R9BgJ_7TV^+9`r%L?DZ}bPJK_#!9N}4y+U%YX^d~u7AJiqS|>uXEU}_`4?UPhS^bo=D=J<+ z^F2c-z~i3;UuB7Ia9fM11mIN0A7X|VrB-4be&}mZ zE_gW5oKMOzjR&ua7s!v>q|G3qPpU{$mOoE`eli#(bGS{N6);l>fSQWOImLUeRIh;B z^{ViRG}%w^ub8Fm0tkSb7XG%j;Aq2;f~=(-Ea*KR(7l%F`ju!C9A{8D`VMAx1X!yR zpj)|SCIboHMM5ii+m4DQ&u+Q&zHU^i+|Z3gBrmB6e|8a7LFejM-loqW0eab9S^Xkm znTx|F;+T%QULE<>>)RLj+re04qc}!>ngCP@`6aa{1OS;DvzkKc4etwyeKMIwX08*j z3V9FJjPjT&W%ip|2PmSZ^IVDIlcu1*`{jA7ofks1+7m3WbYo~U{JY**6h0UZXpq_4 z`%wSl+u<9l!5pua*^%t(xSx5Xc&ikP#3I0Y(?S|8%R?hTWr?;rFk?W8N!9c|mkUB? zqtqi)@A-hPN1$GBs&F-X{AZsScbXl8C@At;&{%#C`?sMBx_mCOFwSC=$GV%l!(TLyn;gLV=qLse5X+1IeDevIXhy^tu@0O z6Q?>~XnjM`rtoe-Pqy>?yT(T|u7^_fHMQ7^T}Tr8yMj_K`b*KJ`+ zQFlrpbQa6}j__%D$U19(PY(}?d&&OLSz$WMyv{>*g2YA0t>{YUGSabSr|v3*8L9O) z?vqsrZr&5b46JfX(@eC2cZ1X}PPu#4=`HgtwE-?K;mEIHaG=(oq)jhdLt1c?EW*0Y&z|HFr?)h*lN& z;XUlLgmp;#LWVELH-nYmDZ}B26#zQ@fjpv>96q67n9pi%%(!FJ$+J}y?C&pg_P5Rs zBwoS~H(fb5G{ZM7&$m(ppmUxdUwa=R1@q`|T2Wlmj2dR5jG=_D+Vkh~_=Eq`i5?-pIqIr{(JJk>QEL(&l4p9|<8^8||p3fxdpW(-nbD+j@4` zoggz*c`1XBg~-sj+_g2y*{NGgWLIIXI&ZHFvVs_TDbiEaff2NN^QoHb5w9hP^PHo4 zx^uhMXxR{2-xJc=z(V(u_L_ag&zb9j(VG>i&om9n$Vr9TM3us=&pxC7d&~HD$JtzH zSJ!GGDi|TR+&~obrQ4ChN1g-yl#=z1NEJP^)G59BZ-L+lkn(_4KmV$s+oA9wv9V)O zhvmU5O^gKN!nYNB(4zAKGA6CIZqNJt&vfKwcQ-);f-t4ZY%;jvV5Fj&(YMuDlLEn` zp`5s$rAn90$n5OU)qzqB`qSIfbFF>@K&=iKbK>b!6d0RvV$!rsrMo)BPYEA=rxN^h zsLH`!lxD>-t{6>lr_@QbCAJ{6i`?d+ZD&f@OU|ZGum{A*K^TQ2a!-Hup$l1ROu?~7 z6Iy+{(9{Knrfm-MowR$U}^5G z2db)u7hCL)^Bw&wa%o?@fY-Zy(K_^_7-+c};7uu-9}TWF9yTTKgM|EwnUT~Cr?R@m zTe#H38d}zy8&4XHCuqpCG*$FJEtQYR#O<(KVU8uhl1vQk#qjX=N4*eZEf^o&k(vWkkM1|Yhk zR*%YYJIbDaL2Wv7jzQ!1I&}mlaQ7j5n7EW*odK|sbIx??%W})R)sjJ!?@~f;ungjI zaCET?URrd)veTL$VKi0r$c%DCLWD2wqsz*TE8Na!(J_ylCWG4QO&K0Ejb@*Dz34OQ z!#gYcGJof5HY%T1nhdPGH%Vs{u2v}e{){trskyKn<9htAqMv)s<6}c)hp@}kb@F6H z>{3g1uaPs4fdApde(7=LTJvPF6wj+l@Y&yrV(qAoAEj@B9hnXuCvzC~+tWISRl2T6 zn_|_LQ!09`JE$fiW7fOd%|u*(I_~o%L76!mkRKH}+h*{-kwg7sOQ;~l7jAVJG7 zB`O)$WM2c0YwhGX!l9j9NbWr2ka? z4m0{I80Rxue#-3)Bs67eQ3vQuuePm~0Ts&@+mlB`dOvu=q~+IO3mQItmoQ%XF+{J` zJvEH?%z$@!IhLCvYJk=>^)9^~6}+I|<-SP5qiOS${}z#S`KpnTjp%@3jMsn@AT8p- z8uw2f5%*QSfMJfxUG!{jsDs#qI;9J>J`)F@UoW*Z2YTaS$L}&SXA2&DW(GvG7KU!q zY7sJ8L0Z}%)+wC2Rm?>$GN~Y$QX{Y<4X5QjHPs6p4i=c%(0cK$&p>k;h#2#n@lujE zKg$K6A!_pG<{ozs>+)Jml{Aunw_+dEeQ|y;sM~97*q6f4QAqM-h1q{?CAg)vuou?# zbD@1{oX|{Rl%N5Ny1=={3dlt4c$!Pm?9fuDElvcdiL5CU zKXD&QcHPh+-zjxDAGx3?%wGYn_h{fOvgvrdv5xMyjz>*j2+(Pm5cj)-IbvsDuQ^*+ zxuKQwb{H`XvI8iLzH=E$Nxbe+wZ=~S0svEA6Z?iG_k5ehg#?70?V6HTde=L|7NnZs zTW2F{6av5{(tG@UivQ9DOw2z`1UyY5ihO><>iO3rVz_(HCsiG3C*-lS#10mS-Xm6KA~_D)p^xwhLb z6G})V8=#&P%AB!ciHaM(qkku852`;xN)9TDz4OXj6Eu;ZxrZ6QLIy%4@~&*i>LCsw zV4I5*PC#zpK1LzleAhrL*^6Z^)xf-^Hs~Nw;|BQg{k6)b_M4*w7USO~Y;Cy!(ZJd0 zYSx|5yY%2^mZ!}WC7Pt6Ba|rN0wo<)A5MlvLL_;;G~? zm+@fO#y#t?=rsD$ITn_W+;025uA1^`KlPs{at0fP36XSD1V%-@3(ug+jjXZ(BtlA} z+~0Z09L;};$%AjHMu~j+sb6W`g^+TQi##S}VhmVN5zi0+6I2z|D4hMi!$R1G0b4Um zC|w~S(1?g5ty<)`dSl&1bZc5wuAHuECV*=IroD|%^Bj5~KmhtfW#>n;XfmC>Ge+@8 zWc47gqtYI`fAxP%l5a$;MgK&ttQV+-{dd%-|5m{FKS*MKHD-AKU9xCj%5>nhx_Y2f zZ!fuyNj1RCe^=o!y3zOIEXEDrs<+%I575}A4tZ3Xtbl>qp~;aMmuIGoHF!06j9Xti zBAV+c1?A^zA`N&1k`|BQ$?bh+`|QJPo75-5``y@iwVAMTPXeT z3q7O|;j{k5&$?)tZ@daZbM!Ox-1Gd^yoi}lt@$HBJQ6a0<#IMa58)1&rya?+V_{@u z4n$8o`SA`$aEALF@jkP^CqJ1Ln9__3J9rR@9SJRrKXs1C)$4I zg0)TT9#n9To%NmCep%>;F^qAp11La4l3VqUh6@#C@*jOBn2W}wjHpQTb9mWjDn^qF zC7Hg$Z&&Rt$Me@@VTOt!ZclE>h^PJjq-{(WCVd5Ss>RiRGxy2)Sq=F@Ndq~cDB$ z6Bi#?Ta%Vx;C51Q9bj(Ykq(SPJ-1ejCcjcoyH~sV@trt9W6z(?rEsy-H(G;(n+M1U0D-^Ok=End#l5!fL%%C7xvcn2U3f< z=Vp_@(deC5hdwr6ERk~YBZ<486uV*+H$y*&W+5kibS%dxpLC`K_Q*k#bG1mgB$2&B zjU*V7@-rTd7w4@vQxrN_OEjm67k}ecC_;)kFJ$cBW2(yh-WvuUpG{XBi9Y{YXN>Nc zo#NL-1@icUPzpm`7wSuvH2w+dP``r8!f-)_Hh<-^4Lz;5Ov_5m<~yjFak$9&Gadx2 zpRTClQ6o~ayNzxyMD=J&rP=(jU_4;TmfC&E>n_1s{K4HqO|kxP zY39>XI3MyB1MV=t`fSA{YgJdRTb8aw3& z8C&#eKMO|P8nMj$L{P;zRX#2~$u%Jzu=H{0R zr*bwAre6hAqx+>!%t7xu>-Si=I$+=7n?FdS$5@H9lo1 z_3E?{%dcOR3}iyCJQ@0jBq~8BCtTz&Y^*7II_v!ot>R(n=O zrseS#9XF6@c9?pVS?ex6elL?-x0RXBpG8mV!3$lWE{OC)) zru91}SNApv7KBq(jB!aZHdPvnI+cBjA)sP;%2^?*Pqa9Kp8@V=uPHUv*<6N!hKxlE zYL0Jp>IlU;Pz58Kz1)!db|;PRw)y zxySbp5)P7%J^Par_w;EvP&PShdGZ;cK&$GO+C(qZH_~$==&e^x9YC$w4{71t3@Zw7U?HlRxuPId4W=O%@K)wRN5EO9If3xrT z`Bc^y&NxTNi6B6yR*4m#n_5|(&i!^?u|oiI)XzvdED-rx^`A~*cMICSWIOlc^HZB2 zg7>Pmgaz1e`BM~tM$Am*T%vH=Bk6znI?k=2*{O44$VrT_=-!v75DcKjavq(+14Gc% zi?54`nO^J;;A_y1#TJglB)Xw2K=Nsb15`njqB+-;i{_7SMA5weq&5G5hyRlkPxcF? zR8P67JMn+x`c$ZJllf3K15fi4HcjU4KN9`TK+~XMw@C&DLl!P_rKx1(2!Il_OZFEGpm$l5dbuUv)b+;KQrvTA_x;*XTf_3#9sw?)Gg(S3jlE* zI*K9q$Kie5U92#94$O6qWA90YTGV4)TYy5GtP(Q^20F@$(ODy&B($u zS2J2-Z9`*CBQuEsDyE2PqD|tQsJ6=GHu)YKKEXf}OZe<>Kk8r?8?BnBa2^>(=paDU z&}&;vmyGK-TC!8xY5VsNB<%wYlPbB5?F$aDujFN7f35{hX`_7^`m?~X|1ZajI@o{t zV@!I(!I4#ryQkyhe;jXP(KhhjjX$OZPsJZJE{f4L?5IG4VyrxTr>I?0`s)B{#V+M5 zo4KUX8rB^*^6DZPjowy)L?aq!N2sq;TtjxdAkP$rYCFxRW3kp_iL9b!11kAOyo>4? zfBm#a8?^M@8n$m8#^Q_a)=Wisi=-UZbcs`k-DaPuvJ;+Wy}(t)(N@di7AkbPg9{bd zu!-=2i&$SCP>JZ`Vb{^)-T2~)!kyDUzSwyhgR7vhAl$L33C~#D27Y&y`PW$-7RvJq z7>68L)(6A-MDL~!4@J;9dev&@`5V*VSAF=sJu{Oh@I+H6HRbWAm9+O~TNBRPDSeXc zd0U=F)YS(IhAM?~SB_T1CL*Qch|}E6OmY%M@_IZ*qV|iuE+Cxw$)Mtbp(bN?+WCH#B2n$O z)QrQtEhkJsmTQ>cvY@QoEO)5}b{?>(%Z{s?^D$&qL7 z$cQFB^V0~fO3EPm6h&FdTty;}@hTC5=2^z>`70Fdo8#0uAeBs#7-@SRgUNvky1H(L z1ihTWfCCQ}D^ae9NEk0WWTcNcz&KLX;rZa;d7t{sew@SO)Mug*UC_x9q2VII zR7})j)lcsEi7(awC7k@QeR~)oM%mf^PRI|~0~XY8@AT(F)}gZ^Z-Z6o$BM^q8=GWl z#9}@~O$+eY++!kn1te87p=4ky(tIh#nJ~an^chqxx9q^4T6xTJt*QHLPAOEg@Vez!k6eY0)ZS5U|hNz#}FP znoIwuyUh587e0>H+OZViJ%R@>R15TG!J9>x6#w%xfJ;5Fpz#S-@ykz+_lqCZex~wI zmmDpERqtfv)T!JrA6-sKL+>xMQY7-V&b+5U4gck0gzOcBTS4$gvKQK4{xqDs5_^pC zNhml&cY%Gwk>*vEBi)ctquw1IwbdIR%CP#Wn_tR?#{br*udZQFDTR!MMQ&n`uLC{j zudp=Ol5O2@9IEekDfiX}x)rh%Xqo9TZkFTrvz(7V1PW+@d(}J&JGw+UP27ZJ$BZJm zX7=uHKm|?BN({iCulX+CdR2UpcanI=IPnm2{zE7Pu|4J^To1B%-jXz~IU<73A`H*{ z>dITpYYrR@MrgfYhU>9!^&2U>djI(ZhU4$`LUDKkFa)4_vfD{xv)9d1*wils*V5n!3S~hGEn;ud;XeO2huHick^%qak3NdvX01X`&XvH+GGGaJV7h0IXZ>R+Ry8De zQfzhFd*Wdb5MkLfiLk3;wpvjG?#TZd`nAspOW>vc1Wtsdx=|Mq_9H+|rJWqRPM!dC_{yJd0ix>Anl_IN37n5){4@*3>D)e(|FWV= z%&~=+Bky1=d#!164;L{i4xx`3CV-6MUl|H1r2>m~RaGpvw=>S^h4m@#cXqbwXu& z5x8Ioqz!}T3fJ-X9h>ksav-n!s4EAOOyn2e$a4kXhyy%IK2IpuTH1?OF|^=EnuFVE zjuEEo61=F&t0Wrm(152%*R$OVGo9UmL869Ex;lXQ;O8hu*vYI0dK`OGF$M7ujD#T` zuJoX|6=Z4QHRq6F)<^|MDc&Q5Fu?bxS{Zb*zzZ643UPIyB-e#dLZ0a-tH75BK&D~JyL zZqTCD1tAHlLSWp*$Pp%6qDjEbJx``u7^(?kXPq+@Js)GxsY?ys?-L|-J-*Dk*NJiZ zS>V$q8Ia{h#E0hz>$jd9vY!5Apa&~-luL_L%7|p|td=wI*{|ZGn%MwwNA*cYYWDCk5VWV>{Im2IJ}{_8Z$IR8PfW5((`WH5P(az92}48g zgJTg?(IP(!?gHHmJ=nyk&#h=jt8T=v=<-J^7D8T-xzHMS^s1)l-kb` zN00d;F>!(K)5-k;5I_wVp#m_z0(>P{z`68BqQyUiX?M}ySg*K5=PE2#h~5!d(nAH}D<8vpNafq)7**w*X2fH0cnU4O9fAcaSbEp(RKt5fSNx zmV_39QbG%z1PJ99zxUDS{eI_w@euv-ixbnYHe<);;eY>#8xFWjzZ302nmX zRrCRXQ{lApfYbD}|4iRk2-uh}v0B9fk0`202qoR%?08kZsZvW{?+VvSvbu(`O zfbsk9Ke{AAMm7LIURpy%(J;V@gg+BtxZQNLzFK*1S@$!?9;se>apIEY*AtC4 z7FC7h*yMCW53oM9y|9fK=24geE@@J+kf?{htc%4s!EAUheb2Lb*>UsP2lc$00#iRO zf8<>{3J&w`o9VG5Ya36BK+pvF&z(ZLz!1;eK zIaDk`54p-@Z(0c8I{DPPX1i^zJ7y1{l@S_b+9>=v9)jOW0}hK8wfOfpSOV9hitQ+I z=$VJT^7V(cW*c0sIkmVyMQOja5uY2v4|moi>+4(*+QGJ!`{R(&jTM|nw@GAkqODrl z>`SYB68zs9H`e7i^+s|l213SaofCkVRAF$;LCkdkSB31&u>BpvYj;DUTN18nL@05JhkskkZzZS^h2-@(iH)>&WDd^1y2e|e|Y609ruxg$wj zFMZ~=*R-nH-C%9i_}NS~NQXf6wcUa3%faPm9>-ibKu0qyv>Ma`UYQ0g5^(T5t#Gz@XNoJQiL?GI?#I zgtOz%AZq?hc`Fnvy9-vTOiR4mw%rz=Wv3^V1{Y!3jW=`RFnEsODIa~SZ~r8)b+<j#(?6QwdbAOv?l}gdZ5SuGzai>$LmLUZpFFtFEV8JjTDbh0o&yhsG1&eunS?l zvV#8ahu;sgm!&M`-%N^J?0xL5U0~rRB3(y$Of_mTR9{(U*WmY2(zMV=*!icLT9_L&2+ay?8XoMXV>o#6wtA3Oc=p5enLdL299IAHUsNA zrGeTz_v6TiAMBrx?Li>00b$1^UVomPk{AwL_aGeYoV6<&iuTFv2qx&B%!YXq z?^H(5oW}8KR7a7vE4KA}B;eQn&ecz&f!^sI$1k_zNi_|!^K-wh0dQDc$7VzJ$I^6{ z(QOj(R|#`T*;VQKaX{c~{;cR;=6%uoyR2qUsw_iO$Zy$q5s%6(zJ~gq=C#*%kEJ)7 zF-&op{cKSxWd2OSM2g>H&OTY)Y$QTSBPq>58JL9|`(Y_tpq;~=rY|rq@v(eFxUeMZ zyIEo)5N&?-E{RjvhmEdFo#4e@?96&N}TKG5K@^G^jQQphC8%EeG53ZqnVlR<-hLU+(P$DWOVVz7b zV#_@A#xp`a_l#(_{gYB4>Jmw2gj4mU-53$inO9oGIJ_mPAAxLj`15_h4M|;N4E96> zDrS!H#lf*DW@~v7UtiAM#g1!5dv(o^3L4aA$VLiDH9Qwhn65mhkuER@6rm(G(Q`qNd^o1ksnX6A%O_b}<&z)S@<}3@k-g+Lq z`d33-^@#lz9f?@3?iL1LIh4t~Xo}Miw*~}%3W6na2_=ZcE+^+>B=ik#=^Gh{U_bjH z`apeJW*hAiN4&D~N2c!P`yewjvYvE_)`i`z3_a3SC3SR7PRJ7SdW~w4%jtA^ldBpr zJQ;!Z@xM&yG6neUYnqlai1RWa4oCx|B?7eF(K_V8)>1UoEM{7NpJg7D%!!PYhyikH)a#wiI(`|;c9D246lwtWR zgwx+}Y;JFJD+WW(T|JcXG4ozVwYv=0?){JwwEKCAqS4lTp#X}k*`j3L-o_G2Z82VJ zQ{2)%Yn6svB}vHEn;{LEJU}_%?04a&S*)OYLQk2yR5Wi4{hLjDl|Z&Lr{QIbGooqN z$bk)iKMCkZ2GgyDh3tR>L(tt`<|!>+E;zA51CYsr;kfD|Se21e=1wGIn4mu1Y_U|O z`GEYgM2q;46sa`jr%aDs&AEf_e%M(zu#~w3oapP z;ORTQ8w}1iGDT{ELb8T&fm%i2C70P5roC>n5Okcku8akJj<`y^9?)8MMfzco4~bu& zZ)3X!MlzOpf3{Pnra=G^@nK(^pJ)F!a{15E|6^Am{I6;N07w=$scwH)70smIJZAH! zEC4Wnc<|2|I*Y5{2)Yn7iWyc%&-e2z>Qc z_B|Y`)BM-Lm0L}9A(Y3-@JOADOVs?NNxiwCy_ou^PFu}V=|R0?QxX>x(NRZkoOXna zEwd57K2=xBL!RCc%iOV8hXyxd=AVU=F5Go?%FxWvN@RO`GWUV31`of*`=uyVHH(;| z(3!&V8s+uz_V1xBS@O3GG`qS;{II;j-FWHNu@YlxDQ+h~g5?b{5V7K3q4qwdF)ekC z&#Y@s!nGmvUB||kp;k$DebaUsl(>PY7SX@)qAJXmrh>c~y45=TyczPFIO&#DgTuZf zLpRmY-YeruojxJtR5WTjHIzIn;@k925TR9)sNS*>!It|BQc@73?rxFu=J^!oAF0%; z`OtB|W-i62qYPP}eY|Owp2MGhgy3L~mz7o1KYMUIb*oX%`4I1e;J7%isqtV z7okoiGmd?guQ1`>Of$hd{`stS2P(_9ZC?C$-d)tBk}N*E!>2E{Ar6ox+ioNB*Hl-) zrF^$XB+ftZ2pyVSFE1A_W1w=nBB<5eYntgUmu;*c%#9aMLT#?jG;1s5hsrCJP6y2+Q3fb8tlSq{)aGY1TnvdvOQew_4DV z)>5UaT7}~9T(4on1Q$xlyQ$KN^0hY+(1$;KR~EakX*fsJ2+>U#Y zMm2!Eb9%dz%W9(7tQ-$aoch$fIr6iqUTJ0@mxGQ@p*W*s`M&uIn%|M;e?tb>n#&FP zVyA@6&N?JFSlRZv56AeEzDLcmM_TZWG`Wd*iEK9L-E7i(g}2UK%__pp-tO#AyxcHV zXW7-$lp`!As?`?EzISl__T%!^&WlSY8Yb@sU3iV;jDsdsjFK_PYnDgGkW&YWZ*HY~ zL%-qw4lP0$>IjHDs2&UDELhc=|FHiE-4&e!QCN2W;0q~lNYY*fA!m|M91N zFLZDeBjc-`gM$$e5VQS4YanR#jRRzrSHrJL>byYj>CIao)!UgmdY zmT7_dM@=5*hN^uB+k+7y@RgG|6lRipO-vyj{nnGh|IZx!Q~@q>1UPEuQqRrL3AVX_ zbm5M1Wyi!n-ypV{@RzoH*dFuA5>D{)mvA=VWk|a6{7v*-{>rH3hhq#S4k>e)iQRdI zkkDJK(D8g7EIY+MPN;`JE}q@Px16yPTe}0~l6n2PPZ8MzGIS~367V8wm54YYuGnit zT%q5;k)K9@XpB~WAA90&U!pgR8*X!fjhKhM>yac1uRuMSFuI1c^*2zS&;gN6y+_eC za1J*^g5H-O_Y9K1r|_2Ff^+(U=`XpI|MXR7xRlDe@tTsy z@m3l!4^F1A`luKMre5@eJ3fk`b@XA!=Fbqf7FWL1fdzdtWTlXg#r+{b#~5nnA{tvu z=}nn6n(5l#Uqh3kv+*b0Y~Y{a(Uw`lA_k zJgQY=bB0p&>(Y?wUHBL8&nUFMCd5<{KfS0M49*qWI){D#-C}=9=6ssIkuzzI^pb`u zL6?muXBLrztc`d_^Kro~`e+#sL{H)r=;4x>013xeIiYzx+0ehPDEhTL*X>Mx=hF^8 zNO6>Su3|L(`Mu2c^N!=$=lMakDviMTAc{`ImPB_?4L51!H4`@wjkB*@9dV4(#xNA1 zlT_nxbvjt373>&A6=`aw)rt1mW*09k8%#;Ko=)pUYQYhA6X)thw(CnvqK`pVH*;SZ zcOu^aPYG*`ii+@BZy3yt;(Ev2ll`hP37()Kufn{vm?wjgnrW*cDX!Tdb5}o}si4<# z+4oj~)+qz#(pk^^N$e|4rJyI*G~X{>?-fuScV-;Ooc3ILjjU^R{zet=XiB&~37J6d zf|{7;eQOS12OoNTx}Di=gKK!R`eF)qs|$>IMrFN2Qz*ac_5R=_w>QOBT3264=BroB z{YHk*Umh_;(B<$Dwlup z|6`ROtXu>fcQdBNA4c&V!kvus4y>mmA*cQrhG}Nd!$0VQ7REWHc=Fz#ngD>$#q6#w z&HqMlpN@Yz=k#xZ`5SUn$|~Rg!fD|&oc60Wz(NWlwC>JgY#+M|j&}QlHp9uUem^dF zy4*nrCma59-9>tj0KOE~o%!?9vDp7Bu;g!P4B(RSQE%Sg&?+e}PfSl|l@8kaoEf~) zDf;aDX-IU(mIRed5_7}gAbPp&({W6Ca!+(+7I>t8zGmuaRF^;4GGLJls01=kT(b^- z8vAY-gBi7DnAnu@UlA(K2}J^#C(|Xs%T@igK%hvFc9oNd8_m#M%nG5BHBq5_X%yu~ z_wIDt*tR*;W_D$}`6DgEY5K{GiYlG&P@1zG%visGk^&)ps{SYgfD@+GiPBiu54NMlBQ z@>JK7#V}Ld`AKDYv!gT~US3s>F_(bgsjqb2A6VICVME@P{;O7_O^~`R(zuB(aNAH! zA=Byj)Zqbj+@M98d(Ff;gx4|ic?3(W%B$fOd_%@#C1qE)R^WUvrdW@QMLsw{ThUFc zu7cQXz~`X|k#lRm9I&t*w$^fL7LKzLqeH*BW_8D#*q8LQHDVOZj?yGROe9?`J)r2F z+B2edYi8v5qVWa~m@mn?23n&A&Aitc6uVuMBHmke6s+1Mh!{7pYK@HjC9*cGI5_;y;|DoLgIm;IkAP<=jNBN1Qi9>@$~? zmLiC6d(x#r*}|p{dVv*Y@IlT$6ZOXZUyR`rJNO#M*b;}qdnT_c-SNmyVosQQk%S#X z;g>I_P%WJ#TMNX9_qQc^uYyKP{hQ9t&g9GyCtfVJ!lJjCv3dUdF1UBPdT*_J`)kTfLfPJZ(i<(OxKf>ql_<4Cx(STf7+8wIK77()0$#?sXCVa)3Atjbw`Wd3ZXF)%3 zCQgm#)~!~nngs#D3#JrvYly&l`dD)_462diq8A8)Y@gU&zgwpX%Wj(4MP2JS#mv>Y z$Ka9Si+{$@L~{u(cB$u1dbRBc>R5QV1sJ%e9s<3*#mVev;09I)A?*Vd?gCQf0l z%gwvG$LB%Iw-H%X7#w&tBQhrt!x;qxxUaa;8yFh$q@|_JW#`BRR-bvYz3I5Uh|xDS zy`v|;TkwHPVbV%gl2k=PB3VnIB}{jNR|o48ghCfJ(zXxGu&5|JNkV1gD3dQup))>x zOlHYjs{ov$J6OWR-10{keSa?vz}o02TQO*DMQw7(`lY@%VQ_*X7X=JT$~IdE00H{w z>}s(7%vo6pr)?LrkR4A;y2>+AlR;Yg`ua1yp=Gmmgo(SS7Red*$7ON^&=71_RepP3 zDHhYEN5UElhM7Puosaby=t`^h0V$SDnlAGd+&dq+m9;BB5jAiZaDL*7QQ6jb-Frd6 ziDwMqknKhLv3^CtG>Nyq0-0I6K_GZnLwR}6iCJ?z`#VGh20IpG{MtHncUIJ?{{{*n z!9EEGr<8mh>L;I4*ijsIYoJ(^^=+H8BUUaIw&xNBfk5EmL5w8ea3D6+uC#f(87H6= z((6`-cZji{Yz*A!lU+@9|C;e@6O_}L4u^F=T>?tDTc&@w9{Qq*=Xuv;m>#x5FgY6= znCaP;Rdapmg+tLg|_jNLGCQXrQ-F{oqXG?04N_^`G4$Y0yDf)10|)b6F|~t$o$Pv4ymbYOTTxg7QrC-X z_tpMP`})bR*Rq0pIHP*8O$>@p%jrD5J;XjX6ShuWr4YhUAK0Y__aRdg=YpCh!;V4% zr(T?z$vN6D4kWbaH6beK)=2ejbD{gBShddTqYxPY1jg1IB?P4ZTx!oDIDbr{5yw@7^)wx8EhdWcaZTo@|S zNtl?hq%sej!y+I~QEp4b(I0h$cp!m2KGu&TG3W4Uv>|4=bKF8IW4G_I#p?ZT9}bWS zv28Dn;U8H&O?V3q8^!y@%zqpe zmQ!M!Eh-Hsx@$gAEE6I1|gwu&)~N({y83D?i-ixF5RsYN+vMN9KY89nPi`Id(_RS$Y==-tc@ zO7VN4WV7k7sySgxhW?0?V+YkMLlK>Ps(--aq zTlzECMpUsn$i9l8%FM5~D~)3T`w?vJ_ef5ZVe_~$%oo-~mpU}lZS8x^@b%gXyhhpc z=^tsrb?{@)M=GD{Os+oOGI#k{!Hj3!UyQxErFJoB5*}m>^RLBwG;lnqw6-!OH}Yhq z@EAZ*n%U4VT8CeD9l(%c^}Z}r;&KjQR%(CWadhL5YELu7L)$(FnX;>AuZKF1;Yj^M$RZiX<{? zW(Q3l`HE?_!7=AJi>RlDSL;gSdH0KwwZ$nRD*X5K`tprT5R<)!;~ zc86szkVU%_YlQzO&39Lgetp7Urz{M$pFpvmIFTL|jS^|TXVf~zQE7Y(+`rua*tCJ8c|I>{ro5(4 z6kUgTUu}xSM)Sn|gbfPk`1XGq&c%OPyzeAcl42E9!Xn(TEXo2Lqkb56l6G6VaLT=Y z_9~O;QsB@%Py(762Gl9LT{84g#T+^rUyG!qrkv5K`8@gM~%%9l(C)Kxq%sKG(Q6Om&(^O!VEn#YI}=LUe~L z+hhs@o0R(E&e5$TP|iJNaYoMa+DYr2z?_ocf`%TpI?Wg?yXdPJ9Q(3s7FA%ge5R}G zIJqp3Vr5p+*jU|fm?Ti_#y}@=!*Y93(;(!-kF8B5h|FW%kENM6j20a2;~%0eX!vCu`|{^!gd;~9j}8z5OojvBrxO6^e=0`}xue@b>WPRIZWZT=JF4p)h~ z4ge?R8|ygR6ywPed31J-+;(}+_sYnLa2Ue>QH+ zHs<-88dd?9fKM+xZdAC0tTs_*XezFXD4ykQmCq1n+r(%-P|l5Fq{)EJ&ECGS#0R6; zAdlrvUU|WxJ01j`pcYQ+xQ*v3dQOFcPZFkM6@>NV)>RV57`LWgT}X%atu}7z8tj5h zO`YZz5Qm!zM?)tft4hntq(Fm}R_z*b~1WW4r^4xi_SkG1A;ecoT7rP3}-~sialL)UdEMVtoA~?#@Q}KPdg$cX& zm-5_f*{vuCCzp#4NH{^e4WLN7_&oTRFWwiI#?>$n%*TBT^jM1J&U7X{+D!*T?{C^( zDtB{}8gPSw8jL4{H+7ffUXb~J z2o0V{6WVrCs5GbM7yG+9tteebjK+FgSl4$>1D--EZ}sj-P|dOpo^IEfVBH1e1KyC> z#yD7si;oQ1JZVV6lBGN*g=~L(SYO&OY0$@Z8CIAM6Z>3D@>t8;n9kCl^$o>uN_@tx zX*QV0w2?{U_N@^NbG|Z8m@Gu$Pg3$-i=LW9iLcSbUBsB5hQ>QN>T*qy4oT8N*^48L z=2Ga)U-lU9+bkjk60;sr55~Z-H2WZqU(T{u@ctF#CSo>3yYQ2rW5v_>h>~=S1=cI{yp+iggs|tLdG3W%E zb7=J&3H`x5Wo~8fZk_7tHR0>VOM&dr&e|z7x&BqEy}6rBlu4=wIp8s?m-BpyqR9it zoDf9G_u-4;mr2>XnNZN|R6H*^b1jJA6}9{sn#`>nG2*Q>MyBSj!p8p!PW{3Jj4CyYL_#i`AuV5MfeQRZo}h0UF1xnk3!M?<_6zMSA^ zNJnhAiE=3Emn=Vjrw_P-vUUNJHC8jAnxRYRio9 z$($(&LcZFC8X+t~P(VOCp!_Eck&9DDCrp;j&dxf3-1K7a>W>dto{F?G0LGLU6sHr} zz?6Af07DENgk6&Np3{c(&d)dVWl0%gJpv5;Nc&3etYIl1WQp`8dkACBkp0*>mOAr_ z#q+#N?|G%2KW9Sv0{zbAF6;(6??#2fa6j*YEm|X^Kduu)^nPT^8yHsv7|9d1>n#<0 zkz3K+YvnKs>J-=oJdY~jQwMaf`F;@b?i00&KZ-%zX!o59G*-dx zWE-VxuMXQ;m}2PwyVPKyCyiNNn!PnN(*y+1*1)=T#ybz%)fZW$G+H*%9R=@9G;$_G zmQBPFvrBzmL3&5;7lwkqAC}v0x5WvQQ#-O-v+QO79>KXt`UzEnN>WGNNR!xpAXQkYw@*Yc)PuYu|K!IYfJp@<6D894y@6zZxe~ zk_5C~mK^G94ARRob9|g*TTSc+i8@W$H2lq(UT&=kJ39P$(6o4MMwfy#?_}v4sj}5c zy`~dhob)Uqh@1#YxIOCqjjc8aUXCCuHh^O6mar9~E?b3Om=yjEdlF}TGcGzFvS_gJ zRmyv|vr9pfpnG7qJtex^=uj-Au$8G@zH^NU5P8;#gZ1qEX6*K8wMg?$-We_w6~CHp z&-&2ibBQ9+Ko4ktOc8j2u-oUaZCXCfdiGR)%PabhpH4R*UHru(239QsFX5tQt-1$n zI;PDIy{s$>p^c;MGc$IhU!Lb{XGr$?LyJheZWhCCveXKS!)GqO`Pj=_$VWAV z0n5n8Ta(u%T~l}0UvO$ED!v#+nJ!3RJ{jc5W+cl@8peYu?dEhDPJ7E1q(f7f&ht*T zqW9$LC;2)j1BGt?4lqUarW*;8s^;agkND~xS70-;yOR{>mRO3$%B`@EIr|T~wcD2} z7?vs^mHM|qQdXhxo^jG@n6@=<*;#9;merB_B@R}1qUwA%-xS59>k%rU_S3PL6iKe+ z3w|cuaiu}h#w5^WQ<++j&t^yE3(#x?8>@hq#7vXDX%fqYMyXeB-fbc03X5bA7r$uX z`b6zpEFl8>lF9?J=vl(i0fA(qTHFK& znV8td2HyQAv@+Pc-LtZeLkh4j9xUT?&F<{uk$ zem1hr{idttee&yGVH15wRy(Gn0#cL_2m<0~+7#QoLhG&sqFl-{G23zrKNtATta}n+ zE|d;swUpG0`mNv8#Z58pj_`3u21a>WgsVn}p-TdQb8L07FQacx;M0@jE|xbiYJKzg z*O_qNjF#_A07pB!4wt2Umyujd4QmAWQ>o${ExPE0RKXDQ7`fyp4E@0=y#o=otmRHl zP{ktpydbLyH!!YWrhK8)qqCwDuJ(UX|fVZb(~}QGREMQ*JNVsBJcvvHbbND6sta3M=tN}IAu#x_4KUzfOv)iL;Uk~L6EP4R;78GaSX*Y0m`0wu7B2S%mka)jqG)@r#?Hc78?av_btg z%RwgKYwbb8zN1DaAbX`%^_I{Z458b;3j04V^lru&*w?UdDm z+^p-EJa)zhYgrG%#4e=gBB0p457pPiU(g39!0L4+U4ym!!W#AD%XZ8sC#%h%^)6oD z*QAUo1Udbn?0&O}ip4K|L-rie^u>Gmr-AKz_1pc*7e=+xp-qUtQ3r}-fe>=xsMxCm*UA>cRsGr}>Hu}m| zyXFT5{KLvHMPqolar)wOr^1p!XuQO0EZ}jDGn>v1o7PFsf;Fkhvr{&t#m29jxeBNI zUDixXea5xM-+c}k=Av`DSf0D-jRrcFqGXZDi^ujbVa+#ZnGbW6{}T~^3%&M2oxCy* z#+$&*C^5f-=NfxtlB38O5v87v@ovtTGCyf{H;gkaY6@l2{xTgU35Zdv z<#v-ZFC(eYTeT<9x-S#=-^ml!@612^7KA~4x>ETPvhT}}HtBy1L{yOq|II4(%P7%* z-4hyLTwHvl=x#HA{fnhwghcT0jVl0|YMZC7H@~!wJftOG{&b^1^!0ffZRn@-^>NE@ zC%^W-`Mb!%$+3UWX{BY}{$H6TqFL3mlgwZLya)j3rwdrTOMdY0jZYlYEdTvnaqYa# zzfb3H1T%k4N=n*@4ck}N)Y9txljWinc^EMLBRWB>?}4&#z6`)WZ|4x*9q1(gNuB}#;nM@>mr&C!V{mZc=g;bWa+}(_KQDwiq1}MZ zfSqRQN`e|!$Z(I3P@r4n@~FSz;^I=DGV$U5ucX{3y0vy$ z`S|#FshN(rTMpR{(Z0UE`qmx{zT5ha2NgAki?xR&Oj)sI2*ysDk{Q9ik>SxCcR^wQ zG0n*%Nyj;7v#8fC6=9H_ot=ZIurP@3kdrRbrsWut;p76lEUA6W17q*@u`$+?vI_ViRx|nl$FjKSGD}nK zH1s3_v38}-=f~zThUqARAMTX3c-ZWem6n#;(UN>*!}d#(0CGeV!z+=~*eKhBzpx1q z{+N-Ad^OX`=clUZVtls}Jt`%Z^H$09kBo(bQ{-_NdGM2Dyy;8pSs_`!q|==U12*vc5hwX5vy!z}9^l!{Z8QE#{2^r8aNp(Rs(ngy z@<2-T`nk~U)zt2GP4h)&eFFnqlt9qWmxRQ`EA=z+S_NvcoaFemTu-eu32-t?y4DV0 zM8<3dV48DsxdK2oK2_&@=6ss%p!qmMku^Qx@4+JBl9(B^SW>~ck4U7E=&@adh_h3E{U?0}#myee>ClfQr~??n#8g&b zVTx9j5hq7iYGg;Hj^6B@6usM-&EXn45EQ56IGHb6yd^DrojkZkkzVp`U3UK4q*^^) zIE;}^vYEGy*CX{kp~_ZYCk0&{&9t@wB93=PohF;|Irp z;qkD8ZQRDx>eY_psDo(2r%fL-iz~j@`ujG+d{3VqY8?_VEFKiwJu~WnHqNN+8nPmr z#sS4X$!t~e)xO`pA1HKp1o?Ew2o>S6S(S(1i1(NXbYmZ{MUV$wm#%ANf0Ql91qj+r z%Vm2~r{s&X+sp5cY?e=lbY>c4U30Zgci0@v5-r~Ms~^sevDhPdL6AUq60w+9+3q99 zb+G>!Iy%7cY7fV9)}Q1&Aly&um348MW5rHLen50%vjhBtUcFPYTegcF(%9KYs70XTe zVvbMGi2$syXoNmg?TyciT|$Y7IV`3M!PdK~pYdDEIm+QMN^YEW@Ps zLrhoBe-`??j2}W~PoVa2XFO@y$!CWGlz=-gK)|}%C=sOTN;U*W%VA@dS4CFS1@nbD z>_yxl-{`;IH=)v(j_}GF5IfFW!;7OJp&K?H_bjV4-t%_sl{kxbE$BZ8`JkPgRo#uT z_cVnAK$jgGu!JYCYycU!MAcq(UsbF^mt7!ueRbd5X;W}z#Y z-NX)EYfn-r{y>z6__RTb_;?fZFwMApv%Mo|({&18U1F2r+Fjqub`K2yVk}bJq#`x> zclMGJWp|9sx0igV$#y;?1-I9YB8SdHwIX7JiH=dSxVH?cR&dM2cnGP{kfpM~e%W}7t<QO{3~Y8dDCnv6P@D=20Ae>B$d|^A5Y81z8b24glg&o;9Q_y}ocwA- zzRu6_k@EI}EzF_@E@)HCDxo}c_{;ge&pGzIUiDvihe7fB`$N=;ajI9Lb32m{a49o= zC8cR|wS(m*h4|)e*a5k4!M8SL4k+M!QukVKTfDLRsrJrSY%v3JIS=;tUnsY23q1{a zv~eu$s@oUFKg|yJQxp3^Yj`eqrSOpBNwv$u-x(~)v(>9usDmubkQt-p?JlM?EZ%g~cY#CsZwu|a_GAfih zPI%8(bn0MFE8xHALbO2@439m>RZFo%#jt!!*Y9PA7oT0Aw(fj|o6zt#hKJ{sAf|KYHNPiyPy#sIHcO#@6({o4UN zcX8WE?hSihNF}eKM(fL`7@arg;AoN2aWQJ>2Ix2?8v~%EgX@Kx`r!p#p!E zjG4FUicj?@L>`KJ`C@91oI8ACgHR~LYjV)#{ZdMQxAT zp#P`4o|$LQhunJel^Yq($?Z)nRPXzCV?k5fNY?FxLA~9fgGMrlKhtRVvBdJZ#Qhkt zimZsAZZD`>RG&_7&AOL(wZ859f~NaW6X=XXJr?6RN(rJOpZCUa`2`rt5Sp!(EUE7& z#39)dsgUj<7`iVmKAv3zF}E9Za;>4g@zti;6fOcrx=0GJzPK^Th?O@t+dJPW#Gl}W z0?#1bU*JU7#+Dc^`2d+0yt|s*#Wu&GAzW0B8voNYzMe!XRd#CRT9~~tDElo{W~O=m z!n<-e&1Sp#V01v*8)N<7tx97YgpqQwUYj+|zZRy~qWMRLBv{CbC zL(yM{h`OYt#ICoz<_AgqyDT*{qs??@;dyeWoHhKXHh-#Hr0iQ7hqZ$?=#&P%UteN1 zy$W0-ps=K8tRs$ZM_@Q^ku0#^ga&PA4(r65Ae8Y;*K+2SCCT+Z5$yrr1RjWnG8)iU zm-$S}VI6OaouUf$m)DQTqI>*9uQQcq-J|%uB@ZBfvtvUSPitV$pwMZLaiUXWjwz9* zBEv*O@ID*s+~)oHkOfpukrcy_?nkP89L2XEG02O?XQ-_|HX9KjUi_!a<|#~vNad-= zN~gXiZ`DK3$`<196$!`J`(1Jz98UYa4Pb261XdzuUus-*JNBa?<%_TwUT3VOkg?Nz zz2N7iXGz(PVQC7sB^1lWYuoD+YS8V%XZ2U!g3W27wa$e$(SLVnu2Z@P6j73@S%LKI z3O!zNY5fo!H%Q7o4)vt?eI^fVXf`sJ2k9i7bI`0G3aKLywG(p;aE+ED`wddIzBj$GvzFE!7KMb#1K?!Ys zGGKT~+dk$};_9#IZ(G9XA9T7>9LaZl{EWXxe#kqYyIEi^m!>=N#pcV0r?)xJw8>qo zf0!I8;2S%8kl@tV{!bHcAK?xGX77sTS>}|K zo};bHg4~2;v)Ga!DB=$EQvz{7hX8BE2`KNF;N`uK%G0 zhO5h=%ql-09ztqJon&Vk{`k$xf}E{*vlOoK(@H7NXA4rI8UwqdC8y=69>Vm}cyj2U zF}Rq$30!<}{M54adf-k~+khe9IL!~&c#;e{C{vDjZ2yNUK{`!GqsOi#WSh`7==6Q$ z`;PkO1^uBkmhC_1|3jnwU%R1C{I2!qppj|`LZ*fab~Xx-%YSatVh@83=beg1t*LseG=s$}!>{{W(7G;#m{ literal 0 HcmV?d00001 diff --git a/images/tcpclient_led0.png b/images/tcpclient_led0.png new file mode 100644 index 0000000000000000000000000000000000000000..c9bfea9b8ff59313893baba77ca7cdb8b33c004f GIT binary patch literal 33856 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\U?vWh7cZb#E^ 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 literal 0 HcmV?d00001 diff --git a/images/tcpclient_prosetup.png b/images/tcpclient_prosetup.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7fbb58e70252a916ff1fc3556adc3648bf7337 GIT binary patch literal 215460 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�{&> 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 z�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 aZz@m4>BY8xTY0y&@@lHucZzOX1pO~uoLocz literal 0 HcmV?d00001 diff --git a/images/tcpclient_send1.png b/images/tcpclient_send1.png new file mode 100644 index 0000000000000000000000000000000000000000..4e0f21716048c4e4460619689a1ad354cc8887ca GIT binary patch literal 32681 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 S=e7O-eqKq+OB9Rg`TYkfrl0-* literal 0 HcmV?d00001 diff --git a/images/tcpclient_send2.png b/images/tcpclient_send2.png new file mode 100644 index 0000000000000000000000000000000000000000..a47e522f4a2173630e0584fe832dad36ad205b61 GIT binary patch literal 32160 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 aZqg}a8H_EY3A|MuO;%C~R4i`b`~LyWILN{P literal 0 HcmV?d00001 diff --git a/images/tcpserver_con_closed.png b/images/tcpserver_con_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..4891347dd62a03947d7ab83d9ca4ad6039520702 GIT binary patch literal 27494 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

IuK^OkkSsX z`k!3l%-!E)*A_p?VQ(RS<AYY(VfUUg2U_f}`k?sZptgD!@wDmW`8l*~n@I{L9|% z?yoY#L%*|+6IEZG1hEVR1-sW|A7?dPru3l&0(^M|bM>kNF<**mynTVeFq$lwv{(Xy z@*igV4h{fEmeYpTbpP}J?|CDymYlp9mZ^K|)fo*yI8LuksGv=s94g!@-2rCNq`rD=I991pttdBzR5mE?>MzWy@BTs-`3R zJHjW&?zJBe4-m>zEqS3!)i@tw)jr`&(z$^Oy9j4YHHs7j(`h(tcKL~jS*s|AI(o-XY#7jT%^vg*N@;A04 zB`-{2Z6dwZP}{XWL6F_k9Iz7Ny%tbz*vsdl=^=IT#=9|#Pl$^zlJr-?nme1_GCL%{ zxxLQvZ5FGzbnYPaSHX0IlQel;g=rx_Rktfm@45oW za++gE^Q3p>1yKE|5Cb7?wS#~3rtwMkzKnYUq^ zQO&*2e<;|k2<58S$U*PrH3mhol~3%$e_@SavYzNskRJZ4B*S5fmy<<$#>AN;mB;z) zV`y#p;WkO}8E2Nq&z7m5dszRnt<;$*_NGdsfWeuo#RO%~cPpL&Y3z4&J=4S9dw2et z;03a-)7y-@ORzg>$%*pGXz52lu{FNcwiz4!H3V!N2%0!7KEN|(dS`N-->ES*JNsw{ zJ&vah%CysKc8MD|2{$4AACKS5k0{8`pF=kH+{$dcH*${GQofMNd&DUt9C+qSb^mPb zF(uPyoDXzs9&Pb_82fwWQQ;cBU01}j_rSLn{l=nVY^4dr_Ee!l;%`bnOs zg+b9L)6R3J8lax3Zdfz`J~g-r9d2k(*PanC2>DIS-Na>*ChB{xR2+2|dY6 z6rBgWybEXE#%}06Hy?Iv?QlYj`kYl{0r}J3~%~Y&9Kb1?l^Pn zTF=5ZOt_vuV$W2aQlB|q+*ApY-$gy{bKUBUSH+%2Yf z_Qz!$PmxhR1<+=~TfGQ4z**vs4tSr!sdkNv?ranwm{gn-v^4JjOOcM_W&$0Wxj-WU zgip8QQ-4gXc!EbK2C%L9qZP!}90R#)XC?N{7{imR<`-f8Het8JVCnGU+O%KrilDACi>>-z z^LI$OsWvx4_C^?ExO&0UyK&Zj1L%IcFe5vEy|iEB;`&lT2>aIjv|Pb)w;xt5ODBUW z06-RNm;zq$)Kgkj7+HYt=mv7;uc+PmvH4p`|dwBX?t&e+ZkkCFEC00>!Tp7-tVddUuDiaZ* zY5}@%R>W~GFeH~fj$!_4Ms9d;U9vPB{7K;0 z_S8e)5gBnRX_szogTLfY1^#;Op6nbBC6&1Q)~Dyp*JPbeGwRl)2iCsRb+gNEhw?r# zCNrbPb<0rK5_$e3QpuN)(BF4C+|OrJSh_@fwZzz_|H(f(`KelJDFC}=`0d0^zo`2zE=ac5%eRe85#*ne?3Ma#y9X&?5C?A zud^lhbFL0V; z@)TGRb-*8k5(ctE#Pa~-0v&6LqQ0jukT<}}$4MUM9(Zg%JcNad_!>XQvwm5@HmQwt z5Ak!1I5ou9U~RCiU7i z^xZ5MldJ`!f5;mDJB`(dg%o_>URi_Dn0`h;#zr|?g=Qu$=dr5AV1f(#inBeYn6U4= zpiTJOD|i>09M*!6nmdOVsfuaT3mi6wK|Ou(6m~I5{nV+7KjOm8)BNZB0V~(bcT3=n zN4|JCQUGTI><8I35-kGW&9K$7{b>;>_yCS(>`w`v#FHjU+P-QWyGGvVSdQ(Xz6|hf zTuC|0wuQ=|3NJM+@eM9B084RDx04>-sW%P584 zt8F~0ji{(sRmXuqQNyIhW^Mc0>|?3@H^<}#iB>))d-OfIw5Sl7^2e)>wHFWnybaj* zLZB|qPMKVBxA(nFM0KyEyPRB7%j*{uus#H2W!!Pw&amc9V{DvMnm44)%9>ip*E{27 z?JX`2t!&KHXs7=HWqE?(kBAvpTWYdSI~n@O6xDJ>;9{gm#gk7>JuU%%#zn zH)5l>>~7_GI8WMo{YO>mbp@o=#k^Fs1nNP?nH`sIC&aR7^2WQ>iD4dQV%O=ncZLL7 z^QGrhiE$$<)}z1BoKs{mO7g6MQ-2tsc6GEBk4K^!k2tIB<%!Jx#Ek&yR$E*=#qr^- zHuOpy=I${2nEO>Q5v@Fd#J zY@|wJ$j0P7gAX8>HSA$|c;s~ew`pE#dR{CK?_ zdeXc#NOD2vKgkS3Q5apf}$jB7FNWJgS zezyN+kY~zS$egHN-{r*5?|s`p7mUo;e!dw;qR0qxlO-VyTKimO$(tjg5|L(*+wjxJ zy|#RB%v$8CgpR$BN`6)PSQ68v%5g7r!XZ!2(k4ccT`MQ*z>+gRcg^2aUgGet}_2gf{w?Uh@jplJlae z``4@rcKE#(FAS-dmR(K1(u#o|Zb~_JUY0)pv)+H*x@+^`wsg96({)b7{rvorugDci zuuDDHvt|uL1x39lm$+Xq0Z8@EC&VgOtu#tKVOwfrWd8zici_|PjQz7)x3!$@FP@59 z7_|VVNc3k+mfk@Aig52;E`_Gj>UGV%@IoD%A;5mM-Af9qowxhAzEE56C_QRbXl>}! zz9R>=8SbZ4Rh-EREPtP$uzTv^rGEUec=nLy#xh}8Ya+LX1`W~@6*Se2hH zu6oGrMv=YMBDQ^O<{qQ&`uv&XonzV2$MiI)Oala}4KCa_xhpJ6mK`sNtT<4D<`Fxh54TRCBt-e={~r3RhaaPZ~F1(usSrB=#5m{FV`cqo+=2Qb9$?6 z=~k|J1w}j4CW3=BYbOmcI6WL$@X9y~^z6JWJK867Xkn@$(XnegPsgnoJmQylGhc>E{a%Ai07n6RmhilS2a@|KZjjNW0Ddd=)LF=iMEH( z7<5gWuLga=bhfXk+-{rE4s6zjHn~>uuQf0fJyv^`P918Db001qN$pG9 zjX%k=rD)auzy#W>PH%^ssgf52-P)vmwn4D9U{Pe+f|4EIKsU=G7N=HEYyy|=4TBW9 z#c}YFR!5`>FwVaTM7%B1upYFE<1c#zvO8W$4T%^htp+P&np)HmhuN9?T{8siFkChQ zxjQ}A>QQ1-@N3ifo)PBhlvmXiQ@u4q*6x({YnEyk+y5+DEX{CK%i1mnbEAth{8ohu zw!oDGD&(FqU(oyIE|kN1*u;YqYD4qoSGwUo7~i1>uGfWtJcTnw?xu;w?ofn8$`P(N z`DJr8yNYO90L#VxT^5u@9lX(we9o_#&F9Cj0m}sFj5tdVK|%4YX>N`v0peAevWtpA zrkRz?x*5n{z$5eX4q}y+y<6wKOO21UO*CbhNUGlx#l-90e7&H9DVZ2F7@YHLl=Zn9sch887 z(PUgcm)Gm()w|_NocrP1w(7?LM!1pOA*pSn&I<0f94cnc<(a<%lyAXEmH+fVWfG|l zZC)*J|6G0YE&0#F8>4DihrLS{+k3U}X?R*rlxWV>uv?swwVct_5ch!;SI)J(vyEf; zeG#~mUoJnl;Nk}%2_`E^;{12>j;C$1FMcU_HeoYWEwIz;-Q_Da@ zFmDTp;yoOR1Ud*JdH#le&vTMcDoeD#DOj-E&&|1(Yq{g|RY(|wWRHu)s#eSkmL((Y3Wp$Mq`w?ESWdt8uB7=J1z6AdseIt_Lim>yG>MIjNV4 zD&k}3zMQWJMy!vi_u!C-n=->~x?dAIWa0gw5-a}0lmhkP6;hrTxhWSLY*N!X&2)Uj z9;$qU()sA?@m05HhFP)(Ihr?H>}5VHp2~jc&Z}zzUQ)cG3ba5iPG`P!BFyU%epNB}-Jn2}iywz70BEk^k6ay2@s?r%3bese2(?BKDC+us4{ zlz0|B<~8zdUp};RgG}4c{4OaCr+UYE<}#=?BA2XG2;|+3Hxm6qRntX;Tv2jLV5>w( zewgnU(h=qC{x69_`1RrqvwtLv2S~SS88-tY4t`G@DB=}+y1R9W$#{~km8rGxZaa({ z`(hjhGcz3G9}h?u%U2me$nWtSeRC{uJ7VuqaS6CMnsm|0zDo|}`^w)tcXhpE$=AcZ z^BM|@%#>I?f%5-r)@*Rc6^c=+Jf$D&yd?8CiiK?`q2iKROfBj1%}(>Uo%B#EL89n> zS3OdVU)nS4MagL<`Q;6To!oa8onH_h#mfOl*7g8xQ8Wlk&(C$U(l$^XqgG$VGnm8O zDS*WGz3iHe->=831O?-|U1&#j{Z~CuB@*b2oLPpqG9ztG8qT#U>MfK3i)S-Gg;O1S z>Ssc4w_v&9xb)qdN~v_W_GvC;y&9emZ^4z$d}BP%g~GT zRI9PKA+WoUnF!za)lvNDE0D)_m8ZRk)V_7o zgtqD{#7~!#F^NW^V04!BlU`83<#X3imAxL;Qu<`*koB-)%IwHyMlH=KhJFAG^gtGz zMW*8=e&SUc|6dr5vZo)l_IvdIiVtWvzn|GW(2K)7p}f0E{VQ3E{6w8<>9@m>Em)t@ zEP`?>)`pE}gB~4RAvKiQz2U_kWXt`Oh2uX9>qB)0Hm>97+L~8%s$(_oOlMlJE-7w- zpipS~2L_nq%(O~X$bhH9M#F+Z++m%WsihT=UJijGl1>!}plZ z+W=6)qB}hXGBq=UUYZsP*-3(o$g4%$=)?| z^ND{Y*PFvDLoFIwuEXfKnpdv%6gVrugbqYxVm%FQ@W<4fPz0jx=5&bvdNLA2wca_- zbGFd^zWUY79E(#rBpEgxY+#BtBAJKk@Gpj{%=AXd7IT|D=B0P~8b*jKPUE9ad#>4zf8tlku0O>w+$xr+vQfaM~qKS$<_U;5D)$HSG96hiDEL zuvvdtH?Xl!?+w$kg$Fo{HGigNf3n6?Tmfa*H}$hv?C`Gu-uHd}!1iAy{{JEm{QtwI z!Bq;;8I;BvqM5pFq#KU0y&j(+HDKoqmvyfUhxf=zUM|yqW%sUIh;U09Jouimy2cue zzhttxT=h-rc}e^9fycY2+;sdo%FhHAiY*m0zrAq1lfg!$Vu!lG{^@m=_(l6o5mx(q z!*c9haYy?;8))7sg`fH(L>p1q9-1pAqeqeTyDHF!SgvPxOx+7^AHmJ6H9F}c&Dy3e48f% zrbk#+uMD0hoaVT%ee%!wT{?UA&X!Hpg--o#r<;FsHDJb%y-A^etOnG`5p6W{s=n^q zSgd%ma5*W=cvEkkc+ySB15Z#rs%*#1fQKfEMXeZ**4S?e?N;Xvq9>x`-9wU^+~g0O z))ok@eD-pM`6_Qr3Mvd_A{+M-m8EYOb?^V30KZQ*lwzNO@hkZG`y1&ArRMUOBJ*Vl3e@H>^+b!%C_VZe>wD@$5A&|yl) zqWo=NzHpD6PUH7^G?5r1a zUEIj!+8?nV;&@V^(%`1+c6 zy7ipP=KhXzXiSI~A|{DB{2IDNJ$BapahcL}H|**8OMy>y`|i?fC?0*Qx3-T@cIJV! z*CjIg-5)S}t*5XqmvW_MTm7QDjDx(t16*_LbVtz_ovOU5$PfV)yaHlyNh`XRr_kGn zn>d&tw5P1-fnze{b7ZD3yxCmf0Yc8xCN~DcdfuN0tA+Zx%11@sUcYJ zBP_giE<)RNizq*kH+HdE7ZEy+4J7tKEa71t`PbzsusxF-lyD!K-!m`juE1WNJ>RaJ zJ}a?VxmjV7w_hsHMd{(TyQ5sdgr|(Q~_g);Q+1*Un)~8X`JO|)|90|_8 zMepFF8^m~0L*d=er5Y}o(Jk6eRY3~^91C1yJk7;4O7VT0ACz?xbQ3Ix9ktm+jfDOwP%$w@qy(j9(f^8{i86oAY6Z#Cn!89cP!gN?AW86cNgN!GF3%J57NaHvZ(y=VAYBJ905R#htOJ&`GJ z!Eapo&QVZ!N=SEdrQrQ#gU#yRywaZb#zh2^phzN_!KQ@%-rCg=l`F>{wWkZaQe2^c?;d9*QGBcX<$SSd)p8T=^s^%F=QYl)%2 zMvj_}vtV!{;LDY!-Tlc`6|s?t07_8TOKDRz=tXK(UsWZJ#inww4^?l1jc^Mi z2}+fh)87+KMHSmy*n6vy9SjKt8*c0?tR4&t@Q$m&5>GJ4Z&M$*2*-iMZVyf{B+ePL zQ_$zG!`RAgR$mC6BWHmiD|VZY%__{j{ye$YC@>w)ea%ZHshOoqcXXj{zp~(#^)yxm zKz<_>+`HG3-FmmpE4~`X-CQa_4W5!e2(RtuT#&tXjy~2*i2@`+#rda|^FQ`mqgutu zrF1E_U+h`^m`U=__T))xc8}bKt*m$<{{7K~f%bXLb<2DPKSdFV{%dY?sTkf9F#6`##j{pOQ(dTc3a) zRJEx2aos^xzR%=W;pfC`7HiQYts5;K%yre-BmVNNccJ3 zEYRpAIu4nAn?-bg8l$!{D|Ah27@`z8(XZS=hpx3f3Vm+)dJnv@Vx9YKEne_vKUK2! z(MCW*qRH+q;nOCUMCtyzsMWaD{I1g=J#K#JE4R`uy11d_(%l?@m%!wbZ4^9aGpk58 zn5J3+t1xU#B4mF(1wviOuX4e8x)z?swESz9-?jv878+qvJ?#t=dH0E;g->$D@ItvF*446$vJF(G>Q0TUe{5_$VS+&%?j$c;0(U7|j--ye-vdnGtRV|AYBe!y6P#l5Cw#-AeT+Rf|42dSTr z0D#9scyiR?xY0lccAYr|(}I4|LYc>0y*JF7);8;v2kfz#_uR(0@VZBZaRq1H*Q@Xl z-alBG6dWoC0L>i7MGhU?>??!48$Cp*0$+6V#~8l+PpQAXAd@l{67+ zMX)%Mwf$YhTA|Hp;1|{aoA8u%HBne8Lwc8`dsJY8>`S}*7{wcaL}4^&Q{)W8enuLR z_M${U0@OP58k3HD)v1aW+=&BUfY^Dx)34?M-Ufs20lrwF7w6yXkh8NFiC+F$!ckp{ zJ3!mmVdH_WgYNyNn#+dQMm0UP(ezb^*xHg>2`%VM0mUHZ2Jm%wR{hULo4R~uj04N2+EJj|G~D8Ezw z+&(JSZfN**k5HjgY_zsPeU{$hy8sO!15sM&R1y%k`ms_n{P@Q4gRyxJJwo6g6NX?k z%7}m8K|C>t?5tMZ`>`+V&nW;P;SV0xxOO2YWGzjYUFb-R;zdLX#?KZCx=3K$K>z5RoSo{2M~$)^BY zm;dI(Ed2CD?Z3DA*4b@fqj{(VBuXD9{apI~Zn~5Lxlt>#^5@^`yo?EfkT!%G9;8qC z-!QOmq#Z)hLvzh^#R^8yL%c5>BBG)h;x^p^v?6VGaIJy~bg9T7)My?;AWXIY{n8yfYupRb;jmos;3u&9ZsDHD!;tf>dTTuOwZ|Gjk3 zT)3dI@77ye#eHR0TwU(rnN!k2|LMk0-vJd#8s%8caY)mlD5M@?Y-i%IBoI$OkB_OT z(Fw*;?m?rT?2I`i=xk?m61p$;rw#8KUCGzodYB9ki~IMuRIeF+hvneU&`CdH7>}cyUvbmj8PC>0O%jZt^uMNdZMl zpV0w>fl%g8ZUo-T7_}pJa?-z+`+G}sh~VY2r0e5We_y#`VCJc@J_vr0_V>^Kvxbe2 z32u#2=b_9TJGL|7x)wzxGDIb_`7(ez7g3<4zLF;=e{XzIfywbcTRwF+^a@zcKZm27 z_wVwM*~1sMh~gUqj-!#hT4w^`JtSotm3F*A}g8&kr+vZs?ITPV7Q zN~D@tH3`G5VS2p4p5R5yBOP^Z`mNmsL*8C3{Co4(#@BO0 zc(Vi!aeY#AOA^AD6a(Jc*L-QyhkKkvYhni~U6|^?=TEy6u$?D9x>-3~GIe7ed??oN z$N6UfaWHg=^@-{Pjx0Q=_mG<}ET?Hc@jQn0{Qr%#hxr`0H*62w`Iqv`3hPs2Z-va* zXA2(%x6SKus!;x;pg8^{PYO`83Z{N%G` zR^N#1qbuUrbtmI;NIa+DhlO*mGv=g*biu_%Vq>CLym)J0?dICYH6%!mvC%kDzn}|> zb7OR|(0gPGE|-wlH6|X|X#SzHp=2W%e)EqWXTrVicEr0LDfP z)-~py6~@gkv-}j7%C>y^3yrTks5m9WRjuY6Te^-M8A1_Y14J!W-oX5^m4$cXFz}+G z&3*hdwN`YbOE2~0=E0W|2m)@xhw~^+%dlVDty+<@0ZU2lTkQmow$Vw`!>Ls zIvGs-{Zxnnnbvch&E9D#3yjoqbobRM=(Nl3arz&%oq0H$YrpSP9duB-sCH?K4lFfK zMa@d5h0>aZh$5&MTErBgrLC6MOd3R}(h@_3P=aV_W1iwaHiGq>>aW6+f5~}r-*z^=@#-4yZPGC&68yuh_UAG| zbg@zI#Ru{pvhkK!yGSIR-b;-6%<|r&UE#;))ym0o_k!Cs;(ttTjdgVT4R}f<5`jRI z%(OG~CUACJS9D}5YnD&Q^3J` z4sBTJ3);Pm_GLIp+q}!^A1d6OH(cQqyMgoSUFJ!Ubio!nZ{JI9#fkA~zaP8cqA7w# z94WH2?4&eG0zw^4g*~hs0S@ytC|q<#-1DNkmAe+e7iQkoR*LDAfNN&*i!P+ewadm{ zfGqwQm&TY+XiJw)HG9}LT2+74vY-$ZjBjaaU%C(nWbcRhG^Q={1jz!i*%LSKOGG#o2eG* zHwx(MdBibTy{PJK%)0e6kzp@Yb7!Vtxw)3AeQB~F@N}c8+gM*DK=9i^r~GhatIC;k zE=dM-#e9bH^FY5FifEDd=vahn0jM;>47P(}-cQ6y?MWjHfJd^2vqzkieY z!#>Ijtw=&7E4ttZgm+(6J$w+|bM*pr#I#VNz>FRRc)NTJ3%4E)3XNt*<Btufwb@ch8Ay^Nwr-rhYaEV*GGrM&ELYEj+bsQD$`UGa6ErE~5x2NxgHhxLqJ zzTI7sY&{tJAC6wnvGOO0Z9GyNHDUZhx^8sv&dvBYV;(|( z)H`*j(F*v`m22`>L%ZE823yJ*VZyub4#=<&-ZAYgv(Gs<2qF$-zA+x9&?MG}cir$< zu2H4Xm2>JJDOw?x8}HAjC8RbHKFVx;YJYOdQ5BS%T?C=E=Ze{;1sM6JE8aPBwrob# z7ozBT{FZoJGr0Sl{0x4Ay7siCW63yA{!!yoN%}hNYiR7j;hvYz@pcfv;(T3y&`3XjMyP^Ki{`Mh#DfMYRZ5WnE33rZ0OqIIaD_ohr`|6+wHnlmd;w&=TGQ!O!^% zXK6kMC_exGtzf-`pkM|gq_vug5R`=1%t_uuV>r4-?rQ;WDxpfxa85mfQg(1$&jG<6IkwNXFr=}|3&wqK}->j(e#vmf^ z`|m+y!<__OJGW&dW0p!$-_Jc6` zoGHfDRHFN!LP4__j;-SPvdl0~-@;EBSe!L*395(Os@eY8{Nc&1V!-JQk&FNcaa9Kl zun>IAmE4~dAr;E({q^F{FS_%c)e(QcrX29 9xU*KZ#Ef_@%ciYdRtkmTGEc0zl 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 literal 0 HcmV?d00001 diff --git a/images/tcpserver_connect2.png b/images/tcpserver_connect2.png new file mode 100644 index 0000000000000000000000000000000000000000..8251d6cf108488a6431916f89a958338e02a5c02 GIT binary patch literal 25478 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 literal 0 HcmV?d00001 diff --git a/images/tcpserver_ipaddress.png b/images/tcpserver_ipaddress.png new file mode 100644 index 0000000000000000000000000000000000000000..2009675a2a8bc9f11f061e9293291918fcfc2044 GIT binary patch literal 92940 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 H7Qz1q8vL|W literal 0 HcmV?d00001 diff --git a/images/tcpserver_prosetup.png b/images/tcpserver_prosetup.png new file mode 100644 index 0000000000000000000000000000000000000000..3863cc6fdef734f95496cf4a691de6104b92209f GIT binary patch literal 232923 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%0A-D0M|=Cp&8_}uT2@vi{aAVGwKK4Jb??{pv{k*i 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

_Fd-#Y1l$M@h`6a%M0 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

wtn)9=V=oTTJI`0N*n6Ahr%)yied!x-`X=` zdeJhg;wbo=PBFr~zdZcwTD|vccO<&XmlG(FEFZWA*Bwo1KT}ATCVq&cr3JRFF2|>N z3$*LafoHR}&<;>$0~jVqGxQvVUyw?f$|UfFOn=;Y^!Mow4lp;@NHcULgRx4}d!s_S z5xn*c=q~zl ME+YnerTyvu0YTyDnE(I) literal 0 HcmV?d00001 diff --git a/images/tcpserver_send1.png b/images/tcpserver_send1.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc621c9f2c6ea78be2345507094458d596d3093 GIT binary patch literal 26719 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 l<3NbsJI8yUTiD#xM5_I? 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�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 UcfgGP(?P3!U;kdE#*{HP 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 literal 0 HcmV?d00001 diff --git a/images/udp_filter.png b/images/udp_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..2cde6ffda6da917b3f717df77ce7bcc095338cd9 GIT binary patch literal 13878 zcmbumcUaQx+docen&zm?%3Wz$u1ZC7XJ+O$H#o4|;>x{HyDM#K?%bJMKwP+IW^QpL zCMs$Ua!*7-F)FV{{3CY!MJ!|`yAKn9K1F%&|+uhWd#5L?Aj0S8v_8$k@W9& zCzGEJ>V$ z4*&r6YTs8k4YFOEVhJ-{XrgUR-vt~4owL5%_LA|K@aI=|k6)L%e(aRFX0Hd$_|X-- zc~Mhs6`5RPb`xFIbYD`(v-l^`i<@}d{4D6)39kF+&pf$%_VlA;7pf!g?$Hjj6r6pW zq`+Wy8e4WT4Tba|o%A>Z&>8turaoJ4+MI8H60|4IhAG`IpCVS>7 z`!O4^zo}dzA|4ZazFR&Y(z_rK9Wvn!mHgXm=Kd=M0N!fv{e0L?MdKFnR0ZW%ici^- zmPzk#K?fK-24wZOF~ERvOyh1ufWup5%b*79gK+tSDNz%LkwBsDn&_6eVfzK2#}mh} z=6`#92oj7HeFAma{fI?cIronitSryf<}$T*mc;aoWK(U|Eh91;n|DqqgjDG%I||;o z2~U0_9am{3(ktm~SXKR-PXAjX$vMyYqTSesaA>HbH~GVd%Vkm{{`LBwHQ6HlYY7mK zdNW(x7GhPo%tWmBeo2ptF-Xb@JVA7xyds&7uCP6$Q|{pC6ijQ8w2&6iZmjOJhMEDU zq--kOY=2xj=bWz;qcRej_-8f%VEJukzd~UqGG}?Zr3KLw+G2jvJ-Vgdphml@?AT`W zw%5Y!7o~jf>COtcL#(OUoqwi{y_6QAOPQ!@+ehgvx-u71mo!rawMm6_uF{o7*W$8O zj8lM#t@7JX&v7sI=J8X0IKNf!`#T}=+W_}-D~${M$HxNq;rEzYLv>mbqgk(Y1!^@X zWnNX%6w?&bf#)B7eAqqfHX^2@2{x}z+L<6$*_v5xCn^^UT3t7(EYz9(;ntlV?~Zis z8_qL)17!I-!I?W6Gh~hkvo1i;gCVN%qeqhIdmbN3SZ`y$%Y+@dKxwYXh&MH-$aFFt~k0t=mqX}_L~Jb|sBY5sRPkxT;veV>7{w&>$C z`O|$VUNNh2lFV}5bSCnd|Jb!Tz_YzeW^Ld|`V;Ft9t=V<2VG5qY&c!J$by zF-}^^>y1b#Ej^yVFI9K#KJf$!zgFVw5U(Oz<)!B`9T5AvZ}jYXhIYJ~e^j7Vl6dNk z9fu5+cYZNl_D8qmAgts*qErouu$JqMK-*NQ8h_!B)}M|>Hw89)FRqcVbw0=N?_y{7 zeM*0^zngRz{96o-q?qiuZi5TC6BV6>zlG0l=5O#_c{P_idPgkga1xYS+jp=dJvPOZG6cJ=q-s~&h&ZF#WNlc zvCOjy&hM^$G>}u!1kp+;r^qn3w;}+xskTyPE%LHd%;|mOv5c0HsKYBEOFmFqs42q_S%eDiG_naAr0x(a2q$S|9V&Jg0$#7Pt5s}r|ZefgJh zT2GUelQXZuj1j^A9xZ_Qh2%1hLtbuJt>|@o*&?UJi1j$zF9Z;hm=@KHW?e|nZCJ1j zeram@D$&gJZJ=>lC}!%ryv)K9H|?rYGg;3Qc61G7ydRSh{~g@?gYt4zLm~qM*n3#d z@))KemcEeMT(}!0Z|roTe^<~{r~gC@In8dC{K}8NF5cBEUE0jpciVyWMC-o`y4$oB zyU14nG!1dj`2tBVg~!g3f|P(w%`JiDefztYZ{TUgrb+TC23azBI7$to%9=w!Q6idC zAZ|N1$=LsXp2qNvVcf_A0|PfvHKC9cy?VEbCANQu2YCP7XPBYk_N;=vFjhVfjO7)Y zI>v_)B`;;+dhyFTaT?K_-Lt~eZxiKHN~Gg9TGS+vjWo2jB51%RqCoj@jwarpcH-SN z_P-pfL?<`a2ZB;9SIszibBh^wfUR>F;BgD<>oWWe~up*OvhQrJ%3< z1GxCNY1+x-c7JRCKRQ}7w${ZjZN2Io8m@e!`KD52DnUwdY2sT}=}mO3u*?{kyY;EW zvCfZ{b*b23@1Fj1v4W;5>+({ILHqMw*J1}wvs8RzkP7$Y*2diojpa^1-W;=XC{b&xy{oS zwMSE{HIFmskl=sH-6ypOfI&j4=BTmF8Z_7>UNgS%p{;+`ulX&mApS}%@Y{BlJKw$@ zF_5~-6GU3dy3%&KZ9YgQd<)@Revy%WOEywFRdkM@ASsGAIv(4Y^>I^FlU1m6JdkJ| zr}?xnn*C1RX7gAl>$UE@e>&4_Uwt0Cts&Cc9Hj|!fY(KNqO=AB9;peHdqUJ63{-DS z@Tbo2uiu`IP_rXXr8Ko}U6#U&oru4=bAEL4WQWx$5u~9`J6Y=8nK7aNtbfq*Hltso zG5H~Q?|AWRbstCdJ&~cqn%V2gh>1cSHv>C>jL)8XF|ECdByjG#sA1d<_GSL754JuB zUzscDu6la*^a~)1=F9kOtd=oiydZ>qHa?uh?M}4VUTMl!^euQrW4_(-M3p1=q|P6< zxpQXuG(fB9NG2(J??b9TzZ90e^JuuT8hk1V_KqyCQE?SgP!Lq3`}I~+cdmmqxO)H8 ztj~pqdwJ#NWxRf#_cCHzADe2pXTP$Suoc;YR{igezmg z`oym<>Z8;Nl6H9c%+%ENwf1`Em9=IBOJlrND&r5Kn1k3GaHo@wgwqu{m}mX+VF9gA z1i@-T zPq;HLhouzxdnuiJ3A(W7>qZ2v9I-}hFs|JWAWw^Mu$%dsyBp2S(?`GJ(88)Cyoz1R?dwPSbI?MjyL7n2`kt}zuKX% zWDZ8F^;SvUsk}?b0-x`u3Co+suV;!TCHA7DV(xx>x?b|uNk=`ZN$OaJS?*;leQ`*z^&D@RC~Fzfb>k*54(T4q~V7yla3p>!d@}s@4 z>C!dBxMb6G@5~^gktv0w&=8U_>WnSpIP5y133}*(OY1WV|%olt9`6n&ZX2EH>Jy;<7We8=Je!9w#i>4pW%xYa4 z!W-U_Neqdiuxh|74rgZwW#4dyjr2o%HF3YbMqnj_r2QS^`jH~u(`0htNT|%^M>=kV zzmjzJqfq&NHjU5tU3RxO{e1DAM8T83DxYn|b(;j>BwO!8FEr{z1fk&|=9OReA8UiR zJ|u)`Q>6Rp5rZE!=}D$#0NS}U_qc4{X+k^XMoHT{5?a{5+2~EiXr6x({l@P&BPVFs zrs2Rm^7tXJL6(sB(5V2_3mx*FN<&nVYj65Ge)}HQoxKc?8BP9~nG#9Rh@M^Mf0yVg zb4oAC_9@ohc!o2r$w%g@hR;9YA0A<{o91swkA;33=rL9s8~ffi0m%xa)cG_h1U}__ znO+ob{nR&R$~~bgR4MT!$-u@n5>#g9)8y4Ec+h%yslfZuJ2ku4JJwPEv)iIvt`J0d zxYl67I(l@L^Fi!Ra#!)Y_Sv`u~Sd2~rr1{!6`*-L(`UQ7B_pB+@E z(0QijX{eXd_gPesNbJmS?Y7g~#}oZ|VMnL83r9 z#}X8q>Z}27XA%9dj7_?w_CMCp{l!${6@Hp|Eq=7 zw3W21s~yB$K}QF}8@mzf#(kB#JAKa>ZDPwdM87y=)EuhJ4GO^;N?K&Zve9>i_~oEj zr-TpG@62?KJ}fu8zV>i=Q-S^IhDg+gAPIjMGsL=EA541zJMt=1%;+^5quiNh$U#N- zLj5OWexG3J&$_>gn*y7U&O1s z?{oYIK1F_$aywDhqI11Sz$+(4ed6`mWy@8p(F;X6XSiX`9>HB-vxv0l&XUvKb-pjr zRrGr6DPnU~&f`jy$%E?errn}5_2bl9*Y}_zQZ6!w)gRIJ2Oe&=p9TU-gG*iQl<@Zi zo>y~S{a*e9nRC+LeZV~X-Wp~+?Tyh!|M+r&WyP>c^J52s0Sm7ad7tI?@R!AtQ=Lw( z%cg=7f2=I7ii4qj_nL$}*v*RU***VPZ~&1)Oi_{l4Fa#Y{a^gJnV6VpbnL(IuRcKI z?qAF5F4wGr_YC0wI4+JcwgLuUDYxY31CxTdLXtp#E=0hm@+$zQ$OrcsX2LVYk#%3k zH*I|X!pyWtCoJSY>!N?$6(&7L093>F%ffd0<&BMvuW)m7`>g)Btw8*4l5d!;iakHH z1l`-1_9B;*?q%MK?GzTx4y(xU>AB%EtSy@AI25+kabXx~B@dOVLbV*>(#{r_lvEVB z-AMs@;jIUhcl4lA72M+HmL{{V5h1p_DjlE8iEE3Bt(jB`NxL(q@FPZ}alI$QMZaUQ z#TipxkQOr&x)Wpy*aI`sd!l8n@r`2i`($vrt5(R!Ck)E$C@ z>#AHw9@P6SJ@I%n@#W>Id|$!JWh zjRf}+;4O*s^A2M<$f!!%!G{d;i& z@Isov@d(OVjSm*&oVw&9`_N;wB#Gs!>{qO6hJFg1-cff0-(=6~78^JnvYrmy;jZc& z36yx2VoMXv3c81fk!-j&t^I~Hr9E)6OQY}cOr6kdl&0R-+wYD*Tp=#~T7s2V33#V>Y6s>4=t@@H+l)-*qgjPY5_?NW(T!*_x2{N zj11@bwKGAr9gt*VLe2KhRTY&f@L4|OS6uDWTm`Hr3=@ArJS%BI3m?C>V71U+D%90R z)Uvjqc}`UKGrlEc24;nkmkOQmrGqMS?_~0{Vg-HLPF(o7z+NFV^+!3(JI zoWcopMX|b}ZGsn)D#EEDJI#|!XdH=t+W82CUdZ06>j12%nVIe4B~;_~n>uID<^!jd z(YTk2o+?_rJu6#i=-2?_?LzGolWlgyQ60;h;YJcFs+T?=kYZD2_e`12?D27Nk3B$v zSFbWRk-*GQsjX#POL%E1k3vt{PTk(}W1r3!*}4;Q9t-F(LU&=ugd;I6wy)ZtJj!-D zg4Wci8j-~&;PY~6r5z~L_1@l7j-+m*l1`OBh@}W_T0oPNlX^@Hox5$gWctG-N=m}i zR9~4@I?clGO)<8T@BwHbce*Gfd?M|Q3SgkWKS?{`T54$c*H>q*-5=e^Ug%BHH86-# zCQbTEJ9M3fuKbYw)=b2uSeU*(-z*CBx`t`l%y`%0(MXE8U($Gch>5`) zr>(9?#;0jE?)?$^ufmG}%jZD$V4%cM#GUDK`{?4J(a6OTc&T(!eZBHo_Q>cOSK)@J z26)*@eOR4@nvX~+;KvJ1q44X)#l_p|oeSIhc*=s^=&{OD-<^>KAV%kgiurO0*g{;* z-_ivpnTguS)x;_#?zkvoL6b7&oNHHaqI!v;;uTSOC4C=!$Ov0f_!@Amr`rQMpevD+VmtSe zmUgpA>etm9Fc^1-CZAf$Pmd01#W^j1UN^8S;IOr7y35O)?bc4jL#wMGL#o+&W9}AX zE6h+5UGSvxDMbGck1ha_El+*cAsnlGg-RyM&_eB|PlYtedEq5uRmnw-I|E9KzCv%m z;c9Ft-Jsyb@UX*}ql(Q42rCa@+Gm3CU`-91Dpaa0b5*4P^9P^;JQ)k*AN^AM0Nu=g zR=}}UqMi|D$9v@VtKc!5$(Q{l({tXVJ)uE}QxzFGNm~<%*oQ||HG>1fs)d&~dvu~N zVrPuSBi1%82tS`E@|gN+W=5pr#OXalllSYXY(7msH*SS*|FzTky6brjdZ@kPPruyG0kioVqD{tkPVug&Lr*>4=a$ zO}6uIZln%K*X^aPhzQ$Pt>TDDXu0w#$Qp!{OBtaqA59HkPKcnwDURDWr5SKGfrg0* z2A)#Bat6tDR^d0=AF#!nZX5*L&#L9GPCy<~wqF-?JXxy;4maC`F8OM|IkX>f81VzQ zJU5T1?ZGX79SIFt(-QhN`h+@} zfY!p>3d|eayy;p{(S+zSVq^)A;4=mwI)BhAj-+#!YqnACJBWN>6uKG9=IFsm<$Y~_ z+id~GK|v5^3(`H~BWR=u`6MJSs~e!$tdQ5q?Rs%rt$BhguuAp9ouRYbyg%Ba%{y^P z?ICpIY-E9KF`XcX^o((A!Nq0?tyy8FcQ9&R_b#xz5S5n|Mwac^jeyr<^1W2#VAO$3 zCH)AnKeDqZ!o=9PPjyaZ-FsItVD-nN(%PS_skiN;S|X-eR%zlnO=&_C+--c#yL3~!Yy5zetfSx7-MT!0-RZKlRg|Jv*g z(Sw3fiF^HuU0#N;dq)9eT_0L;EM0+H|JZ&46;p&|p_syW!&fL((Q-$gf8t2*w35BCXZuvLfH+N*?Aq3S2$Jaa>~3mJ8#cj;G$Fl zU3GTJW|rzsmsA*Ugl|wG<~Op15Y({c%xGMie-Hlre~1=&-!}=neCylVM2&nKim5Hf z<l@*If?Y=hF7^5q1W%%-1nB!n#G zr=$gpJEn9;9&2{at9K+J)%ZW&di)PdDzVY^W9dlXG^~cjYi`YoVhmPCB-N2KoC!}? zKJ;zv3dESp#`4HKaKdDHtlwsjAleQtb-cZh?jc+DW;9ehxp#qqNn2-neY<>PUl=yGigZ!%UmTI zq-yJ0zQ=NHb`d)L0&9R@C=vS-$k0W@QSS%5pjOtj)@xE&hz~+ zOs;3reB6=qDhkNBn_svlvy%9KmFZhv05mDrT;J8MuzfEo_n1TDWrxqMx8Rs*>J*+b zU-#TlSA9tf%Nv)uklp>=L@+Kf8J5>ruUzVFuA#}!DZ9yDV1~>N+kP!!Q~w=o9Jm+k z&v*1KM4;+3NF&?>oC-hYp{@P8*l)BzLkRlTF~}}`swPXE@N~(~hEnZ%nm=q3+(ufh z#Pnn+_%44BETh{4U)cP^H=0OkJsTMr{FQnnVyD{C5My+CNlA&E#_)2JOLR{hSot1t z&b=No)gl-zXefJOPdlmbDEX>P_94`W@^*Ei#jwDp*~oMGsJ8KF`#7l4prs9VLH94 zkya1iio~+5O=#8!O2C1Peq#x-|8xJPzk+i9M+)zj6&))x*L59DG>0sy#YA(tPHh#; zLMnYrL^ggY`8ckuh@eNWRy6yeL4iffpC+ef$F^H<#Oi4J*MSzJm_m6amdl25G%|6; zai;azF^!{TqaJW-3HMv_BuGHV^f@}{UYp(Q0Lr(HiO6faWYk;!quw8m09Af#G)Om} za)t2XJ%5z7DeHn5CWErP;4lJ#&?}B=d_w;IxDqHbwnWGZ9e5$NwdbMcMV^aQEA^k; zXr`2c3db&IHMbAhkGV}V3kJ2CvMzgLd9S&?QVHI6i12?b5yjqMY~D=EI_E{c7oLzM zPBjp?T6pzp?a(QawvOv@8hL5HY=?e%#62w&ajiz`|VA2$t?gphLj8=)#2W7aD7e#2YD z+m}(j&YAwz2Sazw;JMo?8AnIW{`H^(J$$-5K-N%TGjudFDjfU z4ytmA3m&Ko$M2GV5ilHXM9MtbXO+sTkkF2DD4n- z4vnEVqb}{vE5Yb?gTfi3AK?b&NB%M*BtmwCXOuHG(n2F#;HQ#;!Z;fgNp+d=U@qbP zynL%SbZ_-`yOowbsmX0r%tWDd!vx+%%vdsl*WZLea1kq5WPiOSg>Ht+&6Y>C;G%7X zRSZK==efC4JPB|w<}Th%;9hoLFr<7m+`N5Z*ocdyW= z<8rADd6q}h6BF}j?g_`o_<)1FU#EERv@m!y?w^f*_Gw^>%mkykYxa=h9zh(AioFIh zxe^*9n-HD}qu!?||01PwpjG{sO-&x7rZ0qK5*w%sDUjqA>YCRgMWfx6YHjO?0riy6QC#47LQ=xe}Vvd-x1}f>96nxJ#)uX=pW)l65i!ZgQ2mJxufDae5 z7??R;2yB?qo=pncT8JwM^T@hk*?y=xjavYkqSm^mFlnS_G zeHS`nbT>N!fk}qVy_eV94;s;zPxa@$>sC~(PB?Y5(eAjq3a8r9R;<1yVuY79`g7ZJ zrmi@bOQAT|LXfX&j@UnFX;8ZXb>*4_r2NTCHXiA({PsFJZxA*O<_}^8J)$0{{5HN% z<~^%sx=a=%9@O)Oaq`La(RqcA=|^dY7~03X;OD-`52G;GY20*$V{acdf5o$I;rw`o zy$`vRM<$J2^?&dt?WaV zl(0g@25)A8uXaF^9-8^jjCsh!YQxzs>iRuM(;0C^+ z-YVKXfN$8X>~l^XQ!4MP<>04#NDYmZ#;987tl$FBMzt5=DfDGUvoq4%!lvFY&KwEW zHa3o5nJcBcB#sU+5j}KQtKO%QV>KLS1W^pkd%E}%Qqve!cZbbdfJtFU^@hZ)q*g^X zAM(uQ;d1-k9;(ro6InxFc|%4m=su17Kduo1aqm6j=J=wGaU;_5f%D;Y2cnP2>_F!j zCAMcCp?q-U^703y7Uw&G)!yz)^jjLfamZ;j`P)hIeq(%)k2Lxsf$lPi`z2FO+bvW} z^+jZlFbjnlt+&v^p&nDRUz=I}O~PQ;{6Tkk8L)5ox!AHVe;)cE2?UP52qvdJlm#@a zO6u##yO$;3$Cg0Uf_p>RhK}2@TccTh#}8=YPu-NeMh|U9allC`s`lWQ8vEH{= zD;=FXoQEe9M1(T7Qr!>j5{k|J?I)@|t_`jZ1g9LwV~_XPuO7;aJ<*#wn;m_CE&XPS|^P2 zqmXIQaD{R3@{+_3|Ihm2oCZj?8b*1{QXKCew93~x=^j3K7XFZ6-0&f;d)|rV6X?`*^!OjEU&`nD$Wk3@><^9(MTO5*c;H9e|k4 zG_Q6mI`6UXoF3%^=H`--v$Cj}II#$ia>iEP2lvl<0r*QG zHs`}stA@?tZT2j#e7e)GPd3W#wyaf8=)K&BqnejF#nUV1=*WL!Ln7((&(@6`d=sUM zTVv||mDByrR7xXhv;iO5DQv;UCncchSB3q0ZTaA#+f{7>{dVD2@@b-BE=)d96!JVi z6YAA~OMBCwaI?ijf7B3wsHmvW`xHVYj`jX_gh=YYi~1h8iEdf=#s;c&DW-c|dyrSJ z%yqtxOIehxS`2$amH49*PV3VdPvgG804SO^%35di55paSFBTe>0tO1$91|{exD>Fe z`nf!^hpp4Lu(Qr z5%ko+1!WX9bMXXGKk%biXYSXF`+lbDS6Y@zXPRO&T~651$Nx<<;*WUDUi-i&B7ho$ZgaQ(83X_rWDF{4Lb(3@;jZvEnSUjcjt5`Q@cei4`}^XNx;i@Z5E?n< z+_`ffx&QWz>|){+l%Rvw~F_wD4;v*D2NMy_uOAJ+aBd zY}9yxYPCRx?~v&pZ8;yJnehDKj+;+cQz)sY+G8TGv2hZ7Hghqx&9B7(j7*P@zmlow zUy=O%{bJrop<&IULB=Z#0FT}%G7T|&k>&1@gy%9Vj%Xq{5o)v$$iJKVRDEdHylF9K z*)Je2E}mCXF-)m37DKcIz)MOJpEGmz4Ci|t*t(B5!x~mL$IewTy=>t>xj^Mh?}>Z233-D;ju`&~*mV<~seBtV7e4I>mQrt7`Wtk6rM|A}7DH zT@z00InLz?OL$UKX;syC@UY)~j!1C^h8fn4u$T6#P90u78cSY1o)i?iRw}?*MTFCF zboZPxL}kOOBHo{Ok>6q%ZuTB3Yz8gHhj zrHQ3j`@F8A$9}+E3g=X9zr_l9fnl%t0ilM;G61aeF^X6uY_yG?_cHVo`HoN>rt5tc zpFW(Wb*xtgD-8*Kh?j_Y9K0A}^J~Tit=yXGaoM zbZdn7s5!gFczfFdjCwPm-?33#m?gG`LnqL!gA4Q#=|S*;mC3QmlTncd zf|4UU4|Fd;&$ATFdPQ{!kM1}&*XU>eR2~sN>?K$jrVMpse;W1rTD+bA(d*Rx^&bnQ z-46>8ESK;I^fUdBX+)2~+FMZEtSa|3x_cw0O%FMEKRQK)#Q+aS2Q9=yquF?j;p}{J z5}(G?fY57n02Y5rs zWi(vLWU=c!v>coQGC4TVD@ETby0V+90InmyQ%(?cn>cw~%vP9mpttTBJfh~&Qe8^f z^%;m(1Unw59*ju%=Y={u3^8J(6jCvaZrP0v6>yUICKxz`5WS`(OI>1BLq( zYgQj;XKJWLgOg8|(sL|kv+Yp_Ha9VOeR1mnFAHV*db5Qg@6gEvx@$Pr)u=>$H8r_CYU;4@qxpr1Xo7cmIOB>o}LUH`j_AqM-+xaEs+DXH%wd0gbpl_kF8)wd{ zS_|)RK-`dT6GbomdS&CpL5V+u##WlshT1ThSfLpDwokhlBzV#KW}Fss;n`!~+Jyi> z3z#Ww?k{ak?3i1~V;tTI@$r3-g$xeSpd!ND+Rx?-z0?uGM0!B_;~bR;8_A>PQ;}$P z!>@oli*D0)9Ssi7xcfXSs7*g_DZ{13Q}^GFX=lCop(<%Zo@hTA%YR+ip>VY#iX}!2 zoL%olr~)mSrNEfp1_@fPi+&IAV&0o@G_Bw5v0Xdm-M)s|Fiu50_CY!^mknW+qI{*& zt}9X7&^!LI4@t#_U=77+tJ3#REC{@7PJc?x%Yp9NVMVu^A1QKY8#TH>AW;7LHswzj7Zn?+)u8Ih{gFoVmi( z>e91pe2ibDu7&iRSFCpZ%G5BT8!(#;5n~Ybh`ad)0s14I09l@aO^ayQksVRY;Zu28S@;kpnI0_?(EuYs{8)Sfm>G#fPPX8Gij#yx$Fia;HD334lQn#^@Hgn#}SVWvnLx5(OzR6E%dfGKj zu<+ygi4TJ*J@XmsN6sCppdU?6uNFRpVM?Y_ADKKQ_l4p+4t(bY8;%1t=HnWN@RC!k zBhIp0t1`h=lW@!|+SXzxTsVWdhQd;pSp$(dtnfNeF=^-(u5AC>g12vQjNjmCe1@5R zkIAoe)+RTGhIJ;yi!N!JduI$I7p>C?Tw1pH{K7j~R}mPuEU8@NCs-g>!)Zbi8_F3r z@He-a_f-GI=k1X6sMdOeY;J!2ywmbQQ(8hW5$ITHl14NKuxO@6H3}B6&40(c^?p64 z%I=50G+?hp6_p%3eep-PbCyKHgWX#riN8pz$b$ zlg&K-R$Ecj3&Wl!Y1kVtkIgXam@(Dd)lSS>z`u-fm*F;+GL3M~mOkb#fvbVuOxQSj z2^8IKV;1Tvx9>#M;jWzcGL+#rto=U`@={M((M&pg1qS}4BMW*^Kt$Yv>DoFWbI80t z8~fmzwSShZ*WzvcLjTm#KN$}IK%{pmU)*K7(yv_nJhDluUwHubRqgKX9xgExhn7C@ z?m$USZqp;Cd+SpZX>dN6;1)gRiLB%5g&b?7hvz`m?y1U0`*S~EFR8aYJ8S!289kqd zhFE8Wj>_3>TD1z)&?rR%lcBDqmm+++AP@DU`0Buc! K`=$5n{`r3jCkK-N literal 0 HcmV?d00001 diff --git a/images/udp_handshake.png b/images/udp_handshake.png new file mode 100644 index 0000000000000000000000000000000000000000..641a18c08f33610080e6dea07858815e73c49658 GIT binary patch literal 95190 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

KB0F1nB?8)!mN4E^ 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 literal 0 HcmV?d00001 diff --git a/images/udp_led2.png b/images/udp_led2.png new file mode 100644 index 0000000000000000000000000000000000000000..e170d5c76d3a4dcce5f02f59eae62a4138386289 GIT binary patch literal 26248 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 literal 0 HcmV?d00001 diff --git a/images/udp_led_wireshark.png b/images/udp_led_wireshark.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5d5353ef524944ac6590b04060e990545d6be3 GIT binary patch literal 43712 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 literal 0 HcmV?d00001 diff --git a/images/udp_listen.png b/images/udp_listen.png new file mode 100644 index 0000000000000000000000000000000000000000..2a353df323a89f3dd2bdfe313260836eca8eda1e GIT binary patch literal 24670 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 Mp3&7Z-Mf$f4LWDIKmY&$ literal 0 HcmV?d00001 diff --git a/images/udp_send_wireshark.png b/images/udp_send_wireshark.png new file mode 100644 index 0000000000000000000000000000000000000000..38603159a95187a220ecced4936a8d82910f9e76 GIT binary patch literal 44677 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 literal 0 HcmV?d00001