一、驱动设备
1、驱动设备分类:字符设备;块设备;网络接口;
注:块设备是以块(通常是512字节)为最小传输单位的设备,块设备不能按字节处理数据。而linux则允许块设备传送任意数目的字节
其他分类:USB设备;PCI设备;平台总线设备(platform虚拟总线)
二、使用字符设备驱动
1、编译,安装驱动文件
2、创建设备文件
3、编写应用程序
注:设备文件与设备驱动程序是靠什么来对应的呢?:主设备号
三、字符驱动编程模型
1、分配设备描述结构cdev:静态;动态分配
2、初始化设备描述结构 :即设置file_operations *fops; cdev_init()
3、注册设备描述结构:即设置设备号和设备个数 ; cdev_add()
4、硬件初始化
5、实现设备操作,即设备方法
6、驱动注销:注销设备描述结构:cdev_del; 注销设备号:unregister_chrdev_region
7、linux系统中,每个打开的文件,在内核中都会关联一个struct file;;;每个文件都关联一个inode结构
8、用于空间的指针都不能被内核代码直接引用,必须使用copy_from_user;copy_to_user
四、应用程序是怎么访问到驱动程序的
1、反汇编:arm-linux-objdump -D -S read_mem >dump
2、设置r7,调用svc指令(系统调用指令;pc指针会从用户空间进入到内核空间,且入口相同)
3、根据r7的值查表,调用表中的实现函数
4、实现函数中,首先根据文件描述符得到struct file;然后再查看struct file 中的file _operation *f_op,这就是驱动程序中的操作了
五、字符设备控制实现
1、用于函数:ioctl 驱动函数:unlocked_ioctl
2、命令cmd:命令是一个整数;类型(8位),序号,参数传送方向,参数长度
3、linux系统提供了定义命令的宏:_IO(type, nr);_IOR();_IOW()
六、硬件访问技术
1、把物理地址映射为虚拟地址:动态映射ioremap(physaddr,size); 静态映射:内核启动时自动将物理地址映射为虚拟地址