LiveSuit

LiveSuit is developed by Allwinner as a application for MS Windows™ to flash the NAND for Allwinner chips.

Download

 * Windows version LiveSuit

Flash
To flash A10 devices with LiveSuit, first you need to let the device go to FEL mode.

Execute LiveSuit.exe and click SelectImg button to select the LiveSuit images you have. Connect your devices to PC with a USB cable. If Windows ask you to install driver, select the driver in the LiveSuit program UsbDriver folder.

Download
mkdir cubie; cd cubie git clone https://github.com/matson-hall/allwinner-pack-tools.git git checkout cubieboard cp cubie/allwinner-pack-tools/tools/Livesuit-linux.zip cd destination unzip Livesuit-linux.zip chmod +x Livesuit.run ./Livesuit.run

Unsupported distribution notes
As expected, the LiveSuit.run is a 60 lines shellscript followed by an tar.bz2 archive. You can extract it manually as such: tail -n +60 LiveSuit.run > LiveSuite.tar.bz2

In the tarball there's 2 things, the livesuite itself and a special USB driver in the form of either an RPM or a DEB package. rpmunpack or dpkg -x somepackage.deb can be used to extract the package.

Next, change into the extracted source to usr/src/awdev-0.1 and type make. If there are errors, (I had some) they need to be fixed.

For one, err has finally died! (according to [gkh on g+].).

For now here until it is fixed upstream. --- awusb.c.org	2012-10-14 00:19:02.269423226 +0200 +++ awusb.c	2012-10-14 00:29:59.728629613 +0200 @@ -147,6 +147,8 @@    int result = 0; int actual_len = 0; +   //int ii = 0; +    mutex_lock(&(aw->lock)); if (aw->present == 0 || aw->aw_dev == NULL) { retval = -ENODEV; @@ -215,7 +217,7 @@            goto err_out; }        if (!(buffer = kmalloc(buffer_len, GFP_KERNEL))) { -           err("AWUSB_IOCSEND: Not enough memory for the send buffer!"); +           dev_err(&aw->aw_dev->dev, "AWUSB_IOCSEND: Not enough memory for the send buffer!"); retval = -ENOMEM; goto err_out; } @@ -226,7 +228,6 @@            kfree(buffer); goto err_out; } -       int ii = 0; /*for(ii = 0; ii < buffer_len; ii ++) { @@ -242,7 +243,7 @@        if (result) { kfree(buffer); -           err("Write Whoops - %08x", result); +           dev_err(&aw->aw_dev->dev, "Write Whoops - %08x", result); retval = -EIO; goto err_out; } @@ -272,7 +273,7 @@        printk("buffer_len=%d\n", buffer_len); printk("value=%d\n", value); if (!(buffer = kmalloc(buffer_len, GFP_KERNEL))) { -           err("AWUSB_IOCSEND: Not enough memory for the receive buffer!"); +           dev_err(&aw->aw_dev->dev, "AWUSB_IOCSEND: Not enough memory for the receive buffer!"); retval = -ENOMEM; goto err_out; } @@ -286,7 +287,7 @@        if (result) { kfree(buffer); -           err("Read Whoops - %x", result); +           dev_err(&aw->aw_dev->dev, "Read Whoops - %x", result); retval = - EIO; goto err_out; } @@ -391,7 +392,7 @@ 				break; }; 		if (result) { -			err("Write Whoops - %x", result); +			dev_err(&aw->aw_dev->dev, "Write Whoops - %x", result); errn = -EIO; goto error; } @@ -460,7 +461,7 @@ 		} else if (result == -ETIMEDOUT || result == 15) {	/* FIXME: 15 ??? */ 			if (!maxretry--) { mutex_unlock(&(aw->lock)); -				err("read_aw: maxretry timeout"); +				dev_err(&aw->aw_dev->dev, "read_aw: maxretry timeout"); return -ETIME; } 			prepare_to_wait(&aw->wait_q, &wait, TASK_INTERRUPTIBLE); @@ -469,7 +470,7 @@ 			continue; } else if (result != -EREMOTEIO) { mutex_unlock(&(aw->lock)); -			err("Read Whoops - result:%u partial:%u this_read:%u", +			dev_err(&aw->aw_dev->dev, "Read Whoops - result:%u partial:%u this_read:%u", result, partial, this_read); 			return -EIO; 		} else { @@ -517,21 +518,21 @@ 	retval = usb_register_dev(intf, &usb_aw_class); 	if (retval) { -		err("Not able to get a minor for this device."); +		dev_err(&aw->aw_dev->dev, "Not able to get a minor for this device."); 		return -ENOMEM; 	} 	aw->aw_dev = dev; 	if (!(aw->obuf = kmalloc(OBUF_SIZE, GFP_KERNEL))) { -		err("probe_aw: Not enough memory for the output buffer"); +		dev_err(&aw->aw_dev->dev, "probe_aw: Not enough memory for the output buffer"); 		usb_deregister_dev(intf, &usb_aw_class); 		return -ENOMEM; 	} 	dbg("probe_aw: obuf address:%p", aw->obuf); 	if (!(aw->ibuf = kmalloc(IBUF_SIZE, GFP_KERNEL))) { -		err("probe_aw: Not enough memory for the input buffer"); +		dev_err(&aw->aw_dev->dev, "probe_aw: Not enough memory for the input buffer"); 		usb_deregister_dev(intf, &usb_aw_class); 		kfree(aw->obuf); 		return -ENOMEM;