Difference between revisions of "Linux Kernel 4.9.y"

From IGEP - ISEE Wiki

Jump to: navigation, search
Line 9: Line 9:
 
Por defecto empezaremos con un defconfig ya creado por igep para procesadores imx
 
Por defecto empezaremos con un defconfig ya creado por igep para procesadores imx
  
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl">
+
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl"><div id="highlighter_162759" class="syntaxhighlighter sh-confluence nogutter  java">
<div id="highlighter_162759" class="syntaxhighlighter sh-confluence nogutter  java">
 
 
{| border="0" cellspacing="0" cellpadding="0"
 
{| border="0" cellspacing="0" cellpadding="0"
 
|-
 
|-
 
| class="code"|<div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2"><code class="java plain">imx6_igep0046_defconfig</code>
 
| class="code"|<div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2"><code class="java plain">imx6_igep0046_defconfig</code>
  
 
+
</div>
 
</div>
 
</div>
 
|}</div>
 
|}</div>
</div>
 
 
</div>
 
</div>
 
</div>
 
</div>
Line 25: Line 23:
 
En el caso de igep con procesadores imx
 
En el caso de igep con procesadores imx
  
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl">
+
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl"><div id="highlighter_265765" class="syntaxhighlighter sh-confluence nogutter  java">
<div id="highlighter_265765" class="syntaxhighlighter sh-confluence nogutter  java">
 
 
{| border="0" cellspacing="0" cellpadding="0"
 
{| border="0" cellspacing="0" cellpadding="0"
 
|-
 
|-
Line 46: Line 43:
 
<div class="line number14 index13 alt1"><code class="java plain">imx6qdl-igep-igep0046ra.dtsi</code></div>
 
<div class="line number14 index13 alt1"><code class="java plain">imx6qdl-igep-igep0046ra.dtsi</code></div>
 
<div class="line number15 index14 alt2"><code class="java plain">imx6qdl-igep-igep0046rc.dtsi</code></div>
 
<div class="line number15 index14 alt2"><code class="java plain">imx6qdl-igep-igep0046rc.dtsi</code></div>
 +
</div>
 
</div>
 
</div>
 
|}</div>
 
|}</div>
</div>
 
 
</div>
 
</div>
 
</div>
 
</div>
Line 55: Line 52:
 
Para que el kernel compile las .dts en dtb se ha de añadir en el Makefile de arch/arm/boot/dts/
 
Para que el kernel compile las .dts en dtb se ha de añadir en el Makefile de arch/arm/boot/dts/
  
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl">
+
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl"><div id="highlighter_599857" class="syntaxhighlighter sh-confluence nogutter  java">
<div id="highlighter_599857" class="syntaxhighlighter sh-confluence nogutter  java">
 
 
{| border="0" cellspacing="0" cellpadding="0"
 
{| border="0" cellspacing="0" cellpadding="0"
 
|-
 
|-
Line 66: Line 62:
 
<div class="line number4 index3 alt1"><code class="java spaces">    </code><code class="java plain">imx6q-igep-base0040rc2.dtb \</code></div>
 
<div class="line number4 index3 alt1"><code class="java spaces">    </code><code class="java plain">imx6q-igep-base0040rc2.dtb \</code></div>
 
<div class="line number5 index4 alt2"><code class="java spaces">    </code><code class="java plain">imx6q-igep-base0040rd102.dtb \</code></div>
 
<div class="line number5 index4 alt2"><code class="java spaces">    </code><code class="java plain">imx6q-igep-base0040rd102.dtb \</code></div>
 +
</div>
 
</div>
 
</div>
 
|}</div>
 
|}</div>
</div>
 
 
</div>
 
</div>
 
</div>
 
</div>
Line 133: Line 129:
 
2- Configurar el kernel con la minima configuracion que nos ofrece
 
