Amino company and resellers are really quiet about all the possibilities of the product.
I made a post some time ago about configuring the Amino to boot with DHCP and get the config through this or through DHCP.
This post was really popular and people began to ask me for firmware and informations on how to upgrade. Of course, I can’t provide anything like firmware. My reseller here is France is OK to sell it for 10€ for 4 Amino stb… Or you can find it somewhere on Internet. Please, don’t ask for it, I don’t have the latest nor the Opera firmware.

My last reseller sent me the 110 firmware while I had some dead STB. This is what I will use for this tutoriel.

So, the firmware comes as a tar file. Mine is A110-0.15.1-fresco-ami_wm-euro-subs.tar .

First, you need to create some directories. Please, note I’m actualy doing this on a PC running Ubuntu 7.10. The ~ stands for your home directory. It can be anything else you want, just change the paths accordinately. Of course, you don’t need to install things in /usr/local AT ALL, which is a really bad way to do things anyway.

  1. cd  ~
  2. mkdir amino
  3. cd amino
  4. mkdir keys releases releases/A110 images
  5. cd releases/A110

Now you can untar your image. Mine is just a .tar but yours could be a .tgz or .tar.gz. Then use option zxvf instead of xvf :

  1. tar xvf ../../../A110-0.15.1-fresco-ami_wm-euro-subs.tar

This will create a directory 0.15.1-A110-fresco-ami_wm-subs-1. Go into it :

  1. cd 0.15.1-A110-fresco-ami_wm-subs-1

You can now create and sign the two files you need for an upgrade : a bootstrap and an image.

The bootstrap

  1. cd bootstrap
  2. export CUSTOMER_KEY=`pwd`/../utils/keys/amino/KEY.private
  3. export PATH=$PATH:`pwd`/../utils
  4. ./signbootstrap

The password is « markskey« . You will get a OK message and a new file : bootstrap.signed

  1. Please enter passphrase for /home/prune/amino/releases/A110/0.15.1-A110-fresco-ami_wm-subs-1/utils/keys/amino/KEY.private: Signed image written to ‘bootstrap.signed’
  2. Multicast bootstrap image signed successfully: bootstrap.signed

Copy this new file to the image directory :

  1. cp bootstrap.signed ~/amino/images
  2. cd ..

The BONUS

Before we create the signed image of the real OS, I will show you how you can customize the boot procedure.
In the upgradeimage/imagecomponents directory lies all the files that will be packaged in the OS. Of course you can add few files. Don’t oversize the image or it won’t be able to be used.
Inside this directory you will find a splash.gif image file.
splash
You can replace it by any GIF image. Don’t use an image bigger than the TV resolution, around 720×480. Replace the image but keep the same name ! Also, I think you have a limited number of possible colors, and the first color (?) will also be used for the backgroud around the image (can you confirm that ?)
So, have fun, change files, pre-program you amino by changing the config files… play around :)

The OS Image

If you have closed your terminal, re-set the CUSTOMER_KEY and PATH variables as above.
Now create and sign the image. As suggested, if you are making an Opera firmware upgrade, une -z for compressing the image

  1. ./signupgradeimage -z 0
  2. Amino signupgradeimage Version : 1.42 $
  3. Using DI of 0
  4. Please enter passphrase for /home/prune/amino/releases/A110/0.15.1-A110-fresco-ami_wm-subs-1/utils/keys/amino/KEY.private:
  5. 0
  6. Generating flash contents list
  7. ….
  8. FS created with packetsize of 4096
  9. Warning: FS created using default values [serialNumber=1, dirsPerCycle=128]
  10. cp mc2.mcfs ~/amino/images/

The DHCP Server

Yes, you will need one… But you already have my previous post on this : http://www.lecentre.net/blog/archives/119
See my config below as I finaly found out that my first config was « wrong« 

The Multicast Server

This server can be anything… the one provided with the image or anyone, like VLC (yes, the video player…).
Go in the server directory and edit the

  1. cd ~/amino/releases/A110/0.15.1-A110-fresco-ami_wm-subs-1/server
  2. vi mcastbootd.conf

