norflash芯片擦除
芯片手册中仅扇区、块、整片擦除操作
整片擦除无须使用addr地址
int _norflash_eraser(u8 eraser, u32 addr)//擦除
{
u8 eraser_cmd;
switch (eraser) {
case FLASH_PAGE_ERASER://页擦除 ???手册中无页擦除指令?
eraser_cmd = WINBOND_PAGE_ERASE;//页擦除指令
addr = addr / 256 * 256;//计算页对齐地址
break;
case FLASH_SECTOR_ERASER://扇区擦除
eraser_cmd = WINBOND_SECTOR_ERASE;//扇区擦除指令
//r_printf(">>>[test]:addr = %d\n", addr);
addr = addr / 4096 * 4096;//计算扇区对齐地址
break;
case FLASH_BLOCK_ERASER://块擦除
eraser_cmd = WINBOND_BLOCK_ERASE;//块擦除指令
addr = addr / 65536 * 65536;//计算块对齐地址
break;
case FLASH_CHIP_ERASER://整片擦除
eraser_cmd = WINBOND_CHIP_ERASE;//整片擦除指令
break;
}
_norflash_send_write_enable();//使能写
spi_cs_l();//片选使能
spi_write_byte(eraser_cmd);//写指令
if (eraser_cmd != WINBOND_CHIP_ERASE) {
//如果不是整片擦除
_norflash_send_addr(addr);//需要写入地址
}
spi_cs_h();//片选禁能
return _norflash_wait_ok();//等待完成
}
//cmd:指令
//arg:获取时为指针的地址,设置时为参数
//unit:单位,1表示字节,1024表示KB,1024*1024表示MB
//part:分区
int _norflash_ioctl(u32 cmd, u32 arg, u32 unit, void *_part)//IO通道控制
{
int reg = 0;
struct norflash_partition *part = _part;
os_mutex_pend(&_norflash.mutex, 0);
switch (cmd) {
case IOCTL_GET_STATUS://获取状态
*(u32 *)arg = 1;
break;
case IOCTL_GET_ID://获取ID
*((u32 *)arg) = _norflash.flash_id;
break;
case IOCTL_GET_CAPACITY://获取存储能力
if (_norflash.flash_capacity == 0) {
//没有存储空间
*(u32 *)arg = 0;
} else if (_norflash.part_num == 1 && part->start_addr == 0)