Prototype works. Driver written (supports both a polling approach and an event approach). Time to order boards 
Here’s an example polling client:
private void PollingTest()
{
var timer = new GT.Timer(1000);
timer.Tick += (t) =>
{
gamepad.UpdateState();
ShowGamepadState(gamepad.GamepadAState, "A");
ShowGamepadState(gamepad.GamepadBState, "B");
Debug.Print(" -------- " + DateTime.Now.Ticks);
};
timer.Start();
}
private void ShowGamepadState(NesGamepadState state, string gamepadID)
{
if (state.IsButtonAPressed)
Debug.Print(gamepadID + ": Button A Pressed");
if (state.IsButtonBPressed)
Debug.Print(gamepadID + ": Button B Pressed");
if (state.IsStartPressed)
Debug.Print(gamepadID + ": Start Pressed");
if (state.IsSelectPressed)
Debug.Print(gamepadID + ": Select Pressed");
if (state.IsDPadLeftPressed)
Debug.Print(gamepadID + ": Left Pressed");
if (state.IsDPadRightPressed)
Debug.Print(gamepadID + ": Right Pressed");
if (state.IsDPadUpPressed)
Debug.Print(gamepadID + ": Up Pressed");
if (state.IsDPadDownPressed)
Debug.Print(gamepadID + ": Down Pressed");
}
and here’s an example event client
private void EventTest()
{
gamepad.ButtonAPressed += new NesGamepadModule.ButtonEventHandler(gamepad_ButtonAPressed);
gamepad.ButtonAReleased += new NesGamepadModule.ButtonEventHandler(gamepad_ButtonAReleased);
gamepad.ButtonBPressed += new NesGamepadModule.ButtonEventHandler(gamepad_ButtonBPressed);
gamepad.ButtonBReleased += new NesGamepadModule.ButtonEventHandler(gamepad_ButtonBReleased);
gamepad.SelectPressed += new NesGamepadModule.ButtonEventHandler(gamepad_SelectPressed);
gamepad.SelectReleased += new NesGamepadModule.ButtonEventHandler(gamepad_SelectReleased);
gamepad.StartPressed += new NesGamepadModule.ButtonEventHandler(gamepad_StartPressed);
gamepad.StartReleased += new NesGamepadModule.ButtonEventHandler(gamepad_StartReleased);
gamepad.DirectionChanged += new NesGamepadModule.DirectionEventHandler(gamepad_DirectionChanged);
gamepad.EnableEvents(100);
}
void gamepad_DirectionChanged(NesGamepadModule sender, NesGamepad gamepad, bool up, bool down, bool left, bool right)
{
Debug.Print(gamepad + " Direction changed. Up:" + up + " Down:" + down + " Left:" + left +" Right:" + right);
}
void gamepad_StartReleased(NesGamepadModule sender, NesGamepad gamepad)
{
Debug.Print(gamepad + " Start Released");
}
void gamepad_StartPressed(NesGamepadModule sender, NesGamepad gamepad)
{
Debug.Print(gamepad + " Start Pressed");
}
void gamepad_SelectReleased(NesGamepadModule sender, NesGamepad gamepad)
{
Debug.Print(gamepad + " Select Released");
}
void gamepad_SelectPressed(NesGamepadModule sender, NesGamepad gamepad)
{
Debug.Print(gamepad + " Select Pressed");
}
void gamepad_ButtonBPressed(NesGamepadModule sender, NesGamepad gamepad)
{
Debug.Print(gamepad + " Button B Pressed");
}
void gamepad_ButtonAReleased(NesGamepadModule sender, NesGamepad gamepad)
{
Debug.Print(gamepad + " Button A Released");
}
void gamepad_ButtonBReleased(NesGamepadModule sender, NesGamepad gamepad)
{
Debug.Print(gamepad + " Button B Released");
}
void gamepad_ButtonAPressed(NesGamepadModule sender, NesGamepad gamepad)
{
Debug.Print(gamepad + " Button A Pressed");
}
Tested with a spider since my Cerberus testing was…interrupted.
I’ll have this all up on codeplex. For testing, I used one of those end-of-life parallax boards, so feel free to use the driver if you have one of those kicking around. Connect the board’s +5V to Gadgeteer 3V3. The chip in the NES controller will run find on that voltage, and I don’t have to worry about stepping down 5V.
// need a Y socket.
// Pin 6 is latch
// Pin 7 is data A
// Pin 8 is data B
// Pin 9 is clock
Now this is out of my system, back to working on my XAML book 
Pete