Commit 17be2d2b authored by Adrian McMenamin's avatar Adrian McMenamin Committed by Paul Mundt

sh: Add maple bus support for the SEGA Dreamcast.

The Maple bus is SEGA's proprietary serial bus for peripherals
(keyboard, mouse, controller etc). The bus is capable of some
(limited) hotplugging and operates at up to 2 M/bits.

Drivers of one sort or another existed/exist for 2.4 and a rudimentary
port, which didn't support the 2.6 device driver model was also in
existence.

This driver - for the bus logic itself and for the keyboard (other
drivers will follow) are based on the code and concepts of those old
drivers but have lots of completely rewritten parts.

I have the maple bus code as a built in now as that seems the sane and
rational way to handle something like that - you either want the bus
or you don't.
Signed-off-by: default avatarAdrian McMenamin <adrian@mcmen.demon.co.uk>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent e87ab0c4
...@@ -666,6 +666,17 @@ config SUPERHYWAY ...@@ -666,6 +666,17 @@ config SUPERHYWAY
tristate "SuperHyway Bus support" tristate "SuperHyway Bus support"
depends on CPU_SUBTYPE_SH4_202 depends on CPU_SUBTYPE_SH4_202
config MAPLE
bool "Maple Bus support"
depends on SH_DREAMCAST
help
The Maple Bus is SEGA's serial communication bus for peripherals
on the Dreamcast. Without this bus support you won't be able to
get your Dreamcast keyboard etc to work, so most users
probably want to say 'Y' here, unless you are only using the
Dreamcast with a serial line terminal or a remote network
connection.
config CF_ENABLER config CF_ENABLER
bool "Compact Flash Enabler support" bool "Compact Flash Enabler support"
depends on SOLUTION_ENGINE || SH_SH03 depends on SOLUTION_ENGINE || SH_SH03
......
...@@ -3,4 +3,4 @@ ...@@ -3,4 +3,4 @@
# #
obj-$(CONFIG_SUPERHYWAY) += superhyway/ obj-$(CONFIG_SUPERHYWAY) += superhyway/
obj-$(CONFIG_MAPLE) += maple/
# Makefile for Maple Bus
obj-$(CONFIG_MAPLE) := maple.o
This diff is collapsed.
#ifndef __ASM_MAPLE_H
#define __ASM_MAPLE_H
#define MAPLE_PORTS 4
#define MAPLE_PNP_INTERVAL HZ
#define MAPLE_MAXPACKETS 8
#define MAPLE_DMA_ORDER 14
#define MAPLE_DMA_SIZE (1 << MAPLE_DMA_ORDER)
#define MAPLE_DMA_PAGES ((MAPLE_DMA_ORDER > PAGE_SHIFT) ? \
MAPLE_DMA_ORDER - PAGE_SHIFT : 0)
/* Maple Bus registers */
#define MAPLE_BASE 0xa05f6c00
#define MAPLE_DMAADDR (MAPLE_BASE+0x04)
#define MAPLE_TRIGTYPE (MAPLE_BASE+0x10)
#define MAPLE_ENABLE (MAPLE_BASE+0x14)
#define MAPLE_STATE (MAPLE_BASE+0x18)
#define MAPLE_SPEED (MAPLE_BASE+0x80)
#define MAPLE_RESET (MAPLE_BASE+0x8c)
#define MAPLE_MAGIC 0x6155404f
#define MAPLE_2MBPS 0
#define MAPLE_TIMEOUT(n) ((n)<<15)
/* Function codes */
#define MAPLE_FUNC_CONTROLLER 0x001
#define MAPLE_FUNC_MEMCARD 0x002
#define MAPLE_FUNC_LCD 0x004
#define MAPLE_FUNC_CLOCK 0x008
#define MAPLE_FUNC_MICROPHONE 0x010
#define MAPLE_FUNC_ARGUN 0x020
#define MAPLE_FUNC_KEYBOARD 0x040
#define MAPLE_FUNC_LIGHTGUN 0x080
#define MAPLE_FUNC_PURUPURU 0x100
#define MAPLE_FUNC_MOUSE 0x200
#endif /* __ASM_MAPLE_H */
#ifndef __LINUX_MAPLE_H
#define __LINUX_MAPLE_H
#include <linux/device.h>
extern struct bus_type maple_bus_type;
/* Maple Bus command and response codes */
enum maple_code {
MAPLE_RESPONSE_FILEERR = -5,
MAPLE_RESPONSE_AGAIN = -4, /* request should be retransmitted */
MAPLE_RESPONSE_BADCMD = -3,
MAPLE_RESPONSE_BADFUNC = -2,
MAPLE_RESPONSE_NONE = -1, /* unit didn't respond at all */
MAPLE_COMMAND_DEVINFO = 1,
MAPLE_COMMAND_ALLINFO = 2,
MAPLE_COMMAND_RESET = 3,
MAPLE_COMMAND_KILL = 4,
MAPLE_RESPONSE_DEVINFO = 5,
MAPLE_RESPONSE_ALLINFO = 6,
MAPLE_RESPONSE_OK = 7,
MAPLE_RESPONSE_DATATRF = 8,
MAPLE_COMMAND_GETCOND = 9,
MAPLE_COMMAND_GETMINFO = 10,
MAPLE_COMMAND_BREAD = 11,
MAPLE_COMMAND_BWRITE = 12,
MAPLE_COMMAND_SETCOND = 14
};
struct mapleq {
struct list_head list;
struct maple_device *dev;
void *sendbuf, *recvbuf, *recvbufdcsp;
unsigned char length;
enum maple_code command;
};
struct maple_devinfo {
unsigned long function;
unsigned long function_data[3];
unsigned char area_code;
unsigned char connector_directon;
char product_name[31];
char product_licence[61];
unsigned short standby_power;
unsigned short max_power;
};
struct maple_device {
struct maple_driver *driver;
struct mapleq *mq;
void *private_data;
void (*callback) (struct mapleq * mq);
unsigned long when, interval, function;
struct maple_devinfo devinfo;
unsigned char port, unit;
char product_name[32];
char product_licence[64];
int registered;
struct device dev;
};
struct maple_driver {
unsigned long function;
int (*connect) (struct maple_device * dev);
void (*disconnect) (struct maple_device * dev);
struct device_driver drv;
};
void maple_getcond_callback(struct maple_device *dev,
void (*callback) (struct mapleq * mq),
unsigned long interval,
unsigned long function);
int maple_driver_register(struct device_driver *drv);
void maple_add_packet(struct mapleq *mq);
#define to_maple_dev(n) container_of(n, struct maple_device, dev)
#define to_maple_driver(n) container_of(n, struct maple_driver, drv)
#endif /* __LINUX_MAPLE_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment