脚踏实地,一步一步学arm(DMA)实验
2014-05-16 21:04
176 查看
1.file_operation结构体
⑴字符驱动和内核的接口
⑵字符驱动只要实现一个file_operation结构体
⑶当注册当内核中,内核就有了操作此设备的能力
2.file结构体
⑴file结构:
1.file_operation结构相关的一个结构体
2.描述一个正在打开的设备文件
⑵成员:
1.loff_t f_pos当前读写位置
2.unsigned int f_flags表示文件打开时,是否可读写
⑶struct file_operations *f_op
文件相关操作:指向所实现的struct file_operations
⑷void *private_data:
私有数据指针,驱动程序可以将这个字段用于任何目的或者忽略这个字段
3.inode结构体
⑴内核用inode结构在内部表示文件
⑵inode与file的区别
file表示打开的文件描述符
多个表示打开的文件描述的file结构,可以指向单个inode结构
⑶inode结构中的两个主要字段
dev_t i_rdev 对设备文件的inode结构,该字段包含了真正的设备编号
struct cdev *i_cdev
struct cdev是表示字符设备的内核的内部结构
当inode指向一个字符设备文件时,该字段包含了指向struct cdev结构的指针
⑷从一个inode中获得主设备和次设备号:
unsigned int iminor(struct inode *inode)
unsigned int imajor(struct inode *inode)
4.注册设备,在模块或驱动初始化时调用
5.注销设备
因为注册和注销设备的函数随着版本的不同会发生变化,所以在这里就步过多描述了
6.打开
int xxx_open(struct inode *inode,struct file *filp);
模块使用计数加1
识别次设备号
硬件操作:
检查设备相关错误
如果是首次打开,就对其初始化
如果有中断操作,申请中断处理程序
7.关闭
int xxx_release(struct inode *inode,struct file *filp);
模块使用计数减1
释放由open分配的,保存在file>private_data 里的所有内容
硬件操作:
如果申请了中断,则释放中断处理程序
在最后一次关闭操作时关闭设备
8.read/write
9.用户空间和内核空间之间的数据拷贝过程。
不能简单的用指针操作或者memcpy来进行数据拷贝
用户空间的数据是可以被换出的,会产生一个页面失效异常
用户空间的地址无法在内核空间中使用
10.用户空间和内核空间进行数据拷贝的函数:
unsigned long copy_from_user(void *
11.ioctl函数
为设备驱动程序执行“命令提供了一个特有的入口点
用来设置或者读取设备的属性信息
int ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg);
12,cmd参数的定义
⑴字符驱动和内核的接口
⑵字符驱动只要实现一个file_operation结构体
⑶当注册当内核中,内核就有了操作此设备的能力
2.file结构体
⑴file结构:
1.file_operation结构相关的一个结构体
2.描述一个正在打开的设备文件
⑵成员:
1.loff_t f_pos当前读写位置
2.unsigned int f_flags表示文件打开时,是否可读写
⑶struct file_operations *f_op
文件相关操作:指向所实现的struct file_operations
⑷void *private_data:
私有数据指针,驱动程序可以将这个字段用于任何目的或者忽略这个字段
3.inode结构体
⑴内核用inode结构在内部表示文件
⑵inode与file的区别
file表示打开的文件描述符
多个表示打开的文件描述的file结构,可以指向单个inode结构
⑶inode结构中的两个主要字段
dev_t i_rdev 对设备文件的inode结构,该字段包含了真正的设备编号
struct cdev *i_cdev
struct cdev是表示字符设备的内核的内部结构
当inode指向一个字符设备文件时,该字段包含了指向struct cdev结构的指针
⑷从一个inode中获得主设备和次设备号:
unsigned int iminor(struct inode *inode)
unsigned int imajor(struct inode *inode)
4.注册设备,在模块或驱动初始化时调用
5.注销设备
因为注册和注销设备的函数随着版本的不同会发生变化,所以在这里就步过多描述了
6.打开
int xxx_open(struct inode *inode,struct file *filp);
模块使用计数加1
识别次设备号
硬件操作:
检查设备相关错误
如果是首次打开,就对其初始化
如果有中断操作,申请中断处理程序
7.关闭
int xxx_release(struct inode *inode,struct file *filp);
模块使用计数减1
释放由open分配的,保存在file>private_data 里的所有内容
硬件操作:
如果申请了中断,则释放中断处理程序
在最后一次关闭操作时关闭设备
8.read/write
9.用户空间和内核空间之间的数据拷贝过程。
不能简单的用指针操作或者memcpy来进行数据拷贝
用户空间的数据是可以被换出的,会产生一个页面失效异常
用户空间的地址无法在内核空间中使用
10.用户空间和内核空间进行数据拷贝的函数:
unsigned long copy_from_user(void *
11.ioctl函数
为设备驱动程序执行“命令提供了一个特有的入口点
用来设置或者读取设备的属性信息
int ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg);
12,cmd参数的定义
相关文章推荐
- 【iCore4 双核心板_ARM】例程十一:DMA实验——存储器到存储器的传输
- 【iCore1S 双核心板_ARM】例程十二:DMA实验——存储器到存储器的传输
- 一步一步制作ARM-Linux交叉编译环境
- 【实验】ARM系统结构实验之Arm分支指令
- 02 ARM存储控制器 SDRAM操作 实验
- ARM底层学习笔记-裸板实验程序解析-点亮LED
- 脚踏实地,一步一步地解决问题
- DMA原理和实验
- 【实验】Mplayer在ARM平台上的移植
- arm-linux-ld实验
- 详解ARM的AMBA设备中的DMA设备(Linux驱动之DMA)
- ARM 按键实验
- ARM学习之GPIO实验
- ARM学习之LCD实验
- 【iCore4 双核心板_ARM】例程二十七:LWIP_NETIO实验——以太网测速
- 【iCore3 双核心板_FPGA】实验十九:基于双口RAM的ARM+FPGA数据存取实验
- ARM裸机程序--GPIO实验 LED(2)
- [置顶] ARM开发(5)基于STM32的UART串口通信实验
- 一步一步建立基于ARM+Linux的cross toolchain
- ARM-Linux驱动--DMA驱动分析(一)