How do I disable boot messages and display a custom splash screen?

I want to disable boot messages to the HDMI monitor, and if possible, set a custom
splash screen. I am starting with X (i.e. lightdm) disabled, and then start Xorg during my application
startup process.

I have tried modifying the command line in /boot/extlinux/extlinux.conf, but ${cbootargs}
seems to come from u-boot.

I tried modifying the u-boot ‘cbootargs’ environment variable to remove ‘console=tty0’ (which
I think forces messages to the first HDMI monitor) but it always gets overwritten.

I found some references to using plymouth but I don’t think I’m using this – the unit starts
Xorg -nocursor and then a dedicated full-screen application.

I would like to be able to put up a custom splash screen early in the process. If I enable
‘splash’ in the kernel command line I get the ubuntu splash screen. Is there any way
to change the image?

Thanks in Advance,


You might find this of interest:

I believe bootloader splash should be ready on rel-28.2 DP. Please try it.

I would like to replace boot messages with a custom splash screen. May I know the procedure for L4T 28.2?

I haven’t done this myself, but these might be what you need:

Thank you. Can you also please point me to how to access u-boot and remove console=tty0 from it which can be found using “cat /proc/cmdline”.

I believe this will hide any pre boot as well as post shutdown messages.

@linuxdev How can I access u-boot command line? I believe I can edit console-tty0 using setenv, but I am not sure how to start the u-boot shell. Its mentioned in threads to press any key on jetson boot but this doesn’t work for me.

In "/boot/extlinux/extlinux.conf " you’ll notice that the “APPEND” key/value pair has in it:

APPEND ${cbootargs} root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4

Only the “root=” and to the right are actually configured from extlinux.conf. “${cbootargs}” is inherited from U-Boot. U-Boot gets this from the device tree.

If you use a serial console and start boot, but hit a key when it reaches this, it’ll stop and drop into a U-Boot shell:

[0003.736] I> <b>tegrabl_load_kernel_and_dtb: Done</b>

U-Boot 2016.07-g9c3b9a4 (Mar 01 2018 - 20:41:10 -0800)

Model: NVIDIA P2771-0000-500
DRAM:  7.8 GiB
MC:   Tegra SD/MMC: 0, Tegra SD/MMC: 1
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   eth0: ethernet@2490000
<b>Hit any key to stop autoboot:</b>  0

Within this shell you can run command “help” for general help, or “printenv” to see environment variables. To specifically see the content of “cbootargs” you can run either of these:

printenv cbootargs
echo <b>$</b>cbootargs

You can set a new value for a variable with the “setenv” command (“help setenv”). Note that if you do this, then the change will be for only one boot, and will be lost after that…the cbootargs variable will revert to its old value. To save permenently you would do the same edit, and then “saveenv”. It’s good to test before saving. Be sure to write down the original value in case you need to restore it later. However, I don’t know for sure if the method of merging cbootargs from the device tree would still override your change even after a saveenv (if the variable were not created through inheritance, then I’m sure it would be saved…you might have to test to see if the inheritance mechanism of cbootargs overwrites saveenv changes).

The second way to change this is by changing the device tree. Details on actually saving a new device tree through the tool differs depending on release, but you get an exact match of your running system no matter which release you use (and this can be both saved as a reference and a copy edited before using the correct device tree install for that particular release). To get a device tree from a running system:

dtc -I fs -O dts -o extracted.dts /proc/device-tree
# Save a reference copy somewhere, then edit for cbootargs within extracted.dts, then convert extracted.dts back to dtb binary:
dtc -I dts -O dtb new_binary_tree.dtb extracted.dts

Flashing this new_binary_tree.dtb should do the job.

As to actual edits, search with the dts for "bootargs = ". Note that serial console is via the “console=ttyS0,115200n8”, and regular console is via “console=tty0”. If you disable the serial console side you’ll lose the ability to interact with the bootloader until you flash a new device tree…just remove the “console=tty0” part.

Also note that cbootargs is not necessarily an exact match too device tree “bootargs”. The cboot stage occurs prior to U-Boot and may merge some details in to the bootargs of the device tree before passing it on to U-Boot…and then it becomes “cbootargs” (for U-Boot) instead of “bootargs” (device tree).

