]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/drivers-frst/nand/src/lib_nand.cc
update
[l4.git] / l4 / pkg / drivers-frst / nand / src / lib_nand.cc
1 #include <l4/drivers-frst/lib_nand.h>
2 #include "nand.h"
3
4 enum { Max_drivers = 10 };
5 static Nand_drv *nand_drv[Max_drivers];
6 static int nr_drivers;
7
8 Nand *arm_nand_probe(const char *configstr, l4_umword_t base)
9 {
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));
13
14   return 0;
15 }
16
17 void arm_nand_register_driver(Nand_drv *drv)
18 {
19   if (nr_drivers < Max_drivers)
20     nand_drv[nr_drivers++] = drv;
21 }
22
23 Nand::Nand(Nand_ctrl *nand_ctrl)
24   : _nand_ctrl(nand_ctrl)
25 {
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;
30 }
31
32 int Nand::read_page(l4_addr_t page, Transfer &transfer)
33 {
34   if (!_nand_ctrl)
35     return -1;
36
37   static Read_op op;
38   op.addr = page * _nand_ctrl->sz_write;
39   op.transfer = &transfer;
40
41   return _nand_ctrl->read(&op);
42 }
43
44 int Nand::write_page(l4_addr_t page, Transfer &transfer)
45 {
46   if (!_nand_ctrl)
47     return -1;
48
49   static Write_op op;
50   op.addr = page * _nand_ctrl->sz_write;
51   op.transfer = &transfer;
52
53   return _nand_ctrl->write(&op);
54 }
55
56 int Nand::erase(l4_addr_t block)
57 {
58   if (!_nand_ctrl)
59     return -1;
60   
61   static Erase_op op;
62   op.addr = block * _nand_ctrl->sz_erase;
63   op.len = _nand_ctrl->sz_erase;
64
65   _nand_ctrl->erase(&op);
66   return 0;
67 }
68
69 int Nand::handle_irq()
70 {
71   if (!_nand_ctrl)
72     return -1;
73
74   return _nand_ctrl->handle_irq();
75 }