The iPhone Serial Port Hack
An anonymous reader writes "The iPhone's little known secret, a hidden serial port, is revealed. 'The real benefit in all of this is that there are so many console packages for iPhone in Cydia now that you can have a fully functional computer, as useful as a Linux box, but without carrying around a laptop.'"
This isn't a "secret"... it's been in the iPhone (and iPod for that matter) for quite a long time. This same serial port is how 3rd party docks and cables control the device from the outside: http://www.adriangame.co.uk/ipod-acc-pro.html
If you'd like to read the article instead of Computer World's stupid-ass slide show, it's at http://resolvehax.blogspot.com/2010/10/iphone-serial-port.html
...given that you can buy ipod breakout boards on ebay with the serial connectors clearly marked, it doesn't seem to be a particularly well kept secret.
See http://cgi.ebay.co.uk/Enhanced-Breakout-Board-Ipod-Iphone-Ipad-/370447835814?pt=UK_CE_MP3Access_RL&hash=item56406962a6 for an example.
This serial port has been around forever. All those cars with iPod integration use it for control and data. I've controlled the iPod functionality on every iPod I've had (since 3rd gen) as well as three iPhones using an Atmega controller. I year or so I shared some controller code for Arduino based atmega microconrollers.
Here's how you control your iPhone or iPod music with an Arduino, easy peasy:
Sheldon
* /* Control iPod/iPhones from Arduino
Sheldon Stokes
Jan 3, 2009
Standing on the shoulders of ipodLinux.org
http://ipodlinux.org/wiki/Apple_Accessory_Protocol
This send comands to the iPod as though it were a remote.
These are the simple 2 byte commands that should work on all
Apple iPods and iPhones starting with the 3rd Generation iPod
*********** Commands (array index, command value, command description) **************
0 0x00 Button Release
1 0x01 Play/Pause
2 0x02 Vol+
3 0x04 Vol-
4 0x08 Skip >
5 0x10 Skip
6 0x20 Next Album
7 0x40 Prev Album
8 0x80 Stop
*/
int commandBytes[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
int checkSum;
int playPin = 2;
int stopPin = 3;
int fwdPin = 4;
int backPin = 5;
int playVal, stopVal, fwdVal, backVal;
void setup()
{
Serial.begin(19200);
pinMode(playPin, INPUT);
pinMode(stopPin, INPUT);
pinMode(fwdPin, INPUT);
pinMode(backPin, INPUT);
}
void loop()
{
playVal = digitalRead(playPin); // read play button // read stop button // read fwd button // read back button
stopVal = digitalRead(stopPin);
fwdVal = digitalRead(fwdPin);
backVal = digitalRead(backPin);
if (playVal == LOW) // send play command // send button release // send stop command // send button release // send stop command // send button release // send stop command // send button release
{
sendRequest(commandBytes[1]);
sendRequest(commandBytes[0]);
}
else if (stopVal == LOW)
{
sendRequest(commandBytes[8]);
sendRequest(commandBytes[0]);
}
else if (fwdVal == LOW)
{
sendRequest(commandBytes[4]);
sendRequest(commandBytes[0]);
}
else if (backVal == LOW)
{
sendRequest(commandBytes[5]);
sendRequest(commandBytes[0]);
}
delay(100);
}
void sendRequest(int val) {
checkSum = 0x100 - ((0x03 + 0x02 + val + 0) & 0xFF);
int request[] = {0xFF, 0x55, 0x03, 0x02, 0x00, val, checkSum};
Yeah, it's got a serial port, with TTL levels, at its external connector. Big deal.
It's also possible to attach USB devices, which is somewhat more useful today. For example, you can plug a real keyboard into an iPad.
More recent ones have anti-tamper (Droid X) or auto-reflash (G2), making it a pain to root.
I honestly think Google is very disingenuous to say Android is open when many currently-selling actual devices are locked tighter than the iPhone.
Perhaps Google is just happy that Android is "open to the carriers".
You want a sure bet for an open system, go with the N900.
Make sure everyone's vote counts: Verified Voting
The Samsung Galaxy S family appears to have (among other things) a UART hidden on its USB port via the Fairchild FSA9480 chip.
This thread at xda-developers ( http://forum.xda-developers.com/showthread.php?p=8834946 ) suggests that if you put a 150k resistor (1% tolerance) between pins 4 and 5 and power up the phone, the two pins normally used for USB data will be repurposed as a serial console for the bootloader.
You can also explicitly toggle the FSA9480's mode via software (though not necessarily without root and your own kernel extensions).
Note that it's not using USB as serial... it's acting as an electronic crossbar, disconnecting the D+ and D- pins from the USB circuit, and connecting them to pins elsewhere that are a real UART. Think: old-fashioned telephone switchboard with patch cables and jacks that dynamically establish and tear down circuits as needed so a few physical pins can be put to occasional niche uses that wouldn't merit full-time pins of their own.
Personally, I suspect two pins on the headphone jack can be nudged into acting as a UART as well. Sigh. What the mod community really needs is for someone to raise the cash to pay a company that does intelligence reports for consumer electronic devices to tear down the Epic4G (or some other variant) and draw up a schematic showing which externally-accessible pins are connected to what (and how) inside the phone. There's a lot of good stuff inside of these phones that's undocumented publicly or via the official kernel source. Lots 'o happy bitbanging ahead! :-)
Meh... or you could get a N900 that comes with those tools *ALREADY INCLUDED* in the base OS.
Package manager? Maemo is a modified Debian, and uses Apt.
Shell? Default is Busybox, but the full system is in the repos.
Build toolchain, including GCC? In the repos.
OpenSSH and sshd? In the repos (also dropbear, if you prefer).
Anything that's available as source and compiles on ARM? Go to town. You can even pull directly to the device using Subversion and other mackage managers.
Seriously, arguing over whether iOS or Android is more open is like arguing over whether a Prius or a sports car is better for off-road driving. You're both doing it wrong. Get the right tool for the job.
There's no place I could be, since I've found Serenity...