2013年12月26日 星期四

Trace fdisk source in busybox 心得

When you use "fdisk /dev/sda", fdisk will set disk_device(this is an global) to "/dev/sda".
Then into the main loop.
If you enter "n" it will call new_partition().
The key point of new_partition() is add_partition(index, type);
The size is set in the read_int() of add_partition()

2013年12月25日 星期三

printf 印出 IP address

最近 trace code(u-boot) 時發現,printf 現在可以印出 IP 及 MAC 之類的 address 型態。
%pI4:印出IPv4位址,變數型態為 unsigned long 的指標。
%pI6:印出IPv6位址,變數型態為 unsigned ling 的指標。
%pM:印出MAC位址,變數型態為 unsigned char 的指標。

這樣它就可以直接把 IP, MAC address 印出來。

EX:
typedef ulong IPaddr_t;
IPaddr_t NetOurSubnetMask;
printf("NetOurSubnetMask : %pI4\n", &NetOurSubnetMask);

unsigned char env_enetaddr[6];
printf("Address in environment is  %pM\n", env_enetaddr);

而變數裡面的值,IP的部份就是16進制的值直接連在一起。
例如:
192.168.10.100 => C0A80A64
192 = C0
168 = A8
 10 = 0A
100 = 64

MAC 的部份也是一樣是16進制的值,所以用 %s、%c會印不出來。
反而直接用%x一個一個去印是印得出來的。


這功能原本可能來自新版的 Linux Kernel 的 printk
參考:
https://www.kernel.org/doc/Documentation/printk-formats.txt

2013年12月20日 星期五

Linux 提示字元

前幾天失心瘋,玩起了 Git ,在網路上亂找一些關於 Git 的資料,像是一些參數設定,GUI工具之類的。因為現在的專案管理用的是 Git ,但它強大的功能也帶來了複雜的操作,雖然不見得什麼都用得到,但有得用,不學一學,用來耍酷一下就覺得很難過。

結果其中找了一項是,在 .bash_profile 裡加入:
PS1="[\[\033[1;32m\]\w\[\033[0m\]]\[\033[1;36m\]\$(git_branch)\[\033[0;33m\]\$(git_since_last_commit)\[\033[0m\]$ "

2013年12月17日 星期二

GUI Git Client

git 雖然功能強大,不過也因為功能太強大,branch 很容易會開很多。當 branch 一多,要使用 command line 來看各 branch 之類的差異、每個 branch 的進度之類的,就不是那麼的方便了。所以開始尋找有 GUI 的 git client。

2013年11月13日 星期三

vim "取代" 指令

以前在學校,提到 VI / VIM 時,老師總會說它是個強大的編輯器。其實當時只覺得它很難用(那時用的版本還是用H、J、K、L在移動游標),不知道它強大在哪?現在跟視窗化的編輯器比起來,我想是沒有強大到哪去啦,除了它可以不需要滑鼠。不過就 command line 下,它的確是具備了不少後來視窗界面下才被覺得習以為常的功能。

2013年11月7日 星期四

C 語言預設變數 備忘

這也是一個常常會混亂的東西@@,記憶力越來越差,不知道跟什麼東西都能 Google 有關?還是年紀有關?

GCC 中有事先定義了一些變數,讓我們可用,其中 Debug 時常用的就是 __FILE__,__LINE__跟我常常會弄混的 __func__。別人都是大寫,就它是小寫。其實本來是 __FUNCTION__,但後來 GNU 已經不建議使用(原因不明),所以改成了 __func__。

結果我就會搞不清到底是:
__func__,__function____FUNC__ 還是 __FUNCTION__

實際上查了一下,除了這三個還有其它的,只是比較不常用。

1.  __BASE_FILE__
完整的原始檔案路徑

2.  __cplusplus
表示該檔案由 g++ 所編譯,當成 C++ 的檔案

3.  __DATE__
編譯的日期

4.  __TIME__
編譯的時間

5.  __FILE__  
原始檔名

6. __LINE__
所在行數

7. __VERSION__  
gcc 版本

8. __func__
為了避免混淆,我就不提另一個了

2013年11月4日 星期一

diff 參數備忘

diff 是我每次用都要查的指令@@,所以寫下來備忘一下。

diff -Naur path1 path2 > project.patch
-N    In  directory comparison, if a file is found in only one directory, treat it as present but empty in the other directory.
-a    Treat  all  files as text and compare them line-by-line, even if they do not seem to be text.
-u    Use the unified output format.
-r    When comparing directories, recursively compare any subdirectories found.


如果要使用這個 patch 檔

patch -p# < project.patch
PS: "#" 表示要省略的路徑層數

