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再说吧。
使用的交叉编译工具链是: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的扩充资料
开始的时候使用的是Tiny4412光盘的uboot,但后续的做完了才发现不行。
原来是友善的tiny4412标准版有新旧之分,差别就是更换了不同eMMC,所以导致了有些没有更新eMMC控制器配置的uboot无法启动。
因此下了新版的uboot_tiny4412_0929.tar.gz即可。参考链接
目前首先需要实现如下功能:
用u-boot引导uImage或者zImage,
同时将设备信息以设备树的形式传递给Linux内核,
而根文件系统以ramdisk的形式传递给内核,
因为目前SD卡驱动、eMMC驱动和usb网卡驱动都没有移植。
vim include/configs/tiny4412.h
将#define CONFIG_ENABLE_MMU
改为#undef CONFIG_ENABLE_MMU
;
vim board/samsung/tiny4412/config.mk
将CONFIG_SYS_TEXT_BASE = 0xc3e00000
修改为CONFIG_SYS_TEXT_BASE = 0x43e00000
;
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);
}
vim include/configs/tiny4412.h
添加如下两个宏:
#define CONFIG_OF_LIBFDT
#define CONFIG_SYS_BOOTMAPSZ (20 << 20)
将原来的:
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
改为
ifeq ($(ARCH),arm)
CROSS_COMPILE ?=/work/arm-2014.05/bin/arm-none-linux-gnueabi-
endif
make distclean
make tiny4412_config
make
下载的当前最新的内核Kernel-4.13.9。
解压
xz -d linux-4.13.9.tar.xz
tar xf linux-4.13.9.tar
将
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
改为
ARCH ?= arm
CROSS_COMPILE ?= /work/arm-2014.05/bin/arm-none-linux-gnueabi-
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";
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
生成uImage
在arch/arm/boot
。
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)