Skip to content

Added GPIO input support #9

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 52 additions & 1 deletion components/nofrendo-esp32/Kconfig.projbuild
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,61 @@ config SOUND_ENA

config HW_PSX_ENA
bool "Enable PSX controller input"
default y
default n
help
If you connect a PSX/PS2 controller to the following GPIOs, you can control the NES.

config HW_GPIO_ENA
bool "Enable GPIO controller input"
default n

config HW_GPIO_UP
int "Up Control"
depends on HW_GPIO_ENA
range 1 39
default 3

config HW_GPIO_DOWN
int "Down Control"
depends on HW_GPIO_ENA
range 1 39
default 1

config HW_GPIO_RIGHT
int "Right Control"
depends on HW_GPIO_ENA
range 1 39
default 16

config HW_GPIO_LEFT
int "Left Control"
depends on HW_GPIO_ENA
range 1 39
default 17

config HW_GPIO_A
int "A Control"
depends on HW_GPIO_ENA
range 1 39
default 5

config HW_GPIO_B
int "B Control"
depends on HW_GPIO_ENA
range 1 39
default 2

config HW_GPIO_SELECT
int "Select Control"
depends on HW_GPIO_ENA
range 1 39
default 37

config HW_GPIO_START
int "Start Control"
depends on HW_GPIO_ENA
range 1 39
default 38

config HW_PSX_CLK
int "PSX controller CLK GPIO pin"
Expand Down
86 changes: 68 additions & 18 deletions components/nofrendo-esp32/psxcontroller.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,40 @@
#include "sdkconfig.h"
#include "i2c_keyboard.h"

#define DELAY() asm("nop; nop; nop; nop;nop; nop; nop; nop;nop; nop; nop; nop;nop; nop; nop; nop;")
#define bit_joypad1_select 0
#define bit_joypad1_start 3
#define bit_joypad1_up 4
#define bit_joypad1_right 5
#define bit_joypad1_down 6
#define bit_joypad1_left 7
#define bit_soft_reset 12
#define bit_joypad1_a 13
#define bit_joypad1_b 14
#define bit_hard_reset 15

void initGPIO(int gpioNo){
gpio_set_direction(gpioNo, GPIO_MODE_INPUT);
gpio_pulldown_en(gpioNo);
}

#if CONFIG_HW_PSX_ENA || CONFIG_HW_GPIO_ENA

#ifndef CONFIG_HW_GPIO_ENA

#define PSX_CLK CONFIG_HW_PSX_CLK
#define PSX_DAT CONFIG_HW_PSX_DAT
#define PSX_ATT CONFIG_HW_PSX_ATT
#define PSX_CMD CONFIG_HW_PSX_CMD

#define DELAY() asm("nop; nop; nop; nop;nop; nop; nop; nop;nop; nop; nop; nop;nop; nop; nop; nop;")
#else

#define PSX_CLK 14
#define PSX_DAT 27
#define PSX_ATT 16
#define PSX_CMD 2

#if CONFIG_HW_PSX_ENA
#endif

