您的位置 首页 芯闻

linux-2.6.35.3内核移植(s3c2440)

宿主机:Fedora13目标机:s3c2440交叉编译器:arm-linux-gcc-3.4.1交叉编译器路径:/usr/local/arm/3.4.1要移植的内核版本:li…

宿 主机:Fedora13

方针 机:s3c2440
穿插 编译 器:arm-linux-gcc-3.4.1
穿插编译器途径:/usr/local/arm/3.4.1
要移植 的内核 版别:linux-2.6.35.3
文件 体系 类型: yaffs2

一、准备作业

1、下载 解压内核
从官网上下载linux-2.6.35的内核, ftp://ftp.kernel.org/pub/linux/kernel/v2.6/ ,文件不大,约85M。
新建一个作业目录s3c2440,将内核源码包劳动至作业目录下,再解压。
2、移植yaffs2驱动
下载最新的驱动http://www.aleph1.co.uk/cgi-bin/ … fs2.tar.gz?view=tar 解压在作业目录s3c2440下
进入yaffs2: cd yaffs2
给内核打补丁: ./patch-ker.sh c ../linux-2.6.34
成功后打印信息: Updating /file/fl/linux-2.6.34/fs/Kconfig
Updating /file/fl/linux-2.6.34/fs/Makefile

问题:
1、什么是补丁?
一个补丁便是一个文本文档,这个文档包含了在两个不同版别的源代码树之间的改变。补丁是通
过diff应用程序来创立的。 为了正确地打上一个补丁,你需求知道这个补丁是从哪个根底版别产
生出来的以及这个补丁将要把现在的源代码树改变到什么新的版别。这些信息 或许会出现在补丁
文件的原数据中,或许可能从文件名中揣度出来。
2、为什么要给内核打补丁?
由于该内核暂不支撑yaff2的文件体系,打上补丁使之支撑。
3、装置穿插编译环境
从http://www.handhelds.org/download/projects/toolchain/ 下载arm-linux-gcc-3.4.1.tar.bz2
解压之,su
tar vxjf arm-linux-gcc-3.4.1.tar.bz2
将穿插编译器装置到/usr/local/下。 值得留意的是:该/usr/local目录并不是Fedora体系根
录下的/usr/local,而是刚刚生成的/usr/local目录。这个一点要留意,不然浪费了时刻不说,
也破坏了Linux体系。

二、移植



1、修正机器码
飞凌开发板的bootloader默许的机器码是193,所以咱们在运用smdk2440机器的时分,需求修
改机器码。修正内核2.6.35.3中的arch/arm /tools/mach-types。


 删掉
s3c2410 ARCH_S3C2410 S3C2410 182
然后将
s3c2440 ARCH_S3C2440 S3C2440 362
修正为
s3c2440 ARCH_S3C2440 S3C2440 193
2、指定方针板machine、编译器和编译器途径

修正linux-2.6.35.3/Makefile,将
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修正成ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-
留意:CROSS_COMPILE是指穿插编译器的途径,该途径一定要完好,比方自己的是:/home/kelvin /usr
/local/arm/3.4.1/bin/arm-linux- 这个/home/kelvin就不能少,不然最终make zImage时提示文件不存在。

3、增加devfs文件管理器的支撑

咱们所用的文件体系运用的是devfs文件管理器。修正fs/Kconfig,

找到

menu “Pseudo filesystems”

增加如下查办:

config DEVFS_FS

bool “/dev file system support (OBSOLETE)”

default y

config DEVFS_MOUNT

bool “Automatically mount at boot”

default y

depends on DEVFS_FS

协助了解:Kconfig便是对应着内核的装备菜单。假设要想增加新的驱动到内核的源码中,能够修正Kconfig,

这样就能够挑选这个驱动,假设想使这个驱动被编译,要修正Makefile。

4、修正晶振频率(可解决打印信息乱码问题)

文件:arch/arm/mach-s3c2440/mach-smdk2440.c

/*s3c24xx_init_clocks(16934400);*/s3c24xx_init_clocks(12000000);

5、修正MTD分区

文件:arch/arm/plat-s3c24xx/common-smdk.c
需求和bootloader中的分区信息相同(256M),不然,发动时犯错。

