2021年9月27日 星期一

vi / vim 常用的搜尋方法

以下方式都是在command 模式,(按小寫i 就會切換到編輯模式,在按一次ESC會切到command模式)

1. 將游標移到字串上,直接按"*" ,可以直接做向下搜尋

2. 輸入"/", 接著輸入字串,可以向下搜尋此字串,接著按"n",可以向下搜尋,按"N",可以向上搜尋

3. 按下"?", 接著輸入字串,可以向上搜尋字串,接著按"n",可以向上搜尋,按"N",可以向下搜尋

4. 按下":",輸入"set num",可以列出整篇文字檔的"行號" 

2021年9月23日 星期四

insert BT module hci_uart.ko 的時候,遇到 Unknown symbol in module 的 Error 訊息

 今天在開發platform的時候,準備要把編譯好的 NXP BT module 做insert的動作,卻出現了如下面所列的錯誤訊息:

insmod: ERROR: could not insert module hci_uart.ko: Unknown symbol in module
[   79.719642] .(1)[5227:insmod]hci_uart: Unknown symbol hci_free_dev (err -2)
[   79.719810] .(1)[5227:insmod]hci_uart: Unknown symbol hci_alloc_dev (err -2)
[   79.719875] .(1)[5227:insmod]hci_uart: Unknown symbol hci_unregister_dev (err -2)
[   79.719889] .(1)[5227:insmod]hci_uart: Unknown symbol hci_recv_frame (err -2)
[   79.719927] .(1)[5227:insmod]hci_uart: Unknown symbol hci_register_dev (err -2)

以下我們將一步步來說明,如何找出這個問題的原因

1. 首先我們先到linux kernel driver底下,我們使用grep 來找一下,到底哪裡實作了 hci_free_dev()
# grep -rn hci_free_dev
結果找到的都是呼叫此function的地方,於是我們再往上一層路徑去尋找














2. 我們在kernel底下,再次輸入grep 指令來尋找看看哪裡實作了 hci_free_dev()
# grep -rn hci_free_dev
結果發現,此function實作在 net/bluetooth/hci_core.c 當中









3. 因為是Unkown Symbol錯誤,其原因可能是 kernel config 沒有開到需要的功能,導致找不到function實作的地方。
所以我們可以切換到 net資料夾底下,查看Makefile檔案,看看 bluetooth/hci_core.c 要開啟那些 config才會被編譯到。於是,我們發現,CONFIG_BT必須在Kernel Config當中被開啟才行













4. 接著準備去開啟kernel的config檔案。依據每個專案不同,位置與檔案名稱不一定相同,一般原生linux會是在 kernel/linux/v4.19/.config,我們編輯.config來查看CONFIG_BT的設定。
我們發現這邊設定為m,表示module的意思,Linux在開機過程,不會自動insert此 module,除非自己手動 insmod。因此我們把 "CONFIG_BT=m" 改為 "CONFIG_BT=y",然後重新編譯。
*如果找不到 CONFIG_BT,則必須自己加入字串CONFIG_BT=y,來做設定










5. 在重新編譯過後,再去insert hci_uart.ko,就沒有再報錯誤,問題就解決了!

2021年9月14日 星期二

git 打 patch的方法

 假設我現在的Source code有git資訊,也就是可以用 "git status" 或是 "git diff" 等指令來查看目前狀態或是差異

 假設我目前修改了檔案,路徑與檔名為
  /home/danny/src/example/aaa.c
 當前所在目錄為 /home/danny/ 底下

打一個patch(讓別人Merge你的修改) 
於是我們可以很簡單的,使用下面的命令,先打一個patch檔案
 git diff src/example/aaa.c > aaa.c.patch
於是就會多出一個檔案,位於 /home/danny/aaa.c.patch

 aaa.c.patch大概內容會如下,可以看到差異:

--- a/src/example/aaa.c
+++ b/src/example/aaa.c
@@ -33,7 +33,11 @@
-      printf("Hello\n");
+     printf("Hello World\n");

如何把patch檔Merge入自己的code
假設我現在是在 /home/andy/ 目錄下,先把 aaa.c.patch 複製到此目錄底下
接著確定此檔案確實存在 src/example/aaa.c
使用以下指令把patch檔打入
  patch -p1 < aaa.c.patch

這樣就可以了!!