From b170c73f922e3457b923b4e7fcbec794a8885c77 Mon Sep 17 00:00:00 2001 From: Ralf Ertzinger Date: Sat, 22 Jun 2013 10:08:23 +0100 Subject: Updated IAP commands. Originally written and uploaded by Lalufu (Ralf Ertzinger) in Feb 2012. They have been condensed into a single patch and some further additions by Andy Potter. Currently includes Authentication V2 support from iPod to Accessory, RF/BlueTooth transmitter support, selecting a playlist and selecting a track from the current playlist. Does not support uploading Album Art or podcasts. Has been tested on the following iPods, 4th Gen Grayscale, 4th Gen Color/Photo, Mini 2nd Gen, Nano 1st Gen and Video 5.5Gen. Change-Id: Ie8fc098361844132f0228ecbe3c48da948726f5e Co-Authored by: Andy Potter Reviewed-on: http://gerrit.rockbox.org/533 Reviewed-by: Frank Gevaerts --- tools/iap/ipod-002-lingo0.t | 277 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 tools/iap/ipod-002-lingo0.t (limited to 'tools/iap/ipod-002-lingo0.t') diff --git a/tools/iap/ipod-002-lingo0.t b/tools/iap/ipod-002-lingo0.t new file mode 100644 index 0000000000..c3bb676553 --- /dev/null +++ b/tools/iap/ipod-002-lingo0.t @@ -0,0 +1,277 @@ +use Test::More qw( no_plan ); +use strict; + +BEGIN { use_ok('Device::iPod'); } +require_ok('Device::iPod'); + +my $ipod = Device::iPod->new(); +my $m; +my ($l, $c, $p); + +isa_ok($ipod, 'Device::iPod'); + +$ipod->{-debug} = 1; +$ipod->open("/dev/ttyUSB0"); + +$m = $ipod->sendraw("\xFF" x 16); # Wake up and sync +ok($m == 1, "Wakeup sent"); + +# Empty the buffer +$ipod->emptyrecv(); + +# IdentifyDeviceLingoes(lingos=0x01, options=0x00, deviceid=0x00) +# We expect an ACK OK message as response +$m = $ipod->sendmsg(0x00, 0x13, "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"); +ok($m == 1, "IdentifyDeviceLingoes(lingos=0x01, options=0x00, deviceid=0x00) sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ACK OK" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x02, "Response command"); + is($p, "\x00\x13", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# RequestRemoteUIMode +# We expect an ACK Bad Parameter as response, as we have not +# negotiated lingo 0x04 +$m = $ipod->sendmsg(0x00, 0x03); +ok($m == 1, "RequestRemoteUIMode sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ACK Bad Parameter" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x02, "Response command"); + is($p, "\x04\x03", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# EnterRemoteUIMode +# We expect an ACK Bad Parameter as response, as we have not +# negotiated lingo 0x04 +$m = $ipod->sendmsg(0x00, 0x05); +ok($m == 1, "EnterRemoteUIMode sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ACK Bad Parameter" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x02, "Response command"); + is($p, "\x04\x05", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# ExitRemoteUIMode +# We expect an ACK Bad Parameter as response, as we have not +# negotiated lingo 0x04 +$m = $ipod->sendmsg(0x00, 0x06); +ok($m == 1, "ExitRemoteUIMode sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ACK Bad Parameter" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x02, "Response command"); + is($p, "\x04\x06", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# RequestiPodName +# We expect a ReturniPodName packet +$m = $ipod->sendmsg(0x00, 0x07); +ok($m == 1, "RequestiPodName sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ReturniPodName" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x08, "Response command"); + like($p, "/^[^\\x00]*\\x00\$/", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# RequestiPodSoftwareVersion +# We expect a ReturniPodSoftwareVersion packet +$m = $ipod->sendmsg(0x00, 0x09); +ok($m == 1, "RequestiPodSoftwareVersion sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ReturniPodSoftwareVersion" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x0A, "Response command"); + like($p, "/^...\$/", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# RequestiPodSerialNumber +# We expect a ReturniPodSerialNumber packet +$m = $ipod->sendmsg(0x00, 0x0B); +ok($m == 1, "RequestiPodSerialNumber sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ReturniPodSerialNumber" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x0C, "Response command"); + like($p, "/^[^\\x00]*\\x00\$/", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# RequestiPodModelNum +# We expect a ReturniPodModelNum packet +$m = $ipod->sendmsg(0x00, 0x0D); +ok($m == 1, "RequestiPodModelNum sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ReturniPodModelNum" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x0E, "Response command"); + like($p, "/^....[^\\x00]*\\x00\$/", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# RequestLingoProtocolVersion(lingo=0x00) +# We expect a ReturnLingoProtocolVersion packet +$m = $ipod->sendmsg(0x00, 0x0F, "\x00"); +ok($m == 1, "RequestLingoProtocolVersion(lingo=0x00) sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ReturnLingoProtocolVersion" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x10, "Response command"); + like($p, "/^\\x00..\$/", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# IdentifyDeviceLingoes(lingos=0x11, options=0x00, deviceid=0x00) +# We expect an ACK OK message as response +$m = $ipod->sendmsg(0x00, 0x13, "\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00"); +ok($m == 1, "IdentifyDeviceLingoes(lingos=0x11, options=0x00, deviceid=0x00) sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ACK OK" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x02, "Response command"); + is($p, "\x00\x13", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# RequestRemoteUIMode +# We expect an ReturnRemoteUIMode packet specifying standard mode +$m = $ipod->sendmsg(0x00, 0x03); +ok($m == 1, "RequestRemoteUIMode sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ReturnRemoteUIMode" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x04, "Response command"); + is($p, "\x00", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# EnterRemoteUIMode +# We expect an ACK Pending packet, followed by an ACK OK packet +$m = $ipod->sendmsg(0x00, 0x05); +ok($m == 1, "EnterRemoteUIMode sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ACK Pending" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x02, "Response command"); + like($p, "/^\\x06\\x05/", "Response payload"); +}; +($l, $c, $p) = $ipod->recvmsg(); +subtest "ACK OK" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x02, "Response command"); + is($p, "\x00\x05", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# RequestRemoteUIMode +# We expect an ReturnRemoteUIMode packet specifying extended mode +$m = $ipod->sendmsg(0x00, 0x03); +ok($m == 1, "RequestRemoteUIMode sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ReturnRemoteUIMode" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x04, "Response command"); + isnt($p, "\x00", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# ExitRemoteUIMode +# We expect an ACK Pending packet, followed by an ACK OK packet +$m = $ipod->sendmsg(0x00, 0x06); +ok($m == 1, "ExitRemoteUIMode sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ACK Pending" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x02, "Response command"); + like($p, "/^\\x06\\x06/", "Response payload"); +}; +($l, $c, $p) = $ipod->recvmsg(); +subtest "ACK OK" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x02, "Response command"); + is($p, "\x00\x06", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# RequestRemoteUIMode +# We expect an ReturnRemoteUIMode packet specifying standard mode +$m = $ipod->sendmsg(0x00, 0x03); +ok($m == 1, "RequestRemoteUIMode sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ReturnRemoteUIMode" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x04, "Response command"); + is($p, "\x00", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); + +# Send an undefined command +# We expect an ACK Bad Parameter as response +$m = $ipod->sendmsg(0x00, 0xFF); +ok($m == 1, "Undefined command sent"); +($l, $c, $p) = $ipod->recvmsg(); +subtest "ACK Bad Parameter" => sub { + ok(defined($l), "Response received"); + is($l, 0x00, "Response lingo"); + is($c, 0x02, "Response command"); + is($p, "\x04\xFF", "Response payload"); +}; + +# Empty the buffer +$ipod->emptyrecv(); -- cgit v1.2.3