Exynos4412——内核移植

版权声明:本文采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,欢迎转载,但转载请注明来自hceng blog(www.hceng.cn),并保持转载后文章内容的完整。本人保留所有版权相关权利。 https://blog.csdn.net/hceng_linux/article/details/89839069

CSDN仅用于增加百度收录权重,排版未优化,日常不维护。请访问:www.hceng.cn 查看、评论。
本博文对应地址: https://hceng.cn/2017/10/26/Exynos4412——内核移植/#more

Exynos 4412移植最新的Kernel-4.13.9。

话说最近应该不会接触AM437x了,原因有多种,但学习不能停。
手头还有买来没开过几次机的Tiny4412,本想买来学Android驱动的。
Exynos4412与S3C2240差别相对AM437x小很多,因此过渡应该会更顺滑一点。
要学习的还很多,进度有点慢,先在板子上跑起Linux再说吧。

1.设置交叉编译工具链

使用的交叉编译工具链是:arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320)
下载好后,放在Ubuntu中,解压:

tar xjf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

记下交叉编译工具链的位置:/work/arm-2014.05/bin
修改环境变量:

sudo vim /etc/environment

添加交叉编译工具链的路径:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/work/arm-2014.05/bin"

更新环境变量:

source /etc/environment

检测:

arm-none-linux-gnueabi-gcc -v

一些关于gcc的扩充资料

2.修改、编译uboot

开始的时候使用的是Tiny4412光盘的uboot,但后续的做完了才发现不行。
原来是友善的tiny4412标准版有新旧之分,差别就是更换了不同eMMC,所以导致了有些没有更新eMMC控制器配置的uboot无法启动。
因此下了新版的uboot_tiny4412_0929.tar.gz即可。参考链接

目前首先需要实现如下功能:
用u-boot引导uImage或者zImage,
同时将设备信息以设备树的形式传递给Linux内核,
而根文件系统以ramdisk的形式传递给内核,
因为目前SD卡驱动、eMMC驱动和usb网卡驱动都没有移植。

2.1 关闭MMU

vim include/configs/tiny4412.h

#define CONFIG_ENABLE_MMU改为#undef CONFIG_ENABLE_MMU;

2.2 修改u-boot的链接地址

vim board/samsung/tiny4412/config.mk

CONFIG_SYS_TEXT_BASE = 0xc3e00000修改为CONFIG_SYS_TEXT_BASE = 0x43e00000;

2.3 使uboot可以引导uImage

vim common/cmd_bootm.c

①在boot_os_fn *boot_fn;后添加:

int             iszImage = 0;

②在images.legacy_hdr_valid = 1;后添加:

iszImage = 1;

③修改

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);
    }

2.4 支持设备树

vim include/configs/tiny4412.h

添加如下两个宏:

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

2.5 修改uboot的Makefile

将原来的:

ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif

改为

ifeq ($(ARCH),arm)
CROSS_COMPILE ?=/work/arm-2014.05/bin/arm-none-linux-gnueabi-
endif

2.6 编译uboot

make distclean
make tiny4412_config
make

3.移植、编译内核

3.1 下载最新内核

下载的当前最新的内核Kernel-4.13.9

解压

xz -d linux-4.13.9.tar.xz
tar xf linux-4.13.9.tar

3.2 修改Makefile

ARCH            ?= $(SUBARCH)
CROSS_COMPILE   ?= $(CONFIG_CROSS_COMPILE:"%"=%)

改为

ARCH            ?= arm
CROSS_COMPILE   ?= /work/arm-2014.05/bin/arm-none-linux-gnueabi-

3.3 修改设备树文件

vim arch/arm/boot/dts/exynos4412-tiny4412.dts

stdout-path = &serial_0;添加启动参数:

bootargs = "root=/dev/ram0 rw rootfstype=ext4 console=ttySAC0,115200 init=/linuxrc earlyprintk";

sdhci_2节点下的

status = "okay";

改为:

status = "disabled";

3.4 编译内核

Kernel-4.13.9对Exynos 4412支持还不错,直接就有配置文件,使用即可。

make distclean
make ARCH=arm exynos_defconfig
make uImage LOADADDR=0x40008000 

这里实测出现错误,显示找不到mkimage

mkimage/work/uboot_tiny4412_0929/tools里面的,加入环境变量即可。解决参考

sudo vim /etc/bash.bashrc

加入:

export PATH=/work/uboot_tiny4412_0929/tools:$PATH

更新:

source /etc/bash.bashrc

重新编译:

make uImage LOADADDR=0x40008000 

生成uImagearch/arm/boot

3.5 编译设备树文件

make dtbs
```
生成`exynos4412-tiny4412.dtb`在`arch/arm/boot/dts/`。   

# 4.下载到开发板 #
## 4.1 准备SD卡 ##
制作SD卡的工具在`uboot_tiny4412_0929`里面,
先编译下。
```
cd sd_fuse
make
```
插上SD卡,查看当前SD卡挂载位置。
```
sudo fdisk -l
```
我的是`/dev/sdb`。

## 4.2 制作SD卡,烧uboot ##
```
cd tiny4412
./sd_fusing.sh /dev/sdb 
```
制作好了,插上开发板,选择SD卡启动,在串口上即可有打印信息。


## 4.3 烧写内核、根文件系统、设备树文件 ##
这里的根文件系统用的网友做好的[ramdisk镜像](ramdisk镜像 "http://files.cnblogs.com/files/pengdonglin137/ramdisk.zip")
由于tiny4412的uboot目前还不支持usb网卡,只能使用dnw来下载,并且tiny4412的u-boot中已经自带了dnw命令了,Ubuntu上使用[网友的dnw](http://files.cnblogs.com/files/pengdonglin137/dnw.tar.gz "网友的dnw")。

①下载uImage
在u-boot里执行下载uImage的命令: 
```
dnw 0x40600000   (这个地址不唯一)
```
在Ubuntu中执行:
```
sudo ./dnw /work/linux-4.13.9/arch/arm/boot/uImage
```

②下载ramdisk
在u-boot里执行下载uImage的命令: 
```
dnw 0x41000000   (这个地址不唯一)
```
在开发机中执行:
```
sudo ./dnw /work/ramdisk/ramdisk.img
```

③下载设备树镜像
在u-boot里执行下载uImage的命令: 
```
dnw 0x42000000   (这个地址不唯一)
```
在开发机中执行:
```
sudo ./dnw /work/linux-4.13.9/arch/arm/boot/dts/exynos4412-tiny4412.dtb
```


## 4.4 启动开发板 ##
继续输入
```
bootm 0x40600000 0x41000000 0x42000000
```
不要重启,现在数据都在RAM里面的,掉电就没了。


# 5.实际效果 #
![](https://blog-image-1257972744.cos.ap-chongqing.myqcloud.com/hceng/blog_image/171026/4.png)

猜你喜欢

转载自blog.csdn.net/hceng_linux/article/details/89839069