- 1.环境介绍
- 2、修改编译内核
- 3 修改板子的支持
- 4 修改默认配置文件
- 5 添加机器类型号
- 6 串口驱动移植
- 7、 存储设备(MMC)驱动移植
- 8 make uImage
1、 kernel环境: linux-3.4.110
2、 ext4文件系统源码包
3、 交叉编译器 arm-linux-4.3.2
- .解压 linux-3.4.110源码包,可以从Linux官网上下载,对应的是你自己内核的版本
- 修改内核根目录下的makefile文件,修改成下面信息
复制原内核(kernel-3.4.39) arch/arm 下的(palt-s5p6818 和 mach-s5p6818)两个文件夹到新
内核(kernel-3.4.110)对应的目录下。
复制原内核(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-
(CONFIGPLATVERSATILE):=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 一下, 如有异常按回车键即可,
无所谓编译结果。 目的是为了让内核自动生成一些内容。
-
在 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;
};
- 在 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和文件系统的支持还不完整,需要继续移植
- 复制原内核(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”), 但问
题仍然很多, 比如大量重要硬件设备的驱动没有移植, 很多机制没有完善, 这些还需要后续
进行大量的驱动移植工作。
将在 arch/arm/boot/下生成编译好的可执行程序 uImage 下载到开发板即可,
如果文件系统是完好的, 那么启动后系统会进入正常的命令行界面通过 uname -r
命令查看内核版本号, 否则可以通过打印信息查看内核是否成功启动, 一般提示
“ Freeing init memory: ” 表示成功。



