[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需要使用最新的交叉编译工具链,如果使用友善之臂提供的工具链的话会导致编译错误,工具链的地址可以到下面的地址下载:
- [Tiny4412] 移植 Linux-4.4.80 内核 (支持 dts)
- 基于tiny4412的Linux内核移植(支持device tree)(一)
- 基于tiny4412的Linux内核移植(支持device tree)(二)
- 基于tiny4412的Linux内核移植(支持device tree)(三)
- 基于tiny4412的Linux内核移植 -- 设备树的展开
- 基于tiny4412的Linux内核移植 -- PWM子系统学习
- 移植linux 内核支持ramdisk
- Linux内核移植--YAFFS2支持
- Linux内核移植--YAFFS2支持
- 为AM335x移植Linux内核主线代码(1)了解dts
- 为AM335x移植Linux内核主线代码了解dts
- 基于tiny4412的Linux内核移植 -- DM9621NP网卡驱动移植(四)
- **Tiny4412(Cortex_A9) Uboot内核移植(一)*
- tiny4412学习(二)之移植linux-4.x支持设备树
- tiny4412学习(三)之移植linux-4.x驱动(1)支持网卡驱动
- Linux内核移植--设备树支持
- 为AM335x移植Linux内核主线代码——了解dts
- 为AM335x移植 Linux内核dts ---fwqlzz love is for ever
- Unity 输入系统
- java1.8的几大新特性
- GitHub上README.md常用的编写手法
- 如何配置springdata框架
- C++string中用于查找的find系列函数浅析
- [Tiny4412] 移植 Linux-4.4.80 内核 (支持 dts)
- 0810link
- redis常用命令
- perl笔记(二)
- ACM暑假集训日记 17.8.10
- Dagger2 的简单使用
- vue+axios方法封装(restful,ajax)
- 为什么我不使用Kubernetes的Ingress
- js, jq执行 focus后focusout和click事件冲突