X4412开发板移植Linux内核4.9.123版本
基本移植
1、源码下载
官网下载linux4.9.123内核:https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/。
2、解压并配置
xz -d linux-4.9.123.tar.xz
tar -xvf linux-4.9.123.tar
使用命令cd linux-4.9.123进入源码根目录, 然后vi Makefile 打开顶层的Makefile进行如下修改:
修改:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
为:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabi- /*根据实际使用的toolchain修改*/
注意:
- 在VI命令下,可以使用/ CROSS_COMPILE 搜索并快速定位
- 如果不修改编译工具链,默认将使用编译x86的gcc编译器,此时make编译需要指定架构和工具链前缀,如:
make uImage ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
3、导入的exynos的默认配置
make exynos_defconfig
实际上是执行了:cp arch/arm/configs/exynos_defconfig .config
4、配置内核
make menuconfig
修改指定内核的调试串口:
Kernel hacking
--> Kernel low-level debugging functions (read help!) 选择
--> Kernel low-level debugging port (Use Samsung S3C UART 2 for low-level debug) 打开选择uart2
选择这个调试串口很重要,否则打印不出内核启动的相关信息(exynos默认没有打开此功能,没有打开此处会发现内核打印信息停止在Starting kernel …处)
5、编译内核和设备树
一、编译uImage镜像:
make uImage LOADADDR=0x40008000
注意:
LOADADDR=0X40008000表示指定内核的加载地址(如果没有添加该选项编译会出错)
二、编译设备树:
在编译设备树之前需要对设备树进行配置,由于x4412和参考板origen类似,所以一般都是参考origen进行x4412的配置。
的设备树文件。
cp arch/arm/boot/dts/exynos4412-origen.dts arch/arm/boot/dts/exynos4412-x4412.dts
修改arch/arm/boot/dts/下的Makefile文件:
make dtbs
6、移植网卡
增加DM9000网卡的设备树节点信息: vi arch/arm/boot/dts/exynos4412-x4412.dts
srom-cs1@7000000 {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x7000000 0x1000000>;
ranges;
ethernet@7000000 {
compatible = "davicom,dm9000";
reg = <0x7000000 0x2 0x7000004 0x2>;
interrupt-parent = <&gpx2>;
interrupts = <5 4>;
davicom,no-eeprom;
mac-address = [00 0a 2d a6 55 a2];
};
};
添加外部中断pin配置,vi arch/arm/boot/dts/exynos4x12-pinctrl.dtsi。添加如下节点
eint21: ext-int21 {
samsung,pins = "gpx2-5";
samsung,pin-function = <EXYNOS_PIN_FUNC_F>;
samsung,pin-pud = <EXYNOS_PIN_PULL_NON22E>;
samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>;
};
注意:
DM9000 网卡驱动正常都是一样的,移植时主要是更改pin配置和base addr,这个需要根据实际硬件电路修改.通过查询x4412电路图已经DM9000的trm,可知base addr是0x7000000.而pin使用的是gpx2-5,外部中断号eint21,所以还需要修改gedit arch/arm/boot/dts/exynos4x12-pinctrl.dtsi,添加eint21的初始化。(功能需要选择wakeup,也就是功能2).完成后按照手册的方法修改interrupt-parent = <&gpx2>;#xeint31是gpx2_5
interrupts = <5 4>;#中断偏移是5, 4代表高电平触发
内核配置:
// 网络协议配置
[*] Networking support --->
Networking options --->
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: kernel level autoconfiguration
// 网卡驱动的配置
Device Drivers --->
[*] Network device support --->
[*] Ethernet driver support (NEW) --->
<*> DM9000 support
// NFS服务和根文件系统配置
File systems --->
[*] Network File Systems (NEW) --->
<*> NFS client support
[*] NFS client support for NFS version 3
[*] NFS client support for the NFSv3 ACL protocol extension
[*] Root file system on NFS
重新编译内核和设备树即可。
最后为了能正常启动linux需要配置uboot环境变量,这边使用的变量如下:
fatload mmc 0:1 42000000 linux4.9/exynos4412-x4412.dtb
fatload mmc 0:1 41000000 linux4.9/uImage
setenv bootargs root=/dev/mmcblk0p2 rw rootfstype=ext4 console=ttySAC2,115200
bootm 41000000 - 42000000