man 的原文說明
-pnum or --strip=num
  Strip the smallest prefix containing num leading slashes from each file name found in the patch file.
  A sequence of one or more adjacent slashes is counted as a single slash. This controls how file names found in the patch file are treated, in case you keep your files in a different directory than the person who sent out the patch. For example, supposing the file name in the patch file was

/u/howard/src/blurfl/blurfl.c

setting -p0 gives the entire file name unmodified, -p1 gives

u/howard/src/blurfl/blurfl.c

without the leading slash, -p4 gives

blurfl/blurfl.c

and not specifying -p at all just gives you blurfl.c. Whatever you end up with is looked for either in the current directory, or the directory specified by the -d option.

2013年9月29日 星期日

git 初學 4 - Command List

找到一個 git 指令列得還蠻詳細的網頁
Git 初學筆記 - 指令操作教學

原文如下:

Git 初學 3 - reset

用 git 好像避免不了,有時會把檔案弄亂。以前用 SVN 時好像只能重新 checkout。(也有可能有我不知道的方法?)但強大的 git 應該有辦法不需要這麼做,雖然它重新 clone 也很快。

最後我就找到了這篇:
Git 版本控制:利用 git reset 恢復檔案、暫存狀態、commit 訊息


2013年9月28日 星期六

tar.zx

上次在網路上找檔案時,找到的檔案是 tar.zx 的檔。所以它不能用以前常用的 gzip 或 bzip 來解。上網找了一下,發現現在已經很多檔案改用 zx 格式了。
我找到的文章:tar.xz format

2013年9月23日 星期一

Cavium SDK 2.3 DDR Debug

因為有問題懷疑跟DDR有關,所以想要印些訊息,最後找到在
bootcode/u-boot/arch/mips/cpu/octeon/lib_octeon_shared.c
中的 DDR_DEBUG 可以開啟 debug message。

這是軟體工程師的習慣,先去找 code,直接改 code。實際上人家有提供簡單的方法,經過 FAE 的指點,我去 grep 所有 'getenv("ddr_' 的字串(就是程式中有用 getenv 去抓 ddr 開頭的環境變數的地方),結果找到了:

./arch/mips/cpu/octeon/lib_octeon_shared.c
"ddr_verbose" => 印出初始化的資訊
"ddr_trace_init" => trace init 過程的訊息
"ddr_safe" => 據說是將 DDR 本來一個 clock cycle 讀取兩次,改成一次。
"ddr_narrow"
"ddr_2t"
"ddr_burst8"
"ddr_rodt_ena"
"ddr_use_ecc" => 啟動 ECC 功能,但我不知道這是什麼?
"ddr_cas_latency"
"ddr_sil_mode"
"ddr_prompt"
"ddr_debug" => 印出一些 debug message(跟我直接改 code 的結果一樣)
"ddr_four_lmc"

./arch/mips/lib/board_octeon.c
"ddr_clock_hertz" => 指定 DDR 工作時脈(不是 data rate)。小心!設定差太多,就開不起來了。

"ddr_ref_hertz" => 應該是 reference clock。

2013年6月20日 星期四

Cavium Octeom u-boot 設定檔

常常在找一些設定值寫在什麼檔裡面,留下來備忘一下:

bootcode environment variables: 
  bootloader/u-boot/include/configs/octeon_dwc2000.h

dts設定檔:
  bootloader/u-boot/board/octeon/dwc2000/dwc2000.dts

bootcode init:(本來應該不算設定檔,但有同事在這加了 env 變數)
  bootloader/u-boot/arch/mips/lib/board_octeon.c

後來發現,實際上所有的 environment variables 都應該 define 在 bootloader/u-boot/include/configs/octeon_dwc2000.h 中,也許有些本來是沒有 define,像是 CONFIG_BOOTCOMMAND(bootcmd)預設是沒有 define 的,要自己加上去。不應該加在 bootloader/u-boot/arch/mips/lib/board_octeon.c 裡面。

eMMC pre-code

之前提過 eMMC 這個以前沒摸過的東西,造成了我們的一些困擾。目前讀出 image 這個部份,還是沒辦法解決,所以轉向用其它方式,就 RD 角度來說是可以解決,但公司的生產流程上是不是能夠處理就不知道了。

現在方法有二,一個是純軟體,就是在產測的過程中去把 eMMC 切 partition、format,然後把檔案傳進去。順便測試一下 eMMC 的存取。(至於切 partition 跟 format,可以用產測程式去送指令控制,只是步驟會比較多。不然就是修改一下 fdisk 指令,讓我們帶特定的參數時,它就會直接把 eMMC 切成我們要的狀況)

另一個方法就是,廠商現在有借我們一個 SD 卡的轉接板,eMMC放在上面,就可以插到 NB 內建的 SD 卡插槽,或是讀卡機裡。透過這個方式用 PC 產生一個母片,然後拿母片去對燒。