2- Configurar el kernel con la minima configuracion que nos ofrece
  
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl">
+
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl"><div id="highlighter_902183" class="syntaxhighlighter sh-confluence nogutter  java">
<div id="highlighter_902183" class="syntaxhighlighter sh-confluence nogutter  java">
 
 
{| border="0" cellspacing="0" cellpadding="0"
 
{| border="0" cellspacing="0" cellpadding="0"
 
|-
 
|-
 
| class="code"|<div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2"><code class="java plain">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx6_igep0046_defconfi</code>
 
| class="code"|<div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2"><code class="java plain">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx6_igep0046_defconfi</code>
  
 
+
</div>
 
</div>
 
</div>
 
|}</div>
 
|}</div>
</div>
 
 
</div>
 
</div>
 
</div>
 
</div>
 
3- Ejecutar el menuconfig para optimizar la configuracion a traves del menú.
 
3- Ejecutar el menuconfig para optimizar la configuracion a traves del menú.
  
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl">
+
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl"><div id="highlighter_965738" class="syntaxhighlighter sh-confluence nogutter  java">
<div id="highlighter_965738" class="syntaxhighlighter sh-confluence nogutter  java">
 
 
{| border="0" cellspacing="0" cellpadding="0"
 
{| border="0" cellspacing="0" cellpadding="0"
 
|-
 
|-
 
| class="code"|<div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2"><code class="java plain">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig</code>
 
| class="code"|<div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2"><code class="java plain">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig</code>
  
 
+
</div>
 
</div>
 
</div>
 
|}</div>
 
|}</div>
</div>
 
 
</div>
 
</div>
 
</div>
 
</div>
Line 163: Line 155:
 
4- Compilar la imagen los modulos y las dtb
 
4- Compilar la imagen los modulos y las dtb
  
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl">
+
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl"><div id="highlighter_56426" class="syntaxhighlighter sh-confluence nogutter  java">
<div id="highlighter_56426" class="syntaxhighlighter sh-confluence nogutter  java">
 
 
{| border="0" cellspacing="0" cellpadding="0"
 
{| border="0" cellspacing="0" cellpadding="0"
 
|-
 
|-
 
| class="code"|<div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2"><code class="java plain">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs</code>
 
| class="code"|<div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2"><code class="java plain">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs</code>
  
 
+
</div>
 
</div>
 
</div>
 
|}</div>
 
|}</div>
</div>
 
 
</div>
 
</div>
 
</div>
 
</div>
 
5- Instalar en el rootfs los modulos del kernel que son cargables ( es decir que no estan built-in)
 
5- Instalar en el rootfs los modulos del kernel que son cargables ( es decir que no estan built-in)
  
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl">
+
<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl"><div id="highlighter_785157" class="syntaxhighlighter sh-confluence nogutter  java">
<div id="highlighter_785157" class="syntaxhighlighter sh-confluence nogutter  java">
 
 
{| border="0" cellspacing="0" cellpadding="0"
 
{| border="0" cellspacing="0" cellpadding="0"
 
|-
 
|-
 
| class="code"|<div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2"><code class="java plain">sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install INSTALL_MOD_PATH=/opt/nfs-server/rootfs/ubuntu-xenial-armhf-base</code>
 
| class="code"|<div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2"><code class="java plain">sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install INSTALL_MOD_PATH=/opt/nfs-server/rootfs/ubuntu-xenial-armhf-base</code>
  
 
+
</div>
 
</div>
 
</div>
 
|}</div>
 
|}</div>
</div>
 
 
</div>
 
</div>
 
</div>
 
</div>

Revision as of 10:21, 7 May 2018

Introduction

This article is for specific 2.6.37.y Linux kernel branch series. All the steps has been tested with Ubuntu 12.04 64b and IGEP SDK Yocto Toolchain 1.2.2-3.


---- 

Para dar soporte a una nueva board basada en imx en el kernel es necesario tener un fichero de configuracion defconfig (.config) y  una dtb.

Por defecto empezaremos con un defconfig ya creado por igep para procesadores imx

imx6_igep0046_defconfig

Para que el kernel compile la dtb es necesario tener una dts con la configuración de los periféricos y los drivers que los gestionan,ademas de una anidación al dtsi del procesador correspondiente ( en este caso imx6 ya sea quad, dual, solo ...)

