sudo apt-get install build-essential libnewlib-dev gcc-riscv64-unknown-elf libusb-1.0-0-dev libudev-dev
# [download archives]
wget -O ch32fun.zip https://github.com/cnlohr/ch32fun/archive/1e92c653742b411fe00d5edf752d9775da6b61d9.zip
wget -O rv003usb.zip https://github.com/cnlohr/rv003usb/archive/80b18937e5da619ac3c9bb74af7ecbf2d2f7f4c6.zip
wget -O comu.zip https://github.com/cheyao/comu/archive/a25af487735d22c0aa4bf40b6a30ad603734a124.zip
wget https://github.com/ch32-rs/wchisp/releases/download/nightly/wchisp-linux-x64.tar.gz
# [make directories]
mkdir mrubyc_ch32fun
mkdir mrubyc_ch32fun/ch32v006
mkdir mrubyc_ch32fun/ch32v006hid
mkdir mrubyc_ch32fun/ch32v006cdc
mkdir mrubyc_ch32fun/ch32x035
mkdir mrubyc_ch32fun/ch32v203
mkdir mrubyc_ch32fun/ch32v203swd
mkdir mrubyc_ch32fun/mrubyc
# [ch32fun]
unzip ch32fun.zip
mv ch32fun-1e92c653742b411fe00d5edf752d9775da6b61d9 ch32fun-master
sed -i -e '/void funAnalogInit/,/#if defined(CH32V20x)/ s/#if defined(CH32V20x)/#if defined(CH32V20x) || defined(CH32V006)/' ch32fun-master/ch32fun/ch32fun.c
cd ch32fun-master/minichlink
sed -i -e 's/0x03, 0x16/0x03, 0x56/' pgm-b003fun.c
sed -i -e 's/max_retries = 100;/max_retries = 200;/' pgm-b003fun.c
make
cd ../examples_usb/bootloader/
sed -i -e 's/=CH570/=CH32X035/' Makefile
make build
cd ../../..
cp ch32fun-master/minichlink/minichlink mrubyc_ch32fun/
chmod +x mrubyc_ch32fun/minichlink
cp ch32fun-master/examples_v20x/debugprintfdemo/funconfig.h mrubyc_ch32fun/ch32v006
cp ch32fun-master/examples_usb/bootloader/bootloader.bin mrubyc_ch32fun/ch32x035/
cp ch32fun-master/examples_usb/USBFS/usbfs_cdc_tty/usb_config.h mrubyc_ch32fun/ch32x035
cp ch32fun-master/examples_usb/USBFS/usbfs_cdc_tty/funconfig.h mrubyc_ch32fun/ch32x035
cp ch32fun-master/examples_usb/USBD/usbd_cdc_tty/usb_config.h mrubyc_ch32fun/ch32v203
cp ch32fun-master/examples_usb/USBD/usbd_cdc_tty/funconfig.h mrubyc_ch32fun/ch32v203
cp ch32fun-master/examples_v20x/debugprintfdemo/funconfig.h mrubyc_ch32fun/ch32v203swd
cp -r ch32fun-master/ch32fun mrubyc_ch32fun/ch32fun
cp -r ch32fun-master/extralibs mrubyc_ch32fun/extralibs
# [rv003usb]
unzip rv003usb.zip
mv rv003usb-80b18937e5da619ac3c9bb74af7ecbf2d2f7f4c6 rv003usb-master
cp -r ch32fun-master/ch32fun rv003usb-master/ch32fun/ch32fun
cd rv003usb-master/bootloader_v006
make build
cd ../..
cp -r rv003usb-master/lib mrubyc_ch32fun/lib
cp -r rv003usb-master/rv003usb mrubyc_ch32fun/rv003usb
# modify Makefile
cp rv003usb-master/bootloader_v006/bootloader.bin mrubyc_ch32fun/ch32v006hid
cp rv003usb-master/demo_terminal/usb_config.h mrubyc_ch32fun/ch32v006hid
cp rv003usb-master/demo_terminal/funconfig.h mrubyc_ch32fun/ch32v006hid
cp rv003usb-master/bootloader_v006/bootloader.bin mrubyc_ch32fun/ch32v006cdc
cp rv003usb-master/testing/usb_cdc_uart/usb_config.h mrubyc_ch32fun/ch32v006cdc
cp rv003usb-master/testing/usb_cdc_uart/funconfig.h mrubyc_ch32fun/ch32v006cdc
# [comu]
unzip comu.zip
mv comu-a25af487735d22c0aa4bf40b6a30ad603734a124 comu-master
cp -r ch32fun-master/ch32fun comu-master/ch32fun/ch32fun
cp -r ch32fun-master/extralibs comu-master/ch32fun/extralibs
cd comu-master/bootloader/
awk '/scratchexec\(/{$0="USBD->CNTR &= ~USBD_CTRM;\n"$0"\nUSBD->CNTR |= USBD_CTRM;"}1' bootloader.c >temp.tmp && mv temp.tmp bootloader.c
make build
cd ../..
cp comu-master/bootloader/bootloader.bin mrubyc_ch32fun/ch32v203/
cp comu-master/examples/printf/comu.ld mrubyc_ch32fun/ch32v203/
awk '/\.rodata/{$0=""}/storage\)/{$0="*(.rodata)\n*(.rodata*)\n"$0}NF' mrubyc_ch32fun/ch32v203/comu.ld >temp.tmp && mv temp.tmp mrubyc_ch32fun/ch32v203/comu.ld
awk '/\(\.rodata/{$0="#if TARGET_MCU_LD != 2 /* v20x */\n"$0"\n#endif"}/\.storage\)/{$0="\t\t\t*(.rodata)\n\t\t\t*(.rodata*)\n"$0}1' mrubyc_ch32fun/ch32fun/ch32fun.ld >temp.tmp && mv temp.tmp mrubyc_ch32fun/ch32fun/ch32fun.ld
awk '/void HandleDataOut/{a=1}a&&/^}/{$0="\tpoll_input();\n"$0;a=0}/ANYPRINTF/&&!u{$2=$2" 0 &&";u=1}1' mrubyc_ch32fun/extralibs/fsusb.c >temp.tmp && mv temp.tmp mrubyc_ch32fun/extralibs/fsusb.c
awk '/void HandleDataOut/{a=1}a&&/^}/{$0="\tpoll_input();\n"$0;a=0}/ANYPRINTF/&&!u{$2=$2" 0 &&";u=1}1' mrubyc_ch32fun/extralibs/usbd.c >temp.tmp && mv temp.tmp mrubyc_ch32fun/extralibs/usbd.c
# [wchisp]
tar xzvf wchisp-linux-x64.tar.gz
cp wchisp-linux-x64/wchisp mrubyc_ch32fun/
chmod +x mrubyc_ch32fun/wchisp
# [mruby/c]
cp -r mrubyc-release3.4.1/src mrubyc_ch32fun/mrubyc/src
cp -r mrubyc-release3.4.1/support mrubyc_ch32fun/mrubyc/support
cp -r mrubyc-release3.4.1/mrblib mrubyc_ch32fun/mrubyc/mrblib
cd mrubyc_ch32fun/mrubyc/src
sed -i -e 's@extern@#if defined(CH32V20x)\n  extern@' -e 's@(mrblib_bytecode);@(mrblib_bytecode);\n  #endif@' class.c
sed -i -e 's@#include "rrt0.h"@#if defined(CH32V20x)\n#include "rrt0.h"\n#endif@' mrubyc.h
sed -i -e 's@#define hal_init@#include \"ch32fun.h\"\n\n#define hal_init@' -e 's/delay/Delay_Ms/' hal.h
sed -i -e 's/#define MRBC_USE_FLOAT 2/#if defined(CH32X03x)\n#define MRBC_USE_FLOAT 0\n#elif defined(CH32V20x)\n#define MRBC_USE_FLOAT 1\n#else\n#define MRBC_USE_FLOAT 2\n#endif/' -e 's@// #define MRBC_REQUIRE_32BIT_ALIGNMENT@#define MRBC_REQUIRE_32BIT_ALIGNMENT@' vm_config.h
sed -i -e 's@#include "mrubyc.h"@#include "mrubyc.h"\n#include "rrt0.h"@' rrt0.c
#wget https://www.ipc.shimane-u.ac.jp/weda/mrubyc/hal.c
wget -O mrbc_api.h https://www.ipc.shimane-u.ac.jp/weda/mrubyc/mrbc_api_ch32.h
cd ../../..
# [ICs]
cd mrubyc_ch32fun/ch32v006
wget https://www.ipc.shimane-u.ac.jp/weda/mrubyc/ch32v006.c
sed -i -e 's/ch32fun_/mrbc_/' ch32v006.c 
wget -O Makefile https://www.ipc.shimane-u.ac.jp/weda/mrubyc/Makefile.006
cd ../..
cd mrubyc_ch32fun/ch32v006hid
wget -O ch32v006.c https://www.ipc.shimane-u.ac.jp/weda/mrubyc/ch32v006hid.c
sed -i -e 's/ch32fun_/mrbc_/' ch32v006.c 
wget -O Makefile https://www.ipc.shimane-u.ac.jp/weda/mrubyc/Makefile.006h
cd ../..
cd mrubyc_ch32fun/ch32v006cdc
wget -O ch32v006.c https://www.ipc.shimane-u.ac.jp/weda/mrubyc/ch32v006cdc.c
sed -i -e 's/ch32fun_/mrbc_/' ch32v006.c 
wget -O Makefile https://www.ipc.shimane-u.ac.jp/weda/mrubyc/Makefile.006c
cd ../..
cd mrubyc_ch32fun/ch32x035
wget https://www.ipc.shimane-u.ac.jp/weda/mrubyc/ch32x035.c
sed -i -e 's/ch32fun_/mrbc_/' ch32x035.c
wget -O Makefile https://www.ipc.shimane-u.ac.jp/weda/mrubyc/Makefile.035
cd ../..
cd mrubyc_ch32fun/ch32v203
wget https://www.ipc.shimane-u.ac.jp/weda/mrubyc/ch32v203.c
sed -i -e 's/ch32fun_/mrbc_/' ch32v203.c
wget -O Makefile https://www.ipc.shimane-u.ac.jp/weda/mrubyc/Makefile.203
wget https://www.ipc.shimane-u.ac.jp/weda/mrubyc/combine.rb
cd ../..
cd mrubyc_ch32fun/ch32v203swd
wget -O ch32v203.c https://www.ipc.shimane-u.ac.jp/weda/mrubyc/ch32v203swd.c
sed -i -e 's/ch32fun_/mrbc_/' ch32v203.c
wget -O Makefile https://www.ipc.shimane-u.ac.jp/weda/mrubyc/Makefile.203s
cd ../..
