Распечатка 4.2 Имитация функции read |
Предыдущая Содержание Следующая |
Распечатка 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; }
|
Предыдущая Содержание Следующая |