En el caso de igep con procesadores imx

DUAL


imx6dl-igep-base0040ra1.dts
imx6dl-igep-base0040rc2.dts
imx6dl-igep-base0040rd102.dts
 
QUAD
imx6q-igep-base0040ra1.dts
imx6q-igep-base0040rc2.dts
imx6q-igep-base0040rd102.dts
 
GENERICA
imx6qdl-igep-base0040ra.dtsi
imx6qdl-igep-base0040rb.dtsi
imx6qdl-igep-igep0046ra.dtsi
imx6qdl-igep-igep0046rc.dtsi

Las DTS están anidadas, esto quiere decir que se cogerá la dtb generada a partir de la .dts dependiendo del procesador que monte igep en este caso.

Para que el kernel compile las .dts en dtb se ha de añadir en el Makefile de arch/arm/boot/dts/

(dentro de dtb-$(CONFIG_SOC_IMX6Q) += \)


   imx6dl-igep-base0040rc2.dtb \
    imx6dl-igep-base0040rd102.dtb \
    imx6q-igep-base0040rc2.dtb \
    imx6q-igep-base0040rd102.dtb \

Setup IGEP SDK Yocto Toolchain 1.2.2-3

Install

Download - isee.biz

follow the next steps:

  • Open a terminal
  • Located your downloaded file, in my case is inside /home/jdoe/Downloads:
<span style="color: #000000;">jdoe@ubuntu ~ $ cd Downloads/</span>
  • Extract binaries in root directory with root privileges
<span style="color: #000000;">jdoe@ubuntu ~/Downloads $ sudo tar jxf igep-sdk-yocto-toolchain-*.tar.bz2 -C /</span>
  • Make sure that binaries are installed correctly.
<span style="color: #808080;"><span style="color: #000000;">jdoe@ubuntu ~/Downloads $ ls /opt/poky/
1.2  1.2.1</span> </span>

Configure

Open a terminal and type:

<span style="color: #000000;"> export PATH=/opt/poky/1.2/sysroots/i686-pokysdk-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi:$PATH  </span>

Compiled binaries

Binaries: latest stable kernel version IGEP OMAP3 devices is: 2.6.37-12 (20161206)

Platform Kernel source zImage binary (igep00x0_defconfig) Modules binaries (igep00x0_defconfig) zImage binary (igep00x0_wilink8_defconfig) Modules binaries (igep00x0_wilink8_defconfig) Compat Wireless source (only for igep00x0_wilink8_defconfig) Firmware binaries (only for igep00x0_wilink8_defconfig)
IGEP00x0 2.6.37-12(md5sum) zImage-2.6.37-12.bin (md5sum) modules-2.6.37-12(md5sum) zImage-2.6.37-12-wilink8.bin(md5sum) modules-2.6.37-12-wilink8(md5sum) compat-wireless-wilink8-0(md5sum) ti-connectivity-wilink8-0(md5sum)

Build kernel from sources

Download the latest stable version sources and follow next steps:

<span style="color: #808080;">wget <a class="external free" href="http://downloads.isee.biz/pub/releases/linux_kernel/v2.6.37-12/linux-omap-2.6.37-12.tar.gz" target="_blank" rel="nofollow noreferrer noopener">http://downloads.isee.biz/pub/releases/linux_kernel/v2.6.37-12/linux-omap-2.6.37-12.tar.gz</a>
tar xzf linux-omap-2.6.37-12.tar.gz
cd linux-omap-2.6.37-12
</span>