Trivia: The details of merging early device tree with edits is why the FDT key/value pair in extlinux.conf is no longer used…and why only some of the parameters of the kernell command line can be overridden with the APPEND key/value pair of extlinux.conf. The parameters shown can be overridden, but things may not go as expected when overriding some of the other values due to interaction at the cboot stage with the device tree version. Maybe one of these days we’ll get back to being able to use the FDT entry again…don’t know.

@linuxdev I followed change splash method, but it only worked when reflashing the board with

sudo ./ jetson-tx2 mmcblk0p1

and not when updating bootloader only using

sudo ./ -r -k cpu-bootloader jetson-tx2 mmcblk0p1

Secondly, I followed your dts to dtb and vice versa instructions and removed console=tty0 in bootargs, followed by replacing tegra186-quill-p3310-1000-c03-00-base.dtb with new_binary_tree.dtb similar to how mentioned at This caused a reset loop with still showing boot messages and ending up at ‘Rebooting in 5…4…3…’ As I don’t have access to serial console I removed console=tty0 in p2771-0000.conf.common which I believe is cboorargs and reflashed the board, this removed any console messages but I am still stuck in reset loop without booting in the l4t.

Can you please suggest a solution to this error? Thanks!

You might be interested in this patch which was needed to get just the DTB:

This patch was for R28.2, but it looks like it didn’t make its way into R28.2.1.

Normally you’d only be able to verify if the Linux kernel itself was changed from within Linux. If you examine “/proc/cmdline” on the running system, then this is where you’d want to have “console=ttyS0” gone (in the device tree it will probably be “console=tty0”, then cboot will modify it). Are you able to verify the content of “/proc/cmdline” changed? Try temporarily within the U-Boot environment,

As for flashing the U-Boot binary itself I have not done this. U-Boot does need to be modified separately if and only if you want to change U-Boot’s compiled behavior (such as the splash screen). However, you probably want to start with removing console messages from the Linux stage prior to working on U-Boot.

As an example, I went into the U-Boot console and entered this (it is a copy of the original cbootargs without the “console=ttyS0”, but leaves serial console):

set cbootargs 'root=/dev/mmcblk0p1 rw rootwait console=ttyS0,115200n8 OS=l4t fbcon=map:0 net.ifnames=0 memtype=0 video=tegrafb no_console_suspend=1 earlycon=uart8250,mmio32,0x03100000 nvdumper_reserved=0x2772e0000 gpt tegra_fbmem2=0x140000@0x969ec000 lut_mem2=0x2008@0x969e9000 tegraid= tegra_keep_boot_clocks maxcpus=6 boot.slot_suffix= boot.ratchetvalues=0.1.1 androidboot.serialno=0334916010131 bl_prof_dataptr=0x10000@0x277040000 sdhci_tegra.en_boot_part_access=1'

When I boot this there is no console text. If I reboot, then console text comes back since I didn’t “saveenv”.

After you verify removing “console=ttyS0” from “cbootargs” works as expected from a temporary edit try modifying the device tree to remove the similar “console=tty0”. Go to the U-Boot console, verify that “cbootargs” no longer has “console=ttyS0” (verify the device tree change reflected in the cbootargs environment variable). If so, then it should work within the Linux part of boot to no longer get boot messages. If not, then we can go from there.

Replacing the U-Boot binary with options changed for splash is something someone else will need to help with since I’ve not replaced or modified the splash before.

Thanks @linuxdev, The patch you mentioned didn’t work as the flash script is a bit different in 28.2.1, however, I am able to get splash screen + no console messages working on 28.2.1.

As you mentioned, I modified U-Boot separately and the splash screen showed up with no console messages. That reset loop broke when after changing and building the device tree with modified dtb I first ran the jetson and then copied back the default dtb file, this seems to fix the issue for me.


Would you share your experience with more details. I’d like to diable the console log and replace splash screen on boot, but i can’t accomplish that. Help!

To change the splash screen, this repository might be useful:

And this thread:

Hi @snarky, I use your program. But it creates huge file for my Jetson Nano. I tried different images, and size of a bmp.blob always 9.9 Mb. Size of an original bmp.blob is 71kb. Because of this i have error:

[ 530.5830 ] Writing partition BMP with bmp.blob
[ 530.6640 ] 00000004: Filesize is bigger than partition size
[ 530.6889 ] 
Error: Return value 4
Command tegradevflash --pt flash.xml.bin --storageinfo storage_info.bin --create
Failed flashing t210ref.

Thanks in Advance