内核的配置和编译
3.1解压内核
$ tar xvf linux-3.14.tar.xz
$ cd linux-3.14
$ apt-get install libncurses5-dev
3.2修改内核顶层目录下的 Makefile
$ gedit Makefile
修改:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
为:
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
3.3拷贝标准板配置文件
$make exynos_defconfig
3.4配置内核消息打印口
$ make menuconfig
System Type —>
(2) S3C UART to use for low-level messages
3.5编译内核
$ make uImage
通过上述操作我们能够在 arch/arm/boot 目录下生成一个 uImage 文件,这就是经过压缩的内核镜像。如果编译过程中提示缺少 mkimage 工具,需将编译的 uboot 源码中的 tools/mkimage 拷贝到ubuntu 的/usr/bin 目录下并且增加执行权限。
3.6生成设备树
生成设备树文件,以参考板 origen 的设备数文件为参考。
$ cp arch/arm/boot/dts/exynos4412-origen.dts arch/arm/boot/dts/exynos4412-etc4412.dts
添加新文件需修改 Makefile 才能编译
$ gedit arch/arm/boot/dts/Makefile
在exynos4412-origen.dtb 下添加如下内容
exynos4412-etc4412.dtb
编译设备树文件
$ make dtbs
拷贝内核和设备树文件到/tftpboot 目录下
$ cp arm/arm/boot/uImage /tftpboot
$ cp arch/arm/boot/dts/exynos4412-etc4412.dtb /tftpboot/
修改 uboot 启动参数
重启板子在系统倒计时是按任意键结束启动,输入如下内容修改 uboot 环境变量:
# setenv serverip 192.168.1.116
# setenv ipaddr 192.168.1.123
# setenv bootcmd tftp 41000000 uImage\; tftp 42000000 exynos4412-etc4412.dtb\; bootm 41000000 – 42000000
# setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.123
# saveenv
注意: 192.168.1.116 对应 Ubuntu 的 ip ,192.168.1.123 对应板子的 ip
这两个 ip 应该根据自己的实际情况适当修改,重启开发板
4以太网卡驱动移植
4.1设备树文件修改
$ gedit arch/arm/boot/dts/exynos4412-etc4412.dts
添加如下内容:
srom-cs1@5000000 {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x5000000 0x1000000>;
ranges;
ethernet@5000000 {
compatible = "davicom,dm9000";
reg = <0x5000000 0x2 0x5000004 0x2>;
interrupt-parent = <&gpx0>;
interrupts = <6 4>;
davicom,no-eeprom;
mac-address = [00 0a 2d a6 55 a2];
};
};
4.2修改文件 drivers/clk/clk.c
gedit drivers/clk/clk.c
修改
Static bool clk_ignore_unused;
为
static bool clk_ignore_unused = true;
4.3配置内核
make menuconfig
[] 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
File systems —>
[] Network File Systems (NEW) —>
<> NFS client support
[] NFS client support for NFS version 2
[] NFS client support for NFS version 3
[] NFS client support for the NFSv3 ACL protocol extension
[] Root file system on NFS
4.4编译内核和设备树
$ make uImage
$ make dtbs
拷贝内核和设备树文件到/tftpboot 目录下
$ cp arm/arm/boot/uImage /tftpboot
$ cp arch/arm/boot/dts/exynos4412-etc4412.dtb /tftpboot/
启动开发板,修改内核启动参数,通过 NFS 方式挂载根文件系统
4.5实验现象
NFS文件系统能够挂载成功,说明网卡驱动移植成功
5SD 卡驱动移植
5.1修改设备树文件
$ gedit arch/arm/boot/dts/exynos4412-etc4412.dts
修改
sdhci@12530000 {
bus-width = <4>;
pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_bus4 &sd2_cd>;
pinctrl-names = “default”;
vmmc-supply = <&mmc_reg>;
status = “okay”;
};
为:
sdhci@12530000 {
bus-width = <4>;
pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_bus4>;
cd-gpios = <&gpx0 7 0>;
cd-inverted = <0>;
pinctrl-names = "default";
/*vmmc-supply = <&mmc_reg>;*/
status = "okay";
};
5.2配置内核
$ make menuconfig
Device Drivers —>
<> MMC/SD/SDIO card support —
<> Secure Digital Host Controller Interface support
<> SDHCI support on Samsung S3C SoC
File systems —>
DOS/FAT/NT Filesystems —>
<> MSDOS fs support
<> VFAT (Windows-95) fs support
(437) Default codepage for FAT
(iso8859-1) Default iocharset for FAT
-- Native language support —>
<> Codepage 437 (United States, Canada)
<> Simplified Chinese charset (CP936, GB2312)
<> ASCII (United States)
<> NLS ISO 8859-1 (Latin 1; Western European Languages)
<*> NLS UTF-8
5.3编译内核和设备树
$ make uImage
$ make dtbs
$ cp arm/arm/boot/uImage /tftpboot
$ cp arch/arm/boot/dts/exynos4412-etc4412.dtb /tftpboot/
5.4实验现象
启动开发板,通过 NFS 方式挂载根文件系统。
把 SD 卡插到 ETC4412 的 SD 卡槽里,在串口终端可以看到如下图所示:
使用下面命令可以查看SD卡里面的内容:
$mount -t vfat /dev/mmcblk1p1 /mnt
6USB 驱动移植
6.1修改设备树文件
$ gedit arch/arm/boot/dts/exynos4412-etc4412.dts
添加如下内容:
usbphy: usbphy@125B0000 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "samsung,exynos4x12-usb2phy";
reg = <0x125B0000 0x100>;
ranges;
clocks = <&clock 2>, <&clock 305>;
clock-names = "xusbxti", "otg";
usbphy-sys {
reg = <0x10020704 0x8 0x1001021c 0x4>;
};
};
ehci@12580000 {
status = "okay";
usbphy = <&usbphy>;
};
usb3503@08 {
compatible = "smsc,usb3503";
reg = <0x08 0x4>;
connect-gpios = <&gpm3 3 1>;
intn-gpios = <&gpx2 3 1>;
reset-gpios = <&gpm2 4 1>;
initial-mode = <1>;
};
6.2配置内核
make menuconfig
Device Drivers —>
[] USB support —>
<> EHCI HCD (USB 2.0) support
<> EHCI support for Samsung S5P/EXYNOS SoC Series
<> USB Mass Storage support
<> USB3503 HSIC to USB20 Driver
USB Physical Layer drivers —>
<> Samsung USB 2.0 PHY controller Driver
SCSI device support —>
<> SCSI device support
<> SCSI disk support
<*> SCSI generic suppor
6.3编译内核和设备树
$ make uImage
$ make dtbs
拷贝内核和设备树文件到/tftpboot 目录下
$ cp arm/arm/boot/uImage /tftpboot
$ cp arch/arm/boot/dts/exynos4412-etc4412.dtb /tftpboot/
6.4实验现象
启动开发板,通过 NFS 方式挂载根文件系统。
测试启动目标板并在目标板上完成如下操作:
插入 U 盘显示如下:
输入一下命令可以看到U盘里的内容:
$ mount -t vfat /dev/sda1 /mnt
7LCD 驱动移植
Exynos4412 内部集成了一个显示控制器 FIMD( Fully Interactive Mobile Display, 完全交互式移动显示设备)。该控制器支持三种接口,分别是 RGB 接口、 indirect-i80 接口和 YUV 接口。在 ETC4412 开发板上使用的是 RGB 接口连接外部的 LCD 屏。
7.1修改设备树文件
8$ gedit arch/arm/boot/dts/exynos4412-etc4412.dts
将下面的内容:
fimd@11c00000 {
pinctrl-0 = <&lcd_clk &lcd_data24 &pwm1_out>;
pinctrl-names = “default”;
status = “okay”;
};
display-timings {
native-mode = <&timing0>;
timing0: timing {
clock-frequency = <47500000>;
hactive = <1024>;
vactive = <600>;
hfront-porch = <64>;
hback-porch = <16>;
hsync-len = <48>;
vback-porch = <64>;
vfront-porch = <16>;
vsync-len = <3>;
};
};
改为:
fimd: fimd@11c00000 {
pinctrl-0 = <&lcd_clk &lcd_data24 &pwm1_out>;
pinctrl-names = "default";
status = "okay";
display-timings {
native-mode = <&timing0>;
timing0: timing {
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <1>;
clock-frequency = <51206400>;
hactive = <1024>;
vactive = <600>;
hfront-porch = <150>;
hback-porch = <160>;
hsync-len = <10>;
vback-porch = <22>;
vfront-porch = <12>;
vsync-len = <1>;
};
};
};
8.2配置内核
Device Drivers —>
Graphics support —>
<> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) ----
<> DRM Support for Samsung SoC EXYNOS Series
[*] Exynos DRM FIMD
8.3添加内容
$ gedit drivers/gpu/drm/exynos/exynos_drm_drv.c
在drivers/gpu/drm/exynos/exynos_drm_drv.c文件
添加
#include <linux/io.h>
#include <linux/ioport.h>
#include <mach/map.h>
#define CLK_SRC_LCD0 (S5P_VA_CMU + 0xC234)
#define CLK_SRC_MASK_LCD (S5P_VA_CMU + 0xC334)
#define CLK_DIV_LCD (S5P_VA_CMU + 0xC534)
#define CLK_DIV_STAT_LCD (S5P_VA_CMU + 0xC634)
#define CLK_GATE_IP_LCD (S5P_VA_CMU + 0xC934)
#define CLK_GATE_BLOCK (S5P_VA_CMU + 0xC970)
#define LCDBLK_CFG (S3C_VA_SYS + 0x0210)
void exynos_drm_fbclk_preinit(void)
{/* FIMD0_SEL = SCLKVPLL, 350000000 */
__raw_writel((__raw_readl(CLK_SRC_LCD0) & ~(0x0F)) | (0x08), CLK_SRC_LCD0);
/* FIMD0_RATIO = 3, SCLK_FIMD0 = MOUTFIMD0/(FIMD0_RATIO + 1) */
__raw_writel((__raw_readl(CLK_DIV_LCD) & ~(0x0F)) | (0x04), CLK_DIV_LCD);
/* unmask output clock of MUXFIMD0 */
__raw_writel(__raw_readl(CLK_SRC_MASK_LCD) | 0x1, CLK_SRC_MASK_LCD);
__raw_writel(__raw_readl(CLK_GATE_IP_LCD) | 0x1, CLK_GATE_IP_LCD);
__raw_writel(__raw_readl(CLK_GATE_BLOCK) | (0x1 << 4), CLK_GATE_BLOCK);
/* select fimd */
__raw_writel(__raw_readl(LCDBLK_CFG) | (0x1 << 1), LCDBLK_CFG); }
最后修改 drivers/gpu/drm/exynos/exynos_drm_drv.c, 在 exynos_drm_fbdev_init(dev)函数调用前添加exynos_drm_fbclk_preinit()函数调用。
/*
* create and configure fb helper and also exynos specific
* fbdev object.
*/
exynos_drm_fbclk_preinit();
ret = exynos_drm_fbdev_init(dev);
if (ret) {
DRM_ERROR("failed to initialize drm fbdev\n");
goto err_drm_device;
}
8.4实验现象
经过修改之后,再次编译内核,发现在系统启动后正常显示了4个企鹅图标。