一、Linux系统结构概述

1.1Linux体系结构

1.2内核架构

二、Linux驱动

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

2.2Linux系统框架图

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

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

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

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

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所在目录。如下图所示:

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

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

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


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

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

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

Linux驱动加载总结相关推荐

  1. linux驱动加载流程分析

    linux驱动加载流程分析 内核是如何加载驱动的,有些是编译到内核里面,有些事编译成ko,让系统自动加载.总的说来,在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动 ...

  2. linux加载的驱动无法卸载,linux驱动加载后不能再卸载

    在 编写驱动程序的时候有时候会出现这种情况,模块加载之后不能卸载或卸载之后不能在加载,cat /proc/devices 后发现设备还占用着设备号,这种情况下,再次加载驱动模块肯定不会成功,必须重新启 ...

  3. Linux驱动加载实例

    日志也是用户应该注意的地方之一.不要低估日志文件对网络安全的重要作用,因为日志文件能够详细记录系统每天发生的各种各样的事件.用户可以通过日志文件检查错误产生的原因,或者在受到攻击和黑客入侵时追踪攻击者 ...

  4. Linux驱动 | 加载.ko驱动模块的两种方法(insmod与modprobe)

    文章目录 1.加载驱动模块 2.查看已加载的驱动模块列表 3.卸载驱动模块 假设要加载的驱动程序模块名为SHT21.ko 1.加载驱动模块 方法一 进入SHT21.ko驱动模块文件所在的目录,然后直接 ...

  5. linux设备和驱动加载的先后顺序

    点击打开链接 Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢. Linux系统使用两种方式去加载系统中的模块:动态和静态. 静态加载:将所有 ...

  6. Linux查看网卡加载驱动,linux网卡驱动分析之驱动加载

    通过insmod或者modprobe命令加载驱动,这两个命令为应用程序,在应用程序里调用了一个系统调用: extern long init_module(void *, unsigned long, ...

  7. Linux模块加载流程及如何让系统开机自动加载模块

    Linux模块加载 Linux系统加载哪些内核模块,和配置文件有关系. 模块保存在/lib/modules/下. 使用/etc/modules-load.d/来配置系统启动时加载哪些模块. 使用/et ...

  8. (DT系列四)驱动加载中, 如何取得device tree中的属性

    转载于: http://blog.csdn.net/lichengtongxiazai/article/details/38941933 本文以At91rm9200平台为例,从源码实现的角度来分析驱动 ...

  9. 在 linux 中加载启动 zynq PL 程序

    目录 环境 使用 BIN 文件生成 附 在 zynq 使用系统时,可在 uboot 与 linux 中加载启动 PL 程序,一直以来用的都是在 uboot 中加载启动,本次试了试在 linux 中启动 ...

  10. Linux驱动模块加载和卸载以及设备注册与注销

    一.驱动模块的加载和卸载 Linux驱动有两种运行方式,第一种就是将驱动编译进Linux内核中,这样当Linux内核启动的时候就会自动运行驱动程序.第二种就是将驱动编译成模块(Linux下模块扩展名为 ...

最新文章

  1. 数据工厂 mysql_.net中利用数据工厂实现多数据库的操作
  2. SQLServer 2012 报表服务部署配置(1)
  3. hihocoder #1388 : Periodic Signal NTTFFT
  4. 图像锐化——基于梯度算子的五种方法
  5. C语言交换两个数(不创建临时变量)
  6. kylin与superset集成实现数据可视化
  7. AngularJS获取项目中定义的json文件
  8. matlab聚合矩阵,c#和ILNumerics与Matlab中最有效的矩阵聚合方式
  9. php接收ajax的表单数据,怎样用Ajax提交表单并接收其中的json数据
  10. Latex写论文格式注意点
  11. 格式工厂DIVX、AVC、HEVC三个格式那个最清晰
  12. 国内较高水平的计算电磁学方面的高校和教授们
  13. java计算机毕业设计西藏民族大学论文管理系统源程序+mysql+系统+lw文档+远程调试
  14. Word to PDF Converter v3.0 算法分析及注册机
  15. “新元宇宙”奇科幻小说原创作品系列连载《地球人奇游天球记》第三回零点惊魂
  16. 微信 java抓取_【java】微信文章抓取
  17. C#基于Socket的局域网即时通信和传输文件程序
  18. 常用邮箱的 IMAP/POP3/SMTP 设置
  19. iPhone无法联网问题
  20. c#实现任务栏气泡提醒

热门文章

  1. VB2010实例(2) _滚动字幕
  2. 简单了解oop编程思想和常见的几种设计模式
  3. Android中加载Gif动画
  4. 2021.12.13(第一周) 实习周记lzhuan
  5. dosbox下载并配置masm环境变量的方法
  6. MASM32汇编SDK安装
  7. 为什么产品经理总被吐槽是”水货“
  8. quartus仿真13:D触发器和JK触发器
  9. 在IDEA中实现Python随机森林模型预测人口
  10. 端到端的含义,统计学习、机器学习和深度学习的区别与联系