357 | | [=#uboot-envtools] |
358 | | === U-Boot envtools (fw_printenv / fw_setenv) === |
359 | | The {{{fw_printenv}}} and {{{fw_setenv}}} tools from U-Boot provide a way to allow reading and writing to U-Boot's env variables provided you have a proper configuration file. On OpenWrt these are in the {{{uboot-envtools}}} package and on Ubuntu they are in the {{{u-boot-tools}}} package. In order to use u-boot envtools in Linux for Ventana the environment must be saved at least once in the bootloader: |
360 | | {{{#!bash |
361 | | saveenv |
362 | | }}} |
363 | | |
364 | | Assuming you're using a board with NAND flash as the primary boot device and the U-Boot env is in the 2nd partition the following shows a valid config file: |
365 | | {{{#!bash |
366 | | cat /proc/mtd |
367 | | dev: size erasesize name |
368 | | mtd0: 01000000 00040000 "uboot" |
369 | | mtd1: 00100000 00040000 "env" |
370 | | mtd2: 7ef00000 00040000 "rootfs" |
371 | | cat /etc/fw_env.config |
372 | | # device offset size erasesize |
373 | | /dev/mtd1 0x0 0x20000 0x40000 |
374 | | /dev/mtd1 0x80000 0x20000 0x40000 |
375 | | }}} |
376 | | |
377 | | Assuming you are using a NAND-less board booting to micro-SD a valid config file looks like: |
378 | | {{{#!bash |
379 | | cat /etc/fw_env.config |
380 | | # device offset size erasesize |
381 | | /dev/mmcblk0 0xb1400 0x20000 0x20000 |
382 | | /dev/mmcblk0 0xd1400 0x20000 0x20000 |
383 | | }}} |
384 | | |
385 | | * ''Booting rootfs from microSD does not necessarily constitute "NAND-less", env variables are still stored on NAND when NAND is present.'' |
386 | | |
387 | | |
388 | | |
389 | | It is important to realize the meaning of the '''Warning: Bad CRC, using default environment''' message. This means that the non-volatile env area is empty or corrupt (Note that this is the way Gateworks Ventana boards ship by default) and that the built-in env within U-Boot will be used. |
390 | | |
391 | | If you use {{{fw_setenv}}} on an environment in this state it will properly set the variable you specify and all other variables will continue to use their built-in default values within U-Boot. Essentially you are 'overriding' the defaults as you would expect. |
392 | | |
393 | | |
394 | | ==== Configuring u-boot-tools |
395 | | A file defining where your environment is located must be provided to {{{fw_printenv}}} and {{{fw_setenv}}} with the {{{-c <file>}}} paramater. Note that older versions of these tools lacked this argument and required the config file to be in {{{/etc/fw_env.config}}} |
396 | | |
397 | | Examples: |
398 | | * Ventana booting from NAND |
399 | | {{{#!bash |
400 | | #Create config file |
401 | | cat << EOF > ventana_nand_env.config |
402 | | # device offset size erasesize |
403 | | /dev/mtd1 0x0 0x20000 0x40000 |
404 | | /dev/mtd1 0x80000 0x20000 0x40000 |
405 | | EOF |
406 | | }}} |
407 | | * Ventana MMC only |
408 | | {{{#!bash |
409 | | #Create config file |
410 | | cat << EOF > ventana_mmc_env.config |
411 | | # device offset size erasesize |
412 | | /dev/mmcblk0 0xb1400 0x20000 0x20000 |
413 | | /dev/mmcblk0 0xd1400 0x20000 0x20000 |
414 | | EOF |
415 | | }}} |
416 | | * A file that can be flashed later on NAND or inserted to a JTAG image: |
417 | | {{{#!bash |
418 | | #Create config file |
419 | | cat << EOF > fw_env.config |
420 | | # device offset size erasesize |
421 | | envVentana.bin 0x00000 0x20000 |
422 | | envVentana.bin 0x80000 0x20000 |
423 | | EOF |
424 | | }}} |
425 | | |
426 | | This will define the device being used, offset according to flash layout, size from flash map, and size of erase block (unless the device is a file). Ventana U-boot environment is redundant hence two entries, both locations need their variables updated. |
427 | | |
428 | | ==== Usage example |
429 | | |
430 | | {{{#!bash |
431 | | # display environment |
432 | | fw_printenv -c fw_env.config |
433 | | # set environment variable |
434 | | fw_setenv -c fw_env.config foo bar #foo being variable name bar being value variable will be set to |
435 | | #second example |
436 | | fw_setenv -c fw_env.config ipaddr 192.168.1.10 |
437 | | #print single environment variable |
438 | | fw_printenv -c fw_env.config foo |
439 | | #second example |
440 | | fw_printenv ipaddr |
441 | | }}} |
491 | | |
492 | | [=#usb] |
493 | | == USB Mass Storage Support == |
494 | | The Ventana U-Boot supports USB Mass Storage devices on both the EHCI port and the OTG port on applicable hardware. The usb subsystem will apply power to a USB device for a specific time according to the USB specification before it scans the device. Some USB storage devices have been found to not adhere to the USB specification and require longer warm-up times. You can set the {{{usb_pgood_delay}}} to the number of ms required for your device to work around this issue. If your USB Mass storage device fails to be detected when you do a {{{usb start}}} in U-Boot try setting this to a value of 2000 or larger (2 seconds+) and issue the command again to see if that helps: |
495 | | |
496 | | General command: |
497 | | {{{#!bash |
498 | | setenv usb_pgood_delay 2000 |
499 | | }}} |
500 | | |
501 | | Example: |
502 | | {{{#!bash |
503 | | Ventana > usb start |
504 | | (Re)start USB... |
505 | | USB0: lowlevel init failed |
506 | | USB1: USB EHCI 1.00 |
507 | | scanning bus 1 for devices... 2 USB Device(s) found |
508 | | scanning usb for storage devices... 0 Storage Device(s) found |
509 | | scanning usb for ethernet devices... 0 Ethernet Device(s) found |
510 | | Ventana > setenv usb_pgood_delay 2000 |
511 | | Ventana > usb start |
512 | | (Re)start USB... |
513 | | USB0: lowlevel init failed |
514 | | USB1: USB EHCI 1.00 |
515 | | scanning bus 1 for devices... 2 USB Device(s) found |
516 | | scanning usb for storage devices... 1 Storage Device(s) found |
517 | | scanning usb for ethernet devices... 0 Ethernet Device(s) found |
518 | | }}} |
519 | | |
520 | | Be sure to run the {{{saveenv}}} command afterwards to save the setting: |
521 | | {{{#!bash |
522 | | saveenv |
523 | | }}} |
524 | | |
525 | | |
526 | | [=#otg] |
527 | | == USB OTG == |
528 | | The USB OTG host controller on the IMX6 is supported under U-Boot in both host and gadget mode. |
529 | | |
530 | | Common uses in '''host mode''' include attaching to a: |
531 | | * USB Mass storage device |
532 | | * USB Network Interface (two common devices are supported - see [#usbnet below] |
533 | | |
534 | | Common uses in '''device mode''' include attaching to a PC: |
535 | | * emulating a USB Mass storage device - see [#ums below] |
536 | | |
537 | | [=#ums] |
538 | | === USB Mass Storage emulation to a Host over OTG === |
539 | | One of the more handy features of USB OTG support is connecting to a PC and using the {{{ums}}} command to implement the USB Mass Storage device protocol thus allowing access from a PC to block storage devices (USB Mass Storage, micro-SD, mSATA) attached to the Ventana board. |
540 | | |
541 | | Examples: |
542 | | * IMX6 micro-SD host controller (this is on-board micro-SD, not a USB based micro-SD reader/writer such as the GW16103) |
543 | | {{{#!bash |
544 | | ums 0 mmc 0 |
545 | | }}} |
546 | | * USB Mass Storage device: |
547 | | {{{#!bash |
548 | | usb start && ums 0 usb 0 |
549 | | }}} |
550 | | * mSATA device: |
551 | | {{{#!bash |
552 | | sata init && ums 0 sata 0 |
553 | | }}} |
554 | | |
555 | | '''This feature is available in Gateworks U-Boot 2015.04''' |
556 | | |
557 | | |
558 | | [=#gpio] |
559 | | == General Purpose IO (GPIO) == |
560 | | The {{{gpio}}} command provides the ability to list and configure board-specific GPIO's. The IMX6 has 7 banks of 32 GPIOs. The {{{pin}}} value used for the {{{gpio}}} command will match the Linux gpio, which follows the equation {{{(bank-1) * 32 + io}}}. The {{{status}}} command however will list the GPIO's as {{{GPIO<bank>_<io>}}} so when determining the pin value you need to do the math. |
561 | | |
562 | | For example, on Ventana boards that support MSATA the MSATA enable is GPIO2_IO8 (bank2 io8) or gpio-40 ((2-1)*32 + 8) so the pin value of 40 is used. |
563 | | |
564 | | Examples: |
565 | | * List GPIO's: |
566 | | {{{#!bash |
567 | | gpio status |
568 | | }}} |
569 | | * set GPIO2_8 (gpio 40) (set to logic 1) (enables MSATA on boards that have it): |
570 | | {{{#!bash |
571 | | gpio set 40 |
572 | | }}} |
573 | | * clear GPIO2_8 (gpio 40) (set to logic 0) (disables MSATA and selects PCI on boards that have it): |
574 | | {{{#!bash |
575 | | gpio clear 40 |
576 | | }}} |
577 | | * set GPIO1_17 (gpio 17) as an input and get its value |
578 | | {{{#!bash |
579 | | gpio input 17 |
580 | | }}} |
581 | | |
582 | | '''This feature is available in Gateworks U-Boot 2015.04''' |
757 | | The following U-Boot environment variables affect networking: |
758 | | * {{{ipaddr}}} - local IP address |
759 | | * {{{serverip}}} - TFTP server IP |
760 | | * {{{ethprime}}} - controls which interface is used first |
761 | | * {{{ethact}}} - controls which interface is currently active |
762 | | * {{{ethrotate}}} - when set to 'no' uboot does not go through all available network interfaces and instead just stays at the currently selected interface (ethact) |
763 | | * {{{netretry}}} - when set to 'no' each network operation will either success or fail without retrying. When set to 'once' the operation will fail only when all available network interfaces have been tried once without success. |
764 | | * {{{tftpsrcport}}} - UDP source port (if not set uses default) |
765 | | * {{{tftpdstport}}} - UDP dest port (if not set uses well known port 69) |
766 | | * {{{tftpblocksize}}} - if not set will use TFTP server's default block size |
767 | | * {{{tftptimeout}}} - retransmission timeout for TFTP packets in ms (min value is 1000, default is 5000) |
768 | | |
769 | | |
810 | | [=#usbeth] |
811 | | === USB Ethernet Device support === |
812 | | There is support in U-Boot for a few USB chipsets that are commonly available in low-cost USB Ethernet dongles: |
813 | | * ASIX AX8817X - (ie [http://plugable.com/products/usb2-e100 Plugable USB2-E100 10/100mbps) |
814 | | * network device: asx0 |
815 | | * SMSC LAN95xx |
816 | | * network device: sms0 |
817 | | |
818 | | To use these use the following U-Boot configuration: |
819 | | 1. scan USB bus for supported devices: |
820 | | {{{#!bash |
821 | | usb start |
822 | | }}} |
823 | | * If you have a supported USB device attached you will see a message to that effect |
824 | | 2. set active ethernet device - for example an ASIX device: |
825 | | {{{#!bash |
826 | | setenv ethact asx0 |
827 | | }}} |
828 | | 3. Use networking as needed: |
829 | | {{{#!bash |
830 | | ping 192.168.1.254 |
831 | | tftp ${loadaddr} ${file} |
832 | | }}} |
833 | | |
834 | | |
835 | | |
836 | | [=#netconsole] |
837 | | === !NetConsole (access U-Boot console from network) === |
838 | | U-Boot does not contain any TCP implementation and as such there is no 'telnet server' or 'telnetd' support. There is however something similar called '!NetConsole' which will allow stdin/stdout/stderr to be directed to a UDP network port. If you set this up you can use the Linux 'nc' or 'netcat' tool or use the the 'netconsole' shell script provided in tools/netconsole (which uses these tools) to talk to U-Boot's interpreter from a Linux host. |
839 | | |
840 | | Using !NetConsole, the paradigm is reversed from the telnet/ssh perspective a bit such that you need to configure U-Boot to listen to a specifc IP address of a server. |
841 | | |
842 | | To enable !NetConsole you must do the following: |
843 | | - U-Boot: |
844 | | * configure networking: For example have a network interface supported by U-boot, set {{{ipaddr}}} env variable and {{{serverip}}} env variable (make sure you can {{{ping $serverip}}}): |
845 | | {{{ |
846 | | setenv ipaddr 192.168.1.1 # local ip |
847 | | setenv serverip 192.168.1.146 # host ip running netcat/netconsole |
848 | | }}} |
849 | | * set the {{{ncip}}} address to your server: |
850 | | {{{ |
851 | | setenv ncip ${serverip} |
852 | | }}} |
853 | | * set stdin/stdout/stderr as desired to {{{nc}}}: |
854 | | {{{ |
855 | | setenv stdin nc; setenv stdout nc; setenv stderr nc |
856 | | }}} |
857 | | * (optional) if you want these changed persistent, do a {{{saveenv}}}: |
858 | | {{{ |
859 | | saveenv |
860 | | }}} |
861 | | - Linux host: |
862 | | * make sure you have netcat (either {{{nc}}} or {{{netcat}}} applications) |
863 | | * grab the {{{netconsole}}} shell script from U-Boot's tools directory: |
864 | | {{{#!bash |
865 | | wget https://raw.githubusercontent.com/Gateworks/u-boot-imx6/gateworks_v2015.04/tools/netconsole |
866 | | chmod +x netconsole |
867 | | }}} |
868 | | * use {{{netconsole}}} to listen to your target IP address for input/output: |
869 | | {{{#!bash |
870 | | netconsole 192.168.1.1 |
871 | | }}} |
872 | | - Note that netconsole remaps the interrupt from Cntl-C to Cntl-T so that you can use Cntl-C over the network console |
873 | | |
874 | | |
875 | | For a bootloader configuration that sits waiting for network commands from a specific host but with a timeout you can use the preboot env variable to execute a script prior to bootcmd such as: |
876 | | {{{ |
877 | | setenv serverip 192.168.1.146 # your server ip |
878 | | setenv ipaddr 192.168.1.1 # your local ip |
879 | | setenv netretry no |
880 | | setenv preboot 'echo "Looking for server at $serverip..."; \ |
881 | | if ping $serverip; then setenv ncip ${serverip}; setenv bootdelay 10; \ |
882 | | echo "Starting NetConsole to ${ncip} and waiting for ${bootdelay} seconds..."; \ |
883 | | setenv stdin nc; setenv stdout nc; setenv stderr nc; \ |
884 | | fi' |
885 | | saveenv |
886 | | }}} |
887 | | * Note that we set {{{netretry}}} to 'no' which causes network operations to not retry (otherwise the ping will go forever). This could also be set to 'once' if you wish to cycle through all available network interfaces (such as on-board NIC's as well as USB nics) instead of just 'ethprime'. |
888 | | |
889 | | This only pertains to input/output of the U-Boot environment. Once the bootloader jumps to the kernel, the kernel is in charge of what to do about its input/output, which is controlled via the 'console' kernel cmdline. Note that there is a CONFIG_NETCONSOLE option in the kernel that uses a 'netconsole' kernel cmdline however that option is not enabled in the Gateworks kernels by default |
890 | | |
891 | | References: |
892 | | * https://github.com/Gateworks/u-boot-imx6/blob/gateworks_v2015.04/doc/README.NetConsole |
| 602 | |