逐步完善u-boot-2011.06-rc2-OK6410--SOLVE_raise: Signal # 8 caught

本文解决了U-Boot 2011.06-RC2版本中针对S3C6410平台NAND操作时出现的无限循环打印问题。通过修改timer.c文件中的计时器配置,成功消除了异常信号并使NAND读写功能恢复正常。
摘要由CSDN通过智能技术生成

离上一篇介绍UBOOT2011.06-RC2已经有好几天没有更新了,主要是太忙了,冒得时间,如果有兴趣的朋友看到我上2篇的移植愚见后,如果你也亲自去实践过的话,我想你肯定会发现,当你输入NAND READ 或是NAND WRITE命令的时候,#命令符号后会不断地打印 一串信号:

raise: Signal # 8 caught

raise: Signal # 8 caught而且是循环打印,无法停止,但是NAND ERASE命令是可行的 没有这种信号输出,起初我开始怀疑是不是NAND驱动有问题,导致NAND的读写函数功能没有实现完全,但是事实上这种可能很小,因为既然SMDK6400已经实现了,我想OK6410应该不会出现这个问题啊,况且1GB的NAND芯片已经被识别了,带着这种疑问,我想了好久,还是想不通,核查代码一遍又一遍,搞的我还去翻了一遍单板上的NAND芯片英文资料还有SOC_S3C6410的DATASHEET,哎,看的头都大了,但是一切都是都那么的美好,看不出个问题,没办法,还是去GOOLE一下吧,带着渺茫的希望,翻了好几页,终于让我在国外的一个网站论坛上看到了希望,原来 对于S3C6410来说,较新版的UBOOT版本都有一个BUG,那就是再u-boot-2011.06-rc2/arch/arm/cpu/arm1176/s3c64xx/timer.c这个文件上,其实这个问题早几个月以前就有人提出来了,因为我看他们的聊天记录视乎是1月份左右的,本人英语虽很稀烂,但是看这些还是不成问题的了,可能会有人问,既然问题出了,为啥子DENX TEAM不加进新版本的UBOOT呢?其实我也很疑惑,但是正如DENX TEAM的UBOOT软件工程师WOLF GANG所气愤的,他不希望因为某一个芯片而去把UBOOT里面的代码的可读性以及可理解性破坏掉,改了timer.c里面的几个变量名的确可以让S3C6410 WORK WELL,但是这样,代码的可读性将会变得很差,因此,他的建议是需要的人直接去修改TIMER.C的代码,即使是以后更新的版本,也不会因为S3C6410这个芯片而去改动,其实,他说的很对,毕竟代码如果可读性降低了,那维护起来也很不方便,更让人很难理解啊,在这点上我还是很认同的,呵呵。好了,废话,说了一大堆,在这,贴出这个 PATCH吧:

diff --git a/arch/arm/cpu/arm1176/s3c64xx/timer.c b/arch/arm/cpu/arm1176/s3c64xx/timer.c
index 9768319..c1280f2 100644
--- a/arch/arm/cpu/arm1176/s3c64xx/timer.c
+++ b/arch/arm/cpu/arm1176/s3c64xx/timer.c
@@ -43,7 +43,7 @@
 #include <asm/arch/s3c6400.h>
 #include <div64.h>
 
-static ulong timer_load_val;
+DECLARE_GLOBAL_DATA_PTR;
 
 #define PRESCALER 167
 
@@ -60,12 +60,6 @@  static inline ulong read_timer(void)
  return timers->TCNTO4;
 }
 
-/* Internal tick units */
-/* Last decremneter snapshot */
-static unsigned long lastdec;
-/* Monotonic incrementing timer */
-static unsigned long long timestamp;
-
 int timer_init(void)
 {
  s3c64xx_timers *const timers = s3c64xx_get_base_timers();
@@ -83,20 +77,18 @@  int timer_init(void)
   * the prescaler automatically for other PCLK frequencies.
   */
  timers->TCFG0 = PRESCALER << 8;
- if (timer_load_val == 0) {
-  timer_load_val = get_PCLK() / PRESCALER * (100 / 4); /* 100s */
-  timers->TCFG1 = (timers->TCFG1 & ~0xf0000) | 0x20000;
- }
+ gd->timer_rate_hz = get_PCLK() / PRESCALER * (100 / 4); /* 100s */
+ timers->TCFG1 = (timers->TCFG1 & ~0xf0000) | 0x20000;
 
  /* load value for 10 ms timeout */
- lastdec = timers->TCNTB4 = timer_load_val;
+ gd->lastinc = timers->TCNTB4 = gd->timer_rate_hz;
  /* auto load, manual update of Timer 4 */
  timers->TCON = (timers->TCON & ~0x00700000) | TCON_4_AUTO |
   TCON_4_UPDATE;
 
  /* auto load, start Timer 4 */
  timers->TCON = (timers->TCON & ~0x00700000) | TCON_4_AUTO | COUNT_4_ON;
- timestamp = 0;
+ gd->timer_reset_value = 0;
 
  return 0;
 }
@@ -113,16 +105,16 @@  unsigned long long get_ticks(void)
 {
  ulong now = read_timer();
 
- if (lastdec >= now) {
+ if (gd->lastinc >= now) {
   /* normal mode */
-  timestamp += lastdec - now;
+  gd->timer_reset_value += gd->lastinc - now;
  } else {
   /* we have an overflow ... */
-  timestamp += lastdec + timer_load_val - now;
+  gd->timer_reset_value += gd->lastinc + gd->timer_rate_hz - now;
  }
- lastdec = now;
+ gd->lastinc = now;
 
- return timestamp;
+ return gd->timer_reset_value;
 }
 
 /*
@@ -132,14 +124,14 @@  unsigned long long get_ticks(void)
 ulong get_tbclk(void)
 {
  /* We overrun in 100s */
- return (ulong)(timer_load_val / 100);
+ return (ulong)(gd->timer_rate_hz / 100);
 }
 
 void reset_timer_masked(void)
 {
  /* reset time */
- lastdec = read_timer();
- timestamp = 0;
+ gd->lastinc = read_timer();
+ gd->timer_reset_value = 0;
 }
 
 void reset_timer(void)
@@ -150,7 +142,7 @@  void reset_timer(void)
 ulong get_timer_masked(void)
 {
  unsigned long long res = get_ticks();
- do_div (res, (timer_load_val / (100 * CONFIG_SYS_HZ)));
+ do_div(res, (gd->timer_rate_hz / (100 * CONFIG_SYS_HZ)));
  return res;
 }
 
@@ -161,7 +153,7 @@  ulong get_timer(ulong base)
 
 void set_timer(ulong t)
 {
- timestamp = t * (timer_load_val / (100 * CONFIG_SYS_HZ));
+ gd->timer_reset_value = t * (gd->timer_rate_hz / (100 * CONFIG_SYS_HZ));
 }
 
 void __udelay(unsigned long usec)
@@ -170,7 +162,7 @@  void __udelay(unsigned long usec)
  ulong tmo;
 
  tmo = (usec + 9) / 10;
- tmp = get_ticks() + tmo; /* get current timestamp */
+ tmp = get_ticks() + tmo; /* get current timer_reset_value */
 
  while (get_ticks() < tmp)/* loop till event */
    /*NOP*/;

,可能会有人会觉得照着去手动改写的地方有40处,太多了,好麻烦,好了,这里教大家一个办法,其实就是打补丁了,呵呵,大家将这段代码粘贴下来,在LINUX环境下任意一个目录下,新建一个文件,文件名name.patch,也就是gedit name.patch, 或是vi name.patch,看你习惯了,这里的name 你随便命名,然后粘贴代码,保存,然后进到UBOOT的根目录下,

输入命令:patch -Np1 -i /.../directory/name.patch,这里的directory也就是你保存那个PATCH补丁的位置,这样,timer.c文件的补丁就打好了,不需要再去修改了,如果你不相信,也可以进到相应的目录查看,呵呵,好了,然后 你再次编译,下载到DRAM里面运行,

U-Boot 2011.06-rc2 (Jul 01 2011 - 17:06:03) for OK6410

 

CPU:     S3C6410@533MHz

         Fclk = 533MHz, Hclk = 133MHz, Pclk = 66MHz (ASYNC Mode)

Board:   OK6410

DRAM:  128 MiB

Flash: *** NULL ***

NAND:  1024 MiB

*** Warning - bad CRC, using default environment


In:    serial

Out:   serial

Err:   serial

Net:   CS8900-0

Hit any key to stop autoboot:  0

OK6410 # nand erase 0 100000


NAND erase: device 0 offset 0x0, size 0x100000


Erasing at 0x0 --  25 complete.
Erasing at 0x40000 --  50痮mplete.
Erasing at 0x80000 --  75痮mplete.
Erasing at 0xc0000 -- 100痮mplete.

OK,看到没,NAND后面的那几个

raise: Signal # 8 caught也没了,的确,这个补丁对于S3C6410来说是VERY GOOD的,经过自己实践验证,NAND读写完全没问题,看来新版本的UBOOT对与6410的NAND的MTD驱动真的是支持的很好了啊。

对了,最后我在这有必要说明一下啊,我这个u-boot-2011.06-rc2虽然是对飞凌OK6410移植的,但是对只要是采用S3C6410芯片的板子理论上基本都是可行的,还有一点,就是现在虽然已近实现了NAND驱动了,但是还并没有实现NAND启动,这点也不难,有时间我会去完善的,对了,还有后续的一些其他功能我会逐步去加进去的,比如现在的U-Boot 2011.06-rc2的USB-OTG下载功能已经实现了,具体运行截图请点击我下方的QQ空间的链接,没办法,现在我还无法上传图片啊,所以这里贴不出来,移植方法我会稍后放出的,等有时间一定会写上详细的方法的,以后会陆续添加更多的功能的,至于那个DM9000网卡驱动后面也会移植的,我的目标就是将这个新版的OK6410的UBOOT版本功能变得强大起来 呵呵 纯属个人爱好了,不知道有没有啥实用价值。

 

WARNING:

目前这个版本只能在DRAM里面运行加载LINUX镜像,因为我还没加入代码实现NAND搬运UBOOT前4K代码入DRAM最终实现NAND启动UBOOT,当然这个会在以后加进去的,还有一点需要提醒大家的是,这个版本编译默认好像是没有开启MMU的,所以对于对于高地址的范围是无法访问的,如需要,可以在OK6410.H里面定义启用。

  最后说一句啊,如果有人不会弄那个PATCH补丁的话,就去我空间里点击那张DNW截图然后右键目标另存为或是迅雷下载,然后将后缀名改为rar,然后解压就可以了,那个是我做好的PATCH,下方为空间地址,然后再我的日志里面:也有一篇逐步完善u-boot-2011.06-rc2-OK6410的日志,那里面贴上的就是DNW截图了,我的CSDN与QQ空间是同步的,呵呵!

http://user.qzone.qq.com/1057481936/infocenter

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值