内核移植笔记

第三方驱动移植

一、驱动编译进内核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. 作用 容易维护

猜你喜欢

转载自blog.csdn.net/weixin_39148042/article/details/82494980