⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.sa

📁 网络中交换节点的上数据的交换和下行数据分发的硬件实现
💻 SA
📖 第 1 页 / 共 2 页
字号:
;;
;本函数用于从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 + -