7 #include <linux/types.h>
20 struct erase_info_user {
25 #define MEMGETINFO _IOR('M', 1, struct mtd_info_user)
26 #define MEMERASE _IOW('M', 2, struct erase_info_user)
28 int mtd_open(const char *name, int flags)
34 if ((fp = fopen("/proc/mtd", "r"))) {
35 while (fgets(dev, sizeof(dev), fp)) {
36 if (sscanf(dev, "mtd%d:", &i) && strstr(dev, name)) {
37 snprintf(dev, sizeof(dev), "/dev/mtd/%d", i);
38 if ((ret = open(dev, flags)) < 0) {
39 snprintf(dev, sizeof(dev), "/dev/mtd%d", i);
40 ret = open(dev, flags);
51 int flash_read_mac(char *buf)
57 fd = mtd_open("Factory", O_RDONLY);
59 fprintf(stderr, "Could not open mtd device\n");
62 lseek(fd, 0x2E, SEEK_SET);
63 ret = read(fd, buf, 6);
68 int flash_read_NicConf(char *buf)
74 fd = mtd_open("Factory", O_RDONLY);
76 fprintf(stderr, "Could not open mtd device\n");
79 lseek(fd, 0x34, SEEK_SET);
80 ret = read(fd, buf, 6);
85 int flash_read(char *buf, off_t from, size_t len)
88 struct mtd_info_user info;
90 fd = mtd_open("Config", O_RDONLY);
92 fprintf(stderr, "Could not open mtd device\n");
96 if (ioctl(fd, MEMGETINFO, &info)) {
97 fprintf(stderr, "Could not get mtd device info\n");
101 if (len > info.size) {
102 fprintf(stderr, "Too many bytes - %d > %d bytes\n", len, info.erasesize);
108 fd = mtd_open("Config", O_RDONLY);
110 fprintf(stderr, "Could not open mtd block device\n");
114 lseek(fd, from, SEEK_SET);
115 ret = read(fd, buf, len);
117 fprintf(stderr, "Reading from mtd failed\n");
126 #define min(x,y) ({ typeof(x) _x = (x); typeof(y) _y = (y); (void) (&_x == &_y); _x < _y ? _x : _y; })
128 int flash_write(char *buf, off_t to, size_t len)
132 struct mtd_info_user info;
133 struct erase_info_user ei;
135 fd = mtd_open("Config", O_RDWR | O_SYNC);
137 fprintf(stderr, "Could not open mtd device\n");
141 if (ioctl(fd, MEMGETINFO, &info)) {
142 fprintf(stderr, "Could not get mtd device info\n");
146 if (len > info.size) {
147 fprintf(stderr, "Too many bytes: %d > %d bytes\n", len, info.erasesize);
153 if ((len & (info.erasesize-1)) || (len < info.erasesize)) {
155 unsigned int piece, bakaddr;
157 bak = (char *)malloc(info.erasesize);
159 fprintf(stderr, "Not enough memory\n");
164 bakaddr = to & ~(info.erasesize - 1);
165 lseek(fd, bakaddr, SEEK_SET);
167 ret = read(fd, bak, info.erasesize);
169 fprintf(stderr, "Reading from mtd failed\n");
175 piece = to & (info.erasesize - 1);
176 piece_size = min(len, info.erasesize - piece);
177 memcpy(bak + piece, buf, piece_size);
180 ei.length = info.erasesize;
181 if (ioctl(fd, MEMERASE, &ei) < 0) {
182 fprintf(stderr, "Erasing mtd failed\n");
188 lseek(fd, bakaddr, SEEK_SET);
189 ret = write(fd, bak, info.erasesize);
191 fprintf(stderr, "Writing to mtd failed\n");
204 ei.length = info.erasesize;
205 if (ioctl(fd, MEMERASE, &ei) < 0) {
206 fprintf(stderr, "Erasing mtd failed\n");
211 ret = write(fd, buf, info.erasesize);
213 fprintf(stderr, "Writing to mtd failed\n");
219 buf += info.erasesize;
220 to += info.erasesize;
221 len -= info.erasesize;