/* Sends and receives a byte from/to the PSX controller using SPI */
static int psxSendRecv(int send) {
Expand Down Expand Up @@ -75,22 +100,58 @@ static void psxDone() {
GPIO_REG_WRITE(GPIO_OUT_W1TS_REG, (1<<PSX_ATT));
}


int psxReadInput() {
int b2b1 = 65535;
#ifndef CONFIG_HW_GPIO_ENA
int b1, b2;

psxSendRecv(0x01); //wake up
psxSendRecv(0x42); //get data
psxSendRecv(0xff); //should return 0x5a
b1=psxSendRecv(0xff); //buttons byte 1
b2=psxSendRecv(0xff); //buttons byte 2
psxDone();
return (b2<<8)|b1;
b2b1 = (b2<<8)|b1;
#else
if (gpio_get_level(CONFIG_HW_GPIO_UP) == 1)
b2b1 -= 1<<bit_joypad1_up;

if (gpio_get_level(CONFIG_HW_GPIO_DOWN) == 1)
b2b1 -= 1<<bit_joypad1_down;

if (gpio_get_level(CONFIG_HW_GPIO_RIGHT) == 1)
b2b1 -= 1<<bit_joypad1_right;

if (gpio_get_level(CONFIG_HW_GPIO_LEFT) == 1)
b2b1 -= 1<<bit_joypad1_left;

if (gpio_get_level(CONFIG_HW_GPIO_SELECT) == 1)
b2b1 -= 1<<bit_joypad1_select;

if (gpio_get_level(CONFIG_HW_GPIO_START) == 1)
b2b1 -= 1<<bit_joypad1_start;

if (gpio_get_level(CONFIG_HW_GPIO_B) == 1)
b2b1 -= 1<<bit_joypad1_b;

if (gpio_get_level(CONFIG_HW_GPIO_A) == 1)
b2b1 -= 1<<bit_joypad1_a;

#endif
return b2b1;
}


void psxcontrollerInit() {
#if CONFIG_HW_GPIO_ENA
initGPIO(CONFIG_HW_GPIO_START);
initGPIO(CONFIG_HW_GPIO_SELECT);
initGPIO(CONFIG_HW_GPIO_UP);
initGPIO(CONFIG_HW_GPIO_DOWN);
initGPIO(CONFIG_HW_GPIO_LEFT);
initGPIO(CONFIG_HW_GPIO_RIGHT);
initGPIO(CONFIG_HW_GPIO_B);
initGPIO(CONFIG_HW_GPIO_A);
#else
volatile int delay;
int t;
gpio_config_t gpioconf[2]={
Expand Down Expand Up @@ -127,23 +188,12 @@ void psxcontrollerInit() {
} else {
printf("PSX controller type 0x%X\n", t);
}
#endif

}


#else


#define bit_joypad1_select 0
#define bit_joypad1_start 3
#define bit_joypad1_up 4
#define bit_joypad1_right 5
#define bit_joypad1_down 6
#define bit_joypad1_left 7
#define bit_soft_reset 12
#define bit_joypad1_a 13
#define bit_joypad1_b 14
#define bit_hard_reset 15

// #define KEY_A_PIN 35
// #define KEY_B_PIN 36
// #define KEY_UP_PIN 13
Expand Down
1 change: 1 addition & 0 deletions components/nofrendo-esp32/psxcontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@

int psxReadInput();
void psxcontrollerInit();
void initGPIO(int gpioNo);

#endif
15 changes: 15 additions & 0 deletions sdkconfig
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,15 @@ CONFIG_HW_LCD_RESET_GPIO=33
CONFIG_HW_LCD_BL_GPIO=32
CONFIG_SOUND_ENA=y
CONFIG_HW_PSX_ENA=
CONFIG_HW_GPIO_ENA=y
CONFIG_HW_GPIO_UP=2
CONFIG_HW_GPIO_DOWN=22
CONFIG_HW_GPIO_RIGHT=5
CONFIG_HW_GPIO_LEFT=21
CONFIG_HW_GPIO_A=16
CONFIG_HW_GPIO_B=17
CONFIG_HW_GPIO_SELECT=39
CONFIG_HW_GPIO_START=37

#
# Partition Table
Expand Down Expand Up @@ -200,6 +209,12 @@ CONFIG_EFUSE_MAX_BLK_LEN=192
# ESP32-specific
#
CONFIG_IDF_TARGET_ESP32=y
CONFIG_ESP32_REV_MIN_0=y
CONFIG_ESP32_REV_MIN_1=
CONFIG_ESP32_REV_MIN_2=
CONFIG_ESP32_REV_MIN_3=
CONFIG_ESP32_REV_MIN=0
CONFIG_ESP32_DPORT_WORKAROUND=y
CONFIG_ESP32_DEFAULT_CPU_FREQ_80=
CONFIG_ESP32_DEFAULT_CPU_FREQ_160=
CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y
Expand Down
16 changes: 15 additions & 1 deletion sdkconfig.old
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ CONFIG_LOG_BOOTLOADER_LEVEL_INFO=
CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG=
CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE=
CONFIG_LOG_BOOTLOADER_LEVEL=2
CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V=
CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y
CONFIG_BOOTLOADER_FACTORY_RESET=
CONFIG_BOOTLOADER_APP_TEST=
Expand Down Expand Up @@ -117,6 +116,15 @@ CONFIG_HW_LCD_RESET_GPIO=33
CONFIG_HW_LCD_BL_GPIO=32
CONFIG_SOUND_ENA=y
CONFIG_HW_PSX_ENA=
CONFIG_HW_GPIO_ENA=y
CONFIG_HW_GPIO_UP=2
CONFIG_HW_GPIO_DOWN=22
CONFIG_HW_GPIO_RIGHT=5
CONFIG_HW_GPIO_LEFT=21
CONFIG_HW_GPIO_A=16
CONFIG_HW_GPIO_B=17
CONFIG_HW_GPIO_SELECT=39
CONFIG_HW_GPIO_START=37

#
# Partition Table
Expand Down Expand Up @@ -201,6 +209,12 @@ CONFIG_EFUSE_MAX_BLK_LEN=192
# ESP32-specific
#
CONFIG_IDF_TARGET_ESP32=y
CONFIG_ESP32_REV_MIN_0=y
CONFIG_ESP32_REV_MIN_1=
CONFIG_ESP32_REV_MIN_2=
CONFIG_ESP32_REV_MIN_3=
CONFIG_ESP32_REV_MIN=0
CONFIG_ESP32_DPORT_WORKAROUND=y
CONFIG_ESP32_DEFAULT_CPU_FREQ_80=
CONFIG_ESP32_DEFAULT_CPU_FREQ_160=
CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y
Expand Down