Coder Social home page Coder Social logo

imx_usb_loader's Introduction

imx_loader

i.MX/Vybrid recovery utility

Description

This utility allows to download and execute code on Freescale i.MX5/i.MX6/i.MX7 and Vybrid SoCs through the Serial Download Protocol (SDP). Depending on the board, there is usually some kind of recovery button to bring the SoC into serial download boot mode, check documentation of your hardware.

The utility support USB and UART as serial link.

Installation

  1. Clone
  2. Make sure libusb (1.0) is available
  3. Compile using make

Two binaries are available, imx_usb and imx_uart for the two supported connections.

Windows

Two variants have been tested successfully to build imx_usb and imx_uart on Windows:

  1. MinGW (using the Microsoft C runtime)
  2. Visual Studio 2015

MinGW

MinGW allows to use the GNU toolchain (including GCC) to compile a native Microsoft Windows application. A MinGW specific make file (Makefile.mingw) is available which allows to build imx_usb/imx_uart with the native make port (mingw32-make.exe). After installing MinGW, make sure you have a compiled copy of libusb available and build imx_loader using:

mingw32-make -f Makefile.mingw LIBUSBPATH=C:\path\to\libusb

This dynamically links against libusb, hence make sure to ship the library libusb-1.0.dll along with imx_usb.exe.

Visual Studio

The subdirectory msvc/ contains the project files for Visual Studio 2015. Make sure you have the Visual C++ component installed. There is one solution containing two projects, one for imx_usb and one for imx_uart. The imx_usb project requires libusb to be present at ../../libusb (relative to the msvc) directory. If you use an alternative location or compile libusb from source too, you will have to alter the include/library path in the project settings.

macOS

libusb and pkg-config can be installed via Homebrew.

If imx_usb fails to claim interface, com.apple.driver.usb.IOUSBHostHIDDevice needs to be unloaded so libusb can claim, run:

sudo kextunload -b com.apple.driver.usb.IOUSBHostHIDDevice

Usage

Using USB, your device should be detected automatically using the USB VID/PID from imx_usb.conf. Using UART, the user has to specify a configuration file. This file is needed to use the correct protocol variant for the target device (transfer configuration). The configuration file can also contains work item(s).

Work items can also be defined using the command line. By specifying a file in the command line, the utility automatically uses this file as a work item and reads parameter from its header:

./imx_usb u-boot.imx

However, parameters can also specified manually, e.g.

./imx_usb u-boot.imx -l0x3f400400 -s370796 -v

The UART link uses hardware flow control using RTS/CTS, so make sure those are available. The imx_uart utility will configure the target tty with the right baud rate (115200) and flow control settings:

./imx_uart /dev/ttyUSB0 vybrid_usb_work.conf u-boot.imx

imx_usb_loader's People

Contributors

abellynow avatar baruchsiach avatar braillon avatar brenolimanxp avatar bwalle avatar ckuethe avatar dangtranhieu2012 avatar eduardoabinader avatar fredrikmarcus avatar ggardet avatar gianlucab avatar gibsson avatar gonzoua avatar hundeboll avatar jcorbier avatar kristianlm avatar lucaceresoli avatar marckleinebudde avatar matttcattt avatar maxkrummenacher avatar mohicks avatar otavio avatar racerx avatar stroese avatar sullin avatar telelaci avatar tkisky avatar valter-minute-tx avatar vstehle avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

imx_usb_loader's Issues

warning: the value of the size argument in 'strncat' is too large, might lead to a buffer overflow [-Wstrncat-size]

clang 10.0.1 complains when building imx_sdp.c

cc -c imx_sdp.c -o imx_sdp.o -pipe -ggdb -O2 -pipe  -fstack-protector-strong -fno-strict-aliasing  -DSYSCONFDIR='"/tmp/u-boot-imx-serial-loader-2017.01/etc"'
imx_sdp.c:144:22: warning: the value of the size argument in 'strncat' is too large, might lead to a
      buffer overflow [-Wstrncat-size]
        strncat(conf, &sep, sizeof(conf));
                            ^~~~~~~~~~~~
imx_sdp.c:144:22: note: change the argument to be the free space in the destination buffer minus the
      terminating null byte
        strncat(conf, &sep, sizeof(conf));
                            ^~~~~~~~~~~~
                            sizeof(conf) - strlen(conf) - 1
imx_sdp.c:145:27: warning: the value of the size argument in 'strncat' is too large, might lead to a
      buffer overflow [-Wstrncat-size]
        strncat(conf, conf_file, sizeof(conf));
                                 ^~~~~~~~~~~~
imx_sdp.c:145:27: note: change the argument to be the free space in the destination buffer minus the
      terminating null byte
        strncat(conf, conf_file, sizeof(conf));
                                 ^~~~~~~~~~~~
                                 sizeof(conf) - strlen(conf) - 1

Using

> clang -v
FreeBSD clang version 10.0.1 ([email protected]:llvm/llvm-project.git llvmorg-10.0.1-0-gef32c611aa2)
Target: x86_64-unknown-freebsd11.4
Thread model: posix
InstalledDir: /usr/bin

Recent versions broke compat with U-Boot "Jump to Script" feature

U-Boot supports SDP jumping to something that is not an IMX header. If that happens, it tries interpreting the data as a U-Boot script:

/* If imx header fails, try some U-Boot specific headers */
if (status) {
#ifdef CONFIG_SPL_BUILD
	/* In SPL, allow jumps to U-Boot images */
	...
#else
	/* In U-Boot, allow jumps to scripts */
	source(sdp_func->jmp_address, "script@1");
#endif
}

Unfortunately, recent versions of imx_usb_loader broke this by always trying to append a header and jumping to that header. I'm talking specifically about this in imx_sdp.c:

ld.dladdr = curr->load_addr;
ld.header_addr = ld.dladdr + ld.max_length;
ld.header_offset = curr->load_skip + ld.max_length;

...

ret = jump(dev, ld.header_addr);

Note: this new feature seems to be broken in my tests anyway -- the header was never transferred to the device because a bounds check later on caps the transfer size to the original file size.

Could you provide a way to restore the previous behaviour of transferring and jumping to headerless data?

Thanks!

imx_uart with Raspberry Pi

Hi everyone,

I am trying to flash u-boot to colibri VF50 using RPi3 as host machine.
Is it possible to do that using imx_uart binary file?
I compiled the code in my R pi and generated the binary file, but it does not seem working.
Kindly help me if anybody has any idea about this, I will really appreciate it.

Kind regards,
Munawar Ali

Missing documentation of extra features

I played arround a little bit with the "advanced" features of this tool. I tried to upload not only the u-boot to "debrick" or initially install the device. I also pushed more data to the target. This was possible with the help of the source and the commented lines in the config file for imx6 (mx6_usb_work.conf).
...
#file:dcd,plug,load nnn,jump [nnn/header/header2]
#jump nnn - header is after last downloaded word

entire file is loaded before jump, needs load nnn as well

i.e. file:load nnn,jump nnn

#jump header - only length parameter is downloaded
#header - uses existing header(error if none), but clears plug and dcd values unless plug also specified
#header2 - uses 2nd header found(error if none)
#plug - without jump uses header but clears plug flag to stop after plug execution
#load nnn - load entire file to address
#../u-boot-imx6/u-boot.bin:dcd,plug,jump header
...

What I figured out so far:
#file:dcd,plug,load nnn,jump [nnn/header/header2]

dcd - this flags if the uploaded images contains a dcd or not.
clear_dcd, - this skips the execution of the dcd. Maybe skip_dcd we have been a better name.

#jump nnn - header is after last downloaded word

entire file is loaded before jump, needs load nnn as well

The jump header/header2 command makes only sense in combination of a dcd contained or maybe plug image. I am not sure what header2 exactly is.

plug - without jump uses header but clears plug flag to stop after plug execution

I am a little confused about this. I not had really gathered a jigsaw puzzle peaces in place.

load nnn - load entire file to address

For me this was only applicable to none dcd images. Otherewise the dcd was parsed and the image loaded to the containing address.

I got things working when I did the following steps:

  1. Load a dcd enabled image to the target. This will setup the DDR-RAM and upload the image. For the first Image no jump is allowed.
  2. Now mostly any image can be uploaded to the target. "But keep in mind that u-boot" writes to some portions of the memory to detect the size of the memory while booting.
  3. After everything is in place a image which can be execute can be loaded into RAM. For this image I had to use the command "clear_dcd". Otherwise the dcd is executed a second time which will cause a system which is noct booting.