static struct mtd_partition smdk_default_nand_part[] = {

[0] = {

.name = “boot”,

.size = 0x00020000,

.offset = 0

},

[1] = {

.name = “MyApp”,

.size = 0x00380000,

.offset = 0x00180000,

},

[2] = {

.name = “Kernel”,

.size = 0x00300000,

.offset = 0x00500000,

},

[3] = {

.name = “fs_yaffs”,

.size = 0x07800000,

.offset = 0x00800000,

}

};

问题:什么是MTD?

MTD(memory technology device内存技能设备)是用于拜访memory设备(ROM、flash)的Linux的子体系。

MTD的首要意图是为了使新的memory设备的驱动愈加简略,为此它在硬件和上层之间供给了一个笼统的接口。

有几点需求留意:

a、此信息需依据自己的实践分区信息修正

b、这儿文件体系地点的分区标号有必要与板子上root_fs的号码相同,不然发动会犯错。因而这儿不需求将一切

的分区信息都写进来,只需方位对应即可!

6、封闭ECC校验

文件:drivers/mtd/nand/s3c2410.c
函数:s3c2410_nand_init_chip

/*chip->ecc.mode = NAND_ECC_SOFT; */chip->ecc.mode = NAND_ECC_NONE;

问题:关于ECC:ECC是“Error Correcting Code”的简写,中文名称是“过错查看和纠正”。ECC是一种能够完成

“过错查看和纠正”的技能,ECC内存便是应用了这种技能的内存,一般多应用在服务器及图形作业站上,这将使整个

电脑体系在作业时更趋于安全安稳。此处为防止简单犯错,将ECC封闭。

7、修正nandflash驱动,支撑K9F1G08的nandflash

修正drivers/mtd/nand下面的nand_bbt.c文件:

static struct nand_bbt_descr largepage_memorybased = {

.options = 0,

.offs = 0,

.len = 1, //原数值为2,支撑2K每页的flash修正为1。K9F1G08,K9F2G08是2k每页的flash

.pattern = scan_ff_pattern

};

static struct nand_bbt_descr largepage_flashbased = {

.options = NAND_BBT_SCAN2NDPAGE,

.offs = 0,

.len = 1, //原数值为2,支撑2K每页的flash修正为1。K9F1G08,K9F2G08是2k每页的flash

.pattern = scan_ff_pattern

};

8、下面,开端装备内核。

进入linux-2.6.35目录,把s3c2410的默许装备写入config文件。

make s3c2410_defconfig

make menuconfig

装备文件体系选项
装备yaffs2文件体系
修正装备如下:

File systems —>

[*] Miscellaneous filesystems —>

<*> YAFFS2 file system support

-*- 512 byte / page devices

-*- 2048 byte (or larger) / page devices

[*] Autoselect yaffs2 format

[*] Cache short names in RAM

装备cpu相关选项
修正装备如下:

System Type —>

S3C2440 Machines —>

[*] SMDK2440

[*] SMDK2440 with S3C2440 CPU module

去掉S3C2400 Machines、S3C2410 Machines、S3C2412 Machines、S3C2442 Machines的一切选项,

不然会报错。假如现在编译内核,下载到开发板中,内核就能够正常发动了.有了雏形,持续移植设备驱动。

这儿,内核选项*代表编译至内核,M代表编译为模块。

9、移植USB host驱动

在这个版别的linux内核,现已对USB驱动进行来很好的支撑,只是需求修正装备。

Device Drivers —>

[*] USB support —>

{*} Support for Host-side USB

[*] USB device filesystem (DEPRECATED)

[*] USB device class-devices (DEPRECATED)

<*> OHCI HCD support

<*> USB Mass Storage support

[*] HID Devices —>

{*} Generic HID support

[*] /dev/hidraw raw HID device support

SCSI device support —>

<*> SCSI device support

[*] legacy /proc/scsi/ support

<*> SCSI disk support

<*> SCSI tape support

10、移植RTC驱动

在这个版别的linux内核,现已对RTC驱动进行来很好的支撑,不需求修正装备。相应装备如下

