博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

Tekkaman Ninja

Linux我的梦想,我的未来! 专注linux内核和驱动!本博客的原创文章的内容会不定期更新或修正错误! 转载文章都会注明出处,若有侵权,请即时同我联系,我一定马上删除!! 原创文章版权所有!如需转载,请注明出处: tekkman.cublog.cn ,谢谢合作!!!!!
  tekkman.cublog.cn

关于作者
姓名:Tekkaman  Ninja
职业:Linux
年龄:25
位置:广东广州
个性介绍:钻研嵌入式Linux技术
E-Mail:tekkamanninja@163.com
|| << >> ||
我的分类


移植Linux2.6.22.2到博创2410-S(s3c2410A)(1)

移植Linux2.6.22.2到博创2410-S(s3c2410A)
(包括AX88796移植)

一、将Linux2.6.22.2内核源码放到工作目录的kernel文件夹下,并解压。
#tar xzvf linux2.6.22.2.tar.gz
#pwd
/home/tekkaman/working/kernel
# cd linux2.6.22.2
进入内核解压后的目录,以后示例中,只要是相对路径全部是相对于
/home/tekkaman/working/kernel/linux2.6.22.2/此目录


二、修改内核源码根目录下的Makefile文件(CROSS_COMPILE    =的值因个人情况而定,其他可以照做。)
#vi Makefile

......
#SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
#                  -e s/arm.*/arm/ -e s/sa110/arm/ \
#                  -e s/s390x/s390/ -e s/parisc64/parisc/ \
#                  -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )
......

#ARCH        ?= $(SUBARCH)
#CROSS_COMPILE    ?=

ARCH        = arm
CROSS_COMPILE    = /home/tekkaman/working/crosstool-gcc410-k26222/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-



三、修改arch/arm/plat-s3c24xx/common-smdk.c文件,修改Nand Flash的分区信息和Nand Flash的硬件信息。

 (LED 器件的初始化也在这个文件里,但是博创的平台没有那四个LED管,所以要不要那些程序都无所谓。我就把它们放在那里,反正启动时不会有影响,也没有出错信息。)

注意:请不要画蛇添足地在进行自定义nand flash分区时仍然按照以前内核的移植步骤,在devs.c中自己添加分区信息,不然系统启动时会有出错信息:

kobject_add failed for s3c2410-nand with -EEXIST, don't try to register things with the same name in the same directory.
[<c00290a8>] (dump_stack+0x0/0x14) from [<c0110a9c>] (kobject_shadow_add+0x160/0x1a8)
[<c011093c>] (kobject_shadow_add+0x0/0x1a8) from [<c0110af8>] (kobject_add+0x14/0x18)
[<c0110ae4>] (kobject_add+0x0/0x18) from [<c015117c>] (device_add+0xa0/0x568)
[<c01510dc>] (device_add+0x0/0x568) from [<c0155180>] (platform_device_add+0x100/0x150)
[<c0155080>] (platform_device_add+0x0/0x150) from [<c01551f0>] (platform_device_register+0x20/0x24)
 r7:c0022a10 r6:c0020a1c r5:00000000 r4:c02cab30
[<c01551d0>] (platform_device_register+0x0/0x24) from [<c01553f8>] (platform_add_devices+0x24/0x6c)
 r4:00000000
[<c01553d4>] (platform_add_devices+0x0/0x6c) from [<c0011df4>] (smdk_machine_init+0x84/0x98)
 r8:c03b8000 r7:00000000 r6:c0020a1c r5:00000000 r4:c0021404
[<c0011d70>] (smdk_machine_init+0x0/0x98) from [<c0011178>] (smdk2410_init+0x1c/0x24)
[<c001115c>] (smdk2410_init+0x0/0x24) from [<c000f0bc>] (customize_machine+0x20/0x2c)
[<c000f09c>] (customize_machine+0x0/0x2c) from [<c0008914>] (kernel_init+0xb8/0x284)
[<c000885c>] (kernel_init+0x0/0x284) from [<c003d688>] (do_exit+0x0/0x76c)

我一开始就犯了这个毛病。具体情况请参阅:http://blog.chinaunix.net/u/17218/showart_262438.html以及/arch/arm/plat-s3c24xx文件夹下的common-smdk.c和devs.c。

......
/* NAND parititon from 2.4.18-swl5 */

static struct mtd_partition smdk_default_nand_part[] = {
 [0] = {
  .name = "U-Boot-1.2.0",
  .size  = SZ_128K,
  .offset = 0,
 },
 [1] = {
  .name = "U-Boot-1.2.0 Parameter",
  .offset = SZ_128K,
  .size = SZ_64K,
 },
 [2] = {
  .name = "Linux2.6.22.2 Kernel",
  .offset = SZ_128K+SZ_64K,
  .size = SZ_4M+(SZ_1M-SZ_128K-SZ_64K),
 },
 [3] = {
  .name = "Root-JFFS2",
  .offset = SZ_1M * 5,
  .size = SZ_1M * 5,
 },
 [4] = {
  .name = "Boot-Root(cramfs)",
  .offset = SZ_1M * 10,
  .size = SZ_1M * 10,
 },
 [5] = {
  .name = "YAFFS",
  .offset = SZ_1M * 20,
  .size = SZ_1M * 44,
 }
/*,
 [6] = {
  .name = "S3C2410 flash partition 6",
  .offset = SZ_1M * 24,
  .size = SZ_1M * 24,
 },
 [7] = {
  .name = "S3C2410 flash partition 7",
  .offset = SZ_1M * 48,
  .size = SZ_16M,
 }
*/
};
......

static struct s3c2410_platform_nand smdk_nand_info = {
    .tacls        = 0,
    .twrph0        = 30,
    .twrph1        = 0,
    .nr_sets    = ARRAY_SIZE(smdk_nand_sets),
    .sets        = smdk_nand_sets,
};
......



四、 修改drivers/mtd/nand/s3c2410.c,去掉nand flash 的ECC。
  我的内核是通过U-BOOT写到Nand Flash的, U-BOOT 通过的软件ECC算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生的。所以,我在这里选择禁止内核ECC校验。


 (不过我不了解内核中的ECC码生成原理,在查资料的过程中我看到了《成功移植最新的2.6.22.3的linux kernel到S3C2410上》,链接是
http://www.cnitblog.com/zouzheng/archive/2007/08/28/32545.htmlhttp://hi.baidu.com/wangy0919/blog/item/0058652ae8c3133b5343c1cf.html,都是转载的,但都没找到原作者是谁。其中有这样一段活:


“第三步:修改ECC校验:
根据kernel官方网站上的说明,从2.6.22.3已经修改了ECC校验的问题(这也是我移植2.6.22.3的一个重要原因)。但实验下来发现,不管是用软件ECC还是硬件ECC都不行。只好改成NAND_ECC_NONE:
在driver/mtd/nand/s3c2410.c中找到s3c2410_nand_init_chip()函数,将其中的
chip->ecc.mode=NAND_ECC_SOFT;
改成
chip->ecc.mode=NAND_ECC_NONE; ”


后来我就到网上找关于2.6.22.3的ECC校验的资料,始终没找到上面所说的修改,那位高人看到了通知一声。看来要好好看看这方面的内容了。)

    搜索关键字NAND_ECC_SOFT,在s3c2410_nand_init_chip函数里,修改NAND_ECC_SOFT为NAND_ECC_NONE


 五、增加Yaffs2文件系统的支持
  对于YAFFS文件系统,我在移植时查阅了许多资料。有的博客上说没有必要移植YAFFS2,因为它是为每页大于1024B的NAND Flash设计的。即使移植了YAFFS2,如果你的NAND Flash是每页512+16B的那系统也会自动挂载YAFFS。所以在这里要移植YAFFS2或是YAFFS 随你的便。我移植的是YAFFS2。
 1、下载Yaffs2
      
URL:http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/
 2、解压Yaffs2并将其加入Linux内核(打补丁的方式)
       #cd yaffs2
      
#./patch-ker.sh c /home/tekkaman/working/kernel/linux-2.6.22.2/


回目录 移植Linux2.6.22.2到博创2410-S(s3c2410A)

 TAG 2.6.22.2
发表于: 2007-08-28,修改于: 2007-10-29 23:08,已浏览3452次,有评论0条 推荐 投诉


网友评论
网友: creatorwu 时间:2008-04-23 08:59:37 IP地址:116.25.194.★
写的非常好。感谢。
我把您的文章转载到我的blog了。
http://blog.chinaunix.net/u1/49088/showart.php?id=573428
谢谢。

网友: zsfly 时间:2008-04-25 16:49:58 IP地址:61.144.207.★
我们年龄一样, 但是看起来你的修为比我深多了,惭愧

网友: john1984cn 时间:2008-05-08 16:58:45 IP地址:220.249.99.★
问一个弱弱的问题,我用的是虚拟机上面修改内核的Makefile但是不能保存。保存就提示Makefile write error(file system fuu?)
Makefile的属性是-rw-rw-rw,不知道什么问题

Blog作者的回复:
这个问题我没碰过,但我觉得,你是不是在虚拟机和windows的共享目录下修改的,如果是,请将内核文件复制到虚拟机Linux中的某个目录下修改看看。


网友: john1984cn 时间:2008-05-10 14:37:05 IP地址:220.249.99.★
不是的,我是直接把内核文件用FTP工具传到虚拟机上的,然后解压,没有进行其他操作,不是共享

Blog作者的回复:
那么请你告诉我:你是用什么工具修改Makefile的?vi?Kwrite?Kate?
建议用别的工具试试

我还真没见过
write error(file system fuu?)
的提示,问题解决的话请也教教我啊。


网友: wendsia 时间:2008-05-15 11:02:14 IP地址:58.216.220.★
楼主,我想要内核的zImage文件,可以发个我吗?初学想试试2.6内核
wendsia@163.com,谢谢

Blog作者的回复:
公告:想要文件的最好发邮件给我,只要有空我会回复。在博客上留邮件地址,我常会忘记。为了更好的帮助您,想要文件的最好发邮件给我,谢谢合作!


网友: yly_1234556 时间:2008-07-29 20:39:20 IP地址:220.189.249.★
我最近是移植2.6.18内核到博创2410-S中,内核配置编译并烧写,并且还增加了LCD 初始化代码,都是安装网上您的:《移植Linux2.6.22.2到博创2410-S(s3c2410A)(补:LCD(SHARP LQ080V3DG01)驱动移植)》与《移植linux2.6.22.2到博创2410-S(s3c2410A)》那两篇文章做的,唯一的是没有增加网卡驱动(因为添加了出现很多错误信息),但是起动的时候却出现下面的信息,而且企鹅也出不来的

vivi> boot
Copy linux kernel from 0x00030000 to 0x30008000, size = 0x002d0000 ... done
zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "noinitrd root=/dev/bon/3 init=/linuxrc console=ttySAC0 "
MACH_TYPE = 193
NOW, Booting Linux......
Uncompressing Linux.............................................................
Linux version 2.6.18 (root@localhost.localdomain) (gcc version 3.4.3 (release) 8
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
Machine: SMDK2410
ATAG_INITRD is deprecated; please update your bootloader.
Memory policy: ECC disabled, Data cache writeback
CPU S3C2410A (id 0x32410002)
S3C2410: core 200.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz
S3C24XX Clocks, (c) 2004 Simtec Electronics
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
Built 1 zonelists.  Total pages: 16384
Kernel command line: noinitrd root=/dev/bon/3 init=/linuxrc console=ttySAC0 con0
irq: clearing pending ext status 00000100
irq: clearing subpending status 00000007
irq: clearing subpending status 00000002
PID hash table entries: 512 (order: 9, 2048 bytes)
timer tcon=00000000, tcnt a2c1, tcfg 00000200,00000000, usec 00001eb8
Console: colour dummy device 80x30
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 61568KB available (2617K code, 580K data, 112K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
NET: Registered protocol family 16
S3C2410 Power Management, (c) 2004 Simtec Electronics
S3C2410: Initialising architecture
usbcore: registered new driver usbfs
usbcore: registered new driver hub
NET: Registered protocol family 2
IP route cache hash table entries: 512 (order: -1, 2048 bytes)
TCP established hash table entries: 2048 (order: 1, 8192 bytes)
TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
TCP: Hash tables configured (established 2048 bind 1024)
TCP reno registered
S3C2410 DMA Driver, (c) 2003-2004 Simtec Electronics
DMA channel 0 at c4800000, irq 33
DMA channel 1 at c4800040, irq 34
DMA channel 2 at c4800080, irq 35
DMA channel 3 at c48000c0, irq 36
NetWinder Floating Point Emulator V0.97 (double precision)
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
JFFS version 1.0, (C) 1999, 2000  Axis Communications AB
JFFS2 version 2.2. (NAND) (C) 2001-2006 Red Hat, Inc.
fuse init (API version 7.7)
Initializing Cryptographic API
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered


s3c2410-lcd s3c2410-lcd: no platform data for lcd, cannot attach
s3c2410-lcd: probe of s3c2410-lcd failed with error -22


lp: driver loaded but no devices found
S3C2410 RTC, (c) 2004 Simtec Electronics
ppdev: user-space parallel port driver
S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled
s3c2410-uart.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2410
s3c2410-uart.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2410
s3c2410-uart.2: s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2410
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
loop: loaded (max 8 devices)
dm9000 Ethernet Driver
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
BAST NOR-Flash Driver, (c) 2004 Simtec Electronics
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c2410-nand s3c2410-nand: Tacls=1, 10ns Twrph0=4 40ns, Twrph1=1 10ns
NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bi)
NAND_ECC_NONE selected by board driver. This is not recommended !!
Scanning device for bad blocks
Bad eraseblock 5 at 0x00014000
Creating 6 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00020000 : "vivi"
0x00020000-0x00030000 : "param"
0x00030000-0x00500000 : "kernel"
0x00500000-0x00a00000 : "Root-JFFS2"
0x00a00000-0x01400000 : "Boot-Root(cramfs)"
0x01400000-0x04000000 : "YAFFS"
usbmon: debugfs is not available
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
mice: PS/2 mouse device common for all mice
s3c2410-i2c s3c2410-i2c: slave address 0x10
s3c2410-i2c s3c2410-i2c: bus frequency set to 390 KHz
s3c2410-i2c s3c2410-i2c: i2c-0: S3C I2C adapter
TCP bic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
Root-NFS: No NFS server available, giving up.
VFS: Unable to mount root fs via NFS, trying floppy.


VFS: Cannot open root device "bon/3" or unknown-block(2,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)


我觉得出错的可能是上面我用前后空两行表示了,但是我不知道怎么改,希望您能指点一下!

Blog作者的回复:
关键是内核找不到LCD数据no platform data for lcd, cannot attach,可能是你少加了什么代码,具体是怎么样你自己核对一下我的代码。你能编译通过应该不是内核不同的原因。


网友: 本站网友 时间:2008-08-11 21:57:47 IP地址:61.186.188.★
福建龙岩?
你是龙岩的?我是上杭的....

Blog作者的回复:
新罗


 发表评论