栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

内核的移植

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

内核的移植

文章目录
    • 1.环境介绍
    • 2、修改编译内核
    • 3 修改板子的支持
    • 4 修改默认配置文件
    • 5 添加机器类型号
    • 6 串口驱动移植
    • 7、 存储设备(MMC)驱动移植
    • 8 make uImage

1.环境介绍

1、 kernel环境: linux-3.4.110
2、 ext4文件系统源码包
3、 交叉编译器 arm-linux-4.3.2

2、修改编译内核
  1. .解压 linux-3.4.110源码包,可以从Linux官网上下载,对应的是你自己内核的版本
  2. 修改内核根目录下的makefile文件,修改成下面信息
3 修改板子的支持

复制原内核(kernel-3.4.39) arch/arm 下的(palt-s5p6818 和 mach-s5p6818)两个文件夹到新
内核(kernel-3.4.110)对应的目录下。

4 修改默认配置文件
复制原内核(kernel-3.4.39)顶层目录下的.config(Linux隐藏文件)文件到新内核对应目录

下。

添加

		machine-$(CONFIG_ARCH_S5P4418) := s5p4418
		machine-$(CONFIG_ARCH_S5P6818) := s5p6818


plat- ( C O N F I G P L A T V E R S A T I L E ) : = v e r s a t i l e p l a t − (CONFIG_PLAT_VERSATILE) := versatile plat- (CONFIGP​LATV​ERSATILE):=versatileplat−(CONFIG_ARCH_S5P4418) := s5p4418
plat-$(CONFIG_ARCH_S5P6818) := s5p6818

endef (最下边位置)
ifeq ($(CONFIG_ARCH_CPU_SLSI),y)
include $(srctree)/$(machdirs)/Makefile
include $(srctree)/$(platdirs)/Makefile
endif

在 arch/arm 目录下的 Kconfig 中入红色内容(加入到 endchoice 之前)

config ARCH_ZYNQ
bool "Xilinx Zynq ARM Cortex A9 Platform"
select CPU_V7
select GENERIC_CLOCKEVENTS
select CLKDEV_LOOKUP
select ARM_GIC
select ARM_AMbaselect ICST
select MIGHT_HAVE_CACHE_L2X0
select USE_OF
help
Support for Xilinx Zynq ARM Cortex A9 Platform
config ARCH_S5P4418
bool "SLsiAP S5P4418D/Q"
select ARCH_CPU_SLSI
select CPU_V7
select ARM_AMbaselect ARM_GIC
select ARM_VIC
select HAVE_SMP
select MIGHT_HAVE_CACHE_L2X0
select ARCH_HAS_CPUFREQ
select GENERIC_TIME
select GENERIC_CLOCKEVENTS
select ZONE_DMA
select HAVE_MACH_CLKDEV
select NEED_MACH_MEMORY_H
select NEED_MACH_IO_H
select ARCH_REQUIRE_GPIOLIB
select ARM_PATCH_PHYS_VIRT
help
Support for nexell S5P4418 dual/quard core (ARM Cortex A9) platform
config ARCH_S5P6818
bool "SLsiAP S5P6818"
select ARCH_CPU_SLSI
select CPU_V7
select ARM_AMbaselect HAVE_SMP
select ARCH_HAS_CPUFREQ
select GENERIC_TIME
select GENERIC_CLOCKEVENTS
select ZONE_DMA
select HAVE_MACH_CLKDEV
select NEED_MACH_MEMORY_H
select NEED_MACH_IO_H
select ARCH_REQUIRE_GPIOLIB
select ARM_PATCH_PHYS_VIRT
help
Support for nexell NXP5430 octa core (ARM Cortex A53) platform
compatible with ARMv7
endchoice

source "arch/arm/mach-davinci/Kconfig"
if ARCH_S5P6818
source "kernel/Kconfig.hz"
source "arch/arm/mach-s5p6818/Kconfig"
endif
source "arch/arm/mach-dove/Kconfig"


在 archarmincludeasmpgtable.h 头文件中加入红色内容

#define VMALLOC_START (((unsigned long)hi...
#ifndef VMALLOC_END
#define VMALLOC_END 0xff000000UL
#endif
#define LIBRARY_TEXT_START 0x0c000000

完成以上添加后, 需要编译一下内核及在顶层目录 make 一下, 如有异常按回车键即可,
无所谓编译结果。 目的是为了让内核自动生成一些内容。

