[Tiny4412] 移植 Linux-4.4.80 内核 (支持 dts)

来源:互联网 发布:移动办公软件有哪些 编辑:程序博客网 时间:2024/06/06 00:16

本文绝大部分参考 彭东林blog http://www.cnblogs.com/pengdonglin137/p/5137941.html ,感谢彭东林大神。

一、为什么要去移植 Linux-4.4 ?

刚刚毕业,对于 kernel 很多不懂,尤其是之前在学校学习的时候,都是基于 linux-2.6 学习,根本没有接触到 dts, 对于 dts 没有一点概念,因次有强烈的欲望想要去弄明白什么是 dts? dts 作用?dts 的语法?如何基于 dts 写代码?刚好手头上有一块 Tiny4412 - SDK 的板子,便想充分利用,用于学习 dts。
本篇文章不会提及 dts 相关的知识, 单纯是为以后学习 dts 搭建好开发环境。

二、移植 uboot

2.1 获取 uboot

u-boot 使用的是友善之臂光盘中提供的 uboot_tiny4412-20130729.tgz 文件,可以点击下面的链接获取:
uboot_tiny4412-20130729.tgz
友善之臂光盘中提供的 u-boot 虽然不支持引导 uImage 格式的 kernrl,默认的配置也不支持 device tree,但是其他的方面已经很好的支持了 tiny4412 开发板了。因此选择在友善之臂提供的 u-boot 基础上进行修改,可以减少很多移植 u-boot 的操作。

2.2 修改 uboot

前面已经提到,友善之臂光盘中提供的 u-boot 不支持引导 uImage 格式的 kernrl,也不支持 device tree。针对这两个问题,对 u-boot 要做以下修改。

2.2.1 关闭 MMU

开启了 MMU 的话,u-boot 访问的都是虚拟地址,因为后期要使用 dnw 工具烧写文件到开发板 RAM 中,需要指定烧写到 RAM 中的具体物理地址,因此关闭 MMU。
修改 uboot/include/configs/tiny4412.h:

 #define CONFIG_ENABLE_MMU 

修改为

 #undef CONFIG_ENABLE_MMU

2.2.2 修改链接地址

只关闭 MMU 还不够,还需要修改 u-boot 的链接地址:
修改文件board/samsung/tiny4412/config.mk

CONFIG_SYS_TEXT_BASE = 0xc3e00000

修改为

CONFIG_SYS_TEXT_BASE = 0x43e00000

2.2.3 修改 bootm 命令

友善之臂原生的 u-boot 使用 bootm 命令只可以引导 zImage 类型的 kernel,不支持 uImage,通过修改 bootm 命令可以使其支持 uImage。

diff --git a/common/cmd_bootm.c b/common/cmd_bootm.cindex 04622dd..be68856 100644--- a/common/cmd_bootm.c+++ b/common/cmd_bootm.c@@ -590,6 +590,7 @@int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])       ulong           load_end = 0;       int             ret;       boot_os_fn      *boot_fn;+      int             iszImage = 0;#ifdef CONFIG_SECURE_BOOT#ifndef CONFIG_SECURE_BL1_ONLY@@ -626,7 +627,7 @@int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])               images.legacy_hdr_os = hdr;               images.legacy_hdr_valid = 1;+              iszImage = 1;               goto after_header_check;       }#endif@@ -723,8 +724,11 @@int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  #if defined(CONFIG_ZIMAGE_BOOT) after_header_check:-       images.os.os = hdr->ih_os;-       images.ep = image_get_ep (&images.legacy_hdr_os_copy);+       if(iszImage)+       {+               images.os.os = hdr->ih_os;+               images.ep = image_get_ep (&images.legacy_hdr_os_copy);+       } #endif

2.2.4 支持设备树

默认的 u-boot 配置不支持设备树,修改 include/configs/tiny4412.h,增加如下两个宏,使其支持设备树:

#define CONFIG_OF_LIBFDT#define CONFIG_SYS_BOOTMAPSZ (20 << 20)

2.3 编译 u-boot

编译 u-boot 生成 u-boot.bin 镜像。

make clean make distclean make tiny4412_configmake -j4

2.3 烧写 u-boot

烧写 uboot 到 SD 卡中:

cd sd_fuse/tiny4412./sd_fusing.sh /dev/sdc

注意: 这里的 /dev/sdc 不是恒定,选择 SD卡 对应的设备名称

将 SD 卡插入开发板,从 SD 卡启动,使用以下命令将 SD 卡中的 uboot 复制到 EMMC 中:

/* 将 u-boot 从 SD 卡复制到 DDR 中 */mmc read 0 0x40000000 1 390/* 打开 EMMC */emmc open 1/* 将 DDR 地址中的 u-boot 写到 EMMC */mmc write 1 0x40000000 0 390/* 关闭EMMC */emmc close 1

三、移植 linux-4.4.80

3.1 获取 linux-4.4.80

访问 The Linux Kernel Archives 可以下载各个版本的 kernel。这里只要是 4.4.xx 版本的 kernel 就可以(移植过4.4.0 和 目前最新的 4.4.80,都可以跑起来)。下载 kernel 最好有个 VPN 推荐使用 lantern。
具体的下载流程为:

https://www.kernel.org/ -> 点击 4.4.80 对应的 [browse] -> refs -> 下滑 -> 点击 v4.4.80 tag 对应的 Download linux-stable-4.4.80.tar.gz

或者点击直接下载 4.4.80:

linux-stable-4.4.80.tar.gz

3.2 修改 linux-4.4.80

3.2.1 修改 dts 文件

修改 arch/arm/boot/dts/exynos4412-tiny4412.dts 文件:

diff --git a/arch/arm/boot/dts/exynos4412-tiny4412.dts b/arch/arm/boot/dts/exynos4412-tiny4412.dtsindex 4840bbd..aeca42a 100644--- a/arch/arm/boot/dts/exynos4412-tiny4412.dts+++ b/arch/arm/boot/dts/exynos4412-tiny4412.dts@@ -21,6 +21,7 @@        chosen {                stdout-path = &;serial_0;+               bootargs = "root=/dev/ram0 rw rootfstype=ext4 console=ttySAC0,115200 init=/linuxrc earlyprintk";        };        memory {@@ -78,7 +79,7 @@        bus-width = <;4>;        pinctrl-0 = <;&sd2_clk &sd2_cmd &sd2_cd &sd2_bus4>;        pinctrl-names = "default";-       status = "okay";+       status = "disabled"; };

这里关键的一点是在 chosen 中增加了 bootargs 的设置,上面设置 bootargs 表示的意思是:根文件系统是 ramdisk,可读写,文件系统类型是 ext4 格式,串口终端使用 ttySAC0,波特率是 15200,earlyprintk 用于打印内核启动早期的一些 log。
还有一点是把 SD卡控制器2给禁掉了,目前 SD 控制器的初始化还有些问题,会导致内核挂掉,这个以后再解决,因为我们将来先用 ramdisk 做根文件系统,跟 eMMC 和 SD 卡都没有关系。
bootargs 的设置很灵活,既可以在内核的设备树中设置,也可以在 u-boot 中设置,需要注意的是:如果在 u-boot 中设置了 bootargs 的话,在 bootm 的时候 u-boot 会用自己的 bootargs 来覆盖设备树里的bootargs。

对于最新的Linux-4.4需要使用最新的交叉编译工具链,如果使用友善之臂提供的工具链的话会导致编译错误,工具链的地址可以到下面的地址下载: