歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

看下面的相關鏈接介紹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補丁的話,可以到下面的地址

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2012年資料/9月/8日/逐步完善u-boot-2011.06-rc2-OK6410

相關鏈接 http://www.linuxidc.com/Linux/2012-09/69921.htm 與 http://www.linuxidc.com/Linux/2012-09/69922.htm

Copyright © Linux教程網 All Rights Reserved