This program 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
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _DEVICE_TABLE_H_
#define _DEVICE_TABLE_H_
-#include <stdarg.h>
-
#include "basics.h"
#include "device.h"
+#include "tree.h"
#ifdef HAVE_STRING_H
#include <string.h>
typedef void (device_address_callback)
(device *me,
- const char *name,
attach_type attach,
int space,
unsigned_word addr,
unsigned nr_bytes,
access_type access,
- device *who); /*callback/default*/
+ device *client); /*callback/default*/
typedef struct _device_address_callbacks {
device_address_callback *attach;
typedef struct _device_interrupt_port_descriptor {
const char *name;
int number;
- int bound;
+ int nr_ports;
+ port_direction direction;
} device_interrupt_port_descriptor;
typedef struct _device_interrupt_callbacks {
/* symbolic value decoding */
typedef int (device_unit_decode_callback)
- (device *me,
+ (device *bus,
const char *unit,
device_unit *address);
typedef int (device_unit_encode_callback)
- (device *me,
+ (device *bus,
const device_unit *unit_address,
char *buf,
int sizeof_buf);
+typedef int (device_address_to_attach_address_callback)
+ (device *bus,
+ const device_unit *address,
+ int *attach_space,
+ unsigned_word *attach_address,
+ device *client);
+
+typedef int (device_size_to_attach_size_callback)
+ (device *bus,
+ const device_unit *size,
+ unsigned *nr_bytes,
+ device *client);
+
typedef struct _device_convert_callbacks {
device_unit_decode_callback *decode_unit;
device_unit_encode_callback *encode_unit;
+ device_address_to_attach_address_callback *address_to_attach_address;
+ device_size_to_attach_size_callback *size_to_attach_size;
} device_convert_callbacks;
unsigned_word pos_hi,
unsigned_word pos_lo);
-typedef unsigned_word (device_instance_claim_callback)
+typedef int (device_instance_method)
(device_instance *instance,
- unsigned_word address,
- unsigned_word length,
- unsigned_word alignment);
+ int n_stack_args,
+ unsigned_cell stack_args[/*n_stack_args*/],
+ int n_stack_returns,
+ unsigned_cell stack_returns[/*n_stack_returns*/]);
-typedef void (device_instance_release_callback)
- (device_instance *instance,
- unsigned_word address,
- unsigned_word length);
+typedef struct _device_instance_methods {
+ const char *name;
+ device_instance_method *method;
+} device_instance_methods;
struct _device_instance_callbacks { /* NULL - error */
device_instance_delete_callback *delete;
device_instance_read_callback *read;
device_instance_write_callback *write;
device_instance_seek_callback *seek;
- device_instance_claim_callback *claim;
- device_instance_release_callback *release;
+ const device_instance_methods *methods;
};
typedef device_instance *(device_create_instance_callback)
(device *me,
- const char *path,
+ const char *full_path,
const char *args);
typedef device_instance *(package_create_instance_callback)
(device *me,
cpu *processor,
unsigned_word cia,
+ device_ioctl_request request,
va_list ap);
typedef void (device_usage_callback)
extern device_init_callback generic_device_init_address;
extern device_unit_decode_callback generic_device_unit_decode;
extern device_unit_encode_callback generic_device_unit_encode;
+extern device_address_to_attach_address_callback generic_device_address_to_attach_address;
+extern device_size_to_attach_size_callback generic_device_size_to_attach_size;
extern const device_callbacks passthrough_device_callbacks;