1 #include <l4/drivers-frst/lib_nand.h>
4 enum { Max_drivers = 10 };
5 static Nand_drv *nand_drv[Max_drivers];
8 Nand *arm_nand_probe(const char *configstr, l4_umword_t base)
10 for (int i = 0; i < nr_drivers; i++)
11 if (nand_drv[i] && nand_drv[i]->probe(configstr))
12 return new Nand(nand_drv[i]->create(base));
17 void arm_nand_register_driver(Nand_drv *drv)
19 if (nr_drivers < Max_drivers)
20 nand_drv[nr_drivers++] = drv;
23 Nand::Nand(Nand_ctrl *nand_ctrl)
24 : _nand_ctrl(nand_ctrl)
26 page_size = nand_ctrl->sz_write;
27 spare_size = nand_ctrl->sz_spare;
28 block_size = nand_ctrl->sz_erase;
29 num_blocks = nand_ctrl->size / nand_ctrl->sz_erase;
32 int Nand::read_page(l4_addr_t page, Transfer &transfer)
38 op.addr = page * _nand_ctrl->sz_write;
39 op.transfer = &transfer;
41 return _nand_ctrl->read(&op);
44 int Nand::write_page(l4_addr_t page, Transfer &transfer)
50 op.addr = page * _nand_ctrl->sz_write;
51 op.transfer = &transfer;
53 return _nand_ctrl->write(&op);
56 int Nand::erase(l4_addr_t block)
62 op.addr = block * _nand_ctrl->sz_erase;
63 op.len = _nand_ctrl->sz_erase;
65 _nand_ctrl->erase(&op);
69 int Nand::handle_irq()
74 return _nand_ctrl->handle_irq();