File: flashcl.h

package info (click to toggle)
sdcc 3.8.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 99,212 kB
  • sloc: ansic: 918,594; cpp: 69,526; makefile: 56,790; sh: 29,616; asm: 12,364; perl: 12,136; yacc: 7,179; lisp: 1,672; python: 812; lex: 773; awk: 495; sed: 89
file content (136 lines) | stat: -rw-r--r-- 3,411 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
 * Simulator of microcontrollers (stm8.src/flashcl.h)
 *
 * Copyright (C) 2017,17 Drotos Daniel, Talker Bt.
 * 
 * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
 *
 */

/* This file is part of microcontroller simulator: ucsim.

UCSIM is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

UCSIM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with UCSIM; see the file COPYING.  If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
/*@1@*/

#ifndef FLASHCL_HEADER
#define FLASHCL_HEADER

#include "hwcl.h"
#include "memcl.h"


/* Special memory/address space to handle flash ops */

class cl_flash_cell: public cl_cell8
{
 public:
 cl_flash_cell(uchar awidth): cl_cell8(awidth) {}
  virtual t_mem write(t_mem val);
};

class cl_flash_as: public cl_address_space
{
 public:
  cl_flash_as(const char *id, t_addr astart, t_addr asize);
  virtual int init(void);
};

enum stm8_flash_cfg {
  stm8_flash_on= 0,
  stm8_flash_nuof_cfg= 1
};

enum stm8_mass {
  PMASS1= 0x56,
  PMASS2= 0xae,
  DMASS1= 0xae,
  DMASS2= 0x56
};

enum stm8_flash_state {
  fs_wait_mode= 0x00,
  fs_wait_data= 0x01,
  fs_pre_erase= 0x02,
  fs_program= 0x04,
  fs_busy= fs_pre_erase|fs_program
};

enum stm8_flash_mode {
  fm_unknown= 0,
  fm_byte= 1,
  fm_word= 2,
  fm_fast_word= 3,
  fm_block= 4,
  fm_fast_block= 5,
  fm_erase= 6
};

class cl_flash: public cl_hw
{
 protected:
  t_addr base;
  cl_memory_cell *cr1r, *cr2r, *ncr2r, *pukr, *dukr, *iapsr;
  bool puk1st, duk1st;
  bool p_unlocked, d_unlocked;
  bool p_failed, d_failed;
  u8_t wbuf[256]; /* buffer of block */
  bool wbuf_started; /* any writes happened to block */
  int wbuf_size; /* block size */
  int wbuf_writes; /* nr of writes to block */
  t_addr wbuf_start; /* start address of block */
  bool rww;
  enum stm8_flash_state state;
  enum stm8_flash_mode mode;
  double tprog; /* programing time in usec */
  double start_time;
 public:
  cl_flash(class cl_uc *auc, t_addr abase, const char *aname);
  virtual int init(void);
  virtual void registration(void) {}
  virtual int tick(int cycles);
  virtual void reset(void);

  virtual t_mem read(class cl_memory_cell *cell);
  virtual void write(class cl_memory_cell *cell, t_mem *val);
  virtual t_mem conf_op(cl_memory_cell *cell, t_addr addr, t_mem *val);

  virtual void flash_write(t_addr a, t_mem val);
  virtual void set_flash_mode(t_mem cr2val);
  virtual void start_wbuf(t_addr addr);
  virtual void start_program(enum stm8_flash_state start_state);
  virtual void finish_program(bool ok);

  virtual const char *state_name(enum stm8_flash_state s);
  virtual void print_info(class cl_console_base *con);
};

class cl_saf_flash: public cl_flash
{
 public:
  cl_saf_flash(class cl_uc *auc, t_addr abase);
  virtual void registration(void);
};

class cl_l_flash: public cl_flash
{
 public:
  cl_l_flash(class cl_uc *auc, t_addr abase);
  virtual void registration(void);
};

#endif

/* End of stm8.src/flashcl.h */