I had some really trouble to boot a pure .bin image without dcd. I tried to upload the image with load and then execute a jump. The board was not booting. Then I remembered after execution of the ROM Code the CPU maybe is still in Thumb mode and I tried to prepend the image with a hack to switch from thum to arm what we are using during BDM debugging. But the board is still not booting. Maybe I'll debug this with BDI/PEEDI.

i.MX6ul refuses to be programmed/debricked

Hello there,
I have a very strange problem. I have a Evaluation-Kit for the i.MX6ul which is working perfectly fine with the imx_usart and imx_usb tools provided here. So that is working fine for reference. My setup should be OK and the Barebox Image I'm trying to flash also.
Then I have two prototypes of our custom board who refuse to be flashed either by imx_usb or imx_usart. The USB and Serial interface should both work fine because they work well in our applications on these boards. Both prototypes got flashed with bad bootloaders/kernels during development and probably have broken NAND data. So they boot into the Serial Downloader Mode and I try to "debrick" them. (Side note: same behaviour is witnessed if I solder the boot pins to directly start the Serial Downloader mode)
The imx_usart is giving more debug data so I'll post that output here. This is the working Evaluation-Kit, everything as it should be:

trailing slash == 0x6092c1:/mx6_usb_work.conf
checking with conf_path /usr/etc/imx-loader.d/
checking with base_path ./
config file <.//mx6_usb_work.conf>
parse .//mx6_usb_work.conf
sending command cmd=0505
do_command err=0, last_trans=16
report 3 in err=0, last_trans=4  56 78 78 56
HAB security state: development mode (0x56787856)
report 4 in err=0, last_trans=4  f0 f0 f0 f0
== work item
filename /media/sf_fileshare/tftpserv/barebox.bin
load_size 0 bytes
load_addr 0x00000000
dcd 1
clear_dcd 0
plug 1
jump_mode 3
jump_addr 0x00000000
== end work item
process_header: header_offset=400, 402000d1
loading DCD table @0x910000
sending command cmd=0a0a
do_command err=0, last_trans=16

<<<496, 496 bytes>>>
report 3 in err=0, last_trans=4  56 78 78 56
report 4 in err=0, last_trans=4  12 8a 8a 12
succeeded (security 0x56787856, status 0x128a8a12)
dcd_ptr=0x8000042c
clear dcd_ptr=0x8000042c
skip=0 cnt=4000 dladdr=80000000 file_base=80000000 fsize=680c5 max_length=69000

loading binary file(/media/sf_fileshare/tftpserv/barebox.bin) to 80000000, skip=0, fsize=680c5 type=aa
sending command cmd=0404
do_command err=0, last_trans=16
load_file:foffset=0, cnt=400, remaining=680c5
load_file:foffset=400, cnt=400, remaining=67cc5
and so on and so on.... the rest is programmed fine and the barebox is flashed

and that is the behavior of our custom boards, both the same

trailing slash == 0x6092c1:/mx6_usb_work.conf
checking with conf_path /usr/etc/imx-loader.d/
checking with base_path ./
config file <.//mx6_usb_work.conf>
parse .//mx6_usb_work.conf
sending command cmd=0505
do_command err=0, last_trans=16
report 3 in err=0, last_trans=4  56 78 78 56
HAB security state: development mode (0x56787856)
report 4 in err=0, last_trans=4  33 33 33 33
== work item
filename /media/sf_fileshare/tftpserv/barebox.bin
load_size 0 bytes
load_addr 0x00000000
dcd 1
clear_dcd 0
plug 1
jump_mode 3
jump_addr 0x00000000
== end work item
process_header: header_offset=400, 402000d1
loading DCD table @0x910000
sending command cmd=0a0a
do_command err=0, last_trans=16

<<<496, 496 bytes>>>

and than it just stops, no error or cancel, just stops. The only difference I can see is the status return after HAB security state. Its 0F 0F 0F 0F on the working board and 33 33 33 33 on the customs. What does that mean?
I never knowingly messed around with HAB, security bootloaders or eFuses for that matter. The only thing I did was programming the Boot-eFuses to boot from internal NAND with 512MB and that was a long time ago.
Is there something I'm doing wrong on our custom boards?
Any help appreciated, best regards,
Patrick

imx_usb and imx6ul doesn't work

Hi,

I am facing following issue with imx6ul

config file <.//imx_usb.conf>
vid=0x066f pid=0x3780 file_name=mx23_usb_work.conf
vid=0x15a2 pid=0x004f file_name=mx28_usb_work.conf
vid=0x15a2 pid=0x0052 file_name=mx50_usb_work.conf
vid=0x15a2 pid=0x0054 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0061 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0063 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0071 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x007d file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0080 file_name=mx6ull_usb_work.conf
vid=0x1fc9 pid=0x0128 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0076 file_name=mx7_usb_work.conf
vid=0x1fc9 pid=0x0126 file_name=mx7ulp_usb_work.conf
vid=0x15a2 pid=0x0041 file_name=mx51_usb_work.conf
vid=0x15a2 pid=0x004e file_name=mx53_usb_work.conf
vid=0x15a2 pid=0x006a file_name=vybrid_usb_work.conf
vid=0x066f pid=0x37ff file_name=linux_gadget.conf
vid=0x1b67 pid=0x4fff file_name=mx6_usb_sdp_spl.conf
vid=0x0525 pid=0xb4a4 file_name=mx6_usb_sdp_spl.conf
vid=0x1fc9 pid=0x012b file_name=mx8mq_usb_work.conf
vid=0x1fc9 pid=0x0134 file_name=mx8mm_usb_work.conf
vid=0x3016 pid=0x1000 file_name=mx8mm_usb_sdp_spl.conf
vid=0x3016 pid=0x1001 file_name=mx8mq_usb_sdp_spl.conf
config file <.//mx6_usb_work.conf>
parse .//mx6_usb_work.conf
Trying to open device vid=0x15a2 pid=0x007d
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename uboot-imx-2015.04.imx
load_size 0 bytes
load_addr 0x00000000
dcd 1
clear_dcd 0
plug 1
jump_mode 3
jump_addr 0x00000000
== end work item
Segmentation fault

Nitrogen8MM SOM can't be flashed with current version

Hi,
today I wanted to flash a custom U-Boot version to my Nitrogen8MM SOM (using a Boundary Devices carrier board). However it didn't work in the current version (25d6c0d) although it was possible ~2 months ago (with revision f009770).

Here's what I did:
$ sudo ./imx_usb ../u-boot-imx6/flash.bin
$ sudo ./imx_usb

config file <.//imx_usb.conf>
vid=0x066f pid=0x3780 file_name=mx23_usb_work.conf
vid=0x15a2 pid=0x004f file_name=mx28_usb_work.conf
vid=0x15a2 pid=0x0052 file_name=mx50_usb_work.conf
vid=0x15a2 pid=0x0054 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0061 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0063 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0071 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x007d file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0080 file_name=mx6ull_usb_work.conf
vid=0x1fc9 pid=0x0128 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0076 file_name=mx7_usb_work.conf
vid=0x1fc9 pid=0x0126 file_name=mx7ulp_usb_work.conf
vid=0x15a2 pid=0x0041 file_name=mx51_usb_work.conf
vid=0x15a2 pid=0x004e file_name=mx53_usb_work.conf
vid=0x15a2 pid=0x006a file_name=vybrid_usb_work.conf
vid=0x066f pid=0x37ff file_name=linux_gadget.conf
vid=0x1b67 pid=0x4fff file_name=mx6_usb_sdp_spl.conf
vid=0x0525 pid=0xb4a4 file_name=mx6_usb_sdp_spl.conf
vid=0x1fc9 pid=0x012b file_name=mx8mq_usb_work.conf
vid=0x1fc9 pid=0x0134 file_name=mx8mm_usb_work.conf
vid=0x1fc9 pid=0x013e file_name=mx8mn_usb_work.conf
vid=0x3016 pid=0x1001 file_name=mx8m_usb_sdp_spl.conf
no matching USB device found

That's how my SOM enumerates when plugged in in flash mode:

usb 1-1: USB disconnect, device number 49
usb 1-1: new high-speed USB device number 50 using xhci_hcd
usb 1-1: New USB device found, idVendor=3016, idProduct=1000, bcdDevice= 2.21
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1: Product: USB download gadget
usb 1-1: Manufacturer: Boundary
hid-generic 0003:3016:1000.0052: hiddev0,hidraw0: USB HID v1.10 Device [Boundary USB download gadget] on usb-0000:00:14.0-1/input0

After going back to revision f009770 flashing succeeded.

DCD Table error - Windows

Hi,
When trying to load a .imx, I got the following error :

