Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
mtd
devices
mtdram.c
Go to the documentation of this file.
1
/*
2
* mtdram - a test mtd device
3
* Author: Alexander Larsson <
[email protected]
>
4
*
5
* Copyright (c) 1999 Alexander Larsson <
[email protected]
>
6
* Copyright (c) 2005 Joern Engel <
[email protected]
>
7
*
8
* This code is GPL
9
*
10
*/
11
12
#include <linux/module.h>
13
#include <linux/slab.h>
14
#include <
linux/ioport.h
>
15
#include <
linux/vmalloc.h
>
16
#include <
linux/init.h
>
17
#include <
linux/mtd/mtd.h
>
18
#include <
linux/mtd/mtdram.h
>
19
20
static
unsigned
long
total_size
= CONFIG_MTDRAM_TOTAL_SIZE;
21
static
unsigned
long
erase_size = CONFIG_MTDRAM_ERASE_SIZE;
22
#define MTDRAM_TOTAL_SIZE (total_size * 1024)
23
#define MTDRAM_ERASE_SIZE (erase_size * 1024)
24
25
#ifdef MODULE
26
module_param
(
total_size
,
ulong
, 0);
27
MODULE_PARM_DESC
(
total_size
,
"Total device size in KiB"
);
28
module_param
(erase_size,
ulong
, 0);
29
MODULE_PARM_DESC
(erase_size,
"Device erase block size in KiB"
);
30
#endif
31
32
// We could store these in the mtd structure, but we only support 1 device..
33
static
struct
mtd_info
*
mtd_info
;
34
35
static
int
ram_erase(
struct
mtd_info *mtd,
struct
erase_info
*
instr
)
36
{
37
memset
((
char
*)mtd->
priv
+ instr->
addr
, 0xff, instr->
len
);
38
instr->
state
=
MTD_ERASE_DONE
;
39
mtd_erase_callback
(instr);
40
return
0;
41
}
42
43
static
int
ram_point(
struct
mtd_info *mtd, loff_t
from
,
size_t
len,
44
size_t
*retlen,
void
**virt,
resource_size_t
*
phys
)
45
{
46
*virt = mtd->
priv
+
from
;
47
*retlen = len;
48
return
0;
49
}
50
51
static
int
ram_unpoint(
struct
mtd_info *mtd, loff_t
from
,
size_t
len)
52
{
53
return
0;
54
}
55
56
/*
57
* Allow NOMMU mmap() to directly map the device (if not NULL)
58
* - return the address to which the offset maps
59
* - return -ENOSYS to indicate refusal to do the mapping
60
*/
61
static
unsigned
long
ram_get_unmapped_area(
struct
mtd_info *mtd,
62
unsigned
long
len,
63
unsigned
long
offset
,
64
unsigned
long
flags
)
65
{
66
return
(
unsigned
long
) mtd->
priv
+
offset
;
67
}
68
69
static
int
ram_read(
struct
mtd_info *mtd, loff_t
from
,
size_t
len,
70
size_t
*retlen,
u_char
*
buf
)
71
{
72
memcpy
(buf, mtd->
priv
+ from, len);
73
*retlen = len;
74
return
0;
75
}
76
77
static
int
ram_write(
struct
mtd_info *mtd, loff_t to,
size_t
len,
78
size_t
*retlen,
const
u_char
*
buf
)
79
{
80
memcpy
((
char
*)mtd->
priv
+ to, buf, len);
81
*retlen = len;
82
return
0;
83
}
84
85
static
void
__exit
cleanup_mtdram(
void
)
86
{
87
if
(mtd_info) {
88
mtd_device_unregister
(mtd_info);
89
vfree
(mtd_info->
priv
);
90
kfree
(mtd_info);
91
}
92
}
93
94
int
mtdram_init_device
(
struct
mtd_info *mtd,
void
*mapped_address,
95
unsigned
long
size
,
char
*
name
)
96
{
97
memset
(mtd, 0,
sizeof
(*mtd));
98
99
/* Setup the MTD structure */
100
mtd->
name
=
name
;
101
mtd->
type
=
MTD_RAM
;
102
mtd->
flags
=
MTD_CAP_RAM
;
103
mtd->
size
=
size
;
104
mtd->
writesize
= 1;
105
mtd->
writebufsize
= 64;
/* Mimic CFI NOR flashes */
106
mtd->
erasesize
=
MTDRAM_ERASE_SIZE
;
107
mtd->
priv
= mapped_address;
108
109
mtd->
owner
=
THIS_MODULE
;
110
mtd->
_erase
= ram_erase;
111
mtd->
_point
= ram_point;
112
mtd->
_unpoint
= ram_unpoint;
113
mtd->
_get_unmapped_area
= ram_get_unmapped_area;
114
mtd->
_read
= ram_read;
115
mtd->
_write
= ram_write;
116
117
if
(
mtd_device_register
(mtd,
NULL
, 0))
118
return
-
EIO
;
119
120
return
0;
121
}
122
123
static
int
__init
init_mtdram(
void
)
124
{
125
void
*
addr
;
126
int
err
;
127
128
if
(!
total_size
)
129
return
-
EINVAL
;
130
131
/* Allocate some memory */
132
mtd_info =
kmalloc
(
sizeof
(
struct
mtd_info),
GFP_KERNEL
);
133
if
(!mtd_info)
134
return
-
ENOMEM
;
135
136
addr =
vmalloc
(
MTDRAM_TOTAL_SIZE
);
137
if
(!addr) {
138
kfree
(mtd_info);
139
mtd_info =
NULL
;
140
return
-
ENOMEM
;
141
}
142
err =
mtdram_init_device
(mtd_info, addr,
MTDRAM_TOTAL_SIZE
,
"mtdram test device"
);
143
if
(err) {
144
vfree
(addr);
145
kfree
(mtd_info);
146
mtd_info =
NULL
;
147
return
err
;
148
}
149
memset
(mtd_info->
priv
, 0xff,
MTDRAM_TOTAL_SIZE
);
150
return
err
;
151
}
152
153
module_init
(init_mtdram);
154
module_exit
(cleanup_mtdram);
155
156
MODULE_LICENSE
(
"GPL"
);
157
MODULE_AUTHOR
(
"Alexander Larsson <
[email protected]
>"
);
158
MODULE_DESCRIPTION
(
"Simulated MTD driver for testing"
);
Generated on Thu Jan 10 2013 13:56:21 for Linux Kernel by
1.8.2