Commit f4617ef86dbbc2b844d530564694b927099bf0a9

Authored by Tom Rini

Merge branch 'tom' of git://git.denx.de/u-boot-x86

Showing 17 changed files Side-by-side Diff

... ... @@ -264,6 +264,17 @@
264 264 directory according to the instructions in cogent/README.
265 265  
266 266  
  267 +Sandbox Environment:
  268 +--------------------
  269 +
  270 +U-Boot can be built natively to run on a Linux host using the 'sandbox'
  271 +board. This allows feature development which is not board- or architecture-
  272 +specific to be undertaken on a native platform. The sandbox is also used to
  273 +run some of U-Boot's tests.
  274 +
  275 +See board/sandbox/sandbox/README.sandbox for more details.
  276 +
  277 +
267 278 Configuration Options:
268 279 ----------------------
269 280  
arch/sandbox/config.mk
... ... @@ -18,4 +18,10 @@
18 18 $(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot.map
19 19  
20 20 CONFIG_ARCH_DEVICE_TREE := sandbox
  21 +
  22 +# Define this to avoid linking with SDL, which requires SDL libraries
  23 +# This can solve 'sdl-config: Command not found' errors
  24 +ifneq ($(NO_SDL),)
  25 +PLATFORM_CPPFLAGS += -DSANDBOX_NO_SDL
  26 +endif
arch/sandbox/dts/.gitignore
  1 +*.dtb
arch/sandbox/lib/Makefile
... ... @@ -8,5 +8,5 @@
8 8 #
9 9  
10 10  
11   -obj-y += interrupts.o
  11 +obj-y += interrupts.o sandbox.o
arch/sandbox/lib/sandbox.c
  1 +/*
  2 + * Copyright (c) 2011 The Chromium OS Authors.
  3 + * SPDX-License-Identifier: GPL-2.0+
  4 + */
  5 +
  6 +#include <common.h>
  7 +#include <cros_ec.h>
  8 +#include <dm.h>
  9 +#include <os.h>
  10 +#include <asm/u-boot-sandbox.h>
  11 +
  12 +/*
  13 + * Pointer to initial global data area
  14 + *
  15 + * Here we initialize it.
  16 + */
  17 +gd_t *gd;
  18 +
  19 +/* Add a simple GPIO device */
  20 +U_BOOT_DEVICE(gpio_sandbox) = {
  21 + .name = "gpio_sandbox",
  22 +};
  23 +
  24 +void flush_cache(unsigned long start, unsigned long size)
  25 +{
  26 +}
  27 +
  28 +unsigned long timer_read_counter(void)
  29 +{
  30 + return os_get_nsec() / 1000;
  31 +}
  32 +
  33 +int dram_init(void)
  34 +{
  35 + gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
  36 + return 0;
  37 +}
  38 +
  39 +#ifdef CONFIG_BOARD_EARLY_INIT_F
  40 +int board_early_init_f(void)
  41 +{
  42 +#ifdef CONFIG_VIDEO_SANDBOX_SDL
  43 + int ret;
  44 +
  45 + ret = sandbox_lcd_sdl_early_init();
  46 + if (ret) {
  47 + puts("Could not init sandbox LCD emulation\n");
  48 + return ret;
  49 + }
  50 +#endif
  51 +
  52 + return 0;
  53 +}
  54 +#endif
  55 +
  56 +int arch_early_init_r(void)
  57 +{
  58 +#ifdef CONFIG_CROS_EC
  59 + if (cros_ec_board_init()) {
  60 + printf("%s: Failed to init EC\n", __func__);
  61 + return 0;
  62 + }
  63 +#endif
  64 +
  65 + return 0;
  66 +}
  67 +
  68 +#ifdef CONFIG_BOARD_LATE_INIT
  69 +int board_late_init(void)
  70 +{
  71 + if (cros_ec_get_error()) {
  72 + /* Force console on */
  73 + gd->flags &= ~GD_FLG_SILENT;
  74 +
  75 + printf("cros-ec communications failure %d\n",
  76 + cros_ec_get_error());
  77 + puts("\nPlease reset with Power+Refresh\n\n");
  78 + panic("Cannot init cros-ec device");
  79 + return -1;
  80 + }
  81 + return 0;
  82 +}
  83 +#endif
board/sandbox/sandbox/Makefile
1   -#
2   -# Copyright (c) 2011 The Chromium OS Authors.
3   -#
4   -# SPDX-License-Identifier: GPL-2.0+
5   -#
6   -
7   -obj-y := sandbox.o
board/sandbox/sandbox/README.sandbox
1   -/*
2   - * Copyright (c) 2011 The Chromium OS Authors.
3   - *
4   - * SPDX-License-Identifier: GPL-2.0+
5   - */
6   -
7   -Native Execution of U-Boot
8   -==========================
9   -
10   -The 'sandbox' architecture is designed to allow U-Boot to run under Linux on
11   -almost any hardware. To achieve this it builds U-Boot (so far as possible)
12   -as a normal C application with a main() and normal C libraries.
13   -
14   -All of U-Boot's architecture-specific code therefore cannot be built as part
15   -of the sandbox U-Boot. The purpose of running U-Boot under Linux is to test
16   -all the generic code, not specific to any one architecture. The idea is to
17   -create unit tests which we can run to test this upper level code.
18   -
19   -CONFIG_SANDBOX is defined when building a native board.
20   -
21   -The chosen vendor and board names are also 'sandbox', so there is a single
22   -board in board/sandbox/sandbox.
23   -
24   -CONFIG_SANDBOX_BIG_ENDIAN should be defined when running on big-endian
25   -machines.
26   -
27   -Note that standalone/API support is not available at present.
28   -
29   -The serial driver is a very simple implementation which reads and writes to
30   -the console. It does not set the terminal into raw mode, so cursor keys and
31   -history will not work yet.
32   -
33   -
34   -SPI Emulation
35   --------------
36   -
37   -Sandbox supports SPI and SPI flash emulation.
38   -
39   -This is controlled by the spi_sf argument, the format of which is:
40   -
41   - bus:cs:device:file
42   -
43   - bus - SPI bus number
44   - cs - SPI chip select number
45   - device - SPI device emulation name
46   - file - File on disk containing the data
47   -
48   -For example:
49   -
50   - dd if=/dev/zero of=spi.bin bs=1M count=4
51   - ./u-boot --spi_sf 0:0:M25P16:spi.bin
52   -
53   -With this setup you can issue SPI flash commands as normal:
54   -
55   -=>sf probe
56   -SF: Detected M25P16 with page size 64 KiB, total 2 MiB
57   -=>sf read 0 0 10000
58   -SF: 65536 bytes @ 0x0 Read: OK
59   -=>
60   -
61   -Since this is a full SPI emulation (rather than just flash), you can
62   -also use low-level SPI commands:
63   -
64   -=>sspi 0:0 32 9f
65   -FF202015
66   -
67   -This is issuing a READ_ID command and getting back 20 (ST Micro) part
68   -0x2015 (the M25P16).
69   -
70   -Drivers are connected to a particular bus/cs using sandbox's state
71   -structure (see the 'spi' member). A set of operations must be provided
72   -for each driver.
73   -
74   -
75   -Configuration settings for the curious are:
76   -
77   -CONFIG_SANDBOX_SPI_MAX_BUS
78   - The maximum number of SPI buses supported by the driver (default 1).
79   -
80   -CONFIG_SANDBOX_SPI_MAX_CS
81   - The maximum number of chip selects supported by the driver
82   - (default 10).
83   -
84   -CONFIG_SPI_IDLE_VAL
85   - The idle value on the SPI bus
86   -
87   -
88   -Tests
89   ------
90   -
91   -So far we have no tests, but when we do these will be documented here.
board/sandbox/sandbox/sandbox.c
1   -/*
2   - * Copyright (c) 2011 The Chromium OS Authors.
3   - * SPDX-License-Identifier: GPL-2.0+
4   - */
5   -
6   -#include <common.h>
7   -#include <cros_ec.h>
8   -#include <dm.h>
9   -#include <os.h>
10   -#include <asm/u-boot-sandbox.h>
11   -
12   -/*
13   - * Pointer to initial global data area
14   - *
15   - * Here we initialize it.
16   - */
17   -gd_t *gd;
18   -
19   -/* Add a simple GPIO device */
20   -U_BOOT_DEVICE(gpio_sandbox) = {
21   - .name = "gpio_sandbox",
22   -};
23   -
24   -void flush_cache(unsigned long start, unsigned long size)
25   -{
26   -}
27   -
28   -unsigned long timer_read_counter(void)
29   -{
30   - return os_get_nsec() / 1000;
31   -}
32   -
33   -int dram_init(void)
34   -{
35   - gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
36   - return 0;
37   -}
38   -
39   -#ifdef CONFIG_BOARD_EARLY_INIT_F
40   -int board_early_init_f(void)
41   -{
42   -#ifdef CONFIG_VIDEO_SANDBOX_SDL
43   - int ret;
44   -
45   - ret = sandbox_lcd_sdl_early_init();
46   - if (ret) {
47   - puts("Could not init sandbox LCD emulation\n");
48   - return ret;
49   - }
50   -#endif
51   -
52   - return 0;
53   -}
54   -#endif
55   -
56   -int arch_early_init_r(void)
57   -{
58   -#ifdef CONFIG_CROS_EC
59   - if (cros_ec_board_init()) {
60   - printf("%s: Failed to init EC\n", __func__);
61   - return 0;
62   - }
63   -#endif
64   -
65   - return 0;
66   -}
67   -
68   -#ifdef CONFIG_BOARD_LATE_INIT
69   -int board_late_init(void)
70   -{
71   - if (cros_ec_get_error()) {
72   - /* Force console on */
73   - gd->flags &= ~GD_FLG_SILENT;
74   -
75   - printf("cros-ec communications failure %d\n",
76   - cros_ec_get_error());
77   - puts("\nPlease reset with Power+Refresh\n\n");
78   - panic("Cannot init cros-ec device");
79   - return -1;
80   - }
81   - return 0;
82   -}
83   -#endif
... ... @@ -1182,7 +1182,7 @@
1182 1182 Active powerpc ppc4xx - xilinx ppc405-generic xilinx-ppc405-generic_flash xilinx-ppc405-generic:SYS_TEXT_BASE=0xF7F60000,RESET_VECTOR_ADDRESS=0xF7FFFFFC Ricardo Ribalda <ricardo.ribalda@uam.es>
1183 1183 Active powerpc ppc4xx - xilinx ppc440-generic xilinx-ppc440-generic xilinx-ppc440-generic:SYS_TEXT_BASE=0x04000000,RESET_VECTOR_ADDRESS=0x04100000,BOOT_FROM_XMD=1 Ricardo Ribalda <ricardo.ribalda@uam.es>
1184 1184 Active powerpc ppc4xx - xilinx ppc440-generic xilinx-ppc440-generic_flash xilinx-ppc440-generic:SYS_TEXT_BASE=0xF7F60000,RESET_VECTOR_ADDRESS=0xF7FFFFFC Ricardo Ribalda <ricardo.ribalda@uam.es>
1185   -Active sandbox sandbox - sandbox sandbox sandbox - Simon Glass <sjg@chromium.org>
  1185 +Active sandbox sandbox - - <none> sandbox - Simon Glass <sjg@chromium.org>
1186 1186 Active sh sh2 - renesas rsk7203 rsk7203 - Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>:Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
1187 1187 Active sh sh2 - renesas rsk7264 rsk7264 - Phil Edworthy <phil.edworthy@renesas.com>
1188 1188 Active sh sh2 - renesas rsk7269 rsk7269 - -
... ... @@ -33,6 +33,7 @@
33 33 #include <watchdog.h>
34 34 #include <linux/stddef.h>
35 35 #include <asm/byteorder.h>
  36 +#include <asm/io.h>
36 37  
37 38 DECLARE_GLOBAL_DATA_PTR;
38 39  
... ... @@ -846,7 +847,8 @@
846 847 int argc, char * const argv[])
847 848 {
848 849 char buf[32];
849   - char *addr, *cmd, *res;
  850 + ulong addr;
  851 + char *ptr, *cmd, *res;
850 852 size_t size = 0;
851 853 ssize_t len;
852 854 env_t *envp;
853 855  
... ... @@ -891,10 +893,11 @@
891 893 if (argc < 1)
892 894 return CMD_RET_USAGE;
893 895  
894   - addr = (char *)simple_strtoul(argv[0], NULL, 16);
  896 + addr = simple_strtoul(argv[0], NULL, 16);
  897 + ptr = map_sysmem(addr, size);
895 898  
896 899 if (size)
897   - memset(addr, 'r, '\0', size);', size);
  900 + memset(ptr, 'r, '\0', size);', size);
898 901  
899 902 argc--;
900 903 argv++;
... ... @@ -902,7 +905,7 @@
902 905 if (sep) { /* export as text file */
903 906 len = hexport_r(&env_htab, sep,
904 907 H_MATCH_KEY | H_MATCH_IDENT,
905   - &addr, size, argc, argv);
  908 + &ptr, size, argc, argv);
906 909 if (len < 0) {
907 910 error("Cannot export environment: errno = %d\n", errno);
908 911 return 1;
909 912  
... ... @@ -913,12 +916,12 @@
913 916 return 0;
914 917 }
915 918  
916   - envp = (env_t *)addr;
  919 + envp = (env_t *)ptr;
917 920  
918 921 if (chk) /* export as checksum protected block */
919 922 res = (char *)envp->data;
920 923 else /* export as raw binary data */
921   - res = addr;
  924 + res = ptr;
922 925  
923 926 len = hexport_r(&env_htab, '\0',
924 927 H_MATCH_KEY | H_MATCH_IDENT,
... ... @@ -960,7 +963,8 @@
960 963 static int do_env_import(cmd_tbl_t *cmdtp, int flag,
961 964 int argc, char * const argv[])
962 965 {
963   - char *cmd, *addr;
  966 + ulong addr;
  967 + char *cmd, *ptr;
964 968 char sep = '\n';
965 969 int chk = 0;
966 970 int fmt = 0;
... ... @@ -1004,7 +1008,8 @@
1004 1008 if (!fmt)
1005 1009 printf("## Warning: defaulting to text format\n");
1006 1010  
1007   - addr = (char *)simple_strtoul(argv[0], NULL, 16);
  1011 + addr = simple_strtoul(argv[0], NULL, 16);
  1012 + ptr = map_sysmem(addr, 0);
1008 1013  
1009 1014 if (argc == 2) {
1010 1015 size = simple_strtoul(argv[1], NULL, 16);
... ... @@ -1012,7 +1017,7 @@
1012 1017 puts("## Error: external checksum format must pass size\n");
1013 1018 return CMD_RET_FAILURE;
1014 1019 } else {
1015   - char *s = addr;
  1020 + char *s = ptr;
1016 1021  
1017 1022 size = 0;
1018 1023  
... ... @@ -1032,7 +1037,7 @@
1032 1037  
1033 1038 if (chk) {
1034 1039 uint32_t crc;
1035   - env_t *ep = (env_t *)addr;
  1040 + env_t *ep = (env_t *)ptr;
1036 1041  
1037 1042 size -= offsetof(env_t, data);
1038 1043 memcpy(&crc, &ep->crc, sizeof(crc));
1039 1044  
... ... @@ -1041,11 +1046,11 @@
1041 1046 puts("## Error: bad CRC, import failed\n");
1042 1047 return 1;
1043 1048 }
1044   - addr = (char *)ep->data;
  1049 + ptr = (char *)ep->data;
1045 1050 }
1046 1051  
1047   - if (himport_r(&env_htab, addr, size, sep, del ? 0 : H_NOCLEAR,
1048   - 0, NULL) == 0) {
  1052 + if (himport_r(&env_htab, ptr, size, sep, del ? 0 : H_NOCLEAR, 0,
  1053 + NULL) == 0) {
1049 1054 error("Environment import failed: errno = %d\n", errno);
1050 1055 return 1;
1051 1056 }
... ... @@ -1550,7 +1550,7 @@
1550 1550 return 1;
1551 1551 }
1552 1552  
1553   - if (run_command(arg, flag) != 0)
  1553 + if (run_command_list(arg, -1, flag) != 0)
1554 1554 return 1;
1555 1555 }
1556 1556 return 0;
  1 +/*
  2 + * Copyright (c) 2014 The Chromium OS Authors.
  3 + *
  4 + * SPDX-License-Identifier: GPL-2.0+
  5 + */
  6 +
  7 +Native Execution of U-Boot
  8 +==========================
  9 +
  10 +The 'sandbox' architecture is designed to allow U-Boot to run under Linux on
  11 +almost any hardware. To achieve this it builds U-Boot (so far as possible)
  12 +as a normal C application with a main() and normal C libraries.
  13 +
  14 +All of U-Boot's architecture-specific code therefore cannot be built as part
  15 +of the sandbox U-Boot. The purpose of running U-Boot under Linux is to test
  16 +all the generic code, not specific to any one architecture. The idea is to
  17 +create unit tests which we can run to test this upper level code.
  18 +
  19 +CONFIG_SANDBOX is defined when building a native board.
  20 +
  21 +The chosen vendor and board names are also 'sandbox', so there is a single
  22 +board in board/sandbox/sandbox.
  23 +
  24 +CONFIG_SANDBOX_BIG_ENDIAN should be defined when running on big-endian
  25 +machines.
  26 +
  27 +Note that standalone/API support is not available at present.
  28 +
  29 +
  30 +Basic Operation
  31 +---------------
  32 +
  33 +To run sandbox U-Boot use something like:
  34 +
  35 + make sandbox_config all
  36 + ./u-boot
  37 +
  38 +Note:
  39 + If you get errors about 'sdl-config: Command not found' you may need to
  40 + install libsdl1.2-dev or similar to get SDL support. Alternatively you can
  41 + build sandbox without SDL (i.e. no display/keyboard support) by removing
  42 + the CONFIG_SANDBOX_SDL line in include/configs/sandbox.h or using:
  43 +
  44 + make sandbox_config all NO_SDL=1
  45 + ./u-boot
  46 +
  47 +
  48 +U-Boot will start on your computer, showing a sandbox emulation of the serial
  49 +console:
  50 +
  51 +
  52 +U-Boot 2014.04 (Mar 20 2014 - 19:06:00)
  53 +
  54 +DRAM: 128 MiB
  55 +Using default environment
  56 +
  57 +In: serial
  58 +Out: lcd
  59 +Err: lcd
  60 +=>
  61 +
  62 +You can issue commands as your would normally. If the command you want is
  63 +not supported you can add it to include/configs/sandbox.h.
  64 +
  65 +To exit, type 'reset' or press Ctrl-C.
  66 +
  67 +
  68 +Console / LCD support
  69 +---------------------
  70 +
  71 +Assuming that CONFIG_SANDBOX_SDL is defined when building, you can run the
  72 +sandbox with LCD and keyboard emulation, using something like:
  73 +
  74 + ./u-boot -d u-boot.dtb -l
  75 +
  76 +This will start U-Boot with a window showing the contents of the LCD. If
  77 +that window has the focus then you will be able to type commands as you
  78 +would on the console. You can adjust the display settings in the device
  79 +tree file - see arch/sandbox/dts/sandbox.dts.
  80 +
  81 +
  82 +Command-line Options
  83 +--------------------
  84 +
  85 +Various options are available, mostly for test purposes. Use -h to see
  86 +available options. Some of these are described below.
  87 +
  88 +The terminal is normally in what is called 'raw-with-sigs' mode. This means
  89 +that you can use arrow keys for command editing and history, but if you
  90 +press Ctrl-C, U-Boot will exit instead of handling this as a keypress.
  91 +
  92 +Other options are 'raw' (so Ctrl-C is handled within U-Boot) and 'cooked'
  93 +(where the terminal is in cooked mode and cursor keys will not work, Ctrl-C
  94 +will exit).
  95 +
  96 +As mentioned above, -l causes the LCD emulation window to be shown.
  97 +
  98 +A device tree binary file can be provided with -d. If you edit the source
  99 +(it is stored at arch/sandbox/dts/sandbox.dts) you must rebuild U-Boot to
  100 +recreate the binary file.
  101 +
  102 +To execute commands directly, use the -c option. You can specify a single
  103 +command, or multiple commands separated by a semicolon, as is normal in
  104 +U-Boot. Be careful with quoting as the shall will normally process and
  105 +swallow quotes. When -c is used, U-Boot exists after the command is complete,
  106 +but you can force it to go to interactive mode instead with -i.
  107 +
  108 +
  109 +Memory Emulation
  110 +----------------
  111 +
  112 +Memory emulation is supported, with the size set by CONFIG_SYS_SDRAM_SIZE.
  113 +The -m option can be used to read memory from a file on start-up and write
  114 +it when shutting down. This allows preserving of memory contents across
  115 +test runs. You can tell U-Boot to remove the memory file after it is read
  116 +(on start-up) with the --rm_memory option.
  117 +
  118 +To access U-Boot's emulated memory within the code, use map_sysmem(). This
  119 +function is used throughout U-Boot to ensure that emulated memory is used
  120 +rather than the U-Boot application memory. This provides memory starting
  121 +at 0 and extending to the size of the emulation.
  122 +
  123 +
  124 +Storing State
  125 +-------------
  126 +
  127 +With sandbox you can write drivers which emulate the operation of drivers on
  128 +real devices. Some of these drivers may want to record state which is
  129 +preserved across U-Boot runs. This is particularly useful for testing. For
  130 +example, the contents of a SPI flash chip should not disappear just because
  131 +U-Boot exits.
  132 +
  133 +State is stored in a device tree file in a simple format which is driver-
  134 +specific. You then use the -s option to specify the state file. Use -r to
  135 +make U-Boot read the state on start-up (otherwise it starts empty) and -w
  136 +to write it on exit (otherwise the stored state is left unchanged and any
  137 +changes U-Boot made will be lost). You can also use -n to tell U-Boot to
  138 +ignore any problems with missing state. This is useful when first running
  139 +since the state file will be empty.
  140 +
  141 +The device tree file has one node for each driver - the driver can store
  142 +whatever properties it likes in there. See 'Writing Sandbox Drivers' below
  143 +for more details on how to get drivers to read and write their state.
  144 +
  145 +
  146 +Running and Booting
  147 +-------------------
  148 +
  149 +Since there is no machine architecture, sandbox U-Boot cannot actually boot
  150 +a kernel, but it does support the bootm command. Filesystems, memory
  151 +commands, hashing, FIT images, verified boot and many other features are
  152 +supported.
  153 +
  154 +When 'bootm' runs a kernel, sandbox will exit, as U-Boot does on a real
  155 +machine. Of course in this case, no kernel is run.
  156 +
  157 +It is also possible to tell U-Boot that it has jumped from a temporary
  158 +previous U-Boot binary, with the -j option. That binary is automatically
  159 +removed by the U-Boot that gets the -j option. This allows you to write
  160 +tests which emulate the action of chain-loading U-Boot, typically used in
  161 +a situation where a second 'updatable' U-Boot is stored on your board. It
  162 +is very risky to overwrite or upgrade the only U-Boot on a board, since a
  163 +power or other failure will brick the board and require return to the
  164 +manufacturer in the case of a consumer device.
  165 +
  166 +
  167 +Supported Drivers
  168 +-----------------
  169 +
  170 +U-Boot sandbox supports these emulations:
  171 +
  172 +- Block devices
  173 +- Chrome OS EC
  174 +- GPIO
  175 +- Host filesystem (access files on the host from within U-Boot)
  176 +- Keyboard (Chrome OS)
  177 +- LCD
  178 +- Serial (for console only)
  179 +- Sound (incomplete - see sandbox_sdl_sound_init() for details)
  180 +- SPI
  181 +- SPI flash
  182 +- TPM (Trusted Platform Module)
  183 +
  184 +Notable omissions are networking and I2C.
  185 +
  186 +A wide range of commands is implemented. Filesystems which use a block
  187 +device are supported.
  188 +
  189 +Also sandbox uses generic board (CONFIG_SYS_GENERIC_BOARD) and supports
  190 +driver model (CONFIG_DM) and associated commands.
  191 +
  192 +
  193 +SPI Emulation
  194 +-------------
  195 +
  196 +Sandbox supports SPI and SPI flash emulation.
  197 +
  198 +This is controlled by the spi_sf argument, the format of which is:
  199 +
  200 + bus:cs:device:file
  201 +
  202 + bus - SPI bus number
  203 + cs - SPI chip select number
  204 + device - SPI device emulation name
  205 + file - File on disk containing the data
  206 +
  207 +For example:
  208 +
  209 + dd if=/dev/zero of=spi.bin bs=1M count=4
  210 + ./u-boot --spi_sf 0:0:M25P16:spi.bin
  211 +
  212 +With this setup you can issue SPI flash commands as normal:
  213 +
  214 +=>sf probe
  215 +SF: Detected M25P16 with page size 64 KiB, total 2 MiB
  216 +=>sf read 0 0 10000
  217 +SF: 65536 bytes @ 0x0 Read: OK
  218 +=>
  219 +
  220 +Since this is a full SPI emulation (rather than just flash), you can
  221 +also use low-level SPI commands:
  222 +
  223 +=>sspi 0:0 32 9f
  224 +FF202015
  225 +
  226 +This is issuing a READ_ID command and getting back 20 (ST Micro) part
  227 +0x2015 (the M25P16).
  228 +
  229 +Drivers are connected to a particular bus/cs using sandbox's state
  230 +structure (see the 'spi' member). A set of operations must be provided
  231 +for each driver.
  232 +
  233 +
  234 +Configuration settings for the curious are:
  235 +
  236 +CONFIG_SANDBOX_SPI_MAX_BUS
  237 + The maximum number of SPI buses supported by the driver (default 1).
  238 +
  239 +CONFIG_SANDBOX_SPI_MAX_CS
  240 + The maximum number of chip selects supported by the driver
  241 + (default 10).
  242 +
  243 +CONFIG_SPI_IDLE_VAL
  244 + The idle value on the SPI bus
  245 +
  246 +
  247 +Writing Sandbox Drivers
  248 +-----------------------
  249 +
  250 +Generally you should put your driver in a file containing the word 'sandbox'
  251 +and put it in the same directory as other drivers of its type. You can then
  252 +implement the same hooks as the other drivers.
  253 +
  254 +To access U-Boot's emulated memory, use map_sysmem() as mentioned above.
  255 +
  256 +If your driver needs to store configuration or state (such as SPI flash
  257 +contents or emulated chip registers), you can use the device tree as
  258 +described above. Define handlers for this with the SANDBOX_STATE_IO macro.
  259 +See arch/sandbox/include/asm/state.h for documentation. In short you provide
  260 +a node name, compatible string and functions to read and write the state.
  261 +Since writing the state can expand the device tree, you may need to use
  262 +state_setprop() which does this automatically and avoids running out of
  263 +space. See existing code for examples.
  264 +
  265 +
  266 +Testing
  267 +-------
  268 +
  269 +U-Boot sandbox can be used to run various tests, mostly in the test/
  270 +directory. These include:
  271 +
  272 + command_ut
  273 + - Unit tests for command parsing and handling
  274 + compression
  275 + - Unit tests for U-Boot's compression algorithms, useful for
  276 + security checking. It supports gzip, bzip2, lzma and lzo.
  277 + driver model
  278 + - test/dm/test-dm.sh to run these.
  279 + image
  280 + - Unit tests for images:
  281 + test/image/test-imagetools.sh - multi-file images
  282 + test/image/test-fit.py - FIT images
  283 + tracing
  284 + - test/trace/test-trace.sh tests the tracing system (see README.trace)
  285 + verified boot
  286 + - See test/vboot/vboot_test.sh for this
  287 +
  288 +If you change or enhance any of the above subsystems, you shold write or
  289 +expand a test and include it with your patch series submission. Test
  290 +coverage in U-Boot is limited, as we need to work to improve it.
  291 +
  292 +Note that many of these tests are implemented as commands which you can
  293 +run natively on your board if desired (and enabled).
  294 +
  295 +It would be useful to have a central script to run all of these.
  296 +
  297 +--
  298 +Simon Glass <sjg@chromium.org>
  299 +Updated 22-Mar-14
include/configs/sandbox.h
... ... @@ -140,8 +140,6 @@
140 140 #define CONFIG_CROS_EC
141 141 #define CONFIG_CMD_CROS_EC
142 142 #define CONFIG_CROS_EC_SANDBOX
143   -#define CONFIG_KEYBOARD
144   -#define CONFIG_CROS_EC_KEYB
145 143 #define CONFIG_ARCH_EARLY_INIT_R
146 144 #define CONFIG_BOARD_LATE_INIT
147 145  
148 146  
... ... @@ -149,7 +147,12 @@
149 147 #define CONFIG_SOUND_SANDBOX
150 148 #define CONFIG_CMD_SOUND
151 149  
  150 +#ifndef SANDBOX_NO_SDL
152 151 #define CONFIG_SANDBOX_SDL
  152 +#endif
  153 +
  154 +/* LCD and keyboard require SDL support */
  155 +#ifdef CONFIG_SANDBOX_SDL
153 156 #define CONFIG_LCD
154 157 #define CONFIG_VIDEO_SANDBOX_SDL
155 158 #define CONFIG_CMD_BMP
156 159  
... ... @@ -158,9 +161,18 @@
158 161 #define CONFIG_SYS_CONSOLE_IS_IN_ENV
159 162 #define LCD_BPP LCD_COLOR16
160 163  
  164 +#define CONFIG_CROS_EC_KEYB
  165 +#define CONFIG_KEYBOARD
  166 +
161 167 #define CONFIG_EXTRA_ENV_SETTINGS "stdin=serial,cros-ec-keyb\0" \
162 168 "stdout=serial,lcd\0" \
163 169 "stderr=serial,lcd\0"
  170 +#else
  171 +
  172 +#define CONFIG_EXTRA_ENV_SETTINGS "stdin=serial\0" \
  173 + "stdout=serial,lcd\0" \
  174 + "stderr=serial,lcd\0"
  175 +#endif
164 176  
165 177 #define CONFIG_GZIP_COMPRESSED
166 178 #define CONFIG_BZIP2
... ... @@ -192,6 +192,7 @@
192 192 A sign-off is added automatically to your patches (this is
193 193 probably a bug). If you put this tag in your patches, it will
194 194 override the default signoff that patman automatically adds.
  195 + Multiple duplicate signoffs will be removed.
195 196  
196 197 Tested-by: Their Name <email>
197 198 Reviewed-by: Their Name <email>
tools/patman/commit.py
... ... @@ -29,6 +29,7 @@
29 29 self.tags = []
30 30 self.changes = {}
31 31 self.cc_list = []
  32 + self.signoff_set = set()
32 33 self.notes = []
33 34  
34 35 def AddChange(self, version, info):
... ... @@ -72,4 +73,17 @@
72 73 cc_list: List of aliases or email addresses
73 74 """
74 75 self.cc_list += cc_list
  76 +
  77 + def CheckDuplicateSignoff(self, signoff):
  78 + """Check a list of signoffs we have send for this patch
  79 +
  80 + Args:
  81 + signoff: Signoff line
  82 + Returns:
  83 + True if this signoff is new, False if we have already seen it.
  84 + """
  85 + if signoff in self.signoff_set:
  86 + return False
  87 + self.signoff_set.add(signoff)
  88 + return True
tools/patman/gitutil.py
... ... @@ -11,6 +11,7 @@
11 11 import sys
12 12 import terminal
13 13  
  14 +import checkpatch
14 15 import settings
15 16  
16 17  
... ... @@ -193,6 +194,7 @@
193 194 Args:
194 195 fname: filename of patch file to apply
195 196 """
  197 + col = terminal.Color()
196 198 cmd = ['git', 'am', fname]
197 199 pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE,
198 200 stderr=subprocess.PIPE)
... ... @@ -203,8 +205,8 @@
203 205 print line
204 206 match = re_error.match(line)
205 207 if match:
206   - print GetWarningMsg('warning', match.group(1), int(match.group(2)),
207   - 'Patch failed')
  208 + print checkpatch.GetWarningMsg(col, 'warning', match.group(1),
  209 + int(match.group(2)), 'Patch failed')
208 210 return pipe.returncode == 0, stdout
209 211  
210 212 def ApplyPatches(verbose, args, start_point):
tools/patman/patchstream.py
... ... @@ -21,7 +21,7 @@
21 21 re_allowed_after_test = re.compile('^Signed-off-by:')
22 22  
23 23 # Signoffs
24   -re_signoff = re.compile('^Signed-off-by:')
  24 +re_signoff = re.compile('^Signed-off-by: *(.*)')
25 25  
26 26 # The start of the cover letter
27 27 re_cover = re.compile('^Cover-letter:')
... ... @@ -159,6 +159,7 @@
159 159 commit_tag_match = re_commit_tag.match(line)
160 160 commit_match = re_commit.match(line) if self.is_log else None
161 161 cover_cc_match = re_cover_cc.match(line)
  162 + signoff_match = re_signoff.match(line)
162 163 tag_match = None
163 164 if self.state == STATE_PATCH_HEADER:
164 165 tag_match = re_tag.match(line)
... ... @@ -223,7 +224,7 @@
223 224 if is_blank:
224 225 # Blank line ends this change list
225 226 self.in_change = 0
226   - elif line == '---' or re_signoff.match(line):
  227 + elif line == '---':
227 228 self.in_change = 0
228 229 out = self.ProcessLine(line)
229 230 else:
... ... @@ -271,6 +272,11 @@
271 272 self.commit.AddCc(tag_match.group(2).split(','))
272 273 else:
273 274 self.tags.append(line);
  275 +
  276 + # Suppress duplicate signoffs
  277 + elif signoff_match:
  278 + if self.commit.CheckDuplicateSignoff(signoff_match.group(1)):
  279 + out = [line]
274 280  
275 281 # Well that means this is an ordinary line
276 282 else: