From b07adef240f2a5f89ebe252b5eec0864eae0ca20 Mon Sep 17 00:00:00 2001 From: Chang-Tiger <67226478+Chang-Tiger@users.noreply.github.com> Date: Tue, 7 Mar 2023 17:02:10 +0800 Subject: [PATCH 1/2] Add files via upload --- README.md | 10 +++ lab1/Makefile | 43 ++++++++++ lab1/build/kernel8.elf | Bin 0 -> 71176 bytes lab1/build/main_c.d | 2 + lab1/build/main_c.o | Bin 0 -> 1480 bytes lab1/build/mbox_c.d | 1 + lab1/build/mbox_c.o | Bin 0 -> 1624 bytes lab1/build/shell_c.d | 2 + lab1/build/shell_c.o | Bin 0 -> 3856 bytes lab1/build/start_s.d | 1 + lab1/build/start_s.o | Bin 0 -> 1208 bytes lab1/build/string_c.d | 1 + lab1/build/string_c.o | Bin 0 -> 2168 bytes lab1/build/system_c.d | 2 + lab1/build/system_c.o | Bin 0 -> 3856 bytes lab1/build/uart_c.d | 1 + lab1/build/uart_c.o | Bin 0 -> 3704 bytes lab1/include/gpio.h | 25 ++++++ lab1/include/mbox.h | 26 ++++++ lab1/include/shell.h | 8 ++ lab1/include/string.h | 9 +++ lab1/include/system.h | 6 ++ lab1/include/uart.h | 15 ++++ lab1/kernel8.img | Bin 0 -> 3272 bytes lab1/linker.ld | 19 +++++ lab1/src/main.c | 12 +++ lab1/src/mbox.c | 37 +++++++++ lab1/src/shell.c | 58 ++++++++++++++ lab1/src/start.S | 26 ++++++ lab1/src/string.c | 45 +++++++++++ lab1/src/system.c | 79 ++++++++++++++++++ lab1/src/uart.c | 176 +++++++++++++++++++++++++++++++++++++++++ 32 files changed, 604 insertions(+) create mode 100644 README.md create mode 100644 lab1/Makefile create mode 100644 lab1/build/kernel8.elf create mode 100644 lab1/build/main_c.d create mode 100644 lab1/build/main_c.o create mode 100644 lab1/build/mbox_c.d create mode 100644 lab1/build/mbox_c.o create mode 100644 lab1/build/shell_c.d create mode 100644 lab1/build/shell_c.o create mode 100644 lab1/build/start_s.d create mode 100644 lab1/build/start_s.o create mode 100644 lab1/build/string_c.d create mode 100644 lab1/build/string_c.o create mode 100644 lab1/build/system_c.d create mode 100644 lab1/build/system_c.o create mode 100644 lab1/build/uart_c.d create mode 100644 lab1/build/uart_c.o create mode 100644 lab1/include/gpio.h create mode 100644 lab1/include/mbox.h create mode 100644 lab1/include/shell.h create mode 100644 lab1/include/string.h create mode 100644 lab1/include/system.h create mode 100644 lab1/include/uart.h create mode 100644 lab1/kernel8.img create mode 100644 lab1/linker.ld create mode 100644 lab1/src/main.c create mode 100644 lab1/src/mbox.c create mode 100644 lab1/src/shell.c create mode 100644 lab1/src/start.S create mode 100644 lab1/src/string.c create mode 100644 lab1/src/system.c create mode 100644 lab1/src/uart.c diff --git a/README.md b/README.md new file mode 100644 index 000000000..b72a6271d --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# Operating Systems Capstone 2022 + +## Author + +| Student ID | GitHub account name | My name | +| --- | ----------- | --- | +|`A111120`| `Chang-Tiger` | `Teng-Wu Chang` | + + +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 diff --git a/lab1/Makefile b/lab1/Makefile new file mode 100644 index 000000000..a8597cc4b --- /dev/null +++ b/lab1/Makefile @@ -0,0 +1,43 @@ +# debug use CFLAGS='-g' ASMFLAGS='-g' + +ARMGNU ?= aarch64-linux-gnu + +COPS = $(CFLAGS) -Wall -nostdlib -nostartfiles -ffreestanding -Iinclude #-ggdb #-D__FS_DEBUG #-D__DEBUG #-D__DEBUG_MM #-D__DEBUG_MM_ALLOC #-D__DEBUG_MM_SCHED +ASMOPS = $(ASMFLAGS) -Iinclude + +BUILD_DIR = build +SRC_DIR = src + +all : kernel8.img + +clean : + rm -rf $(BUILD_DIR) *.img + +$(BUILD_DIR)/%_c.o: $(SRC_DIR)/%.c + mkdir -p $(@D) + $(ARMGNU)-gcc $(COPS) -MMD -c $< -o $@ + +$(BUILD_DIR)/%_s.o: $(SRC_DIR)/%.S + $(ARMGNU)-gcc $(ASMOPS) -MMD -c $< -o $@ + +C_FILES = $(wildcard $(SRC_DIR)/*.c) +ASM_FILES = $(wildcard $(SRC_DIR)/*.S) +OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o) +OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_s.o) + +DEP_FILES = $(OBJ_FILES:%.o=%.d) +-include $(DEP_FILES) + +kernel8.img: linker.ld $(OBJ_FILES) + $(ARMGNU)-ld -g -T linker.ld -o $(BUILD_DIR)/kernel8.elf $(OBJ_FILES) + $(ARMGNU)-objcopy -g $(BUILD_DIR)/kernel8.elf -O binary kernel8.img + +run: + qemu-system-aarch64 -M raspi3b -kernel kernel8.img -display none -serial null -serial stdio + +run_debug: + qemu-system-aarch64 -M raspi3b -kernel kernel8.img -display none -serial null -serial stdio -s -S + +connect_raspi: + sudo screen /dev/ttyUSB0 115200 + diff --git a/lab1/build/kernel8.elf b/lab1/build/kernel8.elf new file mode 100644 index 0000000000000000000000000000000000000000..c04aba63a94bfa5870a0a306d3a64c00926e7110 GIT binary patch literal 71176 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 TpH@QWyRBApSFI5Jx%U4Bc}SXi literal 0 HcmV?d00001 diff --git a/lab1/build/main_c.d b/lab1/build/main_c.d new file mode 100644 index 000000000..6b34d6149 --- /dev/null +++ b/lab1/build/main_c.d @@ -0,0 +1,2 @@ +build/main_c.o: src/main.c include/uart.h include/mbox.h include/shell.h \ + include/string.h diff --git a/lab1/build/main_c.o b/lab1/build/main_c.o new file mode 100644 index 0000000000000000000000000000000000000000..09dae7daaf7430bd7fb6a9d4417527f873040d58 GIT binary patch literal 1480 zcmbu8&ubG=5XZlp?GJy1QmqFeY8NbGp?xIML+vS2+JY1np$DN5Ht9-&*)3#WAZ?+& z_9}SQv;GAhtvCMxd(;2HTQ5OpcHhvK*X^ZF*v!o5y_q*N`}SyUbG_tw5b^L8=bljD zN9o+IXJ#E`+{EzU+n1q__k=$1GaL9nhX>z3pZJYaY^<)X1dq3x{Y3YJr)o)67i;~@ zs~tY6s_K%e&F37`Sx&&)e~q!h1Fuq^ML_JX;rCcSo0|Su`sA(s{xxOrrHXqP!=JxJ z8~nl!0iS+F;!`G9u4SNTQk-YP-Ar}apKmM0aUsd z>##{$_j279s~2@crK5p{+6i?C)l5^U)@~d}39)2XM{486)?%u|);p+dd(>{c?S*k< z%J^>;PzHXR?whLC(Y-`T;+a0GTgm^+a}IcoWqs{ zayaKz<7*VlIi*fAGm-N-zb$gU=oMNN+unC>v7K}gcJTFSvCdVAe$dIp7Xl1CxkN-_mCY+-2QLTT2Xx46!pf6 IWz&uS2U9Cmga7~l literal 0 HcmV?d00001 diff --git a/lab1/build/mbox_c.d b/lab1/build/mbox_c.d new file mode 100644 index 000000000..775d28e6c --- /dev/null +++ b/lab1/build/mbox_c.d @@ -0,0 +1 @@ +build/mbox_c.o: src/mbox.c include/gpio.h diff --git a/lab1/build/mbox_c.o b/lab1/build/mbox_c.o new file mode 100644 index 0000000000000000000000000000000000000000..3b6e85aa9a14cf290831ae01ba63b62346c9ce4d GIT binary patch literal 1624 zcmbtU&ubGw6#h1wT7QI+rUk`Dvxg!oc1Wb4=_Ol=7DN<^1wEykbhVIdg4qp34_eVb zKu;dM2wuHOZvG1jdS1bQz@GGCd~Y&i*2#L&FU-6*-}^Q5W;TznT)&#JENEDGhsjE_ zz-@b?yHa(L!!eAW;zL|RHLkf;D~AG^o&)X=w2K7?I3JfVEIIZkEWG@P_{{;?h9%&B zYc#rr#WDA#HgKQC_L^<*M@NVp)_|MdjR>M_!%{upVw9J2-7EheHvQ6IQzjFKC6RVhoad0~PB+Dv#p0BO{by5H=4YmO zKK48gM!HXQ*%Avh7ZT@^ePT<{=ng~^%L6R$%7vWjO|RW%v(9sgj&hU<1-;M92EVWD zrvEd=oBl<`&rqI>(xnjLgCO!65Mk6C%RR02{I(||e-J_JdXWdw2t$ZwHwgR=ah-1D zi_II`D`Dg{TM*LS->cv4d4ZoS@jtpl!F;>sO}fM}e)o60oO&Tk#Ph3hm0gQ{)r1{I z93jbd#_wtJ&d(^`e34&OoGCa*5*KK}IsY}jLb05)Od|ub42My)6P@@Zs> z?@h)1@n(qA@#emC|8%Wuq@?vfRtfe03HP7BJ{_-l-lkcbD7b3>j*|S%@G#>!ui1N| bu%nWm;za^xTjt4@7XMwv-$}%>YR3Np@kE17 literal 0 HcmV?d00001 diff --git a/lab1/build/shell_c.d b/lab1/build/shell_c.d new file mode 100644 index 000000000..f31e638e0 --- /dev/null +++ b/lab1/build/shell_c.d @@ -0,0 +1,2 @@ +build/shell_c.o: src/shell.c include/uart.h include/string.h \ + include/shell.h include/mbox.h include/system.h diff --git a/lab1/build/shell_c.o b/lab1/build/shell_c.o new file mode 100644 index 0000000000000000000000000000000000000000..eb29ff0268e4162042a3f615a13fb02e6b7fb1df GIT binary patch literal 3856 zcmbuCO>7%g5XZ;a6au74=x3xvzq{Dk zKHT3wxwrLQlDj($4=EStxv@K3Ab)29;B6-dZ|EAm{1X7jvc`W5o#O|4w_Laz^f0cdmY4yC=KjdL7Rw%tott zwT84RwRzPDtA4EFN;OgxS9Q;CCfP}TE$GZ!@@j}K2Vu>fgwQJmL7XJaEAGSosvWtoLaS!ThZF8o+R zx;dT^G^(oGEO@jFraA-30W^aa445eCTkuF1A4YOSn>Ts>$c{6=&m)p&i~jR?$r^Gf zXp5<@FHkBVO&f?>#4ut#Syqcv0Qf{io<(jI>~`ayUDo`PJ2LXiXF-qO+u%c z%e=C~&N7#Ig`a0mI#04s%_a6lN9K?-EIPthIiGZnuusif?2C@nx5iv_guBd5or<9& z^VJL;;f)?TEkj58wBN|29^oIPI9V6{`D``}Wv>!?z+CjdK*STcqOFb72ec_ih9lg$Retw5A-q(K02k#}} zGaOqr^6$$SJKC(rP6=#$Q>Sf3ywIyTcI>rcuw5s1z%E4**kO=%=ogmfW6Td?&%W^L z%Bd)J%2zOfhIy6Zdg#=G+;fYJW2e;-Hy(896aC{Q-jpkCVo%e;ET=>!>qlc{ yysTf=+%#mB7i602Ai2Se@$~!BTsuT?o%hW)bu=^YpT5(w##gw0M;lA7IsRYh+>30V6Mg55cj+cnGP0+NAaX1<+&GMk&bJ3Kkcc^-^;_`oDH6d2?tu^5K}1?2I9 z`lu3!CkebqWq*_;$%gcB-T;Q|zkuRBP-{Hk=ODn@Ym)4d{P~;eCLRA5`I(aeKCI!a zRz96%nU7!!r+1#_DG9LeC=3@4U!i<8qyOTVJH?c)&)}OgII06wTZp1&97nN|eP!a# zZ5v(LxlVthmO7N^V#_*aXYP?BzGQKsV_t>4#g8psusFi_rmJL=yy~a^(nP8~PzYO6 zNrW^e!hZWohD^g|ucz!TbH^o8@;h5_ItV8>Dc9Oop@f;cA;K=QVpqRSXZ%0StKTIp z_nbBVDV^D7zZ2#=^zaS}dTjgDgI;LJ{khKQi<)y;)>reW&&#?G?=5RxJ@0~hcb2|s Y-4-X7Y5YglD9X~;^-yL{jlk9a0^h|z1ONa4 literal 0 HcmV?d00001 diff --git a/lab1/build/string_c.d b/lab1/build/string_c.d new file mode 100644 index 000000000..9c2847ac5 --- /dev/null +++ b/lab1/build/string_c.d @@ -0,0 +1 @@ +build/string_c.o: src/string.c include/string.h diff --git a/lab1/build/string_c.o b/lab1/build/string_c.o new file mode 100644 index 0000000000000000000000000000000000000000..50a04168795ddd5159ce9905b3a39415b0a0084d GIT binary patch literal 2168 zcmbtU&r4KM6h6;4HkPK9f`XwFSQO~vO}S{?^g>EVu?QtvP0#U_p>MRACyWhbQH!89 zf{QkV?JC;0iHQ0K5~5x4M*0JCIg9Ca&VA?No!eX0fthp8cYfXb-Fx5qg{g}zh5=Fx zcn5o)L;)(Td$uD?2Rfh~qR+4$rlDRlp&q84df1EFMBRW_Z08F+4^hp04z~cQz)D*|r8z0U5w?_5D>xKy%VHd8W z9p`pA*c&!+O>bh`cv5SRG4dPLPp=Z|I0taeJ6KCKvX`uh9>)8Pa8?S}C*qh-vuXcg zzsLvejrL?j(G2Baomi{ji`Th>c@z_z(JbU-KkXSg%1}?{u!Yux93I1-cs4nnvt7e_ zoU!}hH_u=`U}AiHEOT;pZnYS!W^&f3WshW6g_pf|+P3UbD|;%&;gC2>0ORgeNL2=m z{*FQDL9CDQN2Jep+WAg^qiEWUpN;X%^VAD->c@AC#_=m0A64R$9H+i39CtWAjg>U( zG2`hsLwtv8{nWo(tNA_)&$>_Qw~bE zi?^%-3{_xgp4@`JB9t4DTJnm*TUi6&^9!hiJc||dW4{izNxfC@n41{*qTp)&PX$+x zp6(n;EB0@RP4O@HBXP;g4ChE(?my6Q$=6d2m%M;gUh@NY4s}q9^@6lY-jZttUL^o) z-VI!^=E`NT3d_Fl6%i{g2c9)CJv&kk+`=MQBHdfa-z>Sl$K(E6Wv~Msp?(t`#7H*z zd}EK^O0)E%OPJFPgTsk87{~9Cn1kP9A@o*BPT-G5=r8K4HkWcqba)ss>iMtrS?+10 zRz=RI{;J6NQjcL!+G<|YB~t==?q#l5@1#g)U`webQ}QR_OK2qVzs3AlIFb0LuZOIc x{L^~=nvK{NgA2T1`i{|0ucy8`_Xt57&p$(sBKrOhV=Sq@k3VVGm0B|O`ak;~459!4 literal 0 HcmV?d00001 diff --git a/lab1/build/system_c.d b/lab1/build/system_c.d new file mode 100644 index 000000000..869c7c11f --- /dev/null +++ b/lab1/build/system_c.d @@ -0,0 +1,2 @@ +build/system_c.o: src/system.c include/system.h include/uart.h \ + include/mbox.h diff --git a/lab1/build/system_c.o b/lab1/build/system_c.o new file mode 100644 index 0000000000000000000000000000000000000000..6c7a32bfe2a0fa632fd7b05cbeb9e138925257a8 GIT binary patch literal 3856 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 literal 0 HcmV?d00001 diff --git a/lab1/include/gpio.h b/lab1/include/gpio.h new file mode 100644 index 000000000..399ae80f2 --- /dev/null +++ b/lab1/include/gpio.h @@ -0,0 +1,25 @@ +#ifndef GPIO_H +#define GPIO_H + +#define MMIO_BASE 0x3F000000 + +#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000)) +#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) +#define GPFSEL2 ((volatile unsigned int*)(MMIO_BASE+0x00200008)) +#define GPFSEL3 ((volatile unsigned int*)(MMIO_BASE+0x0020000C)) +#define GPFSEL4 ((volatile unsigned int*)(MMIO_BASE+0x00200010)) +#define GPFSEL5 ((volatile unsigned int*)(MMIO_BASE+0x00200014)) +#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) +#define GPSET1 ((volatile unsigned int*)(MMIO_BASE+0x00200020)) +#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) +#define GPLEV0 ((volatile unsigned int*)(MMIO_BASE+0x00200034)) +#define GPLEV1 ((volatile unsigned int*)(MMIO_BASE+0x00200038)) +#define GPEDS0 ((volatile unsigned int*)(MMIO_BASE+0x00200040)) +#define GPEDS1 ((volatile unsigned int*)(MMIO_BASE+0x00200044)) +#define GPHEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200064)) +#define GPHEN1 ((volatile unsigned int*)(MMIO_BASE+0x00200068)) +#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile unsigned int*)(MMIO_BASE+0x0020009C)) + +#endif diff --git a/lab1/include/mbox.h b/lab1/include/mbox.h new file mode 100644 index 000000000..46160f821 --- /dev/null +++ b/lab1/include/mbox.h @@ -0,0 +1,26 @@ +/* a properly aligned buffer */ +/* use this buffer(global variable) directly and the mbox_call will use it after call*/ +/* mbox format https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface */ +/* mbox address need to be aligned to 16 bytes */ +extern volatile unsigned int mbox[36]; + +#define MBOX_REQUEST 0 + +/* channels */ +#define MBOX_CH_POWER 0 +#define MBOX_CH_FB 1 +#define MBOX_CH_VUART 2 +#define MBOX_CH_VCHIQ 3 +#define MBOX_CH_LEDS 4 +#define MBOX_CH_BTNS 5 +#define MBOX_CH_TOUCH 6 +#define MBOX_CH_COUNT 7 +#define MBOX_CH_PROP 8 + +/* tags */ +#define GET_BOARD_REVISION 0x10002 +#define MBOX_TAG_GETSERIAL 0x10004 +#define GET_ARM_MEMORY 0x10005 +#define MBOX_TAG_LAST 0 + +int mbox_call(unsigned char ch); \ No newline at end of file diff --git a/lab1/include/shell.h b/lab1/include/shell.h new file mode 100644 index 000000000..74bd0aa42 --- /dev/null +++ b/lab1/include/shell.h @@ -0,0 +1,8 @@ +#ifndef SHELL_H +#define SHELL_H + +void shell(); +void do_cmd(char* cmd); +void print_system_messages(); + +#endif \ No newline at end of file diff --git a/lab1/include/string.h b/lab1/include/string.h new file mode 100644 index 000000000..8123bc2d4 --- /dev/null +++ b/lab1/include/string.h @@ -0,0 +1,9 @@ +#ifndef STRING_H +#define STRING_H + +int strcmp (const char * s1, const char * s2 ); +char* strcat (char *dest, const char *src); +unsigned long long strlen(const char *str); +char* strcpy (char *dest, const char *src); +char* memcpy (void *dest, const void *src, unsigned long long len); +#endif \ No newline at end of file diff --git a/lab1/include/system.h b/lab1/include/system.h new file mode 100644 index 000000000..97cb9ab7c --- /dev/null +++ b/lab1/include/system.h @@ -0,0 +1,6 @@ +int get_board_revision(unsigned int* board_revision); +int get_arm_memory_info(unsigned int* base_addr,unsigned int* size); +void set(long addr, unsigned int value); +void reboot(); +void reset(int tick); +void cancel_reset(); \ No newline at end of file diff --git a/lab1/include/uart.h b/lab1/include/uart.h new file mode 100644 index 000000000..1c6bde5de --- /dev/null +++ b/lab1/include/uart.h @@ -0,0 +1,15 @@ +#ifndef UART_H +#define UART_H + +#define MAX_BUF_SIZE 0x100 + +void uart_init(); +void uart_putc(char c); +char uart_getc(); +int uart_puts(char *s); +char* uart_gets(char *buf); +int uart_printf(char *s); +void uart_hex(unsigned int d); +void disable_uart(); + +#endif diff --git a/lab1/kernel8.img b/lab1/kernel8.img new file mode 100644 index 0000000000000000000000000000000000000000..85e666bf88e544e02d0a53f7e681ee09511b9b62 GIT binary patch literal 3272 zcmb7HUu;uV82|2C-Ec#ot!!avPa_XF0^0~CmYDPojWH4vsU!HtI(lUdUCY{mKp(hM zp5Q?)Su$UYn?6h>Mjwo(i3$TBOpMXZV4}XIU-|V%5!QvYpy^V%g?bt?_=_kU`~Ep%r(1|(ad37+ z(Vi%{VSjAG_XjDea0b02V_6TDZE9|sLm2ic;7FW{fD_M=vp#my@7Vl4C>&OyEM%}4bRIV<&5-kS9}pYD11JZ~oB`*4N^4I;mnX?nNwIML)v z8{3v**oZTddiRVmgY^tM{iE+sQP@uZz$4b*V+;kj?=aVXhKL4v&UIu0SFhaoP{sbW zjNRQtHNTgt8(4RfSu?`qc-TX{$uHPWFX|vnTU=mR&ih;wGxz<$Y1sP&7`A&=W7}v; zy>c_~@zs(K)^)q#D@D~O*jKk%^RAgmTIeICLYRe2r{Q~v~bFkc6L z+5>&WHP1Gi@m$Z+9(Xj#wy>>9j`14&!EbygjoF+Vwtp`)Hu0}N$a>(Gu^h+wu<8Yb(ZjwV zYS$RrPLYE;hRt+Ho)zrzIlWYG++7`me-n9YrJ5H)?pkp!oftzHqZm7b8o(Z(iLBXZ zum`!^s~|^Q$6N=9&BNTSm`TKR5FIwA*D0bCHvH=~%i(+3-QoK4+Tj;D-->&Hm_Al@ zW?b^x%^J>gQk{pcTXpA_^niiSNz{U~2wm1;d=z`S*5!Q%Umw0?eL&85w!!>m%|p)I zm=pIqwxRF2%vTWSB5*8|Ib&bQ3Ev$LITCC$$YBe|gB&JcQ`WfhGw(qkKK`D-{gFOa z$p>*?7<{2Nf%<@MRj+Xmmgd|m6Zn1@ZH>JN?w=ivb$oNvJk~Vt!W?(@H{^)NC>u8@Rt~@tIkL zkAWE1%_qoNe7oZILBMT#O>Qd3Mi=i*Qqcs`Y}?n9jNti&GY2DrP=k@I#i;`=dK!+Wav zY#D2qdvK4;+F!tNE#W<;zH38!oZ~Wo$TRgiSv|LVoebu<>$0v4>XZ7v2l_MI=lLu} zpK}Cz9U3>JaPt8!1Kcb)@_m+gyU#huGMVQGdPSL>oho;i$?bD40p}ve?_!j?X20_+ z=H9EgzsJaVMPrBh9h}^k42X+Mf|d zUD0Q0-gi6S+s5Aw-Q$2EyfftQa3M3Cx5Ri+jGeMdXGPg6rY#LA!K8IMB! z_KTCHTwz>{kL1ci?vGl9Qwq+wd~rGMMY(mPSjuM;RI-MP#c>JPFM`GRh$XVt>D)0( z`pFkzYnc+(3QBaiaH3FrqacnIM@KV-Y(iv?XL1Fi1I0`!3xlU~P(L-h?aX&RHwu+M@pZLa!ej{{sW+s#E{~ literal 0 HcmV?d00001 diff --git a/lab1/linker.ld b/lab1/linker.ld new file mode 100644 index 000000000..066df7b90 --- /dev/null +++ b/lab1/linker.ld @@ -0,0 +1,19 @@ +SECTIONS +{ + . = 0x80000; + .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 = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab1/src/main.c b/lab1/src/main.c new file mode 100644 index 000000000..87f8e7f37 --- /dev/null +++ b/lab1/src/main.c @@ -0,0 +1,12 @@ +#include "uart.h" +#include "mbox.h" +#include "shell.h" +#include "string.h" + +void main() +{ + // set up serial console + uart_init(); + + shell(); +} diff --git a/lab1/src/mbox.c b/lab1/src/mbox.c new file mode 100644 index 000000000..a0b4c4412 --- /dev/null +++ b/lab1/src/mbox.c @@ -0,0 +1,37 @@ +#include "gpio.h" + +/* mailbox message buffer */ +volatile unsigned int __attribute__((aligned(16))) mbox[36]; + +#define VIDEOCORE_MBOX (MMIO_BASE+0x0000B880) +#define MBOX_READ ((volatile unsigned int*)(VIDEOCORE_MBOX+0x0)) +#define MBOX_POLL ((volatile unsigned int*)(VIDEOCORE_MBOX+0x10)) +#define MBOX_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX+0x14)) +#define MBOX_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX+0x18)) +#define MBOX_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX+0x1C)) +#define MBOX_WRITE ((volatile unsigned int*)(VIDEOCORE_MBOX+0x20)) +#define MBOX_RESPONSE 0x80000000 // mbox[1] = 0x80000000 -> request successful +#define MBOX_FULL 0x80000000 +#define MBOX_EMPTY 0x40000000 + +/** + * Make a mailbox call. Returns 0 on failure, non-zero on success + */ +int mbox_call(unsigned char ch) // Mailbox 0 define several channels, but we only use channel 8 (CPU->GPU) for communication. +{ + unsigned int r = (((unsigned int)((unsigned long)&mbox)&~0xF) | (ch&0xF)); + //wait until we can write to the mailbox + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_FULL); + //write the address of our message to the mailbox with channel identifier + *MBOX_WRITE = r; + //now wait for the response + while(1) { + //is there a response?wait until empty flag unset + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_EMPTY); + //is it a response to our message? + if(r == *MBOX_READ) + //is it a valid successful response? + return mbox[1]==MBOX_RESPONSE; + } + return 0; +} diff --git a/lab1/src/shell.c b/lab1/src/shell.c new file mode 100644 index 000000000..076a6b9a3 --- /dev/null +++ b/lab1/src/shell.c @@ -0,0 +1,58 @@ +#include "uart.h" +#include "string.h" +#include "shell.h" +#include "mbox.h" +#include "system.h" + +void shell() +{ + char cmd[MAX_BUF_SIZE]; + print_system_messages(); + while(1) + { + uart_printf("# "); + uart_gets(cmd); + do_cmd(cmd); + } +} + +void do_cmd(char* cmd) +{ + if(strcmp(cmd,"help")==0) + { + uart_puts("help : print this help menu"); + uart_puts("hello : print Hello World!"); + uart_puts("reboot : reboot the device"); + } + else if((strcmp(cmd,"hello")==0)) + { + uart_puts("Hello World!"); + } + else if((strcmp(cmd,"reboot")==0)) + { + reboot(); + }else + { + uart_puts("Unknown command! again"); + } +} + +void print_system_messages() +{ + unsigned int board_revision; + get_board_revision(&board_revision); + uart_printf("Board revision is : 0x"); + uart_hex(board_revision); + uart_puts(""); + + unsigned int arm_mem_base_addr; + unsigned int arm_mem_size; + + get_arm_memory_info(&arm_mem_base_addr,&arm_mem_size); + uart_printf("ARM memory base address in bytes : 0x"); + uart_hex(arm_mem_base_addr); + uart_puts(""); + uart_printf("ARM memory size in bytes : 0x"); + uart_hex(arm_mem_size); + uart_puts(""); +} diff --git a/lab1/src/start.S b/lab1/src/start.S new file mode 100644 index 000000000..ffd92918f --- /dev/null +++ b/lab1/src/start.S @@ -0,0 +1,26 @@ +.section ".text.boot" + +.globl _start +_start: + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, 2f +1: wfe + b 1b +2: // cpu id == 0 + // set top of stack just before our code (stack grows to a lower address per AAPCS64) + ldr x1, =_start + mov sp, x1 + + // clear bss + ldr x1, =__bss_start + ldr w2, =__bss_size +3: cbz w2, 4f + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, 3b + + // jump to C code, should not return +4: bl main + // for failsafe, halt this core too + b 1b diff --git a/lab1/src/string.c b/lab1/src/string.c new file mode 100644 index 000000000..de4783cae --- /dev/null +++ b/lab1/src/string.c @@ -0,0 +1,45 @@ +#include "string.h" +#include + +int strcmp (const char *p1, const char *p2) +{ + const unsigned char *s1 = (const unsigned char *) p1; + const unsigned char *s2 = (const unsigned char *) p2; + unsigned char c1, c2; + do + { + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0') + return c1 - c2; + } + while (c1 == c2); + return c1 - c2; +} + +char* strcat (char *dest, const char *src) +{ + strcpy (dest + strlen (dest), src); + return dest; +} + +char* strcpy (char *dest, const char *src) +{ + return memcpy (dest, src, strlen (src) + 1); +} + +unsigned long long strlen(const char *str) +{ + size_t count = 0; + while((unsigned char)*str++)count++; + return count; +} + +char* memcpy (void *dest, const void *src, unsigned long long len) +{ + char *d = dest; + const char *s = src; + while (len--) + *d++ = *s++; + return dest; +} \ No newline at end of file diff --git a/lab1/src/system.c b/lab1/src/system.c new file mode 100644 index 000000000..7c4201bdc --- /dev/null +++ b/lab1/src/system.c @@ -0,0 +1,79 @@ +#include "system.h" +#include "uart.h" +#include "mbox.h" + +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + +//For all return 0 -> success , -1 failure + +int get_board_revision(unsigned int* board_revision) +{ + mbox[0] = 7*4; // length of the message + mbox[1] = MBOX_REQUEST; // request code + mbox[2] = GET_BOARD_REVISION; // tag identifier + mbox[3] = 4; // value buffer size in bytes + mbox[4] = 0; // request codes : b31 clear, b30-b0 reversed + mbox[5] = 0; // clear output buffer + mbox[6] = MBOX_TAG_LAST; // end tag + // send the message to the GPU and receive answer if success + if (mbox_call(MBOX_CH_PROP)) { + *board_revision = mbox[5]; + return 0; + } else { + uart_puts("Unable to query serial!"); + *board_revision = mbox[5] = -1; + return -1; + } +} + +int get_arm_memory_info(unsigned int* base_addr,unsigned int* size) +{ + /* + GET arm_memory address and size + */ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // request code + mbox[2] = GET_ARM_MEMORY; // tag identifier + mbox[3] = 8; // value buffer size in bytes + mbox[4] = 0; // request codes : b31 clear, b30-b0 reversed + mbox[5] = 0; // clear output buffer ( u32: base address in bytes ) + mbox[6] = 0; // clear output buffer ( u32: size in bytes ) + mbox[7] = MBOX_TAG_LAST; // end tag + + // send the message to the GPU and receive answer if success + if (mbox_call(MBOX_CH_PROP)) { + *base_addr = mbox[5]; + *size = mbox[6]; + return 0; + } else { + uart_puts("Unable to query serial!"); + return -1; + } +} + +void set(long addr, unsigned int value) +{ + volatile unsigned int* point = (unsigned int*)addr; + *point = value; +} + +void reboot() +{ + //disable_uart(); + reset(1); // timeout = 1/16th of a second? +} + +void reset(int tick) +{ // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick + while(1); // hang until reboot +} + +void cancel_reset() +{ + set(PM_RSTC, PM_PASSWORD | 0); // full reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} diff --git a/lab1/src/uart.c b/lab1/src/uart.c new file mode 100644 index 000000000..27752e0e2 --- /dev/null +++ b/lab1/src/uart.c @@ -0,0 +1,176 @@ +#include "gpio.h" +#include "uart.h" + +/* Auxilary mini UART registers */ +#define AUX_ENABLE ((volatile unsigned int*)(MMIO_BASE+0x00215004)) +#define AUX_MU_IO ((volatile unsigned int*)(MMIO_BASE+0x00215040)) +#define AUX_MU_IER ((volatile unsigned int*)(MMIO_BASE+0x00215044)) +#define AUX_MU_IIR ((volatile unsigned int*)(MMIO_BASE+0x00215048)) +#define AUX_MU_LCR ((volatile unsigned int*)(MMIO_BASE+0x0021504C)) +#define AUX_MU_MCR ((volatile unsigned int*)(MMIO_BASE+0x00215050)) +#define AUX_MU_LSR ((volatile unsigned int*)(MMIO_BASE+0x00215054)) +#define AUX_MU_MSR ((volatile unsigned int*)(MMIO_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE+0x0021505C)) +#define AUX_MU_CNTL ((volatile unsigned int*)(MMIO_BASE+0x00215060)) +#define AUX_MU_STAT ((volatile unsigned int*)(MMIO_BASE+0x00215064)) +#define AUX_MU_BAUD ((volatile unsigned int*)(MMIO_BASE+0x00215068)) + +/** + * Set baud rate and characteristics (115200 8N1) and map to GPIO + */ +void uart_init() +{ + register unsigned int r; + + /* initialize UART */ + *AUX_ENABLE |=1; // Set AUXENB register to enable mini UART. Then mini UART register can be accessed. + *AUX_MU_CNTL = 0; // Set AUX_MU_CNTL_REG to 0. Disable transmitter and receiver during configuration. + *AUX_MU_IER = 0; // Set AUX_MU_IER_REG to 0. Disable interrupt because currently you don’t need interrupt. + *AUX_MU_LCR = 3; // Set AUX_MU_LCR_REG to 3. Set the data size to 8 bit. + *AUX_MU_MCR = 0; // Set AUX_MU_MCR_REG to 0. Don’t need auto flow control. + *AUX_MU_IIR = 0xc6; // disable interrupts + *AUX_MU_BAUD = 270; // 115200 baud + /* map UART1 to GPIO pins */ + r=*GPFSEL1; + r&=~((7<<12)|(7<<15)); // gpio14, gpio15 + r|=(2<<12)|(2<<15); // alt5 + *GPFSEL1 = r; + *GPPUD = 0; // enable pins 14 and 15 (disable pull up/down) + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = (1<<14)|(1<<15); + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = 0; // flush GPIO setup + *AUX_MU_CNTL = 3; // enable Tx, Rx + + while((*AUX_MU_LSR&0x01))*AUX_MU_IO; //clean rx data +} + + +void disable_uart() +{ + register unsigned int r; + *AUX_ENABLE &= ~(unsigned int)1; + *AUX_MU_CNTL = 0; + r=*GPFSEL1; + r|=((7<<12)|(7<<15)); // gpio14, gpio15 + r&=~(2<<12)|(2<<15); // alt5 + *GPFSEL1 = r; + *GPPUD = 2; // enable pins 14 and 15 (pull down) + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = (1<<14)|(1<<15); + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = 0; // flush GPIO setup +} + +/** + * Send a character + */ +void uart_putc(char c) { + unsigned int intc = c; + /* wait until we can send */ + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x20)); + /* write the character to the buffer */ + *AUX_MU_IO=intc; +} + +/** + * Receive a character + */ +char uart_getc() { + char r; + // wait until something is in the buffer + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x01)); + // read it and return + r = (char)(*AUX_MU_IO);//get input words from mini uart receive buffer + + /* + echo back + */ + if(r == '\r')//input enter + { + uart_puts("\r"); + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x40)); //wait for output success Transmitter idle + }else if(r == '\x7f') // backspace -> get del + { + uart_putc('\b'); + uart_putc(' '); + uart_putc('\b'); + }else + { + uart_putc(r); + } + //convert carrige return to newline + return r=='\r'?'\n':r; +} + +/** + * Display a string with newline + */ +int uart_puts(char *s) { + int i=0; + + while(*s) { + uart_putc(*s++); + i++; + } + uart_putc('\r'); + uart_putc('\n'); + + return i+2; +} + +/** + * get a string + */ +char* uart_gets(char *buf) +{ + int count; + char c; + char *s; + for (s = buf,count = 0; (c = uart_getc()) != '\n' && count!=MAX_BUF_SIZE-1 ;count++) + { + *s = c; + if(*s=='\x7f') + { + count--; + if(count==-1) + { + uart_putc(' '); // prevent back over command line # + continue; + } + s--; + count--; + continue; + } + s++; + } + *s = '\0'; + return buf; +} + +/** + * printf (TODO) + */ +int uart_printf(char *s) { + int i = 0; + while(*s) { + uart_putc(*s++); + i++; + } + return i; +} + +/** + * Display a binary value in hexadecimal + */ +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_putc(n); + } +} From 5629a62016072cd3684f40aa8707c02337ce675a Mon Sep 17 00:00:00 2001 From: Chang-Tiger <67226478+Chang-Tiger@users.noreply.github.com> Date: Wed, 15 Mar 2023 19:57:22 +0800 Subject: [PATCH 2/2] Add files via upload --- lab2/Makefile | 48 +++++++ lab2/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 31790 bytes lab2/bootloader/Makefile | 50 +++++++ lab2/bootloader/bootloader.img | Bin 0 -> 4944 bytes lab2/bootloader/build/bootloader.elf | Bin 0 -> 73600 bytes lab2/bootloader/build/main_c.d | 2 + lab2/bootloader/build/main_c.o | Bin 0 -> 2336 bytes lab2/bootloader/build/mbox_c.d | 1 + lab2/bootloader/build/mbox_c.o | Bin 0 -> 1624 bytes lab2/bootloader/build/shell_c.d | 2 + lab2/bootloader/build/shell_c.o | Bin 0 -> 4384 bytes lab2/bootloader/build/start_s.d | 1 + lab2/bootloader/build/start_s.o | Bin 0 -> 1208 bytes lab2/bootloader/build/string_c.d | 1 + lab2/bootloader/build/string_c.o | Bin 0 -> 2168 bytes lab2/bootloader/build/system_c.d | 2 + lab2/bootloader/build/system_c.o | Bin 0 -> 4712 bytes lab2/bootloader/build/uart_c.d | 1 + lab2/bootloader/build/uart_c.o | Bin 0 -> 3856 bytes lab2/bootloader/include/gpio.h | 25 ++++ lab2/bootloader/include/mbox.h | 26 ++++ lab2/bootloader/include/shell.h | 8 ++ lab2/bootloader/include/string.h | 9 ++ lab2/bootloader/include/system.h | 14 ++ lab2/bootloader/include/uart.h | 16 +++ lab2/bootloader/linker.ld | 22 +++ lab2/bootloader/src/main.c | 44 ++++++ lab2/bootloader/src/mbox.c | 37 ++++++ lab2/bootloader/src/shell.c | 63 +++++++++ lab2/bootloader/src/start.S | 33 +++++ lab2/bootloader/src/string.c | 45 +++++++ lab2/bootloader/src/system.c | 121 +++++++++++++++++ lab2/bootloader/src/uart.c | 189 ++++++++++++++++++++++++++ lab2/build/cpio_c.d | 1 + lab2/build/cpio_c.o | Bin 0 -> 2520 bytes lab2/build/dtb_c.d | 2 + lab2/build/dtb_c.o | Bin 0 -> 4600 bytes lab2/build/filesystem_c.d | 2 + lab2/build/filesystem_c.o | Bin 0 -> 2664 bytes lab2/build/kernel8.elf | Bin 0 -> 78176 bytes lab2/build/main_c.d | 2 + lab2/build/main_c.o | Bin 0 -> 2976 bytes lab2/build/malloc_c.d | 1 + lab2/build/malloc_c.o | Bin 0 -> 1896 bytes lab2/build/mbox_c.d | 1 + lab2/build/mbox_c.o | Bin 0 -> 1624 bytes lab2/build/shell_c.d | 3 + lab2/build/shell_c.o | Bin 0 -> 5192 bytes lab2/build/sprintf_c.d | 1 + lab2/build/sprintf_c.o | Bin 0 -> 3488 bytes lab2/build/start_s.d | 1 + lab2/build/start_s.o | Bin 0 -> 1208 bytes lab2/build/string_c.d | 1 + lab2/build/string_c.o | Bin 0 -> 2800 bytes lab2/build/system_c.d | 2 + lab2/build/system_c.o | Bin 0 -> 3856 bytes lab2/build/uart_c.d | 2 + lab2/build/uart_c.o | Bin 0 -> 3960 bytes lab2/config.txt | 3 + lab2/include/cpio.h | 39 ++++++ lab2/include/dtb.h | 22 +++ lab2/include/filesystem.h | 9 ++ lab2/include/gpio.h | 25 ++++ lab2/include/malloc.h | 5 + lab2/include/mbox.h | 31 +++++ lab2/include/shell.h | 8 ++ lab2/include/sprintf.h | 27 ++++ lab2/include/string.h | 11 ++ lab2/include/system.h | 11 ++ lab2/include/uart.h | 15 +++ lab2/initramfs.cpio | Bin 0 -> 1024 bytes lab2/kernel8.img | Bin 0 -> 9072 bytes lab2/linker.ld | 20 +++ lab2/rootfs/testfile1 | 2 + lab2/rootfs/testfile112345 | 1 + lab2/rootfs/testfile2222 | 1 + lab2/send_kernel_to_bootloader.py | 31 +++++ lab2/src/cpio.c | 64 +++++++++ lab2/src/dtb.c | 103 ++++++++++++++ lab2/src/filesystem.c | 57 ++++++++ lab2/src/main.c | 37 ++++++ lab2/src/malloc.c | 14 ++ lab2/src/mbox.c | 37 ++++++ lab2/src/shell.c | 76 +++++++++++ lab2/src/sprintf.c | 158 ++++++++++++++++++++++ lab2/src/start.S | 30 +++++ lab2/src/string.c | 84 ++++++++++++ lab2/src/system.c | 82 ++++++++++++ lab2/src/uart.c | 192 +++++++++++++++++++++++++++ 89 files changed, 1974 insertions(+) create mode 100644 lab2/Makefile create mode 100644 lab2/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab2/bootloader/Makefile create mode 100644 lab2/bootloader/bootloader.img create mode 100644 lab2/bootloader/build/bootloader.elf create mode 100644 lab2/bootloader/build/main_c.d create mode 100644 lab2/bootloader/build/main_c.o create mode 100644 lab2/bootloader/build/mbox_c.d create mode 100644 lab2/bootloader/build/mbox_c.o create mode 100644 lab2/bootloader/build/shell_c.d create mode 100644 lab2/bootloader/build/shell_c.o create mode 100644 lab2/bootloader/build/start_s.d create mode 100644 lab2/bootloader/build/start_s.o create mode 100644 lab2/bootloader/build/string_c.d create mode 100644 lab2/bootloader/build/string_c.o create mode 100644 lab2/bootloader/build/system_c.d create mode 100644 lab2/bootloader/build/system_c.o create mode 100644 lab2/bootloader/build/uart_c.d create mode 100644 lab2/bootloader/build/uart_c.o create mode 100644 lab2/bootloader/include/gpio.h create mode 100644 lab2/bootloader/include/mbox.h create mode 100644 lab2/bootloader/include/shell.h create mode 100644 lab2/bootloader/include/string.h create mode 100644 lab2/bootloader/include/system.h create mode 100644 lab2/bootloader/include/uart.h create mode 100644 lab2/bootloader/linker.ld create mode 100644 lab2/bootloader/src/main.c create mode 100644 lab2/bootloader/src/mbox.c create mode 100644 lab2/bootloader/src/shell.c create mode 100644 lab2/bootloader/src/start.S create mode 100644 lab2/bootloader/src/string.c create mode 100644 lab2/bootloader/src/system.c create mode 100644 lab2/bootloader/src/uart.c create mode 100644 lab2/build/cpio_c.d create mode 100644 lab2/build/cpio_c.o create mode 100644 lab2/build/dtb_c.d create mode 100644 lab2/build/dtb_c.o create mode 100644 lab2/build/filesystem_c.d create mode 100644 lab2/build/filesystem_c.o create mode 100644 lab2/build/kernel8.elf create mode 100644 lab2/build/main_c.d create mode 100644 lab2/build/main_c.o create mode 100644 lab2/build/malloc_c.d create mode 100644 lab2/build/malloc_c.o create mode 100644 lab2/build/mbox_c.d create mode 100644 lab2/build/mbox_c.o create mode 100644 lab2/build/shell_c.d create mode 100644 lab2/build/shell_c.o create mode 100644 lab2/build/sprintf_c.d create mode 100644 lab2/build/sprintf_c.o create mode 100644 lab2/build/start_s.d create mode 100644 lab2/build/start_s.o create mode 100644 lab2/build/string_c.d create mode 100644 lab2/build/string_c.o create mode 100644 lab2/build/system_c.d create mode 100644 lab2/build/system_c.o create mode 100644 lab2/build/uart_c.d create mode 100644 lab2/build/uart_c.o create mode 100644 lab2/config.txt create mode 100644 lab2/include/cpio.h create mode 100644 lab2/include/dtb.h create mode 100644 lab2/include/filesystem.h create mode 100644 lab2/include/gpio.h create mode 100644 lab2/include/malloc.h create mode 100644 lab2/include/mbox.h create mode 100644 lab2/include/shell.h create mode 100644 lab2/include/sprintf.h create mode 100644 lab2/include/string.h create mode 100644 lab2/include/system.h create mode 100644 lab2/include/uart.h create mode 100644 lab2/initramfs.cpio create mode 100644 lab2/kernel8.img create mode 100644 lab2/linker.ld create mode 100644 lab2/rootfs/testfile1 create mode 100644 lab2/rootfs/testfile112345 create mode 100644 lab2/rootfs/testfile2222 create mode 100644 lab2/send_kernel_to_bootloader.py create mode 100644 lab2/src/cpio.c create mode 100644 lab2/src/dtb.c create mode 100644 lab2/src/filesystem.c create mode 100644 lab2/src/main.c create mode 100644 lab2/src/malloc.c create mode 100644 lab2/src/mbox.c create mode 100644 lab2/src/shell.c create mode 100644 lab2/src/sprintf.c create mode 100644 lab2/src/start.S create mode 100644 lab2/src/string.c create mode 100644 lab2/src/system.c create mode 100644 lab2/src/uart.c diff --git a/lab2/Makefile b/lab2/Makefile new file mode 100644 index 000000000..f036f3fb7 --- /dev/null +++ b/lab2/Makefile @@ -0,0 +1,48 @@ +# debug use CFLAGS='-g -O3' ASMFLAGS='-g -O3' +# Modify from +# https://github.com/s-matyukevich/raspberry-pi-os/blob/master/src/lesson01/Makefile +ARMGNU ?= aarch64-linux-gnu + +COPS = $(CFLAGS) -Wall -nostdlib -nostartfiles -ffreestanding -Iinclude #-ggdb #-D__FS_DEBUG #-D__DEBUG #-D__DEBUG_MM #-D__DEBUG_MM_ALLOC #-D__DEBUG_MM_SCHED +ASMOPS = $(ASMFLAGS) -Iinclude + +BUILD_DIR = build +SRC_DIR = src + +all : kernel8.img bootloader/bootloader.img + +clean : + rm -rf $(BUILD_DIR) *.img + make -C bootloader clean + +$(BUILD_DIR)/%_c.o: $(SRC_DIR)/%.c + mkdir -p $(@D) + $(ARMGNU)-gcc $(COPS) -MMD -c $< -o $@ + +$(BUILD_DIR)/%_s.o: $(SRC_DIR)/%.S + $(ARMGNU)-gcc $(ASMOPS) -MMD -c $< -o $@ + +C_FILES = $(wildcard $(SRC_DIR)/*.c) +ASM_FILES = $(wildcard $(SRC_DIR)/*.S) +OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o) +OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_s.o) + +DEP_FILES = $(OBJ_FILES:%.o=%.d) +-include $(DEP_FILES) + +kernel8.img: linker.ld $(OBJ_FILES) + $(ARMGNU)-ld -g -T linker.ld -o $(BUILD_DIR)/kernel8.elf $(OBJ_FILES) + $(ARMGNU)-objcopy -g $(BUILD_DIR)/kernel8.elf -O binary kernel8.img + +run: + qemu-system-aarch64 -M raspi3b -kernel kernel8.img -display none -serial null -serial stdio -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb + +run_debug: + qemu-system-aarch64 -M raspi3b -kernel kernel8.img -display none -serial null -serial stdio -s -S -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb + +connect_raspi: + sudo screen /dev/ttyUSB0 115200 + +bootloader/bootloader.img: + make -C bootloader + diff --git a/lab2/bcm2710-rpi-3-b-plus.dtb b/lab2/bcm2710-rpi-3-b-plus.dtb new file mode 100644 index 0000000000000000000000000000000000000000..3934b3a26eb82fd65dbcdfca6f6916da427a3fae GIT binary patch literal 31790 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 literal 0 HcmV?d00001 diff --git a/lab2/bootloader/Makefile b/lab2/bootloader/Makefile new file mode 100644 index 000000000..40e6c597f --- /dev/null +++ b/lab2/bootloader/Makefile @@ -0,0 +1,50 @@ +# debug use CFLAGS='-g' ASMFLAGS='-g' +# Modify from +# https://github.com/s-matyukevich/raspberry-pi-os/blob/master/src/lesson01/Makefile +ARMGNU ?= aarch64-linux-gnu + +COPS = $(CFLAGS) -Wall -nostdlib -nostartfiles -ffreestanding -Iinclude #-ggdb #-D__FS_DEBUG #-D__DEBUG #-D__DEBUG_MM #-D__DEBUG_MM_ALLOC #-D__DEBUG_MM_SCHED +ASMOPS = $(ASMFLAGS) -Iinclude + +BUILD_DIR = build +SRC_DIR = src + +all : bootloader.img + +clean : + rm -rf $(BUILD_DIR) *.img + +$(BUILD_DIR)/%_c.o: $(SRC_DIR)/%.c + mkdir -p $(@D) + $(ARMGNU)-gcc $(COPS) -MMD -c $< -o $@ + +$(BUILD_DIR)/%_s.o: $(SRC_DIR)/%.S + $(ARMGNU)-gcc $(ASMOPS) -MMD -c $< -o $@ + +C_FILES = $(wildcard $(SRC_DIR)/*.c) +ASM_FILES = $(wildcard $(SRC_DIR)/*.S) +OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o) +OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_s.o) + +DEP_FILES = $(OBJ_FILES:%.o=%.d) +-include $(DEP_FILES) + +bootloader.img: linker.ld $(OBJ_FILES) + $(ARMGNU)-ld -g -T linker.ld -o $(BUILD_DIR)/bootloader.elf $(OBJ_FILES) + $(ARMGNU)-objcopy -g $(BUILD_DIR)/bootloader.elf -O binary bootloader.img + +run: + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -display none -serial null -serial stdio + +run_pty: + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -display none -serial null -serial pty -initrd ../initramfs.cpio -dtb ../bcm2710-rpi-3-b-plus.dtb + +run_debug: + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -display none -serial null -serial stdio -dtb ../bcm2710-rpi-3-b-plus.dtb -s -S + +run_debug_pty: + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -display none -serial null -serial pty -s -S + +connect_raspi: + sudo screen /dev/ttyUSB0 115200 + diff --git a/lab2/bootloader/bootloader.img b/lab2/bootloader/bootloader.img new file mode 100644 index 0000000000000000000000000000000000000000..755a793d2c4ff3e5d65244384336eb446d656b99 GIT binary patch literal 4944 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 literal 0 HcmV?d00001 diff --git a/lab2/bootloader/build/bootloader.elf b/lab2/bootloader/build/bootloader.elf new file mode 100644 index 0000000000000000000000000000000000000000..5b91b206a23bfe34b7b10d62b234e102dccdecb4 GIT binary patch literal 73600 zcmeI1ZE#fO701tJBZ(3qB&jeGo0}G`FSrIoAvD4U6lpG`oWp%RB&|cOzmu_w$9WKfVL&pc>6!kOLBLU zFtq)8?zr6No^zh_@_SzHbK_%oZ`oKC2#~$1=vSnlYLzH#6ouv~n=q}WDhg8_%~iHF z%Esz-KO%kaYSa$SnL8Qp54@j`&oRC)=T?6?Mq(obgn$qb0zyCt2mv7=1cZPP5CTF# z2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF# z2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF# z2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF# z2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF# z2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF# z2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF# z2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF# z2nYcoAOwVf5D)@FKnMr{As_^VfDjM@|1*K3wEC^q>hO1?L_d!>!M8lmTNDk@!|RBO zd_POH_!~qk*F8=b*H_a6-}k)RpQ@taf55IuMXgo;b~WnzM+;gm7UKomNH$kRH%;jfuR+^!>^B<<-Bm&ok1qUsJaXTxT!B|OS?u`T)+nZd-+Z+|oq zq~i4cnw!5r^DI4vn2&|qTUKHW1Jnb)2Wk5q#cPR%r~9~OGKYB>Bh~NIz(9ce1q$7N z@VsZKy3qYP-|_r=+=IsMRkUrK?L=eF{T`dX`y?>ZIp0gTZow_B=d`F_;F^%fCluIZ1wPP0$H zJ>zoYAD@|+HXc~OKBj%dCt*$0pUIdxkEJ9+E6n! zY_>Vn(*tU(;E%`Ys}oae*XH1DpwrXm+bna|tP}K6bKZLy%xh?TEC}v37}G_#2XSx2 zeUX_zknwn``QB(`&@0&x`0^UyIfS~#&@K&y+fmPE?9NU0c^%QN0&=&{tVis!b;ome zY%bzryspL?LQX%{b2RY8*xc|q=EATZOFQTFdY$YC8^j#OJSv_=U+%;9jgZ-OqV@{Z z>min!ThOyT`{4T3dV!v6&Crzbnd_hW9M@2Gvo8k%hLKHG|SPoQ>6wx9Rjx~b=u zdSAQA*ItY^*8A1~_AJy(dLL6U15McDP@j%l=;n2b_y?(QNAbPSuuoBe-wnrGk)H#f zW3a`zBCkS&V`>|jwKmN-uo(4X9BsW< z`09Pp)NAXq^9W-&s@4t9AJjiqGt+zJq}n$f)Wvg{*XqR3OJ+YZa~S)FViG=<#XfR| z&c1NrZ`cEP525feoGs`ktcRNl)mm4A4lJ7{hP3YhY;3^={D0Bwn`7b*gyW> zhyE%jXI1eoH6A<{R~0+aW*@v?IkfI=UF-DyUe$(rd7dJUu5}o-s{IXhQ(X}()INKP z-%rc}GOUYH_B{t<=T3OfUOzd8)8C7#&ms84drY;NCHynnI@CP|KPA-Dih9o?4{nFi zp4=Po3~ohc$UONS#e5lx+he?br{)<9lGod%{chY;&r;_*d(1`_KpkQIY4SvUS!LKW5t{;n6u(2HPJ( zru3)Q7C&VDqVVWvRtEiHwEcOgy~4bAv4`PXLGL$|Y;JI{uI-tX8lOEwr57&PIk=0@ zt4&(Q`vB&wIEom^tCyM_&OgSlAD&E=e(Zr;&K)j!r3 zP49G_L_fRG@=z#5wAD?funXxz<)oE`*%IX{{{&ZCKZpEDTE z=5?z-o5^QlnWU3QJGni%yqgNeZeaU}j&Y+3j(@)B=vJSb?B^EW9eu5F`m>32UT2`> zDK|Z+&Dk!QDYx6CL|Zf2WW1HKE+?!E);Q)N-{(4U_mM=*CGzD0qcvr<#4>T$*^$kp zbU~=JZTIRnTuw9{cfK~5Qm_(v>3V1-aUDD(%fgqV?Rw_Z(IiU zc2o84&j*&&wa{Y7_!mFtd3RyrQs?~or>m;&e-keemaoL`$@89f0(Y%Tu}UrGF5H)0 z@Vrf0=X62QjCLP>+aNc6oWs>ef~h~h%iWaz0PYu|kF%h2e%s+WN3PiF)4vFD$48#` ziq?k@*B+_K`1G$rUV@(E+y31?{Ra@&f9!dW`}7f`=bCC!XCC?vt*^gVWu|Ld3f-`; zZ^YEp!EEq{jn%r3s%eWa<~HaTL(jaBlhSWCdfxcPtSYDr_cN1eF%N^zdUc5(SODGt;Wk_G2}c>Jf4TEjs))Z z^;-&k6ZB!zkK?j!2jm@)oBC8gTOaGULEi=ahq|8{vpv3i_d(x$ajMSBF@FyF?a=ew zKwhf;&|$LT~sVtUCOKBdw5g?02Ah54xFHIM82&{yDrrjc+wJ);H8@9GdYF zPoH?+^DMyl?F26%EW7OAv9_DPXJIB8eT}-G!w1Zzu6s6YSmWIAQ14(mKj^fFR)*Sc zSw5(qmVbRkTc~YiX!(s=ekm_n7gX8V_*3>ls-i>lW|9Z#jRiBwtBEG-@%y=gYG;(s zq17|WYsm7M@hDUNKYtK{{7oF8|Ujer!G?72|06I5p*dY@WLpmdo2N>3{mTTmQ+c z%KcdXn;OdHt1jukiZ0HQ|HE_3{aF78D*WU8b4kwU>Sp%yL4_Z#<%mCnLn|JNU7^<*D{Y$euCs6DI#Sp80wXKej(;_^bUAvL6_EpW%4` z&wSw!s_ZT2=arP`W!&pg*SU&);B{l)W#)f}vHz2i7fikC9Rb+~M&4uUwRz%Tt>V_3 z{B2$QQN{V6tJQp(@vJUv87#N!TAgE{xXQ?1tJe0+k+0h!uZMl*KGSII?fO#hURYgk zBp1ri(%rN)PW)vNicv0) zFM^%iFy9oEiYC(h%-;jJr+PEHaf{ru<^J`ZTO#*w-1y+#J&~Ty^;_9^L8Y zl#fU(noOGRZdzx}E@P4Y!K~~5=Frjl2N8|4istPH0~Z=eq!W2<(dX_aIEeJ}=K-?S zp9hnF1ppDDh9IKZypgQ;5He+;rZ|tN-`51P(CO2!9VUmtIHqWH)R-q${-6x)lxXkK?1d z?78aDJeCsOVHN7BayKF34_$wMd;WT3f$rbNXHMT`v$LYx&|u3+GrQmNMup3+OZ70r zb30`I{`NdqYx?u~z<=5J_P!QMe}8-KTW$I;_IF0x_OthUjLhb5&xc*6|42pu`ikc* zc;@((dD{LrSJ-PRx(}=PxnhV^kAjJR&PAyxt`h^W> XbQO=-Luc-PU9+})$mf%rmHqz%(0%FkKUs-=&vqm|>ISrTcA4b7#2k1S(Jmsk2_5-~9 zfpw5=pxqC~IMy^yV`#*B(fQ^a0e(*ZJ)EbyWlf|FSA)rYS;r?)hv>`f^z?)_ zxR5C2oRT)KkLt1Ecu9=nPe)>UY*de5lpIq5oECS0(AsTiTs7#S!p=r+}1Y`5;TEU9@y^@M6{gx`lj^WnfZ3lPR%kc2UlUs?sI z^=}hgbjTlq**%*_&B{D2&|Bk8^|S;~;!QPt1WA{tey*4r+3k5=(Pv~mc=0?3A)eaSz6Poc1gU`HM{| zhoC7<{$4()cn@;9HzXKR{EUxZspD_d@t;#Xf_XZXP3o41^Rp15!-jh^Hz5eYq)mp_qM^nvyg%X4Lrzn6bj+~4Of9)EBDxzA0Qr$PCU;{Gt_{Rn#Tan`XC zsGWk;%WUB;v2@2?bwE#9js<$6SOh(p&t~l$vRvM=_1PN>!?-7s4?!31_Okh)U}bI3 z(*I>@7>$ooa{?I1NPbCGz4Q0WAc6)lgMre2)Dg5r$x%+=MW#Ggj?UK$iu+HjAr`O8fCm4aWok literal 0 HcmV?d00001 diff --git a/lab2/bootloader/build/mbox_c.d b/lab2/bootloader/build/mbox_c.d new file mode 100644 index 000000000..775d28e6c --- /dev/null +++ b/lab2/bootloader/build/mbox_c.d @@ -0,0 +1 @@ +build/mbox_c.o: src/mbox.c include/gpio.h diff --git a/lab2/bootloader/build/mbox_c.o b/lab2/bootloader/build/mbox_c.o new file mode 100644 index 0000000000000000000000000000000000000000..3b6e85aa9a14cf290831ae01ba63b62346c9ce4d GIT binary patch literal 1624 zcmbtU&ubGw6#h1wT7QI+rUk`Dvxg!oc1Wb4=_Ol=7DN<^1wEykbhVIdg4qp34_eVb zKu;dM2wuHOZvG1jdS1bQz@GGCd~Y&i*2#L&FU-6*-}^Q5W;TznT)&#JENEDGhsjE_ zz-@b?yHa(L!!eAW;zL|RHLkf;D~AG^o&)X=w2K7?I3JfVEIIZkEWG@P_{{;?h9%&B zYc#rr#WDA#HgKQC_L^<*M@NVp)_|MdjR>M_!%{upVw9J2-7EheHvQ6IQzjFKC6RVhoad0~PB+Dv#p0BO{by5H=4YmO zKK48gM!HXQ*%Avh7ZT@^ePT<{=ng~^%L6R$%7vWjO|RW%v(9sgj&hU<1-;M92EVWD zrvEd=oBl<`&rqI>(xnjLgCO!65Mk6C%RR02{I(||e-J_JdXWdw2t$ZwHwgR=ah-1D zi_II`D`Dg{TM*LS->cv4d4ZoS@jtpl!F;>sO}fM}e)o60oO&Tk#Ph3hm0gQ{)r1{I z93jbd#_wtJ&d(^`e34&OoGCa*5*KK}IsY}jLb05)Od|ub42My)6P@@Zs> z?@h)1@n(qA@#emC|8%Wuq@?vfRtfe03HP7BJ{_-l-lkcbD7b3>j*|S%@G#>!ui1N| bu%nWm;za^xTjt4@7XMwv-$}%>YR3Np@kE17 literal 0 HcmV?d00001 diff --git a/lab2/bootloader/build/shell_c.d b/lab2/bootloader/build/shell_c.d new file mode 100644 index 000000000..f31e638e0 --- /dev/null +++ b/lab2/bootloader/build/shell_c.d @@ -0,0 +1,2 @@ +build/shell_c.o: src/shell.c include/uart.h include/string.h \ + include/shell.h include/mbox.h include/system.h diff --git a/lab2/bootloader/build/shell_c.o b/lab2/bootloader/build/shell_c.o new file mode 100644 index 0000000000000000000000000000000000000000..a0e097b73552c16e0b633ea057c79912c960f4ec GIT binary patch literal 4384 zcmb_eQEMDk6u#R{HENpF)|x^>bE`#CY=@0RNP`cXMs2_?OAwV6`~muA!4S`xdro?DcNRfB?c|*EopZi> z?!9yG&b2qrzPTrt6D&FLrFiTyDnxtVW4oA|MX^uxiLEQ2f3lSqHv!s!XC0mnyFINj z){nNg2e+<#lh(Bd#3QVOF>kg9ifC_)2=T$UIWgajuN!_ui087nJ{G&VASpA?)p;9z z{}S(^IE8S5}o{0eF|%>I9S7v^2b$Q|m;HS5}gopG~| zMOCkazB(b3YAu%VzZ`~1J#;-4IdVQ)l}RYkl`AR=R9#-GB~{sUqeNScC``giSeLax z#;b9ne5W#s`6Zoy9C}IRMX7aF)f;G`mRcrdBdP_7?jXf|6*P4^=GDX9c{3@r7)EvP zsE8CcoF+_4a+0c&p1N48C?SkqAZc>fTq>cbGGh&c2o$ z)&15((7Of)Uk|x!oV4?WU?m7I1riq52R5Wg<#gyq9yEHf7T3Z67km;%<){!-b8kyu z`5~-)*^QNSJugx*>`WlbtBKl4H}c}zWo5_DOixeB(S>p|NSgALGwu{ljx|$n?88?I zPGQ^`JFamWdOzvhD~f1*CqeGF8ERxyxs-B)&R50*o$wu`$**tE8{29_bF5|O=BmV)iQJp87d0ONzk!Bvo zJ;LpE;Q2AnUCP7v425~_rk)Vom(7z<5wwe^IRvKdD`UPAk93CuMuwZ ztP{>Wqp*G`8(Qtmi}728BagYx_Xua60`Yum@i6{{!DGH}_br|x@qBIZF#f&4WA^id zfgdCr)h5~8=M3@xOgOI_m!hN%v5yo*^R z;mqG4{}^fJXPoy9dCc?3`+)fKOb&XSc$j~U{0Y*`&-iPE+x_$UAwFpEpQU`}UnhT- zH1jh)Pq^Lxc>_25Um~3OxlhmHXS{0gnD1fT;<-%j1#xA0tr~As-@+~_2CQo{}Bl^*s}d4Qv?jUxJ&~xRjo9u#NfzJjnT9>&KuLhcfpXT*2c% zwEE!wF$d)oJeX2I$B@scA?(i-rel2?f^3_4KiLzapq;x&^>+Vls&AO2VB7uU_hIJ# z(Z|mW)#LtQE!Xq@VL$fRSTc*GAVms319l%gc0GP~XH9jT-kVzxH^rVme&b}-x2S*D JEC$=I{|C5WuZaKv literal 0 HcmV?d00001 diff --git a/lab2/bootloader/build/start_s.d b/lab2/bootloader/build/start_s.d new file mode 100644 index 000000000..afcb7e88c --- /dev/null +++ b/lab2/bootloader/build/start_s.d @@ -0,0 +1 @@ +build/start_s.o: src/start.S diff --git a/lab2/bootloader/build/start_s.o b/lab2/bootloader/build/start_s.o new file mode 100644 index 0000000000000000000000000000000000000000..b8ad155a6f3d6a3bdaa700a4f7237b381b4b80f8 GIT binary patch literal 1208 zcmbW0u}T9$5QhKD9h#_xVqqX42?lKBK!}h+$Ra2f7TVdJ8xk;J4CJ+>30V6Mg55cj+cnGP0+NAaX1<+&GMk&bJ3Kkcc^-^;_`oDH6d2?tu^5K}1?2I9 z`lu3!CkebqWq*_;$%gcB-T;Q|zkuRBP-{Hk=ODn@Ym)4d{P~;eCLRA5`I(aeKCI!a zRz96%nU7!!r+1#_DG9LeC=3@4U!i<8qyOTVJH?c)&)}OgII06wTZp1&97nN|eP!a# zZ5v(LxlVthmO7N^V#_*aXYP?BzGQKsV_t>4#g8psusFi_rmJL=yy~a^(nP8~PzYO6 zNrW^e!hZWohD^g|ucz!TbH^o8@;h5_ItV8>Dc9Oop@f;cA;K=QVpqRSXZ%0StKTIp z_nbBVDV^D7zZ2#=^zaS}dTjgDgI;LJ{khKQi<)y;)>reW&&#?G?=5RxJ@0~hcb2|s Y-4-X7Y5YglD9X~;^-yL{jlk9a0^h|z1ONa4 literal 0 HcmV?d00001 diff --git a/lab2/bootloader/build/string_c.d b/lab2/bootloader/build/string_c.d new file mode 100644 index 000000000..9c2847ac5 --- /dev/null +++ b/lab2/bootloader/build/string_c.d @@ -0,0 +1 @@ +build/string_c.o: src/string.c include/string.h diff --git a/lab2/bootloader/build/string_c.o b/lab2/bootloader/build/string_c.o new file mode 100644 index 0000000000000000000000000000000000000000..50a04168795ddd5159ce9905b3a39415b0a0084d GIT binary patch literal 2168 zcmbtU&r4KM6h6;4HkPK9f`XwFSQO~vO}S{?^g>EVu?QtvP0#U_p>MRACyWhbQH!89 zf{QkV?JC;0iHQ0K5~5x4M*0JCIg9Ca&VA?No!eX0fthp8cYfXb-Fx5qg{g}zh5=Fx zcn5o)L;)(Td$uD?2Rfh~qR+4$rlDRlp&q84df1EFMBRW_Z08F+4^hp04z~cQz)D*|r8z0U5w?_5D>xKy%VHd8W z9p`pA*c&!+O>bh`cv5SRG4dPLPp=Z|I0taeJ6KCKvX`uh9>)8Pa8?S}C*qh-vuXcg zzsLvejrL?j(G2Baomi{ji`Th>c@z_z(JbU-KkXSg%1}?{u!Yux93I1-cs4nnvt7e_ zoU!}hH_u=`U}AiHEOT;pZnYS!W^&f3WshW6g_pf|+P3UbD|;%&;gC2>0ORgeNL2=m z{*FQDL9CDQN2Jep+WAg^qiEWUpN;X%^VAD->c@AC#_=m0A64R$9H+i39CtWAjg>U( zG2`hsLwtv8{nWo(tNA_)&$>_Qw~bE zi?^%-3{_xgp4@`JB9t4DTJnm*TUi6&^9!hiJc||dW4{izNxfC@n41{*qTp)&PX$+x zp6(n;EB0@RP4O@HBXP;g4ChE(?my6Q$=6d2m%M;gUh@NY4s}q9^@6lY-jZttUL^o) z-VI!^=E`NT3d_Fl6%i{g2c9)CJv&kk+`=MQBHdfa-z>Sl$K(E6Wv~Msp?(t`#7H*z zd}EK^O0)E%OPJFPgTsk87{~9Cn1kP9A@o*BPT-G5=r8K4HkWcqba)ss>iMtrS?+10 zRz=RI{;J6NQjcL!+G<|YB~t==?q#l5@1#g)U`webQ}QR_OK2qVzs3AlIFb0LuZOIc x{L^~=nvK{NgA2T1`i{|0ucy8`_Xt57&p$(sBKrOhV=Sq@k3VVGm0B|O`ak;~459!4 literal 0 HcmV?d00001 diff --git a/lab2/bootloader/build/system_c.d b/lab2/bootloader/build/system_c.d new file mode 100644 index 000000000..869c7c11f --- /dev/null +++ b/lab2/bootloader/build/system_c.d @@ -0,0 +1,2 @@ +build/system_c.o: src/system.c include/system.h include/uart.h \ + include/mbox.h diff --git a/lab2/bootloader/build/system_c.o b/lab2/bootloader/build/system_c.o new file mode 100644 index 0000000000000000000000000000000000000000..0d2f6a3a966fad8041c03fbccd44a69f7e080a7b GIT binary patch literal 4712 zcmbuCU1$_n6vxjvu}N#xm_!UU?T!#iD#?)4K#T}ZYORz?k<`#U2iL@%*>X= zNL^_k3i=Rf9#t#|wdh0N%0jWW^q~(v*g~Zbw#=47h3294sez{3bMBnmo!smNp(pIl zy}$cE=bn4+-I>XSBgbCfWEddLfX|`PlN6wTd!y}$rUP4{9o81_e!6DDm1sMxB3=S; zRxg^B35-#d{Zvb%Jr0$LJ#fP}+8XR4GNZlGPjw{P-HCP&wvEaJ#$8SU%weJ@)p~=@8%}!mFud%58p+tuv%+{YSiki(q2)m zYOPL{>Xow0A5e28uECdLKP_Ar)s4p17Qb3wpA=L@O`O|)#jJb}zkKq9w6&B|1?Tnz z)^%^qguRuP#u$!wuPw&04b&w4L_eWjKj#-BAM_Vzi_TZH3s&o?#{NWIvK{YreH5zO z;(9Dc7htS*!5NE2F}K+l-nOiJ&%=4=Bg~cd|5Ai;#8?aLh|rJPxEFJS|I|;^_d%7< zk%$xRt5j=Uu^+|6+Kol~FfRF`R*YlZLjb?epnsgRJb#pb+@=`OE{b#LVZ7FFM164_ zCW~$+?^$8Vnk#$$f)#jv&du+Evz}k{@>Y;L=N%wjP!6(LF9@tNUTDRGgdscQ7SDKA zZk9sC+_r6iqlXV4u=*!6@V4w}%WBGEVD znGKxI!47y*mmc!E6M1K%4&po@>&K5gJJ|fs2C>zQk81cha*8kGit~ibV}6rMA}8)RktG|T_IhC{FrgkHhULf z%|m)R%mDsY)0vX%Pp5tF-CU3>6`_zR&5N&e*3IXk?D}DPwj2gR>-vRs!7G&fg>!<21_EYt=?_{c8?vJWJ7|S>49p)!$&gQ{gw6)4X!;2;E_>uJ<$MYW|Nj`beW+(dhrs=>O8_ z|JLZ+aXn;e{vFKK{ChQeOQY}C=m#|V5sjYmAXD>kH2T*x`s2*i^K()Y=aeSStVSPd z^p}~d=WU6(dft|qtLN=eg41(dS{vUtN#7|UUi&oM(eUFMKEs^ONqZuGo;mGHlAllL zcO~?dgg(hXWG?H|!#x^vqUf#7sZ$1Qj+6`T>GeH2hUy3`~Qla1#ajaMhJ^ScelY{v5 z%$`L7xp_0`)4p5arza=%KQ0#f($dv8EC(6cG2Vx`NAI5NZ8vs_IqNYz=2yQV4ovTT zG*27rCqTov$@Ez(TOy)1q7&a)UAqn{U z8~YC^T;?yYuj06DC#79#p?Of%QhvnL{Cn8{aWW{j)%@w7>1O-a!!KjE*q`=~e5JqK yzh-j_7k+7&;>7U(RdN4Q{hvjy?j8A0@%gz#orJ0D-+^Pz{O@u8Zo-$Es{g;K$Mq8c literal 0 HcmV?d00001 diff --git a/lab2/bootloader/build/uart_c.d b/lab2/bootloader/build/uart_c.d new file mode 100644 index 000000000..b59c7761e --- /dev/null +++ b/lab2/bootloader/build/uart_c.d @@ -0,0 +1 @@ +build/uart_c.o: src/uart.c include/gpio.h include/uart.h diff --git a/lab2/bootloader/build/uart_c.o b/lab2/bootloader/build/uart_c.o new file mode 100644 index 0000000000000000000000000000000000000000..a53731260ed1a97d9f9e233d160b78c04e015d02 GIT binary patch literal 3856 zcmb_fO-x)>6h6Zne%itSLu;BsIzxg6`!oE6g=3oVM${71DomznT#W+^Lga6LNU$_A zD2v8)0nvpUNL^VIW89fZ(6-8=i!MrAjT_C7xNzY{yMb67&v)OsGtW0O2{xYQy?gF= z{?9${4qbZX!mCv-7in_Q*HqkTl<5AEB5x|zqz0;|$Bn+-41M^(|LbRey2#9GzMZI- z{bZ@$lKGg=)Y%VA!oFlYH`yrbK0+;)o{K(Fxg10nK6P!n1~>aB zsgckNsR=x{%!_y~j)xrZJgyDx-Zr8?R_x(|&s)+%d+pC0?M+?rddt-ulD;0Kmj7C} zJ@@Yo+#9-|Y72 zXKsmOE}21JAD^L%BHZ6qe%AQ;xYWmqLJkdlM#}DqE5TzQAy+008*!^8u@q3A}S%?AKTr0=wr|e0@YBl$EZka*uX%M{f%k{NaalZX3<}ja8 z7QD|*J#)h1;Y;Osi{o)zUneCp=necoF%rvvr;+27BF`G@ zE+Afa821w$(K^&de4p@{( z4-CBM@4PfJKa-yK2LpY9?z27fYS;5#Z+D=(FVOS6g|mJWjF?1wU_(Q)46 z0lmyaKp{`lM^#mCJoH$2pOO%5VpXzfi1@N18Un^Nh*!wtA7VipvlG}eiH(2VydQ9yP2fyhc!fOXdfi6ttWACwIFpJm_FP@OaX!T-vU!JeE{rvORHAvCDkf$+d7q!b5i zP;CYMI(24Fp+Q#kQoP0q5!&Rn)vM-(G4vF;-m7zG>{+ePmmX-)TBwUx=no36^>NVw zcT4Nkd@wd3_=MnUE*QHg_!()bp2s%@zbg0&??EH{sQjgM>ii*?k0sNAQR-Nrjxn`~ zPR>lGX>2kT8<~nnA-3ST`Shs8y&cyaW2pir++1>UCOvMU6Y+(Dcr-dUpNu0U=$h2u z!bflK_I1IJIq+4%TN&5iGW=}WaQi6VtAIbMfafaUozi#2wfnzN0gqI`H!I+~HoOr9 z2@T2lIpaR6fVYWVHRma%DC7kPuICg#{Gfuq7)@Dl0oQYS-GS>l{lbCkIlbq=^_>3h z!1bKgbKamrKKc_6q~4uQ$3`fSN++##LUYOZR4kB=FQh3j7E8w{Fp^49AUSJoMrWs| z<1;LqnN7z7=U=~cHkFQzzQYPIi%&$yld0I;ZQgwk0=V zE8{p?Q{;Lv`Hv#dko4y;^I-MOrGLMk6I{lLcNSfB#MQXC(_1>j9DF{leGl8hr+xN# zOBspp#C87A0pb3GeK$5XdSC33pPh96dVPt7nz!qHdBFNFi@h_?uf*Q(aPG_>e|(lZ zzf~L<(@)ky*uqxZ>+^$qXKa|#(9Lv&XZ6WG|uQ4Te;tepLX N{Qos(vjyw4{|Da{g@gbA literal 0 HcmV?d00001 diff --git a/lab2/bootloader/include/gpio.h b/lab2/bootloader/include/gpio.h new file mode 100644 index 000000000..399ae80f2 --- /dev/null +++ b/lab2/bootloader/include/gpio.h @@ -0,0 +1,25 @@ +#ifndef GPIO_H +#define GPIO_H + +#define MMIO_BASE 0x3F000000 + +#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000)) +#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) +#define GPFSEL2 ((volatile unsigned int*)(MMIO_BASE+0x00200008)) +#define GPFSEL3 ((volatile unsigned int*)(MMIO_BASE+0x0020000C)) +#define GPFSEL4 ((volatile unsigned int*)(MMIO_BASE+0x00200010)) +#define GPFSEL5 ((volatile unsigned int*)(MMIO_BASE+0x00200014)) +#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) +#define GPSET1 ((volatile unsigned int*)(MMIO_BASE+0x00200020)) +#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) +#define GPLEV0 ((volatile unsigned int*)(MMIO_BASE+0x00200034)) +#define GPLEV1 ((volatile unsigned int*)(MMIO_BASE+0x00200038)) +#define GPEDS0 ((volatile unsigned int*)(MMIO_BASE+0x00200040)) +#define GPEDS1 ((volatile unsigned int*)(MMIO_BASE+0x00200044)) +#define GPHEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200064)) +#define GPHEN1 ((volatile unsigned int*)(MMIO_BASE+0x00200068)) +#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile unsigned int*)(MMIO_BASE+0x0020009C)) + +#endif diff --git a/lab2/bootloader/include/mbox.h b/lab2/bootloader/include/mbox.h new file mode 100644 index 000000000..46160f821 --- /dev/null +++ b/lab2/bootloader/include/mbox.h @@ -0,0 +1,26 @@ +/* a properly aligned buffer */ +/* use this buffer(global variable) directly and the mbox_call will use it after call*/ +/* mbox format https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface */ +/* mbox address need to be aligned to 16 bytes */ +extern volatile unsigned int mbox[36]; + +#define MBOX_REQUEST 0 + +/* channels */ +#define MBOX_CH_POWER 0 +#define MBOX_CH_FB 1 +#define MBOX_CH_VUART 2 +#define MBOX_CH_VCHIQ 3 +#define MBOX_CH_LEDS 4 +#define MBOX_CH_BTNS 5 +#define MBOX_CH_TOUCH 6 +#define MBOX_CH_COUNT 7 +#define MBOX_CH_PROP 8 + +/* tags */ +#define GET_BOARD_REVISION 0x10002 +#define MBOX_TAG_GETSERIAL 0x10004 +#define GET_ARM_MEMORY 0x10005 +#define MBOX_TAG_LAST 0 + +int mbox_call(unsigned char ch); \ No newline at end of file diff --git a/lab2/bootloader/include/shell.h b/lab2/bootloader/include/shell.h new file mode 100644 index 000000000..74bd0aa42 --- /dev/null +++ b/lab2/bootloader/include/shell.h @@ -0,0 +1,8 @@ +#ifndef SHELL_H +#define SHELL_H + +void shell(); +void do_cmd(char* cmd); +void print_system_messages(); + +#endif \ No newline at end of file diff --git a/lab2/bootloader/include/string.h b/lab2/bootloader/include/string.h new file mode 100644 index 000000000..8123bc2d4 --- /dev/null +++ b/lab2/bootloader/include/string.h @@ -0,0 +1,9 @@ +#ifndef STRING_H +#define STRING_H + +int strcmp (const char * s1, const char * s2 ); +char* strcat (char *dest, const char *src); +unsigned long long strlen(const char *str); +char* strcpy (char *dest, const char *src); +char* memcpy (void *dest, const void *src, unsigned long long len); +#endif \ No newline at end of file diff --git a/lab2/bootloader/include/system.h b/lab2/bootloader/include/system.h new file mode 100644 index 000000000..79410c43e --- /dev/null +++ b/lab2/bootloader/include/system.h @@ -0,0 +1,14 @@ +#ifndef SYSTEM_H +#define SYSTEM_H + +extern char* _dtb; + +int get_board_revision(unsigned int* board_revision); +int get_arm_memory_info(unsigned int* base_addr,unsigned int* size); +void set(long addr, unsigned int value); +void reboot(); +void reset(int tick); +void cancel_reset(); +void load_kernel(); + +#endif \ No newline at end of file diff --git a/lab2/bootloader/include/uart.h b/lab2/bootloader/include/uart.h new file mode 100644 index 000000000..e226d69aa --- /dev/null +++ b/lab2/bootloader/include/uart.h @@ -0,0 +1,16 @@ +#ifndef UART_H +#define UART_H + +#define MAX_BUF_SIZE 0x100 + +void uart_init(); +void uart_putc(char c); +char uart_getc(); +int uart_puts(char *s); +char* uart_gets(char *buf); +int uart_printf(char *s); +void uart_hex(unsigned int d); +void disable_uart(); +char uart_getc_pure(); + +#endif diff --git a/lab2/bootloader/linker.ld b/lab2/bootloader/linker.ld new file mode 100644 index 000000000..3d0a0f5d1 --- /dev/null +++ b/lab2/bootloader/linker.ld @@ -0,0 +1,22 @@ +SECTIONS +{ + . = 0x70000; + _code_relocate_place = .; + /*bootloader on 0x80000, kernel on 0x80000 need to self relocate bootloader to other place*/ + . = 0x80000; + PROVIDE(_start = .); + .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 = .; + } + _end = .; +} +__bss_size = (__bss_end - __bss_start)>>3; +__code_size = (_end - _start); diff --git a/lab2/bootloader/src/main.c b/lab2/bootloader/src/main.c new file mode 100644 index 000000000..b56ee1741 --- /dev/null +++ b/lab2/bootloader/src/main.c @@ -0,0 +1,44 @@ +#include "uart.h" +#include "mbox.h" +#include "shell.h" +#include "string.h" +#include "system.h" + +extern char* _code_relocate_place; +extern unsigned long long __code_size; +extern unsigned long long _start; +extern char* _dtb; + +void code_relocate(char * addr); + +int relocate=1; + +void main(char* arg) +{ + _dtb = arg; + char* reloc_place = (char*)&_code_relocate_place; + + if(relocate) // only do relocate once + { + relocate = 0; + code_relocate(reloc_place); + } + + // set up serial console + uart_init(); + + shell(); +} + +// relocate code and jump to there +void code_relocate(char * addr) +{ + unsigned long long size = (unsigned long long)&__code_size; + char* start = (char *)&_start; + for(unsigned long long i=0;i request successful +#define MBOX_FULL 0x80000000 +#define MBOX_EMPTY 0x40000000 + +/** + * Make a mailbox call. Returns 0 on failure, non-zero on success + */ +int mbox_call(unsigned char ch) // Mailbox 0 define several channels, but we only use channel 8 (CPU->GPU) for communication. +{ + unsigned int r = (((unsigned int)((unsigned long)&mbox)&~0xF) | (ch&0xF)); + /* wait until we can write to the mailbox */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_FULL); + /* write the address of our message to the mailbox with channel identifier */ + *MBOX_WRITE = r; + /* now wait for the response */ + while(1) { + /* is there a response? */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_EMPTY); + /* is it a response to our message? */ + if(r == *MBOX_READ) + /* is it a valid successful response? */ + return mbox[1]==MBOX_RESPONSE; + } + return 0; +} \ No newline at end of file diff --git a/lab2/bootloader/src/shell.c b/lab2/bootloader/src/shell.c new file mode 100644 index 000000000..e0f1766d1 --- /dev/null +++ b/lab2/bootloader/src/shell.c @@ -0,0 +1,63 @@ +#include "uart.h" +#include "string.h" +#include "shell.h" +#include "mbox.h" +#include "system.h" + +void shell() +{ + char cmd[MAX_BUF_SIZE]; + print_system_messages(); + uart_puts("Welcome, this is bootloader. Try to load kernel with uart with protocol in system.c(load_kernel)"); + while(1) + { + uart_printf("# "); + uart_gets(cmd); + do_cmd(cmd); + } +} + +void do_cmd(char* cmd) +{ + if(strcmp(cmd,"help")==0) + { + uart_puts("help : print this help menu"); + uart_puts("hello : print Hello World!"); + uart_puts("reboot : reboot the device"); + uart_puts("load_kernel : load kernel code from uart to 0x80000 and jump to it!"); + } + else if(strcmp(cmd,"hello")==0) + { + uart_puts("Hello World!"); + } + else if(strcmp(cmd,"reboot")==0) + { + reboot(); + }else if(strcmp(cmd,"load_kernel")==0) + { + load_kernel(); + }else + { + uart_puts("Unknown command!"); + } +} + +void print_system_messages() +{ + unsigned int board_revision; + get_board_revision(&board_revision); + uart_printf("Board revision is : 0x"); + uart_hex(board_revision); + uart_puts(""); + + unsigned int arm_mem_base_addr; + unsigned int arm_mem_size; + + get_arm_memory_info(&arm_mem_base_addr,&arm_mem_size); + uart_printf("ARM memory base address in bytes : 0x"); + uart_hex(arm_mem_base_addr); + uart_puts(""); + uart_printf("ARM memory size in bytes : 0x"); + uart_hex(arm_mem_size); + uart_puts(""); +} \ No newline at end of file diff --git a/lab2/bootloader/src/start.S b/lab2/bootloader/src/start.S new file mode 100644 index 000000000..446a11244 --- /dev/null +++ b/lab2/bootloader/src/start.S @@ -0,0 +1,33 @@ +.section ".text.boot" + +.global _start + +//avoid use x0 which stored dtb place +_start: + + // read cpu id, stop slave cores + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, 2f + // cpu id > 0, stop +1: wfe + b 1b +2: // cpu id == 0 + + // set top of stack just before our code (stack grows to a lower address per AAPCS64) + ldr x1, =_start + mov sp, x1 + + // clear bss + ldr x1, =__bss_start + ldr w2, =__bss_size +3: cbz w2, 4f + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, 3b + +4: + // jump to C code, should not return + bl main + // for failsafe, halt this core too + b 1b diff --git a/lab2/bootloader/src/string.c b/lab2/bootloader/src/string.c new file mode 100644 index 000000000..de4783cae --- /dev/null +++ b/lab2/bootloader/src/string.c @@ -0,0 +1,45 @@ +#include "string.h" +#include + +int strcmp (const char *p1, const char *p2) +{ + const unsigned char *s1 = (const unsigned char *) p1; + const unsigned char *s2 = (const unsigned char *) p2; + unsigned char c1, c2; + do + { + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0') + return c1 - c2; + } + while (c1 == c2); + return c1 - c2; +} + +char* strcat (char *dest, const char *src) +{ + strcpy (dest + strlen (dest), src); + return dest; +} + +char* strcpy (char *dest, const char *src) +{ + return memcpy (dest, src, strlen (src) + 1); +} + +unsigned long long strlen(const char *str) +{ + size_t count = 0; + while((unsigned char)*str++)count++; + return count; +} + +char* memcpy (void *dest, const void *src, unsigned long long len) +{ + char *d = dest; + const char *s = src; + while (len--) + *d++ = *s++; + return dest; +} \ No newline at end of file diff --git a/lab2/bootloader/src/system.c b/lab2/bootloader/src/system.c new file mode 100644 index 000000000..b6435e662 --- /dev/null +++ b/lab2/bootloader/src/system.c @@ -0,0 +1,121 @@ +#include "system.h" +#include "uart.h" +#include "mbox.h" + +extern char _start[]; //bootloader load kernel to here +char* _dtb; + +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + +/* For all return 0 -> success , -1 failure*/ + +int get_board_revision(unsigned int* board_revision) +{ + /* + GET_BOARD_REVISION + */ + mbox[0] = 7*4; // length of the message + mbox[1] = MBOX_REQUEST; // request code + mbox[2] = GET_BOARD_REVISION; // tag identifier + mbox[3] = 4; // value buffer size in bytes + mbox[4] = 0; // request codes : b31 clear, b30-b0 reversed + mbox[5] = 0; // clear output buffer + mbox[6] = MBOX_TAG_LAST; // end tag + // send the message to the GPU and receive answer + if (mbox_call(MBOX_CH_PROP)) { + *board_revision = mbox[5]; + return 0; + } else { + uart_puts("Unable to query serial!"); + *board_revision = mbox[5] = -1; + return -1; + } +} + +int get_arm_memory_info(unsigned int* base_addr,unsigned int* size) +{ + /* + GET arm_memory address and size + */ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // request code + mbox[2] = GET_ARM_MEMORY; // tag identifier + mbox[3] = 8; // value buffer size in bytes + mbox[4] = 0; // request codes : b31 clear, b30-b0 reversed + mbox[5] = 0; // clear output buffer ( u32: base address in bytes ) + mbox[6] = 0; // clear output buffer ( u32: size in bytes ) + mbox[7] = MBOX_TAG_LAST; // end tag + + // send the message to the GPU and receive answer + if (mbox_call(MBOX_CH_PROP)) { + *base_addr = mbox[5]; + *size = mbox[6]; + return 0; + } else { + uart_puts("Unable to query serial!"); + return -1; + } +} + +void set(long addr, unsigned int value) +{ + volatile unsigned int* point = (unsigned int*)addr; + *point = value; +} + +void reboot() +{ + //disable_uart(); + reset(1); // timeout = 1/16th of a second? (whatever) +} + +void reset(int tick) +{ // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick + while(1); // wati for clock +} + +void cancel_reset() +{ + set(PM_RSTC, PM_PASSWORD | 0); // full reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} + + +//編譯器不要優化這段 +#pragma GCC push_options +#pragma GCC optimize ("O0") + +void load_kernel() +{ + // prevent dtb been rewrited by kernel + char* temp_dtb = _dtb; + char c; + unsigned long long kernel_size=0; + char* kernel_start = (char*) (&_start); + + uart_puts("kernel size:"); + for(int i=0;i<8;i++) //protocol : use little endian to get kernel size + { + c = uart_getc_pure(); + kernel_size += c<<(i*8); + } + + + for(int i=0;i get del + { + uart_putc('\b'); + uart_putc(' '); + uart_putc('\b'); + }else + { + uart_putc(r); + } + /* convert carrige return to newline */ + return r=='\r'?'\n':r; +} + +/** + * Display a string with newline + */ +int uart_puts(char *s) { + int i=0; + + while(*s) { + uart_putc(*s++); + i++; + } + uart_putc('\r'); + uart_putc('\n'); + + return i+2; +} + +/** + * get a string + */ +char* uart_gets(char *buf) +{ + int count; + char c; + char *s; + for (s = buf,count = 0; (c = uart_getc()) != '\n' && count!=MAX_BUF_SIZE-1 ;count++) + { + *s = c; + if(*s=='\x7f') + { + count--; + if(count==-1) + { + uart_putc(' '); // prevent back over command line # + continue; + } + s--; + count--; + continue; + } + s++; + } + *s = '\0'; + return buf; +} + +/** + * printf (TODO) + */ +int uart_printf(char *s) { + int i = 0; + while(*s) { + uart_putc(*s++); + i++; + } + return i; +} + +/** + * Display a binary value in hexadecimal + */ +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_putc(n); + } +} + + +/** + * Receive a character without echo and any translation + */ +char uart_getc_pure() { + char r; + /* wait until something is in the buffer */ + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x01)); + /* read it and return */ + r=(char)(*AUX_MU_IO); + return r; +} diff --git a/lab2/build/cpio_c.d b/lab2/build/cpio_c.d new file mode 100644 index 000000000..f3c9e5145 --- /dev/null +++ b/lab2/build/cpio_c.d @@ -0,0 +1 @@ +build/cpio_c.o: src/cpio.c include/cpio.h include/string.h include/uart.h diff --git a/lab2/build/cpio_c.o b/lab2/build/cpio_c.o new file mode 100644 index 0000000000000000000000000000000000000000..3ef5a8ff0193a64542112f636117c9f28d072a55 GIT binary patch literal 2520 zcmbtV&u<$=6#mwm;{HgJIw@)^SG6N5L=oLOC{h(JY#NfPBx;OFgoG-Yjk73KYsaxS zs-Y5Cf>X<(mO%6Z%7FtQ?$m-qsl<&791sUUYv?}!2c$hj=9}Fac|CSTC7!i;Z@zi& zdp~Ap^X|g(V!|+>#K70+trQB}eWGXEp=skVM$vr_Kl(`oog~`b44*XGOTbY-W4Cer zs_! zY7$NV8VZ3+*@A1dr{WYrBlruRX`7wf&&slZYgP*k9F9O#}|8!SHpPXsyzFGWv z@8&mO?3rk>-=LF5@W(L(e@-HJI8L3hg9m8-#G|;w^J@8~`6cZSGr;y6z$(z3csa@$ z;1{$EqgnW<+xyT@T=j~5QZsz3Kw?*uCA~wYBz#otHCq=yU2|3h$ETR#E)y~SupjASf+wR1?-OMZ7pRG(P<;~l?+<6zx50&psH#Cc_HmM%C#h5TyQ?CU z=63@VtY6g~&YjpIA9Z##ds3=i-LgtJ-9Xi;)!pKz+bGt(8cuIuK7VPY_|n4S+}iSL zF~2-FzX0J~thhHyMdj^mxHT}KQYu%;+LR-mq>gw0zQmu@@DC)OrXKHAgbAt literal 0 HcmV?d00001 diff --git a/lab2/build/dtb_c.d b/lab2/build/dtb_c.d new file mode 100644 index 000000000..daaf671fe --- /dev/null +++ b/lab2/build/dtb_c.d @@ -0,0 +1,2 @@ +build/dtb_c.o: src/dtb.c include/dtb.h include/uart.h include/string.h \ + include/cpio.h diff --git a/lab2/build/dtb_c.o b/lab2/build/dtb_c.o new file mode 100644 index 0000000000000000000000000000000000000000..21f4252e6f3fc8510ab6dc4e32dade9d0553af34 GIT binary patch literal 4600 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 E9}U|q=>Px# literal 0 HcmV?d00001 diff --git a/lab2/build/main_c.d b/lab2/build/main_c.d new file mode 100644 index 000000000..80042f4e5 --- /dev/null +++ b/lab2/build/main_c.d @@ -0,0 +1,2 @@ +build/main_c.o: src/main.c include/uart.h include/mbox.h include/shell.h \ + include/string.h include/malloc.h include/dtb.h include/cpio.h diff --git a/lab2/build/main_c.o b/lab2/build/main_c.o new file mode 100644 index 0000000000000000000000000000000000000000..e2c5c9c9d933156b9176661e74356301cc3c152f GIT binary patch literal 2976 zcmbuB&2JM|5WvUYq_`zb!k36-M0`jP6|iz>q$Y^Nh9po>)S!sa-j?-xqgePO+Fc{3 zsel820FgKXhpGo!ao~VN4@iL214o3^s)vGt#DQbWsXjz7^LBA;uJ2b*gTf8DfTePaOHh_3@U?NC(4|^LfSbuJ={c-29<^Hv~_DJ1N663V9ct2!kP;Xe--_YjxCn`P;qPS4=s?~-+ zhGQ@qeL)H|e$?>4Cchk)3dah?)@TdkPfbrBD;!)bHS2M+Flmq5#Uo=)<&9lFTC|Jf z_Sjbmhe1k4$^5tgJ+1wjeBUtaLw`t7fM=wq`kh<3+uOpIFZ#(X;59)8N|C;%`Uh`i zZ)eW%IH7JrXQ2oFdzUtDrJfW33qNUMVWl*&ptl1j$E}lZSCQ0Jr&zG9115EHu)AY~ z`qU1!Hg3UZnwOZgkUQY*JIN4D>z>9BA>XO3kJ=YxwEo0(9}#?u*B}{&%%h*i&v)Ua zE_}HQztV+6&8yUHA4bYB(xTJqu2elgfa$ZR=iQmvlT(Xx=iIY%Q`5655-Rmd?D{K} zhFcDnyk<4#_~g-mT2S*>R-x&II1pCq@e)MKLA9zX`}p{jJpZCgMMAH(6alJBK^O&C z?NY@L+&ByZ>=f`9Cy{UP2#8HY)@Z`u^lXsikq;!M`W|7Mxa1NlGT((n0ZBjFAOC6bm_L)TL2%k%^>T@UCq|RwvVhLSfF7@U4FEf|=!mG^9K4YVf%+WIH z2>(f|qxX4D;}T2gI&{BE{MyI$j~o1%jM>p@ zE%r)aM{$_wWwFAb>e+G7ioq^>u?Kc3iogyViQ_kFwV;k;^+p`nr@mV}62qz$K}3o@2*q@ht}K{eCL4$zwBSYX zVs8E?(p!%n?ZtDwdG#0&>U*1cn{l$a^o7m5_s#dcd2e=RKRkT$Xu@$I=HMHKk)XhD zcj)_x>m!F*oPNad$s7&|`a(|+@cZ!5BdmWi=N~Tb;!OlRhkLNiJjRg6Lh4uZi^P|> z4-dz`h(k4`IUUN$x*Nb}S%>Bs>(lzZBe(Q3DT)8KHaG8kw|2^%dff5usSQL^IGV<+s0(~y0bL1jBAAP!}f{)9^|~e96RHU>cJ%boMtiH%pC<> z`em6*nX=5q)ChbrK}PXe!X1NuK`R%Mk*ggw7s49O4f0Rp$`DFD7t^V4IxfzeVdAr1 z_S&5EC|ET1C)sZ%)PicYQBf7F>?3Y8vC>5;3WH{;9S5ygPb01PGPPvx!VKpiyK3RP z0~j`cPvbVfIffsP;cFOtrT86)<+U?K_=JEws`lGj9F%E{TZ1tYuN77U6^GpzYCnhr zsB*gvm7pB62UTg*YGIuy^+p`3t*1Ndv_X~Enioc;SFNBHnk$~k_ee#hopO+a~o3MgjKhh)Ld%kzJo^#sojv##1Nmn^AOs7i` R{%&UJ4>TC1%zHgKQC_L^<*M@NVp)_|MdjR>M_!%{upVw9J2-7EheHvQ6IQzjFKC6RVhoad0~PB+Dv#p0BO{by5H=4YmO zKK48gM!HXQ*%Avh7ZT@^ePT<{=ng~^%L6R$%7vWjO|RW%v(9sgj&hU<1-;M92EVWD zrvEd=oBl<`&rqI>(xnjLgCO!65Mk6C%RR02{I(||e-J_JdXWdw2t$ZwHwgR=ah-1D zi_II`D`Dg{TM*LS->cv4d4ZoS@jtpl!F;>sO}fM}e)o60oO&Tk#Ph3hm0gQ{)r1{I z93jbd#_wtJ&d(^`e34&OoGCa*5*KK}IsY}jLb05)Od|ub42My)6P@@Zs> z?@h)1@n(qA@#emC|8%Wuq@?vfRtfe03HP7BJ{_-l-lkcbD7b3>j*|S%@G#>!ui1N| bu%nWm;za^xTjt4@7XMwv-$}%>YR3Np@kE17 literal 0 HcmV?d00001 diff --git a/lab2/build/shell_c.d b/lab2/build/shell_c.d new file mode 100644 index 000000000..9e9c83605 --- /dev/null +++ b/lab2/build/shell_c.d @@ -0,0 +1,3 @@ +build/shell_c.o: src/shell.c include/uart.h include/string.h \ + include/shell.h include/mbox.h include/system.h include/filesystem.h \ + include/dtb.h diff --git a/lab2/build/shell_c.o b/lab2/build/shell_c.o new file mode 100644 index 0000000000000000000000000000000000000000..ad46b81421ba808dd47e2afa3773e70873b94dac GIT binary patch literal 5192 zcmbuCPiP!f9LImVn`+dU{8{*SE75`wN-h zd!P4v-}ig(&Agp?>xGvOq*EynOTp)`QWFZ$y>_LX)5RP-3O%qi^XZ368MuUK4*zHI zUzeNv?)8hy%bS*FKGCtw)v!phIL@W!>Kv8l1^`aIorc#;jr%F@0oaf<#`|#Z7&|+} zIdRva3q& z=}OV1ajT&bL&Z^5t%Q*(HiE##;Y*dkEk=GYO~GhI#}w7^ah^rri>QM?sT?&~scLnA zug) zc9AY)y=uPea%Mue5=b_Z>Vm(PlUg&0Cn7)w|B@_&N=cT1Rc-hoP1<>n=9E>tW#GX! z80&QFL(gu^K(~!_Jp&K4@zqGy!r#l%L;T~&*BR@e_XQcA+nUdDs(Q_lJ%|6Yw^(f1 z7?zUwOUOxIboJgMJJKQk^$xt)fxpp#dmZ?x4xHwfl>dAO{#gf3hj5Y(KG=A`Ws5La zg25>$MTLC5>fjlsIp{MeA5MpnTg%t*0d-EeAvByI%Il`dxO~EmLMZw9Vyy&W6clT9 zj%gr|&qq4p=v1K*icYm!aEd4M`V`Y=RTMa<-5_+$GYwESU!a2|F9%61TXv^(n-fq{ zbcp0D-lUIHY~6W%cz@vI*|PZl23U{Wy!&NMHd>s1%*jZH?oly156Fm1U#bt%1&#RH zxTvqYxGdw!{f+Mn+GJee`^UOu(8rLtd7aifEXY0Ic>D=b} ztfeD-j=8P#o~5$}_knCdU!gTG;a8ZGj=AqwnajL3vyRL|<|X{Pp=0j**OtyU*7=6H z=m@`Q=$QHZV(<-ICU=X=lIIZX%Q}g^@H-rD&-Y(TXBX?pPl4zN@8WjSF`v^OgRfyt zavKc3(ct~eCI5q5SL|h6;j&J4{v(#oVXjNQq9c3{x0B9eMn3y3opG+q_@X0R^z3|& zbHC@&%Na<+OfaXsOkOtPHyQa0`MH}k(`=}VrsEq&pC7&>PDcPt&r`yWe3_+3NC%oEb_)g#; z_EGZeF?7s4`+03wp+1LbvdiMzxjt_3InEoh;dCu>3h1LC_GKvrZq>;~?oC(h2FzEhI+Z=8SZ4su7@Kk6&}<%~`mo4VZL@fSF;N08C)gWaFL|Lna(1hahK Yd`A_-?D^9>a#H^V&fhWmQqk`JANLUHkN^Mx literal 0 HcmV?d00001 diff --git a/lab2/build/sprintf_c.d b/lab2/build/sprintf_c.d new file mode 100644 index 000000000..1a092c7a0 --- /dev/null +++ b/lab2/build/sprintf_c.d @@ -0,0 +1 @@ +build/sprintf_c.o: src/sprintf.c include/uart.h diff --git a/lab2/build/sprintf_c.o b/lab2/build/sprintf_c.o new file mode 100644 index 0000000000000000000000000000000000000000..7d45cb40e58a0d6363d6f7a1b3c8edb34c2a56a6 GIT binary patch literal 3488 zcmcImU2GIp6h5=Ftw2kq1%si6orOkY{_NSDV(C)IkQ&TO{ zF+BKC5?RWF34w@D6!9m<#BAb26CNZ1Uu^UZa<}{?$^$<>FtN3M=g!PB&aRPYIL+=o z_q*qud;ad(j=uWFYXLy}1zIW(!>`%%i!aa>iv z=OpBtQjlXCM0!W)BxS>^ZJQLNg227rGqaVt=lZC)h+w- z!~Rb0{PqNWb?JU$t+dAjzqW~W#clN)apl;3>cRLLw&311%kF-jN`ZabO*<;2x+oy8`f!uzKrIf(*aSYPF!5ZFY}W z$@_&F!W1dI7-&dkI1?;M%L|* z;cv){mR6e4=~ZU*`WiEOW4#%@`H~sEwb6{;e#MN6qrrmwz2KGOyQmh#daN~O6VC|o zG*-;)>8(__zEUY9g8GCWq=`f@hE=m^8G!kvov?(~L|;8_1;la1v%QYE2If46G*FzIE%%TI-(FP}&&MIwBh) zZR^^HQn>axe#r3WG?U;Yxp#9y5-Eu1J|zN_#X*%N9pd(RTEIF{*n`^_^U=LEL9_w zYAWD5iB#gYuk2MNsq|C@Xxo{Gflx^*VIo!`RVMN82aVV^dE@0ggO=gr)7kZ=)G|!(IsgqNb4L8okdc=b_R4Rf#R%1#g@l7YQPJP*m-9Nmo0gm@xCf(u6xT8;z{Ck5&GKJO1*=xVc z<$4E_5u@7R+KN$`B2&tmtIxwaSZant3qJuHJC8j&)?y?C3m5KksWa58s`5w39-1qvtgZp31 z9pAkWlf*W>v=$q-`Cs+hq02VCHN}?hI`^;VjfY(ST?jv_QoqdwoHgV;MfT52uK(`Z zi9?t7%I&Cp%JSGR`?jO+_x~+N{~fPU@P7Zhfbmq)@$u3nr+#i+TtC)z_1*fhKmNPf t&N=7)e#c>+L;Rln`h1PQc7SM+bAJnOJmim`=TbHOhmL;Iqsy#c|1X6r&N~1A literal 0 HcmV?d00001 diff --git a/lab2/build/start_s.d b/lab2/build/start_s.d new file mode 100644 index 000000000..afcb7e88c --- /dev/null +++ b/lab2/build/start_s.d @@ -0,0 +1 @@ +build/start_s.o: src/start.S diff --git a/lab2/build/start_s.o b/lab2/build/start_s.o new file mode 100644 index 0000000000000000000000000000000000000000..b8ad155a6f3d6a3bdaa700a4f7237b381b4b80f8 GIT binary patch literal 1208 zcmbW0u}T9$5QhKD9h#_xVqqX42?lKBK!}h+$Ra2f7TVdJ8xk;J4CJ+>30V6Mg55cj+cnGP0+NAaX1<+&GMk&bJ3Kkcc^-^;_`oDH6d2?tu^5K}1?2I9 z`lu3!CkebqWq*_;$%gcB-T;Q|zkuRBP-{Hk=ODn@Ym)4d{P~;eCLRA5`I(aeKCI!a zRz96%nU7!!r+1#_DG9LeC=3@4U!i<8qyOTVJH?c)&)}OgII06wTZp1&97nN|eP!a# zZ5v(LxlVthmO7N^V#_*aXYP?BzGQKsV_t>4#g8psusFi_rmJL=yy~a^(nP8~PzYO6 zNrW^e!hZWohD^g|ucz!TbH^o8@;h5_ItV8>Dc9Oop@f;cA;K=QVpqRSXZ%0StKTIp z_nbBVDV^D7zZ2#=^zaS}dTjgDgI;LJ{khKQi<)y;)>reW&&#?G?=5RxJ@0~hcb2|s Y-4-X7Y5YglD9X~;^-yL{jlk9a0^h|z1ONa4 literal 0 HcmV?d00001 diff --git a/lab2/build/string_c.d b/lab2/build/string_c.d new file mode 100644 index 000000000..9c2847ac5 --- /dev/null +++ b/lab2/build/string_c.d @@ -0,0 +1 @@ +build/string_c.o: src/string.c include/string.h diff --git a/lab2/build/string_c.o b/lab2/build/string_c.o new file mode 100644 index 0000000000000000000000000000000000000000..20cdb4516fc306470785591150111dabe8eff63e GIT binary patch literal 2800 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 Tp+?A-vcDnEA9vX@>$U#}v_`%u literal 0 HcmV?d00001 diff --git a/lab2/config.txt b/lab2/config.txt new file mode 100644 index 000000000..49fc25695 --- /dev/null +++ b/lab2/config.txt @@ -0,0 +1,3 @@ +kernel=bootloader.img +arm_64bit=1 +initramfs initramfs.cpio 0x20000000 diff --git a/lab2/include/cpio.h b/lab2/include/cpio.h new file mode 100644 index 000000000..2cc4d66d9 --- /dev/null +++ b/lab2/include/cpio.h @@ -0,0 +1,39 @@ +#ifndef CPIO_H +#define CPIO_H + + +/* + cpio format : https://www.freebsd.org/cgi/man.cgi?query=cpio&sektion=5 + header,file path,file data,header ...... + header+file path (padding 4 bytes) + file data (padding 4 bytes) (max size 4gb) +*/ + +#define CPIO_NEWC_HEADER_MAGIC "070701" // big endian + +void* CPIO_DEFAULT_PLACE; // init in main + +struct cpio_newc_header +{ + char c_magic[6]; //magic The string "070701". + char c_ino[8]; + char c_mode[8]; + char c_uid[8]; + char c_gid[8]; + char c_nlink[8]; + char c_mtime[8]; + char c_filesize[8]; + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; + char c_check[8]; //check This field is always set to zero by writers and ignored by readers. +}; + +/* write pathname,data,next header into corresponding parameter*/ +int cpio_newc_parse_header(struct cpio_newc_header *this_header_pointer, + char **pathname, unsigned int *filesize, char **data, + struct cpio_newc_header **next_header_pointer); + +#endif \ No newline at end of file diff --git a/lab2/include/dtb.h b/lab2/include/dtb.h new file mode 100644 index 000000000..0c2329ba9 --- /dev/null +++ b/lab2/include/dtb.h @@ -0,0 +1,22 @@ +#ifndef DTB_H +#define DTB_H + +#define uint32_t unsigned int + +// manipulate device tree with dtb file format +#define FDT_BEGIN_NODE 0x00000001 +#define FDT_END_NODE 0x00000002 +#define FDT_PROP 0x00000003 +#define FDT_NOP 0x00000004 +#define FDT_END 0x00000009 + +char* dtb_place; +extern void* CPIO_DEFAULT_PLACE; // initialize by callback dtb_callback_initramfs in main 本來是寫死的 +typedef void (*dtb_callback)(uint32_t node_type, char *name, void *value, uint32_t name_size); + +uint32_t uint32_endian_big2lttle(uint32_t data); +void traverse_device_tree(void *base,dtb_callback callback); //traverse dtb tree +void dtb_callback_show_tree(uint32_t node_type, char *name, void *value, uint32_t name_size); +void dtb_callback_initramfs(uint32_t node_type, char *name, void *value, uint32_t name_size); + +#endif \ No newline at end of file diff --git a/lab2/include/filesystem.h b/lab2/include/filesystem.h new file mode 100644 index 000000000..a9600057e --- /dev/null +++ b/lab2/include/filesystem.h @@ -0,0 +1,9 @@ +#ifndef FILESYSTEM_H +#define FILESYSTEM_H + +extern void* CPIO_DEFAULT_PLACE; + +int ls(char* working_dir); +int cat(char* thefilepath); + +#endif \ No newline at end of file diff --git a/lab2/include/gpio.h b/lab2/include/gpio.h new file mode 100644 index 000000000..399ae80f2 --- /dev/null +++ b/lab2/include/gpio.h @@ -0,0 +1,25 @@ +#ifndef GPIO_H +#define GPIO_H + +#define MMIO_BASE 0x3F000000 + +#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000)) +#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) +#define GPFSEL2 ((volatile unsigned int*)(MMIO_BASE+0x00200008)) +#define GPFSEL3 ((volatile unsigned int*)(MMIO_BASE+0x0020000C)) +#define GPFSEL4 ((volatile unsigned int*)(MMIO_BASE+0x00200010)) +#define GPFSEL5 ((volatile unsigned int*)(MMIO_BASE+0x00200014)) +#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) +#define GPSET1 ((volatile unsigned int*)(MMIO_BASE+0x00200020)) +#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) +#define GPLEV0 ((volatile unsigned int*)(MMIO_BASE+0x00200034)) +#define GPLEV1 ((volatile unsigned int*)(MMIO_BASE+0x00200038)) +#define GPEDS0 ((volatile unsigned int*)(MMIO_BASE+0x00200040)) +#define GPEDS1 ((volatile unsigned int*)(MMIO_BASE+0x00200044)) +#define GPHEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200064)) +#define GPHEN1 ((volatile unsigned int*)(MMIO_BASE+0x00200068)) +#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile unsigned int*)(MMIO_BASE+0x0020009C)) + +#endif diff --git a/lab2/include/malloc.h b/lab2/include/malloc.h new file mode 100644 index 000000000..1fc290936 --- /dev/null +++ b/lab2/include/malloc.h @@ -0,0 +1,5 @@ +#ifndef MALLOC_H +#define MALLOC_H +void* malloc(unsigned int size); + +#endif \ No newline at end of file diff --git a/lab2/include/mbox.h b/lab2/include/mbox.h new file mode 100644 index 000000000..b224f4ba1 --- /dev/null +++ b/lab2/include/mbox.h @@ -0,0 +1,31 @@ +#ifndef MBOX_H +#define MBOX_H + +/* a properly aligned buffer */ +/* use this buffer(global variable) directly and the mbox_call will use it after call*/ +/* mbox format https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface */ +/* mbox address need to be aligned to 16 bytes */ +extern volatile unsigned int mbox[36]; + +#define MBOX_REQUEST 0 + +/* channels */ +#define MBOX_CH_POWER 0 +#define MBOX_CH_FB 1 +#define MBOX_CH_VUART 2 +#define MBOX_CH_VCHIQ 3 +#define MBOX_CH_LEDS 4 +#define MBOX_CH_BTNS 5 +#define MBOX_CH_TOUCH 6 +#define MBOX_CH_COUNT 7 +#define MBOX_CH_PROP 8 + +/* tags */ +#define GET_BOARD_REVISION 0x10002 +#define MBOX_TAG_GETSERIAL 0x10004 +#define GET_ARM_MEMORY 0x10005 +#define MBOX_TAG_LAST 0 + +int mbox_call(unsigned char ch); + +#endif \ No newline at end of file diff --git a/lab2/include/shell.h b/lab2/include/shell.h new file mode 100644 index 000000000..74bd0aa42 --- /dev/null +++ b/lab2/include/shell.h @@ -0,0 +1,8 @@ +#ifndef SHELL_H +#define SHELL_H + +void shell(); +void do_cmd(char* cmd); +void print_system_messages(); + +#endif \ No newline at end of file diff --git a/lab2/include/sprintf.h b/lab2/include/sprintf.h new file mode 100644 index 000000000..101e564e3 --- /dev/null +++ b/lab2/include/sprintf.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +unsigned int sprintf(char *dst, char* fmt, ...); +unsigned int vsprintf(char *dst,char* fmt, __builtin_va_list args); \ No newline at end of file diff --git a/lab2/include/string.h b/lab2/include/string.h new file mode 100644 index 000000000..bea076572 --- /dev/null +++ b/lab2/include/string.h @@ -0,0 +1,11 @@ +#ifndef STRING_H +#define STRING_H + +int strcmp (const char * s1, const char * s2 ); +int strncmp (const char *s1, const char *s2, unsigned long long n); +char* strcat (char *dest, const char *src); +unsigned long long strlen(const char *str); +char* strcpy (char *dest, const char *src); +char* memcpy (void *dest, const void *src, unsigned long long len); + +#endif \ No newline at end of file diff --git a/lab2/include/system.h b/lab2/include/system.h new file mode 100644 index 000000000..34bee2bd0 --- /dev/null +++ b/lab2/include/system.h @@ -0,0 +1,11 @@ +#ifndef SYSTEM_H +#define SYSTEM_H + +int get_board_revision(unsigned int* board_revision); +int get_arm_memory_info(unsigned int* base_addr,unsigned int* size); +void set(long addr, unsigned int value); +void reboot(); +void reset(int tick); +void cancel_reset(); + +#endif \ No newline at end of file diff --git a/lab2/include/uart.h b/lab2/include/uart.h new file mode 100644 index 000000000..ba9d1bdec --- /dev/null +++ b/lab2/include/uart.h @@ -0,0 +1,15 @@ +#ifndef UART_H +#define UART_H + +#define MAX_BUF_SIZE 0x100 + +void uart_init(); +void uart_putc(char c); +char uart_getc(); +int uart_puts(char *s); +char* uart_gets(char *buf); +int uart_printf(char *fmt, ...); +void uart_hex(unsigned int d); +void disable_uart(); + +#endif diff --git a/lab2/initramfs.cpio b/lab2/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..488aa207f0c6f56ad01394497cfa344e83604d16 GIT binary patch literal 1024 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 Nt6Q(eN0zGY{{g0HsSyAG literal 0 HcmV?d00001 diff --git a/lab2/linker.ld b/lab2/linker.ld new file mode 100644 index 000000000..7d7a4bc42 --- /dev/null +++ b/lab2/linker.ld @@ -0,0 +1,20 @@ +SECTIONS +{ + . = 0x80000; + .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 = .; + } + _heap_start = .; + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab2/rootfs/testfile1 b/lab2/rootfs/testfile1 new file mode 100644 index 000000000..734d5d5db --- /dev/null +++ b/lab2/rootfs/testfile1 @@ -0,0 +1,2 @@ +1 +1111111111111111111111111111 diff --git a/lab2/rootfs/testfile112345 b/lab2/rootfs/testfile112345 new file mode 100644 index 000000000..539a7773b --- /dev/null +++ b/lab2/rootfs/testfile112345 @@ -0,0 +1 @@ +1111111111111111111111 diff --git a/lab2/rootfs/testfile2222 b/lab2/rootfs/testfile2222 new file mode 100644 index 000000000..876c79950 --- /dev/null +++ b/lab2/rootfs/testfile2222 @@ -0,0 +1 @@ +222222 diff --git a/lab2/send_kernel_to_bootloader.py b/lab2/send_kernel_to_bootloader.py new file mode 100644 index 000000000..b922e86c4 --- /dev/null +++ b/lab2/send_kernel_to_bootloader.py @@ -0,0 +1,31 @@ +from serial import Serial +from pwn import * +import argparse + +parser = argparse.ArgumentParser(description='NYCU OSC kernel sender') +parser.add_argument('--filename', metavar='PATH', default='kernel8.img', type=str, help='path to kernel8.img') +parser.add_argument('--device', metavar='TTY',default='/dev/ttyUSB0', type=str, help='path to UART device') +parser.add_argument('--baud', metavar='Hz',default=115200, type=int, help='baud rate') +args = parser.parse_args() + +with open(args.filename,'rb') as fd: + with Serial(args.device, args.baud) as ser: + + kernel_raw = fd.read() + length = len(kernel_raw) + + print("Kernel image size : ", hex(length)) + for i in range(8): + ser.write(p64(length)[i:i+1]) + ser.flush() + + print("Start sending kernel img by uart...") + for i in range(length): + # Use kernel_raw[i: i+1] is byte type. Instead of using kernel_raw[i] it will retrieve int type then cause error + ser.write(kernel_raw[i: i+1]) + ser.flush() + if i % 100 == 0: + print("{:>6}/{:>6} bytes".format(i, length)) + print("{:>6}/{:>6} bytes".format(length, length)) + print("Transfer finished!") + \ No newline at end of file diff --git a/lab2/src/cpio.c b/lab2/src/cpio.c new file mode 100644 index 000000000..0f354b5fd --- /dev/null +++ b/lab2/src/cpio.c @@ -0,0 +1,64 @@ +#include "cpio.h" +#include "string.h" +#include "uart.h" + + +/* Parse an ASCII hex string into an integer. (big endian)*/ +static unsigned int parse_hex_str(char *s, unsigned int max_len) +{ + unsigned int r = 0; + + for (unsigned int i = 0; i < max_len; i++) { + r *= 16; + if (s[i] >= '0' && s[i] <= '9') { + r += s[i] - '0'; + } else if (s[i] >= 'a' && s[i] <= 'f') { + r += s[i] - 'a' + 10; + } else if (s[i] >= 'A' && s[i] <= 'F') { + r += s[i] - 'A' + 10; + } else { + return r; + } + } + return r; +} + + +/* write pathname,data,next header into corresponding parameter */ +/* if no next header, next_header_pointer = 0 */ +/* return -1 if parse error*/ +int cpio_newc_parse_header(struct cpio_newc_header *this_header_pointer, char **pathname, unsigned int *filesize, char **data, struct cpio_newc_header **next_header_pointer) +{ + /* Ensure magic header exists. */ + if (strncmp(this_header_pointer->c_magic, CPIO_NEWC_HEADER_MAGIC,sizeof(this_header_pointer->c_magic)) != 0)return -1; + + //transfer big endian 8 byte hex string to unsinged int and store into *filesize + *filesize = parse_hex_str(this_header_pointer->c_filesize,8); + + // end of header is the pathname + *pathname = ((char *)this_header_pointer) + sizeof(struct cpio_newc_header); + + // get file data, file data is just after pathname + unsigned int pathname_length = parse_hex_str(this_header_pointer->c_namesize,8); + unsigned int offset = pathname_length+sizeof(struct cpio_newc_header); + offset = offset%4==0?offset:(offset+4-offset%4); //padding + *data = (char *)this_header_pointer+offset; + + //get next header pointer + if(*filesize==0) + { + *next_header_pointer = (struct cpio_newc_header*)*data; + }else + { + offset = *filesize; + *next_header_pointer = (struct cpio_newc_header*)(*data + (offset%4==0?offset:(offset+4-offset%4))); + } + + // if filepath is TRAILER!!! means there is no more files. + if(strncmp(*pathname,"TRAILER!!!",sizeof("TRAILER!!!"))==0) + { + *next_header_pointer = 0; + } + + return 0; +} \ No newline at end of file diff --git a/lab2/src/dtb.c b/lab2/src/dtb.c new file mode 100644 index 000000000..0bb88c2c6 --- /dev/null +++ b/lab2/src/dtb.c @@ -0,0 +1,103 @@ +#include "dtb.h" +#include "uart.h" +#include "string.h" +#include "cpio.h" + +//stored as big endian +struct fdt_header { + uint32_t magic; + uint32_t totalsize; + uint32_t off_dt_struct; + uint32_t off_dt_strings; + uint32_t off_mem_rsvmap; + uint32_t version; + uint32_t last_comp_version; + uint32_t boot_cpuid_phys; + uint32_t size_dt_strings; + uint32_t size_dt_struct; +}; + +uint32_t uint32_endian_big2lttle(uint32_t data) +{ + char* r = (char*)&data; + return (r[3]<<0) | (r[2]<<8) | (r[1]<<16) | (r[0]<<24); +} + +void traverse_device_tree(void *dtb_ptr,dtb_callback callback) +{ + struct fdt_header* header = dtb_ptr; + if(uint32_endian_big2lttle(header->magic) != 0xD00DFEED) + { + uart_puts("traverse_device_tree : wrong magic in traverse_device_tree"); + return; + } + + uint32_t struct_size = uint32_endian_big2lttle(header->size_dt_struct); + char* dt_struct_ptr = (char*)((char*)header + uint32_endian_big2lttle(header->off_dt_struct)); + char* dt_strings_ptr = (char*)((char*)header + uint32_endian_big2lttle(header->off_dt_strings)); + + char* end = (char*)dt_struct_ptr + struct_size; + char* pointer = dt_struct_ptr; + + while(pointer < end) + { + uint32_t token_type = uint32_endian_big2lttle(*(uint32_t*)pointer); + + pointer += 4; + if(token_type == FDT_BEGIN_NODE) + { + callback(token_type,pointer,0,0); + pointer += strlen(pointer); + pointer += 4 - (unsigned long long)pointer%4; //alignment 4 byte + }else if(token_type == FDT_END_NODE) + { + callback(token_type,0,0,0); + }else if(token_type == FDT_PROP) + { + uint32_t len = uint32_endian_big2lttle(*(uint32_t*)pointer); + pointer += 4; + char* name = (char*)dt_strings_ptr + uint32_endian_big2lttle(*(uint32_t*)pointer); + pointer += 4; + callback(token_type,name,pointer,len); + pointer += len; + if((unsigned long long)pointer % 4 !=0)pointer += 4 - (unsigned long long)pointer%4; //alignment 4 byte + }else if(token_type == FDT_NOP) + { + callback(token_type,0,0,0); + }else if(token_type == FDT_END) + { + callback(token_type,0,0,0); + }else + { + uart_printf("error type:%x\n",token_type); + return; + } + } +} + +void dtb_callback_show_tree(uint32_t node_type, char *name, void *data, uint32_t name_size) +{ + static int level = 0; + if(node_type==FDT_BEGIN_NODE) + { + for(int i=0;i request successful +#define MBOX_FULL 0x80000000 +#define MBOX_EMPTY 0x40000000 + +/** + * Make a mailbox call. Returns 0 on failure, non-zero on success + */ +int mbox_call(unsigned char ch) // Mailbox 0 define several channels, but we only use channel 8 (CPU->GPU) for communication. +{ + unsigned int r = (((unsigned int)((unsigned long)&mbox)&~0xF) | (ch&0xF)); + /* wait until we can write to the mailbox */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_FULL); + /* write the address of our message to the mailbox with channel identifier */ + *MBOX_WRITE = r; + /* now wait for the response */ + while(1) { + /* is there a response? */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_EMPTY); + /* is it a response to our message? */ + if(r == *MBOX_READ) + /* is it a valid successful response? */ + return mbox[1]==MBOX_RESPONSE; + } + return 0; +} \ No newline at end of file diff --git a/lab2/src/shell.c b/lab2/src/shell.c new file mode 100644 index 000000000..59bb42213 --- /dev/null +++ b/lab2/src/shell.c @@ -0,0 +1,76 @@ +#include "uart.h" +#include "string.h" +#include "shell.h" +#include "mbox.h" +#include "system.h" +#include "filesystem.h" +#include "dtb.h" + +void shell() +{ + char cmd[MAX_BUF_SIZE]; + print_system_messages(); + while(1) + { + uart_printf("# "); + uart_gets(cmd); + do_cmd(cmd); + } +} + +void do_cmd(char* cmd) +{ + if(strcmp(cmd,"help")==0) + { + uart_puts("help : print this help menu"); + uart_puts("hello : print Hello World!"); + uart_puts("reboot : reboot the device"); + uart_puts("ls : list current directory"); + uart_puts("cat : print content of a file"); + uart_puts("show_device_tree : show device tree"); + } + else if(strcmp(cmd,"hello")==0) + { + uart_puts("Hello World!"); + } + else if(strcmp(cmd,"reboot")==0) + { + reboot(); + }else if(strcmp(cmd,"cat")==0) + { + uart_printf("Filename: "); + char filepath[MAX_BUF_SIZE]; + uart_gets(filepath); + cat(filepath); + + }else if(strcmp(cmd,"ls")==0) + { + ls("."); + }else if(strcmp(cmd,"show_device_tree")==0) + { + traverse_device_tree(dtb_place,dtb_callback_show_tree); + }else + { + uart_puts("Unknown command!"); + } +} + +void print_system_messages() +{ + unsigned int board_revision; + get_board_revision(&board_revision); + uart_printf("Board revision is : 0x"); + uart_hex(board_revision); + uart_puts(""); + + unsigned int arm_mem_base_addr; + unsigned int arm_mem_size; + + get_arm_memory_info(&arm_mem_base_addr,&arm_mem_size); + uart_printf("ARM memory base address in bytes : 0x"); + uart_hex(arm_mem_base_addr); + uart_puts(""); + uart_printf("ARM memory size in bytes : 0x"); + uart_hex(arm_mem_size); + uart_puts(""); +} \ No newline at end of file diff --git a/lab2/src/sprintf.c b/lab2/src/sprintf.c new file mode 100644 index 000000000..650b4ab8b --- /dev/null +++ b/lab2/src/sprintf.c @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +/** + * minimal sprintf implementation + */ + +#include "uart.h" + +unsigned int vsprintf(char *dst, char* fmt, __builtin_va_list args) +{ + long int arg; + int len, sign, i; + char *p, *orig=dst, tmpstr[19]; + + // failsafes + if(dst==(void*)0 || fmt==(void*)0) { + return 0; + } + + // main loop + arg = 0; + while(*fmt) { + if(dst-orig > MAX_BUF_SIZE-0x10) + { + uart_puts("Error!!! format string too long!!!!"); + return -1; + } + // argument access + if(*fmt=='%') { + fmt++; + // literal % + if(*fmt=='%') { + goto put; + } + len=0; + // size modifier + while(*fmt>='0' && *fmt<='9') { + len *= 10; + len += *fmt-'0'; + fmt++; + } + // skip long modifier + if(*fmt=='l') { + fmt++; + } + // character + if(*fmt=='c') { + arg = __builtin_va_arg(args, int); + *dst++ = (char)arg; + fmt++; + continue; + } else + // decimal number + if(*fmt=='d') { + arg = __builtin_va_arg(args, int); + // check input + sign=0; + if((int)arg<0) { + arg*=-1; + sign++; + } + if(arg>99999999999999999L) { + arg=99999999999999999L; + } + // convert to string + i=18; + tmpstr[i]=0; + do { + tmpstr[--i]='0'+(arg%10); + arg/=10; + } while(arg!=0 && i>0); + if(sign) { + tmpstr[--i]='-'; + } + // padding, only space + if(len>0 && len<18) { + while(i>18-len) { + tmpstr[--i]=' '; + } + } + p=&tmpstr[i]; + goto copystring; + } else + // hex number + if(*fmt=='x') { + arg = __builtin_va_arg(args, long int); + // convert to string + i=16; + tmpstr[i]=0; + do { + char n=arg & 0xf; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + tmpstr[--i]=n+(n>9?0x37:0x30); + arg>>=4; + } while(arg!=0 && i>0); + // padding, only leading zeros + if(len>0 && len<=16) { + while(i>16-len) { + tmpstr[--i]='0'; + } + } + p=&tmpstr[i]; + goto copystring; + } else + // string + if(*fmt=='s') { + p = __builtin_va_arg(args, char*); +copystring: if(p==(void*)0) { + p="(null)"; + } + while(*p) { + *dst++ = *p++; + } + } + } else { +put: *dst++ = *fmt; + } + fmt++; + } + *dst=0; + // number of bytes written + return dst-orig; +} + +/** + * Variable length arguments + */ +unsigned int sprintf(char *dst, char* fmt, ...) +{ + __builtin_va_list args; + __builtin_va_start(args, fmt); + unsigned int r = vsprintf(dst,fmt,args); + __builtin_va_end(args); + return r; +} \ No newline at end of file diff --git a/lab2/src/start.S b/lab2/src/start.S new file mode 100644 index 000000000..e28b48ab5 --- /dev/null +++ b/lab2/src/start.S @@ -0,0 +1,30 @@ +.section ".text.boot" + +.global _start + +_start: + // read cpu id, stop slave cores + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, 2f + // cpu id > 0, stop +1: wfe + b 1b +2: // cpu id == 0 + + // set top of stack just before our code (stack grows to a lower address per AAPCS64) + ldr x1, =_start + mov sp, x1 + + // clear bss + ldr x1, =__bss_start + ldr w2, =__bss_size +3: cbz w2, 4f + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, 3b + + // jump to C code, should not return +4: bl main + // for failsafe, halt this core too + b 1b diff --git a/lab2/src/string.c b/lab2/src/string.c new file mode 100644 index 000000000..c8e4eed7c --- /dev/null +++ b/lab2/src/string.c @@ -0,0 +1,84 @@ +#include "string.h" +#include + +int strcmp (const char *p1, const char *p2) +{ + const unsigned char *s1 = (const unsigned char *) p1; + const unsigned char *s2 = (const unsigned char *) p2; + unsigned char c1, c2; + do + { + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0') + return c1 - c2; + } + while (c1 == c2); + return c1 - c2; +} + +int strncmp (const char *s1, const char *s2, unsigned long long n) +{ + unsigned char c1 = '\0'; + unsigned char c2 = '\0'; + if (n >= 4) + { + size_t n4 = n >> 2; + do + { + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0' || c1 != c2) + return c1 - c2; + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0' || c1 != c2) + return c1 - c2; + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0' || c1 != c2) + return c1 - c2; + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0' || c1 != c2) + return c1 - c2; + } while (--n4 > 0); + n &= 3; + } + while (n > 0) + { + c1 = (unsigned char) *s1++; + c2 = (unsigned char) *s2++; + if (c1 == '\0' || c1 != c2) + return c1 - c2; + n--; + } + return c1 - c2; +} + +char* strcat (char *dest, const char *src) +{ + strcpy (dest + strlen (dest), src); + return dest; +} + +char* strcpy (char *dest, const char *src) +{ + return memcpy (dest, src, strlen (src) + 1); +} + +unsigned long long strlen(const char *str) +{ + size_t count = 0; + while((unsigned char)*str++)count++; + return count; +} + +char* memcpy (void *dest, const void *src, unsigned long long len) +{ + char *d = dest; + const char *s = src; + while (len--) + *d++ = *s++; + return dest; +} \ No newline at end of file diff --git a/lab2/src/system.c b/lab2/src/system.c new file mode 100644 index 000000000..a1bd53864 --- /dev/null +++ b/lab2/src/system.c @@ -0,0 +1,82 @@ +#include "system.h" +#include "uart.h" +#include "mbox.h" + +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + +/* For all return 0 -> success , -1 failure*/ + +int get_board_revision(unsigned int* board_revision) +{ + /* + GET_BOARD_REVISION + */ + mbox[0] = 7*4; // length of the message + mbox[1] = MBOX_REQUEST; // request code + mbox[2] = GET_BOARD_REVISION; // tag identifier + mbox[3] = 4; // value buffer size in bytes + mbox[4] = 0; // request codes : b31 clear, b30-b0 reversed + mbox[5] = 0; // clear output buffer + mbox[6] = MBOX_TAG_LAST; // end tag + // send the message to the GPU and receive answer + if (mbox_call(MBOX_CH_PROP)) { + *board_revision = mbox[5]; + return 0; + } else { + uart_puts("Unable to query serial!"); + *board_revision = mbox[5] = -1; + return -1; + } +} + +int get_arm_memory_info(unsigned int* base_addr,unsigned int* size) +{ + /* + GET arm_memory address and size + */ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // request code + mbox[2] = GET_ARM_MEMORY; // tag identifier + mbox[3] = 8; // value buffer size in bytes + mbox[4] = 0; // request codes : b31 clear, b30-b0 reversed + mbox[5] = 0; // clear output buffer ( u32: base address in bytes ) + mbox[6] = 0; // clear output buffer ( u32: size in bytes ) + mbox[7] = MBOX_TAG_LAST; // end tag + + // send the message to the GPU and receive answer + if (mbox_call(MBOX_CH_PROP)) { + *base_addr = mbox[5]; + *size = mbox[6]; + return 0; + } else { + uart_puts("Unable to query serial!"); + return -1; + } +} + +void set(long addr, unsigned int value) +{ + volatile unsigned int* point = (unsigned int*)addr; + *point = value; +} + +void reboot() +{ + //disable_uart(); + reset(1); // timeout = 1/16th of a second? (whatever) +} + +void reset(int tick) +{ // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick + while(1); +} + +void cancel_reset() +{ + set(PM_RSTC, PM_PASSWORD | 0); // full reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} \ No newline at end of file diff --git a/lab2/src/uart.c b/lab2/src/uart.c new file mode 100644 index 000000000..7ceeac441 --- /dev/null +++ b/lab2/src/uart.c @@ -0,0 +1,192 @@ +#include "gpio.h" +#include "uart.h" +#include "sprintf.h" + +/* Auxilary mini UART registers */ +#define AUX_ENABLE ((volatile unsigned int*)(MMIO_BASE+0x00215004)) +#define AUX_MU_IO ((volatile unsigned int*)(MMIO_BASE+0x00215040)) +#define AUX_MU_IER ((volatile unsigned int*)(MMIO_BASE+0x00215044)) +#define AUX_MU_IIR ((volatile unsigned int*)(MMIO_BASE+0x00215048)) +#define AUX_MU_LCR ((volatile unsigned int*)(MMIO_BASE+0x0021504C)) +#define AUX_MU_MCR ((volatile unsigned int*)(MMIO_BASE+0x00215050)) +#define AUX_MU_LSR ((volatile unsigned int*)(MMIO_BASE+0x00215054)) +#define AUX_MU_MSR ((volatile unsigned int*)(MMIO_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE+0x0021505C)) +#define AUX_MU_CNTL ((volatile unsigned int*)(MMIO_BASE+0x00215060)) +#define AUX_MU_STAT ((volatile unsigned int*)(MMIO_BASE+0x00215064)) +#define AUX_MU_BAUD ((volatile unsigned int*)(MMIO_BASE+0x00215068)) + +// get address from linker +extern volatile unsigned char _end; + +/** + * Set baud rate and characteristics (115200 8N1) and map to GPIO + */ +void uart_init() +{ + register unsigned int r; + + /* initialize UART */ + *AUX_ENABLE |=1; // Set AUXENB register to enable mini UART. Then mini UART register can be accessed. + *AUX_MU_CNTL = 0; // Set AUX_MU_CNTL_REG to 0. Disable transmitter and receiver during configuration. + *AUX_MU_IER = 0; // Set AUX_MU_IER_REG to 0. Disable interrupt because currently you don’t need interrupt. + *AUX_MU_LCR = 3; // Set AUX_MU_LCR_REG to 3. Set the data size to 8 bit. + *AUX_MU_MCR = 0; // Set AUX_MU_MCR_REG to 0. Don’t need auto flow control. + *AUX_MU_IIR = 0xc6; // disable interrupts + *AUX_MU_BAUD = 270; // 115200 baud + /* map UART1 to GPIO pins */ + r=*GPFSEL1; + r&=~((7<<12)|(7<<15)); // gpio14, gpio15 + r|=(2<<12)|(2<<15); // alt5 + *GPFSEL1 = r; + *GPPUD = 0; // enable pins 14 and 15 (disable pull up/down) + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = (1<<14)|(1<<15); + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = 0; // flush GPIO setup + *AUX_MU_CNTL = 3; // enable Tx, Rx + + while((*AUX_MU_LSR&0x01))*AUX_MU_IO; //clean rx data +} + +// maybe don't do so many step +void disable_uart() +{ + register unsigned int r; + *AUX_ENABLE &= ~(unsigned int)1; + *AUX_MU_CNTL = 0; + r=*GPFSEL1; + r|=((7<<12)|(7<<15)); // gpio14, gpio15 + r&=~(2<<12)|(2<<15); // alt5 + *GPFSEL1 = r; + *GPPUD = 2; // enable pins 14 and 15 (pull down) + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = (1<<14)|(1<<15); + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = 0; // flush GPIO setup +} + +/** + * Send a character + */ +void uart_putc(char c) { + unsigned int intc = c; + /* wait until we can send */ + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x20)); + /* write the character to the buffer */ + *AUX_MU_IO=intc; +} + +/** + * Receive a character + */ +char uart_getc() { + char r; + /* wait until something is in the buffer */ + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x01)); + /* read it and return */ + r=(char)(*AUX_MU_IO); + + /* + echo back + */ + if(r == '\r') + { + uart_puts("\r"); + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x40)); //wait for output success Transmitter idle + }else if(r == '\x7f') // backspace -> get del + { + uart_putc('\b'); + uart_putc(' '); + uart_putc('\b'); + }else + { + uart_putc(r); + } + /* convert carrige return to newline */ + return r=='\r'?'\n':r; +} + +/** + * Display a string with newline + */ +int uart_puts(char *s) { + int i=0; + + while(*s) { + uart_putc(*s++); + i++; + } + uart_putc('\r'); + uart_putc('\n'); + + return i+2; +} + +/** + * get a string + */ +char* uart_gets(char *buf) +{ + int count; + char c; + char *s; + for (s = buf,count = 0; (c = uart_getc()) != '\n' && count!=MAX_BUF_SIZE-1 ;count++) + { + *s = c; + if(*s=='\x7f') + { + count--; + if(count==-1) + { + uart_putc(' '); // prevent back over command line # + continue; + } + s--; + count--; + continue; + } + s++; + } + *s = '\0'; + return buf; +} + +/** + * printf (from https://github.com/bztsrc/raspi3-tutorial/tree/master/12_printf) + initial printf from github dont use any va_end, and it is also can run. (in assembly there is nothing compiled from __builtin_va_end) + */ +int uart_printf(char *fmt, ...) { + __builtin_va_list args; + __builtin_va_start(args, fmt); + char buf[MAX_BUF_SIZE]; + // we don't have memory allocation yet, so we + // simply place our string after our code + char *s = (char*)buf; + // use sprintf to format our string + int count = vsprintf(s,fmt,args); + // print out as usual + while(*s) { + /* convert newline to carrige return + newline */ + if(*s=='\n') + uart_putc('\r'); + uart_putc(*s++); + } + __builtin_va_end(args); + return count; +} + +/** + * Display a binary value in hexadecimal + */ +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_putc(n); + } +}