📄 flash.sa
字号:
;;
;本函数用于从flash的指定扇区读取指定长度的数据
.global _read_flash
_read_flash: .cproc
.reg status,error1,error2,exchange
.reg ar0,ar1,ar2,ar3,ar4,ar5
.reg br0,br1,br2,br3,br4,br5,br6,br7,br8,br9
mvk 0x3e,error1
mvk 0x0a,error2
zero ar4
mvkl 0x8000BFFC,ar5
mvkh 0x8000BFFC,ar5
mvkl 0x80008800,exchange
mvkh 0x80008800,exchange
; ldw *ar5,br9 ;确定当前是否有操作员
; cmpeq ar4,br9,br9
; [br9] stw error2,*exchange ;当前没有操作员权限,退出
; [br9] b exit
mvkl 0x80008800,ar0
mvkh 0x80008800,ar0 ;状态码地址
mvkl 0x80008804,ar1
mvkh 0x80008804,ar1 ;起始扇区编号地址,也是读出数据的存放地址
mvkl 0x80008808,ar2
mvkh 0x80008808,ar2 ;读取的扇区数地址
ldw *ar1,br0 ;起始扇区编号
mvkl 0x4,br8
mvkh 0x4,br8
cmpgt br0,br8,br8 ;当前扇区号是否合法
[br8] stw error1,*exchange
[br8] b exit
[!br0] mvkl 0x8000C000,ar3
[!br0] mvkh 0x8000C000,ar3 ;内存中0扇区存放地址
sub br0,1,br0
[!br0] mvkl 0x8000C080,ar3
[!br0] mvkh 0x8000C080,ar3 ;内存中1扇区存放地址
sub br0,1,br0
[!br0] mvkl 0x8000C100,ar3
[!br0] mvkh 0x8000C100,ar3 ;内存中2扇区存放地址
sub br0,1,br0
[!br0] mvkl 0x8000C180,ar3
[!br0] mvkh 0x8000C180,ar3 ;内存中3扇区存放地址
sub br0,1,br0
[!br0] mvkl 0x8000C200,ar3
[!br0] mvkh 0x8000C200,ar3 ;内存中4扇区存放地址
ldw *ar2,br1 ;要读取的扇区数
mvkl 0x5,br8
mvkh 0x5,br8
cmpgt br1,br8,br8 ;当前扇区数是否合法
[br8] stw error1,*exchange
[br8] b exit
cmpeq br1,br8,br8
[br8] stw error1,*exchange
[br8] b exit
mvkl 0x8,br2
mvkh 0x8,br2 ;每个扇区需要循环读的次数 8*16=128
label1: ldw *ar3++,br3
ldw *ar3++,br4
ldw *ar3++,br5
ldw *ar3++,br6
stw br3,*ar1++
stw br4,*ar1++
stw br5,*ar1++
stw br6,*ar1++
sub br2,1,br2
[br2] b label1
mvkl 0x8,br2
mvkh 0x8,br2
sub br1,1,br1
[br1] b label1
zero br7
stw br7,*ar0
mv br7,status
exit: nop
.return status
.endproc
;本函数用于向flash中的指定扇区写入指定长度的数据
.global _write_flash
_write_flash: .cproc
.reg status,error1,error2,op_addr,exchange
.reg ar0,ar1,ar2,ar3,ar4,ar5,ar6,ar7,ar8,ar9,ar10,ar11
.reg br0,br1,br2,br3,br4,br5,br6,br7,br8,br9,br10,br11
.reg br12,br13,br14,br15,br16,br17,br18,br19,br20,br21
zero ar10
mvk 0x3e,error1 ;错误代码
mvk 0x0a,error2 ;错误代码
mvkl 0x8000BFFC,op_addr
mvkh 0x8000BFFC,op_addr ;操作员权限地址
mvkl 0x80008800,exchange
mvkh 0x80008800,exchange ;状态码地址
; ldw *op_addr,ar9 ;确定当前是否有操作员
; cmpeq ar10,ar9,ar9
; [ar9] stw error2,*exchange ;当前没有操作员权限,退出
; [ar9] b exit0
mvkl 0x80008800,ar0
mvkh 0x80008800,ar0 ;状态码地址
mvkl 0x80008804,ar1
mvkh 0x80008804,ar1 ;起始扇区编号地址
mvk 0xa,ar11
ldw *ar1,ar9
cmpgt ar9,ar11,ar9
[ar9] stw error2,*exchange ;非法起始扇区编号 >4
[ar9] b exit0
mvkl 0x80008808,ar2
mvkh 0x80008808,ar2 ;要写入的扇区数地址
ldw *ar2,ar11
add ar11,ar9,ar9
mvk 0x5,ar11
cmpgt ar9,ar11,ar9
[ar9] stw error2,*exchange ;非法要写入的扇区数 >5
[ar9] b exit0
mvkl 0x8000880C,ar4
mvkh 0x8000880C,ar4 ;要写入的数据存放地址
mvkl 0x1401554,ar5
mvkh 0x1401554,ar5 ;擦除flash需要的地址
mvkl 0x1400aa8,ar6
mvkh 0x1400aa8,ar6 ;擦除flash需要的地址
mvkl 0x01460000,ar7
mvkh 0x01460000,ar7 ;要擦除的flash扇区地址
mvkl 0x8000C000,ar8
mvkh 0x8000C000,ar8 ;用户扇区在内存中的首地址
mvkl 0xaa00aa,br8
mvkh 0xaa00aa,br8 ;擦除flash需要的参数
mvkl 0x550055,br9
mvkh 0x550055,br9 ;擦除flash需要的参数
mvkl 0x800080,br10
mvkh 0x800080,br10 ;擦除flash需要的参数
mvkl 0x300030,br11
mvkh 0x300030,br11 ;擦除flash需要的参数
mvkl 0xffffffff,br12
mvkh 0xffffffff,br12 ;擦除flash需要的参数
mvkl 40,br15
mvkh 40,br15 ;写flash需要循环的次数
mvkl 0x200020,br16
mvkh 0x200020,br16 ;Bypass写需要的参数
mvkl 0xA000A0,br17
mvkh 0xA000A0,br17 ;Bypass写需要的参数
mvkl 0x900090,br18
mvkh 0x900090,br18 ;Bypass reset需要的参数
zero br19
ldw *ar1,br0 ;起始扇区编号
[!br0] mvkl 0x8000C000,ar3
[!br0] mvkh 0x8000C000,ar3 ;内存中0扇区存放地址
sub br0,1,br0
[!br0] mvkl 0x8000C080,ar3
[!br0] mvkh 0x8000C080,ar3 ;内存中1扇区存放地址
sub br0,1,br0
[!br0] mvkl 0x8000C100,ar3
[!br0] mvkh 0x8000C100,ar3 ;内存中2扇区存放地址
sub br0,1,br0
[!br0] mvkl 0x8000C180,ar3
[!br0] mvkh 0x8000C180,ar3 ;内存中3扇区存放地址
sub br0,1,br0
[!br0] mvkl 0x8000C200,ar3
[!br0] mvkh 0x8000C200,ar3 ;内存中4扇区存放地址
ldw *ar2,br1 ;要写入的扇区数
mvkl 0x8,br2
mvkh 0x8,br2 ;每个扇区需要循环写的次数
label2: ldw *ar4++,br3
ldw *ar4++,br4
ldw *ar4++,br5
ldw *ar4++,br6
stw br3,*ar3++
stw br4,*ar3++
stw br5,*ar3++
stw br6,*ar3++ ;将数据写入DSP内存中
sub br2,1,br2
[br2] b label2
mvkl 0x8,br2
mvkh 0x8,br2
sub br1,1,br1
[br1] b label2
;设置Sector Erase
stw br8,*ar5 ;0xaa->0x555
stw br9,*ar6 ;0x55->0x2aa
stw br10,*ar5 ;0x80->0x555
stw br8,*ar5 ;0xaa->0x555
stw br9,*ar6 ;0x55->0x2aa
stw br11,*ar7 ;0x30->0x01460000
label3: ldw *ar7,br13
cmpeq br13,br12,br14 ;0x01460000是否为0xffffffff
[!br14] b label3 ;擦除0x01460000扇区
;设置flash进入Unlock Bypass状态
stw br8,*ar5 ;0xaa->0x555
stw br9,*ar6 ;0x55->0x2aa
stw br16,*ar5 ;0X20->0X555
label4:
ldw *ar8++,br3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -