You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
408 lines
5.4 KiB
408 lines
5.4 KiB
|
|
#include <asm.h>
|
|
#include <regdef.h>
|
|
#include <target/bonito.h>
|
|
|
|
.data
|
|
.global cachelock_start;
|
|
.global cachelock_end;
|
|
cachelock_start:
|
|
LEAF(tgt_putchar1)
|
|
la v0, COM1_BASE_ADDR
|
|
1:
|
|
lbu v1, 5(v0)
|
|
and v1, 0x20
|
|
beqz v1, 1b
|
|
nop
|
|
|
|
sb a0, 0(v0)
|
|
j ra
|
|
nop
|
|
END(tgt_putchar1)
|
|
|
|
LEAF(tgt_testchar1)
|
|
.set noat
|
|
la v0, COM1_BASE_ADDR
|
|
1:
|
|
lbu v1, 5(v0)
|
|
and v0, v1, 1
|
|
jr ra
|
|
nop
|
|
.set at
|
|
END(tgt_testchar)
|
|
|
|
#define SPI_BASE 0xbfe00220
|
|
#define SPCR 0x0
|
|
#define SPSR 0x1
|
|
#define TXFIFO 0x2
|
|
#define SPER 0x3
|
|
#define PARAM1 0x4
|
|
#define SOFTCS 0x5
|
|
#define PARAM2 0x6
|
|
|
|
.macro set_spi add,val
|
|
li v1,\val;
|
|
sb v1,\add(v0);
|
|
.endm
|
|
|
|
|
|
LEAF(spi_init)
|
|
|
|
li v0,SPI_BASE
|
|
set_spi SPSR,0xc0;
|
|
set_spi PARAM1,0x10;
|
|
set_spi SPER,0x5;
|
|
set_spi PARAM2,1;
|
|
set_spi SPCR,0x50;
|
|
jr ra
|
|
nop
|
|
END(spi_init)
|
|
|
|
|
|
LEAF(program)
|
|
.set mips32
|
|
.set noreorder
|
|
.set noat
|
|
#spi io base
|
|
li t0,SPI_BASE;
|
|
move t3,ra
|
|
li v0,0x11; /*high cs*/
|
|
sb v0,5(t0);
|
|
bal spi_waitsr; /*wait_sr(v0)*/
|
|
nop;
|
|
li v0,0x1;
|
|
sb v0,5(t0);
|
|
li v0,6;
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0);
|
|
li v0,0x1;
|
|
sb v0,5(t0);
|
|
li a3,0x2;
|
|
300:
|
|
li v0,0x05;
|
|
bal spi_wb;
|
|
nop;
|
|
andi v0,0x3;
|
|
bne v0,a3,300b;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0);
|
|
li v0,0x1;
|
|
sb v0,5(t0);
|
|
li v0,0x1;
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x0;
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0);
|
|
1:
|
|
lw t2,(a0)
|
|
12:
|
|
bal spi_waitsr;nop;
|
|
li v0,0x1;
|
|
sb v0,5(t0);
|
|
li v0,6;
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0);
|
|
li v0,0x1;
|
|
sb v0,5(t0);
|
|
li a3,0x2;
|
|
300:li v0,0x05;
|
|
bal spi_wb;
|
|
nop;
|
|
andi v0,0x3;
|
|
bne v0,a3,300b;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0);
|
|
li v0,0x1;
|
|
sb v0,5(t0);
|
|
li v0,2;
|
|
bal spi_wb;
|
|
nop;
|
|
and v0,a1,0xfff;
|
|
bnez v0,11f;
|
|
nop;
|
|
11:srl v0,a1,16;
|
|
bal spi_wb;
|
|
nop;
|
|
srl v0,a1,8;
|
|
bal spi_wb;
|
|
nop;
|
|
move v0,a1;
|
|
bal spi_wb;
|
|
nop;
|
|
2:
|
|
andi v0,t2,0xff
|
|
bal spi_wb;
|
|
nop;
|
|
srl t2, 8
|
|
|
|
li v0,0x11;
|
|
sb v0,5(t0);
|
|
addiu a0,1;
|
|
addiu a1,1;
|
|
addiu a2,-1;
|
|
beqz a2,3f;
|
|
nop;
|
|
andi v0, a0,3
|
|
bnez v0,12b
|
|
nop
|
|
b 1b;
|
|
nop;
|
|
3:li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
bal spi_waitsr;
|
|
nop;
|
|
sync;
|
|
move ra,t3;
|
|
jr ra ;
|
|
nop;
|
|
END(program)
|
|
|
|
LEAF(erase_area)
|
|
li t0,SPI_BASE;
|
|
move t1, ra;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
bal spi_waitsr; /*wait_sr(v0)*/
|
|
nop;
|
|
2:li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li v0,6; /* write enable */
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li a3,0x2;
|
|
300:li v0,0x05; /* check WEL */
|
|
bal spi_wb;
|
|
nop;
|
|
andi v0,0x3;
|
|
bne v0,a3,300b;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li v0,0x1; /* write enable */
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x0; /* write sr to 0 */
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
bal spi_waitsr; /*wait_sr(v0)*/
|
|
nop;
|
|
li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li v0,6; /* write enable */
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li a3,0x2;
|
|
300:li v0,0x05; /* check WEL */
|
|
bal spi_wb;
|
|
nop;
|
|
andi v0,0x3;
|
|
bne v0,a3,300b;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li v0,0xd8; /*bluk erase*/
|
|
bal spi_wb;
|
|
nop;
|
|
srl v0,a0,16; /*addr*/
|
|
bal spi_wb;
|
|
nop;
|
|
srl v0,a0,8;
|
|
bal spi_wb;
|
|
nop;
|
|
move v0,a0;
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
bal spi_waitsr; /*wait_sr(v0)*/
|
|
nop;
|
|
addu a0,a2;
|
|
slt v0,a1,a0;
|
|
beqz v0,2b;
|
|
nop;
|
|
sync;
|
|
move ra,t1
|
|
jr ra
|
|
nop;
|
|
END(erase_area)
|
|
|
|
LEAF(erase)
|
|
li t0,SPI_BASE;
|
|
move t1, ra;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
bal spi_waitsr; /*wait_sr(v0)*/
|
|
nop;
|
|
2:li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li v0,6; /* write enable */
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li a3,0x2;
|
|
300:li v0,0x05; /* check WEL */
|
|
bal spi_wb;
|
|
nop;
|
|
andi v0,0x3;
|
|
bne v0,a3,300b;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li v0,0x1; /* write enable */
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x0; /* write sr to 0 */
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
bal spi_waitsr; /*wait_sr(v0)*/
|
|
nop;
|
|
li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li v0,6; /* write enable */
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li a3,0x2;
|
|
300:li v0,0x05; /* check WEL */
|
|
bal spi_wb;
|
|
nop;
|
|
andi v0,0x3;
|
|
bne v0,a3,300b;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li v0,0xc7; /*chip erase*/
|
|
bal spi_wb;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
bal spi_waitsr; /*wait_sr(v0)*/
|
|
nop;
|
|
sync;
|
|
move ra,t1
|
|
jr ra
|
|
nop;
|
|
END(erase)
|
|
|
|
LEAF(spi_wb)
|
|
sb v0,2(t0); /**** 103 send_cmd(v0) *****/
|
|
1:lb v0,1(t0);
|
|
andi v0,1;
|
|
bnez v0,1b;
|
|
nop;
|
|
lb v0,2(t0);
|
|
jr ra;
|
|
nop; /**** 103 send_cmd(v0)*****/
|
|
END(spi_wb)
|
|
|
|
LEAF(spi_waitsr)
|
|
move a3,ra; /**** 112 wait_sr(v0)*****/
|
|
li v0,0x1;
|
|
sb v0,5(t0); /*low cs*/
|
|
li v0,0x5;
|
|
bal spi_wb;
|
|
nop;
|
|
1120:li v0,0xff;
|
|
bal spi_wb;
|
|
nop;
|
|
andi v0,1;
|
|
bnez v0,1120b;
|
|
nop;
|
|
li v0,0x11;
|
|
sb v0,5(t0); /*high cs*/
|
|
move ra, a3;
|
|
jr ra
|
|
nop; /**** 112 wait_sr(v0)****/
|
|
END(spi_waitsr)
|
|
|
|
|
|
cachelock_end:
|
|
|
|
.text
|
|
|
|
.set mips3;
|
|
initmips:
|
|
.global initmips;
|
|
/*for data and bss*/
|
|
dli t0,0x900000003ff00200 //lock 0x9f000000 - 0x9f00f000
|
|
dli t1,0xffffffffffffc000
|
|
sd t1,0x40(t0)
|
|
la t1, _fdata
|
|
li v0, 0x1fffffff
|
|
and t1, v0
|
|
dli v0,0x8000000000000000
|
|
or t1,v0
|
|
sd t1,0x0(t0)
|
|
|
|
|
|
la sp, _fdata
|
|
addiu sp, 0x4000-16
|
|
|
|
/* Clear BSS */
|
|
la t0, _edata
|
|
la t2, _end
|
|
2: sw zero, 0(t0)
|
|
bne t2, t0, 2b
|
|
addu t0, 4
|
|
|
|
la t0, _fdata
|
|
addiu t2,t0,0x4000
|
|
2: lw zero, 0(t0)
|
|
bne t2, t0, 2b
|
|
addu t0, 4
|
|
|
|
#if 1
|
|
bal tgt_testchar
|
|
nop
|
|
beqz v0,1f
|
|
nop
|
|
bal tgt_getchar
|
|
nop
|
|
li v1,'d';
|
|
bne v0,v1,1f
|
|
nop
|
|
b 2f
|
|
nop
|
|
1:
|
|
b initmips1
|
|
nop
|
|
#endif
|
|
2:
|
|
|
|
bal xmodem
|
|
nop
|
|
|