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.
 
 
 
 
 
 

456 lines
4.1 KiB

#define GPIO_DIR_HIGH (MMIO_BASE+0x0001000c)
#define GPIO_DATA_HIGH (MMIO_BASE+0x00010004)
#define G_OUTPUT 1
#define G_INPUT 0
/*
can't use t1,t5,t6
*/
LEAF(_i2c_sleep)
//
// li t0,0x300
li t0,0x10
sll a0,t0,a0
1: nop
subu a0,1
bnez a0,1b
nop
jr ra
nop
END(_i2c_sleep)
LEAF(_sda_dir)
li t0,GPIO_DIR_HIGH
lwu t2,0(t0)
nop
beqz a0,1f
nop
ori t2,t2,0x8000
b 2f
nop
1: li t3,~(0x8000)
and t2,t2,t3
2: sw t2,0(t0)
nop
jr ra
nop
END(_sda_dir)
LEAF(_scl_dir)
li t0,GPIO_DIR_HIGH;
lwu t2,0(t0)
nop
beqz a0,1f
nop
ori t2,t2,0x4000
b 2f
nop
1: li t3,~(0x4000)
and t2,t2,t3
2: sw t2,0(t0)
nop
jr ra
nop
END(_scl_dir)
LEAF(_sda_bit)
li t0,GPIO_DATA_HIGH;
lwu t2,0(t0)
nop
beqz a0,1f
nop
ori t2,t2,0x8000
b 2f
nop
1: li t3,~(0x8000)
and t2,t2,t3
2: sw t2,0(t0)
nop
jr ra
nop
END(_sda_bit)
LEAF(_scl_bit)
li t0,GPIO_DATA_HIGH;
lwu t2,0(t0)
nop
beqz a0,1f
nop
ori t2,t2,0x4000
b 2f
nop
1: li t3,~(0x4000)
and t2,t2,t3
2: sw t2,0(t0)
nop
jr ra
nop
END(_sda_bit)
LEAF(_i2c_start)
move t7,ra
li a0,G_OUTPUT
bal _sda_dir
nop
li a0,G_OUTPUT
bal _scl_dir
nop
li a0,0
bal _scl_bit
nop
li a0,1
bal _i2c_sleep
nop
li a0,1
bal _sda_bit
nop
li a0,1
bal _i2c_sleep
nop
li a0,1
bal _scl_bit
nop
li a0,5
bal _i2c_sleep
nop
li a0,0
bal _sda_bit
nop
li a0,5
bal _i2c_sleep
nop
li a0,0
bal _scl_bit
nop
li a0,2
bal _i2c_sleep
nop
jr t7
nop
END(_i2c_start)
LEAF(_i2c_stop)
move t7,ra
li a0,G_OUTPUT
bal _sda_dir
nop
li a0,G_OUTPUT
bal _scl_dir
nop
li a0,0
bal _scl_bit
nop
li a0,1
bal _i2c_sleep
nop
li a0,0
bal _sda_bit
nop
li a0,1
bal _i2c_sleep
nop
li a0,1
bal _scl_bit
nop
li a0,5
bal _i2c_sleep
nop
li a0,1
bal _sda_bit
nop
li a0,5
bal _i2c_sleep
nop
li a0,0
bal _scl_bit
nop
li a0,2
bal _i2c_sleep
nop
jr t7
nop
END(_i2c_stop)
LEAF(_i2c_send_ack)
move t7,ra
move t4,a0
li a0,G_OUTPUT
bal _sda_dir
nop
move a0,t4
bal _sda_bit
nop
li a0,3
bal _i2c_sleep
nop
li a0,1
bal _scl_bit
nop
li a0,5
bal _i2c_sleep
nop
li a0,0
bal _scl_bit
nop
li a0,2
bal _i2c_sleep
nop
jr t7
nop
END(_i2c_send_ack)
LEAF(_i2c_rec_ack)
move t7,ra
li v0,1
li t4,10
li a0,G_INPUT
bal _sda_dir
nop
li a0,3
bal _i2c_sleep
nop
li a0,1
bal _scl_bit
nop
li a0,5
bal _i2c_sleep
nop
li t9,GPIO_DATA_HIGH
lwu t9,0(t9)
nop
andi t9,t9,0x8000
2: beqz t9,1f
nop
li a0,1
bal _i2c_sleep
nop
subu t4,t4,1
bnez t4,3f
nop
li v0,0
b 1f
nop
3: li t9,GPIO_DATA_HIGH
lwu t9,0(t9)
nop
andi t9,t9,0x8000
b 2b
nop
1: li a0,0
bal _scl_bit
nop
li a0,3
bal _i2c_sleep
nop
jr t7
nop
END(_i2c_rec_ack)
LEAF(_i2c_rec)
move t7,ra
li t9,0x7
li v0,0
li a0,G_INPUT
bal _sda_dir
nop
2: bltz t9,1f
nop
li a0,5
bal _i2c_sleep
nop
li a0,1
bal _scl_bit
nop
li a0,3
bal _i2c_sleep
nop
li t4,GPIO_DATA_HIGH
lwu t4,0(t4)
nop
andi t4,t4,0x8000
beqz t4,3f
nop
li t4,1
3: sll t4,t4,t9
or v0,v0,t4
li a0,3
bal _i2c_sleep
nop
li a0,0
bal _scl_bit
nop
sub t9,t9,1
b 2b
nop
1: jr t7
nop
END(_i2c_rec)
LEAF(_i2c_send)
move t7,ra
move t4,a0
li t9,0x7
li a0,G_OUTPUT
bal _sda_dir
nop
2: bltz t9,1f
nop
move a0,t4
srl a0,a0,t9
andi a0,a0,1
bal _sda_bit
nop
li a0,1
bal _i2c_sleep
nop
li a0,1
bal _scl_bit
nop
li a0,5
bal _i2c_sleep
nop
li a0,0
bal _scl_bit
nop
li a0,1
bal _i2c_sleep
nop
sub t9,t9,1
b 2b
nop
1: li a0,1
bal _sda_bit
nop
jr t7
nop
END(_i2c_send)
/*
a0,a2:slave device addr
a1,a3:sub addr
v0:recieve data
v1:show if sucess,0:sucess,1:failure
*/
LEAF(i2cread)
move t8,ra
nop
move a2,a0
move a3,a1
li v0,0
li v1,0
bal _i2c_start
nop
move a0,a2
bal _i2c_send
nop
bal _i2c_rec_ack
nop
beqz v0,1f
nop
move a0,a3
bal _i2c_send
nop
beqz v0,1f
nop
bal _i2c_rec_ack
nop
beqz v0,1f
nop
bal _i2c_start
nop
move a0,a2
addu a0,a0,1
bal _i2c_send
nop
beqz v0,1f
nop
bal _i2c_rec_ack
nop
beqz v0,1f
nop
bal _i2c_rec
nop
move k0,v0
li a0,1
bal _i2c_send_ack
nop
bal _i2c_stop
nop
li v1,0
move v0,k0
b 2f
nop
1: li v1,1
2: jr t8
nop
END(i2cread)