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整数的问题。