5 添加机器类型号
  • 在 includegeneratedmach-types.h 头文件中加入红色内容
    #define MACH_TYPE_DA850_PQAB 3891
    #define MACH_TYPE_S5P6818 4330

  • 新内核中缺少一些支持类型的头文件, 需要加入, 将原内核(kernel-3.4.39)中的
    includelinuxvr 目 录 复 制 到 新 内 核 的 对 应 目 录 下 , 将 原 内 核 (kernel-3.4.39) 中 的
    includelinuxpersistent_ram.h 头文件复制到新内核对应路径下。

  • 另外还缺少一些对象和结构体成员, 需要加入:
    在 includelinuxmmcDw_mmc.h 头文件中加入红色内容
    #define DW_MCI_QUIRK_BROKEN_CARD_DETECTION BIT(3)
    #define DW_MCI_QUIRK_NO_DETECT_EBIT BIT(4)
    #define DW_MMC_QUIRK_HW_RESET_PW BIT(5)
    enum dw_mci_cd_types {
    DW_MCI_CD_INTERNAL,
    DW_MCI_CD_EXTERNAL,
    DW_MCI_CD_GPIO,
    DW_MCI_CD_NONE,
    DW_MCI_CD_PERMANENT, };

struct dw_mci_board {

unsigned int bus_hz;
u32 detect_delay_ms;
char *hclk_name;
char *cclk_name;
int (*init)(u32 slot_id, irq_handler_t , void *);

int (get_bus_wd)(u32 slot_id);
void (*cfg_gpio)(int width);
void (*hw_reset)(u32 slot_id);
void (*set_io_timing)(void *data, unsigned char timing);
/Enable power to selected … linux/mmc/host.h file./
unsigned int sdr_timing;
unsigned int ddr_timing;
u8 clk_drv;
u8 clk_smpl;
bool tuned;
u32 clk_dly;
/
cd_type: Type of Card Detection method (see cd_types enum above) /
enum dw_mci_cd_types cd_type;
/
Number of descriptors */
unsigned int desc_sz;
int (*ext_cd_init)(void (*notify_func)
(struct platform_device *, int state));
int (*ext_cd_cleanup)(void (*notify_func)
(struct platform_device *, int state));
void (*setpower)(u32 slot_id, u32 volt);

struct block_settings *blk_settings;
void (*suspend)(struct dw_mci *host);
void (*resume)(struct dw_mci *host);
void (*late_resume)(struct dw_mci *host);
u32 hs_over_clk;
u32 hw_timeout;
u32 mode;
};

6 串口驱动移植
  • 在 driversttyserialKconfig 文件的最后加入以下内容(加入到 endmenu 之前)
    在config SERIAL_EFM32_UART_CONSOLE
    bool “EFM32 UART/USART console support”
    depends on SERIAL_EFM32_UART=y
    select SERIAL_CORE_CONSOLE后面加入
config SERIAL_NXP_S3C
	tristate "Nexell S3C SoC serial port support"
	select SERIAL_CORE
help
	Support for the on-chip UARTs on the S3C series CPUs,
	providing /dev/ttySAC0, 1 and 2 (note, some machines may not
	provide all of these ports, depending on how the serial port
	pins are configured.

	If unsure, say N.

config SERIAL_NXP_S3C_UARTS
	int "Available UART ports"
	depends on SERIAL_NXP_S3C
	default 6
	help
		Select the number of available UART ports for the Nexell S3C
		serial driver
config SERIAL_NXP_S3C_ConSOLE
	bool "Support for console on Nexell S3C serial port"
	depends on SERIAL_NXP_S3C=y
	select SERIAL_CORE_ConSOLE
	---help---
		Allow selection of the S3C24XX on-board serial ports for use as
		an virtual console.

		Even if you say Y here, the currently visible virtual console
		(/dev/tty0) will still be used as the system console by default, but
		you can alter that using a kernel command line option such as
		"console=ttySACx". (Try "man bootparam" or see the documentation of
		your boot loader about how to pass options to the kernel at
		boot time.)
config SERIAL_NXP_UART0
	bool "Serial port 0"
	depends on SERIAL_AMBA_PL011 || SERIAL_NXP_S3C
	default y

config SERIAL_NXP_UART0_DMA
	bool "Use DMA"
	depends on SERIAL_NXP_UART0=y && (SERIAL_AMBA_PL011 || SERIAL_NXP_S3C)

config SERIAL_NXP_UART1
	bool "Serial port 1"
	depends on SERIAL_AMBA_PL011 || SERIAL_NXP_S3C
	default n

config SERIAL_NXP_UART1_DMA
	bool "Use DMA"
	depends on SERIAL_NXP_UART1=y && (SERIAL_AMBA_PL011 || SERIAL_NXP_S3C)

config SERIAL_NXP_UART2
	bool "Serial port 2"
	depends on SERIAL_AMBA_PL011 || SERIAL_NXP_S3C
	default n

config SERIAL_NXP_UART2_DMA
	bool "Use DMA"
	depends on SERIAL_NXP_UART2=y && (SERIAL_AMBA_PL011 || SERIAL_NXP_S3C)

config SERIAL_NXP_UART3
	bool "Serial port 3"
	depends on SERIAL_AMBA_PL011 || SERIAL_NXP_S3C
	default n
config SERIAL_NXP_UART4
	bool "Serial port 4"
	depends on SERIAL_NXP || SERIAL_AMBA_PL011 || SERIAL_NXP_S3C
	default n
config SERIAL_NXP_UART5
	bool "Serial port 5"
	depends on SERIAL_AMBA_PL011 || SERIAL_NXP_S3C
	default n

config SERIAL_NXP_RESUME_WORK
	bool "Set this to reduce resume time (PL011)"
	depends on SERIAL_AMBA_PL011
	default n
	help
		Disable console output to save wakeup time when resume., but
		could be lost resume log message

(2)在 driversttyserialMakefile 文件的最后一行加入红色内容
obj-$(CONFIG_SERIAL_NXP_S3C) += nxp-s3c.o
3)复制原内核(kernel-3.4.39) driversttyserial 下的(nxp-s3c.c 和 nxp-s3c.h)两个文件到新内核
对应的目录下
4)复制原内核(kernel-3.4.39)includelinuxwakelock.h 头文件到新内核的对应目录
(5)在 includelinuxserial_core.h 头文件中加入红色内容
int (*set_wake)(struct uart_port *, unsigned int state);
void (*wake_peer)(struct uart_port *);
(6)选择串口 (注: 需要删除选项中的字符内容时, 需要按住 ctrl+退格)
make menuconfig图形化配置
Device Drivers —>
Character devices —>
Serial drivers —>
更改配置如图所示