但是用轉接板時,在 windows XP 下,並沒有辦法對 eMMC 切 partition。所以我目前是用 Linux 來處理。

2013年6月11日 星期二

eMMC

目前手上的案子,使用了 SAMSUMG 的 eMMC,但是 HW 要找一個替代用料,最後找了 Kingston 的,不過 SAMSUNG 的是 eMMC v4.41,Kingston 的是 eMMC v4.5。為了要測試是不是相容,所以就跟廠商要了幾顆,換上去試。但是 eMMC 是用 BGA (Ball Grid Array)封裝的,它沒有金屬的接腳,而是小小的錫球。(可參考WIKI - Ball Grid Array)所以一般來說不是手工焊的,不過我們少量的情況下,就先用手焊的處理。結果他弄了兩片,全部都辦法用,所以就來找我,想要我查查是兩片都沒焊好?還是我們的 Driver 要修改?


2013年6月10日 星期一

Latex 中的 "<"與">"

我們會使用 Latex 來編輯文件,不過也不知道是什麼原因,我在 build 前人留下來的 project 時,卻發生了 "<",">" 無法正常顯示的問題。不過前人也是直接使用這兩個符號,而且產出的文件是正常的。

2013年5月28日 星期二

Git 初學 2

這篇是我又從別的地方看到了一些 git 的教學,再補充一些上一篇的不足。
原文來自:http://ihower.tw/blog/archives/2620

首先,先複習一下 branch 相關指令。大家都說 git 開 branch 不用錢。

  • git branch <new_branch_name> 建立本地 local branch
    • 如果要把新的 local branch push 上去,需要下 git push origin <local_branch_name> 指令。
  • git branch -m <old_name> <new_name> 改名字 (如果有同名會失敗,改用 -M 可以強制覆蓋)
  • git branch 列出目前有那些 branch 以及目前在那個 branch
  • git checkout <branch_name> 切換 branch (注意到如果你有檔案修改了卻還沒 commit,會不能切換 branch)
  • git checkout -b <new_branch_name> (<from_branch_name>) 本地建立 branch 並立即 checkout 切換過去
  • git branch -d <branch_name> 刪除 local branch


2013年5月2日 星期四

Make a FAT image in Linux

今天嘗試要在 Linux 底下做出一個 FAT 格式的 image,目的是希望這個 image 可以在 u-boot 底下當作 raw data 寫進 eMMC flash,然後開機進 Linux 下可以當檔案存取。

網路上找到了幾個東西,可以達成接近的目標。

2013年4月25日 星期四

VIM windows 版 + Taglist + Exuberant Ctags

之前看我們處長把它的 VI 改造成幾乎跟 Source Insight 一樣,我就覺得我也想來試一試,因為我也一樣覺得如果可以都用鍵盤操作,會比較順一點。(假會

但是我們平常在寫程式的環境是遠端的 Server,也沒有裝 X-windows,平常我們都是用 Samba 把它當網路磁碟然後才個人的 Windows 上編輯。

所以我就想說,那這些套件能不能用在 windows 版的 VIM 上呢?(對 VIM 有 windows 版)

2013年4月18日 星期四

Linux 中的 HZ, tick and jiffies

最近看了一些 Linux Driver 相關的的 code,但是我發現了 HZ 這個變數,但我找不到它是哪裡來的,還有一個不知道幹嘛用的全域變數 jiffies。

沒辦法的情況下,只好問 Google 了。

Google 大大給了我這個網址:
Linux Kernel: 簡介HZ, tick and jiffies

裡面說明這這三個變數都是系統的變數,都跟時間有關。

2013年4月12日 星期五

Git 初學


身為軟體人員(雖然公司不是專門開發軟體的公司),source control 是有必要的。
很幸運的(?)我從 CVS 到 SVN,現在又要改用 git 了。

2013年4月11日 星期四

Argument list too long

今天有位同學(國中同學,大學走電子系)問我,在 Linux 下,要砍掉很多檔案要怎麼辦?
用 rm -f *.* 嗎? 

我建議他用 rm -f * 會比較好,Linux 裡常有些檔是沒有副檔名的。 

結果他告訴我,系統回他 /bin/rm: Argument list too long 


研究室開張

我待的公司不算是什麼很好的公司,不過前人倒是有些不錯的措施, 像是建立部門內的 wiki ,也有人架了 blog,用來存放一些沒有像 wiki 裡那麼正式的內容。 

但是時光飛逝、物換星移,很多前輩成了離職員工,這些系統也許有可能會消失。
而我自己也可能有一天會離開這家公司。

所以我想,還是開始來建立自己的文件庫吧,但很久沒去了解現有的各種系統的情況下, 我想就直接先開個已經有在使用的 blog 來用吧。