From d7ad289e540c519d996d4c645e7dea686ad328ee Mon Sep 17 00:00:00 2001 From: Nelson Ehling Date: Wed, 27 Mar 2024 12:35:12 +0100 Subject: [PATCH] setup folder for interrupt controlled SPI-Ethernet --- .gitignore | 4 + config.txt | 53 + part10-multicore/Makefile | 14 +- part10-multicore/Makefile.gcc | 22 - part11-breakout-smp/Makefile | 22 +- part11-breakout-smp/Makefile.gcc | 25 + part13-interrupts/Makefile | 12 +- .../Makefile | 0 part13a-gpio-interrupts/README.md | 164 ++ part13a-gpio-interrupts/boot/boot.S | 114 ++ part13a-gpio-interrupts/boot/link.ld | 35 + part13a-gpio-interrupts/boot/sysregs.h | 44 + .../images/13-interrupts-running.jpg | Bin 0 -> 70954 bytes part13a-gpio-interrupts/include/fb.h | 13 + part13a-gpio-interrupts/include/io.h | 17 + part13a-gpio-interrupts/include/mb.h | 34 + part13a-gpio-interrupts/include/multicore.h | 11 + part13a-gpio-interrupts/include/terminal.h | 253 +++ part13a-gpio-interrupts/kernel/irq.c | 60 + part13a-gpio-interrupts/kernel/irqentry.S | 156 ++ part13a-gpio-interrupts/kernel/kernel.c | 152 ++ part13a-gpio-interrupts/kernel/kernel.h | 54 + part13a-gpio-interrupts/kernel/utils.S | 21 + part13a-gpio-interrupts/lib/fb.c | 260 +++ part13a-gpio-interrupts/lib/io.c | 199 +++ part13a-gpio-interrupts/lib/mb.c | 39 + part13a-gpio-interrupts/lib/multicore.c | 44 + part14-spi-ethernet-interrupt/Makefile | 25 + part14-spi-ethernet-interrupt/README.md | 211 +++ part14-spi-ethernet-interrupt/boot/boot.S | 114 ++ part14-spi-ethernet-interrupt/boot/link.ld | 35 + part14-spi-ethernet-interrupt/boot/sysregs.h | 44 + part14-spi-ethernet-interrupt/config.txt | 48 + .../images/14-spi-ethernet-arp.jpg | Bin 0 -> 66069 bytes .../images/14-spi-ethernet-photo.jpg | Bin 0 -> 66277 bytes part14-spi-ethernet-interrupt/include/io.h | 19 + .../include/multicore.h | 11 + part14-spi-ethernet-interrupt/include/spi.h | 5 + part14-spi-ethernet-interrupt/kernel/arp.c | 229 +++ part14-spi-ethernet-interrupt/kernel/irq.c | 27 + .../kernel/irqentry.S | 160 ++ part14-spi-ethernet-interrupt/kernel/kernel.c | 150 ++ part14-spi-ethernet-interrupt/kernel/kernel.h | 51 + part14-spi-ethernet-interrupt/kernel/utils.S | 20 + part14-spi-ethernet-interrupt/lib/io.c | 199 +++ part14-spi-ethernet-interrupt/lib/mb.c | 39 + part14-spi-ethernet-interrupt/lib/multicore.c | 44 + part14-spi-ethernet-interrupt/lib/spi.c | 99 ++ part14-spi-ethernet-interrupt/net/enc28j60.c | 1450 ++++++++++++++++ part14-spi-ethernet-interrupt/net/enc28j60.h | 816 +++++++++ part14-spi-ethernet-interrupt/net/encspi.c | 21 + .../Makefile | 26 + .../README.md | 96 ++ .../boot/boot.S | 114 ++ .../boot/link.ld | 35 + .../boot/sysregs.h | 44 + .../config.txt | 53 + .../images/15-tcpip-webserver-browser.png | Bin 0 -> 531734 bytes .../images/15-tcpip-webserver-pinging.jpg | Bin 0 -> 50969 bytes .../include/fb.h | 14 + .../include/io.h | 21 + .../include/mb.h | 34 + .../include/multicore.h | 11 + .../include/spi.h | 5 + .../include/terminal.h | 253 +++ .../kernel/irq.c | 27 + .../kernel/irqentry.S | 160 ++ .../kernel/kernel.c | 244 +++ .../kernel/kernel.h | 50 + .../kernel/utils.S | 20 + .../lib/fb.c | 260 +++ .../lib/io.c | 229 +++ .../lib/mb.c | 39 + .../lib/multicore.c | 44 + .../lib/spi.c | 100 ++ .../net/enc28j60.c | 1453 ++++++++++++++++ .../net/enc28j60.h | 811 +++++++++ .../net/encspi.c | 21 + .../tcpip/ip_arp_udp_tcp.c | 1528 +++++++++++++++++ .../tcpip/ip_arp_udp_tcp.h | 207 +++ .../tcpip/ip_config.h | 53 + .../tcpip/net.h | 133 ++ part2-building/Makefile | 12 +- part2-building/Makefile.gcc | 19 - part3-helloworld/Makefile | 17 +- part3-helloworld/Makefile.gcc | 19 - part3-helloworld/config.txt | 46 + part4-miniuart/Makefile | 17 +- part4-miniuart/Makefile.gcc | 19 - part4-miniuart/config.txt | 46 + part5-framebuffer/Makefile | 12 +- part5-framebuffer/Makefile.gcc | 19 - part6-breakout/Makefile | 12 +- part6-breakout/Makefile.gcc | 19 - 94 files changed, 11810 insertions(+), 171 deletions(-) create mode 100644 .gitignore create mode 100644 config.txt delete mode 100644 part10-multicore/Makefile.gcc create mode 100644 part11-breakout-smp/Makefile.gcc rename part13-interrupts/Makefile.gcc => part13a-gpio-interrupts/Makefile (100%) create mode 100644 part13a-gpio-interrupts/README.md create mode 100644 part13a-gpio-interrupts/boot/boot.S create mode 100644 part13a-gpio-interrupts/boot/link.ld create mode 100644 part13a-gpio-interrupts/boot/sysregs.h create mode 100755 part13a-gpio-interrupts/images/13-interrupts-running.jpg create mode 100644 part13a-gpio-interrupts/include/fb.h create mode 100644 part13a-gpio-interrupts/include/io.h create mode 100644 part13a-gpio-interrupts/include/mb.h create mode 100644 part13a-gpio-interrupts/include/multicore.h create mode 100644 part13a-gpio-interrupts/include/terminal.h create mode 100644 part13a-gpio-interrupts/kernel/irq.c create mode 100644 part13a-gpio-interrupts/kernel/irqentry.S create mode 100644 part13a-gpio-interrupts/kernel/kernel.c create mode 100644 part13a-gpio-interrupts/kernel/kernel.h create mode 100644 part13a-gpio-interrupts/kernel/utils.S create mode 100644 part13a-gpio-interrupts/lib/fb.c create mode 100644 part13a-gpio-interrupts/lib/io.c create mode 100644 part13a-gpio-interrupts/lib/mb.c create mode 100644 part13a-gpio-interrupts/lib/multicore.c create mode 100644 part14-spi-ethernet-interrupt/Makefile create mode 100644 part14-spi-ethernet-interrupt/README.md create mode 100644 part14-spi-ethernet-interrupt/boot/boot.S create mode 100644 part14-spi-ethernet-interrupt/boot/link.ld create mode 100644 part14-spi-ethernet-interrupt/boot/sysregs.h create mode 100644 part14-spi-ethernet-interrupt/config.txt create mode 100644 part14-spi-ethernet-interrupt/images/14-spi-ethernet-arp.jpg create mode 100644 part14-spi-ethernet-interrupt/images/14-spi-ethernet-photo.jpg create mode 100644 part14-spi-ethernet-interrupt/include/io.h create mode 100644 part14-spi-ethernet-interrupt/include/multicore.h create mode 100644 part14-spi-ethernet-interrupt/include/spi.h create mode 100644 part14-spi-ethernet-interrupt/kernel/arp.c create mode 100644 part14-spi-ethernet-interrupt/kernel/irq.c create mode 100644 part14-spi-ethernet-interrupt/kernel/irqentry.S create mode 100644 part14-spi-ethernet-interrupt/kernel/kernel.c create mode 100644 part14-spi-ethernet-interrupt/kernel/kernel.h create mode 100644 part14-spi-ethernet-interrupt/kernel/utils.S create mode 100644 part14-spi-ethernet-interrupt/lib/io.c create mode 100644 part14-spi-ethernet-interrupt/lib/mb.c create mode 100644 part14-spi-ethernet-interrupt/lib/multicore.c create mode 100644 part14-spi-ethernet-interrupt/lib/spi.c create mode 100644 part14-spi-ethernet-interrupt/net/enc28j60.c create mode 100644 part14-spi-ethernet-interrupt/net/enc28j60.h create mode 100644 part14-spi-ethernet-interrupt/net/encspi.c create mode 100644 part15a-tcpip-webserver-gpio-interrupt/Makefile create mode 100644 part15a-tcpip-webserver-gpio-interrupt/README.md create mode 100644 part15a-tcpip-webserver-gpio-interrupt/boot/boot.S create mode 100644 part15a-tcpip-webserver-gpio-interrupt/boot/link.ld create mode 100644 part15a-tcpip-webserver-gpio-interrupt/boot/sysregs.h create mode 100644 part15a-tcpip-webserver-gpio-interrupt/config.txt create mode 100644 part15a-tcpip-webserver-gpio-interrupt/images/15-tcpip-webserver-browser.png create mode 100755 part15a-tcpip-webserver-gpio-interrupt/images/15-tcpip-webserver-pinging.jpg create mode 100644 part15a-tcpip-webserver-gpio-interrupt/include/fb.h create mode 100644 part15a-tcpip-webserver-gpio-interrupt/include/io.h create mode 100644 part15a-tcpip-webserver-gpio-interrupt/include/mb.h create mode 100644 part15a-tcpip-webserver-gpio-interrupt/include/multicore.h create mode 100644 part15a-tcpip-webserver-gpio-interrupt/include/spi.h create mode 100644 part15a-tcpip-webserver-gpio-interrupt/include/terminal.h create mode 100644 part15a-tcpip-webserver-gpio-interrupt/kernel/irq.c create mode 100644 part15a-tcpip-webserver-gpio-interrupt/kernel/irqentry.S create mode 100644 part15a-tcpip-webserver-gpio-interrupt/kernel/kernel.c create mode 100644 part15a-tcpip-webserver-gpio-interrupt/kernel/kernel.h create mode 100644 part15a-tcpip-webserver-gpio-interrupt/kernel/utils.S create mode 100644 part15a-tcpip-webserver-gpio-interrupt/lib/fb.c create mode 100644 part15a-tcpip-webserver-gpio-interrupt/lib/io.c create mode 100644 part15a-tcpip-webserver-gpio-interrupt/lib/mb.c create mode 100644 part15a-tcpip-webserver-gpio-interrupt/lib/multicore.c create mode 100644 part15a-tcpip-webserver-gpio-interrupt/lib/spi.c create mode 100644 part15a-tcpip-webserver-gpio-interrupt/net/enc28j60.c create mode 100644 part15a-tcpip-webserver-gpio-interrupt/net/enc28j60.h create mode 100644 part15a-tcpip-webserver-gpio-interrupt/net/encspi.c create mode 100644 part15a-tcpip-webserver-gpio-interrupt/tcpip/ip_arp_udp_tcp.c create mode 100644 part15a-tcpip-webserver-gpio-interrupt/tcpip/ip_arp_udp_tcp.h create mode 100644 part15a-tcpip-webserver-gpio-interrupt/tcpip/ip_config.h create mode 100644 part15a-tcpip-webserver-gpio-interrupt/tcpip/net.h delete mode 100644 part2-building/Makefile.gcc delete mode 100644 part3-helloworld/Makefile.gcc create mode 100644 part3-helloworld/config.txt delete mode 100644 part4-miniuart/Makefile.gcc create mode 100644 part4-miniuart/config.txt delete mode 100644 part5-framebuffer/Makefile.gcc delete mode 100644 part6-breakout/Makefile.gcc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5680696 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.o +*.elf +*.img + diff --git a/config.txt b/config.txt new file mode 100644 index 0000000..41944de --- /dev/null +++ b/config.txt @@ -0,0 +1,53 @@ +# For more options and information see +# http://rptl.io/configtxt +# Some settings may impact device functionality. See link above for details + +# Uncomment some or all of these to enable the optional hardware interfaces +#dtparam=i2c_arm=on +#dtparam=i2s=on +#dtparam=spi=on + +# Enable audio (loads snd_bcm2835) +dtparam=audio=on + +# Additional overlays and parameters are documented +# /boot/firmware/overlays/README + +# Automatically load overlays for detected cameras +camera_auto_detect=1 + +# Automatically load overlays for detected DSI displays +display_auto_detect=1 + +# Automatically load initramfs files, if found +auto_initramfs=1 + +# Enable DRM VC4 V3D driver +dtoverlay=vc4-kms-v3d +max_framebuffers=2 + +# Don't have the firmware create an initial video= setting in cmdline.txt. +# Use the kernel's default instead. +disable_fw_kms_setup=1 + +# Run in 64-bit mode +arm_64bit=1 + +# Disable compensation for displays with overscan +disable_overscan=1 + +# Run as fast as firmware / board allows +arm_boost=1 + +[cm4] +# Enable host mode on the 2711 built-in XHCI USB controller. +# This line should be removed if the legacy DWC2 controller is required +# (e.g. for USB device mode) or if USB support is not required. +otg_mode=1 + +[all] +kernel_old=1 +disable_commandline_tags=1 +core_freq_min=500 +hdmi_group=1 +hdmi_mode=16 diff --git a/part10-multicore/Makefile b/part10-multicore/Makefile index 485538a..9fe0560 100644 --- a/part10-multicore/Makefile +++ b/part10-multicore/Makefile @@ -1,22 +1,22 @@ CFILES = $(wildcard *.c) OFILES = $(CFILES:.c=.o) -LLVMPATH = /opt/homebrew/opt/llvm/bin -CLANGFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd +GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin all: clean kernel8.img boot.o: boot.S - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c boot.S -o boot.o + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o audio.o : audio.bin - $(LLVMPATH)/llvm-objcopy -I binary -O elf64-littleaarch64 -B aarch64 $< $@ + $(GCCPATH)/aarch64-none-elf-objcopy -I binary -O elf64-littleaarch64 -B aarch64 $< $@ %.o: %.c - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c $< -o $@ + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ kernel8.img: boot.o $(OFILES) audio.o - $(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot.o $(OFILES) audio.o -T link.ld -o kernel8.elf - $(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img + $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) audio.o -T link.ld -o kernel8.elf + $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img clean: /bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true diff --git a/part10-multicore/Makefile.gcc b/part10-multicore/Makefile.gcc deleted file mode 100644 index 9fe0560..0000000 --- a/part10-multicore/Makefile.gcc +++ /dev/null @@ -1,22 +0,0 @@ -CFILES = $(wildcard *.c) -OFILES = $(CFILES:.c=.o) -GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin - -all: clean kernel8.img - -boot.o: boot.S - $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o - -audio.o : audio.bin - $(GCCPATH)/aarch64-none-elf-objcopy -I binary -O elf64-littleaarch64 -B aarch64 $< $@ - -%.o: %.c - $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ - -kernel8.img: boot.o $(OFILES) audio.o - $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) audio.o -T link.ld -o kernel8.elf - $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img - -clean: - /bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true diff --git a/part11-breakout-smp/Makefile b/part11-breakout-smp/Makefile index a53ba5c..9c0526f 100644 --- a/part11-breakout-smp/Makefile +++ b/part11-breakout-smp/Makefile @@ -1,25 +1,25 @@ CFILES = $(wildcard *.c lib/*.c) OFILES = $(CFILES:.c=.o) -LLVMPATH = /opt/homebrew/opt/llvm/bin -CLANGFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd +GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib +GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin + all: clean kernel8.img boot/boot.o: boot/boot.S - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c $< -o $@ + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot/boot.S -o boot/boot.o bin/BCM4345C0.o : bin/BCM4345C0.hcd - $(LLVMPATH)/llvm-objcopy -I binary -O elf64-littleaarch64 -B aarch64 $< $@ - + $(GCCPATH)/aarch64-none-elf-objcopy -I binary -O elf64-littleaarch64 -B aarch64 $< $@ + bin/audio.o : bin/audio.bin - $(LLVMPATH)/llvm-objcopy -I binary -O elf64-littleaarch64 -B aarch64 $< $@ + $(GCCPATH)/aarch64-none-elf-objcopy -I binary -O elf64-littleaarch64 -B aarch64 $< $@ %.o: %.c - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c $< -o $@ + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ kernel8.img: boot/boot.o $(OFILES) bin/BCM4345C0.o bin/audio.o - $(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot/boot.o $(OFILES) bin/BCM4345C0.o bin/audio.o -T boot/link.ld -o kernel8.elf - $(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img - + $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot/boot.o $(OFILES) bin/BCM4345C0.o bin/audio.o -T boot/link.ld -o kernel8.elf + $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img clean: - /bin/rm kernel8.elf *.o bin/*.o boot/*.o lib/*.o *.img > /dev/null 2> /dev/null || true + /bin/rm kernel8.elf *.o bin/*.o boot/*.o *.img > /dev/null 2> /dev/null || true diff --git a/part11-breakout-smp/Makefile.gcc b/part11-breakout-smp/Makefile.gcc new file mode 100644 index 0000000..9c0526f --- /dev/null +++ b/part11-breakout-smp/Makefile.gcc @@ -0,0 +1,25 @@ +CFILES = $(wildcard *.c lib/*.c) +OFILES = $(CFILES:.c=.o) +GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib +GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin + + +all: clean kernel8.img + +boot/boot.o: boot/boot.S + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot/boot.S -o boot/boot.o + +bin/BCM4345C0.o : bin/BCM4345C0.hcd + $(GCCPATH)/aarch64-none-elf-objcopy -I binary -O elf64-littleaarch64 -B aarch64 $< $@ + +bin/audio.o : bin/audio.bin + $(GCCPATH)/aarch64-none-elf-objcopy -I binary -O elf64-littleaarch64 -B aarch64 $< $@ + +%.o: %.c + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ + +kernel8.img: boot/boot.o $(OFILES) bin/BCM4345C0.o bin/audio.o + $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot/boot.o $(OFILES) bin/BCM4345C0.o bin/audio.o -T boot/link.ld -o kernel8.elf + $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img +clean: + /bin/rm kernel8.elf *.o bin/*.o boot/*.o *.img > /dev/null 2> /dev/null || true diff --git a/part13-interrupts/Makefile b/part13-interrupts/Makefile index 84c8539..fa40d98 100644 --- a/part13-interrupts/Makefile +++ b/part13-interrupts/Makefile @@ -1,20 +1,20 @@ CFILES = $(wildcard *.c lib/*.c kernel/*.c) SFILES = $(wildcard boot/*.S lib/*.S kernel/*.S) OFILES = $(CFILES:.c=.o) $(SFILES:.S=.o) -LLVMPATH = /opt/homebrew/opt/llvm/bin -CLANGFLAGS = -Wall -O2 -ffreestanding -nostdlib -mcpu=cortex-a72+nosimd +GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin all: clean kernel8.img %.o: %.c - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c $< -o $@ + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ %.o: %.S - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c $< -o $@ + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ kernel8.img: $(OFILES) - $(LLVMPATH)/ld.lld -m aarch64elf -nostdlib $(OFILES) -T boot/link.ld -o kernel8.elf - $(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img + $(GCCPATH)/aarch64-none-elf-ld -nostdlib $(OFILES) -T boot/link.ld -o kernel8.elf + $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img clean: /bin/rm kernel8.elf */*.o *.img > /dev/null 2> /dev/null || true diff --git a/part13-interrupts/Makefile.gcc b/part13a-gpio-interrupts/Makefile similarity index 100% rename from part13-interrupts/Makefile.gcc rename to part13a-gpio-interrupts/Makefile diff --git a/part13a-gpio-interrupts/README.md b/part13a-gpio-interrupts/README.md new file mode 100644 index 0000000..4814ce3 --- /dev/null +++ b/part13a-gpio-interrupts/README.md @@ -0,0 +1,164 @@ +Writing a "bare metal" operating system for Raspberry Pi 4 (Part 13) +==================================================================== + +[< Go back to part12-wgt](../part12-wgt) + +What are interrupts? +-------------------- +If you've spent any time looking at the Bluetooth code in these tutorials, you'll notice we're always "polling" for updates. In fact, in _part11-breakout-smp_ we tie up an entire core just waiting around for something to happen. This clearly isn't the best use of CPU time. Fortunately, the world solved that problem for us years ago with _interrupts_. + +Ideally, we want to tell a piece of hardware to do something and have it simply notify us when the work is complete so we can move on with our lives in the meantime. These notifications are known as _interrupts_ because they disrupt normal program execution and force the CPU to immediately run an _interrupt handler_. + +The simplest device that interrupts +----------------------------------- +One useful piece of built-in hardware is a system timer, which can be programmed to interrupt at regular intervals e.g. every second. You'll need this if you want to schedule multiple processes to run on a single core e.g. using the principle of time slicing. + +For now, however, we're simply going to learn how to program the timer and respond to its interrupts. + +The codebase +------------ +Let me quickly explain what you're looking at in the _part13-interrupts_ code: + + * _boot/_ : the same _boot_ code directory from _part12-wgt_ + * _include/_ : some useful headers copied directly from _part11-multicore_ + * _lib/_ : some useful libraries copied directly from _part11-multicore_ + * _kernel/_ : the only new code we need to concern ourselves with in this tutorial + +Please note: I have also done some work to tidy up the _Makefile_ and respect this directory structure, but nothing to write home about! + +The new code +------------ +You'll recognise a lot of _kernel.c_ from _part10-multicore_, except instead of showing four cores at work and playing sound, we're now only using core 0 & 1 and, in addition, making use of two timer interrupts to show four progress bars. So, the `main()` routine kicks off core 1, sets up the timers, and then finally kicks off core 0's workload. + +The timers are set up using these calls: + +```c +irq_init_vectors(); +enable_interrupt_controller(); +irq_barrier(); +irq_enable(); +timer_init(); +``` + +Initialising the exception vector table +--------------------------------------- +In fact, interrupts are a more specific kind of _exception_ - something that, when "raised", needs the immediate attention of the processor. A perfect example of when an exception might occur is when bad code tries to do something "impossible" e.g. divide by zero. The CPU needs to know how to respond when/if this happens i.e. jump to an address of some code to run which handles this exception gracefully e.g. by printing an error to the screen. These addresses are stored in an _exception vector table_. + +_irqentry.S_ sets up a list called `vectors` which contains individual _vector entries_. These vector entries are simply jump instructions to handler code. + +The CPU is told where this exception vector table is stored during the `irq_init_vectors()` call from `main()` in _kernel.c_. You'll find this code in _utils.S_: + +```c +irq_init_vectors: + adr x0, vectors + msr vbar_el1, x0 + ret +``` + +It simply sets the Vector Base Address Register to the address of the `vectors` list. + +Interrupt handling +------------------ +The only vector entry we really care about for the purposes of this tutorial is `handle_el1_irq`. This is a generic handler for any interrupt request (IRQ) that comes in at EL1 (kernel execution level). + +If you do want a deeper understanding, I highly recommend reading s-matyukevich's work [here](https://github.com/s-matyukevich/raspberry-pi-os/blob/master/docs/lesson03/rpi-os.md). + +```c +handle_el1_irq: + kernel_entry + bl handle_irq + kernel_exit +``` + +Put simply, `kernel_entry` saves the register state before the interrupt handler runs, and `kernel_exit` restores this register state before we return. As we're _interrupting_ normal program execution, we want to be sure that we put things back to how they were so that nothing unpredictable happens as our kernel code resumes. + +In the middle we simply call a function called `handle_irq()` which is written in the C language in _irq.c_. Its purpose is to look more closely at the interrupt request, figure out what device was responsible for generating an interrupt, and run the right sub-handler: + +```c +void handle_irq() { + unsigned int irq = REGS_IRQ->irq0_pending_0; + + while(irq & (SYS_TIMER_IRQ_1 | SYS_TIMER_IRQ_3)) { + if (irq & SYS_TIMER_IRQ_1) { + irq &= ~SYS_TIMER_IRQ_1; + + handle_timer_1(); + } + + if (irq & SYS_TIMER_IRQ_3) { + irq &= ~SYS_TIMER_IRQ_3; + + handle_timer_3(); + } + } +} +``` + +As you can see, we're handling two different timer interrupts in this code. In fact, `handle_timer_1()` and `handle_timer_3()` are implemented in _kernel.c_ and serve to demonstrate that the timer has fired by incrementing a progress counter and updating a graphical representation of its value. Timer 3 is configured to progress at 4 times the speed of Timer 1. + +The interrupt controller +------------------------ +The interrupt controller is the hardware responsible for telling the CPU about interrupts as they occur. We can use the interrupt controller to act as a gatekeeper and allow/block (or enable/disable) interrupts. We can also use it to figure out which device generated the interrupt, as we did in `handle_irq()`. + +In `enable_interrupt_controller()`, called from `main()` in _kernel.c_, we allow the Timer 1 and Timer 3 interrupts through and in `disable_interrupt_controller()` we block all interrupts: + +```c +void enable_interrupt_controller() { + REGS_IRQ->irq0_enable_0 = SYS_TIMER_IRQ_1 | SYS_TIMER_IRQ_3; +} + +void disable_interrupt_controller() { + REGS_IRQ->irq0_enable_0 = 0; +} +``` + +Masking/unmasking interrupts +---------------------------- +To begin receiving interrupts, we need to take one more step: unmasking all types of interrupts. + +Masking is a technique used by the CPU to prevent a particular piece of code from being stopped in its tracks by an interrupt. It's used to protect important code that *must* complete. Imagine what would happen if our `kernel_entry` code (that saves register state) was interrupted halfway through! In this case, the register state would be overwritten and lost. This is why the CPU automatically masks all interrupts when an exception handler is executed. + +The `irq_enable` and `irq_disable` functions in _utils.S_ are responsible for masking and unmasking interrupts. + +They are helped by the `irq_barrier` function which ensures that the `enable_interrupt_controller()` call properly finishes before the `irq_enable()` call is made: + +```c +.globl irq_enable +irq_enable: + msr daifclr, #2 + ret + +.globl irq_disable +irq_disable: + msr daifset, #2 + ret + +.globl irq_barrier +irq_barrier: + dsb sy + ret +``` + +As soon as `irq_enable()` is called from `main()` in _kernel.c_, the timer handler is run when the timer interrupt fires. Well, sort of...! + +Initialising the system timer +----------------------------- +We still need to initialise the timer. + +The RPi4's system timer couldn't be simpler. It has a counter which increases by 1 with each clock tick. It then has 4 interrupt lines (0 & 2 reserved for the GPU, 1 & 3 used by us in this tutorial!) with 4 corresponding compare registers. When the value of the counter becomes equal to a value in one of the compare registers, the corresponding interrupt is fired. + +So before we receive any timer interrupts, we must also set the right compare registers to have a non-zero value. The `timer_init()` function (called from `main()` in _kernel.c_) gets the current timer value, adds the timer interval and sets the compare register to that total, so when the right number of clock ticks pass, the interrupt fires. It does this for both Timer 1 and Timer 3, setting Timer 3 to run 4 times as fast. + +Handling the timer interrupts +----------------------------- +This is the simplest bit. + +We update the compare register so the next interrupt will be generated after the same interval again. Importantly we then acknowledge the interrupt by setting the right bit of the Control Status register. + +Then we update the screen to show our progress! + +_And... hey presto! You're handling two system timer interrupts like a pro!_ + +![Timers firing on all cylinders on the Raspberry Pi 4](images/13-interrupts-running.jpg) + +[Go to part14-spi-ethernet >](../part14-spi-ethernet) diff --git a/part13a-gpio-interrupts/boot/boot.S b/part13a-gpio-interrupts/boot/boot.S new file mode 100644 index 0000000..f644aee --- /dev/null +++ b/part13a-gpio-interrupts/boot/boot.S @@ -0,0 +1,114 @@ +#include "sysregs.h" + +#define LOCAL_CONTROL 0xff800000 +#define LOCAL_PRESCALER 0xff800008 +#define OSC_FREQ 54000000 +#define MAIN_STACK 0x400000 + +.section ".text.boot" // Make sure the linker puts this at the start of the kernel image + +.global _start // Execution starts here + +_start: + ldr x0, =LOCAL_CONTROL // Sort out the timer + str wzr, [x0] + mov w1, 0x80000000 + str w1, [x0, #(LOCAL_PRESCALER - LOCAL_CONTROL)] + + ldr x0, =OSC_FREQ + msr cntfrq_el0, x0 + msr cntvoff_el2, xzr + + // Check processor ID is zero (executing on main core), else hang + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, 2f + + // We're not on the main core, so hang in an infinite wait loop + adr x5, spin_cpu0 +1: wfe + ldr x4, [x5, x1, lsl #3] + cbz x4, 1b + + ldr x2, =__stack_start // Get ourselves a fresh stack - location depends on CPU core asking + lsl x1, x1, #9 // Multiply core_number by 512 + add x3, x2, x1 // Add to the address + mov sp, x3 + + mov x0, #0 + mov x1, #0 + mov x2, #0 + mov x3, #0 + br x4 + b 1b +2: // We're on the main core! + // First enable the FPU + + mov x0, #0x33ff + msr cptr_el3, x0 // Disable coprocessor traps to EL3 + mov x0, #3 << 20 + msr cpacr_el1, x0 // Enable FP/SIMD at EL1 + + // Now get ready to switch from EL3 down to EL1 + + ldr x0, =SCTLR_VALUE_MMU_DISABLED + msr sctlr_el1, x0 + + ldr x0, =HCR_VALUE + msr hcr_el2, x0 + + ldr x0, =SCR_VALUE + msr scr_el3, x0 + + ldr x0, =SPSR_VALUE + msr spsr_el3, x0 + + adr x0, el1_entry + msr elr_el3, x0 + + eret +el1_entry: + // We're in EL1 + // Clean the BSS section + ldr x1, =__bss_start // Start address + ldr w2, =__bss_size // Size of the section +3: cbz w2, 4f // Quit loop if zero + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, 3b // Loop if non-zero + + // Set stack to start somewhere safe + mov sp, #MAIN_STACK + + // Jump to our main() routine in C (make sure it doesn't return) +4: bl main + // In case it does return, halt the master core too + b 1b + +.ltorg + +.org 0x110 +.globl spin_cpu0 +spin_cpu0: + .quad 0 + +.org 0x118 +.globl spin_cpu1 +spin_cpu1: + .quad 0 + +.org 0x120 +.globl spin_cpu2 +spin_cpu2: + .quad 0 + +.org 0x128 +.globl spin_cpu3 +spin_cpu3: + .quad 0 + +.globl get_el +get_el: + mrs x0, CurrentEL + lsr x0, x0, #2 + ret diff --git a/part13a-gpio-interrupts/boot/link.ld b/part13a-gpio-interrupts/boot/link.ld new file mode 100644 index 0000000..4e84390 --- /dev/null +++ b/part13a-gpio-interrupts/boot/link.ld @@ -0,0 +1,35 @@ +SECTIONS +{ + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + __bss_size = (__bss_end - __bss_start)>>3; + } + .cpu1Stack : + { + . = ALIGN(16); + __stack_start = .; + . = . + 512; + __cpu1_stack = .; + } + .cpu2Stack : + { + . = . + 512; + __cpu2_stack = .; + } + .cpu3Stack : + { + . = . + 512; + __cpu3_stack = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} diff --git a/part13a-gpio-interrupts/boot/sysregs.h b/part13a-gpio-interrupts/boot/sysregs.h new file mode 100644 index 0000000..385cd79 --- /dev/null +++ b/part13a-gpio-interrupts/boot/sysregs.h @@ -0,0 +1,44 @@ +#ifndef _SYSREGS_H +#define _SYSREGS_H + +// *************************************** +// SCTLR_EL1, System Control Register (EL1), Page 2654 of AArch64-Reference-Manual. +// *************************************** + +#define SCTLR_RESERVED (3 << 28) | (3 << 22) | (1 << 20) | (1 << 11) +#define SCTLR_EE_LITTLE_ENDIAN (0 << 25) +#define SCTLR_EOE_LITTLE_ENDIAN (0 << 24) +#define SCTLR_I_CACHE_DISABLED (0 << 12) +#define SCTLR_D_CACHE_DISABLED (0 << 2) +#define SCTLR_I_CACHE_ENABLED (1 << 12) +#define SCTLR_D_CACHE_ENABLED (1 << 2) +#define SCTLR_MMU_DISABLED (0 << 0) +#define SCTLR_MMU_ENABLED (1 << 0) + +#define SCTLR_VALUE_MMU_DISABLED (SCTLR_RESERVED | SCTLR_EE_LITTLE_ENDIAN | SCTLR_I_CACHE_ENABLED | SCTLR_D_CACHE_ENABLED | SCTLR_MMU_DISABLED) + +// *************************************** +// HCR_EL2, Hypervisor Configuration Register (EL2), Page 2487 of AArch64-Reference-Manual. +// *************************************** + +#define HCR_RW (1 << 31) +#define HCR_VALUE HCR_RW + +// *************************************** +// SCR_EL3, Secure Configuration Register (EL3), Page 2648 of AArch64-Reference-Manual. +// *************************************** + +#define SCR_RESERVED (3 << 4) +#define SCR_RW (1 << 10) +#define SCR_NS (1 << 0) +#define SCR_VALUE (SCR_RESERVED | SCR_RW | SCR_NS) + +// *************************************** +// SPSR_EL3, Saved Program Status Register (EL3) Page 389 of AArch64-Reference-Manual. +// *************************************** + +#define SPSR_MASK_ALL (7 << 6) +#define SPSR_EL1h (5 << 0) +#define SPSR_VALUE (SPSR_MASK_ALL | SPSR_EL1h) + +#endif diff --git a/part13a-gpio-interrupts/images/13-interrupts-running.jpg b/part13a-gpio-interrupts/images/13-interrupts-running.jpg new file mode 100755 index 0000000000000000000000000000000000000000..d92edba5fea3d541af4f36ae3c0d06394cf9449d GIT binary patch literal 70954 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

Z?jVUTVJ1N10qk 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 + { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00}, // U+003F (?) + { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00}, // U+0040 (@) + { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // U+0041 (A) + { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00}, // U+0042 (B) + { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00}, // U+0043 (C) + { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00}, // U+0044 (D) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00}, // U+0045 (E) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00}, // U+0046 (F) + { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00}, // U+0047 (G) + { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // U+0048 (H) + { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0049 (I) + { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00}, // U+004A (J) + { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00}, // U+004B (K) + { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00}, // U+004C (L) + { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00}, // U+004D (M) + { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00}, // U+004E (N) + { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00}, // U+004F (O) + { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00}, // U+0050 (P) + { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00}, // U+0051 (Q) + { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00}, // U+0052 (R) + { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00}, // U+0053 (S) + { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0054 (T) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00}, // U+0055 (U) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V) + { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // U+0057 (W) + { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00}, // U+0058 (X) + { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00}, // U+0059 (Y) + { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z) + { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00}, // U+005B ([) + { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00}, // U+005C (\) + { 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00}, // U+005D (]) + { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00}, // U+005E (^) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // U+005F (_) + { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0060 (`) + { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00}, // U+0061 (a) + { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00}, // U+0062 (b) + { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00}, // U+0063 (c) + { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00}, // U+0064 (d) + { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e) + { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00}, // U+0066 (f) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0067 (g) + { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00}, // U+0068 (h) + { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0069 (i) + { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E}, // U+006A (j) + { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00}, // U+006B (k) + { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+006C (l) + { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // U+006D (m) + { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00}, // U+006E (n) + { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+006F (o) + { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F}, // U+0070 (p) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78}, // U+0071 (q) + { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r) + { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00}, // U+0073 (s) + { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00}, // U+0074 (t) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00}, // U+0075 (u) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0076 (v) + { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00}, // U+0077 (w) + { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00}, // U+0078 (x) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0079 (y) + { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00}, // U+007A (z) + { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // U+007B ({) + { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, // U+007C (|) + { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // U+007D (}) + { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007E (~) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007F + { 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x18, 0x30, 0x1E}, // U+00C7 (C cedille) + { 0x00, 0x33, 0x00, 0x33, 0x33, 0x33, 0x7E, 0x00}, // U+00FC (u umlaut) + { 0x38, 0x00, 0x1E, 0x33, 0x3F, 0x03, 0x1E, 0x00}, // U+00E9 (e aigu) + { 0x7E, 0xC3, 0x3C, 0x60, 0x7C, 0x66, 0xFC, 0x00}, // U+00E2 (a circumflex) + { 0x33, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00}, // U+00E4 (a umlaut) + { 0x07, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00}, // U+00E0 (a grave) + { 0x0C, 0x0C, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00}, // U+00E5 (a ring) + { 0x00, 0x00, 0x1E, 0x03, 0x03, 0x1E, 0x30, 0x1C}, // U+00E7 (c cedille) + { 0x7E, 0xC3, 0x3C, 0x66, 0x7E, 0x06, 0x3C, 0x00}, // U+00EA (e circumflex) + { 0x33, 0x00, 0x1E, 0x33, 0x3F, 0x03, 0x1E, 0x00}, // U+00EB (e umlaut) + { 0x07, 0x00, 0x1E, 0x33, 0x3F, 0x03, 0x1E, 0x00}, // U+00E8 (e grave) + { 0x33, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+00EF (i umlaut) + { 0x3E, 0x63, 0x1C, 0x18, 0x18, 0x18, 0x3C, 0x00}, // U+00EE (i circumflex) + { 0x07, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+00EC (i grave) + { 0x63, 0x1C, 0x36, 0x63, 0x7F, 0x63, 0x63, 0x00}, // U+00C4 (A umlaut) + { 0x0C, 0x0C, 0x00, 0x1E, 0x33, 0x3F, 0x33, 0x00}, // U+00C5 (A ring) + { 0x07, 0x00, 0x3F, 0x06, 0x1E, 0x06, 0x3F, 0x00}, // U+00C8 (E grave) + { 0x00, 0x00, 0xFE, 0x30, 0xFE, 0x33, 0xFE, 0x00}, // U+00E6 (ae) + { 0x7C, 0x36, 0x33, 0x7F, 0x33, 0x33, 0x73, 0x00}, // U+00C6 (AE) + { 0x1E, 0x33, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+00F4 (o circumflex) + { 0x00, 0x33, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+00F6 (o umlaut) + { 0x00, 0x07, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+00F2 (o grave) + { 0x1E, 0x33, 0x00, 0x33, 0x33, 0x33, 0x7E, 0x00}, // U+00FB (u circumflex) + { 0x00, 0x07, 0x00, 0x33, 0x33, 0x33, 0x7E, 0x00}, // U+00F9 (u grave) + { 0x00, 0x33, 0x00, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+00FF (y umlaut) + { 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00}, // U+00D6 (O umlaut) + { 0x33, 0x00, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+00DC (U umlaut) + { 0x18, 0x18, 0x7E, 0x03, 0x03, 0x7E, 0x18, 0x18}, // U+00A2 (dollarcents) + { 0x1C, 0x36, 0x26, 0x0F, 0x06, 0x67, 0x3F, 0x00}, // U+00A3 (pound sterling) + { 0x33, 0x33, 0x1E, 0x3F, 0x0C, 0x3F, 0x0C, 0x0C}, // U+00A5 (yen) + { 0x7C, 0xC6, 0x1C, 0x36, 0x36, 0x1C, 0x33, 0x1E}, // U+00A7 (paragraph) + { 0x70, 0xD8, 0x18, 0x3C, 0x18, 0x18, 0x1B, 0x0E}, // U+0192 (dutch florijn) + { 0x38, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00}, // U+00E1 (a aigu) + { 0x1C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+00ED (i augu) + { 0x00, 0x38, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+00F3 (o aigu) + { 0x00, 0x38, 0x00, 0x33, 0x33, 0x33, 0x7E, 0x00}, // U+00FA (u aigu) + { 0x00, 0x1F, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x00}, // U+00F1 (n ~) + { 0x3F, 0x00, 0x33, 0x37, 0x3F, 0x3B, 0x33, 0x00}, // U+00D1 (N ~) + { 0x3C, 0x36, 0x36, 0x7C, 0x00, 0x00, 0x00, 0x00}, // U+00AA (superscript a) + { 0x1C, 0x36, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00}, // U+00BA (superscript 0) + { 0x0C, 0x00, 0x0C, 0x06, 0x03, 0x33, 0x1E, 0x00}, // U+00BF (inverted ?) + { 0x00, 0x00, 0x00, 0x3F, 0x03, 0x03, 0x00, 0x00}, // U+2310 (gun pointing right) + { 0x00, 0x00, 0x00, 0x3F, 0x30, 0x30, 0x00, 0x00}, // U+00AC (gun pointing left) + { 0xC3, 0x63, 0x33, 0x7B, 0xCC, 0x66, 0x33, 0xF0}, // U+00BD (1/2) + { 0xC3, 0x63, 0x33, 0xBD, 0xEC, 0xF6, 0xF3, 0x03}, // U+00BC (1/4) + { 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00}, // U+00A1 (inverted !) + { 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00}, // U+00AB (<<) + { 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00}, // U+00BB (>>) + { 0x55, 0x00, 0xAA, 0x00, 0x55, 0x00, 0xAA, 0x00}, // U+2591 (25% solid) + { 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA}, // U+2592 (50% solid) + { 0xFF, 0xAA, 0xFF, 0x55, 0xFF, 0xAA, 0xFF, 0x55}, // U+2593 (75% solid) + { 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, // U+2502 (thin vertical) + { 0x08, 0x08, 0x08, 0x08, 0x0f, 0x08, 0x08, 0x08}, // U+2524 (down L, left L, up L) + { 0x08, 0x08, 0x08, 0x0F, 0x08, 0x0F, 0x08, 0x08}, // U+2561 (up L, down L, left D) + { 0x14, 0x14, 0x14, 0x14, 0x17, 0x14, 0x14, 0x14}, // U+2562 (up D, down D, left L) + { 0x00, 0x00, 0x00, 0x00, 0x1F, 0x14, 0x14, 0x14}, // U+2556 (down D, left L) + { 0x00, 0x00, 0x00, 0x0F, 0x08, 0x0F, 0x08, 0x08}, // U+2555 (down L, left D) + { 0x14, 0x14, 0x14, 0x17, 0x10, 0x17, 0x14, 0x14}, // U+2563 (up D, down D, left D) + { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14}, // U+2551 (double vertical) + { 0x00, 0x00, 0x00, 0x1F, 0x10, 0x17, 0x14, 0x14}, // U+2557 (down D, left D) + { 0x14, 0x14, 0x14, 0x17, 0x10, 0x1F, 0x00, 0x00}, // U+255D (up D, left D) + { 0x14, 0x14, 0x14, 0x14, 0x1F, 0x00, 0x00, 0x00}, // U+255C (up D, left L) + { 0x08, 0x08, 0x08, 0x0F, 0x08, 0x0F, 0x00, 0x00}, // U+255B (up L, left D) + { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x08, 0x08, 0x08}, // U+2510 (down L, left L) + { 0x08, 0x08, 0x08, 0x08, 0xf8, 0x00, 0x00, 0x00}, // U+2514 (up L, right L) + { 0x08, 0x08, 0x08, 0x08, 0xff, 0x00, 0x00, 0x00}, // U+2534 (up L, right L, left L) + { 0x00, 0x00, 0x00, 0x00, 0xff, 0x08, 0x08, 0x08}, // U+252C (down L, right L, left L) + { 0x08, 0x08, 0x08, 0x08, 0xf8, 0x08, 0x08, 0x08}, // U+251C (down L, right L, up L) + { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00}, // U+2500 (thin horizontal) + { 0x08, 0x08, 0x08, 0x08, 0xff, 0x08, 0x08, 0x08}, // U+253C (up L, right L, left L, down L) + { 0x08, 0x08, 0x08, 0xF8, 0x08, 0xF8, 0x08, 0x08}, // U+255E (up L, down L, right D) + { 0x14, 0x14, 0x14, 0x14, 0xF4, 0x14, 0x14, 0x14}, // U+255F (up D, down D, right L) + { 0x14, 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x00, 0x00}, // U+255A (up D, right D) + { 0x00, 0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14}, // U+2554 (down D, right D) + { 0x14, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, 0x00}, // U+2569 (left D, right D, up D) + { 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14}, // U+2566 (left D, right D, down D) + { 0x14, 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x14, 0x14}, // U+2560 (up D, down D, right D) + { 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00}, // U+2550 (double horizontal) + { 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14}, // U+256C (left D, right D, down D, up D) + { 0x08, 0x08, 0x08, 0xFF, 0x00, 0xFF, 0x00, 0x00}, // U+2567 (left D, right D, up L) + { 0x14, 0x14, 0x14, 0x14, 0xFF, 0x00, 0x00, 0x00}, // U+2568 (left L, right L, up D) + { 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x08, 0x08}, // U+2564 (left D, right D, down L) + { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x14, 0x14, 0x14}, // U+2565 (left L, right L, down D) + { 0x14, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x00, 0x00}, // U+2559 (up D, right L) + { 0x08, 0x08, 0x08, 0xF8, 0x08, 0xF8, 0x00, 0x00}, // U+2558 (up L, right D) + { 0x00, 0x00, 0x00, 0xF8, 0x08, 0xF8, 0x08, 0x08}, // U+2552 (down L, right D) + { 0x00, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x14, 0x14}, // U+2553 (down D, right L) + { 0x14, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14}, // U+256B (left L, right L, down D, up D) + { 0x08, 0x08, 0x08, 0xFF, 0x08, 0xFF, 0x08, 0x08}, // U+256A (left D, right D, down L, up L) + { 0x08, 0x08, 0x08, 0x08, 0x0f, 0x00, 0x00, 0x00}, // U+2518 (up L, left L) + { 0x00, 0x00, 0x00, 0x00, 0xf8, 0x08, 0x08, 0x08}, // U+250C (down L, right L) + { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // U+2588 (solid) + { 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF}, // U+2584 (bottom half) + { 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F}, // U+258C (left half) + { 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0}, // U+2590 (right half) + { 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00}, // U+2580 (top half) +}; diff --git a/part13a-gpio-interrupts/kernel/irq.c b/part13a-gpio-interrupts/kernel/irq.c new file mode 100644 index 0000000..6cccb90 --- /dev/null +++ b/part13a-gpio-interrupts/kernel/irq.c @@ -0,0 +1,60 @@ +#include "kernel.h" + +// textdefinitionmap of invalid error-types +const char entry_error_messages[16][32] = { + "SYNC_INVALID_EL1t", + "IRQ_INVALID_EL1t", + "FIQ_INVALID_EL1t", + "ERROR_INVALID_EL1T", + + "SYNC_INVALID_EL1h", + "IRQ_INVALID_EL1h", + "FIQ_INVALID_EL1h", + "ERROR_INVALID_EL1h", + + "SYNC_INVALID_EL0_64", + "IRQ_INVALID_EL0_64", + "FIQ_INVALID_EL0_64", + "ERROR_INVALID_EL0_64", + + "SYNC_INVALID_EL0_32", + "IRQ_INVALID_EL0_32", + "FIQ_INVALID_EL0_32", + "ERROR_INVALID_EL0_32" +}; + +void show_invalid_entry_message(unsigned int type, unsigned long esr, unsigned long address) { + debugstr("ERROR CAUGHT: %s - %d, ESR: %X, Address: %X\n", + entry_error_messages[type], type, esr, address); +} + +void enable_interrupt_controller() { + REGS_IRQ->irq0_enable_0 = SYS_TIMER_IRQ_1 | SYS_TIMER_IRQ_3 | SPI_INT; +} + +void disable_interrupt_controller() { + REGS_IRQ->irq0_enable_0 = 0; +} + +void handle_irq() { + unsigned int irq = REGS_IRQ->irq0_pending_0; + + while(irq & (SYS_TIMER_IRQ_1 | SYS_TIMER_IRQ_3 | SPI_INT)) { + switch(irq) { + case (SYS_TIMER_IRQ_1): + irq &= ~SYS_TIMER_IRQ_1; + handle_timer_1(); + break; + case (SYS_TIMER_IRQ_3): + irq &= ~SYS_TIMER_IRQ_3; + handle_timer_3(); + break; + case(SPI_INT): + irq &= ~SPI_INT; + handle_spi(); + break; + default: + debugstr("Unknown pending irq: %x /r/n",irq); + } + } +} diff --git a/part13a-gpio-interrupts/kernel/irqentry.S b/part13a-gpio-interrupts/kernel/irqentry.S new file mode 100644 index 0000000..7aea7a0 --- /dev/null +++ b/part13a-gpio-interrupts/kernel/irqentry.S @@ -0,0 +1,156 @@ +//D1.10.2 of ARMv8 reference manual +#define SYNC_INVALID_EL1t 0 +#define IRQ_INVALID_EL1t 1 +#define FIQ_INVALID_EL1t 2 +#define ERROR_INVALID_EL1t 3 + +#define SYNC_INVALID_EL1h 4 +#define IRQ_INVALID_EL1h 5 +#define FIQ_INVALID_EL1h 6 +#define ERROR_INVALID_EL1h 7 + +#define SYNC_INVALID_EL0_64 8 +#define IRQ_INVALID_EL0_64 9 +#define FIQ_INVALID_EL0_64 10 +#define ERROR_INVALID_EL0_64 11 + +#define SYNC_INVALID_EL0_32 12 +#define IRQ_INVALID_EL0_32 13 +#define FIQ_INVALID_EL0_32 14 +#define ERROR_INVALID_EL0_32 15 + +//stack frame size +#define S_FRAME_SIZE 256 + +.macro kernel_entry + sub sp, sp, #S_FRAME_SIZE + stp x0, x1, [sp, #16 * 0] + stp x2, x3, [sp, #16 * 1] + stp x4, x5, [sp, #16 * 2] + stp x6, x7, [sp, #16 * 3] + stp x8, x9, [sp, #16 * 4] + stp x10, x11, [sp, #16 * 5] + stp x12, x13, [sp, #16 * 6] + stp x14, x15, [sp, #16 * 7] + stp x16, x17, [sp, #16 * 8] + stp x18, x19, [sp, #16 * 9] + stp x20, x21, [sp, #16 * 10] + stp x22, x23, [sp, #16 * 11] + stp x24, x25, [sp, #16 * 12] + stp x26, x27, [sp, #16 * 13] + stp x28, x29, [sp, #16 * 14] + str x30, [sp, #16 * 15] +.endm + +.macro kernel_exit + ldp x0, x1, [sp, #16 * 0] + ldp x2, x3, [sp, #16 * 1] + ldp x4, x5, [sp, #16 * 2] + ldp x6, x7, [sp, #16 * 3] + ldp x8, x9, [sp, #16 * 4] + ldp x10, x11, [sp, #16 * 5] + ldp x12, x13, [sp, #16 * 6] + ldp x14, x15, [sp, #16 * 7] + ldp x16, x17, [sp, #16 * 8] + ldp x18, x19, [sp, #16 * 9] + ldp x20, x21, [sp, #16 * 10] + ldp x22, x23, [sp, #16 * 11] + ldp x24, x25, [sp, #16 * 12] + ldp x26, x27, [sp, #16 * 13] + ldp x28, x29, [sp, #16 * 14] + ldr x30, [sp, #16 * 15] + add sp, sp, #S_FRAME_SIZE + eret +.endm + +.macro handle_invalid_entry type + kernel_entry + mov x0, #\type + mrs x1, esr_el1 + mrs x2, elr_el1 + bl show_invalid_entry_message // We could pass this to a function to print an error here + b err_hang +.endm + +.macro ventry label +.align 7 + b \label +.endm + +//Exception vectors table +.align 11 +.globl vectors +vectors: + ventry sync_invalid_el1t // Synchronous EL1t + ventry irq_invalid_el1t // IRQ EL1t + ventry fiq_invalid_el1t // FIQ EL1t + ventry error_invalid_el1t // Error EL1t + + ventry sync_invalid_el1h // Synchronous EL1h + ventry handle_el1_irq // IRQ EL1h + ventry fiq_invalid_el1h // FIQ EL1h + ventry error_invalid_el1h // Error EL1h + + ventry sync_invalid_el0_64 // Synchronous 64-bit EL0 + ventry irq_invalid_el0_64 // IRQ 64-bit EL0 + ventry fiq_invalid_el0_64 // FIQ 64-bit EL0 + ventry error_invalid_el0_64 // Error 64-bit EL0 + + ventry sync_invalid_el0_32 // Synchronous 32-bit EL0 + ventry irq_invalid_el0_32 // IRQ 32-bit EL0 + ventry fiq_invalid_el0_32 // FIQ 32-bit EL0 + ventry error_invalid_el0_32 // Error 32-bit EL0 + + +sync_invalid_el1t: + handle_invalid_entry SYNC_INVALID_EL1t + +irq_invalid_el1t: + handle_invalid_entry IRQ_INVALID_EL1t + +fiq_invalid_el1t: + handle_invalid_entry FIQ_INVALID_EL1t + +error_invalid_el1t: + handle_invalid_entry ERROR_INVALID_EL1t + +sync_invalid_el1h: + handle_invalid_entry SYNC_INVALID_EL1h + +fiq_invalid_el1h: + handle_invalid_entry FIQ_INVALID_EL1h + +error_invalid_el1h: + handle_invalid_entry ERROR_INVALID_EL1h + +sync_invalid_el0_64: + handle_invalid_entry SYNC_INVALID_EL0_64 + +irq_invalid_el0_64: + handle_invalid_entry IRQ_INVALID_EL0_64 + +fiq_invalid_el0_64: + handle_invalid_entry FIQ_INVALID_EL0_64 + +error_invalid_el0_64: + handle_invalid_entry ERROR_INVALID_EL0_64 + +sync_invalid_el0_32: + handle_invalid_entry SYNC_INVALID_EL0_32 + +irq_invalid_el0_32: + handle_invalid_entry IRQ_INVALID_EL0_32 + +fiq_invalid_el0_32: + handle_invalid_entry FIQ_INVALID_EL0_32 + +error_invalid_el0_32: + handle_invalid_entry ERROR_INVALID_EL0_32 + +handle_el1_irq: + kernel_entry + bl handle_irq + kernel_exit + +.globl err_hang +err_hang: b err_hang diff --git a/part13a-gpio-interrupts/kernel/kernel.c b/part13a-gpio-interrupts/kernel/kernel.c new file mode 100644 index 0000000..2a2d62c --- /dev/null +++ b/part13a-gpio-interrupts/kernel/kernel.c @@ -0,0 +1,152 @@ +#include "../include/fb.h" +#include "../include/io.h" +#include "../include/multicore.h" +#include "kernel.h" + +void initProgress(void) +{ + drawRect(0, 0, 301, 50, 0x0f, 0); + drawString(309, 21, "Core 0", 0x0f, 1); + + drawRect(0, 60, 301, 110, 0x0f, 0); + drawString(309, 81, "Core 1", 0x0f, 1); + + drawRect(0, 120, 301, 170, 0x0f, 0); + drawString(309, 141, "Timer 1", 0x0f, 1); + + drawRect(0, 180, 301, 230, 0x0f, 0); + drawString(309, 201, "Timer 3", 0x0f, 1); +} + +void drawProgress(unsigned int core, unsigned int val) { + unsigned char col = (core + 1) + ((core + 1) << 4); + + // val should be 0-100 + if (val == 0) drawRect(1, (60 * core) + 1, 300, (60 * core) + 49, 0x00, 1); + if (val > 0) drawRect(1, (60 * core) + 1, (val * 3), (60 * core) + 49, col, 1); +} + +void core0_main(void) +{ + unsigned int core0_val = 0; + + while (core0_val <= 100) { + wait_msec(0x100000); + drawProgress(0, core0_val); + core0_val++; + } + + debugstr("Core 0 done."); + debugcrlf(); + + irq_disable(); + disable_interrupt_controller(); + + while(1); +} + +void core1_main(void) +{ + unsigned int core1_val = 0; + + clear_core1(); // Only run once + + while (core1_val <= 100) { + wait_msec(0x3FFFF); + drawProgress(1, core1_val); + core1_val++; + } + + debugstr("Core 1 done."); + debugcrlf(); + + while(1); +} + +/* +// ISR for incoming packet + +debugstr("we are into isr now"); +// Re-enable Interrupts +ENC_IRQHandler(&handle); + + + +*/ +// TIMER FUNCTIONS + +const unsigned int timer1_int = CLOCKHZ; +const unsigned int timer3_int = CLOCKHZ / 4; +unsigned int timer1_val = 0; +unsigned int timer3_val = 0; + +void timer_init() { + timer1_val = REGS_TIMER->counter_lo; + timer1_val += timer1_int; + REGS_TIMER->compare[1] = timer1_val; + + timer3_val = REGS_TIMER->counter_lo; + timer3_val += timer3_int; + REGS_TIMER->compare[3] = timer3_val; +} + +void handle_spi() { + //while((REGS_AUX->mu_iir & 4) == 4) { + debugstr("UART Recv: "); + //uart_send(uart_recv()); + debugstr("\n"); + //} + debugstr("button pressed"); +} + +void handle_timer_1() { + timer1_val += timer1_int; + REGS_TIMER->compare[1] = timer1_val; + REGS_TIMER->control_status |= SYS_TIMER_IRQ_1; + + unsigned int progval = timer1_val / timer1_int; + if (progval <= 100) { + drawProgress(2, progval); + } else { + debugstr("Timer 1 done."); + debugcrlf(); + } +} + +void handle_timer_3() { + timer3_val += timer3_int; + REGS_TIMER->compare[3] = timer3_val; + REGS_TIMER->control_status |= SYS_TIMER_IRQ_3; + + unsigned int progval = timer3_val / timer3_int; + if (progval <= 100) drawProgress(3, progval); +} + +void main(void) +{ + fb_init(); + + // Init GPIO interupt + //init_GPIOinterrupt(); + + unsigned int i=0; + while (i++<30) debugcrlf(); + + initProgress(); + + // Kick it off on core 1 + + start_core1(core1_main); + + // Kick off the timers + + irq_init_vectors(); + enable_interrupt_controller(); + irq_barrier(); + irq_enable(); + timer_init(); + + // Loop endlessly + + core0_main(); +} diff --git a/part13a-gpio-interrupts/kernel/kernel.h b/part13a-gpio-interrupts/kernel/kernel.h new file mode 100644 index 0000000..b8d21c8 --- /dev/null +++ b/part13a-gpio-interrupts/kernel/kernel.h @@ -0,0 +1,54 @@ +#define PERIPHERAL_BASE 0xFE000000 +#define CLOCKHZ 1000000 + +struct timer_regs { + volatile unsigned int control_status; + volatile unsigned int counter_lo; + volatile unsigned int counter_hi; + volatile unsigned int compare[4]; +}; + +#define REGS_TIMER ((struct timer_regs *)(PERIPHERAL_BASE + 0x00003000)) + +struct arm_irq_regs_2711 { + volatile unsigned int irq0_pending_0; + volatile unsigned int irq0_pending_1; + volatile unsigned int irq0_pending_2; + volatile unsigned int res0; + volatile unsigned int irq0_enable_0; + volatile unsigned int irq0_enable_1; + volatile unsigned int irq0_enable_2; + volatile unsigned int res1; + volatile unsigned int irq0_disable_0; + volatile unsigned int irq0_disable_1; + volatile unsigned int irq0_disable_2; +}; + +typedef struct arm_irq_regs_2711 arm_irq_regs; + +#define REGS_IRQ ((arm_irq_regs *)(PERIPHERAL_BASE + 0x0000B200)) + +enum vc_irqs { + SYS_TIMER_IRQ_0 = 1, + SYS_TIMER_IRQ_1 = 2, + SYS_TIMER_IRQ_2 = 4, + SYS_TIMER_IRQ_3 = 8, + AUX_IRQ = (1 << 29), + GPIO_INT_0 = (1 << 49), + GPIO_INT_1 = (1 << 50), + GPIO_INT_2 = (1 << 51), + GPIO_INT_3 = (1 << 52), + SPI_INT = (1 << 54) +}; + +// from util.S +void irq_init_vectors(); +void irq_enable(); +void irq_barrier(); +void irq_disable(); +void enable_interrupt_controller(); +void disable_interrupt_controller(); + +void handle_timer_1(); +void handle_timer_3(); +void handle_spi(); diff --git a/part13a-gpio-interrupts/kernel/utils.S b/part13a-gpio-interrupts/kernel/utils.S new file mode 100644 index 0000000..47637ab --- /dev/null +++ b/part13a-gpio-interrupts/kernel/utils.S @@ -0,0 +1,21 @@ +//D13.2.137 of ARMv8 reference manual +.globl irq_init_vectors +irq_init_vectors: + adr x0, vectors + msr vbar_el1, x0 + ret +//C5.2.2 of ARMv8 reference manual +.globl irq_enable +irq_enable: + msr daifclr, #2 + ret + +.globl irq_disable +irq_disable: + msr daifset, #2 + ret + +.globl irq_barrier +irq_barrier: + dsb sy + ret diff --git a/part13a-gpio-interrupts/lib/fb.c b/part13a-gpio-interrupts/lib/fb.c new file mode 100644 index 0000000..2cc89f7 --- /dev/null +++ b/part13a-gpio-interrupts/lib/fb.c @@ -0,0 +1,260 @@ +#include "../include/io.h" +#include "../include/mb.h" +#include "../include/terminal.h" + +unsigned int width, height, pitch, isrgb; +unsigned char *fb; + +int curx = 0; +int cury = 0; + +void fb_init() +{ + mbox[0] = 35*4; // Length of message in bytes + mbox[1] = MBOX_REQUEST; + + mbox[2] = MBOX_TAG_SETPHYWH; // Tag identifier + mbox[3] = 8; // Value size in bytes + mbox[4] = 0; + mbox[5] = 1920; // Value(width) + mbox[6] = 1080; // Value(height) + + mbox[7] = MBOX_TAG_SETVIRTWH; + mbox[8] = 8; + mbox[9] = 8; + mbox[10] = 1920; + mbox[11] = 1080; + + mbox[12] = MBOX_TAG_SETVIRTOFF; + mbox[13] = 8; + mbox[14] = 8; + mbox[15] = 0; // Value(x) + mbox[16] = 0; // Value(y) + + mbox[17] = MBOX_TAG_SETDEPTH; + mbox[18] = 4; + mbox[19] = 4; + mbox[20] = 32; // Bits per pixel + + mbox[21] = MBOX_TAG_SETPXLORDR; + mbox[22] = 4; + mbox[23] = 4; + mbox[24] = 1; // RGB + + mbox[25] = MBOX_TAG_GETFB; + mbox[26] = 8; + mbox[27] = 8; + mbox[28] = 4096; // FrameBufferInfo.pointer + mbox[29] = 0; // FrameBufferInfo.size + + mbox[30] = MBOX_TAG_GETPITCH; + mbox[31] = 4; + mbox[32] = 4; + mbox[33] = 0; // Bytes per line + + mbox[34] = MBOX_TAG_LAST; + + // Check call is successful and we have a pointer with depth 32 + if (mbox_call(MBOX_CH_PROP) && mbox[20] == 32 && mbox[28] != 0) { + mbox[28] &= 0x3FFFFFFF; // Convert GPU address to ARM address + width = mbox[10]; // Actual physical width + height = mbox[11]; // Actual physical height + pitch = mbox[33]; // Number of bytes per line + isrgb = mbox[24]; // Pixel order + fb = (unsigned char *)((long)mbox[28]); + } +} + +void drawPixel(int x, int y, unsigned char attr) +{ + int offs = (y * pitch) + (x * 4); + *((unsigned int*)(fb + offs)) = vgapal[attr & 0x0f]; +} + +void drawRect(int x1, int y1, int x2, int y2, unsigned char attr, int fill) +{ + int y=y1; + + while (y <= y2) { + int x=x1; + while (x <= x2) { + if ((x == x1 || x == x2) || (y == y1 || y == y2)) drawPixel(x, y, attr); + else if (fill) drawPixel(x, y, (attr & 0xf0) >> 4); + x++; + } + y++; + } +} + +void drawLine(int x1, int y1, int x2, int y2, unsigned char attr) +{ + int dx, dy, p, x, y; + + dx = x2-x1; + dy = y2-y1; + x = x1; + y = y1; + p = 2*dy-dx; + + while (x= 0) { + drawPixel(x,y,attr); + y++; + p = p+2*dy-2*dx; + } else { + drawPixel(x,y,attr); + p = p+2*dy; + } + x++; + } +} + +void drawCircle(int x0, int y0, int radius, unsigned char attr, int fill) +{ + int x = radius; + int y = 0; + int err = 0; + + while (x >= y) { + if (fill) { + drawLine(x0 - y, y0 + x, x0 + y, y0 + x, (attr & 0xf0) >> 4); + drawLine(x0 - x, y0 + y, x0 + x, y0 + y, (attr & 0xf0) >> 4); + drawLine(x0 - x, y0 - y, x0 + x, y0 - y, (attr & 0xf0) >> 4); + drawLine(x0 - y, y0 - x, x0 + y, y0 - x, (attr & 0xf0) >> 4); + } + drawPixel(x0 - y, y0 + x, attr); + drawPixel(x0 + y, y0 + x, attr); + drawPixel(x0 - x, y0 + y, attr); + drawPixel(x0 + x, y0 + y, attr); + drawPixel(x0 - x, y0 - y, attr); + drawPixel(x0 + x, y0 - y, attr); + drawPixel(x0 - y, y0 - x, attr); + drawPixel(x0 + y, y0 - x, attr); + + if (err <= 0) { + y += 1; + err += 2*y + 1; + } + + if (err > 0) { + x -= 1; + err -= 2*x + 1; + } + } +} + +void drawChar(unsigned char ch, int x, int y, unsigned char attr, int zoom) +{ + unsigned char *glyph = (unsigned char *)&font + (ch < FONT_NUMGLYPHS ? ch : 0) * FONT_BPG; + + for (int i=1;i<=(FONT_HEIGHT*zoom);i++) { + for (int j=0;j<(FONT_WIDTH*zoom);j++) { + unsigned char mask = 1 << (j/zoom); + unsigned char col = (*glyph & mask) ? attr & 0x0f : (attr & 0xf0) >> 4; + + drawPixel(x+j, y+i, col); + } + glyph += (i%zoom) ? 0 : FONT_BPL; + } +} + +void drawString(int x, int y, char *s, unsigned char attr, int zoom) +{ + while (*s) { + if (*s == '\r') { + x = 0; + } else if(*s == '\n') { + x = 0; y += (FONT_HEIGHT*zoom); + } else { + drawChar(*s, x, y, attr, zoom); + x += (FONT_WIDTH*zoom); + } + s++; + } +} + +void moveRect(int oldx, int oldy, int width, int height, int shiftx, int shifty, unsigned char attr) +{ + unsigned int newx = oldx + shiftx, newy = oldy + shifty; + unsigned int xcount = 0, ycount = 0; + unsigned int bitmap[width][height]; // This is very unsafe if it's too big for the stack... + unsigned int offs; + + // Save the bitmap + while (xcount < width) { + while (ycount < height) { + offs = ((oldy + ycount) * pitch) + ((oldx + xcount) * 4); + + bitmap[xcount][ycount] = *((unsigned int*)(fb + offs)); + ycount++; + } + ycount=0; + xcount++; + } + // Wipe it out with background colour + drawRect(oldx, oldy, oldx + width, oldy + width, attr, 1); + // Draw it again + for (int i=newx;i= 1920) { + curx = 0; cury += 8; + } + if (cury + 8 >= 1080) { + cury = 0; + } + drawString(curx, cury, str, 0x0f, 1); + curx += (strlen(str) * 8); +} + +void debugcrlf(void) { + curx = 0; cury += 8; +} + +void debugch(unsigned char b) { + unsigned int n; + int c; + for(c=4;c>=0;c-=4) { + n=(b>>c)&0xF; + n+=n>9?0x37:0x30; + debugstr((char *)&n); + } + debugstr(" "); +} + +void debughex(unsigned int d) { + unsigned int n; + int c; + for(c=28;c>=0;c-=4) { + n=(d>>c)&0xF; + n+=n>9?0x37:0x30; + debugstr((char *)&n); + } + debugstr(" "); +} diff --git a/part13a-gpio-interrupts/lib/io.c b/part13a-gpio-interrupts/lib/io.c new file mode 100644 index 0000000..34a02aa --- /dev/null +++ b/part13a-gpio-interrupts/lib/io.c @@ -0,0 +1,199 @@ +#include "../include/io.h" + +// GPIO + +enum { + GPFSEL0 = PERIPHERAL_BASE + 0x200000, + GPSET0 = PERIPHERAL_BASE + 0x20001C, + GPCLR0 = PERIPHERAL_BASE + 0x200028, + GPPUPPDN0 = PERIPHERAL_BASE + 0x2000E4 +}; + +enum { + GPIO_MAX_PIN = 53, + GPIO_FUNCTION_OUT = 1, + GPIO_FUNCTION_ALT5 = 2, + GPIO_FUNCTION_ALT3 = 7, + GPIO_FUNCTION_ALT0 = 4 +}; + +enum { + Pull_None = 0, + Pull_Down = 1, // Are down and up the right way around? + Pull_Up = 2 +}; + +void mmio_write(long reg, unsigned int val) { *(volatile unsigned int *)reg = val; } +unsigned int mmio_read(long reg) { return *(volatile unsigned int *)reg; } + +unsigned int gpio_call(unsigned int pin_number, unsigned int value, unsigned int base, unsigned int field_size, unsigned int field_max) { + unsigned int field_mask = (1 << field_size) - 1; + + if (pin_number > field_max) return 0; + if (value > field_mask) return 0; + + unsigned int num_fields = 32 / field_size; + unsigned int reg = base + ((pin_number / num_fields) * 4); + unsigned int shift = (pin_number % num_fields) * field_size; + + unsigned int curval = mmio_read(reg); + curval &= ~(field_mask << shift); + curval |= value << shift; + mmio_write(reg, curval); + + return 1; +} + +unsigned int gpio_set (unsigned int pin_number, unsigned int value) { return gpio_call(pin_number, value, GPSET0, 1, GPIO_MAX_PIN); } +unsigned int gpio_clear (unsigned int pin_number, unsigned int value) { return gpio_call(pin_number, value, GPCLR0, 1, GPIO_MAX_PIN); } +unsigned int gpio_pull (unsigned int pin_number, unsigned int value) { return gpio_call(pin_number, value, GPPUPPDN0, 2, GPIO_MAX_PIN); } +unsigned int gpio_function(unsigned int pin_number, unsigned int value) { return gpio_call(pin_number, value, GPFSEL0, 3, GPIO_MAX_PIN); } + +void gpio_useAsAlt0(unsigned int pin_number) { + gpio_pull(pin_number, Pull_None); + gpio_function(pin_number, GPIO_FUNCTION_ALT0); +} + +void gpio_useAsAlt3(unsigned int pin_number) { + gpio_pull(pin_number, Pull_None); + gpio_function(pin_number, GPIO_FUNCTION_ALT3); +} + +void gpio_useAsAlt5(unsigned int pin_number) { + gpio_pull(pin_number, Pull_None); + gpio_function(pin_number, GPIO_FUNCTION_ALT5); +} + +void gpio_initOutputPinWithPullNone(unsigned int pin_number) { + gpio_pull(pin_number, Pull_None); + gpio_function(pin_number, GPIO_FUNCTION_OUT); +} + +void gpio_setPinOutputBool(unsigned int pin_number, unsigned int onOrOff) { + if (onOrOff) { + gpio_set(pin_number, 1); + } else { + gpio_clear(pin_number, 1); + } +} + +// UART + +enum { + AUX_BASE = PERIPHERAL_BASE + 0x215000, + AUX_IRQ = AUX_BASE, + AUX_ENABLES = AUX_BASE + 4, + AUX_MU_IO_REG = AUX_BASE + 64, + AUX_MU_IER_REG = AUX_BASE + 68, + AUX_MU_IIR_REG = AUX_BASE + 72, + AUX_MU_LCR_REG = AUX_BASE + 76, + AUX_MU_MCR_REG = AUX_BASE + 80, + AUX_MU_LSR_REG = AUX_BASE + 84, + AUX_MU_MSR_REG = AUX_BASE + 88, + AUX_MU_SCRATCH = AUX_BASE + 92, + AUX_MU_CNTL_REG = AUX_BASE + 96, + AUX_MU_STAT_REG = AUX_BASE + 100, + AUX_MU_BAUD_REG = AUX_BASE + 104, + AUX_UART_CLOCK = 500000000, + UART_MAX_QUEUE = 16 * 1024 +}; + +#define AUX_MU_BAUD(baud) ((AUX_UART_CLOCK/(baud*8))-1) + +unsigned char uart_output_queue[UART_MAX_QUEUE]; +unsigned int uart_output_queue_write = 0; +unsigned int uart_output_queue_read = 0; + +void uart_init() { + mmio_write(AUX_ENABLES, 1); //enable UART1 + mmio_write(AUX_MU_IER_REG, 0); + mmio_write(AUX_MU_CNTL_REG, 0); + mmio_write(AUX_MU_LCR_REG, 3); //8 bits + mmio_write(AUX_MU_MCR_REG, 0); + mmio_write(AUX_MU_IER_REG, 0); + mmio_write(AUX_MU_IIR_REG, 0xC6); //disable interrupts + mmio_write(AUX_MU_BAUD_REG, AUX_MU_BAUD(115200)); + gpio_useAsAlt5(14); + gpio_useAsAlt5(15); + mmio_write(AUX_MU_CNTL_REG, 3); //enable RX/TX +} + +unsigned int uart_isOutputQueueEmpty() { + return uart_output_queue_read == uart_output_queue_write; +} + +unsigned int uart_isReadByteReady() { return mmio_read(AUX_MU_LSR_REG) & 0x01; } +unsigned int uart_isWriteByteReady() { return mmio_read(AUX_MU_LSR_REG) & 0x20; } + +unsigned char uart_readByte() { + while (!uart_isReadByteReady()); + return (unsigned char)mmio_read(AUX_MU_IO_REG); +} + +void uart_writeByteBlockingActual(unsigned char ch) { + while (!uart_isWriteByteReady()); + mmio_write(AUX_MU_IO_REG, (unsigned int)ch); +} + +void uart_loadOutputFifo() { + while (!uart_isOutputQueueEmpty() && uart_isWriteByteReady()) { + uart_writeByteBlockingActual(uart_output_queue[uart_output_queue_read]); + uart_output_queue_read = (uart_output_queue_read + 1) & (UART_MAX_QUEUE - 1); // Don't overrun + } +} + +void uart_writeByteBlocking(unsigned char ch) { + unsigned int next = (uart_output_queue_write + 1) & (UART_MAX_QUEUE - 1); // Don't overrun + + while (next == uart_output_queue_read) uart_loadOutputFifo(); + + uart_output_queue[uart_output_queue_write] = ch; + uart_output_queue_write = next; +} + +void uart_writeText(char *buffer) { + while (*buffer) { + if (*buffer == '\n') uart_writeByteBlockingActual('\r'); + uart_writeByteBlockingActual(*buffer++); + } +} + +void uart_drainOutputQueue() { + while (!uart_isOutputQueueEmpty()) uart_loadOutputFifo(); +} + +void uart_update() { + uart_loadOutputFifo(); + + if (uart_isReadByteReady()) { + unsigned char ch = uart_readByte(); + if (ch == '\r') uart_writeText("\n"); else uart_writeByteBlocking(ch); + } +} + +void uart_hex(unsigned int d) { + unsigned int n; + int c; + for(c=28;c>=0;c-=4) { + // get highest tetrad + n=(d>>c)&0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n+=n>9?0x37:0x30; + + uart_writeByteBlockingActual(n); + } +} + +void uart_byte(unsigned char b) { + unsigned int n; + int c; + for(c=4;c>=0;c-=4) { + // get highest tetrad + n=(b>>c)&0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n+=n>9?0x37:0x30; + + uart_writeByteBlockingActual(n); + } + uart_writeByteBlockingActual(' '); +} diff --git a/part13a-gpio-interrupts/lib/mb.c b/part13a-gpio-interrupts/lib/mb.c new file mode 100644 index 0000000..65dbbb8 --- /dev/null +++ b/part13a-gpio-interrupts/lib/mb.c @@ -0,0 +1,39 @@ +#include "../include/io.h" + +// The buffer must be 16-byte aligned as only the upper 28 bits of the address can be passed via the mailbox +volatile unsigned int __attribute__((aligned(16))) mbox[36]; + +enum { + VIDEOCORE_MBOX = (PERIPHERAL_BASE + 0x0000B880), + MBOX_READ = (VIDEOCORE_MBOX + 0x0), + MBOX_POLL = (VIDEOCORE_MBOX + 0x10), + MBOX_SENDER = (VIDEOCORE_MBOX + 0x14), + MBOX_STATUS = (VIDEOCORE_MBOX + 0x18), + MBOX_CONFIG = (VIDEOCORE_MBOX + 0x1C), + MBOX_WRITE = (VIDEOCORE_MBOX + 0x20), + MBOX_RESPONSE = 0x80000000, + MBOX_FULL = 0x80000000, + MBOX_EMPTY = 0x40000000 +}; + +unsigned int mbox_call(unsigned char ch) +{ + // 28-bit address (MSB) and 4-bit value (LSB) + unsigned int r = ((unsigned int)((long) &mbox) &~ 0xF) | (ch & 0xF); + + // Wait until we can write + while (mmio_read(MBOX_STATUS) & MBOX_FULL); + + // Write the address of our buffer to the mailbox with the channel appended + mmio_write(MBOX_WRITE, r); + + while (1) { + // Is there a reply? + while (mmio_read(MBOX_STATUS) & MBOX_EMPTY); + + // Is it a reply to our message? + if (r == mmio_read(MBOX_READ)) return mbox[1]==MBOX_RESPONSE; // Is it successful? + + } + return 0; +} diff --git a/part13a-gpio-interrupts/lib/multicore.c b/part13a-gpio-interrupts/lib/multicore.c new file mode 100644 index 0000000..0000bcd --- /dev/null +++ b/part13a-gpio-interrupts/lib/multicore.c @@ -0,0 +1,44 @@ +#include "../include/multicore.h" + +void store32(unsigned long address, unsigned long value) +{ + *(unsigned long *) address = value; +} + +unsigned long load32(unsigned long address) +{ + return *(unsigned long *) address; +} + +void start_core1(void (*func)(void)) +{ + store32((unsigned long)&spin_cpu1, (unsigned long)func); + asm volatile ("sev"); +} + +void start_core2(void (*func)(void)) +{ + store32((unsigned long)&spin_cpu2, (unsigned long)func); + asm volatile ("sev"); +} + +void start_core3(void (*func)(void)) +{ + store32((unsigned long)&spin_cpu3, (unsigned long)func); + asm volatile ("sev"); +} + +void clear_core1(void) +{ + store32((unsigned long)&spin_cpu1, 0); +} + +void clear_core2(void) +{ + store32((unsigned long)&spin_cpu2, 0); +} + +void clear_core3(void) +{ + store32((unsigned long)&spin_cpu3, 0); +} diff --git a/part14-spi-ethernet-interrupt/Makefile b/part14-spi-ethernet-interrupt/Makefile new file mode 100644 index 0000000..e208c92 --- /dev/null +++ b/part14-spi-ethernet-interrupt/Makefile @@ -0,0 +1,25 @@ +CFILES = $(wildcard *.c lib/*.c kernel/*.c net/*.c) +SFILES = $(wildcard boot/*.S lib/*.S kernel/*.S) +OFILES = $(CFILES:.c=.o) $(SFILES:.S=.o) +GCCFLAGS = -Wall -O0 -ffreestanding -nostdlib -nostartfiles +GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin +BOOTMNT ?= /media/cvdeveloper/bootfs + +all: clean kernel8.img + +%.o: %.c + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ + +%.o: %.S + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ + +kernel8.img: $(OFILES) + $(GCCPATH)/aarch64-none-elf-ld -nostdlib $(OFILES) -T boot/link.ld -o kernel8.elf + $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img + + cp kernel8.img $(BOOTMNT)/kernel8.img + cp config.txt $(BOOTMNT)/ + sync + +clean: + /bin/rm kernel8.elf */*.o *.img > /dev/null 2> /dev/null || true diff --git a/part14-spi-ethernet-interrupt/README.md b/part14-spi-ethernet-interrupt/README.md new file mode 100644 index 0000000..9597ea9 --- /dev/null +++ b/part14-spi-ethernet-interrupt/README.md @@ -0,0 +1,211 @@ +Writing a "bare metal" operating system for Raspberry Pi 4 (Part 14) +==================================================================== + +[< Go back to part13-interrupts](../part13-interrupts) + +Bare metal Ethernet for under £10 +--------------------------------- +It's exciting to build your own OS, but until you give it the ability to communicate with the outside world, your possibilities are limited. Indeed, our simple Bluetooth comms got us up and running - but if we're to do anything meaningful then we need proper networking. + +In this tutorial, we're going to connect to an external Ethernet controller (a network card, if you like) using the RPi4's Serial Peripheral Interface (SPI). + +Things you'll need: + + * An [ENC28J60 Ethernet module](https://www.amazon.co.uk/dp/B00DB76ZSK) - it cost me less than £6 and was worth every penny (n.b. code only tested on this exact model) + * Some [female-to-female jumper cables](https://www.amazon.co.uk/dp/B072LN3HLG) - cost me less than £2.50 + * An Ethernet cable to connect to your Internet router + +Connecting up the ENC28J60 Ethernet module +------------------------------------------ +I followed the very helpful instructions [here](https://www.instructables.com/Super-Cheap-Ethernet-for-the-Raspberry-Pi/) to hook up the ENC28J60 to the RPi4's SPI0 interface. + +We won't be connecting the interrupt line for now, so there are just six jumper leads (I've suggested colours) that need connecting: + + | Pi pin | Pi GPIO | Jumper colour | ENC28J60 pin | + | ------ | ----------- | ------------- | ------------ | + | Pin 17 | +3V3 power | Red | VCC | + | Pin 19 | GPIO10/MOSI | Green | SI | + | Pin 20 | GND | Black | GND | + | Pin 21 | GPIO09/MISO | Yellow | SO | + | Pin 23 | GPIO11/SCLK | Blue | SCK | + | Pin 24 | GPIO08/CE0 | Green | CS | + +![GPIO location](../part3-helloworld/images/3-helloworld-pinloc.png) + +Here's a (not very useful) photo of my RPi4 connected correctly: + +![ENC28J60 connections](images/14-spi-ethernet-photo.jpg) + +The SPI library +--------------- +Let's start by looking at how we implement SPI communication. + +I'm not going to write a long paper on how SPI works and why we need it, because it's [very well documented elsewhere](https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi/). It's recommended background reading, but not essential if all you want to do is get something working. + +Look at _lib/spi.c_. It uses some of existing functions in _lib/io.c_ that you'll remember from earlier tutorials. In fact, I've added two functions to the _include/io.h_ header file so we can call them from our SPI library: + +```c +void gpio_setPinOutputBool(unsigned int pin_number, unsigned int onOrOff); +void gpio_initOutputPinWithPullNone(unsigned int pin_number); +``` + +Specifically, `spi_init()` sets GPIO 7, 9, 10, and 11 to use the ALT0 function. Cross-referencing with the [BCM2711 ARM Peripherals document](https://datasheets.raspberrypi.com/bcm2711/bcm2711-peripherals.pdf), page 77, you'll see that this maps SPI0 to the GPIO header. GPIO 8 is mapped as an output pin, since we'll use this to signal to the ENC28J60 that we want to talk. In fact, the `spi_chip_select()` function takes a true/false (boolean) parameter which either sets or clears this pin. + +Looking at the SPI0 register map on page 136, we see this reflected in our `REGS_SPI0` structure. This gives us handy access to the SPI0 peripheral's memory-mapped registers. + +Our `spi_send_recv()` function then sets us up for some communcation: + + * Sets the DLEN Register to the number of bytes to transfer (a length we passed into the function) + * Clears the RX & TX FIFOs + * Sets the Transfer Active (TA) flag + +Then, whilst there's either data to write or data to read (and we haven't written/read more bytes than we asked for), we write to/read from the FIFO using the buffers we passed in. Once we think we're done, we wait until the SPI interface agrees i.e. the DONE flag in the CS Register is set. If there are extraneous bytes to read, we just throw them away (well, dump them to the screen for now because this shouldn't happen). + +Finally, to be absolutely sure, we clear the TA flag. + +I've then set up two convenient functions - `spi_send()` and `spi_recv()` - which exercise `spi_send_recv()`, mainly to make future code more readable. + +The ENC28J60 drivers +-------------------- +Let's now look into the _net/_ subdirectory. + +Both _enc28j60.c_ and _enc28j60.h_ make up the driver code for the ENC28J60 Ethernet module. Whilst we could have laboured for months writing our own driver based on [the module's datasheet](http://ww1.microchip.com/downloads/en/devicedoc/39662c.pdf), I chose to leverage somebody else's hard work instead. It felt like a win that I could effortlessly bring somebody else's good code into my own OS! I did, however, make sure I understood what the code was doing at every turn (optional!). + +Thanks to [this Github repository](https://github.com/wolfgangr/enc28j60) for saving me months of work. I made a very few changes to the code, but nothing worth documenting here. If you're keen to see how little I needed to change, clone the repo and make good use of the `diff` command. + +What I did need to do is write some bridging code between the driver and the RPi4 hardware. Essentially, I'm talking about hooking up our SPI library to the driver - the whole reason for _encspi.c_. + +It defines four functions that the driver requires (well documented in the _enc28j60.h_ file): + +```c +void ENC_SPI_Select(unsigned char truefalse) { + spi_chip_select(!truefalse); // If it's true, select 0 (the ENC), if false, select 1 (i.e. deselect the ENC) +} + +void ENC_SPI_SendBuf(unsigned char *master2slave, unsigned char *slave2master, unsigned short bufferSize) { + spi_chip_select(0); + spi_send_recv(master2slave, slave2master, bufferSize); + spi_chip_select(1); // De-select the ENC +} + +void ENC_SPI_Send(unsigned char command) { + spi_chip_select(0); + spi_send(&command, 1); + spi_chip_select(1); // De-select the ENC +} + +void ENC_SPI_SendWithoutSelection(unsigned char command) { + spi_send(&command, 1); +} +``` + +Perhaps the most confusing aspect is the chip selection. Through a bit of trial & error I discovered that when GPIO08 is clear, the device is selected, and when it's set, the device is deselected. It turns out this is because the Chip Select pin on the ENC28J60 is active LOW and there's no invertor on the board (presumably to save costs), so GPIO08 must be LOW to enable the IC. + +Some more timer functions +------------------------- +The only other thing our ENC28J60 driver requires is access to a couple of well-defined timer functions: + + * `HAL_GetTick()` - returns the current number of timer ticks since start + * `HAL_Delay()` - delays by a specified number of milliseconds + +These are quickly implemented in _kernel/kernel.c_ and weren't too much of a stretch after _part13-interrupts_: + +```c +unsigned long HAL_GetTick(void) { + unsigned int hi = REGS_TIMER->counter_hi; + unsigned int lo = REGS_TIMER->counter_lo; + + //double check hi value didn't change after setting it... + if (hi != REGS_TIMER->counter_hi) { + hi = REGS_TIMER->counter_hi; + lo = REGS_TIMER->counter_lo; + } + + return ((unsigned long)hi << 32) | lo; +} + +void HAL_Delay(unsigned int ms) { + unsigned long start = HAL_GetTick(); + + while(HAL_GetTick() < start + (ms * 1000)); +} +``` + +Let's connect! +-------------- +So we have a working driver that's interfacing with our hardware via _net/encspi.c_ and a few timer functions in _kernel/kernel.c_. Now what? + +The design goals of our kernel's networking demo will be to: + + 1. Prove we can talk to the hardware + 2. Bring the network up successfully + 3. Prove we can connect to something else on the network and get a response + +My proposals for how we fulfil these goals are: + + 1. Prove we can detect whether a network link has been established at a physical level (CAT5 cable plugged in and connected to a working switch) + 2. Rely on the ENC28J60 driver to tell us that we've started up successfully + 3. Handcraft and send an [ARP](https://en.wikipedia.org/wiki/Address_Resolution_Protocol) request and await an ARP response from my Internet router (the traditional way devices "find each other" on a network from a point of zero knowledge) + +Look at _kernel/arp.c_. First we create a handle to reference our driver instance `ENC_HandleTypeDef handle`. We then initialise this structure in `init_network()`: + +```c +handle.Init.DuplexMode = ETH_MODE_HALFDUPLEX; +handle.Init.MACAddr = myMAC; +handle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE; +handle.Init.InterruptEnableBits = EIE_LINKIE | EIE_PKTIE; +``` + +This starts the module in half duplex mode (can't transmit & receive simultaneously), sets its MAC address (my favourite: `C0:FF:EE:C0:FF:EE`), tells the hardware to add its own packet checksums (we don't want to have to create them in software), and enables interrupt messages for "link up/down" and "packet received". + +We then call the driver routine `ENC_Start(&handle)` and check it returns true (this fulfils design requirement 2 - the driver tells us we've started correctly). We go on to set the MAC address using `ENC_SetMacAddr(&handle)`. + +This line waits until a physical network link has been established (fulfilling design requirement 1): + +```c +while (!(handle.LinkStatus & PHSTAT2_LSTAT)) ENC_IRQHandler(&handle); +``` + +The driver's `ENC_IRQHandler(&handle)` routine would ordinarily be called when an interrupt was raised to refresh the driver status flags. Because we didn't hook up the interrupt line and to keep things simple, we're just polling in the software for now. When we see the `handle.LinkStatus` flag has the `PHSTAT2_LSTAT` bit set, we know the link is up (documented on page 24 of the module's datasheet). + +Before we're done, we have to re-enable Ethernet interrupts (`ENC_IRQHandler()` disables them, but doesn't re-enable them - something I discovered by reading the code). + +Sending/receiving an ARP +------------------------ +To transmit on an Ethernet network, we need to format our packets correctly. The ENC28J60 deals with the physical layer (including the checksum, as we asked it to), so we only need concern ourselves with the data link layer - made up of a header, and a payload. + +The header (our `EtherNetII` struct) is simply a destination and source MAC address, as well as a [16-bit packet type](https://en.wikipedia.org/wiki/EtherType). ARP packets, for example, have type `0x0806`. You'll note in our `#define ARPPACKET` that we've swapped the two bytes. This is because big-endianness is the dominant ordering in network protocols, and the RPi4 is a little-endian architecture (some reading may be required here!). We've had to do this across the board. + +The payload is the full [ARP packet](https://en.wikipedia.org/wiki/Address_Resolution_Protocol) defined in the `ARP` struct. The `SendArpPacket()` function sets up the data we need in the structure (documented in code comments) and then uses driver calls to transmit the packet: + +```c +// Send the packet + +if (ENC_RestoreTXBuffer(&handle, sizeof(ARP)) == 0) { + debugstr("Sending ARP request."); + debugcrlf(); + + ENC_WriteBuffer((unsigned char *)&arpPacket, sizeof(ARP)); + handle.transmitLength = sizeof(ARP); + + ENC_Transmit(&handle); +} +``` + +`ENC_RestoreTXBuffer()` simply prepares the transmit buffer and returns 0 if successful. `ENC_WriteBuffer()` sends the packet to the ENC28J60 over the SPI. We then set the transmit buffer length in the driver status flags and call `ENC_Transmit()` to tell the ENC to send the packet across the network. + +You'll see that the `arp_test()` function sends our first ARP this way. We tell it the IP of our router (`192.168.0.1` in my case), but we don't know its MAC address - that's what we want to find out. Once the ARP is sent, `arp_test()` then waits for received Ethernet packets, checks whether they're for us and, if they come from the router's IP address (therefore likely to be the ARP response to our request), we print out the router's MAC address. + +This fulfils design requirement 3, and therefore we're done! All we need to do is ensure that _kernel/kernel.c_ calls our networking routines in the right order. I've chosen to do this on core 3 with a few easy-to-follow changes from where we left off in _part13-interrupts_. Essentially these are all the calls we need: + +```c +spi_init(); +init_network(); +arp_test(); +``` + +_Imagine how happy I was to see my router's (correct!) MAC address appear on-screen - a sign of life, and proof that my OS is actually networking!_ + +![ARP response](images/14-spi-ethernet-arp.jpg) + +[Go to part15-tcpip-webserver >](../part15-tcpip-webserver) diff --git a/part14-spi-ethernet-interrupt/boot/boot.S b/part14-spi-ethernet-interrupt/boot/boot.S new file mode 100644 index 0000000..f644aee --- /dev/null +++ b/part14-spi-ethernet-interrupt/boot/boot.S @@ -0,0 +1,114 @@ +#include "sysregs.h" + +#define LOCAL_CONTROL 0xff800000 +#define LOCAL_PRESCALER 0xff800008 +#define OSC_FREQ 54000000 +#define MAIN_STACK 0x400000 + +.section ".text.boot" // Make sure the linker puts this at the start of the kernel image + +.global _start // Execution starts here + +_start: + ldr x0, =LOCAL_CONTROL // Sort out the timer + str wzr, [x0] + mov w1, 0x80000000 + str w1, [x0, #(LOCAL_PRESCALER - LOCAL_CONTROL)] + + ldr x0, =OSC_FREQ + msr cntfrq_el0, x0 + msr cntvoff_el2, xzr + + // Check processor ID is zero (executing on main core), else hang + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, 2f + + // We're not on the main core, so hang in an infinite wait loop + adr x5, spin_cpu0 +1: wfe + ldr x4, [x5, x1, lsl #3] + cbz x4, 1b + + ldr x2, =__stack_start // Get ourselves a fresh stack - location depends on CPU core asking + lsl x1, x1, #9 // Multiply core_number by 512 + add x3, x2, x1 // Add to the address + mov sp, x3 + + mov x0, #0 + mov x1, #0 + mov x2, #0 + mov x3, #0 + br x4 + b 1b +2: // We're on the main core! + // First enable the FPU + + mov x0, #0x33ff + msr cptr_el3, x0 // Disable coprocessor traps to EL3 + mov x0, #3 << 20 + msr cpacr_el1, x0 // Enable FP/SIMD at EL1 + + // Now get ready to switch from EL3 down to EL1 + + ldr x0, =SCTLR_VALUE_MMU_DISABLED + msr sctlr_el1, x0 + + ldr x0, =HCR_VALUE + msr hcr_el2, x0 + + ldr x0, =SCR_VALUE + msr scr_el3, x0 + + ldr x0, =SPSR_VALUE + msr spsr_el3, x0 + + adr x0, el1_entry + msr elr_el3, x0 + + eret +el1_entry: + // We're in EL1 + // Clean the BSS section + ldr x1, =__bss_start // Start address + ldr w2, =__bss_size // Size of the section +3: cbz w2, 4f // Quit loop if zero + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, 3b // Loop if non-zero + + // Set stack to start somewhere safe + mov sp, #MAIN_STACK + + // Jump to our main() routine in C (make sure it doesn't return) +4: bl main + // In case it does return, halt the master core too + b 1b + +.ltorg + +.org 0x110 +.globl spin_cpu0 +spin_cpu0: + .quad 0 + +.org 0x118 +.globl spin_cpu1 +spin_cpu1: + .quad 0 + +.org 0x120 +.globl spin_cpu2 +spin_cpu2: + .quad 0 + +.org 0x128 +.globl spin_cpu3 +spin_cpu3: + .quad 0 + +.globl get_el +get_el: + mrs x0, CurrentEL + lsr x0, x0, #2 + ret diff --git a/part14-spi-ethernet-interrupt/boot/link.ld b/part14-spi-ethernet-interrupt/boot/link.ld new file mode 100644 index 0000000..4e84390 --- /dev/null +++ b/part14-spi-ethernet-interrupt/boot/link.ld @@ -0,0 +1,35 @@ +SECTIONS +{ + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + __bss_size = (__bss_end - __bss_start)>>3; + } + .cpu1Stack : + { + . = ALIGN(16); + __stack_start = .; + . = . + 512; + __cpu1_stack = .; + } + .cpu2Stack : + { + . = . + 512; + __cpu2_stack = .; + } + .cpu3Stack : + { + . = . + 512; + __cpu3_stack = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} diff --git a/part14-spi-ethernet-interrupt/boot/sysregs.h b/part14-spi-ethernet-interrupt/boot/sysregs.h new file mode 100644 index 0000000..385cd79 --- /dev/null +++ b/part14-spi-ethernet-interrupt/boot/sysregs.h @@ -0,0 +1,44 @@ +#ifndef _SYSREGS_H +#define _SYSREGS_H + +// *************************************** +// SCTLR_EL1, System Control Register (EL1), Page 2654 of AArch64-Reference-Manual. +// *************************************** + +#define SCTLR_RESERVED (3 << 28) | (3 << 22) | (1 << 20) | (1 << 11) +#define SCTLR_EE_LITTLE_ENDIAN (0 << 25) +#define SCTLR_EOE_LITTLE_ENDIAN (0 << 24) +#define SCTLR_I_CACHE_DISABLED (0 << 12) +#define SCTLR_D_CACHE_DISABLED (0 << 2) +#define SCTLR_I_CACHE_ENABLED (1 << 12) +#define SCTLR_D_CACHE_ENABLED (1 << 2) +#define SCTLR_MMU_DISABLED (0 << 0) +#define SCTLR_MMU_ENABLED (1 << 0) + +#define SCTLR_VALUE_MMU_DISABLED (SCTLR_RESERVED | SCTLR_EE_LITTLE_ENDIAN | SCTLR_I_CACHE_ENABLED | SCTLR_D_CACHE_ENABLED | SCTLR_MMU_DISABLED) + +// *************************************** +// HCR_EL2, Hypervisor Configuration Register (EL2), Page 2487 of AArch64-Reference-Manual. +// *************************************** + +#define HCR_RW (1 << 31) +#define HCR_VALUE HCR_RW + +// *************************************** +// SCR_EL3, Secure Configuration Register (EL3), Page 2648 of AArch64-Reference-Manual. +// *************************************** + +#define SCR_RESERVED (3 << 4) +#define SCR_RW (1 << 10) +#define SCR_NS (1 << 0) +#define SCR_VALUE (SCR_RESERVED | SCR_RW | SCR_NS) + +// *************************************** +// SPSR_EL3, Saved Program Status Register (EL3) Page 389 of AArch64-Reference-Manual. +// *************************************** + +#define SPSR_MASK_ALL (7 << 6) +#define SPSR_EL1h (5 << 0) +#define SPSR_VALUE (SPSR_MASK_ALL | SPSR_EL1h) + +#endif diff --git a/part14-spi-ethernet-interrupt/config.txt b/part14-spi-ethernet-interrupt/config.txt new file mode 100644 index 0000000..c5cb68b --- /dev/null +++ b/part14-spi-ethernet-interrupt/config.txt @@ -0,0 +1,48 @@ +# For more options and information see +# http://rptl.io/configtxt +# Some settings may impact device functionality. See link above for details + +# Uncomment some or all of these to enable the optional hardware interfaces +#dtparam=i2c_arm=on +#dtparam=i2s=on +dtparam=spi=on + +# Enable audio (loads snd_bcm2835) +dtparam=audio=on + +# Additional overlays and parameters are documented +# /boot/firmware/overlays/README + +# Automatically load overlays for detected cameras +camera_auto_detect=1 + +# Automatically load overlays for detected DSI displays +display_auto_detect=1 + +# Automatically load initramfs files, if found +auto_initramfs=1 + +# Enable DRM VC4 V3D driver +dtoverlay=vc4-kms-v3d +max_framebuffers=2 + +# Don't have the firmware create an initial video= setting in cmdline.txt. +# Use the kernel's default instead. +disable_fw_kms_setup=1 + +# Run in 64-bit mode +arm_64bit=1 + +# Disable compensation for displays with overscan +disable_overscan=1 + +# Run as fast as firmware / board allows +arm_boost=1 + +[all] +kernel_old=1 +disable_commandline_tags=1 +core_freq_min=500 +hdmi_group=1 +hdmi_mode=16 + diff --git a/part14-spi-ethernet-interrupt/images/14-spi-ethernet-arp.jpg b/part14-spi-ethernet-interrupt/images/14-spi-ethernet-arp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69dbd1c5fa62dcd28e0bdb7abd161de7875f2c27 GIT binary patch literal 66069 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

_pT-Y3(mRjLqAmtB(hqqsET8|9Ky%r7>>d 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 V$rU2LMtW5-Q|=u-YMLuU|Jl@A@8 0) + *ptr++ = val; + return dest; +} + +void *memcpy(void *dest, const void *src, uint16_t len) +{ + uint8_t *d = dest; + const uint8_t *s = src; + while (len--) + *d++ = *s++; + return dest; +} + +uint8_t memcmp(void *str1, void *str2, unsigned count) +{ + uint8_t *s1 = str1; + uint8_t *s2 = str2; + + while (count-- > 0) + { + if (*s1++ != *s2++) + return s1[-1] < s2[-1] ? -1 : 1; + } + + return 0; +} + +// MAIN FUNCTIONS + +void SendArpPacket(uint8_t *targetIP, uint8_t *deviceMAC) +{ + /* Parameters: + * targetIP - The target IP Address for the ARP request (the one whose hardware + * address we want) + * deviceMAC - The MAC address of the ENC28J60, i.e. the source MAC for the ARP + * request + */ + + ARP arpPacket; + + // The source of the packet will be the ENC28J60 MAC address + memcpy(arpPacket.eth.SrcAddrs, deviceMAC, 6); + + // The destination is broadcast - a MAC address of FF:FF:FF:FF:FF:FF + memset(arpPacket.eth.DestAddrs, 0xFF, 6); + + arpPacket.eth.type = ARPPACKET; + arpPacket.hardware = ETHERNET; + + // We want an IP address resolved + + arpPacket.protocol = IPPACKET; + arpPacket.hardwareSize = 0x06; // sizeof(deviceMAC); + arpPacket.protocolSize = 0x04; // sizeof(deviceIP); + arpPacket.opCode = ARPREQUEST; + + // Target MAC is set to 0 as it is unknown + memset(arpPacket.targetMAC, 0, 6); + + // Sender MAC is the ENC28J60's MAC address + memcpy(arpPacket.senderMAC, deviceMAC, 6); + + // The target IP is the IP address we want resolved + memcpy(arpPacket.targetIP, targetIP, 4); + + // Check if the last reply has come from an IP address that we want i.e. someone else is already using it + if (!memcmp(targetIP, deviceIP, 4)) { + // Yes, someone is using our IP so set the sender IP to 0.0.0.0 + memset(arpPacket.senderIP, 0, 4); + } else { + // No, nobody is using our IP so we can use it confidently + memcpy(arpPacket.senderIP, deviceIP, 4); + } + + // Send the packet + + if (ENC_RestoreTXBuffer(&handle, sizeof(ARP)) == 0) { + uart_writeText("Sending ARP request.\n"); + + /*uart_writeText("My MAC is "); + uart_hex(myMAC[0]); + uart_writeText(":"); + uart_hex(myMAC[1]); + uart_writeText(":"); + uart_hex(myMAC[2]); + uart_writeText(":"); + uart_hex(myMAC[3]); + uart_writeText(":"); + uart_hex(myMAC[4]); + uart_writeText(":"); + uart_hex(myMAC[5]); + uart_writeText("\n");*/ + + ENC_WriteBuffer((unsigned char *)&arpPacket, sizeof(ARP)); + handle.transmitLength = sizeof(ARP); + + ENC_Transmit(&handle); + } +} + +void arp_test(void) +{ + ARP *checkPacket; + + SendArpPacket(routerIP, myMAC); + + uart_writeText("Waiting for ARP response.\n"); + + while (1) { + while (!ENC_GetReceivedFrame(&handle)); + + uint16_t len = handle.RxFrameInfos.length; + uint8_t *buffer = (uint8_t *)handle.RxFrameInfos.buffer; + checkPacket = (ARP *)buffer; + + if (len > 0) { + if (!memcmp(checkPacket->senderIP, routerIP, 4)) { + // Success! We have found our router's MAC address + + memcpy(routerMAC, checkPacket->senderMAC, 6); + uart_writeText("Router MAC is "); + uart_hex(routerMAC[0]); + uart_writeText(":"); + uart_hex(routerMAC[1]); + uart_writeText(":"); + uart_hex(routerMAC[2]); + uart_writeText(":"); + uart_hex(routerMAC[3]); + uart_writeText(":"); + uart_hex(routerMAC[4]); + uart_writeText(":"); + uart_hex(routerMAC[5]); + uart_writeText("\n"); + + break; + } + } + } +} + +void init_network(void) +{ + handle.Init.DuplexMode = ETH_MODE_HALFDUPLEX; + handle.Init.MACAddr = myMAC; + handle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE; + handle.Init.InterruptEnableBits = EIE_LINKIE | EIE_PKTIE; + + uart_writeText("Starting network up.\n"); + if (!ENC_Start(&handle)) { + uart_writeText("could not initialise network card.\n"); + } else { + uart_writeText("Setting MAC address to C0:FF:FE:C0:FF:FE.\n"); + + ENC_SetMacAddr(&handle); + + uart_writeText("Network card successfully initialised.\n"); + } + + uart_writeText("Waiting for ifup... \n"); + while (!(handle.LinkStatus & PHSTAT2_LSTAT)) ENC_IRQHandler(&handle); + uart_writeText("done.\n"); + + // Re-enable global interrupts + ENC_EnableInterrupts(EIE_INTIE); +} diff --git a/part14-spi-ethernet-interrupt/kernel/irq.c b/part14-spi-ethernet-interrupt/kernel/irq.c new file mode 100644 index 0000000..6e83ca3 --- /dev/null +++ b/part14-spi-ethernet-interrupt/kernel/irq.c @@ -0,0 +1,27 @@ +#include "kernel.h" + +void enable_interrupt_controller() { + REGS_IRQ->irq0_enable_0 = SYS_TIMER_IRQ_1 | SYS_TIMER_IRQ_3; +} + +void disable_interrupt_controller() { + REGS_IRQ->irq0_enable_0 = 0; +} + +void handle_irq() { + unsigned int irq = REGS_IRQ->irq0_pending_0; + + while(irq & (SYS_TIMER_IRQ_1 | SYS_TIMER_IRQ_3)) { + if (irq & SYS_TIMER_IRQ_1) { + irq &= ~SYS_TIMER_IRQ_1; + + handle_timer_1(); + } + + if (irq & SYS_TIMER_IRQ_3) { + irq &= ~SYS_TIMER_IRQ_3; + + handle_timer_3(); + } + } +} diff --git a/part14-spi-ethernet-interrupt/kernel/irqentry.S b/part14-spi-ethernet-interrupt/kernel/irqentry.S new file mode 100644 index 0000000..d24ae00 --- /dev/null +++ b/part14-spi-ethernet-interrupt/kernel/irqentry.S @@ -0,0 +1,160 @@ +#define SYNC_INVALID_EL1t 0 +#define IRQ_INVALID_EL1t 1 +#define FIQ_INVALID_EL1t 2 +#define ERROR_INVALID_EL1t 3 + +#define SYNC_INVALID_EL1h 4 +#define IRQ_INVALID_EL1h 5 +#define FIQ_INVALID_EL1h 6 +#define ERROR_INVALID_EL1h 7 + +#define SYNC_INVALID_EL0_64 8 +#define IRQ_INVALID_EL0_64 9 +#define FIQ_INVALID_EL0_64 10 +#define ERROR_INVALID_EL0_64 11 + +#define SYNC_INVALID_EL0_32 12 +#define IRQ_INVALID_EL0_32 13 +#define FIQ_INVALID_EL0_32 14 +#define ERROR_INVALID_EL0_32 15 + +//stack frame size +#define S_FRAME_SIZE 256 + +.macro kernel_entry + sub sp, sp, #S_FRAME_SIZE + stp x0, x1, [sp, #16 * 0] + stp x2, x3, [sp, #16 * 1] + stp x4, x5, [sp, #16 * 2] + stp x6, x7, [sp, #16 * 3] + stp x8, x9, [sp, #16 * 4] + stp x10, x11, [sp, #16 * 5] + stp x12, x13, [sp, #16 * 6] + stp x14, x15, [sp, #16 * 7] + stp x16, x17, [sp, #16 * 8] + stp x18, x19, [sp, #16 * 9] + stp x20, x21, [sp, #16 * 10] + stp x22, x23, [sp, #16 * 11] + stp x24, x25, [sp, #16 * 12] + stp x26, x27, [sp, #16 * 13] + stp x28, x29, [sp, #16 * 14] + str x30, [sp, #16 * 15] +.endm + +.macro kernel_exit + ldp x0, x1, [sp, #16 * 0] + ldp x2, x3, [sp, #16 * 1] + ldp x4, x5, [sp, #16 * 2] + ldp x6, x7, [sp, #16 * 3] + ldp x8, x9, [sp, #16 * 4] + ldp x10, x11, [sp, #16 * 5] + ldp x12, x13, [sp, #16 * 6] + ldp x14, x15, [sp, #16 * 7] + ldp x16, x17, [sp, #16 * 8] + ldp x18, x19, [sp, #16 * 9] + ldp x20, x21, [sp, #16 * 10] + ldp x22, x23, [sp, #16 * 11] + ldp x24, x25, [sp, #16 * 12] + ldp x26, x27, [sp, #16 * 13] + ldp x28, x29, [sp, #16 * 14] + ldr x30, [sp, #16 * 15] + add sp, sp, #S_FRAME_SIZE + eret +.endm + +.macro handle_invalid_entry type + kernel_entry + mov x0, #\type + mrs x1, esr_el1 + mrs x2, elr_el1 + + // We could pass this to a function to print an error here + // e.g. bl show_invalid_entry_message + // + // For now we'll just hang + + b err_hang +.endm + +.macro ventry label +.align 7 + b \label +.endm + +//Exception vectors table +.align 11 +.globl vectors +vectors: + ventry sync_invalid_el1t // Synchronous EL1t + ventry irq_invalid_el1t // IRQ EL1t + ventry fiq_invalid_el1t // FIQ EL1t + ventry error_invalid_el1t // Error EL1t + + ventry sync_invalid_el1h // Synchronous EL1h + ventry handle_el1_irq // IRQ EL1h + ventry fiq_invalid_el1h // FIQ EL1h + ventry error_invalid_el1h // Error EL1h + + ventry sync_invalid_el0_64 // Synchronous 64-bit EL0 + ventry irq_invalid_el0_64 // IRQ 64-bit EL0 + ventry fiq_invalid_el0_64 // FIQ 64-bit EL0 + ventry error_invalid_el0_64 // Error 64-bit EL0 + + ventry sync_invalid_el0_32 // Synchronous 32-bit EL0 + ventry irq_invalid_el0_32 // IRQ 32-bit EL0 + ventry fiq_invalid_el0_32 // FIQ 32-bit EL0 + ventry error_invalid_el0_32 // Error 32-bit EL0 + + +sync_invalid_el1t: + handle_invalid_entry SYNC_INVALID_EL1t + +irq_invalid_el1t: + handle_invalid_entry IRQ_INVALID_EL1t + +fiq_invalid_el1t: + handle_invalid_entry FIQ_INVALID_EL1t + +error_invalid_el1t: + handle_invalid_entry ERROR_INVALID_EL1t + +sync_invalid_el1h: + handle_invalid_entry SYNC_INVALID_EL1h + +fiq_invalid_el1h: + handle_invalid_entry FIQ_INVALID_EL1h + +error_invalid_el1h: + handle_invalid_entry ERROR_INVALID_EL1h + +sync_invalid_el0_64: + handle_invalid_entry SYNC_INVALID_EL0_64 + +irq_invalid_el0_64: + handle_invalid_entry IRQ_INVALID_EL0_64 + +fiq_invalid_el0_64: + handle_invalid_entry FIQ_INVALID_EL0_64 + +error_invalid_el0_64: + handle_invalid_entry ERROR_INVALID_EL0_64 + +sync_invalid_el0_32: + handle_invalid_entry SYNC_INVALID_EL0_32 + +irq_invalid_el0_32: + handle_invalid_entry IRQ_INVALID_EL0_32 + +fiq_invalid_el0_32: + handle_invalid_entry FIQ_INVALID_EL0_32 + +error_invalid_el0_32: + handle_invalid_entry ERROR_INVALID_EL0_32 + +handle_el1_irq: + kernel_entry + bl handle_irq + kernel_exit + +.globl err_hang +err_hang: b err_hang diff --git a/part14-spi-ethernet-interrupt/kernel/kernel.c b/part14-spi-ethernet-interrupt/kernel/kernel.c new file mode 100644 index 0000000..41d3d6e --- /dev/null +++ b/part14-spi-ethernet-interrupt/kernel/kernel.c @@ -0,0 +1,150 @@ +#include "../include/io.h" +#include "../include/spi.h" +#include "../include/multicore.h" +#include "kernel.h" + +void wait_msec(unsigned int n) +{ + register unsigned long f, t, r; + + // Get the current counter frequency + asm volatile ("mrs %0, cntfrq_el0" : "=r"(f)); + // Read the current counter + asm volatile ("mrs %0, cntpct_el0" : "=r"(t)); + // Calculate expire value for counter + t+=((f/1000)*n)/1000; + do{asm volatile ("mrs %0, cntpct_el0" : "=r"(r));}while(rcounter_lo; + timer1_val += timer1_int; + REGS_TIMER->compare[1] = timer1_val; + + timer3_val = REGS_TIMER->counter_lo; + timer3_val += timer3_int; + REGS_TIMER->compare[3] = timer3_val; +} + +void handle_timer_1() { + timer1_val += timer1_int; + REGS_TIMER->compare[1] = timer1_val; + REGS_TIMER->control_status |= SYS_TIMER_IRQ_1; + + unsigned int progval = timer1_val / timer1_int; + if (progval <= 100) { + //drawProgress(2, progval); + } else { + uart_writeText("Timer 1 done.\n"); + } +} + +void handle_timer_3() { + timer3_val += timer3_int; + REGS_TIMER->compare[3] = timer3_val; + REGS_TIMER->control_status |= SYS_TIMER_IRQ_3; + + unsigned int progval = timer3_val / timer3_int; + if (progval <= 100); // drawProgress(3, progval); +} + +unsigned long HAL_GetTick(void) { + unsigned int hi = REGS_TIMER->counter_hi; + unsigned int lo = REGS_TIMER->counter_lo; + + //double check hi value didn't change after setting it... + if (hi != REGS_TIMER->counter_hi) { + hi = REGS_TIMER->counter_hi; + lo = REGS_TIMER->counter_lo; + } + + return ((unsigned long)hi << 32) | lo; +} + +void HAL_Delay(unsigned int ms) { + unsigned long start = HAL_GetTick(); + + while(HAL_GetTick() < start + (ms * 1000)); +} + +void main(void) +{ + uart_init(); + uart_writeText("uart initialised.\n"); + + //uart_writeText("Kick it off on core 1\n"); + //start_core1(core1_main); + + // Kick off the timers + + irq_init_vectors(); + enable_interrupt_controller(); + irq_barrier(); + irq_enable(); + timer_init(); + + uart_writeText("Kick it off on core 3\n"); + + start_core3(core3_main); + + //uart_writeText("Kick it off on core 0\n"); + //core0_main(); + + // Disable IRQs and loop endlessly + + irq_disable(); + disable_interrupt_controller(); + + while(1); +} diff --git a/part14-spi-ethernet-interrupt/kernel/kernel.h b/part14-spi-ethernet-interrupt/kernel/kernel.h new file mode 100644 index 0000000..ad56d4d --- /dev/null +++ b/part14-spi-ethernet-interrupt/kernel/kernel.h @@ -0,0 +1,51 @@ +#define PERIPHERAL_BASE 0xFE000000 +#define CLOCKHZ 1000000 + +struct timer_regs { + volatile unsigned int control_status; + volatile unsigned int counter_lo; + volatile unsigned int counter_hi; + volatile unsigned int compare[4]; +}; + +#define REGS_TIMER ((struct timer_regs *)(PERIPHERAL_BASE + 0x00003000)) + +struct arm_irq_regs_2711 { + volatile unsigned int irq0_pending_0; + volatile unsigned int irq0_pending_1; + volatile unsigned int irq0_pending_2; + volatile unsigned int res0; + volatile unsigned int irq0_enable_0; + volatile unsigned int irq0_enable_1; + volatile unsigned int irq0_enable_2; + volatile unsigned int res1; + volatile unsigned int irq0_disable_0; + volatile unsigned int irq0_disable_1; + volatile unsigned int irq0_disable_2; +}; + +typedef struct arm_irq_regs_2711 arm_irq_regs; + +#define REGS_IRQ ((arm_irq_regs *)(PERIPHERAL_BASE + 0x0000B200)) + +enum vc_irqs { + SYS_TIMER_IRQ_0 = 1, + SYS_TIMER_IRQ_1 = 2, + SYS_TIMER_IRQ_2 = 4, + SYS_TIMER_IRQ_3 = 8, + AUX_IRQ = (1 << 29) +}; + +void irq_init_vectors(); +void irq_enable(); +void irq_barrier(); +void irq_disable(); +void enable_interrupt_controller(); +void disable_interrupt_controller(); + +void handle_timer_1(); +void handle_timer_3(); + +void init_network(void); +void arp_test(void); +void wait_msec(unsigned int n); \ No newline at end of file diff --git a/part14-spi-ethernet-interrupt/kernel/utils.S b/part14-spi-ethernet-interrupt/kernel/utils.S new file mode 100644 index 0000000..7a34152 --- /dev/null +++ b/part14-spi-ethernet-interrupt/kernel/utils.S @@ -0,0 +1,20 @@ +.globl irq_init_vectors +irq_init_vectors: + adr x0, vectors + msr vbar_el1, x0 + ret + +.globl irq_enable +irq_enable: + msr daifclr, #2 + ret + +.globl irq_disable +irq_disable: + msr daifset, #2 + ret + +.globl irq_barrier +irq_barrier: + dsb sy + ret diff --git a/part14-spi-ethernet-interrupt/lib/io.c b/part14-spi-ethernet-interrupt/lib/io.c new file mode 100644 index 0000000..34a02aa --- /dev/null +++ b/part14-spi-ethernet-interrupt/lib/io.c @@ -0,0 +1,199 @@ +#include "../include/io.h" + +// GPIO + +enum { + GPFSEL0 = PERIPHERAL_BASE + 0x200000, + GPSET0 = PERIPHERAL_BASE + 0x20001C, + GPCLR0 = PERIPHERAL_BASE + 0x200028, + GPPUPPDN0 = PERIPHERAL_BASE + 0x2000E4 +}; + +enum { + GPIO_MAX_PIN = 53, + GPIO_FUNCTION_OUT = 1, + GPIO_FUNCTION_ALT5 = 2, + GPIO_FUNCTION_ALT3 = 7, + GPIO_FUNCTION_ALT0 = 4 +}; + +enum { + Pull_None = 0, + Pull_Down = 1, // Are down and up the right way around? + Pull_Up = 2 +}; + +void mmio_write(long reg, unsigned int val) { *(volatile unsigned int *)reg = val; } +unsigned int mmio_read(long reg) { return *(volatile unsigned int *)reg; } + +unsigned int gpio_call(unsigned int pin_number, unsigned int value, unsigned int base, unsigned int field_size, unsigned int field_max) { + unsigned int field_mask = (1 << field_size) - 1; + + if (pin_number > field_max) return 0; + if (value > field_mask) return 0; + + unsigned int num_fields = 32 / field_size; + unsigned int reg = base + ((pin_number / num_fields) * 4); + unsigned int shift = (pin_number % num_fields) * field_size; + + unsigned int curval = mmio_read(reg); + curval &= ~(field_mask << shift); + curval |= value << shift; + mmio_write(reg, curval); + + return 1; +} + +unsigned int gpio_set (unsigned int pin_number, unsigned int value) { return gpio_call(pin_number, value, GPSET0, 1, GPIO_MAX_PIN); } +unsigned int gpio_clear (unsigned int pin_number, unsigned int value) { return gpio_call(pin_number, value, GPCLR0, 1, GPIO_MAX_PIN); } +unsigned int gpio_pull (unsigned int pin_number, unsigned int value) { return gpio_call(pin_number, value, GPPUPPDN0, 2, GPIO_MAX_PIN); } +unsigned int gpio_function(unsigned int pin_number, unsigned int value) { return gpio_call(pin_number, value, GPFSEL0, 3, GPIO_MAX_PIN); } + +void gpio_useAsAlt0(unsigned int pin_number) { + gpio_pull(pin_number, Pull_None); + gpio_function(pin_number, GPIO_FUNCTION_ALT0); +} + +void gpio_useAsAlt3(unsigned int pin_number) { + gpio_pull(pin_number, Pull_None); + gpio_function(pin_number, GPIO_FUNCTION_ALT3); +} + +void gpio_useAsAlt5(unsigned int pin_number) { + gpio_pull(pin_number, Pull_None); + gpio_function(pin_number, GPIO_FUNCTION_ALT5); +} + +void gpio_initOutputPinWithPullNone(unsigned int pin_number) { + gpio_pull(pin_number, Pull_None); + gpio_function(pin_number, GPIO_FUNCTION_OUT); +} + +void gpio_setPinOutputBool(unsigned int pin_number, unsigned int onOrOff) { + if (onOrOff) { + gpio_set(pin_number, 1); + } else { + gpio_clear(pin_number, 1); + } +} + +// UART + +enum { + AUX_BASE = PERIPHERAL_BASE + 0x215000, + AUX_IRQ = AUX_BASE, + AUX_ENABLES = AUX_BASE + 4, + AUX_MU_IO_REG = AUX_BASE + 64, + AUX_MU_IER_REG = AUX_BASE + 68, + AUX_MU_IIR_REG = AUX_BASE + 72, + AUX_MU_LCR_REG = AUX_BASE + 76, + AUX_MU_MCR_REG = AUX_BASE + 80, + AUX_MU_LSR_REG = AUX_BASE + 84, + AUX_MU_MSR_REG = AUX_BASE + 88, + AUX_MU_SCRATCH = AUX_BASE + 92, + AUX_MU_CNTL_REG = AUX_BASE + 96, + AUX_MU_STAT_REG = AUX_BASE + 100, + AUX_MU_BAUD_REG = AUX_BASE + 104, + AUX_UART_CLOCK = 500000000, + UART_MAX_QUEUE = 16 * 1024 +}; + +#define AUX_MU_BAUD(baud) ((AUX_UART_CLOCK/(baud*8))-1) + +unsigned char uart_output_queue[UART_MAX_QUEUE]; +unsigned int uart_output_queue_write = 0; +unsigned int uart_output_queue_read = 0; + +void uart_init() { + mmio_write(AUX_ENABLES, 1); //enable UART1 + mmio_write(AUX_MU_IER_REG, 0); + mmio_write(AUX_MU_CNTL_REG, 0); + mmio_write(AUX_MU_LCR_REG, 3); //8 bits + mmio_write(AUX_MU_MCR_REG, 0); + mmio_write(AUX_MU_IER_REG, 0); + mmio_write(AUX_MU_IIR_REG, 0xC6); //disable interrupts + mmio_write(AUX_MU_BAUD_REG, AUX_MU_BAUD(115200)); + gpio_useAsAlt5(14); + gpio_useAsAlt5(15); + mmio_write(AUX_MU_CNTL_REG, 3); //enable RX/TX +} + +unsigned int uart_isOutputQueueEmpty() { + return uart_output_queue_read == uart_output_queue_write; +} + +unsigned int uart_isReadByteReady() { return mmio_read(AUX_MU_LSR_REG) & 0x01; } +unsigned int uart_isWriteByteReady() { return mmio_read(AUX_MU_LSR_REG) & 0x20; } + +unsigned char uart_readByte() { + while (!uart_isReadByteReady()); + return (unsigned char)mmio_read(AUX_MU_IO_REG); +} + +void uart_writeByteBlockingActual(unsigned char ch) { + while (!uart_isWriteByteReady()); + mmio_write(AUX_MU_IO_REG, (unsigned int)ch); +} + +void uart_loadOutputFifo() { + while (!uart_isOutputQueueEmpty() && uart_isWriteByteReady()) { + uart_writeByteBlockingActual(uart_output_queue[uart_output_queue_read]); + uart_output_queue_read = (uart_output_queue_read + 1) & (UART_MAX_QUEUE - 1); // Don't overrun + } +} + +void uart_writeByteBlocking(unsigned char ch) { + unsigned int next = (uart_output_queue_write + 1) & (UART_MAX_QUEUE - 1); // Don't overrun + + while (next == uart_output_queue_read) uart_loadOutputFifo(); + + uart_output_queue[uart_output_queue_write] = ch; + uart_output_queue_write = next; +} + +void uart_writeText(char *buffer) { + while (*buffer) { + if (*buffer == '\n') uart_writeByteBlockingActual('\r'); + uart_writeByteBlockingActual(*buffer++); + } +} + +void uart_drainOutputQueue() { + while (!uart_isOutputQueueEmpty()) uart_loadOutputFifo(); +} + +void uart_update() { + uart_loadOutputFifo(); + + if (uart_isReadByteReady()) { + unsigned char ch = uart_readByte(); + if (ch == '\r') uart_writeText("\n"); else uart_writeByteBlocking(ch); + } +} + +void uart_hex(unsigned int d) { + unsigned int n; + int c; + for(c=28;c>=0;c-=4) { + // get highest tetrad + n=(d>>c)&0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n+=n>9?0x37:0x30; + + uart_writeByteBlockingActual(n); + } +} + +void uart_byte(unsigned char b) { + unsigned int n; + int c; + for(c=4;c>=0;c-=4) { + // get highest tetrad + n=(b>>c)&0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n+=n>9?0x37:0x30; + + uart_writeByteBlockingActual(n); + } + uart_writeByteBlockingActual(' '); +} diff --git a/part14-spi-ethernet-interrupt/lib/mb.c b/part14-spi-ethernet-interrupt/lib/mb.c new file mode 100644 index 0000000..65dbbb8 --- /dev/null +++ b/part14-spi-ethernet-interrupt/lib/mb.c @@ -0,0 +1,39 @@ +#include "../include/io.h" + +// The buffer must be 16-byte aligned as only the upper 28 bits of the address can be passed via the mailbox +volatile unsigned int __attribute__((aligned(16))) mbox[36]; + +enum { + VIDEOCORE_MBOX = (PERIPHERAL_BASE + 0x0000B880), + MBOX_READ = (VIDEOCORE_MBOX + 0x0), + MBOX_POLL = (VIDEOCORE_MBOX + 0x10), + MBOX_SENDER = (VIDEOCORE_MBOX + 0x14), + MBOX_STATUS = (VIDEOCORE_MBOX + 0x18), + MBOX_CONFIG = (VIDEOCORE_MBOX + 0x1C), + MBOX_WRITE = (VIDEOCORE_MBOX + 0x20), + MBOX_RESPONSE = 0x80000000, + MBOX_FULL = 0x80000000, + MBOX_EMPTY = 0x40000000 +}; + +unsigned int mbox_call(unsigned char ch) +{ + // 28-bit address (MSB) and 4-bit value (LSB) + unsigned int r = ((unsigned int)((long) &mbox) &~ 0xF) | (ch & 0xF); + + // Wait until we can write + while (mmio_read(MBOX_STATUS) & MBOX_FULL); + + // Write the address of our buffer to the mailbox with the channel appended + mmio_write(MBOX_WRITE, r); + + while (1) { + // Is there a reply? + while (mmio_read(MBOX_STATUS) & MBOX_EMPTY); + + // Is it a reply to our message? + if (r == mmio_read(MBOX_READ)) return mbox[1]==MBOX_RESPONSE; // Is it successful? + + } + return 0; +} diff --git a/part14-spi-ethernet-interrupt/lib/multicore.c b/part14-spi-ethernet-interrupt/lib/multicore.c new file mode 100644 index 0000000..0000bcd --- /dev/null +++ b/part14-spi-ethernet-interrupt/lib/multicore.c @@ -0,0 +1,44 @@ +#include "../include/multicore.h" + +void store32(unsigned long address, unsigned long value) +{ + *(unsigned long *) address = value; +} + +unsigned long load32(unsigned long address) +{ + return *(unsigned long *) address; +} + +void start_core1(void (*func)(void)) +{ + store32((unsigned long)&spin_cpu1, (unsigned long)func); + asm volatile ("sev"); +} + +void start_core2(void (*func)(void)) +{ + store32((unsigned long)&spin_cpu2, (unsigned long)func); + asm volatile ("sev"); +} + +void start_core3(void (*func)(void)) +{ + store32((unsigned long)&spin_cpu3, (unsigned long)func); + asm volatile ("sev"); +} + +void clear_core1(void) +{ + store32((unsigned long)&spin_cpu1, 0); +} + +void clear_core2(void) +{ + store32((unsigned long)&spin_cpu2, 0); +} + +void clear_core3(void) +{ + store32((unsigned long)&spin_cpu3, 0); +} diff --git a/part14-spi-ethernet-interrupt/lib/spi.c b/part14-spi-ethernet-interrupt/lib/spi.c new file mode 100644 index 0000000..09085ef --- /dev/null +++ b/part14-spi-ethernet-interrupt/lib/spi.c @@ -0,0 +1,99 @@ +#include "../include/io.h" + +// SPI + +struct Spi0Regs { + volatile unsigned int cs; + volatile unsigned int fifo; + volatile unsigned int clock; + volatile unsigned int data_length; + volatile unsigned int ltoh; + volatile unsigned int dc; +}; + +#define REGS_SPI0 ((struct Spi0Regs *)(PERIPHERAL_BASE + 0x00204000)) + +// CS Register +#define CS_LEN_LONG (1 << 25) +#define CS_DMA_LEN (1 << 24) +#define CS_CSPOL2 (1 << 23) +#define CS_CSPOL1 (1 << 22) +#define CS_CSPOL0 (1 << 21) +#define CS_RXF (1 << 20) +#define CS_RXR (1 << 19) +#define CS_TXD (1 << 18) +#define CS_RXD (1 << 17) +#define CS_DONE (1 << 16) +#define CS_LEN (1 << 13) +#define CS_REN (1 << 12) +#define CS_ADCS (1 << 11) +#define CS_INTR (1 << 10) +#define CS_INTD (1 << 9) +#define CS_DMAEN (1 << 8) +#define CS_TA (1 << 7) +#define CS_CSPOL (1 << 6) +#define CS_CLEAR_RX (1 << 5) +#define CS_CLEAR_TX (1 << 4) +#define CS_CPOL__SHIFT 3 +#define CS_CPHA__SHIFT 2 +#define CS_CS (1 << 0) +#define CS_CS__SHIFT 0 + +void spi_init() { + gpio_useAsAlt0(7); //CS1 + gpio_initOutputPinWithPullNone(8); //CS0 + gpio_useAsAlt0(9); //MISO + gpio_useAsAlt0(10); //MOSI + gpio_useAsAlt0(11); //SCLK +} + +void spi_chip_select(unsigned char chip_select) { + gpio_setPinOutputBool(8, chip_select); +} + +void spi_send_recv(unsigned char *sbuffer, unsigned char *rbuffer, unsigned int size) { + REGS_SPI0->data_length = size; + REGS_SPI0->cs = REGS_SPI0->cs | CS_CLEAR_RX | CS_CLEAR_TX | CS_TA; + + unsigned int read_count = 0; + unsigned int write_count = 0; + + while(read_count < size || write_count < size) { + while(write_count < size && REGS_SPI0->cs & CS_TXD) { + if (sbuffer) { + REGS_SPI0->fifo = *sbuffer++; + } else { + REGS_SPI0->fifo = 0; + } + + write_count++; + } + + while(read_count < size && REGS_SPI0->cs & CS_RXD) { + unsigned int data = REGS_SPI0->fifo; + + if (rbuffer) { + *rbuffer++ = data; + } + + read_count++; + } + } + + while(!(REGS_SPI0->cs & CS_DONE)) { + while(REGS_SPI0->cs & CS_RXD) { + unsigned int r = REGS_SPI0->fifo; + uart_hex(r); + } + } + + REGS_SPI0->cs = (REGS_SPI0->cs & ~CS_TA); +} + +void spi_send(unsigned char *data, unsigned int size) { + spi_send_recv(data, 0, size); +} + +void spi_recv(unsigned char *data, unsigned int size) { + spi_send_recv(0, data, size); +} diff --git a/part14-spi-ethernet-interrupt/net/enc28j60.c b/part14-spi-ethernet-interrupt/net/enc28j60.c new file mode 100644 index 0000000..b4fab55 --- /dev/null +++ b/part14-spi-ethernet-interrupt/net/enc28j60.c @@ -0,0 +1,1450 @@ +/** + ****************************************************************************** + * @file enc28j60.c + * @author Christian Schoffit, portions from Gregory Nutt: + * Copyright (C) 2010-2012, 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * @version V1.0.0 + * @date 02-June-2015 + * @brief This file provides a set of functions needed to manage the ENC28J60 + * Stand-Alone Ethernet Controller with SPI Interface. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2015 Christian Schoffit

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of Christian Schoffit nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* +Module Feature Issue Issue Summary Affected Revisions + B1 B4 B5 B7 +MAC Interface - 1. MAC registers unreliable with slow asynchronous SPI clock X X +Reset - 2. CLKRDY set early X X X X +Core Operating 3. Industrial (-40�C to +85�C) temperature range unsupported X X + Specifications +Oscillator CLKOUT pin 4. CLKOUT unavailable in Power Save mode X X X X +Memory Ethernet 5. Receive buffer must start at 0000h X X X X + Buffer +Interrupts - 6. Receive Packet Pending Interrupt Flag (PKTIF) unreliable X X X X +PHY - 7. TPIN+/- automatic polarity detection and correction + unreliable X X X X +PHY - 8. RBIAS resistor value differs between silicon revisions X X +PHY - 9. Internal loopback in half-duplex unreliable X X X X +PHY - 10. Internal loopback in full-duplex unreliable X X X X +PHY LEDs - 11. Combined Collision and Duplex Status mode unavailable X X X X +Transmit - 12. Transmit abort may stall transmit logic X X X X +Logic +PHY - 13. Received link pulses potentially cause collisions X X +Memory Ethernet 14. Even values in ERXRDPT may corrupt receive buffer X X X X + Buffer +Transmit - 15. LATECOL Status bit unreliable X X X X +Logic +PHY LEDs - 16. LED auto-polarity detection unreliable X X X X +DMA - 17. DMA checksum calculations will abort receive packets X X X X +Receive - 18. Pattern match filter allows reception of extra packets X X X X +Filter +SPI - 19. Reset command unavailable in Power Save mode X X X X +Interface + +Only workaround relative to issues affecting B7 silicon revision are implemented. Therefore, issues +specific to Ethernet conformance are not addressed, since they only affect B1 and B3 silicon revisions. + +Erratas 7, 8, 16... have workaround implemented by hardware + +Errata 18 is implemented in lwip stack +*/ + +/* Includes ------------------------------------------------------------------*/ +#include "enc28j60.h" + +/** @addtogroup BSP + * @{ + */ + +/** @addtogroup Components + * @{ + */ + +/** @defgroup ENC28J60 + * @{ + */ + +/** @defgroup ENC28J60_Private_Types_Definitions + * @{ + */ + +/** @defgroup ENC28J60_Private_Defines + * @{ + */ + +/* Poll timeout */ + +#define ENC_POLLTIMEOUT 50 + +/** + * @} + */ + +/** @defgroup ENC28J60_Private_Macros + * @{ + */ + +/* Packet Memory ************************************************************/ + +/* Packet memory layout */ + +#define ALIGNED_BUFSIZE ((CONFIG_NET_ETH_MTU + 255) & ~255) + +/* Work around Errata #5 (spurious reset of ERXWRPT to 0) by placing the RX + * FIFO at the beginning of packet memory. + */ + +# define PKTMEM_RX_START 0x0000 /* RX buffer must be at addr 0 for errata 5 */ +# define PKTMEM_RX_END (PKTMEM_END-ALIGNED_BUFSIZE) /* RX buffer length is total SRAM minus TX buffer */ +# define PKTMEM_TX_START (PKTMEM_RX_END+1) /* Start TX buffer after */ +# define PKTMEM_TX_ENDP1 (PKTMEM_TX_START+ALIGNED_BUFSIZE) /* Allow TX buffer for two frames */ + +/* Misc. Helper Macros ******************************************************/ + +#define enc_rdgreg(ctrlreg) \ + enc_rdgreg2(ENC_RCR | GETADDR(ctrlreg)) +#define enc_wrgreg(ctrlreg, wrdata) \ + enc_wrgreg2(ENC_WCR | GETADDR(ctrlreg), wrdata) +#define enc_bfcgreg(ctrlreg,clrbits) \ + enc_wrgreg2(ENC_BFC | GETADDR(ctrlreg), clrbits) +#define enc_bfsgreg(ctrlreg,setbits) \ + enc_wrgreg2(ENC_BFS | GETADDR(ctrlreg), setbits) + +/** + * @} + */ + +/** @defgroup ENC28J60_Private_Variables + * @{ + */ + + /* Stores how many iterations the microcontroller can do in 1 �s */ +static uint32_t iter_per_us=0; + +/** + * @} + */ + +/** @defgroup ENC28J60_Private_Function_Prototypes + * @{ + */ +/** + * @} + */ + +/** @defgroup ENC28J60_Private_Functions + * @{ + */ + +/** + Calibrate the constant time + **/ + +static void calibrate(void) +{ + uint32_t time; + volatile uint32_t i; + + iter_per_us = 1000000; + + time = HAL_GetTick(); + /* Wait for next tick */ + while (HAL_GetTick() == time) { + /* wait */ + } + for (i=0; ibank = 0; /* Initialize the trace on the current selected bank */ + //up_mdelay(2); + HAL_Delay(2); /* >1000 �s, conforms to errata #2 */ +} + +/**************************************************************************** + * Function: enc_setbank + * + * Description: + * Set the bank for these next control register access. + * + * Assumption: + * The caller has exclusive access to the SPI bus + * + * Parameters: + * handle - Reference to the driver state structure + * bank - The bank to select (0-3) + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void enc_setbank(ENC_HandleTypeDef *handle, uint8_t bank) { + + if (bank != handle->bank) { + /* Select bank 0 (just so that all of the bits are cleared) */ + + enc_bfcgreg(ENC_ECON1, ECON1_BSEL_MASK); + + /* Then OR in bits to get the correct bank */ + + if (bank != 0) + { + enc_bfsgreg(ENC_ECON1, (bank << ECON1_BSEL_SHIFT)); + } + + /* Then remember the bank setting */ + + handle->bank = bank; + } +} + +/**************************************************************************** + * Function: enc_rdbreg + * + * Description: + * Read from a banked control register using the RCR command. + * + * Parameters: + * handle - Reference to the driver state structure + * ctrlreg - Bit encoded address of banked register to read + * + * Returned Value: + * The byte read from the banked register + * + * Assumptions: + * + ****************************************************************************/ + +static uint8_t enc_rdbreg(ENC_HandleTypeDef *handle, uint8_t ctrlreg) +{ + uint8_t data[3]; + + /* Set the bank */ + + enc_setbank(handle, GETBANK(ctrlreg)); + + /* Send the RCR command and collect the data. How we collect the data + * depends on if this is a PHY/CAN or not. The normal sequence requires + * 16-clocks: 8 to clock out the cmd and 8 to clock in the data. + */ + + data[0] = ENC_RCR | GETADDR(ctrlreg); + + /* The PHY/MAC sequence requires 24-clocks: 8 to clock out the cmd, + * 8 dummy bits, and 8 to clock in the PHY/MAC data. + */ + + ENC_SPI_SendBuf(data, data, (ISPHYMAC(ctrlreg))?3:2); + return (ISPHYMAC(ctrlreg))?data[2]:data[1]; +} + +/**************************************************************************** + * Function: enc_wrbreg + * + * Description: + * Write to a banked control register using the WCR command. Unlike + * reading, this same SPI sequence works for normal, MAC, and PHY + * registers. + * + * Parameters: + * handle - Reference to the driver state structure + * ctrlreg - Bit encoded address of banked register to write + * wrdata - The data to send + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static void enc_wrbreg(ENC_HandleTypeDef *handle, uint8_t ctrlreg, + uint8_t wrdata) +{ + uint8_t data[2]; + + /* Set the bank */ + + enc_setbank(handle, GETBANK(ctrlreg)); + + /* Send the WCR command and data. The sequence requires 16-clocks: + * 8 to clock out the cmd + 8 to clock out the data. + */ + + data[0] = ENC_WCR | GETADDR(ctrlreg); + data[1] = wrdata; + + ENC_SPI_SendBuf(data, NULL, 2); +} + +/**************************************************************************** + * Function: enc_waitbreg + * + * Description: + * Wait until banked register bit(s) take a specific value (or a timeout + * occurs). + * + * Parameters: + * handle - Reference to the driver state structure + * ctrlreg - Bit encoded address of banked register to check + * bits - The bits to check (a mask) + * value - The value of the bits to return (value under mask) + * + * Returned Value: + * OK on success, negated errno on failure + * + * Assumptions: + * + ****************************************************************************/ + +static bool enc_waitbreg(ENC_HandleTypeDef *handle, uint8_t ctrlreg, + uint8_t bits, uint8_t value) +{ + uint32_t start = HAL_GetTick(); + uint32_t elapsed; + uint8_t rddata; + + /* Loop until the exit condition is met */ + + do + { + /* Read the byte from the requested banked register */ + + rddata = enc_rdbreg(handle, ctrlreg); + elapsed = HAL_GetTick() - start; + } + while ((rddata & bits) != value && elapsed < ENC_POLLTIMEOUT); + + return (rddata & bits) == value; +} + + +/**************************************************************************** + * Function: enc_rdphy + * + * Description: + * Read 16-bits of PHY data. + * + * Parameters: + * priv - Reference to the driver state structure + * phyaddr - The PHY register address + * + * Returned Value: + * 16-bit value read from the PHY + * + * Assumptions: + * + ****************************************************************************/ + +static uint16_t enc_rdphy(ENC_HandleTypeDef *handle, uint8_t phyaddr) +{ + uint16_t data = 0; + + /* "To read from a PHY register: + * + * 1. Write the address of the PHY register to read from into the MIREGADR + * register. + */ + + enc_wrbreg(handle, ENC_MIREGADR, phyaddr); + + /* 2. Set the MICMD.MIIRD bit. The read operation begins and the + * MISTAT.BUSY bit is set. + */ + + enc_wrbreg(handle, ENC_MICMD, MICMD_MIIRD); + + /* 3. Wait 10.24 �s. Poll the MISTAT.BUSY bit to be certain that the + * operation is complete. While busy, the host controller should not + * start any MIISCAN operations or write to the MIWRH register. + * + * When the MAC has obtained the register contents, the BUSY bit will + * clear itself. + */ + +// volatile int i; +// for (i=0; i<12*17; i++) { +// } + + up_udelay(12); + + if (enc_waitbreg(handle, ENC_MISTAT, MISTAT_BUSY, 0x00)) + { + /* 4. Clear the MICMD.MIIRD bit. */ + + enc_wrbreg(handle, ENC_MICMD, 0x00); + + /* 5. Read the desired data from the MIRDL and MIRDH registers. The + * order that these bytes are accessed is unimportant." + */ + + data = (uint16_t)enc_rdbreg(handle, ENC_MIRDL); + data |= (uint16_t)enc_rdbreg(handle, ENC_MIRDH) << 8; + } + + return data; +} + +/**************************************************************************** + * Function: enc_wrphy + * + * Description: + * write 16-bits of PHY data. + * + * Parameters: + * handle - Reference to the driver state structure + * phyaddr - The PHY register address + * phydata - 16-bit data to write to the PHY + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static void enc_wrphy(ENC_HandleTypeDef *handle, uint8_t phyaddr, + uint16_t phydata) +{ + /* "To write to a PHY register: + * + * 1. Write the address of the PHY register to write to into the + * MIREGADR register. + */ + + enc_wrbreg(handle, ENC_MIREGADR, phyaddr); + + /* 2. Write the lower 8 bits of data to write into the MIWRL register. */ + + enc_wrbreg(handle, ENC_MIWRL, phydata); + + /* 3. Write the upper 8 bits of data to write into the MIWRH register. + * Writing to this register automatically begins the MIIM transaction, + * so it must be written to after MIWRL. The MISTAT.BUSY bit becomes + * set. + */ + + enc_wrbreg(handle, ENC_MIWRH, phydata >> 8); + + /* The PHY register will be written after the MIIM operation completes, + * which takes 10.24 �s. When the write operation has completed, the BUSY + * bit will clear itself. + * + * The host controller should not start any MIISCAN or MIIRD operations + * while busy." + */ + + /* wait for approx 12 �s */ +// volatile int i; +// for (i=0; i<12*17; i++) { +// } + + up_udelay(12); + enc_waitbreg(handle, ENC_MISTAT, MISTAT_BUSY, 0x00); +} + + +/**************************************************************************** + * Function: enc_pwrfull + * + * Description: + * When normal operation is desired, the host controller must perform + * a slightly modified procedure: + * + * 1. Wake-up by clearing ECON2.PWRSV. + * 2. Wait at least 300 �s for the PHY to stabilize. To accomplish the + * delay, the host controller may poll ESTAT.CLKRDY and wait for it + * to become set. + * 3. Restore receive capability by setting ECON1.RXEN. + * + * After leaving Sleep mode, there is a delay of many milliseconds + * before a new link is established (assuming an appropriate link + * partner is present). The host controller may wish to wait until + * the link is established before attempting to transmit any packets. + * The link status can be determined by polling the PHSTAT2.LSTAT bit. + * Alternatively, the link change interrupt may be used if it is + * enabled. + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +/* Power save mode not used (fix errata 4 and 19) */ +#if 0 +static void enc_pwrfull(ENC_HandleTypeDef *handle) +{ + /* 1. Wake-up by clearing ECON2.PWRSV. */ + + enc_bfcgreg(ENC_ECON2, ECON2_PWRSV); + + /* 2. Wait at least 300 �s for the PHY to stabilize. To accomplish the + * delay, the host controller may poll ESTAT.CLKRDY and wait for it to + * become set. + */ + + /* wait for approx 350 �s */ +// volatile int i; +// for (i=0; i<350*17; i++) { +// } + + up_udelay(350); + + enc_waitbreg(handle, ENC_ESTAT, ESTAT_CLKRDY, ESTAT_CLKRDY); + + /* 3. Restore receive capability by setting ECON1.RXEN. + * + * The caller will do this when it is ready to receive packets + */ +} +#endif + +/** + * @brief Initialize the enc28j60 and configure the needed hardware resources + * @param handle: Handle on data configuration. + * @retval None + */ +bool ENC_Start(ENC_HandleTypeDef *handle) +{ + /* register value */ + uint8_t regval; + + /* Calibrate time constant */ + calibrate(); + + /* System reset */ + enc_reset(handle); + + /* Use bank 0 */ + enc_setbank(handle, 0); + + /* Check if we are actually communicating with the ENC28J60. If its + * 0x00 or 0xff, then we are probably not communicating correctly + * via SPI. + */ + + regval = enc_rdbreg(handle, ENC_EREVID); + if (regval == 0x00 || regval == 0xff) { + return false; + } + + /* Initialize ECON2: Enable address auto increment. + */ + + enc_wrgreg(ENC_ECON2, ECON2_AUTOINC /* | ECON2_VRPS*/); + + /* Initialize receive buffer. + * First, set the receive buffer start address. + */ + + handle->nextpkt = PKTMEM_RX_START; + enc_wrbreg(handle, ENC_ERXSTL, PKTMEM_RX_START & 0xff); + enc_wrbreg(handle, ENC_ERXSTH, PKTMEM_RX_START >> 8); + + /* Set the receive data pointer */ + + /* Errata 14 */ + enc_wrbreg(handle, ENC_ERXRDPTL, PKTMEM_RX_END & 0xff); + enc_wrbreg(handle, ENC_ERXRDPTH, PKTMEM_RX_END >> 8); +/* + enc_wrbreg(handle, ENC_ERXRDPTL, PKTMEM_RX_START & 0xff); + enc_wrbreg(handle, ENC_ERXRDPTH, PKTMEM_RX_START >> 8); +*/ + + /* Set the receive buffer end. */ + + enc_wrbreg(handle, ENC_ERXNDL, PKTMEM_RX_END & 0xff); + enc_wrbreg(handle, ENC_ERXNDH, PKTMEM_RX_END >> 8); + + /* Set transmit buffer start. */ + + handle->transmitLength = 0; + enc_wrbreg(handle, ENC_ETXSTL, PKTMEM_TX_START & 0xff); + enc_wrbreg(handle, ENC_ETXSTH, PKTMEM_TX_START >> 8); + + /* Set filter mode: unicast OR broadcast AND crc valid */ + + enc_wrbreg(handle, ENC_ERXFCON, ERXFCON_UCEN | ERXFCON_CRCEN | ERXFCON_BCEN); + + do { + HAL_Delay(10); /* Wait for 10 ms to let the clock be ready */ + regval = enc_rdbreg(handle, ENC_ESTAT); + } while ((regval & ESTAT_CLKRDY) == 0); + + /* Enable MAC receive */ + + enc_wrbreg(handle, ENC_MACON1, MACON1_MARXEN | MACON1_TXPAUS | MACON1_RXPAUS); + + /* Enable automatic padding and CRC operations */ + + if (handle->Init.DuplexMode == ETH_MODE_HALFDUPLEX) { + enc_wrbreg(handle, ENC_MACON3, + ((handle->Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE)?MACON3_PADCFG0 | MACON3_TXCRCEN:0) | + MACON3_FRMLNEN); + enc_wrbreg(handle, ENC_MACON4, MACON4_DEFER); /* Defer transmission enable */ + + /* Set Non-Back-to-Back Inter-Packet Gap */ + + enc_wrbreg(handle, ENC_MAIPGL, 0x12); + enc_wrbreg(handle, ENC_MAIPGH, 0x0c); + + /* Set Back-to-Back Inter-Packet Gap */ + + enc_wrbreg(handle, ENC_MABBIPG, 0x12); + } else { + /* Set filter mode: unicast OR broadcast AND crc valid AND Full Duplex */ + + enc_wrbreg(handle, ENC_MACON3, + ((handle->Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE)?MACON3_PADCFG0 | MACON3_TXCRCEN:0) | + MACON3_FRMLNEN | MACON3_FULDPX); + + /* Set Non-Back-to-Back Inter-Packet Gap */ + + enc_wrbreg(handle, ENC_MAIPGL, 0x12); + + /* Set Back-to-Back Inter-Packet Gap */ + + enc_wrbreg(handle, ENC_MABBIPG, 0x15); + } + + /* Set the maximum packet size which the controller will accept */ + + enc_wrbreg(handle, ENC_MAMXFLL, (CONFIG_NET_ETH_MTU+18) & 0xff); + enc_wrbreg(handle, ENC_MAMXFLH, (CONFIG_NET_ETH_MTU+18) >> 8); + + /* Configure LEDs (No, just use the defaults for now) */ + /* enc_wrphy(priv, ENC_PHLCON, ??); */ + + /* Setup up PHCON1 & 2 */ + + if (handle->Init.DuplexMode == ETH_MODE_HALFDUPLEX) { + enc_wrphy(handle, ENC_PHCON1, 0x00); + enc_wrphy(handle, ENC_PHCON2, PHCON2_HDLDIS); /* errata 9 workaround */ + } else { + enc_wrphy(handle, ENC_PHCON1, PHCON1_PDPXMD); /* errata 10 workaround */ + enc_wrphy(handle, ENC_PHCON2, 0x00); + } + + /* Not used Restore normal operation mode + enc_pwrfull(handle); */ + + /* Process interrupt settings */ + if (handle->Init.InterruptEnableBits & EIE_LINKIE) { + /* Enable link change interrupt in PHY module */ + enc_wrphy(handle, ENC_PHIE, PHIE_PGEIE | PHIE_PLNKIE); + } + + /* Since we not modify PHLCON register, we don't fall in errata 11 case */ + + /* Reset all interrupt flags */ + enc_bfcgreg(ENC_EIR, EIR_ALLINTS); + + regval = handle->Init.InterruptEnableBits; + if (regval) { + /* Ensure INTIE is set when at least an interruption is selected */ + regval |= EIE_INTIE; + } + /* Enable selected interrupts in ethernet controller module */ + enc_bfsgreg(ENC_EIE, regval); + + /* Enable the receiver */ + enc_bfsgreg(ENC_ECON1, ECON1_RXEN); + + return true; +} + +/** + * @} + */ + +/**************************************************************************** + * Function: ENC_SetMacAddr + * + * Description: + * Set the MAC address to the configured value. This is done after ifup + * or after a TX timeout. Note that this means that the interface must + * be down before configuring the MAC addr. + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_SetMacAddr(ENC_HandleTypeDef *handle) +{ + /* Program the hardware with it's MAC address (for filtering). + * MAADR1 MAC Address Byte 1 (MAADR<47:40>), OUI Byte 1 + * MAADR2 MAC Address Byte 2 (MAADR<39:32>), OUI Byte 2 + * MAADR3 MAC Address Byte 3 (MAADR<31:24>), OUI Byte 3 + * MAADR4 MAC Address Byte 4 (MAADR<23:16>) + * MAADR5 MAC Address Byte 5 (MAADR<15:8>) + * MAADR6 MAC Address Byte 6 (MAADR<7:0>) + */ + + enc_wrbreg(handle, ENC_MAADR1, handle->Init.MACAddr[0]); + enc_wrbreg(handle, ENC_MAADR2, handle->Init.MACAddr[1]); + enc_wrbreg(handle, ENC_MAADR3, handle->Init.MACAddr[2]); + enc_wrbreg(handle, ENC_MAADR4, handle->Init.MACAddr[3]); + enc_wrbreg(handle, ENC_MAADR5, handle->Init.MACAddr[4]); + enc_wrbreg(handle, ENC_MAADR6, handle->Init.MACAddr[5]); +} + + +/**************************************************************************** + * Function: ENC_WriteBuffer + * + * Description: + * Write a buffer of data. + * + * Parameters: + * buffer - A pointer to the buffer to write from + * buflen - The number of bytes to write + * + * Returned Value: + * None + * + * Assumptions: + * Read pointer is set to the correct address + * + ****************************************************************************/ + +void ENC_WriteBuffer(void *buffer, uint16_t buflen) +{ + /* Send the WBM command and copy the packet itself into the transmit + * buffer at the position of the EWRPT register. + */ + + /* Select ENC28J60 chip + * + * "The WBM command is started by lowering the CS pin. ..." + * We explicitly select the ENC28J60 chip because we have to transmits several pieces of + * information while keeping CS low + * + */ + + ENC_SPI_Select(true); + + /* Send the write buffer memory command (ignoring the response) + * + * "...The [3-bit]WBM opcode should then be sent to the ENC28J60, + * followed by the 5-bit constant, 1Ah." + */ + + + ENC_SPI_SendWithoutSelection(ENC_WBM); + + /* Send the buffer + * + * "... After the WBM command and constant are sent, the data to + * be stored in the memory pointed to by EWRPT should be shifted + * out MSb first to the ENC28J60. After 8 data bits are received, + * the Write Pointer will automatically increment if AUTOINC is + * set. The host controller can continue to provide clocks on the + * SCK pin and send data on the SI pin, without raising CS, to + * keep writing to the memory. In this manner, with AUTOINC + * enabled, it is possible to continuously write sequential bytes + * to the buffer memory without any extra SPI command + * overhead. + */ + + ENC_SPI_SendBuf(buffer, NULL, buflen); + + /* De-select ENC28J60 chip + * + * "The WBM command is terminated by bringing up the CS pin. ..." + * done in ENC_SPI_SendBuf callback + */ + +} + +/**************************************************************************** + * Function: enc_rdbuffer + * + * Description: + * Read a buffer of data. + * + * Parameters: + * buffer - A pointer to the buffer to read into + * buflen - The number of bytes to read + * + * Returned Value: + * None + * + * Assumptions: + * Read pointer is set to the correct address + * + ****************************************************************************/ + +static void enc_rdbuffer(void *buffer, int16_t buflen) +{ + /* Select ENC28J60 chip */ + + ENC_SPI_Select(true); + + /* Send the read buffer memory command (ignoring the response) */ + + ENC_SPI_SendWithoutSelection(ENC_RBM); + + /* Then read the buffer data */ + + ENC_SPI_SendBuf(NULL, buffer, buflen); + + /* De-select ENC28J60 chip: done in ENC_SPI_SendBuf callback */ +} + +/**************************************************************************** + * Function: ENC_RestoreTXBuffer + * + * Description: + * Prepare TX buffer + * + * Parameters: + * handle - Reference to the driver state structure + * len - length of buffer + * + * Returned Value: + * ERR_OK 0 No error, everything OK. + * ERR_MEM -1 Out of memory error. + * ERR_TIMEOUT -3 Timeout. + * + * Assumptions: + * + ****************************************************************************/ + +int8_t ENC_RestoreTXBuffer(ENC_HandleTypeDef *handle, uint16_t len) +{ + uint16_t txend; + uint8_t control_write[2]; + + /* Wait while TX is busy */ + if (!enc_waitgreg(ENC_ECON1, ECON1_TXRTS, 0)) { + return ERR_TIMEOUT; + } + + /* Verify that the hardware is ready to send another packet. The driver + * starts a transmission process by setting ECON1.TXRTS. When the packet is + * finished transmitting or is aborted due to an error/cancellation, the + * ECON1.TXRTS bit will be cleared. + * + * NOTE: If we got here, then we have committed to sending a packet. + * higher level logic must have assured that TX-related interrupts are disabled. + */ + + /* Send the packet: address=priv->dev.d_buf, length=priv->dev.d_len */ + + /* Set transmit buffer start (is this necessary?). */ + + enc_wrbreg(handle, ENC_ETXSTL, PKTMEM_TX_START & 0xff); + enc_wrbreg(handle, ENC_ETXSTH, PKTMEM_TX_START >> 8); + + /* Reset the write pointer to start of transmit buffer */ + + enc_wrbreg(handle, ENC_EWRPTL, PKTMEM_TX_START & 0xff); + enc_wrbreg(handle, ENC_EWRPTH, PKTMEM_TX_START >> 8); + + /* Set the TX End pointer based on the size of the packet to send. Note + * that the offset accounts for the control byte at the beginning the + * buffer plus the size of the packet data. + */ + + txend = PKTMEM_TX_START + len; + + if (txend+8>PKTMEM_TX_ENDP1) { + return ERR_MEM; + } + + enc_wrbreg(handle, ENC_ETXNDL, txend & 0xff); + enc_wrbreg(handle, ENC_ETXNDH, txend >> 8); + + /* Send the write buffer memory command (ignoring the response) + * + * "...The [3-bit]WBM opcode should then be sent to the ENC28J60, + * followed by the 5-bit constant, 1Ah." + * + * "...the ENC28J60 requires a single per packet control byte to + * precede the packet for transmission." + * + * POVERRIDE: Per Packet Override bit (Not set): + * 1 = The values of PCRCEN, PPADEN and PHUGEEN will override the + * configuration defined by MACON3. + * 0 = The values in MACON3 will be used to determine how the packet + * will be transmitted + * PCRCEN: Per Packet CRC Enable bit (Set, but won't be used because + * POVERRIDE is zero). + * PPADEN: Per Packet Padding Enable bit (Set, but won't be used because + * POVERRIDE is zero). + * PHUGEEN: Per Packet Huge Frame Enable bit (Set, but won't be used + * because POVERRIDE is zero). + */ + + control_write[0] = ENC_WBM; + control_write[1] = PKTCTRL_PCRCEN | PKTCTRL_PPADEN | PKTCTRL_PHUGEEN; + ENC_SPI_SendBuf(control_write, control_write, 2); + + return ERR_OK; +} + +/**************************************************************************** + * Function: ENC_Transmit + * + * Description: + * Start hardware transmission. Called either from: + * + * - pkif interrupt when an application responds to the receipt of data + * by trying to send something, or + * - From watchdog based polling. + * + * Parameters: + * handle - Reference to the driver state structure + * len - length of buffer + * + * Returned Value: + * none + * + * Assumptions: + * + ****************************************************************************/ + +#ifdef USE_PROTOTHREADS +PT_THREAD(ENC_Transmit(struct pt *pt, ENC_HandleTypeDef *handle)) +#else +void ENC_Transmit(ENC_HandleTypeDef *handle) +#endif +{ + PT_BEGIN(pt); + + if (handle->transmitLength != 0) { + /* A frame is ready for transmission */ + /* Set TXRTS to send the packet in the transmit buffer */ + + //enc_bfsgreg(ENC_ECON1, ECON1_TXRTS); + /* Implement erratas 12, 13 and 15 */ + /* Reset transmit logic */ + handle->retries = 16; + do { + enc_bfsgreg(ENC_ECON1, ECON1_TXRST); + enc_bfcgreg(ENC_ECON1, ECON1_TXRST); + enc_bfcgreg(ENC_EIR, EIR_TXERIF | EIR_TXIF); + + /* Start transmission */ + enc_bfsgreg(ENC_ECON1, ECON1_TXRTS); + +#ifdef USE_PROTOTHREADS + handle->startTime = HAL_GetTick(); + handle->duration = 20; /* Timeout after 20 ms */ + PT_WAIT_UNTIL(pt, (((enc_rdgreg(ENC_EIR) & (EIR_TXIF | EIR_TXERIF)) != 0) || + (HAL_GetTick() - handle->startTime > handle->duration))); +#else + /* Wait for end of transmission */ + enc_waitwhilegreg(ENC_EIR, EIR_TXIF | EIR_TXERIF, 0); +#endif + + HAL_Delay(20); // Added by AGB - fixes weird timing bug + + /* Stop transmission */ + enc_bfcgreg(ENC_ECON1, ECON1_TXRTS); + + { + uint16_t addtTsv4; + uint8_t tsv4, regval; + + /* read tsv */ + addtTsv4 = PKTMEM_TX_START + handle->transmitLength + 4; + + enc_wrbreg(handle, ENC_ERDPTL, addtTsv4 & 0xff); + enc_wrbreg(handle, ENC_ERDPTH, addtTsv4 >> 8); + + enc_rdbuffer(&tsv4, 1); + + regval = enc_rdgreg(ENC_EIR); + if (!(regval & EIR_TXERIF) || !(tsv4 & TSV_LATECOL)) { + break; + } + } + handle->retries--; + } while (handle->retries > 0); + /* Transmission finished (but can be unsuccessful) */ + handle->transmitLength = 0; + } + PT_END(pt); +} + +/**************************************************************************** + * Function: ENC_GetReceivedFrame + * + * Description: + * Check if we have received packet, and if so, retrieve them. + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * true if new packet is available; false otherwise + * + * Assumptions: + * + ****************************************************************************/ + +bool ENC_GetReceivedFrame(ENC_HandleTypeDef *handle) +{ + uint8_t rsv[6]; + uint16_t pktlen; + uint16_t rxstat; + + uint8_t pktcnt; + + bool result = true; + pktcnt = enc_rdbreg(handle, ENC_EPKTCNT); + if (pktcnt == 0) { + return false; + }; + + /* Set the read pointer to the start of the received packet (ERDPT) */ + + enc_wrbreg(handle, ENC_ERDPTL, (handle->nextpkt) & 0xff); + enc_wrbreg(handle, ENC_ERDPTH, (handle->nextpkt) >> 8); + + /* Read the next packet pointer and the 4 byte read status vector (RSV) + * at the beginning of the received packet. (ERDPT should auto-increment + * and wrap to the beginning of the read buffer as necessary) + */ + + enc_rdbuffer(rsv, 6); + + /* Decode the new next packet pointer, and the RSV. The + * RSV is encoded as: + * + * Bits 0-15: Indicates length of the received frame. This includes the + * destination address, source address, type/length, data, + * padding and CRC fields. This field is stored in little- + * endian format. + * Bits 16-31: Bit encoded RX status. + */ + + handle->nextpkt = (uint16_t)rsv[1] << 8 | (uint16_t)rsv[0]; + pktlen = (uint16_t)rsv[3] << 8 | (uint16_t)rsv[2]; + rxstat = (uint16_t)rsv[5] << 8 | (uint16_t)rsv[4]; + + /* Check if the packet was received OK */ + + if ((rxstat & RXSTAT_OK) == 0) { +#ifdef CONFIG_ENC28J60_STATS + priv->stats.rxnotok++; +#endif + result = false; + } else { /* Check for a usable packet length (4 added for the CRC) */ + if (pktlen > (CONFIG_NET_ETH_MTU + 4) || pktlen <= (ETH_HDRLEN + 4)) { + #ifdef CONFIG_ENC28J60_STATS + priv->stats.rxpktlen++; + #endif + result = false; + } else { /* Otherwise, read and process the packet */ + /* Save the packet length (without the 4 byte CRC) in handle->RxFrameInfos.length*/ + + handle->RxFrameInfos.length = pktlen - 4; + + /* Copy the data data from the receive buffer to priv->dev.d_buf. + * ERDPT should be correctly positioned from the last call to to + * end_rdbuffer (above). + */ + + enc_rdbuffer(handle->RxFrameInfos.buffer, handle->RxFrameInfos.length); + + } + } + + /* Move the RX read pointer to the start of the next received packet. + * This frees the memory we just read. + */ + + /* Errata 14 (on se sert de rxstat comme variable temporaire */ + rxstat = handle->nextpkt; + if (rxstat == PKTMEM_RX_START) { + rxstat = PKTMEM_RX_END; + } else { + rxstat--; + } + enc_wrbreg(handle, ENC_ERXRDPTL, rxstat & 0xff); + enc_wrbreg(handle, ENC_ERXRDPTH, rxstat >> 8); +/* + enc_wrbreg(handle, ENC_ERXRDPTL, (handle->nextpkt)); + enc_wrbreg(handle, ENC_ERXRDPTH, (handle->nextpkt) >> 8); +*/ + + /* Decrement the packet counter indicate we are done with this packet */ + + enc_bfsgreg(ENC_ECON2, ECON2_PKTDEC); + + return result; +} + +/**************************************************************************** + * Function: enc_linkstatus + * + * Description: + * The current link status can be obtained from the PHSTAT1.LLSTAT or + * PHSTAT2.LSTAT. + * + * Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static void enc_linkstatus(ENC_HandleTypeDef *handle) +{ + handle->LinkStatus = enc_rdphy(handle, ENC_PHSTAT2); +} + +/**************************************************************************** + * Function: ENC_EnableInterrupts + * + * Description: + * Enable individual ENC28J60 interrupts + * + * Parameters: + * bits - The individual bits to enable + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_EnableInterrupts(uint8_t bits) +{ + enc_bfsgreg(ENC_EIE, bits); +} + + +/**************************************************************************** + * Function: ENC_IRQHandler + * + * Description: + * Perform interrupt handling logic outside of the interrupt handler (on + * the work queue thread). + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_IRQHandler(ENC_HandleTypeDef *handle) +{ + uint8_t eir; + + /* Disable further interrupts by clearing the global interrupt enable bit. + * "After an interrupt occurs, the host controller should clear the global + * enable bit for the interrupt pin before servicing the interrupt. Clearing + * the enable bit will cause the interrupt pin to return to the non-asserted + * state (high). Doing so will prevent the host controller from missing a + * falling edge should another interrupt occur while the immediate interrupt + * is being serviced." + */ + + enc_bfcgreg(ENC_EIE, EIE_INTIE); + + /* Read EIR for interrupt flags + */ + + eir = enc_rdgreg(ENC_EIR) & EIR_ALLINTS; + + /* PKTIF is not reliable, check PKCNT instead */ + if (enc_rdbreg(handle, ENC_EPKTCNT) != 0) { + /* Manage EIR_PKTIF by software */ + eir |= EIR_PKTIF; + } + + /* Store interrupt flags in handle */ + handle->interruptFlags = eir; + + /* If link status has changed, read it */ + if ((eir & EIR_LINKIF) != 0) /* Link change interrupt */ + { + enc_linkstatus(handle); /* Get current link status */ + enc_rdphy(handle, ENC_PHIR); /* Clear the LINKIF interrupt */ + } + + /* Reset ENC28J60 interrupt flags, except PKTIF form which interruption is deasserted when PKTCNT reaches 0 */ + enc_bfcgreg(ENC_EIR, EIR_ALLINTS); + + /* Enable Ethernet interrupts */ + /* done after effective process on interrupts enc_bfsgreg(ENC_EIE, EIE_INTIE); */ +} + +/**************************************************************************** + * Function: ENC_GetPkcnt + * + * Description: + * Get the number of pending receive packets + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * the number of receive packet not processed yet + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_GetPkcnt(ENC_HandleTypeDef *handle) +{ + handle->pktCnt = enc_rdbreg(handle, ENC_EPKTCNT); +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/part14-spi-ethernet-interrupt/net/enc28j60.h b/part14-spi-ethernet-interrupt/net/enc28j60.h new file mode 100644 index 0000000..695095c --- /dev/null +++ b/part14-spi-ethernet-interrupt/net/enc28j60.h @@ -0,0 +1,816 @@ +/** + ****************************************************************************** + * @file enc28j60.h + * @author Christian Schoffit, portions from Gregory Nutt: + * Copyright (C) 2010-2012, 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * @version V1.0.0 + * @date 02-June-2015 + * @brief This file provides a set of functions needed to manage the ENC28J60 + * Stand-Alone Ethernet Controller with SPI Interface. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2015 Christian Schoffit

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of Christian Schoffit nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +#ifndef ENC28J60_H_INCLUDED +#define ENC28J60_H_INCLUDED + +#include +#include + +#ifdef USE_PROTOTHREADS +#include "pt.h" +#else +#define PT_BEGIN(x) +#define PT_END(x) +#endif + +#ifndef NULL +#define NULL ((void *)0) +#endif + +/* Ethernet frames are between 64 and 1518 bytes long */ + +#define MIN_FRAMELEN 64 +#define MAX_FRAMELEN 1518 + + +/* External functions --------------------------------------------------------*/ +void HAL_Delay(volatile uint32_t Delay); +uint32_t HAL_GetTick(void); + +/* Callback functions *********************************************************/ + +/** + * Implement SPI Slave selection and deselection. Must be provided by user code + * param select: true if the ENC28J60 slave SPI if selected, false otherwise + * retval none + */ + +void ENC_SPI_Select(bool select); + +/** + * Implement SPI single byte send and receive. + * The ENC28J60 slave SPI must already be selected and wont be deselected after transmission + * Must be provided by user code + * param command: command or data to be sent to ENC28J60 + * retval answer from ENC28J60 + */ + +void ENC_SPI_SendWithoutSelection(uint8_t command); + +/** + * Implement SPI single byte send and receive. Must be provided by user code + * param command: command or data to be sent to ENC28J60 + * retval answer from ENC28J60 + */ + +void ENC_SPI_Send(uint8_t command); + +/** + * Implement SPI buffer send and receive. Must be provided by user code + * param master2slave: data to be sent from host to ENC28J60, can be NULL if we only want to receive data from slave + * param slave2master: answer from ENC28J60 to host, can be NULL if we only want to send data to slave + * retval none + */ + +void ENC_SPI_SendBuf(uint8_t *master2slave, uint8_t *slave2master, uint16_t bufferSize); + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup ETH_Exported_Types ETH Exported Types + * @{ + */ + +/** + * @brief ETH Init Structure definition + */ + +typedef struct +{ + uint32_t DuplexMode; /*!< Selects the MAC duplex mode: Half-Duplex or Full-Duplex mode + This parameter can be a value of @ref ETH_Duplex_Mode */ + + uint8_t *MACAddr; /*!< MAC Address of used Hardware: must be pointer on an array of 6 bytes */ + + uint32_t ChecksumMode; /*!< Selects if the checksum is check by hardware or by software. + This parameter can be a value of @ref ETH_Checksum_Mode */ + + uint8_t InterruptEnableBits; /*!< Selects the enabled interrupts */ +} ENC_InitTypeDef; + + +/** + * @brief Received Frame Informations structure definition + */ +typedef struct +{ + uint32_t length; /*!< Frame length */ + + uint8_t buffer[MAX_FRAMELEN+20]; /*!< Frame buffer */ + +} ENC_RxFrameInfos; + + +/** + * @brief ENC28J60 Handle Structure definition + */ + +typedef struct +{ + ENC_InitTypeDef Init; /*!< Ethernet Init Configuration */ + + uint8_t bank; /*!< Currently selected bank */ + uint8_t interruptFlags;/*!< The last value of interrupts flags */ + uint8_t pktCnt; /*!< The number of pending receive packets */ + uint16_t nextpkt; /*!< Next packet address */ + uint16_t LinkStatus; /*!< Ethernet link status */ + uint16_t transmitLength;/*!< The length of ip frame to transmit */ + uint32_t startTime; /*!< The start time of the current timer */ + uint32_t duration; /*!< The duration of the current timer in ms */ + uint16_t retries; /*!< The number of transmission retries left to do */ + + ENC_RxFrameInfos RxFrameInfos; /*!< last Rx frame infos */ +} ENC_HandleTypeDef; + + /** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup ETH_Exported_Constants ETH Exported Constants + * @{ + */ +/* Size of the Ethernet header */ +#define ETH_HDRLEN 14 /* Minimum size: 2*6 + 2 */ + + +#define ERR_OK 0 /* No error, everything OK. */ +#define ERR_MEM -1 /* Out of memory error. */ +#define ERR_BUF -2 /* Buffer error. */ +#define ERR_TIMEOUT -3 /* Timeout. */ + +/* ENC28J60 Commands ********************************************************/ +/* A total of seven instructions are implemented on the ENC28J60. Where: + * + * aaaaaa is the 5-bit address of a control register, and + * dddddddd is one or more bytes of data that may accompany the command. + */ + +#define ENC_RCR (0x00) /* Read Control Register + * 000 | aaaaa | (Register value returned)) */ +#define ENC_RBM (0x3a) /* Read Buffer Memory + * 001 | 11010 | (Read buffer data follows) */ +#define ENC_WCR (0x40) /* Write Control Register + * 010 | aaaaa | dddddddd */ +#define ENC_WBM (0x7a) /* Write Buffer Memory + * 011 | 11010 | (Write buffer data follows) */ +#define ENC_BFS (0x80) /* Bit Field Set + * 100 | aaaaa | dddddddd */ +#define ENC_BFC (0xa0) /* Bit Field Clear + * 101 | aaaaa | dddddddd */ +#define ENC_SRC (0xff) /* System Reset + * 111 | 11111 | (No data) */ + +/* Global Control Registers *************************************************/ +/* Control registers are accessed with the RCR, RBM, WCR, BFS, and BFC + * commands. The following identifies all ENC28J60 control registers. The + * control register memory is partitioned into four banks, selectable by the + * bank select bits, BSEL1:BSEL0, in the ECON1 register. + * + * The last five locations (0x1b to 0x1f) of all banks point to a common set + * of registers: EIE, EIR, ESTAT, ECON2 and ECON1. These are key registers + * used in controlling and monitoring the operation of the device. Their + * common mapping allows easy access without switching the bank. + * + * Control registers for the ENC28J60 are generically grouped as ETH, MAC and + * MII registers. Register names starting with E belong to the ETH group. + * Similarly, registers names starting with MA belong to the MAC group and + * registers prefixed with MI belong to the MII group. + */ + +#define ENC_EIE (0x1b) /* Ethernet Interrupt Enable Register */ +#define ENC_EIR (0x1c) /* Ethernet Interupt Request Register */ +#define ENC_ESTAT (0x1d) /* Ethernet Status Register */ +#define ENC_ECON2 (0x1e) /* Ethernet Control 2 Register */ +#define ENC_ECON1 (0x1f) /* Ethernet Control 1 Register */ + +/* Ethernet Interrupt Enable Register Bit Definitions */ + +#define EIE_RXERIE (1 << 0) /* Bit 0: Receive Error Interrupt Enable */ +#define EIE_TXERIE (1 << 1) /* Bit 1: Transmit Error Interrupt Enable */ + /* Bit 2: Reserved */ +#define EIE_TXIE (1 << 3) /* Bit 3: Transmit Enable */ +#define EIE_LINKIE (1 << 4) /* Bit 4: Link Status Change Interrupt Enable */ +#define EIE_DMAIE (1 << 5) /* Bit 5: DMA Interrupt Enable */ +#define EIE_PKTIE (1 << 6) /* Bit 6: Receive Packet Pending Interrupt Enable */ +#define EIE_INTIE (1 << 7) /* Bit 7: Global INT Interrupt Enable */ + +/* Ethernet Interrupt Request Register Bit Definitions */ + +#define EIR_RXERIF (1 << 0) /* Bit 0: Receive Error Interrupt */ +#define EIR_TXERIF (1 << 1) /* Bit 1: Transmit Error Interrupt */ + /* Bit 2: Reserved */ +#define EIR_TXIF (1 << 3) /* Bit 3: Transmit Interrupt */ +#define EIR_LINKIF (1 << 4) /* Bit 4: Link Change Interrupt */ +#define EIR_DMAIF (1 << 5) /* Bit 5: DMA Interrupt */ +#define EIR_PKTIF (1 << 6) /* Bit 6: Receive Packet Pending Interrupt */ + /* Bit 7: Reserved */ +#define EIR_ALLINTS (EIR_RXERIF | EIR_TXERIF | EIR_TXIF | EIR_LINKIF | EIR_DMAIF) /* All interrupts bar EIR_PKTIF*/ + +/* Ethernet Status Register Bit Definitions */ + +#define ESTAT_CLKRDY (1 << 0) /* Bit 0: Clock Ready */ +#define ESTAT_TXABRT (1 << 1) /* Bit 1: Transmit Abort Error */ +#define ESTAT_RXBUSY (1 << 2) /* Bit 2: Receive Busy */ + /* Bit 3: Reserved */ +#define ESTAT_LATECOL (1 << 4) /* Bit 4: Late Collision Error */ + /* Bit 5: Reserved */ +#define ESTAT_BUFER (1 << 6) /* Bit 6: Ethernet Buffer Error Status */ +#define ESTAT_INT (1 << 7) /* Bit 7: INT Interrupt */ + +/* Ethernet Control 1 Register Bit Definitions */ + +#define ECON1_BSEL_SHIFT (0) /* Bits 0-1: Bank select */ +#define ECON1_BSEL_MASK (3 << ECON1_BSEL_SHIFT) +# define ECON1_BSEL_BANK0 (0 << ECON1_BSEL_SHIFT) /* Bank 0 */ +# define ECON1_BSEL_BANK1 (1 << ECON1_BSEL_SHIFT) /* Bank 1 */ +# define ECON1_BSEL_BANK2 (2 << ECON1_BSEL_SHIFT) /* Bank 2 */ +# define ECON1_BSEL_BANK3 (3 << ECON1_BSEL_SHIFT) /* Bank 3 */ +#define ECON1_RXEN (1 << 2) /* Bit 2: Receive Enable */ +#define ECON1_TXRTS (1 << 3) /* Bit 3: Transmit Request to Send */ +#define ECON1_CSUMEN (1 << 4) /* Bit 4: DMA Checksum Enable */ +#define ECON1_DMAST (1 << 5) /* Bit 5: DMA Start and Busy Status */ +#define ECON1_RXRST (1 << 6) /* Bit 6: Receive Logic Reset */ +#define ECON1_TXRST (1 << 7) /* Bit 7: Transmit Logic Reset */ + +/* Ethernet Control 2 Register */ + /* Bits 0-2: Reserved */ +#define ECON2_VRPS (1 << 3) /* Bit 3: Voltage Regulator Power Save Enable */ + /* Bit 4: Reserved */ +#define ECON2_PWRSV (1 << 5) /* Bit 5: Power Save Enable */ +#define ECON2_PKTDEC (1 << 6) /* Bit 6: Packet Decrement */ +#define ECON2_AUTOINC (1 << 7) /* Bit 7: Automatic Buffer Pointer Increment Enable */ + +/* Banked Control Registers *************************************************/ +/* The remaining control registers are identified with a a 5 bit address and + * a bank selection. We pack the bank number and an indication if this is + * a MAC/PHY register access together with the control register address + * together to keep the design simpler. + */ + +#define ENC_ADDR_SHIFT (0) /* Bits 0-4: Register address */ +#define ENC_ADDR_MASK (0x1f << ENC_ADDR_SHIFT) +#define ENC_BANK_SHIFT (5) /* Bits 5-6: Bank number */ +#define ENC_BANK_MASK (3 << ENC_BSEL_SHIFT) +# define ENC_BANK0 (0 << ENC_BSEL_SHIFT) +# define ENC_BANK1 (1 << ENC_BSEL_SHIFT) +# define ENC_BANK2 (2 << ENC_BSEL_SHIFT) +# define ENC_BANK3 (3 << ENC_BSEL_SHIFT) +#define ENC_PHYMAC_SHIFT (7) /* Bit 7: This is a PHY/MAC command */ +#define ENC_PHYMAC (1 << ENC_PHYMAC_SHIFT) + +#define REGADDR(a,b,m) ((m) << ENC_PHYMAC_SHIFT | (b) << ENC_BANK_SHIFT | (a)) +#define GETADDR(a) ((a) & ENC_ADDR_MASK) +#define GETBANK(a) (((a) >> ENC_BANK_SHIFT) & 3) +#define ISPHYMAC(a) (((a) & ENC_PHYMAC) != 0) + +/* Bank 0 Control Register Addresses */ + +#define ENC_ERDPTL REGADDR(0x00, 0, 0) /* Read Pointer Low Byte (ERDPT<7:0> */ +#define ENC_ERDPTH REGADDR(0x01, 0, 0) /* Read Pointer High Byte (ERDPT<12:8>) */ +#define ENC_EWRPTL REGADDR(0x02, 0, 0) /* Write Pointer Low Byte (EWRPT<7:0>) */ +#define ENC_EWRPTH REGADDR(0x03, 0, 0) /* Write Pointer High Byte (EWRPT<12:8>) */ +#define ENC_ETXSTL REGADDR(0x04, 0, 0) /* TX Start Low Byte (ETXST<7:0>) */ +#define ENC_ETXSTH REGADDR(0x05, 0, 0) /* TX Start High Byte (ETXST<12:8>) */ +#define ENC_ETXNDL REGADDR(0x06, 0, 0) /* TX End Low Byte (ETXND<7:0>) */ +#define ENC_ETXNDH REGADDR(0x07, 0, 0) /* TX End High Byte (ETXND<12:8>) */ +#define ENC_ERXSTL REGADDR(0x08, 0, 0) /* RX Start Low Byte (ERXST<7:0>) */ +#define ENC_ERXSTH REGADDR(0x09, 0, 0) /* RX Start High Byte (ERXST<12:8>) */ +#define ENC_ERXNDL REGADDR(0x0a, 0, 0) /* RX End Low Byte (ERXND<7:0>) */ +#define ENC_ERXNDH REGADDR(0x0b, 0, 0) /* RX End High Byte (ERXND<12:8>) */ +#define ENC_ERXRDPTL REGADDR(0x0c, 0, 0) /* RX RD Pointer Low Byte (ERXRDPT<7:0>) */ +#define ENC_ERXRDPTH REGADDR(0x0d, 0, 0) /* RX RD Pointer High Byte (ERXRDPT<12:8>) */ +#define ENC_ERXWRPTL REGADDR(0x0e, 0, 0) /* RX WR Pointer Low Byte (ERXWRPT<7:0>) */ +#define ENC_ERXWRPTH REGADDR(0x0f, 0, 0) /* RX WR Pointer High Byte (ERXWRPT<12:8>) */ +#define ENC_EDMASTL REGADDR(0x10, 0, 0) /* DMA Start Low Byte (EDMAST<7:0>) */ +#define ENC_EDMASTH REGADDR(0x11, 0, 0) /* DMA Start High Byte (EDMAST<12:8>) */ +#define ENC_EDMANDL REGADDR(0x12, 0, 0) /* DMA End Low Byte (EDMAND<7:0>) */ +#define ENC_EDMANDH REGADDR(0x13, 0, 0) /* DMA End High Byte (EDMAND<12:8>) */ +#define ENC_EDMADSTL REGADDR(0x14, 0, 0) /* DMA Destination Low Byte (EDMADST<7:0>) */ +#define ENC_EDMADSTH REGADDR(0x15, 0, 0) /* DMA Destination High Byte (EDMADST<12:8>) */ +#define ENC_EDMACSL REGADDR(0x16, 0, 0) /* DMA Checksum Low Byte (EDMACS<7:0>) */ +#define ENC_EDMACSH REGADDR(0x17, 0, 0) /* DMA Checksum High Byte (EDMACS<15:8>) */ + /* 0x18-0x1a: Reserved */ + /* 0x1b-0x1f: EIE, EIR, ESTAT, ECON2, ECON1 */ +/* Bank 1 Control Register Addresses */ + +#define ENC_EHT0 REGADDR(0x00, 1, 0) /* Hash Table Byte 0 (EHT<7:0>) */ +#define ENC_EHT1 REGADDR(0x01, 1, 0) /* Hash Table Byte 1 (EHT<15:8>) */ +#define ENC_EHT2 REGADDR(0x02, 1, 0) /* Hash Table Byte 2 (EHT<23:16>) */ +#define ENC_EHT3 REGADDR(0x03, 1, 0) /* Hash Table Byte 3 (EHT<31:24>) */ +#define ENC_EHT4 REGADDR(0x04, 1, 0) /* Hash Table Byte 4 (EHT<39:32>) */ +#define ENC_EHT5 REGADDR(0x05, 1, 0) /* Hash Table Byte 5 (EHT<47:40>) */ +#define ENC_EHT6 REGADDR(0x06, 1, 0) /* Hash Table Byte 6 (EHT<55:48>) */ +#define ENC_EHT7 REGADDR(0x07, 1, 0) /* Hash Table Byte 7 (EHT<63:56>) */ +#define ENC_EPMM0 REGADDR(0x08, 1, 0) /* Pattern Match Mask Byte 0 (EPMM<7:0>) */ +#define ENC_EPMM1 REGADDR(0x09, 1, 0) /* Pattern Match Mask Byte 1 (EPMM<15:8>) */ +#define ENC_EPMM2 REGADDR(0x0a, 1, 0) /* Pattern Match Mask Byte 2 (EPMM<23:16>) */ +#define ENC_EPMM3 REGADDR(0x0b, 1, 0) /* Pattern Match Mask Byte 3 (EPMM<31:24>) */ +#define ENC_EPMM4 REGADDR(0x0c, 1, 0) /* Pattern Match Mask Byte 4 (EPMM<39:32>) */ +#define ENC_EPMM5 REGADDR(0x0d, 1, 0) /* Pattern Match Mask Byte 5 (EPMM<47:40>) */ +#define ENC_EPMM6 REGADDR(0x0e, 1, 0) /* Pattern Match Mask Byte 6 (EPMM<55:48>) */ +#define ENC_EPMM7 REGADDR(0x0f, 1, 0) /* Pattern Match Mask Byte 7 (EPMM<63:56>) */ +#define ENC_EPMCSL REGADDR(0x10, 1, 0) /* Pattern Match Checksum Low Byte (EPMCS<7:0>) */ +#define ENC_EPMCSH REGADDR(0x11, 1, 0) /* Pattern Match Checksum High Byte (EPMCS<15:0>) */ + /* 0x12-0x13: Reserved */ +#define ENC_EPMOL REGADDR(0x14, 1, 0) /* Pattern Match Offset Low Byte (EPMO<7:0>) */ +#define ENC_EPMOH REGADDR(0x15, 1, 0) /* Pattern Match Offset High Byte (EPMO<12:8>) */ + /* 0x16-0x17: Reserved */ +#define ENC_ERXFCON REGADDR(0x18, 1, 0) /* Receive Filter Configuration */ +#define ENC_EPKTCNT REGADDR(0x19, 1, 0) /* Ethernet Packet Count */ + /* 0x1a: Reserved */ + /* 0x1b-0x1f: EIE, EIR, ESTAT, ECON2, ECON1 */ + +/* Receive Filter Configuration Bit Definitions */ + +#define ERXFCON_BCEN (1 << 0) /* Bit 0: Broadcast Filter Enable */ +#define ERXFCON_MCEN (1 << 1) /* Bit 1: Multicast Filter Enable */ +#define ERXFCON_HTEN (1 << 2) /* Bit 2: Hash Table Filter Enable */ +#define ERXFCON_MPEN (1 << 3) /* Bit 3: Magic Packet Filter Enable */ +#define ERXFCON_PMEN (1 << 4) /* Bit 4: Pattern Match Filter Enable */ +#define ERXFCON_CRCEN (1 << 5) /* Bit 5: Post-Filter CRC Check Enable */ +#define ERXFCON_ANDOR (1 << 6) /* Bit 6: AND/OR Filter Select */ +#define ERXFCON_UCEN (1 << 7) /* Bit 7: Unicast Filter Enable */ + +/* Bank 2 Control Register Addresses */ + +#define ENC_MACON1 REGADDR(0x00, 2, 1) /* MAC Control 1 */ + /* 0x01: Reserved */ +#define ENC_MACON3 REGADDR(0x02, 2, 1) /* MAC Control 3 */ +#define ENC_MACON4 REGADDR(0x03, 2, 1) /* MAC Control 4 */ +#define ENC_MABBIPG REGADDR(0x04, 2, 1) /* Back-to-Back Inter-Packet Gap (BBIPG<6:0>) */ + /* 0x05: Reserved */ +#define ENC_MAIPGL REGADDR(0x06, 2, 1) /* Non-Back-to-Back Inter-Packet Gap Low Byte (MAIPGL<6:0>) */ +#define ENC_MAIPGH REGADDR(0x07, 2, 1) /* Non-Back-to-Back Inter-Packet Gap High Byte (MAIPGH<6:0>) */ +#define ENC_MACLCON1 REGADDR(0x08, 2, 1) /* MAC Collision Control 1 */ +#define ENC_MACLCON2 REGADDR(0x09, 2, 1) /* MAC Collision Control 2 */ +#define ENC_MAMXFLL REGADDR(0x0a, 2, 1) /* Maximum Frame Length Low Byte (MAMXFL<7:0>) */ +#define ENC_MAMXFLH REGADDR(0x0b, 2, 1) /* Maximum Frame Length High Byte (MAMXFL<15:8>) */ + /* 0x0c-0x11: Reserved */ +#define ENC_MICMD REGADDR(0x12, 2, 1) /* MII Command Register */ + /* 0x13: Reserved */ +#define ENC_MIREGADR REGADDR(0x14, 2, 1) /* MII Register Address */ + /* 0x15: Reserved */ +#define ENC_MIWRL REGADDR(0x16, 2, 1) /* MII Write Data Low Byte (MIWR<7:0>) */ +#define ENC_MIWRH REGADDR(0x17, 2, 1) /* MII Write Data High Byte (MIWR<15:8>) */ +#define ENC_MIRDL REGADDR(0x18, 2, 1) /* MII Read Data Low Byte (MIRD<7:0>) */ +#define ENC_MIRDH REGADDR(0x19, 2, 1) /* MII Read Data High Byte(MIRD<15:8>) */ + /* 0x1a: Reserved */ + /* 0x1b-0x1f: EIE, EIR, ESTAT, ECON2, ECON1 */ + +/* MAC Control 1 Register Bit Definitions */ + +#define MACON1_MARXEN (1 << 0) /* Bit 0: MAC Receive Enable */ +#define MACON1_PASSALL (1 << 1) /* Bit 1: Pass All Received Frames Enable */ +#define MACON1_RXPAUS (1 << 2) /* Bit 2: Pause Control Frame Reception Enable */ +#define MACON1_TXPAUS (1 << 3) /* Bit 3: Pause Control Frame Transmission Enable */ + /* Bits 4-7: Unimplemented or reserved */ + +/* MAC Control 1 Register Bit Definitions */ + +#define MACON3_FULDPX (1 << 0) /* Bit 0: MAC Full-Duplex Enable */ +#define MACON3_FRMLNEN (1 << 1) /* Bit 1: Frame Length Checking Enable */ +#define MACON3_HFRMLEN (1 << 2) /* Bit 2: Huge Frame Enable */ +#define MACON3_PHDRLEN (1 << 3) /* Bit 3: Proprietary Header Enable */ +#define MACON3_TXCRCEN (1 << 4) /* Bit 4: Transmit CRC Enable */ +#define MACON3_PADCFG0 (1 << 5) /* Bit 5: Automatic Pad and CRC Configuration */ +#define MACON3_PADCFG1 (1 << 6) /* Bit 6: " " " " " " " " " " */ +#define MACON3_PADCFG2 (1 << 7) /* Bit 7: " " " " " " " " " " */ + +/* MAC Control 1 Register Bit Definitions */ + +#define MACON4_NOBKOFF (1 << 4) /* Bit 4: No Backoff Enable */ +#define MACON4_BPEN (1 << 5) /* Bit 5: No Backoff During Backpressure Enable */ +#define MACON4_DEFER (1 << 6) /* Bit 6: Defer Transmission Enable bit */ + +/* MII Command Register Bit Definitions */ + +#define MICMD_MIIRD (1 << 0) /* Bit 0: MII Read Enable */ +#define MICMD_MIISCAN (1 << 1) /* Bit 1: MII Scan Enable */ + +/* Bank 3 Control Register Addresses */ + +#define ENC_MAADR5 REGADDR(0x00, 3, 1) /* MAC Address Byte 5 (MAADR<15:8>) */ +#define ENC_MAADR6 REGADDR(0x01, 3, 1) /* MAC Address Byte 6 (MAADR<7:0>) */ +#define ENC_MAADR3 REGADDR(0x02, 3, 1) /* MAC Address Byte 3 (MAADR<31:24>), OUI Byte 3 */ +#define ENC_MAADR4 REGADDR(0x03, 3, 1) /* MAC Address Byte 4 (MAADR<23:16>) */ +#define ENC_MAADR1 REGADDR(0x04, 3, 1) /* MAC Address Byte 1 (MAADR<47:40>), OUI Byte 1 */ +#define ENC_MAADR2 REGADDR(0x05, 3, 1) /* MAC Address Byte 2 (MAADR<39:32>), OUI Byte 2 */ +#define ENC_EBSTSD REGADDR(0x06, 3, 0) /* Built-in Self-Test Fill Seed (EBSTSD<7:0>) */ +#define ENC_EBSTCON REGADDR(0x07, 3, 0) /* Built-in Self-Test Control */ +#define ENC_EBSTCSL REGADDR(0x08, 3, 0) /* Built-in Self-Test Checksum Low Byte (EBSTCS<7:0>) */ +#define ENC_EBSTCSH REGADDR(0x09, 3, 0) /* Built-in Self-Test Checksum High Byte (EBSTCS<15:8>) */ +#define ENC_MISTAT REGADDR(0x0a, 3, 1) /* MII Status Register */ + /* 0x0b-0x11: Reserved */ +#define ENC_EREVID REGADDR(0x12, 3, 0) /* Ethernet Revision ID */ + /* 0x13-0x14: Reserved */ +#define ENC_ECOCON REGADDR(0x15, 3, 0) /* Clock Output Control */ + /* 0x16: Reserved */ +#define ENC_EFLOCON REGADDR(0x17, 3, 0) /* Ethernet Flow Control */ +#define ENC_EPAUSL REGADDR(0x18, 3, 0) /* Pause Timer Value Low Byte (EPAUS<7:0>) */ +#define ENC_EPAUSH REGADDR(0x19, 3, 0) /* Pause Timer Value High Byte (EPAUS<15:8>) */ + /* 0x1a: Reserved */ + /* 0x1b-0x1f: EIE, EIR, ESTAT, ECON2, ECON1 */ + +/* Built-in Self-Test Control Register Bit Definitions */ + +#define EBSTCON_BISTST (1 << 0) /* Bit 0: Built-in Self-Test Start/Busy */ +#define EBSTCON_TME (1 << 1) /* Bit 1: Test Mode Enable */ +#define EBSTCON_TMSEL0 (1 << 2) /* Bit 2: Test Mode Select */ +#define EBSTCON_TMSEL1 (1 << 3) /* Bit 3: " " " " " " */ +#define EBSTCON_PSEL (1 << 4) /* Bit 4: Port Select */ +#define EBSTCON_PSV0 (1 << 5) /* Bit 5: Pattern Shift Value */ +#define EBSTCON_PSV1 (1 << 6) /* Bit 6: " " " " " */ +#define EBSTCON_PSV2 (1 << 7) /* Bit 7: " " " " " */ + +/* MII Status Register Register Bit Definitions */ + +#define MISTAT_BUSY (1 << 0) /* Bit 0: MII Management Busy */ +#define MISTAT_SCAN (1 << 1) /* Bit 1: MII Management Scan Operation */ +#define MISTAT_NVALID (1 << 2) /* Bit 2: MII Management Read Data Not Valid */ + /* Bits 3-7: Reserved or unimplemented */ + +/* Ethernet Flow Control Register Bit Definitions */ + +#define EFLOCON_FCEN0 (1 << 0) /* Bit 0: Flow Control Enable */ +#define EFLOCON_FCEN1 (1 << 1) /* Bit 1: " " " " " " */ +#define EFLOCON_FULDPXS (1 << 2) /* Bit 2: Read-Only MAC Full-Duplex Shadow */ + /* Bits 3-7: Reserved or unimplemented */ + +/* PHY Registers ************************************************************/ + +#define ENC_PHCON1 (0x00) /* PHY Control Register 1 */ +#define ENC_PHSTAT1 (0x01) /* PHY Status 1 */ +#define ENC_PHID1 (0x02) /* PHY ID Register 1 */ +#define ENC_PHID2 (0x03) /* PHY ID Register 2 */ +#define ENC_PHCON2 (0x10) /* PHY Control Register 2 */ +#define ENC_PHSTAT2 (0x11) /* PHY Status 2 */ +#define ENC_PHIE (0x12) /* PHY Interrupt Enable Register */ +#define ENC_PHIR (0x13) /* PHY Interrupt Request Register */ +#define ENC_PHLCON (0x14) + +/* PHY Control Register 1 Register Bit Definitions */ + +#define PHCON1_PDPXMD (1 << 8) /* Bit 8: PHY Duplex Mode */ +#define PHCON1_PPWRSV (1 << 11) /* Bit 11: PHY Power-Down */ +#define PHCON1_PLOOPBK (1 << 14) /* Bit 14: PHY Loopback */ +#define PHCON1_PRST (1 << 15) /* Bit 15: PHY Software Reset */ + +/* PHY Status 1 Register Bit Definitions */ + +#define PHSTAT1_JBSTAT (1 << 1) /* Bit 1: PHY Latching Jabber Status */ +#define PHSTAT1_LLSTAT (1 << 2) /* Bit 2: PHY Latching Link Status */ +#define PHSTAT1_PHDPX (1 << 11) /* Bit 11: PHY Half-Duplex Capable */ +#define PHSTAT1_PFDPX (1 << 12) /* Bit 12: PHY Full-Duplex Capable */ + +/* PHY Control Register 2 Register Bit Definitions */ + +#define PHCON2_HDLDIS (1 << 8) /* Bit 8: PHY Half-Duplex Loopback Disable */ +#define PHCON2_JABBER (1 << 10) /* Bit 10: Jabber Correction Disable */ +#define PHCON2_TXDIS (1 << 13) /* Bit 13: Twisted-Pair Transmitter Disable */ +#define PHCON2_FRCLINK (1 << 14) /* Bit 14: PHY Force Linkup */ + +/* PHY Status 2 Register Bit Definitions */ + +#define PHSTAT2_PLRITY (1 << 5) /* Bit 5: Polarity Status */ +#define PHSTAT2_DPXSTAT (1 << 9) /* Bit 9: PHY Duplex Status */ +#define PHSTAT2_LSTAT (1 << 10) /* Bit 10: PHY Link Status */ +#define PHSTAT2_COLSTAT (1 << 11) /* Bit 11: PHY Collision Status */ +#define PHSTAT2_RXSTAT (1 << 12) /* Bit 12: PHY Receive Status */ +#define PHSTAT2_TXSTAT (1 << 13) /* Bit 13: PHY Transmit Status */ + +/* PHY Interrupt Enable Register Bit Definitions */ + +#define PHIE_PGEIE (1 << 1) /* Bit 1: PHY Global Interrupt Enable */ +#define PHIE_PLNKIE (1 << 4) /* Bit 4: PHY Link Change Interrupt Enable */ + +/* PHIR Regiser Bit Definitions */ + +#define PHIR_PGIF (1 << 2) /* Bit 2: PHY Global Interrupt */ +#define PHIR_PLNKIF (1 << 4) /* Bit 4: PHY Link Change Interrupt */ + +/* PHLCON Regiser Bit Definitions */ + /* Bit 0: Reserved */ +#define PHLCON_STRCH (1 << 1) /* Bit 1: LED Pulse Stretching Enable */ +#define PHLCON_LFRQ0 (1 << 2) /* Bit 2: LED Pulse Stretch Time Configuration */ +#define PHLCON_LFRQ1 (1 << 3) /* Bit 3: " " " " " " " " " */ +#define PHLCON_LBCFG0 (1 << 4) /* Bit 4: LEDB Configuration */ +#define PHLCON_LBCFG1 (1 << 5) /* Bit 5: " " " " */ +#define PHLCON_LBCFG2 (1 << 6) /* Bit 6: " " " " */ +#define PHLCON_LBCFG3 (1 << 7) /* Bit 7: " " " " */ +#define PHLCON_LACFG0 (1 << 8) /* Bit 8: LEDA Configuration */ +#define PHLCON_LACFG1 (1 << 9) /* Bit 9: " " " " */ +#define PHLCON_LACFG2 (1 << 10) /* Bit 10: " " " " */ +#define PHLCON_LACFG3 (1 << 11) /* Bit 11: " " " " */ + +/* Packet Memory ************************************************************/ + +/* 8-Kbyte Transmit/Receive Packet Dual Port SRAM */ + +#define PKTMEM_START 0x0000 +#define PKTMEM_END 0x1fff + +/* maximum transfer unit */ +#define CONFIG_NET_ETH_MTU 1500 + +/* Packet Control Bits Definitions ******************************************/ + +#define PKTCTRL_POVERRIDE (1 << 0) /* Bit 0: Per Packet Override */ +#define PKTCTRL_PCRCEN (1 << 1) /* Bit 1: Per Packet CRC Enable */ +#define PKTCTRL_PPADEN (1 << 2) /* Bit 2: Per Packet Padding Enable */ +#define PKTCTRL_PHUGEEN (1 << 3) /* Bit 3: Per Packet Huge Frame Enable */ + +/* RX Status Bit Definitions ************************************************/ + +#define RXSTAT_LDEVENT (1 << 0) /* Bit 0: Long event or pack dropped */ + /* Bit 1: Reserved */ +#define RXSTAT_CEPS (1 << 2) /* Bit 2: Carrier event previously seen */ + /* Bit 3: Reserved */ +#define RXSTAT_CRCERROR (1 << 4) /* Bit 4: Frame CRC field bad */ +#define RXSTAT_LENERROR (1 << 5) /* Bit 5: Packet length != data length */ +#define RXSTAT_LENRANGE (1 << 6) /* Bit 6: Type/length field > 1500 bytes */ +#define RXSTAT_OK (1 << 7) /* Bit 7: Packet with valid CRC and no symbol errors */ +#define RXSTAT_MCAST (1 << 8) /* Bit 8: Packet with multicast address */ +#define RXSTAT_BCAST (1 << 9) /* Bit 9: Packet with broadcast address */ +#define RXSTAT_DRIBBLE (1 << 10) /* Bit 10: Additional bits received after packet */ +#define RXSTAT_CTRLFRAME (1 << 11) /* Bit 11: Control frame with valid type/length */ +#define RXSTAT_PAUSE (1 << 12) /* Bit 12: Control frame with pause frame opcde */ +#define RXSTAT_UNKOPCODE (1 << 13) /* Bit 13: Control frame with unknown opcode */ +#define RXSTAT_VLANTYPE (1 << 14) /* Bit 14: Current frame is a VLAN tagged frame */ + /* Bit 15: Zero */ +/* TSV bit definitions */ +#define TSV_LATECOL (1 << 5) /* Bit 5: Late Collision Error, RSV byte 3 */ + + + +/** @defgroup ETH_Duplex_Mode ETH Duplex Mode + * @{ + */ +#define ETH_MODE_FULLDUPLEX ((uint32_t)0x00000800) +#define ETH_MODE_HALFDUPLEX ((uint32_t)0x00000000) +/** + * @} + */ + +/** @defgroup ETH_Rx_Mode ETH Rx Mode + * @{ + */ +#define ETH_RXPOLLING_MODE ((uint32_t)0x00000000) +#define ETH_RXINTERRUPT_MODE ((uint32_t)0x00000001) +/** + * @} + */ + +/** @defgroup ETH_Checksum_Mode ETH Checksum Mode + * @{ + */ +#define ETH_CHECKSUM_BY_HARDWARE ((uint32_t)0x00000000) +#define ETH_CHECKSUM_BY_SOFTWARE ((uint32_t)0x00000001) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup SPI_Exported_Functions + * @{ + */ + +/** @addtogroup SPI_Exported_Functions_Group1 + * @{ + */ +/* Initialization/de-initialization functions **********************************/ + + +/** + * Initialize the enc28j60 and configure the needed hardware resources + * param handle: Handle on data configuration. + * retval None + */ + +bool ENC_Start(ENC_HandleTypeDef *handle); + +/**************************************************************************** + * Function: ENC_SetMacAddr + * + * Description: + * Set the MAC address to the configured value. This is done after ifup + * or after a TX timeout. Note that this means that the interface must + * be down before configuring the MAC addr. + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_SetMacAddr(ENC_HandleTypeDef *handle); + +/**************************************************************************** + * Function: ENC_RestoreTXBuffer + * + * Description: + * Prepare TX buffer + * + * Parameters: + * handle - Reference to the driver state structure + * len - length of buffer + * + * Returned Value: + * ERR_OK 0 No error, everything OK. + * ERR_MEM -1 Out of memory error. + * ERR_TIMEOUT -3 Timeout. + * + * Assumptions: + * + ****************************************************************************/ + +int8_t ENC_RestoreTXBuffer(ENC_HandleTypeDef *handle, uint16_t len); + +/**************************************************************************** + * Function: ENC_WriteBuffer + * + * Description: + * Write a buffer of data. + * + * Parameters: + * buffer - A pointer to the buffer to write from + * buflen - The number of bytes to write + * + * Returned Value: + * None + * + * Assumptions: + * Read pointer is set to the correct address + * + ****************************************************************************/ + +void ENC_WriteBuffer(void *buffer, uint16_t buflen); + +/**************************************************************************** + * Function: ENC_Transmit + * + * Description: + * Start hardware transmission. Called either from: + * + * - pkif interrupt when an application responds to the receipt of data + * by trying to send something, or + * - From watchdog based polling. + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * none + * + * Assumptions: + * + ****************************************************************************/ + +#ifdef USE_PROTOTHREADS +PT_THREAD(ENC_Transmit(struct pt *pt, ENC_HandleTypeDef *handle)); +#else +void ENC_Transmit(ENC_HandleTypeDef *handle); +#endif + + /** + * @} + */ + + /** + * @} + */ + +/**************************************************************************** + * Function: ENC_GetReceivedFrame + * + * Description: + * Check if we have received packet, and if so, retrive them. + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * true if new packet is available; false otherwise + * + * Assumptions: + * + ****************************************************************************/ + +bool ENC_GetReceivedFrame(ENC_HandleTypeDef *handle); + +/**************************************************************************** + * Function: ENC_IRQHandler + * + * Description: + * Perform interrupt handling logic outside of the interrupt handler (on + * the work queue thread). + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_IRQHandler(ENC_HandleTypeDef *handle); + +/**************************************************************************** + * Function: ENC_EnableInterrupts + * + * Description: + * Enable individual ENC28J60 interrupts + * + * Parameters: + * bits - The individual bits to enable + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_EnableInterrupts(uint8_t bits); + +/**************************************************************************** + * Function: ENC_GetPkcnt + * + * Description: + * Get the number of pending receive packets + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * the number of receive packet not processed yet + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_GetPkcnt(ENC_HandleTypeDef *handle); + + +/**************************************************************************** + * Function: up_udelay + * + * Description: + * wait us �s + * + * Parameters: + * us - The amount of time to wait in �s + * + * Returned Value: + * none + * + * Assumptions: + * + ****************************************************************************/ + +void up_udelay(uint32_t us); + +#endif /* ENC28J60_H_INCLUDED */ diff --git a/part14-spi-ethernet-interrupt/net/encspi.c b/part14-spi-ethernet-interrupt/net/encspi.c new file mode 100644 index 0000000..524f73f --- /dev/null +++ b/part14-spi-ethernet-interrupt/net/encspi.c @@ -0,0 +1,21 @@ +#include "../include/spi.h" + +void ENC_SPI_Select(unsigned char truefalse) { + spi_chip_select(!truefalse); // If it's true, select 0 (the ENC), if false, select 1 (i.e. deselect the ENC) +} + +void ENC_SPI_SendBuf(unsigned char *master2slave, unsigned char *slave2master, unsigned short bufferSize) { + spi_chip_select(0); + spi_send_recv(master2slave, slave2master, bufferSize); + spi_chip_select(1); // De-select the ENC +} + +void ENC_SPI_Send(unsigned char command) { + spi_chip_select(0); + spi_send(&command, 1); + spi_chip_select(1); // De-select the ENC +} + +void ENC_SPI_SendWithoutSelection(unsigned char command) { + spi_send(&command, 1); +} diff --git a/part15a-tcpip-webserver-gpio-interrupt/Makefile b/part15a-tcpip-webserver-gpio-interrupt/Makefile new file mode 100644 index 0000000..389f0bd --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/Makefile @@ -0,0 +1,26 @@ + +BOOTMNT ?= /media/cvdeveloper/bootfs + +CFILES = $(wildcard *.c lib/*.c kernel/*.c net/*.c tcpip/*.c) +SFILES = $(wildcard boot/*.S lib/*.S kernel/*.S) +OFILES = $(CFILES:.c=.o) $(SFILES:.S=.o) +GCCFLAGS = -Wall -O2 -ffreestanding -nostdlib -nostartfiles +GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin + +all: clean kernel8.img + +%.o: %.c + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ + +%.o: %.S + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ + +kernel8.img: $(OFILES) + $(GCCPATH)/aarch64-none-elf-ld -nostdlib $(OFILES) -T boot/link.ld -o kernel8.elf + $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img + cp kernel8.img $(BOOTMNT)/kernel8.img + cp config.txt $(BOOTMNT)/ + sync + +clean: + /bin/rm kernel8.elf */*.o *.img > /dev/null 2> /dev/null || true diff --git a/part15a-tcpip-webserver-gpio-interrupt/README.md b/part15a-tcpip-webserver-gpio-interrupt/README.md new file mode 100644 index 0000000..2f8205a --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/README.md @@ -0,0 +1,96 @@ +Writing a "bare metal" operating system for Raspberry Pi 4 (Part 15) +==================================================================== + +[< Go back to part14-spi-ethernet](../part14-spi-ethernet) + +Adding a TCP/IP stack +--------------------- +Having achieved "proof of life" from our Ethernet module in _part14-spi-ethernet_, you're doubtless wondering how to go from there to serving web pages, posting tweets on Twitter or perhaps even just simply responding to a ping! + +This is where you'll need a fully-fledged TCP/IP stack that goes way beyond handcrafted ARPs, implementing many more protocols to achieve efficient bi-directional communication. + +In this part we make use of some code from Guido Socher of [tuxgraphics.org](http://tuxgraphics.org/), designed to be a lightweight TCP/IP stack for embedded devices. I chose this because it was super simple to get working (or "port"), but you might want to look at [LwIP](https://en.wikipedia.org/wiki/LwIP) if you need something more advanced. + +The code +-------- +Most of the new code is in the _tcpip/_ subdirectory. I actually came across it in [this tarball](http://tuxgraphics.org/common/src2/article09051/eth_tcp_client_server-dhcp-5.10.tar.gz) and, again, made only a very few cosmetic changes (`diff` is your friend!). + +It did require me to expose the `strlen()` function we implemented in _lib/fb.c_, so that's added to _include/fb.h_. Similarly, we expose the `memcpy()` function we implemented in _kernel/kernel.c_, so that's added to _kernel/kernel.h_. + +I also needed a single function that tells the ENC to send a packet. Nothing new here, just different packaging: + +```c +void enc28j60PacketSend(unsigned short buflen, void *buffer) { + if (ENC_RestoreTXBuffer(&handle, buflen) == 0) { + ENC_WriteBuffer((unsigned char *) buffer, buflen); + handle.transmitLength = buflen; + ENC_Transmit(&handle); + } +} +``` + +This was also added to _kernel/kernel.h_. + +What happened to _arp.c_? +------------------------- +You'll notice that I've merged _arp.c_ and _kernel.c_. I have also gone away from doing anything wih multicore or IRQ timers to keep this kernel simple. We still initialise the network card in exactly the same way but, when we're done, we call this function in Guido's code: + +```c +init_udp_or_www_server(myMAC, deviceIP); +``` + +This tells the TCP/IP library who we are, so we're all on the same page! + +Finally, and aside from a little cleanup (eg. moving the HAL/system timer functions to _lib/io.c_ with the commensurate changes to _include/io.h_), the major change is the new `serve()` function: + +```c +void serve(void) +{ + while (1) { + while (!ENC_GetReceivedFrame(&handle)); + + uint8_t *buf = (uint8_t *)handle.RxFrameInfos.buffer; + uint16_t len = handle.RxFrameInfos.length; + uint16_t dat_p = packetloop_arp_icmp_tcp(buf, len); + + if (dat_p != 0) { + debugstr("Incoming web request... "); + + if (strncmp("GET ", (char *)&(buf[dat_p]), 4) != 0) { + debugstr("not GET"); + dat_p = fill_tcp_data(buf, 0, "HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n

ERROR

"); + } else { + if (strncmp("/ ", (char *)&(buf[dat_p+4]), 2) == 0) { + // just one web page in the "root directory" of the web server + debugstr("GET root"); + dat_p = fill_tcp_data(buf, 0, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n

Hello world!

"); + } else { + // just one web page not in the "root directory" of the web server + debugstr("GET not root"); + dat_p = fill_tcp_data(buf, 0, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n

Goodbye cruel world.

"); + } + } + + www_server_reply(buf, dat_p); // send web page data + debugcrlf(); + } + } +} +``` + +This is an infinite loop which waits for an incoming packet and then firstly passes it to Guido's `packetloop_arp_icmp_tcp()` function. This function implements some useful things, like responding to pings. I modified the routine to print a message to the screen when it sends a "pong" (look from line 1371 of _tcpip/ip_arp_udp_tcp.c_), so we can see when it's in action! + +Examining the return value of `packetloop_arp_icmp_tcp()` then allows us to check whether there is an incoming web request, since we've configured the TCP/IP library to be a web server in _tcpip/ip_config.h_ with `#define WWW_server`. + +We then serve responses based on three possible cases: + + * The incoming request is not a GET request (eg. maybe it's a HEAD request) - you can simulate this using the `curl` tool: `curl -I 192.168.0.66` + * The incoming request is a GET request for the root web page `/` - `curl 192.168.0.66/` + * The incoming request is a GET request for any non-root web page - eg. `curl 192.168.0.66/babbleberry/monkey` + +I recommend reading [this page](http://tuxgraphics.org/electronics/200905/embedded-tcp-ip-stack.shtml) for a full explanation. The code I have ported is very similar to what you see there. + +_Imagine my excitement when I built, ran and could ping my RPi4 at 192.168.0.66 and get a web response to my browser on both my laptop and my iPhone!_ + +![Pinging from my iPhone](images/15-tcpip-webserver-pinging.jpg) +![Browsing from my laptop](images/15-tcpip-webserver-browser.png) diff --git a/part15a-tcpip-webserver-gpio-interrupt/boot/boot.S b/part15a-tcpip-webserver-gpio-interrupt/boot/boot.S new file mode 100644 index 0000000..f644aee --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/boot/boot.S @@ -0,0 +1,114 @@ +#include "sysregs.h" + +#define LOCAL_CONTROL 0xff800000 +#define LOCAL_PRESCALER 0xff800008 +#define OSC_FREQ 54000000 +#define MAIN_STACK 0x400000 + +.section ".text.boot" // Make sure the linker puts this at the start of the kernel image + +.global _start // Execution starts here + +_start: + ldr x0, =LOCAL_CONTROL // Sort out the timer + str wzr, [x0] + mov w1, 0x80000000 + str w1, [x0, #(LOCAL_PRESCALER - LOCAL_CONTROL)] + + ldr x0, =OSC_FREQ + msr cntfrq_el0, x0 + msr cntvoff_el2, xzr + + // Check processor ID is zero (executing on main core), else hang + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, 2f + + // We're not on the main core, so hang in an infinite wait loop + adr x5, spin_cpu0 +1: wfe + ldr x4, [x5, x1, lsl #3] + cbz x4, 1b + + ldr x2, =__stack_start // Get ourselves a fresh stack - location depends on CPU core asking + lsl x1, x1, #9 // Multiply core_number by 512 + add x3, x2, x1 // Add to the address + mov sp, x3 + + mov x0, #0 + mov x1, #0 + mov x2, #0 + mov x3, #0 + br x4 + b 1b +2: // We're on the main core! + // First enable the FPU + + mov x0, #0x33ff + msr cptr_el3, x0 // Disable coprocessor traps to EL3 + mov x0, #3 << 20 + msr cpacr_el1, x0 // Enable FP/SIMD at EL1 + + // Now get ready to switch from EL3 down to EL1 + + ldr x0, =SCTLR_VALUE_MMU_DISABLED + msr sctlr_el1, x0 + + ldr x0, =HCR_VALUE + msr hcr_el2, x0 + + ldr x0, =SCR_VALUE + msr scr_el3, x0 + + ldr x0, =SPSR_VALUE + msr spsr_el3, x0 + + adr x0, el1_entry + msr elr_el3, x0 + + eret +el1_entry: + // We're in EL1 + // Clean the BSS section + ldr x1, =__bss_start // Start address + ldr w2, =__bss_size // Size of the section +3: cbz w2, 4f // Quit loop if zero + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, 3b // Loop if non-zero + + // Set stack to start somewhere safe + mov sp, #MAIN_STACK + + // Jump to our main() routine in C (make sure it doesn't return) +4: bl main + // In case it does return, halt the master core too + b 1b + +.ltorg + +.org 0x110 +.globl spin_cpu0 +spin_cpu0: + .quad 0 + +.org 0x118 +.globl spin_cpu1 +spin_cpu1: + .quad 0 + +.org 0x120 +.globl spin_cpu2 +spin_cpu2: + .quad 0 + +.org 0x128 +.globl spin_cpu3 +spin_cpu3: + .quad 0 + +.globl get_el +get_el: + mrs x0, CurrentEL + lsr x0, x0, #2 + ret diff --git a/part15a-tcpip-webserver-gpio-interrupt/boot/link.ld b/part15a-tcpip-webserver-gpio-interrupt/boot/link.ld new file mode 100644 index 0000000..4e84390 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/boot/link.ld @@ -0,0 +1,35 @@ +SECTIONS +{ + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + __bss_size = (__bss_end - __bss_start)>>3; + } + .cpu1Stack : + { + . = ALIGN(16); + __stack_start = .; + . = . + 512; + __cpu1_stack = .; + } + .cpu2Stack : + { + . = . + 512; + __cpu2_stack = .; + } + .cpu3Stack : + { + . = . + 512; + __cpu3_stack = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} diff --git a/part15a-tcpip-webserver-gpio-interrupt/boot/sysregs.h b/part15a-tcpip-webserver-gpio-interrupt/boot/sysregs.h new file mode 100644 index 0000000..385cd79 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/boot/sysregs.h @@ -0,0 +1,44 @@ +#ifndef _SYSREGS_H +#define _SYSREGS_H + +// *************************************** +// SCTLR_EL1, System Control Register (EL1), Page 2654 of AArch64-Reference-Manual. +// *************************************** + +#define SCTLR_RESERVED (3 << 28) | (3 << 22) | (1 << 20) | (1 << 11) +#define SCTLR_EE_LITTLE_ENDIAN (0 << 25) +#define SCTLR_EOE_LITTLE_ENDIAN (0 << 24) +#define SCTLR_I_CACHE_DISABLED (0 << 12) +#define SCTLR_D_CACHE_DISABLED (0 << 2) +#define SCTLR_I_CACHE_ENABLED (1 << 12) +#define SCTLR_D_CACHE_ENABLED (1 << 2) +#define SCTLR_MMU_DISABLED (0 << 0) +#define SCTLR_MMU_ENABLED (1 << 0) + +#define SCTLR_VALUE_MMU_DISABLED (SCTLR_RESERVED | SCTLR_EE_LITTLE_ENDIAN | SCTLR_I_CACHE_ENABLED | SCTLR_D_CACHE_ENABLED | SCTLR_MMU_DISABLED) + +// *************************************** +// HCR_EL2, Hypervisor Configuration Register (EL2), Page 2487 of AArch64-Reference-Manual. +// *************************************** + +#define HCR_RW (1 << 31) +#define HCR_VALUE HCR_RW + +// *************************************** +// SCR_EL3, Secure Configuration Register (EL3), Page 2648 of AArch64-Reference-Manual. +// *************************************** + +#define SCR_RESERVED (3 << 4) +#define SCR_RW (1 << 10) +#define SCR_NS (1 << 0) +#define SCR_VALUE (SCR_RESERVED | SCR_RW | SCR_NS) + +// *************************************** +// SPSR_EL3, Saved Program Status Register (EL3) Page 389 of AArch64-Reference-Manual. +// *************************************** + +#define SPSR_MASK_ALL (7 << 6) +#define SPSR_EL1h (5 << 0) +#define SPSR_VALUE (SPSR_MASK_ALL | SPSR_EL1h) + +#endif diff --git a/part15a-tcpip-webserver-gpio-interrupt/config.txt b/part15a-tcpip-webserver-gpio-interrupt/config.txt new file mode 100644 index 0000000..41944de --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/config.txt @@ -0,0 +1,53 @@ +# For more options and information see +# http://rptl.io/configtxt +# Some settings may impact device functionality. See link above for details + +# Uncomment some or all of these to enable the optional hardware interfaces +#dtparam=i2c_arm=on +#dtparam=i2s=on +#dtparam=spi=on + +# Enable audio (loads snd_bcm2835) +dtparam=audio=on + +# Additional overlays and parameters are documented +# /boot/firmware/overlays/README + +# Automatically load overlays for detected cameras +camera_auto_detect=1 + +# Automatically load overlays for detected DSI displays +display_auto_detect=1 + +# Automatically load initramfs files, if found +auto_initramfs=1 + +# Enable DRM VC4 V3D driver +dtoverlay=vc4-kms-v3d +max_framebuffers=2 + +# Don't have the firmware create an initial video= setting in cmdline.txt. +# Use the kernel's default instead. +disable_fw_kms_setup=1 + +# Run in 64-bit mode +arm_64bit=1 + +# Disable compensation for displays with overscan +disable_overscan=1 + +# Run as fast as firmware / board allows +arm_boost=1 + +[cm4] +# Enable host mode on the 2711 built-in XHCI USB controller. +# This line should be removed if the legacy DWC2 controller is required +# (e.g. for USB device mode) or if USB support is not required. +otg_mode=1 + +[all] +kernel_old=1 +disable_commandline_tags=1 +core_freq_min=500 +hdmi_group=1 +hdmi_mode=16 diff --git a/part15a-tcpip-webserver-gpio-interrupt/images/15-tcpip-webserver-browser.png b/part15a-tcpip-webserver-gpio-interrupt/images/15-tcpip-webserver-browser.png new file mode 100644 index 0000000000000000000000000000000000000000..14cfdc044d43748d33b54698ca4ba7262380d402 GIT binary patch literal 531734 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

G?EL7@U32c9|b1@$8nPjo6cA? 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 le>XQ=9=|M!6! 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

?r}FBq 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 c$v) + { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00}, // U+003F (?) + { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00}, // U+0040 (@) + { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // U+0041 (A) + { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00}, // U+0042 (B) + { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00}, // U+0043 (C) + { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00}, // U+0044 (D) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00}, // U+0045 (E) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00}, // U+0046 (F) + { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00}, // U+0047 (G) + { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // U+0048 (H) + { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0049 (I) + { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00}, // U+004A (J) + { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00}, // U+004B (K) + { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00}, // U+004C (L) + { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00}, // U+004D (M) + { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00}, // U+004E (N) + { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00}, // U+004F (O) + { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00}, // U+0050 (P) + { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00}, // U+0051 (Q) + { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00}, // U+0052 (R) + { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00}, // U+0053 (S) + { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0054 (T) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00}, // U+0055 (U) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V) + { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // U+0057 (W) + { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00}, // U+0058 (X) + { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00}, // U+0059 (Y) + { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z) + { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00}, // U+005B ([) + { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00}, // U+005C (\) + { 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00}, // U+005D (]) + { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00}, // U+005E (^) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // U+005F (_) + { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0060 (`) + { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00}, // U+0061 (a) + { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00}, // U+0062 (b) + { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00}, // U+0063 (c) + { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00}, // U+0064 (d) + { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e) + { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00}, // U+0066 (f) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0067 (g) + { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00}, // U+0068 (h) + { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0069 (i) + { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E}, // U+006A (j) + { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00}, // U+006B (k) + { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+006C (l) + { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // U+006D (m) + { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00}, // U+006E (n) + { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+006F (o) + { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F}, // U+0070 (p) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78}, // U+0071 (q) + { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r) + { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00}, // U+0073 (s) + { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00}, // U+0074 (t) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00}, // U+0075 (u) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0076 (v) + { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00}, // U+0077 (w) + { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00}, // U+0078 (x) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0079 (y) + { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00}, // U+007A (z) + { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // U+007B ({) + { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, // U+007C (|) + { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // U+007D (}) + { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007E (~) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007F + { 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x18, 0x30, 0x1E}, // U+00C7 (C cedille) + { 0x00, 0x33, 0x00, 0x33, 0x33, 0x33, 0x7E, 0x00}, // U+00FC (u umlaut) + { 0x38, 0x00, 0x1E, 0x33, 0x3F, 0x03, 0x1E, 0x00}, // U+00E9 (e aigu) + { 0x7E, 0xC3, 0x3C, 0x60, 0x7C, 0x66, 0xFC, 0x00}, // U+00E2 (a circumflex) + { 0x33, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00}, // U+00E4 (a umlaut) + { 0x07, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00}, // U+00E0 (a grave) + { 0x0C, 0x0C, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00}, // U+00E5 (a ring) + { 0x00, 0x00, 0x1E, 0x03, 0x03, 0x1E, 0x30, 0x1C}, // U+00E7 (c cedille) + { 0x7E, 0xC3, 0x3C, 0x66, 0x7E, 0x06, 0x3C, 0x00}, // U+00EA (e circumflex) + { 0x33, 0x00, 0x1E, 0x33, 0x3F, 0x03, 0x1E, 0x00}, // U+00EB (e umlaut) + { 0x07, 0x00, 0x1E, 0x33, 0x3F, 0x03, 0x1E, 0x00}, // U+00E8 (e grave) + { 0x33, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+00EF (i umlaut) + { 0x3E, 0x63, 0x1C, 0x18, 0x18, 0x18, 0x3C, 0x00}, // U+00EE (i circumflex) + { 0x07, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+00EC (i grave) + { 0x63, 0x1C, 0x36, 0x63, 0x7F, 0x63, 0x63, 0x00}, // U+00C4 (A umlaut) + { 0x0C, 0x0C, 0x00, 0x1E, 0x33, 0x3F, 0x33, 0x00}, // U+00C5 (A ring) + { 0x07, 0x00, 0x3F, 0x06, 0x1E, 0x06, 0x3F, 0x00}, // U+00C8 (E grave) + { 0x00, 0x00, 0xFE, 0x30, 0xFE, 0x33, 0xFE, 0x00}, // U+00E6 (ae) + { 0x7C, 0x36, 0x33, 0x7F, 0x33, 0x33, 0x73, 0x00}, // U+00C6 (AE) + { 0x1E, 0x33, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+00F4 (o circumflex) + { 0x00, 0x33, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+00F6 (o umlaut) + { 0x00, 0x07, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+00F2 (o grave) + { 0x1E, 0x33, 0x00, 0x33, 0x33, 0x33, 0x7E, 0x00}, // U+00FB (u circumflex) + { 0x00, 0x07, 0x00, 0x33, 0x33, 0x33, 0x7E, 0x00}, // U+00F9 (u grave) + { 0x00, 0x33, 0x00, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+00FF (y umlaut) + { 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00}, // U+00D6 (O umlaut) + { 0x33, 0x00, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+00DC (U umlaut) + { 0x18, 0x18, 0x7E, 0x03, 0x03, 0x7E, 0x18, 0x18}, // U+00A2 (dollarcents) + { 0x1C, 0x36, 0x26, 0x0F, 0x06, 0x67, 0x3F, 0x00}, // U+00A3 (pound sterling) + { 0x33, 0x33, 0x1E, 0x3F, 0x0C, 0x3F, 0x0C, 0x0C}, // U+00A5 (yen) + { 0x7C, 0xC6, 0x1C, 0x36, 0x36, 0x1C, 0x33, 0x1E}, // U+00A7 (paragraph) + { 0x70, 0xD8, 0x18, 0x3C, 0x18, 0x18, 0x1B, 0x0E}, // U+0192 (dutch florijn) + { 0x38, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x7E, 0x00}, // U+00E1 (a aigu) + { 0x1C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+00ED (i augu) + { 0x00, 0x38, 0x00, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+00F3 (o aigu) + { 0x00, 0x38, 0x00, 0x33, 0x33, 0x33, 0x7E, 0x00}, // U+00FA (u aigu) + { 0x00, 0x1F, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x00}, // U+00F1 (n ~) + { 0x3F, 0x00, 0x33, 0x37, 0x3F, 0x3B, 0x33, 0x00}, // U+00D1 (N ~) + { 0x3C, 0x36, 0x36, 0x7C, 0x00, 0x00, 0x00, 0x00}, // U+00AA (superscript a) + { 0x1C, 0x36, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00}, // U+00BA (superscript 0) + { 0x0C, 0x00, 0x0C, 0x06, 0x03, 0x33, 0x1E, 0x00}, // U+00BF (inverted ?) + { 0x00, 0x00, 0x00, 0x3F, 0x03, 0x03, 0x00, 0x00}, // U+2310 (gun pointing right) + { 0x00, 0x00, 0x00, 0x3F, 0x30, 0x30, 0x00, 0x00}, // U+00AC (gun pointing left) + { 0xC3, 0x63, 0x33, 0x7B, 0xCC, 0x66, 0x33, 0xF0}, // U+00BD (1/2) + { 0xC3, 0x63, 0x33, 0xBD, 0xEC, 0xF6, 0xF3, 0x03}, // U+00BC (1/4) + { 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00}, // U+00A1 (inverted !) + { 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00}, // U+00AB (<<) + { 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00}, // U+00BB (>>) + { 0x55, 0x00, 0xAA, 0x00, 0x55, 0x00, 0xAA, 0x00}, // U+2591 (25% solid) + { 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA}, // U+2592 (50% solid) + { 0xFF, 0xAA, 0xFF, 0x55, 0xFF, 0xAA, 0xFF, 0x55}, // U+2593 (75% solid) + { 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, // U+2502 (thin vertical) + { 0x08, 0x08, 0x08, 0x08, 0x0f, 0x08, 0x08, 0x08}, // U+2524 (down L, left L, up L) + { 0x08, 0x08, 0x08, 0x0F, 0x08, 0x0F, 0x08, 0x08}, // U+2561 (up L, down L, left D) + { 0x14, 0x14, 0x14, 0x14, 0x17, 0x14, 0x14, 0x14}, // U+2562 (up D, down D, left L) + { 0x00, 0x00, 0x00, 0x00, 0x1F, 0x14, 0x14, 0x14}, // U+2556 (down D, left L) + { 0x00, 0x00, 0x00, 0x0F, 0x08, 0x0F, 0x08, 0x08}, // U+2555 (down L, left D) + { 0x14, 0x14, 0x14, 0x17, 0x10, 0x17, 0x14, 0x14}, // U+2563 (up D, down D, left D) + { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14}, // U+2551 (double vertical) + { 0x00, 0x00, 0x00, 0x1F, 0x10, 0x17, 0x14, 0x14}, // U+2557 (down D, left D) + { 0x14, 0x14, 0x14, 0x17, 0x10, 0x1F, 0x00, 0x00}, // U+255D (up D, left D) + { 0x14, 0x14, 0x14, 0x14, 0x1F, 0x00, 0x00, 0x00}, // U+255C (up D, left L) + { 0x08, 0x08, 0x08, 0x0F, 0x08, 0x0F, 0x00, 0x00}, // U+255B (up L, left D) + { 0x00, 0x00, 0x00, 0x00, 0x0f, 0x08, 0x08, 0x08}, // U+2510 (down L, left L) + { 0x08, 0x08, 0x08, 0x08, 0xf8, 0x00, 0x00, 0x00}, // U+2514 (up L, right L) + { 0x08, 0x08, 0x08, 0x08, 0xff, 0x00, 0x00, 0x00}, // U+2534 (up L, right L, left L) + { 0x00, 0x00, 0x00, 0x00, 0xff, 0x08, 0x08, 0x08}, // U+252C (down L, right L, left L) + { 0x08, 0x08, 0x08, 0x08, 0xf8, 0x08, 0x08, 0x08}, // U+251C (down L, right L, up L) + { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00}, // U+2500 (thin horizontal) + { 0x08, 0x08, 0x08, 0x08, 0xff, 0x08, 0x08, 0x08}, // U+253C (up L, right L, left L, down L) + { 0x08, 0x08, 0x08, 0xF8, 0x08, 0xF8, 0x08, 0x08}, // U+255E (up L, down L, right D) + { 0x14, 0x14, 0x14, 0x14, 0xF4, 0x14, 0x14, 0x14}, // U+255F (up D, down D, right L) + { 0x14, 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x00, 0x00}, // U+255A (up D, right D) + { 0x00, 0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14}, // U+2554 (down D, right D) + { 0x14, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, 0x00}, // U+2569 (left D, right D, up D) + { 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14}, // U+2566 (left D, right D, down D) + { 0x14, 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x14, 0x14}, // U+2560 (up D, down D, right D) + { 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00}, // U+2550 (double horizontal) + { 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14}, // U+256C (left D, right D, down D, up D) + { 0x08, 0x08, 0x08, 0xFF, 0x00, 0xFF, 0x00, 0x00}, // U+2567 (left D, right D, up L) + { 0x14, 0x14, 0x14, 0x14, 0xFF, 0x00, 0x00, 0x00}, // U+2568 (left L, right L, up D) + { 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x08, 0x08}, // U+2564 (left D, right D, down L) + { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x14, 0x14, 0x14}, // U+2565 (left L, right L, down D) + { 0x14, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x00, 0x00}, // U+2559 (up D, right L) + { 0x08, 0x08, 0x08, 0xF8, 0x08, 0xF8, 0x00, 0x00}, // U+2558 (up L, right D) + { 0x00, 0x00, 0x00, 0xF8, 0x08, 0xF8, 0x08, 0x08}, // U+2552 (down L, right D) + { 0x00, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x14, 0x14}, // U+2553 (down D, right L) + { 0x14, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14}, // U+256B (left L, right L, down D, up D) + { 0x08, 0x08, 0x08, 0xFF, 0x08, 0xFF, 0x08, 0x08}, // U+256A (left D, right D, down L, up L) + { 0x08, 0x08, 0x08, 0x08, 0x0f, 0x00, 0x00, 0x00}, // U+2518 (up L, left L) + { 0x00, 0x00, 0x00, 0x00, 0xf8, 0x08, 0x08, 0x08}, // U+250C (down L, right L) + { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // U+2588 (solid) + { 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF}, // U+2584 (bottom half) + { 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F}, // U+258C (left half) + { 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0}, // U+2590 (right half) + { 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00}, // U+2580 (top half) +}; diff --git a/part15a-tcpip-webserver-gpio-interrupt/kernel/irq.c b/part15a-tcpip-webserver-gpio-interrupt/kernel/irq.c new file mode 100644 index 0000000..6e83ca3 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/kernel/irq.c @@ -0,0 +1,27 @@ +#include "kernel.h" + +void enable_interrupt_controller() { + REGS_IRQ->irq0_enable_0 = SYS_TIMER_IRQ_1 | SYS_TIMER_IRQ_3; +} + +void disable_interrupt_controller() { + REGS_IRQ->irq0_enable_0 = 0; +} + +void handle_irq() { + unsigned int irq = REGS_IRQ->irq0_pending_0; + + while(irq & (SYS_TIMER_IRQ_1 | SYS_TIMER_IRQ_3)) { + if (irq & SYS_TIMER_IRQ_1) { + irq &= ~SYS_TIMER_IRQ_1; + + handle_timer_1(); + } + + if (irq & SYS_TIMER_IRQ_3) { + irq &= ~SYS_TIMER_IRQ_3; + + handle_timer_3(); + } + } +} diff --git a/part15a-tcpip-webserver-gpio-interrupt/kernel/irqentry.S b/part15a-tcpip-webserver-gpio-interrupt/kernel/irqentry.S new file mode 100644 index 0000000..d24ae00 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/kernel/irqentry.S @@ -0,0 +1,160 @@ +#define SYNC_INVALID_EL1t 0 +#define IRQ_INVALID_EL1t 1 +#define FIQ_INVALID_EL1t 2 +#define ERROR_INVALID_EL1t 3 + +#define SYNC_INVALID_EL1h 4 +#define IRQ_INVALID_EL1h 5 +#define FIQ_INVALID_EL1h 6 +#define ERROR_INVALID_EL1h 7 + +#define SYNC_INVALID_EL0_64 8 +#define IRQ_INVALID_EL0_64 9 +#define FIQ_INVALID_EL0_64 10 +#define ERROR_INVALID_EL0_64 11 + +#define SYNC_INVALID_EL0_32 12 +#define IRQ_INVALID_EL0_32 13 +#define FIQ_INVALID_EL0_32 14 +#define ERROR_INVALID_EL0_32 15 + +//stack frame size +#define S_FRAME_SIZE 256 + +.macro kernel_entry + sub sp, sp, #S_FRAME_SIZE + stp x0, x1, [sp, #16 * 0] + stp x2, x3, [sp, #16 * 1] + stp x4, x5, [sp, #16 * 2] + stp x6, x7, [sp, #16 * 3] + stp x8, x9, [sp, #16 * 4] + stp x10, x11, [sp, #16 * 5] + stp x12, x13, [sp, #16 * 6] + stp x14, x15, [sp, #16 * 7] + stp x16, x17, [sp, #16 * 8] + stp x18, x19, [sp, #16 * 9] + stp x20, x21, [sp, #16 * 10] + stp x22, x23, [sp, #16 * 11] + stp x24, x25, [sp, #16 * 12] + stp x26, x27, [sp, #16 * 13] + stp x28, x29, [sp, #16 * 14] + str x30, [sp, #16 * 15] +.endm + +.macro kernel_exit + ldp x0, x1, [sp, #16 * 0] + ldp x2, x3, [sp, #16 * 1] + ldp x4, x5, [sp, #16 * 2] + ldp x6, x7, [sp, #16 * 3] + ldp x8, x9, [sp, #16 * 4] + ldp x10, x11, [sp, #16 * 5] + ldp x12, x13, [sp, #16 * 6] + ldp x14, x15, [sp, #16 * 7] + ldp x16, x17, [sp, #16 * 8] + ldp x18, x19, [sp, #16 * 9] + ldp x20, x21, [sp, #16 * 10] + ldp x22, x23, [sp, #16 * 11] + ldp x24, x25, [sp, #16 * 12] + ldp x26, x27, [sp, #16 * 13] + ldp x28, x29, [sp, #16 * 14] + ldr x30, [sp, #16 * 15] + add sp, sp, #S_FRAME_SIZE + eret +.endm + +.macro handle_invalid_entry type + kernel_entry + mov x0, #\type + mrs x1, esr_el1 + mrs x2, elr_el1 + + // We could pass this to a function to print an error here + // e.g. bl show_invalid_entry_message + // + // For now we'll just hang + + b err_hang +.endm + +.macro ventry label +.align 7 + b \label +.endm + +//Exception vectors table +.align 11 +.globl vectors +vectors: + ventry sync_invalid_el1t // Synchronous EL1t + ventry irq_invalid_el1t // IRQ EL1t + ventry fiq_invalid_el1t // FIQ EL1t + ventry error_invalid_el1t // Error EL1t + + ventry sync_invalid_el1h // Synchronous EL1h + ventry handle_el1_irq // IRQ EL1h + ventry fiq_invalid_el1h // FIQ EL1h + ventry error_invalid_el1h // Error EL1h + + ventry sync_invalid_el0_64 // Synchronous 64-bit EL0 + ventry irq_invalid_el0_64 // IRQ 64-bit EL0 + ventry fiq_invalid_el0_64 // FIQ 64-bit EL0 + ventry error_invalid_el0_64 // Error 64-bit EL0 + + ventry sync_invalid_el0_32 // Synchronous 32-bit EL0 + ventry irq_invalid_el0_32 // IRQ 32-bit EL0 + ventry fiq_invalid_el0_32 // FIQ 32-bit EL0 + ventry error_invalid_el0_32 // Error 32-bit EL0 + + +sync_invalid_el1t: + handle_invalid_entry SYNC_INVALID_EL1t + +irq_invalid_el1t: + handle_invalid_entry IRQ_INVALID_EL1t + +fiq_invalid_el1t: + handle_invalid_entry FIQ_INVALID_EL1t + +error_invalid_el1t: + handle_invalid_entry ERROR_INVALID_EL1t + +sync_invalid_el1h: + handle_invalid_entry SYNC_INVALID_EL1h + +fiq_invalid_el1h: + handle_invalid_entry FIQ_INVALID_EL1h + +error_invalid_el1h: + handle_invalid_entry ERROR_INVALID_EL1h + +sync_invalid_el0_64: + handle_invalid_entry SYNC_INVALID_EL0_64 + +irq_invalid_el0_64: + handle_invalid_entry IRQ_INVALID_EL0_64 + +fiq_invalid_el0_64: + handle_invalid_entry FIQ_INVALID_EL0_64 + +error_invalid_el0_64: + handle_invalid_entry ERROR_INVALID_EL0_64 + +sync_invalid_el0_32: + handle_invalid_entry SYNC_INVALID_EL0_32 + +irq_invalid_el0_32: + handle_invalid_entry IRQ_INVALID_EL0_32 + +fiq_invalid_el0_32: + handle_invalid_entry FIQ_INVALID_EL0_32 + +error_invalid_el0_32: + handle_invalid_entry ERROR_INVALID_EL0_32 + +handle_el1_irq: + kernel_entry + bl handle_irq + kernel_exit + +.globl err_hang +err_hang: b err_hang diff --git a/part15a-tcpip-webserver-gpio-interrupt/kernel/kernel.c b/part15a-tcpip-webserver-gpio-interrupt/kernel/kernel.c new file mode 100644 index 0000000..2a8aa6d --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/kernel/kernel.c @@ -0,0 +1,244 @@ +#include "../include/fb.h" +#include "../include/spi.h" +#include "../net/enc28j60.h" +#include "../tcpip/ip_arp_udp_tcp.h" +#include "kernel.h" + +// HELPER FUNCTIONS + +void *memset(void *dest, unsigned char val, unsigned short len) +{ + uint8_t *ptr = dest; + while (len-- > 0) + *ptr++ = val; + return dest; +} + +void *memcpy(void *dest, const void *src, unsigned short len) +{ + uint8_t *d = dest; + const uint8_t *s = src; + while (len--) + *d++ = *s++; + return dest; +} + +uint8_t memcmp(void *str1, void *str2, unsigned count) +{ + uint8_t *s1 = str1; + uint8_t *s2 = str2; + + while (count-- > 0) + { + if (*s1++ != *s2++) + return s1[-1] < s2[-1] ? -1 : 1; + } + + return 0; +} + +int strncmp(const char *s1, const char *s2, unsigned short n) +{ + unsigned char u1, u2; + + while (n-- > 0) + { + u1 = (unsigned char) *s1++; + u2 = (unsigned char) *s2++; + if (u1 != u2) return u1 - u2; + if (u1 == '\0') return 0; + } + + return 0; +} + +// NETWORKING GLOBALS AND FUNCTIONS + +ENC_HandleTypeDef handle; + +// MAC address to be assigned to the ENC28J60 +unsigned char myMAC[6] = { 0xb0, 0x07, 0x10, 0xad, 0xca, 0x11 }; + +// IP address to be assigned to the ENC28J60 +unsigned char deviceIP[4] = { 10, 7, 3, 20 }; + +void init_network(void) +{ + handle.Init.DuplexMode = ETH_MODE_HALFDUPLEX; + handle.Init.MACAddr = myMAC; + handle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE; + handle.Init.InterruptEnableBits = EIE_LINKIE | EIE_PKTIE; + + debugstr("Starting network up."); + debugcrlf(); + if (!ENC_Start(&handle)) { + debugstr("Could not initialise network card."); + } else { + debugstr("Setting MAC address to b0:07:10:ad:ca:11."); + debugcrlf(); + + ENC_SetMacAddr(&handle); + + debugstr("Network card successfully initialised."); + } + debugcrlf(); + + debugstr("Waiting for ifup... "); + while (!(handle.LinkStatus & PHSTAT2_LSTAT)) ENC_IRQHandler(&handle); + debugstr("done."); + debugcrlf(); + + // Re-enable global interrupts + ENC_EnableInterrupts(EIE_INTIE); + + debugstr("Initialising the TCP stack... "); + init_udp_or_www_server(myMAC, deviceIP); + debugstr("done."); + debugcrlf(); +} + +void enc28j60PacketSend(unsigned short buflen, void *buffer) { + if (ENC_RestoreTXBuffer(&handle, buflen) == 0) { + ENC_WriteBuffer((unsigned char *) buffer, buflen); + handle.transmitLength = buflen; + ENC_Transmit(&handle); + } +} + +void serve(void) +{ + while (1) { + while (!ENC_GetReceivedFrame(&handle)); + + uint8_t *buf = (uint8_t *)handle.RxFrameInfos.buffer; + uint16_t len = handle.RxFrameInfos.length; + uint16_t dat_p = packetloop_arp_icmp_tcp(buf, len); + + if (dat_p != 0) { + debugstr("Incoming web request... "); + + if (strncmp("GET ", (char *)&(buf[dat_p]), 4) != 0) { + debugstr("not GET"); + dat_p = fill_tcp_data(buf, 0, "HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n

ERROR

"); + } else { + if (strncmp("/ ", (char *)&(buf[dat_p+4]), 2) == 0) { + // just one web page in the "root directory" of the web server + debugstr("GET root"); + dat_p = fill_tcp_data(buf, 0, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n

Hello world!

"); + } else { + // just one web page not in the "root directory" of the web server + debugstr("GET not root"); + dat_p = fill_tcp_data(buf, 0, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n

Goodbye cruel world.

"); + } + } + + www_server_reply(buf, dat_p); // send web page data + debugcrlf(); + } + } +} +/* +// ISR for incoming packet + +debugstr("we are into isr now"); +// Re-enable Interrupts +ENC_IRQHandler(&handle); + +while (!ENC_GetReceivedFrame(&handle)); + +uint8_t *buf = (uint8_t *)handle.RxFrameInfos.buffer; +uint16_t len = handle.RxFrameInfos.length; +uint16_t dat_p = packetloop_arp_icmp_tcp(buf, len); + +if (dat_p != 0) { + debugstr("Incoming web request... "); + + if (strncmp("GET ", (char *)&(buf[dat_p]), 4) != 0) { + debugstr("not GET"); + dat_p = fill_tcp_data(buf, 0, "HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n

ERROR

"); + } else { + if (strncmp("/ ", (char *)&(buf[dat_p+4]), 2) == 0) { + // just one web page in the "root directory" of the web server + debugstr("GET root"); + dat_p = fill_tcp_data(buf, 0, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n

Hello world!

"); + } else { + // just one web page not in the "root directory" of the web server + debugstr("GET not root"); + dat_p = fill_tcp_data(buf, 0, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n

Goodbye cruel world.

"); + } + } + + www_server_reply(buf, dat_p); // send web page data + debugcrlf(); +} + +*/ +// TIMER FUNCTIONS + +const unsigned int timer1_int = CLOCKHZ; +const unsigned int timer3_int = CLOCKHZ / 4; +unsigned int timer1_val = 0; +unsigned int timer3_val = 0; + +void timer_init() { + timer1_val = REGS_TIMER->counter_lo; + timer1_val += timer1_int; + REGS_TIMER->compare[1] = timer1_val; + + timer3_val = REGS_TIMER->counter_lo; + timer3_val += timer3_int; + REGS_TIMER->compare[3] = timer3_val; +} + +void handle_timer_1() { + timer1_val += timer1_int; + REGS_TIMER->compare[1] = timer1_val; + REGS_TIMER->control_status |= SYS_TIMER_IRQ_1; + + unsigned int progval = timer1_val / timer1_int; + if (progval <= 100) { + //drawProgress(2, progval); + } else { + debugstr("Timer 1 done."); + debugcrlf(); + } +} + +void handle_timer_3() { + timer3_val += timer3_int; + REGS_TIMER->compare[3] = timer3_val; + REGS_TIMER->control_status |= SYS_TIMER_IRQ_3; + + unsigned int progval = timer3_val / timer3_int; + if (progval <= 100);// drawProgress(3, progval); +} + +// MAIN FUNCTION + +void main(void) +{ + fb_init(); + // Init GPIO interupt + //init_GPIOinterrupt(); + + // Kick off the timers + + irq_init_vectors(); + enable_interrupt_controller(); + irq_barrier(); + irq_enable(); + timer_init(); + + + // Init network and serve web pages + + spi_init(); + init_network(); + + serve(); + + // Catch us if we fall + + while(1); + +} diff --git a/part15a-tcpip-webserver-gpio-interrupt/kernel/kernel.h b/part15a-tcpip-webserver-gpio-interrupt/kernel/kernel.h new file mode 100644 index 0000000..9fc24e2 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/kernel/kernel.h @@ -0,0 +1,50 @@ +#define PERIPHERAL_BASE 0xFE000000 +#define CLOCKHZ 1000000 + +struct timer_regs { + volatile unsigned int control_status; + volatile unsigned int counter_lo; + volatile unsigned int counter_hi; + volatile unsigned int compare[4]; +}; + +#define REGS_TIMER ((struct timer_regs *)(PERIPHERAL_BASE + 0x00003000)) + +struct arm_irq_regs_2711 { + volatile unsigned int irq0_pending_0; + volatile unsigned int irq0_pending_1; + volatile unsigned int irq0_pending_2; + volatile unsigned int res0; + volatile unsigned int irq0_enable_0; + volatile unsigned int irq0_enable_1; + volatile unsigned int irq0_enable_2; + volatile unsigned int res1; + volatile unsigned int irq0_disable_0; + volatile unsigned int irq0_disable_1; + volatile unsigned int irq0_disable_2; +}; + +typedef struct arm_irq_regs_2711 arm_irq_regs; + +#define REGS_IRQ ((arm_irq_regs *)(PERIPHERAL_BASE + 0x0000B200)) + +enum vc_irqs { + SYS_TIMER_IRQ_0 = 1, + SYS_TIMER_IRQ_1 = 2, + SYS_TIMER_IRQ_2 = 4, + SYS_TIMER_IRQ_3 = 8, + AUX_IRQ = (1 << 29) +}; + +void irq_init_vectors(); +void irq_enable(); +void irq_barrier(); +void irq_disable(); +void enable_interrupt_controller(); +void disable_interrupt_controller(); + +void handle_timer_1(); +void handle_timer_3(); + +void enc28j60PacketSend(unsigned short buflen, void *buffer); +void *memcpy(void *dest, const void *src, unsigned short len); diff --git a/part15a-tcpip-webserver-gpio-interrupt/kernel/utils.S b/part15a-tcpip-webserver-gpio-interrupt/kernel/utils.S new file mode 100644 index 0000000..7a34152 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/kernel/utils.S @@ -0,0 +1,20 @@ +.globl irq_init_vectors +irq_init_vectors: + adr x0, vectors + msr vbar_el1, x0 + ret + +.globl irq_enable +irq_enable: + msr daifclr, #2 + ret + +.globl irq_disable +irq_disable: + msr daifset, #2 + ret + +.globl irq_barrier +irq_barrier: + dsb sy + ret diff --git a/part15a-tcpip-webserver-gpio-interrupt/lib/fb.c b/part15a-tcpip-webserver-gpio-interrupt/lib/fb.c new file mode 100644 index 0000000..2cc89f7 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/lib/fb.c @@ -0,0 +1,260 @@ +#include "../include/io.h" +#include "../include/mb.h" +#include "../include/terminal.h" + +unsigned int width, height, pitch, isrgb; +unsigned char *fb; + +int curx = 0; +int cury = 0; + +void fb_init() +{ + mbox[0] = 35*4; // Length of message in bytes + mbox[1] = MBOX_REQUEST; + + mbox[2] = MBOX_TAG_SETPHYWH; // Tag identifier + mbox[3] = 8; // Value size in bytes + mbox[4] = 0; + mbox[5] = 1920; // Value(width) + mbox[6] = 1080; // Value(height) + + mbox[7] = MBOX_TAG_SETVIRTWH; + mbox[8] = 8; + mbox[9] = 8; + mbox[10] = 1920; + mbox[11] = 1080; + + mbox[12] = MBOX_TAG_SETVIRTOFF; + mbox[13] = 8; + mbox[14] = 8; + mbox[15] = 0; // Value(x) + mbox[16] = 0; // Value(y) + + mbox[17] = MBOX_TAG_SETDEPTH; + mbox[18] = 4; + mbox[19] = 4; + mbox[20] = 32; // Bits per pixel + + mbox[21] = MBOX_TAG_SETPXLORDR; + mbox[22] = 4; + mbox[23] = 4; + mbox[24] = 1; // RGB + + mbox[25] = MBOX_TAG_GETFB; + mbox[26] = 8; + mbox[27] = 8; + mbox[28] = 4096; // FrameBufferInfo.pointer + mbox[29] = 0; // FrameBufferInfo.size + + mbox[30] = MBOX_TAG_GETPITCH; + mbox[31] = 4; + mbox[32] = 4; + mbox[33] = 0; // Bytes per line + + mbox[34] = MBOX_TAG_LAST; + + // Check call is successful and we have a pointer with depth 32 + if (mbox_call(MBOX_CH_PROP) && mbox[20] == 32 && mbox[28] != 0) { + mbox[28] &= 0x3FFFFFFF; // Convert GPU address to ARM address + width = mbox[10]; // Actual physical width + height = mbox[11]; // Actual physical height + pitch = mbox[33]; // Number of bytes per line + isrgb = mbox[24]; // Pixel order + fb = (unsigned char *)((long)mbox[28]); + } +} + +void drawPixel(int x, int y, unsigned char attr) +{ + int offs = (y * pitch) + (x * 4); + *((unsigned int*)(fb + offs)) = vgapal[attr & 0x0f]; +} + +void drawRect(int x1, int y1, int x2, int y2, unsigned char attr, int fill) +{ + int y=y1; + + while (y <= y2) { + int x=x1; + while (x <= x2) { + if ((x == x1 || x == x2) || (y == y1 || y == y2)) drawPixel(x, y, attr); + else if (fill) drawPixel(x, y, (attr & 0xf0) >> 4); + x++; + } + y++; + } +} + +void drawLine(int x1, int y1, int x2, int y2, unsigned char attr) +{ + int dx, dy, p, x, y; + + dx = x2-x1; + dy = y2-y1; + x = x1; + y = y1; + p = 2*dy-dx; + + while (x= 0) { + drawPixel(x,y,attr); + y++; + p = p+2*dy-2*dx; + } else { + drawPixel(x,y,attr); + p = p+2*dy; + } + x++; + } +} + +void drawCircle(int x0, int y0, int radius, unsigned char attr, int fill) +{ + int x = radius; + int y = 0; + int err = 0; + + while (x >= y) { + if (fill) { + drawLine(x0 - y, y0 + x, x0 + y, y0 + x, (attr & 0xf0) >> 4); + drawLine(x0 - x, y0 + y, x0 + x, y0 + y, (attr & 0xf0) >> 4); + drawLine(x0 - x, y0 - y, x0 + x, y0 - y, (attr & 0xf0) >> 4); + drawLine(x0 - y, y0 - x, x0 + y, y0 - x, (attr & 0xf0) >> 4); + } + drawPixel(x0 - y, y0 + x, attr); + drawPixel(x0 + y, y0 + x, attr); + drawPixel(x0 - x, y0 + y, attr); + drawPixel(x0 + x, y0 + y, attr); + drawPixel(x0 - x, y0 - y, attr); + drawPixel(x0 + x, y0 - y, attr); + drawPixel(x0 - y, y0 - x, attr); + drawPixel(x0 + y, y0 - x, attr); + + if (err <= 0) { + y += 1; + err += 2*y + 1; + } + + if (err > 0) { + x -= 1; + err -= 2*x + 1; + } + } +} + +void drawChar(unsigned char ch, int x, int y, unsigned char attr, int zoom) +{ + unsigned char *glyph = (unsigned char *)&font + (ch < FONT_NUMGLYPHS ? ch : 0) * FONT_BPG; + + for (int i=1;i<=(FONT_HEIGHT*zoom);i++) { + for (int j=0;j<(FONT_WIDTH*zoom);j++) { + unsigned char mask = 1 << (j/zoom); + unsigned char col = (*glyph & mask) ? attr & 0x0f : (attr & 0xf0) >> 4; + + drawPixel(x+j, y+i, col); + } + glyph += (i%zoom) ? 0 : FONT_BPL; + } +} + +void drawString(int x, int y, char *s, unsigned char attr, int zoom) +{ + while (*s) { + if (*s == '\r') { + x = 0; + } else if(*s == '\n') { + x = 0; y += (FONT_HEIGHT*zoom); + } else { + drawChar(*s, x, y, attr, zoom); + x += (FONT_WIDTH*zoom); + } + s++; + } +} + +void moveRect(int oldx, int oldy, int width, int height, int shiftx, int shifty, unsigned char attr) +{ + unsigned int newx = oldx + shiftx, newy = oldy + shifty; + unsigned int xcount = 0, ycount = 0; + unsigned int bitmap[width][height]; // This is very unsafe if it's too big for the stack... + unsigned int offs; + + // Save the bitmap + while (xcount < width) { + while (ycount < height) { + offs = ((oldy + ycount) * pitch) + ((oldx + xcount) * 4); + + bitmap[xcount][ycount] = *((unsigned int*)(fb + offs)); + ycount++; + } + ycount=0; + xcount++; + } + // Wipe it out with background colour + drawRect(oldx, oldy, oldx + width, oldy + width, attr, 1); + // Draw it again + for (int i=newx;i= 1920) { + curx = 0; cury += 8; + } + if (cury + 8 >= 1080) { + cury = 0; + } + drawString(curx, cury, str, 0x0f, 1); + curx += (strlen(str) * 8); +} + +void debugcrlf(void) { + curx = 0; cury += 8; +} + +void debugch(unsigned char b) { + unsigned int n; + int c; + for(c=4;c>=0;c-=4) { + n=(b>>c)&0xF; + n+=n>9?0x37:0x30; + debugstr((char *)&n); + } + debugstr(" "); +} + +void debughex(unsigned int d) { + unsigned int n; + int c; + for(c=28;c>=0;c-=4) { + n=(d>>c)&0xF; + n+=n>9?0x37:0x30; + debugstr((char *)&n); + } + debugstr(" "); +} diff --git a/part15a-tcpip-webserver-gpio-interrupt/lib/io.c b/part15a-tcpip-webserver-gpio-interrupt/lib/io.c new file mode 100644 index 0000000..6a7b221 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/lib/io.c @@ -0,0 +1,229 @@ +#include "../include/io.h" + +// GPIO + +enum { + GPFSEL0 = PERIPHERAL_BASE + 0x200000, + GPSET0 = PERIPHERAL_BASE + 0x20001C, + GPCLR0 = PERIPHERAL_BASE + 0x200028, + GPPUPPDN0 = PERIPHERAL_BASE + 0x2000E4 +}; + +enum { + GPIO_MAX_PIN = 53, + GPIO_FUNCTION_OUT = 1, + GPIO_FUNCTION_ALT5 = 2, + GPIO_FUNCTION_ALT3 = 7, + GPIO_FUNCTION_ALT0 = 4 +}; + +enum { + Pull_None = 0, + Pull_Down = 1, // Are down and up the right way around? + Pull_Up = 2 +}; + +void mmio_write(long reg, unsigned int val) { *(volatile unsigned int *)reg = val; } +unsigned int mmio_read(long reg) { return *(volatile unsigned int *)reg; } + +unsigned int gpio_call(unsigned int pin_number, unsigned int value, unsigned int base, unsigned int field_size, unsigned int field_max) { + unsigned int field_mask = (1 << field_size) - 1; + + if (pin_number > field_max) return 0; + if (value > field_mask) return 0; + + unsigned int num_fields = 32 / field_size; + unsigned int reg = base + ((pin_number / num_fields) * 4); + unsigned int shift = (pin_number % num_fields) * field_size; + + unsigned int curval = mmio_read(reg); + curval &= ~(field_mask << shift); + curval |= value << shift; + mmio_write(reg, curval); + + return 1; +} + +unsigned int gpio_set (unsigned int pin_number, unsigned int value) { return gpio_call(pin_number, value, GPSET0, 1, GPIO_MAX_PIN); } +unsigned int gpio_clear (unsigned int pin_number, unsigned int value) { return gpio_call(pin_number, value, GPCLR0, 1, GPIO_MAX_PIN); } +unsigned int gpio_pull (unsigned int pin_number, unsigned int value) { return gpio_call(pin_number, value, GPPUPPDN0, 2, GPIO_MAX_PIN); } +unsigned int gpio_function(unsigned int pin_number, unsigned int value) { return gpio_call(pin_number, value, GPFSEL0, 3, GPIO_MAX_PIN); } + +void gpio_useAsAlt0(unsigned int pin_number) { + gpio_pull(pin_number, Pull_None); + gpio_function(pin_number, GPIO_FUNCTION_ALT0); +} + +void gpio_useAsAlt3(unsigned int pin_number) { + gpio_pull(pin_number, Pull_None); + gpio_function(pin_number, GPIO_FUNCTION_ALT3); +} + +void gpio_useAsAlt5(unsigned int pin_number) { + gpio_pull(pin_number, Pull_None); + gpio_function(pin_number, GPIO_FUNCTION_ALT5); +} + +void gpio_initOutputPinWithPullNone(unsigned int pin_number) { + gpio_pull(pin_number, Pull_None); + gpio_function(pin_number, GPIO_FUNCTION_OUT); +} + +void gpio_setPinOutputBool(unsigned int pin_number, unsigned int onOrOff) { + if (onOrOff) { + gpio_set(pin_number, 1); + } else { + gpio_clear(pin_number, 1); + } +} + +// UART + +enum { + AUX_BASE = PERIPHERAL_BASE + 0x215000, + AUX_IRQ = AUX_BASE, + AUX_ENABLES = AUX_BASE + 4, + AUX_MU_IO_REG = AUX_BASE + 64, + AUX_MU_IER_REG = AUX_BASE + 68, + AUX_MU_IIR_REG = AUX_BASE + 72, + AUX_MU_LCR_REG = AUX_BASE + 76, + AUX_MU_MCR_REG = AUX_BASE + 80, + AUX_MU_LSR_REG = AUX_BASE + 84, + AUX_MU_MSR_REG = AUX_BASE + 88, + AUX_MU_SCRATCH = AUX_BASE + 92, + AUX_MU_CNTL_REG = AUX_BASE + 96, + AUX_MU_STAT_REG = AUX_BASE + 100, + AUX_MU_BAUD_REG = AUX_BASE + 104, + AUX_UART_CLOCK = 500000000, + UART_MAX_QUEUE = 16 * 1024 +}; + +#define AUX_MU_BAUD(baud) ((AUX_UART_CLOCK/(baud*8))-1) + +unsigned char uart_output_queue[UART_MAX_QUEUE]; +unsigned int uart_output_queue_write = 0; +unsigned int uart_output_queue_read = 0; + +void uart_init() { + mmio_write(AUX_ENABLES, 1); //enable UART1 + mmio_write(AUX_MU_IER_REG, 0); + mmio_write(AUX_MU_CNTL_REG, 0); + mmio_write(AUX_MU_LCR_REG, 3); //8 bits + mmio_write(AUX_MU_MCR_REG, 0); + mmio_write(AUX_MU_IER_REG, 0); + mmio_write(AUX_MU_IIR_REG, 0xC6); //disable interrupts + mmio_write(AUX_MU_BAUD_REG, AUX_MU_BAUD(115200)); + gpio_useAsAlt5(14); + gpio_useAsAlt5(15); + mmio_write(AUX_MU_CNTL_REG, 3); //enable RX/TX +} + +unsigned int uart_isOutputQueueEmpty() { + return uart_output_queue_read == uart_output_queue_write; +} + +unsigned int uart_isReadByteReady() { return mmio_read(AUX_MU_LSR_REG) & 0x01; } +unsigned int uart_isWriteByteReady() { return mmio_read(AUX_MU_LSR_REG) & 0x20; } + +unsigned char uart_readByte() { + while (!uart_isReadByteReady()); + return (unsigned char)mmio_read(AUX_MU_IO_REG); +} + +void uart_writeByteBlockingActual(unsigned char ch) { + while (!uart_isWriteByteReady()); + mmio_write(AUX_MU_IO_REG, (unsigned int)ch); +} + +void uart_loadOutputFifo() { + while (!uart_isOutputQueueEmpty() && uart_isWriteByteReady()) { + uart_writeByteBlockingActual(uart_output_queue[uart_output_queue_read]); + uart_output_queue_read = (uart_output_queue_read + 1) & (UART_MAX_QUEUE - 1); // Don't overrun + } +} + +void uart_writeByteBlocking(unsigned char ch) { + unsigned int next = (uart_output_queue_write + 1) & (UART_MAX_QUEUE - 1); // Don't overrun + + while (next == uart_output_queue_read) uart_loadOutputFifo(); + + uart_output_queue[uart_output_queue_write] = ch; + uart_output_queue_write = next; +} + +void uart_writeText(char *buffer) { + while (*buffer) { + if (*buffer == '\n') uart_writeByteBlockingActual('\r'); + uart_writeByteBlockingActual(*buffer++); + } +} + +void uart_drainOutputQueue() { + while (!uart_isOutputQueueEmpty()) uart_loadOutputFifo(); +} + +void uart_update() { + uart_loadOutputFifo(); + + if (uart_isReadByteReady()) { + unsigned char ch = uart_readByte(); + if (ch == '\r') uart_writeText("\n"); else uart_writeByteBlocking(ch); + } +} + +void uart_hex(unsigned int d) { + unsigned int n; + int c; + for(c=28;c>=0;c-=4) { + // get highest tetrad + n=(d>>c)&0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n+=n>9?0x37:0x30; + + uart_writeByteBlockingActual(n); + } +} + +void uart_byte(unsigned char b) { + unsigned int n; + int c; + for(c=4;c>=0;c-=4) { + // get highest tetrad + n=(b>>c)&0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n+=n>9?0x37:0x30; + + uart_writeByteBlockingActual(n); + } + uart_writeByteBlockingActual(' '); +} + +// TIMER + +struct timer_regs { + volatile unsigned int control_status; + volatile unsigned int counter_lo; + volatile unsigned int counter_hi; + volatile unsigned int compare[4]; +}; + +#define REGS_TIMER ((struct timer_regs *)(PERIPHERAL_BASE + 0x00003000)) + +unsigned long HAL_GetTick(void) { + unsigned int hi = REGS_TIMER->counter_hi; + unsigned int lo = REGS_TIMER->counter_lo; + + //double check hi value didn't change after setting it... + if (hi != REGS_TIMER->counter_hi) { + hi = REGS_TIMER->counter_hi; + lo = REGS_TIMER->counter_lo; + } + + return ((unsigned long)hi << 32) | lo; +} + +void HAL_Delay(unsigned int ms) { + unsigned long start = HAL_GetTick(); + + while(HAL_GetTick() < start + (ms * 1000)); +} diff --git a/part15a-tcpip-webserver-gpio-interrupt/lib/mb.c b/part15a-tcpip-webserver-gpio-interrupt/lib/mb.c new file mode 100644 index 0000000..65dbbb8 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/lib/mb.c @@ -0,0 +1,39 @@ +#include "../include/io.h" + +// The buffer must be 16-byte aligned as only the upper 28 bits of the address can be passed via the mailbox +volatile unsigned int __attribute__((aligned(16))) mbox[36]; + +enum { + VIDEOCORE_MBOX = (PERIPHERAL_BASE + 0x0000B880), + MBOX_READ = (VIDEOCORE_MBOX + 0x0), + MBOX_POLL = (VIDEOCORE_MBOX + 0x10), + MBOX_SENDER = (VIDEOCORE_MBOX + 0x14), + MBOX_STATUS = (VIDEOCORE_MBOX + 0x18), + MBOX_CONFIG = (VIDEOCORE_MBOX + 0x1C), + MBOX_WRITE = (VIDEOCORE_MBOX + 0x20), + MBOX_RESPONSE = 0x80000000, + MBOX_FULL = 0x80000000, + MBOX_EMPTY = 0x40000000 +}; + +unsigned int mbox_call(unsigned char ch) +{ + // 28-bit address (MSB) and 4-bit value (LSB) + unsigned int r = ((unsigned int)((long) &mbox) &~ 0xF) | (ch & 0xF); + + // Wait until we can write + while (mmio_read(MBOX_STATUS) & MBOX_FULL); + + // Write the address of our buffer to the mailbox with the channel appended + mmio_write(MBOX_WRITE, r); + + while (1) { + // Is there a reply? + while (mmio_read(MBOX_STATUS) & MBOX_EMPTY); + + // Is it a reply to our message? + if (r == mmio_read(MBOX_READ)) return mbox[1]==MBOX_RESPONSE; // Is it successful? + + } + return 0; +} diff --git a/part15a-tcpip-webserver-gpio-interrupt/lib/multicore.c b/part15a-tcpip-webserver-gpio-interrupt/lib/multicore.c new file mode 100644 index 0000000..0000bcd --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/lib/multicore.c @@ -0,0 +1,44 @@ +#include "../include/multicore.h" + +void store32(unsigned long address, unsigned long value) +{ + *(unsigned long *) address = value; +} + +unsigned long load32(unsigned long address) +{ + return *(unsigned long *) address; +} + +void start_core1(void (*func)(void)) +{ + store32((unsigned long)&spin_cpu1, (unsigned long)func); + asm volatile ("sev"); +} + +void start_core2(void (*func)(void)) +{ + store32((unsigned long)&spin_cpu2, (unsigned long)func); + asm volatile ("sev"); +} + +void start_core3(void (*func)(void)) +{ + store32((unsigned long)&spin_cpu3, (unsigned long)func); + asm volatile ("sev"); +} + +void clear_core1(void) +{ + store32((unsigned long)&spin_cpu1, 0); +} + +void clear_core2(void) +{ + store32((unsigned long)&spin_cpu2, 0); +} + +void clear_core3(void) +{ + store32((unsigned long)&spin_cpu3, 0); +} diff --git a/part15a-tcpip-webserver-gpio-interrupt/lib/spi.c b/part15a-tcpip-webserver-gpio-interrupt/lib/spi.c new file mode 100644 index 0000000..a03d564 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/lib/spi.c @@ -0,0 +1,100 @@ +#include "../include/io.h" +#include "../include/fb.h" + +// SPI + +struct Spi0Regs { + volatile unsigned int cs; + volatile unsigned int fifo; + volatile unsigned int clock; + volatile unsigned int data_length; + volatile unsigned int ltoh; + volatile unsigned int dc; +}; + +#define REGS_SPI0 ((struct Spi0Regs *)(PERIPHERAL_BASE + 0x00204000)) + +// CS Register +#define CS_LEN_LONG (1 << 25) +#define CS_DMA_LEN (1 << 24) +#define CS_CSPOL2 (1 << 23) +#define CS_CSPOL1 (1 << 22) +#define CS_CSPOL0 (1 << 21) +#define CS_RXF (1 << 20) +#define CS_RXR (1 << 19) +#define CS_TXD (1 << 18) +#define CS_RXD (1 << 17) +#define CS_DONE (1 << 16) +#define CS_LEN (1 << 13) +#define CS_REN (1 << 12) +#define CS_ADCS (1 << 11) +#define CS_INTR (1 << 10) +#define CS_INTD (1 << 9) +#define CS_DMAEN (1 << 8) +#define CS_TA (1 << 7) +#define CS_CSPOL (1 << 6) +#define CS_CLEAR_RX (1 << 5) +#define CS_CLEAR_TX (1 << 4) +#define CS_CPOL__SHIFT 3 +#define CS_CPHA__SHIFT 2 +#define CS_CS (1 << 0) +#define CS_CS__SHIFT 0 + +void spi_init() { + gpio_useAsAlt0(7); //CS1 + gpio_initOutputPinWithPullNone(8); //CS0 + gpio_useAsAlt0(9); //MISO + gpio_useAsAlt0(10); //MOSI + gpio_useAsAlt0(11); //SCLK +} + +void spi_chip_select(unsigned char chip_select) { + gpio_setPinOutputBool(8, chip_select); +} + +void spi_send_recv(unsigned char *sbuffer, unsigned char *rbuffer, unsigned int size) { + REGS_SPI0->data_length = size; + REGS_SPI0->cs = REGS_SPI0->cs | CS_CLEAR_RX | CS_CLEAR_TX | CS_TA; + + unsigned int read_count = 0; + unsigned int write_count = 0; + + while(read_count < size || write_count < size) { + while(write_count < size && REGS_SPI0->cs & CS_TXD) { + if (sbuffer) { + REGS_SPI0->fifo = *sbuffer++; + } else { + REGS_SPI0->fifo = 0; + } + + write_count++; + } + + while(read_count < size && REGS_SPI0->cs & CS_RXD) { + unsigned int data = REGS_SPI0->fifo; + + if (rbuffer) { + *rbuffer++ = data; + } + + read_count++; + } + } + + while(!(REGS_SPI0->cs & CS_DONE)) { + while(REGS_SPI0->cs & CS_RXD) { + unsigned int r = REGS_SPI0->fifo; + debughex(r); + } + } + + REGS_SPI0->cs = (REGS_SPI0->cs & ~CS_TA); +} + +void spi_send(unsigned char *data, unsigned int size) { + spi_send_recv(data, 0, size); +} + +void spi_recv(unsigned char *data, unsigned int size) { + spi_send_recv(0, data, size); +} diff --git a/part15a-tcpip-webserver-gpio-interrupt/net/enc28j60.c b/part15a-tcpip-webserver-gpio-interrupt/net/enc28j60.c new file mode 100644 index 0000000..eab8a76 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/net/enc28j60.c @@ -0,0 +1,1453 @@ +/** + ****************************************************************************** + * @file enc28j60.c + * @author Christian Schoffit, portions from Gregory Nutt: + * Copyright (C) 2010-2012, 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * @version V1.0.0 + * @date 02-June-2015 + * @brief This file provides a set of functions needed to manage the ENC28J60 + * Stand-Alone Ethernet Controller with SPI Interface. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2015 Christian Schoffit

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of Christian Schoffit nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* +Module Feature Issue Issue Summary Affected Revisions + B1 B4 B5 B7 +MAC Interface - 1. MAC registers unreliable with slow asynchronous SPI clock X X +Reset - 2. CLKRDY set early X X X X +Core Operating 3. Industrial (-40°C to +85°C) temperature range unsupported X X + Specifications +Oscillator CLKOUT pin 4. CLKOUT unavailable in Power Save mode X X X X +Memory Ethernet 5. Receive buffer must start at 0000h X X X X + Buffer +Interrupts - 6. Receive Packet Pending Interrupt Flag (PKTIF) unreliable X X X X +PHY - 7. TPIN+/- automatic polarity detection and correction + unreliable X X X X +PHY - 8. RBIAS resistor value differs between silicon revisions X X +PHY - 9. Internal loopback in half-duplex unreliable X X X X +PHY - 10. Internal loopback in full-duplex unreliable X X X X +PHY LEDs - 11. Combined Collision and Duplex Status mode unavailable X X X X +Transmit - 12. Transmit abort may stall transmit logic X X X X +Logic +PHY - 13. Received link pulses potentially cause collisions X X +Memory Ethernet 14. Even values in ERXRDPT may corrupt receive buffer X X X X + Buffer +Transmit - 15. LATECOL Status bit unreliable X X X X +Logic +PHY LEDs - 16. LED auto-polarity detection unreliable X X X X +DMA - 17. DMA checksum calculations will abort receive packets X X X X +Receive - 18. Pattern match filter allows reception of extra packets X X X X +Filter +SPI - 19. Reset command unavailable in Power Save mode X X X X +Interface + +Only workaround relative to issues affecting B7 silicon revision are implemented. Therefore, issues +specific to Ethernet conformance are not addressed, since they only affect B1 and B3 silicon revisions. + +Erratas 7, 8, 16... have workaround implemented by hardware + +Errata 18 is implemented in lwip stack +*/ + +/* Includes ------------------------------------------------------------------*/ +#include "enc28j60.h" +#include "../include/fb.h" +#include "../include/io.h" + +/** @addtogroup BSP + * @{ + */ + +/** @addtogroup Components + * @{ + */ + +/** @defgroup ENC28J60 + * @{ + */ + +/** @defgroup ENC28J60_Private_Types_Definitions + * @{ + */ + +/** @defgroup ENC28J60_Private_Defines + * @{ + */ + +/* Poll timeout */ + +#define ENC_POLLTIMEOUT 50 + +/** + * @} + */ + +/** @defgroup ENC28J60_Private_Macros + * @{ + */ + +/* Packet Memory ************************************************************/ + +/* Packet memory layout */ + +#define ALIGNED_BUFSIZE ((CONFIG_NET_ETH_MTU + 255) & ~255) + +/* Work around Errata #5 (spurious reset of ERXWRPT to 0) by placing the RX + * FIFO at the beginning of packet memory. + */ + +# define PKTMEM_RX_START 0x0000 /* RX buffer must be at addr 0 for errata 5 */ +# define PKTMEM_RX_END (PKTMEM_END-ALIGNED_BUFSIZE) /* RX buffer length is total SRAM minus TX buffer */ +# define PKTMEM_TX_START (PKTMEM_RX_END+1) /* Start TX buffer after */ +# define PKTMEM_TX_ENDP1 (PKTMEM_TX_START+ALIGNED_BUFSIZE) /* Allow TX buffer for two frames */ + +/* Misc. Helper Macros ******************************************************/ + +#define enc_rdgreg(ctrlreg) \ + enc_rdgreg2(ENC_RCR | GETADDR(ctrlreg)) +#define enc_wrgreg(ctrlreg, wrdata) \ + enc_wrgreg2(ENC_WCR | GETADDR(ctrlreg), wrdata) +#define enc_bfcgreg(ctrlreg,clrbits) \ + enc_wrgreg2(ENC_BFC | GETADDR(ctrlreg), clrbits) +#define enc_bfsgreg(ctrlreg,setbits) \ + enc_wrgreg2(ENC_BFS | GETADDR(ctrlreg), setbits) + +/** + * @} + */ + +/** @defgroup ENC28J60_Private_Variables + * @{ + */ + + /* Stores how many iterations the microcontroller can do in 1 µs */ +static uint32_t iter_per_us=0; + +/** + * @} + */ + +/** @defgroup ENC28J60_Private_Function_Prototypes + * @{ + */ +/** + * @} + */ + +/** @defgroup ENC28J60_Private_Functions + * @{ + */ + +/** + Calibrate the constant time + **/ + +static void calibrate(void) +{ + uint32_t time; + volatile uint32_t i; + + iter_per_us = 1000000; + + time = HAL_GetTick(); + /* Wait for next tick */ + while (HAL_GetTick() == time) { + /* wait */ + } + for (i=0; ibank = 0; /* Initialize the trace on the current selected bank */ + //up_mdelay(2); + HAL_Delay(2); /* >1000 µs, conforms to errata #2 */ +} + +/**************************************************************************** + * Function: enc_setbank + * + * Description: + * Set the bank for these next control register access. + * + * Assumption: + * The caller has exclusive access to the SPI bus + * + * Parameters: + * handle - Reference to the driver state structure + * bank - The bank to select (0-3) + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void enc_setbank(ENC_HandleTypeDef *handle, uint8_t bank) { + + if (bank != handle->bank) { + /* Select bank 0 (just so that all of the bits are cleared) */ + + enc_bfcgreg(ENC_ECON1, ECON1_BSEL_MASK); + + /* Then OR in bits to get the correct bank */ + + if (bank != 0) + { + enc_bfsgreg(ENC_ECON1, (bank << ECON1_BSEL_SHIFT)); + } + + /* Then remember the bank setting */ + + handle->bank = bank; + } +} + +/**************************************************************************** + * Function: enc_rdbreg + * + * Description: + * Read from a banked control register using the RCR command. + * + * Parameters: + * handle - Reference to the driver state structure + * ctrlreg - Bit encoded address of banked register to read + * + * Returned Value: + * The byte read from the banked register + * + * Assumptions: + * + ****************************************************************************/ + +static uint8_t enc_rdbreg(ENC_HandleTypeDef *handle, uint8_t ctrlreg) +{ + uint8_t data[3]; + + /* Set the bank */ + + enc_setbank(handle, GETBANK(ctrlreg)); + + /* Send the RCR command and collect the data. How we collect the data + * depends on if this is a PHY/CAN or not. The normal sequence requires + * 16-clocks: 8 to clock out the cmd and 8 to clock in the data. + */ + + data[0] = ENC_RCR | GETADDR(ctrlreg); + + /* The PHY/MAC sequence requires 24-clocks: 8 to clock out the cmd, + * 8 dummy bits, and 8 to clock in the PHY/MAC data. + */ + + ENC_SPI_SendBuf(data, data, (ISPHYMAC(ctrlreg))?3:2); + return (ISPHYMAC(ctrlreg))?data[2]:data[1]; +} + +/**************************************************************************** + * Function: enc_wrbreg + * + * Description: + * Write to a banked control register using the WCR command. Unlike + * reading, this same SPI sequence works for normal, MAC, and PHY + * registers. + * + * Parameters: + * handle - Reference to the driver state structure + * ctrlreg - Bit encoded address of banked register to write + * wrdata - The data to send + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static void enc_wrbreg(ENC_HandleTypeDef *handle, uint8_t ctrlreg, + uint8_t wrdata) +{ + uint8_t data[2]; + + /* Set the bank */ + + enc_setbank(handle, GETBANK(ctrlreg)); + + /* Send the WCR command and data. The sequence requires 16-clocks: + * 8 to clock out the cmd + 8 to clock out the data. + */ + + data[0] = ENC_WCR | GETADDR(ctrlreg); + data[1] = wrdata; + + ENC_SPI_SendBuf(data, NULL, 2); +} + +/**************************************************************************** + * Function: enc_waitbreg + * + * Description: + * Wait until banked register bit(s) take a specific value (or a timeout + * occurs). + * + * Parameters: + * handle - Reference to the driver state structure + * ctrlreg - Bit encoded address of banked register to check + * bits - The bits to check (a mask) + * value - The value of the bits to return (value under mask) + * + * Returned Value: + * OK on success, negated errno on failure + * + * Assumptions: + * + ****************************************************************************/ + +static bool enc_waitbreg(ENC_HandleTypeDef *handle, uint8_t ctrlreg, + uint8_t bits, uint8_t value) +{ + uint32_t start = HAL_GetTick(); + uint32_t elapsed; + uint8_t rddata; + + /* Loop until the exit condition is met */ + + do + { + /* Read the byte from the requested banked register */ + + rddata = enc_rdbreg(handle, ctrlreg); + elapsed = HAL_GetTick() - start; + } + while ((rddata & bits) != value && elapsed < ENC_POLLTIMEOUT); + + return (rddata & bits) == value; +} + + +/**************************************************************************** + * Function: enc_rdphy + * + * Description: + * Read 16-bits of PHY data. + * + * Parameters: + * priv - Reference to the driver state structure + * phyaddr - The PHY register address + * + * Returned Value: + * 16-bit value read from the PHY + * + * Assumptions: + * + ****************************************************************************/ + +static uint16_t enc_rdphy(ENC_HandleTypeDef *handle, uint8_t phyaddr) +{ + uint16_t data = 0; + + /* "To read from a PHY register: + * + * 1. Write the address of the PHY register to read from into the MIREGADR + * register. + */ + + enc_wrbreg(handle, ENC_MIREGADR, phyaddr); + + /* 2. Set the MICMD.MIIRD bit. The read operation begins and the + * MISTAT.BUSY bit is set. + */ + + enc_wrbreg(handle, ENC_MICMD, MICMD_MIIRD); + + /* 3. Wait 10.24 µs. Poll the MISTAT.BUSY bit to be certain that the + * operation is complete. While busy, the host controller should not + * start any MIISCAN operations or write to the MIWRH register. + * + * When the MAC has obtained the register contents, the BUSY bit will + * clear itself. + */ + +// volatile int i; +// for (i=0; i<12*17; i++) { +// } + + up_udelay(12); + + if (enc_waitbreg(handle, ENC_MISTAT, MISTAT_BUSY, 0x00)) + { + /* 4. Clear the MICMD.MIIRD bit. */ + + enc_wrbreg(handle, ENC_MICMD, 0x00); + + /* 5. Read the desired data from the MIRDL and MIRDH registers. The + * order that these bytes are accessed is unimportant." + */ + + data = (uint16_t)enc_rdbreg(handle, ENC_MIRDL); + data |= (uint16_t)enc_rdbreg(handle, ENC_MIRDH) << 8; + } + + return data; +} + +/**************************************************************************** + * Function: enc_wrphy + * + * Description: + * write 16-bits of PHY data. + * + * Parameters: + * handle - Reference to the driver state structure + * phyaddr - The PHY register address + * phydata - 16-bit data to write to the PHY + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static void enc_wrphy(ENC_HandleTypeDef *handle, uint8_t phyaddr, + uint16_t phydata) +{ + /* "To write to a PHY register: + * + * 1. Write the address of the PHY register to write to into the + * MIREGADR register. + */ + + enc_wrbreg(handle, ENC_MIREGADR, phyaddr); + + /* 2. Write the lower 8 bits of data to write into the MIWRL register. */ + + enc_wrbreg(handle, ENC_MIWRL, phydata); + + /* 3. Write the upper 8 bits of data to write into the MIWRH register. + * Writing to this register automatically begins the MIIM transaction, + * so it must be written to after MIWRL. The MISTAT.BUSY bit becomes + * set. + */ + + enc_wrbreg(handle, ENC_MIWRH, phydata >> 8); + + /* The PHY register will be written after the MIIM operation completes, + * which takes 10.24 µs. When the write operation has completed, the BUSY + * bit will clear itself. + * + * The host controller should not start any MIISCAN or MIIRD operations + * while busy." + */ + + /* wait for approx 12 µs */ +// volatile int i; +// for (i=0; i<12*17; i++) { +// } + + up_udelay(12); + enc_waitbreg(handle, ENC_MISTAT, MISTAT_BUSY, 0x00); +} + + +/**************************************************************************** + * Function: enc_pwrfull + * + * Description: + * When normal operation is desired, the host controller must perform + * a slightly modified procedure: + * + * 1. Wake-up by clearing ECON2.PWRSV. + * 2. Wait at least 300 µs for the PHY to stabilize. To accomplish the + * delay, the host controller may poll ESTAT.CLKRDY and wait for it + * to become set. + * 3. Restore receive capability by setting ECON1.RXEN. + * + * After leaving Sleep mode, there is a delay of many milliseconds + * before a new link is established (assuming an appropriate link + * partner is present). The host controller may wish to wait until + * the link is established before attempting to transmit any packets. + * The link status can be determined by polling the PHSTAT2.LSTAT bit. + * Alternatively, the link change interrupt may be used if it is + * enabled. + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +/* Power save mode not used (fix errata 4 and 19) */ +#if 0 +static void enc_pwrfull(ENC_HandleTypeDef *handle) +{ + /* 1. Wake-up by clearing ECON2.PWRSV. */ + + enc_bfcgreg(ENC_ECON2, ECON2_PWRSV); + + /* 2. Wait at least 300 µs for the PHY to stabilize. To accomplish the + * delay, the host controller may poll ESTAT.CLKRDY and wait for it to + * become set. + */ + + /* wait for approx 350 µs */ +// volatile int i; +// for (i=0; i<350*17; i++) { +// } + + up_udelay(350); + + enc_waitbreg(handle, ENC_ESTAT, ESTAT_CLKRDY, ESTAT_CLKRDY); + + /* 3. Restore receive capability by setting ECON1.RXEN. + * + * The caller will do this when it is ready to receive packets + */ +} +#endif + +/** + * @brief Initialize the enc28j60 and configure the needed hardware resources + * @param handle: Handle on data configuration. + * @retval None + */ +bool ENC_Start(ENC_HandleTypeDef *handle) +{ + /* register value */ + uint8_t regval; + + /* Calibrate time constant */ + calibrate(); + + /* System reset */ + enc_reset(handle); + + /* Use bank 0 */ + enc_setbank(handle, 0); + + /* Check if we are actually communicating with the ENC28J60. If its + * 0x00 or 0xff, then we are probably not communicating correctly + * via SPI. + */ + + regval = enc_rdbreg(handle, ENC_EREVID); + if (regval == 0x00 || regval == 0xff) { + return false; + } + + /* Initialize ECON2: Enable address auto increment. + */ + + enc_wrgreg(ENC_ECON2, ECON2_AUTOINC /* | ECON2_VRPS*/); + + /* Initialize receive buffer. + * First, set the receive buffer start address. + */ + + handle->nextpkt = PKTMEM_RX_START; + enc_wrbreg(handle, ENC_ERXSTL, PKTMEM_RX_START & 0xff); + enc_wrbreg(handle, ENC_ERXSTH, PKTMEM_RX_START >> 8); + + /* Set the receive data pointer */ + + /* Errata 14 */ + enc_wrbreg(handle, ENC_ERXRDPTL, PKTMEM_RX_END & 0xff); + enc_wrbreg(handle, ENC_ERXRDPTH, PKTMEM_RX_END >> 8); +/* + enc_wrbreg(handle, ENC_ERXRDPTL, PKTMEM_RX_START & 0xff); + enc_wrbreg(handle, ENC_ERXRDPTH, PKTMEM_RX_START >> 8); +*/ + + /* Set the receive buffer end. */ + + enc_wrbreg(handle, ENC_ERXNDL, PKTMEM_RX_END & 0xff); + enc_wrbreg(handle, ENC_ERXNDH, PKTMEM_RX_END >> 8); + + /* Set transmit buffer start. */ + + handle->transmitLength = 0; + enc_wrbreg(handle, ENC_ETXSTL, PKTMEM_TX_START & 0xff); + enc_wrbreg(handle, ENC_ETXSTH, PKTMEM_TX_START >> 8); + + /* Set filter mode: unicast OR broadcast AND crc valid */ + + enc_wrbreg(handle, ENC_ERXFCON, ERXFCON_UCEN | ERXFCON_CRCEN | ERXFCON_BCEN); + + do { + HAL_Delay(10); /* Wait for 10 ms to let the clock be ready */ + regval = enc_rdbreg(handle, ENC_ESTAT); + } while ((regval & ESTAT_CLKRDY) == 0); + + /* Enable MAC receive */ + + enc_wrbreg(handle, ENC_MACON1, MACON1_MARXEN | MACON1_TXPAUS | MACON1_RXPAUS); + + /* Enable automatic padding and CRC operations */ + + if (handle->Init.DuplexMode == ETH_MODE_HALFDUPLEX) { + enc_wrbreg(handle, ENC_MACON3, + ((handle->Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE)?MACON3_PADCFG0 | MACON3_TXCRCEN:0) | + MACON3_FRMLNEN); + enc_wrbreg(handle, ENC_MACON4, MACON4_DEFER); /* Defer transmission enable */ + + /* Set Non-Back-to-Back Inter-Packet Gap */ + + enc_wrbreg(handle, ENC_MAIPGL, 0x12); + enc_wrbreg(handle, ENC_MAIPGH, 0x0c); + + /* Set Back-to-Back Inter-Packet Gap */ + + enc_wrbreg(handle, ENC_MABBIPG, 0x12); + } else { + /* Set filter mode: unicast OR broadcast AND crc valid AND Full Duplex */ + + enc_wrbreg(handle, ENC_MACON3, + ((handle->Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE)?MACON3_PADCFG0 | MACON3_TXCRCEN:0) | + MACON3_FRMLNEN | MACON3_FULDPX); + + /* Set Non-Back-to-Back Inter-Packet Gap */ + + enc_wrbreg(handle, ENC_MAIPGL, 0x12); + + /* Set Back-to-Back Inter-Packet Gap */ + + enc_wrbreg(handle, ENC_MABBIPG, 0x15); + } + + /* Set the maximum packet size which the controller will accept */ + + enc_wrbreg(handle, ENC_MAMXFLL, (CONFIG_NET_ETH_MTU+18) & 0xff); + enc_wrbreg(handle, ENC_MAMXFLH, (CONFIG_NET_ETH_MTU+18) >> 8); + + /* Configure LEDs (No, just use the defaults for now) */ + /* enc_wrphy(priv, ENC_PHLCON, ??); */ + + /* Setup up PHCON1 & 2 */ + + if (handle->Init.DuplexMode == ETH_MODE_HALFDUPLEX) { + enc_wrphy(handle, ENC_PHCON1, 0x00); + enc_wrphy(handle, ENC_PHCON2, PHCON2_HDLDIS); /* errata 9 workaround */ + } else { + enc_wrphy(handle, ENC_PHCON1, PHCON1_PDPXMD); /* errata 10 workaround */ + enc_wrphy(handle, ENC_PHCON2, 0x00); + } + + /* Not used Restore normal operation mode + enc_pwrfull(handle); */ + + /* Process interrupt settings */ + if (handle->Init.InterruptEnableBits & EIE_LINKIE) { + /* Enable link change interrupt in PHY module */ + enc_wrphy(handle, ENC_PHIE, PHIE_PGEIE | PHIE_PLNKIE); + } + + /* Since we not modify PHLCON register, we don't fall in errata 11 case */ + + /* Reset all interrupt flags */ + enc_bfcgreg(ENC_EIR, EIR_ALLINTS); + + regval = handle->Init.InterruptEnableBits; + if (regval) { + /* Ensure INTIE is set when at least an interruption is selected */ + regval |= EIE_INTIE; + } + /* Enable selected interrupts in ethernet controller module */ + enc_bfsgreg(ENC_EIE, regval); + + /* Enable the receiver */ + enc_bfsgreg(ENC_ECON1, ECON1_RXEN); + + return true; +} + +/** + * @} + */ + +/**************************************************************************** + * Function: ENC_SetMacAddr + * + * Description: + * Set the MAC address to the configured value. This is done after ifup + * or after a TX timeout. Note that this means that the interface must + * be down before configuring the MAC addr. + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_SetMacAddr(ENC_HandleTypeDef *handle) +{ + /* Program the hardware with it's MAC address (for filtering). + * MAADR1 MAC Address Byte 1 (MAADR<47:40>), OUI Byte 1 + * MAADR2 MAC Address Byte 2 (MAADR<39:32>), OUI Byte 2 + * MAADR3 MAC Address Byte 3 (MAADR<31:24>), OUI Byte 3 + * MAADR4 MAC Address Byte 4 (MAADR<23:16>) + * MAADR5 MAC Address Byte 5 (MAADR<15:8>) + * MAADR6 MAC Address Byte 6 (MAADR<7:0>) + */ + + enc_wrbreg(handle, ENC_MAADR1, handle->Init.MACAddr[0]); + enc_wrbreg(handle, ENC_MAADR2, handle->Init.MACAddr[1]); + enc_wrbreg(handle, ENC_MAADR3, handle->Init.MACAddr[2]); + enc_wrbreg(handle, ENC_MAADR4, handle->Init.MACAddr[3]); + enc_wrbreg(handle, ENC_MAADR5, handle->Init.MACAddr[4]); + enc_wrbreg(handle, ENC_MAADR6, handle->Init.MACAddr[5]); +} + + +/**************************************************************************** + * Function: ENC_WriteBuffer + * + * Description: + * Write a buffer of data. + * + * Parameters: + * buffer - A pointer to the buffer to write from + * buflen - The number of bytes to write + * + * Returned Value: + * None + * + * Assumptions: + * Read pointer is set to the correct address + * + ****************************************************************************/ + +void ENC_WriteBuffer(void *buffer, uint16_t buflen) +{ + /* Send the WBM command and copy the packet itself into the transmit + * buffer at the position of the EWRPT register. + */ + + /* Select ENC28J60 chip + * + * "The WBM command is started by lowering the CS pin. ..." + * We explicitly select the ENC28J60 chip because we have to transmits several pieces of + * information while keeping CS low + * + */ + + ENC_SPI_Select(true); + + /* Send the write buffer memory command (ignoring the response) + * + * "...The [3-bit]WBM opcode should then be sent to the ENC28J60, + * followed by the 5-bit constant, 1Ah." + */ + + + ENC_SPI_SendWithoutSelection(ENC_WBM); + + /* Send the buffer + * + * "... After the WBM command and constant are sent, the data to + * be stored in the memory pointed to by EWRPT should be shifted + * out MSb first to the ENC28J60. After 8 data bits are received, + * the Write Pointer will automatically increment if AUTOINC is + * set. The host controller can continue to provide clocks on the + * SCK pin and send data on the SI pin, without raising CS, to + * keep writing to the memory. In this manner, with AUTOINC + * enabled, it is possible to continuously write sequential bytes + * to the buffer memory without any extra SPI command + * overhead. + */ + + ENC_SPI_SendBuf(buffer, NULL, buflen); + + /* De-select ENC28J60 chip + * + * "The WBM command is terminated by bringing up the CS pin. ..." + * done in ENC_SPI_SendBuf callback + */ + +} + +/**************************************************************************** + * Function: enc_rdbuffer + * + * Description: + * Read a buffer of data. + * + * Parameters: + * buffer - A pointer to the buffer to read into + * buflen - The number of bytes to read + * + * Returned Value: + * None + * + * Assumptions: + * Read pointer is set to the correct address + * + ****************************************************************************/ + +static void enc_rdbuffer(void *buffer, int16_t buflen) +{ + /* Select ENC28J60 chip */ + + ENC_SPI_Select(true); + + /* Send the read buffer memory command (ignoring the response) */ + + ENC_SPI_SendWithoutSelection(ENC_RBM); + + /* Then read the buffer data */ + + ENC_SPI_SendBuf(NULL, buffer, buflen); + + /* De-select ENC28J60 chip: done in ENC_SPI_SendBuf callback */ +} + +/**************************************************************************** + * Function: ENC_RestoreTXBuffer + * + * Description: + * Prepare TX buffer + * + * Parameters: + * handle - Reference to the driver state structure + * len - length of buffer + * + * Returned Value: + * ERR_OK 0 No error, everything OK. + * ERR_MEM -1 Out of memory error. + * ERR_TIMEOUT -3 Timeout. + * + * Assumptions: + * + ****************************************************************************/ + +int8_t ENC_RestoreTXBuffer(ENC_HandleTypeDef *handle, uint16_t len) +{ + uint16_t txend; + uint8_t control_write[2]; + + /* Wait while TX is busy */ + if (!enc_waitgreg(ENC_ECON1, ECON1_TXRTS, 0)) { + return ERR_TIMEOUT; + } + + /* Verify that the hardware is ready to send another packet. The driver + * starts a transmission process by setting ECON1.TXRTS. When the packet is + * finished transmitting or is aborted due to an error/cancellation, the + * ECON1.TXRTS bit will be cleared. + * + * NOTE: If we got here, then we have committed to sending a packet. + * higher level logic must have assured that TX-related interrupts are disabled. + */ + + /* Send the packet: address=priv->dev.d_buf, length=priv->dev.d_len */ + + /* Set transmit buffer start (is this necessary?). */ + + enc_wrbreg(handle, ENC_ETXSTL, PKTMEM_TX_START & 0xff); + enc_wrbreg(handle, ENC_ETXSTH, PKTMEM_TX_START >> 8); + + /* Reset the write pointer to start of transmit buffer */ + + enc_wrbreg(handle, ENC_EWRPTL, PKTMEM_TX_START & 0xff); + enc_wrbreg(handle, ENC_EWRPTH, PKTMEM_TX_START >> 8); + + /* Set the TX End pointer based on the size of the packet to send. Note + * that the offset accounts for the control byte at the beginning the + * buffer plus the size of the packet data. + */ + + txend = PKTMEM_TX_START + len; + + if (txend+8>PKTMEM_TX_ENDP1) { + return ERR_MEM; + } + + enc_wrbreg(handle, ENC_ETXNDL, txend & 0xff); + enc_wrbreg(handle, ENC_ETXNDH, txend >> 8); + + /* Send the write buffer memory command (ignoring the response) + * + * "...The [3-bit]WBM opcode should then be sent to the ENC28J60, + * followed by the 5-bit constant, 1Ah." + * + * "...the ENC28J60 requires a single per packet control byte to + * precede the packet for transmission." + * + * POVERRIDE: Per Packet Override bit (Not set): + * 1 = The values of PCRCEN, PPADEN and PHUGEEN will override the + * configuration defined by MACON3. + * 0 = The values in MACON3 will be used to determine how the packet + * will be transmitted + * PCRCEN: Per Packet CRC Enable bit (Set, but won't be used because + * POVERRIDE is zero). + * PPADEN: Per Packet Padding Enable bit (Set, but won't be used because + * POVERRIDE is zero). + * PHUGEEN: Per Packet Huge Frame Enable bit (Set, but won't be used + * because POVERRIDE is zero). + */ + + control_write[0] = ENC_WBM; + control_write[1] = PKTCTRL_PCRCEN | PKTCTRL_PPADEN | PKTCTRL_PHUGEEN; + ENC_SPI_SendBuf(control_write, control_write, 2); + + return ERR_OK; +} + +/**************************************************************************** + * Function: ENC_Transmit + * + * Description: + * Start hardware transmission. Called either from: + * + * - pkif interrupt when an application responds to the receipt of data + * by trying to send something, or + * - From watchdog based polling. + * + * Parameters: + * handle - Reference to the driver state structure + * len - length of buffer + * + * Returned Value: + * none + * + * Assumptions: + * + ****************************************************************************/ + +#ifdef USE_PROTOTHREADS +PT_THREAD(ENC_Transmit(struct pt *pt, ENC_HandleTypeDef *handle)) +#else +void ENC_Transmit(ENC_HandleTypeDef *handle) +#endif +{ + PT_BEGIN(pt); + + if (handle->transmitLength != 0) { + /* A frame is ready for transmission */ + /* Set TXRTS to send the packet in the transmit buffer */ + + //enc_bfsgreg(ENC_ECON1, ECON1_TXRTS); + /* Implement erratas 12, 13 and 15 */ + /* Reset transmit logic */ + handle->retries = 16; + do { + enc_bfsgreg(ENC_ECON1, ECON1_TXRST); + enc_bfcgreg(ENC_ECON1, ECON1_TXRST); + enc_bfcgreg(ENC_EIR, EIR_TXERIF | EIR_TXIF); + + /* Start transmission */ + enc_bfsgreg(ENC_ECON1, ECON1_TXRTS); + +#ifdef USE_PROTOTHREADS + handle->startTime = HAL_GetTick(); + handle->duration = 20; /* Timeout after 20 ms */ + PT_WAIT_UNTIL(pt, (((enc_rdgreg(ENC_EIR) & (EIR_TXIF | EIR_TXERIF)) != 0) || + (HAL_GetTick() - handle->startTime > handle->duration))); +#else + /* Wait for end of transmission */ + enc_waitwhilegreg(ENC_EIR, EIR_TXIF | EIR_TXERIF, 0); +#endif + + HAL_Delay(20); // Added by AGB - fixes weird timing bug + + /* Stop transmission */ + enc_bfcgreg(ENC_ECON1, ECON1_TXRTS); + + { + uint16_t addtTsv4; + uint8_t tsv4, regval; + + /* read tsv */ + addtTsv4 = PKTMEM_TX_START + handle->transmitLength + 4; + + enc_wrbreg(handle, ENC_ERDPTL, addtTsv4 & 0xff); + enc_wrbreg(handle, ENC_ERDPTH, addtTsv4 >> 8); + + enc_rdbuffer(&tsv4, 1); + + regval = enc_rdgreg(ENC_EIR); + if (!(regval & EIR_TXERIF) || !(tsv4 & TSV_LATECOL)) { + break; + } + } + handle->retries--; + } while (handle->retries > 0); + /* Transmission finished (but can be unsuccessful) */ + handle->transmitLength = 0; + } + PT_END(pt); +} + +/**************************************************************************** + * Function: ENC_GetReceivedFrame + * + * Description: + * Check if we have received packet, and if so, retrieve them. + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * true if new packet is available; false otherwise + * + * Assumptions: + * + ****************************************************************************/ + +bool ENC_GetReceivedFrame(ENC_HandleTypeDef *handle) +{ + uint8_t rsv[6]; + uint16_t pktlen; + uint16_t rxstat; + + uint8_t pktcnt; + + bool result = true; + + pktcnt = enc_rdbreg(handle, ENC_EPKTCNT); + if (pktcnt == 0) { + return false; + }; + + /* Set the read pointer to the start of the received packet (ERDPT) */ + + enc_wrbreg(handle, ENC_ERDPTL, (handle->nextpkt) & 0xff); + enc_wrbreg(handle, ENC_ERDPTH, (handle->nextpkt) >> 8); + + /* Read the next packet pointer and the 4 byte read status vector (RSV) + * at the beginning of the received packet. (ERDPT should auto-increment + * and wrap to the beginning of the read buffer as necessary) + */ + + enc_rdbuffer(rsv, 6); + + /* Decode the new next packet pointer, and the RSV. The + * RSV is encoded as: + * + * Bits 0-15: Indicates length of the received frame. This includes the + * destination address, source address, type/length, data, + * padding and CRC fields. This field is stored in little- + * endian format. + * Bits 16-31: Bit encoded RX status. + */ + + handle->nextpkt = (uint16_t)rsv[1] << 8 | (uint16_t)rsv[0]; + pktlen = (uint16_t)rsv[3] << 8 | (uint16_t)rsv[2]; + rxstat = (uint16_t)rsv[5] << 8 | (uint16_t)rsv[4]; + + /* Check if the packet was received OK */ + + if ((rxstat & RXSTAT_OK) == 0) { +#ifdef CONFIG_ENC28J60_STATS + priv->stats.rxnotok++; +#endif + result = false; + } else { /* Check for a usable packet length (4 added for the CRC) */ + if (pktlen > (CONFIG_NET_ETH_MTU + 4) || pktlen <= (ETH_HDRLEN + 4)) { + #ifdef CONFIG_ENC28J60_STATS + priv->stats.rxpktlen++; + #endif + result = false; + } else { /* Otherwise, read and process the packet */ + /* Save the packet length (without the 4 byte CRC) in handle->RxFrameInfos.length*/ + + handle->RxFrameInfos.length = pktlen - 4; + + /* Copy the data data from the receive buffer to priv->dev.d_buf. + * ERDPT should be correctly positioned from the last call to to + * end_rdbuffer (above). + */ + + enc_rdbuffer(handle->RxFrameInfos.buffer, handle->RxFrameInfos.length); + + } + } + + /* Move the RX read pointer to the start of the next received packet. + * This frees the memory we just read. + */ + + /* Errata 14 (on se sert de rxstat comme variable temporaire */ + rxstat = handle->nextpkt; + if (rxstat == PKTMEM_RX_START) { + rxstat = PKTMEM_RX_END; + } else { + rxstat--; + } + enc_wrbreg(handle, ENC_ERXRDPTL, rxstat & 0xff); + enc_wrbreg(handle, ENC_ERXRDPTH, rxstat >> 8); +/* + enc_wrbreg(handle, ENC_ERXRDPTL, (handle->nextpkt)); + enc_wrbreg(handle, ENC_ERXRDPTH, (handle->nextpkt) >> 8); +*/ + + /* Decrement the packet counter indicate we are done with this packet */ + + enc_bfsgreg(ENC_ECON2, ECON2_PKTDEC); + + return result; +} + +/**************************************************************************** + * Function: enc_linkstatus + * + * Description: + * The current link status can be obtained from the PHSTAT1.LLSTAT or + * PHSTAT2.LSTAT. + * + * Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static void enc_linkstatus(ENC_HandleTypeDef *handle) +{ + handle->LinkStatus = enc_rdphy(handle, ENC_PHSTAT2); +} + +/**************************************************************************** + * Function: ENC_EnableInterrupts + * + * Description: + * Enable individual ENC28J60 interrupts + * + * Parameters: + * bits - The individual bits to enable + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_EnableInterrupts(uint8_t bits) +{ + enc_bfsgreg(ENC_EIE, bits); +} + + +/**************************************************************************** + * Function: ENC_IRQHandler + * + * Description: + * Perform interrupt handling logic outside of the interrupt handler (on + * the work queue thread). + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_IRQHandler(ENC_HandleTypeDef *handle) +{ + uint8_t eir; + + /* Disable further interrupts by clearing the global interrupt enable bit. + * "After an interrupt occurs, the host controller should clear the global + * enable bit for the interrupt pin before servicing the interrupt. Clearing + * the enable bit will cause the interrupt pin to return to the non-asserted + * state (high). Doing so will prevent the host controller from missing a + * falling edge should another interrupt occur while the immediate interrupt + * is being serviced." + */ + + enc_bfcgreg(ENC_EIE, EIE_INTIE); + + /* Read EIR for interrupt flags + */ + + eir = enc_rdgreg(ENC_EIR) & EIR_ALLINTS; + + /* PKTIF is not reliable, check PKCNT instead */ + if (enc_rdbreg(handle, ENC_EPKTCNT) != 0) { + /* Manage EIR_PKTIF by software */ + eir |= EIR_PKTIF; + } + + /* Store interrupt flags in handle */ + handle->interruptFlags = eir; + + /* If link status has changed, read it */ + if ((eir & EIR_LINKIF) != 0) /* Link change interrupt */ + { + enc_linkstatus(handle); /* Get current link status */ + enc_rdphy(handle, ENC_PHIR); /* Clear the LINKIF interrupt */ + } + + /* Reset ENC28J60 interrupt flags, except PKTIF form which interruption is deasserted when PKTCNT reaches 0 */ + enc_bfcgreg(ENC_EIR, EIR_ALLINTS); + + /* Enable Ethernet interrupts */ + /* done after effective process on interrupts enc_bfsgreg(ENC_EIE, EIE_INTIE); */ +} + +/**************************************************************************** + * Function: ENC_GetPkcnt + * + * Description: + * Get the number of pending receive packets + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * the number of receive packet not processed yet + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_GetPkcnt(ENC_HandleTypeDef *handle) +{ + handle->pktCnt = enc_rdbreg(handle, ENC_EPKTCNT); +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/part15a-tcpip-webserver-gpio-interrupt/net/enc28j60.h b/part15a-tcpip-webserver-gpio-interrupt/net/enc28j60.h new file mode 100644 index 0000000..e2c3504 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/net/enc28j60.h @@ -0,0 +1,811 @@ +/** + ****************************************************************************** + * @file enc28j60.h + * @author Christian Schoffit, portions from Gregory Nutt: + * Copyright (C) 2010-2012, 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * @version V1.0.0 + * @date 02-June-2015 + * @brief This file provides a set of functions needed to manage the ENC28J60 + * Stand-Alone Ethernet Controller with SPI Interface. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2015 Christian Schoffit

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of Christian Schoffit nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +#ifndef ENC28J60_H_INCLUDED +#define ENC28J60_H_INCLUDED + +#include +#include + +#ifdef USE_PROTOTHREADS +#include "pt.h" +#else +#define PT_BEGIN(x) +#define PT_END(x) +#endif + +#ifndef NULL +#define NULL ((void *)0) +#endif + +/* Ethernet frames are between 64 and 1518 bytes long */ + +#define MIN_FRAMELEN 64 +#define MAX_FRAMELEN 1518 + +/* Callback functions *********************************************************/ + +/** + * Implement SPI Slave selection and deselection. Must be provided by user code + * param select: true if the ENC28J60 slave SPI if selected, false otherwise + * retval none + */ + +void ENC_SPI_Select(bool select); + +/** + * Implement SPI single byte send and receive. + * The ENC28J60 slave SPI must already be selected and wont be deselected after transmission + * Must be provided by user code + * param command: command or data to be sent to ENC28J60 + * retval answer from ENC28J60 + */ + +void ENC_SPI_SendWithoutSelection(uint8_t command); + +/** + * Implement SPI single byte send and receive. Must be provided by user code + * param command: command or data to be sent to ENC28J60 + * retval answer from ENC28J60 + */ + +void ENC_SPI_Send(uint8_t command); + +/** + * Implement SPI buffer send and receive. Must be provided by user code + * param master2slave: data to be sent from host to ENC28J60, can be NULL if we only want to receive data from slave + * param slave2master: answer from ENC28J60 to host, can be NULL if we only want to send data to slave + * retval none + */ + +void ENC_SPI_SendBuf(uint8_t *master2slave, uint8_t *slave2master, uint16_t bufferSize); + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup ETH_Exported_Types ETH Exported Types + * @{ + */ + +/** + * @brief ETH Init Structure definition + */ + +typedef struct +{ + uint32_t DuplexMode; /*!< Selects the MAC duplex mode: Half-Duplex or Full-Duplex mode + This parameter can be a value of @ref ETH_Duplex_Mode */ + + uint8_t *MACAddr; /*!< MAC Address of used Hardware: must be pointer on an array of 6 bytes */ + + uint32_t ChecksumMode; /*!< Selects if the checksum is check by hardware or by software. + This parameter can be a value of @ref ETH_Checksum_Mode */ + + uint8_t InterruptEnableBits; /*!< Selects the enabled interrupts */ +} ENC_InitTypeDef; + + +/** + * @brief Received Frame Informations structure definition + */ +typedef struct +{ + uint32_t length; /*!< Frame length */ + + uint8_t buffer[MAX_FRAMELEN+20]; /*!< Frame buffer */ + +} ENC_RxFrameInfos; + + +/** + * @brief ENC28J60 Handle Structure definition + */ + +typedef struct +{ + ENC_InitTypeDef Init; /*!< Ethernet Init Configuration */ + + uint8_t bank; /*!< Currently selected bank */ + uint8_t interruptFlags;/*!< The last value of interrupts flags */ + uint8_t pktCnt; /*!< The number of pending receive packets */ + uint16_t nextpkt; /*!< Next packet address */ + uint16_t LinkStatus; /*!< Ethernet link status */ + uint16_t transmitLength;/*!< The length of ip frame to transmit */ + uint32_t startTime; /*!< The start time of the current timer */ + uint32_t duration; /*!< The duration of the current timer in ms */ + uint16_t retries; /*!< The number of transmission retries left to do */ + + ENC_RxFrameInfos RxFrameInfos; /*!< last Rx frame infos */ +} ENC_HandleTypeDef; + + /** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup ETH_Exported_Constants ETH Exported Constants + * @{ + */ +/* Size of the Ethernet header */ +#define ETH_HDRLEN 14 /* Minimum size: 2*6 + 2 */ + + +#define ERR_OK 0 /* No error, everything OK. */ +#define ERR_MEM -1 /* Out of memory error. */ +#define ERR_BUF -2 /* Buffer error. */ +#define ERR_TIMEOUT -3 /* Timeout. */ + +/* ENC28J60 Commands ********************************************************/ +/* A total of seven instructions are implemented on the ENC28J60. Where: + * + * aaaaaa is the 5-bit address of a control register, and + * dddddddd is one or more bytes of data that may accompany the command. + */ + +#define ENC_RCR (0x00) /* Read Control Register + * 000 | aaaaa | (Register value returned)) */ +#define ENC_RBM (0x3a) /* Read Buffer Memory + * 001 | 11010 | (Read buffer data follows) */ +#define ENC_WCR (0x40) /* Write Control Register + * 010 | aaaaa | dddddddd */ +#define ENC_WBM (0x7a) /* Write Buffer Memory + * 011 | 11010 | (Write buffer data follows) */ +#define ENC_BFS (0x80) /* Bit Field Set + * 100 | aaaaa | dddddddd */ +#define ENC_BFC (0xa0) /* Bit Field Clear + * 101 | aaaaa | dddddddd */ +#define ENC_SRC (0xff) /* System Reset + * 111 | 11111 | (No data) */ + +/* Global Control Registers *************************************************/ +/* Control registers are accessed with the RCR, RBM, WCR, BFS, and BFC + * commands. The following identifies all ENC28J60 control registers. The + * control register memory is partitioned into four banks, selectable by the + * bank select bits, BSEL1:BSEL0, in the ECON1 register. + * + * The last five locations (0x1b to 0x1f) of all banks point to a common set + * of registers: EIE, EIR, ESTAT, ECON2 and ECON1. These are key registers + * used in controlling and monitoring the operation of the device. Their + * common mapping allows easy access without switching the bank. + * + * Control registers for the ENC28J60 are generically grouped as ETH, MAC and + * MII registers. Register names starting with E belong to the ETH group. + * Similarly, registers names starting with MA belong to the MAC group and + * registers prefixed with MI belong to the MII group. + */ + +#define ENC_EIE (0x1b) /* Ethernet Interrupt Enable Register */ +#define ENC_EIR (0x1c) /* Ethernet Interupt Request Register */ +#define ENC_ESTAT (0x1d) /* Ethernet Status Register */ +#define ENC_ECON2 (0x1e) /* Ethernet Control 2 Register */ +#define ENC_ECON1 (0x1f) /* Ethernet Control 1 Register */ + +/* Ethernet Interrupt Enable Register Bit Definitions */ + +#define EIE_RXERIE (1 << 0) /* Bit 0: Receive Error Interrupt Enable */ +#define EIE_TXERIE (1 << 1) /* Bit 1: Transmit Error Interrupt Enable */ + /* Bit 2: Reserved */ +#define EIE_TXIE (1 << 3) /* Bit 3: Transmit Enable */ +#define EIE_LINKIE (1 << 4) /* Bit 4: Link Status Change Interrupt Enable */ +#define EIE_DMAIE (1 << 5) /* Bit 5: DMA Interrupt Enable */ +#define EIE_PKTIE (1 << 6) /* Bit 6: Receive Packet Pending Interrupt Enable */ +#define EIE_INTIE (1 << 7) /* Bit 7: Global INT Interrupt Enable */ + +/* Ethernet Interrupt Request Register Bit Definitions */ + +#define EIR_RXERIF (1 << 0) /* Bit 0: Receive Error Interrupt */ +#define EIR_TXERIF (1 << 1) /* Bit 1: Transmit Error Interrupt */ + /* Bit 2: Reserved */ +#define EIR_TXIF (1 << 3) /* Bit 3: Transmit Interrupt */ +#define EIR_LINKIF (1 << 4) /* Bit 4: Link Change Interrupt */ +#define EIR_DMAIF (1 << 5) /* Bit 5: DMA Interrupt */ +#define EIR_PKTIF (1 << 6) /* Bit 6: Receive Packet Pending Interrupt */ + /* Bit 7: Reserved */ +#define EIR_ALLINTS (EIR_RXERIF | EIR_TXERIF | EIR_TXIF | EIR_LINKIF | EIR_DMAIF) /* All interrupts bar EIR_PKTIF*/ + +/* Ethernet Status Register Bit Definitions */ + +#define ESTAT_CLKRDY (1 << 0) /* Bit 0: Clock Ready */ +#define ESTAT_TXABRT (1 << 1) /* Bit 1: Transmit Abort Error */ +#define ESTAT_RXBUSY (1 << 2) /* Bit 2: Receive Busy */ + /* Bit 3: Reserved */ +#define ESTAT_LATECOL (1 << 4) /* Bit 4: Late Collision Error */ + /* Bit 5: Reserved */ +#define ESTAT_BUFER (1 << 6) /* Bit 6: Ethernet Buffer Error Status */ +#define ESTAT_INT (1 << 7) /* Bit 7: INT Interrupt */ + +/* Ethernet Control 1 Register Bit Definitions */ + +#define ECON1_BSEL_SHIFT (0) /* Bits 0-1: Bank select */ +#define ECON1_BSEL_MASK (3 << ECON1_BSEL_SHIFT) +# define ECON1_BSEL_BANK0 (0 << ECON1_BSEL_SHIFT) /* Bank 0 */ +# define ECON1_BSEL_BANK1 (1 << ECON1_BSEL_SHIFT) /* Bank 1 */ +# define ECON1_BSEL_BANK2 (2 << ECON1_BSEL_SHIFT) /* Bank 2 */ +# define ECON1_BSEL_BANK3 (3 << ECON1_BSEL_SHIFT) /* Bank 3 */ +#define ECON1_RXEN (1 << 2) /* Bit 2: Receive Enable */ +#define ECON1_TXRTS (1 << 3) /* Bit 3: Transmit Request to Send */ +#define ECON1_CSUMEN (1 << 4) /* Bit 4: DMA Checksum Enable */ +#define ECON1_DMAST (1 << 5) /* Bit 5: DMA Start and Busy Status */ +#define ECON1_RXRST (1 << 6) /* Bit 6: Receive Logic Reset */ +#define ECON1_TXRST (1 << 7) /* Bit 7: Transmit Logic Reset */ + +/* Ethernet Control 2 Register */ + /* Bits 0-2: Reserved */ +#define ECON2_VRPS (1 << 3) /* Bit 3: Voltage Regulator Power Save Enable */ + /* Bit 4: Reserved */ +#define ECON2_PWRSV (1 << 5) /* Bit 5: Power Save Enable */ +#define ECON2_PKTDEC (1 << 6) /* Bit 6: Packet Decrement */ +#define ECON2_AUTOINC (1 << 7) /* Bit 7: Automatic Buffer Pointer Increment Enable */ + +/* Banked Control Registers *************************************************/ +/* The remaining control registers are identified with a a 5 bit address and + * a bank selection. We pack the bank number and an indication if this is + * a MAC/PHY register access together with the control register address + * together to keep the design simpler. + */ + +#define ENC_ADDR_SHIFT (0) /* Bits 0-4: Register address */ +#define ENC_ADDR_MASK (0x1f << ENC_ADDR_SHIFT) +#define ENC_BANK_SHIFT (5) /* Bits 5-6: Bank number */ +#define ENC_BANK_MASK (3 << ENC_BSEL_SHIFT) +# define ENC_BANK0 (0 << ENC_BSEL_SHIFT) +# define ENC_BANK1 (1 << ENC_BSEL_SHIFT) +# define ENC_BANK2 (2 << ENC_BSEL_SHIFT) +# define ENC_BANK3 (3 << ENC_BSEL_SHIFT) +#define ENC_PHYMAC_SHIFT (7) /* Bit 7: This is a PHY/MAC command */ +#define ENC_PHYMAC (1 << ENC_PHYMAC_SHIFT) + +#define REGADDR(a,b,m) ((m) << ENC_PHYMAC_SHIFT | (b) << ENC_BANK_SHIFT | (a)) +#define GETADDR(a) ((a) & ENC_ADDR_MASK) +#define GETBANK(a) (((a) >> ENC_BANK_SHIFT) & 3) +#define ISPHYMAC(a) (((a) & ENC_PHYMAC) != 0) + +/* Bank 0 Control Register Addresses */ + +#define ENC_ERDPTL REGADDR(0x00, 0, 0) /* Read Pointer Low Byte (ERDPT<7:0> */ +#define ENC_ERDPTH REGADDR(0x01, 0, 0) /* Read Pointer High Byte (ERDPT<12:8>) */ +#define ENC_EWRPTL REGADDR(0x02, 0, 0) /* Write Pointer Low Byte (EWRPT<7:0>) */ +#define ENC_EWRPTH REGADDR(0x03, 0, 0) /* Write Pointer High Byte (EWRPT<12:8>) */ +#define ENC_ETXSTL REGADDR(0x04, 0, 0) /* TX Start Low Byte (ETXST<7:0>) */ +#define ENC_ETXSTH REGADDR(0x05, 0, 0) /* TX Start High Byte (ETXST<12:8>) */ +#define ENC_ETXNDL REGADDR(0x06, 0, 0) /* TX End Low Byte (ETXND<7:0>) */ +#define ENC_ETXNDH REGADDR(0x07, 0, 0) /* TX End High Byte (ETXND<12:8>) */ +#define ENC_ERXSTL REGADDR(0x08, 0, 0) /* RX Start Low Byte (ERXST<7:0>) */ +#define ENC_ERXSTH REGADDR(0x09, 0, 0) /* RX Start High Byte (ERXST<12:8>) */ +#define ENC_ERXNDL REGADDR(0x0a, 0, 0) /* RX End Low Byte (ERXND<7:0>) */ +#define ENC_ERXNDH REGADDR(0x0b, 0, 0) /* RX End High Byte (ERXND<12:8>) */ +#define ENC_ERXRDPTL REGADDR(0x0c, 0, 0) /* RX RD Pointer Low Byte (ERXRDPT<7:0>) */ +#define ENC_ERXRDPTH REGADDR(0x0d, 0, 0) /* RX RD Pointer High Byte (ERXRDPT<12:8>) */ +#define ENC_ERXWRPTL REGADDR(0x0e, 0, 0) /* RX WR Pointer Low Byte (ERXWRPT<7:0>) */ +#define ENC_ERXWRPTH REGADDR(0x0f, 0, 0) /* RX WR Pointer High Byte (ERXWRPT<12:8>) */ +#define ENC_EDMASTL REGADDR(0x10, 0, 0) /* DMA Start Low Byte (EDMAST<7:0>) */ +#define ENC_EDMASTH REGADDR(0x11, 0, 0) /* DMA Start High Byte (EDMAST<12:8>) */ +#define ENC_EDMANDL REGADDR(0x12, 0, 0) /* DMA End Low Byte (EDMAND<7:0>) */ +#define ENC_EDMANDH REGADDR(0x13, 0, 0) /* DMA End High Byte (EDMAND<12:8>) */ +#define ENC_EDMADSTL REGADDR(0x14, 0, 0) /* DMA Destination Low Byte (EDMADST<7:0>) */ +#define ENC_EDMADSTH REGADDR(0x15, 0, 0) /* DMA Destination High Byte (EDMADST<12:8>) */ +#define ENC_EDMACSL REGADDR(0x16, 0, 0) /* DMA Checksum Low Byte (EDMACS<7:0>) */ +#define ENC_EDMACSH REGADDR(0x17, 0, 0) /* DMA Checksum High Byte (EDMACS<15:8>) */ + /* 0x18-0x1a: Reserved */ + /* 0x1b-0x1f: EIE, EIR, ESTAT, ECON2, ECON1 */ +/* Bank 1 Control Register Addresses */ + +#define ENC_EHT0 REGADDR(0x00, 1, 0) /* Hash Table Byte 0 (EHT<7:0>) */ +#define ENC_EHT1 REGADDR(0x01, 1, 0) /* Hash Table Byte 1 (EHT<15:8>) */ +#define ENC_EHT2 REGADDR(0x02, 1, 0) /* Hash Table Byte 2 (EHT<23:16>) */ +#define ENC_EHT3 REGADDR(0x03, 1, 0) /* Hash Table Byte 3 (EHT<31:24>) */ +#define ENC_EHT4 REGADDR(0x04, 1, 0) /* Hash Table Byte 4 (EHT<39:32>) */ +#define ENC_EHT5 REGADDR(0x05, 1, 0) /* Hash Table Byte 5 (EHT<47:40>) */ +#define ENC_EHT6 REGADDR(0x06, 1, 0) /* Hash Table Byte 6 (EHT<55:48>) */ +#define ENC_EHT7 REGADDR(0x07, 1, 0) /* Hash Table Byte 7 (EHT<63:56>) */ +#define ENC_EPMM0 REGADDR(0x08, 1, 0) /* Pattern Match Mask Byte 0 (EPMM<7:0>) */ +#define ENC_EPMM1 REGADDR(0x09, 1, 0) /* Pattern Match Mask Byte 1 (EPMM<15:8>) */ +#define ENC_EPMM2 REGADDR(0x0a, 1, 0) /* Pattern Match Mask Byte 2 (EPMM<23:16>) */ +#define ENC_EPMM3 REGADDR(0x0b, 1, 0) /* Pattern Match Mask Byte 3 (EPMM<31:24>) */ +#define ENC_EPMM4 REGADDR(0x0c, 1, 0) /* Pattern Match Mask Byte 4 (EPMM<39:32>) */ +#define ENC_EPMM5 REGADDR(0x0d, 1, 0) /* Pattern Match Mask Byte 5 (EPMM<47:40>) */ +#define ENC_EPMM6 REGADDR(0x0e, 1, 0) /* Pattern Match Mask Byte 6 (EPMM<55:48>) */ +#define ENC_EPMM7 REGADDR(0x0f, 1, 0) /* Pattern Match Mask Byte 7 (EPMM<63:56>) */ +#define ENC_EPMCSL REGADDR(0x10, 1, 0) /* Pattern Match Checksum Low Byte (EPMCS<7:0>) */ +#define ENC_EPMCSH REGADDR(0x11, 1, 0) /* Pattern Match Checksum High Byte (EPMCS<15:0>) */ + /* 0x12-0x13: Reserved */ +#define ENC_EPMOL REGADDR(0x14, 1, 0) /* Pattern Match Offset Low Byte (EPMO<7:0>) */ +#define ENC_EPMOH REGADDR(0x15, 1, 0) /* Pattern Match Offset High Byte (EPMO<12:8>) */ + /* 0x16-0x17: Reserved */ +#define ENC_ERXFCON REGADDR(0x18, 1, 0) /* Receive Filter Configuration */ +#define ENC_EPKTCNT REGADDR(0x19, 1, 0) /* Ethernet Packet Count */ + /* 0x1a: Reserved */ + /* 0x1b-0x1f: EIE, EIR, ESTAT, ECON2, ECON1 */ + +/* Receive Filter Configuration Bit Definitions */ + +#define ERXFCON_BCEN (1 << 0) /* Bit 0: Broadcast Filter Enable */ +#define ERXFCON_MCEN (1 << 1) /* Bit 1: Multicast Filter Enable */ +#define ERXFCON_HTEN (1 << 2) /* Bit 2: Hash Table Filter Enable */ +#define ERXFCON_MPEN (1 << 3) /* Bit 3: Magic Packet Filter Enable */ +#define ERXFCON_PMEN (1 << 4) /* Bit 4: Pattern Match Filter Enable */ +#define ERXFCON_CRCEN (1 << 5) /* Bit 5: Post-Filter CRC Check Enable */ +#define ERXFCON_ANDOR (1 << 6) /* Bit 6: AND/OR Filter Select */ +#define ERXFCON_UCEN (1 << 7) /* Bit 7: Unicast Filter Enable */ + +/* Bank 2 Control Register Addresses */ + +#define ENC_MACON1 REGADDR(0x00, 2, 1) /* MAC Control 1 */ + /* 0x01: Reserved */ +#define ENC_MACON3 REGADDR(0x02, 2, 1) /* MAC Control 3 */ +#define ENC_MACON4 REGADDR(0x03, 2, 1) /* MAC Control 4 */ +#define ENC_MABBIPG REGADDR(0x04, 2, 1) /* Back-to-Back Inter-Packet Gap (BBIPG<6:0>) */ + /* 0x05: Reserved */ +#define ENC_MAIPGL REGADDR(0x06, 2, 1) /* Non-Back-to-Back Inter-Packet Gap Low Byte (MAIPGL<6:0>) */ +#define ENC_MAIPGH REGADDR(0x07, 2, 1) /* Non-Back-to-Back Inter-Packet Gap High Byte (MAIPGH<6:0>) */ +#define ENC_MACLCON1 REGADDR(0x08, 2, 1) /* MAC Collision Control 1 */ +#define ENC_MACLCON2 REGADDR(0x09, 2, 1) /* MAC Collision Control 2 */ +#define ENC_MAMXFLL REGADDR(0x0a, 2, 1) /* Maximum Frame Length Low Byte (MAMXFL<7:0>) */ +#define ENC_MAMXFLH REGADDR(0x0b, 2, 1) /* Maximum Frame Length High Byte (MAMXFL<15:8>) */ + /* 0x0c-0x11: Reserved */ +#define ENC_MICMD REGADDR(0x12, 2, 1) /* MII Command Register */ + /* 0x13: Reserved */ +#define ENC_MIREGADR REGADDR(0x14, 2, 1) /* MII Register Address */ + /* 0x15: Reserved */ +#define ENC_MIWRL REGADDR(0x16, 2, 1) /* MII Write Data Low Byte (MIWR<7:0>) */ +#define ENC_MIWRH REGADDR(0x17, 2, 1) /* MII Write Data High Byte (MIWR<15:8>) */ +#define ENC_MIRDL REGADDR(0x18, 2, 1) /* MII Read Data Low Byte (MIRD<7:0>) */ +#define ENC_MIRDH REGADDR(0x19, 2, 1) /* MII Read Data High Byte(MIRD<15:8>) */ + /* 0x1a: Reserved */ + /* 0x1b-0x1f: EIE, EIR, ESTAT, ECON2, ECON1 */ + +/* MAC Control 1 Register Bit Definitions */ + +#define MACON1_MARXEN (1 << 0) /* Bit 0: MAC Receive Enable */ +#define MACON1_PASSALL (1 << 1) /* Bit 1: Pass All Received Frames Enable */ +#define MACON1_RXPAUS (1 << 2) /* Bit 2: Pause Control Frame Reception Enable */ +#define MACON1_TXPAUS (1 << 3) /* Bit 3: Pause Control Frame Transmission Enable */ + /* Bits 4-7: Unimplemented or reserved */ + +/* MAC Control 1 Register Bit Definitions */ + +#define MACON3_FULDPX (1 << 0) /* Bit 0: MAC Full-Duplex Enable */ +#define MACON3_FRMLNEN (1 << 1) /* Bit 1: Frame Length Checking Enable */ +#define MACON3_HFRMLEN (1 << 2) /* Bit 2: Huge Frame Enable */ +#define MACON3_PHDRLEN (1 << 3) /* Bit 3: Proprietary Header Enable */ +#define MACON3_TXCRCEN (1 << 4) /* Bit 4: Transmit CRC Enable */ +#define MACON3_PADCFG0 (1 << 5) /* Bit 5: Automatic Pad and CRC Configuration */ +#define MACON3_PADCFG1 (1 << 6) /* Bit 6: " " " " " " " " " " */ +#define MACON3_PADCFG2 (1 << 7) /* Bit 7: " " " " " " " " " " */ + +/* MAC Control 1 Register Bit Definitions */ + +#define MACON4_NOBKOFF (1 << 4) /* Bit 4: No Backoff Enable */ +#define MACON4_BPEN (1 << 5) /* Bit 5: No Backoff During Backpressure Enable */ +#define MACON4_DEFER (1 << 6) /* Bit 6: Defer Transmission Enable bit */ + +/* MII Command Register Bit Definitions */ + +#define MICMD_MIIRD (1 << 0) /* Bit 0: MII Read Enable */ +#define MICMD_MIISCAN (1 << 1) /* Bit 1: MII Scan Enable */ + +/* Bank 3 Control Register Addresses */ + +#define ENC_MAADR5 REGADDR(0x00, 3, 1) /* MAC Address Byte 5 (MAADR<15:8>) */ +#define ENC_MAADR6 REGADDR(0x01, 3, 1) /* MAC Address Byte 6 (MAADR<7:0>) */ +#define ENC_MAADR3 REGADDR(0x02, 3, 1) /* MAC Address Byte 3 (MAADR<31:24>), OUI Byte 3 */ +#define ENC_MAADR4 REGADDR(0x03, 3, 1) /* MAC Address Byte 4 (MAADR<23:16>) */ +#define ENC_MAADR1 REGADDR(0x04, 3, 1) /* MAC Address Byte 1 (MAADR<47:40>), OUI Byte 1 */ +#define ENC_MAADR2 REGADDR(0x05, 3, 1) /* MAC Address Byte 2 (MAADR<39:32>), OUI Byte 2 */ +#define ENC_EBSTSD REGADDR(0x06, 3, 0) /* Built-in Self-Test Fill Seed (EBSTSD<7:0>) */ +#define ENC_EBSTCON REGADDR(0x07, 3, 0) /* Built-in Self-Test Control */ +#define ENC_EBSTCSL REGADDR(0x08, 3, 0) /* Built-in Self-Test Checksum Low Byte (EBSTCS<7:0>) */ +#define ENC_EBSTCSH REGADDR(0x09, 3, 0) /* Built-in Self-Test Checksum High Byte (EBSTCS<15:8>) */ +#define ENC_MISTAT REGADDR(0x0a, 3, 1) /* MII Status Register */ + /* 0x0b-0x11: Reserved */ +#define ENC_EREVID REGADDR(0x12, 3, 0) /* Ethernet Revision ID */ + /* 0x13-0x14: Reserved */ +#define ENC_ECOCON REGADDR(0x15, 3, 0) /* Clock Output Control */ + /* 0x16: Reserved */ +#define ENC_EFLOCON REGADDR(0x17, 3, 0) /* Ethernet Flow Control */ +#define ENC_EPAUSL REGADDR(0x18, 3, 0) /* Pause Timer Value Low Byte (EPAUS<7:0>) */ +#define ENC_EPAUSH REGADDR(0x19, 3, 0) /* Pause Timer Value High Byte (EPAUS<15:8>) */ + /* 0x1a: Reserved */ + /* 0x1b-0x1f: EIE, EIR, ESTAT, ECON2, ECON1 */ + +/* Built-in Self-Test Control Register Bit Definitions */ + +#define EBSTCON_BISTST (1 << 0) /* Bit 0: Built-in Self-Test Start/Busy */ +#define EBSTCON_TME (1 << 1) /* Bit 1: Test Mode Enable */ +#define EBSTCON_TMSEL0 (1 << 2) /* Bit 2: Test Mode Select */ +#define EBSTCON_TMSEL1 (1 << 3) /* Bit 3: " " " " " " */ +#define EBSTCON_PSEL (1 << 4) /* Bit 4: Port Select */ +#define EBSTCON_PSV0 (1 << 5) /* Bit 5: Pattern Shift Value */ +#define EBSTCON_PSV1 (1 << 6) /* Bit 6: " " " " " */ +#define EBSTCON_PSV2 (1 << 7) /* Bit 7: " " " " " */ + +/* MII Status Register Register Bit Definitions */ + +#define MISTAT_BUSY (1 << 0) /* Bit 0: MII Management Busy */ +#define MISTAT_SCAN (1 << 1) /* Bit 1: MII Management Scan Operation */ +#define MISTAT_NVALID (1 << 2) /* Bit 2: MII Management Read Data Not Valid */ + /* Bits 3-7: Reserved or unimplemented */ + +/* Ethernet Flow Control Register Bit Definitions */ + +#define EFLOCON_FCEN0 (1 << 0) /* Bit 0: Flow Control Enable */ +#define EFLOCON_FCEN1 (1 << 1) /* Bit 1: " " " " " " */ +#define EFLOCON_FULDPXS (1 << 2) /* Bit 2: Read-Only MAC Full-Duplex Shadow */ + /* Bits 3-7: Reserved or unimplemented */ + +/* PHY Registers ************************************************************/ + +#define ENC_PHCON1 (0x00) /* PHY Control Register 1 */ +#define ENC_PHSTAT1 (0x01) /* PHY Status 1 */ +#define ENC_PHID1 (0x02) /* PHY ID Register 1 */ +#define ENC_PHID2 (0x03) /* PHY ID Register 2 */ +#define ENC_PHCON2 (0x10) /* PHY Control Register 2 */ +#define ENC_PHSTAT2 (0x11) /* PHY Status 2 */ +#define ENC_PHIE (0x12) /* PHY Interrupt Enable Register */ +#define ENC_PHIR (0x13) /* PHY Interrupt Request Register */ +#define ENC_PHLCON (0x14) + +/* PHY Control Register 1 Register Bit Definitions */ + +#define PHCON1_PDPXMD (1 << 8) /* Bit 8: PHY Duplex Mode */ +#define PHCON1_PPWRSV (1 << 11) /* Bit 11: PHY Power-Down */ +#define PHCON1_PLOOPBK (1 << 14) /* Bit 14: PHY Loopback */ +#define PHCON1_PRST (1 << 15) /* Bit 15: PHY Software Reset */ + +/* PHY Status 1 Register Bit Definitions */ + +#define PHSTAT1_JBSTAT (1 << 1) /* Bit 1: PHY Latching Jabber Status */ +#define PHSTAT1_LLSTAT (1 << 2) /* Bit 2: PHY Latching Link Status */ +#define PHSTAT1_PHDPX (1 << 11) /* Bit 11: PHY Half-Duplex Capable */ +#define PHSTAT1_PFDPX (1 << 12) /* Bit 12: PHY Full-Duplex Capable */ + +/* PHY Control Register 2 Register Bit Definitions */ + +#define PHCON2_HDLDIS (1 << 8) /* Bit 8: PHY Half-Duplex Loopback Disable */ +#define PHCON2_JABBER (1 << 10) /* Bit 10: Jabber Correction Disable */ +#define PHCON2_TXDIS (1 << 13) /* Bit 13: Twisted-Pair Transmitter Disable */ +#define PHCON2_FRCLINK (1 << 14) /* Bit 14: PHY Force Linkup */ + +/* PHY Status 2 Register Bit Definitions */ + +#define PHSTAT2_PLRITY (1 << 5) /* Bit 5: Polarity Status */ +#define PHSTAT2_DPXSTAT (1 << 9) /* Bit 9: PHY Duplex Status */ +#define PHSTAT2_LSTAT (1 << 10) /* Bit 10: PHY Link Status */ +#define PHSTAT2_COLSTAT (1 << 11) /* Bit 11: PHY Collision Status */ +#define PHSTAT2_RXSTAT (1 << 12) /* Bit 12: PHY Receive Status */ +#define PHSTAT2_TXSTAT (1 << 13) /* Bit 13: PHY Transmit Status */ + +/* PHY Interrupt Enable Register Bit Definitions */ + +#define PHIE_PGEIE (1 << 1) /* Bit 1: PHY Global Interrupt Enable */ +#define PHIE_PLNKIE (1 << 4) /* Bit 4: PHY Link Change Interrupt Enable */ + +/* PHIR Regiser Bit Definitions */ + +#define PHIR_PGIF (1 << 2) /* Bit 2: PHY Global Interrupt */ +#define PHIR_PLNKIF (1 << 4) /* Bit 4: PHY Link Change Interrupt */ + +/* PHLCON Regiser Bit Definitions */ + /* Bit 0: Reserved */ +#define PHLCON_STRCH (1 << 1) /* Bit 1: LED Pulse Stretching Enable */ +#define PHLCON_LFRQ0 (1 << 2) /* Bit 2: LED Pulse Stretch Time Configuration */ +#define PHLCON_LFRQ1 (1 << 3) /* Bit 3: " " " " " " " " " */ +#define PHLCON_LBCFG0 (1 << 4) /* Bit 4: LEDB Configuration */ +#define PHLCON_LBCFG1 (1 << 5) /* Bit 5: " " " " */ +#define PHLCON_LBCFG2 (1 << 6) /* Bit 6: " " " " */ +#define PHLCON_LBCFG3 (1 << 7) /* Bit 7: " " " " */ +#define PHLCON_LACFG0 (1 << 8) /* Bit 8: LEDA Configuration */ +#define PHLCON_LACFG1 (1 << 9) /* Bit 9: " " " " */ +#define PHLCON_LACFG2 (1 << 10) /* Bit 10: " " " " */ +#define PHLCON_LACFG3 (1 << 11) /* Bit 11: " " " " */ + +/* Packet Memory ************************************************************/ + +/* 8-Kbyte Transmit/Receive Packet Dual Port SRAM */ + +#define PKTMEM_START 0x0000 +#define PKTMEM_END 0x1fff + +/* maximum transfer unit */ +#define CONFIG_NET_ETH_MTU 1500 + +/* Packet Control Bits Definitions ******************************************/ + +#define PKTCTRL_POVERRIDE (1 << 0) /* Bit 0: Per Packet Override */ +#define PKTCTRL_PCRCEN (1 << 1) /* Bit 1: Per Packet CRC Enable */ +#define PKTCTRL_PPADEN (1 << 2) /* Bit 2: Per Packet Padding Enable */ +#define PKTCTRL_PHUGEEN (1 << 3) /* Bit 3: Per Packet Huge Frame Enable */ + +/* RX Status Bit Definitions ************************************************/ + +#define RXSTAT_LDEVENT (1 << 0) /* Bit 0: Long event or pack dropped */ + /* Bit 1: Reserved */ +#define RXSTAT_CEPS (1 << 2) /* Bit 2: Carrier event previously seen */ + /* Bit 3: Reserved */ +#define RXSTAT_CRCERROR (1 << 4) /* Bit 4: Frame CRC field bad */ +#define RXSTAT_LENERROR (1 << 5) /* Bit 5: Packet length != data length */ +#define RXSTAT_LENRANGE (1 << 6) /* Bit 6: Type/length field > 1500 bytes */ +#define RXSTAT_OK (1 << 7) /* Bit 7: Packet with valid CRC and no symbol errors */ +#define RXSTAT_MCAST (1 << 8) /* Bit 8: Packet with multicast address */ +#define RXSTAT_BCAST (1 << 9) /* Bit 9: Packet with broadcast address */ +#define RXSTAT_DRIBBLE (1 << 10) /* Bit 10: Additional bits received after packet */ +#define RXSTAT_CTRLFRAME (1 << 11) /* Bit 11: Control frame with valid type/length */ +#define RXSTAT_PAUSE (1 << 12) /* Bit 12: Control frame with pause frame opcde */ +#define RXSTAT_UNKOPCODE (1 << 13) /* Bit 13: Control frame with unknown opcode */ +#define RXSTAT_VLANTYPE (1 << 14) /* Bit 14: Current frame is a VLAN tagged frame */ + /* Bit 15: Zero */ +/* TSV bit definitions */ +#define TSV_LATECOL (1 << 5) /* Bit 5: Late Collision Error, RSV byte 3 */ + + + +/** @defgroup ETH_Duplex_Mode ETH Duplex Mode + * @{ + */ +#define ETH_MODE_FULLDUPLEX ((uint32_t)0x00000800) +#define ETH_MODE_HALFDUPLEX ((uint32_t)0x00000000) +/** + * @} + */ + +/** @defgroup ETH_Rx_Mode ETH Rx Mode + * @{ + */ +#define ETH_RXPOLLING_MODE ((uint32_t)0x00000000) +#define ETH_RXINTERRUPT_MODE ((uint32_t)0x00000001) +/** + * @} + */ + +/** @defgroup ETH_Checksum_Mode ETH Checksum Mode + * @{ + */ +#define ETH_CHECKSUM_BY_HARDWARE ((uint32_t)0x00000000) +#define ETH_CHECKSUM_BY_SOFTWARE ((uint32_t)0x00000001) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup SPI_Exported_Functions + * @{ + */ + +/** @addtogroup SPI_Exported_Functions_Group1 + * @{ + */ +/* Initialization/de-initialization functions **********************************/ + + +/** + * Initialize the enc28j60 and configure the needed hardware resources + * param handle: Handle on data configuration. + * retval None + */ + +bool ENC_Start(ENC_HandleTypeDef *handle); + +/**************************************************************************** + * Function: ENC_SetMacAddr + * + * Description: + * Set the MAC address to the configured value. This is done after ifup + * or after a TX timeout. Note that this means that the interface must + * be down before configuring the MAC addr. + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_SetMacAddr(ENC_HandleTypeDef *handle); + +/**************************************************************************** + * Function: ENC_RestoreTXBuffer + * + * Description: + * Prepare TX buffer + * + * Parameters: + * handle - Reference to the driver state structure + * len - length of buffer + * + * Returned Value: + * ERR_OK 0 No error, everything OK. + * ERR_MEM -1 Out of memory error. + * ERR_TIMEOUT -3 Timeout. + * + * Assumptions: + * + ****************************************************************************/ + +int8_t ENC_RestoreTXBuffer(ENC_HandleTypeDef *handle, uint16_t len); + +/**************************************************************************** + * Function: ENC_WriteBuffer + * + * Description: + * Write a buffer of data. + * + * Parameters: + * buffer - A pointer to the buffer to write from + * buflen - The number of bytes to write + * + * Returned Value: + * None + * + * Assumptions: + * Read pointer is set to the correct address + * + ****************************************************************************/ + +void ENC_WriteBuffer(void *buffer, uint16_t buflen); + +/**************************************************************************** + * Function: ENC_Transmit + * + * Description: + * Start hardware transmission. Called either from: + * + * - pkif interrupt when an application responds to the receipt of data + * by trying to send something, or + * - From watchdog based polling. + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * none + * + * Assumptions: + * + ****************************************************************************/ + +#ifdef USE_PROTOTHREADS +PT_THREAD(ENC_Transmit(struct pt *pt, ENC_HandleTypeDef *handle)); +#else +void ENC_Transmit(ENC_HandleTypeDef *handle); +#endif + + /** + * @} + */ + + /** + * @} + */ + +/**************************************************************************** + * Function: ENC_GetReceivedFrame + * + * Description: + * Check if we have received packet, and if so, retrive them. + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * true if new packet is available; false otherwise + * + * Assumptions: + * + ****************************************************************************/ + +bool ENC_GetReceivedFrame(ENC_HandleTypeDef *handle); + +/**************************************************************************** + * Function: ENC_IRQHandler + * + * Description: + * Perform interrupt handling logic outside of the interrupt handler (on + * the work queue thread). + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_IRQHandler(ENC_HandleTypeDef *handle); + +/**************************************************************************** + * Function: ENC_EnableInterrupts + * + * Description: + * Enable individual ENC28J60 interrupts + * + * Parameters: + * bits - The individual bits to enable + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_EnableInterrupts(uint8_t bits); + +/**************************************************************************** + * Function: ENC_GetPkcnt + * + * Description: + * Get the number of pending receive packets + * + * Parameters: + * handle - Reference to the driver state structure + * + * Returned Value: + * the number of receive packet not processed yet + * + * Assumptions: + * + ****************************************************************************/ + +void ENC_GetPkcnt(ENC_HandleTypeDef *handle); + + +/**************************************************************************** + * Function: up_udelay + * + * Description: + * wait us µs + * + * Parameters: + * us - The amount of time to wait in µs + * + * Returned Value: + * none + * + * Assumptions: + * + ****************************************************************************/ + +void up_udelay(uint32_t us); + +#endif /* ENC28J60_H_INCLUDED */ diff --git a/part15a-tcpip-webserver-gpio-interrupt/net/encspi.c b/part15a-tcpip-webserver-gpio-interrupt/net/encspi.c new file mode 100644 index 0000000..524f73f --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/net/encspi.c @@ -0,0 +1,21 @@ +#include "../include/spi.h" + +void ENC_SPI_Select(unsigned char truefalse) { + spi_chip_select(!truefalse); // If it's true, select 0 (the ENC), if false, select 1 (i.e. deselect the ENC) +} + +void ENC_SPI_SendBuf(unsigned char *master2slave, unsigned char *slave2master, unsigned short bufferSize) { + spi_chip_select(0); + spi_send_recv(master2slave, slave2master, bufferSize); + spi_chip_select(1); // De-select the ENC +} + +void ENC_SPI_Send(unsigned char command) { + spi_chip_select(0); + spi_send(&command, 1); + spi_chip_select(1); // De-select the ENC +} + +void ENC_SPI_SendWithoutSelection(unsigned char command) { + spi_send(&command, 1); +} diff --git a/part15a-tcpip-webserver-gpio-interrupt/tcpip/ip_arp_udp_tcp.c b/part15a-tcpip-webserver-gpio-interrupt/tcpip/ip_arp_udp_tcp.c new file mode 100644 index 0000000..b0af8be --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/tcpip/ip_arp_udp_tcp.c @@ -0,0 +1,1528 @@ +/********************************************* + * vim:sw=8:ts=8:si:et + * To use the above modeline in vim you must have "set modeline" in your .vimrc + * + * Author: Guido Socher + * Copyright:LGPL V2 + * See http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html + * + * IP, Arp, UDP and TCP functions. + * + * The TCP implementation uses some size optimisations which are valid + * only if all data can be sent in one single packet. This is however + * not a big limitation for a microcontroller as you will anyhow use + * small web-pages. The web server must send the entire web page in one + * packet. The client "web browser" as implemented here can also receive + * large pages. + * + *********************************************/ +#include "net.h" +#include "../net/enc28j60.h" +#include "../kernel/kernel.h" +#include "../include/fb.h" +#include "ip_config.h" + +// I use them to debug stuff: +#define LEDOFF PORTB|=(1<>4)*4) +const char arpreqhdr[] ={0,1,8,0,6,4,0,1}; +#ifdef NTP_client +const char ntpreqhdr[] ={0xe3,0,4,0xfa,0,1,0,0,0,1}; +#endif + +// The Ip checksum is calculated over the ip header only starting +// with the header length field and a total length of 20 bytes +// unitl ip.dst +// You must set the IP checksum field to zero before you start +// the calculation. +// len for ip is 20. +// +// For UDP/TCP we do not make up the required pseudo header. Instead we +// use the ip.src and ip.dst fields of the real packet: +// The udp checksum calculation starts with the ip.src field +// Ip.src=4bytes,Ip.dst=4 bytes,Udp header=8bytes + data length=16+len +// In other words the len here is 8 + length over which you actually +// want to calculate the checksum. +// You must set the checksum field to zero before you start +// the calculation. +// The same algorithm is also used for udp and tcp checksums. +// len for udp is: 8 + 8 + data length +// len for tcp is: 4+4 + 20 + option len + data length +// +// For more information on how this algorithm works see: +// http://www.netfor2.com/checksum.html +// http://www.msc.uky.edu/ken/cs471/notes/chap3.htm +// The RFC has also a C code example: http://www.faqs.org/rfcs/rfc1071.html +uint16_t checksum(uint8_t *buf, uint16_t len,uint8_t type){ + // type 0=ip , icmp + // 1=udp + // 2=tcp + uint32_t sum = 0; + + //if(type==0){ + // // do not add anything, standard IP checksum as described above + // // Usable for ICMP and IP header + //} + if(type==1){ + sum+=IP_PROTO_UDP_V; // protocol udp + // the length here is the length of udp (data+header len) + // =length given to this function - (IP.scr+IP.dst length) + sum+=len-8; // = real udp len + } + if(type==2){ + sum+=IP_PROTO_TCP_V; + // the length here is the length of tcp (data+header len) + // =length given to this function - (IP.scr+IP.dst length) + sum+=len-8; // = real tcp len + } + // build the sum of 16bit words + while(len >1){ + sum += 0xFFFF & (((uint32_t)*buf<<8)|*(buf+1)); + buf+=2; + len-=2; + } + // if there is a byte left then add it (padded with zero) + if (len){ + sum += ((uint32_t)(0xFF & *buf))<<8; + } + // now calculate the sum over the bytes in the sum + // until the result is only 16bit long + while (sum>>16){ + sum = (sum & 0xFFFF)+(sum >> 16); + } + // build 1's complement: + return( (uint16_t) sum ^ 0xFFFF); +} + +void init_mac(uint8_t *mymac){ + if (mymac){ + memcpy(macaddr,mymac,6); + } +} + +#if defined (ALL_clients) +void client_ifconfig(uint8_t *ip,uint8_t *netmask) +{ + uint8_t i; + if (ip){ + i=0;while(i<4){ipaddr[i]=ip[i];i++;} + } + if (netmask){ + i=0;while(i<4){ipnetmask[i]=netmask[i];i++;} + } +} + +// returns 1 if destip must be routed via the GW. Returns 0 if destip is on the local LAN +uint8_t route_via_gw(uint8_t *destip) +{ + uint8_t i=0; + while(i<4){ + if ((destip[i] & ipnetmask[i]) != (ipaddr[i] & ipnetmask[i])){ + return(1); + } + i++; + } + return(0); +} +#endif + + +uint8_t check_ip_message_is_from(uint8_t *buf,uint8_t *ip) +{ + uint8_t i=0; + while(i<4){ + if(buf[IP_SRC_P+i]!=ip[i]){ + return(0); + } + i++; + } + return(1); +} + +uint8_t eth_type_is_arp_and_my_ip(uint8_t *buf,uint16_t len){ + uint8_t i=0; + // + if (len<41){ + return(0); + } + if(buf[ETH_TYPE_H_P] != ETHTYPE_ARP_H_V || + buf[ETH_TYPE_L_P] != ETHTYPE_ARP_L_V){ + return(0); + } + while(i<4){ + if(buf[ETH_ARP_DST_IP_P+i] != ipaddr[i]){ + return(0); + } + i++; + } + return(1); +} + +uint8_t eth_type_is_ip_and_my_ip(uint8_t *buf,uint16_t len){ + uint8_t i=0; + //eth+ip+udp header is 42 + if (len<42){ + return(0); + } + if(buf[ETH_TYPE_H_P]!=ETHTYPE_IP_H_V || + buf[ETH_TYPE_L_P]!=ETHTYPE_IP_L_V){ + return(0); + } + if (buf[IP_HEADER_LEN_VER_P]!=0x45){ + // must be IP V4 and 20 byte header + return(0); + } + while(i<4){ + if(buf[IP_DST_P+i]!=ipaddr[i]){ + return(0); + } + i++; + } + return(1); +} + +// make a return eth header from a received eth packet +void make_eth(uint8_t *buf) +{ + uint8_t i=0; + // + //copy the destination mac from the source and fill my mac into src + while(i<6){ + buf[ETH_DST_MAC +i]=buf[ETH_SRC_MAC +i]; + buf[ETH_SRC_MAC +i]=macaddr[i]; + i++; + } +} +void fill_ip_hdr_checksum(uint8_t *buf) +{ + uint16_t ck; + // clear the 2 byte checksum + buf[IP_CHECKSUM_P]=0; + buf[IP_CHECKSUM_P+1]=0; + buf[IP_FLAGS_P]=0x40; // don't fragment + buf[IP_FLAGS_P+1]=0; // fragement offset + buf[IP_TTL_P]=64; // ttl + // calculate the checksum: + ck=checksum(&buf[IP_P], IP_HEADER_LEN,0); + buf[IP_CHECKSUM_P]=ck>>8; + buf[IP_CHECKSUM_P+1]=ck& 0xff; +} + +// make a return ip header from a received ip packet +void make_ip(uint8_t *buf) +{ + uint8_t i=0; + while(i<4){ + buf[IP_DST_P+i]=buf[IP_SRC_P+i]; + buf[IP_SRC_P+i]=ipaddr[i]; + i++; + } + fill_ip_hdr_checksum(buf); +} + +// swap seq and ack number and count ack number up +void step_seq(uint8_t *buf,uint16_t rel_ack_num,uint8_t cp_seq) +{ + uint8_t i; + uint8_t tseq; + i=4; + // sequence numbers: + // add the rel ack num to SEQACK + while(i>0){ + rel_ack_num=buf[TCP_SEQ_H_P+i-1]+rel_ack_num; + tseq=buf[TCP_SEQACK_H_P+i-1]; + buf[TCP_SEQACK_H_P+i-1]=0xff&rel_ack_num; + if (cp_seq){ + // copy the acknum sent to us into the sequence number + buf[TCP_SEQ_H_P+i-1]=tseq; + }else{ + buf[TCP_SEQ_H_P+i-1]= 0; // some preset value + } + rel_ack_num=rel_ack_num>>8; + i--; + } +} + +// make a return tcp header from a received tcp packet +// rel_ack_num is how much we must step the seq number received from the +// other side. We do not send more than 765 bytes of text (=data) in the tcp packet. +// No mss is included here. +// +// After calling this function you can fill in the first data byte at TCP_OPTIONS_P+4 +// If cp_seq=0 then an initial sequence number is used (should be use in synack) +// otherwise it is copied from the packet we received +void make_tcphead(uint8_t *buf,uint16_t rel_ack_num,uint8_t cp_seq) +{ + uint8_t i; + // copy ports: + i=buf[TCP_DST_PORT_H_P]; + buf[TCP_DST_PORT_H_P]=buf[TCP_SRC_PORT_H_P]; + buf[TCP_SRC_PORT_H_P]=i; + // + i=buf[TCP_DST_PORT_L_P]; + buf[TCP_DST_PORT_L_P]=buf[TCP_SRC_PORT_L_P]; + buf[TCP_SRC_PORT_L_P]=i; + step_seq(buf,rel_ack_num,cp_seq); + // zero the checksum + buf[TCP_CHECKSUM_H_P]=0; + buf[TCP_CHECKSUM_L_P]=0; + // no options: + // 20 bytes: + // The tcp header length is only a 4 bit field (the upper 4 bits). + // It is calculated in units of 4 bytes. + // E.g 20 bytes: 20/4=6 => 0x50=header len field + buf[TCP_HEADER_LEN_P]=0x50; +} + +void make_arp_answer_from_request(uint8_t *buf) +{ + uint8_t i=0; + // + make_eth(buf); + buf[ETH_ARP_OPCODE_H_P]=ETH_ARP_OPCODE_REPLY_H_V; + buf[ETH_ARP_OPCODE_L_P]=ETH_ARP_OPCODE_REPLY_L_V; + // fill the mac addresses: + while(i<6){ + buf[ETH_ARP_DST_MAC_P+i]=buf[ETH_ARP_SRC_MAC_P+i]; + buf[ETH_ARP_SRC_MAC_P+i]=macaddr[i]; + i++; + } + i=0; + while(i<4){ + buf[ETH_ARP_DST_IP_P+i]=buf[ETH_ARP_SRC_IP_P+i]; + buf[ETH_ARP_SRC_IP_P+i]=ipaddr[i]; + i++; + } + // eth+arp is 42 bytes: + enc28j60PacketSend(42,buf); +} + +void make_echo_reply_from_request(uint8_t *buf,uint16_t len) +{ + make_eth(buf); + make_ip(buf); + buf[ICMP_TYPE_P]=ICMP_TYPE_ECHOREPLY_V; + // we changed only the icmp.type field from request(=8) to reply(=0). + // we can therefore easily correct the checksum: + if (buf[ICMP_CHECKSUM_P] > (0xff-0x08)){ + buf[ICMP_CHECKSUM_P+1]++; + } + buf[ICMP_CHECKSUM_P]+=0x08; + // + enc28j60PacketSend(len,buf); +} + +// do some basic length calculations +uint16_t get_tcp_data_len(uint8_t *buf) +{ + int16_t i; + i=(((int16_t)buf[IP_TOTLEN_H_P])<<8)|(buf[IP_TOTLEN_L_P]&0xff); + i-=IP_HEADER_LEN; + i-=(buf[TCP_HEADER_LEN_P]>>4)*4; // generate len in bytes; + if (i<=0){ + i=0; + } + return((uint16_t)i); +} + + +// fill in tcp data at position pos. pos=0 means start of +// tcp data. Returns the position at which the string after +// this string could be filled. +uint16_t fill_tcp_data_p(uint8_t *buf,uint16_t pos, const uint8_t *progmem_s) +{ + char c; + // fill in tcp data at position pos + // + // with no options the data starts after the checksum + 2 more bytes (urgent ptr) + while ((c = *(progmem_s++))) { + buf[TCP_CHECKSUM_L_P+3+pos]=c; + pos++; + } + return(pos); +} + +// fill a binary string of len data into the tcp packet +uint16_t fill_tcp_data_len(uint8_t *buf,uint16_t pos, const uint8_t *s, uint8_t len) +{ + // fill in tcp data at position pos + // + // with no options the data starts after the checksum + 2 more bytes (urgent ptr) + while (len) { + buf[TCP_CHECKSUM_L_P+3+pos]=*s; + pos++; + s++; + len--; + } + return(pos); +} + +// fill in tcp data at position pos. pos=0 means start of +// tcp data. Returns the position at which the string after +// this string could be filled. +uint16_t fill_tcp_data(uint8_t *buf,uint16_t pos, const char *s) +{ + return(fill_tcp_data_len(buf,pos,(uint8_t*)s,strlen(s))); +} + +// Make just an ack packet with no tcp data inside +// This will modify the eth/ip/tcp header +void make_tcp_ack_from_any(uint8_t *buf,int16_t datlentoack,uint8_t addflags) +{ + uint16_t j; + make_eth(buf); + // fill the header: + buf[TCP_FLAGS_P]=TCP_FLAGS_ACK_V|addflags; + if (addflags==TCP_FLAGS_RST_V){ + make_tcphead(buf,datlentoack,1); + }else{ + if (datlentoack==0){ + // if there is no data then we must still acknoledge one packet + datlentoack=1; + } + // normal case, ack the data: + make_tcphead(buf,datlentoack,1); // no options + } + // total length field in the IP header must be set: + // 20 bytes IP + 20 bytes tcp (when no options) + j=IP_HEADER_LEN+TCP_HEADER_LEN_PLAIN; + buf[IP_TOTLEN_H_P]=j>>8; + buf[IP_TOTLEN_L_P]=j& 0xff; + make_ip(buf); + // use a low window size otherwise we have to have + // timers and can not just react on every packet. + buf[TCP_WIN_SIZE]=0x4; // 1024=0x400, 1280=0x500 2048=0x800 768=0x300 + buf[TCP_WIN_SIZE+1]=0; + // calculate the checksum, len=8 (start from ip.src) + TCP_HEADER_LEN_PLAIN + data len + j=checksum(&buf[IP_SRC_P], 8+TCP_HEADER_LEN_PLAIN,2); + buf[TCP_CHECKSUM_H_P]=j>>8; + buf[TCP_CHECKSUM_L_P]=j& 0xff; + enc28j60PacketSend(IP_HEADER_LEN+TCP_HEADER_LEN_PLAIN+ETH_HEADER_LEN,buf); +} + + +// dlen is the amount of tcp data (http data) we send in this packet +// You can use this function only immediately after make_tcp_ack_from_any +// This is because this function will NOT modify the eth/ip/tcp header except for +// length and checksum +// You must set TCP_FLAGS before calling this +void make_tcp_ack_with_data_noflags(uint8_t *buf,uint16_t dlen) +{ + uint16_t j; + // total length field in the IP header must be set: + // 20 bytes IP + 20 bytes tcp (when no options) + len of data + j=IP_HEADER_LEN+TCP_HEADER_LEN_PLAIN+dlen; + buf[IP_TOTLEN_H_P]=j>>8; + buf[IP_TOTLEN_L_P]=j& 0xff; + fill_ip_hdr_checksum(buf); + // zero the checksum + buf[TCP_CHECKSUM_H_P]=0; + buf[TCP_CHECKSUM_L_P]=0; + // calculate the checksum, len=8 (start from ip.src) + TCP_HEADER_LEN_PLAIN + data len + j=checksum(&buf[IP_SRC_P], 8+TCP_HEADER_LEN_PLAIN+dlen,2); + buf[TCP_CHECKSUM_H_P]=j>>8; + buf[TCP_CHECKSUM_L_P]=j& 0xff; + enc28j60PacketSend(IP_HEADER_LEN+TCP_HEADER_LEN_PLAIN+dlen+ETH_HEADER_LEN,buf); +} + +#if defined (UDP_server) +// a udp server +void make_udp_reply_from_request_udpdat_ready(uint8_t *buf,uint16_t datalen,uint16_t port) +{ + uint16_t j; + make_eth(buf); + if (datalen>220){ + datalen=220; + } + // total length field in the IP header must be set: + j=IP_HEADER_LEN+UDP_HEADER_LEN+datalen; + buf[IP_TOTLEN_H_P]=j>>8; + buf[IP_TOTLEN_L_P]=j& 0xff; + make_ip(buf); + // send to port: + //buf[UDP_DST_PORT_H_P]=port>>8; + //buf[UDP_DST_PORT_L_P]=port & 0xff; + // sent to port of sender and use "port" as own source: + buf[UDP_DST_PORT_H_P]=buf[UDP_SRC_PORT_H_P]; + buf[UDP_DST_PORT_L_P]= buf[UDP_SRC_PORT_L_P]; + buf[UDP_SRC_PORT_H_P]=port>>8; + buf[UDP_SRC_PORT_L_P]=port & 0xff; + // calculte the udp length: + j=UDP_HEADER_LEN+datalen; + buf[UDP_LEN_H_P]=j>>8; + buf[UDP_LEN_L_P]=j& 0xff; + // zero the checksum + buf[UDP_CHECKSUM_H_P]=0; + buf[UDP_CHECKSUM_L_P]=0; + j=checksum(&buf[IP_SRC_P], 16 + datalen,1); + buf[UDP_CHECKSUM_H_P]=j>>8; + buf[UDP_CHECKSUM_L_P]=j& 0xff; + enc28j60PacketSend(UDP_HEADER_LEN+IP_HEADER_LEN+ETH_HEADER_LEN+datalen,buf); +} + +// you can send a max of 220 bytes of data because we use only one +// byte for the data but udp messages are normally small. +void make_udp_reply_from_request(uint8_t *buf,char *data,uint8_t datalen,uint16_t port) +{ + uint8_t i=0; + // copy the data: + while(i>8)&0xff; + wwwport_l=(port&0xff); +} + +// this is for the server not the client: +void make_tcp_synack_from_syn(uint8_t *buf) +{ + uint16_t ck; + make_eth(buf); + // total length field in the IP header must be set: + // 20 bytes IP + 24 bytes (20tcp+4tcp options) + buf[IP_TOTLEN_H_P]=0; + buf[IP_TOTLEN_L_P]=IP_HEADER_LEN+TCP_HEADER_LEN_PLAIN+4; + make_ip(buf); + buf[TCP_FLAGS_P]=TCP_FLAGS_SYNACK_V; + make_tcphead(buf,1,0); + // put an inital seq number + buf[TCP_SEQ_H_P+0]= 0; + buf[TCP_SEQ_H_P+1]= 0; + // we step only the second byte, this allows us to send packts + // with 255 bytes, 512 or 765 (step by 3) without generating + // overlapping numbers. + buf[TCP_SEQ_H_P+2]= seqnum; + buf[TCP_SEQ_H_P+3]= 0; + // step the inititial seq num by something we will not use + // during this tcp session: + seqnum+=3; + // add an mss options field with MSS to 1280: + // 1280 in hex is 0x500 + buf[TCP_OPTIONS_P]=2; + buf[TCP_OPTIONS_P+1]=4; + buf[TCP_OPTIONS_P+2]=0x05; + buf[TCP_OPTIONS_P+3]=0x0; + // The tcp header length is only a 4 bit field (the upper 4 bits). + // It is calculated in units of 4 bytes. + // E.g 24 bytes: 24/4=6 => 0x60=header len field + buf[TCP_HEADER_LEN_P]=0x60; + // here we must just be sure that the web browser contacting us + // will send only one get packet + buf[TCP_WIN_SIZE]=0x0a; // was 1400=0x578, 2560=0xa00 suggested by Andras Tucsni to be able to receive bigger packets + buf[TCP_WIN_SIZE+1]=0; // + // calculate the checksum, len=8 (start from ip.src) + TCP_HEADER_LEN_PLAIN + 4 (one option: mss) + ck=checksum(&buf[IP_SRC_P], 8+TCP_HEADER_LEN_PLAIN+4,2); + buf[TCP_CHECKSUM_H_P]=ck>>8; + buf[TCP_CHECKSUM_L_P]=ck& 0xff; + // add 4 for option mss: + enc28j60PacketSend(IP_HEADER_LEN+TCP_HEADER_LEN_PLAIN+4+ETH_HEADER_LEN,buf); +} + +// you must have initialized info_data_len at some time before calling this function +// +// This info_data_len initialisation is done automatically if you call +// packetloop_icmp_tcp(buf,enc28j60PacketReceive(BUFFER_SIZE, buf)); +// and test the return value for non zero. +// +// dlen is the amount of tcp data (http data) we send in this packet +// You can use this function only immediately after make_tcp_ack_from_any +// This is because this function will NOT modify the eth/ip/tcp header except for +// length and checksum +void www_server_reply(uint8_t *buf,uint16_t dlen) +{ + make_tcp_ack_from_any(buf,info_data_len,0); // send ack for http get + // fill the header: + // This code requires that we send only one data packet + // because we keep no state information. We must therefore set + // the fin here: + buf[TCP_FLAGS_P]=TCP_FLAGS_ACK_V|TCP_FLAGS_PUSH_V|TCP_FLAGS_FIN_V; + make_tcp_ack_with_data_noflags(buf,dlen); // send data +} + +#endif // WWW_server + +#if defined (ALL_clients) || defined (GRATARP) || defined (WOL_client) +// fill buffer with a prog-mem string +void fill_buf_p(uint8_t *buf,uint16_t len, const char *progmem_str_p) +{ + while (len){ + *buf= pgm_read_byte(progmem_str_p); + buf++; + progmem_str_p++; + len--; + } +} +#endif + +#ifdef PING_client +// icmp echo, matchpat is a pattern that has to be sent back by the +// host answering the ping. +// The ping is sent to destip and mac dstmac +void client_icmp_request(uint8_t *buf,uint8_t *destip,uint8_t *dstmac) +{ + uint8_t i=0; + uint16_t ck; + // + while(i<6){ + buf[ETH_DST_MAC +i]=dstmac[i]; // gw mac in local lan or host mac + buf[ETH_SRC_MAC +i]=macaddr[i]; + i++; + } + buf[ETH_TYPE_H_P] = ETHTYPE_IP_H_V; + buf[ETH_TYPE_L_P] = ETHTYPE_IP_L_V; + fill_buf_p(&buf[IP_P],9,iphdr); + buf[IP_ID_L_P]=ipid; ipid++; + buf[IP_TOTLEN_L_P]=0x54; + buf[IP_PROTO_P]=IP_PROTO_ICMP_V; + i=0; + while(i<4){ + buf[IP_DST_P+i]=destip[i]; + buf[IP_SRC_P+i]=ipaddr[i]; + i++; + } + fill_ip_hdr_checksum(buf); + buf[ICMP_TYPE_P]=ICMP_TYPE_ECHOREQUEST_V; + buf[ICMP_TYPE_P+1]=0; // code + // zero the checksum + buf[ICMP_CHECKSUM_H_P]=0; + buf[ICMP_CHECKSUM_L_P]=0; + // a possibly unique id of this host: + buf[ICMP_IDENT_H_P]=5; // some number + buf[ICMP_IDENT_L_P]=ipaddr[3]; // last byte of my IP + // + buf[ICMP_IDENT_L_P+1]=0; // seq number, high byte + buf[ICMP_IDENT_L_P+2]=1; // seq number, low byte, we send only 1 ping at a time + // copy the data: + i=0; + while(i<56){ + buf[ICMP_DATA_P+i]=PINGPATTERN; + i++; + } + // + ck=checksum(&buf[ICMP_TYPE_P], 56+8,0); + buf[ICMP_CHECKSUM_H_P]=ck>>8; + buf[ICMP_CHECKSUM_L_P]=ck& 0xff; + enc28j60PacketSend(98,buf); +} +#endif // PING_client + + +#ifdef NTP_client +// ntp udp packet +// See http://tools.ietf.org/html/rfc958 for details +// +void client_ntp_request(uint8_t *buf,uint8_t *ntpip,uint8_t srcport,uint8_t *dstmac) +{ + uint8_t i=0; + uint16_t ck; + if (!enc28j60linkup())return; + // + while(i<6){ + buf[ETH_DST_MAC +i]=dstmac[i]; // gw mac in local lan or host mac + buf[ETH_SRC_MAC +i]=macaddr[i]; + i++; + } + buf[ETH_TYPE_H_P] = ETHTYPE_IP_H_V; + buf[ETH_TYPE_L_P] = ETHTYPE_IP_L_V; + fill_buf_p(&buf[IP_P],9,iphdr); + buf[IP_ID_L_P]=ipid; ipid++; + buf[IP_TOTLEN_L_P]=0x4c; + buf[IP_PROTO_P]=IP_PROTO_UDP_V; + i=0; + while(i<4){ + buf[IP_DST_P+i]=ntpip[i]; + buf[IP_SRC_P+i]=ipaddr[i]; + i++; + } + fill_ip_hdr_checksum(buf); + buf[UDP_DST_PORT_H_P]=0; + buf[UDP_DST_PORT_L_P]=0x7b; // ntp=123 + buf[UDP_SRC_PORT_H_P]=10; + buf[UDP_SRC_PORT_L_P]=srcport; // lower 8 bit of src port + buf[UDP_LEN_H_P]=0; + buf[UDP_LEN_L_P]=56; // fixed len + // zero the checksum + buf[UDP_CHECKSUM_H_P]=0; + buf[UDP_CHECKSUM_L_P]=0; + // copy the data: + i=0; + // most fields are zero, here we zero everything and fill later + while(i<48){ + buf[UDP_DATA_P+i]=0; + i++; + } + fill_buf_p(&buf[UDP_DATA_P],10,ntpreqhdr); + // + ck=checksum(&buf[IP_SRC_P], 16 + 48,1); + buf[UDP_CHECKSUM_H_P]=ck>>8; + buf[UDP_CHECKSUM_L_P]=ck& 0xff; + enc28j60PacketSend(90,buf); +} +// process the answer from the ntp server: +// if dstport==0 then accept any port otherwise only answers going to dstport +// return 1 on sucessful processing of answer +uint8_t client_ntp_process_answer(uint8_t *buf,uint32_t *time,uint8_t dstport_l){ + if (dstport_l){ + if (buf[UDP_DST_PORT_L_P]!=dstport_l){ + return(0); + } + } + if (buf[UDP_LEN_H_P]!=0 || buf[UDP_LEN_L_P]!=56 || buf[UDP_SRC_PORT_L_P]!=0x7b){ + // not ntp + return(0); + } + // copy time from the transmit time stamp field: + *time=((uint32_t)buf[0x52]<<24)|((uint32_t)buf[0x53]<<16)|((uint32_t)buf[0x54]<<8)|((uint32_t)buf[0x55]); + return(1); +} +#endif + +#ifdef UDP_client +// -------------------- send a spontanious UDP packet to a server +// There are two ways of using this: +// 1) you call send_udp_prepare, you fill the data yourself into buf starting at buf[UDP_DATA_P], +// you send the packet by calling send_udp_transmit +// +// 2) You just allocate a large enough buffer for you data and you call send_udp and nothing else +// needs to be done. +// +void send_udp_prepare(uint8_t *buf,uint16_t sport, const uint8_t *dip, uint16_t dport,const uint8_t *dstmac) +{ + uint8_t i=0; + // + while(i<6){ + buf[ETH_DST_MAC +i]=dstmac[i]; // gw mac in local lan or host mac + buf[ETH_SRC_MAC +i]=macaddr[i]; + i++; + } + buf[ETH_TYPE_H_P] = ETHTYPE_IP_H_V; + buf[ETH_TYPE_L_P] = ETHTYPE_IP_L_V; + fill_buf_p(&buf[IP_P],9,iphdr); + buf[IP_ID_L_P]=ipid; ipid++; + // total length field in the IP header must be set: + buf[IP_TOTLEN_H_P]=0; + // done in transmit: buf[IP_TOTLEN_L_P]=IP_HEADER_LEN+UDP_HEADER_LEN+datalen; + buf[IP_PROTO_P]=IP_PROTO_UDP_V; + i=0; + while(i<4){ + buf[IP_DST_P+i]=dip[i]; + buf[IP_SRC_P+i]=ipaddr[i]; + i++; + } + // done in transmit: fill_ip_hdr_checksum(buf); + buf[UDP_DST_PORT_H_P]=(dport>>8); + buf[UDP_DST_PORT_L_P]=0xff&dport; + buf[UDP_SRC_PORT_H_P]=(sport>>8); + buf[UDP_SRC_PORT_L_P]=sport&0xff; + buf[UDP_LEN_H_P]=0; + // done in transmit: buf[UDP_LEN_L_P]=UDP_HEADER_LEN+datalen; + // zero the checksum + buf[UDP_CHECKSUM_H_P]=0; + buf[UDP_CHECKSUM_L_P]=0; + // copy the data: + // now starting with the first byte at buf[UDP_DATA_P] + // +} + +void send_udp_transmit(uint8_t *buf,uint16_t datalen) +{ + uint16_t tmp16; + tmp16=IP_HEADER_LEN+UDP_HEADER_LEN+datalen; + buf[IP_TOTLEN_L_P]=tmp16& 0xff; + buf[IP_TOTLEN_H_P]=tmp16>>8; + fill_ip_hdr_checksum(buf); + tmp16=UDP_HEADER_LEN+datalen; + buf[UDP_LEN_L_P]=tmp16& 0xff; + buf[UDP_LEN_H_P]=tmp16>>8; + // + tmp16=checksum(&buf[IP_SRC_P], 16 + datalen,1); + buf[UDP_CHECKSUM_L_P]=tmp16& 0xff; + buf[UDP_CHECKSUM_H_P]=tmp16>>8; + enc28j60PacketSend(UDP_HEADER_LEN+IP_HEADER_LEN+ETH_HEADER_LEN+datalen,buf); +} + +void send_udp(uint8_t *buf,char *data,uint8_t datalen,uint16_t sport, const uint8_t *dip, uint16_t dport,const uint8_t *dstmac) +{ + send_udp_prepare(buf,sport, dip, dport,dstmac); + uint8_t i=0; + // limit the length: + if (datalen>220){ + datalen=220; + } + // copy the data: + i=0; + while(i>8; + buf[UDP_CHECKSUM_L_P]=ck& 0xff; + enc28j60PacketSend(pos,buf); +} +#endif // WOL_client + +#if defined GRATARP +// Send a Gratuitous arp, this is to refresh the arp +// cash of routers and switches. It can improve the response +// time in wifi networks as some wifi equipment expects the initial +// communication to not start from the network side. That is wrong +// but some consumer devices are made like this. +// +// A Gratuitous ARP can be a request or a reply. +// A request frame is as well called Unsolicited ARP +uint8_t gratutious_arp(uint8_t *buf) +{ + uint8_t i=0; + if (!enc28j60linkup()){ + return(0); + } + // + while(i<6){ + buf[ETH_DST_MAC +i]=0xff; + buf[ETH_SRC_MAC +i]=macaddr[i]; + i++; + } + buf[ETH_TYPE_H_P] = ETHTYPE_ARP_H_V; + buf[ETH_TYPE_L_P] = ETHTYPE_ARP_L_V; + // arp request and reply are the same execept for + // the opcode: + fill_buf_p(&buf[ETH_ARP_P],8,arpreqhdr); + //buf[ETH_ARP_OPCODE_L_P]=ETH_ARP_OPCODE_REPLY_L_V; // reply + i=0; + while(i<6){ + buf[ETH_ARP_SRC_MAC_P +i]=macaddr[i]; + buf[ETH_ARP_DST_MAC_P+i]=0xff; + i++; + } + i=0; + while(i<4){ + buf[ETH_ARP_DST_IP_P+i]=ipaddr[i]; + buf[ETH_ARP_SRC_IP_P+i]=ipaddr[i]; + i++; + } + // 0x2a=42=len of packet + enc28j60PacketSend(0x2a,buf); + return(1); +} +#endif // GRATARP + +#if ARP_MAC_resolver_client +// make a arp request +// Note: you must have initialized the stack with +// init_udp_or_www_server or client_ifconfig +// before you can use this function +void client_arp_whohas(uint8_t *buf,uint8_t *ip_we_search) +{ + uint8_t i=0; + if (ipaddr[0]==0) return; // error ipaddr not set + // + while(i<6){ + buf[ETH_DST_MAC +i]=0xff; + buf[ETH_SRC_MAC +i]=macaddr[i]; + i++; + } + buf[ETH_TYPE_H_P] = ETHTYPE_ARP_H_V; + buf[ETH_TYPE_L_P] = ETHTYPE_ARP_L_V; + fill_buf_p(&buf[ETH_ARP_P],8,arpreqhdr); + i=0; + while(i<6){ + buf[ETH_ARP_SRC_MAC_P +i]=macaddr[i]; + buf[ETH_ARP_DST_MAC_P+i]=0; + i++; + } + i=0; + while(i<4){ + buf[ETH_ARP_DST_IP_P+i]=*(ip_we_search +i); + buf[ETH_ARP_SRC_IP_P+i]=ipaddr[i]; + i++; + } + // 0x2a=42=len of packet + enc28j60PacketSend(0x2a,buf); +} + +// return zero when current transaction is finished +uint8_t get_mac_with_arp_wait(void) +{ + if (arpip_state == WGW_HAVE_MAC){ + return(0); + } + return(1); +} + +// reference_number is something that is just returned in the callback +// to make matching and waiting for a given ip/mac address pair easier +// Note: you must have initialized the stack with +// init_udp_or_www_server or client_ifconfig +// before you can use this function +void get_mac_with_arp(uint8_t *ip, uint8_t reference_number,void (*arp_result_callback)(uint8_t *ip,uint8_t reference_number,uint8_t *mac)) +{ + uint8_t i=0; + client_arp_result_callback=arp_result_callback; + arpip_state=WGW_INITIAL_ARP; // causes an arp request in the packet loop + arp_reference_number=reference_number; + while(i<4){ + arpip[i]=ip[i]; + i++; + } +} +#endif + +#if defined (TCP_client) +// Make a tcp syn packet +void tcp_client_syn(uint8_t *buf,uint8_t srcport,uint16_t dstport) +{ + uint16_t ck; + uint8_t i=0; + // -- make the main part of the eth/IP/tcp header: + while(i<6){ + buf[ETH_DST_MAC +i]=tcp_dst_mac[i]; // gw mac in local lan or host mac + buf[ETH_SRC_MAC +i]=macaddr[i]; + i++; + } + buf[ETH_TYPE_H_P] = ETHTYPE_IP_H_V; + buf[ETH_TYPE_L_P] = ETHTYPE_IP_L_V; + fill_buf_p(&buf[IP_P],9,iphdr); + buf[IP_TOTLEN_L_P]=44; // good for syn + buf[IP_ID_L_P]=ipid; ipid++; + buf[IP_PROTO_P]=IP_PROTO_TCP_V; + i=0; + while(i<4){ + buf[IP_DST_P+i]=tcp_otherside_ip[i]; + buf[IP_SRC_P+i]=ipaddr[i]; + i++; + } + fill_ip_hdr_checksum(buf); + buf[TCP_DST_PORT_H_P]=(dstport>>8)&0xff; + buf[TCP_DST_PORT_L_P]=(dstport&0xff); + buf[TCP_SRC_PORT_H_P]=TCPCLIENT_SRC_PORT_H; + buf[TCP_SRC_PORT_L_P]=srcport; // lower 8 bit of src port + i=0; + // zero out sequence number and acknowledgement number + while(i<8){ + buf[TCP_SEQ_H_P+i]=0; + i++; + } + // -- header ready + // put inital seq number + // we step only the second byte, this allows us to send packts + // with 255 bytes 512 (if we step the initial seqnum by 2) + // or 765 (step by 3) + buf[TCP_SEQ_H_P+2]= seqnum; + // step the inititial seq num by something we will not use + // during this tcp session: + seqnum+=3; + buf[TCP_HEADER_LEN_P]=0x60; // 0x60=24 len: (0x60>>4) * 4 + buf[TCP_FLAGS_P]=TCP_FLAGS_SYN_V; + // use a low window size otherwise we have to have + // timers and can not just react on every packet. + buf[TCP_WIN_SIZE]=0x3; // 1024=0x400 768=0x300, initial window + buf[TCP_WIN_SIZE+1]=0x0; + // zero the checksum + buf[TCP_CHECKSUM_H_P]=0; + buf[TCP_CHECKSUM_L_P]=0; + // urgent pointer + buf[TCP_CHECKSUM_L_P+1]=0; + buf[TCP_CHECKSUM_L_P+2]=0; + // MSS= max IP len that we want to have: + buf[TCP_OPTIONS_P]=2; + buf[TCP_OPTIONS_P+1]=4; + buf[TCP_OPTIONS_P+2]=(CLIENTMSS>>8); + buf[TCP_OPTIONS_P+3]=CLIENTMSS & 0xff; + ck=checksum(&buf[IP_SRC_P], 8 +TCP_HEADER_LEN_PLAIN+4,2); + buf[TCP_CHECKSUM_H_P]=ck>>8; + buf[TCP_CHECKSUM_L_P]=ck& 0xff; + // 4 is the tcp mss option: + enc28j60PacketSend(IP_HEADER_LEN+TCP_HEADER_LEN_PLAIN+ETH_HEADER_LEN+4,buf); +} +#endif // TCP_client + +#if defined (TCP_client) +// This is how to use the tcp client: +// +// Declare a callback function to get the result (tcp data from the server): +// +// uint8_t your_client_tcp_result_callback(uint8_t fd, uint8_t statuscode,uint16_t data_start_pos_in_buf, uint16_t len_of_data){...your code;return(close_tcp_session);} +// +// statuscode=0 means the buffer has valid data, otherwise len and pos_in_buf +// are invalid. That is: do to use data_start_pos_in_buf and len_of_data +// if statuscode!=0. +// +// This callback gives you access to the TCP data of the first +// packet returned from the server. You should aim to minimize the server +// output such that this will be the only packet. +// +// close_tcp_session=1 means close the session now. close_tcp_session=0 +// read all data and leave it to the other side to close it. +// If you connect to a web server then you want close_tcp_session=0. +// If you connect to a modbus/tcp equipment then you want close_tcp_session=1 +// +// Declare a callback function to be called in order to fill in the +// +// request (tcp data sent to the server): +// uint16_t your_client_tcp_datafill_callback(uint8_t fd){...your code;return(len_of_data_filled_in);} +// +// Now call: +// fd=client_tcp_req(&your_client_tcp_result_callback,&your_client_tcp_datafill_callback,portnumber); +// +// fd is a file descriptor like number that you get back in the fill and result +// function so you know to which call of client_tcp_req this callback belongs. +// +// You can not start different clients (e.g modbus and web) at the +// same time but you can start them one after each other. That is +// when the request has timed out or when the result_callback was +// executed then you can start a new one. The fd makes it still possible to +// distinguish in the callback code the different types you started. +// +// Note that you might never get called back if the other side does +// not answer. A timer would be needed to recongnize such a condition. +// +// We use callback functions because that saves memory and a uC is very +// limited in memory +// +uint8_t client_tcp_req(uint8_t (*result_callback)(uint8_t fd,uint8_t statuscode,uint16_t data_start_pos_in_buf, uint16_t len_of_data),uint16_t (*datafill_callback)(uint8_t fd),uint16_t port,uint8_t *dstip,uint8_t *dstmac) +{ + uint8_t i=0; + client_tcp_result_callback=result_callback; + client_tcp_datafill_callback=datafill_callback; + while(i<4){tcp_otherside_ip[i]=dstip[i];i++;} + i=0; + while(i<6){tcp_dst_mac[i]=dstmac[i];i++;} + tcp_client_port=port; + tcp_client_state=1; // send a syn + tcp_fd++; + if (tcp_fd>7){ + tcp_fd=0; + } + return(tcp_fd); +} +#endif // TCP_client + +#if defined (WWW_client) +uint16_t www_client_internal_datafill_callback(uint8_t fd){ + char strbuf[5]; + uint16_t len=0; + if (fd==www_fd){ + if (browsertype==0){ + // GET + len=fill_tcp_data_p(bufptr,0,PSTR("GET ")); + len=fill_tcp_data_p(bufptr,len,client_urlbuf_p); + len=fill_tcp_data(bufptr,len,client_urlbuf_var); + // I would prefer http/1.0 but there is a funny + // bug in some apache webservers which causes + // them to send two packets (fragmented PDU) + // if we don't use HTTP/1.1 + Connection: close + len=fill_tcp_data_p(bufptr,len,PSTR(" HTTP/1.1\r\nHost: ")); + len=fill_tcp_data_p(bufptr,len,client_hoststr); + len=fill_tcp_data_p(bufptr,len,PSTR("\r\nUser-Agent: tgr/1.1\r\nAccept: text/html\r\n\r\n")); + }else{ + // POST + len=fill_tcp_data_p(bufptr,0,PSTR("POST ")); + len=fill_tcp_data_p(bufptr,len,client_urlbuf_p); + len=fill_tcp_data(bufptr,len,client_urlbuf_var); + len=fill_tcp_data_p(bufptr,len,PSTR(" HTTP/1.1\r\nHost: ")); + len=fill_tcp_data_p(bufptr,len,client_hoststr); + if (client_additionalheaderline_p){ + len=fill_tcp_data_p(bufptr,len,PSTR("\r\n")); + len=fill_tcp_data_p(bufptr,len,client_additionalheaderline_p); + } + len=fill_tcp_data_p(bufptr,len,PSTR("\r\nUser-Agent: tgr/1.1\r\nAccept: */*\r\n")); + len=fill_tcp_data_p(bufptr,len,PSTR("Content-Length: ")); + itoa(strlen(client_postval),strbuf,10); + len=fill_tcp_data(bufptr,len,strbuf); + len=fill_tcp_data_p(bufptr,len,PSTR("\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n")); + len=fill_tcp_data(bufptr,len,client_postval); + } + return(len); + } + return(0); +} + +uint8_t www_client_internal_result_callback(uint8_t fd, uint8_t statuscode, uint16_t datapos, uint16_t len_of_data){ + uint16_t web_statuscode=0; // tcp status is OK but we need to check http layer too + uint8_t i=0; + if (fd!=www_fd){ + (*client_browser_callback)(500,0,0); + return(0); + } + if (statuscode==0 && len_of_data>12){ + // we might have a http status code + // http status codes are 3digit numbers as ascii text. See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html + // The buffer would look like this: HTTP/1.1 200 OK\r\n + // web_statuscode=0 means we got a corrupted answer + if (client_browser_callback){ + if (isblank(bufptr[datapos+8]) && isdigit(bufptr[datapos+9])&& isdigit(bufptr[datapos+11])){ // e.g 200 OK, a status code has 3 digits from datapos+9 to datapos+11, copy over the web/http status code to web_statuscode: + while(i<2){ + web_statuscode+=bufptr[datapos+9+i]-'0'; + web_statuscode*=10; + i++; + } + web_statuscode+=bufptr[datapos+11]-'0'; + } + //(*client_browser_callback)(web_statuscode,((uint16_t)TCP_SRC_PORT_H_P+(bufptr[TCP_HEADER_LEN_P]>>4)*4),len_of_data); + (*client_browser_callback)(web_statuscode,datapos,len_of_data); + } + } + return(0); +} + +// call this function externally like this: +// +// Declare a callback function: void browserresult(uint8_t webstatuscode,uint16_t datapos,uint16_t len){...your code} +// The variable datapos is the index in the packet buffer. +// Now call client_browser_url: +// client_browser_url(PSTR("/cgi-bin/checkip"),NULL,"tuxgraphics.org",&browserresult,other_side_ip,gwmac); +// urlbuf_varpart is a pointer to a string buffer that contains the second +// non constant part of the url. You must keep this buffer allocated until the +// callback function is executed or until you can be sure that the server side +// has timed out. +// hoststr is the name of the host. This is needed because many sites host several +// sites on the same physical machine with only one IP address. The web server needs +// to know to which site you want to go. +// webstatuscode is zero if there was no proper reply from the server (garbage message total communication failure, this is rare). +// webstatuscode is the http status code (e.g webstatuscode=200 for 200 OK); +// webstatuscode is zero if there was a garbage answer received from the server. +// For possible status codes look at http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html +// Basically 2xx is success and any 5xx, 4xx is a failure. +// The string buffers to which urlbuf_varpart and hoststr are pointing +// must not be changed until the callback is executed. +// +void client_browse_url(const char *urlbuf_p,char *urlbuf_varpart,const char *hoststr,void (*callback)(uint16_t,uint16_t,uint16_t),uint8_t *dstip,uint8_t *dstmac) +{ + if (!enc28j60linkup())return; + client_urlbuf_p=urlbuf_p; + client_urlbuf_var=urlbuf_varpart; + client_hoststr=hoststr; + browsertype=0; + client_browser_callback=callback; + www_fd=client_tcp_req(&www_client_internal_result_callback,&www_client_internal_datafill_callback,80,dstip,dstmac); +} + +// client web browser using http POST operation: +// additionalheaderline_p must be set to NULL if not used. +// The string buffers to which urlbuf_varpart and hoststr are pointing +// must not be changed until the callback is executed. +// postval is a string buffer which can only be de-allocated by the caller +// when the post operation was really done (e.g when callback was executed). +// postval must be urlencoded. +void client_http_post(const char *urlbuf_p, char *urlbuf_varpart,const char *hoststr, const char *additionalheaderline_p,char *postval,void (*callback)(uint16_t,uint16_t,uint16_t),uint8_t *dstip,uint8_t *dstmac) +{ + if (!enc28j60linkup())return; + client_urlbuf_p=urlbuf_p; + client_hoststr=hoststr; + client_urlbuf_var=urlbuf_varpart; + client_additionalheaderline_p=additionalheaderline_p; + client_postval=postval; + browsertype=1; + client_browser_callback=callback; + www_fd=client_tcp_req(&www_client_internal_result_callback,&www_client_internal_datafill_callback,80,dstip,dstmac); +} +#endif // WWW_client + +void register_ping_rec_callback(void (*callback)(uint8_t *srcip)) +{ + icmp_callback=callback; +} + +#ifdef PING_client +// loop over this to check if we get a ping reply: +uint8_t packetloop_icmp_checkreply(uint8_t *buf,uint8_t *ip_monitoredhost) +{ + if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREPLY_V){ + if (buf[ICMP_DATA_P]== PINGPATTERN){ + if (check_ip_message_is_from(buf,ip_monitoredhost)){ + return(1); + // ping reply is from monitored host and ping was from us + } + } + } + return(0); +} +#endif // PING_client + + +// return 0 to just continue in the packet loop and return the position +// of the tcp data if there is tcp data part +uint16_t packetloop_arp_icmp_tcp(uint8_t *buf,uint16_t plen) +{ + uint16_t len; +#if defined (TCP_client) + uint8_t send_fin=0; + uint16_t tcpstart; + uint16_t save_len; +#endif +#ifdef ARP_MAC_resolver_client + //plen will be unequal to zero if there is a valid + // packet (without crc error): + if(plen==0){ + if (arpip_state == (WGW_ACCEPT_ARP_REPLY|WGW_INITIAL_ARP) && arp_delaycnt==0 ){ + // arp_delaycnt has wrapped no arp reply yet + if (enc28j60linkup()) client_arp_whohas(buf,arpip); + } + if (arpip_state == WGW_INITIAL_ARP && enc28j60linkup()){ + client_arp_whohas(buf,arpip); + arpip_state|=WGW_ACCEPT_ARP_REPLY; // WGW_INITIAL_ARP and WGW_ACCEPT_ARP_REPLY set + arp_delaycnt=0; // this is like a timer, not so precise but good enough, it wraps in about 2 sec + } + arp_delaycnt++; +#if defined (TCP_client) + if (tcp_client_state==1 && enc28j60linkup()){ // send a syn + tcp_client_state=2; + tcpclient_src_port_l++; // allocate a new port + // we encode our 3 bit fd into the src port this + // way we get it back in every message that comes + // from the server: + tcp_client_syn(buf,((tcp_fd<<5) | (0x1f & tcpclient_src_port_l)),tcp_client_port); + } +#endif + return(0); + } +#endif // ARP_MAC_resolver_client + // arp is broadcast if unknown but a host may also + // verify the mac address by sending it to + // a unicast address. + if(eth_type_is_arp_and_my_ip(buf,plen)){ + if (buf[ETH_ARP_OPCODE_L_P]==ETH_ARP_OPCODE_REQ_L_V){ + // is it an arp request + make_arp_answer_from_request(buf); + } +#ifdef ARP_MAC_resolver_client + if ((arpip_state & WGW_ACCEPT_ARP_REPLY) && (buf[ETH_ARP_OPCODE_L_P]==ETH_ARP_OPCODE_REPLY_L_V)){ + // is it an arp reply + if (memcmp(&buf[ETH_ARP_SRC_IP_P],arpip,4)!=0) return(0); // not an arp reply for the IP we were searching + (*client_arp_result_callback)(arpip,arp_reference_number,buf+ETH_ARP_SRC_MAC_P); + arpip_state=WGW_HAVE_MAC; + } +#endif // ARP_MAC_resolver_client + return(0); + + } + // check if ip packets are for us: + if(eth_type_is_ip_and_my_ip(buf,plen)==0){ + return(0); + } + if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V){ + if (icmp_callback){ + (*icmp_callback)(&(buf[IP_SRC_P])); + } + // a ping packet, let's send pong + debugstr("Replying to ping..."); debugcrlf(); + make_echo_reply_from_request(buf,plen); + return(0); + } + // this is an important check to avoid working on the wrong packets: + if (plen<54 || buf[IP_PROTO_P]!=IP_PROTO_TCP_V ){ + // smaller than the smallest TCP packet (TCP packet with no options section) or not tcp port + return(0); + } +#if defined (TCP_client) + // a message for the tcp client, tcp_client_state is zero if client was never used + if ( buf[TCP_DST_PORT_H_P]==TCPCLIENT_SRC_PORT_H){ +#if defined (WWW_client) + // workaround to pass pointer to www_client_internal.. + bufptr=buf; +#endif // WWW_client + if (check_ip_message_is_from(buf,tcp_otherside_ip)==0){ + return(0); + } + // if we get a reset: + if (buf[TCP_FLAGS_P] & TCP_FLAGS_RST_V){ + if (client_tcp_result_callback){ + // parameters in client_tcp_result_callback: fd, status, buf_start, len + (*client_tcp_result_callback)((buf[TCP_DST_PORT_L_P]>>5)&0x7,3,0,0); + } + tcp_client_state=6; + return(0); + } + len=get_tcp_data_len(buf); + if (tcp_client_state==2){ + if ((buf[TCP_FLAGS_P] & TCP_FLAGS_SYN_V) && (buf[TCP_FLAGS_P] &TCP_FLAGS_ACK_V)){ + // synack, answer with ack + make_tcp_ack_from_any(buf,0,0); + buf[TCP_FLAGS_P]=TCP_FLAGS_ACK_V|TCP_FLAGS_PUSH_V; + + // Make a tcp message with data. When calling this function we must + // still have a valid tcp-ack in the buffer. In other words + // you have just called make_tcp_ack_from_any(buf,0). + if (client_tcp_datafill_callback){ + // in this case it is src port because the above + // make_tcp_ack_from_any swaps the dst and src port: + len=(*client_tcp_datafill_callback)((buf[TCP_SRC_PORT_L_P]>>5)&0x7); + }else{ + // this is just to prevent a crash + len=0; + } + tcp_client_state=3; + make_tcp_ack_with_data_noflags(buf,len); + return(0); + }else{ + // reset only if we have sent a syn and don't get syn-ack back. + // If we connect to a non listen port then we get a RST + // which will be handeled above. In other words there is + // normally no danger for an endless loop. + tcp_client_state=1; // retry + // do not inform application layer as we retry. + len++; + if (buf[TCP_FLAGS_P] & TCP_FLAGS_ACK_V){ + // if packet was an ack then do not step the ack number + len=0; + } + // refuse and reset the connection + make_tcp_ack_from_any(buf,len,TCP_FLAGS_RST_V); + return(0); + } + } + // in tcp_client_state==3 we will normally first get an empty + // ack-packet and then a ack-packet with data. + if (tcp_client_state==3 && len>0){ + // our first real data packet + tcp_client_state=4; + // return the data we received + if (client_tcp_result_callback){ + tcpstart=TCP_DATA_START; // TCP_DATA_START is a formula + // out of buffer bounds check, needed in case of fragmented IP packets + if (tcpstart>plen-8){ + tcpstart=plen-8; // dummy but save + } + save_len=len; + if (tcpstart+len>plen){ + save_len=plen-tcpstart; + } + send_fin=(*client_tcp_result_callback)((buf[TCP_DST_PORT_L_P]>>5)&0x7,0,tcpstart,save_len); + } + if (send_fin){ + make_tcp_ack_from_any(buf,len,TCP_FLAGS_PUSH_V|TCP_FLAGS_FIN_V); + tcp_client_state=5; + return(0); + } + } + if(tcp_client_state==5){ + // we get one more final ack to our fin-ack: + if (buf[TCP_FLAGS_P] & TCP_FLAGS_ACK_V){ + tcp_client_state=6; // in state 6 communication should be finished + } + return(0); + } + if(tcp_client_state==6){ + // something wrong, can't deal with this, reset the connection + len++; + if (buf[TCP_FLAGS_P] & TCP_FLAGS_ACK_V) len=0; // if packet was an ack then do not step the ack number + make_tcp_ack_from_any(buf,len,TCP_FLAGS_RST_V); + // just a single reset, do not repeat if more messages: + tcp_client_state=7; + return(0); + } + if (buf[TCP_FLAGS_P] & TCP_FLAGS_FIN_V){ + // this normally a fin ack message but it could be + // any message with fin we answer with fin-ack: + make_tcp_ack_from_any(buf,len+1,TCP_FLAGS_FIN_V); + tcp_client_state=5; // connection terminated + return(0); + } + // ack all data (the web page may be long): + // if we just get a fragment then len will be zero + // and we ack only once we have the full packet + if (len>0){ + make_tcp_ack_from_any(buf,len,0); + } + return(0); + } +#endif // TCP_client + // +#ifdef WWW_server + // tcp port web server start + if (buf[TCP_DST_PORT_H_P]==wwwport_h && buf[TCP_DST_PORT_L_P]==wwwport_l){ + if (buf[TCP_FLAGS_P] & TCP_FLAGS_SYN_V){ + make_tcp_synack_from_syn(buf); + // make_tcp_synack_from_syn does already send the syn,ack + return(0); + } + if (buf[TCP_FLAGS_P] & TCP_FLAGS_ACK_V){ + info_data_len=get_tcp_data_len(buf); + // we can possibly have no data, just ack: + // Here we misuse plen for something else to save a variable. + // plen is now the position of start of the tcp user data. + if (info_data_len==0){ + if (buf[TCP_FLAGS_P] & TCP_FLAGS_FIN_V){ + // finack, answer with ack + make_tcp_ack_from_any(buf,0,0); + } + // just an ack with no data, wait for next packet + return(0); + } + // Here we misuse len for something else to save a variable + len=TCP_DATA_START; // TCP_DATA_START is a formula + // check for data corruption + if (len>plen-8){ + return(0); + } + return(len); + } + } +#endif // WWW_server + return(0); +} +/* end of ip_arp_udp.c */ diff --git a/part15a-tcpip-webserver-gpio-interrupt/tcpip/ip_arp_udp_tcp.h b/part15a-tcpip-webserver-gpio-interrupt/tcpip/ip_arp_udp_tcp.h new file mode 100644 index 0000000..e4b2e57 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/tcpip/ip_arp_udp_tcp.h @@ -0,0 +1,207 @@ +/********************************************* + * vim:sw=8:ts=8:si:et + * To use the above modeline in vim you must have "set modeline" in your .vimrc + * Author: Guido Socher + * Copyright:LGPL V2 + * See http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html + * + * IP/ARP/UDP/TCP functions + * + *********************************************/ +//@{ +#ifndef IP_ARP_UDP_TCP_H +#define IP_ARP_UDP_TCP_H 1 + +#include "ip_config.h" + +// set my own mac address: +extern void init_mac(uint8_t *mymac); // not needed if you call init_udp_or_www_server +// -- web server functions -- +#if defined (WWW_server) || defined (UDP_server) +// you must call this function once before you use any of the other server functions: +// mymac may be set to NULL in this function if init_mac was used before +// init_ip_arp_udp_tcp is now replaced by init_udp_or_www_server and the www_server_port function. +extern void init_udp_or_www_server(uint8_t *mymac,uint8_t *myip); +#endif + +#if defined (WWW_server) +extern void www_server_port(uint16_t port); // not needed if you want port 80 +// send data from the web server to the client: +extern void www_server_reply(uint8_t *buf,uint16_t dlen); +#endif + +// for a UDP server: +#if defined (UDP_server) +extern uint8_t eth_type_is_ip_and_my_ip(uint8_t *buf,uint16_t len); +extern void make_udp_reply_from_request_udpdat_ready(uint8_t *buf,uint16_t datalen,uint16_t port); +extern void make_udp_reply_from_request(uint8_t *buf,char *data,uint8_t datalen,uint16_t port); +#endif +// return 0 to just continue in the packet loop and return the position +// of the tcp data if there is tcp data part: +extern uint16_t packetloop_arp_icmp_tcp(uint8_t *buf,uint16_t plen); +// functions to fill the web pages with data: +extern uint16_t fill_tcp_data_p(uint8_t *buf,uint16_t pos, const uint8_t *progmem_s); +extern uint16_t fill_tcp_data_string(uint8_t *buf,uint16_t pos, char *reply); + +extern uint16_t fill_tcp_data(uint8_t *buf,uint16_t pos, const char *s); +// fill a binary string of len data into the tcp packet: +extern uint16_t fill_tcp_data_len(uint8_t *buf,uint16_t pos, const uint8_t *s, uint8_t len); + +// -- client only functions -- +#if defined (WWW_client) || defined (NTP_client) || defined (UDP_client) || defined (TCP_client) || defined (PING_client) +extern void client_ifconfig(uint8_t *ip,uint8_t *netmask); +// route_via_gw can be used decide if a packed needs to be routed via GW or can be found on the LAN: +extern uint8_t route_via_gw(uint8_t *destip); // returns 1 if destip must be routed via the GW. Returns 0 if destip is on the local LAN +// +// The get_mac_with_arp function can be used to find the MAC address of +// a host that is directly connected to the same LAN. It translates the IP address into +// a MAC address. +// You need to provide a callback function. That function will be executed once the +// MAC address is found. We do this to not block execution in the main loop. +// NOTE: you can only do one MAC address resolution at a time. The reference_number is just +// a number given back to you to make it easier to know what this relates to. +// +// You declare the callback function: +// +//#define TRANS_NUM_GWMAC 12 +//void arpresolver_result_callback(uint8_t *ip __attribute__((unused)),uint8_t reference_number,uint8_t *mac){ // the __attribute__((unused)) is a gcc compiler directive to avoid warnings about unsed variables. +// uint8_t i=0; +// if (reference_number==TRANS_NUM_GWMAC){ +// // copy mac address over: +// while(i<6){gwmac[i]=mac[i];i++;} +// } +//} +// +// and then you can just call get_mac_with_arp like this: +// get_mac_with_arp(gwip,TRANS_NUM_GWMAC,&arpresolver_result_callback); +// Note: you must have initialized the stack with init_udp_or_www_server or client_ifconfig +// before you can use get_mac_with_arp(). The arp request will automatically be repeated if +// there is no answer. +extern void get_mac_with_arp(uint8_t *ip, uint8_t reference_number,void (*arp_result_callback)(uint8_t *ip,uint8_t reference_number,uint8_t *mac)); +uint8_t get_mac_with_arp_wait(void); // checks current ongoing transaction, retuns 0 when the transaction is over +#endif + +#ifdef TCP_client +// To use the tcp client you need to: +// +// Declare a callback function to get the result (tcp data from the server): +// +// uint8_t your_client_tcp_result_callback(uint8_t fd, uint8_t statuscode,uint16_t data_start_pos_in_buf, uint16_t len_of_data){ +// ...your code; +// return(close_tcp_session); +// } +// +// statuscode=0 means the buffer has valid data, otherwise len and pos_in_buf +// are invalid. That is: do to use data_start_pos_in_buf and len_of_data +// if statuscode!=0. +// +// This callback gives you access to the TCP data of the first +// packet returned from the server. You should aim to minimize the server +// output such that this will be the only packet. +// +// close_tcp_session=1 means close the session now. close_tcp_session=0 +// read all data and leave it to the other side to close it. +// If you connect to a web server then you want close_tcp_session=0. +// If you connect to a modbus/tcp equipment then you want close_tcp_session=1 +// +// Declare a callback function to be called in order to fill in the +// +// request (tcp data sent to the server): +// uint16_t your_client_tcp_datafill_callback(uint8_t fd){...your code;return(len_of_data_filled_in);} +// +// Now call: +// fd=client_tcp_req(&your_client_tcp_result_callback,&your_client_tcp_datafill_callback,portnumber); +// +// fd is a file descriptor like number that you get back in the fill and result +// function so you know to which call of client_tcp_req this callback belongs. +// +// You can not start different clients (e.g modbus and web) at the +// same time but you can start them one after each other. That is +// when the request has timed out or when the result_callback was +// executed then you can start a new one. The fd makes it still possible to +// distinguish in the callback code the different types you started. +// +// Note that you might never get called back if the other side does +// not answer. A timer would be needed to recongnize such a condition. +// +// We use callback functions because that is the best implementation +// given the fact that we have very little RAM memory. +// +extern uint8_t client_tcp_req(uint8_t (*result_callback)(uint8_t fd,uint8_t statuscode,uint16_t data_start_pos_in_buf, uint16_t len_of_data),uint16_t (*datafill_callback)(uint8_t fd),uint16_t port,uint8_t *dstip,uint8_t *dstmac); +#endif + +#ifdef WWW_client +// ----- http get +// The string buffers to which urlbuf_varpart and hoststr are pointing +// must not be changed until the callback is executed. +extern void client_browse_url(const prog_char *urlbuf, char *urlbuf_varpart, const char *hoststr,void (*callback)(uint16_t,uint16_t,uint16_t),uint8_t *dstip,uint8_t *dstmac); +// The callback is a reference to a function which must look like this: +// void browserresult_callback(uint16_t webstatuscode,uint16_t datapos,uint16_t len) +// webstatuscode is zero if there was no proper reply from the server (garbage message total communication failure, this is rare). +// webstatuscode is otherwise the http status code (e.g webstatuscode=200 for 200 OK); +// For possible status codes look at http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html +// Basically 2xx is success and any 5xx, 4xx is a failure. +// ----- http post +// client web browser using http POST operation: +// additionalheaderline must be set to NULL if not used. +// The string buffers to which urlbuf_varpart and hoststr are pointing +// must not be changed until the callback is executed. +// postval is a string buffer which can only be de-allocated by the caller +// when the post operation was really done (e.g when callback was executed). +// postval must be urlencoded. +extern void client_http_post(const prog_char *urlbuf, char *urlbuf_varpart,const char *hoststr, const prog_char *additionalheaderline,char *postval,void (*callback)(uint16_t,uint16_t,uint16_t),uint8_t *dstip,uint8_t *dstmac); +// The callback is a reference to a function which must look like this: +// void browserresult_callback(uint16_t webstatuscode,uint16_t datapos,uint16_t len) +// webstatuscode is zero if there was no proper reply from the server (garbage message total communication failure, this is rare). +// webstatuscode is otherwise the http status code (e.g webstatuscode=200 for 200 OK); +#endif + +#ifdef NTP_client +// be careful to not mix client_ntp_request with situations where you are filling +// a web-page. Normally you will be using the same packet buffer and +// client_ntp_request writes immediately to buf. You might need to +// set a marker and call client_ntp_request when your main loop is idle. +extern void client_ntp_request(uint8_t *buf,uint8_t *ntpip,uint8_t srcport,uint8_t *dstmac); +extern uint8_t client_ntp_process_answer(uint8_t *buf,uint32_t *time,uint8_t dstport_l); +#endif + +#ifdef UDP_client +// There are two ways of using this UDP client: +// +// 1) you call send_udp_prepare, you fill the data yourself into buf starting at buf[UDP_DATA_P], +// you send the packet by calling send_udp_transmit +// +// 2) You just allocate a large enough buffer for you data and you call send_udp and nothing else +// needs to be done. +// +extern void send_udp_prepare(uint8_t *buf,uint16_t sport, const uint8_t *dip, uint16_t dport,const uint8_t *dstmac); +extern void send_udp_transmit(uint8_t *buf,uint16_t datalen); + +// send_udp sends via gwip, you must call client_set_gwip at startup, datalen must be less than 220 bytes +extern void send_udp(uint8_t *buf,char *data,uint8_t datalen,uint16_t sport, const uint8_t *dip, uint16_t dport,const uint8_t *dstmac); +#endif + +// you can find out who ping-ed you if you want: +extern void register_ping_rec_callback(void (*callback)(uint8_t *srcip)); + +#ifdef PING_client +extern void client_icmp_request(uint8_t *buf,uint8_t *destip,uint8_t *dstmac); +// you must loop over this function to check if there was a ping reply: +extern uint8_t packetloop_icmp_checkreply(uint8_t *buf,uint8_t *ip_monitoredhost); +#endif // PING_client + +#ifdef WOL_client +extern void send_wol(uint8_t *buf,uint8_t *wolmac); +#endif // WOL_client + +#if defined GRATARP +// send a Gratuitous arp, this is to refresh the arp +// cash of routers and switches. It can improve the response +// time in wifi networks as some wifi equipment expects the initial +// communication to not start from the network side. That is wrong +// but some consumer devices are made like this. +extern uint8_t gratutious_arp(uint8_t *buf); +#endif // GRATARP + +#endif /* IP_ARP_UDP_TCP_H */ +//@} diff --git a/part15a-tcpip-webserver-gpio-interrupt/tcpip/ip_config.h b/part15a-tcpip-webserver-gpio-interrupt/tcpip/ip_config.h new file mode 100644 index 0000000..b043ee9 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/tcpip/ip_config.h @@ -0,0 +1,53 @@ +/********************************************* + * vim:sw=8:ts=8:si:et + * To use the above modeline in vim you must have "set modeline" in your .vimrc + * Author: Guido Socher + * Copyright:LGPL V2 + * See http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html + * + * This file can be used to decide which functionallity of the + * TCP/IP stack shall be available. By picking the right functions + * you can significantly reduce the size of the resulting code. + * + *********************************************/ +//@{ +#ifndef IP_CONFIG_H +#define IP_CONFIG_H + +//------------- functions in ip_arp_udp_tcp.c -------------- +// an NTP client (ntp clock): +#undef NTP_client +// a spontanious sending UDP client (needed as well for DNS and DHCP) +#undef UDP_client +// a server answering to UDP messages +#define UDP_server +// a web server +#define WWW_server + +// to send out a ping: +#undef PING_client +#define PINGPATTERN 0x42 + +// a UDP wake on lan sender: +#undef WOL_client + +// function to send a gratuitous arp +#undef GRATARP + +// a "web browser". This can be use to upload data +// to a web server on the internet by encoding the data +// into the url (like a Form action of type GET): +#undef WWW_client +// if you do not need a browser and just a server: +//#undef WWW_client +// +//------------- functions in websrv_help_functions.c -------------- +// +// functions to decode cgi-form data: +#undef FROMDECODE_websrv_help + +// function to encode a URL (mostly needed for a web client) +#undef URLENCODE_websrv_help + +#endif /* IP_CONFIG_H */ +//@} diff --git a/part15a-tcpip-webserver-gpio-interrupt/tcpip/net.h b/part15a-tcpip-webserver-gpio-interrupt/tcpip/net.h new file mode 100644 index 0000000..1e9aed2 --- /dev/null +++ b/part15a-tcpip-webserver-gpio-interrupt/tcpip/net.h @@ -0,0 +1,133 @@ +/********************************************* + * vim:sw=8:ts=8:si:et + * To use the above modeline in vim you must have "set modeline" in your .vimrc + * Author: Guido Socher + * Copyright:LGPL V2 + * See http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html + * + * Based on the net.h file from the AVRlib library by Pascal Stang. + * For AVRlib See http://www.procyonengineering.com/ + * Used with explicit permission of Pascal Stang. + * + *********************************************/ + +// notation: _P = position of a field +// _V = value of a field + +//@{ + +#ifndef NET_H +#define NET_H + +// ******* ETH ******* +#define ETH_HEADER_LEN 14 +// values of certain bytes: +#define ETHTYPE_ARP_H_V 0x08 +#define ETHTYPE_ARP_L_V 0x06 +#define ETHTYPE_IP_H_V 0x08 +#define ETHTYPE_IP_L_V 0x00 +// byte positions in the ethernet frame: +// +// Ethernet type field (2bytes): +#define ETH_TYPE_H_P 12 +#define ETH_TYPE_L_P 13 +// +#define ETH_DST_MAC 0 +#define ETH_SRC_MAC 6 + + +// ******* ARP ******* +#define ETH_ARP_OPCODE_REPLY_H_V 0x0 +#define ETH_ARP_OPCODE_REPLY_L_V 0x02 +#define ETH_ARP_OPCODE_REQ_H_V 0x0 +#define ETH_ARP_OPCODE_REQ_L_V 0x01 +// start of arp header: +#define ETH_ARP_P 0xe +// +#define ETHTYPE_ARP_L_V 0x06 +// arp.dst.ip +#define ETH_ARP_DST_IP_P 0x26 +// arp.opcode +#define ETH_ARP_OPCODE_H_P 0x14 +#define ETH_ARP_OPCODE_L_P 0x15 +// arp.src.mac +#define ETH_ARP_SRC_MAC_P 0x16 +#define ETH_ARP_SRC_IP_P 0x1c +#define ETH_ARP_DST_MAC_P 0x20 +#define ETH_ARP_DST_IP_P 0x26 + +// ******* IP ******* +#define IP_HEADER_LEN 20 +// ip.src +#define IP_SRC_P 0x1a +#define IP_DST_P 0x1e +#define IP_HEADER_LEN_VER_P 0xe +#define IP_CHECKSUM_P 0x18 +#define IP_TTL_P 0x16 +#define IP_FLAGS_P 0x14 +#define IP_P 0xe +#define IP_TOTLEN_H_P 0x10 +#define IP_TOTLEN_L_P 0x11 +#define IP_ID_H_P 0x12 +#define IP_ID_L_P 0x13 + +#define IP_PROTO_P 0x17 + +#define IP_PROTO_ICMP_V 1 +#define IP_PROTO_TCP_V 6 +// 17=0x11 +#define IP_PROTO_UDP_V 17 +// ******* ICMP ******* +#define ICMP_TYPE_ECHOREPLY_V 0 +#define ICMP_TYPE_ECHOREQUEST_V 8 +// +#define ICMP_TYPE_P 0x22 +#define ICMP_CHECKSUM_P 0x24 +#define ICMP_CHECKSUM_H_P 0x24 +#define ICMP_CHECKSUM_L_P 0x25 +#define ICMP_IDENT_H_P 0x26 +#define ICMP_IDENT_L_P 0x27 +#define ICMP_DATA_P 0x2a + +// ******* UDP ******* +#define UDP_HEADER_LEN 8 +// +#define UDP_SRC_PORT_H_P 0x22 +#define UDP_SRC_PORT_L_P 0x23 +#define UDP_DST_PORT_H_P 0x24 +#define UDP_DST_PORT_L_P 0x25 +// +#define UDP_LEN_H_P 0x26 +#define UDP_LEN_L_P 0x27 +#define UDP_CHECKSUM_H_P 0x28 +#define UDP_CHECKSUM_L_P 0x29 +#define UDP_DATA_P 0x2a + +// ******* TCP ******* +#define TCP_SRC_PORT_H_P 0x22 +#define TCP_SRC_PORT_L_P 0x23 +#define TCP_DST_PORT_H_P 0x24 +#define TCP_DST_PORT_L_P 0x25 +// the tcp seq number is 4 bytes 0x26-0x29 +#define TCP_SEQ_H_P 0x26 +#define TCP_SEQACK_H_P 0x2a +// flags: SYN=2 +#define TCP_FLAGS_P 0x2f +#define TCP_FLAGS_SYN_V 2 +#define TCP_FLAGS_FIN_V 1 +#define TCP_FLAGS_RST_V 4 +#define TCP_FLAGS_PUSH_V 8 +#define TCP_FLAGS_SYNACK_V 0x12 +#define TCP_FLAGS_ACK_V 0x10 +#define TCP_FLAGS_PSHACK_V 0x18 +// plain len without the options: +#define TCP_HEADER_LEN_PLAIN 20 +#define TCP_HEADER_LEN_P 0x2e +#define TCP_WIN_SIZE 0x30 +#define TCP_CHECKSUM_H_P 0x32 +#define TCP_CHECKSUM_L_P 0x33 +#define TCP_OPTIONS_P 0x36 +// +#endif +//@} + diff --git a/part2-building/Makefile b/part2-building/Makefile index 371b8b1..ae02b77 100644 --- a/part2-building/Makefile +++ b/part2-building/Makefile @@ -1,19 +1,19 @@ CFILES = $(wildcard *.c) OFILES = $(CFILES:.c=.o) -LLVMPATH = /opt/homebrew/opt/llvm/bin -CLANGFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd +GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin all: clean kernel8.img boot.o: boot.S - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c boot.S -o boot.o + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o %.o: %.c - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c $< -o $@ + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ kernel8.img: boot.o $(OFILES) - $(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf - $(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img + $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf + $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img clean: /bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true diff --git a/part2-building/Makefile.gcc b/part2-building/Makefile.gcc deleted file mode 100644 index ae02b77..0000000 --- a/part2-building/Makefile.gcc +++ /dev/null @@ -1,19 +0,0 @@ -CFILES = $(wildcard *.c) -OFILES = $(CFILES:.c=.o) -GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin - -all: clean kernel8.img - -boot.o: boot.S - $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o - -%.o: %.c - $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ - -kernel8.img: boot.o $(OFILES) - $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf - $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img - -clean: - /bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true diff --git a/part3-helloworld/Makefile b/part3-helloworld/Makefile index 371b8b1..db4db8f 100644 --- a/part3-helloworld/Makefile +++ b/part3-helloworld/Makefile @@ -1,19 +1,24 @@ CFILES = $(wildcard *.c) OFILES = $(CFILES:.c=.o) -LLVMPATH = /opt/homebrew/opt/llvm/bin -CLANGFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd +GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin +BOOTMNT ?= /media/cvdeveloper/bootfs all: clean kernel8.img boot.o: boot.S - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c boot.S -o boot.o + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o %.o: %.c - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c $< -o $@ + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ kernel8.img: boot.o $(OFILES) - $(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf - $(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img + $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf + $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8-rpi4.img + + cp kernel8-rpi4.img $(BOOTMNT)/kernel8-rpi4.img + cp config.txt $(BOOTMNT)/ + sync clean: /bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true diff --git a/part3-helloworld/Makefile.gcc b/part3-helloworld/Makefile.gcc deleted file mode 100644 index ae02b77..0000000 --- a/part3-helloworld/Makefile.gcc +++ /dev/null @@ -1,19 +0,0 @@ -CFILES = $(wildcard *.c) -OFILES = $(CFILES:.c=.o) -GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin - -all: clean kernel8.img - -boot.o: boot.S - $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o - -%.o: %.c - $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ - -kernel8.img: boot.o $(OFILES) - $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf - $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img - -clean: - /bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true diff --git a/part3-helloworld/config.txt b/part3-helloworld/config.txt new file mode 100644 index 0000000..42f2494 --- /dev/null +++ b/part3-helloworld/config.txt @@ -0,0 +1,46 @@ +# For more options and information see +# http://rptl.io/configtxt +# Some settings may impact device functionality. See link above for details + +# Uncomment some or all of these to enable the optional hardware interfaces +#dtparam=i2c_arm=on +#dtparam=i2s=on +#dtparam=spi=on + +# Enable audio (loads snd_bcm2835) +dtparam=audio=on + +# Additional overlays and parameters are documented +# /boot/firmware/overlays/README + +# Automatically load overlays for detected cameras +camera_auto_detect=1 + +# Automatically load overlays for detected DSI displays +display_auto_detect=1 + +# Automatically load initramfs files, if found +auto_initramfs=1 + +# Enable DRM VC4 V3D driver +dtoverlay=vc4-kms-v3d +max_framebuffers=2 + +# Don't have the firmware create an initial video= setting in cmdline.txt. +# Use the kernel's default instead. +disable_fw_kms_setup=1 + +# Run in 64-bit mode +arm_64bit=1 + +# Disable compensation for displays with overscan +disable_overscan=1 + +# Run as fast as firmware / board allows +arm_boost=1 + +[all] +kernel_old=1 +disable_commandline_tags=1 +arm_64bit=1 +core_freq_min=500 diff --git a/part4-miniuart/Makefile b/part4-miniuart/Makefile index 371b8b1..77a5836 100644 --- a/part4-miniuart/Makefile +++ b/part4-miniuart/Makefile @@ -1,19 +1,24 @@ CFILES = $(wildcard *.c) OFILES = $(CFILES:.c=.o) -LLVMPATH = /opt/homebrew/opt/llvm/bin -CLANGFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd +GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin +BOOTMNT ?= /media/cvdeveloper/bootfs all: clean kernel8.img boot.o: boot.S - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c boot.S -o boot.o + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o %.o: %.c - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c $< -o $@ + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ kernel8.img: boot.o $(OFILES) - $(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf - $(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img + $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf + $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img + + cp kernel8.img $(BOOTMNT)/kernel8.img + cp config.txt $(BOOTMNT)/ + sync clean: /bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true diff --git a/part4-miniuart/Makefile.gcc b/part4-miniuart/Makefile.gcc deleted file mode 100644 index ae02b77..0000000 --- a/part4-miniuart/Makefile.gcc +++ /dev/null @@ -1,19 +0,0 @@ -CFILES = $(wildcard *.c) -OFILES = $(CFILES:.c=.o) -GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin - -all: clean kernel8.img - -boot.o: boot.S - $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o - -%.o: %.c - $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ - -kernel8.img: boot.o $(OFILES) - $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf - $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img - -clean: - /bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true diff --git a/part4-miniuart/config.txt b/part4-miniuart/config.txt new file mode 100644 index 0000000..42f2494 --- /dev/null +++ b/part4-miniuart/config.txt @@ -0,0 +1,46 @@ +# For more options and information see +# http://rptl.io/configtxt +# Some settings may impact device functionality. See link above for details + +# Uncomment some or all of these to enable the optional hardware interfaces +#dtparam=i2c_arm=on +#dtparam=i2s=on +#dtparam=spi=on + +# Enable audio (loads snd_bcm2835) +dtparam=audio=on + +# Additional overlays and parameters are documented +# /boot/firmware/overlays/README + +# Automatically load overlays for detected cameras +camera_auto_detect=1 + +# Automatically load overlays for detected DSI displays +display_auto_detect=1 + +# Automatically load initramfs files, if found +auto_initramfs=1 + +# Enable DRM VC4 V3D driver +dtoverlay=vc4-kms-v3d +max_framebuffers=2 + +# Don't have the firmware create an initial video= setting in cmdline.txt. +# Use the kernel's default instead. +disable_fw_kms_setup=1 + +# Run in 64-bit mode +arm_64bit=1 + +# Disable compensation for displays with overscan +disable_overscan=1 + +# Run as fast as firmware / board allows +arm_boost=1 + +[all] +kernel_old=1 +disable_commandline_tags=1 +arm_64bit=1 +core_freq_min=500 diff --git a/part5-framebuffer/Makefile b/part5-framebuffer/Makefile index 371b8b1..ae02b77 100644 --- a/part5-framebuffer/Makefile +++ b/part5-framebuffer/Makefile @@ -1,19 +1,19 @@ CFILES = $(wildcard *.c) OFILES = $(CFILES:.c=.o) -LLVMPATH = /opt/homebrew/opt/llvm/bin -CLANGFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd +GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin all: clean kernel8.img boot.o: boot.S - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c boot.S -o boot.o + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o %.o: %.c - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c $< -o $@ + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ kernel8.img: boot.o $(OFILES) - $(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf - $(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img + $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf + $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img clean: /bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true diff --git a/part5-framebuffer/Makefile.gcc b/part5-framebuffer/Makefile.gcc deleted file mode 100644 index ae02b77..0000000 --- a/part5-framebuffer/Makefile.gcc +++ /dev/null @@ -1,19 +0,0 @@ -CFILES = $(wildcard *.c) -OFILES = $(CFILES:.c=.o) -GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin - -all: clean kernel8.img - -boot.o: boot.S - $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o - -%.o: %.c - $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ - -kernel8.img: boot.o $(OFILES) - $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf - $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img - -clean: - /bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true diff --git a/part6-breakout/Makefile b/part6-breakout/Makefile index 371b8b1..ae02b77 100644 --- a/part6-breakout/Makefile +++ b/part6-breakout/Makefile @@ -1,19 +1,19 @@ CFILES = $(wildcard *.c) OFILES = $(CFILES:.c=.o) -LLVMPATH = /opt/homebrew/opt/llvm/bin -CLANGFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -mcpu=cortex-a72+nosimd +GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin all: clean kernel8.img boot.o: boot.S - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c boot.S -o boot.o + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o %.o: %.c - $(LLVMPATH)/clang --target=aarch64-elf $(CLANGFLAGS) -c $< -o $@ + $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ kernel8.img: boot.o $(OFILES) - $(LLVMPATH)/ld.lld -m aarch64elf -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf - $(LLVMPATH)/llvm-objcopy -O binary kernel8.elf kernel8.img + $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf + $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img clean: /bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true diff --git a/part6-breakout/Makefile.gcc b/part6-breakout/Makefile.gcc deleted file mode 100644 index ae02b77..0000000 --- a/part6-breakout/Makefile.gcc +++ /dev/null @@ -1,19 +0,0 @@ -CFILES = $(wildcard *.c) -OFILES = $(CFILES:.c=.o) -GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -GCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin - -all: clean kernel8.img - -boot.o: boot.S - $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o - -%.o: %.c - $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c $< -o $@ - -kernel8.img: boot.o $(OFILES) - $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) -T link.ld -o kernel8.elf - $(GCCPATH)/aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.img - -clean: - /bin/rm kernel8.elf *.o *.img > /dev/null 2> /dev/null || true