1. 程式人生 > >將自己的驅動編譯進核心

將自己的驅動編譯進核心

最近在學習android驅動開發,主要是參考李寧老師的《Android深度探索——HAL與驅動開發》。李寧老師講的很好,按照書中的敘述,基本都能夠跟著做下來,學到了很多。但是在第一個驅動程式—統計單詞個數—中,在將word_count驅動編譯進入核心實現自動載入的時候遇到了問題,經過思考找到了自己的解決方案,在此記錄一下。

宣告:可能是我的某些步驟有錯,所以沒能夠按照書的步驟走下去,希望大牛指點。

首先是問題的情況:

按照書中所說

1、將word_count.c檔案放到<Linux核心目錄>/drivers/char目錄中。

2、修改Kconfig檔案

  開啟<Linux核心目錄>

/drivers/char/Kconfig檔案,找到endmenu,並在endmenu前面新增如下程式碼。

config WORD_COUNT

  bool "word_count driver"

  help

  This is a word count driver. It can get a word count from /dev/wordcount

3、修改Makefile檔案

  開啟<Linux核心目錄>/drivers/char/Makefile檔案。找個位置新增如下內容

obj-$(CONFIG_WORD_COUNT)      += word_count.o

4、設定.config檔案


 .config通過make menuconfig命令在選單中配置。進入Linux核心頂層目錄(<Linux核心目錄>)。然後執行make menuconfig命令顯示配置選單,並進入“Device Drivers”>“Character devices”子選單,找到“word_count_driver”選單項,按空格鍵將“word_count_driver”選單項前設定成星號(*)。然後退出配置介面並儲存所做的修改。

5、編譯Linux核心


  進入<Linux核心目錄>目錄,執行下面的命令編譯Linux核心。

# make

然後用模擬器載入剛才生成的核心(4.1是我的虛擬機器的名字)

emulator -avd 4.1 -kernel <Linux核心目錄>/arch/arm/boot/zImage

說是可以通過adb shell在/dev下面看到wordcount這個裝置。

我照著這個做的沒有提示什麼問題,但是在模擬器的/dev下面死活看不到wordcount這個裝置。試了好多方法,比如修改檔名稱啊,make clean 然後重新編譯啊,還是沒有解決。

突然看到<Linux核心目錄>/drivers這個目錄下面有char還有個misc,想起來編寫word_count.c,在設備註冊的時候有是用的下面一句話

ret=misc_register(&misc);

也就是說註冊是時候wrodcount這個驅動是按照misc設備註冊的,是不是應該將word_count.c放到<Linux核心目錄>/drivers/misc下面來做上面的操作。

於是把以上的步驟類比放到<Linux核心目錄>/drivers/misc目錄下面來做。如下

1、將word_count.c檔案放到<Linux核心目錄>/drivers/misc目錄中。

2、修改<Linux核心目錄>/drivers/misc/Kconfig檔案。

3、修改<Linux核心目錄>/drivers/misc/Makefile檔案。

4、在<Linux核心目錄>,執行

make menuconfig

進入“Device Drivers”>“Misc devices”子選單,找到“word_count_driver”選單項,按空格鍵將“word_count_driver”選單項前設定成星號(*),退出並儲存。

5、進入<Linux核心目錄>目錄,編譯Linux核心。

編譯完成,載入到虛擬機器,進入/dev下就可一看到wordcount這個裝置了。

要是執行書中之前敘述的用原生C和用NDK以及直接用java程式碼操作裝置檔案對wordcount進行測試,需要修改下wordcount的許可權為777

[email protected]:/dev # chmod 777 wordcount

或者

# adb shell  chmod 777  /dev/wordcount

然後可以看到測試成功。



相關推薦

自己驅動編譯核心

最近在學習android驅動開發,主要是參考李寧老師的《Android深度探索——HAL與驅動開發》。李寧老師講的很好,按照書中的敘述,基本都能夠跟著做下來,學到了很多。但是在第一個驅動程式—統計單詞個數—中,在將word_count驅動編譯進入核心實現自動載入的時候遇到了

