📄 device_table.h
字号:
/* This file is part of the program psim. Copyright (C) 1994-1996, Andrew Cagney <cagney@highland.com.au> 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 (at your option) any later version. This program 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 this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#ifndef _DEVICE_TABLE_H_#define _DEVICE_TABLE_H_#include "basics.h"#include "device.h"#include "tree.h"#ifdef HAVE_STRING_H#include <string.h>#else#ifdef HAVE_STRINGS_H#include <strings.h>#endif#endiftypedef struct _device_callbacks device_callbacks;/* The creator, returns a pointer to any data that should be allocated once during (multiple) simulation runs */typedef void *(device_creator) (const char *name, const device_unit *unit_address, const char *args);/* two stages of initialization */typedef void (device_init_callback) (device *me); typedef struct _device_init_callbacks { device_init_callback *address; /* NULL - ignore */ device_init_callback *data; /* NULL - ignore */} device_init_callbacks;/* attaching/detaching a devices address space to its parent */typedef void (device_address_callback) (device *me, attach_type attach, int space, unsigned_word addr, unsigned nr_bytes, access_type access, device *client); /*callback/default*/typedef struct _device_address_callbacks { device_address_callback *attach; device_address_callback *detach;} device_address_callbacks;/* I/O operations - from parent */typedef unsigned (device_io_read_buffer_callback) (device *me, void *dest, int space, unsigned_word addr, unsigned nr_bytes, cpu *processor, unsigned_word cia);typedef unsigned (device_io_write_buffer_callback) (device *me, const void *source, int space, unsigned_word addr, unsigned nr_bytes, cpu *processor, unsigned_word cia);typedef struct _device_io_callbacks { /* NULL - error */ device_io_read_buffer_callback *read_buffer; device_io_write_buffer_callback *write_buffer;} device_io_callbacks;/* DMA transfers by a device via its parent */typedef unsigned (device_dma_read_buffer_callback) (device *me, void *dest, int space, unsigned_word addr, unsigned nr_bytes);typedef unsigned (device_dma_write_buffer_callback) (device *me, const void *source, int space, unsigned_word addr, unsigned nr_bytes, int violate_read_only_section);typedef struct _device_dma_callbacks { /* NULL - error */ device_dma_read_buffer_callback *read_buffer; device_dma_write_buffer_callback *write_buffer;} device_dma_callbacks;/* Interrupts */typedef void (device_interrupt_event_callback) (device *me, int my_port, device *source, int source_port, int level, cpu *processor, unsigned_word cia);typedef void (device_child_interrupt_event_callback) (device *me, device *parent, device *source, int source_port, int level, cpu *processor, unsigned_word cia); typedef struct _device_interrupt_port_descriptor { const char *name; int number; int nr_ports; port_direction direction;} device_interrupt_port_descriptor;typedef struct _device_interrupt_callbacks { device_interrupt_event_callback *event; device_child_interrupt_event_callback *child_event; const device_interrupt_port_descriptor *ports;} device_interrupt_callbacks;/* symbolic value decoding */typedef int (device_unit_decode_callback) (device *bus, const char *unit, device_unit *address);typedef int (device_unit_encode_callback) (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;/* instances */typedef void (device_instance_delete_callback) (device_instance *instance);typedef int (device_instance_read_callback) (device_instance *instance, void *buf, unsigned_word len);typedef int (device_instance_write_callback) (device_instance *instance, const void *buf, unsigned_word len);typedef int (device_instance_seek_callback) (device_instance *instance, unsigned_word pos_hi, unsigned_word pos_lo);typedef int (device_instance_method) (device_instance *instance, int n_stack_args, unsigned_cell stack_args[/*n_stack_args*/], int n_stack_returns, unsigned_cell stack_returns[/*n_stack_returns*/]);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; const device_instance_methods *methods;};typedef device_instance *(device_create_instance_callback) (device *me, const char *full_path, const char *args);typedef device_instance *(package_create_instance_callback) (device_instance *parent, const char *args);/* all else fails */typedef int (device_ioctl_callback) (device *me, cpu *processor, unsigned_word cia, device_ioctl_request request, va_list ap);typedef void (device_usage_callback) (int verbose);/* the callbacks */struct _device_callbacks { /* initialization */ device_init_callbacks init; /* address/data config - from child */ device_address_callbacks address; /* address/data transfer - from parent */ device_io_callbacks io; /* address/data transfer - from child */ device_dma_callbacks dma; /* interrupt signalling */ device_interrupt_callbacks interrupt; /* bus address decoding */ device_convert_callbacks convert; /* instances */ device_create_instance_callback *instance_create; /* back door to anything we've forgot */ device_ioctl_callback *ioctl; device_usage_callback *usage;};/* Table of all the devices and a function to lookup/create a device from its name */typedef struct _device_descriptor device_descriptor;struct _device_descriptor { const char *name; device_creator *creator; const device_callbacks *callbacks;};extern const device_descriptor *const device_table[];#include "hw.h"/* Pass through, ignore and generic callback functions. A call going towards the root device are passed on up, local calls are ignored and call downs abort */extern device_address_callback passthrough_device_address_attach;extern device_address_callback passthrough_device_address_detach;extern device_dma_read_buffer_callback passthrough_device_dma_read_buffer;extern device_dma_write_buffer_callback passthrough_device_dma_write_buffer;extern device_unit_decode_callback ignore_device_unit_decode;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;#endif /* _DEVICE_TABLE_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -