Difference between revisions of "Change Linux Command Line Parameter from U-boot"

From DAVE Developer's Wiki
Jump to: navigation, search
(Created page with " {{InfoBoxTop}} {{Applies To U-Boot}} {{InfoBoxBottom}} {{WorkInProgress}}")
 
Line 5: Line 5:
  
 
{{WorkInProgress}}
 
{{WorkInProgress}}
 +
 +
When booting a Linux kernel, U-Boot, among the other things, take care of passing a string called ''command line'' as kernel parameter. U-Boot uses its '''bootargs''' environment variable as parameter. This variable can be defined statically in U-Boot environment as follow:
 +
 +
<pre class="board-terminal">
 +
NAON#setenv bootargs 'root=/dev/mmcblk0p1 rw console=ttyO0,115200n8 earlyprintk mem=176M vram=46M notifyk.vpssm3_sva=0xBF900000'
 +
NAON#saveenv
 +
Saving Environment to SPI Flash...
 +
Erasing SPI flash...Writing to SPI flash...done
 +
NAON#
 +
</pre>
 +
 +
But a most commonly used approach is to use different environment variables that ''append'' a dedicated section of command line. This is more flexible and allow the user to change only a single part of the command line without take care of the whole string.
 +
 +
=== Runtime Kernel command line creation ===
 +
 +
As noted above, commonly the command line is created by U-Boot environment variable substitution and string concatenation.
 +
 +
As an example we'll how to change [[:Category:Naon|Naon]] frame buffer size by using the default environment variables setup.
 +
 +
Here is a dump of the interesting sections of the environment:
 +
 +
<pre class="board-terminal">
 +
NAON#printenv net_nfs nfsargs addip addcons addmem mem vram
 +
net_nfs=run loadk nfsargs addip addcons addmem; bootm ${buf}
 +
nfsargs=setenv bootargs root=/dev/nfs rw nfsroot=${serverip}:${rootpath} panic=5
 +
addip=setenv bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gateway}:${netmask}:${hostname}:${ethdev}
 +
addcons=setenv bootargs ${bootargs} console=${console},115200n8 earlyprintk
 +
addmem=setenv bootargs ${bootargs} mem=${mem} vram=${vram} notifyk.vpssm3_sva=${notify_mem}
 +
mem=176M
 +
vram=46M
 +
</pre>
 +
 +
When using ''net_nfs'' configuration, which loads the kernel binary image from TFTP and uses NFS as root file system, U-Boot:
 +
* initializes bootargs when running ''nfsargs'' macro
 +
* appends network configuration when running ''addip'' macro (see [http://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt] for a more detailed explanation of all this parameters)
 +
* appends console configuration with ''addcons'' macro
 +
* appends memory parameters with ''addmem'' macro
 +
** please note that this macro uses ''mem'', ''vram'' and ''notify_mem'' variable substitution to setup its parameter
 +
 +
For this reason a simple
 +
 +
<pre class="board-terminal">
 +
NAON#setenv vram 36M
 +
NAON#saveenv
 +
Saving Environment to SPI Flash...
 +
Erasing SPI flash...Writing to SPI flash...done
 +
</pre>
 +
 +
Will reduce framebuffer memory allocation from 46MiB to 36MiB.
 +
 +
Here is the new boot output:
 +
 +
<pre class="board-terminal">
 +
NAON#run net_nfs
 +
TFTP from server 192.168.0.250; our IP address is 192.168.0.78
 +
[snip]
 +
Bytes transferred = 2688084 (290454 hex)
 +
## Booting kernel from Legacy Image at 81000000 ...
 +
  Image Name:  Linux-2.6.37-naon-0.2.0
 +
  Image Type:  ARM Linux Kernel Image (uncompressed)
 +
  Data Size:    2688020 Bytes = 2.6 MiB
 +
  Load Address: 80008000
 +
  Entry Point:  80008000
 +
  Verifying Checksum ... OK
 +
  Loading Kernel Image ... OK
 +
OK
 +
 +
Starting kernel ...
 +
 +
Uncompressing Linux... done, booting the kernel.
 +
[    0.000000] Linux version 2.6.37-naon-0.2.0 (ezsdk@ezsdk) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #2 Mon May 7 18:21:09 CEST 2012
 +
[    0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c53c7f
 +
[    0.000000] CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache
 +
[    0.000000] Machine: naon
 +
[    0.000000] bootconsole [earlycon0] enabled
 +
[    0.000000] vram size = 37748736 at 0x0
 +
[    0.000000] reserved size = 37748736 at 0x0
 +
[    0.000000] FB: Reserving 37748736 bytes SDRAM for VRAM
 +
[    0.000000] Memory policy: ECC disabled, Data cache writeback
 +
[    0.000000] OMAP chip is TI8148 2.0
 +
[    0.000000] SRAM: Mapped pa 0x40300000 to va 0xfe400000 size: 0x20000
 +
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 35488
 +
[    0.000000] Kernel command line: root=/dev/nfs rw nfsroot=192.168.0.250:/home/shared/devel/dave/naon-DAA/sw/linux/sdk/rfs/nelk-min panic=5 ip=192.168.0.78:192.168.0.250:192.168.0.254:255.255.255.0:naon:eth0 console=ttyO0,115200n8 earlyprintk mem=176M vram=36M notifyk.vpssm3_sva=0xBF900000
 +
[    0.000000] PID hash table entries: 1024 (order: 0, 4096 bytes)
 +
[snip]
 +
</pre>

Revision as of 16:05, 8 May 2012

Info Box
Tux.png Applies to U-Boot


WorkInProgress.gif

When booting a Linux kernel, U-Boot, among the other things, take care of passing a string called command line as kernel parameter. U-Boot uses its bootargs environment variable as parameter. This variable can be defined statically in U-Boot environment as follow:

NAON#setenv bootargs 'root=/dev/mmcblk0p1 rw console=ttyO0,115200n8 earlyprintk mem=176M vram=46M notifyk.vpssm3_sva=0xBF900000'
NAON#saveenv
Saving Environment to SPI Flash...
Erasing SPI flash...Writing to SPI flash...done
NAON#

But a most commonly used approach is to use different environment variables that append a dedicated section of command line. This is more flexible and allow the user to change only a single part of the command line without take care of the whole string.

Runtime Kernel command line creation[edit | edit source]

As noted above, commonly the command line is created by U-Boot environment variable substitution and string concatenation.

As an example we'll how to change Naon frame buffer size by using the default environment variables setup.

Here is a dump of the interesting sections of the environment:

NAON#printenv net_nfs nfsargs addip addcons addmem mem vram
net_nfs=run loadk nfsargs addip addcons addmem; bootm ${buf}
nfsargs=setenv bootargs root=/dev/nfs rw nfsroot=${serverip}:${rootpath} panic=5
addip=setenv bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gateway}:${netmask}:${hostname}:${ethdev}
addcons=setenv bootargs ${bootargs} console=${console},115200n8 earlyprintk
addmem=setenv bootargs ${bootargs} mem=${mem} vram=${vram} notifyk.vpssm3_sva=${notify_mem}
mem=176M
vram=46M

When using net_nfs configuration, which loads the kernel binary image from TFTP and uses NFS as root file system, U-Boot:

  • initializes bootargs when running nfsargs macro
  • appends network configuration when running addip macro (see [1] for a more detailed explanation of all this parameters)
  • appends console configuration with addcons macro
  • appends memory parameters with addmem macro
    • please note that this macro uses mem, vram and notify_mem variable substitution to setup its parameter

For this reason a simple

NAON#setenv vram 36M
NAON#saveenv
Saving Environment to SPI Flash...
Erasing SPI flash...Writing to SPI flash...done

Will reduce framebuffer memory allocation from 46MiB to 36MiB.

Here is the new boot output:

NAON#run net_nfs
TFTP from server 192.168.0.250; our IP address is 192.168.0.78
[snip]
Bytes transferred = 2688084 (290454 hex)
## Booting kernel from Legacy Image at 81000000 ...
   Image Name:   Linux-2.6.37-naon-0.2.0
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2688020 Bytes = 2.6 MiB
   Load Address: 80008000
   Entry Point:  80008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
[    0.000000] Linux version 2.6.37-naon-0.2.0 (ezsdk@ezsdk) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #2 Mon May 7 18:21:09 CEST 2012
[    0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c53c7f
[    0.000000] CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine: naon
[    0.000000] bootconsole [earlycon0] enabled
[    0.000000] vram size = 37748736 at 0x0
[    0.000000] reserved size = 37748736 at 0x0
[    0.000000] FB: Reserving 37748736 bytes SDRAM for VRAM
[    0.000000] Memory policy: ECC disabled, Data cache writeback
[    0.000000] OMAP chip is TI8148 2.0
[    0.000000] SRAM: Mapped pa 0x40300000 to va 0xfe400000 size: 0x20000
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 35488
[    0.000000] Kernel command line: root=/dev/nfs rw nfsroot=192.168.0.250:/home/shared/devel/dave/naon-DAA/sw/linux/sdk/rfs/nelk-min panic=5 ip=192.168.0.78:192.168.0.250:192.168.0.254:255.255.255.0:naon:eth0 console=ttyO0,115200n8 earlyprintk mem=176M vram=36M notifyk.vpssm3_sva=0xBF900000
[    0.000000] PID hash table entries: 1024 (order: 0, 4096 bytes)
[snip]