ringfs
 All Data Structures Files Functions Variables Enumerations Enumerator Macros Groups Pages
flashsim.c
Go to the documentation of this file.
1 /*
2  * Copyright © 2014 Kosma Moczek <kosma@cloudyourcar.com>
3  * This program is free software. It comes without any warranty, to the extent
4  * permitted by applicable law. You can redistribute it and/or modify it under
5  * the terms of the Do What The Fuck You Want To Public License, Version 2, as
6  * published by Sam Hocevar. See the COPYING file for more details.
7  */
8 
9 #include "flashsim.h"
10 
11 #include <stdio.h>
12 #include <string.h>
13 #include <unistd.h>
14 #include <stdlib.h>
15 #include <assert.h>
16 
17 #ifdef COLOR_OUTPUT
18 #define cprintf(colors, fmt, args...) \
19  printf("\x1b[0;1;" colors "m" fmt , ## args)
20 #define cprintf_end(fmt, args...) \
21  printf(fmt "\x1b[0m\n" , ## args)
22 #else
23 #define cprintf(colors, fmt, args...) \
24  printf(fmt , ## args)
25 #define cprintf_end(fmt, args...) \
26  printf(fmt "\n" , ## args)
27 #endif
28 
29 struct flashsim {
30  int size;
32 
33  FILE *fh;
34 };
35 
36 struct flashsim *flashsim_open(const char *name, int size, int sector_size)
37 {
38  struct flashsim *sim = malloc(sizeof(struct flashsim));
39 
40  sim->size = size;
41  sim->sector_size = sector_size;
42  sim->fh = fopen(name, "w+");
43  assert(sim->fh != NULL);
44  assert(ftruncate(fileno(sim->fh), size) == 0);
45 
46  return sim;
47 }
48 
50 {
51  fclose(sim->fh);
52  free(sim);
53 }
54 
55 void flashsim_sector_erase(struct flashsim *sim, int addr)
56 {
57  int sector_start = addr & ~(sim->sector_size - 1);
58  cprintf("31", "flashsim_erase (0x%08x) * erasing sector at 0x%08x", addr, sector_start);
59  cprintf_end("");
60 
61  void *empty = malloc(sim->sector_size);
62  memset(empty, 0xff, sim->sector_size);
63 
64  assert(fseek(sim->fh, sector_start, SEEK_SET) == 0);
65  assert(fwrite(empty, 1, sim->sector_size, sim->fh) == (size_t) sim->sector_size);
66 
67  free(empty);
68 }
69 
70 void flashsim_read(struct flashsim *sim, int addr, uint8_t *buf, int len)
71 {
72  assert(fseek(sim->fh, addr, SEEK_SET) == 0);
73  assert(fread(buf, 1, len, sim->fh) == (size_t) len);
74 
75  cprintf("32", "flashsim_read (0x%08x) = %d bytes [ ", addr, len);
76  for (int i=0; i<len; i++) {
77  printf("%02x ", buf[i]);
78  if (i == 15) {
79  printf("... ");
80  break;
81  }
82  }
83  cprintf_end("]");
84 }
85 
86 void flashsim_program(struct flashsim *sim, int addr, const uint8_t *buf, int len)
87 {
88  cprintf("34", "flashsim_program(0x%08x) + %d bytes [ ", addr, len);
89  for (int i=0; i<len; i++) {
90  printf("%02x ", buf[i]);
91  if (i == 15) {
92  printf("... ");
93  break;
94  }
95  }
96  cprintf_end("]");
97 
98  uint8_t *data = malloc(len);
99 
100  assert(fseek(sim->fh, addr, SEEK_SET) == 0);
101  assert(fread(data, 1, len, sim->fh) == (size_t) len);
102 
103  for (int i=0; i<(int) len; i++)
104  data[i] &= buf[i];
105 
106  assert(fseek(sim->fh, addr, SEEK_SET) == 0);
107  assert(fwrite(data, 1, len, sim->fh) == (size_t) len);
108 
109  free(data);
110 }
111 
112 /* vim: set ts=4 sw=4 et: */
void flashsim_program(struct flashsim *sim, int addr, const uint8_t *buf, int len)
Definition: flashsim.c:86
#define cprintf(colors, fmt, args...)
Definition: flashsim.c:23
void flashsim_read(struct flashsim *sim, int addr, uint8_t *buf, int len)
Definition: flashsim.c:70
#define cprintf_end(fmt, args...)
Definition: flashsim.c:25
void flashsim_sector_erase(struct flashsim *sim, int addr)
Definition: flashsim.c:55
struct flashsim * flashsim_open(const char *name, int size, int sector_size)
Definition: flashsim.c:36
static END_TEST struct flashsim * sim
Definition: tests.c:61
int size
Definition: flashsim.c:30
int sector_size
Definition: flashsim.c:31
FILE * fh
Definition: flashsim.c:33
void flashsim_close(struct flashsim *sim)
Definition: flashsim.c:49