C:\workdir\imx_usb_loader\msvc\imx_usb\Debug>imx_usb.exe burner.imx config file <C:\workdir\imx_usb_loader\msvc\imx_usb\Debug\imx_usb.conf>
vid=0x066f pid=0x3780 file_name=mx23_usb_work.conf
vid=0x15a2 pid=0x004f file_name=mx28_usb_work.conf
vid=0x15a2 pid=0x0052 file_name=mx50_usb_work.conf
vid=0x15a2 pid=0x0054 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0061 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0063 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0071 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x007d file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0080 file_name=mx6_usb_work.conf
vid=0x1fc9 pid=0x0128 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0076 file_name=mx7_usb_work.conf
vid=0x1fc9 pid=0x0126 file_name=mx7ulp_usb_work.conf
vid=0x15a2 pid=0x0041 file_name=mx51_usb_work.conf
vid=0x15a2 pid=0x004e file_name=mx53_usb_work.conf
vid=0x15a2 pid=0x006a file_name=vybrid_usb_work.conf
vid=0x066f pid=0x37ff file_name=linux_gadget.conf
vid=0x1b67 pid=0x4fff file_name=mx6_usb_sdp_spl.conf
vid=0x0525 pid=0xb4a4 file_name=mx6_usb_sdp_spl.conf
config file <C:\workdir\imx_usb_loader\msvc\imx_usb\Debug\mx6_usb_work.conf>
parse C:\workdir\imx_usb_loader\msvc\imx_usb\Debug\mx6_usb_work.conf
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename burner.imx
load_size 0 bytes
load_addr 0x00000000
dcd 1
clear_dcd 0
plug 1
jump_mode 2
jump_addr 0x00000000
== end work item
loading DCD table @0x910000
out err=-2, last_trans=0 cnt=0x1e8 max=0x400 transferSize=0x0 retry=0
out err=-2, last_trans=0 cnt=0x1e8 max=0x200 transferSize=0x0 retry=1
out err=-2, last_trans=0 cnt=0x1e8 max=0x100 transferSize=0x0 retry=2
out err=-2, last_trans=0 cnt=0x1e8 max=0x80 transferSize=0x0 retry=3
out err=-2, last_trans=0 cnt=0x1e8 max=0x40 transferSize=0x0 retry=4
out err=-2, last_trans=0 cnt=0x1e8 max=0x20 transferSize=0x0 retry=5
out err=-2, last_trans=0 cnt=0x1e8 max=0x10 transferSize=0x0 retry=6
out err=-2, last_trans=0 cnt=0x1e8 max=0x8 transferSize=0x0 retry=7
out err=-2, last_trans=0 cnt=0x1e8 max=0x10 transferSize=0x0 retry=8
out err=-2, last_trans=0 cnt=0x1e8 max=0x8 transferSize=0x0 retry=9
out err=-2, last_trans=0 cnt=0x1e8 max=0x10 transferSize=0x0 retry=10
Giving up
!!perform_dcd returned -2
DoIRomDownload failed, err=-2
HAB security state: development mode (0x56787856)

It was compiled successfully but still no idea how to get rid of this...

Thank you very much for helping :)
Regards,
Grégoire

Unable to boot bootloader on HAB closed i.MX7D rev D processor

We are working on a custom application using the iMX7D processor and part of our design is to use secure boot. As a result, we will be blowing fuses to program the SRK fuses with our public key hashes and blowing the fuse to put the device into a HAB Closed configuration so that only binaries signed with our private key will be bootable on the processor.

We are able to use uuu with no issues while the processor has not yet had its HAB configuration closed but as soon as we close the configuration, we are unable to boot the processor using any USB serial loader program.

We have followed the instructions described in AN4581 to be able to make a bootloader that can be booted via USB serial loader (since there are some modifications to the process required) but the modified bootloader signed in the fashion described in AN4581 will only boot on a HAB closed i.MX7D rev C processor. We cannot get this binary to boot on an i.MX7D rev D processor.

AN4581 mentions an errata, E11166, for the i.MX7D rev D processor that indicates that the first 4K of OCRAM is not available during boot time and the image start address must be greater or equal to 0x911000. Tests with our JTAG debugger show that the USB loaders manage to send the DCD data to OCRAM location 0x910000 correctly. The debugger shows DDR memory as empty, despite the USB tools reporting that they successfully sent the data.

Is there a modification required to the U-boot signing process that is different from the process described in AN4581 in order to use this tool to boot it on a HAB closed i.MX7D rev D processor? Or is there a change that must be made to imx_usb_loader to make it properly boot?

Some help would be very greatly appreciated!!!

imx_usb cause kworker to consume 100% of a core.

Each time I run imx_usb kworker consumes 100% CPU of one core and never frees, though imx_usb exits.
I can consume all cores by rerunning imx_usb

Am I doing something wrong?

At commit 349286e

My mx6_usb_work.conf
mx6_qsb
hid,1024,0x10000000,1G,0x00907000,0x31000
u-boot-mfg.imx:dcd
bench-test-fpga.bit:load 0x11000000
uImage-mfg:load 0x12000000
initramfs.cpio.gz.uboot:load 0x12C00000
uImage-mfg.dtb:load 0x18000000
u-boot-mfg.imx:clear_dcd,load,plug,jump header

Invocation:
make clean
make
./imx_usb -c ./

Distribution: Gentoo
emerge --info

Portage 2.2.26 (python 2.7.10-final-0, default/linux/amd64/13.0/desktop/kde, gcc-4.9.3, glibc-2.21-r1, 4.1.12-gentoo x86_64)

System uname: Linux-4.1.12-gentoo-x86_64-Intel-R-_Core-TM-i5-2540M_CPU@_2.60GHz-with-gentoo-2.2
KiB Mem: 12156952 total, 1009348 free
KiB Swap: 53809876 total, 53809876 free
Timestamp of repository gentoo: Tue, 09 Feb 2016 17:45:01 +0000
sh bash 4.3_p42-r1
ld GNU ld (Gentoo 2.25.1 p1.1) 2.25.1
app-shells/bash: 4.3_p42-r1::gentoo
dev-java/java-config: 2.2.0::gentoo
dev-lang/perl: 5.20.2::gentoo
dev-lang/python: 2.7.10-r1::gentoo, 3.4.3-r1::gentoo
dev-util/cmake: 3.3.1-r1::gentoo
dev-util/pkgconfig: 0.28-r2::gentoo
sys-apps/baselayout: 2.2::gentoo
sys-apps/openrc: 0.19.1::gentoo
sys-apps/sandbox: 2.10-r1::gentoo
sys-devel/autoconf: 2.13::gentoo, 2.69::gentoo
sys-devel/automake: 1.10.3-r1::gentoo, 1.11.6-r1::gentoo, 1.12.6::gentoo, 1.13.4::gentoo, 1.14.1-r1::gentoo, 1.15::gentoo
sys-devel/binutils: 2.25.1-r1::gentoo
sys-devel/gcc: 4.8.5::gentoo, 4.9.3::gentoo
sys-devel/gcc-config: 1.7.3::gentoo
sys-devel/libtool: 2.4.6::gentoo
sys-devel/make: 4.1-r1::gentoo
sys-kernel/linux-headers: 4.3::gentoo (virtual/os-headers)
sys-libs/glibc: 2.21-r1::gentoo
Repositories:

gentoo
location: /usr/portage
sync-type: rsync
sync-uri: rsync://rsync.namerica.gentoo.org/gentoo-portage
priority: -1000

local_overlay
location: /usr/local/portage
masters: gentoo
priority: 0

java
location: /var/lib/layman/java
masters: gentoo
priority: 50

ACCEPT_KEYWORDS="amd64"
ACCEPT_LICENSE="*"
CBUILD="x86_64-pc-linux-gnu"
CFLAGS="-march=core2 -mtune=generic -O2 -pipe"
CHOST="x86_64-pc-linux-gnu"
CONFIG_PROTECT="/etc /etc/stunnel/stunnel.conf /usr/lib64/libreoffice/program/sofficerc /usr/share/config /usr/share/gnupg/qualified.txt /var/lib/hsqldb"
CONFIG_PROTECT_MASK="/etc/ca-certificates.conf /etc/dconf /etc/env.d /etc/fonts/fonts.conf /etc/gconf /etc/gentoo-release /etc/php/apache2-php5.5/ext-active/ /etc/php/apache2-php5.6/ext-active/ /etc/php/cgi-php5.5/ext-active/ /etc/php/cgi-php5.6/ext-active/ /etc/php/cli-php5.5/ext-active/ /etc/php/cli-php5.6/ext-active/ /etc/revdep-rebuild /etc/sandbox.d /etc/splash /etc/terminfo /etc/texmf/language.dat.d /etc/texmf/language.def.d /etc/texmf/updmap.d /etc/texmf/web2c"
CXXFLAGS="-march=core2 -mtune=generic -O2 -pipe"
DISTDIR="/usr/portage/distfiles"
EMERGE_DEFAULT_OPTS="--dynamic-deps=n"
FCFLAGS="-O2 -pipe"
FEATURES="assume-digests binpkg-logs config-protect-if-modified distlocks ebuild-locks fixlafiles merge-sync news parallel-fetch preserve-libs protect-owned sandbox sfperms strict unknown-features-warn unmerge-logs unmerge-orphans userfetch userpriv usersandbox usersync xattr"
FFLAGS="-O2 -pipe"
GENTOO_MIRRORS="http://distfiles.gentoo.org"
LANG="en_US.UTF-8"
LDFLAGS="-Wl,-O1 -Wl,--as-needed"
MAKEOPTS="-j5"
PKGDIR="/usr/portage/packages"
PORTAGE_CONFIGROOT="/"
PORTAGE_RSYNC_OPTS="--recursive --links --safe-links --perms --times --omit-dir-times --compress --force --whole-file --delete --stats --human-readable --timeout=180 --exclude=/distfiles --exclude=/local --exclude=/packages"
PORTAGE_TMPDIR="/var/tmp"
USE="X a52 aac aalib accessibility acl acpi addc alsa amd64 apache2 arts asf autoipd avahi avi bash-completion berkdb bitmap-fonts bluetooth bookmarks branding bzip2 cairo cdda cdr cjkcodecs cleartype cli commons-codec consolekit corefonts cracklib crypt cups cxx dbus declarative divx4linux dri dsk dts dv dvd dvdnav dvdr dvdread emboss encode evolution exif exscalibar faacc faad fam ffmpeg fftw firefox flac fontconfig foomaticdb fortran frame fuse gd gdbm gif gimpprint glamor gphoto2 gpm gs gtk gtk2 gudev iconv iconvcodec icu ipod ipv6 jasper jpeg kde kde-meta kdexdeltas kerberos kipi krb5 lcms ldap libdv libnotify libtheora mad madwifi midi mmx mmxext mng modules mp3 mp4 mpeg mppe-mppc multilib mysql ncurses nls nptl nptlonly ogg opengl openmp openrc oss pam pango pcre pda pdf phonon plasma png policykit ppds profile python qt3support qt4 quicktime rar readline real samba sdl seccomp semantic-desktop session spell sql sse sse2 ssl startup-notification subtitles svg tcpd tga theora tiff truetype truetypelive type1 udev udisks unicode upower usb v4l v4l2 vaapi vdpau vorbis win32codecs wxwidgets x264 xattr xcb xcomposite xext ximian-connector xinerama xml xml2 xmms xscreensaver xv xvid zlib zvbi" ABI_X86="64" ALSA_CARDS="hda-intel" APACHE2_MODULES="actions alias auth_basic auth_digest authn_anon authn_dbd authn_dbm authn_default authn_file authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache cgi cgid dav dav_fs dav_lock dbd deflate dir disk_cache env expires ext_filter file_cache filter headers ident imagemap include info log_config logio mem_cache mime mime_magic negotiation proxy proxy_ajp proxy_balancer proxy_connect proxy_http rewrite setenvif so speling status unique_id userdir usertrack vhost_alias perl vdpau proxy_ajp" CALLIGRA_FEATURES="kexi words flow plan sheets stage tables krita karbon braindump author" CAMERAS="ptp2" COLLECTD_PLUGINS="df interface irq load memory rrdtool swap syslog" CPU_FLAGS_X86="mmx mmxext sse sse2" ELIBC="glibc" GPSD_PROTOCOLS="ashtech aivdm earthmate evermore fv18 garmin garmintxt gpsclock itrax mtk3301 nmea ntrip navcom oceanserver oldstyle oncore rtcm104v2 rtcm104v3 sirf superstar2 timing tsip tripmate tnt ublox ubx" INPUT_DEVICES="evdev synaptics" KERNEL="linux" LCD_DEVICES="bayrad cfontz cfontz633 glk hd44780 lb216 lcdm001 mtxorb ncurses text" LIBREOFFICE_EXTENSIONS="presenter-console presenter-minimizer" LINGUAS="en" OFFICE_IMPLEMENTATION="libreoffice" PHP_TARGETS="php5-5" PYTHON_SINGLE_TARGET="python3_4" PYTHON_TARGETS="python3_4 python2_7" RUBY_TARGETS="ruby20 ruby21" SANE_BACKENDS="genesys" USERLAND="GNU" VIDEO_CARDS="nvidia intel" XTABLES_ADDONS="quota2 psd pknock lscan length2 ipv4options ipset ipp2p iface geoip fuzzy condition tee tarpit sysrq steal rawnat logmark ipmark dhcpmac delude chaos account"
USE_PYTHON="2.7 3.4"
Unset: CC, CPPFLAGS, CTARGET, CXX, INSTALL_MASK, LC_ALL, PORTAGE_BUNZIP2_COMMAND, PORTAGE_COMPRESS, PORTAGE_COMPRESS_FLAGS, PORTAGE_RSYNC_EXTRA_OPTS

Cannot download u-boot with plugin on iMX6

Dear developers,
I'm working with iMX6, using u-boot with plugin configuration (instead of DCD).
In my experience imx_usb_loader is not working out-of-the-box with this configuration: it hangs right after running the plugin code because (IIUC) once plugin code return control to bootrom, the USB device is removed and plugged in again.

I've solve this issue with a simple workaround: I have two mx6_usb_work.conf to run in sequence, the first with the following configuration

mx6_qsb
hid,1024,0x10000000,1G,0x00907000,0x31000
u-boot.imx:plug

and the second defined as

mx6_qsb
hid,1024,0x10000000,1G,0x00907000,0x31000
u-boot.imx:load 0x13f00000
u-boot.imx:jump header

Between the two I just put a short delay to wait for USB enumeration.

Am I missing something?
Is it possibile the two work into a single configuration file?

TIA,

Andrea

imx6ul dart

I don't know how to use this tool and what to expect from it.
I have a u-boot.bin and u-boot.img built by the Variscite build process.
I have a u-boot-sdcard.bin and u-boot-emmc.bin (they work fine booting accordingly)
Now I have the board off it's 'variscite mother board' no SDCARD. It stills boot
on eMMC, but we want to be able to recover from a bricked board.
I booted and stopped at the 'factory' eMMC u-boot.
I plugged the micro USB and

[23158.357622] usb 1-2: new full-speed USB device number 10 using xhci_hcd
[23158.512863] usb 1-2: New USB device found, idVendor=0403, idProduct=6015, bcdDevice=10.00
[23158.512868] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[23158.512871] usb 1-2: Product: FT230X Basic UART
[23158.512875] usb 1-2: Manufacturer: FTDI
[23158.512877] usb 1-2: SerialNumber: DO01T3PD
[23158.519429] ftdi_sio 1-2:1.0: FTDI USB Serial Device converter detected
[23158.519518] usb 1-2: Detected FT-X
[23158.520378] usb 1-2: FTDI USB Serial Device converter now attached to ttyUSB0

Then

linux/tools/imx_usb_loader$ ./imx_uart -d /dev/ttyUSB0  mx6ull_usb_work.conf ./u-boot.bin 
trailing slash == 0x560f92136161:/imx_uart
checking with conf_path /usr/etc/imx-loader.d/
checking with base_path ./
config file <.//mx6ull_usb_work.conf>
parse .//mx6ull_usb_work.conf
starting associating phase
association phase succeeded, response was 0x23454523
sending command cmd=0505
do_command err=0, last_trans=16

And I wait here for 5 min so. What should happen, or what shoud I do next ?

Used uninitialized variable

In the error case (else) of parse_mem_work, the variable i remains uninitialized and is used later-on. My compiler throws the following warning:

cc -c imx_loader_config.c -o imx_loader_config.o -pipe -ggdb -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSCONFDIR='"/usr/etc"' -DREL_SYSCONFDIR='"../etc"'
imx_loader_config.c:209:13: warning: variable 'i' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
        } else if (strncmp(p, "modify", 6) == 0) {
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
imx_loader_config.c:216:11: note: uninitialized use occurs here
        w.type = i;
                 ^
imx_loader_config.c:209:9: note: remove the 'if' if its condition is always true
        } else if (strncmp(p, "modify", 6) == 0) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
imx_loader_config.c:196:16: note: initialize the variable 'i' to silence this warning
        unsigned int i;
                      ^
                       = 0

See

Release a tagged version

I went to submit a Homebrew Formula for this project, but Homebrew will not accept submissions if the project is a bare repository with no releases or versioning scheme. Please tag a release, and I'd be happy to finish submitting the Formula.

macOS High Sierra support.

