PMP V >> Assembly
UART
main.s
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | . equiv zero , $0 . equiv at , $1 . equiv v0 , $2 . equiv v1, $3 . equiv a0 , $4 . equiv a1 , $5 . equiv a2 , $6 . equiv a3, $7 . equiv t0 , $8 . equiv t1 , $9 . equiv t2 , $10 . equiv t3, $11 . equiv t4, $12 . equiv t5, $13 . equiv t6, $14 . equiv t7, $15 . equiv s0 , $16 . equiv s1 , $17 . equiv s2 , $18 . equiv s3 , $19 . equiv s4 , $20 . equiv s5 , $21 . equiv s6, $22 . equiv s7, $23 . equiv t8, $24 . equiv t9, $25 . equiv k0, $26 . equiv k1, $27 . equiv gp, $28 . equiv sp , $29 . equiv fp , $30 . equiv ra , $31 . equiv CLKGR, 0xb0000020 . equiv URBR0, 0xb0030000 . equiv UDLLR0, 0xb0030000 . equiv UDLHR0, 0xb0030004 . equiv UIER0, 0xb0030004 . equiv UFCR0, 0xb0030008 . equiv ULCR0, 0xb003000c . equiv ULSR0, 0xb0030014 . equiv ISR0, 0xb0030020 . equiv PCFUNS, 0xb0010244 . equiv PCTRGC, 0xb0010278 . equiv PCSELS, 0xb0010254 .globl _start .set noreorder .text .ifdef STAGE2 . word 0x555555ff . word 0x55555555 . byte 0xff . byte 0xff . byte 0xff . byte 0x00 . endif _start : nop li v0 , 0x00400004 # disable interrupt mtc0 v0 , $12 li v1, 0x00800000 # clear cause content mtc0 v1, $13 li sp , 0x80004000 uart_init : li v0 , 0x1000 sw v0 , PCFUNS sw v0 , PCTRGC sw v0 , PCSELS lw v0 , CLKGR li v1, 0xfffffffe and v0 , v1 sw v0 , CLKGR sb zero , UIER0 li v0 , 0xef sb v0 , UFCR0 li v0 , 0xfc sb v0 , ISR0 li v0 , 0x03 sb v0 , ULCR0 lbu v0 , ULCR0 ori v0 , 0x80 sb v0 , ULCR0 sb zero , UDLHR0 li v0 , 0x0d sb v0 , UDLLR0 lbu v0 , ULCR0 li v1, 0x7f and v0 , v1 sb v0 , ULCR0 li v0 , 0x17 sb v0 , UFCR0 jal delay li a0 , 100 jal uart_char li a0 , 'A' end : b end uart_char: sb a0 , URBR0 0: lbu v0 , ULSR0 andi v0 , 0x60 li v1, 0x60 bne v0 , v1, 0b nop jr ra nop delay : li v0 , 180 mul a0 , v0 0: bnez a0 , 0b addiu a0 , -1 jr ra nop |
main.ld
OUTPUT_ARCH(mips) ENTRY(_start) MEMORY { low8k : ORIGIN = 0x80000000 , LENGTH = 0x2000 high8k : ORIGIN = 0x80002000 , LENGTH = 0x2000 } SECTIONS { .text : { *(.text.1) *(.text.0) } > low8k .data : { . = ALIGN(4); *(.rodata*) *(.data*) *(.scommon*) *(.reginfo*) } > low8k .bss : { . = ALIGN(4); _bss_start = ABSOLUTE(.); *(.sbss*) *(.bss*) . = ALIGN(4); _bss_end = ABSOLUTE(.); } > high8k __stack = 0x80004000; }
Makefile
all: mipsel-linux-as -o main.o main.s --defsym=STAGE1=1 mipsel-linux-ld -T main.ld -o main.elf main.o mipsel-linux-objcopy -O binary main.elf stage1.bin clean: rm -rf main.o main.elf main.bin stage1.bin
編譯
$ cd $ wget https://github.com/steward-fu/pmp-v/releases/download/v1.0/rs90-toolchain-2019.04.30.tar $ tar xvf rs90-toolchain-2019.04.30.tar $ sudo mv rs90-toolchain /opt/ $ export PATH=$PATH:/opt/rs90-toolchain/usr/bin $ make
接著進入燒錄模式(按下B插入USB),再使用jzboot燒錄stage1.bin就可以