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.2 Имитация функции read

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

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

Распечатка 4.2

 

static inline int dummy_flash_read_one_chip(struct map_info *map,

       struct flchip *chip, loff_t addr, size_t len, u_char *buf)

{

  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;

  }

 

  addr += chip->start;

  chip->state = FL_READY;

  map_copy_from(map, buf, addr, len);

  wake_up(&chip->wq);

  spin_unlock(chip->mutex);

  return 0;

}

 

static int dummy_flash_read(struct mtd_info *mtd, loff_t from,

                       size_t len,size_t *retlen, u_char *buf)

{

  struct map_info *map = mtd->priv;

  struct dummy_private_info_struct *priv = map->fldrv_priv;

  int chipnum = 0;

  int ret = 0;

  unsigned int ofs;

  *retlen = 0;

 

  /* Ищем номер и смещение для первой микросхемы */

  chipnum = (from >> priv->chipshift);

  ofs = from & ((1 << priv->chipshift) - 1);

  while(len)

  {

    unsigned long to_read;

    if(chipnum >= priv->number_of_chips)

      break;

 

    /* Проверяем, правильно ли переходит чтение на следующую микросхему */

    if( (len + ofs - 1) >> priv->chipshift)

      to_read = (1 << priv->chipshift) - ofs;

    else

      to_read = len;

    if( (ret = dummy_flash_read_one_chip(map, &priv->chips[chipnum],

                                       ofs, to_read, buf)))

      break;

 

    *retlen += to_read;

    len -= to_read;

    buf += to_read;

    ofs=0;

    chipnum++;

  }

  return ret;

}

 

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