I have ported my old project “pNesX” game console emulator to the nucleo.

Dependencies:   SDFileSystem mbed

Intro

I have ported my old project “pNesX” to the STM32 Nucleo. The pNesX is a NES emulator for the PlayStation that I have created 16 years ago!

Emulation part was almost without change, the sound part was newly added.

Parts

STM32 Nucleo F446RE
QVGA 2.2 TFT SPI (with the SD card slot)
Audio jack(TS or TRS)
USB Connector
Register 100k, 10k, 4.7k, 100
Capacitor 0.01uF, 2.2uF
Breadboard
Wires
Computer Speakers
USB GamePad

Wiring diagram

/media/uploads/beaglescout007/nucleo_ex06_emu.png

TFT J2Nucleo
VCC3V3
GNDGND
CSPB_5(D4)
ResetPA_10(D2) Pull Up(100k)
D/CPA_8(D7)
MOSIPA_7(D11)
SCKPA_5(D13)
LEDLED-100ohm-3V3
MISOPA_6(D12)
TFT J4Nucleo
SD_CSPA_9
SD_MOSIPB_15
SD_MISOPB_14
SD_SCKPB_13
AudioNucleo
TIPPA_4(A2)
USB con.Nucleo
GNDGND
+PA_12
-PA_11
5V5V

https://youtu.be/jL24IjT6LnI

Limitations

  • Since the rest of the RAM is about 50kbyte, maximum capacity of the game ROM is about 50kbyte.
  • The length of the file name up to 32 characters.
  • The number of files in the folder is up to 100.

Used Library

