The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

Распечатка 4.4 Имитация функции erase

Распечатка 4.4 Имитация функции erase

Предыдущая  Содержание  Следующая V*D*V

Распечатка 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;

}

 

Предыдущая  Содержание  Следующая