The kernel is basically the brain and spinal cord. Drivers to operate hardware are part of the kernel. A module is also part of the kernel, but it can be loaded/unloaded on a running system…the kernel image itself cannot. Typically there is a kernel with most features built into it, and a few options chosen later by creating a module instead of rebuilding the whole kernel. You don’t need to be a developer to build a kernel, but you do need to be a bit tech-savvy. With a desktop PC this is somewhat simplified…with an embedded system it gets a bit more complicated.
So “Image” is the name of the file which is the kernel. Building a new kernel means building a new image. Building a module implies working with the original Image, but perhaps adding a file to where modules are searched for.
The device tree is a shorthand notation for assigning various settings to hardware. Basically it is associated with setting up hardware before its use…but these are settings which can be changed, though not often…so it is called hardware when it is hard wired, firmware when it can be changed but changes how the hardware behaves, and software when it is independent of how the hardware works. In a desktop motherboard the BIOS would set up much of the firmware…in an embedded system you have to do more to set this up before the system starts booting.
Do know that there are lots of Linux tutorials out there on configuring a kernel. It will be a learning curve, it won’t be impossible. Something which will give you an advantage is to know that on a running Jetson there will be a file in directory “/proc”. That file is “config.gz”. This is not a real file, it is actually in RAM and is a reflection of the running kernel’s configuration…that configuration being one of every feature or option the kernel was built to support. To change a kernel you start with the original configuration, and only then do you make changes for what you want.
Your “make -j6” command did not specify anything specific to build, so it tried to build everything. If one part needed another part, and if that part had not been configured, you would get an error. The file “/proc/config.gz” can be copied to where your kernel source is, then uncompressed with “gunzip config.gz”. Copy it to name “.config” and the kernel build will see it (“cp config .config” will do the copy). If you run “make menuconfig” you will get an application for human-readable editing of kernel features. You will need to understand how to do that before you can do anything significant. Try it, then “make mrproper” to clean it all out and start over…practice. You can use “make nconfig” for an alternate version of menuconfig which gives you some ability to search for symbols (such as the shorthand name of a driver you want to install for your device). “make xconfig” is a graphical version. You may need to install the devel version of the ncurses5 package to get these to work…this is an Ubuntu adminstration topic and not particular to kernels or Jetsons.
When you “make -j6 Image”, then you make the kernel image. When you “make -j6 modules”, then you make dynamically insertable modules which can become part of a kernel as it runs. The part in the error about dtbs is about firmware, and you don’t need this to change to do what you want…your command which did not name Image or modules wanted to build everything. You don’t need everything.
In the download page for your version of L4T is Documentation. This has much of what you want for basic procedures, although it is not a tutorial. For R27.1 see:
For the R28.1 which was released yesterday, see:
Search google for “configure linux kernel tutorial”. Understand that the Image file is an uncompressed file, but that different versions of compression are used with different hardware and different flavors of boot loader software. So if you see zImage, or bzImage, or uImage, just think “Image” since the Jetson does not use compression. Any time you build a compressed version it will build Image first, and then create a compressed version as well. Just build Image since you don’t need a compressed version.
There are also topics on cross-compiling. When you build a kernel (the “make -j6”) you are building it for the computer you are building on. With various options the kernel will be built on your desktop PC, but target a different type of computer. Building for the PC on a PC is native compile for copy to a native architecture. Building on a PC for copy to a Jetson is cross compile to a foreign architecture. When this is the case you need to install extra tools on the PC (JetPack can probably do this). You also need some extra compile options (often something starting with “O=” or similar). There are a lot of steps, you’ll just need find a place to start based on the Document download of one of those above URLs.
Btw, if you use Windows and it detects a new device and asks if you want to install a driver for it, this is basically what you are doing. Someone has compiled a driver for your architecture and made it available on the internet…then the driver is downloaded and installed. Your PC is used to create the driver and then the module is being manually copied to the Jetson. Mostly the drivers are out there, but you have to manually tell the system how to build and install the driver, it isn’t automatic.