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,就沒有再報錯誤,問題就解決了!

沒有留言:

張貼留言