2012年7月19日 星期四

modprobe g_file_gstorage fail "unknown relocation: 3" problem

今天本來想說 mass storage driver 比較簡單,想說來驗證ㄧ下,
結果竟出現 "unknown relocation: 3." error , 找了半天,發現 ./arch/arm/kernel/module.c
中沒有辦法處理 R_ARM_REL32 type , 花了一天, 最後還是
問一下 "谷歌" "kernel module.c not handling R_ARM_REL32" ,結果 就有解決方式。

原來
gcc-4.4 defaults to generating .eh_frame sections, but we aren't interested in those currently.
請參考
http://forums.arm.com/index.php?/topic/8122-kernel-modulec-not-handling-r-arm-rel32/

2012年7月9日 星期一

eMMC booting bug

這幾天發現一個詭異的 bug , 用 SDHC Card 開機 , CODEC 可以正常 probe .
如果用 eMMC開機 , 卻會導致 CODEC Probe Fail .
怎樣都覺得詭異 ,同一個 u -boot , kernel 卻只是不同 device booting 卻有這樣的差異 .
經過比對整個 booting message , 發現主要是 PMIC 的電壓設定不正確 ,才會導致 CODEC
電壓對 , Driver Probe fail .

在詳細尋找 , 發現是 u-boot 引起 , 所以...花時時間仔細尋找 , 才發現下面這個 bug .
在spi_setup_slave() function 中 , 有使用 malloc 的方式配置 imx_spi_slave 的變數 ,
但是要注意 , 內容並非 全部都是 "ZERO" , 所以需要補上 memset(......... )
詭異的 bug 就可以解決了 .

imx_spi_slave = (struct imx_spi_dev_t *)malloc(sizeof(struct imx_spi_dev_t));
if (!imx_spi_slave)
return NULL;
memeset(
imx_spi_slave,0x0,sizeof(struct imx_spi_dev_t));

imx_spi_slave->slave.bus = bus;
imx_spi_slave->slave.cs = cs;


我沒有在 詳細追朔為何 SDHC 可以成功 , eMMC 卻會導致malloc 的內容以 garbage .
不過 malloc 後 , 如果要確認內容是 "ZERO" 本來就需要 memset 來初始化.
先這樣了 , 可見 iMX51的 BSP 還是不怎樣嚴謹 !! 一堆小 bug.

2012年7月5日 星期四

fatload bug of U-boot Command

最近發現我的 Demo Board 非常不穩定 , Kernel 增加一行 printk 就會導致 U-boot load kernel當掉 !! 這樣沒有辦法 debug kernel , 所以花時間尋找一下 bug !!
 
最後發現只要 kernel 不是 512 的倍數就會導致u-boot 在 fatload 時候卡住 ,如果是 512倍數就沒有問題 , 真是奇怪的問題 , 不過猜想應該是 eMMC reading Function 有問題 , 因為 512 剛好是 sector 的大小 .

找最後 , 發現 get_cluster() 中會呼叫 disk_read() , 並且傳所需要的 block size 數量給 disk_read() , size/FS_BLOCK_SIZE , 如果 size 小於 FS_BLOCK_SIZE 就會傳 "0" 給 disk_read() , 是這邊導致整個 u-boot 當掉 , 所以 , 多加一行 判別 , 如果是 "0" 就傳 "1 " ,這樣就解決了 !!
這樣會有一個小問題 , 就是會多讀取幾個 byte 到 DRAM 中 . 不過在我們的應用上沒有大問題 , 主要是 loading kernel 罷了 , 多出來的也不會有問題.

目前先這樣解決 !!