Подключаем геймпад от Nintendo Classic Mini к Raspberry pi

, . . , Dendy ( , , , . .) geektimes.ru/post/281520, Raspberry pi. , Nintendo Classic Mini, — . 4 , . , . , , , .

, .

image

, Wii Wii U, i2c. , 3,3 V, . Raspberry pi, wiimote, . 2 , , . . , , , . i2c-tools. — 52. i2cdetect :

i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          03 04 05 06 07 -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- 52 -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

( ), . Wii. , Raspberry pi Wii. , , , 0x40 , 6 .

, i2c. bcm2835 , , — WirinPi. . , 4 5 ( ). select, start, down, right — , A, B, up, left — . select, down, right 4- , start — . 5- , A, B 4- , up, left — . : A — 0xcf, B — 0xbf, up — 0xf0, left — 0xf1, select — 0xcf, start — 0xf3, down — 0xbf, right — 0x7f. , — «» . 0x8f.

:

image

, , :

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <errno.h>
char i, a, b, c, d, state;
char bytes[6];
int main(void) {
wiringPiSetup();
int fd = wiringPiI2CSetup(0x52);
wiringPiI2CWriteReg8(fd, 0x40, 0x00);
delayMicroseconds(20);
while(1) 
{
	state = 0;
	wiringPiI2CWrite(fd, 0x00);
        delayMicroseconds(100);
        for (i=0; i<6; i++)
	{
           bytes[i] = wiringPiI2CRead(fd);
        }
	a = bytes[5] >> 4;
	b = bytes[5] << 4;
	c = bytes[4] >> 4;
	d = bytes[4] << 4;
	if (a == 0xc)
	state ^= (1 << 0);
	if (a == 0xb)
	state ^= (1 << 1);
	if (c == 0xc)
	state ^= (1 << 2);
	if (d == 0x30)
	state ^= (1 << 3);
	if (b == 0x00)
	state ^= (1 << 4);
	if (c == 0xb)
	state ^= (1 << 5);
	if (b == 0x10)
	state ^= (1 << 6);
	if (c == 0x7)
	state ^= (1 << 7);
	printf("%x \n", state);
	}
    return 0;
}

, . , char, , 4 , . . , .

WiringPi — wiringPiSetup();, i2c — 0x52. :


wiringPiI2CWriteReg8(fd, 0x40, 0x00);
delayMicroseconds(20);

6 , , . . .

fceu.c:


int FCEUI_Initialize(void)
{
    if(!FCEU_InitVirtualVideo())
    return 0;
    memset(&FSettings,0,sizeof(FSettings));
    FSettings.UsrFirstSLine[0]=8;
    FSettings.UsrFirstSLine[1]=0;
    FSettings.UsrLastSLine[0]=231;
    FSettings.UsrLastSLine[1]=239;
    FSettings.SoundVolume=100;
    FCEUPPU_Init();
    X6502_Init();
    wiringPiSetup();
    return 1;
}

input.c. int FCEUI_Initialize(void), gpio ( Simba's), .


pinMode (0, OUTPUT);
pinMode (2, OUTPUT);
pinMode (3, INPUT);
digitalWrite (0, HIGH);
digitalWrite (2, LOW);
fd = wiringPiI2CSetup(0x52);
wiringPiI2CWriteReg8(fd, 0x40, 0x00);
usleep(20);

, , .

static DECLFW(B4016), , :


if (LastStrobe==0)
{
	digitalWrite (0, LOW);
}


, , . switch case, if else.
:


void FCEU_UpdateInput(void)
{
joy[0] = 0;
joy[1] = 0xff;
wiringPiI2CWrite(fd, 0x00);
usleep(100);
for (i = 0; i <= 7; i++)
	{
	bytes[i] = wiringPiI2CRead(fd);
	joy[1] ^= digitalRead(3) << i;
	digitalWrite (2, HIGH);
	delayMicroseconds (20);
	digitalWrite (2, LOW);
	delayMicroseconds (20);
	}
	a = bytes[5] >> 4;
	b = bytes[5] << 4;
	c = bytes[4] >> 4;
	d = bytes[4] << 4;
	switch (a){
	case 0xc:
	joy[0] ^= (1 << 0);
	break;
	case 0xb:
	joy[0] ^= (1 << 1);
	break;
	case 0x8:
	joy[0] ^= (1 << 0);
	joy[0] ^= (1 << 1);
	break;
	}
	switch (b){
	case 0x00:
	joy[0] ^= (1 << 4);
	break;
	case 0x10:
	joy[0] ^= (1 << 6);
	break;
	case 0x20:
	joy[0] ^= (1 << 4);
	joy[0] ^= (1 << 6);
	break;
	}
	switch (c){
	case 0xc:
	joy[0] ^= (1 << 2);
	break;
	case 0xb:
	joy[0] ^= (1 << 5);
	break;
	case 0x7:
	joy[0] ^= (1 << 7);
	break;
	case 0x8:
	joy[0] ^= (1 << 2);
	joy[0] ^= (1 << 5);
	break;
	case 0x4:
	joy[0] ^= (1 << 2);
	joy[0] ^= (1 << 7);
	break;
	case 0x3:
	joy[0] ^= (1 << 5);
	joy[0] ^= (1 << 7);
	break;
	}
	switch (d){
	case 0x30:
	joy[0] ^= (1 << 3);
	break;
	}
	digitalWrite (0, HIGH);
	}
	

, , 2 , , . .

.

P.S: , , .

P.P.S , , Makefile ( Configure), src, -lwiringPi -lm -lrt , . :

LIBS =

Source: https://habr.com/ru/post/hi400445/


All Articles