Device Drivers —>

<*> Real Time Clock —>

[*] Set system time from RTC on startup and resume

(rtc0) RTC used to set the system time

[ ] RTC debug support

*** RTC interfaces ***

[*] /sys/class/rtc/rtcN (sysfs)

[*] /proc/driver/rtc (procfs for rtc0)

[*] /dev/rtcN (character devices)

<*> Samsung S3C series SoC RTC

然后增加对设备的支撑
翻开arch/arm/mach-s3c2440/mach-smdk2440.c,增加设备,代码如下:

static struct platform_device *smdk2440_devices[] __initdata = {

&s3c_device_ohci,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c0,

&s3c_device_iis,

&s3c_device_rtc,

};

11、移植UDA1341驱动

在渠道上增加和装备UDA1341:

修正arch/arm/mach-s3c2440/mach-smdk2440.c,在开端增加头文件

#include

#include

增加设备装备

static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = {

.l3_clk = S3C2410_GPB(4),

.l3_data = S3C2410_GPB(3),

.l3_mode = S3C2410_GPB(2),

.model = UDA134X_UDA1341,

};

static struct platform_device s3c24xx_uda134x = {

.name = “s3c24xx_uda134x”,

.dev = {

.platform_data = &s3c24xx_uda134x_data,

}

};

把设备增加到渠道傍边

static struct platform_device *smdk2440_devices[] __initdata = {

&s3c_device_ohci,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c0,

&s3c_device_iis,

&s3c_device_rtc,

&s3c24xx_uda134x,

};

内核装备如下

Device Drivers —>

<*> Sound card support —>

<*> Advanced Linux Sound Architecture —>

<*> OSS Mixer API

<*> OSS PCM (digital audio) API

[*] OSS PCM (digital audio) API – Include plugin system

[*] Support old ALSA API

[*] Verbose procfs contents

[*] Verbose printk

[*] Generic sound devices —>

<*> ALSA for SoC audio support —>

<*> SoC Audio for the Samsung S3C24XX chips

<*> SoC I2S Audio support UDA134X wired to a S3C24XX

12、移植DM9000驱动

a、修正drivers/net/dm9000.c文件:
头文件增加:

#include

#include

#include

在dm9000_probe函数开端增加:

unsigned char ne_def_eth_mac_addr[]={0x00,0x12,0x34,0x56,0x80,0x49};

static void *bwscon;

static void *gpfcon;

static void *extint0;

static void *intmsk;

#define BWSCON (0x48000000)

#define GPFCON (0x56000050)

#define EXTINT0 (0x56000088)

#define INTMSK (0x4A000008)

bwscon=ioremap_nocache(BWSCON,0x0000004);

gpfcon=ioremap_nocache(GPFCON,0x0000004);

extint0=ioremap_nocache(EXTINT0,0x0000004);

intmsk=ioremap_nocache(INTMSK,0x0000004);

writel(readl(bwscon)|0xc0000,bwscon);

writel( (readl(gpfcon) & ~(0x3 << 14)) | (0x2 << 14), gpfcon);

writel( readl(gpfcon) | (0x1 << 7), gpfcon); // Disable pull-up

writel( (readl(extint0) & ~(0xf << 28)) | (0x4 << 28), extint0); //rising edge

writel( (readl(intmsk)) & ~0x80, intmsk);

在这个函数的最终需求修正:

if (!is_valid_ether_addr(ndev->dev_addr)) {

/* try reading from mac */

mac_src = “chip”;

for (i = 0; i < 6; i++)

//ndev->dev_addr[i] = ior(db, i+DM9000_PAR);

ndev->dev_addr[i] = ne_def_eth_mac_addr[i];

}

b、修正arch/arm/mach-s3c2440/mach-smdk2440.c,增加设备

static struct platform_device *smdk2440_devices[] __initdata = {

&s3c_device_ohci,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c0,

&s3c_device_iis,

&s3c_device_rtc,

&s3c24xx_uda134x,

&s3c_device_dm9000,

};

c、修正arch/arm/plat-s3c24xx/devs.c
增加头文件

#include

增加以下代码