Also, it could download from GIT Repositories (http://git.isee.biz/) and test the last unstable version at your own risk (see "Linux mainline tree (development)" chapter in [index.php/The_Linux_kernel The Linux kernel])

Important procedures

  • Remove rootfs modules binaries from any previous Kernel
  • If you switch to another configuration, clean kernel sources with command: make mrproper
<span style="color: #000000;">Para compilar el kernel se ha de seguir los siguientes pasos:</span>

1- Descargar la rama correspondiente con git

2- Configurar el kernel con la minima configuracion que nos ofrece

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx6_igep0046_defconfi

3- Ejecutar el menuconfig para optimizar la configuracion a traves del menú.

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

Guardar la configuracion del menuconfig en .config

4- Compilar la imagen los modulos y las dtb

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

5- Instalar en el rootfs los modulos del kernel que son cargables ( es decir que no estan built-in)

sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install INSTALL_MOD_PATH=/opt/nfs-server/rootfs/ubuntu-xenial-armhf-base

Nota: Es muy importante que el INSTALL_MOD_PATH sea el correcto y de lugar justo al contenido que se esperaría en un sistema linux (usr, bin, etc, home, opt), este comando ademas se ha de ejecutar con sudo.

Si éste comando falla, es muy probable que instale los modulos en el Host PC pudiendo dejar inservible el actual SO.

Scenarios

Consider the following situations:

Scenario A. You have and IGEP0020 board plus IGEP0022 expansion board, then you should add in your [index.php/How_do_I_edit_my_kernel_command_line kernel command line]

<span style="color: #000000;">buddy=igep0022
</span>

Optionally, to enable the IGEP0022 modem which is disabled by default you should add in your [index.php/How_do_I_edit_my_kernel_command_line kernel command line]

<span style="color: #000000;">buddy=igep0022 buddy.modem=yes
</span>

NOTE: UART2 can be used for bluetooth OR modem in expansion board but NOT at same time. They are INCOMPATIBLE.

Scenario B. You have and IGEP0030 board plus BASE0010 expansion board, then you should add in your [index.php/How_do_I_edit_my_kernel_command_line kernel command line]

<span style="color: #000000;">buddy=base0010
</span>

Scenario C. You have and IGEP0030 board plus BASE0010 Rev. B expansion board, then you should add in your [index.php/How_do_I_edit_my_kernel_command_line kernel command line]

<span style="color: #000000;">buddy=base0010 buddy.revision=B
</span>

Scenario D. You have and IGEP0032 board plus BASE0010 Rev. B expansion board, then you should add in your [index.php/How_do_I_edit_my_kernel_command_line kernel command line]

<span style="color: #000000;">buddy=base0010 buddy.revision=B
</span>

Scenario E. You have and IGEP0030 board plus ILMS0015 expansion board, then you should add in your [index.php/How_do_I_edit_my_kernel_command_line kernel command line]

<span style="color: #000000;">buddy=ilms0015
</span>

Layout

Machine specific files are located in arch/arm/mach-omap2/ directory with name board-igep*.c :

  • board-igep0020.c: For IGEP0020 machine
  • board-igep0030.c: For IGEP0030 machine
  • board-igep0032.c: For IGEP0032 machine

Expansion board files, also are located in arch/arm/mach-omap2/ directory with name exp-*.c :

  • exp-igep0022.c: For IGEP0022 expansion board
  • exp-base0010.c: For BASE0010 expansion board
  • exp-ilms0015.c: For ILMS0015 expansion board

Adding New Expansion Boards

This chapter is meant to be a starting point for people to learn how to add your own expansion board in three steps.

Step 1: Add new expansion board file

As you can see in Layout chapter, an expansion board is called exp-.c and should be located in arch/arm/mach-omap2 directory, so the first step will be add a new file for your new expansion board. Following example creates a new expansion board file called exp-dummy.c (arch/arm/mach-omap2/exp-dummy.c)

<span style="color: #808080;"> #include <linux/kernel.h>
 #include <linux/init.h>

 void __init dummy_init(void)
 {
 	pr_info("Initializing expansion board ... \n");
 }
</span>

next, add the new file to be built

<span style="color: #808080;">diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 7505be9..a6572f2 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -156,6 +156,7 @@ obj-$(CONFIG_MACH_IGEP0020)         += board-igep0020.o \
 obj-$(CONFIG_MACH_IGEP0030)            += board-igep0030.o \
                                           board-igep00x0.o \
                                           exp-base0010.o \
+                                          exp-dummy.o \
                                           hsmmc.o
 obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK)     += board-omap3touchbook.o \
                                           hsmmc.o