【ZYNQ_LINUX】如何把自己驅動編譯核心或模組(Kconfig和Makefile

linux驅動編寫(Kconfig檔案和Makefile檔案) feixiaoxing 2013年09月08日 17:12 5502 【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】      在linux編寫驅動的過程中,有兩個檔案是我們必須

如何把自己驅動編譯核心或模組(Kconfig和Makefile)

DIY:向核心新增自己的程式 A.在Linux核心中增加自己的程式步驟(注意這裡只是程式檔案): 1.將編寫的原始碼複製到Linux核心原始碼的相應目錄中。 2.在目錄的Kconfig檔案中增加新原始碼對應專案的編譯配置選項 3.在目錄的Makefile檔案中增加對新原始碼的編譯條目。 B.在Linux核心d

A31S android 手動載入攝像頭命令,驅動編譯核心

insmod /system/vendor/modules/videobuf2-core.ko insmod /system/vendor/modules/videobuf2-memops.ko ins

如何ramdisk.img 編譯核心和修改init.rc

一 將ramdisk.img編譯進核心android系統可以不用ramdisk.img 檔案就可以啟動檔案系統,原因是在android核心編譯的時候使用配置選項已經將檔案系統編譯進核心。方法是在編譯配置選項中開啟File Systems->"The Extended

如何寫好的驅動程式編譯核心

1、進入目錄linux-kernel-samsung-dev\drivers\char             新建目錄key_arm,並將驅動程拷貝進去             mkdir key_drv     2、在key_arm目錄裡編寫裡Kconfig檔案,內容如下:             men

s3c6410開發板核心配置和編譯&已寫好的驅動程式編譯核心

一、s3c6410開發板核心配置和編譯 1、解壓核心包,將smdk6410_config核心配置檔案拷貝成.config(預設配置檔案)到核心原始碼樹下。一般情況下,關於平臺的配置檔案存放在核心原始碼樹的arch/arm/configs/目錄下,這裡用到的smdk6410_

linux開發の如何靜態的驅動模組編譯核心

在解決這個問題之前,我們先搞明白linux究竟是怎樣管理原始碼中上萬個檔案的。我們看Linux原始碼的目錄,十分科學,基本上看到目錄就可以猜到裡面放的什麼,那怎麼把檔案連線起來,靠的就是Kconfig,它可以告知Makefile那些編譯那些不編譯。第一步:在driver目錄下

驅動是否編譯核心

大家都知道,在編譯核心時,在makefile中將驅動模組-y就可以編譯進核心。 雖然會生成.o檔案,但是要進一步確認是否編譯進核心; 還可以通過在System.map檔案搜尋驅動的相關函式是否存在。

第三方apk編譯Android系統檔案system.img

1、把apk拷貝到out\target\product\generic\system\app中。 執行命令make snod , 把新增的spk編到system.img 中 2、使用mkyaffs2image工具,把apk及相關檔案(如.so)拷

檔案系統編譯核心

1、利用busybox製作根檔案目錄。(需要有init 和 linuxrc)2、makemenuconfig 在general setup 中設定 initial ram filesystem and RAM disk 後指定檔案系統原始檔路徑.3、makemenuconfi

linux 編譯核心 && 編譯成模組module

refer: http://blog.csdn.net/yicao821/article/details/6740269 http://blog.csdn.net/yicao821/article/details/6740269 1.核心編譯命令(makefile) o

① 根檔案系統直接編譯核心

  直接用TQ2440提供的原始碼linux2.6.30.4, 然後用其提供的busybox.1.16.0 在(make menuconfig中)沒有選中Initial Ram... 時是這樣的 看到這裡,大約知道除了根檔案系統有問題外,其他沒有問題.  將檔案系統編

對比直接編譯核心和模組形式

Compiling directly into a kernel vs. modules You have two options for adding functionality to the kernel: building functions into the ke

詳解驅動程式編譯linux核心

1、進入目錄linux-kernel-samsung-dev\drivers\char 2、新建目標目錄01.led,將驅動相關檔案複製到此目錄    注:需確保複製的驅動檔案是能正常執行的驅動 3、在目錄01.led裡編寫Kconfig檔案 menu "xxx" config XXX_LED        

android-----模擬器載入自己編譯核心(適用於驅動練習)

1. 下載android 模擬器所用的核心原始碼, 代號為goldfish   2. 下載arm-linux交叉工具鏈 3. 編譯核心檔案 4. 讓android模擬器執行在剛編譯的核心上 5. 編譯自己的hello核心模組 6 將hello.ko載入到核心中 1

Linux Export命令 以及 linux 怎麼檢視核心裡面是否編譯了某個驅動(不是模組了的驅動),怎麼檢視

檢視核心已存在 驅動cat /lib/modules/$(uname -r)/modules.builtin 一、Windows 環境變數   1、在Windows 系統下,很多軟體安裝都需要配置環境變數,比如 安裝 jdk ,如果不配置環境變數,在非軟體安裝的目錄下執行javac 命令,將

IDEA maven項目中src源代碼下的xml等資源文件編譯classes文件夾

默認 文件的 ips src directory htm 文件夾 ref 編譯 如題,IDEA的maven項目中,默認源代碼目錄下的xml等資源文件並不會在編譯的時候一塊打包進classes文件夾,而是直接舍棄掉。 如果使用的是Eclipse,Eclipse的src目錄下

git版本號編譯程序

.cn tab reflog 代碼 uil unix 作者 記錄 提交 問題的提出 不管是什麽版本管理工具,每一條提交記錄都會有一個對應的版本號,一般是一個整數,git是一個hash字符串。不管怎樣,這個版本號是唯一的,有時候我們在程序運行的時候會在日誌裏面輸出程序的版本

自行添加的包編譯Tomcat

Tomcat入職第一天就遇到了問題,搭建環境的時候有一些jar包Maven下載不了,手動加載的時候未部署進Tomcat,導致一直運行失敗,後來想起來這個東西,嘗試之後終於成功。 將自行添加的包編譯進Tomcat