Committer:
beaglescout007
Date:
Sun Apr 03 07:45:29 2016 +0000
Revision:
0:3dac1f1bc9e0
Release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
beaglescout007 0:3dac1f1bc9e0 1 /* mbed USBHost Library
beaglescout007 0:3dac1f1bc9e0 2 * Copyright (c) 2006-2013 ARM Limited
beaglescout007 0:3dac1f1bc9e0 3 *
beaglescout007 0:3dac1f1bc9e0 4 * Licensed under the Apache License, Version 2.0 (the "License");
beaglescout007 0:3dac1f1bc9e0 5 * you may not use this file except in compliance with the License.
beaglescout007 0:3dac1f1bc9e0 6 * You may obtain a copy of the License at
beaglescout007 0:3dac1f1bc9e0 7 *
beaglescout007 0:3dac1f1bc9e0 8 * http://www.apache.org/licenses/LICENSE-2.0
beaglescout007 0:3dac1f1bc9e0 9 *
beaglescout007 0:3dac1f1bc9e0 10 * Unless required by applicable law or agreed to in writing, software
beaglescout007 0:3dac1f1bc9e0 11 * distributed under the License is distributed on an "AS IS" BASIS,
beaglescout007 0:3dac1f1bc9e0 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
beaglescout007 0:3dac1f1bc9e0 13 * See the License for the specific language governing permissions and
beaglescout007 0:3dac1f1bc9e0 14 * limitations under the License.
beaglescout007 0:3dac1f1bc9e0 15 */
beaglescout007 0:3dac1f1bc9e0 16
beaglescout007 0:3dac1f1bc9e0 17 #ifndef USB_INC_H
beaglescout007 0:3dac1f1bc9e0 18 #define USB_INC_H
beaglescout007 0:3dac1f1bc9e0 19
beaglescout007 0:3dac1f1bc9e0 20 #include "mbed.h"
beaglescout007 0:3dac1f1bc9e0 21 #include "toolchain.h"
beaglescout007 0:3dac1f1bc9e0 22
beaglescout007 0:3dac1f1bc9e0 23 enum USB_TYPE {
beaglescout007 0:3dac1f1bc9e0 24 USB_TYPE_OK = 0,
beaglescout007 0:3dac1f1bc9e0 25
beaglescout007 0:3dac1f1bc9e0 26 // completion code
beaglescout007 0:3dac1f1bc9e0 27 USB_TYPE_CRC_ERROR = 1,
beaglescout007 0:3dac1f1bc9e0 28 USB_TYPE_BIT_STUFFING_ERROR = 2,
beaglescout007 0:3dac1f1bc9e0 29 USB_TYPE_DATA_TOGGLE_MISMATCH_ERROR = 3,
beaglescout007 0:3dac1f1bc9e0 30 USB_TYPE_STALL_ERROR = 4,
beaglescout007 0:3dac1f1bc9e0 31 USB_TYPE_DEVICE_NOT_RESPONDING_ERROR = 5,
beaglescout007 0:3dac1f1bc9e0 32 USB_TYPE_PID_CHECK_FAILURE_ERROR = 6,
beaglescout007 0:3dac1f1bc9e0 33 USB_TYPE_UNEXPECTED_PID_ERROR = 7,
beaglescout007 0:3dac1f1bc9e0 34 USB_TYPE_DATA_OVERRUN_ERROR = 8,
beaglescout007 0:3dac1f1bc9e0 35 USB_TYPE_DATA_UNDERRUN_ERROR = 9,
beaglescout007 0:3dac1f1bc9e0 36 USB_TYPE_RESERVED = 9,
beaglescout007 0:3dac1f1bc9e0 37 USB_TYPE_RESERVED_ = 10,
beaglescout007 0:3dac1f1bc9e0 38 USB_TYPE_BUFFER_OVERRUN_ERROR = 12,
beaglescout007 0:3dac1f1bc9e0 39 USB_TYPE_BUFFER_UNDERRUN_ERROR = 13,
beaglescout007 0:3dac1f1bc9e0 40
beaglescout007 0:3dac1f1bc9e0 41 // general usb state
beaglescout007 0:3dac1f1bc9e0 42 USB_TYPE_DISCONNECTED = 14,
beaglescout007 0:3dac1f1bc9e0 43 USB_TYPE_FREE = 15,
beaglescout007 0:3dac1f1bc9e0 44 USB_TYPE_IDLE = 16,
beaglescout007 0:3dac1f1bc9e0 45 USB_TYPE_PROCESSING = 17,
beaglescout007 0:3dac1f1bc9e0 46
beaglescout007 0:3dac1f1bc9e0 47 USB_TYPE_ERROR = 18,
beaglescout007 0:3dac1f1bc9e0 48 };
beaglescout007 0:3dac1f1bc9e0 49
beaglescout007 0:3dac1f1bc9e0 50
beaglescout007 0:3dac1f1bc9e0 51 enum ENDPOINT_DIRECTION {
beaglescout007 0:3dac1f1bc9e0 52 OUT = 1,
beaglescout007 0:3dac1f1bc9e0 53 IN
beaglescout007 0:3dac1f1bc9e0 54 };
beaglescout007 0:3dac1f1bc9e0 55
beaglescout007 0:3dac1f1bc9e0 56 enum ENDPOINT_TYPE {
beaglescout007 0:3dac1f1bc9e0 57 CONTROL_ENDPOINT = 0,
beaglescout007 0:3dac1f1bc9e0 58 ISOCHRONOUS_ENDPOINT,
beaglescout007 0:3dac1f1bc9e0 59 BULK_ENDPOINT,
beaglescout007 0:3dac1f1bc9e0 60 INTERRUPT_ENDPOINT
beaglescout007 0:3dac1f1bc9e0 61 };
beaglescout007 0:3dac1f1bc9e0 62
beaglescout007 0:3dac1f1bc9e0 63 #define AUDIO_CLASS 0x01
beaglescout007 0:3dac1f1bc9e0 64 #define CDC_CLASS 0x02
beaglescout007 0:3dac1f1bc9e0 65 #define HID_CLASS 0x03
beaglescout007 0:3dac1f1bc9e0 66 #define MSD_CLASS 0x08
beaglescout007 0:3dac1f1bc9e0 67 #define HUB_CLASS 0x09
beaglescout007 0:3dac1f1bc9e0 68 #define SERIAL_CLASS 0x0A
beaglescout007 0:3dac1f1bc9e0 69
beaglescout007 0:3dac1f1bc9e0 70 #define DEVICE_DESCRIPTOR (1)
beaglescout007 0:3dac1f1bc9e0 71 #define CONFIGURATION_DESCRIPTOR (2)
beaglescout007 0:3dac1f1bc9e0 72 #define INTERFACE_DESCRIPTOR (4)
beaglescout007 0:3dac1f1bc9e0 73 #define ENDPOINT_DESCRIPTOR (5)
beaglescout007 0:3dac1f1bc9e0 74 #define HID_DESCRIPTOR (33)
beaglescout007 0:3dac1f1bc9e0 75
beaglescout007 0:3dac1f1bc9e0 76 // ----------- Control RequestType Fields -----------
beaglescout007 0:3dac1f1bc9e0 77 #define USB_DEVICE_TO_HOST 0x80
beaglescout007 0:3dac1f1bc9e0 78 #define USB_HOST_TO_DEVICE 0x00
beaglescout007 0:3dac1f1bc9e0 79 #define USB_REQUEST_TYPE_CLASS 0x20
beaglescout007 0:3dac1f1bc9e0 80 #define USB_REQUEST_TYPE_STANDARD 0x00
beaglescout007 0:3dac1f1bc9e0 81 #define USB_RECIPIENT_DEVICE 0x00
beaglescout007 0:3dac1f1bc9e0 82 #define USB_RECIPIENT_INTERFACE 0x01
beaglescout007 0:3dac1f1bc9e0 83 #define USB_RECIPIENT_ENDPOINT 0x02
beaglescout007 0:3dac1f1bc9e0 84
beaglescout007 0:3dac1f1bc9e0 85 // -------------- USB Standard Requests --------------
beaglescout007 0:3dac1f1bc9e0 86 #define GET_STATUS 0x00
beaglescout007 0:3dac1f1bc9e0 87 #define SET_FEATURE 0x03
beaglescout007 0:3dac1f1bc9e0 88 #define SET_ADDRESS 0x05
beaglescout007 0:3dac1f1bc9e0 89 #define GET_DESCRIPTOR 0x06
beaglescout007 0:3dac1f1bc9e0 90 #define SET_CONFIGURATION 0x09
beaglescout007 0:3dac1f1bc9e0 91 #define SET_INTERFACE 0x0b
beaglescout007 0:3dac1f1bc9e0 92 #define CLEAR_FEATURE 0x01
beaglescout007 0:3dac1f1bc9e0 93
beaglescout007 0:3dac1f1bc9e0 94 // -------------- USB Descriptor Length --------------
beaglescout007 0:3dac1f1bc9e0 95 #define DEVICE_DESCRIPTOR_LENGTH 0x12
beaglescout007 0:3dac1f1bc9e0 96 #define CONFIGURATION_DESCRIPTOR_LENGTH 0x09
beaglescout007 0:3dac1f1bc9e0 97
beaglescout007 0:3dac1f1bc9e0 98 // PID
beaglescout007 0:3dac1f1bc9e0 99 #define DATA0 0x03
beaglescout007 0:3dac1f1bc9e0 100 #define DATA1 0x0b
beaglescout007 0:3dac1f1bc9e0 101 #define ACK 0x02
beaglescout007 0:3dac1f1bc9e0 102 #define STALL 0x0e
beaglescout007 0:3dac1f1bc9e0 103 #define NAK 0x0a
beaglescout007 0:3dac1f1bc9e0 104
beaglescout007 0:3dac1f1bc9e0 105 #pragma pack(push,1)
beaglescout007 0:3dac1f1bc9e0 106 typedef struct {
beaglescout007 0:3dac1f1bc9e0 107 uint8_t bLength;
beaglescout007 0:3dac1f1bc9e0 108 uint8_t bDescriptorType;
beaglescout007 0:3dac1f1bc9e0 109 uint16_t bcdUSB;
beaglescout007 0:3dac1f1bc9e0 110 uint8_t bDeviceClass;
beaglescout007 0:3dac1f1bc9e0 111 uint8_t bDeviceSubClass;
beaglescout007 0:3dac1f1bc9e0 112 uint8_t bDeviceProtocol;
beaglescout007 0:3dac1f1bc9e0 113 uint8_t bMaxPacketSize;
beaglescout007 0:3dac1f1bc9e0 114 uint16_t idVendor;
beaglescout007 0:3dac1f1bc9e0 115 uint16_t idProduct;
beaglescout007 0:3dac1f1bc9e0 116 uint16_t bcdDevice;
beaglescout007 0:3dac1f1bc9e0 117 uint8_t iManufacturer;
beaglescout007 0:3dac1f1bc9e0 118 uint8_t iProduct;
beaglescout007 0:3dac1f1bc9e0 119 uint8_t iSerialNumber;
beaglescout007 0:3dac1f1bc9e0 120 uint8_t bNumConfigurations;
beaglescout007 0:3dac1f1bc9e0 121 } PACKED DeviceDescriptor;
beaglescout007 0:3dac1f1bc9e0 122
beaglescout007 0:3dac1f1bc9e0 123 typedef struct {
beaglescout007 0:3dac1f1bc9e0 124 uint8_t bLength;
beaglescout007 0:3dac1f1bc9e0 125 uint8_t bDescriptorType;
beaglescout007 0:3dac1f1bc9e0 126 uint16_t wTotalLength;
beaglescout007 0:3dac1f1bc9e0 127 uint8_t bNumInterfaces;
beaglescout007 0:3dac1f1bc9e0 128 uint8_t bConfigurationValue;
beaglescout007 0:3dac1f1bc9e0 129 uint8_t iConfiguration;
beaglescout007 0:3dac1f1bc9e0 130 uint8_t bmAttributes;
beaglescout007 0:3dac1f1bc9e0 131 uint8_t bMaxPower;
beaglescout007 0:3dac1f1bc9e0 132 } PACKED ConfigurationDescriptor;
beaglescout007 0:3dac1f1bc9e0 133
beaglescout007 0:3dac1f1bc9e0 134 typedef struct {
beaglescout007 0:3dac1f1bc9e0 135 uint8_t bLength;
beaglescout007 0:3dac1f1bc9e0 136 uint8_t bDescriptorType;
beaglescout007 0:3dac1f1bc9e0 137 uint8_t bInterfaceNumber;
beaglescout007 0:3dac1f1bc9e0 138 uint8_t bAlternateSetting;
beaglescout007 0:3dac1f1bc9e0 139 uint8_t bNumEndpoints;
beaglescout007 0:3dac1f1bc9e0 140 uint8_t bInterfaceClass;
beaglescout007 0:3dac1f1bc9e0 141 uint8_t bInterfaceSubClass;
beaglescout007 0:3dac1f1bc9e0 142 uint8_t bInterfaceProtocol;
beaglescout007 0:3dac1f1bc9e0 143 uint8_t iInterface;
beaglescout007 0:3dac1f1bc9e0 144 } InterfaceDescriptor;
beaglescout007 0:3dac1f1bc9e0 145
beaglescout007 0:3dac1f1bc9e0 146 typedef struct {
beaglescout007 0:3dac1f1bc9e0 147 uint8_t bLength;
beaglescout007 0:3dac1f1bc9e0 148 uint8_t bDescriptorType;
beaglescout007 0:3dac1f1bc9e0 149 uint8_t bEndpointAddress;
beaglescout007 0:3dac1f1bc9e0 150 uint8_t bmAttributes;
beaglescout007 0:3dac1f1bc9e0 151 uint16_t wMaxPacketSize;
beaglescout007 0:3dac1f1bc9e0 152 uint8_t bInterval;
beaglescout007 0:3dac1f1bc9e0 153 } EndpointDescriptor;
beaglescout007 0:3dac1f1bc9e0 154
beaglescout007 0:3dac1f1bc9e0 155 typedef struct {
beaglescout007 0:3dac1f1bc9e0 156 uint8_t bDescLength;
beaglescout007 0:3dac1f1bc9e0 157 uint8_t bDescriptorType;
beaglescout007 0:3dac1f1bc9e0 158 uint8_t bNbrPorts;
beaglescout007 0:3dac1f1bc9e0 159 uint16_t wHubCharacteristics;
beaglescout007 0:3dac1f1bc9e0 160 uint8_t bPwrOn2PwrGood;
beaglescout007 0:3dac1f1bc9e0 161 uint8_t bHubContrCurrent;
beaglescout007 0:3dac1f1bc9e0 162 uint8_t DeviceRemovable;
beaglescout007 0:3dac1f1bc9e0 163 uint8_t PortPweCtrlMak;
beaglescout007 0:3dac1f1bc9e0 164 } HubDescriptor;
beaglescout007 0:3dac1f1bc9e0 165 #pragma pack(pop)
beaglescout007 0:3dac1f1bc9e0 166
beaglescout007 0:3dac1f1bc9e0 167 #endif
beaglescout007 0:3dac1f1bc9e0 168