📄 flash.sa
字号:
ldw *ar8++,br4
ldw *ar8++,br5
ldw *ar8++,br6
stw br17,*ar7 ;0xA0->0x01460000
stw br3,*ar7++ ;写数据
label5: stw br17,*ar7
ldw *-ar7[1],br20 ;验证数据
cmpeq br20,br3,br21
[!br21] b label5
; stw br17,*ar7
stw br4,*ar7++
label6: ldw *-ar7[1],br20
cmpeq br20,br4,br21
[!br21] b label6
stw br17,*ar7
stw br5,*ar7++
label7: ldw *-ar7[1],br20
cmpeq br20,br5,br21
[!br21] b label7
stw br17,*ar7
stw br6,*ar7++
label8: ldw *-ar7[1],br20
cmpeq br20,br6,br21
[!br21] b label8
sub br15,1,br15 ;写flash
[br15] b label4
stw br18,*ar7
stw br19,*ar7 ;Reset,退出Bypass状态
zero br7
stw br7,*ar0
mv br7,status
exit0: nop
.return status
.endproc
;本函数用于向flash中写入密码卡ID号(由密码卡制造商提供)
.global _cardserial_write
_cardserial_write: .cproc
.reg status,error1,op_addr,exchange
.reg ar0,ar1,ar2,ar3,ar4,ar5,ar6,ar7
.reg br0,br1,br2,br3,br4,br5,br6,br7,br8,br9,br10,br11,br12,br13,br14,br15,br16
zero ar6
mvk 0x0a,error1 ;错误代码
mvkl 0x8000BFFC,op_addr
mvkh 0x8000BFFC,op_addr ;操作员权限地址
mvkl 0x80008800,exchange
mvkh 0x80008800,exchange ;状态码地址
ldw *op_addr,ar7 ;确定当前是否有操作员
cmpeq ar6,ar7,ar6
[ar6] stw error1,*exchange ;当前没有操作员权限,退出
[ar6] mv error1,status
[ar6] b exit1
mvkl 0x80008800,ar0
mvkh 0x80008800,ar0 ;状态码地址
mvkl 0x80008804,ar1
mvkh 0x80008804,ar1 ;ID号存储地址
mvkl 0x01420010,ar2
mvkh 0x01420010,ar2 ;程序版本号在flash中的存储地址
mvkl 0x1401554,ar3
mvkh 0x1401554,ar3 ;擦除flash需要的地址
mvkl 0x1400aa8,ar4
mvkh 0x1400aa8,ar4 ;擦除flash需要的地址
mvkl 0x01420000,ar5
mvkh 0x01420000,ar5 ;要擦除的flash扇区地址
zero br0 ;作为状态码使用
mvkl 0xaa00aa,br2
mvkh 0xaa00aa,br2 ;擦除flash需要的参数
mvkl 0x550055,br3
mvkh 0x550055,br3 ;擦除flash需要的参数
mvkl 0x800080,br4
mvkh 0x800080,br4 ;擦除flash需要的参数
mvkl 0x300030,br5
mvkh 0x300030,br5 ;擦除flash需要的参数
mvkl 0xffffffff,br6
mvkh 0xffffffff,br6 ;擦除flash需要的参数
mvkl 0x200020,br9
mvkh 0x200020,br9 ;Bypass写需要的参数
mvkl 0xA000A0,br10
mvkh 0xA000A0,br10 ;Bypass写需要的参数
mvkl 0x900090,br11
mvkh 0x900090,br11 ;Bypass reset需要的参数
ldw *ar2,br1 ;将程序版本号备份出来
stw br2,*ar3
stw br3,*ar4
stw br4,*ar3
stw br2,*ar3
stw br3,*ar4
stw br5,*ar5
label9: ldw *ar5,br7
cmpeq br7,br6,br8
[!br8] b label9 ;擦除0x01420000扇区
stw br2,*ar3
stw br3,*ar4
stw br9,*ar3 ;设置flash进入Unlock Bypass状态
ldw *ar1++,br12
ldw *ar1++,br13
ldw *ar1++,br14
stw br10,*ar5
stw br12,*ar5++
label10: ldw *-ar5[1],br15
cmpeq br15,br12,br16
[!br16] b label10
stw br10,*ar5
stw br13,*ar5++
label11: ldw *-ar5[1],br15
cmpeq br15,br13,br16
[!br16] b label11
stw br10,*ar5
stw br14,*ar5++
label12: ldw *-ar5[1],br15
cmpeq br15,br14,br16
[!br16] b label12 ;向flash中写入密码卡ID
stw br10,*ar5
stw br1,*ar2
label13: ldw *ar2,br15
cmpeq br15,br1,br16
[!br16] b label13 ;重新向flash写入程序版本号
stw br11,*ar5
stw br0,*ar5 ;Reset,退出Bypass状态
stw br0,*ar0
mv br0,status
exit1:
.return status
.endproc
;本函数用于读取密码卡的ID号
.global _cardserial_read
_cardserial_read: .cproc
.reg status
.reg ar0,ar1,ar2
.reg br0,br1,br2,br3,br4,br5,br6,br7,br8,br9,br10
mvkl 0x80008800,ar0
mvkh 0x80008800,ar0 ;状态码地址
mvkl 0x80008804,ar1
mvkh 0x80008804,ar1 ;密码卡ID存放地址
mvkl 0x01420000,ar2
mvkh 0x01420000,ar2 ;密码卡ID在flash中的存放地址
zero br0 ;作为操作成功状态码
mvkl 0x57,br1
mvkh 0x57,br1 ;作为没有装入密码卡ID的状态码
mvkl 0xFFFFFFFF,br5
mvkh 0xFFFFFFFF,br5
ldw *ar2++,br2
ldw *ar2++,br3
ldw *ar2++,br4
cmpeq br2,br5,br6
cmpeq br3,br5,br7
cmpeq br4,br5,br8
and br6,br7,br9
and br8,br9,br10
[br10] stw br1,*ar0
[br10] mv br1,status ;若没有装入过密码卡ID,则停止执行,返回相关状态码
[br10] b label14
stw br2,*ar1++
stw br3,*ar1++
stw br4,*ar1++ ;上传密码卡ID
stw br0,*ar0
mv br0,status
label14:
.return status
.endproc
;本程序用于读取程序版本号
.global _softrev_read
_softrev_read: .cproc
.reg status
.reg ar0,ar1,ar2
.reg br0,br1
mvkl 0x80008800,ar0
mvkh 0x80008800,ar0 ;状态码存储地址
mvkl 0x80008804,ar1
mvkh 0x80008804,ar1 ;程序版本号存储地址
mvkl 0x01420010,ar2
mvkh 0x01420010,ar2 ;程序版本号在flash中的存储地址
zero br0
ldw *ar2,br1 ;从flash中读出程序版本号
stw br1,*ar1 ;上传程序版本号
stw br0,*ar0 ;设置状态码
mv br0,status
.return status
.endproc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -