第三方驅動移植
一、驅動編譯進內核Makefile
1、首先找內核中是否已經支持設備的驅動 選配
2、內核中沒有的驅動移植進來 --第三方驅動移植
將第三方驅動代碼放到linux源碼樹中的driver目錄中
修改 Makefile Kconfig(界面配置)
修改過的和新添加的代碼會重新編譯
程序需要在板子上運行 就需要使用交叉編譯工具編譯
mknod /dev/led c或者b 主設備號 次設備號
二、make menuconfig、Makefile、Kconfig、.config
三者的關係
Makfile 具體編譯文件
Kconfig 選配,生成圖形化界面
在Kconfig中添加一個燈的選項
界面修改好了, 還需要再次修改 Makfile
[] 只有兩種選項編譯(y)或者不編譯(n) <> 三種選項 編譯(y)、不編譯(n)或者編譯成模塊(m)
obj-y obj-n obj-$(CONFIG_XXX)
方便驅動管理
三、驅動模塊
驅動模塊學習 詳細視頻
linux 內核模塊 http://www.makeru.com.cn/live/1392_586.html
驅動初級也會詳細講解
1. Makefile 編寫
2. C程序代碼編寫
3. 編譯出 ko 模塊
make modules 編譯所有的模塊
在linux運行時,可以裝載和卸載模塊
通過 手動加載模塊 insmod *.ko
mknod
四、黑白盒對比
黑盒移植
兩種方式
1. 驅動編譯進內核
選則源碼目錄
修改Makefile
修改Kconfig
2. 將驅動編譯成獨立的模塊
配置爲模塊方式 通過修改Kconfig
使用make modules 編譯爲模塊
裝載模塊 insmod xxx.ko
創建設備結點 mknod /dev/xxx c xx xx
運行測試驅動的應用程序
白盒移植
需要閱讀閱讀源碼,熟悉驅動框架
1. 字符設備 2. 平臺設備
字符設備框架
application
User Mode ||
\/
------------------------------------
System Call Interface
||
Kernel Mode \/
Virture File System(VFS)
| | |
Character Block Network
| | |
Device interface
||
\/
--------------------------------------
Hardware Physical Device (Hardware)
五、字符設備引入
1.一切設備皆文件
對設備的操作的就是 對設備文件的 read write
2. open read write ioctl
3. 將設備進行編號 設備號(主次設備號組成)
字符設備驅動相關
1. 註冊獲取設備號
2. 初始化設備
3. 操作設備 file_operations -- open release read write ioctl...
4. 兩個宏定義 module_init module_exit 兩個命令 insmod rmmod
5. 註冊設備號 register_chrdev_region
6. cdev_init 初始化字符設備
7. cdev_add 添加字符設備到系統
驅動是被動調用的,是被應用程序觸發的
應用程序的 open 調用到驅動的file_operations 的 open
應用程序的 read 調用到驅動的file_operations 的 read
應用程序的 write 調用到驅動的file_operations 的 write
應用程序的 ioctl 調用到驅動的file_operations 的 ioctl
應用程序的 close 調用到驅動的file_operations 的 release
六、平臺設備引入
1. 寄存器的地址值是根據芯片手冊 和原理圖找到的
2. 對寄存器地址內容操作不能直接使用物理地址,需要ioremap
3. ioremap 將物理地址 映射到虛擬地址
4. platform 用於將硬件信息 和驅動代碼做分離
5. 通過名字匹配,匹配成功執行 probe函數
6. 驅動通過 platform_get_resource 獲取硬件設備資源
7. 作用 容易維護