そして、ポイントにまっすぐに!
Maple BUSプロトコルは対称的です。つまり、HOSTなどの1つの優れた実装があり、同じ実装をDEVICEとして使用できます。より簡単-ジョイスティックを読むことも、そのふりをすることもできます。
プロトコルの説明(ハードウェア)
MapleBUSインターフェースは2線式です。SDCKA / SDCKBでは、特定の段階の各回線が「データの送信」と「データのラッチ」の両方の役割を果たします。
Maple BUSでの通信は、パッケージで実行されます。各データパケットは、ヘッダーパターン、データ、チェックサム、および末尾パターンで構成されます。データパケットの最大長は1024バイトです。
全部で5種類のパターンがあります。
START-データ送信の開始を示します(SDCKAが低レベルのときに4-reklok SDCKB)。
パッケージは常にENDパターンで終了する必要があります(SDCKBが低レベルのときにSDCKAの2クロック):
Occupancy - (8- SDCKB SDCKA ). HI->LO SDCKA , LO->HI . (Light GUN - Func. FT7):
RESET - (14- SDCKB SDCKA , DEVICE).
.
. - SDCKB, - SDCKA, ( :) ).
1:
, VMU, , ...
Maple BUS Device, Device Expansion Device, Device Expansion Device LM-Bus. Expansion 5-, , ( 315-6211-AB) " " 2- ( EXP-DEV , , VMU LCD , Exp. ).
LM-BUS Maple BUS, DEVICE Maple BUS Exp. DEVICE HOST'.
LM-BUS , , .
, :
COMMAND - , 0x01 0xFE (. "maplebus.h").
maplebus commands
//HOST
#define DeviceRequest 0x01
#define AllStatusRequest 0x02
#define DeviceReset 0x03
#define DeviceKill 0x04
#define GetCondition 0x09
#define GetMediaInfo 0x0A
#define BlockRead 0x0B
#define BlockWrite 0x0C
#define GetLastError 0x0D
#define SetCondition 0x0E
#define FT4Control 0x0F
#define ARControl 0x10
#define TransmitAgain 0xFC
//Device
#define DeviceStatus 0x05
#define DeviceAllStatus 0x06
#define DeviceReply 0x07
#define DataTransfer 0x08
#define ARError 0xF9
#define LCDError 0xFA
#define FileError 0xFB
#define TransmitAgain 0xFC
#define CommandUnknown 0xFD
#define FunctionTypeUnknown 0xFE
DEST. AP - ( ).
ORIG. AP - .
AP :
PO[1:0] - (A - 00, B - 01, C - 10, D - 11).
D/E - (1 - Device, 0 - Expansion Device PORT).
LM[4:0] - (1 - Exp. DEVICE , 0 - Exp. ).
DATA SIZE - 32- .
DATA - .
CRC - XOR COMMAND, AP, DATA SIZE, DATA.
"" HOST DEVICE DeviceRequest, , , "" (A/B/C/D).
(DeviceStatus answer):
Device ID - (Device ID FT, FD - ).
Device Functions
/*Device functions*/
#define CONTROLLER MAKE_DWORD(0x00000001) //FT0 : Controller Function
#define STORAGE MAKE_DWORD(0x00000002) //FT1 : Storage Function
#define LCD MAKE_DWORD(0x00000004) //FT2 : B/W LCD Function
#define TIMER MAKE_DWORD(0x00000008) //FT3 : Timer Function
#define AUDIO_INPUT MAKE_DWORD(0x00000010) //FT4 : Audio input device Function
#define AR_GUN MAKE_DWORD(0x00000020) //FT5 : AR-Gun Function
#define KEYBOARD MAKE_DWORD(0x00000040) //FT6 : Keyboard
#define GUN MAKE_DWORD((unsigned int)0x00000080) //FT7 : Light-Gun Function
#define VIBRATION MAKE_DWORD((unsigned int)0x00000100) //FT8 : Vibration Function
#define MOUSE MAKE_DWORD((unsigned int)0x00000200) //FT9 : Pointing Function
#define EXMEDIA MAKE_DWORD((unsigned int)0x00000400) //FT10 : Exchange Media Function
#define CAMERA MAKE_DWORD((unsigned int)0x00000800) //FT11 : Camera Device Functio
Destination code - .
Product name - ( {'D','r','e','a','m','c','a','s','t',' ','C','o','n','t','r','o','l','l','e','r', ' ',' ',' ',' ',' ',' ',' ',' ',' ',' '} - 30 ).
License - ( {'P','r','o','d','u','c','e','d',' ','B','y',' ','o','r',' ','U','n','d','e','r',' ','L','i','c','e','n','s','e',' ','F','r','o','m',' ','S','E','G','A',' ','E','N','T','E','R','P','R','I','S','E','S',',','L','T','D','.',' ',' ',' ',' ',' ',} -60 ).
Min./Max. current - . (1 = 10 , 43 => 0x1AE).
" " ( , ), : 40 "Version 1.000,1998/05/11,315-6125-AB Analog Module: The 4th Edition. 05/08".
, Device ID.
FT0, CONTROLLER, GetCondition - / . Device ID. , Device ID :
GetCondition, , :
Ra/La/Da/Ua - /// ( "").
Start/A/B/X/Y - .
A1, A2 -
A3 A4 - "".
.
( )
SDCKA SDCKB , , , , " " , , " " , , .
CPLD (EPM3032) xMAPLE:
SDCKA/SDCKB - Maple BUS.
GCLK - CLK 16-48MHz.
INHTxD - , 1 - , 0 - .
RxD - .
nSTRCV- (Rising Edge).
nDLatch - " " ( Q[7..0] ).
Q[7..0] - .
EOP - END ( ).
FERR - .
nRST - - RESET , - 0.
:
' (3 , ):
SMAPLE.v
module SMAPLE(
input GCLK, //MCU Generated 16MHz clock input
input INHTxD, //Inhibit Input Data (User Can disable XMAPLE Detect Signals While MCU Transmit DATA)
input SDCKAi, //Data/Clock A Line
input SDCKBi, //Data/Clock B Line
output RxD, //Receive on progress (While receive is 1)
output [7:0]Q // Output data bus (MCU can read valid data on this
//port in time 200uS after data latch Negative Pulse received)
, output nSTRCV, //Receive start, negative pulse - Output
output OCPYi, //Occupancy packet received - Output
output nRST, //Reset packet received - Output
output FERR, //Frame error - Output
output EOPi, //End Of Packed received - Output
output nDLatch //New Data latched on BUS (Negative Pulse)
);
/*Control Register*/
reg rRxD = 0;
assign RxD = rRxD;
reg rFERR = 0;
assign FERR = rFERR;
wire nWE;
assign nDLatch = (EOPi & nWE);
wire iFERR;
/* Align Data Packet */
reg rENA = 1'b0;
reg rENB = 1'b0;
always @(posedge GCLK or negedge nRST) begin
if(!nRST) begin
rENA <= 1'b0;
rENB <= 1'b0;
end else begin
rENA <= SDCKAi;
rENB <= SDCKBi;
end
end
always @(posedge GCLK or negedge nRST) begin
if(!nRST) begin
rFERR <= 0;
rRxD <= 0;
end else begin
if(!EOPi)// && !INHTxD)
rRxD <=0 ;
else begin
if(!iFERR) rFERR <= 1;
if(!nSTRCV) begin
rFERR <= 0;
rRxD <= ~INHTxD;
end
end
end
end
line_monitor line_monitor
(
.GCLK(GCLK), //Global Clock - Input
.SDCKA(SDCKAi|INHTxD), //CLOCK/DATA Line A disabled by data transmit - Input
.SDCKB(SDCKBi|INHTxD), //CLOCK/DATA Line B disabled by data transmit - Input
.RxDr(RxD), //Data Receive in progress - Input
.RxD(nSTRCV), //Receive start, negative pulse - Output
.OCPY(OCPYi), //Occupancy packet received - Output
.RESET(nRST), //Reset packet received - Output
.FERR(iFERR), //Frame error - Output
.EOP(EOPi), //End Of Packed received - Output
.ENA(rENA), //CLOCK For Line B
.ENB(rENB) //CLOCK For Line A
);
/*Receive Maple Frame*/
maple_receive maple_receive
(
.SDCKA(SDCKAi), //CLOCK/DATA Line A disabled by data transmit - Input
.SDCKB(SDCKBi), //CLOCK/DATA Line B disabled by data transmit - Input
.ENA(rENA), //CLOCK For Line B
.ENB(rENB), //CLOCK For Line A
.RCV(RxD), //Receive in progress, 1 - receive - Input
.Dout(Q[7:0]), //Received data byte - Output
.nWE(nWE), //Write Latch - Output
.RxDi(nSTRCV), //Receive start, negative pulse - Input
.INHTxD(INHTxD) //Inhibit Input Data (User Can disable XMAPLE Detect Signals While MCU Transmit DATA)
);
endmodule
line_monitor.v
module line_monitor
(
input GCLK,
input SDCKA,
input SDCKB,
input RxDr, //Data Receive in progress - Input
output RxD,
output OCPY,
output RESET,
output FERR,
output EOP,
input ENA,
input ENB
);
reg [3:0] countA = 0;
reg [2:0] countB = 0;
reg [3:0] pcount = 0;
reg rEOP = 1'b1;
assign EOP = rEOP;
assign RxD = (pcount == 4'h4) ? 1'b0 : 1'b1;
assign OCPY = (pcount == 4'h8) ? 1'b0 : 1'b1;
assign RESET = (pcount == 4'hE)? 1'b0 : 1'b1; //Output reset signal does not need to check for FERR
assign FERR = (!((RxD & OCPY & RESET) && pcount[3:1])) | (!RxDr & !rEOP);
//assign EOP = (eopcount == 3'h2) ? 1'b0 : 1'b1;
always @(posedge SDCKA) pcount <= countA;
always @(posedge SDCKB) rEOP <= !(countB == 3'h2);
//Patterns
//PATTERN Counter Managing
always @(posedge ENA or negedge ENB) begin
if (ENA) begin
countA <= 0;
end
else begin
countA <= countA + 4'h1;
end
end
//EOP Counter Managing
always @(posedge ENB or negedge ENA) begin
if (ENB) begin
countB <= 0;
end
else begin
countB <= countB + 3'h1;
end
end
//synopsys translate_off
//synopsys translate_on
endmodule
maple_receive.v
module maple_receive
(
input SDCKA, //CLOCK/DATA Line A
input SDCKB, //CLOCK/DATA Line B
input ENA, //CLOCK
input ENB, //CLOCK
input RCV, //Receive in progress, 1 - valid
output [7:0]Dout, //received data output
output nWE,
input RxDi,
input INHTxD //Inhibit Input Data (User Can disable XMAPLE Detect Signals While MCU Transmit DATA)
);
reg [3:0] dataA = 4'h0;
reg [3:0] dataB = 4'h0;
reg [1:0]countB = 2'b00;
reg rLastBitCounted = 1'b1;
//B LINE
//Dout[1] = SDCKA Means Major version 1.
//Dout[0] = SDCKB Means Minor version .0
//And version result = 1.0
assign Dout[1] = !INHTxD ? dataB[0] : SDCKA;
assign Dout[3] = dataB[1];
assign Dout[5] = dataB[2];
assign Dout[7] = dataB[3];
//A LINE
assign Dout[0] = !INHTxD ? dataA[0] : SDCKB;
assign Dout[2] = dataA[1];
assign Dout[4] = dataA[2];
assign Dout[6] = dataA[3];
assign nWE = (dtaLock);
always @(negedge ENA)begin
dataB[3:1] <= dataB[2:0];
dataB[0] <= SDCKB;
if(RCV) begin
countB <= countB + 2'b1;
end else begin
countB <= 2'b11;
end
end
always @(negedge ENB)begin
dataA[3:1] <= dataA[2:0];
dataA[0] <= SDCKA;
rLastBitCounted <= !countB[0] | !countB[1];
end
wire dtaLock = rLastBitCounted;
endmodule
" " Eval Board.
:
:
Eval...
:
, , .
Dreamcast XBOX360 ( " " XBOX360, ).
, , :
, "".
SD - :
... USB HID, MAPLE.
:
USE_STDPERIPH_DRIVER - ST.
STM32F10X_MD - Medium Density.
MAPLE_HOST - MAPLE HOST.
USB_HID - HID .
, :
… ( Microsoft Xbox 360 Accessories, XInput... , ):
xMAPLE ...
DREAMCAST.
, - FT9 : Pointing Function.
, DeviceID GetCondition, .
Mouse DeviceID:
Dreamcast 3 : A,B,W, X/Y: AC1,AC2 (ball) "": AC3 (wheel).
AC1,AC2,AC3 - - .
:
AOV2, AOV1, AOV0 - AC3, AC2, AC1 .
PS/2 :
..., gerber'...
:
, , , .
"" :
( ) :
USE_STDPERIPH_DRIVER - ST.
STM32F10X_MD - Medium Density.
MAPLE_DEVICE - MAPLE DEVICE.
EN_MOUSE - HID .
MOUSE_CALLBACK - HOST.
EXTI9_5_CALLBACK - EXTI5-EXTI9 MAPLE_BUS.
(, HEX).
, EN_MOUSE EN_CONTROLLER, , PS/2 DREAMCAST, , DREAMCAST . "HALF LIFE " EN_CONTROLLER PS/2.
, DREAMCAST !!!
私が伝えたかったのはそれだけです。しかし、私は話しませんでした(私はあなたにもっと話すことを願っています:)):
VibroPAKの操作方法。
メモリユニットの実装方法(ただし、PS / 2 SPI EEPROM拡張ボードにメモリをインストールして操作することはできます)。
そして、私はまだプリント回路基板のセットを持っていて、「私の手を試してみよう」と思っている3人にメールの費用でプリント回路基板のセットを送ることができます。
良い一日を過ごしてください!素晴らしい気分と相互理解!!!