On macOS High Sierra, sudo kextunload -b com.apple.driver.usb.IOUSBHostHIDDevice fails, meaning that imx_usb cannot be used at all.

Cannot flash uboot to i.MX8M

I followed the instructions in Readme, but when I tried to use sudo ./imx_usb ~/u-boot.nitrogen8m to flash my board, I had this output :

config file <.//imx_usb.conf>
vid=0x066f pid=0x3780 file_name=mx23_usb_work.conf
vid=0x15a2 pid=0x004f file_name=mx28_usb_work.conf
vid=0x15a2 pid=0x0052 file_name=mx50_usb_work.conf
vid=0x15a2 pid=0x0054 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0061 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0063 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0071 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x007d file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0080 file_name=mx6ull_usb_work.conf
vid=0x1fc9 pid=0x0128 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0076 file_name=mx7_usb_work.conf
vid=0x1fc9 pid=0x0126 file_name=mx7ulp_usb_work.conf
vid=0x15a2 pid=0x0041 file_name=mx51_usb_work.conf
vid=0x15a2 pid=0x004e file_name=mx53_usb_work.conf
vid=0x15a2 pid=0x006a file_name=vybrid_usb_work.conf
vid=0x066f pid=0x37ff file_name=linux_gadget.conf
vid=0x1b67 pid=0x4fff file_name=mx6_usb_sdp_spl.conf
vid=0x0525 pid=0xb4a4 file_name=mx6_usb_sdp_spl.conf
vid=0x1fc9 pid=0x012b file_name=mx8mq_usb_work.conf
vid=0x1fc9 pid=0x0134 file_name=mx8mm_usb_work.conf
vid=0x3016 pid=0x1000 file_name=mx8mm_usb_sdp_spl.conf
config file <.//mx8mq_usb_work.conf>
parse .//mx8mq_usb_work.conf
Trying to open device vid=0x1fc9 pid=0x012b
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename /home/chroot/u-boot.nitrogen8m
load_size 0 bytes
load_addr 0x00000000
dcd 1
clear_dcd 0
plug 1
jump_mode 3
jump_addr 0x00000000
== end work item
No DCD table

loading binary file(/home/chroot/u-boot.nitrogen8m) to 32c10000, skip=1c00, fsize=18000 type=aa

<<<98304, 98304 bytes>>>
succeeded (security 0x56787856, status 0x88888888)

loading binary file(/home/chroot/u-boot.nitrogen8m) to 007e0bc0, skip=19c00, fsize=28000 type=aa

<<<163840, 163840 bytes>>>
succeeded (security 0x56787856, status 0x88888888)
jumping to 0x007e0fc0
failed (security 0x56787856, status 0x3311cf00)

My board is Nitrogen8m. And the uboot is downloaded from this site. I have tried to build the uboot on my own, but that didn't work neither.

Anyone knows what's wrong?

i.MX6 fails to boot into Mfg Linux image mode

