加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

关于flash擦除引起的bug问题小结

发布时间:2020-12-15 20:05:34 所属栏目:百科 来源:网络整理
导读:u16 irlib_get_free_block ( const u8 * libno) { u8 i; vu16 low,up; u16 _libno = le16_to_cpu (*(u16*)libno); u16 test = 0 ; if (_libno == 0 ) { irlib.libno0_use_sec = 1 -irlib.libno0_use_sec; } get_limitidx_by_libno (libno,low,up); spi_flash
u16 irlib_get_free_block(const u8 * libno)
{
    u8 i;
    vu16 low,up;
    u16 _libno = le16_to_cpu(*(u16*)libno);
    u16 test = 0;

    if (_libno == 0)
    {
        irlib.libno0_use_sec = 1-irlib.libno0_use_sec;
    }
    get_limitidx_by_libno(libno,&low,&up);
    spi_flash_erase(IrLibInfoAddr(low),IrLibInfoAddr(up - low));
    spi_flash_erase(IrLibDataAddr(low),IrLibDataAddr(up - low));
    if (_libno == 0)
    {
        irlib.libno0_use_sec = 1-irlib.libno0_use_sec;
    } 
    else 
    {
        irlib.libno[i] = _libno;
        irlib.lib_cycle[i]++;
        eeprom_write(OF_IRLIB_PARAM+offsetof(struct IrLib_EEProm,libno)+i*sizeof(irlib.libno[i]),&irlib.libno[i],sizeof(irlib.libno[i]));
        eeprom_write(OF_IRLIB_PARAM+offsetof(struct IrLib_EEProm,lib_cycle)+i*sizeof(irlib.lib_cycle[i]),&irlib.lib_cycle[i],sizeof(irlib.lib_cycle[i]));
    }
    return low;
}
spi_flash_erase(IrLibDataAddr(low),IrLibDataAddr(up - low));
   
   
typedef volatile unsigned short vu16;
此函数经过传递会在传递函数里,出现参数的传递错误。原因是up和low参数被优化了。
解决的办法是定义为vu16

  
  
void spi_flash_erase(u32 addr,u32 len)
{
    u32 eraselen;

    len += addr & (u32) (SPI_FLASH_SectorSize - 1);
#if 0
    len += SPI_FLASH_SectorSize - (len & (u32) (SPI_FLASH_SectorSize - 1));
    addr &= (u32) (~(SPI_FLASH_SectorSize - 1));
    if (addr == FLASH_START_ADDR && len >= FLASH_SIZE)
    {
        spi_flash_chip_erase();
        return;
    }
#endif
    while (len > 0)
    {
        eraselen = len;
        if(eraselen > SPI_FLASH_SectorSize) 
            eraselen = SPI_FLASH_SectorSize;
        spi_flash_sector_erase(addr);
        addr += SPI_FLASH_SectorSize;
        len -= eraselen;
    }
}
void spi_flash_erase(u32 addr,s32 len)
{
    len += addr & (u32) (SPI_FLASH_SectorSize - 1);
#if 0
    len += SPI_FLASH_SectorSize - (len & (u32) (SPI_FLASH_SectorSize - 1));
    addr &= (u32) (~(SPI_FLASH_SectorSize - 1));
    if (addr == FLASH_START_ADDR && len >= FLASH_SIZE)
    {
        spi_flash_chip_erase();
        return;
    }
#endif
    while (len >= 0)
    {
        spi_flash_sector_erase(addr);
        addr += SPI_FLASH_SectorSize;
        len -= SPI_FLASH_SectorSize;
    }
}
上面两个函数都完美解决了,传进来的长度不是4K整数的问题。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读