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);
358
359/** \brief Maple state structure.
360 \ingroup maple
361
362 We put everything in here to keep from polluting the global namespace too
363 much.
364
365 \headerfile dc/maple.h
366*/
367typedef struct maple_state_str {
368 /** \brief Maple device driver list. Do not manipulate directly! */
369 struct maple_driver_list driver_list;
370
371 /** \brief Maple frame submission queue. Do not manipulate directly! */
372 struct maple_frame_queue frame_queue;
373
374 /** \brief Maple device info structure */
376
377 /** \brief DMA interrupt counter */
378 volatile int dma_cntr;
379
380 /** \brief VBlank interrupt counter */
381 volatile int vbl_cntr;
382
383 /** \brief DMA send buffer */
385
386 /** \brief Is a DMA running now? */
387 volatile int dma_in_progress;
388
389 /** \brief Next port that will be auto-detected */
391
392 /** \brief Mask of ports that completed the initial scan */
394
395 /** \brief Our vblank handler handle */
397
398 /** \brief The port to read for lightgun status, if any. */
400
401 /** \brief The horizontal position of the lightgun signal. */
402 int gun_x;
403
404 /** \brief The vertical position of the lightgun signal. */
405 int gun_y;
407
408/** \brief Maple DMA buffer size.
409 \ingroup maple
410
411 Increase if you do a _LOT_ of maple stuff on every periodic interrupt.
412*/
413#define MAPLE_DMA_SIZE 16384
414
415/* Maple memory read/write functions; these are just hooks in case
416 we need to do something else later */
417/** \brief Maple memory read macro.
418 \ingroup maple
419 */
420#define maple_read(A) ( *((vuint32*)(A)) )
421
422/** \brief Maple memory write macro.
423 \ingroup maple
424 */
425#define maple_write(A, V) ( *((vuint32*)(A)) = (V) )
426
427/** \defgroup maple_func_rvs Return Values
428 \brief Return codes from maple access functions
429 \ingroup maple
430 @{
431*/
432#define MAPLE_EOK 0 /**< \brief No error */
433#define MAPLE_EFAIL -1 /**< \brief Command failed */
434#define MAPLE_EAGAIN -2 /**< \brief Try again later */
435#define MAPLE_EINVALID -3 /**< \brief Invalid command */
436#define MAPLE_ENOTSUPP -4 /**< \brief Command not supported by device */
437#define MAPLE_ETIMEOUT -5 /**< \brief Command timed out */
438/** @} */
439
440/**************************************************************************/
441/* maple_globals.c */
442
443/** \cond Global state info.
444
445 Do not manipulate this state yourself, as it will likely break things if you
446 do so.
447*/
448extern maple_state_t maple_state;
449/** \endcond */
450
451/**************************************************************************/
452/* maple_utils.c */
453
454/** \brief Enable the Maple bus.
455 \ingroup maple
456
457 This will be done for you automatically at init time, and there's probably
458 not many reasons to be doing this during runtime.
459*/
461
462/** \brief Disable the Maple bus.
463 \ingroup maple
464
465 There's really not many good reasons to be mucking with this at runtime.
466*/
468
469/** \brief Start a Maple DMA.
470 \ingroup maple
471
472 This stuff will all be handled internally, so there's probably no reason to
473 be doing this yourself.
474*/
476
477/** \brief Stop a Maple DMA.
478 \ingroup maple
479
480 This stuff will all be handled internally, so there's probably no reason to
481 be doing this yourself.
482*/
483void maple_dma_stop(void);
484
485/** \brief Is a Maple DMA in progress?
486 \ingroup maple
487
488 \return Non-zero if a DMA is in progress.
489*/
491
492/** \brief Set the Maple DMA address.
493 \ingroup maple
494
495 Once again, you should not muck around with this in your programs.
496*/
497void maple_dma_addr(void *ptr);
498
499/** \brief Return a "maple address" for a port, unit pair.
500 \ingroup maple
501
502 \param port The port to build the address for.
503 \param unit The unit to build the address for.
504 \return The Maple address of the pair.
505*/
506uint8 maple_addr(int port, int unit);
507
508/** \brief Decompose a "maple address" into a port, unit pair.
509 \ingroup maple
510
511 \warning
512 This function will not work with multi-cast addresses!
513
514 \param addr The input address.
515 \param port Output space for the port of the address.
516 \param unit Output space for the unit of the address.
517*/
518void maple_raddr(uint8 addr, int * port, int * unit);
519
520/** \brief Return a string with the capabilities of a given function code.
521 \ingroup maple
522
523 This function is not re-entrant, and thus NOT THREAD SAFE.
524
525 \param functions The list of function codes.
526 \return A string containing the capabilities.
527*/
528const char * maple_pcaps(uint32 functions);
529
530/** \brief Return a string representing the maple response code.
531 \ingroup maple
532
533 \param response The response code returned from the function.
534 \return A string containing a textual representation of the
535 response code.
536*/
537const char * maple_perror(int response);
538
539/** \brief Determine if a given device is valid.
540 \ingroup maple
541
542 \param p The port to check.
543 \param u The unit to check.
544 \return Non-zero if the device is valid.
545*/
546int maple_dev_valid(int p, int u);
547
548/** \brief Enable light gun mode for this frame.
549 \ingroup maple
550
551 This function enables light gun processing for the current frame of data.
552 Light gun mode will automatically be disabled when the data comes back for
553 this frame.
554
555 \param port The port to enable light gun mode on.
556 \return MAPLE_EOK on success, MAPLE_EFAIL on error.
557*/
558int maple_gun_enable(int port);
559
560/** \brief Disable light gun mode.
561 \ingroup maple
562
563 There is probably very little reason to call this function. Light gun mode
564 is ordinarily disabled and is automatically disabled after the data has been
565 read from the device. The only reason to call this function is if you call
566 the maple_gun_enable() function, and then change your mind during the same
567 frame.
568*/
570
571/** \brief Read the light gun position values.
572 \ingroup maple
573
574 This function fetches the gun position values from the video hardware and
575 returns them via the parameters. These values are not normalized before
576 returning.
577
578 \param x Storage for the horizontal position of the gun.
579 \param y Storage for the vertical position of the gun.
580
581 \note The values returned from this function are the raw H and V counter
582 values from the video hardware where the gun registered its
583 position. The values, however, need a bit of massaging before they
584 correspond nicely to screen values. The y value is particularly odd
585 in interlaced modes due to the fact that you really have half as
586 many physical lines on the screen as you might expect.
587*/
588void maple_gun_read_pos(int *x, int *y);
589
590#if MAPLE_DMA_DEBUG
591/* Debugging help */
592
593/** \brief Setup a sentinel for debugging DMA issues.
594 \ingroup maple
595
596 \param buffer The buffer to add the sentinel to.
597 \param bufsize The size of the data in the buffer.
598*/
599void maple_sentinel_setup(void * buffer, int bufsize);
600
601/** \brief Verify the presence of the sentine.
602 \ingroup maple
603
604 \param bufname A string to recognize the buffer by.
605 \param buffer The buffer to check.
606 \param bufsize The size of the buffer.
607*/
608void maple_sentinel_verify(const char * bufname, void * buffer, int bufsize);
609#endif
610
611/**************************************************************************/
612/* maple_queue.c */
613
614/** \brief Send all queued frames.
615 \ingroup maple
616 */
618
619/** \brief Submit a frame for queueing.
620 \ingroup maple
621
622 This will generally be called inside the periodic interrupt; however, if you
623 need to do something asynchronously (e.g., VMU access) then it might cause
624 some problems. In this case, the function will automatically do locking by
625 disabling interrupts temporarily. In any case, the callback will be done
626 inside an IRQ context.
627
628 \param frame The frame to queue up.
629 \retval 0 On success.
630 \retval -1 If the frame is already queued.
631*/
633
634/** \brief Remove a used frame from the queue.
635 \ingroup maple
636
637 This will be done automatically when the frame is consumed.
638
639 \param frame The frame to remove from the queue.
640 \retval 0 On success.
641 \retval -1 If the frame is not queued.
642*/
644
645/** \brief Initialize a new frame to prepare it to be placed on the queue.
646 \ingroup maple
647
648 You should call this before you fill in the frame data.
649
650 \param frame The frame to initialize.
651*/
653
654/** \brief Lock a frame so that someone else can't use it in the mean time.
655 \ingroup maple
656
657 \retval 0 On success.
658 \retval -1 If the frame is already locked.
659*/
661
662/** \brief Unlock a frame.
663 \ingroup maple
664 */
666
667/**************************************************************************/
668/* maple_driver.c */
669
670/** \brief Register a maple device driver.
671 \ingroup maple
672
673 This should be done before calling maple_init().
674
675 \retval 0 On success (no error conditions defined).
676*/
678
679/** \brief Unregister a maple device driver.
680 \ingroup maple
681
682 \retval 0 On success (no error conditions defined).
683*/
685
686/** \brief Attach a maple device to a driver, if possible.
687 \ingroup maple
688
689 \param det The detection frame.
690 \retval 1 Couldn't allocate buffers.
691 \retval 0 On success.
692 \retval -1 If no driver is available.
693*/
695
696/** \brief Detach an attached maple device.
697 \ingroup maple
698
699 \param p The port of the device to detach.
700 \param u The unit of the device to detach.
701 \retval 0 On success.
702 \retval -1 If the device wasn't valid.
703*/
704int maple_driver_detach(int p, int u);
705
706/** \brief For each device which the given driver controls, call the callback.
707 \ingroup maple
708
709 \param drv The driver to loop through devices of.
710 \param callback The function to call. The parameter is the device
711 that it is being called on. It should return 0 on
712 success, and <0 on failure.
713 \retval 0 On success.
714 \retval -1 If any callbacks return <0.
715*/
717
718/** \brief Maple attach callback type.
719 \ingroup maple
720
721 Functions of this type can be set with maple_attach_callback() to respond
722 automatically to the attachment of a maple device that supports specified
723 functions.
724*/
726
727/** \brief Set an automatic maple attach callback.
728 \ingroup maple
729
730 This function sets a callback function to be called when the specified
731 maple device that supports functions has been attached.
732
733 \param functions The functions maple device must support. Set to
734 0 to support all maple devices.
735 \param cb The callback to call when the maple is attached.
736*/
738
739/** \brief Maple detach callback type.
740 \ingroup maple
741
742 Functions of this type can be set with maple_detach_callback() to respond
743 automatically to the detachment of a maple device that supports specified
744 functions.
745*/
747
748/** \brief Set an automatic maple detach callback.
749 \ingroup maple
750
751 This function sets a callback function to be called when the specified
752 maple device that supports functions has been detached.
753
754 \param functions The functions maple device must support. Set to
755 0 to support all maple devices.
756 \param cb The callback to call when the maple is detached.
757*/
759
760/**************************************************************************/
761/* maple_irq.c */
762
763/** \brief Called on every VBL (~60fps).
764 \ingroup maple
765
766 \param code The ASIC event code.
767 \param data The user pointer associated with this callback.
768*/
769void maple_vbl_irq_hnd(uint32 code, void *data);
770
771/** \brief Called after a Maple DMA send / receive pair completes.
772 \ingroup maple
773
774 \param code The ASIC event code.
775 \param data The user pointer associated with this callback.
776*/
777void maple_dma_irq_hnd(uint32 code, void *data);
778
779/**************************************************************************/
780/* maple_enum.c */
781
782/** \brief Return the number of connected devices.
783 \ingroup maple
784
785 \return The number of devices connected.
786*/
788
789/** \brief Get a raw device info struct for the given device.
790 \ingroup maple
791
792 \param p The port to look up.
793 \param u The unit to look up.
794 \return The device at that address, or NULL if no device is
795 there.
796*/
798
799/** \brief Get the Nth device of the requested type (where N is zero-indexed).
800 \ingroup maple
801
802 \param n The index to look up.
803 \param func The function code to look for.
804 \return The device found, if any. NULL otherwise.
805*/
807
808/** \brief Return the Nth device that is of the requested type and supports the
809 list of capabilities given.
810 \ingroup maple
811
812 Note, this only currently makes sense for controllers, since some devices
813 don't necessarily use the function data in the same manner that controllers
814 do (and controllers are the only devices where we have a list of what all
815 the bits mean at the moment).
816
817 \param n The index to look up.
818 \param func The function code to look for.
819 \param cap Capabilities bits to look for.
820 \return The device found, if any. NULL otherwise.
821*/
823
824/** \brief Get the status struct for the requested maple device.
825 \ingroup maple
826
827 This function will wait until the status is valid before returning.
828 You should cast to the appropriate type you're expecting.
829
830 \param dev The device to look up.
831 \return The device's status.
832*/
834
835/**************************************************************************/
836/* maple_init.c */
837
838/** \brief Initialize Maple.
839 \ingroup maple
840 */
841void maple_init(void);
842
843/** \brief Shutdown Maple.
844 \ingroup maple
845 */
846void maple_shutdown(void);
847
848/** \brief Wait for the initial bus scan to complete.
849 \ingroup maple
850 */
852
853/**************************************************************************/
854/* Convenience macros */
855
856/* A "foreach" loop to scan all maple devices of a given type. It is used
857 like this:
858
859 MAPLE_FOREACH_BEGIN(MAPLE_FUNC_CONTROLLER, cont_state_t, st)
860 if(st->buttons & CONT_START)
861 return -1;
862 MAPLE_FOREACH_END()
863
864 The peripheral index can be obtained with __i, and the raw device struct
865 with __dev. The code inside the loop is guaranteed to be inside a block
866 (i.e., { code })
867 */
868
869/** \brief Begin a foreach loop over Maple devices.
870 \ingroup maple
871
872 This macro (along with the MAPLE_FOREACH_END() one) implements a simple
873 foreach-style loop over the given type of devices. Essentially, it grabs the
874 status of the device, and leaves it to you to figure out what to do with it.
875
876 The most common use of this would be to look for input on any controller.
877
878 \param TYPE The function code of devices to look at.
879 \param VARTYPE The type to cast the return value of
880 maple_dev_status() to.
881 \param VAR The name of the result of maple_dev_status().
882*/
883#define MAPLE_FOREACH_BEGIN(TYPE, VARTYPE, VAR) \
884 do { \
885 maple_device_t * __dev; \
886 VARTYPE * VAR; \
887 int __i; \
888 \
889 __i = 0; \
890 while( (__dev = maple_enum_type(__i, TYPE)) ) { \
891 VAR = (VARTYPE *)maple_dev_status(__dev); \
892 do {
893
894/** \brief End a foreach loop over Maple devices.
895 \ingroup maple
896
897 Each MAPLE_FOREACH_BEGIN() must be paired with one of these after the loop
898 body.
899*/
900#define MAPLE_FOREACH_END() \
901 } while(0); \
902 __i++; \
903 } \
904 } while(0);
905
906__END_DECLS
907
908#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:746
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:725
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:367
uint8 * dma_buffer
DMA send buffer.
Definition maple.h:384
volatile int dma_in_progress
Is a DMA running now?
Definition maple.h:387
int vbl_handle
Our vblank handler handle.
Definition maple.h:396
volatile uint8 scan_ready_mask
Mask of ports that completed the initial scan.
Definition maple.h:393
volatile int dma_cntr
DMA interrupt counter.
Definition maple.h:378
volatile int vbl_cntr
VBlank interrupt counter.
Definition maple.h:381
int gun_x
The horizontal position of the lightgun signal.
Definition maple.h:402
uint8 detect_port_next
Next port that will be auto-detected.
Definition maple.h:390
int gun_y
The vertical position of the lightgun signal.
Definition maple.h:405
int gun_port
The port to read for lightgun status, if any.
Definition maple.h:399
Common integer types.