Newer
Older
uwuboot / include / arm11 / hardware / hid.h
#pragma once

/*
 *   This file is part of fastboot 3DS
 *   Copyright (C) 2017 derrek, profi200
 *
 *   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 3 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, see <http://www.gnu.org/licenses/>.
 */

/*
 *  Based on code from https://github.com/smealum/ctrulib
 */

#include "types.h"


#define REG_HID_PAD               (*((vu16*)(IO_MEM_ARM9_ARM11 + 0x46000)) ^ 0xFFFFu)


#define HID_KEY_MASK_ALL          ((1u<<12) - 1)

enum
{
	KEY_A            = (1u<<0),  // A
	KEY_B            = (1u<<1),  // B
	KEY_SELECT       = (1u<<2),  // Select
	KEY_START        = (1u<<3),  // Start
	KEY_DRIGHT       = (1u<<4),  // D-Pad Right
	KEY_DLEFT        = (1u<<5),  // D-Pad Left
	KEY_DUP          = (1u<<6),  // D-Pad Up
	KEY_DDOWN        = (1u<<7),  // D-Pad Down
	KEY_R            = (1u<<8),  // R
	KEY_L            = (1u<<9),  // L
	KEY_X            = (1u<<10), // X
	KEY_Y            = (1u<<11), // Y
	KEY_ZL           = (1u<<14), // ZL (New 3DS only)
	KEY_ZR           = (1u<<15), // ZR (New 3DS only)
	KEY_TOUCH        = (1u<<20), // Touch (Not actually provided by HID)
	KEY_CSTICK_RIGHT = (1u<<24), // C-Stick Right (New 3DS only)
	KEY_CSTICK_LEFT  = (1u<<25), // C-Stick Left (New 3DS only)
	KEY_CSTICK_UP    = (1u<<26), // C-Stick Up (New 3DS only)
	KEY_CSTICK_DOWN  = (1u<<27), // C-Stick Down (New 3DS only)
	KEY_CPAD_RIGHT   = (1u<<28), // Circle Pad Right
	KEY_CPAD_LEFT    = (1u<<29), // Circle Pad Left
	KEY_CPAD_UP      = (1u<<30), // Circle Pad Up
	KEY_CPAD_DOWN    = (1u<<31), // Circle Pad Down

	// Generic catch-all directions
	KEY_UP    = KEY_DUP    | KEY_CPAD_UP,    // D-Pad Up or Circle Pad Up
	KEY_DOWN  = KEY_DDOWN  | KEY_CPAD_DOWN,  // D-Pad Down or Circle Pad Down
	KEY_LEFT  = KEY_DLEFT  | KEY_CPAD_LEFT,  // D-Pad Left or Circle Pad Left
	KEY_RIGHT = KEY_DRIGHT | KEY_CPAD_RIGHT, // D-Pad Right or Circle Pad Right
};

// Extra keys use with hidGetExtraKeys()
enum
{
	KEY_POWER        = (1u<<0),
	KEY_POWER_HELD   = (1u<<1),
	KEY_HOME         = (1u<<2), // Auto clears on release
	KEY_WIFI         = (1u<<3),
	KEY_SHELL        = (1u<<4), // Auto clears on open
	KEY_BAT_CHARGING = (1u<<5), // Auto clears when charging stops
	KEY_VOL_SLIDER   = (1u<<6)
};

typedef struct
{
	u16 x;
	u16 y;
} TouchPos;

typedef struct
{
	s16 x;
	s16 y;
} CpadPos;



void hidInit(void);
void hidScanInput(void);
u32 hidKeysHeld(void);
u32 hidKeysDown(void);
u32 hidKeysUp(void);
//const TouchPos* hidGetTouchPosPtr(void);
//const CpadPos* hidGetCpadPosPtr(void);
u32 hidGetExtraKeys(u32 clearMask);