Looking for help making a PS3 pcb from scratch

I’ve been working on a new (not original) project lately and am looking for some help, hoping there might be some knowledgeable electronic engineers, or at least hackers here to help.

So to sum up the project, I’m doing a verbatim knockoff of an Arcade-in-a-box slim model, with help and schematics from Ed Farias himself.

So far I have the case done, still working on the t-molding, art, etc. Here’s the next step:

I need a circuit board. Now, being a hacker, I have a pile of busted controllers of all shapes and sizes, first party, third party, etc, but I want to challenge myself.
I am in my senior year of high school electronics, with access to basically anything I would need, the ability and tools to build a circuit board, and hard program IC chips, there are only two things (as far as I know) I don’t have:

1:The actual knowledge/experience to code the IC chips, although I do indeed have the tools to do it, all I would need is to either master the code or copy it from someone else.

2:The necessary chips, which I imagine are not hard to obtain so that is no problem.

The model I would like to build is something to the effect of the Toodles Cthulu for PS3.


If someone with experience in the field could give me advice I would very much appreciate it!

Code depends on how much you want to do, and how much you want to steal borrow. Dual Strike (strike-devices.net) already exists, and is pretty decent. If you want to code the whole thing (my kind of attitude) then I recommend starting with Arduino. There are a lot of problems with the platform (hint: digitalRead(pin) is slow, use bitread(port,position)) but it’s super easy to learn. Give http://learn.adafruit.com/adafruit-arduino-lesson-1-blink/overview a look. This limits you to using Atmel AVR chips, but they’re pretty great so there ya go. For USB, you’ll probably want to use either an Arduino Leonardo/Atmega 32u4 or Teensy based board. Technically I just said the same thing three times there, but whatever. The teensy libraries are easy to use, and Leonardo is harder to make into a Joystick because the only decent library out there is lazily maintained. If you bypass Arduino for AVR-C then you’ll be using LUFA, which is still a box of magic to me so I can’t help you there yet. For an example, the Phreakmods Cerberus uses an Atmega32u4 and LUFA. The Cthulhu uses an Atmega XX8 series chip with (I THINK) V-USB.

So, to get general for a second, any USB HID Joystick will work on the PS3. I’ve got button mappings here: https://github.com/damurdock/PS2_USB/blob/master/Button%20Diagram.jpg (in that pic, start + sel = home). The problem comes along with the PS button. If you use Teensy, I’ve got a modified file that will work over at https://github.com/damurdock/Teensyduino-PS-Button-Mod . If you don’t use Teensy, you need to add

// Begin PS3 vendor page - Thanks UnoJoy!
	0x75, 0x08,         // Report Size (8)
    0x06, 0x00, 0xff,  //   USAGE_PAGE (Vendor Specific)
    0x09, 0x20,        //   Unknown
    0x09, 0x21,        //   Unknown
    0x09, 0x22,        //   Unknown
    0x09, 0x23,        //   Unknown
    0x09, 0x24,        //   Unknown
    0x09, 0x25,        //   Unknown
    0x09, 0x26,        //   Unknown
    0x09, 0x27,        //   Unknown
    0x09, 0x28,        //   Unknown
    0x09, 0x29,        //   Unknown
    0x09, 0x2a,        //   Unknown
    0x09, 0x2b,        //   Unknown
    0x95, 0x0c,        //   REPORT_COUNT (12)
    0x81, 0x02,        //   INPUT (Data,Var,Abs)
    0x0a, 0x21, 0x26,  //   Unknown
    0x95, 0x08,        //   REPORT_COUNT (8)
    0xb1, 0x02,        //   FEATURE (Data,Var,Abs)*/
        0xC0                            // End Collection

to your report descriptor, then add something like

 * Series of bytes that appear in control packets right after the HID
 * descriptor is sent to the host. They were discovered by tracing output
 * from a Madcatz SF4 Joystick. Sending these bytes makes the PS button work.
