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

📄 flashdrv.c

📁 56f8300E系列dsp的BOOTloader
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -