summaryrefslogtreecommitdiffstats
path: root/scripts/imx
diff options
context:
space:
mode:
authorOleksij Rempel <o.rempel@pengutronix.de>2017-03-07 08:54:49 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2017-03-09 07:41:22 +0100
commit701f728c2a79628fbbb4f1a57e576ce5c5c8afd6 (patch)
tree015c649a2564f9574cd295ebd3eafc801f1fae05 /scripts/imx
parentef55d12d59771b64e764a777aa3d7963e2ebb8dd (diff)
downloadbarebox-701f728c2a79628fbbb4f1a57e576ce5c5c8afd6.tar.gz
barebox-701f728c2a79628fbbb4f1a57e576ce5c5c8afd6.tar.xz
scripts: imx imx-usb-loader: add support for imx23 and imx28
This code was rewrtitten from mxs-usb-loader. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'scripts/imx')
-rw-r--r--scripts/imx/imx-usb-loader.c85
1 files changed, 84 insertions, 1 deletions
diff --git a/scripts/imx/imx-usb-loader.c b/scripts/imx/imx-usb-loader.c
index ac7bc3ee94..90ee3e09d5 100644
--- a/scripts/imx/imx-usb-loader.c
+++ b/scripts/imx/imx-usb-loader.c
@@ -69,6 +69,9 @@ struct mach_id {
#define HDR_MX53 2
unsigned char header_type;
unsigned short max_transfer;
+#define DEV_IMX 0
+#define DEV_MXS 1
+ unsigned char dev_type;
};
struct usb_work {
@@ -87,7 +90,9 @@ static const struct mach_id imx_ids[] = {
.vid = 0x066f,
.pid = 0x3780,
.name = "i.MX23",
- .mode = MODE_BULK,
+ .mode = MODE_HID,
+ .max_transfer = 1024,
+ .dev_type = DEV_MXS,
}, {
.vid = 0x15a2,
.pid = 0x0030,
@@ -120,6 +125,8 @@ static const struct mach_id imx_ids[] = {
.vid = 0x15a2,
.pid = 0x004f,
.name = "i.MX28",
+ .max_transfer = 1024,
+ .dev_type = DEV_MXS,
}, {
.vid = 0x15a2,
.pid = 0x0052,
@@ -187,6 +194,17 @@ struct sdp_command {
uint8_t rsvd;
} __attribute__((packed));
+#define MXS_CMD_FW_DOWNLOAD 0x02
+struct mxs_command {
+ uint32_t sign; /* Signature */
+ uint32_t tag; /* Tag */
+ uint32_t size; /* Payload size */
+ uint8_t flags; /* Flags (host to device) */
+ uint8_t rsvd[2]; /* Reserved */
+ uint8_t cmd; /* Firmware download */
+ uint32_t dw_size; /* Download size */
+} __attribute__((packed));
+
static const struct mach_id *imx_device(unsigned short vid, unsigned short pid)
{
int i;
@@ -1441,6 +1459,66 @@ static int write_mem(const struct config_data *data, uint32_t addr,
return modify_memory(addr, val, width, set_bits, clear_bits);
}
+/* MXS section */
+static int mxs_load_file(libusb_device_handle *dev, uint8_t *data, int size)
+{
+ static struct mxs_command dl_command;
+ int last_trans, err;
+ void *p;
+ int cnt;
+
+ dl_command.sign = htonl(0x424c5443); /* Signature: BLTC */
+ dl_command.tag = htonl(0x1);
+ dl_command.size = htonl(size);
+ dl_command.flags = 0;
+ dl_command.rsvd[0] = 0;
+ dl_command.rsvd[1] = 0;
+ dl_command.cmd = MXS_CMD_FW_DOWNLOAD;
+ dl_command.dw_size = htonl(size);
+
+ err = transfer(1, (unsigned char *) &dl_command, 20, &last_trans);
+ if (err) {
+ printf("transfer error at init step: err=%i, last_trans=%i\n",
+ err, last_trans);
+ return err;
+ }
+
+ p = data;
+ cnt = size;
+
+ while (1) {
+ int now = get_min(cnt, usb_id->mach_id->max_transfer);
+
+ if (!now)
+ break;
+
+ err = transfer(2, p, now, &now);
+ if (err) {
+ printf("dl_command err=%i, last_trans=%i\n", err, now);
+ return err;
+ }
+
+ p += now;
+ cnt -= now;
+ }
+
+ return err;
+}
+
+static int mxs_work(struct usb_work *curr)
+{
+ unsigned fsize = 0;
+ unsigned char *buf = NULL;
+ int ret;
+
+ ret = read_file(curr->filename, &buf, &fsize);
+ if (ret < 0)
+ return ret;
+
+ return mxs_load_file(usb_dev_handle, buf, fsize);
+}
+/* end of mxs section */
+
static int parse_initfile(const char *filename)
{
struct config_data data = {
@@ -1550,6 +1628,11 @@ int main(int argc, char *argv[])
usb_id->mach_id = mach;
+ if (mach->dev_type == DEV_MXS) {
+ ret = mxs_work(&w);
+ goto out;
+ }
+
err = do_status();
if (err) {
printf("status failed\n");