linux驱动概述

linux设备驱动

分类

1. 字符设备驱动;

在传递数据时,按照字节流先后顺序传递. (蚂蚁搬家)

例如: LED, 蜂鸣器, 鼠标, 键盘等

2. 块设备;

3. 网络设备;


套路框架如下

假设设备为led.

1. 驱动三要素

  1. 驱动模块加载入口声明:

    module_init(led_init);

  2. 卸载入口:

    module_exit(led_exit);

  3. 模块许可声明(必须大写)

    MODULE_LICENSE("Dual BSD/GPL");

2. 实现module_init/module_exit对应的函数

3. 添加其他功能模块file_operations

file_operations结构体中的成员函数(都是指针函数),是 驱动内核接口, 是用户空间user对linux**系统调用**的最终落实的地方. 因此,这些函数是字符设备驱动程序设计的主要内容.

为了给上层应用提供设备文件的open/write/read/close等基本操作, 在file_operations结构体中先设置好相应的文件操作函数声明,然后具体实现第4步中的硬件控制函数即可.

当应用层在进行系统调用时,由于linux各个用户空间的地址是相互独立的(处于安全的考虑), 内核就会自动根据file_operations的声明调用到驱动相应函数.而不是有应用层直接调用驱动.

4. 硬件地址到内核地址的映射ioremap

为了驱动硬件,实现应用层的期待效果, 需要根据电路板手册编写ARM驱动程序.

只是,这里需要注意的是,由于linux各个用户空间的地址是相互独立的(处于安全的考虑), 因此在这里也需要进行地址转换, 用到的内核提供的接口是ioremap. 这样就可以实现硬件物理地址到内核虚拟地址空间的映射.


应用层调用驱动的流程.(结合linux软件层次)

  1. 首先系统调用.syscall
  2. 内核根据注册insmod的驱动设备,找到相应的设备号(即相应的设备文件);
  3. 内核根据设备号 调用文件的操作方式,在内核中是file_operations结构体中;
  4. 根据驱动重写的相关函数,如open,release,unlocked_ioctl等,内核调用相关驱动函数从而实现应用层的open, close, ioctl.
    .

Note:

1. 幻数加密

use magic number to encrypt the args. In order to avoid call in accident. 使用幻数进行加密,防止应用层误操作.

2. 驱动添加到内核/从内核卸载

  1. 编译好的驱动模块.ko文件, 首先需要加载驱动模块内核.
    insmod xxx.ko
    这个操作,会调用到驱动的module_init();指向的具体模块加载函数;

  2. 卸载驱动模块
    rmmod xxx
    这个操作则会调用到驱动的module_exit();对应的卸载驱动函数;

  3. 创建相应的设备文件, 这样应用层就可以方便统一方法访问所有文件和硬件设备.例如open("/dev/xxx" , O_RDWR)

    创建设备节点:

    mknod /dev/xxx

    注意: 这里不能够直接创建设备文件: touch /dev/xxx , 而是创建设备节点.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MichaelJay2015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值