今天在開發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 當中
# 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當中被開啟才行
所以我們可以切換到 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,來做設定
我們發現這邊設定為m,表示module的意思,Linux在開機過程,不會自動insert此 module,除非自己手動 insmod。因此我們把 "CONFIG_BT=m" 改為 "CONFIG_BT=y",然後重新編譯。
*如果找不到 CONFIG_BT,則必須自己加入字串CONFIG_BT=y,來做設定
5. 在重新編譯過後,再去insert hci_uart.ko,就沒有再報錯誤,問題就解決了!
沒有留言:
張貼留言