Linux内核配置与编译

内核的配置和编译

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  4100000042000000
# 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个企鹅图标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值