当前位置: 首页 > news >正文

正点原子linux驱动篇

linux驱动开发与裸机开发的区别

裸机直接操作寄存器,有些mcu提供了库,但还是很底层

1、linux驱动开发直接操作寄存器很麻烦不现实,主要是根据linux驱动框架进行开发(就是有很多操作都是一样的,我们只需要对一个程序模板进行一些修改就可以实现不同驱动的开发)

2、驱动最终的表现就是/dev/xxx这样的一个文件(应用程序打开驱动文件或者关闭驱动文件)

3、内核支持设备树文件,一个dts文件,文件描述了板子的设备信息(使用了哪些引脚,引脚是高电平还是低电平,地址是多少之类的)

三大驱动分类

字符驱动

从最简单的点 灯到 I2C、SPI、音频等都属于字符设备驱动的类型

块驱动

所谓的块设备驱动就是存储器设备的驱动,比如 EMMC、NAND、SD 卡和 U 盘等存储 设备,因为这些存储设备的特点是以存储块为基础,因此叫做块设备

网络设备驱动

就是网络驱动,不管是有线的还是无线的,都属于网络设备驱动的范畴。一个设备可以 属于多种设备驱动类型,比如 USB WIFI,其使用 USB 接口

字符设备驱动实验

在单片机中驱动与应用是在一个文件中,但是linux中驱动与应用程序是分开的

驱动获得外设、或者传感器数据,控制外设然后提交给应用程序

应用程序运行在用户空间,驱动程序运行在内核空间,用户空间的程序无法直接访问内核空间的数据,一般有三种方法

1、系统调用(比如应用函数使用一个open函数*(c语言库函数),然后open函数就会调用内核中的open驱动对应的函数)

2、异常(中断)

3、陷入·

我的第一个linux驱动实验

字符设备驱动框架

字符设备驱动的编写主要就是驱动对应的open、close、read。。。其实就是

file_operations结构体的成员变量的实现

驱动模块的加载与卸载

Linux驱动程序可以编译到kernel里面,也就是zImage,也可以编译为模块,.ko。测试的时候只需要加载.ko模块就可以

加载驱动会用到加载命令:insmod移除驱动使用命令rmmod。

驱动模块加载成功以后可以使用lsmod查看一下。

三、字符设备的注册与注销

1、我们需要向系统注册一个字符设备,使用函数register_chrdev。

2、卸载驱动的时候需要注销掉前面注册的字符设备,使用函数unregister_chrdev,注销字符设备。

四、设备号

1,Linux内核使用dev_t。

typedef __kernel_dev_t       dev_t;

typedef __u32 __kernel_dev_t;

typedef unsigned int __u32;

2、Linux内核将设备号分为两部分:主设备号和次设备号。主设备号占用前12位,次设备号占用低20位。

主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备

3、设备号的操作函数,或宏

从dev_t获取主设备号和次设备号,MAJOR(dev_t),MINOR(dev_t)。也可以使用主设备号和次设备号构成dev_t,通过MKDEV(major,minor)

五、file_operations的具体实现

file_operation就是驱动的操作函数

struct file_operations {struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);int (*iterate) (struct file *, struct dir_context *);unsigned int (*poll) (struct file *, struct poll_table_struct *);long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);long (*compat_ioctl) (struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);int (*mremap)(struct file *, struct vm_area_struct *);int (*open) (struct inode *, struct file *);int (*flush) (struct file *, fl_owner_t id);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, loff_t, loff_t, int datasync);int (*aio_fsync) (struct kiocb *, int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *);ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);int (*check_flags)(int);int (*flock) (struct file *, int, struct file_lock *);
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);int (*setlease)(struct file *, long, struct file_lock **, void **);long (*fallocate)(struct file *file, int mode, loff_t offset,loff_t len);void (*show_fdinfo)(struct seq_file *m, struct file *f);
#ifndef CONFIG_MMUunsigned (*mmap_capabilities)(struct file *);
#endif
};

六、字符设备驱动框架的搭建

七、chrdevbase虚拟设备驱动的完善

http://www.lryc.cn/news/19589.html

相关文章:

  • MATLAB绘制雷达图/蜘蛛图
  • 算法入门,十字路口选择的案例,如果是南方,则向前行
  • 父传子与子传父步骤
  • Java concurrency - Task Execution
  • 浅谈BOM
  • 每日学术速递2.24
  • SpringBoot 面试问答总结(VIP典藏版)
  • CSS 定位网页元素【快速掌握知识点】
  • 构建Docker基础镜像(ubuntu20.04+python3.7.1+chrome101+chromedriver101)
  • 最新最全Java面试知识
  • 个人电脑需求严重疲软,联想集团财务前景仍不乐观
  • 软件测试面试在简历上写了“精通”后,拥有工作经验的我被面试官问到窒息...
  • 色环电容读数方法要点总结
  • C++函数新思想和标准的输入和输出
  • 华为OD机试真题Java实现【汽水瓶】真题+解题思路+代码(20222023)
  • WindownsPowershell中的单引号和双引号
  • 【华为OD机试模拟题】用 C++ 实现 - 数组组成的最小数字(2023.Q1)
  • Ae:使用代理
  • OAuth 2.0 认证和攻击面
  • 论文写作模板
  • (五)物质导数与空间时间导数
  • python实战应用讲解-【语法基础篇】流程控制-运算符(附示例代码)
  • MXNet中使用双向循环神经网络BiRNN对文本进行情感分类
  • SpringBoot 整合 MongoDB 6 以上版本副本集及配置 SSL / TLS 协议
  • C语言static关键字
  • 【华为OD机试模拟题】用 C++ 实现 - 单词接龙(2023.Q1)
  • PHP基础(2)
  • Java8(JDK1.8)新特性
  • 【C语言】指针的定义和使用
  • Parameter ‘zpspid‘ not found