Распечатка 4.4 Имитация функции erase |
Предыдущая Содержание Следующая |
Распечатка 4.4
static int dummy_flash_erase_one_block(struct map_info *map, struct flchip *chip, unsigned long addr) { DECLARE_WAITQUEUE(wait, current); again: spin_lock(chip->mutex);
if(chip->state != FL_READY) { set_current_state(TASK_UNINTERRUPTIBLE); add_wait_queue(&chip->wq, &wait); spin_unlock(chip->mutex); schedule(); remove_wait_queue(&chip->wq, &wait); if(signal_pending(current)) return -EINTR; goto again; }
chip->state = FL_ERASING; addr += chip->start; ERASE_FLASH_SECTOR(map, chip->start, addr);
spin_unlock(chip->mutex); schedule_timeout(chip->erase_time); if(signal_pending(current)) return -EINTR;
/* Мы пробуждены после превышения времени ожидания. Захватываем мьютекс для обработки */ spin_lock(chip->mutex);
/* Добавьте любые проверки на то, был ли стёрт сектор флеш-памяти. */
/* Предполагаем, что здесь стирание флеш-памяти было завершено */ chip->state = FL_READY; wake_up(&chip->wq); spin_unlock(chip->mutex); return 0; }
static int dummy_flash_erase(struct mtd_info *mtd, struct erase_info *instr) { struct map_info *map = mtd->priv; struct dummy_private_info_struct *priv = map->fldrv_priv; int chipnum = 0; unsigned long addr; int len; int ret;
/* Сначала проверяем на ошибки */ if( (instr->addr > mtd->size) || ((instr->addr + instr->len) > mtd->size) || instr->addr & (mtd->erasesize -1))) return -EINVAL;
/* Ищем номер для первой микросхемы */ chipnum = (instr->addr >> priv->chipshift); addr = instr->addr & ((1 << priv->chipshift) - 1); len = instr->len; while(len) { if( (ret = dummy_flash_erase_one_block(map, &priv->chips[chipnum], addr)) < 0) return ret;
addr += mtd->erasesize; len -= mtd->erasesize; if(addr >> priv->chipshift) { addr = 0; chipnum++; } }
instr->state = MTD_ERASE_DONE; if(instr->callback) instr->callback(instr); return 0; }
|
Предыдущая Содержание Следующая |