Linux驱动加载总结

一、Linux系统结构概述

1.1Linux体系结构

Linux驱动加载总结_第1张图片

1.2内核架构

Linux驱动加载总结_第2张图片


二、Linux驱动

2.1Linux系统3大类设备
1)字符设备
2)块设备
3)网络设备 
字符设备和块设备都是通过文件系统的系统调用接口open()、close()、write()、read()等函数访问,应用程序可以通过打开设备文件(如UART0设备:/dev/ttyS0)来访问设备;
主设备号、次设备号;
网络设备是面向数据包的接收和发送而设计的,它不对应于文件系统(/dev目录下)的结点,而是由系统分配一个唯一的名字(如eth0)。

2.2Linux系统框架图

Linux驱动加载总结_第3张图片


Linux驱动的编写难点不在于对硬件的具体操作而是需要清除现有驱动程序的框架,并在这个框架中找到修改的位置。
编写设备驱动程序涉及的三个核心数据结构:
1)Struct file_operations结构
2)Struct inode结构
3)Struct file结构

2.3加载驱动的方式
1)编译进内核(静态加载驱动);
2)不编译进内核以模块的方式动态加载.

三、静态加载驱动

3.1定义 
将驱动直接编译进内核,烧写进板子后,系统启动时由内核自动加载。

3.2实现过程
1).将写好的驱动程序复制到相应位置(一般为drivers/char)
2).配置Kconfig,添加hello_world选项  
             - #cd drivers/char

     - #vim Kconfig

Linux驱动加载总结_第4张图片


3).查看配置
     - 进入根目录
     - # make menuconfig
     - 在弹出窗口中选择device drivers/character devices/
                                       hello-world-test [*]保存退出


Linux驱动加载总结_第5张图片

4).修改Makefile
             - #cd drivers/char
             - # vim Makefile
             -添加“Obj-$(CONFIG_HELLO_WORLD)”  +=hello.o



5).重新编译内核
            - #返回根目录
            - #make

Linux驱动加载总结_第6张图片


6).把zImage烧进开发板(fastboot烧写)
          - #fastboot.exe flash kernel zImage(只烧写这一步)

7).重启开发板,在超级终端输出信息中查看驱动输出信息



3.3静态加载缺点
调用起来比较麻烦,每修改一个地方都需要重新编译和下载内核,效率低。若加载的驱动较多时,会导致内核容量很大。
嵌入式产品中可先采用动态加载进行调试,调试成功之后采用静态加载编译进内核。

四、以模块的方式动态加载

4.1所需源文件

1)Makefile文件(Makefile文件修改为如下)
2)驱动程序源代码(hello.c)
其中Makefile中-C 后为android 对应linux源码目录(这里为
/home/lc/iTop4412_Kernel_3.0);M为hello.c所在目录。如下图所示:

Linux驱动加载总结_第7张图片Linux驱动加载总结_第8张图片


4.2make编译
所需工具:Linux操作系统、android 对应的linux内核源码、驱动源代码及对应的Makefile文件。
1)将Makefile文件与驱动源代码(hello.c)复制到Linux系统的任意同一个文件夹下(本文复制到/home/lc/hello文件夹下);
2)在命令行终端进入驱动程序源代码与Makefile所在目录,然后执行make命令编译得到.ko驱动程序。如下图所示:

Linux驱动加载总结_第9张图片


4.3将驱动烧写进ARM开发板
所需工具:adb(Android Debug Bridge)工具、数据线、cmd命令行终端及iTOP4412开发板。
1)将前面编译好的.ko驱动文件复制到adb安装目录下(这里是c:\adb);
2)用数据线将开发板与PC机(这里通过Win7下的360手机助手)连接;
3)打开命令提示符程序,通过adb工具执行adb push 命令进行烧写。

Linux驱动加载总结_第10张图片Linux驱动加载总结_第11张图片


成功烧写后执行adb shell命令以管理员身份进入Android系统,在/system/bin目录下执行ls命令可看到如下图的结果:

Linux驱动加载总结_第12张图片

4.4加载驱动模块(方法一)
所需工具:adb shell、cmd命令行终端、iTOP4412开发板
1)在cmd命令行终端执行adb shell命令以管理员身份进入Android系统;
2)进入已下载好驱动的目录(这里是/system/bin)并执行insmod加载驱动命令即可加载.ko驱动程序。

Linux驱动加载总结_第13张图片Linux驱动加载总结_第14张图片

4.5加载驱动模块(方法二)
所需工具:串口工具超级终端、串口线、OTG线(安卓手机数据线)及iTOP4412开发板。
开发板串口、OTG口分别连接PC
1)打开设备管理器→端口→相应的端口,设置好端口后打开超级终端并启动开发板。
2)在超级终端中以管理员身份进入前面已下载好.ko驱动的目录下执行insmod命令加载驱动,可以看到成功加载驱动的效果。如下图所示:

Linux驱动加载总结_第15张图片

4.6卸载及删除驱动模块
1)rmmod命令卸载驱动模块;
2)rm命令删除驱动文件。
在Windows命令提示符及adb工具下或者在超级终端里通过串口均可直接卸载及删除驱动模块。执行效果分别如下图所示:



Linux驱动加载总结_第16张图片


你可能感兴趣的:(Linux驱动开发)