summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/at45dbxx.h
blob: f215a22c7fe55e51719689aa140314595895096c (plain) (blame)
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// license:BSD-3-Clause
// copyright-holders:Tim Schuerewegen
/*

    Atmel Serial DataFlash

    (c) 2001-2007 Tim Schuerewegen

    AT45DB041 -  528 KByte
    AT45DB081 - 1056 KByte
    AT45DB161 - 2112 KByte

*/

#ifndef MAME_MACHINE_AT45DBXX_H
#define MAME_MACHINE_AT45DBXX_H

#pragma once


//**************************************************************************
//  INTERFACE CONFIGURATION MACROS
//**************************************************************************

#define MCFG_AT45DB041_ADD(_tag) \
	MCFG_DEVICE_ADD(_tag, AT45DB041, 0)

#define MCFG_AT45DB081_ADD(_tag) \
	MCFG_DEVICE_ADD(_tag, AT45DB081, 0)

#define MCFG_AT45DB161_ADD(_tag) \
	MCFG_DEVICE_ADD(_tag, AT45DB161, 0)

#define MCFG_AT45DBXXX_SO_CALLBACK(_cb) \
	devcb = &downcast<at45db041_device &>(*device).set_so_cb(DEVCB_##_cb);


// ======================> at45db041_device

class at45db041_device : public device_t,
							public device_nvram_interface
{
public:
	at45db041_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	DECLARE_WRITE_LINE_MEMBER(cs_w);
	DECLARE_WRITE_LINE_MEMBER(sck_w);
	DECLARE_WRITE_LINE_MEMBER(si_w);
	DECLARE_READ_LINE_MEMBER(so_r);

	uint8_t *get_ptr() {  return &m_data[0];  }

	template <class Object> devcb_base &set_so_cb(Object &&cb) { return write_so.set_callback(std::forward<Object>(cb)); }

protected:
	at45db041_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);

	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;

	// device_nvram_interface overrides
	virtual void nvram_default() override;
	virtual void nvram_read(emu_file &file) override;
	virtual void nvram_write(emu_file &file) override;

	virtual int num_pages() const { return 2048; }
	virtual int page_size() const { return 264; }
	virtual uint8_t device_id() const { return 0x18; }

	uint8_t read_byte();
	void flash_set_io(uint8_t* data, uint32_t size, uint32_t pos);
	virtual uint32_t flash_get_page_addr();
	virtual uint32_t flash_get_byte_addr();
	void write_byte(uint8_t data);

	devcb_write_line write_so;

	// internal state
	std::vector<uint8_t> m_data;
	uint32_t      m_size;
	uint8_t       m_mode;
	uint8_t       m_status;
	std::vector<uint8_t> m_buffer1;
	//std::vector<uint8_t> m_buffer2;
	uint8_t       m_si_byte;
	uint8_t       m_si_bits;
	uint8_t       m_so_byte;
	uint8_t       m_so_bits;

	struct AT45DBXX_PINS
	{
		int cs;    // chip select
		int sck;   // serial clock
		int si;    // serial input
		int so;    // serial output
		int wp;    // write protect
		int reset; // reset
		int busy;  // busy
	} m_pin;

	struct AT45DBXX_IO
	{
		uint8_t *data;
		uint32_t size;
		uint32_t pos;
	} m_io;

	struct AT45DBXX_CMD
	{
		uint8_t data[8];
		uint8_t size;
	} m_cmd;
};

// ======================> at45db081_device

class at45db081_device : public at45db041_device
{
public:
	at45db081_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

protected:
	virtual int num_pages() const override { return 4096; }
	virtual int page_size() const override { return 264;  }
	virtual uint8_t device_id() const override { return 0x20; }

	virtual uint32_t flash_get_page_addr() override;
};

// ======================> at45db161_device

class at45db161_device : public at45db041_device
{
public:
	at45db161_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

protected:
	virtual int num_pages() const override { return 4096; }
	virtual int page_size() const override { return 528;  }
	virtual uint8_t device_id() const override { return 0x28; }

	virtual uint32_t flash_get_page_addr() override;
	virtual uint32_t flash_get_byte_addr() override;
};


// device type definition
DECLARE_DEVICE_TYPE(AT45DB041, at45db041_device)
DECLARE_DEVICE_TYPE(AT45DB081, at45db081_device)
DECLARE_DEVICE_TYPE(AT45DB161, at45db161_device)

#endif // MAME_MACHINE_AT45DBXX_H