static const uint8_t PROGMEM magic_init_bytes[] = {
	0x21, 0x26, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00
// End UnoJoy Code

where you declare variables. Then, at bmRequestType == 0xA1 and bRequest == HID_GET_REPORT send those magic bytes to the PS3. This will all make sense in due time. All of that was taken from my code and based off of UnoJoy, btw.I’m currently trying to figure out player leds, so if I find something I’ll let you know.

So, I hope that was helpful. If I didn’t explain something well or anything just let me know. Good luck!

The bulk of that post flew right over my head. I have 0 experience doing hardware programming, I did a bit of really really basic C# coding as part of a course but I’m atrocious at it. Not saying I’m not willing to learn just putting that out there.

All I need to do is have a close to lagless USB HID board that can do all the buttons/hat of a PS3 controller. What do you think the easiest to learn and least expensive method of doing this is? Do you recommend learning a language from scratch or just copying it and tweaking it to the best of my ability?

Also: I do have access to a bunch of arduino boards my school provides, do you think I could probably program most boards to work as a microcontroller? Is it relatively simple to code something like this? I would imagine it wouldn’t be many pages of code, or take me for than a week to learn, but I have no idea.

Sorry to basically ignore the bulk of your post but I don’t speak binary yet, most of it is indistinguishable to me.

anyhow thanks for the help!

Wow excellent post Sal_The_TIller, I’m also thinking about this but since I’m more experienced in c# programming my idea is to use something like netduino, Gadgeteer, netmf, etc. and I would like to add that instead of programming it for PS3 I would like to create an Xbox 360 PCB like the ps360+ even if is only possible to use it on a PC the reason is because I would like to use HOME button and Player indicator leds.

IIRC you need permission directly from microsoft to make 360 peripherals. Not sure how much water that rumour holds but I’ve heard that.

EDIT: By permission I mean I’m pretty sure they make a proprietary chip.

Ahhh those magic bytes, funny enough when researching to build my own setup I came across those on a couple sites, and everywhere referenced each other until I found one spot that referenced the UPCB and based it around that and Toodles’ findings. The dude basically set in motion all of these boards that have the PS button ability.

Drambit - if you are looking for an easy up, I suggest grabbing a Teensy, breadboarding it or soldering, and using the pre-done joystick demos. Otherwise use one of the Arduinos at your disposal and use the pre-done libraries, edit either option to your liking. In either case, Arduino is the fastest if you want something with screw terminals I’m pretty sure they already have shields and stuff to give access like that.

There are arduino libraries out there already that give all the buttons, PS button included, and even some that emulate a sixaxis so that you get some extra functionality.

Awesome awesome. I might just grab a teensy because the arduinos I would have I’ll get access to in september, but my stick isn’t finished yet so I have all the time in the world. Considering the fact that I was looking at building the whole thing right from scratch, pcb and all, soldering is no issue, It’s going to be minimalist.

Thanks for the help!

Who knows I doubt PS360+ has asked for microsoft for permisions for creating that PCB

PS360 is a PS3 board, designed to be dual modded easily. There is nothing actually xbox related about it.

Uhh… no. PS360 is both a PS3 and XBox 360 board in one.

Wrong my friend PS360+ supports Xbox 360, PS3, PS2, PC and other Consoles.

I second what Phreakazoid says. Although if you use a Teensy, forget about the generic arduino stuff and use the Teensyduino Joystick lib. The only compatible lib in pure arduino won’t work let you use the home button because the maintainer… doesn’t maintain it, to say the least.

The 360 uses some pretty hefty encryption. So far the only ways to bypass it are to get permission from microsoft, get an encryption coprocessor from a controller or a shady chinese manufacturer and figure out how to use it, or to make a passthrough. Those crazy dudes over at GIMx have figured out the passthrough, but I can’t figure out how.

Also Drambit, the PS360+ does work on the xbox 360. They use a clone encryption chip.

Yeah, same here. It took me forever to figure out how to send them, Toodles must be a wizard to have actually found them.

Just takes the proper toolset :), you’d be amazed what you can do when you have the right equipment.

So what you are saying is that if I grab a Teensy there is no way to make start + select = home?

A damn shame that M$ does that.

I love how I mistook the idea of the ps360+ for the idea of the TE kitty and the like and everyone jumps in to correct me.

So there is a lot of contradiction being thrown around, so I’ll ask everybody.

I want to build a board that I can code (or copy someone else’s code mua ha ha) to work on PS3 and PC, 8 Buttons, 8 Direction joystick, Start, select, Start + Select = home, for as cheap as possible, what should I do?

I’ve tried to find helpful information through google, but all I could come up with is a bunch of very specific very unrelated threads, and a bunch of cryptic info of no use to me.

Also: I will probably receive some well deserved laughs / facepalms for asking this, but the lowest tier of Teensy board should work just fine right?


Drambit: This is gonna be a bit wordy so let me know if you don’t understand.
Yes you can use Start + Sel = Home with the Teensy. The PS3 uses weird stuff to make the home button work, but long, long ago Toodles figured it out. Everything on the internet is pretty cryptic*, yes, but I’ve already done the work and ported Toodles’s work to the Teensy. Just go to that page I linked you forever ago and install that file.

The code is very simple once you get the hang of it. Below, I’ve written a bit and annotated it.

//This is where you make any variable declarations
#define START 1
#define SELECT 2

void setup(){
  //This is where you do anything that only has to happen once
  pinMode(START, INPUT_PULLUP); //Set the buttons to be input
  Joystick.useManualSend(true); //This lets us control the USB packet, seems to make hitting buttons at the same time a little easier

void loop(){ 
  //This runs over and over and over and over...
  Joystick.button(13, !digitalRead(START) && !digitalRead(SELECT)); // If both buttons are pushed (ie, not at voltage level), send the home button
  Joystick.button(10, !digitalRead(START);
  Joystick.button(9, !digitalRead(SELECT));
  Joystick.send_now() //send the packet

That would need some revision probably, but that’s the basic idea.
And yes, that Teensy would work. The ++ just has more pins, and the 3.0 is an entirely different beast. Better, but you don’t need that kind of power.

*Ok, cryptic does not BEGIN to describe.

Already cool thanks. I’m actually kind of surprised at how basic the code is for these boards, can’t wait to start learning the language.