static struct resource s3c_dm9000_resource[] = {

[0] = {

.start = S3C24XX_PA_DM9000,

.end = S3C24XX_PA_DM9000+ 0x3,

.flags = IORESOURCE_MEM

},

[1]={

.start = S3C24XX_PA_DM9000 + 0x4, //CMD pin is A2

.end = S3C24XX_PA_DM9000 + 0x4 + 0x7c,

.flags = IORESOURCE_MEM

},

[2] = {

.start = IRQ_EINT7,

.end = IRQ_EINT7,

.flags = IORESOURCE_IRQ

},

};

static struct dm9000_plat_data s3c_device_dm9000_platdata = {

.flags= DM9000_PLATF_16BITONLY,

};

struct platform_device s3c_device_dm9000 = {

.name= “dm9000”,

.id= 0,

.num_resources= ARRAY_SIZE(s3c_dm9000_resource),

.resource= s3c_dm9000_resource,

.dev= {

.platform_data = &s3c_device_dm9000_platdata,

}

};

EXPORT_SYMBOL(s3c_device_dm9000);

d、修正arch/arm/plat-sumsung/include/plat/devs.h 45行邻近,增加

extern struct platform_device s3c_device_dm9000;

e、修正arch/arm/mach-s3c2410/include/mach/map.h文件

/* DM9000 */

#define S3C24XX_PA_DM9000 0x20000300

#define S3C24XX_VA_DM9000 0xE0000000

13、发动画面显现小企鹅的办法

装备内核,下面是必选项

Device Drivers—>

Graphics support —>

<*> Support for frame buffer devices

<*> S3C2410 LCD framebuffer support ,multi support!

Console display driver support —>

<*> Framebuffer Console support

Logo configuration —>

[*] Bootup logo

[*] Standard 224-color Linux logo

14、3.5寸LCD显现的移植

2.6.34内核中现已支撑

15、修正uart2为一般串口以及测验程序

修正arch/arm/mach-s3c2440/mach-smdk2440.c中的uart2的装备,修正后如下:

static struct s3c2410_uartcfg smdk2440_uartcfgs[] __initdata = {

[0] = {

.hwport = 0,

.flags = 0,

.ucon = 0x3c5,

.ulcon = 0x03,

.ufcon = 0x51,

},

[1] = {

.hwport = 1,

.flags = 0,

.ucon = 0x3c5,

.ulcon = 0x03,

.ufcon = 0x51,

},

/* IR port */

[2] = {

.hwport = 2,

.flags = 0,

.ucon = 0x3c5,

.ulcon = 0x03,/*fatfish 0x43*/

.ufcon = 0x51,

}

};

在drivers/serial/samsung.c中增加对uart2控制器的装备,装备为一般串口。

增加头文件:

#include

#include

在static int s3c24xx_serial_startup(struct uart_port *port)函数中,增加

if (port->line == 2) {

s3c2410_gpio_cfgpin(S3C2410_GPH(6), S3C2410_GPH6_TXD2);

s3c2410_gpio_pullup(S3C2410_GPH(6), 1);

s3c2410_gpio_cfgpin(S3C2410_GPH(7), S3C2410_GPH7_RXD2);

s3c2410_gpio_pullup(S3C2410_GPH(7), 1);

}

测验办法:
在linux内核源码中drivers/serial/samsung.c中

.dev_name = “ttySAC”,

写明在开发板/dev目录下生成的ttySACx为串口设备结点。
运用指令:

getty 115200 /dev/ttySAC2

将终端交给com2,这样能够在com2中收到波特率为115200的终端信息。
这三个针的次序:最靠近底板丝印层“com2”字样的针脚是com2的发送脚(需求接pc串口的接收脚),中心的

是com2的接收脚(接pc串口的发送脚),剩余的那个是地(接pc串口的地)。

16、移植看门狗

修正装备

Device Drivers —>

[*] Watchdog Timer Support —>

<*> S3C2410 Watchdog

最终:make zImage

最终编译出来的zImage就2.0M左右。

/*

假如想铲除之前的一切装备,复原内核树,能够运用

make mrproper

假如只是是想清楚装备文件,运用

make clean

即可

*/

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/264254.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部