Im working on a custom imx6 device which is based on imx6 solo but with 512M of RAM instead of 1G.
Im trying to migrate from using Windows and MfgTool (works, but is quite cumbersome) to Linux with this guide (https://community.nxp.com/thread/441563), but Im having problems getting the board boot to "linux gadget" mode.

I've copied zImage, u-boot, initrd image and dtb which are working on Windows side from the "firmware" folder of mfgtool to imx_usb_loader/firmware folder.
The mx6_usb_work.conf looks like this:

imx6-sabresd
#hid/bulk,[old_header,]max packet size, {ram start, ram size}(repeat valid ram areas)
hid,1024,0x10000000, 512M
# Note; only dcd as first step (setup ram)
firmware/u-boot-imx6dlsabresd_sd.imx:dcd
# Then load a kernel with initramfs (self contained linux) at known address
firmware/zImage:load 0x12000000
firmware/fsl-image-mfgtool-initramfs-imx6sxsabresd.cpio.gz.u-boot: load 0x12C00000
firmware/zImage-imx6dl-sabresd.dtb: load 0x18000000
# Now, we load a u-boot that expects preloaded software at known adress
# Note, to make this boot, the clear_dcd field seems necessary
firmware/u-boot-imx6dlsabresd_sd.imx:clear_dcd,load,plug,jump header

Now when I run the imx_usb tool, this is what happens:

jlumme@vbox:~/imx_usb_loader$ sudo ./imx_usb
config file <.//imx_usb.conf>
vid=0x066f pid=0x3780 file_name=mx23_usb_work.conf
vid=0x15a2 pid=0x004f file_name=mx28_usb_work.conf
vid=0x15a2 pid=0x0052 file_name=mx50_usb_work.conf
vid=0x15a2 pid=0x0054 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0061 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0063 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0071 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x007d file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0080 file_name=mx6_usb_work.conf
vid=0x1fc9 pid=0x0128 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0076 file_name=mx7_usb_work.conf
vid=0x1fc9 pid=0x0126 file_name=mx7ulp_usb_work.conf
vid=0x15a2 pid=0x0041 file_name=mx51_usb_work.conf
vid=0x15a2 pid=0x004e file_name=mx53_usb_work.conf
vid=0x15a2 pid=0x006a file_name=vybrid_usb_work.conf
vid=0x066f pid=0x37ff file_name=linux_gadget.conf
vid=0x1b67 pid=0x4fff file_name=mx6_usb_sdp_spl.conf
vid=0x0525 pid=0xb4a4 file_name=mx6_usb_sdp_spl.conf
vid=0x1fc9 pid=0x012b file_name=mx8mq_usb_work.conf
config file <.//mx6_usb_work.conf>
parse .//mx6_usb_work.conf
Trying to open device vid=0x15a2 pid=0x0061
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename firmware/u-boot-imx6dlsabresd_sd.imx
load_size 0 bytes
load_addr 0x00000000
dcd 1
clear_dcd 0
plug 0
jump_mode 0
jump_addr 0x00000000
== end work item
loading DCD table @0x10000000
report 2 out err=-7, last_trans=0 len=0x230 max=0x400 retry=10
report 2 out err=-7, last_trans=0 len=0x230 max=0x200 retry=9
report 2 out err=-7, last_trans=0 len=0x230 max=0x100 retry=8
report 2 out err=-7, last_trans=0 len=0x230 max=0x80 retry=7
report 2 out err=-7, last_trans=0 len=0x230 max=0x40 retry=6
report 2 out err=-7, last_trans=0 len=0x230 max=0x20 retry=5
report 2 out err=-7, last_trans=0 len=0x230 max=0x10 retry=4
report 2 out err=-7, last_trans=0 len=0x230 max=0x8 retry=3
report 2 out err=-7, last_trans=0 len=0x230 max=0x10 retry=2
report 2 out err=-7, last_trans=0 len=0x230 max=0x8 retry=1
Giving up
clear dcd_ptr=0x177ff42c
!!perform_dcd returned -7
do_download failed, err=-7
do_command err=-7, last_trans=0
do_command err=-7, last_trans=0
do_command err=-7, last_trans=0
do_command err=-7, last_trans=0
do_command err=-7, last_trans=0

Im not really sure what is happening, but it appears that after the first "lading DCD table @..." I see other people have something like:

loading DCD table @0x********

<<<-192, 1024 bytes>>>
succeeded (status 0x128a8a12)
<<<-192, 1024 bytes>>>
succeeded (status 0x128a8a12)

But I start getting these "report 2.." messages... What could be the problem here ?

Header not found error when programming SPL on iMX6

This happened somewhere between commit (master) 04cd5c4 and 869d06b

I'm getting the following error on the latest master commit:

Trying to open device vid=0x15a2 pid=0x0054
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename output/SPL
load_size 0 bytes
load_addr 0x13f00000
dcd 0
clear_dcd 0
plug 0
jump_mode 3
jump_addr 0x00000000
== end work item
header not found 11000:402000d1, 0
DoIRomDownload failed, err=-22
HAB security state: development mode (0x56787856)

This is what it looks like on the older commit:

Trying to open device vid=0x15a2 pid=0x0054
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename output/SPL
load_size 0 bytes
load_addr 0x13f00000
dcd 0
clear_dcd 0
plug 0
jump_mode 3
jump_addr 0x00000000
== end work item

loading binary file(output/SPL) to 00907400, skip=0, fsize=10c00 type=aa

<<<68608, 68608 bytes>>>
succeeded (status 0x88888888)
jumping to 0x00907400
...

This project is unmaintained. Please add this information.

Hi,

In case anyone is wondering what the state of this tool is and what the differences regarding NXP's own UUU tool are:
https://boundarydevices.com/recovering-i-mx-platforms-using-uuu/

The Blog post is from 2020.
Here are the important parts in case the link breaks:

This blog post will introduce the Universal Update Utility (UUU) from NXP.

Introduction

For many years, Freescale provided MFGTools / sb_loader binaries in order to flash empty devices leveraging the USB recovery feature of the i.MX family.

However these tools were only meant for Windows Host. Therefore Boundary Devices decided, back in 2010, to develop its own Linux-based tool called imx-usb-loader.

This latter has been used by many for years, maintained by us with the help of the community.

But in 2018, NXP decided to unify their tools, creating a new one from scratch called UUU.

Let’s see the benefits of using that new tool and how it compares to ours.
UUU Advantages

First of all, UUU provides the same features as imx-usb-loader:

  • Loading bootloader / recovering devices over USB recovery (SDP) protocol
  • Loading any binary in RAM over USB for flashing purposes

But it also includes some new features:

  • Advanced scripting supported to flash any media
  • Fastboot protocol support in both U-Boot and OS (with imx-uuc)

Note that this blog post will focus on the recovery process part, flashing will be covered in another blog post.

We also see the following advantages in using it:

  • Tool maintained by NXP
    • Already supports next generation SoC
  • Tool works the same on Linux and Windows
    • MAC OS should work too, hasn’t been tested
  • Aligning our flashing procedure with NXP
    • Easier for customers
  • Still an open-source project
    • NXP accepts community contributions

What about imx-usb-loader?

As of this writing, Boundary Devices will no longer actively maintain imx-usb-loader.

We will now be focusing on using and contributing to UUU.

That being said, if the community still sees a need for imx-usb-loader, we will still accept pull-requests.

i.MX6ul is not flashing using imx_uart

I'm struggling with downloading u-boot using imx_uart.

I'm using the following command when trying to flash the reference u-boot image

imx_uart -n /dev/ttyUSB0 /usr/etc/imx-loader.d/mx6ull_usb_work.conf /opt/boqpod/gsmbox_firmware/misc/ccimx6ulsbc-installer/u-boot-ccimx6ulsbc1GB.imx

I have no RTC/CTS lines connected, so I'm using '-n' option.

Nevertheless, I'm not sure if I'm doing everything correctly.

Step-by-step.

  1. I'm launching the command
imx_uart -n /dev/ttyUSB0 /usr/etc/imx-loader.d/mx6ull_usb_work.conf /opt/boqpod/gsmbox_firmware/misc/ccimx6ulsbc-installer/u-boot-ccimx6ulsbc1GB.imx

and see the following output

config file </usr/etc/imx-loader.d//mx6ull_usb_work.conf>
parse /usr/etc/imx-loader.d//mx6ull_usb_work.conf
starting associating phase..........

and it fails if the reset button is not pressed.

  1. Once the button is pressed again, the response is seen
association phase succeeded, response was 0x23454523

... and it stalls until I press the reset again.

  1. After I'm pressing the reset again, I see the following
HAB security state: development mode (0x0a0d0a0d)
== work item
filename /opt/boqpod/gsmbox_firmware/misc/ccimx6ulsbc-installer/u-boot-ccimx6ulsbc1GB.imx
load_size 0 bytes
load_addr 0x00000000
dcd 1
clear_dcd 0
plug 1
jump_mode 3
jump_addr 0x00000000
== end work item
loading DCD table @0x910000

<<<520, 520 bytes>>>
failed (security 0x74206361, status 0x7573653a)
clear dcd_ptr=0x877ff42c

loading binary file(/opt/boqpod/gsmbox_firmware/misc/ccimx6ulsbc-installer/u-boot-ccimx6ulsbc1GB.imx) to 877ff400, skip=0, fsize=b1c00 type=aa

It takes 1 minute to 'load' the binary and that's what I see in the end

<<<728064, 728064 bytes>>>
failed (security 0x07070707, status 0x07070707)
jumping to 0x877ff400
failed (security 0x07070707, status 0x07070707)

Could somebody please explain if I'm doing smth wrong and how to flash the binary properly.

Best regards.

imx_usb and imx6ul doesn't work

I used "git bisect" and find commit 6deb910 break booting.

Output:
config file </tmp/root/etc/imx-loader.d//imx_usb.conf>
vid=0x066f pid=0x3780 file_name=mx23_usb_work.conf
vid=0x15a2 pid=0x004f file_name=mx28_usb_work.conf
vid=0x15a2 pid=0x0052 file_name=mx50_usb_work.conf
vid=0x15a2 pid=0x0054 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0061 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0063 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0071 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x007d file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0076 file_name=mx7_usb_work.conf
vid=0x15a2 pid=0x0041 file_name=mx51_usb_work.conf
vid=0x15a2 pid=0x004e file_name=mx53_usb_work.conf
vid=0x15a2 pid=0x006a file_name=vybrid_usb_work.conf
vid=0x066f pid=0x37ff file_name=linux_gadget.conf
config file </tmp/root/etc/imx-loader.d//mx6_usb_work.conf>
parse /tmp/root/etc/imx-loader.d//mx6_usb_work.conf
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename /home/kaa/projects/uboot-imx6_ul/u-boot.imx
load_size 0 bytes
load_addr 0x00000000
dcd 1
clear_dcd 0
plug 1
jump_mode 2
jump_addr 0x00000000
== end work item
loading DCD table @0x910000

<<<-528, 1024 bytes>>>
succeeded (status 0x128a8a12)

loading binary file(/home/kaa/projects/uboot-imx6_ul/u-boot.imx) to 877ff400, skip=0, fsize=59c00 type=aa
out err=-7, last_trans=0 cnt=0x4000 max=0x400 transferSize=0x0 retry=0
out err=-7, last_trans=0 cnt=0x4000 max=0x200 transferSize=0x0 retry=1
out err=-7, last_trans=0 cnt=0x4000 max=0x100 transferSize=0x0 retry=2
out err=-7, last_trans=0 cnt=0x4000 max=0x80 transferSize=0x0 retry=3
out err=-7, last_trans=0 cnt=0x4000 max=0x40 transferSize=0x0 retry=4
out err=-7, last_trans=0 cnt=0x4000 max=0x20 transferSize=0x0 retry=5
out err=-7, last_trans=0 cnt=0x4000 max=0x10 transferSize=0x0 retry=6
out err=-7, last_trans=0 cnt=0x4000 max=0x8 transferSize=0x0 retry=7
out err=-7, last_trans=0 cnt=0x4000 max=0x10 transferSize=0x0 retry=8
out err=-7, last_trans=0 cnt=0x4000 max=0x8 transferSize=0x0 retry=9
out err=-7, last_trans=0 cnt=0x4000 max=0x10 transferSize=0x0 retry=10
Giving up
DoIRomDownload failed, err=-7
HAB security state: development mode (0x00000000)

imx_usb can not make

Hi,

My host PC is ubuntu 14.04LTS and I clone this code then make it but I got an error show as below.

realpath: invalid option -- 'm'
Usage:
realpath [-s|--strip] [-z|--zero] filename ...
realpath -h|--help
realpath -v|--version

I check the makefile and found this command

rel_sysconfdir = $(shell realpath -m --relative-to=$(bindir) $(sysconfdir))

It seems the realpath does not support -m option.
How can I solve this issue?

Thank you.

Regards,

Lucas
`

[Windows] libusb_open fails with error code -4

Hello,

I cross-compiled libusb and the imx_usb utility for windows (mingw64 toolchain), but an error occurred as it was trying to open the imx_device after detecting it ( -4 DEVICE_NOT_FOUND ).

I got rid of the problem by commenting out the libusb_free_device_list unref call (right after find_imx_dev).
As it's stated in the libusb documentation, "Be careful not to unreference a device you are about to open until after you have opened it."

I'm surprised I'm the only one reporting this, am I missing something ?

Tested on windows 7 64 bit and windows 10 64 bit.

imx_usb for bulk devices broken?

Hello,

I am working on cleaning up the code a bit. I came across the following strange statement:

if (p_id->mode == MODE_HID) if (type == FT_APP) {

It leads to the fact that jump command is not executed for bulk devices (MX51/MX53).

I think this creept in accidentially since in that stament there is another if which checks for HID, and since the jump command seemed to be sent unconditionally before:

166097f

Anybody uses imx_usb_loader with such a device recently?

Recent Updates Broke imx_usb

I am using an i.MX6UL processor with the imx_usb tool. I was using the tool from commit 349286e and everything worked fine. Upon updating to the tool from commit 48a85c0, I am no longer able to boot my board with the same configuration file and same u-boot.imx file. The imx_usb program output makes it look like it worked, but the board never boots u-boot.

My imx_usb.conf file contains the following:

0x15a2:0x007d, imx6.conf

My imx6.conf file contains the following:

mx6ul
hid,1024,0x80000000,128M,0x00907000,0x31000
u-boot.imx-mfgtool:dcd,plug
u-boot.imx-mfgtool:jump header

Fixes for iMX6UL via UART

Hi,

I've been fooling around with bootstrapping the iMX6UL EVK via serial, and I had to make some changes. The shortlog looks like this:

0554bd7 Add debugmode for UART method
8354f46 Protocol changes required for UART mode to work on i.MX6UL
c86fdf2 Example work file for iMX6UL using UART
aae2439 Add "-N" to skip UART association phase

patches-imx_usb_loader.zip

config file search order

I find the default config search order a little unintuitive. The first priority is the ./imx_usb executable's path, which is located in this git repo's root folder. There is also a imx_usb.conf file commited there.

As a result, the config argument ./imx_usb -c /home/user/usb-config-dir has no effect since the repository's imx_usb.conf is always found first. It either has to be deleted, or you have to copy/symlink imx_usb out of its repo root folder.

Reversing the config-path ordering solves my problem. Please consider applying this simple fix:

diff --git a/imx_sdp.c b/imx_sdp.c
index 3dec8d5..d525fcc 100644
--- a/imx_sdp.c
+++ b/imx_sdp.c
@@ -156,15 +156,15 @@ char const *conf_file_name(char const *file, char const *base_path, char const *
 {
    char const *conf;

-   // First priority, base path, relative path of binary...
-   dbg_printf("checking with base_path %s\n", base_path);
-   conf = conf_path_ok(base_path, file);
+   // First priority, conf path... (either -c, binary or /etc/imx-loader.d/)
+   dbg_printf("checking with conf_path %s\n", conf_path);
+   conf = conf_path_ok(conf_path, file);
    if (conf != NULL)
        return conf;

-   // Second priority, conf path... (either -c, binary or /etc/imx-loader.d/)
-   dbg_printf("checking with conf_path %s\n", conf_path);
-   conf = conf_path_ok(conf_path, file);
+   // Second priority, base path, relative path of binary...
+   dbg_printf("checking with base_path %s\n", base_path);
+   conf = conf_path_ok(base_path, file);
    if (conf != NULL)
        return conf;

failed to add imx8qm to imx_usb_loader

Hello,

I tried to add a imx8qm board. So I added in imx_usb.conf

0x1fc9:0x0129, mx8qm_usb_work.conf

I also added a file mx8qm_usb_work.conf with this content:

mx8qm
#hid/bulk,[old_header,]max packet size, dcd_addr, {ram start, ram size}(repeat valid ram areas)
hid,1024,0x910000,0x40000000,1G,0x00900000,0x40000
#load/run SPL
flash.bin:dcd,clear_dcd,plug,jump header

Not sure if the values a valid here for imx8qm. Can someone verify that?

Now I got this output on running

sudo ./imx_usb flash.bin

Trying to open device vid=0x1fc9 pid=0x0129
Interface 0 claimed
do_command err=-7, last_trans=0
do_command err=-7, last_trans=0
do_command err=-7, last_trans=0
do_command err=-7, last_trans=0

So the USB detection worked. But can't send a command to that board.
Thx for any help.

How to set the path of conf file correctly

Hello.

I could successfully run imx_uart, but sill do not understand how to set my own conffile.

I tried

/usr/bin/imx_uart  -d  -n /dev/ttyS0 /usr/local/MyDirectory/vybrid_usb_work.conf

and got as debug output

trailing slash == 0x609302:/vybrid_usb_work.conf
checking with conf_path /usr/etc/imx-loader.d/
config file </usr/etc/imx-loader.d//vybrid_usb_work.conf>
parse /usr/etc/imx-loader.d//vybrid_usb_work.conf
````.

So my question is how to set the path of conf file correctly.

Issue make compile

After cloning and going to file I am getting error:
cc -c imx_usb.c -o imx_usb.o -pipe -ggdb pkg-config --cflags libusb-1.0 -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSCONFDIR='"/usr/etc"' -DREL_SYSCONFDIR='"../etc"'
/bin/sh: 1: pkg-config: not found
/bin/sh: 1: cc: not found
make: *** [Makefile:24: imx_usb.o] Error 127

"jump" does not seem to work on i.MX6ULL

This is not really a bug report but more like a question.

I have an i.MX 6ULL EVK with me and trying to use imx_usb with it. I cloned it and build it fine but jump option doesn't seem to work. What I mean by "doesn't work" is that, my JTAG-ICE says that the PC (process counter) is stuck at 0x25A0 after the jump.

Without "jump 0x908000" at my file work line, my JTAG-ICE shows me that CPU is running fine at ROM code address. The --verify also works. imx_usb says "Verify success" and wih my JTAG-ICE I can see the contents of the OCRAM is what I specified as a file. I even dumped USB transaction data with #define DEBUG in imx_usb.c. The data seems to be OK.

One thing I've noticed is that while ROM code is executing, CPU seems to be in THUMB mode. But my jump address has ARM code. (I'm using customized u-Boot SPL). Does anyone know how jump command in the ROM code works?

If I modified CPSR (to ARM mode) and PC with my JTAG-ICE to jump to OCRAM after I loaded my code with imx_usb (this is without "jump" option), the code seems to work. So, the code itself is OK (if execution mode is right), I suppose.

Does anyone here have successful experience with "jump" on i.MX6ULL?

Thanks

i.MX28 support?

Hi,

Does this tool support the imx28 CPU's? I know that the mx28_usb_work.conf is missing, and I have tried to construct my own, but I'm wondering whether it is actually expected that it should work with the right config file? From what I can see in the mx28 datasheet, there is no support for booting from uart, only USB Recovery. And obviously, there is a usb tool mxsldr dealing with the mx23/mx28 cpu families. Just wondering whether the mx28 entry in the USB config file is a red herring?

Flash to NAND or eMMC

Hi. How can I use imx_usb_loader to specifically flash the image to NAND or eMMC for i.MX6ULL.

Regression in 29fa8ab

Commit 29fa8ab seems to have introduced a regression, I'm getting the following error after the commit:

config file </home/sven/mys-dac/usb-loader-config/imx_usb.conf>
vid=0x15a2 pid=0x0080 file_name=mx6ull_usb_rom.conf
-> vid=0x0525 pid=0xb4a4 file_name=mx6ull_usb_spl.conf
config file </home/sven/mys-dac/usb-loader-config/mx6ull_usb_rom.conf>
parse /home/sven/mys-dac/usb-loader-config/mx6ull_usb_rom.conf
Trying to open device vid=0x15a2 pid=0x0080
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename /home/sven/mys-dac/u-boot/SPL
load_size 0 bytes
load_addr 0x00000000
dcd 0
clear_dcd 0
plug 0
jump_mode 3
jump_addr 0x00000000
== end work item

loading binary file(/home/sven/mys-dac/u-boot/SPL) to 00907400, skip=0, fsize=ac00 type=aa

<<<44032, 44032 bytes>>>
succeeded (security 0x56787856, status 0x88888888)
jumping to 0x00907400
config file </home/sven/mys-dac/usb-loader-config/mx6ull_usb_spl.conf>
parse /home/sven/mys-dac/usb-loader-config/mx6ull_usb_spl.conf
Trying to open device vid=0x0525 pid=0xb4a4
Interface 0 claimed
do_command err=-1, last_trans=0
do_command err=-1, last_trans=0
do_command err=-1, last_trans=0
do_command err=-1, last_trans=0
do_command err=-1, last_trans=0
status failed

On the previous commit (abe7f5d), the output looks like this:

config file </home/sven/mys-dac/usb-loader-config/imx_usb.conf>
vid=0x15a2 pid=0x0080 file_name=mx6ull_usb_rom.conf
-> vid=0x0525 pid=0xb4a4 file_name=mx6ull_usb_spl.conf
config file </home/sven/mys-dac/usb-loader-config/mx6ull_usb_rom.conf>
parse /home/sven/mys-dac/usb-loader-config/mx6ull_usb_rom.conf
Trying to open device vid=0x15a2 pid=0x0080
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename /home/sven/mys-dac/u-boot/SPL
load_size 0 bytes
load_addr 0x00000000
dcd 0
clear_dcd 0
plug 0
jump_mode 3
jump_addr 0x00000000
== end work item

loading binary file(/home/sven/mys-dac/u-boot/SPL) to 00907400, skip=0, fsize=ac00 type=aa

<<<44032, 44032 bytes>>>
succeeded (security 0x56787856, status 0x88888888)
jumping to 0x00907400
config file </home/sven/mys-dac/usb-loader-config/mx6ull_usb_spl.conf>
parse /home/sven/mys-dac/usb-loader-config/mx6ull_usb_spl.conf
Trying to open device vid=0x0525 pid=0xb4a4
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename /home/sven/mys-dac/u-boot/u-boot-dtb.img
load_size 0 bytes
load_addr 0x00000000
dcd 0
clear_dcd 0
plug 0
jump_mode 3
jump_addr 0x00000000
== end work item

loading binary file(/home/sven/mys-dac/u-boot/u-boot-dtb.img) to 877fffc0, skip=0, fsize=77f26 type=aa

<<<491302, 491302 bytes>>>
succeeded (security 0x56787856, status 0x88888888)
jumping to 0x877fffc0

These are my config files:

#vid:pid, config_file
0x15a2:0x0080, mx6ull_usb_rom.conf, 0x0525:0xb4a4, mx6ull_usb_spl.conf
mx6ull_usb_rom
#hid/bulk,[old_header,]max packet size, dcd_addr, {ram start, ram size}(repeat valid ram areas)
hid,1024,0x00900000,128k
/home/sven/mys-dac/u-boot/SPL:jump header
mx6ull_usb_spl
hid,uboot_header,1024,0x80000000,256M
/home/sven/mys-dac/u-boot/u-boot-dtb.img:jump header

imx_usb.exe compiled for Windows using minGW fails on WIndows 7 (Works on 8&10)

I am working with the Variscite DART-6UL board and attempting to download files from an application in Windows. I loaded minGW application compiler on my PC and compiled the imx_usb.exe following the steps in the README.cmd file. The imx_usb.exe compiled and runs just fine on Windows 10 and Windows 8 but when I try to run it on Windows 7 I get an error when it tries to load and use the the second driver (vid=0525 pid=b4a4) in the bootloader.
Do you know if there is something different I have to do to build the imx_usb for Windows 7? Does it support Windows 7?

Below is the output when I attempt to download files:
C:\Users\Woldtm\AppData\Local\Temp>C:\Users\Public\LinuxDeviceDownloader\LinuxDe
viceDownloader_1.1.90\cygwin64\bin\bash --login -c "cd /usr/tmp/temp; ./hed_down
load.sh . DOWNLOAD"
mkstemp: No such file or directory
RELEASE_DIR = .
DOWNLOAD = 1
DOWNLOAD_DIR = ./download
REPARTITION = 0
SECURE_ERASE = 0
WIPE_DATA = 0
WIPE_PERSISTENT = 0
PERSISTENT_TAR =
BACKUP_PERSISTENT = 0
READ_FUSES = 0
WRITE_FUSES = 0
WRITE_HAB_DATA = 0
MAKE_EMMC_PSLC = 0
TOUCH_CALIBRATE = 0
TOUCH_VERIFY = 0
BOARD_TEST = 0
mkdir: created directory '/tmp/hed_download'
config file <C:/Users/Public/LinuxDeviceDownloader/LinuxDeviceDownloader_1.1.90/
cygwin64/tmp/hed_download/\imx_usb.conf>
vid=0x15a2 pid=0x0080 file_name=pm-04h.conf
-> vid=0x0525 pid=0xb4a4 file_name=pm-04h_spl.conf
config file <C:/Users/Public/LinuxDeviceDownloader/LinuxDeviceDownloader_1.1.90/
cygwin64/tmp/hed_download/\pm-04h.conf>
parse C:/Users/Public/LinuxDeviceDownloader/LinuxDeviceDownloader_1.1.90/cygwin6
4/tmp/hed_download/\pm-04h.conf
Trying to open device vid=0x15a2 pid=0x0080
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename ./SPL-mfgtool
load_size 0 bytes
load_addr 0x83f00000
dcd 0
clear_dcd 0
plug 0
jump_mode 3
jump_addr 0x00000000
== end work item

loading binary file(./SPL-mfgtool) to 00908400, skip=0, fsize=fc00 type=aa

<<<64512, 64512 bytes>>>
succeeded (security 0x56787856, status 0x88888888)
jumping to 0x00908400
config file <C:/Users/Public/LinuxDeviceDownloader/LinuxDeviceDownloader_1.1.90/
cygwin64/tmp/hed_download/\pm-04h_spl.conf>
parse C:/Users/Public/LinuxDeviceDownloader/LinuxDeviceDownloader_1.1.90/cygwin6
4/tmp/hed_download/\pm-04h_spl.conf
Trying to open device vid=0x0525 pid=0xb4a4
claim interface failed

Waiting for module to boot and USB networking to initialize.
........

imx_usb.zip

imx6UL DART booting

Hello,
When using the tool I get these messages:

./imx_usb mx6ull_usb_work.conf u-boot.imx
config file <.//imx_usb.conf>
vid=0x066f pid=0x3780 file_name=mx23_usb_work.conf
vid=0x15a2 pid=0x004f file_name=mx28_usb_work.conf
vid=0x15a2 pid=0x0052 file_name=mx50_usb_work.conf
vid=0x15a2 pid=0x0054 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0061 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0063 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0071 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x007d file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0080 file_name=mx6ull_usb_work.conf
vid=0x1fc9 pid=0x0128 file_name=mx6_usb_work.conf
vid=0x15a2 pid=0x0076 file_name=mx7_usb_work.conf
vid=0x1fc9 pid=0x0126 file_name=mx7ulp_usb_work.conf
vid=0x15a2 pid=0x0041 file_name=mx51_usb_work.conf
vid=0x15a2 pid=0x004e file_name=mx53_usb_work.conf
vid=0x15a2 pid=0x006a file_name=vybrid_usb_work.conf
vid=0x066f pid=0x37ff file_name=linux_gadget.conf
vid=0x1b67 pid=0x4fff file_name=mx6_usb_sdp_spl.conf
vid=0x0525 pid=0xb4a4 file_name=mx6_usb_sdp_spl.conf
vid=0x1fc9 pid=0x012b file_name=mx8mq_usb_work.conf
vid=0x1fc9 pid=0x0134 file_name=mx8mm_usb_work.conf
vid=0x3016 pid=0x1000 file_name=mx8mm_usb_sdp_spl.conf
vid=0x3016 pid=0x1001 file_name=mx8mq_usb_sdp_spl.conf
config file <.//mx6ull_usb_work.conf>
parse .//mx6ull_usb_work.conf
Trying to open device vid=0x15a2 pid=0x0080
Interface 0 claimed
do_command err=-7, last_trans=0
do_command err=-7, last_trans=0
do_command err=-7, last_trans=0
do_command err=-7, last_trans=0
do_command err=-7, last_trans=0
status failed

If I reset the board and try again I get:

config file <.//mx6ull_usb_work.conf>
parse .//mx6ull_usb_work.conf
Trying to open device vid=0x15a2 pid=0x0080
Interface 0 claimed
HAB security state: development mode (0x56787856)
== work item
filename mx6ull_usb_work.conf
load_size 0 bytes
load_addr 0x00000000
dcd 1
clear_dcd 0
plug 1
jump_mode 3
jump_addr 0x00000000
== end work item
header not found 400:7536786d, 0
do_download failed, err=-22
HAB security state: development mode (0x56787856)

Details

I am using a Variscite board. I did myself a USB-USB male to male and I am running PC<->BOARD [USB2] (power disconnected) it after figuring out form schematics.
The emmc is blank, the boot pins are set to boot from emmc. Upon plugin the USB and reseting the iMX I get

[16233.869051] usb 1-2: new high-speed USB device number 33 using xhci_hcd
[16234.017959] usb 1-2: New USB device found, idVendor=15a2, idProduct=0080, bcdDevice= 0.01
[16234.017964] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[16234.017968] usb 1-2: Product: SE Blank 6ULL
[16234.017971] usb 1-2: Manufacturer: Freescale SemiConductor Inc 
[16234.020371] hid-generic 0003:15A2:0080.000C: hiddev1,hidraw3: USB HID v1.10 Device [Freescale SemiConductor Inc  SE Blank 6ULL] on usb-0000:00:14.0-2/input0

I have the git commit

commit 052170c6a043eec4e73fad80955876cf1ba5e4f2 (HEAD -> master, origin/master, origin/HEAD)
Author: Tom Rini <[email protected]>
Date:   Wed Jan 22 13:38:00 2020 -0500

I got this u-boot git://git.denx.de/u-boot-imx.git

make imx6ul_isiot_emmc_defconfig
make u-boot.imx

i.MX5x DCD loading broken

i.MX5x DCD loading has not worked since the new DCD_WRITE command was added in commit 6deb910. This prevents the imx_usb_loader from being used on processors like i.MX53.

It appears the DCD_WRITE command is only supported on i.MX6 and later processors. The old method of individually writing each DCD value still needs to be used for the i.MX5x processors.

A fix for this issue is in pull request #39.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.