Linux设备驱动程序知识点

  • 注意: 网络设备驱动和块设备驱动不在内

Linux设备驱动程序知识点

  • 字符设备驱动
1. 了解linux内核字符设备驱动程序的架构
2. 了解linux字符设备驱动相关的api
3. 了解linux内存管理的api
4. 了解linux内核中断管理的api
5. 了解linux内核同步和锁等相关的api
6. 了解你索要编写驱动的芯片原理

1. 了解linux内核字符设备驱动程序的架构

1. 申请设备号(主设备号和次设备号)
2. 申请 dev_t 结构体,并填充ops,并用cdev_add注册该结构体
3. 其他的都是非必要成分,是为了创建节点
该demo 自动创建了节点.
直接打开该节点,并读写即可.读写堆栈可看该demo下面的堆栈信息
  • 系统调用触发流程
系统调用的入口是 vector_swi
通过例程ret_fast_syscall来返回

2. 了解linux字符设备驱动相关的api

  • 字符设备的描述
struct cdev
  • 设备号的管理
1. 驱动开发者自己定设备号
2. 设备号由系统分配
  • file_operations 的实现
结构体的调用
	该结构体指针在驱动中被赋值到 struct inode *inode
	open 时通过 chrdev_open 找到 file_operations
	open 时 将 file_operations 挂载到 struct file *filp
	之后的系统调用都是通过 struct file *flp 寻找的 file_operations

结构体内容
	1. 驱动中没实现的为NULL,编译时决定的.
	2. 主要的有 llseak read write poll close unlocked_ioctl compat_ioctl mmap open flush aio_read aio_write fsync , 这些里面该怎么实现

私有数据怎么存放
	struct file *filp  private_data
  • linux 设备模型管理
bbd 模型

3. 了解linux内存管理的api

  • 设备数据如何和用户程序交互
	copy_to_user put_user
	copy_from_user get_user
  • 设备DMA操作
  • 设备内存映射到用户空间 mmap

4. 了解linux内核中断管理的api

  • 硬件(MCU+中断控制器gic)中断流程
	做了什么事
	需要软件做什么事
  • linux内核提供的中断管理相关的接口函数
	中断注册
		request_irq request_thread_irq
	如何编写中断处理程序
		底半部
			工作队列
			软中断
			tasklet
  • 中断触发流程
vector_irq

5. 了解linux内核同步和锁等相关的api(只考虑内核空间,不考虑用户空间)

并发源 : 访问临界区的执行线程或代码路径
临界区 : 访问和操作共享数据的代码段
保护对象 : 资源或者数据,不是代码

自旋锁还是互斥锁
在中断上下文中毫不犹豫地使用自旋锁,中断上下文不应该有睡眠,隐含睡眠的动作及内核api.

如果临界区有睡眠,隐含睡眠的动作及内核api,应避免选择自旋锁

自旋锁内的选择
	绝对不允许被抢占和睡眠的临界区,用 raw_spin_lock ,否则使用spin_lock

6. 了解你要编写驱动的芯片原理

  • 1/ 接口
	uart
	i2c
	spi
	usb
  • 2/ 上电时序
	有几根线,时序
	pinctrl
		定义功能,定义config
	gpio 
		定义gpio 的 方向和电平
  • 3/ 读写操作
	读写间隔,读写寄存器位置.
  • 4/ 中断
	怎么去中断标识位
	中断流程