On Tue, Mar 07, 2017 at 08:54:49AM +0100, Oleksij Rempel wrote:
> This code was rewrtitten from mxs-usb-loader.
> 
> Signed-off-by: Oleksij Rempel <[email protected]>
> ---
>  scripts/imx/imx-usb-loader.c | 85 
> +++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 84 insertions(+), 1 deletion(-)

Applied, thanks

Sascha

> 
> diff --git a/scripts/imx/imx-usb-loader.c b/scripts/imx/imx-usb-loader.c
> index b2c9f8f5a..c61ebaf2f 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 @@ 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 @@ struct mach_id imx_ids[] = {
>               .vid = 0x15a2,
>               .pid = 0x004f,
>               .name = "i.MX28",
> +             .max_transfer = 1024,
> +             .dev_type = DEV_MXS,
>       }, {
>               .vid = 0x15a2,
>               .pid = 0x0052,
> @@ -180,6 +187,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 struct mach_id *imx_device(unsigned short vid, unsigned short pid)
>  {
>       int i;
> @@ -1343,6 +1361,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 = {
> @@ -1452,6 +1530,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");
> -- 
> 2.11.0
> 
> 
> _______________________________________________
> barebox mailing list
> [email protected]
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to