Седня съездил на Юнону, купил себе подарков - всякого железного хлама. Экспонат номер один - джойстик для плейстейшн 2 за 50 рублей =) Давно уже была идея, что надо сделать внешний контроллер какой-нить удобный для экспериментов всяких.. а тут оно под руку подвернулось так удачно.
Как оказалось, у пс2 простейший протокол, прекрасно описанный в интернете... написал прошивку под арм, на процессинге накатал простенькую утилитку - рисовалку контроллера/обработчик данных. Вот такая вот фигня получилась:
(там на экране видно, что нажата одна кнопка и джойстик отклонен вправо)
А вот кусок кода под арм(единственная особенность - для ноги PS_DATA надо включить пулап) :
- Код: Выделить всё • Развернуть
unsigned char psx_byte(unsigned char psbyte){
unsigned char psdata=0;
int i=0;
for(i=0;i<8;i++){
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, PS_CLK);
if(psbyte & (1<<i)) AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PS_CMD);
else AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, PS_CMD);
wait(1);
if(AT91F_PIO_IsInputSet(AT91C_BASE_PIOA, PS_DATA)) setbit(psdata, i);
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PS_CLK);
wait(1);
}
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PS_CMD);
wait(1);
return psdata;
}
void psx_poll(int cnt){
int i=0;
for(i=0;i<18;i++){
psx_data[i]=0;
}
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PS_CMD|PS_CLK);
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, PS_ATT);
wait(1);
psx_byte(0x01);
psx_byte(0x42);
psx_byte(0x00);
for(i=0;i<cnt;i++){
psx_data[i] = psx_byte(0x00);
}
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PS_ATT);
}