Match the <mcast address> and <port number> with the ones from the DHCPD config file :
Here is my file :

  1. [Server]
  2. LogLevel=4
  3. MulticastTTL=1
  4.  
  5. [Image bootstrap.signed]
  6. MulticastIPAddress=239.255.230.52
  7. MulticastUDPPort=11111
  8. FileName=bootstrap.signed
  9. Description=Linux bootstrap image
  10. ImageType=1
  11. SerialNumber=1
  12. PacketSize=1456
  13. CycleTime=0
  14.  
  15. [Filesystem mc2]
  16. MulticastIPAddress=239.255.230.53
  17. MulticastUDPPort=11111
  18. ImageName=mc2
  19. Description=upgrade filesystem
  20. SerialNumber=2
  21. DirsPerCycle=128
  22. DataRate=256
  23. CycleTime=0

Start the upgrade

Now you are ready to start. Go in the image directory and start the multicast software :

  1. cd ~/amino/images
  2. ~/amino/releases/A110/0.15.1-A110-fresco-ami_wm-subs-1/server/mcastbootd -D  -C ~/amino/releases/A110/0.15.1-A110-fresco-ami_wm-subs-1/server/mcastbootd.conf
  3. 16:04:12.788281 /home/prune/amino/releases/A110/0.15.1-A110-fresco-ami_wm-subs-1/server/mcastbootd: Multicast boot/FS server daemon version 0.01.00
  4. 16:04:12.788591 /home/prune/amino/releases/A110/0.15.1-A110-fresco-ami_wm-subs-1/server/mcastbootd version 0.01.00 started
  5. 16:04:12.792805 239.255.230.52:11111 transmission of boot image ‘bootstrap.signed’ enabled
  6. 16:04:12.796833 239.255.230.53:11111 transmission of ‘mc2′ enabled
  7. 16:04:12.796895 239.255.230.53:11111 transmission of filesystem ‘mc2′ commenced
  8. 16:04:12.817127 239.255.230.52:11111 transmission of boot image ‘bootstrap.signed’ commenced
  9. ….

You can now plug in your set top box and see the magic…
Or not… :)
I just found out that the DHCP config file may not be right, depending on your Amni revision. While the original Vendor-Name is « aminoAMINET110mboot », this can change.
The solution I found was to trace the IP (bootP) packets on the lan and see what is going on. I use tcpdump for that.
This is also the point where I will describe my setup :
My host have 2 network card. Eth0 is connected to the local LAN and is using a dhcp client to get an IP. I’m connecting to it using SSH from my Mac, where I write this blog post at the same time.
The other network card, eth1, is connected to a switch where I plus the set top box. As the multicast packets of the mcastbootd only goes out by the first interface, eth0, I had to use a special command to configure eth1, so the multicast goes on it. Here is the whole config command.
Of course, if you are local on the host and have only one ethernet card, you won’t have to do this :

  1. ifconfig eth1 10.20.0.2 netmask 255.255.252.0 up
  2. route add -net 224.0.0.0 netmask 240.0.0.0 dev eth1

The IP 10.20.0.2 is just part of the DHCP range I set up but outside the pool.
Then, to get the « vendor name » used by the set top box to ask for bootp/dhcp, I used tcpdump on eth1, then plugged in the amino and power it. Here is the result :

  1.  tcpdump -s 1024 -x -i eth1 -vv host not 239.255.230.52 and host not 239.255.230.53
  2. tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 1024 bytes
  3.  
  4. 15:44:20.598588 IP (tos 0x0, ttl  64, id 1, offset 0, flags [none], proto: UDP (17), length: 328) 0.0.0.0.bootpc &gt; 255.255.255.255.bootps: [udp sum ok] BOOTP/DHCP, Request from 00:00:00:00:00:00 (oui Unknown), length 300, xid 0x167eb0e7, Flags [ none ] (0x0000)
  5.           Client-Ethernet-Address 00:00:00:00:00:00 (oui Unknown)
  6.           Vendor-rfc1048 Extensions
  7.             Magic Cookie 0x33333333
  8.             DHCP-Message Option 53, length 1: Discover
  9.             Vendor-Class Option 60, length 26: "insecureAMINET11xmboot1.32"
  10.             Vendor-Option Option 43, length 24: 2.2.2.22.22.22.22.22.22.22.120.2.2.222.22.222.222.222.2.2.22.22.22.52

