KallistiOS git master
Independent SDK for the Sega Dreamcast
Loading...
Searching...
No Matches
maple.h
Go to the documentation of this file.
1/* KallistiOS ##version##
2
3 dc/maple.h
4 Copyright (C) 2002 Megan Potter
5 Copyright (C) 2015 Lawrence Sebald
6
7 This new driver's design is based loosely on the LinuxDC maple
8 bus driver.
9*/
10
11/** \file dc/maple.h
12 \brief Maple Bus driver interface.
13 \ingroup maple
14
15 This file provides support for accessing the Maple bus on the Dreamcast.
16 Maple is the bus that all of your controllers and memory cards and the like
17 connect to, so this is one of those types of things that are quite important
18 to know how to use.
19
20 Each peripheral device registers their driver within this system, and can be
21 accessed through the functions here. Most of the drivers have their own
22 functionality that is implemented in their header files, as well.
23
24 \author Megan Potter
25 \author Lawrence Sebald
26
27 \see dc/maple/controller.h
28 \see dc/maple/dreameye.h
29 \see dc/maple/keyboard.h
30 \see dc/maple/mouse.h
31 \see dc/maple/purupuru.h
32 \see dc/maple/sip.h
33 \see dc/maple/vmu.h
34*/
35
36#ifndef __DC_MAPLE_H
37#define __DC_MAPLE_H
38
39#include <sys/cdefs.h>
40__BEGIN_DECLS
41
42#include <stdbool.h>
43#include <arch/types.h>
44#include <sys/queue.h>
45
46/** \defgroup maple Maple Bus
47 \brief Driver for the Dreamcast's Maple Peripheral Bus
48 \ingroup peripherals
49*/
50
51/** \brief Enable Maple DMA debugging.
52 \ingroup maple
53
54 Changing this to a 1 will add massive amounts of processing time to the
55 maple system in general, but it can help in verifying DMA errors. In
56 general, for most purposes this should stay disabled.
57*/
58#define MAPLE_DMA_DEBUG 0
59
60/** \brief Enable Maple IRQ debugging.
61 \ingroup maple
62
63 Changing this to a 1 will turn on intra-interrupt debugging messages, which
64 may cause issues if you're using dcload rather than a raw serial debug
65 terminal. You probably will never have a good reason to enable this, so keep
66 it disabled for normal use.
67*/
68#define MAPLE_IRQ_DEBUG 0
69
70/** \defgroup maple_regs Registers
71 \brief Addresses for various maple registers
72 \ingroup maple
73
74 These are various registers related to the Maple Bus. In general, you
75 probably won't ever need to mess with these directly.
76
77 @{
78*/
79#define MAPLE_BASE 0xa05f6c00 /**< \brief Maple register base */
80#define MAPLE_DMAADDR (MAPLE_BASE+0x04) /**< \brief DMA address register */
81#define MAPLE_RESET2 (MAPLE_BASE+0x10) /**< \brief Reset register #2 */
82#define MAPLE_ENABLE (MAPLE_BASE+0x14) /**< \brief Enable register */
83#define MAPLE_STATE (MAPLE_BASE+0x18) /**< \brief Status register */
84#define MAPLE_SPEED (MAPLE_BASE+0x80) /**< \brief Speed register */
85#define MAPLE_RESET1 (MAPLE_BASE+0x8c) /**< \brief Reset register #1 */
86/** @} */
87
88/** \defgroup maple_reg_values Register Values
89 \brief Values for various maple registers
90 \ingroup maple
91
92 These are the values that are written to registers to get them to do their
93 thing.
94
95 @{
96*/
97#define MAPLE_RESET2_MAGIC 0 /**< \brief 2nd reset value */
98#define MAPLE_ENABLE_ENABLED 1 /**< \brief Enable Maple */
99#define MAPLE_ENABLE_DISABLED 0 /**< \brief Disable Maple */
100#define MAPLE_STATE_IDLE 0 /**< \brief Idle state */
101#define MAPLE_STATE_DMA 1 /**< \brief DMA in-progress */
102#define MAPLE_SPEED_2MBPS 0 /**< \brief 2Mbps bus speed */
103#define MAPLE_SPEED_TIMEOUT(n) ((n) << 16) /**< \brief Bus timeout macro */
104
105#ifndef _arch_sub_naomi
106#define MAPLE_RESET1_MAGIC 0x6155404f /**< \brief First reset value */
107#else
108#define MAPLE_RESET1_MAGIC 0x6155405f
109#endif
110
111/** @} */
112
113/** \defgroup maple_cmds Commands and Responses
114 \brief Maple command and response values
115 \ingroup maple
116
117 These are all either commands or responses to commands sent to or from Maple
118 in normal operation.
119
120 @{
121*/
122#define MAPLE_RESPONSE_FILEERR -5 /**< \brief File error */
123#define MAPLE_RESPONSE_AGAIN -4 /**< \brief Try again later */
124#define MAPLE_RESPONSE_BADCMD -3 /**< \brief Bad command sent */
125#define MAPLE_RESPONSE_BADFUNC -2 /**< \brief Bad function code */
126#define MAPLE_RESPONSE_NONE -1 /**< \brief No response */
127#define MAPLE_COMMAND_DEVINFO 1 /**< \brief Device info request */
128#define MAPLE_COMMAND_ALLINFO 2 /**< \brief All info request */
129#define MAPLE_COMMAND_RESET 3 /**< \brief Reset device request */
130#define MAPLE_COMMAND_KILL 4 /**< \brief Kill device request */
131#define MAPLE_RESPONSE_DEVINFO 5 /**< \brief Device info response */
132#define MAPLE_RESPONSE_ALLINFO 6 /**< \brief All info response */
133#define MAPLE_RESPONSE_OK 7 /**< \brief Command completed ok */
134#define MAPLE_RESPONSE_DATATRF 8 /**< \brief Data transfer */
135#define MAPLE_COMMAND_GETCOND 9 /**< \brief Get condition request */
136#define MAPLE_COMMAND_GETMINFO 10 /**< \brief Get memory information */
137#define MAPLE_COMMAND_BREAD 11 /**< \brief Block read */
138#define MAPLE_COMMAND_BWRITE 12 /**< \brief Block write */
139#define MAPLE_COMMAND_BSYNC 13 /**< \brief Block sync */
140#define MAPLE_COMMAND_SETCOND 14 /**< \brief Set condition request */
141#define MAPLE_COMMAND_MICCONTROL 15 /**< \brief Microphone control */
142#define MAPLE_COMMAND_CAMCONTROL 17 /**< \brief Camera control */
143/** @} */
144
145/** \defgroup maple_functions Function Codes
146 \brief Values of maple "function" codes
147 \ingroup maple
148
149 This is the list of maple device types (function codes). Each device must
150 have at least one function to actually do anything.
151
152 @{
153*/
154
155/* Function codes; most sources claim that these numbers are little
156 endian, and for all I know, they might be; but since it's a bitmask
157 it doesn't really make much different. We'll just reverse our constants
158 from the "big-endian" version. */
159#define MAPLE_FUNC_PURUPURU 0x00010000 /**< \brief Jump pack */
160#define MAPLE_FUNC_MOUSE 0x00020000 /**< \brief Mouse */
161#define MAPLE_FUNC_CAMERA 0x00080000 /**< \brief Camera (Dreameye) */
162#define MAPLE_FUNC_CONTROLLER 0x01000000 /**< \brief Controller */
163#define MAPLE_FUNC_MEMCARD 0x02000000 /**< \brief Memory card */
164#define MAPLE_FUNC_LCD 0x04000000 /**< \brief LCD screen */
165#define MAPLE_FUNC_CLOCK 0x08000000 /**< \brief Clock */
166#define MAPLE_FUNC_MICROPHONE 0x10000000 /**< \brief Microphone */
167#define MAPLE_FUNC_ARGUN 0x20000000 /**< \brief AR gun? */
168#define MAPLE_FUNC_KEYBOARD 0x40000000 /**< \brief Keyboard */
169#define MAPLE_FUNC_LIGHTGUN 0x80000000 /**< \brief Lightgun */
170/** @} */
171
172/* \cond */
173/* Pre-define list/queue types */
174struct maple_frame;
175TAILQ_HEAD(maple_frame_queue, maple_frame);
176
177struct maple_driver;
178LIST_HEAD(maple_driver_list, maple_driver);
179
180struct maple_state_str;
181/* \endcond */
182
183/** \brief Maple frame to be queued for transport.
184 \ingroup maple
185
186 Internal representation of a frame to be queued up for sending.
187
188 \headerfile dc/maple.h
189*/
190typedef struct maple_frame {
191 /** \brief Send queue handle. NOT A FUNCTION! */
192 TAILQ_ENTRY(maple_frame) frameq;
193
194 int cmd; /**< \brief Command (see \ref maple_cmds) */
195 int dst_port; /**< \brief Destination port */
196 int dst_unit; /**< \brief Destination unit */
197 int length; /**< \brief Data transfer length in 32-bit words */
198 volatile int state; /**< \brief Has this frame been sent / responded to? */
199 volatile int queued; /**< \brief Are we on the queue? */
200
201 void *send_buf; /**< \brief The data which will be sent (if any) */
202 uint8 *recv_buf; /**< \brief Points into recv_buf_arr, but 32-byte aligned */
203
204 struct maple_device *dev; /**< \brief Does this belong to a device? */
205
206 void (*callback)(struct maple_state_str *, struct maple_frame *); /**< \brief Response callback */
207
208#if MAPLE_DMA_DEBUG
209 uint8 recv_buf_arr[1024 + 1024 + 32]; /**< \brief Response receive area */
210#else
211 uint8 recv_buf_arr[1024 + 32]; /**< \brief Response receive area */
212#endif
214
215/** \defgroup maple_frame_states Frame States
216 \brief States for a maple frame
217 \ingroup maple
218 @{
219*/
220#define MAPLE_FRAME_VACANT 0 /**< \brief Ready to be used */
221#define MAPLE_FRAME_UNSENT 1 /**< \brief Ready to be sent */
222#define MAPLE_FRAME_SENT 2 /**< \brief Frame has been sent, but no response yet */
223#define MAPLE_FRAME_RESPONDED 3 /**< \brief Frame has a response */
224/** @} */
225
226/** \brief Maple device info structure.
227 \ingroup maple
228
229 This structure is used by the hardware to deliver the response to the device
230 info request.
231
232 \note product_name and product_license are not guaranteed to be NULL terminated.
233
234 \headerfile dc/maple.h
235*/
236typedef struct maple_devinfo {
237 uint32 functions; /**< \brief Function codes supported */
238 uint32 function_data[3]; /**< \brief Additional data per function */
239 uint8 area_code; /**< \brief Region code */
240 uint8 connector_direction; /**< \brief 0: UP (most controllers), 1: DOWN (lightgun, microphones) */
241 char product_name[30]; /**< \brief Name of device */
242 char product_license[60]; /**< \brief License statement */
243 uint16 standby_power; /**< \brief Power consumption (standby) */
244 uint16 max_power; /**< \brief Power consumption (max) */
246
247/** \brief Maple response frame structure.
248 \ingroup maple
249
250 This structure is used to deliver the actual response to a request placed.
251 The data field is where all the interesting stuff will be.
252
253 \headerfile dc/maple.h
254*/
255typedef struct maple_response {
256 int8 response; /**< \brief Response */
257 uint8 dst_addr; /**< \brief Destination address */
258 uint8 src_addr; /**< \brief Source address */
259 uint8 data_len; /**< \brief Data length (in 32-bit words) */
260 uint8 data[]; /**< \brief Data (if any) */
262
263/** \brief One maple device.
264 \ingroup maple
265
266 Note that we duplicate the port/unit info which is normally somewhat
267 implicit so that we can pass around a pointer to a particular device struct.
268
269 \headerfile dc/maple.h
270*/
271typedef struct maple_device {
272 /* Public */
273 bool valid; /**< \brief Is this a valid device? */
274 int port; /**< \brief Maple bus port connected to */
275 int unit; /**< \brief Unit number, off of the port */
276 maple_devinfo_t info; /**< \brief Device info struct */
277
278 /* Private */
279 maple_frame_t frame; /**< \brief One rx/tx frame */
280 struct maple_driver *drv; /**< \brief Driver which handles this device */
281
282 uint8 probe_mask; /**< \brief Mask of sub-devices left to probe */
283 uint8 dev_mask; /**< \brief Device-present mask for unit 0's */
284
285 volatile uint8 status_valid; /**< \brief Have we got our first status update? */
286
287 void *status; /**< \brief Status buffer (for pollable devices) */
289
290#define MAPLE_PORT_COUNT 4 /**< \brief Number of ports on the bus */
291#define MAPLE_UNIT_COUNT 6 /**< \brief Max number of units per port */
292
293/** \brief Internal representation of a Maple port.
294 \ingroup maple
295
296 Each maple port can contain up to 6 devices, the first one of which is
297 always the port itself.
298
299 \headerfile dc/maple.h
300*/
301typedef struct maple_port {
302 int port; /**< \brief Port ID */
303 maple_device_t *units[MAPLE_UNIT_COUNT]; /**< \brief Pointers to active units */
305
306/** \brief A maple device driver.
307 \ingroup maple
308
309 Anything which is added to this list is capable of handling one or more
310 maple device types. When a device of the given type is connected (includes
311 startup "connection"), the driver is invoked. This same process happens for
312 disconnection, response receipt, and on a periodic interval (for normal
313 updates).
314
315 \headerfile dc/maple.h
316*/
317typedef struct maple_driver {
318 /** \brief Driver list handle. NOT A FUNCTION! */
319 LIST_ENTRY(maple_driver) drv_list;
320
321 uint32 functions; /**< \brief One or more MAPLE_FUNCs ORed together */
322 const char *name; /**< \brief The driver name */
323
324 size_t status_size;/**< \brief The size of the status buffer */
325
326 /* Callbacks, to be filled in by the driver */
327
328 /** \brief Periodic polling callback.
329
330 This callback will be called to update the status of connected devices
331 periodically.
332
333 \param drv This structure for the driver.
334 */
335 void (*periodic)(struct maple_driver *drv);
336
337 /** \brief Device attached callback.
338
339 This callback will be called when a new device of this driver is
340 connected to the system.
341
342 \param drv This structure for the driver.
343 \param dev The device that was connected.
344 \return 0 on success, <0 on error.
345 */
346 int (*attach)(struct maple_driver *drv, maple_device_t *dev);
347
348 /** \brief Device detached callback.
349
350 This callback will be called when a device of this driver is disconnected
351 from the system.
352
353 \param drv This structure for the driver.
354 \param dev The device that was detached.
355 */
356 void (*detach)(struct maple_driver *drv, maple_device_t *dev);
357
358 /** \brief User-specified device attached callback.
359
360 This callback will be called when a new device of this driver is
361 connected to the system. It should be set by applications using
362 maple_attach_callback().
363
364 \param dev The device that was connected.
365 \return 0 on success, <0 on error.
366 */
367 void (*user_attach)(maple_device_t *dev);
368
369 /** \brief User-specified device detached callback.
370
371 This callback will be called when a new device of this driver is
372 connected to the system. It should be set by applications using
373 maple_detach_callback().
374
375 \param dev The device that was connected.
376 \return 0 on success, <0 on error.
377 */
378 void (*user_detach)(maple_device_t *dev);
380
381/** \brief Maple state structure.
382 \ingroup maple
383
384 We put everything in here to keep from polluting the global namespace too
385 much.
386
387 \headerfile dc/maple.h
388*/
389typedef struct maple_state_str {
390 /** \brief Maple device driver list. Do not manipulate directly! */
391 struct maple_driver_list driver_list;
392
393 /** \brief Maple frame submission queue. Do not manipulate directly! */
394 struct maple_frame_queue frame_queue;
395
396 /** \brief Maple device info structure */
398
399 /** \brief DMA interrupt counter */
400 volatile int dma_cntr;
401
402 /** \brief VBlank interrupt counter */
403 volatile int vbl_cntr;
404
405 /** \brief DMA send buffer */
407
408 /** \brief Is a DMA running now? */
409 volatile int dma_in_progress;
410
411 /** \brief Next port that will be auto-detected */
413
414 /** \brief Mask of ports that completed the initial scan */
416
417 /** \brief Our vblank handler handle */
419
420 /** \brief The port to read for lightgun status, if any. */
422
423 /** \brief The horizontal position of the lightgun signal. */
424 int gun_x;
425
426 /** \brief The vertical position of the lightgun signal. */
427 int gun_y;
429
430/** \brief Maple DMA buffer size.
431 \ingroup maple
432
433 Increase if you do a _LOT_ of maple stuff on every periodic interrupt.
434*/
435#define MAPLE_DMA_SIZE 16384
436
437/* Maple memory read/write functions; these are just hooks in case
438 we need to do something else later */
439/** \brief Maple memory read macro.
440 \ingroup maple
441 */
442#define maple_read(A) ( *((vuint32*)(A)) )
443
444/** \brief Maple memory write macro.
445 \ingroup maple
446 */
447#define maple_write(A, V) ( *((vuint32*)(A)) = (V) )
448
449/** \defgroup maple_func_rvs Return Values
450 \brief Return codes from maple access functions
451 \ingroup maple
452 @{
453*/
454#define MAPLE_EOK 0 /**< \brief No error */
455#define MAPLE_EFAIL -1 /**< \brief Command failed */
456#define MAPLE_EAGAIN -2 /**< \brief Try again later */
457#define MAPLE_EINVALID -3 /**< \brief Invalid command */
458#define MAPLE_ENOTSUPP -4 /**< \brief Command not supported by device */
459#define MAPLE_ETIMEOUT -5 /**< \brief Command timed out */
460/** @} */
461
462/**************************************************************************/
463/* maple_globals.c */
464
465/** \cond Global state info.
466
467 Do not manipulate this state yourself, as it will likely break things if you
468 do so.
469*/
470extern maple_state_t maple_state;
471/** \endcond */
472
473/**************************************************************************/
474/* maple_utils.c */
475
476/** \brief Enable the Maple bus.
477 \ingroup maple
478
479 This will be done for you automatically at init time, and there's probably
480 not many reasons to be doing this during runtime.
481*/
483
484/** \brief Disable the Maple bus.
485 \ingroup maple
486
487 There's really not many good reasons to be mucking with this at runtime.
488*/
490
491/** \brief Start a Maple DMA.
492 \ingroup maple
493
494 This stuff will all be handled internally, so there's probably no reason to
495 be doing this yourself.
496*/
498
499/** \brief Stop a Maple DMA.
500 \ingroup maple
501
502 This stuff will all be handled internally, so there's probably no reason to
503 be doing this yourself.
504*/
505void maple_dma_stop(void);
506
507/** \brief Is a Maple DMA in progress?
508 \ingroup maple
509
510 \return Non-zero if a DMA is in progress.
511*/
513
514/** \brief Set the Maple DMA address.
515 \ingroup maple
516
517 Once again, you should not muck around with this in your programs.
518*/
519void maple_dma_addr(void *ptr);
520
521/** \brief Return a "maple address" for a port, unit pair.
522 \ingroup maple
523
524 \param port The port to build the address for.
525 \param unit The unit to build the address for.
526 \return The Maple address of the pair.
527*/
528uint8 maple_addr(int port, int unit);
529
530/** \brief Decompose a "maple address" into a port, unit pair.
531 \ingroup maple
532
533 \warning
534 This function will not work with multi-cast addresses!
535
536 \param addr The input address.
537 \param port Output space for the port of the address.
538 \param unit Output space for the unit of the address.
539*/
540void maple_raddr(uint8 addr, int * port, int * unit);
541
542/** \brief Return a string with the capabilities of a given function code.
543 \ingroup maple
544
545 This function is not re-entrant, and thus NOT THREAD SAFE.
546
547 \param functions The list of function codes.
548 \return A string containing the capabilities.
549*/
550const char * maple_pcaps(uint32 functions);
551
552/** \brief Return a string representing the maple response code.
553 \ingroup maple
554
555 \param response The response code returned from the function.
556 \return A string containing a textual representation of the
557 response code.
558*/
559const char * maple_perror(int response);
560
561/** \brief Determine if a given device is valid.
562 \ingroup maple
563
564 \param p The port to check.
565 \param u The unit to check.
566 \return Non-zero if the device is valid.
567*/
568int maple_dev_valid(int p, int u);
569
570/** \brief Enable light gun mode for this frame.
571 \ingroup maple
572
573 This function enables light gun processing for the current frame of data.
574 Light gun mode will automatically be disabled when the data comes back for
575 this frame.
576
577 \param port The port to enable light gun mode on.
578 \return MAPLE_EOK on success, MAPLE_EFAIL on error.
579*/
580int maple_gun_enable(int port);
581
582/** \brief Disable light gun mode.
583 \ingroup maple
584
585 There is probably very little reason to call this function. Light gun mode
586 is ordinarily disabled and is automatically disabled after the data has been
587 read from the device. The only reason to call this function is if you call
588 the maple_gun_enable() function, and then change your mind during the same
589 frame.
590*/
592
593/** \brief Read the light gun position values.
594 \ingroup maple
595
596 This function fetches the gun position values from the video hardware and
597 returns them via the parameters. These values are not normalized before
598 returning.
599
600 \param x Storage for the horizontal position of the gun.
601 \param y Storage for the vertical position of the gun.
602
603 \note The values returned from this function are the raw H and V counter
604 values from the video hardware where the gun registered its
605 position. The values, however, need a bit of massaging before they
606 correspond nicely to screen values. The y value is particularly odd
607 in interlaced modes due to the fact that you really have half as
608 many physical lines on the screen as you might expect.
609*/
610void maple_gun_read_pos(int *x, int *y);
611
612#if MAPLE_DMA_DEBUG
613/* Debugging help */
614
615/** \brief Setup a sentinel for debugging DMA issues.
616 \ingroup maple
617
618 \param buffer The buffer to add the sentinel to.
619 \param bufsize The size of the data in the buffer.
620*/
621void maple_sentinel_setup(void * buffer, int bufsize);
622
623/** \brief Verify the presence of the sentine.
624 \ingroup maple
625
626 \param bufname A string to recognize the buffer by.
627 \param buffer The buffer to check.
628 \param bufsize The size of the buffer.
629*/
630void maple_sentinel_verify(const char * bufname, void * buffer, int bufsize);
631#endif
632
633/**************************************************************************/
634/* maple_queue.c */
635
636/** \brief Send all queued frames.
637 \ingroup maple
638 */
640
641/** \brief Submit a frame for queueing.
642 \ingroup maple
643
644 This will generally be called inside the periodic interrupt; however, if you
645 need to do something asynchronously (e.g., VMU access) then it might cause
646 some problems. In this case, the function will automatically do locking by
647 disabling interrupts temporarily. In any case, the callback will be done
648 inside an IRQ context.
649
650 \param frame The frame to queue up.
651 \retval 0 On success.
652 \retval -1 If the frame is already queued.
653*/
655
656/** \brief Remove a used frame from the queue.
657 \ingroup maple
658
659 This will be done automatically when the frame is consumed.
660
661 \param frame The frame to remove from the queue.
662 \retval 0 On success.
663 \retval -1 If the frame is not queued.
664*/
666
667/** \brief Initialize a new frame to prepare it to be placed on the queue.
668 \ingroup maple
669
670 You should call this before you fill in the frame data.
671
672 \param frame The frame to initialize.
673*/
675
676/** \brief Lock a frame so that someone else can't use it in the mean time.
677 \ingroup maple
678
679 \retval 0 On success.
680 \retval -1 If the frame is already locked.
681*/
683
684/** \brief Unlock a frame.
685 \ingroup maple
686 */
688
689/**************************************************************************/
690/* maple_driver.c */
691
692/** \brief Register a maple device driver.
693 \ingroup maple
694
695 This should be done before calling maple_init().
696
697 \retval 0 On success (no error conditions defined).
698*/
700
701/** \brief Unregister a maple device driver.
702 \ingroup maple
703
704 \retval 0 On success (no error conditions defined).
705*/
707
708/** \brief Attach a maple device to a driver, if possible.
709 \ingroup maple
710
711 \param det The detection frame.
712 \retval 1 Couldn't allocate buffers.
713 \retval 0 On success.
714 \retval -1 If no driver is available.
715*/
717
718/** \brief Detach an attached maple device.
719 \ingroup maple
720
721 \param p The port of the device to detach.
722 \param u The unit of the device to detach.
723 \retval 0 On success.
724 \retval -1 If the device wasn't valid.
725*/
726int maple_driver_detach(int p, int u);
727
728/** \brief For each device which the given driver controls, call the callback.
729 \ingroup maple
730
731 \param drv The driver to loop through devices of.
732 \param callback The function to call. The parameter is the device
733 that it is being called on. It should return 0 on
734 success, and <0 on failure.
735 \retval 0 On success.
736 \retval -1 If any callbacks return <0.
737*/
739
740/** \brief Maple attach callback type.
741 \ingroup maple
742
743 Functions of this type can be set with maple_attach_callback() to respond
744 automatically to the attachment of a maple device that supports specified
745 functions.
746*/
748
749/** \brief Set an automatic maple attach callback.
750 \ingroup maple
751
752 This function sets a callback function to be called when the specified
753 maple device that supports functions has been attached.
754
755 \param functions The functions maple device must support. Set to
756 0 to support all maple devices.
757 \param cb The callback to call when the maple is attached.
758*/
760
761/** \brief Maple detach callback type.
762 \ingroup maple
763
764 Functions of this type can be set with maple_detach_callback() to respond
765 automatically to the detachment of a maple device that supports specified
766 functions.
767*/
769
770/** \brief Set an automatic maple detach callback.
771 \ingroup maple
772
773 This function sets a callback function to be called when the specified
774 maple device that supports functions has been detached.
775
776 \param functions The functions maple device must support. Set to
777 0 to support all maple devices.
778 \param cb The callback to call when the maple is detached.
779*/
781
782/**************************************************************************/
783/* maple_irq.c */
784
785/** \brief Called on every VBL (~60fps).
786 \ingroup maple
787
788 \param code The ASIC event code.
789 \param data The user pointer associated with this callback.
790*/
791void maple_vbl_irq_hnd(uint32 code, void *data);
792
793/** \brief Called after a Maple DMA send / receive pair completes.
794 \ingroup maple
795
796 \param code The ASIC event code.
797 \param data The user pointer associated with this callback.
798*/
799void maple_dma_irq_hnd(uint32 code, void *data);
800
801/**************************************************************************/
802/* maple_enum.c */
803
804/** \brief Return the number of connected devices.
805 \ingroup maple
806
807 \return The number of devices connected.
808*/
810
811/** \brief Get a raw device info struct for the given device.
812 \ingroup maple
813
814 \param p The port to look up.
815 \param u The unit to look up.
816 \return The device at that address, or NULL if no device is
817 there.
818*/
820
821/** \brief Get the Nth device of the requested type (where N is zero-indexed).
822 \ingroup maple
823
824 \param n The index to look up.
825 \param func The function code to look for.
826 \return The device found, if any. NULL otherwise.
827*/
829
830/** \brief Return the Nth device that is of the requested type and supports the
831 list of capabilities given.
832 \ingroup maple
833
834 Note, this only currently makes sense for controllers, since some devices
835 don't necessarily use the function data in the same manner that controllers
836 do (and controllers are the only devices where we have a list of what all
837 the bits mean at the moment).
838
839 \param n The index to look up.
840 \param func The function code to look for.
841 \param cap Capabilities bits to look for.
842 \return The device found, if any. NULL otherwise.
843*/
845
846/** \brief Get the status struct for the requested maple device.
847 \ingroup maple
848
849 This function will wait until the status is valid before returning.
850 You should cast to the appropriate type you're expecting.
851
852 \param dev The device to look up.
853 \return The device's status.
854*/
856
857/**************************************************************************/
858/* maple_init.c */
859
860/** \brief Initialize Maple.
861 \ingroup maple
862 */
863void maple_init(void);
864
865/** \brief Shutdown Maple.
866 \ingroup maple
867 */
868void maple_shutdown(void);
869
870/** \brief Wait for the initial bus scan to complete.
871 \ingroup maple
872 */
874
875/**************************************************************************/
876/* Convenience macros */
877
878/* A "foreach" loop to scan all maple devices of a given type. It is used
879 like this:
880
881 MAPLE_FOREACH_BEGIN(MAPLE_FUNC_CONTROLLER, cont_state_t, st)
882 if(st->buttons & CONT_START)
883 return -1;
884 MAPLE_FOREACH_END()
885
886 The peripheral index can be obtained with __i, and the raw device struct
887 with __dev. The code inside the loop is guaranteed to be inside a block
888 (i.e., { code })
889 */
890
891/** \brief Begin a foreach loop over Maple devices.
892 \ingroup maple
893
894 This macro (along with the MAPLE_FOREACH_END() one) implements a simple
895 foreach-style loop over the given type of devices. Essentially, it grabs the
896 status of the device, and leaves it to you to figure out what to do with it.
897
898 The most common use of this would be to look for input on any controller.
899
900 \param TYPE The function code of devices to look at.
901 \param VARTYPE The type to cast the return value of
902 maple_dev_status() to.
903 \param VAR The name of the result of maple_dev_status().
904*/
905#define MAPLE_FOREACH_BEGIN(TYPE, VARTYPE, VAR) \
906 do { \
907 maple_device_t * __dev; \
908 VARTYPE * VAR; \
909 int __i; \
910 \
911 __i = 0; \
912 while( (__dev = maple_enum_type(__i, TYPE)) ) { \
913 VAR = (VARTYPE *)maple_dev_status(__dev); \
914 do {
915
916/** \brief End a foreach loop over Maple devices.
917 \ingroup maple
918
919 Each MAPLE_FOREACH_BEGIN() must be paired with one of these after the loop
920 body.
921*/
922#define MAPLE_FOREACH_END() \
923 } while(0); \
924 __i++; \
925 } \
926 } while(0);
927
928__END_DECLS
929
930#endif /* __DC_MAPLE_H */
int maple_driver_unreg(maple_driver_t *driver)
Unregister a maple device driver.
int maple_driver_attach(maple_frame_t *det)
Attach a maple device to a driver, if possible.
void(* maple_detach_callback_t)(maple_device_t *dev)
Maple detach callback type.
Definition maple.h:768
int maple_gun_enable(int port)
Enable light gun mode for this frame.
void maple_dma_start(void)
Start a Maple DMA.
void maple_dma_addr(void *ptr)
Set the Maple DMA address.
void maple_gun_read_pos(int *x, int *y)
Read the light gun position values.
void maple_dma_irq_hnd(uint32 code, void *data)
Called after a Maple DMA send / receive pair completes.
int maple_driver_detach(int p, int u)
Detach an attached maple device.
const char * maple_perror(int response)
Return a string representing the maple response code.
void maple_wait_scan(void)
Wait for the initial bus scan to complete.
void maple_frame_init(maple_frame_t *frame)
Initialize a new frame to prepare it to be placed on the queue.
void maple_shutdown(void)
Shutdown Maple.
int maple_frame_lock(maple_frame_t *frame)
Lock a frame so that someone else can't use it in the mean time.
int maple_driver_reg(maple_driver_t *driver)
Register a maple device driver.
maple_device_t * maple_enum_type_ex(int n, uint32 func, uint32 cap)
Return the Nth device that is of the requested type and supports the list of capabilities given.
int maple_dev_valid(int p, int u)
Determine if a given device is valid.
int maple_enum_count(void)
Return the number of connected devices.
void maple_init(void)
Initialize Maple.
void maple_raddr(uint8 addr, int *port, int *unit)
Decompose a "maple address" into a port, unit pair.
maple_device_t * maple_enum_type(int n, uint32 func)
Get the Nth device of the requested type (where N is zero-indexed).
void maple_attach_callback(uint32 functions, maple_attach_callback_t cb)
Set an automatic maple attach callback.
void(* maple_attach_callback_t)(maple_device_t *dev)
Maple attach callback type.
Definition maple.h:747
void maple_gun_disable(void)
Disable light gun mode.
void maple_bus_disable(void)
Disable the Maple bus.
int maple_queue_frame(maple_frame_t *frame)
Submit a frame for queueing.
void maple_dma_stop(void)
Stop a Maple DMA.
const char * maple_pcaps(uint32 functions)
Return a string with the capabilities of a given function code.
void maple_detach_callback(uint32 functions, maple_detach_callback_t cb)
Set an automatic maple detach callback.
void maple_frame_unlock(maple_frame_t *frame)
Unlock a frame.
void maple_bus_enable(void)
Enable the Maple bus.
void maple_queue_flush(void)
Send all queued frames.
maple_device_t * maple_enum_dev(int p, int u)
Get a raw device info struct for the given device.
void maple_vbl_irq_hnd(uint32 code, void *data)
Called on every VBL (~60fps).
int maple_dma_in_progress(void)
Is a Maple DMA in progress?
uint8 maple_addr(int port, int unit)
Return a "maple address" for a port, unit pair.
void * maple_dev_status(maple_device_t *dev)
Get the status struct for the requested maple device.
int maple_driver_foreach(maple_driver_t *drv, int(*callback)(maple_device_t *))
For each device which the given driver controls, call the callback.
int maple_queue_remove(maple_frame_t *frame)
Remove a used frame from the queue.
typedef LIST_HEAD(nmmgr_list, nmmgr_handler) nmmgr_list_t
Name handler list type.
unsigned short uint16
16-bit unsigned integer
Definition types.h:34
unsigned long uint32
32-bit unsigned integer
Definition types.h:33
unsigned char uint8
8-bit unsigned integer
Definition types.h:35
char int8
8-bit signed integer
Definition types.h:39
#define MAPLE_PORT_COUNT
Number of ports on the bus.
Definition maple.h:290
#define MAPLE_UNIT_COUNT
Max number of units per port.
Definition maple.h:291
One maple device.
Definition maple.h:271
volatile uint8 status_valid
Have we got our first status update?
Definition maple.h:285
void * status
Status buffer (for pollable devices)
Definition maple.h:287
uint8 dev_mask
Device-present mask for unit 0's.
Definition maple.h:283
int unit
Unit number, off of the port.
Definition maple.h:275
maple_devinfo_t info
Device info struct.
Definition maple.h:276
maple_frame_t frame
One rx/tx frame.
Definition maple.h:279
int port
Maple bus port connected to.
Definition maple.h:274
uint8 probe_mask
Mask of sub-devices left to probe.
Definition maple.h:282
bool valid
Is this a valid device?
Definition maple.h:273
struct maple_driver * drv
Driver which handles this device.
Definition maple.h:280
Maple device info structure.
Definition maple.h:236
uint8 connector_direction
0: UP (most controllers), 1: DOWN (lightgun, microphones)
Definition maple.h:240
uint8 area_code
Region code.
Definition maple.h:239
uint16 max_power
Power consumption (max)
Definition maple.h:244
uint32 functions
Function codes supported.
Definition maple.h:237
uint16 standby_power
Power consumption (standby)
Definition maple.h:243
A maple device driver.
Definition maple.h:317
LIST_ENTRY(maple_driver) drv_list
Driver list handle.
const char * name
The driver name.
Definition maple.h:322
uint32 functions
One or more MAPLE_FUNCs ORed together.
Definition maple.h:321
size_t status_size
The size of the status buffer.
Definition maple.h:324
Maple frame to be queued for transport.
Definition maple.h:190
volatile int queued
Are we on the queue?
Definition maple.h:199
int cmd
Command (see Commands and Responses)
Definition maple.h:194
int dst_port
Destination port.
Definition maple.h:195
struct maple_device * dev
Does this belong to a device?
Definition maple.h:204
uint8 * recv_buf
Points into recv_buf_arr, but 32-byte aligned.
Definition maple.h:202
void * send_buf
The data which will be sent (if any)
Definition maple.h:201
int dst_unit
Destination unit.
Definition maple.h:196
TAILQ_ENTRY(maple_frame) frameq
Send queue handle.
int length
Data transfer length in 32-bit words.
Definition maple.h:197
volatile int state
Has this frame been sent / responded to?
Definition maple.h:198
Internal representation of a Maple port.
Definition maple.h:301
int port
Port ID.
Definition maple.h:302
Maple response frame structure.
Definition maple.h:255
uint8 data_len
Data length (in 32-bit words)
Definition maple.h:259
int8 response
Response.
Definition maple.h:256
uint8 dst_addr
Destination address.
Definition maple.h:257
uint8 src_addr
Source address.
Definition maple.h:258
Maple state structure.
Definition maple.h:389
uint8 * dma_buffer
DMA send buffer.
Definition maple.h:406
volatile int dma_in_progress
Is a DMA running now?
Definition maple.h:409
int vbl_handle
Our vblank handler handle.
Definition maple.h:418
volatile uint8 scan_ready_mask
Mask of ports that completed the initial scan.
Definition maple.h:415
volatile int dma_cntr
DMA interrupt counter.
Definition maple.h:400
volatile int vbl_cntr
VBlank interrupt counter.
Definition maple.h:403
int gun_x
The horizontal position of the lightgun signal.
Definition maple.h:424
uint8 detect_port_next
Next port that will be auto-detected.
Definition maple.h:412
int gun_y
The vertical position of the lightgun signal.
Definition maple.h:427
int gun_port
The port to read for lightgun status, if any.
Definition maple.h:421
Common integer types.