您的位置 首页 被动

linux-2.6.30.4移植至2440开发板

一、下载linux-26304源码,并解压ftp:ftpkernelorgpublinuxkernelv26linux-26304targztarzxvflinux-26304targz

一、下载linux-2.6.30.4源码,并解压

ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.4.tar.gz

tar zxvf linux-2.6.30.4.tar.gz

二、在体系中增加对ARM的支撑

$vim Makefile

193#ARCH ?= $(SUBARCH)

194#CROSS_COMPILE ?=

195 ARCH=arm

196 CROSS_COMPILE=arm-linux-

三、修正体系时钟

$vim arch/arm/mach-s3c2440/mach-smdk2440.c

体系的外部时钟为12MHz

160static void __init smdk2440_map_io(void)

161{

162s3c24xx_init_io(smdk2440_iodesc,ARRAY_SIZE(smdk2440_iodesc));

163//s3c24xx_init_clocks(16934400);

164//edit by

165 s3c24xx_init_clocks(12000000);

166s3c24xx_init_uarts(smdk2440_uartcfgs,ARRAY_SIZE(smdk2440_uartcfgs));

167}

阐明:假设体系时钟不匹配,则呈现乱码。

四、制造或许获取内核装备单.config

$make menuconfig

阐明:一个比较好的做法是先调用自带的装备清单,该装备清单在arch/arm/configs目录,文件名为:s3c2410_defconfig,该装备文件简直S3C24XX系列CPU的装备项,能够在此基础上修正装备项。x86的装备项在arch/x86/configs目录下,文件名为:i386_defconfig(32为cpu)。

cp arch/arm/configs/s3c2410_defconfig .config

五、修正机器码

【linux内核源码中检查机器码相关文件:】

$vim arch/arm/mach-s3c2440/mach-smdk2440.c

178 MACHINE_START(S3C2440 , “SMDK2440”)

179/* Maintainer: Ben Dooks */

180.phys_io = S3C2410_PA_UART,

181.io_pg_offst = (((u32)S3C24XX_VA_UART)>> 18) & 0xfffc,

182.boot_params = S3C2410_SDRAM_PA+ 0x100,

183

184 .init_irq = s3c24xx_init_irq,

185.map_io = smdk2440_map_io,

186.init_machine = smdk2440_machine_init,

187.timer = &s3c24xx_timer,

188MACHINE_END

修正机器码,使之与bootloader的机器码相同,这儿运用的是u-boot,机器码为168

$vim arch/arm/tools/mach-types

379 s3c2440 ARCH_S3C2440 S3C2440168

$vim arch/arm/tools/Makefile

7 include/asm-arm/mach-types.h :$(src)/gen-mach-types $(src)/mach-types

8@echo Generating $@

9@mkdir -p $(dir $@)

10$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }

$vim include/asm/mach-types.h

375 #define MACH_TYPE_S3C2440168 //这个没有找见

【U-boot中的相关装备文件】

$vim include/asm-arm/mach-types.h

377 #define MACH_TYPE_S3C2440 168

总结:首先从linux内核源码中找出机器类型(如S3C2440 ),其次,依据u-boot中给出的对应机器类型的机器码(如377 #define MACH_TYPE_S3C2440 168 )修正内核机器码。流程如下:

内核:

$vimarch/arm/mach-s3c2440/mach-smdk2440.c

U-boot:

$viminclude/asm-arm/mach-types.h

内核:

$vimarch/arm/tools/mach-types

阐明:假设机器码过错,则体系提示选取渠道,死机。

六、编译镜像

$make zImage

七、板子烧写

运用DNW东西将内核镜像烧写至开发板中

八、遇到的问题

问题:

Kernel panic – not syncing: Attempted to kill init!

解决办法:

$make menuconfig

挑选以下两项:

Kernel Features —>

[*] Use the ARM EABI to compile the kernel

[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL)

九、NandFlash驱动移植

linux里边现已包括NandFlash驱动,只需对源码进行修正即可。

1、$vim arch/arm/plat-s3c24xx/common-smdk.c

107 /* NAND parititon from 2.4.18-swl5*/

108

109 static struct mtd_partitionsmdk_default_nand_part[] = {

110#if defined(CONFIG_64MB_NAND )

111 [0] = {

112.name = “Board_uboot”,

113.size = 0x00040000,

114.offset = 0x00000000,

115},

116[1] = {

117.name = “Board_kernel”,

118.size = 0x00200000,

119.offset= 0x00200000,

120},

121[2] = {

122.name = “Board_yaffs2”,

123.size = 0x03BF8000,

124.offset = 0x00400000,

125}

126#elif defined(CONFIG_128MB_NAND)

127 [0]={

128.name =”Board_uboot”,

129.offset =0x00000000,

130.size =0x00040000,

131},

132[1]={

133.name =”Board_kernel”,

134.offset =0x00200000,

135.size =0x00200000,

136},

137[2]={

138.name =”Board_yaffs2″

139.offset =0x00400000,

140.size =0x07BA0000,

141}

142 #elif defined(CONFIG_more_than_256MB_NAND)

143 [0]={

144.name =”Board_uboot”,

145.offset =0x00000000,

146.size =0x00040000,

147},

148[1]={

149.name =”Board_kernel”,

150.offset =0x00200000,

151.size =0x00200000,

152},

153[2]={

154.name =”Board_yaffs2″,

155.offset =0x00400000,

156.size =0x0FB80000,

157}

158#endif

159};

2、$vimdrivers/mtd/nand/Kconfig

166 choice

167prompt “Nand Flash Capacity select”

168depends on MTD

169help

170Board Nand Flash Capacity select

171

172 config 64MB_NAND

173 boolean “64MB Nand for Board”

174depends on MTD

175help

176Set 64MB Nand parts

177

178 config 128MB_NAND

179boolean “128MB Nand for Board”

180depends on MTD

181help

182Set 128MB Nand parts

183

184 config more_than_256MB_NAND

185boolean “256MB~1GB Nand for Board”

186depends on MTD

187help

188Set 256MB~1GB Nand parts

189

190 endchoice

注:假设在make menuconfig中选中64MB_NAND,则在.config表现形式如下:

CONFIG _64MB_NAND=y

这实践是给C源文件供给预编译变量,如#if defined(CONFIG_64MB_NAND)…….

这个进程便是完结了内核的定制,比方新增Nand驱动、或许去除wireless驱动。。。

十、移植yaffs2文件体系

1、获取yaffs2源码

http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/

www.aleph1.co.uk/home/aleph1/git/yaffs2

2、在内核中增加对yaffs2的支撑

在刚下载的yaffs2源码中,履行:

./patch-ker.sh c ../linux-2.6.30.4(两个文件夹放一同)

此刻在内核fs目录下,新增“yaffs2”目录,一起fs/目录下面的Makefile文件和Kconfig文件也增加了yaffs2的装备和编译条件。

3、在装备单中增加对yaffs2的支撑

$make menuconfig

File systems —>

[*]Miscellaneous filesystems —>

<*> YAFFS2 file system support

留意:假设在内核中没有增加对yaffs2的支撑,则呈现找不到或许挂载文件体系是失利的提示:

Listof all partitions:

01004096 ram0 (driver?)

01014096 ram1 (driver?)

01024096 ram2 (driver?)

01034096 ram3 (driver?)

01044096 ram4 (driver?)

01054096 ram5 (driver?)

01064096 ram6 (driver?)

01074096 ram7 (driver?)

01084096 ram8 (driver?)

01094096 ram9 (driver?)

010a 4096 ram10 (driver?)

010b4096 ram11 (driver?)

010c 4096 ram12 (driver?)

010d4096 ram13 (driver?)

010e4096 ram14 (driver?)

010f 4096 ram15 (driver?)

1f00 256 mtdblock0 (driver?)

1f01 2048 mtdblock1 (driver?)

1f02 63168 mtdblock2 (driver?)

Nofilesystem could mount root, tried: ext3 ext2 cramfs msdos vfat romfs

Kernel panic – not syncing: VFS: Unable tomount root fs on unknown-block(31,2)

4、yaffs2移植完结,从头编译内核

十一、在内核中增加tmpfs支撑

假设不增加tmpfs支撑,那么将会呈现那/tmp挂载失利的提示。关于tmpfs的效果待研讨。

mount: mounting tmpfs on /tmp failed: Invalidargume

文件体系装备:

[root@ /]#cat /etc/fstab

proc /proc proc defaults 0 0

tmpfs /tmp tmpfs defaults 0 0

sysfs /sys sysfs defaults 0 0

tmpfs /dev tmpfs defaults 0 0

var /dev tmpfs defaults 0 0

File systems —>

Pseudo filesystems —>

[*] Virtual memory file system support(former shm fs)

[*]Tmpfs POSIX Access Control Lists

十二遇到的问题及解决方案

drivers/rtc/hctosys.c:unable to open rtc device (rtc0)

1. 内核装备选项

— Real TimeClock
[*] Set system time from RTC on startup andresume
(rtc0) RTC used to set the systemtime
[ ] RTC debugsupport
*** RTC interfaces***
[*] /sys/class/rtc/rtcN(sysfs)
[*] /dev/rtcN (characterdevices)
[ ] RTC UIE emulation on devinterface
*** on-CPU RTC drivers***
<*> Samsung S3Cseries SoC RTC

2. linux kernel 中 现已支撑S3C2410的RTC,可是并没有增加到渠道设备初始化数组中,所以体系发动时并不会初始化这一部分,需求修正文件mach-smdk.c

static struct platform_device*smdk2410_devices[] __initdata = {
&s3c_device_ohci,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_rtc, //新增代码
};

3. 创建造备节点,在文件体系/dev目录下履行:

sudo mknod rtc c 10 135

4. 从头编译内核,检查发动信息

s3c2410-rtcs3c2410-rtc: rtc disabled,re-enabling

s3c2410-rtcs3c2410-rtc: rtc core:registered s3c asrtc0

这儿阐明rtc驱动起来能够正常工作了

uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 2

EXT3-fs: unable to readsuperblock

uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 2

EXT2-fs: unable to readsuperblock

uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 0

Buffer I/O error ondevice mtdblock2, logical block 0

uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 0

Buffer I/O error ondevice mtdblock2, logical block 0

uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 8

Buffer I/O error ondevice mtdblock2, logical block 1

uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 8

Buffer I/O error ondevice mtdblock2, logical block 1

uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 16

Buffer I/O error ondevice mtdblock2, logical block 2

uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 16

Buffer I/O error ondevice mtdblock2, logical block 2

uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 24

Buffer I/O error ondevice mtdblock2, logical block 3

uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 24

Buffer I/O error ondevice mtdblock2, logical block 3

uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 0

FAT: unable to read bootsector

VFS: Cannot open rootdevice “mtdblock2” or unknown-block(31,2)

Please append a correct”root=” boot option; here are the available partitions:

1f00 256 mtdblock0 (driver?)

1f01 2048 mtdblock1 (driver?)

1f02 257536 mtdblock2 (driver?)

Kernel panic – notsyncing: VFS: Unable to mount root fs on unknown-block(31,2)

MTD分区与bootloader不匹配

#elif defined(CONFIG_more_than_256MB_NAND)

[0]= {

.name = “Board_uboot”,

.offset = 0x00000000,

.size = 0x00080000,

},

[1]= {

.name = “Board_kernel”,

.offset= 0x00240000,

.size = 0x00200000,

},

[2]= {

.name = “Board_yaffs2”,

.offset= 0x00440000,

.size = 0x0FB40000,

}

**************************************************************************************************************************************************************

[0]和[1]分区不连贯的外表原因 中心的部分寄存uboot的参数以及开机画面???环境变量

uboot分区信息:

0x0 到0x40000为uboot的分区,256K,
0x40000到0x4c000 为parameters分区,48K,
0x50000到0x70000 为eboot分区,128K,
0x70000到0x1F0000为logo分区,1536K,
0x1F0000 到0x3F0000为kernel分区,2M,
0x3F0000 到0x3FF8000 为root分区,60.03125M

nand分区信息:

static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = “TQ2440_uboot”,
.size = 0x00040000,
.offset = 0x00000000,
},
[1] = {
.name = “TQ2440_kernel”,
.offset = 0x0004C000,
.size = 0x00200000,
},
[2] = {
.name = “TQ2440_yaffs2”,
.offset = 0x0024C000,
.size = 0x03DB0000,
}
};

uboot的分区和文件体系的分区,没有联络的。仅有的联络便是uboot引导发动的时分,指令要依据文件体系的分区信息来引导。比方要从mtdblock2发动,那么bootcmd中的指令bootm0xXXXXXXX就要和mtdblock2的首地址相同。。。。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部