到此之后串口移植已经完成,但emmc和文件系统的支持还不完整,需要继续移植

7、 存储设备(MMC)驱动移植
  • 复制原内核(kernel-3.4.39)drivers/mmc 文件夹到新内核替换对应目录的 mmc 文件夹
  • 在 includelinuxmmcdw_mmc.h 头文件288行加入以下信息
 #define DMA_MODE 1
#define PIO_MODE 2
#define DW_MMC_DRIVE_DELAY(n) ((n & 0xFF) << 0)
#define DW_MMC_DRIVE_PHASE(n) ((n & 0x03) <<16)
#define DW_MMC_SAMPLE_DELAY(n) ((n & 0xFF) << 8)
#define DW_MMC_SAMPLE_PHASE(n) ((n & 0x03) <<24)


(3)在 includelinuxmmcpm.h 头文件中加入红色内容
#define MMC_PM_WAKE_SDIO_IRQ (1 << 1)
(4)在 includelinuxmmccard.h 头文件中加入红色内容(注意: 这个 hs_max_dtr 成员的下一个
成员是 sectors 成员, 我们将宏插入两者中间)
unsigned int hs_max_dtr;
#define MMC_HIGH_26_MAX_DTR 26000000
#define MMC_HIGH_52_MAX_DTR 52000000
#define MMC_HIGH_DDR_MAX_DTR 52000000
#define MMC_HS200_MAX_DTR 200000000
unsigned int sectors;
(5)复制原内核(kernel-3.4.39)includelinuxmmchost.h 头文件到新内核替换对应目录下的
host.h 头文件
(6)复制原内核(kernel-3.4.39)includetraceeventsmmc.h 头文件到新内核的对应目录
到此, MMC 的移植就完成了, 编译烧录进开发板后, 开发板就能启动并且进入命令行
了(如果文件系统没有启动成功, 可以重新复制.config 文件到新内核, 然后重新编译, 原因
是在移植过程中编译时.config 有可能被修改。 如果重新复制.config, 重新编译, 需要重新添
加 机 器 类 型 ID , 即 在 includegeneratedmach-types.h 头 文 件 内 “ #define
MACH_TYPE_DA850_PQAB 3891” 宏后加入宏“#define MACH_TYPE_S5P68184330”), 但问
题仍然很多, 比如大量重要硬件设备的驱动没有移植, 很多机制没有完善, 这些还需要后续
进行大量的驱动移植工作。

8 make uImage

将在 arch/arm/boot/下生成编译好的可执行程序 uImage 下载到开发板即可,
如果文件系统是完好的, 那么启动后系统会进入正常的命令行界面通过 uname -r
命令查看内核版本号, 否则可以通过打印信息查看内核是否成功启动, 一般提示
“ Freeing init memory: ” 表示成功。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/461273.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号