nkeynes@1: /** nkeynes@460: * $Id: maple.h,v 1.8 2007-10-23 10:47:17 nkeynes Exp $ nkeynes@31: * nkeynes@31: * Maple bus definitions nkeynes@31: * nkeynes@31: * Copyright (c) 2005 Nathan Keynes. nkeynes@31: * nkeynes@31: * This program is free software; you can redistribute it and/or modify nkeynes@31: * it under the terms of the GNU General Public License as published by nkeynes@31: * the Free Software Foundation; either version 2 of the License, or nkeynes@31: * (at your option) any later version. nkeynes@31: * nkeynes@31: * This program is distributed in the hope that it will be useful, nkeynes@31: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@31: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@31: * GNU General Public License for more details. nkeynes@1: */ nkeynes@31: nkeynes@450: #ifndef lxdream_maple_H nkeynes@450: #define lxdream_maple_H 1 nkeynes@1: nkeynes@450: #include nkeynes@450: #include "config.h" nkeynes@144: nkeynes@1: #define MAPLE_CMD_INFO 1 /* Request device information */ nkeynes@1: #define MAPLE_CMD_EXT_INFO 2 /* Request extended information */ nkeynes@1: #define MAPLE_CMD_RESET 3 /* Reset device */ nkeynes@1: #define MAPLE_CMD_SHUTDOWN 4 /* Shutdown device */ nkeynes@1: #define MAPLE_CMD_GET_COND 9 /* Get condition */ nkeynes@1: #define MAPLE_CMD_MEM_INFO 10 /* Get memory information */ nkeynes@2: #define MAPLE_CMD_READ_BLOCK 11 /* Block read */ nkeynes@2: #define MAPLE_CMD_WRITE_BLOCK 12 /* Block write */ nkeynes@1: #define MAPLE_CMD_SET_COND 14 /* Set condition */ nkeynes@1: #define MAPLE_RESP_INFO 5 /* Device information response */ nkeynes@1: #define MAPLE_RESP_EXT_INFO 6 /* Extended device information response */ nkeynes@1: #define MAPLE_RESP_ACK 7 /* Acknowledge command */ nkeynes@1: #define MAPLE_RESP_DATA 8 /* Bytes read */ nkeynes@1: #define MAPLE_ERR_NO_RESPONSE -1 /* Device did not respond */ nkeynes@1: #define MAPLE_ERR_FUNC_UNSUP -2 /* Function code unsupported */ nkeynes@1: #define MAPLE_ERR_CMD_UNKNOWN -3 /* Command code unknown */ nkeynes@1: #define MAPLE_ERR_RETRY -4 /* Retry command */ nkeynes@1: #define MAPLE_ERR_FILE -5 /* File error? */ nkeynes@1: nkeynes@2: #define MAPLE_FUNC_CONTROLLER 0x01000000 nkeynes@2: #define MAPLE_FUNC_MEMORY 0x02000000 nkeynes@2: #define MAPLE_FUNC_LCD 0x04000000 nkeynes@2: #define MAPLE_FUNC_CLOCK 0x08000000 nkeynes@2: #define MAPLE_FUNC_MICROPHONE 0x10000000 nkeynes@2: #define MAPLE_FUNC_AR_GUN 0x20000000 nkeynes@2: #define MAPLE_FUNC_KEYBOARD 0x40000000 nkeynes@2: #define MAPLE_FUNC_LIGHT_GUN 0x80000000 nkeynes@2: #define MAPLE_FUNC_PURU_PURU 0x00010000 nkeynes@2: #define MAPLE_FUNC_MOUSE 0x00020000 nkeynes@2: nkeynes@2: #define MAPLE_DEVICE_TAG 0x4D41504C nkeynes@2: #define MAPLE_DEVICE(x) ((maple_device_t)x) nkeynes@2: nkeynes@144: typedef struct maple_device_class *maple_device_class_t; nkeynes@144: typedef struct maple_device *maple_device_t; nkeynes@144: nkeynes@144: struct maple_device_class { nkeynes@144: const char *name; nkeynes@144: maple_device_t (*new_device)(); nkeynes@144: }; nkeynes@144: nkeynes@31: /** nkeynes@31: * Table of functions to be implemented by any maple device. nkeynes@31: */ nkeynes@144: struct maple_device { nkeynes@2: uint32_t _tag; nkeynes@144: maple_device_class_t device_class; nkeynes@2: unsigned char ident[112]; nkeynes@2: unsigned char version[80]; nkeynes@450: lxdream_config_entry_t (*get_config)(struct maple_device *dev); nkeynes@144: void (*attach)(struct maple_device *dev); nkeynes@144: void (*detach)(struct maple_device *dev); nkeynes@144: void (*destroy)(struct maple_device *dev); nkeynes@460: struct maple_device * (*clone)(struct maple_device *dev); nkeynes@2: int (*reset)(struct maple_device *dev); nkeynes@2: int (*shutdown)(struct maple_device *dev); nkeynes@2: int (*get_condition)(struct maple_device *dev, nkeynes@15: int function, unsigned char *outbuf, int *buflen); nkeynes@2: int (*set_condition)(struct maple_device *dev, nkeynes@15: int function, unsigned char *inbuf, int buflen); nkeynes@2: int (*read_block)(struct maple_device *dev, nkeynes@15: int function, uint32_t block, unsigned char *outbuf, int *buflen); nkeynes@2: int (*write_block)(struct maple_device *dev, nkeynes@15: int function, uint32_t block, unsigned char *inbuf, int buflen); nkeynes@144: }; nkeynes@2: nkeynes@144: extern struct maple_device_class controller_class; nkeynes@144: nkeynes@447: maple_device_t maple_new_device( const gchar *name ); nkeynes@144: maple_device_t maple_get_device( unsigned int port, unsigned int periph ); nkeynes@447: const maple_device_class_t maple_get_device_class( const gchar *name ); nkeynes@447: const struct maple_device_class **maple_get_device_classes(); nkeynes@450: lxdream_config_entry_t maple_get_device_config( maple_device_t dev ); nkeynes@1: nkeynes@1: void maple_handle_buffer( uint32_t buffer ); nkeynes@2: void maple_attach_device( maple_device_t dev, unsigned int port, unsigned int periph ); nkeynes@2: void maple_detach_device( unsigned int port, unsigned int periph ); nkeynes@144: void maple_detach_all( ); nkeynes@144: void maple_reattach_all( ); nkeynes@1: nkeynes@450: #endif /* !lxdream_maple_H */