</span>

Step 2: Register new expansion board

Now, edit board-igep00x0.h and add an identifier for the new expansion board, for example,

<span style="color: #808080;">diff --git a/arch/arm/mach-omap2/board-igep00x0.h b/arch/arm/mach-omap2/board-igep00x0.h
index 6b9b677..a2325d7 100644
--- a/arch/arm/mach-omap2/board-igep00x0.h
+++ b/arch/arm/mach-omap2/board-igep00x0.h
@@ -15,6 +15,7 @@
 #define IGEP00X0_BUDDY_NONE            0x01
 #define IGEP00X0_BUDDY_IGEP0022        0x01
 #define IGEP00X0_BUDDY_BASE0010        0x02
+#define IGEP00X0_BUDDY_DUMMY           0x03

 #define IGEP00X0_BUDDY_HWREV_A         (1 << 0)
 #define IGEP00X0_BUDDY_HWREV_B         (1 << 1)
</span>

also, edit in board-igep00x0.c the buddy_early_param to add the new expansion board,

<span style="color: #808080;">diff --git a/arch/arm/mach-omap2/board-igep00x0.c b/arch/arm/mach-omap2/board-igep00x0.c
index 2a2d8eb..f2b5b27 100644
--- a/arch/arm/mach-omap2/board-igep00x0.c
+++ b/arch/arm/mach-omap2/board-igep00x0.c
@@ -192,6 +192,9 @@ static int __init buddy_early_param(char *str)
                if (!strcmp(name, "base0010")) {
                        igep00x0_buddy_pdata.model = IGEP00X0_BUDDY_BASE0010;
                        pr_info("IGEP: IGEP0030 machine + BASE0010 (buddy)\n");
+               } else if (!strcmp(name, "dummy")) {
+                       igep00x0_buddy_pdata.model = IGEP00X0_BUDDY_DUMMY;
+                       pr_info("IGEP: IGEP0030 machine + DUMMY (buddy)\n");
                } else
                        pr_err("IGEP: Unknown buddy for IGEP0030 machine\n");
        }
</span>

Step 3: Run expansion board initialization

Finally, modify the machine file and add support for the new expansion board, for example:

<span style="color: #808080;">diff --git a/arch/arm/mach-omap2/board-igep0030.c b/arch/arm/mach-omap2/board-igep0030.c
index 2b97257..44b319d 100644
--- a/arch/arm/mach-omap2/board-igep0030.c
+++ b/arch/arm/mach-omap2/board-igep0030.c
@@ -204,6 +204,8 @@ static struct omap_board_mux board_mux[] __initdata = {

 /* Expansion board: BASE0010 */
 extern void __init base0010_init(struct twl4030_platform_data *pdata);
+/* Expansion board: DUMMY */
+extern void __init dummy_init(void);

 static void __init igep0030_init(void)
 {
@@ -223,6 +225,10 @@ static void __init igep0030_init(void)
        /* - BASE0010 (adds twl4030_pdata)  */
        if (igep00x0_buddy_pdata.model == IGEP00X0_BUDDY_BASE0010)
                base0010_init(&twl4030_pdata);
+       /* - DUMMY  */
+       if (igep00x0_buddy_pdata.model == IGEP00X0_BUDDY_DUMMY)
+               dummy_init();
+

        /* Add twl4030 common data */
        omap3_pmic_get_config(&twl4030_pdata, TWL_COMMON_PDATA_USB |
</span>

Known issues

See http://processors.wiki.ti.com/index.php/AM35x-OMAP35x-PSP_04.02.00.07_Release_Notes#Known_Issues_-_AM.2FDM37x

modules are not installed correctly

Try to change rootfs owner from root to your username.

<span style="color: #808080;"> sudo chown  -R /media/rootfs</span>

wlcore: Unknown symbol

Probably, you didn't erase old module binaries from rootfs. Open IGEP terminal and type:

<span style="color: #808080;">depmod -a
depmod -A </span>

Finally reboot the system