內核移植筆記

第三方驅動移植

一、驅動編譯進內核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. 作用 容易維護

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章