Lines Matching full:chip
14 #define NOTALIGNED(x) ((x & (chip->page_size - 1)) != 0)
19 static uint8_t *nand_fill_oob(rt_nand_t *chip, uint8_t *oob, size_t len, struct mtd_io_desc *desc) in nand_fill_oob() argument
21 rt_memset(chip->oob_poi, 0xff, chip->oobsize); in nand_fill_oob()
27 rt_memcpy(chip->oob_poi + desc->ooboffs, oob, len); in nand_fill_oob()
32 const struct mtd_oob_region *free = chip->freelayout; in nand_fill_oob()
39 rt_memcpy(chip->oob_poi + boffs, oob, bytes); in nand_fill_oob()
49 static uint8_t *nand_transfer_oob(rt_nand_t *chip, uint8_t *oob, struct mtd_io_desc *desc, size_t l… in nand_transfer_oob() argument
55 rt_memcpy(oob, chip->oob_poi + desc->ooboffs, len); in nand_transfer_oob()
60 struct mtd_oob_region *free = (struct mtd_oob_region *)chip->freelayout; in nand_transfer_oob()
84 rt_memcpy(oob, chip->oob_poi + boffs, bytes); in nand_transfer_oob()
95 static int nand_read_page_raw(rt_nand_t *chip, uint8_t *buf, int oob_required, int page) in nand_read_page_raw() argument
97 chip->ops->read_buf(chip, buf, chip->page_size); in nand_read_page_raw()
100 chip->ops->read_buf(chip, chip->oob_poi, chip->oobsize); in nand_read_page_raw()
105 static int nand_write_page_raw(rt_nand_t *chip, const uint8_t *buf, int oob_required, int page) in nand_write_page_raw() argument
107 chip->ops->write_buf(chip, buf, chip->page_size); in nand_write_page_raw()
110 chip->ops->write_buf(chip, chip->oob_poi, chip->oobsize); in nand_write_page_raw()
115 static int nand_write_page_hwecc(rt_nand_t *chip, const uint8_t *buf, int oob_required, int page) in nand_write_page_hwecc() argument
118 uint16_t stepsize = chip->ecc.stepsize; in nand_write_page_hwecc()
119 uint16_t eccbytes = chip->ecc.bytes; in nand_write_page_hwecc()
120 uint16_t eccsteps = chip->ecc._step; in nand_write_page_hwecc()
121 uint16_t eccpos = chip->ecc.layout->offset; in nand_write_page_hwecc()
122 uint8_t *ecc_calc = chip->buffers.ecccalc; in nand_write_page_hwecc()
127 chip->ops->cmdfunc(chip, NAND_CMD_ECC_EN, 0, 0); in nand_write_page_hwecc()
128 chip->ops->write_buf(chip, p, stepsize); in nand_write_page_hwecc()
129 chip->ecc.calculate(chip, p, &ecc_calc[i]); in nand_write_page_hwecc()
130 chip->ops->cmdfunc(chip, NAND_CMD_ECC_DIS, 0, 0); in nand_write_page_hwecc()
133 rt_memcpy(&chip->oob_poi[eccpos], ecc_calc, chip->ecc.layout->length); in nand_write_page_hwecc()
135 chip->ops->write_buf(chip, chip->oob_poi, chip->oobsize); in nand_write_page_hwecc()
140 static int nand_read_page_hwecc(rt_nand_t *chip, uint8_t *buf, int oob_required, int page) in nand_read_page_hwecc() argument
143 uint16_t eccsize = chip->ecc.stepsize; in nand_read_page_hwecc()
144 uint16_t eccbytes = chip->ecc.bytes; in nand_read_page_hwecc()
145 uint16_t eccsteps = chip->ecc._step; in nand_read_page_hwecc()
146 uint16_t eccpos = chip->ecc.layout->offset; in nand_read_page_hwecc()
148 uint8_t *ecc_calc = chip->buffers.ecccalc; in nand_read_page_hwecc()
149 uint8_t *ecc_code = chip->buffers.ecccode; in nand_read_page_hwecc()
154 chip->ops->cmdfunc(chip, NAND_CMD_ECC_EN, 0, 0); in nand_read_page_hwecc()
155 chip->ops->read_buf(chip, p, eccsize); in nand_read_page_hwecc()
156 chip->ecc.calculate(chip, p, &ecc_calc[i]); in nand_read_page_hwecc()
157 chip->ops->cmdfunc(chip, NAND_CMD_ECC_DIS, 0, 0); in nand_read_page_hwecc()
160 chip->ops->read_buf(chip, chip->oob_poi, chip->oobsize); in nand_read_page_hwecc()
161 rt_memcpy(ecc_code, &chip->oob_poi[eccpos], chip->ecc.layout->length); in nand_read_page_hwecc()
163 eccsteps = chip->ecc._step; in nand_read_page_hwecc()
170 stat = chip->ecc.correct(chip, p, &ecc_code[i], &ecc_calc[i]); in nand_read_page_hwecc()
178 static int nand_write_page(rt_nand_t *chip, const uint8_t *buf, in nand_write_page() argument
183 chip->ops->cmdfunc(chip, NAND_CMD_PAGE_WR0, page, 0x00); in nand_write_page()
187 nand_write_page_raw(chip, buf, oob_required, page); in nand_write_page()
191 chip->write_page(chip, buf, oob_required, page); in nand_write_page()
194 status = chip->ops->cmdfunc(chip, NAND_CMD_PAGE_WR1, -1, -1); in nand_write_page()
199 static int nand_do_read_desc(rt_nand_t *chip, loff_t from, struct mtd_io_desc *desc) in nand_do_read_desc() argument
208 chip->freelayout->length : chip->oobsize; in nand_do_read_desc()
219 if (NOTALIGNED(desc->datlen) && !chip->pagebuf) in nand_do_read_desc()
221 chip->pagebuf = rt_malloc(chip->page_size); in nand_do_read_desc()
222 if (!chip->pagebuf) in nand_do_read_desc()
226 page = (int)(from / chip->page_size); in nand_do_read_desc()
233 bytes = min(chip->page_size, readlen); in nand_do_read_desc()
235 chip->ops->cmdfunc(chip, NAND_CMD_PAGE_RD, page, 0x00); in nand_do_read_desc()
239 buf = chip->pagebuf; in nand_do_read_desc()
247 ret = nand_read_page_raw(chip, buf, oob_required, page); in nand_do_read_desc()
251 ret = chip->read_page(chip, buf, oob_required, page); in nand_do_read_desc()
266 oob = nand_transfer_oob(chip, oob, desc, toread); in nand_do_read_desc()
296 static int nand_do_write_desc(rt_nand_t *chip, loff_t to, struct mtd_io_desc *desc) in nand_do_write_desc() argument
303 chip->freelayout->length : chip->oobsize; in nand_do_write_desc()
318 page = (int)(to / chip->page_size); in nand_do_write_desc()
327 if (NOTALIGNED(desc->datlen) && !chip->pagebuf) in nand_do_write_desc()
329 chip->pagebuf = rt_malloc(chip->page_size); in nand_do_write_desc()
330 if (!chip->pagebuf) in nand_do_write_desc()
336 uint16_t bytes = min(chip->page_size, writelen); in nand_do_write_desc()
341 oob = nand_fill_oob(chip, oob, len, desc); in nand_do_write_desc()
347 rt_memset(chip->oob_poi, 0xff, chip->oobsize); in nand_do_write_desc()
353 buf = chip->pagebuf; in nand_do_write_desc()
354 rt_memset(&buf[bytes], 0xff, chip->page_size - bytes); in nand_do_write_desc()
357 ret = nand_write_page(chip, buf, oob_required, page, (desc->mode == MTD_OPM_RAW)); in nand_do_write_desc()
378 static int nand_read_oob_std(rt_nand_t *chip, int page) in nand_read_oob_std() argument
380 chip->ops->cmdfunc(chip, NAND_CMD_PAGE_RD, page, chip->page_size); in nand_read_oob_std()
381 chip->ops->read_buf(chip, chip->oob_poi, chip->oobsize); in nand_read_oob_std()
389 static int nand_only_read_oob(rt_nand_t *chip, loff_t from, struct mtd_io_desc *desc) in nand_only_read_oob() argument
398 len = chip->freelayout->length; in nand_only_read_oob()
400 len = chip->oobsize; in nand_only_read_oob()
407 page = (int)(from / chip->page_size); in nand_only_read_oob()
409 ret = nand_read_oob_std(chip, page); in nand_only_read_oob()
413 buf = nand_transfer_oob(chip, buf, desc, len); in nand_only_read_oob()
420 static int nand_write_oob_std(rt_nand_t *chip, int page) in nand_write_oob_std() argument
424 chip->ops->cmdfunc(chip, NAND_CMD_PAGE_WR0, page, chip->page_size); in nand_write_oob_std()
425 chip->ops->write_buf(chip, chip->oob_poi, chip->oobsize); in nand_write_oob_std()
427 status = chip->ops->cmdfunc(chip, NAND_CMD_PAGE_WR1, -1, -1); in nand_write_oob_std()
432 static int nand_only_write_oob(rt_nand_t *chip, loff_t to, struct mtd_io_desc *desc) in nand_only_write_oob() argument
437 len = chip->freelayout->length; in nand_only_write_oob()
439 len = chip->oobsize; in nand_only_write_oob()
453 page = (int)(to / chip->page_size); in nand_only_write_oob()
455 nand_fill_oob(chip, desc->oobbuf, desc->ooblen, desc); in nand_only_write_oob()
457 ret = nand_write_oob_std(chip, page); in nand_only_write_oob()
466 rt_nand_t *chip; in nand_erase() local
471 chip = MTDTONAND(mtd); in nand_erase()
473 page = addr / chip->page_size; in nand_erase()
477 status = chip->ops->cmdfunc(chip, NAND_CMD_BLK_ERASE, page, 0); in nand_erase()
483 page += chip->pages_pb; in nand_erase()
492 rt_nand_t *chip; in nand_read() local
494 chip = MTDTONAND(mtd); in nand_read()
508 ret = nand_only_read_oob(chip, from, desc); in nand_read()
510 ret = nand_do_read_desc(chip, from, desc); in nand_read()
520 rt_nand_t *chip; in nand_write() local
522 chip = MTDTONAND(mtd); in nand_write()
536 ret = nand_only_write_oob(chip, to, desc); in nand_write()
538 ret = nand_do_write_desc(chip, to, desc); in nand_write()
548 rt_nand_t *chip = MTDTONAND(mtd); in nand_block_isbad() local
550 if (chip->ops->isbad) in nand_block_isbad()
552 ret = chip->ops->isbad(chip, blk); in nand_block_isbad()
558 page = blk * chip->pages_pb; in nand_block_isbad()
559 nand_read_oob_std(chip, page); in nand_block_isbad()
560 ret = chip->oob_poi[0] != 0xFF; in nand_block_isbad()
569 rt_nand_t *chip; in nand_block_markbad() local
571 chip = MTDTONAND(mtd); in nand_block_markbad()
573 if (chip->ops->markbad) in nand_block_markbad()
575 ret = chip->ops->markbad(chip, blk); in nand_block_markbad()
581 page = blk * chip->pages_pb; in nand_block_markbad()
582 rt_memset(chip->oob_poi, 0xff, chip->oobsize); in nand_block_markbad()
583 chip->oob_poi[0] = 0; in nand_block_markbad()
584 ret = nand_write_oob_std(chip, page); in nand_block_markbad()