From 6391b9b6f7432c4e2ffbfdb01b02ce169d4c03e0 Mon Sep 17 00:00:00 2001 From: Yaroslav Veremenko Date: Sat, 6 Apr 2024 12:40:12 -0600 Subject: [PATCH] Pi Pico IOCTL device --- Kernel/platform/platform-rpipico/Makefile | 2 ++ Kernel/platform/platform-rpipico/config.h | 2 ++ Kernel/platform/platform-rpipico/misc.c | 13 ++++++++ Kernel/platform/platform-rpipico/pico_ioctl.h | 7 +++++ .../platform/platform-rpipico/update-flash.sh | 11 ++++++- .../platform/platform-rpipico/utils/Makefile | 24 ++++++++++++++ Kernel/platform/platform-rpipico/utils/pico | 17 ++++++++++ .../platform-rpipico/utils/picoioctl.c | 31 +++++++++++++++++++ 8 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 Kernel/platform/platform-rpipico/pico_ioctl.h create mode 100644 Kernel/platform/platform-rpipico/utils/Makefile create mode 100644 Kernel/platform/platform-rpipico/utils/pico create mode 100644 Kernel/platform/platform-rpipico/utils/picoioctl.c diff --git a/Kernel/platform/platform-rpipico/Makefile b/Kernel/platform/platform-rpipico/Makefile index 8d79785323..d704a20e01 100644 --- a/Kernel/platform/platform-rpipico/Makefile +++ b/Kernel/platform/platform-rpipico/Makefile @@ -31,6 +31,7 @@ clean: $(MAKE) -C ../../../Applications/cave -f Makefile.armm0 clean $(MAKE) -C ../../../Applications/cursesgames -f Makefile.armm0 clean $(MAKE) -C ../../../Standalone clean + $(MAKE) -C utils clean world: build/fuzix.elf $(MAKE) -C ../../../Library/libs -f Makefile.armm0 @@ -42,6 +43,7 @@ world: build/fuzix.elf $(MAKE) -C ../../../Applications/cave -f Makefile.armm0 $(MAKE) -C ../../../Applications/cursesgames -f Makefile.armm0 $(MAKE) -C ../../../Standalone + $(MAKE) -C utils uf2conv: tools/uf2conv.c cc -O -g -o $@ $< diff --git a/Kernel/platform/platform-rpipico/config.h b/Kernel/platform/platform-rpipico/config.h index f73f63c45e..1636a61fea 100644 --- a/Kernel/platform/platform-rpipico/config.h +++ b/Kernel/platform/platform-rpipico/config.h @@ -35,6 +35,8 @@ #define CONFIG_PLATFORM_SWAPCTL /* Platform manages process brk. */ #define CONFIG_PLATFORM_BRK +/* Platform IOCTL on /dev/sys (maj:min)(4:6) */ +#define CONFIG_DEV_PLATFORM #define CONFIG_32BIT #define CONFIG_USERMEM_DIRECT diff --git a/Kernel/platform/platform-rpipico/misc.c b/Kernel/platform/platform-rpipico/misc.c index 5be807aac9..360004b39a 100644 --- a/Kernel/platform/platform-rpipico/misc.c +++ b/Kernel/platform/platform-rpipico/misc.c @@ -3,7 +3,9 @@ #include #include #include "picosdk.h" +#include "pico_ioctl.h" #include +#include #include uint8_t sys_cpu = A_ARM; @@ -33,6 +35,17 @@ void plt_monitor(void) for(;;) { sleep_until(at_the_end_of_time); } } +int plt_dev_ioctl(uarg_t request, char *data) +{ + used(data); + if (request == PICOIOC_FLASH) + { + reset_usb_boot(0, 0); + return 0; + } + return -1; +} + uaddr_t pagemap_base(void) { return PROGBASE; diff --git a/Kernel/platform/platform-rpipico/pico_ioctl.h b/Kernel/platform/platform-rpipico/pico_ioctl.h new file mode 100644 index 0000000000..13ac53b8d4 --- /dev/null +++ b/Kernel/platform/platform-rpipico/pico_ioctl.h @@ -0,0 +1,7 @@ +#ifndef PICO_IOCTL_H +#define PICO_IOCTL_H + +/* Reboot PI Pico into flash mode */ +#define PICOIOC_FLASH 0x0001 + +#endif diff --git a/Kernel/platform/platform-rpipico/update-flash.sh b/Kernel/platform/platform-rpipico/update-flash.sh index 4c91a5fd73..006ac824b7 100755 --- a/Kernel/platform/platform-rpipico/update-flash.sh +++ b/Kernel/platform/platform-rpipico/update-flash.sh @@ -63,9 +63,14 @@ mknod hdb 60660 16 mknod hdb1 60660 17 mknod hdb2 60660 18 mknod null 20666 1024 -mknod mem 20660 1025 +mknod kmem 20660 1025 mknod zero 20444 1026 mknod proc 20666 1027 +mknod mem 20660 1028 +mknod rtc 20600 1029 +mknod sys 20644 1030 +mknod i2c 20600 1031 +mknod gpio 20600 1032 cd / bget ../../../Applications/util/init init @@ -179,6 +184,8 @@ bget ../../../Applications/util/whoami bget ../../../Applications/util/write bget ../../../Applications/util/xargs bget ../../../Applications/util/yes +bget utils/pico +bget utils/picoioctl chmod 0755 banner chmod 0755 basename @@ -265,6 +272,8 @@ chmod 0755 whoami chmod 0755 write chmod 0755 xargs chmod 0755 yes +chmod 0755 pico +chmod 0755 picoioctl ln cp mv ln cp ln ln reboot halt diff --git a/Kernel/platform/platform-rpipico/utils/Makefile b/Kernel/platform/platform-rpipico/utils/Makefile new file mode 100644 index 0000000000..a571740a9a --- /dev/null +++ b/Kernel/platform/platform-rpipico/utils/Makefile @@ -0,0 +1,24 @@ +ROOT=../../../.. +FUZIX_ROOT=$(ROOT) +USERCPU=armm0 +VERBOSE=1 +include $(FUZIX_ROOT)/Target/rules.$(USERCPU) + +UTILS = picoioctl.c +UTILSBIN = $(UTILS:.c=) + +.PHONY: all clean + +all: $(UTILSBIN) + +clean: + rm -f *.o + rm -f $(UTILSBIN) + rm -f progbase.h + rm -f ps.c + +$(UTILSBIN): %: %.o + $(LINKER) $(CRT0) $^ -o $@ $(LINKER_OPT) $(LINKER_TAIL) + +%.o: %.c + $(CC) $(CFLAGS) $(CCOPTS) -c $< diff --git a/Kernel/platform/platform-rpipico/utils/pico b/Kernel/platform/platform-rpipico/utils/pico new file mode 100644 index 0000000000..35ec13fa6b --- /dev/null +++ b/Kernel/platform/platform-rpipico/utils/pico @@ -0,0 +1,17 @@ +if { test $# -eq 0 || test "$1" = "--help"; }; then + echo -e "\ +usage: $0 [ --help ] \n\ +Command list:\n\ +\tflash\tUnmount filesystem and reboot into flash mode." +else + case $1 in + flash) + killall + umount -a + substroot remount % ro + echo "Rebooting into flash mode" + picoioctl flash + ;; + *) echo "Invalid command. Use --help to list available options." ;; + esac +fi \ No newline at end of file diff --git a/Kernel/platform/platform-rpipico/utils/picoioctl.c b/Kernel/platform/platform-rpipico/utils/picoioctl.c new file mode 100644 index 0000000000..98ddfe3f18 --- /dev/null +++ b/Kernel/platform/platform-rpipico/utils/picoioctl.c @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include +#include "../pico_ioctl.h" + +int main(int argc, char **argv) +{ + if (argc == 1 || strcmp(argv[1], "--help") == 0) + { + puts("usage: picoioctl [ --help ] "); + puts("Command list:"); + puts("\tflash\tReset into flash mode."); + return 0; + } + int fd = open("/dev/sys", O_RDWR, 0); + if (!fd) + { + puts("Failed to open /dev/sys."); + exit(1); + } + if (ioctl(fd, PICOIOC_FLASH) != 0) + { + puts("Failed to perform operation."); + close(fd); + exit(1); + } + close(fd); + return 0; +}