📄 flashdrv.c
字号:
asm( nop );enddo: asm( brclr #0x0001, A1, skip_odd_last ); asm( move.w X:(R3)+, X0 ); asm( moveu.bp X:(R2)+, Y0 ); asm( cmp.b X0, Y0 ); asm( bne no_compare );skip_odd_last: asm( rts);no_compare: asm( move.l #0, R2 );}/****************************************************************************** Module: ioctlFLASH_RAW_MASSERASE_PMEM* Description: erase page* Arguments: page number* Range Issues: * Special Issues: for bootloader only *****************************************************************************/void ioctlFLASH_RAW_MASSERASE_PMEM(handle_t hndl, unsigned long params ){ asm( move.l #0, R0 ); asm( move.w #0x0002, X:(BSP_PERIPH_BASE + archoff_Flash_ModuleControlReg) ); /* select P Flash register bank */ asm( move.w #0, X:(BSP_PERIPH_BASE + archoff_Flash_ProtectionReg) ); /* unsecure data flash */ asm( move.w #0, X:(BSP_PERIPH_BASE + archoff_Flash_ProtectionBootReg) ); asm( wait_CBEIF: ); asm( brclr #0x80, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), wait_CBEIF ); asm( repeat_loop: ); /* dis isrs!!! */ asm( tfra R0, R1 ); asm( clr.w X0 ); asm( move.w X0, P:(R1)+ ); /* select data flash programming */ asm( move.w #0x41, X:(BSP_PERIPH_BASE + archoff_Flash_CommandReg) ); /* page erase command */ asm( move.w #0x80, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear CBEIF flag */ asm( move.w X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), Y0 ); asm( brclr #0x20, Y0, end_PVIOL ); /* wait until PVIOL flag is set */ asm( move.w #0x20, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear PVIOL flag */ asm( bra repeat_loop ); asm( end_PVIOL: ); asm( brclr #0x10, Y0, end_ACCERR ); /* wait until ACCERR flag is set */ asm( move.w #0x10, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear ACCERR flag */ asm( bra repeat_loop ); asm( end_ACCERR: ); asm( wait_CCIF: ); /* check if CCIF is set */ asm( brclr #0x40, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), wait_CCIF ); }/****************************************************************************** Module: ioctlFLASH_RAW_ERASE_PMEM* Description: erase page* Arguments: page number* Range Issues: used Y, R0, R1* Special Issues: *****************************************************************************/void ioctlFLASH_RAW_ERASE_PMEM(unsigned int page){ asm( clr.w Y1 ); asm( asll.l #PAGE_SIZE_P_LOG, Y); /* convert page to lenght */ asm( move.l Y, R0 ); asm( move.w #0x0002, X:(BSP_PERIPH_BASE + archoff_Flash_ModuleControlReg) ); /* select P Flash register bank */ asm( move.w #0, X:(BSP_PERIPH_BASE + archoff_Flash_ProtectionReg) ); /* unsecure data flash */ asm( move.w #0, X:(BSP_PERIPH_BASE + archoff_Flash_ProtectionBootReg) ); asm( wait_CBEIF: ); asm( brclr #0x80, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), wait_CBEIF ); asm( repeat_loop: ); /* dis isrs!!! */ asm( tfra R0, R1 ); asm( clr.w Y1 ); asm( move.w Y1, P:(R1)+ ); /* select data flash programming */ asm( move.w #0x40, X:(BSP_PERIPH_BASE + archoff_Flash_CommandReg) ); /* page erase command */ asm( move.w #0x80, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear CBEIF flag */ asm( move.w X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), Y0 ); asm( brclr #0x20, Y0, end_PVIOL ); /* wait until PVIOL flag is set */ asm( move.w #0x20, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear PVIOL flag */ asm( bra repeat_loop ); asm( end_PVIOL: ); asm( brclr #0x10, Y0, end_ACCERR ); /* wait until ACCERR flag is set */ asm( move.w #0x10, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear ACCERR flag */ asm( bra repeat_loop ); asm( end_ACCERR: ); asm( wait_CCIF: ); /* check if CCIF is set */ asm( brclr #0x40, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), wait_CCIF ); }/****************************************************************************** Module: ioctlFLASH_RAW_ERASE_XMEM* Description: erase page* Arguments: page number* Range Issues: used Y, R0, [R1]* Special Issues: *****************************************************************************/void ioctlFLASH_RAW_ERASE_XMEM(unsigned int page ){ asm( asll.w #PAGE_SIZE_LOG, Y0); /* convert page to lenght */ asm( adda # XMEM_FLASH_OFF, Y0, R0 ); /* 0x2000 - data address page */ asm( move.w #0x0001, X:(BSP_PERIPH_BASE + archoff_Flash_ModuleControlReg) ); /* select P Flash register bank */ asm( move.w #0, X:(BSP_PERIPH_BASE + archoff_Flash_ProtectionReg) ); /* unsecure data flash */ asm( wait_CBEIF: ); asm( brclr #0x80, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), wait_CBEIF ); asm( repeat_loop: ); /* dis isrs!!! */ asm( clr.w Y1 ); asm( move.w Y1, X:(R0) ); /* select data flash programming */ asm( move.w #0x40, X:(BSP_PERIPH_BASE + archoff_Flash_CommandReg) ); /* page erase command */ asm( move.w #0x80, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear CBEIF flag */ asm( move.w X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), Y0 ); asm( brclr #0x20, Y0, end_PVIOL ); /* wait until PVIOL flag is set */ asm( move.w #0x20, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear PVIOL flag */ asm( bra repeat_loop ); asm( end_PVIOL: ); asm( brclr #0x10, Y0, end_ACCERR ); /* wait until ACCERR flag is set */ asm( move.w #0x10, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear ACCERR flag */ asm( bra repeat_loop ); asm( end_ACCERR: ); asm( wait_CCIF: ); /* check if CCIF is set */ asm( brclr #0x40, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), wait_CCIF );}/****************************************************************************** Module: ioctlFLASH_RAW_ERASE_BOOT* Description: erase page* Arguments: page number* Range Issues: used Y, R0, R1* Special Issues: *****************************************************************************/void ioctlFLASH_RAW_ERASE_BOOT(unsigned int page ){ asm( asll.w #PAGE_SIZE_LOG, Y0); /* convert page to lenght */ asm( adda 0x20000, Y0, R0 ); /* 0x20000 - P: boot address page */ asm( move.w #0x0002, X:(BSP_PERIPH_BASE + archoff_Flash_ModuleControlReg) ); /* select P Flash register bank */ asm( move.w #0, X:(BSP_PERIPH_BASE + archoff_Flash_ProtectionBootReg) ); asm( wait_CBEIF: ); asm( brclr #0x80, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), wait_CBEIF ); asm( repeat_loop: ); /* dis isrs!!! */ asm( tfra R0, R1 ); asm( clr.w Y1 ); asm( move.w Y1, P:(R1)+ ); /* select data flash programming */ asm( move.w #0x40, X:(BSP_PERIPH_BASE + archoff_Flash_CommandReg) ); /* page erase command */ asm( move.w #0x80, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear CBEIF flag */ asm( move.w X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), Y0 ); asm( brclr #0x20, Y0, end_PVIOL ); /* wait until PVIOL flag is set */ asm( move.w #0x20, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear PVIOL flag */ asm( bra repeat_loop ); asm( end_PVIOL: ); asm( brclr #0x10, Y0, end_ACCERR ); /* wait until ACCERR flag is set */ asm( move.w #0x10, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear ACCERR flag */ asm( bra repeat_loop ); asm( end_ACCERR: ); asm( wait_CCIF: ); /* check if CCIF is set */ asm( brclr #0x40, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), wait_CCIF );}/****************************************************************************** Module: ioctlFLASH_RAW_READ_PMEM* Description: read page to internal buffer* Arguments: page number* Range Issues: * Special Issues: *****************************************************************************/void ioctlFLASH_RAW_READ_PMEM(unsigned int page ){ asm( move.l # flash_tmp_buf.buf32, R2 ); /* load modified address */ asm( clr.w Y1 ); asm( asll.l #PAGE_SIZE_P_LOG, Y); /* convert page to lenght */ asm( move.l Y, R0 ); asm( move.w #PAGE_SIZE_P_IN_WORDS, X0 ); /* load page size */ asm( do X0, enddo ); /* copy page to memory location */ asm( move.w P:(R0)+, Y1 ); asm( nop ); asm( nop ); asm( move.w Y1, X:(R2)+ ); asm( enddo: ); asm( nop );}/****************************************************************************** Module: ioctlFLASH_RAW_READ_XMEM* Description: read page to internal buffer* Arguments: page number* Range Issues: * Special Issues: *****************************************************************************/void ioctlFLASH_RAW_READ_XMEM(unsigned int page ){ asm( move.l # flash_tmp_buf.buf32, R2 ); /* load modified address */ asm( asll.w #PAGE_SIZE_LOG, Y0); /* convert page to lenght */ asm( adda # XMEM_FLASH_OFF, Y0, R3 ); /* 0x2000 - X: data address page */ asm( move.w #PAGE_SIZE_IN_WORDS, X0 ); /* load page size */ asm( do X0, enddo ); /* copy page to memory location */ asm( move.w X:(R3)+, X0 ); asm( move.w X0, X:(R2)+ ); asm( enddo: ); asm( nop );}/****************************************************************************** Module: ioctlFLASH_RAW_READ_BOOT* Description: read page to internal buffer* Arguments: page number* Range Issues: * Special Issues: *****************************************************************************/void ioctlFLASH_RAW_READ_BOOT(unsigned int page ){ asm( move.l # flash_tmp_buf.buf32, R2 ); /* load modified address */ asm( asll.w #PAGE_SIZE_LOG, Y0); /* convert page to lenght */ asm( adda 0x20000, Y0, R0 ); /* 0x2000 - P: boot address page */ asm( move.w #PAGE_SIZE_IN_WORDS, X0 ); /* load page size */ asm( do X0, enddo ); /* copy page to memory location */ asm( move.w P:(R0)+, Y1 ); asm( nop ); asm( nop ); asm( move.w Y1, X:(R2)+ ); asm( enddo: ); asm( nop );}/*****************************************************************************//*****************************************************************************//*****************************************************************************//****************************************************************************** Module: ioctlFLASH_RAW_WRITE_PMEM* Description: write page from internal buffer* Arguments: page number* Range Issues: * Special Issues: *****************************************************************************/void ioctlFLASH_RAW_WRITE_PMEM(unsigned int page ){ asm( clr.w Y1 ); asm( tfr Y, A );// asm( jsr ioctlFLASH_RAW_ERASE_PMEM ); /* Y, R0, R1 changed */ asm( asll.l #PAGE_SIZE_P_LOG, A); /* convert page to lenght */ asm( move.l A10, R0 ); // asm( move.w #PAGE_SIZE_P_IN_WORDS, X0 ); /* load page size */ asm( move.w #PAGE_SIZE_IN_WORDS, X0 ); /* load page size in double words */ asm( move.l # flash_tmp_buf.buf32, R1 ); /* load modified address */ asm( tfra R0, R4 ); /* R2 - dst */ asm( tfra R1, R3 ); /* R3 - src */#if 1 asm( do X0, end_cmp_loop ); asm( move.w P:(R0)+, A1 ); asm( move.w A1, A0 ); asm( move.l X:(R1)+, B ); asm( move.w P:(R0)+, A1 ); asm( eor.l B, A ); asm( and.l B, A ); asm( beq continue_loop ); asm( enddo ); /* Y0 - required page */ asm( jsr ioctlFLASH_RAW_ERASE_PMEM ); /* Y, R0, R1 changed */ asm( bra endloop );continue_loop: asm( nop ); asm( nop );end_cmp_loop: asm( nop ); asm( nop );endloop: #endif //0 asm( move.w #0x0002, X:(BSP_PERIPH_BASE + archoff_Flash_ModuleControlReg) ); /* select P Flash register bank */ asm( move.w #0, X:(BSP_PERIPH_BASE + archoff_Flash_ProtectionReg) ); /* unsecure data flash */ asm( move.w #0, X:(BSP_PERIPH_BASE + archoff_Flash_ProtectionBootReg) ); asm( do X0, end_data_loop ); asm( move.l X:(R3), Y );#if 1 asm( tfra R4, R2 ); asm( move.w P:(R2)+, A1 ); asm( move.w A1, A0 ); asm( move.w P:(R2)+, A1 ); asm( cmp.l A, Y ); asm( beq continue_data_loop );#endif //0 inc_loop: /* check if CBEIF is set */ asm( brclr #0x80, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), inc_loop ); repeat_loop: asm(bfset #0x0300,SR); /* dis isrs!!! */ asm( tfra R4, R2 ); asm( move.w Y0, P:(R2)+ ); /* select data flash programming */ asm( move.w Y1, P:(R2)+ ); /* select data flash programming(2) */ asm( move.w #0x20, X:(BSP_PERIPH_BASE + archoff_Flash_CommandReg) ); /* program command */ asm( move.w #0x80, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear CBEIF flag */ asm( move.w X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), Y0 ); asm(bfclr #0x0300,SR); asm( brclr #0x20, Y0, end_PVIOL ); /* wait until PVIOL flag is set */ asm( move.w #0x20, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear PVIOL flag */ asm( bra repeat_loop ); end_PVIOL: asm( brclr #0x10, Y0, end_ACCERR ); /* wait until ACCERR flag is set */ asm( move.w #0x10, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg) ); /* clear ACCERR flag */ asm( bra repeat_loop ); end_ACCERR: wait_CCIF: /* check if CCIF is set */ asm( brclr #0x40, X:(BSP_PERIPH_BASE + archoff_Flash_UserStatusReg ), wait_CCIF ); continue_data_loop: asm( adda #2, R3); asm( adda #2, R4); /* update array pointers */ asm( nop ); asm( nop ); asm( nop );end_data_loop: ;}/****************************************************************************** Module: ioctlFLASH_RAW_WRITE_XMEM* Description: write page from internal buffer* Arguments: page number* Range Issues: * Special Issues: *****************************************************************************/void ioctlFLASH_RAW_WRITE_XMEM(unsigned int page ){ asm( move.w Y0, X0 ); /* save page */// asm( jsr ioctlFLASH_RAW_ERASE_XMEM ); /* Y, R0, R1 changed */ asm( asll.w #PAGE_SIZE_LOG, X0); /* convert page to lenght */ asm( adda # XMEM_FLASH_OFF, X0, R0 ); /* X address page */ asm( move.w #PAGE_SIZE_IN_WORDS, X0 ); /* load page size */ asm( move.l # flash_tmp_buf.buf32, R1 ); /* load modified address */ asm( tfra R0, R4 ); /* R2 - dst */ asm( tfra R1, R3 ); /* R3 - src */#if 1 asm( do X0, end_cmp_loop ); asm( move.w X:(R0)+, A1 ); asm( move.w X:(R1)+, B1 ); asm( eor.w B, A ); asm( and.w B, A ); asm( beq continue_loop ); asm( enddo ); /* Y0 - required page */ asm( jsr ioctlFLASH_RAW_ERASE_XMEM ); /* Y, R0, R1 changed */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -