Chinaunix首页 | 论坛 | 博客
  • 博客访问: 467827
  • 博文数量: 70
  • 博客积分: 87
  • 博客等级: 民兵
  • 技术积分: 446
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-10 22:18
文章分类

全部博文(70)

文章存档

2020年(3)

2018年(1)

2017年(4)

2016年(1)

2015年(3)

2014年(11)

2013年(22)

2012年(25)

我的朋友

分类: LINUX

2013-02-23 21:02:01

原文地址:S3C6410开发板实践实录1 作者:lli_njupt

----------------------------------------------------------------
本文系作者原创, 欢迎大家转载!
转载请注明出处:netwalker.blog.chinaunix.net
----------------------------------------------------------------
 
硬件平台:
MainBoard:OK6410
CPU: S3C6410
RAM: 256M
FLASH:1G K9GAG08U0D
Kernel:Linux2.6.28
BootLoader:Uboot1.1.6

 

1. LINUX FLASH分区问题

 

看到linux在启动的时候打印出:

 

  1. Creating 4 MTD partitions on "NAND 2GiB 3,3V 8-bit":

  2. 0x00000000-0x00040000 : "Bootloader"
  3. 0x00040000-0x00400000 : "Kernel"
  4. 0x00400000-0x05400000 : "Rootfs"
  5. 0x05400000-0x80000000 : "File System"

 

所以bootloader应该是0x00000000-0x00040000,大小256k,但是为何文档中升级uboot的时候更新的是0x100000大小的FLASH空间?

 

后在LINUXdump出来/dev/mtdblock1和写入zImage比较发现前一部分是uboot的东西,之所以系统可以加载Rootfs成功是因为0x00400000-0x05400000和文档中的根文件系统是一致的。所以这里需要更改内核分区的大小,位于linux2.6.28/arch/arm/plat-s3c/include/ plat/partition.h

 

  1. struct mtd_partition s3c_partition_info[] =
  2. {
  3.   {
  4.     .name = "Bootloader",
  5.     .offset = 0,
  6.     .size = (SZ_1M),
  7.     .mask_flags = MTD_CAP_NANDFLASH,
  8.   },
  9.   {
  10.     .name = "Kernel",
  11.     .offset = (SZ_1M),
  12.     .size = (4*SZ_1M) - (SZ_1M),
  13.     .mask_flags = MTD_CAP_NANDFLASH,
  14.   },
  15. #if defined(CONFIG_SPLIT_ROOT_FILESYSTEM)
  16.   {
  17.     .name = "Rootfs",
  18.     .offset = (4*SZ_1M),
  19.     .size = (80*SZ_1M),//(48*SZ_1M),
  20.   },
  21. #endif
  22.   {
  23.     .name = "File System",
  24.     .offset = MTDPART_OFS_APPEND,
  25.     .size = MTDPART_SIZ_FULL,
  26.     }
  27. };

 

此时在内核启动时输出的信息与实际NAND Flash的分区情况是一致的了。

0x00000000-0x00100000 : "Bootloader"

0x00100000-0x00400000 : "Kernel"

0x00400000-0x05400000 : "Rootfs"

0x05400000-0x80000000 : "File System"

 

2.如何实现tftp uboot升级

 

这个网上有DM9000A的驱动,只要替换对应的driver/dm9000.c driver/dm9000.h即可,但是发现只有在使用ping命令(发送数据包)的时候,对应的网卡才会激活,而一旦ping结束后,那么网卡就会自动断掉,查看代码发现在do_ping时会做eth_init,而结束后会做eth_close动作

 

所以在start_armboot函数中加入初始化动作:eth_init(gd->bd); 并注释掉eth_close动作即可。

阅读(162) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~