What is all this mess ?
In fact, you don’t care !
The only important part is Vendor-Class Option 60, length 26: « insecureAMINET11xmboot1.32″. This is what you have to set in your dhcpd.conf so it will find the amino, give it the IP and params so it can find the broadcast server.
So, here is my dhcpd.conf file, right from the Ubuntu dhcpd.conf + amino specials :

  1. # cat /etc/dhcp3/dhcpd.conf  | grep -v \#
  2.  
  3. ddns-update-style none;
  4. option domain-name "example.org";
  5. option domain-name-servers ns1.example.org, ns2.example.org;
  6. default-lease-time 600;
  7. max-lease-time 7200;
  8. log-facility local7;
  9.  
  10. option space AMINO;
  11. option AMINO.address    code 1 = ip-address;
  12. option AMINO.port       code 2 = integer 16;
  13. option AMINO.product    code 3 = text;
  14. option AMINO.option     code 4 = text;
  15. option AMINO.version    code 5 = text;
  16. option AMINO.middleware code 6 = ip-address;
  17. option AMINO.mw_port    code 7 = integer 16;
  18. option AMINO.homepage   code 8 = text;
  19. option AMINO.dindex     code 9 = integer 32;
  20. option AMINO.dindex_min code 10 = integer 32;
  21. option AMINO.dindex_page        code 11 = text;
  22.  
  23. class "AmiNET110 all" {
  24. match if (option vendor-class-identifier="Aminoaminet110fisys") or
  25. ((substring( option vendor-encapsulated-options, 2, 9)="aminet110")
  26. and (substring(option vendor-encapsulated-options, 13, 5)="fisys"));
  27.  
  28. vendor-option-space AMINO;
  29. option AMINO.homepage "http://tv.portal.com/tv.html";
  30. }
  31.  
  32. class "AmiNET110 mboot"
  33. {
  34.   match if (option vendor-class-identifier="insecureAMINET11xmboot1.32") or
  35.            ((substring( option vendor-encapsulated-options, 2, 9)="AMINET110")
  36.             and (substring(option vendor-encapsulated-options, 13, 5)="mboot"));
  37.  
  38.   vendor-option-space AMINO;
  39.   option AMINO.address 239.255.230.52;
  40.   option AMINO.port 11111;
  41. }
  42.  
  43. class "AmiNET110 upgrd"
  44. {
  45.   match if (option vendor-class-identifier="insecureAMINET11xupgrd1.32") or
  46.            ((substring( option vendor-encapsulated-options,2,9)="aminet110")
  47.             and (substring( option vendor-encapsulated-options,13,5)="upgrd"));
  48.  
  49.   vendor-option-space AMINO;
  50.   option AMINO.address 239.255.230.53;
  51.   option AMINO.port 11111;
  52. }
  53.  
  54. shared-network IPTV {
  55. subnet 10.20.0.0 netmask 255.255.252.0 {
  56. option subnet-mask 255.255.252.0;
  57. option domain-name "mydomain.net";
  58. option domain-name-servers 10.16.12.10;
  59. option routers 10.20.3.254;
  60. option broadcast-address 10.20.3.255;
  61. option ntp-servers 10.16.12.22;
  62. pool {
  63. range 10.20.2.70 10.20.2.250;
  64. allow members of "all";
  65. allow members of "AmiNET110 upgrd";
  66. allow members of "AmiNET110 all";
  67. allow members of "AmiNET110 mboot";
  68. }
  69. }
  70. }

Now, restart dhcpd server, plug the amino and power it… and VOILA !!
I hope this is clear enough for you. Please comment if you need more details. Just remember it’s now 22:00 and I started all this at 19:00, so please don’t ask too newbie questions.